mirror of https://github.com/pret/pokecrystal.git
726 lines
10 KiB
NASM
726 lines
10 KiB
NASM
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 "<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 [wDeciramBuffer], a
|
|
ld de, wDeciramBuffer
|
|
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
|