ref: fbcc8d1b0e05cace2abe2083a88a8c2304efc9d7
dir: /engine/rtc/timeset.asm/
TIMESET_UP_ARROW EQU "♂" ; $ef TIMESET_DOWN_ARROW EQU "♀" ; $f5 InitClock: ; Ask the player to set the time. ldh a, [hInMenu] push af ld a, $1 ldh [hInMenu], a ld a, $0 ld [wSpriteUpdatesEnabled], a ld a, $10 ld [wMusicFade], a ld a, LOW(MUSIC_NONE) ld [wMusicFadeID], a ld a, HIGH(MUSIC_NONE) ld [wMusicFadeID + 1], a ld c, 8 call DelayFrames call RotateFourPalettesLeft call ClearTilemap call ClearSprites ld b, SCGB_DIPLOMA call GetSGBLayout xor a ldh [hBGMapMode], a call LoadStandardFont ld de, TimeSetBackgroundGFX ld hl, vTiles2 tile $00 lb bc, BANK(TimeSetBackgroundGFX), 1 call Request1bpp ld de, TimeSetUpArrowGFX ld hl, vTiles2 tile $01 lb bc, BANK(TimeSetUpArrowGFX), 1 call Request1bpp ld de, TimeSetDownArrowGFX ld hl, vTiles2 tile $02 lb bc, BANK(TimeSetDownArrowGFX), 1 call Request1bpp call .ClearScreen call WaitBGMap call RotateFourPalettesRight ld hl, OakTimeWokeUpText call PrintText ld hl, wTimeSetBuffer ld bc, wTimeSetBufferEnd - wTimeSetBuffer xor a call ByteFill ld a, 10 ; default hour = 10 AM ld [wInitHourBuffer], a .loop ld hl, OakTimeWhatTimeIsItText call PrintText hlcoord 3, 7 ld b, 2 ld c, 15 call Textbox hlcoord 11, 7 ld [hl], $1 hlcoord 11, 10 ld [hl], $2 hlcoord 4, 9 call DisplayHourOClock ld c, 10 call DelayFrames .SetHourLoop: call JoyTextDelay call SetHour jr nc, .SetHourLoop ld a, [wInitHourBuffer] ld [wStringBuffer2 + 1], a call .ClearScreen ld hl, OakTimeWhatHoursText call PrintText call YesNoBox jr nc, .HourIsSet call .ClearScreen jr .loop .HourIsSet: ld hl, OakTimeHowManyMinutesText call PrintText hlcoord 11, 7 lb bc, 2, 7 call Textbox hlcoord 15, 7 ld [hl], $1 hlcoord 15, 10 ld [hl], $2 hlcoord 12, 9 call DisplayMinutesWithMinString ld c, 10 call DelayFrames .SetMinutesLoop: call JoyTextDelay call SetMinutes jr nc, .SetMinutesLoop ld a, [wInitMinuteBuffer] ld [wStringBuffer2 + 2], a call .ClearScreen ld hl, OakTimeWhoaMinutesText call PrintText call YesNoBox jr nc, .MinutesAreSet call .ClearScreen jr .HourIsSet .MinutesAreSet: call InitTimeOfDay ld hl, OakText_ResponseToSetTime call PrintText call WaitPressAorB_BlinkCursor pop af ldh [hInMenu], a ret .ClearScreen: xor a ldh [hBGMapMode], a hlcoord 0, 0 ld bc, SCREEN_HEIGHT * SCREEN_WIDTH xor a call ByteFill ld a, $1 ldh [hBGMapMode], a ret SetHour: ldh a, [hJoyPressed] and A_BUTTON jr nz, .Confirm ld hl, hJoyLast ld a, [hl] and D_UP jr nz, .up ld a, [hl] and D_DOWN jr nz, .down call DelayFrame and a ret .down ld hl, wInitHourBuffer ld a, [hl] and a jr nz, .DecreaseThroughMidnight ld a, 23 + 1 .DecreaseThroughMidnight: dec a ld [hl], a jr .okay .up ld hl, wInitHourBuffer ld a, [hl] cp 23 jr c, .AdvanceThroughMidnight ld a, -1 .AdvanceThroughMidnight: inc a ld [hl], a .okay hlcoord 4, 9 ld a, " " ld bc, 15 call ByteFill hlcoord 4, 9 call DisplayHourOClock call WaitBGMap and a ret .Confirm: scf ret DisplayHourOClock: push hl ld a, [wInitHourBuffer] ld c, a ld e, l ld d, h call PrintHour inc hl ld de, String_oclock call PlaceString pop hl ret DisplayHoursMinutesWithMinString: ; unreferenced ld h, d ld l, e push hl call DisplayHourOClock pop de inc de inc de ld a, ":" ld [de], a inc de push de ld hl, 3 add hl, de ld a, [de] inc de ld [hli], a ld a, [de] ld [hl], a pop hl call DisplayMinutesWithMinString inc hl inc hl inc hl ret SetMinutes: ldh a, [hJoyPressed] and A_BUTTON jr nz, .a_button ld hl, hJoyLast ld a, [hl] and D_UP jr nz, .d_up ld a, [hl] and D_DOWN jr nz, .d_down call DelayFrame and a ret .d_down ld hl, wInitMinuteBuffer ld a, [hl] and a jr nz, .decrease ld a, 59 + 1 .decrease dec a ld [hl], a jr .finish_dpad .d_up ld hl, wInitMinuteBuffer ld a, [hl] cp 59 jr c, .increase ld a, -1 .increase inc a ld [hl], a .finish_dpad hlcoord 12, 9 ld a, " " ld bc, 7 call ByteFill hlcoord 12, 9 call DisplayMinutesWithMinString call WaitBGMap and a ret .a_button scf ret DisplayMinutesWithMinString: ld de, wInitMinuteBuffer call PrintTwoDigitNumberLeftAlign inc hl ld de, String_min call PlaceString ret PrintTwoDigitNumberLeftAlign: push hl ld a, " " ld [hli], a ld [hl], a pop hl lb bc, PRINTNUM_LEFTALIGN | 1, 2 call PrintNum ret OakTimeWokeUpText: text_far _OakTimeWokeUpText text_end OakTimeWhatTimeIsItText: text_far _OakTimeWhatTimeIsItText text_end String_oclock: db "o'clock@" OakTimeWhatHoursText: ; What?@ @ text_far _OakTimeWhatHoursText text_asm hlcoord 1, 16 call DisplayHourOClock ld hl, .OakTimeHoursQuestionMarkText ret .OakTimeHoursQuestionMarkText: text_far _OakTimeHoursQuestionMarkText text_end OakTimeHowManyMinutesText: text_far _OakTimeHowManyMinutesText text_end String_min: db "min.@" OakTimeWhoaMinutesText: ; Whoa!@ @ text_far _OakTimeWhoaMinutesText text_asm hlcoord 7, 14 call DisplayMinutesWithMinString ld hl, .OakTimeMinutesQuestionMarkText ret .OakTimeMinutesQuestionMarkText: text_far _OakTimeMinutesQuestionMarkText text_end OakText_ResponseToSetTime: text_asm decoord 1, 14 ld a, [wInitHourBuffer] ld c, a call PrintHour ld [hl], ":" inc hl ld de, wInitMinuteBuffer lb bc, PRINTNUM_LEADINGZEROS | 1, 2 call PrintNum ld b, h ld c, l ld a, [wInitHourBuffer] cp MORN_HOUR jr c, .nite cp DAY_HOUR + 1 jr c, .morn cp NITE_HOUR jr c, .day .nite ld hl, .OakTimeSoDarkText ret .morn ld hl, .OakTimeOversleptText ret .day ld hl, .OakTimeYikesText ret .OakTimeOversleptText: text_far _OakTimeOversleptText text_end .OakTimeYikesText: text_far _OakTimeYikesText text_end .OakTimeSoDarkText: text_far _OakTimeSoDarkText text_end TimeSetBackgroundGFX: INCBIN "gfx/new_game/timeset_bg.1bpp" TimeSetUpArrowGFX: INCBIN "gfx/new_game/up_arrow.1bpp" TimeSetDownArrowGFX: INCBIN "gfx/new_game/down_arrow.1bpp" SetDayOfWeek: ldh a, [hInMenu] push af ld a, $1 ldh [hInMenu], a ld de, TimeSetUpArrowGFX ld hl, vTiles0 tile TIMESET_UP_ARROW lb bc, BANK(TimeSetUpArrowGFX), 1 call Request1bpp ld de, TimeSetDownArrowGFX ld hl, vTiles0 tile TIMESET_DOWN_ARROW lb bc, BANK(TimeSetDownArrowGFX), 1 call Request1bpp xor a ld [wTempDayOfWeek], a .loop hlcoord 0, 12 lb bc, 4, 18 call Textbox call LoadStandardMenuHeader ld hl, .OakTimeWhatDayIsItText call PrintText hlcoord 9, 3 ld b, 2 ld c, 9 call Textbox hlcoord 14, 3 ld [hl], TIMESET_UP_ARROW hlcoord 14, 6 ld [hl], TIMESET_DOWN_ARROW hlcoord 10, 5 call .PlaceWeekdayString call ApplyTilemap ld c, 10 call DelayFrames .loop2 call JoyTextDelay call .GetJoypadAction jr nc, .loop2 call ExitMenu call UpdateSprites ld hl, .ConfirmWeekdayText call PrintText call YesNoBox jr c, .loop ld a, [wTempDayOfWeek] ld [wStringBuffer2], a call InitDayOfWeek call LoadStandardFont pop af ldh [hInMenu], a ret .GetJoypadAction: ldh a, [hJoyPressed] and A_BUTTON jr z, .not_A scf ret .not_A ld hl, hJoyLast ld a, [hl] and D_UP jr nz, .d_up ld a, [hl] and D_DOWN jr nz, .d_down call DelayFrame and a ret .d_down ld hl, wTempDayOfWeek ld a, [hl] and a jr nz, .decrease ld a, SATURDAY + 1 .decrease dec a ld [hl], a jr .finish_dpad .d_up ld hl, wTempDayOfWeek ld a, [hl] cp 6 jr c, .increase ld a, SUNDAY - 1 .increase inc a ld [hl], a .finish_dpad xor a ldh [hBGMapMode], a hlcoord 10, 4 ld b, 2 ld c, 9 call ClearBox hlcoord 10, 5 call .PlaceWeekdayString call WaitBGMap and a ret .PlaceWeekdayString: push hl ld a, [wTempDayOfWeek] ld e, a ld d, 0 ld hl, .WeekdayStrings add hl, de add hl, de ld a, [hli] ld d, [hl] ld e, a pop hl call PlaceString ret .WeekdayStrings: ; entries correspond to wCurDay constants (see constants/wram_constants.asm) dw .Sunday dw .Monday dw .Tuesday dw .Wednesday dw .Thursday dw .Friday dw .Saturday dw .Sunday .Sunday: db " SUNDAY@" .Monday: db " MONDAY@" .Tuesday: db " TUESDAY@" .Wednesday: db "WEDNESDAY@" .Thursday: db "THURSDAY@" .Friday: db " FRIDAY@" .Saturday: db "SATURDAY@" .OakTimeWhatDayIsItText: text_far _OakTimeWhatDayIsItText text_end .ConfirmWeekdayText: text_asm hlcoord 1, 14 call .PlaceWeekdayString ld hl, .OakTimeIsItText ret .OakTimeIsItText: text_far _OakTimeIsItText text_end InitialSetDSTFlag: ld a, [wDST] set 7, a ld [wDST], a hlcoord 1, 14 lb bc, 3, 18 call ClearBox ld hl, .Text call PlaceHLTextAtBC ret .Text: text_asm call UpdateTime ldh a, [hHours] ld b, a ldh a, [hMinutes] ld c, a decoord 1, 14 farcall PrintHoursMins ld hl, .DSTIsThatOKText ret .DSTIsThatOKText: text_far _DSTIsThatOKText text_end InitialClearDSTFlag: ld a, [wDST] res 7, a ld [wDST], a hlcoord 1, 14 lb bc, 3, 18 call ClearBox ld hl, .Text call PlaceHLTextAtBC ret .Text: text_asm call UpdateTime ldh a, [hHours] ld b, a ldh a, [hMinutes] ld c, a decoord 1, 14 farcall PrintHoursMins ld hl, .TimeAskOkayText ret .TimeAskOkayText: text_far _TimeAskOkayText text_end MrChrono: ; unreferenced hlcoord 1, 14 lb bc, 3, SCREEN_WIDTH - 2 call ClearBox ld hl, .Text call PlaceHLTextAtBC ret .Text: text_asm call UpdateTime hlcoord 1, 14 ld [hl], "R" inc hl ld [hl], "T" inc hl ld [hl], " " inc hl ld de, hRTCDayLo call .PrintTime hlcoord 1, 16 ld [hl], "D" inc hl ld [hl], "F" inc hl ld [hl], " " inc hl ld de, wStartDay call .PrintTime ld [hl], " " inc hl ld a, [wDST] bit 7, a jr z, .off ld [hl], "O" inc hl ld [hl], "N" inc hl jr .done .off ld [hl], "O" inc hl ld [hl], "F" inc hl ld [hl], "F" inc hl .done ld hl, .NowOnDebug ret .NowOnDebug: text_start para "Now on DEBUG…" prompt .PrintTime: lb bc, 1, 3 call PrintNum ld [hl], "." inc hl inc de lb bc, PRINTNUM_LEADINGZEROS | 1, 2 call PrintNum ld [hl], ":" inc hl inc de lb bc, PRINTNUM_LEADINGZEROS | 1, 2 call PrintNum ret PrintHour: ld l, e ld h, d push bc call GetTimeOfDayString call PlaceString ld l, c ld h, b inc hl pop bc call AdjustHourForAMorPM ld [wTextDecimalByte], a ld de, wTextDecimalByte call PrintTwoDigitNumberLeftAlign ret GetTimeOfDayString: ld a, c cp MORN_HOUR jr c, .nite cp DAY_HOUR jr c, .morn cp NITE_HOUR jr c, .day .nite ld de, .nite_string ret .morn ld de, .morn_string ret .day ld de, .day_string ret .nite_string: db "NITE@" .morn_string: db "MORN@" .day_string: db "DAY@" AdjustHourForAMorPM: ; Convert the hour stored in c (0-23) to a 1-12 value ld a, c or a jr z, .midnight cp NOON_HOUR ret c ret z sub NOON_HOUR ret .midnight ld a, NOON_HOUR ret