User:Tiddlywinks/Map header data structure in Generation I

From Bulbapedia, the community-driven Pokémon encyclopedia.
Jump to: navigation, search
050Diglett.png This article is incomplete.
Please feel free to edit this article to add missing information and complete it.
Reason: Either need to explain pointers or link to a page where they're explained (appendix?); and links or details about what makes a tile special for warps.

The map header data structure tells the game everything it needs to know about how to build a map and how it should operate. A map is a town, route, house, cave, or generally any area that requires a "warp" transition (whether through doors or more literal warps).

Notes

Map header
size offset
Tileset index (0-based) 1 byte 0
Map height (blocks) 1 byte 1
Map width (blocks) 1 byte 2
Pointer to map 2 bytes 3
Pointer to text script pointer list 2 bytes 5
Pointer to map script 2 bytes 7
Connections 1 byte 9
Connections data ... opt
Pointer to object data 2 bytes ...

Map height and width

The map height and width are given in blocks, which is the unit in which the map is "drawn". A block is a square with dimensions of four "tiles" on each side, where a tile is an 8x8 pixel square. A block's dimensions are also equal to two steps (by the player) per side.

Pointer to map

The "map" that is pointed to is a list of blocks that "draws" the map from the map's defined tileset. The length in bytes of the data pointed to is the product of the width and the height.

Pointers to scripts

The text scripts pointed to by the map header are activated when a sign or sprite is interacted with. Signs and sprites are defined in the map's object data, and they access the text script list by a 1-based index they are assigned. Text scripts can be simple or complex, accomplishing any variety of things from simple text display to giving the player an item.

The map script is machine code that manages things that happen automatically within the map, such as an NPC who will not allow the player to pass until a certain condition has been met.

Connections byte

The connections byte at offset 0x09 in the map header defines in what directions another map connects to the defined map (such that the other map can be seen while standing in the defined map). Each bit corresponds to a direction, and if a given bit is on (set to 1), the map has a connection there.

Bit Decimal Direction
0 +1 East
1 +2 West
2 +4 South
3 +8 North

Connections data

List item - map connection
size offset
Index of connected map (0-based) 1 byte 0
Pointer to start in connected map 2 bytes 1
Pointer to start of connection 2 bytes 3
Connection size (blocks) 1 byte 5
Connected map width (blocks) 1 byte 6
Player Y offset (steps) 1 byte 7
Player X offset (steps) 1 byte 8
Pointer to window 2 bytes 9

After the connections byte at 0x09, there may be a list of connection data. If the connections byte is 0, there will be no list and the object data pointer will immediately follow the connections byte.

The number of entries in this list equals the number of connections the map has. The entries must be ordered north first, then south, then west, then east. If the entries are not ordered properly, though the maps may display properly, the game may use the wrong data when the player crosses into a connected map.

Note that all dimensions herein ("height" and "width") are measured in blocks. Coordinates also start with (0, 0) being the point in the top-left corner of the map.

Background information

When the player enters a map, the game "draws" that map in a "working" map in RAM. The address of the working map is constant (0xC6E8), with its contents changing as the player changes maps.

The working map does not only include the currently occupied map, however. When the game draws the working map, it adds a 3-block buffer on all sides of the current map. The game then uses this buffer zone to draw the "connections" to any maps adjacent to the currently occupied map. The 3-block buffer means that even if the player stands at the edge of a map next to a connection, the area that the player can see (18 tiles tall x 20 tiles wide, with 8 tiles on all sides except on the right; and 4 tiles = 2 steps = 1 block) is always within the working map.

Pointers to starts

These pointers define, respectively, what part of the connected map is drawn and where it gets drawn relative to the current map.

Pointer to start in connected map

The pointer to the start in the connected map points to the first (upper-left) block of the connection that will be drawn. This combines with the defined connection size to define the section of the map that will be drawn for the connection. The below illustrates how this may be calculated.

  • For a north or south connection, to draw a connection that starts B blocks east of the leftmost edge of the map, start with:
map_ptr + B
where map_ptr is the pointer to the connected map.
  • If the connection is in the south, add onto the above:
width * ( height - 3 )
where width and height refer to the dimensions of the connected map in blocks.
  • For an east or west connection, to draw a connection that starts B blocks south of the topmost edge of the map, start with:
map_ptr + ( width * B )
where map_ptr is the pointer to the connected map and width is its width in blocks.
  • If the connection is in the west, add onto the above:
