Add pseudo-sword mode

This commit is contained in:
2021-07-24 15:54:10 -07:00
parent 44f3f10bc1
commit 3f4db583f5
14 changed files with 127 additions and 64 deletions

View File

@@ -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:

Binary file not shown.

View File

@@ -146,7 +146,7 @@ SetEscapeAssist:
BIT.b #$10 : BEQ + : STA !INFINITE_ARROWS : +
++
LDA.l SpecialBombs : BEQ +
LDA.l SpecialWeapons : CMP #$01 : BNE +
LDA.l !BOMB_LEVEL : BEQ +
LDA #$01 : STA !INFINITE_BOMBS
+

View File

@@ -306,8 +306,8 @@ DialogGanon2:
LDA.w #$018D : JMP .done
+
LDA.l GanonVulnerabilityItem : AND #$00FF : BNE .special_item
LDA.l SpecialBombs
AND.w #$00FF : BNE .bombs ; bombs if special bomb mode
LDA.l SpecialWeapons : AND.w #$00FF
CMP.w #$0001 : BEQ .bombs ; bombs if special bomb mode
.silver_arrows
LDA.l $7EF38E

View File

@@ -0,0 +1,38 @@
def process_values(sprite, values)
ret = values.clone
if (ret[1] == 0 && sprite != 0x40) || sprite == 0xCE
# fighter sword does no damage and it's not the evil barrier, or it's Blind
ret[5] = 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_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

View File

@@ -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

View File

@@ -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

View File

@@ -726,7 +726,7 @@ RTS
RTL
.incrementBossSword
LDA SpecialBombs : BEQ +
LDA SpecialWeapons : CMP #$01 : BNE +
LDA !BOMB_LEVEL : BRA ++
+ : LDA $7EF359
++

View File

@@ -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

View File

@@ -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

View File

@@ -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
;--------------------------------------------------------------------------------

View File

@@ -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 <table_address>, X
LSR #4
BRA ++
+
PLP
LDA.l <table_address>, 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
+

View File

@@ -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:

View File

@@ -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
+