summaryrefslogtreecommitdiff
path: root/engine/overworld/time.asm
diff options
context:
space:
mode:
authormid-kid <esteve.varela@gmail.com>2018-03-13 13:07:16 +0100
committermid-kid <esteve.varela@gmail.com>2018-03-13 13:21:40 +0100
commitbaa0dc5a963a79843b37888bcfe1d2dfe833ade9 (patch)
tree968c86105bd67a3121d8f3f20018bfc59191f4c9 /engine/overworld/time.asm
parent12070ca50067d3abe36a730190f88ee43f2cace9 (diff)
Organize the engine/ directory
This is an informed attempt at reorganizing the engine/ directory by creating categorized subdirectories, in order to make it easier to navigate and find things. The directories created are as follows: * engine/game: Contains all "minigames", things like the unown puzzle and slot machine. * engine/gfx: Contains all handling of graphics. From loading palettes to playing animations. * engine/link: Contains all multiplayer functionality. * engine/menu: Contains all generic/misc. menus and menu code. Other, more specialized menus are in their own subdirectories (pokedex, pokegear, party menu, etc). * engine/overworld: Contains all handling of the overworld. From loading and connecting maps to wild encounters and the scripting engine. * engine/pokegear: In the same vein as engine/pokedex, except it could use some more splitting up. * engine/pokemon: Contains everything related to manipulating pokemon data. From the pokemon storage system to evolution and mail. * engine/printer: Contains everything related to printing things as well as the printer communication. * engine/title: Contains intro sequences, title screens and credits.
Diffstat (limited to 'engine/overworld/time.asm')
-rwxr-xr-xengine/overworld/time.asm465
1 files changed, 465 insertions, 0 deletions
diff --git a/engine/overworld/time.asm b/engine/overworld/time.asm
new file mode 100755
index 000000000..0f83447cc
--- /dev/null
+++ b/engine/overworld/time.asm
@@ -0,0 +1,465 @@
+_InitializeStartDay: ; 113d6
+ call InitializeStartDay
+ ret
+; 113da
+
+ClearDailyTimers: ; 113da
+ xor a
+ ld [wLuckyNumberDayBuffer], a
+ ld [wUnusedTwoDayTimer], a
+ ld [wDailyResetTimer], a
+ ret
+; 113e5
+
+InitCallReceiveDelay:: ; 113e5
+ xor a
+ ld [wTimeCyclesSinceLastCall], a
+
+NextCallReceiveDelay: ; 113e9
+ 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]
+ jp RestartReceiveCallDelay
+; 113fd
+
+.ReceiveCallDelays:
+ db 20, 10, 5, 3
+; 11401
+
+CheckReceiveCallTimer: ; 11401
+ 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
+; 11413
+
+InitOneDayCountdown: ; 11413
+ ld a, 1
+
+InitNDaysCountdown: ; 11415
+ ld [hl], a
+ push hl
+ call UpdateTime
+ pop hl
+ inc hl
+ call CopyDayToHL
+ ret
+; 11420
+
+CheckDayDependentEventHL: ; 11420
+ inc hl
+ push hl
+ call CalcDaysSince
+ call GetDaysSince
+ pop hl
+ dec hl
+ call UpdateTimeRemaining
+ ret
+; 1142e
+
+RestartReceiveCallDelay: ; 1142e
+ ld hl, wReceiveCallDelay_MinsRemaining
+ ld [hl], a
+ call UpdateTime
+ ld hl, wReceiveCallDelay_StartTime
+ call CopyDayHourMinToHL
+ ret
+; 1143c
+
+CheckReceiveCallDelay: ; 1143c
+ ld hl, wReceiveCallDelay_StartTime
+ call CalcMinsHoursDaysSince
+ call GetMinutesSinceIfLessThan60
+ ld hl, wReceiveCallDelay_MinsRemaining
+ call UpdateTimeRemaining
+ ret
+; 1144c
+
+RestartDailyResetTimer: ; 1144c
+ ld hl, wDailyResetTimer
+ jp InitOneDayCountdown
+; 11452
+
+CheckDailyResetTimer:: ; 11452
+ ld hl, wDailyResetTimer
+ call CheckDayDependentEventHL
+ ret nc
+ xor a
+ ld hl, wDailyFlags
+ ld [hli], a ; wDailyFlags
+ ld [hli], a ; wWeeklyFlags
+ 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
+; 11485
+
+SampleKenjiBreakCountdown: ; 11485
+; Generate a random number between 3 and 6
+ call Random
+ and %11
+ add 3
+ ld [wKenjiBreakTimer], a
+ ret
+; 11490
+
+StartBugContestTimer: ; 11490
+ ld a, BUG_CONTEST_MINUTES
+ ld [wBugContestMinsRemaining], a
+ ld a, BUG_CONTEST_SECONDS
+ ld [wBugContestSecsRemaining], a
+ call UpdateTime
+ ld hl, wBugContestStartTime
+ call CopyDayHourMinSecToHL
+ ret
+; 114a4
+
+
+CheckBugContestTimer:: ; 114a4 (4:54a4)
+ 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: ; 114dd
+ call UpdateTime
+ ld hl, wTimerEventStartDay
+ call CopyDayToHL
+ ret
+; 114e7
+
+CheckPokerusTick:: ; 114e7
+ 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
+; 114fc
+
+SetUnusedTwoDayTimer: ; 114fc
+ ld a, 2
+ ld hl, wUnusedTwoDayTimer
+ ld [hl], a
+ call UpdateTime
+ ld hl, wUnusedTwoDayTimerStartDate
+ call CopyDayToHL
+ ret
+; 1150c
+
+CheckUnusedTwoDayTimer: ; 1150c
+ ld hl, wUnusedTwoDayTimerStartDate
+ call CalcDaysSince
+ call GetDaysSince
+ ld hl, wUnusedTwoDayTimer
+ call UpdateTimeRemaining
+ ret
+; 1151c
+
+; unused
+ ld hl, wDailyFlags
+ set DAILYFLAGS_FISH_SWARM_F, [hl]
+ ret
+; 11522
+
+; unused
+ and a
+ ld hl, wDailyFlags
+ bit DAILYFLAGS_FISH_SWARM_F, [hl]
+ ret nz
+ scf
+ ret
+; 1152b
+
+RestartLuckyNumberCountdown: ; 1152b
+ call .GetDaysUntilNextFriday
+ ld hl, wLuckyNumberDayBuffer
+ jp InitNDaysCountdown
+; 11534
+
+.GetDaysUntilNextFriday: ; 11534
+ 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
+; 11542
+
+_CheckLuckyNumberShowFlag: ; 11542
+ ld hl, wLuckyNumberDayBuffer
+ jp CheckDayDependentEventHL
+; 11548
+
+DoMysteryGiftIfDayHasPassed: ; 11548
+ ld a, BANK(sMysteryGiftTimer)
+ call GetSRAMBank
+ ld hl, sMysteryGiftTimer
+ ld a, [hli]
+ ld [wBuffer1], a
+ ld a, [hl]
+ ld [wBuffer2], a
+ call CloseSRAM
+
+ ld hl, wBuffer1
+ call CheckDayDependentEventHL
+ jr nc, .not_timed_out
+ ld hl, wBuffer1
+ call InitOneDayCountdown
+ call CloseSRAM
+ farcall Function1050c8
+
+.not_timed_out
+ ld a, BANK(sMysteryGiftTimer)
+ call GetSRAMBank
+ ld hl, wBuffer1
+ ld a, [hli]
+ ld [sMysteryGiftTimer], a
+ ld a, [hl]
+ ld [sMysteryGiftTimer + 1], a
+ call CloseSRAM
+ ret
+; 11586
+
+UpdateTimeRemaining: ; 11586
+; 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
+; 11599
+
+GetSecondsSinceIfLessThan60: ; 11599
+ 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
+; 115ae
+
+GetMinutesSinceIfLessThan60: ; 115ae
+ ld a, [wDaysSince]
+ and a
+ jr nz, GetTimeElapsed_ExceedsUnitLimit
+ ld a, [wHoursSince]
+ and a
+ jr nz, GetTimeElapsed_ExceedsUnitLimit
+ ld a, [wMinutesSince]
+ ret
+; 115be
+
+GetHoursSinceIfLessThan24: ; 115be
+ ld a, [wDaysSince]
+ and a
+ jr nz, GetTimeElapsed_ExceedsUnitLimit
+ ld a, [wHoursSince]
+ ret
+; 115c8
+
+GetDaysSince: ; 115c8
+ ld a, [wDaysSince]
+ ret
+; 115cc
+
+GetTimeElapsed_ExceedsUnitLimit: ; 115cc
+ ld a, -1
+ ret
+; 115cf
+
+CalcDaysSince: ; 115cf
+ xor a
+ jr _CalcDaysSince
+; 115d2
+
+CalcHoursDaysSince: ; 115d2
+ inc hl
+ xor a
+ jr _CalcHoursDaysSince
+; 115d6
+
+CalcMinsHoursDaysSince: ; 115d6
+ inc hl
+ inc hl
+ xor a
+ jr _CalcMinsHoursDaysSince
+; 115db
+
+CalcSecsMinsHoursDaysSince: ; 115db
+ inc hl
+ inc hl
+ inc hl
+ ld 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: ; 115eb
+ ld 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: ; 115f8
+ ld a, [hHours]
+ ld c, a
+ sbc [hl]
+ jr nc, .skip
+ add 24
+.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
+; 11613
+
+CopyDayHourMinSecToHL: ; 11613
+ ld a, [wCurDay]
+ ld [hli], a
+ ld a, [hHours]
+ ld [hli], a
+ ld a, [hMinutes]
+ ld [hli], a
+ ld a, [hSeconds]
+ ld [hli], a
+ ret
+; 11621
+
+CopyDayToHL: ; 11621
+ ld a, [wCurDay]
+ ld [hl], a
+ ret
+; 11626
+
+CopyDayHourToHL: ; 11626
+ ld a, [wCurDay]
+ ld [hli], a
+ ld a, [hHours]
+ ld [hli], a
+ ret
+; 1162e
+
+CopyDayHourMinToHL: ; 1162e
+ ld a, [wCurDay]
+ ld [hli], a
+ ld a, [hHours]
+ ld [hli], a
+ ld a, [hMinutes]
+ ld [hli], a
+ ret
+; 11639