diff --git a/LTTP_RND_GeneralBugfixes.asm b/LTTP_RND_GeneralBugfixes.asm index 90a02c9..0da7f0a 100644 --- a/LTTP_RND_GeneralBugfixes.asm +++ b/LTTP_RND_GeneralBugfixes.asm @@ -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 diff --git a/boots.asm b/boots.asm index 219c445..8c4e4c2 100644 --- a/boots.asm +++ b/boots.asm @@ -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 diff --git a/controllerjank.asm b/controllerjank.asm index 5fc65ba..9c41ef4 100644 --- a/controllerjank.asm +++ b/controllerjank.asm @@ -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 diff --git a/cuccostorm.asm b/cuccostorm.asm index 2d40f39..27be4c5 100644 --- a/cuccostorm.asm +++ b/cuccostorm.asm @@ -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 - diff --git a/damage_table.bin b/damage_table.bin index fe0d046..5860da1 100644 Binary files a/damage_table.bin and b/damage_table.bin differ diff --git a/dialog.asm b/dialog.asm index 73abf86..ae42f10 100644 --- a/dialog.asm +++ b/dialog.asm @@ -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 diff --git a/goalitem.asm b/goalitem.asm index aeb9f05..50929dd 100644 --- a/goalitem.asm +++ b/goalitem.asm @@ -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 diff --git a/hooks.asm b/hooks.asm index 26f1187..c884f55 100755 --- a/hooks.asm +++ b/hooks.asm @@ -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 diff --git a/newhud.asm b/newhud.asm index affb90a..71b6b35 100644 --- a/newhud.asm +++ b/newhud.asm @@ -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 diff --git a/retro.asm b/retro.asm index 62ed683..9c09b29 100644 --- a/retro.asm +++ b/retro.asm @@ -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 diff --git a/special_weapons.asm b/special_weapons.asm index a261901..de4fd0e 100644 --- a/special_weapons.asm +++ b/special_weapons.asm @@ -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 diff --git a/sram.asm b/sram.asm index e7cf692..03219da 100644 --- a/sram.asm +++ b/sram.asm @@ -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) diff --git a/swordswap.asm b/swordswap.asm index fdc46fe..06d3c04 100644 --- a/swordswap.asm +++ b/swordswap.asm @@ -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 diff --git a/tables.asm b/tables.asm index b862e3e..7b2ad18 100644 --- a/tables.asm +++ b/tables.asm @@ -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 diff --git a/timer.asm b/timer.asm index 5353697..ff64c7d 100644 --- a/timer.asm +++ b/timer.asm @@ -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 + diff --git a/trolls.asm b/trolls.asm new file mode 100644 index 0000000..0cb30d9 --- /dev/null +++ b/trolls.asm @@ -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 diff --git a/variable_ganon_vulnerability.asm b/variable_ganon_vulnerability.asm index e2a7a4d..f181d2e 100644 --- a/variable_ganon_vulnerability.asm +++ b/variable_ganon_vulnerability.asm @@ -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