63 KiB
Section 06 - Bug Catching Contest and Sudowoodo
Source: ../section-06-bug-catching-contest-and-sudowoodo.txt
Maps covered: MAP_GOLDENROD_FLOWER_SHOP, MAP_ROUTE_35_GOLDENROD_GATE, MAP_ROUTE_35,
MAP_ROUTE_35_NATIONAL_PARK_GATE, MAP_NATIONAL_PARK, MAP_NATIONAL_PARK_BUG_CONTEST,
MAP_ROUTE_36_NATIONAL_PARK_GATE, MAP_ROUTE_36, MAP_ROUTE_37 (listed by the
walkthrough header, never entered by its route)
Badges / key milestones in this section:
- SQUIRTBOTTLE (key item) - gated behind
ENGINE_PLAINBADGE, i.e. Whitney must already be beaten before this section can be started at all. - Bug-Catching Contest run (Tue/Thu/Sat only) - SUN STONE / EVERSTONE / GOLD BERRY / BERRY.
EVENT_FOUGHT_SUDOWOODO- the single event that unblocks Route 36 west<->east, which is the only land route between Goldenrod and Violet through Route 36.- TM08 ROCK SMASH (
EVENT_GOT_TM08_ROCK_SMASH), TM04 ROLLOUT, TM28 DIG, QUICK CLAW. - No badge is earned in this section.
Everything in this file was transcribed from files that were opened; nothing is
reconstructed from memory. Symbol addresses are bank:addr from
pokegold-symbols/pokegold.sym.
1. Route order
The walkthrough's own prose is out of order in one place: it opens by collecting the SQUIRTBOTTLE in Goldenrod, then much later describes Floria running off to fetch it. In pokegold the SQUIRTBOTTLE has no Route 36 precondition at all (see "Unresolved / verify by hand"), so the opening order is the one a bot should follow.
| # | Map constant | asm file | Enter via | Leaves via | Why (walkthrough beat) |
|---|---|---|---|---|---|
| 1 | MAP_GOLDENROD_FLOWER_SHOP |
maps/GoldenrodFlowerShop.asm |
GOLDENROD_CITY warp 6 @ (33, 5) |
warp 1/2 @ (2,7)/(3,7) -> GOLDENROD_CITY 6 |
Talk to the teacher for the SQUIRTBOTTLE |
| 2 | MAP_ROUTE_35_GOLDENROD_GATE |
maps/Route35GoldenrodGate.asm |
GOLDENROD_CITY warp 13 @ (19, 1) -> gate warp 3 |
warp 1/2 @ (4,0)/(5,0) -> ROUTE_35 1/2 |
Randy hands over Kenya the SPEAROW with FLOWER MAIL |
| 3 | MAP_ROUTE_35 |
maps/Route35.asm |
gate warp @ (9,33)/(10,33) | warp 3 @ (3, 5) -> ROUTE_35_NATIONAL_PARK_GATE 3 |
Six trainers + Officer Dirk, walk north |
| 4 | MAP_ROUTE_35_NATIONAL_PARK_GATE |
maps/Route35NationalParkGate.asm |
warp 3/4 @ (3,7)/(4,7) | warp 1/2 @ (3,0)/(4,0) -> NATIONAL_PARK 3/4 |
Contest officer; optional entry to the Contest |
| 5 | MAP_NATIONAL_PARK_BUG_CONTEST |
maps/NationalParkBugContest.asm |
script warp NATIONAL_PARK_BUG_CONTEST, 10, 47 from the south gate (or 33, 18 from the north gate) |
contest timer / balls exhausted, or either gate | Optional Tue/Thu/Sat Contest |
| 6 | MAP_NATIONAL_PARK |
maps/NationalPark.asm |
warp 3/4 @ (10,47)/(11,47) | warp 1/2 @ (33,18)/(33,19) -> ROUTE_36_NATIONAL_PARK_GATE 1/2 |
QUICK CLAW, Beverly, Jack, Krise, William, TM28 DIG |
| 7 | MAP_ROUTE_36_NATIONAL_PARK_GATE |
maps/Route36NationalParkGate.asm |
warp 1/2 @ (0,4)/(0,5) | warp 3/4 @ (9,4)/(9,5) -> ROUTE_36 1/2 |
Contest results / prize holding |
| 8 | MAP_ROUTE_36 |
maps/Route36.asm |
warp 1/2 @ (18,8)/(18,9) | south connection @ y=17 -> ROUTE_35; later east connection -> VIOLET_CITY |
Ice Berry, Psychic Mark, Schoolboy Alan, Sudowoodo, TM08 |
| 9 | MAP_ROUTE_35 (again) |
maps/Route35.asm |
north connection from ROUTE_36 (offset 0) |
back north to ROUTE_36 |
Cut the tree, Bug Catcher Arnie, Bird Keeper Bryan, TM04 ROLLOUT |
| 10 | MAP_ROUTE_36 (again) |
maps/Route36.asm |
north connection from ROUTE_35 |
east connection -> VIOLET_CITY |
Sudowoodo cleared, then east into Violet City |
Spills into the next section: step 10's east connection
(connection east, VioletCity, VIOLET_CITY, 0 in data/maps/attributes.asm) drops the
player into MAP_VIOLET_CITY, which belongs to a neighbouring section. Route 37
(MAP_ROUTE_37, north connection off Route 36 with offset 10) is named in this section's
header but the walkthrough never routes into it; its data is recorded below for
completeness because the item list ("Blk/Blu/Red Apricorn", "Ice Berry") mixes 36 and 37.
2. Maps
MAP_GOLDENROD_FLOWER_SHOP
- Script:
maps/GoldenrodFlowerShop.asm - Blocks:
maps/GoldenrodFlowerShop.blk - Header (
data/maps/maps.asm:275):TILESET_HOUSE, INDOOR, LANDMARK_GOLDENROD_CITY, MUSIC_GOLDENROD_CITY, FALSE, PALETTE_DAY, FISHGROUP_SHORE - Dimensions:
constants/map_constants.asm:253->map_const GOLDENROD_FLOWER_SHOP, 4, 4 - Connections: none (indoor)
Warps (def_warp_events)
| idx | x | y | destination map | dest warp |
|---|---|---|---|---|
| 1 | 2 | 7 | GOLDENROD_CITY |
6 |
| 2 | 3 | 7 | GOLDENROD_CITY |
6 |
Coord events (def_coord_events) - none.
BG events (def_bg_events) - none. (FlowerShopShelf1, FlowerShopShelf2,
FlowerShopRadio exist in the file but are marked ; unreferenced.)
Object events (def_object_events)
| const | sprite | x | y | movement | type | script label | event flag |
|---|---|---|---|---|---|---|---|
GOLDENRODFLOWERSHOP_TEACHER |
SPRITE_TEACHER |
2 | 4 | SPRITEMOVEDATA_STANDING_RIGHT |
OBJECTTYPE_SCRIPT |
FlowerShopTeacherScript |
-1 |
GOLDENRODFLOWERSHOP_FLORIA |
SPRITE_LASS |
5 | 6 | SPRITEMOVEDATA_WANDER (1,1) |
OBJECTTYPE_SCRIPT |
FlowerShopFloriaScript |
-1 |
Scripts of interest
FlowerShopTeacherScript(57:52d1) -checkevent EVENT_GOT_SQUIRTBOTTLE/iftrue .Lalala; thencheckflag ENGINE_PLAINBADGE/iffalse .Lalala. Only with the badge and without the event does itfaceplayer/opentext/writetext GoldenrodFlowerShopTeacherBetterThanWhitneyText/promptbutton/verbosegiveitem SQUIRTBOTTLE/setevent EVENT_GOT_SQUIRTBOTTLE. Note the bug in the cart: there is noiffalseafterverbosegiveitem, so a full PACK still setsEVENT_GOT_SQUIRTBOTTLEand the item is lost. A bot must have a free KEY ITEM slot.FlowerShopFloriaScript(57:52f4) - pure flavour, branches onENGINE_PLAINBADGE. Gives nothing.
Flags and events
| constant | defined in | read/written by | meaning for a bot |
|---|---|---|---|
EVENT_GOT_SQUIRTBOTTLE |
constants/event_flags.asm:101 |
read+written by FlowerShopTeacherScript |
one-shot; set even on a full bag |
ENGINE_PLAINBADGE |
constants/engine_flags.asm:40 |
read by FlowerShopTeacherScript, FlowerShopFloriaScript |
Whitney's badge is the hard precondition for the whole section |
Items
| item | how obtained | source (label / bg_event / hidden) | one-time flag |
|---|---|---|---|
SQUIRTBOTTLE |
talk to teacher at (2,4) | FlowerShopTeacherScript verbosegiveitem |
EVENT_GOT_SQUIRTBOTTLE |
Trainers - none.
Wild encounters - none (indoor).
MAP_ROUTE_35_GOLDENROD_GATE
- Script:
maps/Route35GoldenrodGate.asm - Blocks: no
.blkinmaps/for this map (gate maps of this group share generated attributes;data/maps/attributes.asm:542carriesmap_attributes Route35GoldenrodGate, ROUTE_35_GOLDENROD_GATE, $00) - Header (
data/maps/maps.asm:260):TILESET_GATE, GATE, LANDMARK_ROUTE_35, MUSIC_ROUTE_36, FALSE, PALETTE_DAY, FISHGROUP_SHORE - Dimensions:
constants/map_constants.asm:239->map_const ROUTE_35_GOLDENROD_GATE, 5, 4 - Connections: none.
GATEenvironment is why the walkthrough's "ride your bike through" works.
Warps (def_warp_events)
| idx | x | y | destination map | dest warp |
|---|---|---|---|---|
| 1 | 4 | 0 | ROUTE_35 |
1 |
| 2 | 5 | 0 | ROUTE_35 |
2 |
| 3 | 4 | 7 | GOLDENROD_CITY |
13 |
| 4 | 5 | 7 | GOLDENROD_CITY |
13 |
Coord events - none. BG events - none.
Object events
| const | sprite | x | y | movement | type | script label | event flag |
|---|---|---|---|---|---|---|---|
ROUTE35GOLDENRODGATE_RANDY |
SPRITE_OFFICER |
0 | 4 | SPRITEMOVEDATA_STANDING_RIGHT |
OBJECTTYPE_SCRIPT |
RandyScript |
-1 |
ROUTE35GOLDENRODGATE_POKEFAN_F |
SPRITE_POKEFAN_F |
6 | 4 | SPRITEMOVEDATA_WALK_UP_DOWN (0,1) |
OBJECTTYPE_SCRIPT |
Route35GoldenrodGatePokefanFScript |
-1 |
Scripts of interest
RandyScript(56:59ce) - four-way branch, checked in this order:EVENT_GOT_HP_UP_FROM_RANDY->.gothpup;EVENT_GAVE_KENYA->.questcomplete(verbosegiveitem HP_UP,setevent EVENT_GOT_HP_UP_FROM_RANDY);EVENT_GOT_KENYA->.alreadyhavekenya; otherwise the offer. On YES it prints thanks, thenreadvar VAR_PARTYCOUNT/ifequal PARTY_LENGTH, .partyfull. Only with a free slot does it rungivepoke SPEAROW, 10, NO_ITEM, GiftSpearowName, GiftSpearowOTName,givepokemail GiftSpearowMail,setevent EVENT_GOT_KENYA.GiftSpearowMail=FLOWER_MAIL, text"DARK CAVE leads / to another road".GiftSpearowName=KENYA,GiftSpearowOTName=RANDY.- The delivery target (
EVENT_GAVE_KENYA) is on Route 31, i.e. a later section.
Route35GoldenrodGatePokefanFScript- flavour, branches onEVENT_FOUGHT_SUDOWOODO; its pre-Sudowoodo text is the in-game hint that the SQUIRTBOTTLE is what wakes the tree.
Flags and events
| constant | defined in | read/written by | meaning for a bot |
|---|---|---|---|
EVENT_GOT_KENYA |
constants/event_flags.asm:89 |
RandyScript |
Spearow accepted |
EVENT_GAVE_KENYA |
constants/event_flags.asm:90 |
read here, set on Route 31 | enables the HP UP reward |
EVENT_GOT_HP_UP_FROM_RANDY |
constants/event_flags.asm:91 |
RandyScript |
reward taken |
EVENT_FOUGHT_SUDOWOODO |
constants/event_flags.asm:51 |
read here | flavour only on this map |
Items
| item | how obtained | source | one-time flag |
|---|---|---|---|
SPEAROW "KENYA" (lv 10) + FLOWER_MAIL |
say YES to Randy with a party slot free | RandyScript givepoke / givepokemail |
EVENT_GOT_KENYA |
HP_UP |
return after delivering to Route 31 | RandyScript .questcomplete |
EVENT_GOT_HP_UP_FROM_RANDY |
Trainers - none. Wild encounters - none.
MAP_ROUTE_35
- Script:
maps/Route35.asm - Blocks:
maps/Route35.blk(180 bytes = 10 x 18 blocks) - Header (
data/maps/maps.asm:248):TILESET_JOHTO, ROUTE, LANDMARK_ROUTE_35, MUSIC_ROUTE_36, FALSE, PALETTE_AUTO, FISHGROUP_POND - Dimensions:
constants/map_constants.asm:227->map_const ROUTE_35, 10, 18(so cell coordinates run 0..19 in x and 0..35 in y) - Connections (
data/maps/attributes.asm:202): northROUTE_36offset 0, southGOLDENROD_CITYoffset -5
Warps (def_warp_events)
| idx | x | y | destination map | dest warp |
|---|---|---|---|---|
| 1 | 9 | 33 | ROUTE_35_GOLDENROD_GATE |
1 |
| 2 | 10 | 33 | ROUTE_35_GOLDENROD_GATE |
2 |
| 3 | 3 | 5 | ROUTE_35_NATIONAL_PARK_GATE |
3 |
Coord events - none.
BG events (def_bg_events)
| x | y | type | script/item |
|---|---|---|---|
| 1 | 7 | BGEVENT_READ |
Route35Sign |
| 11 | 31 | BGEVENT_READ |
Route35Sign |
Object events (def_object_events)
| const | sprite | x | y | movement | type | script label | event flag |
|---|---|---|---|---|---|---|---|
ROUTE35_YOUNGSTER1 |
SPRITE_YOUNGSTER |
3 | 19 | STANDING_RIGHT |
OBJECTTYPE_TRAINER sight 4 |
TrainerCamperIvan |
-1 |
ROUTE35_YOUNGSTER2 |
SPRITE_YOUNGSTER |
8 | 20 | STANDING_DOWN |
OBJECTTYPE_TRAINER sight 3 |
TrainerCamperElliot |
-1 |
ROUTE35_LASS1 |
SPRITE_LASS |
7 | 20 | STANDING_DOWN |
OBJECTTYPE_TRAINER sight 3 |
TrainerPicnickerBrooke |
-1 |
ROUTE35_LASS2 |
SPRITE_LASS |
11 | 24 | STANDING_LEFT |
OBJECTTYPE_TRAINER sight 3 |
TrainerPicnickerKim |
-1 |
ROUTE35_YOUNGSTER3 |
SPRITE_YOUNGSTER |
14 | 28 | STANDING_DOWN |
OBJECTTYPE_TRAINER sight 0 |
TrainerBirdKeeperBryan |
-1 |
ROUTE35_FISHER |
SPRITE_FISHER |
2 | 10 | SPINCOUNTERCLOCKWISE |
OBJECTTYPE_TRAINER sight 2 |
TrainerFirebreatherWalt |
-1 |
ROUTE35_BUG_CATCHER |
SPRITE_BUG_CATCHER |
16 | 7 | STANDING_DOWN (radius 2,0) |
OBJECTTYPE_TRAINER sight 3 |
TrainerBugCatcherArnie |
-1 |
ROUTE35_SUPER_NERD |
SPRITE_SUPER_NERD |
5 | 10 | SPINRANDOM_FAST |
OBJECTTYPE_TRAINER sight 2 |
TrainerJugglerIrwin |
-1 |
ROUTE35_OFFICER |
SPRITE_OFFICER |
5 | 6 | STANDING_DOWN |
OBJECTTYPE_SCRIPT |
TrainerOfficerDirk |
-1 |
ROUTE35_FRUIT_TREE |
SPRITE_FRUIT_TREE |
2 | 25 | STILL |
OBJECTTYPE_SCRIPT |
Route35FruitTree (4b:5c07) |
-1 |
ROUTE35_POKE_BALL |
SPRITE_POKE_BALL |
13 | 16 | STILL |
OBJECTTYPE_ITEMBALL |
Route35TMRollout (4b:5c05) |
EVENT_ROUTE_35_TM_ROLLOUT |
Scripts of interest
TrainerOfficerDirk- not anOBJECTTYPE_TRAINERobject. It is a plain script that runschecktime NITE/iffalse .NotNightfirst, so Dirk only battles at night. Thencheckevent EVENT_BEAT_OFFICER_DIRK,playmusic MUSIC_OFFICER_ENCOUNTER,winlosstext OfficerDirkBeatenText, 0,loadtrainer OFFICER, DIRK,startbattle,reloadmapafterbattle,setevent EVENT_BEAT_OFFICER_DIRK. A daytime bot will getOfficerDirkPrettyToughTextand no battle.TrainerJugglerIrwin/TrainerBugCatcherArnie- standard phone trainers. After the win,checkcellnum PHONE_JUGGLER_IRWIN/PHONE_BUG_CATCHER_ARNIE, thensetevent EVENT_IRWIN_ASKED_FOR_PHONE_NUMBER/EVENT_ARNIE_ASKED_FOR_PHONE_NUMBERandaskforphonenumber. The walkthrough's "head back to Arnie and talk to her for her phone number" is this second talk. Rematch tiers: Irwin usesEVENT_CLEARED_RADIO_TOWER->IRWIN3,ENGINE_FLYPOINT_CIANWOOD->IRWIN2, elseIRWIN1. Arnie usesENGINE_FLYPOINT_BLACKTHORN->ARNIE3,ENGINE_FLYPOINT_LAKE_OF_RAGE->ARNIE2, elseARNIE1.Route35TMRollout->itemball TM_ROLLOUT.Route35FruitTree->fruittree FRUITTREE_ROUTE_35.
Flags and events
| constant | defined in | read/written by | meaning for a bot |
|---|---|---|---|
EVENT_BEAT_PICNICKER_KIM / _CAMPER_ELLIOT / _PICNICKER_BROOKE / _CAMPER_IVAN / _JUGGLER_IRWIN / _FIREBREATHER_WALT / _BUG_CATCHER_ARNIE / _BIRD_KEEPER_BRYAN |
constants/event_flags.asm |
trainer macro rows |
per-trainer defeated bits |
EVENT_BEAT_OFFICER_DIRK |
constants/event_flags.asm |
TrainerOfficerDirk |
set by hand, not by the trainer macro |
EVENT_ROUTE_35_TM_ROLLOUT |
constants/event_flags.asm:1107 |
item ball object | TM04 taken |
EVENT_IRWIN_ASKED_FOR_PHONE_NUMBER, EVENT_IRWIN_READY_FOR_REMATCH |
constants/event_flags.asm |
Irwin script | phone state machine |
EVENT_ARNIE_ASKED_FOR_PHONE_NUMBER, EVENT_ARNIE_READY_FOR_REMATCH |
constants/event_flags.asm |
Arnie script | phone state machine |
Items
| item | how obtained | source | one-time flag |
|---|---|---|---|
TM_ROLLOUT (TM04, constants/item_constants.asm:223) |
item ball at cell (13, 16) | Route35TMRollout |
EVENT_ROUTE_35_TM_ROLLOUT |
MYSTERYBERRY |
fruit tree object at (2, 25) | FRUITTREE_ROUTE_35 -> data/items/fruit_trees.asm:14 |
daily reset (Apricorns/TryResetFruitTrees equivalent) |
Trainers
| const | class | id | party (data/trainers/parties.asm label) |
script label | rematch/phone |
|---|---|---|---|---|---|
KIM |
PICNICKER (0x35) |
4 | parties.asm:2601 KIM - lv15 VULPIX |
TrainerPicnickerKim |
no |
ELLIOT |
CAMPER (0x36) |
4 | parties.asm:2722 ELLIOT - lv13 SANDSHREW, lv15 MARILL |
TrainerCamperElliot |
no |
BROOKE |
PICNICKER (0x35) |
3 | parties.asm:2596 BROOKE TRAINERTYPE_MOVES - lv16 PIKACHU (THUNDERSHOCK, GROWL, QUICK_ATTACK, DOUBLE_TEAM) |
TrainerPicnickerBrooke |
no |
IVAN |
CAMPER (0x36) |
3 | parties.asm:2715 IVAN - lv10 DIGLETT, lv10 ZUBAT, lv14 DIGLETT |
TrainerCamperIvan |
no |
IRWIN1 |
JUGGLER (0x31) |
1 | parties.asm:2384 IRWIN - lv2/6/10/14 VOLTORB |
TrainerJugglerIrwin |
yes (PHONE_JUGGLER_IRWIN); IRWIN2 parties.asm:2407, IRWIN3 parties.asm:2415 |
WALT |
FIREBREATHER (0x30) |
6 | parties.asm:2365 WALT - lv11 MAGMAR, lv13 MAGMAR |
TrainerFirebreatherWalt |
no |
DIRK |
OFFICER (0x41) |
2 | parties.asm:3172 DIRK - lv14 GROWLITHE, lv14 GROWLITHE |
TrainerOfficerDirk |
night only |
ARNIE1 |
BUG_CATCHER (0x24) |
8 | parties.asm:1455 ARNIE - lv15 VENONAT |
TrainerBugCatcherArnie |
yes (PHONE_BUG_CATCHER_ARNIE); ARNIE2 parties.asm:1487, ARNIE3 parties.asm:1492 (lv28 VENOMOTH w/ moves) |
BRYAN |
BIRD_KEEPER (0x18) |
3 | parties.asm:534 BRYAN - lv12 PIDGEY, lv14 PIDGEOTTO |
TrainerBirdKeeperBryan |
no |
Wild encounters - data/wild/johto_grass.asm, def_grass_wildmons ROUTE_35,
rates 10/10/10 percent (morn/day/nite). Gold table:
| slot | morn | day | nite |
|---|---|---|---|
| 1 | 12 NIDORAN_M | 12 NIDORAN_M | 12 NIDORAN_M |
| 2 | 12 NIDORAN_F | 12 NIDORAN_F | 12 NIDORAN_F |
| 3 | 14 DROWZEE | 14 DROWZEE | 14 DROWZEE |
| 4 | 10 ABRA | 10 ABRA | 10 ABRA |
| 5 | 14 PIDGEY | 14 PIDGEY | 14 HOOTHOOT |
| 6 | 10 DITTO | 10 DITTO | 10 DITTO |
| 7 | 12 YANMA | 12 YANMA | 12 YANMA |
(Silver swaps slots 1/2 to NIDORAN_F/NIDORAN_M.)
Water (data/wild/johto_water.asm:156 def_water_wildmons ROUTE_35): 4 percent -
20 PSYDUCK, 15 PSYDUCK, 20 GOLDUCK. Fishing group is FISHGROUP_POND
(data/wild/fish.asm:15). Headbutt: data/wild/treemon_maps.asm:16 ->
TREEMON_SET_FOREST (data/wild/treemons.asm:34; Gold common CATERPIE/METAPOD/
EXEGGCUTE/BUTTERFREE, rare adds PINECO). Swarm: data/wild/swarm_grass.asm:6 is the
YANMA swarm table for ROUTE_35.
Cut tree - maps/Route35.blk has exactly one cuttable block: block id $5b at block
(8, 3), i.e. walk cells x 16-17, y 6-7. data/collision/field_move_blocks.asm:14 gives
db $5b, $3c, 0 for TILESET_JOHTO. That is the tree the walkthrough tells the player to
cut, and Bug Catcher Arnie at (16, 7) sits immediately behind it. Route 36, Route 37 and
National Park have no cuttable blocks (National Park's .park entry in
field_move_blocks.asm is only the two grass ids $13 and $03).
MAP_ROUTE_35_NATIONAL_PARK_GATE
- Script:
maps/Route35NationalParkGate.asm - Blocks:
maps/Route35NationalParkGate.blk - Header (
data/maps/maps.asm:261):TILESET_GATE, INDOOR, LANDMARK_ROUTE_35, MUSIC_GOLDENROD_CITY, FALSE, PALETTE_DAY, FISHGROUP_SHORE - Dimensions:
constants/map_constants.asm:240->map_const ROUTE_35_NATIONAL_PARK_GATE, 4, 4 - Connections: none
Warps
| idx | x | y | destination map | dest warp |
|---|---|---|---|---|
| 1 | 3 | 0 | NATIONAL_PARK |
3 |
| 2 | 4 | 0 | NATIONAL_PARK |
4 |
| 3 | 3 | 7 | ROUTE_35 |
3 |
| 4 | 4 | 7 | ROUTE_35 |
3 |
Coord events - none. The map instead uses scene scripts:
| scene id | value | script | effect |
|---|---|---|---|
SCENE_ROUTE35NATIONALPARKGATE_NOOP |
0 | Route35NationalParkGateNoop1Scene |
end |
SCENE_ROUTE35NATIONALPARKGATE_UNUSED |
1 | Route35NationalParkGateNoop2Scene |
end |
SCENE_ROUTE35NATIONALPARKGATE_LEAVE_CONTEST_EARLY |
2 | Route35NationalParkGateLeaveContestEarlyScene |
sdefer Route35NationalParkGateLeavingContestEarlyScript |
(The SCENE_* names are generated by the scene_script macro,
macros/scripts/maps.asm:25, in the order they appear in this file - there is no
separate constants file for them.)
BG events
| x | y | type | script/item |
|---|---|---|---|
| 5 | 0 | BGEVENT_READ |
BugCatchingContestExplanationSign |
Object events
| const | sprite | x | y | movement | type | script label | event flag |
|---|---|---|---|---|---|---|---|
ROUTE35NATIONALPARKGATE_OFFICER1 |
SPRITE_OFFICER |
2 | 1 | STANDING_DOWN |
OBJECTTYPE_SCRIPT |
Route35OfficerScriptContest (56:5e0c) |
EVENT_ROUTE_35_NATIONAL_PARK_GATE_OFFICER_CONTEST_DAY |
ROUTE35NATIONALPARKGATE_YOUNGSTER |
SPRITE_YOUNGSTER |
6 | 5 | WANDER (1,1) |
OBJECTTYPE_SCRIPT |
Route35NationalParkGateYoungsterScript |
EVENT_ROUTE_35_NATIONAL_PARK_GATE_YOUNGSTER |
ROUTE35NATIONALPARKGATE_OFFICER2 |
SPRITE_OFFICER |
0 | 3 | STANDING_RIGHT |
OBJECTTYPE_SCRIPT |
Route35NationalParkGateOfficerScript |
EVENT_ROUTE_35_NATIONAL_PARK_GATE_OFFICER_NOT_CONTEST_DAY |
Callbacks
MAPCALLBACK_NEWMAP->Route35NationalParkGateCheckIfContestRunningCallback:checkflag ENGINE_BUG_CONTEST_TIMER->setscene SCENE_..._LEAVE_CONTEST_EARLY, elsesetscene SCENE_..._NOOP.MAPCALLBACK_OBJECTS->Route35NationalParkGateCheckIfContestAvailableCallback(56:5db8):readvar VAR_WEEKDAY;TUESDAY/THURSDAY/SATURDAY->appear OFFICER1,disappear YOUNGSTER,disappear OFFICER2. Otherwisecheckflag ENGINE_BUG_CONTEST_TIMER(mid-contest keeps the contest officer), else the non-contest pair appears.
Scripts of interest
Route35OfficerScriptContest(56:5e0c) - the entry point. Order of checks:readvar VAR_WEEKDAY; SUNDAY/MONDAY/WEDNESDAY/FRIDAY ->Route35NationalParkGate_NoContestToday.checkflag ENGINE_DAILY_BUG_CONTEST->Route35NationalParkGate_ContestIsOver.yesorno. NO ->Route35NationalParkGate_DeclinedToParticipate.readvar VAR_PARTYCOUNT/ifgreater 1, Route35NationalParkGate_LeaveTheRestBehind. With more than one mon it needs box space (readvar VAR_BOXSPACE,ifequal 0->_NoRoomInBox), rejects an EGG lead (special CheckFirstMonIsEgg) and rejects a fainted lead (special ContestDropOffMons->iftrue _FirstMonIsFainted), thensetevent EVENT_LEFT_MONS_WITH_CONTEST_OFFICER.Route35NationalParkGate_OkayToProceed:setflag ENGINE_BUG_CONTEST_TIMER,special PlayMapMusic, park ball text,special GiveParkBalls,special FadeOutToWhite,special SelectRandomBugContestContestants,warp NATIONAL_PARK_BUG_CONTEST, 10, 47.
Route35NationalParkGateLeavingContestEarlyScript- runs when re-entering this gate whileENGINE_BUG_CONTEST_TIMERis set.readvar VAR_CONTESTMINUTES/addval 1/getnum STRING_BUFFER_3,yesorno. YES ->jumpstd BugContestResultsWarpScript. NO ->warp NATIONAL_PARK_BUG_CONTEST, 10, 47.
Flags and events
| constant | defined in | read/written by | meaning for a bot |
|---|---|---|---|
ENGINE_BUG_CONTEST_TIMER |
constants/engine_flags.asm:26 |
set by the officer, cleared by BugContestResultsScript |
"contest in progress" |
ENGINE_DAILY_BUG_CONTEST |
constants/engine_flags.asm:98 |
set by BugContestResultsScript |
"already ran today" |
EVENT_LEFT_MONS_WITH_CONTEST_OFFICER |
constants/event_flags.asm:439 |
officer / results script | party is being held |
EVENT_ROUTE_35_NATIONAL_PARK_GATE_OFFICER_CONTEST_DAY / _NOT_CONTEST_DAY / _YOUNGSTER |
constants/event_flags.asm:1255-1256 (+ youngster) |
MAPCALLBACK_OBJECTS |
which NPC is visible |
VAR_WEEKDAY |
constants/script_constants.asm (; 0b) |
callback + officer | 0=Sunday .. 6=Saturday |
VAR_CONTESTMINUTES |
constants/script_constants.asm:65 (; 11) |
early-exit script | minutes left |
Items - park balls only (see the Contest map). Trainers - none.
MAP_NATIONAL_PARK
- Script:
maps/NationalPark.asm - Blocks:
maps/NationalPark.blk(540 bytes = 20 x 27 blocks) - Header (
data/maps/maps.asm:93):TILESET_PARK, ROUTE, LANDMARK_NATIONAL_PARK, MUSIC_NATIONAL_PARK, FALSE, PALETTE_AUTO, FISHGROUP_SHORE - Dimensions:
constants/map_constants.asm:80->map_const NATIONAL_PARK, 20, 27(cells 0..39 x, 0..53 y) - Connections: none (
data/maps/attributes.asm:412has noconnectionrows). Both exits are warps.
Warps
| idx | x | y | destination map | dest warp |
|---|---|---|---|---|
| 1 | 33 | 18 | ROUTE_36_NATIONAL_PARK_GATE |
1 |
| 2 | 33 | 19 | ROUTE_36_NATIONAL_PARK_GATE |
2 |
| 3 | 10 | 47 | ROUTE_35_NATIONAL_PARK_GATE |
1 |
| 4 | 11 | 47 | ROUTE_35_NATIONAL_PARK_GATE |
2 |
Coord events - none.
BG events
| x | y | type | script/item |
|---|---|---|---|
| 14 | 44 | BGEVENT_READ |
NationalParkRelaxationSquareSign |
| 27 | 31 | BGEVENT_READ |
NationalParkBattleNoticeSign |
| 6 | 47 | BGEVENT_ITEM |
NationalParkHiddenFullHeal -> hiddenitem FULL_HEAL, EVENT_NATIONAL_PARK_HIDDEN_FULL_HEAL |
| 12 | 4 | BGEVENT_READ |
NationalParkTrainerTipsSign |
Object events
| const | sprite | x | y | movement | type | script label | event flag |
|---|---|---|---|---|---|---|---|
NATIONALPARK_LASS1 |
SPRITE_LASS |
15 | 24 | WALK_LEFT_RIGHT (1,0) |
OBJECTTYPE_SCRIPT |
NationalParkLassScript |
-1 |
NATIONALPARK_POKEFAN_F1 |
SPRITE_POKEFAN_F |
14 | 4 | STANDING_DOWN |
OBJECTTYPE_SCRIPT |
NationalParkPokefanFScript |
-1 |
NATIONALPARK_TEACHER1 |
SPRITE_TEACHER |
27 | 40 | STANDING_DOWN |
OBJECTTYPE_SCRIPT |
NationalParkTeacher1Script (43:4008) |
-1 |
NATIONALPARK_YOUNGSTER1 |
SPRITE_YOUNGSTER |
11 | 41 | STANDING_LEFT |
OBJECTTYPE_SCRIPT |
NationalParkYoungster1Script |
-1 |
NATIONALPARK_YOUNGSTER2 |
SPRITE_YOUNGSTER |
10 | 41 | STANDING_DOWN |
OBJECTTYPE_SCRIPT |
NationalParkYoungster2Script |
-1 |
NATIONALPARK_TEACHER2 |
SPRITE_TEACHER |
17 | 41 | WANDER (1,2) |
OBJECTTYPE_SCRIPT |
NationalParkTeacher2Script |
-1 |
NATIONALPARK_PERSIAN |
SPRITE_GROWLITHE |
26 | 40 | POKEMON |
OBJECTTYPE_SCRIPT |
NationalParkPersian |
-1 |
NATIONALPARK_YOUNGSTER3 |
SPRITE_YOUNGSTER |
27 | 23 | SPINRANDOM_FAST |
OBJECTTYPE_TRAINER sight 3 |
TrainerSchoolboyJack1 |
-1 |
NATIONALPARK_POKEFAN_F2 |
SPRITE_POKEFAN_F |
18 | 29 | SPINRANDOM_FAST |
OBJECTTYPE_TRAINER sight 2 |
TrainerPokefanfBeverly1 |
-1 |
NATIONALPARK_POKEFAN_M |
SPRITE_POKEFAN_M |
16 | 9 | SPINRANDOM_FAST |
OBJECTTYPE_TRAINER sight 2 |
TrainerPokefanmWilliam |
-1 |
NATIONALPARK_LASS2 |
SPRITE_LASS |
8 | 14 | SPINRANDOM_FAST |
OBJECTTYPE_TRAINER sight 3 |
TrainerLassKrise |
-1 |
NATIONALPARK_POKE_BALL1 |
SPRITE_POKE_BALL |
35 | 12 | STILL |
OBJECTTYPE_ITEMBALL |
NationalParkParlyzHeal (43:418f) |
EVENT_NATIONAL_PARK_PARLYZ_HEAL |
NATIONALPARK_GAMEBOY_KID |
SPRITE_GAMEBOY_KID |
26 | 6 | STANDING_DOWN |
OBJECTTYPE_SCRIPT |
NationalParkGameboyKidScript |
-1 |
NATIONALPARK_POKE_BALL2 |
SPRITE_POKE_BALL |
1 | 43 | STILL |
OBJECTTYPE_ITEMBALL |
NationalParkTMDig (43:4191) |
EVENT_NATIONAL_PARK_TM_DIG |
Scripts of interest
NationalParkTeacher1Script(43:4008) - the walkthrough's "lady on the bench".checkevent EVENT_GOT_QUICK_CLAW/iftrue .GotQuickClaw; else text,verbosegiveitem QUICK_CLAW,iffalse .NoRoom,setevent EVENT_GOT_QUICK_CLAW. Unlike the flower shop teacher this one does guard theseteventwithiffalse.TrainerSchoolboyJack1- phone trainer (PHONE_SCHOOLBOY_JACK). Rematch tiers:EVENT_CLEARED_RADIO_TOWER->JACK3,ENGINE_FLYPOINT_OLIVINE->JACK2, elseJACK1.TrainerPokefanfBeverly1- phone trainer (PHONE_POKEFAN_BEVERLY), female std scripts (AskNumber1FScriptetc). Rematch tiers:EVENT_CLEARED_RADIO_TOWER->BEVERLY3,ENGINE_FLYPOINT_MAHOGANY->BEVERLY2, elseBEVERLY1.
Flags and events
| constant | defined in | read/written by | meaning for a bot |
|---|---|---|---|
EVENT_GOT_QUICK_CLAW |
constants/event_flags.asm:96 |
NationalParkTeacher1Script |
one-shot gift |
EVENT_NATIONAL_PARK_PARLYZ_HEAL |
constants/event_flags.asm:1017 |
item ball | ball taken |
EVENT_NATIONAL_PARK_TM_DIG |
constants/event_flags.asm:1018 |
item ball | ball taken |
EVENT_NATIONAL_PARK_HIDDEN_FULL_HEAL |
constants/event_flags.asm:142 |
hiddenitem |
hidden item taken |
EVENT_BEAT_SCHOOLBOY_JACK, EVENT_BEAT_POKEFANF_BEVERLY, EVENT_BEAT_POKEFANM_WILLIAM, EVENT_BEAT_LASS_KRISE |
constants/event_flags.asm |
trainer rows |
defeated bits |
Items
| item | how obtained | source | one-time flag |
|---|---|---|---|
QUICK_CLAW |
talk to teacher at (27, 40) | NationalParkTeacher1Script |
EVENT_GOT_QUICK_CLAW |
PARLYZ_HEAL |
item ball at (35, 12) | NationalParkParlyzHeal |
EVENT_NATIONAL_PARK_PARLYZ_HEAL |
TM_DIG (TM28) |
item ball at (1, 43) | NationalParkTMDig |
EVENT_NATIONAL_PARK_TM_DIG |
FULL_HEAL |
hidden, bg_event at (6, 47) | NationalParkHiddenFullHeal |
EVENT_NATIONAL_PARK_HIDDEN_FULL_HEAL |
Trainers
| const | class | id | party (data/trainers/parties.asm label) |
script label | rematch/phone |
|---|---|---|---|---|---|
BEVERLY1 |
POKEFANF (0x3e) |
1 | parties.asm:3115 BEVERLY TRAINERTYPE_ITEM - lv14 SNUBBULL @ BERRY |
TrainerPokefanfBeverly1 |
yes (PHONE_POKEFAN_BEVERLY); BEVERLY2 parties.asm:3125, BEVERLY3 parties.asm:3130 |
JACK1 |
SCHOOLBOY (0x17) |
1 | parties.asm:409 JACK - lv12 ODDISH, lv15 VOLTORB |
TrainerSchoolboyJack1 |
yes (PHONE_SCHOOLBOY_JACK); JACK2 parties.asm:484, JACK3 parties.asm:490 |
KRISE |
LASS (0x19) |
4 | parties.asm:658 KRISE - lv12 ODDISH, lv15 CUBONE |
TrainerLassKrise |
no |
WILLIAM |
POKEFANM (0x3b) |
1 | parties.asm:2961 WILLIAM TRAINERTYPE_ITEM - lv14 RAICHU @ BERRY |
TrainerPokefanmWilliam |
no |
Wild encounters - data/wild/johto_grass.asm, def_grass_wildmons NATIONAL_PARK,
rates 10/10/10 percent. Gold table:
| slot | morn | day | nite |
|---|---|---|---|
| 1 | 10 CATERPIE | 10 CATERPIE | 10 HOOTHOOT |
| 2 | 10 METAPOD | 10 METAPOD | 10 HOOTHOOT |
| 3 | 12 CATERPIE | 11 SUNKERN | 12 HOOTHOOT |
| 4 | 12 PIDGEY | 12 PIDGEY | 12 HOOTHOOT |
| 5 | 10 PIDGEY | 13 SUNKERN | 10 HOOTHOOT |
| 6 | 14 PIDGEY | 14 PIDGEY | 14 HOOTHOOT |
| 7 | 14 PIDGEY | 14 PIDGEY | 14 HOOTHOOT |
(Silver uses WEEDLE/KAKUNA in slots 1-3 morn. The nite block is shared by both versions.)
No NATIONAL_PARK entry exists in data/wild/johto_water.asm, data/wild/treemon_maps.asm
or data/wild/swarm_grass.asm. The rare bugs the walkthrough lists (Scyther, Pinsir,
Paras, Venonat, Butterfree, Beedrill) are Contest-only; see below.
MAP_NATIONAL_PARK_BUG_CONTEST
- Script:
maps/NationalParkBugContest.asm - Blocks: none of its own;
data/maps/attributes.asm:413givesmap_attributes NationalParkBugContest, NATIONAL_PARK_BUG_CONTEST, $00and the map is a same-geometry twin of National Park. - Header (
data/maps/maps.asm:94):TILESET_PARK, ROUTE, LANDMARK_NATIONAL_PARK, MUSIC_BUG_CATCHING_CONTEST, FALSE, PALETTE_AUTO, FISHGROUP_SHORE - Dimensions:
constants/map_constants.asm:81->map_const NATIONAL_PARK_BUG_CONTEST, 20, 27 - Connections: none
Warps
| idx | x | y | destination map | dest warp |
|---|---|---|---|---|
| 1 | 33 | 18 | ROUTE_36_NATIONAL_PARK_GATE |
1 |
| 2 | 33 | 19 | ROUTE_36_NATIONAL_PARK_GATE |
1 |
| 3 | 10 | 47 | ROUTE_35_NATIONAL_PARK_GATE |
1 |
| 4 | 11 | 47 | ROUTE_35_NATIONAL_PARK_GATE |
1 |
(Warps 2 and 4 point at dest warp 1, not 2 - that is what the file says.)
Coord events - none.
BG events - same four rows as National Park, aimed at the ...BugContest... copies:
(14,44) Relaxation Square sign, (27,31) Battle Notice sign, (6,47) BGEVENT_ITEM
hiddenitem FULL_HEAL, EVENT_NATIONAL_PARK_HIDDEN_FULL_HEAL (the same flag as the normal
map), (12,4) Trainer Tips sign.
Object events
| const | sprite | x | y | movement | type | script label | event flag |
|---|---|---|---|---|---|---|---|
..._YOUNGSTER1 |
SPRITE_YOUNGSTER |
19 | 29 | WANDER (2,2) |
OBJECTTYPE_SCRIPT |
BugCatchingContestant1AScript |
EVENT_BUG_CATCHING_CONTESTANT_1A |
..._YOUNGSTER2 |
SPRITE_YOUNGSTER |
28 | 22 | WANDER (2,2) |
OBJECTTYPE_SCRIPT |
BugCatchingContestant2AScript |
..._2A |
..._ROCKER |
SPRITE_ROCKER |
9 | 18 | STANDING_UP |
OBJECTTYPE_SCRIPT |
BugCatchingContestant3AScript |
..._3A |
..._POKEFAN_M |
SPRITE_POKEFAN_M |
7 | 13 | WALK_UP_DOWN (1,0) |
OBJECTTYPE_SCRIPT |
BugCatchingContestant4AScript |
..._4A |
..._YOUNGSTER3 |
SPRITE_YOUNGSTER |
23 | 9 | SPINRANDOM_SLOW |
OBJECTTYPE_SCRIPT |
BugCatchingContestant5AScript |
..._5A |
..._YOUNGSTER4 |
SPRITE_YOUNGSTER |
27 | 13 | WANDER (3,3) |
OBJECTTYPE_SCRIPT |
BugCatchingContestant6AScript |
..._6A |
..._LASS |
SPRITE_LASS |
7 | 23 | WALK_LEFT_RIGHT (2,0) |
OBJECTTYPE_SCRIPT |
BugCatchingContestant7AScript |
..._7A |
..._YOUNGSTER5 |
SPRITE_YOUNGSTER |
11 | 27 | WANDER (1,1) |
OBJECTTYPE_SCRIPT |
BugCatchingContestant8AScript |
..._8A |
..._YOUNGSTER6 |
SPRITE_YOUNGSTER |
16 | 8 | WANDER (1,1) |
OBJECTTYPE_SCRIPT |
BugCatchingContestant9AScript |
..._9A |
..._YOUNGSTER7 |
SPRITE_YOUNGSTER |
17 | 34 | WANDER (3,3) |
OBJECTTYPE_SCRIPT |
BugCatchingContestant10AScript |
..._10A |
..._POKE_BALL1 |
SPRITE_POKE_BALL |
35 | 12 | STILL |
OBJECTTYPE_ITEMBALL |
NationalParkBugContestParlyzHeal |
EVENT_NATIONAL_PARK_PARLYZ_HEAL |
..._POKE_BALL2 |
SPRITE_POKE_BALL |
1 | 43 | STILL |
OBJECTTYPE_ITEMBALL |
NationalParkBugContestTMDig |
EVENT_NATIONAL_PARK_TM_DIG |
Scripts of interest
- Every
BugCatchingContestantNAScriptisfaceplayer / opentext / writetext / waitbutton / closetext / end- flavour only, no branching. TheBvariants in the north gate are the ones that branch onEVENT_TEMPORARY_UNTIL_MAP_RELOAD_1(set byBugContestResults_FirstPlace) to say "you won". - The battle path is
BugCatchingContestBattleScript::(engine/events/bug_contest/contest.asm:9):loadvar VAR_BATTLETYPE, BATTLETYPE_CONTEST,randomwildmon,startbattle,reloadmapafterbattle,readmem wParkBallsRemaining,iffalse BugCatchingContestOutOfBallsScript. GiveParkBalls(engine/events/bug_contest/contest.asm:1) clearswContestMon, writesBUG_CONTEST_BALLSintowParkBallsRemainingandfarcall StartBugContestTimer.
Contest constants (constants/script_constants.asm)
| constant | line | value |
|---|---|---|
BUG_CONTEST_BALLS |
283 | 20 |
BUG_CONTEST_MINUTES |
284 | 20 |
BUG_CONTEST_PLAYER |
286 | 1 |
NUM_BUG_CONTESTANTS |
287 | 10 (not counting the player) |
VAR_CONTESTMINUTES |
65 | var id 0x11 |
Contest wild table - data/wild/bug_contest_mons.asm, label ContestMons
(25:7bb8). This table replaces National Park's grass entirely for the duration:
| % | species | min lv | max lv |
|---|---|---|---|
| 20 | CATERPIE | 7 | 18 |
| 20 | WEEDLE | 7 | 18 |
| 10 | METAPOD | 9 | 18 |
| 10 | KAKUNA | 9 | 18 |
| 5 | BUTTERFREE | 12 | 15 |
| 5 | BEEDRILL | 12 | 15 |
| 10 | VENONAT | 10 | 16 |
| 10 | PARAS | 10 | 17 |
| 5 | SCYTHER | 13 | 14 |
| 5 | PINSIR | 13 | 14 |
| -1 (terminator row) | VENOMOTH | 30 | 40 |
Scoring - ContestScore (04:7cbc, engine/events/bug_contest/judging.asm) sums:
MaxHP * 4 (high byte only), then Attack, Defense, Speed, SpclAtk, SpclDef, then a DV
bonus assembled from bit 1 of each DV nibble, then remaining HP / 8, then +1 if the
mon is holding an item. Five of the ten AI contestants are rolled by
ComputeAIContestantScores, each picking one of three canned mon/score pairs from
BugContestantPointers (data/events/bug_contest_winners.asm) with a 0..7 random
perturbation. DetermineContestWinners keeps a 3-deep podium.
Prizes - BugContestResultsScript (40:420e, engine/events/std_scripts.asm:275):
| place | item | no-room fallback flag |
|---|---|---|
| 1st | SUN_STONE |
EVENT_CONTEST_OFFICER_HAS_SUN_STONE |
| 2nd | EVERSTONE |
EVENT_CONTEST_OFFICER_HAS_EVERSTONE |
| 3rd | GOLD_BERRY |
EVENT_CONTEST_OFFICER_HAS_GOLD_BERRY |
| consolation | BERRY |
EVENT_CONTEST_OFFICER_HAS_BERRY |
First place also sets EVENT_TEMPORARY_UNTIL_MAP_RELOAD_1. The tail of the script clears
ENGINE_BUG_CONTEST_TIMER, sets all twenty EVENT_BUG_CATCHING_CONTESTANT_* flags, sets
ENGINE_DAILY_BUG_CONTEST, and resets both gate scenes to their NOOP.
MAP_ROUTE_36_NATIONAL_PARK_GATE
- Script:
maps/Route36NationalParkGate.asm - Blocks:
maps/Route36NationalParkGate.blk - Header (
data/maps/maps.asm:263):TILESET_GATE, INDOOR, LANDMARK_ROUTE_36, MUSIC_GOLDENROD_CITY, FALSE, PALETTE_DAY, FISHGROUP_SHORE - Dimensions:
constants/map_constants.asm:242->map_const ROUTE_36_NATIONAL_PARK_GATE, 5, 4 - Connections: none
Warps
| idx | x | y | destination map | dest warp |
|---|---|---|---|---|
| 1 | 0 | 4 | NATIONAL_PARK |
1 |
| 2 | 0 | 5 | NATIONAL_PARK |
2 |
| 3 | 9 | 4 | ROUTE_36 |
1 |
| 4 | 9 | 5 | ROUTE_36 |
2 |
Coord events - none. Scene scripts (same three-slot shape as the south gate):
SCENE_ROUTE36NATIONALPARKGATE_NOOP (0), ..._UNUSED (1),
..._LEAVE_CONTEST_EARLY (2) -> sdefer Route36NationalParkGateLeavingContestEarlyScript.
BG events
| x | y | type | script/item |
|---|---|---|---|
| 6 | 0 | BGEVENT_READ |
BugCatchingContestExplanationSign (the label defined in maps/Route35NationalParkGate.asm) |
Object events
| const | sprite | x | y | movement | type | script label | event flag |
|---|---|---|---|---|---|---|---|
ROUTE36NATIONALPARKGATE_OFFICER1 |
SPRITE_OFFICER |
0 | 3 | STANDING_DOWN |
OBJECTTYPE_SCRIPT |
Route36OfficerScriptContest (56:67cc) |
EVENT_ROUTE_36_NATIONAL_PARK_GATE_OFFICER_CONTEST_DAY |
..._YOUNGSTER1 |
SPRITE_YOUNGSTER |
2 | 5 | STANDING_UP |
OBJECTTYPE_SCRIPT |
BugCatchingContestant1BScript |
EVENT_BUG_CATCHING_CONTESTANT_1B |
..._YOUNGSTER2 |
SPRITE_YOUNGSTER |
4 | 5 | STANDING_UP |
OBJECTTYPE_SCRIPT |
BugCatchingContestant2BScript |
..._2B |
..._ROCKER |
SPRITE_ROCKER |
2 | 6 | STANDING_UP |
OBJECTTYPE_SCRIPT |
BugCatchingContestant3BScript |
..._3B |
..._POKEFAN_M |
SPRITE_POKEFAN_M |
6 | 5 | STANDING_UP |
OBJECTTYPE_SCRIPT |
BugCatchingContestant4BScript |
..._4B |
..._YOUNGSTER3 |
SPRITE_YOUNGSTER |
2 | 7 | STANDING_UP |
OBJECTTYPE_SCRIPT |
BugCatchingContestant5BScript |
..._5B |
..._YOUNGSTER4 |
SPRITE_YOUNGSTER |
5 | 6 | STANDING_UP |
OBJECTTYPE_SCRIPT |
BugCatchingContestant6BScript |
..._6B |
..._LASS |
SPRITE_LASS |
3 | 6 | STANDING_UP |
OBJECTTYPE_SCRIPT |
BugCatchingContestant7BScript |
..._7B |
..._YOUNGSTER5 |
SPRITE_YOUNGSTER |
4 | 7 | STANDING_UP |
OBJECTTYPE_SCRIPT |
BugCatchingContestant8BScript |
..._8B |
..._YOUNGSTER6 |
SPRITE_YOUNGSTER |
6 | 7 | STANDING_UP |
OBJECTTYPE_SCRIPT |
BugCatchingContestant9BScript |
..._9B |
..._YOUNGSTER7 |
SPRITE_YOUNGSTER |
6 | 6 | STANDING_UP |
OBJECTTYPE_SCRIPT |
BugCatchingContestant10BScript |
..._10B |
ROUTE36NATIONALPARKGATE_OFFICER2 |
SPRITE_OFFICER |
3 | 2 | STANDING_DOWN |
OBJECTTYPE_SCRIPT |
Route36NationalParkGateOfficerScript |
EVENT_ROUTE_36_NATIONAL_PARK_GATE_OFFICER_NOT_CONTEST_DAY |
Callbacks
MAPCALLBACK_NEWMAP->Route36NationalParkGateCheckIfContestRunningCallback(same shape as the south gate).MAPCALLBACK_OBJECTS->Route36NationalParkGateCheckIfContestAvailableCallback(56:6710): firstcheckevent EVENT_WARPED_FROM_ROUTE_35_NATIONAL_PARK_GATE-> return unchanged (this is how the awards ceremony keeps the contest officer standing there when you finished from the south gate). Then weekday /ENGINE_BUG_CONTEST_TIMER, same as the south gate.
Scripts of interest
Route36OfficerScriptContest(56:67cc) - same structure as the south gate's officer but warps toNATIONAL_PARK_BUG_CONTEST, 33, 18and, ifENGINE_DAILY_BUG_CONTESTis already set, falls intoRoute36Officer_ContestHasConcluded, which is the prize holding desk: it checksEVENT_CONTEST_OFFICER_HAS_SUN_STONE, then_EVERSTONE, then_GOLD_BERRY, then_BERRY,verbosegiveitems the first one it finds and clears that event. A bot that won with a full PACK collects here.Route36NationalParkGateLeavingContestEarlyScript- the finish-now flow.special FadeOutToBlack,.CopyContestants(turns each unset..._NAflag into anappearof the matchingBobject),disappear OFFICER1/appear OFFICER2,applymovement PLAYER, Route36NationalParkGatePlayerWaitWithContestantsMovement(big_step DOWN,big_step RIGHT,turn_head UP), thenjumpstd BugContestResultsScript.
MAP_ROUTE_36
- Script:
maps/Route36.asm - Blocks:
maps/Route36.blk(270 bytes = 30 x 9 blocks) - Header (
data/maps/maps.asm:249):TILESET_JOHTO, ROUTE, LANDMARK_ROUTE_36, MUSIC_ROUTE_36, FALSE, PALETTE_AUTO, FISHGROUP_SHORE - Dimensions:
constants/map_constants.asm:228->map_const ROUTE_36, 30, 9(cells 0..59 x, 0..17 y) - Connections (
data/maps/attributes.asm:206): northROUTE_37offset 10, southROUTE_35offset 0, eastVIOLET_CITYoffset 0
Warps
| idx | x | y | destination map | dest warp |
|---|---|---|---|---|
| 1 | 18 | 8 | ROUTE_36_NATIONAL_PARK_GATE |
3 |
| 2 | 18 | 9 | ROUTE_36_NATIONAL_PARK_GATE |
4 |
| 3 | 47 | 13 | ROUTE_36_RUINS_OF_ALPH_GATE |
1 |
| 4 | 48 | 13 | ROUTE_36_RUINS_OF_ALPH_GATE |
2 |
Coord events - none. (Sudowoodo is an object, not a trip-wire.)
BG events
| x | y | type | script/item |
|---|---|---|---|
| 29 | 1 | BGEVENT_READ |
Route36TrainerTips2 |
| 45 | 11 | BGEVENT_READ |
RuinsOfAlphNorthSign |
| 55 | 7 | BGEVENT_READ |
Route36Sign |
| 21 | 7 | BGEVENT_READ |
Route36TrainerTips1 |
Object events
| const | sprite | x | y | movement | type | script label | event flag |
|---|---|---|---|---|---|---|---|
ROUTE36_YOUNGSTER1 |
SPRITE_YOUNGSTER |
20 | 12 | STANDING_RIGHT |
OBJECTTYPE_TRAINER sight 2 |
TrainerPsychicMark |
-1 |
ROUTE36_YOUNGSTER2 |
SPRITE_YOUNGSTER |
31 | 14 | STANDING_LEFT |
OBJECTTYPE_TRAINER sight 5 |
TrainerSchoolboyAlan1 |
-1 |
ROUTE36_WEIRD_TREE |
SPRITE_WEIRD_TREE |
35 | 9 | SPRITEMOVEDATA_SUDOWOODO |
OBJECTTYPE_SCRIPT |
SudowoodoScript (4b:61aa) |
EVENT_ROUTE_36_SUDOWOODO |
ROUTE36_LASS1 |
SPRITE_LASS |
51 | 8 | WALK_LEFT_RIGHT (2,0) |
OBJECTTYPE_SCRIPT |
Route36LassScript (4b:621e) |
-1 |
ROUTE36_FISHER |
SPRITE_FISHER |
44 | 9 | STANDING_LEFT |
OBJECTTYPE_SCRIPT |
Route36RockSmashGuyScript (4b:61f7) |
-1 |
ROUTE36_FRUIT_TREE |
SPRITE_FRUIT_TREE |
21 | 4 | STILL |
OBJECTTYPE_SCRIPT |
Route36FruitTree (4b:631a) |
-1 |
ROUTE36_ARTHUR |
SPRITE_YOUNGSTER |
46 | 6 | WANDER (1,1) |
OBJECTTYPE_SCRIPT |
ArthurScript (4b:62d4) |
EVENT_ROUTE_36_ARTHUR_OF_THURSDAY |
Callbacks
MAPCALLBACK_OBJECTS->Route36ArthurCallback(4b:619e):readvar VAR_WEEKDAY,ifequal THURSDAY, .ArthurAppears(->appear ROUTE36_ARTHUR), otherwisedisappear ROUTE36_ARTHUR.
Scripts of interest
SudowoodoScript(4b:61aa) - the gate of this section.checkitem SQUIRTBOTTLE/iftrue .Fight. Without it:waitsfx,playsound SFX_SANDSTORM,applymovement ROUTE36_WEIRD_TREE, SudowoodoShakeMovement(tree_shake),end- the tree just wobbles and stays solid. With it:writetext UseSquirtbottleText,yesorno,iffalse DidntUseSquirtbottleScript.WateredWeirdTreeScript::(4b:61c1) - exported so that using the SQUIRTBOTTLE from the PACK reaches the same body (engine/events/squirtbottle.asmdoesfarsjump WateredWeirdTreeScript). Body: text, shake,SudowoodoAttackedText,loadwildmon SUDOWOODO, 20,startbattle,setevent EVENT_FOUGHT_SUDOWOODO,ifequal DRAW, DidntCatchSudowoodo,disappear ROUTE36_WEIRD_TREE,variablesprite SPRITE_WEIRD_TREE, SPRITE_TWIN,reloadmapafterbattle. Note the ordering:EVENT_FOUGHT_SUDOWOODOis set before the DRAW check, so a run or a KO still clears the road and still unlocks TM08.DidntCatchSudowoodo(4b:61e9) -reloadmapafterbattle,applymovement ROUTE36_WEIRD_TREE, WeirdTreeMovement_Flee(twofast_jump_step UP),disappear,variablesprite,special LoadUsedSpritesGFX._Squirtbottle(14:4763,engine/events/squirtbottle.asm) - the PACK path..CheckCanUseSquirtbottlerequireswMapGroup == GROUP_ROUTE_36,wMapNumber == MAP_ROUTE_36,GetFacingObjectto succeed, and that object's movement data to beSPRITEMOVEDATA_SUDOWOODO. Anything else prints_SquirtbottleNothingText.Route36RockSmashGuyScript(4b:61f7) -checkevent EVENT_GOT_TM08_ROCK_SMASH->.AlreadyGotRockSmash;checkevent EVENT_FOUGHT_SUDOWOODO->.ClearedSudowoodo(verbosegiveitem TM_ROCK_SMASH,iffalse .NoRoomForTM,setevent EVENT_GOT_TM08_ROCK_SMASH). Before Sudowoodo it just printsRockSmashGuyText1.ArthurScript(4b:62d4) -checkevent EVENT_GOT_HARD_STONE_FROM_ARTHUR->.AlreadyGotStone;readvar VAR_WEEKDAY/ifnotequal THURSDAY, ArthurNotThursdayScript; elsesetevent EVENT_MET_ARTHUR_OF_THURSDAY,verbosegiveitem HARD_STONE,iffalse .BagFull,setevent EVENT_GOT_HARD_STONE_FROM_ARTHUR.Route36LassScript(4b:621e) - flavour, branches onEVENT_FOUGHT_SUDOWOODO. This is the girl at (51, 8). She is not Floria and gives nothing.
Flags and events
| constant | defined in | read/written by | meaning for a bot |
|---|---|---|---|
EVENT_ROUTE_36_SUDOWOODO |
constants/event_flags.asm:1178 |
object visibility flag; cleared by disappear in WateredWeirdTreeScript |
tree present on the map |
EVENT_FOUGHT_SUDOWOODO |
constants/event_flags.asm:51 |
set by WateredWeirdTreeScript; read by the Rock Smash guy, the Route 36 lass, the Route 35 gate pokefan |
the progress flag of this section |
EVENT_GOT_TM08_ROCK_SMASH |
constants/event_flags.asm:84 |
Route36RockSmashGuyScript |
TM08 taken |
EVENT_ROUTE_36_ARTHUR_OF_THURSDAY |
constants/event_flags.asm:1276 |
Route36ArthurCallback |
Arthur visible |
EVENT_MET_ARTHUR_OF_THURSDAY |
constants/event_flags.asm:111 |
ArthurScript |
first-meeting text |
EVENT_GOT_HARD_STONE_FROM_ARTHUR |
constants/event_flags.asm:112 |
ArthurScript |
HARD STONE taken |
EVENT_BEAT_PSYCHIC_MARK, EVENT_BEAT_SCHOOLBOY_ALAN |
constants/event_flags.asm |
trainer rows |
defeated bits |
EVENT_ALAN_ASKED_FOR_PHONE_NUMBER, EVENT_ALAN_READY_FOR_REMATCH |
constants/event_flags.asm |
Alan script | phone state machine |
Items
| item | how obtained | source | one-time flag |
|---|---|---|---|
ICE_BERRY |
fruit tree object at (21, 4) | FRUITTREE_ROUTE_36 -> data/items/fruit_trees.asm:16 |
daily |
TM_ROCK_SMASH (TM08) |
talk to the fisher at (44, 9) after Sudowoodo | Route36RockSmashGuyScript |
EVENT_GOT_TM08_ROCK_SMASH |
HARD_STONE |
talk to Arthur at (46, 6) on a Thursday | ArthurScript |
EVENT_GOT_HARD_STONE_FROM_ARTHUR |
Trainers
| const | class | id | party (data/trainers/parties.asm label) |
script label | rematch/phone |
|---|---|---|---|---|---|
MARK |
PSYCHIC_T (0x34) |
7 | parties.asm:2545 MARK TRAINERTYPE_MOVES - lv13 ABRA (TELEPORT, FLASH), lv13 ABRA (TELEPORT, FLASH), lv15 KADABRA (TELEPORT, KINESIS, CONFUSION) |
TrainerPsychicMark |
no |
ALAN1 |
SCHOOLBOY (0x17) |
3 | parties.asm:423 ALAN - lv16 TANGELA |
TrainerSchoolboyAlan1 |
yes (PHONE_SCHOOLBOY_ALAN); ALAN2 parties.asm:496, ALAN3 parties.asm:502 |
Wild - data/wild/johto_grass.asm, def_grass_wildmons ROUTE_36, 10/10/10 percent.
Gold:
| slot | morn | day | nite |
|---|---|---|---|
| 1 | 12 NIDORAN_M | 12 NIDORAN_M | 12 NIDORAN_M |
| 2 | 12 NIDORAN_F | 12 NIDORAN_F | 12 NIDORAN_F |
| 3 | 13 PIDGEY | 14 PIDGEY | 13 HOOTHOOT |
| 4 | 13 GROWLITHE | 13 GROWLITHE | 13 GROWLITHE |
| 5 | 13 STANTLER | 13 STANTLER | 13 STANTLER |
| 6 | 15 PIDGEY | 15 GROWLITHE | 15 HOOTHOOT |
| 7 | 15 PIDGEY | 15 GROWLITHE | 15 HOOTHOOT |
(Silver substitutes VULPIX for GROWLITHE and swaps the NIDORAN order.) No ROUTE_36
entry in johto_water.asm. Headbutt: data/wild/treemon_maps.asm:17 -> TREEMON_SET_FOREST.
ROUTE_36 is a roam node in data/wild/roammon_maps.asm:26 with four exits
(ROUTE_35, ROUTE_31, ROUTE_32, ROUTE_37).
MAP_ROUTE_37 (header-listed only; not entered by this walkthrough section)
- Script:
maps/Route37.asm, Blocks:maps/Route37.blk - Header (
data/maps/maps.asm:250):TILESET_JOHTO, ROUTE, LANDMARK_ROUTE_37, MUSIC_ROUTE_36, FALSE, PALETTE_AUTO, FISHGROUP_SHORE - Dimensions:
constants/map_constants.asm:229->map_const ROUTE_37, 10, 9 - Connections (
data/maps/attributes.asm:211): northECRUTEAK_CITYoffset -5, southROUTE_36offset -10 - Warps:
def_warp_eventsis empty. Route 37 is reached only by connection. - BG events: (5,3)
BGEVENT_READRoute37Sign; (4,2)BGEVENT_ITEMRoute37HiddenEther->hiddenitem ETHER, EVENT_ROUTE_37_HIDDEN_ETHER. - Objects: Twins Ann & Anne at (6,12) and (7,12) (
ANNANDANNE1/ANNANDANNE2, both sharingEVENT_BEAT_TWINS_ANN_AND_ANNE), Psychic Greg at (9,6), three fruit trees at (13,5)FRUITTREE_ROUTE_37_1=RED_APRICORN, (16,5)_2=BLU_APRICORN, (15,7)_3=BLK_APRICORN(data/items/fruit_trees.asm:20-22), and Sunny of Sunday at (16,8) behindEVENT_ROUTE_37_SUNNY_OF_SUNDAY(giftMAGNET,EVENT_GOT_MAGNET_FROM_SUNNY). - Callback:
MAPCALLBACK_OBJECTS->Route37SunnyCallback(weekday == SUNDAY). - Wild:
data/wild/johto_grass.asmdef_grass_wildmons ROUTE_37, 10/10/10; Gold nite slot 1/5/6/7 are SPINARAK 13/15/15/15, Silver morn is LEDYBA - this is where the walkthrough's "Ledyba (Silver only, morning only) / Spinarak (Gold only, night only)" actually lives.
3. Blockers and gates
| Gate | Enforced by (file:label) | Requirement | Unlock condition |
|---|---|---|---|
| SQUIRTBOTTLE not obtainable | maps/GoldenrodFlowerShop.asm:FlowerShopTeacherScript (57:52d1) - checkflag ENGINE_PLAINBADGE / iffalse .Lalala |
Plain Badge (Whitney) | beat Whitney; talk to the teacher at (2,4) |
| Sudowoodo blocks Route 36 | maps/Route36.asm:SudowoodoScript (4b:61aa) - the object at cell (35,9) with SPRITEMOVEDATA_SUDOWOODO is a solid NPC; the script's checkitem SQUIRTBOTTLE / iftrue .Fight is the only way past |
SQUIRTBOTTLE in the PACK | EVENT_FOUGHT_SUDOWOODO set by WateredWeirdTreeScript (4b:61c1); the disappear runs on any outcome except a draw-flee, and the flee path disappears it too |
| SQUIRTBOTTLE from the PACK does nothing elsewhere | engine/events/squirtbottle.asm:_Squirtbottle (14:4763) .CheckCanUseSquirtbottle |
map must be ROUTE_36 and the faced object must carry SPRITEMOVEDATA_SUDOWOODO |
face the tree first |
| TM08 ROCK SMASH withheld | maps/Route36.asm:Route36RockSmashGuyScript (4b:61f7) - checkevent EVENT_FOUGHT_SUDOWOODO |
Sudowoodo dealt with | talk to the fisher at (44, 9) |
| East side of Route 35 (Arnie, Bryan, TM04) | maps/Route35.blk block $5b at block (8,3) = cells x16-17 y6-7; data/collision/field_move_blocks.asm:14 |
CUT, which needs ENGINE_HIVEBADGE (engine/events/overworld.asm:133 CutFunction.CheckAble) and a party mon that knows CUT |
Azalea's badge + HM01; or enter from Route 36 via the south connection, which is what the walkthrough does |
| Bug Contest closed | maps/Route35NationalParkGate.asm:Route35OfficerScriptContest (56:5e0c) and maps/Route36NationalParkGate.asm:Route36OfficerScriptContest (56:67cc) - readvar VAR_WEEKDAY, four ifequal bail-outs, plus checkflag ENGINE_DAILY_BUG_CONTEST |
Tuesday, Thursday or Saturday, and not already run today | set the RTC weekday; ENGINE_DAILY_BUG_CONTEST clears on the daily reset |
| Contest entry refused | same scripts - readvar VAR_PARTYCOUNT / VAR_BOXSPACE / special CheckFirstMonIsEgg / special ContestDropOffMons |
lead mon is not an EGG, is not fainted, and there is party-or-box room for a caught bug | reorder the party, heal, free a box slot |
| Kenya not given | maps/Route35GoldenrodGate.asm:RandyScript (56:59ce) - readvar VAR_PARTYCOUNT / ifequal PARTY_LENGTH, .partyfull |
fewer than 6 party mons | deposit one |
| Arthur / Sunny absent | Route36ArthurCallback (4b:619e) / Route37SunnyCallback - MAPCALLBACK_OBJECTS + VAR_WEEKDAY |
Thursday / Sunday | RTC weekday |
| Officer Dirk will not battle | maps/Route35.asm:TrainerOfficerDirk - checktime NITE / iffalse .NotNight |
night time of day | wait, or set the RTC |
4. Bot checklist
Coordinates are (x, y) walk cells as written in the asm. "talk" means stand adjacent
facing the target and press A.
MAP_GOLDENROD_CITY-> warp 6 at (33, 5). Pre:ENGINE_PLAINBADGEset. Post: onMAP_GOLDENROD_FLOWER_SHOP.MAP_GOLDENROD_FLOWER_SHOP: talk toGOLDENRODFLOWERSHOP_TEACHERat (2, 4). Pre:!EVENT_GOT_SQUIRTBOTTLEand a free KEY ITEM slot. Post:EVENT_GOT_SQUIRTBOTTLE, SQUIRTBOTTLE in the PACK.- Exit via warp 1 (2, 7) ->
MAP_GOLDENROD_CITYwarp 6. Walk to (19, 1), warp 13 ->MAP_ROUTE_35_GOLDENROD_GATEwarp 3. - Optional: talk to
ROUTE35GOLDENRODGATE_RANDYat (0, 4), answer YES. Pre:VAR_PARTYCOUNT < 6. Post:EVENT_GOT_KENYA, lv10 SPEAROW "KENYA" withFLOWER_MAILin the last party slot. - Warp 1 at (4, 0) ->
MAP_ROUTE_35warp 1 (lands at (9, 33)). MAP_ROUTE_35, walk north. Battle, in the walkthrough's order: Kim (11, 24), Elliot (8, 20), Brooke (7, 20), Ivan (3, 19), Irwin (5, 10), Walt (2, 10). Post:EVENT_BEAT_*for each. Sight ranges are 3/3/3/4/2/2.- Optional, night only: talk to
ROUTE35_OFFICERat (5, 6). Pre:checktime NITEtrue and!EVENT_BEAT_OFFICER_DIRK. Post:EVENT_BEAT_OFFICER_DIRK. - Walk to (3, 5), warp 3 ->
MAP_ROUTE_35_NATIONAL_PARK_GATEwarp 3. - Optional Contest: on a Tue/Thu/Sat with
!ENGINE_DAILY_BUG_CONTEST, talk toROUTE35NATIONALPARKGATE_OFFICER1at (2, 1) and answer YES. Post:ENGINE_BUG_CONTEST_TIMERset, 20 PARK BALLs, warp toMAP_NATIONAL_PARK_BUG_CONTEST(10, 47). Finish by re-entering either gate and answering YES, or by running the timer/balls out. Post:ENGINE_DAILY_BUG_CONTEST, prize per placing,ENGINE_BUG_CONTEST_TIMERcleared. - Warp 1 at (3, 0) ->
MAP_NATIONAL_PARKwarp 3 (lands at (10, 47)). MAP_NATIONAL_PARK: talk toNATIONALPARK_TEACHER1at (27, 40). Pre:!EVENT_GOT_QUICK_CLAW, PACK room. Post:EVENT_GOT_QUICK_CLAW.- Optional: item ball at (1, 43) ->
TM_DIG, flagEVENT_NATIONAL_PARK_TM_DIG. HiddenFULL_HEALat bg (6, 47), flagEVENT_NATIONAL_PARK_HIDDEN_FULL_HEAL. Item ball at (35, 12) ->PARLYZ_HEAL, flagEVENT_NATIONAL_PARK_PARLYZ_HEAL. - Battle Beverly (18, 29), Jack (27, 23), Krise (8, 14), William (16, 9).
- Walk to (33, 18), warp 1 ->
MAP_ROUTE_36_NATIONAL_PARK_GATEwarp 1. If a prize was held: talk toROUTE36NATIONALPARKGATE_OFFICER1at (0, 3) withENGINE_DAILY_BUG_CONTESTset to collect it. - Warp 3 at (9, 4) ->
MAP_ROUTE_36warp 1 (lands at (18, 8)). MAP_ROUTE_36: fruit tree at (21, 4) ->ICE_BERRY. Battle Psychic Mark at (20, 12).- Leave south (
ROUTE_36south connection, offset 0) intoMAP_ROUTE_35's north edge. MAP_ROUTE_35east side: CUT the tree at block (8, 3) (cells x16-17, y6-7). Pre:ENGINE_HIVEBADGE+ a mon knowing CUT. Then battle Arnie at (16, 7) and Bryan at (14, 28), and take the item ball at (13, 16) ->TM_ROLLOUT(EVENT_ROUTE_35_TM_ROLLOUT). Talk to Arnie a second time forPHONE_BUG_CATCHER_ARNIE.- Return north to
MAP_ROUTE_36. Battle Schoolboy Alan at (31, 14); talk again forPHONE_SCHOOLBOY_ALAN. - Walk to face
ROUTE36_WEIRD_TREEat (35, 9) and press A. Pre: SQUIRTBOTTLE in the PACK (checkitem). Answer YES. A lv20 SUDOWOODO wild battle starts (loadwildmon SUDOWOODO, 20). Post:EVENT_FOUGHT_SUDOWOODOset regardless of outcome;EVENT_ROUTE_36_SUDOWOODOcleared, sprite swapped toSPRITE_TWIN. - Talk to
ROUTE36_FISHERat (44, 9). Pre:EVENT_FOUGHT_SUDOWOODO, PACK room. Post:EVENT_GOT_TM08_ROCK_SMASH, TM08 ROCK SMASH. - Optional, Thursday only: talk to
ROUTE36_ARTHURat (46, 6). Post:EVENT_MET_ARTHUR_OF_THURSDAY,EVENT_GOT_HARD_STONE_FROM_ARTHUR, HARD STONE. - Continue east past x=59 on the
ROUTE_36east connection intoMAP_VIOLET_CITY(next section).
5. Port coverage
| Beat | Port file | Status |
|---|---|---|
| Map geometry, warps, bg/object events for all nine maps | src/import/RomExtractorGen2.lua (extracted into the cache), consumed by src/world/gen2/World.lua / Map.lua |
implemented (data-driven; nothing map-specific is hand written) |
Script bytecode for every label above (FlowerShopTeacherScript, RandyScript, SudowoodoScript, Route36RockSmashGuyScript, ArthurScript, both contest officers, BugContestResultsScript) |
src/script/gen2/Vm.lua + extracted bytecode |
implemented - the opcodes these scripts use (checkevent, checkflag, checkitem, verbosegiveitem, givepoke, givepokemail, loadwildmon, variablesprite, appear/disappear, setscene, sdefer, askforphonenumber, checkcellnum, checktime, fruittree) all have branches in Vm.lua / Opcodes.lua |
VAR_WEEKDAY (Arthur, Sunny, contest days) |
src/world/gen2/World.lua:1201 World:weekday, World.lua:101 VAR_WEEKDAY = 0x0b |
implemented |
MAPCALLBACK_OBJECTS day-of-week NPC swaps |
src/world/gen2/World.lua:5991 World:runMapCallback, called from World.lua:5700 |
implemented; assertion driver tests/drivers/gold_map_callbacks.lua exists but does not cover Route 36 / Route 37 / either park gate |
| Bug Catching Contest rules, timer, park balls, scoring, AI contestants, prizes | src/core/gen2/BugContest.lua (815 lines; transcribed from bug_contest/judging.asm, contest.asm, contest_2.asm, caught_mon.asm, bug_contest_mons.asm) |
implemented - BugContest.score, rollContestant, judge, prizeFor, pickContestants, dropOffMons, returnMons, start/stop/tickTimer, chooseWild |
| Contest comparison / debug UI | src/ui/gen2/ContestMenu.lua |
implemented (a comparison screen, not the cart's HUD) |
| Contest super-tall-grass doubled encounter rate | src/world/gen2/Permissions.lua:85 SUPER_TALL_GRASS, BugContest.encounterRate |
implemented |
| Squirtbottle field check | src/script/gen2/CallAsm.lua:411 H.CheckCanUseSquirtbottle (registered as "14:4786"), tested in tests/gen2_callasm_test.lua:224-244 |
implemented |
| Using the SQUIRTBOTTLE from the PACK | src/world/gen2/World.lua:3294 World:useFieldItem |
missing - the dispatch has arms only for ITEMFINDER, BICYCLE, SACRED_ASH, repels, trophy boxes and rods. There is no SQUIRTBOTTLE arm, so _Squirtbottle is unreachable from the PACK. The talk-to-the-tree path (SudowoodoScript's checkitem) still works, which is the route the walkthrough takes |
| Item ball pickup (TM04 on Route 35, TM28 DIG and PARLYZ HEAL in National Park) | extractor reads them (src/import/RomExtractorGen2.lua:2969 obj.itemball = readItemBall(...)) but src/world/gen2/World.lua:5257 World:interact only dispatches on npc.def.trainer, strength boulders, npc.def.scriptKey, bg events and hidden items |
missing - OBJECTTYPE_ITEMBALL objects have no scriptKey by design, and nothing consumes obj.itemball. A bot cannot pick up any of this section's three item balls |
| Hidden item (National Park FULL HEAL, Route 37 ETHER) | src/world/gen2/HiddenItems.lua, wired into World:interact |
implemented |
| Fruit trees (MYSTERYBERRY, ICE BERRY, the Route 37 apricorns) | src/core/gen2/Apricorns.lua + the VM's fruittree branch |
implemented |
Overworld trainers, sight ranges, loadtrainer / startbattle |
src/world/gen2/Trainers.lua, src/battle/gen2/Battle.lua |
implemented |
| Phone numbers and rematch tiers (Irwin, Arnie, Jack, Beverly, Alan) | src/core/gen2/Phone.lua (Jack, Beverly, Irwin, Arnie, Alan all have callee/caller script keys and ..._READY_FOR_REMATCH event ids) |
implemented |
| Kenya the SPEAROW + FLOWER MAIL | src/core/gen2/Mail.lua + Vm.lua:439 givepoke / Vm.lua:462 givepokemail |
implemented (extractor resolves cmd.mail) |
CUT field move + ENGINE_HIVEBADGE gate + the Route 35 tree block |
src/world/gen2/FieldMoves.lua:104 (CUT = "HIVE"), FieldMoves.somethingToCut, World:tryCutOW |
implemented |
| Sudowoodo wild battle + DRAW-flee branch | src/script/gen2/Vm.lua:44 (DRAW), Vm.lua:836 loadwildmon, World.lua:5067 (variablesprite with a raw sprite id) |
implemented |
| Driver / regression coverage for this specific stretch | tests/drivers/gold_*.lua |
missing - there is no driver that walks Route 35 -> National Park -> Route 36, runs a contest, or fights Sudowoodo. tests/gen2_contest_test.lua covers the contest rules headlessly; tests/gen2_callasm_test.lua covers only the Squirtbottle facing check |
6. Unresolved / verify by hand
- "Talk to Floria... while she goes away to get the Squirtbottle." No such script
exists in pokegold.
maps/GoldenrodFlowerShop.asmhas aGOLDENRODFLOWERSHOP_FLORIAobject at (5, 6) whoseFlowerShopFloriaScriptonly prints text, and the girl on Route 36 at (51, 8) is an anonymousROUTE36_LASS1runningRoute36LassScript, which also only prints text. The SQUIRTBOTTLE comes fromFlowerShopTeacherScriptgated onENGINE_PLAINBADGEalone, with no Route 36 precondition. The described sequence looks like Crystal behaviour that leaked into a Gold/Silver walkthrough. - Contest Pokemon list. The walkthrough lists "Caterpie/Weedle, Nincada, Scyther,
Pinsir, Volbeat, Wurmple" at "Levels 28-31".
data/wild/bug_contest_mons.asmhas CATERPIE, WEEDLE, METAPOD, KAKUNA, BUTTERFREE, BEEDRILL, VENONAT, PARAS, SCYTHER, PINSIR at levels 7-18 (plus VENOMOTH 30-40 on the-1terminator row, which is never selected). NINCADA, VOLBEAT and WURMPLE do not exist in Gen 2 at all. Treat the walkthrough's list and levels as wrong for this game. - "20 Sport Balls." The item is
PARK_BALL(constants/item_constants.asm:185), given byspecial GiveParkBalls, countBUG_CONTEST_BALLS = 20. "Sport Ball" is the Gen 3+ name. - "If you win the contest, you can win a Shiny Stone!" First place gives
SUN_STONE(BugContestResults_FirstPlace,engine/events/std_scripts.asm:346). The walkthrough's own item list ("Sun Stone (1st Prize)") agrees; the prose line does not. There is no Shiny Stone in Gen 2. - "If you catch a Scyther at full HP, it may be worth around 342 points." Not
verifiable from the asm without a concrete mon:
ContestScore(04:7cbc) isMaxHP*4 + Atk + Def + Spe + SpA + SpD + DVbonus + HP/8 + heldItem, all taken from the high byte of each stat word. The walkthrough's qualitative claim ("score takes HP into consideration") is confirmed; the specific number is not checked here. - National Park species list. The walkthrough lists Butterfree, Weedle, Kakuna,
Beedrill, Paras, Venonat, Scyther and Pinsir as "found in National Park". None of them
appear in
def_grass_wildmons NATIONAL_PARK; they are Contest-only (data/wild/bug_contest_mons.asm). Sunkern, Caterpie, Metapod, Pidgey and Hoothoot are the only real National Park grass encounters in Gold. - "Routes 36 & 37" item and species lists are merged. Everything the walkthrough
attributes to "Routes 36 & 37" except the ICE BERRY, HARD STONE and TM08 actually lives
on Route 37 (
RED_APRICORN,BLU_APRICORN,BLK_APRICORN; Ledyba/Spinarak/Pidgeotto), which this section never enters. Vulpix/Growlithe and Stantler appear on both routes. - "Route 35 & National Park" item list omits the hidden FULL HEAL at National Park bg (6, 47) and lists no hidden items at all. Not a contradiction, just incomplete.
- "Head back to Arnie and talk to her."
BUG_CATCHER, ARNIE1uses the male phone std scripts (AskNumber1MScript,RegisteredNumberMScript). Cosmetic only. - "Then, we're ready to head into Route 35 after Liz's offer for a rematch on Route 32." Liz's rematch is a phone event outside this section's maps; no code on any map in this section references it, so it was not resolved here.
EVENT_FOUGHT_SUDOWOODOis set before the DRAW check inWateredWeirdTreeScript, and both the win branch andDidntCatchSudowoodorundisappear ROUTE36_WEIRD_TREE. So the walkthrough's "catch it or else" is a preference, not a gate - fainting or fleeing still opens the road and still unlocks TM08. Worth confirming in-game that a black-out mid-battle does not leave a half-applied state, which the asm alone cannot answer.MAP_NATIONAL_PARK_BUG_CONTESTwarps 2 and 4 point at destination warp 1, not 2, inmaps/NationalParkBugContest.asm:228,230. Transcribed verbatim; a bot pathing off those rows should expect the asymmetry rather than assume a typo.