diff --git a/LTTP_RND_GeneralBugfixes.asm b/LTTP_RND_GeneralBugfixes.asm index 63d5088..68271ff 100644 --- a/LTTP_RND_GeneralBugfixes.asm +++ b/LTTP_RND_GeneralBugfixes.asm @@ -55,7 +55,7 @@ db #$20, #$19, #$08, #$31 ; year/month/day !SRAM_SINK = "$7EF41E" ; <- change this (conflicts with Programmable item 3) ;$7EF418 - Goal Item Counter ;$7EF419 - Service Sequence -;$7EF420 - $7EF466 - Stat Tracking Bank 1 (overlaps with RNG Item Flags) +;$7EF420 - $7EF468 - Stat Tracking Bank 1 (overlaps with RNG Item Flags) ;$7EF450 - $7EF45F - RNG Item (Single) Flags ;$7EF4A0 - $7EF4A7 - Service Request Block !PROGRESSIVE_BOMBS = "$7EF4A8" @@ -92,6 +92,9 @@ db #$20, #$19, #$08, #$31 ; year/month/day ;!REG_MUSIC_CONTROL = $012C !REG_MUSIC_CONTROL_REQUEST = $012C +!ONEMIND_ID = $7F5072 +!ONEMIND_TIMER = $7F5073 + ;================================================================================ incsrc hooks.asm @@ -183,7 +186,7 @@ incsrc endingsequence.asm incsrc cuccostorm.asm incsrc compression.asm incsrc retro.asm -incsrc dpadinvert.asm +incsrc controllerjank.asm incsrc boots.asm incsrc events.asm incsrc fileselect.asm @@ -578,6 +581,9 @@ AddDashTremor: org $099D04 AddAncillaLong: +org $099D1A +Ancilla_CheckIfAlreadyExistsLong: + org $09AE64 Sprite_SetSpawnedCoords: diff --git a/dpadinvert.asm b/controllerjank.asm similarity index 58% rename from dpadinvert.asm rename to controllerjank.asm index e030526..b3ecf79 100644 --- a/dpadinvert.asm +++ b/controllerjank.asm @@ -5,9 +5,31 @@ ; Filtered Joypad 1 Register: [AXLR | ????] ; Filtered Joypad 1 Register: [BYST | udlr] [AXLR | ????] !INVERT_DPAD = "$7F50CB" + InvertDPad: - LDA !INVERT_DPAD : BNE + : JMP .normal : + - DEC : BEQ .dpadOnly + LDA.l OneMindPlayerCount : BEQ .crowd_control + + LDA.l !ONEMIND_ID + AND.b #$03 + TAX + LDA.l .onemind_controller_offset, X + TAX + + LDA.w $4218,X : STA.w $00 + LDA.w $4219,X : STA.w $01 + + LDA #$80 : STA $4201 ; reset this so latch can read it, otherwise RNG breaks + + JML.l InvertDPadReturn + +.crowd_control + LDA !INVERT_DPAD : BNE + + + LDA $4218 : STA $00 + LDA $4219 : STA $01 + JML.l InvertDPadReturn + ++ DEC : BEQ .dpadOnly DEC : BEQ .buttonsOnly DEC : BEQ .invertBoth .swapSides @@ -45,8 +67,61 @@ JML.l InvertDPadReturn BIT.b #$03 : BEQ + : EOR.b #$03 : + ; swap left/right STA $01 JML.l InvertDPadReturn - .normal - LDA $4218 : STA $00 - LDA $4219 : STA $01 -JML.l InvertDPadReturn -;-------------------------------------------------------------------------------- \ No newline at end of file + +.onemind_controller_offset + db 0 ; player 0 - $4218 - joy1d1 + db 0 ; player 1 - $4218 - joy1d1 + db 2 ; player 2 - $421A - joy2d1 + db 6 ; player 3 - $421E - joy2d2 + db 2 ; player 4 - $421A - joy2d1 + db 6 ; player 5 - $421E - joy2d2 + + + +;-------------------------------------------------------------------------------- + +HandleOneMindController: + LDA.l OneMindPlayerCount + BEQ .no_onemind + + REP #$20 + + LDA.l !ONEMIND_TIMER + DEC + BPL .no_switch + + SEP #$20 + LDA.l !ONEMIND_ID + INC + CMP.l OneMindPlayerCount + BCC .no_wrap + + LDA.b #$01 ; reset to player 1 + +.no_wrap + STA.l !ONEMIND_ID + + REP #$20 + LDA.l OneMindTimer + +.no_switch + STA.l !ONEMIND_TIMER + + SEP #$20 + LDA.l !ONEMIND_ID + + CMP.b #$04 ; is it player 4 or 5? + BCC .no_multitap_switch + + STZ.w $4201 + +.no_multitap_switch + +.no_onemind + STZ.b $12 + + JML $008034 ; reset frame loop + + + + diff --git a/events.asm b/events.asm index ac88fdb..9c941aa 100644 --- a/events.asm +++ b/events.asm @@ -55,13 +55,16 @@ OnQuit: RTL ;-------------------------------------------------------------------------------- OnUncleItemGet: - JSL Link_ReceiveItem + PHA LDA.l EscapeAssist BIT.b #$04 : BEQ + : STA !INFINITE_MAGIC : + BIT.b #$02 : BEQ + : STA !INFINITE_BOMBS : + BIT.b #$01 : BEQ + : STA !INFINITE_ARROWS : + + PLA + JSL Link_ReceiveItem + LDA.l UncleRefill : BIT.b #$04 : BEQ + : LDA.b #$80 : STA $7EF373 : + ; refill magic LDA.l UncleRefill : BIT.b #$02 : BEQ + : LDA.b #50 : STA $7EF375 : + ; refill bombs LDA.l UncleRefill : BIT.b #$01 : BEQ + ; refill arrows @@ -234,6 +237,11 @@ PostItemAnimation: LDA.b #$00 : STA $7F509F + + LDA.w $02E9 : CMP.b #$01 : BNE + + LDA.b $2F : BEQ + + JSL.l IncrementChestTurnCounter + + + STZ $02E9 : LDA $0C5E, X ; thing we wrote over to get here RTL ;-------------------------------------------------------------------------------- diff --git a/hooks.asm b/hooks.asm index 85cd13d..db22432 100755 --- a/hooks.asm +++ b/hooks.asm @@ -14,6 +14,8 @@ dl Init_PostRAMClear org $008056 ; <- 56 - Bank00.asm : 77 JSL.l FrameHookAction ;-------------------------------------------------------------------------------- +org $00805D +JML HandleOneMindController ;================================================================================ ; NMI Hook @@ -48,8 +50,8 @@ ReturnCheckZSNES: ;-------------------------------------------------------------------------------- ;org $0083D9 ; <- 3D9 - Bank00.asm : 611 (LDA $4219 : STA $01) ;JSL.l InvertDPad : NOP -org $0083D4 ; <- 3D4 - Bank00.asm : 610 (LDA $4218 : STA $00) -JML.l InvertDPad : SKIP 6 +org $0083D1 ; <- 3D1 - Bank00.asm (STZ.w JOYPAD - useless instruction here) +JML.l InvertDPad : SKIP 9 InvertDPadReturn: ;-------------------------------------------------------------------------------- @@ -319,17 +321,14 @@ JSL.l LoadBombCount16 org $0DDEB3 ; <- 6DEB3 - equipment.asm : 328 (LDA $7EF33F, X) JSL.l IsItemAvailable ;-------------------------------------------------------------------------------- -org $0DDDE6 ; <- 6DDE6 - equipment.asm : 146 (LDX.b #$12 ...) -JSL.l HaveAnyItems -BRA + : NOP #7 : + +org $0DDDE8 ; <- 6DDE8 - equipment.asm : 148 (LDA $7EF340) +JSL.l SearchForEquippedItem ;-------------------------------------------------------------------------------- -org $0DDE6E ; <- 6DE6E - equipment.asm : 271 (LDX.b #$12 ...) -JSL.l HaveAnyItems -BRA + : NOP #7 : + +org $0DDE70 ; <- 6DE70 - equipment.asm : 273 (LDA $7EF340) +JSL.l SearchForEquippedItem ;-------------------------------------------------------------------------------- -org $0DE39B ; <- 6E39B - equipment.asm : 1107 (LDX.b #$12 ...) -JSL.l HaveAnyItems -BRA + : NOP #7 : + +org $0DE39D ; <- 6E39D - equipment.asm : 1109 (LDA $7EF340) +JSL.l SearchForEquippedItem ;-------------------------------------------------------------------------------- ;================================================================================ @@ -2651,6 +2650,15 @@ JSL FastCreditsCutsceneTimer org $0EE773 JSL FastTextScroll : NOP +;================================================================================ +org $01FFEE : JSL IncrementDamageTakenCounter_Eight ; overworld pit +org $079506 : JSL IncrementDamageTakenCounter_Eight ; underworld pit + +org $0780C6 : JSL IncrementDamageTakenCounter_Arb + +org $07B0B1 : JSL IncrementMagicUseCounter + + ;================================================================================ ; Bomb-Only Mode ;-------------------------------------------------------------------------------- diff --git a/init.asm b/init.asm index e7644db..ad007ea 100644 --- a/init.asm +++ b/init.asm @@ -40,8 +40,13 @@ Init_Primary: INX CPX #$15 : !BLT - .done - + + REP #$20 + LDA.l OneMindTimer : STA.l !ONEMIND_TIMER + SEP #$20 + LDA.b #$01 : STA $420D ; enable fastrom access on upper banks + STA.l !ONEMIND_ID LDA.b #$10 : STA $BC ; set default player sprite bank diff --git a/inventory.asm b/inventory.asm index 7226629..08944f7 100644 --- a/inventory.asm +++ b/inventory.asm @@ -23,7 +23,7 @@ ; - ; - ; - -; - +; q = quickswap lock ;-------------------------------------------------------------------------------- ; ProcessMenuButtons: ; out: Carry - 0 = No Button, 1 = Yes Button diff --git a/quickswap.asm b/quickswap.asm index 96f5d0d..e73938c 100644 --- a/quickswap.asm +++ b/quickswap.asm @@ -28,6 +28,7 @@ QuickSwap: BRA .store .special_swap + LDA !INVENTORY_SWAP_2 : ORA #$01 : STA !INVENTORY_SWAP_2 CPX.b #$02 : BEQ + ; boomerang CPX.b #$01 : BEQ + ; bow CPX.b #$05 : BEQ + ; powder @@ -47,22 +48,14 @@ QuickSwap: LDA.b $F6 : AND.b #$40 ;what we wrote over RTL RCode: - LDA.w $0202 : TAX + LDX.w $0202 + LDA.b $F2 : BIT #$20 : BNE ++ ; Still holding L from a previous frame + LDA !INVENTORY_SWAP_2 : AND #$FE : STA !INVENTORY_SWAP_2 + BRA + + ++ + LDA !INVENTORY_SWAP_2 : BIT #$01 : BEQ + + RTS - -; CPX.b #$0F : BNE + ; incrementing into bottle -; LDX.b #$00 : BRA ++ -; + CPX.b #$10 : BNE + ; incrementing bottle -; LDA.l $7EF34F : TAX -; -- : ++ -; CPX.b #$04 : BEQ .noMoreBottles -; INX -; LDA.l $7EF35B,X : BEQ -- -; TXA : STA.l $7EF34F -; LDX #$10 -; RTS -; .noMoreBottles -; LDX #$11 -; BRA .nextItem + CPX.b #$14 : BNE + : LDX.b #$00 ;will wrap around to 1 + INX .nextItem @@ -70,21 +63,14 @@ RCode: RTS LCode: - LDA.w $0202 : TAX + LDX.w $0202 + LDA.b $F2 : BIT #$10 : BNE ++ ; Still holding R from a previous frame + LDA !INVENTORY_SWAP_2 : AND #$FE : STA !INVENTORY_SWAP_2 + BRA + + ++ + LDA !INVENTORY_SWAP_2 : BIT #$01 : BEQ + + RTS - -; CPX.b #$11 : BNE + ; decrementing into bottle -; LDX.b #$05 : BRA ++ -; + CPX.b #$10 : BNE + ; decrementing bottle -; LDA.l $7EF34F : TAX -; -- : ++ -; CPX.b #$01 : BEQ .noMoreBottles -; DEX -; LDA.l $7EF35B,X : BEQ -- -; TXA : STA.l $7EF34F -; LDX.b #$10 -; RTS -; .noMoreBottles -; LDX.b #$0F : BRA .nextItem + CPX.b #$01 : BNE + : LDX.b #$15 ; will wrap around to $14 + DEX .nextItem diff --git a/retro.asm b/retro.asm index 71285ba..d073cc4 100644 --- a/retro.asm +++ b/retro.asm @@ -26,11 +26,11 @@ StoreBombCount: .finite PLA : STA $7EF343 RTL -HaveAnyItems: - LDX #$13 - LDA !INFINITE_BOMBS - .next_item - ORA $7EF340, X : DEX : BPL .next_item +SearchForEquippedItem: + LDA !INFINITE_BOMBS : BEQ + + LDA.b #$01 : LDX.b #$00 : RTL + + + LDA $7EF340 ; thing we wrote over RTL !INFINITE_ARROWS = "$7F50C8" diff --git a/stats.asm b/stats.asm index 0b0f433..4bd3699 100644 --- a/stats.asm +++ b/stats.asm @@ -1,7 +1,7 @@ ;================================================================================ ; Stat Tracking ;================================================================================ -; $7EF420 - $7EF466 - Stat Tracking +; $7EF420 - $7EF468 - Stat Tracking ;-------------------------------------------------------------------------------- ; $7EF420 - bonk counter ;-------------------------------------------------------------------------------- @@ -137,22 +137,21 @@ ;-------------------------------------------------------------------------------- ; $7EF466w[2] - mirror timestamp (high) ;-------------------------------------------------------------------------------- +; $7EF468 - chest turn counter +;-------------------------------------------------------------------------------- ;-------------------------------------------------------------------------------- !LOCK_STATS = "$7EF443" ;-------------------------------------------------------------------------------- !BONK_COUNTER = "$7EF420" -!BONK_REPEAT = "$7F503F" -!LOOP_FRAMES_LOW = "$7EF42E" StatBonkCounter: PHA + JSL Ancilla_CheckIfAlreadyExistsLong : BCS + LDA !LOCK_STATS : BNE + - LDA !LOOP_FRAMES_LOW : !SUB !BONK_REPEAT : CMP #30 : !BLT + - LDA !LOOP_FRAMES_LOW : STA !BONK_REPEAT LDA !BONK_COUNTER : INC CMP.b #100 : BEQ + ; decimal 100 STA !BONK_COUNTER - + + + PLA JSL.l AddDashTremor ; thing we wrote over RTL @@ -267,7 +266,7 @@ CountChestKey: ; called by neighbor functions CPY #$24 : BEQ + ; small key for this dungeon - use $040C CPY #$A0 : !BLT .end ; Ignore most items CPY #$AE : !BGE .end ; Ignore reserved key and generic key - TYA : AND.B #$0F : BNE ++ ; If this is a sewers key, instead count it as an HC key + TYA : AND.B #$0F : BNE ++ ; If this is an HC key, instead count it as a sewers key INC ++ TAX : BRA .count ; use Key id instead of $040C (Keysanity) + LDA $040C : LSR @@ -324,6 +323,15 @@ IncrementFairyRevivalCounter: PLA RTL ;-------------------------------------------------------------------------------- +!CHESTTURN_COUNTER = "$7EF468" +IncrementChestTurnCounter: + PHA + LDA !LOCK_STATS : BNE + + LDA !CHESTTURN_COUNTER : INC : STA !CHESTTURN_COUNTER + + + PLA +RTL +;-------------------------------------------------------------------------------- !CHEST_COUNTER = "$7EF442" IncrementChestCounter: LDA.b #$01 : STA $02E9 ; thing we wrote over @@ -360,6 +368,47 @@ IncrementBigChestCounter: + PLA RTL +;-------------------------------------------------------------------------------- +!DAMAGE_COUNTER = "$FFFFFF" +!MAGIC_COUNTER = "$FFFFFF" +IncrementDamageTakenCounter_Eight: + STA.l $7EF36D + PHA : PHP + LDA !LOCK_STATS : BNE + + REP #$21 + LDA.l !DAMAGE_COUNTER + ADC.w #$0008 + STA.l !DAMAGE_COUNTER ++ PLP + PLA +RTL + +IncrementDamageTakenCounter_Arb: + PHP + LDA !LOCK_STATS : BNE + + REP #$21 + LDA.b $00 + AND.w #$00FF + ADC.l !DAMAGE_COUNTER + STA.l !DAMAGE_COUNTER ++ PLP + + LDA.l $7EF36D +RTL + +IncrementMagicUseCounter: + STA.l $7EF36E + PHA : PHP + LDA !LOCK_STATS : BNE + + REP #$21 + LDA.b $00 + AND.w #$00FF + ADC.l !MAGIC_COUNTER + STA.l !MAGIC_COUNTER ++ PLP : PLA + +RTL + ;-------------------------------------------------------------------------------- !OW_MIRROR_COUNTER = "$7EF43A" IncrementOWMirror: diff --git a/stats/creditsnew.asm b/stats/creditsnew.asm index 0b14869..1706d45 100644 --- a/stats/creditsnew.asm +++ b/stats/creditsnew.asm @@ -643,6 +643,10 @@ endif %blankline() +%bigcreditsleft("CHEST TURNS") + +%blankline() + %bigcreditsleft("BONKS") %blankline() @@ -683,9 +687,6 @@ endif %blankline() -%emptyline() -%emptyline() -%emptyline() %emptyline() %emptyline() %bigcreditsleft("COLLECTION RATE /216") @@ -725,18 +726,20 @@ endif !GOLD_SWORD_Y = 339 !GT_BIG_KEY_X = 23 !GT_BIG_KEY_Y = 346 +!CHEST_TURNS_X = 26 +!CHEST_TURNS_Y = 349 !BONKS_X = 26 -!BONKS_Y = 349 +!BONKS_Y = 352 !SAVE_AND_QUITS_X = 26 -!SAVE_AND_QUITS_Y = 352 +!SAVE_AND_QUITS_Y = 355 !DEATHS_X = 26 -!DEATHS_Y = 355 +!DEATHS_Y = 358 !FAERIE_REVIVALS_X = 26 -!FAERIE_REVIVALS_Y = 358 +!FAERIE_REVIVALS_Y = 361 !TOTAL_MENU_TIME_X = 19 -!TOTAL_MENU_TIME_Y = 361 +!TOTAL_MENU_TIME_Y = 364 !TOTAL_LAG_TIME_X = 19 -!TOTAL_LAG_TIME_Y = 364 +!TOTAL_LAG_TIME_Y = 367 !COLLECTION_RATE_X = 22 !COLLECTION_RATE_Y = 380 !TOTAL_TIME_X = 19 diff --git a/stats/statConfig.asm b/stats/statConfig.asm index c2602ae..8fa3194 100755 --- a/stats/statConfig.asm +++ b/stats/statConfig.asm @@ -10,6 +10,7 @@ %AddStat($7EF426, 0, 4, 04, 2, !TEMPERED_SWORD_X, !TEMPERED_SWORD_Y) %AddStat($7EF426, 0, 0, 04, 2, !GOLD_SWORD_X, !GOLD_SWORD_Y) %AddStat($7EF42A, 0, 0, 05, 2, !GT_BIG_KEY_X, !GT_BIG_KEY_Y) +%AddStat($7EF468, 0, 0, 08, 3, !CHEST_TURNS_X, !CHEST_TURNS_Y) %AddStat($7EF420, 0, 0, 08, 3, !BONKS_X, !BONKS_Y) %AddStat($7EF42D, 0, 0, 08, 2, !SAVE_AND_QUITS_X, !SAVE_AND_QUITS_Y) %AddStat($7EF449, 0, 0, 08, 2, !DEATHS_X, !DEATHS_Y) @@ -17,4 +18,4 @@ %AddStat($7EF444, 1, 8, 32, 4, !TOTAL_MENU_TIME_X, !TOTAL_MENU_TIME_Y) %AddStat($7F5038, 1, 0, 32, 4, !TOTAL_LAG_TIME_X, !TOTAL_LAG_TIME_Y) %AddStat($7EF423, 0, 0, 08, 3, !COLLECTION_RATE_X, !COLLECTION_RATE_Y) -%AddStat($7EF43E, 1, 0, 32, 4, !TOTAL_TIME_X, !TOTAL_TIME_Y) \ No newline at end of file +%AddStat($7EF43E, 1, 0, 32, 4, !TOTAL_TIME_X, !TOTAL_TIME_Y) diff --git a/tables.asm b/tables.asm index e8009bb..0cec50a 100644 --- a/tables.asm +++ b/tables.asm @@ -423,7 +423,16 @@ db #$02 ; #$02 - 2 Bows (default) ProgressiveBowReplacement: db #$47 ; #$47 - 20 Rupees (default) ;-------------------------------------------------------------------------------- -; 0x18009A - 0x18009F (unused) +; 0x18009A - 0x18009C one mind +;-------------------------------------------------------------------------------- +org $30809A ; PC 0x18009A +OneMindPlayerCount: +db 0 +org $30809B ; PC 0x18009B - 0x18009C +OneMindTimer: +dw 0 +;-------------------------------------------------------------------------------- +; 0x18009D - 0x18009F (unused) ;-------------------------------------------------------------------------------- org $3080A0 ; PC 0x1800A0 - 0x1800A4 Bugfix_MirrorlessSQToLW: @@ -1489,7 +1498,7 @@ dw #9999 ; Rupee Limit ; $7F503C - Stats Rupee Total ; $7F503D - Stats Rupee Total ; $7F503E - Stats Item Total -; $7F503F - Bonk Repeat +; $7F503F - Unused ; $7F5040 - Free Item Dialog Temporary ; $7F5041 - Epilepsy Safety Timer ; $7F5042 - Tile Upload Offset Override (Low) @@ -1499,7 +1508,9 @@ dw #9999 ; Rupee Limit ; $7F5050 - $7F506F - Shop Block ; $7F5070 - Reserved for OneMind ; $7F5071 - Reserved for OneMind -; $7F5072 - $7F507D - Unused +; $7F5072 - OneMind player ID +; $7F5073 - $7F5074 - OneMind timer +; $7F5075 - $7F507D - Unused ; $7F507E - Clock Status ; $7F507F - Always Zero ; $7F5080 - $7F5083 - Clock Hours diff --git a/utilities.asm b/utilities.asm index 9f14647..8729075 100644 --- a/utilities.asm +++ b/utilities.asm @@ -89,8 +89,12 @@ RTL + ; Everything Else LDA.b #$2E : RTL ++ : CMP.b #$F8 : BNE ++ ; Progressive Bow - LDA $7EF340 - CMP.b #$00 : BNE + ; No Bow + LDA $7EF340 : INC : LSR + CMP.l ProgressiveBowLimit : !BLT + + LDA.l ProgressiveBowReplacement + JSL.l GetSpriteID + RTL + + : CMP.b #$00 : BNE + ; No Bow LDA.b #$29 : RTL + ; Any Bow LDA.b #$2A : RTL @@ -229,7 +233,12 @@ RTL + ; Everything Else LDA.b #$08 : RTL ++ : CMP.b #$F8 : BNE ++ ; Progressive Bow - LDA $7EF354 : BNE + ; No Bow + LDA $7EF340 : INC : LSR + CMP.l ProgressiveBowLimit : !BLT + + LDA.l ProgressiveBowReplacement + JSL.l GetSpritePalette + RTL + + : CMP.b #$00 : BNE + ; No Bow LDA.b #$08 : RTL + ; Any Bow LDA.b #$02 : RTL