6 Commits

Author SHA1 Message Date
e5420fc651 Sidnexx damage modify? 2023-03-17 11:36:24 -05:00
9f441108e0 Moldorm stunnable with hookshot/boomerang; only damagable when stunned 2023-03-17 11:16:29 -05:00
e3afa34088 Sword swing slight delay as sword is upgraded 2023-03-16 23:15:55 -05:00
5139f6d857 Fix bunny pot-throwing 2023-03-16 19:10:46 -05:00
e55af7e610 Using shovel indoors bunnies link 2023-03-15 23:13:58 -05:00
e11ac2c130 Initial trolls:
- random dash timer
- random bomb timer
- flute sometimes summons chickens
- ice physics while carrying things
- lowered i-frames with increased hearts/armor
- Blind impervious (TODO: allow hitting with bunny pots)
2023-03-15 22:06:02 -05:00
7 changed files with 261 additions and 25 deletions

View File

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

View File

@@ -23,7 +23,11 @@ CuccoStorm:
SEP #$30 ; set 8-bit accumulator index registers SEP #$30 ; set 8-bit accumulator index registers
LDA.l !CUCCO_STORM : BEQ + ; only if storm is on 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 ; turn off cucco storm if indoors
BRA +
.check
LDA.l LoopFrames : AND.b #$7F : BNE + ; check every 128 frames LDA.l LoopFrames : AND.b #$7F : BNE + ; check every 128 frames
- -

Binary file not shown.

View File

