Compare commits
89 Commits
GKNew_soul
...
pseudoflut
| Author | SHA1 | Date | |
|---|---|---|---|
| a6ad4c082b | |||
| 74d9c72cc8 | |||
| 18a73e3b88 | |||
| 4f0703ea62 | |||
|
|
a97f8fbb48 | ||
|
|
ac7f50fc62 | ||
|
|
dd9ea4d38e | ||
|
|
5b7a4c11ed | ||
|
|
4437194cfe | ||
|
|
0d827eadd2 | ||
|
|
fca7f214bc | ||
|
|
a277fb12ac | ||
|
|
1242198bea | ||
|
|
96333b22a2 | ||
|
|
4f4f483647 | ||
|
|
dfe49a11c4 | ||
|
|
581e45a63c | ||
|
|
b583cc58ff | ||
|
|
761365927f | ||
|
|
68c511d6be | ||
|
|
94efc26bf3 | ||
|
|
029f687470 | ||
|
|
4dd7bac4d6 | ||
|
|
1368e15872 | ||
|
|
2fa0bfc4ef | ||
|
|
2418c1b322 | ||
|
|
00fb9e6c5d | ||
|
|
5936b08497 | ||
|
|
70a23191ba | ||
|
|
d21daccf4c | ||
|
|
7b93b4b4eb | ||
|
|
fee689e583 | ||
|
|
08ecc9b673 | ||
|
|
d451b531e7 | ||
|
|
7f7ffeb5fb | ||
|
|
b27d7c996b | ||
|
|
57b8b04f0b | ||
|
|
7334dd02db | ||
|
|
0fdec905d6 | ||
|
|
f91e2eb1a2 | ||
|
|
5a802eda70 | ||
|
|
4d3c2bd7dc | ||
|
|
fa72adb53d | ||
|
|
b24e440597 | ||
|
|
44b014fc65 | ||
|
|
78fa8b7dd9 | ||
|
|
db62d4c660 | ||
|
|
2ffcb1c3bd | ||
|
|
a9ef09e2d0 | ||
|
|
dfc182a2d5 | ||
|
|
a8b1fc989e | ||
|
|
c3616f2d65 | ||
|
|
912df0be14 | ||
|
|
2ed9de827b | ||
| 9b7e5646b3 | |||
| e4f9c4cffc | |||
| cef41b1674 | |||
|
|
060554a5fb | ||
|
|
e236543180 | ||
|
|
ea4f39e116 | ||
|
|
8ac480947d | ||
|
|
11ff5825ae | ||
|
|
34fa1cd98e | ||
|
|
4c5adfbee2 | ||
| 02b07528bb | |||
|
|
6566aa6d48 | ||
|
|
7164c3159d | ||
|
|
d75d912c7d | ||
|
|
953c115719 | ||
| 9256f48f5e | |||
|
|
1995d8747c | ||
|
|
d8341c650d | ||
|
|
021ba9d8a6 | ||
|
|
4088698af9 | ||
|
|
d19e22cc7d | ||
|
|
e266d351cd | ||
|
|
baec6954a3 | ||
|
|
faadd1d7f1 | ||
| 2344f9490e | |||
| 642aec9112 | |||
| bc0f396275 | |||
|
|
936ff5a882 | ||
| a3f892975f | |||
|
|
86efa74185 | ||
|
|
7b4470ddae | ||
|
|
2d84f7431e | ||
|
|
ed7fb312d5 | ||
|
|
aabb649578 | ||
|
|
e86cccad52 |
@@ -50,6 +50,7 @@ dw !ROM_VERSION_HIGH
|
||||
function hexto555(h) = ((((h&$FF)/8)<<10)|(((h>>8&$FF)/8)<<5)|(((h>>16&$FF)/8)<<0))
|
||||
|
||||
; Feature flags, run asar with -DFEATURE_X=1 to enable
|
||||
!FEATURE_FIX_BASEROM ?= 0
|
||||
|
||||
;================================================================================
|
||||
|
||||
@@ -118,6 +119,7 @@ incsrc doorframefixes.asm
|
||||
incsrc music.asm
|
||||
incsrc roomloading.asm
|
||||
incsrc icepalacegraphics.asm
|
||||
incsrc follower.asm
|
||||
warnpc $A18000
|
||||
|
||||
org $9C8000 ; text tables for translation
|
||||
@@ -181,8 +183,6 @@ incsrc dungeonmap.asm
|
||||
incsrc hextodec.asm
|
||||
incsrc multiworld.asm
|
||||
incsrc textrenderer.asm
|
||||
incsrc crystalswitchbook.asm
|
||||
incsrc mimicdash.asm
|
||||
warnpc $A58000
|
||||
|
||||
org $A28000
|
||||
@@ -202,6 +202,15 @@ incsrc inventory.asm
|
||||
incsrc menu/hudalpha.asm
|
||||
warnpc $A38000
|
||||
|
||||
org $B98000
|
||||
incsrc crystalswitchbook.asm
|
||||
incsrc mimicdash.asm
|
||||
incsrc gloom.asm
|
||||
incsrc special_weapons.asm
|
||||
incsrc variable_ganon_vulnerability.asm
|
||||
incsrc pseudoflute.asm
|
||||
warnpc $BA8000
|
||||
|
||||
org $A38000
|
||||
incsrc stats/credits.asm ; Statically mapped
|
||||
incsrc stats/main.asm
|
||||
@@ -354,6 +363,7 @@ warnpc $B08000
|
||||
;$33 Graphics Bank
|
||||
;$36 reserved for Enemizer
|
||||
;$37 Room data if needed for DR/Pottery/Enemizer
|
||||
;$39 GwaaKiwi Code Bank
|
||||
;$3A reserved for downstream use
|
||||
;$3B reserved for downstream use
|
||||
;$3F reserved for internal debugging
|
||||
|
||||
@@ -16,7 +16,7 @@ DrawLibraryItemGFX:
|
||||
RTL
|
||||
;--------------------------------------------------------------------------------
|
||||
SetLibraryItem:
|
||||
LDY.w SprItemReceipt, X
|
||||
LDY.w SprSourceItemId, X
|
||||
JSL ItemSet_Library ; contains thing we wrote over
|
||||
RTL
|
||||
;--------------------------------------------------------------------------------
|
||||
@@ -52,7 +52,7 @@ RTL
|
||||
;--------------------------------------------------------------------------------
|
||||
GiveBonkItem:
|
||||
LDA.w SprItemMWPlayer, X : STA.l !MULTIWORLD_ITEM_PLAYER_ID
|
||||
LDA.w SprItemReceipt, X
|
||||
LDA.w SprSourceItemId, X
|
||||
JSR AbsorbKeyCheck : BCC .notKey
|
||||
PHY : LDY.b #$24 : JSL AddInventory : PLY ; do inventory processing for a small key
|
||||
LDA.l CurrentSmallKeys : INC A : STA.l CurrentSmallKeys
|
||||
|
||||
56
bugfixes.asm
56
bugfixes.asm
@@ -1,12 +1,5 @@
|
||||
;================================================================================
|
||||
|
||||
;--------------------------------------------------------------------------------
|
||||
AssignKiki:
|
||||
LDA.b #$00 : STA.l FollowerDropped ; defuse bomb
|
||||
LDA.b #$0A : STA.l FollowerIndicator ; assign kiki as follower
|
||||
RTL
|
||||
;--------------------------------------------------------------------------------
|
||||
|
||||
;--------------------------------------------------------------------------------
|
||||
; Name: AllowSQ
|
||||
; Returns: Accumulator = 0 if S&Q is disallowed, 1 if allowed
|
||||
@@ -187,6 +180,25 @@ LDA.b IndoorsFlag : BNE +
|
||||
+
|
||||
RTL
|
||||
|
||||
PostFixMirrorGfxPrep:
|
||||
LDA.b #$01 : STA.w OWTransitionFlag
|
||||
JML HandleFollowersAfterMirroring ; what we wrote over
|
||||
|
||||
; warning, this is called on frames after PostFixMirrorGfxPrep but for
|
||||
; several frames after, so we use OWTransitionFlag to run something once
|
||||
PostFixMirrorGfx:
|
||||
STA.w SubModuleInterface ; what we wrote over
|
||||
LDA.w OWTransitionFlag : CMP.b #$01 : BNE .done
|
||||
LDA.b #$08 : STA.w OWTransitionFlag
|
||||
JML FollowerGfxRedraw
|
||||
.done
|
||||
RTL
|
||||
|
||||
PostFixOAMGfx:
|
||||
JSL FollowerGfxRedraw
|
||||
REP #$30 : LDA.w #$2000 ; what we wrote over
|
||||
RTL
|
||||
|
||||
;--------------------------------------------------------------------------------
|
||||
; Fix losing VRAM gfx when using quake
|
||||
PostNMIUpdateBGCharHalf:
|
||||
@@ -259,7 +271,7 @@ ParadoxCaveGfxFix:
|
||||
LDA.b #$01 : STA.w DMAENABLE
|
||||
|
||||
.skipLine
|
||||
RTL
|
||||
JML FollowerGfxRedraw
|
||||
|
||||
.skipMostOfLine
|
||||
; Set line length to 192 bytes (the first 6 8x8 tiles in the line)
|
||||
@@ -272,18 +284,11 @@ SetItemRiseTimer:
|
||||
RTL
|
||||
|
||||
.not_from_chest
|
||||
LDA.l MultiworldJunkItemTimer : BEQ .default
|
||||
LDA.l !MULTIWORLD_ITEM_PLAYER_ID : BNE .multiworld
|
||||
LDA.l !MULTIWORLD_RECEIVING_ITEM : BNE .multiworld
|
||||
BRA .default
|
||||
|
||||
.multiworld
|
||||
LDA.l !MULTIWORLD_ITEM_ID
|
||||
JSL.l ItemIsJunk
|
||||
BEQ .default
|
||||
|
||||
.junk
|
||||
LDA.l MultiworldJunkItemTimer : STA.w AncillaTimer, X
|
||||
LDA.l JunkItemTimer : AND.b #$3F : STA.w AncillaTimer, X
|
||||
RTL
|
||||
|
||||
.default
|
||||
@@ -292,10 +297,24 @@ SetItemRiseTimer:
|
||||
;--------------------------------------------------------------------------------
|
||||
ItemIsJunk:
|
||||
PHX
|
||||
LDX.b #JunkItems_end-JunkItems-1
|
||||
LDA.l JunkItemTimer : BIT.b #$3F : BEQ .not_junk
|
||||
BIT.b #$80 : BNE .check
|
||||
LDA.l !MULTIWORLD_ITEM_PLAYER_ID : BNE .check
|
||||
LDA.l !MULTIWORLD_RECEIVING_ITEM : BNE .check
|
||||
BRA .not_junk
|
||||
|
||||
.check
|
||||
LDA.l JunkItemTimer : AND.b #$40
|
||||
BEQ +
|
||||
LDA.b #JunkItems_triforce_end-JunkItems_end
|
||||
+
|
||||
CLC : ADC.b #JunkItems_end-JunkItems-1
|
||||
LDA.w AncillaGet, X
|
||||
TAX
|
||||
-
|
||||
CMP.l JunkItems, X : BEQ .junk
|
||||
DEX : BPL -
|
||||
.not_junk
|
||||
PLX
|
||||
LDA.b #$00
|
||||
RTL
|
||||
@@ -328,4 +347,7 @@ JunkItems:
|
||||
db $D5 ; 5 Arrows
|
||||
db $D6 ; Good Bee
|
||||
.end
|
||||
db $6B ; Power Star
|
||||
db $6C ; Triforce Piece
|
||||
.triforce_end
|
||||
;--------------------------------------------------------------------------------
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
!INERT = $00
|
||||
!INIT = $08
|
||||
!ALIVE = $09
|
||||
!OAMPROPS = $09
|
||||
!CUCCO_ENRAGED = $23
|
||||
|
||||
CuccoStorm:
|
||||
@@ -12,6 +13,7 @@ CuccoStorm:
|
||||
LDA.b GameMode : CMP.b #$09 : BNE + ; only if outdoors
|
||||
LDA.l LoopFrames : AND.b #$7F : BNE + ; check every 128 frames
|
||||
|
||||
.activate
|
||||
-
|
||||
;==== Find a Cucco
|
||||
|
||||
@@ -40,7 +42,11 @@ CuccoStorm:
|
||||
PLY
|
||||
CPY.b #$FF : BEQ + ; fail if no slots found
|
||||
LDA.b #!CUCCO : STA.w SpriteTypeTable, Y
|
||||
LDA.b #!INIT : STA.w SpriteAITable, Y
|
||||
LDA.b #!ALIVE : STA.w SpriteAITable, Y
|
||||
PHX
|
||||
TYX : JSL ResetSpriteProperties
|
||||
PLX
|
||||
LDA.b #!OAMPROPS : STA.w SpriteOAMProp, Y
|
||||
LDA.b LinkPosY : STA.w SpritePosYLow, Y
|
||||
LDA.b LinkPosY+1 : STA.w SpritePosYHigh, Y
|
||||
LDA.b LinkPosX : STA.w SpritePosXLow, Y
|
||||
|
||||
@@ -2,7 +2,6 @@
|
||||
; Dark World Spawn Location Fix & Master Sword Grove Fix
|
||||
;--------------------------------------------------------------------------------
|
||||
DarkWorldSaveFix:
|
||||
LDA.b #$70 : PHA : PLB ; thing we wrote over - data bank change
|
||||
JSL MasterSwordFollowerClear
|
||||
JML StatSaveCounter
|
||||
;--------------------------------------------------------------------------------
|
||||
@@ -12,6 +11,7 @@ DoWorldFix:
|
||||
+
|
||||
LDA.l Bugfix_MirrorlessSQToLW : BEQ .skip_mirror_check
|
||||
LDA.l FollowerIndicator : CMP.b #$04 : BNE + ; if old man following, skip mirror/aga check
|
||||
LDA.l FollowerTravelAllowed : CMP.b #$02 : BEQ +
|
||||
LDA.l OldManRetrievalWorld
|
||||
BRA .noMirror
|
||||
+ LDA.l MirrorEquipment : AND.b #$02 : BEQ .noMirror ; check if we have the mirror
|
||||
@@ -60,6 +60,7 @@ RTL
|
||||
DoWorldFix_Inverted:
|
||||
LDA.l Bugfix_MirrorlessSQToLW : BEQ .skip_mirror_check
|
||||
LDA.l FollowerIndicator : CMP.b #$04 : BNE + ; if old man following, skip mirror/aga check
|
||||
LDA.l FollowerTravelAllowed : CMP.b #$02 : BEQ +
|
||||
LDA.l OldManRetrievalWorld
|
||||
BRA .setWorld
|
||||
+ LDA.l MirrorEquipment : AND.b #$02 : BEQ .noMirror ; check if we have the mirror
|
||||
@@ -115,12 +116,13 @@ FakeWorldFix:
|
||||
RTL
|
||||
;--------------------------------------------------------------------------------
|
||||
GetCurrentWorldForLoad:
|
||||
LDA FollowerIndicator : CMP #$04 : BNE .default
|
||||
LDA InvertedMode : BEQ +
|
||||
LDA #$40
|
||||
+ RTL
|
||||
LDA.l FollowerTravelAllowed : CMP.b #$02 : BEQ .default
|
||||
LDA.l FollowerIndicator : CMP.b #$04 : BNE .default
|
||||
LDA.l InvertedMode : BEQ +
|
||||
LDA.b #$40
|
||||
+ RTL
|
||||
.default
|
||||
LDA CurrentWorld
|
||||
LDA.l CurrentWorld
|
||||
RTL
|
||||
;--------------------------------------------------------------------------------
|
||||
MasterSwordFollowerClear:
|
||||
@@ -131,7 +133,9 @@ MasterSwordFollowerClear:
|
||||
RTL
|
||||
;--------------------------------------------------------------------------------
|
||||
FixAgahnimFollowers:
|
||||
LDA.b #$00 : STA.l FollowerIndicator ; clear follower
|
||||
LDA.l FollowerTravelAllowed : CMP.b #$02 : BEQ +
|
||||
LDA.b #$00 : STA.l FollowerIndicator ; clear follower
|
||||
+
|
||||
JML PrepDungeonExit ; thing we wrote over
|
||||
|
||||
;--------------------------------------------------------------------------------
|
||||
|
||||
BIN
data/c2e3e.bin
BIN
data/c2e3e.bin
Binary file not shown.
BIN
data/c2e3e.gfx
BIN
data/c2e3e.gfx
Binary file not shown.
BIN
data/skull.bin
Normal file
BIN
data/skull.bin
Normal file
Binary file not shown.
@@ -202,6 +202,8 @@ DecompressAllItemGraphics:
|
||||
LDX.b #$5C+$73 : JSR AddGfxSheetToBigBuffer
|
||||
LDX.b #$5B+$73 : JSR AddGfxSheetToBigBuffer
|
||||
LDX.b #$5A+$73 : JSR AddGfxSheetToBigBuffer
|
||||
JSR AddCherryPickGfxToBigBuffer
|
||||
LDX.b #$01 : STX.w $06FA
|
||||
LDX.b #$06+$73 : JSR AddGfxSheetToBigBuffer
|
||||
LDX.b #$07+$73 : JSR AddGfxSheetToBigBuffer
|
||||
|
||||
@@ -497,6 +499,11 @@ macro DoPlanesA(offset)
|
||||
|
||||
XBA
|
||||
ORA.b Decomp3BPPScratch
|
||||
PHY
|
||||
LDY.w $06FA : BEQ +
|
||||
AND.w #$00FF ; idk why this line works but some sheets we pull in aren't correct without it
|
||||
+
|
||||
PLY
|
||||
STA.w BigDecompressionBuffer+$10+<offset>+<offset>,X
|
||||
|
||||
endmacro
|
||||
@@ -520,7 +527,11 @@ macro DoIndirectPlanesA(offset)
|
||||
|
||||
XBA
|
||||
ORA.b Decomp3BPPScratch
|
||||
AND.w #$00FF ; idk why this line works but the 2 sheets we pull in aren't correct without it
|
||||
PHY
|
||||
LDY.w $06FA : BEQ +
|
||||
AND.w #$00FF ; idk why this line works but some sheets we pull in aren't correct without it
|
||||
+
|
||||
PLY
|
||||
STA.l BigDecompressionBuffer+$10+<offset>+<offset>,X
|
||||
|
||||
endmacro
|
||||
@@ -612,4 +623,57 @@ Unrolled3BPPConvert:
|
||||
|
||||
;===================================================================================================
|
||||
|
||||
macro CherryPickGfx(source,dest,length)
|
||||
LDX.w #BigDecompressionBuffer+<source>
|
||||
LDY.w #BigDecompressionBuffer+<dest>
|
||||
LDA.w #<length>-1
|
||||
MVN BigDecompressionBuffer>>16,BigDecompressionBuffer>>16
|
||||
|
||||
LDX.w #BigDecompressionBuffer+<source>+$200
|
||||
LDY.w #BigDecompressionBuffer+<dest>+$200
|
||||
LDA.w #<length>-1
|
||||
MVN BigDecompressionBuffer>>16,BigDecompressionBuffer>>16
|
||||
endmacro
|
||||
|
||||
;===================================================================================================
|
||||
|
||||
AddCherryPickGfxToBigBuffer:
|
||||
; this is mostly to load and rearrange follower gfx to save on space
|
||||
; assumes DecompBufferOffset left off at $A000 (#BigDecompressionBuffer+$2000)
|
||||
; adjustments will be needed if anything prior to this changes
|
||||
LDX.b #$01 : STX.w $06FA
|
||||
LDX.b #$35+$73 : JSR AddGfxSheetToBigBuffer
|
||||
LDX.b #$55+$73 : JSR AddGfxSheetToBigBuffer
|
||||
REP #$30
|
||||
%CherryPickGfx($2400,$2140,$40) ; move old man head
|
||||
%CherryPickGfx($2D40,$20C0,$40) ; move zelda body
|
||||
LDA.b DecompBufferOffset : SEC : SBC.w #$0C00 : STA.b DecompBufferOffset
|
||||
SEP #$30
|
||||
LDX.b #$11+$73 : JSR AddGfxSheetToBigBuffer
|
||||
LDX.b #$15+$73 : JSR AddGfxSheetToBigBuffer
|
||||
REP #$30
|
||||
%CherryPickGfx($2940,$2180,$80) ; move locksmith head/body
|
||||
%CherryPickGfx($2D00,$0440,$40) ; move frog
|
||||
%CherryPickGfx($31C0,$0500,$40) ; move purple chest
|
||||
LDA.b DecompBufferOffset : SEC : SBC.w #$1000 : STA.b DecompBufferOffset
|
||||
SEP #$30
|
||||
LDX.b #$59+$73 : JSR AddGfxSheetToBigBuffer
|
||||
LDX.b #$58+$73 : JSR AddGfxSheetToBigBuffer
|
||||
REP #$30
|
||||
%CherryPickGfx($2880,$0480,$40) ; move kiki head
|
||||
%CherryPickGfx($2900,$04C0,$40) ; move kiki body
|
||||
%CherryPickGfx($30C0,$0540,$40) ; move big bomb
|
||||
%CherryPickGfx($2C40,$0180,$40) ; move duck
|
||||
LDA.b DecompBufferOffset : SEC : SBC.w #$1000 : STA.b DecompBufferOffset
|
||||
SEP #$30
|
||||
LDX.b #$4D+$73 : JSR AddGfxSheetToBigBuffer
|
||||
LDX.b #$50+$73 : JSR AddGfxSheetToBigBuffer
|
||||
REP #$30
|
||||
%CherryPickGfx($2880,$0580,$40) ; move smith
|
||||
%CherryPickGfx($3140,$0140,$40) ; move chicken
|
||||
LDA.b DecompBufferOffset : SEC : SBC.w #$1000 : STA.b DecompBufferOffset
|
||||
SEP #$30
|
||||
|
||||
STZ.w $06FA
|
||||
RTS
|
||||
|
||||
|
||||
86
dialog.asm
86
dialog.asm
@@ -265,7 +265,7 @@ RTL
|
||||
RTL
|
||||
;--------------------------------------------------------------------------------
|
||||
DialogGanon1:
|
||||
JSL CheckGanonVulnerability
|
||||
LDA.b #$01 : JSL CheckConditionPass
|
||||
REP #$20
|
||||
LDA.w #$018C
|
||||
BCC +
|
||||
@@ -284,28 +284,68 @@ RTL
|
||||
; s = silver arrow bow
|
||||
; p = 2nd progressive bow
|
||||
DialogGanon2:
|
||||
JSL CheckGanonVulnerability
|
||||
LDA.b #$01 : JSL CheckConditionPass
|
||||
|
||||
REP #$20
|
||||
BCS +
|
||||
LDA.w #$018D : BRA ++
|
||||
+
|
||||
LDA.l BowTracking
|
||||
REP #$20
|
||||
BCS +
|
||||
LDA.w #$018D : JMP .done
|
||||
+
|
||||
LDA.l GanonVulnerabilityItem : AND.w #$00FF
|
||||
BEQ .silver_arrows
|
||||
CMP.w #$0001 : BEQ .silver_arrows
|
||||
CMP.w #$0004 : BEQ .bombs
|
||||
CMP.w #$0005 : BEQ .powder
|
||||
CMP.w #$0010 : BEQ .bee
|
||||
|
||||
BIT.w #$0080 : BNE + ; branch if bow
|
||||
LDA.w #$0192 : BRA ++
|
||||
+
|
||||
BIT.w #$0040 : BEQ + ; branch if no silvers
|
||||
LDA.w #$0195 : BRA ++
|
||||
+
|
||||
BIT.w #$0020 : BNE + ; branch if p bow
|
||||
LDA.w #$0194 : BRA ++
|
||||
+
|
||||
LDA.w #$0193 : BRA ++
|
||||
++
|
||||
STA.w TextID
|
||||
SEP #$20
|
||||
JSL Sprite_ShowMessageMinimal_Alt
|
||||
PHX : TAX
|
||||
LDA.l EquipmentWRAM-1, X
|
||||
PLX
|
||||
AND.w #$00FF : BNE .have
|
||||
BRA .dont_have
|
||||
|
||||
.silver_arrows
|
||||
LDA.l BowTracking
|
||||
|
||||
BIT.w #$0080 : BEQ .dont_have ; no bow
|
||||
BIT.w #$0040 : BNE .have ; have silvers
|
||||
|
||||
BIT.w #$0020 : BNE +
|
||||
LDA.w #$0194 : BRA .done ; have p bow
|
||||
+ LDA.w #$0193 : BRA .done ; don't have p bow
|
||||
|
||||
.dont_have
|
||||
LDA.w #$0192 : BRA .done
|
||||
.have
|
||||
LDA.w #$0195 : BRA .done
|
||||
|
||||
.bombs
|
||||
LDA.l BombsEquipment : AND.w #$00FF : BNE .have
|
||||
LDA.l InfiniteBombs : AND.w #$00FF : BNE .have
|
||||
BRA .dont_have
|
||||
|
||||
.powder
|
||||
LDA.l InventoryTracking : BIT.w #$0010 : BNE .have
|
||||
BRA .dont_have
|
||||
|
||||
.bee
|
||||
LDA.l BottleContentsOne : AND.w #$00FF
|
||||
CMP.w #$0007 : BEQ .have
|
||||
CMP.w #$0008 : BEQ .have
|
||||
LDA.l BottleContentsTwo : AND.w #$00FF
|
||||
CMP.w #$0007 : BEQ .have
|
||||
CMP.w #$0008 : BEQ .have
|
||||
LDA.l BottleContentsThree : AND.w #$00FF
|
||||
CMP.w #$0007 : BEQ .have
|
||||
CMP.w #$0008 : BEQ .have
|
||||
LDA.l BottleContentsFour : AND.w #$00FF
|
||||
CMP.w #$0007 : BEQ .have
|
||||
CMP.w #$0008 : BEQ .have
|
||||
BRA .dont_have
|
||||
|
||||
.done
|
||||
STA.w TextID
|
||||
SEP #$20
|
||||
JSL Sprite_ShowMessageMinimal_Alt
|
||||
RTL
|
||||
;--------------------------------------------------------------------------------
|
||||
DialogEtherTablet:
|
||||
@@ -372,8 +412,8 @@ RTL
|
||||
|
||||
;---------------------------------------------------------------------------------------------------
|
||||
AgahnimAsksAboutPed:
|
||||
LDA.l GanonVulnerableMode
|
||||
CMP.b #$06 : BNE .vanilla
|
||||
; seems light_speed option to change some aga text is unused for now
|
||||
BRA .vanilla
|
||||
|
||||
LDA.l OverworldEventDataWRAM+$80 ; check ped flag
|
||||
AND.b #$40
|
||||
|
||||
@@ -13,6 +13,7 @@ PHP
|
||||
|
||||
SetDefaultWorld:
|
||||
PHP : SEP #$20
|
||||
LDA.l FollowerTravelAllowed : CMP.b #$02 : BEQ .default
|
||||
LDA.l FollowerIndicator : CMP.b #$04 : BNE .default
|
||||
LDA.l OldManRetrievalWorld : BRA +
|
||||
.default
|
||||
|
||||
@@ -55,7 +55,7 @@ DRHUD_EnemyDropIndicator:
|
||||
REP #$30
|
||||
LDA.w EnemyDropIndicator : STA.w HUDMultiIndicator
|
||||
SEP #$20
|
||||
LDA.w DungeonID : CMP.b #$1B : BCS DRHUD_Finished
|
||||
LDA.w DungeonID : CMP.b #$1B : BCC + : JMP DRHUD_Finished : +
|
||||
SEP #$10 : TAX : REP #$10
|
||||
|
||||
DRHUD_DrawCurrentDungeonIndicator: ; mX
|
||||
@@ -69,11 +69,17 @@ DRHUD_DrawCurrentDungeonIndicator: ; mX
|
||||
STY.w HUDCurrentDungeonWorld
|
||||
|
||||
DRHUD_DrawKeyCounter:
|
||||
LDA.l DRFlags : AND.b #$04 : BEQ DRHUD_Finished
|
||||
REP #$20
|
||||
LDA.w MapField : AND.l DungeonMask, X : BEQ DRHUD_Finished
|
||||
TXA : LSR : TAX
|
||||
LDA.l GenericKeys : AND.w #$00FF : BNE .total_only
|
||||
LDA.l DRFlags : AND.b #$04 : BEQ DRHUD_Finished
|
||||
LDA.l CompassMode : BIT.b #$03 : BEQ DRHUD_Finished
|
||||
REP #$20
|
||||
BIT.w #$0002 : BNE .skip_map_check
|
||||
LDA.w MapField : AND.l DungeonMask, X : BEQ DRHUD_Finished
|
||||
.skip_map_check
|
||||
TXA : LSR : BNE .dungeon_id
|
||||
INC
|
||||
.dungeon_id
|
||||
TAX
|
||||
LDA.l GenericKeys : LSR : BCS .total_only
|
||||
LDA.w DungeonCollectedKeys, X : JSR ConvertToDisplay : STA.w HUDKeysObtained
|
||||
LDA.w #!SlashTile : STA.w HUDKeysSlash
|
||||
.total_only
|
||||
@@ -152,16 +158,19 @@ DrHudDungeonItemsAdditions:
|
||||
jsr ConvertToDisplay2 : sta.w $1644, y
|
||||
+ iny #2 : lda.w #$24f5 : sta.w $1644, y
|
||||
phx : ldx.b Scrap00
|
||||
lda.l MapField : and.l DungeonMask, x : beq + ; must have map
|
||||
plx : sep #$30 : lda.l ChestKeys, x : sta.b Scrap02
|
||||
lda.l GenericKeys : bne +++
|
||||
lda.b Scrap02 : !SUB.l DungeonCollectedKeys, x : sta.b Scrap02
|
||||
+++ lda.b Scrap02
|
||||
rep #$30
|
||||
jsr ConvertToDisplay2 : sta.w $1644, y ; small key totals
|
||||
bra .skipStack
|
||||
+ plx
|
||||
.skipStack iny #2
|
||||
LDA.l CompassMode : BIT.w #$0002 : BNE .skip_map_check
|
||||
LDA.l MapField : AND.l DungeonMask, x : BEQ .key_info_done ; must have map
|
||||
.skip_map_check
|
||||
plx : sep #$30 : lda.l ChestKeys, x : sta.b Scrap02
|
||||
lda.l GenericKeys : bne +++
|
||||
lda.b Scrap02 : !SUB.l DungeonCollectedKeys, x : sta.b Scrap02
|
||||
+++ lda.b Scrap02
|
||||
rep #$30
|
||||
jsr ConvertToDisplay2 : sta.w $1644, y ; small key totals
|
||||
bra .skipStack
|
||||
.key_info_done
|
||||
plx
|
||||
.skipStack iny #2
|
||||
cpx.w #$000d : beq +
|
||||
lda.w #$24f5 : sta.w $1644, y
|
||||
+
|
||||
@@ -169,23 +178,26 @@ DrHudDungeonItemsAdditions:
|
||||
+ inx #2 : cpx.w #$001b : bcs ++ : JMP -
|
||||
++
|
||||
lda.l HudFlag : and.w #$0020 : bne + : JMP ++ : +
|
||||
; map symbols (do I want these) ; note compass symbol is 2c20
|
||||
lda.w #$2821 : sta.w $1606 : sta.w $1610 : sta.w $161a : sta.w $1624
|
||||
; map symbols
|
||||
lda.w #$2821 : sta.w $1606 : sta.w $1610 : sta.w $161a
|
||||
; compass symbols
|
||||
lda.w #$2c20 : sta.w $160a : sta.w $1614 : sta.w $161e : sta.w $16e4
|
||||
; blank out a couple thing from old hud
|
||||
lda.w #$24f5 : sta.w $16e4 : sta.w $1724
|
||||
sta.w $160a : sta.w $1614 : sta.w $161e ; blank out sm key indicators
|
||||
lda.w #$24f5 : sta.w $1624 : sta.w $1724
|
||||
ldx.w #$0002
|
||||
- lda.w #$0000 ; start of hud area
|
||||
!ADD.l RowOffsets, x : !ADD.l ColumnOffsets, x : tay
|
||||
lda.l DungeonReminderTable, x : sta.w $1644, y
|
||||
iny #2
|
||||
lda.w #$24f5 : sta.w $1644, y ; blank out map spot
|
||||
lda.l MapField : and.l DungeonMask, x : beq + ; must have map
|
||||
lda.l MapField : ora.l MapCountDisplay : ora.l MapOverlay
|
||||
and.l DungeonMask, x : beq + ; must have map
|
||||
JSR MapIndicatorShort : STA.w $1644, Y
|
||||
+ iny #2
|
||||
cpx.w #$001a : bne +
|
||||
tya : !ADD.w #$003c : tay
|
||||
+ lda.l CompassField : and.l DungeonMask, x : beq + ; must have compass
|
||||
+ lda.l CompassField : ora.l CompassCountDisplay
|
||||
and.l DungeonMask, x : beq + ; must have compass
|
||||
phx ; total chest counts
|
||||
LDA.l CompassTotalsWRAM, x : !SUB.l DungeonLocationsChecked, x
|
||||
SEP #$30 : JSR HudHexToDec2DigitCopy : REP #$30
|
||||
@@ -241,18 +253,36 @@ BkStatus:
|
||||
|
||||
ConvertToDisplay:
|
||||
and.w #$00ff : cmp.w #$000a : !BLT +
|
||||
!ADD.w #$2553 : rts
|
||||
!ADD.w #$2519 : rts
|
||||
+ !ADD.w #$2490 : rts
|
||||
|
||||
ConvertToDisplay2:
|
||||
and.w #$00ff : beq ++
|
||||
cmp.w #$000a : !BLT +
|
||||
!ADD.w #$2553 : rts ; 2580 with 258A as "A" for non transparent digits
|
||||
!ADD.w #$2517 : rts ; 2580 with 258A as "A" for non transparent digits
|
||||
+ !ADD.w #$2816 : rts
|
||||
++ lda.w #$2827 : rts ; 0/O for 0 or placeholder digit ;2483
|
||||
|
||||
CountAbsorbedKeys:
|
||||
JML IncrementSmallKeysNoPrimary
|
||||
JML IncrementSmallKeysNoPrimary
|
||||
|
||||
; This function apporach doesn't currently work
|
||||
CountAbsorbedKeysViaCountAllKey:
|
||||
PHA : PHX
|
||||
LDA.l StandingItemsOn : BEQ .count_it
|
||||
; LDA.w SpawnedItemKeyCounted : BNE .done ; this was added because pot keys were being double counted when they weren't shuffled
|
||||
CPY.b #$24 : BEQ .count_it ; small key for this dungeon
|
||||
LDA.w DungeonID : LSR : TAX
|
||||
TYA : CMP.l KeyTable, X : BNE .done
|
||||
.count_it
|
||||
STY.b Scrap02 : LDY.b #$24 ; for non-24 items (w/o standing_items a small key is just $C), fake it
|
||||
LDX.b #$84 ; pretend this isn't a smallkey, but an absorbed object (small heart)
|
||||
REP #$10 : JSL CountAllKey : SEP #$10
|
||||
LDY.b Scrap02
|
||||
.done
|
||||
; STZ.w SpawnedItemKeyCounted ; reset to zero for next time
|
||||
PLX : PLA
|
||||
JML IncrementSmallKeysNoPrimary
|
||||
|
||||
;================================================================================
|
||||
; 8-bit registers
|
||||
|
||||
@@ -11,6 +11,7 @@ rtl
|
||||
|
||||
OnFileLoadOverride:
|
||||
jsl OnFileLoad ; what I wrote over
|
||||
jsl StartingFollower
|
||||
+ lda.l DRFlags : and.b #$02 : beq + ; Mirror Scroll
|
||||
lda.l MirrorEquipment : bne +
|
||||
lda.b #$01 : sta.l MirrorEquipment
|
||||
@@ -52,8 +53,9 @@ GuruguruFix:
|
||||
|
||||
BlindAtticFix:
|
||||
lda.l DRMode : beq +
|
||||
lda.b #$01 : rtl
|
||||
+ lda.l FollowerIndicator : cmp.b #$06
|
||||
- lda.b #$01 : rtl
|
||||
+ lda.l FollowerTravelAllowed : cmp.b #$02 : beq -
|
||||
lda.l FollowerIndicator : cmp.b #$06
|
||||
rtl
|
||||
|
||||
SuctionOverworldFix:
|
||||
@@ -119,12 +121,6 @@ BlindsAtticHint:
|
||||
SEP #$20 : RTL ; skip the dialog box if the hole is already open
|
||||
+ SEP #$20 : JML Main_ShowTextMessage
|
||||
|
||||
BlindZeldaDespawnFix:
|
||||
CMP.b #06 : BEQ +
|
||||
LDA.w SpritePosYLow,X : BEQ + ; don't despawn follower if maiden isn't "present"
|
||||
PLA : PLA : PEA.w SpritePrep_BlindMaiden_despawn_follower-1 : RTL
|
||||
+ PLA : PLA : PEA.w SpritePrep_BlindMaiden_kill_the_girl-1 : RTL
|
||||
|
||||
BigKeyDoorCheck:
|
||||
CPY.w #$001E : BNE + ; skip if it isn't a BK door
|
||||
LDA.l DRFlags : AND.w #$0400 : BNE + ; skip if the flag is set - bk doors can be double-sided
|
||||
|
||||
@@ -3,6 +3,16 @@
|
||||
;--------------------------------------------------------------------------------
|
||||
SpawnDungeonPrize:
|
||||
PHX : PHB
|
||||
|
||||
PHA
|
||||
; Don't spawn prize in Cave state, Hyrule Castle, Escape, Castle Tower, or Ganon's Tower
|
||||
LDA.w DungeonID : BMI .skip_prize_drop ; Cave state
|
||||
CMP.b #$00 : BEQ .skip_prize_drop ; Escape
|
||||
CMP.b #$02 : BEQ .skip_prize_drop ; Hyrule Castle
|
||||
CMP.b #$1A : BEQ .skip_prize_drop ; Ganon's Tower
|
||||
CMP.b #$08 : BEQ .skip_prize_drop ; Agahnim's Tower (Castle Tower)
|
||||
PLA
|
||||
|
||||
STA.w ItemReceiptID
|
||||
TAX
|
||||
LDA.b $06,S : STA.b ScrapBuffer72 ; Store current RoomTag index
|
||||
@@ -18,6 +28,10 @@ SpawnDungeonPrize:
|
||||
PLB : PLX
|
||||
RTL
|
||||
|
||||
.skip_prize_drop:
|
||||
PLA : PLB : PLX
|
||||
RTL
|
||||
|
||||
AddDungeonPrizeAncilla:
|
||||
LDY.w ItemReceiptID
|
||||
STZ.w AncillaVelocityY,X
|
||||
@@ -453,6 +467,7 @@ RTL
|
||||
|
||||
MaybeSkipCrystalCutsceneFollowerReset:
|
||||
PHA
|
||||
LDA.l FollowerTravelAllowed : CMP.b #$02 : BEQ .skip
|
||||
; skip if prizes are shuffled outside of normal boss drops
|
||||
LDA.l InventoryTable_properties+($37*2) : AND.b #$01 : BEQ .continue
|
||||
.skip
|
||||
|
||||
52
elder.asm
52
elder.asm
@@ -39,32 +39,30 @@ RTL
|
||||
|
||||
Elder_Code:
|
||||
{
|
||||
REP #$20
|
||||
LDA.l GoalItemRequirement : BEQ .despawn
|
||||
LDA.l GanonVulnerableMode : AND.w #$00FF : CMP.w #$0005 : BEQ .despawn
|
||||
LDA.l TurnInGoalItems : AND.w #$00FF : BNE +
|
||||
TXY : LDX.b #$06
|
||||
REP #$30
|
||||
LDA.l GoalConditionTable, X
|
||||
TAX : LDA.l $B00000, X
|
||||
SEP #$30
|
||||
TYX
|
||||
CMP.b #$00 : BEQ .despawn ; no goal, despawn
|
||||
LDA.l TurnInGoalItems : BNE +
|
||||
.despawn
|
||||
SEP #$20
|
||||
STZ.w SpriteAITable, X ; despawn self
|
||||
RTS
|
||||
+
|
||||
SEP #$20
|
||||
LDA.b GameSubMode
|
||||
BNE .done
|
||||
LDA.b #$96
|
||||
LDY.b #$01
|
||||
|
||||
JSL Sprite_ShowSolicitedMessageIfPlayerFacing_PreserveMessage : BCC .dont_show
|
||||
REP #$20
|
||||
LDA.l GoalCounter
|
||||
CMP.l GoalItemRequirement : !BLT +
|
||||
SEP #$20
|
||||
LDA.b #$03 : JSL CheckConditionPass : BCC +
|
||||
JSL ActivateTriforceCutscene
|
||||
+
|
||||
.dont_show
|
||||
|
||||
.done
|
||||
SEP #$20
|
||||
LDA.b FrameCounter : LSR #5 : AND.b #$01 : STA.w SpriteGFXControl, X
|
||||
RTS
|
||||
}
|
||||
@@ -144,19 +142,35 @@ MasterSword_CheckIfPulled:
|
||||
|
||||
MasterSword_ConditionalActivateCutscene:
|
||||
LDA.w SpriteMovement,X : BNE .specialCutscene
|
||||
PHX
|
||||
REP #$30
|
||||
LDA.w SprRedrawFlag, X : BNE .doNormalPed
|
||||
INC.w SprRedrawFlag, X
|
||||
LDA.l PedPullGfx : BEQ .doNormalPed
|
||||
LDX.w ItemStackPtr : STA.l ItemGFXStack,X
|
||||
LDA.w #$BCE0>>1 : STA.l ItemTargetStack,X
|
||||
TXA : INC #2 : STA.w ItemStackPtr
|
||||
.doNormalPed
|
||||
SEP #$30
|
||||
PLX
|
||||
JML Sprite_CheckDamageToPlayerSameLayerLong ; what we wrote over
|
||||
.specialCutscene
|
||||
LDA.b #$02 : STA.w ItemReceiptPose ; Link's 2-hands-up pose
|
||||
STA.b LinkLayer ; draw Link on top
|
||||
; draw Triforce piece in VRAM
|
||||
LDA.w SprRedrawFlag, X : BNE .skipTransfer
|
||||
INC.w SprRedrawFlag, X
|
||||
PHX
|
||||
REP #$30
|
||||
LDX.w #$006A<<1
|
||||
LDA.l StandingItemGraphicsOffsets,X : LDX.w ItemStackPtr : STA.l ItemGFXStack,X
|
||||
LDA.l MurahdahlaGfx : BNE .submitRequest
|
||||
LDX.w #$006A<<1 : LDA.l StandingItemGraphicsOffsets,X
|
||||
.submitRequest
|
||||
LDX.w ItemStackPtr : STA.l ItemGFXStack,X
|
||||
LDA.w #$9CE0>>1 : STA.l ItemTargetStack,X
|
||||
TXA : INC #2 : STA.w ItemStackPtr
|
||||
SEP #$30
|
||||
PLX
|
||||
.skipTransfer
|
||||
PLA : PLA : PLA : JML MasterSword_InPedestal_DoCutscene ; do cutscene
|
||||
|
||||
MasterSword_ConditionalGrabPose:
|
||||
@@ -173,10 +187,20 @@ RTL
|
||||
MasterSword_SpawnPendantProp_ChangePalette:
|
||||
STA.w SpriteVelocityY,Y : PLX ; what we wrote over
|
||||
LDA.w SpriteMovement,X : BNE .specialCutscene
|
||||
LDA.l PedPullGfx : BNE .customPedGfx
|
||||
LDA.l PedPullGfx+1 : BNE .customPedGfx
|
||||
BRA .done
|
||||
.customPedGfx
|
||||
LDA.l PedPullPalette : ASL : INC : BRA .setPalette
|
||||
.specialCutscene
|
||||
LDA.b #$08 : STA.w SpriteOAMProp,Y ; change palette
|
||||
LDA.b #$02 : STA.w SpriteLayer,Y ; change layer
|
||||
LDA.l MurahdahlaGfx : BNE .customGfx
|
||||
LDA.l MurahdahlaGfx+1 : BNE .customGfx
|
||||
LDA.b #$08 : BRA .setPalette
|
||||
.customGfx
|
||||
LDA.l MurahdahlaPalette : ASL
|
||||
.setPalette
|
||||
STA.w SpriteOAMProp,Y ; change palette
|
||||
.done
|
||||
JML MasterSword_SpawnPendantProp_ChangePalette_return
|
||||
|
||||
|
||||
@@ -23,12 +23,13 @@ boss_move:
|
||||
+
|
||||
|
||||
CMP.b #41 : BNE + ; Is it Skull Woods Boss Room
|
||||
; TODO: Add moving floor sprite
|
||||
JSL Sprite_ResetAll ; reset sprites twice in that room for some reasons (fix bug with kholdstare)
|
||||
JSL Dungeon_ResetSprites ; Restore the dungeon_resetsprites
|
||||
LDA.b #$07 : STA.w $0B00 ;Spawn the moving floor sprite
|
||||
STZ.w $0B28
|
||||
INC.w OverlordXLow
|
||||
LDA.w $0E20 : CMP.b #$92 : BNE ++ ; Is it Helmasuar King?
|
||||
LDA.b #$07 : STA.w $0B00 ;Spawn the bugged moving floor sprite
|
||||
STZ.w $0B28
|
||||
INC.w OverlordXLow
|
||||
++
|
||||
BRL .move_to_bottom_right
|
||||
+
|
||||
|
||||
@@ -287,3 +288,16 @@ new_trinexx_code:
|
||||
|
||||
RTL
|
||||
;--------------------------------------------------------------------------------
|
||||
|
||||
;================================================================================
|
||||
; Check if water tile in Swamp boss room, skip interaction
|
||||
;--------------------------------------------------------------------------------
|
||||
swamp_boss_tile_interaction:
|
||||
LDA.l Sprite_ReducedTileInteractionTable, X : BEQ .return
|
||||
CPX.b #$09 : BNE .return ; return if non-water tile
|
||||
LDX.b IndoorsFlag : BEQ .return ; return if overworld
|
||||
LDX.b RoomIndex : CPX.b #$06 : BNE .return ; return if not swamp boss room
|
||||
LDA.b #$00
|
||||
.return
|
||||
RTL
|
||||
;--------------------------------------------------------------------------------
|
||||
|
||||
@@ -14,4 +14,13 @@ incsrc hooks/damage_hooks.asm
|
||||
|
||||
incsrc hooks/overworld_sprite_hooks.asm
|
||||
|
||||
incsrc hooks/underworld_sprite_hooks.asm
|
||||
incsrc hooks/underworld_sprite_hooks.asm
|
||||
|
||||
org $85B8BA
|
||||
JSL GeldmanDrawOverride
|
||||
|
||||
org $9EAAAC
|
||||
JSL StalfosKnightDrawOverride
|
||||
|
||||
org $9EB209
|
||||
JSL BlobDrawOverride
|
||||
@@ -39,3 +39,10 @@ JSL new_kholdstare_code ; Write new gfx in the vram
|
||||
org $1DAD67 ; sprite_trinexx.asm (62) : LDA.b #$03 : STA $0DC0, X
|
||||
JSL new_trinexx_code : NOP
|
||||
;--------------------------------------------------------------------------------
|
||||
|
||||
;================================================================================
|
||||
; Swamp Boss Room Water Fix
|
||||
;--------------------------------------------------------------------------------
|
||||
org $06E81A
|
||||
JSL swamp_boss_tile_interaction
|
||||
;--------------------------------------------------------------------------------
|
||||
|
||||
@@ -2,7 +2,11 @@
|
||||
; New bush mob randomization
|
||||
;--------------------------------------------------------------------------------
|
||||
org $868279
|
||||
NOP #$0A
|
||||
BRA +
|
||||
MaybeSkipTerrainDebris:
|
||||
JSL MaybeSkipTerrainDebris_long : RTS ; sticking this here, no other free space in bank 06
|
||||
NOP #3
|
||||
+
|
||||
JSL sprite_bush_spawn
|
||||
NOP ; we keep the branch
|
||||
;--------------------------------------------------------------------------------
|
||||
|
||||
@@ -18,10 +18,3 @@ org $9DD88E
|
||||
;0EDBB2 0EDBB3
|
||||
; LDX.b #$01
|
||||
;}
|
||||
|
||||
org $85B8BA ; geldman
|
||||
JSL Sprite_MaybeForceDrawShadow
|
||||
org $9EAAAC ; stalfos knight
|
||||
JSL Sprite_MaybeForceDrawShadow
|
||||
org $9EB209 ; blob
|
||||
JSL Sprite_MaybeForceDrawShadow
|
||||
|
||||
@@ -61,7 +61,3 @@ LDA.b [Scrap00],Y
|
||||
|
||||
org $89C416
|
||||
LDA.b [Scrap00],Y
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -2,8 +2,7 @@ pushpc
|
||||
|
||||
org $9EC147
|
||||
JSL NewKodongoCollision
|
||||
JMP .continue : NOP #2
|
||||
.continue
|
||||
BRA + : NOP #3 : +
|
||||
|
||||
org $9EC152
|
||||
Kodongo_SetDirection:
|
||||
@@ -12,8 +11,18 @@ pullpc
|
||||
|
||||
NewKodongoCollision:
|
||||
LDA.w SpriteMoveDirection, X : INC A : AND.b #$03 : STA.w SpriteMoveDirection, X
|
||||
JSL Kodongo_InVanillaRoom : BEQ .continue
|
||||
;If they collide more than 4 times just set direction
|
||||
LDA.w SpriteAuxTable, X : INC A : STA.w SpriteAuxTable, X : CMP.b #$04 : BCC .continue
|
||||
PLA : PLA : PEA.w Kodongo_SetDirection-1
|
||||
.continue
|
||||
RTL
|
||||
RTL
|
||||
|
||||
Kodongo_InVanillaRoom:
|
||||
LDA.b RoomIndex+1 : BNE .return
|
||||
LDA.b RoomIndex : CMP.b #$19 : BEQ .return
|
||||
CMP.b #$27 : BEQ .return
|
||||
CMP.b #$77 : BEQ .return
|
||||
.return
|
||||
RTL
|
||||
nop #10
|
||||
@@ -52,8 +52,5 @@ incsrc falling_death.asm
|
||||
incsrc shell_gfx.asm
|
||||
warnpc $B6FFFF ;if we hit this we need to split stuff by bank
|
||||
|
||||
org $8684BD
|
||||
Sprite_Get16BitCoords_long:
|
||||
|
||||
org $9EC6FA ;F46FA
|
||||
SpritePrep_Eyegore:
|
||||
@@ -1,11 +1,52 @@
|
||||
LoadUnderworldSprites:
|
||||
STA.b Scrap00 ; part one of what we replaced
|
||||
LDA.w #UWSpritesData>>16 : STA.b Scrap02 ; set the bank to 28 for now
|
||||
LDA.w $048E
|
||||
if !FEATURE_FIX_BASEROM
|
||||
LDA.w #$89
|
||||
else
|
||||
LDA.w #UWSpritesData>>16 ; set the bank to 28 for now
|
||||
endif
|
||||
STA.b Scrap02
|
||||
LDA.w $048E
|
||||
RTL
|
||||
|
||||
GetSpriteSlot16Bit:
|
||||
LDA.b Scrap03 : AND.w #$00FF
|
||||
ASL A
|
||||
TAY
|
||||
RTL
|
||||
RTL
|
||||
|
||||
GeldmanDrawOverride:
|
||||
PLA : PLA : PLA ; fix the call stack
|
||||
LDA.l DRFlags+1 : AND.b #$08 : BEQ .vanilla
|
||||
|
||||
LDA.b #$01
|
||||
STA.w $0DC0,X
|
||||
JML Sprite_4C_Geldman_do_indeed_draw
|
||||
|
||||
.vanilla
|
||||
JSL Sprite_PrepOAMCoordLong
|
||||
JML Sprite_4C_Geldman_continue
|
||||
|
||||
StalfosKnightDrawOverride:
|
||||
LDA.l DRFlags+1 : AND.b #$08 : BEQ .vanilla
|
||||
|
||||
JSL Sprite_PrepOAMCoordLong
|
||||
LDA.b #$12
|
||||
JML Sprite_DrawShadowLong
|
||||
|
||||
.vanilla
|
||||
JSL Sprite_PrepOAMCoordLong
|
||||
RTL
|
||||
|
||||
BlobDrawOverride:
|
||||
PLA : PLA : PLA ; fix the call stack
|
||||
LDA.l DRFlags+1 : AND.b #$08 : BEQ .vanilla
|
||||
|
||||
LDA.b #$05
|
||||
STA.w $0DC0,X
|
||||
|
||||
JML SpriteDraw_Blob_head_popping_out
|
||||
|
||||
.vanilla
|
||||
JSL Sprite_PrepOAMCoordLong
|
||||
JML SpriteDraw_Blob_bad_gfx
|
||||
|
||||
@@ -25,15 +25,3 @@ NewFireBarDamage:
|
||||
RTL
|
||||
.NotSameLayer
|
||||
RTL
|
||||
;--------------------------------------------------------------------------------
|
||||
Sprite_MaybeForceDrawShadow:
|
||||
JSL Sprite_PrepOAMCoordLong
|
||||
LDA.l DRFlags+1 : AND.b #$08 : BEQ .return
|
||||
LDA.b GameMode : CMP.b #$07 : BNE .return
|
||||
JSL Sprite_DrawShadowLong
|
||||
; LDA.w SpriteTypeTable,X : CMP.b #$91 : BNE .return ; stalfos knight
|
||||
; ; move shadow down by 8 pixels
|
||||
; + LDA.w SpriteOAMProperties,X : AND.b #$1F : ASL #2 : TAY : INY ; get OAM offset
|
||||
; LDA.b (OAMPtr),Y : CLC : ADC.b #$08 : STA.b (OAMPtr),Y
|
||||
.return
|
||||
RTL
|
||||
|
||||
@@ -63,8 +63,8 @@ RTS
|
||||
RTS
|
||||
;--------------------------------------------------------------------------------
|
||||
SmithDoorCheck:
|
||||
LDA.l SmithTravelsFreely : AND.w #$00FF : BEQ .orig
|
||||
;If SmithTravelsFreely is set Frog/Smith can enter multi-entrance overworld doors
|
||||
LDA.l FollowerTravelAllowed : AND.w #$00FF : BEQ .orig
|
||||
;If FollowerTravelAllowed is set Frog/Smith can enter multi-entrance overworld doors
|
||||
JML Overworld_Entrance_BRANCH_RHO
|
||||
|
||||
.orig ; The rest is equivlent to what we overwrote
|
||||
|
||||
44
events.asm
44
events.asm
@@ -61,13 +61,22 @@ OnDungeonExit:
|
||||
PLP : PLA
|
||||
RTL
|
||||
;--------------------------------------------------------------------------------
|
||||
OnSave:
|
||||
LDA.b #$70 : PHA : PLB ; thing we wrote over - data bank change
|
||||
JSL DarkWorldSaveFix
|
||||
JML MSUResumeReset
|
||||
;--------------------------------------------------------------------------------
|
||||
OnQuit:
|
||||
JSL SQEGFix
|
||||
JSL MSUResumeReset
|
||||
LDA.b #$00 : STA.l AltTextFlag ; bandaid patch bug with mirroring away from text
|
||||
LDA.b #$10 : STA.b MAINDESQ ; thing we wrote over
|
||||
RTL
|
||||
;--------------------------------------------------------------------------------
|
||||
OnDeathNoSave:
|
||||
JSL MSUResumeReset
|
||||
LDA.b #$05 : STA.b $10 ; what we wrote over
|
||||
RTL
|
||||
;--------------------------------------------------------------------------------
|
||||
OnUncleItemGet:
|
||||
PHA
|
||||
|
||||
@@ -98,8 +107,8 @@ RTL
|
||||
;--------------------------------------------------------------------------------
|
||||
OnAga1Defeated:
|
||||
STA.l ProgressIndicator ; vanilla game state stuff we overwrote
|
||||
LDA.l GanonVulnerableMode
|
||||
CMP.b #$06 : BNE +
|
||||
; seems light_speed option to auto triforce room is unused for now
|
||||
BRA +
|
||||
.light_speed
|
||||
REP #$20
|
||||
LDA.w #$0019 : STA.b GameMode
|
||||
@@ -135,7 +144,7 @@ OnFileCreation:
|
||||
|
||||
; Resolve instant post-aga if standard
|
||||
SEP #$20
|
||||
LDA.l InitProgressIndicator : BIT #$80 : BEQ +
|
||||
LDA.l InitProgressIndicator : BIT.b #$80 : BEQ +
|
||||
LDA.b #$00 : STA.l ProgressIndicatorSRAM ; set post-aga after zelda rescue
|
||||
LDA.b #$00 : STA.l OverworldEventDataSRAM+$02 ; keep rain state vanilla
|
||||
+
|
||||
@@ -208,18 +217,37 @@ OnInitFileSelect:
|
||||
JSL EnableForceBlank
|
||||
RTL
|
||||
;--------------------------------------------------------------------------------
|
||||
OnGloomDamage:
|
||||
LDA.b #$01
|
||||
STA.l UpdateHUDFlag
|
||||
LDA.l MaximumHealth
|
||||
SEC : SBC.b #$08
|
||||
STA.l CurrentHealth
|
||||
BEQ +
|
||||
STA.l MaximumHealth
|
||||
+ RTL
|
||||
;--------------------------------------------------------------------------------
|
||||
OnLinkDamaged:
|
||||
JSL IncrementDamageTakenCounter_Arb
|
||||
LDA.l ChallengeModes : AND.b #$03 : CMP.b #$02 : BEQ .gloom
|
||||
JML OHKOTimer
|
||||
.gloom
|
||||
STZ.b $00
|
||||
JML OnGloomDamage
|
||||
;--------------------------------------------------------------------------------
|
||||
;OnEnterWater:
|
||||
; JSL UnequipCapeQuiet ; what we wrote over
|
||||
;RTL
|
||||
;--------------------------------------------------------------------------------
|
||||
OnLinkDamagedFromPit:
|
||||
LDA.l ChallengeModes : AND.b #$03 : CMP.b #$02 : BEQ .gloom
|
||||
JSL OHKOTimer
|
||||
BRA +
|
||||
.gloom
|
||||
JSL OnGloomDamage
|
||||
CLC : ADC.b #$08 : STA.l CurrentHealth
|
||||
|
||||
LDA.l AllowAccidentalMajorGlitch
|
||||
+ LDA.l AllowAccidentalMajorGlitch
|
||||
BEQ ++
|
||||
-- LDA.b #$14 : STA.b GameSubMode ; thing we wrote over
|
||||
|
||||
@@ -231,7 +259,12 @@ OnLinkDamagedFromPit:
|
||||
RTL
|
||||
;--------------------------------------------------------------------------------
|
||||
OnLinkDamagedFromPitOutdoors:
|
||||
LDA.l ChallengeModes : AND.b #$03 : CMP.b #$02 : BEQ .gloom
|
||||
JML OHKOTimer ; make sure this is last
|
||||
.gloom
|
||||
JSL OnGloomDamage
|
||||
CLC : ADC.b #$08
|
||||
RTL
|
||||
;--------------------------------------------------------------------------------
|
||||
OnOWTransition:
|
||||
JSL FloodGateReset
|
||||
@@ -244,6 +277,7 @@ OnOWTransition:
|
||||
RTL
|
||||
;--------------------------------------------------------------------------------
|
||||
OnLoadDuckMap:
|
||||
JSL SelectFirstFluteSpot
|
||||
LDA.l DuckMapFlag
|
||||
BNE +
|
||||
INC : STA.l DuckMapFlag
|
||||
|
||||
@@ -248,8 +248,12 @@ DrawPlayerFileShared:
|
||||
|
||||
; Flute
|
||||
LDA.l InventoryTrackingSRAM : AND.w #$0003 : BEQ +
|
||||
LDA.l $7003C2 : AND.w #$00FF : CMP.w #$00FF : BNE .pseudo
|
||||
%fs_drawItem(7,16,FileSelectItems_flute)
|
||||
BRA ++
|
||||
.pseudo
|
||||
%fs_drawItem(7,16,FileSelectItems_flute_green)
|
||||
BRA ++
|
||||
+
|
||||
%fs_drawItemGray(7,16,FileSelectItems_flute)
|
||||
++
|
||||
@@ -539,6 +543,8 @@ FileSelectItems:
|
||||
dw #$0264|!FS_COLOR_BROWN, #$0265|!FS_COLOR_BROWN, #$0274|!FS_COLOR_BROWN, #$0275|!FS_COLOR_BROWN
|
||||
.flute
|
||||
dw #$0266|!FS_COLOR_BLUE, #$0267|!FS_COLOR_BLUE, #$0276|!FS_COLOR_BLUE, #$0277|!FS_COLOR_BLUE
|
||||
.flute_green
|
||||
dw #$0266|!FS_COLOR_GREEN, #$0267|!FS_COLOR_GREEN, #$0276|!FS_COLOR_GREEN, #$0277|!FS_COLOR_GREEN
|
||||
.book
|
||||
dw #$026A|!FS_COLOR_GREEN, #$026B|!FS_COLOR_GREEN, #$027A|!FS_COLOR_GREEN, #$027B|!FS_COLOR_GREEN
|
||||
.redcane
|
||||
|
||||
942
follower.asm
Normal file
942
follower.asm
Normal file
@@ -0,0 +1,942 @@
|
||||
pushpc
|
||||
; follower hooks
|
||||
org $81EBB6
|
||||
JSL MaybeSetZeldaCheckpoint
|
||||
org $899FA1
|
||||
db $FF, $FF, $FF ; disable timed follower messages
|
||||
org $89A647
|
||||
JSL MaybeSkipFollowerTrigger : NOP
|
||||
org $89F544
|
||||
JSL MaybeDeleteFollowersOnDeath
|
||||
|
||||
org $85EBCF
|
||||
JSL SpritePrep_ZeldaFollower : NOP #2
|
||||
org $85EC9E
|
||||
JSL SpriteDraw_ZeldaMaiden
|
||||
org $85ECD9
|
||||
JSL Zelda_WaitingInCell
|
||||
org $85ED46
|
||||
JSL Zelda_BecomeFollower : NOP #2
|
||||
|
||||
org $9EE902
|
||||
JSL SpritePrep_OldManFollower : NOP #2 : db $F0 ; BEQ
|
||||
org $9DFF18
|
||||
JSL SpriteDraw_OldManFollower
|
||||
org $9EE9BC
|
||||
JSL Follower_CheckMessageCollision
|
||||
org $9EE9CC
|
||||
JSL OldMan_BecomeFollower : NOP #2
|
||||
|
||||
org $86899C
|
||||
JSL SpritePrep_BlindMaiden : NOP #2
|
||||
org $8689A7
|
||||
JSL BlindZeldaDespawnFix : NOP #2
|
||||
org $9EE8B0
|
||||
JSL SpriteDraw_ZeldaMaiden
|
||||
org $9EE8CD
|
||||
JSL Follower_CheckCollision
|
||||
org $9EE8D7
|
||||
JSL BlindMaiden_BecomeFollower : NOP
|
||||
|
||||
org $868A7E
|
||||
JSL SpritePrep_SmithyFrog : BRA + : NOP #8 : +
|
||||
org $86B2AA
|
||||
JSL Follower_CheckMessageCollision
|
||||
org $86B2B4
|
||||
JSL Frog_BecomeFollower : NOP #2
|
||||
org $86B341
|
||||
JSL SpriteDraw_FrogFollower
|
||||
|
||||
org $868A53
|
||||
JSL SpritePrep_PurpleChest : NOP #2
|
||||
org $9EE0D7
|
||||
JSL SpriteDraw_PurpleChest
|
||||
org $9EE0E7
|
||||
JSL Follower_CheckMessageCollision
|
||||
org $9EE0ED
|
||||
JSL PurpleChest_FollowCheck
|
||||
org $9EE0F7
|
||||
JSL PurpleChest_BecomeFollower : NOP
|
||||
|
||||
org $868A0A
|
||||
JSL SpritePrep_SuperBomb
|
||||
org $868A4A
|
||||
SuperBomb_BecomeFollower_exit:
|
||||
org $9EE16E
|
||||
BRA + : NOP #6 : + ; fix bomb shop dialog for dwarfless big bomb
|
||||
org $9EE1E8
|
||||
JSL SuperBomb_FollowCheck
|
||||
org $9EE1F1
|
||||
JSL SuperBomb_BecomeFollower : NOP #2
|
||||
org $9EE2C0
|
||||
JSL SpriteDraw_SuperBomb
|
||||
|
||||
org $868D51
|
||||
JSL SpritePrep_Kiki : NOP #2
|
||||
org $9EE3E6
|
||||
JSL Kiki_OfferToFollow
|
||||
org $9EE495
|
||||
JSL Kiki_FollowCheck : BRA + : NOP #12 : +
|
||||
org $9EE4AF
|
||||
JSL Kiki_BecomeFollower : NOP #2
|
||||
org $9EE4F7
|
||||
JSL Kiki_FixTeleportOnExit
|
||||
org $89A1B2
|
||||
JSL Kiki_DontScareTheMonke : NOP #3
|
||||
|
||||
org $868D63
|
||||
JSL SpritePrep_Locksmith : NOP #2 : db $90 ; BCC
|
||||
org $868D7E
|
||||
db $80 ; BRA
|
||||
org $86BCD9
|
||||
JML Locksmith_Chillin_PostMessage
|
||||
org $86BD09
|
||||
JSL Locksmith_BecomeFollower : NOP #2
|
||||
org $86BD7A ; allow follower pickup after purple chest item
|
||||
LDA.b #$00 : STA.w SpriteActivity, X
|
||||
JSL Locksmith_RespondToAnswer_PostItem
|
||||
org $86BDB4
|
||||
JSL SpriteDraw_LocksmithFollower
|
||||
pullpc
|
||||
|
||||
MaybeSkipFollowerTrigger:
|
||||
LDA.b GameMode : AND.w #$00FF : CMP.w #$0010 : BNE .normal
|
||||
.no_trigger
|
||||
INC : RTL
|
||||
.normal
|
||||
LDA.w $02F2 : AND.b Scrap06 ; what we wrote over
|
||||
RTL
|
||||
|
||||
MaybeDeleteFollowersOnDeath:
|
||||
LDA.l FollowerTravelAllowed : CMP.b #$02 : BNE .vanilla
|
||||
; s+q = favor keeping current follower
|
||||
; death = favor replacing with unfulfilled starting followers
|
||||
; during escape = always favor keeping zelda
|
||||
LDA.b GameMode : CMP.b #$17 : BEQ .keep
|
||||
LDA.w DungeonID : NOP #2 : BPL .keep
|
||||
LDA.l InitFollowerIndicator : BEQ .keep
|
||||
JSL DetermineFollowerSpawn_check_resolved : BCS .keep
|
||||
LDA.l ProgressIndicator : CMP.b #$02 : BCS .delete
|
||||
LDA.l FollowerIndicator : CMP.b #$01 : BEQ .keep
|
||||
.delete
|
||||
PLA : PLA : PEA.w $89F558-1
|
||||
RTL
|
||||
.keep
|
||||
PLA : PLA : PEA.w $89F55E-1
|
||||
RTL
|
||||
.vanilla
|
||||
LDA.l FollowerIndicator ; what we wrote over
|
||||
RTL
|
||||
|
||||
StartingFollower:
|
||||
LDA.l InitFollowerIndicator : BEQ .return
|
||||
PHA
|
||||
REP #$20
|
||||
; possible spawn points
|
||||
LDA.b RoomIndex : CMP.w #$0104 : BEQ + ; links house
|
||||
CMP.w #$0012 : BEQ + ; sanc
|
||||
CMP.w #$00E4 : BEQ + ; old man
|
||||
CMP.w #$0112 : BEQ + ; dark sanc
|
||||
CMP.w #$011C : BEQ + ; bomb shop
|
||||
SEP #$20 : PLA : RTL
|
||||
+
|
||||
SEP #$20
|
||||
LDA.l FollowerIndicator : BEQ +
|
||||
LDA.l FollowerDropped : CMP.b #$80 : PLA : BCC .return : PHA
|
||||
+ LDA.l ProgressIndicator : CMP.b #$02 : PLA : BCC .escape_check
|
||||
PHA
|
||||
JSL DetermineFollowerSpawn_check_resolved
|
||||
PLA
|
||||
BCC .issue_follower
|
||||
BRA .return
|
||||
.escape_check
|
||||
CMP.b #$01 : BNE .return
|
||||
PHA : LDA.l ProgressFlags : AND.b #$04 : CMP.b #$04 : PLA : BCS .return
|
||||
.issue_follower
|
||||
STA.l FollowerIndicator
|
||||
LDA.b #$00 : STA.l FollowerDropped
|
||||
.return
|
||||
RTL
|
||||
|
||||
MaybeSetZeldaCheckpoint:
|
||||
AND.w #$7FFF : TAX ; what we wrote over
|
||||
SEP #$20
|
||||
LDA.l ProgressFlags : AND.b #$04 : BNE .return ; zelda rescued
|
||||
LDA.l StartingEntrance : CMP.b #$02 : BEQ .return ; cell checkpoint set
|
||||
CMP.b #$04 : BEQ .return ; throne room checkpoint set
|
||||
LDA.l FollowerIndicator : CMP.b #$01 : BNE .return ; zelda following
|
||||
LDA.b RoomIndex : CMP.b #$80 : BNE + ;zelda cell
|
||||
LDA.l Follower_Zelda : CMP.b #$01 : BNE .return
|
||||
BRA .set_checkpoint
|
||||
+ CMP.b #$45 : BNE .return ; maiden cell
|
||||
CPX.w #$0964 : BNE .return ; top big lock
|
||||
LDA.l Follower_Maiden : CMP.b #$01 : BNE .return
|
||||
.set_checkpoint
|
||||
LDA.b #$02 : STA.l StartingEntrance
|
||||
PHX
|
||||
SEP #$10
|
||||
JSL SaveDeathCount
|
||||
JSL Dungeon_SaveRoomQuadrantData
|
||||
REP #$10
|
||||
PLX
|
||||
.return
|
||||
REP #$30
|
||||
RTL
|
||||
|
||||
FollowerGfxRedraw:
|
||||
PHP : SEP #$30
|
||||
LDA.l FollowerTravelAllowed : CMP.b #$02 : BNE .return
|
||||
PHY
|
||||
LDY.b #$0F
|
||||
.next
|
||||
LDA.w SpriteAITable,Y : BEQ ++
|
||||
LDA.w SpriteTypeTable,Y : CMP.b #$76 : BEQ + ; zelda
|
||||
CMP.b #$AD : BEQ + ; old man
|
||||
CMP.b #$B7 : BEQ + ; maiden
|
||||
CMP.b #$1A : BEQ + ; frog
|
||||
CMP.b #$39 : BEQ + ; locksmith
|
||||
CMP.b #$B6 : BEQ + ; kiki
|
||||
CMP.b #$B4 : BEQ + ; purple chest
|
||||
CMP.b #$B5 : BNE ++ ; big bomb
|
||||
LDA.w SpriteJumpIndex,Y : CMP.b #$02 : BEQ +
|
||||
BRA ++
|
||||
+ LDA.b #$01 : STA.w SprRedrawFlag,Y
|
||||
++ DEY : BPL .next
|
||||
PLY
|
||||
.return
|
||||
PLP
|
||||
RTL
|
||||
|
||||
; A = 2 byte VRAM position in OAM2 for head/body
|
||||
; Scrap06/07/08 = address to OAM group
|
||||
; Returns with carry flag set if draw occurred
|
||||
TransferAndDrawFollowerGfx:
|
||||
PHA
|
||||
LDA.w SpriteTimerE, X : AND.w #$0008 : BNE .skip_draw ; skip drawing every other frame
|
||||
LDA.b 1,S
|
||||
JSR TransferFollowerSpriteGfx ; returns with SEP #$20
|
||||
LDA.w SpriteTypeTable, X : CMP.b #$39 : BNE +
|
||||
; locksmith location flicker if quest completed but purple chest remains
|
||||
LDA.w SpriteAux, X : BNE .continue
|
||||
JSL DetermineFollowerSpawn : BCS .flicker
|
||||
+ BRA .continue
|
||||
.flicker
|
||||
LDA.w SpriteTimerE, X : NOP #2 : BNE .continue
|
||||
LDA.b #$0C : STA.w SpriteTimerE, X
|
||||
.continue
|
||||
PLA : XBA : PLA : XBA
|
||||
JSL SpriteDraw_Follower
|
||||
SEC
|
||||
RTL
|
||||
.skip_draw
|
||||
PLA
|
||||
SEP #$20
|
||||
CLC
|
||||
RTL
|
||||
|
||||
; A = 2 byte VRAM position in OAM2 for head/body
|
||||
TransferFollowerSpriteGfx_skip_transfer:
|
||||
PLA : PLA
|
||||
RTS
|
||||
TransferFollowerSpriteGfx:
|
||||
PHA : SEP #$20
|
||||
LDA.w SprRedrawFlag, X : BEQ .skip_transfer
|
||||
.redraw
|
||||
STZ.w SprRedrawFlag, X
|
||||
JSL DetermineFollower
|
||||
CMP.b #$01 : BNE +
|
||||
PLA : XBA : LDA.b #$83 ; zelda body
|
||||
JSR QueueFollowerSpriteGfx
|
||||
PLA : XBA : LDA.b #$82 ; zelda head
|
||||
JMP QueueFollowerSpriteGfx
|
||||
+ CMP.b #$04 : BNE +
|
||||
PLA : XBA : LDA.b #$84 ; old man body
|
||||
JSR QueueFollowerSpriteGfx
|
||||
PLA : XBA : LDA.b #$85 ; old man head
|
||||
JMP QueueFollowerSpriteGfx
|
||||
+ CMP.b #$06 : BNE +
|
||||
PLA : XBA : LDA.b #$81 ; maiden body
|
||||
JSR QueueFollowerSpriteGfx
|
||||
PLA : XBA : LDA.b #$80 ; maiden head
|
||||
JMP QueueFollowerSpriteGfx
|
||||
+ CMP.b #$07 : BNE +
|
||||
PLA : XBA : PLA : LDA.b #$11 ; frog
|
||||
JMP QueueFollowerSpriteGfx
|
||||
+ CMP.b #$08 : BNE +
|
||||
PLA : XBA : PLA : LDA.b #$16 ; smith
|
||||
JMP QueueFollowerSpriteGfx
|
||||
+ CMP.b #$09 : BNE +
|
||||
PLA : XBA : LDA.b #$87 ; locksmith body
|
||||
JSR QueueFollowerSpriteGfx
|
||||
PLA : XBA : LDA.b #$86 ; locksmith head
|
||||
JMP QueueFollowerSpriteGfx
|
||||
+ CMP.b #$0A : BNE +
|
||||
PLA : XBA : LDA.b #$13 ; kiki body
|
||||
JSR QueueFollowerSpriteGfx
|
||||
PLA : XBA : LDA.b #$12 ; kiki head
|
||||
JMP QueueFollowerSpriteGfx
|
||||
+ CMP.b #$0C : BNE +
|
||||
PLA : XBA : PLA : LDA.b #$14 ; purple chest
|
||||
JMP QueueFollowerSpriteGfx
|
||||
+ PLA : XBA : PLA : LDA.b #$15 ; super bomb
|
||||
JMP QueueFollowerSpriteGfx
|
||||
|
||||
; A = 2 bytes, dest/src
|
||||
QueueFollowerSpriteGfx:
|
||||
PHX : REP #$20
|
||||
PHA
|
||||
AND.w #$00FF : CMP.w #$00FF : BEQ +
|
||||
ASL #6 : EOR.w #$8000 : BRA .write_src
|
||||
+ LDA.w #$0020 ; blank tile
|
||||
.write_src
|
||||
LDX.w ItemStackPtr : STA.l ItemGFXStack,X
|
||||
PLA : XBA
|
||||
AND.w #$00FF : ASL #4 : EOR.w #$5000
|
||||
STA.l ItemTargetStack,X
|
||||
TXA : INC #2 : STA.w ItemStackPtr
|
||||
SEP #$20 : PLX
|
||||
RTS
|
||||
|
||||
; A = 2 byte VRAM position in OAM2 for head/body
|
||||
; Scrap06/07/08 = address to OAM group
|
||||
; Scrap09/0A = address to palette data
|
||||
SpriteDraw_Follower:
|
||||
PHB : LDY.b #$7E : PHY : PLB
|
||||
REP #$20
|
||||
PHA
|
||||
LDY.b #$0E
|
||||
- LDA.b [Scrap06], Y : STA.w SpriteDynamicOAM, Y
|
||||
DEY #2 : BPL -
|
||||
LDA.b Scrap09 : STA.b Scrap06
|
||||
PLA
|
||||
SEP #$20
|
||||
STA.w SpriteDynamicOAM+$0C : XBA : STA.w SpriteDynamicOAM+$04
|
||||
JSL DetermineFollower : PHA
|
||||
PHX
|
||||
TAX : DEX
|
||||
LDA.b Scrap06 : ORA.b Scrap07 : BEQ +
|
||||
TXY
|
||||
LDA.b [Scrap06], Y
|
||||
BRA .set_palette
|
||||
+
|
||||
LDA.l .palette_data, X
|
||||
.set_palette
|
||||
STA.w SpriteDynamicOAM+$05 : STA.w SpriteDynamicOAM+$0D
|
||||
PLX
|
||||
REP #$20
|
||||
LDA.w #$0002 : STA.b Scrap06
|
||||
LDA.w #SpriteDynamicOAM : STA.b Scrap08
|
||||
SEP #$20
|
||||
PLA : CMP.b #$07 : BCC + : CMP.b #$09 : BEQ + : CMP.b #$0A : BEQ +
|
||||
; only draw body
|
||||
PHA
|
||||
LDA.b #$01 : STA.b Scrap06
|
||||
LDA.b #SpriteDynamicOAM+8 : STA.b Scrap08
|
||||
PLA
|
||||
+
|
||||
; follower specific adjustments
|
||||
CMP.b #$04 : BNE +
|
||||
LDA.w SpriteDynamicOAM+$0A : SEC : SBC.b #8 : STA.w SpriteDynamicOAM+$02 ; old man coords
|
||||
+
|
||||
CMP.b #$0A : BNE +
|
||||
LDA.w SpriteDynamicOAM+$0A : SEC : SBC.b #6 : STA.w SpriteDynamicOAM+$02 ; kiki coords
|
||||
LDA.w SpriteTypeTable, X : CMP.b #$1A : BEQ ++ : CMP.b #$B4 : BCS ++ : BRA .draw
|
||||
++ LDA.w SpriteDynamicOAM+$05 : ORA.b #$40
|
||||
STA.w SpriteDynamicOAM+$05 : STA.w SpriteDynamicOAM+$0D ; kiki horiz flip
|
||||
+
|
||||
.draw
|
||||
JSL Sprite_DrawMultiple_player_deferred
|
||||
PLB
|
||||
RTL
|
||||
.palette_data
|
||||
; 01 04 06 07 08 09 0A 0C 0D
|
||||
db $00, $00, $00, $00, $00, $06, $00, $00, $06, $00, $00, $00, $00
|
||||
|
||||
|
||||
DetermineFollower:
|
||||
LDA.w SpriteAux, X : BEQ .skip_stored : RTL ; stored follower
|
||||
.skip_stored
|
||||
+ LDA.w $0E20,X : CMP.b #$1A : BNE +
|
||||
LDA.l Follower_Frog : BRA .finalize
|
||||
+ CMP.b #$39 : BNE +
|
||||
LDA.l Follower_Locksmith : BRA .finalize
|
||||
+ CMP.b #$AD : BNE +
|
||||
LDA.l Follower_OldMan : BRA .finalize
|
||||
+ CMP.b #$B6 : BNE +
|
||||
LDA.l Follower_Kiki : BRA .finalize
|
||||
+ CMP.b #$B7 : BNE +
|
||||
LDA.l Follower_Maiden : BRA .finalize
|
||||
+ CMP.b #$76 : BNE +
|
||||
LDA.l Follower_Zelda : BRA .finalize
|
||||
+ CMP.b #$B4 : BNE +
|
||||
LDA.l Follower_PurpleChest : BRA .finalize
|
||||
+ LDA.l Follower_SuperBomb
|
||||
.finalize
|
||||
PHA
|
||||
CMP.b #$07 : BNE +
|
||||
LDA.l CurrentWorld : BNE +
|
||||
PLA : LDA.b #$08 : RTL
|
||||
+
|
||||
PLA
|
||||
RTL
|
||||
|
||||
SetAndLoadFollower:
|
||||
LDA.l FollowerIndicator
|
||||
.skip_current
|
||||
PHA
|
||||
LDA.b #$00 : STA.l FollowerDropped
|
||||
JSL DetermineFollower : STA.l FollowerIndicator
|
||||
CMP.b #$01 : BNE +
|
||||
JSL DetermineFollower_skip_stored : CMP.b #$01 : BNE +
|
||||
LDA.b #$02 : STA.l StartingEntrance
|
||||
JSL SaveDeathCount
|
||||
PHX
|
||||
JSL Dungeon_SaveRoomQuadrantData
|
||||
PLX
|
||||
+ CMP.b #$09 : BNE +
|
||||
LDA.b #$40 : STA.w $02CD : STZ.w $02CE ; locksmith timed message
|
||||
+
|
||||
PHX
|
||||
JSL Tagalong_LoadGfx
|
||||
PLX
|
||||
PLA : BNE +
|
||||
JSL Follower_Initialize
|
||||
JML Sprite_BecomeFollower
|
||||
+
|
||||
RTL
|
||||
|
||||
StoreAndLoadFollower:
|
||||
LDA.l FollowerDropped : BNE .no_storage
|
||||
LDA.l FollowerIndicator : BEQ .no_storage
|
||||
PHA
|
||||
JSL SetAndLoadFollower_skip_current
|
||||
PLA : STA.w SpriteAux, X
|
||||
LDA.b #$13 : JSL Sound_SetSfx3PanLong
|
||||
LDA.b #$01 : STA.w SprRedrawFlag, X
|
||||
STZ.w SpriteActivity, X
|
||||
LDA.b #$90 : STA.w SpriteTimerE, X
|
||||
SEC : RTL
|
||||
.no_storage
|
||||
JSL SetAndLoadFollower_skip_current
|
||||
CLC : RTL
|
||||
|
||||
; return SEC if destination resolved
|
||||
DetermineFollowerSpawn_locksmith_check:
|
||||
; locksmith location needs to spawn if purple chest reward not acquired
|
||||
LDA.l FollowerIndicator : CMP.b #$0C : BEQ .always_spawn
|
||||
JSL DetermineFollower_skip_stored : CMP.l FollowerIndicator : BEQ .matched_following
|
||||
LDA.l NpcFlagsVanilla : AND.b #$10 : BEQ .always_spawn
|
||||
BRA DetermineFollowerSpawn
|
||||
.always_spawn
|
||||
CLC : RTL
|
||||
.matched_following
|
||||
SEC : RTL
|
||||
|
||||
DetermineFollowerSpawn_include_stored:
|
||||
JSL DetermineFollower
|
||||
BRA DetermineFollowerSpawn_byof
|
||||
DetermineFollowerSpawn:
|
||||
JSL DetermineFollower_skip_stored
|
||||
.byof
|
||||
CMP.l FollowerIndicator : BEQ .matched_following
|
||||
.skip_match_check
|
||||
PHA
|
||||
; despawn if pre-requisite not met
|
||||
LDA.w SpriteTypeTable, X : CMP.b #$B4 : BNE +
|
||||
LDA.l NpcFlagsVanilla : AND.b #$20 : EOR.b #$20 : CMP.b #$20
|
||||
BRA .prereq_check
|
||||
+ CMP.b #$B5 : BNE +
|
||||
LDA.l CrystalsField : AND.b #$05 : CMP.b #$05
|
||||
LDA.b #$FF : ADC.b #$00 : ROR ; flip carry flag
|
||||
.prereq_check
|
||||
PLA : BCC .check_resolved
|
||||
RTL
|
||||
+
|
||||
PLA
|
||||
.check_resolved
|
||||
CMP.b #$01 : BNE +
|
||||
LDA.l ProgressFlags : AND.b #$04 : CMP.b #$04 : RTL
|
||||
+ CMP.b #$04 : BNE +
|
||||
JML ItemCheck_OldMan
|
||||
+ CMP.b #$06 : BNE +
|
||||
LDA.l RoomDataWRAM[$AC].high : AND.b #$08 : CMP.b #$08 : BCS ++
|
||||
LDA.l EnemizerFlags_close_blind_door : CMP.b #$01
|
||||
++
|
||||
RTL
|
||||
+ CMP.b #$09 : BCS + ; if frog or smith
|
||||
LDA.l NpcFlagsVanilla : AND.b #$20 : CMP.b #$20 : RTL
|
||||
+ CMP.b #$0A : BNE +
|
||||
LDA.l OverworldEventDataWRAM+$5E : AND.b #$20 : CMP.b #$20 : RTL
|
||||
+ CMP.b #$0C : BNE +
|
||||
LDA.l NpcFlagsVanilla : AND.b #$10 : CMP.b #$10 : RTL
|
||||
+
|
||||
.always_spawn
|
||||
CLC : RTL ; big bomb and locksmith have no completion condition in code
|
||||
.matched_following
|
||||
SEC : RTL
|
||||
|
||||
Follower_CheckMessageCollision:
|
||||
PHA
|
||||
LDA.w SpriteTimerE, X : BNE .skip_collision_check
|
||||
PLA
|
||||
JML Sprite_ShowMessageFromPlayerContact ; what we wrote over
|
||||
.skip_collision_check
|
||||
PLA
|
||||
CLC : RTL
|
||||
|
||||
Follower_CheckTileCollision:
|
||||
LDA.w SpriteTimerE, X : BNE .skip_collision_check
|
||||
JML Sprite_CheckTileCollisionLong ; what we wrote over
|
||||
.skip_collision_check
|
||||
RTL
|
||||
|
||||
Follower_CheckCollision:
|
||||
LDA.w SpriteTimerE, X : BNE .skip_collision_check
|
||||
JML Sprite_CheckDamageToPlayerSameLayerLong ; what we wrote over
|
||||
.skip_collision_check
|
||||
CLC : RTL
|
||||
|
||||
SpritePrep_ZeldaFollower:
|
||||
LDA.b RoomIndex : CMP.b #$12 : BEQ .no_follower_shuffle_sanc
|
||||
LDA.l FollowerTravelAllowed : CMP.b #$02 : BNE .no_follower_shuffle
|
||||
JSL DetermineFollowerSpawn : BCC + : RTL : +
|
||||
LDA.b #$01 : STA.w SprRedrawFlag, X
|
||||
PLA : PLA : PEA.w $EC4B-1 ; return to spawn
|
||||
RTL
|
||||
.no_follower_shuffle
|
||||
LDA.l FollowerIndicator : CMP.b #$01
|
||||
RTL
|
||||
.no_follower_shuffle_sanc
|
||||
LDA.l FollowerIndicator : CMP.b #$02
|
||||
RTL
|
||||
|
||||
Zelda_WaitingInCell:
|
||||
JSL Follower_CheckCollision ; what we wrote over, kinda
|
||||
BCC .return
|
||||
PHP
|
||||
LDA.l FollowerTravelAllowed : CMP.b #$02 : BNE +
|
||||
INC.w SpriteActivity, X
|
||||
PLP
|
||||
PLA : PLA : PEA.w $ECF9-1 : RTL ; skip sprite movement
|
||||
+
|
||||
PLP
|
||||
.return
|
||||
RTL
|
||||
|
||||
Zelda_BecomeFollower:
|
||||
LDA.l FollowerTravelAllowed : CMP.b #$02 : BNE .vanilla
|
||||
PLA : PLA
|
||||
JSL StoreAndLoadFollower : BCC +
|
||||
PEA.w $ED68-1 : RTL ; jump to avoid sprite despawn
|
||||
+
|
||||
PEA.w $ED60-1 ; jump to despawn
|
||||
RTL
|
||||
|
||||
.vanilla
|
||||
LDA.b #$02 : STA.l StartingEntrance ; what we wrote over
|
||||
RTL
|
||||
|
||||
SpritePrep_BlindMaiden:
|
||||
LDA.l FollowerTravelAllowed : CMP.b #$02 : BNE .vanilla
|
||||
JSL DetermineFollowerSpawn : BCC +
|
||||
LDA.b #$01 : RTL
|
||||
+
|
||||
LDA.b #$01 : STA.w SprRedrawFlag, X
|
||||
INC.w SpriteAncillaInteract, X
|
||||
STZ.w FollowerNoDraw
|
||||
PLA : PLA : PEA.w $89C8-1 ; return to spawn
|
||||
RTL
|
||||
.vanilla
|
||||
LDA.l RoomDataWRAM[$AC].high : AND.b #$08 ; what we wrote over
|
||||
RTL
|
||||
|
||||
; Prevent followers from causing blind/maiden to despawn:
|
||||
; Door rando: let zelda despawn the maiden.
|
||||
BlindZeldaDespawnFix:
|
||||
LDA.l FollowerIndicator ; what we wrote over
|
||||
CMP.b #06 : BEQ +
|
||||
LDA.w SpritePosYLow,X : BEQ +
|
||||
LDA.b #$00 : RTL ; don't despawn follower if maiden isn't "present"
|
||||
+
|
||||
LDA.b #$01 : RTL
|
||||
|
||||
SpriteDraw_ZeldaMaiden:
|
||||
LDA.b RoomIndex : CMP.b #$12 : BEQ .vanilla
|
||||
LDA.l FollowerTravelAllowed : CMP.b #$02 : BNE .vanilla
|
||||
LDA.b #.oam_group>>16 : STA.b Scrap08
|
||||
LDA.w SpriteTypeTable, X : CMP.b #$76 : BNE +
|
||||
REP #$20
|
||||
LDA.w #.oam_group : STA.b Scrap06
|
||||
LDA.w #0000 : STA.b Scrap09
|
||||
LDA.l Follower_Zelda_vram
|
||||
BRA .transfer
|
||||
+
|
||||
REP #$20
|
||||
LDA.w #.oam_group : STA.b Scrap06
|
||||
LDA.w #.palette_data_maiden : STA.b Scrap09
|
||||
LDA.l Follower_Maiden_vram
|
||||
.transfer
|
||||
JML TransferAndDrawFollowerGfx
|
||||
.skip_draw
|
||||
RTL
|
||||
.vanilla:
|
||||
JML SpriteDraw_Maiden
|
||||
.oam_group:
|
||||
dw 1, -7 : db $20, $00, $00, $02
|
||||
dw 1, 3 : db $22, $00, $00, $02
|
||||
.palette_data_maiden
|
||||
; 01 04 06 07 08 09 0A 0C 0D
|
||||
db $02, $00, $00, $02, $00, $04, $02, $02, $04, $02, $00, $02, $02
|
||||
|
||||
BlindMaiden_BecomeFollower:
|
||||
LDA.l FollowerTravelAllowed : CMP.b #$02 : BNE .vanilla
|
||||
PLA : PLA
|
||||
JSL StoreAndLoadFollower : BCS .return
|
||||
STZ.w SpriteAITable, X
|
||||
.return
|
||||
PEA.w $E8EA-1 ; jump ahead on return
|
||||
RTL
|
||||
.vanilla
|
||||
STZ.w SpriteAITable, X : LDA.b #$06 ; what we wrote over
|
||||
RTL
|
||||
|
||||
SpritePrep_OldManFollower:
|
||||
LDA.l FollowerTravelAllowed : CMP.b #$02 : BNE .no_follower_shuffle
|
||||
PLA : PLA
|
||||
JSL DetermineFollowerSpawn : BCC +
|
||||
PEA.w $E928-1 ; return to despawn
|
||||
RTL
|
||||
+
|
||||
LDA.b #$01 : STA.w SprRedrawFlag, X
|
||||
PEA.w $E927-1 ; return to spawn
|
||||
RTL
|
||||
.no_follower_shuffle
|
||||
LDA.l FollowerIndicator : CMP.b #$04
|
||||
RTL
|
||||
|
||||
SpriteDraw_OldManFollower:
|
||||
LDA.l FollowerTravelAllowed : CMP.b #$02 : BNE .vanilla
|
||||
LDA.w SpriteJumpIndex, X : CMP.b #$01 : BEQ .vanilla
|
||||
LDA.b #.oam_group>>16 : STA.b Scrap08
|
||||
REP #$20
|
||||
LDA.w #.oam_group : STA.b Scrap06
|
||||
LDA.w #0000 : STA.b Scrap09
|
||||
PLA : PEA.w $FF45-1 ; skip vanilla draw
|
||||
LDA.l Follower_OldMan_vram
|
||||
JML TransferAndDrawFollowerGfx
|
||||
.vanilla
|
||||
LDA.b #$02 : STA.b Scrap06 ; what we wrote over
|
||||
RTL
|
||||
.oam_group
|
||||
dw 0, 0 : db $AC, $00, $00, $02
|
||||
dw 0, 8 : db $AE, $00, $00, $02
|
||||
|
||||
OldMan_BecomeFollower:
|
||||
LDA.l FollowerTravelAllowed : CMP.b #$02 : BCC .set_follower_and_despawn
|
||||
PLA : PLA
|
||||
JSL StoreAndLoadFollower : BCC +
|
||||
PEA.w $E9DF-1 : RTL ; jump to avoid sprite despawn
|
||||
+
|
||||
PEA.w $E9DC-1 ; jump to despawn
|
||||
RTL
|
||||
.set_follower_and_despawn
|
||||
JSL SetAndLoadFollower
|
||||
PLA : PLA : PEA.w $E9D6-1
|
||||
|
||||
SpritePrep_SmithyFrog:
|
||||
LDA.l FollowerTravelAllowed : CMP.b #$02 : BNE .no_follower_shuffle
|
||||
JSL DetermineFollowerSpawn : BCC +
|
||||
LDA.b #$01 ; return to despawn
|
||||
RTL
|
||||
+
|
||||
LDA.b #$01 : STA.w SprRedrawFlag, X
|
||||
DEC ; return to spawn
|
||||
RTL
|
||||
.no_follower_shuffle
|
||||
LDA.l FollowerIndicator : BNE + ; what we wrote over
|
||||
LDA.l NpcFlagsVanilla : AND.b #$20 ; what we wrote over
|
||||
+ RTL
|
||||
|
||||
SpriteDraw_FrogFollower:
|
||||
LDA.l FollowerTravelAllowed : CMP.b #$02 : BNE .vanilla
|
||||
LDA.b #.oam_group>>16 : STA.b Scrap08
|
||||
REP #$20
|
||||
LDA.w #.oam_group : STA.b Scrap06
|
||||
LDA.w #0000 : STA.b Scrap09
|
||||
PLA : PEA.w $DCD6-1
|
||||
LDA.l Follower_Frog_vram
|
||||
JML TransferAndDrawFollowerGfx
|
||||
.vanilla
|
||||
LDA.b #$01 : STA.b Scrap06 ; what we wrote over
|
||||
RTL
|
||||
.oam_group:
|
||||
dw 1, -8 : db $FF, $00, $00, $02
|
||||
dw 1, 0 : db $C8, $00, $00, $02
|
||||
|
||||
Frog_BecomeFollower:
|
||||
LDA.l FollowerTravelAllowed : CMP.b #$02 : BCC .set_follower_and_despawn
|
||||
PLA : PLA
|
||||
JSL StoreAndLoadFollower : BCC +
|
||||
PEA.w $B2C7-1 : RTL ; jump to avoid sprite despawn
|
||||
+
|
||||
PEA.w $B2C4-1 ; jump to despawn
|
||||
RTL
|
||||
.set_follower_and_despawn
|
||||
JSL SetAndLoadFollower
|
||||
PLA : PLA : PEA.w $B2C4-1 ; jump to despawn
|
||||
RTL
|
||||
|
||||
SpritePrep_PurpleChest:
|
||||
LDA.l FollowerTravelAllowed : CMP.b #$02 : BNE .vanilla
|
||||
JSL DetermineFollowerSpawn : BCC +
|
||||
LDA.b #$00 ; return to despawn
|
||||
RTL
|
||||
+
|
||||
PLA : PLA : PEA.w $8A69-1 ; return to spawn
|
||||
LDA.b #$01 : STA.w SprRedrawFlag, X
|
||||
RTL
|
||||
.vanilla
|
||||
LDA.l FollowerIndicator : CMP.b #$0C
|
||||
RTL
|
||||
|
||||
SpriteDraw_PurpleChest:
|
||||
LDA.l FollowerTravelAllowed : CMP.b #$02 : BNE .vanilla
|
||||
LDA.b #.oam_group>>16 : STA.b Scrap08
|
||||
REP #$20
|
||||
LDA.w #.oam_group : STA.b Scrap06
|
||||
LDA.w #0000 : STA.b Scrap09
|
||||
LDA.l Follower_PurpleChest_vram
|
||||
JML TransferAndDrawFollowerGfx
|
||||
.vanilla
|
||||
JML Sprite_PrepAndDrawSingleLargeLong ; what we wrote over
|
||||
.oam_group:
|
||||
dw 0, -8 : db $C8, $00, $00, $02
|
||||
dw 0, 0 : db $EE, $00, $00, $02
|
||||
|
||||
PurpleChest_FollowCheck:
|
||||
LDA.l FollowerTravelAllowed : CMP.b #$02 : BNE .vanilla
|
||||
LDA.b #$00
|
||||
RTL
|
||||
.vanilla
|
||||
LDA.l FollowerIndicator ; what we wrote over
|
||||
RTL
|
||||
|
||||
PurpleChest_BecomeFollower:
|
||||
LDA.l FollowerTravelAllowed : CMP.b #$02 : BNE .vanilla
|
||||
PLA : PLA
|
||||
JSL StoreAndLoadFollower : BCS .return
|
||||
STZ.w SpriteAITable, X
|
||||
.return
|
||||
PEA.w $E10A-1 ; jump ahead on return
|
||||
RTL
|
||||
.vanilla
|
||||
STZ.w SpriteAITable, X : LDA.b #$0C ; what we wrote over
|
||||
RTL
|
||||
|
||||
SpritePrep_SuperBomb:
|
||||
LDA.l FollowerTravelAllowed : CMP.b #$02 : BNE .vanilla
|
||||
JSL DetermineFollowerSpawn : BCC +
|
||||
LDA.b #$00 ; despawn on exit
|
||||
RTL
|
||||
+
|
||||
LDA.b #$05
|
||||
RTL
|
||||
.vanilla
|
||||
LDA.l CrystalsField ; what we wrote over
|
||||
RTL
|
||||
|
||||
SpriteDraw_SuperBomb:
|
||||
LDA.w SpriteJumpIndex, X : CMP.b #$02 : BNE .vanilla
|
||||
LDA.l FollowerTravelAllowed : CMP.b #$02 : BNE .vanilla
|
||||
LDA.b #.oam_group>>16 : STA.b Scrap08
|
||||
REP #$20
|
||||
LDA.w #.oam_group : STA.b Scrap06
|
||||
LDA.w #.palette_data : STA.b Scrap09
|
||||
PLA : PEA.w $E2E2-1 ; skip vanilla draw
|
||||
LDA.l Follower_SuperBomb_vram
|
||||
JML TransferAndDrawFollowerGfx
|
||||
.vanilla
|
||||
LDA.b #$01 : STA.b Scrap06 ; what we wrote over
|
||||
RTL
|
||||
.oam_group:
|
||||
dw 0, -8 : db $AE, $08, $00, $02
|
||||
dw 0, 0 : db $4E, $08, $00, $02
|
||||
.palette_data
|
||||
; 01 04 06 07 08 09 0A 0C 0D
|
||||
db $08, $00, $00, $08, $00, $06, $08, $08, $06, $08, $00, $08, $08
|
||||
|
||||
SuperBomb_FollowCheck:
|
||||
LDA.l FollowerTravelAllowed : CMP.b #$02 : BNE .vanilla
|
||||
LDA.w SpriteTimerE, X : BNE .skip_follow
|
||||
LDA.w SpriteAux, X : BEQ .vanilla
|
||||
PLA : PLA : PEA.w $E1F1-1 ; jump to skip cost, no double charge
|
||||
RTL
|
||||
.skip_follow
|
||||
PLA : PLA : PEA.w $E20C-1 ; jump to exit
|
||||
RTL
|
||||
.vanilla
|
||||
LDA.b #$64 : LDY.b #$00 ; what we wrote over
|
||||
RTL
|
||||
|
||||
SuperBomb_BecomeFollower:
|
||||
LDA.l FollowerTravelAllowed : CMP.b #$02 : BNE .vanilla
|
||||
PLA : PLA
|
||||
JSL StoreAndLoadFollower : BCC +
|
||||
PEA.w $E20C-1 : RTL ; jump to exit
|
||||
+
|
||||
PEA.w $E201-1 ; jump to despawn
|
||||
RTL
|
||||
.vanilla
|
||||
LDA.b #$0D : STA.l FollowerIndicator ; what we wrote over
|
||||
RTL
|
||||
|
||||
pushpc
|
||||
org $868A14
|
||||
NOP #3 ; fix bomb shop spawn for dwarfless big bomb
|
||||
LDA.b #$B5 : JSL Sprite_SpawnDynamically
|
||||
BMI SuperBomb_BecomeFollower_exit
|
||||
LDA.b #$01 : STA.w SprRedrawFlag, Y ; force redraw for super bomb gfx
|
||||
pullpc
|
||||
|
||||
SpritePrep_Kiki:
|
||||
LDA.l FollowerTravelAllowed : CMP.b #$02 : BNE .vanilla
|
||||
JSL DetermineFollowerSpawn : BCC +
|
||||
LDA.b #$20 : RTL ; despawn on exit
|
||||
+
|
||||
LDA.b #$00
|
||||
RTL
|
||||
.vanilla
|
||||
LDX.b OverworldIndex : LDA.l OverworldEventDataWRAM,X ; what we wrote over
|
||||
RTL
|
||||
|
||||
Kiki_OfferToFollow:
|
||||
PHA
|
||||
LDA.w SpriteTimerE, X : BNE .skip_collision_check
|
||||
PLA
|
||||
JML Sprite_ShowMessageUnconditional ; what we wrote over
|
||||
.skip_collision_check
|
||||
PLA
|
||||
CLC : RTL
|
||||
|
||||
Kiki_FollowCheck:
|
||||
JSL DetermineFollowerSpawn_include_stored : BCS .skip_follow
|
||||
LDA.w SpriteTimerE, X
|
||||
RTL
|
||||
.skip_follow
|
||||
LDA.b #$20
|
||||
RTL
|
||||
|
||||
Kiki_BecomeFollower:
|
||||
LDA.l FollowerTravelAllowed : CMP.b #$02 : BNE .no_follower_shuffle
|
||||
PLA : PLA : PEA.w $E4C2-1 ; jump to exit
|
||||
STZ.w FollowerNoDraw
|
||||
JML StoreAndLoadFollower
|
||||
.no_follower_shuffle
|
||||
LDA.b #$00 : STA.l FollowerDropped ; defuse bomb
|
||||
LDA.b #$0A : STA.l FollowerIndicator
|
||||
RTL
|
||||
|
||||
Kiki_FixTeleportOnExit:
|
||||
REP #$30
|
||||
LDA.b LinkPosX : STA.w LinkPosXCache
|
||||
LDA.b LinkPosY : STA.w LinkPosYCache
|
||||
SEP #$30
|
||||
LDA.b #$19 : LDY.b #$01 ; what we wrote over
|
||||
RTL
|
||||
|
||||
; on return it checks BEQ and if non-zero, kiki get spook
|
||||
Kiki_DontScareTheMonke:
|
||||
LDA.b LinkJumping : BEQ .return
|
||||
CMP.b #$02 : BEQ .no_spook ; needed for quake usage
|
||||
LDA.w NoDamage : BNE .no_spook
|
||||
LDA.w LinkThud : BNE .no_spook
|
||||
.spook
|
||||
LDA.b #$01 : RTL
|
||||
.no_spook
|
||||
LDA.b #$00
|
||||
.return
|
||||
RTL
|
||||
|
||||
SpritePrep_Locksmith:
|
||||
LDA.l FollowerTravelAllowed : CMP.b #$02 : BNE .vanilla
|
||||
JSL DetermineFollowerSpawn_locksmith_check : BCS +
|
||||
LDA.b #$01 : STA.w SprRedrawFlag, X
|
||||
+
|
||||
LDA.l FollowerIndicator
|
||||
RTL
|
||||
.vanilla
|
||||
LDA.l FollowerIndicator : CMP.b #$09 ; what we wrote over
|
||||
BEQ +
|
||||
CLC : RTL
|
||||
+
|
||||
SEC : RTL
|
||||
|
||||
SpriteDraw_LocksmithFollower:
|
||||
LDA.l FollowerTravelAllowed : CMP.b #$02 : BNE .vanilla
|
||||
LDA.b #.oam_group>>16 : STA.b Scrap08
|
||||
REP #$20
|
||||
LDA.w #.oam_group : STA.b Scrap06
|
||||
LDA.w #.palette_data : STA.b Scrap09
|
||||
PLA : PEA.w $DCD6-1 ; skip draw on exit
|
||||
LDA.l Follower_Locksmith_vram
|
||||
JML TransferAndDrawFollowerGfx
|
||||
.vanilla
|
||||
LDA.b #$02 : STA.b Scrap06 ; what we wrote over
|
||||
RTL
|
||||
.oam_group:
|
||||
dw 0, -8 : db $EA, $00, $00, $02
|
||||
dw 0, 0 : db $EC, $00, $00, $02
|
||||
.palette_data
|
||||
; 01 04 06 07 08 09 0A 0C 0D
|
||||
db $00, $00, $00, $0E, $00, $00, $0E, $0E, $00, $0E, $00, $0E, $0E
|
||||
|
||||
Locksmith_Chillin_PostMessage:
|
||||
LDA.w SpriteAux, X : BEQ +
|
||||
; when a follower is stored, merely walk near them
|
||||
LDA.w SpritePosXLow, X : PHA
|
||||
JSL Follower_CheckCollision : BCC .return
|
||||
BRA .continue
|
||||
+
|
||||
LDA.w SpritePosXLow, X : PHA
|
||||
SEC : SBC.b #$10 : STA.w SpritePosXLow, X
|
||||
LDA.b #$01 : STA.w SpriteVelocityX, X
|
||||
JSL Sprite_Get16BitCoords_long
|
||||
JSL Follower_CheckTileCollision : BNE .return
|
||||
.continue
|
||||
INC.w SpriteActivity, X ; award follower
|
||||
LDA.l FollowerIndicator : CMP.b #$0C : BEQ .purple_chest_prize
|
||||
LDA.l FollowerTravelAllowed : CMP.b #$02 : BEQ .return
|
||||
LDA.l FollowerIndicator : CMP.b #$00 : BEQ .return
|
||||
LDA.b #$05 : STA.w SpriteActivity, X ; forever do nothing
|
||||
BRA .return
|
||||
.purple_chest_prize
|
||||
INC.w SpriteActivity, X ; prep for purple chest prize
|
||||
.return
|
||||
PLA : STA.w SpritePosXLow, X
|
||||
JML $86BD08 ; jump back to immediately RTS
|
||||
|
||||
Locksmith_BecomeFollower:
|
||||
LDA.l FollowerTravelAllowed : CMP.b #$02 : BNE .vanilla
|
||||
STZ.w FollowerNoDraw
|
||||
PLA : PLA
|
||||
JSL StoreAndLoadFollower : BCS +
|
||||
LDA.l FollowerIndicator : CMP.b #$0C : BEQ +
|
||||
PEA.w $BD24-1 : RTL ; jump to despawn
|
||||
+
|
||||
PEA.w $BD27-1 ; jump to exit
|
||||
RTL
|
||||
.vanilla
|
||||
LDA.b #$09 : STA.l FollowerIndicator
|
||||
RTL
|
||||
|
||||
Locksmith_RespondToAnswer_PostItem:
|
||||
STA.l FollowerIndicator ; what we wrote over
|
||||
LDA.l FollowerTravelAllowed : CMP.b #$02 : BNE .no_despawn
|
||||
LDA.w SpriteAux, X : CMP.b #$0C : BEQ .despawn
|
||||
CMP.b #$00 : BNE .no_despawn
|
||||
LDA.l Follower_Locksmith : CMP.b #$0C : BEQ .despawn
|
||||
JSL DetermineFollowerSpawn_include_stored : BCC .no_despawn
|
||||
.despawn
|
||||
STZ.w SpriteAITable, X
|
||||
.no_despawn
|
||||
RTL
|
||||
@@ -48,7 +48,7 @@ JML NMIHookReturn
|
||||
;--------------------------------------------------------------------------------
|
||||
PostNMIHookAction:
|
||||
LDA.w NMIAux : BEQ +
|
||||
PHK : PEA .return-1 ; push stack for RTL return
|
||||
PHK : PEA.w .return-1 ; push stack for RTL return
|
||||
JMP.w [NMIAux]
|
||||
.return
|
||||
STZ.w NMIAux ; zero bank byte of NMI hook pointer
|
||||
|
||||
29
gloom.asm
Normal file
29
gloom.asm
Normal file
@@ -0,0 +1,29 @@
|
||||
AdjustDefaultGraphics:
|
||||
JSL $80E310
|
||||
|
||||
LDA.l ChallengeModes : AND.b #$03 : CMP.b #$02 : BEQ .gloom
|
||||
RTL
|
||||
|
||||
.gloom
|
||||
LDA.b #$80
|
||||
STA.w $2115
|
||||
|
||||
REP #$20
|
||||
LDA.w #$7500
|
||||
STA.w $2116
|
||||
|
||||
LDY.b #SkullGfx_end-SkullGfx
|
||||
LDX.b #$00
|
||||
|
||||
- LDA.l SkullGfx, X
|
||||
STA.w $2118
|
||||
INX #2
|
||||
DEY #2
|
||||
BNE -
|
||||
|
||||
SEP #$20
|
||||
RTL
|
||||
|
||||
SkullGfx:
|
||||
incbin "data/skull.bin"
|
||||
.end
|
||||
453
goalitem.asm
453
goalitem.asm
@@ -1,6 +1,6 @@
|
||||
GoalItemGanonCheck:
|
||||
LDA.w SpriteTypeTable, X : CMP.b #$D6 : BNE .success ; skip if not ganon
|
||||
JSL CheckGanonVulnerability
|
||||
LDA.b #$01 : JSL CheckConditionPass
|
||||
BCS .success
|
||||
|
||||
.fail
|
||||
@@ -11,104 +11,193 @@ RTL
|
||||
LDA.b OAMOffsetY : CMP.b #$80 ; thing we wrote over
|
||||
RTL
|
||||
;--------------------------------------------------------------------------------
|
||||
;Carry clear = ganon invincible
|
||||
;Carry set = ganon vulnerable
|
||||
CheckGanonVulnerability:
|
||||
PHX
|
||||
LDA.l GanonVulnerableMode
|
||||
ASL
|
||||
TAX
|
||||
; Input A = Type of condition check
|
||||
; Carry clear = failed check
|
||||
; Carry set = successful check
|
||||
CheckConditionPass:
|
||||
PHX : PHY
|
||||
PHB
|
||||
LDY.b #GoalConditionTable>>16 : PHY : PLB : STY.b Scrap02
|
||||
REP #$20
|
||||
ASL : TAY
|
||||
LDA.w GoalConditionTable, Y : STA.b Scrap00
|
||||
PHK : PLB
|
||||
SEP #$20
|
||||
LDY.b #$00
|
||||
- LDA.b [Scrap00], Y : CMP.b #$FF : BEQ .exit
|
||||
INY : ROL : TAX
|
||||
JSR (.conditions, X) : BCC .exit : BRA -
|
||||
|
||||
; Carry
|
||||
; 0 - invulnerable
|
||||
; 1 - vulnerable
|
||||
JSR (.goals, X)
|
||||
.exit
|
||||
PLB : PLY : PLX
|
||||
RTL
|
||||
|
||||
PLX
|
||||
RTL
|
||||
|
||||
|
||||
.goals
|
||||
dw .vulnerable
|
||||
dw .invulnerable
|
||||
dw .all_dungeons
|
||||
dw .crystals_and_aga
|
||||
; Y = index after condition code
|
||||
; Carry = Set if using default target value
|
||||
.conditions
|
||||
dw .always_fail
|
||||
dw .pendants
|
||||
dw .crystals
|
||||
dw .pendant_bosses
|
||||
dw .crystal_bosses
|
||||
dw .bosses
|
||||
dw .agahnim_defeated
|
||||
dw .agahnim2_defeated
|
||||
dw .goal_item
|
||||
dw .light_speed
|
||||
dw .crystals_and_bosses
|
||||
dw .bosses_only
|
||||
dw .all_dungeons_no_agahnim
|
||||
dw .all_items
|
||||
dw .completionist
|
||||
dw .collection_rate
|
||||
dw .custom_goal
|
||||
dw .bingo
|
||||
dw .success
|
||||
dw .success
|
||||
dw .success
|
||||
dw .success
|
||||
|
||||
; 00 = always vulnerable
|
||||
.vulnerable
|
||||
.agahnim2_defeated
|
||||
LDA.l RoomDataWRAM[$0D].high : AND.b #$08 : BEQ .fail
|
||||
.bingo ; not implemented yet
|
||||
.success
|
||||
SEC
|
||||
RTS
|
||||
|
||||
; 01 = always invulnerable
|
||||
.invulnerable
|
||||
SEC : RTS
|
||||
.always_fail
|
||||
.fail
|
||||
CLC
|
||||
RTS
|
||||
|
||||
; 02 = All dungeons
|
||||
.all_dungeons
|
||||
LDA.l ProgressIndicator : CMP.b #$03 : BCC .fail ; require post-aga world state
|
||||
|
||||
; 09 = All dungeons except agahnim
|
||||
.all_dungeons_no_agahnim
|
||||
LDA.l PendantsField : AND.b #$07 : CMP.b #$07 : BNE .fail ; require all pendants
|
||||
LDA.l CrystalsField : AND.b #$7F : CMP.b #$7F : BNE .fail ; require all crystals
|
||||
LDA.l RoomDataWRAM[$0D].high : AND.b #$08 : BEQ .fail ; require aga2 defeated (pyramid hole open)
|
||||
BRA .success
|
||||
|
||||
; 03 = crystals and aga 2
|
||||
.crystals_and_aga
|
||||
LDA.l RoomDataWRAM[$0D].high : AND.b #$08 : BEQ .fail ; check aga2 first then bleed in
|
||||
|
||||
; 04 = crystals only
|
||||
CLC : RTS
|
||||
.pendants
|
||||
PHP
|
||||
LDA.l PendantCounter : PLP : BCC +
|
||||
CMP.b #$03 : RTS
|
||||
.crystals
|
||||
JSL CheckEnoughCrystalsForGanon
|
||||
RTS
|
||||
|
||||
; 05 = require goal item
|
||||
PHP
|
||||
LDA.l CrystalCounter : PLP : BCC +
|
||||
CMP.b #$07 : RTS
|
||||
.pendant_bosses
|
||||
PHP
|
||||
LDA.b #$02
|
||||
JSR CheckForBossesDefeated : PLP : BCC +
|
||||
CMP.b #$03 : RTS
|
||||
.crystal_bosses
|
||||
PHP
|
||||
LDA.b #$01
|
||||
JSR CheckForBossesDefeated : PLP : BCC +
|
||||
CMP.b #$07 : RTS
|
||||
.bosses
|
||||
PHP
|
||||
LDA.b #$00
|
||||
JSR CheckForBossesDefeated : PLP : BCC +
|
||||
CMP.b #$10 : RTS
|
||||
+ CMP.b [Scrap00], Y : INY : RTS
|
||||
.agahnim_defeated
|
||||
LDA.l ProgressIndicator : CMP.b #$03 : RTS
|
||||
.goal_item
|
||||
REP #$20
|
||||
LDA.l GoalCounter : CMP.l GoalItemRequirement
|
||||
SEP #$20
|
||||
REP #$20
|
||||
LDA.l GoalCounter : BCC +
|
||||
CMP.l GoalItemRequirement : BRA ++
|
||||
.collection_rate
|
||||
REP #$20
|
||||
LDA.l TotalItemCounter : BCC +
|
||||
CMP.l TotalItemCount : BRA ++
|
||||
+ CMP.b [Scrap00], Y : INY : INY : ++
|
||||
SEP #$20
|
||||
RTS
|
||||
.custom_goal
|
||||
LDA.b [Scrap00], Y : INY ; options
|
||||
PHA : AND.b #$07 : ASL : TAX : PLA
|
||||
;JMP CheckConditionPassCustom
|
||||
; flows into next function, do not insert code after without uncommenting above
|
||||
|
||||
; 06 = light speed
|
||||
.light_speed
|
||||
BRA .fail
|
||||
; --------------------------------------------------------------------------------
|
||||
; Input A = Options value, see GoalConditionTable for format
|
||||
; Input X = Condition check type index
|
||||
; Input Y = Index after Options byte
|
||||
CheckConditionPassCustom:
|
||||
PHX : PHA : BIT.b #$08 : PHP
|
||||
REP #$30
|
||||
LDA.b [Scrap00], Y : INY : INY ; address
|
||||
PLP : REP #$30 : BEQ .byte
|
||||
.word
|
||||
TAX
|
||||
SEP #$20
|
||||
PLA
|
||||
AND.b #$10
|
||||
REP #$20
|
||||
BNE +
|
||||
LDA.l $7E0000, X : BRA ++
|
||||
+
|
||||
LDA.l $7F0000, X : ++
|
||||
SEP #$10
|
||||
PLX
|
||||
REP #$10
|
||||
JSR (.comparisons, X)
|
||||
INY
|
||||
SEP #$30
|
||||
RTS
|
||||
.byte
|
||||
TAX
|
||||
SEP #$20
|
||||
PLA
|
||||
AND.b #$10 : BNE +
|
||||
LDA.l $7E0000, X : BRA ++
|
||||
+
|
||||
LDA.l $7F0000, X : ++
|
||||
SEP #$10
|
||||
PLX
|
||||
JMP (.comparisons, X)
|
||||
|
||||
; 07 = Crystals and bosses
|
||||
.crystals_and_bosses
|
||||
JSL CheckEnoughCrystalsForGanon ; check crystals first then bleed in to next
|
||||
BCC .fail
|
||||
|
||||
; 08 = Crystal bosses but no crystals
|
||||
.bosses_only
|
||||
JMP CheckForCrystalBossesDefeated
|
||||
|
||||
; 09 = 100% item collection rate
|
||||
.all_items
|
||||
REP #$20
|
||||
LDA.l TotalItemCounter : CMP.l TotalItemCount
|
||||
SEP #$20
|
||||
RTS
|
||||
|
||||
; 0A = 100% item collection rate and all dungeons
|
||||
.completionist
|
||||
REP #$20
|
||||
LDA.l TotalItemCounter : CMP.l TotalItemCount
|
||||
SEP #$20
|
||||
BCC .fail
|
||||
BRA .all_dungeons
|
||||
.comparisons
|
||||
dw .minimum
|
||||
dw .exact
|
||||
dw .bitfield_nonzero
|
||||
dw .bitfield_match
|
||||
dw .count_bits
|
||||
dw .fail
|
||||
dw .fail
|
||||
dw .fail
|
||||
|
||||
.pass
|
||||
INY : SEC : RTS
|
||||
.count_bits
|
||||
JSL CountBits
|
||||
.minimum
|
||||
CMP.b [Scrap00], Y : INY
|
||||
RTS
|
||||
.bitfield_match
|
||||
AND.b [Scrap00], Y
|
||||
.exact
|
||||
CMP.b [Scrap00], Y : BEQ .pass
|
||||
INY : CLC : RTS
|
||||
.bitfield_nonzero
|
||||
AND.b [Scrap00], Y : BNE .pass
|
||||
.fail
|
||||
INY : CLC : RTS
|
||||
;--------------------------------------------------------------------------------
|
||||
GTCutscene_TransferGfx:
|
||||
PHA
|
||||
REP #$20
|
||||
STZ.w DuckPose
|
||||
LDA.l GanonsTowerOpenGfx : BEQ .original_crystal
|
||||
PHX
|
||||
LDX.w ItemStackPtr : STA.l ItemGFXStack,X
|
||||
LDA.w #$81C0>>1 : STA.l ItemTargetStack,X
|
||||
INX #2 : STX.w ItemStackPtr
|
||||
PLX
|
||||
SEP #$20
|
||||
PLA
|
||||
RTL
|
||||
.original_crystal
|
||||
SEP #$20
|
||||
PLA
|
||||
JML TransferItemReceiptToBuffer_using_GraphicsID
|
||||
;--------------------------------------------------------------------------------
|
||||
AncillaDraw_GTCutsceneCrystal_OAMPrep:
|
||||
LDA.l GanonsTowerOpenGfx : ORA.l GanonsTowerOpenGfx+1 : BEQ .vanilla
|
||||
LDA.b #$0E : STA.b (OAMPtr),Y
|
||||
INY
|
||||
LDA.l GanonsTowerOpenPalette : AND.b #$67 : ASL : ORA.b #$30
|
||||
STA.b (OAMPtr),Y
|
||||
RTL
|
||||
.vanilla
|
||||
LDA.b #$24 : STA.b (OAMPtr),Y
|
||||
INY
|
||||
LDA.b #$3C : STA.b (OAMPtr),Y
|
||||
RTL
|
||||
;--------------------------------------------------------------------------------
|
||||
GTCutscene_CrystalMasks:
|
||||
db %00000000 ; 0 crystals
|
||||
@@ -171,48 +260,94 @@ GTCutscene_ActivateSparkle_SelectCrystal:
|
||||
PLY
|
||||
RTL
|
||||
;--------------------------------------------------------------------------------
|
||||
; prioritizes: number of gfx used > sum of targets > number of goals
|
||||
; Scrap00 stores number of goals
|
||||
; Y sums all goal target values
|
||||
GTCutscene_NumberOfCrystals:
|
||||
PHX : PHY : PHP
|
||||
REP #$20
|
||||
LDA.l GanonsTowerOpenAddress : CMP.w #CrystalCounter : BEQ +
|
||||
LDA.w #$0001 : BRA .done
|
||||
+ LDA.l GanonsTowerOpenTarget
|
||||
.done
|
||||
LDA.l GanonsTowerOpenGfx+2 : BEQ .not_multiple_gfx
|
||||
LDX.b #$04
|
||||
- LDA.l GanonsTowerOpenGfx, X : BEQ +
|
||||
INX : INX : CPX.b #$0E : BCC -
|
||||
+
|
||||
TXA : LSR
|
||||
JMP .done
|
||||
.not_multiple_gfx
|
||||
LDX.b #$00 : LDA.l GoalConditionTable, X
|
||||
TXY : STY.b Scrap00
|
||||
REP #$10
|
||||
SEP #$20
|
||||
TAX
|
||||
.next
|
||||
LDA.l $B00000, X : CMP.b #$FF : BNE + : JMP .use_y : +
|
||||
INC.b Scrap00
|
||||
ROL : PHP : CMP.b #$10 : BCS .not_8bit_compare
|
||||
CMP.b #$0C : BEQ .agas_goal
|
||||
CMP.b #$0E : BEQ .agas_goal
|
||||
; uses 8-bit targets
|
||||
PLP : BCC .use_8bit_target
|
||||
CMP.b #$04 : BEQ .crystal_goal ; crystal goal
|
||||
CMP.b #$08 : BEQ .crystal_goal ; crystal bosses goal
|
||||
CMP.b #$02 : BEQ .pendant_goal ; pendant goal
|
||||
CMP.b #$06 : BEQ .pendant_goal ; pendant bosses goal
|
||||
BRA .bosses_goal
|
||||
.crystal_goal
|
||||
LDA.b #$07 : INX : BRA .add_to_y
|
||||
.pendant_goal
|
||||
LDA.b #$03 : INX : BRA .add_to_y
|
||||
.bosses_goal
|
||||
INY : INX : BRA .next ; just increment Y by 1 since default of 10 is already more than max 7
|
||||
.agas_goal
|
||||
PLP : INX : BRA .next
|
||||
.use_8bit_target
|
||||
INX : LDA.l $B00000, X : INX
|
||||
.add_to_y
|
||||
PHY : CLC : ADC.b 1,S : PLY : TAY : BRA .next
|
||||
.not_8bit_compare
|
||||
CMP.b #$14 : BEQ .custom_goal : BCS .unknown
|
||||
; triforce hunt/collection rate - uses 16-bit targets
|
||||
PLP : INX : BCC +
|
||||
LDA.l $B00000, X : INX : INX : BRA .add_to_y
|
||||
+ INY : BRA .next
|
||||
.custom_goal
|
||||
PLP
|
||||
INX : LDA.l $B00000, X : BIT.b #$08 : PHP
|
||||
INX : INX : INX : AND.b #$03 : BEQ .use_custom_target
|
||||
; comparison method doesn't use a quantity, increment Y by 1
|
||||
INY : INX : PLP : BEQ +
|
||||
INX
|
||||
+
|
||||
BRA .next
|
||||
.use_custom_target
|
||||
PLP : BEQ ..8bit
|
||||
; 16-bit target
|
||||
REP #$20
|
||||
LDA.l $B00000, X : CMP.w #$0008 : SEP #$20 : INX : BRA +
|
||||
..8bit
|
||||
LDA.l $B00000, X : CMP.b #$08 : + : BCC +
|
||||
; target exceeds 7, just increment Y by 1
|
||||
INY : INX : JMP .next
|
||||
+
|
||||
INX : BRA .add_to_y
|
||||
.unknown ; unknown condition, exit with safe value
|
||||
PLP : INY
|
||||
.use_y
|
||||
TYA : BEQ + : CMP.b #$08 : BCC .done
|
||||
+ LDA.b Scrap00 : BEQ .use_one : CMP.b #$08 : BCC .done
|
||||
.use_one
|
||||
LDA.b #$01
|
||||
.done
|
||||
PLP : PLY : PLX
|
||||
RTS
|
||||
;--------------------------------------------------------------------------------
|
||||
CheckEnoughCrystalsForGanon:
|
||||
REP #$20
|
||||
LDA.l CrystalCounter
|
||||
CMP.l GanonVulnerableTarget
|
||||
SEP #$20
|
||||
RTL
|
||||
;--------------------------------------------------------------------------------
|
||||
CheckTowerOpen:
|
||||
LDA.l GanonsTowerOpenMode : ASL : TAX
|
||||
JSR (.tower_open_modes,X)
|
||||
RTL
|
||||
.tower_open_modes
|
||||
dw .vanilla
|
||||
dw .arbitrary_cmp
|
||||
|
||||
.vanilla
|
||||
LDA.l CrystalsField
|
||||
AND.b #$7F : CMP.b #$7F
|
||||
RTS
|
||||
|
||||
.arbitrary_cmp
|
||||
REP #$30
|
||||
LDA.l GanonsTowerOpenAddress : TAX
|
||||
LDA.l $7E0000,X
|
||||
CMP.l GanonsTowerOpenTarget
|
||||
SEP #$30
|
||||
RTS
|
||||
|
||||
LDA.b #$00 : JML CheckConditionPass
|
||||
;---------------------------------------------------------------------------------------------------
|
||||
CheckAgaForPed:
|
||||
REP #$20
|
||||
LDA.l GanonVulnerableMode
|
||||
CMP.w #$0006 : BNE .vanilla
|
||||
; seems light_speed option to force blue balls is unused for now
|
||||
BRA .vanilla
|
||||
|
||||
.light_speed
|
||||
SEP #$20
|
||||
@@ -233,73 +368,61 @@ CheckAgaForPed:
|
||||
RTL
|
||||
|
||||
;---------------------------------------------------------------------------------------------------
|
||||
CheckForCrystalBossesDefeated:
|
||||
CheckForBossesDefeated:
|
||||
PHB : PHX : PHY
|
||||
|
||||
LDA.b #CrystalPendantFlags_2>>16
|
||||
STA.b Scrap04 ; 0 = check all, 1 = check crystals, 2 = check pendants
|
||||
|
||||
LDA.b #CrystalPendantFlags_3>>16
|
||||
PHA : PLB
|
||||
|
||||
REP #$30
|
||||
STZ.b Scrap03 ; count of number of bosses killed
|
||||
STZ.b Scrap05
|
||||
|
||||
; count of number of bosses killed
|
||||
STZ.b Scrap00
|
||||
REP #$30
|
||||
|
||||
LDY.w #10
|
||||
|
||||
.next_check
|
||||
LDA.w CrystalPendantFlags_2+2,Y
|
||||
BIT.w #$0040
|
||||
BEQ ++
|
||||
LDA.w CrystalPendantFlags_3+2,Y : AND.w #$00FF : BEQ .skip
|
||||
CMP.w #$0008 ; C set = pendant, C clear = crystal
|
||||
LDA.b Scrap04 : BEQ .proceed
|
||||
PHP : ROR : BCC +
|
||||
PLP : BCS .skip : BRA .proceed
|
||||
+ PLP : BCC .skip
|
||||
|
||||
TYA
|
||||
ASL
|
||||
TAX
|
||||
.proceed
|
||||
TYA : ASL : TAX
|
||||
|
||||
LDA.l DrawHUDDungeonItems_boss_room_ids-4,X
|
||||
TAX
|
||||
LDA.l DungeonMapBossRooms+4,X
|
||||
ASL : TAX
|
||||
LDA.l RoomDataWRAM.l,X
|
||||
|
||||
AND.w #$0800
|
||||
BEQ ++
|
||||
AND.w #$0800 : BEQ .skip
|
||||
INC.b Scrap03
|
||||
|
||||
INC.b Scrap00
|
||||
|
||||
++ DEY
|
||||
BPL .next_check
|
||||
.skip
|
||||
DEY : BPL .next_check
|
||||
|
||||
SEP #$30
|
||||
PLY : PLX : PLB
|
||||
|
||||
LDA.b Scrap00 : CMP.l GanonVulnerableTarget
|
||||
|
||||
LDA.b Scrap03
|
||||
|
||||
RTS
|
||||
;---------------------------------------------------------------------------------------------------
|
||||
CheckPedestalPull:
|
||||
; Out: c - Successful ped pull if set, do nothing if unset.
|
||||
PHX
|
||||
LDA.l PedCheckMode : ASL : TAX
|
||||
JSR (.pedestal_modes,X)
|
||||
PLX
|
||||
LDA.b #$02 : JSL CheckConditionPass : BCS .return
|
||||
PHX : PHP
|
||||
LDA.b GameMode : CMP.b #$0E : BEQ +
|
||||
REP #$30
|
||||
LDX.w #$0004 : LDA.l GoalConditionTable, X : TAX
|
||||
LDA.l $B00000, X : CMP.w #$FF81 : BEQ +
|
||||
SEP #$30
|
||||
LDA.b #$97 : LDY.b #$01
|
||||
JSL Sprite_ShowMessageUnconditional
|
||||
+
|
||||
PLP : PLX
|
||||
.return
|
||||
RTL
|
||||
|
||||
.pedestal_modes
|
||||
dw .vanilla
|
||||
dw .arbitrary_cmp
|
||||
|
||||
.vanilla
|
||||
LDA.l PendantsField
|
||||
AND.b #$07 : CMP.b #$07 : BNE ..nopull
|
||||
SEC
|
||||
RTS
|
||||
..nopull
|
||||
CLC
|
||||
RTS
|
||||
|
||||
.arbitrary_cmp
|
||||
REP #$30
|
||||
LDA.l PedPullAddress : TAX
|
||||
LDA.l $7E0000,X
|
||||
CMP.l PedPullTarget
|
||||
SEP #$30
|
||||
RTS
|
||||
|
||||
@@ -4,19 +4,10 @@
|
||||
HeartPieceGet:
|
||||
PHX : PHY
|
||||
LDA.w SprItemMWPlayer, X : STA.l !MULTIWORLD_SPRITEITEM_PLAYER_ID
|
||||
LDY.w SprItemReceipt, X : BNE +
|
||||
LDA.w SprSourceItemId, X : BNE ++
|
||||
JSL LoadHeartPieceRoomValue
|
||||
STA.w SprSourceItemId, X
|
||||
++
|
||||
JSL AttemptItemSubstitution
|
||||
JSL ResolveLootIDLong
|
||||
STA.w SprItemReceipt, X
|
||||
TAY
|
||||
+
|
||||
LDY.w SprSourceItemId, X
|
||||
JSL MaybeMarkDigSpotCollected
|
||||
.skipLoad
|
||||
LDA.w SprItemMWPlayer, X : STA.l !MULTIWORLD_ITEM_PLAYER_ID
|
||||
LDA.w SprItemMWPlayer, X : STA.l !MULTIWORLD_ITEM_PLAYER_ID
|
||||
CPY.b #$26 : BNE .not_heart ; don't add a 1/4 heart if it's not a heart piece
|
||||
CMP.b #$00 : BNE .not_heart
|
||||
LDA.l HeartPieceQuarter : INC A : AND.b #$03 : STA.l HeartPieceQuarter
|
||||
@@ -32,16 +23,7 @@ RTL
|
||||
HeartContainerGet:
|
||||
PHX : PHY
|
||||
JSL IncrementBossSword
|
||||
LDY.w SprItemReceipt, X : BNE +
|
||||
LDA.w SprSourceItemId, X : BNE ++
|
||||
JSL LoadHeartContainerRoomValue
|
||||
STA.w SprSourceItemId, X
|
||||
++
|
||||
JSL AttemptItemSubstitution
|
||||
JSL ResolveLootIDLong
|
||||
STA.w SprItemReceipt, X
|
||||
TAY
|
||||
+
|
||||
LDY.w SprSourceItemId, X
|
||||
BRA HeartPieceGet_skipLoad
|
||||
;--------------------------------------------------------------------------------
|
||||
DrawHeartPieceGFX:
|
||||
@@ -260,6 +242,12 @@ LoadOutdoorValue:
|
||||
PHP
|
||||
REP #$20 ; set 16-bit accumulator
|
||||
LDA.b OverworldIndex
|
||||
; Rain state fix: In rain state DW, use LW screen ID for item lookup
|
||||
BIT.w #$0040 : BEQ +
|
||||
LDA.l ProgressIndicator : AND.w #$00FF : CMP.w #$0002
|
||||
LDA.b OverworldIndex : BCS ++ : AND.w #$00BF
|
||||
++
|
||||
+
|
||||
CMP.w #$00 : BNE +
|
||||
LDA.l OWBonkPrizeTable[$00].loot
|
||||
JMP .done
|
||||
|
||||
159
hooks.asm
159
hooks.asm
@@ -407,6 +407,16 @@ STA.l StalfosBombDamage
|
||||
org $8AB76E ; <- 5376E - Bank0A.asm : 30 (JSL OverworldMap_InitGfx)
|
||||
JSL OnLoadDuckMap
|
||||
|
||||
;================================================================================
|
||||
; Fix Clobbered Gfx
|
||||
;--------------------------------------------------------------------------------
|
||||
org $80DB92
|
||||
JSL PostFixMirrorGfxPrep
|
||||
org $80D911
|
||||
JML PostFixMirrorGfx
|
||||
org $80E259
|
||||
JSL PostFixOAMGfx : NOP
|
||||
|
||||
;================================================================================
|
||||
; Infinite Bombs / Arrows / Magic
|
||||
;--------------------------------------------------------------------------------
|
||||
@@ -530,6 +540,8 @@ JML GTCutscene_ConditionalAnimateCrystals
|
||||
org $88CE93
|
||||
GTCutscene_DrawSingleCrystal:
|
||||
JML GTCutscene_ConditionalDrawSingleCrystal
|
||||
org $88CED1
|
||||
JSL AncillaDraw_GTCutsceneCrystal_OAMPrep : BRA + : NOP #3 : +
|
||||
;--------------------------------------------------------------------------------
|
||||
org $88CF19 ; <- 44F19 - ancilla_break_tower_seal.asm : 336 (TXA : AND.b #$07 : TAX)
|
||||
JSL GTCutscene_ActivateSparkle_SelectCrystal
|
||||
@@ -555,12 +567,6 @@ JSL AgahnimAsksAboutPed
|
||||
org $9ED6E8
|
||||
JSL CheckAgaForPed : NOP
|
||||
|
||||
;================================================================================
|
||||
; Zelda Sprite Fixes
|
||||
;--------------------------------------------------------------------------------
|
||||
org $85EBCF ; <- 2EBCF - sprite_zelda.asm : 23 (LDA $7EF359 : CMP.b #$02 : BCS .hasMasterSword)
|
||||
JSL SpawnZelda : NOP #2
|
||||
|
||||
;================================================================================
|
||||
; Alternate Goal
|
||||
;--------------------------------------------------------------------------------
|
||||
@@ -688,12 +694,6 @@ db $06, $1F, $40, $12, $01, $3F, $14, $01, $3F, $13, $1F, $42, $1A, $1F, $4B, $1
|
||||
org $85DFB1 ; <- 2DFB1 - Bank05.asm : 2499
|
||||
JSL SkipDrawEOR
|
||||
|
||||
;================================================================================
|
||||
; Kiki Big Bomb Fix
|
||||
;--------------------------------------------------------------------------------
|
||||
org $9EE4AF ; <- f64af sprite_kiki.asm : 285 (LDA.b #$0A : STA $7EF3CC)
|
||||
JSL AssignKiki : NOP #2
|
||||
|
||||
;================================================================================
|
||||
; Wallmaster camera fix
|
||||
;--------------------------------------------------------------------------------
|
||||
@@ -845,11 +845,6 @@ org $81E97E
|
||||
dw $0116 : db $08
|
||||
dw $0116 : db $25
|
||||
;--------------------------------------------------------------------------------
|
||||
org $9EE16E ; <- F616E - sprite_bomb_shop_entity.asm : 73
|
||||
NOP #8 ; fix bomb shop dialog for dwarfless big bomb
|
||||
org $868A14 ; <- 30A14 - sprite_prep.asm : 716
|
||||
NOP #8 ; fix bomb shop spawn for dwarfless big bomb
|
||||
;--------------------------------------------------------------------------------
|
||||
org $86B489 ; <- 33489 - sprite_smithy_bros.asm : 473 (LDA $7EF359 : CMP.b #$03 : BCS .tempered_sword_or_better)
|
||||
JML GetSmithSword : NOP #4
|
||||
Smithy_DoesntHaveSword:
|
||||
@@ -1819,7 +1814,9 @@ Sprite_ShowMessageUnconditional_Rest:
|
||||
;--------------------------------------------------------------------------------
|
||||
;-- Music restarting at zelda fix
|
||||
org $85ED10 ; <- 2ED10 - sprite_zelda.asm : 233 - (LDA.b #$19 : STA $012C)
|
||||
NOP #5
|
||||
BRA + : NOP #3 : +
|
||||
org $85ED63
|
||||
BRA + : NOP #3 : +
|
||||
;--------------------------------------------------------------------------------
|
||||
org $9ECE47 ; <- F4E47 - sprite_crystal_maiden.asm : 220
|
||||
JML MaidenCrystalScript
|
||||
@@ -1881,11 +1878,14 @@ JSL CalculateSignIndex
|
||||
; Dark World Spawn Location Fix & Follower Fixes
|
||||
;--------------------------------------------------------------------------------
|
||||
org $80894A ; <- 94A
|
||||
PHB : JSL DarkWorldSaveFix
|
||||
PHB : JSL OnSave
|
||||
;--------------------------------------------------------------------------------
|
||||
org $828046 ; <- 10046 - Bank02.asm : 217 (JSL EnableForceBlank) (Start of Module_LoadFile)
|
||||
JSL OnFileLoad
|
||||
;--------------------------------------------------------------------------------
|
||||
org $89F5DF
|
||||
JSL OnDeathNoSave
|
||||
;--------------------------------------------------------------------------------
|
||||
org $8280A2
|
||||
JSL GetCurrentWorldForLoad
|
||||
;--------------------------------------------------------------------------------
|
||||
@@ -2241,8 +2241,6 @@ org $82A9B0 ; (BCS $A9B7)
|
||||
NOP #2
|
||||
org $82C1C8 ; (BCS $C1CC)
|
||||
NOP #2
|
||||
org $82ADA0 ; (LDA.b #$F1 : STA $012C)
|
||||
JSL Overworld_MosaicDarkWorldChecks : NOP
|
||||
;--------------------------------------------------------------------------------
|
||||
org $85CC58 ; <- Bank05.asm:1307 (LDA $040A : CMP.b #$18)
|
||||
JSL PsychoSolder_MusicCheck : NOP #1
|
||||
@@ -2268,8 +2266,9 @@ JSL Overworld_DetermineMusic
|
||||
BRA + : NOP #42 : +
|
||||
;--------------------------------------------------------------------------------
|
||||
org $82B0C4
|
||||
LDA.b OverworldIndex : CMP.b #$80 : BCS +
|
||||
JSL Overworld_DetermineAndSetMusic
|
||||
BRA + : NOP #16 : +
|
||||
BRA + : NOP #10 : +
|
||||
;--------------------------------------------------------------------------------
|
||||
org $82B1C1
|
||||
JSL Overworld_DetermineAmbientSFX
|
||||
@@ -2287,8 +2286,18 @@ BRA + : NOP #12 : +
|
||||
org $88C442
|
||||
JSL Overworld_DetermineAndSetMusic : NOP
|
||||
;--------------------------------------------------------------------------------
|
||||
org $9BD1CD
|
||||
JSL Overworld_DetermineAndSetMusic : NOP
|
||||
;--------------------------------------------------------------------------------
|
||||
org $9DFD27
|
||||
JSL Overworld_DetermineAndSetMusic : NOP
|
||||
;--------------------------------------------------------------------------------
|
||||
org $829253
|
||||
JSL FixHalfVolumeOnSpawnExitToOverworld : NOP
|
||||
;--------------------------------------------------------------------------------
|
||||
org $8292D9
|
||||
BRA + : NOP #4 : +
|
||||
JSL FixPreAgaMusicFadeOut : db $B0 ; BCS
|
||||
;================================================================================
|
||||
|
||||
;================================================================================
|
||||
@@ -2347,24 +2356,6 @@ org $82A451 ; <- 12451 - Bank02.asm:6283 (LDA $F6 : AND.b #$40 : BEQ .xButtonNot
|
||||
JSL QuickSwap
|
||||
;================================================================================
|
||||
|
||||
;================================================================================
|
||||
; Tagalong Fixes
|
||||
;--------------------------------------------------------------------------------
|
||||
org $8689AB ; <- 309AB - sprite_prep.asm: 647 (LDA $7EF3CC : CMP.b #$06 : BEQ .killSprite)
|
||||
; Note: In JP 1.0 we have: (CMP.b #$00 : BNE .killSprite) appling US bugfix
|
||||
; Prevent followers from causing blind/maiden to despawn:
|
||||
; Door rando: let zelda despawn the maiden.
|
||||
JSL BlindZeldaDespawnFix
|
||||
|
||||
org $8689AF
|
||||
SpritePrep_BlindMaiden_despawn_follower: ; this is the normal execution path
|
||||
|
||||
org $8689C9
|
||||
SpritePrep_BlindMaiden_kill_the_girl: ; not the follower
|
||||
;--------------------------------------------------------------------------------
|
||||
; Fix old man purple chest issues using the same method as above
|
||||
org $9EE906 ; <- F6906 - sprite_old_mountain_man.asm : 31 (LDA $7EF3CC : CMP.b #$00 : BNE .already_have_tagalong)
|
||||
CMP.b #$04 : db $F0 ; BEQ
|
||||
;--------------------------------------------------------------------------------
|
||||
;Control which doors frog/smith can enter
|
||||
org $9BBCF0 ; <- DBCF0 - Bank1B.asm: 248 (LDA $04B8 : BNE BRANCH_MU)
|
||||
@@ -2676,7 +2667,7 @@ org $898AEE : JSL TransferItemReceiptToBuffer_using_GraphicsID
|
||||
org $898C85 : JSL TransferItemReceiptToBuffer_using_GraphicsID
|
||||
|
||||
; gt cutscene
|
||||
org $899BBE : JSL TransferItemReceiptToBuffer_using_GraphicsID
|
||||
org $899BBE : JSL GTCutscene_TransferGfx
|
||||
|
||||
;===================================================================================================
|
||||
; gratuitous NOPs removed for speed
|
||||
@@ -2738,12 +2729,92 @@ NOP #2 ; this fixes Link's direction after mirroring and falling after entering
|
||||
;--------------------------------------------------------------------------------
|
||||
; Enable new room header table
|
||||
;--------------------------------------------------------------------------------
|
||||
org $81B5E6
|
||||
LDA.b #$30
|
||||
if not(!FEATURE_FIX_BASEROM)
|
||||
org $81B5E6
|
||||
LDA.b #$30
|
||||
endif
|
||||
|
||||
;===================================================================================================
|
||||
;================================================================================
|
||||
;--------------------------------------------------------------------------------
|
||||
; Mimic dash changes
|
||||
;--------------------------------------------------------------------------------
|
||||
org $9EC7BE
|
||||
JSL MimicDirection
|
||||
|
||||
;================================================================================
|
||||
;--------------------------------------------------------------------------------
|
||||
; Gloom VRAM overwrite
|
||||
;--------------------------------------------------------------------------------
|
||||
org $828068
|
||||
JSL AdjustDefaultGraphics
|
||||
|
||||
;================================================================================
|
||||
; Special Weapons Modes
|
||||
;--------------------------------------------------------------------------------
|
||||
org $86ECC3 ; Bank06.asm@4704 (PHX : TAX : LDA.l .damage_classes, X : PLX)
|
||||
JSL DamageClassCalc
|
||||
BRA + : NOP #29 : +
|
||||
;--------------------------------------------------------------------------------
|
||||
org $86ED94 ; Bank06.asm@4866 (LDA $0E60, X : AND.b #$40)
|
||||
JSL Utility_CheckImpervious
|
||||
NOP
|
||||
;--------------------------------------------------------------------------------
|
||||
|
||||
;================================================================================
|
||||
;--------------------------------------------------------------------------------
|
||||
; Variable Ganon Vulnerability
|
||||
;--------------------------------------------------------------------------------
|
||||
org $88BBD4 ; ancilla_magic_powder.asm@253 (LDA #$0A : JSL Ancilla_CheckSpriteDamage.preset_class)
|
||||
JSL Ganon_CheckPowderVulnerability
|
||||
NOP #2
|
||||
|
||||
org $1D8F4E ; sprite_ganon.asm@325 (LDA $04C5 : CMP #$02)
|
||||
JSL Ganon_CheckInvincible
|
||||
NOP
|
||||
|
||||
org $0DD628 ; Bank0D.asm@1266 (LDA $0B6B, Y : AND #$02)
|
||||
JSL CheckBeeBoss
|
||||
NOP
|
||||
|
||||
org $0DD677 ; Bank0D.asm@1303 (JSL Ancilla_CheckSpriteDamage.preset_class)
|
||||
JSL Ganon_CheckBeeVulnerability
|
||||
;--------------------------------------------------------------------------------
|
||||
|
||||
;================================================================================
|
||||
; PseudoFlute
|
||||
;--------------------------------------------------------------------------------
|
||||
org $8AB7D5 ; bank_0A.asm@5655 (DEC.w $1AF0 : LDA.b #$20 : STA.w $012F)
|
||||
JSL SelectFlutePrev
|
||||
BRA + : NOP #2 : +
|
||||
;--------------------------------------------------------------------------------
|
||||
org $8AB7E3 ; bank_0A.asm@5665 (INC.w $1AF0 : LDA.b #$20 : STA.w $012F)
|
||||
JSL SelectFluteNext
|
||||
BRA + : NOP #2 : +
|
||||
;--------------------------------------------------------------------------------
|
||||
org $8AB877 ; bank_0A.asm@5758 (STA.b $0C : LDA.b #$00 : STA.b $0B)
|
||||
JSL SetFluteSpotPalette
|
||||
NOP #2
|
||||
;--------------------------------------------------------------------------------
|
||||
org $8AB8BF ; bank_0A.asm@5800 (STA.b $0C : LDA.b #$00 : STA.b $0B)
|
||||
JSL SetFluteSpotPalette
|
||||
NOP #2
|
||||
;--------------------------------------------------------------------------------
|
||||
org $82AFBE ; bank_02.asm@8776 (LDA.l $7EC213 : STA.b $8A)
|
||||
JSL CheckEnterOverworld
|
||||
NOP #2
|
||||
;--------------------------------------------------------------------------------
|
||||
org $82A9A1 ; bank_02.asm@7655 (STA.b $8A : STA.w $040A)
|
||||
JSL CheckTransitionOverworld
|
||||
NOP
|
||||
;--------------------------------------------------------------------------------
|
||||
org $8DF741
|
||||
dw $3CD4, $3CD5, $3CE4, $3CE5
|
||||
;--------------------------------------------------------------------------------
|
||||
org $8DE58E ; bank_0D.asm@15401 (AND.w #$00FF : STA.b $02)
|
||||
JSL DrawFluteIcon
|
||||
NOP
|
||||
;--------------------------------------------------------------------------------
|
||||
org $8DFB63 ; bank_0D.asm@18092 (LDA.l $7EF33F, X : AND.w #$00FF)
|
||||
JSL CheckFluteInHUD
|
||||
NOP #3
|
||||
;--------------------------------------------------------------------------------
|
||||
|
||||
@@ -114,7 +114,10 @@ StartingGenericKeys: skip 1 ; PC 0x18338B
|
||||
InitInventoryTracking: skip 2 ; PC 0x18338C \ Need to set bits here for silver arrows,
|
||||
InitBowTracking: skip 2 ; PC 0x18338E / boomerangs, powder/mushroom, etc
|
||||
InitItemLimitCounts: skip 16 ; PC 0x183390
|
||||
skip 37 ;
|
||||
skip 34 ;
|
||||
InitFluteBitfield: db $FF ;
|
||||
InitSpecialWeaponLevel: db $00 ;
|
||||
InitItemOnB: db $00 ;
|
||||
InitProgressIndicator: db $02 ; PC 0x1833C5 - Set to $80 for instant post-aga with standard
|
||||
InitProgressFlags: db $14 ; PC 0x1833C6 - Set to $00 for standard
|
||||
InitMapIcons: skip 1 ; PC 0x1833C7
|
||||
@@ -123,8 +126,8 @@ InitNpcFlagsVanilla: skip 1 ; PC 0x1833C9
|
||||
InitCurrentWorld: skip 1 ; PC 0x1833CA
|
||||
skip 1 ; PC 0x1833CB
|
||||
InitFollowerIndicator: skip 1 ; PC 0x1833CC
|
||||
InitFollowerXCoord: skip 2 ; PC 0x1833CD
|
||||
InitFollowerYCoord: skip 2 ; PC 0x1833CF
|
||||
InitFollowerYCoord: skip 2 ; PC 0x1833CD
|
||||
InitFollowerXCoord: skip 2 ; PC 0x1833CF
|
||||
InitDroppedFollowerIndoors: skip 1 ; PC 0x1833D1
|
||||
InitDroppedFollowerLayer: skip 1 ; PC 0x1833D2
|
||||
InitFollowerDropped: skip 1 ; PC 0x1833D3
|
||||
|
||||
@@ -646,7 +646,7 @@ RTL
|
||||
; CollectPowder:
|
||||
;--------------------------------------------------------------------------------
|
||||
CollectPowder:
|
||||
LDY.w SprItemReceipt, X ; Retrieve stored item type
|
||||
LDY.w SprSourceItemId, X ; Retrieve stored item type
|
||||
BNE +
|
||||
; if for any reason the item value is 0 reload it, just in case
|
||||
%GetPossiblyEncryptedItem(WitchItem, SpriteItemValues) : TAY
|
||||
@@ -810,12 +810,9 @@ LDA.w AncillaGet, X : CMP.b #$4A : BNE +
|
||||
; collecting pre-activated flute
|
||||
LDA.b #$13 : JML Ancilla_SFX2_Near
|
||||
+ ; not pre-activated flute
|
||||
LDA.l !MULTIWORLD_RECEIVING_ITEM : BEQ .normal
|
||||
LDA.l MultiworldJunkItemTimer : BEQ .normal
|
||||
LDA.w AncillaGet, X
|
||||
JSL.l ItemIsJunk : BEQ .normal
|
||||
|
||||
.multijunk
|
||||
.junk
|
||||
LDA.b #$3B : JML Ancilla_SFX3_Near ; what we wrote over
|
||||
|
||||
.normal
|
||||
@@ -827,12 +824,9 @@ CPY.b #$4A : BNE +
|
||||
JSL Sound_SetSfxPanWithPlayerCoords : ORA.b #$13 : STA.w SFX2
|
||||
RTL
|
||||
+ ; normal itemget sfx
|
||||
LDA.l !MULTIWORLD_RECEIVING_ITEM : BEQ .normal
|
||||
LDA.l MultiworldJunkItemTimer : BEQ .normal
|
||||
TYA
|
||||
JSL.l ItemIsJunk : BEQ .normal
|
||||
|
||||
.multijunk
|
||||
.junk
|
||||
JSL Sound_SetSfxPanWithPlayerCoords : ORA.b #$3B : STA.w SFX3
|
||||
RTL
|
||||
|
||||
|
||||
@@ -243,7 +243,7 @@ endmacro
|
||||
%ReceiptProps($67, -4, 0, $FF, $F36A, $FF, skip, skip) ; 67 -
|
||||
%ReceiptProps($68, -4, 0, $FF, $F36A, $FF, skip, skip) ; 68 -
|
||||
%ReceiptProps($69, -4, 0, $FF, $F36A, $FF, skip, skip) ; 69 -
|
||||
%ReceiptProps($6A, -4, 0, $49, $F36A, $FF, triforce, skip) ; 6A - Triforce
|
||||
%ReceiptProps($6A, -4, 0, $4A, $F36A, $FF, triforce, skip) ; 6A - Triforce
|
||||
%ReceiptProps($6B, -4, 0, $50, $F36A, $FF, goal_item, skip) ; 6B - Power star
|
||||
%ReceiptProps($6C, -4, 0, $49, $F36A, $FF, goal_item, skip) ; 6C - Triforce Piece
|
||||
%ReceiptProps($6D, -4, 0, $FF, $F36A, $FF, request_F0, skip) ; 6D - Server request item
|
||||
@@ -1437,7 +1437,7 @@ StandingItemGraphicsOffsets:
|
||||
dw $0960 ; D0 - Bee trap
|
||||
dw $0 ; D1 - Apples
|
||||
dw $0 ; D2 - Fairy
|
||||
dw $11E0 ; D3 - Chicken
|
||||
dw BigDecompressionBuffer+$0140 ; D3 - Chicken
|
||||
dw $01E0 ; D4 - Big Magic
|
||||
dw $11E0 ; D5 - 5 Arrows
|
||||
dw $0 ; D6 - Good Bee
|
||||
|
||||
@@ -376,7 +376,7 @@ TransferCommonToVRAM:
|
||||
REP #$21
|
||||
SEP #$10
|
||||
|
||||
LDA.w #BigDecompressionBuffer+$2000
|
||||
LDA.w #BigDecompressionBuffer+$2400
|
||||
LDX.b #BigDecompressionBuffer>>16
|
||||
STA.w $4302
|
||||
STX.w $4304
|
||||
|
||||
@@ -1,4 +1,7 @@
|
||||
; hooks
|
||||
org $81DB19
|
||||
JSL MaybeSkipSmashTerrain : BCS $81DB11
|
||||
|
||||
org $81E6B0
|
||||
JSL RevealPotItem
|
||||
RTS
|
||||
@@ -39,6 +42,9 @@ org $86d180
|
||||
org $86d18d ; <- 3518D - sprite_absorbable.asm : 274 (LDA $7EF36F : INC A : STA $7EF36F)
|
||||
JSL KeyGet
|
||||
|
||||
org $86E24A
|
||||
JSR MaybeSkipTerrainDebris
|
||||
|
||||
org $86f9f3 ; bank06.asm : 6732 (JSL SpritePrep_LoadProperties)
|
||||
JSL LoadProperties_PreserveCertainProps
|
||||
|
||||
@@ -46,6 +52,11 @@ org $86828A
|
||||
Sprite_SpawnSecret_SpriteSpawnDynamically:
|
||||
JSL CheckSprite_Spawn
|
||||
|
||||
org $87B114
|
||||
JSL MaybeUnableToLiftPotSfx
|
||||
NOP #4
|
||||
db $30 ; BMI
|
||||
|
||||
org $87B169
|
||||
JSL PreventPotSpawn : NOP
|
||||
|
||||
@@ -80,7 +91,11 @@ InitializeMirrorHDMA:
|
||||
org $89D62E
|
||||
UWSpritesPointers: ; 0x250 bytes for 0x128 rooms' 16-bit pointers
|
||||
|
||||
org $89D87E
|
||||
if !FEATURE_FIX_BASEROM
|
||||
org $81DB67
|
||||
else
|
||||
org $89D87E
|
||||
endif
|
||||
UWPotsPointers: ; 0x250 bytes for 0x128 rooms' 16-bit pointers
|
||||
|
||||
org $89DACE
|
||||
@@ -177,7 +192,7 @@ RevealPotItem:
|
||||
|
||||
LDA.b RoomIndex : ASL : TAX
|
||||
|
||||
LDA.l UWPotsPointers,X : STA.b Scrap00 ; we may move this
|
||||
LDA.l UWPotsPointers, X : STA.b Scrap00 ; we may move this
|
||||
LDA.w #UWPotsPointers>>16 : STA.b Scrap02
|
||||
|
||||
LDY.w #$FFFD : LDX.w #$FFFF
|
||||
@@ -671,7 +686,7 @@ KeyGet:
|
||||
PHA
|
||||
LDA.l StandingItemsOn : BNE +
|
||||
PLA : RTL
|
||||
+ LDY.w SprItemReceipt, X
|
||||
+ LDY.w SprSourceItemId, X
|
||||
LDA.w SprItemIndex, X : STA.w SpawnedItemIndex
|
||||
LDA.w SprItemFlags, X : STA.w SpawnedItemFlag
|
||||
STY.b Scrap00
|
||||
@@ -685,7 +700,7 @@ KeyGet:
|
||||
+ LSR : TAX
|
||||
LDA.b Scrap00 : CMP.l KeyTable, X : BNE +
|
||||
.countIt
|
||||
LDA.l StandingItemCounterMask : AND.w SpawnedItemFlag : BEQ ++
|
||||
LDA.l StandingItemCounterMask : AND SpawnedItemFlag : BEQ ++
|
||||
JSL AddInventory
|
||||
++ PLX : PLA : RTL
|
||||
+ CMP.b #$AF : beq .countIt ; universal key
|
||||
@@ -693,7 +708,7 @@ KeyGet:
|
||||
.skip PLX
|
||||
.receive
|
||||
JSL Player_HaltDashAttackLong
|
||||
TYA : JSL AttemptItemSubstitution : JSL ResolveLootIDLong : TAY
|
||||
TYA : JSL AttemptItemSubstitution : TAY
|
||||
JSL Link_ReceiveItem
|
||||
PLA : DEC : RTL
|
||||
|
||||
@@ -701,7 +716,7 @@ KeyTable:
|
||||
db $A0, $A0, $A2, $A3, $A4, $A5, $A6, $A7, $A8, $A9, $AA, $AB, $AC, $AD
|
||||
|
||||
BigKeyGet:
|
||||
LDY.w SprItemReceipt, X
|
||||
LDY.w SprSourceItemId, X
|
||||
CPY.b #$32 : BNE +
|
||||
STZ.w ItemReceiptMethod : LDY.b #$32 ; what we wrote over
|
||||
PHX : JSL Link_ReceiveItem : PLX ; what we wrote over
|
||||
@@ -773,7 +788,6 @@ CheckSprite_Spawn:
|
||||
RTL
|
||||
.check
|
||||
LDA.b Scrap0D : CMP.b #$08 : BNE +
|
||||
LDA.w LinkDashing : BNE .error
|
||||
LDX.b #$0F
|
||||
|
||||
; loop looking for a Sprite with state 0A (carried by the player)
|
||||
@@ -784,7 +798,9 @@ RTL
|
||||
LDA.b #$00 : STZ.w SpriteAITable, X
|
||||
LDA.b #$E4 : JSL Sprite_SpawnDynamically
|
||||
BMI .error
|
||||
LDA.b #$40 : TSB.w AButtonAct : RTL
|
||||
LDA.w UseY1 : AND.b #$02 : BNE ++
|
||||
LDA.b #$40 : TSB.w AButtonAct
|
||||
++ RTL
|
||||
|
||||
.error
|
||||
LDA.b #$3C ; SFX2_3C - error beep
|
||||
@@ -803,15 +819,102 @@ PreventPotSpawn2:
|
||||
LDA.b #$01 : TSB.b LinkStrafe ; what we wrote over
|
||||
+ RTL
|
||||
|
||||
MaybeSkipTerrainDebris_long:
|
||||
STZ.w SecretId ; what we wrote over
|
||||
LDA.w SpriteTypeTable, X : CMP.b #$EC
|
||||
BEQ .return
|
||||
PLA : PLA : PLA : PLA : PLA
|
||||
LDA.b #Sprite_ScheduleForBreakage_exit>>16 : PHA
|
||||
PEA.w Sprite_ScheduleForBreakage_exit-1
|
||||
.return
|
||||
RTL
|
||||
|
||||
MaybeSkipSmashTerrain:
|
||||
STY.w ManipIndex : LDA.w ManipTileMapX, Y ; what we wrote over
|
||||
PHA
|
||||
SEP #$30
|
||||
LDX.b #$0F
|
||||
- LDA.w SpriteAITable, X : BEQ .continue
|
||||
DEX
|
||||
BPL -
|
||||
.skip
|
||||
PLA : PLA
|
||||
LDA.b #$3C : STA.w SFX2 ; error beep
|
||||
SEC
|
||||
RTL
|
||||
.continue
|
||||
REP #$30
|
||||
PLA
|
||||
CLC
|
||||
RTL
|
||||
|
||||
MaybeUnableToLiftPotSfx:
|
||||
- LDA.w SpriteAITable,X : BEQ .return
|
||||
DEX
|
||||
BPL -
|
||||
LDA.b #$3C : STA.w SFX2 ; error beep
|
||||
LDA.b #$FF
|
||||
.return
|
||||
RTL
|
||||
|
||||
CheckIfPotIsSpecial:
|
||||
TXA ; give index to A so we can do a CMP.l
|
||||
CMP.l $018550 ; see if our current index is that of object 230
|
||||
BEQ .specialpot
|
||||
BNE .normal_pot
|
||||
|
||||
; Normal pot, so run the vanilla code
|
||||
.special_pot
|
||||
PHX
|
||||
|
||||
; get pot index and cache room ID offset
|
||||
LDA.b RoomIndex : ASL : STA.b Scrap0E
|
||||
TAX
|
||||
|
||||
LDA.b $08
|
||||
BIT.b $BF : BVC .upper ; if $BF has bit 14 set, it's upper layer
|
||||
ORA.w #$2000 ; set the lower layer bit ($2000)
|
||||
.upper
|
||||
STA.b $90 ; cache tilemap offset
|
||||
|
||||
LDA.l UWPotsPointers,X : TAX
|
||||
LDY.w #$0000
|
||||
|
||||
.next_pot
|
||||
LDA.l UWPotsPointers&$FF0000, X ; read only the bank
|
||||
CMP.w #$FFFF
|
||||
BEQ .nothing
|
||||
AND.w #$3FFF ; mask out the first three bits (used for item indicators and layer)
|
||||
|
||||
CMP.b $90 ; check against the tilemap offset
|
||||
BEQ .get_flag
|
||||
|
||||
INX #3
|
||||
INY #2
|
||||
BRA .next_pot
|
||||
|
||||
.get_flag
|
||||
TYX
|
||||
|
||||
LDA.l BitFieldMasks,X
|
||||
LDX.b Scrap0E ; get room ID
|
||||
STA.b Scrap0E
|
||||
LDA.l RoomPotData,X
|
||||
|
||||
BRA .check_pot
|
||||
|
||||
.nothing
|
||||
INC ; from FFFF, A is now 0000 so the AND always fails
|
||||
|
||||
.check_pot
|
||||
LDY.b $08 : PLX
|
||||
AND.b Scrap0E
|
||||
BEQ .exit ; zero flag will be set, which is what we want
|
||||
LDX.w #$0E82 ; the normal pot obj. See RoomDrawObjectData_#obj0E82
|
||||
|
||||
.normal_pot
|
||||
; Normal pot, so run the vanilla code
|
||||
LDA.l CurrentWorld ; check for dark world
|
||||
.specialpot ; zero flag already set, so gtg
|
||||
RTL
|
||||
.exit
|
||||
RTL
|
||||
|
||||
SetTheSceneFix:
|
||||
STZ.b $6C
|
||||
|
||||
@@ -2,6 +2,13 @@
|
||||
; Maiden Crystal Fixes
|
||||
;================================================================================
|
||||
|
||||
pushpc
|
||||
|
||||
org $9ECE25
|
||||
STZ.w $1F00 : NOP : NOP ; fix to allow VRAM corruption during Blind fight
|
||||
|
||||
pullpc
|
||||
|
||||
;--------------------------------------------------------------------------------
|
||||
; MaidenCrystalScript
|
||||
;--------------------------------------------------------------------------------
|
||||
|
||||
135
menu/compress.py
Normal file
135
menu/compress.py
Normal file
@@ -0,0 +1,135 @@
|
||||
import sys
|
||||
import os
|
||||
|
||||
# Compression function reverse-engineered from ALTTP's decompression routine at $00E7DE
|
||||
def compress(data):
|
||||
out = bytearray()
|
||||
i = 0
|
||||
|
||||
while i < len(data):
|
||||
# Check for repeating byte pattern
|
||||
if i + 1 < len(data) and data[i] == data[i + 1]:
|
||||
length = 2
|
||||
while i + length < len(data) and data[i] == data[i + length] and length < 32:
|
||||
length += 1
|
||||
# Repeating byte: 0x20-0x3F
|
||||
out.append(0x20 | (length - 1))
|
||||
out.append(data[i])
|
||||
i += length
|
||||
continue
|
||||
|
||||
# Check for incremental byte pattern
|
||||
if i + 2 < len(data) and data[i + 1] == data[i] + 1 and data[i + 2] == data[i] + 2:
|
||||
length = 3
|
||||
while i + length < len(data) and data[i + length] == data[i] + length and length < 32:
|
||||
length += 1
|
||||
# Incremental: 0x60-0x7F
|
||||
out.append(0x60 | (length - 1))
|
||||
out.append(data[i])
|
||||
i += length
|
||||
continue
|
||||
|
||||
# Check for repeating word pattern (alternating two bytes)
|
||||
if i + 3 < len(data):
|
||||
# Check if we have an alternating pattern: A B A B...
|
||||
byte_a = data[i]
|
||||
byte_b = data[i + 1]
|
||||
length = 2
|
||||
while i + length < len(data) and length < 32:
|
||||
if length % 2 == 0:
|
||||
if data[i + length] != byte_a:
|
||||
break
|
||||
else:
|
||||
if data[i + length] != byte_b:
|
||||
break
|
||||
length += 1
|
||||
|
||||
if length >= 4: # Need at least 4 bytes (2 alternations) to make it worthwhile
|
||||
# Repeating word: 0x40-0x5F
|
||||
out.append(0x40 | (length - 1))
|
||||
out.append(byte_a)
|
||||
out.append(byte_b)
|
||||
i += length
|
||||
continue
|
||||
|
||||
# Check for copy from past (LZ with absolute offset)
|
||||
best_len = 0
|
||||
best_off = 0
|
||||
search_start = max(0, i - 65536) # Can reference anywhere in output
|
||||
for j in range(search_start, i):
|
||||
length = 0
|
||||
while i + length < len(data) and data[j + length] == data[i + length] and length < 1024:
|
||||
length += 1
|
||||
if length >= 2 and length > best_len:
|
||||
best_len = length
|
||||
best_off = j # Absolute offset, not relative!
|
||||
|
||||
if best_len >= 2:
|
||||
# Copy from past: 0x80-0xDF or 0xE0-0xFE (extended)
|
||||
# Offset is ABSOLUTE position in the output buffer
|
||||
if best_len <= 32:
|
||||
# Standard copy: 0x80-0xDF (5 bits for length-1, 16 bits for absolute offset)
|
||||
out.append(0x80 | ((best_len - 1) & 0x1F))
|
||||
out.append(best_off & 0xFF)
|
||||
out.append((best_off >> 8) & 0xFF)
|
||||
else:
|
||||
# Extended copy: 0xE0-0xFE
|
||||
if best_len > 1024:
|
||||
best_len = 1024
|
||||
# Command byte: 111LLLLL where L is length bits
|
||||
cmd = 0xE0 | (((best_len - 1) >> 8) & 0x1F)
|
||||
out.append(cmd)
|
||||
out.append((best_len - 1) & 0xFF)
|
||||
out.append(best_off & 0xFF)
|
||||
out.append((best_off >> 8) & 0xFF)
|
||||
i += best_len
|
||||
continue
|
||||
|
||||
# Raw copy (no pattern found)
|
||||
size = 1
|
||||
while size < 32 and i + size < len(data):
|
||||
# Don't extend raw copy if we find a better pattern ahead
|
||||
if i + size + 1 < len(data) and data[i + size] == data[i + size + 1]:
|
||||
break
|
||||
if i + size + 2 < len(data) and data[i + size + 1] == data[i + size] + 1:
|
||||
break
|
||||
# Check LZ
|
||||
found_lz = False
|
||||
for j in range(max(0, i + size - 2048), i + size):
|
||||
if i + size + 1 < len(data) and data[j] == data[i + size] and data[j + 1] == data[i + size + 1]:
|
||||
found_lz = True
|
||||
break
|
||||
if found_lz:
|
||||
break
|
||||
size += 1
|
||||
|
||||
# Raw copy: 0x00-0x1F
|
||||
out.append(size - 1)
|
||||
out.extend(data[i:i + size])
|
||||
i += size
|
||||
|
||||
# End marker
|
||||
out.append(0xFF)
|
||||
return out
|
||||
|
||||
if __name__ == '__main__':
|
||||
if len(sys.argv) != 3:
|
||||
print("Usage: python compress.py <input_file> <output_file>")
|
||||
sys.exit(1)
|
||||
|
||||
input_file_path = sys.argv[1]
|
||||
output_file_path = sys.argv[2]
|
||||
|
||||
if not os.path.exists(input_file_path):
|
||||
print(f"Error: Input file not found at {input_file_path}")
|
||||
sys.exit(1)
|
||||
|
||||
with open(input_file_path, 'rb') as f:
|
||||
input_data = f.read()
|
||||
|
||||
compressed_data = compress(input_data)
|
||||
|
||||
with open(output_file_path, 'wb') as f:
|
||||
f.write(compressed_data)
|
||||
|
||||
print(f"Successfully compressed '{input_file_path}' to '{output_file_path}'")
|
||||
112
menu/decompress.py
Normal file
112
menu/decompress.py
Normal file
@@ -0,0 +1,112 @@
|
||||
import sys
|
||||
|
||||
def decompress(compressed_data):
|
||||
out = bytearray()
|
||||
i = 0
|
||||
|
||||
while i < len(compressed_data):
|
||||
cmd = compressed_data[i]
|
||||
|
||||
if cmd == 0xFF:
|
||||
# End marker
|
||||
break
|
||||
|
||||
i += 1
|
||||
|
||||
# Decode based on top 3 bits
|
||||
top_bits = cmd & 0xE0
|
||||
|
||||
if cmd < 0xE0:
|
||||
# Standard commands
|
||||
length = (cmd & 0x1F) + 1
|
||||
|
||||
if top_bits == 0x00:
|
||||
# Raw copy
|
||||
out.extend(compressed_data[i:i+length])
|
||||
i += length
|
||||
elif top_bits == 0x20:
|
||||
# Repeating byte
|
||||
byte_val = compressed_data[i]
|
||||
out.extend([byte_val] * length)
|
||||
i += 1
|
||||
elif top_bits == 0x40:
|
||||
# Repeating word - alternates between two bytes
|
||||
byte_a = compressed_data[i]
|
||||
byte_b = compressed_data[i+1]
|
||||
for j in range(length):
|
||||
if j % 2 == 0:
|
||||
out.append(byte_a)
|
||||
else:
|
||||
out.append(byte_b)
|
||||
i += 2
|
||||
elif top_bits == 0x60:
|
||||
# Incremental
|
||||
start_val = compressed_data[i]
|
||||
for j in range(length):
|
||||
out.append((start_val + j) & 0xFF)
|
||||
i += 1
|
||||
elif top_bits >= 0x80:
|
||||
# Copy from past (absolute offset)
|
||||
offset = compressed_data[i] | (compressed_data[i+1] << 8)
|
||||
for j in range(length):
|
||||
out.append(out[offset + j])
|
||||
i += 2
|
||||
else:
|
||||
# Extended command (0xE0-0xFE)
|
||||
# Command type from bits 5-7 (after shifting)
|
||||
cmd_type = ((cmd << 3) & 0xE0)
|
||||
# Length from bits 0-1 of command (high) + next byte (low)
|
||||
length_high = cmd & 0x03
|
||||
length_low = compressed_data[i]
|
||||
length = (length_high << 8) | length_low
|
||||
length += 1
|
||||
i += 1
|
||||
|
||||
if cmd_type == 0x00:
|
||||
# Extended raw copy
|
||||
out.extend(compressed_data[i:i+length])
|
||||
i += length
|
||||
elif cmd_type == 0x20:
|
||||
# Extended repeating byte
|
||||
byte_val = compressed_data[i]
|
||||
out.extend([byte_val] * length)
|
||||
i += 1
|
||||
elif cmd_type == 0x40:
|
||||
# Extended repeating word - alternates between two bytes
|
||||
byte_a = compressed_data[i]
|
||||
byte_b = compressed_data[i+1]
|
||||
for j in range(length):
|
||||
if j % 2 == 0:
|
||||
out.append(byte_a)
|
||||
else:
|
||||
out.append(byte_b)
|
||||
i += 2
|
||||
elif cmd_type == 0x60:
|
||||
# Extended incremental
|
||||
start_val = compressed_data[i]
|
||||
for j in range(length):
|
||||
out.append((start_val + j) & 0xFF)
|
||||
i += 1
|
||||
elif cmd_type >= 0x80:
|
||||
# Extended copy from past
|
||||
offset = compressed_data[i] | (compressed_data[i+1] << 8)
|
||||
for j in range(length):
|
||||
out.append(out[offset + j])
|
||||
i += 2
|
||||
|
||||
return out
|
||||
|
||||
if __name__ == '__main__':
|
||||
if len(sys.argv) != 3:
|
||||
print("Usage: python decompress.py <input_file> <output_file>")
|
||||
sys.exit(1)
|
||||
|
||||
with open(sys.argv[1], 'rb') as f:
|
||||
compressed = f.read()
|
||||
|
||||
decompressed = decompress(compressed)
|
||||
|
||||
with open(sys.argv[2], 'wb') as f:
|
||||
f.write(decompressed)
|
||||
|
||||
print(f"Decompressed {len(compressed)} bytes to {len(decompressed)} bytes")
|
||||
Binary file not shown.
Binary file not shown.
|
Before Width: | Height: | Size: 2.5 KiB After Width: | Height: | Size: 4.2 KiB |
3
msu.asm
3
msu.asm
@@ -427,8 +427,6 @@ StoreMusicOnDeath:
|
||||
MSUInit:
|
||||
PHP
|
||||
|
||||
LDA.b #$00
|
||||
STA.l MSULoadedTrack
|
||||
JSL MSUResumeReset
|
||||
|
||||
LDA.l NoBGM : BNE .done
|
||||
@@ -499,6 +497,7 @@ MSUInit:
|
||||
;--------------------------------------------------------------------------------
|
||||
MSUResumeReset:
|
||||
LDA.b #$00
|
||||
STA.l MSULoadedTrack
|
||||
STA.l MSUResumeTrack
|
||||
STA.l MSUResumeTime : STA.l MSUResumeTime+1 : STA.l MSUResumeTime+2 : STA.l MSUResumeTime+3
|
||||
STA.l MSUResumeControl
|
||||
|
||||
57
music.asm
57
music.asm
@@ -96,15 +96,14 @@ Overworld_DetermineMusic:
|
||||
CMP.b #$43 : BEQ .darkMountain
|
||||
CMP.b #$45 : BEQ .darkMountain
|
||||
CMP.b #$47 : BEQ .darkMountain
|
||||
LDX.b #$09 ; default dark world theme
|
||||
BRA .default_set
|
||||
+
|
||||
|
||||
LDX.b #$02 ; hyrule field theme
|
||||
|
||||
LDA.l CurrentWorld : BEQ +
|
||||
LDX.b #$09 ; default dark world theme
|
||||
|
||||
.default_set
|
||||
; Check if we're entering the village
|
||||
+ LDA.b OverworldIndex : CMP.b #$18 : BNE +
|
||||
LDA.b OverworldIndex : CMP.b #$18 : BNE +
|
||||
; Check what phase we're in
|
||||
; LDA ProgressIndicator : CMP.b #$03 : !BGE .bunny
|
||||
LDX.b #$07 ; Default village theme (phase <3)
|
||||
@@ -174,24 +173,21 @@ RTL
|
||||
;--------------------------------------------------------------------------------
|
||||
|
||||
;--------------------------------------------------------------------------------
|
||||
; Additional dark world checks to determine whether or not to fade out music
|
||||
; on mosaic transitions
|
||||
;
|
||||
; On entry, A = $8A (overworld area being loaded)
|
||||
Overworld_MosaicDarkWorldChecks:
|
||||
CMP.b #$40 : BEQ .checkCrystals
|
||||
CMP.b #$42 : BEQ .checkCrystals
|
||||
CMP.b #$50 : BEQ .checkCrystals
|
||||
CMP.b #$51 : BNE .doFade
|
||||
pushpc
|
||||
org $82AD6C
|
||||
; Determine whether or not to fade out music on mosaic transitions
|
||||
OverworldMosaicTransition_HandleSong:
|
||||
LDA.b GameSubMode : CMP.b #$0D : BNE .dont_fade
|
||||
LDA.w CurrentControlRequest : CMP.b #$04 : BEQ .dont_fade
|
||||
BRA .fade_song
|
||||
|
||||
.checkCrystals
|
||||
LDA.l CrystalsField : CMP.b #$7F : BEQ .done
|
||||
warnpc $82ADA0
|
||||
org $82ADA0
|
||||
.fade_song
|
||||
org $82ADA5
|
||||
.dont_fade
|
||||
|
||||
.doFade
|
||||
LDA.b #$F1 : STA.w MusicControlRequest ; thing we wrote over, fade out music
|
||||
|
||||
.done
|
||||
RTL
|
||||
pullpc
|
||||
;--------------------------------------------------------------------------------
|
||||
|
||||
;--------------------------------------------------------------------------------
|
||||
@@ -230,3 +226,22 @@ FallingMusicFadeOut:
|
||||
.return
|
||||
RTL
|
||||
;--------------------------------------------------------------------------------
|
||||
FixHalfVolumeOnSpawnExitToOverworld:
|
||||
BEQ .exit : STA.w MusicControlRequest ; what we wrote over
|
||||
LDA.w DungeonID : BNE .exit
|
||||
LDA.b LinkPosY+1 : ROR : LDA.b LinkPosY : ROR
|
||||
CMP.b #$DC : BCS .exit ; check if link loading in room from a spawn
|
||||
; set queue to half volume to trigger full volume on exit
|
||||
LDA.b #$F2 : STA.w MusicControlQueue
|
||||
.exit
|
||||
RTL
|
||||
;--------------------------------------------------------------------------------
|
||||
FixPreAgaMusicFadeOut:
|
||||
LDA.l DRMode : TAX : CPX.b #$01 : BCS .exit_no_fade+1
|
||||
LDA.b RoomIndex : CMP.w #$0030 : BEQ .exit_and_fade ; what we
|
||||
CMP.w #$0040 : BEQ .exit_and_fade ; wrote over
|
||||
.exit_no_fade
|
||||
SEC : RTL
|
||||
.exit_and_fade
|
||||
CLC : RTL
|
||||
;--------------------------------------------------------------------------------
|
||||
|
||||
83
newhud.asm
83
newhud.asm
@@ -451,6 +451,15 @@ HUDHex4Digit_Long:
|
||||
REP #$20
|
||||
RTL
|
||||
|
||||
;================================================================================
|
||||
ClearHearts:
|
||||
LDA.w #!BlankTile
|
||||
LDX.b #$14
|
||||
- STA.l HUDTileMapBuffer+$066, X
|
||||
STA.l HUDTileMapBuffer+$0A6, X
|
||||
DEX #2
|
||||
BPL -
|
||||
RTS
|
||||
;================================================================================
|
||||
UpdateHearts:
|
||||
PHB
|
||||
@@ -461,6 +470,22 @@ UpdateHearts:
|
||||
PHX
|
||||
PLB
|
||||
|
||||
; OHKO mode
|
||||
LDA.l ChallengeModes : AND.w #$0003 : CMP.w #$0001 : BNE +
|
||||
LDA.w #$240A
|
||||
STA.l HUDTileMapBuffer+$068
|
||||
INC
|
||||
STA.l HUDTileMapBuffer+$06A
|
||||
INC
|
||||
STA.l HUDTileMapBuffer+$06C
|
||||
JMP .skip_partial
|
||||
+
|
||||
|
||||
; Gloom mode
|
||||
LDA.l ChallengeModes : AND.w #$0003 : CMP.w #$0002 : BNE +
|
||||
JSR ClearHearts
|
||||
+
|
||||
|
||||
LDA.w MaximumHealth
|
||||
LSR
|
||||
LSR
|
||||
@@ -480,11 +505,11 @@ UpdateHearts:
|
||||
CPX.b #$01
|
||||
BMI .done_hearts
|
||||
|
||||
PHX
|
||||
LDA.l HUDHeartColors_index : ASL : TAX
|
||||
LDA.l HUDHeartColors_masks_game_hud,X
|
||||
PLX
|
||||
ORA.w #$20A0
|
||||
PHX
|
||||
LDA.l HUDHeartColors_index : ASL : TAX
|
||||
LDA.l HUDHeartColors_masks_game_hud,X
|
||||
PLX
|
||||
ORA.w #$20A0
|
||||
|
||||
CPY.b #$01
|
||||
BPL .add_heart
|
||||
@@ -526,16 +551,16 @@ UpdateHearts:
|
||||
CMP.w #$0005
|
||||
BCS .more_than_half
|
||||
|
||||
LDA.l HUDHeartColors_index : ASL : TAX
|
||||
LDA.l HUDHeartColors_masks_game_hud,X
|
||||
ORA.w #$20A1
|
||||
LDA.l HUDHeartColors_index : ASL : TAX
|
||||
LDA.l HUDHeartColors_masks_game_hud,X
|
||||
ORA.w #$20A1
|
||||
STA.b (Scrap09)
|
||||
BRA .skip_partial
|
||||
BRA .skip_partial
|
||||
|
||||
.more_than_half
|
||||
LDA.l HUDHeartColors_index : ASL : TAX
|
||||
LDA.l HUDHeartColors_masks_game_hud,X
|
||||
ORA.w #$20A0
|
||||
LDA.l HUDHeartColors_index : ASL : TAX
|
||||
LDA.l HUDHeartColors_masks_game_hud,X
|
||||
ORA.w #$20A0
|
||||
STA.b (Scrap09)
|
||||
|
||||
.skip_partial
|
||||
@@ -545,29 +570,29 @@ UpdateHearts:
|
||||
RTL
|
||||
|
||||
CheckHeartPaletteFileSelect:
|
||||
LDA.l HUDHeartColors_index : ASL : TAX
|
||||
LDA.l HUDHeartColors_masks_file_select,X
|
||||
ORA.w #$0200
|
||||
LDX.w #$000A
|
||||
LDA.l HUDHeartColors_index : ASL : TAX
|
||||
LDA.l HUDHeartColors_masks_file_select,X
|
||||
ORA.w #$0200
|
||||
LDX.w #$000A
|
||||
RTL
|
||||
|
||||
CheckHeartPalette:
|
||||
PHX
|
||||
LDA.l HUDHeartColors_index : ASL : TAX
|
||||
LDA.l HUDHeartColors_masks_game_hud,X
|
||||
ORA.w #$20A0
|
||||
PLX
|
||||
PHX
|
||||
LDA.l HUDHeartColors_index : ASL : TAX
|
||||
LDA.l HUDHeartColors_masks_game_hud,X
|
||||
ORA.w #$20A0
|
||||
PLX
|
||||
RTS
|
||||
|
||||
ColorAnimatedHearts:
|
||||
PHX
|
||||
REP #$20
|
||||
LDA.l HUDHeartColors_index : ASL : TAX
|
||||
LDA.l HUDHeartColors_masks_game_hud,X
|
||||
PLX
|
||||
ORA.l HeartFramesBaseTiles,X
|
||||
STA.b [Scrap00],Y
|
||||
SEP #$20
|
||||
PHX
|
||||
REP #$20
|
||||
LDA.l HUDHeartColors_index : ASL : TAX
|
||||
LDA.l HUDHeartColors_masks_game_hud,X
|
||||
PLX
|
||||
ORA.l HeartFramesBaseTiles,X
|
||||
STA.b [Scrap00],Y
|
||||
SEP #$20
|
||||
RTL
|
||||
|
||||
HeartFramesBaseTiles:
|
||||
|
||||
@@ -188,10 +188,12 @@ ItemBehavior:
|
||||
BRA .store_inventory_tracking
|
||||
|
||||
.flute_inactive
|
||||
LDA.b #$FF : STA.l FluteBitfield
|
||||
LDA.l InventoryTracking : ORA.b #$02
|
||||
BRA .store_inventory_tracking
|
||||
|
||||
.flute_active
|
||||
LDA.b #$FF : STA.l FluteBitfield
|
||||
LDA.l InventoryTracking : ORA.b #$01
|
||||
BRA .store_inventory_tracking
|
||||
|
||||
@@ -1210,7 +1212,7 @@ MaybeFlagDungeonTotalsEntrance:
|
||||
LDA.l CompassMode : AND.w #$000F : BEQ .maps ; Skip if we're not showing compass counts
|
||||
JSR FlagCompassCount
|
||||
.maps
|
||||
; LDA.l MapHUDMode : AND.w #$000F : BEQ .done
|
||||
LDA.l MapHUDMode : AND.w #$000F
|
||||
LDX.w DungeonID
|
||||
JSR FlagMapCount
|
||||
.done
|
||||
@@ -1225,7 +1227,7 @@ FlagCompassCount:
|
||||
RTS
|
||||
;--------------------------------------------------------------------------------
|
||||
FlagMapCount:
|
||||
; CMP.w #$0002 : BEQ .mapShown
|
||||
CMP.w #$0002 : BEQ .mapShown
|
||||
LDA.l MapMode : AND.w #$00FF : BEQ .mapShown
|
||||
LDA.l MapField : AND.l DungeonItemMasks, X : BEQ .done ; skip if we don't have map
|
||||
.mapShown
|
||||
|
||||
@@ -138,7 +138,7 @@ RTL
|
||||
ItemSet_Mushroom:
|
||||
PHA
|
||||
LDA.l NpcFlags+1 : ORA.b #$10 : STA.l NpcFlags+1
|
||||
LDY.w SprItemReceipt, X ; Retrieve stored item type
|
||||
LDY.w SprSourceItemId, X ; Retrieve stored item type
|
||||
BNE +
|
||||
; if for any reason the item value is 0 reload it, just in case
|
||||
%GetPossiblyEncryptedItem(MushroomItem, SpriteItemValues) : TAY
|
||||
|
||||
597
owrando.asm
597
owrando.asm
@@ -320,6 +320,7 @@ OWLightWorldOrCrossed:
|
||||
|
||||
OWFluteCancel:
|
||||
{
|
||||
lda.l FluteBitfield : beq +
|
||||
lda.l OWFlags+1 : and.b #$01 : bne +
|
||||
jsl FluteMenu_LoadTransport : rtl
|
||||
+ lda.w RandoOverworldTargetEdge : bne +
|
||||
@@ -331,8 +332,10 @@ OWFluteCancel2:
|
||||
lda.b Joy1B_All : ora.b Joy1A_All : and.b #$c0 : bne +
|
||||
jml FluteMenu_HandleSelection_NoSelection
|
||||
+ inc.w SubModuleInterface
|
||||
lda.l FluteBitfield : beq .cancel
|
||||
lda.l OWFlags+1 : and.b #$01 : beq +
|
||||
lda.b Joy1B_All : cmp.b #$40 : bne +
|
||||
.cancel
|
||||
lda.b #$01 : sta.w RandoOverworldTargetEdge
|
||||
+ rtl
|
||||
}
|
||||
@@ -613,7 +616,13 @@ OWBonkDrops:
|
||||
LDA.w $0400 : ORA.b 1,S : STA.w $0400
|
||||
BRA .increment_collection
|
||||
++
|
||||
LDX.b OverworldIndex : LDA.l OverworldEventDataWRAM,X : ORA.b 1,S : STA.l OverworldEventDataWRAM,X
|
||||
LDA.b OverworldIndex
|
||||
BIT.b #$40 : BEQ +
|
||||
LDA.l ProgressIndicator : CMP.b #$02
|
||||
LDA.b OverworldIndex : BCS ++ : AND.b #$BF
|
||||
++
|
||||
+
|
||||
TAX : LDA.l OverworldEventDataWRAM,X : ORA.b 1,S : STA.l OverworldEventDataWRAM,X
|
||||
|
||||
.increment_collection
|
||||
REP #$20
|
||||
@@ -673,13 +682,19 @@ OWBonkDropLookup:
|
||||
{
|
||||
; loop thru rando bonk table to find match
|
||||
LDA.b OverworldIndex
|
||||
BIT.b #$40 : BEQ +
|
||||
LDA.l ProgressIndicator : AND.b #$FF : CMP.b #$02
|
||||
LDA.b OverworldIndex : BCS ++ : AND.b #$BF
|
||||
++
|
||||
+
|
||||
LDX.b #((UWBonkPrizeData-OWBonkPrizeData)-sizeof(OWBonkPrizeTable)) ; 41 bonk items, 6 bytes each
|
||||
- CMP.w OWBonkPrizeData,X : BNE +
|
||||
INX
|
||||
PHA
|
||||
LDA.w SpritePosXLow,Y : LSR A : LSR A : LSR A : LSR A
|
||||
EOR.w SpritePosYLow,Y : CMP.w OWBonkPrizeData,X : BNE ++ ; X = row + 1
|
||||
SEC : RTS
|
||||
++ DEX : LDA.b OverworldIndex
|
||||
PLA : SEC : RTS
|
||||
++ DEX : PLA
|
||||
+ CPX.b #$00 : BNE +
|
||||
CLC : RTS
|
||||
+ DEX : DEX : DEX : DEX : DEX : DEX : BRA -
|
||||
@@ -689,16 +704,22 @@ OWBonkDropLookup:
|
||||
OWBonkDropCollected:
|
||||
{
|
||||
; check if collected
|
||||
CLC
|
||||
LDA.b IndoorsFlag : BEQ +
|
||||
LDA.l RoomDataWRAM[$0120].high : AND.b 3,S : BEQ .return ; S = Collected, FlagBitmask, X (row + 2)
|
||||
SEC : RTS
|
||||
+
|
||||
LDX.b OverworldIndex : LDA.l OverworldEventDataWRAM,X : AND.b 3,S : BEQ .return ; S = Collected, FlagBitmask, X (row + 2)
|
||||
LDA.b OverworldIndex
|
||||
BIT.b #$40 : BEQ +
|
||||
LDA.l ProgressIndicator : CMP.b #$02
|
||||
LDA.b OverworldIndex : BCS ++ : AND.b #$BF
|
||||
++
|
||||
+
|
||||
TAX
|
||||
LDA.l OverworldEventDataWRAM,X : AND.b 3,S : BEQ .return ; S = Collected, FlagBitmask, X (row + 2)
|
||||
SEC : RTS
|
||||
|
||||
.return
|
||||
RTS
|
||||
CLC : RTS
|
||||
}
|
||||
|
||||
; A = SprItemReceipt, Y = Sprite Slot Index, X = free/overwritten
|
||||
@@ -1384,291 +1405,291 @@ db $80, $80, $81
|
||||
org $aaa800 ;PC 152800
|
||||
OWNorthEdges:
|
||||
; Min Max Width Mid OW Slot/OWID VRAM Terrain Dest Index
|
||||
dw $00a0, $00a0, $0000, $00a0, $0000, $0000, $0000, $B040 ;Lost Woods (exit only)
|
||||
dw $0458, $0540, $00e8, $04cc, $0a0a, $0000, $0000, $0000
|
||||
dw $0f38, $0f60, $0028, $0f4c, $0f0f, $0000, $0000, $2041 ;Waterfall (exit only)
|
||||
dw $0058, $0058, $0000, $0058, $1010, $0000, $0000, $0001
|
||||
dw $0178, $0178, $0000, $0178, $1010, $0000, $0000, $0002
|
||||
dw $0388, $0388, $0000, $0388, $1111, $0000, $0000, $0003
|
||||
dw $0480, $05b0, $0130, $0518, $1212, $0000, $0000, $0004
|
||||
dw $0f70, $0f90, $0020, $0f80, $1717, $0000, $0000, $0005
|
||||
dw $0078, $0098, $0020, $0088, $1818, $0000, $0000, $0006 ;Kakariko
|
||||
dw $0138, $0158, $0020, $0148, $1818, $0000, $0000, $0007
|
||||
dw $02e8, $0348, $0060, $0318, $1819, $0000, $0000, $0008
|
||||
dw $0478, $04d0, $0058, $04a4, $1a1a, $0000, $0000, $0009
|
||||
dw $0510, $0538, $0028, $0524, $1a1a, $0000, $0000, $000a
|
||||
dw $0a48, $0af0, $00a8, $0a9c, $1d1d, $0000, $0000, $000b
|
||||
dw $0b28, $0b38, $0010, $0b30, $1d1d, $0000, $0001, $000c
|
||||
dw $0b70, $0ba0, $0030, $0b88, $1d1d, $0000, $0000, $000d
|
||||
dw $0a40, $0b10, $00d0, $0aa8, $2525, $0000, $0000, $000e
|
||||
dw $0350, $0390, $0040, $0370, $2929, $0000, $0000, $000f
|
||||
dw $0670, $06a8, $0038, $068c, $2b2b, $0000, $0000, $0010
|
||||
dw $0898, $09b0, $0118, $0924, $2c2c, $0000, $0000, $0011 ;Links House
|
||||
dw $0a40, $0ba0, $0160, $0af0, $2d2d, $0000, $0000, $0012
|
||||
dw $0c70, $0c90, $0020, $0c80, $2e2e, $0000, $0000, $0013
|
||||
dw $0f70, $0f80, $0010, $0f78, $2f2f, $0000, $0000, $0014
|
||||
dw $0430, $0468, $0038, $044c, $3232, $0000, $0000, $0015
|
||||
dw $04d8, $04f8, $0020, $04e8, $3232, $0000, $0000, $0016
|
||||
dw $0688, $06b0, $0028, $069c, $3333, $0000, $0000, $0017
|
||||
dw $08d0, $08f0, $0020, $08e0, $3434, $0000, $0000, $0018
|
||||
dw $0a80, $0b40, $00c0, $0ae0, $3535, $0000, $0000, $0019
|
||||
dw $0d38, $0d58, $0020, $0d48, $3536, $0000, $0001, $001a
|
||||
dw $0d90, $0da0, $0010, $0d98, $3536, $0000, $0000, $001b
|
||||
dw $06a0, $07b0, $0110, $0728, $3b3b, $0000, $0000, $001c
|
||||
dw $0830, $09b0, $0180, $08f0, $3c3c, $0000, $0000, $001d
|
||||
dw $0e78, $0e88, $0010, $0e80, $3f3f, $0000, $0001, $001e
|
||||
dw $0ee0, $0fc0, $00e0, $0f50, $3f3f, $0000, $0000, $001f
|
||||
dw $0458, $0540, $00e8, $04cc, $4a4a, $0000, $0000, $0020
|
||||
dw $0058, $0058, $0000, $0058, $5050, $0000, $0000, $0021
|
||||
dw $0178, $0178, $0000, $0178, $5050, $0000, $0000, $0022
|
||||
dw $0388, $0388, $0000, $0388, $5151, $0000, $0000, $0023
|
||||
dw $0480, $05b0, $0130, $0518, $5252, $0000, $0000, $0024
|
||||
dw $0f70, $0f90, $0020, $0f80, $5757, $0000, $0000, $0025
|
||||
dw $0078, $0098, $0020, $0088, $5858, $0000, $0000, $0026 ;Village of Outcasts
|
||||
dw $0138, $0158, $0020, $0148, $5858, $0000, $0000, $0027
|
||||
dw $02e8, $0348, $0060, $0318, $5859, $0000, $0000, $0028
|
||||
dw $0478, $04d0, $0058, $04a4, $5a5a, $0000, $0000, $0029
|
||||
dw $0510, $0538, $0028, $0524, $5a5a, $0000, $0000, $002a
|
||||
dw $0a48, $0af0, $00a8, $0a9c, $5d5d, $0000, $0000, $002b
|
||||
dw $0b28, $0b38, $0010, $0b30, $5d5d, $0000, $0001, $002c
|
||||
dw $0b70, $0ba0, $0030, $0b88, $5d5d, $0000, $0000, $002d
|
||||
dw $0a40, $0b10, $00d0, $0aa8, $6565, $0000, $0000, $002e
|
||||
dw $0350, $0390, $0040, $0370, $6969, $0000, $0000, $002f
|
||||
dw $0670, $06a8, $0038, $068c, $6b6b, $0000, $0000, $0030
|
||||
dw $0898, $09b0, $0118, $0924, $6c6c, $0000, $0000, $0031
|
||||
dw $0a40, $0ba0, $0160, $0af0, $6d6d, $0000, $0000, $0032
|
||||
dw $0c70, $0c90, $0020, $0c80, $6e6e, $0000, $0000, $0033
|
||||
dw $0f70, $0f80, $0010, $0f78, $6f6f, $0000, $0000, $0034
|
||||
dw $0430, $0468, $0038, $044c, $7272, $0000, $0000, $0035
|
||||
dw $04d8, $04f8, $0020, $04e8, $7272, $0000, $0000, $0036
|
||||
dw $0688, $06b0, $0028, $069c, $7373, $0000, $0000, $0037
|
||||
dw $08d0, $08f0, $0020, $08e0, $7474, $0000, $0000, $0038
|
||||
dw $0a80, $0b40, $00c0, $0ae0, $7575, $0000, $0000, $0039
|
||||
dw $0d38, $0d58, $0020, $0d48, $7576, $0000, $0001, $003a
|
||||
dw $0d90, $0da0, $0010, $0d98, $7576, $0000, $0000, $003b
|
||||
dw $06a0, $07b0, $0110, $0728, $7b7b, $0000, $0000, $003c
|
||||
dw $0830, $09b0, $0180, $08f0, $7c7c, $0000, $0000, $003d
|
||||
dw $0e78, $0e88, $0010, $0e80, $7f7f, $0000, $0001, $003e
|
||||
dw $0ee0, $0fc0, $00e0, $0f50, $7f7f, $0000, $0000, $003f
|
||||
dw $00a0, $00a0, $0000, $00a0, $0000, $0284, $0000, $B040 ;Lost Woods (exit only)
|
||||
dw $0458, $0540, $00e8, $04cc, $0a0a, $180a, $0000, $0000
|
||||
dw $0f38, $0f60, $0028, $0f4c, $0f0f, $009a, $0000, $2041 ;Waterfall (exit only)
|
||||
dw $0058, $0058, $0000, $0058, $1010, $1800, $0000, $0001
|
||||
dw $0178, $0178, $0000, $0178, $1010, $181e, $0000, $0002
|
||||
dw $0388, $0388, $0000, $0388, $1111, $1820, $0000, $0003
|
||||
dw $0480, $05b0, $0130, $0518, $1212, $1812, $0000, $0004
|
||||
dw $0f70, $0f90, $0020, $0f80, $1717, $1820, $0000, $0005
|
||||
dw $0078, $0098, $0020, $0088, $1818, $1802, $0000, $0006 ;Kakariko
|
||||
dw $0138, $0158, $0020, $0148, $1818, $181a, $0000, $0007
|
||||
dw $02e8, $0348, $0060, $0318, $1819, $1854, $0000, $0008
|
||||
dw $0478, $04d0, $0058, $04a4, $1a1a, $1806, $0000, $0009
|
||||
dw $0510, $0538, $0028, $0524, $1a1a, $1816, $0000, $000a
|
||||
dw $0a48, $0af0, $00a8, $0a9c, $1d1d, $1804, $0000, $000b
|
||||
dw $0b28, $0b38, $0010, $0b30, $1d1d, $1818, $0001, $000c
|
||||
dw $0b70, $0ba0, $0030, $0b88, $1d1d, $1820, $0000, $000d
|
||||
dw $0a40, $0b10, $00d0, $0aa8, $2525, $1806, $0000, $000e
|
||||
dw $0350, $0390, $0040, $0370, $2929, $1820, $0000, $000f
|
||||
dw $0670, $06a8, $0038, $068c, $2b2b, $1802, $0000, $0010
|
||||
dw $0898, $09b0, $0118, $0924, $2c2c, $1814, $0000, $0011 ;Links House
|
||||
dw $0a40, $0ba0, $0160, $0af0, $2d2d, $180e, $0000, $0012
|
||||
dw $0c70, $0c90, $0020, $0c80, $2e2e, $1802, $0000, $0013
|
||||
dw $0f70, $0f80, $0010, $0f78, $2f2f, $1820, $0000, $0014
|
||||
dw $0430, $0468, $0038, $044c, $3232, $1800, $0000, $0015
|
||||
dw $04d8, $04f8, $0020, $04e8, $3232, $180c, $0000, $0016
|
||||
dw $0688, $06b0, $0028, $069c, $3333, $1804, $0000, $0017
|
||||
dw $08d0, $08f0, $0020, $08e0, $3434, $180e, $0000, $0018
|
||||
dw $0a80, $0b40, $00c0, $0ae0, $3535, $180c, $0000, $0019
|
||||
dw $0d38, $0d58, $0020, $0d48, $3536, $185a, $0001, $001a
|
||||
dw $0d90, $0da0, $0010, $0d98, $3536, $1860, $0000, $001b
|
||||
dw $06a0, $07b0, $0110, $0728, $3b3b, $1816, $0000, $001c
|
||||
dw $0830, $09b0, $0180, $08f0, $3c3c, $1810, $0000, $001d
|
||||
dw $0e78, $0e88, $0010, $0e80, $3f3f, $1802, $0001, $001e
|
||||
dw $0ee0, $0fc0, $00e0, $0f50, $3f3f, $181c, $0000, $001f
|
||||
dw $0458, $0540, $00e8, $04cc, $4a4a, $180a, $0000, $0020
|
||||
dw $0058, $0058, $0000, $0058, $5050, $181e, $0000, $0021
|
||||
dw $0178, $0178, $0000, $0178, $5050, $1800, $0000, $0022
|
||||
dw $0388, $0388, $0000, $0388, $5151, $1820, $0000, $0023
|
||||
dw $0480, $05b0, $0130, $0518, $5252, $1812, $0000, $0024
|
||||
dw $0f70, $0f90, $0020, $0f80, $5757, $1820, $0000, $0025
|
||||
dw $0078, $0098, $0020, $0088, $5858, $1802, $0000, $0026 ;Village of Outcasts
|
||||
dw $0138, $0158, $0020, $0148, $5858, $181a, $0000, $0027
|
||||
dw $02e8, $0348, $0060, $0318, $5859, $1854, $0000, $0028
|
||||
dw $0478, $04d0, $0058, $04a4, $5a5a, $1806, $0000, $0029
|
||||
dw $0510, $0538, $0028, $0524, $5a5a, $1816, $0000, $002a
|
||||
dw $0a48, $0af0, $00a8, $0a9c, $5d5d, $1804, $0000, $002b
|
||||
dw $0b28, $0b38, $0010, $0b30, $5d5d, $1818, $0001, $002c
|
||||
dw $0b70, $0ba0, $0030, $0b88, $5d5d, $1820, $0000, $002d
|
||||
dw $0a40, $0b10, $00d0, $0aa8, $6565, $1806, $0000, $002e
|
||||
dw $0350, $0390, $0040, $0370, $6969, $1820, $0000, $002f
|
||||
dw $0670, $06a8, $0038, $068c, $6b6b, $1802, $0000, $0030
|
||||
dw $0898, $09b0, $0118, $0924, $6c6c, $1814, $0000, $0031
|
||||
dw $0a40, $0ba0, $0160, $0af0, $6d6d, $180e, $0000, $0032
|
||||
dw $0c70, $0c90, $0020, $0c80, $6e6e, $1802, $0000, $0033
|
||||
dw $0f70, $0f80, $0010, $0f78, $6f6f, $1820, $0000, $0034
|
||||
dw $0430, $0468, $0038, $044c, $7272, $1800, $0000, $0035
|
||||
dw $04d8, $04f8, $0020, $04e8, $7272, $180c, $0000, $0036
|
||||
dw $0688, $06b0, $0028, $069c, $7373, $1804, $0000, $0037
|
||||
dw $08d0, $08f0, $0020, $08e0, $7474, $180e, $0000, $0038
|
||||
dw $0a80, $0b40, $00c0, $0ae0, $7575, $180c, $0000, $0039
|
||||
dw $0d38, $0d58, $0020, $0d48, $7576, $185a, $0001, $003a
|
||||
dw $0d90, $0da0, $0010, $0d98, $7576, $1860, $0000, $003b
|
||||
dw $06a0, $07b0, $0110, $0728, $7b7b, $1816, $0000, $003c
|
||||
dw $0830, $09b0, $0180, $08f0, $7c7c, $1810, $0000, $003d
|
||||
dw $0e78, $0e88, $0010, $0e80, $7f7f, $1802, $0001, $003e
|
||||
dw $0ee0, $0fc0, $00e0, $0f50, $7f7f, $181c, $0000, $003f
|
||||
OWSouthEdges:
|
||||
dw $0458, $0540, $00e8, $04cc, $0202, $0000, $0000, $0001
|
||||
dw $0058, $0058, $0000, $0058, $0008, $0000, $0000, $0003
|
||||
dw $0178, $0178, $0000, $0178, $0008, $0000, $0000, $0004
|
||||
dw $0388, $0388, $0000, $0388, $0009, $0000, $0000, $0005
|
||||
dw $0480, $05b0, $0130, $0518, $0a0a, $0000, $0000, $0006
|
||||
dw $0f70, $0f90, $0020, $0f80, $0f0f, $0000, $0000, $0007
|
||||
dw $0078, $0098, $0020, $0088, $1010, $0000, $0000, $0008
|
||||
dw $0138, $0158, $0020, $0148, $1010, $0000, $0000, $0009
|
||||
dw $02e8, $0348, $0060, $0318, $1111, $0000, $0000, $000a
|
||||
dw $0478, $04d0, $0058, $04a4, $1212, $0000, $0000, $000b
|
||||
dw $0510, $0538, $0028, $0524, $1212, $0000, $0000, $000c
|
||||
dw $0a48, $0af0, $00a8, $0a9c, $1515, $0000, $0000, $000d
|
||||
dw $0b28, $0b38, $0010, $0b30, $1515, $0000, $0001, $000e
|
||||
dw $0b70, $0ba0, $0030, $0b88, $1515, $0000, $0000, $000f
|
||||
dw $0a40, $0b10, $00d0, $0aa8, $1d1d, $0000, $0000, $0010
|
||||
dw $0350, $0390, $0040, $0370, $1821, $0000, $0000, $0011
|
||||
dw $0670, $06a8, $0038, $068c, $1b23, $0000, $0000, $0012
|
||||
dw $0898, $09b0, $0118, $0924, $1b24, $0000, $0000, $0013
|
||||
dw $0a40, $0ba0, $0160, $0af0, $2525, $0000, $0000, $0014
|
||||
dw $0c70, $0c90, $0020, $0c80, $1e26, $0000, $0000, $0015
|
||||
dw $0f70, $0f80, $0010, $0f78, $1e27, $0000, $0000, $0016
|
||||
dw $0430, $0468, $0038, $044c, $2a2a, $0000, $0000, $0017
|
||||
dw $04d8, $04f8, $0020, $04e8, $2a2a, $0000, $0000, $0018
|
||||
dw $0688, $06b0, $0028, $069c, $2b2b, $0000, $0000, $0019
|
||||
dw $08d0, $08f0, $0020, $08e0, $2c2c, $0000, $0000, $001a
|
||||
dw $0a80, $0b40, $00c0, $0ae0, $2d2d, $0000, $0000, $001b
|
||||
dw $0d38, $0d58, $0020, $0d48, $2e2e, $0000, $0001, $001c
|
||||
dw $0d90, $0da0, $0010, $0d98, $2e2e, $0000, $0000, $001d
|
||||
dw $06a0, $07b0, $0110, $0728, $3333, $0000, $0000, $001e
|
||||
dw $0830, $09b0, $0180, $08f0, $3434, $0000, $0000, $001f
|
||||
dw $0e78, $0e88, $0010, $0e80, $3737, $0000, $0001, $0020
|
||||
dw $0ee0, $0fc0, $00e0, $0f50, $3737, $0000, $0000, $0021
|
||||
dw $0458, $0540, $00e8, $04cc, $4242, $0000, $0000, $0022
|
||||
dw $0058, $0058, $0000, $0058, $4048, $0000, $0000, $0023
|
||||
dw $0178, $0178, $0000, $0178, $4048, $0000, $0000, $0024
|
||||
dw $0388, $0388, $0000, $0388, $4049, $0000, $0000, $0025
|
||||
dw $0480, $05b0, $0130, $0518, $4a4a, $0000, $0000, $0026
|
||||
dw $0f70, $0f90, $0020, $0f80, $4f4f, $0000, $0000, $0027
|
||||
dw $0078, $0098, $0020, $0088, $5050, $0000, $0000, $0028
|
||||
dw $0138, $0158, $0020, $0148, $5050, $0000, $0000, $0029
|
||||
dw $02e8, $0348, $0060, $0318, $5151, $0000, $0000, $002a
|
||||
dw $0478, $04d0, $0058, $04a4, $5252, $0000, $0000, $002b
|
||||
dw $0510, $0538, $0028, $0524, $5252, $0000, $0000, $002c
|
||||
dw $0a48, $0af0, $00a8, $0a9c, $5555, $0000, $0000, $002d
|
||||
dw $0b28, $0b38, $0010, $0b30, $5555, $0000, $0001, $002e
|
||||
dw $0b70, $0ba0, $0030, $0b88, $5555, $0000, $0000, $002f
|
||||
dw $0a40, $0b10, $00d0, $0aa8, $5d5d, $0000, $0000, $0030
|
||||
dw $0350, $0390, $0040, $0370, $5861, $0000, $0000, $0031
|
||||
dw $0670, $06a8, $0038, $068c, $5b63, $0000, $0000, $0032
|
||||
dw $0898, $09b0, $0118, $0924, $5b64, $0000, $0000, $0033
|
||||
dw $0a40, $0ba0, $0160, $0af0, $6565, $0000, $0000, $0034
|
||||
dw $0c70, $0c90, $0020, $0c80, $5e66, $0000, $0000, $0035
|
||||
dw $0f70, $0f80, $0010, $0f78, $5e67, $0000, $0000, $0036
|
||||
dw $0430, $0468, $0038, $044c, $6a6a, $0000, $0000, $0037
|
||||
dw $04d8, $04f8, $0020, $04e8, $6a6a, $0000, $0000, $0038
|
||||
dw $0688, $06b0, $0028, $069c, $6b6b, $0000, $0000, $0039
|
||||
dw $08d0, $08f0, $0020, $08e0, $6c6c, $0000, $0000, $003a
|
||||
dw $0a80, $0b40, $00c0, $0ae0, $6d6d, $0000, $0000, $003b
|
||||
dw $0d38, $0d58, $0020, $0d48, $6e6e, $0000, $0001, $003c
|
||||
dw $0d90, $0da0, $0010, $0d98, $6e6e, $0000, $0000, $003d
|
||||
dw $06a0, $07b0, $0110, $0728, $7373, $0000, $0000, $003e
|
||||
dw $0830, $09b0, $0180, $08f0, $7474, $0000, $0000, $003f
|
||||
dw $0e78, $0e88, $0010, $0e80, $7777, $0000, $0001, $0040
|
||||
dw $0ee0, $0fc0, $00e0, $0f50, $7777, $0000, $0000, $0041
|
||||
dw $0458, $0540, $00e8, $04cc, $0202, $100a, $0000, $0001
|
||||
dw $0058, $0058, $0000, $0058, $0008, $2000, $0000, $0003
|
||||
dw $0178, $0178, $0000, $0178, $0008, $2020, $0000, $0004
|
||||
dw $0388, $0388, $0000, $0388, $0009, $2060, $0000, $0005
|
||||
dw $0480, $05b0, $0130, $0518, $0a0a, $1012, $0000, $0006
|
||||
dw $0f70, $0f90, $0020, $0f80, $0f0f, $1020, $0000, $0007
|
||||
dw $0078, $0098, $0020, $0088, $1010, $1002, $0000, $0008
|
||||
dw $0138, $0158, $0020, $0148, $1010, $101a, $0000, $0009
|
||||
dw $02e8, $0348, $0060, $0318, $1111, $1014, $0000, $000a
|
||||
dw $0478, $04d0, $0058, $04a4, $1212, $1006, $0000, $000b
|
||||
dw $0510, $0538, $0028, $0524, $1212, $1016, $0000, $000c
|
||||
dw $0a48, $0af0, $00a8, $0a9c, $1515, $1004, $0000, $000d
|
||||
dw $0b28, $0b38, $0010, $0b30, $1515, $1018, $0001, $000e
|
||||
dw $0b70, $0ba0, $0030, $0b88, $1515, $1020, $0000, $000f
|
||||
dw $0a40, $0b10, $00d0, $0aa8, $1d1d, $1006, $0000, $0010
|
||||
dw $0350, $0390, $0040, $0370, $1821, $2060, $0000, $0011
|
||||
dw $0670, $06a8, $0038, $068c, $1b23, $2002, $0000, $0012
|
||||
dw $0898, $09b0, $0118, $0924, $1b24, $2054, $0000, $0013
|
||||
dw $0a40, $0ba0, $0160, $0af0, $2525, $100e, $0000, $0014
|
||||
dw $0c70, $0c90, $0020, $0c80, $1e26, $2002, $0000, $0015
|
||||
dw $0f70, $0f80, $0010, $0f78, $1e27, $2060, $0000, $0016
|
||||
dw $0430, $0468, $0038, $044c, $2a2a, $1000, $0000, $0017
|
||||
dw $04d8, $04f8, $0020, $04e8, $2a2a, $100c, $0000, $0018
|
||||
dw $0688, $06b0, $0028, $069c, $2b2b, $1004, $0000, $0019
|
||||
dw $08d0, $08f0, $0020, $08e0, $2c2c, $100e, $0000, $001a
|
||||
dw $0a80, $0b40, $00c0, $0ae0, $2d2d, $100c, $0000, $001b
|
||||
dw $0d38, $0d58, $0020, $0d48, $2e2e, $101a, $0001, $001c
|
||||
dw $0d90, $0da0, $0010, $0d98, $2e2e, $1020, $0000, $001d
|
||||
dw $06a0, $07b0, $0110, $0728, $3333, $1016, $0000, $001e
|
||||
dw $0830, $09b0, $0180, $08f0, $3434, $1010, $0000, $001f
|
||||
dw $0e78, $0e88, $0010, $0e80, $3737, $1002, $0001, $0020
|
||||
dw $0ee0, $0fc0, $00e0, $0f50, $3737, $101c, $0000, $0021
|
||||
dw $0458, $0540, $00e8, $04cc, $4242, $100a, $0000, $0022
|
||||
dw $0058, $0058, $0000, $0058, $4048, $2000, $0000, $0023
|
||||
dw $0178, $0178, $0000, $0178, $4048, $2020, $0000, $0024
|
||||
dw $0388, $0388, $0000, $0388, $4049, $2060, $0000, $0025
|
||||
dw $0480, $05b0, $0130, $0518, $4a4a, $1012, $0000, $0026
|
||||
dw $0f70, $0f90, $0020, $0f80, $4f4f, $1020, $0000, $0027
|
||||
dw $0078, $0098, $0020, $0088, $5050, $1002, $0000, $0028
|
||||
dw $0138, $0158, $0020, $0148, $5050, $101a, $0000, $0029
|
||||
dw $02e8, $0348, $0060, $0318, $5151, $1014, $0000, $002a
|
||||
dw $0478, $04d0, $0058, $04a4, $5252, $1006, $0000, $002b
|
||||
dw $0510, $0538, $0028, $0524, $5252, $1016, $0000, $002c
|
||||
dw $0a48, $0af0, $00a8, $0a9c, $5555, $1004, $0000, $002d
|
||||
dw $0b28, $0b38, $0010, $0b30, $5555, $1018, $0001, $002e
|
||||
dw $0b70, $0ba0, $0030, $0b88, $5555, $1020, $0000, $002f
|
||||
dw $0a40, $0b10, $00d0, $0aa8, $5d5d, $1006, $0000, $0030
|
||||
dw $0350, $0390, $0040, $0370, $5861, $2060, $0000, $0031
|
||||
dw $0670, $06a8, $0038, $068c, $5b63, $2002, $0000, $0032
|
||||
dw $0898, $09b0, $0118, $0924, $5b64, $2054, $0000, $0033
|
||||
dw $0a40, $0ba0, $0160, $0af0, $6565, $100e, $0000, $0034
|
||||
dw $0c70, $0c90, $0020, $0c80, $5e66, $2002, $0000, $0035
|
||||
dw $0f70, $0f80, $0010, $0f78, $5e67, $2060, $0000, $0036
|
||||
dw $0430, $0468, $0038, $044c, $6a6a, $1000, $0000, $0037
|
||||
dw $04d8, $04f8, $0020, $04e8, $6a6a, $100c, $0000, $0038
|
||||
dw $0688, $06b0, $0028, $069c, $6b6b, $1004, $0000, $0039
|
||||
dw $08d0, $08f0, $0020, $08e0, $6c6c, $100e, $0000, $003a
|
||||
dw $0a80, $0b40, $00c0, $0ae0, $6d6d, $100c, $0000, $003b
|
||||
dw $0d38, $0d58, $0020, $0d48, $6e6e, $101a, $0001, $003c
|
||||
dw $0d90, $0da0, $0010, $0d98, $6e6e, $1020, $0000, $003d
|
||||
dw $06a0, $07b0, $0110, $0728, $7373, $1016, $0000, $003e
|
||||
dw $0830, $09b0, $0180, $08f0, $7474, $1010, $0000, $003f
|
||||
dw $0e78, $0e88, $0010, $0e80, $7777, $1002, $0001, $0040
|
||||
dw $0ee0, $0fc0, $00e0, $0f50, $7777, $101c, $0000, $0041
|
||||
dw $0080, $0080, $0000, $0080, $8080, $0000, $0000, $0000 ;Pedestal (unused)
|
||||
dw $0288, $02c0, $0038, $02a4, $8189, $0000, $0000, $0002 ;Zora (unused)
|
||||
dw $0288, $02c0, $0038, $02a4, $8189, $1782, $0000, $0002 ;Zora (unused)
|
||||
OWWestEdges:
|
||||
dw $0070, $00a0, $0030, $0088, $0202, $0000, $0000, $0000
|
||||
dw $0068, $0078, $0010, $0070, $0505, $0000, $0000, $0001
|
||||
dw $0068, $0088, $0020, $0078, $0707, $0000, $0000, $0002
|
||||
dw $0318, $0368, $0050, $0340, $050d, $0000, $0000, $0003
|
||||
dw $0450, $0488, $0038, $046c, $1212, $0000, $0000, $0004
|
||||
dw $0560, $05a0, $0040, $0580, $1212, $0000, $0000, $0005
|
||||
dw $0488, $0500, $0078, $04c4, $1313, $0000, $0000, $0006
|
||||
dw $0538, $05a8, $0070, $0570, $1313, $0000, $0000, $0007
|
||||
dw $0470, $05a8, $0138, $050c, $1414, $0000, $0000, $0008
|
||||
dw $0470, $0598, $0128, $0504, $1515, $0000, $0000, $0009
|
||||
dw $0480, $0488, $0008, $0484, $1616, $0000, $0001, $000a
|
||||
dw $04b0, $0510, $0060, $04e0, $1616, $0000, $0000, $000b
|
||||
dw $0560, $0588, $0028, $0574, $1616, $0000, $0000, $000c
|
||||
dw $0450, $0458, $0008, $0454, $1717, $0000, $0001, $000d
|
||||
dw $0480, $04a8, $0028, $0494, $1717, $0000, $0000, $000e
|
||||
dw $0718, $0738, $0020, $0728, $1b1b, $0000, $0000, $000f
|
||||
dw $0908, $0948, $0040, $0928, $2222, $0000, $0000, $0010
|
||||
dw $0878, $08a8, $0030, $0890, $2525, $0000, $0000, $0011
|
||||
dw $0bb8, $0bc8, $0010, $0bc0, $2929, $0000, $0000, $0012
|
||||
dw $0b60, $0ba0, $0040, $0b80, $2a2a, $0000, $0000, $0013
|
||||
dw $0ab0, $0ad0, $0020, $0ac0, $2c2c, $0000, $0000, $0014
|
||||
dw $0af0, $0b40, $0050, $0b18, $2c2c, $0000, $0000, $0015
|
||||
dw $0b78, $0ba0, $0028, $0b8c, $2c2c, $0000, $0000, $0016
|
||||
dw $0b10, $0b28, $0018, $0b1c, $2d2d, $0000, $0001, $604a ;Stone Bridge (exit only)
|
||||
dw $0b68, $0b98, $0030, $0b80, $2d2d, $0000, $0000, $0017
|
||||
dw $0a68, $0ab8, $0050, $0a90, $2e2e, $0000, $0000, $0018
|
||||
dw $0b00, $0b78, $0078, $0b3c, $2e2e, $0000, $0001, $0019
|
||||
dw $0c50, $0db8, $0168, $0d04, $3333, $0000, $0000, $001a
|
||||
dw $0c78, $0ce3, $006b, $0cad, $3434, $0000, $0000, $001b
|
||||
dw $0ce4, $0d33, $004f, $0d0b, $3434, $0000, $0001, $001c
|
||||
dw $0d34, $0db8, $0084, $0d76, $3434, $0000, $0000, $001d
|
||||
dw $0ea8, $0f20, $0078, $0ee4, $3a3a, $0000, $0000, $001e
|
||||
dw $0f78, $0fa8, $0030, $0f90, $3a3a, $0000, $0000, $001f
|
||||
dw $0f18, $0f18, $0000, $0f18, $3b3b, $0000, $0000, $0020
|
||||
dw $0fc8, $0fc8, $0000, $0fc8, $3b3b, $0000, $0000, $0021
|
||||
dw $0e28, $0fb8, $0190, $0ef0, $3c3c, $0000, $0000, $0022
|
||||
dw $0f78, $0fb8, $0040, $0f98, $353d, $0000, $0000, $0023
|
||||
dw $0f20, $0f40, $0020, $0f30, $3f3f, $0000, $0001, $0024
|
||||
dw $0f70, $0fb8, $0048, $0f94, $3f3f, $0000, $0000, $0025
|
||||
dw $0070, $00a0, $0030, $0088, $4242, $0000, $0000, $0026
|
||||
dw $0068, $0078, $0010, $0070, $4545, $0000, $0000, $0027
|
||||
dw $0068, $0088, $0020, $0078, $4747, $0000, $0000, $0028
|
||||
dw $0318, $0368, $0050, $0340, $454d, $0000, $0000, $0029
|
||||
dw $0450, $0488, $0038, $046c, $5252, $0000, $0000, $002a
|
||||
dw $0560, $05a0, $0040, $0580, $5252, $0000, $0000, $002b
|
||||
dw $0488, $0500, $0078, $04c4, $5353, $0000, $0000, $002c
|
||||
dw $0538, $05a8, $0070, $0570, $5353, $0000, $0000, $002d
|
||||
dw $0470, $05a8, $0138, $050c, $5454, $0000, $0000, $002e
|
||||
dw $0470, $0598, $0128, $0504, $5555, $0000, $0000, $002f
|
||||
dw $0480, $0488, $0008, $0484, $5656, $0000, $0001, $0030
|
||||
dw $04b0, $0510, $0060, $04e0, $5656, $0000, $0000, $0031
|
||||
dw $0560, $0588, $0028, $0574, $5656, $0000, $0000, $0032
|
||||
dw $0450, $0458, $0008, $0454, $5757, $0000, $0001, $0033
|
||||
dw $0480, $04a8, $0028, $0494, $5757, $0000, $0000, $0034
|
||||
dw $0908, $0948, $0040, $0928, $6262, $0000, $0000, $0035
|
||||
dw $0878, $08a8, $0030, $0890, $6565, $0000, $0000, $0036
|
||||
dw $0b60, $0b68, $0008, $0b64, $6969, $0000, $0000, $0037
|
||||
dw $0bb8, $0bc8, $0010, $0bc0, $6969, $0000, $0000, $0038
|
||||
dw $0b60, $0ba0, $0040, $0b80, $6a6a, $0000, $0000, $0039
|
||||
dw $0ab0, $0ad0, $0020, $0ac0, $6c6c, $0000, $0000, $003a
|
||||
dw $0af0, $0b40, $0050, $0b18, $6c6c, $0000, $0000, $003b
|
||||
dw $0b78, $0ba0, $0028, $0b8c, $6c6c, $0000, $0000, $003c
|
||||
dw $0b68, $0b98, $0030, $0b80, $6d6d, $0000, $0000, $003d
|
||||
dw $0a68, $0ab8, $0050, $0a90, $6e6e, $0000, $0000, $003e
|
||||
dw $0b00, $0b78, $0078, $0b3c, $6e6e, $0000, $0001, $003f
|
||||
dw $0c50, $0db8, $0168, $0d04, $7373, $0000, $0000, $0040
|
||||
dw $0c78, $0ce3, $006b, $0cad, $7474, $0000, $0000, $0041
|
||||
dw $0ce4, $0d33, $004f, $0d0b, $7474, $0000, $0001, $0042
|
||||
dw $0d34, $0db8, $0084, $0d76, $7474, $0000, $0000, $0043
|
||||
dw $0f18, $0f18, $0000, $0f18, $7b7b, $0000, $0000, $0044
|
||||
dw $0fc8, $0fc8, $0000, $0fc8, $7b7b, $0000, $0000, $0045
|
||||
dw $0e28, $0fb8, $0190, $0ef0, $7c7c, $0000, $0000, $0046
|
||||
dw $0f78, $0fb8, $0040, $0f98, $757d, $0000, $0000, $0047
|
||||
dw $0f20, $0f40, $0020, $0f30, $7f7f, $0000, $0001, $0048
|
||||
dw $0f70, $0fb8, $0048, $0f94, $7f7f, $0000, $0000, $0049
|
||||
dw $0070, $00a0, $0030, $0088, $0202, $00e0, $0000, $0000
|
||||
dw $0068, $0078, $0010, $0070, $0505, $0060, $0000, $0001
|
||||
dw $0068, $0088, $0020, $0078, $0707, $00e0, $0000, $0002
|
||||
dw $0318, $0368, $0050, $0340, $050d, $1660, $0000, $0003
|
||||
dw $0450, $0488, $0038, $046c, $1212, $00e0, $0000, $0004
|
||||
dw $0560, $05a0, $0040, $0580, $1212, $08e0, $0000, $0005
|
||||
dw $0488, $0500, $0078, $04c4, $1313, $0360, $0000, $0006
|
||||
dw $0538, $05a8, $0070, $0570, $1313, $08e0, $0000, $0007
|
||||
dw $0470, $05a8, $0138, $050c, $1414, $04e0, $0000, $0008
|
||||
dw $0470, $0598, $0128, $0504, $1515, $04e0, $0000, $0009
|
||||
dw $0480, $0488, $0008, $0484, $1616, $01e0, $0001, $000a
|
||||
dw $04b0, $0510, $0060, $04e0, $1616, $04e0, $0000, $000b
|
||||
dw $0560, $0588, $0028, $0574, $1616, $08e0, $0000, $000c
|
||||
dw $0450, $0458, $0008, $0454, $1717, $00e0, $0001, $000d
|
||||
dw $0480, $04a8, $0028, $0494, $1717, $01e0, $0000, $000e
|
||||
dw $0718, $0738, $0020, $0728, $1b1b, $06e0, $0000, $000f
|
||||
dw $0908, $0948, $0040, $0928, $2222, $05e0, $0000, $0010
|
||||
dw $0878, $08a8, $0030, $0890, $2525, $01e0, $0000, $0011
|
||||
dw $0bb8, $0bc8, $0010, $0bc0, $2929, $0960, $0000, $0012
|
||||
dw $0b60, $0ba0, $0040, $0b80, $2a2a, $0960, $0000, $0013
|
||||
dw $0ab0, $0ad0, $0020, $0ac0, $2c2c, $0360, $0000, $0014
|
||||
dw $0af0, $0b40, $0050, $0b18, $2c2c, $05e0, $0000, $0015
|
||||
dw $0b78, $0ba0, $0028, $0b8c, $2c2c, $08a0, $0000, $0016
|
||||
dw $0b10, $0b28, $0018, $0b1c, $2d2d, $061c, $0001, $604a ;Stone Bridge (exit only)
|
||||
dw $0b68, $0b98, $0030, $0b80, $2d2d, $08e0, $0000, $0017
|
||||
dw $0a68, $0ab8, $0050, $0a90, $2e2e, $01e0, $0000, $0018
|
||||
dw $0b00, $0b78, $0078, $0b3c, $2e2e, $0660, $0001, $0019
|
||||
dw $0c50, $0db8, $0168, $0d04, $3333, $05e0, $0000, $001a
|
||||
dw $0c78, $0ce3, $006b, $0cad, $3434, $02e0, $0000, $001b
|
||||
dw $0ce4, $0d33, $004f, $0d0b, $3434, $05e0, $0001, $001c
|
||||
dw $0d34, $0db8, $0084, $0d76, $3434, $08e0, $0000, $001d
|
||||
dw $0ea8, $0f20, $0078, $0ee4, $3a3a, $03e0, $0000, $001e
|
||||
dw $0f78, $0fa8, $0030, $0f90, $3a3a, $0860, $0000, $001f
|
||||
dw $0f18, $0f18, $0000, $0f18, $3b3b, $0660, $0000, $0020
|
||||
dw $0fc8, $0fc8, $0000, $0fc8, $3b3b, $08e0, $0000, $0021
|
||||
dw $0e28, $0fb8, $0190, $0ef0, $3c3c, $04e0, $0000, $0022
|
||||
dw $0f78, $0fb8, $0040, $0f98, $353d, $1860, $0000, $0023
|
||||
dw $0f20, $0f40, $0020, $0f30, $3f3f, $05e0, $0001, $0024
|
||||
dw $0f70, $0fb8, $0048, $0f94, $3f3f, $0860, $0000, $0025
|
||||
dw $0070, $00a0, $0030, $0088, $4242, $00e0, $0000, $0026
|
||||
dw $0068, $0078, $0010, $0070, $4545, $0060, $0000, $0027
|
||||
dw $0068, $0088, $0020, $0078, $4747, $00e0, $0000, $0028
|
||||
dw $0318, $0368, $0050, $0340, $454d, $1660, $0000, $0029
|
||||
dw $0450, $0488, $0038, $046c, $5252, $00e0, $0000, $002a
|
||||
dw $0560, $05a0, $0040, $0580, $5252, $08e0, $0000, $002b
|
||||
dw $0488, $0500, $0078, $04c4, $5353, $0360, $0000, $002c
|
||||
dw $0538, $05a8, $0070, $0570, $5353, $08e0, $0000, $002d
|
||||
dw $0470, $05a8, $0138, $050c, $5454, $04e0, $0000, $002e
|
||||
dw $0470, $0598, $0128, $0504, $5555, $04e0, $0000, $002f
|
||||
dw $0480, $0488, $0008, $0484, $5656, $01e0, $0001, $0030
|
||||
dw $04b0, $0510, $0060, $04e0, $5656, $04e0, $0000, $0031
|
||||
dw $0560, $0588, $0028, $0574, $5656, $08e0, $0000, $0032
|
||||
dw $0450, $0458, $0008, $0454, $5757, $00e0, $0001, $0033
|
||||
dw $0480, $04a8, $0028, $0494, $5757, $01e0, $0000, $0034
|
||||
dw $0908, $0948, $0040, $0928, $6262, $05e0, $0000, $0035
|
||||
dw $0878, $08a8, $0030, $0890, $6565, $01e0, $0000, $0036
|
||||
dw $0b60, $0b68, $0008, $0b64, $6969, $08e0, $0000, $0037
|
||||
dw $0bb8, $0bc8, $0010, $0bc0, $6969, $0960, $0000, $0038
|
||||
dw $0b60, $0ba0, $0040, $0b80, $6a6a, $0960, $0000, $0039
|
||||
dw $0ab0, $0ad0, $0020, $0ac0, $6c6c, $0360, $0000, $003a
|
||||
dw $0af0, $0b40, $0050, $0b18, $6c6c, $05e0, $0000, $003b
|
||||
dw $0b78, $0ba0, $0028, $0b8c, $6c6c, $08a0, $0000, $003c
|
||||
dw $0b68, $0b98, $0030, $0b80, $6d6d, $08e0, $0000, $003d
|
||||
dw $0a68, $0ab8, $0050, $0a90, $6e6e, $01e0, $0000, $003e
|
||||
dw $0b00, $0b78, $0078, $0b3c, $6e6e, $0660, $0001, $003f
|
||||
dw $0c50, $0db8, $0168, $0d04, $7373, $05e0, $0000, $0040
|
||||
dw $0c78, $0ce3, $006b, $0cad, $7474, $02e0, $0000, $0041
|
||||
dw $0ce4, $0d33, $004f, $0d0b, $7474, $05e0, $0001, $0042
|
||||
dw $0d34, $0db8, $0084, $0d76, $7474, $08e0, $0000, $0043
|
||||
dw $0f18, $0f18, $0000, $0f18, $7b7b, $0660, $0000, $0044
|
||||
dw $0fc8, $0fc8, $0000, $0fc8, $7b7b, $08e0, $0000, $0045
|
||||
dw $0e28, $0fb8, $0190, $0ef0, $7c7c, $04e0, $0000, $0046
|
||||
dw $0f78, $0fb8, $0040, $0f98, $757d, $1860, $0000, $0047
|
||||
dw $0f20, $0f40, $0020, $0f30, $7f7f, $05e0, $0001, $0048
|
||||
dw $0f70, $0fb8, $0048, $0f94, $7f7f, $0860, $0000, $0049
|
||||
OWEastEdges:
|
||||
dw $0070, $00a0, $0030, $0088, $0001, $0000, $0000, $0000
|
||||
dw $0068, $0078, $0010, $0070, $0304, $0000, $0000, $0001
|
||||
dw $0068, $0088, $0020, $0078, $0506, $0000, $0000, $0002
|
||||
dw $0318, $0368, $0050, $0340, $030c, $0000, $0000, $0003
|
||||
dw $0450, $0488, $0038, $046c, $1111, $0000, $0000, $0004
|
||||
dw $0560, $05a0, $0040, $0580, $1111, $0000, $0000, $0005
|
||||
dw $0488, $0500, $0078, $04c4, $1212, $0000, $0000, $0006
|
||||
dw $0538, $05a8, $0070, $0570, $1212, $0000, $0000, $0007
|
||||
dw $0470, $05a8, $0138, $050c, $1313, $0000, $0000, $0008
|
||||
dw $0470, $0598, $0128, $0504, $1414, $0000, $0000, $0009
|
||||
dw $0480, $0488, $0008, $0484, $1515, $0000, $0001, $000a
|
||||
dw $04b0, $0510, $0060, $04e0, $1515, $0000, $0000, $000b
|
||||
dw $0560, $0588, $0028, $0574, $1515, $0000, $0000, $000c
|
||||
dw $0450, $0458, $0008, $0454, $1616, $0000, $0001, $000d
|
||||
dw $0480, $04a8, $0028, $0494, $1616, $0000, $0000, $000e
|
||||
dw $0718, $0738, $0020, $0728, $1a1a, $0000, $0000, $000f
|
||||
dw $0908, $0948, $0040, $0928, $1821, $0000, $0000, $0010
|
||||
dw $0878, $08a8, $0030, $0890, $1b24, $0000, $0000, $0011
|
||||
dw $0bb8, $0bc8, $0010, $0bc0, $2828, $0000, $0000, $0012 ;Race Game
|
||||
dw $0b60, $0ba0, $0040, $0b80, $2929, $0000, $0000, $0013
|
||||
dw $0ab0, $0ad0, $0020, $0ac0, $2b2b, $0000, $0000, $0014
|
||||
dw $0af0, $0b40, $0050, $0b18, $2b2b, $0000, $0000, $0015
|
||||
dw $0b78, $0ba0, $0028, $0b8c, $2b2b, $0000, $0000, $0016
|
||||
dw $0b68, $0b98, $0030, $0b80, $2c2c, $0000, $0000, $0018
|
||||
dw $0a68, $0ab8, $0050, $0a90, $2d2d, $0000, $0000, $0019
|
||||
dw $0b00, $0b78, $0078, $0b3c, $2d2d, $0000, $0001, $001a
|
||||
dw $0c50, $0db8, $0168, $0d04, $3232, $0000, $0000, $001b
|
||||
dw $0c78, $0ce3, $006b, $0cad, $3333, $0000, $0000, $001c
|
||||
dw $0ce4, $0d33, $004f, $0d0b, $3333, $0000, $0001, $001d
|
||||
dw $0d34, $0db8, $0084, $0d76, $3333, $0000, $0000, $001e
|
||||
dw $0ea8, $0f20, $0078, $0ee4, $3039, $0000, $0000, $001f
|
||||
dw $0f78, $0fa8, $0030, $0f90, $3039, $0000, $0000, $0020
|
||||
dw $0f18, $0f18, $0000, $0f18, $3a3a, $0000, $0000, $0021
|
||||
dw $0fc8, $0fc8, $0000, $0fc8, $3a3a, $0000, $0000, $0022
|
||||
dw $0e28, $0fb8, $0190, $0ef0, $3b3b, $0000, $0000, $0023
|
||||
dw $0f78, $0fb8, $0040, $0f98, $3c3c, $0000, $0000, $0024
|
||||
dw $0f20, $0f40, $0020, $0f30, $353e, $0000, $0001, $0025
|
||||
dw $0f70, $0fb8, $0048, $0f94, $353e, $0000, $0000, $0026
|
||||
dw $0070, $00a0, $0030, $0088, $4041, $0000, $0000, $0027 ;Skull Woods
|
||||
dw $0068, $0078, $0010, $0070, $4344, $0000, $0000, $0028
|
||||
dw $0068, $0088, $0020, $0078, $4546, $0000, $0000, $0029
|
||||
dw $0318, $0368, $0050, $0340, $434c, $0000, $0000, $002a
|
||||
dw $0450, $0488, $0038, $046c, $5151, $0000, $0000, $002b
|
||||
dw $0560, $05a0, $0040, $0580, $5151, $0000, $0000, $002c
|
||||
dw $0488, $0500, $0078, $04c4, $5252, $0000, $0000, $002d
|
||||
dw $0538, $05a8, $0070, $0570, $5252, $0000, $0000, $002e
|
||||
dw $0470, $05a8, $0138, $050c, $5353, $0000, $0000, $002f
|
||||
dw $0470, $0598, $0128, $0504, $5454, $0000, $0000, $0030
|
||||
dw $0480, $0488, $0008, $0484, $5555, $0000, $0001, $0031
|
||||
dw $04b0, $0510, $0060, $04e0, $5555, $0000, $0000, $0032
|
||||
dw $0560, $0588, $0028, $0574, $5555, $0000, $0000, $0033
|
||||
dw $0450, $0458, $0008, $0454, $5656, $0000, $0001, $0034
|
||||
dw $0480, $04a8, $0028, $0494, $5656, $0000, $0000, $0035
|
||||
dw $0908, $0948, $0040, $0928, $5861, $0000, $0000, $0036
|
||||
dw $0878, $08a8, $0030, $0890, $5b64, $0000, $0000, $0037
|
||||
dw $0b60, $0b68, $0008, $0b64, $6868, $0000, $0000, $0038 ;Dig Game
|
||||
dw $0bb8, $0bc8, $0010, $0bc0, $6868, $0000, $0000, $0039
|
||||
dw $0b60, $0ba0, $0040, $0b80, $6969, $0000, $0000, $003a
|
||||
dw $0ab0, $0ad0, $0020, $0ac0, $6b6b, $0000, $0000, $003b
|
||||
dw $0af0, $0b40, $0050, $0b18, $6b6b, $0000, $0000, $003c
|
||||
dw $0b78, $0ba0, $0028, $0b8c, $6b6b, $0000, $0000, $003d
|
||||
dw $0b68, $0b98, $0030, $0b80, $6c6c, $0000, $0000, $003e
|
||||
dw $0a68, $0ab8, $0050, $0a90, $6d6d, $0000, $0000, $003f
|
||||
dw $0b00, $0b78, $0078, $0b3c, $6d6d, $0000, $0001, $0040
|
||||
dw $0c50, $0db8, $0168, $0d04, $7272, $0000, $0000, $0041
|
||||
dw $0c78, $0ce3, $006b, $0cad, $7373, $0000, $0000, $0042
|
||||
dw $0ce4, $0d33, $004f, $0d0b, $7373, $0000, $0001, $0043
|
||||
dw $0d34, $0db8, $0084, $0d76, $7373, $0000, $0000, $0044
|
||||
dw $0f18, $0f18, $0000, $0f18, $7a7a, $0000, $0000, $0045
|
||||
dw $0fc8, $0fc8, $0000, $0fc8, $7a7a, $0000, $0000, $0046
|
||||
dw $0e28, $0fb8, $0190, $0ef0, $7b7b, $0000, $0000, $0047
|
||||
dw $0f78, $0fb8, $0040, $0f98, $7c7c, $0000, $0000, $0048
|
||||
dw $0f20, $0f40, $0020, $0f30, $757e, $0000, $0001, $0049
|
||||
dw $0f70, $0fb8, $0048, $0f94, $757e, $0000, $0000, $004a
|
||||
dw $0058, $00c0, $0068, $008c, $8080, $0000, $0001, $0017 ;Hobo (unused)
|
||||
dw $0070, $00a0, $0030, $0088, $0001, $0180, $0000, $0000
|
||||
dw $0068, $0078, $0010, $0070, $0304, $0180, $0000, $0001
|
||||
dw $0068, $0088, $0020, $0078, $0506, $0180, $0000, $0002
|
||||
dw $0318, $0368, $0050, $0340, $030c, $1780, $0000, $0003
|
||||
dw $0450, $0488, $0038, $046c, $1111, $00c0, $0000, $0004
|
||||
dw $0560, $05a0, $0040, $0580, $1111, $08c0, $0000, $0005
|
||||
dw $0488, $0500, $0078, $04c4, $1212, $0340, $0000, $0006
|
||||
dw $0538, $05a8, $0070, $0570, $1212, $08c0, $0000, $0007
|
||||
dw $0470, $05a8, $0138, $050c, $1313, $04c0, $0000, $0008
|
||||
dw $0470, $0598, $0128, $0504, $1414, $04c0, $0000, $0009
|
||||
dw $0480, $0488, $0008, $0484, $1515, $01c0, $0001, $000a
|
||||
dw $04b0, $0510, $0060, $04e0, $1515, $04c0, $0000, $000b
|
||||
dw $0560, $0588, $0028, $0574, $1515, $08c0, $0000, $000c
|
||||
dw $0450, $0458, $0008, $0454, $1616, $00c0, $0001, $000d
|
||||
dw $0480, $04a8, $0028, $0494, $1616, $01c0, $0000, $000e
|
||||
dw $0718, $0738, $0020, $0728, $1a1a, $06c0, $0000, $000f
|
||||
dw $0908, $0948, $0040, $0928, $1821, $1680, $0000, $0010
|
||||
dw $0878, $08a8, $0030, $0890, $1b24, $1280, $0000, $0011
|
||||
dw $0bb8, $0bc8, $0010, $0bc0, $2828, $0940, $0000, $0012 ;Race Game
|
||||
dw $0b60, $0ba0, $0040, $0b80, $2929, $0940, $0000, $0013
|
||||
dw $0ab0, $0ad0, $0020, $0ac0, $2b2b, $0340, $0000, $0014
|
||||
dw $0af0, $0b40, $0050, $0b18, $2b2b, $05c0, $0000, $0015
|
||||
dw $0b78, $0ba0, $0028, $0b8c, $2b2b, $08c0, $0000, $0016
|
||||
dw $0b68, $0b98, $0030, $0b80, $2c2c, $08c0, $0000, $0018
|
||||
dw $0a68, $0ab8, $0050, $0a90, $2d2d, $01c0, $0000, $0019
|
||||
dw $0b00, $0b78, $0078, $0b3c, $2d2d, $0640, $0001, $001a
|
||||
dw $0c50, $0db8, $0168, $0d04, $3232, $05c0, $0000, $001b
|
||||
dw $0c78, $0ce3, $006b, $0cad, $3333, $02c0, $0000, $001c
|
||||
dw $0ce4, $0d33, $004f, $0d0b, $3333, $05c0, $0001, $001d
|
||||
dw $0d34, $0db8, $0084, $0d76, $3333, $08c0, $0000, $001e
|
||||
dw $0ea8, $0f20, $0078, $0ee4, $3039, $1480, $0000, $001f
|
||||
dw $0f78, $0fa8, $0030, $0f90, $3039, $1980, $0000, $0020
|
||||
dw $0f18, $0f18, $0000, $0f18, $3a3a, $0640, $0000, $0021
|
||||
dw $0fc8, $0fc8, $0000, $0fc8, $3a3a, $08c0, $0000, $0022
|
||||
dw $0e28, $0fb8, $0190, $0ef0, $3b3b, $04c0, $0000, $0023
|
||||
dw $0f78, $0fb8, $0040, $0f98, $3c3c, $08c0, $0000, $0024
|
||||
dw $0f20, $0f40, $0020, $0f30, $353e, $1680, $0001, $0025
|
||||
dw $0f70, $0fb8, $0048, $0f94, $353e, $1880, $0000, $0026
|
||||
dw $0070, $00a0, $0030, $0088, $4041, $0180, $0000, $0027 ;Skull Woods
|
||||
dw $0068, $0078, $0010, $0070, $4344, $0180, $0000, $0028
|
||||
dw $0068, $0088, $0020, $0078, $4546, $0180, $0000, $0029
|
||||
dw $0318, $0368, $0050, $0340, $434c, $1780, $0000, $002a
|
||||
dw $0450, $0488, $0038, $046c, $5151, $00c0, $0000, $002b
|
||||
dw $0560, $05a0, $0040, $0580, $5151, $08c0, $0000, $002c
|
||||
dw $0488, $0500, $0078, $04c4, $5252, $0340, $0000, $002d
|
||||
dw $0538, $05a8, $0070, $0570, $5252, $08c0, $0000, $002e
|
||||
dw $0470, $05a8, $0138, $050c, $5353, $04c0, $0000, $002f
|
||||
dw $0470, $0598, $0128, $0504, $5454, $04c0, $0000, $0030
|
||||
dw $0480, $0488, $0008, $0484, $5555, $01c0, $0001, $0031
|
||||
dw $04b0, $0510, $0060, $04e0, $5555, $04c0, $0000, $0032
|
||||
dw $0560, $0588, $0028, $0574, $5555, $08c0, $0000, $0033
|
||||
dw $0450, $0458, $0008, $0454, $5656, $00c0, $0001, $0034
|
||||
dw $0480, $04a8, $0028, $0494, $5656, $01c0, $0000, $0035
|
||||
dw $0908, $0948, $0040, $0928, $5861, $1680, $0000, $0036
|
||||
dw $0878, $08a8, $0030, $0890, $5b64, $1280, $0000, $0037
|
||||
dw $0b60, $0b68, $0008, $0b64, $6868, $08c0, $0000, $0038 ;Dig Game
|
||||
dw $0bb8, $0bc8, $0010, $0bc0, $6868, $0940, $0000, $0039
|
||||
dw $0b60, $0ba0, $0040, $0b80, $6969, $0940, $0000, $003a
|
||||
dw $0ab0, $0ad0, $0020, $0ac0, $6b6b, $0340, $0000, $003b
|
||||
dw $0af0, $0b40, $0050, $0b18, $6b6b, $05c0, $0000, $003c
|
||||
dw $0b78, $0ba0, $0028, $0b8c, $6b6b, $08c0, $0000, $003d
|
||||
dw $0b68, $0b98, $0030, $0b80, $6c6c, $08c0, $0000, $003e
|
||||
dw $0a68, $0ab8, $0050, $0a90, $6d6d, $01c0, $0000, $003f
|
||||
dw $0b00, $0b78, $0078, $0b3c, $6d6d, $0640, $0001, $0040
|
||||
dw $0c50, $0db8, $0168, $0d04, $7272, $05c0, $0000, $0041
|
||||
dw $0c78, $0ce3, $006b, $0cad, $7373, $02c0, $0000, $0042
|
||||
dw $0ce4, $0d33, $004f, $0d0b, $7373, $05c0, $0001, $0043
|
||||
dw $0d34, $0db8, $0084, $0d76, $7373, $08c0, $0000, $0044
|
||||
dw $0f18, $0f18, $0000, $0f18, $7a7a, $0640, $0000, $0045
|
||||
dw $0fc8, $0fc8, $0000, $0fc8, $7a7a, $08c0, $0000, $0046
|
||||
dw $0e28, $0fb8, $0190, $0ef0, $7b7b, $04c0, $0000, $0047
|
||||
dw $0f78, $0fb8, $0040, $0f98, $7c7c, $08c0, $0000, $0048
|
||||
dw $0f20, $0f40, $0020, $0f30, $757e, $1680, $0001, $0049
|
||||
dw $0f70, $0fb8, $0048, $0f94, $757e, $1880, $0000, $004a
|
||||
dw $0058, $00c0, $0068, $008c, $8080, $0020, $0001, $0017 ;Hobo (unused)
|
||||
|
||||
org $aab9a0 ;PC 1539a0
|
||||
OWSpecialDestIndex:
|
||||
@@ -1818,4 +1839,4 @@ db $18, $0A, $D8 ; yx:{ 0x180, 0x0A0 }
|
||||
db $18, $0F, $45 ; yx:{ 0x180, 0x0F0 }
|
||||
db $FF ; END
|
||||
org $89CA55
|
||||
dw Overworld_Sprites_Screen1A_2&$FFFF
|
||||
dw Overworld_Sprites_Screen1A_2&$FFFF
|
||||
|
||||
@@ -168,7 +168,7 @@ RTL
|
||||
;--------------------------------------------------------------------------------
|
||||
ChangeBootsColorForFakeBoots:
|
||||
LDA.l FakeBoots : AND.w #$00FF : BEQ +
|
||||
LDA.l EquipmentSRAM+$15 : AND.w #$00FF : BNE +
|
||||
LDA.l BootsEquipment : AND.w #$00FF : BNE +
|
||||
LDA.w #$F851 ; address of ItemMenu_ItemIcons_usused_nothing, which has the fake boots now
|
||||
BRA ++
|
||||
+ LDA.w #$F821 ; address of ItemMenu_ItemIcons_boots
|
||||
|
||||
150
pseudoflute.asm
Normal file
150
pseudoflute.asm
Normal file
@@ -0,0 +1,150 @@
|
||||
SelectFirstFluteSpot:
|
||||
LDA.l FluteBitfield
|
||||
BNE +
|
||||
RTL
|
||||
+ LDA.b #$07
|
||||
STA.w $1AF0
|
||||
.try_next
|
||||
LDA.w $1AF0
|
||||
INC A
|
||||
AND.b #$07
|
||||
STA.w $1AF0
|
||||
TAX
|
||||
|
||||
LDA.l FluteBitfield
|
||||
AND.l $8AB7A3, X
|
||||
BEQ .try_next
|
||||
RTL
|
||||
|
||||
SelectFluteNext:
|
||||
LDA.l FluteBitfield
|
||||
BEQ InvalidBeep
|
||||
|
||||
.try_next
|
||||
LDA.w $1AF0
|
||||
INC A
|
||||
AND.b #$07
|
||||
STA.w $1AF0
|
||||
TAX
|
||||
|
||||
LDA.l FluteBitfield
|
||||
AND.l $8AB7A3, X
|
||||
BEQ .try_next
|
||||
|
||||
LDA.b #$20
|
||||
STA.w $012F
|
||||
RTL
|
||||
|
||||
SelectFlutePrev:
|
||||
LDA.l FluteBitfield
|
||||
BEQ InvalidBeep
|
||||
|
||||
.try_next
|
||||
LDA.w $1AF0
|
||||
DEC A
|
||||
AND.b #$07
|
||||
STA.w $1AF0
|
||||
TAX
|
||||
|
||||
LDA.l FluteBitfield
|
||||
AND.l $8AB7A3, X
|
||||
BEQ .try_next
|
||||
|
||||
LDA.b #$20
|
||||
STA.w $012F
|
||||
RTL
|
||||
|
||||
InvalidBeep:
|
||||
LDA.b #$3C
|
||||
STA.w $012E
|
||||
RTL
|
||||
|
||||
SetFluteSpotPalette:
|
||||
XBA
|
||||
LDA.l FluteBitfield
|
||||
AND.l $8AB7A3, X
|
||||
BEQ .disabled
|
||||
.enabled
|
||||
XBA
|
||||
STA.b $0C
|
||||
BRA .done
|
||||
.disabled
|
||||
LDA.b #$30
|
||||
STA.b $0C
|
||||
.done
|
||||
LDA.b #$00
|
||||
STA.b $0B
|
||||
RTL
|
||||
|
||||
MaybeMarkFluteSpotVisited:
|
||||
; don't ever allow the portal in desert/mire to be marked visited
|
||||
CMP.b #$30 : BEQ .done
|
||||
CMP.b #$70 : BEQ .done
|
||||
|
||||
LDX.b #$0E
|
||||
.next
|
||||
CMP.l $02E849, X
|
||||
BEQ .mark
|
||||
DEX : DEX
|
||||
BPL .next
|
||||
BRA .done
|
||||
|
||||
.mark
|
||||
TXA
|
||||
LSR A
|
||||
TAX
|
||||
LDA.l FluteBitfield
|
||||
ORA.l $8AB7A3, X
|
||||
STA.l FluteBitfield
|
||||
|
||||
.done
|
||||
RTL
|
||||
|
||||
CheckEnterOverworld:
|
||||
LDA.l $7EC213
|
||||
STA.b $8A ; what we wrote over
|
||||
SEP #$20
|
||||
JSL MaybeMarkFluteSpotVisited
|
||||
REP #$20
|
||||
RTL
|
||||
|
||||
CheckTransitionOverworld:
|
||||
STA.b $8A
|
||||
STA.w $040A ; what we wrote over
|
||||
JML MaybeMarkFluteSpotVisited
|
||||
|
||||
DrawFluteIcon:
|
||||
AND.w #$00FF
|
||||
CMP.w #$0002
|
||||
BCC .write
|
||||
LDA.l FluteBitfield
|
||||
AND.w #$00FF
|
||||
CMP.w #$00FF
|
||||
BNE .pseudo
|
||||
.real
|
||||
LDA.w #$0003
|
||||
BRA .write
|
||||
.pseudo
|
||||
LDA.w #$0002
|
||||
.write
|
||||
STA.b $02
|
||||
RTL
|
||||
|
||||
CheckFluteInHUD:
|
||||
LDA.l $7EF33F, X
|
||||
AND.w #$00FF ; what we wrote over
|
||||
CPX.w #$000D
|
||||
BNE .done
|
||||
CMP.w #$0002
|
||||
BCC .done
|
||||
LDA.l FluteBitfield
|
||||
AND.w #$00FF
|
||||
CMP.w #$00FF
|
||||
BNE .pseudo
|
||||
.real
|
||||
LDA.w #$0003
|
||||
BRA .done
|
||||
.pseudo
|
||||
LDA.w #$0002
|
||||
.done
|
||||
RTL
|
||||
21
ram.asm
21
ram.asm
@@ -221,6 +221,8 @@ ItemReceiptMethod = $7E02E9 ;
|
||||
;
|
||||
TileActBE = $7E02EF ; Bitfield used by breakables and entrances. b b b b d d d d
|
||||
; b = Breakables | d = Entrances
|
||||
LinkThud = $7E02F8 ; When set, guarantees a thud on landing
|
||||
FollowerNoDraw = $7E02F9 ; When set, prevents follower from drawing and forces a game mode check
|
||||
UseY1 = $7E0301 ; Bitfield for Y-item usage: b p - a x z h r
|
||||
; b = Boomerang | p = Powder | a = Bow | x = Hammer (tested, never set)
|
||||
; z = Rods (tested, never set) | h = Hammer | r = Rods
|
||||
@@ -270,6 +272,8 @@ DungeonID = $7E040C ; High byte mostly unused but sometimes read.
|
||||
;
|
||||
TransitionDirection = $7E0418 ; OW: 0=N 1=S 2=W 3=E UW: 0=S 1=N 2=E 3=W
|
||||
;
|
||||
ManipIndex = $7E042C ; Index of manipulable tile. Word length.
|
||||
;
|
||||
TrapDoorFlag = $7E0468 ; Flag that is set when trap doors are down. 2 bytes
|
||||
;
|
||||
LayerAdjustment = $7E047A ; Flags layer adjustments. Arms EG.
|
||||
@@ -283,6 +287,8 @@ OWEntranceCutscene = $7E04C6 ;
|
||||
;
|
||||
HeartBeepTimer = $7E04CA ;
|
||||
;
|
||||
ManipTileMapX = $7E0540 ; Tilemap X position of manipulable tile. $10 x 2 bytes
|
||||
;
|
||||
CameraTargetN = $7E0610 ; Camera scroll target for directions NSEW
|
||||
CameraTargetS = $7E0612 ;
|
||||
CameraTargetW = $7E0614 ;
|
||||
@@ -324,7 +330,7 @@ SpawnedItemFlag = $7E0726 ; 0x02 - one for pot, 2 for sprite drop
|
||||
SpawnedItemMWPlayer = $7E0728 ; Player Id for spawned item if Multiworld item 0x02
|
||||
;
|
||||
EnemyDropIndicator = $7E072A ; Used by HUD to indicate enemy drops remaining
|
||||
SkipBeeTrapDisguise = $7E072C ; Flag to skip bee trap disguise during draw routine
|
||||
SkipBeeTrapDisguise = $7E072D ; Flag to skip bee trap disguise during draw routine
|
||||
|
||||
SprDropsItem = $7E0730 ; Array for whether a sprite drops an item 0x16
|
||||
SprItemReceipt = $7E0740 ; Array for item id for each sprite 0x16
|
||||
@@ -346,6 +352,8 @@ TransparencyFlag = $7E0ABD ; Flags transparency effects e.g. in Thieves T
|
||||
;
|
||||
OWTransitionFlag = $7E0ABF ; Used for certain transitions like smith, witch, etc.
|
||||
;
|
||||
DuckPose = $7E0AF4 ; Used for duck gfx (2 bytes), zero value stops duck drawing in gfx slot
|
||||
;
|
||||
ItemGFXPtr = $7E0AFA ; Pointer for item receipt graphics transfers
|
||||
; $0000 - no transfer, do nothing
|
||||
; bit 7 reset - offset into ROM table
|
||||
@@ -363,6 +371,7 @@ EnemyStunTimer = $7E0B58 ; Auto-decrementing timer for stunned enemies.
|
||||
;
|
||||
BowDryFire = $7E0B9A ; If set, arrows are deleted immediately
|
||||
;
|
||||
SecretId = $7E0B9C ; Controls the secret spawned from bushes, pots, rocks, etc.
|
||||
SaveFileIndex = $7E0B9D ;
|
||||
;
|
||||
SpriteAncillaInteract = $7E0BA0 ; If nonzero, ancillae do not interact with the sprite. $10 bytes.
|
||||
@@ -437,7 +446,8 @@ SpriteSubPixelZ = $7E0F90 ;
|
||||
CurrentSpriteSlot = $7E0FA0 ; Holds the current sprite/ancilla's index
|
||||
;
|
||||
FreezeSprites = $7E0FC1 ; "Seems to freeze sprites"
|
||||
;
|
||||
LinkPosXCache = $7E0FC2 ; Cache of Link's coordinates
|
||||
LinkPosYCache = $7E0FC4 ; - Done at the beginning of Link_Main every frame
|
||||
GfxChrHalfSlotVerify = $7E0FC6 ; Mirrors $0AAA, set to >= $03 when VRAM has temp graphics loaded
|
||||
PrizePackIndexes = $7E0FC7 ; $07 bytes. One for each prize pack.
|
||||
;
|
||||
@@ -841,6 +851,8 @@ endmacro
|
||||
%assertRAM(CutsceneFlag, $7E02E4)
|
||||
%assertRAM(ItemReceiptMethod, $7E02E9)
|
||||
%assertRAM(TileActBE, $7E02EF)
|
||||
%assertRAM(LinkThud, $7E02F8)
|
||||
%assertRAM(FollowerNoDraw, $7E02F9)
|
||||
%assertRAM(UseY1, $7E0301)
|
||||
%assertRAM(CurrentYItem, $7E0303)
|
||||
%assertRAM(AButtonAct, $7E0308)
|
||||
@@ -864,6 +876,7 @@ endmacro
|
||||
%assertRAM(OverworldIndexMirror, $7E040A)
|
||||
%assertRAM(DungeonID, $7E040C)
|
||||
%assertRAM(TransitionDirection, $7E0418)
|
||||
%assertRAM(ManipIndex, $7E042C)
|
||||
%assertRAM(TrapDoorFlag, $7E0468)
|
||||
%assertRAM(LayerAdjustment, $7E047A)
|
||||
%assertRAM(RoomIndexMirror, $7E048E)
|
||||
@@ -871,6 +884,7 @@ endmacro
|
||||
%assertRAM(Map16ChangeIndex, $7E04AC)
|
||||
%assertRAM(OWEntranceCutscene, $7E04C6)
|
||||
%assertRAM(HeartBeepTimer, $7E04CA)
|
||||
%assertRAM(ManipTileMapX, $7E0540)
|
||||
%assertRAM(CameraTargetN, $7E0610)
|
||||
%assertRAM(CameraTargetS, $7E0612)
|
||||
%assertRAM(CameraTargetW, $7E0614)
|
||||
@@ -900,7 +914,7 @@ endmacro
|
||||
%assertRAM(SpawnedItemFlag, $7E0726)
|
||||
%assertRAM(SpawnedItemMWPlayer, $7E0728)
|
||||
%assertRAM(EnemyDropIndicator, $7E072A)
|
||||
%assertRAM(SkipBeeTrapDisguise, $7E072C)
|
||||
%assertRAM(SkipBeeTrapDisguise, $7E072D)
|
||||
%assertRAM(SprDropsItem, $7E0730)
|
||||
%assertRAM(SprItemReceipt, $7E0740)
|
||||
%assertRAM(SprItemIndex, $7E0750)
|
||||
@@ -921,6 +935,7 @@ endmacro
|
||||
%assertRAM(OverlordYHigh, $7E0B20)
|
||||
%assertRAM(EnemyStunTimer, $7E0B58)
|
||||
%assertRAM(BowDryFire, $7E0B9A)
|
||||
%assertRAM(SecretId, $7E0B9C)
|
||||
%assertRAM(SaveFileIndex, $7E0B9D)
|
||||
%assertRAM(SpriteAncillaInteract, $7E0BA0)
|
||||
%assertRAM(AncillaVelocityY, $7E0C22)
|
||||
|
||||
@@ -466,7 +466,6 @@ Shopkeeper_BuyItem:
|
||||
PLX
|
||||
LDA.l ShopInventory, X
|
||||
JSL AttemptItemSubstitution
|
||||
JSL ResolveLootIDLong
|
||||
TAY : JSL Link_ReceiveItem
|
||||
LDA.l ShopInventory+3, X : INC : STA.l ShopInventory+3, X
|
||||
LDA.b #$00 : STA.l ShopEnableCount
|
||||
|
||||
126
special_weapons.asm
Normal file
126
special_weapons.asm
Normal file
@@ -0,0 +1,126 @@
|
||||
DamageClassCalc:
|
||||
PHA
|
||||
LDA.l GanonVulnerabilityItem : BEQ +
|
||||
LDA.w SpriteTypeTable, X : CMP.b #$D7 : BNE +
|
||||
PLA
|
||||
JSL Ganon_CheckAncillaVulnerability
|
||||
RTL
|
||||
+
|
||||
LDA.l SpecialWeapons : AND.b #$7F : CMP.b #$06 : BEQ .cane_immune
|
||||
PLA
|
||||
CMP.b #$01 : BEQ .red_cane
|
||||
CMP.b #$2C : BEQ .red_cane
|
||||
CMP.b #$31 : BEQ .blue_cane
|
||||
CMP.b #$0C : BEQ .beam
|
||||
BRA .not_cane_or_beam
|
||||
|
||||
.red_cane
|
||||
PHA
|
||||
LDA.l SpecialWeapons : AND.b #$7F : CMP.b #$04 : BEQ .special_cane
|
||||
CMP.b #$05 : BEQ .special_cane
|
||||
LDA.l SpecialWeapons : BIT.b #$80 : BNE .cane_immune
|
||||
BRA .normal
|
||||
|
||||
.blue_cane
|
||||
PHA
|
||||
LDA.l SpecialWeapons : AND.b #$7F : CMP.b #$03 : BEQ .special_cane
|
||||
CMP.b #$05 : BEQ .special_cane
|
||||
LDA.l SpecialWeapons : BIT.b #$80 : BNE .cane_immune
|
||||
BRA .normal
|
||||
|
||||
.cane_immune
|
||||
LDA.w SpriteTypeTable, X : CMP.b #$1E : BEQ .normal ; crystal switch
|
||||
PLA
|
||||
BRA .impervious
|
||||
|
||||
.special_cane
|
||||
PLA
|
||||
LDA.w SpriteTypeTable, X : CMP.b #$D6 : BEQ .unstunned_ganon
|
||||
CMP.b #$88 : BEQ .mothula
|
||||
BRA .special_level
|
||||
|
||||
.impervious
|
||||
LDA.b #$FF
|
||||
RTL
|
||||
|
||||
.beam
|
||||
PHA
|
||||
LDA.l SpecialWeapons : AND.b #$7F : CMP.b #$02 : BNE .normal
|
||||
PLA
|
||||
LDA.b #$05
|
||||
RTL
|
||||
|
||||
.normal
|
||||
PLA
|
||||
|
||||
.not_cane_or_beam
|
||||
CMP.b #$07 : BNE .no_change
|
||||
LDA.l SpecialWeapons : AND.b #$7F : CMP.b #$01 : BNE .normal_bombs
|
||||
LDA.l SpecialWeaponLevel : BEQ .normal_bombs
|
||||
LDA.w SpriteTypeTable, X : CMP.b #$D6 : BEQ .unstunned_ganon
|
||||
CMP.b #$88 : BEQ .mothula
|
||||
CMP.b #$91 : BEQ .stalfos_knight
|
||||
CMP.b #$92 : BEQ .helmasaur_king
|
||||
|
||||
.special_level
|
||||
LDA.l SpecialWeaponLevel
|
||||
BRA .done
|
||||
|
||||
.mothula
|
||||
LDA.l SpecialWeaponLevel
|
||||
CMP.b #$04 : BCS .fix_mothula
|
||||
BRA .done
|
||||
|
||||
.fix_mothula
|
||||
LDA.b #$03
|
||||
BRA .done
|
||||
|
||||
.stalfos_knight
|
||||
LDA.l StalfosBombDamage : BEQ .special_level
|
||||
LDA.b #$08
|
||||
BRA .done
|
||||
|
||||
.helmasaur_king
|
||||
LDA.w $0DB0, X : CMP.b #$03 : BCS .special_level
|
||||
LDA.b #$08
|
||||
BRA .done
|
||||
|
||||
.unstunned_ganon
|
||||
LDA.w $04C5 : CMP.b #$02 : BNE .impervious
|
||||
LDA.w $0EE0, X : BNE .impervious
|
||||
LDA.b #$34 : STA.w $0EE0, X ; give the poor pig some i-frames
|
||||
BRA .special_level
|
||||
|
||||
.normal_bombs
|
||||
LDA.b #$07
|
||||
|
||||
.no_change
|
||||
PHX : TAX
|
||||
LDA.l $86EC84, X
|
||||
PLX
|
||||
CMP.b #$06 : BNE .done
|
||||
LDA.l BowEquipment : CMP.b #$03 : BCS .actual_silver_arrows
|
||||
|
||||
.normal_arrows
|
||||
LDA.b #$06
|
||||
|
||||
.done
|
||||
RTL
|
||||
|
||||
.actual_silver_arrows
|
||||
LDA.w SpriteTypeTable, X : CMP.b #$D7 : BNE +
|
||||
LDA.b #$20 : STA.w SpriteTimerE, X
|
||||
+ LDA.b #$09
|
||||
RTL
|
||||
;--------------------------------------------------------------------------------
|
||||
Utility_CheckImpervious:
|
||||
LDA.w SpriteControl, X : AND.b #$40 : BNE .impervious
|
||||
LDA.w $0CF2 : CMP.b #$FF : BEQ .impervious
|
||||
LDA.w UseY1 : AND.b #$0A : BEQ .not_impervious ; normal behavior if not hammering
|
||||
JSL Ganon_CheckHammerVulnerability : BCS .not_impervious
|
||||
|
||||
.not_impervious
|
||||
LDA.b #$00 : RTL
|
||||
.impervious
|
||||
LDA.b #$01 : RTL
|
||||
;--------------------------------------------------------------------------------
|
||||
30
sram.asm
30
sram.asm
@@ -190,7 +190,10 @@ ItemLimitCounts: skip 16 ; Keeps track of limited non-progressive items s
|
||||
; See: ItemSubstitutionRules in tables.asm
|
||||
; Right now this is only used for three items but extra space is
|
||||
; reserved
|
||||
skip 37 ; Unused
|
||||
skip 34 ; Unused
|
||||
FluteBitfield: skip 1 ;
|
||||
SpecialWeaponLevel: skip 1 ; keeps track of level in special weapon modes
|
||||
ItemOnB: skip 1 ; NYI
|
||||
ProgressIndicator: skip 1 ; $00 = Pre-Uncle | $01 = Post-Uncle item | $02 = Zelda Rescued
|
||||
; $03 = Agahnim 1 defeated
|
||||
; $04 and above don't do anything. $00-$02 used in standard mode
|
||||
@@ -212,8 +215,8 @@ FollowerIndicator: skip 1 ; $00 = No Follower | $01 = Zelda | $04 = Ol
|
||||
; $06 = Blind Maiden | $07 = Frog | $08 = Dwarf
|
||||
; $09 = Locksmith | $0A = Kiki | $0C = Purple Chest
|
||||
; $0D = Big Bomb
|
||||
FollowerXCoord: skip 2 ; \ Cached X and Y overworld coordinates of dropped follower
|
||||
FollowerYCoord: skip 2 ; / (16-bit integers)
|
||||
FollowerYCoord: skip 2 ; \ Cached X and Y overworld coordinates of dropped follower
|
||||
FollowerXCoord: skip 2 ; / (16-bit integers)
|
||||
DroppedFollowerIndoors: skip 1 ; $00 = Dropped follower outdoors | $01 = Dropped follower indoors
|
||||
DroppedFollowerLayer: skip 1 ; $00 = Upper layer | $01 =.lower layer
|
||||
FollowerDropped: skip 1 ; Set to $80 when a follower exists and has been dropped somewhere
|
||||
@@ -362,7 +365,21 @@ TRCollectedKeys: skip 1 ; | Turtle Rock
|
||||
GTCollectedKeys: skip 1 ; / Ganon's Tower
|
||||
skip 2 ; Reserved for previous table
|
||||
FileMarker: skip 1 ; $FF = Active save file | $00 = Inactive save file
|
||||
skip 13 ; Unused
|
||||
DungeonAllCollectedKeys: ; \ Key Counters. Counts all keys for a dungeon. Chests and drops.
|
||||
; | Note, this label is not indexed like others due to space. Sewers has no decicated entry.
|
||||
HCAllCollectedKeys: skip 1 ; | Hyrule Castle
|
||||
EPAllCollectedKeys: skip 1 ; | Eastern Palace
|
||||
DPAllCollectedKeys: skip 1 ; | Desert Palace
|
||||
CTAllCollectedKeys: skip 1 ; | Agahnim's Tower
|
||||
SPAllCollectedKeys: skip 1 ; | Swamp Palace
|
||||
PDAllCollectedKeys: skip 1 ; | Palace of Darkness
|
||||
MMAllCollectedKeys: skip 1 ; | Misery Mire
|
||||
SWAllCollectedKeys: skip 1 ; | Skull Woods
|
||||
IPAllCollectedKeys: skip 1 ; | Ice Palace
|
||||
THAllCollectedKeys: skip 1 ; | Tower of Hera
|
||||
TTAllCollectedKeys: skip 1 ; | Thieves' Town
|
||||
TRAllCollectedKeys: skip 1 ; | Turtle Rock
|
||||
GTAllCollectedKeys: skip 1 ; / Ganon's Tower
|
||||
InverseChecksumWRAM: skip 2 ; Vanilla Inverse Checksum. Don't write unless computing checksum.
|
||||
|
||||
;================================================================================
|
||||
@@ -512,8 +529,8 @@ endmacro
|
||||
%assertSRAM(NpcFlagsVanilla, $7EF3C9)
|
||||
%assertSRAM(CurrentWorld, $7EF3CA)
|
||||
%assertSRAM(FollowerIndicator, $7EF3CC)
|
||||
%assertSRAM(FollowerXCoord, $7EF3CD)
|
||||
%assertSRAM(FollowerYCoord, $7EF3CF)
|
||||
%assertSRAM(FollowerYCoord, $7EF3CD)
|
||||
%assertSRAM(FollowerXCoord, $7EF3CF)
|
||||
%assertSRAM(DroppedFollowerIndoors, $7EF3D1)
|
||||
%assertSRAM(DroppedFollowerLayer, $7EF3D2)
|
||||
%assertSRAM(FollowerDropped, $7EF3D3)
|
||||
@@ -624,6 +641,7 @@ endmacro
|
||||
%assertSRAM(TRCollectedKeys, $7EF4EC)
|
||||
%assertSRAM(GTCollectedKeys, $7EF4ED)
|
||||
%assertSRAM(FileMarker, $7EF4F0)
|
||||
%assertSRAM(DungeonAllCollectedKeys, $7EF4F1)
|
||||
;--------------------------------------------------------------------------------
|
||||
%assertSRAM(ExtendedSaveDataWRAM, $7F6000)
|
||||
%assertSRAM(ExtendedFileNameWRAM, $7F6000)
|
||||
|
||||
86
stats.asm
86
stats.asm
@@ -115,38 +115,76 @@ DecrementSmallKeys:
|
||||
STA.l CurrentSmallKeys ; thing we wrote over, write small key count
|
||||
JSL UpdateKeys
|
||||
RTL
|
||||
|
||||
;--------------------------------------------------------------------------------
|
||||
|
||||
CountChestKeyLong:
|
||||
PHX : PHP
|
||||
SEP #$30
|
||||
PHX : PHP
|
||||
SEP #$30
|
||||
JSR CountChestKey
|
||||
PLP : PLX
|
||||
RTL
|
||||
PLP : PLX
|
||||
RTL
|
||||
;--------------------------------------------------------------------------------
|
||||
|
||||
CountChestKey:
|
||||
PHA : PHX
|
||||
LDA.l !MULTIWORLD_ITEM_PLAYER_ID : BNE .done
|
||||
LDA.l StatsLocked : BNE .done
|
||||
CPY.b #$24 : BEQ .this_dungeon
|
||||
TYA
|
||||
AND.b #$0F : CMP.b #$02 : BCC .hc_sewers
|
||||
TAX
|
||||
LDA.l DungeonCollectedKeys,X : INC : STA.l DungeonCollectedKeys,X
|
||||
BRA .done
|
||||
.this_dungeon
|
||||
LDA.w DungeonID : CMP.b #$03 : BCC .hc_sewers
|
||||
LSR : TAX
|
||||
LDA.l DungeonCollectedKeys,X : INC : STA.l DungeonCollectedKeys,X
|
||||
BRA .done
|
||||
PHA : PHX
|
||||
LDA.l !MULTIWORLD_ITEM_PLAYER_ID : BNE .done
|
||||
LDA.l StatsLocked : BNE .done
|
||||
CPY.b #$24 : BEQ .this_dungeon
|
||||
TYA
|
||||
AND.b #$0F : CMP.b #$02 : BCC .hc_sewers
|
||||
TAX
|
||||
LDA.l DungeonCollectedKeys,X : INC : STA.l DungeonCollectedKeys,X
|
||||
BRA .done
|
||||
|
||||
.hc_sewers
|
||||
LDA.l SewerCollectedKeys : INC
|
||||
STA.l SewerCollectedKeys : STA.l HCCollectedKeys
|
||||
.this_dungeon
|
||||
LDA.w DungeonID : CMP.b #$03 : BCC .hc_sewers
|
||||
LSR : TAX
|
||||
LDA.l DungeonCollectedKeys,X : INC : STA.l DungeonCollectedKeys,X
|
||||
BRA .done
|
||||
|
||||
.done
|
||||
PLX : PLA
|
||||
RTS
|
||||
.hc_sewers
|
||||
LDA.l SewerCollectedKeys : INC
|
||||
STA.l SewerCollectedKeys : STA.l HCCollectedKeys
|
||||
|
||||
.done
|
||||
PLX : PLA
|
||||
RTS
|
||||
|
||||
; Expects 16 bit index mode upon entering. 8-bit Acumulator
|
||||
; This approach doesn't currently work - potentially dead code
|
||||
CountAllKey:
|
||||
PHP : PHA : PHX
|
||||
SEP #$10
|
||||
LDA.l !MULTIWORLD_ITEM_PLAYER_ID : BNE .done
|
||||
CPY.b #$24 : BEQ .this_dungeon
|
||||
TYA : AND.b #$0F : CMP.b #$02 : BCC .hc_sewers
|
||||
BRA .all_dungoens
|
||||
|
||||
.this_dungeon
|
||||
LDA.w DungeonID : CMP.b #$03 : BCC .hc_sewers
|
||||
LSR
|
||||
|
||||
.all_dungoens
|
||||
STA.b Scrap00 : TAX ; store dungeon index in X, $00
|
||||
LDA.l DungeonAllCollectedKeys-1, X : INC : STA.l DungeonAllCollectedKeys-1, X
|
||||
REP #$10 : PLX : PHX ; 16 bit index
|
||||
LDA.l InventoryTable_properties, X : BIT.b #$40 : BEQ .done
|
||||
SEP #$10 : LDX.b Scrap00
|
||||
LDA.l DungeonCollectedKeys,X : INC : STA.l DungeonCollectedKeys,X
|
||||
BRA .done
|
||||
|
||||
.hc_sewers
|
||||
LDA.l HCAllCollectedKeys : INC : STA.l HCAllCollectedKeys
|
||||
REP #$10 : PLX : PHX ; 16 bit index
|
||||
LDA.l InventoryTable_properties, X : BIT.b #$40 : BEQ .done
|
||||
LDA.l SewerCollectedKeys : INC
|
||||
STA.l SewerCollectedKeys : STA.l HCCollectedKeys
|
||||
|
||||
.done
|
||||
REP #$10
|
||||
PLX : PLA : PLP
|
||||
RTL
|
||||
|
||||
;--------------------------------------------------------------------------------
|
||||
IncrementAgahnim2Sword:
|
||||
|
||||
@@ -98,11 +98,20 @@ RTL
|
||||
;================================================================================
|
||||
CheckGanonHammerDamage:
|
||||
LDA.l HammerableGanon : BEQ +
|
||||
LDA.w SpriteTypeTable, X : CMP.b #$D8 ; original behavior except ganon
|
||||
RTL
|
||||
LDA.w SpriteTypeTable, X : CMP.b #$D8 ; original behavior except ganon
|
||||
RTL
|
||||
+
|
||||
LDA.l GanonVulnerabilityItem : CMP.b #$0C : BEQ .hammer_silvers
|
||||
LDA.w SpriteTypeTable, X : CMP.b #$D6 ; original behavior
|
||||
RTL
|
||||
RTL
|
||||
|
||||
.hammer_silvers
|
||||
LDA.w SpriteTypeTable, X : CMP.b #$D8 : BCC +
|
||||
RTL
|
||||
+ CMP.b #$D6 : BNE +
|
||||
RTL
|
||||
+ CLC
|
||||
RTL
|
||||
;================================================================================
|
||||
GetSmithSword:
|
||||
JSL ItemCheck_SmithSword : BEQ + : JML Smithy_AlreadyGotSword : +
|
||||
|
||||
209
tables.asm
209
tables.asm
@@ -91,7 +91,39 @@ SmithSword:
|
||||
db $02 ; #$02 = Tempered Sword (default)
|
||||
|
||||
;--------------------------------------------------------------------------------
|
||||
; 0x18002B- 0x180030 (Unused)
|
||||
; 0x18002B (Unused)
|
||||
;--------------------------------------------------------------------------------
|
||||
; 0x18002C (Reserved for Allowed Item on B)
|
||||
;--------------------------------------------------------------------------------
|
||||
org $B0802D
|
||||
ChallengeModes:
|
||||
; p--- mmdd
|
||||
; p - permadeath
|
||||
; m - movement modes (0 - normal, 1 - permanent ice physics)
|
||||
; d - damage modes (0 - normal, 1 - ohko, 2 - gloom)
|
||||
db $00
|
||||
;--------------------------------------------------------------------------------
|
||||
org $B0802E
|
||||
GanonVulnerabilityItem:
|
||||
db $00 ; $00 = default behavior (silver arrows)
|
||||
;--------------------------------------------------------------------------------
|
||||
org $B0902F
|
||||
SpecialWeapons:
|
||||
db #$00
|
||||
; s - - - m m m m (bitfield) - NYI
|
||||
; s - only swords damage can hurt enemies
|
||||
; m - special weapon mode
|
||||
; $00 = Off (default)
|
||||
; $01 = Bomb mode
|
||||
; $02 = Pseudosword
|
||||
; $03 = Byrna mode
|
||||
; $04 = Somaria mode
|
||||
; $05 = Canes mode
|
||||
; $06 = Bee mode
|
||||
; $07 = Unused
|
||||
; $08 = Bugnet mode
|
||||
;--------------------------------------------------------------------------------
|
||||
; 0x180030 (Unused)
|
||||
;--------------------------------------------------------------------------------
|
||||
org $B08031 ; PC 0x180031
|
||||
EnableEasterEggs:
|
||||
@@ -190,8 +222,11 @@ QuickSwapFlag:
|
||||
db $00 ; #$00 = Off (default) - #$01 = On
|
||||
;--------------------------------------------------------------------------------
|
||||
org $B0804C ; PC 0x18004C
|
||||
SmithTravelsFreely:
|
||||
db $00 ; #$00 = Off (default) - #$01 = On (frog/smith can enter multi-entrance doors)
|
||||
FollowerTravelAllowed:
|
||||
db $00
|
||||
; #$00 = Off (default)
|
||||
; #$01 = On (frog/smith can enter multi-entrance doors)
|
||||
; #$02 = Follower Shuffle Enabled
|
||||
;--------------------------------------------------------------------------------
|
||||
org $B0804D ; PC 0x18004D
|
||||
EscapeAssist: ; ScrubMode:
|
||||
@@ -428,9 +463,16 @@ db $00 ; #$00 = Original Behavior (default) - #$01 = Book can flip crystal switc
|
||||
;--------------------------------------------------------------------------------
|
||||
; 0x1800A7 - 0x1800AE (unused)
|
||||
;--------------------------------------------------------------------------------
|
||||
; 0x1800AF
|
||||
; mtff ffff
|
||||
;
|
||||
; m - 0 = only shorten timer on multiworld items, 1 = shorten all items
|
||||
; t - 0 = triforce pieces considered important, 1 = triforce pieces considered junk
|
||||
; f - number of frames to show items
|
||||
;--------------------------------------------------------------------------------
|
||||
org $B080AF ; PC 0x1800AF
|
||||
MultiworldJunkItemTimer:
|
||||
db $00 ; number of frames to show junk items in a multiworld (#$00 = no change)
|
||||
JunkItemTimer:
|
||||
db $00 ; number of frames to show junk items (#$00 = no change)
|
||||
;--------------------------------------------------------------------------------
|
||||
org $B080B0 ; 0x1800B0-0x1800BF
|
||||
StaticDecryptionKey:
|
||||
@@ -899,38 +941,84 @@ org $B08196 ; PC 0x180196-0x180197
|
||||
TotalItemCount: ; Total item count for HUD. Only counts items that use "item get" animation.
|
||||
dw $00D8 ; 216
|
||||
|
||||
org $B08198 ; PC 0x180198-0x1801A9
|
||||
GanonsTowerOpenAddress: ; 0x180198-0x180199
|
||||
dw CrystalCounter ; Target address for GT open check
|
||||
GanonsTowerOpenTarget: ; 0x18019A-0x18019B
|
||||
dw $0007 ; Target amount for GT open modes to compare
|
||||
GanonsTowerOpenMode: ; 0x18019C-0x18019D
|
||||
dw $0001 ; $00 = Vanilla | $01 = Compare target with address
|
||||
PedPullAddress: ; 0x18019E-0x18019F
|
||||
dw PendantCounter ; Target address for ped pull check
|
||||
PedPullTarget: ; 0x1801A0-0x1801A1
|
||||
dw $0003 ; Target amount for ped pull modes to check
|
||||
PedCheckMode: ; 0x1801A2-0x1801A3
|
||||
dw $0000 ; $00 = vanilla | $01 = Compare address to target value
|
||||
GanonVulnerableAddress: ; 0x1801A4-0x1801A5
|
||||
dw CrystalCounter ; Target address for ped pull check
|
||||
GanonVulnerableTarget: ; 0x1801A6-0x1801A7
|
||||
dw $0007 ; Target amount for Ganon vulnerability modes to compare
|
||||
GanonVulnerableMode: ; 0x1801A8-0x1801A9
|
||||
dw $0000 ; #$00 = Off (default)
|
||||
; #$01 = On
|
||||
; #$02 = Require All Dungeons
|
||||
; #$03 = Require "GanonVulnerableTarget" Crystals and Aga2
|
||||
; #$04 = Require "GanonVulnerableTarget" Crystals
|
||||
; #$05 = Require "GoalItemRequirement" Goal Items
|
||||
; #$06 = Light Speed
|
||||
; #$07 = Require All Crystals and Crystal Bosses
|
||||
; #$08 = Require All Crystal Bosses only
|
||||
; #$09 = Require All Dungeons No Agahnim
|
||||
; #$0A = Require 100% Item Collection
|
||||
; #$0B = Require 100% Item Collection and All Dungeons
|
||||
org $B08198 ; PC 0x180198-0x1801D7 (variable tables, $FF terminated)
|
||||
GoalConditionTable:
|
||||
dw GanonsTowerOpen
|
||||
dw GanonVulnerable
|
||||
dw PedPull
|
||||
dw MurahdahlaComplete
|
||||
|
||||
GanonsTowerOpen:
|
||||
db $82 ; Crystal Count >= Default 7
|
||||
db $FF
|
||||
GanonVulnerable:
|
||||
db $82 ; Crystal Count >= Default 7
|
||||
db $07 ; Agahnim 2 defeated
|
||||
db $FF
|
||||
PedPull:
|
||||
db $81 ; Pendant Count >= Default 3
|
||||
db $FF
|
||||
MurahdahlaComplete:
|
||||
db $88 ; Triforce Pieces >= Default Goal
|
||||
db $FF
|
||||
; These are lists of conditions to check for various goals,
|
||||
; each terminated by #$FF.
|
||||
; First byte is condition type, with most significant bit
|
||||
; indicating the default value should be used, else the
|
||||
; following byte/s indicate the custom target value.
|
||||
; -----------------------------------------------------------
|
||||
; Condition Types:
|
||||
; #$00 = Always Invulnerable
|
||||
; #$01 = Require Pendants - Default is 3
|
||||
; #$02 = Require Crystals - Default is 7
|
||||
; #$03 = Require Pendant Bosses - Default is 3
|
||||
; #$04 = Require Crystal Bosses - Default is 7
|
||||
; #$05 = Require Prize Bosses - Default is 10
|
||||
; #$06 = Require Agahnim 1
|
||||
; #$07 = Require Agahnim 2
|
||||
; #$08 = Require Goal Items (ie. Triforce Pieces) - Default is value at GoalItemRequirement
|
||||
; #$09 = Require Item Collection - Default is Max Collection Rate
|
||||
; #$0A = Require Custom Goal
|
||||
; -----------------------------------------------------------
|
||||
; For Custom Goal, one byte indicates the bitfield options,
|
||||
; followed by two bytes for the target address, followed
|
||||
; by one or two bytes for the custom target value.
|
||||
; Options bitfield:
|
||||
; ---b accc
|
||||
; b - bank flag - 0 = $7E - 1 = $7F
|
||||
; a - addressing mode - 0 = 8-bit - 1 = 16-bit
|
||||
; c - comparison mode
|
||||
; 0 = minimum (>=)
|
||||
; 1 = exact (==)
|
||||
; 2 = bitfield any
|
||||
; 3 = bitfield match
|
||||
; 4 = count bits set in bitfield
|
||||
; 5-7 = reserved
|
||||
;--------------------------------------------------------------------------------
|
||||
; 0x18019A - 0x1801FF (unused)
|
||||
org $B081D8 ; PC 0x1801D8 - 0x1801FE
|
||||
GanonsTowerOpenGfx: ; 0x1801D8-0x1801E5
|
||||
dw $0000 ; Gfx used for GT open animation, similar to StandingItemGraphicsOffsets
|
||||
dw $0000, $0000, $0000, $0000, $0000, $0000
|
||||
GanonsTowerOpenPalette: ; 0x1801E6-0x1801EC
|
||||
db $00 ; Palette for GanonsTowerOpenGfx
|
||||
db $00, $00, $00, $00, $00, $00
|
||||
; -VHPPCCC (VertFlip, HorizFlip, Priority, ColorPalette)
|
||||
PedPullGfx: ; 0x1801ED-0x1801F2
|
||||
dw $0000 ; Gfx used for ped pull animation, similar to StandingItemGraphicsOffsets
|
||||
dw $0000, $0000
|
||||
PedPullPalette: ; 0x1801F3-0x1801F5
|
||||
db $00 ; Palette for PedPullGfx
|
||||
db $00, $00
|
||||
; -VHPPCCC (VertFlip, HorizFlip, Priority, ColorPalette)
|
||||
MurahdahlaGfx: ; 0x1801F6-0x1801FB
|
||||
dw $0000 ; Gfx used for ped pull animation, similar to StandingItemGraphicsOffsets
|
||||
dw $0000, $0000
|
||||
MurahdahlaPalette: ; 0x1801FC-0x1801FE
|
||||
db $00 ; Palette for MurahdahlaGfx
|
||||
db $00, $00
|
||||
; -VHPPCCCO (VertFlip, HorizFlip, Priority, ColorPalette)
|
||||
;--------------------------------------------------------------------------------
|
||||
; 0x1801FF (unused)
|
||||
;================================================================================
|
||||
org $B08200 ; PC 0x180200 - 0x18020B
|
||||
RedClockAmount:
|
||||
@@ -1021,14 +1109,14 @@ org $B08220 ; PC 0x180220
|
||||
org $B08240 ; PC 0x180240
|
||||
StartingAreaExitOffset:
|
||||
db $00, $00, $00, $00, $00, $00, $00
|
||||
;--------------------------------------------------------------------------------
|
||||
;-------------------------------------------------------------------------------
|
||||
org $B08247 ; PC 0x180247
|
||||
; For any starting areas in single entrance caves you can specify the overworld door here
|
||||
; to enable drawing the doorframes These values should be the overworld door index+1.
|
||||
; A value of zero will draw no door frame.
|
||||
StartingAreaOverworldDoor:
|
||||
db $00, $00, $00, $00, $00, $00, $00
|
||||
;--------------------------------------------------------------------------------
|
||||
;-------------------------------------------------------------------------------
|
||||
; 0x18024E - 0x18024F (unused)
|
||||
;-------------------------------------------------------------------------------
|
||||
; $308250 (0x180250) - $30829F (0x18029F)
|
||||
@@ -1043,11 +1131,50 @@ dw $0000 : db $00 : dw $0000, $0000, $0000, $0000, $0000, $0000, $0000 : db $00,
|
||||
dw $0000 : db $00 : dw $0000, $0000, $0000, $0000, $0000, $0000, $0000 : db $00, $00, $00
|
||||
;--------------------------------------------------------------------------------
|
||||
; 0x1802A0 - 0x1802BF (unused)
|
||||
;---------------------------------------------------------------------------------
|
||||
;--------------------------------------------------------------------------------
|
||||
;--------------------------------------------------------------------------------
|
||||
; $3082C0 (0x1802C0) - $3082D7 (0x1802D7)
|
||||
org $B082C0
|
||||
; Follower data
|
||||
; First byte is the Follower ID awarded at each of the locations
|
||||
; Next 2 bytes are OAM address references to the head/body gfx
|
||||
Follower_Zelda: ; PC 0x1802C0
|
||||
db $01
|
||||
.vram
|
||||
dw $CCCE
|
||||
Follower_OldMan: ; PC 0x1802C3
|
||||
db $04
|
||||
.vram
|
||||
dw $ACAE
|
||||
Follower_Maiden: ; PC 0x1802C6
|
||||
db $06
|
||||
.vram
|
||||
dw $CCCE
|
||||
Follower_Frog: ; PC 0x1802C9
|
||||
db $07
|
||||
.vram
|
||||
dw $C8EE
|
||||
Follower_Locksmith: ; PC 0x1802CC
|
||||
db $09
|
||||
.vram
|
||||
dw $EAEC
|
||||
Follower_Kiki: ; PC 0x1802CF
|
||||
db $0A
|
||||
.vram
|
||||
dw $C0C2
|
||||
Follower_PurpleChest: ; PC 0x1802D2
|
||||
db $0C
|
||||
.vram
|
||||
dw $C8EE
|
||||
Follower_SuperBomb: ; PC 0x1802D5
|
||||
db $0D
|
||||
.vram
|
||||
dw $AE4E
|
||||
;--------------------------------------------------------------------------------
|
||||
|
||||
;--------------------------------------------------------------------------------
|
||||
; 0x1802C0 - 0x1802FF (unused)
|
||||
;---------------------------------------------------------------------------------
|
||||
; 0x1802D8 - 0x1802FF (unused)
|
||||
;--------------------------------------------------------------------------------
|
||||
;--------------------------------------------------------------------------------
|
||||
; $308300 (0x180300) - $30834F (0x18034F)
|
||||
org $B08300 ; PC 0x180300
|
||||
|
||||
15
tablets.asm
15
tablets.asm
@@ -19,7 +19,14 @@ RTL
|
||||
;--------------------------------------------------------------------------------
|
||||
SetTabletItemFlag:
|
||||
PHA
|
||||
LDA.b OverworldIndex : CMP.b #$03 : BEQ .ether ; if we're on the map where ether is, we're the ether tablet
|
||||
; Rain state fix: convert DW screen ID to LW if in rain state
|
||||
LDA.b OverworldIndex
|
||||
BIT.b #$40 : BEQ +
|
||||
LDA.l ProgressIndicator : CMP.b #$02
|
||||
LDA.b OverworldIndex : BCS ++ : AND.b #$BF
|
||||
++
|
||||
+
|
||||
CMP.b #$03 : BEQ .ether ; if we're on the map where ether is, we're the ether tablet
|
||||
.bombos
|
||||
JSR ItemSet_BombosTablet : BRA .done
|
||||
.ether
|
||||
@@ -69,6 +76,12 @@ RTL
|
||||
IsMedallion:
|
||||
REP #$20 ; set 16-bit accumulator
|
||||
LDA.b OverworldIndex
|
||||
; Rain state fix: In rain state DW, use LW screen ID for tablet lookup
|
||||
BIT.w #$0040 : BEQ +
|
||||
LDA.l ProgressIndicator : AND.w #$00FF : CMP.w #$0002
|
||||
LDA.b OverworldIndex : BCS ++ : AND.w #$00BF
|
||||
++
|
||||
+
|
||||
CMP.w #$03 : BNE + ; Death Mountain
|
||||
LDA.b LinkPosX : CMP.w #1890 : !BGE ++
|
||||
SEC
|
||||
|
||||
@@ -163,6 +163,7 @@ RTL
|
||||
;--------------------------------------------------------------------------------
|
||||
OHKOTimer:
|
||||
LDA.l OHKOFlag : BNE .kill
|
||||
LDA.l ChallengeModes : AND.b #$03 : CMP.b #$01 : BEQ .kill
|
||||
LDA.l TimeoutBehavior : CMP.b #$02 : BNE +
|
||||
LDA.l ClockStatus : AND.b #$02 : BEQ +
|
||||
.kill
|
||||
|
||||
@@ -435,7 +435,7 @@ LoadItemPalette:
|
||||
; Out: A - Sprite palette index
|
||||
PHX : PHY : PHB
|
||||
LDA.b #PalettesVanillaBank>>16 : STA.b Scrap0C
|
||||
PEA $7E00
|
||||
PEA.w $7E00
|
||||
PLB : PLB
|
||||
REP #$30
|
||||
|
||||
@@ -520,3 +520,20 @@ AuxPaletteCheck:
|
||||
REP #$30
|
||||
PLX
|
||||
RTS
|
||||
|
||||
CountBits:
|
||||
; In: A - value to count bits set in
|
||||
; Out: A - number of bits set
|
||||
; Flexible to use with 8 or 16-bit mode
|
||||
PHX : TAX
|
||||
PHY : PHP
|
||||
SEP #$20
|
||||
LDA.b 1,S : BIT.b #$20 : BNE +
|
||||
PLP : TXA : LDX.w #$000F : LDY.w #$0000
|
||||
BRA ++
|
||||
+ PLP : TXA : LDX.b #$07 : LDY.b #$00
|
||||
++ - LSR : BCC +
|
||||
INY
|
||||
+ DEX : BPL -
|
||||
TYA : PLY : PLX
|
||||
RTL
|
||||
|
||||
@@ -37,6 +37,7 @@ CopyFontToVRAM = $80E596
|
||||
LoadCommonSprites_in_file_select = $80E784
|
||||
PaletteFilter_TheEndSprite = $80EC03
|
||||
PrepDungeonExit = $80F945
|
||||
SaveDeathCount = $80F9DD
|
||||
Mirror_InitHdmaSettings = $80FDEE
|
||||
Dungeon_LoadRoom = $81873A
|
||||
Underworld_HandleRoomTags = $81C2FD
|
||||
@@ -73,12 +74,15 @@ SpritePrep_MagicShopAssistant = $85F521
|
||||
Player_ApplyRumbleToSprites = $8680FA
|
||||
Sprite_Main = $868328
|
||||
Utility_CheckIfHitBoxesOverlapLong = $8683E6
|
||||
Sprite_Get16BitCoords_long = $8684BD
|
||||
Sprite_TransmuteToBomb = $86AD58
|
||||
Sprite_PrepAndDrawSingleLargeLong = $86DBF8
|
||||
Sprite_PrepAndDrawSingleSmallLong = $86DC00
|
||||
Sprite_DrawShadowLong = $86DC5C
|
||||
Sprite_DrawShadowCustomLong = $86DC64
|
||||
DashKey_Draw = $86DD40
|
||||
Sprite_PrepOAMCoordLong = $86E41C
|
||||
Sprite_CheckTileCollisionLong = $86E49C
|
||||
Sprite_ApplySpeedTowardsPlayerLong = $86EA18
|
||||
Sprite_DirectionToFacePlayerLong = $86EAA6
|
||||
Sprite_CheckDamageToPlayerSameLayerLong = $86F12F
|
||||
@@ -91,6 +95,7 @@ Player_HaltDashAttackLong = $8791B3
|
||||
Link_ReceiveItem = $87999D
|
||||
Link_ReceiveItem_cool_pose = $8799EE
|
||||
Link_ReceiveItem_not_cool_pose = $8799F2
|
||||
HandleFollowersAfterMirroring = $87AA8B
|
||||
LinkHop_FindArbitraryLandingSpot = $87E359
|
||||
Link_HandleMovingAnimation_FullLongEntry = $87E68F
|
||||
Link_CheckForEdgeScreenTransition = $87F413
|
||||
@@ -117,6 +122,8 @@ AncillaAdd_GTCutscene = $899B6F
|
||||
AddDoorDebris_spawn_failed = $899C39
|
||||
AddAncillaLong = $899D04
|
||||
Ancilla_CheckIfAlreadyExistsLong = $899D1A
|
||||
Follower_Initialize = $899EE8
|
||||
Sprite_BecomeFollower = $899F25
|
||||
Ancilla_TerminateSelectInteractives = $89AC57
|
||||
GiveRupeeGift = $89AD58
|
||||
Sprite_SetSpawnedCoords = $89AE64
|
||||
@@ -130,6 +137,7 @@ InitializeSaveFile = $8CDB3E
|
||||
InitializeSaveFile_build_checksum = $8CDBC0
|
||||
InitializeSaveFile_checksum_done = $8CDBDB
|
||||
SpritePrep_LoadProperties = $8DB818
|
||||
ResetSpriteProperties = $8DB871
|
||||
GetRandomInt = $8DBA71
|
||||
OAM_AllocateFromRegionA = $8DBA80
|
||||
OAM_AllocateFromRegionB = $8DBA84
|
||||
@@ -141,6 +149,7 @@ Sound_SetSfxPanWithPlayerCoords = $8DBB67
|
||||
Sound_SetSfx1PanLong = $8DBB6E
|
||||
Sound_SetSfx2PanLong = $8DBB7C
|
||||
Sound_SetSfx3PanLong = $8DBB8A
|
||||
SpriteDraw_Maiden = $8DCE4F
|
||||
SpriteDraw_Stumpy = $8DD030
|
||||
HUD_RefreshIconLong = $8DDB7F
|
||||
Equipment_UpdateEquippedItemLong = $8DDD32
|
||||
@@ -194,6 +203,7 @@ Sprite_BagOfPowder = $85F644
|
||||
MagicShopAssistant_Main = $85F893
|
||||
Sprite_SpawnSecret_SetCoords = $8682A5
|
||||
Chicken_SpawnAvengerChicken = $86A7DB
|
||||
Sprite_ScheduleForBreakage_exit = $86E273
|
||||
Link_PerformRead = $87B4DB
|
||||
Link_PerformOpenChest_no_replacement = $87B59F
|
||||
Link_CheckNewAPress = $87B5A9
|
||||
@@ -234,6 +244,16 @@ CrystalMaiden_KickOutOfDungeon = $9ECF35
|
||||
GoldBee_Dormant_exit = $9EDE89
|
||||
GoldBee_SpawnSelf = $9EDE8A
|
||||
|
||||
;===================================================================================================
|
||||
; Spliced routines (use JML directly since the hook left these methods)
|
||||
;===================================================================================================
|
||||
|
||||
Sprite_4C_Geldman_do_indeed_draw = $85B8C0
|
||||
Sprite_4C_Geldman_continue = $85B8C3
|
||||
Sprite_91_StalfosKnight_continue = $9EAAB5
|
||||
SpriteDraw_Blob_bad_gfx = $9EB20D
|
||||
SpriteDraw_Blob_head_popping_out = $9EB24E
|
||||
|
||||
;===================================================================================================
|
||||
; Palettes
|
||||
;===================================================================================================
|
||||
@@ -279,4 +299,5 @@ Overworld_Entrance_ID = $9BBB73
|
||||
SwordPaletteOffsets = $9BEBB4
|
||||
ShieldPaletteOffsets = $9BEBC1
|
||||
LinkMailPalettesOffsets = $9BEC06
|
||||
Sprite_ReducedTileInteractionTable = $9DF6CF
|
||||
RoomData_ObjectDataPointers = $9F8000
|
||||
|
||||
130
variable_ganon_vulnerability.asm
Normal file
130
variable_ganon_vulnerability.asm
Normal file
@@ -0,0 +1,130 @@
|
||||
Ganon_CheckAncillaVulnerability:
|
||||
PHA
|
||||
LDA.w $0EE0, X : BNE .not_vulnerable_pla
|
||||
PLA
|
||||
PHX : PHA
|
||||
LDA.l GanonVulnerabilityItem
|
||||
BMI .no_weakness
|
||||
TAX : PLA
|
||||
CMP.l Ganon_CheckByAncilla, X : BNE +
|
||||
PLX : BRA .vulnerable
|
||||
+ PLX : PHA
|
||||
LDA.l GanonVulnerabilityItem
|
||||
BEQ .silver_arrows
|
||||
CMP.b #$01 : BEQ .silver_arrows
|
||||
CMP.b #$11 : BEQ .somaria
|
||||
BRA .not_vulnerable_pla
|
||||
|
||||
.no_weakness
|
||||
PLA : PLX
|
||||
BRA .not_vulnerable
|
||||
|
||||
.silver_arrows
|
||||
PLA : CMP.b #$09 : BNE .not_vulnerable
|
||||
LDA.l BowEquipment : CMP.b #$03 : BCS +
|
||||
LDA.b #$09 : BRA .not_vulnerable
|
||||
+ BRA .vulnerable
|
||||
|
||||
.somaria
|
||||
PLA
|
||||
CMP.b #$01 : BEQ .vulnerable
|
||||
CMP.b #$2C : BEQ .vulnerable
|
||||
BRA .not_vulnerable
|
||||
|
||||
.vulnerable
|
||||
PHX
|
||||
LDA.l GanonVulnerabilityItem
|
||||
TAX
|
||||
LDA.l Ganon_IFrameDuration, X
|
||||
PLX
|
||||
STA.w $0EE0, X ; give the poor pig some iframes
|
||||
LDA.b #$20 : STA.w SpriteTimerE, X
|
||||
LDA.b #$09
|
||||
RTL
|
||||
.not_vulnerable_pla_pla
|
||||
PLA
|
||||
.not_vulnerable_pla
|
||||
PLA
|
||||
.not_vulnerable
|
||||
PHX : TAX
|
||||
LDA.l $86EC84, X
|
||||
PLX
|
||||
RTL
|
||||
;--------------------------------------------------------------------------------
|
||||
Ganon_CheckPowderVulnerability:
|
||||
LDA.l GanonVulnerabilityItem : CMP.b #$05 : BNE .normal
|
||||
LDA.w SpriteTypeTable, X : CMP.b #$D7 : BNE .normal
|
||||
LDA.w $0EE0, X : BNE .normal ; ganon has i-frames
|
||||
LDA.l Ganon_IFrameDuration+$05
|
||||
STA.w $0EE0, X ; give ganon i-frames
|
||||
LDA.b #$20 : STA.w SpriteTimerE, X
|
||||
LDA.b #$09
|
||||
BRA .done
|
||||
|
||||
.normal
|
||||
LDA.b #$0A
|
||||
.done
|
||||
JML $86ECE6
|
||||
;--------------------------------------------------------------------------------
|
||||
Ganon_CheckBeeVulnerability:
|
||||
; X is bee sprite index
|
||||
; Y is target sprite index
|
||||
LDA.l GanonVulnerabilityItem : CMP.b #$10 : BNE .normal
|
||||
LDA.w SpriteTypeTable, Y : CMP.b #$D7 : BNE .normal
|
||||
LDA.w $0EE0, Y : BNE .normal ; ganon has i-frames
|
||||
LDA.l Ganon_IFrameDuration+$10
|
||||
STA.w $0EE0, X ; give ganon i-frames
|
||||
LDA.b #$20 : STA.w SpriteTimerE, X
|
||||
LDA.b #$09
|
||||
BRA .done
|
||||
|
||||
.normal
|
||||
LDA.b #$01
|
||||
.done
|
||||
TYX
|
||||
JML $86ECE6
|
||||
;--------------------------------------------------------------------------------
|
||||
Ganon_CheckInvincible:
|
||||
LDA.w $04C5 : CMP.b #$02 : BEQ .not_transparent
|
||||
LDA.w SpriteTypeTable, X : CMP.b #$D7 : BNE .transparent ; non-stunned ganon
|
||||
LDA.w UseY1 : AND.b #$0A : BEQ .transparent ; normal behavior if not hammering
|
||||
LDA.l GanonVulnerabilityItem : CMP.b #$0C : BNE .transparent
|
||||
.not_transparent
|
||||
LDA.b #$00 : RTL
|
||||
.transparent
|
||||
LDA.b #$01 : RTL
|
||||
;--------------------------------------------------------------------------------
|
||||
Ganon_CheckHammerVulnerability:
|
||||
LDA.l GanonVulnerabilityItem : CMP.b #$0C : BNE .normal
|
||||
LDA.w SpriteTypeTable, X : CMP.b #$D7 : BNE .normal
|
||||
LDA.w $0EE0, X : BNE .normal ; ganon has i-frames
|
||||
LDA.l Ganon_IFrameDuration+$0C
|
||||
STA.w $0EE0, X ; give ganon i-frames
|
||||
LDA.b #$20 : STA.w SpriteTimerE, X
|
||||
LDA.b #$09 : STA.w $0CF2 ; set damage class to silver
|
||||
SEC : RTL
|
||||
.normal
|
||||
CLC : RTL
|
||||
;--------------------------------------------------------------------------------
|
||||
CheckBeeBoss:
|
||||
; Y is sprite index
|
||||
LDA.l GanonVulnerabilityItem : CMP.b #$10 : BNE .normal
|
||||
LDA.w SpriteTypeTable, Y : CMP.b #$D7 : BNE .normal
|
||||
LDA.b #$00 : RTL
|
||||
.normal
|
||||
LDA.w $0B6B, Y : AND.b #$02
|
||||
RTL
|
||||
;--------------------------------------------------------------------------------
|
||||
Ganon_CheckByAncilla:
|
||||
db #$00 ; default behavior
|
||||
db #$00, #$05, #$1F, #$07, #$00
|
||||
db #$02, #$0B, #$19, #$18, #$1C
|
||||
db #$00, #$00, #$00, #$00, #$00
|
||||
db #$00, #$00, #$31, #$00, #$00
|
||||
Ganon_IFrameDuration:
|
||||
db #$00 ; default behavior
|
||||
db #$00, #$00, #$00, #$34, #$00
|
||||
db #$00, #$00, #$00, #$00, #$00
|
||||
db #$00, #$00, #$00, #$00, #$00
|
||||
db #$00, #$00, #$00, #$00, #$00
|
||||
;--------------------------------------------------------------------------------
|
||||
@@ -1,12 +1,3 @@
|
||||
;================================================================================
|
||||
; Spawn Zelda (or not)
|
||||
;--------------------------------------------------------------------------------
|
||||
SpawnZelda:
|
||||
LDA.l FollowerIndicator : CMP.b #$08 : BEQ + ; don't spawn if dwarf is present
|
||||
CMP.b #$07 : BEQ + ; don't spawn if frog is present
|
||||
CMP.b #$0C : BEQ + ; don't spawn if purple chest is present
|
||||
CLC
|
||||
+ RTL
|
||||
;--------------------------------------------------------------------------------
|
||||
EndRainState:
|
||||
LDA.l InitProgressIndicator : BIT.b #$80 : BNE + ; check for instant post-aga
|
||||
|
||||
Reference in New Issue
Block a user