From bf953e7953670d0a771eaee2b3cdec1a12a74b51 Mon Sep 17 00:00:00 2001 From: Kara Alexandra Date: Sat, 26 Jun 2021 08:03:24 -0700 Subject: [PATCH] Add bomb-only mode --- .gitignore | 2 +- LTTP_RND_GeneralBugfixes.asm | 7 + damage_table_sword_bombs.bin | Bin 0 -> 2048 bytes darkworldspawn.asm | 7 +- dialog.asm | 54 +++--- events.asm | 4 +- generate_bomb_table.rb | 64 +++++++ hooks.asm | 66 ++++++- init.asm | 2 +- newitems.asm | 330 ++++++++++++++++++++--------------- retro.asm | 6 + special_bombs.asm | 246 ++++++++++++++++++++++++++ swordswap.asm | 35 ++-- tables.asm | 32 +++- utilities.asm | 46 ++--- zelda.asm | 10 +- 16 files changed, 689 insertions(+), 222 deletions(-) create mode 100644 damage_table_sword_bombs.bin create mode 100644 generate_bomb_table.rb create mode 100644 special_bombs.asm diff --git a/.gitignore b/.gitignore index 95a3568..0b2681e 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,3 @@ tournament.asm /build -/.idea \ No newline at end of file +/.idea diff --git a/LTTP_RND_GeneralBugfixes.asm b/LTTP_RND_GeneralBugfixes.asm index ff6eac4..281fa05 100644 --- a/LTTP_RND_GeneralBugfixes.asm +++ b/LTTP_RND_GeneralBugfixes.asm @@ -58,6 +58,7 @@ db #$20, #$19, #$08, #$31 ; year/month/day ;$7EF420 - $7EF466 - Stat Tracking Bank 1 (overlaps with RNG Item Flags) ;$7EF450 - $7EF45F - RNG Item (Single) Flags ;$7EF4A0 - $7EF4A7 - Service Request Block +!PROGRESSIVE_BOMBS = "$7EF4A8" !FRESH_FILE_MARKER = "$7EF4F0" ; zero if fresh file ;$700500 - $70050F - Extended File Name ;$701000 - $70100F - Password (incorporate into log header) @@ -203,6 +204,7 @@ incsrc toast.asm incsrc darkroomitems.asm incsrc fastcredits.asm incsrc msu.asm +incsrc special_bombs.asm warnpc $A58000 ;org $228000 ; contrib area @@ -277,6 +279,11 @@ InvertedCastleHole: ;address used by front end. DO NOT MOVE! incbin sheet73.gfx warnpc $31E501 +org $31E800 +Damage_Table_Alt: +incbin damage_table_sword_bombs.bin +warnpc $31F001 + org $338000 GFX_HUD_Palette: incbin hudpalette.pal diff --git a/damage_table_sword_bombs.bin b/damage_table_sword_bombs.bin new file mode 100644 index 0000000000000000000000000000000000000000..5a5136fde31c362310e8857cdf20a133d4ffde88 GIT binary patch literal 2048 zcmd5+y>1gh5T5lCC7th_Cgmmt^;!1-1`!EFljK1VQc^&Hunraf3d|*MmLiEpv&xnbyETp0M39UYc6x>~tlZAdtklfKPs=CijQ|m8~tpTTGk} zD4%-H)MtJDHsW$!8Q694cN#UrBifAqKM=KVuqk~{fab&`_oh7v_fP7#*dAo&Q?j2E z*&*t^J;=fC=g2tRN8yAIyf4bNC6X8N*k_yPw3jqrt4#4oc8MFzR49NRPU>taLJhaJt7aeM@e2bpZW>j6OaeUJy}$n+NKtt z7}Anm=Sb3@ejC3&F-||^o}4%A7ju~>;W)@F+xdU@dF37Op}|jaf_TApnX-o0BKPj z-X7jT!rCKTnk(!oF3Cc|Z}`4m^YdVR#4j(9?yn2`M*I@lJgR6~faA$8{D!Ca4xeEQ z@#p}XSfb(E&dW(_^y1`A?=yK}_j&uM-FVtOq=Sd#xDgNF6KrF5=4>F)iCzGWMsxfA z?*7ify~lSSZBqrv9>TbuOVq(3e!&UuP+?7SG^S#Wv36y3Wp%Ae?gou1M+G#m0ysW) z#jC;fUXE-qq*G1Fndz-ydcXh5!Hn literal 0 HcmV?d00001 diff --git a/darkworldspawn.asm b/darkworldspawn.asm index e86344f..e47d5b8 100644 --- a/darkworldspawn.asm +++ b/darkworldspawn.asm @@ -140,9 +140,10 @@ SetEscapeAssist: BIT.b #$01 : BEQ + : STA !INFINITE_ARROWS : + BRA ++ .no_train ; choo choo - LDA.l EscapeAssist : BIT.b #$04 : BEQ + : LDA.b #$00 : STA !INFINITE_MAGIC : + - LDA.l EscapeAssist : BIT.b #$02 : BEQ + : LDA.b #$00 : STA !INFINITE_BOMBS : + - LDA.l EscapeAssist : BIT.b #$01 : BEQ + : LDA.b #$00 : STA !INFINITE_ARROWS : + + LDA.l EscapeAssist + BIT.b #$40 : BEQ + : STA !INFINITE_MAGIC : + + BIT.b #$20 : BEQ + : STA !INFINITE_BOMBS : + + BIT.b #$10 : BEQ + : STA !INFINITE_ARROWS : + ++ RTL ;-------------------------------------------------------------------------------- diff --git a/dialog.asm b/dialog.asm index 28962ba..fda6ef6 100644 --- a/dialog.asm +++ b/dialog.asm @@ -268,7 +268,7 @@ RTL DialogFairyThrow: LDA.l Restrict_Ponds : BEQ .normal LDA $7EF35C : ORA $7EF35D : ORA $7EF35E : ORA $7EF35F : BNE .normal - + .noInventory LDA $0D80, X : !ADD #$08 : STA $0D80, X LDA.b #$51 @@ -299,31 +299,35 @@ RTL ; s = silver arrow bow ; p = 2nd progressive bow DialogGanon2: - JSL.l CheckGanonVulnerability - + JSL.l CheckGanonVulnerability + REP #$20 BCS + - LDA.w #$018D : BRA ++ - + + LDA.w #$018D : BRA ++ + + + LDA.l SpecialBombs + AND.w #$00FF : BEQ + ; branch if not special bomb mode + LDA.w #$0195 : BRA ++ + + LDA.l $7EF38E - BIT.w #$0080 : BNE + ; branch if bow - LDA.w #$0192 : BRA ++ - + - BIT.w #$0040 : BEQ + ; branch if no silvers - LDA.w #$0195 : BRA ++ - + - BIT.w #$0020 : BNE + ; branch if p bow - LDA.w #$0194 : BRA ++ - + - BIT.w #$0080 : BEQ + ; branch if no bow - LDA.w #$0193 : BRA ++ - + - LDA.w #$016E - ++ + BIT.w #$0080 : BNE + ; branch if bow + LDA.w #$0192 : BRA ++ + + + BIT.w #$0040 : BEQ + ; branch if no silvers + LDA.w #$0195 : BRA ++ + + + BIT.w #$0020 : BNE + ; branch if p bow + LDA.w #$0194 : BRA ++ + + + BIT.w #$0080 : BEQ + ; branch if no bow + LDA.w #$0193 : BRA ++ + + + LDA.w #$016E + ++ STA $1CF0 SEP #$20 - JSL.l Sprite_ShowMessageMinimal_Alt + JSL.l Sprite_ShowMessageMinimal_Alt RTL ;-------------------------------------------------------------------------------- DialogEtherTablet: @@ -361,7 +365,7 @@ DialogBombosTablet: LDA $7EF359 : CMP.b #$FF : BEQ .yesText : CMP.b #$02 : !BGE .noText ;++ .yesText - PLA + PLA LDA.b #$0D LDY.b #$01 JML Sprite_ShowMessageUnconditional ; Text From MSPedestalText (tables.asm) @@ -373,7 +377,7 @@ RTL DialogSahasrahla: LDA.l $7EF374 : AND #$04 : BEQ + ;Check if player has green pendant LDA.b #$2F - LDY.b #$00 + LDY.b #$00 JML Sprite_ShowMessageUnconditional + RTL @@ -454,7 +458,7 @@ RTL CalculateSignIndex: ; for the big 1024x1024 screens we are calculating link's effective ; screen area, as though the screen was 4 different 512x512 screens. - ; And we do this in a way that will likely give the right value even + ; And we do this in a way that will likely give the right value even ; with major glitches. LDA $8A : ASL A : TAY ;what we wrote over @@ -463,13 +467,13 @@ CalculateSignIndex: LDA $21 : AND.w #$0002 : ASL #2 : EOR $8A : AND.w #$0008 : BEQ + TYA : !ADD.w #$0010 : TAY ;add 16 if we are in lower half of big screen. - + + + LDA $23 : AND.w #$0002 : LSR : EOR $8A : AND.w #$0001 : BEQ + TYA : INC #2 : TAY ;add 16 if we are in lower half of big screen. + ; ensure even if things go horribly wrong, we don't read the sign out of bounds and crash: - TYA : AND.w #$00FF : TAY + TYA : AND.w #$00FF : TAY .done RTL diff --git a/events.asm b/events.asm index 0e0e090..ac88fdb 100644 --- a/events.asm +++ b/events.asm @@ -132,7 +132,7 @@ OnNewFile: BPL - LDX #$000E : - - LDA $7EF37C, X : STA $7EF4E0, X + LDA $7EF37C, X : STA $7EF4E0, X DEX : DEX BPL - @@ -234,6 +234,6 @@ PostItemAnimation: LDA.b #$00 : STA $7F509F + - STZ $02E9 : LDA $0C5E, X ; thing we wrote over to get here + STZ $02E9 : LDA $0C5E, X ; thing we wrote over to get here RTL ;-------------------------------------------------------------------------------- diff --git a/generate_bomb_table.rb b/generate_bomb_table.rb new file mode 100644 index 0000000..8ea2c17 --- /dev/null +++ b/generate_bomb_table.rb @@ -0,0 +1,64 @@ +def process_values(sprite, values) + ret = values.clone + if [1, 2].include?(ret[0]) # boomerang + ret[0] = 0 + end + if ret[6] > 0 && sprite != 0x84 # bow and not red eyegore/mimic + ret[6] = 0 + end + if ret[7] == 2 # hookshot + ret[7] = 0 + end + if ret[9] > 0 && sprite != 0x84 # silver bow and not red eyegore/mimic + ret[9] = 0 + end + if ret[10] == 4 # powder + ret[10] = 0 + end + if ret[11] > 0 && ![0xA1, 0xA3, 0xCD].include?(sprite) # fire rod + ret[11] = 0 + end + if ret[12] != 3 && sprite != 0xCC # ice rod + ret[12] = 0 + end + if ret[13] != 3 && ![0xA3, 0xA1].include?(sprite) # bombos + ret[13] = 0 + end + if ret[14] != 1 # ether + ret[14] = 0 + end + if ret[15] != 3 # quake + ret[15] = 0 + end + return ret +end + +def split_value(byte) + return [byte >> 4, byte & 0x0F] +end + +def join_values(value1, value2) + return (value1 & 0x0F) << 4 | (value2 & 0x0F) +end + +File.open("damage_table.bin") do |input| + File.open("damage_table_sword_bombs.bin", "w") do |output| + i_enum = input.each_byte + (0...0xD7).each do |sprite| + values = [] + (0...8).each do + values += split_value(i_enum.next) + end + v_enum = process_values(sprite, values).to_enum + (0...8).each do + output.putc(join_values(v_enum.next, v_enum.next)) + end + end + begin + while true + output.putc(i_enum.next) + end + rescue StopIteration + end + end +end diff --git a/hooks.asm b/hooks.asm index 6bc8153..f835c12 100755 --- a/hooks.asm +++ b/hooks.asm @@ -319,6 +319,18 @@ 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 $0DDE6E ; <- 6DE6E - equipment.asm : 271 (LDX.b #$12 ...) +JSL.l HaveAnyItems +BRA + : NOP #7 : + +;-------------------------------------------------------------------------------- +org $0DE39B ; <- 6E39B - equipment.asm : 1107 (LDX.b #$12 ...) +JSL.l HaveAnyItems +BRA + : NOP #7 : + +;-------------------------------------------------------------------------------- ;================================================================================ ; Inverted Mode @@ -908,12 +920,9 @@ LDA.w AddReceivedItemExpanded_item_target_addr+1, X org $09861F ; 4861F - ancilla_init.asm:724 (LDA .item_values, Y) LDA.w AddReceivedItemExpanded_item_values, Y -org $098627 ; 48627 - ancilla_init.asm:731 (LDA .item_target_addr+0, X) -LDA.w AddReceivedItemExpanded_item_target_addr+0, X -org $09862C ; 4862C - ancilla_init.asm:722 (LDA .item_target_addr+1, X) -LDA.w AddReceivedItemExpanded_item_target_addr+1, X -org $098635 ; 48635 - ancilla_init.asm:727 (LDA .item_values, Y) -LDA.w AddReceivedItemExpanded_item_values, Y +org $098624 ; 48624 - ancilla_init.asm:728 (TYA : ASL A : TAX) +JSL.l UpdateInventoryLocationExpanded +BRA + : NOP #18 : + org $0986AA ; 486AA - ancilla_init.asm:848 (LDA .item_masks, X) LDA.w AddReceivedItemExpanded_item_masks, X @@ -2269,9 +2278,6 @@ NOP #6 ;-------------------------------------------------------------------------------- org $09865E ; <- 4865E JSL.l $1BEE1B ; fix something i wrote over i shouldn't have -;-------------------------------------------------------------------------------- -org $098638 ; <- 48638 - ancilla_init.asm:737 - LDA .item_values, Y : BMI .dontWrite (BMI) -JSL.l ItemDowngradeFix ;================================================================================ ;================================================================================ @@ -2644,3 +2650,45 @@ JSL FastCreditsCutsceneTimer org $0EE773 JSL FastTextScroll : NOP + +;================================================================================ +; Bomb-Only Mode +;-------------------------------------------------------------------------------- +org $06ECC3 ; Bank06.asm@4704 (PHX : TAX : LDA.l .damage_classes, X : PLX) +JSL DamageClassCalc +BRA + : NOP #29 : + +;-------------------------------------------------------------------------------- +org $0882D4 ; Bank08.asm@445 (PHX : TYX : ... ) +JSL Utility_CheckAncillaOverlapWithSprite +BRA + : NOP #5 : + +;-------------------------------------------------------------------------------- +org $088DB1 ; Bank08.asm@1207 (PHY : PHX : TYX : ... ) +JSL Utility_CheckAncillaOverlapWithSprite +BRA + : NOP #7 : + +-------------------------------------------------------------------------------- +org $0882E8 ; Bank08.asm@456 (LDA $0DB0, Y : CMP.b #$03) +JSL Utility_CheckHelmasaurKingCollision +NOP +;-------------------------------------------------------------------------------- +org $1E838C ; sprite_helmasaur_king.asm@522 (LDA $0301 : AND.b #$0A) +JSL Utility_CheckHammerHelmasaurKingMask +NOP +;-------------------------------------------------------------------------------- +org $06ED94 ; Bank06.asm@4866 (LDA $0E60, X : AND.b #$40) +JSL Utility_CheckImpervious +NOP +;-------------------------------------------------------------------------------- +org $068F94 ; sprite_prep.asm@1984 (INC $0BA0, X : JSL Sprite_InitializedSegmented) +JSL AllowBombingMoldorm +BRA + : NOP : + +;-------------------------------------------------------------------------------- +org $0DEE05 ; equipment.asm@2065 (LDA $7EF359 : AND.w #$00FF : CMP.w #$00FF : ...) +JSL DrawSwordInMenu +BRA + : NOP #16 : + +;-------------------------------------------------------------------------------- +org $0DFC51 ; is this being used? I hope not! let's find out if anything breaks! +db $B2, $3C, $B3, $3C, $C2, $3C, $17, $3C +db $B2, $2C, $B3, $2C, $C2, $2C, $18, $2C +db $B2, $24, $B3, $24, $C2, $24, $19, $24 +db $B2, $28, $B3, $28, $C2, $28, $1A, $28 +db $B2, $28, $B3, $28, $C2, $28, $1B, $28 diff --git a/init.asm b/init.asm index 47a5726..e7644db 100644 --- a/init.asm +++ b/init.asm @@ -58,4 +58,4 @@ Init_PostRAMClear: JSL MSUInit JSL InitRNGPointerTable -JML $00D463 ; The original target of the jump table that we hijacked \ No newline at end of file +JML $00D463 ; The original target of the jump table that we hijacked diff --git a/newitems.asm b/newitems.asm index c8df278..415f37a 100755 --- a/newitems.asm +++ b/newitems.asm @@ -39,6 +39,12 @@ ; #$80 - Compasses ; #$90 - Big Keys ; #$A0 - Small Keys +; #$B0 - reserved for bee traps +; #$B1 - L-2 Bombs +; #$B2 - L-3 Bombs +; #$B3 - L-4 Bombs +; #$B4 - L-5 Bombs +; #$B5 - Progressive Bombs ; #$FE - Server Request (Asychronous Chest) ; #$FF - Null Chest ;-------------------------------------------------------------------------------- @@ -68,23 +74,23 @@ ;JML GetAnimatedSpriteGfxFile_return ;-------------------------------------------------------------------------------- GetAnimatedSpriteGfxFile: - CMP.b #$0C : BNE + + CMP.b #$0C : BNE + LDY.b #$5C : JML GetAnimatedSpriteGfxFile_return + - CMP.b #$23 : BNE + + CMP.b #$23 : BNE + LDY.b #$5D : JML GetAnimatedSpriteGfxFile_return + - CMP.b #$48 : BNE + + CMP.b #$48 : BNE + LDY.b #$60 : JML GetAnimatedSpriteGfxFile_return + - CMP.b #$24 : !BGE + + CMP.b #$24 : !BGE + LDY.b #$5B : JML GetAnimatedSpriteGfxFile_return + - CMP.b #$37 : !BGE + + CMP.b #$37 : !BGE + LDY.b #$5C : JML GetAnimatedSpriteGfxFile_return + - CMP.b #$39 : !BGE + + CMP.b #$39 : !BGE + LDY.b #$5D : JML GetAnimatedSpriteGfxFile_return + LDY.b #$32 @@ -267,7 +273,7 @@ AddReceivedItemExpandedGetItem: + CMP.b #$57 : BNE + ; Programmable Object 3 %ProgrammableItemLogic(3) JMP .done - + CMP.b #$58 : BNE + ; Upgrade-Only Sivler Arrows + + CMP.b #$58 : BNE + ; Upgrade-Only Silver Arrows LDA.l SilverArrowsUseRestriction : BNE +++ LDA.l SilverArrowsAutoEquip : AND.b #$01 : BEQ +++ LDA $7EF340 : BEQ ++ : CMP.b #$03 : !BGE ++ @@ -399,6 +405,7 @@ AddReceivedItemExpandedGetItem: PLX LDA $02E9 : CMP.b #$01 ; thing we wrote over RTL +;-------------------------------------------------------------------------------- ; #$70 - Maps ; #$80 - Compasses ; #$90 - Big Keys @@ -494,9 +501,9 @@ AddReceivedItemExpanded: LDA.b #$23 : STA $02D8 : JMP .done ++ : CMP.b #$61 : BNE ++ ; Progressive Lifting Glove LDA $7EF354 : BNE + ; No Lift - LDA.b #$1B : STA $02D8 : BRA .done + LDA.b #$1B : STA $02D8 : JMP .done + ; Everything Else - LDA.b #$1C : STA $02D8 : BRA .done + LDA.b #$1C : STA $02D8 : JMP .done ++ : CMP.b #$64 : BNE ++ : -- ; Progressive Bow LDA $7EF340 : INC : LSR : CMP.l ProgressiveBowLimit : !BLT + LDA.l ProgressiveBowReplacement : STA $02D8 : JMP .done @@ -519,40 +526,51 @@ AddReceivedItemExpanded: JSL.l GetRNGItemMulti : STA $02D8 LDA #$FF : STA !LOCK_IN ; clear lock-in BRA .done + ++ : CMP.b #$B5 : BNE ++ ; Progressive Bombs + LDA $7EF4A8 + CMP.b #$00 : BNE + ; L-1 Bombs + LDA.b #$B1 : STA $02D8 : JMP .done + + : CMP.b #$01 : BNE + ; L-2 Bombs + LDA.b #$B2 : STA $02D8 : JMP .done + + : CMP.b #$02 : BNE + ; L-3 Bombs + LDA.b #$B3 : STA $02D8 : JMP .done + + ; Everything Else + LDA.b #$B4 : STA $02D8 : JMP .done ++ .done PLX : PLA - PHB : PHK ; we're skipping the corresponding instructions to grab the data bank + PHB : PHK ; we're skipping the corresponding instructions to grab the data bank JML.l AddReceivedItem+2 } ;-------------------------------------------------------------------------------- ;DATA AddReceivedItemExpanded { ; This is a temporary measure for Fish to have consistent addresses +warnpc $A08800 org $A08800 .y_offsets - db -5, -5, -5, -5, -5, -4, -4, -5 - db -5, -4, -4, -4, -2, -4, -4, -4 + db -5, -5, -5, -5, -5, -4, -4, -5 + db -5, -4, -4, -4, -2, -4, -4, -4 - db -4, -4, -4, -4, -4, -4, -4, -4 - db -4, -4, -4, -4, -4, -4, -4, -4 + db -4, -4, -4, -4, -4, -4, -4, -4 + db -4, -4, -4, -4, -4, -4, -4, -4 - db -4, -4, -4, -5, -4, -4, -4, -4 - db -4, -4, -2, -4, -4, -4, -4, -4 + db -4, -4, -4, -5, -4, -4, -4, -4 + db -4, -4, -2, -4, -4, -4, -4, -4 - db -4, -4, -4, -4, -2, -2, -2, -4 - db -4, -4, -4, -4, -4, -4, -4, -4 + db -4, -4, -4, -4, -2, -2, -2, -4 + db -4, -4, -4, -4, -4, -4, -4, -4 - db -4, -4, -2, -2, -4, -2, -4, -4 - db -4, -5, -4, -4 + db -4, -4, -2, -2, -4, -2, -4, -4 + db -4, -5, -4, -4 ;new db -4, -4, -4, -4 db -5 ; Master Sword (Safe) db -4, -4, -4, -4 ; +5/+10 Bomb Arrows db -4, -4, -4 ; 3x Programmable Item - db -4 ; Upgrade-Only Sivler Arrows + db -4 ; Upgrade-Only Silver Arrows db -4 ; 1 Rupoor db -4 ; Null Item db -4, -4, -4 ; Red, Blue & Green Clocks @@ -566,32 +584,34 @@ org $A08800 db -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4 ; Free Compass db -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4 ; Free Big Key db -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4 ; Free Small Key - db -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4 ; Unused + db -4 ; reserved for bee traps + db -4, -4, -4, -4, -4 ; Bomb Upgrades + db -4, -4, -4, -4, -4, -4, -4, -4, -4, -4 ; Unused db -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4 ; Unused db -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4 ; Unused db -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4 ; Unused .x_offsets - db 4, 4, 4, 4, 4, 0, 0, 4 - db 4, 4, 4, 4, 5, 0, 0, 0 + db 4, 4, 4, 4, 4, 0, 0, 4 + db 4, 4, 4, 4, 5, 0, 0, 0 - db 0, 0, 0, 4, 0, 4, 0, 0 - db 4, 0, 0, 0, 0, 0, 0, 0 + db 0, 0, 0, 4, 0, 4, 0, 0 + db 4, 0, 0, 0, 0, 0, 0, 0 - db 0, 0, 0, 0, 4, 0, 0, 0 - db 0, 0, 5, 0, 0, 0, 0, 0 + db 0, 0, 0, 0, 4, 0, 0, 0 + db 0, 0, 5, 0, 0, 0, 0, 0 - db 0, 0, 0, 0, 4, 4, 4, 0 - db 0, 0, 0, 0, 0, 0, 0, 0 + db 0, 0, 0, 0, 4, 4, 4, 0 + db 0, 0, 0, 0, 0, 0, 0, 0 - db 0, 0, 4, 4, 0, 4, 0, 0 - db 0, 4, 0, 0 + db 0, 0, 4, 4, 0, 4, 0, 0 + db 0, 4, 0, 0 ;new db 0, 0, 0, 0 db 4 ; Master Sword (Safe) db 0, 0, 0, 0 ; +5/+10 Bomb Arrows db 0, 0, 0 ; 3x Programmable Item - db 0 ; Upgrade-Only Sivler Arrows + db 0 ; Upgrade-Only Silver Arrows db 4 ; 1 Rupoor db 0 ; Null Item db 0, 0, 0 ; Red, Blue & Green Clocks @@ -606,33 +626,35 @@ org $A08800 db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ; Free Big Key ;db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ; *EVENT* db 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4 ; Free Small Key - db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ; Unused + db 0 ; reserved for bee traps + db 0, 0, 0, 0, 0 ; Bomb Upgrades + db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ; Unused db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ; Unused db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ; Unused db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ; Unused .item_graphics_indices - db $06, $18, $18, $18, $2D, $20, $2E, $09 - db $09, $0A, $08, $05, $10, $0B, $2C, $1B + db $06, $18, $18, $18, $2D, $20, $2E, $09 + db $09, $0A, $08, $05, $10, $0B, $2C, $1B - db $1A, $1C, $14, $19, $0C, $07, $1D, $2F - db $07, $15, $12, $0D, $0D, $0E, $11, $17 + db $1A, $1C, $14, $19, $0C, $07, $1D, $2F + db $07, $15, $12, $0D, $0D, $0E, $11, $17 - db $28, $27, $04, $04, $0F, $16, $03, $13 - db $01, $1E, $10, $00, $00, $00, $00, $00 + db $28, $27, $04, $04, $0F, $16, $03, $13 + db $01, $1E, $10, $00, $00, $00, $00, $00 - db $00, $30, $22, $21, $24, $24, $24, $23 - db $23, $23, $29, $2A, $2C, $2B, $03, $03 + db $00, $30, $22, $21, $24, $24, $24, $23 + db $23, $23, $29, $2A, $2C, $2B, $03, $03 - db $34, $35, $31, $33, $02, $32, $36, $37 - db $2C, $06, $0C, $38 + db $34, $35, $31, $33, $02, $32, $36, $37 + db $2C, $06, $0C, $38 ;new db $39, $3A, $3B, $3C ;5x db $18 ; Master Sword (Safe) db $3D, $3E, $3F, $40 ; +5/+10 Bomb Arrows db $00, $00, $00 ; 3x Programmable Item - db $41 ; Upgrade-Only Sivler Arrows + db $41 ; Upgrade-Only Silver Arrows db $24 ; 1 Rupoor db $47 ; Null Item db $48, $48, $48 ; Red, Blue & Green Clocks @@ -650,33 +672,34 @@ org $A08800 ;db $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49 ; *EVENT* ;db $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49 ; *EVENT* ;db $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49 ; *EVENT* - - db $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49 ; Unused + db $49 ; reserved for bee traps + db $13, $13, $13, $13, $13 ; Bomb Upgrades + db $49, $49, $49, $49, $49, $49, $49, $49, $49, $49 ; Unused db $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49 ; Unused db $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49 ; Unused db $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49 ; Unused .wide_item_flag - db $00, $00, $00, $00, $00, $02, $02, $00 - db $00, $00, $00, $00, $00, $02, $02, $02 + db $00, $00, $00, $00, $00, $02, $02, $00 + db $00, $00, $00, $00, $00, $02, $02, $02 - db $02, $02, $02, $00, $02, $00, $02, $02 - db $00, $02, $02, $02, $02, $02, $02, $02 + db $02, $02, $02, $00, $02, $00, $02, $02 + db $00, $02, $02, $02, $02, $02, $02, $02 - db $02, $02, $02, $02, $00, $02, $02, $02 - db $02, $02, $00, $02, $02, $02, $02, $02 + db $02, $02, $02, $02, $00, $02, $02, $02 + db $02, $02, $00, $02, $02, $02, $02, $02 - db $02, $02, $02, $02, $00, $00, $00, $02 - db $02, $02, $02, $02, $02, $02, $02, $02 + db $02, $02, $02, $02, $00, $00, $00, $02 + db $02, $02, $02, $02, $02, $02, $02, $02 - db $02, $02, $00, $00, $02, $00, $02, $02 - db $02, $00, $02, $02 + db $02, $02, $00, $00, $02, $00, $02, $02 + db $02, $00, $02, $02 ;new db $02, $02, $02, $02 db $00 ; Master Sword (Safe) db $02, $02, $02, $02 ; +5/+10 Bomb Arrows db $02, $02, $02 ; 3x Programmable Item - db $02 ; Upgrade-Only Sivler Arrows + db $02 ; Upgrade-Only Silver Arrows db $00 ; 1 Rupoor db $02 ; Null Item db $02, $02, $02 ; Red, Blue & Green Clocks @@ -690,34 +713,35 @@ org $A08800 db $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02 ; Free Compass db $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02 ; Free Big Key db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 ; Free Small Key - - db $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02 ; Unused + db $02 ; reserved for bee traps + db $02, $02, $02, $02, $02 ; Bomb Upgrades + db $02, $02, $02, $02, $02, $02, $02, $02, $02, $02 ; Unused db $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02 ; Unused db $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02 ; Unused db $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02 ; Unused db $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02 ; Unused .properties - db 5, -1, 5, 5, 5, 5, 5, 1 - db 2, 1, 1, 1, 2, 2, 2, 4 + db 5, -1, 5, 5, 5, 5, 5, 1 + db 2, 1, 1, 1, 2, 2, 2, 4 - db 4, 4, 1, 1, 2, 1, 1, 1 - db 2, 1, 2, 1, 4, 4, 2, 1 + db 4, 4, 1, 1, 2, 1, 1, 1 + db 2, 1, 2, 1, 4, 4, 2, 1 - db 6, 1, 2, 1, 2, 2, 1, 2 - db 2, 4, 1, 1, 4, 2, 1, 4 + db 6, 1, 2, 1, 2, 2, 1, 2 + db 2, 4, 1, 1, 4, 2, 1, 4 - db 2, 2, 4, 4, 4, 2, 1, 4 - db 1, 2, 2, 1, 2, 2, 1, 1 + db 2, 2, 4, 4, 4, 2, 1, 4 + db 1, 2, 2, 1, 2, 2, 1, 1 - db 4, 4, 1, 2, 2, 4, 4, 4 - db 2, 5, 2, 1 + db 4, 4, 1, 2, 2, 4, 4, 4 + db 2, 5, 2, 1 ;new db 4, 4, 4, 4 db 5 ; Master Sword (Safe) db 4, 4, 4, 4 ; +5/+10 Bomb Arrows db 4, 4, 4 ; 3x Programmable Item - db 1 ; Upgrade-Only Sivler Arrows + db 1 ; Upgrade-Only Silver Arrows db 3 ; 1 Rupoor db 1 ; Null Item db 1, 2, 4 ; Red, Blue & Green Clocks @@ -731,7 +755,9 @@ org $A08800 db 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 ; Free Compass db 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4 ; Free Big Key db 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4 ; Free Small Key - db 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4 ; Unused + db 4 ; reserved for bee traps + db 5, 5, 5, 5, 5 ; Bomb Upgrades + db 4, 4, 4, 4, 4, 4, 4, 4, 4, 4 ; Unused db 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4 ; Unused db 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4 ; Unused db 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4 ; Unused @@ -739,26 +765,26 @@ org $A08800 ; \item Target SRAM addresses for items you receive .item_target_addr - dw $F359, $F359, $F359, $F359, $F35A, $F35A, $F35A, $F345 - dw $F346, $F34B, $F342, $F340, $F341, $F344, $F35C, $F347 + dw $F359, $F359, $F359, $F359, $F35A, $F35A, $F35A, $F345 + dw $F346, $F34B, $F342, $F340, $F341, $F344, $F35C, $F347 - dw $F348, $F349, $F34A, $F34C, $F34C, $F350, $F35C, $F36B - dw $F351, $F352, $F353, $F354, $F354, $F34E, $F356, $F357 + dw $F348, $F349, $F34A, $F34C, $F34C, $F350, $F35C, $F36B + dw $F351, $F352, $F353, $F354, $F354, $F34E, $F356, $F357 - dw $F37A, $F34D, $F35B, $F35B, $F36F, $F364, $F36C, $F375 - dw $F375, $F344, $F341, $F35C, $F35C, $F35C, $F36D, $F36E + dw $F37A, $F34D, $F35B, $F35B, $F36F, $F364, $F36C, $F375 + dw $F375, $F344, $F341, $F35C, $F35C, $F35C, $F36D, $F36E - dw $F36E, $F375, $F366, $F368, $F360, $F360, $F360, $F374 - dw $F374, $F374, $F340, $F340, $F35C, $F35C, $F36C, $F36C + dw $F36E, $F375, $F366, $F368, $F360, $F360, $F360, $F374 + dw $F374, $F374, $F340, $F340, $F35C, $F35C, $F36C, $F36C - dw $F360, $F360, $F372, $F376, $F376, $F373, $F360, $F360 - dw $F35C, $F359, $F34C, $F355 + dw $F360, $F360, $F372, $F376, $F376, $F373, $F360, $F360 + dw $F35C, $F359, $F34C, $F355 ;new dw $F375, $F376, $F373, $F373 dw $F359 ; Master Sword (Safe) dw $F375, $F375, $F376, $F376 ; +5/+10 Bomb Arrows dw $F41A, $F41C, $F41E ; 3x Programmable Item - dw $F340 ; Upgrade-Only Sivler Arrows + dw $F340 ; Upgrade-Only Silver Arrows dw $F360 ; 1 Rupoor dw $F36A ; Null Item dw $F454, $F454, $F454 ; Red, Blue & Green Clocks @@ -772,7 +798,9 @@ org $A08800 dw $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A ; Free Compass dw $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A ; Free Big Key dw $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A ; Free Small Key - dw $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A ; Unused + dw $F36A ; reserved for bee traps + dw $F4A8, $F4A8, $F4A8, $F4A8, $F4A8 ; Bomb Upgrades + dw $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A ; Unused dw $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A ; Unused dw $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A ; Unused dw $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A ; Unused @@ -782,26 +810,26 @@ org $A08800 ; DATA Values to write to the above SRAM locations. { .item_values - db $01, $02, $03, $04, $01, $02, $03, $01 - db $01, $01, $01, $01, $01, $02, $FF, $01 + db $01, $02, $03, $04, $01, $02, $03, $01 + db $01, $01, $01, $01, $01, $02, $FF, $01 - db $01, $01, $01, $01, $02, $01, $FF, $FF - db $01, $01, $02, $01, $02, $01, $01, $01 + db $01, $01, $01, $01, $02, $01, $FF, $FF + db $01, $01, $02, $01, $02, $01, $01, $01 - db $FF, $01, $FF, $02, $FF, $FF, $FF, $FF - db $FF, $FF, $02, $FF, $FF, $FF, $FF, $FF + db $FF, $01, $FF, $02, $FF, $FF, $FF, $FF + db $FF, $FF, $02, $FF, $FF, $FF, $FF, $FF - db $FF, $FF, $FF, $FF, $FF, $FB, $EC, $FF - db $FF, $FF, $01, $03, $FF, $FF, $FF, $FF + db $FF, $FF, $FF, $FF, $FF, $FB, $EC, $FF + db $FF, $FF, $01, $03, $FF, $FF, $FF, $FF - db $9C, $CE, $FF, $01, $0A, $FF, $FF, $FF - db $FF, $01, $03, $01 + db $9C, $CE, $FF, $01, $0A, $FF, $FF, $FF + db $FF, $01, $03, $01 ;new db $32, $46, $80, $80 db $02 ; Master Sword (Safe) db $FF, $FF, $FF, $FF ; +5/+10 Bomb Arrows db $FF, $FF, $FF ; 3x Programmable Item - db $FF ; Upgrade-Only Sivler Arrows + db $FF ; Upgrade-Only Silver Arrows db $FF ; 1 Rupoor db $FF ; Null Item db $FF, $FF, $FF ; Red, Blue & Green Clocks @@ -815,31 +843,33 @@ org $A08800 db $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF ; Free Compass db $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF ; Free Big Key db $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF ; Free Small Key - db $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF ; Unused + db $FF ; reserved for bee traps + db $01, $02, $03, $04, $FF ; Bomb Upgrades + db $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF ; Unused db $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF ; Unused db $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF ; Unused db $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF ; Unused db $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF ; Unused - ;0x00 - Sewer Passage - ;0x02 - Hyrule Castle - ;0x04 - Eastern Palace - ;0x06 - Desert Palace - ;0x08 - Hyrule Castle 2 - ;0x0A - Swamp Palace - ;0x0C - Dark Palace - ;0x0E - Misery Mire - ;0x10 - Skull Woods - ;0x12 - Ice Palace - ;0x14 - Tower of Hera - ;0x16 - Gargoyle's Domain - ;0x18 - Turtle Rock - ;0x1A - Ganon's Tower + ;0x00 - Sewer Passage + ;0x02 - Hyrule Castle + ;0x04 - Eastern Palace + ;0x06 - Desert Palace + ;0x08 - Hyrule Castle 2 + ;0x0A - Swamp Palace + ;0x0C - Dark Palace + ;0x0E - Misery Mire + ;0x10 - Skull Woods + ;0x12 - Ice Palace + ;0x14 - Tower of Hera + ;0x16 - Gargoyle's Domain + ;0x18 - Turtle Rock + ;0x1A - Ganon's Tower .item_masks ; these are dungeon correlations to $7EF364 - $7EF369 so it knows where to store compasses, etc ; sewers and castle get 2 bits active so that they can share their items elegantly - dw $C000, $C000, $2000, $1000, $0800, $0400, $0200, $0100 - dw $0080, $0040, $0020, $0010, $0008, $0004, $0000, $0000 + dw $C000, $C000, $2000, $1000, $0800, $0400, $0200, $0100 + dw $0080, $0040, $0020, $0010, $0008, $0004, $0000, $0000 dw $0000, $0000, $0000, $0000, $0000, $0000, $0000, $0000 dw $0000, $0000, $0000, $0000, $0000, $0000, $0000, $0000 @@ -861,27 +891,27 @@ org $A08800 } ;-------------------------------------------------------------------------------- BottleListExpanded: - db $16, $2B, $2C, $2D, $3D, $3C, $48 + db $16, $2B, $2C, $2D, $3D, $3C, $48 PotionListExpanded: - db $2E, $2F, $30, $FF, $0E + db $2E, $2F, $30, $FF, $0E ;-------------------------------------------------------------------------------- Link_ReceiveItemAlternatesExpanded: { - db -1, -1, -1, -1, -1, -1, -1, -1 - db -1, -1, -1, -1, -1, -1, -1, -1 ; db -1, -1, -1, -1, $44, -1, -1, -1 + db -1, -1, -1, -1, -1, -1, -1, -1 + db -1, -1, -1, -1, -1, -1, -1, -1 ; db -1, -1, -1, -1, $44, -1, -1, -1 - db -1, -1, $35, -1, -1, -1, -1, -1 - db -1, -1, -1, -1, -1, -1, -1, -1 + db -1, -1, $35, -1, -1, -1, -1, -1 + db -1, -1, -1, -1, -1, -1, -1, -1 - db -1, -1, -1, -1, -1, -1, -1, -1 - db -1, -1, -1, -1, -1, -1, -1, -1 ; db -1, -1, $46, -1, -1, -1, -1, -1 + db -1, -1, -1, -1, -1, -1, -1, -1 + db -1, -1, -1, -1, -1, -1, -1, -1 ; db -1, -1, $46, -1, -1, -1, -1, -1 - db -1, -1, -1, -1, -1, -1, -1, -1 - db -1, -1, -1, -1, -1, -1, -1, -1 + db -1, -1, -1, -1, -1, -1, -1, -1 + db -1, -1, -1, -1, -1, -1, -1, -1 - db -1, -1, -1, -1, -1, -1, -1, -1 - db -1, -1, -1, -1 + db -1, -1, -1, -1, -1, -1, -1, -1 + db -1, -1, -1, -1 db -1, -1, -1, -1 db -1 ; Master Sword (Safe) @@ -901,7 +931,9 @@ Link_ReceiveItemAlternatesExpanded: db -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 ; Free Compass db -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 ; Free Big Key db -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 ; Free Small Key - db -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 ; Unused + db -1 ; reserved for bee traps + db -1, -1, -1, -1, -1 ; Bomb Upgrades + db -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 ; Unused db -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 ; Unused db -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 ; Unused db -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 ; Unused @@ -920,10 +952,10 @@ RTL ;DrawHUDSilverArrows: ; LDA $7EF340 : AND.w #$00FF : BNE + ; LDA !INVENTORY_SWAP_2 : AND.w #$0040 : BEQ + -; LDA.w #$2810 : STA $11C8 -; LDA.w #$2811 : STA $11CA -; LDA.w #$2820 : STA $1208 -; LDA.w #$2821 : STA $120A +; LDA.w #$2810 : STA $11C8 +; LDA.w #$2811 : STA $11CA +; LDA.w #$2820 : STA $1208 +; LDA.w #$2821 : STA $120A ; + ; LDA.w #$11CE : STA $00 ; thing we wrote over ;RTL @@ -1104,20 +1136,20 @@ AttemptItemSubstitution: RTS ;-------------------------------------------------------------------------------- CountBottles: - PHX - LDX.b #$00 - LDA $7EF35C : BEQ ++ : INX - ++ : LDA $7EF35D : BEQ ++ : INX - ++ : LDA $7EF35E : BEQ ++ : INX - ++ : LDA $7EF35F : BEQ ++ : INX - ++ - TXA - PLX + PHX + LDX.b #$00 + LDA $7EF35C : BEQ ++ : INX + ++ : LDA $7EF35D : BEQ ++ : INX + ++ : LDA $7EF35E : BEQ ++ : INX + ++ : LDA $7EF35F : BEQ ++ : INX + ++ + TXA + PLX RTS ;-------------------------------------------------------------------------------- ActivateGoal: - STZ $11 - STZ $B0 + STZ $11 + STZ $B0 JML.l StatsFinalPrep ;-------------------------------------------------------------------------------- ChestPrep: @@ -1126,7 +1158,23 @@ ChestPrep: JSL.l ChestItemServiceRequest RTL + - LDY $0C ; get item value + LDY $0C ; get item value SEC RTL ;-------------------------------------------------------------------------------- +UpdateInventoryLocationExpanded: +{ + REP #$30 + TYA : AND #$00FF : ASL A : TAX + + ; Tells what inventory location to write to. + LDA.w AddReceivedItemExpanded_item_target_addr, X : STA $00 + + SEP #$30 + + LDA.b #$7E : STA $02 + + LDA.w AddReceivedItemExpanded_item_values, Y + JSL ItemDowngradeFix + RTL +} diff --git a/retro.asm b/retro.asm index 2278dff..71285ba 100644 --- a/retro.asm +++ b/retro.asm @@ -26,6 +26,12 @@ StoreBombCount: .finite PLA : STA $7EF343 RTL +HaveAnyItems: + LDX #$13 + LDA !INFINITE_BOMBS + .next_item + ORA $7EF340, X : DEX : BPL .next_item +RTL !INFINITE_ARROWS = "$7F50C8" DecrementArrows: diff --git a/special_bombs.asm b/special_bombs.asm new file mode 100644 index 0000000..e39837c --- /dev/null +++ b/special_bombs.asm @@ -0,0 +1,246 @@ +;-------------------------------------------------------------------------------- +!ANCILLA_DAMAGE = "$06EC84" +!BOMB_LEVEL = "$7EF4A8" +; start with X = sprite index, A = ancilla index +;-------------------------------------------------------------------------------- +DamageClassCalc: + CMP #$01 : BEQ .cane + CMP #$2C : BEQ .cane + CMP #$31 : BEQ .cane + BRA .not_cane +.cane + PHA + LDA SpecialBombs : BEQ .normal_cane + LDA $0E20, X : CMP.b #$1E : BEQ .normal_cane ; crystal switch + PLA +.impervious + LDA #$FF + RTL +.normal_cane + PLA +.not_cane + CMP #$07 : BNE .no_change + LDA SpecialBombs : BEQ .normal_bombs + LDA $0E20, X : CMP.b #$D6 : BEQ .unstunned_ganon + CMP.b #$D7 : BEQ .stunned_ganon + CMP.b #$88 : BEQ .mothula + CMP.b #$92 : BEQ .helmasaur_king +.bomb_level + LDA !BOMB_LEVEL : INC A + BRA .done +.mothula + LDA !BOMB_LEVEL : INC A + CMP #$04 : !BGE .fix_mothula + BRA .done +.fix_mothula + LDA #$03 + BRA .done +.helmasaur_king + LDA $0DB0, X : CMP #$03 : !BGE .bomb_level + LDA #$08 + BRA .done +.unstunned_ganon + LDA $04C5 : CMP.b #$02 : BNE .impervious + LDA $0EE0, X : BNE .impervious + LDA #$34 : STA $0EE0, X ; give the poor pig some iframes + BRA .bomb_level +.stunned_ganon + LDA $0EE0, X : BNE .impervious + LDA #$34 : STA $0EE0, X ; give the poor pig some iframes + LDA #$20 : STA $0F10, X ; knock ganon back or something? idk + LDA #$09 + BRA .done +.normal_bombs + LDA #$07 +.no_change + PHX : TAX + LDA.l !ANCILLA_DAMAGE, X + PLX + CMP.b #$06 : BNE .done ; not arrows + LDA $7EF340 : CMP.b #$03 : !BGE .actual_silver_arrows + LDA #$06 +.done + RTL +.actual_silver_arrows + LDA $0E20, X : CMP.b #$D7 : BNE + + LDA #$20 : STA $0F10, X + + + LDA #$09 + RTL +; end with X = sprite index, A = damage class +;-------------------------------------------------------------------------------- +!SPRITE_SETUP_HIT_BOX_LONG = "$0683EA" +!UTILITY_CHECK_IF_HIT_BOXES_OVERLAP_LONG = "$0683E6" +; start with X = ancilla index, Y = sprite index +;-------------------------------------------------------------------------------- +Utility_CheckAncillaOverlapWithSprite: + LDA $0E20, Y : CMP #$09 : BEQ .giant_moldorm + CMP #$CB : BEQ .trinexx +.not_giant_moldorm ; ordinary collision checking + PHY : PHX + TYX + JSL !SPRITE_SETUP_HIT_BOX_LONG + PLX : PLY + JSL !UTILITY_CHECK_IF_HIT_BOXES_OVERLAP_LONG + RTL +.ignore_collision + CLC + RTL +.giant_moldorm + LDA $0C4A, X : CMP #$07 : BNE .ignore_collision ; don't collide with non-bombs + LDA.l SpecialBombs : BEQ .ignore_collision + LDA $0E10, Y : BNE .ignore_collision ; Moldy can have little a I-Frames, as a treat + + JSR SetUpMoldormHitbox + JSL !UTILITY_CHECK_IF_HIT_BOXES_OVERLAP_LONG + RTL +.trinexx + LDA $0C4A, X : CMP #$07 : BNE .ignore_collision ; don't collide with non-bombs + LDA.l SpecialBombs : BEQ .ignore_collision + + JSR SetUpTrinexxHitbox + JSL !UTILITY_CHECK_IF_HIT_BOXES_OVERLAP_LONG + RTL +; returns carry clear if there was no overlap +;-------------------------------------------------------------------------------- +SetUpTrinexxHitbox: + ; rearrange trinexx's hitbox to be her middle instead of her head + LDA $0CAA, Y : PHA + LDA $0E60, Y : PHA + LDA $0D10, Y : PHA + LDA $0D30, Y : PHA + LDA $0D00, Y : PHA + LDA $0D20, Y : PHA + + LDA #$80 : STA $0CAA, Y + + PHX + LDA $0E80, Y : !SUB.l $1DAF28 : AND.b #$7F : TAX + + LDA $7FFC00, X : STA $0D10, Y + LDA $7FFC80, X : STA $0D30, Y + LDA $7FFD00, X : STA $0D00, Y + LDA $7FFD80, X : STA $0D20, Y + + TYX + STZ $0E60, X + + JSL !SPRITE_SETUP_HIT_BOX_LONG + PLX + + PLA : STA $0D20, Y + PLA : STA $0D00, Y + PLA : STA $0D30, Y + PLA : STA $0D10, Y + PLA : STA $0E60, Y + PLA : STA $0CAA, Y + RTS +;-------------------------------------------------------------------------------- +SetUpMoldormHitbox: + ; rearrange moldorm's hitbox to be his tail instead of his head + LDA $0D90, Y : PHA + LDA $0F60, Y : PHA + LDA $0D10, Y : PHA + LDA $0D30, Y : PHA + LDA $0D00, Y : PHA + LDA $0D20, Y : PHA + + PHY : PHX + LDA $0E80, Y : !SUB.b #$30 : AND.b #$7F : TAX + + LDA $7FFC00, X : STA $0D10, Y + LDA $7FFC80, X : STA $0D30, Y + LDA $7FFD00, X : STA $0D00, Y + LDA $7FFD80, X : STA $0D20, Y + LDA #$01 : STA $09D0, Y + + TYX + STZ $0F60, X + + JSL !SPRITE_SETUP_HIT_BOX_LONG + + PLX : PLY + + PLA : STA $0D20, Y + PLA : STA $0D00, Y + PLA : STA $0D30, Y + PLA : STA $0D10, Y + PLA : STA $0F60, Y + PLA : STA $0D90, Y + RTS +;-------------------------------------------------------------------------------- +; start with X = ancilla index, Y = sprite index +Utility_CheckHelmasaurKingCollision: + LDA $0C4A, X : CMP #$07 : BNE .normal ; normal behavior with non-bombs + LDA.l SpecialBombs : BEQ .normal + CLC + RTL +.normal + LDA $0DB0, Y : CMP.b #$03 + RTL +; returns carry set if there is collision immunity +;-------------------------------------------------------------------------------- +Utility_CheckHammerHelmasaurKingMask: + LDA.l SpecialBombs : BNE .no_effect + LDA $0301 : AND #$0A + RTL +.no_effect + LDA #$00 + RTL +;-------------------------------------------------------------------------------- +Utility_CheckImpervious: + LDA $0E20, X : CMP.b #$CB : BEQ .trinexx +.normal + LDA $0E60, X : AND.b #$40 : BNE .impervious + LDA $0CF2 : CMP #$FF : BEQ .impervious ; special "always-impervious" class + LDA $0E20, X : CMP.b #$CC : BEQ .sidenexx : CMP.b #$CD : BEQ .sidenexx + LDA $0301 : AND.b #$0A : BEQ .not_impervious ; normal behavior if not hammer + LDA.l SpecialBombs : BEQ .not_impervious + LDA $0E20, X : CMP.b #$1E : BEQ .not_impervious ; crystal switch + CMP.b #$40 : BEQ .not_impervious ; aga barrier + BRA .impervious +.trinexx + LDA SpecialBombs : BEQ .normal + LDA $0301 : AND.b #$0A : BNE .impervious ; impervious to hammer + BRA .not_impervious +.sidenexx + LDA $0CAA, X : AND.b #$04 : BEQ .vulnerable + LDA SpecialBombs : BEQ .not_impervious + LDA $0CF2 : CMP #$06 : !BLT .impervious ; swords are ineffective + BRA .not_impervious +.vulnerable + LDA SpecialBombs : BEQ .not_impervious + LDA $0CF2 : CMP #$06 : !BGE .impervious ; non-swords are ineffective + BRA .not_impervious +.not_impervious + LDA #$00 : RTL +.impervious + LDA #$01 : RTL +; returns nonzero A if impervious +;-------------------------------------------------------------------------------- +!SPRITE_INITIALIZED_SEGMENTED = "$1DD6D1" +; start with X = sprite index +;-------------------------------------------------------------------------------- +AllowBombingMoldorm: + LDA SpecialBombs : BNE .no_disable_projectiles + INC $0BA0, X +.no_disable_projectiles + JSL !SPRITE_INITIALIZED_SEGMENTED + RTL +;-------------------------------------------------------------------------------- +DrawSwordInMenu: + LDA $7EF359 : AND.w #$00FF : CMP.w #$00FF : BEQ .noSword +.hasSword + STA $02 + LDA.w #$F859 : STA $04 + RTL +.noSword + LDA SpecialBombs : AND.w #$00FF : BNE .bombSword + LDA.w #$0000 : STA $02 + LDA.w #$F859 : STA $04 + RTL +.bombSword + LDA $7EF4A8 : AND.w #$00FF : STA $02 + LDA.w #$FC51 : STA $04 + RTL +;-------------------------------------------------------------------------------- diff --git a/swordswap.asm b/swordswap.asm index bfea58f..00f9368 100644 --- a/swordswap.asm +++ b/swordswap.asm @@ -6,11 +6,11 @@ ;GetFairySword: ; CMP.b #$49 : BNE + : LDA.b #$00 : + ; convert single fighter sword to low id one ; CMP.b #$50 : BNE + : LDA.b #$01 : + ; convert safe master sword to normal one -; CMP #$04 : !BLT + : JML.l PyramidFairy_BRANCH_IOTA : + ; for any sword, incl newer -; JSL ItemCheck_FairySword : BEQ + : JML.l PyramidFairy_BRANCH_IOTA : + ; skip if we already flagged getting this +; CMP #$04 : !BLT + : JML.l PyramidFairy_BRANCH_IOTA : + ; for any sword, incl newer +; JSL ItemCheck_FairySword : BEQ + : JML.l PyramidFairy_BRANCH_IOTA : + ; skip if we already flagged getting this ; JSL ItemSet_FairySword ; mark as got -; LDA FairySword : STA $0DC0, X ; whichever sword -; LDA.b #$05 : STA $0EB0, X ; something we overwrote, documentation unclear on purpose +; LDA FairySword : STA $0DC0, X ; whichever sword +; LDA.b #$05 : STA $0EB0, X ; something we overwrote, documentation unclear on purpose ; ;JML.l PyramidFairy_BRANCH_GAMMA ;================================================================================ @@ -45,6 +45,7 @@ LookupDamageLevel: LDA.l !StalfosBombDamage RTL + + LDA SpecialBombs : BNE .alt_table PHP REP #$20 ; set 16-bit accumulator TXA : LSR : TAX : BCS .lower @@ -58,6 +59,20 @@ RTL LDA.l Damage_Table, X AND.b #$0F RTL +.alt_table + PHP + REP #$20 ; set 16-bit accumulator + TXA : LSR : TAX : BCS .alt_lower +.alt_upper + PLP + LDA.l Damage_Table_Alt, X + LSR #4 +RTL +.alt_lower + PLP + LDA.l Damage_Table_Alt, X + AND.b #$0F +RTL ;================================================================================ ; $7F50C0 - Sword Modifier LoadModifiedSwordLevel: ; returns short @@ -146,21 +161,21 @@ GetSmithSword: REP #$20 : LDA $7EF360 : CMP #$000A : SEP #$20 : !BGE .buy .cant_afford REP #$10 - LDA.b #$7A - LDY.b #$01 - JSL.l Sprite_ShowMessageUnconditional + LDA.b #$7A + LDY.b #$01 + JSL.l Sprite_ShowMessageUnconditional LDA.b #$3C : STA $012E ; error sound SEP #$10 BRA .done .buy - LDA.l SmithItem : TAY - STZ $02E9 ; Item from NPC + LDA.l SmithItem : TAY + STZ $02E9 ; Item from NPC PHX : JSL Link_ReceiveItem : PLX REP #$20 : LDA $7EF360 : !SUB.w #$000A : STA $7EF360 : SEP #$20 ; Take 10 rupees JSL ItemSet_SmithSword - + .done JML.l Smithy_AlreadyGotSword ;================================================================================ diff --git a/tables.asm b/tables.asm index 8095852..d1cd5a6 100644 --- a/tables.asm +++ b/tables.asm @@ -98,7 +98,11 @@ db #$02 ; #$02 = Tempered Sword (default) ;org $05EBD4 ; PC 0x2EBD4 - sprite_zelda.asm:23 - (LDA $7EF359 : CMP.b #$02 : BCS .hasMasterSword) - Zelda Spawnpoint Sword Check ;db #$05 ; #$02 = Tempered Sword (default) - #$05 = All Swords ;-------------------------------------------------------------------------------- -; 0x18002B- 0x18002F (Unused) +; 0x18002B- 0x18002E (Unused) +;-------------------------------------------------------------------------------- +org $30802F ; PC 0x18003F +SpecialBombs: +db #$00 ; #$00 = Off (default) - #$01 = On ;-------------------------------------------------------------------------------- org $308030 ; PC 0x180030 EnableSRAMTrace: @@ -223,10 +227,13 @@ db #$00 ; #$00 = Off (default) - #$01 = On (frog/smith can enter multi-entrance org $30804D ; PC 0x18004D EscapeAssist: ; ScrubMode: db #$00 -;---- -mba -;m - Infinite Magic -;b - Infinite Bombs -;a - Infinite Arrows +;-MBA -mba +;M - Infinite Magic (after escape) +;B - Infinite Bombs (after escape) +;A - Infinite Arrows (after escape) +;m - Infinite Magic (during escape) +;b - Infinite Bombs (during escape) +;a - Infinite Arrows (during escape) ;-------------------------------------------------------------------------------- org $30804E ; PC 0x18004E UncleRefill: @@ -242,7 +249,7 @@ db #$01 ; #$00 = Off - #$01 = On (default) ;-------------------------------------------------------------------------------- org $308050 ; PC 0x180050 - 0x18005C CrystalPendantFlags_2: - db $00 ; Sewers + db $00 ; Sewers db $00 ; Hyrule Castle db $00 ; Eastern Palace db $00 ; Desert Palace @@ -250,7 +257,7 @@ CrystalPendantFlags_2: db $40 ; Swamp Palace db $40 ; Palace of Darkness db $40 ; Misery Mire - db $40 ; Skull Woods + db $40 ; Skull Woods db $40 ; Ice Palace .hera db $00 ; Tower of Hera @@ -630,7 +637,7 @@ dw $6434 ; #6434 - Crystal ;-------------------------------------------------------------------------------- org $02A09B ; PC 0x1209B - Bank02.asm:5802 - (pool MilestoneItem_Flags:) CrystalPendantFlags: - db $00 ; Sewers + db $00 ; Sewers db $00 ; Hyrule Castle db $04 ; Eastern Palace db $02 ; Desert Palace @@ -638,7 +645,7 @@ CrystalPendantFlags: db $10 ; Swamp Palace db $02 ; Palace of Darkness db $01 ; Misery Mire - db $40 ; Skull Woods + db $40 ; Skull Woods db $04 ; Ice Palace .hera db $01 ; Tower of Hera @@ -1377,6 +1384,13 @@ db $04 ;AD - Small Key of Ganon's Tower ;AE - Reserved ;AF - Generic Small Key + +;B0 - reserved for bee traps +;B1 - L-2 Bombs +;B2 - L-3 Bombs +;B3 - L-4 Bombs +;B4 - L-5 Bombs +;B5 - Progressive Bombs ;================================================================================ ;;Residual Portal ;org $0283E0 ; PC 0x103E0 (Bank02.asm:816) (BNE) diff --git a/utilities.asm b/utilities.asm index a9209f3..9f14647 100644 --- a/utilities.asm +++ b/utilities.asm @@ -100,19 +100,19 @@ RTL ;DATA - Loot Identifier to Sprite ID { .gfxSlots - db $06, $44, $45, $46, $2D, $20, $2E, $09 - db $09, $0A, $08, $05, $10, $0B, $2C, $1B + db $06, $44, $45, $46, $2D, $20, $2E, $09 + db $09, $0A, $08, $05, $10, $0B, $2C, $1B - db $1A, $1C, $14, $19, $0C, $07, $1D, $2F - db $07, $15, $12, $0D, $0D, $0E, $11, $17 + db $1A, $1C, $14, $19, $0C, $07, $1D, $2F + db $07, $15, $12, $0D, $0D, $0E, $11, $17 - db $28, $27, $04, $04, $0F, $16, $03, $13 - db $01, $1E, $10, $00, $00, $00, $00, $00 + db $28, $27, $04, $04, $0F, $16, $03, $13 + db $01, $1E, $10, $00, $00, $00, $00, $00 - db $00, $30, $22, $21, $24, $24, $24, $23 - db $23, $23, $29, $2A, $2C, $2B, $03, $03 + db $00, $30, $22, $21, $24, $24, $24, $23 + db $23, $23, $29, $2A, $2C, $2B, $03, $03 - db $34, $35, $31, $33, $02, $32, $36, $37 + db $34, $35, $31, $33, $02, $32, $36, $37 db $2C, $43, $0C, $38, $39, $3A, $F9, $3C ; db $2C, $06, $0C, $38, $FF, $FF, $FF, $FF @@ -146,7 +146,11 @@ RTL ;Ax db $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F ; Free Small Key - db $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49 ; Unused + ;Bx + db $49 ; reserved for bee traps + db $13, $13, $13, $13, $13 ; Bomb Upgrades + + db $49, $49, $49, $49, $49, $49, $49, $49, $49, $49 ; Unused db $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49 ; Unused db $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49 ; Unused db $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49 ; Unused @@ -181,7 +185,7 @@ GetSpritePalette: ;-------- TAX : LDA.l .gfxPalettes, X ; look up item gfx PLB : PLX - CMP.b #$F8 : !BGE .specialHandling + CMP.b #$F7 : !BGE .specialHandling RTL .specialHandling CMP.b #$FD : BNE ++ ; Progressive Sword @@ -274,7 +278,9 @@ RTL ;db $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08 ; *EVENT* db $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08 ; Free Big Key db $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08 ; Free Small Key - db $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08 ; Unused + db $08 ; reserved for bee traps + db $0A, $0A, $0A, $0A, $0A; Bomb Upgrades + db $08, $08, $08, $08, $08, $08, $08, $08, $08, $08 ; Unused db $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08 ; Unused db $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08 ; Unused db $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08 ; Unused @@ -490,12 +496,12 @@ LoadModifiedTileBufferAddress: PHA LDA !TILE_UPLOAD_OFFSET_OVERRIDE : BEQ + TAX - LDY.w #$0002 + LDY.w #$0002 LDA.w #$0000 : STA !TILE_UPLOAD_OFFSET_OVERRIDE BRA .done + - LDX.w #$2D40 - LDY.w #$0002 + LDX.w #$2D40 + LDY.w #$0002 .done PLA RTL @@ -507,7 +513,7 @@ RTL ; out: Carry - 1 = On Screen, 0 = Off Screen ;-------------------------------------------------------------------------------- Sprite_IsOnscreen: - JSR _Sprite_IsOnscreen_DoWork + JSR _Sprite_IsOnscreen_DoWork BCS + REP #$20 LDA $E2 : PHA : !SUB.w #$0F : STA $E2 @@ -522,11 +528,11 @@ Sprite_IsOnscreen: RTL _Sprite_IsOnscreen_DoWork: - LDA $0D10, X : CMP $E2 - LDA $0D30, X : SBC $E3 : BNE .offscreen + LDA $0D10, X : CMP $E2 + LDA $0D30, X : SBC $E3 : BNE .offscreen - LDA $0D00, X : CMP $E8 - LDA $0D20, X : SBC $E9 : BNE .offscreen + LDA $0D00, X : CMP $E8 + LDA $0D20, X : SBC $E9 : BNE .offscreen SEC RTS .offscreen diff --git a/zelda.asm b/zelda.asm index 358d7e8..e0ba4ec 100644 --- a/zelda.asm +++ b/zelda.asm @@ -10,7 +10,15 @@ SpawnZelda: ;-------------------------------------------------------------------------------- EndRainState: LDA $7EF3C5 : CMP.b #$02 : !BGE + ; skip if past escape already - LDA.b #$00 : STA !INFINITE_ARROWS : STA !INFINITE_BOMBS : STA !INFINITE_MAGIC + LDA.l EscapeAssist : AND #$44 + CMP #$04 : BNE + : LDA #$00 : STA !INFINITE_MAGIC : + + CMP #$40 : BNE + : STA !INFINITE_MAGIC : + + LDA.l EscapeAssist : AND #$22 + CMP #$02 : BNE + : LDA #$00 : STA !INFINITE_BOMBS : + + CMP #$20 : BNE + : STA !INFINITE_BOMBS : + + LDA.l EscapeAssist : AND #$11 + CMP #$01 : BNE + : LDA #$00 : STA !INFINITE_ARROWS : + + CMP #$10 : BNE + : STA !INFINITE_ARROWS : + LDA.b #$02 : STA $7EF3C5 ; end rain state JSL MaybeSetPostAgaWorldState +