 920cffda2d
			
		
	
	920cffda2d
	
	
	
		
			
			* initial work on procedure patch * more flexibility load default procedure for version 5 patches add args for procedure add default extension for tokens and bsdiff allow specifying additional required extensions for generation * pushing current changes to go fix tloz bug * move tokens into a separate inheritable class * forgot the commit to remove token from ProcedurePatch * further cleaning from bad commit * start on docstrings * further work on docstrings and typing * improve docstrings * fix incorrect docstring * cleanup * clean defaults and docstring * define interface that has only the bare minimum required for `Patch.create_rom_file` * change to dictionary.get * remove unnecessary if statement * update to explicitly check for procedure, restore compatible version and manual override * Update Files.py * remove struct uses * Update Rom.py * convert KDL3 to APPP * change class variables to instance variables * Update worlds/Files.py Co-authored-by: black-sliver <59490463+black-sliver@users.noreply.github.com> * Update worlds/Files.py Co-authored-by: black-sliver <59490463+black-sliver@users.noreply.github.com> * move required_extensions to tuple * fix missing tuple ellipsis * fix classvar mixup * rename tokens to _tokens. use hasattr * type hint cleanup * Update Files.py * initial base for local items, need to finish * coo not clean * handle local items for real, appp cleanup * actually make bosses send their locations * fix cloudy park 4 rule, zero deathlink message * remove redundant door_shuffle bool when generic ER gets in, this whole function gets rewritten. So just clean it a little now. * properly fix deathlink messages, fix fill error * update docs * add prefill items * fix kine fill error * Update Rom.py * Update Files.py * mypy and softlock fix * Update Gifting.py * mypy phase 1 * fix rare async client bug * Update __init__.py * typing cleanup * fix stone softlock because of the way Kine's Stone works, you can't clear the stone blocks before clearing the burning blocks, so we have to bring Burning from outside * Update Rom.py * Add option groups * Rename to lowercase * finish rename * whoops broke the world * fix animal duplication bug * overhaul filler generation * add Miku flavor * Update gifting.py * fix issues related to max_hs increase * Update test_locations.py * fix boss shuffle not working if level shuffle is disabled * fix bleeding default levels * Update options.py * thought this would print seed * yay bad merges * forgot options too * yeah lets just break generation while at it * this is probably a problem * cap required heart stars * Revert "cap required heart stars" This reverts commit 759efd3e2b14ec2855082de041ac989cb9c5d500. * fix duplication removal placement, deprecated test option * forgot that we need to account for what we place * move location ids * rewrite trap handling * further stage renumber fixes * forgot one more * basic UT support * fix local heart star checks * fix pattern --------- Co-authored-by: beauxq <beauxq@yahoo.com> Co-authored-by: black-sliver <59490463+black-sliver@users.noreply.github.com> Co-authored-by: NewSoupVi <57900059+NewSoupVi@users.noreply.github.com>
		
			
				
	
	
		
			1339 lines
		
	
	
		
			20 KiB
		
	
	
	
		
			NASM
		
	
	
	
	
	
			
		
		
	
	
			1339 lines
		
	
	
		
			20 KiB
		
	
	
	
		
			NASM
		
	
	
	
	
	
| fullsa1rom
 | |
| 
 | |
| !GAME_STATUS = $36D0
 | |
| 
 | |
| ; SNES hardware registers
 | |
| !VMADDL = $002116
 | |
| !VMDATAL = $002118
 | |
| !MDMAEN = $00420B
 | |
| !DMAP0 = $004300
 | |
| !BBAD0 = $004301
 | |
| !A1T0L = $004302
 | |
| !A1B0 = $004304
 | |
| !DAS0L = $004305
 | |
| 
 | |
| org $008033
 | |
|     JSL WriteBWRAM
 | |
|     NOP #5
 | |
| 
 | |
| org $00A245
 | |
| HSVPatch:
 | |
|   BRA .Jump
 | |
|   PHX
 | |
|   LDA $6CA0,X
 | |
|   TAX
 | |
|   LDA $6E22,X
 | |
|   JSR $A25B
 | |
|   PLX
 | |
|   INX
 | |
|   .Jump:
 | |
|   JSL HeartStarVisual
 | |
| 
 | |
| 
 | |
| org $00A3FC
 | |
|     JSL NintenHalken
 | |
|     NOP
 | |
| 
 | |
| org $00EAE4
 | |
|     JSL MainLoopHook
 | |
|     NOP
 | |
| 
 | |
| org $00F85E
 | |
|     JSL SpeedTrap
 | |
|     NOP #2
 | |
| 
 | |
| org $00FFC0
 | |
|     db "KDL3_BASEPATCH_ARCHI"
 | |
| 
 | |
| org $00FFD8
 | |
|     db $06
 | |
| 
 | |
| org $018405
 | |
|     JSL PauseMenu
 | |
| 
 | |
| org $01AFC8
 | |
|     JSL HeartStarCheck
 | |
|     NOP #13
 | |
| 
 | |
| org $01B013
 | |
|     SEC ; Remove Dedede Bad Ending
 | |
| 
 | |
| org $01B050
 | |
|     JSL HookBossPurify
 | |
|     NOP
 | |
| 
 | |
| org $02B7B0 ; Zero unlock
 | |
|     LDA $80A0
 | |
|     CMP #$0001
 | |
| 
 | |
| org $02C238
 | |
|     LDA #$0006
 | |
|     JSL OpenWorldUnlock
 | |
|     NOP #5
 | |
| 
 | |
| org $02C27C
 | |
|     JSL HeartStarSelectFix
 | |
|     NOP #2
 | |
| 
 | |
| org $02C317
 | |
|     JSL LoadFont
 | |
| 
 | |
| org $02C39D
 | |
|     JSL StageCompleteSet
 | |
|     NOP #2
 | |
| 
 | |
| org $02C3D9
 | |
|     JSL StrictBosses
 | |
|     NOP #2
 | |
| 
 | |
| org $02C3F0
 | |
|     JSL OpenWorldBossUnlock
 | |
|     NOP #6
 | |
| 
 | |
| org $02C463
 | |
