pokecrystal/engine/events/overworld.asm

1844 lines
27 KiB
NASM

FieldMoveJumptableReset:
xor a
ld hl, wBuffer1
ld bc, 7
call ByteFill
ret
FieldMoveJumptable:
ld a, [wBuffer1]
rst JumpTable
ld [wBuffer1], a
bit 7, a
jr nz, .okay
and a
ret
.okay
and $7f
scf
ret
GetPartyNick:
; write wCurPartyMon nickname to wStringBuffer1-3
ld hl, wPartyMonNicknames
ld a, BOXMON
ld [wMonType], a
ld a, [wCurPartyMon]
call GetNick
call CopyName1
; copy text from wStringBuffer2 to wStringBuffer3
ld de, wStringBuffer2
ld hl, wStringBuffer3
call CopyName2
ret
CheckEngineFlag:
; Check engine flag de
; Return carry if flag is not set
ld b, CHECK_FLAG
farcall EngineFlagAction
ld a, c
and a
jr nz, .isset
scf
ret
.isset
xor a
ret
CheckBadge:
; Check engine flag a (ENGINE_ZEPHYRBADGE thru ENGINE_EARTHBADGE)
; Display "Badge required" text and return carry if the badge is not owned
call CheckEngineFlag
ret nc
ld hl, .BadgeRequiredText
call MenuTextBoxBackup ; push text to queue
scf
ret
.BadgeRequiredText:
; Sorry! A new BADGE
; is required.
text_far _BadgeRequiredText
db "@"
CheckPartyMove:
; Check if a monster in your party has move d.
ld e, 0
xor a
ld [wCurPartyMon], a
.loop
ld c, e
ld b, 0
ld hl, wPartySpecies
add hl, bc
ld a, [hl]
and a
jr z, .no
cp -1
jr z, .no
cp EGG
jr z, .next
ld bc, PARTYMON_STRUCT_LENGTH
ld hl, wPartyMon1Moves
ld a, e
call AddNTimes
ld b, NUM_MOVES
.check
ld a, [hli]
cp d
jr z, .yes
dec b
jr nz, .check
.next
inc e
jr .loop
.yes
ld a, e
ld [wCurPartyMon], a ; which mon has the move
xor a
ret
.no
scf
ret
FieldMoveFailed:
ld hl, .CantUseHere
call MenuTextBoxBackup
ret
.CantUseHere:
; Can't use that here.
text_far UnknownText_0x1c05c8
db "@"
CutFunction:
call FieldMoveJumptableReset
.loop
ld hl, .Jumptable
call FieldMoveJumptable
jr nc, .loop
and $7f
ld [wFieldMoveSucceeded], a
ret
.Jumptable:
dw .CheckAble
dw .DoCut
dw .FailCut
.CheckAble:
ld de, ENGINE_HIVEBADGE
call CheckBadge
jr c, .nohivebadge
call CheckMapForSomethingToCut
jr c, .nothingtocut
ld a, $1
ret
.nohivebadge
ld a, $80
ret
.nothingtocut
ld a, $2
ret
.DoCut:
ld hl, Script_CutFromMenu
call QueueScript
ld a, $81
ret
.FailCut:
ld hl, Text_NothingToCut
call MenuTextBoxBackup
ld a, $80
ret
Text_UsedCut:
; used CUT!
text_far UnknownText_0x1c05dd
db "@"
Text_NothingToCut:
; There's nothing to CUT here.
text_far UnknownText_0x1c05ec
db "@"
CheckMapForSomethingToCut:
; Does the collision data of the facing tile permit cutting?
call GetFacingTileCoord
ld c, a
push de
farcall CheckCutCollision
pop de
jr nc, .fail
; Get the location of the current block in wOverworldMapBlocks.
call GetBlockLocation
ld c, [hl]
; See if that block contains something that can be cut.
push hl
ld hl, CutTreeBlockPointers
call CheckOverworldTileArrays
pop hl
jr nc, .fail
; Back up the wOverworldMapBlocks address to wBuffer3
ld a, l
ld [wBuffer3], a
ld a, h
ld [wBuffer4], a
; Back up the replacement tile to wBuffer5
ld a, b
ld [wBuffer5], a
; Back up the animation index to wBuffer6
ld a, c
ld [wBuffer6], a
xor a
ret
.fail
scf
ret
Script_CutFromMenu:
reloadmappart
special UpdateTimePals
Script_Cut:
callasm GetPartyNick
writetext Text_UsedCut
reloadmappart
callasm CutDownTreeOrGrass
closetext
end
CutDownTreeOrGrass:
ld hl, wBuffer3 ; OverworldMapTile
ld a, [hli]
ld h, [hl]
ld l, a
ld a, [wBuffer5] ; ReplacementTile
ld [hl], a
xor a
ldh [hBGMapMode], a
call OverworldTextModeSwitch
call UpdateSprites
call DelayFrame
ld a, [wBuffer6] ; Animation type
ld e, a
farcall OWCutAnimation
call BufferScreen
call GetMovementPermissions
call UpdateSprites
call DelayFrame
call LoadStandardFont
ret
CheckOverworldTileArrays:
; Input: c contains the tile you're facing
; Output: Replacement tile in b and effect on wild encounters in c, plus carry set.
; Carry is not set if the facing tile cannot be replaced, or if the tileset
; does not contain a tile you can replace.
; Dictionary lookup for pointer to tile replacement table
push bc
ld a, [wMapTileset]
ld de, 3
call IsInArray
pop bc
jr nc, .nope
; Load the pointer
inc hl
ld a, [hli]
ld h, [hl]
ld l, a
; Look up the tile you're facing
ld de, 3
ld a, c
call IsInArray
jr nc, .nope
; Load the replacement to b
inc hl
ld b, [hl]
; Load the animation type parameter to c
inc hl
ld c, [hl]
scf
ret
.nope
xor a
ret
INCLUDE "data/events/field_move_blocks.asm"
OWFlash:
call .CheckUseFlash
and $7f
ld [wFieldMoveSucceeded], a
ret
.CheckUseFlash:
; Flash
ld de, ENGINE_ZEPHYRBADGE
farcall CheckBadge
jr c, .nozephyrbadge
push hl
farcall SpecialAerodactylChamber
pop hl
jr c, .useflash
ld a, [wTimeOfDayPalset]
cp %11111111 ; 3, 3, 3, 3
jr nz, .notadarkcave
.useflash
call UseFlash
ld a, $81
ret
.notadarkcave
call FieldMoveFailed
ld a, $80
ret
.nozephyrbadge
ld a, $80
ret
UseFlash:
ld hl, Script_UseFlash
jp QueueScript
Script_UseFlash:
reloadmappart
special UpdateTimePals
writetext UnknownText_0xc8f3
callasm BlindingFlash
closetext
end
UnknownText_0xc8f3:
text_far UnknownText_0x1c0609
start_asm
call WaitSFX
ld de, SFX_FLASH
call PlaySFX
call WaitSFX
ld hl, .BlankText
ret
.BlankText:
db "@"
SurfFunction:
call FieldMoveJumptableReset
.loop
ld hl, .Jumptable
call FieldMoveJumptable
jr nc, .loop
and $7f
ld [wFieldMoveSucceeded], a
ret
.Jumptable:
dw .TrySurf
dw .DoSurf
dw .FailSurf
dw .AlreadySurfing
.TrySurf:
ld de, ENGINE_FOGBADGE
call CheckBadge
jr c, .asm_c956
ld hl, wBikeFlags
bit BIKEFLAGS_ALWAYS_ON_BIKE_F, [hl]
jr nz, .cannotsurf
ld a, [wPlayerState]
cp PLAYER_SURF
jr z, .alreadyfail
cp PLAYER_SURF_PIKA
jr z, .alreadyfail
call GetFacingTileCoord
call GetTileCollision
cp WATERTILE
jr nz, .cannotsurf
call CheckDirection
jr c, .cannotsurf
farcall CheckFacingObject
jr c, .cannotsurf
ld a, $1
ret
.asm_c956
ld a, $80
ret
.alreadyfail
ld a, $3
ret
.cannotsurf
ld a, $2
ret
.DoSurf:
call GetSurfType
ld [wBuffer2], a
call GetPartyNick
ld hl, SurfFromMenuScript
call QueueScript
ld a, $81
ret
.FailSurf:
ld hl, CantSurfText
call MenuTextBoxBackup
ld a, $80
ret
.AlreadySurfing:
ld hl, AlreadySurfingText
call MenuTextBoxBackup
ld a, $80
ret
SurfFromMenuScript:
special UpdateTimePals
UsedSurfScript:
writetext UsedSurfText ; "used SURF!"
waitbutton
closetext
callasm .empty_fn ; empty function
copybytetovar wBuffer2
writevarcode VAR_MOVEMENT
special ReplaceKrisSprite
special PlayMapMusic
; step into the water (slow_step DIR, step_end)
special SurfStartStep
applymovement PLAYER, wMovementBuffer
end
.empty_fn
farcall StubbedTrainerRankings_Surf
ret
UsedSurfText:
text_far _UsedSurfText
db "@"
CantSurfText:
text_far _CantSurfText
db "@"
AlreadySurfingText:
text_far _AlreadySurfingText
db "@"
GetSurfType:
; Surfing on Pikachu uses an alternate sprite.
; This is done by using a separate movement type.
ld a, [wCurPartyMon]
ld e, a
ld d, 0
ld hl, wPartySpecies
add hl, de
ld a, [hl]
cp PIKACHU
ld a, PLAYER_SURF_PIKA
ret z
ld a, PLAYER_SURF
ret
CheckDirection:
; Return carry if a tile permission prevents you
; from moving in the direction you're facing.
; Get player direction
ld a, [wPlayerDirection]
and %00001100 ; bits 2 and 3 contain direction
rrca
rrca
ld e, a
ld d, 0
ld hl, .Directions
add hl, de
; Can you walk in this direction?
ld a, [wTilePermissions]
and [hl]
jr nz, .quit
xor a
ret
.quit
scf
ret
.Directions:
db FACE_DOWN
db FACE_UP
db FACE_LEFT
db FACE_RIGHT
TrySurfOW::
; Checking a tile in the overworld.
; Return carry if fail is allowed.
; Don't ask to surf if already fail.
ld a, [wPlayerState]
cp PLAYER_SURF_PIKA
jr z, .quit
cp PLAYER_SURF
jr z, .quit
; Must be facing water.
ld a, [wEngineBuffer1]
call GetTileCollision
cp WATERTILE
jr nz, .quit
; Check tile permissions.
call CheckDirection
jr c, .quit
ld de, ENGINE_FOGBADGE
call CheckEngineFlag
jr c, .quit
ld d, SURF
call CheckPartyMove
jr c, .quit
ld hl, wBikeFlags
bit BIKEFLAGS_ALWAYS_ON_BIKE_F, [hl]
jr nz, .quit
call GetSurfType
ld [wBuffer2], a
call GetPartyNick
ld a, BANK(AskSurfScript)
ld hl, AskSurfScript
call CallScript
scf
ret
.quit
xor a
ret
AskSurfScript:
opentext
writetext AskSurfText
yesorno
iftrue UsedSurfScript
closetext
end
AskSurfText:
text_far _AskSurfText ; The water is calm.
db "@" ; Want to SURF?
FlyFunction:
call FieldMoveJumptableReset
.loop
ld hl, .Jumptable
call FieldMoveJumptable
jr nc, .loop
and $7f
ld [wFieldMoveSucceeded], a
ret
.Jumptable:
dw .TryFly
dw .DoFly
dw .FailFly
.TryFly:
; Fly
ld de, ENGINE_STORMBADGE
call CheckBadge
jr c, .nostormbadge
call GetMapEnvironment
call CheckOutdoorMap
jr z, .outdoors
jr .indoors
.outdoors
xor a
ldh [hMapAnims], a
call LoadStandardMenuHeader
call ClearSprites
farcall _FlyMap
ld a, e
cp -1
jr z, .illegal
cp NUM_SPAWNS
jr nc, .illegal
ld [wDefaultSpawnpoint], a
call CloseWindow
ld a, $1
ret
.nostormbadge
ld a, $82
ret
.indoors
ld a, $2
ret
.illegal
call CloseWindow
call WaitBGMap
ld a, $80
ret
.DoFly:
ld hl, .FlyScript
call QueueScript
ld a, $81
ret
.FailFly:
call FieldMoveFailed
ld a, $82
ret
.FlyScript:
reloadmappart
callasm HideSprites
special UpdateTimePals
callasm FlyFromAnim
farscall Script_AbortBugContest
special WarpToSpawnPoint
callasm DelayLoadingNewSprites
writecode VAR_MOVEMENT, PLAYER_NORMAL
newloadmap MAPSETUP_FLY
callasm FlyToAnim
special WaitSFX
callasm .ReturnFromFly
end
.ReturnFromFly:
farcall Function561d
call DelayFrame
call ReplaceKrisSprite
farcall LoadOverworldFont
ret
WaterfallFunction:
call .TryWaterfall
and $7f
ld [wFieldMoveSucceeded], a
ret
.TryWaterfall:
; Waterfall
ld de, ENGINE_RISINGBADGE
farcall CheckBadge
ld a, $80
ret c
call CheckMapCanWaterfall
jr c, .failed
ld hl, Script_WaterfallFromMenu
call QueueScript
ld a, $81
ret
.failed
call FieldMoveFailed
ld a, $80
ret
CheckMapCanWaterfall:
ld a, [wPlayerDirection]
and $c
cp FACE_UP
jr nz, .failed
ld a, [wTileUp]
call CheckWaterfallTile
jr nz, .failed
xor a
ret
.failed
scf
ret
Script_WaterfallFromMenu:
reloadmappart
special UpdateTimePals
Script_UsedWaterfall:
callasm GetPartyNick
writetext .Text_UsedWaterfall
waitbutton
closetext
playsound SFX_BUBBLEBEAM
.loop
applymovement PLAYER, .WaterfallStep
callasm .CheckContinueWaterfall
iffalse .loop
end
.CheckContinueWaterfall:
xor a
ld [wScriptVar], a
ld a, [wPlayerStandingTile]
call CheckWaterfallTile
ret z
farcall StubbedTrainerRankings_Waterfall
ld a, $1
ld [wScriptVar], a
ret
.WaterfallStep:
turn_waterfall UP
step_end
.Text_UsedWaterfall:
; used WATERFALL!
text_far UnknownText_0x1c068e
db "@"
TryWaterfallOW::
ld d, WATERFALL
call CheckPartyMove
jr c, .failed
ld de, ENGINE_RISINGBADGE
call CheckEngineFlag
jr c, .failed
call CheckMapCanWaterfall
jr c, .failed
ld a, BANK(Script_AskWaterfall)
ld hl, Script_AskWaterfall
call CallScript
scf
ret
.failed
ld a, BANK(Script_CantDoWaterfall)
ld hl, Script_CantDoWaterfall
call CallScript
scf
ret
Script_CantDoWaterfall:
jumptext .Text_CantDoWaterfall
.Text_CantDoWaterfall:
; Wow, it's a huge waterfall.
text_far UnknownText_0x1c06a3
db "@"
Script_AskWaterfall:
opentext
writetext .AskUseWaterfall
yesorno
iftrue Script_UsedWaterfall
closetext
end
.AskUseWaterfall:
; Do you want to use WATERFALL?
text_far UnknownText_0x1c06bf
db "@"
EscapeRopeFunction:
call FieldMoveJumptableReset
ld a, $1
jr dig_incave
DigFunction:
call FieldMoveJumptableReset
ld a, $2
dig_incave
ld [wBuffer2], a
.loop
ld hl, .DigTable
call FieldMoveJumptable
jr nc, .loop
and $7f
ld [wFieldMoveSucceeded], a
ret
.DigTable:
dw .CheckCanDig
dw .DoDig
dw .FailDig
.CheckCanDig:
call GetMapEnvironment
cp CAVE
jr z, .incave
cp DUNGEON
jr z, .incave
.fail
ld a, $2
ret
.incave
ld hl, wDigWarpNumber
ld a, [hli]
and a
jr z, .fail
ld a, [hli]
and a
jr z, .fail
ld a, [hl]
and a
jr z, .fail
ld a, $1
ret
.DoDig:
ld hl, wDigWarpNumber
ld de, wNextWarp
ld bc, 3
call CopyBytes
call GetPartyNick
ld a, [wBuffer2]
cp $2
jr nz, .escaperope
ld hl, .UsedDigScript
call QueueScript
ld a, $81
ret
.escaperope
farcall SpecialKabutoChamber
ld hl, .UsedEscapeRopeScript
call QueueScript
ld a, $81
ret
.FailDig:
ld a, [wBuffer2]
cp $2
jr nz, .failescaperope
ld hl, .Text_CantUseHere
call MenuTextBox
call WaitPressAorB_BlinkCursor
call CloseWindow
.failescaperope
ld a, $80
ret
.Text_UsedDig:
; used DIG!
text_far UnknownText_0x1c06de
db "@"
.Text_UsedEscapeRope:
; used an ESCAPE ROPE.
text_far UnknownText_0x1c06ed
db "@"
.Text_CantUseHere:
; Can't use that here.
text_far UnknownText_0x1c0705
db "@"
.UsedEscapeRopeScript:
reloadmappart
special UpdateTimePals
writetext .Text_UsedEscapeRope
jump .UsedDigOrEscapeRopeScript
.UsedDigScript:
reloadmappart
special UpdateTimePals
writetext .Text_UsedDig
.UsedDigOrEscapeRopeScript:
waitbutton
closetext
playsound SFX_WARP_TO
applymovement PLAYER, .DigOut
farscall Script_AbortBugContest
special WarpToSpawnPoint
writecode VAR_MOVEMENT, PLAYER_NORMAL
newloadmap MAPSETUP_DOOR
playsound SFX_WARP_FROM
applymovement PLAYER, .DigReturn
end
.DigOut:
step_dig 32
hide_object
step_end
.DigReturn:
show_object
return_dig 32
step_end
TeleportFunction:
call FieldMoveJumptableReset
.loop
ld hl, .Jumptable
call FieldMoveJumptable
jr nc, .loop
and $7f
ld [wFieldMoveSucceeded], a
ret
.Jumptable:
dw .TryTeleport
dw .DoTeleport
dw .FailTeleport
.TryTeleport:
call GetMapEnvironment
call CheckOutdoorMap
jr z, .CheckIfSpawnPoint
jr .nope
.CheckIfSpawnPoint:
ld a, [wLastSpawnMapGroup]
ld d, a
ld a, [wLastSpawnMapNumber]
ld e, a
farcall IsSpawnPoint
jr nc, .nope
ld a, c
ld [wDefaultSpawnpoint], a
ld a, $1
ret
.nope
ld a, $2
ret
.DoTeleport:
call GetPartyNick
ld hl, .TeleportScript
call QueueScript
ld a, $81
ret
.FailTeleport:
ld hl, .Text_CantUseHere
call MenuTextBoxBackup
ld a, $80
ret
.Text_ReturnToLastMonCenter:
; Return to the last #MON CENTER.
text_far UnknownText_0x1c071a
db "@"
.Text_CantUseHere:
; Can't use that here.
text_far UnknownText_0x1c073b
db "@"
.TeleportScript:
reloadmappart
special UpdateTimePals
writetext .Text_ReturnToLastMonCenter
pause 60
reloadmappart
closetext
playsound SFX_WARP_TO
applymovement PLAYER, .TeleportFrom
farscall Script_AbortBugContest
special WarpToSpawnPoint
writecode VAR_MOVEMENT, PLAYER_NORMAL
newloadmap MAPSETUP_TELEPORT
playsound SFX_WARP_FROM
applymovement PLAYER, .TeleportTo
end
.TeleportFrom:
teleport_from
step_end
.TeleportTo:
teleport_to
step_end
StrengthFunction:
call .TryStrength
and $7f
ld [wFieldMoveSucceeded], a
ret
.TryStrength:
; Strength
ld de, ENGINE_PLAINBADGE
call CheckBadge
jr c, .Failed
jr .UseStrength
.Unreferenced_AlreadyUsing:
ld hl, .JumpText
call MenuTextBoxBackup
ld a, $80
ret
.JumpText:
text_far UnknownText_0x1c0751
db "@"
.Failed:
ld a, $80
ret
.UseStrength:
ld hl, Script_StrengthFromMenu
call QueueScript
ld a, $81
ret
SetStrengthFlag:
ld hl, wBikeFlags
set BIKEFLAGS_STRENGTH_ACTIVE_F, [hl]
ld a, [wCurPartyMon]
ld e, a
ld d, 0
ld hl, wPartySpecies
add hl, de
ld a, [hl]
ld [wBuffer6], a
call GetPartyNick
ret
Script_StrengthFromMenu:
reloadmappart
special UpdateTimePals
Script_UsedStrength:
callasm SetStrengthFlag
writetext .UsedStrength
copybytetovar wBuffer6
cry 0
pause 3
writetext .StrengthAllowedItToMoveBoulders
closetext
end
.UsedStrength:
text_far UnknownText_0x1c0774
db "@"
.StrengthAllowedItToMoveBoulders:
text_far UnknownText_0x1c0788
db "@"
AskStrengthScript:
callasm TryStrengthOW
iffalse .AskStrength
ifequal $1, .DontMeetRequirements
jump .AlreadyUsedStrength
.DontMeetRequirements:
jumptext UnknownText_0xcd73
.AlreadyUsedStrength:
jumptext UnknownText_0xcd6e
.AskStrength:
opentext
writetext UnknownText_0xcd69
yesorno
iftrue Script_UsedStrength
closetext
end
UnknownText_0xcd69:
; A #MON may be able to move this. Want to use STRENGTH?
text_far UnknownText_0x1c07a0
db "@"
UnknownText_0xcd6e:
; Boulders may now be moved!
text_far UnknownText_0x1c07d8
db "@"
UnknownText_0xcd73:
; A #MON may be able to move this.
text_far UnknownText_0x1c07f4
db "@"
TryStrengthOW:
ld d, STRENGTH
call CheckPartyMove
jr c, .nope
ld de, ENGINE_PLAINBADGE
call CheckEngineFlag
jr c, .nope
ld hl, wBikeFlags
bit BIKEFLAGS_STRENGTH_ACTIVE_F, [hl]
jr z, .already_using
ld a, 2
jr .done
.nope
ld a, 1
jr .done
.already_using
xor a
jr .done
.done
ld [wScriptVar], a
ret
WhirlpoolFunction:
call FieldMoveJumptableReset
.loop
ld hl, Jumptable_cdae
call FieldMoveJumptable
jr nc, .loop
and $7f
ld [wFieldMoveSucceeded], a
ret
Jumptable_cdae:
dw .TryWhirlpool
dw .DoWhirlpool
dw .FailWhirlpool
.TryWhirlpool:
ld de, ENGINE_GLACIERBADGE
call CheckBadge
jr c, .noglacierbadge
call TryWhirlpoolMenu
jr c, .failed
ld a, $1
ret
.failed
ld a, $2
ret
.noglacierbadge
ld a, $80
ret
.DoWhirlpool:
ld hl, Script_WhirlpoolFromMenu
call QueueScript
ld a, $81
ret
.FailWhirlpool:
call FieldMoveFailed
ld a, $80
ret
Text_UsedWhirlpool:
; used WHIRLPOOL!
text_far UnknownText_0x1c0816
db "@"
TryWhirlpoolMenu:
call GetFacingTileCoord
ld c, a
push de
call CheckWhirlpoolTile
pop de
jr c, .failed
call GetBlockLocation
ld c, [hl]
push hl
ld hl, WhirlpoolBlockPointers
call CheckOverworldTileArrays
pop hl
jr nc, .failed
ld a, l
ld [wBuffer3], a
ld a, h
ld [wBuffer4], a
ld a, b
ld [wBuffer5], a
ld a, c
ld [wBuffer6], a
xor a
ret
.failed
scf
ret
Script_WhirlpoolFromMenu:
reloadmappart
special UpdateTimePals
Script_UsedWhirlpool:
callasm GetPartyNick
writetext Text_UsedWhirlpool
reloadmappart
callasm DisappearWhirlpool
closetext
end
DisappearWhirlpool:
ld hl, wBuffer3
ld a, [hli]
ld h, [hl]
ld l, a
ld a, [wBuffer5]
ld [hl], a
xor a
ldh [hBGMapMode], a
call OverworldTextModeSwitch
ld a, [wBuffer6]
ld e, a
farcall PlayWhirlpoolSound
call BufferScreen
call GetMovementPermissions
ret
TryWhirlpoolOW::
ld d, WHIRLPOOL
call CheckPartyMove
jr c, .failed
ld de, ENGINE_GLACIERBADGE
call CheckEngineFlag
jr c, .failed
call TryWhirlpoolMenu
jr c, .failed
ld a, BANK(Script_AskWhirlpoolOW)
ld hl, Script_AskWhirlpoolOW
call CallScript
scf
ret
.failed
ld a, BANK(Script_MightyWhirlpool)
ld hl, Script_MightyWhirlpool
call CallScript
scf
ret
Script_MightyWhirlpool:
jumptext .MightyWhirlpoolText
.MightyWhirlpoolText:
text_far UnknownText_0x1c082b
db "@"
Script_AskWhirlpoolOW:
opentext
writetext UnknownText_0xce78
yesorno
iftrue Script_UsedWhirlpool
closetext
end
UnknownText_0xce78:
text_far UnknownText_0x1c0864
db "@"
HeadbuttFunction:
call TryHeadbuttFromMenu
and $7f
ld [wFieldMoveSucceeded], a
ret
TryHeadbuttFromMenu:
call GetFacingTileCoord
call CheckHeadbuttTreeTile
jr nz, .no_tree
ld hl, HeadbuttFromMenuScript
call QueueScript
ld a, $81
ret
.no_tree
call FieldMoveFailed
ld a, $80
ret
UnknownText_0xce9d:
; did a HEADBUTT!
text_far UnknownText_0x1c0897
db "@"
UnknownText_0xcea2:
; Nope. Nothing…
text_far UnknownText_0x1c08ac
db "@"
HeadbuttFromMenuScript:
reloadmappart
special UpdateTimePals
HeadbuttScript:
callasm GetPartyNick
writetext UnknownText_0xce9d
reloadmappart
callasm ShakeHeadbuttTree
callasm TreeMonEncounter
iffalse .no_battle
closetext
randomwildmon
startbattle
reloadmapafterbattle
end
.no_battle
writetext UnknownText_0xcea2
waitbutton
closetext
end
TryHeadbuttOW::
ld d, HEADBUTT
call CheckPartyMove
jr c, .no
ld a, BANK(AskHeadbuttScript)
ld hl, AskHeadbuttScript
call CallScript
scf
ret
.no
xor a
ret
AskHeadbuttScript:
opentext
writetext UnknownText_0xcee6
yesorno
iftrue HeadbuttScript
closetext
end
UnknownText_0xcee6:
; A #MON could be in this tree. Want to HEADBUTT it?
text_far UnknownText_0x1c08bc
db "@"
RockSmashFunction:
call TryRockSmashFromMenu
and $7f
ld [wFieldMoveSucceeded], a
ret
TryRockSmashFromMenu:
call GetFacingObject
jr c, .no_rock
ld a, d
cp $18
jr nz, .no_rock
ld hl, RockSmashFromMenuScript
call QueueScript
ld a, $81
ret
.no_rock
call FieldMoveFailed
ld a, $80
ret
GetFacingObject:
farcall CheckFacingObject
jr nc, .fail
ldh a, [hObjectStructIndexBuffer]
call GetObjectStruct
ld hl, OBJECT_MAP_OBJECT_INDEX
add hl, bc
ld a, [hl]
ldh [hLastTalked], a
call GetMapObject
ld hl, MAPOBJECT_MOVEMENT
add hl, bc
ld a, [hl]
ld d, a
and a
ret
.fail
scf
ret
RockSmashFromMenuScript:
reloadmappart
special UpdateTimePals
RockSmashScript:
callasm GetPartyNick
writetext UnknownText_0xcf58
closetext
special WaitSFX
playsound SFX_STRENGTH
earthquake 84
applymovement2 MovementData_0xcf55
disappear -2
callasm RockMonEncounter
copybytetovar wTempWildMonSpecies
iffalse .done
randomwildmon
startbattle
reloadmapafterbattle
.done
end
MovementData_0xcf55:
rock_smash 10
step_end
UnknownText_0xcf58:
text_far UnknownText_0x1c08f0
db "@"
AskRockSmashScript:
callasm HasRockSmash
ifequal 1, .no
opentext
writetext UnknownText_0xcf77
yesorno
iftrue RockSmashScript
closetext
end
.no
jumptext UnknownText_0xcf72
UnknownText_0xcf72:
; Maybe a #MON can break this.
text_far UnknownText_0x1c0906
db "@"
UnknownText_0xcf77:
; This rock looks breakable. Want to use ROCK SMASH?
text_far UnknownText_0x1c0924
db "@"
HasRockSmash:
ld d, ROCK_SMASH
call CheckPartyMove
jr nc, .yes
.no
ld a, 1
jr .done
.yes
xor a
jr .done
.done
ld [wScriptVar], a
ret
FishFunction:
ld a, e
push af
call FieldMoveJumptableReset
pop af
ld [wBuffer2], a
.loop
ld hl, .FishTable
call FieldMoveJumptable
jr nc, .loop
and $7f
ld [wFieldMoveSucceeded], a
ret
.FishTable:
dw .TryFish
dw .FishNoBite
dw .FishGotSomething
dw .FailFish
dw .FishNoFish
.TryFish:
ld a, [wPlayerState]
cp PLAYER_SURF
jr z, .fail
cp PLAYER_SURF_PIKA
jr z, .fail
call GetFacingTileCoord
call GetTileCollision
cp WATERTILE
jr z, .facingwater
.fail
ld a, $3
ret
.facingwater
call GetFishingGroup
and a
jr nz, .goodtofish
ld a, $4
ret
.goodtofish
ld d, a
ld a, [wBuffer2]
ld e, a
farcall Fish
ld a, d
and a
jr z, .nonibble
ld [wTempWildMonSpecies], a
ld a, e
ld [wCurPartyLevel], a
ld a, BATTLETYPE_FISH
ld [wBattleType], a
ld a, $2
ret
.nonibble
ld a, $1
ret
.FailFish:
ld a, $80
ret
.FishGotSomething:
ld a, $1
ld [wBuffer6], a
ld hl, Script_GotABite
call QueueScript
ld a, $81
ret
.FishNoBite:
ld a, $2
ld [wBuffer6], a
ld hl, Script_NotEvenANibble
call QueueScript
ld a, $81
ret
.FishNoFish:
ld a, $0
ld [wBuffer6], a
ld hl, Script_NotEvenANibble2
call QueueScript
ld a, $81
ret
Script_NotEvenANibble:
scall Script_FishCastRod
writetext UnknownText_0xd0a9
jump Script_NotEvenANibble_FallThrough
Script_NotEvenANibble2:
scall Script_FishCastRod
writetext UnknownText_0xd0a9
Script_NotEvenANibble_FallThrough:
loademote EMOTE_SHADOW
callasm PutTheRodAway
closetext
end
Script_GotABite:
scall Script_FishCastRod
callasm Fishing_CheckFacingUp
iffalse .NotFacingUp
applymovement PLAYER, .Movement_FacingUp
jump .FightTheHookedPokemon
.NotFacingUp:
applymovement PLAYER, .Movement_NotFacingUp
.FightTheHookedPokemon:
pause 40
applymovement PLAYER, .Movement_RestoreRod
writetext UnknownText_0xd0a4
callasm PutTheRodAway
closetext
randomwildmon
startbattle
reloadmapafterbattle
end
.Movement_NotFacingUp:
fish_got_bite
fish_got_bite
fish_got_bite
fish_got_bite
show_emote
step_end
.Movement_FacingUp:
fish_got_bite
fish_got_bite
fish_got_bite
fish_got_bite
step_sleep 1
show_emote
step_end
.Movement_RestoreRod:
hide_emote
fish_cast_rod
step_end
Fishing_CheckFacingUp:
ld a, [wPlayerDirection]
and $c
cp OW_UP
ld a, $1
jr z, .up
xor a
.up
ld [wScriptVar], a
ret
Script_FishCastRod:
reloadmappart
loadvar hBGMapMode, $0
special UpdateTimePals
loademote EMOTE_ROD
callasm LoadFishingGFX
loademote EMOTE_SHOCK
applymovement PLAYER, MovementData_0xd093
pause 40
end
MovementData_0xd093:
fish_cast_rod
step_end
PutTheRodAway:
xor a
ldh [hBGMapMode], a
ld a, $1
ld [wPlayerAction], a
call UpdateSprites
call ReplaceKrisSprite
ret
UnknownText_0xd0a4:
; Oh! A bite!
text_far UnknownText_0x1c0958
db "@"
UnknownText_0xd0a9:
; Not even a nibble!
text_far UnknownText_0x1c0965
db "@"
UnknownText_0xd0ae: ; unused
; Looks like there's nothing here.
text_far UnknownText_0x1c0979
db "@"
BikeFunction:
call .TryBike
and $7f
ld [wFieldMoveSucceeded], a
ret
.TryBike:
call .CheckEnvironment
jr c, .CannotUseBike
ld a, [wPlayerState]
cp PLAYER_NORMAL
jr z, .GetOnBike
cp PLAYER_BIKE
jr z, .GetOffBike
jr .CannotUseBike
.GetOnBike:
ld hl, Script_GetOnBike
ld de, Script_GetOnBike_Register
call .CheckIfRegistered
call QueueScript
xor a
ld [wMusicFade], a
ld de, MUSIC_NONE
call PlayMusic
call DelayFrame
call MaxVolume
ld de, MUSIC_BICYCLE
ld a, e
ld [wMapMusic], a
call PlayMusic
ld a, $1
ret
.GetOffBike:
ld hl, wBikeFlags
bit BIKEFLAGS_ALWAYS_ON_BIKE_F, [hl]
jr nz, .CantGetOffBike
ld hl, Script_GetOffBike
ld de, Script_GetOffBike_Register
call .CheckIfRegistered
ld a, BANK(Script_GetOffBike)
jr .done
.CantGetOffBike:
ld hl, Script_CantGetOffBike
jr .done
.CannotUseBike:
ld a, $0
ret
.done
call QueueScript
ld a, $1
ret
.CheckIfRegistered:
ld a, [wUsingItemWithSelect]
and a
ret z
ld h, d
ld l, e
ret
.CheckEnvironment:
call GetMapEnvironment
call CheckOutdoorMap
jr z, .ok
cp CAVE
jr z, .ok
cp GATE
jr z, .ok
jr .nope
.ok
call GetPlayerStandingTile
and WALLTILE | WATERTILE ; can't use our bike in a wall or on water
jr nz, .nope
xor a
ret
.nope
scf
ret
Script_GetOnBike:
reloadmappart
special UpdateTimePals
writecode VAR_MOVEMENT, PLAYER_BIKE
writetext GotOnTheBikeText
waitbutton
closetext
special ReplaceKrisSprite
end
Script_GetOnBike_Register:
writecode VAR_MOVEMENT, PLAYER_BIKE
closetext
special ReplaceKrisSprite
end
; unused
nop
ret
Script_GetOffBike:
reloadmappart
special UpdateTimePals
writecode VAR_MOVEMENT, PLAYER_NORMAL
writetext GotOffTheBikeText
waitbutton
FinishGettingOffBike:
closetext
special ReplaceKrisSprite
special PlayMapMusic
end
Script_GetOffBike_Register:
writecode VAR_MOVEMENT, PLAYER_NORMAL
jump FinishGettingOffBike
Script_CantGetOffBike:
writetext .CantGetOffBikeText
waitbutton
closetext
end
.CantGetOffBikeText:
; You can't get off here!
text_far UnknownText_0x1c099a
db "@"
GotOnTheBikeText:
; got on the @ .
text_far UnknownText_0x1c09b2
db "@"
GotOffTheBikeText:
; got off the @ .
text_far UnknownText_0x1c09c7
db "@"
TryCutOW::
ld d, CUT
call CheckPartyMove
jr c, .cant_cut
ld de, ENGINE_HIVEBADGE
call CheckEngineFlag
jr c, .cant_cut
ld a, BANK(AskCutScript)
ld hl, AskCutScript
call CallScript
scf
ret
.cant_cut
ld a, BANK(CantCutScript)
ld hl, CantCutScript
call CallScript
scf
ret
AskCutScript:
opentext
writetext UnknownText_0xd1c8
yesorno
iffalse .script_d1b8
callasm .CheckMap
iftrue Script_Cut
.script_d1b8
closetext
end
.CheckMap:
xor a
ld [wScriptVar], a
call CheckMapForSomethingToCut
ret c
ld a, TRUE
ld [wScriptVar], a
ret
UnknownText_0xd1c8:
text_far UnknownText_0x1c09dd
db "@"
CantCutScript:
jumptext UnknownText_0xd1d0
UnknownText_0xd1d0:
text_far UnknownText_0x1c0a05
db "@"