78 KiB
Section 05 - Ilex Forest and Goldenrod City Gym
Source: ../section-05-ilex-forest-and-goldenrod-city-gym.txt
Maps covered: AZALEA_TOWN (west exit only), ILEX_FOREST_AZALEA_GATE,
ILEX_FOREST, ROUTE_34_ILEX_FOREST_GATE, ROUTE_34, DAY_CARE,
GOLDENROD_CITY, GOLDENROD_POKECENTER_1F, GOLDENROD_DEPT_STORE_1F ..
GOLDENROD_DEPT_STORE_6F, BILLS_FAMILYS_HOUSE,
GOLDENROD_UNDERGROUND_SWITCH_ROOM_ENTRANCES, GOLDENROD_UNDERGROUND,
GOLDENROD_BIKE_SHOP, GOLDENROD_MAGNET_TRAIN_STATION, RADIO_TOWER_1F,
GOLDENROD_GAME_CORNER, GOLDENROD_GYM.
Badges / key milestones in this section:
- Rival battle 2 (Azalea Town),
EVENT_RIVAL_AZALEA_TOWN HM_CUT(HM01) from the charcoal master,EVENT_GOT_HM01_CUTTM_HEADBUTT(TM02),TM_SWEET_SCENT(TM12)BICYCLE,COIN_CASE,ENGINE_RADIO_CARD- PLAINBADGE (
ENGINE_PLAINBADGE) +TM_ATTRACT(TM45) from Whitney
Conventions used below are the ones in _TEMPLATE.md. Disassembly paths are
relative to the pokegold checkout root; port paths are relative to this repo
root. All coordinates are raw asm values (map coordinates, 2 per map block).
Note on SCENE_* names: pokegold has no constants/map_scenes.asm. The
scene_script macro (macros/scripts/maps.asm) defines each scene constant at
the point of use, so SCENE_AZALEATOWN_RIVAL_BATTLE is declared by
maps/AzaleaTown.asm itself.
1. Route order
| # | Map constant | asm file | Enter via | Leaves via | Why (walkthrough beat) |
|---|---|---|---|---|---|
| 1 | AZALEA_TOWN |
maps/AzaleaTown.asm |
out of AZALEA_GYM (warp 5 at 10,15) |
warps 7/8 at (2,10)/(2,11) -> ILEX_FOREST_AZALEA_GATE 3/4 |
heal, walk west, rival trip-wire at (5,10)/(5,11) |
| 2 | ILEX_FOREST_AZALEA_GATE |
maps/IlexForestAzaleaGate.asm |
warps 3/4 at (9,4)/(9,5) | warps 1/2 at (0,4)/(0,5) -> ILEX_FOREST 2/3 |
gate house, two flavour NPCs |
| 3 | ILEX_FOREST |
maps/IlexForest.asm |
warps 2/3 at (3,42)/(3,43) | warp 1 at (1,5) -> ROUTE_34_ILEX_FOREST_GATE 3 |
herd Farfetch'd, get HM01, cut the tree, TM02, Revive |
| 4 | ROUTE_34_ILEX_FOREST_GATE |
maps/Route34IlexForestGate.asm |
warps 3/4 at (4,7)/(5,7) | warps 1/2 at (4,0)/(5,0) -> ROUTE_34 1/2 |
teacher hands over TM12 Sweet Scent |
| 5 | ROUTE_34 |
maps/Route34.asm |
warps 1/2 at (13,37)/(14,37) | north map connection -> GOLDENROD_CITY (offset -5) |
Samuel, Brandon, Ian, Gina, Keith, Todd; Day-Care |
| 6 | DAY_CARE |
maps/DayCare.asm |
ROUTE_34 warps 3/4/5 at (11,14)/(11,15)/(13,15) |
warps 1..4 back to ROUTE_34 |
deposit / breed, egg pickup |
| 7 | GOLDENROD_CITY |
maps/GoldenrodCity.asm |
south map connection from ROUTE_34 (offset 5) |
see the city's 15 warps | hub for everything below |
| 8 | GOLDENROD_POKECENTER_1F |
maps/GoldenrodPokecenter1F.asm |
city warp 7 at (15,27) | warps 1/2 at (3,7)/(4,7) | heal |
| 9 | GOLDENROD_DEPT_STORE_1F..6F |
maps/GoldenrodDeptStore1F.asm .. 6F.asm |
city warp 10 at (24,27) | stairs / elevator | shopping, Sunday TM lady on 5F |
| 10 | BILLS_FAMILYS_HOUSE |
maps/BillsFamilysHouse.asm |
city warp 4 at (5,25) | warps 1/2 at (2,7)/(3,7) | Bill's phone number from the younger sister |
| 11 | GOLDENROD_UNDERGROUND_SWITCH_ROOM_ENTRANCES |
maps/GoldenrodUndergroundSwitchRoomEntrances.asm |
city warp 15 at (11,29) -> warp 5 at (4,29) | warp 4 at (5,25) -> GOLDENROD_UNDERGROUND 2 |
the "house below Bill's" is the south underground stair |
| 12 | GOLDENROD_UNDERGROUND |
maps/GoldenrodUnderground.asm |
warp 2 at (3,34) | warp 1 at (3,2) -> switch-room warp 7 at (21,25) | Eric, Issac, Coin Case, salon, Teru, Donald, locked basement door |
| 13 | GOLDENROD_UNDERGROUND_SWITCH_ROOM_ENTRANCES (north half) |
as above | warp 7 at (21,25) | warps 8/9 at (20,29)/(21,29) -> GOLDENROD_CITY 14 at (9,5) |
come back up on the north side of town |
| 14 | GOLDENROD_BIKE_SHOP |
maps/GoldenrodBikeShop.asm |
city warp 2 at (29,29) | warps 1/2 at (2,7)/(3,7) | borrow the BICYCLE |
| 15 | GOLDENROD_MAGNET_TRAIN_STATION |
maps/GoldenrodMagnetTrainStation.asm |
city warp 5 at (9,13) | warps 1/2 at (8,17)/(9,17) | conductor flavour text, no train yet |
| 16 | RADIO_TOWER_1F |
maps/RadioTower1F.asm |
city warp 12 at (5,15) | warps 1/2 at (2,7)/(3,7) | Lucky Number man + Radio Card quiz |
| 17 | GOLDENROD_GAME_CORNER |
maps/GoldenrodGameCorner.asm |
city warp 11 at (14,21) | warps 1/2 at (2,13)/(3,13) | slots, prize corner (needs COIN_CASE) |
| 18 | GOLDENROD_GYM |
maps/GoldenrodGym.asm |
city warp 1 at (24,7) | warps 1/2 at (2,17)/(3,17) | Victoria, Samantha, Carrie, Bridget, Whitney |
Spills into the next section: after PLAINBADGE the walkthrough's next hop is
north out of Goldenrod through ROUTE_35_GOLDENROD_GATE (city warp 13 at
(19,1)); that map and Route 35 belong to the following section.
2. Maps
MAP_AZALEA_TOWN (west exit / rival battle only)
- Script:
maps/AzaleaTown.asm - Blocks:
maps/AzaleaTown.blk - Header:
data/maps/maps.asm:232->TILESET_JOHTO_MODERN, TOWN, LANDMARK_AZALEA_TOWN, MUSIC_AZALEA_TOWN, FALSE, PALETTE_AUTO, FISHGROUP_SHORE - Dimensions:
constants/map_constants.asm:213->map_const AZALEA_TOWN, 20, 9 - Connections (
data/maps/attributes.asm:132): westRoute34(offset -18), eastRoute33(offset 0)
Warps (def_warp_events)
| idx | x | y | destination map | dest warp |
|---|---|---|---|---|
| 1 | 15 | 9 | AZALEA_POKECENTER_1F |
1 |
| 2 | 21 | 13 | CHARCOAL_KILN |
1 |
| 3 | 21 | 5 | AZALEA_MART |
2 |
| 4 | 9 | 5 | KURTS_HOUSE |
1 |
| 5 | 10 | 15 | AZALEA_GYM |
1 |
| 6 | 31 | 7 | SLOWPOKE_WELL_B1F |
1 |
| 7 | 2 | 10 | ILEX_FOREST_AZALEA_GATE |
3 |
| 8 | 2 | 11 | ILEX_FOREST_AZALEA_GATE |
4 |
Coord events (def_coord_events)
| scene | x | y | script label | effect |
|---|---|---|---|---|
SCENE_AZALEATOWN_RIVAL_BATTLE |
5 | 10 | AzaleaTownRivalBattleScene1 |
rival is teleported to (11,11) first, then walks 6 left |
SCENE_AZALEATOWN_RIVAL_BATTLE |
5 | 11 | AzaleaTownRivalBattleScene2 |
rival walks 6 left from his placed position |
BG events (def_bg_events) - the ones on the west path
| x | y | type | script/item |
|---|---|---|---|
| 3 | 9 | BGEVENT_READ |
AzaleaTownIlextForestSign |
| 31 | 6 | BGEVENT_ITEM |
AzaleaTownHiddenFullHeal (FULL_HEAL, EVENT_AZALEA_TOWN_HIDDEN_FULL_HEAL) |
(The other seven bg events - town sign, Kurt's house, gym, Slowpoke Well, charcoal kiln, Pokecenter, mart - are listed verbatim in the asm and belong to the previous section.)
Object events (def_object_events) - rival row only
| const | sprite | x | y | movement | type | script label | event flag |
|---|---|---|---|---|---|---|---|
AZALEATOWN_RIVAL |
SPRITE_AZALEA_ROCKET |
11 | 10 | SPRITEMOVEDATA_STANDING_LEFT |
OBJECTTYPE_SCRIPT |
ObjectEvent |
EVENT_RIVAL_AZALEA_TOWN |
SPRITE_AZALEA_ROCKET is remapped to SPRITE_RIVAL by
variablesprite SPRITE_AZALEA_ROCKET, SPRITE_RIVAL in
maps/SlowpokeWellB1F.asm (line 59), so the object draws as the rival.
Scripts of interest
AzaleaTownRivalBattleScene1/AzaleaTownRivalBattleScene2->AzaleaTownRivalBattleScript:playmusic MUSIC_RIVAL_ENCOUNTER, before-text,setevent EVENT_RIVAL_AZALEA_TOWN, then branches on the starter:checkevent EVENT_GOT_TOTODILE_FROM_ELM->loadtrainer RIVAL1, RIVAL1_2_CHIKORITA;checkevent EVENT_GOT_CHIKORITA_FROM_ELM->RIVAL1_2_CYNDAQUIL; otherwise (player took Cyndaquil) ->RIVAL1_2_TOTODILE.winlosstext AzaleaTownRivalWinText, AzaleaTownRivalLossText,setlasttalked AZALEATOWN_RIVAL,startbattle,reloadmapafterbattle..AfterBattle:MUSIC_RIVAL_AFTER, after-text, rival walks 3 left,disappear AZALEATOWN_RIVAL,setscene SCENE_AZALEATOWN_NOOP.- Arming:
maps/SlowpokeWellB1F.asm(the Slowpoke Well clear scene) runssetevent EVENT_CLEARED_SLOWPOKE_WELL,setmapscene AZALEA_TOWN, SCENE_AZALEATOWN_RIVAL_BATTLE,clearevent EVENT_ILEX_FOREST_APPRENTICE,clearevent EVENT_ILEX_FOREST_FARFETCHD_1,setevent EVENT_CHARCOAL_KILN_FARFETCH_D,setevent EVENT_CHARCOAL_KILN_APPRENTICE. So the Ilex Forest Farfetch'd quest and the Azalea rival battle are both armed by clearing Slowpoke Well, not by the Hive Badge. AzaleaTownFlypointCallback(MAPCALLBACK_NEWMAP):setflag ENGINE_FLYPOINT_AZALEA.
Flags and events
| constant | defined in | read/written by | meaning for a bot |
|---|---|---|---|
SCENE_AZALEATOWN_RIVAL_BATTLE |
maps/AzaleaTown.asm:17 (scene_script) |
set by maps/SlowpokeWellB1F.asm:58, cleared to SCENE_AZALEATOWN_NOOP by .AfterBattle |
trip-wire armed / disarmed |
EVENT_RIVAL_AZALEA_TOWN |
constants/event_flags.asm:1121 |
set by AzaleaTownRivalBattleScript |
also the rival object's spawn flag |
EVENT_CLEARED_SLOWPOKE_WELL |
constants/event_flags.asm |
read by AzaleaTownGrampsScript |
prerequisite for this whole section |
ENGINE_FLYPOINT_AZALEA |
constants/engine_flags.asm:82 |
AzaleaTownFlypointCallback |
Fly destination unlocked |
Trainers
| const | class | id | party (data/trainers/parties.asm) |
script label | rematch/phone |
|---|---|---|---|---|---|
RIVAL1 |
RIVAL1 |
RIVAL1_2_CHIKORITA / _CYNDAQUIL / _TOTODILE (constants/trainer_constants.asm:55-57) |
Rival1Group entries 4/5/6: L12 Gastly, L14 Zubat, L16 Bayleef / Quilava / Croconaw |
AzaleaTownRivalBattleScript |
none |
Note the asm order is Gastly, Zubat, starter; the walkthrough prints Gastly, starter, Zubat. Trust the asm.
MAP_ILEX_FOREST_AZALEA_GATE
- Script:
maps/IlexForestAzaleaGate.asm - Blocks: none (
maps/IlexForestAzaleaGate.blkis absent; gate uses the shared gate blockset) - Header:
data/maps/maps.asm:287->TILESET_GATE, GATE, LANDMARK_ROUTE_34, MUSIC_ROUTE_36, FALSE, PALETTE_DAY, FISHGROUP_SHORE - Dimensions:
constants/map_constants.asm:265->map_const ILEX_FOREST_AZALEA_GATE, 5, 4 - Connections: none (indoor gate)
Warps
| idx | x | y | destination map | dest warp |
|---|---|---|---|---|
| 1 | 0 | 4 | ILEX_FOREST |
2 |
| 2 | 0 | 5 | ILEX_FOREST |
3 |
| 3 | 9 | 4 | AZALEA_TOWN |
7 |
| 4 | 9 | 5 | AZALEA_TOWN |
8 |
Coord events: none. BG events: none.
Object events
| const | sprite | x | y | movement | type | script label | event flag |
|---|---|---|---|---|---|---|---|
ILEXFORESTAZALEAGATE_OFFICER |
SPRITE_OFFICER |
5 | 2 | SPRITEMOVEDATA_STANDING_DOWN |
OBJECTTYPE_SCRIPT |
IlexForestAzaleaGateOfficerScript |
-1 |
ILEXFORESTAZALEAGATE_GRANNY |
SPRITE_GRANNY |
1 | 3 | SPRITEMOVEDATA_STANDING_DOWN |
OBJECTTYPE_SCRIPT |
IlexForestAzaleaGateGrannyScript |
-1 |
Both are jumptextfaceplayer only. No gate guard, no badge check.
MAP_ILEX_FOREST
- Script:
maps/IlexForest.asm - Blocks:
maps/IlexForest.blk(405 bytes = 15 x 27) - Header:
data/maps/maps.asm:122->TILESET_FOREST, CAVE, LANDMARK_ILEX_FOREST, MUSIC_UNION_CAVE, FALSE, PALETTE_NITE, FISHGROUP_POND - Dimensions:
constants/map_constants.asm:109->map_const ILEX_FOREST, 15, 27 - Connections: none (
data/maps/attributes.asm:441has noconnectionrows) - Environment is
CAVEand palette isPALETTE_NITE, so it renders dark all day; it is not a Flash map (noEVENT_...FLASHrequirement anywhere in the file).
Warps
| idx | x | y | destination map | dest warp |
|---|---|---|---|---|
| 1 | 1 | 5 | ROUTE_34_ILEX_FOREST_GATE |
3 |
| 2 | 3 | 42 | ILEX_FOREST_AZALEA_GATE |
1 |
| 3 | 3 | 43 | ILEX_FOREST_AZALEA_GATE |
2 |
Coord events: def_coord_events is empty. The Farfetch'd chase is driven
entirely by talking to the object, not by stepping on tiles.
BG events
| x | y | type | script/item |
|---|---|---|---|
| 3 | 17 | BGEVENT_READ |
IlexForestSignpost |
| 27 | 1 | BGEVENT_ITEM |
IlexForestHiddenEther -> hiddenitem ETHER, EVENT_ILEX_FOREST_HIDDEN_ETHER |
| 17 | 7 | BGEVENT_ITEM |
IlexForestHiddenSuperPotion -> hiddenitem SUPER_POTION, EVENT_ILEX_FOREST_HIDDEN_SUPER_POTION |
| 9 | 17 | BGEVENT_ITEM |
IlexForestHiddenFullHeal -> hiddenitem FULL_HEAL, EVENT_ILEX_FOREST_HIDDEN_FULL_HEAL |
| 8 | 22 | BGEVENT_READ |
IlexForestShrineScript (the shrine the walkthrough calls "Ilex Forest Shrine") |
Object events
| const | sprite | x | y | movement | type | script label | event flag |
|---|---|---|---|---|---|---|---|
ILEXFOREST_FARFETCHD1 |
SPRITE_BIRD |
14 | 31 | SPINRANDOM_SLOW |
OBJECTTYPE_SCRIPT |
FarfetchdPosition1 |
EVENT_ILEX_FOREST_FARFETCHD_1 |
ILEXFOREST_FARFETCHD2 |
SPRITE_BIRD |
15 | 25 | SPINRANDOM_SLOW |
OBJECTTYPE_SCRIPT |
FarfetchdPosition2 |
EVENT_ILEX_FOREST_FARFETCHD_2 |
ILEXFOREST_FARFETCHD3 |
SPRITE_BIRD |
20 | 24 | SPINRANDOM_SLOW |
OBJECTTYPE_SCRIPT |
FarfetchdPosition3 |
EVENT_ILEX_FOREST_FARFETCHD_3 |
ILEXFOREST_FARFETCHD4 |
SPRITE_BIRD |
29 | 22 | SPINRANDOM_SLOW |
OBJECTTYPE_SCRIPT |
FarfetchdPosition4 |
EVENT_ILEX_FOREST_FARFETCHD_4 |
ILEXFOREST_FARFETCHD5 |
SPRITE_BIRD |
28 | 31 | SPINRANDOM_SLOW |
OBJECTTYPE_SCRIPT |
FarfetchdPosition5 |
EVENT_ILEX_FOREST_FARFETCHD_5 |
ILEXFOREST_FARFETCHD6 |
SPRITE_BIRD |
24 | 35 | SPINRANDOM_SLOW |
OBJECTTYPE_SCRIPT |
FarfetchdPosition6 |
EVENT_ILEX_FOREST_FARFETCHD_6 |
ILEXFOREST_FARFETCHD7 |
SPRITE_BIRD |
22 | 31 | SPINRANDOM_SLOW |
OBJECTTYPE_SCRIPT |
FarfetchdPosition7 |
EVENT_ILEX_FOREST_FARFETCHD_7 |
ILEXFOREST_FARFETCHD8 |
SPRITE_BIRD |
15 | 29 | SPINRANDOM_SLOW |
OBJECTTYPE_SCRIPT |
FarfetchdPosition8 |
EVENT_ILEX_FOREST_FARFETCHD_8 |
ILEXFOREST_FARFETCHD9 |
SPRITE_BIRD |
10 | 35 | SPINRANDOM_SLOW |
OBJECTTYPE_SCRIPT |
FarfetchdPosition9 |
EVENT_ILEX_FOREST_FARFETCHD_9 |
ILEXFOREST_FARFETCHD10 |
SPRITE_BIRD |
6 | 28 | SPINRANDOM_SLOW |
OBJECTTYPE_SCRIPT |
FarfetchdPosition10 |
EVENT_ILEX_FOREST_FARFETCHD_10 |
ILEXFOREST_YOUNGSTER |
SPRITE_YOUNGSTER |
7 | 28 | STANDING_DOWN |
OBJECTTYPE_SCRIPT |
IlexForestCharcoalApprenticeScript |
EVENT_ILEX_FOREST_APPRENTICE |
ILEXFOREST_BLACK_BELT |
SPRITE_BLACK_BELT |
5 | 28 | STANDING_RIGHT |
OBJECTTYPE_SCRIPT |
IlexForestCharcoalMasterScript |
EVENT_ILEX_FOREST_CHARCOAL_MASTER |
ILEXFOREST_ROCKER |
SPRITE_ROCKER |
15 | 14 | STANDING_RIGHT |
OBJECTTYPE_SCRIPT |
IlexForestHeadbuttGuyScript |
-1 |
ILEXFOREST_POKE_BALL |
SPRITE_POKE_BALL |
20 | 32 | STILL |
OBJECTTYPE_ITEMBALL |
IlexForestRevive (itemball REVIVE) |
EVENT_ILEX_FOREST_REVIVE |
Scripts of interest
IlexForestCharcoalApprenticeScript(object at 7,28):checkevent EVENT_HERDED_FARFETCHDpicks the "please help" text vs the "thanks" text. Pure text, sets nothing.FarfetchdPosition1: no facing check. Talk once and it always runsapplymovement ILEXFOREST_FARFETCHD1, MovementData_Farfetchd_Pos1_Pos2,appear ILEXFOREST_FARFETCHD2,disappear ILEXFOREST_FARFETCHD1.FarfetchdPosition2..9: eachscall FarfetchdCryAndCheckFacing, which doesfaceplayer/ cry /readvar VAR_FACING, thenifequal <DIR>, ...on the player's facing to decide which way the bird flees. The forward chain is the fall-through branch of each; the listedifequaldirections send it backwards. Concretely (fall-through = progress):- Pos2 -> Pos3, except facing
DOWN-> Pos8 - Pos3 -> Pos4, except
LEFT-> Pos2 - Pos4 -> Pos5, except
UP-> Pos3 - Pos5 -> Pos6, except
LEFT-> Pos7,UP/RIGHT-> Pos4 - Pos6 -> Pos7, except
RIGHT-> Pos5 - Pos7 -> Pos8, except
LEFT-> Pos6,DOWN-> Pos5 - Pos8 -> Pos9, except
RIGHT-> Pos7,UP/LEFT-> Pos2 - Pos9 -> Pos10 (terminal), except
RIGHT/DOWN-> Pos8
- Pos2 -> Pos3, except facing
FarfetchdPosition9fall-through additionally runsappear 13 ; ILEXFOREST_BLACK_BELT,setevent EVENT_CHARCOAL_KILN_BOSS,setevent EVENT_HERDED_FARFETCHD. Thatappear 13is a raw object index, not the const - worth mirroring exactly in a port.IlexForestCharcoalMasterScript(object at 5,28):checkevent EVENT_GOT_HM01_CUT, elseverbosegiveitem HM_CUT,setevent EVENT_GOT_HM01_CUT, thensetevent EVENT_ILEX_FOREST_FARFETCHD_10,setevent EVENT_ILEX_FOREST_APPRENTICE,setevent EVENT_ILEX_FOREST_CHARCOAL_MASTER,clearevent EVENT_CHARCOAL_KILN_FARFETCH_D,clearevent EVENT_CHARCOAL_KILN_APPRENTICE,clearevent EVENT_CHARCOAL_KILN_BOSS- i.e. the trio moves back to the Charcoal Kiln in Azalea. Note this script has noiffalsebag-full guard aroundverbosegiveitem HM_CUT.IlexForestHeadbuttGuyScript(object at 15,14):checkevent EVENT_GOT_TM02_HEADBUTT, elseverbosegiveitem TM_HEADBUTT,iffalse .BagFull,setevent EVENT_GOT_TM02_HEADBUTT.
Flags and events
| constant | defined in | read/written by | meaning for a bot |
|---|---|---|---|
EVENT_ILEX_FOREST_FARFETCHD_1.._10 |
constants/event_flags.asm (_10 at :1172) |
spawn flags on the ten bird objects; moved by the chase scripts | exactly one is set at a time |
EVENT_HERDED_FARFETCHD |
constants/event_flags.asm:50 |
set by FarfetchdPosition9 fall-through |
chase complete |
EVENT_CHARCOAL_KILN_BOSS |
constants/event_flags.asm:1177 |
set by FarfetchdPosition9, cleared by IlexForestCharcoalMasterScript |
kiln boss spawn |
EVENT_ILEX_FOREST_APPRENTICE |
constants/event_flags.asm:1173 |
cleared by SlowpokeWellB1F, set by the master script |
apprentice spawn (inverted: set = hidden here) |
EVENT_ILEX_FOREST_CHARCOAL_MASTER |
constants/event_flags.asm:1174 |
set by the master script | master spawn |
EVENT_GOT_HM01_CUT |
constants/event_flags.asm:23 |
IlexForestCharcoalMasterScript |
one-shot HM01 |
EVENT_GOT_TM02_HEADBUTT |
constants/event_flags.asm:104 |
IlexForestHeadbuttGuyScript; also read by maps/GoldenrodDeptStore5F.asm |
one-shot TM02 and a Dept 5F stock switch |
EVENT_ILEX_FOREST_REVIVE |
constants/event_flags.asm:1042 |
item ball | one-shot |
EVENT_ILEX_FOREST_HIDDEN_ETHER / _SUPER_POTION / _FULL_HEAL |
constants/event_flags.asm:146-148 |
hidden items | one-shot |
Items
| item | how obtained | source (label / bg_event / hidden) | one-time flag |
|---|---|---|---|
HM_CUT (HM01) |
talk to charcoal master at (5,28) after herding | IlexForestCharcoalMasterScript |
EVENT_GOT_HM01_CUT |
TM_HEADBUTT (TM02) |
talk to rocker at (15,14) | IlexForestHeadbuttGuyScript |
EVENT_GOT_TM02_HEADBUTT |
REVIVE |
item ball at (20,32) | IlexForestRevive |
EVENT_ILEX_FOREST_REVIVE |
ETHER |
hidden at (27,1) | IlexForestHiddenEther |
EVENT_ILEX_FOREST_HIDDEN_ETHER |
SUPER_POTION |
hidden at (17,7) | IlexForestHiddenSuperPotion |
EVENT_ILEX_FOREST_HIDDEN_SUPER_POTION |
FULL_HEAL |
hidden at (9,17) | IlexForestHiddenFullHeal |
EVENT_ILEX_FOREST_HIDDEN_FULL_HEAL |
Trainers: none. def_object_events has no OBJECTTYPE_TRAINER row.
Wild encounters
data/wild/johto_grass.asm, def_grass_wildmons ILEX_FOREST, rates
4 percent morn/day/nite:
| slot | morn (Gold) | day (Gold) | nite (both) |
|---|---|---|---|
| 1 | L5 Caterpie | L5 Caterpie | L5 Oddish |
| 2 | L6 Metapod | L6 Caterpie | L6 Oddish |
| 3 | L6 Caterpie | L5 Metapod | L6 Zubat |
| 4 | L5 Paras | L6 Metapod | L5 Paras |
| 5 | L5 Zubat | L5 Zubat | L5 Zubat |
| 6 | L6 Paras | L6 Paras | L6 Paras |
| 7 | L6 Paras | L6 Paras | L6 Paras |
Silver swaps Caterpie/Metapod for Weedle/Kakuna in the morn and day blocks
(the ELIF DEF(_SILVER) arm). The nite block is shared.
Water (data/wild/johto_water.asm:51, def_water_wildmons ILEX_FOREST,
2 percent): L15 Psyduck, L10 Psyduck, L15 Golduck.
Headbutt: data/wild/treemon_maps.asm:40 -> treemon_map ILEX_FOREST, TREEMON_SET_FOREST.
TreeMonSet_Forest (Gold) common: 50% Caterpie, 15% Caterpie, 15% Metapod,
10% Exeggcute, 5% Exeggcute, 5% Butterfree - all level 10; rare swaps the two
15% slots for Pineco.
The Cut tree
data/collision/field_move_blocks.asm .forest lists exactly one cuttable
block for TILESET_FOREST: db $0f, $17, 0 (facing block $0f, replacement
$17, animation 0). Scanning maps/IlexForest.blk (15 wide) for $0f finds a
single occurrence, block (4,12), i.e. map coordinates x 8-9, y 24-25. That
is the tree between the Farfetch'd/charcoal area in the south and the shrine
bg_event at (8,22) / the north half of the forest, and it is the only thing
standing between the player and warp 1 at (1,5).
MAP_ROUTE_34_ILEX_FOREST_GATE
- Script:
maps/Route34IlexForestGate.asm - Blocks: none
- Header:
data/maps/maps.asm:288->TILESET_GATE, GATE, LANDMARK_ROUTE_34, MUSIC_ROUTE_36, FALSE, PALETTE_DAY, FISHGROUP_SHORE - Dimensions:
constants/map_constants.asm:266->map_const ROUTE_34_ILEX_FOREST_GATE, 5, 4
Warps
| idx | x | y | destination map | dest warp |
|---|---|---|---|---|
| 1 | 4 | 0 | ROUTE_34 |
1 |
| 2 | 5 | 0 | ROUTE_34 |
2 |
| 3 | 4 | 7 | ILEX_FOREST |
1 |
| 4 | 5 | 7 | ILEX_FOREST |
1 |
Coord events: none. BG events: none.
Object events
| const | sprite | x | y | movement | type | script label | event flag |
|---|---|---|---|---|---|---|---|
ROUTE34ILEXFORESTGATE_TEACHER |
SPRITE_TEACHER |
9 | 3 | STANDING_LEFT |
OBJECTTYPE_SCRIPT |
Route34IlexForestGateTeacherScript |
-1 |
ROUTE34ILEXFORESTGATE_BUTTERFREE |
SPRITE_BUTTERFREE |
9 | 4 | POKEMON |
OBJECTTYPE_SCRIPT |
Route34IlexForestGateButterfreeScript |
-1 |
ROUTE34ILEXFORESTGATE_LASS |
SPRITE_LASS |
3 | 4 | WALK_UP_DOWN |
OBJECTTYPE_SCRIPT |
Route34IlexForestGateLassScript |
-1 |
Scripts of interest
Route34IlexForestGateTeacherScript:checkevent EVENT_GOT_TM12_SWEET_SCENT, elseverbosegiveitem TM_SWEET_SCENT,iffalse .NoRoom,setevent EVENT_GOT_TM12_SWEET_SCENT. The walkthrough calls her "the lady behind the counter"; she is at (9,3), the top-right of the gate.
Items
| item | how obtained | source | one-time flag |
|---|---|---|---|
TM_SWEET_SCENT (TM12) |
talk to teacher at (9,3) | Route34IlexForestGateTeacherScript |
EVENT_GOT_TM12_SWEET_SCENT (constants/event_flags.asm:131) |
MAP_ROUTE_34
- Script:
maps/Route34.asm - Blocks:
maps/Route34.blk - Header:
data/maps/maps.asm:268->TILESET_JOHTO_MODERN, ROUTE, LANDMARK_ROUTE_34, MUSIC_ROUTE_36, FALSE, PALETTE_AUTO, FISHGROUP_SHORE - Dimensions:
constants/map_constants.asm:246->map_const ROUTE_34, 10, 27 - Connections (
data/maps/attributes.asm:198): northGoldenrodCity(offset -5), eastAzaleaTown(offset 18)
Warps
| idx | x | y | destination map | dest warp |
|---|---|---|---|---|
| 1 | 13 | 37 | ROUTE_34_ILEX_FOREST_GATE |
1 |
| 2 | 14 | 37 | ROUTE_34_ILEX_FOREST_GATE |
2 |
| 3 | 11 | 14 | DAY_CARE |
1 |
| 4 | 11 | 15 | DAY_CARE |
2 |
| 5 | 13 | 15 | DAY_CARE |
3 |
Coord events: none.
BG events
| x | y | type | script/item |
|---|---|---|---|
| 12 | 6 | BGEVENT_READ |
Route34Sign |
| 13 | 33 | BGEVENT_READ |
Route34TrainerTips |
| 10 | 13 | BGEVENT_READ |
DayCareSign |
| 8 | 32 | BGEVENT_ITEM |
Route34HiddenRareCandy -> hiddenitem RARE_CANDY, EVENT_ROUTE_34_HIDDEN_RARE_CANDY |
| 17 | 19 | BGEVENT_ITEM |
Route34HiddenSuperPotion -> hiddenitem SUPER_POTION, EVENT_ROUTE_34_HIDDEN_SUPER_POTION |
(Route34IlexForestSign exists in the file but is marked ; unreferenced.)
Object events
| const | sprite | x | y | movement | type | sight | script label | event flag |
|---|---|---|---|---|---|---|---|---|
ROUTE34_YOUNGSTER1 |
SPRITE_YOUNGSTER |
13 | 7 | STANDING_LEFT |
OBJECTTYPE_TRAINER |
5 | TrainerCamperTodd1 |
-1 |
ROUTE34_YOUNGSTER2 |
SPRITE_YOUNGSTER |
15 | 33 | SPINRANDOM_FAST |
OBJECTTYPE_TRAINER |
2 | TrainerYoungsterSamuel |
-1 |
ROUTE34_YOUNGSTER3 |
SPRITE_YOUNGSTER |
17 | 22 | STANDING_DOWN |
OBJECTTYPE_TRAINER |
3 | TrainerYoungsterIan |
-1 |
ROUTE34_LASS |
SPRITE_LASS |
10 | 26 | STANDING_RIGHT |
OBJECTTYPE_TRAINER |
3 | TrainerPicnickerGina1 |
-1 |
ROUTE34_OFFICER |
SPRITE_OFFICER |
9 | 11 | STANDING_DOWN |
OBJECTTYPE_SCRIPT |
0 | OfficerKeithScript |
-1 |
ROUTE34_POKEFAN_M |
SPRITE_POKEFAN_M |
19 | 28 | STANDING_LEFT |
OBJECTTYPE_TRAINER |
2 | TrainerPokefanmBrandon |
-1 |
ROUTE34_GRAMPS |
SPRITE_GRAMPS |
15 | 16 | STANDING_DOWN |
OBJECTTYPE_SCRIPT |
0 | DayCareManScript_Outside |
EVENT_DAY_CARE_MAN_ON_ROUTE_34 |
ROUTE34_DAY_CARE_MON_1 |
SPRITE_DAY_CARE_MON_1 |
14 | 18 | POKEMON |
OBJECTTYPE_SCRIPT |
0 | DayCareMon1Script |
EVENT_DAY_CARE_MON_1 |
ROUTE34_DAY_CARE_MON_2 |
SPRITE_DAY_CARE_MON_2 |
17 | 19 | POKEMON |
OBJECTTYPE_SCRIPT |
0 | DayCareMon2Script |
EVENT_DAY_CARE_MON_2 |
ROUTE34_COOLTRAINER_F1 |
SPRITE_COOLTRAINER_F |
11 | 48 | STANDING_LEFT |
OBJECTTYPE_TRAINER |
5 | TrainerCooltrainerfIrene |
-1 |
ROUTE34_COOLTRAINER_F2 |
SPRITE_COOLTRAINER_F |
3 | 48 | STANDING_RIGHT |
OBJECTTYPE_TRAINER |
3 | TrainerCooltrainerfJenn |
-1 |
ROUTE34_COOLTRAINER_F3 |
SPRITE_COOLTRAINER_F |
6 | 51 | STANDING_UP |
OBJECTTYPE_TRAINER |
2 | TrainerCooltrainerfKate |
-1 |
The three Cooltrainer F sisters sit at y 48-51, on the beach south-west of the Ilex gate. That area is water-locked; reaching them needs SURF, which needs the FOGBADGE. They are not part of this section's path.
Scripts of interest
Route34EggCheckCallback(MAPCALLBACK_OBJECTS): readsENGINE_DAY_CARE_MAN_HAS_EGGto decide whether the Day-Care man stands outside (EVENT_DAY_CARE_MAN_ON_ROUTE_34) or inside (EVENT_DAY_CARE_MAN_IN_DAY_CARE), then mirrorsENGINE_DAY_CARE_MAN_HAS_MON/ENGINE_DAY_CARE_LADY_HAS_MONontoEVENT_DAY_CARE_MON_1/_2(which are hide flags: set = hidden).DayCareManScript_Outside:special DayCareManOutside(the yes/no egg handoff), thenifequal TRUE, .end_fail,clearflag ENGINE_DAY_CARE_MAN_HAS_EGG, and walks him back inside with one of two movement scripts depending onreadvar VAR_FACING(RIGHTuses the walk-around-player variant).OfficerKeithScript:checktime NITE,iffalse .NoFight. Night only, as the walkthrough says. Wins setEVENT_BEAT_OFFICER_KEITH. It is anOBJECTTYPE_SCRIPT, not atrainerrow, so there is no sight-line trigger: the bot must talk to him.TrainerCamperTodd1/TrainerPicnickerGina1: full phone-number flow (askforphonenumber PHONE_CAMPER_TODD/PHONE_PICNICKER_GINA), with rematch parties gated onENGINE_FLYPOINT_CIANWOOD/ENGINE_FLYPOINT_BLACKTHORN(Todd) andENGINE_FLYPOINT_MAHOGANY/EVENT_CLEARED_RADIO_TOWER(Gina).TrainerYoungsterSamuel,TrainerYoungsterIan,TrainerPokefanmBrandon: plainendifjustbattled+ after-text. No phone number.TrainerCooltrainerfKate:verbosegiveitem SOFT_SAND,setevent EVENT_GOT_SOFT_SAND_FROM_KATE.
Flags and events
| constant | defined in | read/written by | meaning for a bot |
|---|---|---|---|
ENGINE_DAY_CARE_MAN_HAS_EGG |
constants/engine_flags.asm:10 |
Route34EggCheckCallback, DayCareEggCheckCallback, DayCareManScript_Outside |
egg is waiting; man stands outside at (15,16) |
ENGINE_DAY_CARE_MAN_HAS_MON / ENGINE_DAY_CARE_LADY_HAS_MON |
constants/engine_flags.asm:11,13 |
both egg-check callbacks | drives the two overworld Day-Care mon sprites |
EVENT_DAY_CARE_MAN_ON_ROUTE_34 |
constants/event_flags.asm:1160 |
callbacks | outdoor Day-Care man spawn |
EVENT_BEAT_OFFICER_KEITH |
constants/event_flags.asm |
OfficerKeithScript |
one-shot night battle |
EVENT_GOT_SOFT_SAND_FROM_KATE |
constants/event_flags.asm:121 |
TrainerCooltrainerfKate |
one-shot, needs SURF |
EVENT_ROUTE_34_HIDDEN_RARE_CANDY / _SUPER_POTION |
constants/event_flags.asm:177,178 |
hidden items | one-shot |
Items
| item | how obtained | source | one-time flag |
|---|---|---|---|
SOFT_SAND |
beat Cooltrainer F Kate at (6,51) (SURF required) | TrainerCooltrainerfKate |
EVENT_GOT_SOFT_SAND_FROM_KATE |
RARE_CANDY |
hidden at (8,32) | Route34HiddenRareCandy |
EVENT_ROUTE_34_HIDDEN_RARE_CANDY |
SUPER_POTION |
hidden at (17,19) | Route34HiddenSuperPotion |
EVENT_ROUTE_34_HIDDEN_SUPER_POTION |
Trainers
| const | class | id | party (data/trainers/parties.asm) |
script label | rematch/phone |
|---|---|---|---|---|---|
SAMUEL |
YOUNGSTER |
YOUNGSTER (5) | L7 Rattata, L10 Sandshrew, L8 Spearow, L8 Spearow | TrainerYoungsterSamuel |
none |
BRANDON |
POKEFANM |
POKEFANM (7) | L13 Snubbull @ BERRY (TRAINERTYPE_ITEM) |
TrainerPokefanmBrandon |
none |
IAN |
YOUNGSTER |
YOUNGSTER (6) | L10 Mankey, L12 Diglett | TrainerYoungsterIan |
none |
GINA1 |
PICNICKER |
PICNICKER (2) | L9 Hoppip, L9 Hoppip, L12 Bulbasaur | TrainerPicnickerGina1 |
PHONE_PICNICKER_GINA; GINA2/GINA3 rematches |
KEITH |
OFFICER |
OFFICER (1) | L17 Growlithe | OfficerKeithScript |
none; night only |
TODD1 |
CAMPER |
CAMPER (2) | L14 Psyduck | TrainerCamperTodd1 |
PHONE_CAMPER_TODD; TODD2/TODD3 rematches |
IRENE |
COOLTRAINERF |
- | see data/trainers/parties.asm |
TrainerCooltrainerfIrene |
SURF-gated beach |
JENN |
COOLTRAINERF |
- | see data/trainers/parties.asm |
TrainerCooltrainerfJenn |
SURF-gated beach |
KATE |
COOLTRAINERF |
- | see data/trainers/parties.asm |
TrainerCooltrainerfKate |
SURF-gated beach; gives SOFT_SAND |
Wild encounters
data/wild/johto_grass.asm, def_grass_wildmons ROUTE_34, rates
10 percent morn/day/nite; all three time blocks are identical:
L10 Drowzee, L11 Rattata, L12 Drowzee, L10 Abra, L13 Rattata, L10 Ditto, L10 Ditto.
Water (data/wild/johto_water.asm:149, 6 percent): L20 Tentacool,
L15 Tentacool, L20 Tentacruel.
Headbutt: data/wild/treemon_maps.asm:15 -> treemon_map ROUTE_34, TREEMON_SET_FOREST
(same table as Ilex Forest).
MAP_DAY_CARE
- Script:
maps/DayCare.asm - Blocks:
maps/DayCare.blk - Header:
data/maps/maps.asm:289->TILESET_HOUSE, INDOOR, LANDMARK_ROUTE_34, MUSIC_AZALEA_TOWN, FALSE, PALETTE_DAY, FISHGROUP_SHORE - Dimensions:
constants/map_constants.asm:267->map_const DAY_CARE, 5, 4
Warps
| idx | x | y | destination map | dest warp |
|---|---|---|---|---|
| 1 | 0 | 5 | ROUTE_34 |
3 |
| 2 | 0 | 6 | ROUTE_34 |
4 |
| 3 | 2 | 7 | ROUTE_34 |
5 |
| 4 | 3 | 7 | ROUTE_34 |
5 |
Coord events: none.
BG events
| x | y | type | script/item |
|---|---|---|---|
| 0 | 1 | BGEVENT_READ |
DayCareBookshelf |
| 1 | 1 | BGEVENT_READ |
DayCareBookshelf |
Object events
| const | sprite | x | y | movement | type | script label | event flag |
|---|---|---|---|---|---|---|---|
DAYCARE_GRAMPS |
SPRITE_GRAMPS |
2 | 3 | STANDING_RIGHT |
OBJECTTYPE_SCRIPT |
DayCareManScript_Inside |
EVENT_DAY_CARE_MAN_IN_DAY_CARE |
DAYCARE_GRANNY |
SPRITE_GRANNY |
5 | 3 | STANDING_LEFT |
OBJECTTYPE_SCRIPT |
DayCareLadyScript |
-1 |
Scripts of interest
DayCareEggCheckCallback(MAPCALLBACK_OBJECTS): mirror of the Route 34 one; moves the man in/out based onENGINE_DAY_CARE_MAN_HAS_EGG.DayCareManScript_Inside->special DayCareMan;DayCareLadyScript->special DayCareLady, unlessENGINE_DAY_CARE_MAN_HAS_EGGis set, in which case she just says "Gramps was looking for you".
There is no PC object in maps/DayCare.asm. The walkthrough's quoted claim
that "there's a PC in the corner of the Daycare" is not backed by this map.
MAP_GOLDENROD_CITY
- Script:
maps/GoldenrodCity.asm - Blocks:
maps/GoldenrodCity.blk - Header:
data/maps/maps.asm:269->TILESET_JOHTO_MODERN, TOWN, LANDMARK_GOLDENROD_CITY, MUSIC_GOLDENROD_CITY, FALSE, PALETTE_AUTO, FISHGROUP_SHORE - Dimensions:
constants/map_constants.asm:247->map_const GOLDENROD_CITY, 20, 18 - Connections (
data/maps/attributes.asm:139): northRoute35(offset 5), southRoute34(offset 5)
Warps
| idx | x | y | destination map | dest warp |
|---|---|---|---|---|
| 1 | 24 | 7 | GOLDENROD_GYM |
1 |
| 2 | 29 | 29 | GOLDENROD_BIKE_SHOP |
1 |
| 3 | 31 | 21 | GOLDENROD_HAPPINESS_RATER |
1 |
| 4 | 5 | 25 | BILLS_FAMILYS_HOUSE |
1 |
| 5 | 9 | 13 | GOLDENROD_MAGNET_TRAIN_STATION |
2 |
| 6 | 33 | 5 | GOLDENROD_FLOWER_SHOP |
1 |
| 7 | 15 | 27 | GOLDENROD_POKECENTER_1F |
1 |
| 8 | 33 | 9 | GOLDENROD_PP_SPEECH_HOUSE |
1 |
| 9 | 15 | 7 | GOLDENROD_NAME_RATER |
1 |
| 10 | 24 | 27 | GOLDENROD_DEPT_STORE_1F |
1 |
| 11 | 14 | 21 | GOLDENROD_GAME_CORNER |
1 |
| 12 | 5 | 15 | RADIO_TOWER_1F |
1 |
| 13 | 19 | 1 | ROUTE_35_GOLDENROD_GATE |
3 |
| 14 | 9 | 5 | GOLDENROD_UNDERGROUND_SWITCH_ROOM_ENTRANCES |
8 |
| 15 | 11 | 29 | GOLDENROD_UNDERGROUND_SWITCH_ROOM_ENTRANCES |
5 |
Coord events: none.
BG events
| x | y | type | script/item |
|---|---|---|---|
| 10 | 14 | BGEVENT_READ |
GoldenrodCityStationSign |
| 4 | 17 | BGEVENT_READ |
GoldenrodCityRadioTowerSign |
| 26 | 27 | BGEVENT_READ |
GoldenrodDeptStoreSign |
| 26 | 9 | BGEVENT_READ |
GoldenrodGymSign |
| 22 | 18 | BGEVENT_READ |
GoldenrodCitySign |
| 28 | 30 | BGEVENT_READ |
GoldenrodCityBikeShopSign |
| 16 | 22 | BGEVENT_READ |
GoldenrodCityGameCornerSign |
| 12 | 7 | BGEVENT_READ |
GoldenrodCityNameRaterSign |
| 8 | 6 | BGEVENT_READ |
GoldenrodCityUndergroundSignNorth |
| 12 | 30 | BGEVENT_READ |
GoldenrodCityUndergroundSignSouth |
| 16 | 27 | BGEVENT_READ |
GoldenrodCityPokecenterSign |
No hidden items on this map.
Object events
| const | sprite | x | y | movement | type | script label | event flag |
|---|---|---|---|---|---|---|---|
GOLDENRODCITY_POKEFAN_M1 |
SPRITE_POKEFAN_M |
7 | 18 | STANDING_UP |
OBJECTTYPE_SCRIPT |
GoldenrodCityPokefanMScript |
EVENT_GOLDENROD_CITY_CIVILIANS |
GOLDENRODCITY_YOUNGSTER1 |
SPRITE_YOUNGSTER |
30 | 17 | WANDER (1,1) |
OBJECTTYPE_SCRIPT |
GoldenrodCityYoungster1Script |
EVENT_GOLDENROD_CITY_CIVILIANS |
GOLDENRODCITY_COOLTRAINER_F1 |
SPRITE_COOLTRAINER_F |
12 | 16 | STANDING_LEFT |
OBJECTTYPE_SCRIPT |
GoldenrodCityCooltrainerF1Script |
EVENT_GOLDENROD_CITY_CIVILIANS |
GOLDENRODCITY_COOLTRAINER_F2 |
SPRITE_COOLTRAINER_F |
20 | 26 | WANDER (1,2) |
OBJECTTYPE_SCRIPT |
GoldenrodCityCooltrainerF2Script |
EVENT_GOLDENROD_CITY_CIVILIANS |
GOLDENRODCITY_YOUNGSTER2 |
SPRITE_YOUNGSTER |
19 | 17 | WANDER (1,1) |
OBJECTTYPE_SCRIPT |
GoldenrodCityYoungster2Script |
EVENT_GOLDENROD_CITY_CIVILIANS |
GOLDENRODCITY_LASS |
SPRITE_LASS |
17 | 10 | WALK_LEFT_RIGHT (2,0) |
OBJECTTYPE_SCRIPT |
GoldenrodCityLassScript |
EVENT_GOLDENROD_CITY_CIVILIANS |
GOLDENRODCITY_GRAMPS |
SPRITE_GRAMPS |
11 | 27 | WALK_LEFT_RIGHT (1,0) |
OBJECTTYPE_SCRIPT |
GoldenrodCityGrampsScript |
EVENT_GOLDENROD_CITY_CIVILIANS |
GOLDENRODCITY_ROCKETSCOUT |
SPRITE_ROCKET |
4 | 16 | STANDING_UP |
OBJECTTYPE_SCRIPT |
GoldenrodCityRocketScoutScript |
EVENT_GOLDENROD_CITY_ROCKET_SCOUT |
GOLDENRODCITY_ROCKET1 |
SPRITE_ROCKET |
28 | 20 | STANDING_UP |
OBJECTTYPE_SCRIPT |
GoldenrodCityRocket1Script |
EVENT_GOLDENROD_CITY_ROCKET_TAKEOVER |
GOLDENRODCITY_ROCKET2 |
SPRITE_ROCKET |
8 | 15 | STANDING_DOWN |
OBJECTTYPE_SCRIPT |
GoldenrodCityRocket2Script |
EVENT_GOLDENROD_CITY_ROCKET_TAKEOVER |
GOLDENRODCITY_ROCKET3 |
SPRITE_ROCKET |
16 | 23 | STANDING_RIGHT |
OBJECTTYPE_SCRIPT |
GoldenrodCityRocket3Script |
EVENT_RADIO_TOWER_ROCKET_TAKEOVER |
GOLDENRODCITY_ROCKET4 |
SPRITE_ROCKET |
29 | 20 | STANDING_UP |
OBJECTTYPE_SCRIPT |
GoldenrodCityRocket4Script |
EVENT_RADIO_TOWER_ROCKET_TAKEOVER |
GOLDENRODCITY_ROCKET5 |
SPRITE_ROCKET |
29 | 7 | STANDING_DOWN |
OBJECTTYPE_SCRIPT |
GoldenrodCityRocket5Script |
EVENT_RADIO_TOWER_ROCKET_TAKEOVER |
GOLDENRODCITY_ROCKET6 |
SPRITE_ROCKET |
30 | 10 | STANDING_LEFT |
OBJECTTYPE_SCRIPT |
GoldenrodCityRocket6Script |
EVENT_RADIO_TOWER_ROCKET_TAKEOVER |
Scripts of interest
GoldenrodCityFlypointCallback(MAPCALLBACK_NEWMAP):setflag ENGINE_FLYPOINT_GOLDENROD,setflag ENGINE_REACHED_GOLDENROD. Both fire on first entry, no conditions.
Flags and events
| constant | defined in | read/written by | meaning for a bot |
|---|---|---|---|
ENGINE_FLYPOINT_GOLDENROD |
constants/engine_flags.asm:84 |
flypoint callback | Fly unlocked |
ENGINE_REACHED_GOLDENROD |
constants/engine_flags.asm:31 |
flypoint callback | gates the Rocket-takeover storyline elsewhere |
ENGINE_RADIO_CARD |
constants/engine_flags.asm:4 |
set by RadioTower1FRadioCardWomanScript; read by GoldenrodCityCooltrainerF2Script |
Pokegear radio |
EVENT_GOLDENROD_CITY_CIVILIANS |
constants/event_flags.asm |
spawn flag on the seven civilians | cleared during the Rocket takeover |
Trainers: none on the city map at this point in the game.
Wild encounters: none (data/wild/treemon_maps.asm:33 ->
treemon_map GOLDENROD_CITY, TREEMON_SET_NONE; no def_grass_wildmons /
def_water_wildmons entry for GOLDENROD_CITY).
MAP_BILLS_FAMILYS_HOUSE
- Script:
maps/BillsFamilysHouse.asm - Header:
data/maps/maps.asm:273->TILESET_HOUSE, INDOOR, LANDMARK_GOLDENROD_CITY, MUSIC_GOLDENROD_CITY, FALSE, PALETTE_DAY, FISHGROUP_SHORE - Dimensions:
constants/map_constants.asm:251->map_const BILLS_FAMILYS_HOUSE, 4, 4
Warps
| idx | x | y | destination map | dest warp |
|---|---|---|---|---|
| 1 | 2 | 7 | GOLDENROD_CITY |
4 |
| 2 | 3 | 7 | GOLDENROD_CITY |
4 |
BG events
| x | y | type | script/item |
|---|---|---|---|
| 0 | 1 | BGEVENT_READ |
BillsHouseBookshelf2 |
| 1 | 1 | BGEVENT_READ |
BillsHouseBookshelf1 |
| 7 | 1 | BGEVENT_READ |
BillsHouseRadio |
Object events
| const | sprite | x | y | movement | type | script label | event flag |
|---|---|---|---|---|---|---|---|
BILLSFAMILYSHOUSE_BILL |
SPRITE_BILL |
2 | 3 | STANDING_RIGHT |
OBJECTTYPE_SCRIPT |
BillScript |
EVENT_MET_BILL |
BILLSFAMILYSHOUSE_POKEFAN_F |
SPRITE_POKEFAN_F |
5 | 3 | STANDING_DOWN |
OBJECTTYPE_SCRIPT |
BillsMomScript |
-1 |
BILLSFAMILYSHOUSE_TWIN |
SPRITE_TWIN |
5 | 4 | WANDER (1,1) |
OBJECTTYPE_SCRIPT |
BillsYoungerSisterScript |
-1 |
Scripts of interest
BillsYoungerSisterScript(the twin at 5,4 - the girl "closer to the door"):checkcellnum PHONE_BILL, elseaskforphonenumber PHONE_BILL/addcellnum PHONE_BILL. This is the only thing available in this section.BillScript: givesEEVEEat level 20 viagivepoke EEVEE, 20+setevent EVENT_GOT_EEVEE, guarded byreadvar VAR_PARTYCOUNT/ifequal PARTY_LENGTH, .NoRoom. Bill's object only spawns onceEVENT_MET_BILLis set, which happens in Ecruteak - not in this section.BillsMomScriptreadsEVENT_MET_BILLtoo (note the two texts are wired backwards relative to their names in the asm:iffalse .HaventMetBillprintsBillsMomText_AfterEcruteak).
MAP_GOLDENROD_UNDERGROUND_SWITCH_ROOM_ENTRANCES
- Script:
maps/GoldenrodUndergroundSwitchRoomEntrances.asm - Blocks:
maps/GoldenrodUndergroundSwitchRoomEntrances.blk - Header:
data/maps/maps.asm:124->TILESET_ELITE_FOUR_ROOM, DUNGEON, LANDMARK_GOLDENROD_CITY, MUSIC_UNION_CAVE, TRUE, PALETTE_DAY, FISHGROUP_SHORE - Dimensions:
constants/map_constants.asm:111->map_const GOLDENROD_UNDERGROUND_SWITCH_ROOM_ENTRANCES, 15, 18
Warps
| idx | x | y | destination map | dest warp |
|---|---|---|---|---|
| 1 | 23 | 3 | GOLDENROD_UNDERGROUND |
6 |
| 2 | 22 | 10 | GOLDENROD_UNDERGROUND_WAREHOUSE |
1 |
| 3 | 23 | 10 | GOLDENROD_UNDERGROUND_WAREHOUSE |
2 |
| 4 | 5 | 25 | GOLDENROD_UNDERGROUND |
2 |
| 5 | 4 | 29 | GOLDENROD_CITY |
15 |
| 6 | 5 | 29 | GOLDENROD_CITY |
15 |
| 7 | 21 | 25 | GOLDENROD_UNDERGROUND |
1 |
| 8 | 20 | 29 | GOLDENROD_CITY |
14 |
| 9 | 21 | 29 | GOLDENROD_CITY |
14 |
Coord events
| scene | x | y | script label | effect |
|---|---|---|---|---|
SCENE_GOLDENRODUNDERGROUNDSWITCHROOMENTRANCES_RIVAL_BATTLE |
19 | 4 | UndergroundRivalScene1 |
later-game rival battle, not armed in this section |
SCENE_GOLDENRODUNDERGROUNDSWITCHROOMENTRANCES_RIVAL_BATTLE |
19 | 5 | UndergroundRivalScene2 |
same |
BG events
| x | y | type | script/item |
|---|---|---|---|
| 16 | 1 | BGEVENT_READ |
Switch1Script |
| 10 | 1 | BGEVENT_READ |
Switch2Script |
| 2 | 1 | BGEVENT_READ |
Switch3Script |
| 20 | 11 | BGEVENT_READ |
EmergencySwitchScript |
| 8 | 9 | BGEVENT_ITEM |
GoldenrodUndergroundSwitchRoomEntrancesHiddenMaxPotion |
| 1 | 8 | BGEVENT_ITEM |
GoldenrodUndergroundSwitchRoomEntrancesHiddenRevive |
Object events (all the Rocket/Burglar rows are gated on
EVENT_RADIO_TOWER_ROCKET_TAKEOVER, so during this section only the two
stairwell NPCs and the two item balls exist)
| const | sprite | x | y | movement | type | script label | event flag |
|---|---|---|---|---|---|---|---|
..._TEACHER |
SPRITE_TEACHER |
3 | 27 | STANDING_DOWN |
OBJECTTYPE_SCRIPT |
GoldenrodUndergroundSwitchRoomEntrancesTeacherScript |
-1 |
..._SUPER_NERD |
SPRITE_SUPER_NERD |
19 | 27 | STANDING_DOWN |
OBJECTTYPE_SCRIPT |
GoldenrodUndergroundSwitchRoomEntrancesSuperNerdScript |
-1 |
..._POKE_BALL1 |
SPRITE_POKE_BALL |
1 | 12 | STILL |
OBJECTTYPE_ITEMBALL |
..._SmokeBall |
EVENT_GOLDENROD_UNDERGROUND_SWITCH_ROOM_ENTRANCES_SMOKE_BALL |
..._POKE_BALL2 |
SPRITE_POKE_BALL |
14 | 9 | STILL |
OBJECTTYPE_ITEMBALL |
..._FullHeal |
EVENT_GOLDENROD_UNDERGROUND_SWITCH_ROOM_ENTRANCES_FULL_HEAL |
..._PHARMACIST1/2, ..._ROCKET1/2/3, ..._ROCKET_GIRL |
- | (9,12) (4,8) (17,2) (11,2) (3,2) (19,12) | - | OBJECTTYPE_TRAINER |
TrainerBurglarDuncan, TrainerBurglarEddie, TrainerGruntM13, TrainerGruntM11, TrainerGruntM25, TrainerGruntF3 |
EVENT_RADIO_TOWER_ROCKET_TAKEOVER |
|
..._RIVAL |
SPRITE_RIVAL |
23 | 3 | STANDING_DOWN |
OBJECTTYPE_SCRIPT |
ObjectEvent |
EVENT_RIVAL_GOLDENROD_UNDERGROUND |
The three ugdoor switch puzzles and the warehouse are also takeover-era
content. This section only walks through: city warp 15 -> (4,29), north to
warp 4 at (5,25) -> GOLDENROD_UNDERGROUND; and back up on the other side via
warp 7 at (21,25) -> warps 8/9 at (20/21,29) -> city warp 14 at (9,5).
MAP_GOLDENROD_UNDERGROUND
- Script:
maps/GoldenrodUnderground.asm - Blocks:
maps/GoldenrodUnderground.blk - Header:
data/maps/maps.asm:123->TILESET_GATE, DUNGEON, LANDMARK_GOLDENROD_CITY, MUSIC_UNION_CAVE, TRUE, PALETTE_DAY, FISHGROUP_SHORE - Dimensions:
constants/map_constants.asm:110->map_const GOLDENROD_UNDERGROUND, 15, 18
Warps
| idx | x | y | destination map | dest warp |
|---|---|---|---|---|
| 1 | 3 | 2 | GOLDENROD_UNDERGROUND_SWITCH_ROOM_ENTRANCES |
7 |
| 2 | 3 | 34 | GOLDENROD_UNDERGROUND_SWITCH_ROOM_ENTRANCES |
4 |
| 3 | 18 | 6 | GOLDENROD_UNDERGROUND |
4 |
| 4 | 21 | 31 | GOLDENROD_UNDERGROUND |
3 |
| 5 | 22 | 31 | GOLDENROD_UNDERGROUND |
3 |
| 6 | 22 | 27 | GOLDENROD_UNDERGROUND_SWITCH_ROOM_ENTRANCES |
1 |
Warp 3 at (18,6) is the basement door; it is blocked until BASEMENT_KEY.
Coord events: none.
BG events
| x | y | type | script/item |
|---|---|---|---|
| 18 | 6 | BGEVENT_READ |
BasementDoorScript |
| 19 | 6 | BGEVENT_READ |
GoldenrodUndergroundNoEntrySign |
| 6 | 13 | BGEVENT_ITEM |
GoldenrodUndergroundHiddenParlyzHeal (PARLYZ_HEAL, EVENT_GOLDENROD_UNDERGROUND_HIDDEN_PARLYZ_HEAL) |
| 4 | 18 | BGEVENT_ITEM |
GoldenrodUndergroundHiddenSuperPotion (SUPER_POTION, EVENT_GOLDENROD_UNDERGROUND_HIDDEN_SUPER_POTION) |
| 17 | 8 | BGEVENT_ITEM |
GoldenrodUndergroundHiddenAntidote (ANTIDOTE, EVENT_GOLDENROD_UNDERGROUND_HIDDEN_ANTIDOTE) |
Object events
| const | sprite | x | y | movement | type | sight | script label | event flag |
|---|---|---|---|---|---|---|---|---|
GOLDENRODUNDERGROUND_SUPER_NERD1 |
SPRITE_SUPER_NERD |
5 | 31 | STANDING_LEFT |
OBJECTTYPE_TRAINER |
3 | TrainerSupernerdEric |
-1 |
GOLDENRODUNDERGROUND_SUPER_NERD2 |
SPRITE_SUPER_NERD |
6 | 9 | STANDING_UP |
OBJECTTYPE_TRAINER |
2 | TrainerSupernerdTeru |
-1 |
GOLDENRODUNDERGROUND_SUPER_NERD3 |
SPRITE_SUPER_NERD |
3 | 27 | SPINRANDOM_FAST |
OBJECTTYPE_TRAINER |
2 | TrainerPokemaniacIssac |
-1 |
GOLDENRODUNDERGROUND_SUPER_NERD4 |
SPRITE_SUPER_NERD |
2 | 6 | STANDING_RIGHT |
OBJECTTYPE_TRAINER |
3 | TrainerPokemaniacDonald |
-1 |
GOLDENRODUNDERGROUND_POKE_BALL |
SPRITE_POKE_BALL |
7 | 25 | STILL |
OBJECTTYPE_ITEMBALL |
0 | GoldenrodUndergroundCoinCase (itemball COIN_CASE) |
EVENT_GOLDENROD_UNDERGROUND_COIN_CASE |
GOLDENRODUNDERGROUND_GRAMPS |
SPRITE_GRAMPS |
7 | 11 | STANDING_LEFT |
OBJECTTYPE_SCRIPT |
0 | BargainMerchantScript |
EVENT_GOLDENROD_UNDERGROUND_GRAMPS |
GOLDENRODUNDERGROUND_OLDER_HAIRCUT_BROTHER |
SPRITE_SUPER_NERD |
7 | 14 | STANDING_LEFT |
OBJECTTYPE_SCRIPT |
0 | OlderHaircutBrotherScript |
EVENT_GOLDENROD_UNDERGROUND_OLDER_HAIRCUT_BROTHER |
GOLDENRODUNDERGROUND_YOUNGER_HAIRCUT_BROTHER |
SPRITE_SUPER_NERD |
7 | 15 | STANDING_LEFT |
OBJECTTYPE_SCRIPT |
0 | YoungerHaircutBrotherScript |
EVENT_GOLDENROD_UNDERGROUND_YOUNGER_HAIRCUT_BROTHER |
GOLDENRODUNDERGROUND_GRANNY |
SPRITE_GRANNY |
7 | 21 | STANDING_LEFT |
OBJECTTYPE_SCRIPT |
0 | BitterMerchantScript |
EVENT_GOLDENROD_UNDERGROUND_GRANNY |
Scripts of interest
GoldenrodUndergroundResetSwitchesCallback(MAPCALLBACK_NEWMAP): clearsEVENT_SWITCH_1..3,EVENT_EMERGENCY_SWITCH,EVENT_DOOR_1_OPEN.._11_OPENand zeroeswUndergroundSwitchPositions. Runs every entry.GoldenrodUndergroundCheckBasementKeyCallback(MAPCALLBACK_TILES): unlessEVENT_USED_BASEMENT_KEY,changeblock 18, 6, $3d(locked door). This is the "door is locked" the walkthrough hits.BasementDoorScript(bg at 18,6):checkitem BASEMENT_KEY->changeblock 18, 6, $2e,refreshmap,setevent EVENT_USED_BASEMENT_KEY. TheBASEMENT_KEYis not obtainable in this section.GoldenrodUndergroundCheckDayOfWeekCallback(MAPCALLBACK_OBJECTS): the weekday schedule for the four shop NPCs - Sunday: younger barber + granny; Monday morn: gramps (bargain merchant); Tue/Thu: older barber; Wed/Fri: younger barber; Sat: older barber + granny.BargainMerchantScript: MondayMORNonly, and only whileENGINE_GOLDENROD_UNDERGROUND_MERCHANT_CLOSEDis clear ->pokemart MARTTYPE_BARGAIN, 0.BitterMerchantScript: Saturday or Sunday ->pokemart MARTTYPE_BITTER, MART_UNDERGROUND.OlderHaircutBrotherScript/YoungerHaircutBrotherScript: 500 / 300 money, one per day viaENGINE_GOLDENROD_UNDERGROUND_GOT_HAIRCUT,special OlderHaircutBrother/YoungerHaircutBrother.
Items
| item | how obtained | source | one-time flag |
|---|---|---|---|
COIN_CASE |
item ball at (7,25) | GoldenrodUndergroundCoinCase |
EVENT_GOLDENROD_UNDERGROUND_COIN_CASE (constants/event_flags.asm:1043) |
PARLYZ_HEAL |
hidden at (6,13) | GoldenrodUndergroundHiddenParlyzHeal |
EVENT_GOLDENROD_UNDERGROUND_HIDDEN_PARLYZ_HEAL |
SUPER_POTION |
hidden at (4,18) | GoldenrodUndergroundHiddenSuperPotion |
EVENT_GOLDENROD_UNDERGROUND_HIDDEN_SUPER_POTION |
ANTIDOTE |
hidden at (17,8) | GoldenrodUndergroundHiddenAntidote |
EVENT_GOLDENROD_UNDERGROUND_HIDDEN_ANTIDOTE |
Trainers
| const | class | id | party (data/trainers/parties.asm) |
script label | rematch/phone |
|---|---|---|---|---|---|
ERIC |
SUPER_NERD |
SUPER_NERD (2) | L11 Grimer, L11 Grimer | TrainerSupernerdEric |
none |
ISSAC |
POKEMANIAC |
POKEMANIAC (11) | L12 Lickitung (Lick, Supersonic, Cut) TRAINERTYPE_MOVES |
TrainerPokemaniacIssac |
none |
TERU |
SUPER_NERD |
SUPER_NERD (10) | L7 Magnemite, L11 Voltorb, L7 Magnemite, L9 Magnemite | TrainerSupernerdTeru |
none |
DONALD |
POKEMANIAC |
POKEMANIAC (12) | L10 Slowpoke, L10 Slowpoke | TrainerPokemaniacDonald |
none |
The walkthrough spells the Pokemaniac "Isaac"; the asm constant and party name
are ISSAC (two S). Its event flag is EVENT_BEAT_POKEMANIAC_ISSAC.
Wild encounters: none.
MAP_GOLDENROD_BIKE_SHOP
- Script:
maps/GoldenrodBikeShop.asm - Header:
data/maps/maps.asm:271->TILESET_CHAMPIONS_ROOM, INDOOR, LANDMARK_GOLDENROD_CITY, MUSIC_GOLDENROD_CITY, FALSE, PALETTE_DAY, FISHGROUP_SHORE - Dimensions:
constants/map_constants.asm:249->map_const GOLDENROD_BIKE_SHOP, 4, 4
Warps
| idx | x | y | destination map | dest warp |
|---|---|---|---|---|
| 1 | 2 | 7 | GOLDENROD_CITY |
2 |
| 2 | 3 | 7 | GOLDENROD_CITY |
2 |
BG events: nine GoldenrodBikeShopBicycle display signs at
(1,2), (0,3), (1,3), (0,5), (1,5), (0,6), (1,6), (6,6), (7,6).
Object events
| const | sprite | x | y | movement | type | script label | event flag |
|---|---|---|---|---|---|---|---|
GOLDENRODBIKESHOP_CLERK |
SPRITE_CLERK |
7 | 2 | STANDING_LEFT |
OBJECTTYPE_SCRIPT |
GoldenrodBikeShopClerkScript |
-1 |
Scripts of interest
GoldenrodBikeShopClerkScript:checkevent EVENT_GOT_BICYCLE, else intro text +yesorno,giveitem BICYCLE,itemnotify,setflag ENGINE_BIKE_SHOP_CALL_ENABLED,setevent EVENT_GOT_BICYCLE. No badge, money or item prerequisite. Note it is a plaingiveitem, notverbosegiveitem, and there is no bag-full branch.
Items
| item | how obtained | source | one-time flag |
|---|---|---|---|
BICYCLE |
say YES to the clerk at (7,2) | GoldenrodBikeShopClerkScript |
EVENT_GOT_BICYCLE (constants/event_flags.asm:100) |
MAP_RADIO_TOWER_1F
- Script:
maps/RadioTower1F.asm - Blocks:
maps/RadioTower1F.blk - Header:
data/maps/maps.asm:95->TILESET_RADIO_TOWER, INDOOR, LANDMARK_RADIO_TOWER, RADIO_TOWER_MUSIC | MUSIC_GOLDENROD_CITY, TRUE, PALETTE_DAY, FISHGROUP_SHORE - Dimensions:
constants/map_constants.asm:82->map_const RADIO_TOWER_1F, 9, 4
Warps
| idx | x | y | destination map | dest warp |
|---|---|---|---|---|
| 1 | 2 | 7 | GOLDENROD_CITY |
12 |
| 2 | 3 | 7 | GOLDENROD_CITY |
12 |
| 3 | 15 | 0 | RADIO_TOWER_2F |
2 |
Coord events: none.
BG events
| x | y | type | script/item |
|---|---|---|---|
| 3 | 0 | BGEVENT_READ |
RadioTower1FDirectory |
| 13 | 0 | BGEVENT_READ |
RadioTower1FLuckyChannelSign |
Object events
| const | sprite | x | y | movement | type | script label | event flag |
|---|---|---|---|---|---|---|---|
..._RECEPTIONIST |
SPRITE_RECEPTIONIST |
5 | 6 | STANDING_LEFT |
OBJECTTYPE_SCRIPT |
RadioTower1FReceptionistScript |
-1 |
..._LASS |
SPRITE_LASS |
16 | 4 | STANDING_LEFT |
OBJECTTYPE_SCRIPT |
RadioTower1FLassScript |
EVENT_GOLDENROD_CITY_CIVILIANS |
..._YOUNGSTER |
SPRITE_YOUNGSTER |
15 | 4 | STANDING_RIGHT |
OBJECTTYPE_SCRIPT |
RadioTower1FYoungsterScript |
EVENT_GOLDENROD_CITY_CIVILIANS |
..._ROCKET |
SPRITE_ROCKET |
14 | 1 | STANDING_DOWN |
OBJECTTYPE_TRAINER (sight 3) |
TrainerGruntM3 |
EVENT_RADIO_TOWER_ROCKET_TAKEOVER |
..._GENTLEMAN |
SPRITE_GENTLEMAN |
8 | 6 | STANDING_UP |
OBJECTTYPE_SCRIPT |
RadioTower1FLuckyNumberManScript |
EVENT_GOLDENROD_CITY_CIVILIANS |
..._COOLTRAINER_F |
SPRITE_COOLTRAINER_F |
12 | 6 | STANDING_UP |
OBJECTTYPE_SCRIPT |
RadioTower1FRadioCardWomanScript |
EVENT_GOLDENROD_CITY_CIVILIANS |
Scripts of interest
RadioTower1FRadioCardWomanScript (object at 12,6 - the woman on the right):
checkflag ENGINE_RADIO_CARD short-circuits. Otherwise a five-question
yesorno chain; a wrong answer jumps to .WrongAnswer and the whole quiz
restarts on the next talk. Required answers, straight off the iffalse/iftrue
branches:
| # | question text label | required answer | branch |
|---|---|---|---|
| 1 | RadioTower1FRadioCardWomanQuestion1Text (Town Map on Pokegear?) |
YES | iffalse .WrongAnswer |
| 2 | ...Question2Text (Nidorina female only?) |
YES | iffalse .WrongAnswer |
| 3 | ...Question3Text (Kurt uses Apricorn?) |
NO | iftrue .WrongAnswer |
| 4 | ...Question4Text (Magikarp learns no TM?) |
YES | iffalse .WrongAnswer |
| 5 | ...Question5Text (is MARIE the co-host?) |
NO | iftrue .WrongAnswer |
On success: getstring STRING_BUFFER_4, .RadioCardText ("RADIO CARD@"),
scall .ReceiveItem (jumpstd ReceiveItemScript), then
setflag ENGINE_RADIO_CARD. The Radio Card is a Pokegear card flag, not a bag
item.
Items
| item | how obtained | source | one-time flag |
|---|---|---|---|
| Radio Card (Pokegear card) | pass the five-question quiz | RadioTower1FRadioCardWomanScript |
ENGINE_RADIO_CARD (constants/engine_flags.asm:4) |
MAP_GOLDENROD_GYM
- Script:
maps/GoldenrodGym.asm - Blocks:
maps/GoldenrodGym.blk - Header:
data/maps/maps.asm:270->TILESET_ELITE_FOUR_ROOM, INDOOR, LANDMARK_GOLDENROD_CITY, MUSIC_GYM, TRUE, PALETTE_DAY, FISHGROUP_SHORE - Dimensions:
constants/map_constants.asm:248->map_const GOLDENROD_GYM, 10, 9
Warps
| idx | x | y | destination map | dest warp |
|---|---|---|---|---|
| 1 | 2 | 17 | GOLDENROD_CITY |
1 |
| 2 | 3 | 17 | GOLDENROD_CITY |
1 |
Coord events
| scene | x | y | script label | effect |
|---|---|---|---|---|
SCENE_GOLDENRODGYM_WHITNEY_STOPS_CRYING |
8 | 5 | WhitneyCriesScript |
Bridget walks over, clearevent EVENT_MADE_WHITNEY_CRY, setscene SCENE_GOLDENRODGYM_NOOP |
BG events
| x | y | type | script/item |
|---|---|---|---|
| 1 | 15 | BGEVENT_READ |
GoldenrodGymStatue |
| 4 | 15 | BGEVENT_READ |
GoldenrodGymStatue |
Object events
| const | sprite | x | y | movement | type | sight | script label | event flag |
|---|---|---|---|---|---|---|---|---|
GOLDENRODGYM_WHITNEY |
SPRITE_WHITNEY |
8 | 3 | STANDING_DOWN |
OBJECTTYPE_SCRIPT |
0 | GoldenrodGymWhitneyScript |
-1 |
GOLDENRODGYM_LASS1 |
SPRITE_LASS |
9 | 13 | STANDING_RIGHT |
OBJECTTYPE_TRAINER |
4 | TrainerLassCarrie |
-1 |
GOLDENRODGYM_LASS2 |
SPRITE_LASS |
9 | 6 | STANDING_LEFT |
OBJECTTYPE_TRAINER |
1 | TrainerLassBridget |
-1 |
GOLDENRODGYM_BEAUTY1 |
SPRITE_BEAUTY |
0 | 2 | STANDING_DOWN |
OBJECTTYPE_TRAINER |
3 | TrainerBeautyVictoria |
-1 |
GOLDENRODGYM_BEAUTY2 |
SPRITE_BEAUTY |
19 | 5 | STANDING_DOWN |
OBJECTTYPE_TRAINER |
3 | TrainerBeautySamantha |
-1 |
GOLDENRODGYM_GYM_GUIDE |
SPRITE_GYM_GUIDE |
5 | 15 | STANDING_DOWN |
OBJECTTYPE_SCRIPT |
0 | GoldenrodGymGuideScript |
-1 |
Scripts of interest
GoldenrodGymWhitneyScript is a three-visit script; a bot must run it in order:
- First talk (
EVENT_BEAT_WHITNEYclear): before-text,winlosstext WhitneyShouldntBeSoSeriousText, 0,loadtrainer WHITNEY, WHITNEY1,startbattle,reloadmapafterbattle. On win it setsEVENT_BEAT_WHITNEY,EVENT_MADE_WHITNEY_CRY,setscene SCENE_GOLDENRODGYM_WHITNEY_STOPS_CRYING, and marks all four gym trainers beaten (EVENT_BEAT_BEAUTY_VICTORIA,EVENT_BEAT_BEAUTY_SAMANTHA,EVENT_BEAT_LASS_CARRIE,EVENT_BEAT_LASS_BRIDGET). - Falls into
.FightDoneimmediately:checkevent EVENT_MADE_WHITNEY_CRYiffalse .StoppedCrying. While the flag is set, Whitney only printsWhitneyYouMeanieTextand gives nothing. - Stepping on the coord event at (8,5) runs
WhitneyCriesScript, whichclearevent EVENT_MADE_WHITNEY_CRYandsetscene SCENE_GOLDENRODGYM_NOOP. Talk to Whitney again ->.StoppedCrying:setflag ENGINE_PLAINBADGE,readvar VAR_BADGES,scall GoldenrodGymActivateRockets, thenverbosegiveitem TM_ATTRACTguarded byiffalse .NoRoomForAttractandsetevent EVENT_GOT_TM45_ATTRACT.
GoldenrodGymActivateRockets: ifequal 7, .RadioTowerRockets,
ifequal 6, .GoldenrodRockets on the post-badge count. With PLAINBADGE as the
third badge neither branch fires here.
GoldenrodGymStatue: checkflag ENGINE_PLAINBADGE -> GymStatue2Script with
gettrainername STRING_BUFFER_4, WHITNEY, WHITNEY1, else GymStatue1Script.
Flags and events
| constant | defined in | read/written by | meaning for a bot |
|---|---|---|---|
EVENT_BEAT_WHITNEY |
constants/event_flags.asm:708 |
GoldenrodGymWhitneyScript, GoldenrodGymGuideScript |
battle done |
EVENT_MADE_WHITNEY_CRY |
constants/event_flags.asm:49 |
set by the win, cleared by WhitneyCriesScript |
blocks the badge while set |
SCENE_GOLDENRODGYM_WHITNEY_STOPS_CRYING |
maps/GoldenrodGym.asm:12 |
setscene in the win path, SCENE_GOLDENRODGYM_NOOP after |
arms the (8,5) trip-wire |
ENGINE_PLAINBADGE |
constants/engine_flags.asm:40 |
set in .StoppedCrying; read by StrengthFunction.TryStrength and FlowerShopTeacherScript |
Strength field move + Squirtbottle |
EVENT_GOT_TM45_ATTRACT |
constants/event_flags.asm:17 |
.StoppedCrying |
one-shot TM45 |
Items
| item | how obtained | source | one-time flag |
|---|---|---|---|
| PLAINBADGE | second talk after the cry scene | GoldenrodGymWhitneyScript .StoppedCrying |
ENGINE_PLAINBADGE |
TM_ATTRACT (TM45) |
same conversation | GoldenrodGymWhitneyScript |
EVENT_GOT_TM45_ATTRACT |
Trainers
| const | class | id | party (data/trainers/parties.asm) |
script label | rematch/phone |
|---|---|---|---|---|---|
VICTORIA |
BEAUTY |
BEAUTY (1) | L9 Sentret, L13 Sentret, L17 Sentret | TrainerBeautyVictoria |
none |
SAMANTHA |
BEAUTY |
BEAUTY (2) | L16 Meowth (Scratch, Growl, Bite, Pay Day), L16 Meowth (Scratch, Growl, Bite, Slash) | TrainerBeautySamantha |
none |
CARRIE |
LASS |
LASS (1) | L18 Snubbull (Scary Face, Charm, Bite, Lick) | TrainerLassCarrie |
none |
BRIDGET |
LASS |
LASS (2) | L15 Jigglypuff x3 | TrainerLassBridget |
none |
WHITNEY1 |
WHITNEY |
WHITNEY (1), data/trainers/parties.asm:20 |
L18 Clefairy (DoubleSlap, Mimic, Encore, Metronome), L20 Miltank (Rollout, Attract, Stomp, Milk Drink) | GoldenrodGymWhitneyScript |
none |
Supporting Goldenrod interiors (short form)
GOLDENROD_POKECENTER_1F (maps/GoldenrodPokecenter1F.asm, header
data/maps/maps.asm:276, map_const GOLDENROD_POKECENTER_1F, 5, 4):
warps (3,7)/(4,7) -> city 7, (0,7) -> POKECENTER_2F 1. Nurse at (3,1).
GOLDENROD_DEPT_STORE_1F (maps/GoldenrodDeptStore1F.asm, header
data/maps/maps.asm:279, map_const GOLDENROD_DEPT_STORE_1F, 8, 4):
warps (7,7)/(8,7) -> city 10, (15,0) -> 2F warp 2, (2,0) -> elevator warp 1.
Mart stock (data/items/marts.asm):
| floor | mart const | items |
|---|---|---|
| 2F | MART_GOLDENROD_2F_1 / _2 |
MartGoldenrod2F2: Poke Ball, Great Ball, Escape Rope, Repel, Revive, Full Heal, Poke Doll, Flower Mail (plus the _1 heal list) |
| 3F | MART_GOLDENROD_3F |
X Speed, X Special, X Defend, X Attack, Dire Hit, Guard Spec., X Accuracy |
| 4F | MART_GOLDENROD_4F |
Protein, Iron, Carbos, Calcium, HP Up |
| 5F | MART_GOLDENROD_5F_1..4 |
always TM41 ThunderPunch, TM48 Fire Punch, TM33 Ice Punch; + TM02 Headbutt once EVENT_GOT_TM02_HEADBUTT, + TM08 Rock Smash once EVENT_GOT_TM08_ROCK_SMASH (GoldenrodDeptStore5FClerkScript picks 1/2/3/4) |
| 6F | vending machines | giveitem FRESH_WATER / SODA_POP / LEMONADE (maps/GoldenrodDeptStore6F.asm) |
GoldenrodDeptStore5F also holds:
GoldenrodDeptStore5FCheckIfSundayCallback(MAPCALLBACK_OBJECTS) - the receptionist at (7,5) only appears onSUNDAY.GoldenrodDeptStore5FReceptionistScript: Sunday only, one-shot viaENGINE_GOLDENROD_DEPT_STORE_TM27_RETURN.special GetFirstPokemonHappiness, then>=150->verbosegiveitem TM_RETURN(TM27),>=50-> nothing,<50->verbosegiveitem TM_FRUSTRATION(TM21). That is the walkthrough's "Sunday giveaway of TMs" and where TM21/TM27 come from.Mikeat (6,3): NPC trade row 1 indata/events/npc_trades.asm-npctrade TRADE_DIALOGSET_COLLECTOR, DROWZEE, MACHOP, "MUSCLE", $37, $66, GOLD_BERRY, 37460, "MIKE", TRADE_GENDER_EITHER, i.e. give Drowzee, get Machop. That is the walkthrough's Machop-by-trading.
GOLDENROD_GAME_CORNER (maps/GoldenrodGameCorner.asm, header
data/maps/maps.asm:286, map_const GOLDENROD_GAME_CORNER, 10, 7):
warps (2,13)/(3,13) -> city 11. Prize prices are DEFs at the top of the file:
| prize | coins | const |
|---|---|---|
| Abra (L10) | 200 | GOLDENRODGAMECORNER_ABRA_COINS |
| Ekans (L10) | 700 | GOLDENRODGAMECORNER_EKANS_COINS (Gold; Silver sells Sandshrew at ..._SANDSHREW_COINS, also 700) |
| Dratini (L10) | 2100 | GOLDENRODGAMECORNER_DRATINI_COINS |
| TM25 Thunder | 5500 | GOLDENRODGAMECORNER_TM25_COINS |
| TM14 Blizzard | 5500 | GOLDENRODGAMECORNER_TM14_COINS |
| TM38 Fire Blast | 5500 | GOLDENRODGAMECORNER_TM38_COINS |
Mon prizes check readvar VAR_PARTYCOUNT / ifequal PARTY_LENGTH and run
special GameCornerPrizeMonCheckDex before givepoke.
GOLDENROD_MAGNET_TRAIN_STATION (maps/GoldenrodMagnetTrainStation.asm,
header data/maps/maps.asm:274, map_const GOLDENROD_MAGNET_TRAIN_STATION, 10, 9):
warps (8,17)/(9,17) -> city 5; (6,5)/(11,5) -> SAFFRON_MAGNET_TRAIN_STATION
4/3. Coord event at (11,6) for SCENE_GOLDENRODMAGNETTRAINSTATION_ARRIVE_FROM_SAFFRON.
The conductor is GoldenrodMagnetTrainStationOfficerScript at (9,9).
GOLDENROD_FLOWER_SHOP (maps/GoldenrodFlowerShop.asm, city warp 6 at
(33,5)): FlowerShopTeacherScript gives SQUIRTBOTTLE gated on
checkflag ENGINE_PLAINBADGE + EVENT_GOT_SQUIRTBOTTLE. The walkthrough's
"Squirtwater" is this item, and it becomes available only after Whitney.
3. Blockers and gates
| Gate | Enforced by (file:label) | Requirement | Unlock condition |
|---|---|---|---|
| Azalea rival battle | maps/AzaleaTown.asm def_coord_events (5,10)/(5,11) + SCENE_AZALEATOWN_RIVAL_BATTLE |
scene armed by maps/SlowpokeWellB1F.asm:58 |
clear Slowpoke Well; battle sets EVENT_RIVAL_AZALEA_TOWN and setscene SCENE_AZALEATOWN_NOOP |
| Farfetch'd quest exists at all | maps/SlowpokeWellB1F.asm:60-63 (clearevent EVENT_ILEX_FOREST_FARFETCHD_1, clearevent EVENT_ILEX_FOREST_APPRENTICE) |
EVENT_CLEARED_SLOWPOKE_WELL |
same scene |
| Ilex Forest cut tree | block $0f at Ilex Forest block (4,12) = map (8-9, 24-25); data/collision/field_move_blocks.asm .forest |
a party mon with CUT and ENGINE_HIVEBADGE |
engine/events/overworld.asm CutFunction.CheckAble (ld de, ENGINE_HIVEBADGE / call CheckBadge) and TryCutOW (CheckPartyMove then CheckEngineFlag ENGINE_HIVEBADGE) |
| Getting HM01 in the first place | maps/IlexForest.asm IlexForestCharcoalMasterScript; the master object only spawns after FarfetchdPosition9 runs appear 13 + setevent EVENT_CHARCOAL_KILN_BOSS |
complete the 9-step Farfetch'd herd | EVENT_HERDED_FARFETCHD, then EVENT_GOT_HM01_CUT |
| Whitney's badge | maps/GoldenrodGym.asm GoldenrodGymWhitneyScript .FightDone -> checkevent EVENT_MADE_WHITNEY_CRY iffalse .StoppedCrying |
EVENT_MADE_WHITNEY_CRY must be clear |
step on the coord event at (8,5) to run WhitneyCriesScript |
| Strength field move | engine/events/overworld.asm StrengthFunction.TryStrength (ld de, ENGINE_PLAINBADGE / call CheckBadge) |
PLAINBADGE | beat Whitney and collect the badge |
| Squirtbottle | maps/GoldenrodFlowerShop.asm FlowerShopTeacherScript (checkflag ENGINE_PLAINBADGE / iffalse .Lalala) |
PLAINBADGE | after Whitney; needed for Sudowoodo next section |
Route 34 beach trainers + SOFT_SAND |
water tiles between (3..11, 44..51); SurfFunction.TrySurf needs ENGINE_FOGBADGE |
SURF + FOGBADGE | not reachable in this section |
| Goldenrod Underground basement door | maps/GoldenrodUnderground.asm GoldenrodUndergroundCheckBasementKeyCallback (changeblock 18, 6, $3d) and BasementDoorScript (checkitem BASEMENT_KEY) |
BASEMENT_KEY |
Rocket-takeover arc, not this section |
| Bill / Eevee | maps/BillsFamilysHouse.asm object flag EVENT_MET_BILL on BILLSFAMILYSHOUSE_BILL |
meet Bill in Ecruteak | not this section - only the phone number is available now |
| Game Corner prizes | maps/GoldenrodGameCorner.asm prize vendors + coins |
COIN_CASE |
item ball at Goldenrod Underground (7,25) |
| Underground salon / bargain / bitter shops | GoldenrodUndergroundCheckDayOfWeekCallback + each script's readvar VAR_WEEKDAY |
correct weekday (and MORN for the bargain merchant) |
real-clock dependent |
| Officer Keith battle | maps/Route34.asm OfficerKeithScript checktime NITE |
night | real-clock dependent |
| Fly to Goldenrod | GoldenrodCityFlypointCallback |
none | fires on first map entry |
4. Bot checklist
Each row: map, target, intent, precondition, postcondition.
AZALEA_TOWN- walk to (5,10) or (5,11). Intent: walk (trip-wire). Pre:SCENE_AZALEATOWN_RIVAL_BATTLE. Post: rival battle (RIVAL1, idRIVAL1_2_<not-your-starter>),EVENT_RIVAL_AZALEA_TOWN, scene back toSCENE_AZALEATOWN_NOOP.AZALEA_TOWN- warp 7 at (2,10). Intent: walk. Post:ILEX_FOREST_AZALEA_GATE.ILEX_FOREST_AZALEA_GATE- warp 1 at (0,4). Post:ILEX_FORESTat (3,42).ILEX_FOREST- walk to the apprenticeILEXFOREST_YOUNGSTERat (7,28), talk. Pre:EVENT_ILEX_FOREST_APPRENTICEclear (object visible). Post: none (text only).ILEX_FOREST- talk toILEXFOREST_FARFETCHD1at (14,31). Post: bird moves to (15,25),EVENT_ILEX_FOREST_FARFETCHD_2.ILEX_FOREST- repeat: walk to the current bird, face it from the side the fall-through branch wants, talk. Use the Pos2..Pos9 table in the map section above; the safe rule is "never face the direction listed as a back-branch for that position". Coordinates: Pos2 (15,25), Pos3 (20,24), Pos4 (29,22), Pos5 (28,31), Pos6 (24,35), Pos7 (22,31), Pos8 (15,29), Pos9 (10,35). Post at Pos9 fall-through:EVENT_HERDED_FARFETCHD,EVENT_CHARCOAL_KILN_BOSS, bird at (6,28), master appears at (5,28).ILEX_FOREST- grab the item ball at (20,32). Intent: walk onto / A. Post:REVIVE,EVENT_ILEX_FOREST_REVIVE.ILEX_FOREST- talk toILEXFOREST_BLACK_BELTat (5,28). Pre:EVENT_HERDED_FARFETCHD. Post:HM_CUT,EVENT_GOT_HM01_CUT, apprentice/master/bird despawn here and respawn in the Charcoal Kiln.- Teach
CUTto a party mon (menu). Pre:HM_CUTin bag. ILEX_FOREST- face the tree at map (8,24) (block (4,12)) and press A, or use CUT from the pack. Pre:ENGINE_HIVEBADGE+ party mon with CUT. Post: block replaced with$17, path north opens.ILEX_FOREST- optional: hidden Super Potion at (17,7), hidden Full Heal at (9,17), hidden Ether at (27,1); read the shrine bg at (8,22).ILEX_FOREST- talk toILEXFOREST_ROCKERat (15,14). Post:TM_HEADBUTT,EVENT_GOT_TM02_HEADBUTT.ILEX_FOREST- warp 1 at (1,5). Post:ROUTE_34_ILEX_FOREST_GATEat (4,7).ROUTE_34_ILEX_FOREST_GATE- talk to the teacher at (9,3). Post:TM_SWEET_SCENT,EVENT_GOT_TM12_SWEET_SCENT.ROUTE_34_ILEX_FOREST_GATE- warp 1 at (4,0). Post:ROUTE_34at (13,37).ROUTE_34- Youngster Samuel at (15,33), sight 2 facing random (spinner); battle. Post:EVENT_BEAT_YOUNGSTER_SAMUEL.ROUTE_34- PokeFan M Brandon at (19,28), sight 2 facing LEFT. Post:EVENT_BEAT_POKEFANM_BRANDON.ROUTE_34- Youngster Ian at (17,22), sight 3 facing DOWN. Post:EVENT_BEAT_YOUNGSTER_IAN. (No phone number - see Unresolved.)ROUTE_34- Picnicker Gina at (10,26), sight 3 facing RIGHT. Post:EVENT_BEAT_PICNICKER_GINA; talk again foraskforphonenumber PHONE_PICNICKER_GINA.ROUTE_34- warp 3 at (11,14) intoDAY_CARE; talk to the man at (2,3) and/or the lady at (5,3) to deposit. Post:ENGINE_DAY_CARE_MAN_HAS_MON/ENGINE_DAY_CARE_LADY_HAS_MON.ROUTE_34- after walking, ifENGINE_DAY_CARE_MAN_HAS_EGG, the man stands at (15,16); talk and answer YES. Post: egg in party,ENGINE_DAY_CARE_MAN_HAS_EGGcleared.ROUTE_34- optional night detour: Officer Keith at (9,11), talk. Pre:checktime NITE. Post:EVENT_BEAT_OFFICER_KEITH.ROUTE_34- Camper Todd at (13,7), sight 5 facing LEFT. Post:EVENT_BEAT_CAMPER_TODD; talk again foraskforphonenumber PHONE_CAMPER_TODD.ROUTE_34- walk north off the top of the map. Post:GOLDENROD_CITY(connection offset -5),ENGINE_FLYPOINT_GOLDENROD,ENGINE_REACHED_GOLDENROD.GOLDENROD_CITY- warp 7 at (15,27) to heal.GOLDENROD_CITY- warp 10 at (24,27) for the Dept Store (optional).GOLDENROD_CITY- warp 4 at (5,25) intoBILLS_FAMILYS_HOUSE; talk to the twin at (5,4). Post:PHONE_BILLregistered.GOLDENROD_CITY- warp 15 at (11,29) -> switch-room (4,29); walk north to warp 4 at (5,25) ->GOLDENROD_UNDERGROUNDat (3,34).GOLDENROD_UNDERGROUND- Super Nerd Eric at (5,31) sight 3 facing LEFT. Post:EVENT_BEAT_SUPER_NERD_ERIC.GOLDENROD_UNDERGROUND- Pokemaniac Issac at (3,27), sight 2, spins. Post:EVENT_BEAT_POKEMANIAC_ISSAC.GOLDENROD_UNDERGROUND- item ball at (7,25). Post:COIN_CASE,EVENT_GOLDENROD_UNDERGROUND_COIN_CASE.GOLDENROD_UNDERGROUND- Super Nerd Teru at (6,9), sight 2 facing UP. Post:EVENT_BEAT_SUPER_NERD_TERU.GOLDENROD_UNDERGROUND- Pokemaniac Donald at (2,6), sight 3 facing RIGHT. Post:EVENT_BEAT_POKEMANIAC_DONALD.GOLDENROD_UNDERGROUND- optional: read the basement door bg at (18,6) (locked;BASEMENT_KEYnot available yet). Hidden items at (6,13), (4,18), (17,8).GOLDENROD_UNDERGROUND- warp 1 at (3,2) -> switch-room (21,25) -> warp 8 at (20,29) ->GOLDENROD_CITY(9,5).GOLDENROD_CITY- warp 2 at (29,29) intoGOLDENROD_BIKE_SHOP; talk to the clerk at (7,2) and answer YES. Post:BICYCLE,EVENT_GOT_BICYCLE,ENGINE_BIKE_SHOP_CALL_ENABLED.GOLDENROD_CITY- warp 5 at (9,13) for the train station (flavour only).GOLDENROD_CITY- warp 12 at (5,15) intoRADIO_TOWER_1F; talk to the woman at (12,6) and answer YES, YES, NO, YES, NO. Post:ENGINE_RADIO_CARD.GOLDENROD_CITY- heal (warp 7), then warp 1 at (24,7) intoGOLDENROD_GYM.GOLDENROD_GYM- Beauty Victoria at (0,2), sight 3 facing DOWN. Post:EVENT_BEAT_BEAUTY_VICTORIA.GOLDENROD_GYM- Beauty Samantha at (19,5), sight 3 facing DOWN. Post:EVENT_BEAT_BEAUTY_SAMANTHA.GOLDENROD_GYM- Lass Carrie at (9,13), sight 4 facing RIGHT. Post:EVENT_BEAT_LASS_CARRIE.GOLDENROD_GYM- Lass Bridget at (9,6), sight 1 facing LEFT. Post:EVENT_BEAT_LASS_BRIDGET.GOLDENROD_GYM- talk to Whitney at (8,3). Post:EVENT_BEAT_WHITNEY,EVENT_MADE_WHITNEY_CRY,SCENE_GOLDENRODGYM_WHITNEY_STOPS_CRYING.GOLDENROD_GYM- walk onto (8,5). Intent: walk (trip-wire). Post:WhitneyCriesScript,EVENT_MADE_WHITNEY_CRYcleared,SCENE_GOLDENRODGYM_NOOP.GOLDENROD_GYM- talk to Whitney at (8,3) again. Post:ENGINE_PLAINBADGE,TM_ATTRACT,EVENT_GOT_TM45_ATTRACT.- Optional after the badge:
GOLDENROD_CITYwarp 6 at (33,5) ->GOLDENROD_FLOWER_SHOP, talk to the teacher. Post:SQUIRTBOTTLE,EVENT_GOT_SQUIRTBOTTLE(needed for the next section's Sudowoodo).
5. Port coverage
| Beat | Port file | Status |
|---|---|---|
| Map headers / dimensions / connections for every map above | src/import/RomExtractorGen2.lua (readMapGroupEntry, mapNameByIds), src/world/gen2/Map.lua |
implemented (generic, ROM-driven; nothing map-specific is hand-ported) |
def_warp_events / def_coord_events / def_bg_events / def_object_events decode |
src/import/RomExtractorGen2.lua:804 (coordEvents), :861, :974 |
implemented |
| Coord-event trip-wires (Azalea rival, Whitney cries) | src/world/gen2/World.lua:5013 (iterates self.map.def.coordEvents) |
implemented |
Scene ids / setscene / setmapscene |
src/script/gen2/Opcodes.lua (0x11-0x14), src/script/gen2/Vm.lua |
implemented |
Script VM opcodes used by this section (verbosegiveitem, loadtrainer, startbattle, winlosstext, setlasttalked, applymovement, moveobject, turnobject, appear/disappear, showemote, changeblock, refreshmap, givepoke, giveitem, checkcoins/takecoins, askforphonenumber, addcellnum/checkcellnum, giveegg, pokemart, fruittree, checktime, readvar) |
src/script/gen2/Opcodes.lua, src/script/gen2/Vm.lua |
implemented (all present) |
readvar VAR_FACING (the whole Farfetch'd branch logic) |
src/world/gen2/World.lua:95,1219 |
implemented |
| Item balls / hidden items | src/import/RomExtractorGen2.lua:2874,2882 (readItemBall, hiddenitem), src/world/gen2/HiddenItems.lua |
implemented |
Trainer sight lines and trainer struct |
src/world/gen2/Trainers.lua:98 (Trainers.sees), extractor :2961 |
implemented |
CUT badge gate + A-press cut (TryCutOW / CutFunction) |
src/world/gen2/FieldMoves.lua:104 (CUT = "HIVE"), :449, :609; src/world/gen2/World.lua:4203 (World:tryCutOW), :3965 (World:runCut), :3872 (CutDownTreeOrGrass) |
implemented |
STRENGTH badge gate (PLAINBADGE) |
src/world/gen2/FieldMoves.lua:108, :519 |
implemented |
| Bicycle | src/world/gen2/Bike.lua, src/world/gen2/World.lua:1790 |
implemented |
| Coin Case / Game Corner slots and prizes | src/core/gen2/CoinCase.lua, src/ui/gen2/SlotMachine.lua, src/ui/gen2/PrizeMenu.lua, src/script/gen2/Specials.lua:964 (GameCornerPrizeMonCheckDex) |
implemented |
Day-Care / breeding / egg handoff (DayCareMan, DayCareLady, DayCareManOutside, DayCareMon1/2) |
src/core/gen2/Breeding.lua, src/script/gen2/Specials.lua:526-596, src/ui/gen2/DayCareMenu.lua; driver tests/drivers/gold_egg_hatch.lua |
implemented |
| Phone numbers (Bill, Todd, Gina) | src/core/gen2/Phone.lua, src/script/gen2/Opcodes.lua:156 |
implemented |
| Pokegear Radio Card + radio channels | src/ui/gen2/Pokegear.lua:39 ({ id = "radio", ..., flag = "radio" }), :49 onward |
implemented |
| Haircut brothers / weekday NPC schedule | src/script/gen2/Specials.lua:1661-1662, src/world/gen2/World.lua:99 |
implemented |
| NPC trade (Mike: Drowzee -> Machop) | src/core/gen2/NpcTrade.lua, src/ui/gen2/TradeMenu.lua, src/ui/gen2/TradeAnim.lua |
implemented |
| Happiness -> TM27/TM21 Sunday lady | src/core/gen2/Happiness.lua, src/script/gen2/Specials.lua:1506 (GetFirstPokemonHappiness) |
implemented |
Marts (MARTTYPE_STANDARD / _BARGAIN / _BITTER) |
src/ui/gen2/MartMenu.lua |
implemented (verify the bargain/bitter variants by hand - only the standard path has driver coverage) |
| Magnet train (locked here, station map only) | src/core/gen2/MagnetTrain.lua, src/ui/gen2/MagnetTrainRide.lua |
implemented |
| End-to-end driver for this stretch | none - tests/drivers/gold_*.lua covers boot, walk, warp, battle, egg hatch, evolution, boulders (gold_icepath_boulder.lua), map callbacks |
missing - there is no Ilex-Forest / Goldenrod driver; the Farfetch'd chase and the Whitney cry-then-badge sequence are unexercised |
| Farfetch'd chase specifically | no dedicated port file; runs on the generic VM | untested (no driver) |
Whitney badge two-step (EVENT_MADE_WHITNEY_CRY + coord event) |
generic VM + World.lua:5013 |
untested (no driver) |
6. Unresolved / verify by hand
Contradictions between the walkthrough text and pokegold:
- "Bug Catcher Wayne" in Ilex Forest does not exist in Gold.
grep -rn WAYNE constants/ data/ maps/returns onlyBIKER DWAYNEonmaps/Route8.asm.maps/IlexForest.asmhas zeroOBJECTTYPE_TRAINERrows. Wayne (L8 Ledyba / L10 Paras) is Crystal-only content. - "X Attack" and "Antidote" in Ilex Forest do not exist in Gold.
The only items on the map are the
REVIVEitem ball at (20,32) and hiddenETHER(27,1),SUPER_POTION(17,7),FULL_HEAL(9,17). The walkthrough's own item list ("HM01, Revive, TM02, TM12") also omits them, so the prose contradicts its own header. TM12 is in the gate map, not the forest. - Ilex Forest species list. The walkthrough lists Weedle (#013). In Gold
the morn/day slots are Caterpie/Metapod (
IF DEF(_GOLD)); Weedle/Kakuna is theELIF DEF(_SILVER)arm. Oddish is nite-only. Metapod is Gold-only. - "Youngster Ian will want to trade phone numbers with you."
TrainerYoungsterIan.Scriptinmaps/Route34.asmis justendifjustbattled/writetext YoungsterIanAfterText. Noaskforphonenumber, noPHONE_*constant. The Route 34 phone trainers are Camper Todd and Picnicker Gina only. - Rival party order. The walkthrough prints Gastly / starter / Zubat; the
asm (
Rival1Groupentries 4-6) is Gastly (12), Zubat (14), starter (16). - "There's a PC in the corner of the Daycare."
maps/DayCare.asmhas two bookshelf bg events and two NPC objects; no PC bg event or object. - "Level 5: TM02, TM33, TM41, TM48" is right in spirit but conditional:
MART_GOLDENROD_5F_1(the default) is only TM41 ThunderPunch, TM48 Fire Punch, TM33 Ice Punch. TM02 Headbutt is added only afterEVENT_GOT_TM02_HEADBUTT, and TM08 Rock Smash afterEVENT_GOT_TM08_ROCK_SMASH(GoldenrodDeptStore5FClerkScript). - Game Corner "Ekans/Sandshrew 700" - the version split is real; Gold's
branch (
.Gold_Ekans) sells Ekans.GOLDENRODGAMECORNER_SANDSHREW_COINSis the Silver constant, also 700. - "Get Eevee from Bill" is listed under Goldenrod but
BILLSFAMILYSHOUSE_BILLcarries the object flagEVENT_MET_BILL, which is set in Ecruteak. OnlyBillsYoungerSisterScript(Bill's phone number) is reachable in this section. - Prose ordering glitch in the walkthrough: "Now head out of the gym and we'll hit the east side of town" appears before the gym is ever entered. Treat the bike shop / radio tower paragraphs as pre-gym.
- Whether the Azalea rival coord events at (5,10)/(5,11) can be walked
around was not verified - it needs a collision read of
maps/AzaleaTown.blkplus the tileset collision table, which I did not decode. The two rows are the only trip-wires on the map, so a bot should assume they can be dodged and treatEVENT_RIVAL_AZALEA_TOWNas the real precondition for later content rather than relying on the walk-west path. - Exact walkable route through the Farfetch'd chase (which tile to stand
on so the player's facing lands on the fall-through branch) was not derived;
only the branch table was read from the asm. A bot needs the collision map
of
maps/IlexForest.blkto turn "face away from<DIR>" into concrete approach tiles. data/wild/fish.asmwas searched forILEX_FOREST/ROUTE_34and has no per-map rows - fishing is selected by the header'sFISHGROUP_*(FISHGROUP_PONDfor Ilex Forest,FISHGROUP_SHOREfor Route 34). The per-group tables were not transcribed here.- Exp/money numbers quoted by the walkthrough (e.g. "You get: 960G") were
not verified; they are computed at runtime from base exp and level, not
stored in
data/trainers/parties.asm.