Welcome to Data Crystal's new home! Data Crystal is now part of the TCRF family (sort of).
The wiki has recently moved; please report any issues in Discord. Pardon the dust.
The wiki has recently moved; please report any issues in Discord. Pardon the dust.
Pokémon Red and Blue/Notes: Difference between revisions
Jump to navigation
Jump to search
(New page: <pre> %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% RGBY Map Headers & Stuff That Goes With It By Hat (a.k.a. The Black Phantom) Version 1.0 ...) |
m (small improvements, made a start on tileset headers) |
||
Line 3: | Line 3: | ||
RGBY Map Headers & Stuff That Goes With It | RGBY Map Headers & Stuff That Goes With It | ||
Version 1.0 | Version 1.0 | ||
-Feel free to distribute this document and/or edit it | -Feel free to distribute this document and/or edit it. | ||
- | -Try and credit people you get info from and/or write how you updated. | ||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% | ||
Things that need adding: | |||
------------------------ | |||
More information about tilesets, and info about what sprites get loaded for | |||
which maps. | |||
Updates: | |||
-------- | |||
v1.1: By Hat, minor improvements. | |||
v1.0: Original version typed up by Hat. | |||
Main Credits (Structure Information): | Main Credits (Structure Information): | ||
Line 23: | Line 32: | ||
............................................................................... | ............................................................................... | ||
Notes: | |||
R/B Pointers to Map Headers: 0x01AE | |||
R/B Map Header Banks: 0xC23D | |||
R/B Pointer to Tileset Headers: 0xC767 | |||
Maximum tileset size in VRAM: 6 rows of 16 tiles (9000-95FF) | |||
............................................................................... | |||
=============================================================================== | |||
Tileset Header Structure (*Incomplete*) | |||
=============================================================================== | |||
12 bytes per header... | |||
Format: | |||
~~~~~~~ | |||
[1 BYTE: Bank No. of Blocks/Tiles] | |||
[2 BYTES: Pointer to Blocks (-10 for some reason)] | |||
[2 BYTES: Pointer to Tiles] | |||
[7 BYTES: ???] | |||
last 7 bytes ideas: collison data pointer? something to do with animations? | |||
=============================================================================== | =============================================================================== | ||
Map Header Structure | |||
=============================================================================== | =============================================================================== | ||
Line 66: | Line 100: | ||
=============================================================================== | =============================================================================== | ||
The tileset descriptions are copied from a document compiled by Cartmic, | |||
called "Pokemon Red Documents", which may help you with other stuff too. | |||
Unchanged R/B Locations/Tileset No./Tileset Descriptions | |||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | |||
C7BE; 00: "Outside"C7CA; 01: "Ash's House (#1)" | |||
C7D6; 02: "Pokemon Center (#1)" | |||
C7E2; 03: "Viridian Forest" | |||
C7EE; 04: "Ash's House (#2)" | |||
C7FA; 05: "Gym (#1)" | |||
C806; 06: "Pokemon Center (#2)" | |||
C812; 07: "Gym (#2)" | |||
C81E; 08: "House" | |||
C82A; 09: "Museum (#1)" | |||
C836; 0A: "Museum (#2)" | |||
C842; 0B: "Underground Path" | |||
C84E; 0C: "Museum (#3)" | |||
C85A; 0D: "S.S. Anne" | |||
C866; 0E: "Vermilion Port" | |||
C872; 0F: "Pokemon Cemetery" | |||
C87E; 10: "Silph Co." | |||
C88A; 11: "Cave" | |||
C896; 12: "Celadon Mart" | |||
C8A2; 13: "Game Freak HQ" | |||
C8AE; 14: "Lab" | |||
C8BA; 15: "Bike Shop/Cable Center" | |||
C8C6; 16: "Cinnabar Mansion/Power Plant etc" | |||
C8D2; 17: "Indigo Plateau" | |||
NOTE: As you can see there's multiple copies of some tileset headers. They are | |||
literally copies, you only need 1 copy, but you will need to make sure all maps | |||
using that tileset are set to using that tileset number, then you can use the | |||
free space for more tilesets. | |||
=============================================================================== | =============================================================================== | ||
Line 104: | Line 144: | ||
=============================================================================== | =============================================================================== | ||
You can use | You can use the GoldMap engine for hacking map data quite easily. | ||
The map you walk around on and stuff is stored as block indexes. | The map you walk around on and stuff is stored as block indexes. | ||
A single block consists of 4*4 tiles | A single block consists of 4*4 tiles. | ||
=============================================================================== | =============================================================================== | ||
Line 123: | Line 159: | ||
=============================================================================== | =============================================================================== | ||
ASM used on that map, chances are if there's something on a map you can't find | |||
elsewhere you might easily be able to find it here, using a hex search | |||
function. You can find things like XY positions of Poke Balls and 1-time | |||
only Pokemon. | |||
=============================================================================== | =============================================================================== | ||
Line 133: | Line 170: | ||
Note: | Note: | ||
~~~~~ | ~~~~~ | ||
If this value is 00h it is immediately followed by the Object Data | |||
Pointer, no gap. Repeated list... | Pointer, no gap. Repeated list... | ||
Line 164: | Line 200: | ||
The last thing in the Map Header. It points to a bunch of certain stuff that | The last thing in the Map Header. It points to a bunch of certain stuff that | ||
is stored in | is stored in similar structures. | ||
Object Data is discussed at the end of this document. | Object Data is discussed at the end of this document. | ||
Line 173: | Line 209: | ||
*** Hacking Connections *** | *** Hacking Connections *** | ||
This | This will certainly require planning, with no background distractions. | ||
Unless a editor gets built that can hack the connections for RGBY. | |||
=============================================================================== | =============================================================================== | ||
Line 194: | Line 230: | ||
#10-11: [Window] | #10-11: [Window] | ||
PKMN Red Example -- Saffron City (Header: 0x509A4) Diagram: | |||
-------- | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||
Saffrons need-to-know stats: | |||
Block Height (Y): 12 | |||
Block Width (X): 14 | |||
Connection Byte: 0F (North + South + West + East) | |||
- - - - | |||
+ = current maps border blocks | |||
++++++++NNNNNNNNNN++++++++ | |||
++++++++NNNNNNNNNN++++++++ | |||
++++++++NNNNNNNNNN++++++++ | |||
+++####################+++ | |||
+++####################+++ | |||
+++####### My #########+++ | |||
+++####################+++ | |||
WWW####### Name's #####EEE | |||
WWW####################EEE | |||
WWW###### Saffron #####EEE | |||
WWW####################EEE | |||
WWW###### City! #######EEE | |||
WWW####################EEE | |||
WWW####################EEE | |||
WWW####################EEE | |||
WWW####################EEE | |||
+++####################+++ | |||
+++####################+++ | |||
+++####################+++ | |||
+++####################+++ | |||
+++####################+++ | |||
++++++++SSSSSSSSSS++++++++ | |||
++++++++SSSSSSSSSS++++++++ | |||
++++++++SSSSSSSSSS++++++++ | |||
Connection to Route 5 (to the North) | |||
*Y: 12 | |||
*X: 0A | |||
*X_Movement_of_Connection Strip = 5 | |||
Map Index: 10 | |||
Connection Strip: 4668 | |||
Where Connected: C6F0 (C6EB + 5) | |||
"Bigness": 0A | |||
Width: 0A | |||
Y alignment: 23 (12 * 2 - 1) | |||
X alignment: F6 (5 * -2) | |||
Window: C809 (C6E9 + (12 * (0A + 6))) | |||
Connection to Route 6 (to the South) | |||
*Y: 12 | |||
*X: 0A | |||
*X_Movement_of_Connection Strip = 5 | |||
Map Index: 11 | |||
Connection Strip: 4079 | |||
Where Connected: C912 (C6EB + ((12 + 3) * (14 + 6)) + 5) | |||
"Bigness": 0A | |||
Width: 0A | |||
Y alignment: 00 | |||
X alignment: F6 (5 * -2) | |||
Window: C6F9 (C6EF + 0A) | |||
Connection to Route 7 (to the West) | |||
*Y: 09 | |||
*X: 0A | |||
*Y_Movement_of_Connection Strip = 4 | |||
Map Index: 12 | |||
Connection Strip: 4058 | |||
Where Connected: C79E (C6E8 + (14 + 6) * (4 + 3)) | |||
"Bigness": 09 | |||
Width: 0A | |||
Y alignment: F8 (4 * -2) | |||
X alignment: 13 ((0A * 2) - 1) | |||
Window: C702 (C6EE + (0A * 2)) | |||
Connection to Route 8 (to the East) | |||
*Y: 09 | |||
*X: 1E | |||
*Y_Movement_of_Connection Strip = 4 | |||
Map Index: 13 | |||
Connection Strip: 41C6 | |||
Where Connected: C7B5 (C6E5 + (14 + 6) * (4 + 4)) | |||
"Bigness": 09 | |||
Width: 1E | |||
Y alignment: F8 (4 * -2) | |||
X alignment: 00 | |||
Window: C70D (C6EF + 1E) | |||
=============================================================================== | =============================================================================== | ||
Line 236: | Line 321: | ||
=============================================================================== | =============================================================================== | ||
Not included! Download UltraMap, the text file known as "RedEnglish. | Not included! Download UltraMap, the text file known as "RedEnglish.ini" | ||
contains all the Map Indexes in decimal, which you'll obviously need to convert | contains all the Map Indexes in decimal for R/B, which you'll obviously need | ||
to hex. | to convert to hex. | ||
=============================================================================== | =============================================================================== | ||
Line 254: | Line 339: | ||
=============================================================================== | =============================================================================== | ||
This points to the part of the current map (in RAM | This points to the part of the current map (further up in RAM) | ||
that the connection strips upperleft block is placed on the current map. | that the connection strips upperleft block is placed on the current map. | ||
Line 294: | Line 379: | ||
Direction | Formula | Direction | Formula | ||
___________|_______ | ___________|_______ | ||
North: ( | North: (Height_of_connected_map * 2) - 1 | ||
South: 0 | South: 0 | ||
West/East: (Y_movement_of_connection_strip_in_blocks * -2) | West/East: (Y_movement_of_connection_strip_in_blocks * -2) | ||
Line 313: | Line 398: | ||
=============================================================================== | =============================================================================== | ||
#10-#11 : | #10-#11 : Window | ||
=============================================================================== | =============================================================================== | ||
Line 372: | Line 457: | ||
Warp-To Points | Warp-To Points | ||
-------------- | -------------- | ||
[*2 Bytes*: Event Displacement | [*2 Bytes*: Event Displacement][Y position][X position] | ||
Event Displacement Formula: | Event Displacement Formula: | ||
~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||
C6E3 + ((Map width + 8) * (rows above + 1)) + (X movement + 4) | C6E3 + ((Map width + 8) * (rows above + 1)) + (X movement + 4) | ||
############################################################### | ############################################################################### | ||
</pre> | </pre> |
Revision as of 17:01, 19 September 2008
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% RGBY Map Headers & Stuff That Goes With It Version 1.0 -Feel free to distribute this document and/or edit it. -Try and credit people you get info from and/or write how you updated. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Things that need adding: ------------------------ More information about tilesets, and info about what sprites get loaded for which maps. Updates: -------- v1.1: By Hat, minor improvements. v1.0: Original version typed up by Hat. Main Credits (Structure Information): ------------------------------------- [Xeon] Wrote some stuff about Map Headers and Object Data. Which this document expands upon, a bit. [F-Zero] & [Tauwasser] Wrote a document (in German) explaining how GSC connection data is stored. RGBY connection data is stored almost the same way, it turns out, so that helped a great deal. All that is really different is the values you add the amount of blocks to. ............................................................................... Notes: R/B Pointers to Map Headers: 0x01AE R/B Map Header Banks: 0xC23D R/B Pointer to Tileset Headers: 0xC767 Maximum tileset size in VRAM: 6 rows of 16 tiles (9000-95FF) ............................................................................... =============================================================================== Tileset Header Structure (*Incomplete*) =============================================================================== 12 bytes per header... Format: ~~~~~~~ [1 BYTE: Bank No. of Blocks/Tiles] [2 BYTES: Pointer to Blocks (-10 for some reason)] [2 BYTES: Pointer to Tiles] [7 BYTES: ???] last 7 bytes ideas: collison data pointer? something to do with animations? =============================================================================== Map Header Structure =============================================================================== Explanation: ~~~~~~~~~~~~ This contains all the data (pointers count as data) to build the map. Format: ~~~~~~~ #1: [Tileset Number] #2: [(Y Size) Map Height] #3: [(X Size) Map Width] #4-5: [*2 Bytes*: Pointer to Map] #6-7: [*2 Bytes*: Pointer to Maps Text Pointers] #8-9: [*2 Bytes*: Pointer to Maps "Script"] #10: [Connection Byte: 00 = No Connections 01 = North 02 = West 03 = West + East 04 = South 05 = South + East 06 = South + West 07 = South + West + East 08 = North 09 = North + East 0A = North + West 0B = North + West + East 0C = North + South 0D = North + South + East 0E = North + South + West 0F = North + South + West + East] ?: [*11 Bytes per Connection*, No connections? Straight to "Object Data"!] Last: [*2 Bytes*: Pointer to Object Data] =============================================================================== 1) Tileset Numbers =============================================================================== The tileset descriptions are copied from a document compiled by Cartmic, called "Pokemon Red Documents", which may help you with other stuff too. Unchanged R/B Locations/Tileset No./Tileset Descriptions ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ C7BE; 00: "Outside"C7CA; 01: "Ash's House (#1)" C7D6; 02: "Pokemon Center (#1)" C7E2; 03: "Viridian Forest" C7EE; 04: "Ash's House (#2)" C7FA; 05: "Gym (#1)" C806; 06: "Pokemon Center (#2)" C812; 07: "Gym (#2)" C81E; 08: "House" C82A; 09: "Museum (#1)" C836; 0A: "Museum (#2)" C842; 0B: "Underground Path" C84E; 0C: "Museum (#3)" C85A; 0D: "S.S. Anne" C866; 0E: "Vermilion Port" C872; 0F: "Pokemon Cemetery" C87E; 10: "Silph Co." C88A; 11: "Cave" C896; 12: "Celadon Mart" C8A2; 13: "Game Freak HQ" C8AE; 14: "Lab" C8BA; 15: "Bike Shop/Cable Center" C8C6; 16: "Cinnabar Mansion/Power Plant etc" C8D2; 17: "Indigo Plateau" NOTE: As you can see there's multiple copies of some tileset headers. They are literally copies, you only need 1 copy, but you will need to make sure all maps using that tileset are set to using that tileset number, then you can use the free space for more tilesets. =============================================================================== 2 & 3) Map Height (Y) & Width (X) =============================================================================== Exactly that, the amount of blocks high and wide the map data is. =============================================================================== 4 & 5) Map Data Pointer =============================================================================== You can use the GoldMap engine for hacking map data quite easily. The map you walk around on and stuff is stored as block indexes. A single block consists of 4*4 tiles. =============================================================================== 6 & 7) Pointer to Maps Text Pointers =============================================================================== 2 byte pointers to text that is used on that map. =============================================================================== 8 & 9) Pointer to Maps "Script" =============================================================================== ASM used on that map, chances are if there's something on a map you can't find elsewhere you might easily be able to find it here, using a hex search function. You can find things like XY positions of Poke Balls and 1-time only Pokemon. =============================================================================== 10) Connection Byte =============================================================================== Note: ~~~~~ If this value is 00h it is immediately followed by the Object Data Pointer, no gap. Repeated list... Connection Byte: 00 = No Connections 01 = North 02 = West 03 = West + East 04 = South 05 = South + East 06 = South + West 07 = South + West + East 08 = North 09 = North + East 0A = North + West 0B = North + West + East 0C = North + South 0D = North + South + East 0E = North + South + West 0F = North + South + West + East =============================================================================== ?) Connection Data (0-44 bytes, explained in more depth: further down) =============================================================================== =============================================================================== Last) Object Data Pointer =============================================================================== The last thing in the Map Header. It points to a bunch of certain stuff that is stored in similar structures. Object Data is discussed at the end of this document. ............................................................................... =============================================================================== *** Hacking Connections *** This will certainly require planning, with no background distractions. Unless a editor gets built that can hack the connections for RGBY. =============================================================================== Explanation: ~~~~~~~~~~~~ The "Connection Byte" determines how many connections are in this space, including none at all. Structure: ~~~~~~~~~~ #1: [Map Index of Connected Map] #2-3: [Pointer to "Connection Strip"s Upperleft Block (Connected Map)] #4-5: [Pointer to "Connection Strip"s Upperleft Block (Current Map)] #6: ["Bigness"] #7: [Map Width] #8: [Y alignment] #9: [X alignment] #10-11: [Window] PKMN Red Example -- Saffron City (Header: 0x509A4) Diagram: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Saffrons need-to-know stats: Block Height (Y): 12 Block Width (X): 14 Connection Byte: 0F (North + South + West + East) - - - - + = current maps border blocks ++++++++NNNNNNNNNN++++++++ ++++++++NNNNNNNNNN++++++++ ++++++++NNNNNNNNNN++++++++ +++####################+++ +++####################+++ +++####### My #########+++ +++####################+++ WWW####### Name's #####EEE WWW####################EEE WWW###### Saffron #####EEE WWW####################EEE WWW###### City! #######EEE WWW####################EEE WWW####################EEE WWW####################EEE WWW####################EEE +++####################+++ +++####################+++ +++####################+++ +++####################+++ +++####################+++ ++++++++SSSSSSSSSS++++++++ ++++++++SSSSSSSSSS++++++++ ++++++++SSSSSSSSSS++++++++ Connection to Route 5 (to the North) *Y: 12 *X: 0A *X_Movement_of_Connection Strip = 5 Map Index: 10 Connection Strip: 4668 Where Connected: C6F0 (C6EB + 5) "Bigness": 0A Width: 0A Y alignment: 23 (12 * 2 - 1) X alignment: F6 (5 * -2) Window: C809 (C6E9 + (12 * (0A + 6))) Connection to Route 6 (to the South) *Y: 12 *X: 0A *X_Movement_of_Connection Strip = 5 Map Index: 11 Connection Strip: 4079 Where Connected: C912 (C6EB + ((12 + 3) * (14 + 6)) + 5) "Bigness": 0A Width: 0A Y alignment: 00 X alignment: F6 (5 * -2) Window: C6F9 (C6EF + 0A) Connection to Route 7 (to the West) *Y: 09 *X: 0A *Y_Movement_of_Connection Strip = 4 Map Index: 12 Connection Strip: 4058 Where Connected: C79E (C6E8 + (14 + 6) * (4 + 3)) "Bigness": 09 Width: 0A Y alignment: F8 (4 * -2) X alignment: 13 ((0A * 2) - 1) Window: C702 (C6EE + (0A * 2)) Connection to Route 8 (to the East) *Y: 09 *X: 1E *Y_Movement_of_Connection Strip = 4 Map Index: 13 Connection Strip: 41C6 Where Connected: C7B5 (C6E5 + (14 + 6) * (4 + 4)) "Bigness": 09 Width: 1E Y alignment: F8 (4 * -2) X alignment: 00 Window: C70D (C6EF + 1E) =============================================================================== #1 : Map Indexes =============================================================================== Not included! Download UltraMap, the text file known as "RedEnglish.ini" contains all the Map Indexes in decimal for R/B, which you'll obviously need to convert to hex. =============================================================================== #2-#3 : "Connection Strip" Location =============================================================================== The "connection strip" pointer -- points to the area of the connected map that is visible when standing before you even enter it. Points to the upperleft block of the "connection strip". * connection strip is always 3 blocks wide (E/W connection) 3 blocks high (N/S connection) =============================================================================== #4-#5 : Current Map Position =============================================================================== This points to the part of the current map (further up in RAM) that the connection strips upperleft block is placed on the current map. ____________________ Connection | Direction | Formula ___________|_______ North: C6EB + X_Movement_of_Connection Strip South: C6EB + (Height of Map + 3) * (Width of Map + 6) + X_Movement_of_Connection Strip West: C6E8 + (Width of Map + 6) * (Y_Movement_of_"Connection Strip" + 3) East: C6E5 + (Width of Map + 6) * (Y_Movement_of_"Connection Strip" + 4) =============================================================================== #6 : Map "Bigness" =============================================================================== North/South Connection = Connected Maps Width East/West Connection = Connected Maps Height =============================================================================== #7 : Map Width =============================================================================== The width of the connected map. =============================================================================== #8 : Y alignment =============================================================================== Relative Y-position of player after entering connected map. ____________________ Connection | Direction | Formula ___________|_______ North: (Height_of_connected_map * 2) - 1 South: 0 West/East: (Y_movement_of_connection_strip_in_blocks * -2) =============================================================================== #9 : X alignment =============================================================================== Relative X-Position of player after entering connected map. ____________________ Connection | Direction | Formula ___________|_______ North/South: (X_movement_of_connection_strip_in_blocks * -2) West: (Width_of_connected_map * 2) - 1 East: 0 =============================================================================== #10-#11 : Window =============================================================================== Position of the upper left block after entering the Map. ____________________ Connection | Direction | Formula ___________|_______ Above: C6E9h + Height_of_connected_map * (Width_of_connected_map + 6) South/East: C6EFh + Width_of_connected_map West: C6EEh + 2 * Width_of_connected_map ............................................................................... =============================================================================== Object Data: General Structure =============================================================================== Object Data =========== [Maps Border Tile] [Number of Warps][Warp Data] [Number of Signs][Sign Data] [Number of People/Trainers/Items] [People Data] [Trainer Data] [Item Data] [Warp-To Data] Warps: ------ [Y position][X position][Warp-To Point][Warp-To Map] Signposts: ---------- [Y position][X position][Text String Number] Normal People: -------------- [Picture Number][Y position + 4][X position + 4] [Movement 1][Movement 2][Text String Number] Trainers: --------- [Picture Number][Y position + 4][X position + 4] [Movement 1][Movement 2][Text String Number] [Trainer Type][Pokemon Set] Items: --------------------- [Picture Number][Y position + 4][X position + 4] [Movement 1][Movement 2][Text String Number] [Item Number] Warp-To Points -------------- [*2 Bytes*: Event Displacement][Y position][X position] Event Displacement Formula: ~~~~~~~~~~~~~~~~~~~~~~~~~~~ C6E3 + ((Map width + 8) * (rows above + 1)) + (X movement + 4) ###############################################################################