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 fastcredits.asm
incsrc msu.asm incsrc msu.asm
incsrc dungeonmap.asm incsrc dungeonmap.asm
incsrc special_bombs.asm incsrc special_weapons.asm
incsrc variable_ganon_vulnerability.asm incsrc variable_ganon_vulnerability.asm
warnpc $A58000 warnpc $A58000
@@ -287,9 +287,14 @@ incbin sheet73.gfx
warnpc $31E501 warnpc $31E501
org $31E800 org $31E800
Damage_Table_Alt: Damage_Table_Bombs:
incbin damage_table_sword_bombs.bin 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 org $338000
GFX_HUD_Palette: GFX_HUD_Palette:

Binary file not shown.

View File

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

View File

@@ -306,8 +306,8 @@ DialogGanon2:
LDA.w #$018D : JMP .done LDA.w #$018D : JMP .done
+ +
LDA.l GanonVulnerabilityItem : AND #$00FF : BNE .special_item LDA.l GanonVulnerabilityItem : AND #$00FF : BNE .special_item
LDA.l SpecialBombs LDA.l SpecialWeapons : AND.w #$00FF
AND.w #$00FF : BNE .bombs ; bombs if special bomb mode CMP.w #$0001 : BEQ .bombs ; bombs if special bomb mode
.silver_arrows .silver_arrows
LDA.l $7EF38E 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 #$04 : BEQ .boomerang
CPX.b #$05 : BEQ .boomerang CPX.b #$05 : BEQ .boomerang
CPX.b #$39 : BEQ .hookshot CPX.b #$39 : BEQ .hookshot
CPX.b #$3b : BEQ .hookshot CPX.b #$3B : BEQ .hookshot
CPX.b #$3c : BEQ .hookshot CPX.b #$3C : BEQ .hookshot
CPX.b #$3d : 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 .normal
lda $0db8f1,x ;what we wrote over LDA $0DB8F1, X ; what we wrote over
RTL RTL
.boomerang .boomerang
LDA.l StunItemAction : AND #$01 : BNE .normal LDA.l StunItemAction : AND #$01 : BNE .normal

View File

@@ -2789,3 +2789,9 @@ NOP
org $0DD677 ; Bank0D.asm@1303 (JSL Ancilla_CheckSpriteDamage.preset_class) org $0DD677 ; Bank0D.asm@1303 (JSL Ancilla_CheckSpriteDamage.preset_class)
JSL Ganon_CheckBeeVulnerability 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 RTL
.incrementBossSword .incrementBossSword
LDA SpecialBombs : BEQ + LDA SpecialWeapons : CMP #$01 : BNE +
LDA !BOMB_LEVEL : BRA ++ LDA !BOMB_LEVEL : BRA ++
+ : LDA $7EF359 + : LDA $7EF359
++ ++

View File

@@ -8,7 +8,7 @@ SEP #$30
LDA !INFINITE_BOMBS : BNE .infinite_bombs LDA !INFINITE_BOMBS : BNE .infinite_bombs
.finite_bombs .finite_bombs
LDA.l SpecialBombs : BEQ .normal LDA.l SpecialWeapons : CMP #$01 : BNE .normal
LDA.l !BOMB_LEVEL : BEQ .no_bombs LDA.l !BOMB_LEVEL : BEQ .no_bombs
.normal .normal
LDA.l $7EF343 ; bombs LDA.l $7EF343 ; bombs

View File

@@ -402,7 +402,7 @@ AddReceivedItemExpandedGetItem:
++ ++
JMP .done JMP .done
+ CMP.b #$B1 : !BLT + : CMP.b #$B6 : !BGE + ; Bomb Upgrades + 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 LDA #$01 : STA $7F50C9 ; infinite bombs
++ ++
BRA .done BRA .done

View File