|     JSL NormalGoalSet
 | |
|     NOP #2
 | |
| 
 | |
| org $049CD7
 | |
|     JSL AnimalFriendSpawn
 | |
| 
 | |
| org $06801E
 | |
|     JSL ConsumableSet
 | |
| 
 | |
| org $068518
 | |
|     JSL CopyAbilityOverride
 | |
|     NOP #2
 | |
| 
 | |
| org $099F35
 | |
|     JSL HeartStarCutsceneFix
 | |
| 
 | |
| org $09A01F
 | |
|     JSL HeartStarGraphicFix
 | |
|     NOP #2
 | |
|     db $B0
 | |
| 
 | |
| org $09A0AE
 | |
|     JSL HeartStarGraphicFix
 | |
|     NOP #2
 | |
|     db $90
 | |
| 
 | |
| org $0A87E8
 | |
|     JSL CopyAbilityAnimalOverride
 | |
|     NOP #2
 | |
| 
 | |
| org $12B238
 | |
|     JSL FinalIcebergFix
 | |
|     NOP #10
 | |
|     db $B0
 | |
| 
 | |
| org $14A3EB
 | |
|     LDA $07A2, Y
 | |
|     JSL StarsSet
 | |
|     NOP #3
 | |
| 
 | |
| org $15BC13
 | |
|     JML GiftGiving
 | |
|     NOP
 | |
| 
 | |
| org $0799A0
 | |
| CopyAbilityOverride:
 | |
|     LDA $54F3, Y
 | |
|     PHA
 | |
|     ASL
 | |
|     TAX
 | |
|     PLA
 | |
|     CMP $8020, X
 | |
|     NOP #2
 | |
|     BEQ .StoreAbilityK
 | |
|     LDA #$0000
 | |
|     .StoreAbilityK:
 | |
|     STA $54A9, Y
 | |
|     RTL
 | |
|     NOP #4
 | |
| CopyAbilityAnimalOverride:
 | |
|     PHA
 | |
|     ASL
 | |
|     TAY
 | |
|     PLA
 | |
|     CMP $8020, Y
 | |
|     NOP
 | |
|     BEQ .StoreAbilityA
 | |
|     LDA #$0000
 | |
|     .StoreAbilityA:
 | |
|     STA $54A9, X
 | |
|     STA $39DF, X
 | |
|     RTL
 | |
| 
 | |
| HeartStarCheck:
 | |
|     TXA
 | |
|     CMP #$0000 ; is this level 1
 | |
|     BEQ .PassToX
 | |
|     LSR
 | |
|     LSR
 | |
|     INC
 | |
|     .PassToX:
 | |
|     TAX
 | |
|     LDA $8070 ; heart stars
 | |
|     CLC
 | |
|     CMP $07D00A ;Compare to goal heart stars
 | |
|     BCC .CompareWorldHS ; we don't have enough
 | |
|     PHX
 | |
|     LDA #$0014
 | |
|     STA $7F62 ; play sound fx 0x14
 | |
|     LDA $07D012 ; goal
 | |
|     CMP #$0000 ; are we on zero goal?
 | |
|     BEQ .ZeroGoal ; we are
 | |
|     LDA #$0001
 | |
|     LDX $3617 ; current save
 | |
|     STA $53DD, X ; boss butch
 | |
|     STA $53DF, X ; MG5
 | |
|     STA $53E1, X ; Jumping
 | |
|     BRA .PullX
 | |
|     .ZeroGoal:
 | |
|     LDA #$0001
 | |
|     STA $80A0 ; zero unlock address
 | |
|     .PullX:
 | |
|     PLX
 | |
|     .CompareWorldHS:
 | |
|     LDA $8070 ; current heart stars
 | |
|     CMP $07D000, X ; compare to world heart stars
 | |
|     BCS .ReturnTrue
 | |
|     CLC
 | |
|     RTL
 | |
|     .ReturnTrue:
 | |
|     SEC
 | |
|     RTL
 | |
| 
 | |
| OpenWorldUnlock:
 | |
|     PHX
 | |
|     LDX $900E ; Are we on open world?
 | |
|     BNE .Open ; Branch if we are
 | |
|     LDA #$0001
 | |
|     .Open:
 | |
|     STA $5AC1 ;(cutscene)
 | |
|     STA $53CD ;(unlocked stages)
 | |
|     INC
 | |
|     STA $5AB9 ;(currently selectable stages)
 | |
|     CPX #$0001
 | |
|     BNE .Return ; Return if we aren't on open world
 | |
|     LDA #$0001
 | |
|     STA $5A9D
 | |
|     STA $5A9F
 | |
|     STA $5AA1
 | |
|     STA $5AA3
 | |
|     STA $5AA5
 | |
|     .Return:
 | |
|     PLX
 | |
|     RTL
 | |
| 
 | |
| MainLoopHook:
 | |
|     STA $D4
 | |
|     INC $3524
 | |
|     JSL ParseItemQueue
 | |
|     LDA $7F62 ; sfx to be played
 | |
|     BEQ .Traps ; skip if 0
 | |
|     JSL $00D927 ; play sfx
 | |
|     STZ $7F62
 | |
|     .Traps:
 | |
|     LDA $36D0
 | |
|     CMP #$FFFF ; are we in menus?
 | |
|     BEQ .Return ; return if we are
 | |
|     LDA $5541 ; gooey status
 | |
|     BPL .Slowness ; gooey is already spawned
 | |
|     LDA $39D1 ; is kirby alive?
 | |
|     BEQ .Slowness ; branch if he isn't
 | |
|     ; maybe BMI here too?
 | |
|     LDA $8080
 | |
|     CMP #$0000 ; did we get a gooey trap
 | |
|     BEQ .Slowness ; branch if we did not
 | |
|     JSL GooeySpawn
 | |
|     DEC $8080
 | |
|     .Slowness:
 | |
|     LDA $8082 ; slowness
 | |
|     BEQ .Eject ; are we under the effects of a slowness trap
 | |
|     DEC $8082 ; dec by 1 each frame
 | |
|     .Eject:
 | |
|     PHX
 | |
|     PHY
 | |
