Add menu journal with main quest and side quest hints and progression tracking

This commit is contained in:
scawful
2025-12-08 21:46:33 -05:00
parent 851da89644
commit 6c6e6a0bc6
4 changed files with 475 additions and 94 deletions

View File

@@ -476,8 +476,28 @@ FOLLOWERING = $7EF3D3
UNUSED_7EF3D4 = $7EF3D4 UNUSED_7EF3D4 = $7EF3D4
UNUSED_7EF3D5 = $7EF3D5 UNUSED_7EF3D5 = $7EF3D5
UNUSED_7EF3D6 = $7EF3D6 UNUSED_7EF3D6 = $7EF3D6
UNUSED_7EF3D7 = $7EF3D7
UNUSED_7EF3D8 = $7EF3D8 ; Side Quest Progress Flags
; .dgo mwcn
; n - Met Mask Salesman (shown "need Ocarina" dialogue)
; c - Found cursed Cucco at ranch (shown first dialogue)
; w - Found withering Deku Scrub (shown first dialogue)
; m - Got Mushroom from Toadstool Woods
; o - Old Man Mountain quest active
; g - Goron quest active (collecting rock meat)
; d - (reserved)
SideQuestProg = $7EF3D7
; Side Quest Progress Flags 2
; .bts pfmr
; r - Ranch Girl transformed back (dialogue shown)
; m - Mask Salesman taught Song of Healing
; f - Fortune teller visited (any fortune)
; p - Potion shop visited with mushroom
; s - Deku Scrub soul freed (before mask given)
; t - Tingle met (any map purchased)
; b - Bean beanstalk grown (final stage)
SideQuestProg2 = $7EF3D8
; Player name ; Player name
NAME1L = $7EF3D9 NAME1L = $7EF3D9

View File

