97 KiB
Section 08 - Olivine Lighthouse and Cianwood City Gym
Source: ../section-08-olivine-lighthouse-and-cianwood-city-gym.txt
Maps covered: MAP_ROUTE_38_ECRUTEAK_GATE, MAP_ROUTE_38, MAP_ROUTE_39,
MAP_ROUTE_39_BARN, MAP_ROUTE_39_FARMHOUSE, MAP_OLIVINE_CITY,
MAP_OLIVINE_POKECENTER_1F, MAP_OLIVINE_GOOD_ROD_HOUSE, MAP_OLIVINE_CAFE,
MAP_OLIVINE_MART, MAP_OLIVINE_LIGHTHOUSE_1F .. MAP_OLIVINE_LIGHTHOUSE_6F,
MAP_ROUTE_40, MAP_ROUTE_41, MAP_CIANWOOD_CITY, MAP_MANIAS_HOUSE,
MAP_CIANWOOD_PHARMACY, MAP_CIANWOOD_PHOTO_STUDIO,
MAP_CIANWOOD_POKECENTER_1F, MAP_CIANWOOD_LUGIA_SPEECH_HOUSE,
MAP_CIANWOOD_GYM
Badges / key milestones in this section: Storm Badge (ENGINE_STORMBADGE,
badge 5, from CianwoodGymChuckScript). Other milestones, in the order the
walkthrough hits them: EVENT_GOT_GOOD_ROD, EVENT_GOT_HM04_STRENGTH
(HM04 = the Cianwood Gym boulder puzzle and every later Strength rock),
EVENT_JASMINE_EXPLAINED_AMPHYS_SICKNESS (the flag that unlocks the Cianwood
pharmacist), EVENT_GOT_SHUCKIE, EVENT_GOT_SECRETPOTION_FROM_PHARMACY,
EVENT_BEAT_CHUCK, EVENT_GOT_TM01_DYNAMICPUNCH, EVENT_GOT_HM02_FLY, and
the two fly-point engine flags ENGINE_FLYPOINT_OLIVINE /
ENGINE_FLYPOINT_CIANWOOD.
Coordinate note: every warp_event / coord_event / bg_event /
object_event x,y below is copied verbatim from the map asm. Those are 0-based
walk-grid cells (2 per map block, so a W-block-wide map runs x = 0..2W-1),
the same grid src/world/gen2/Map.lua calls a cell.
1. Route order
| # | Map constant | asm file | Enter via | Leaves via | Why (walkthrough beat) |
|---|---|---|---|---|---|
| 1 | MAP_ROUTE_38_ECRUTEAK_GATE |
maps/Route38EcruteakGate.asm |
warp 3/4 at (9,4)/(9,5) from ECRUTEAK_CITY warps 14/15 |
warp 1/2 at (0,4)/(0,5) | "Well, go through the building into Route 38" |
| 2 | MAP_ROUTE_38 |
maps/Route38.asm |
warp 1/2 at (35,8)/(35,9) | west connection to ROUTE_39 (data/maps/attributes.asm:215) |
"You're heading west. There are trainers" - Toby, Harry, Dana, Valerie, Chad, plus the Berry tree |
| 3 | MAP_ROUTE_39 |
maps/Route39.asm |
east connection from ROUTE_38 |
south connection to OLIVINE_CITY (data/maps/attributes.asm:219) |
"Welcome to Route 39! It's the home of Moo Moo Farm" - Norman, Derek, Ruth, Eugene, Mint Berry |
| 3a | MAP_ROUTE_39_BARN |
maps/Route39Barn.asm |
Route 39 warp 1 at (1,3) | warp 1/2 at (3,7)/(4,7) | "you will first have to feed berries to their Miltank" |
| 3b | MAP_ROUTE_39_FARMHOUSE |
maps/Route39Farmhouse.asm |
Route 39 warp 2 at (5,3) | warp 1/2 at (2,7)/(3,7) | Moomoo Milk at 500 gold; TM13 SNORE once the Miltank is healed |
| 4 | MAP_OLIVINE_CITY |
maps/OlivineCity.asm |
north connection from ROUTE_39 (data/maps/attributes.asm:143) |
warp 9 at (29,27) | "As soon as you enter Olivine City and, when you are about to pass by the gym your rival will appear" - coord_event at (13,12)/(13,13) |
| 4a | MAP_OLIVINE_GOOD_ROD_HOUSE |
maps/OlivineGoodRodHouse.asm |
Olivine warp 6 at (13,15) | warp 1/2 at (2,7)/(3,7) | "Talk to the fisherman and he will give you a Good Rod" |
| 4b | MAP_OLIVINE_POKECENTER_1F |
maps/OlivinePokecenter1F.asm |
Olivine warp 1 at (13,21) | warp 1/2 at (3,7)/(4,7) | "Then heal at the Pokémon Center" |
| 4c | MAP_OLIVINE_CAFE |
maps/OlivineCafe.asm |
Olivine warp 7 at (7,21) | warp 1/2 at (2,7)/(3,7) | "talk to the sailor at the table for HM04 Strength!" |
| 5 | MAP_OLIVINE_LIGHTHOUSE_1F |
maps/OlivineLighthouse1F.asm |
Olivine warp 9 at (29,27) | warp 3 at (3,11) | "go up the Olivine City Lighthouse in the southeast part of town (not the dock)" |
| 6 | MAP_OLIVINE_LIGHTHOUSE_2F |
maps/OlivineLighthouse2F.asm |
warp 1 at (3,11) | warp 2 at (5,3) | Gentleman Alfred, Sailor Huey |
| 7 | MAP_OLIVINE_LIGHTHOUSE_3F |
maps/OlivineLighthouse3F.asm |
warp 2 at (5,3) | warp 1 at (13,3) | Bird Keeper Theo, Gentleman Preston, Ether |
| 8 | MAP_OLIVINE_LIGHTHOUSE_4F |
maps/OlivineLighthouse4F.asm |
warp 1 at (13,3) | warp 2 at (3,5) | Lass Connie, Sailor Kent, "hole next to Lass Connie" = warps 7/8 at (8,3)/(9,3) |
| 9 | MAP_OLIVINE_LIGHTHOUSE_5F |
maps/OlivineLighthouse5F.asm |
warp 2 at (3,5) | warp 1 at (9,15) | TM34 Swagger, Rare Candy, Great Ball, Bird Keeper Denis, Sailor Ernest |
| 10 | MAP_OLIVINE_LIGHTHOUSE_6F |
maps/OlivineLighthouse6F.asm |
warp 1 at (9,15) | warps 2/3 at (16,5)/(17,5) - the right-wall drop chain | "Talk to the person on that level, and it is Gym Leader Jasmine" |
| 11 | MAP_OLIVINE_CITY |
maps/OlivineCity.asm |
lighthouse 1F warps 1/2 at (10,17)/(11,17) | west connection to ROUTE_40 (data/maps/attributes.asm:145) |
heal, restock at the Mart (warp 8 at (19,17)), teach HM03 Surf |
| 12 | MAP_ROUTE_40 |
maps/Route40.asm |
east connection from OLIVINE_CITY |
south connection to ROUTE_41 (data/maps/attributes.asm:223) |
"activate Surf by clicking A at the water" - Simon, Elaine, Paula, Randall |
| 13 | MAP_ROUTE_41 |
maps/Route41.asm |
north connection from ROUTE_40 |
west connection to CIANWOOD_CITY (data/maps/attributes.asm:227) |
the nine open-sea swimmers; the four Whirl Islands warps are optional detours |
| 14 | MAP_CIANWOOD_CITY |
maps/CianwoodCity.asm |
east connection from ROUTE_41 (data/maps/attributes.asm:136) |
warp 2 at (8,43) | "You will reach land after that battle. Welcome to Cianwood City." |
| 14a | MAP_CIANWOOD_POKECENTER_1F |
maps/CianwoodPokecenter1F.asm |
Cianwood warp 3 at (23,43) | warp 1/2 at (3,7)/(4,7) | "Heal at the Pokémon Center and clear a space so you can acquire another Pokémon" |
| 14b | MAP_MANIAS_HOUSE |
maps/ManiasHouse.asm |
Cianwood warp 1 at (17,41) | warp 1/2 at (2,7)/(3,7) | "a PokeManiac will give you Level 15 Shuckie the Shuckle" |
| 14c | MAP_CIANWOOD_PHARMACY |
maps/CianwoodPharmacy.asm |
Cianwood warp 4 at (15,47) | warp 1/2 at (2,7)/(3,7) | "It's the Pharmacy. A guy inside the house, wearing sunglasses will give you some medicine" |
| 14d | MAP_CIANWOOD_PHOTO_STUDIO |
maps/CianwoodPhotoStudio.asm |
Cianwood warp 5 at (9,31) | warp 1/2 at (2,7)/(3,7) | "he will offer to take pictures of your Pokémon" (optional) |
| 15 | MAP_CIANWOOD_GYM |
maps/CianwoodGym.asm |
Cianwood warp 2 at (8,43) | warp 1/2 at (4,17)/(5,17) | "face Chuck, the fighting gym leader" -> Storm Badge + TM01 |
| 16 | MAP_CIANWOOD_CITY |
maps/CianwoodCity.asm |
gym warp 1/2 | (section ends) | "Talk to the lady outside the gym and she will give you HM02 Fly" |
Spills into the next section: the walkthrough's last line, "You'll want to
return to Olivine now so that you can give the medicine to Jasmine and the
Ampharos", starts the Olivine Gym / MAP_OLIVINE_GYM beat. The Secretpotion
hand-off itself is OlivineLighthouseJasmine on MAP_OLIVINE_LIGHTHOUSE_6F
(documented below, because the flag it clears is what makes Jasmine appear in
the gym), but the gym fight belongs to section 09. Likewise the walkthrough's
"Items found in Olivine City: … TM23" is Jasmine's TM in maps/OlivineGym.asm,
not anything reachable on MAP_OLIVINE_CITY.
2. Maps
MAP_ROUTE_38_ECRUTEAK_GATE
- Script:
maps/Route38EcruteakGate.asm - Blocks: none (no
.blk; gate maps shareTILESET_GATElayout) - Header (
data/maps/maps.asm:58):map Route38EcruteakGate, TILESET_GATE, GATE, LANDMARK_ROUTE_38, MUSIC_ROUTE_37, FALSE, PALETTE_DAY, FISHGROUP_SHORE - Dimensions (
constants/map_constants.asm:47):map_const ROUTE_38_ECRUTEAK_GATE, 5, 4(5x4 blocks = 10x8 cells) - Attributes (
data/maps/attributes.asm:480): no connections - Scene var: none (empty
def_scene_scripts)
Warps (def_warp_events)
| idx | x | y | destination map | dest warp |
|---|---|---|---|---|
| 1 | 0 | 4 | ROUTE_38 |
1 |
| 2 | 0 | 5 | ROUTE_38 |
2 |
| 3 | 9 | 4 | ECRUTEAK_CITY |
14 |
| 4 | 9 | 5 | ECRUTEAK_CITY |
15 |
Coord events - none.
BG events - none.
Object events (def_object_events)
| const | sprite | x | y | movement | type | script label | event flag |
|---|---|---|---|---|---|---|---|
ROUTE38ECRUTEAKGATE_OFFICER |
SPRITE_OFFICER |
5 | 2 | SPRITEMOVEDATA_STANDING_DOWN |
OBJECTTYPE_SCRIPT |
Route38EcruteakGateOfficerScript |
-1 |
The officer is jumptextfaceplayer only. Nothing here blocks passage.
MAP_ROUTE_38
- Script:
maps/Route38.asm - Blocks:
maps/Route38.blk - Header (
data/maps/maps.asm:61):map Route38, TILESET_JOHTO, ROUTE, LANDMARK_ROUTE_38, MUSIC_ROUTE_37, FALSE, PALETTE_AUTO, FISHGROUP_SHORE - Dimensions (
constants/map_constants.asm:50):map_const ROUTE_38, 20, 9(40x18 cells) - Connections (
data/maps/attributes.asm:215): westRoute39/ROUTE_39offset 0; eastEcruteakCity/ECRUTEAK_CITYoffset -5 - Scene var: none
Warps (def_warp_events)
| idx | x | y | destination map | dest warp |
|---|---|---|---|---|
| 1 | 35 | 8 | ROUTE_38_ECRUTEAK_GATE |
1 |
| 2 | 35 | 9 | ROUTE_38_ECRUTEAK_GATE |
2 |
Coord events - none.
BG events (def_bg_events)
| x | y | type | script/item |
|---|---|---|---|
| 33 | 7 | BGEVENT_READ |
Route38Sign |
| 5 | 13 | BGEVENT_READ |
Route38TrainerTips |
Object events (def_object_events)
| const | sprite | x | y | movement | type | sight | script label | event flag |
|---|---|---|---|---|---|---|---|---|
ROUTE38_STANDING_YOUNGSTER1 |
SPRITE_YOUNGSTER |
4 | 1 | SPRITEMOVEDATA_STANDING_RIGHT |
OBJECTTYPE_TRAINER |
3 | TrainerSchoolboyChad1 |
-1 |
ROUTE38_LASS |
SPRITE_LASS |
15 | 3 | SPRITEMOVEDATA_SPINRANDOM_FAST |
OBJECTTYPE_TRAINER |
2 | TrainerLassDana1 |
-1 |
ROUTE38_STANDING_YOUNGSTER2 |
SPRITE_YOUNGSTER |
15 | 10 | SPRITEMOVEDATA_STANDING_RIGHT |
OBJECTTYPE_TRAINER |
2 | TrainerBirdKeeperToby |
-1 |
ROUTE38_BEAUTY |
SPRITE_BEAUTY |
9 | 6 | SPRITEMOVEDATA_STANDING_DOWN |
OBJECTTYPE_TRAINER |
2 | TrainerBeautyValerie |
-1 |
ROUTE38_SAILOR |
SPRITE_SAILOR |
25 | 5 | SPRITEMOVEDATA_SPINCLOCKWISE |
OBJECTTYPE_TRAINER |
2 | TrainerSailorHarry |
-1 |
ROUTE38_FRUIT_TREE |
SPRITE_FRUIT_TREE |
12 | 10 | SPRITEMOVEDATA_STILL |
OBJECTTYPE_SCRIPT |
0 | Route38FruitTree |
-1 |
Scripts of interest
Route38FruitTree: single opcodefruittree FRUITTREE_ROUTE_38.data/items/fruit_trees.asm:6maps that index toBERRY. This is the walkthrough's "Go left and you'll get a Berry".TrainerLassDana1.Script: after the win it runs the standard phone-number offer.checkevent EVENT_DANA_READY_FOR_REMATCH-> rematch arm;checkcellnum PHONE_LASS_DANA-> already registered; otherwise it printsLassDanaMoomooMilkText, setsEVENT_DANA_ASKED_FOR_PHONE_NUMBER, and callsaskforphonenumber PHONE_LASS_DANA. The rematch arm picks the party by progress:checkevent EVENT_CLEARED_RADIO_TOWER->LASS, DANA3, elsecheckflag ENGINE_FLYPOINT_CIANWOOD->LASS, DANA2, elseLASS, DANA1. Note that flag: the moment a bot walks into Cianwood in this section, Dana's rematch upgrades toDANA2.TrainerSchoolboyChad1.Script: same shape,PHONE_SCHOOLBOY_CHAD, rematch tier keyed onEVENT_CLEARED_RADIO_TOWER->CHAD3, elsecheckflag ENGINE_FLYPOINT_MAHOGANY->CHAD2, elseCHAD1.- Toby, Valerie and Harry are plain
endifjustbattled / opentext / writetext / waitbutton / closetext / endafter-battle scripts. No flags beyond their ownEVENT_BEAT_*.
Flags and events
| constant | defined in | read/written by | meaning for a bot |
|---|---|---|---|
EVENT_BEAT_BIRD_KEEPER_TOBY |
constants/event_flags.asm (via trainer macro) |
TrainerBirdKeeperToby |
set on win; suppresses the sight-range trigger |
EVENT_BEAT_SAILOR_HARRY |
as above | TrainerSailorHarry |
as above |
EVENT_BEAT_LASS_DANA |
as above | TrainerLassDana1 |
as above |
EVENT_BEAT_SCHOOLBOY_CHAD |
as above | TrainerSchoolboyChad1 |
as above |
EVENT_BEAT_BEAUTY_VALERIE |
as above | TrainerBeautyValerie |
as above |
EVENT_DANA_ASKED_FOR_PHONE_NUMBER |
constants/event_flags.asm |
TrainerLassDana1.Script |
second-ask text branch |
EVENT_DANA_READY_FOR_REMATCH |
constants/event_flags.asm |
set by the phone (src/core/gen2/Phone.lua mirrors data/phone/), cleared by .DanaRematch |
rematch gate |
EVENT_CHAD_ASKED_FOR_PHONE_NUMBER / EVENT_CHAD_READY_FOR_REMATCH |
constants/event_flags.asm |
TrainerSchoolboyChad1.Script |
as above |
ENGINE_FLYPOINT_CIANWOOD |
constants/engine_flags.asm:83 |
set by CianwoodCityFlypointCallback, read by .DanaRematch |
rematch tier switch |
ENGINE_FLYPOINT_MAHOGANY |
constants/engine_flags.asm |
read by .ChadRematch |
rematch tier switch |
Items
| item | how obtained | source (label / bg_event / hidden) | one-time flag |
|---|---|---|---|
BERRY |
headbutt-free fruit tree, press A facing it | Route38FruitTree / FRUITTREE_ROUTE_38 (data/items/fruit_trees.asm:6) |
none - refreshes daily (engine/events/fruit_trees.asm) |
Trainers
| const | class | id | party (data/trainers/parties.asm) |
script label | rematch/phone |
|---|---|---|---|---|---|
TOBY |
BIRD_KEEPER |
5 | BirdKeeperGroup "TOBY", TRAINERTYPE_NORMAL: 15 DODUO, 16 DODUO, 17 DODUO |
TrainerBirdKeeperToby |
no |
HARRY |
SAILOR |
10 | SailorGroup "HARRY", TRAINERTYPE_NORMAL: 19 WOOPER |
TrainerSailorHarry |
no |
DANA1 |
LASS |
10 | LassGroup "DANA", TRAINERTYPE_MOVES: 18 FLAAFFY (TACKLE, GROWL, THUNDERSHOCK, THUNDER_WAVE), 18 PSYDUCK (SCRATCH, TAIL_WHIP, DISABLE, CONFUSION) |
TrainerLassDana1 |
PHONE_LASS_DANA; DANA2 = LASS 14 (21 FLAAFFY / 21 PSYDUCK), DANA3 = LASS 15 (29 PSYDUCK / 29 AMPHAROS) |
VALERIE |
BEAUTY |
16 | BeautyGroup "VALERIE", TRAINERTYPE_MOVES: 17 HOPPIP (SYNTHESIS, TAIL_WHIP, TACKLE, POISONPOWDER), 17 SKIPLOOM (SYNTHESIS, TAIL_WHIP, TACKLE, STUN_SPORE) |
TrainerBeautyValerie |
no |
CHAD1 |
SCHOOLBOY |
10 | SchoolboyGroup "CHAD", TRAINERTYPE_NORMAL: 19 MR__MIME |
TrainerSchoolboyChad1 |
PHONE_SCHOOLBOY_CHAD; CHAD2 = SCHOOLBOY 17, CHAD3 = SCHOOLBOY 18 |
Wild encounters
data/wild/johto_grass.asm:2014, def_grass_wildmons ROUTE_38, rates
10 percent, 10 percent, 10 percent (morn/day/nite). Gold build
(IF DEF(_GOLD)):
- morn and day, in slot order: 16 RATTATA, 16 RATICATE, 16 MAGNEMITE, 16 FARFETCH_D, 13 MILTANK, 13 TAUROS, 13 SNUBBULL
- nite: identical except slot 4 is 16 RATTATA instead of FARFETCH_D
Silver swaps RATTATA for MEOWTH in slots 1 and (at night) 4. Headbutt:
data/wild/treemon_maps.asm:19 treemon_map ROUTE_38, TREEMON_SET_FOREST.
MAP_ROUTE_39
- Script:
maps/Route39.asm - Blocks:
maps/Route39.blk - Header (
data/maps/maps.asm:62):map Route39, TILESET_JOHTO, ROUTE, LANDMARK_ROUTE_39, MUSIC_ROUTE_37, FALSE, PALETTE_AUTO, FISHGROUP_SHORE - Dimensions (
constants/map_constants.asm:51):map_const ROUTE_39, 10, 18(20x36 cells) - Connections (
data/maps/attributes.asm:219): southOlivineCity/OLIVINE_CITYoffset -5; eastRoute38/ROUTE_38offset 0 - Scene var: none
Warps (def_warp_events)
| idx | x | y | destination map | dest warp |
|---|---|---|---|---|
| 1 | 1 | 3 | ROUTE_39_BARN |
1 |
| 2 | 5 | 3 | ROUTE_39_FARMHOUSE |
1 |
Coord events - none.
BG events (def_bg_events)
| x | y | type | script/item |
|---|---|---|---|
| 5 | 31 | BGEVENT_READ |
Route39TrainerTips |
| 9 | 5 | BGEVENT_READ |
MoomooFarmSign |
| 15 | 7 | BGEVENT_READ |
Route39Sign |
| 5 | 13 | BGEVENT_ITEM |
Route39HiddenNugget -> hiddenitem NUGGET, EVENT_ROUTE_39_HIDDEN_NUGGET |
Object events (def_object_events)
| const | sprite | x | y | movement | type | sight | script label | event flag |
|---|---|---|---|---|---|---|---|---|
ROUTE39_SAILOR |
SPRITE_SAILOR |
13 | 29 | SPRITEMOVEDATA_STANDING_LEFT |
OBJECTTYPE_TRAINER |
5 | TrainerSailorEugene |
-1 |
ROUTE39_POKEFAN_M |
SPRITE_POKEFAN_M |
11 | 19 | SPRITEMOVEDATA_STANDING_RIGHT |
OBJECTTYPE_TRAINER |
4 | TrainerPokefanmDerek |
-1 |
ROUTE39_POKEFAN_F |
SPRITE_POKEFAN_F |
13 | 22 | SPRITEMOVEDATA_STANDING_LEFT |
OBJECTTYPE_TRAINER |
5 | TrainerPokefanfRuth |
-1 |
ROUTE39_MILTANK1 |
SPRITE_TAUROS |
3 | 12 | SPRITEMOVEDATA_POKEMON |
OBJECTTYPE_SCRIPT |
0 | Route39Miltank |
-1 |
ROUTE39_MILTANK2 |
SPRITE_TAUROS |
6 | 11 | SPRITEMOVEDATA_POKEMON |
OBJECTTYPE_SCRIPT |
0 | Route39Miltank |
-1 |
ROUTE39_MILTANK3 |
SPRITE_TAUROS |
4 | 15 | SPRITEMOVEDATA_POKEMON |
OBJECTTYPE_SCRIPT |
0 | Route39Miltank |
-1 |
ROUTE39_MILTANK4 |
SPRITE_TAUROS |
8 | 13 | SPRITEMOVEDATA_POKEMON |
OBJECTTYPE_SCRIPT |
0 | Route39Miltank |
-1 |
ROUTE39_PSYCHIC_NORMAN |
SPRITE_YOUNGSTER |
13 | 6 | SPRITEMOVEDATA_SPINRANDOM_FAST |
OBJECTTYPE_TRAINER |
3 | TrainerPsychicNorman |
-1 |
ROUTE39_FRUIT_TREE |
SPRITE_FRUIT_TREE |
9 | 3 | SPRITEMOVEDATA_STILL |
OBJECTTYPE_SCRIPT |
0 | Route39FruitTree |
-1 |
Scripts of interest
Route39FruitTree:fruittree FRUITTREE_ROUTE_39->data/items/fruit_trees.asm:18=MINT_BERRY. This is the walkthrough's "grab the Mint Berry".TrainerPokefanmDerek.Script: phone registration forPHONE_POKEFANM_DEREK; rematch tier isEVENT_BEAT_ELITE_FOUR->DEREK3, elsecheckflag ENGINE_FLYPOINT_LAKE_OF_RAGE->DEREK2, elseDEREK1.- Ruth, Eugene and Norman are plain after-battle scripts.
Flags and events - trainer EVENT_BEAT_* bits plus
EVENT_ROUTE_39_HIDDEN_NUGGET (constants/event_flags.asm:180),
EVENT_DEREK_ASKED_FOR_PHONE_NUMBER / EVENT_DEREK_READY_FOR_REMATCH.
Items
| item | how obtained | source | one-time flag |
|---|---|---|---|
MINT_BERRY |
fruit tree at (9,3) | Route39FruitTree |
none (daily) |
NUGGET |
hidden, stand on/face (5,13) and press A | Route39HiddenNugget bg_event |
EVENT_ROUTE_39_HIDDEN_NUGGET |
The walkthrough does not mention the Nugget.
Trainers
| const | class | id | party | script label | rematch/phone |
|---|---|---|---|---|---|
NORMAN |
PSYCHIC_T |
6 | PsychicGroup "NORMAN", TRAINERTYPE_MOVES: 17 SLOWPOKE (TACKLE, GROWL, WATER_GUN, -), 20 SLOWPOKE (CURSE, BODY_SLAM, WATER_GUN, CONFUSION) |
TrainerPsychicNorman |
no |
DEREK1 |
POKEFANM |
2 | PokefanMGroup "DEREK", TRAINERTYPE_ITEM: 17 PIKACHU holding BERRY |
TrainerPokefanmDerek |
PHONE_POKEFANM_DEREK; DEREK2 = POKEFANM 10 (19 PIKACHU/BERRY), DEREK3 = POKEFANM 11 (36 PIKACHU/BERRY) |
RUTH |
POKEFANF |
2 | PokefanFGroup "RUTH", TRAINERTYPE_ITEM: 17 PIKACHU holding BERRY |
TrainerPokefanfRuth |
no |
EUGENE |
SAILOR |
1 | SailorGroup "EUGENE", TRAINERTYPE_NORMAL: 17 POLIWHIRL, 17 RATICATE, 19 KRABBY |
TrainerSailorEugene |
no |
Wild encounters
data/wild/johto_grass.asm:2069, def_grass_wildmons ROUTE_39. Gold rates are
2 percent, 2 percent, 10 percent (Silver: 2/2/2 - Gold gets a much higher
night rate here).
- morn and day: 16 RATTATA, 17 RATICATE, 16 MAGNEMITE, 16 FARFETCH_D, 15 MILTANK, 15 TAUROS, 15 TAUROS
- nite: slot 4 becomes 16 RATTATA
Headbutt: data/wild/treemon_maps.asm:20 TREEMON_SET_FOREST.
MAP_ROUTE_39_BARN
- Script:
maps/Route39Barn.asm - Blocks:
maps/Route39Barn.blk - Header (
data/maps/maps.asm:59):map Route39Barn, TILESET_TRADITIONAL_HOUSE, INDOOR, LANDMARK_ROUTE_39, MUSIC_ECRUTEAK_CITY, FALSE, PALETTE_DAY, FISHGROUP_SHORE - Dimensions (
constants/map_constants.asm:48):map_const ROUTE_39_BARN, 4, 4 - Connections (
data/maps/attributes.asm:481): none
Warps
| idx | x | y | destination map | dest warp |
|---|---|---|---|---|
| 1 | 3 | 7 | ROUTE_39 |
1 |
| 2 | 4 | 7 | ROUTE_39 |
1 |
Coord events / BG events - none.
Object events
| const | sprite | x | y | movement | type | script label | event flag |
|---|---|---|---|---|---|---|---|
ROUTE39BARN_TWIN1 |
SPRITE_TWIN |
2 | 3 | SPRITEMOVEDATA_STANDING_RIGHT |
OBJECTTYPE_SCRIPT |
Route39BarnTwin1Script |
-1 |
ROUTE39BARN_TWIN2 |
SPRITE_TWIN |
4 | 3 | SPRITEMOVEDATA_STANDING_LEFT |
OBJECTTYPE_SCRIPT |
Route39BarnTwin2Script |
-1 |
ROUTE39BARN_MOOMOO |
SPRITE_TAUROS |
3 | 3 | SPRITEMOVEDATA_POKEMON |
OBJECTTYPE_SCRIPT |
MoomooScript |
-1 |
Scripts of interest
MoomooScript(pokegold.sym51:4c80). Control flow, verbatim from the opcodes:checkevent EVENT_HEALED_MOOMOO->.HappyCow(just a cry) if set.- Otherwise print
MoomooWeakMooText,setval MILTANK,special PlaySlowCry, printRoute39BarnItsCryIsWeakText. checkevent EVENT_TALKED_TO_FARMER_ABOUT_MOOMOO->.GiveBerry. This is the gate. Until you have talked toPokefanM_DairyFarmerin the farmhouse, the Miltank will not accept a Berry at all..GiveBerry:yesorno,checkitem BERRY,takeitem BERRY,readmem wMooMooBerries,addval 1,writemem wMooMooBerries, thenifequal 3/ifequal 5/ifequal 7for the three progress texts. At 7 berries it playsMUSIC_HEALandsetevent EVENT_HEALED_MOOMOO.
Route39BarnTwin1Script/Route39BarnTwin2Script: text only, branch onEVENT_HEALED_MOOMOO.
Flags and events
| constant | defined in | read/written by | meaning for a bot |
|---|---|---|---|
EVENT_TALKED_TO_FARMER_ABOUT_MOOMOO |
constants/event_flags.asm:72 |
set by PokefanM_DairyFarmer, read by MoomooScript |
must be set before any Berry is accepted |
EVENT_HEALED_MOOMOO |
constants/event_flags.asm:70 |
set by MoomooScript.SevenBerries |
unlocks Moomoo Milk sales and TM13 |
wMooMooBerries |
WRAM counter, written via writemem |
MoomooScript |
0..7; 7 is the finish line |
MAP_ROUTE_39_FARMHOUSE
- Script:
maps/Route39Farmhouse.asm - Blocks: none
- Header (
data/maps/maps.asm:60):map Route39Farmhouse, TILESET_HOUSE, INDOOR, LANDMARK_ROUTE_39, MUSIC_ECRUTEAK_CITY, FALSE, PALETTE_DAY, FISHGROUP_SHORE - Dimensions (
constants/map_constants.asm:49):map_const ROUTE_39_FARMHOUSE, 4, 4 - Connections (
data/maps/attributes.asm:482): none
Warps
| idx | x | y | destination map | dest warp |
|---|---|---|---|---|
| 1 | 2 | 7 | ROUTE_39 |
2 |
| 2 | 3 | 7 | ROUTE_39 |
2 |
BG events
| x | y | type | script/item |
|---|---|---|---|
| 0 | 1 | BGEVENT_READ |
FarmhouseBookshelf |
| 1 | 1 | BGEVENT_READ |
FarmhouseBookshelf |
Object events
| const | sprite | x | y | movement | type | script label | event flag |
|---|---|---|---|---|---|---|---|
ROUTE39FARMHOUSE_POKEFAN_M |
SPRITE_POKEFAN_M |
3 | 2 | SPRITEMOVEDATA_STANDING_DOWN |
OBJECTTYPE_SCRIPT |
PokefanM_DairyFarmer |
-1 |
ROUTE39FARMHOUSE_POKEFAN_F |
SPRITE_POKEFAN_F |
5 | 4 | SPRITEMOVEDATA_STANDING_LEFT |
OBJECTTYPE_SCRIPT |
PokefanF_SnoreFarmer |
-1 |
Scripts of interest
PokefanM_DairyFarmer:checkevent EVENT_HEALED_MOOMOO-> the Moomoo Milk shop (FarmerMScript_SellMilk). Otherwise printsFarmerMText_SickCowandsetevent EVENT_TALKED_TO_FARMER_ABOUT_MOOMOO. Talk to him before going to the barn.FarmerMScript_SellMilk:checkitem MOOMOO_MILK-> refuse if you already hold one; elseyesorno,checkmoney YOUR_MONEY, 500(DEF ROUTE39FARMHOUSE_MILK_PRICE EQU 500at line 1),giveitem MOOMOO_MILK,takemoney YOUR_MONEY, 500. One at a time.PokefanF_SnoreFarmer(pokegold.sym51:4ee3):checkevent EVENT_GOT_TM13_SNORE_FROM_MOOMOO_FARM-> speech only;checkevent EVENT_HEALED_MOOMOO->verbosegiveitem TM_SNOREthensetevent EVENT_GOT_TM13_SNORE_FROM_MOOMOO_FARM.
Items
| item | how obtained | source | one-time flag |
|---|---|---|---|
TM_SNORE (TM13) |
talk to ROUTE39FARMHOUSE_POKEFAN_F after EVENT_HEALED_MOOMOO |
FarmerFScript_GiveSnore |
EVENT_GOT_TM13_SNORE_FROM_MOOMOO_FARM (constants/event_flags.asm:71) |
MOOMOO_MILK |
buy for 500 from ROUTE39FARMHOUSE_POKEFAN_M after EVENT_HEALED_MOOMOO |
FarmerMScript_SellMilk |
repeatable, but only one in the bag at a time |
MAP_OLIVINE_CITY
- Script:
maps/OlivineCity.asm - Blocks:
maps/OlivineCity.blk - Header (
data/maps/maps.asm:63):map OlivineCity, TILESET_JOHTO, TOWN, LANDMARK_OLIVINE_CITY, MUSIC_VIOLET_CITY, FALSE, PALETTE_AUTO, FISHGROUP_SHORE - Dimensions (
constants/map_constants.asm:52):map_const OLIVINE_CITY, 20, 18(40x36 cells) - Connections (
data/maps/attributes.asm:143): northRoute39/ROUTE_39offset 5; westRoute40/ROUTE_40offset 9 - Scene var:
wOlivineCitySceneID(data/maps/scenes.asm:40). Scene ids come from the map's owndef_scene_scriptsblock:SCENE_OLIVINECITY_RIVAL_ENCOUNTER= 0 (the default on a new game),SCENE_OLIVINECITY_NOOP= 1. - Spawn (
data/maps/spawn_points.asm:34):spawn OLIVINE_CITY, 13, 22. Fly pointLANDMARK_OLIVINE_CITY->SPAWN_OLIVINE(data/maps/flypoints.asm:11).
Warps (def_warp_events)
| idx | x | y | destination map | dest warp |
|---|---|---|---|---|
| 1 | 13 | 21 | OLIVINE_POKECENTER_1F |
1 |
| 2 | 10 | 11 | OLIVINE_GYM |
1 |
| 3 | 25 | 11 | OLIVINE_TIMS_HOUSE |
1 |
| 4 | 0 | 0 | OLIVINE_HOUSE_BETA |
1 (marked ; inaccessible in the asm) |
| 5 | 29 | 11 | OLIVINE_PUNISHMENT_SPEECH_HOUSE |
1 |
| 6 | 13 | 15 | OLIVINE_GOOD_ROD_HOUSE |
1 |
| 7 | 7 | 21 | OLIVINE_CAFE |
1 |
| 8 | 19 | 17 | OLIVINE_MART |
2 |
| 9 | 29 | 27 | OLIVINE_LIGHTHOUSE_1F |
1 |
| 10 | 19 | 27 | OLIVINE_PORT_PASSAGE |
1 |
| 11 | 20 | 27 | OLIVINE_PORT_PASSAGE |
2 |
Coord events (def_coord_events)
| scene | x | y | script label | effect |
|---|---|---|---|---|
SCENE_OLIVINECITY_RIVAL_ENCOUNTER (0) |
13 | 12 | OlivineCityRivalSceneTop |
rival cut-scene, north variant |
SCENE_OLIVINECITY_RIVAL_ENCOUNTER (0) |
13 | 13 | OlivineCityRivalSceneBottom |
rival cut-scene, south variant |
BG events (def_bg_events)
| x | y | type | script/item |
|---|---|---|---|
| 17 | 11 | BGEVENT_READ |
OlivineCitySign |
| 20 | 24 | BGEVENT_READ |
OlivineCityPortSign |
| 7 | 11 | BGEVENT_READ |
OlivineGymSign |
| 30 | 28 | BGEVENT_READ |
OlivineLighthouseSign |
| 14 | 21 | BGEVENT_READ |
OlivineCityPokecenterSign |
| 20 | 17 | BGEVENT_READ |
OlivineCityMartSign |
Object events (def_object_events)
| const | sprite | x | y | movement | type | script label | event flag |
|---|---|---|---|---|---|---|---|
OLIVINECITY_SAILOR1 |
SPRITE_SAILOR |
26 | 27 | SPRITEMOVEDATA_WALK_UP_DOWN (radius 0,1) |
OBJECTTYPE_SCRIPT |
OlivineCitySailor1Script |
-1 |
OLIVINECITY_STANDING_YOUNGSTER |
SPRITE_YOUNGSTER |
20 | 13 | SPRITEMOVEDATA_WALK_LEFT_RIGHT (radius 1,0) |
OBJECTTYPE_SCRIPT |
OlivineCityStandingYoungsterScript |
-1 |
OLIVINECITY_SAILOR2 |
SPRITE_SAILOR |
17 | 21 | SPRITEMOVEDATA_WANDER (radius 1,1) |
OBJECTTYPE_SCRIPT |
OlivineCitySailor2Script |
-1 |
OLIVINECITY_OLIVINE_RIVAL |
SPRITE_OLIVINE_RIVAL |
10 | 11 | SPRITEMOVEDATA_STANDING_DOWN |
OBJECTTYPE_SCRIPT |
ObjectEvent |
EVENT_RIVAL_OLIVINE_CITY |
The rival object sits on the gym door tile and is masked while
EVENT_RIVAL_OLIVINE_CITY is set (CheckObjectFlag,
engine/overworld/map_objects_2.asm:32 - a set flag hides the object).
InitializeEventsScript sets it on a new game
(engine/events/std_scripts.asm:520), so the rival is invisible until the
scene's appear clears it.
Scripts of interest
OlivineCityFlypointCallback(callback MAPCALLBACK_NEWMAP,pokegold.sym49:400f): a singlesetflag ENGINE_FLYPOINT_OLIVINE. Walking into Olivine at all registers the fly point.OlivineCityRivalSceneTop(pokegold.sym49:4013) andOlivineCityRivalSceneBottom(49:404b). Both:turnobject PLAYER, LEFT/showemote EMOTE_SHOCK, PLAYER, 15/special FadeOutMusic/pause 15/playsound SFX_ENTER_DOOR/appear OLIVINECITY_OLIVINE_RIVAL/applymovement OLIVINECITY_OLIVINE_RIVAL, <approach>/playmusic MUSIC_RIVAL_ENCOUNTER/writetext OlivineCityRivalText/applymovement PLAYER, <step aside>/applymovement OLIVINECITY_OLIVINE_RIVAL, <leaves>/setscene SCENE_OLIVINECITY_NOOP/disappear OLIVINECITY_OLIVINE_RIVAL/special RestartMapMusic/variablesprite SPRITE_OLIVINE_RIVAL, SPRITE_SWIMMER_GUY/special LoadUsedSpritesGFX. There is no battle. The walkthrough is right: he only talks. Thevariablespriteat the end is load-bearing - it re-points theSPRITE_OLIVINE_RIVALslot atSPRITE_SWIMMER_GUY, which is why the Route 40 and Route 41 swimmers useSPRITE_OLIVINE_RIVALin theirobject_eventrows. Movements: top variant approachDOWN, RIGHT, RIGHT, player stepsDOWN+turn_head UP, rival leavesRIGHT x6, UP x6. Bottom variant approachDOWN, DOWN, RIGHT, RIGHT, player stepsUP+turn_head DOWN, rival leavesRIGHT x6, UP x5.
Flags and events
| constant | defined in | read/written by | meaning for a bot |
|---|---|---|---|
ENGINE_FLYPOINT_OLIVINE |
constants/engine_flags.asm:85 |
OlivineCityFlypointCallback |
Fly destination unlocked on first entry |
EVENT_RIVAL_OLIVINE_CITY |
constants/event_flags.asm:1125 |
set by InitializeEventsScript, cleared by appear, re-set by disappear |
hides the rival object outside the scene |
SCENE_OLIVINECITY_RIVAL_ENCOUNTER = 0 |
maps/OlivineCity.asm:9 (scene_script) |
wOlivineCitySceneID |
default; arms the two coord events |
SCENE_OLIVINECITY_NOOP = 1 |
maps/OlivineCity.asm:10 |
setscene in both scene scripts |
disarms them permanently |
Items - none on the overworld map itself. The section's three Olivine items
come from interiors: GOOD_ROD (Good Rod House), HM_STRENGTH (Cafe), and
TM23 from Jasmine in the gym (section 09).
Trainers - none.
Wild encounters - data/wild/johto_water.asm:239,
def_water_wildmons OLIVINE_CITY, rate 6 percent: 20 TENTACOOL,
15 TENTACOOL, 20 TENTACRUEL. Fishing group is FISHGROUP_SHORE
(data/maps/maps.asm:63); with the Good Rod that is
data/wild/fish.asm .Shore_Good: 35% MAGIKARP 20, 35% KRABBY 20,
20%+1 KRABBY 20, remainder time_group 0 = CORSOLA 20 by day / STARYU 20 at
night (data/wild/fish.asm:212). No grass table exists for Olivine City.
MAP_OLIVINE_GOOD_ROD_HOUSE
- Script:
maps/OlivineGoodRodHouse.asm - Header (
data/maps/maps.asm:55):map OlivineGoodRodHouse, TILESET_HOUSE, INDOOR, LANDMARK_OLIVINE_CITY, MUSIC_VIOLET_CITY, FALSE, PALETTE_DAY, FISHGROUP_SHORE - Dimensions (
constants/map_constants.asm:44):map_const OLIVINE_GOOD_ROD_HOUSE, 4, 4 - Attributes (
data/maps/attributes.asm:477): no connections
Warps: 1 (2,7) -> OLIVINE_CITY 6; 2 (3,7) -> OLIVINE_CITY 6.
Object events
| const | sprite | x | y | movement | type | script label | event flag |
|---|---|---|---|---|---|---|---|
OLIVINEGOODRODHOUSE_FISHING_GURU |
SPRITE_FISHING_GURU |
2 | 3 | SPRITEMOVEDATA_STANDING_DOWN |
OBJECTTYPE_SCRIPT |
GoodRodGuru |
-1 |
Scripts of interest
GoodRodGuru(pokegold.sym51:46fc):checkevent EVENT_GOT_GOOD_ROD-> already-got text; otherwisewritetext OfferGoodRodText,yesorno, iffalse -> refusal, no item, thenverbosegiveitem GOOD_RODandsetevent EVENT_GOT_GOOD_ROD. A bot must answer YES.
Items
| item | how obtained | source | one-time flag |
|---|---|---|---|
GOOD_ROD |
talk, answer YES | GoodRodGuru |
EVENT_GOT_GOOD_ROD (constants/event_flags.asm:32) |
MAP_OLIVINE_CAFE
- Script:
maps/OlivineCafe.asm - Blocks:
maps/OlivineCafe.blk - Header (
data/maps/maps.asm:56):map OlivineCafe, TILESET_GAME_CORNER, INDOOR, LANDMARK_OLIVINE_CITY, MUSIC_VIOLET_CITY, FALSE, PALETTE_DAY, FISHGROUP_SHORE - Dimensions (
constants/map_constants.asm:45):map_const OLIVINE_CAFE, 4, 4 - Attributes (
data/maps/attributes.asm:478): no connections
Warps: 1 (2,7) -> OLIVINE_CITY 7; 2 (3,7) -> OLIVINE_CITY 7.
Object events
| const | sprite | x | y | movement | type | script label | event flag |
|---|---|---|---|---|---|---|---|
OLIVINECAFE_SAILOR |
SPRITE_SAILOR |
4 | 3 | SPRITEMOVEDATA_STANDING_LEFT |
OBJECTTYPE_SCRIPT |
OlivineCafeStrengthSailorScript |
-1 |
OLIVINECAFE_FISHING_GURU |
SPRITE_FISHING_GURU |
1 | 5 | SPRITEMOVEDATA_WALK_UP_DOWN (radius 0,1) |
OBJECTTYPE_SCRIPT |
OlivineCafeFishingGuruScript |
-1 |
Scripts of interest
OlivineCafeStrengthSailorScript(pokegold.sym51:48a2):checkevent EVENT_GOT_HM04_STRENGTH-> already-got text; elsewritetext OlivineCafeStrengthSailorText,promptbutton,verbosegiveitem HM_STRENGTH,setevent EVENT_GOT_HM04_STRENGTH. No prerequisite at all - no badge check, no event check. The sailor's own text is the reminder that using Strength in the field needs Goldenrod's badge, but the HM itself is unconditional.OlivineCafeFishingGuruScript: flavour text warning about the Route 41 whirlpools.
Items
| item | how obtained | source | one-time flag |
|---|---|---|---|
HM_STRENGTH (HM04) |
talk to the sailor at (4,3) | OlivineCafeStrengthSailorScript |
EVENT_GOT_HM04_STRENGTH (constants/event_flags.asm:26) |
MAP_OLIVINE_POKECENTER_1F
- Script:
maps/OlivinePokecenter1F.asm - Header (
data/maps/maps.asm:50):map OlivinePokecenter1F, TILESET_POKECENTER, INDOOR, LANDMARK_OLIVINE_CITY, MUSIC_POKEMON_CENTER, FALSE, PALETTE_DAY, FISHGROUP_SHORE - Dimensions (
constants/map_constants.asm:39):map_const OLIVINE_POKECENTER_1F, 5, 4
Warps: 1 (3,7) -> OLIVINE_CITY 1; 2 (4,7) -> OLIVINE_CITY 1;
3 (0,7) -> POKECENTER_2F 1.
Object events
| const | sprite | x | y | movement | type | script label |
|---|---|---|---|---|---|---|
OLIVINEPOKECENTER1F_NURSE |
SPRITE_NURSE |
3 | 1 | SPRITEMOVEDATA_STANDING_DOWN |
OBJECTTYPE_SCRIPT |
OlivinePokecenter1FNurseScript (jumpstd PokecenterNurseScript) |
OLIVINEPOKECENTER1F_FISHING_GURU |
SPRITE_FISHING_GURU |
8 | 4 | SPRITEMOVEDATA_WALK_LEFT_RIGHT |
OBJECTTYPE_SCRIPT |
jumpstd HappinessCheckScript |
OLIVINEPOKECENTER1F_FISHER |
SPRITE_FISHER |
2 | 3 | SPRITEMOVEDATA_STANDING_DOWN |
OBJECTTYPE_SCRIPT |
OlivinePokecenter1FFisherScript |
OLIVINEPOKECENTER1F_TEACHER |
SPRITE_TEACHER |
7 | 1 | SPRITEMOVEDATA_STANDING_DOWN |
OBJECTTYPE_SCRIPT |
OlivinePokecenter1FTeacherScript |
The happiness-check guru at (8,4) is worth knowing about: it is the standard
HappinessCheckScript and the closest one to Shuckie.
MAP_OLIVINE_MART
- Script:
maps/OlivineMart.asm - Header (
data/maps/maps.asm:57):map OlivineMart, TILESET_MART, INDOOR, LANDMARK_OLIVINE_CITY, MUSIC_VIOLET_CITY, FALSE, PALETTE_DAY, FISHGROUP_SHORE - Dimensions (
constants/map_constants.asm:46):map_const OLIVINE_MART, 6, 4 - Warps: 1 (2,7) ->
OLIVINE_CITY8; 2 (3,7) ->OLIVINE_CITY8. OlivineMartClerkScript:pokemart MARTTYPE_STANDARD, MART_OLIVINE.MartOlivine(data/items/marts.asm:168), 9 items: GREAT_BALL, SUPER_POTION, HYPER_POTION, ANTIDOTE, PARLYZ_HEAL, AWAKENING, ICE_HEAL, SUPER_REPEL, SURF_MAIL. This is the walkthrough's "restock on items, like Great Balls".
MAP_OLIVINE_LIGHTHOUSE_1F .. 6F
All six floors share:
- Header (
data/maps/maps.asm:112-117):map OlivineLighthouseNF, TILESET_LIGHTHOUSE, DUNGEON, LANDMARK_LIGHTHOUSE, MUSIC_LIGHTHOUSE, FALSE, PALETTE_DAY, FISHGROUP_SHORE- exception: 6F uses
MUSIC_VIOLET_CITY, notMUSIC_LIGHTHOUSE(data/maps/maps.asm:117).
- exception: 6F uses
- Dimensions (
constants/map_constants.asm:99-104):map_const OLIVINE_LIGHTHOUSE_NF, 10, 9for all six (20x18 cells). - Attributes (
data/maps/attributes.asm:431-436): no connections. - No scene vars, no callbacks, no coord events on any floor.
Floor-to-floor structure, from the six def_warp_events blocks. There are two
vertical routes: the interior stairs (varying coordinates) and a right-wall
column at x = 16/17 that the walkthrough calls "the holes on the right side of
every floor". Each right-wall pair is mirrored at identical coordinates on the
floor it links to.
| from | at (x,y) | to | dest warp | role |
|---|---|---|---|---|
| 1F w3 | 3,11 | 2F | 1 | stairs up |
| 1F w4/w5 | 16,13 / 17,13 | 2F | 3 / 4 | right-wall pair |
| 2F w2 | 5,3 | 3F | 2 | stairs up |
| 2F w3/w4 | 16,13 / 17,13 | 1F | 4 / 5 | right-wall drop to 1F |
| 2F w5/w6 | 16,11 / 17,11 | 3F | 4 / 5 | right-wall pair |
| 3F w1 | 13,3 | 4F | 1 | stairs up |
| 3F w3 | 9,5 | 4F | 4 | stairs |
| 3F w4/w5 | 16,11 / 17,11 | 2F | 5 / 6 | right-wall drop to 2F |
| 3F w6/w7 | 16,9 / 17,9 | 4F | 5 / 6 | right-wall pair |
| 3F w8/w9 | 8,3 / 9,3 | 4F | 7 / 8 | the pair the 4F "hole next to Connie" lands on |
| 4F w2 | 3,5 | 5F | 2 | stairs up |
| 4F w3 | 9,7 | 5F | 3 | stairs |
| 4F w7/w8 | 8,3 / 9,3 | 3F | 8 / 9 | the hole beside Lass Connie - drops next to Sailor Terrell and the Ether |
| 4F w9/w10 | 16,7 / 17,7 | 5F | 4 / 5 | right-wall pair |
| 5F w1 | 9,15 | 6F | 1 | stairs up to Jasmine |
| 5F w4/w5 | 16,7 / 17,7 | 4F | 9 / 10 | right-wall drop to 4F |
| 5F w6/w7 | 16,5 / 17,5 | 6F | 2 / 3 | right-wall pair |
| 6F w2/w3 | 16,5 / 17,5 | 5F | 6 / 7 | start of the descent chain out |
Descent chain the walkthrough describes, in order: 6F (16,5) -> 5F (16,5); walk to 5F (16,7) -> 4F (16,7); walk to 4F (16,9) -> 3F (16,9); walk to 3F (16,11) -> 2F (16,11); walk to 2F (16,13) -> 1F (16,13); then 1F warp 1/2 at (10,17)/(11,17) back to Olivine.
MAP_OLIVINE_LIGHTHOUSE_1F
Warps
| idx | x | y | destination map | dest warp |
|---|---|---|---|---|
| 1 | 10 | 17 | OLIVINE_CITY |
9 |
| 2 | 11 | 17 | OLIVINE_CITY |
9 |
| 3 | 3 | 11 | OLIVINE_LIGHTHOUSE_2F |
1 |
| 4 | 16 | 13 | OLIVINE_LIGHTHOUSE_2F |
3 |
| 5 | 17 | 13 | OLIVINE_LIGHTHOUSE_2F |
4 |
Coord events / BG events - none.
Object events
| const | sprite | x | y | movement | type | script label | event flag |
|---|---|---|---|---|---|---|---|
OLIVINELIGHTHOUSE1F_SAILOR |
SPRITE_SAILOR |
8 | 2 | SPRITEMOVEDATA_STANDING_DOWN |
OBJECTTYPE_SCRIPT |
OlivineLighthouse1FSailorScript |
-1 |
OLIVINELIGHTHOUSE1F_POKEFAN_F |
SPRITE_POKEFAN_F |
16 | 9 | SPRITEMOVEDATA_WALK_UP_DOWN (radius 0,2) |
OBJECTTYPE_SCRIPT |
OlivineLighthouse1FPokefanFScript |
-1 |
No trainers, no items, no gate on 1F.
MAP_OLIVINE_LIGHTHOUSE_2F
Warps
| idx | x | y | destination map | dest warp |
|---|---|---|---|---|
| 1 | 3 | 11 | OLIVINE_LIGHTHOUSE_1F |
3 |
| 2 | 5 | 3 | OLIVINE_LIGHTHOUSE_3F |
2 |
| 3 | 16 | 13 | OLIVINE_LIGHTHOUSE_1F |
4 |
| 4 | 17 | 13 | OLIVINE_LIGHTHOUSE_1F |
5 |
| 5 | 16 | 11 | OLIVINE_LIGHTHOUSE_3F |
4 |
| 6 | 17 | 11 | OLIVINE_LIGHTHOUSE_3F |
5 |
Coord events / BG events - none.
Object events
| const | sprite | x | y | movement | type | sight | script label | event flag |
|---|---|---|---|---|---|---|---|---|
OLIVINELIGHTHOUSE2F_SAILOR |
SPRITE_SAILOR |
9 | 3 | SPRITEMOVEDATA_STANDING_RIGHT |
OBJECTTYPE_TRAINER |
3 | TrainerSailorHuey |
-1 |
OLIVINELIGHTHOUSE2F_GENTLEMAN |
SPRITE_GENTLEMAN |
17 | 8 | SPRITEMOVEDATA_STANDING_LEFT |
OBJECTTYPE_TRAINER |
3 | TrainerGentlemanAlfred |
-1 |
Scripts of interest
TrainerSailorHuey.Script: phone registration forPHONE_SAILOR_HUEY(EVENT_HUEY_ASKED_FOR_PHONE_NUMBER), rematch keyed onEVENT_BEAT_ELITE_FOUR->HUEY3, elseEVENT_CLEARED_RADIO_TOWER->HUEY2, elseHUEY1. The walkthrough's mention of a Liz phone call here is ambient phone traffic, not this script.
Trainers
| const | class | id | party | script label | rematch/phone |
|---|---|---|---|---|---|
ALFRED |
GENTLEMAN |
5 | GentlemanGroup "ALFRED", TRAINERTYPE_NORMAL: 20 NOCTOWL |
TrainerGentlemanAlfred |
no |
HUEY1 |
SAILOR |
2 | SailorGroup "HUEY", TRAINERTYPE_NORMAL: 18 POLIWAG, 18 POLIWHIRL |
TrainerSailorHuey |
PHONE_SAILOR_HUEY; HUEY2 = SAILOR 11 (28 POLIWHIRL x2), HUEY3 = SAILOR 12 (34 POLIWHIRL, 34 POLIWRATH) |
MAP_OLIVINE_LIGHTHOUSE_3F
Warps
| idx | x | y | destination map | dest warp |
|---|---|---|---|---|
| 1 | 13 | 3 | OLIVINE_LIGHTHOUSE_4F |
1 |
| 2 | 5 | 3 | OLIVINE_LIGHTHOUSE_2F |
2 |
| 3 | 9 | 5 | OLIVINE_LIGHTHOUSE_4F |
4 |
| 4 | 16 | 11 | OLIVINE_LIGHTHOUSE_2F |
5 |
| 5 | 17 | 11 | OLIVINE_LIGHTHOUSE_2F |
6 |
| 6 | 16 | 9 | OLIVINE_LIGHTHOUSE_4F |
5 |
| 7 | 17 | 9 | OLIVINE_LIGHTHOUSE_4F |
6 |
| 8 | 8 | 3 | OLIVINE_LIGHTHOUSE_4F |
7 |
| 9 | 9 | 3 | OLIVINE_LIGHTHOUSE_4F |
8 |
Coord events / BG events - none.
Object events
| const | sprite | x | y | movement | type | sight | script label | event flag |
|---|---|---|---|---|---|---|---|---|
OLIVINELIGHTHOUSE3F_SAILOR |
SPRITE_SAILOR |
9 | 2 | SPRITEMOVEDATA_STANDING_DOWN |
OBJECTTYPE_TRAINER |
1 | TrainerSailorTerrell |
-1 |
OLIVINELIGHTHOUSE3F_GENTLEMAN |
SPRITE_GENTLEMAN |
13 | 5 | SPRITEMOVEDATA_STANDING_RIGHT |
OBJECTTYPE_TRAINER |
4 | TrainerGentlemanPreston |
-1 |
OLIVINELIGHTHOUSE3F_YOUNGSTER |
SPRITE_YOUNGSTER |
3 | 9 | SPRITEMOVEDATA_STANDING_UP |
OBJECTTYPE_TRAINER |
3 | TrainerBirdKeeperTheo |
-1 |
OLIVINELIGHTHOUSE3F_POKE_BALL |
SPRITE_POKE_BALL |
8 | 2 | SPRITEMOVEDATA_STILL |
OBJECTTYPE_ITEMBALL |
0 | OlivineLighthouse3FEther (itemball ETHER) |
EVENT_OLIVINE_LIGHTHOUSE_3F_ETHER |
Items
| item | how obtained | source | one-time flag |
|---|---|---|---|
ETHER |
item ball at (8,2), reached by dropping through 4F (8,3)/(9,3) | OlivineLighthouse3FEther |
EVENT_OLIVINE_LIGHTHOUSE_3F_ETHER (constants/event_flags.asm:1029) |
Trainers
| const | class | id | party | script label |
|---|---|---|---|---|
THEO |
BIRD_KEEPER |
4 | TRAINERTYPE_NORMAL: 17 PIDGEY, 15 PIDGEY, 19 PIDGEY, 15 PIDGEY, 15 PIDGEY |
TrainerBirdKeeperTheo |
PRESTON |
GENTLEMAN |
1 | TRAINERTYPE_NORMAL: 18 GROWLITHE, 18 GROWLITHE |
TrainerGentlemanPreston |
TERRELL |
SAILOR |
3 | TRAINERTYPE_NORMAL: 20 POLIWHIRL |
TrainerSailorTerrell |
Sight range 1 on Terrell is why the walkthrough hits him only after dropping down beside him.
MAP_OLIVINE_LIGHTHOUSE_4F
Warps
| idx | x | y | destination map | dest warp |
|---|---|---|---|---|
| 1 | 13 | 3 | OLIVINE_LIGHTHOUSE_3F |
1 |
| 2 | 3 | 5 | OLIVINE_LIGHTHOUSE_5F |
2 |
| 3 | 9 | 7 | OLIVINE_LIGHTHOUSE_5F |
3 |
| 4 | 9 | 5 | OLIVINE_LIGHTHOUSE_3F |
3 |
| 5 | 16 | 9 | OLIVINE_LIGHTHOUSE_3F |
6 |
| 6 | 17 | 9 | OLIVINE_LIGHTHOUSE_3F |
7 |
| 7 | 8 | 3 | OLIVINE_LIGHTHOUSE_3F |
8 |
| 8 | 9 | 3 | OLIVINE_LIGHTHOUSE_3F |
9 |
| 9 | 16 | 7 | OLIVINE_LIGHTHOUSE_5F |
4 |
| 10 | 17 | 7 | OLIVINE_LIGHTHOUSE_5F |
5 |
Coord events / BG events - none.
Object events
| const | sprite | x | y | movement | type | sight | script label | event flag |
|---|---|---|---|---|---|---|---|---|
OLIVINELIGHTHOUSE4F_SAILOR |
SPRITE_SAILOR |
7 | 14 | SPRITEMOVEDATA_STANDING_LEFT |
OBJECTTYPE_TRAINER |
3 | TrainerSailorKent |
-1 |
OLIVINELIGHTHOUSE4F_LASS |
SPRITE_LASS |
11 | 2 | SPRITEMOVEDATA_STANDING_DOWN |
OBJECTTYPE_TRAINER |
1 | TrainerLassConnie |
-1 |
Connie stands at (11,2); the drop-down warps 7/8 at (8,3)/(9,3) are the "hole next to Lass Connie" in the walkthrough.
Trainers
| const | class | id | party | script label |
|---|---|---|---|---|
CONNIE1 |
LASS |
5 | TRAINERTYPE_NORMAL: 21 MARILL |
TrainerLassConnie |
KENT |
SAILOR |
4 | TRAINERTYPE_MOVES: 18 KRABBY (BUBBLE, LEER, VICEGRIP, HARDEN), 20 KRABBY (BUBBLEBEAM, LEER, VICEGRIP, HARDEN) |
TrainerSailorKent |
MAP_OLIVINE_LIGHTHOUSE_5F
Warps
| idx | x | y | destination map | dest warp |
|---|---|---|---|---|
| 1 | 9 | 15 | OLIVINE_LIGHTHOUSE_6F |
1 |
| 2 | 3 | 5 | OLIVINE_LIGHTHOUSE_4F |
2 |
| 3 | 9 | 7 | OLIVINE_LIGHTHOUSE_4F |
3 |
| 4 | 16 | 7 | OLIVINE_LIGHTHOUSE_4F |
9 |
| 5 | 17 | 7 | OLIVINE_LIGHTHOUSE_4F |
10 |
| 6 | 16 | 5 | OLIVINE_LIGHTHOUSE_6F |
2 |
| 7 | 17 | 5 | OLIVINE_LIGHTHOUSE_6F |
3 |
Coord events - none.
BG events
| x | y | type | script/item |
|---|---|---|---|
| 3 | 13 | BGEVENT_ITEM |
OlivineLighthouse5FHiddenHyperPotion -> hiddenitem HYPER_POTION, EVENT_OLIVINE_LIGHTHOUSE_5F_HIDDEN_HYPER_POTION |
Object events
| const | sprite | x | y | movement | type | sight | script label | event flag |
|---|---|---|---|---|---|---|---|---|
OLIVINELIGHTHOUSE5F_SAILOR |
SPRITE_SAILOR |
8 | 11 | SPRITEMOVEDATA_SPINRANDOM_FAST |
OBJECTTYPE_TRAINER |
3 | TrainerSailorErnest |
-1 |
OLIVINELIGHTHOUSE5F_YOUNGSTER |
SPRITE_YOUNGSTER |
8 | 3 | SPRITEMOVEDATA_STANDING_LEFT |
OBJECTTYPE_TRAINER |
4 | TrainerBirdKeeperDenis |
-1 |
OLIVINELIGHTHOUSE5F_POKE_BALL1 |
SPRITE_POKE_BALL |
15 | 12 | SPRITEMOVEDATA_STILL |
OBJECTTYPE_ITEMBALL |
0 | OlivineLighthouse5FRareCandy (itemball RARE_CANDY) |
EVENT_OLIVINE_LIGHTHOUSE_5F_RARE_CANDY |
OLIVINELIGHTHOUSE5F_POKE_BALL2 |
SPRITE_POKE_BALL |
6 | 15 | SPRITEMOVEDATA_STILL |
OBJECTTYPE_ITEMBALL |
0 | OlivineLighthouse5FGreatBall (itemball GREAT_BALL) |
EVENT_OLIVINE_LIGHTHOUSE_5F_GREAT_BALL |
OLIVINELIGHTHOUSE5F_POKE_BALL3 |
SPRITE_POKE_BALL |
2 | 13 | SPRITEMOVEDATA_STILL |
OBJECTTYPE_ITEMBALL |
0 | OlivineLighthouse5FTMSwagger (itemball TM_SWAGGER, pokegold.sym 44:6aea) |
EVENT_OLIVINE_LIGHTHOUSE_5F_TM_SWAGGER |
Items
| item | how obtained | source | one-time flag |
|---|---|---|---|
TM_SWAGGER (TM34) |
item ball at (2,13) | OlivineLighthouse5FTMSwagger |
EVENT_OLIVINE_LIGHTHOUSE_5F_TM_SWAGGER (constants/event_flags.asm:1032) |
RARE_CANDY |
item ball at (15,12) | OlivineLighthouse5FRareCandy |
EVENT_OLIVINE_LIGHTHOUSE_5F_RARE_CANDY (:1030) |
GREAT_BALL |
item ball at (6,15) | OlivineLighthouse5FGreatBall |
EVENT_OLIVINE_LIGHTHOUSE_5F_GREAT_BALL (:1031) |
HYPER_POTION |
hidden at (3,13) | OlivineLighthouse5FHiddenHyperPotion |
EVENT_OLIVINE_LIGHTHOUSE_5F_HIDDEN_HYPER_POTION (:143) |
The hidden Hyper Potion is one cell east of the TM34 ball and is not mentioned in the walkthrough.
Trainers
| const | class | id | party | script label |
|---|---|---|---|---|
DENIS |
BIRD_KEEPER |
6 | TRAINERTYPE_NORMAL: 18 SPEAROW, 20 FEAROW, 18 SPEAROW |
TrainerBirdKeeperDenis |
ERNEST |
SAILOR |
5 | TRAINERTYPE_NORMAL: 18 MACHOP, 18 MACHOP, 18 POLIWHIRL |
TrainerSailorErnest |
Note the party order: the asm has Denis as SPEAROW / FEAROW / SPEAROW; the walkthrough lists Spearow, Spearow, Fearow.
MAP_OLIVINE_LIGHTHOUSE_6F
Warps
| idx | x | y | destination map | dest warp |
|---|---|---|---|---|
| 1 | 9 | 15 | OLIVINE_LIGHTHOUSE_5F |
1 |
| 2 | 16 | 5 | OLIVINE_LIGHTHOUSE_5F |
6 |
| 3 | 17 | 5 | OLIVINE_LIGHTHOUSE_5F |
7 |
Coord events / BG events - none.
Object events
| const | sprite | x | y | movement | type | script label | event flag |
|---|---|---|---|---|---|---|---|
OLIVINELIGHTHOUSE6F_JASMINE |
SPRITE_JASMINE |
8 | 8 | SPRITEMOVEDATA_STANDING_DOWN |
OBJECTTYPE_SCRIPT |
OlivineLighthouseJasmine |
EVENT_OLIVINE_LIGHTHOUSE_JASMINE |
OLIVINELIGHTHOUSE6F_MONSTER |
SPRITE_MONSTER |
9 | 8 | SPRITEMOVEDATA_STANDING_DOWN |
OBJECTTYPE_SCRIPT |
OlivineLighthouseAmphy |
-1 |
OLIVINELIGHTHOUSE6F_POKE_BALL |
SPRITE_POKE_BALL |
3 | 4 | SPRITEMOVEDATA_STILL |
OBJECTTYPE_ITEMBALL |
OlivineLighthouse6FSuperPotion (itemball SUPER_POTION) |
EVENT_OLIVINE_LIGHTHOUSE_6F_SUPER_POTION |
EVENT_OLIVINE_LIGHTHOUSE_JASMINE is not set by
InitializeEventsScript, so Jasmine is visible from the start; the script's
own disappear sets it once she leaves.
Scripts of interest
OlivineLighthouseJasmine(pokegold.sym44:6ccd). Three arms:checkitem SECRETPOTION->.BroughtSecretpotion(the cure scene).- Otherwise
checkevent EVENT_JASMINE_EXPLAINED_AMPHYS_SICKNESS->.ExplainedSickness(short reminder text). - First visit:
writetext JasmineCianwoodPharmacyText,promptbutton,setevent EVENT_JASMINE_EXPLAINED_AMPHYS_SICKNESS, then the reminder. This flag is the whole point of the lighthouse climb: it is whatCianwoodPharmacistchecks before it will hand over the Secretpotion. .BroughtSecretpotion:yesorno(NO ->.Refused, nothing lost), thentakeitem SECRETPOTION, the healing cut-scene (playmusic MUSIC_HEAL,cry AMPHAROS,special FadeOutToWhite/FadeInFromWhite), thensetevent EVENT_JASMINE_RETURNED_TO_GYMandclearevent EVENT_OLIVINE_GYM_JASMINE(the latter un-masks her object inmaps/OlivineGym.asm;InitializeEventsScriptsets it atengine/events/std_scripts.asm:511). Finally it branches onreadvar VAR_FACING(DOWN / RIGHT / other) to pick one of three exit movement scripts anddisappear OLIVINELIGHTHOUSE6F_JASMINE.
OlivineLighthouseAmphy:checkevent EVENT_JASMINE_RETURNED_TO_GYMpicks the weak cry (special PlaySlowCry) or the healthy one.
Flags and events
| constant | defined in | read/written by | meaning for a bot |
|---|---|---|---|
EVENT_JASMINE_EXPLAINED_AMPHYS_SICKNESS |
constants/event_flags.asm:64 |
set by OlivineLighthouseJasmine, read by CianwoodPharmacist |
hard gate on the Secretpotion |
EVENT_JASMINE_RETURNED_TO_GYM |
constants/event_flags.asm:41 |
set after the cure | gates the Olivine Gym fight (section 09) |
EVENT_OLIVINE_GYM_JASMINE |
constants/event_flags.asm:1141 |
set by InitializeEventsScript, cleared here |
while set, Jasmine's gym object is masked |
EVENT_OLIVINE_LIGHTHOUSE_JASMINE |
constants/event_flags.asm:1140 |
set by disappear at the end |
removes her from 6F afterwards |
Items
| item | how obtained | source | one-time flag |
|---|---|---|---|
SUPER_POTION |
item ball at (3,4), west of Jasmine | OlivineLighthouse6FSuperPotion |
EVENT_OLIVINE_LIGHTHOUSE_6F_SUPER_POTION (constants/event_flags.asm:1033) |
MAP_ROUTE_40
- Script:
maps/Route40.asm - Blocks:
maps/Route40.blk - Header (
data/maps/maps.asm:442):map Route40, TILESET_JOHTO, ROUTE, LANDMARK_ROUTE_40, MUSIC_ROUTE_36, FALSE, PALETTE_AUTO, FISHGROUP_SHORE - Dimensions (
constants/map_constants.asm:409):map_const ROUTE_40, 10, 18(20x36 cells) - Connections (
data/maps/attributes.asm:223): southRoute41/ROUTE_41offset -15; eastOlivineCity/OLIVINE_CITYoffset -9 - Scene var: none
- Callback:
callback MAPCALLBACK_OBJECTS, Route40MonicaCallback
Warps - none. Route 40 is reached and left purely by map connections.
Coord events - none.
BG events
| x | y | type | script/item |
|---|---|---|---|
| 16 | 8 | BGEVENT_READ |
Route40Sign |
| 11 | 7 | BGEVENT_ITEM |
Route40HiddenHyperPotion -> hiddenitem HYPER_POTION, EVENT_ROUTE_40_HIDDEN_HYPER_POTION |
Object events
| const | sprite | x | y | movement | type | sight | script label | event flag |
|---|---|---|---|---|---|---|---|---|
ROUTE40_OLIVINE_RIVAL1 |
SPRITE_OLIVINE_RIVAL |
14 | 15 | SPRITEMOVEDATA_STANDING_RIGHT |
OBJECTTYPE_TRAINER |
4 | TrainerSwimmermSimon |
-1 |
ROUTE40_OLIVINE_RIVAL2 |
SPRITE_OLIVINE_RIVAL |
18 | 30 | SPRITEMOVEDATA_STANDING_LEFT |
OBJECTTYPE_TRAINER |
5 | TrainerSwimmermRandall |
-1 |
ROUTE40_SWIMMER_GIRL1 |
SPRITE_SWIMMER_GIRL |
3 | 19 | SPRITEMOVEDATA_STANDING_RIGHT |
OBJECTTYPE_TRAINER |
4 | TrainerSwimmerfElaine |
-1 |
ROUTE40_SWIMMER_GIRL2 |
SPRITE_SWIMMER_GIRL |
10 | 25 | SPRITEMOVEDATA_SPINCLOCKWISE |
OBJECTTYPE_TRAINER |
3 | TrainerSwimmerfPaula |
-1 |
ROUTE40_ROCK1 |
SPRITE_ROCK |
12 | 8 | SPRITEMOVEDATA_SMASHABLE_ROCK |
OBJECTTYPE_SCRIPT |
0 | Route40Rock (jumpstd SmashRockScript) |
-1 |
ROUTE40_ROCK2 |
SPRITE_ROCK |
11 | 7 | SPRITEMOVEDATA_SMASHABLE_ROCK |
OBJECTTYPE_SCRIPT |
0 | Route40Rock |
-1 |
ROUTE40_ROCK3 |
SPRITE_ROCK |
13 | 6 | SPRITEMOVEDATA_SMASHABLE_ROCK |
OBJECTTYPE_SCRIPT |
0 | Route40Rock |
-1 |
ROUTE40_LASS |
SPRITE_LASS |
13 | 10 | SPRITEMOVEDATA_STANDING_DOWN |
OBJECTTYPE_SCRIPT |
0 | Route40Lass1Script |
-1 |
ROUTE40_MONICA |
SPRITE_BEAUTY |
10 | 6 | SPRITEMOVEDATA_WALK_LEFT_RIGHT (radius 1,0) |
OBJECTTYPE_SCRIPT |
0 | MonicaScript |
EVENT_ROUTE_40_MONICA_OF_MONDAY |
Note ROCK2 and the hidden Hyper Potion share the cell (11,7): smash the rock,
then dig up the item.
Scripts of interest
Route40MonicaCallback(pokegold.sym4c:4ecf):readvar VAR_WEEKDAY / ifequal MONDAY, .MonicaAppears; otherwisedisappear ROUTE40_MONICA. Purely day-of-week.MonicaScript:checkevent EVENT_GOT_SHARP_BEAK_FROM_MONICA-> chat; elsereadvar VAR_WEEKDAY / ifnotequal MONDAY-> chat; elsesetevent EVENT_MET_MONICA_OF_MONDAY,verbosegiveitem SHARP_BEAK,setevent EVENT_GOT_SHARP_BEAK_FROM_MONICA.Route40Rock:jumpstd SmashRockScript->farsjump AskRockSmashScript(engine/events/std_scripts.asm:199).
Items
| item | how obtained | source | one-time flag |
|---|---|---|---|
HYPER_POTION |
hidden at (11,7) | Route40HiddenHyperPotion bg_event |
EVENT_ROUTE_40_HIDDEN_HYPER_POTION (constants/event_flags.asm:181) |
SHARP_BEAK |
talk to Monica at (10,6), Mondays only | MonicaScript |
EVENT_GOT_SHARP_BEAK_FROM_MONICA (:120) |
Neither is in the walkthrough.
Trainers
| const | class | id | party | script label |
|---|---|---|---|---|
SIMON |
SWIMMERM |
2 | TRAINERTYPE_NORMAL: 20 TENTACOOL, 20 TENTACOOL |
TrainerSwimmermSimon |
RANDALL |
SWIMMERM |
3 | TRAINERTYPE_NORMAL: 18 SHELLDER, 20 WARTORTLE, 18 SHELLDER |
TrainerSwimmermRandall |
ELAINE |
SWIMMERF |
1 | TRAINERTYPE_NORMAL: 21 STARYU |
TrainerSwimmerfElaine |
PAULA |
SWIMMERF |
2 | TRAINERTYPE_NORMAL: 19 STARYU, 19 SHELLDER |
TrainerSwimmerfPaula |
Wild encounters
- Water (
data/wild/johto_water.asm:163),def_water_wildmons ROUTE_40, rate6 percent: 20 TENTACOOL, 15 TENTACOOL, 20 TENTACRUEL. Same in Gold and Silver. - Fishing group
FISHGROUP_SHORE(data/maps/maps.asm:442). - Rock smash:
data/wild/treemon_maps.asm:45treemon_map ROUTE_40, TREEMON_SET_ROCK(in theRockMonMapstable).TreeMonSet_Rock(data/wild/treemons.asm:91): 90 KRABBY 15, 10 SHUCKLE 15. This is where the walkthrough's Shuckle for this stretch actually comes from, not from a water slot. - Headbutt:
data/wild/treemon_maps.asm:21TREEMON_SET_NONE.
MAP_ROUTE_41
- Script:
maps/Route41.asm - Blocks:
maps/Route41.blk - Header (
data/maps/maps.asm:443):map Route41, TILESET_JOHTO, ROUTE, LANDMARK_ROUTE_41, MUSIC_ROUTE_36, FALSE, PALETTE_AUTO, FISHGROUP_OCEAN - Dimensions (
constants/map_constants.asm:410):map_const ROUTE_41, 25, 27(50x54 cells) - Connections (
data/maps/attributes.asm:227): northRoute40/ROUTE_40offset 15; westCianwoodCity/CIANWOOD_CITYoffset 0 - Scene var: none, no callbacks
Warps (def_warp_events) - all four are the Whirl Islands, optional in
this section:
| idx | x | y | destination map | dest warp |
|---|---|---|---|---|
| 1 | 12 | 17 | WHIRL_ISLAND_NW |
1 |
| 2 | 36 | 19 | WHIRL_ISLAND_NE |
1 |
| 3 | 12 | 37 | WHIRL_ISLAND_SW |
1 |
| 4 | 36 | 45 | WHIRL_ISLAND_SE |
1 |
Coord events - none.
BG events
| x | y | type | script/item |
|---|---|---|---|
| 9 | 35 | BGEVENT_ITEM |
Route41HiddenMaxEther -> hiddenitem MAX_ETHER, EVENT_ROUTE_41_HIDDEN_MAX_ETHER |
Object events
| const | sprite | x | y | movement | type | sight | script label | event flag |
|---|---|---|---|---|---|---|---|---|
ROUTE41_OLIVINE_RIVAL1 |
SPRITE_OLIVINE_RIVAL |
32 | 6 | SPRITEMOVEDATA_SPINRANDOM_FAST |
OBJECTTYPE_TRAINER |
3 | TrainerSwimmermCharlie |
-1 |
ROUTE41_OLIVINE_RIVAL2 |
SPRITE_OLIVINE_RIVAL |
46 | 8 | SPRITEMOVEDATA_SPINRANDOM_FAST |
OBJECTTYPE_TRAINER |
3 | TrainerSwimmermGeorge |
-1 |
ROUTE41_OLIVINE_RIVAL3 |
SPRITE_OLIVINE_RIVAL |
20 | 26 | SPRITEMOVEDATA_SPINCOUNTERCLOCKWISE |
OBJECTTYPE_TRAINER |
3 | TrainerSwimmermBerke |
-1 |
ROUTE41_OLIVINE_RIVAL4 |
SPRITE_OLIVINE_RIVAL |
32 | 30 | SPRITEMOVEDATA_SPINCLOCKWISE |
OBJECTTYPE_TRAINER |
3 | TrainerSwimmermKirk |
-1 |
ROUTE41_OLIVINE_RIVAL5 |
SPRITE_OLIVINE_RIVAL |
19 | 46 | SPRITEMOVEDATA_SPINCOUNTERCLOCKWISE |
OBJECTTYPE_TRAINER |
3 | TrainerSwimmermMathew |
-1 |
ROUTE41_SWIMMER_GIRL1 |
SPRITE_SWIMMER_GIRL |
17 | 4 | SPRITEMOVEDATA_SPINRANDOM_FAST |
OBJECTTYPE_TRAINER |
3 | TrainerSwimmerfKaylee |
-1 |
ROUTE41_SWIMMER_GIRL2 |
SPRITE_SWIMMER_GIRL |
23 | 19 | SPRITEMOVEDATA_STANDING_UP |
OBJECTTYPE_TRAINER |
3 | TrainerSwimmerfSusie |
-1 |
ROUTE41_SWIMMER_GIRL3 |
SPRITE_SWIMMER_GIRL |
27 | 34 | SPRITEMOVEDATA_STANDING_LEFT |
OBJECTTYPE_TRAINER |
3 | TrainerSwimmerfDenise |
-1 |
ROUTE41_SWIMMER_GIRL4 |
SPRITE_SWIMMER_GIRL |
44 | 28 | SPRITEMOVEDATA_STANDING_RIGHT |
OBJECTTYPE_TRAINER |
4 | TrainerSwimmerfKara |
-1 |
ROUTE41_SWIMMER_GIRL5 |
SPRITE_SWIMMER_GIRL |
9 | 50 | SPRITEMOVEDATA_SPINRANDOM_FAST |
OBJECTTYPE_TRAINER |
2 | TrainerSwimmerfWendy |
-1 |
All ten are plain endifjustbattled after-battle scripts - no phone numbers,
no rematch tiers on this route.
Items
| item | how obtained | source | one-time flag |
|---|---|---|---|
MAX_ETHER |
hidden at (9,35) | Route41HiddenMaxEther |
EVENT_ROUTE_41_HIDDEN_MAX_ETHER (constants/event_flags.asm:182) |
Trainers
| const | class | id | party | script label |
|---|---|---|---|---|
CHARLIE |
SWIMMERM |
4 | 21 SHELLDER, 19 TENTACOOL, 19 TENTACRUEL | TrainerSwimmermCharlie |
GEORGE |
SWIMMERM |
5 | 16 TENTACOOL, 17 TENTACOOL, 16 TENTACOOL, 19 STARYU, 17 TENTACOOL, 19 REMORAID | TrainerSwimmermGeorge |
BERKE |
SWIMMERM |
6 | 23 QWILFISH | TrainerSwimmermBerke |
KIRK |
SWIMMERM |
7 | 20 GYARADOS, 20 GYARADOS | TrainerSwimmermKirk |
MATHEW |
SWIMMERM |
8 | 23 KRABBY | TrainerSwimmermMathew |
KAYLEE |
SWIMMERF |
3 | 18 GOLDEEN, 20 GOLDEEN, 20 SEAKING | TrainerSwimmerfKaylee |
SUSIE |
SWIMMERF |
4 | TRAINERTYPE_MOVES: 20 PSYDUCK (SCRATCH, TAIL_WHIP, DISABLE, CONFUSION), 22 GOLDEEN (PECK, TAIL_WHIP, SUPERSONIC, HORN_ATTACK) |
TrainerSwimmerfSusie |
DENISE |
SWIMMERF |
5 | 22 SEEL | TrainerSwimmerfDenise |
KARA |
SWIMMERF |
6 | 20 STARYU, 20 STARMIE | TrainerSwimmerfKara |
WENDY |
SWIMMERF |
7 | TRAINERTYPE_MOVES: 21 HORSEA (BUBBLE, SMOKESCREEN, LEER, WATER_GUN), 21 HORSEA (DRAGON_RAGE, SMOKESCREEN, LEER, WATER_GUN) |
TrainerSwimmerfWendy |
All except Kaylee are named by the walkthrough.
Wild encounters
- Water (
data/wild/johto_water.asm:170),def_water_wildmons ROUTE_41, rate6 percent. Gold: 20 TENTACOOL, 20 TENTACRUEL, 20 MANTINE. Silver: 20 TENTACOOL, 20 TENTACRUEL, 15 TENTACOOL. This is the one place in the section where the version split matters for the Pokedex. - Fishing group
FISHGROUP_OCEAN(data/maps/maps.asm:443). Good Rod (.Ocean_Good,data/wild/fish.asm:45): 35% MAGIKARP 20, 35% TENTACOOL 20, 20%+1 CHINCHOU 20, remaindertime_group 2= SHELLDER 20 day or night. - Headbutt:
TREEMON_SET_NONE. Rock smash: Route 41 is not inRockMonMaps, andRoute41Rockin the map asm is marked; unreferenced.
MAP_CIANWOOD_CITY
- Script:
maps/CianwoodCity.asm - Blocks:
maps/CianwoodCity.blk - Header (
data/maps/maps.asm:444):map CianwoodCity, TILESET_JOHTO, TOWN, LANDMARK_CIANWOOD_CITY, MUSIC_ECRUTEAK_CITY, FALSE, PALETTE_AUTO, FISHGROUP_SHORE - Dimensions (
constants/map_constants.asm:411):map_const CIANWOOD_CITY, 15, 27(30x54 cells) - Connections (
data/maps/attributes.asm:136): eastRoute41/ROUTE_41offset 0 - Scene var: none
- Callback:
callback MAPCALLBACK_NEWMAP, CianwoodCityFlypointCallback - Spawn (
data/maps/spawn_points.asm:32):spawn CIANWOOD_CITY, 23, 44. Fly pointLANDMARK_CIANWOOD_CITY->SPAWN_CIANWOOD(data/maps/flypoints.asm:12).
Warps (def_warp_events)
| idx | x | y | destination map | dest warp |
|---|---|---|---|---|
| 1 | 17 | 41 | MANIAS_HOUSE |
1 |
| 2 | 8 | 43 | CIANWOOD_GYM |
1 |
| 3 | 23 | 43 | CIANWOOD_POKECENTER_1F |
1 |
| 4 | 15 | 47 | CIANWOOD_PHARMACY |
1 |
| 5 | 9 | 31 | CIANWOOD_PHOTO_STUDIO |
1 |
| 6 | 15 | 37 | CIANWOOD_LUGIA_SPEECH_HOUSE |
1 |
The walkthrough's "To the left of the Pokémon Center is a house where a PokeManiac..." is Mania's House at (17,41), left of the Pokecenter at (23,43). "the building below that. It's the Pharmacy" is warp 4 at (15,47).
Coord events - none. Nothing scripted fires on entry.
BG events
| x | y | type | script/item |
|---|---|---|---|
| 20 | 34 | BGEVENT_READ |
CianwoodCitySign |
| 7 | 45 | BGEVENT_READ |
CianwoodGymSign |
| 24 | 43 | BGEVENT_READ |
CianwoodPokecenterSign |
| 19 | 47 | BGEVENT_READ |
CianwoodPharmacySign |
| 8 | 32 | BGEVENT_READ |
CianwoodPhotoStudioSign |
| 8 | 16 | BGEVENT_ITEM |
CianwoodCityHiddenRevive -> hiddenitem REVIVE, EVENT_CIANWOOD_CITY_HIDDEN_REVIVE |
| 5 | 29 | BGEVENT_ITEM |
CianwoodCityHiddenMaxEther -> hiddenitem MAX_ETHER, EVENT_CIANWOOD_CITY_HIDDEN_MAX_ETHER |
Object events
| const | sprite | x | y | movement | type | script label | event flag |
|---|---|---|---|---|---|---|---|
CIANWOODCITY_STANDING_YOUNGSTER |
SPRITE_YOUNGSTER |
21 | 37 | SPRITEMOVEDATA_WANDER (radius 2,2) |
OBJECTTYPE_SCRIPT |
CianwoodCityYoungster |
-1 |
CIANWOODCITY_POKEFAN_M |
SPRITE_POKEFAN_M |
17 | 31 | SPRITEMOVEDATA_SPINRANDOM_SLOW |
OBJECTTYPE_SCRIPT |
CianwoodCityPokefanM |
-1 |
CIANWOODCITY_LASS |
SPRITE_LASS |
14 | 42 | SPRITEMOVEDATA_WALK_UP_DOWN (radius 0,2) |
OBJECTTYPE_SCRIPT |
CianwoodCityLass |
-1 |
CIANWOODCITY_ROCK1 |
SPRITE_ROCK |
8 | 16 | SPRITEMOVEDATA_SMASHABLE_ROCK |
OBJECTTYPE_SCRIPT |
CianwoodCityRock |
-1 |
CIANWOODCITY_ROCK2 |
SPRITE_ROCK |
11 | 15 | SPRITEMOVEDATA_SMASHABLE_ROCK |
OBJECTTYPE_SCRIPT |
CianwoodCityRock |
-1 |
CIANWOODCITY_ROCK3 |
SPRITE_ROCK |
6 | 24 | SPRITEMOVEDATA_SMASHABLE_ROCK |
OBJECTTYPE_SCRIPT |
CianwoodCityRock |
-1 |
CIANWOODCITY_ROCK4 |
SPRITE_ROCK |
5 | 29 | SPRITEMOVEDATA_SMASHABLE_ROCK |
OBJECTTYPE_SCRIPT |
CianwoodCityRock |
-1 |
CIANWOODCITY_ROCK5 |
SPRITE_ROCK |
10 | 27 | SPRITEMOVEDATA_SMASHABLE_ROCK |
OBJECTTYPE_SCRIPT |
CianwoodCityRock |
-1 |
CIANWOODCITY_ROCK6 |
SPRITE_ROCK |
7 | 17 | SPRITEMOVEDATA_SMASHABLE_ROCK |
OBJECTTYPE_SCRIPT |
CianwoodCityRock |
-1 |
CIANWOODCITY_POKEFAN_F |
SPRITE_POKEFAN_F |
10 | 46 | SPRITEMOVEDATA_WALK_LEFT_RIGHT (radius 1,0) |
OBJECTTYPE_SCRIPT |
CianwoodCityChucksWife |
-1 |
Note both hidden items sit on rock cells: the Revive shares (8,16) with ROCK1, the Max Ether shares (5,29) with ROCK4.
Scripts of interest
CianwoodCityFlypointCallback(pokegold.sym48:58df):setflag ENGINE_FLYPOINT_CIANWOOD.CianwoodCityChucksWife(pokegold.sym48:58e3):checkevent EVENT_GOT_HM02_FLY-> chat; else printChucksWifeEasierToFlyText, thencheckevent EVENT_BEAT_CHUCK:- not set ->
ChucksWifeBeatChuckText, end. She will not hand over Fly before Chuck is beaten. - set ->
verbosegiveitem HM_FLY,setevent EVENT_GOT_HM02_FLY.
- not set ->
Flags and events
| constant | defined in | read/written by | meaning for a bot |
|---|---|---|---|
ENGINE_FLYPOINT_CIANWOOD |
constants/engine_flags.asm:83 |
CianwoodCityFlypointCallback |
set on arrival; also bumps Route 38 Dana's rematch tier |
EVENT_GOT_HM02_FLY |
constants/event_flags.asm:24 |
CianwoodCityChucksWife |
one-time |
EVENT_BEAT_CHUCK |
constants/event_flags.asm:711 |
set by CianwoodGymChuckScript |
precondition for HM02 |
EVENT_CIANWOOD_CITY_HIDDEN_REVIVE |
constants/event_flags.asm:188 |
CianwoodCityHiddenRevive |
one-time |
EVENT_CIANWOOD_CITY_HIDDEN_MAX_ETHER |
constants/event_flags.asm:189 |
CianwoodCityHiddenMaxEther |
one-time |
Items
| item | how obtained | source | one-time flag |
|---|---|---|---|
HM_FLY (HM02) |
talk to CIANWOODCITY_POKEFAN_F at (10,46) after EVENT_BEAT_CHUCK |
CianwoodCityChucksWife |
EVENT_GOT_HM02_FLY |
REVIVE |
hidden at (8,16) | CianwoodCityHiddenRevive |
EVENT_CIANWOOD_CITY_HIDDEN_REVIVE |
MAX_ETHER |
hidden at (5,29) | CianwoodCityHiddenMaxEther |
EVENT_CIANWOOD_CITY_HIDDEN_MAX_ETHER |
Wild encounters
- Water (
data/wild/johto_water.asm:232),def_water_wildmons CIANWOOD_CITY, rate6 percent: 20 TENTACOOL, 15 TENTACOOL, 20 TENTACRUEL. - Rock smash:
data/wild/treemon_maps.asm:44treemon_map CIANWOOD_CITY, TREEMON_SET_ROCK, i.e. the same 90 KRABBY 15 / 10 SHUCKLE 15 table as Route 40. Six smashable rocks are on the map. - Headbutt:
TREEMON_SET_NONE(data/wild/treemon_maps.asm:32). - Fishing group
FISHGROUP_SHORE.
MAP_MANIAS_HOUSE
- Script:
maps/ManiasHouse.asm - Header (
data/maps/maps.asm:445):map ManiasHouse, TILESET_HOUSE, INDOOR, LANDMARK_CIANWOOD_CITY, MUSIC_ECRUTEAK_CITY, FALSE, PALETTE_DAY, FISHGROUP_SHORE - Dimensions (
constants/map_constants.asm:412):map_const MANIAS_HOUSE, 4, 4 - Attributes (
data/maps/attributes.asm:651): no connections
Warps: 1 (2,7) -> CIANWOOD_CITY 1; 2 (3,7) -> CIANWOOD_CITY 1.
Coord events / BG events - none.
Object events
| const | sprite | x | y | movement | type | script label | event flag |
|---|---|---|---|---|---|---|---|
MANIASHOUSE_ROCKER |
SPRITE_ROCKER |
2 | 4 | SPRITEMOVEDATA_SPINRANDOM_SLOW |
OBJECTTYPE_SCRIPT |
ManiaScript |
-1 |
Scripts of interest
ManiaScript(pokegold.sym5d:4f6d):checkevent EVENT_MANIA_TOOK_SHUCKIE_OR_LET_YOU_KEEP_HIM-> happiness speech, done forever.checkevent EVENT_GOT_SHUCKIE->.alreadyhaveshuckie, which checkscheckflag ENGINE_GOT_SHUCKIE_TODAY(constants/engine_flags.asm:102); if that daily flag is clear he asks for Shuckie back (.returnshuckie).- First time:
writetext ManiaText_AskLookAfterShuckle,yesorno,special GiveShuckle(iffalse .partyfull), thensetevent EVENT_GOT_SHUCKIE. .returnshuckie:special ReturnShuckieand a five-wayifequalonSHUCKIE_WRONG_MON/SHUCKIE_REFUSED/SHUCKIE_HAPPY/SHUCKIE_FAINTED(constants inconstants/script_constants.asm).SHUCKIE_HAPPYis the "it likes you enough, keep it" arm the walkthrough's Thard_Verad note describes, and it also setsEVENT_MANIA_TOOK_SHUCKIE_OR_LET_YOU_KEEP_HIM.
Flags and events
| constant | defined in | read/written by | meaning for a bot |
|---|---|---|---|
EVENT_GOT_SHUCKIE |
constants/event_flags.asm:78 |
ManiaScript |
Shuckie is in your party |
EVENT_MANIA_TOOK_SHUCKIE_OR_LET_YOU_KEEP_HIM |
constants/event_flags.asm:79 |
.returnshuckie arms |
the encounter is finished |
ENGINE_GOT_SHUCKIE_TODAY |
constants/engine_flags.asm:102 |
daily flag, read by .alreadyhaveshuckie |
he will not ask for it back on the day you got it |
Items - Shuckie is a party member, not a bag item. A bot must have a free
party slot: GiveShuckle returns false and the script prints
ManiaText_PartyFull otherwise. This is what "clear a space so you can acquire
another Pokémon" means.
MAP_CIANWOOD_PHARMACY
- Script:
maps/CianwoodPharmacy.asm - Header (
data/maps/maps.asm:448):map CianwoodPharmacy, TILESET_HOUSE, INDOOR, LANDMARK_CIANWOOD_CITY, MUSIC_ECRUTEAK_CITY, FALSE, PALETTE_DAY, FISHGROUP_SHORE - Dimensions (
constants/map_constants.asm:415):map_const CIANWOOD_PHARMACY, 4, 4 - Attributes (
data/maps/attributes.asm:654): no connections - Scene scripts: one entry,
scene_script CianwoodPharmacyNoopScene ; unusable(a bareend, and no scene var row exists indata/maps/scenes.asm)
Warps: 1 (2,7) -> CIANWOOD_CITY 4; 2 (3,7) -> CIANWOOD_CITY 4.
BG events
| x | y | type | script/item |
|---|---|---|---|
| 0 | 1 | BGEVENT_READ |
CianwoodPharmacyBookshelf |
| 1 | 1 | BGEVENT_READ |
CianwoodPharmacyBookshelf |
Object events
| const | sprite | x | y | movement | type | script label | event flag |
|---|---|---|---|---|---|---|---|
CIANWOODPHARMACY_PHARMACIST |
SPRITE_PHARMACIST |
2 | 3 | SPRITEMOVEDATA_STANDING_DOWN |
OBJECTTYPE_SCRIPT |
CianwoodPharmacist |
-1 |
Scripts of interest
-
CianwoodPharmacist(pokegold.sym5d:5a9a):checkevent EVENT_GOT_SECRETPOTION_FROM_PHARMACY / iftrue .Mart, thencheckevent EVENT_JASMINE_EXPLAINED_AMPHYS_SICKNESS / iffalse .Mart. Only with that flag set does it rungiveitem SECRETPOTION,playsound SFX_KEY_ITEM,itemnotify,setevent EVENT_GOT_SECRETPOTION_FROM_PHARMACY. Otherwise it just opens the shop:pokemart MARTTYPE_PHARMACY, MART_CIANWOOD->MartCianwood(data/items/marts.asm:84): POTION, SUPER_POTION, HYPER_POTION, FULL_HEAL, REVIVE.Gate for a bot: you must talk to Jasmine on Lighthouse 6F before the pharmacist will give you anything. Skipping the lighthouse and sailing straight to Cianwood silently gets you a shop menu and no Secretpotion.
Items
| item | how obtained | source | one-time flag |
|---|---|---|---|
SECRETPOTION |
talk to the pharmacist with EVENT_JASMINE_EXPLAINED_AMPHYS_SICKNESS set |
CianwoodPharmacist |
EVENT_GOT_SECRETPOTION_FROM_PHARMACY (constants/event_flags.asm:44) |
MAP_CIANWOOD_PHOTO_STUDIO
- Script:
maps/CianwoodPhotoStudio.asm - Header (
data/maps/maps.asm:449):map CianwoodPhotoStudio, TILESET_HOUSE, INDOOR, LANDMARK_CIANWOOD_CITY, MUSIC_ECRUTEAK_CITY, FALSE, PALETTE_DAY, FISHGROUP_SHORE - Dimensions (
constants/map_constants.asm:416):map_const CIANWOOD_PHOTO_STUDIO, 4, 4 - Warps: 1 (2,7) ->
CIANWOOD_CITY5; 2 (3,7) ->CIANWOOD_CITY5. - Object:
CIANWOODPHOTOSTUDIO_FISHING_GURU,SPRITE_FISHING_GURU, (2,3),SPRITEMOVEDATA_STANDING_DOWN,OBJECTTYPE_SCRIPT,CianwoodPhotoStudioFishingGuruScript. CianwoodPhotoStudioFishingGuruScript:yesornothenspecial PhotoStudio. Purely optional (Game Boy Printer flavour); no flags, no items.
MAP_CIANWOOD_POKECENTER_1F
- Script:
maps/CianwoodPokecenter1F.asm - Header (
data/maps/maps.asm:447):map CianwoodPokecenter1F, TILESET_POKECENTER, INDOOR, LANDMARK_CIANWOOD_CITY, MUSIC_POKEMON_CENTER, FALSE, PALETTE_DAY, FISHGROUP_SHORE - Dimensions (
constants/map_constants.asm:414):map_const CIANWOOD_POKECENTER_1F, 5, 4
Warps: 1 (3,7) -> CIANWOOD_CITY 3; 2 (4,7) -> CIANWOOD_CITY 3;
3 (0,7) -> POKECENTER_2F 1.
Object events
| const | sprite | x | y | movement | type | script label |
|---|---|---|---|---|---|---|
CIANWOODPOKECENTER1F_NURSE |
SPRITE_NURSE |
3 | 1 | SPRITEMOVEDATA_STANDING_DOWN |
OBJECTTYPE_SCRIPT |
jumpstd PokecenterNurseScript |
CIANWOODPOKECENTER1F_LASS |
SPRITE_LASS |
1 | 5 | SPRITEMOVEDATA_WALK_UP_DOWN |
OBJECTTYPE_SCRIPT |
CianwoodPokecenter1FLassScript |
CIANWOODPOKECENTER1F_GYM_GUIDE |
SPRITE_GYM_GUIDE |
5 | 3 | SPRITEMOVEDATA_STANDING_DOWN |
OBJECTTYPE_SCRIPT |
CianwoodGymGuideScript |
CianwoodGymGuideScript branches on EVENT_BEAT_CHUCK. The gym guide lives in
the Pokecenter here, not inside the gym.
MAP_CIANWOOD_LUGIA_SPEECH_HOUSE
- Script:
maps/CianwoodLugiaSpeechHouse.asm - Header (
data/maps/maps.asm:450):map CianwoodLugiaSpeechHouse, TILESET_HOUSE, INDOOR, LANDMARK_CIANWOOD_CITY, MUSIC_ECRUTEAK_CITY, FALSE, PALETTE_DAY, FISHGROUP_SHORE - Dimensions (
constants/map_constants.asm:417):map_const CIANWOOD_LUGIA_SPEECH_HOUSE, 4, 4 - Warps: 1 (2,7) ->
CIANWOOD_CITY6; 2 (3,7) ->CIANWOOD_CITY6. - Objects:
CIANWOODLUGIASPEECHHOUSE_TEACHER(SPRITE_TEACHER, 2,4),..._LASS(SPRITE_LASS, 6,5,WALK_LEFT_RIGHT),..._TWIN(SPRITE_TWIN, 0,2). BG events: bookshelf at (0,1) and (1,1). Alljumptextfaceplayer- Lugia lore, no flags. Optional.
MAP_CIANWOOD_GYM
- Script:
maps/CianwoodGym.asm - Blocks:
maps/CianwoodGym.blk - Header (
data/maps/maps.asm:446):map CianwoodGym, TILESET_TOWER, INDOOR, LANDMARK_CIANWOOD_CITY, MUSIC_GYM, TRUE, PALETTE_DAY, FISHGROUP_SHORE(theTRUEis the phone-service flag) - Dimensions (
constants/map_constants.asm:413):map_const CIANWOOD_GYM, 5, 9(10x18 cells) - Attributes (
data/maps/attributes.asm:652): no connections - Scene var: none, no callbacks, no coord events
Warps (def_warp_events)
| idx | x | y | destination map | dest warp |
|---|---|---|---|---|
| 1 | 4 | 17 | CIANWOOD_CITY |
2 |
| 2 | 5 | 17 | CIANWOOD_CITY |
2 |
BG events
| x | y | type | script/item |
|---|---|---|---|
| 3 | 15 | BGEVENT_READ |
CianwoodGymStatue |
| 6 | 15 | BGEVENT_READ |
CianwoodGymStatue |
Object events
| const | sprite | x | y | movement | type | sight | script label | event flag |
|---|---|---|---|---|---|---|---|---|
CIANWOODGYM_CHUCK |
SPRITE_CHUCK |
4 | 1 | SPRITEMOVEDATA_STANDING_DOWN |
OBJECTTYPE_SCRIPT |
0 | CianwoodGymChuckScript |
-1 |
CIANWOODGYM_BLACK_BELT1 |
SPRITE_BLACK_BELT |
2 | 12 | SPRITEMOVEDATA_STANDING_RIGHT |
OBJECTTYPE_TRAINER |
3 | TrainerBlackbeltYoshi |
-1 |
CIANWOODGYM_BLACK_BELT2 |
SPRITE_BLACK_BELT |
7 | 12 | SPRITEMOVEDATA_STANDING_LEFT |
OBJECTTYPE_TRAINER |
3 | TrainerBlackbeltLao |
-1 |
CIANWOODGYM_BLACK_BELT3 |
SPRITE_BLACK_BELT |
3 | 9 | SPRITEMOVEDATA_STANDING_RIGHT |
OBJECTTYPE_TRAINER |
2 | TrainerBlackbeltNob |
-1 |
CIANWOODGYM_BLACK_BELT4 |
SPRITE_BLACK_BELT |
5 | 5 | SPRITEMOVEDATA_STANDING_LEFT |
OBJECTTYPE_TRAINER |
1 | TrainerBlackbeltLung |
-1 |
CIANWOODGYM_BOULDER1 |
SPRITE_BOULDER |
5 | 1 | SPRITEMOVEDATA_STRENGTH_BOULDER |
OBJECTTYPE_SCRIPT |
0 | CianwoodGymBoulder |
-1 |
CIANWOODGYM_BOULDER2 |
SPRITE_BOULDER |
3 | 7 | SPRITEMOVEDATA_STRENGTH_BOULDER |
OBJECTTYPE_SCRIPT |
0 | CianwoodGymBoulder |
-1 |
CIANWOODGYM_BOULDER3 |
SPRITE_BOULDER |
4 | 7 | SPRITEMOVEDATA_STRENGTH_BOULDER |
OBJECTTYPE_SCRIPT |
0 | CianwoodGymBoulder |
-1 |
CIANWOODGYM_BOULDER4 |
SPRITE_BOULDER |
5 | 7 | SPRITEMOVEDATA_STRENGTH_BOULDER |
OBJECTTYPE_SCRIPT |
0 | CianwoodGymBoulder |
-1 |
The puzzle the walkthrough describes is BOULDER2/BOULDER3/BOULDER4, the
row at y = 7, x = 3/4/5. BOULDER1 at (5,1) is Chuck's prop: he throws it as
part of his intro. Blackbelt Lung at (5,5) is behind the boulder row - the
walkthrough's "Use Strength to push your way to the last trainer before the gym
leader".
Scripts of interest
CianwoodGymChuckScript(pokegold.sym5d:5304):-
checkevent EVENT_BEAT_CHUCK / iftrue .FightDone. -
Intro:
writetext ChuckIntroText1,turnobject CIANWOODGYM_CHUCK, RIGHT,writetext ChuckIntroText2,applymovement CIANWOODGYM_BOULDER1, CianwoodGymMovement_ChuckChucksBoulder(set_sliding / big_step LEFT / big_step UP / fast_jump_step RIGHT / remove_sliding),playsound SFX_STRENGTH,earthquake 80,disappear CIANWOODGYM_BOULDER1,writetext ChuckIntroText3. -
winlosstext ChuckLossText, 0,loadtrainer CHUCK, CHUCK1,startbattle,reloadmapafterbattle,setevent EVENT_BEAT_CHUCK. -
writetext GetStormBadgeText,playsound SFX_GET_BADGE,setflag ENGINE_STORMBADGE, thenreadvar VAR_BADGES / scall CianwoodGymActivateRockets.CianwoodGymActivateRockets:ifequal 7, .RadioTowerRockets,ifequal 6, .GoldenrodRockets(jumpstd GoldenrodRocketsScript/RadioTowerRocketsScript). With Storm as your 5th badge neither fires; it only matters if you took Chuck out of order. -
.FightDone:checkevent EVENT_GOT_TM01_DYNAMICPUNCH / iftrue, elsesetevent EVENT_BEAT_BLACKBELT_YOSHI/..._LAO/..._NOB/..._LUNG, thenverbosegiveitem TM_DYNAMICPUNCHandsetevent EVENT_GOT_TM01_DYNAMICPUNCH.Bot-critical: collecting the TM marks all four Blackbelts as beaten. Fight them before Chuck or their EXP and money are gone.
-
CianwoodGymBoulder:jumpstd StrengthBoulderScript->farsjump AskStrengthScript(engine/events/std_scripts.asm:196,engine/events/overworld.asm:1001). That script callsTryStrengthOW(engine/events/overworld.asm:1038), which needs a party mon knowingSTRENGTHandENGINE_PLAINBADGE.CianwoodGymStatue:checkflag ENGINE_STORMBADGE->GymStatue2Scriptwithgettrainername STRING_BUFFER_4, CHUCK, CHUCK1, elseGymStatue1Script.
Flags and events
| constant | defined in | read/written by | meaning for a bot |
|---|---|---|---|
EVENT_BEAT_CHUCK |
constants/event_flags.asm:711 |
CianwoodGymChuckScript |
badge earned; unlocks HM02 from Chuck's wife |
ENGINE_STORMBADGE |
constants/engine_flags.asm:43 |
setflag after the win |
Fly's field gate (engine/events/overworld.asm:545), obedience up to L70 |
EVENT_GOT_TM01_DYNAMICPUNCH |
constants/event_flags.asm:16 |
.FightDone |
one-time |
EVENT_BEAT_BLACKBELT_YOSHI/LAO/NOB/LUNG |
constants/event_flags.asm |
set en masse by .FightDone |
see the warning above |
ENGINE_PLAINBADGE |
constants/engine_flags.asm:40 |
read by TryStrengthOW |
needed to shift the three boulders |
Items
| item | how obtained | source | one-time flag |
|---|---|---|---|
TM_DYNAMICPUNCH (TM01) |
talk to Chuck after the battle | CianwoodGymChuckScript.FightDone |
EVENT_GOT_TM01_DYNAMICPUNCH |
Trainers
| const | class | id | party | script label |
|---|---|---|---|---|
YOSHI |
BLACKBELT_T |
2 | TRAINERTYPE_MOVES: 27 HITMONLEE (DOUBLE_KICK, MEDITATE, JUMP_KICK, FOCUS_ENERGY) |
TrainerBlackbeltYoshi |
LAO |
BLACKBELT_T |
4 | TRAINERTYPE_MOVES: 27 HITMONCHAN (COMET_PUNCH, THUNDERPUNCH, ICE_PUNCH, FIRE_PUNCH) |
TrainerBlackbeltLao |
NOB |
BLACKBELT_T |
5 | TRAINERTYPE_MOVES: 25 MACHOP (LEER, FOCUS_ENERGY, KARATE_CHOP, SEISMIC_TOSS), 25 MACHOKE (LEER, KARATE_CHOP, SEISMIC_TOSS, ROCK_SLIDE) |
TrainerBlackbeltNob |
LUNG |
BLACKBELT_T |
7 | TRAINERTYPE_NORMAL: 23 MANKEY, 23 MANKEY, 25 PRIMEAPE |
TrainerBlackbeltLung |
CHUCK1 |
CHUCK |
1 | ChuckGroup, TRAINERTYPE_MOVES: 27 PRIMEAPE (LEER, RAGE, KARATE_CHOP, FURY_SWIPES), 30 POLIWRATH (HYPNOSIS, MIND_READER, SURF, DYNAMICPUNCH) |
CianwoodGymChuckScript |
Wild encounters - none (indoor).
3. Blockers and gates
| Gate | Enforced by (file:label) | Requirement | Unlock condition |
|---|---|---|---|
| Reaching Route 40's sea and therefore Route 41 / Cianwood | engine/events/overworld.asm:490 TrySurfOW and :340 SurfFunction.TrySurf - ld de, ENGINE_FOGBADGE / call CheckBadge |
Fog Badge + a party mon that knows SURF (CheckPartyMove) |
Fog Badge is Morty's, earned in section 07. HM03 SURF comes from the Route 42 / Sudowoodo beat |
| Cianwood Gym boulders at (3,7)/(4,7)/(5,7) | CianwoodGymBoulder -> jumpstd StrengthBoulderScript -> engine/events/overworld.asm:1001 AskStrengthScript / :1038 TryStrengthOW |
ENGINE_PLAINBADGE and a party mon knowing STRENGTH |
Plain Badge from Whitney (earlier section); HM04 from OlivineCafeStrengthSailorScript in this section |
| Secretpotion from the Cianwood pharmacist | maps/CianwoodPharmacy.asm:CianwoodPharmacist - checkevent EVENT_JASMINE_EXPLAINED_AMPHYS_SICKNESS / iffalse .Mart |
that flag | talk to Jasmine on MAP_OLIVINE_LIGHTHOUSE_6F (OlivineLighthouseJasmine) |
| HM02 Fly from Chuck's wife | maps/CianwoodCity.asm:CianwoodCityChucksWife - checkevent EVENT_BEAT_CHUCK |
Chuck beaten | CianwoodGymChuckScript |
| Using Fly in the field | engine/events/overworld.asm:545 FlyFunction.TryFly - ld de, ENGINE_STORMBADGE |
Storm Badge | the same gym win |
| Route 41 whirlpool tiles (Whirl Islands access only) | engine/events/overworld.asm:1077 WhirlpoolFunction.TryWhirlpool / :1171 TryWhirlpoolOW - ld de, ENGINE_GLACIERBADGE |
Glacier Badge + WHIRLPOOL |
Pryce, much later. Not required to reach Cianwood - the walkthrough's route only passes whirlpools, it never crosses one |
| Moomoo Farm berry feeding | maps/Route39Barn.asm:MoomooScript - checkevent EVENT_TALKED_TO_FARMER_ABOUT_MOOMOO |
talk to PokefanM_DairyFarmer first |
PokefanM_DairyFarmer sets it unconditionally |
| TM13 SNORE | maps/Route39Farmhouse.asm:FarmerFScript_GiveSnore - checkevent EVENT_HEALED_MOOMOO |
7 Berries fed to Moomoo | MoomooScript.SevenBerries |
| Shuckie | maps/ManiasHouse.asm:ManiaScript - special GiveShuckle returns false on a full party |
one free party slot | box a mon at the Pokecenter first |
| Olivine rival cut-scene | coord_event 13,12 / 13,13 gated on SCENE_OLIVINECITY_RIVAL_ENCOUNTER (wOlivineCitySceneID = 0) |
none - it is unavoidable if you walk those cells | setscene SCENE_OLIVINECITY_NOOP at the end of either scene script |
Nothing in this section blocks the walk into Olivine City or up the lighthouse. The only true forward gates are Surf (to leave Olivine westward), the Jasmine-then-pharmacist flag chain, and Strength for the gym boulders.
4. Bot checklist
Preconditions carried in from earlier sections: ENGINE_FOGBADGE,
ENGINE_PLAINBADGE, ENGINE_HIVEBADGE, a mon that can learn SURF, a mon
that can learn STRENGTH, and ideally a stack of BERRY for Moomoo.
| # | Map | Target | Intent | Precondition | Postcondition |
|---|---|---|---|---|---|
| 1 | ECRUTEAK_CITY |
warps 14/15 | walk in | - | on ROUTE_38_ECRUTEAK_GATE |
| 2 | ROUTE_38_ECRUTEAK_GATE |
warp 1 (0,4) or 2 (0,5) | walk west | - | on ROUTE_38 at (35,8)/(35,9) |
| 3 | ROUTE_38 |
ROUTE38_STANDING_YOUNGSTER2 (15,10) |
battle | - | EVENT_BEAT_BIRD_KEEPER_TOBY |
| 4 | ROUTE_38 |
ROUTE38_FRUIT_TREE (12,10) |
press A facing it | - | BERRY in bag |
| 5 | ROUTE_38 |
ROUTE38_SAILOR (25,5) |
battle | - | EVENT_BEAT_SAILOR_HARRY |
| 6 | ROUTE_38 |
ROUTE38_LASS (15,3) |
battle, then talk again, answer YES | - | EVENT_BEAT_LASS_DANA, PHONE_LASS_DANA registered |
| 7 | ROUTE_38 |
ROUTE38_BEAUTY (9,6) |
battle | - | EVENT_BEAT_BEAUTY_VALERIE |
| 8 | ROUTE_38 |
ROUTE38_STANDING_YOUNGSTER1 (4,1) |
battle, talk again for the number | - | EVENT_BEAT_SCHOOLBOY_CHAD |
| 9 | ROUTE_38 |
west edge | walk west (connection) | - | on ROUTE_39 |
| 10 | ROUTE_39 |
ROUTE39_PSYCHIC_NORMAN (13,6) |
battle | - | EVENT_BEAT_PSYCHIC_NORMAN |
| 11 | ROUTE_39 |
ROUTE39_FRUIT_TREE (9,3) |
press A | - | MINT_BERRY |
| 12 | ROUTE_39 |
(5,13) | press A (hidden) | - | NUGGET, EVENT_ROUTE_39_HIDDEN_NUGGET |
| 13 | ROUTE_39 |
warp 2 (5,3) -> farmhouse, ROUTE39FARMHOUSE_POKEFAN_M (3,2) |
talk | - | EVENT_TALKED_TO_FARMER_ABOUT_MOOMOO |
| 14 | ROUTE_39_BARN (via Route 39 warp 1 at (1,3)) |
ROUTE39BARN_MOOMOO (3,3) |
talk, YES, x7 with a BERRY each time |
step 13 done, 7 BERRY in bag |
wMooMooBerries = 7, EVENT_HEALED_MOOMOO |
| 15 | ROUTE_39_FARMHOUSE |
ROUTE39FARMHOUSE_POKEFAN_F (5,4) |
talk | EVENT_HEALED_MOOMOO |
TM_SNORE, EVENT_GOT_TM13_SNORE_FROM_MOOMOO_FARM |
| 16 | ROUTE_39 |
ROUTE39_POKEFAN_M (11,19), ROUTE39_POKEFAN_F (13,22), ROUTE39_SAILOR (13,29) |
battle each | - | three EVENT_BEAT_* |
| 17 | ROUTE_39 |
south edge | walk south (connection) | - | on OLIVINE_CITY, ENGINE_FLYPOINT_OLIVINE set by the NEWMAP callback |
| 18 | OLIVINE_CITY |
(13,12) or (13,13) | walk onto the cell | wOlivineCitySceneID == 0 |
rival scene runs; scene -> 1; SPRITE_OLIVINE_RIVAL re-pointed to SPRITE_SWIMMER_GUY |
| 19 | OLIVINE_CITY |
warp 6 (13,15) -> OLIVINEGOODRODHOUSE_FISHING_GURU (2,3) |
talk, answer YES | - | GOOD_ROD, EVENT_GOT_GOOD_ROD |
| 20 | OLIVINE_CITY |
warp 1 (13,21) | heal | - | party healed; spawn point already (13,22) |
| 21 | OLIVINE_CITY |
warp 7 (7,21) -> OLIVINECAFE_SAILOR (4,3) |
talk | - | HM_STRENGTH, EVENT_GOT_HM04_STRENGTH |
| 22 | (menu) | any eligible mon | teach STRENGTH from HM04 |
- | Strength usable once ENGINE_PLAINBADGE is held |
| 23 | OLIVINE_CITY |
warp 9 (29,27) | walk in | - | on OLIVINE_LIGHTHOUSE_1F |
| 24 | OLIVINE_LIGHTHOUSE_1F |
warp 3 (3,11) | stairs | - | OLIVINE_LIGHTHOUSE_2F (3,11) |
| 25 | OLIVINE_LIGHTHOUSE_2F |
..._GENTLEMAN (17,8), ..._SAILOR (9,3) |
battle both; talk to Huey again for his number | - | EVENT_BEAT_GENTLEMAN_ALFRED, EVENT_BEAT_SAILOR_HUEY |
| 26 | OLIVINE_LIGHTHOUSE_2F |
warp 2 (5,3) | stairs | - | OLIVINE_LIGHTHOUSE_3F (5,3) |
| 27 | OLIVINE_LIGHTHOUSE_3F |
..._YOUNGSTER (3,9), ..._GENTLEMAN (13,5) |
battle | - | EVENT_BEAT_BIRD_KEEPER_THEO, EVENT_BEAT_GENTLEMAN_PRESTON |
| 28 | OLIVINE_LIGHTHOUSE_3F |
warp 1 (13,3) | stairs | - | OLIVINE_LIGHTHOUSE_4F (13,3) |
| 29 | OLIVINE_LIGHTHOUSE_4F |
..._LASS (11,2), ..._SAILOR (7,14) |
battle | - | EVENT_BEAT_LASS_CONNIE, EVENT_BEAT_SAILOR_KENT |
| 30 | OLIVINE_LIGHTHOUSE_4F |
warp 2 (3,5) | stairs | - | OLIVINE_LIGHTHOUSE_5F (3,5) |
| 31 | OLIVINE_LIGHTHOUSE_5F |
item ball (2,13) | press A | - | TM_SWAGGER, EVENT_OLIVINE_LIGHTHOUSE_5F_TM_SWAGGER |
| 32 | OLIVINE_LIGHTHOUSE_5F |
(3,13) | press A (hidden) | - | HYPER_POTION |
| 33 | OLIVINE_LIGHTHOUSE_5F |
..._YOUNGSTER (8,3) |
battle | - | EVENT_BEAT_BIRD_KEEPER_DENIS |
| 34 | OLIVINE_LIGHTHOUSE_5F |
item ball (15,12) | press A | - | RARE_CANDY |
| 35 | OLIVINE_LIGHTHOUSE_5F |
warp 4 (16,7) | drop to 4F | - | OLIVINE_LIGHTHOUSE_4F (16,7) |
| 36 | OLIVINE_LIGHTHOUSE_4F |
warp 7 (8,3) or 8 (9,3) | drop to 3F | - | OLIVINE_LIGHTHOUSE_3F (8,3)/(9,3) |
| 37 | OLIVINE_LIGHTHOUSE_3F |
..._SAILOR (9,2) |
battle | - | EVENT_BEAT_SAILOR_TERRELL |
| 38 | OLIVINE_LIGHTHOUSE_3F |
item ball (8,2) | press A | - | ETHER |
| 39 | OLIVINE_LIGHTHOUSE_3F |
warp 1 (13,3), then 4F warp 2 (3,5) | back up to 5F | - | on 5F |
| 40 | OLIVINE_LIGHTHOUSE_5F |
..._SAILOR (8,11) |
battle | - | EVENT_BEAT_SAILOR_ERNEST |
| 41 | OLIVINE_LIGHTHOUSE_5F |
item ball (6,15) | press A | - | GREAT_BALL |
| 42 | OLIVINE_LIGHTHOUSE_5F |
warp 1 (9,15) | stairs | - | OLIVINE_LIGHTHOUSE_6F (9,15) |
| 43 | OLIVINE_LIGHTHOUSE_6F |
OLIVINELIGHTHOUSE6F_JASMINE (8,8) |
talk | no SECRETPOTION in bag |
EVENT_JASMINE_EXPLAINED_AMPHYS_SICKNESS |
| 44 | OLIVINE_LIGHTHOUSE_6F |
item ball (3,4) | press A | - | SUPER_POTION |
| 45 | OLIVINE_LIGHTHOUSE_6F .. 1F |
(16,5) -> (16,7) -> (16,9) -> (16,11) -> (16,13) | walk the right-wall drop chain | - | back on OLIVINE_LIGHTHOUSE_1F |
| 46 | OLIVINE_LIGHTHOUSE_1F |
warp 1 (10,17) | exit | - | OLIVINE_CITY (29,27) |
| 47 | OLIVINE_CITY |
warp 1 (13,21) | heal | - | - |
| 48 | (menu) | a water mon | teach SURF (HM03) |
HM03 in bag | Surf usable (ENGINE_FOGBADGE already held) |
| 49 | OLIVINE_CITY |
warp 8 (19,17) | buy GREAT_BALL etc. |
money | - |
| 50 | OLIVINE_CITY |
west edge | walk west (connection) | - | on ROUTE_40 |
| 51 | ROUTE_40 |
face the sea, press A / use SURF | start surfing | ENGINE_FOGBADGE + SURF |
PLAYER_SURF |
| 52 | ROUTE_40 |
(14,15), (3,19), (10,25), (18,30) | battle Simon, Elaine, Paula, Randall | - | four EVENT_BEAT_SWIMMER* |
| 53 | ROUTE_40 |
(11,7) rock then (11,7) hidden | Rock Smash, then press A | ROCK_SMASH |
HYPER_POTION; the rock roll can also yield 10% SHUCKLE 15 |
| 54 | ROUTE_40 |
south edge | swim south (connection) | - | on ROUTE_41 |
| 55 | ROUTE_41 |
(46,8) George, (44,28) Kara, (32,6) Charlie, (9,50) Wendy, (23,19) Susie, (20,26) Berke, (27,34) Denise, (32,30) Kirk, (19,46) Mathew, (17,4) Kaylee | battle as encountered | - | ten EVENT_BEAT_SWIMMER* |
| 56 | ROUTE_41 |
(9,35) | press A (hidden) | - | MAX_ETHER |
| 57 | ROUTE_41 |
west edge | swim west (connection) | - | on CIANWOOD_CITY; ENGINE_FLYPOINT_CIANWOOD set |
| 58 | CIANWOOD_CITY |
warp 3 (23,43) | heal, deposit a mon to free a party slot | - | party size < 6 |
| 59 | CIANWOOD_CITY |
warp 1 (17,41) -> MANIASHOUSE_ROCKER (2,4) |
talk, answer YES | free party slot | EVENT_GOT_SHUCKIE, L15 SHUCKLE "SHUCKIE" holding BERRY, OT MANIA |
| 60 | CIANWOOD_CITY |
warp 4 (15,47) -> CIANWOODPHARMACY_PHARMACIST (2,3) |
talk | EVENT_JASMINE_EXPLAINED_AMPHYS_SICKNESS |
SECRETPOTION, EVENT_GOT_SECRETPOTION_FROM_PHARMACY |
| 61 | CIANWOOD_CITY |
(8,16) and (5,29) | Rock Smash the rock, press A | ROCK_SMASH |
REVIVE, MAX_ETHER |
| 62 | CIANWOOD_CITY |
warp 2 (8,43) | enter gym | - | on CIANWOOD_GYM (4,17) |
| 63 | CIANWOOD_GYM |
(2,12) Yoshi, (7,12) Lao | battle both | - | EVENT_BEAT_BLACKBELT_YOSHI, ..._LAO |
| 64 | CIANWOOD_GYM |
(3,9) Nob | battle | - | EVENT_BEAT_BLACKBELT_NOB |
| 65 | CIANWOOD_GYM |
boulders at (3,7),(4,7),(5,7) | use Strength, push a lane open | ENGINE_PLAINBADGE + STRENGTH |
path north |
| 66 | CIANWOOD_GYM |
(5,5) Lung | battle | - | EVENT_BEAT_BLACKBELT_LUNG |
| 67 | CIANWOOD_CITY |
warp 3 | heal, save | - | - |
| 68 | CIANWOOD_GYM |
CIANWOODGYM_CHUCK (4,1) |
talk -> battle | all four blackbelts already beaten | EVENT_BEAT_CHUCK, ENGINE_STORMBADGE, 3000 gold |
| 69 | CIANWOOD_GYM |
CIANWOODGYM_CHUCK |
talk again | EVENT_BEAT_CHUCK |
TM_DYNAMICPUNCH, EVENT_GOT_TM01_DYNAMICPUNCH |
| 70 | CIANWOOD_CITY |
CIANWOODCITY_POKEFAN_F (10,46) |
talk | EVENT_BEAT_CHUCK |
HM_FLY, EVENT_GOT_HM02_FLY |
| 71 | (menu) | a flying-capable mon | teach FLY |
ENGINE_STORMBADGE |
fly available; section ends, next section flies back to Olivine |
5. Port coverage
The Gen 2 port is engine-level and data-driven: every map header, .blk,
warp/coord/bg/object table and script bytecode in this section is read out of
the ROM by src/import/RomExtractorGen2.lua (readMapEvents at lines 785-862,
map records written at 973-976) rather than hand-transcribed, so "implemented"
below means the opcodes and specials these particular scripts use are
implemented, not that anyone has walked the maps.
| Beat | Port file | Status |
|---|---|---|
| Map headers, warps, coord events, bg events, object events for all 21 maps | src/import/RomExtractorGen2.lua, src/world/gen2/Map.lua, src/world/gen2/World.lua |
implemented (generic, ROM-driven) |
MAPCALLBACK_NEWMAP fly-point callbacks (OlivineCityFlypointCallback, CianwoodCityFlypointCallback) |
src/world/gen2/World.lua, driver tests/drivers/gold_map_callbacks.lua |
implemented |
MAPCALLBACK_OBJECTS weekday callback (Route40MonicaCallback) |
src/world/gen2/World.lua + readvar VAR_WEEKDAY in src/script/gen2/Opcodes.lua |
implemented |
Scene scripts / setscene / coord-event trip-wires (the Olivine rival) |
src/world/gen2/World.lua (mapScenes, setScene, setMapScene), src/script/gen2/Vm.lua |
implemented |
Rival cut-scene opcodes: showemote, applymovement, appear/disappear, variablesprite, special LoadUsedSpritesGFX, special FadeOutMusic/RestartMapMusic |
src/script/gen2/Opcodes.lua, src/script/gen2/Movement.lua, src/script/gen2/Specials.lua |
implemented |
Trainer objects, sight ranges, loadtrainer/startbattle/winlosstext |
src/world/gen2/Trainers.lua, src/script/gen2/Vm.lua, driver tests/drivers/gold_trainer_smoke.lua |
implemented |
| Phone registration and rematch tiers (Dana, Chad, Derek, Huey) | src/core/gen2/Phone.lua; checkcellnum / askforphonenumber in src/script/gen2/Opcodes.lua |
implemented |
Item balls (OBJECTTYPE_ITEMBALL) and hidden items (BGEVENT_ITEM) |
src/world/gen2/World.lua (bg-event jumptable), src/world/gen2/HiddenItems.lua |
implemented |
Fruit trees (fruittree FRUITTREE_ROUTE_38/39) |
fruittree opcode in src/script/gen2/Opcodes.lua |
implemented |
Moomoo Farm berry counter (readmem/addval/writemem wMooMooBerries) |
src/script/gen2/Vm.lua:711 and :1657 (scriptMem), persisted by src/core/gen2/Save.lua:187 |
implemented - the port names this exact WRAM slot |
verbosegiveitem / giveitem / takeitem / checkitem / itemnotify (Good Rod, HM04, TM13, Secretpotion, HM02, TM01) |
src/script/gen2/Opcodes.lua |
implemented |
Moomoo Milk purchase (checkmoney / takemoney / giveitem) |
src/script/gen2/Opcodes.lua |
implemented |
Marts: MARTTYPE_STANDARD (MART_OLIVINE) and MARTTYPE_PHARMACY (MART_CIANWOOD) |
src/ui/gen2/MartMenu.lua (PHARMACY table at :212) |
implemented |
Shuckie: special GiveShuckle / special ReturnShuckie, OT MANIA id 518, happiness arms, ENGINE_GOT_SHUCKIE_TODAY |
src/script/gen2/Specials.lua:1191 onward |
implemented |
Cianwood photo studio special PhotoStudio |
src/script/gen2/Specials.lua:2122, src/ui/gen2/PhotoStudio.lua |
implemented |
Jasmine cure scene: special PlaySlowCry, special FadeOutToWhite/FadeInFromWhite, cry AMPHAROS, readvar VAR_FACING branch |
src/script/gen2/Specials.lua (998, 1000, 1079), src/script/gen2/Opcodes.lua |
implemented |
Surf field move + ENGINE_FOGBADGE gate |
src/world/gen2/FieldMoves.lua (surfFromMenu, TrySurfOW port), driver tests/drivers/gold_water_moves.lua (its WHIRL fixture is literally ROUTE_41 (22,11)) |
implemented |
Strength field move + ENGINE_PLAINBADGE gate + STRENGTH_BOULDER pushing |
src/world/gen2/FieldMoves.lua (strengthFromMenu, the 3-way TryStrengthOW result at :689), driver tests/drivers/gold_icepath_boulder.lua |
implemented |
Fly field move + ENGINE_STORMBADGE gate, fly points |
src/world/gen2/FieldMoves.lua:330 (flypoints.asm transcribed), :504 flyFromMenu |
implemented |
Whirlpool + ENGINE_GLACIERBADGE gate (Route 41 flavour, Whirl Islands) |
src/world/gen2/FieldMoves.lua:542, :625 |
implemented |
Badge award: setflag ENGINE_STORMBADGE, readvar VAR_BADGES, scall into GoldenrodRocketsScript/RadioTowerRocketsScript |
src/script/gen2/Opcodes.lua (setflag, checkflag), src/script/gen2/Vm.lua |
implemented |
Chuck's boulder throw: earthquake 80, set_sliding/big_step/fast_jump_step |
earthquake in src/script/gen2/Opcodes.lua, movement verbs in src/script/gen2/Movement.lua |
implemented |
| Water wild encounters for Route 40 / 41 / Olivine / Cianwood, Gold-vs-Silver Mantine split | src/battle/gen2/Encounter.lua, tables from RomExtractorGen2.lua |
implemented |
Good Rod fishing (FISHGROUP_SHORE / FISHGROUP_OCEAN, TimeFishGroups) |
src/battle/gen2/Encounter.lua (Encounter.fish), extractor readRod |
implemented |
Headbutt trees on Route 38/39 (TREEMON_SET_FOREST) |
src/battle/gen2/Encounter.lua:114 onward, RomExtractorGen2.lua:3780 |
implemented |
Rock Smash wild encounters (RockMonMaps -> TREEMON_SET_ROCK, i.e. Shuckle/Krabby on Route 40 and Cianwood City) |
src/script/gen2/CallAsm.lua:526 explicitly stubs RockMonEncounter with "ROCK SMASH has no field-move path yet; RockMonMaps is unported"; RomExtractorGen2.lua extracts TreeMonMaps only |
missing |
| Roaming / phone-call flavour beats the walkthrough mentions (Arnie, Liz, Todd, Mom's doll) | src/core/gen2/Phone.lua (incoming/special call machinery), src/core/gen2/MomShopping.lua |
implemented (generic); no per-call verification done for this section |
| Any driver that actually walks Route 38 -> Cianwood end to end | - | missing - no tests/drivers/gold_* covers this stretch. gold_water_moves.lua touches ROUTE_41 (22,11) only as a whirlpool fixture |
6. Unresolved / verify by hand
- "Beauty Olivia" on Route 38. The walkthrough says "Now move southward
now to face Beauty Olivia." There is no
OLIVIAinconstants/trainer_constants.asm(theBEAUTYclass runs VICTORIA, SAMANTHA, JULIE, JACLYN, BRENDA, CASSIE, CAROLINE, CARLENE, JESSICA, RACHAEL, ANGELICA, KENDRA, VERONICA, JULIA, THERESA, VALERIE), noOLIVIAstring indata/trainers/parties.asm, andmaps/Route38.asmhas exactly five trainer objects. This trainer does not exist in pokegold. - "#100 Voltorb" listed under "Pokémon found in Olivine City". Olivine
City has no grass encounter table at all, and its water table
(
data/wild/johto_water.asm:239) is TENTACOOL / TENTACOOL / TENTACRUEL. Voltorb is not reachable on this map by any table I could find. Unverified. - "#213 Shuckle" listed under Route 40 and Route 41. Route 40 is correct
but by Rock Smash, not by surfing:
data/wild/treemon_maps.asm:45puts it inRockMonMapswithTREEMON_SET_ROCK(10% SHUCKLE 15). Route 41 is not inRockMonMaps, hasTREEMON_SET_NONEfor headbutt, and itsRoute41Rockscript is marked; unreferencedin the asm. Shuckle appears unobtainable on Route 41. - Swimmer Charlie's second Pokemon. Walkthrough: "Level 21 Tentacool".
data/trainers/parties.asmSwimmerMGroup"CHARLIE" (SWIMMERM4) readsdb 21, SHELLDER / db 19, TENTACOOL / db 19, TENTACRUEL. Level 19, not 21. - Bird Keeper Denis's party order. Walkthrough lists Spearow, Spearow,
Fearow; the asm order is
18 SPEAROW / 20 FEAROW / 18 SPEAROW. - Swimmer Kaylee (
SWIMMERF3, 18 GOLDEEN / 20 GOLDEEN / 20 SEAKING) atROUTE_41(17,4) is a real trainer the walkthrough never mentions. - Whether the x = 16/17 lighthouse pairs are one-way holes or two-way
passages. The warp tables are symmetric (every pair points back at the
coordinates it came from), so warp data alone cannot tell you. Whichever it
is lives in the block collision for
TILESET_LIGHTHOUSEand the.blkfiles, which I did not decode. The walkthrough treats them as one-way drops and the geometry is consistent with that, but treat "can I climb back up through (16,7)?" as unverified. - "You can avoid fighting the next trainer" (Bird Keeper Theo, 3F). Theo
has sight range 3 at (3,9); whether a walkable lane exists outside that
cone depends on the 3F
.blk, not the object table. - The exact spot the walkthrough means by "Now, swim south onto Route 41"
and the "left side / right side" split. Route 41's two branches are
geometry in
maps/Route41.blk; the object coordinates above are the only hard data. A bot should path by trainer coordinates rather than by the prose. - Phone-call timing claims ("Arnie calls again", "Liz then calls you
about her Nidoran", "Todd will now call", "Mom calls saying she bought you
an adorable doll"). These come from
CheckPhoneCallinengine/overworld/time.asmplusdata/phone/*.asm, not from any script in these maps, and the walkthrough's own quoted note says the caller and topic are random. Nothing in this section's asm schedules them. - "3000G" from Chuck. Prize money is computed from the trainer class base
in
data/trainers/attributes.asmtimes the last mon's level, not written anywhere inmaps/CianwoodGym.asm. I did not verify the arithmetic. - "TM23" under "Items found in Olivine City". TM23 is Jasmine's gym
reward in
maps/OlivineGym.asm, which belongs to section 09; nothing onMAP_OLIVINE_CITYitself yields it.