@@ -2397,11 +2397,11 @@ org $02EC2E ;<- 016C2E
JSL.l Overworld_LoadNewTiles JSL.l Overworld_LoadNewTiles
NOP #$02 NOP #$02
;================================================================================ ;================================================================================
org $07A3E2 ;<- 3A3E2 Bank07.asm:5764 (LDA.b #$80 : STA $03F0) ; org $07A3E2 ;<- 3A3E2 Bank07.asm:5764 (LDA.b #$80 : STA $03F0)
JSL.l FreeDuckCheck : BEQ + ; JSL.l FreeDuckCheck : BEQ +
NOP ; NOP
skip 3 ; a JSR we need to keep ; 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) org $07A9AC ; <- 3A9AC - Bank07.asm:6628 (LDA $0C : ORA $0E : STA $00 : AND.b #$0C : BEQ BRANCH_BETA)
JML MirrorBonk JML MirrorBonk
@@ -2776,11 +2776,9 @@ org $07839E ; bunny BAGE check
BunnyRead: BunnyRead:
JSR.w $07B5A9 ; check A button JSR.w $07B5A9 ; check A button
BCC .noA BCC .noA
JSR.w CheckIfReading JSL BunnyThrowPot
BNE .noread BRA .noA
JSR.w $07B4DB NOP #3
NOP
.noread
.noA .noA
org $07FFF4 org $07FFF4
@@ -3071,3 +3069,65 @@ NOP
org $02D7D2 ; BEQ .face_up org $02D7D2 ; BEQ .face_up
NOP #2 ; this fixes Link's direction after mirroring and falling after entering through back of tavern 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

View File

@@ -126,6 +126,8 @@ Utility_CheckAncillaOverlapWithSprite:
RTL RTL
.giant_moldorm .giant_moldorm
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
LDA $0C4A, X : CMP #$1F : BEQ .check_collision_moldorm ; hookshot
CMP #$05 : BEQ .check_collision_moldorm ; boomerang
LDA.l SpecialWeapons : CMP #$01 : BNE ++ LDA.l SpecialWeapons : CMP #$01 : BNE ++
LDA $0C4A, X : CMP #$07 : BEQ .check_collision_moldorm LDA $0C4A, X : CMP #$07 : BEQ .check_collision_moldorm
BRA .ignore_collision ; don't collide with non-bombs BRA .ignore_collision ; don't collide with non-bombs
@@ -274,25 +276,29 @@ Utility_CheckHammerHelmasaurKingMask:
RTL RTL
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
Utility_CheckImpervious: Utility_CheckImpervious:
LDA $0E20, X : CMP.b #$CB : BNE .normal LDA.w $0E20, X : CMP.b #$CE : BEQ .blind
CMP.b #$CB : BNE .normal
.trinexx .trinexx
LDA SpecialWeapons : CMP #$01 : BEQ + LDA.l SpecialWeapons : CMP #$01 : BEQ +
CMP #$03 : BEQ + CMP #$03 : BEQ +
CMP #$04 : BEQ + CMP #$04 : BEQ +
CMP #$05 : BEQ + CMP #$05 : BEQ +
CMP #$06 : BEQ .check_sidenexx CMP #$06 : BEQ .check_sidenexx
BRA .normal 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 LDA.w $0301 : AND.b #$0A : BNE .impervious ; impervious to hammer
.check_sidenexx .check_sidenexx
LDA.w $0DD1 : ORA.w $0DD2 : BNE .impervious ; at least one sidenexx alive LDA.w $0DD1 : ORA.w $0DD2 : BNE .impervious ; at least one sidenexx alive
LDA.w $0D80, X : CMP.b #$02 : BCS .impervious ; at least one sidenexx alive LDA.w $0D80, X : CMP.b #$02 : BCS .impervious ; at least one sidenexx alive
BRA .not_impervious BRA .not_impervious
.normal .normal
LDA $0E60, X : AND.b #$40 : BNE .impervious LDA.w $0E60, X : AND.b #$40 : BNE .impervious
LDA $0CF2 : CMP #$FF : BEQ .impervious ; special "always-impervious" class LDA.w $0CF2 : CMP.b #$FF : BEQ .impervious ; special "always-impervious" class
LDA $0E20, X : CMP.b #$CC : BEQ .sidenexx : CMP.b #$CD : BEQ .sidenexx LDA.w $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.w $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 SpecialWeapons : CMP #$01 : BEQ + LDA SpecialWeapons : CMP #$01 : BEQ +
CMP #$03 : BEQ + CMP #$03 : BEQ +
@@ -300,7 +306,7 @@ Utility_CheckImpervious:
CMP #$05 : BEQ + CMP #$05 : BEQ +
BRA .not_impervious BRA .not_impervious
+ +
LDA $0E20, X : CMP.b #$1E : BEQ .not_impervious ; crystal switch LDA.w $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
.not_impervious .not_impervious
@@ -332,12 +338,6 @@ Utility_CheckImpervious:
; start with X = sprite index ; start with X = sprite index
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
AllowBombingMoldorm: 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 .no_disable_projectiles
JSL !SPRITE_INITIALIZED_SEGMENTED JSL !SPRITE_INITIALIZED_SEGMENTED
RTL RTL

View File

@@ -36,6 +36,10 @@ LoadSwordForDamage:
CMP.b #$04 : !BLT + : DEC : + ; if it's gold sword, change it to tempered CMP.b #$04 : !BLT + : DEC : + ; if it's gold sword, change it to tempered
RTL RTL
.notMoth .notMoth
CMP.b #$CE : BNE .notBlind
LDA.b #$01
RTL
.notBlind
JSR.w LoadModifiedSwordLevel ; load normal sword value JSR.w LoadModifiedSwordLevel ; load normal sword value
RTL RTL
;================================================================================ ;================================================================================
@@ -115,8 +119,10 @@ LoadModifiedIceFloorValue:
LDA $5D : CMP #$01 : BEQ + : CMP #$17 : BEQ + : CMP #$1C : BEQ + LDA $5D : CMP #$01 : BEQ + : CMP #$17 : BEQ + : CMP #$1C : BEQ +
LDA $5E : CMP #$02 : BEQ + LDA $5E : CMP #$02 : BEQ +
LDA $5B : BNE + LDA $5B : BNE +
LDA.w $0308 : BIT #$80 : BNE .yes
LDA.l $30802D : BIT #$01 : BEQ ++ 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 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 : ORA #$10 : RTS
++ : LDA.w $0348 : ORA $7F50C7 : RTS ++ : LDA.w $0348 : ORA $7F50C7 : RTS
+ : LDA.w $0348 + : LDA.w $0348

165
trolls.asm Normal file
View File

@@ -0,0 +1,165 @@
IFrameData:
db $00, $14, $28
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 #$3F
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 $7F50C5 ; 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 $7F50C5 ; 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 #$02
JSL $068156
LDA.b $3B
AND.b #$7F
STA.b $3B
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