|     LDA $54A9 ; copy ability
 | |
|     BEQ .PullVars ; branch if we do not have a copy ability
 | |
|     LDA $8084 ; eject ability
 | |
|     BEQ .PullVars ; branch if we haven't received eject
 | |
|     LDA #$2000 ; select button press
 | |
|     STA $60C1 ; write to controller mirror
 | |
|     DEC $8084
 | |
|     .PullVars:
 | |
|     PLY
 | |
|     PLX
 | |
|     .Return:
 | |
|     RTL
 | |
| 
 | |
| HeartStarGraphicFix:
 | |
|     LDA #$0000
 | |
|     PHX
 | |
|     PHY
 | |
|     LDX $363F ; current level
 | |
|     LDY $3641 ; current stage
 | |
|     .LoopLevel:
 | |
|     CPX #$0000
 | |
|     BEQ .LoopStage
 | |
|     INC #6
 | |
|     DEX
 | |
|     BRA .LoopLevel ; return to loop head
 | |
|     .LoopStage:
 | |
|     CPY #$0000
 | |
|     BEQ .EndLoop
 | |
|     INC
 | |
|     DEY
 | |
|     BRA .LoopStage ; return to loop head
 | |
|     .EndLoop
 | |
|     ASL
 | |
|     TAX
 | |
|     LDA $07D080, X ; table of original stage number
 | |
|     CMP #$0002 ; is the current stage a minigame stage?
 | |
|     BEQ .ReturnTrue ; branch if so
 | |
|     CLC
 | |
|     BRA .Return
 | |
|     .ReturnTrue:
 | |
|     SEC
 | |
|     .Return:
 | |
|     PLY
 | |
|     PLX
 | |
|     RTL
 | |
| 
 | |
| ParseItemQueue:
 | |
| ; Local item queue parsing
 | |
|     NOP
 | |
|     LDX #$0000
 | |
|     .LoopHead:
 | |
|     LDA $C000,X
 | |
|     BIT #$0010
 | |
|     BNE .Ability
 | |
|     BIT #$0020
 | |
|     BNE .Animal
 | |
|     BIT #$0040
 | |
|     BNE .Positive
 | |
|     BIT #$0080
 | |
|     BNE .Negative
 | |
|     .LoopCheck:
 | |
|     INX
 | |
|     INX
 | |
|     CPX #$000F
 | |
|     BCC .LoopHead
 | |
|     RTL
 | |
|     .Ability:
 | |
|     JSL .ApplyAbility
 | |
|     RTL
 | |
|     .Animal:
 | |
|     JSL .ApplyAnimal
 | |
|     RTL
 | |
|     .Positive:
 | |
|     LDY $36D0
 | |
|     CPY #$FFFF
 | |
|     BEQ .LoopCheck
 | |
|     JSL .ApplyPositive
 | |
|     RTL
 | |
|     .Negative:
 | |
|     AND #$000F
 | |
|     ASL
 | |
|     TAY
 | |
|     JSL .ApplyNegative
 | |
|     RTL
 | |
|     .ApplyAbility:
 | |
|     AND #$000F
 | |
|     PHA
 | |
|     ASL
 | |
|     TAY
 | |
|     PLA
 | |
|     STA $8020,Y
 | |
|     LDA #$0032
 | |
|     BRA .PlaySFX
 | |
|     .ApplyAnimal:
 | |
|     AND #$000F
 | |
|     PHA
 | |
|     ASL
 | |
|     TAY
 | |
|     PLA
 | |
|     INC
 | |
|     STA $8000,Y
 | |
|     LDA #$0032
 | |
|     BRA .PlaySFX
 | |
|     .PlaySFX:
 | |
|     STA $7F62
 | |
|     STZ $C000,X
 | |
|     .Return:
 | |
|     RTL
 | |
|     .ApplyPositive:
 | |
|     LDY $36D0
 | |
|     CPY #$FFFF
 | |
|     BEQ .Return
 | |
|     AND #$000F
 | |
|     BEQ .HeartStar
 | |
|     CMP #$0004
 | |
|     BCS .StarBit
 | |
|     CMP #$0002
 | |
|     BCS .Not1UP
 | |
|     LDA $39CF
 | |
|     INC
 | |
|     STA $39CF
 | |
|     STA $39E3
 | |
|     LDA #$0033
 | |
|     BRA .PlaySFX
 | |
|     .Not1UP:
 | |
|     CMP #$0003
 | |
|     BEQ .Invincibility
 | |
|     LDA $39D3
 | |
|     BEQ .JustKirby
 | |
|     LDA #$0008
 | |
|     STA $39D1
 | |
|     STA $39D3
 | |
|     BRA .PlayPositive
 | |
|     .JustKirby:
 | |
|     LDA #$000A
 | |
|     STA $39D1
 | |
|     BRA .PlayPositive
 | |
|     .Invincibility:
 | |
|     LDA #$0384
 | |
|     STA $54B1
 | |
|     BRA .PlayPositive
 | |
|     .HeartStar:
 | |
|     INC $8070
 | |
|     LDA #$0016
 | |
|     BRA .PlaySFX
 | |
|     .StarBit:
 | |
|     SEC
 | |
|     SBC #$0004
 | |
|     ASL
 | |
|     INC
 | |
|     CLC
 | |
|     ADC $39D7
 | |
|     ORA #$8000
 | |
|     STA $39D7
 | |
|     .PlayPositive:
 | |
|     LDA #$0026
 | |
|     .PlaySFXLong
 | |
|     BRA .PlaySFX
 | |
|     .ApplyNegative:
 | |
|     CPY #$0005
 | |
|     BCS .PlayNone
 | |
|     LDA $8080,Y
 | |
|     CPY #$0002
 | |
|     BNE .Increment
 | |
|     CLC
 | |
|     LDA #$0384
 | |
|     ADC $8080, Y
 | |
|     BVC .PlayNegative
 | |
|     LDA #$FFFF
 | |
|     .PlayNegative:
 | |
|     STA $8080,Y
 | |
|     LDA #$00A7
 | |
|     BRA .PlaySFXLong
 | |
