70 KiB
Section 13 - Ice Path and Blackthorn City Gym
Source: ../section-13-ice-path-and-blackthorn-city-gym.txt
(the FAQ's own internal heading for this block is ---- 19 > Ice Path and Blackthorn City Gym ----)
Maps covered: MAP_ROUTE_44, MAP_ICE_PATH_1F, MAP_ICE_PATH_B1F,
MAP_ICE_PATH_B2F_MAHOGANY_SIDE, MAP_ICE_PATH_B3F,
MAP_ICE_PATH_B2F_BLACKTHORN_SIDE, MAP_BLACKTHORN_CITY,
MAP_BLACKTHORN_POKECENTER_1F, MAP_BLACKTHORN_MART, MAP_BLACKTHORN_EMYS_HOUSE,
MAP_MOVE_DELETERS_HOUSE, MAP_BLACKTHORN_DRAGON_SPEECH_HOUSE,
MAP_BLACKTHORN_GYM_1F, MAP_BLACKTHORN_GYM_2F, MAP_DRAGONS_DEN_1F,
MAP_DRAGONS_DEN_B1F
Badges / key milestones in this section:
EVENT_GOT_HM07_WATERFALL(HM07 onMAP_ICE_PATH_1F)EVENT_BEAT_CLAIR(the battle is won, but no badge yet)EVENT_DRAGONS_DEN_B1F_DRAGON_FANG->ENGINE_RISINGBADGE+EVENT_GOT_TM24_DRAGONBREATHspecialphonecall SPECIALCALL_MASTERBALLqueued (Elm's Master Ball call, redeemed next section)
1. Route order
| # | Map constant | asm file | Enter via | Leaves via | Why (walkthrough beat) |
|---|---|---|---|---|---|
| 0 | MAP_MAHOGANY_TOWN |
(previous section) | Fly | east map connection | "fly back to Mahogany Town, heal, head east onto Route 44" |
| 1 | MAP_ROUTE_44 |
maps/Route44.asm |
west connection from MAHOGANY_TOWN |
warp 1 at (56, 7) | six trainers, Burnt Berry tree, two item balls |
| 2 | MAP_ICE_PATH_1F |
maps/IcePath1F.asm |
warp 1 (4, 19) from Route 44 | warp 3 (37, 5) | first ice maze, HM07 Waterfall |
| 3 | MAP_ICE_PATH_B1F |
maps/IcePathB1F.asm |
warp 1 (3, 15) | warp 2 (17, 3) | Strength boulder-into-hole puzzle |
| 4 | MAP_ICE_PATH_B2F_MAHOGANY_SIDE |
maps/IcePathB2FMahoganySide.asm |
warp 1 (17, 1), or drop through holes | warp 2 (9, 11) | Full Heal, Max Potion, hidden Carbos |
| 5 | MAP_ICE_PATH_B3F |
maps/IcePathB3F.asm |
warp 1 (3, 5) | warp 2 (15, 5) | Rock Smash the rock, Nevermeltice |
| 6 | MAP_ICE_PATH_B2F_BLACKTHORN_SIDE |
maps/IcePathB2FBlackthornSide.asm |
warp 2 (3, 3) | warp 1 (3, 15) | TM44 Rest, hidden Ice Heal |
| 7 | MAP_ICE_PATH_B1F (south region) |
maps/IcePathB1F.asm |
warp 8 (11, 27) | warp 7 (5, 25) | Iron at (5, 35), hidden Max Potion |
| 8 | MAP_ICE_PATH_1F (south region) |
maps/IcePath1F.asm |
warp 4 (37, 13) | warp 2 (36, 27) | PP Up at (32, 23), then out |
| 9 | MAP_BLACKTHORN_CITY |
maps/BlackthornCity.asm |
warp 7 (36, 9) | see below | heal, restock, Move Deleter, Emy's trade |
| 10 | MAP_BLACKTHORN_POKECENTER_1F |
maps/BlackthornPokecenter1F.asm |
city warp 5 (21, 29) | warp 1/2 | heal |
| 11 | MAP_BLACKTHORN_MART |
maps/BlackthornMart.asm |
city warp 4 (15, 29) | warp 1/2 | restock Ultra Balls |
| 12 | MAP_BLACKTHORN_EMYS_HOUSE |
maps/BlackthornEmysHouse.asm |
city warp 3 (29, 23) | warp 1/2 | Dragonair <-> Rhydon trade ("northeast house") |
| 13 | MAP_MOVE_DELETERS_HOUSE |
maps/MoveDeletersHouse.asm |
city warp 6 (9, 31) | warp 1/2 | delete HM moves ("house in the south") |
| 14 | MAP_BLACKTHORN_GYM_1F |
maps/BlackthornGym1F.asm |
city warp 1 (18, 11) | warp 1/2 (4/5, 17) | Paul, Mike, Lola, Clair |
| 15 | MAP_BLACKTHORN_GYM_2F |
maps/BlackthornGym2F.asm |
1F warp 3 (1, 7) / warp 4 (7, 9) | holes and stairs | Cody, Fran, six-boulder puzzle |
| 16 | MAP_DRAGONS_DEN_1F |
maps/DragonsDen1F.asm |
city warp 8 (20, 1) | warp 3 (5, 15) | corridor + internal ladder pair |
| 17 | MAP_DRAGONS_DEN_B1F |
maps/DragonsDenB1F.asm |
warp 1 (20, 3) | same warp | Surf + Whirlpool to the Dragon Fang at (35, 16); Clair hands over ENGINE_RISINGBADGE |
Not covered here (next section): the walkthrough's last paragraph sends the player
back to MAP_ELMS_LAB for the Master Ball (ElmGiveMasterBallScript,
maps/ElmsLab.asm) and on toward the Pokemon League. The video-link header also
names Dark Cave, but the prose never enters MAP_DARK_CAVE_BLACKTHORN_ENTRANCE.
MAP_BLACKTHORN_DRAGON_SPEECH_HOUSE (city warp 2, (13, 21)) is on the map but the
walkthrough never enters it; it is documented below for completeness.
2. Maps
MAP_ROUTE_44
- Script:
maps/Route44.asm(Route44_MapEvents=4d:4dd9inpokegold.sym) - Blocks:
maps/Route44.blk - Header:
data/maps/maps.asm:73->TILESET_JOHTO,ROUTE,LANDMARK_ROUTE_44,MUSIC_LAKE_OF_RAGE, phoneFALSE,PALETTE_AUTO,FISHGROUP_REMORAID - Dimensions:
constants/map_constants.asm:61->map_const ROUTE_44, 30, 9(so x in 0..59, y in 0..17) - Connections:
data/maps/attributes.asm:239-> westMAHOGANY_TOWN(offset 0), eastBLACKTHORN_CITY(offset -9) - Scene scripts: none (
def_scene_scriptsempty). Callbacks: none.
Warps (def_warp_events)
| idx | x | y | destination map | dest warp |
|---|---|---|---|---|
| 1 | 56 | 7 | ICE_PATH_1F |
1 |
Coord events (def_coord_events)
None.
BG events (def_bg_events)
| x | y | type | script/item |
|---|---|---|---|
| 53 | 7 | BGEVENT_READ |
Route44Sign1 ("ROUTE 44 / ICE PATH AHEAD") |
| 6 | 10 | BGEVENT_READ |
Route44Sign2 ("MAHOGANY TOWN - BLACKTHORN CITY") |
| 32 | 9 | BGEVENT_ITEM |
Route44HiddenElixer -> hiddenitem ELIXER, EVENT_ROUTE_44_HIDDEN_ELIXER |
Object events (def_object_events)
| const | sprite | x | y | movement | type | sight | script label | event flag |
|---|---|---|---|---|---|---|---|---|
ROUTE44_FISHER1 |
SPRITE_FISHER |
42 | 5 | STANDING_LEFT |
OBJECTTYPE_TRAINER |
1 | TrainerFisherWilton1 |
-1 |
ROUTE44_FISHER2 |
SPRITE_FISHER |
19 | 13 | STANDING_RIGHT |
OBJECTTYPE_TRAINER |
1 | TrainerFisherEdgar |
-1 |
ROUTE44_YOUNGSTER1 |
SPRITE_YOUNGSTER |
10 | 9 | SPINCLOCKWISE |
OBJECTTYPE_TRAINER |
3 | TrainerPsychicPhil |
-1 |
ROUTE44_SUPER_NERD |
SPRITE_SUPER_NERD |
35 | 2 | STANDING_LEFT |
OBJECTTYPE_TRAINER |
5 | TrainerPokemaniacZach |
-1 |
ROUTE44_YOUNGSTER2 |
SPRITE_YOUNGSTER |
50 | 7 | STANDING_LEFT |
OBJECTTYPE_TRAINER |
3 | TrainerBirdKeeperVance1 |
-1 |
ROUTE44_COOLTRAINER_M |
SPRITE_COOLTRAINER_M |
41 | 15 | STANDING_LEFT |
OBJECTTYPE_TRAINER |
5 | TrainerCooltrainermAllen |
-1 |
ROUTE44_COOLTRAINER_F |
SPRITE_COOLTRAINER_F |
31 | 14 | STANDING_LEFT |
OBJECTTYPE_TRAINER |
5 | TrainerCooltrainerfCybil |
-1 |
ROUTE44_FRUIT_TREE |
SPRITE_FRUIT_TREE |
9 | 5 | STILL |
OBJECTTYPE_SCRIPT |
0 | Route44FruitTree |
-1 |
ROUTE44_POKE_BALL1 |
SPRITE_POKE_BALL |
30 | 8 | STILL |
OBJECTTYPE_ITEMBALL |
0 | Route44MaxRevive |
EVENT_ROUTE_44_MAX_REVIVE |
ROUTE44_POKE_BALL2 |
SPRITE_POKE_BALL |
43 | 2 | STILL |
OBJECTTYPE_ITEMBALL |
0 | Route44UltraBall |
EVENT_ROUTE_44_ULTRA_BALL |
Scripts of interest
TrainerBirdKeeperVance1/.Script- after the fight this is the phone-number script.checkevent EVENT_VANCE_READY_FOR_REMATCH-> rematch branch;checkcellnum PHONE_BIRDKEEPER_VANCE-> already registered; otherwise setsEVENT_VANCE_ASKED_FOR_PHONE_NUMBERand runsaskforphonenumber PHONE_BIRDKEEPER_VANCE. The rematch branch picksVANCE2ifEVENT_BEAT_ELITE_FOURandVANCE3ifEVENT_RESTORED_POWER_TO_KANTO, and clearsEVENT_VANCE_READY_FOR_REMATCH.TrainerFisherWilton1/.Script- same shape withPHONE_FISHER_WILTON,EVENT_WILTON_ASKED_FOR_PHONE_NUMBER,EVENT_WILTON_READY_FOR_REMATCH, andWILTON2/WILTON3for the later fights.FisherWiltonHugePoliwagTextis the "you made me lose a POLIWAG" line the walkthrough quotes.Route44FruitTree->fruittree FRUITTREE_ROUTE_44.FRUITTREE_ROUTE_44is index 10 (constants/script_constants.asm:222) anddata/items/fruit_trees.asm:19givesBURNT_BERRY.Route44MaxRevive->itemball MAX_REVIVE,Route44UltraBall->itemball ULTRA_BALL.- The four one-line trainers (
TrainerPsychicPhil,TrainerFisherEdgar,TrainerCooltrainerfCybil,TrainerPokemaniacZach,TrainerCooltrainermAllen) areendifjustbattled / opentext / writetext ... / waitbutton / closetext / endwith no flag side effects beyond thetrainermacro's own beaten flag.
Flags and events
| constant | defined in | read/written by | meaning for a bot |
|---|---|---|---|
EVENT_BEAT_BIRD_KEEPER_VANCE |
constants/event_flags.asm |
trainer macro row in TrainerBirdKeeperVance1 |
set once Vance is beaten |
EVENT_BEAT_PSYCHIC_PHIL |
same | TrainerPsychicPhil |
" |
EVENT_BEAT_FISHER_WILTON |
same | TrainerFisherWilton1 |
" |
EVENT_BEAT_FISHER_EDGAR |
same | TrainerFisherEdgar |
" |
EVENT_BEAT_COOLTRAINERF_CYBIL |
same | TrainerCooltrainerfCybil |
" |
EVENT_BEAT_POKEMANIAC_ZACH |
same | TrainerPokemaniacZach |
" |
EVENT_BEAT_COOLTRAINERM_ALLEN |
same | TrainerCooltrainermAllen |
" |
EVENT_ROUTE_44_MAX_REVIVE |
constants/event_flags.asm:1111 |
itemball object | set -> ball gone |
EVENT_ROUTE_44_ULTRA_BALL |
constants/event_flags.asm:1112 |
itemball object | set -> ball gone |
EVENT_ROUTE_44_HIDDEN_ELIXER |
constants/event_flags.asm:184 |
hiddenitem bg event |
one-shot hidden item |
EVENT_VANCE_ASKED_FOR_PHONE_NUMBER / EVENT_WILTON_ASKED_FOR_PHONE_NUMBER |
constants/event_flags.asm |
trainer scripts | second-ask dialogue branch |
EVENT_VANCE_READY_FOR_REMATCH / EVENT_WILTON_READY_FOR_REMATCH |
same | phone system | rematch pending |
Items
| item | how obtained | source (label / bg_event / hidden) | one-time flag |
|---|---|---|---|
BURNT_BERRY |
headbutt-free fruit tree at (9, 5) | Route44FruitTree / FRUITTREE_ROUTE_44 |
daily, not an event flag |
MAX_REVIVE |
item ball at (30, 8) | Route44MaxRevive |
EVENT_ROUTE_44_MAX_REVIVE |
ULTRA_BALL |
item ball at (43, 2) | Route44UltraBall |
EVENT_ROUTE_44_ULTRA_BALL |
ELIXER |
hidden, bg_event (32, 9) | Route44HiddenElixer |
EVENT_ROUTE_44_HIDDEN_ELIXER |
Trainers
Party data all from data/trainers/parties.asm; classes from
constants/trainer_constants.asm.
| const | class | id | party | script label | rematch/phone |
|---|---|---|---|---|---|
PSYCHIC_T, PHIL |
PsychicGroup |
PSYCHIC_T (8) | L24 NATU (Leer / Night Shade / Future Sight / Confuse Ray), L26 KADABRA (Disable / Psybeam / Recover / Future Sight); TRAINERTYPE_MOVES |
TrainerPsychicPhil |
none |
FISHER, EDGAR |
FisherGroup |
FISHER (11) | L25 REMORAID x2 (Lock-On / Psybeam / Aurora Beam / Bubblebeam); TRAINERTYPE_MOVES |
TrainerFisherEdgar |
none |
COOLTRAINERF, CYBIL |
CooltrainerFGroup |
COOLTRAINERF (16) | L25 BUTTERFREE (Confusion / Sleep Powder / Whirlwind / Gust), L25 BELLOSSOM (Absorb / Stun Spore / Acid / SolarBeam); TRAINERTYPE_MOVES |
TrainerCooltrainerfCybil |
none |
COOLTRAINERM, ALLEN |
CooltrainerMGroup |
COOLTRAINERM (19) | L27 CHARMELEON (Ember / Smokescreen / Rage / Scary Face); TRAINERTYPE_MOVES |
TrainerCooltrainermAllen |
none |
POKEMANIAC, ZACH |
PokemaniacGroup |
POKEMANIAC (13) | L27 RHYHORN; TRAINERTYPE_NORMAL |
TrainerPokemaniacZach |
none |
FISHER, WILTON1 |
FisherGroup |
FISHER (10) | L23 GOLDEEN, L23 GOLDEEN, L25 SEAKING; TRAINERTYPE_NORMAL |
TrainerFisherWilton1 |
PHONE_FISHER_WILTON; WILTON2/WILTON3 post-game |
BIRD_KEEPER, VANCE1 |
BirdKeeperGroup |
BIRD_KEEPER (7) | L25 PIDGEOTTO x2; TRAINERTYPE_NORMAL |
TrainerBirdKeeperVance1 |
PHONE_BIRDKEEPER_VANCE; VANCE2/VANCE3 post-game |
Wild encounters
- Grass,
data/wild/johto_grass.asm:2208def_grass_wildmons ROUTE_44, rates 10/10/10 percent, and morn == day == nite: L23TANGELA, L22WEEPINBELL, L22BELLSPROUT, L24LICKITUNG, L24WEEPINBELL, L26LICKITUNG, L26LICKITUNG. - Water,
data/wild/johto_water.asm:197def_water_wildmons ROUTE_44, 2 percent: L25POLIWAG, L20POLIWAG, L25POLIWHIRL. This is the Poliwag the walkthrough's "Pokemon on Route 44" list means; it is Surf-only, not grass. - Fishing group
FISHGROUP_REMORAID(data/maps/maps.asm:73),data/wild/fish.asm:195.Remoraid_Old/.Remoraid_Good/.Remoraid_Super: Old = Magikarp/Magikarp/Poliwag L10; Good = Magikarp L20, Poliwag L20 x2,time_group 6(Poliwag L20); Super = Poliwag L40,time_group 7(Poliwag L40), Magikarp L40,REMORAIDL40.
MAP_ICE_PATH_1F
- Script:
maps/IcePath1F.asm(IcePath1F_MapEvents=46:613f) - Blocks:
maps/IcePath1F.blk - Header:
data/maps/maps.asm:131->TILESET_ICE_PATH,CAVE,LANDMARK_ICE_PATH,MUSIC_DARK_CAVE, phoneTRUE,PALETTE_NITE,FISHGROUP_DRATINI - Dimensions:
constants/map_constants.asm:118->map_const ICE_PATH_1F, 20, 18 - Attributes:
data/maps/attributes.asm:450, no connections - Scene scripts and callbacks: both empty
Warps (def_warp_events)
| idx | x | y | destination map | dest warp |
|---|---|---|---|---|
| 1 | 4 | 19 | ROUTE_44 |
1 |
| 2 | 36 | 27 | BLACKTHORN_CITY |
7 |
| 3 | 37 | 5 | ICE_PATH_B1F |
1 |
| 4 | 37 | 13 | ICE_PATH_B1F |
7 |
Coord events / BG events
None.
Object events
| const | sprite | x | y | movement | type | script label | event flag |
|---|---|---|---|---|---|---|---|
ICEPATH1F_POKE_BALL1 |
SPRITE_POKE_BALL |
31 | 7 | STILL |
OBJECTTYPE_ITEMBALL |
IcePath1FHMWaterfall |
EVENT_GOT_HM07_WATERFALL |
ICEPATH1F_POKE_BALL2 |
SPRITE_POKE_BALL |
32 | 23 | STILL |
OBJECTTYPE_ITEMBALL |
IcePath1FPPUp |
EVENT_ICE_PATH_1F_PP_UP |
Scripts of interest
IcePath1FHMWaterfall->itemball HM_WATERFALL. Nothing gates it beyond reaching the tile; the badge check that makes the move usable is separate (see section 3).IcePath1FPPUp->itemball PP_UP. This ball is in the southern region of 1F, reached on the way back up from B1F warp 7, not on the way in.
Items
| item | how obtained | source | one-time flag |
|---|---|---|---|
HM_WATERFALL (HM07) |
item ball at (31, 7) | IcePath1FHMWaterfall |
EVENT_GOT_HM07_WATERFALL (constants/event_flags.asm:1065) |
PP_UP |
item ball at (32, 23) | IcePath1FPPUp |
EVENT_ICE_PATH_1F_PP_UP (:1066) |
Wild encounters
data/wild/johto_grass.asm:798 def_grass_wildmons ICE_PATH_1F, rates 2/2/2 percent.
Gold build (IF DEF(_GOLD)):
| slot | morn | day | nite |
|---|---|---|---|
| 1 | L21 SWINUB |
L21 SWINUB |
L21 SWINUB |
| 2 | L22 GOLBAT |
L22 GOLBAT |
L22 GOLBAT |
| 3 | L22 ZUBAT |
L22 ZUBAT |
L22 ZUBAT |
| 4 | L23 SWINUB |
L23 SWINUB |
L23 SWINUB |
| 5 | L22 ZUBAT |
L22 JYNX |
L22 ZUBAT |
| 6 | L22 JYNX |
L20 JYNX |
L22 JYNX |
| 7 | L22 JYNX |
L20 JYNX |
L22 JYNX |
Silver (ELIF DEF(_SILVER)) replaces slot 3 with L22 DELIBIRD in all three
time bands - that is the "Delibird (Silver only)" line in the walkthrough, and
it is a slot swap, not an extra entry.
MAP_ICE_PATH_B1F
- Script:
maps/IcePathB1F.asm(IcePathB1F_MapEvents=46:61e7,IcePathB1FSetUpStoneTableCallback=46:6178) - Blocks:
maps/IcePathB1F.blk - Header:
data/maps/maps.asm:132->TILESET_ICE_PATH,CAVE,LANDMARK_ICE_PATH,MUSIC_DARK_CAVE,TRUE,PALETTE_NITE,FISHGROUP_DRATINI - Dimensions:
constants/map_constants.asm:119->map_const ICE_PATH_B1F, 10, 18 - Callbacks:
callback MAPCALLBACK_CMDQUEUE, IcePathB1FSetUpStoneTableCallback
Warps (def_warp_events)
| idx | x | y | destination map | dest warp | note |
|---|---|---|---|---|---|
| 1 | 3 | 15 | ICE_PATH_1F |
3 | up to the north 1F region |
| 2 | 17 | 3 | ICE_PATH_B2F_MAHOGANY_SIDE |
1 | stairs down |
| 3 | 11 | 2 | ICE_PATH_B2F_MAHOGANY_SIDE |
3 | hole |
| 4 | 4 | 7 | ICE_PATH_B2F_MAHOGANY_SIDE |
4 | hole |
| 5 | 5 | 12 | ICE_PATH_B2F_MAHOGANY_SIDE |
5 | hole |
| 6 | 12 | 13 | ICE_PATH_B2F_MAHOGANY_SIDE |
6 | hole |
| 7 | 5 | 25 | ICE_PATH_1F |
4 | up to the south 1F region |
| 8 | 11 | 27 | ICE_PATH_B2F_BLACKTHORN_SIDE |
1 |
Coord events
None.
BG events
| x | y | type | script/item |
|---|---|---|---|
| 15 | 31 | BGEVENT_ITEM |
IcePathB1FHiddenMaxPotion -> hiddenitem MAX_POTION, EVENT_ICE_PATH_B1F_HIDDEN_MAX_POTION |
Object events
| const | sprite | x | y | movement | type | script label | event flag |
|---|---|---|---|---|---|---|---|
ICEPATHB1F_BOULDER1 |
SPRITE_BOULDER |
11 | 7 | STRENGTH_BOULDER |
OBJECTTYPE_SCRIPT |
IcePathB1FBoulder |
EVENT_BOULDER_IN_ICE_PATH_1 |
ICEPATHB1F_BOULDER2 |
SPRITE_BOULDER |
7 | 8 | STRENGTH_BOULDER |
OBJECTTYPE_SCRIPT |
IcePathB1FBoulder |
EVENT_BOULDER_IN_ICE_PATH_2 |
ICEPATHB1F_BOULDER3 |
SPRITE_BOULDER |
8 | 9 | STRENGTH_BOULDER |
OBJECTTYPE_SCRIPT |
IcePathB1FBoulder |
EVENT_BOULDER_IN_ICE_PATH_3 |
ICEPATHB1F_BOULDER4 |
SPRITE_BOULDER |
17 | 7 | STRENGTH_BOULDER |
OBJECTTYPE_SCRIPT |
IcePathB1FBoulder |
EVENT_BOULDER_IN_ICE_PATH_4 |
ICEPATHB1F_POKE_BALL |
SPRITE_POKE_BALL |
5 | 35 | STILL |
OBJECTTYPE_ITEMBALL |
IcePathB1FIron |
EVENT_ICE_PATH_B1F_IRON |
Scripts of interest
-
IcePathB1FSetUpStoneTableCallbackwrites a command queue with onecmdqueue CMDQUEUE_STONETABLE, .StoneTableentry..StoneTableis the warp-id -> boulder-object -> script mapping:stonetable 3, ICEPATHB1F_BOULDER1, .Boulder1 stonetable 4, ICEPATHB1F_BOULDER2, .Boulder2 stonetable 5, ICEPATHB1F_BOULDER3, .Boulder3 stonetable 6, ICEPATHB1F_BOULDER4, .Boulder4 db -1So boulder N must be pushed onto warp N+2 - i.e. boulder 1 onto the hole at (11, 2), boulder 2 onto (4, 7), boulder 3 onto (5, 12), boulder 4 onto (12, 13).
-
Each
.BoulderNarm doesdisappear ICEPATHB1F_BOULDERN(which setsEVENT_BOULDER_IN_ICE_PATH_N) andclearevent EVENT_BOULDER_IN_ICE_PATH_NA(which makes the twin boulder object onICE_PATH_B2F_MAHOGANY_SIDEappear), then falls into.FinishBoulder:pause 30,scall .BoulderFallsThrough(playsound SFX_STRENGTH+earthquake 80), thenIcePathBoulderFellThroughText("The boulder fell / through."). -
IcePathB1FBoulder->jumpstd StrengthBoulderScript(the "may be able to push this with STRENGTH" prompt).
Flags and events
| constant | defined in | read/written by | meaning for a bot |
|---|---|---|---|
EVENT_BOULDER_IN_ICE_PATH_1..4 |
constants/event_flags.asm:1195-1198 |
.BoulderN disappear |
set -> that B1F boulder is gone (fell) |
EVENT_BOULDER_IN_ICE_PATH_1A..4A |
constants/event_flags.asm:1199-1202 |
.BoulderN clearevent; set at new game by the init list in engine/events/std_scripts.asm |
clear -> the fallen boulder is now visible on B2F Mahogany Side |
EVENT_ICE_PATH_B1F_IRON |
:1067 |
itemball object | |
EVENT_ICE_PATH_B1F_HIDDEN_MAX_POTION |
:158 |
hidden bg event |
Items
| item | how obtained | source | one-time flag |
|---|---|---|---|
IRON |
item ball at (5, 35) | IcePathB1FIron |
EVENT_ICE_PATH_B1F_IRON |
MAX_POTION |
hidden at (15, 31) | IcePathB1FHiddenMaxPotion |
EVENT_ICE_PATH_B1F_HIDDEN_MAX_POTION |
Wild encounters
data/wild/johto_grass.asm:853 def_grass_wildmons ICE_PATH_B1F, 2/2/2 percent -
byte-for-byte the same table as ICE_PATH_1F above (same levels, same Silver
Delibird swap).
MAP_ICE_PATH_B2F_MAHOGANY_SIDE
- Script:
maps/IcePathB2FMahoganySide.asm(..._MapEvents=46:6287) - Blocks:
maps/IcePathB2FMahoganySide.blk - Header:
data/maps/maps.asm:133->TILESET_ICE_PATH,CAVE,LANDMARK_ICE_PATH,MUSIC_DARK_CAVE,TRUE,PALETTE_NITE,FISHGROUP_DRATINI - Dimensions:
constants/map_constants.asm:120->map_const ICE_PATH_B2F_MAHOGANY_SIDE, 10, 9 - Scene scripts and callbacks: both empty
Warps
| idx | x | y | destination map | dest warp | note |
|---|---|---|---|---|---|
| 1 | 17 | 1 | ICE_PATH_B1F |
2 | stairs back up |
| 2 | 9 | 11 | ICE_PATH_B3F |
1 | ladder down |
| 3 | 11 | 4 | ICE_PATH_B1F |
3 | landing under hole 1 |
| 4 | 4 | 6 | ICE_PATH_B1F |
4 | landing under hole 2 |
| 5 | 4 | 12 | ICE_PATH_B1F |
5 | landing under hole 3 |
| 6 | 12 | 12 | ICE_PATH_B1F |
6 | landing under hole 4 |
Coord events
None.
BG events
| x | y | type | script/item |
|---|---|---|---|
| 0 | 17 | BGEVENT_ITEM |
IcePathB2FMahoganySideHiddenCarbos -> hiddenitem CARBOS, EVENT_ICE_PATH_B2F_MAHOGANY_SIDE_HIDDEN_CARBOS |
Object events
| const | sprite | x | y | movement | type | script label | event flag |
|---|---|---|---|---|---|---|---|
ICEPATHB2FMAHOGANYSIDE_BOULDER1 |
SPRITE_BOULDER |
11 | 3 | STILL |
OBJECTTYPE_SCRIPT |
IcePathB2FMahoganySideBoulder |
EVENT_BOULDER_IN_ICE_PATH_1A |
ICEPATHB2FMAHOGANYSIDE_BOULDER2 |
SPRITE_BOULDER |
4 | 7 | STILL |
OBJECTTYPE_SCRIPT |
same | EVENT_BOULDER_IN_ICE_PATH_2A |
ICEPATHB2FMAHOGANYSIDE_BOULDER3 |
SPRITE_BOULDER |
3 | 12 | STILL |
OBJECTTYPE_SCRIPT |
same | EVENT_BOULDER_IN_ICE_PATH_3A |
ICEPATHB2FMAHOGANYSIDE_BOULDER4 |
SPRITE_BOULDER |
12 | 13 | STILL |
OBJECTTYPE_SCRIPT |
same | EVENT_BOULDER_IN_ICE_PATH_4A |
ICEPATHB2FMAHOGANYSIDE_POKE_BALL1 |
SPRITE_POKE_BALL |
8 | 9 | STILL |
OBJECTTYPE_ITEMBALL |
IcePathB2FMahoganySideFullHeal |
EVENT_ICE_PATH_B2F_MAHOGANY_SIDE_FULL_HEAL |
ICEPATHB2FMAHOGANYSIDE_POKE_BALL2 |
SPRITE_POKE_BALL |
0 | 2 | STILL |
OBJECTTYPE_ITEMBALL |
IcePathB2FMahoganySideMaxPotion |
EVENT_ICE_PATH_B2F_MAHOGANY_SIDE_MAX_POTION |
Scripts of interest
IcePathB2FMahoganySideBoulder->jumptext IcePathB2FMahoganySideBoulderText("It's immovably / imbedded in ice."). These boulders areSPRITEMOVEDATA_STILL, notSTRENGTH_BOULDER- they are scenery once they land, and they are the reason the four B1F boulders are one-way.IcePathB2FMahoganySideFullHeal->itemball FULL_HEAL. This is the Full Heal the walkthrough says to grab after dropping through a hole.IcePathB2FMahoganySideMaxPotion->itemball MAX_POTION(the walkthrough's item list omits it).
Items
| item | how obtained | source | one-time flag |
|---|---|---|---|
FULL_HEAL |
item ball at (8, 9) | IcePathB2FMahoganySideFullHeal |
EVENT_ICE_PATH_B2F_MAHOGANY_SIDE_FULL_HEAL (:1068) |
MAX_POTION |
item ball at (0, 2) | IcePathB2FMahoganySideMaxPotion |
EVENT_ICE_PATH_B2F_MAHOGANY_SIDE_MAX_POTION (:1069) |
CARBOS |
hidden at (0, 17) | IcePathB2FMahoganySideHiddenCarbos |
EVENT_ICE_PATH_B2F_MAHOGANY_SIDE_HIDDEN_CARBOS (:159) |
Wild encounters
data/wild/johto_grass.asm:908, 2/2/2 percent, one level higher than B1F:
morn L22 SWINUB / L23 GOLBAT / L23 ZUBAT / L24 SWINUB / L23 ZUBAT /
L23 JYNX / L23 JYNX; day swaps slots 5-7 to L23 JYNX / L21 JYNX / L21 JYNX;
nite matches morn. Silver replaces slot 3 with DELIBIRD at the same level.
MAP_ICE_PATH_B3F
- Script:
maps/IcePathB3F.asm(IcePathB3F_MapEvents=46:632e) - Blocks:
maps/IcePathB3F.blk - Header:
data/maps/maps.asm:135->TILESET_ICE_PATH,CAVE,LANDMARK_ICE_PATH,MUSIC_DARK_CAVE,TRUE,PALETTE_NITE,FISHGROUP_DRATINI - Dimensions:
constants/map_constants.asm:122->map_const ICE_PATH_B3F, 10, 9 - Scene scripts and callbacks: both empty
Warps
| idx | x | y | destination map | dest warp |
|---|---|---|---|---|
| 1 | 3 | 5 | ICE_PATH_B2F_MAHOGANY_SIDE |
2 |
| 2 | 15 | 5 | ICE_PATH_B2F_BLACKTHORN_SIDE |
2 |
Coord events / BG events
None.
Object events
| const | sprite | x | y | movement | type | script label | event flag |
|---|---|---|---|---|---|---|---|
ICEPATHB3F_POKE_BALL |
SPRITE_POKE_BALL |
5 | 7 | STILL |
OBJECTTYPE_ITEMBALL |
IcePathB3FNevermeltice |
EVENT_ICE_PATH_B3F_NEVERMELTICE |
ICEPATHB3F_ROCK |
SPRITE_ROCK |
6 | 6 | SMASHABLE_ROCK |
OBJECTTYPE_SCRIPT |
IcePathB3FRock |
-1 |
Scripts of interest
IcePathB3FRock->jumpstd SmashRockScript. The rock at (6, 6) sits between the ladder at (3, 5) and the Nevermeltice at (5, 7); no badge is required for ROCK SMASH, only the move in the party (HasRockSmashinengine/events/overworld.asm/AskRockSmashScript).IcePathB3FNevermeltice->itemball NEVERMELTICE.
Items
| item | how obtained | source | one-time flag |
|---|---|---|---|
NEVERMELTICE |
item ball at (5, 7) | IcePathB3FNevermeltice |
EVENT_ICE_PATH_B3F_NEVERMELTICE (:1071) |
Wild encounters
data/wild/johto_grass.asm:1018, 2/2/2 percent, one level above B2F:
morn/nite L23 SWINUB / L24 GOLBAT / L24 ZUBAT / L25 SWINUB / L24 ZUBAT /
L24 JYNX / L24 JYNX; day swaps slots 5-7 to JYNX L24/L22/L22.
MAP_ICE_PATH_B2F_BLACKTHORN_SIDE
- Script:
maps/IcePathB2FBlackthornSide.asm(..._MapEvents=46:6305) - Blocks:
maps/IcePathB2FBlackthornSide.blk - Header:
data/maps/maps.asm:134->TILESET_ICE_PATH,CAVE,LANDMARK_ICE_PATH,MUSIC_DARK_CAVE,TRUE,PALETTE_NITE,FISHGROUP_DRATINI - Dimensions:
constants/map_constants.asm:121->map_const ICE_PATH_B2F_BLACKTHORN_SIDE, 5, 9 - Scene scripts and callbacks: both empty
Warps
| idx | x | y | destination map | dest warp |
|---|---|---|---|---|
| 1 | 3 | 15 | ICE_PATH_B1F |
8 |
| 2 | 3 | 3 | ICE_PATH_B3F |
2 |
Coord events
None.
BG events
| x | y | type | script/item |
|---|---|---|---|
| 2 | 10 | BGEVENT_ITEM |
IcePathB2FBlackthornSideHiddenIceHeal -> hiddenitem ICE_HEAL, EVENT_ICE_PATH_B2F_BLACKTHORN_SIDE_HIDDEN_ICE_HEAL |
Object events
| const | sprite | x | y | movement | type | script label | event flag |
|---|---|---|---|---|---|---|---|
ICEPATHB2FBLACKTHORNSIDE_POKE_BALL |
SPRITE_POKE_BALL |
8 | 16 | STILL |
OBJECTTYPE_ITEMBALL |
IcePathB2FBlackthornSideTMRest |
EVENT_ICE_PATH_B2F_BLACKTHORN_SIDE_TM_REST |
Items
| item | how obtained | source | one-time flag |
|---|---|---|---|
TM_REST (TM44) |
item ball at (8, 16) | IcePathB2FBlackthornSideTMRest |
EVENT_ICE_PATH_B2F_BLACKTHORN_SIDE_TM_REST (:1070) |
ICE_HEAL |
hidden at (2, 10) | IcePathB2FBlackthornSideHiddenIceHeal |
EVENT_ICE_PATH_B2F_BLACKTHORN_SIDE_HIDDEN_ICE_HEAL (:160) |
Wild encounters
data/wild/johto_grass.asm:963, identical to ICE_PATH_B2F_MAHOGANY_SIDE.
MAP_BLACKTHORN_CITY
- Script:
maps/BlackthornCity.asm(BlackthornCity_MapEvents=49:5e4f,BlackthornCityFlypointCallback=49:58f2) - Blocks:
maps/BlackthornCity.blk - Header:
data/maps/maps.asm:187->TILESET_JOHTO,TOWN,LANDMARK_BLACKTHORN_CITY,MUSIC_AZALEA_TOWN, phoneFALSE,PALETTE_AUTO,FISHGROUP_POND - Dimensions:
constants/map_constants.asm:172->map_const BLACKTHORN_CITY, 20, 18 - Connections:
data/maps/attributes.asm:160-> southROUTE_45(offset 0), westROUTE_44(offset 9) - Callbacks:
MAPCALLBACK_NEWMAP, BlackthornCityFlypointCallback->setflag ENGINE_FLYPOINT_BLACKTHORNMAPCALLBACK_OBJECTS, BlackthornCitySantosCallback->readvar VAR_WEEKDAY,appear/disappear BLACKTHORNCITY_SANTOSonSATURDAY
Warps
| idx | x | y | destination map | dest warp |
|---|---|---|---|---|
| 1 | 18 | 11 | BLACKTHORN_GYM_1F |
1 |
| 2 | 13 | 21 | BLACKTHORN_DRAGON_SPEECH_HOUSE |
1 |
| 3 | 29 | 23 | BLACKTHORN_EMYS_HOUSE |
1 |
| 4 | 15 | 29 | BLACKTHORN_MART |
2 |
| 5 | 21 | 29 | BLACKTHORN_POKECENTER_1F |
1 |
| 6 | 9 | 31 | MOVE_DELETERS_HOUSE |
1 |
| 7 | 36 | 9 | ICE_PATH_1F |
2 |
| 8 | 20 | 1 | DRAGONS_DEN_1F |
1 |
Coord events
None.
BG events
| x | y | type | script/item |
|---|---|---|---|
| 34 | 24 | BGEVENT_READ |
BlackthornCitySign |
| 17 | 13 | BGEVENT_READ |
BlackthornGymSign |
| 7 | 31 | BGEVENT_READ |
MoveDeletersHouseSign |
| 21 | 3 | BGEVENT_READ |
DragonDensSign |
| 5 | 25 | BGEVENT_READ |
BlackthornCityTrainerTips |
| 16 | 29 | BGEVENT_READ |
BlackthornCityMartSign -> jumpstd MartSignScript |
| 22 | 29 | BGEVENT_READ |
BlackthornCityPokecenterSign -> jumpstd PokecenterSignScript |
Object events
| const | sprite | x | y | movement | type | script label | event flag |
|---|---|---|---|---|---|---|---|
BLACKTHORNCITY_SUPER_NERD1 |
SPRITE_SUPER_NERD |
18 | 12 | STANDING_DOWN |
OBJECTTYPE_SCRIPT |
BlackthornSuperNerdScript |
EVENT_BLACKTHORN_CITY_SUPER_NERD_BLOCKS_GYM |
BLACKTHORNCITY_SUPER_NERD2 |
SPRITE_SUPER_NERD |
19 | 12 | STANDING_DOWN |
OBJECTTYPE_SCRIPT |
BlackthornSuperNerdScript |
EVENT_BLACKTHORN_CITY_SUPER_NERD_DOES_NOT_BLOCK_GYM |
BLACKTHORNCITY_GRAMPS1 |
SPRITE_GRAMPS |
20 | 2 | STANDING_DOWN |
OBJECTTYPE_SCRIPT |
BlackthornGramps1Script |
EVENT_BLACKTHORN_CITY_GRAMPS_BLOCKS_DRAGONS_DEN |
BLACKTHORNCITY_GRAMPS2 |
SPRITE_GRAMPS |
21 | 2 | STANDING_LEFT |
OBJECTTYPE_SCRIPT |
BlackthornGramps2Script |
EVENT_BLACKTHORN_CITY_GRAMPS_NOT_BLOCKING_DRAGONS_DEN |
BLACKTHORNCITY_BLACK_BELT |
SPRITE_BLACK_BELT |
24 | 31 | WALK_LEFT_RIGHT (radius 1) |
OBJECTTYPE_SCRIPT |
BlackthornBlackBeltScript |
-1 |
BLACKTHORNCITY_COOLTRAINER_F1 |
SPRITE_COOLTRAINER_F |
9 | 25 | WALK_LEFT_RIGHT (radius 2) |
OBJECTTYPE_SCRIPT |
BlackthornCooltrainerF1Script |
-1 |
BLACKTHORNCITY_YOUNGSTER1 |
SPRITE_YOUNGSTER |
13 | 15 | WALK_LEFT_RIGHT (radius 1) |
OBJECTTYPE_SCRIPT |
BlackthornYoungsterScript |
-1 |
BLACKTHORNCITY_SANTOS |
SPRITE_YOUNGSTER |
22 | 20 | STANDING_DOWN |
OBJECTTYPE_SCRIPT |
SantosScript |
EVENT_BLACKTHORN_CITY_SANTOS_OF_SATURDAY |
BLACKTHORNCITY_COOLTRAINER_F2 |
SPRITE_COOLTRAINER_F |
35 | 19 | STANDING_UP |
OBJECTTYPE_SCRIPT |
BlackthornCooltrainerF2Script |
-1 |
Scripts of interest
BlackthornCityFlypointCallback-setflag ENGINE_FLYPOINT_BLACKTHORN(constants/engine_flags.asm:89). Fires onMAPCALLBACK_NEWMAP, i.e. the first time the player walks out of the Ice Path.BlackthornSuperNerdScript-checkevent EVENT_BEAT_CLAIR->Text_ClairIsBeaten; elsecheckevent EVENT_CLEARED_RADIO_TOWER->Text_ClairIsIn; elseText_ClairIsOut("Our GYM LEADER is training in the cave behind here"). Both nerd objects share this script.BlackthornGramps1Script->BlackthornGrampsRefusesEntryText("Only dragon users are permitted to train here").BlackthornGramps2Script->BlackthornGrampsGrantsEntryText("Since CLAIR ... has allowed it"). These are the Dragon's Den doorman, one object per state.SantosScript- Saturday-only NPC,verbosegiveitem SPELL_TAG, guarded byEVENT_MET_SANTOS_OF_SATURDAY/EVENT_GOT_SPELL_TAG_FROM_SANTOS. Not mentioned by the walkthrough; free item for a bot that lands on Saturday.
Flags and events
| constant | defined in | read/written by | meaning for a bot |
|---|---|---|---|
ENGINE_FLYPOINT_BLACKTHORN |
constants/engine_flags.asm:89 |
BlackthornCityFlypointCallback |
Fly destination unlocked |
EVENT_BLACKTHORN_CITY_SUPER_NERD_BLOCKS_GYM |
:1157 |
maps/RadioTower5F.asm:111 setevent |
set -> that object is hidden. Set once the Radio Tower is cleared, which is what removes the blocker standing on (18, 12), the tile below the gym door |
EVENT_BLACKTHORN_CITY_SUPER_NERD_DOES_NOT_BLOCK_GYM |
:1158 |
set at new game (engine/events/std_scripts.asm:460), cleared by maps/RadioTower5F.asm:112 |
clear -> the non-blocking nerd stands beside the door at (19, 12) |
EVENT_BLACKTHORN_CITY_GRAMPS_BLOCKS_DRAGONS_DEN |
:1262 |
maps/BlackthornGym1F.asm:54 setevent after beating Clair |
set -> blocker at (20, 2) hidden |
EVENT_BLACKTHORN_CITY_GRAMPS_NOT_BLOCKING_DRAGONS_DEN |
:1263 |
set at new game (std_scripts.asm:512), cleared by BlackthornGym1F.asm:55 |
clear -> permissive gramps visible at (21, 2), path to (20, 1) open |
EVENT_CLEARED_RADIO_TOWER |
:42 |
read by BlackthornSuperNerdScript and BlackthornBlackBeltScript |
|
EVENT_BLACKTHORN_CITY_SANTOS_OF_SATURDAY |
:1279 |
BlackthornCitySantosCallback |
weekday visibility |
Items
None on the overworld map itself.
Trainers
None.
Wild encounters
Water only: data/wild/johto_water.asm:264 def_water_wildmons BLACKTHORN_CITY,
4 percent: L15 MAGIKARP, L10 MAGIKARP, L5 MAGIKARP.
Fishing group FISHGROUP_POND (data/wild/fish.asm:72):
Old = Magikarp/Magikarp/Poliwag L10; Good = Magikarp L20, Poliwag L20 x2,
time_group 6; Super = Poliwag L40, time_group 7, Magikarp L40, Poliwag L40.
MAP_BLACKTHORN_POKECENTER_1F
- Script:
maps/BlackthornPokecenter1F.asm - Header:
data/maps/maps.asm:183->TILESET_POKECENTER,INDOOR,LANDMARK_BLACKTHORN_CITY,MUSIC_POKEMON_CENTER,FALSE,PALETTE_DAY - Dimensions:
constants/map_constants.asm:168->map_const BLACKTHORN_POKECENTER_1F, 5, 4
Warps
| idx | x | y | destination map | dest warp |
|---|---|---|---|---|
| 1 | 3 | 7 | BLACKTHORN_CITY |
5 |
| 2 | 4 | 7 | BLACKTHORN_CITY |
5 |
| 3 | 0 | 7 | POKECENTER_2F |
1 |
Object events
| const | sprite | x | y | movement | type | script label | event flag |
|---|---|---|---|---|---|---|---|
BLACKTHORNPOKECENTER1F_NURSE |
SPRITE_NURSE |
3 | 1 | STANDING_DOWN |
OBJECTTYPE_SCRIPT |
BlackthornPokecenter1FNurseScript -> jumpstd PokecenterNurseScript |
-1 |
BLACKTHORNPOKECENTER1F_GENTLEMAN |
SPRITE_GENTLEMAN |
5 | 3 | STANDING_DOWN |
OBJECTTYPE_SCRIPT |
BlackthornPokecenter1FGentlemanScript |
-1 |
BLACKTHORNPOKECENTER1F_TWIN |
SPRITE_TWIN |
1 | 4 | SPINRANDOM_SLOW |
OBJECTTYPE_SCRIPT |
BlackthornPokecenter1FTwinScript |
-1 |
BLACKTHORNPOKECENTER1F_COOLTRAINER_M |
SPRITE_COOLTRAINER_M |
7 | 6 | WALK_LEFT_RIGHT (radius 1) |
OBJECTTYPE_SCRIPT |
BlackthornPokecenter1FCooltrainerMScript -> jumpstd HappinessCheckScript |
-1 |
No bg events, no coord events.
MAP_BLACKTHORN_MART
- Script:
maps/BlackthornMart.asm - Header:
data/maps/maps.asm:182->TILESET_MART,INDOOR,LANDMARK_BLACKTHORN_CITY,MUSIC_AZALEA_TOWN,FALSE,PALETTE_DAY - Dimensions:
constants/map_constants.asm:167->map_const BLACKTHORN_MART, 6, 4
Warps
| idx | x | y | destination map | dest warp |
|---|---|---|---|---|
| 1 | 2 | 7 | BLACKTHORN_CITY |
4 |
| 2 | 3 | 7 | BLACKTHORN_CITY |
4 |
Object events
| const | sprite | x | y | movement | type | script label | event flag |
|---|---|---|---|---|---|---|---|
BLACKTHORNMART_CLERK |
SPRITE_CLERK |
1 | 3 | STANDING_RIGHT |
OBJECTTYPE_SCRIPT |
BlackthornMartClerkScript |
-1 |
BLACKTHORNMART_COOLTRAINER_M |
SPRITE_COOLTRAINER_M |
7 | 6 | WALK_LEFT_RIGHT (radius 2) |
OBJECTTYPE_SCRIPT |
BlackthornMartCooltrainerMScript |
-1 |
BLACKTHORNMART_BLACK_BELT |
SPRITE_BLACK_BELT |
5 | 2 | STANDING_DOWN |
OBJECTTYPE_SCRIPT |
BlackthornMartBlackBeltScript |
-1 |
Scripts of interest
BlackthornMartClerkScript -> pokemart MARTTYPE_STANDARD, MART_BLACKTHORN.
Inventory, data/items/marts.asm:216 MartBlackthorn (05:63d0), 9 items:
GREAT_BALL, ULTRA_BALL, HYPER_POTION, MAX_POTION, FULL_HEAL,
REVIVE, MAX_REPEL, X_DEFEND, X_ATTACK.
This is where the walkthrough's "restock Ultra Balls" and "have a few Revives,
Full Heals, and Hyper Potions" shopping list is actually purchasable.
MAP_BLACKTHORN_EMYS_HOUSE
- Script:
maps/BlackthornEmysHouse.asm - Header:
data/maps/maps.asm:181->TILESET_HOUSE,INDOOR,LANDMARK_BLACKTHORN_CITY,MUSIC_AZALEA_TOWN,FALSE,PALETTE_DAY - Dimensions:
constants/map_constants.asm:166->map_const BLACKTHORN_EMYS_HOUSE, 4, 4
Warps
| idx | x | y | destination map | dest warp |
|---|---|---|---|---|
| 1 | 2 | 7 | BLACKTHORN_CITY |
3 |
| 2 | 3 | 7 | BLACKTHORN_CITY |
3 |
BG events
| x | y | type | script/item |
|---|---|---|---|
| 0 | 1 | BGEVENT_READ |
EmysHouseBookshelf -> jumpstd MagazineBookshelfScript |
| 1 | 1 | BGEVENT_READ |
same |
Object events
| const | sprite | x | y | movement | type | script label | event flag |
|---|---|---|---|---|---|---|---|
BLACKTHORNEMYSHOUSE_EMY |
SPRITE_LASS |
2 | 3 | SPINRANDOM_SLOW |
OBJECTTYPE_SCRIPT |
Emy |
-1 |
Scripts of interest
Emy -> faceplayer / opentext / trade NPC_TRADE_EMY / waitbutton / closetext / end.
NPC_TRADE_EMY is index 3 (constants/npc_trade_constants.asm:20) and its row in
data/events/npc_trades.asm is:
npctrade TRADE_DIALOGSET_NEWBIE, DRAGONAIR, RHYDON, "DON", $77, $66, BITTER_BERRY, 00283, "EMY", TRADE_GENDER_FEMALE
So: wants a female DRAGONAIR, gives RHYDON nicknamed "DON",
DVs $77/$66, holding a BITTER_BERRY, OT "EMY" ID 00283.
The walkthrough's "lady that would trade her Rhydon for a Dragonair" omits the
gender requirement, which is load-bearing for a bot.
MAP_MOVE_DELETERS_HOUSE
- Script:
maps/MoveDeletersHouse.asm - Header:
data/maps/maps.asm:184->TILESET_HOUSE,INDOOR,LANDMARK_BLACKTHORN_CITY,MUSIC_AZALEA_TOWN,FALSE,PALETTE_DAY - Dimensions:
constants/map_constants.asm:169->map_const MOVE_DELETERS_HOUSE, 4, 4
Warps
| idx | x | y | destination map | dest warp |
|---|---|---|---|---|
| 1 | 2 | 7 | BLACKTHORN_CITY |
6 |
| 2 | 3 | 7 | BLACKTHORN_CITY |
6 |
BG events
| x | y | type | script/item |
|---|---|---|---|
| 0 | 1 | BGEVENT_READ |
MoveDeletersHouseBookshelf -> jumpstd DifficultBookshelfScript |
| 1 | 1 | BGEVENT_READ |
same |
Object events
| const | sprite | x | y | movement | type | script label | event flag |
|---|---|---|---|---|---|---|---|
MOVEDELETERSHOUSE_SUPER_NERD |
SPRITE_SUPER_NERD |
2 | 3 | STANDING_DOWN |
OBJECTTYPE_SCRIPT |
MoveDeleter |
-1 |
Scripts of interest
MoveDeleter -> faceplayer / opentext / special MoveDeletion / waitbutton / closetext / end. The whole flow lives in engine/events/move_deleter.asm; the
script never writes wScriptVar.
MAP_BLACKTHORN_DRAGON_SPEECH_HOUSE
Not visited by the walkthrough; included because it is city warp 2.
- Script:
maps/BlackthornDragonSpeechHouse.asm - Header:
data/maps/maps.asm:180->TILESET_HOUSE,INDOOR,LANDMARK_BLACKTHORN_CITY,MUSIC_AZALEA_TOWN,FALSE,PALETTE_DAY - Dimensions:
constants/map_constants.asm:165->map_const BLACKTHORN_DRAGON_SPEECH_HOUSE, 4, 4
Warps: 1 = (2, 7) -> BLACKTHORN_CITY 2; 2 = (3, 7) -> BLACKTHORN_CITY 2.
Object events: BLACKTHORNDRAGONSPEECHHOUSE_GRANNY SPRITE_GRANNY at (2, 3),
SPINRANDOM_SLOW, BlackthornDragonSpeechHouseGrannyScript (CLAIR and LANCE
trained here); BLACKTHORNDRAGONSPEECHHOUSE_EKANS SPRITE_EKANS at (5, 5),
SPRITEMOVEDATA_POKEMON, BlackthornDragonSpeechHouseDratiniScript
(cry DRATINI - the sprite is EKANS but it is a Dratini).
MAP_BLACKTHORN_GYM_1F
- Script:
maps/BlackthornGym1F.asm(BlackthornGym1F_MapEvents=53:4964,BlackthornGym1FBouldersCallback=53:4005,BlackthornGymClairScript=53:4024) - Blocks:
maps/BlackthornGym1F.blk - Header:
data/maps/maps.asm:178->TILESET_ELITE_FOUR_ROOM,INDOOR,LANDMARK_BLACKTHORN_CITY,MUSIC_GYM, phoneTRUE,PALETTE_DAY - Dimensions:
constants/map_constants.asm:163->map_const BLACKTHORN_GYM_1F, 5, 9 - Callbacks:
callback MAPCALLBACK_TILES, BlackthornGym1FBouldersCallback
Warps
| idx | x | y | destination map | dest warp | note |
|---|---|---|---|---|---|
| 1 | 4 | 17 | BLACKTHORN_CITY |
1 | door |
| 2 | 5 | 17 | BLACKTHORN_CITY |
1 | door |
| 3 | 1 | 7 | BLACKTHORN_GYM_2F |
1 | stairs |
| 4 | 7 | 9 | BLACKTHORN_GYM_2F |
2 | stairs |
| 5 | 2 | 6 | BLACKTHORN_GYM_2F |
3 | landing under 2F hole at (2, 5) |
| 6 | 7 | 7 | BLACKTHORN_GYM_2F |
4 | landing under 2F hole at (8, 7) |
| 7 | 7 | 6 | BLACKTHORN_GYM_2F |
5 | landing under 2F hole at (8, 3) |
Coord events
None.
BG events
| x | y | type | script/item |
|---|---|---|---|
| 3 | 15 | BGEVENT_READ |
BlackthornGymStatue |
| 6 | 15 | BGEVENT_READ |
BlackthornGymStatue |
Object events
| const | sprite | x | y | movement | type | sight | script label | event flag |
|---|---|---|---|---|---|---|---|---|
BLACKTHORNGYM1F_CLAIR |
SPRITE_CLAIR |
5 | 3 | STANDING_DOWN |
OBJECTTYPE_SCRIPT |
0 | BlackthornGymClairScript |
-1 |
BLACKTHORNGYM1F_COOLTRAINER_M1 |
SPRITE_COOLTRAINER_M |
6 | 6 | STANDING_DOWN |
OBJECTTYPE_TRAINER |
3 | TrainerCooltrainermMike |
-1 |
BLACKTHORNGYM1F_COOLTRAINER_M2 |
SPRITE_COOLTRAINER_M |
1 | 14 | STANDING_DOWN |
OBJECTTYPE_TRAINER |
3 | TrainerCooltrainermPaul |
-1 |
BLACKTHORNGYM1F_COOLTRAINER_F |
SPRITE_COOLTRAINER_F |
9 | 2 | STANDING_DOWN |
OBJECTTYPE_TRAINER |
1 | TrainerCooltrainerfLola |
-1 |
BLACKTHORNGYM1F_GYM_GUIDE |
SPRITE_GYM_GUIDE |
7 | 15 | STANDING_DOWN |
OBJECTTYPE_SCRIPT |
0 | BlackthornGymGuideScript |
-1 |
Scripts of interest
-
BlackthornGym1FBouldersCallback(MAPCALLBACK_TILES) - paints the fallen boulders that came through the 2F holes:checkevent EVENT_BOULDER_IN_BLACKTHORN_GYM_1 -> changeblock 8, 2, $3b checkevent EVENT_BOULDER_IN_BLACKTHORN_GYM_2 -> changeblock 2, 4, $3a checkevent EVENT_BOULDER_IN_BLACKTHORN_GYM_3 -> changeblock 8, 6, $3b(
Script_changeblockadds 4 to both operands and then divides down to a block index, so these are block coordinates (4, 1), (1, 2) and (4, 3).) -
BlackthornGymClairScript(53:4024) - the single most important script in this section. Control flow:checkflag ENGINE_RISINGBADGE->.AlreadyGotBadge(53:4074).checkevent EVENT_BEAT_CLAIR->.FightDone(53:4063).- Otherwise:
ClairIntroText,winlosstext ClairWinText, 0,loadtrainer CLAIR, CLAIR1,startbattle,reloadmapafterbattle,setevent EVENT_BEAT_CLAIR,ClairText_GoToDragonsDen, then a block of bookkeeping:setevent EVENT_BEAT_COOLTRAINERM_PAUL,..._CODY,..._MIKE,setevent EVENT_BEAT_COOLTRAINERF_FRAN,..._LOLA(the five gym trainers are force-marked beaten),clearevent EVENT_MAHOGANY_MART_OWNERS,setevent EVENT_BLACKTHORN_CITY_GRAMPS_BLOCKS_DRAGONS_DEN,clearevent EVENT_BLACKTHORN_CITY_GRAMPS_NOT_BLOCKING_DRAGONS_DEN(this pair is what opens Dragon's Den). No badge and no TM are given here. .FightDone:checkitem DRAGON_FANG->.HasDragonFang(BlackthornGymClairText_Cheat, "You did not get that at DRAGON'S DEN") ; elseClairText_WhatsTheMatter..AlreadyGotBadge:checkevent EVENT_GOT_TM24_DRAGONBREATH->.GotTM24(BlackthornGymClairText_League); elseverbosegiveitem TM_DRAGONBREATH,setevent EVENT_GOT_TM24_DRAGONBREATH. This is the fallback path for a player whose bag was full in the Den.
-
BlackthornGymStatue-checkflag ENGINE_RISINGBADGE->jumpstd GymStatue2Scriptwithgettrainername STRING_BUFFER_4, CLAIR, CLAIR1; elsejumpstd GymStatue1Script. -
BlackthornGymGuideScript- branches onEVENT_BEAT_CLAIR.
Flags and events
| constant | defined in | read/written by | meaning for a bot |
|---|---|---|---|
EVENT_BEAT_CLAIR |
constants/event_flags.asm:713 |
set by BlackthornGymClairScript |
battle won; badge still pending |
ENGINE_RISINGBADGE |
constants/engine_flags.asm:45 |
set in maps/DragonsDenB1F.asm, not here |
the actual 8th badge |
EVENT_GOT_TM24_DRAGONBREATH |
constants/event_flags.asm:21 |
Den script, or the .AlreadyGotBadge fallback here |
|
EVENT_BOULDER_IN_BLACKTHORN_GYM_1..3 |
:1192-1194 |
2F stone table disappear; read by the 1F tiles callback |
set -> boulder has fallen; 1F block repainted |
EVENT_BEAT_COOLTRAINERM_PAUL / _CODY / _MIKE |
:859-861 |
trainer rows and the Clair script's bulk setevent |
|
EVENT_BEAT_COOLTRAINERF_FRAN / _LOLA |
:879-880 |
same |
Items
| item | how obtained | source | one-time flag |
|---|---|---|---|
TM_DRAGONBREATH (TM24) |
Clair, only on the .AlreadyGotBadge re-talk path |
BlackthornGymClairScript.AlreadyGotBadge |
EVENT_GOT_TM24_DRAGONBREATH |
Trainers
| const | class | id | party | script label | rematch/phone |
|---|---|---|---|---|---|
COOLTRAINERM, PAUL |
CooltrainerMGroup |
COOLTRAINERM (3) | L34 DRATINI x3; TRAINERTYPE_NORMAL |
TrainerCooltrainermPaul |
none |
COOLTRAINERM, MIKE |
same | COOLTRAINERM (5) | L37 DRAGONAIR; TRAINERTYPE_NORMAL |
TrainerCooltrainermMike |
none |
COOLTRAINERF, LOLA |
CooltrainerFGroup |
COOLTRAINERF (4) | L34 DRATINI, L36 DRAGONAIR; TRAINERTYPE_NORMAL |
TrainerCooltrainerfLola |
none |
CLAIR, CLAIR1 |
ClairGroup (data/trainers/parties.asm:67) |
CLAIR (1); TRAINERTYPE_MOVES |
L37 DRAGONAIR (Thunder Wave / Surf / Slam / Dragonbreath), L37 DRAGONAIR (Thunder Wave / Thunderbolt / Slam / Dragonbreath), L37 DRAGONAIR (Thunder Wave / Ice Beam / Slam / Dragonbreath), L40 KINGDRA (Smokescreen / Surf / Hyper Beam / Dragonbreath) |
BlackthornGymClairScript |
none |
Note the party order: the asm sends out three Dragonair first and Kingdra last. The walkthrough lists Kingdra third.
Wild encounters
None (indoor).
MAP_BLACKTHORN_GYM_2F
- Script:
maps/BlackthornGym2F.asm(BlackthornGym2F_MapEvents=53:4bc8,BlackthornGym2FSetUpStoneTableCallback=53:49dd) - Blocks:
maps/BlackthornGym2F.blk - Header:
data/maps/maps.asm:179->TILESET_ELITE_FOUR_ROOM,INDOOR,LANDMARK_BLACKTHORN_CITY,MUSIC_GYM,TRUE,PALETTE_DAY - Dimensions:
constants/map_constants.asm:164->map_const BLACKTHORN_GYM_2F, 5, 9 - Callbacks:
callback MAPCALLBACK_CMDQUEUE, BlackthornGym2FSetUpStoneTableCallback
Warps
| idx | x | y | destination map | dest warp | note |
|---|---|---|---|---|---|
| 1 | 1 | 7 | BLACKTHORN_GYM_1F |
3 | stairs |
| 2 | 7 | 9 | BLACKTHORN_GYM_1F |
4 | stairs |
| 3 | 2 | 5 | BLACKTHORN_GYM_1F |
5 | hole |
| 4 | 8 | 7 | BLACKTHORN_GYM_1F |
6 | hole |
| 5 | 8 | 3 | BLACKTHORN_GYM_1F |
7 | hole |
Coord events / BG events
None.
Object events
| const | sprite | x | y | movement | type | sight | script label | event flag |
|---|---|---|---|---|---|---|---|---|
BLACKTHORNGYM2F_COOLTRAINER_M |
SPRITE_COOLTRAINER_M |
4 | 1 | STANDING_RIGHT |
OBJECTTYPE_TRAINER |
1 | TrainerCooltrainermCody |
-1 |
BLACKTHORNGYM2F_COOLTRAINER_F |
SPRITE_COOLTRAINER_F |
4 | 11 | STANDING_LEFT |
OBJECTTYPE_TRAINER |
1 | TrainerCooltrainerfFran |
-1 |
BLACKTHORNGYM2F_BOULDER1 |
SPRITE_BOULDER |
8 | 2 | STRENGTH_BOULDER |
OBJECTTYPE_SCRIPT |
0 | BlackthornGymBoulder |
EVENT_BOULDER_IN_BLACKTHORN_GYM_1 |
BLACKTHORNGYM2F_BOULDER2 |
SPRITE_BOULDER |
2 | 3 | STRENGTH_BOULDER |
OBJECTTYPE_SCRIPT |
0 | BlackthornGymBoulder |
EVENT_BOULDER_IN_BLACKTHORN_GYM_2 |
BLACKTHORNGYM2F_BOULDER3 |
SPRITE_BOULDER |
6 | 16 | STRENGTH_BOULDER |
OBJECTTYPE_SCRIPT |
0 | BlackthornGymBoulder |
EVENT_BOULDER_IN_BLACKTHORN_GYM_3 |
BLACKTHORNGYM2F_BOULDER4 |
SPRITE_BOULDER |
3 | 3 | STRENGTH_BOULDER |
OBJECTTYPE_SCRIPT |
0 | BlackthornGymBoulder |
-1 |
BLACKTHORNGYM2F_BOULDER5 |
SPRITE_BOULDER |
6 | 1 | STRENGTH_BOULDER |
OBJECTTYPE_SCRIPT |
0 | BlackthornGymBoulder |
-1 |
BLACKTHORNGYM2F_BOULDER6 |
SPRITE_BOULDER |
8 | 14 | STRENGTH_BOULDER |
OBJECTTYPE_SCRIPT |
0 | BlackthornGymBoulder |
-1 |
Three of the six boulders (4, 5, 6) carry no event flag and therefore never disappear - they are the bridge-building boulders, not the hole-filling ones.
Scripts of interest
-
BlackthornGym2FSetUpStoneTableCallback.StoneTable:stonetable 5, BLACKTHORNGYM2F_BOULDER1, .Boulder1 ; warp 5 = (8, 3) stonetable 3, BLACKTHORNGYM2F_BOULDER2, .Boulder2 ; warp 3 = (2, 5) stonetable 4, BLACKTHORNGYM2F_BOULDER3, .Boulder3 ; warp 4 = (8, 7) db -1Note the deliberately scrambled warp order: boulder 1 belongs in warp 5, boulder 2 in warp 3, boulder 3 in warp 4.
-
Each arm does
disappear BLACKTHORNGYM2F_BOULDERn(setting the matchingEVENT_BOULDER_IN_BLACKTHORN_GYM_n) then.Fall:pause 30,scall .FX(playsound SFX_STRENGTH,earthquake 80),BlackthornGym2FBoulderFellText("The boulder fell / through!"). -
BlackthornGymBoulder->jumpstd StrengthBoulderScriptfor all six.
Trainers
| const | class | id | party | script label | rematch/phone |
|---|---|---|---|---|---|
COOLTRAINERM, CODY |
CooltrainerMGroup |
COOLTRAINERM (4) | L34 HORSEA, L36 SEADRA; TRAINERTYPE_NORMAL |
TrainerCooltrainermCody |
none |
COOLTRAINERF, FRAN |
CooltrainerFGroup |
COOLTRAINERF (3) | L37 SEADRA; TRAINERTYPE_NORMAL |
TrainerCooltrainerfFran |
none |
MAP_DRAGONS_DEN_1F
- Script:
maps/DragonsDen1F.asm(DragonsDen1F_MapEvents=47:44c2) - Blocks:
maps/DragonsDen1F.blk - Header:
data/maps/maps.asm:150->TILESET_CAVE,CAVE,LANDMARK_DRAGONS_DEN,MUSIC_DRAGONS_DEN,TRUE,PALETTE_NITE,FISHGROUP_DRATINI - Dimensions:
constants/map_constants.asm:137->map_const DRAGONS_DEN_1F, 5, 9 - Scene scripts, callbacks, coord events, bg events, object events: all empty
Warps
| idx | x | y | destination map | dest warp | note |
|---|---|---|---|---|---|
| 1 | 3 | 5 | BLACKTHORN_CITY |
8 | cave mouth |
| 2 | 3 | 3 | DRAGONS_DEN_1F |
4 | internal ladder, pairs with warp 4 |
| 3 | 5 | 15 | DRAGONS_DEN_B1F |
1 | the door down to the Den proper |
| 4 | 5 | 13 | DRAGONS_DEN_1F |
2 | internal ladder, pairs with warp 2 |
The "bodyguard in front of it" the walkthrough mentions is on
MAP_BLACKTHORN_CITY, not here - BLACKTHORNCITY_GRAMPS1 at (20, 2).
MAP_DRAGONS_DEN_B1F
- Script:
maps/DragonsDenB1F.asm(DragonsDenB1F_MapEvents=47:49da,DragonsDenB1FDragonFangScript=47:44fa) - Blocks:
maps/DragonsDenB1F.blk - Header:
data/maps/maps.asm:151->TILESET_JOHTO,CAVE,LANDMARK_DRAGONS_DEN,MUSIC_DRAGONS_DEN, phoneTRUE,PALETTE_NITE,FISHGROUP_DRATINI - Dimensions:
constants/map_constants.asm:138->map_const DRAGONS_DEN_B1F, 20, 18 - Attributes:
data/maps/attributes.asm:470, no connections - Callbacks:
callback MAPCALLBACK_NEWMAP, DragonsDenB1FCheckRivalCallback
Warps
| idx | x | y | destination map | dest warp |
|---|---|---|---|---|
| 1 | 20 | 3 | DRAGONS_DEN_1F |
3 |
Coord events
None.
BG events
| x | y | type | script/item |
|---|---|---|---|
| 18 | 24 | BGEVENT_READ |
DragonShrineSignpost |
| 31 | 4 | BGEVENT_ITEM |
DragonsDenB1FHiddenRevive -> hiddenitem REVIVE, EVENT_DRAGONS_DEN_B1F_HIDDEN_REVIVE |
| 21 | 17 | BGEVENT_ITEM |
DragonsDenB1FHiddenMaxPotion -> hiddenitem MAX_POTION, EVENT_DRAGONS_DEN_B1F_HIDDEN_MAX_POTION |
| 31 | 15 | BGEVENT_ITEM |
DragonsDenB1FHiddenMaxElixer -> hiddenitem MAX_ELIXER, EVENT_DRAGONS_DEN_B1F_HIDDEN_MAX_ELIXER |
Object events
| const | sprite | x | y | movement | type | script label | event flag |
|---|---|---|---|---|---|---|---|
DRAGONSDENB1F_POKE_BALL1 |
SPRITE_POKE_BALL |
35 | 16 | STILL |
OBJECTTYPE_SCRIPT |
DragonsDenB1FDragonFangScript |
EVENT_DRAGONS_DEN_B1F_DRAGON_FANG |
DRAGONSDENB1F_CLAIR |
SPRITE_CLAIR |
35 | 22 | STANDING_UP |
OBJECTTYPE_SCRIPT |
ObjectEvent |
EVENT_DRAGONS_DEN_CLAIR |
DRAGONSDENB1F_RIVAL |
SPRITE_RIVAL |
20 | 23 | WANDER (radius 2, 2) |
OBJECTTYPE_SCRIPT |
DragonsDenB1FRivalScript |
EVENT_RIVAL_DRAGONS_DEN |
Note the Dragon Fang object is OBJECTTYPE_SCRIPT, not OBJECTTYPE_ITEMBALL -
it runs a full script, so a bot cannot treat it as a plain pickup.
Scripts of interest
DragonsDenB1FDragonFangScript(47:44fa) - the badge handoff:giveitem DRAGON_FANG;iffalse .BagFullDragonFang(47:4558, which printsText_FoundDragonFang+Text_NoRoomForDragonFangand ends without setting anything - a full bag here loses the whole scene until you return).disappear DRAGONSDENB1F_POKE_BALL1(setsEVENT_DRAGONS_DEN_B1F_DRAGON_FANG),Text_FoundDragonFang,playsound SFX_ITEM,itemnotify.readvar VAR_FACING;ifequal RIGHT, .next->moveobject DRAGONSDENB1F_CLAIR, 34, 21(Clair spawns one cell over when the player grabbed the Fang facing right).appear DRAGONSDENB1F_CLAIR(clearsEVENT_DRAGONS_DEN_CLAIR),applymovement DRAGONSDENB1F_CLAIR, MovementDragonsDen_ClairWalksToYou(fourstep UP),turnobject PLAYER, DOWN.ClairText_GiveDragonbreathDragonDen,DragonShrinePlayerReceivedRisingBadgeText,playsound SFX_GET_BADGE,setflag ENGINE_RISINGBADGE,specialphonecall SPECIALCALL_MASTERBALL,DragonShrineRisingBadgeExplanationText,verbosegiveitem TM_DRAGONBREATH, 1,setevent EVENT_GOT_TM24_DRAGONBREATH,ClairText_CollectedAllBadges(the "go to NEW BARK TOWN then SURF east" directions), thenapplymovement ... MovementDragonsDen_ClairWalksAway(fourstep DOWN) anddisappear DRAGONSDENB1F_CLAIR.
DragonsDenB1FCheckRivalCallback-checkevent EVENT_BEAT_RIVAL_IN_MT_MOON, thenreadvar VAR_WEEKDAYand appears the rival only onTUESDAYorTHURSDAY. Mt. Moon is post-Elite-Four, so the rival is never present during this section;DragonsDenB1FRivalScriptis a talk-only scene guarded byEVENT_TEMPORARY_UNTIL_MAP_RELOAD_1.DragonShrineSignpost- Gold/Silver has no separate Dragon Shrine map; the shrine is only this signpost at (18, 24).
Flags and events
| constant | defined in | read/written by | meaning for a bot |
|---|---|---|---|
EVENT_DRAGONS_DEN_B1F_DRAGON_FANG |
constants/event_flags.asm:1097 |
disappear in the Fang script |
set -> Fang taken, scene done |
EVENT_DRAGONS_DEN_CLAIR |
:1146 |
set at new game (std_scripts.asm), cleared by appear, re-set by the closing disappear |
Clair's cutscene object |
ENGINE_RISINGBADGE |
constants/engine_flags.asm:45 |
setflag here |
8th badge; also the Waterfall gate |
EVENT_GOT_TM24_DRAGONBREATH |
constants/event_flags.asm:21 |
setevent here |
|
SPECIALCALL_MASTERBALL |
constants/phone_constants.asm:52 |
specialphonecall here; consumed by ElmPhoneCallerScript (engine/phone/scripts/elm.asm:70 .gift) |
queues Elm's call; the ball itself is ElmGiveMasterBallScript in maps/ElmsLab.asm, gated on checkflag ENGINE_RISINGBADGE |
EVENT_RIVAL_DRAGONS_DEN |
:1128 |
callback | rival hidden until post-Mt.-Moon Tue/Thu |
EVENT_DRAGONS_DEN_B1F_HIDDEN_REVIVE / _MAX_POTION / _MAX_ELIXER |
:170-172 |
hidden bg events |
Items
| item | how obtained | source | one-time flag |
|---|---|---|---|
DRAGON_FANG |
giveitem from the object at (35, 16) |
DragonsDenB1FDragonFangScript |
EVENT_DRAGONS_DEN_B1F_DRAGON_FANG |
TM_DRAGONBREATH (TM24) |
verbosegiveitem from Clair right after |
same | EVENT_GOT_TM24_DRAGONBREATH |
REVIVE |
hidden at (31, 4) | DragonsDenB1FHiddenRevive |
EVENT_DRAGONS_DEN_B1F_HIDDEN_REVIVE |
MAX_POTION |
hidden at (21, 17) | DragonsDenB1FHiddenMaxPotion |
EVENT_DRAGONS_DEN_B1F_HIDDEN_MAX_POTION |
MAX_ELIXER |
hidden at (31, 15) | DragonsDenB1FHiddenMaxElixer |
EVENT_DRAGONS_DEN_B1F_HIDDEN_MAX_ELIXER |
Wild encounters
- Water:
data/wild/johto_water.asm:121def_water_wildmons DRAGONS_DEN_B1F, 4 percent: L15MAGIKARP, L10MAGIKARP, L10DRATINI. There is no grass table for this map; the walkthrough's "Magikarp / Dratini" list is Surf-only. - Fishing group
FISHGROUP_DRATINI(data/maps/maps.asm:151),data/wild/fish.asm:87: Old = Magikarp L10 x3; Good = Magikarp L20 x3 +time_group 8(Dratini L20); Super = Magikarp L40,time_group 9(Dratini L40), Magikarp L40,DRAGONAIRL40.
3. Blockers and gates
| Gate | Enforced by (file:label) | Requirement | Unlock condition |
|---|---|---|---|
| Blackthorn Gym door at (18, 11) | maps/BlackthornCity.asm object BLACKTHORNCITY_SUPER_NERD1 standing on (18, 12) with flag EVENT_BLACKTHORN_CITY_SUPER_NERD_BLOCKS_GYM |
that event set (object hidden) | maps/RadioTower5F.asm:111-112 sets EVENT_BLACKTHORN_CITY_SUPER_NERD_BLOCKS_GYM and clears ..._DOES_NOT_BLOCK_GYM when the Radio Tower is cleared. Previous section's work; a bot arriving here without it is stuck at the gym door |
| Dragon's Den entrance at (20, 1) | maps/BlackthornCity.asm object BLACKTHORNCITY_GRAMPS1 standing on (20, 2) with flag EVENT_BLACKTHORN_CITY_GRAMPS_BLOCKS_DRAGONS_DEN |
that event set (object hidden) | maps/BlackthornGym1F.asm:54-55 inside BlackthornGymClairScript, immediately after setevent EVENT_BEAT_CLAIR |
| Ice Path B1F -> Blackthorn side | maps/IcePathB1F.asm IcePathB1FSetUpStoneTableCallback.StoneTable; the four SPRITEMOVEDATA_STRENGTH_BOULDER objects |
HM04 STRENGTH usable = ENGINE_PLAINBADGE (engine/events/overworld.asm:941 StrengthFunction.TryStrength -> CheckBadge) plus a party member that knows the move |
push boulder N onto warp N+2 (see the map block above). No script check gates the route - it is the .blk geometry plus the four boulders |
| Ice Path B3F Nevermeltice at (5, 7) | maps/IcePathB3F.asm object ICEPATHB3F_ROCK at (6, 6), SPRITEMOVEDATA_SMASHABLE_ROCK, jumpstd SmashRockScript |
ROCK SMASH in the party; no badge check (HasRockSmash only calls CheckPartyMove) |
smash it |
| Dragon's Den B1F, reaching the Dragon Fang | whirlpool block in maps/DragonsDenB1F.blk; data/collision/field_move_blocks.asm:52 WhirlpoolBlockPointers.johto = facing block $07 -> replacement $36 |
SURF (ENGINE_FOGBADGE, engine/events/overworld.asm:340) and WHIRLPOOL (ENGINE_GLACIERBADGE, :1077 WhirlpoolFunction.TryWhirlpool) |
the one $07 block on this map is block (5, 10) = walk cells x 10-11, y 20-21 |
| Waterfall as a field move | engine/events/overworld.asm:611 WaterfallFunction -> :618 ld de, ENGINE_RISINGBADGE / farcall CheckBadge |
ENGINE_RISINGBADGE |
granted by DragonsDenB1FDragonFangScript, i.e. HM07 picked up in the Ice Path is unusable for the whole of this section |
| Rising Badge itself | maps/BlackthornGym1F.asm BlackthornGymClairScript deliberately does not setflag ENGINE_RISINGBADGE |
beating Clair is not sufficient | maps/DragonsDenB1F.asm DragonsDenB1FDragonFangScript |
| Master Ball from Elm | maps/ElmsLab.asm:60 checkflag ENGINE_RISINGBADGE / iftrue ElmGiveMasterBallScript |
ENGINE_RISINGBADGE |
specialphonecall SPECIALCALL_MASTERBALL from the Den queues the phone call; the item is picked up in Elm's Lab (next section) |
| Dragon Fang bag space | DragonsDenB1FDragonFangScript giveitem DRAGON_FANG / iffalse .BagFullDragonFang |
free bag slot | a full bag silently aborts the entire badge scene; the walkthrough's "deposit any extraneous items" advice is load bearing here |
4. Bot checklist
Coordinates are asm map coordinates (object_event / warp_event values).
"Pre" = precondition flag, "Post" = postcondition flag.
MAP_MAHOGANY_TOWN- Fly, heal, walk east across the map connection toMAP_ROUTE_44. Pre:EVENT_CLEARED_RADIO_TOWER(else the Blackthorn gym stays blocked later).MAP_ROUTE_44- battleTrainerPsychicPhilat (10, 9), sight 3. Post:EVENT_BEAT_PSYCHIC_PHIL.MAP_ROUTE_44- walk to (9, 5) and talk toROUTE44_FRUIT_TREE->BURNT_BERRY.MAP_ROUTE_44- walk to (30, 8), pick upRoute44MaxRevive(MAX_REVIVE, not Max Repel). Post:EVENT_ROUTE_44_MAX_REVIVE.MAP_ROUTE_44- battleTrainerFisherEdgarat (19, 13),TrainerCooltrainerfCybilat (31, 14),TrainerCooltrainermAllenat (41, 15).MAP_ROUTE_44- pick upRoute44UltraBallat (43, 2). Post:EVENT_ROUTE_44_ULTRA_BALL. Optional: hiddenELIXERat (32, 9).MAP_ROUTE_44- battleTrainerPokemaniacZachat (35, 2),TrainerFisherWilton1at (42, 5) (registerPHONE_FISHER_WILTON),TrainerBirdKeeperVance1at (50, 7) (registerPHONE_BIRDKEEPER_VANCE).- Party check before the cave: needs STRENGTH (
ENGINE_PLAINBADGEalready held) and ROCK SMASH. All five Ice Path maps arePALETTE_NITE(data/maps/maps.asm:131-135), notPALETTE_DARK(constants/map_data_constants.asm:38, which is whatDarkCaveBlackthornEntranceuses atdata/maps/maps.asm:149), so FLASH is not required. MAP_ROUTE_44(56, 7) -> warp 1 ->MAP_ICE_PATH_1F(4, 19).MAP_ICE_PATH_1F- slide to (31, 7), takeIcePath1FHMWaterfall. Post:EVENT_GOT_HM07_WATERFALL. The move is unusable until step 30.MAP_ICE_PATH_1F(37, 5) -> warp 3 ->MAP_ICE_PATH_B1F(3, 15).MAP_ICE_PATH_B1F- use STRENGTH, pushICEPATHB1F_BOULDER1from (11, 7) onto warp 3 at (11, 2). Post:EVENT_BOULDER_IN_ICE_PATH_1set,EVENT_BOULDER_IN_ICE_PATH_1Acleared.- Push
ICEPATHB1F_BOULDER2from (7, 8) onto warp 4 at (4, 7). Post:EVENT_BOULDER_IN_ICE_PATH_2/_2A. - Push
ICEPATHB1F_BOULDER3from (8, 9) onto warp 5 at (5, 12). Post:EVENT_BOULDER_IN_ICE_PATH_3/_3A. - Push
ICEPATHB1F_BOULDER4from (17, 7) onto warp 6 at (12, 13). Post:EVENT_BOULDER_IN_ICE_PATH_4/_4A. (STRENGTH must be re-activated after every map load -ResetBikeFlags.) - Drop through any hole, or take warp 2 at (17, 3) ->
MAP_ICE_PATH_B2F_MAHOGANY_SIDE(17, 1). MAP_ICE_PATH_B2F_MAHOGANY_SIDE- pick upFULL_HEALat (8, 9) andMAX_POTIONat (0, 2); optional hiddenCARBOSat (0, 17).- Warp 2 at (9, 11) ->
MAP_ICE_PATH_B3F(3, 5). MAP_ICE_PATH_B3F- ROCK SMASHICEPATHB3F_ROCKat (6, 6), takeNEVERMELTICEat (5, 7). Post:EVENT_ICE_PATH_B3F_NEVERMELTICE.- Warp 2 at (15, 5) ->
MAP_ICE_PATH_B2F_BLACKTHORN_SIDE(3, 3). - Take
TM_REST(TM44) at (8, 16). Post:EVENT_ICE_PATH_B2F_BLACKTHORN_SIDE_TM_REST. Optional hiddenICE_HEALat (2, 10). - Warp 1 at (3, 15) ->
MAP_ICE_PATH_B1F(11, 27) (south region). - Take
IRONat (5, 35). Post:EVENT_ICE_PATH_B1F_IRON. Optional hiddenMAX_POTIONat (15, 31). - Warp 7 at (5, 25) ->
MAP_ICE_PATH_1F(37, 13) (south region). - Take
PP_UPat (32, 23). Post:EVENT_ICE_PATH_1F_PP_UP. - Warp 2 at (36, 27) ->
MAP_BLACKTHORN_CITY(36, 9). Post:ENGINE_FLYPOINT_BLACKTHORN(viaMAPCALLBACK_NEWMAP). MAP_BLACKTHORN_CITY(21, 29) -> Pokecenter, heal. (15, 29) -> Mart, buy fromMartBlackthorn. Optional (29, 23) Emy trade (needs a female Dragonair), (9, 31) Move Deleter.MAP_BLACKTHORN_CITY(18, 11) ->MAP_BLACKTHORN_GYM_1F(4, 17). Pre:EVENT_BLACKTHORN_CITY_SUPER_NERD_BLOCKS_GYMset.- Gym: battle
TrainerCooltrainermPaul(1, 14), take warp 3 at (1, 7) to 2F; battleTrainerCooltrainerfFran(4, 11) andTrainerCooltrainermCody(4, 1); pushBLACKTHORNGYM2F_BOULDER2(2, 3) onto warp 3 (2, 5),BLACKTHORNGYM2F_BOULDER3(6, 16) onto warp 4 (8, 7),BLACKTHORNGYM2F_BOULDER1(8, 2) onto warp 5 (8, 3); use boulders 4, 5, 6 ((3, 3), (6, 1), (8, 14)) as bridge pieces. Back on 1F battleTrainerCooltrainermMike(6, 6) andTrainerCooltrainerfLola(9, 2). All five are force-set by the Clair script anyway, so a bot may skip them. - Talk to
BLACKTHORNGYM1F_CLAIRat (5, 3) ->loadtrainer CLAIR, CLAIR1. Post:EVENT_BEAT_CLAIR, plusEVENT_BLACKTHORN_CITY_GRAMPS_BLOCKS_DRAGONS_DENset and..._NOT_BLOCKING_DRAGONS_DENcleared. No badge yet. - Bag check: at least one free slot (see the
.BagFullDragonFangtrap). MAP_BLACKTHORN_CITY(20, 1) ->MAP_DRAGONS_DEN_1F(3, 5). Ladder (3, 3) -> (5, 13), then (5, 15) ->MAP_DRAGONS_DEN_B1F(20, 3).MAP_DRAGONS_DEN_B1F- SURF, dissolve the whirlpool at walk cells (10-11, 20-21), surf east to (35, 16) and take the Dragon Fang. Post:EVENT_DRAGONS_DEN_B1F_DRAGON_FANG,ENGINE_RISINGBADGE,EVENT_GOT_TM24_DRAGONBREATH,SPECIALCALL_MASTERBALLqueued. Optional hidden items at (31, 4), (21, 17), (31, 15).- Exit via warp 1 at (20, 3). WATERFALL is now usable. The Elm phone call
fires outside; the Master Ball pickup in
MAP_ELMS_LABis the next section.
5. Port coverage
| Beat | Port file | Status |
|---|---|---|
| Map headers, dimensions, warps/coord/bg/object event tables for every map above | src/import/RomExtractorGen2.lua (warps, coordEvents, bgEvents, objects at lines 787-862, consumed at 973-975) |
implemented (data-driven from the ROM, so no per-map porting is needed) |
Map script execution (checkevent, setevent, giveitem, verbosegiveitem, loadtrainer, startbattle, applymovement, moveobject, changeblock, earthquake, writecmdqueue, trade, specialphonecall) |
src/script/gen2/Vm.lua (490, 806, 1002, 1044, 1292, 1364, 1445) |
implemented |
| Ice Path B1F stone table (boulder -> hole -> fall) | src/world/gen2/CmdQueue.lua:212-222 (ICE_PATH_B1F, warps 2-5 zero-based against objects 2-5, events 1805-1808) |
implemented; covered by tests/drivers/gold_icepath_boulder.lua and tests/drivers/gold_map_callbacks.lua:167 |
| Blackthorn Gym 2F stone table | src/world/gen2/CmdQueue.lua:227-230 (warps 5/3/4 -> objects 4/5/6, matching the scrambled asm order) |
implemented; no dedicated driver |
Blackthorn Gym 1F MAPCALLBACK_TILES fallen-boulder changeblock |
src/script/gen2/Vm.lua:1002 |
implemented (generic changeblock) |
STRENGTH badge gate + ResetBikeFlags clearing STRENGTH on every map load |
src/world/gen2/FieldMoves.lua:108 (STRENGTH = "PLAIN"), src/world/gen2/World.lua:5610-5613 |
implemented |
| WHIRLPOOL badge gate + block replacement | src/world/gen2/FieldMoves.lua:109,247,540-556,624 |
implemented |
WATERFALL badge gate (ENGINE_RISINGBADGE) |
src/world/gen2/FieldMoves.lua:110,253-266,528-538 |
implemented |
ROCK SMASH (HasRockSmash inversion) |
src/script/gen2/CallAsm.lua:344-350 |
implemented |
Ice tile sliding (STEP_ICE) |
src/world/gen2/Permissions.lua:128,142 defines ICE = {0x23, 0x2b} but the only caller is src/world/gen2/FieldMoves.lua:169; there is no STEP_ICE arm in World:movePlayer (src/world/gen2/World.lua:5876) and no CheckStandingOnIce equivalent anywhere in src/ |
missing - this is the single biggest gap for this section, because every Ice Path floor is an ice-slide maze. A bot can push boulders but cannot traverse the mazes as the cart does |
ENGINE_FLYPOINT_BLACKTHORN / Fly to Blackthorn |
src/world/gen2/FieldMoves.lua:354 (LANDMARK_BLACKTHORN_CITY, SPAWN_BLACKTHORN, flag 74) |
implemented |
Emy's NPC trade (NPC_TRADE_EMY, female Dragonair) |
src/core/gen2/NpcTrade.lua (gender check at :91-93), src/script/gen2/Vm.lua:1292 trade opcode |
implemented |
Move Deleter (special MoveDeletion) |
src/script/gen2/Specials.lua:637 H.MoveDeletion, src/ui/gen2/MoveDeleter.lua |
implemented |
Blackthorn Mart (pokemart MARTTYPE_STANDARD, MART_BLACKTHORN) |
src/ui/gen2/MartMenu.lua + extractor mart tables |
implemented (generic) |
| Vance / Wilton phone registration and rematch | src/core/gen2/Phone.lua:210-215 (ids 32 and 33), rematch flags at :451-452 |
implemented |
specialphonecall SPECIALCALL_MASTERBALL -> Elm's call |
src/script/gen2/Vm.lua:1364-1371, src/core/gen2/Phone.lua:402-403 ([8] = SPECIALCALL_MASTERBALL, condition outside, ElmPhoneCallerScript) |
implemented |
| Rising Badge on the trainer card / badge list | src/ui/gen2/TrainerCard.lua:64,74, src/world/gen2/FieldMoves.lua:118 |
implemented |
| Clair battle, gym leader music / party | generic battle path src/battle/gen2/Battle.lua + extracted data/trainers/parties.asm |
implemented (generic); no Blackthorn-specific driver exists under tests/drivers/gold_*.lua |
| End-to-end scripted run of this section | - | missing - the only relevant driver is tests/drivers/gold_icepath_boulder.lua, which teleports directly to ICE_PATH_B1F (9, 2) and tests one boulder |
6. Unresolved / verify by hand
- "Max Repel" on Route 44. The walkthrough says "then the item east of that
trainer (Max Repel)". The asm item ball at (30, 8) is
Route44MaxRevive: itemball MAX_REVIVE. There is no Max Repel object onMAP_ROUTE_44; Max Repel is a Blackthorn Mart stock item (data/items/marts.asm:224). Treat the walkthrough as wrong. - Route 44 item list. The section header lists only "Burnt Berry, Ultra Ball" but the map also has the Max Revive ball and a hidden Elixer at (32, 9).
- Psychic Phil's Kadabra level. Walkthrough says Level 24;
data/trainers/parties.asmPSYCHIC_T (8) saysdb 26, KADABRA. The Natu is L24 in both. - "Protein" in the Ice Path. The walkthrough's final Ice Path paragraph says
"Go up even more steps to get the Protein, then slide down at the very left to
grab a PP Up." No
PROTEINappears in any of the five Ice Path map files, and the walkthrough's own item list for the Ice Path does not include it. The only vitamins in the Ice Path areIRON(B1F, (5, 35)) and the hiddenCARBOS(B2F Mahogany Side, (0, 17)). Unresolved. - Ice Path item list omissions. The asm additionally has
MAX_POTION(item ball, B2F Mahogany Side (0, 2)), hiddenMAX_POTION(B1F (15, 31)), hiddenCARBOS(B2F Mahogany (0, 17)) and hiddenICE_HEAL(B2F Blackthorn (2, 10)). - Ice maze direction strings. Every "right, down, right, down" style route in
the walkthrough is a property of the
.blkblock layout and the ice-tile collision values, not of any table in the map asm. None of them were verified; a bot must derive them frommaps/IcePath*.blkplusCheckIceTile(engine/overworld/player_movement.asm:274). - Boulder push counts. Likewise, "move the bottom boulder right, then 6 squares down..." for both the Ice Path B1F and Blackthorn Gym 2F puzzles is block-geometry, not script data. What is pinned down is the required destination warp for each boulder (see the two stone tables above); the paths between were not verified.
- Dragon's Den whirlpool. The walkthrough says "Make sure you have ... Surf
and Waterfall". The Den needs SURF and WHIRLPOOL; there is no waterfall
block on
MAP_DRAGONS_DEN_B1Fand Waterfall is not even usable until the badge this trip awards. The single whirlpool block ($07inTILESET_JOHTO) is at block (5, 10) ofmaps/DragonsDenB1F.blk; whether that is the only crossing the route needs was not verified beyond the block scan. - Clair's party order. Walkthrough lists Dragonair, Dragonair, Kingdra,
Dragonair.
ClairGroupindata/trainers/parties.asm:67is Dragonair, Dragonair, Dragonair, Kingdra. - Fisher Edgar's Remoraid levels. Walkthrough says two Level 25 Remoraid;
the asm agrees, but note both carry
LOCK_ON / PSYBEAM / AURORA_BEAM / BUBBLEBEAMrather than default moves. - "use the warps to return to the entrance". The 1F <-> 2F warp pairs (1F 3/4 <-> 2F 1/2, 1F 5/6/7 <-> 2F 3/4/5) are transcribed above, but which combination the walkthrough means by "use the warps" is ambiguous.
- Money rewards. The G values in the walkthrough (832G, 1000G, 1200G, ...)
come from
base money x level, computed at runtime inengine/battle/; no static table was located, so none were verified. - Section numbering. The file is
section-13-*but its own heading reads---- 19 > Ice Path and Blackthorn City Gym ----. Assumed to be the FAQ's internal chapter number, not a different section.