pokecrystal-board/engine/events/overworld.asm

1827 lines
27 KiB
NASM
Raw Normal View History

2018-06-24 07:09:41 -07:00
FieldMoveJumptableReset:
2016-03-27 09:47:28 -07:00
xor a
2020-11-03 19:45:12 -08:00
ld hl, wFieldMoveData
ld bc, wFieldMoveDataEnd - wFieldMoveData
2016-03-27 09:47:28 -07:00
call ByteFill
ret
2018-06-24 07:09:41 -07:00
FieldMoveJumptable:
2020-11-03 19:45:12 -08:00
ld a, [wFieldMoveJumptableIndex]
2016-03-27 09:47:28 -07:00
rst JumpTable
2020-11-03 19:45:12 -08:00
ld [wFieldMoveJumptableIndex], a
2016-03-27 09:47:28 -07:00
bit 7, a
jr nz, .okay
and a
ret
.okay
and $7f
scf
ret
GetPartyNickname:
2018-01-23 14:39:09 -08:00
; write wCurPartyMon nickname to wStringBuffer1-3
ld hl, wPartyMonNicknames
2016-03-27 09:47:28 -07:00
ld a, BOXMON
2018-01-23 14:39:09 -08:00
ld [wMonType], a
ld a, [wCurPartyMon]
call GetNickname
2016-03-27 09:47:28 -07:00
call CopyName1
2018-01-23 14:39:09 -08:00
; copy text from wStringBuffer2 to wStringBuffer3
ld de, wStringBuffer2
ld hl, wStringBuffer3
2016-03-27 09:47:28 -07:00
call CopyName2
ret
2018-06-24 07:09:41 -07:00
CheckEngineFlag:
2016-03-27 09:47:28 -07:00
; Check engine flag de
; Return carry if flag is not set
ld b, CHECK_FLAG
2017-12-24 09:47:30 -08:00
farcall EngineFlagAction
2016-03-27 09:47:28 -07:00
ld a, c
and a
jr nz, .isset
scf
ret
.isset
xor a
ret
2018-06-24 07:09:41 -07:00
CheckBadge:
2016-03-27 09:47:28 -07:00
; 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
2019-04-08 05:15:10 -07:00
call MenuTextboxBackup ; push text to queue
2016-03-27 09:47:28 -07:00
scf
ret
2018-06-24 07:09:41 -07:00
.BadgeRequiredText:
text_far _BadgeRequiredText
text_end
2016-03-27 09:47:28 -07:00
2018-06-24 07:09:41 -07:00
CheckPartyMove:
2016-03-27 09:47:28 -07:00
; Check if a monster in your party has move d.
ld e, 0
xor a
2018-01-23 14:39:09 -08:00
ld [wCurPartyMon], a
2016-03-27 09:47:28 -07:00
.loop
ld c, e
ld b, 0
2018-01-23 14:39:09 -08:00
ld hl, wPartySpecies
2016-03-27 09:47:28 -07:00
add hl, bc
ld a, [hl]
and a
jr z, .no
cp -1
2016-03-27 09:47:28 -07:00
jr z, .no
cp EGG
2016-03-27 09:47:28 -07:00
jr z, .next
ld bc, PARTYMON_STRUCT_LENGTH
2018-01-23 14:39:09 -08:00
ld hl, wPartyMon1Moves
2016-03-27 09:47:28 -07:00
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
2018-01-23 14:39:09 -08:00
ld [wCurPartyMon], a ; which mon has the move
2016-03-27 09:47:28 -07:00
xor a
ret
.no
scf
ret
2018-06-24 07:09:41 -07:00
FieldMoveFailed:
ld hl, .CantUseItemText
2019-04-08 05:15:10 -07:00
call MenuTextboxBackup
2016-03-27 09:47:28 -07:00
ret
.CantUseItemText:
text_far _CantUseItemText
text_end
2016-03-27 09:47:28 -07:00
2018-06-24 07:09:41 -07:00
CutFunction:
2016-03-27 09:47:28 -07:00
call FieldMoveJumptableReset
.loop
ld hl, .Jumptable
call FieldMoveJumptable
jr nc, .loop
and $7f
ld [wFieldMoveSucceeded], a
ret
2018-06-24 07:09:41 -07:00
.Jumptable:
2016-03-27 09:47:28 -07:00
dw .CheckAble
dw .DoCut
dw .FailCut
2018-06-24 07:09:41 -07:00
.CheckAble:
2016-03-27 09:47:28 -07:00
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
2018-06-24 07:09:41 -07:00
.DoCut:
2016-03-27 09:47:28 -07:00
ld hl, Script_CutFromMenu
call QueueScript
ld a, $81
ret
2018-06-24 07:09:41 -07:00
.FailCut:
ld hl, CutNothingText
2019-04-08 05:15:10 -07:00
call MenuTextboxBackup
2016-03-27 09:47:28 -07:00
ld a, $80
ret
UseCutText:
text_far _UseCutText
text_end
2016-03-27 09:47:28 -07:00
CutNothingText:
text_far _CutNothingText
text_end
2016-03-27 09:47:28 -07:00
2018-06-24 07:09:41 -07:00
CheckMapForSomethingToCut:
2016-03-27 09:47:28 -07:00
; Does the collision data of the facing tile permit cutting?
call GetFacingTileCoord
ld c, a
push de
2017-12-24 09:47:30 -08:00
farcall CheckCutCollision
2016-03-27 09:47:28 -07:00
pop de
jr nc, .fail
; Get the location of the current block in wOverworldMapBlocks.
2016-03-27 09:47:28 -07:00
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
2020-11-03 19:45:12 -08:00
; Save the Cut field move data
2016-03-27 09:47:28 -07:00
ld a, l
2020-11-03 19:45:12 -08:00
ld [wCutWhirlpoolOverworldBlockAddr], a
2016-03-27 09:47:28 -07:00
ld a, h
2020-11-03 19:45:12 -08:00
ld [wCutWhirlpoolOverworldBlockAddr + 1], a
2016-03-27 09:47:28 -07:00
ld a, b
2020-11-03 19:45:12 -08:00
ld [wCutWhirlpoolReplacementBlock], a
2016-03-27 09:47:28 -07:00
ld a, c
2020-11-03 19:45:12 -08:00
ld [wCutWhirlpoolAnimationType], a
2016-03-27 09:47:28 -07:00
xor a
ret
.fail
scf
ret
2018-06-24 07:09:41 -07:00
Script_CutFromMenu:
2016-03-27 09:47:28 -07:00
reloadmappart
2018-01-02 09:49:25 -08:00
special UpdateTimePals
2016-03-27 09:47:28 -07:00
Script_Cut:
callasm GetPartyNickname
writetext UseCutText
2016-03-27 09:47:28 -07:00
reloadmappart
callasm CutDownTreeOrGrass
closetext
end
2018-06-24 07:09:41 -07:00
CutDownTreeOrGrass:
2020-11-03 19:45:12 -08:00
ld hl, wCutWhirlpoolOverworldBlockAddr
2016-03-27 09:47:28 -07:00
ld a, [hli]
ld h, [hl]
ld l, a
2020-11-03 19:45:12 -08:00
ld a, [wCutWhirlpoolReplacementBlock]
2016-03-27 09:47:28 -07:00
ld [hl], a
xor a
ldh [hBGMapMode], a
call LoadScreenTilemapAndAttrmapPals
2016-03-27 09:47:28 -07:00
call UpdateSprites
call DelayFrame
2020-11-03 19:45:12 -08:00
ld a, [wCutWhirlpoolAnimationType]
2016-03-27 09:47:28 -07:00
ld e, a
2017-12-24 09:47:30 -08:00
farcall OWCutAnimation
2016-03-27 09:47:28 -07:00
call BufferScreen
call GetMovementPermissions
call UpdateSprites
call DelayFrame
call LoadStandardFont
ret
Script_CutAuto::
refreshscreen
callasm CutDownTreeObject
disappear LAST_TALKED
special SetObjectToRemainHidden
reloadmappart
end
CutDownTreeObject:
farcall OWCutAnimation_WithCutTreeAsObject
ret
2018-06-24 07:09:41 -07:00
CheckOverworldTileArrays:
2016-03-27 09:47:28 -07:00
; 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
2018-01-23 14:39:09 -08:00
ld a, [wMapTileset]
2016-03-27 09:47:28 -07:00
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/collision/field_move_blocks.asm"
FlashFunction:
2016-03-27 09:47:28 -07:00
call .CheckUseFlash
and $7f
ld [wFieldMoveSucceeded], a
ret
2018-06-24 07:09:41 -07:00
.CheckUseFlash:
2016-03-27 09:47:28 -07:00
ld de, ENGINE_ZEPHYRBADGE
2017-12-24 09:47:30 -08:00
farcall CheckBadge
2016-03-27 09:47:28 -07:00
jr c, .nozephyrbadge
push hl
2017-12-24 09:47:30 -08:00
farcall SpecialAerodactylChamber
2016-03-27 09:47:28 -07:00
pop hl
jr c, .useflash
ld a, [wTimeOfDayPalset]
2020-08-11 11:12:59 -07:00
cp DARKNESS_PALSET
2016-03-27 09:47:28 -07:00
jr nz, .notadarkcave
.useflash
call UseFlash
ld a, $81
ret
.notadarkcave
call FieldMoveFailed
ld a, $80
ret
.nozephyrbadge
ld a, $80
ret
2018-06-24 07:09:41 -07:00
UseFlash:
2016-03-27 09:47:28 -07:00
ld hl, Script_UseFlash
jp QueueScript
Script_UseFlash:
2016-03-27 09:47:28 -07:00
reloadmappart
2018-01-02 09:49:25 -08:00
special UpdateTimePals
writetext UseFlashTextScript
2016-03-27 09:47:28 -07:00
callasm BlindingFlash
closetext
end
UseFlashTextScript:
text_far _BlindingFlashText
text_asm
2016-03-27 09:47:28 -07:00
call WaitSFX
ld de, SFX_FLASH
call PlaySFX
call WaitSFX
ld hl, .BlankText
ret
.BlankText:
text_end
2016-03-27 09:47:28 -07:00
2018-06-24 07:09:41 -07:00
SurfFunction:
2016-03-27 09:47:28 -07:00
call FieldMoveJumptableReset
.loop
ld hl, .Jumptable
call FieldMoveJumptable
jr nc, .loop
and $7f
ld [wFieldMoveSucceeded], a
ret
2018-06-24 07:09:41 -07:00
.Jumptable:
2016-03-27 09:47:28 -07:00
dw .TrySurf
dw .DoSurf
dw .FailSurf
dw .AlreadySurfing
2018-06-24 07:09:41 -07:00
.TrySurf:
2016-03-27 09:47:28 -07:00
ld de, ENGINE_FOGBADGE
call CheckBadge
jr c, .nofogbadge
ld hl, wBikeFlags
2018-01-22 10:57:44 -08:00
bit BIKEFLAGS_ALWAYS_ON_BIKE_F, [hl]
2016-03-27 09:47:28 -07:00
jr nz, .cannotsurf
2018-01-23 14:39:09 -08:00
ld a, [wPlayerState]
2016-03-27 09:47:28 -07:00
cp PLAYER_SURF
jr z, .alreadyfail
cp PLAYER_SURF_PIKA
jr z, .alreadyfail
call GetFacingTileCoord
call GetTileCollision
cp WATER_TILE
2016-03-27 09:47:28 -07:00
jr nz, .cannotsurf
call CheckDirection
jr c, .cannotsurf
2017-12-24 09:47:30 -08:00
farcall CheckFacingObject
2016-03-27 09:47:28 -07:00
jr c, .cannotsurf
ld a, $1
ret
.nofogbadge
2016-03-27 09:47:28 -07:00
ld a, $80
ret
.alreadyfail
ld a, $3
ret
.cannotsurf
ld a, $2
ret
2018-06-24 07:09:41 -07:00
.DoSurf:
2016-03-27 09:47:28 -07:00
call GetSurfType
2020-11-03 19:45:12 -08:00
ld [wSurfingPlayerState], a
call GetPartyNickname
2016-03-27 09:47:28 -07:00
ld hl, SurfFromMenuScript
call QueueScript
ld a, $81
ret
2018-06-24 07:09:41 -07:00
.FailSurf:
2016-03-27 09:47:28 -07:00
ld hl, CantSurfText
2019-04-08 05:15:10 -07:00
call MenuTextboxBackup
2016-03-27 09:47:28 -07:00
ld a, $80
ret
2018-06-24 07:09:41 -07:00
.AlreadySurfing:
2016-03-27 09:47:28 -07:00
ld hl, AlreadySurfingText
2019-04-08 05:15:10 -07:00
call MenuTextboxBackup
2016-03-27 09:47:28 -07:00
ld a, $80
ret
SurfAutoScript::
readmem wSurfingPlayerState
writevar VAR_MOVEMENT
special UpdatePlayerSprite
special PlayMapMusic
; step into the water (slow_step DIR, step_end)
special SurfStartStep
applymovement PLAYER, wMovementBuffer
end
2018-06-24 07:09:41 -07:00
SurfFromMenuScript:
2018-01-02 09:49:25 -08:00
special UpdateTimePals
2016-03-27 09:47:28 -07:00
2018-06-24 07:09:41 -07:00
UsedSurfScript:
; BUG: Surfing directly across a map connection does not load the new map (see docs/bugs_and_glitches.md)
2016-03-27 09:47:28 -07:00
writetext UsedSurfText ; "used SURF!"
waitbutton
closetext
2020-11-03 19:45:12 -08:00
readmem wSurfingPlayerState
writevar VAR_MOVEMENT
2016-03-27 09:47:28 -07:00
special UpdatePlayerSprite
2016-03-27 09:47:28 -07:00
special PlayMapMusic
Merge branch 'master' of https://github.com/pret/pokecrystal # Conflicts: # audio/engine.asm # constants/gfx_constants.asm # constants/map_data_constants.asm # constants/pokemon_data_constants.asm # constants/sprite_constants.asm # constants/wram_constants.asm # data/maps/data.asm # engine/battle/ai/scoring.asm # engine/battle/core.asm # engine/battle/effect_commands.asm # engine/battle/misc.asm # engine/battle_anims/getpokeballwobble.asm # engine/breeding.asm # engine/buy_sell_toss.asm # engine/decorations.asm # engine/events/battle_tower/battle_tower.asm # engine/events/battle_tower/rules.asm # engine/events/buena.asm # engine/events/bug_contest/contest_2.asm # engine/events/daycare.asm # engine/events/dratini.asm # engine/events/halloffame.asm # engine/events/happiness_egg.asm # engine/events/kurt.asm # engine/events/lucky_number.asm # engine/events/magnet_train.asm # engine/events/overworld.asm # engine/events/pokerus/pokerus.asm # engine/events/print_unown.asm # engine/events/print_unown_2.asm # engine/events/unown_walls.asm # engine/item_effects.asm # engine/link.asm # engine/mon_menu.asm # engine/player_object.asm # engine/routines/playslowcry.asm # engine/scripting.asm # engine/search.asm # engine/search2.asm # engine/specials.asm # engine/start_menu.asm # engine/timeset.asm # home/battle_vars.asm # home/map.asm # maps/GoldenrodUndergroundSwitchRoomEntrances.asm # maps/IlexForest.asm # maps/KrissHouse2F.asm # maps/Route39Barn.asm # mobile/mobile_12_2.asm # mobile/mobile_40.asm # mobile/mobile_5f.asm # wram.asm
2018-02-03 15:21:53 -08:00
; step into the water (slow_step DIR, step_end)
special SurfStartStep
applymovement PLAYER, wMovementBuffer
2016-03-27 09:47:28 -07:00
end
2018-06-24 07:09:41 -07:00
UsedSurfText:
text_far _UsedSurfText
text_end
2016-03-27 09:47:28 -07:00
2018-06-24 07:09:41 -07:00
CantSurfText:
text_far _CantSurfText
text_end
2016-03-27 09:47:28 -07:00
2018-06-24 07:09:41 -07:00
AlreadySurfingText:
text_far _AlreadySurfingText
text_end
2016-03-27 09:47:28 -07:00
2018-06-24 07:09:41 -07:00
GetSurfType:
2016-03-27 09:47:28 -07:00
; Surfing on Pikachu uses an alternate sprite.
; This is done by using a separate movement type.
2018-01-23 14:39:09 -08:00
ld a, [wCurPartyMon]
2016-03-27 09:47:28 -07:00
ld e, a
ld d, 0
2018-01-23 14:39:09 -08:00
ld hl, wPartySpecies
2016-03-27 09:47:28 -07:00
add hl, de
ld a, [hl]
cp PIKACHU
ld a, PLAYER_SURF_PIKA
ret z
ld a, PLAYER_SURF
ret
CheckDirection::
2016-03-27 09:47:28 -07:00
; Return carry if a tile permission prevents you
; from moving in the direction you're facing.
; Get player direction
2018-01-23 14:39:09 -08:00
ld a, [wPlayerDirection]
and %00001100 ; bits 2 and 3 contain direction
2016-03-27 09:47:28 -07:00
rrca
rrca
ld e, a
ld d, 0
ld hl, .Directions
add hl, de
; Can you walk in this direction?
2018-01-23 14:39:09 -08:00
ld a, [wTilePermissions]
2016-03-27 09:47:28 -07:00
and [hl]
jr nz, .quit
xor a
ret
.quit
scf
ret
.Directions:
2016-03-27 09:47:28 -07:00
db FACE_DOWN
db FACE_UP
db FACE_LEFT
db FACE_RIGHT
2018-06-24 07:09:41 -07:00
TrySurfOW::
2016-03-27 09:47:28 -07:00
; Checking a tile in the overworld.
; Return carry if fail is allowed.
; Don't ask to surf if already fail.
2018-01-23 14:39:09 -08:00
ld a, [wPlayerState]
2016-03-27 09:47:28 -07:00
cp PLAYER_SURF_PIKA
jr z, .quit
cp PLAYER_SURF
jr z, .quit
; Must be facing water.
ld a, [wFacingTileID]
2016-03-27 09:47:28 -07:00
call GetTileCollision
cp WATER_TILE
2016-03-27 09:47:28 -07:00
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
2018-01-22 10:57:44 -08:00
bit BIKEFLAGS_ALWAYS_ON_BIKE_F, [hl]
2016-03-27 09:47:28 -07:00
jr nz, .quit
call GetSurfType
2020-11-03 19:45:12 -08:00
ld [wSurfingPlayerState], a
call GetPartyNickname
2016-03-27 09:47:28 -07:00
ld a, BANK(AskSurfScript)
ld hl, AskSurfScript
call CallScript
scf
ret
.quit
xor a
ret
2018-06-24 07:09:41 -07:00
AskSurfScript:
2016-03-27 09:47:28 -07:00
opentext
writetext AskSurfText
yesorno
iftrue UsedSurfScript
closetext
end
2018-06-24 07:09:41 -07:00
AskSurfText:
text_far _AskSurfText
text_end
2016-03-27 09:47:28 -07:00
2018-06-24 07:09:41 -07:00
FlyFunction:
2016-03-27 09:47:28 -07:00
call FieldMoveJumptableReset
.loop
ld hl, .Jumptable
call FieldMoveJumptable
jr nc, .loop
and $7f
ld [wFieldMoveSucceeded], a
ret
.Jumptable:
2022-08-06 21:38:08 -07:00
dw .TryFly
dw .DoFly
dw .FailFly
2016-03-27 09:47:28 -07:00
2018-06-24 07:09:41 -07:00
.TryFly:
2016-03-27 09:47:28 -07:00
ld de, ENGINE_STORMBADGE
call CheckBadge
jr c, .nostormbadge
call GetMapEnvironment
2016-03-27 09:47:28 -07:00
call CheckOutdoorMap
jr z, .outdoors
jr .indoors
.outdoors
xor a
ldh [hMapAnims], a
call LoadStandardMenuHeader
2016-03-27 09:47:28 -07:00
call ClearSprites
2017-12-24 09:47:30 -08:00
farcall _FlyMap
2016-03-27 09:47:28 -07:00
ld a, e
cp -1
jr z, .illegal
cp NUM_SPAWNS
jr nc, .illegal
2018-01-23 14:39:09 -08:00
ld [wDefaultSpawnpoint], a
2016-03-27 09:47:28 -07:00
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
2018-06-24 07:09:41 -07:00
.DoFly:
2016-03-27 09:47:28 -07:00
ld hl, .FlyScript
call QueueScript
ld a, $81
ret
2018-06-24 07:09:41 -07:00
.FailFly:
2016-03-27 09:47:28 -07:00
call FieldMoveFailed
ld a, $82
ret
.FlyScript:
2016-03-27 09:47:28 -07:00
reloadmappart
callasm HideSprites
2018-01-02 09:49:25 -08:00
special UpdateTimePals
2016-03-27 09:47:28 -07:00
callasm FlyFromAnim
farscall Script_AbortBugContest
special WarpToSpawnPoint
callasm SkipUpdateMapSprites
loadvar VAR_MOVEMENT, PLAYER_NORMAL
2016-03-27 09:47:28 -07:00
newloadmap MAPSETUP_FLY
callasm FlyToAnim
special WaitSFX
callasm .ReturnFromFly
end
2018-06-24 07:09:41 -07:00
.ReturnFromFly:
2020-10-22 18:25:40 -07:00
farcall RespawnPlayer
2016-03-27 09:47:28 -07:00
call DelayFrame
call UpdatePlayerSprite
2016-03-27 09:47:28 -07:00
ret
2018-06-24 07:09:41 -07:00
WaterfallFunction:
2016-03-27 09:47:28 -07:00
call .TryWaterfall
and $7f
ld [wFieldMoveSucceeded], a
ret
2018-06-24 07:09:41 -07:00
.TryWaterfall:
2016-03-27 09:47:28 -07:00
ld de, ENGINE_RISINGBADGE
2017-12-24 09:47:30 -08:00
farcall CheckBadge
2016-03-27 09:47:28 -07:00
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
2018-06-24 07:09:41 -07:00
CheckMapCanWaterfall:
2018-01-23 14:39:09 -08:00
ld a, [wPlayerDirection]
2016-03-27 09:47:28 -07:00
and $c
cp FACE_UP
jr nz, .failed
2018-01-23 14:39:09 -08:00
ld a, [wTileUp]
2016-03-27 09:47:28 -07:00
call CheckWaterfallTile
jr nz, .failed
xor a
ret
.failed
scf
ret
Script_WaterfallFromMenu:
2016-03-27 09:47:28 -07:00
reloadmappart
2018-01-02 09:49:25 -08:00
special UpdateTimePals
2016-03-27 09:47:28 -07:00
Script_UsedWaterfall:
callasm GetPartyNickname
writetext .UseWaterfallText
2016-03-27 09:47:28 -07:00
waitbutton
closetext
playsound SFX_BUBBLEBEAM
.loop
applymovement PLAYER, .WaterfallStep
callasm .CheckContinueWaterfall
iffalse .loop
end
2018-06-24 07:09:41 -07:00
.CheckContinueWaterfall:
2016-03-27 09:47:28 -07:00
xor a
2023-09-30 10:12:57 -07:00
ldh [hScriptVar], a
ld a, [wPlayerTile]
2016-03-27 09:47:28 -07:00
call CheckWaterfallTile
ret z
ld a, $1
2023-09-30 10:12:57 -07:00
ldh [hScriptVar], a
2016-03-27 09:47:28 -07:00
ret
2018-06-24 07:09:41 -07:00
.WaterfallStep:
2016-05-14 10:46:14 -07:00
turn_waterfall UP
2016-03-27 09:47:28 -07:00
step_end
.UseWaterfallText:
text_far _UseWaterfallText
text_end
2016-03-27 09:47:28 -07:00
2018-06-24 07:09:41 -07:00
TryWaterfallOW::
2016-03-27 09:47:28 -07:00
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 .HugeWaterfallText
2016-03-27 09:47:28 -07:00
.HugeWaterfallText:
text_far _HugeWaterfallText
text_end
2016-03-27 09:47:28 -07:00
Script_AskWaterfall:
2016-03-27 09:47:28 -07:00
opentext
writetext .AskWaterfallText
2016-03-27 09:47:28 -07:00
yesorno
iftrue Script_UsedWaterfall
closetext
end
.AskWaterfallText:
text_far _AskWaterfallText
text_end
2016-03-27 09:47:28 -07:00
2018-06-24 07:09:41 -07:00
EscapeRopeFunction:
2016-03-27 09:47:28 -07:00
call FieldMoveJumptableReset
ld a, $1
jr EscapeRopeOrDig
2016-03-27 09:47:28 -07:00
2018-06-24 07:09:41 -07:00
DigFunction:
2016-03-27 09:47:28 -07:00
call FieldMoveJumptableReset
ld a, $2
EscapeRopeOrDig:
2020-11-03 19:45:12 -08:00
ld [wEscapeRopeOrDigType], a
2016-03-27 09:47:28 -07:00
.loop
ld hl, .DigTable
call FieldMoveJumptable
jr nc, .loop
and $7f
ld [wFieldMoveSucceeded], a
ret
2018-06-24 07:09:41 -07:00
.DigTable:
2016-03-27 09:47:28 -07:00
dw .CheckCanDig
dw .DoDig
dw .FailDig
2018-06-24 07:09:41 -07:00
.CheckCanDig:
call GetMapEnvironment
cp INDOOR_CAVE
2016-03-27 09:47:28 -07:00
jr z, .incave
cp INDOOR_ICE_CAVE
2016-03-27 09:47:28 -07:00
jr z, .incave
.fail
ld a, $2
ret
.incave
2017-12-09 16:41:03 -08:00
ld hl, wDigWarpNumber
2016-03-27 09:47:28 -07:00
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
2018-06-24 07:09:41 -07:00
.DoDig:
2017-12-09 16:41:03 -08:00
ld hl, wDigWarpNumber
2016-03-27 09:47:28 -07:00
ld de, wNextWarp
ld bc, 3
call CopyBytes
call GetPartyNickname
2020-11-03 19:45:12 -08:00
ld a, [wEscapeRopeOrDigType]
2016-03-27 09:47:28 -07:00
cp $2
jr nz, .escaperope
ld hl, .UsedDigScript
call QueueScript
ld a, $81
ret
.escaperope
2017-12-24 09:47:30 -08:00
farcall SpecialKabutoChamber
2016-03-27 09:47:28 -07:00
ld hl, .UsedEscapeRopeScript
call QueueScript
ld a, $81
ret
2018-06-24 07:09:41 -07:00
.FailDig:
2020-11-03 19:45:12 -08:00
ld a, [wEscapeRopeOrDigType]
2016-03-27 09:47:28 -07:00
cp $2
jr nz, .failescaperope
ld hl, .CantUseDigText
2019-04-08 05:15:10 -07:00
call MenuTextbox
2016-03-27 09:47:28 -07:00
call WaitPressAorB_BlinkCursor
call CloseWindow
.failescaperope
ld a, $80
ret
.UseDigText:
text_far _UseDigText
text_end
2016-03-27 09:47:28 -07:00
.UseEscapeRopeText:
text_far _UseEscapeRopeText
text_end
2016-03-27 09:47:28 -07:00
.CantUseDigText:
text_far _CantUseDigText
text_end
2016-03-27 09:47:28 -07:00
.UsedEscapeRopeScript:
2016-03-27 09:47:28 -07:00
reloadmappart
2018-01-02 09:49:25 -08:00
special UpdateTimePals
writetext .UseEscapeRopeText
sjump .UsedDigOrEscapeRopeScript
2016-03-27 09:47:28 -07:00
.UsedDigScript:
2016-03-27 09:47:28 -07:00
reloadmappart
2018-01-02 09:49:25 -08:00
special UpdateTimePals
writetext .UseDigText
2016-03-27 09:47:28 -07:00
.UsedDigOrEscapeRopeScript:
2016-03-27 09:47:28 -07:00
waitbutton
closetext
playsound SFX_WARP_TO
applymovement PLAYER, .DigOut
farscall Script_AbortBugContest
special WarpToSpawnPoint
loadvar VAR_MOVEMENT, PLAYER_NORMAL
2016-03-27 09:47:28 -07:00
newloadmap MAPSETUP_DOOR
playsound SFX_WARP_FROM
applymovement PLAYER, .DigReturn
end
.DigOut:
2016-03-27 09:47:28 -07:00
step_dig 32
hide_object
2016-03-27 09:47:28 -07:00
step_end
.DigReturn:
show_object
2016-03-27 09:47:28 -07:00
return_dig 32
step_end
2018-06-24 07:09:41 -07:00
TeleportFunction:
2016-03-27 09:47:28 -07:00
call FieldMoveJumptableReset
.loop
ld hl, .Jumptable
call FieldMoveJumptable
jr nc, .loop
and $7f
ld [wFieldMoveSucceeded], a
ret
2018-06-24 07:09:41 -07:00
.Jumptable:
2016-03-27 09:47:28 -07:00
dw .TryTeleport
dw .DoTeleport
dw .FailTeleport
2018-06-24 07:09:41 -07:00
.TryTeleport:
call GetMapEnvironment
2016-03-27 09:47:28 -07:00
call CheckOutdoorMap
jr z, .CheckIfSpawnPoint
jr .nope
.CheckIfSpawnPoint:
2016-03-27 09:47:28 -07:00
ld a, [wLastSpawnMapGroup]
ld d, a
ld a, [wLastSpawnMapNumber]
ld e, a
2017-12-24 09:47:30 -08:00
farcall IsSpawnPoint
2016-03-27 09:47:28 -07:00
jr nc, .nope
ld a, c
2018-01-23 14:39:09 -08:00
ld [wDefaultSpawnpoint], a
2016-03-27 09:47:28 -07:00
ld a, $1
ret
.nope
ld a, $2
ret
2018-06-24 07:09:41 -07:00
.DoTeleport:
call GetPartyNickname
2016-03-27 09:47:28 -07:00
ld hl, .TeleportScript
call QueueScript
ld a, $81
ret
2018-06-24 07:09:41 -07:00
.FailTeleport:
ld hl, .CantUseTeleportText
2019-04-08 05:15:10 -07:00
call MenuTextboxBackup
2016-03-27 09:47:28 -07:00
ld a, $80
ret
.TeleportReturnText:
text_far _TeleportReturnText
text_end
2016-03-27 09:47:28 -07:00
.CantUseTeleportText:
text_far _CantUseTeleportText
text_end
2016-03-27 09:47:28 -07:00
.TeleportScript:
2016-03-27 09:47:28 -07:00
reloadmappart
2018-01-02 09:49:25 -08:00
special UpdateTimePals
writetext .TeleportReturnText
2016-03-27 09:47:28 -07:00
pause 60
reloadmappart
closetext
playsound SFX_WARP_TO
applymovement PLAYER, .TeleportFrom
farscall Script_AbortBugContest
special WarpToSpawnPoint
loadvar VAR_MOVEMENT, PLAYER_NORMAL
2016-03-27 09:47:28 -07:00
newloadmap MAPSETUP_TELEPORT
playsound SFX_WARP_FROM
applymovement PLAYER, .TeleportTo
end
2018-06-24 07:09:41 -07:00
.TeleportFrom:
2016-03-27 09:47:28 -07:00
teleport_from
step_end
2018-06-24 07:09:41 -07:00
.TeleportTo:
2016-03-27 09:47:28 -07:00
teleport_to
step_end
2018-06-24 07:09:41 -07:00
StrengthFunction:
2016-03-27 09:47:28 -07:00
call .TryStrength
and $7f
ld [wFieldMoveSucceeded], a
ret
2018-06-24 07:09:41 -07:00
.TryStrength:
2016-03-27 09:47:28 -07:00
ld de, ENGINE_PLAINBADGE
call CheckBadge
jr c, .Failed
jr .UseStrength
.AlreadyUsingStrength: ; unreferenced
ld hl, .AlreadyUsingStrengthText
2019-04-08 05:15:10 -07:00
call MenuTextboxBackup
2016-03-27 09:47:28 -07:00
ld a, $80
ret
.AlreadyUsingStrengthText:
text_far _AlreadyUsingStrengthText
text_end
2016-03-27 09:47:28 -07:00
2018-06-24 07:09:41 -07:00
.Failed:
2016-03-27 09:47:28 -07:00
ld a, $80
ret
2018-06-24 07:09:41 -07:00
.UseStrength:
2016-03-27 09:47:28 -07:00
ld hl, Script_StrengthFromMenu
call QueueScript
ld a, $81
ret
2018-06-24 07:09:41 -07:00
SetStrengthFlag:
ld hl, wBikeFlags
2018-01-22 10:57:44 -08:00
set BIKEFLAGS_STRENGTH_ACTIVE_F, [hl]
2018-01-23 14:39:09 -08:00
ld a, [wCurPartyMon]
2016-03-27 09:47:28 -07:00
ld e, a
ld d, 0
2018-01-23 14:39:09 -08:00
ld hl, wPartySpecies
2016-03-27 09:47:28 -07:00
add hl, de
ld a, [hl]
2020-11-03 19:45:12 -08:00
ld [wStrengthSpecies], a
call GetPartyNickname
2016-03-27 09:47:28 -07:00
ret
Script_StrengthFromMenu:
2016-03-27 09:47:28 -07:00
reloadmappart
2018-01-02 09:49:25 -08:00
special UpdateTimePals
2016-03-27 09:47:28 -07:00
Script_UsedStrength:
2016-03-27 09:47:28 -07:00
callasm SetStrengthFlag
writetext .UseStrengthText
2020-11-03 19:45:12 -08:00
readmem wStrengthSpecies
cry 0 ; plays [wStrengthSpecies] cry
2016-03-27 09:47:28 -07:00
pause 3
writetext .MoveBoulderText
2016-03-27 09:47:28 -07:00
closetext
end
.UseStrengthText:
text_far _UseStrengthText
text_end
2016-03-27 09:47:28 -07:00
.MoveBoulderText:
text_far _MoveBoulderText
text_end
2016-03-27 09:47:28 -07:00
AskStrengthScript:
callasm TryStrengthOW
iffalse .AskStrength
2018-02-02 18:09:17 -08:00
ifequal $1, .DontMeetRequirements
sjump .AlreadyUsedStrength
2016-03-27 09:47:28 -07:00
.DontMeetRequirements:
jumptext BouldersMayMoveText
2016-03-27 09:47:28 -07:00
.AlreadyUsedStrength:
jumptext BouldersMoveText
2016-03-27 09:47:28 -07:00
.AskStrength:
2016-03-27 09:47:28 -07:00
opentext
writetext AskStrengthText
2016-03-27 09:47:28 -07:00
yesorno
iftrue Script_UsedStrength
closetext
end
AskStrengthText:
text_far _AskStrengthText
text_end
2016-03-27 09:47:28 -07:00
BouldersMoveText:
text_far _BouldersMoveText
text_end
2016-03-27 09:47:28 -07:00
BouldersMayMoveText:
text_far _BouldersMayMoveText
text_end
2016-03-27 09:47:28 -07:00
2018-06-24 07:09:41 -07:00
TryStrengthOW:
2016-03-27 09:47:28 -07:00
ld d, STRENGTH
call CheckPartyMove
jr c, .nope
ld de, ENGINE_PLAINBADGE
call CheckEngineFlag
jr c, .nope
ld hl, wBikeFlags
2018-01-22 10:57:44 -08:00
bit BIKEFLAGS_STRENGTH_ACTIVE_F, [hl]
2016-03-27 09:47:28 -07:00
jr z, .already_using
ld a, 2
jr .done
.nope
ld a, 1
jr .done
.already_using
xor a
jr .done
.done
2023-09-30 10:12:57 -07:00
ldh [hScriptVar], a
2016-03-27 09:47:28 -07:00
ret
2018-06-24 07:09:41 -07:00
WhirlpoolFunction:
2016-03-27 09:47:28 -07:00
call FieldMoveJumptableReset
.loop
2020-10-04 16:43:28 -07:00
ld hl, .Jumptable
2016-03-27 09:47:28 -07:00
call FieldMoveJumptable
jr nc, .loop
and $7f
ld [wFieldMoveSucceeded], a
ret
2020-10-04 16:43:28 -07:00
.Jumptable:
2016-03-27 09:47:28 -07:00
dw .TryWhirlpool
dw .DoWhirlpool
dw .FailWhirlpool
2018-06-24 07:09:41 -07:00
.TryWhirlpool:
2016-03-27 09:47:28 -07:00
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
2018-06-24 07:09:41 -07:00
.DoWhirlpool:
2016-03-27 09:47:28 -07:00
ld hl, Script_WhirlpoolFromMenu
call QueueScript
ld a, $81
ret
2018-06-24 07:09:41 -07:00
.FailWhirlpool:
2016-03-27 09:47:28 -07:00
call FieldMoveFailed
ld a, $80
ret
UseWhirlpoolText:
text_far _UseWhirlpoolText
text_end
2016-03-27 09:47:28 -07:00
2018-06-24 07:09:41 -07:00
TryWhirlpoolMenu:
2016-03-27 09:47:28 -07:00
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
2020-11-03 19:45:12 -08:00
; Save the Whirlpool field move data
2016-03-27 09:47:28 -07:00
ld a, l
2020-11-03 19:45:12 -08:00
ld [wCutWhirlpoolOverworldBlockAddr], a
2016-03-27 09:47:28 -07:00
ld a, h
2020-11-03 19:45:12 -08:00
ld [wCutWhirlpoolOverworldBlockAddr + 1], a
2016-03-27 09:47:28 -07:00
ld a, b
2020-11-03 19:45:12 -08:00
ld [wCutWhirlpoolReplacementBlock], a
2016-03-27 09:47:28 -07:00
ld a, c
2020-11-03 19:45:12 -08:00
ld [wCutWhirlpoolAnimationType], a
2016-03-27 09:47:28 -07:00
xor a
ret
.failed
scf
ret
Script_WhirlpoolFromMenu:
2016-03-27 09:47:28 -07:00
reloadmappart
2018-01-02 09:49:25 -08:00
special UpdateTimePals
2016-03-27 09:47:28 -07:00
Script_UsedWhirlpool:
callasm GetPartyNickname
writetext UseWhirlpoolText
2016-03-27 09:47:28 -07:00
reloadmappart
callasm DisappearWhirlpool
closetext
end
2018-06-24 07:09:41 -07:00
DisappearWhirlpool:
2020-11-03 19:45:12 -08:00
ld hl, wCutWhirlpoolOverworldBlockAddr
2016-03-27 09:47:28 -07:00
ld a, [hli]
ld h, [hl]
ld l, a
2020-11-03 19:45:12 -08:00
ld a, [wCutWhirlpoolReplacementBlock]
2016-03-27 09:47:28 -07:00
ld [hl], a
xor a
ldh [hBGMapMode], a
call LoadScreenTilemapAndAttrmapPals
2020-11-03 19:45:12 -08:00
ld a, [wCutWhirlpoolAnimationType]
2016-03-27 09:47:28 -07:00
ld e, a
2017-12-24 09:47:30 -08:00
farcall PlayWhirlpoolSound
2016-03-27 09:47:28 -07:00
call BufferScreen
call GetMovementPermissions
ret
2018-06-24 07:09:41 -07:00
TryWhirlpoolOW::
2016-03-27 09:47:28 -07:00
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 .MayPassWhirlpoolText
2016-03-27 09:47:28 -07:00
.MayPassWhirlpoolText:
text_far _MayPassWhirlpoolText
text_end
2016-03-27 09:47:28 -07:00
Script_AskWhirlpoolOW:
2016-03-27 09:47:28 -07:00
opentext
writetext AskWhirlpoolText
2016-03-27 09:47:28 -07:00
yesorno
iftrue Script_UsedWhirlpool
closetext
end
AskWhirlpoolText:
text_far _AskWhirlpoolText
text_end
2016-03-27 09:47:28 -07:00
2018-06-24 07:09:41 -07:00
HeadbuttFunction:
2016-03-27 09:47:28 -07:00
call TryHeadbuttFromMenu
and $7f
ld [wFieldMoveSucceeded], a
ret
2018-06-24 07:09:41 -07:00
TryHeadbuttFromMenu:
2016-03-27 09:47:28 -07:00
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
UseHeadbuttText:
text_far _UseHeadbuttText
text_end
2016-03-27 09:47:28 -07:00
HeadbuttNothingText:
text_far _HeadbuttNothingText
text_end
2016-03-27 09:47:28 -07:00
HeadbuttFromMenuScript:
2016-03-27 09:47:28 -07:00
reloadmappart
2018-01-02 09:49:25 -08:00
special UpdateTimePals
2016-03-27 09:47:28 -07:00
HeadbuttScript:
callasm GetPartyNickname
writetext UseHeadbuttText
2016-03-27 09:47:28 -07:00
reloadmappart
callasm ShakeHeadbuttTree
callasm TreeMonEncounter
iffalse .no_battle
closetext
randomwildmon
startbattle
reloadmapafterbattle
end
.no_battle
writetext HeadbuttNothingText
2016-03-27 09:47:28 -07:00
waitbutton
closetext
end
2018-06-24 07:09:41 -07:00
TryHeadbuttOW::
2016-03-27 09:47:28 -07:00
ld d, HEADBUTT
call CheckPartyMove
jr c, .no
ld a, BANK(AskHeadbuttScript)
ld hl, AskHeadbuttScript
call CallScript
scf
ret
.no
xor a
ret
AskHeadbuttScript:
2016-03-27 09:47:28 -07:00
opentext
writetext AskHeadbuttText
2016-03-27 09:47:28 -07:00
yesorno
iftrue HeadbuttScript
closetext
end
AskHeadbuttText:
text_far _AskHeadbuttText
text_end
2016-03-27 09:47:28 -07:00
2018-06-24 07:09:41 -07:00
RockSmashFunction:
2016-03-27 09:47:28 -07:00
call TryRockSmashFromMenu
and $7f
ld [wFieldMoveSucceeded], a
ret
2018-06-24 07:09:41 -07:00
TryRockSmashFromMenu:
2016-03-27 09:47:28 -07:00
call GetFacingObject
jr c, .no_rock
ld a, d
2021-12-22 18:38:26 -08:00
cp SPRITEMOVEDATA_SMASHABLE_ROCK
2016-03-27 09:47:28 -07:00
jr nz, .no_rock
ld hl, RockSmashFromMenuScript
call QueueScript
ld a, $81
ret
.no_rock
call FieldMoveFailed
ld a, $80
ret
2018-06-24 07:09:41 -07:00
GetFacingObject:
2017-12-24 09:47:30 -08:00
farcall CheckFacingObject
2016-03-27 09:47:28 -07:00
jr nc, .fail
ldh a, [hObjectStructIndex]
2016-03-27 09:47:28 -07:00
call GetObjectStruct
ld hl, OBJECT_MAP_OBJECT_INDEX
add hl, bc
ld a, [hl]
ldh [hLastTalked], a
2016-03-27 09:47:28 -07:00
call GetMapObject
ld hl, MAPOBJECT_MOVEMENT
add hl, bc
ld a, [hl]
ld d, a
and a
ret
.fail
scf
ret
RockSmashFromMenuScript:
2016-03-27 09:47:28 -07:00
reloadmappart
2018-01-02 09:49:25 -08:00
special UpdateTimePals
2016-03-27 09:47:28 -07:00
2018-06-24 07:09:41 -07:00
RockSmashScript:
callasm GetPartyNickname
writetext UseRockSmashText
2016-03-27 09:47:28 -07:00
closetext
special WaitSFX
playsound SFX_STRENGTH
earthquake 84
applymovementlasttalked MovementData_RockSmash
2023-12-28 10:53:34 -08:00
disappear LAST_TALKED
2016-03-27 09:47:28 -07:00
callasm RockMonEncounter
readmem wTempWildMonSpecies
2016-03-27 09:47:28 -07:00
iffalse .done
randomwildmon
startbattle
reloadmapafterbattle
.done
end
2023-12-28 10:53:34 -08:00
RockSmashAutoScript::
waitsfx
2023-12-28 10:53:34 -08:00
playsound SFX_STRENGTH
earthquake 84
applymovementlasttalked MovementData_RockSmash
disappear LAST_TALKED
special SetObjectToRemainHidden
end
MovementData_RockSmash:
2016-03-27 09:47:28 -07:00
rock_smash 10
step_end
UseRockSmashText:
text_far _UseRockSmashText
text_end
2016-03-27 09:47:28 -07:00
AskRockSmashScript:
2016-03-27 09:47:28 -07:00
callasm HasRockSmash
2018-02-02 18:09:17 -08:00
ifequal 1, .no
2016-03-27 09:47:28 -07:00
opentext
writetext AskRockSmashText
2016-03-27 09:47:28 -07:00
yesorno
iftrue RockSmashScript
closetext
end
.no
jumptext MaySmashText
2016-03-27 09:47:28 -07:00
MaySmashText:
text_far _MaySmashText
text_end
2016-03-27 09:47:28 -07:00
AskRockSmashText:
text_far _AskRockSmashText
text_end
2016-03-27 09:47:28 -07:00
2018-06-24 07:09:41 -07:00
HasRockSmash:
2016-03-27 09:47:28 -07:00
ld d, ROCK_SMASH
call CheckPartyMove
jr nc, .yes
; no
2016-03-27 09:47:28 -07:00
ld a, 1
jr .done
.yes
xor a
jr .done
.done
2023-09-30 10:12:57 -07:00
ldh [hScriptVar], a
2016-03-27 09:47:28 -07:00
ret
2018-06-24 07:09:41 -07:00
FishFunction:
2016-03-27 09:47:28 -07:00
ld a, e
push af
call FieldMoveJumptableReset
pop af
2020-11-03 19:45:12 -08:00
ld [wFishingRodUsed], a
2016-03-27 09:47:28 -07:00
.loop
ld hl, .FishTable
call FieldMoveJumptable
jr nc, .loop
and $7f
ld [wFieldMoveSucceeded], a
ret
2018-06-24 07:09:41 -07:00
.FishTable:
2016-03-27 09:47:28 -07:00
dw .TryFish
dw .FishNoBite
dw .FishGotSomething
dw .FailFish
dw .FishNoFish
2018-06-24 07:09:41 -07:00
.TryFish:
2022-08-31 16:13:10 -07:00
; BUG: You can fish on top of NPCs (see docs/bugs_and_glitches.md)
2018-01-23 14:39:09 -08:00
ld a, [wPlayerState]
2016-03-27 09:47:28 -07:00
cp PLAYER_SURF
jr z, .fail
cp PLAYER_SURF_PIKA
jr z, .fail
call GetFacingTileCoord
call GetTileCollision
cp WATER_TILE
2016-03-27 09:47:28 -07:00
jr z, .facingwater
.fail
ld a, $3
ret
.facingwater
call GetFishingGroup
and a
jr nz, .goodtofish
ld a, $4
ret
.goodtofish
ld d, a
2020-11-03 19:45:12 -08:00
ld a, [wFishingRodUsed]
2016-03-27 09:47:28 -07:00
ld e, a
2017-12-24 09:47:30 -08:00
farcall Fish
2016-03-27 09:47:28 -07:00
ld a, d
and a
jr z, .nonibble
2018-01-23 14:39:09 -08:00
ld [wTempWildMonSpecies], a
2016-03-27 09:47:28 -07:00
ld a, e
2018-01-23 14:39:09 -08:00
ld [wCurPartyLevel], a
2016-03-27 09:47:28 -07:00
ld a, BATTLETYPE_FISH
2018-01-23 14:39:09 -08:00
ld [wBattleType], a
2016-03-27 09:47:28 -07:00
ld a, $2
ret
.nonibble
ld a, $1
ret
2018-06-24 07:09:41 -07:00
.FailFish:
2016-03-27 09:47:28 -07:00
ld a, $80
ret
2018-06-24 07:09:41 -07:00
.FishGotSomething:
2016-03-27 09:47:28 -07:00
ld a, $1
2020-11-03 19:45:12 -08:00
ld [wFishingResult], a
2016-03-27 09:47:28 -07:00
ld hl, Script_GotABite
call QueueScript
ld a, $81
ret
2018-06-24 07:09:41 -07:00
.FishNoBite:
2016-03-27 09:47:28 -07:00
ld a, $2
2020-11-03 19:45:12 -08:00
ld [wFishingResult], a
2016-03-27 09:47:28 -07:00
ld hl, Script_NotEvenANibble
call QueueScript
ld a, $81
ret
2018-06-24 07:09:41 -07:00
.FishNoFish:
2016-03-27 09:47:28 -07:00
ld a, $0
2020-11-03 19:45:12 -08:00
ld [wFishingResult], a
2016-03-27 09:47:28 -07:00
ld hl, Script_NotEvenANibble2
call QueueScript
ld a, $81
ret
Script_NotEvenANibble:
2016-03-27 09:47:28 -07:00
scall Script_FishCastRod
writetext RodNothingText
sjump Script_NotEvenANibble_FallThrough
2016-03-27 09:47:28 -07:00
Script_NotEvenANibble2:
2016-03-27 09:47:28 -07:00
scall Script_FishCastRod
writetext RodNothingText
2016-03-27 09:47:28 -07:00
Script_NotEvenANibble_FallThrough:
2016-03-27 09:47:28 -07:00
loademote EMOTE_SHADOW
callasm PutTheRodAway
closetext
end
Script_GotABite:
2016-03-27 09:47:28 -07:00
scall Script_FishCastRod
callasm Fishing_CheckFacingUp
iffalse .NotFacingUp
applymovement PLAYER, .Movement_FacingUp
sjump .FightTheHookedPokemon
2016-03-27 09:47:28 -07:00
.NotFacingUp:
2016-03-27 09:47:28 -07:00
applymovement PLAYER, .Movement_NotFacingUp
.FightTheHookedPokemon:
2016-03-27 09:47:28 -07:00
pause 40
applymovement PLAYER, .Movement_RestoreRod
writetext RodBiteText
2016-03-27 09:47:28 -07:00
callasm PutTheRodAway
closetext
randomwildmon
startbattle
reloadmapafterbattle
end
2018-06-24 07:09:41 -07:00
.Movement_NotFacingUp:
2016-03-27 09:47:28 -07:00
fish_got_bite
fish_got_bite
fish_got_bite
fish_got_bite
show_emote
step_end
2018-06-24 07:09:41 -07:00
.Movement_FacingUp:
2016-03-27 09:47:28 -07:00
fish_got_bite
fish_got_bite
fish_got_bite
fish_got_bite
2016-05-14 09:28:00 -07:00
step_sleep 1
2016-03-27 09:47:28 -07:00
show_emote
step_end
2018-06-24 07:09:41 -07:00
.Movement_RestoreRod:
2016-03-27 09:47:28 -07:00
hide_emote
fish_cast_rod
step_end
2018-06-24 07:09:41 -07:00
Fishing_CheckFacingUp:
2018-01-23 14:39:09 -08:00
ld a, [wPlayerDirection]
2016-03-27 09:47:28 -07:00
and $c
cp OW_UP
ld a, $1
jr z, .up
xor a
.up
2023-09-30 10:12:57 -07:00
ldh [hScriptVar], a
2016-03-27 09:47:28 -07:00
ret
Script_FishCastRod:
2016-03-27 09:47:28 -07:00
reloadmappart
loadmem hBGMapMode, $0
2018-01-02 09:49:25 -08:00
special UpdateTimePals
2016-03-27 09:47:28 -07:00
loademote EMOTE_ROD
callasm LoadFishingGFX
loademote EMOTE_SHOCK
applymovement PLAYER, MovementData_CastRod
2016-03-27 09:47:28 -07:00
pause 40
end
MovementData_CastRod:
2016-03-27 09:47:28 -07:00
fish_cast_rod
step_end
2018-06-24 07:09:41 -07:00
PutTheRodAway:
2016-03-27 09:47:28 -07:00
xor a
ldh [hBGMapMode], a
2016-03-27 09:47:28 -07:00
ld a, $1
2018-01-23 14:39:09 -08:00
ld [wPlayerAction], a
2016-03-27 09:47:28 -07:00
call UpdateSprites
call UpdatePlayerSprite
2016-03-27 09:47:28 -07:00
ret
RodBiteText:
text_far _RodBiteText
text_end
2016-03-27 09:47:28 -07:00
RodNothingText:
text_far _RodNothingText
text_end
2016-03-27 09:47:28 -07:00
UnusedNothingHereText: ; unreferenced
text_far _UnusedNothingHereText
text_end
2016-03-27 09:47:28 -07:00
2018-06-24 07:09:41 -07:00
BikeFunction:
2016-03-27 09:47:28 -07:00
call .TryBike
and $7f
ld [wFieldMoveSucceeded], a
ret
2018-06-24 07:09:41 -07:00
.TryBike:
2016-03-27 09:47:28 -07:00
call .CheckEnvironment
jr c, .CannotUseBike
2018-01-23 14:39:09 -08:00
ld a, [wPlayerState]
2016-03-27 09:47:28 -07:00
cp PLAYER_NORMAL
jr z, .GetOnBike
cp PLAYER_BIKE
jr z, .GetOffBike
jr .CannotUseBike
.GetOnBike:
2016-03-27 09:47:28 -07:00
ld hl, Script_GetOnBike
ld de, Script_GetOnBike_Register
call .CheckIfRegistered
call QueueScript
xor a
2018-01-23 14:39:09 -08:00
ld [wMusicFade], a
2016-03-27 09:47:28 -07:00
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
2018-01-22 10:57:44 -08:00
bit BIKEFLAGS_ALWAYS_ON_BIKE_F, [hl]
2016-03-27 09:47:28 -07:00
jr nz, .CantGetOffBike
ld hl, Script_GetOffBike
ld de, Script_GetOffBike_Register
call .CheckIfRegistered
ld a, BANK(Script_GetOffBike)
jr .done
.CantGetOffBike:
2016-03-27 09:47:28 -07:00
ld hl, Script_CantGetOffBike
jr .done
.CannotUseBike:
2016-03-27 09:47:28 -07:00
ld a, $0
ret
.done
call QueueScript
ld a, $1
ret
2018-06-24 07:09:41 -07:00
.CheckIfRegistered:
2016-03-27 09:47:28 -07:00
ld a, [wUsingItemWithSelect]
and a
ret z
ld h, d
ld l, e
ret
2018-06-24 07:09:41 -07:00
.CheckEnvironment:
call GetMapEnvironment
cp INDOOR_BUILDING
jr z, .nope
2016-03-27 09:47:28 -07:00
.ok
call GetPlayerTile
and $f ; lo nybble only
jr nz, .nope ; not FLOOR_TILE
2016-03-27 09:47:28 -07:00
xor a
ret
.nope
scf
ret
Script_GetOnBike:
2016-03-27 09:47:28 -07:00
reloadmappart
2018-01-02 09:49:25 -08:00
special UpdateTimePals
loadvar VAR_MOVEMENT, PLAYER_BIKE
writetext GotOnBikeText
2016-03-27 09:47:28 -07:00
waitbutton
closetext
special UpdatePlayerSprite
2016-03-27 09:47:28 -07:00
end
Script_GetOnBike_Register:
loadvar VAR_MOVEMENT, PLAYER_BIKE
2016-03-27 09:47:28 -07:00
closetext
special UpdatePlayerSprite
2016-03-27 09:47:28 -07:00
end
Script_GetOffBike:
2016-03-27 09:47:28 -07:00
reloadmappart
2018-01-02 09:49:25 -08:00
special UpdateTimePals
loadvar VAR_MOVEMENT, PLAYER_NORMAL
writetext GotOffBikeText
2016-03-27 09:47:28 -07:00
waitbutton
FinishGettingOffBike:
closetext
special UpdatePlayerSprite
2016-03-27 09:47:28 -07:00
special PlayMapMusic
end
Script_GetOffBike_Register:
loadvar VAR_MOVEMENT, PLAYER_NORMAL
sjump FinishGettingOffBike
2016-03-27 09:47:28 -07:00
Script_CantGetOffBike:
2016-03-27 09:47:28 -07:00
writetext .CantGetOffBikeText
waitbutton
closetext
end
.CantGetOffBikeText:
text_far _CantGetOffBikeText
text_end
2016-03-27 09:47:28 -07:00
GotOnBikeText:
text_far _GotOnBikeText
text_end
2016-03-27 09:47:28 -07:00
GotOffBikeText:
text_far _GotOffBikeText
text_end
2016-03-27 09:47:28 -07:00
2018-06-24 07:09:41 -07:00
TryCutOW::
2016-03-27 09:47:28 -07:00
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:
2016-03-27 09:47:28 -07:00
opentext
writetext AskCutText
2016-03-27 09:47:28 -07:00
yesorno
iffalse .declined
2016-03-27 09:47:28 -07:00
callasm .CheckMap
iftrue Script_Cut
.declined
2016-03-27 09:47:28 -07:00
closetext
end
2018-06-24 07:09:41 -07:00
.CheckMap:
2016-03-27 09:47:28 -07:00
xor a
2023-09-30 10:12:57 -07:00
ldh [hScriptVar], a
2016-03-27 09:47:28 -07:00
call CheckMapForSomethingToCut
ret c
ld a, TRUE
2023-09-30 10:12:57 -07:00
ldh [hScriptVar], a
2016-03-27 09:47:28 -07:00
ret
AskCutText:
text_far _AskCutText
text_end
2016-03-27 09:47:28 -07:00
CantCutScript:
jumptext CanCutText
2016-03-27 09:47:28 -07:00
CanCutText:
text_far _CanCutText
text_end