mirror of
https://github.com/bryanthaboi/gen1recomp.git
synced 2026-08-14 23:31:27 +02:00
1633 lines
97 KiB
Markdown
1633 lines
97 KiB
Markdown
# 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 share `TILESET_GATE` layout)
|
|
- 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`): west `Route39` / `ROUTE_39` offset 0; east `EcruteakCity` / `ECRUTEAK_CITY` offset -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 opcode `fruittree FRUITTREE_ROUTE_38`.
|
|
`data/items/fruit_trees.asm:6` maps that index to `BERRY`. 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 prints
|
|
`LassDanaMoomooMilkText`, sets `EVENT_DANA_ASKED_FOR_PHONE_NUMBER`, and calls
|
|
`askforphonenumber PHONE_LASS_DANA`. The rematch arm picks the party by
|
|
progress: `checkevent EVENT_CLEARED_RADIO_TOWER` -> `LASS, DANA3`, else
|
|
`checkflag ENGINE_FLYPOINT_CIANWOOD` -> `LASS, DANA2`, else `LASS, DANA1`.
|
|
Note that flag: the moment a bot walks into Cianwood in this section, Dana's
|
|
rematch upgrades to `DANA2`.
|
|
- `TrainerSchoolboyChad1.Script`: same shape, `PHONE_SCHOOLBOY_CHAD`, rematch
|
|
tier keyed on `EVENT_CLEARED_RADIO_TOWER` -> `CHAD3`, else
|
|
`checkflag ENGINE_FLYPOINT_MAHOGANY` -> `CHAD2`, else `CHAD1`.
|
|
- Toby, Valerie and Harry are plain `endifjustbattled / opentext / writetext /
|
|
waitbutton / closetext / end` after-battle scripts. No flags beyond their own
|
|
`EVENT_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`): south `OlivineCity` / `OLIVINE_CITY` offset -5; east `Route38` / `ROUTE_38` offset 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 for
|
|
`PHONE_POKEFANM_DEREK`; rematch tier is `EVENT_BEAT_ELITE_FOUR` -> `DEREK3`,
|
|
else `checkflag ENGINE_FLYPOINT_LAKE_OF_RAGE` -> `DEREK2`, else `DEREK1`.
|
|
- 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.sym` 51:4c80). Control flow, verbatim from the
|
|
opcodes:
|
|
1. `checkevent EVENT_HEALED_MOOMOO` -> `.HappyCow` (just a cry) if set.
|
|
2. Otherwise print `MoomooWeakMooText`, `setval MILTANK`,
|
|
`special PlaySlowCry`, print `Route39BarnItsCryIsWeakText`.
|
|
3. `checkevent EVENT_TALKED_TO_FARMER_ABOUT_MOOMOO` -> `.GiveBerry`.
|
|
**This is the gate.** Until you have talked to
|
|
`PokefanM_DairyFarmer` in the farmhouse, the Miltank will not accept a
|
|
Berry at all.
|
|
4. `.GiveBerry`: `yesorno`, `checkitem BERRY`, `takeitem BERRY`,
|
|
`readmem wMooMooBerries`, `addval 1`, `writemem wMooMooBerries`, then
|
|
`ifequal 3` / `ifequal 5` / `ifequal 7` for the three progress texts.
|
|
At **7** berries it plays `MUSIC_HEAL` and
|
|
`setevent EVENT_HEALED_MOOMOO`.
|
|
- `Route39BarnTwin1Script` / `Route39BarnTwin2Script`: text only, branch on
|
|
`EVENT_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 prints `FarmerMText_SickCow` and
|
|
`setevent 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; else `yesorno`, `checkmoney YOUR_MONEY, 500`
|
|
(`DEF ROUTE39FARMHOUSE_MILK_PRICE EQU 500` at line 1),
|
|
`giveitem MOOMOO_MILK`, `takemoney YOUR_MONEY, 500`. One at a time.
|
|
- `PokefanF_SnoreFarmer` (`pokegold.sym` 51:4ee3):
|
|
`checkevent EVENT_GOT_TM13_SNORE_FROM_MOOMOO_FARM` -> speech only;
|
|
`checkevent EVENT_HEALED_MOOMOO` -> `verbosegiveitem TM_SNORE` then
|
|
`setevent 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`): north `Route39` / `ROUTE_39` offset 5; west `Route40` / `ROUTE_40` offset 9
|
|
- Scene var: `wOlivineCitySceneID` (`data/maps/scenes.asm:40`). Scene ids come
|
|
from the map's own `def_scene_scripts` block: `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 point `LANDMARK_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.sym` 49:400f): a single `setflag ENGINE_FLYPOINT_OLIVINE`.
|
|
Walking into Olivine at all registers the fly point.
|
|
- `OlivineCityRivalSceneTop` (`pokegold.sym` 49:4013) and
|
|
`OlivineCityRivalSceneBottom` (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.
|
|
The `variablesprite` at the end is load-bearing - it re-points the
|
|
`SPRITE_OLIVINE_RIVAL` slot at `SPRITE_SWIMMER_GUY`, which is why the Route 40
|
|
and Route 41 swimmers use `SPRITE_OLIVINE_RIVAL` in their `object_event` rows.
|
|
Movements: top variant approach `DOWN, RIGHT, RIGHT`, player steps
|
|
`DOWN` + `turn_head UP`, rival leaves `RIGHT x6, UP x6`. Bottom variant
|
|
approach `DOWN, DOWN, RIGHT, RIGHT`, player steps `UP` + `turn_head DOWN`,
|
|
rival leaves `RIGHT 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.sym` 51:46fc): `checkevent EVENT_GOT_GOOD_ROD` ->
|
|
already-got text; otherwise `writetext OfferGoodRodText`, `yesorno`,
|
|
**iffalse -> refusal, no item**, then `verbosegiveitem GOOD_ROD` and
|
|
`setevent 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.sym` 51:48a2):
|
|
`checkevent EVENT_GOT_HM04_STRENGTH` -> already-got text; else
|
|
`writetext 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_CITY` 8; 2 (3,7) -> `OLIVINE_CITY` 8.
|
|
- `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`, not `MUSIC_LIGHTHOUSE`
|
|
(`data/maps/maps.asm:117`).
|
|
- Dimensions (`constants/map_constants.asm:99-104`):
|
|
`map_const OLIVINE_LIGHTHOUSE_NF, 10, 9` for 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 for `PHONE_SAILOR_HUEY`
|
|
(`EVENT_HUEY_ASKED_FOR_PHONE_NUMBER`), rematch keyed on
|
|
`EVENT_BEAT_ELITE_FOUR` -> `HUEY3`, else `EVENT_CLEARED_RADIO_TOWER` ->
|
|
`HUEY2`, else `HUEY1`. 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.sym` 44:6ccd). Three arms:
|
|
1. `checkitem SECRETPOTION` -> `.BroughtSecretpotion` (the cure scene).
|
|
2. Otherwise `checkevent EVENT_JASMINE_EXPLAINED_AMPHYS_SICKNESS` ->
|
|
`.ExplainedSickness` (short reminder text).
|
|
3. 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 what
|
|
`CianwoodPharmacist` checks before it will hand over the Secretpotion.
|
|
4. `.BroughtSecretpotion`: `yesorno` (NO -> `.Refused`, nothing lost), then
|
|
`takeitem SECRETPOTION`, the healing cut-scene (`playmusic MUSIC_HEAL`,
|
|
`cry AMPHAROS`, `special FadeOutToWhite` / `FadeInFromWhite`), then
|
|
**`setevent EVENT_JASMINE_RETURNED_TO_GYM`** and
|
|
**`clearevent EVENT_OLIVINE_GYM_JASMINE`** (the latter un-masks her object
|
|
in `maps/OlivineGym.asm`; `InitializeEventsScript` sets it at
|
|
`engine/events/std_scripts.asm:511`). Finally it branches on
|
|
`readvar VAR_FACING` (DOWN / RIGHT / other) to pick one of three exit
|
|
movement scripts and `disappear OLIVINELIGHTHOUSE6F_JASMINE`.
|
|
- `OlivineLighthouseAmphy`: `checkevent EVENT_JASMINE_RETURNED_TO_GYM` picks
|
|
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`): south `Route41` / `ROUTE_41` offset -15; east `OlivineCity` / `OLIVINE_CITY` offset -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.sym` 4c:4ecf):
|
|
`readvar VAR_WEEKDAY / ifequal MONDAY, .MonicaAppears`; otherwise
|
|
`disappear ROUTE40_MONICA`. Purely day-of-week.
|
|
- `MonicaScript`: `checkevent EVENT_GOT_SHARP_BEAK_FROM_MONICA` -> chat;
|
|
else `readvar VAR_WEEKDAY / ifnotequal MONDAY` -> chat; else
|
|
`setevent 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`,
|
|
rate `6 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:45`
|
|
`treemon_map ROUTE_40, TREEMON_SET_ROCK` (in the `RockMonMaps` table).
|
|
`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:21` `TREEMON_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`): north `Route40` / `ROUTE_40` offset 15; west `CianwoodCity` / `CIANWOOD_CITY` offset 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`,
|
|
rate `6 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, remainder `time_group 2` = SHELLDER 20 day or night.
|
|
- Headbutt: `TREEMON_SET_NONE`. Rock smash: Route 41 is **not** in
|
|
`RockMonMaps`, and `Route41Rock` in 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`): east `Route41` / `ROUTE_41` offset 0
|
|
- Scene var: none
|
|
- Callback: `callback MAPCALLBACK_NEWMAP, CianwoodCityFlypointCallback`
|
|
- Spawn (`data/maps/spawn_points.asm:32`): `spawn CIANWOOD_CITY, 23, 44`.
|
|
Fly point `LANDMARK_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.sym` 48:58df):
|
|
`setflag ENGINE_FLYPOINT_CIANWOOD`.
|
|
- `CianwoodCityChucksWife` (`pokegold.sym` 48:58e3):
|
|
`checkevent EVENT_GOT_HM02_FLY` -> chat; else print
|
|
`ChucksWifeEasierToFlyText`, then `checkevent 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`.
|
|
|
|
**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`,
|
|
rate `6 percent`: 20 TENTACOOL, 15 TENTACOOL, 20 TENTACRUEL.
|
|
- Rock smash: `data/wild/treemon_maps.asm:44`
|
|
`treemon_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.sym` 5d:4f6d):
|
|
1. `checkevent EVENT_MANIA_TOOK_SHUCKIE_OR_LET_YOU_KEEP_HIM` -> happiness
|
|
speech, done forever.
|
|
2. `checkevent EVENT_GOT_SHUCKIE` -> `.alreadyhaveshuckie`, which checks
|
|
`checkflag ENGINE_GOT_SHUCKIE_TODAY` (`constants/engine_flags.asm:102`);
|
|
if that daily flag is clear he asks for Shuckie back
|
|
(`.returnshuckie`).
|
|
3. First time: `writetext ManiaText_AskLookAfterShuckle`, `yesorno`,
|
|
**`special GiveShuckle`** (`iffalse .partyfull`), then
|
|
`setevent EVENT_GOT_SHUCKIE`.
|
|
4. `.returnshuckie`: `special ReturnShuckie` and a five-way `ifequal` on
|
|
`SHUCKIE_WRONG_MON` / `SHUCKIE_REFUSED` / `SHUCKIE_HAPPY` /
|
|
`SHUCKIE_FAINTED` (constants in `constants/script_constants.asm`).
|
|
`SHUCKIE_HAPPY` is the "it likes you enough, keep it" arm the
|
|
walkthrough's Thard_Verad note describes, and it also sets
|
|
`EVENT_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 bare `end`, and no scene var row exists in `data/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.sym` 5d:5a9a):
|
|
`checkevent EVENT_GOT_SECRETPOTION_FROM_PHARMACY / iftrue .Mart`, then
|
|
**`checkevent EVENT_JASMINE_EXPLAINED_AMPHYS_SICKNESS / iffalse .Mart`**.
|
|
Only with that flag set does it run `giveitem 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_CITY` 5; 2 (3,7) -> `CIANWOOD_CITY` 5.
|
|
- Object: `CIANWOODPHOTOSTUDIO_FISHING_GURU`, `SPRITE_FISHING_GURU`, (2,3),
|
|
`SPRITEMOVEDATA_STANDING_DOWN`, `OBJECTTYPE_SCRIPT`,
|
|
`CianwoodPhotoStudioFishingGuruScript`.
|
|
- `CianwoodPhotoStudioFishingGuruScript`: `yesorno` then `special 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_CITY` 6; 2 (3,7) -> `CIANWOOD_CITY` 6.
|
|
- 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).
|
|
All `jumptextfaceplayer` - 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`
|
|
(the `TRUE` is 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.sym` 5d:5304):
|
|
1. `checkevent EVENT_BEAT_CHUCK / iftrue .FightDone`.
|
|
2. 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`.
|
|
3. `winlosstext ChuckLossText, 0`, `loadtrainer CHUCK, CHUCK1`,
|
|
`startbattle`, `reloadmapafterbattle`, `setevent EVENT_BEAT_CHUCK`.
|
|
4. `writetext GetStormBadgeText`, `playsound SFX_GET_BADGE`,
|
|
**`setflag ENGINE_STORMBADGE`**, then
|
|
`readvar 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.
|
|
5. `.FightDone`: `checkevent EVENT_GOT_TM01_DYNAMICPUNCH / iftrue`, else
|
|
**`setevent EVENT_BEAT_BLACKBELT_YOSHI` / `..._LAO` / `..._NOB` /
|
|
`..._LUNG`**, then `verbosegiveitem TM_DYNAMICPUNCH` and
|
|
`setevent 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 calls `TryStrengthOW`
|
|
(`engine/events/overworld.asm:1038`), which needs a party mon knowing
|
|
`STRENGTH` **and** `ENGINE_PLAINBADGE`.
|
|
- `CianwoodGymStatue`: `checkflag ENGINE_STORMBADGE` -> `GymStatue2Script` with
|
|
`gettrainername STRING_BUFFER_4, CHUCK, CHUCK1`, else `GymStatue1Script`.
|
|
|
|
**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
|
|
|
|
1. **"Beauty Olivia" on Route 38.** The walkthrough says "Now move southward
|
|
now to face Beauty Olivia." There is no `OLIVIA` in
|
|
`constants/trainer_constants.asm` (the `BEAUTY` class runs VICTORIA,
|
|
SAMANTHA, JULIE, JACLYN, BRENDA, CASSIE, CAROLINE, CARLENE, JESSICA,
|
|
RACHAEL, ANGELICA, KENDRA, VERONICA, JULIA, THERESA, VALERIE), no `OLIVIA`
|
|
string in `data/trainers/parties.asm`, and `maps/Route38.asm` has exactly
|
|
five trainer objects. This trainer does not exist in pokegold.
|
|
2. **"#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.
|
|
3. **"#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:45` puts it
|
|
in `RockMonMaps` with `TREEMON_SET_ROCK` (10% SHUCKLE 15). Route 41 is
|
|
**not** in `RockMonMaps`, has `TREEMON_SET_NONE` for headbutt, and its
|
|
`Route41Rock` script is marked `; unreferenced` in the asm. Shuckle appears
|
|
unobtainable on Route 41.
|
|
4. **Swimmer Charlie's second Pokemon.** Walkthrough: "Level 21 Tentacool".
|
|
`data/trainers/parties.asm` `SwimmerMGroup` "CHARLIE" (`SWIMMERM` 4) reads
|
|
`db 21, SHELLDER / db 19, TENTACOOL / db 19, TENTACRUEL`. Level 19, not 21.
|
|
5. **Bird Keeper Denis's party order.** Walkthrough lists Spearow, Spearow,
|
|
Fearow; the asm order is `18 SPEAROW / 20 FEAROW / 18 SPEAROW`.
|
|
6. **Swimmer Kaylee** (`SWIMMERF` 3, 18 GOLDEEN / 20 GOLDEEN / 20 SEAKING) at
|
|
`ROUTE_41` (17,4) is a real trainer the walkthrough never mentions.
|
|
7. **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_LIGHTHOUSE` and the `.blk`
|
|
files, 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.
|
|
8. **"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.
|
|
9. **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.
|
|
10. **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 `CheckPhoneCall` in
|
|
`engine/overworld/time.asm` plus `data/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.
|
|
11. **"3000G" from Chuck.** Prize money is computed from the trainer class base
|
|
in `data/trainers/attributes.asm` times the last mon's level, not written
|
|
anywhere in `maps/CianwoodGym.asm`. I did not verify the arithmetic.
|
|
12. **"TM23" under "Items found in Olivine City".** TM23 is Jasmine's gym
|
|
reward in `maps/OlivineGym.asm`, which belongs to section 09; nothing on
|
|
`MAP_OLIVINE_CITY` itself yields it.
|