pokecrystal-board/engine/overworld/time.asm

308 lines
4.8 KiB
NASM

ClearDailyTimers::
xor a
ld [wLuckyNumberDayTimer], a
ld [wDailyResetTimer], a
ret
InitCallReceiveDelay::
xor a
ld [wTimeCyclesSinceLastCall], a
NextCallReceiveDelay:
ld a, [wTimeCyclesSinceLastCall]
cp 3
jr c, .okay
ld a, 3
.okay
ld e, a
ld d, 0
ld hl, .ReceiveCallDelays
add hl, de
ld a, [hl]
if DEF(_DEBUG)
ld h, a
ld a, BANK(sDebugTimeCyclesSinceLastCall)
call OpenSRAM
ld a, [sDebugTimeCyclesSinceLastCall]
call CloseSRAM
dec a
cp 2
jr nc, .debug_ok
xor 1
ld h, a
.debug_ok
ld a, h
endc
jp RestartReceiveCallDelay
.ReceiveCallDelays:
db 20, 10, 5, 3
CheckReceiveCallTimer:
call CheckReceiveCallDelay ; check timer
ret nc
ld hl, wTimeCyclesSinceLastCall
ld a, [hl]
cp 3
jr nc, .ok
inc [hl]
.ok
call NextCallReceiveDelay ; restart timer
scf
ret
InitOneDayCountdown:
ld a, 1
InitNDaysCountdown:
ld [hl], a
inc hl ; wLuckyNumberDayTimer + 1 or wDailyResetTimer + 1 (both are dw)
ld a, [wCurDay]
ld [hl], a
ret
CheckDayDependentEventHL:
inc hl
push hl
call CalcDaysSince
call GetDaysSince
pop hl
dec hl
call UpdateTimeRemaining
ret
RestartReceiveCallDelay:
ld hl, wReceiveCallDelay_MinsRemaining
ld [hl], a
ld hl, wReceiveCallDelay_StartTime
call CopyHourMinToHL
ret
CheckReceiveCallDelay:
ld hl, wReceiveCallDelay_StartTime
call CalcMinsHoursSince
call GetMinutesSinceIfLessThan60
ld hl, wReceiveCallDelay_MinsRemaining
call UpdateTimeRemaining
ret
RestartDailyResetTimer:
ld hl, wDailyResetTimer
jp InitOneDayCountdown
CheckDailyResetTimer::
ld hl, wDailyResetTimer
call CheckDayDependentEventHL
ret nc
xor a
ld hl, wDailyFlags1
ld [hli], a ; wDailyFlags1
ld [hli], a ; wDailyFlags2
ld [hli], a ; wSwarmFlags
ld [hl], a ; wSwarmFlags + 1
jr RestartDailyResetTimer
StartBugContestTimer:
ld a, BUG_CONTEST_MINUTES
ld [wBugContestMinsRemaining], a
ld a, BUG_CONTEST_SECONDS
ld [wBugContestSecsRemaining], a
ld hl, wBugContestStartTime
call CopyHourMinSecToHL
ret
CheckBugContestTimer::
ld hl, wBugContestStartTime
call CalcSecsMinsHoursSince
ld a, [wHoursSince]
and a
jr nz, .timed_out
ld a, [wSecondsSince]
ld b, a
ld a, [wBugContestSecsRemaining]
sub b
jr nc, .okay
add 60
.okay
ld [wBugContestSecsRemaining], a
ld a, [wMinutesSince]
ld b, a
ld a, [wBugContestMinsRemaining]
sbc b
ld [wBugContestMinsRemaining], a
jr c, .timed_out
and a
ret
.timed_out
xor a
ld [wBugContestMinsRemaining], a
ld [wBugContestSecsRemaining], a
scf
ret
CheckPokerusTick::
ld hl, .Day0
call CalcDaysSince
call GetDaysSince
and a
jr z, .done ; not even a day has passed since game start
ld b, a
farcall ApplyPokerusTick
.done
xor a
ret
.Day0:
db 0
RestartLuckyNumberCountdown:
call .GetDaysUntilNextFriday
ld hl, wLuckyNumberDayTimer
jp InitNDaysCountdown
.GetDaysUntilNextFriday:
call GetWeekday
ld c, a
ld a, FRIDAY
sub c
jr z, .friday_saturday
jr nc, .earlier ; could have done "ret nc"
.friday_saturday
add 7
.earlier
ret
_CheckLuckyNumberShowFlag:
ld hl, wLuckyNumberDayTimer
jp CheckDayDependentEventHL
UpdateTimeRemaining:
; If the amount of time elapsed exceeds the capacity of its
; unit, skip this part.
cp -1
jr z, .set_carry
ld c, a
ld a, [hl] ; time remaining
sub c
jr nc, .ok
xor a
.ok
ld [hl], a
jr z, .set_carry
xor a
ret
.set_carry
xor a
ld [hl], a
scf
ret
GetSecondsSinceIfLessThan60: ; unreferenced
ld a, [wHoursSince]
and a
jr nz, GetTimeElapsed_ExceedsUnitLimit
ld a, [wMinutesSince]
jr nz, GetTimeElapsed_ExceedsUnitLimit
ld a, [wSecondsSince]
ret
GetMinutesSinceIfLessThan60:
ld a, [wHoursSince]
and a
jr nz, GetTimeElapsed_ExceedsUnitLimit
ld a, [wMinutesSince]
ret
GetHoursSinceIfLessThan24: ; unreferenced
ld a, [wHoursSince]
ret
GetDaysSince:
ld a, [wDaysSince]
ret
GetTimeElapsed_ExceedsUnitLimit:
ld a, -1
ret
CalcDaysSince:
xor a
jr _CalcDaysSince
CalcHoursSince: ; unreferenced
xor a
jr _CalcHoursSince
CalcMinsHoursSince:
inc hl
xor a
jr _CalcMinsHoursSince
CalcSecsMinsHoursSince:
inc hl
inc hl
ld a, [wGameTimeSeconds]
ld c, a
sub [hl]
jr nc, .skip
add 60
.skip
ld [hl], c ; current seconds
dec hl
ld [wSecondsSince], a ; seconds since
_CalcMinsHoursSince:
ld a, [wGameTimeMinutes]
ld c, a
sbc [hl]
jr nc, .skip
add 60
.skip
ld [hl], c ; current minutes
dec hl
ld [wMinutesSince], a ; minutes since
_CalcHoursSince:
; assumes differentials below 256 hours
ld a, [wGameTimeHours + 1]
ld c, a
sub [hl]
ld [hl], c ; current hours
ld [wHoursSince], a ; hours since
ret
_CalcDaysSince:
ld a, [wCurDay]
ld c, a
sbc [hl]
jr nc, .skip
add MAX_DAYS
.skip
ld [hl], c ; current days
ld [wDaysSince], a ; days since
ret
CopyHourMinSecToHL:
ld a, [wGameTimeHours + 1]
ld [hli], a
ld a, [wGameTimeMinutes]
ld [hli], a
ld a, [wGameTimeSeconds]
ld [hli], a
ret
CopyHourMinToHL:
ld a, [wGameTimeHours + 1]
ld [hli], a
ld a, [wGameTimeMinutes]
ld [hli], a
ret