pokecrystal-board/engine/events_2.asm

662 lines
9.0 KiB
NASM
Raw Normal View History

2013-11-22 23:33:53 -08:00
; More overworld event handling.
WarpToSpawnPoint:: ; 97c28
2013-11-22 23:33:53 -08:00
ld hl, StatusFlags2
res 1, [hl] ; safari zone?
2015-11-12 21:49:27 -08:00
res 2, [hl] ; bug contest
2013-11-22 23:33:53 -08:00
ret
; 97c30
2015-10-24 07:34:19 -07:00
RunMemScript:: ; 97c30
; If there is no script here, we don't need to be here.
ld a, [wMapReentryScriptQueueFlag]
2013-11-22 23:33:53 -08:00
and a
ret z
2015-10-24 07:34:19 -07:00
; Execute the script at (wMapReentryScriptBank):(wMapReentryScriptAddress).
ld hl, wMapReentryScriptAddress
2013-11-22 23:33:53 -08:00
ld a, [hli]
ld h, [hl]
ld l, a
2015-10-24 07:34:19 -07:00
ld a, [wMapReentryScriptBank]
2013-11-22 23:33:53 -08:00
call CallScript
scf
2015-10-24 07:34:19 -07:00
; Clear the buffer for the next script.
2013-11-22 23:33:53 -08:00
push af
xor a
2015-10-24 07:34:19 -07:00
ld hl, wMapReentryScriptQueueFlag
2013-11-22 23:33:53 -08:00
ld bc, 8
call ByteFill
pop af
ret
; 97c4f
2015-10-24 07:34:19 -07:00
LoadScriptBDE:: ; 97c4f
; If there's already a script here, don't overwrite.
ld hl, wMapReentryScriptQueueFlag
2013-11-22 23:33:53 -08:00
ld a, [hl]
and a
ret nz
2015-10-24 07:34:19 -07:00
; Set the flag
2013-11-22 23:33:53 -08:00
ld [hl], 1
inc hl
2015-10-24 07:34:19 -07:00
; Load the script pointer b:de into (wMapReentryScriptBank):(wMapReentryScriptAddress)
2013-11-22 23:33:53 -08:00
ld [hl], b
inc hl
ld [hl], e
inc hl
ld [hl], d
scf
ret
; 97c5f
2015-10-01 13:55:24 -07:00
CheckFacingTileEvent:: ; 97c5f
2013-11-22 23:33:53 -08:00
call GetFacingTileCoord
ld [EngineBuffer1], a
ld c, a
callba CheckFacingTileForStd
jr c, .done
2013-11-22 23:33:53 -08:00
call CheckCutTreeTile
jr nz, .whirlpool
callba TryCutOW
jr .done
2013-11-22 23:33:53 -08:00
.whirlpool
ld a, [EngineBuffer1]
call CheckWhirlpoolTile
jr nz, .waterfall
callba TryWhirlpoolOW
jr .done
2013-11-22 23:33:53 -08:00
.waterfall
ld a, [EngineBuffer1]
call CheckWaterfallTile
jr nz, .headbutt
callba TryWaterfallOW
jr .done
2013-11-22 23:33:53 -08:00
.headbutt
ld a, [EngineBuffer1]
call CheckHeadbuttTreeTile
jr nz, .surf
callba TryHeadbuttOW
jr c, .done
jr .noevent
2013-11-22 23:33:53 -08:00
.surf
callba TrySurfOW
jr nc, .noevent
jr .done
2013-11-22 23:33:53 -08:00
.noevent
2013-11-22 23:33:53 -08:00
xor a
ret
.done
2013-11-22 23:33:53 -08:00
call PlayClickSFX
ld a, $ff
scf
ret
; 97cc0
RandomEncounter:: ; 97cc0
; Random encounter
2013-11-22 23:33:53 -08:00
call CheckWildEncounterCooldown
2015-10-01 13:55:24 -07:00
jr c, .nope
call CanUseSweetScent
jr nc, .nope
2013-11-22 23:33:53 -08:00
ld hl, StatusFlags2
bit 2, [hl] ; bug contest
2015-10-01 13:55:24 -07:00
jr nz, .bug_contest
callba TryWildEncounter
2015-10-01 13:55:24 -07:00
jr nz, .nope
jr .ok
2013-11-22 23:33:53 -08:00
2015-10-01 13:55:24 -07:00
.bug_contest
call _TryWildEncounter_BugContest
jr nc, .nope
jr .ok_bug_contest
2013-11-22 23:33:53 -08:00
2015-10-01 13:55:24 -07:00
.nope
2013-11-22 23:33:53 -08:00
ld a, 1
and a
ret
2015-10-01 13:55:24 -07:00
.ok
ld a, BANK(WildBattleScript)
ld hl, WildBattleScript
2015-10-01 13:55:24 -07:00
jr .done
2013-11-22 23:33:53 -08:00
2015-10-01 13:55:24 -07:00
.ok_bug_contest
ld a, BANK(BugCatchingContestBattleScript)
ld hl, BugCatchingContestBattleScript
2015-10-01 13:55:24 -07:00
jr .done
2013-11-22 23:33:53 -08:00
2015-10-01 13:55:24 -07:00
.done
2013-11-22 23:33:53 -08:00
call CallScript
scf
ret
; 97cf9
WildBattleScript: ; 97cf9
randomwildmon
2013-11-22 23:33:53 -08:00
startbattle
reloadmapafterbattle
2013-11-22 23:33:53 -08:00
end
; 97cfd
2015-10-01 13:55:24 -07:00
CanUseSweetScent:: ; 97cfd
2013-11-22 23:33:53 -08:00
ld hl, StatusFlags
bit 5, [hl]
2015-10-01 13:55:24 -07:00
jr nz, .no
ld a, [wPermission]
cp CAVE
2015-10-01 13:55:24 -07:00
jr z, .ice_check
cp DUNGEON
2015-10-01 13:55:24 -07:00
jr z, .ice_check
callba CheckGrassCollision
2015-10-01 13:55:24 -07:00
jr nc, .no
2013-11-22 23:33:53 -08:00
2015-10-01 13:55:24 -07:00
.ice_check
ld a, [PlayerStandingTile]
2013-11-22 23:33:53 -08:00
call CheckIceTile
2015-10-01 13:55:24 -07:00
jr z, .no
2013-11-22 23:33:53 -08:00
scf
ret
2015-10-01 13:55:24 -07:00
.no
2013-11-22 23:33:53 -08:00
and a
ret
; 97d23
2015-10-01 13:55:24 -07:00
_TryWildEncounter_BugContest: ; 97d23
call TryWildEncounter_BugContest
2013-11-22 23:33:53 -08:00
ret nc
2015-10-01 13:55:24 -07:00
call ChooseWildEncounter_BugContest
callba CheckRepelEffect
2013-11-22 23:33:53 -08:00
ret
; 97d31
2015-10-01 13:55:24 -07:00
ChooseWildEncounter_BugContest:: ; 97d31
2013-11-22 23:33:53 -08:00
; Pick a random mon out of ContestMons.
2015-10-01 13:55:24 -07:00
.loop
2013-11-22 23:33:53 -08:00
call Random
cp 100 << 1
2015-10-01 13:55:24 -07:00
jr nc, .loop
2013-11-22 23:33:53 -08:00
srl a
ld hl, ContestMons
ld de, 4
.CheckMon:
2013-11-22 23:33:53 -08:00
sub [hl]
jr c, .GotMon
add hl, de
jr .CheckMon
.GotMon:
2013-11-22 23:33:53 -08:00
inc hl
; Species
ld a, [hli]
ld [TempWildMonSpecies], a
2013-11-22 23:33:53 -08:00
; 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:
2013-11-22 23:33:53 -08:00
; Get a random level between the min and max.
ld c, a
inc c
call Random
ld a, [hRandomAdd]
call SimpleDivide
add d
.GotLevel:
2013-11-22 23:33:53 -08:00
ld [CurPartyLevel], a
xor a
ret
; 97d64
TryWildEncounter_BugContest: ; 97d64
ld a, [PlayerStandingTile]
call CheckSuperTallGrassTile
ld b, 40 percent
2015-10-01 13:55:24 -07:00
jr z, .ok
ld b, 20 percent
2013-11-22 23:33:53 -08:00
2015-10-01 13:55:24 -07:00
.ok
callba ApplyMusicEffectOnEncounterRate
callba ApplyCleanseTagEffectOnEncounterRate
2013-11-22 23:33:53 -08:00
call Random
ld a, [hRandomAdd]
cp b
ret c
ld a, 1
and a
ret
; 97d87
ContestMons: ; 97d87
; %, species, min, max
db 20, CATERPIE, 7, 18
db 20, WEEDLE, 7, 18
db 10, METAPOD, 9, 18
db 10, KAKUNA, 9, 18
db 5, BUTTERFREE, 12, 15
db 5, BEEDRILL, 12, 15
db 10, VENONAT, 10, 16
db 10, PARAS, 10, 17
db 5, SCYTHER, 13, 14
db 5, PINSIR, 13, 14
db -1, VENOMOTH, 30, 40
; 97db3
2015-10-24 07:34:19 -07:00
DoBikeStep:: ; 97db3
2013-11-22 23:33:53 -08:00
nop
nop
2015-10-24 07:34:19 -07:00
; 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.
2013-11-22 23:33:53 -08:00
ld hl, StatusFlags2
2015-11-22 09:01:58 -08:00
bit 4, [hl] ; bike shop call
jr z, .NoCall
2015-10-24 07:34:19 -07:00
; If we're not on the bike, we don't have to be here.
2013-11-22 23:33:53 -08:00
ld a, [PlayerState]
2015-10-24 07:34:19 -07:00
cp PLAYER_BIKE
jr nz, .NoCall
2015-10-24 07:34:19 -07:00
; If we're not in an area of phone service, we don't
; have to be here.
call GetMapHeaderPhoneServiceNybble
2013-11-22 23:33:53 -08:00
and a
jr nz, .NoCall
2015-10-24 07:34:19 -07:00
; Check the bike step count and check whether we've
; taken 65536 of them yet.
ld hl, wBikeStep
2013-11-22 23:33:53 -08:00
ld a, [hli]
ld d, a
ld e, [hl]
2015-10-24 07:34:19 -07:00
cp 255
jr nz, .increment
2013-11-22 23:33:53 -08:00
ld a, e
2015-10-24 07:34:19 -07:00
cp 255
jr z, .dont_increment
2013-11-22 23:33:53 -08:00
2015-10-24 07:34:19 -07:00
.increment
2013-11-22 23:33:53 -08:00
inc de
ld [hl], e
dec hl
ld [hl], d
2015-10-24 07:34:19 -07:00
.dont_increment
; If we've taken at least 1024 steps, have the bike
; shop owner try to call us.
2013-11-22 23:33:53 -08:00
ld a, d
2015-10-24 07:34:19 -07:00
cp 1024 >> 8
jr c, .NoCall
2015-10-24 07:34:19 -07:00
; If a call has already been queued, don't overwrite
; that call.
ld a, [wSpecialPhoneCallID]
2013-11-22 23:33:53 -08:00
and a
jr nz, .NoCall
2015-10-24 07:34:19 -07:00
; Queue the call.
ld a, SPECIALCALL_BIKESHOP
ld [wSpecialPhoneCallID], a
2013-11-22 23:33:53 -08:00
xor a
ld [wSpecialPhoneCallID + 1], a
2013-11-22 23:33:53 -08:00
ld hl, StatusFlags2
2015-11-22 09:01:58 -08:00
res 4, [hl] ; bike shop call
2013-11-22 23:33:53 -08:00
scf
ret
.NoCall:
2013-11-22 23:33:53 -08:00
xor a
ret
; 97df9
2015-11-18 20:16:25 -08:00
ClearCmdQueue:: ; 97df9
ld hl, wCmdQueue
ld de, 6
ld c, 4
2013-11-22 23:33:53 -08:00
xor a
.loop
2013-11-22 23:33:53 -08:00
ld [hl], a
add hl, de
dec c
jr nz, .loop
2013-11-22 23:33:53 -08:00
ret
; 97e08
2015-11-18 20:16:25 -08:00
HandleCmdQueue:: ; 97e08
ld hl, wCmdQueue
2013-11-22 23:33:53 -08:00
xor a
2015-11-02 09:54:27 -08:00
.loop
2015-11-02 08:15:32 -08:00
ld [hMapObjectIndexBuffer], a
2013-11-22 23:33:53 -08:00
ld a, [hl]
and a
2015-11-02 09:54:27 -08:00
jr z, .skip
2013-11-22 23:33:53 -08:00
push hl
ld b, h
ld c, l
2015-11-18 20:16:25 -08:00
call HandleQueuedCommand
2013-11-22 23:33:53 -08:00
pop hl
2015-11-02 09:54:27 -08:00
.skip
2015-11-18 20:16:25 -08:00
ld de, CMDQUEUE_ENTRY_SIZE
2013-11-22 23:33:53 -08:00
add hl, de
2015-11-02 08:15:32 -08:00
ld a, [hMapObjectIndexBuffer]
2013-11-22 23:33:53 -08:00
inc a
2015-11-18 20:16:25 -08:00
cp CMDQUEUE_CAPACITY
2015-11-02 09:54:27 -08:00
jr nz, .loop
2013-11-22 23:33:53 -08:00
ret
; 97e25
2015-11-18 20:16:25 -08:00
GetNthCmdQueueEntry: ; 97e25 unreferenced
ld hl, wCmdQueue
ld bc, CMDQUEUE_ENTRY_SIZE
2013-11-22 23:33:53 -08:00
call AddNTimes
ld b, h
ld c, l
ret
; 97e31
2015-11-18 20:16:25 -08:00
WriteCmdQueue:: ; 97e31
2013-11-22 23:33:53 -08:00
push bc
push de
2015-11-18 20:16:25 -08:00
call .GetNextEmptyEntry
2013-11-22 23:33:53 -08:00
ld d, h
ld e, l
pop hl
pop bc
ret c
ld a, b
2015-11-18 20:16:25 -08:00
ld bc, CMDQUEUE_ENTRY_SIZE - 1
2013-11-22 23:33:53 -08:00
call FarCopyBytes
xor a
ld [hl], a
ret
; 97e45
2015-11-18 20:16:25 -08:00
.GetNextEmptyEntry: ; 97e45
ld hl, wCmdQueue
ld de, CMDQUEUE_ENTRY_SIZE
ld c, CMDQUEUE_CAPACITY
.loop
2013-11-22 23:33:53 -08:00
ld a, [hl]
and a
2015-11-18 20:16:25 -08:00
jr z, .done
2013-11-22 23:33:53 -08:00
add hl, de
dec c
2015-11-18 20:16:25 -08:00
jr nz, .loop
2013-11-22 23:33:53 -08:00
scf
ret
2015-11-18 20:16:25 -08:00
.done
ld a, CMDQUEUE_CAPACITY
2013-11-22 23:33:53 -08:00
sub c
and a
ret
; 97e5c
2015-11-18 20:16:25 -08:00
DelCmdQueue:: ; 97e5c
ld hl, wCmdQueue
ld de, CMDQUEUE_ENTRY_SIZE
ld c, CMDQUEUE_CAPACITY
.loop
2013-11-22 23:33:53 -08:00
ld a, [hl]
cp b
2015-11-18 20:16:25 -08:00
jr z, .done
2013-11-22 23:33:53 -08:00
add hl, de
dec c
2015-11-18 20:16:25 -08:00
jr nz, .loop
2013-11-22 23:33:53 -08:00
and a
ret
2015-11-18 20:16:25 -08:00
.done
2013-11-22 23:33:53 -08:00
xor a
ld [hl], a
scf
ret
; 97e72
2015-11-18 20:16:25 -08:00
_DelCmdQueue: ; 97e72
ld hl, CMDQUEUE_TYPE
2013-11-22 23:33:53 -08:00
add hl, bc
ld [hl], 0
ret
; 97e79
2015-11-18 20:16:25 -08:00
HandleQueuedCommand: ; 97e79
ld hl, CMDQUEUE_TYPE
2013-11-22 23:33:53 -08:00
add hl, bc
ld a, [hl]
cp 5
2015-11-18 20:16:25 -08:00
jr c, .okay
2013-11-22 23:33:53 -08:00
xor a
2015-11-18 20:16:25 -08:00
.okay
2013-11-22 23:33:53 -08:00
ld e, a
ld d, 0
ld hl, .Jumptable
2013-11-22 23:33:53 -08:00
add hl, de
add hl, de
add hl, de
2013-11-22 23:33:53 -08:00
ld a, [hli]
push af
ld a, [hli]
ld h, [hl]
ld l, a
pop af
rst FarCall
ret
; 97e94
.Jumptable: ; 97e94
2015-11-18 20:16:25 -08:00
dba CmdQueue_Null
dba CmdQueue_Null2
dba CmdQueue_StoneTable
dba CmdQueue_Type3
dba CmdQueue_Type4
2013-11-22 23:33:53 -08:00
; 97ea3
2015-11-18 20:16:25 -08:00
CmdQueueAnonymousJumptable: ; 97ea3
ld hl, CMDQUEUE_05
2013-11-22 23:33:53 -08:00
add hl, bc
ld a, [hl]
pop hl
rst JumpTable
ret
; 97eab
2015-11-18 20:16:25 -08:00
CmdQueueAnonJT_Increment: ; 97eab
ld hl, CMDQUEUE_05
2013-11-22 23:33:53 -08:00
add hl, bc
inc [hl]
ret
; 97eb1
2015-11-18 20:16:25 -08:00
CmdQueueAnonJT_Decrement: ; 97eb1
ld hl, CMDQUEUE_05
2013-11-22 23:33:53 -08:00
add hl, bc
dec [hl]
ret
; 97eb7
2015-11-18 20:16:25 -08:00
CmdQueue_Null: ; 97eb7
2013-11-22 23:33:53 -08:00
ret
; 97eb8
2015-11-18 20:16:25 -08:00
CmdQueue_Null2: ; 97eb8
2015-10-24 07:34:19 -07:00
call ret_2f3e
2013-11-22 23:33:53 -08:00
ret
; 97ebc
2015-11-18 20:16:25 -08:00
CmdQueue_Type4: ; 97ebc
call CmdQueueAnonymousJumptable
2015-12-26 18:59:03 -08:00
; anonymous dw
2015-11-18 20:16:25 -08:00
dw .zero
dw .one
2013-11-22 23:33:53 -08:00
; 97ec3
.zero ; 97ec3
2013-11-22 23:33:53 -08:00
ld a, [hSCY]
2015-11-18 20:16:25 -08:00
ld hl, 4
2013-11-22 23:33:53 -08:00
add hl, bc
ld [hl], a
2015-11-18 20:16:25 -08:00
call CmdQueueAnonJT_Increment
.one ; 97ecd
2015-11-18 20:16:25 -08:00
ld hl, 1
2013-11-22 23:33:53 -08:00
add hl, bc
ld a, [hl]
dec a
ld [hl], a
jr z, .finish
2013-11-22 23:33:53 -08:00
and $1
jr z, .add
2015-11-18 20:16:25 -08:00
ld hl, 2
2013-11-22 23:33:53 -08:00
add hl, bc
ld a, [hSCY]
sub [hl]
ld [hSCY], a
ret
.add
2015-11-18 20:16:25 -08:00
ld hl, 2
2013-11-22 23:33:53 -08:00
add hl, bc
ld a, [hSCY]
add [hl]
ld [hSCY], a
ret
.finish
2015-11-18 20:16:25 -08:00
ld hl, 4
2013-11-22 23:33:53 -08:00
add hl, bc
ld a, [hl]
ld [hSCY], a
2015-11-18 20:16:25 -08:00
call _DelCmdQueue
2013-11-22 23:33:53 -08:00
ret
; 97ef9
2015-11-18 20:16:25 -08:00
CmdQueue_Type3: ; 97ef9
call CmdQueueAnonymousJumptable
2015-12-26 18:59:03 -08:00
; anonymous dw
2015-11-18 20:16:25 -08:00
dw .zero
dw .one
dw .two
2013-11-22 23:33:53 -08:00
; 97f02
.zero ; 97f02
2015-11-18 20:16:25 -08:00
call .IsPlayerFacingDown
jr z, .PlayerNotFacingDown
call CmdQueueAnonJT_Increment
.one ; 97f0a
2015-11-18 20:16:25 -08:00
call .IsPlayerFacingDown
jr z, .PlayerNotFacingDown
call CmdQueueAnonJT_Increment
2013-11-22 23:33:53 -08:00
2015-11-18 20:16:25 -08:00
ld hl, 2
2013-11-22 23:33:53 -08:00
add hl, bc
ld a, [hl]
ld [wd173], a
2013-11-22 23:33:53 -08:00
ret
; 97f1b
.two ; 97f1b
2015-11-18 20:16:25 -08:00
call .IsPlayerFacingDown
jr z, .PlayerNotFacingDown
call CmdQueueAnonJT_Decrement
2013-11-22 23:33:53 -08:00
2015-11-18 20:16:25 -08:00
ld hl, 3
2013-11-22 23:33:53 -08:00
add hl, bc
ld a, [hl]
ld [wd173], a
2013-11-22 23:33:53 -08:00
ret
; 97f2c
2015-11-18 20:16:25 -08:00
.PlayerNotFacingDown: ; 97f2c
2013-11-22 23:33:53 -08:00
ld a, $7f
ld [wd173], a
2015-11-18 20:16:25 -08:00
ld hl, 5
2013-11-22 23:33:53 -08:00
add hl, bc
ld [hl], 0
ret
; 97f38
2015-11-18 20:16:25 -08:00
.IsPlayerFacingDown: ; 97f38
2013-11-22 23:33:53 -08:00
push bc
ld bc, PlayerStruct
2013-11-22 23:33:53 -08:00
call GetSpriteDirection
and a
pop bc
ret
; 97f42
2015-11-18 20:16:25 -08:00
CmdQueue_StoneTable: ; 97f42
ld de, PlayerStruct
2015-11-18 20:16:25 -08:00
ld a, NUM_OBJECT_STRUCTS
.loop
2013-11-22 23:33:53 -08:00
push af
2015-11-18 20:16:25 -08:00
ld hl, OBJECT_SPRITE
2013-11-22 23:33:53 -08:00
add hl, de
ld a, [hl]
and a
2015-11-18 20:16:25 -08:00
jr z, .next
2013-11-22 23:33:53 -08:00
2015-11-18 20:16:25 -08:00
ld hl, OBJECT_MOVEMENTTYPE
2013-11-22 23:33:53 -08:00
add hl, de
ld a, [hl]
cp STEP_TYPE_SKYFALL_TOP
2015-11-18 20:16:25 -08:00
jr nz, .next
2013-11-22 23:33:53 -08:00
2015-11-18 20:16:25 -08:00
ld hl, OBJECT_NEXT_TILE
2013-11-22 23:33:53 -08:00
add hl, de
ld a, [hl]
call CheckPitTile
2015-11-18 20:16:25 -08:00
jr nz, .next
2013-11-22 23:33:53 -08:00
2015-11-18 20:16:25 -08:00
ld hl, OBJECT_DIRECTION_WALKING
2013-11-22 23:33:53 -08:00
add hl, de
ld a, [hl]
2015-11-18 20:16:25 -08:00
cp STANDING
jr nz, .next
call HandleStoneQueue
jr c, .fall_down_hole
2013-11-22 23:33:53 -08:00
2015-11-18 20:16:25 -08:00
.next
ld hl, OBJECT_STRUCT_LENGTH
2013-11-22 23:33:53 -08:00
add hl, de
ld d, h
ld e, l
pop af
dec a
2015-11-18 20:16:25 -08:00
jr nz, .loop
2013-11-22 23:33:53 -08:00
ret
2015-11-18 20:16:25 -08:00
.fall_down_hole
2013-11-22 23:33:53 -08:00
pop af
ret
; 97f7e