|     .Increment:
 | |
|     INC
 | |
|     STA $8080, Y
 | |
|     BRA .PlayNegative
 | |
|     .PlayNone:
 | |
|     LDA #$0000
 | |
|     BRA .PlaySFXLong
 | |
| 
 | |
| AnimalFriendSpawn:
 | |
|     PHA
 | |
|     CPX #$0002  ; is this an animal friend?
 | |
|     BNE .Return
 | |
|     XBA
 | |
|     PHA
 | |
|     PHX
 | |
|     PHA
 | |
|     LDX #$0000
 | |
|     .CheckSpawned:
 | |
|     LDA $05CA, X
 | |
|     BNE .Continue
 | |
|     LDA #$0002
 | |
|     CMP $074A, X
 | |
|     BNE .ContinueCheck
 | |
|     PLA
 | |
|     PHA
 | |
|     XBA
 | |
|     CMP $07CA, X
 | |
|     BEQ .AlreadySpawned
 | |
|     .ContinueCheck:
 | |
|     INX
 | |
|     INX
 | |
|     BRA .CheckSpawned
 | |
|     .Continue:
 | |
|     PLA
 | |
|     PLX
 | |
|     ASL
 | |
|     TAY
 | |
|     PLA
 | |
|     INC
 | |
|     CMP $8000, Y ; do we have this animal friend
 | |
|     BEQ .Return ; we have this animal friend
 | |
|     .False:
 | |
|     INX
 | |
|     .Return:
 | |
|     PLY
 | |
|     LDA #$9999
 | |
|     RTL
 | |
|     .AlreadySpawned:
 | |
|     PLA
 | |
|     PLX
 | |
|     ASL
 | |
|     TAY
 | |
|     PLA
 | |
|     BRA .False
 | |
| 
 | |
| 
 | |
| WriteBWRAM:
 | |
|     LDY #$6001 ;starting addr
 | |
|     LDA #$1FFE ;bytes to write
 | |
|     MVN $40, $40 ;copy $406000 from 406001 to 407FFE
 | |
|     LDX #$0000
 | |
|     LDY #$0014
 | |
|     .LoopHead:
 | |
|     LDA $8100, X ; rom header
 | |
|     CMP $07C000, X ; compare to real rom name
 | |
|     BNE .InitializeRAM ; area is uninitialized or corrupt, reset
 | |
|     INX
 | |
|     DEY
 | |
|     BMI .Return ; if Y is negative, rom header matches, valid bwram
 | |
|     BRA .LoopHead ; else continue loop
 | |
|     .InitializeRAM:
 | |
|     LDA #$0000
 | |
|     STA $8000 ; initialize first byte that gets copied
 | |
|     LDX #$8000
 | |
|     LDY #$8001
 | |
|     LDA #$7FFD
 | |
|     MVN $40, $40 ; initialize 0x8000 onward
 | |
|     LDX #$D000 ; seed info 0x3D000
 | |
|     LDY #$9000 ; target location
 | |
|     LDA #$1000
 | |
|     MVN $40, $07
 | |
|     LDX #$C000 ; ROM name
 | |
|     LDY #$8100 ; target
 | |
|     LDA #$0015
 | |
|     MVN $40, $07
 | |
|     .Return:
 | |
|     RTL
 | |
| 
 | |
| ConsumableSet:
 | |
|     PHA
 | |
|     PHX
 | |
|     PHY
 | |
|     AND #$00FF
 | |
|     PHA
 | |
|     LDX $53CF
 | |
|     LDY $53D3
 | |
|     LDA #$0000
 | |
|     DEY
 | |
|     .LoopLevel:
 | |
|     CPX #$0000
 | |
|     BEQ .LoopStage
 | |
|     CLC
 | |
|     ADC #$0007
 | |
|     DEX
 | |
|     BRA .LoopLevel ; return to loop head
 | |
|     .LoopStage:
 | |
|     CPY #$0000
 | |
|     BEQ .EndLoop
 | |
|     INC
 | |
|     DEY
 | |
|     BRA .LoopStage ; return to loop head
 | |
|     .EndLoop:
 | |
|     ASL
 | |
|     TAX
 | |
|     LDA $07D020, X ; current stage
 | |
|     ASL #6
 | |
|     TAX
 | |
|     PLA
 | |
|     .LoopHead:
 | |
|     CMP #$0000
 | |
|     BEQ .ApplyCheck
 | |
|     INX
 | |
|     DEC
 | |
|     BRA .LoopHead ; return to loop head
 | |
|     .ApplyCheck:
 | |
|     LDA $A000, X ; consumables index
 | |
|     PHA
 | |
|     ORA #$0001
 | |
|     STA $A000, X
 | |
|     PLA
 | |
|     AND #$00FF
 | |
|     BNE .Return
 | |
|     TXA
 | |
|     ORA #$1000
 | |
|     JSL ApplyLocalCheck
 | |
|     .Return:
 | |
|     PLY
 | |
|     PLX
 | |
|     PLA
 | |
|     XBA
 | |
|     AND #$00FF
 | |
|     RTL
 | |
| 
 | |
| NormalGoalSet:
 | |
|     PHX
 | |
|     LDA $07D012
 | |
|     CMP #$0000
 | |
|     BEQ .ZeroGoal
 | |
|     LDA #$0001
 | |
|     LDX $3617 ; current save
 | |
|     STA $53DD, X ; Boss butch
 | |
|     STA $53DF, X ; MG5
 | |
|     STA $53D1, X ; Jumping
 | |
|     BRA .Return
 | |
|     .ZeroGoal:
 | |
|     LDA #$0001
 | |
|     STA $80A0
 | |
|     .Return:
 | |
|     PLX
 | |
|     LDA #$0006
 | |
|     STA $5AC1 ; cutscene
 | |
|     RTL
 | |
| 
 | |
| FinalIcebergFix:
 | |
|     PHX
 | |
|     PHY
 | |
|     LDA #$0000
 | |
|     LDX $363F
 | |
|     LDY $3641
 | |
|     .LoopLevel:
 | |
|     CPX #$0000
 | |
|     BEQ .LoopStage
 | |
