Add pseudo-sword mode
This commit is contained in:
@@ -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:
|
||||
|
||||
BIN
damage_table_pseudo_sword.bin
Normal file
BIN
damage_table_pseudo_sword.bin
Normal file
Binary file not shown.
@@ -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
|
||||
+
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
38
generate_pseudo_sword_table.rb
Normal file
38
generate_pseudo_sword_table.rb
Normal 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
|
||||
14
hardmode.asm
14
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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -726,7 +726,7 @@ RTS
|
||||
RTL
|
||||
|
||||
.incrementBossSword
|
||||
LDA SpecialBombs : BEQ +
|
||||
LDA SpecialWeapons : CMP #$01 : BNE +
|
||||
LDA !BOMB_LEVEL : BRA ++
|
||||
+ : LDA $7EF359
|
||||
++
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
;--------------------------------------------------------------------------------
|
||||
@@ -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
|
||||
+
|
||||
|
||||
@@ -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:
|
||||
|
||||
Reference in New Issue
Block a user