@@ -233,6 +233,8 @@ Menu_CheckForSpecialMenus:
LDA.b $F6 : BIT.b #$80 : BEQ ++ LDA.b $F6 : BIT.b #$80 : BEQ ++
LDA.b #!MENU_STATE_JOURNAL : STA.w $0200 LDA.b #!MENU_STATE_JOURNAL : STA.w $0200
JSR Menu_DeleteCursor JSR Menu_DeleteCursor
REP #$20
LDA.w #$0000 : STA.l JournalState ; Reset to first page
JSL Menu_DrawJournal JSL Menu_DrawJournal
SEP #$30 SEP #$30
SEC : RTS ; Return Carry Set SEC : RTS ; Return Carry Set
@@ -327,6 +329,21 @@ incsrc "menu_scroll.asm"
Menu_StatsScreen: Menu_StatsScreen:
{ {
JSR Menu_CheckHScroll JSR Menu_CheckHScroll
; Check X button to open Journal
LDA.b $F6 : BIT.b #$40 : BEQ .no_journal
LDA.b #!MENU_STATE_JOURNAL : STA.w $0200
REP #$20
LDA.w #$0000 : STA.l JournalState ; Reset to first page
JSL Menu_DrawJournal
SEP #$30
; Set VRAM upload for right side (quest screen)
LDA.b #$23 : STA.w $0116
LDA.b #$01 : STA.b $17
; Play menu open sound
LDA.b #$11 : STA.w $012F
.no_journal
; JSR Menu_StatsScreen_Input ; Selection disabled per user request ; JSR Menu_StatsScreen_Input ; Selection disabled per user request
RTS RTS
} }
@@ -462,7 +479,7 @@ Menu_RefreshInventoryScreen:
JSR Menu_DrawSelect JSR Menu_DrawSelect
JSR Menu_DrawRingPrompt JSR Menu_DrawRingPrompt
JSR Menu_DrawItemName JSR Menu_DrawItemName
; Palette restore if needed (mimicking Menu_UploadLeft) ; Palette restore if needed (mimicking Menu_UploadLeft)
REP #$30 REP #$30
LDX.w #$3E LDX.w #$3E
@@ -472,7 +489,7 @@ Menu_RefreshInventoryScreen:
DEX : DEX DEX : DEX
BPL .loop BPL .loop
SEP #$30 SEP #$30
RTS RTS
} }
@@ -639,7 +656,7 @@ MagicBag_ConsumeItem:
{ {
; Check for A button press ; Check for A button press
LDA.b $F6 : BIT.b #$80 : BEQ .exit LDA.b $F6 : BIT.b #$80 : BEQ .exit
REP #$30 REP #$30
; Calculate SRAM address for current item (4 bytes per entry) ; Calculate SRAM address for current item (4 bytes per entry)
LDA.w $020B : ASL #2 : TAX LDA.w $020B : ASL #2 : TAX
@@ -650,15 +667,15 @@ MagicBag_ConsumeItem:
; Handle Consumption ; Handle Consumption
PHB : LDA $02 : PHA : PLB PHB : LDA $02 : PHA : PLB
LDA ($00) : BEQ .error_dbr LDA ($00) : BEQ .error_dbr
; Call Handler ; Call Handler
JSL Link_ConsumeMagicBagItem JSL Link_ConsumeMagicBagItem
BCC .failed_use_dbr BCC .failed_use_dbr
; Success -> Decrement ; Success -> Decrement
LDA ($00) : DEC A : STA ($00) LDA ($00) : DEC A : STA ($00)
PLB PLB
; Sound ; Sound
LDA.b #$35 : STA.w $012F LDA.b #$35 : STA.w $012F
BRA .exit BRA .exit
@@ -882,9 +899,39 @@ Menu_Journal:
{ {
JSL Journal_Handler JSL Journal_Handler
JSR Submenu_Return ; Check if we should return (A or Start pressed)
LDA.b $F6 : BIT.b #$80 : BNE .return_pressed
LDA.b $F4 : BIT.b #$10 : BNE .close_menu
BRA .continue
LDA.b #$22 : STA.w $0116 .close_menu
LDA.b #$12 : STA.w $012F ; Play menu close sound
LDA.b #!MENU_STATE_SCROLL_UP : STA.w $0200
BRA .continue
.return_pressed
LDA.b #$12 : STA.w $012F ; Play menu close sound
; Check which side we came from using $E5 (high byte of $E4)
; $E4 = $0000 for left, $0100 for right (quest screen)
LDA.b $E5 : BNE .return_to_quest
; Return to inventory (left side)
LDA.b #!MENU_STATE_SUBMENU_RETURN : STA.w $0200
BRA .continue
.return_to_quest
; Return to quest screen (right side)
JSR Menu_RefreshQuestScreen
LDA.b #!MENU_STATE_STATS_SCREEN : STA.w $0200
.continue
; Set VRAM upload address based on which side we're on
; $E4 is 16-bit: $0000 = left, $0100 = right (quest screen)
; Check high byte $E5 to detect quest screen
LDA.b $E5 : BNE .quest_side
LDA.b #$22 : BRA .set_vram ; Left side (inventory)
.quest_side
LDA.b #$23 ; Right side (quest)
.set_vram
STA.w $0116
LDA.b #$01 : STA.b $17 LDA.b #$01 : STA.b $17
RTS RTS
} }
@@ -920,4 +967,4 @@ incsrc "menu_map_names.asm"
incsrc "menu_hud.asm" incsrc "menu_hud.asm"
%log_end("Menu/menu_hud.asm", !LOG_MENU) %log_end("Menu/menu_hud.asm", !LOG_MENU)
incsrc "menu_journal.asm" incsrc "menu_journal.asm"
%log_end("Menu/menu_journal.asm", !LOG_MENU) %log_end("Menu/menu_journal.asm", !LOG_MENU)

View File

@@ -7,6 +7,7 @@
Journal_Handler: Journal_Handler:
{ {
PHB : PHK : PLB PHB : PHK : PLB
SEP #$30 ; Ensure 8-bit A and X/Y for input handling
; Check timer ; Check timer
LDA.w $0207 : BEQ .process_input LDA.w $0207 : BEQ .process_input
@@ -20,9 +21,10 @@ Journal_Handler:
JSR Journal_PrevPage JSR Journal_PrevPage
JSL Menu_DrawJournal JSL Menu_DrawJournal
SEP #$30 SEP #$30
LDA.b #$0A : STA.w $0207 ; Set delay LDA.b #$20 : STA.w $012F ; Play page scroll sound
LDA.b #$0A : STA.w $0207 ; Set delay
JMP .exit JMP .exit
.check_right .check_right
; Check for R button press ; Check for R button press
LDA.b $F2 : BIT.b #$10 : BEQ .exit LDA.b $F2 : BIT.b #$10 : BEQ .exit
@@ -30,7 +32,8 @@ Journal_Handler:
JSR Journal_NextPage JSR Journal_NextPage
JSL Menu_DrawJournal JSL Menu_DrawJournal
SEP #$30 SEP #$30
LDA.b #$0A : STA.w $0207 ; Set delay LDA.b #$20 : STA.w $012F ; Play page scroll sound
LDA.b #$0A : STA.w $0207 ; Set delay
.exit .exit
SEP #$30 SEP #$30
@@ -44,12 +47,12 @@ Journal_Handler:
Journal_PrevPage: Journal_PrevPage:
{ {
LDA.l JournalState LDA.l JournalState
AND.w #$00FF : BEQ .wrap_to_last AND.w #$00FF : BEQ .wrap_to_last
DEC A DEC A
STA.l JournalState STA.l JournalState
RTS RTS
.wrap_to_last .wrap_to_last
; Find total count to wrap to last ; Find total count to wrap to last
JSR Journal_CountUnlocked JSR Journal_CountUnlocked
@@ -60,9 +63,9 @@ Journal_PrevPage:
Journal_NextPage: Journal_NextPage:
{ {
LDA.l JournalState LDA.l JournalState
AND.w #$00FF : INC A : STA.b $00 AND.w #$00FF : INC A : STA.b $00
; Check if next page exists ; Check if next page exists
LDA.b $00 LDA.b $00
JSR Journal_GetNthEntry JSR Journal_GetNthEntry
@@ -70,7 +73,7 @@ Journal_NextPage:
LDA.b $00 LDA.b $00
STA.l JournalState STA.l JournalState
RTS RTS
.wrap_to_first .wrap_to_first
LDA.w #$0000 LDA.w #$0000
STA.l JournalState STA.l JournalState
@@ -87,19 +90,19 @@ Journal_GetNthEntry:
{ {
PHA PHA
LDY.w #$0000 ; Master List Index LDY.w #$0000 ; Master List Index
.loop .loop
; Check if we reached end of list ; Check if we reached end of list
LDA.w Journal_MasterList, Y : BEQ .end_of_list LDA.w Journal_MasterList, Y : BEQ .end_of_list
; Check Flag ; Check Flag
; Format: dd dd dd mm (Address Long, Mask) ; Format: dd dd dd mm (Address Long, Mask)
; But we can't indirect long easily without setup. ; But we can't indirect long easily without setup.
; Let's read address to $00. ; Let's read address to $00.
LDA.w Journal_MasterList, Y : STA.b $02 LDA.w Journal_MasterList, Y : STA.b $02
LDA.w Journal_MasterList+2, Y : STA.b $04 ; Get mask in low byte of $04 LDA.w Journal_MasterList+2, Y : STA.b $04 ; Get mask in low byte of $04
SEP #$20 SEP #$20
; $04 = Bank, $05 = Mask (from 16-bit read above) ; $04 = Bank, $05 = Mask (from 16-bit read above)
@@ -114,23 +117,23 @@ Journal_GetNthEntry:
; $04 = Bank ; $04 = Bank
; $05 = Mask ; $05 = Mask
; The AND above reads from ROM directly. ; The AND above reads from ROM directly.
BEQ .locked BEQ .locked
; Unlocked ; Unlocked
PLA : DEC A : PHA ; Decrement target index PLA : DEC A : PHA ; Decrement target index
BMI .found BMI .found
.locked .locked
REP #$20 REP #$20
TYA : CLC : ADC.w #$0006 : TAY ; Next Entry (4 bytes header + 2 bytes ptr = 6) TYA : CLC : ADC.w #$0006 : TAY ; Next Entry (4 bytes header + 2 bytes ptr = 6)
BRA .loop BRA .loop
.found .found
REP #$20 REP #$20
PLA ; Clean stack PLA ; Clean stack
LDA.w Journal_MasterList+4, Y : TAX LDA.w Journal_MasterList+4, Y : TAX
RTS RTS
.end_of_list .end_of_list
REP #$20 REP #$20
PLA ; Clean stack PLA ; Clean stack
@@ -142,14 +145,14 @@ Journal_CountUnlocked:
{ {
LDY.w #$0000 ; Master List Index LDY.w #$0000 ; Master List Index
LDA.w #$0000 : STA.b $06 ; Counter LDA.w #$0000 : STA.b $06 ; Counter
.loop .loop
LDA.w Journal_MasterList, Y : BEQ .done LDA.w Journal_MasterList, Y : BEQ .done
; Check Flag ; Check Flag
LDA.w Journal_MasterList, Y : STA.b $02 LDA.w Journal_MasterList, Y : STA.b $02
LDA.w Journal_MasterList+2, Y : STA.b $04 LDA.w Journal_MasterList+2, Y : STA.b $04
SEP #$20 SEP #$20
PHB ; Save current data bank PHB ; Save current data bank
LDA.b $04 : PHA : PLB ; Set DB to address bank LDA.b $04 : PHA : PLB ; Set DB to address bank
@@ -164,7 +167,7 @@ Journal_CountUnlocked:
REP #$20 REP #$20
TYA : CLC : ADC.w #$0006 : TAY TYA : CLC : ADC.w #$0006 : TAY
BRA .loop BRA .loop
.done .done
LDA.b $06 LDA.b $06
RTS RTS
@@ -180,7 +183,7 @@ Journal_DrawEntry:
LDA.l JournalState : AND.w #$00FF LDA.l JournalState : AND.w #$00FF
JSR Journal_GetNthEntry JSR Journal_GetNthEntry
STX.b $00 ; Store Text Pointer STX.b $00 ; Store Text Pointer
CPX.w #$0000 : BNE .valid CPX.w #$0000 : BNE .valid
; Draw "Empty" if no entry found (shouldn't happen with correct logic) ; Draw "Empty" if no entry found (shouldn't happen with correct logic)
RTS RTS
@@ -188,39 +191,51 @@ Journal_DrawEntry:
LDX.w #$0000 ; Text Offset LDX.w #$0000 ; Text Offset
LDY.w #$0000 ; VRAM Offset LDY.w #$0000 ; VRAM Offset
.loop .loop
PHY ; Save VRAM offset PHY ; Save VRAM offset
TXY ; Y = Text Offset TXY ; Y = Text Offset
LDA ($00), Y ; Read word from text LDA ($00), Y ; Read word from text
PLY ; Restore VRAM offset PLY ; Restore VRAM offset
CMP.w #$FFFF : BEQ .done ; Check for terminator CMP.w #$FFFF : BEQ .done ; Check for terminator
STA.w $1292, Y ; Write to VRAM buffer (Row 1) STA.w $1292, Y ; Write to VRAM buffer (Row 1)
INY #2 ; Next VRAM word INY #2 ; Next VRAM word
INX #2 ; Next Text word INX #2 ; Next Text word
; Wrap logic for multiple lines ; Wrap logic for multiple lines (up to 9 lines supported)
; Line 1 ends at $1292 + $20 (32 bytes) = $12B2? ; Row Width = $40 bytes (32 tiles * 2 bytes)
; Let's just assume the text includes padding or we handle newlines? ; Each line is 16 chars ($20 bytes), then skip $20 to next row
; Simplified: The text data is pre-formatted to 16 chars per line.
; We just copy linear data to linear VRAM.
; But VRAM is linear in rows? Yes, usually.
; However, to jump to next line in tilemap we need to add stride.
; Row Width = $40 bytes (32 tiles * 2 bytes).
; If we write 16 chars (32 bytes), we need to skip 32 bytes to reach next line.
CPY.w #$0020 : BNE .check_line_2 CPY.w #$0020 : BNE .check_line_2
TYA : CLC : ADC.w #$0020 : TAY ; Skip to next line start TYA : CLC : ADC.w #$0020 : TAY
.check_line_2 .check_line_2
CPY.w #$0060 : BNE .check_line_3 ; End of Line 2 ($20 + $40 = $60) CPY.w #$0060 : BNE .check_line_3
TYA : CLC : ADC.w #$0020 : TAY TYA : CLC : ADC.w #$0020 : TAY
.check_line_3 .check_line_3
CPY.w #$00A0 : BNE .check_line_4
TYA : CLC : ADC.w #$0020 : TAY
.check_line_4
CPY.w #$00E0 : BNE .check_line_5
TYA : CLC : ADC.w #$0020 : TAY
.check_line_5
CPY.w #$0120 : BNE .check_line_6
TYA : CLC : ADC.w #$0020 : TAY
.check_line_6
CPY.w #$0160 : BNE .check_line_7
TYA : CLC : ADC.w #$0020 : TAY
.check_line_7
CPY.w #$01A0 : BNE .check_line_8
TYA : CLC : ADC.w #$0020 : TAY
.check_line_8
CPY.w #$01E0 : BNE .check_line_9
TYA : CLC : ADC.w #$0020 : TAY
.check_line_9
BRA .loop BRA .loop
.done .done
SEP #$30 SEP #$30
RTS RTS
@@ -232,27 +247,335 @@ Journal_DrawEntry:
; Format: Address(3), Mask(1), TextPtr(2) = 6 bytes ; Format: Address(3), Mask(1), TextPtr(2) = 6 bytes
Journal_MasterList: Journal_MasterList:
dl $7EF3D6 : db $02 : dw Entry_QuestStart ; OOSPROG bit 1 (Quest Start) ; === Chapter 0: A Hero is Born ===
dl $7EF3D6 : db $10 : dw Entry_MetElder ; OOSPROG bit 4 (Met Elder) dl $7EF3C5 : db $02 : dw Entry_TheCall ; GameState = $02 (Farore intro)
dl $7EF3C6 : db $04 : dw Entry_MakuTree ; OOSPROG2 bit 2 (Maku Tree) dl $7EF3C6 : db $04 : dw Entry_CastAway ; OOSPROG2 bit 2 (Kydrog intro)
; === Chapter 1: The Maku Tree ===
dl $7EF3D4 : db $01 : dw Entry_MakuTree ; MakuTreeQuest = $01
dl $7EF3C7 : db $01 : dw Entry_FirstEssence ; MapIcon = $01 (Mushroom Grotto)
; === Ocarina Quest Chain (HINT -> PROGRESS -> COMPLETE) ===
dl $7EF3D7 : db $01 : dw Entry_MaskShop ; SideQuestProg bit 0 (met salesman)
dl $7EF3D7 : db $02 : dw Entry_CursedGirl ; SideQuestProg bit 1 (found cucco)
dl $7EF3D7 : db $08 : dw Entry_GotMushroom ; SideQuestProg bit 3 (got mushroom)
dl $7EF344 : db $02 : dw Entry_GotPowder ; MagicPowder = $02
dl $7EF3D8 : db $01 : dw Entry_CurseBroken ; SideQuestProg2 bit 0 (ranch girl)
dl $7EF3D8 : db $04 : dw Entry_SongLearned ; SideQuestProg2 bit 2 (song taught)
; === Deku Mask Chain ===
dl $7EF3D7 : db $04 : dw Entry_DyingDeku ; SideQuestProg bit 2 (found deku)
dl $7EF3D8 : db $10 : dw Entry_DekuFreed ; SideQuestProg2 bit 4 (soul freed)
dl $7EF349 : db $01 : dw Entry_DekuMask ; DekuMask obtained
; === Dungeon Completions ===
dl $7EF398 : db $01 : dw Entry_D1Complete ; Scrolls bit 0 (Mushroom Grotto)
dl $7EF398 : db $02 : dw Entry_D2Complete ; Scrolls bit 1 (Tail Palace)
dl $7EF398 : db $04 : dw Entry_D3Complete ; Scrolls bit 2 (Kalyxo Castle)
dl $7EF398 : db $08 : dw Entry_D4Complete ; Scrolls bit 3 (Zora Temple)
dl $7EF398 : db $10 : dw Entry_D5Complete ; Scrolls bit 4 (Glacia Estate)
dl $7EF398 : db $20 : dw Entry_D6Complete ; Scrolls bit 5 (Goron Mines)
dl $7EF398 : db $40 : dw Entry_D7Complete ; Scrolls bit 6 (Dragon Ship)
; === Mask Collection ===
dl $7EF347 : db $01 : dw Entry_ZoraMask ; ZoraMask obtained
dl $7EF358 : db $01 : dw Entry_WolfMask ; WolfMask obtained
dl $7EF348 : db $01 : dw Entry_BunnyHood ; BunnyHood obtained
; === Other Side Quests ===
dl $7EF39B : db $01 : dw Entry_BeanPlanted ; MagicBeanProg bit 0 (planted)
dl $7EF3D7 : db $10 : dw Entry_OldManQuest ; SideQuestProg bit 4 (old man)
dl $7EF3D7 : db $20 : dw Entry_GoronQuest ; SideQuestProg bit 5 (goron)
dw $0000 ; Terminator dw $0000 ; Terminator
Entry_QuestStart: ; ---------------------------------------------------------
dw "Quest_Started___" ; Chapter 0: A Hero is Born
dw "Find_the_3_gems_" ; ---------------------------------------------------------
dw "to_save_Hyrule__"
Entry_TheCall:
dw "THE_CALL________"
dw "________________"
dw "A_VOICE_CALLED__"
dw "OUT_TO_ME..._IT_"
dw "SAID_ACCEPT_THIS"
dw "QUEST__HERO.____"
dw $FFFF dw $FFFF
Entry_MetElder: Entry_CastAway:
dw "Spoke_to_Elder__" dw "CAST_AWAY_______"
dw "He_mentioned_a__" dw "________________"
dw "missing_girl____" dw "KYDROG_TOOK_____"
dw "FARORE_AND_CAST_"
dw "ME_TO_THE_ABYSS."
dw "FIND_MAKU_TREE._"
dw $FFFF dw $FFFF
; ---------------------------------------------------------
; Chapter 1: The Maku Tree
; ---------------------------------------------------------
Entry_MakuTree: Entry_MakuTree:
dw "Met_Maku_Tree___" dw "THE_MAKU_TREE___"
dw "He_needs_his____" dw "________________"
dw "memory_back_____" dw "I_FOUND_THE_____"
dw "MAKU_TREE._IMPA_"
dw "AWAITS_IN_THE___"
dw "HALL_OF_SECRETS."
dw $FFFF
Entry_FirstEssence:
dw "FIRST_ESSENCE___"
dw "________________"
dw "DARKNESS_LURKS__"
dw "IN_THE_MUSHROOM_"
dw "GROTTO_TO_THE___"
dw "WEST.___________"
dw $FFFF
; ---------------------------------------------------------
; Ocarina Quest Chain
; ---------------------------------------------------------
Entry_MaskShop:
dw "MASK_SHOP_______"
dw "________________"
dw "A_SALESMAN_EAST_"
dw "OF_VILLAGE_SELLS"
dw "MASKS._HE_NEEDS_"
dw "ME_TO_HAVE_AN___"
dw "OCARINA._A_GIRL_"
dw "AT_TOTO_RANCH___"
dw "MIGHT_HELP._____"
dw $FFFF
Entry_CursedGirl:
dw "CURSED_GIRL_____"
dw "________________"
dw "A_GIRL_AT_TOTO__"
dw "RANCH_IS_CURSED!"
dw "SHE_HAS_BEEN____"
dw "TURNED_INTO_A___"
dw "CUCCO._MAGIC____"
dw "POWDER_MIGHT____"
dw "BREAK_THE_SPELL."
dw $FFFF
Entry_GotMushroom:
dw "STRANGE_MUSHROOM"
dw "________________"
dw "FOUND_A_STRANGE_"
dw "MUSHROOM_IN_THE_"
dw "WOODS._THE______"
dw "POTION_SHOP_____"
dw "MIGHT_WANT_THIS."
dw $FFFF
Entry_GotPowder:
dw "MAGIC_POWDER____"
dw "________________"
dw "THE_WITCH_MADE__"
dw "POWDER_FROM_THE_"
dw "MUSHROOM._IT_HAS"
dw "TRANSFORMATIVE__"
dw "POWER.__________"
dw $FFFF
Entry_CurseBroken:
dw "CURSE_BROKEN____"
dw "________________"
dw "THE_POWDER______"
dw "BROKE_THE_CURSE!"
dw "THE_RANCH_GIRL__"
dw "GAVE_ME_HER_____"
dw "OCARINA_AND_____"
dw "TAUGHT_ME_THE___"
dw "SONG_OF_STORMS._"
dw $FFFF
Entry_SongLearned:
dw "SONG_OF_HEALING_"
dw "________________"
dw "THE_MASK________"
dw "SALESMAN_TAUGHT_"
dw "ME_THE_SONG_OF__"
dw "HEALING._IT_CAN_"
dw "FREE_TROUBLED___"
dw "SPIRITS_FROM____"
dw "THEIR_PAIN._____"
dw $FFFF
; ---------------------------------------------------------
; Deku Mask Chain
; ---------------------------------------------------------
Entry_DyingDeku:
dw "DYING_DEKU______"
dw "________________"
dw "A_DEKU_SCRUB_IN_"
dw "THE_WOODS_IS____"
dw "WITHERING_AWAY._"
dw "HIS_SPIRIT_SEEMS"
dw "TROUBLED..._____"
dw "PERHAPS_A_______"
dw "HEALING_MELODY?_"
dw $FFFF
Entry_DekuFreed:
dw "DEKU_FREED______"
dw "________________"
dw "THE_SONG_FREED__"
dw "THE_DEKUS_______"
dw "TORTURED_SOUL.__"
dw "HE_LEFT_BEHIND__"
dw "A_MASK..._______"
dw $FFFF
Entry_DekuMask:
dw "DEKU_MASK_______"
dw "________________"
dw "WITH_THE_DEKU___"
dw "MASK_I_CAN_TAKE_"
dw "DEKU_FORM._THIS_"
dw "WILL_HELP_ME____"
dw "TRAVERSE_THE____"
dw "SWAMPS_TO_______"
dw "TAIL_PALACE.____"
dw $FFFF
; ---------------------------------------------------------
; Dungeon Completions
; ---------------------------------------------------------
Entry_D1Complete:
dw "GROTTO_CLEARED__"
dw "________________"
dw "THE_MUSHROOM____"
dw "GROTTO_IS_FREE__"
dw "OF_EVIL._I_FOUND"
dw "THE_BOW_WITHIN._"
dw $FFFF
Entry_D2Complete:
dw "TAIL_PALACE_____"
dw "________________"
dw "MOLDORM_FALLS.__"
dw "THE_ROCS_FEATHER"
dw "GRANTS_ME_THE___"
dw "GIFT_OF_FLIGHT._"
dw $FFFF
Entry_D3Complete:
dw "KALYXO_CASTLE___"
dw "________________"
dw "THE_CASTLE_IS___"
dw "RECLAIMED._THE__"
dw "MEADOW_BLADE____"
dw "IS_MINE.________"
dw $FFFF
Entry_D4Complete:
dw "ZORA_TEMPLE_____"
dw "________________"
dw "THE_WATERS_ARE__"
dw "PURIFIED._THE___"
dw "HOOKSHOT_WILL___"
dw "AID_MY_QUEST.___"
dw $FFFF
Entry_D5Complete:
dw "GLACIA_ESTATE___"
dw "________________"
dw "TWINROVA_IS_____"
dw "DEFEATED._THE___"
dw "FIRE_ROD_MELTS__"
dw "ALL_OBSTACLES.__"
dw $FFFF
Entry_D6Complete:
dw "GORON_MINES_____"
dw "________________"
dw "THE_MINES_ARE___"
dw "SAFE._THE_HAMMER"
dw "BREAKS_THROUGH__"
dw "ANY_BARRIER.____"
dw $FFFF
Entry_D7Complete:
dw "DRAGON_SHIP_____"
dw "________________"
dw "THE_ANCIENT_SHIP"
dw "YIELDS_ITS______"
dw "SECRET:_THE_____"
dw "SOMARIA_ROD.____"
dw $FFFF
; ---------------------------------------------------------
; Mask Collection
; ---------------------------------------------------------
Entry_ZoraMask:
dw "ZORA_MASK_______"
dw "________________"
dw "THE_PRINCESS____"
dw "GAVE_ME_A_MASK._"
dw "I_CAN_BREATHE___"
dw "UNDERWATER._____"
dw $FFFF
Entry_WolfMask:
dw "WOLF_MASK_______"
dw "________________"
dw "THE_WOLFOS______"
dw "SPIRIT_IS_AT____"
dw "PEACE._ITS_MASK_"
dw "GRANTS_SPEED____"
dw "AT_NIGHT._______"
dw $FFFF
Entry_BunnyHood:
dw "BUNNY_HOOD______"
dw "________________"
dw "THE_MASK________"
dw "SALESMAN_SOLD___"
dw "ME_A_BUNNY_HOOD."
dw "I_CAN_RUN_______"
dw "FASTER_NOW._____"
dw $FFFF
; ---------------------------------------------------------
; Other Side Quests
; ---------------------------------------------------------
Entry_BeanPlanted:
dw "MAGIC_BEAN______"
dw "________________"
dw "I_PLANTED_A_____"
dw "MAGIC_BEAN._IT__"
dw "NEEDS_WATER_AND_"
dw "A_BEES_BLESSING."
dw $FFFF
Entry_OldManQuest:
dw "OLD_MAN_________"
dw "________________"
dw "AN_OLD_MAN_IS___"
dw "LOST_IN_THE_____"
dw "LAVA_LANDS._IF_I"
dw "ESCORT_HIM_HOME_"
dw "HE_MAY_REWARD___"
dw "ME._____________"
dw $FFFF
Entry_GoronQuest:
dw "GORON_QUEST_____"
dw "________________"
dw "THE_GORON_NEEDS_"
dw "5_ROCK_SIRLOINS_"
dw "TO_OPEN_THE_____"
dw "MINES._I_SHOULD_"
dw "SEARCH_THE______"
dw "MOUNTAINS.______"
dw $FFFF dw $FFFF
; --------------------------------------------------------- ; ---------------------------------------------------------
@@ -263,39 +586,30 @@ Menu_DrawJournal:
{ {
PHB : PHK : PLB PHB : PHK : PLB
REP #$30 REP #$30
; Logic to choose background based on page number? ; Page selection logic:
; For now just cycle them 1-2-3-1-2-3 ; 0 -> First page background
LDA.l JournalState : AND.w #$00FF ; Last -> Last page background
CLC : ADC.b #$01 ; Make 1-based? ; Else -> Middle page background
; Modulo 3?
; Simple: LDA.l JournalState : AND.w #$00FF : BNE .not_first
; 0 -> First ; JournalState == 0, draw first page
; Last -> Last JSR Journal_DrawFirstPage
; Else -> Middle BRA .draw_entry
.not_first
; But we don't know which is last without counting.
; Let's just use First for 0, Last for Last, Middle for others. ; Check if this is the last page
LDA.l JournalState : AND.w #$00FF : BEQ .first
PHA PHA
JSR Journal_CountUnlocked : DEC A : STA.b $02 JSR Journal_CountUnlocked : DEC A : STA.b $02
PLA PLA
CMP.b $02 : BEQ .last CMP.b $02 : BNE .middle
; This is the last page
BRA .middle
.first
JSR Journal_DrawFirstPage
BRA .exit
.last
JSR Journal_DrawLastPage JSR Journal_DrawLastPage
BRA .exit BRA .draw_entry
.middle .middle
JSR Journal_DrawMiddlePage JSR Journal_DrawMiddlePage
.exit
.draw_entry
JSR Journal_DrawEntry JSR Journal_DrawEntry
SEP #$30 SEP #$30
@@ -393,4 +707,4 @@ Journal_DrawLastPage:
.last_page_tilemap .last_page_tilemap
incbin "tilemaps/journal_end.bin" incbin "tilemaps/journal_end.bin"
} }

View File

@@ -119,7 +119,7 @@ Menu_ItemNames:
dw "MIRROR_OF_TIME " dw "MIRROR_OF_TIME "
dw "____BOTTLE____ " dw "____BOTTLE____ "
dw "___OCARINA____ " dw "___OCARINA____ "
dw "TOME__L:REVEAL__" dw "BOOK__L:REVEAL "
dw "___SOMARIA____ " dw "___SOMARIA____ "
dw "_FISHING_ROD__ " dw "_FISHING_ROD__ "
dw "_ROCS_FEATHER_ " dw "_ROCS_FEATHER_ "