|     INC #7
 | |
|     DEX
 | |
|     BRA .LoopLevel ; return to loop head
 | |
|     .LoopStage:
 | |
|     CPY #$0000
 | |
|     BEQ .CheckStage
 | |
|     INC
 | |
|     DEY
 | |
|     BRA .LoopStage ; return to loop head
 | |
|     .CheckStage:
 | |
|     ASL
 | |
|     TAX
 | |
|     LDA $07D020, X
 | |
|     CMP #$001D
 | |
|     BEQ .ReturnTrue
 | |
|     CLC
 | |
|     BRA .Return
 | |
|     .ReturnTrue:
 | |
|     SEC
 | |
|     .Return:
 | |
|     PLY
 | |
|     PLX
 | |
|     RTL
 | |
| 
 | |
| StrictBosses:
 | |
|     PHX
 | |
|     LDA $901E ; Do we have strict bosses enabled?
 | |
|     BEQ .ReturnTrue ; Return True if we don't, always unlock the boss in this case
 | |
|     LDA $53CB ; unlocked level
 | |
|     CMP #$0005 ; have we unlocked level 5?
 | |
|     BCS .ReturnFalse ; we don't need to do anything if so
 | |
|     NOP #5 ;unsure when these got here
 | |
|     LDX $53CB
 | |
|     DEX
 | |
|     TXA
 | |
|     ASL
 | |
|     TAX
 | |
|     LDA $8070 ; current heart stars
 | |
|     CMP $07D000, X ; do we have enough HS to purify?
 | |
|     BCS .ReturnTrue ; branch if we do
 | |
|     .ReturnFalse:
 | |
|     SEC
 | |
|     BRA .Return
 | |
|     .ReturnTrue:
 | |
|     CLC
 | |
|     .Return:
 | |
|     PLX
 | |
|     LDA $53CD
 | |
|     RTL
 | |
| 
 | |
| NintenHalken:
 | |
|     LDX #$0005
 | |
|     .Halken:
 | |
|     LDA $00A405, X ; loop head (halken)
 | |
|     STA $4080F0, X
 | |
|     DEX
 | |
|     BPL .Halken ; branch if more letters to copy
 | |
|     LDX #$0005
 | |
|     .Ninten:
 | |
|     LDA $00A40B, X ; loop head (ninten)
 | |
|     STA $408FF0, X
 | |
|     DEX
 | |
|     BPL .Ninten ; branch if more letters to copy
 | |
|     REP #$20
 | |
|     LDA #$0001
 | |
|     RTL
 | |
| 
 | |
| StageCompleteSet:
 | |
|     PHX
 | |
|     LDA $5AC1 ; completed stage cutscene
 | |
|     BEQ .Return ; we have not completed a stage
 | |
|     LDA #$0000
 | |
|     LDX $53CF ; current level
 | |
|     .LoopLevel:
 | |
|     CPX #$0000
 | |
|     BEQ .StageStart
 | |
|     DEX
 | |
|     INC #7
 | |
|     BRA .LoopLevel ; return to loop head
 | |
|     .StageStart:
 | |
|     LDX $53D3 ; current stage
 | |
|     CPX #$0007 ; is this a boss stage
 | |
|     BEQ .Return ; return if so
 | |
|     DEX
 | |
|     .LoopStage:
 | |
|     CPX #$0000
 | |
|     BEQ .LoopEnd
 | |
|     INC
 | |
|     DEX
 | |
|     BRA .LoopStage ; return to loop head
 | |
|     .LoopEnd:
 | |
|     ASL
 | |
|     TAX
 | |
|     LDA $9020, X ; load the stage we completed
 | |
|     ASL
 | |
|     TAX
 | |
|     PHX
 | |
|     LDA $8200, X
 | |
|     AND #$00FF
 | |
|     BNE .ApplyClear
 | |
|     TXA
 | |
|     LSR
 | |
|     JSL ApplyLocalCheck
 | |
|     .ApplyClear:
 | |
|     PLX
 | |
|     LDA #$0001
 | |
|     ORA $8200, X
 | |
|     STA $8200, X
 | |
|     .Return:
 | |
|     PLX
 | |
|     LDA $53CF
 | |
|     CMP $53CB
 | |
|     RTL
 | |
| 
 | |
| OpenWorldBossUnlock:
 | |
|     PHX
 | |
|     PHY
 | |
|     LDA $900E ; Are we on open world?
 | |
|     BEQ .ReturnTrue ; Return true if we aren't, always unlock boss
 | |
|     LDA $53CD
 | |
|     CMP #$0006
 | |
|     BNE .ReturnFalse ; return if we aren't on stage 6
 | |
|     LDA $53CF
 | |
|     INC
 | |
|     CMP $53CB ; are we on the most unlocked level?
 | |
|     BNE .ReturnFalse ; return if we aren't
 | |
|     LDA #$0000
 | |
|     LDX $53CF
 | |
|     .LoopLevel:
 | |
|     CPX #$0000
 | |
|     BEQ .LoopStages
 | |
|     ADC #$0006
 | |
|     DEX
 | |
|     BRA .LoopLevel ; return to loop head
 | |
|     .LoopStages:
 | |
|     ASL
 | |
|     TAX
 | |
|     LDA #$0000
 | |
|     LDY #$0006
 | |
|     PHY
 | |
|     PHX
 | |
|     .LoopStage:
 | |
|     PLX
 | |
|     LDY $9020, X ; get stage id
 | |
|     INX
 | |
|     INX
 | |
|     PHA
 | |
|     TYA
 | |
|     ASL
 | |
|     TAY
 | |
|     PLA
 | |
|     ADC $8200, Y ; add current stage value to total
 | |
|     PLY
 | |
|     DEY
 | |
|     PHY
 | |
|     PHX
 | |
|     CPY #$0000
 | |
|     BNE .LoopStage ; return to loop head
 | |
|     PLX
 | |
|     PLY
 | |
|     SEC
 | |
|     SBC $9016
 | |
|     BCC .ReturnFalse
 | |
|     .ReturnTrue
 | |
|     LDA $53CD
 | |
|     INC
 | |
