Move the pyramid spawn forcing code to run before the Aga1 check. The whole point of the code is to force a pyramid spawn even if you are fighting Ganon in the fake world. (Otherwise a branch to `.done` would have been good enough). It only makes sense to also do the same thing if Aga1 is dead. The `FORCE_PYRAMID` SRAM flag was only ever set in `SetDeathWorldChecked`, which then branches immediately to the code that clears it so I removed that flag entirely. Move the spawn on pyramid code from DarkWorldFlagSet to SetDeathWorldChecked, because it never actually ran in the first function, due to the previous observation.
84 lines
2.9 KiB
NASM
84 lines
2.9 KiB
NASM
;================================================================================
|
|
; Dark World Spawn Location Fix & Master Sword Grove Fix
|
|
;--------------------------------------------------------------------------------
|
|
DarkWorldSaveFix:
|
|
LDA.b #$70 : PHA : PLB ; thing we wrote over - data bank change
|
|
JSL.l DarkWorldFlagSet
|
|
JSL.l MasterSwordFollowerClear
|
|
JSL.l StatSaveCounter
|
|
RTL
|
|
;--------------------------------------------------------------------------------
|
|
DarkWorldLoadFix:
|
|
SEP #$20 ; set 8 bit accumulator
|
|
JSL.l OnFileLoad
|
|
REP #$20 ; restore 16 bit accumulator
|
|
LDA.w #$0007 : STA $7EC00D : STA $7EC013 ; thing we wrote over - sets up some graphics timers
|
|
RTL
|
|
;--------------------------------------------------------------------------------
|
|
DarkWorldFlagSet:
|
|
PHA
|
|
|
|
LDA Bugfix_PreAgaDWDungeonDeathToFakeDW : BEQ +
|
|
LDA $10 : CMP #$12 : BEQ .done ; don't do anything in death mode
|
|
+
|
|
LDA $1B : BEQ + ; skip this unless indoors - THIS PART FIXES THE OTHER FUCKUP WITH THE PYRAMID SPAWN IN GLITCHED
|
|
LDA $A0 : BEQ .done ; skip if we died in ganon's room
|
|
+
|
|
LDA.l Bugfix_MirrorlessSQToLW : BEQ +
|
|
LDA $7EF353 : BEQ .noMirror ; check if we have the mirror
|
|
+
|
|
LDA $7EF3C5 : CMP.b #$03 : !BLT .aga1Alive ; check if agahnim 1 is alive
|
|
BRA .done
|
|
.noMirror
|
|
.aga1Alive
|
|
LDA #$00 : STA $7EF3CA ; set flag to light world
|
|
LDA $7EF3CC : CMP #$07 : BNE + : LDA.b #$08 : STA $7EF3CC : + ; convert frog to dwarf
|
|
.done
|
|
PLA
|
|
RTL
|
|
|
|
;--------------------------------------------------------------------------------
|
|
SetDeathWorldChecked:
|
|
PHA
|
|
LDA $1B : BEQ + ; skip this for indoors
|
|
LDA $040C : CMP #$FF : BNE .done ; unless it's a cave
|
|
|
|
LDA $A0 : BNE + : LDA GanonPyramidRespawn : BEQ + ; check if we died in ganon's room and pyramid respawn is enabled
|
|
BRA .pyramid
|
|
+
|
|
|
|
LDA $7EF3C5 : CMP.b #$03 : !BGE .done; thing we originally did - skip if agahnim 1 is dead
|
|
|
|
LDA.b #$00 : STA $7EF3CA : STA $7E0FFF ; set the world to the light world if he's still alive
|
|
LDA $7EF3CC : CMP #$07 : BNE .done : LDA.b #$08 : STA $7EF3CC ; convert frog to dwarf
|
|
.done
|
|
PLA
|
|
RTL
|
|
.pyramid
|
|
LDA #$40 : STA $7EF3CA ; set flag to dark world
|
|
LDA $7EF3CC : CMP #$08 : BNE + : LDA.b #$07 : STA $7EF3CC : + ; convert dwarf to frog
|
|
PLA
|
|
RTL
|
|
;--------------------------------------------------------------------------------
|
|
FakeWorldFix:
|
|
LDA FixFakeWorld : BEQ +
|
|
LDA $8A : AND.b #$40 : STA $7EF3CA
|
|
+
|
|
RTL
|
|
;--------------------------------------------------------------------------------
|
|
MasterSwordFollowerClear:
|
|
LDA $7EF3CC
|
|
CMP #$0E : BEQ .clear ; clear master sword follower
|
|
;CMP #$07 : BEQ .clear ; clear frog
|
|
;CMP #$08 : BEQ .clear ; clear dwarf - consider flute implications
|
|
RTL
|
|
.clear
|
|
LDA.b #$00 : STA $7EF3CC ; clear follower
|
|
RTL
|
|
;--------------------------------------------------------------------------------
|
|
FixAgahnimFollowers:
|
|
LDA.b #$00 : STA $7EF3CC ; clear follower
|
|
JSL PrepDungeonExit ; thing we wrote over
|
|
RTL
|
|
;================================================================================
|