mirror of
https://github.com/bryanthaboi/gen1recomp.git
synced 2026-08-14 23:31:27 +02:00
1509 lines
74 KiB
Markdown
1509 lines
74 KiB
Markdown
# Section 23 - Routes 11-19 and Fuchsia City Gym
|
|
|
|
Source: `../section-23-routes-11-19-and-fuchsia-city-gym.txt`
|
|
Maps covered: `MAP_ROUTE_12`, `MAP_ROUTE_11`, `MAP_ROUTE_12_SUPER_ROD_HOUSE`,
|
|
`MAP_ROUTE_13`, `MAP_ROUTE_14`, `MAP_ROUTE_15`, `MAP_ROUTE_15_FUCHSIA_GATE`,
|
|
`MAP_FUCHSIA_CITY`, `MAP_FUCHSIA_POKECENTER_1F`, `MAP_ROUTE_16`,
|
|
`MAP_ROUTE_16_GATE`, `MAP_ROUTE_16_FUCHSIA_SPEECH_HOUSE`, `MAP_ROUTE_17`,
|
|
`MAP_ROUTE_17_ROUTE_18_GATE`, `MAP_ROUTE_18`, `MAP_FUCHSIA_GYM`
|
|
|
|
Badges / key milestones in this section:
|
|
|
|
- `ENGINE_SOULBADGE` (Kanto badge 5) from `FuchsiaGymJanineScript` in `maps/FuchsiaGym.asm`
|
|
- `EVENT_GOT_TM06_TOXIC` -> `TM_TOXIC` (item id `$c5`, `constants/item_constants.asm:226`)
|
|
- `EVENT_GOT_SUPER_ROD` -> `SUPER_ROD` from `maps/Route12SuperRodHouse.asm`
|
|
- `ENGINE_FLYPOINT_FUCHSIA` armed on first entry to `MAP_FUCHSIA_CITY`
|
|
- Cycling Road forced-bike state (`ENGINE_ALWAYS_ON_BIKE`, `ENGINE_DOWNHILL`)
|
|
|
|
Despite the section title, the walkthrough text never enters `MAP_ROUTE_19`
|
|
(see "Unresolved").
|
|
|
|
---
|
|
|
|
## 1. Route order
|
|
|
|
| # | Map constant | asm file | Enter via | Leaves via | Why (walkthrough beat) |
|
|
|---|---|---|---|---|---|
|
|
| 1 | `MAP_ROUTE_12` | `maps/Route12.asm` | Fly to Lavender Town, walk south (`LavenderTown` south connection, `data/maps/attributes.asm:339`) | west connection to `ROUTE_11` (offset 9) | Fisher Kyle, Fisher Martin |
|
|
| 2 | `MAP_ROUTE_11` | `maps/Route11.asm` | east connection from `ROUTE_12` (offset -9) | back east to `ROUTE_12` | Herman / Owen / Jason / Fidel, Berry + hidden Revive; Snorlax dead end at the west connection |
|
|
| 3 | `MAP_ROUTE_12` | `maps/Route12.asm` | east connection from `ROUTE_11` | warp 1 at (11, 33) | Fisher Stephen, then the Super Rod house |
|
|
| 4 | `MAP_ROUTE_12_SUPER_ROD_HOUSE` | `maps/Route12SuperRodHouse.asm` | `Route12` warp 1 | warps 1/2 back to `ROUTE_12` warp 1 | Super Rod |
|
|
| 5 | `MAP_ROUTE_12` | `maps/Route12.asm` | house warp | south connection to `ROUTE_13` (offset -20) | Fisher Barney, cut tree, Calcium ball |
|
|
| 6 | `MAP_ROUTE_13` | `maps/Route13.asm` | north connection from `ROUTE_12` (offset 20) | south connection to `ROUTE_14` (offset 0) | Perry, Bret, Joshua, Alex, Kenny |
|
|
| 7 | `MAP_ROUTE_14` | `maps/Route14.asm` | north connection from `ROUTE_13` | west connection to `ROUTE_15` (offset 9) | Trevor, Kim's trade, Carter, Roy; cut trees |
|
|
| 8 | `MAP_ROUTE_15` | `maps/Route15.asm` | east connection from `ROUTE_14` (offset -9) | warps 1/2 at (2, 4)/(2, 5) | PP Up, then six schoolboys/teachers |
|
|
| 9 | `MAP_ROUTE_15_FUCHSIA_GATE` | `maps/Route15FuchsiaGate.asm` | `Route15` warps 1/2 | warps 1/2 to `FUCHSIA_CITY` warps 8/9 | pass-through gate, no check |
|
|
| 10 | `MAP_FUCHSIA_CITY` | `maps/FuchsiaCity.asm` | gate warps 8/9 at (37, 22)/(37, 23) | Fly out (`ENGINE_FLYPOINT_FUCHSIA` now set) | Burnt Berry tree, closed Safari Zone, Pokecenter |
|
|
| 11 | `MAP_ROUTE_16` | `maps/Route16.asm` | Fly to Celadon, west connection (offset 9 from `CeladonCity`) | warps 2/3 at (14, 6)/(14, 7) | optional Cut tree; Cycling Road entrance |
|
|
| 12 | `MAP_ROUTE_16_GATE` | `maps/Route16Gate.asm` | `Route16` warps 2/3 | warps 1/2 at (0, 4)/(0, 5) -> `ROUTE_16` warps 4/5 | BICYCLE check coord event |
|
|
| 13 | `MAP_ROUTE_17` | `maps/Route17.asm` | `Route16` north connection (offset 0) | warps 1/2 at (17, 82)/(17, 83) | Riley, Glenn, Joel, Charles; forced downhill bike |
|
|
| 14 | `MAP_ROUTE_17_ROUTE_18_GATE` | `maps/Route17Route18Gate.asm` | `Route17` warps 1/2 | warps 3/4 at (9, 4)/(9, 5) -> `ROUTE_18` warps 1/2 | BICYCLE check coord event |
|
|
| 15 | `MAP_ROUTE_18` | `maps/Route18.asm` | gate warps 3/4 | east connection to `FUCHSIA_CITY` (offset -7) | Bird Keeper Bob, Bird Keeper Boris |
|
|
| 16 | `MAP_FUCHSIA_CITY` | `maps/FuchsiaCity.asm` | west connection from `ROUTE_18` (offset 7) | warp 5 at (19, 27), then warp 3 at (8, 27) | heal, then gym |
|
|
| 17 | `MAP_FUCHSIA_GYM` | `maps/FuchsiaGym.asm` | `FuchsiaCity` warp 3 | warps 1/2 at (4, 17)/(5, 17) | four Janine impostors + Janine, SOULBADGE, TM06 |
|
|
|
|
Spill-over note: the walkthrough's own Route 12 pass reaches the west connection
|
|
of `MAP_ROUTE_11` and stops at the Vermilion Snorlax. `MAP_VERMILION_CITY` and
|
|
the Snorlax event belong to a different section; only the blocker is documented
|
|
here (section 3).
|
|
|
|
---
|
|
|
|
## 2. Maps
|
|
|
|
### MAP_ROUTE_12
|
|
|
|
- Script: `maps/Route12.asm`
|
|
- Blocks: `maps/Route12.blk`
|
|
- Header: `data/maps/maps.asm:379` -> `map Route12, TILESET_KANTO, ROUTE, LANDMARK_ROUTE_12, MUSIC_ROUTE_12, FALSE, PALETTE_AUTO, FISHGROUP_QWILFISH_NO_SWARM`
|
|
- Dimensions: `constants/map_constants.asm:350` -> `map_const ROUTE_12, 10, 27` (10x27 blocks = 20x54 walk cells)
|
|
- Attributes/connections: `data/maps/attributes.asm:328-331` -> `map_attributes Route12, ROUTE_12, $43`; north `LavenderTown` (0), south `Route13` (-20), west `Route11` (9)
|
|
|
|
**Warps** (`def_warp_events`)
|
|
|
|
| idx | x | y | destination map | dest warp |
|
|
|---|---|---|---|---|
|
|
| 1 | 11 | 33 | `ROUTE_12_SUPER_ROD_HOUSE` | 1 |
|
|
|
|
**Coord events** (`def_coord_events`)
|
|
|
|
None.
|
|
|
|
**BG events** (`def_bg_events`)
|
|
|
|
| x | y | type | script/item |
|
|
|---|---|---|---|
|
|
| 11 | 27 | `BGEVENT_READ` | `Route12Sign` |
|
|
| 13 | 9 | `BGEVENT_READ` | `FishingSpotSign` |
|
|
| 14 | 13 | `BGEVENT_ITEM` | `Route12HiddenElixer` -> `hiddenitem ELIXER, EVENT_ROUTE_12_HIDDEN_ELIXER` |
|
|
|
|
**Object events** (`def_object_events`) - `object_const_def` starts at 2 (`macros/scripts/maps.asm:9`), so `ROUTE12_FISHER1` = 2 ... `ROUTE12_POKE_BALL2` = 7
|
|
|
|
| const | sprite | x | y | movement | type | script label | event flag |
|
|
|---|---|---|---|---|---|---|---|
|
|
| `ROUTE12_FISHER1` (2) | `SPRITE_FISHER` | 5 | 15 | `STANDING_DOWN` | `OBJECTTYPE_TRAINER`, sight 3 | `TrainerFisherMartin` | -1 |
|
|
| `ROUTE12_FISHER2` (3) | `SPRITE_FISHER` | 15 | 28 | `STANDING_UP` | `OBJECTTYPE_TRAINER`, sight 1 | `TrainerFisherStephen` | -1 |
|
|
| `ROUTE12_FISHER3` (4) | `SPRITE_FISHER` | 13 | 39 | `STANDING_LEFT` | `OBJECTTYPE_TRAINER`, sight 3 | `TrainerFisherBarney` | -1 |
|
|
| `ROUTE12_FISHER4` (5) | `SPRITE_FISHER` | 6 | 6 | `STANDING_RIGHT` | `OBJECTTYPE_TRAINER`, sight 3 | `TrainerFisherKyle` | -1 |
|
|
| `ROUTE12_POKE_BALL1` (6) | `SPRITE_POKE_BALL` | 5 | 43 | `STILL` | `OBJECTTYPE_ITEMBALL` | `Route12Calcium` (`itemball CALCIUM`) | `EVENT_ROUTE_12_CALCIUM` |
|
|
| `ROUTE12_POKE_BALL2` (7) | `SPRITE_POKE_BALL` | 5 | 51 | `STILL` | `OBJECTTYPE_ITEMBALL` | `Route12Nugget` (`itemball NUGGET`) | `EVENT_ROUTE_12_NUGGET` |
|
|
|
|
**Cut trees** (block-level, not objects)
|
|
|
|
Scanned `maps/Route12.blk` against the `TILESET_KANTO` rows of
|
|
`data/collision/field_move_blocks.asm` (`CutTreeBlockPointers.kanto`), quadrant
|
|
taken from `data/tilesets/kanto_collision.asm`:
|
|
|
|
| block (bx, by) | block id | cut quadrant | walk cell to face |
|
|
|---|---|---|---|
|
|
| (3, 22) | `$35` | top-right | (7, 44) |
|
|
| (3, 24) | `$33` | bottom-right | (7, 49) |
|
|
|
|
The (7, 44) tree is the one guarding the Calcium ball at (5, 43).
|
|
|
|
**Scripts of interest**
|
|
|
|
- `TrainerFisherKyle` / `TrainerFisherMartin` / `TrainerFisherStephen` /
|
|
`TrainerFisherBarney` - each is a bare `trainer FISHER, <NAME>, EVENT_BEAT_*,
|
|
<seen>, <beaten>, 0, .Script`; `.Script` is `endifjustbattled / opentext /
|
|
writetext <after> / waitbutton / closetext / end`. No flags beyond the beat
|
|
event, no items, no movement.
|
|
- `Route12Calcium` / `Route12Nugget` - `itemball` rows; the object's own event
|
|
flag is what makes them one-shot.
|
|
- `Route12HiddenElixer` - `hiddenitem ELIXER, EVENT_ROUTE_12_HIDDEN_ELIXER`.
|
|
|
|
**Flags and events**
|
|
|
|
| constant | defined in | read/written by | meaning for a bot |
|
|
|---|---|---|---|
|
|
| `EVENT_BEAT_FISHER_KYLE` | `constants/event_flags.asm` | `TrainerFisherKyle` | trainer already beaten |
|
|
| `EVENT_BEAT_FISHER_MARTIN` | `constants/event_flags.asm` | `TrainerFisherMartin` | trainer already beaten |
|
|
| `EVENT_BEAT_FISHER_STEPHEN` | `constants/event_flags.asm` | `TrainerFisherStephen` | trainer already beaten |
|
|
| `EVENT_BEAT_FISHER_BARNEY` | `constants/event_flags.asm` | `TrainerFisherBarney` | trainer already beaten |
|
|
| `EVENT_ROUTE_12_CALCIUM` | `constants/event_flags.asm:1323` | itemball object | ball consumed |
|
|
| `EVENT_ROUTE_12_NUGGET` | `constants/event_flags.asm:1324` | itemball object | ball consumed |
|
|
| `EVENT_ROUTE_12_HIDDEN_ELIXER` | `constants/event_flags.asm:243` | `Route12HiddenElixer` | hidden item taken |
|
|
|
|
**Items**
|
|
|
|
| item | how obtained | source (label / bg_event / hidden) | one-time flag |
|
|
|---|---|---|---|
|
|
| `CALCIUM` | itemball behind the (7, 44) cut tree | `Route12Calcium` at object (5, 43) | `EVENT_ROUTE_12_CALCIUM` |
|
|
| `NUGGET` | itemball at (5, 51) | `Route12Nugget` | `EVENT_ROUTE_12_NUGGET` |
|
|
| `ELIXER` | hidden, face (14, 13) | `bg_event 14, 13, BGEVENT_ITEM` | `EVENT_ROUTE_12_HIDDEN_ELIXER` |
|
|
|
|
**Trainers**
|
|
|
|
| const | class | id | party (`data/trainers/parties.asm`) | script label | rematch/phone |
|
|
|---|---|---|---|---|---|
|
|
| `KYLE` | `FISHER` | Fisher (4) | L28 Seaking, L31 Poliwhirl, L31 Seaking | `TrainerFisherKyle` | none |
|
|
| `MARTIN` | `FISHER` | Fisher (13) | L32 Remoraid, L32 Remoraid | `TrainerFisherMartin` | none |
|
|
| `STEPHEN` | `FISHER` | Fisher (14) | L25 Magikarp, L25 Magikarp, L31 Qwilfish, L31 Tentacruel | `TrainerFisherStephen` | none |
|
|
| `BARNEY` | `FISHER` | Fisher (15) | L30 Gyarados x3 | `TrainerFisherBarney` | none |
|
|
|
|
All four are `TRAINERTYPE_NORMAL` (no custom moves/items). `FISHER` base reward
|
|
is 10 (`data/trainers/attributes.asm:223`).
|
|
|
|
**Wild encounters**
|
|
|
|
- Grass: **none**. `ROUTE_12` has no `def_grass_wildmons` row in
|
|
`data/wild/kanto_grass.asm`.
|
|
- Water (`data/wild/kanto_water.asm:33`): `def_water_wildmons ROUTE_12`,
|
|
6% rate - L25 Tentacool, L25 Quagsire, L25 Tentacruel (no time split; water
|
|
tables are single-slot-set).
|
|
- Fishing group `FISHGROUP_QWILFISH_NO_SWARM` (`data/wild/fish.asm:177-193`,
|
|
the `.Qwilfish_NoSwarm_*` labels alias `.Qwilfish_*`):
|
|
- Old: Magikarp 10 (70%+1), Magikarp 10 (85%+1), Tentacool 10
|
|
- Good: Magikarp 20 (35%), Tentacool 20 (70%), Tentacool 20 (90%+1), `time_group 20` = Tentacool 20 day / Tentacool 20 nite
|
|
- Super: Tentacool 40 (40%), `time_group 21` = Tentacool 40, Magikarp 40 (90%+1), Qwilfish 40
|
|
|
|
---
|
|
|
|
### MAP_ROUTE_11
|
|
|
|
- Script: `maps/Route11.asm`
|
|
- Blocks: `maps/Route11.blk`
|
|
- Header: `data/maps/maps.asm:295` -> `map Route11, TILESET_KANTO, ROUTE, LANDMARK_ROUTE_11, MUSIC_ROUTE_12, FALSE, PALETTE_AUTO, FISHGROUP_SHORE`
|
|
- Dimensions: `constants/map_constants.asm:272` -> `map_const ROUTE_11, 20, 9` (40x18 cells)
|
|
- Attributes/connections: `data/maps/attributes.asm:333-336` -> `$0f`; west `VermilionCity` (0), east `Route12` (-9)
|
|
|
|
**Warps** (`def_warp_events`)
|
|
|
|
None.
|
|
|
|
**Coord events** (`def_coord_events`)
|
|
|
|
None.
|
|
|
|
**BG events** (`def_bg_events`)
|
|
|
|
| x | y | type | script/item |
|
|
|---|---|---|---|
|
|
| 3 | 7 | `BGEVENT_READ` | `Route11Sign` |
|
|
| 32 | 5 | `BGEVENT_ITEM` | `Route11HiddenRevive` -> `hiddenitem REVIVE, EVENT_ROUTE_11_HIDDEN_REVIVE` |
|
|
|
|
**Object events** (`def_object_events`)
|
|
|
|
| const | sprite | x | y | movement | type | script label | event flag |
|
|
|---|---|---|---|---|---|---|---|
|
|
| `ROUTE11_YOUNGSTER1` (2) | `SPRITE_YOUNGSTER` | 22 | 14 | `SPINRANDOM_FAST` | `OBJECTTYPE_TRAINER`, sight 3 | `TrainerYoungsterOwen` | -1 |
|
|
| `ROUTE11_YOUNGSTER2` (3) | `SPRITE_YOUNGSTER` | 15 | 9 | `STANDING_DOWN` | `OBJECTTYPE_TRAINER`, sight 2 | `TrainerYoungsterJason` | -1 |
|
|
| `ROUTE11_YOUNGSTER3` (4) | `SPRITE_YOUNGSTER` | 29 | 7 | `STANDING_DOWN` | `OBJECTTYPE_TRAINER`, sight 1 | `TrainerPsychicHerman` | -1 |
|
|
| `ROUTE11_YOUNGSTER4` (5) | `SPRITE_YOUNGSTER` | 7 | 4 | `STANDING_LEFT` | `OBJECTTYPE_TRAINER`, sight 3 | `TrainerPsychicFidel` | -1 |
|
|
| `ROUTE11_FRUIT_TREE` (6) | `SPRITE_FRUIT_TREE` | 32 | 2 | `STILL` | `OBJECTTYPE_SCRIPT` | `Route11FruitTree` (`fruittree FRUITTREE_ROUTE_11`) | -1 |
|
|
|
|
Note the two `PSYCHIC_T` trainers wear `SPRITE_YOUNGSTER`, not a psychic sprite.
|
|
|
|
**Scripts of interest**
|
|
|
|
- `Route11FruitTree` - single `fruittree FRUITTREE_ROUTE_11`.
|
|
`data/items/fruit_trees.asm` gives index 24 (`$18`) = `BERRY`. Fruit trees
|
|
are day-tracked, not one-shot events.
|
|
- `Route11HiddenRevive` - `hiddenitem REVIVE, EVENT_ROUTE_11_HIDDEN_REVIVE`,
|
|
faced from cell (32, 5), directly below the fruit tree.
|
|
- The four trainer scripts are the plain `endifjustbattled` pattern.
|
|
|
|
**Flags and events**
|
|
|
|
| constant | defined in | read/written by | meaning for a bot |
|
|
|---|---|---|---|
|
|
| `EVENT_BEAT_YOUNGSTER_OWEN` | `constants/event_flags.asm` | `TrainerYoungsterOwen` | trainer beaten |
|
|
| `EVENT_BEAT_YOUNGSTER_JASON` | `constants/event_flags.asm` | `TrainerYoungsterJason` | trainer beaten |
|
|
| `EVENT_BEAT_PSYCHIC_HERMAN` | `constants/event_flags.asm` | `TrainerPsychicHerman` | trainer beaten |
|
|
| `EVENT_BEAT_PSYCHIC_FIDEL` | `constants/event_flags.asm` | `TrainerPsychicFidel` | trainer beaten |
|
|
| `EVENT_ROUTE_11_HIDDEN_REVIVE` | `constants/event_flags.asm:245` | `Route11HiddenRevive` | hidden item taken |
|
|
| `FRUITTREE_ROUTE_11` | `constants/script_constants.asm:230` | `Route11FruitTree` | fruit tree slot 24 |
|
|
|
|
**Items**
|
|
|
|
| item | how obtained | source | one-time flag |
|
|
|---|---|---|---|
|
|
| `BERRY` | talk to the tree object at (32, 2) | `Route11FruitTree` / `data/items/fruit_trees.asm` | none (daily tree, not an event flag) |
|
|
| `REVIVE` | hidden, face (32, 5) | `bg_event 32, 5, BGEVENT_ITEM` | `EVENT_ROUTE_11_HIDDEN_REVIVE` |
|
|
|
|
**Trainers**
|
|
|
|
| const | class | id | party | script label | rematch/phone |
|
|
|---|---|---|---|---|---|
|
|
| `HERMAN` | `PSYCHIC_T` | Psychic (3) | L30 Exeggcute, L30 Exeggcute, L30 Exeggutor | `TrainerPsychicHerman` | none |
|
|
| `OWEN` | `YOUNGSTER` | Youngster (11) | L35 Growlithe | `TrainerYoungsterOwen` | none |
|
|
| `JASON` | `YOUNGSTER` | Youngster (12) | L33 Sandslash, L33 Crobat | `TrainerYoungsterJason` | none |
|
|
| `FIDEL` | `PSYCHIC_T` | Psychic (4) | L34 Xatu | `TrainerPsychicFidel` | none |
|
|
|
|
Base rewards: `YOUNGSTER` 4 (`attributes.asm:133`), `PSYCHIC_T` 8 (`attributes.asm:313`).
|
|
|
|
**Wild encounters**
|
|
|
|
`data/wild/kanto_grass.asm:728` `def_grass_wildmons ROUTE_11`, 10%/10%/10%.
|
|
Morn, day and nite are the same seven slots:
|
|
L14 Drowzee, L15 Rattata, L15 Magnemite, L16 Drowzee, L16 Hypno, L16 Hypno, L16 Hypno.
|
|
|
|
No water table, no `def_grass_wildmons` time split. The walkthrough's species
|
|
list omits Magnemite.
|
|
|
|
---
|
|
|
|
### MAP_ROUTE_12_SUPER_ROD_HOUSE
|
|
|
|
- Script: `maps/Route12SuperRodHouse.asm`
|
|
- Header: `data/maps/maps.asm:391` -> `map Route12SuperRodHouse, TILESET_HOUSE, INDOOR, LANDMARK_ROUTE_12, MUSIC_VIRIDIAN_CITY, FALSE, PALETTE_DAY, FISHGROUP_SHORE`
|
|
- Dimensions: `constants/map_constants.asm:362` -> `map_const ROUTE_12_SUPER_ROD_HOUSE, 4, 4`
|
|
|
|
**Warps** (`def_warp_events`)
|
|
|
|
| idx | x | y | destination map | dest warp |
|
|
|---|---|---|---|---|
|
|
| 1 | 2 | 7 | `ROUTE_12` | 1 |
|
|
| 2 | 3 | 7 | `ROUTE_12` | 1 |
|
|
|
|
**Coord events** / **BG events**
|
|
|
|
None. (`SuperRodHouseBookshelf` exists in the file but is marked
|
|
`; unreferenced` - no bg_event points at it.)
|
|
|
|
**Object events**
|
|
|
|
| const | sprite | x | y | movement | type | script label | event flag |
|
|
|---|---|---|---|---|---|---|---|
|
|
| `ROUTE12SUPERRODHOUSE_FISHING_GURU` (2) | `SPRITE_FISHING_GURU` | 5 | 3 | `STANDING_DOWN` | `OBJECTTYPE_SCRIPT` | `Route12SuperRodHouseFishingGuruScript` | -1 |
|
|
|
|
**Scripts of interest**
|
|
|
|
`Route12SuperRodHouseFishingGuruScript` (`5d:4dc7` in
|
|
`pokegold-symbols/pokegold.sym`):
|
|
|
|
```
|
|
faceplayer / opentext
|
|
checkevent EVENT_GOT_SUPER_ROD
|
|
iftrue .GotSuperRod
|
|
writetext OfferSuperRodText
|
|
yesorno
|
|
iffalse .Refused ; "No" -> DontWantSuperRodText, closetext
|
|
writetext GiveSuperRodText
|
|
promptbutton
|
|
verbosegiveitem SUPER_ROD
|
|
iffalse .NoRoom ; bag full -> closetext, nothing set
|
|
setevent EVENT_GOT_SUPER_ROD
|
|
.GotSuperRod: writetext GaveSuperRodText / waitbutton / closetext / end
|
|
```
|
|
|
|
Bot-relevant: the `yesorno` must be answered **Yes**, and the KEY ITEMS pocket
|
|
must have room, or `EVENT_GOT_SUPER_ROD` never gets set and the script is
|
|
re-runnable.
|
|
|
|
**Flags and events**
|
|
|
|
| constant | defined in | read/written by | meaning for a bot |
|
|
|---|---|---|---|
|
|
| `EVENT_GOT_SUPER_ROD` | `constants/event_flags.asm:33` | `Route12SuperRodHouseFishingGuruScript` | Super Rod already handed over |
|
|
|
|
**Items**
|
|
|
|
| item | how obtained | source | one-time flag |
|
|
|---|---|---|---|
|
|
| `SUPER_ROD` | talk to guru, answer Yes | `Route12SuperRodHouseFishingGuruScript` | `EVENT_GOT_SUPER_ROD` |
|
|
|
|
**Trainers** / **Wild encounters**
|
|
|
|
None.
|
|
|
|
---
|
|
|
|
### MAP_ROUTE_13
|
|
|
|
- Script: `maps/Route13.asm`
|
|
- Blocks: `maps/Route13.blk`
|
|
- Header: `data/maps/maps.asm:361` -> `map Route13, TILESET_KANTO, ROUTE, LANDMARK_ROUTE_13, MUSIC_ROUTE_12, FALSE, PALETTE_AUTO, FISHGROUP_QWILFISH_NO_SWARM`
|
|
- Dimensions: `constants/map_constants.asm:333` -> `map_const ROUTE_13, 30, 9` (60x18 cells)
|
|
- Attributes/connections: `data/maps/attributes.asm:324-326` -> `$43`; north `Route12` (20), south `Route14` (0)
|
|
|
|
**Warps** / **Coord events**
|
|
|
|
None.
|
|
|
|
**BG events** (`def_bg_events`)
|
|
|
|
| x | y | type | script/item |
|
|
|---|---|---|---|
|
|
| 29 | 13 | `BGEVENT_READ` | `Route13TrainerTips` ("Look! Right there, at the left side of the post.") |
|
|
| 41 | 11 | `BGEVENT_READ` | `Route13Sign` |
|
|
| 17 | 13 | `BGEVENT_READ` | `Route13DirectionsSign` |
|
|
| 30 | 13 | `BGEVENT_ITEM` | `Route13HiddenCalcium` -> `hiddenitem CALCIUM, EVENT_ROUTE_13_HIDDEN_CALCIUM` |
|
|
|
|
**Object events** (`def_object_events`)
|
|
|
|
| const | sprite | x | y | movement | type | script label | event flag |
|
|
|---|---|---|---|---|---|---|---|
|
|
| `ROUTE13_YOUNGSTER1` (2) | `SPRITE_YOUNGSTER` | 42 | 6 | `STANDING_DOWN` | `OBJECTTYPE_TRAINER`, sight 2 | `TrainerBirdKeeperPerry` | -1 |
|
|
| `ROUTE13_YOUNGSTER2` (3) | `SPRITE_YOUNGSTER` | 43 | 6 | `STANDING_DOWN` | `OBJECTTYPE_TRAINER`, sight 2 | `TrainerBirdKeeperBret` | -1 |
|
|
| `ROUTE13_POKEFAN_M1` (4) | `SPRITE_POKEFAN_M` | 32 | 8 | `STANDING_LEFT` | `OBJECTTYPE_TRAINER`, sight 3 | `TrainerPokefanmJoshua` | -1 |
|
|
| `ROUTE13_POKEFAN_M2` (5) | `SPRITE_POKEFAN_M` | 14 | 10 | `STANDING_LEFT` | `OBJECTTYPE_TRAINER`, sight 4 | `TrainerHikerKenny` | -1 |
|
|
| `ROUTE13_POKEFAN_M3` (6) | `SPRITE_POKEFAN_M` | 25 | 6 | `STANDING_RIGHT` | `OBJECTTYPE_TRAINER`, sight 4 | `TrainerPokefanmAlex` | -1 |
|
|
|
|
Kenny is class `HIKER` but wears `SPRITE_POKEFAN_M`.
|
|
|
|
**Cut trees**
|
|
|
|
`maps/Route13.blk` block (22, 2) = `$34` (`CUT_TREE` in the top-left quadrant)
|
|
-> face walk cell (44, 4). Not mentioned by the walkthrough.
|
|
|
|
**Scripts of interest**
|
|
|
|
All five trainers use the plain `trainer <CLASS>, <NAME>, EVENT_BEAT_*, ...` +
|
|
`endifjustbattled` pattern. `Route13HiddenCalcium` is the only item.
|
|
|
|
**Flags and events**
|
|
|
|
| constant | defined in | read/written by | meaning for a bot |
|
|
|---|---|---|---|
|
|
| `EVENT_BEAT_BIRD_KEEPER_PERRY` | `constants/event_flags.asm` | `TrainerBirdKeeperPerry` | trainer beaten |
|
|
| `EVENT_BEAT_BIRD_KEEPER_BRET` | `constants/event_flags.asm` | `TrainerBirdKeeperBret` | trainer beaten |
|
|
| `EVENT_BEAT_POKEFANM_JOSHUA` | `constants/event_flags.asm` | `TrainerPokefanmJoshua` | trainer beaten |
|
|
| `EVENT_BEAT_POKEFANM_ALEX` | `constants/event_flags.asm` | `TrainerPokefanmAlex` | trainer beaten |
|
|
| `EVENT_BEAT_HIKER_KENNY` | `constants/event_flags.asm` | `TrainerHikerKenny` | trainer beaten |
|
|
| `EVENT_ROUTE_13_HIDDEN_CALCIUM` | `constants/event_flags.asm:244` | `Route13HiddenCalcium` | hidden item taken |
|
|
|
|
**Items**
|
|
|
|
| item | how obtained | source | one-time flag |
|
|
|---|---|---|---|
|
|
| `CALCIUM` | hidden, face (30, 13) (the sign at (29, 13) points at it) | `bg_event 30, 13, BGEVENT_ITEM` | `EVENT_ROUTE_13_HIDDEN_CALCIUM` |
|
|
|
|
**Trainers**
|
|
|
|
| const | class | id | party | script label | rematch/phone |
|
|
|---|---|---|---|---|---|
|
|
| `PERRY` | `BIRD_KEEPER` | BirdKeeper (15) | L34 Farfetch'd | `TrainerBirdKeeperPerry` | none |
|
|
| `BRET` | `BIRD_KEEPER` | BirdKeeper (16) | L32 Pidgeotto, L32 Fearow | `TrainerBirdKeeperBret` | none |
|
|
| `JOSHUA` | `POKEFANM` | PokefanM (4), `TRAINERTYPE_ITEM` | L23 Pikachu x6, each holding `BERRY` | `TrainerPokefanmJoshua` | none |
|
|
| `ALEX` | `POKEFANM` | PokefanM (12), `TRAINERTYPE_ITEM` | L29 Nidoking/`BERRY`, L29 Slowking/`BERRY`, L29 Seaking/`BERRY` | `TrainerPokefanmAlex` | none |
|
|
| `KENNY` | `HIKER` | Hiker (16) | L27 Sandslash, L29 Graveler, L31 Golem, L29 Graveler | `TrainerHikerKenny` | none |
|
|
|
|
Base rewards: `BIRD_KEEPER` 6, `POKEFANM` 20, `HIKER` 8.
|
|
|
|
**Wild encounters**
|
|
|
|
`data/wild/kanto_grass.asm:756` `def_grass_wildmons ROUTE_13`, 10%/10%/10%,
|
|
`_GOLD` arm:
|
|
|
|
- morn: L23 Nidorina, L23 Nidorino, L25 Pidgeotto, L22 Hoppip, L24 Hoppip, L22 Quagsire, L25 Chansey
|
|
- day: L23 Nidorina, L23 Nidorino, L25 Pidgeotto, L22 Hoppip, L24 Hoppip, L24 Hoppip, L25 Chansey
|
|
- nite: L23 Nidorina, L23 Nidorino, L25 Noctowl, L22 Quagsire, L24 Quagsire, L24 Quagsire, L25 Chansey
|
|
|
|
(`_SILVER` swaps the Nidorina/Nidorino order.)
|
|
|
|
Water: `data/wild/kanto_water.asm:40` `def_water_wildmons ROUTE_13`, 6% -
|
|
L25 Tentacool, L25 Quagsire, L25 Tentacruel. Fishing group
|
|
`FISHGROUP_QWILFISH_NO_SWARM` (same table as Route 12).
|
|
|
|
---
|
|
|
|
### MAP_ROUTE_14
|
|
|
|
- Script: `maps/Route14.asm`
|
|
- Blocks: `maps/Route14.blk`
|
|
- Header: `data/maps/maps.asm:362` -> `map Route14, TILESET_KANTO, ROUTE, LANDMARK_ROUTE_14, MUSIC_ROUTE_12, FALSE, PALETTE_AUTO, FISHGROUP_SHORE`
|
|
- Dimensions: `constants/map_constants.asm:334` -> `map_const ROUTE_14, 10, 18` (20x36 cells)
|
|
- Attributes/connections: `data/maps/attributes.asm:320-322` -> `$43`; north `Route13` (0), west `Route15` (9)
|
|
|
|
**Warps** / **Coord events** / **BG events**
|
|
|
|
None (all three tables are empty).
|
|
|
|
**Object events** (`def_object_events`)
|
|
|
|
| const | sprite | x | y | movement | type | script label | event flag |
|
|
|---|---|---|---|---|---|---|---|
|
|
| `ROUTE14_POKEFAN_M1` (2) | `SPRITE_POKEFAN_M` | 12 | 14 | `STANDING_RIGHT` | `OBJECTTYPE_TRAINER`, sight 4 | `TrainerPokefanmCarter` | -1 |
|
|
| `ROUTE14_YOUNGSTER` (3) | `SPRITE_YOUNGSTER` | 11 | 27 | `SPINRANDOM_FAST` | `OBJECTTYPE_TRAINER`, sight 3 | `TrainerBirdKeeperRoy` | -1 |
|
|
| `ROUTE14_POKEFAN_M2` (4) | `SPRITE_POKEFAN_M` | 5 | 9 | `STANDING_RIGHT` | `OBJECTTYPE_TRAINER`, sight 4 | `TrainerPokefanmTrevor` | -1 |
|
|
| `ROUTE14_KIM` (5) | `SPRITE_TEACHER` | 7 | 5 | `WALK_LEFT_RIGHT` (radius 1,0) | `OBJECTTYPE_SCRIPT`, sight 4 | `Kim` | -1 |
|
|
|
|
**Cut trees**
|
|
|
|
From `maps/Route14.blk` against `CutTreeBlockPointers.kanto`:
|
|
|
|
| block (bx, by) | block id | cut quadrant | walk cell to face |
|
|
|---|---|---|---|
|
|
| (2, 4) | `$35` | top-right | (5, 8) |
|
|
| (5, 7) | `$35` | top-right | (11, 14) |
|
|
| (1, 12) | `$35` | top-right | (3, 24) |
|
|
|
|
(5, 8) is directly above Trevor at (5, 9) and opens the pocket that holds Kim.
|
|
(11, 14) sits beside Carter at (12, 14). (3, 24) is the tree on the way to the
|
|
west connection to Route 15.
|
|
|
|
**Scripts of interest**
|
|
|
|
- `Kim` - `faceplayer / opentext / trade NPC_TRADE_KIM / waitbutton / closetext /
|
|
end`. `NPC_TRADE_KIM` is 5 (`constants/npc_trade_constants.asm:22`);
|
|
`data/events/npc_trades.asm:19` ->
|
|
`npctrade TRADE_DIALOGSET_NEWBIE, CHANSEY, AERODACTYL, "AEROY", $96, $66, GOLD_BERRY, 26491, "KIM", TRADE_GENDER_EITHER`.
|
|
You hand over **Chansey**, you receive **Aerodactyl** nicknamed AEROY holding
|
|
`GOLD_BERRY`, OT KIM / ID 26491, DVs `$96`/`$66`. One-shot, tracked in
|
|
`wTradeFlags` by trade id, not by an `EVENT_*`.
|
|
- The three trainer scripts are the plain pattern.
|
|
|
|
**Flags and events**
|
|
|
|
| constant | defined in | read/written by | meaning for a bot |
|
|
|---|---|---|---|
|
|
| `EVENT_BEAT_POKEFANM_CARTER` | `constants/event_flags.asm` | `TrainerPokefanmCarter` | trainer beaten |
|
|
| `EVENT_BEAT_BIRD_KEEPER_ROY` | `constants/event_flags.asm` | `TrainerBirdKeeperRoy` | trainer beaten |
|
|
| `EVENT_BEAT_POKEFANM_TREVOR` | `constants/event_flags.asm` | `TrainerPokefanmTrevor` | trainer beaten |
|
|
| `NPC_TRADE_KIM` | `constants/npc_trade_constants.asm:22` | `Kim` | trade slot 5, stored in `wTradeFlags` |
|
|
|
|
**Items**
|
|
|
|
None on this map.
|
|
|
|
**Trainers**
|
|
|
|
| const | class | id | party | script label | rematch/phone |
|
|
|---|---|---|---|---|---|
|
|
| `TREVOR` | `POKEFANM` | PokefanM (6), `TRAINERTYPE_ITEM` | L33 Psyduck/`BERRY` | `TrainerPokefanmTrevor` | none |
|
|
| `CARTER` | `POKEFANM` | PokefanM (5), `TRAINERTYPE_ITEM` | L29 Bulbasaur/`BERRY`, L29 Charmander/`BERRY`, L29 Squirtle/`BERRY` | `TrainerPokefanmCarter` | none |
|
|
| `ROY` | `BIRD_KEEPER` | BirdKeeper (9) | L29 Fearow, L35 Fearow | `TrainerBirdKeeperRoy` | none |
|
|
|
|
**Wild encounters**
|
|
|
|
`data/wild/kanto_grass.asm:811` `def_grass_wildmons ROUTE_14`, 10%/10%/10%,
|
|
`_GOLD` arm:
|
|
|
|
- morn: L23 Nidorina, L23 Nidorino, L25 Pidgeotto, L24 Hoppip, L26 Skiploom, L22 Quagsire, L25 Chansey
|
|
- day: L23 Nidorina, L23 Nidorino, L25 Pidgeotto, L24 Hoppip, L26 Skiploom, L26 Skiploom, L25 Chansey
|
|
- nite: L23 Nidorina, L23 Nidorino, L25 Noctowl, L22 Quagsire, L24 Quagsire, L24 Quagsire, L25 Chansey
|
|
|
|
No water table for `ROUTE_14`. Fishing group `FISHGROUP_SHORE`.
|
|
|
|
---
|
|
|
|
### MAP_ROUTE_15
|
|
|
|
- Script: `maps/Route15.asm`
|
|
- Blocks: `maps/Route15.blk`
|
|
- Header: `data/maps/maps.asm:363` -> `map Route15, TILESET_KANTO, ROUTE, LANDMARK_ROUTE_15, MUSIC_ROUTE_12, FALSE, PALETTE_AUTO, FISHGROUP_SHORE`
|
|
- Dimensions: `constants/map_constants.asm:335` -> `map_const ROUTE_15, 20, 9` (40x18 cells)
|
|
- Attributes/connections: `data/maps/attributes.asm:316-318` -> `$0f`; west `FuchsiaCity` (-9), east `Route14` (-9)
|
|
|
|
**Warps** (`def_warp_events`)
|
|
|
|
| idx | x | y | destination map | dest warp |
|
|
|---|---|---|---|---|
|
|
| 1 | 2 | 4 | `ROUTE_15_FUCHSIA_GATE` | 3 |
|
|
| 2 | 2 | 5 | `ROUTE_15_FUCHSIA_GATE` | 4 |
|
|
|
|
**Coord events**
|
|
|
|
None.
|
|
|
|
**BG events**
|
|
|
|
| x | y | type | script/item |
|
|
|---|---|---|---|
|
|
| 19 | 9 | `BGEVENT_READ` | `Route15Sign` (documented lowercase-"Route 15" bug, `maps/Route15.asm:196`) |
|
|
|
|
**Object events** (`def_object_events`)
|
|
|
|
| const | sprite | x | y | movement | type | script label | event flag |
|
|
|---|---|---|---|---|---|---|---|
|
|
| `ROUTE15_YOUNGSTER1` (2) | `SPRITE_YOUNGSTER` | 11 | 10 | `STANDING_UP` | `OBJECTTYPE_TRAINER`, sight 2 | `TrainerSchoolboyKipp` | -1 |
|
|
| `ROUTE15_YOUNGSTER2` (3) | `SPRITE_YOUNGSTER` | 11 | 11 | `STANDING_LEFT` | `OBJECTTYPE_TRAINER`, sight 4 | `TrainerSchoolboyTommy` | -1 |
|
|
| `ROUTE15_YOUNGSTER3` (4) | `SPRITE_YOUNGSTER` | 33 | 10 | `STANDING_DOWN` | `OBJECTTYPE_TRAINER`, sight 3 | `TrainerSchoolboyJohnny` | -1 |
|
|
| `ROUTE15_YOUNGSTER4` (5) | `SPRITE_YOUNGSTER` | 27 | 10 | `STANDING_DOWN` | `OBJECTTYPE_TRAINER`, sight 3 | `TrainerSchoolboyBilly` | -1 |
|
|
| `ROUTE15_TEACHER1` (6) | `SPRITE_TEACHER` | 30 | 12 | `STANDING_UP` | `OBJECTTYPE_TRAINER`, sight 4 | `TrainerTeacherColette` | -1 |
|
|
| `ROUTE15_TEACHER2` (7) | `SPRITE_TEACHER` | 16 | 10 | `STANDING_DOWN` | `OBJECTTYPE_TRAINER`, sight 3 | `TrainerTeacherHillary` | -1 |
|
|
| `ROUTE15_POKE_BALL` (8) | `SPRITE_POKE_BALL` | 12 | 5 | `STILL` | `OBJECTTYPE_ITEMBALL` | `Route15PPUp` (`itemball PP_UP`) | `EVENT_ROUTE_15_PP_UP` |
|
|
|
|
**Cut trees**
|
|
|
|
None. `maps/Route15.blk` contains no `TILESET_KANTO` cut-tree block
|
|
(`$32`/`$33`/`$34`/`$35`/`$60`). See "Unresolved".
|
|
|
|
**Scripts of interest**
|
|
|
|
All six trainers are the plain pattern. `Route15PPUp` is `itemball PP_UP`.
|
|
|
|
Walkthrough fight order maps to: Johnny (33, 10) -> Colette (30, 12) ->
|
|
Billy (27, 10) -> Hillary (16, 10) -> Tommy (11, 11) -> Kipp (11, 10),
|
|
i.e. east to west along row y=10.
|
|
|
|
**Flags and events**
|
|
|
|
| constant | defined in | read/written by | meaning for a bot |
|
|
|---|---|---|---|
|
|
| `EVENT_BEAT_SCHOOLBOY_JOHNNY` | `constants/event_flags.asm` | `TrainerSchoolboyJohnny` | trainer beaten |
|
|
| `EVENT_BEAT_TEACHER_COLETTE` | `constants/event_flags.asm` | `TrainerTeacherColette` | trainer beaten |
|
|
| `EVENT_BEAT_SCHOOLBOY_BILLY` | `constants/event_flags.asm` | `TrainerSchoolboyBilly` | trainer beaten |
|
|
| `EVENT_BEAT_TEACHER_HILLARY` | `constants/event_flags.asm` | `TrainerTeacherHillary` | trainer beaten |
|
|
| `EVENT_BEAT_SCHOOLBOY_TOMMY` | `constants/event_flags.asm` | `TrainerSchoolboyTommy` | trainer beaten |
|
|
| `EVENT_BEAT_SCHOOLBOY_KIP` | `constants/event_flags.asm` | `TrainerSchoolboyKipp` | trainer beaten (note the flag drops the second "p") |
|
|
| `EVENT_ROUTE_15_PP_UP` | `constants/event_flags.asm:1325` | itemball object | ball consumed |
|
|
|
|
**Items**
|
|
|
|
| item | how obtained | source | one-time flag |
|
|
|---|---|---|---|
|
|
| `PP_UP` | itemball at (12, 5) | `Route15PPUp` | `EVENT_ROUTE_15_PP_UP` |
|
|
|
|
**Trainers**
|
|
|
|
| const | class | id | party | script label | rematch/phone |
|
|
|---|---|---|---|---|---|
|
|
| `JOHNNY` | `SCHOOLBOY` | Schoolboy (4) | L29 Bellsprout, L31 Weepinbell, L33 Victreebel | `TrainerSchoolboyJohnny` | none |
|
|
| `COLETTE` | `TEACHER` | Teacher (1) | L36 Clefairy | `TrainerTeacherColette` | none |
|
|
| `BILLY` | `SCHOOLBOY` | Schoolboy (9) | L27 Paras, L27 Paras, L27 Poliwhirl, L35 Ditto | `TrainerSchoolboyBilly` | none |
|
|
| `HILLARY` | `TEACHER` | Teacher (2) | L32 Aipom, L36 Cubone | `TrainerTeacherHillary` | none |
|
|
| `TOMMY` | `SCHOOLBOY` | Schoolboy (6) | L32 Xatu, L34 Alakazam | `TrainerSchoolboyTommy` | none |
|
|
| `KIPP` | `SCHOOLBOY` | Schoolboy (2) | L27 Voltorb, L27 Magnemite, L31 Voltorb, L31 Magneton | `TrainerSchoolboyKipp` | none |
|
|
|
|
Base rewards: `SCHOOLBOY` 8, `TEACHER` 18.
|
|
|
|
**Wild encounters**
|
|
|
|
`data/wild/kanto_grass.asm:866` `def_grass_wildmons ROUTE_15`, 10%/10%/10%,
|
|
`_GOLD` arm:
|
|
|
|
- morn: L23 Nidorina, L23 Nidorino, L25 Pidgeotto, L22 Hoppip, L24 Hoppip, L22 Quagsire, L25 Chansey
|
|
- day: L23 Nidorina, L23 Nidorino, L25 Pidgeotto, L22 Hoppip, L24 Hoppip, L24 Hoppip, L25 Chansey
|
|
- nite: L23 Nidorina, L23 Nidorino, L25 Noctowl, L22 Quagsire, L24 Quagsire, L24 Quagsire, L25 Chansey
|
|
|
|
---
|
|
|
|
### MAP_ROUTE_15_FUCHSIA_GATE
|
|
|
|
- Script: `maps/Route15FuchsiaGate.asm`
|
|
- Header: `data/maps/maps.asm:373` -> `map Route15FuchsiaGate, TILESET_GATE, GATE, LANDMARK_ROUTE_15, MUSIC_ROUTE_12, FALSE, PALETTE_DAY, FISHGROUP_SHORE`
|
|
- Dimensions: `constants/map_constants.asm:345` -> `map_const ROUTE_15_FUCHSIA_GATE, 5, 4`
|
|
|
|
**Warps** (`def_warp_events`)
|
|
|
|
| idx | x | y | destination map | dest warp |
|
|
|---|---|---|---|---|
|
|
| 1 | 0 | 4 | `FUCHSIA_CITY` | 8 |
|
|
| 2 | 0 | 5 | `FUCHSIA_CITY` | 9 |
|
|
| 3 | 9 | 4 | `ROUTE_15` | 1 |
|
|
| 4 | 9 | 5 | `ROUTE_15` | 2 |
|
|
|
|
**Coord events** / **BG events**
|
|
|
|
None. This gate has **no** bicycle or badge check - it is free passage.
|
|
|
|
**Object events**
|
|
|
|
| const | sprite | x | y | movement | type | script label | event flag |
|
|
|---|---|---|---|---|---|---|---|
|
|
| `ROUTE15FUCHSIAGATE_OFFICER` (2) | `SPRITE_OFFICER` | 5 | 2 | `STANDING_DOWN` | `OBJECTTYPE_SCRIPT` | `Route15FuchsiaGateOfficerScript` (`jumptextfaceplayer`) | -1 |
|
|
|
|
---
|
|
|
|
### MAP_FUCHSIA_CITY
|
|
|
|
- Script: `maps/FuchsiaCity.asm`
|
|
- Blocks: `maps/FuchsiaCity.blk`
|
|
- Header: `data/maps/maps.asm:365` -> `map FuchsiaCity, TILESET_KANTO, TOWN, LANDMARK_FUCHSIA_CITY, MUSIC_CELADON_CITY, FALSE, PALETTE_AUTO, FISHGROUP_GYARADOS`
|
|
- Dimensions: `constants/map_constants.asm:337` -> `map_const FUCHSIA_CITY, 20, 18` (40x36 cells)
|
|
- Attributes/connections: `data/maps/attributes.asm:291-294` -> `$0f`; south `Route19` (0), west `Route18` (7), east `Route15` (9)
|
|
- Fly spawn: `data/maps/spawn_points.asm:23` -> `spawn FUCHSIA_CITY, 19, 28`; `data/maps/flypoints.asm:27` -> `db LANDMARK_FUCHSIA_CITY, SPAWN_FUCHSIA`
|
|
|
|
**Warps** (`def_warp_events`)
|
|
|
|
| idx | x | y | destination map | dest warp |
|
|
|---|---|---|---|---|
|
|
| 1 | 5 | 13 | `FUCHSIA_MART` | 2 |
|
|
| 2 | 22 | 13 | `SAFARI_ZONE_MAIN_OFFICE` | 1 |
|
|
| 3 | 8 | 27 | `FUCHSIA_GYM` | 1 |
|
|
| 4 | 11 | 27 | `BILLS_OLDER_SISTERS_HOUSE` | 1 |
|
|
| 5 | 19 | 27 | `FUCHSIA_POKECENTER_1F` | 1 |
|
|
| 6 | 27 | 27 | `SAFARI_ZONE_WARDENS_HOME` | 1 |
|
|
| 7 | 18 | 3 | `SAFARI_ZONE_FUCHSIA_GATE_BETA` | 3 (commented `; inaccessible` in the asm) |
|
|
| 8 | 37 | 22 | `ROUTE_15_FUCHSIA_GATE` | 1 |
|
|
| 9 | 37 | 23 | `ROUTE_15_FUCHSIA_GATE` | 2 |
|
|
| 10 | 7 | 35 | `ROUTE_19_FUCHSIA_GATE` | 1 |
|
|
| 11 | 8 | 35 | `ROUTE_19_FUCHSIA_GATE` | 2 |
|
|
|
|
Warp 7 is the "the door is gone" Safari Zone entrance: the warp row exists but
|
|
the block behind it is not walkable, which is why the walkthrough says the door
|
|
is missing.
|
|
|
|
**Coord events**
|
|
|
|
None.
|
|
|
|
**BG events** (`def_bg_events`)
|
|
|
|
| x | y | type | script/item |
|
|
|---|---|---|---|
|
|
| 21 | 15 | `BGEVENT_READ` | `FuchsiaCitySign` |
|
|
| 5 | 29 | `BGEVENT_READ` | `FuchsiaGymSign` |
|
|
| 25 | 15 | `BGEVENT_READ` | `SafariZoneOfficeSign` |
|
|
| 27 | 29 | `BGEVENT_READ` | `WardensHomeSign` |
|
|
| 17 | 5 | `BGEVENT_READ` | `SafariZoneClosedSign` |
|
|
| 13 | 15 | `BGEVENT_READ` | `NoLitteringSign` |
|
|
| 20 | 27 | `BGEVENT_READ` | `FuchsiaCityPokecenterSign` (`jumpstd PokecenterSignScript`) |
|
|
| 6 | 13 | `BGEVENT_READ` | `FuchsiaCityMartSign` (`jumpstd MartSignScript`) |
|
|
|
|
**Object events** (`def_object_events`)
|
|
|
|
| const | sprite | x | y | movement | type | script label | event flag |
|
|
|---|---|---|---|---|---|---|---|
|
|
| `FUCHSIACITY_YOUNGSTER` (2) | `SPRITE_YOUNGSTER` | 23 | 18 | `WANDER` (1,1) | `OBJECTTYPE_SCRIPT` | `FuchsiaCityYoungster` | -1 |
|
|
| `FUCHSIACITY_POKEFAN_M` (3) | `SPRITE_POKEFAN_M` | 13 | 8 | `WANDER` (1,1) | `OBJECTTYPE_SCRIPT` | `FuchsiaCityPokefanM` | -1 |
|
|
| `FUCHSIACITY_TEACHER` (4) | `SPRITE_TEACHER` | 16 | 14 | `WANDER` (1,1) | `OBJECTTYPE_SCRIPT` | `FuchsiaCityTeacher` | -1 |
|
|
| `FUCHSIACITY_FRUIT_TREE` (5) | `SPRITE_FRUIT_TREE` | 8 | 1 | `STILL` | `OBJECTTYPE_SCRIPT` | `FuchsiaCityFruitTree` (`fruittree FRUITTREE_FUCHSIA_CITY`) | -1 |
|
|
|
|
**Cut trees**
|
|
|
|
`maps/FuchsiaCity.blk`: block (8, 5) and block (9, 9), both `$60` (`CUT_TREE`
|
|
in the bottom-left quadrant) -> face walk cells (16, 11) and (18, 19). Neither
|
|
is required by this section.
|
|
|
|
**Scripts of interest**
|
|
|
|
- `FuchsiaCityFlypointCallback` (`4e:53c4`) - registered as
|
|
`callback MAPCALLBACK_NEWMAP`; body is `setflag ENGINE_FLYPOINT_FUCHSIA /
|
|
endcallback`. Runs on the first map load, so simply arriving unlocks Fly here.
|
|
- `FuchsiaCityFruitTree` - `fruittree FRUITTREE_FUCHSIA_CITY`.
|
|
`data/items/fruit_trees.asm` slot 30 (`$1e`) = `BURNT_BERRY`, which is the
|
|
walkthrough's "Burnt Berry in the northwest part of town" - the tree object at
|
|
(8, 1) is the north-west corner of the map.
|
|
- `SafariZoneClosedSign` / `SafariZoneOfficeSign` - flavour text only; there is
|
|
no event flag or script that ever reopens the Safari Zone.
|
|
|
|
**Flags and events**
|
|
|
|
| constant | defined in | read/written by | meaning for a bot |
|
|
|---|---|---|---|
|
|
| `ENGINE_FLYPOINT_FUCHSIA` | `constants/engine_flags.asm:76` | `FuchsiaCityFlypointCallback` | Fuchsia becomes a Fly destination |
|
|
| `FRUITTREE_FUCHSIA_CITY` | `constants/script_constants.asm:236` | `FuchsiaCityFruitTree` | fruit tree slot 30 |
|
|
|
|
**Items**
|
|
|
|
| item | how obtained | source | one-time flag |
|
|
|---|---|---|---|
|
|
| `BURNT_BERRY` | talk to the tree object at (8, 1) | `FuchsiaCityFruitTree` / `data/items/fruit_trees.asm` | none (daily tree) |
|
|
|
|
**Trainers**
|
|
|
|
None on the overworld map.
|
|
|
|
**Wild encounters**
|
|
|
|
No grass table. Water: `data/wild/kanto_water.asm:152`
|
|
`def_water_wildmons FUCHSIA_CITY`, 2% - L20 Magikarp, L15 Magikarp, L10 Magikarp.
|
|
Fishing group `FISHGROUP_GYARADOS` (`data/wild/fish.asm:132-145`):
|
|
Old rod Magikarp 10 x3; Good rod Magikarp 20 x3 + `time_group 14` (Gyarados 20);
|
|
Super rod Magikarp 40 (40%), `time_group 15` (Gyarados 40), Magikarp 40, Magikarp 40.
|
|
|
|
---
|
|
|
|
### MAP_FUCHSIA_POKECENTER_1F
|
|
|
|
- Script: `maps/FuchsiaPokecenter1F.asm`
|
|
- Header: `data/maps/maps.asm:370` -> `map FuchsiaPokecenter1F, TILESET_POKECENTER, INDOOR, LANDMARK_FUCHSIA_CITY, MUSIC_POKEMON_CENTER, FALSE, PALETTE_DAY, FISHGROUP_SHORE`
|
|
- Dimensions: `constants/map_constants.asm:342` -> `map_const FUCHSIA_POKECENTER_1F, 5, 4`
|
|
|
|
**Warps** (`def_warp_events`)
|
|
|
|
| idx | x | y | destination map | dest warp |
|
|
|---|---|---|---|---|
|
|
| 1 | 3 | 7 | `FUCHSIA_CITY` | 5 |
|
|
| 2 | 4 | 7 | `FUCHSIA_CITY` | 5 |
|
|
| 3 | 0 | 7 | `POKECENTER_2F` | 1 |
|
|
|
|
Healing is `FuchsiaPokecenter1FNurseScript` -> `jumpstd PokecenterNurseScript`
|
|
(object const `FUCHSIAPOKECENTER1F_NURSE` = 2). The map also contains a
|
|
`FUCHSIAPOKECENTER1F_JANINE_IMPERSONATOR` NPC that spins and `variablesprite`s
|
|
itself into `SPRITE_JANINE` - flavour, no flags.
|
|
|
|
---
|
|
|
|
### MAP_ROUTE_16
|
|
|
|
- Script: `maps/Route16.asm`
|
|
- Blocks: `maps/Route16.blk`
|
|
- Header: `data/maps/maps.asm:413` -> `map Route16, TILESET_KANTO, ROUTE, LANDMARK_ROUTE_16, MUSIC_ROUTE_3, FALSE, PALETTE_AUTO, FISHGROUP_SHORE`
|
|
- Dimensions: `constants/map_constants.asm:381` -> `map_const ROUTE_16, 10, 9` (20x18 cells)
|
|
- Attributes/connections: `data/maps/attributes.asm:304-306` -> `$0f`; south `Route17` (0), east `CeladonCity` (-9)
|
|
|
|
**Warps** (`def_warp_events`)
|
|
|
|
| idx | x | y | destination map | dest warp |
|
|
|---|---|---|---|---|
|
|
| 1 | 3 | 1 | `ROUTE_16_FUCHSIA_SPEECH_HOUSE` | 1 |
|
|
| 2 | 14 | 6 | `ROUTE_16_GATE` | 3 |
|
|
| 3 | 14 | 7 | `ROUTE_16_GATE` | 4 |
|
|
| 4 | 9 | 6 | `ROUTE_16_GATE` | 1 |
|
|
| 5 | 9 | 7 | `ROUTE_16_GATE` | 2 |
|
|
|
|
**Coord events**
|
|
|
|
None.
|
|
|
|
**BG events**
|
|
|
|
| x | y | type | script/item |
|
|
|---|---|---|---|
|
|
| 5 | 5 | `BGEVENT_READ` | `CyclingRoadSign` |
|
|
|
|
**Object events**
|
|
|
|
None (`def_object_events` is empty).
|
|
|
|
**Cut trees**
|
|
|
|
`maps/Route16.blk` block (7, 2) = `$32` (`CUT_TREE` top-right) -> face walk
|
|
cell (15, 4). This is the tree the walkthrough calls "north of the
|
|
route-changing building". Cut trees are **not** persisted: leaving the map (for
|
|
example into `ROUTE_16_FUCHSIA_SPEECH_HOUSE`) reloads the block from
|
|
`Route16.blk` and the tree is back, which is exactly the behaviour the
|
|
walkthrough describes.
|
|
|
|
**Scripts of interest**
|
|
|
|
`Route16AlwaysOnBikeCallback` (`4e:5a8f`), a `MAPCALLBACK_NEWMAP` callback:
|
|
|
|
```
|
|
readvar VAR_YCOORD
|
|
ifless 5, .CanWalk
|
|
readvar VAR_XCOORD
|
|
ifgreater 13, .CanWalk
|
|
setflag ENGINE_ALWAYS_ON_BIKE
|
|
endcallback
|
|
.CanWalk:
|
|
clearflag ENGINE_ALWAYS_ON_BIKE
|
|
endcallback
|
|
```
|
|
|
|
So the north-west corner of Route 16 (`y < 5`, or `x > 13`) is walkable; the
|
|
rest of the map forces the bike. Because this is a `MAPCALLBACK_NEWMAP`, it only
|
|
re-evaluates on a map load, not while walking.
|
|
|
|
**Flags and events**
|
|
|
|
| constant | defined in | read/written by | meaning for a bot |
|
|
|---|---|---|---|
|
|
| `ENGINE_ALWAYS_ON_BIKE` | `constants/engine_flags.asm:35` | `Route16AlwaysOnBikeCallback` | dismount, Surf and (via `BIKEFLAGS_ALWAYS_ON_BIKE_F`) some menu actions are refused |
|
|
|
|
**Wild encounters**
|
|
|
|
`data/wild/kanto_grass.asm:921` `def_grass_wildmons ROUTE_16`, 10%/10%/10%:
|
|
|
|
- morn/day (identical): L26 Grimer, L27 Fearow, L28 Grimer, L29 Fearow, L27 Slugma, L30 Muk, L30 Muk
|
|
- nite: L26 Grimer, L27 Grimer, L28 Grimer, L28 Murkrow, L27 Slugma, L30 Muk, L30 Muk
|
|
|
|
The walkthrough's "Fearow / Grimer" summary is the morn/day view; at night
|
|
Fearow is replaced by Grimer and Murkrow.
|
|
|
|
---
|
|
|
|
### MAP_ROUTE_16_GATE
|
|
|
|
- Script: `maps/Route16Gate.asm`
|
|
- Header: `data/maps/maps.asm:435` -> `map Route16Gate, TILESET_GATE, GATE, LANDMARK_ROUTE_16, MUSIC_ROUTE_3, FALSE, PALETTE_DAY, FISHGROUP_SHORE`
|
|
- Dimensions: `constants/map_constants.asm:403` -> `map_const ROUTE_16_GATE, 5, 4`
|
|
- Scene variable: `data/maps/scenes.asm:18` -> `scene_var ROUTE_16_GATE, wRoute16GateSceneID`
|
|
|
|
**Warps** (`def_warp_events`)
|
|
|
|
| idx | x | y | destination map | dest warp |
|
|
|---|---|---|---|---|
|
|
| 1 | 0 | 4 | `ROUTE_16` | 4 |
|
|
| 2 | 0 | 5 | `ROUTE_16` | 5 |
|
|
| 3 | 9 | 4 | `ROUTE_16` | 2 |
|
|
| 4 | 9 | 5 | `ROUTE_16` | 3 |
|
|
|
|
**Coord events** (`def_coord_events`)
|
|
|
|
| scene | x | y | script label | effect |
|
|
|---|---|---|---|---|
|
|
| `SCENE_ROUTE16GATE_BICYCLE_CHECK` (= 0) | 5 | 4 | `Route16GateBicycleCheck` | `checkitem BICYCLE`; on failure, shove the player one step RIGHT |
|
|
| `SCENE_ROUTE16GATE_BICYCLE_CHECK` (= 0) | 5 | 5 | `Route16GateBicycleCheck` | same |
|
|
|
|
`SCENE_ROUTE16GATE_BICYCLE_CHECK` is generated by the `scene_script` macro
|
|
(`macros/scripts/maps.asm:25`, which emits `scene_const` into a `const_def`
|
|
starting at 0), so its value is 0. Nothing anywhere calls `setmapscene` on this
|
|
map, so the scene never changes and the coord event fires on **every** pass.
|
|
|
|
**BG events**
|
|
|
|
None.
|
|
|
|
**Object events**
|
|
|
|
| const | sprite | x | y | movement | type | script label | event flag |
|
|
|---|---|---|---|---|---|---|---|
|
|
| `ROUTE16GATE_OFFICER` (2) | `SPRITE_OFFICER` | 5 | 2 | `STANDING_DOWN` | `OBJECTTYPE_SCRIPT` | `Route16GateOfficerScript` | -1 |
|
|
|
|
**Scripts of interest**
|
|
|
|
`Route16GateBicycleCheck` (`5e:67cb`):
|
|
|
|
```
|
|
checkitem BICYCLE
|
|
iffalse .NoBicycle
|
|
end
|
|
.NoBicycle:
|
|
showemote EMOTE_SHOCK, ROUTE16GATE_OFFICER, 15
|
|
turnobject PLAYER, UP
|
|
opentext / writetext Route16GateCannotPassText / waitbutton / closetext
|
|
applymovement PLAYER, Route16GateCannotPassMovement ; step RIGHT, turn_head LEFT
|
|
end
|
|
```
|
|
|
|
`checkitem` is a **bag** check, not a "is the bike out" check: the BICYCLE must
|
|
be in the pack, but the player does not have to be riding it to pass.
|
|
|
|
---
|
|
|
|
### MAP_ROUTE_16_FUCHSIA_SPEECH_HOUSE
|
|
|
|
- Script: `maps/Route16FuchsiaSpeechHouse.asm`
|
|
- Header: `data/maps/maps.asm:434` -> `map Route16FuchsiaSpeechHouse, TILESET_HOUSE, INDOOR, LANDMARK_ROUTE_16, MUSIC_CELADON_CITY, FALSE, PALETTE_DAY, FISHGROUP_SHORE`
|
|
- Dimensions: `constants/map_constants.asm:402` -> `map_const ROUTE_16_FUCHSIA_SPEECH_HOUSE, 4, 4`
|
|
|
|
**Warps**
|
|
|
|
| idx | x | y | destination map | dest warp |
|
|
|---|---|---|---|---|
|
|
| 1 | 2 | 7 | `ROUTE_16` | 1 |
|
|
| 2 | 3 | 7 | `ROUTE_16` | 1 |
|
|
|
|
**BG events**: (0, 1) and (1, 1), both `BGEVENT_READ` ->
|
|
`Route16FuchsiaSpeechHouseBookshelf` (`jumpstd PictureBookshelfScript`).
|
|
|
|
**Object events**: `ROUTE16FUCHSIASPEECHHOUSE_SUPER_NERD` (2),
|
|
`SPRITE_SUPER_NERD` at (2, 3), `STANDING_DOWN`, `OBJECTTYPE_SCRIPT`,
|
|
`Route16FuchsiaSpeechHouseSuperNerdScript` (text only).
|
|
|
|
This is the building whose entry/exit regrows the Route 16 cut tree.
|
|
|
|
---
|
|
|
|
### MAP_ROUTE_17
|
|
|
|
- Script: `maps/Route17.asm`
|
|
- Blocks: `maps/Route17.blk`
|
|
- Header: `data/maps/maps.asm:414` -> `map Route17, TILESET_KANTO, ROUTE, LANDMARK_ROUTE_17, MUSIC_ROUTE_3, FALSE, PALETTE_AUTO, FISHGROUP_NONE`
|
|
- Dimensions: `constants/map_constants.asm:382` -> `map_const ROUTE_17, 10, 45` (20x90 cells)
|
|
- Attributes/connections: `data/maps/attributes.asm:300-302` -> `$43`; north `Route16` (0), east `Route18` (38)
|
|
|
|
**Warps** (`def_warp_events`)
|
|
|
|
| idx | x | y | destination map | dest warp |
|
|
|---|---|---|---|---|
|
|
| 1 | 17 | 82 | `ROUTE_17_ROUTE_18_GATE` | 1 |
|
|
| 2 | 17 | 83 | `ROUTE_17_ROUTE_18_GATE` | 2 |
|
|
|
|
**Coord events**
|
|
|
|
None.
|
|
|
|
**BG events** (`def_bg_events`)
|
|
|
|
| x | y | type | script/item |
|
|
|---|---|---|---|
|
|
| 12 | 5 | `BGEVENT_ITEM` | `Route17HiddenMaxEther` -> `hiddenitem MAX_ETHER, EVENT_ROUTE_17_HIDDEN_MAX_ETHER` |
|
|
| 8 | 77 | `BGEVENT_ITEM` | `Route17HiddenMaxElixer` -> `hiddenitem MAX_ELIXER, EVENT_ROUTE_17_HIDDEN_MAX_ELIXER` |
|
|
|
|
**Object events** (`def_object_events`)
|
|
|
|
| const | sprite | x | y | movement | type | script label | event flag |
|
|
|---|---|---|---|---|---|---|---|
|
|
| `ROUTE17_BIKER1` (2) | `SPRITE_BIKER` | 4 | 17 | `SPINRANDOM_FAST` | `OBJECTTYPE_TRAINER`, sight 4 | `TrainerBikerRiley` | -1 |
|
|
| `ROUTE17_BIKER2` (3) | `SPRITE_BIKER` | 16 | 32 | `SPINRANDOM_FAST` | `OBJECTTYPE_TRAINER`, sight 3 | `TrainerBikerJoel` | -1 |
|
|
| `ROUTE17_BIKER3` (4) | `SPRITE_BIKER` | 3 | 53 | `SPINRANDOM_FAST` | `OBJECTTYPE_TRAINER`, sight 3 | `TrainerBikerGlenn` | -1 |
|
|
| `ROUTE17_BIKER4` (5) | `SPRITE_BIKER` | 6 | 80 | `STANDING_RIGHT` | `OBJECTTYPE_TRAINER`, sight 4 | `TrainerBikerCharles` | -1 |
|
|
|
|
Note the y-order: Riley (17) -> Joel (32) -> Glenn (53) -> Charles (80). The
|
|
walkthrough fights Riley, Glenn, Joel, Charles; Joel at (16, 32) is on the right
|
|
bank (the walkthrough's "bridge across the river to the right") and Glenn at
|
|
(3, 53) is further down the left, so the asm ordering by y is
|
|
Riley -> Joel -> Glenn -> Charles.
|
|
|
|
**Scripts of interest**
|
|
|
|
`Route17AlwaysOnBikeCallback` (`4e:5822`), a `MAPCALLBACK_NEWMAP` callback:
|
|
|
|
```
|
|
setflag ENGINE_ALWAYS_ON_BIKE
|
|
setflag ENGINE_DOWNHILL
|
|
endcallback
|
|
```
|
|
|
|
Unconditional for the whole map. `ENGINE_DOWNHILL` is what
|
|
`engine/overworld/player_movement.asm:13` `.GetDPad` reads (the `bit
|
|
BIKEFLAGS_DOWNHILL_F, [hl]` at line 20): on a downhill map
|
|
a frame with **no** d-pad held is rewritten to `PAD_DOWN`, i.e. the bike coasts
|
|
south on its own; and `player_movement.asm:277-292` downgrades any non-DOWN bike
|
|
step from `STEP_BIKE` to `STEP_WALK`, which is the "uphill is slower" behaviour.
|
|
|
|
**Flags and events**
|
|
|
|
| constant | defined in | read/written by | meaning for a bot |
|
|
|---|---|---|---|
|
|
| `ENGINE_ALWAYS_ON_BIKE` | `constants/engine_flags.asm:35` | `Route17AlwaysOnBikeCallback` | cannot dismount, cannot Surf |
|
|
| `ENGINE_DOWNHILL` | `constants/engine_flags.asm:36` | `Route17AlwaysOnBikeCallback` | idle frames auto-step DOWN |
|
|
| `EVENT_BEAT_BIKER_RILEY` / `_JOEL` / `_GLENN` / `_CHARLES` | `constants/event_flags.asm` | the four trainer scripts | trainers beaten |
|
|
| `EVENT_ROUTE_17_HIDDEN_MAX_ETHER` | `constants/event_flags.asm:246` | `Route17HiddenMaxEther` | hidden item taken |
|
|
| `EVENT_ROUTE_17_HIDDEN_MAX_ELIXER` | `constants/event_flags.asm:247` | `Route17HiddenMaxElixer` | hidden item taken |
|
|
|
|
**Items**
|
|
|
|
| item | how obtained | source | one-time flag |
|
|
|---|---|---|---|
|
|
| `MAX_ETHER` | hidden, face (12, 5) | `bg_event 12, 5, BGEVENT_ITEM` | `EVENT_ROUTE_17_HIDDEN_MAX_ETHER` |
|
|
| `MAX_ELIXER` | hidden, face (8, 77) | `bg_event 8, 77, BGEVENT_ITEM` | `EVENT_ROUTE_17_HIDDEN_MAX_ELIXER` |
|
|
|
|
Neither is mentioned by the walkthrough.
|
|
|
|
**Trainers**
|
|
|
|
| const | class | id | party | script label | rematch/phone |
|
|
|---|---|---|---|---|---|
|
|
| `RILEY` | `BIKER` | Biker (7) | L34 Weezing | `TrainerBikerRiley` | none |
|
|
| `GLENN` | `BIKER` | Biker (9) | L28 Koffing, L30 Magmar, L32 Weezing | `TrainerBikerGlenn` | none |
|
|
| `JOEL` | `BIKER` | Biker (8) | L32 Magmar, L32 Magmar | `TrainerBikerJoel` | none |
|
|
| `CHARLES` | `BIKER` | Biker (6) | L30 Koffing, L30 Charmeleon, L30 Weezing | `TrainerBikerCharles` | none |
|
|
|
|
`BIKER` base reward 8 (`attributes.asm:271`).
|
|
|
|
**Wild encounters**
|
|
|
|
`data/wild/kanto_grass.asm:949` `def_grass_wildmons ROUTE_17`, 10%/10%/10%
|
|
(this route's three time bands genuinely differ):
|
|
|
|
- morn: L28 Fearow, L27 Grimer, L29 Grimer, L30 Fearow, L29 Slugma, L32 Muk, L32 Muk
|
|
- day: L28 Fearow, L27 Slugma, L29 Grimer, L30 Fearow, L25 Slugma, L32 Muk, L32 Muk
|
|
- nite: L28 Grimer, L27 Grimer, L29 Grimer, L30 Muk, L29 Slugma, L32 Muk, L32 Muk
|
|
|
|
Fishing group is `FISHGROUP_NONE`.
|
|
|
|
---
|
|
|
|
### MAP_ROUTE_17_ROUTE_18_GATE
|
|
|
|
- Script: `maps/Route17Route18Gate.asm`
|
|
- Header: `data/maps/maps.asm:437` -> `map Route17Route18Gate, TILESET_GATE, GATE, LANDMARK_ROUTE_17, MUSIC_ROUTE_3, FALSE, PALETTE_DAY, FISHGROUP_SHORE`
|
|
- Dimensions: `constants/map_constants.asm:405` -> `map_const ROUTE_17_ROUTE_18_GATE, 5, 4`
|
|
- Scene variable: `data/maps/scenes.asm:19` -> `scene_var ROUTE_17_ROUTE_18_GATE, wRoute17Route18GateSceneID`
|
|
|
|
**Warps** (`def_warp_events`)
|
|
|
|
| idx | x | y | destination map | dest warp |
|
|
|---|---|---|---|---|
|
|
| 1 | 0 | 4 | `ROUTE_17` | 1 |
|
|
| 2 | 0 | 5 | `ROUTE_17` | 2 |
|
|
| 3 | 9 | 4 | `ROUTE_18` | 1 |
|
|
| 4 | 9 | 5 | `ROUTE_18` | 2 |
|
|
|
|
**Coord events** (`def_coord_events`)
|
|
|
|
| scene | x | y | script label | effect |
|
|
|---|---|---|---|---|
|
|
| `SCENE_ROUTE17ROUTE18GATE_BICYCLE_CHECK` (= 0) | 5 | 4 | `Route17Route18GateBicycleCheck` | `checkitem BICYCLE`; on failure, shove one step RIGHT |
|
|
| `SCENE_ROUTE17ROUTE18GATE_BICYCLE_CHECK` (= 0) | 5 | 5 | `Route17Route18GateBicycleCheck` | same |
|
|
|
|
**BG events**
|
|
|
|
None.
|
|
|
|
**Object events**
|
|
|
|
| const | sprite | x | y | movement | type | script label | event flag |
|
|
|---|---|---|---|---|---|---|---|
|
|
| `ROUTE17ROUTE18GATE_OFFICER` (2) | `SPRITE_OFFICER` | 5 | 2 | `STANDING_DOWN` | `OBJECTTYPE_SCRIPT` | `Route17Route18GateOfficerScript` | -1 |
|
|
|
|
`Route17Route18GateBicycleCheck` (`5e:69ef`) is byte-for-byte the same shape as
|
|
the Route 16 one, with `Route17Route18GateCannotPassText`.
|
|
|
|
Important asymmetry for a bot: the shove movement is `step RIGHT`, so the check
|
|
only actually blocks the **west-to-east** direction (walking off Route 17 into
|
|
the gate at x=5). Coming from Route 18 you enter at x=9 and the coord event at
|
|
x=5 still fires, but the shove pushes you further right, back the way you came.
|
|
|
|
---
|
|
|
|
### MAP_ROUTE_18
|
|
|
|
- Script: `maps/Route18.asm`
|
|
- Blocks: `maps/Route18.blk`
|
|
- Header: `data/maps/maps.asm:364` -> `map Route18, TILESET_KANTO, ROUTE, LANDMARK_ROUTE_18, MUSIC_ROUTE_3, FALSE, PALETTE_AUTO, FISHGROUP_SHORE`
|
|
- Dimensions: `constants/map_constants.asm:336` -> `map_const ROUTE_18, 10, 9` (20x18 cells)
|
|
- Attributes/connections: `data/maps/attributes.asm:296-298` -> `$43`; west `Route17` (-38), east `FuchsiaCity` (-7)
|
|
|
|
**Warps** (`def_warp_events`)
|
|
|
|
| idx | x | y | destination map | dest warp |
|
|
|---|---|---|---|---|
|
|
| 1 | 2 | 6 | `ROUTE_17_ROUTE_18_GATE` | 3 |
|
|
| 2 | 2 | 7 | `ROUTE_17_ROUTE_18_GATE` | 4 |
|
|
|
|
**Coord events**
|
|
|
|
None.
|
|
|
|
**BG events**
|
|
|
|
| x | y | type | script/item |
|
|
|---|---|---|---|
|
|
| 9 | 5 | `BGEVENT_READ` | `Route18Sign` |
|
|
|
|
**Object events** (`def_object_events`)
|
|
|
|
| const | sprite | x | y | movement | type | script label | event flag |
|
|
|---|---|---|---|---|---|---|---|
|
|
| `ROUTE18_YOUNGSTER1` (2) | `SPRITE_YOUNGSTER` | 9 | 12 | `SPINRANDOM_FAST` | `OBJECTTYPE_TRAINER`, sight 3 | `TrainerBirdKeeperBoris` | -1 |
|
|
| `ROUTE18_YOUNGSTER2` (3) | `SPRITE_YOUNGSTER` | 13 | 6 | `STANDING_DOWN` | `OBJECTTYPE_TRAINER`, sight 3 | `TrainerBirdKeeperBob` | -1 |
|
|
|
|
**Trainers**
|
|
|
|
| const | class | id | party | script label | rematch/phone |
|
|
|---|---|---|---|---|---|
|
|
| `BOB` | `BIRD_KEEPER` | BirdKeeper (11) | L34 Noctowl | `TrainerBirdKeeperBob` | none |
|
|
| `BORIS` | `BIRD_KEEPER` | BirdKeeper (10) | L30 Doduo, L28 Doduo, L32 Dodrio | `TrainerBirdKeeperBoris` | none |
|
|
|
|
**Flags and events**
|
|
|
|
| constant | defined in | read/written by | meaning for a bot |
|
|
|---|---|---|---|
|
|
| `EVENT_BEAT_BIRD_KEEPER_BOB` | `constants/event_flags.asm` | `TrainerBirdKeeperBob` | trainer beaten |
|
|
| `EVENT_BEAT_BIRD_KEEPER_BORIS` | `constants/event_flags.asm` | `TrainerBirdKeeperBoris` | trainer beaten |
|
|
|
|
**Items**
|
|
|
|
None.
|
|
|
|
**Wild encounters**
|
|
|
|
`data/wild/kanto_grass.asm:977` `def_grass_wildmons ROUTE_18`, 10%/10%/10%:
|
|
|
|
- morn/day (identical): L26 Grimer, L27 Fearow, L28 Grimer, L29 Fearow, L27 Slugma, L30 Muk, L30 Muk
|
|
- nite: L26 Grimer, L27 Grimer, L28 Grimer, L28 Muk, L27 Slugma, L30 Muk, L30 Muk
|
|
|
|
---
|
|
|
|
### MAP_FUCHSIA_GYM
|
|
|
|
- Script: `maps/FuchsiaGym.asm`
|
|
- Blocks: `maps/FuchsiaGym.blk`
|
|
- Header: `data/maps/maps.asm:368` -> `map FuchsiaGym, TILESET_LAB, INDOOR, LANDMARK_FUCHSIA_CITY, MUSIC_GYM, TRUE, PALETTE_DAY, FISHGROUP_SHORE` (the `TRUE` is the phone-service flag: phone calls are suppressed here)
|
|
- Dimensions: `constants/map_constants.asm:340` -> `map_const FUCHSIA_GYM, 5, 9` (10x18 cells)
|
|
|
|
**Warps** (`def_warp_events`)
|
|
|
|
| idx | x | y | destination map | dest warp |
|
|
|---|---|---|---|---|
|
|
| 1 | 4 | 17 | `FUCHSIA_CITY` | 3 |
|
|
| 2 | 5 | 17 | `FUCHSIA_CITY` | 3 |
|
|
|
|
**Coord events**
|
|
|
|
None.
|
|
|
|
**BG events** (`def_bg_events`)
|
|
|
|
| x | y | type | script/item |
|
|
|---|---|---|---|
|
|
| 3 | 15 | `BGEVENT_READ` | `FuchsiaGymStatue` |
|
|
| 6 | 15 | `BGEVENT_READ` | `FuchsiaGymStatue` |
|
|
|
|
**Object events** (`def_object_events`)
|
|
|
|
| const | sprite | x | y | movement | type | script label | event flag |
|
|
|---|---|---|---|---|---|---|---|
|
|
| `FUCHSIAGYM_JANINE` (2) | `SPRITE_JANINE` | 1 | 10 | `SPINRANDOM_SLOW` | `OBJECTTYPE_SCRIPT` | `FuchsiaGymJanineScript` | -1 |
|
|
| `FUCHSIAGYM_FUCHSIA_GYM_1` (3) | `SPRITE_FUCHSIA_GYM_1` | 5 | 7 | `SPINRANDOM_FAST` | `OBJECTTYPE_SCRIPT` | `LassAliceScript` | -1 |
|
|
| `FUCHSIAGYM_FUCHSIA_GYM_2` (4) | `SPRITE_FUCHSIA_GYM_2` | 5 | 11 | `SPINRANDOM_FAST` | `OBJECTTYPE_SCRIPT` | `LassLindaScript` | -1 |
|
|
| `FUCHSIAGYM_FUCHSIA_GYM_3` (5) | `SPRITE_FUCHSIA_GYM_3` | 9 | 4 | `SPINRANDOM_FAST` | `OBJECTTYPE_SCRIPT` | `PicnickerCindyScript` | -1 |
|
|
| `FUCHSIAGYM_FUCHSIA_GYM_4` (6) | `SPRITE_FUCHSIA_GYM_4` | 4 | 2 | `SPINRANDOM_FAST` | `OBJECTTYPE_SCRIPT` | `CamperBarryScript` | -1 |
|
|
| `FUCHSIAGYM_GYM_GUIDE` (7) | `SPRITE_GYM_GUIDE` | 7 | 15 | `STANDING_DOWN` | `OBJECTTYPE_SCRIPT` | `FuchsiaGymGuideScript` | -1 |
|
|
|
|
Every gym trainer here is `OBJECTTYPE_SCRIPT`, **not** `OBJECTTYPE_TRAINER` -
|
|
there are no sight lines, so a bot must walk up and press A. The walkthrough's
|
|
route order matches: Linda (5, 11) -> Cindy (9, 4) -> Barry (4, 2) ->
|
|
Alice (5, 7) -> Janine (1, 10).
|
|
|
|
**Scripts of interest**
|
|
|
|
`LassAliceScript` / `LassLindaScript` / `PicnickerCindyScript` /
|
|
`CamperBarryScript` share one shape:
|
|
|
|
```
|
|
checkevent EVENT_BEAT_<NAME>
|
|
iftrue .Unmasked
|
|
applymovement <OBJ>, Movement_NinjaSpin ; 13 turn_head steps
|
|
faceplayer
|
|
variablesprite SPRITE_FUCHSIA_GYM_n, SPRITE_LASS|SPRITE_YOUNGSTER
|
|
special LoadUsedSpritesGFX
|
|
.Unmasked:
|
|
faceplayer / opentext
|
|
checkevent EVENT_BEAT_<NAME>
|
|
iftrue .AfterScript
|
|
writetext <before> / waitbutton / closetext
|
|
winlosstext <beaten>, 0
|
|
loadtrainer <CLASS>, <NAME>
|
|
startbattle
|
|
iftrue .BecomesJanine ; wScriptVar != WIN
|
|
reloadmapafterbattle
|
|
setevent EVENT_BEAT_<NAME>
|
|
end
|
|
.BecomesJanine:
|
|
variablesprite SPRITE_FUCHSIA_GYM_n, SPRITE_JANINE
|
|
reloadmapafterbattle
|
|
end
|
|
```
|
|
|
|
`Script_startbattle` (`engine/overworld/scripting.asm:1065`) copies
|
|
`wBattleResult & ~BATTLERESULT_BITMASK` into `wScriptVar`, so `iftrue` after
|
|
`startbattle` means "did not win". Losing to an impostor leaves its beat-event
|
|
clear and repaints it as `SPRITE_JANINE`.
|
|
|
|
`FuchsiaGymJanineScript` (`5c:40d3`):
|
|
|
|
```
|
|
checkflag ENGINE_SOULBADGE
|
|
iftrue .FightDone
|
|
applymovement FUCHSIAGYM_JANINE, Movement_NinjaSpin
|
|
faceplayer / opentext
|
|
writetext JanineText_DisappointYou / waitbutton / closetext
|
|
winlosstext JanineText_ToughOne, 0
|
|
loadtrainer JANINE, JANINE1
|
|
startbattle
|
|
reloadmapafterbattle
|
|
setevent EVENT_BEAT_JANINE
|
|
setevent EVENT_BEAT_LASS_ALICE
|
|
setevent EVENT_BEAT_LASS_LINDA
|
|
setevent EVENT_BEAT_PICNICKER_CINDY
|
|
setevent EVENT_BEAT_CAMPER_BARRY
|
|
variablesprite SPRITE_FUCHSIA_GYM_1..3 -> SPRITE_LASS, _4 -> SPRITE_YOUNGSTER
|
|
special LoadUsedSpritesGFX
|
|
opentext / writetext Text_ReceivedSoulBadge / playsound SFX_GET_BADGE / waitsfx
|
|
setflag ENGINE_SOULBADGE
|
|
sjump .AfterBattle
|
|
.FightDone: faceplayer / opentext
|
|
.AfterBattle:
|
|
checkevent EVENT_GOT_TM06_TOXIC
|
|
iftrue .AfterTM
|
|
writetext JanineText_ToxicSpeech / promptbutton
|
|
verbosegiveitem TM_TOXIC
|
|
iffalse .AfterTM ; bag full -> no event set
|
|
setevent EVENT_GOT_TM06_TOXIC
|
|
.AfterTM: writetext JanineText_ApplyMyself / waitbutton / closetext / end
|
|
```
|
|
|
|
Three bot-critical facts:
|
|
|
|
1. There is **no** `iftrue` after Janine's `startbattle`. The badge, the four
|
|
impostor beat-events and `ENGINE_SOULBADGE` are set unconditionally on the
|
|
line after `reloadmapafterbattle`. Losing to Janine routes through
|
|
`Script_reloadmapafterbattle` -> `Script_BattleWhiteout`
|
|
(`engine/overworld/scripting.asm:1080-1090`) and the script never reaches
|
|
those lines, so the flags are only ever set on a win.
|
|
2. Beating Janine retroactively sets `EVENT_BEAT_LASS_ALICE`,
|
|
`EVENT_BEAT_LASS_LINDA`, `EVENT_BEAT_PICNICKER_CINDY` and
|
|
`EVENT_BEAT_CAMPER_BARRY`, so the four impostors can be skipped entirely.
|
|
3. `TM_TOXIC` is handed out on a **separate** `checkevent` from the badge. If
|
|
the TM pocket is full the badge is still awarded and the TM is retried the
|
|
next time you talk to her.
|
|
|
|
`FuchsiaGymStatue` - `checkflag ENGINE_SOULBADGE / iftrue .Beaten /
|
|
jumpstd GymStatue1Script`, `.Beaten` does `gettrainername STRING_BUFFER_4,
|
|
JANINE, JANINE1 / jumpstd GymStatue2Script`.
|
|
|
|
`FuchsiaGymGuideScript` - `checkevent EVENT_BEAT_JANINE` picks between the two
|
|
guide texts.
|
|
|
|
**Flags and events**
|
|
|
|
| constant | defined in | read/written by | meaning for a bot |
|
|
|---|---|---|---|
|
|
| `ENGINE_SOULBADGE` | `constants/engine_flags.asm:51`; storage `data/events/engine_flags.asm:59` (`engine_flag wKantoBadges, SOULBADGE`) | `FuchsiaGymJanineScript`, `FuchsiaGymStatue` | Kanto badge 5; also the "already beat this gym" gate |
|
|
| `EVENT_BEAT_JANINE` | `constants/event_flags.asm:719` | `FuchsiaGymJanineScript`, `FuchsiaGymGuideScript` | leader beaten |
|
|
| `EVENT_BEAT_LASS_ALICE` | `constants/event_flags.asm:804` | `LassAliceScript`, `FuchsiaGymJanineScript` | impostor beaten (or skipped via Janine) |
|
|
| `EVENT_BEAT_LASS_LINDA` | `constants/event_flags.asm:807` | `LassLindaScript`, `FuchsiaGymJanineScript` | impostor beaten |
|
|
| `EVENT_BEAT_PICNICKER_CINDY` | `constants/event_flags.asm:640` | `PicnickerCindyScript`, `FuchsiaGymJanineScript` | impostor beaten |
|
|
| `EVENT_BEAT_CAMPER_BARRY` | `constants/event_flags.asm:532` | `CamperBarryScript`, `FuchsiaGymJanineScript` | impostor beaten |
|
|
| `EVENT_GOT_TM06_TOXIC` | `constants/event_flags.asm:220` | `FuchsiaGymJanineScript` | TM06 already collected |
|
|
|
|
**Items**
|
|
|
|
| item | how obtained | source | one-time flag |
|
|
|---|---|---|---|
|
|
| `TM_TOXIC` (TM06, item `$c5`) | `verbosegiveitem` after beating Janine | `FuchsiaGymJanineScript` | `EVENT_GOT_TM06_TOXIC` |
|
|
| SOULBADGE | `setflag ENGINE_SOULBADGE` | `FuchsiaGymJanineScript` | `ENGINE_SOULBADGE` itself |
|
|
|
|
**Trainers**
|
|
|
|
| const | class | id | party (`data/trainers/parties.asm`) | script label | rematch/phone |
|
|
|---|---|---|---|---|---|
|
|
| `LINDA` | `LASS` | Lass (6) | L30 Bulbasaur, L32 Ivysaur, L34 Venusaur | `LassLindaScript` | none |
|
|
| `CINDY` | `PICNICKER` | Picnicker (5) | L36 Nidoqueen | `PicnickerCindyScript` | none |
|
|
| `BARRY` | `CAMPER` | Camper (5) | L36 Nidoking | `CamperBarryScript` | none |
|
|
| `ALICE` | `LASS` | Lass (3) | L30 Gloom, L34 Arbok, L30 Gloom | `LassAliceScript` | none |
|
|
| `JANINE1` | `JANINE` | Janine (1), `TRAINERTYPE_MOVES` | see below | `FuchsiaGymJanineScript` | none (`KantoGymLeaders` entry, `data/trainers/leaders.asm`) |
|
|
|
|
Janine's party in **ROM order** (`data/trainers/parties.asm`, Janine (1)):
|
|
|
|
| # | level | species | moves |
|
|
|---|---|---|---|
|
|
| 1 | 36 | Crobat | Screech, Supersonic, Confuse Ray, Wing Attack |
|
|
| 2 | 36 | Weezing | Smog, Sludge Bomb, Toxic, Explosion |
|
|
| 3 | 36 | Weezing | Smog, Sludge Bomb, Toxic, Explosion |
|
|
| 4 | 33 | Ariados | Scary Face, Giga Drain, String Shot, Night Shade |
|
|
| 5 | 39 | Venomoth | Foresight, Double Team, Gust, Psychic |
|
|
|
|
Base reward 25 (`data/trainers/attributes.asm:157`), last mon level 39 ->
|
|
4 x 25 x 39 = 3900G, matching the walkthrough.
|
|
|
|
**Wild encounters**
|
|
|
|
None (indoor).
|
|
|
|
---
|
|
|
|
## 3. Blockers and gates
|
|
|
|
| Gate | Enforced by (file:label) | Requirement | Unlock condition |
|
|
|---|---|---|---|
|
|
| Cut trees on Routes 12 (cells (7,44), (7,49)), 13 ((44,4)), 14 ((5,8), (11,14), (3,24)), 16 ((15,4)), Fuchsia ((16,11), (18,19)) | `engine/events/overworld.asm:117` `CutFunction.CheckAble` (menu use, `03:47e1`) and `engine/events/overworld.asm:1741` `TryCutOW` (walk-into prompt, `03:5193`) | `CheckBadge ENGINE_HIVEBADGE` **and** a party member knowing `CUT` **and** `CheckMapForSomethingToCut` (facing collision `COLL_CUT_TREE` + block id in `CutTreeBlockPointers`) | Hive Badge, already held long before this section. Cut is not persisted: the block reverts on map reload. |
|
|
| Route 16 Gate, west-to-east | `maps/Route16Gate.asm:16` `Route16GateBicycleCheck` (`5e:67cb`), coord events at (5,4)/(5,5), scene 0 | `checkitem BICYCLE` (bag, not "riding") | Own the BICYCLE. There is no `setmapscene` for this map, so the check is permanent, not a one-shot cutscene. |
|
|
| Route 17/18 Gate | `maps/Route17Route18Gate.asm:16` `Route17Route18GateBicycleCheck` (`5e:69ef`), coord events at (5,4)/(5,5), scene 0 | `checkitem BICYCLE` | Own the BICYCLE |
|
|
| Route 17 forced bike / auto-scroll south | `maps/Route17.asm:13` `Route17AlwaysOnBikeCallback` sets `ENGINE_ALWAYS_ON_BIKE` + `ENGINE_DOWNHILL`; enforced by `engine/overworld/map_setup.asm:112` `.CheckForcedBiking` (forces `PLAYER_BIKE`), `engine/events/overworld.asm:1634` `.GetOffBike` (refuses dismount), `engine/events/overworld.asm:343` / `:498` (refuses Surf), `engine/overworld/player_movement.asm:13` `.GetDPad` (idle frame -> `PAD_DOWN`) | none - it is unconditional on this map | Leave the map |
|
|
| Route 16 partial forced bike | `maps/Route16.asm:7` `Route16AlwaysOnBikeCallback` | `VAR_YCOORD < 5` or `VAR_XCOORD > 13` clears the flag; anywhere else sets it | Only re-evaluated on `MAPCALLBACK_NEWMAP` |
|
|
| Snorlax at the Route 11 west connection | `maps/VermilionCity.asm:41` `VermilionSnorlax`, object at Vermilion City (34, 8), `EVENT_VERMILION_CITY_SNORLAX` | `special SnorlaxAwake` must return true (Pokegear radio Expn card tuned to the Poke Flute channel) before the L50 Snorlax battle triggers; otherwise only `VermilionCitySnorlaxSleepingText` | `EVENT_FOUGHT_SNORLAX` + `disappear VERMILIONCITY_BIG_SNORLAX`. Belongs to a later section; nothing in section 23 clears it. |
|
|
| Safari Zone | none - `maps/FuchsiaCity.asm` warp 7 at (18, 3) is commented `; inaccessible` and no script or flag ever opens it | n/a | never opens in Gold/Silver |
|
|
|
|
Nothing in this section gates on `ENGINE_SOULBADGE` itself; the badge is the
|
|
output, not a prerequisite.
|
|
|
|
---
|
|
|
|
## 4. Bot checklist
|
|
|
|
Coordinates are walk cells, the same units the asm tables use. "Object N" means
|
|
the `object_const_def` index in that map (starting at 2).
|
|
|
|
1. `MAP_LAVENDER_TOWN` -> Fly / walk south into `MAP_ROUTE_12` (north connection,
|
|
offset 0). Pre: `ENGINE_FLYPOINT_LAVENDER`. Post: none.
|
|
2. `MAP_ROUTE_12`, walk to (6, 6) area, talk to object 5 (`TrainerFisherKyle`).
|
|
Pre: `EVENT_BEAT_FISHER_KYLE` clear. Post: `EVENT_BEAT_FISHER_KYLE`.
|
|
3. `MAP_ROUTE_12`, object 2 at (5, 15) (`TrainerFisherMartin`), sight range 3
|
|
facing DOWN - a bot walking south past x=5 will be challenged automatically.
|
|
Post: `EVENT_BEAT_FISHER_MARTIN`.
|
|
4. Walk west off `MAP_ROUTE_12` -> `MAP_ROUTE_11` (offset 9).
|
|
5. `MAP_ROUTE_11`, object 4 at (29, 7) (`TrainerPsychicHerman`), sight 1.
|
|
Post: `EVENT_BEAT_PSYCHIC_HERMAN`.
|
|
6. `MAP_ROUTE_11`, object 2 at (22, 14) (`TrainerYoungsterOwen`), sight 3,
|
|
`SPINRANDOM_FAST`. Post: `EVENT_BEAT_YOUNGSTER_OWEN`.
|
|
7. `MAP_ROUTE_11`, object 3 at (15, 9) (`TrainerYoungsterJason`), sight 2.
|
|
Post: `EVENT_BEAT_YOUNGSTER_JASON`.
|
|
8. `MAP_ROUTE_11`, talk to object 6 at (32, 2) -> `BERRY`. Pre: bag room.
|
|
Post: fruit tree slot 24 marked used for the day.
|
|
9. `MAP_ROUTE_11`, stand at (32, 6) facing UP (or use ITEMFINDER) and press A on
|
|
(32, 5) -> `REVIVE`. Post: `EVENT_ROUTE_11_HIDDEN_REVIVE`.
|
|
10. `MAP_ROUTE_11`, object 5 at (7, 4) (`TrainerPsychicFidel`), sight 3 facing
|
|
LEFT. Post: `EVENT_BEAT_PSYCHIC_FIDEL`.
|
|
11. Do **not** continue west - the Vermilion Snorlax blocks it. Walk back east
|
|
into `MAP_ROUTE_12`.
|
|
12. `MAP_ROUTE_12`, object 3 at (15, 28) (`TrainerFisherStephen`), sight 1
|
|
facing UP. Post: `EVENT_BEAT_FISHER_STEPHEN`.
|
|
13. `MAP_ROUTE_12`, step on warp 1 at (11, 33) -> `MAP_ROUTE_12_SUPER_ROD_HOUSE`.
|
|
14. `MAP_ROUTE_12_SUPER_ROD_HOUSE`, talk to object 2 at (5, 3), answer **Yes**
|
|
to the `yesorno`. Pre: `EVENT_GOT_SUPER_ROD` clear, KEY ITEMS room.
|
|
Post: `EVENT_GOT_SUPER_ROD`, `SUPER_ROD` in bag.
|
|
15. Exit via warp 1/2 at (2, 7)/(3, 7) -> `MAP_ROUTE_12` warp 1.
|
|
16. `MAP_ROUTE_12`, object 4 at (13, 39) (`TrainerFisherBarney`), sight 3 facing
|
|
LEFT. Post: `EVENT_BEAT_FISHER_BARNEY`.
|
|
17. `MAP_ROUTE_12`, face walk cell (7, 44) and use CUT. Pre: `ENGINE_HIVEBADGE`
|
|
+ party CUT. Post: block `$35` at block (3, 22) swapped for `$4c` (not
|
|
persisted).
|
|
18. `MAP_ROUTE_12`, walk onto object 6 at (5, 43) -> `CALCIUM`.
|
|
Post: `EVENT_ROUTE_12_CALCIUM`.
|
|
19. Optional: object 7 at (5, 51) -> `NUGGET` (`EVENT_ROUTE_12_NUGGET`);
|
|
hidden `ELIXER` facing (14, 13) (`EVENT_ROUTE_12_HIDDEN_ELIXER`).
|
|
20. Walk south off `MAP_ROUTE_12` -> `MAP_ROUTE_13` (offset -20).
|
|
21. `MAP_ROUTE_13`, object 2 at (42, 6) (`TrainerBirdKeeperPerry`), sight 2.
|
|
Post: `EVENT_BEAT_BIRD_KEEPER_PERRY`.
|
|
22. `MAP_ROUTE_13`, object 3 at (43, 6) (`TrainerBirdKeeperBret`), sight 2.
|
|
Post: `EVENT_BEAT_BIRD_KEEPER_BRET`.
|
|
23. `MAP_ROUTE_13`, object 4 at (32, 8) (`TrainerPokefanmJoshua`), sight 3
|
|
facing LEFT (six L23 Pikachu). Post: `EVENT_BEAT_POKEFANM_JOSHUA`.
|
|
24. Optional: hidden `CALCIUM` facing (30, 13) (`EVENT_ROUTE_13_HIDDEN_CALCIUM`).
|
|
25. `MAP_ROUTE_13`, object 6 at (25, 6) (`TrainerPokefanmAlex`), sight 4 facing
|
|
RIGHT. Post: `EVENT_BEAT_POKEFANM_ALEX`.
|
|
26. `MAP_ROUTE_13`, object 5 at (14, 10) (`TrainerHikerKenny`), sight 4 facing
|
|
LEFT. Post: `EVENT_BEAT_HIKER_KENNY`.
|
|
27. Walk south off `MAP_ROUTE_13` -> `MAP_ROUTE_14` (offset 0).
|
|
28. `MAP_ROUTE_14`, face (5, 8) and use CUT, then talk to object 4 at (5, 9)
|
|
(`TrainerPokefanmTrevor`), sight 4 facing RIGHT.
|
|
Post: `EVENT_BEAT_POKEFANM_TREVOR`.
|
|
29. `MAP_ROUTE_14`, talk to object 5 (`Kim`, patrols around (7, 5)).
|
|
Pre: a Chansey in the party, trade 5 unset in `wTradeFlags`.
|
|
Post: Chansey -> Aerodactyl "AEROY" holding `GOLD_BERRY`, OT KIM / 26491.
|
|
30. `MAP_ROUTE_14`, face (11, 14) and CUT, then object 2 at (12, 14)
|
|
(`TrainerPokefanmCarter`), sight 4 facing RIGHT.
|
|
Post: `EVENT_BEAT_POKEFANM_CARTER`.
|
|
31. `MAP_ROUTE_14`, object 3 at (11, 27) (`TrainerBirdKeeperRoy`), sight 3.
|
|
Post: `EVENT_BEAT_BIRD_KEEPER_ROY`.
|
|
32. `MAP_ROUTE_14`, face (3, 24) and CUT, then walk west off the map ->
|
|
`MAP_ROUTE_15` (offset 9).
|
|
33. `MAP_ROUTE_15`, walk onto object 8 at (12, 5) -> `PP_UP`.
|
|
Post: `EVENT_ROUTE_15_PP_UP`.
|
|
34. `MAP_ROUTE_15`, fight east-to-west along y=10:
|
|
object 4 (33, 10) Johnny, object 6 (30, 12) Colette, object 5 (27, 10)
|
|
Billy, object 7 (16, 10) Hillary, object 3 (11, 11) Tommy,
|
|
object 2 (11, 10) Kipp. Post: the six `EVENT_BEAT_*` flags.
|
|
35. `MAP_ROUTE_15`, warp 1/2 at (2, 4)/(2, 5) -> `MAP_ROUTE_15_FUCHSIA_GATE`
|
|
warps 3/4; then gate warps 1/2 at (0, 4)/(0, 5) -> `MAP_FUCHSIA_CITY`
|
|
warps 8/9 at (37, 22)/(37, 23). Post (on map load):
|
|
`ENGINE_FLYPOINT_FUCHSIA` set by `FuchsiaCityFlypointCallback`.
|
|
36. `MAP_FUCHSIA_CITY`, talk to object 5 at (8, 1) -> `BURNT_BERRY`.
|
|
37. `MAP_FUCHSIA_CITY`, warp 5 at (19, 27) -> `MAP_FUCHSIA_POKECENTER_1F`, talk
|
|
to object 2 to heal, exit via warp 1/2.
|
|
38. Optional Cycling Road detour. Fly to Celadon, walk west into `MAP_ROUTE_16`.
|
|
Pre: `BICYCLE` in bag. `ENGINE_ALWAYS_ON_BIKE` is set on load unless the
|
|
landing cell has `y < 5` or `x > 13`.
|
|
39. `MAP_ROUTE_16`, optional: face (15, 4) and CUT (regrows on any map reload).
|
|
40. `MAP_ROUTE_16`, warp 2/3 at (14, 6)/(14, 7) -> `MAP_ROUTE_16_GATE` warps 3/4.
|
|
Walking left across (5, 4)/(5, 5) fires `Route16GateBicycleCheck`; with no
|
|
BICYCLE the player is shoved one step RIGHT. Exit warps 1/2 at (0, 4)/(0, 5).
|
|
41. `MAP_ROUTE_16` -> walk south into `MAP_ROUTE_17` (offset 0).
|
|
Post (on load): `ENGINE_ALWAYS_ON_BIKE` + `ENGINE_DOWNHILL`. Releasing the
|
|
d-pad now auto-steps DOWN each frame.
|
|
42. `MAP_ROUTE_17`, object 2 at (4, 17) (`TrainerBikerRiley`), sight 4.
|
|
Post: `EVENT_BEAT_BIKER_RILEY`.
|
|
43. `MAP_ROUTE_17`, object 3 at (16, 32) (`TrainerBikerJoel`), sight 3 - the
|
|
right-bank bridge. Post: `EVENT_BEAT_BIKER_JOEL`.
|
|
44. `MAP_ROUTE_17`, object 4 at (3, 53) (`TrainerBikerGlenn`), sight 3.
|
|
Post: `EVENT_BEAT_BIKER_GLENN`.
|
|
45. `MAP_ROUTE_17`, object 5 at (6, 80) (`TrainerBikerCharles`), sight 4 facing
|
|
RIGHT. Post: `EVENT_BEAT_BIKER_CHARLES`.
|
|
46. Optional hidden items: face (12, 5) -> `MAX_ETHER`; face (8, 77) ->
|
|
`MAX_ELIXER`.
|
|
47. `MAP_ROUTE_17`, warp 1/2 at (17, 82)/(17, 83) ->
|
|
`MAP_ROUTE_17_ROUTE_18_GATE` warps 1/2, exit warps 3/4 at (9, 4)/(9, 5) ->
|
|
`MAP_ROUTE_18` warps 1/2 at (2, 6)/(2, 7).
|
|
48. `MAP_ROUTE_18`, object 3 at (13, 6) (`TrainerBirdKeeperBob`), sight 3.
|
|
Post: `EVENT_BEAT_BIRD_KEEPER_BOB`.
|
|
49. `MAP_ROUTE_18`, object 2 at (9, 12) (`TrainerBirdKeeperBoris`), sight 3.
|
|
Post: `EVENT_BEAT_BIRD_KEEPER_BORIS`.
|
|
50. Walk east off `MAP_ROUTE_18` -> `MAP_FUCHSIA_CITY` (offset -7).
|
|
51. `MAP_FUCHSIA_CITY`, heal (warp 5), then warp 3 at (8, 27) ->
|
|
`MAP_FUCHSIA_GYM` (enter at warps 1/2, (4, 17)/(5, 17)).
|
|
52. `MAP_FUCHSIA_GYM`, talk to object 4 at (5, 11) (`LassLindaScript`).
|
|
Pre: `EVENT_BEAT_LASS_LINDA` clear. Post: `EVENT_BEAT_LASS_LINDA` on a win;
|
|
on a loss the sprite becomes `SPRITE_JANINE` and the flag stays clear.
|
|
53. `MAP_FUCHSIA_GYM`, object 5 at (9, 4) (`PicnickerCindyScript`).
|
|
Post: `EVENT_BEAT_PICNICKER_CINDY`.
|
|
54. `MAP_FUCHSIA_GYM`, object 6 at (4, 2) (`CamperBarryScript`).
|
|
Post: `EVENT_BEAT_CAMPER_BARRY`.
|
|
55. `MAP_FUCHSIA_GYM`, object 3 at (5, 7) (`LassAliceScript`).
|
|
Post: `EVENT_BEAT_LASS_ALICE`.
|
|
56. Steps 52-55 are **optional**: step 57 sets all four flags anyway.
|
|
57. `MAP_FUCHSIA_GYM`, talk to object 2 at (1, 10) (`FuchsiaGymJanineScript`).
|
|
Pre: `ENGINE_SOULBADGE` clear. Post on win: `EVENT_BEAT_JANINE`,
|
|
`EVENT_BEAT_LASS_ALICE`, `EVENT_BEAT_LASS_LINDA`,
|
|
`EVENT_BEAT_PICNICKER_CINDY`, `EVENT_BEAT_CAMPER_BARRY`,
|
|
`ENGINE_SOULBADGE`, then `verbosegiveitem TM_TOXIC` ->
|
|
`EVENT_GOT_TM06_TOXIC` (only if the TM pocket has room; otherwise re-talk).
|
|
58. Exit via warps 1/2 at (4, 17)/(5, 17) -> `MAP_FUCHSIA_CITY` warp 3.
|
|
|
|
Prize money for every trainer above is
|
|
`4 x <class base reward> x <level of the trainer's LAST party mon>`
|
|
(`ComputeTrainerReward` in `engine/battle/read_trainer_party.asm:300` gives
|
|
`base x level`, and `engine/battle/core.asm:2341` adds that amount **four**
|
|
times via the `ld c, 4` loop). This reproduces every G figure in the
|
|
walkthrough exactly.
|
|
|
|
---
|
|
|
|
## 5. Port coverage
|
|
|
|
The Gen 2 side of this repo is data-driven: `src/import/RomExtractorGen2.lua`
|
|
reads each map's `def_warp_events` / `def_coord_events` / `def_bg_events` /
|
|
`def_object_events` tables and the script bytecode straight out of the ROM
|
|
(`readMapEvents`, `src/import/RomExtractorGen2.lua:787-980`), and
|
|
`src/script/gen2/Vm.lua` executes the original opcodes. So there is no
|
|
per-map hand-port to audit for this section; what matters is whether the
|
|
mechanics each beat needs are implemented.
|
|
|
|
| Beat | Port file | Status |
|
|
|---|---|---|
|
|
| Map geometry, warps, connections | `src/world/gen2/Map.lua`, `src/import/RomExtractorGen2.lua:787` | implemented (generic, all maps) |
|
|
| Coord-event trip-wires (both bike gates) | `src/world/gen2/World.lua:5006` `World:tryCoordScript` (matches x/y + `sceneId`) | implemented |
|
|
| `checkitem BICYCLE` | `src/script/gen2/Opcodes.lua:38` (`0x21 checkitem`), handled in `src/script/gen2/Vm.lua` | implemented |
|
|
| `showemote` / `turnobject` / `applymovement` refusal choreography | `src/script/gen2/Vm.lua:961`, `:302` | implemented |
|
|
| `ENGINE_ALWAYS_ON_BIKE` / `ENGINE_DOWNHILL` (Routes 16, 17) | `src/world/gen2/Bike.lua:30-31`, `src/world/gen2/World.lua:3437-3444`, `:5620` | implemented; `World:alwaysOnBike()` / `World:downhill()` read the same engine-flag store the map callbacks write |
|
|
| Downhill auto-step / slow uphill bike step | `src/world/gen2/Bike.lua:136-146` | implemented |
|
|
| `readvar VAR_XCOORD` / `VAR_YCOORD` (the Route 16 partial-bike callback) | `src/world/gen2/World.lua:1275-1280`, wired through `src/script/gen2/Vm.lua:670` | implemented |
|
|
| `MAPCALLBACK_NEWMAP` dispatch (Fuchsia flypoint, both bike callbacks) | `src/world/gen2/World.lua:5659` `runMapCallback("MAPCALLBACK_NEWMAP")` | implemented |
|
|
| CUT field move on `TILESET_KANTO` trees | `src/world/gen2/FieldMoves.lua:191-210` (`CUT_BLOCKS.TILESET_KANTO` transcribes all five kanto rows), badge gate at `:104` (`CUT = "HIVE"`) | implemented |
|
|
| Item balls (`OBJECTTYPE_ITEMBALL`) | `src/import/RomExtractorGen2.lua:2968` `readItemBall` | implemented |
|
|
| Hidden items (`BGEVENT_ITEM` / `hiddenitem`) | `src/world/gen2/HiddenItems.lua` | implemented |
|
|
| Fruit trees (Route 11 Berry, Fuchsia Burnt Berry) | `src/core/gen2/Apricorns.lua:378` (slot 24 `BERRY`), `:384` (slot 30 `BURNT_BERRY`); `fruittree` opcode at `src/script/gen2/Vm.lua:1191` | implemented |
|
|
| Kim's Chansey/Aerodactyl trade | `src/core/gen2/NpcTrade.lua` + `src/ui/gen2/TradeMenu.lua`; `trade` opcode at `src/script/gen2/Vm.lua:1292` | implemented (trade rows come from the extracted `data/generated/events.lua` `trades` table) |
|
|
| `verbosegiveitem` (Super Rod, TM06) | `src/script/gen2/Vm.lua:490-498` | implemented |
|
|
| Super Rod fishing tables | `src/world/gen2/World.lua:311` `ROD_INDEX`, `src/battle/gen2/Encounter.lua:110` | implemented |
|
|
| Trainer objects, sight lines, `loadtrainer` / `startbattle` | `src/world/gen2/Trainers.lua`, `src/script/gen2/Vm.lua:806`, `:817`, `src/world/gen2/World.lua:4529` | implemented |
|
|
| `variablesprite` + `special LoadUsedSpritesGFX` (the Janine impostor reveal) | `src/script/gen2/Vm.lua:353`, `src/script/gen2/Specials.lua:1033` | implemented |
|
|
| Badge award (`setflag ENGINE_SOULBADGE` into `wKantoBadges`) | `src/world/gen2/World.lua` engine-flag store (`save.engineFlags`), Kanto badges counted at `:1240-1245` | implemented (generic engine-flag path; not exercised by any Gold driver) |
|
|
| Prize money x4 loop | not located in `src/battle/gen2/Prize.lua` during this pass | unverified - see Unresolved |
|
|
| Any driver that walks this section | `tests/drivers/gold_*.lua` (24 files; none touches Routes 11-19 or Fuchsia) | missing |
|
|
|
|
Summary: every mechanic this section needs already exists in the port, but
|
|
nothing in `tests/drivers/` exercises Kanto's south-east loop, the Cycling Road
|
|
forced-bike state or the Fuchsia Gym impostor script. A `gold_cycling_road.lua`
|
|
and a `gold_fuchsia_gym.lua` driver would be the cheapest way to prove it.
|
|
|
|
---
|
|
|
|
## 6. Unresolved / verify by hand
|
|
|
|
1. **Route 19 is never visited.** The section is titled "Routes 11-19" but the
|
|
text stops at Fuchsia City after Route 18. `MAP_ROUTE_19` and
|
|
`MAP_ROUTE_19_FUCHSIA_GATE` exist (`constants/map_constants.asm:178-180`,
|
|
`data/maps/attributes.asm:287`) and Fuchsia warps 10/11 at (7, 35)/(8, 35)
|
|
lead there, but no walkthrough beat uses them.
|
|
2. **"Cut the tree on your way west" on Route 15.** `maps/Route15.blk` contains
|
|
none of the five `TILESET_KANTO` cut-tree block ids. The nearest real cut
|
|
tree on that path is the Route 14 one at walk cell (3, 24). The Route 15
|
|
sentence is most likely a duplicate reference to it.
|
|
3. **Janine "Strategy VERSUS Espeon".** The walkthrough includes an Espeon
|
|
strategy paragraph. Janine (1) in `data/trainers/parties.asm` has no Espeon:
|
|
the five mons are Crobat, Weezing, Weezing, Ariados, Venomoth. The paragraph
|
|
appears to be copy-paste residue from another gym.
|
|
4. **Party ordering differences.** The walkthrough lists several parties in a
|
|
different order than the ROM. Confirmed divergences:
|
|
Psychic Herman (asm: Exeggcute, Exeggcute, Exeggutor; guide: Exeggcute,
|
|
Exeggutor, Exeggcute); Schoolboy Johnny (asm: Bellsprout, Weepinbell,
|
|
Victreebel; guide: Bellsprout, Victreebel, Weepinbell); PokeFan Carter (asm:
|
|
Bulbasaur, Charmander, Squirtle; guide: Bulbasaur, Squirtle, Charmander);
|
|
Bird Keeper Boris (asm: L30 Doduo, L28 Doduo, L32 Dodrio; guide: L30 Doduo,
|
|
L32 Dodrio, L28 Doduo); Biker Charles (asm: Koffing, Charmeleon, Weezing;
|
|
guide: Koffing, Weezing, Charmeleon); Lass Linda (asm: Bulbasaur, Ivysaur,
|
|
Venusaur; guide: Bulbasaur, Venusaur, Ivysaur); Janine (asm order given
|
|
above). Levels and species sets always match; only the order differs, so
|
|
lead-mon predictions from the guide are unreliable.
|
|
5. **Route 12 items.** The walkthrough lists only Calcium and the Super Rod.
|
|
The map also has a `NUGGET` itemball at (5, 51) and a hidden `ELIXER` at
|
|
(14, 13). Route 13's hidden `CALCIUM` at (30, 13) and Route 17's hidden
|
|
`MAX_ETHER` / `MAX_ELIXER` are likewise unlisted.
|
|
6. **Route 17 fight order.** The guide's order (Riley, Glenn, Joel, Charles)
|
|
does not match the map's y-order (Riley 17, Joel 32, Glenn 53, Charles 80).
|
|
Since these are `OBJECTTYPE_TRAINER` objects with sight lines rather than
|
|
scripted encounters, a bot coasting south will hit them in y-order, not the
|
|
guide's order.
|
|
7. **Prize-money x4 in the port.** The disassembly's four-fold payout
|
|
(`engine/battle/core.asm:2341`, the `ld c, 4` add loop) was not located in
|
|
`src/battle/gen2/Prize.lua` during this pass. Worth a direct read before
|
|
trusting any money-based bot assertion.
|
|
8. **Fuchsia City cut trees.** Blocks (8, 5) and (9, 9) of
|
|
`maps/FuchsiaCity.blk` are `$60` cut trees (walk cells (16, 11) and
|
|
(18, 19)). Neither is mentioned in the walkthrough and neither was traced to
|
|
a reward; they may simply be scenery on the Safari Zone approach.
|
|
9. **Fuchsia warp 7 walkability.** `maps/FuchsiaCity.asm:135` marks the Safari
|
|
Zone gate warp `; inaccessible` in a comment; the block data behind (18, 3)
|
|
was not decoded to confirm the tile is impassable. The walkthrough's "even
|
|
the door is gone" matches the comment, but the collision itself is unverified.
|