Fancy Knowledge #5 - Editing The Catch-Areas In The Pokedex
I received another request concerning the worldmap these days. This time somebody informed me that the catch-areas of FR/LG
are not automatically updated if you change the worldmap(s) of the game and look on the map in the pokedex.
That's why I started to search for the conection between pokemondata and the data displayed in the pokedex. Here is what I came up with:
The good news: It's again about tables and data stored in arrays.
The bad news: This won't be included in the next version of Advance Map and therefore is a really anoying job you have to
do by hand.
Okay, the game (use FR US for reference) uses a new set of numbers which hasn't been investigated so far. Before we were dealing with the "worldmap values", this
time we will talk about the "catchmap values" (that's how I'll call them. doesn't it sound cool, eh? :-) ) The first action is that the game
assigns a catchmap value to every worldmap value. This conversion is stored in a table at $464148. Do not forget to update the amount of entries of catchmap
values stored in that table which is defined by the byte at $13CA9C. If you haven't changed the catchmap values yet, the standard length should be 0x37.
The table looks like this:
[XXXX][YYYY]
XXXX = worldmap value
YYYY = linked catchmap value
The "normal" form of this table contains the following entries:
ROM:08464148 DCW 0x58 ; worldmap_value
ROM:08464148 DCW 1 ; catchmap_value
ROM:0846414C DCW 0x59 ; worldmap_value
ROM:0846414C DCW 2 ; catchmap_value
ROM:08464150 DCW 0x5A ; worldmap_value
ROM:08464150 DCW 3 ; catchmap_value
ROM:08464154 DCW 0x5B ; worldmap_value
ROM:08464154 DCW 4 ; catchmap_value
ROM:08464158 DCW 0x5C ; worldmap_value
ROM:08464158 DCW 5 ; catchmap_value
ROM:0846415C DCW 0x5D ; worldmap_value
ROM:0846415C DCW 6 ; catchmap_value
ROM:08464160 DCW 0x5E ; worldmap_value
ROM:08464160 DCW 7 ; catchmap_value
ROM:08464164 DCW 0x5F ; worldmap_value
ROM:08464164 DCW 8 ; catchmap_value
ROM:08464168 DCW 0x60 ; worldmap_value
ROM:08464168 DCW 9 ; catchmap_value
ROM:0846416C DCW 0x61 ; worldmap_value
ROM:0846416C DCW 0xA ; catchmap_value
ROM:08464170 DCW 0x62 ; worldmap_value
ROM:08464170 DCW 0xB ; catchmap_value
ROM:08464174 DCW 0x63 ; worldmap_value
ROM:08464174 DCW 0xF ; catchmap_value
ROM:08464178 DCW 0x64 ; worldmap_value
ROM:08464178 DCW 0x15 ; catchmap_value
ROM:0846417C DCW 0x65 ; worldmap_value
ROM:0846417C DCW 0xC ; catchmap_value
ROM:08464180 DCW 0x66 ; worldmap_value
ROM:08464180 DCW 0xD ; catchmap_value
ROM:08464184 DCW 0x67 ; worldmap_value
ROM:08464184 DCW 0xE ; catchmap_value
ROM:08464188 DCW 0x68 ; worldmap_value
ROM:08464188 DCW 0xF ; catchmap_value
ROM:0846418C DCW 0x69 ; worldmap_value
ROM:0846418C DCW 0x10 ; catchmap_value
ROM:08464190 DCW 0x6A ; worldmap_value
ROM:08464190 DCW 0x11 ; catchmap_value
ROM:08464194 DCW 0x6B ; worldmap_value
ROM:08464194 DCW 0x12 ; catchmap_value
ROM:08464198 DCW 0x6C ; worldmap_value
ROM:08464198 DCW 0x13 ; catchmap_value
ROM:0846419C DCW 0x6D ; worldmap_value
ROM:0846419C DCW 0x14 ; catchmap_value
ROM:084641A0 DCW 0x6E ; worldmap_value
ROM:084641A0 DCW 0x15 ; catchmap_value
ROM:084641A4 DCW 0x6F ; worldmap_value
ROM:084641A4 DCW 0x16 ; catchmap_value
ROM:084641A8 DCW 0x70 ; worldmap_value
ROM:084641A8 DCW 0x17 ; catchmap_value
ROM:084641AC DCW 0x71 ; worldmap_value
ROM:084641AC DCW 0x18 ; catchmap_value
ROM:084641B0 DCW 0x72 ; worldmap_value
ROM:084641B0 DCW 0x19 ; catchmap_value
ROM:084641B4 DCW 0x73 ; worldmap_value
ROM:084641B4 DCW 0x1A ; catchmap_value
ROM:084641B8 DCW 0x74 ; worldmap_value
ROM:084641B8 DCW 0x1B ; catchmap_value
ROM:084641BC DCW 0x75 ; worldmap_value
ROM:084641BC DCW 0x1C ; catchmap_value
ROM:084641C0 DCW 0x76 ; worldmap_value
ROM:084641C0 DCW 0x1D ; catchmap_value
ROM:084641C4 DCW 0x77 ; worldmap_value
ROM:084641C4 DCW 0x1E ; catchmap_value
ROM:084641C8 DCW 0x78 ; worldmap_value
ROM:084641C8 DCW 0x1F ; catchmap_value
ROM:084641CC DCW 0x79 ; worldmap_value
ROM:084641CC DCW 0x20 ; catchmap_value
ROM:084641D0 DCW 0x7A ; worldmap_value
ROM:084641D0 DCW 0x21 ; catchmap_value
ROM:084641D4 DCW 0x7B ; worldmap_value
ROM:084641D4 DCW 0x22 ; catchmap_value
ROM:084641D8 DCW 0x7C ; worldmap_value
ROM:084641D8 DCW 0x23 ; catchmap_value
ROM:084641DC DCW 0x7D ; worldmap_value
ROM:084641DC DCW 0x24 ; catchmap_value
ROM:084641E0 DCW 0x7E ; worldmap_value
ROM:084641E0 DCW 0x25 ; catchmap_value
ROM:084641E4 DCW 0x7F ; worldmap_value
ROM:084641E4 DCW 0x27 ; catchmap_value
ROM:084641E8 DCW 0x80 ; worldmap_value
ROM:084641E8 DCW 6 ; catchmap_value
ROM:084641EC DCW 0x81 ; worldmap_value
ROM:084641EC DCW 0xB ; catchmap_value
ROM:084641F0 DCW 0x82 ; worldmap_value
ROM:084641F0 DCW 0xB ; catchmap_value
ROM:084641F4 DCW 0x83 ; worldmap_value
ROM:084641F4 DCW 0x26 ; catchmap_value
ROM:084641F8 DCW 0x84 ; worldmap_value
ROM:084641F8 DCW 0x2F ; catchmap_value
ROM:084641FC DCW 0x85 ; worldmap_value
ROM:084641FC DCW 7 ; catchmap_value
ROM:08464200 DCW 0x86 ; worldmap_value
ROM:08464200 DCW 0xB ; catchmap_value
ROM:08464204 DCW 0x87 ; worldmap_value
ROM:08464204 DCW 0x2E ; catchmap_value
ROM:08464208 DCW 0x88 ; worldmap_value
ROM:08464208 DCW 0x2C ; catchmap_value
ROM:0846420C DCW 0x89 ; worldmap_value
ROM:0846420C DCW 0x2F ; catchmap_value
ROM:08464210 DCW 0x8A ; worldmap_value
ROM:08464210 DCW 0x29 ; catchmap_value
ROM:08464214 DCW 0x8B ; worldmap_value
ROM:08464214 DCW 0x2D ; catchmap_value
ROM:08464218 DCW 0x8C ; worldmap_value
ROM:08464218 DCW 0x2B ; catchmap_value
ROM:0846421C DCW 0x8D ; worldmap_value
ROM:0846421C DCW 0x28 ; catchmap_value
ROM:08464220 DCW 0x8E ; worldmap_value
ROM:08464220 DCW 0x2A ; catchmap_value
Taking the first two examples this means 0x58 (Pallet Town) has catchmap value 1, 0x59 (Viridian City)
has catchmap value 2 and so on... It shouldn't be hard to edit this one. In case you are running out of space: the
pointer 0x08464148 is located at $13CAC8 - change it to extend the list. (And again don't forget to update the length
of the list as mentioned before!!)
As far as the other maps are concerned, they're sorted by island number meaning that you find this list
seven times - this is needed because of the seven different island pictures in the pokedex. It works like this:
ROM:084642BC DCD word_8464224
ROM:084642C0 DCD 4
ROM:084642C4 DCD word_8464234
ROM:084642C8 DCD 2
ROM:084642CC DCD word_846423C
ROM:084642D0 DCD 5
ROM:084642D4 DCD word_8464250
ROM:084642D8 DCD 2
ROM:084642DC DCD word_8464258
ROM:084642E0 DCD 7
ROM:084642E4 DCD word_8464274
ROM:084642E8 DCD 7
ROM:084642EC DCD word_8464290
ROM:084642F0 DCD 0xB
As you can see, the combination [Pointer][Length of the data table] is found seven times. If you follow the pointer you
get a list like the one above assigning the catchmap values for each of the islands.
Now that we have come so far we should care about how a catchmap value should be interpreted. This is done via another table,
this time it's located at $463580. Always 4 bytes represent 1 catchmap value entry - meaning that the first 4 bytes are loaded for catch
map value 0x00 the second 4 bytes for catchmap value 0x01 and so on. Pretty easy to understand. The structure is:
[TT][XX][YY][00]
TT = Shape of the catch area
XX = X-coordinate of the area on the worldmap in the pokedex
YY = Y-coordinate of the area on the worldmap in the pokedex
00 = Padding
Note that the x- and the y-coordinate count from the top leftmost pixel of the map (not the pixel in the upper left corner of
the GBA-screen). Since their meaning is quite obvious, the TT-byte needs a little further explanation. When you enter the pokedex, the ROM uncompresses
LZ-picture data located at $46343c and copies it in the VRAM section which is used for sprites:
LZ77UnCompWram: 0x0846343c,0x0201c000 (VCOUNT=97)
CpuSet: 0x0201c000,0x06011000,0x00000250 (VCOUNT=110)
The picture shows all the different shapes which could be displayed as areas where a certain pokemon can be obtained. But one picture says
more than 1000 words, have a look to this:
The red box shows all the values that the TT-byte could be and its graphical representation on the worldmap. So this is everything you need
to know. =) |