4 Commits

Author SHA1 Message Date
f0c7b26d0f vitreous and ganon fixes for damage table 2023-06-15 07:06:23 -05:00
f87b95525f Fix moldorm damage table 2023-06-14 20:10:34 -05:00
148a9760e6 Fix trinexx damage table 2023-06-14 19:38:02 -05:00
45b56c6328 Trolls 2023-06-14 19:02:51 -05:00
17 changed files with 429 additions and 27 deletions

View File

@@ -227,6 +227,7 @@ org $A28000 ; contrib area
incsrc contrib.asm
incsrc special_weapons.asm
incsrc variable_ganon_vulnerability.asm
incsrc trolls.asm
warnpc $A38000
org $A38000

View File

@@ -4,9 +4,13 @@
!BOOTS_MODIFIER = "$7F50CE"
ModifyBoots:
PHA
LDA.b $A0 : CMP.b #$06 : BNE +
LDA.b $A1 : CMP.b #$00 : BEQ .no_boots
+
LDA !BOOTS_MODIFIER : CMP.b #$01 : BNE +
PLA : AND AbilityFlags : ORA.b #$04 : RTL ; yes boots
+ : CMP.b #$02 : BNE +
.no_boots
PLA : AND AbilityFlags : AND.b #$FB : RTL ; no boots
+ : LDA FakeBoots : CMP.b #$01 : BNE +
LDA $5B : BEQ ++ : LDA $59 : BNE + ; hover check

View File

@@ -79,7 +79,10 @@ InvertDPad:
.crowd_control
LDA !INVERT_DPAD : BNE +
LDA.b $A0 : CMP.b #$DE : BNE .off
LDA.b #$01 : BRA +
.off
LDA $4218 : STA $00
LDA $4219 : STA $01
JML.l InvertDPadReturn

View File

@@ -23,7 +23,11 @@ CuccoStorm:
SEP #$30 ; set 8-bit accumulator index registers
LDA.l !CUCCO_STORM : BEQ + ; only if storm is on
LDA.b $10 : CMP.b #$09 : BNE + ; only if outdoors
LDA.b $10 : CMP.b #$09 : BEQ .check ; only if outdoors
.indoors
LDA.b #$00 : STA.l !CUCCO_STORM
BRA +
.check
LDA.l LoopFrames : AND.b #$7F : BNE + ; check every 128 frames
-

Binary file not shown.

View File

@@ -284,7 +284,10 @@ DialogGanon1:
REP #$20
LDA.w #$018C
BCC +
JSL CheckMushroom
LDA.w #$016D
BCC +
LDA.w #$0197
+ STA $1CF0
SEP #$20
JSL.l Sprite_ShowMessageMinimal_Alt
@@ -304,6 +307,10 @@ DialogGanon2:
REP #$20
BCS +
LDA.w #$018D : JMP .done
+
JSL CheckMushroom
BCC +
LDA.w #$0198 : JMP .done
+
LDA.l GanonVulnerabilityItem : AND #$00FF : BNE .special_item
LDA.l SpecialWeapons : AND.w #$00FF

View File

@@ -7,8 +7,11 @@
;--------------------------------------------------------------------------------
GoalItemGanonCheck:
LDA $0E20, X : CMP.b #$D6 : BNE .success ; skip if not ganon
LDA.w $0D80, X : CMP.b #$12 : BEQ .fail
JSL.l CheckGanonVulnerability
BCS .success
BCC .fail
JSL CheckMushroom
BCC .success
.fail
LDA $0D80, X : CMP.b #17 : !BLT .success ; decmial 17 because Acmlm's chart is decimal

122
hooks.asm
View File