|     STA $53CD
 | |
|     STA $5AC1
 | |
|     BRA .Return
 | |
|     .ReturnFalse:
 | |
|     STZ $5AC1
 | |
|     .Return:
 | |
|     PLY
 | |
|     PLX
 | |
|     RTL
 | |
| 
 | |
| GooeySpawn:
 | |
|     PHY 
 | |
|     PHX 
 | |
|     LDX #$0000
 | |
|     LDY #$0000
 | |
|     STA $5543
 | |
|     LDA $1922,Y
 | |
|     STA $C0
 | |
|     LDA $19A2,Y
 | |
|     STA $C2
 | |
|     LDA #$0008
 | |
|     STA $C4
 | |
|     LDA #$0002
 | |
|     STA $352A
 | |
|     LDA #$0003
 | |
|     JSL $00F54F
 | |
|     STX $5541
 | |
|     LDA #$FFFF
 | |
|     STA $0622,X
 | |
|     JSL $00BAEF
 | |
|     JSL $C4883C
 | |
|     LDX $39D1
 | |
|     CPX #$0001
 | |
|     BEQ .Return
 | |
|     LDA #$FFFF
 | |
|     CPX #$0002
 | |
|     BEQ .Call
 | |
|     DEC 
 | |
|     .Call:
 | |
|     JSL $C43C22
 | |
|     .Return:
 | |
|     PLX 
 | |
|     PLY 
 | |
|     RTL 
 | |
| 
 | |
| SpeedTrap:
 | |
|     PHX
 | |
|     LDX $8082 ; do we have slowness
 | |
|     BEQ .Apply ; branch if we do not
 | |
|     LSR
 | |
|     .Apply:
 | |
|     PLX
 | |
|     STA $1F22, Y ; player max speed
 | |
|     EOR #$FFFF
 | |
|     RTL
 | |
| 
 | |
| HeartStarVisual:
 | |
|     CPX #$0000
 | |
|     BEQ .SkipInx
 | |
|     INX
 | |
|     .SkipInx
 | |
|     CPX $651E
 | |
|     BCC .Return
 | |
|     CPX #$0000
 | |
|     BEQ .Return
 | |
|     LDA $4036D0
 | |
|     AND #$00FF
 | |
|     BEQ .ReturnTrue
 | |
|     LDA $3000
 | |
|     AND #$0200
 | |
|     CMP #$0000
 | |
|     BNE .ReturnTrue
 | |
|     PHY
 | |
|     LDA $3000
 | |
|     TAY
 | |
|     CLC
 | |
|     ADC #$0020
 | |
|     STA $3000
 | |
|     LDA $408070
 | |
|     LDX #$0000
 | |
|     .LoopHead:
 | |
|     CMP #$000A
 | |
|     BCC .LoopEnd
 | |
|     SEC
 | |
|     SBC #$000A
 | |
|     INX
 | |
|     BRA .LoopHead
 | |
|     .LoopEnd:
 | |
|     PHX
 | |
|     TAX
 | |
|     PLA
 | |
|     ORA #$2500
 | |
|     PHA
 | |
|     LDA #$2C70
 | |
|     STA $0000, Y
 | |
|     PLA
 | |
|     INY
 | |
|     INY
 | |
|     STA $0000, Y
 | |
|     INY
 | |
|     INY
 | |
|     TXA
 | |
|     ORA #$2500
 | |
|     PHA
 | |
|     LDA #$2C78
 | |
|     STA $0000, Y
 | |
|     INY
 | |
|     INY
 | |
|     PLA
 | |
|     STA $0000, Y
 | |
|     INY
 | |
|     INY
 | |
|     JSL HeartStarVisual2 ; we ran out of room
 | |
|     PLY
 | |
|     .ReturnTrue:
 | |
|     SEC
 | |
|     .Return:
 | |
|     RTL
 | |
| 
 | |
| LoadFont:
 | |
|     JSL $00D29F ; play sfx
 | |
|     PHX
 | |
|     PHB
 | |
|     LDA #$0000
 | |
|     PHA
 | |
|     PLB
 | |
|     PLB
 | |
|     LDA #$7000
 | |
|     STA $2116
 | |
|     LDX #$0000
 | |
|     .LoopHead:
 | |
|     CPX #$0140
 | |
|     BEQ .LoopEnd
 | |
|     LDA $D92F50, X
 | |
|     STA $2118
 | |
|     INX
 | |
|     INX
 | |
|     BRA .LoopHead
 | |
|     .LoopEnd:
 | |
|     LDX #$0000
 | |
|     .2LoopHead:
 | |
|     CPX #$0020
 | |
|     BEQ .2LoopEnd
 | |
|     LDA $D92E10, X
 | |
|     STA $2118
 | |
|     INX
 | |
|     INX
 | |
|     BRA .2LoopHead
 | |
|     .2LoopEnd:
 | |
|     PHY
 | |
|     LDA $07D012
 | |
|     ASL
 | |
|     TAX
 | |
|     LDA $07E000, X
 | |
|     TAX
 | |
|     LDY #$0000
 | |
|     .3LoopHead:
 | |
|     CPY #$0020
 | |
|     BEQ .3LoopEnd
 | |
|     LDA $D93170, X
 | |
|     STA $2118
 | |
|     INX
 | |
|     INX
 | |
|     INY
 | |
|     INY
 | |
|     BRA .3LoopHead
 | |
|     .3LoopEnd:
 | |
|     LDA $07D00C
 | |
|     ASL
 | |
|     TAX
 | |
|     LDA $07E010, X
 | |
|     TAX
 | |
|     LDY #$0000
 | |
|     .4LoopHead:
 | |
|     CPY #$0020
 | |
|     BEQ .4LoopEnd
 | |
|     LDA $D93170, X
 | |
|     STA $2118
 | |
|     INX
 | |
|     INX
 | |
|     INY
 | |
|     INY
 | |
|     BRA .4LoopHead
 | |
|     .4LoopEnd:
 | |
|     PLY
 | |
|     PLB
 | |
|     PLX
 | |
|     RTL
 | |
| 
 | |
| HeartStarVisual2:
 | |
