74 KiB
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) fromFuchsiaGymJanineScriptinmaps/FuchsiaGym.asmEVENT_GOT_TM06_TOXIC->TM_TOXIC(item id$c5,constants/item_constants.asm:226)EVENT_GOT_SUPER_ROD->SUPER_RODfrommaps/Route12SuperRodHouse.asmENGINE_FLYPOINT_FUCHSIAarmed on first entry toMAP_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; northLavenderTown(0), southRoute13(-20), westRoute11(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 baretrainer FISHER, <NAME>, EVENT_BEAT_*, <seen>, <beaten>, 0, .Script;.Scriptisendifjustbattled / opentext / writetext <after> / waitbutton / closetext / end. No flags beyond the beat event, no items, no movement.Route12Calcium/Route12Nugget-itemballrows; 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_12has nodef_grass_wildmonsrow indata/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; westVermilionCity(0), eastRoute12(-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- singlefruittree FRUITTREE_ROUTE_11.data/items/fruit_trees.asmgives 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
endifjustbattledpattern.
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; northRoute12(20), southRoute14(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; northRoute13(0), westRoute15(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_KIMis 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 holdingGOLD_BERRY, OT KIM / ID 26491, DVs$96/$66. One-shot, tracked inwTradeFlagsby trade id, not by anEVENT_*.- 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; westFuchsiaCity(-9), eastRoute14(-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; southRoute19(0), westRoute18(7), eastRoute15(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 ascallback MAPCALLBACK_NEWMAP; body issetflag 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.asmslot 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 variablesprites
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; southRoute17(0), eastCeladonCity(-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; northRoute16(0), eastRoute18(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; westRoute17(-38), eastFuchsiaCity(-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(theTRUEis 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:
- There is no
iftrueafter Janine'sstartbattle. The badge, the four impostor beat-events andENGINE_SOULBADGEare set unconditionally on the line afterreloadmapafterbattle. Losing to Janine routes throughScript_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. - Beating Janine retroactively sets
EVENT_BEAT_LASS_ALICE,EVENT_BEAT_LASS_LINDA,EVENT_BEAT_PICNICKER_CINDYandEVENT_BEAT_CAMPER_BARRY, so the four impostors can be skipped entirely. TM_TOXICis handed out on a separatecheckeventfrom 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).
MAP_LAVENDER_TOWN-> Fly / walk south intoMAP_ROUTE_12(north connection, offset 0). Pre:ENGINE_FLYPOINT_LAVENDER. Post: none.MAP_ROUTE_12, walk to (6, 6) area, talk to object 5 (TrainerFisherKyle). Pre:EVENT_BEAT_FISHER_KYLEclear. Post:EVENT_BEAT_FISHER_KYLE.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.- Walk west off
MAP_ROUTE_12->MAP_ROUTE_11(offset 9). MAP_ROUTE_11, object 4 at (29, 7) (TrainerPsychicHerman), sight 1. Post:EVENT_BEAT_PSYCHIC_HERMAN.MAP_ROUTE_11, object 2 at (22, 14) (TrainerYoungsterOwen), sight 3,SPINRANDOM_FAST. Post:EVENT_BEAT_YOUNGSTER_OWEN.MAP_ROUTE_11, object 3 at (15, 9) (TrainerYoungsterJason), sight 2. Post:EVENT_BEAT_YOUNGSTER_JASON.MAP_ROUTE_11, talk to object 6 at (32, 2) ->BERRY. Pre: bag room. Post: fruit tree slot 24 marked used for the day.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.MAP_ROUTE_11, object 5 at (7, 4) (TrainerPsychicFidel), sight 3 facing LEFT. Post:EVENT_BEAT_PSYCHIC_FIDEL.- Do not continue west - the Vermilion Snorlax blocks it. Walk back east
into
MAP_ROUTE_12. MAP_ROUTE_12, object 3 at (15, 28) (TrainerFisherStephen), sight 1 facing UP. Post:EVENT_BEAT_FISHER_STEPHEN.MAP_ROUTE_12, step on warp 1 at (11, 33) ->MAP_ROUTE_12_SUPER_ROD_HOUSE.MAP_ROUTE_12_SUPER_ROD_HOUSE, talk to object 2 at (5, 3), answer Yes to theyesorno. Pre:EVENT_GOT_SUPER_RODclear, KEY ITEMS room. Post:EVENT_GOT_SUPER_ROD,SUPER_RODin bag.- Exit via warp 1/2 at (2, 7)/(3, 7) ->
MAP_ROUTE_12warp 1. MAP_ROUTE_12, object 4 at (13, 39) (TrainerFisherBarney), sight 3 facing LEFT. Post:EVENT_BEAT_FISHER_BARNEY.MAP_ROUTE_12, face walk cell (7, 44) and use CUT. Pre:ENGINE_HIVEBADGE- party CUT. Post: block
$35at block (3, 22) swapped for$4c(not persisted).
- party CUT. Post: block
MAP_ROUTE_12, walk onto object 6 at (5, 43) ->CALCIUM. Post:EVENT_ROUTE_12_CALCIUM.- Optional: object 7 at (5, 51) ->
NUGGET(EVENT_ROUTE_12_NUGGET); hiddenELIXERfacing (14, 13) (EVENT_ROUTE_12_HIDDEN_ELIXER). - Walk south off
MAP_ROUTE_12->MAP_ROUTE_13(offset -20). MAP_ROUTE_13, object 2 at (42, 6) (TrainerBirdKeeperPerry), sight 2. Post:EVENT_BEAT_BIRD_KEEPER_PERRY.MAP_ROUTE_13, object 3 at (43, 6) (TrainerBirdKeeperBret), sight 2. Post:EVENT_BEAT_BIRD_KEEPER_BRET.MAP_ROUTE_13, object 4 at (32, 8) (TrainerPokefanmJoshua), sight 3 facing LEFT (six L23 Pikachu). Post:EVENT_BEAT_POKEFANM_JOSHUA.- Optional: hidden
CALCIUMfacing (30, 13) (EVENT_ROUTE_13_HIDDEN_CALCIUM). MAP_ROUTE_13, object 6 at (25, 6) (TrainerPokefanmAlex), sight 4 facing RIGHT. Post:EVENT_BEAT_POKEFANM_ALEX.MAP_ROUTE_13, object 5 at (14, 10) (TrainerHikerKenny), sight 4 facing LEFT. Post:EVENT_BEAT_HIKER_KENNY.- Walk south off
MAP_ROUTE_13->MAP_ROUTE_14(offset 0). 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.MAP_ROUTE_14, talk to object 5 (Kim, patrols around (7, 5)). Pre: a Chansey in the party, trade 5 unset inwTradeFlags. Post: Chansey -> Aerodactyl "AEROY" holdingGOLD_BERRY, OT KIM / 26491.MAP_ROUTE_14, face (11, 14) and CUT, then object 2 at (12, 14) (TrainerPokefanmCarter), sight 4 facing RIGHT. Post:EVENT_BEAT_POKEFANM_CARTER.MAP_ROUTE_14, object 3 at (11, 27) (TrainerBirdKeeperRoy), sight 3. Post:EVENT_BEAT_BIRD_KEEPER_ROY.MAP_ROUTE_14, face (3, 24) and CUT, then walk west off the map ->MAP_ROUTE_15(offset 9).MAP_ROUTE_15, walk onto object 8 at (12, 5) ->PP_UP. Post:EVENT_ROUTE_15_PP_UP.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 sixEVENT_BEAT_*flags.MAP_ROUTE_15, warp 1/2 at (2, 4)/(2, 5) ->MAP_ROUTE_15_FUCHSIA_GATEwarps 3/4; then gate warps 1/2 at (0, 4)/(0, 5) ->MAP_FUCHSIA_CITYwarps 8/9 at (37, 22)/(37, 23). Post (on map load):ENGINE_FLYPOINT_FUCHSIAset byFuchsiaCityFlypointCallback.MAP_FUCHSIA_CITY, talk to object 5 at (8, 1) ->BURNT_BERRY.MAP_FUCHSIA_CITY, warp 5 at (19, 27) ->MAP_FUCHSIA_POKECENTER_1F, talk to object 2 to heal, exit via warp 1/2.- Optional Cycling Road detour. Fly to Celadon, walk west into
MAP_ROUTE_16. Pre:BICYCLEin bag.ENGINE_ALWAYS_ON_BIKEis set on load unless the landing cell hasy < 5orx > 13. MAP_ROUTE_16, optional: face (15, 4) and CUT (regrows on any map reload).MAP_ROUTE_16, warp 2/3 at (14, 6)/(14, 7) ->MAP_ROUTE_16_GATEwarps 3/4. Walking left across (5, 4)/(5, 5) firesRoute16GateBicycleCheck; with no BICYCLE the player is shoved one step RIGHT. Exit warps 1/2 at (0, 4)/(0, 5).MAP_ROUTE_16-> walk south intoMAP_ROUTE_17(offset 0). Post (on load):ENGINE_ALWAYS_ON_BIKE+ENGINE_DOWNHILL. Releasing the d-pad now auto-steps DOWN each frame.MAP_ROUTE_17, object 2 at (4, 17) (TrainerBikerRiley), sight 4. Post:EVENT_BEAT_BIKER_RILEY.MAP_ROUTE_17, object 3 at (16, 32) (TrainerBikerJoel), sight 3 - the right-bank bridge. Post:EVENT_BEAT_BIKER_JOEL.MAP_ROUTE_17, object 4 at (3, 53) (TrainerBikerGlenn), sight 3. Post:EVENT_BEAT_BIKER_GLENN.MAP_ROUTE_17, object 5 at (6, 80) (TrainerBikerCharles), sight 4 facing RIGHT. Post:EVENT_BEAT_BIKER_CHARLES.- Optional hidden items: face (12, 5) ->
MAX_ETHER; face (8, 77) ->MAX_ELIXER. MAP_ROUTE_17, warp 1/2 at (17, 82)/(17, 83) ->MAP_ROUTE_17_ROUTE_18_GATEwarps 1/2, exit warps 3/4 at (9, 4)/(9, 5) ->MAP_ROUTE_18warps 1/2 at (2, 6)/(2, 7).MAP_ROUTE_18, object 3 at (13, 6) (TrainerBirdKeeperBob), sight 3. Post:EVENT_BEAT_BIRD_KEEPER_BOB.MAP_ROUTE_18, object 2 at (9, 12) (TrainerBirdKeeperBoris), sight 3. Post:EVENT_BEAT_BIRD_KEEPER_BORIS.- Walk east off
MAP_ROUTE_18->MAP_FUCHSIA_CITY(offset -7). MAP_FUCHSIA_CITY, heal (warp 5), then warp 3 at (8, 27) ->MAP_FUCHSIA_GYM(enter at warps 1/2, (4, 17)/(5, 17)).MAP_FUCHSIA_GYM, talk to object 4 at (5, 11) (LassLindaScript). Pre:EVENT_BEAT_LASS_LINDAclear. Post:EVENT_BEAT_LASS_LINDAon a win; on a loss the sprite becomesSPRITE_JANINEand the flag stays clear.MAP_FUCHSIA_GYM, object 5 at (9, 4) (PicnickerCindyScript). Post:EVENT_BEAT_PICNICKER_CINDY.MAP_FUCHSIA_GYM, object 6 at (4, 2) (CamperBarryScript). Post:EVENT_BEAT_CAMPER_BARRY.MAP_FUCHSIA_GYM, object 3 at (5, 7) (LassAliceScript). Post:EVENT_BEAT_LASS_ALICE.- Steps 52-55 are optional: step 57 sets all four flags anyway.
MAP_FUCHSIA_GYM, talk to object 2 at (1, 10) (FuchsiaGymJanineScript). Pre:ENGINE_SOULBADGEclear. Post on win:EVENT_BEAT_JANINE,EVENT_BEAT_LASS_ALICE,EVENT_BEAT_LASS_LINDA,EVENT_BEAT_PICNICKER_CINDY,EVENT_BEAT_CAMPER_BARRY,ENGINE_SOULBADGE, thenverbosegiveitem TM_TOXIC->EVENT_GOT_TM06_TOXIC(only if the TM pocket has room; otherwise re-talk).- Exit via warps 1/2 at (4, 17)/(5, 17) ->
MAP_FUCHSIA_CITYwarp 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
- Route 19 is never visited. The section is titled "Routes 11-19" but the
text stops at Fuchsia City after Route 18.
MAP_ROUTE_19andMAP_ROUTE_19_FUCHSIA_GATEexist (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. - "Cut the tree on your way west" on Route 15.
maps/Route15.blkcontains none of the fiveTILESET_KANTOcut-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. - Janine "Strategy VERSUS Espeon". The walkthrough includes an Espeon
strategy paragraph. Janine (1) in
data/trainers/parties.asmhas no Espeon: the five mons are Crobat, Weezing, Weezing, Ariados, Venomoth. The paragraph appears to be copy-paste residue from another gym. - 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.
- Route 12 items. The walkthrough lists only Calcium and the Super Rod.
The map also has a
NUGGETitemball at (5, 51) and a hiddenELIXERat (14, 13). Route 13's hiddenCALCIUMat (30, 13) and Route 17's hiddenMAX_ETHER/MAX_ELIXERare likewise unlisted. - 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_TRAINERobjects with sight lines rather than scripted encounters, a bot coasting south will hit them in y-order, not the guide's order. - Prize-money x4 in the port. The disassembly's four-fold payout
(
engine/battle/core.asm:2341, theld c, 4add loop) was not located insrc/battle/gen2/Prize.luaduring this pass. Worth a direct read before trusting any money-based bot assertion. - Fuchsia City cut trees. Blocks (8, 5) and (9, 9) of
maps/FuchsiaCity.blkare$60cut 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. - Fuchsia warp 7 walkability.
maps/FuchsiaCity.asm:135marks the Safari Zone gate warp; inaccessiblein 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.