You are not logged in.
Hi there. I've recently been doing some research on maps in the first-generation games. I'm completely new to the hex-editing (hex-reading in my case) thing, but I have been able to understand it so far. I'm not wanting to do ROM hacking, but I am interested in data mining. More specifically, I'm interested in the map data in Red and Blue, for now.
What I want to do is read the map for each area, which is fine--I can do that. The map headers all have pointers to the map, which I can follow. However, I need a way to identify each map in my script, since their order in the ROM doesn't correspond to their ID number. Also, as far as I can tell, I can't get the location ID from the map header. My solution was to try to just read each map's name, since there's a pointer to the map's text pointer in the map header.
This is where I've run into problems. PALLET TOWN (8F 80 8B 8B 84 93 7F 93 8E 96 8D) appears six times in the rom, at $71473, $8cf67, $8d702, $8d729, $95c6c, and $a438f. Pallet Town's pointer to its text pointer is 0x4F88 (88 4F), so I go to $18F88. At that point, I expected to find a pointer to one of the offsets at which PALLET TOWN appears in the ROM, but the value there is 0x4F96 (96 4F). None of the locations of the text even ends with 6.
Can somebody explain to me what I'm missing?
The location that you looked at (0x18f88) is the table of text pointers for Pallet Town. You looked at the first pointer (0x4f96) which points to the text for when Prof. Oak appears.
PalletTownTextPointers: ; 18f88 (6:4f88) dw PalletTownText1 dw PalletTownText2 dw PalletTownText3 dw PalletTownText4 dw PalletTownText5 dw PalletTownText6 dw PalletTownText7 PalletTownText1: ; 18f96 (6:4f96) db 8 ld a,[$CF0D] and a jr nz,.next ld a,1 ld [$CC3C],a ld hl,OakAppearsText jr .done .next ld hl,OakWalksUpText .done call PrintText jp TextScriptEnd
As you can see, when text begins with $08, that tells the text engine to start executing asm, instead of trying to read text.
If you're trying to get to the "PALLET TOWN" text string that is used in the Pallet Town sign post, that is pointed to by PalletTownText5 from the text pointer table.
PalletTownText5: ; 0x18fe2 sign by fence TX_FAR _PalletTownText5 db "@"
_PalletTownText5:: ; a438b (29:438b) text "PALLET TOWN" line "Shades of your" cont "journey await!" done
If you haven't already, you should check out the disassembly of Pokemon Red.
Thank you for that explanation!
The disassembly project is an impressive feat. It looks like it will be my go-to resource for this game generation and the second generation. I guess I'll be reading a lot of Python source for the disassembly tools to figure out how the map data was read, and then move to writing tools to read map data from the GBA games.
Thanks again for such a detailed response.
You mentioned that the problem is that the order of the headers in the rom doesn't match the order of their id's.
You may want to look at MapHeaderPointers and MapHeaderBanks:
; see also MapHeaderBanks MapHeaderPointers:: ; 01ae (0:01ae) dw PalletTown_h dw ViridianCity_h dw PewterCity_h dw CeruleanCity_h dw LavenderTown_h dw VermilionCity_h dw CeladonCity_h dw FuchsiaCity_h dw CinnabarIsland_h dw IndigoPlateau_h dw SaffronCity_h .....
; see also MapHeaderPointers MapHeaderBanks: ; c23d (3:423d) db BANK(PalletTown_h) ;PALLET_TOWN db BANK(ViridianCity_h) ; VIRIDIAN_CITY db BANK(PewterCity_h) ; PEWTER_CITY db BANK(CeruleanCity_h) ; CERULEAN_CITY db BANK(LavenderTown_h) ; LAVENDER_TOWN db BANK(VermilionCity_h) ; VERMILION_CITY db BANK(CeladonCity_h) ; CELADON_CITY db BANK(FuchsiaCity_h) ; FUCHSIA_CITY db BANK(CinnabarIsland_h) ; CINNABAR_ISLAND db BANK(IndigoPlateau_h) ; INDIGO_PLATEAU db BANK(SaffronCity_h) ; SAFFRON_CITY .....
I think I just misunderstood how a lot of this worked. This information is definitely specifically what I needed. Thanks again for your response!
Does the "ID" of a map come from its position in the list of map header pointers?
Thanks again for your response!