|     LDA #$2C80
 | |
|     STA $0000, Y
 | |
|     INY
 | |
|     INY
 | |
|     LDA #$250A
 | |
|     STA $0000, Y
 | |
|     INY
 | |
|     INY
 | |
|     LDA $4053CF
 | |
|     ASL
 | |
|     TAX
 | |
|     .LoopHead:
 | |
|     LDA $409000, X
 | |
|     CMP #$FFFF
 | |
|     BNE .LoopEnd
 | |
|     DEX
 | |
|     DEX
 | |
|     BRA .LoopHead
 | |
|     .LoopEnd:
 | |
|     LDX #$0000
 | |
|     .2LoopHead:
 | |
|     CMP #$000A
 | |
|     BCC .2LoopEnd
 | |
|     SEC
 | |
|     SBC #$000A
 | |
|     INX
 | |
|     BRA .2LoopHead ; return to loop head
 | |
|     .2LoopEnd:
 | |
|     PHX
 | |
|     TAX
 | |
|     PLA
 | |
|     ORA #$2500
 | |
|     PHA
 | |
|     LDA #$2C88
 | |
|     STA $0000, Y
 | |
|     PLA
 | |
|     INY
 | |
|     INY
 | |
|     STA $0000, Y
 | |
|     INY
 | |
|     INY
 | |
|     TXA
 | |
|     ORA #$2500
 | |
|     PHA
 | |
|     LDA #$2C90
 | |
|     STA $0000, Y
 | |
|     INY
 | |
|     INY
 | |
|     PLA
 | |
|     STA $0000, Y
 | |
|     INY
 | |
|     INY
 | |
|     LDA #$14D8
 | |
|     STA $0000, Y
 | |
|     INY
 | |
|     INY
 | |
|     LDA #$250B
 | |
|     STA $0000, Y
 | |
|     INY
 | |
|     INY
 | |
|     LDA #$14E0
 | |
|     STA $0000, Y
 | |
|     INY
 | |
|     INY
 | |
|     LDA #$250A
 | |
|     STA $0000, Y
 | |
|     INY
 | |
|     INY
 | |
|     LDA #$14E8
 | |
|     STA $0000, Y
 | |
|     INY
 | |
|     INY
 | |
|     LDA #$250C
 | |
|     STA $0000, Y
 | |
|     INY
 | |
|     INY
 | |
|     LDA $3000
 | |
|     SEC
 | |
|     SBC #$3040
 | |
|     LSR
 | |
|     LSR
 | |
|     .3LoopHead:
 | |
|     CMP #$0004
 | |
|     BCC .3LoopEnd
 | |
|     DEC #4
 | |
|     BRA .3LoopHead ; return to loop head
 | |
|     .3LoopEnd:
 | |
|     STA $3240
 | |
|     LDA #$0004
 | |
|     SEC
 | |
|     SBC $3240
 | |
|     TAX
 | |
|     LDA #$00FF
 | |
|     .4LoopHead:
 | |
|     CPX #$0000
 | |
|     BEQ .4LoopEnd
 | |
|     LSR
 | |
|     LSR
 | |
|     DEX
 | |
|     BRA .4LoopHead
 | |
|     .4LoopEnd:
 | |
|     LDY $3002
 | |
|     AND $0000, Y
 | |
|     STA $0000, Y
 | |
|     INY
 | |
|     LDA #$0000
 | |
|     STA $0000, Y
 | |
|     INY
 | |
|     INY
 | |
|     STA $0000, Y
 | |
|     RTL
 | |
| 
 | |
| HeartStarSelectFix:
 | |
|     PHX
 | |
|     TXA
 | |
|     ASL
 | |
|     TAX
 | |
|     LDA $9020, X
 | |
|     TAX
 | |
|     .LoopHead:
 | |
|     CMP #$0006
 | |
|     BMI .LoopEnd
 | |
|     INX
 | |
|     SEC
 | |
|     SBC #$0006
 | |
|     BRA .LoopHead
 | |
|     .LoopEnd:
 | |
|     LDA $53A7, X
 | |
|     PLX
 | |
|     AND #$00FF
 | |
|     RTL
 | |
| 
 | |
| HeartStarCutsceneFix:
 | |
|     TAX
 | |
|     LDA $53D3
 | |
|     DEC
 | |
|     STA $5AC3
 | |
|     LDA $53A7, X
 | |
|     AND #$00FF
 | |
|     BNE .Return
 | |
|     PHX
 | |
|     TXA
 | |
|     .Loop:
 | |
|     CMP #$0007
 | |
|     BCC .Continue
 | |
|     SEC
 | |
|     SBC #$0007
 | |
|     DEX
 | |
|     BRA .Loop
 | |
|     .Continue:
 | |
|     TXA
 | |
|     ORA #$0100
 | |
|     JSL ApplyLocalCheck
 | |
|     PLX
 | |
|     .Return
 | |
|     RTL
 | |
| 
 | |
| GiftGiving:
 | |
|     CMP #$0008
 | |
|     .This:
 | |
|     BCS .This  ; this intentionally safe-crashes the game if hit
 | |
|     PHX
 | |
|     LDX $901C
 | |
|     BEQ .Return
 | |
|     PLX
 | |
|     STA $8086
 | |
|     LDA #$0026
 | |
|     JML $CABC99
 | |
|     .Return:
 | |
|     PLX
 | |
|     JML $CABC18
 | |
| 
 | |
| PauseMenu:
 | |
|     JSL $00D29F
 | |
|     PHX
 | |
|     PHY
 | |
|     LDA #$3300
 | |
|     STA !VMADDL
 | |
|     LDA #$0007
 | |
|     STA !A1B0
 | |
|     LDA #$F000
 | |
|     STA !A1T0L
 | |
|     LDA #$01C0
 | |
|     STA !DAS0L
 | |
|     SEP #$20
 | |
|     LDA #$01
 | |
|     STA !DMAP0
 | |
|     LDA #$18
 | |
|     STA !BBAD0
 | |
|     LDA #$01
 | |
|     STA !MDMAEN
 | |
|     REP #$20
 | |
|     LDY #$0000
 | |
