Files
oracle-of-secrets/Overworld/time_system.asm

424 lines
9.0 KiB
NASM

;----------------[ Time system ]----------------
; tiles locations on HUD
!hud_min_low = $7EC7CC
!hud_min_high = $7EC7CA
!hud_hours_low = $7EC7C6
!hud_hours_high = $7EC7C4
!hud_template = $0DFF07
org !hud_template
db $10,$24,$11,$24
db $6C,$25
db $90,$24,$90,$24
db $6C,$25,$90,$24,$90,$24 ; HUD Template(adjusts timer's color)
org $068361
JSL HUD_ClockDisplay ; $1CFF30
;originally JSL $09B06E, executed every frame
; org $1CFF30
org $328000 ; Free space
HUD_ClockDisplay:
{
JSR RunClock
JSR DrawToHud
JSL $09B06E ; Restore Garnish_ExecuteUpperSlots_long
RTL
}
DrawToHud:
{
LDX #$00
.debut
LDY #$00 : LDA $7EE000,x
.debut2
CMP #$0A : BMI .draw
SBC #$0A : INY : BRA .debut2
.draw
ADC #$90 : CPX #$01 : BEQ .minutes_low
STA.l !hud_hours_low
LDA #$30 : STA.l !hud_hours_low+1 ; white palette
BRA .continue_draw ; 04
.minutes_low
STA.l !hud_min_low
LDA #$30 : STA.l !hud_min_low+1 ; white palette
.continue_draw
TYA
CLC : ADC #$90 : CPX #$01
BEQ .minutes_high
STA.l !hud_hours_high
LDA #$30 : STA.l !hud_hours_high+1 ; white palette
BRA .finish_draw ; 04
.minutes_high
STA.l !hud_min_high
LDA #$30 : STA.l !hud_min_high+1 ; white palette
.finish_draw
INX : CPX #$02 : BMI .debut
RTS
}
;--------------------------------
RunClock:
{
LDA $10 ;checks current event in game
CMP #$07 ;dungeon/building?
BEQ .counter_increasing
CMP #$09 ;overworld?
BEQ .overworld
CMP #$0B
BEQ .overworld ;sub-area ? (under the bridge; zora domain...)
CMP #$0E ;dialog box?
BEQ .dialog
RTS
.overworld
LDA $11
CMP #$23 ;hdma transfer? (warping)
BNE .mosaic
.mosaic
CMP #$0D ;mosaic ?
BMI .counter_increasing
RTS
.dialog
LDA $11 ;which kind of dialog? (to prevent the counter from increasing if save menu or item menu openned)
CMP #$02 ;NPC/signs speech
BEQ .counter_increasing
RTS
.counter_increasing
; time speed (1,3,5,7,F,1F,3F,7F,FF)
; #$3F is almost 1 sec = 1 game minute
LDA $1A : AND #$3F ; 05
BEQ .increase_minutes
.end
RTS
.increase_minutes
LDA $7EE001 : INC A : STA $7EE001
CMP #$3C : BPL .increase_hours ; minutes = #60 ?
RTS
.increase_hours
LDA #$00 : STA $7EE001
LDA $7EE000 : INC A : STA $7EE000
CMP #$18 ; hours = #24 ?
BPL .reset_hours
;check indoors/outdoors
LDA $1B : BEQ .outdoors0
RTS
.outdoors0
JSL rom_to_buff ;update buffer palette
JSL buff_to_eff ;update effective palette
;rain layer ?
LDA $8C : CMP #$9F : BEQ .skip_bg_updt0
LDA $8C : CMP #$9E : BEQ .skip_bg_updt0 ; canopy layer ?
CMP #$97 : BEQ .skip_bg_updt0 ; fog layer?
JSL $0BFE70 ;update background color
BRA .inc_hours_end
.skip_bg_updt0 ;prevent the sub layer from disappearing ($1D zeroed)
JSL $0BFE72
.inc_hours_end
RTS
.reset_hours
LDA #$00 : STA $7EE000
;check indoors/outdoors
LDA $1B : BEQ .outdoors1
RTS
.outdoors1
JSL rom_to_buff
JSL buff_to_eff
LDA $8C : CMP #$9F ;rain layer ?
BEQ .skip_bg_updt1
LDA $8C : CMP #$9E : BEQ .skip_bg_updt1 ; canopy layer ?
JSL $0BFE70 ;update background color
BRA .reset_end
.skip_bg_updt1 ;prevent the sub layer from disappearing ($1D zeroed)
JSL $0BFE72
.reset_end
RTS
}
;-----------------------------------------------
;----[ Day / Night system * palette effect ]----
;-----------------------------------------------
!blue_value = $7EE010
!green_value = $7EE012
!red_value = $7EE014
!temp_value = $7EE016
!pal_color = $7EE018
org $02FF80 ; free space on bank $02
buff_to_eff:
JSR $C769 ; $02:C65F -> palette buffer to effective routine
RTL
rom_to_buff:
JSR $AAF4 ; $02:AAF4 -> change buffer palette of trees,houses,rivers,etc.
JSR $C692 ; $02:C692 -> rom to palette buffer for other colors
RTL
; part of rom pal to buffer routine
;$1B/EF61 9F 00 C3 7E STA $7EC300,x[$7E:C422]
;$1B/EF3D 9F 00 C3 7E STA $7EC300,x[$7E:C412]
;$1B/EF84 9F 00 C3 7E STA $7EC300,x[$7E:C4B2]
org $1BEF3D
JSL LoadDayNightPaletteEffect
org $1BEF61
JSL LoadDayNightPaletteEffect
org $1BEF84
JSL LoadDayNightPaletteEffect
org $0EEE25 ; free space
LoadDayNightPaletteEffect:
{
STA.l !pal_color
CPX #$0041 : BPL .title_check
STA $7EC300,X
RTL
.title_check
LDA $10 : AND #$00FF
CMP #$0002 ; title or file select screen ?
BPL .outin_check
LDA.l !pal_color : STA $7EC300,X
RTL
.outin_check
LDA $1B : AND #$00FF : BEQ .outdoors2
LDA.l !pal_color
STA $7EC300,X
RTL
.outdoors2
PHX
JSL ColorSubEffect
PLX
STA.l $7EC300,X
RTL
}
;--------------------------------
ColorSubEffect:
{
LDA $7EE000 ; LDA #hours
AND #$00FF
CLC
ADC $7EE000 ; #hours * 2
AND #$00FF
TAX
.do_blue
LDA.l !pal_color : AND #$7C00 : STA !blue_value
; substract amount to blue field based on a table
SEC : SBC.l blue_table, X : STA !temp_value
AND #$7C00 ; mask out everything except the blue bits
CMP !temp_value ; overflow ?
BEQ .no_blue_sign_change
.blue_sign_change
LDA #$0400 ; LDA smallest blue value
.no_blue_sign_change
STA.l !blue_value
do_green:
LDA !pal_color : AND #$03E0 : STA !green_value
SEC : SBC.l green_table,x ; substract amount to blue field based on a table
STA.l !temp_value
; mask out everything except the green bits
AND #$03E0 : CMP !temp_value ; overflow ?
BEQ .no_green_sign_change
.green_sign_change
LDA #$0020 ; LDA smallest green value
.no_green_sign_change
STA.l !green_value
.do_red
LDA.l !pal_color : AND #$001F : STA.l !red_value
SEC : SBC.l red_table,x ; substract amount to red field based on a table
STA.l !temp_value
AND #$001F ; mask out everything except the red bits
CMP !temp_value ; overflow ?
BEQ .no_red_sign_change
.red_sign_change
LDA #$0001 ; LDA smallest red value
.no_red_sign_change
STA.l !red_value
LDA.l !blue_value
ORA.l !green_value
ORA.l !red_value
RTL
}
; color_sub_tables : 24 * 2 bytes each = 48 bytes (2 bytes = 1 color sub for each hour)
blue_table:
dw $1000, $1000, $1000, $1000
dw $1000, $1000, $1000, $0800
dw $0000, $0000, $0000, $0000
dw $0000, $0000, $0000, $0000
dw $0000, $0400, $0800, $0800
dw $0800, $1000, $1000, $1000
green_table:
dw $0100, $0100, $0100, $0100
dw $0100, $00C0, $0080, $0040
dw $0000, $0000, $0000, $0000
dw $0000, $0000, $0000, $0000
dw $0000, $0020, $0040, $0080
dw $00C0, $0100, $0100, $0100
red_table:
dw $0008, $0008, $0008, $0008
dw $0008, $0006, $0004, $0002
dw $0000, $0000, $0000, $0000
dw $0000, $0000, $0000, $0000
dw $0000, $0000, $0000, $0002
dw $0004, $0006, $0008, $0008
BackgroundFix:
{
BEQ .no_effect ;BRAnch if A=#$0000 (transparent bg)
JSL ColorSubEffect
.no_effect:
STA.l $7EC500
STA.l $7EC300
STA.l $7EC540
STA.l $7EC340
rtl
}
SubAreasFix:
{
STA.l !pal_color
PHX
JSL ColorSubEffect
PLX
STA $7EC300
STA $7EC340
rtl
}
GlovesFix:
{
STA.l !pal_color
LDA $1B
AND #$00FF
BEQ .outdoors3
LDA.l !pal_color
STA $7EC4FA
RTL
.outdoors3:
PHX
JSL ColorSubEffect
PLX
STA $7EC4FA
RTL
}
CheckIfNight:
{
LDA $7EE000 : CMP.b #$06
BCC .night_time
.day_time
LDA.l $7EF3C5
RTL
.night_time
LDA $7EE000 : CMP.b #$14
BCS .day_time
LDA.l $7EF3C5
CLC
ADC #$01
RTL
}
warnpc $0EF3F9 ; free space
org $09C4E3
JSL CheckIfNight
; $0BFE70 -> background color loading routine
;Background color write fix - 16 bytes
;$0B/FEB6 8F 00 C5 7E STA $7EC500
;$0B/FEBA 8F 00 C3 7E STA $7EC300
;$0B/FEBE 8F 40 C5 7E STA $7EC540
;$0B/FEC2 8F 40 C3 7E STA $7EC340
; Custom BG Color Mosaic Background Color fix
org $028464
NOP #6
org $02AE92
NOP #6
; org $0BFEB6 OLD HOOK
; ZS OW Expanded - ReplaceBGColor
org $2886B4
STA !pal_color
JSL BackgroundFix
;NOP #8
; ZS OW Expanded - CheckForChangeGraphicsTransitionLoad
org $2885F9
JSL SubAreasFix
; Subareas background color fix (under the bridge; zora...)
;$0E/D601 8F 00 C3 7E STA $7EC300[$7E:C300]
;$0E/D605 8F 40 C3 7E STA $7EC340[$7E:C340]
org $0ED601
JSL SubAreasFix
;--------------------------------
; Gloves color loading routine
;$1B/EE1B C2 30 REP #$30
;$1B/EE1D AF 54 F3 7E LDA $7EF354[$7E:F354]
;$1B/EE21 29 FF 00 AND #$00FF
;$1B/EE24 F0 0F BEQ $0F [$EE35]
;$1B/EE26 3A DEC A
;$1B/EE27 0A ASL A
;$1B/EE28 AA TAX
;$1B/EE29 BF F5 ED 1B LDA $1BEDF5,x[$1B:EDF7]
;$1B/EE2D 8F FA C4 7E STA $7EC4FA[$7E:C4FA]
;$1B/EE31 8F FA C6 7E STA $7EC6FA[$7E:C6FA]
;$1B/EE35 E2 30 SEP #$30
;$1B/EE37 E6 15 INC $15 [$00:0015]
;$1B/EE39 6B RTL
org $1BEE2D
JSL GlovesFix