ref: 31ec3365e975e8055dcac60d38fcb30d8096d52c
dir: /home/game_time.asm/
ResetGameTime:: xor a ld [wGameTimeCap], a ld [wGameTimeHours], a ld [wGameTimeHours + 1], a ld [wGameTimeMinutes], a ld [wGameTimeSeconds], a ld [wGameTimeFrames], a ret GameTimer:: nop ldh a, [rSVBK] push af ld a, BANK(wGameTime) ldh [rSVBK], a call UpdateGameTimer pop af ldh [rSVBK], a ret UpdateGameTimer:: ; Increment the game timer by one frame. ; The game timer is capped at 999:59:59.00. ; Don't update if game logic is paused. ld a, [wGameLogicPaused] and a ret nz ; Is the timer paused? ld hl, wGameTimerPause bit GAMETIMERPAUSE_TIMER_PAUSED_F, [hl] ret z ; Is the timer already capped? ld hl, wGameTimeCap bit 0, [hl] ret nz ; +1 frame ld hl, wGameTimeFrames ld a, [hl] inc a cp 60 ; frames/second jr nc, .second ld [hl], a ret .second xor a ld [hl], a ; +1 second ld hl, wGameTimeSeconds ld a, [hl] inc a cp 60 ; seconds/minute jr nc, .minute ld [hl], a ret .minute xor a ld [hl], a ; +1 minute ld hl, wGameTimeMinutes ld a, [hl] inc a cp 60 ; minutes/hour jr nc, .hour ld [hl], a ret .hour xor a ld [hl], a ; +1 hour ld a, [wGameTimeHours] ld h, a ld a, [wGameTimeHours + 1] ld l, a inc hl ; Cap the timer after 1000 hours. ld a, h cp HIGH(1000) jr c, .ok ld a, l cp LOW(1000) jr c, .ok ld hl, wGameTimeCap set 0, [hl] ld a, 59 ; 999:59:59.00 ld [wGameTimeMinutes], a ld [wGameTimeSeconds], a ret .ok ld a, h ld [wGameTimeHours], a ld a, l ld [wGameTimeHours + 1], a ret