From 3f4db583f536ddd9ec3b5b78d351f57e092d8fcb Mon Sep 17 00:00:00 2001 From: Kara Alexandra Date: Sat, 24 Jul 2021 15:54:10 -0700 Subject: [PATCH] Add pseudo-sword mode --- LTTP_RND_GeneralBugfixes.asm | 11 +++-- damage_table_pseudo_sword.bin | Bin 0 -> 2048 bytes darkworldspawn.asm | 2 +- dialog.asm | 4 +- generate_pseudo_sword_table.rb | 38 +++++++++++++++++ hardmode.asm | 14 ++++-- hooks.asm | 6 +++ inventory.asm | 2 +- newhud.asm | 2 +- newitems.asm | 2 +- special_bombs.asm => special_weapons.asm | 52 ++++++++++++++--------- swordswap.asm | 52 ++++++++++------------- tables.asm | 4 +- zelda.asm | 2 +- 14 files changed, 127 insertions(+), 64 deletions(-) create mode 100644 damage_table_pseudo_sword.bin create mode 100644 generate_pseudo_sword_table.rb rename special_bombs.asm => special_weapons.asm (85%) diff --git a/LTTP_RND_GeneralBugfixes.asm b/LTTP_RND_GeneralBugfixes.asm index 6e6ac22..4154b82 100644 --- a/LTTP_RND_GeneralBugfixes.asm +++ b/LTTP_RND_GeneralBugfixes.asm @@ -210,7 +210,7 @@ incsrc darkroomitems.asm incsrc fastcredits.asm incsrc msu.asm incsrc dungeonmap.asm -incsrc special_bombs.asm +incsrc special_weapons.asm incsrc variable_ganon_vulnerability.asm warnpc $A58000 @@ -287,9 +287,14 @@ incbin sheet73.gfx warnpc $31E501 org $31E800 -Damage_Table_Alt: +Damage_Table_Bombs: incbin damage_table_sword_bombs.bin -warnpc $31F001 +warnpc $31F000 + +org $31F000 +Damage_Table_Pseudo: +incbin damage_table_pseudo_sword.bin +warnpc $31F800 org $338000 GFX_HUD_Palette: diff --git a/damage_table_pseudo_sword.bin b/damage_table_pseudo_sword.bin new file mode 100644 index 0000000000000000000000000000000000000000..68cc0161f65261ea4aba48fe77f13be684539bae GIT binary patch literal 2048 zcmd5+v2GJV5Z%2c3Y~B6ilp@3Nx1d;3QB{B1foguAqa^SP#`Qsk&+KU5dMIkCXph+ z4@UxatC!QGZneAv zR}>*dX;HMfe;|s>KH~T^>>Uj_@G0r3pCI>CsXDD|FT(M09REeIj9EuORo*zi<$~DV zH&CGP-U{DGz(AhP^1<$+)cGSa=kW+3)@qv9^ZLL8hj=>Gdy$E5CSDm!Q26JE!tWuL zc&Af4{9Os$lp1a=Rpf$V;PD^`v%t>-(z4_F0C6Soiu$@a;EjQ=k_HL%JeR8XH$9>L z$2ct&`%5V5aBJh-q~q_EXMxtOW;w(dMJ`UUP|9T_*bgb`<`?31^NT6YL1*XXoGAD_ zuBQ_tUa#kSUvj|#=Gc54FX?6;PI24iHPCrPO@jM)d|g`hmo%K01osT;b>Ou!W-SO% zZ?_!1;q!_eg3mjwLKPJwzH>`-}bvbu{Nc6%%L z*B-2H+> 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_pseudo_sword.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/hardmode.asm b/hardmode.asm index 1b7fe8b..4d43367 100644 --- a/hardmode.asm +++ b/hardmode.asm @@ -76,12 +76,18 @@ GetItemDamageValue: CPX.b #$04 : BEQ .boomerang CPX.b #$05 : BEQ .boomerang CPX.b #$39 : BEQ .hookshot - CPX.b #$3b : BEQ .hookshot - CPX.b #$3c : BEQ .hookshot - CPX.b #$3d : BEQ .hookshot + CPX.b #$3B : BEQ .hookshot + CPX.b #$3C : BEQ .hookshot + CPX.b #$3D : BEQ .hookshot + + LDA.l SpecialWeapons : CMP #$02 : BNE .normal + TXA : AND #$78 : CMP #$28 : BNE .normal + LDA $0DB8F1, X : BEQ .noDamage + LDA #$01 +RTL .normal - lda $0db8f1,x ;what we wrote over + LDA $0DB8F1, X ; what we wrote over RTL .boomerang LDA.l StunItemAction : AND #$01 : BNE .normal diff --git a/hooks.asm b/hooks.asm index aa92b11..f4de276 100755 --- a/hooks.asm +++ b/hooks.asm @@ -2789,3 +2789,9 @@ NOP org $0DD677 ; Bank0D.asm@1303 (JSL Ancilla_CheckSpriteDamage.preset_class) JSL Ganon_CheckBeeVulnerability ;-------------------------------------------------------------------------------- + +;================================================================================ +; Pseudo-Sword Mode +;-------------------------------------------------------------------------------- +org $06ED70 ; Bank06.asm@4842 (LDA $06ED39, X : STA $0CF2) +JSL StoreSwordDamage diff --git a/inventory.asm b/inventory.asm index 8e9264a..71effa0 100644 --- a/inventory.asm +++ b/inventory.asm @@ -726,7 +726,7 @@ RTS RTL .incrementBossSword - LDA SpecialBombs : BEQ + + LDA SpecialWeapons : CMP #$01 : BNE + LDA !BOMB_LEVEL : BRA ++ + : LDA $7EF359 ++ diff --git a/newhud.asm b/newhud.asm index 23e3cc7..9ef3013 100644 --- a/newhud.asm +++ b/newhud.asm @@ -8,7 +8,7 @@ SEP #$30 LDA !INFINITE_BOMBS : BNE .infinite_bombs .finite_bombs - LDA.l SpecialBombs : BEQ .normal + LDA.l SpecialWeapons : CMP #$01 : BNE .normal LDA.l !BOMB_LEVEL : BEQ .no_bombs .normal LDA.l $7EF343 ; bombs diff --git a/newitems.asm b/newitems.asm index 249f77c..29deff9 100755 --- a/newitems.asm +++ b/newitems.asm @@ -402,7 +402,7 @@ AddReceivedItemExpandedGetItem: ++ JMP .done + CMP.b #$B1 : !BLT + : CMP.b #$B6 : !BGE + ; Bomb Upgrades - LDA.l SpecialBombs : BEQ ++ + LDA.l SpecialWeapons : CMP #$01 : BNE ++ LDA #$01 : STA $7F50C9 ; infinite bombs ++ BRA .done diff --git a/special_bombs.asm b/special_weapons.asm similarity index 85% rename from special_bombs.asm rename to special_weapons.asm index ea6ce4e..5c25e65 100644 --- a/special_bombs.asm +++ b/special_weapons.asm @@ -14,20 +14,27 @@ DamageClassCalc: CMP #$01 : BEQ .cane CMP #$2C : BEQ .cane CMP #$31 : BEQ .cane - BRA .not_cane + CMP #$0C : BEQ .beam + BRA .not_cane_or_beam .cane PHA - LDA SpecialBombs : BEQ .normal_cane - LDA $0E20, X : CMP.b #$1E : BEQ .normal_cane ; crystal switch + LDA SpecialWeapons : CMP #$01 : BNE .normal + LDA $0E20, X : CMP.b #$1E : BEQ .normal ; crystal switch PLA .impervious LDA #$FF RTL -.normal_cane +.beam + PHA + LDA SpecialWeapons : CMP #$02 : BNE .normal PLA -.not_cane + LDA #$05 + RTL +.normal + PLA +.not_cane_or_beam CMP #$07 : BNE .no_change - LDA SpecialBombs : BEQ .normal_bombs + LDA SpecialWeapons : CMP #$01 : BNE .normal_bombs LDA !BOMB_LEVEL : BEQ .normal_bombs LDA $0E20, X : CMP.b #$D6 : BEQ .unstunned_ganon CMP.b #$D7 : BEQ .stunned_ganon @@ -77,7 +84,7 @@ DamageClassCalc: RTL .actual_silver_arrows LDA $0E20, X : CMP.b #$D7 : BNE + - LDA SpecialBombs : BNE .normal_arrows + LDA SpecialWeapons : CMP #$01 : BEQ .normal_arrows LDA #$20 : STA $0F10, X + LDA #$09 @@ -103,7 +110,7 @@ Utility_CheckAncillaOverlapWithSprite: RTL .giant_moldorm LDA $0C4A, X : CMP #$07 : BNE .ignore_collision ; don't collide with non-bombs - LDA.l SpecialBombs : BEQ .ignore_collision + LDA.l SpecialWeapons : CMP #$01 : BNE .ignore_collision LDA $0E10, Y : BNE .ignore_collision ; Moldy can have little a I-Frames, as a treat JSR SetUpMoldormHitbox @@ -111,7 +118,7 @@ Utility_CheckAncillaOverlapWithSprite: RTL .trinexx LDA $0C4A, X : CMP #$07 : BNE .ignore_collision ; don't collide with non-bombs - LDA.l SpecialBombs : BEQ .ignore_collision + LDA.l SpecialWeapons : CMP #$01 : BNE .ignore_collision JSR SetUpTrinexxHitbox JSL !UTILITY_CHECK_IF_HIT_BOXES_OVERLAP_LONG @@ -187,7 +194,7 @@ SetUpMoldormHitbox: ; 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 + LDA.l SpecialWeapons : CMP #$01 : BNE .normal CLC RTL .normal @@ -196,7 +203,7 @@ Utility_CheckHelmasaurKingCollision: ; returns carry set if there is collision immunity ;-------------------------------------------------------------------------------- Utility_CheckHammerHelmasaurKingMask: - LDA.l SpecialBombs : BNE .no_effect + LDA.l SpecialWeapons : CMP #$01 : BEQ .no_effect LDA $0301 : AND #$0A RTL .no_effect @@ -211,21 +218,21 @@ Utility_CheckImpervious: 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 JSL Ganon_CheckHammerVulnerability : BCS .not_impervious - LDA.l SpecialBombs : BEQ .not_impervious + LDA.l SpecialWeapons : CMP #$01 : BNE .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 SpecialWeapons : CMP #$01 : BNE .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 SpecialWeapons : CMP #$01 : BNE .not_impervious LDA $0CF2 : CMP #$06 : !BLT .impervious ; swords are ineffective BRA .not_impervious .vulnerable - LDA SpecialBombs : BEQ .not_impervious + LDA SpecialWeapons : CMP #$01 : BNE .not_impervious LDA $0CF2 : CMP #$06 : !BGE .impervious ; non-swords are ineffective BRA .not_impervious .not_impervious @@ -238,7 +245,7 @@ Utility_CheckImpervious: ; start with X = sprite index ;-------------------------------------------------------------------------------- AllowBombingMoldorm: - LDA SpecialBombs : BNE .no_disable_projectiles + LDA SpecialWeapons : CMP #$01 : BEQ .no_disable_projectiles INC $0BA0, X .no_disable_projectiles JSL !SPRITE_INITIALIZED_SEGMENTED @@ -248,14 +255,14 @@ AllowBombingBarrier: ; what we wrote over LDA $0D00, X : !SUB.b #$0C : STA $0D00, X LDA $0E20, X : CMP #$40 : BNE .disable_projectiles - LDA SpecialBombs : BNE .no_disable_projectiles + LDA SpecialWeapons : CMP #$01 : BEQ .no_disable_projectiles .disable_projectiles INC $0BA0, X .no_disable_projectiles RTL ;-------------------------------------------------------------------------------- DrawSwordInMenu: - LDA SpecialBombs : AND.w #$00FF : BNE .bombSword + LDA SpecialWeapons : AND.w #$00FF : CMP.w #$0001 : BEQ .bombSword LDA $7EF359 : AND.w #$00FF : CMP.w #$00FF : BEQ .noSword .hasSword STA $02 @@ -280,10 +287,17 @@ DrawBombOnHud: MVN $7E, $21 PLB - LDA.l SpecialBombs : AND.w #$00FF : BEQ .regularBombs + LDA.l SpecialWeapons : AND.w #$00FF : CMP.w #$0001 : BNE .regularBombs LDA.l !BOMB_LEVEL : AND.w #$00FF : ASL #2 : TAX LDA.l BombIcon, X : STA.l $7EC71A LDA.l BombIcon+2, X : STA.l $7EC71C .regularBombs RTL ;-------------------------------------------------------------------------------- +StoreSwordDamage: + LDA.l SpecialWeapons : CMP #$02 : BEQ + + LDA.l $06ED39, X : RTL + + + LDA #$05 + RTL +;-------------------------------------------------------------------------------- diff --git a/swordswap.asm b/swordswap.asm index 323c8ff..0198059 100644 --- a/swordswap.asm +++ b/swordswap.asm @@ -39,40 +39,34 @@ LoadSwordForDamage: JSR.w LoadModifiedSwordLevel ; load normal sword value RTL ;================================================================================ +macro LookupDamageSubclass(table_address) + PHP + REP #$20 ; set 16-bit accumulator + TXA : LSR : TAX : BCS + + PLP + LDA.l , X + LSR #4 + BRA ++ + + + PLP + LDA.l , X + AND.b #$0F + ++ +endmacro +;================================================================================ ;!StalfosBombDamage = "$7F509D" LookupDamageLevel: CPX.w #$0918 : BNE + LDA.l !StalfosBombDamage RTL + - LDA SpecialBombs : BNE .alt_table - PHP - REP #$20 ; set 16-bit accumulator - TXA : LSR : TAX : BCS .lower -.upper - PLP - LDA.l Damage_Table, X - LSR #4 -RTL -.lower - PLP - 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 + LDA SpecialWeapons : CMP #$01 : BEQ .bomb_table + CMP #$02 : BEQ .pseudo_table + %LookupDamageSubclass(Damage_Table) : RTL + .bomb_table + %LookupDamageSubclass(Damage_Table_Bombs) : RTL + .pseudo_table + %LookupDamageSubclass(Damage_Table_Pseudo) : RTL ;================================================================================ ; $7F50C0 - Sword Modifier LoadModifiedSwordLevel: ; returns short @@ -134,7 +128,7 @@ CheckTabletSword: LDA $7EF34B : BEQ + ; check for hammer LDA.b #$02 : RTL + - LDA.l SpecialBombs : BEQ + + LDA.l SpecialWeapons : CMP #$01 : BNE + LDA !BOMB_LEVEL : CMP #$02 : !BLT + ; check for master bombs LDA.b #$02 : RTL + diff --git a/tables.asm b/tables.asm index cb612e9..3b1247d 100644 --- a/tables.asm +++ b/tables.asm @@ -105,8 +105,8 @@ GanonVulnerabilityItem: db #$00 ; #$00 = Default behavior (silver arrows) ;-------------------------------------------------------------------------------- org $30802F ; PC 0x18003F -SpecialBombs: -db #$00 ; #$00 = Off (default) - #$01 = On +SpecialWeapons: +db #$00 ; #$00 = Off (default) - #$01 = Bomb-Only mode - #$02 = Pseudosword mode ;-------------------------------------------------------------------------------- org $308030 ; PC 0x180030 EnableSRAMTrace: diff --git a/zelda.asm b/zelda.asm index e83064f..9ce2e44 100644 --- a/zelda.asm +++ b/zelda.asm @@ -20,7 +20,7 @@ EndRainState: CMP #$01 : BNE + : LDA #$00 : STA !INFINITE_ARROWS : + CMP #$10 : BNE + : STA !INFINITE_ARROWS : + - LDA.l SpecialBombs : BEQ + + LDA.l SpecialWeapons : CMP #$01 : BNE + LDA.l !BOMB_LEVEL : BEQ + LDA #$01 : STA !INFINITE_BOMBS +