jep-hack/engine/overworld/time.asm
Llinos Evans 6d7f07292b Jacky's House (& Jacky & Knuckles)
This adds various house tiles that allow the creation of the game house from SW97. It's been heavily altered to include the SNES (from RBY), Virtual Boy, and N64.

Here, you can fight Jacky once a day to farm Gold Leaves, which will be currency for a Move Reminder. It should refresh just fine but definitely give it a closer look, I'm not exactly confident.

I also made a start on a GSCified sofa but it looks kinda weird.
2024-07-27 13:54:53 +01:00

429 lines
6.8 KiB
NASM

_InitializeStartDay:
call InitializeStartDay
ret
ClearDailyTimers:
xor a
ld [wLuckyNumberDayTimer], a
ld [wSweetHoneyTimer], a
ld [wDailyResetTimer], a
ld [wJackyTimer], a ; This could use an engine flag I think but mehhhhhhhh
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
push hl
call UpdateTime
pop hl
inc hl
call CopyDayToHL
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
call UpdateTime
ld hl, wReceiveCallDelay_StartTime
call CopyDayHourMinToHL
ret
CheckReceiveCallDelay:
ld hl, wReceiveCallDelay_StartTime
call CalcMinsHoursDaysSince
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
ld hl, wDailyRematchFlags
rept 4
ld [hli], a
endr
ld hl, wDailyPhoneItemFlags
rept 4
ld [hli], a
endr
ld hl, wDailyPhoneTimeOfDayFlags
rept 4
ld [hli], a
endr
ld hl, wKenjiBreakTimer
ld a, [hl]
and a
jr z, .RestartKenjiBreakCountdown
dec [hl]
jr nz, .DontRestartKenjiBreakCountdown
.RestartKenjiBreakCountdown:
call SampleKenjiBreakCountdown
.DontRestartKenjiBreakCountdown:
jr RestartDailyResetTimer
SampleKenjiBreakCountdown:
; Generate a random number between 3 and 6
call Random
and %11
add 3
ld [wKenjiBreakTimer], a
ret
StartBugContestTimer:
ld a, BUG_CONTEST_MINUTES
ld [wBugContestMinsRemaining], a
ld a, BUG_CONTEST_SECONDS
ld [wBugContestSecsRemaining], a
call UpdateTime
ld hl, wBugContestStartTime
call CopyDayHourMinSecToHL
ret
CheckBugContestTimer::
ld hl, wBugContestStartTime
call CalcSecsMinsHoursDaysSince
ld a, [wDaysSince]
and a
jr nz, .timed_out
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
InitializeStartDay:
call UpdateTime
ld hl, wTimerEventStartDay
call CopyDayToHL
ret
CheckPokerusTick::
ld hl, wTimerEventStartDay
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
SetSweetHoneyTimer:
ld a, 2
ld hl, wSweetHoneyTimer
ld [hl], a
call UpdateTime
ld hl, wSweetHoneyStartDate
call CopyDayToHL
ret
_CheckSweetHoneyTimer:
ld hl, wSweetHoneyStartDate
call CalcDaysSince
call GetDaysSince
ld hl, wSweetHoneyTimer
call UpdateTimeRemaining
ret
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
DoMysteryGiftIfDayHasPassed:
ld a, BANK(sMysteryGiftTimer)
call OpenSRAM
ld hl, sMysteryGiftTimer
ld a, [hli]
ld [wTempMysteryGiftTimer], a
ld a, [hl]
ld [wTempMysteryGiftTimer + 1], a
call CloseSRAM
ld hl, wTempMysteryGiftTimer
call CheckDayDependentEventHL
jr nc, .not_timed_out
ld hl, wTempMysteryGiftTimer
call InitOneDayCountdown
call CloseSRAM
farcall ResetDailyMysteryGiftLimitIfUnlocked
.not_timed_out
ld a, BANK(sMysteryGiftTimer)
call OpenSRAM
ld hl, wTempMysteryGiftTimer
ld a, [hli]
ld [sMysteryGiftTimer], a
ld a, [hl]
ld [sMysteryGiftTimer + 1], a
call CloseSRAM
ret
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, [wDaysSince]
and a
jr nz, GetTimeElapsed_ExceedsUnitLimit
ld a, [wHoursSince]
and a
jr nz, GetTimeElapsed_ExceedsUnitLimit
ld a, [wMinutesSince]
jr nz, GetTimeElapsed_ExceedsUnitLimit
ld a, [wSecondsSince]
ret
GetMinutesSinceIfLessThan60:
ld a, [wDaysSince]
and a
jr nz, GetTimeElapsed_ExceedsUnitLimit
ld a, [wHoursSince]
and a
jr nz, GetTimeElapsed_ExceedsUnitLimit
ld a, [wMinutesSince]
ret
GetHoursSinceIfLessThan24: ; unreferenced
ld a, [wDaysSince]
and a
jr nz, GetTimeElapsed_ExceedsUnitLimit
ld a, [wHoursSince]
ret
GetDaysSince:
ld a, [wDaysSince]
ret
GetTimeElapsed_ExceedsUnitLimit:
ld a, -1
ret
CalcDaysSince:
xor a
jr _CalcDaysSince
CalcHoursDaysSince: ; unreferenced
inc hl
xor a
jr _CalcHoursDaysSince
CalcMinsHoursDaysSince:
inc hl
inc hl
xor a
jr _CalcMinsHoursDaysSince
CalcSecsMinsHoursDaysSince:
inc hl
inc hl
inc hl
ldh a, [hSeconds]
ld c, a
sub [hl]
jr nc, .skip
add 60
.skip
ld [hl], c ; current seconds
dec hl
ld [wSecondsSince], a ; seconds since
_CalcMinsHoursDaysSince:
ldh a, [hMinutes]
ld c, a
sbc [hl]
jr nc, .skip
add 60
.skip
ld [hl], c ; current minutes
dec hl
ld [wMinutesSince], a ; minutes since
_CalcHoursDaysSince:
ldh a, [hHours]
ld c, a
sbc [hl]
jr nc, .skip
add MAX_HOUR
.skip
ld [hl], c ; current hours
dec hl
ld [wHoursSince], a ; hours since
_CalcDaysSince:
ld a, [wCurDay]
ld c, a
sbc [hl]
jr nc, .skip
add 20 * 7
.skip
ld [hl], c ; current days
ld [wDaysSince], a ; days since
ret
CopyDayHourMinSecToHL:
ld a, [wCurDay]
ld [hli], a
ldh a, [hHours]
ld [hli], a
ldh a, [hMinutes]
ld [hli], a
ldh a, [hSeconds]
ld [hli], a
ret
CopyDayToHL:
ld a, [wCurDay]
ld [hl], a
ret
CopyDayHourToHL: ; unreferenced
ld a, [wCurDay]
ld [hli], a
ldh a, [hHours]
ld [hli], a
ret
CopyDayHourMinToHL:
ld a, [wCurDay]
ld [hli], a
ldh a, [hHours]
ld [hli], a
ldh a, [hMinutes]
ld [hli], a
ret