@@ -2397,11 +2397,11 @@ org $02EC2E ;<- 016C2E
JSL.l Overworld_LoadNewTiles
NOP #$02
;================================================================================
org $07A3E2 ;<- 3A3E2 Bank07.asm:5764 (LDA.b #$80 : STA $03F0)
JSL.l FreeDuckCheck : BEQ +
NOP
skip 3 ; a JSR we need to keep
+
; org $07A3E2 ;<- 3A3E2 Bank07.asm:5764 (LDA.b #$80 : STA $03F0)
; JSL.l FreeDuckCheck : BEQ +
; NOP
; skip 3 ; a JSR we need to keep
; +
;================================================================================
org $07A9AC ; <- 3A9AC - Bank07.asm:6628 (LDA $0C : ORA $0E : STA $00 : AND.b #$0C : BEQ BRANCH_BETA)
JML MirrorBonk
@@ -2776,11 +2776,9 @@ org $07839E ; bunny BAGE check
BunnyRead:
JSR.w $07B5A9 ; check A button
BCC .noA
JSR.w CheckIfReading
BNE .noread
JSR.w $07B4DB
NOP
.noread
JSL BunnyThrowPot
BRA .noA
NOP #3
.noA
org $07FFF4
@@ -3071,3 +3069,107 @@ NOP
org $02D7D2 ; BEQ .face_up
NOP #2 ; this fixes Link's direction after mirroring and falling after entering through back of tavern
;--------------------------------------------------------------------------------
; Various nonsense
;--------------------------------------------------------------------------------
org $0780B9 ; LDA.b #$3A : STA.w $031F
JSL CalcIFrames
NOP
org $09814E ; LDA.w Bomb_timer : STA.w $039F, X
JSL SetBombTimer
NOP #2
org $07B282 ; LDA.b #$1D : STA.w $0374
JSL SetDashTimer
NOP
org $07A3E7 ; LDA.b #$13 : JSR PlaySFX_Set2 : ...
JSL ProcessFlute
BCS +
RTS
NOP #14 : +
org $08E073 ; LDA.b #$0E : STA.b $10
JSL FluteMap
org $07A329
JSL UseShovel
BCS +
RTS
NOP #4 : +
org $079D11
JSL SwordSwingDelay : NOP
org $079DAB
JSL SwordSwingDelay : NOP
org $079DEE
JSL SwordSwingDelay : NOP
org $088E4A
JSL MaybeRecoil
BRA + : NOP #6 : +
org $06EC4D
JSL MaybeRecoil2
BRA + : NOP #10 : +
; make moldorm check head for hitbox instead of tail
org $1DDADD
; BRA + : NOP #22 : +
BRA + : NOP #26 : +
org $1DDAF9
BRA + : NOP : +
org $1DDB01
BRA + : NOP #3 : +
; make moldorm repel sword when not stunned
org $06F354
JSL CheckMoldormRepel
BCC .not_moldorm
NOP
skip 17
.not_moldorm
; make mini moldorms faster
org $0697DF
db $30, $2C, $22, $12, $00, $EE, $DE, $D4
db $D0, $D4, $DE, $EE, $00, $12, $22, $2C
db $00, $12, $22, $2C, $30, $2C, $22, $12
db $00, $EE, $DE, $D4, $D0, $D4, $DE, $EE
; make lanmolas faster
org $05A4B7
LDA.b #$18
; ganon - silvers just don't work like they used to
org $0DB93D
db $08
; ganon - randomize vulnerability when stunned
org $1D9010
JSL StunGanon : NOP
; agahnim - pattern? we don't need no steenken pattern!
org $1ED637
JSL AgaDecision : NOP
; agahnim - no guaranteed normal balls
org $1ED6ED
NOP #2
; helmie's mask is brittle
org $1E8112
db $03, $03, $03, $03, $00
; vitreous - bombs work a bit better
org $0DB938
db $0C
; tile rooms - make them a bit faster
org $09BA20
LDA.b #$B8
org $1EBC56
LDA.b #$28

View File

@@ -5,7 +5,7 @@ NewDrawHud:
!BOMBCOUNT_DRAW_ADDRESS = "$7EC75A"
;================================================================================
LDA InfiniteBombsModifier : BNE .infinite_bombs
JSL CheckInfiniteBombs : BNE .infinite_bombs
.finite_bombs
LDA.l SpecialWeapons : CMP #$01 : BNE .normal
LDA.l SpecialWeaponLevel : BEQ .no_bombs

View File

@@ -1,5 +1,5 @@
IsItemAvailable:
LDA InfiniteBombsModifier : BEQ .finite
JSL CheckInfiniteBombs : BEQ .finite
.infinite
CPX.b #$04 : BNE .finite
LDA.b #$01 : RTL
@@ -7,27 +7,27 @@ IsItemAvailable:
LDA EquipmentWRAM-1, X
RTL
LoadBombCount:
LDA InfiniteBombsModifier : BNE .infinite
JSL CheckInfiniteBombs : BNE .infinite
.finite
LDA BombsEquipment
.infinite
RTL
LoadBombCount16:
LDA InfiniteBombsModifier : AND.w #$00FF : BNE .infinite
JSL CheckInfiniteBombs16 : BNE .infinite
.finite
LDA BombsEquipment
.infinite
RTL
StoreBombCount:
JSL IncrementBombsPlacedCounter
PHA : LDA InfiniteBombsModifier : BEQ .finite
PHA : JSL CheckInfiniteBombs : BEQ .finite
.infinite
PLA : LDA.b #$01 : RTL
.finite
PLA : STA BombsEquipment
RTL
SearchForEquippedItem:
LDA InfiniteBombsModifier : BEQ +
JSL CheckInfiniteBombs : BEQ +
LDA.b #$01 : LDX.b #$00 : RTL
+
LDA BowEquipment ; thing we wrote over

View File

@@ -126,6 +126,8 @@ Utility_CheckAncillaOverlapWithSprite:
RTL
.giant_moldorm
LDA $0E10, Y : BNE .ignore_collision ; Moldy can have little a I-Frames, as a treat
LDA $0C4A, X : CMP #$1F : BEQ .check_collision_moldorm ; hookshot
CMP #$05 : BEQ .check_collision_moldorm ; boomerang
LDA.l SpecialWeapons : CMP #$01 : BNE ++
LDA $0C4A, X : CMP #$07 : BEQ .check_collision_moldorm
BRA .ignore_collision ; don't collide with non-bombs
@@ -274,7 +276,8 @@ Utility_CheckHammerHelmasaurKingMask:
RTL
;--------------------------------------------------------------------------------
Utility_CheckImpervious:
LDA $0E20, X : CMP.b #$CB : BNE .normal
LDA $0E20, X : CMP.b #$CE : BEQ .blind
CMP.b #$CB : BNE .normal
.trinexx
LDA SpecialWeapons : CMP #$01 : BEQ +
CMP #$03 : BEQ +
@@ -282,6 +285,9 @@ Utility_CheckImpervious:
CMP #$05 : BEQ +
CMP #$06 : BEQ .check_sidenexx
BRA .normal
.blind
LDA.w $0301 : AND.b #$0A : BNE .impervious ; impervious to hammer
BRA .normal
+
LDA $0301 : AND.b #$0A : BNE .impervious ; impervious to hammer
.check_sidenexx
@@ -332,12 +338,6 @@ Utility_CheckImpervious:
; start with X = sprite index
;--------------------------------------------------------------------------------
AllowBombingMoldorm:
LDA SpecialWeapons : CMP #$01 : BEQ .no_disable_projectiles
CMP #$03 : BEQ .no_disable_projectiles
CMP #$04 : BEQ .no_disable_projectiles
CMP #$05 : BEQ .no_disable_projectiles
CMP #$06 : BEQ .no_disable_projectiles
INC $0BA0, X
.no_disable_projectiles
JSL !SPRITE_INITIALIZED_SEGMENTED
RTL

View File

@@ -392,6 +392,7 @@ InvertDPadModifier: skip 1
TemporaryOHKO: skip 1
SpriteSwapper: skip 1
BootsModifier: skip 1 ; (0=Off, 1=Always, 2=Never)
GanonVulnerabilityItem: skip 1 ; item ganon is vulnerable to while stunned
;================================================================================
; Expanded SRAM ($7F6000 - $7F6FFF)

View File

@@ -36,6 +36,10 @@ LoadSwordForDamage:
CMP.b #$04 : !BLT + : DEC : + ; if it's gold sword, change it to tempered
RTL
.notMoth
CMP.b #$CE : BNE .notBlind
LDA.b #$01
RTL
.notBlind
JSR.w LoadModifiedSwordLevel ; load normal sword value
RTL
;================================================================================
@@ -115,8 +119,11 @@ LoadModifiedIceFloorValue:
LDA $5D : CMP #$01 : BEQ + : CMP #$17 : BEQ + : CMP #$1C : BEQ +
LDA $5E : CMP #$02 : BEQ +
LDA $5B : BNE +
LDA.b $A0 : CMP.b #$29 : BEQ .yes
LDA.w $0308 : BIT #$80 : BNE .yes
LDA.l $30802D : BIT #$01 : BEQ ++
LDA $A0 : CMP #$16 : BEQ ++ ; swamp supertile with current -- fine for temporary physics but impossible without boots for permanent
.yes
LDA.w $0348 : ORA $7F50C7 : ORA #$10 : RTS
++ : LDA.w $0348 : ORA $7F50C7 : RTS
+ : LDA.w $0348

View File

@@ -107,7 +107,7 @@ ChallengeModes:
db #$00 ; #$00 = Default behavior;
;--------------------------------------------------------------------------------
org $30802E ; PC 0x18003E
GanonVulnerabilityItem:
DONOTUSE__GanonVulnerabilityItem:
db #$00 ; #$00 = Default behavior (silver arrows)
;--------------------------------------------------------------------------------
org $30802F ; PC 0x18003F

View File

@@ -122,8 +122,10 @@ dw #$FFFF, #$7FFF
;--------------------------------------------------------------------------------
!TEMPORARY_OHKO = "$7F50CC"
DrawChallengeTimer:
LDA.b $A0 : AND.w #$00FF : CMP.w #$00C8 : BEQ .is_ohko
LDA !TEMPORARY_OHKO : AND.w #$00FF : BEQ +
LDA.w #$2807 : STA $7EC790
.is_ohko
LDA.w #$2807 : STA $7EC790
LDA.w #$280A : STA $7EC792
LDA.w #$280B : STA $7EC794
LDA.w #$280C : STA $7EC796
@@ -175,6 +177,7 @@ DrawChallengeTimer:
RTL
;--------------------------------------------------------------------------------
OHKOTimer:
LDA.b $A0 : CMP.b #$C8 : BEQ .kill
LDA TemporaryOHKO : BNE .kill
LDA.l TimeoutBehavior : CMP #$02 : BNE +
LDA !Status : AND.b #$02 : BEQ +

220
trolls.asm Normal file
View File

@@ -0,0 +1,220 @@
IFrameData:
db $00, $10, $20
CalcIFrames:
LDA.l ArmorEquipment
PHX : TAX
LDA.l MaximumHealth : LSR #3
CLC : ADC.l IFrameData, X
EOR.b #$FF
CLC : ADC.b #$3E
PLX
STA.w $031F
RTL
SetBombTimer:
JSL GetRandomInt
STA.w $039F, X
RTL
SetDashTimer:
JSL GetRandomInt
AND.b #$1F
STA.w $0374
JSL GetRandomInt
AND.b #$0F
CLC : ADC.w $0374
STA.w $0374
RTL
ProcessFlute:
LDA.b $1B
BNE .play_and_leave ; indoors
LDA.b $10
CMP.b #$0B
BEQ .play_and_leave ; special overworld
JSL GetRandomInt
BIT #$08
BNE .cucco
.normal
LDA.b $8A
AND.b #$40
BNE .play_and_leave ; dark world
JSR PlayDuck
SEC : RTL ; light world; play duck sound and resume normal behavior
.cucco
JSR PlayCluck ; outdoors; play cucco sound
LDA.b #$01
STA.l !CUCCO_STORM ; turn on cucco storm
CLC : RTL ; do not summon duck
.play_and_leave
JSR PlayDuck
CLC : RTL
PlayDuck:
LDA.b #$13
STA.w $0CF8
JSL Sound_SetSfxPanWithPlayerCoords
ORA.w $0CF8
STA.w $012E
RTS
PlayCluck:
LDA.b #$30
STA.w $0CF8
JSL Sound_SetSfxPanWithPlayerCoords
ORA.w $0CF8
STA.w $012E
RTS
FluteMap:
LDA.b #$00
STA.l !CUCCO_STORM ; turn off cuccos
LDA.b #$0E
STA.b $10
RTL
UseShovel:
LDA.b $1B
BEQ .normal
.indoors
REP #$20
LDA.w #$0200
STA.w $03F5
SEP #$20
CLC
RTL
.normal
LDA.l $07A310
STA.b $3D
STZ.w $030D
STZ.w $0300
SEC
RTL
BunnyThrowPot:
LDA.b $A0 : CMP.b #$0D : BNE .throw
LDA.b $A1 : CMP.b #$00 : BEQ .no_throw
.throw
LDA.b #$02
JSL $068156
LDA.b $3B
AND.b #$7F
STA.b $3B
.no_throw
RTL
SwordSwingDelay:
LDA.l SwordEquipment : CMP.b #$02 : !BLT .normal
CMP.b #$FF : BEQ .normal
CPX.b #$04 : BEQ .section_4
CPX.b #$05 : BEQ .section_5
CPX.b #$06 : BNE .normal
.section_6
LDA.l SwordEquipment : CMP.b #$04 : !BGE .normal
BRA .add_one
.section_5
LDA.l SwordEquipment : CMP.b #$02 : !BGE .normal
BRA .add_one
.section_4
LDA.l SwordEquipment : CMP.b #$03 : !BGE .normal
.add_one
LDA.l $079CAF, X
STA.b $3D
INC
RTL
.normal
LDA.l $079CAF, X
STA.b $3D
RTL
MaybeRecoil:
LDA.w $0E20, Y
CMP.b #$09 ; skip recoil on the giant 'dorm
BEQ .done
LDA.l $088E75, X
STA.w $0F40, Y
LDA.l $088E79, X
STA.w $0F30, Y
.done
RTL
MaybeRecoil2:
LDA.w $0E20, X
CMP.b #$09
BEQ .moldorm
LDA.b $00
EOR.b #$FF
INC
STA.w $0F30, X
LDA.b $01
EOR.b #$FF
INC
STA.w $0F40, X
RTL
.moldorm ; skip recoil on the giant 'dorm and unstun
STZ.w $0B58, X
STZ.w $0D90, X
RTL
CheckMoldormRepel:
CMP.b #$09
BNE .not_moldorm
LDA.w $0D90, X
BEQ .repel
LDA.w $0B58, X
BEQ .repel
.no_repel
LDA.b #$01
SEC : RTL
.repel
LDA.b #$00
SEC : RTL
.not_moldorm
CLC : RTL
CheckMushroom:
PHP
SEP #$20
LDA.l InventoryTracking
AND.b #$20
BEQ +
PLP : SEC : RTL
+ PLP : CLC : RTL
AgaDecision:
LDA.b $A0
CMP.b #$20
BNE .aga2
JSL RNG_Agahnim1
AND.b #$04
STA.w $0E30, X
CMP.b #$04
RTL
.aga2
STZ.w $0E30, X
CMP.b #$04
RTL
CheckInfiniteBombs:
LDA.l InfiniteBombsModifier : BNE .yes
LDA.b $A0
CMP.b #$90
BEQ .yes
.no
LDA.b #$00
RTL
.yes
LDA.b #$01
RTL
CheckInfiniteBombs16:
LDA.l InfiniteBombsModifier : AND.w #$00FF : BNE .yes
LDA.b $A0 : AND.w #$00FF
CMP.w #$0090
BEQ .yes
.no
LDA.w #$0000
RTL
.yes
LDA.w #$0001
RTL

View File

@@ -126,6 +126,53 @@ CheckBeeBoss:
RTL
; return non-zero A if entity is a boss (and bee should not attack)
;--------------------------------------------------------------------------------
StunGanon:
JSL RNG_Ganon
BIT.b #$30
BEQ .non_magic
.magic
AND.b #$0E
LSR
BRA .chosen
.non_magic
AND.b #$0C
LSR #2
ORA.b #$08
.chosen
PHX
TAX
LDA.l Ganon_RandomizeItem, X
STA.l GanonVulnerabilityItem
PLX
JSL DialogItem
LDA.b #$D7
STA.w $0E20, X
RTL
;--------------------------------------------------------------------------------
DialogItem:
PHX : PHY
LDA.l GanonVulnerabilityItem
ASL
TAX
LDA.l Ganon_TextBox+1, X
TAY
LDA.l Ganon_TextBox, X
JSL Sprite_ShowMessageUnconditional
PLY : PLX
RTL
;--------------------------------------------------------------------------------
Ganon_RandomizeItem:
db #$05, #$06, #$07, #$08
db #$09, #$0A, #$11, #$12
db #$01, #$02, #$03, #$0C
;--------------------------------------------------------------------------------
Ganon_TextBox:
dw #$0000 ; default behavior--assume silvers
dw #$0199, #$019A, #$019B, #$019C, #$019D
dw #$019E, #$019F, #$01A0, #$01A1, #$01A2
dw #$0000, #$01A3, #$0000, #$0000, #$0000
dw #$01A4, #$01A5, #$01A6, #$0000, #$0000
;--------------------------------------------------------------------------------
Ganon_CheckByAncilla:
db #$00 ; default behavior--we shouldn't be checking the table here anyway
db #$00, #$05, #$1F, #$07, #$00