mirror of
https://gitlab.com/xCrystal/pokecrystal-board.git
synced 2025-01-23 09:16:20 -08:00
31cce83e9b
(This is not expected to be their final location, but it makes them easier to relocate when necessary, and easier for users to edit until the whole project's file structure is finalized.)
651 lines
8.7 KiB
NASM
651 lines
8.7 KiB
NASM
; More overworld event handling.
|
|
|
|
|
|
WarpToSpawnPoint:: ; 97c28
|
|
ld hl, StatusFlags2
|
|
res 1, [hl] ; safari zone?
|
|
res 2, [hl] ; bug contest
|
|
ret
|
|
; 97c30
|
|
|
|
RunMemScript:: ; 97c30
|
|
; If there is no script here, we don't need to be here.
|
|
ld a, [wMapReentryScriptQueueFlag]
|
|
and a
|
|
ret z
|
|
; Execute the script at (wMapReentryScriptBank):(wMapReentryScriptAddress).
|
|
ld hl, wMapReentryScriptAddress
|
|
ld a, [hli]
|
|
ld h, [hl]
|
|
ld l, a
|
|
ld a, [wMapReentryScriptBank]
|
|
call CallScript
|
|
scf
|
|
; Clear the buffer for the next script.
|
|
push af
|
|
xor a
|
|
ld hl, wMapReentryScriptQueueFlag
|
|
ld bc, 8
|
|
call ByteFill
|
|
pop af
|
|
ret
|
|
; 97c4f
|
|
|
|
LoadScriptBDE:: ; 97c4f
|
|
; If there's already a script here, don't overwrite.
|
|
ld hl, wMapReentryScriptQueueFlag
|
|
ld a, [hl]
|
|
and a
|
|
ret nz
|
|
; Set the flag
|
|
ld [hl], 1
|
|
inc hl
|
|
; Load the script pointer b:de into (wMapReentryScriptBank):(wMapReentryScriptAddress)
|
|
ld [hl], b
|
|
inc hl
|
|
ld [hl], e
|
|
inc hl
|
|
ld [hl], d
|
|
scf
|
|
ret
|
|
; 97c5f
|
|
|
|
CheckFacingTileEvent:: ; 97c5f
|
|
call GetFacingTileCoord
|
|
ld [EngineBuffer1], a
|
|
ld c, a
|
|
callba CheckFacingTileForStd
|
|
jr c, .done
|
|
|
|
call CheckCutTreeTile
|
|
jr nz, .whirlpool
|
|
callba TryCutOW
|
|
jr .done
|
|
|
|
.whirlpool
|
|
ld a, [EngineBuffer1]
|
|
call CheckWhirlpoolTile
|
|
jr nz, .waterfall
|
|
callba TryWhirlpoolOW
|
|
jr .done
|
|
|
|
.waterfall
|
|
ld a, [EngineBuffer1]
|
|
call CheckWaterfallTile
|
|
jr nz, .headbutt
|
|
callba TryWaterfallOW
|
|
jr .done
|
|
|
|
.headbutt
|
|
ld a, [EngineBuffer1]
|
|
call CheckHeadbuttTreeTile
|
|
jr nz, .surf
|
|
callba TryHeadbuttOW
|
|
jr c, .done
|
|
jr .noevent
|
|
|
|
.surf
|
|
callba TrySurfOW
|
|
jr nc, .noevent
|
|
jr .done
|
|
|
|
.noevent
|
|
xor a
|
|
ret
|
|
|
|
.done
|
|
call PlayClickSFX
|
|
ld a, $ff
|
|
scf
|
|
ret
|
|
; 97cc0
|
|
|
|
|
|
RandomEncounter:: ; 97cc0
|
|
; Random encounter
|
|
|
|
call CheckWildEncounterCooldown
|
|
jr c, .nope
|
|
call CanUseSweetScent
|
|
jr nc, .nope
|
|
ld hl, StatusFlags2
|
|
bit 2, [hl] ; bug contest
|
|
jr nz, .bug_contest
|
|
callba TryWildEncounter
|
|
jr nz, .nope
|
|
jr .ok
|
|
|
|
.bug_contest
|
|
call _TryWildEncounter_BugContest
|
|
jr nc, .nope
|
|
jr .ok_bug_contest
|
|
|
|
.nope
|
|
ld a, 1
|
|
and a
|
|
ret
|
|
|
|
.ok
|
|
ld a, BANK(WildBattleScript)
|
|
ld hl, WildBattleScript
|
|
jr .done
|
|
|
|
.ok_bug_contest
|
|
ld a, BANK(BugCatchingContestBattleScript)
|
|
ld hl, BugCatchingContestBattleScript
|
|
jr .done
|
|
|
|
.done
|
|
call CallScript
|
|
scf
|
|
ret
|
|
; 97cf9
|
|
|
|
WildBattleScript: ; 97cf9
|
|
randomwildmon
|
|
startbattle
|
|
reloadmapafterbattle
|
|
end
|
|
; 97cfd
|
|
|
|
CanUseSweetScent:: ; 97cfd
|
|
ld hl, StatusFlags
|
|
bit 5, [hl]
|
|
jr nz, .no
|
|
ld a, [wPermission]
|
|
cp CAVE
|
|
jr z, .ice_check
|
|
cp DUNGEON
|
|
jr z, .ice_check
|
|
callba CheckGrassCollision
|
|
jr nc, .no
|
|
|
|
.ice_check
|
|
ld a, [PlayerStandingTile]
|
|
call CheckIceTile
|
|
jr z, .no
|
|
scf
|
|
ret
|
|
|
|
.no
|
|
and a
|
|
ret
|
|
; 97d23
|
|
|
|
_TryWildEncounter_BugContest: ; 97d23
|
|
call TryWildEncounter_BugContest
|
|
ret nc
|
|
call ChooseWildEncounter_BugContest
|
|
callba CheckRepelEffect
|
|
ret
|
|
; 97d31
|
|
|
|
ChooseWildEncounter_BugContest:: ; 97d31
|
|
; Pick a random mon out of ContestMons.
|
|
|
|
.loop
|
|
call Random
|
|
cp 100 << 1
|
|
jr nc, .loop
|
|
srl a
|
|
|
|
ld hl, ContestMons
|
|
ld de, 4
|
|
.CheckMon:
|
|
sub [hl]
|
|
jr c, .GotMon
|
|
add hl, de
|
|
jr .CheckMon
|
|
|
|
.GotMon:
|
|
inc hl
|
|
|
|
; Species
|
|
ld a, [hli]
|
|
ld [TempWildMonSpecies], a
|
|
|
|
; Min level
|
|
ld a, [hli]
|
|
ld d, a
|
|
|
|
; Max level
|
|
ld a, [hl]
|
|
|
|
sub d
|
|
jr nz, .RandomLevel
|
|
|
|
; If min and max are the same.
|
|
ld a, d
|
|
jr .GotLevel
|
|
|
|
.RandomLevel:
|
|
; Get a random level between the min and max.
|
|
ld c, a
|
|
inc c
|
|
call Random
|
|
ld a, [hRandomAdd]
|
|
call SimpleDivide
|
|
add d
|
|
|
|
.GotLevel:
|
|
ld [CurPartyLevel], a
|
|
|
|
xor a
|
|
ret
|
|
; 97d64
|
|
|
|
TryWildEncounter_BugContest: ; 97d64
|
|
ld a, [PlayerStandingTile]
|
|
call CheckSuperTallGrassTile
|
|
ld b, 40 percent
|
|
jr z, .ok
|
|
ld b, 20 percent
|
|
|
|
.ok
|
|
callba ApplyMusicEffectOnEncounterRate
|
|
callba ApplyCleanseTagEffectOnEncounterRate
|
|
call Random
|
|
ld a, [hRandomAdd]
|
|
cp b
|
|
ret c
|
|
ld a, 1
|
|
and a
|
|
ret
|
|
; 97d87
|
|
|
|
ContestMons: ; 97d87
|
|
INCLUDE "data/wild/bug_contest_mons.asm"
|
|
; 97db3
|
|
|
|
DoBikeStep:: ; 97db3
|
|
nop
|
|
nop
|
|
; If the bike shop owner doesn't have our number, or
|
|
; if we've already gotten the call, we don't have to
|
|
; be here.
|
|
ld hl, StatusFlags2
|
|
bit 4, [hl] ; bike shop call
|
|
jr z, .NoCall
|
|
|
|
; If we're not on the bike, we don't have to be here.
|
|
ld a, [PlayerState]
|
|
cp PLAYER_BIKE
|
|
jr nz, .NoCall
|
|
|
|
; If we're not in an area of phone service, we don't
|
|
; have to be here.
|
|
call GetMapHeaderPhoneServiceNybble
|
|
and a
|
|
jr nz, .NoCall
|
|
|
|
; Check the bike step count and check whether we've
|
|
; taken 65536 of them yet.
|
|
ld hl, wBikeStep
|
|
ld a, [hli]
|
|
ld d, a
|
|
ld e, [hl]
|
|
cp 255
|
|
jr nz, .increment
|
|
ld a, e
|
|
cp 255
|
|
jr z, .dont_increment
|
|
|
|
.increment
|
|
inc de
|
|
ld [hl], e
|
|
dec hl
|
|
ld [hl], d
|
|
|
|
.dont_increment
|
|
; If we've taken at least 1024 steps, have the bike
|
|
; shop owner try to call us.
|
|
ld a, d
|
|
cp 1024 >> 8
|
|
jr c, .NoCall
|
|
|
|
; If a call has already been queued, don't overwrite
|
|
; that call.
|
|
ld a, [wSpecialPhoneCallID]
|
|
and a
|
|
jr nz, .NoCall
|
|
|
|
; Queue the call.
|
|
ld a, SPECIALCALL_BIKESHOP
|
|
ld [wSpecialPhoneCallID], a
|
|
xor a
|
|
ld [wSpecialPhoneCallID + 1], a
|
|
ld hl, StatusFlags2
|
|
res 4, [hl] ; bike shop call
|
|
scf
|
|
ret
|
|
|
|
.NoCall:
|
|
xor a
|
|
ret
|
|
; 97df9
|
|
|
|
ClearCmdQueue:: ; 97df9
|
|
ld hl, wCmdQueue
|
|
ld de, 6
|
|
ld c, 4
|
|
xor a
|
|
.loop
|
|
ld [hl], a
|
|
add hl, de
|
|
dec c
|
|
jr nz, .loop
|
|
ret
|
|
; 97e08
|
|
|
|
HandleCmdQueue:: ; 97e08
|
|
ld hl, wCmdQueue
|
|
xor a
|
|
.loop
|
|
ld [hMapObjectIndexBuffer], a
|
|
ld a, [hl]
|
|
and a
|
|
jr z, .skip
|
|
push hl
|
|
ld b, h
|
|
ld c, l
|
|
call HandleQueuedCommand
|
|
pop hl
|
|
|
|
.skip
|
|
ld de, CMDQUEUE_ENTRY_SIZE
|
|
add hl, de
|
|
ld a, [hMapObjectIndexBuffer]
|
|
inc a
|
|
cp CMDQUEUE_CAPACITY
|
|
jr nz, .loop
|
|
ret
|
|
; 97e25
|
|
|
|
GetNthCmdQueueEntry: ; 97e25 unreferenced
|
|
ld hl, wCmdQueue
|
|
ld bc, CMDQUEUE_ENTRY_SIZE
|
|
call AddNTimes
|
|
ld b, h
|
|
ld c, l
|
|
ret
|
|
; 97e31
|
|
|
|
WriteCmdQueue:: ; 97e31
|
|
push bc
|
|
push de
|
|
call .GetNextEmptyEntry
|
|
ld d, h
|
|
ld e, l
|
|
pop hl
|
|
pop bc
|
|
ret c
|
|
ld a, b
|
|
ld bc, CMDQUEUE_ENTRY_SIZE - 1
|
|
call FarCopyBytes
|
|
xor a
|
|
ld [hl], a
|
|
ret
|
|
; 97e45
|
|
|
|
.GetNextEmptyEntry: ; 97e45
|
|
ld hl, wCmdQueue
|
|
ld de, CMDQUEUE_ENTRY_SIZE
|
|
ld c, CMDQUEUE_CAPACITY
|
|
.loop
|
|
ld a, [hl]
|
|
and a
|
|
jr z, .done
|
|
add hl, de
|
|
dec c
|
|
jr nz, .loop
|
|
scf
|
|
ret
|
|
|
|
.done
|
|
ld a, CMDQUEUE_CAPACITY
|
|
sub c
|
|
and a
|
|
ret
|
|
; 97e5c
|
|
|
|
DelCmdQueue:: ; 97e5c
|
|
ld hl, wCmdQueue
|
|
ld de, CMDQUEUE_ENTRY_SIZE
|
|
ld c, CMDQUEUE_CAPACITY
|
|
.loop
|
|
ld a, [hl]
|
|
cp b
|
|
jr z, .done
|
|
add hl, de
|
|
dec c
|
|
jr nz, .loop
|
|
and a
|
|
ret
|
|
|
|
.done
|
|
xor a
|
|
ld [hl], a
|
|
scf
|
|
ret
|
|
; 97e72
|
|
|
|
_DelCmdQueue: ; 97e72
|
|
ld hl, CMDQUEUE_TYPE
|
|
add hl, bc
|
|
ld [hl], 0
|
|
ret
|
|
; 97e79
|
|
|
|
HandleQueuedCommand: ; 97e79
|
|
ld hl, CMDQUEUE_TYPE
|
|
add hl, bc
|
|
ld a, [hl]
|
|
cp 5
|
|
jr c, .okay
|
|
xor a
|
|
|
|
.okay
|
|
ld e, a
|
|
ld d, 0
|
|
ld hl, .Jumptable
|
|
add hl, de
|
|
add hl, de
|
|
add hl, de
|
|
ld a, [hli]
|
|
push af
|
|
ld a, [hli]
|
|
ld h, [hl]
|
|
ld l, a
|
|
pop af
|
|
rst FarCall
|
|
ret
|
|
; 97e94
|
|
|
|
.Jumptable: ; 97e94
|
|
dba CmdQueue_Null
|
|
dba CmdQueue_Null2
|
|
dba CmdQueue_StoneTable
|
|
dba CmdQueue_Type3
|
|
dba CmdQueue_Type4
|
|
; 97ea3
|
|
|
|
CmdQueueAnonymousJumptable: ; 97ea3
|
|
ld hl, CMDQUEUE_05
|
|
add hl, bc
|
|
ld a, [hl]
|
|
pop hl
|
|
rst JumpTable
|
|
ret
|
|
; 97eab
|
|
|
|
CmdQueueAnonJT_Increment: ; 97eab
|
|
ld hl, CMDQUEUE_05
|
|
add hl, bc
|
|
inc [hl]
|
|
ret
|
|
; 97eb1
|
|
|
|
CmdQueueAnonJT_Decrement: ; 97eb1
|
|
ld hl, CMDQUEUE_05
|
|
add hl, bc
|
|
dec [hl]
|
|
ret
|
|
; 97eb7
|
|
|
|
CmdQueue_Null: ; 97eb7
|
|
ret
|
|
; 97eb8
|
|
|
|
CmdQueue_Null2: ; 97eb8
|
|
call ret_2f3e
|
|
ret
|
|
; 97ebc
|
|
|
|
CmdQueue_Type4: ; 97ebc
|
|
call CmdQueueAnonymousJumptable
|
|
; anonymous dw
|
|
dw .zero
|
|
dw .one
|
|
; 97ec3
|
|
|
|
.zero ; 97ec3
|
|
ld a, [hSCY]
|
|
ld hl, 4
|
|
add hl, bc
|
|
ld [hl], a
|
|
call CmdQueueAnonJT_Increment
|
|
.one ; 97ecd
|
|
ld hl, 1
|
|
add hl, bc
|
|
ld a, [hl]
|
|
dec a
|
|
ld [hl], a
|
|
jr z, .finish
|
|
and $1
|
|
jr z, .add
|
|
ld hl, 2
|
|
add hl, bc
|
|
ld a, [hSCY]
|
|
sub [hl]
|
|
ld [hSCY], a
|
|
ret
|
|
|
|
.add
|
|
ld hl, 2
|
|
add hl, bc
|
|
ld a, [hSCY]
|
|
add [hl]
|
|
ld [hSCY], a
|
|
ret
|
|
|
|
.finish
|
|
ld hl, 4
|
|
add hl, bc
|
|
ld a, [hl]
|
|
ld [hSCY], a
|
|
call _DelCmdQueue
|
|
ret
|
|
; 97ef9
|
|
|
|
CmdQueue_Type3: ; 97ef9
|
|
call CmdQueueAnonymousJumptable
|
|
; anonymous dw
|
|
dw .zero
|
|
dw .one
|
|
dw .two
|
|
; 97f02
|
|
|
|
.zero ; 97f02
|
|
call .IsPlayerFacingDown
|
|
jr z, .PlayerNotFacingDown
|
|
call CmdQueueAnonJT_Increment
|
|
.one ; 97f0a
|
|
call .IsPlayerFacingDown
|
|
jr z, .PlayerNotFacingDown
|
|
call CmdQueueAnonJT_Increment
|
|
|
|
ld hl, 2
|
|
add hl, bc
|
|
ld a, [hl]
|
|
ld [wd173], a
|
|
ret
|
|
; 97f1b
|
|
|
|
.two ; 97f1b
|
|
call .IsPlayerFacingDown
|
|
jr z, .PlayerNotFacingDown
|
|
call CmdQueueAnonJT_Decrement
|
|
|
|
ld hl, 3
|
|
add hl, bc
|
|
ld a, [hl]
|
|
ld [wd173], a
|
|
ret
|
|
; 97f2c
|
|
|
|
.PlayerNotFacingDown: ; 97f2c
|
|
ld a, $7f
|
|
ld [wd173], a
|
|
ld hl, 5
|
|
add hl, bc
|
|
ld [hl], 0
|
|
ret
|
|
; 97f38
|
|
|
|
.IsPlayerFacingDown: ; 97f38
|
|
push bc
|
|
ld bc, PlayerStruct
|
|
call GetSpriteDirection
|
|
and a
|
|
pop bc
|
|
ret
|
|
; 97f42
|
|
|
|
CmdQueue_StoneTable: ; 97f42
|
|
ld de, PlayerStruct
|
|
ld a, NUM_OBJECT_STRUCTS
|
|
.loop
|
|
push af
|
|
|
|
ld hl, OBJECT_SPRITE
|
|
add hl, de
|
|
ld a, [hl]
|
|
and a
|
|
jr z, .next
|
|
|
|
ld hl, OBJECT_MOVEMENTTYPE
|
|
add hl, de
|
|
ld a, [hl]
|
|
cp SPRITEMOVEDATA_STRENGTH_BOULDER
|
|
jr nz, .next
|
|
|
|
ld hl, OBJECT_NEXT_TILE
|
|
add hl, de
|
|
ld a, [hl]
|
|
call CheckPitTile
|
|
jr nz, .next
|
|
|
|
ld hl, OBJECT_DIRECTION_WALKING
|
|
add hl, de
|
|
ld a, [hl]
|
|
cp STANDING
|
|
jr nz, .next
|
|
call HandleStoneQueue
|
|
jr c, .fall_down_hole
|
|
|
|
.next
|
|
ld hl, OBJECT_STRUCT_LENGTH
|
|
add hl, de
|
|
ld d, h
|
|
ld e, l
|
|
|
|
pop af
|
|
dec a
|
|
jr nz, .loop
|
|
ret
|
|
|
|
.fall_down_hole
|
|
pop af
|
|
ret
|
|
; 97f7e
|