width - 3
Pointer to start of connection

The pointer to the start of the connection points to the first (upper-left) block where the connection will be drawn in the working map. The below illustrates how this may be calculated.

  • For a north or south connection, to position a connection so it starts B blocks east (where B can be negative) of the leftmost edge of the map, start with:
0xC6E8 + B + 3
  • If the connection is in the south, add onto the above:
( height + 3 ) * ( width + 6 )
to move the pointer to the southern buffer zone, where height and width refer to the base dimensions of the current map in blocks.
  • For an east or west connection, to position a connection so it starts B blocks south (where B can be negative) of the uppermost edge of the map, start with:
0xC6E8 + ( width + 6 ) * ( B + 3 )
where width refers to the base width of the current map in blocks.
  • If the connection is in the east, add onto the above:
width + 3
to move the pointer to the eastern buffer zone.

Connection size

This combined with the pointer to the start point in the connected map defines the section of the connected map that is drawn beyond the edge of the current map. For connections that are on the north or south, this defines the width that is drawn, while for connections on the east or west, it defines the height. (The size of the connection in the other dimension is 3 blocks, i.e., the size of the buffer zone.)

Player Y and X offsets

These offsets allow the game to translate the player's position in one map to a new position in a connected map when they cross a connection.

While the player is in the current map, their position is (Y, X) (measured in steps from the top and left edges of the map, with 0 being at the edge). When the player crosses from one map into a connected map, if the player is crossing a north or south connection, their Y position will be treated as 0; if the player is crossing an east or west connection, their X position will be treated as 0. Translating the remaining unmodified value then depends on two variables used above: the offset of the connection within the connected map, con_map_offset (i.e., the value used for B in deriving the pointer to the start in the connected map above), and the offset of the connection strip within the working map, strip_offset (i.e., the value used for B in deriving the pointer to the start of the connection above). Note that strip_offset can be negative.