@@ -14,20 +14,27 @@ DamageClassCalc:
CMP #$01 : BEQ .cane CMP #$01 : BEQ .cane
CMP #$2C : BEQ .cane CMP #$2C : BEQ .cane
CMP #$31 : BEQ .cane CMP #$31 : BEQ .cane
BRA .not_cane CMP #$0C : BEQ .beam
BRA .not_cane_or_beam
.cane .cane
PHA PHA
LDA SpecialBombs : BEQ .normal_cane LDA SpecialWeapons : CMP #$01 : BNE .normal
LDA $0E20, X : CMP.b #$1E : BEQ .normal_cane ; crystal switch LDA $0E20, X : CMP.b #$1E : BEQ .normal ; crystal switch
PLA PLA
.impervious .impervious
LDA #$FF LDA #$FF
RTL RTL
.normal_cane .beam
PHA
LDA SpecialWeapons : CMP #$02 : BNE .normal
PLA PLA
.not_cane LDA #$05
RTL
.normal
PLA
.not_cane_or_beam
CMP #$07 : BNE .no_change CMP #$07 : BNE .no_change
LDA SpecialBombs : BEQ .normal_bombs LDA SpecialWeapons : CMP #$01 : BNE .normal_bombs
LDA !BOMB_LEVEL : BEQ .normal_bombs LDA !BOMB_LEVEL : BEQ .normal_bombs
LDA $0E20, X : CMP.b #$D6 : BEQ .unstunned_ganon LDA $0E20, X : CMP.b #$D6 : BEQ .unstunned_ganon
CMP.b #$D7 : BEQ .stunned_ganon CMP.b #$D7 : BEQ .stunned_ganon
@@ -77,7 +84,7 @@ DamageClassCalc:
RTL RTL
.actual_silver_arrows .actual_silver_arrows
LDA $0E20, X : CMP.b #$D7 : BNE + 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 #$20 : STA $0F10, X
+ +
LDA #$09 LDA #$09
@@ -103,7 +110,7 @@ Utility_CheckAncillaOverlapWithSprite:
RTL RTL
.giant_moldorm .giant_moldorm
LDA $0C4A, X : CMP #$07 : BNE .ignore_collision ; don't collide with non-bombs 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 LDA $0E10, Y : BNE .ignore_collision ; Moldy can have little a I-Frames, as a treat
JSR SetUpMoldormHitbox JSR SetUpMoldormHitbox
@@ -111,7 +118,7 @@ Utility_CheckAncillaOverlapWithSprite:
RTL RTL
.trinexx .trinexx
LDA $0C4A, X : CMP #$07 : BNE .ignore_collision ; don't collide with non-bombs 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 JSR SetUpTrinexxHitbox
JSL !UTILITY_CHECK_IF_HIT_BOXES_OVERLAP_LONG JSL !UTILITY_CHECK_IF_HIT_BOXES_OVERLAP_LONG
@@ -187,7 +194,7 @@ SetUpMoldormHitbox:
; start with X = ancilla index, Y = sprite index ; start with X = ancilla index, Y = sprite index
Utility_CheckHelmasaurKingCollision: Utility_CheckHelmasaurKingCollision:
LDA $0C4A, X : CMP #$07 : BNE .normal ; normal behavior with non-bombs 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 CLC
RTL RTL
.normal .normal
@@ -196,7 +203,7 @@ Utility_CheckHelmasaurKingCollision:
; returns carry set if there is collision immunity ; returns carry set if there is collision immunity
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
Utility_CheckHammerHelmasaurKingMask: Utility_CheckHammerHelmasaurKingMask:
LDA.l SpecialBombs : BNE .no_effect LDA.l SpecialWeapons : CMP #$01 : BEQ .no_effect
LDA $0301 : AND #$0A LDA $0301 : AND #$0A
RTL RTL
.no_effect .no_effect
@@ -211,21 +218,21 @@ Utility_CheckImpervious:
LDA $0E20, X : CMP.b #$CC : BEQ .sidenexx : CMP.b #$CD : BEQ .sidenexx 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 $0301 : AND.b #$0A : BEQ .not_impervious ; normal behavior if not hammer
JSL Ganon_CheckHammerVulnerability : BCS .not_impervious 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 LDA $0E20, X : CMP.b #$1E : BEQ .not_impervious ; crystal switch
CMP.b #$40 : BEQ .not_impervious ; aga barrier CMP.b #$40 : BEQ .not_impervious ; aga barrier
BRA .impervious BRA .impervious
.trinexx .trinexx
LDA SpecialBombs : BEQ .normal LDA SpecialWeapons : CMP #$01 : BNE .normal
LDA $0301 : AND.b #$0A : BNE .impervious ; impervious to hammer LDA $0301 : AND.b #$0A : BNE .impervious ; impervious to hammer
BRA .not_impervious BRA .not_impervious
.sidenexx .sidenexx
LDA $0CAA, X : AND.b #$04 : BEQ .vulnerable 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 LDA $0CF2 : CMP #$06 : !BLT .impervious ; swords are ineffective
BRA .not_impervious BRA .not_impervious
.vulnerable .vulnerable
LDA SpecialBombs : BEQ .not_impervious LDA SpecialWeapons : CMP #$01 : BNE .not_impervious
LDA $0CF2 : CMP #$06 : !BGE .impervious ; non-swords are ineffective LDA $0CF2 : CMP #$06 : !BGE .impervious ; non-swords are ineffective
BRA .not_impervious BRA .not_impervious
.not_impervious .not_impervious
@@ -238,7 +245,7 @@ Utility_CheckImpervious:
; start with X = sprite index ; start with X = sprite index
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
AllowBombingMoldorm: AllowBombingMoldorm:
LDA SpecialBombs : BNE .no_disable_projectiles LDA SpecialWeapons : CMP #$01 : BEQ .no_disable_projectiles
INC $0BA0, X INC $0BA0, X
.no_disable_projectiles .no_disable_projectiles
JSL !SPRITE_INITIALIZED_SEGMENTED JSL !SPRITE_INITIALIZED_SEGMENTED
@@ -248,14 +255,14 @@ AllowBombingBarrier:
; what we wrote over ; what we wrote over
LDA $0D00, X : !SUB.b #$0C : STA $0D00, X LDA $0D00, X : !SUB.b #$0C : STA $0D00, X
LDA $0E20, X : CMP #$40 : BNE .disable_projectiles LDA $0E20, X : CMP #$40 : BNE .disable_projectiles
LDA SpecialBombs : BNE .no_disable_projectiles LDA SpecialWeapons : CMP #$01 : BEQ .no_disable_projectiles
.disable_projectiles .disable_projectiles
INC $0BA0, X INC $0BA0, X
.no_disable_projectiles .no_disable_projectiles
RTL RTL
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
DrawSwordInMenu: 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 LDA $7EF359 : AND.w #$00FF : CMP.w #$00FF : BEQ .noSword
.hasSword .hasSword
STA $02 STA $02
@@ -280,10 +287,17 @@ DrawBombOnHud:
MVN $7E, $21 MVN $7E, $21
PLB 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 !BOMB_LEVEL : AND.w #$00FF : ASL #2 : TAX
LDA.l BombIcon, X : STA.l $7EC71A LDA.l BombIcon, X : STA.l $7EC71A
LDA.l BombIcon+2, X : STA.l $7EC71C LDA.l BombIcon+2, X : STA.l $7EC71C
.regularBombs .regularBombs
RTL 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 JSR.w LoadModifiedSwordLevel ; load normal sword value
RTL 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" ;!StalfosBombDamage = "$7F509D"
LookupDamageLevel: LookupDamageLevel:
CPX.w #$0918 : BNE + CPX.w #$0918 : BNE +
LDA.l !StalfosBombDamage LDA.l !StalfosBombDamage
RTL RTL
+ +
LDA SpecialBombs : BNE .alt_table LDA SpecialWeapons : CMP #$01 : BEQ .bomb_table
PHP CMP #$02 : BEQ .pseudo_table
REP #$20 ; set 16-bit accumulator %LookupDamageSubclass(Damage_Table) : RTL
TXA : LSR : TAX : BCS .lower .bomb_table
.upper %LookupDamageSubclass(Damage_Table_Bombs) : RTL
PLP .pseudo_table
LDA.l Damage_Table, X %LookupDamageSubclass(Damage_Table_Pseudo) : RTL
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
;================================================================================ ;================================================================================
; $7F50C0 - Sword Modifier ; $7F50C0 - Sword Modifier
LoadModifiedSwordLevel: ; returns short LoadModifiedSwordLevel: ; returns short
@@ -134,7 +128,7 @@ CheckTabletSword:
LDA $7EF34B : BEQ + ; check for hammer LDA $7EF34B : BEQ + ; check for hammer
LDA.b #$02 : RTL 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 !BOMB_LEVEL : CMP #$02 : !BLT + ; check for master bombs
LDA.b #$02 : RTL LDA.b #$02 : RTL
+ +

View File

@@ -105,8 +105,8 @@ GanonVulnerabilityItem:
db #$00 ; #$00 = Default behavior (silver arrows) db #$00 ; #$00 = Default behavior (silver arrows)
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
org $30802F ; PC 0x18003F org $30802F ; PC 0x18003F
SpecialBombs: SpecialWeapons:
db #$00 ; #$00 = Off (default) - #$01 = On db #$00 ; #$00 = Off (default) - #$01 = Bomb-Only mode - #$02 = Pseudosword mode
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
org $308030 ; PC 0x180030 org $308030 ; PC 0x180030
EnableSRAMTrace: EnableSRAMTrace:

View File

@@ -20,7 +20,7 @@ EndRainState:
CMP #$01 : BNE + : LDA #$00 : STA !INFINITE_ARROWS : + CMP #$01 : BNE + : LDA #$00 : STA !INFINITE_ARROWS : +
CMP #$10 : BNE + : 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.l !BOMB_LEVEL : BEQ +
LDA #$01 : STA !INFINITE_BOMBS LDA #$01 : STA !INFINITE_BOMBS
+ +