|     .LoopHead:
 | |
|     INY ; loop head
 | |
|     CPY #$0009
 | |
|     BPL .LoopEnd
 | |
|     TYA
 | |
|     ASL
 | |
|     TAX
 | |
|     LDA $8020, X
 | |
|     BEQ .LoopHead ; return to loop head
 | |
|     TYA
 | |
|     CLC
 | |
|     ADC #$31E2
 | |
|     STA !VMADDL
 | |
|     LDA $07E020, X
 | |
|     STA !VMDATAL
 | |
|     BRA .LoopHead ; return to loop head
 | |
|     .LoopEnd:
 | |
|     LDY #$FFFF
 | |
|     .2LoopHead:
 | |
|     INY ; loop head
 | |
|     CPY #$0007
 | |
|     BPL .2LoopEnd
 | |
|     TYA
 | |
|     ASL
 | |
|     TAX
 | |
|     LDA $8000, X
 | |
|     BEQ .2LoopHead ; return to loop head
 | |
|     TYA
 | |
|     CLC
 | |
|     ADC #$3203
 | |
|     STA !VMADDL
 | |
|     LDA $07E040, X
 | |
|     STA !VMDATAL
 | |
|     BRA .2LoopHead ; return to loop head
 | |
|     .2LoopEnd:
 | |
|     PLY
 | |
|     PLX
 | |
|     RTL
 | |
| 
 | |
| StarsSet:
 | |
|     PHA
 | |
|     PHX
 | |
|     PHY
 | |
|     LDX $901A
 | |
|     BEQ .ApplyStar
 | |
|     AND #$00FF
 | |
|     PHA
 | |
|     LDX $53CF
 | |
|     LDY $53D3
 | |
|     LDA #$0000
 | |
|     DEY
 | |
|     .LoopLevel:
 | |
|     CPX #$0000
 | |
|     BEQ .LoopStage
 | |
|     CLC
 | |
|     ADC #$0007
 | |
|     DEX
 | |
|     BRA .LoopLevel
 | |
|     .LoopStage:
 | |
|     CPY #$0000
 | |
|     BEQ .LoopEnd
 | |
|     INC
 | |
|     DEY
 | |
|     BRA .LoopStage
 | |
|     .LoopEnd:
 | |
|     ASL
 | |
|     TAX
 | |
|     LDA $07D020, X
 | |
|     ASL
 | |
|     ASL
 | |
|     ASL
 | |
|     ASL
 | |
|     ASL
 | |
|     ASL
 | |
|     TAX
 | |
|     PLA
 | |
|     .2LoopHead:
 | |
|     CMP #$0000
 | |
|     BEQ .2LoopEnd
 | |
|     INX
 | |
|     DEC
 | |
|     BRA .2LoopHead
 | |
|     .2LoopEnd:
 | |
|     LDA $B000, X
 | |
|     PHA
 | |
|     ORA #$0001
 | |
|     STA $B000, X
 | |
|     PLA
 | |
|     AND #$00FF
 | |
|     BNE .Return
 | |
|     TXA
 | |
|     ORA #$2000
 | |
|     JSL ApplyLocalCheck
 | |
|     .Return:
 | |
|     PLY
 | |
|     PLX
 | |
|     PLA
 | |
|     XBA
 | |
|     AND #$00FF
 | |
|     RTL
 | |
|     .ApplyStar:
 | |
|     LDA $39D7
 | |
|     INC
 | |
|     ORA #$8000
 | |
|     STA $39D7
 | |
|     BRA .Return
 | |
| 
 | |
| ApplyLocalCheck:
 | |
| ; args: A-address of check following $08B000
 | |
|     TAX
 | |
|     LDA $09B000, X
 | |
|     AND #$00FF
 | |
|     TAY
 | |
|     LDX #$0000
 | |
|     .Loop:
 | |
|     LDA $C000, X
 | |
|     BEQ .Apply
 | |
|     INX
 | |
|     INX
 | |
|     CPX #$0010
 | |
|     BCC .Loop
 | |
|     BRA .Return ; this is dangerous, could lose a check here
 | |
|     .Apply:
 | |
|     TYA
 | |
|     STA $C000, X
 | |
|     .Return:
 | |
|     RTL
 | |
| 
 | |
| HookBossPurify:
 | |
|     ORA $B0
 | |
|     STA $53D5
 | |
|     LDA $B0
 | |
|     LDX #$0000
 | |
|     LSR
 | |
|     .Loop:
 | |
|     BIT #$0001
 | |
|     BNE .Apply
 | |
|     LSR
 | |
|     LSR
 | |
|     INX
 | |
|     CPX #$0005
 | |
|     BCS .Return
 | |
|     BRA .Loop
 | |
|     .Apply:
 | |
|     TXA
 | |
|     ORA #$0200
 | |
|     JSL ApplyLocalCheck
 | |
|     .Return:
 | |
|     RTL
 | |
| 
 | |
| org $07C000
 | |
|     db "KDL3_BASEPATCH_ARCHI"
 | |
| 
 | |
| org $07E000
 | |
|     db $20, $03
 | |
|     db $20, $00
 | |
|     db $80, $01
 | |
|     db $20, $01
 | |
|     db $00, $00
 | |
|     db $00, $00
 | |
|     db $00, $00
 | |
|     db $00, $00
 | |
|     db $A0, $01
 | |
|     db $A0, $00
 | |
| 
 | |
| ; Pause Icons
 | |
| 
 | |
| org $07E020
 | |
|     db $00, $0C
 | |
|     db $30, $09
 | |
|     db $31, $09
 | |
|     db $32, $09
 | |
|     db $33, $09
 | |
|     db $34, $09
 | |
|     db $35, $09
 | |
|     db $36, $09
 | |
|     db $37, $09
 | |
| 
 | |
| org $07E040
 | |
|     db $38, $05
 | |
|     db $39, $05
 | |
|     db $3A, $01
 | |
|     db $3B, $05
 | |
|     db $3C, $05
 | |
|     db $3D, $05
 | |
| 
 | |
| org $07F000
 | |
| incbin "APPauseIcons.dat" |