For a north or south connection, then, the player offsets are:

  • Y: 0 for a south connection, 2 * height - 1 for a north connection (where height is the connected map's height in blocks).
  • X: -2 * ( strip_offset - con_map_offset ).

For a east or west connection, the player offsets are:

  • Y: -2 * ( strip_offset - con_map_offset ).
  • X: 0 for an east connection, 2 * width - 1 for a west connection (where width is the connected map's width in blocks).

Pointer to window

This pointer indicates the leftmost or uppermost block in the working map that will be visible on the Game Boy's screen after the player crosses into a connected map and the game loads it into the working map.

The Game Boy's screen is 18 tiles tall and 20 tiles wide, with the player's sprite occupying a 2x2-tile square approximately in the middle, such that there are always 8 tiles to any side of the player except to the right (where there are 10). Since blocks are 4x4 squares of tiles, this means that there are always two blocks both above and to the left of the player (where the screen starts drawing from).

This pointer does not point to the exact block that will be visible, since this is impossible given that the player could be in a number of positions depending on the connection size. Instead, it points to the second block that is in the uppermost (for north/south connections) or leftmost (for east/west connections) line of blocks that may be visible, and the game automatically adjusts for the player's variable position. Presumably, the reason why the second block is used instead of the first is because, being the outermost edge of the working map's buffer zone (which is three blocks tall/wide), that first block would never be visible since the player can only enter on the new map's uppermost or leftmost edge, with only two blocks of the buffer zone visible.

For a north or south connection, then, this pointer may be derived by calculating:

0xC6E8 + 1 + x * ( 6 + width )

where x is 1 if the connection is a north connection, or height if it is a south connection. Width and height refer to the connected map's dimensions in blocks.

For an east or west connection, this pointer may be derived by calculating:

0xC6E8 + ( 6 + width ) + x

where x is 1 if the connection is an east connection, or width if it is a west connection. Width refers to the connected map's width in blocks.

Object data

Object data
size offset
Border block 1 byte 0
Number of warps 1 byte 1
List of warps ... opt
Number of signs 1 byte ...
List of signs ... opt
Number of sprites 1 byte ...
List of sprites ... opt
List of warp-in points ... opt

Object data is a further set of data about a map that is located separate from the map header. It is pointed to by the last pointer in the map header.

Border block

The border block is the block that is used to fill undefined spaces outside of the current map that come into view.

Warps

List item - warp
size offset
Y position (steps) 1 byte 0
X position (steps) 1 byte 1
Warp-in index (0-based) 1 byte 2
Target map index (0-based) 1 byte 3

The list of warps has the same number of entries as the number of warps value. If there are no warps, the number of signs value immediately follows the number of warps value.

Map warps can activate in two ways, defined by the type of tile that is at or around the warp point's coordinates.

The first way for a warp to activate is for the tile at that coordinate (defined as the bottom-left tile in the 2x2 square of tiles the player would stand on) to be a special tile. If it is, the player will warp immediately.

If the tile at the warp's coordinates is not a special tile, then either the tile in front of the player (defined as the bottom-left tile in the 2x2 square of tiles the player might stand on) must be another type of special tile or (in certain maps) the player must be facing the edge of the map. If one of these is true, then if the player attempts to move forward again and collides with the tile or the edge of the map, then they will warp. (If the player does not collide, the player will not warp.)

Notes

The warp-in index is a 0-based index referencing the warp-in list of the target map.

If the target map index is set to 0xFF, the warp will take the player "outside" (that is, to the last outdoors map; or the last map set as such, such as when crossing Diglett's Cave). The target map may also be the same as the current map's index.

Signs

List item - sign
size offset
Y position (steps) 1 byte 0
X position (steps) 1 byte 1
Text script index (1-based) 1 byte 2

The list of signs has the same number of entries as the number of signs value. If there are no signs, the number of sprites value immediately follows the number of signs value.

An entry in the signs list will cause the designated text script to be activated when the player presses the A button while facing the designated coordinates.

Sprites

List item - sprite
size offset
Sprite index (1-based) 1 byte 0
Adjusted Y position (steps) 1 byte 1
Adjusted X position (steps) 1 byte 2
Mobility 1 byte 3
Movement 1 byte 4
Type flags + text script index (1-based) 1 byte 5
Item sprites only
Item index (1-based) 1 byte 6
Battle sprites only
Opponent index (1-based) 1 byte 6
Level or team index (1-based) 1 byte 7

The list of sprites has the same number of entries as the number of sprites value. If there are no sprites, the warp-in points list immediately follows the number of sprites value.

There are three types of sprites: normal NPCs, items that can be picked up, and battles (Trainers or stationary Pokémon). The length of an entry in the sprites list depends on the type of sprite being described. The type of sprite is indicated in the sixth byte of an entry, the "type flags + text script pointer".

Adjusted Y and X positions

These values are equal to the sprite's position on the map (in steps) plus four. The addition makes it easier for the game to quickly determine whether the sprite is visible on the screen or not, since one of the sprite's coordinates will be equal to one of the player's coordinates when the sprite appears on the edge of the screen (because there are always four steps to the left of or above the player).

Mobility

The mobility determines whether the sprite can move from its starting position. Possible values are:

  • 0xFE: mobile (the sprite may move from its starting position)
  • 0xFF: stationary (the sprite will remain in its starting position)
  • Other: the sprite will always move (even if it is not visible) and will ignore collisions.

Movement

The movement describes how the sprite may try to move. A sprite chooses its movements randomly from among its permitted directions. Possible values are:

  • 0x01: only move up or down
  • 0x02: only move left or right
  • 0xD0: always move down
  • 0xD1: always move up
  • 0xD2: always move left
  • 0xD3: always move right
  • Other: move randomly

If a sprite is stationary (as defined by its mobility), instead of moving, it will only change the direction it is facing (if possible). If a mobile sprite chooses a movement where it would collide with something (including the edge of the screen), it will instead only change direction.

Types flags + text script index

The highest two bits of this byte indicate which type of sprite this entry describes. The lowest five bits are the sprite's text script index number.

The high bits are interpreted as below:

Bit Decimal Sprite type
6 +64 Battle
7 +128 Item

If neither of these bits is set (i.e., if this byte's value is less than 64), the sprite is a normal NPC. If both of these bits are set, the sprite will be recognized as a battle sprite (since that is the bit that is checked first).

Opponent index (battles)

If this value is less than 0xC8, it is interpreted as the index number of a Pokémon and will start a wild Pokémon battle with that Pokémon. This is used in places such as the Kanto Power Plant (Voltorb and Electrode) and Cerulean Cave (Mewtwo).

Otherwise, 0xC8 is subtracted from this value and it is interpreted as the (1-based) index number of a Trainer class and will start a Trainer battle.

Level or team index (battles)

If the opponent index designates a wild Pokémon battle, this value is the Pokémon's level.

Otherwise, this value is the index that indicates which team the Trainer will use among the list of Pokémon teams for their Trainer class.

Warp-in points

List item - warp-in point
size offset
Pointer to window 2 bytes 0
Y position 1 byte 2
X position 1 byte 3

The list of warp-in points has the same number of entries as the number of warps value (i.e., it is the same size as the warps list). If there are no warp-in points, the object data ends immediately after the sprites list.

This list defines where the player will warp in after taking a warp that leads to this map. The warp-in index of the used warp indicates which entry in this list to enter with.

Pointer to window

Like the pointer to the new window for the connection data in the map header, this pointer indicates the leftmost or uppermost block in the working map that will be visible on the Game Boy's screen after the player crosses into a connected map and the game loads it into the working map.

Since the player always has two blocks above and to the left of them, this pointer may be derived by calculating:

0xC6E8 + 1 + X_block + ( 6 + width ) * ( 1 + Y_block )

where width is this map's width in blocks and where Y_block and X_block are the (0-based) blocks where the player will be located (calculated by taking, respectively, half of the Y position (in steps) and half of the X position, rounded down).

Map header location data

Map headers are located across many "banks" of the ROM and are not generally consecutive with each other. Two separate lists combine to point to the location of each map header. One is a list of offset pointers, which has the format of a simple list of pairs of bytes (written in little endian), one pair for each map header. The other is a list of bank numbers, which has the format of a simple list of bytes, one for each map header.

Game Offsets Banks
Red and BlueEN 0x01AE 0xC23D

All maps

The table below identifies all of the possible map indices and the address of their map header in English Pokémon Red games. (The addresses in Blue are generally the same, with some small differences.) Rows that are in red mark invalid maps that do not point to actual map data and that will freeze the game if visited. Rows that are in gray mark unused but otherwise valid maps.

Index Location ROM address
0 Pallet Town 0x182A1
1 Viridian City 0x18357
2 Pewter City 0x18554
3 Cerulean City 0x1874E
4 Lavender Town 0x44000
5 Vermilion City 0x18998
6 Celadon City 0x18000
7 Fuchsia City 0x18BA7
8 Cinnabar Island 0x1C000
9 Indigo Plateau 0x5091E
10 Saffron City 0x509A4
11 Unused 0x49A4
12 Route 1 0x1C0C3
13 Route 2 0x54000
14 Route 3 0x541E6
15 Route 4 0x54390
16 Route 5 0x54581
17 Route 6 0x58000
18 Route 7 0x48000
19 Route 8 0x5812D
20 Route 9 0x54686
21 Route 10 0x582D4
22 Route 11 0x584BE
23 Route 12 0x5866D
24 Route 13 0x5480C
25 Route 14 0x54999
26 Route 15 0x5892C
27 Route 16 0x58ADA
28 Route 17 0x54B20
29 Route 18 0x58C38
30 Route 19 0x54E78
31 Route 20 0x500F1
32 Route 21 0x54FFF
33 Route 22 0x50000
34 Route 23 0x5033F
35 Route 24 0x50682
36 Route 25 0x5079B
37 Red's house 1F 0x4815C
38 Red's house 2F 0x5C0A4
39 Blue's house 0x19B2F
40 Professor Oak's Laboratory 0x1CB02
41 Viridian Pokémon Center 0x44251
42 Viridian Poké Mart 0x1D462
43 Pokémon academy 0x1D540
44 Viridian house 0x1D57D
45 Viridian Gym 0x74897
46 Diglett's Cave Route 2 cave 0x1DEA4
47 Viridian Forest north gate 0x5D57B
48 Route 2 house 0x1DEE1
49 Route 2 gate 0x5D5C8
50 Viridian Forest south gate 0x5D650
51 Viridian Forest 0x61101
52 Pewter Museum of Science 1F 0x5C0EB
53 Pewter Museum of Science 2F 0x5C30B
54 Pewter Gym 0x5C37B
55 Pewter NE house 0x1D5E7
56 Pewter Poké Mart 0x74CA1
57 Pewter SW house 0x1D63C
58 Pewter Pokémon Center 0x5C57B
59 Mt. Moon 1F 0x499BC
60 Mt. Moon B1F 0x51A36
61 Mt. Moon B2F 0x49CFF
62 Cerulean trashed house 0x1D679
63 Cerulean trade house 0x1D6EA
64 Cerulean Pokémon Center 0x5C639
65 Cerulean Gym 0x5C6A7
66 Bike Shop 0x1D730
67 Cerulean Poké Mart 0x5C889
68 Mt. Moon Pokémon Center 0x492C3
69 Unused (same pointer as 62) 0x1D679
70 Route 5 gate 0x1DF27
71 Route 5 Underground Path entrance 0x5D69D
72 Pokémon Day Care 0x56243
73 Route 6 gate 0x1E031
74 Route 6 Underground Path entrance 0x5D6E3
75 Unused (same pointer as 74)
76 Route 7 gate 0x1E0F4
77 Route 7 Underground Path entrance 0x5D720
78 Unused (data copy of 77) 0x5D75D
79 Route 8 gate 0x1E1BB
80 Route 8 Underground Path entrance 0x1E27D
81 Rock Tunnel Pokémon Center 0x493AE
82 Rock Tunnel 1F 0x444D0
83 Power Plant 0x1E2BA
84 Route 11 gate 1F 0x49400
85 Diglett's Cave Route 11 cave 0x1E5AE
86 Route 11 gate 2F 0x49448
87 Route 12 gate 1F 0x494F8
88 Bill's house 0x1E75E
89 Vermilion Pokémon Center 0x5C983
90 Pokémon Fan Club 0x59B64
91 Vermilion Poké Mart 0x5C9D5
92 Vermilion Gym 0x5CA1A
93 Vermilion SE house 0x1DAF0
94 Vermilion harbor 0x1DB46
95 S.S. Anne 1F corridor 0x61259
96 S.S. Anne 2F corridor 0x61393
97 S.S. Anne corridor to deck 0x44926
98 S.S. Anne B1F corridor 0x61622
99 S.S. Anne deck 0x616A2
100 S.S. Anne kitchen 0x617A7
101 S.S. Anne Captain's room 0x61889
102 S.S. Anne 1F rooms 0x6196A
103 S.S. Anne 2F rooms 0x61B3F
104 S.S. Anne B1F rooms 0x61D49
105 Unused 0x762A2
106
107
108 Victory Road 1F 0x5D9FE
109 Unused 0x762A2
110
111
112
113 Indigo Plateau Lance's room 0x5A2A2
114 Unused 0x762A2
115
116
117
118 Indigo Plateau Hall of Fame room 0x5A492
119 Route 5-6 Underground Path 0x61F1A
120 Indigo Plateau Champion's room 0x75F11
121 Route 7-8 Underground Path 0x61F3E
122 Celadon Department Store 1F 0x60F7A
123 Celadon Department Store 2F 0x560E9
124 Celadon Department Store 3F 0x48219
125 Celadon Department Store 4F 0x4834A
126 Celadon Department Store roof 0x483C9
127 Celadon Department Store elevator 0x485F4
Index Location ROM address
128 Celadon Mansion 1F 0x48688
129 Celadon Mansion 2F 0x4872E
130 Celadon Mansion 3F 0x48784
131 Celadon Mansion rooftop 0x4885F
132 Celadon Mansion rooftop room 0x1DD2E
133 Celadon Pokémon Center 0x488AC
134 Celadon Gym 0x488FE
135 Celadon Game Corner 0x48BB1
136 Celadon Department Store 5F 0x4905D
137 Game Corner Prize Exchange 0x490E4
138 Celadon diner 0x49145
139 Celadon house 0x49202
140 Celadon hotel 0x4925D
141 Lavender Pokémon Center 0x5C8CE
142 Pokémon Tower 1F 0x60420
143 Pokémon Tower 2F 0x604E6
144 Pokémon Tower 3F 0x606C0
145 Pokémon Tower 4F 0x607EA
146 Pokémon Tower 5F 0x60926
147 Pokémon Tower 6F 0x60AE3
148 Pokémon Tower 7F 0x60CF9
149 Lavender Volunteer Pokémon House 0x1D89C
150 Lavender Poké Mart 0x5C920
151 Lavender SW house 0x1D9A2
152 Fuchsia Poké Mart 0x1DD7C
153 Fuchsia SW house 0x7500C
154 Fuchsia Pokémon Center 0x75057
155 Warden's home 0x750A9
156 Safari Zone entrance 0x751C1
157 Fuchsia Gym 0x75431
158 Fuchsia Safari employee building 0x756D7
159 Seafoam Islands B1F 0x46309
160 Seafoam Islands B2F 0x46445
161 Seafoam Islands B3F 0x46581
162 Seafoam Islands B4F 0x4678D
163 Fishing Guru's house 0x56064
164 Fishing Guru's older brother's house 0x56170
165 Pokémon Mansion 1F 0x442A3
166 Cinnabar Gym 0x7573E
167 Pokémon Lab entrance 0x75B80
168 Pokémon Lab Meeting Room 0x75C15
169 Pokémon Lab R-and-D Room 0x75C7B
170 Pokémon Lab Testing Room 0x75D25
171 Cinnabar Pokémon Center 0x75E20
172 Cinnabar Poké Mart 0x75E72
173 Unused (same pointer as 172)
174 Indigo Plateau lobby 0x19C4F
175 Copycat's house 1F 0x75EB7
176 Copycat's house 2F 0x5CC65
177 Fighting Dojo 0x5CD51
178 Saffron Gym 0x5D001
179 Saffron NW house 0x1DDD1
180 Saffron Poké Mart 0x5D3FD
181 Silph Co. 1F 0x5D442
182 Saffron Pokémon Center 0x5D529
183 Mr. Psychic's house 0x1DE30
184 Route 15 gate 1F 0x495F6
185 Route 15 gate 2F 0x4963E
186 Route 16 gate 1F 0x496B2
187 Route 16 gate 2F 0x497FF
188 Route 16 house 0x1E5EC
189 Route 12 house 0x56473
190 Route 18 gate 1F 0x4986A
191 Route 18 gate 2F 0x49969
192 Seafoam Islands 1F 0x447DD
193 Route 22 gate 0x1E677
194 Victory Road 2F 0x51791
195 Route 12 gate 2F 0x49554
196 Vermilion trade house 0x19C06
197 Diglett's Cave 0x61F62
198 Victory Road 3F 0x44974
199 Rocket Hideout B1F 0x44BBE
200 Rocket Hideout B2F 0x44E1B
201 Rocket Hideout B3F 0x45219
202 Rocket Hideout B4F 0x45451
203 Rocket Hideout elevator 0x45704
204 Unused 0x5704
205
206
207 Silph Co. 2F 0x59CE5
208 Silph Co. 3F 0x59F4F
209 Silph Co. 4F 0x19CFF
210 Silph Co. 5F 0x19F2B
211 Silph Co. 6F 0x1A19D
212 Silph Co. 7F 0x51B55
213 Silph Co. 8F 0x564F8
214 Pokémon Mansion 2F 0x51FCC
215 Pokémon Mansion 3F 0x521E2
216 Pokémon Mansion B1F 0x523AD
217 Safari Zone east 0x4585F
218 Safari Zone north 0x4599F
219 Safari Zone west 0x4A1A9
220 Safari Zone center 0x45BA6
221 Safari Zone center rest house 0x45CE1
222 Safari Zone secret house 0x4A30B
223 Safari Zone west rest house 0x45D1E
224 Safari Zone east rest house 0x45D69
225 Safari Zone north rest house 0x45DB4
226 Cerulean Cave 2F 0x45DFF
227 Cerulean Cave B1F 0x45EE4
228 Cerulean Cave 1F 0x74D00
229 Name Rater's house 0x1DA06
230 Cerulean badges house 0x74DFD
231 Unused 0x56B2
232 Rock Tunnel B1F 0x45FDF
233 Silph Co. 9F 0x5D7AF
234 Silph Co. 10F 0x5A12D
235 Silph Co. 11F 0x620EE
236 Silph Co. elevator 0x457B4
237 Unused 0x45CE5
238
239 Battle Center (Cable Club) 0x4FD04
240 Trade Center (Cable Club) 0x4FD71
241 Unused 0x45CE5
242
243
244
245 Indigo Plateau Lorelei's room 0x7616F
246 Indigo Plateau Bruno's room 0x762CA
247 Indigo Plateau Agatha's room 0x76421


Data structure in the Pokémon games
Generation I Pokémon data structurePokémon base stats data structureSave data structureCharacter encoding
Generation II Pokémon data structurePokémon base stats data structureTrainer data structureSave data structureCharacter encoding
Generation III Pokémon data structurePokémon data substructuresPokémon base stats data structureMove data structure
Contest data structureContest move data structureItem data structurePokédex data structureBattle Frontier data structures
Trainer Tower data structuresPokémon evolution data structureType Chart data structureSave data structureCharacter encoding
Generation IV Pokémon data structureSave data structure

Project Games logo.png This data structure article is part of Project Games, a Bulbapedia project that aims to write comprehensive articles on the Pokémon games.