Compare commits
115 Commits
overworld_
...
overworld_
| Author | SHA1 | Date | |
|---|---|---|---|
| dacae98439 | |||
|
|
3b3a153ebe | ||
|
|
81f0270ca4 | ||
|
|
00352cc52a | ||
|
|
62356f0159 | ||
|
|
3cbc1ab42e | ||
|
|
3dfae76275 | ||
|
|
6de8dc606c | ||
|
|
84992d010f | ||
|
|
43552d1a64 | ||
|
|
a6507eea6d | ||
|
|
68af5f735e | ||
|
|
766cc67dcd | ||
|
|
70badade72 | ||
|
|
edad66a5a8 | ||
|
|
47ce48a31a | ||
|
|
f3b2719a5b | ||
|
|
fdd8fedaef | ||
|
|
4c1433464e | ||
|
|
8e9b4c234b | ||
| 63f0f8002f | |||
|
|
1290751307 | ||
| 4b8de58460 | |||
| 93e1cfa361 | |||
| fa484ec987 | |||
| 256f0fa270 | |||
| 5ad699f731 | |||
| 0b01f75f80 | |||
| f076566dca | |||
| 4815c9971a | |||
| 723d359b0a | |||
| ed85faaab5 | |||
| 13ccba90c3 | |||
| b52404469b | |||
| cd1a1f4288 | |||
| 25c44cd2bb | |||
|
|
6980d36d27 | ||
|
|
173b474b9d | ||
|
|
8d0585ec33 | ||
|
|
1c0b7b5320 | ||
|
|
bdf8c7bd6e | ||
|
|
2f8daa3903 | ||
|
|
ffe7985139 | ||
|
|
653f66e57a | ||
|
|
c424cf4311 | ||
|
|
f51df3e6eb | ||
|
|
144817fe90 | ||
|
|
cac3ecf4ef | ||
|
|
e8a0697829 | ||
|
|
1235357531 | ||
|
|
6dab19d38f | ||
|
|
c5d7f3291a | ||
|
|
b170620285 | ||
|
|
9c08588d92 | ||
|
|
3497bd6514 | ||
|
|
71916fb320 | ||
|
|
81a3fcf773 | ||
|
|
0933392e6d | ||
|
|
0803e6e290 | ||
|
|
38fa9c3902 | ||
|
|
1b564d99fc | ||
|
|
06d22255ef | ||
|
|
8e48df8c12 | ||
|
|
5c640a05f1 | ||
|
|
c002b974f9 | ||
|
|
9651f9fb1d | ||
|
|
09d93ae5f2 | ||
|
|
bae7457961 | ||
|
|
9500800c3c | ||
|
|
48b2238109 | ||
|
|
20f8ef457e | ||
|
|
90396136d3 | ||
|
|
40d301b3e0 | ||
|
|
3d9b76eda0 | ||
|
|
bd2ebd7827 | ||
|
|
8a9b138d55 | ||
|
|
480372f7a5 | ||
|
|
08c178a974 | ||
|
|
7da838d1fc | ||
|
|
12691a0c4a | ||
|
|
511cc1af51 | ||
|
|
f89802a74e | ||
|
|
dd29578c0a | ||
|
|
25dc4217c6 | ||
|
|
bd2432d2ce | ||
|
|
d97f5fd23e | ||
|
|
1bdcbf5b62 | ||
|
|
d4e792a71f | ||
|
|
cb1a4cbb69 | ||
|
|
84b3c1ad50 | ||
|
|
8522968c1b | ||
|
|
ee4fce4010 | ||
|
|
8d3e084c1d | ||
|
|
92e04bde55 | ||
|
|
1316477771 | ||
|
|
b10dff8a30 | ||
|
|
49c486a2cc | ||
|
|
726b9441b7 | ||
|
|
69a6e7f918 | ||
|
|
11e815bd96 | ||
|
|
fb1f7ad907 | ||
|
|
04aabc8bd8 | ||
|
|
eeebe58819 | ||
|
|
8e8c195fa9 | ||
|
|
8102b75b0c | ||
|
|
a1fb6ea1af | ||
|
|
f8602a74cb | ||
|
|
f703dcaba7 | ||
|
|
380f917e60 | ||
|
|
67f2164caf | ||
|
|
5c213477bc | ||
|
|
1453dd12a7 | ||
|
|
72e8d73277 | ||
|
|
13879317fe | ||
|
|
b9c8984d6d |
@@ -44,7 +44,10 @@ dw !ROM_VERSION_HIGH
|
||||
|
||||
!MS_GOT = "$7F5031"
|
||||
|
||||
!REDRAW = "$7F5000"
|
||||
;!REDRAW = "$7F5000"
|
||||
!SPRITE_REDRAW = "$7E0790" ; 16 bytes
|
||||
!SPRITE_OAM = "$7EC025" ; 16 bytes
|
||||
!SPRITE_DYNAMIC_OAM = "$7EC035" ; 16 bytes
|
||||
!GANON_WARP_CHAIN = "$7F5032";
|
||||
|
||||
!TILE_UPLOAD_BUFFER = "$7EA180";
|
||||
@@ -74,7 +77,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_NEW_TEXT ?= 0
|
||||
!FEATURE_NEW_TEXT ?= 1
|
||||
|
||||
;================================================================================
|
||||
|
||||
@@ -97,6 +100,7 @@ function hexto555(h) = ((((h&$FF)/8)<<10)|(((h>>8&$FF)/8)<<5)|(((h>>16&$FF)/8)<<
|
||||
|
||||
!FLAG_OW_MIXED = $04
|
||||
!FLAG_OW_CROSSED = $02
|
||||
!FLAG_OW_BONKDROP = $02
|
||||
|
||||
incsrc hooks.asm
|
||||
incsrc treekid.asm
|
||||
@@ -226,6 +230,7 @@ warnpc $A58000
|
||||
org $A28000 ; contrib area
|
||||
incsrc contrib.asm
|
||||
incsrc special_weapons.asm
|
||||
incsrc item_on_b.asm
|
||||
incsrc variable_ganon_vulnerability.asm
|
||||
warnpc $A38000
|
||||
|
||||
@@ -329,24 +334,24 @@ BossMapIconGFX:
|
||||
incbin bossicons.4bpp
|
||||
|
||||
if !FEATURE_NEW_TEXT
|
||||
org $339C00
|
||||
NewFont:
|
||||
incbin newfont.bin
|
||||
NewFontInverted:
|
||||
incbin newfont_inverted.bin
|
||||
org $339C00
|
||||
NewFont:
|
||||
incbin newfont.bin
|
||||
NewFontInverted:
|
||||
incbin newfont_inverted.bin
|
||||
|
||||
org $0CD7DF
|
||||
incbin text_unscramble1.bin
|
||||
org $0CE4D5
|
||||
incbin text_unscramble2.bin
|
||||
org $0CD7DF
|
||||
incbin text_unscramble1.bin
|
||||
org $0CE4D5
|
||||
incbin text_unscramble2.bin
|
||||
endif
|
||||
|
||||
org $328000
|
||||
Extra_Text_Table:
|
||||
if !FEATURE_NEW_TEXT
|
||||
incsrc itemtext_lower.asm
|
||||
incsrc itemtext_lower.asm
|
||||
else
|
||||
incsrc itemtext.asm
|
||||
incsrc itemtext.asm
|
||||
endif
|
||||
warnpc $32E000
|
||||
|
||||
@@ -513,6 +518,9 @@ Attract_DecompressStoryGfx:
|
||||
org $00E529
|
||||
LoadSelectScreenGfx:
|
||||
|
||||
org $00E784
|
||||
LoadCommonSprites_in_file_select:
|
||||
|
||||
org $00F945
|
||||
PrepDungeonExit:
|
||||
|
||||
@@ -527,6 +535,9 @@ Module_PreDungeon:
|
||||
org $028296
|
||||
.setAmbientSfx
|
||||
|
||||
org $828AD9
|
||||
Underworld_SetBossOrSancMusicUponEntry:
|
||||
|
||||
org $02A0A8
|
||||
Dungeon_SaveRoomData:
|
||||
|
||||
@@ -536,6 +547,9 @@ Dungeon_SaveRoomData_justKeys:
|
||||
org $02A4E3
|
||||
Overworld_ActualScreenID:
|
||||
|
||||
org $02A9F3
|
||||
OverworldHandleTransitions_change_palettes:
|
||||
|
||||
org $02B861
|
||||
Dungeon_SaveRoomQuadrantData:
|
||||
|
||||
@@ -545,12 +559,18 @@ CalculateTransitionLanding:
|
||||
org $02C176
|
||||
Overworld_FinalizeEntryOntoScreen_Data:
|
||||
|
||||
org $82C3F2
|
||||
OverworldLoadScreensPaletteSet_long:
|
||||
|
||||
org $02D9B9
|
||||
Underworld_LoadSpawnEntrance:
|
||||
|
||||
org $02E99D
|
||||
FluteMenu_LoadTransport:
|
||||
|
||||
org $02FD6D
|
||||
LoadGearPalettes_link:
|
||||
|
||||
org $02FD8A ; 17D8A - Bank0E.asm: 3732 Note: Different bank
|
||||
LoadGearPalettes_bunny:
|
||||
|
||||
@@ -566,12 +586,12 @@ Overworld_MemorizeMap16Change:
|
||||
org $04E879
|
||||
Overworld_CheckForSpecialOverworldTrigger_Direction:
|
||||
|
||||
org $058008
|
||||
Sprite_SpawnSparkleGarnish:
|
||||
|
||||
org $05A51D
|
||||
Sprite_SpawnFallingItem:
|
||||
|
||||
org $05AFF1
|
||||
Sprite_6C_MirrorPortal_dont_do_warp:
|
||||
|
||||
org $05DF6C ; 02DF6C - Bank05.asm : 2445
|
||||
Sprite_DrawMultiple:
|
||||
|
||||
@@ -617,6 +637,9 @@ Sprite_PrepAndDrawSingleLargeLong:
|
||||
org $06DC00
|
||||
Sprite_PrepAndDrawSingleSmallLong:
|
||||
|
||||
org $06E41C
|
||||
Sprite_PrepOAMCoordLong:
|
||||
|
||||
org $06EA18
|
||||
Sprite_ApplySpeedTowardsPlayerLong:
|
||||
|
||||
@@ -638,6 +661,9 @@ Link_ReceiveItem:
|
||||
org $079F82
|
||||
Link_UseHammer:
|
||||
|
||||
org $07AFEE
|
||||
Link_UseBugNet:
|
||||
|
||||
org $07A985
|
||||
SetGameModeLikeMirror:
|
||||
|
||||
@@ -656,14 +682,17 @@ Ancilla_ReceiveItem:
|
||||
org $08C505
|
||||
Ancilla_ReceiveItem_objectFinished:
|
||||
|
||||
org $08CE93
|
||||
Ancilla_BreakTowerSeal_draw_single_crystal:
|
||||
org $08CE2E
|
||||
GTCutscene_AnimateCrystals_NoRotate:
|
||||
|
||||
org $08CEB6
|
||||
GTCutscene_DrawSingleCrystal_SkipCrystal:
|
||||
|
||||
org $08CEC3
|
||||
Ancilla_BreakTowerSeal_stop_spawning_sparkles:
|
||||
GTCutscene_DrawSingleCrystal_SkipSparkle:
|
||||
|
||||
org $08CF59
|
||||
BreakTowerSeal_ExecuteSparkles:
|
||||
GTCutscene_SparkleALot:
|
||||
|
||||
org $08F710
|
||||
Ancilla_SetOam_XY_Long:
|
||||
@@ -829,6 +858,12 @@ DiggingGameGuy_AttemptPrizeSpawn:
|
||||
org $1EDE28
|
||||
Sprite_GetEmptyBottleIndex: ; this is totally in sprite_bees.asm
|
||||
|
||||
org $1EDE89
|
||||
GoldBee_Dormant_exit:
|
||||
|
||||
org $1EDE8A
|
||||
GoldBee_SpawnSelf:
|
||||
|
||||
org $1EF4E7
|
||||
Sprite_PlayerCantPassThrough:
|
||||
;================================================================================
|
||||
|
||||
@@ -5,13 +5,12 @@ LoadLibraryItemGFX:
|
||||
LDA.l LibraryItem_Player : STA !MULTIWORLD_SPRITEITEM_PLAYER_ID
|
||||
%GetPossiblyEncryptedItem(LibraryItem, SpriteItemValues)
|
||||
STA $0E80, X ; Store item type
|
||||
JSL.l PrepDynamicTile
|
||||
RTL
|
||||
JML RequestSlottedTile
|
||||
;--------------------------------------------------------------------------------
|
||||
DrawLibraryItemGFX:
|
||||
PHA
|
||||
LDA $0E80, X ; Retrieve stored item type
|
||||
JSL.l DrawDynamicTile
|
||||
JSL.l DrawSlottedTile
|
||||
PLA
|
||||
RTL
|
||||
;--------------------------------------------------------------------------------
|
||||
@@ -25,27 +24,23 @@ RTL
|
||||
;================================================================================
|
||||
; Randomize Bonk Keys
|
||||
;--------------------------------------------------------------------------------
|
||||
!REDRAW = "$7F5000"
|
||||
;--------------------------------------------------------------------------------
|
||||
LoadBonkItemGFX:
|
||||
LDA.b #$08 : STA $0F50, X ; thing we wrote over
|
||||
LoadBonkItemGFX_inner:
|
||||
LDA.b #$00 : STA !REDRAW
|
||||
JSR LoadBonkItem_Player : STA !MULTIWORLD_SPRITEITEM_PLAYER_ID
|
||||
JSR LoadBonkItem
|
||||
JSL.l PrepDynamicTile
|
||||
RTL
|
||||
JML RequestSlottedTile
|
||||
;--------------------------------------------------------------------------------
|
||||
DrawBonkItemGFX:
|
||||
PHA
|
||||
LDA !REDRAW : BEQ .skipInit ; skip init if already ready
|
||||
JSL.l LoadBonkItemGFX_inner
|
||||
BRA .done ; don't draw on the init frame
|
||||
LDA.w !SPRITE_REDRAW, X : BEQ .skipInit ; skip init if already ready
|
||||
JSL.l LoadBonkItemGFX_inner
|
||||
LDA.w !SPRITE_REDRAW, X : CMP.b #$02 : BEQ .skipInit
|
||||
BRA .done ; don't draw on the init frame
|
||||
|
||||
.skipInit
|
||||
|
||||
JSR LoadBonkItem
|
||||
JSL.l DrawDynamicTileNoShadow
|
||||
JSR LoadBonkItem
|
||||
JSL DrawSlottedTile
|
||||
|
||||
.done
|
||||
PLA
|
||||
@@ -69,7 +64,7 @@ RTL
|
||||
LoadBonkItem:
|
||||
LDA $A0 ; check room ID - only bonk keys in 2 rooms so we're just checking the lower byte
|
||||
CMP #115 : BNE + ; Desert Bonk Key
|
||||
LDA.l BonkKey_Desert
|
||||
LDA.l BonkKey_Desert
|
||||
BRA ++
|
||||
+ : CMP #140 : BNE + ; GTower Bonk Key
|
||||
LDA.l BonkKey_GTower
|
||||
@@ -85,7 +80,7 @@ LoadBonkItem_Player:
|
||||
LDA.l BonkKey_Desert_Player
|
||||
BRA ++
|
||||
+ : CMP #140 : BNE + ; GTower Bonk Key
|
||||
LDA.l BonkKey_GTower_Player
|
||||
LDA.l BonkKey_GTower_Player
|
||||
BRA ++
|
||||
+
|
||||
LDA.b #$00
|
||||
|
||||
27
bugfixes.asm
27
bugfixes.asm
@@ -90,11 +90,11 @@ FixAga2Bunny:
|
||||
++
|
||||
JSL DecideIfBunny : BNE +
|
||||
JSR MakeBunny
|
||||
LDA.b #$04 : STA.w $012C ; play bunny music
|
||||
BRA .done
|
||||
+
|
||||
LDA.b #$09 : STA.w $012C ; what we wrote over
|
||||
.done
|
||||
PHX
|
||||
JSL Overworld_DetermineMusic : STX !REG_MUSIC_CONTROL_REQUEST
|
||||
PLX
|
||||
RTL
|
||||
;--------------------------------------------------------------------------------
|
||||
|
||||
@@ -200,6 +200,27 @@ LDA $1B : BNE +
|
||||
+
|
||||
RTL
|
||||
|
||||
;--------------------------------------------------------------------------------
|
||||
; Fix losing VRAM gfx when using quake
|
||||
PostNMIUpdateBGCharHalf:
|
||||
STA.w $420B : SEP #$10 ; what we wrote over
|
||||
LDA.w $0116 : CMP.b #$46 : BNE .return ; checks to see if this is the last VRAM write
|
||||
LDA.b $5D : CMP.b #$08 : BCC + : CMP.b #$0A+1 : BCS + ; skip if we're mid-medallion
|
||||
RTL
|
||||
+ JSL HeartPieceSetRedraw ; set redraw flag for items
|
||||
.return
|
||||
RTL
|
||||
|
||||
; Force redraws of items following map checks
|
||||
PostOverworldGfxLoad:
|
||||
INC.b $11 : STZ.b $13 ; what we wrote over
|
||||
JSL HeartPieceSetRedraw
|
||||
RTL
|
||||
PostUnderworldMap:
|
||||
JSL HeartPieceSetRedraw
|
||||
LDA.l $7EC229 ; what we wrote over
|
||||
RTL
|
||||
|
||||
;--------------------------------------------------------------------------------
|
||||
FixJingleGlitch:
|
||||
LDA.b $11
|
||||
|
||||
BIN
c2807_v4.bin
BIN
c2807_v4.bin
Binary file not shown.
BIN
c2807_v4.gfx
BIN
c2807_v4.gfx
Binary file not shown.
16
catfish.asm
16
catfish.asm
@@ -1,25 +1,23 @@
|
||||
;================================================================================
|
||||
; Randomize Catfish
|
||||
;--------------------------------------------------------------------------------
|
||||
!HEART_REDRAW = "$7F5000"
|
||||
LoadCatfishItemGFX:
|
||||
LDA.l CatfishItem_Player : STA !MULTIWORLD_SPRITEITEM_PLAYER_ID
|
||||
LDA.l $1DE185 ; location randomizer writes catfish item to
|
||||
JML PrepDynamicTile
|
||||
LDA.l $1DE185 ; location randomizer writes catfish item to
|
||||
JML RequestSlottedTile
|
||||
;--------------------------------------------------------------------------------
|
||||
DrawThrownItem:
|
||||
LDA $8A : CMP.b #$81 : BNE .catfish
|
||||
|
||||
.zora
|
||||
LDA.b #$01 : STA !HEART_REDRAW
|
||||
LDA.l $1DE1C3 ; location randomizer writes zora item to
|
||||
LDA.l $1DE1C3 ; location randomizer writes zora item to
|
||||
BRA .draw
|
||||
|
||||
.catfish
|
||||
LDA.l $1DE185 ; location randomizer writes catfish item to
|
||||
LDA.l $1DE185 ; location randomizer writes catfish item to
|
||||
|
||||
.draw
|
||||
JML DrawDynamicTile
|
||||
JML DrawSlottedTile
|
||||
;--------------------------------------------------------------------------------
|
||||
MarkThrownItem:
|
||||
PHA
|
||||
@@ -27,12 +25,12 @@ MarkThrownItem:
|
||||
LDA $8A : CMP.b #$81 : BNE .catfish
|
||||
|
||||
.zora
|
||||
JSL.l ItemSet_ZoraKing
|
||||
JSL.l ItemSet_ZoraKing
|
||||
LDA ZoraItem_Player : STA !MULTIWORLD_ITEM_PLAYER_ID
|
||||
BRA .done
|
||||
|
||||
.catfish
|
||||
JSL.l ItemSet_Catfish
|
||||
JSL.l ItemSet_Catfish
|
||||
LDA CatfishItem_Player : STA !MULTIWORLD_ITEM_PLAYER_ID
|
||||
|
||||
.done
|
||||
|
||||
Binary file not shown.
@@ -10,12 +10,14 @@ DoWorldFix:
|
||||
LDA InvertedMode : BEQ +
|
||||
JMP DoWorldFix_Inverted
|
||||
+
|
||||
LDA FollowerIndicator : CMP #$04 : BEQ .aga1Alive ; if old man following, skip mirror/aga check
|
||||
LDA.l Bugfix_MirrorlessSQToLW : BEQ .skip_mirror_check
|
||||
LDA MirrorEquipment : AND #$02 : BEQ .noMirror ; check if we have the mirror
|
||||
LDA FollowerIndicator : CMP #$04 : BNE + ; if old man following, skip mirror/aga check
|
||||
LDA.l OldManRetrievalWorld
|
||||
BRA .noMirror
|
||||
+ LDA MirrorEquipment : AND #$02 : BEQ .noMirror ; check if we have the mirror
|
||||
.skip_mirror_check ; alt entrance point
|
||||
LDA ProgressIndicator : CMP.b #$03 : BCS .done ; check if agahnim 1 is alive
|
||||
.aga1Alive
|
||||
.setLightWorld
|
||||
LDA #$00
|
||||
.noMirror
|
||||
STA CurrentWorld ; set flag to light world
|
||||
@@ -54,14 +56,18 @@ JMP DoWorldFix_skip_mirror_check
|
||||
RTL
|
||||
;================================================================================
|
||||
DoWorldFix_Inverted:
|
||||
LDA FollowerIndicator : CMP #$04 : BEQ .aga1Alive ; if old man following, skip mirror/aga check
|
||||
LDA.l Bugfix_MirrorlessSQToLW : BEQ .skip_mirror_check
|
||||
LDA.l MirrorEquipment : AND #$02 : BEQ .noMirror ; check if we have the mirror
|
||||
LDA FollowerIndicator : CMP #$04 : BNE + ; if old man following, skip mirror/aga check
|
||||
LDA.l OldManRetrievalWorld
|
||||
BRA .setWorld
|
||||
+ LDA.l MirrorEquipment : AND #$02 : BEQ .noMirror ; check if we have the mirror
|
||||
.skip_mirror_check ; alt entrance point
|
||||
LDA ProgressIndicator : CMP.b #$03 : BCS .done ; check if agahnim 1 is alive
|
||||
.noMirror
|
||||
.aga1Alive
|
||||
LDA #$40 : STA CurrentWorld ; set flag to dark world
|
||||
.setDarkWorld
|
||||
LDA #$40
|
||||
.setWorld
|
||||
STA CurrentWorld ; set flag to dark world
|
||||
LDA.l SmithDeleteOnSave : BEQ .transform
|
||||
LDA FollowerIndicator
|
||||
CMP #$07 : BEQ .clear ; clear frog
|
||||
@@ -104,6 +110,15 @@ FakeWorldFix:
|
||||
+
|
||||
RTL
|
||||
;--------------------------------------------------------------------------------
|
||||
GetCurrentWorldForLoad:
|
||||
LDA FollowerIndicator : CMP #$04 : BNE .default
|
||||
LDA InvertedMode : BEQ +
|
||||
LDA #$40
|
||||
+ RTL
|
||||
.default
|
||||
LDA CurrentWorld
|
||||
RTL
|
||||
;--------------------------------------------------------------------------------
|
||||
MasterSwordFollowerClear:
|
||||
LDA FollowerIndicator
|
||||
CMP #$0E : BNE .exit ; clear master sword follower
|
||||
@@ -129,17 +144,23 @@ RefreshRainAmmo:
|
||||
+ CMP.b #$03 : BNE + ; Uncle
|
||||
%SetMinimum(CurrentMagic,MagicFiller,RainDeathRefillMagic_Uncle)
|
||||
%SetMinimum(BombsEquipment,BombsFiller,RainDeathRefillBombs_Uncle)
|
||||
%SetMinimum(CurrentArrows,ArrowsFiller,RainDeathRefillArrows_Uncle)
|
||||
BRA .done
|
||||
LDA.l ArrowMode : BEQ ++
|
||||
LDA.l BowEquipment : BEQ +++
|
||||
++ %SetMinimum(CurrentArrows,ArrowsFiller,RainDeathRefillArrows_Uncle)
|
||||
+++ BRA .done
|
||||
+ CMP.b #$02 : BNE + ; Cell
|
||||
%SetMinimum(CurrentMagic,MagicFiller,RainDeathRefillMagic_Cell)
|
||||
%SetMinimum(BombsEquipment,BombsFiller,RainDeathRefillBombs_Cell)
|
||||
%SetMinimum(CurrentArrows,ArrowsFiller,RainDeathRefillArrows_Cell)
|
||||
LDA.l ArrowMode : BEQ ++
|
||||
LDA.l BowEquipment : BEQ .done
|
||||
++ %SetMinimum(CurrentArrows,ArrowsFiller,RainDeathRefillArrows_Cell)
|
||||
BRA .done
|
||||
+ CMP.b #$04 : BNE + ; Mantle
|
||||
%SetMinimum(CurrentMagic,MagicFiller,RainDeathRefillMagic_Mantle)
|
||||
%SetMinimum(BombsEquipment,BombsFiller,RainDeathRefillBombs_Mantle)
|
||||
%SetMinimum(CurrentArrows,ArrowsFiller,RainDeathRefillArrows_Mantle)
|
||||
LDA.l ArrowMode : BEQ ++
|
||||
LDA.l BowEquipment : BEQ .done
|
||||
++ %SetMinimum(CurrentArrows,ArrowsFiller,RainDeathRefillArrows_Mantle)
|
||||
+
|
||||
.done
|
||||
RTL
|
||||
@@ -159,7 +180,7 @@ SetEscapeAssist:
|
||||
BIT.b #$10 : BEQ + : STA InfiniteArrowsModifier : +
|
||||
++
|
||||
|
||||
LDA.l SpecialWeapons : CMP #$01 : BNE +
|
||||
LDA.l SpecialWeapons : AND.b #$7F : CMP #$01 : BNE +
|
||||
LDA.l SpecialWeaponLevel : BEQ +
|
||||
LDA #$01 : STA InfiniteBombsModifier
|
||||
+
|
||||
|
||||
@@ -306,7 +306,7 @@ DialogGanon2:
|
||||
LDA.w #$018D : JMP .done
|
||||
+
|
||||
LDA.l GanonVulnerabilityItem : AND #$00FF : BNE .special_item
|
||||
LDA.l SpecialWeapons : AND.w #$00FF
|
||||
LDA.l SpecialWeapons : AND.w #$007F
|
||||
CMP.w #$0001 : BEQ .bombs ; bombs if special bomb mode
|
||||
.silver_arrows
|
||||
LDA.l BowTracking
|
||||
|
||||
@@ -74,4 +74,17 @@ WalkUpOnOverworld:
|
||||
RTL
|
||||
.normal
|
||||
LDA #$0002 : STA $2F ; what we overwrote
|
||||
RTL
|
||||
RTL
|
||||
|
||||
;--------------------------------------------------------------------------------
|
||||
; CheckStairsAdjustment
|
||||
;--------------------------------------------------------------------------------
|
||||
CheckStairsAdjustment:
|
||||
LDA.b $A0
|
||||
CMP.w #$0124 ; vanilla check, rooms $0124 to $0127 have a lower exit position (currently ER ignores the entrance location)
|
||||
BCC .done
|
||||
LDA.w #$FFFF-1
|
||||
CMP.w $0696 ; tavern back ($0696 == #$FFFF) should always have carry cleared
|
||||
.done
|
||||
RTL
|
||||
; if carry cleared, shift position up
|
||||
51
doorrando/bugfix/kholdstare_shell_collision.asm
Normal file
51
doorrando/bugfix/kholdstare_shell_collision.asm
Normal file
@@ -0,0 +1,51 @@
|
||||
pushpc
|
||||
|
||||
org $9E9463
|
||||
JSL CheckKholdShellCoordinates
|
||||
BCC Sprite_A3_KholdstareShell_link_not_close
|
||||
BRA Sprite_A3_KholdstareShell_link_close
|
||||
NOP #13
|
||||
|
||||
Sprite_A3_KholdstareShell_link_close = $9E9478
|
||||
Sprite_A3_KholdstareShell_link_not_close = $9E9480
|
||||
|
||||
pullpc
|
||||
|
||||
CheckKholdShellCoordinates:
|
||||
|
||||
LDA.w $0D30, X
|
||||
XBA
|
||||
LDA.w $0D10, X ; full 16 bit X coordinate of sprite
|
||||
|
||||
REP #$21
|
||||
SBC.w #$0020
|
||||
CMP.b $22
|
||||
BCS .not_colliding
|
||||
|
||||
ADC.w #$0040
|
||||
CMP.b $22
|
||||
BCC .not_colliding
|
||||
|
||||
SEP #$20
|
||||
LDA.w $0D20, X
|
||||
XBA
|
||||
LDA.w $0D00, X ; full 16 bit Y coordinate of sprite
|
||||
|
||||
REP #$21
|
||||
SBC.w #$001F ; could go to 27 and let link squeeze in at Lanmo 2 (please adjust the following one)
|
||||
CMP.b $20
|
||||
BCS .not_colliding
|
||||
|
||||
ADC.w #$0037
|
||||
CMP.b $20
|
||||
BCC .not_colliding
|
||||
|
||||
SEP #$20 ; collision detected
|
||||
SEC
|
||||
RTL
|
||||
|
||||
.not_colliding
|
||||
SEP #$30
|
||||
CLC
|
||||
RTL
|
||||
|
||||
@@ -41,6 +41,11 @@ DRScroll:
|
||||
db 0
|
||||
OffsetTable:
|
||||
dw -8, 8
|
||||
org $A78010
|
||||
DRVersionInfo:
|
||||
dw $0000, $0000, $0000, $0000, $0000, $0000, $0000, $0000
|
||||
|
||||
org $A78020
|
||||
|
||||
incsrc normal.asm
|
||||
incsrc scroll.asm
|
||||
@@ -53,6 +58,7 @@ incsrc math.asm
|
||||
incsrc hudadditions.asm
|
||||
incsrc dr_lobby.asm
|
||||
incsrc entrance_fixes.asm
|
||||
incsrc bugfix/kholdstare_shell_collision.asm
|
||||
warnpc $A79C00
|
||||
|
||||
incsrc doortables.asm
|
||||
|
||||
@@ -693,4 +693,6 @@ dw $ffff
|
||||
SanctuaryDarkWorld:
|
||||
dw $ffff
|
||||
OldManDarkWorld:
|
||||
dw $ffff
|
||||
dw $ffff
|
||||
OldManRetrievalWorld:
|
||||
dw $0000
|
||||
@@ -13,6 +13,9 @@ PHP
|
||||
|
||||
SetDefaultWorld:
|
||||
PHP : SEP #$20
|
||||
LDA.l FollowerIndicator : CMP #$04 : BNE .default
|
||||
LDA.l OldManRetrievalWorld : BRA +
|
||||
.default
|
||||
LDA.l InvertedMode : BEQ +
|
||||
LDA.b #$40
|
||||
+ STA CurrentWorld
|
||||
|
||||
@@ -44,6 +44,8 @@ org $8293d1 ; <- 113d1 - Bank02.asm : 3683 (ADD $20 : STA $20 BRANCH_IOTA)
|
||||
jsl StraightStairsFix : nop
|
||||
org $829396 ; <- 11396 - Bank02.asm : 3641 (LDA $01C322, X)
|
||||
jsl StraightStairLayerFix
|
||||
org $82c06d ; <- Bank02.asm : 9874 (LDX $0418, CMP.b #$02)
|
||||
jsl DoorToStraight : nop
|
||||
org $82c092 ; STA $0020, Y : LDX #$00
|
||||
jsl DoorToInroom : nop
|
||||
org $82c0f8 ; CMP $02C034, X
|
||||
@@ -190,10 +192,9 @@ JSL.l Underworld_DoorDown_Entry : CPX #$FF
|
||||
BEQ + : db $80, $1C ; BRA $028B04
|
||||
NOP #6 : +
|
||||
|
||||
org $82C3F2 ; <- Bank02.asm:10521 Unused call
|
||||
Underworld_DoorDown_Call:
|
||||
org $82C3F3
|
||||
dw $8AD9 ; address of Bank02.asm:2085
|
||||
org $82FD00 ; unreachable code
|
||||
Underworld_SetBossOrSancMusicUponEntry_long:
|
||||
JSR Underworld_SetBossOrSancMusicUponEntry : RTL
|
||||
|
||||
org $81AA90
|
||||
JSL BigKeyDoorCheck : NOP
|
||||
@@ -212,9 +213,16 @@ bcs .normal
|
||||
rts
|
||||
.normal
|
||||
|
||||
; fixes an issue with edges -> normal doors (bombable, dashable, keydoor)
|
||||
org $82C06A
|
||||
JSL TransitionCalculateLanding_Fix : NOP #2
|
||||
|
||||
org $82C157
|
||||
JSL AlwaysPushThroughFDoors
|
||||
|
||||
; Modified from OWR - will need to remove once merged
|
||||
; org $85AF75
|
||||
; Sprite_6C_MirrorPortal:
|
||||
; JSL FixOvalFadeOutMirror : NOP #2 ; LDA $7EF3CA : BNE $05AFDF
|
||||
; org $85AFDF
|
||||
; Sprite_6C_MirrorPortal_missing_mirror:
|
||||
|
||||
org $80E766
|
||||
JML ConditionalLoadCommonSprites_Do3To4Low : NOP #2
|
||||
LoadCommonSprites_Prep3To4Low:
|
||||
|
||||
@@ -1,9 +1,7 @@
|
||||
; defines
|
||||
; Ram usage
|
||||
EdgeToNormalFlag = $7E1200
|
||||
|
||||
HorzEdge:
|
||||
LDA.b #$00 : STA.l EdgeToNormalFlag
|
||||
cpy #$ff : beq +
|
||||
jsr DetectWestEdge : ldy #$02 : bra ++
|
||||
+ jsr DetectEastEdge
|
||||
@@ -18,7 +16,6 @@ HorzEdge:
|
||||
+ clc : rts
|
||||
|
||||
VertEdge:
|
||||
LDA.b #$00 : STA.l EdgeToNormalFlag
|
||||
cpy #$ff : beq +
|
||||
jsr DetectNorthEdge : bra ++
|
||||
+ jsr DetectSouthEdge
|
||||
@@ -62,7 +59,6 @@ LoadEdgeRoomVert:
|
||||
lda $04 : and #$80 : bne .edge
|
||||
lda $04 : sta $01 ; load up flags in $01
|
||||
and #$03 : cmp #$03 : beq .inroom
|
||||
LDA.b #$01 : STA.l EdgeToNormalFlag
|
||||
ldy #$01 : jsr ShiftVariablesMainDir
|
||||
jsr PrepScrollToNormal
|
||||
bra .scroll
|
||||
@@ -302,22 +298,6 @@ DetectEastEdge:
|
||||
ldx #$08
|
||||
.end txa : rts
|
||||
|
||||
|
||||
TransitionCalculateLanding_Fix:
|
||||
LDA.l EdgeToNormalFlag : BEQ +
|
||||
LDX.w $0418 : CPX.b #$01 : BNE +
|
||||
LDA.b $20 : SBC #$08 : STA.b $20
|
||||
+ PHK : PEA.w .jslrtsreturn-1
|
||||
PEA.w $02802C
|
||||
JML CalculateTransitionLanding
|
||||
.jslrtsreturn
|
||||
LDX.w $0418 : CPX.b #$01 : BNE .zero ; the LDX is vanilla and needs to always run
|
||||
LDA.l EdgeToNormalFlag : BEQ +
|
||||
LDA.b $20 : ADC #$08 : STA.b $20
|
||||
.zero LDA.b #$00 : STA.l EdgeToNormalFlag
|
||||
+ JSL DoorToStraight
|
||||
RTL
|
||||
|
||||
AlwaysPushThroughFDoors:
|
||||
PHA : AND.b #$F0 : CMP.b #$F0 : BNE +
|
||||
PLA : RTL
|
||||
|
||||
@@ -12,9 +12,17 @@
|
||||
; 2) Draw over what vanilla just drew
|
||||
; 3) Hijack the door tile type routine
|
||||
; and replace the vanilla value with that of solid collision
|
||||
|
||||
; For door dection free RAM at $19EE-$19FF has been co-opted to door each drawn doors position and type bytes
|
||||
; 19EE is for the "current" door for the IdentifyBlockedEntrance routine
|
||||
; The array at 19F0 is for the collision routine to retrieve that information as it is no longer
|
||||
; available by that point
|
||||
;===================================================================================================
|
||||
pushpc
|
||||
|
||||
org $01B0E6
|
||||
JSL StoreDoorInfo
|
||||
|
||||
org $01892F
|
||||
DoorDrawJankMove:
|
||||
JML PrepDoorDraw
|
||||
@@ -30,9 +38,17 @@ warnpc $018939
|
||||
org $01BF43
|
||||
JSL AdjustEscapeDoorCollision
|
||||
|
||||
org $01C132 ; ADC.w #$0040 : TAX : LDA.b $00
|
||||
JSL AdjustEscapeDoorCollision_LowEntrance : NOP #2
|
||||
|
||||
pullpc
|
||||
|
||||
;===================================================================================================
|
||||
StoreDoorInfo:
|
||||
STA.w $1980,X
|
||||
LDA.b $00 : STA.w $19F0,X
|
||||
TXA
|
||||
RTL
|
||||
|
||||
PrepDoorDraw:
|
||||
; first off, we need this routine to return to our jank hook
|
||||
@@ -43,6 +59,8 @@ PrepDoorDraw:
|
||||
; Much easier to just tell you to look at $01890D in the disassembly
|
||||
; and you should understand the vanilla program flow we need to reject
|
||||
PEA.w DoorDrawJankMove_return-1
|
||||
LDA.b $00
|
||||
STA.w $19EE ; for current routine
|
||||
|
||||
; copy vanilla code (but fast rom)
|
||||
LDA.l $8186F0,X
|
||||
@@ -103,6 +121,9 @@ AdjustEscapeDoorGraphics:
|
||||
ORA.w #$4000 ; horizontally flip
|
||||
STA.l $7E2000+$104,X
|
||||
|
||||
JSR IdentifySwampEntrance
|
||||
BCS .fix_swamp_entrance_alternate
|
||||
|
||||
; the state of the A, X, and Y registers is irrelevant when we exit
|
||||
; they're all subsequently loaded with new values
|
||||
RTL
|
||||
@@ -133,29 +154,18 @@ AdjustEscapeDoorGraphics:
|
||||
STA.l $7E2000+$102,X
|
||||
ORA.w #$4000 ; horizontally flip
|
||||
STA.l $7E2000+$104,X
|
||||
RTL
|
||||
|
||||
.fix_swamp_entrance
|
||||
LDY.w $0460 ; get door index
|
||||
LDX.w $19A0-2,Y ; get tilemap index
|
||||
|
||||
; row 0
|
||||
LDA.w #$9DfC
|
||||
STA.l $7E2000+$000,X
|
||||
STA.l $7E2000+$002,X
|
||||
STA.l $7E2000+$004,X
|
||||
STA.l $7E2000+$006,X
|
||||
|
||||
; row 1
|
||||
; row 1 - outer section
|
||||
LDA.w #$0908
|
||||
STA.l $7E2000+$080,X
|
||||
ORA.w #$4000 ; horizontally flip
|
||||
STA.l $7E2000+$086,X
|
||||
|
||||
LDA.w #$14E8
|
||||
STA.l $7E2000+$082,X
|
||||
ORA.w #$4000 ; horizontally flip
|
||||
STA.l $7E2000+$084,X
|
||||
|
||||
; row 2
|
||||
LDA.w #$0918
|
||||
STA.l $7E2000+$100,X
|
||||
@@ -167,6 +177,20 @@ AdjustEscapeDoorGraphics:
|
||||
ORA.w #$4000 ; horizontally flip
|
||||
STA.l $7E2000+$104,X
|
||||
|
||||
.fix_swamp_entrance_alternate
|
||||
; row 0
|
||||
LDA.w #$9DFC
|
||||
STA.l $7E2000+$000,X
|
||||
STA.l $7E2000+$002,X
|
||||
STA.l $7E2000+$004,X
|
||||
STA.l $7E2000+$006,X
|
||||
|
||||
; row 1 - mid section
|
||||
LDA.w #$14E8
|
||||
STA.l $7E2000+$082,X
|
||||
ORA.w #$4000 ; horizontally flip
|
||||
STA.l $7E2000+$084,X
|
||||
|
||||
; row 3
|
||||
LDA.w #$A82C
|
||||
STA.l $7E2000+$180,X
|
||||
@@ -210,15 +234,15 @@ BlockedEntrance:
|
||||
AdjustEscapeDoorCollision:
|
||||
LSR ; vanilla shift
|
||||
|
||||
AdjustEscapeDoorCollisionShared:
|
||||
; save our parameters
|
||||
; but one or both of these may not be necessary depending on how you detect these doors
|
||||
; all that matters is that after identifying blockage, we have:
|
||||
; Y is the same as what we entered with
|
||||
; X has A>>1, for whatever A entered with
|
||||
PHA
|
||||
LDA.w $1980, Y ; grab door info (type)
|
||||
AND.w #$00FF
|
||||
STA.b $0A ; store in temporary variable
|
||||
LDA.w $19F0, Y ; grab door info (type, position)
|
||||
STA.w $19EE ; store in temporary variable
|
||||
JSR IdentifyBlockedEntrance
|
||||
|
||||
PLX ; this is a TAX in vanilla, just have X pull A instead
|
||||
@@ -235,11 +259,14 @@ AdjustEscapeDoorCollision:
|
||||
|
||||
RTL
|
||||
|
||||
AdjustEscapeDoorCollision_LowEntrance:
|
||||
ADC.w #$0040 ; vanilla add
|
||||
JMP AdjustEscapeDoorCollisionShared
|
||||
|
||||
;===================================================================================================
|
||||
|
||||
; Enter with:
|
||||
; $0A containing the door information: position and type bytes
|
||||
; which should be from $1980, Y or [$B7], Y depending on where in the door process we are
|
||||
; $19EE containing the door information: position and type bytes
|
||||
; Exit with:
|
||||
; carry clear - leave door alone
|
||||
; carry set - block door
|
||||
@@ -262,9 +289,8 @@ IdentifyBlockedEntrance:
|
||||
- INX #2
|
||||
LDA.l RemoveRainDoorsRoom, X : CMP.w #$FFFF : BEQ .leave_alone
|
||||
CMP $A0 : BNE -
|
||||
LDA.b $0A
|
||||
CMP.w #$000A : BCC .continue
|
||||
CMP.w #$0014 : BCS .continue
|
||||
LDA.l RainDoorMatch, X
|
||||
CMP.w $19EE : BNE .leave_alone
|
||||
BRA .block_door
|
||||
.continue
|
||||
BRA -
|
||||
|
||||
@@ -92,4 +92,13 @@ OverridePaletteHeader:
|
||||
lda.l PaletteTable, x
|
||||
iny : rtl
|
||||
+ rep #$20 : iny : lda [$0D], Y ; what we wrote over
|
||||
rtl
|
||||
rtl
|
||||
|
||||
Sprite_ConditionalPrepOAMCoord:
|
||||
LDA.w $0E20,X : CMP.b #$62 : BNE .notMasterSword
|
||||
LDA.w $0D90,X : BNE .specialCutscene
|
||||
.notMasterSword
|
||||
JML Sprite_PrepOAMCoordLong ; what we wrote over
|
||||
.specialCutscene
|
||||
SEC ; this prevents MasterSword sprite from drawing if it is a special cutscene
|
||||
RTL
|
||||
@@ -16,7 +16,7 @@ HudAdditions:
|
||||
+ JSL HexToDec_fast
|
||||
.skip
|
||||
LDA #$207F : STA !GOAL_DRAW_ADDRESS+2 : STA !GOAL_DRAW_ADDRESS+4
|
||||
PLA : PHA : CMP.w #100 : !BLT +
|
||||
LDA.b 1,S : CMP.w #100 : !BLT +
|
||||
LDX.b $05 : TXA : ORA.w #$2490 : STA !GOAL_DRAW_ADDRESS+2 ; draw 100's digit
|
||||
+ PLA : CMP.w #10 : !BLT +
|
||||
LDX.b $06 : TXA : ORA.w #$2490 : STA !GOAL_DRAW_ADDRESS+4 ; draw 10's digit
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
WarpLeft:
|
||||
lda.l DRMode : beq .end
|
||||
lda $040c : cmp.b #$ff : beq .end
|
||||
JSR CheckIfCave : BCS .end
|
||||
lda $20 : ldx $aa
|
||||
jsr CalcIndex
|
||||
!add #$06 : ldy #$01 ; offsets in A, Y
|
||||
@@ -11,7 +11,7 @@ WarpLeft:
|
||||
|
||||
WarpRight:
|
||||
lda.l DRMode : beq .end
|
||||
lda $040c : cmp.b #$ff : beq .end
|
||||
JSR CheckIfCave : BCS .end
|
||||
lda $20 : ldx $aa
|
||||
jsr CalcIndex
|
||||
!add #$12 : ldy #$ff ; offsets in A, Y
|
||||
@@ -22,7 +22,7 @@ WarpRight:
|
||||
|
||||
WarpUp:
|
||||
lda.l DRMode : beq .end
|
||||
lda $040c : cmp.b #$ff : beq .end
|
||||
JSR CheckIfCave : BCS .end
|
||||
lda $22 : ldx $a9
|
||||
jsr CalcIndex
|
||||
ldy #$02 ; offsets in A, Y
|
||||
@@ -40,7 +40,7 @@ endmacro
|
||||
|
||||
WarpDown:
|
||||
lda.l DRMode : beq .end
|
||||
lda $040c : cmp.b #$ff : beq .end
|
||||
JSR CheckIfCave : BCS .end
|
||||
lda $22 : ldx $a9
|
||||
jsr CalcIndex
|
||||
!add #$0c : ldy #$ff ; offsets in A, Y
|
||||
@@ -79,6 +79,14 @@ Cleanup:
|
||||
lda $ef
|
||||
rts
|
||||
|
||||
; carry set if cave, clear otherwise
|
||||
CheckIfCave:
|
||||
REP #$30
|
||||
LDA.b $A2 : CMP.w #$00E1 : BCS .invalid
|
||||
SEP #$30 : CLC : RTS
|
||||
.invalid
|
||||
SEP #$30 : SEC : RTS
|
||||
|
||||
;A needs be to the low coordinate, x needs to be either 0 for left,upper or non-zero for right,down
|
||||
; This sets A (00,02,04) and stores half that at $04 for later use, (src door)
|
||||
CalcIndex: ; A->low byte of Link's Coord, X-> Link's quadrant, DoorOffset x 2 -> A, DoorOffset -> $04 (vert/horz agnostic)
|
||||
@@ -364,8 +372,7 @@ DoorToStraight:
|
||||
lda $a0 : cmp #$51 : bne .skip
|
||||
lda #$04 : sta $4e
|
||||
.skip pla
|
||||
; the ldx $0418 is now taken care of by TransitionCalculateLanding_Fix
|
||||
.end cmp #$02 ;what we wrote over
|
||||
.end LDX.w $0418 : CMP.b #$02 ; what we wrote over
|
||||
rtl
|
||||
}
|
||||
|
||||
@@ -405,7 +412,7 @@ StraightStairsTrapDoor:
|
||||
.animateTraps
|
||||
lda #$05 : sta $11
|
||||
inc $0468 : stz $068e : stz $0690
|
||||
++ JSL Underworld_DoorDown_Call : rtl
|
||||
++ JML Underworld_SetBossOrSancMusicUponEntry_long
|
||||
+ JML Dungeon_ApproachFixedColor ; what we wrote over
|
||||
}
|
||||
|
||||
@@ -426,7 +433,7 @@ HandleSpecialDoorLanding: {
|
||||
HandleIncomingDoorState:
|
||||
PHA
|
||||
LDA.l DRMode : BEQ .noDoor
|
||||
PLA : PHA : AND.b #$FA : CMP.b #$80 : bne .noDoor
|
||||
LDA.b 1,S : AND.b #$FA : CMP.b #$80 : bne .noDoor
|
||||
|
||||
.setDoorState
|
||||
LDA.w $0418 : AND.b #$02 : BNE + : INC
|
||||
@@ -434,7 +441,7 @@ HandleSpecialDoorLanding: {
|
||||
|
||||
.noDoor
|
||||
PLA
|
||||
CMP #$34 : bne + ; inroom stairs
|
||||
PHA : LDA #$26 : STA $045E : PLA
|
||||
CMP.b #$34 : BNE + ; inroom stairs
|
||||
PHA : LDA.b #$26 : STA.w $045E : PLA
|
||||
+ RTL
|
||||
}
|
||||
|
||||
@@ -123,9 +123,18 @@ BlindZeldaDespawnFix:
|
||||
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 #$0400 : BNE + ; skip if the flag is set - bk doors can be double-sided
|
||||
PLA : PEA.w RoomDraw_OneSidedShutters_South_onesided_shutter_or_big_key_door-1
|
||||
+ LDA.w #$0000 : RTL
|
||||
|
||||
; FixOvalFadeOutMirror:
|
||||
; LDA.b $10 : CMP.b #$0F : BEQ .skip_activation
|
||||
; LDA.l InvertedMode : BNE +
|
||||
; LDA.l CurrentWorld : BNE .skip_activation
|
||||
; RTL
|
||||
; + LDA.l CurrentWorld : BEQ .skip_activation
|
||||
; RTL
|
||||
; .skip_activation
|
||||
; PLA : PLA : PLA : JML Sprite_6C_MirrorPortal_missing_mirror
|
||||
|
||||
@@ -1,24 +1,28 @@
|
||||
RecordStairType: {
|
||||
pha
|
||||
lda.l DRMode : beq .norm
|
||||
lda $040c : cmp #$ff : beq .norm
|
||||
REP #$30 : LDA.b $A2 : CMP.w #$00E1 : BCS .norm
|
||||
CMP #$00DF : BEQ .norm
|
||||
SEP #$30
|
||||
lda $0e
|
||||
cmp #$25 : bcc ++ ; don't record straight staircases
|
||||
sta $045e
|
||||
++ pla : bra +
|
||||
.norm pla : sta $a0
|
||||
.norm SEP #$30 : pla : sta $a0
|
||||
+ lda $063d, x
|
||||
rtl
|
||||
}
|
||||
|
||||
SpiralWarp: {
|
||||
lda.l DRMode : beq .abort ; abort if not DR
|
||||
lda $040c : cmp.b #$ff : beq .abort ; abort if not in dungeon
|
||||
REP #$30 : LDA.b $A2 : CMP.w #$00E1 : BCS .abort
|
||||
CMP #$00DF : BEQ .abort
|
||||
SEP #$30
|
||||
lda $045e : cmp #$5e : beq .gtg ; abort if not spiral - intended room is in A!
|
||||
cmp #$5f : beq .gtg
|
||||
cmp #$26 : beq .inroom
|
||||
.abort
|
||||
stz $045e : lda $a2 : and #$0f : rtl ; clear,run hijacked code and get out
|
||||
SEP #$30 : stz $045e : lda $a2 : and.b #$0f : rtl ; clear,run hijacked code and get out
|
||||
.inroom
|
||||
jsr InroomStairsWarp
|
||||
lda $a2 : and #$0f ; this is the code we are hijacking
|
||||
@@ -97,6 +101,11 @@ StairCleanup: {
|
||||
rts
|
||||
}
|
||||
|
||||
LookupSpiralOffset_long:
|
||||
PHB : PHK : PLB
|
||||
JSR LookupSpiralOffset
|
||||
PLB : RTL
|
||||
|
||||
;Sets the offset in A
|
||||
LookupSpiralOffset: {
|
||||
;where link currently is in $a2: quad in a8 & #$03
|
||||
|
||||
161
elder.asm
161
elder.asm
@@ -1,6 +1,6 @@
|
||||
NewElderCode:
|
||||
{
|
||||
LDA $8A : CMP #$1B : BEQ .newCodeContinue
|
||||
LDA $8A : AND.b #$3F : CMP #$1B : BEQ .newCodeContinue
|
||||
;Restore Jump we can keep the RTL so JML
|
||||
JML $05F0CD
|
||||
.newCodeContinue
|
||||
@@ -12,7 +12,7 @@ JSR Elder_Code
|
||||
|
||||
PLB
|
||||
RTL
|
||||
|
||||
}
|
||||
|
||||
Elder_Draw:
|
||||
{
|
||||
@@ -60,7 +60,7 @@ RTL
|
||||
LDA.l GoalCounter
|
||||
CMP.l GoalItemRequirement : !BLT +
|
||||
SEP #$20
|
||||
JSL.l ActivateGoal
|
||||
JSL ActivateTriforceCutscene
|
||||
+
|
||||
.dont_show
|
||||
|
||||
@@ -69,3 +69,158 @@ RTL
|
||||
LDA.b $1A : LSR #5 : AND.b #$01 : STA.w $0DC0, X
|
||||
RTS
|
||||
}
|
||||
|
||||
;--------------------------------------------------------------------------------
|
||||
; Triforce (Pedestal) Cutscene
|
||||
;--------------------------------------------------------------------------------
|
||||
ActivateTriforceCutscene:
|
||||
; despawn other sprites
|
||||
LDY.b #$0F
|
||||
- LDA.w $0E20,Y : CMP.b #$16 : BNE +
|
||||
CPY.b #$00 : BEQ .next
|
||||
; move Murahdahla to slot 0 for draw priority reasons
|
||||
LDA.w $0E20,Y : STA.w $0E20
|
||||
LDA.w $0D00,Y : STA.w $0D00
|
||||
LDA.w $0D10,Y : STA.w $0D10
|
||||
LDA.w $0D20,Y : STA.w $0D20
|
||||
LDA.w $0D30,Y : STA.w $0D30
|
||||
LDA.w $0D40,Y : STA.w $0D40
|
||||
LDA.w $0F50,Y : STA.w $0F50
|
||||
LDA.w $0E40,Y : STA.w $0E40
|
||||
LDA.w $0E60,Y : STA.w $0E60
|
||||
LDA.w $0DD0,Y : STA.w $0DD0
|
||||
LDA.b #$02 : STA.w $0F20
|
||||
+ LDA.b #$00 : STA.w $0DD0,Y
|
||||
.next
|
||||
DEY : BPL -
|
||||
|
||||
LDA.b #$62 ; MasterSword Sprite
|
||||
JSL Sprite_SpawnDynamically
|
||||
|
||||
; set up coords
|
||||
LDA.b $22 : STA.w $0D10,Y
|
||||
LDA.b $23 : STA.w $0D30,Y
|
||||
LDA.b $20 : CLC : ADC.b #$08 : STA.w $0D00,Y
|
||||
LDA.b $21 : ADC.b #$00 : STA.w $0D20,Y
|
||||
|
||||
LDA.b #$01 : STA.w $0D90,Y ; our indicator this is a special cutscene sprite
|
||||
INC : STA.b $2F ; makes Link face downward
|
||||
|
||||
; reset modules
|
||||
LDA.b $1B : BEQ +
|
||||
LDA.b #$07
|
||||
BRA ++
|
||||
+ LDA.b #$09
|
||||
++ STA.b $10
|
||||
STZ.b $11 : STZ.b $B0
|
||||
RTL
|
||||
|
||||
pushpc
|
||||
org $058928
|
||||
MasterSword_InPedestal_DoCutscene:
|
||||
org $0589B1
|
||||
MasterSword_ConditionalHandleReceipt_DoReceipt:
|
||||
|
||||
org $0588DF
|
||||
JSL MasterSword_CheckIfPulled : PLX : NOP #2
|
||||
db $90 ; BCC instead of BEQ
|
||||
org $05890E
|
||||
JSL MasterSword_ConditionalActivateCutscene
|
||||
org $05895F
|
||||
JSL MasterSword_ConditionalGrabPose : NOP
|
||||
org $058994
|
||||
JSL MasterSword_ConditionalGrabPose : NOP
|
||||
org $058D1C
|
||||
JML MasterSword_SpawnPendantProp_ChangePalette
|
||||
MasterSword_SpawnPendantProp_ChangePalette_return:
|
||||
org $0589A3
|
||||
JSL MasterSword_ConditionalHandleReceipt : NOP #2
|
||||
pullpc
|
||||
|
||||
MasterSword_CheckIfPulled:
|
||||
CPX.b #$80 : BEQ +
|
||||
- CLC : RTL ; not on pedestal screen, continue with cutscene
|
||||
+ LDA.l $7EF280,X : AND.b #$40 ; what we wrote over
|
||||
BEQ - : SEC : RTL
|
||||
|
||||
MasterSword_ConditionalActivateCutscene:
|
||||
LDA.w $0D90,X : BNE .specialCutscene
|
||||
JML Sprite_CheckDamageToPlayerSameLayerLong ; what we wrote over
|
||||
.specialCutscene
|
||||
LDA.b #$02 : STA.w $02DA ; Link's 2-hands-up pose
|
||||
STA.b $EE ; draw Link on top
|
||||
LDA.b #$6A : JSL RequestSlottedTile ; draw Triforce piece in VRAM
|
||||
PLA : PLA : PLA : JML MasterSword_InPedestal_DoCutscene ; do cutscene
|
||||
|
||||
MasterSword_ConditionalGrabPose:
|
||||
PHA
|
||||
LDA.w $0D90,X : BNE .specialCutscene
|
||||
PLA
|
||||
STA.w $0377 : LDA.b #$01 ; what we wrote over
|
||||
RTL
|
||||
.specialCutscene
|
||||
PLA
|
||||
LDA.b #$01
|
||||
RTL
|
||||
|
||||
MasterSword_SpawnPendantProp_ChangePalette:
|
||||
STA.w $0D40,Y : PLX ; what we wrote over
|
||||
LDA.w $0D90,X : BNE .specialCutscene
|
||||
BRA .done
|
||||
.specialCutscene
|
||||
LDA.b #$08 : STA.w $0F50,Y ; change palette
|
||||
LDA.b #$02 : STA.w $0F20,Y ; change layer
|
||||
.done
|
||||
JML MasterSword_SpawnPendantProp_ChangePalette_return
|
||||
|
||||
MasterSword_ConditionalHandleReceipt:
|
||||
LDA.w $0D90,X : BNE .specialCutscene
|
||||
LDX.b $8A : LDA.l $7EF280,X ; what we wrote over
|
||||
RTL
|
||||
.specialCutscene
|
||||
PLA : PLA : PEA.w MasterSword_ConditionalHandleReceipt_DoReceipt-1
|
||||
LDA.b 4,S : TAX
|
||||
LDY.b #$6A
|
||||
RTL
|
||||
|
||||
pushpc
|
||||
org $058AB6
|
||||
MasterSword_SpawnLightWell:
|
||||
org $058AD0
|
||||
MasterSword_SpawnLightFountain:
|
||||
org $058B62
|
||||
MasterSword_SpawnLightBeam:
|
||||
|
||||
org $058941
|
||||
JSL MasterSword_ConditionalSpawnLightWell : NOP #2
|
||||
MasterSword_SpawnLightWell_return:
|
||||
org $058952
|
||||
JSL MasterSword_ConditionalSpawnLightFountain : NOP #2
|
||||
MasterSword_SpawnLightFountain_return:
|
||||
org $058B64
|
||||
JSL MasterSword_ConditionalSpawnLightBeam : NOP #2
|
||||
pullpc
|
||||
|
||||
MasterSword_ConditionalSpawnLightWell:
|
||||
INC.w $0D80,X ; part of what we wrote over
|
||||
LDA.w $0D90,X : BNE .specialCutscene
|
||||
PLA : PLA : PLA : PEA.w MasterSword_SpawnLightWell_return-1
|
||||
JML MasterSword_SpawnLightWell ; part of what we wrote over
|
||||
.specialCutscene
|
||||
RTL
|
||||
|
||||
MasterSword_ConditionalSpawnLightFountain:
|
||||
INC.w $0D80,X ; part of what we wrote over
|
||||
LDA.w $0D90,X : BNE .specialCutscene
|
||||
PLA : PLA : PLA : PEA.w MasterSword_SpawnLightFountain_return-1
|
||||
JML MasterSword_SpawnLightFountain ; part of what we wrote over
|
||||
.specialCutscene
|
||||
RTL
|
||||
|
||||
MasterSword_ConditionalSpawnLightBeam:
|
||||
LDA.w $0D90,X : BNE .specialCutscene
|
||||
LDA.b #$62 : JSL Sprite_SpawnDynamically ; what we wrote over
|
||||
RTL
|
||||
.specialCutscene
|
||||
LDY.b #$FF
|
||||
RTL
|
||||
|
||||
@@ -268,7 +268,7 @@ DrawPlayerFileShared:
|
||||
%fs_drawBottle(EquipmentSRAM+$1F,9,23)
|
||||
|
||||
; Sword
|
||||
LDA.l SpecialWeapons : AND.w #$00FF : CMP #$0001 : BEQ .bombSword
|
||||
LDA.l SpecialWeapons : AND.w #$007F : CMP #$0001 : BEQ .bombSword
|
||||
LDA.l EquipmentSRAM+$19 : AND.w #$00FF : BNE +
|
||||
%fs_drawItemGray(3,26,FileSelectItems_fighters_sword)
|
||||
JMP ++
|
||||
@@ -602,7 +602,7 @@ FileSelectDrawHudBar:
|
||||
LDA $7F5006 : AND.w #$00FF : !ADD.w #$210+!FS_COLOR_BW : %fs_draw8x8(1,11)
|
||||
LDA $7F5007 : AND.w #$00FF : !ADD.w #$210+!FS_COLOR_BW : %fs_draw8x8(1,12)
|
||||
|
||||
LDA SpecialWeapons : AND.w #$00FF : CMP #$0001 : BEQ .colorBombs
|
||||
LDA SpecialWeapons : AND.w #$007F : CMP #$0001 : BEQ .colorBombs
|
||||
LDA #$028B|!FS_COLOR_BLUE : %fs_draw16x8(0,14)
|
||||
LDA EquipmentSRAM+$03 : AND.w #$00FF
|
||||
JSL.l HexToDec
|
||||
|
||||
@@ -7,12 +7,13 @@ SpawnHauntedGroveItem:
|
||||
|
||||
LDA.l HauntedGroveItem_Player : STA !MULTIWORLD_SPRITEITEM_PLAYER_ID
|
||||
%GetPossiblyEncryptedItem(HauntedGroveItem, HeartPieceOutdoorValues)
|
||||
JSL.l PrepDynamicTile
|
||||
|
||||
|
||||
LDA.b #$EB
|
||||
STA $7FFE00
|
||||
JSL Sprite_SpawnDynamically
|
||||
|
||||
LDA.b #$01 : STA.w !SPRITE_REDRAW, Y
|
||||
|
||||
LDX.b #$00
|
||||
LDA $2F : CMP.b #$04 : BEQ + : INX : +
|
||||
|
||||
|
||||
@@ -22,19 +22,19 @@ def process_values(sprite, values)
|
||||
if ret[10] == 4 # powder
|
||||
ret[10] = 0
|
||||
end
|
||||
if ret[11] > 0 && ![0xA1, 0xA3, 0xCD].include?(sprite) # fire rod
|
||||
if ret[11] > 0 && ![0x23, 0xA1, 0xA3, 0xCD].include?(sprite) # fire rod
|
||||
ret[11] = 0
|
||||
end
|
||||
if ret[12] != 3 && sprite != 0xCC # ice rod
|
||||
ret[12] = 0
|
||||
end
|
||||
if ret[13] > 0 && ![0xA3, 0xA1].include?(sprite) # bombos
|
||||
if ret[13] > 0 && ![0x23, 0xA1, 0xA3, 0xD1].include?(sprite) # bombos
|
||||
ret[13] = 0
|
||||
end
|
||||
if ret[14] != 1 # ether
|
||||
if ret[14] != 1 && ![0xD1].include?(sprite) # ether
|
||||
ret[14] = 0
|
||||
end
|
||||
if [1, 2].include?(ret[15]) # quake
|
||||
if [1, 2].include?(ret[15]) && ![0xD1].include?(sprite) # quake
|
||||
ret[15] = 0
|
||||
end
|
||||
if sprite == 0x53 and ret[2] == 3
|
||||
|
||||
72
goalitem.asm
72
goalitem.asm
@@ -110,28 +110,64 @@ BRA .all_dungeons
|
||||
|
||||
|
||||
;--------------------------------------------------------------------------------
|
||||
GetRequiredCrystalsForTower:
|
||||
BEQ + : JSL.l BreakTowerSeal_ExecuteSparkles : + ; thing we wrote over
|
||||
LDA.l NumberOfCrystalsRequiredForTower : CMP.b #$00 : BNE + : JML.l Ancilla_BreakTowerSeal_stop_spawning_sparkles : +
|
||||
LDA.l NumberOfCrystalsRequiredForTower : CMP.b #$01 : BNE + : JML.l Ancilla_BreakTowerSeal_draw_single_crystal : +
|
||||
LDA.l NumberOfCrystalsRequiredForTower : DEC #2 : TAX
|
||||
JML.l GetRequiredCrystalsForTower_continue
|
||||
GTCutscene_CrystalMasks:
|
||||
db %00000000 ; 0 crystals
|
||||
db %10000000 ; BIT INDEX DIAGRAM
|
||||
db %00010010 ; 0
|
||||
db %00010101 ; 5 1
|
||||
db %10010101 ; 7
|
||||
db %10110110 ; 4 2
|
||||
db %00111111 ; 3
|
||||
db %10111111 ; 7 crystals
|
||||
;--------------------------------------------------------------------------------
|
||||
GetRequiredCrystalsInX:
|
||||
LDA.l NumberOfCrystalsRequiredForTower : CMP.b #$00 : BNE +
|
||||
TAX
|
||||
RTL
|
||||
+
|
||||
GTCutscene_ConditionalAnimateCrystals:
|
||||
PHX : PHX
|
||||
LDA.l NumberOfCrystalsRequiredForTower : TAX : LDA.l GTCutscene_CrystalMasks,X
|
||||
PLX
|
||||
- LSR : DEX : BPL -
|
||||
PLX : BCC .skip_crystal
|
||||
|
||||
TXA
|
||||
.draw_crystal
|
||||
LDA.b $11 : BEQ + : JML.l GTCutscene_AnimateCrystals_NoRotate ; what we wrote over
|
||||
+ JML.l GTCutscene_AnimateCrystals_NextCrystal+4
|
||||
|
||||
- CMP.l NumberOfCrystalsRequiredForTower : BCC +
|
||||
SBC.l NumberOfCrystalsRequiredForTower ; carry guaranteed set
|
||||
BRA -
|
||||
.skip_crystal
|
||||
JML.l GTCutscene_DrawSingleCrystal-3
|
||||
;--------------------------------------------------------------------------------
|
||||
GTCutscene_ConditionalDrawSingleCrystal:
|
||||
LDA.w $06FA : BEQ .draw_crystal : STZ.w $06FA
|
||||
LDA.l NumberOfCrystalsRequiredForTower : TAX
|
||||
LDA.l GTCutscene_CrystalMasks,X : AND.b #$80 : BEQ .skip_crystal
|
||||
.draw_crystal
|
||||
LDX.w $0FA0 : PHY ; what we wrote over
|
||||
JML.l GTCutscene_DrawSingleCrystal+4
|
||||
.skip_crystal
|
||||
JML.l GTCutscene_DrawSingleCrystal_SkipCrystal
|
||||
;--------------------------------------------------------------------------------
|
||||
GTCutscene_AnimateCrystals_Prep:
|
||||
BEQ + : JSL.l GTCutscene_SparkleALot : + ; thing we wrote over
|
||||
LDA.l NumberOfCrystalsRequiredForTower : BNE +
|
||||
JML.l GTCutscene_DrawSingleCrystal_SkipSparkle
|
||||
+ CMP.b #$01 : BNE +
|
||||
JML.l GTCutscene_DrawSingleCrystal
|
||||
+ INC.w $06FA ; some free ram OWR also uses
|
||||
JML.l GTCutscene_AnimateCrystals_NextCrystal-2
|
||||
;--------------------------------------------------------------------------------
|
||||
GTCutscene_ActivateSparkle_SelectCrystal:
|
||||
LDA.l NumberOfCrystalsRequiredForTower : BNE +
|
||||
TAX : RTL
|
||||
+ TXA
|
||||
|
||||
+ INC : CMP.l NumberOfCrystalsRequiredForTower : BNE +
|
||||
LDA.b #$08
|
||||
+ : DEC : TAX
|
||||
- CMP.l NumberOfCrystalsRequiredForTower : BCC +
|
||||
SBC.l NumberOfCrystalsRequiredForTower : BRA - ; carry guaranteed set
|
||||
|
||||
+ PHY : TAY
|
||||
LDA.l NumberOfCrystalsRequiredForTower : TAX : LDA.l GTCutscene_CrystalMasks,X
|
||||
LDX.b #$FF
|
||||
- LSR : INX : BCC +
|
||||
DEY
|
||||
+ BPL -
|
||||
PLY
|
||||
RTL
|
||||
;--------------------------------------------------------------------------------
|
||||
CheckEnoughCrystalsForGanon:
|
||||
|
||||
10
hardmode.asm
10
hardmode.asm
@@ -80,14 +80,14 @@ GetItemDamageValue:
|
||||
CPX.b #$3C : BEQ .hookshot
|
||||
CPX.b #$3D : BEQ .hookshot
|
||||
|
||||
LDA.l SpecialWeapons : CMP #$02 : BNE .normal
|
||||
TXA : AND #$78 : CMP #$28 : BNE .normal
|
||||
LDA $0DB8F1, X : BEQ .noDamage
|
||||
LDA #$01
|
||||
LDA.l SpecialWeapons : AND.b #$7F : CMP.b #$02 : BNE .normal
|
||||
TXA : AND.b #$78 : CMP.b #$28 : BNE .normal
|
||||
LDA.l $0DB8F1, X : BEQ .noDamage
|
||||
LDA.b #$01
|
||||
RTL
|
||||
|
||||
.normal
|
||||
LDA $0DB8F1, X ; what we wrote over
|
||||
LDA.l $0DB8F1, X ; what we wrote over
|
||||
RTL
|
||||
.boomerang
|
||||
LDA.l StunItemAction : AND #$01 : BNE .normal
|
||||
|
||||
206
heartpieces.asm
206
heartpieces.asm
@@ -49,28 +49,27 @@ HeartContainerGet:
|
||||
|
||||
BRA HeartPieceGet_skipLoad
|
||||
;--------------------------------------------------------------------------------
|
||||
!REDRAW = "$7F5000"
|
||||
DrawHeartPieceGFX:
|
||||
PHP
|
||||
JSL.l Sprite_IsOnscreen : BCC .offscreen
|
||||
|
||||
PHA : PHY
|
||||
LDA !REDRAW : BEQ .skipInit ; skip init if already ready
|
||||
JSL.l HeartPieceSpritePrep
|
||||
JMP .done ; don't draw on the init frame
|
||||
LDA.w !SPRITE_REDRAW, X : BEQ .skipInit ; skip init if already ready
|
||||
JSL.l HeartPieceSpritePrep
|
||||
LDA.w !SPRITE_REDRAW, X : CMP.b #$02 : BEQ .skipInit
|
||||
BRA .done ; don't draw on the init frame
|
||||
|
||||
.skipInit
|
||||
LDA $0E80, X ; Retrieve stored item type
|
||||
|
||||
|
||||
.skipLoad
|
||||
|
||||
JSL.l DrawDynamicTile
|
||||
|
||||
CMP #$03 : BNE +
|
||||
PHA : LDA $0E60, X : ORA.b #$20 : STA $0E60, X : PLA
|
||||
+
|
||||
|
||||
JSL.l Sprite_DrawShadowLong
|
||||
JSL DrawSlottedTile : BCS .done
|
||||
; draw shadow
|
||||
CMP #$03 : BNE +
|
||||
INC.b $00 : INC.b $00 : INC.b $00 : INC.b $00 ; move narrow sprite shadow over 4 pixels
|
||||
PHA : LDA $0E60, X : ORA.b #$20 : STA $0E60, X : PLA
|
||||
+
|
||||
JSL.l Sprite_DrawShadowLong
|
||||
|
||||
.done
|
||||
PLY : PLA
|
||||
@@ -78,20 +77,17 @@ DrawHeartPieceGFX:
|
||||
PLP
|
||||
RTL
|
||||
;--------------------------------------------------------------------------------
|
||||
!REDRAW = "$7F5000"
|
||||
DrawHeartContainerGFX:
|
||||
PHP
|
||||
JSL.l Sprite_IsOnscreen : BCC DrawHeartPieceGFX_offscreen
|
||||
|
||||
PHA : PHY
|
||||
LDA !REDRAW : BEQ .skipInit ; skip init if already ready
|
||||
JSL.l HeartContainerSpritePrep
|
||||
BRA DrawHeartPieceGFX_done ; don't draw on the init frame
|
||||
LDA.w !SPRITE_REDRAW, X : BEQ .skipInit ; skip init if already ready
|
||||
JSL.l HeartContainerSpritePrep
|
||||
BRA DrawHeartPieceGFX_done ; don't draw on the init frame
|
||||
|
||||
.skipInit
|
||||
LDA $0E80, X ; Retrieve stored item type
|
||||
|
||||
BRA DrawHeartPieceGFX_skipLoad
|
||||
BRA DrawHeartPieceGFX_skipInit
|
||||
;--------------------------------------------------------------------------------
|
||||
HeartContainerSound:
|
||||
LDA !MULTIWORLD_ITEM_PLAYER_ID : BNE +
|
||||
@@ -129,59 +125,60 @@ RTL
|
||||
RTL
|
||||
;--------------------------------------------------------------------------------
|
||||
HeartUpgradeSpawnDecision: ; this should return #$00 to make the hp spawn
|
||||
LDA !FORCE_HEART_SPAWN : BEQ .normal_behavior
|
||||
LDA.l !FORCE_HEART_SPAWN : BEQ .bonk_prize_check
|
||||
|
||||
DEC : STA !FORCE_HEART_SPAWN
|
||||
LDA #$00
|
||||
LDA.b #$00 : STA.l !FORCE_HEART_SPAWN
|
||||
RTL
|
||||
|
||||
.bonk_prize_check
|
||||
PHX
|
||||
LDA.b 5,S : TAX : LDA.w $0ED0, X : BEQ .normal_behavior-1
|
||||
PLX
|
||||
LDA.b #$00
|
||||
RTL
|
||||
PLX
|
||||
.normal_behavior
|
||||
LDA OverworldEventDataWRAM, X
|
||||
LDA.l OverworldEventDataWRAM, X
|
||||
RTL
|
||||
;--------------------------------------------------------------------------------
|
||||
SaveHeartCollectedStatus:
|
||||
LDA !SKIP_HEART_SAVE : BEQ .save_flag
|
||||
|
||||
DEC : STA !SKIP_HEART_SAVE
|
||||
LDA #$00 : STA !SKIP_HEART_SAVE
|
||||
RTL
|
||||
|
||||
.save_flag
|
||||
LDA 4,S : TAY : LDA $0ED0,Y : BEQ .normal_behavior
|
||||
PHA : LDA OverworldEventDataWRAM, X : ORA 1,S : STA OverworldEventDataWRAM, X
|
||||
PLA : RTL
|
||||
PHA
|
||||
LDA OverworldEventDataWRAM, X : ORA 1,S : STA OverworldEventDataWRAM, X
|
||||
PLA
|
||||
RTL
|
||||
|
||||
.normal_behavior
|
||||
LDA OverworldEventDataWRAM, X : ORA.b #$40 : STA OverworldEventDataWRAM, X
|
||||
RTL
|
||||
;--------------------------------------------------------------------------------
|
||||
!REDRAW = "$7F5000"
|
||||
HeartPieceSpritePrep:
|
||||
PHA
|
||||
|
||||
LDA ServerRequestMode : BEQ + : : +
|
||||
|
||||
LDA #$01 : STA !REDRAW
|
||||
LDA $5D : CMP #$14 : BEQ .skip ; skip if we're mid-mirror
|
||||
|
||||
LDA #$00 : STA !REDRAW
|
||||
LDA.b #$01 : STA.w !SPRITE_REDRAW, X
|
||||
JSL.l HeartPieceGetPlayer : STA !MULTIWORLD_SPRITEITEM_PLAYER_ID
|
||||
JSL.l LoadHeartPieceRoomValue ; load item type
|
||||
STA $0E80, X ; Store item type
|
||||
JSL.l PrepDynamicTile
|
||||
JSL.l RequestSlottedTile
|
||||
|
||||
.skip
|
||||
PLA
|
||||
RTL
|
||||
;--------------------------------------------------------------------------------
|
||||
!REDRAW = "$7F5000"
|
||||
HeartContainerSpritePrep:
|
||||
PHA
|
||||
|
||||
LDA #$00 : STA !REDRAW
|
||||
JSL.l HeartPieceGetPlayer : STA !MULTIWORLD_SPRITEITEM_PLAYER_ID
|
||||
JSL.l LoadHeartContainerRoomValue ; load item type
|
||||
STA $0E80, X ; Store item type
|
||||
JSL.l PrepDynamicTile
|
||||
JSL.l RequestSlottedTile
|
||||
|
||||
PLA
|
||||
RTL
|
||||
@@ -196,7 +193,8 @@ LoadHeartPieceRoomValue:
|
||||
.done
|
||||
RTL
|
||||
;--------------------------------------------------------------------------------
|
||||
!REDRAW = "$7F5000"
|
||||
!DynamicDropGFXSlotCount_UW = (FreeUWGraphics_end-FreeUWGraphics)>>1
|
||||
!DynamicDropGFXSlotCount_OW = (FreeOWGraphics_end-FreeOWGraphics)>>1
|
||||
HPItemReset:
|
||||
PHA
|
||||
LDA !MULTIWORLD_ITEM_PLAYER_ID : BNE .skip
|
||||
@@ -206,7 +204,14 @@ HPItemReset:
|
||||
.skip
|
||||
PLA
|
||||
.done
|
||||
PHA : LDA #$01 : STA !REDRAW : PLA
|
||||
PHA : PHY
|
||||
LDY.b #$0F
|
||||
- LDA.w $0DD0,Y : BEQ +
|
||||
LDA.w !SPRITE_REDRAW, Y : CMP.b #$02 : BNE +
|
||||
; attempt redraw of any sprite using the overflow slot
|
||||
LDA.b #$01 : STA.w !SPRITE_REDRAW, Y
|
||||
+ DEY : BPL -
|
||||
PLY : PLA
|
||||
RTL
|
||||
;--------------------------------------------------------------------------------
|
||||
MaybeMarkDigSpotCollected:
|
||||
@@ -221,6 +226,7 @@ MaybeMarkDigSpotCollected:
|
||||
RTL
|
||||
;--------------------------------------------------------------------------------
|
||||
HeartPieceSpawnDelayFix:
|
||||
JSL Sprite_DrawRippleIfInWater
|
||||
; Fix the delay when spawning a HeartPiece sprite
|
||||
JSL.l Sprite_CheckIfPlayerPreoccupied : BCS + ; what we moved from $05F037
|
||||
JSL.l Sprite_CheckDamageToPlayerSameLayerLong : RTL ; what we wrote over
|
||||
@@ -266,6 +272,9 @@ LoadIndoorValue:
|
||||
++
|
||||
%GetPossiblyEncryptedItem(HeartPiece_Graveyard_Warp, HeartPieceIndoorValues)
|
||||
JMP .done
|
||||
+ CMP.w #288 : BNE +
|
||||
LDA.l UWBonkPrizeData+3
|
||||
JMP .done
|
||||
+ CMP.w #294 : BNE +
|
||||
%GetPossiblyEncryptedItem(HeartPiece_Mire_Warp, HeartPieceIndoorValues)
|
||||
JMP .done
|
||||
@@ -360,36 +369,36 @@ LoadOutdoorValue:
|
||||
LDA.l OWBonkPrizeTable[$0F].loot
|
||||
JMP .done
|
||||
+ CMP.w #$1B : BNE +
|
||||
LDA.l OWBonkPrizeTable[$11].loot
|
||||
LDA.l OWBonkPrizeTable[$10].loot
|
||||
JMP .done
|
||||
+ CMP.w #$1D : BNE +
|
||||
LDA.l OWBonkPrizeTable[$12].loot
|
||||
LDA.l OWBonkPrizeTable[$11].loot
|
||||
JMP .done
|
||||
+ CMP.w #$1E : BNE +
|
||||
LDA.l OWBonkPrizeTable[$13].loot
|
||||
LDA.l OWBonkPrizeTable[$12].loot
|
||||
JMP .done
|
||||
+ CMP.w #$28 : BNE +
|
||||
%GetPossiblyEncryptedItem(HeartPiece_Maze, HeartPieceOutdoorValues)
|
||||
JMP .done
|
||||
+ CMP.w #$2A : BNE +
|
||||
LDA.w $0ED0,X : AND.w #$00FF : CMP.w #$0010 : BNE ++
|
||||
LDA.l OWBonkPrizeTable[$14].loot
|
||||
LDA.l OWBonkPrizeTable[$13].loot
|
||||
JMP .done
|
||||
++ CMP.w #$0008 : BNE ++
|
||||
LDA.l OWBonkPrizeTable[$15].loot
|
||||
LDA.l OWBonkPrizeTable[$14].loot
|
||||
JMP .done
|
||||
++
|
||||
%GetPossiblyEncryptedItem(HauntedGroveItem, HeartPieceOutdoorValues)
|
||||
JMP .done
|
||||
+ CMP.w #$2B : BNE +
|
||||
LDA.l OWBonkPrizeTable[$16].loot
|
||||
LDA.l OWBonkPrizeTable[$15].loot
|
||||
JMP .done
|
||||
+ CMP.w #$2E : BNE +
|
||||
LDA.w $0ED0,X : AND.w #$00FF : CMP.w #$0010 : BNE ++
|
||||
LDA.l OWBonkPrizeTable[$17].loot
|
||||
LDA.l OWBonkPrizeTable[$16].loot
|
||||
JMP .done
|
||||
++
|
||||
LDA.l OWBonkPrizeTable[$18].loot
|
||||
LDA.l OWBonkPrizeTable[$17].loot
|
||||
JMP .done
|
||||
+ CMP.w #$30 : BNE +
|
||||
LDA $22 : CMP.w #512 : !BGE ++
|
||||
@@ -400,10 +409,10 @@ LoadOutdoorValue:
|
||||
JMP .done
|
||||
+ CMP.w #$32 : BNE +
|
||||
LDA.w $0ED0,X : AND.w #$00FF : CMP.w #$0010 : BNE ++
|
||||
LDA.l OWBonkPrizeTable[$19].loot
|
||||
LDA.l OWBonkPrizeTable[$18].loot
|
||||
JMP .done
|
||||
++
|
||||
LDA.l OWBonkPrizeTable[$1A].loot
|
||||
LDA.l OWBonkPrizeTable[$19].loot
|
||||
JMP .done
|
||||
+ CMP.w #$35 : BNE +
|
||||
%GetPossiblyEncryptedItem(HeartPiece_Lake, HeartPieceOutdoorValues)
|
||||
@@ -413,7 +422,7 @@ LoadOutdoorValue:
|
||||
JMP .done
|
||||
+ CMP.w #$42 : BNE +
|
||||
LDA.w $0ED0,X : AND.w #$00FF : CMP.w #$0010 : BNE ++
|
||||
LDA.l OWBonkPrizeTable[$1B].loot
|
||||
LDA.l OWBonkPrizeTable[$1A].loot
|
||||
JMP .done
|
||||
++
|
||||
%GetPossiblyEncryptedItem(HeartPiece_Cliffside, HeartPieceOutdoorValues)
|
||||
@@ -423,56 +432,56 @@ LoadOutdoorValue:
|
||||
JMP .done
|
||||
+ CMP.w #$51 : BNE +
|
||||
LDA.w $0ED0,X : AND.w #$00FF : CMP.w #$0010 : BNE ++
|
||||
LDA.l OWBonkPrizeTable[$1C].loot
|
||||
LDA.l OWBonkPrizeTable[$1B].loot
|
||||
JMP .done
|
||||
++
|
||||
LDA.l OWBonkPrizeTable[$1D].loot
|
||||
LDA.l OWBonkPrizeTable[$1C].loot
|
||||
JMP .done
|
||||
+ CMP.w #$54 : BNE +
|
||||
LDA.w $0ED0,X : AND.w #$00FF : CMP.w #$0010 : BNE ++
|
||||
LDA.l OWBonkPrizeTable[$1E].loot
|
||||
LDA.l OWBonkPrizeTable[$1D].loot
|
||||
JMP .done
|
||||
++ CMP.w #$0008 : BNE ++
|
||||
LDA.l OWBonkPrizeTable[$1F].loot
|
||||
LDA.l OWBonkPrizeTable[$1E].loot
|
||||
JMP .done
|
||||
++
|
||||
LDA.l OWBonkPrizeTable[$20].loot
|
||||
LDA.l OWBonkPrizeTable[$1F].loot
|
||||
JMP .done
|
||||
+ CMP.w #$55 : BNE +
|
||||
LDA.w $0ED0,X : AND.w #$00FF : CMP.w #$0010 : BNE ++
|
||||
LDA.l OWBonkPrizeTable[$21].loot
|
||||
LDA.l OWBonkPrizeTable[$20].loot
|
||||
JMP .done
|
||||
++
|
||||
LDA.l OWBonkPrizeTable[$22].loot
|
||||
LDA.l OWBonkPrizeTable[$21].loot
|
||||
JMP .done
|
||||
+ CMP.w #$56 : BNE +
|
||||
LDA.l OWBonkPrizeTable[$23].loot
|
||||
LDA.l OWBonkPrizeTable[$22].loot
|
||||
JMP .done
|
||||
+ CMP.w #$5B : BNE +
|
||||
LDA.w $0ED0,X : AND.w #$00FF : CMP.w #$0010 : BNE ++
|
||||
LDA.l OWBonkPrizeTable[$24].loot
|
||||
LDA.l OWBonkPrizeTable[$23].loot
|
||||
JMP .done
|
||||
++
|
||||
%GetPossiblyEncryptedItem(HeartPiece_Pyramid, HeartPieceOutdoorValues)
|
||||
JMP .done
|
||||
+ CMP.w #$5E : BNE +
|
||||
LDA.l OWBonkPrizeTable[$25].loot
|
||||
LDA.l OWBonkPrizeTable[$24].loot
|
||||
JMP .done
|
||||
+ CMP.w #$68 : BNE +
|
||||
%GetPossiblyEncryptedItem(HeartPiece_Digging, HeartPieceOutdoorValues)
|
||||
JMP .done
|
||||
+ CMP.w #$6E : BNE +
|
||||
LDA.w $0ED0,X : AND.w #$00FF : CMP.w #$0010 : BNE ++
|
||||
LDA.l OWBonkPrizeTable[$26].loot
|
||||
LDA.l OWBonkPrizeTable[$25].loot
|
||||
JMP .done
|
||||
++ CMP.w #$0008 : BNE ++
|
||||
LDA.l OWBonkPrizeTable[$27].loot
|
||||
LDA.l OWBonkPrizeTable[$26].loot
|
||||
JMP .done
|
||||
++
|
||||
LDA.l OWBonkPrizeTable[$28].loot
|
||||
LDA.l OWBonkPrizeTable[$27].loot
|
||||
JMP .done
|
||||
+ CMP.w #$74 : BNE +
|
||||
LDA.l OWBonkPrizeTable[$29].loot
|
||||
LDA.l OWBonkPrizeTable[$28].loot
|
||||
JMP .done
|
||||
+ CMP.w #$81 : BNE +
|
||||
%GetPossiblyEncryptedItem(HeartPiece_Zora, HeartPieceOutdoorValues)
|
||||
@@ -639,6 +648,9 @@ HeartPieceGetPlayer:
|
||||
++
|
||||
LDA HeartPiece_Graveyard_Warp_Player
|
||||
BRL .done
|
||||
+ CMP.w #288 : BNE +
|
||||
LDA.l OWBonkPrizeTable[$2A].mw_player
|
||||
BRL .done
|
||||
+ CMP.w #294 : BNE +
|
||||
LDA HeartPiece_Mire_Warp_Player
|
||||
BRL .done
|
||||
@@ -663,21 +675,21 @@ HeartPieceGetPlayer:
|
||||
LDA EtherItem_Player
|
||||
BRL .done
|
||||
+ CMP.w #$05 : BNE +
|
||||
LDA.w $0ED0,X : CMP.w #$0010 : BNE ++
|
||||
LDA.w $0ED0,X : AND.w #$00FF : CMP.w #$0010 : BNE ++
|
||||
LDA.l OWBonkPrizeTable[$01].mw_player
|
||||
BRL .done
|
||||
++
|
||||
LDA HeartPiece_Mountain_Warp_Player
|
||||
BRL .done
|
||||
+ CMP.w #$0A : BNE +
|
||||
LDA.w $0ED0,X : CMP.w #$0010 : BNE ++
|
||||
LDA.w $0ED0,X : AND.w #$00FF : CMP.w #$0010 : BNE ++
|
||||
LDA.l OWBonkPrizeTable[$02].mw_player
|
||||
BRL .done
|
||||
++
|
||||
LDA.l OWBonkPrizeTable[$03].mw_player
|
||||
BRL .done
|
||||
+ CMP.w #$10 : BNE +
|
||||
LDA.w $0ED0,X : CMP.w #$0010 : BNE ++
|
||||
LDA.w $0ED0,X : AND.w #$00FF : CMP.w #$0010 : BNE ++
|
||||
LDA.l OWBonkPrizeTable[$04].mw_player
|
||||
BRL .done
|
||||
++
|
||||
@@ -690,28 +702,28 @@ HeartPieceGetPlayer:
|
||||
LDA.l OWBonkPrizeTable[$07].mw_player
|
||||
BRL .done
|
||||
+ CMP.w #$13 : BNE +
|
||||
LDA.w $0ED0,X : CMP.w #$0010 : BNE ++
|
||||
LDA.w $0ED0,X : AND.w #$00FF : CMP.w #$0010 : BNE ++
|
||||
LDA.l OWBonkPrizeTable[$08].mw_player
|
||||
BRL .done
|
||||
++
|
||||
LDA.l OWBonkPrizeTable[$09].mw_player
|
||||
BRL .done
|
||||
+ CMP.w #$15 : BNE +
|
||||
LDA.w $0ED0,X : CMP.w #$0010 : BNE ++
|
||||
LDA.w $0ED0,X : AND.w #$00FF : CMP.w #$0010 : BNE ++
|
||||
LDA.l OWBonkPrizeTable[$0A].mw_player
|
||||
BRL .done
|
||||
++
|
||||
LDA.l OWBonkPrizeTable[$0B].mw_player
|
||||
BRL .done
|
||||
+ CMP.w #$18 : BNE +
|
||||
LDA.w $0ED0,X : CMP.w #$0010 : BNE ++
|
||||
LDA.w $0ED0,X : AND.w #$00FF : CMP.w #$0010 : BNE ++
|
||||
LDA.l OWBonkPrizeTable[$0C].mw_player
|
||||
BRL .done
|
||||
++
|
||||
LDA.l OWBonkPrizeTable[$0D].mw_player
|
||||
BRL .done
|
||||
+ CMP.w #$1A : BNE +
|
||||
LDA.w $0ED0,X : CMP.w #$0010 : BNE ++
|
||||
LDA.w $0ED0,X : AND.w #$00FF : CMP.w #$0010 : BNE ++
|
||||
LDA.l OWBonkPrizeTable[$0E].mw_player
|
||||
BRL .done
|
||||
++
|
||||
@@ -730,7 +742,7 @@ HeartPieceGetPlayer:
|
||||
LDA HeartPiece_Maze_Player
|
||||
BRL .done
|
||||
+ CMP.w #$2A : BNE +
|
||||
LDA.w $0ED0,X : CMP.w #$0010 : BNE ++
|
||||
LDA.w $0ED0,X : AND.w #$00FF : CMP.w #$0010 : BNE ++
|
||||
LDA.l OWBonkPrizeTable[$14].mw_player
|
||||
BRL .done
|
||||
++ CMP.w #$0008 : BNE ++
|
||||
@@ -743,7 +755,7 @@ HeartPieceGetPlayer:
|
||||
LDA.l OWBonkPrizeTable[$16].mw_player
|
||||
BRL .done
|
||||
+ CMP.w #$2E : BNE +
|
||||
LDA.w $0ED0,X : CMP.w #$0010 : BNE ++
|
||||
LDA.w $0ED0,X : AND.w #$00FF : CMP.w #$0010 : BNE ++
|
||||
LDA.l OWBonkPrizeTable[$17].mw_player
|
||||
BRL .done
|
||||
++
|
||||
@@ -757,7 +769,7 @@ HeartPieceGetPlayer:
|
||||
LDA BombosItem_Player
|
||||
BRL .done
|
||||
+ CMP.w #$32 : BNE +
|
||||
LDA.w $0ED0,X : CMP.w #$0010 : BNE ++
|
||||
LDA.w $0ED0,X : AND.w #$00FF : CMP.w #$0010 : BNE ++
|
||||
LDA.l OWBonkPrizeTable[$19].mw_player
|
||||
BRL .done
|
||||
++
|
||||
@@ -770,7 +782,7 @@ HeartPieceGetPlayer:
|
||||
LDA HeartPiece_Swamp_Player
|
||||
BRL .done
|
||||
+ CMP.w #$42 : BNE +
|
||||
LDA.w $0ED0,X : CMP.w #$0010 : BNE ++
|
||||
LDA.w $0ED0,X : AND.w #$00FF : CMP.w #$0010 : BNE ++
|
||||
LDA.l OWBonkPrizeTable[$1B].mw_player
|
||||
BRL .done
|
||||
++
|
||||
@@ -780,14 +792,14 @@ HeartPieceGetPlayer:
|
||||
LDA HeartPiece_Cliffside_Player
|
||||
BRL .done
|
||||
+ CMP.w #$51 : BNE +
|
||||
LDA.w $0ED0,X : CMP.w #$0010 : BNE ++
|
||||
LDA.w $0ED0,X : AND.w #$00FF : CMP.w #$0010 : BNE ++
|
||||
LDA.l OWBonkPrizeTable[$1C].mw_player
|
||||
BRL .done
|
||||
++
|
||||
LDA.l OWBonkPrizeTable[$1D].mw_player
|
||||
BRL .done
|
||||
+ CMP.w #$54 : BNE +
|
||||
LDA.w $0ED0,X : CMP.w #$0010 : BNE ++
|
||||
LDA.w $0ED0,X : AND.w #$00FF : CMP.w #$0010 : BNE ++
|
||||
LDA.l OWBonkPrizeTable[$1E].mw_player
|
||||
BRL .done
|
||||
++ CMP.w #$0008 : BNE ++
|
||||
@@ -797,7 +809,7 @@ HeartPieceGetPlayer:
|
||||
LDA.l OWBonkPrizeTable[$20].mw_player
|
||||
BRL .done
|
||||
+ CMP.w #$55 : BNE +
|
||||
LDA.w $0ED0,X : CMP.w #$0010 : BNE ++
|
||||
LDA.w $0ED0,X : AND.w #$00FF : CMP.w #$0010 : BNE ++
|
||||
LDA.l OWBonkPrizeTable[$21].mw_player
|
||||
BRL .done
|
||||
++
|
||||
@@ -807,7 +819,7 @@ HeartPieceGetPlayer:
|
||||
LDA.l OWBonkPrizeTable[$23].mw_player
|
||||
BRL .done
|
||||
+ CMP.w #$5B : BNE +
|
||||
LDA.w $0ED0,X : CMP.w #$0010 : BNE ++
|
||||
LDA.w $0ED0,X : AND.w #$00FF : CMP.w #$0010 : BNE ++
|
||||
LDA.l OWBonkPrizeTable[$24].mw_player
|
||||
BRL .done
|
||||
++
|
||||
@@ -820,7 +832,7 @@ HeartPieceGetPlayer:
|
||||
LDA HeartPiece_Digging_Player
|
||||
BRL .done
|
||||
+ CMP.w #$6E : BNE +
|
||||
LDA.w $0ED0,X : CMP.w #$0010 : BNE ++
|
||||
LDA.w $0ED0,X : AND.w #$00FF : CMP.w #$0010 : BNE ++
|
||||
LDA.l OWBonkPrizeTable[$26].mw_player
|
||||
BRL .done
|
||||
++ CMP.w #$0008 : BNE ++
|
||||
@@ -844,3 +856,37 @@ HeartPieceGetPlayer:
|
||||
PLY
|
||||
RTL
|
||||
}
|
||||
;--------------------------------------------------------------------------------
|
||||
HeartPieceSetRedraw:
|
||||
PHY
|
||||
LDY.b #$0F
|
||||
.next
|
||||
LDA.w $0DD0,Y : BEQ ++
|
||||
LDA.w $0E20,Y : CMP.b #$EB : BEQ + ; heart piece
|
||||
CMP.b #$E4 : BEQ + ; enemy key drop
|
||||
CMP.b #$3B : BEQ + ; bonk item (book/key)
|
||||
CMP.b #$E5 : BEQ + ; enemy big key drop
|
||||
CMP.b #$E7 : BEQ + ; mushroom item
|
||||
CMP.b #$E9 : BEQ + ; powder item
|
||||
BRA ++
|
||||
+ LDA.b #$01 : STA.w !SPRITE_REDRAW,Y
|
||||
++ DEY : BPL .next
|
||||
PLY
|
||||
RTL
|
||||
HeartPieceGetRedraw:
|
||||
PHY
|
||||
LDY.b #$0F
|
||||
.next
|
||||
LDA.w $0DD0,Y : BEQ ++
|
||||
LDA.w $0E20,Y : CMP.b #$EB : BEQ + ; heart piece
|
||||
CMP.b #$E4 : BEQ + ; enemy key drop
|
||||
CMP.b #$3B : BEQ + ; bonk item (book/key)
|
||||
CMP.b #$E5 : BEQ + ; enemy big key drop
|
||||
CMP.b #$E7 : BEQ + ; mushroom item
|
||||
CMP.b #$E9 : BEQ + ; powder item
|
||||
BRA ++
|
||||
+ LDA.w !SPRITE_REDRAW,Y : BEQ ++
|
||||
PLY : SEC : RTL
|
||||
++ DEY : BPL .next
|
||||
PLY
|
||||
CLC : RTL
|
||||
|
||||
115
hooks.asm
115
hooks.asm
@@ -36,6 +36,9 @@ org $00821B ; <- 21B - Bank00.asm : 329 (LDA $13 : STA $2100)
|
||||
JML.l PostNMIHookAction : NOP
|
||||
PostNMIHookReturn:
|
||||
;--------------------------------------------------------------------------------
|
||||
org $008F6C
|
||||
JSL PostNMIUpdateBGCharHalf : NOP
|
||||
;--------------------------------------------------------------------------------
|
||||
|
||||
;================================================================================
|
||||
; Anti-ZSNES Hook
|
||||
@@ -499,16 +502,21 @@ JSL.l CheckEnoughCrystalsForTower
|
||||
NOP #4
|
||||
db #$90 ; BCC
|
||||
;--------------------------------------------------------------------------------
|
||||
org $08CE0C ; <- 44E0C - ancilla_break_tower_seal.asm : 168 (BEQ #$03 : JSR BreakTowerSeal_ExecuteSparkles : LDX.b #$06)
|
||||
JML.l GetRequiredCrystalsForTower
|
||||
NOP #3
|
||||
GetRequiredCrystalsForTower_continue:
|
||||
org $08CE0C ; <- 44E0C - ancilla_break_tower_seal.asm : 168 (BEQ #$03 : JSR GTCutscene_SparkleALot : LDX.b #$06)
|
||||
JML.l GTCutscene_AnimateCrystals_Prep : NOP
|
||||
LDX.b #$05
|
||||
GTCutscene_AnimateCrystals_NextCrystal:
|
||||
JML.l GTCutscene_ConditionalAnimateCrystals
|
||||
;--------------------------------------------------------------------------------
|
||||
org $08CE93
|
||||
GTCutscene_DrawSingleCrystal:
|
||||
JML.l GTCutscene_ConditionalDrawSingleCrystal
|
||||
;--------------------------------------------------------------------------------
|
||||
org $08CF19 ; <- 44F19 - ancilla_break_tower_seal.asm : 336 (TXA : AND.b #$07 : TAX)
|
||||
JSL.l GetRequiredCrystalsInX
|
||||
JSL.l GTCutscene_ActivateSparkle_SelectCrystal
|
||||
;--------------------------------------------------------------------------------
|
||||
org $08CFC9 ; <- 44FC9 - ancilla_break_tower_seal.asm : 414 (RTS)
|
||||
db #$6B
|
||||
RTL
|
||||
;--------------------------------------------------------------------------------
|
||||
|
||||
;================================================================================
|
||||
@@ -971,6 +979,9 @@ JSL.l ChestPrep
|
||||
NOP #3
|
||||
db $90 ; !BCC .cantOpen
|
||||
;--------------------------------------------------------------------------------
|
||||
org $008A9D
|
||||
JSL ConditionalPushBlockTransfer : NOP
|
||||
|
||||
org $00D531 ; 5531 - Bank00.asm:3451 (LDY.b #$5D)
|
||||
JML.l GetAnimatedSpriteGfxFile
|
||||
|
||||
@@ -981,9 +992,15 @@ org $00D557 ; 5557 - Bank00.asm:3486 (LDA $00 : ADC $D469, X)
|
||||
JSL.l GetAnimatedSpriteBufferPointer
|
||||
NOP
|
||||
|
||||
org $05FA50
|
||||
JSL Sprite_ConditionalPrepOAMCoord
|
||||
|
||||
org $0799F7 ; 399F7 - Bank07.asm:4107 (JSL AddReceivedItem)
|
||||
JSL.l AddReceivedItemExpanded
|
||||
|
||||
org $08C505
|
||||
JSL Ancilla22_ItemReceipt_ContinueB : NOP #2
|
||||
|
||||
org $098605 ; 48605 - ancilla_init.asm:709 (TYA : STA $02E4 : PHX)
|
||||
JML.l Multiworld_AddReceivedItem_notCrystal
|
||||
NOP
|
||||
@@ -995,9 +1012,12 @@ LDA.w AddReceivedItemExpanded_item_target_addr+1, X
|
||||
org $09861F ; 4861F - ancilla_init.asm:724 (LDA .item_values, Y)
|
||||
LDA.w AddReceivedItemExpanded_item_values, Y
|
||||
|
||||
org $098624 ; 48624 - ancilla_init.asm:728 (TYA : ASL A : TAX)
|
||||
JSL.l UpdateInventoryLocationExpanded
|
||||
BRA + : NOP #18 : +
|
||||
org $098627 ; 48627 - ancilla_init.asm:731 (LDA .item_target_addr+0, X)
|
||||
LDA.w AddReceivedItemExpanded_item_target_addr+0, X
|
||||
org $09862C ; 4862C - ancilla_init.asm:722 (LDA .item_target_addr+1, X)
|
||||
LDA.w AddReceivedItemExpanded_item_target_addr+1, X
|
||||
org $098635 ; 48635 - ancilla_init.asm:727 (LDA .item_values, Y)
|
||||
LDA.w AddReceivedItemExpanded_item_values, Y
|
||||
|
||||
org $0986AA ; 486AA - ancilla_init.asm:848 (LDA .item_masks, X)
|
||||
LDA.w AddReceivedItemExpanded_item_masks, X
|
||||
@@ -1058,6 +1078,10 @@ JSL HandleBombAbsorbtion
|
||||
;org $09873F ; <- 04873F - ancilla_init.asm : 960 (ADC [$00] : STA [$00] )
|
||||
;JSL.l AddToStock
|
||||
;--------------------------------------------------------------------------------
|
||||
org $02EB18
|
||||
JSL PostOverworldGfxLoad
|
||||
org $18BD55
|
||||
JSL PostUnderworldMap
|
||||
|
||||
;================================================================================
|
||||
; Kholdstare Shell Fix
|
||||
@@ -1313,7 +1337,7 @@ NOP #5
|
||||
;--------------------------------------------------------------------------------
|
||||
org $05EE5F ; <- 2EE5F - sprite_mushroom.asm : 30
|
||||
JSL.l LoadMushroom
|
||||
NOP
|
||||
BRA + : NOP #7 : +
|
||||
;--------------------------------------------------------------------------------
|
||||
org $05EE78 ; <- 2EE78 - sprite_mushroom.asm : 58
|
||||
JSL.l DrawMushroom
|
||||
@@ -1360,6 +1384,8 @@ org $07A303 ; 3A303 - Bank07.asm : 5622
|
||||
org $07A3A2 ; 3A3A2 - Bank07.asm : 5720 - JSL DiggingGameGuy_AttemptPrizeSpawn
|
||||
JSL.l SpawnShovelItem
|
||||
BRA _Bank07_5726
|
||||
org $1DFDAC
|
||||
JSL.l SpawnShovelGamePrize
|
||||
org $07A3AB ; 3A3AB - Bank07.asm : 5726 - LDA.b #$12 : JSR Player_DoSfx2
|
||||
_Bank07_5726:
|
||||
;org $07A381 ; 3A381 - Bank07.asm : 5693 - ORA $035B
|
||||
@@ -1938,6 +1964,9 @@ NOP #8
|
||||
org $028B8F ; <- 10B8F - Bank02.asm:2236 (LDA $7EF374 : LSR A)
|
||||
JSL CheckHeraBossDefeated : NOP
|
||||
;================================================================================
|
||||
org $028D6E
|
||||
JSL FallingMusicFadeOut : BRA + : NOP #2 : +
|
||||
;================================================================================
|
||||
org $029090 ; <- 11090 - Bank02.asm:3099 (LDA $7EF374 : LSR A)
|
||||
JSL CheckHeraBossDefeated : NOP
|
||||
;================================================================================
|
||||
@@ -2110,6 +2139,9 @@ PHB : JSL.l DarkWorldSaveFix
|
||||
org $028046 ; <- 10046 - Bank02.asm : 217 (JSL EnableForceBlank) (Start of Module_LoadFile)
|
||||
JSL.l OnFileLoad
|
||||
;--------------------------------------------------------------------------------
|
||||
org $0280A2
|
||||
JSL GetCurrentWorldForLoad
|
||||
;--------------------------------------------------------------------------------
|
||||
org $09F520 ; <- 4F520 - module_death.asm : 401 (LDA $7EF3C5 : CMP.b #$03 : BCS BRANCH_THETA)
|
||||
JSL.l OnPlayerDead
|
||||
JSL.l IncrementDeathCounter
|
||||
@@ -2315,7 +2347,7 @@ JSL.l HeartPieceSpawnDelayFix
|
||||
org $05F08A ; <- 2F08A - sprite_heart_upgrades.asm : 324 - (LDA $7EF36B : INC A : AND.b #$03 : STA $7EF36B : BNE .got_4_piecese) item determination
|
||||
JSL.l HeartPieceGet
|
||||
BCS $18 ; reinsert the near branch that appears midway through what we overrode
|
||||
NOP #22
|
||||
BRA + : NOP #20 : +
|
||||
;--------------------------------------------------------------------------------
|
||||
org $06C0B0 ; <- 340B0 - sprite prep
|
||||
JSL.l HeartPieceSpritePrep
|
||||
@@ -2408,7 +2440,6 @@ JML MirrorBonk
|
||||
MirrorBonk_NormalReturn:
|
||||
org $07A9D1 ; <- 3A9D1 - Bank07.asm:6649 (BRANCH_GAMMA:)
|
||||
MirrorBonk_BranchGamma:
|
||||
JML OWMirrorSpriteBonk
|
||||
;================================================================================
|
||||
|
||||
;================================================================================
|
||||
@@ -2435,6 +2466,9 @@ NOP #6
|
||||
;--------------------------------------------------------------------------------
|
||||
org $09865E ; <- 4865E
|
||||
JSL.l $1BEE1B ; fix something i wrote over i shouldn't have
|
||||
;--------------------------------------------------------------------------------
|
||||
org $098638 ; <- 48638 - ancilla_init.asm:737 - LDA .item_values, Y : BMI .dontWrite (BMI)
|
||||
JSL.l ItemDowngradeFix
|
||||
;================================================================================
|
||||
|
||||
;================================================================================
|
||||
@@ -2525,6 +2559,10 @@ JSL Overworld_MosaicDarkWorldChecks : NOP
|
||||
org $05CC58 ; <- Bank05.asm:1307 (LDA $040A : CMP.b #$18)
|
||||
JSL PsychoSolder_MusicCheck
|
||||
NOP #1
|
||||
;
|
||||
org $06F96A
|
||||
JSL PsychoSolder_MusicCheck
|
||||
NOP #1
|
||||
;--------------------------------------------------------------------------------
|
||||
org $02B13A ; <- Bank02.asm:7647
|
||||
dl Overworld_FinishMirrorWarp
|
||||
@@ -2889,10 +2927,6 @@ org $0882E8 ; Bank08.asm@456 (LDA $0DB0, Y : CMP.b #$03)
|
||||
JSL Utility_CheckHelmasaurKingCollision
|
||||
NOP
|
||||
;--------------------------------------------------------------------------------
|
||||
org $1E838C ; sprite_helmasaur_king.asm@522 (LDA $0301 : AND.b #$0A)
|
||||
JSL Utility_CheckHammerHelmasaurKingMask
|
||||
NOP
|
||||
;--------------------------------------------------------------------------------
|
||||
org $06ED94 ; Bank06.asm@4866 (LDA $0E60, X : AND.b #$40)
|
||||
JSL Utility_CheckImpervious
|
||||
NOP
|
||||
@@ -2925,7 +2959,7 @@ org $089EF8 ; ancilla_bomb@1438 (LDA.w #$04 : STA $0B)
|
||||
JSL SetBombSpriteColor
|
||||
;--------------------------------------------------------------------------------
|
||||
; bomb icons with numbers
|
||||
org $0DFC51 ; is this being used? I hope not! let's find out if anything breaks!
|
||||
org $0DFC51 ; we freed this up earlier in hooks; probably shouldn't use it but *shrug*
|
||||
db $F5, $20, $F5, $20, $F5, $20, $F5, $20
|
||||
db $B2, $3C, $B3, $3C, $C2, $3C, $17, $3C
|
||||
db $B2, $2C, $B3, $2C, $C2, $2C, $18, $2C
|
||||
@@ -2934,19 +2968,15 @@ db $B2, $28, $B3, $28, $C2, $28, $1A, $28
|
||||
db $B2, $28, $B3, $28, $C2, $28, $1B, $28
|
||||
|
||||
; bomb icons without numbers
|
||||
org $0DFC81
|
||||
; $0DFC81
|
||||
db $F5, $20, $F5, $20, $F5, $20, $F5, $20
|
||||
db $B2, $3C, $B3, $3C, $C2, $3C, $C2, $7C
|
||||
db $B2, $2C, $B3, $2C, $C2, $2C, $C2, $6C
|
||||
db $B2, $24, $B3, $24, $C2, $24, $C2, $64
|
||||
db $B2, $28, $B3, $28, $C2, $28, $C2, $68
|
||||
db $B2, $28, $B3, $28, $C2, $28, $C2, $68
|
||||
;--------------------------------------------------------------------------------
|
||||
org $079CE6 ; Bank07.asm@4632 (LDA #$80 : TSB $3A)
|
||||
JSL CheckDetonateBomb
|
||||
;--------------------------------------------------------------------------------
|
||||
org $079D08 ; bank_07.asm@6068 (INC $3C : LDA $3C : CMP #$09)
|
||||
JSL NoSwingHammerB : NOP #2
|
||||
|
||||
warnpc $0DFC51+197 ; we only filled in 197 NOPs so don't overwrite past that
|
||||
;--------------------------------------------------------------------------------
|
||||
org $1EDCF8 ; bank_1E.asm@16086 (LDX $0202 : ...)
|
||||
JSL SetBeeType
|
||||
@@ -2964,11 +2994,24 @@ NOP #48
|
||||
skip 11
|
||||
.bee_valid_target
|
||||
;--------------------------------------------------------------------------------
|
||||
org $07F88C ; free rom from F877 - F88F; the starting part of this is used in quadrant glitch fix below, however.
|
||||
Link_UseHammerLong:
|
||||
JSR Link_UseHammer : RTL
|
||||
org $07F889 ; free rom from F877 - F88F; the starting part of this is used in quadrant glitch fix in overworld fork, however.
|
||||
Link_UseItemLong:
|
||||
PER .done-1
|
||||
JMP.w ($0000)
|
||||
.done
|
||||
RTL
|
||||
warnpc $07F890
|
||||
;--------------------------------------------------------------------------------
|
||||
org $06F2DC ; bank_06.asm@22763 (LDA.w $037A : AND.b #$10)
|
||||
JSL CheckBugNet : NOP
|
||||
|
||||
org $06EB91 ; bank_06.asm@21178 (LDA.w $037A : AND.b #$10)
|
||||
JSL CheckBugNet : NOP
|
||||
;--------------------------------------------------------------------------------
|
||||
org $06ED77 ; bank_06.asm@21597 (LDA.w $0301 : AND.b #$0A : ...)
|
||||
JSL SetHammerClass
|
||||
BRA + : NOP #7 : +
|
||||
;--------------------------------------------------------------------------------
|
||||
|
||||
;================================================================================
|
||||
; Variable Ganon Vulnerability
|
||||
@@ -2995,6 +3038,20 @@ NOP
|
||||
;--------------------------------------------------------------------------------
|
||||
org $06ED70 ; Bank06.asm@4842 (LDA $06ED39, X : STA $0CF2)
|
||||
JSL StoreSwordDamage
|
||||
|
||||
;================================================================================
|
||||
; Item-On-B
|
||||
;--------------------------------------------------------------------------------
|
||||
org $0DEB3C
|
||||
JSL DrawBIndicator : BRA + : NOP #3 : +
|
||||
;--------------------------------------------------------------------------------
|
||||
org $079CE6 ; Bank07.asm@4632 (LDA #$80 : TSB $3A : ...)
|
||||
JSL UseItem
|
||||
BCC + : RTS : +
|
||||
JSR $9C56
|
||||
NOP #1
|
||||
;--------------------------------------------------------------------------------
|
||||
|
||||
;================================================================================
|
||||
; Fix quadrant glitch
|
||||
org $07A879
|
||||
@@ -3069,5 +3126,9 @@ org $02E297 ; LDA.w #$0002 : STA.b $2F
|
||||
JSL WalkUpOnOverworld
|
||||
NOP
|
||||
|
||||
org $02E36F
|
||||
JSL CheckStairsAdjustment
|
||||
NOP
|
||||
|
||||
org $02D7D2 ; BEQ .face_up
|
||||
NOP #2 ; this fixes Link's direction after mirroring and falling after entering through back of tavern
|
||||
|
||||
1
init.asm
1
init.asm
@@ -10,6 +10,7 @@ Init_Primary:
|
||||
LDX #$00 ; initalize our ram
|
||||
-
|
||||
STA $7EC025, X
|
||||
STA $7EC035, X
|
||||
STA $7F5000, X
|
||||
INX
|
||||
CPX #$10 : !BLT -
|
||||
|
||||
142
inventory.asm
142
inventory.asm
@@ -30,9 +30,10 @@
|
||||
ProcessMenuButtons:
|
||||
;LDA #$FD : STA InventoryTracking ; DEBUG MODE
|
||||
;LDA $F6 : BIT #$20 : BNE .l_pressed ; check for P1 L-button
|
||||
LDA $F4 : BIT #$40 : BNE .y_pressed ; check for P1 Y-button
|
||||
BIT #$20 : BNE .sel_pressed ; check for P1 Select button
|
||||
LDA $F0 : BIT #$20 : BNE .sel_held
|
||||
LDA.b $F4 : BIT.b #$40 : BNE .y_pressed ; check for P1 Y-button
|
||||
BIT.b #$20 : BNE .sel_pressed ; check for P1 Select button
|
||||
BIT.b #$80 : BNE .b_pressed ; check for P1 B-button
|
||||
LDA.b $F0 : BIT.b #$20 : BNE .sel_held
|
||||
.sel_unheld
|
||||
LDA HudFlag : AND #$20 : BEQ +
|
||||
LDA HudFlag : AND #$DF : STA HudFlag ; select is released, unset hud flag
|
||||
@@ -48,6 +49,18 @@ RTL
|
||||
LDA HudFlag : ORA #$20 : STA HudFlag ; set hud flag
|
||||
LDA.b #$20 : STA $012F ; menu select sound
|
||||
JSL.l ResetEquipment
|
||||
RTL
|
||||
.b_pressed
|
||||
JSR CanPressB : BCC .b_error
|
||||
LDA.w $0202 : CMP.l ItemOnB : BNE .set_b
|
||||
LDA.b #$00
|
||||
.set_b
|
||||
STA.l ItemOnB
|
||||
BRA .b_done
|
||||
.b_error
|
||||
LDA.b #$3C : STA.w $012E ; error sound
|
||||
.b_done
|
||||
SEC
|
||||
RTL
|
||||
.y_pressed ; Note: used as entry point by quickswap code. Must preserve X.
|
||||
LDA.b #$10 : STA $0207
|
||||
@@ -115,6 +128,27 @@ RTL
|
||||
SEC
|
||||
RTL
|
||||
;--------------------------------------------------------------------------------
|
||||
CanPressB:
|
||||
PHY : PHP : SEP #$30
|
||||
LDA.l AllowedItemOnB : BEQ .no
|
||||
CMP.b #$FF : BEQ .skip_allow_check
|
||||
CMP.w $0202 : BNE .no
|
||||
.skip_allow_check
|
||||
PHX
|
||||
LDA.w $0202 : TAX
|
||||
LDA.l ValidItemOnB, X : BNE .plx_and_no
|
||||
PLX
|
||||
PLP : PLY
|
||||
SEC
|
||||
RTS
|
||||
.plx_and_no
|
||||
PLX
|
||||
.no
|
||||
PLP : PLY
|
||||
CLC
|
||||
RTS
|
||||
;--------------------------------------------------------------------------------
|
||||
|
||||
|
||||
;--------------------------------------------------------------------------------
|
||||
;ProcessBottleMenu:
|
||||
@@ -548,27 +582,25 @@ AddInventory:
|
||||
CPY.b #$90 : !BGE +
|
||||
JSL MaybeFlagCompassTotalPickup
|
||||
JSR .incrementCompass
|
||||
JMP .done
|
||||
BRA .done
|
||||
+ CPY.b #$90 : !BLT + ; Items $90 - $9F - Free Big Keys
|
||||
CPY.b #$A0 : !BGE +
|
||||
JSR .incrementBigKey
|
||||
JMP .done
|
||||
BRA .done
|
||||
+ CPY.b #$A0 : !BLT + ; Items $A0 - $AF - Free Small Keys
|
||||
CPY.b #$B0 : !BGE +
|
||||
JSR .incrementKey
|
||||
JMP .done
|
||||
+ CPY.b #$B6 : BNE + ; Item $B6 - Bomb Upgrade
|
||||
BRA .done
|
||||
+ CPY.b #$C0 : BEQ .special_weapon ; Item $C0 - Bomb Upgrade
|
||||
CPY.b #$C1 : BEQ .special_weapon ; Item $C1 - Cane Upgrade
|
||||
CPY.b #$C2 : BEQ .special_weapon ; Item $C2 - Bug Net Upgrade
|
||||
BRA .done
|
||||
.special_weapon
|
||||
JSR .stampSword ; update "first bomb" timestamp
|
||||
LDA.l SpecialWeaponLevel ; get current bomb level
|
||||
CMP #$05 : !BGE ++ ; check if already maxed
|
||||
INC : STA.l SpecialWeaponLevel
|
||||
++ JMP .done
|
||||
+ CPY.b #$B7 : BNE + ; Item $B7 - Cane Upgrade
|
||||
JSR .stampSword ; update "first cane" timestamp
|
||||
LDA.l SpecialWeaponLevel ; get current cane level
|
||||
CMP #$05 : !BGE ++ ; check if already maxed
|
||||
INC : STA.l SpecialWeaponLevel
|
||||
++ JMP .done
|
||||
++ BRA .done
|
||||
+
|
||||
.done
|
||||
PLP : PLX : PLA
|
||||
@@ -707,10 +739,11 @@ RTS
|
||||
RTL
|
||||
|
||||
.incrementBossSword
|
||||
LDA SpecialWeapons : CMP #$01 : BEQ +
|
||||
CMP #$03 : BEQ +
|
||||
CMP #$04 : BEQ +
|
||||
CMP #$05 : BEQ +
|
||||
LDA.l SpecialWeapons : AND.b #$7F : CMP.b #$01 : BEQ +
|
||||
CMP.b #$03 : BEQ +
|
||||
CMP.b #$04 : BEQ +
|
||||
CMP.b #$05 : BEQ +
|
||||
CMP.b #$08 : BEQ +
|
||||
LDA SwordEquipment : BRA ++
|
||||
+ : LDA SpecialWeaponLevel
|
||||
++
|
||||
@@ -788,6 +821,7 @@ AddYMarker:
|
||||
+ CMP.w #$10 : BEQ .drawJarMarker
|
||||
|
||||
.drawNormal
|
||||
JSR CanPressB : BCS .drawBBubble
|
||||
LDA.w #$7C60
|
||||
BRA .drawTile
|
||||
|
||||
@@ -796,12 +830,20 @@ AddYMarker:
|
||||
LDA $0207 : AND.w #$0020 : BNE .drawXBubble
|
||||
|
||||
.drawYBubble
|
||||
JSR CanPressB : BCC .drawY
|
||||
LDA.w $0207 : AND.w #$0020 : BNE .drawBBubble
|
||||
.drawY
|
||||
LDA.w #$3D4F
|
||||
BRA .drawTile
|
||||
|
||||
.drawXBubble
|
||||
JSR MakeCircleBlue
|
||||
LDA.w #$2D3E
|
||||
BRA .drawTile
|
||||
|
||||
.drawBBubble
|
||||
JSR MakeCircleRed
|
||||
LDA.w #$293F
|
||||
|
||||
.drawTile
|
||||
STA $FFC4, Y
|
||||
@@ -830,6 +872,24 @@ MakeCircleBlue:
|
||||
LDA $0084, Y : AND.w #$EFFF : STA $0084, Y
|
||||
LDA $007E, Y : AND.w #$EFFF : STA $007E, Y
|
||||
RTS
|
||||
MakeCircleRed:
|
||||
LDA.w $FFC0, Y : AND.w #$EBFF : STA.w $FFC0, Y
|
||||
LDA.w $FFC2, Y : AND.w #$EBFF : STA.w $FFC2, Y
|
||||
|
||||
LDA.w $FFFE, Y : AND.w #$EBFF : STA.w $FFFE, Y
|
||||
LDA.w $0004, Y : AND.w #$EBFF : STA.w $0004, Y
|
||||
|
||||
LDA.w $003E, Y : AND.w #$EBFF : STA.w $003E, Y
|
||||
LDA.w $0044, Y : AND.w #$EBFF : STA.w $0044, Y
|
||||
|
||||
LDA.w $0080, Y : AND.w #$EBFF : STA.w $0080, Y
|
||||
LDA.w $0082, Y : AND.w #$EBFF : STA.w $0082, Y
|
||||
|
||||
LDA.w $FFBE, Y : AND.w #$EBFF : STA.w $FFBE, Y
|
||||
LDA.w $FFC4, Y : AND.w #$EBFF : STA.w $FFC4, Y
|
||||
LDA.w $0084, Y : AND.w #$EBFF : STA.w $0084, Y
|
||||
LDA.w $007E, Y : AND.w #$EBFF : STA.w $007E, Y
|
||||
RTS
|
||||
;--------------------------------------------------------------------------------
|
||||
|
||||
;--------------------------------------------------------------------------------
|
||||
@@ -969,8 +1029,7 @@ LoadPowder:
|
||||
LDA.l WitchItem_Player : STA !MULTIWORLD_SPRITEITEM_PLAYER_ID
|
||||
%GetPossiblyEncryptedItem(WitchItem, SpriteItemValues)
|
||||
STA $0DA0, Y ; Store item type
|
||||
JSL.l PrepDynamicTile
|
||||
STA $7F505E
|
||||
LDA.b #$01 : STA.w !SPRITE_REDRAW, Y
|
||||
LDA #$00
|
||||
STA $7F505F
|
||||
STA $7F5060
|
||||
@@ -994,21 +1053,16 @@ RTL
|
||||
;--------------------------------------------------------------------------------
|
||||
; DrawPowder:
|
||||
;--------------------------------------------------------------------------------
|
||||
!REDRAW = "$7F5000"
|
||||
;--------------------------------------------------------------------------------
|
||||
DrawPowder:
|
||||
LDA $02DA : BNE .defer ; defer if link is buying a potion
|
||||
LDA.l !REDRAW : BEQ +
|
||||
LDA.w !SPRITE_REDRAW, X : BEQ +
|
||||
LDA.l WitchItem_Player : STA !MULTIWORLD_SPRITEITEM_PLAYER_ID
|
||||
LDA $0DA0, X ; Retrieve stored item type
|
||||
JSL.l PrepDynamicTile
|
||||
LDA #$00 : STA.l !REDRAW ; reset redraw flag
|
||||
BRA .defer
|
||||
JML RequestSlottedTile
|
||||
+
|
||||
; this fights with the shopkeep code, so had to move the powder draw there when potion shop is custom
|
||||
LDA !SHOP_TYPE : CMP.b #$FF : BNE .defer
|
||||
LDA $0DA0, X ; Retrieve stored item type
|
||||
JSL.l DrawDynamicTile
|
||||
LDA $0DA0, X ; Retrieve stored item type
|
||||
JML DrawSlottedTile
|
||||
.defer
|
||||
RTL
|
||||
;--------------------------------------------------------------------------------
|
||||
@@ -1019,19 +1073,12 @@ RTL
|
||||
LoadMushroom:
|
||||
LDA.b #$00 : STA $0DC0, X ; thing we wrote over
|
||||
.justGFX
|
||||
;LDA MushroomItem
|
||||
;JSL.l PrepDynamicTile
|
||||
|
||||
PHA
|
||||
|
||||
LDA #$01 : STA !REDRAW
|
||||
LDA $5D : CMP #$14 : BEQ .skip ; skip if we're mid-mirror
|
||||
|
||||
LDA #$00 : STA !REDRAW
|
||||
LDA.l MushroomItem_Player : STA !MULTIWORLD_SPRITEITEM_PLAYER_ID
|
||||
%GetPossiblyEncryptedItem(MushroomItem, SpriteItemValues)
|
||||
STA $0E80, X ; Store item type
|
||||
JSL.l PrepDynamicTile
|
||||
JSL.l RequestSlottedTile
|
||||
|
||||
.skip
|
||||
PLA
|
||||
@@ -1041,19 +1088,18 @@ RTL
|
||||
;--------------------------------------------------------------------------------
|
||||
; DrawMushroom:
|
||||
;--------------------------------------------------------------------------------
|
||||
!REDRAW = "$7F5000"
|
||||
;--------------------------------------------------------------------------------
|
||||
DrawMushroom:
|
||||
PHA : PHY
|
||||
LDA !REDRAW : BEQ .skipInit ; skip init if already ready
|
||||
JSL.l LoadMushroom_justGFX
|
||||
BRA .done ; don't draw on the init frame
|
||||
LDA.w !SPRITE_REDRAW, X : BEQ .skipInit ; skip init if already ready
|
||||
JSL.l LoadMushroom_justGFX
|
||||
LDA.w !SPRITE_REDRAW, X : CMP.b #$02 : BEQ .skipInit
|
||||
BRA .done ; don't draw on the init frame
|
||||
|
||||
.skipInit
|
||||
LDA $0E80, X ; Retrieve stored item type
|
||||
JSL.l DrawDynamicTile
|
||||
JSL.l DrawSlottedTile
|
||||
|
||||
.done
|
||||
.done
|
||||
PLY : PLA
|
||||
RTL
|
||||
;--------------------------------------------------------------------------------
|
||||
@@ -1147,10 +1193,12 @@ RTL
|
||||
;--------------------------------------------------------------------------------
|
||||
; SpawnShovelItem:
|
||||
;--------------------------------------------------------------------------------
|
||||
!REDRAW = "$7F5000"
|
||||
SpawnShovelGamePrize:
|
||||
JSL Sprite_SpawnDynamically ; thing we wrote over
|
||||
LDA.b #$01 : STA.w !SPRITE_REDRAW, Y
|
||||
RTL
|
||||
;--------------------------------------------------------------------------------
|
||||
SpawnShovelItem:
|
||||
LDA.b #$01 : STA !REDRAW
|
||||
|
||||
LDA $03FC : BEQ +
|
||||
JSL DiggingGameGuy_AttemptPrizeSpawn
|
||||
JMP .skip
|
||||
|
||||
@@ -151,7 +151,9 @@ GanonTowerAnimation:
|
||||
STZ $011B
|
||||
STZ $011C
|
||||
STZ $011D
|
||||
LDA.b #$02 : STA $012C
|
||||
PHX
|
||||
JSL Overworld_DetermineMusic : STX !REG_MUSIC_CONTROL_REQUEST
|
||||
PLX
|
||||
LDA.b #$09 : STA $012D
|
||||
RTL
|
||||
.done
|
||||
|
||||
@@ -153,17 +153,19 @@ LDA.l WarningFlags : AND #$0020 : BEQ + : JMP .spiral_mimic_ledge
|
||||
.spiral_mimic_ledge
|
||||
LDA #$00E3 : STA $2BDC : STA $2BDE : STA $2BE0 : STA $2BE2
|
||||
STA $2BE4 : STA $2BE6 : STA $2BE8 : STA $2BEA
|
||||
LDA #$014E : STA $2C5C : STA $2C5E : STA $2C64
|
||||
LDA #$0139 : STA $2C60 : STA $2C66
|
||||
LDA #$014B : STA $2C68 : STA $2C62
|
||||
LDA #$014E : STA $2C6A
|
||||
LDA #$0152 : STA $2CDC : STA $2CDE : STA $2CE4 : STA $2CEA
|
||||
LDA #$016B : STA $2CE0 : STA $2CE6
|
||||
LDA #$0182 : STA $2CE2 : STA $2CE8
|
||||
LDA #$014E : STA $2C5C : STA $2C5E : STA $2C64 : STA $2C66
|
||||
STA $2C68 : STA $2C6A
|
||||
LDA #$0139 : STA $2C60
|
||||
LDA #$014B : STA $2C62
|
||||
LDA #$0152 : STA $2CDC : STA $2CDE : STA $2CE4 : STA $2CE6
|
||||
STA $2CE8 : STA $2CEA
|
||||
LDA #$016B : STA $2CE0
|
||||
LDA #$0182 : STA $2CE2
|
||||
LDA #$022E : STA $2D5C : STA $2D5E : STA $2D60 : STA $2D62
|
||||
STA $2D64 : STA $2D66 : STA $2D68 : STA $2D6A
|
||||
LDA #$0230 : STA $2DDC : STA $2DDE : STA $2DE0 : STA $2DE2
|
||||
STA $2DE4 : STA $2DE6 : STA $2DE8 : STA $2DEA
|
||||
LDA #$0230 : STA $2DDC : STA $2DDE : STA $2DE0 : STA $2DE6
|
||||
STA $2DE8 : STA $2DEA
|
||||
LDA #$02A6 : STA $2DE2 : STA $2DE4
|
||||
|
||||
; remove portal
|
||||
LDA #$0034 : STA $3D4A
|
||||
|
||||
98
item_on_b.asm
Normal file
98
item_on_b.asm
Normal file
@@ -0,0 +1,98 @@
|
||||
;--------------------------------------------------------------------------------
|
||||
ItemMenuLocations:
|
||||
dw $11C8 ; Bow
|
||||
dw $11CE ; Boomerang
|
||||
dw $11D4 ; Hookshot
|
||||
dw $11DA ; Bombs
|
||||
dw $11E0 ; Powder / Mushroom
|
||||
dw $1288 ; Fire Rod
|
||||
dw $128E ; Ice Rod
|
||||
dw $1294 ; Bombos
|
||||
dw $129A ; Ether
|
||||
dw $12A0 ; Quake
|
||||
dw $1348 ; Lamp
|
||||
dw $134E ; Hammer
|
||||
dw $1354 ; Flute / Shovel
|
||||
dw $135A ; Bug Net
|
||||
dw $1360 ; Book
|
||||
dw $1408 ; Bottles
|
||||
dw $140E ; Somaria
|
||||
dw $1414 ; Byrna
|
||||
dw $141A ; Cape
|
||||
dw $1420 ; Mirror
|
||||
|
||||
DrawBIndicator:
|
||||
LDA.l ItemOnB : AND.w #$00FF : BEQ .done
|
||||
DEC : ASL : TAX
|
||||
LDA.l ItemMenuLocations, X : TAX
|
||||
LDA.w #$3D3B
|
||||
STA.w $0042, X
|
||||
|
||||
.done ; what we wrote over
|
||||
LDA.w $0202
|
||||
AND.w #$00FF
|
||||
DEC
|
||||
ASL
|
||||
TAX
|
||||
RTL
|
||||
;--------------------------------------------------------------------------------
|
||||
ItemHandlerLocs:
|
||||
dw $A003 ; Bow
|
||||
dw $A0B8 ; Boomerang
|
||||
dw $AB23 ; Hookshot
|
||||
dw $A139 ; Bombs
|
||||
dw $FFFF ; Powder / Mushroom
|
||||
dw $9EEC ; Fire Rod
|
||||
dw $9EEC ; Ice Rod
|
||||
dw $A55E ; Bombos
|
||||
dw $A489 ; Ether
|
||||
dw $A640 ; Quake
|
||||
dw $A246 ; Lamp
|
||||
dw $9F82 ; Hammer
|
||||
dw $FFFF ; Flute / Shovel
|
||||
dw $AFEE ; Bug Net
|
||||
dw $A46E ; Book
|
||||
dw $FFFF ; Bottles
|
||||
dw $AEBB ; Somaria
|
||||
dw $FFFF ; Byrna
|
||||
dw $FFFF ; Cape
|
||||
dw $A913 ; Mirror
|
||||
ValidItemOnB:
|
||||
db $FF
|
||||
db $00, $00, $00, $00, $FF
|
||||
db $00, $00, $00, $00, $00
|
||||
db $00, $00, $FF, $00, $00
|
||||
db $FF, $00, $FF, $FF, $00
|
||||
|
||||
UseItem:
|
||||
JSL CheckDetonateBomb : BCS .normal
|
||||
|
||||
LDA.l ItemOnB : BEQ .normal
|
||||
TAX
|
||||
LDA.b $6C : BNE .prevent_swing
|
||||
CPX.b #$11 : BNE .not_somaria
|
||||
LDA.w $02F5 : BNE .prevent_swing
|
||||
.not_somaria
|
||||
LDA.l ValidItemOnB, X : BNE .normal
|
||||
LDA.b $3A : ORA.b #$40 : STA.b $3A
|
||||
LDA.l $0DFA35, X : STA.w $0304
|
||||
CPX.b #$06 : BEQ .fire_rod
|
||||
CPX.b #$07 : BNE .not_rod
|
||||
.ice_rod
|
||||
LDA.b #$02 : STA.w $0307
|
||||
BRA .not_rod
|
||||
.fire_rod
|
||||
LDA.b #$01 : STA.w $0307
|
||||
.not_rod
|
||||
TXA : DEC : ASL : TAX
|
||||
LDA.l ItemHandlerLocs+1, X : STA.b $01
|
||||
LDA.l ItemHandlerLocs, X : STA.b $00
|
||||
JSL Link_UseItemLong
|
||||
.prevent_swing
|
||||
SEC
|
||||
RTL
|
||||
.normal
|
||||
LDA.b #$80 : TSB.b $3A
|
||||
LDA.b #$01 : TSB.b $50
|
||||
CLC
|
||||
RTL
|
||||
@@ -1,77 +1,217 @@
|
||||
; where we shove the decompressed graphics to send to WRAM
|
||||
DynamicDropGFX = $7EF500
|
||||
DynamicDropGFX = $7ECC00
|
||||
|
||||
; this will just count from 0 to 4 to determine which slot we're using
|
||||
; we're expecting 5 items max per room, and order is irrelevant
|
||||
; we just need to keep track of where they go
|
||||
DynamicDropGFXIndex = $7E1E70
|
||||
!DynamicDropGFXSlotCount_UW = (FreeUWGraphics_end-FreeUWGraphics)>>1
|
||||
!DynamicDropGFXSlotCount_OW = (FreeOWGraphics_end-FreeOWGraphics)>>1
|
||||
|
||||
; this will keep track of the above for each item
|
||||
SprItemGFX = $7E0780
|
||||
|
||||
; this is the item requested and a flag
|
||||
DynamicDropRequest = $7E1E71
|
||||
DynamicDropQueue = $7E1E72
|
||||
; this is the item requested and a flag (we anticipate no more than 3 requests to be active, but built to support 8)
|
||||
DynamicDropRequest = $7E1E71 ; bitfield indicating which request slot to process
|
||||
DynamicDropQueue = $7E1E72 ; 0x08 bytes, occupies 1 byte for each slot in the request queue (loot id at first, but stores GFX index)
|
||||
|
||||
; Come in with
|
||||
; A = item receipt ID
|
||||
; X = slot
|
||||
RequestStandingItemVRAMSlot:
|
||||
STA.w DynamicDropQueue
|
||||
LDA.b #$01
|
||||
STA.w DynamicDropRequest
|
||||
; X = sprite slot
|
||||
RequestSlottedTile:
|
||||
PHX : PHY
|
||||
|
||||
LDA.w DynamicDropGFXIndex
|
||||
INC
|
||||
CMP.b #$05 : BCC .fine
|
||||
PHA
|
||||
LDA.b #$01 : STA.w !SPRITE_REDRAW, X
|
||||
JSL Sprite_IsOnscreen : BCC ++
|
||||
; skip sending the request if busy with other things
|
||||
LDA.b $11 : CMP.b #$21 : BCS ++ ; skip if OW is loading Map16 GFX ; TODO: Figure out how to allow submodule 22, check DMA status instead
|
||||
LDA.b $5D : CMP.b #$14 : BEQ ++ ; skip if we're mid-mirror
|
||||
LDA.b $1B : BEQ + ; OW current doesn't occupy any slots that medallion gfx do
|
||||
CMP.b #$08 : BCC + : CMP.b #$0A+1 : BCS + ; skip if we're mid-medallion
|
||||
++ PLA : JMP .return
|
||||
+
|
||||
|
||||
LDA.b #$00
|
||||
LDA.w $0E20, X : CMP.b #$C0 : BNE + ; if catfish
|
||||
TYX
|
||||
+ CMP.b #$52 : BNE + ; if zora
|
||||
TYX
|
||||
+
|
||||
|
||||
.fine
|
||||
STA.w DynamicDropGFXIndex
|
||||
STA.w SprItemGFX,X
|
||||
LDA.b 1,S : JSL.l GetSpritePalette : STA.w $0F50, X ; setup the palette
|
||||
PLA
|
||||
|
||||
; gfx that are already present, use that instead of a new slot
|
||||
CMP.b #$34 : BCC + : CMP.b #$36+1 : BCS + ; if rupees, use animated rupee OAM slot
|
||||
LDA.b $1B : BEQ ++
|
||||
LDA.b #!DynamicDropGFXSlotCount_UW
|
||||
BRA +++
|
||||
++ LDA.b #!DynamicDropGFXSlotCount_OW
|
||||
+++ INC : STA.w SprItemGFX,X
|
||||
JMP .success
|
||||
+ CMP.b #$A0 : BCC + : CMP.b #$AF+1 : BCS + ; if key, use key OAM slot
|
||||
LDY.b $5D : CPY.b #$19 : BCC ++ : CPY.b #$1A+1 : BCS ++ ; if getting tablet item, don't use key slot
|
||||
BRA +
|
||||
++
|
||||
LDA.b $1B : BEQ ++
|
||||
LDA.b #!DynamicDropGFXSlotCount_UW
|
||||
BRA +++
|
||||
++ LDA.b #!DynamicDropGFXSlotCount_OW
|
||||
+++ INC : INC : STA.w SprItemGFX,X
|
||||
JMP .success
|
||||
+ CMP.b #$B5 : BNE + ; if good bee, use bee OAM slot
|
||||
LDA.b $1B : BEQ ++
|
||||
LDA.b #!DynamicDropGFXSlotCount_UW
|
||||
BRA +++
|
||||
++ LDA.b #!DynamicDropGFXSlotCount_OW
|
||||
+++ INC : INC : INC : STA.w SprItemGFX,X
|
||||
JMP .success
|
||||
+ CMP.b #$B2 : BNE + ; if fairy, use fairy OAM slot
|
||||
LDA.b $1B : BEQ ++
|
||||
LDA.b #!DynamicDropGFXSlotCount_UW
|
||||
BRA +++
|
||||
++ LDA.b #!DynamicDropGFXSlotCount_OW
|
||||
+++ INC : INC : STA.w SprItemGFX,X
|
||||
JMP .success
|
||||
+ CMP.b #$B1 : BNE + ; if apple, use apple OAM slot
|
||||
LDA.b $1B : BEQ ++
|
||||
LDA.b #!DynamicDropGFXSlotCount_UW
|
||||
BRA +++
|
||||
++ LDA.b #!DynamicDropGFXSlotCount_OW
|
||||
+++ INC : INC : INC : STA.w SprItemGFX,X
|
||||
JMP .success
|
||||
+ CMP.b #$6A : BNE + ; if triforce, use cutscene OAM slot
|
||||
PHA
|
||||
LDA.b $1B : BEQ ++
|
||||
LDA.b #!DynamicDropGFXSlotCount_UW
|
||||
BRA +++
|
||||
++ LDA.b #!DynamicDropGFXSlotCount_OW
|
||||
+++ INC : STA.w SprItemGFX,X
|
||||
JMP .initRequest ; don't jump to end, we need the TF GFX to draw at $E7
|
||||
+
|
||||
|
||||
PHA
|
||||
LDA.w DynamicDropGFXIndex
|
||||
INC
|
||||
PHX
|
||||
LDX.b $1B : BEQ +
|
||||
CMP.b #!DynamicDropGFXSlotCount_UW : BCC .setIndex
|
||||
BRA ++
|
||||
+ CMP.b #!DynamicDropGFXSlotCount_OW : BCC .setIndex
|
||||
++ LDA.b #$00
|
||||
|
||||
.setIndex
|
||||
PLX
|
||||
STA.w DynamicDropGFXIndex
|
||||
STA.w SprItemGFX,X
|
||||
PHX
|
||||
; loop thru other sprites, check if any use the same gfx slot
|
||||
LDY.b #$0F
|
||||
- TYA : CMP 1,S : BEQ + ; don't check self
|
||||
LDA.w $0DD0,Y : BEQ +
|
||||
LDA.w !SPRITE_REDRAW, Y : BNE +
|
||||
LDA.w SprItemGFX,Y : CMP.w DynamicDropGFXIndex : BNE +
|
||||
LDA.w $0E20,Y ; don't need E5 enemy big key drop and E9 powder item
|
||||
CMP.b #$EB : BEQ ++ ; heart piece
|
||||
CMP.b #$E4 : BEQ ++ ; enemy drop
|
||||
CMP.b #$3B : BEQ ++ ; bonk item
|
||||
CMP.b #$E7 : BEQ ++ ; mushroom
|
||||
BRA +
|
||||
++
|
||||
; slot already in use, use overflow slot
|
||||
LDA.b #$02 : STA.w !SPRITE_REDRAW, X
|
||||
LDA.b $1B : BEQ ++
|
||||
LDA.b #!DynamicDropGFXSlotCount_UW
|
||||
BRA +++
|
||||
++ LDA.b #!DynamicDropGFXSlotCount_OW
|
||||
+++ STA.w SprItemGFX,X
|
||||
PLX : PLA : BRA .return
|
||||
+ DEY : BPL -
|
||||
PLX
|
||||
|
||||
.initRequest
|
||||
PHX
|
||||
LDY.b #$00
|
||||
LDA.w DynamicDropRequest
|
||||
- LSR : INY : BCS -
|
||||
CPY.b #$08 : BCC +
|
||||
; all request slots occupied, exit without drawing
|
||||
PLX : PLA
|
||||
LDY.b #$FE ; indicate failure
|
||||
BRA .return
|
||||
+ TYX
|
||||
LDA.b #$00 : SEC
|
||||
- ROL : DEX : BNE -
|
||||
DEY ; y = slot index, a = new request bit flag
|
||||
ORA.w DynamicDropRequest
|
||||
STA.w DynamicDropRequest
|
||||
PLX
|
||||
PLA
|
||||
STA.w DynamicDropQueue,Y
|
||||
|
||||
; decompress graphics
|
||||
PHX
|
||||
LDX.w DynamicDropQueue
|
||||
PHX : PHY
|
||||
|
||||
REP #$20
|
||||
LDA.w #DynamicDropGFX-$7E9000
|
||||
STA.l !TILE_UPLOAD_OFFSET_OVERRIDE
|
||||
TYX : BEQ +
|
||||
- CLC : ADC.w #$0080 : DEX : BNE -
|
||||
+ STA.l !TILE_UPLOAD_OFFSET_OVERRIDE
|
||||
SEP #$20
|
||||
|
||||
LDA.w DynamicDropQueue
|
||||
LDA.w DynamicDropQueue,Y
|
||||
JSL.l GetSpriteID
|
||||
JSL.l GetAnimatedSpriteTile_variable
|
||||
|
||||
SEP #$30
|
||||
PLX
|
||||
PLY : PLX
|
||||
LDA.w DynamicDropQueue,Y : PHA ; we want A to return the loot id
|
||||
LDA.w SprItemGFX,X : STA.w DynamicDropQueue,Y
|
||||
PLA
|
||||
|
||||
.success
|
||||
STZ.w !SPRITE_REDRAW, X
|
||||
.return
|
||||
PLY : PLX
|
||||
RTL
|
||||
|
||||
|
||||
;===================================================================================================
|
||||
|
||||
TransferPotGFX:
|
||||
SEP #$10
|
||||
REP #$20
|
||||
LDX.w DynamicDropRequest
|
||||
LDA.w DynamicDropRequest : AND.w #$00FF
|
||||
BEQ .no
|
||||
|
||||
STZ.w DynamicDropRequest
|
||||
.next
|
||||
LDY.b #$00
|
||||
- INY : LSR : BCC -
|
||||
|
||||
LDA.w DynamicDropGFXIndex
|
||||
PHY
|
||||
LDA.w #$0000
|
||||
- ROL : DEY : BNE -
|
||||
PLY
|
||||
DEY ; y = slot index, a = request bit flag
|
||||
|
||||
EOR.w DynamicDropRequest : STA.w DynamicDropRequest
|
||||
|
||||
LDA.w DynamicDropQueue,Y
|
||||
ASL
|
||||
TAX
|
||||
LDA.l FreeUWGraphics,X
|
||||
STA.w $2116
|
||||
LDA.b $1B : AND.w #$00FF : BEQ +
|
||||
LDA.l FreeUWGraphics,X
|
||||
BRA ++
|
||||
+ LDA.l FreeOWGraphics,X
|
||||
++ STA.w $2116
|
||||
|
||||
; calculate bottom row now
|
||||
CLC : ADC.w #$0200>>1 : PHA
|
||||
|
||||
LDX.b #$7E : STX.w $4314
|
||||
LDA.w #DynamicDropGFX : STA.w $4302
|
||||
LDA.w #DynamicDropGFX
|
||||
CPY.b #$00 : BEQ +
|
||||
- CLC : ADC.w #$0080 : DEY : BNE -
|
||||
+ STA.w $4302
|
||||
|
||||
LDX.b #$80 : STX.w $2115
|
||||
LDA.w #$1801 : STA.w $4300
|
||||
@@ -86,6 +226,9 @@ TransferPotGFX:
|
||||
STA.w $2116
|
||||
STY.w $420B
|
||||
|
||||
LDA.w DynamicDropRequest : AND.w #$00FF
|
||||
BNE .next
|
||||
|
||||
.no
|
||||
RTL
|
||||
|
||||
@@ -94,60 +237,133 @@ FreeUWGraphics:
|
||||
dw $8800>>1
|
||||
dw $8840>>1
|
||||
dw $8980>>1
|
||||
dw $9CA0>>1
|
||||
dw $9DC0>>1
|
||||
|
||||
; dw $8800>>1
|
||||
; dw $8840>>1
|
||||
; dw $8980>>1
|
||||
; dw $9960>>1 # Arghuss Splash apparently
|
||||
; dw $9C00>>1
|
||||
dw $9960>>1 ; Arghuss Splash apparently
|
||||
dw $9C00>>1
|
||||
; dw $9CA0>>1
|
||||
; dw $9DC0>>1
|
||||
dw $9DC0>>1
|
||||
; add new slots above this line
|
||||
.end
|
||||
dw $0000 ; overflow slot, intentionally blank
|
||||
dw $9CE0>>1 ; Triforce
|
||||
; above this line, add slots that we want to draw to specific slots
|
||||
|
||||
FreeOWGraphics:
|
||||
dw $8180>>1 ; Push Block
|
||||
;dw $8800>>1 ; Shovel Dirt
|
||||
dw $9960>>1 ; Arghuss/Zora Splash
|
||||
dw $9C00>>1 ; Heart Piece
|
||||
;dw $9CA0>>1 ; Apple
|
||||
;dw $9DC0>>1 ; Whirlpool
|
||||
; add new slots above this line
|
||||
.end
|
||||
dw $0000 ; overflow slot, intentionally blank
|
||||
dw $9CE0>>1 ; Triforce
|
||||
; above this line, add slots that we want to draw to specific slots
|
||||
|
||||
;===================================================================================================
|
||||
|
||||
DrawPotItem:
|
||||
; Come in with
|
||||
; A = item receipt ID
|
||||
; X = sprite slot
|
||||
; Returns with Carry flag set if gfx drawing was skipped
|
||||
DrawSlottedTile:
|
||||
PHA
|
||||
; TODO: allow drawing if gfx are not using a VRAM slot that changes during medallion
|
||||
LDA.b $5D : CMP.b #$08 : BCC + : CMP.b #$0A+1 : BCS + ; skip if we're mid-medallion
|
||||
PLA : SEC : RTL
|
||||
+
|
||||
PLA
|
||||
STA.b $07 ; store loot ID temporarily, will get overwritten in Sprite_DrawMultiple_quantity_preset call
|
||||
JSL.l IsNarrowSprite : BCS .narrow
|
||||
|
||||
; TODO: Instead of loading the whole fixed 16 bytes from DynamicOAMTile**_** into !SPRITE_DYNAMIC_OAM
|
||||
; Do something more like how DrawDynamicTile does it
|
||||
; Then we won't need all the separate DynamicOAMTile**_** tables
|
||||
.full
|
||||
LDA.b #$01 : STA $06
|
||||
LDA #$0C : JSL.l OAM_AllocateFromRegionC
|
||||
LDA #$02 : PHA
|
||||
REP #$20
|
||||
LDA.w #DynamicOAMTile_full
|
||||
BRA .draw
|
||||
LDA.b $1B : AND.w #$00FF : BEQ +
|
||||
LDA.w #DynamicOAMTileUW_full
|
||||
BRA .transfer
|
||||
+ LDA.w #DynamicOAMTileOW_full
|
||||
BRA .transfer
|
||||
|
||||
.narrow
|
||||
LDA.b #$02 : STA $06
|
||||
LDA #$10 : JSL.l OAM_AllocateFromRegionC
|
||||
LDA #$03 : PHA
|
||||
REP #$20
|
||||
LDA.w #DynamicOAMTile_thin
|
||||
.draw
|
||||
PHB : PHK : PLB
|
||||
|
||||
REP #$20
|
||||
LDA.b $1B : AND.w #$00FF : BEQ +
|
||||
LDA.w #DynamicOAMTileUW_thin
|
||||
BRA .transfer
|
||||
+ LDA.w #DynamicOAMTileOW_thin
|
||||
.transfer
|
||||
STA.b $08
|
||||
LDA.w SprItemGFX,X
|
||||
AND.w #$00FF
|
||||
ASL : ASL : ASL : ASL
|
||||
ADC.b $08
|
||||
STA.b $08
|
||||
SEP #$20
|
||||
STZ.b $07
|
||||
PHK : PLY : STY.b $0A
|
||||
LDY #$7E : PHB : PHY : PLB
|
||||
|
||||
LDA.b #$00 : STA.l !SKIP_EOR
|
||||
JSL Sprite_DrawMultiple_quantity_preset
|
||||
; transfer fixed table data into WRAM
|
||||
LDY.b #$0E
|
||||
- LDA.b [$08],Y : STA.w !SPRITE_DYNAMIC_OAM,Y
|
||||
DEY : DEY : BPL -
|
||||
|
||||
LDA.b $90 : CLC : ADC.b #$08 : STA.b $90
|
||||
INC.b $92
|
||||
INC.b $92
|
||||
LDA.w SprItemFlags, X : AND.w #$00FF : BNE .draw
|
||||
LDA.b $06 : LSR : BCC +
|
||||
; full
|
||||
LDA.w #$0000
|
||||
STA.w !SPRITE_DYNAMIC_OAM : STA.w !SPRITE_DYNAMIC_OAM+2
|
||||
BRA .draw
|
||||
+ ; narrow
|
||||
LDA.w $0E20, X : AND.w #$00FF : CMP.w #$003B : BEQ .draw ; bonk item
|
||||
LDA.b $A0 : CMP.w #$0120 : BNE +
|
||||
LDA.b $1B : BNE .draw ; good bee statue
|
||||
+
|
||||
; TODO: Figure out how to target bottle vendor fish item better than this
|
||||
LDA.b $8A : AND.w #$00FF : CMP.w #$0018 : BNE +
|
||||
LDA.b $1B : BEQ .draw ; bottle vendor key
|
||||
+
|
||||
LDA.w #$0004
|
||||
STA.w !SPRITE_DYNAMIC_OAM : STA.w !SPRITE_DYNAMIC_OAM+8
|
||||
|
||||
.draw
|
||||
; special handling
|
||||
LDY.b $07 : CPY.b #$B2 : BNE + ; fairy
|
||||
LDA.b $1A : AND.w #$0020 : BEQ ++ ; alternate every 32 frames
|
||||
LDA.w !SPRITE_DYNAMIC_OAM+4 : CLC : ADC.w #$02 ; use other fairy GFX
|
||||
STA.w !SPRITE_DYNAMIC_OAM+4
|
||||
++ LDA.b $1A : SEC : SBC.w #$10 : AND.w #$0020 : BEQ + ; alternate every 32 frames
|
||||
LDA.w !SPRITE_DYNAMIC_OAM+2 : SEC : SBC.w #$02 ; move fairy up 2 pixels
|
||||
STA.w !SPRITE_DYNAMIC_OAM+2
|
||||
+ CPY.b #$B5 : BNE + ; good bee
|
||||
LDA.b $1A : AND.w #$0020 : BEQ ++ ; alternate every 32 frames
|
||||
LDA.w !SPRITE_DYNAMIC_OAM+12 : SEC : SBC.w #$10 ; use other fairy GFX
|
||||
STA.w !SPRITE_DYNAMIC_OAM+12
|
||||
++ LDA.b $1A : SEC : SBC.w #$10 : AND.w #$0020 : BEQ + ; alternate every 32 frames
|
||||
LDA.w !SPRITE_DYNAMIC_OAM+10 : SEC : SBC.w #$02 ; move fairy up 2 pixels
|
||||
STA.w !SPRITE_DYNAMIC_OAM+10
|
||||
+
|
||||
|
||||
LDA.w #!SPRITE_DYNAMIC_OAM : STA.b $08
|
||||
SEP #$20
|
||||
STZ.b $07
|
||||
LDA.b #$00 : STA.l !SKIP_EOR
|
||||
JSL Sprite_DrawMultiple_quantity_preset
|
||||
PLB
|
||||
|
||||
LDA.b $90 : CLC : ADC.b #$08 : STA.b $90
|
||||
INC.b $92 : INC.b $92
|
||||
|
||||
PLA
|
||||
CLC
|
||||
RTL
|
||||
|
||||
DynamicOAMTile_thin:
|
||||
DynamicOAMTileUW_thin:
|
||||
dw 0, 0 : db $40, $00, $20, $00
|
||||
dw 0, 8 : db $50, $00, $20, $00
|
||||
|
||||
@@ -157,13 +373,32 @@ DynamicOAMTile_thin:
|
||||
dw 0, 0 : db $4C, $00, $20, $00
|
||||
dw 0, 8 : db $5C, $00, $20, $00
|
||||
|
||||
dw 0, 0 : db $E5, $00, $20, $00
|
||||
dw 0, 8 : db $F5, $00, $20, $00
|
||||
dw 0, 0 : db $CB, $00, $20, $00
|
||||
dw 0, 8 : db $DB, $00, $20, $00
|
||||
|
||||
dw 0, 0 : db $E0, $00, $20, $00
|
||||
dw 0, 8 : db $F0, $00, $20, $00
|
||||
|
||||
dw 0, 0 : db $EE, $00, $20, $00
|
||||
dw 0, 8 : db $FE, $00, $20, $00
|
||||
|
||||
DynamicOAMTile_full:
|
||||
; add new slots above this line
|
||||
|
||||
dw 0, 0 : db $E3, $00, $20, $00 ; overflow slot
|
||||
dw 0, 8 : db $F3, $00, $20, $00
|
||||
|
||||
; above this line, add slots that we want to draw to specific slots
|
||||
|
||||
dw 0, 0 : db $0B, $00, $20, $00 ; animated rupees slot
|
||||
dw 0, 8 : db $1B, $00, $20, $00
|
||||
|
||||
dw 0, 0 : db $6B, $00, $20, $00 ; key
|
||||
dw 0, 8 : db $7B, $00, $20, $00
|
||||
|
||||
dw 0, 0 : db $7C, $00, $20, $00 ; good bee
|
||||
dw 0, 8 : db $F4, $00, $20, $00
|
||||
|
||||
DynamicOAMTileUW_full:
|
||||
dw -4, -1 : db $40, $00, $20, $02
|
||||
dd 0, 0
|
||||
|
||||
@@ -173,8 +408,113 @@ DynamicOAMTile_full:
|
||||
dw -4, -1 : db $4C, $00, $20, $02
|
||||
dd 0, 0
|
||||
|
||||
dw -4, -1 : db $E5, $00, $20, $02
|
||||
dw -4, -1 : db $CB, $00, $20, $02
|
||||
dd 0, 0
|
||||
|
||||
dw -4, -1 : db $E0, $00, $20, $02
|
||||
dd 0, 0
|
||||
|
||||
dw -4, -1 : db $EE, $00, $20, $02
|
||||
dd 0, 0
|
||||
dd 0, 0
|
||||
|
||||
; add new rotating slots above this line
|
||||
|
||||
dw -4, -1 : db $A0, $00, $20, $02 ; overflow slot
|
||||
dd 0, 0
|
||||
|
||||
dw -4, -1 : db $E7, $00, $20, $02 ; triforce
|
||||
dd 0, 0
|
||||
|
||||
; above this line, add slots that we want to draw to specific slots
|
||||
|
||||
dw -4, -1 : db $EA, $00, $20, $02 ; fairy
|
||||
dd 0, 0
|
||||
|
||||
dw -4, -1 : db $E5, $00, $20, $02 ; apple
|
||||
dd 0, 0
|
||||
|
||||
DynamicOAMTileOW_thin:
|
||||
dw 0, 0 : db $0C, $00, $20, $00
|
||||
dw 0, 8 : db $1C, $00, $20, $00
|
||||
|
||||
; dw 0, 0 : db $40, $00, $20, $00
|
||||
; dw 0, 8 : db $50, $00, $20, $00
|
||||
|
||||
dw 0, 0 : db $CB, $00, $20, $00
|
||||
dw 0, 8 : db $DB, $00, $20, $00
|
||||
|
||||
dw 0, 0 : db $E0, $00, $20, $00
|
||||
dw 0, 8 : db $F0, $00, $20, $00
|
||||
|
||||
;dw 0, 0 : db $E5, $00, $20, $00
|
||||
;dw 0, 8 : db $F5, $00, $20, $00
|
||||
|
||||
;dw 0, 0 : db $EE, $00, $20, $00
|
||||
;dw 0, 8 : db $FE, $00, $20, $00
|
||||
|
||||
; add new slots above this line
|
||||
|
||||
dw 0, 0 : db $E3, $00, $20, $00 ; overflow slot
|
||||
dw 0, 8 : db $F3, $00, $20, $00
|
||||
|
||||
; above this line, add slots that we want to draw to specific slots
|
||||
|
||||
dw 0, 0 : db $0B, $00, $20, $00 ; animated rupees slot
|
||||
dw 0, 8 : db $1B, $00, $20, $00
|
||||
|
||||
dw 0, 0 : db $6B, $00, $20, $00 ; key
|
||||
dw 0, 8 : db $7B, $00, $20, $00
|
||||
|
||||
dw 0, 0 : db $7C, $00, $20, $00 ; good bee
|
||||
dw 0, 8 : db $F4, $00, $20, $00
|
||||
|
||||
DynamicOAMTileOW_full:
|
||||
dw 0, 0 : db $0C, $00, $20, $02
|
||||
dd 0, 0
|
||||
|
||||
; dw 0, 0 : db $40, $00, $20, $02
|
||||
; dd 0, 0
|
||||
|
||||
dw 0, 0 : db $CB, $00, $20, $02
|
||||
dd 0, 0
|
||||
|
||||
dw 0, 0 : db $E0, $00, $20, $02
|
||||
dd 0, 0
|
||||
|
||||
;dw 0, 0 : db $E5, $00, $20, $02
|
||||
;dd 0, 0
|
||||
|
||||
;dw 0, 0 : db $EE, $00, $20, $02
|
||||
;dd 0, 0
|
||||
|
||||
; add new slots above this line
|
||||
|
||||
dw 0, 0 : db $A0, $00, $20, $02 ; overflow slot
|
||||
dd 0, 0
|
||||
|
||||
dw 0, 0 : db $E7, $00, $20, $02 ; triforce
|
||||
dd 0, 0
|
||||
|
||||
; above this line, add slots that we want to draw to specific slots
|
||||
|
||||
dw 0, 0 : db $EA, $00, $20, $02 ; fairy
|
||||
dd 0, 0
|
||||
|
||||
dw 0, 0 : db $E5, $00, $20, $02 ; apple
|
||||
dd 0, 0
|
||||
|
||||
ConditionalPushBlockTransfer:
|
||||
LDA.b $1B : BNE +
|
||||
LDA.b #$0F ; don't transfer push block when on the OW
|
||||
BRA .return-3
|
||||
+
|
||||
LDA.b #$1F : STA.w $420B ; what we wrote over
|
||||
.return
|
||||
RTL
|
||||
|
||||
pushpc
|
||||
; fix Arghuss/Zora splash graphics
|
||||
org $068595
|
||||
db $E7, $E7, $E7, $E7, $E7, $C0, $C0
|
||||
pullpc
|
||||
|
||||
|
||||
@@ -9,6 +9,10 @@ org $829C25
|
||||
org $89C2BB
|
||||
JSL ClearSpriteData
|
||||
|
||||
; underworld -> overworld transition
|
||||
org $8282D1
|
||||
JSL ClearSpriteData2
|
||||
|
||||
org $89C327
|
||||
JSL LoadSpriteData
|
||||
|
||||
@@ -71,6 +75,8 @@ org $868283
|
||||
Sprite_SpawnSecret_NotRandomBush:
|
||||
org $86828A
|
||||
Sprite_SpawnSecret_SpriteSpawnDynamically:
|
||||
org $8682A5
|
||||
Sprite_SpawnSecret_SetCoords:
|
||||
org $86d23a
|
||||
Sprite_DrawAbsorbable:
|
||||
org $9eff81
|
||||
@@ -254,6 +260,12 @@ SaveMajorItemDrop:
|
||||
LDA.w #$0018 : BRA .substitute
|
||||
+ CPY.w #$0031 : BNE + ; 10 pack bombs
|
||||
LDA.w #$0019 : BRA .substitute
|
||||
+ CPY.w #$00B1 : BNE + ; Apples
|
||||
LDA.w #$001A : BRA .substitute
|
||||
+ CPY.w #$00B0 : BNE + ; Bee Trap
|
||||
LDA.w #$001B : BRA .substitute
|
||||
+ CPY.w #$00B5 : BNE + ; Good Bee
|
||||
LDA.w #$001C : BRA .substitute
|
||||
+ STA $0B9C ; indicates we should use the key routines or a substitute
|
||||
RTL
|
||||
.substitute
|
||||
@@ -303,6 +315,7 @@ RTS
|
||||
|
||||
ClearSpriteData:
|
||||
STZ.b $02 : STZ.b $03 ; what we overrode
|
||||
.shared:
|
||||
PHX
|
||||
LDA #$00 : LDX #$00
|
||||
.loop
|
||||
@@ -312,6 +325,10 @@ ClearSpriteData:
|
||||
PLX
|
||||
RTL
|
||||
|
||||
ClearSpriteData2:
|
||||
LDA.b #$82 : STA.b $99
|
||||
JMP ClearSpriteData_shared
|
||||
|
||||
; Runs during sprite load of the room
|
||||
LoadSpriteData:
|
||||
INY : INY
|
||||
@@ -353,7 +370,7 @@ RevealSpriteDrop:
|
||||
LDY.w $0CBA, X : BEQ .no_forced_drop
|
||||
RTL
|
||||
.no_forced_drop
|
||||
PLA : PLA ; remove the JSL reswamturn lower 16 bits
|
||||
PLA : PLA ; remove the JSL return lower 16 bits
|
||||
PEA.w $06F996-1 ; change return address to .no_forced_drop of (Sprite_DoTheDeath)
|
||||
RTL
|
||||
|
||||
@@ -364,7 +381,7 @@ RevealSpriteDrop2:
|
||||
LDY.w $0CBA, X : BEQ .no_forced_drop
|
||||
RTL
|
||||
.no_forced_drop
|
||||
PLA : PLA ; remove the JSL reswamturn lower 16 bits
|
||||
PLA : PLA ; remove the JSL return lower 16 bits
|
||||
PEA.w $06E3CE-1 ; change return address to .no_forced_drop of (Sprite_DoTheDeath)
|
||||
RTL
|
||||
|
||||
@@ -372,7 +389,7 @@ BitFieldMasks:
|
||||
dw $8000, $4000, $2000, $1000, $0800, $0400, $0200, $0100
|
||||
dw $0080, $0040, $0020, $0010, $0008, $0004, $0002, $0001
|
||||
|
||||
; Runs during Sprite_E4_SmallKey and duning Sprite_E5_BigKey spawns
|
||||
; Runs during Sprite_E4_SmallKey and during Sprite_E5_BigKey spawns
|
||||
ShouldSpawnItem:
|
||||
LDA $048E : CMP.b #$87 : BNE + ; check for hera basement cage
|
||||
LDA $A8 : AND.b #$03 : CMP.b #$02 : BNE + ; we're not in that quadrant
|
||||
@@ -427,53 +444,59 @@ SpriteKeyPrep:
|
||||
LDA.w SpawnedItemMWPlayer : STA SprItemMWPlayer, X
|
||||
LDA.w SpawnedItemFlag : STA SprItemFlags, X : BEQ +
|
||||
LDA.l SpawnedItemID : STA $0E80, X
|
||||
PHA
|
||||
JSL.l GetSpritePalette : STA $0F50, X ; setup the palette
|
||||
PLA
|
||||
CMP #$24 : BNE ++ ;
|
||||
JSL.l GetSpritePalette : STA.w $0F50, X ; setup the palette
|
||||
LDA $A0 : CMP.b #$80 : BNE +
|
||||
LDA SpawnedItemFlag : BNE +
|
||||
LDA #$24 ; it's the big key drop?
|
||||
++ JSL RequestStandingItemVRAMSlot
|
||||
++ JSL RequestSlottedTile
|
||||
+ PLA
|
||||
RTL
|
||||
|
||||
SpriteKeyDrawGFX:
|
||||
JSL Sprite_DrawRippleIfInWater
|
||||
PHA
|
||||
LDA $0E80, X
|
||||
CMP.b #$24 : BNE +
|
||||
LDA $A0 : CMP #$80 : BNE ++
|
||||
LDA SpawnedItemFlag : BNE ++
|
||||
LDA #$24 : BRA +
|
||||
++ PLA
|
||||
PHK : PEA.w .jslrtsreturn-1
|
||||
PEA.w $068014 ; an rtl address - 1 in Bank06
|
||||
JML Sprite_DrawAbsorbable
|
||||
.jslrtsreturn
|
||||
RTL
|
||||
+ JSL DrawPotItem
|
||||
CMP #$03 : BNE +
|
||||
PHA : LDA $0E60, X : ORA.b #$20 : STA $0E60, X : PLA
|
||||
+ JSL.l Sprite_DrawShadowLong
|
||||
PLA : RTL
|
||||
JSL Sprite_DrawRippleIfInWater
|
||||
PHA
|
||||
LDA.w !SPRITE_REDRAW, X : BEQ +
|
||||
LDA $0E80, X
|
||||
JSL RequestSlottedTile
|
||||
LDA.w !SPRITE_REDRAW, X : CMP.b #$02 : BEQ +
|
||||
BRA .skipDraw
|
||||
+ LDA $0E80, X
|
||||
CMP.b #$24 : BNE +
|
||||
LDA $A0 : CMP #$80 : BNE ++
|
||||
LDA SpawnedItemFlag : BNE ++
|
||||
LDA #$24 : BRA +
|
||||
++ PLA
|
||||
PHK : PEA.w .jslrtsreturn-1
|
||||
PEA.w $068014 ; an rtl address - 1 in Bank06
|
||||
JML Sprite_DrawAbsorbable
|
||||
.jslrtsreturn
|
||||
RTL
|
||||
+ JSL DrawSlottedTile : BCS .skipDraw
|
||||
; draw shadow
|
||||
CMP #$03 : BNE +
|
||||
PHA : LDA $0E60, X : ORA.b #$20 : STA $0E60, X : PLA
|
||||
+ JSL.l Sprite_DrawShadowLong
|
||||
.skipDraw
|
||||
PLA
|
||||
RTL
|
||||
|
||||
KeyGet:
|
||||
LDA CurrentSmallKeys ; what we wrote over
|
||||
PHA
|
||||
LDA.l StandingItemsOn : BNE +
|
||||
PLA : RTL
|
||||
+ LDY $0E80, X
|
||||
LDA SprItemIndex, X : STA SpawnedItemIndex
|
||||
LDA SprItemFlags, X : STA SpawnedItemFlag
|
||||
LDA $A0 : CMP #$87 : BNE + ;check for hera cage
|
||||
LDA SpawnedItemFlag : BNE + ; if it came from a pot, it's fine
|
||||
JSR ShouldKeyBeCountedForDungeon : BCC ++
|
||||
LDA CurrentSmallKeys ; what we wrote over
|
||||
PHA
|
||||
LDA.l StandingItemsOn : BNE +
|
||||
PLA : RTL
|
||||
+ LDY $0E80, X
|
||||
LDA SprItemIndex, X : STA SpawnedItemIndex
|
||||
LDA SprItemFlags, X : STA SpawnedItemFlag
|
||||
LDA $A0 : CMP #$87 : BNE + ;check for hera cage
|
||||
LDA SpawnedItemFlag : BNE + ; if it came from a pot, it's fine
|
||||
JSR ShouldKeyBeCountedForDungeon : BCC ++
|
||||
JSL CountChestKeyLong
|
||||
++ PLA : RTL
|
||||
+ STY $00
|
||||
LDA SprItemMWPlayer, X : STA !MULTIWORLD_ITEM_PLAYER_ID : BNE .receive
|
||||
PHX
|
||||
++ PLA : RTL
|
||||
+ STY $00
|
||||
LDA SprItemMWPlayer, X : STA !MULTIWORLD_ITEM_PLAYER_ID : BNE .receive
|
||||
PHX
|
||||
LDA $040C : CMP #$FF : BNE +
|
||||
LDA $00 : CMP.b #$AF : BNE .skip
|
||||
LDA CurrentGenericKeys : INC : STA CurrentGenericKeys
|
||||
@@ -486,10 +509,10 @@ KeyGet:
|
||||
++ PLX : PLA : RTL
|
||||
+ CMP.b #$AF : beq .countIt ; universal key
|
||||
CMP.b #$24 : beq .countIt ; small key for this dungeon
|
||||
.skip PLX
|
||||
.receive
|
||||
JSL $0791b3 ; Player_HaltDashAttackLong
|
||||
JSL.l Link_ReceiveItem
|
||||
.skip PLX
|
||||
.receive
|
||||
JSL $0791b3 ; Player_HaltDashAttackLong
|
||||
JSL.l Link_ReceiveItem
|
||||
PLA : DEC : RTL
|
||||
|
||||
KeyTable:
|
||||
@@ -540,7 +563,10 @@ SubstitionTable:
|
||||
db $DB ; RED RUPEE - 0x16
|
||||
db $E2 ; ARROW REFILL 10 - 0x17
|
||||
db $DD ; BOMB REFILL 4 - 0x18
|
||||
db $DE ; BOMB REFILL 8 - 0x19
|
||||
db $DE ; BOMB REFILL 8 - 0x19
|
||||
db $AC ; APPLES - 0x1A
|
||||
db $79 ; BEE TRAP - 0x1B
|
||||
db $79 ; GOOD BEE - 0x1C
|
||||
|
||||
|
||||
SubstituteSpriteId:
|
||||
@@ -558,6 +584,22 @@ RTS
|
||||
|
||||
CheckSprite_Spawn:
|
||||
JSR SubstituteSpriteId
|
||||
CPY.b #$1C : BNE + ; good bee handling
|
||||
JSL Sprite_SpawnDynamically
|
||||
BMI .check
|
||||
PHX
|
||||
TYX : JSL.l Sprite_LoadProperties
|
||||
PLX
|
||||
JSL.l GoldBee_SpawnSelf_SetProperties
|
||||
PLA : PLA : PLA ; pop the return address
|
||||
PHX : LDX.b #$03
|
||||
JML Sprite_SpawnSecret_SetCoords
|
||||
+ CPY.b #$1A : BCC + ; all other non-normal pot sprite spawns
|
||||
JSL Sprite_SpawnDynamically
|
||||
BMI .check
|
||||
LDA.b #$10 : STA.b $0D ; lets the outside code treat this sprite like a Stal (most normal table values)
|
||||
RTL
|
||||
+
|
||||
JSL Sprite_SpawnDynamically
|
||||
BMI .check
|
||||
RTL
|
||||
@@ -609,6 +651,32 @@ SetTheSceneFix:
|
||||
JSL LoadCommonSprites_long
|
||||
RTL
|
||||
|
||||
pushpc
|
||||
org $868072
|
||||
JSL SetBottleVendorKey : NOP #4
|
||||
pullpc
|
||||
SetBottleVendorKey:
|
||||
LDA.w $0E20,Y : CMP.b #$E4 : BNE +
|
||||
; small key from bottle vendor
|
||||
LDA.b #$AF : STA.w $0E80,Y
|
||||
LDA.b #$01 : STA.w !SPRITE_REDRAW, Y
|
||||
BRA .shift
|
||||
+ CMP.b #$DE : BEQ .return
|
||||
CMP.b #$E2 : BEQ .return
|
||||
; shift narrow sprite to left by 4
|
||||
.shift
|
||||
LDA.b $00 : CLC : ADC.b #$04 : STA.w $0D10,Y ; what we wrote over
|
||||
.return
|
||||
RTL
|
||||
|
||||
ConditionalLoadCommonSprites_Do3To4Low:
|
||||
LDA.b $10 : CMP.b #$01 : BEQ + ; what we wrote over
|
||||
CMP.b #$0E : BEQ ++
|
||||
JML LoadCommonSprites_Prep3To4Low
|
||||
+ JML LoadCommonSprites_in_file_select
|
||||
++ LDA.b #$50 : STA.w $2117 ; skip over some DMA bytes
|
||||
JML Sound_LoadLightWorldSongBank-1 ; just some RTS in Bank 00
|
||||
|
||||
incsrc dynamic_si_vram.asm
|
||||
|
||||
;===================================================================================================
|
||||
|
||||
33
msu.asm
33
msu.asm
@@ -244,9 +244,10 @@ CheckMusicLoadRequest:
|
||||
CMP.b #16 : BEQ .castle
|
||||
CMP.b #17 : BEQ .dungeon
|
||||
CMP.b #22 : BEQ .dungeon
|
||||
CMP.b #21 : BNE .check_fallback
|
||||
CMP.b #21 : BEQ .boss
|
||||
JMP .check_fallback
|
||||
|
||||
;.boss
|
||||
.boss
|
||||
LDA $040C : LSR : !ADD.b #45
|
||||
BRA .check_fallback-3
|
||||
.no_change
|
||||
@@ -269,7 +270,7 @@ CheckMusicLoadRequest:
|
||||
LDA ProgressIndicator : CMP.b #03 : BNE .no_change ; aga1 killed
|
||||
BRA -
|
||||
.darkwoods
|
||||
LDA.b #15 : PHA
|
||||
PHA
|
||||
LDX $8A : LDA.l OWTileWorldAssoc,X : BEQ +
|
||||
PLA : BRA .darkworld
|
||||
+ PLA : BRA .lightworld
|
||||
@@ -277,7 +278,13 @@ CheckMusicLoadRequest:
|
||||
LDA $040C
|
||||
CMP.b #$08 : BNE .check_fallback ; Hyrule Castle 2
|
||||
.dungeon
|
||||
LDA $040C : LSR : !ADD.b #33 : STA !REG_MUSIC_CONTROL_REQUEST
|
||||
LDA $040C : CMP.b #$1A : BNE +
|
||||
PHA : LDA.l DRMode : BEQ ++
|
||||
LDA.w BigKeyField : AND.b #$04 : BEQ ++
|
||||
; if door rando and entering GT with BK
|
||||
PLA : LDA.b #59 : BRA .check_fallback-3
|
||||
++ PLA
|
||||
+ LSR : !ADD.b #33 : STA !REG_MUSIC_CONTROL_REQUEST
|
||||
|
||||
.check_fallback
|
||||
LDX !REG_MUSIC_CONTROL_REQUEST
|
||||
@@ -376,8 +383,15 @@ CheckMusicLoadRequest:
|
||||
; Fade out music if we're changing tracks on a stair transition
|
||||
;--------------------------------------------------------------------------------
|
||||
SpiralStairsPreCheck:
|
||||
REP #$20 ; thing we wrote over
|
||||
LDA.l DRMode : BNE .done ; exit if door rando enabled
|
||||
LDA.l DRMode : BEQ + ; if door rando enabled
|
||||
JSL LookupSpiralOffset_long
|
||||
REP #$30 : AND.w #$00FF : ASL #2 : TAX
|
||||
LDA.l SpiralTable,X
|
||||
SEP #$10 : TAX : CPX.b #$07 : BNE .done ; check if hera boss
|
||||
JSL CheckHeraBossDefeated : BCS .done
|
||||
LDX.b #$F1 : STX !REG_MUSIC_CONTROL_REQUEST
|
||||
BRA .done
|
||||
+ REP #$20 ; thing we wrote over
|
||||
LDA $A0
|
||||
CMP.w #$000C : BNE +
|
||||
LDA !REG_CURRENT_MSU_TRACK : AND.w #$00FF : CMP.w #59 : BNE .done
|
||||
@@ -407,8 +421,11 @@ SpiralStairsPreCheck:
|
||||
; Change music on stair transition (ToH/GT)
|
||||
;--------------------------------------------------------------------------------
|
||||
SpiralStairsPostCheck:
|
||||
LDA.l DRMode : BNE .done ; exit if door rando enabled
|
||||
LDA $A0
|
||||
LDA.l DRMode : BEQ + ; if door rando enabled
|
||||
LDA.b $A2 : CMP.w #$0007 : BNE .done
|
||||
LDA.l Music_Hera : TAX : STX !REG_MUSIC_CONTROL_REQUEST
|
||||
BRA .done
|
||||
+ LDA $A0
|
||||
CMP.w #$000C : BNE +
|
||||
; Ganon's tower entrance
|
||||
LDX $0130 : CPX.b #$F1 : BNE .done ; Check that we were fading out
|
||||
|
||||
@@ -240,7 +240,10 @@ Multiworld_MasterSword_GrantToPlayer:
|
||||
LDA PedestalSword_Player : STA !MULTIWORLD_ITEM_PLAYER_ID
|
||||
PLP : PLA
|
||||
|
||||
JSL Link_ReceiveItem ; thing we wrote over
|
||||
CPY.b #$6A : BEQ +
|
||||
JSL Link_ReceiveItem ; thing we wrote over
|
||||
RTL
|
||||
+ JSL ActivateGoal
|
||||
RTL
|
||||
}
|
||||
|
||||
|
||||
11
music.asm
11
music.asm
@@ -110,7 +110,7 @@ Overworld_DetermineMusic:
|
||||
LDX.b #$05 ; lost woods theme
|
||||
BRA .bunny
|
||||
|
||||
+ LDA $8A : CMP.b #$40 : BNE +
|
||||
+ CMP.b #$40 : BNE .bunny
|
||||
LDX #$0F ; dark woods theme
|
||||
BRA .bunny
|
||||
|
||||
@@ -210,6 +210,13 @@ Underworld_DoorDown_Entry:
|
||||
;
|
||||
; A=16bit XY=8bit
|
||||
CheckHeraBossDefeated:
|
||||
LDA RoomDataWRAM[$08].high : AND.w #$00FF : BEQ +
|
||||
LDA RoomDataWRAM[$07].high : AND.w #$00FF : BEQ +
|
||||
SEC : RTL
|
||||
+ CLC : RTL
|
||||
|
||||
FallingMusicFadeOut:
|
||||
CMP.w #$0017 ; what we wrote over
|
||||
BNE .return
|
||||
LDA.w $0130 : AND.w #$00FF : CMP.w #$0015 ; if boss music is playing, then fade out
|
||||
.return
|
||||
RTL
|
||||
|
||||
@@ -7,7 +7,7 @@ NewDrawHud:
|
||||
|
||||
LDA InfiniteBombsModifier : BNE .infinite_bombs
|
||||
.finite_bombs
|
||||
LDA.l SpecialWeapons : CMP #$01 : BNE .normal
|
||||
LDA.l SpecialWeapons : AND.b #$7F : CMP #$01 : BNE .normal
|
||||
LDA.l SpecialWeaponLevel : BEQ .no_bombs
|
||||
.normal
|
||||
LDA.l BombsEquipment ; bombs
|
||||
@@ -94,7 +94,7 @@ NewDrawHud:
|
||||
;================================================================================
|
||||
; Draw Dungeon Compass Counts
|
||||
;================================================================================
|
||||
LDA.l CompassMode : AND #$003F : BEQ + ; skip if CompassMode is 0.
|
||||
LDA.l CompassMode : AND #$000F : BEQ + ; skip if CompassMode is 0.
|
||||
JSL.l DrawDungeonCompassCounts ; compasses.asm
|
||||
+
|
||||
|
||||
|
||||
137
newitems.asm
137
newitems.asm
@@ -44,9 +44,10 @@
|
||||
; #$B2 - Fairy
|
||||
; #$B3 - Chicken
|
||||
; #$B4 - Big Magic
|
||||
; #$B5 - 5 Arrows
|
||||
; #$B6 - Progressive Bomb
|
||||
; #$B7 - Progressive Cane
|
||||
; #$B5 - Good Bee
|
||||
; #$C0 - Progressive Bomb
|
||||
; #$C1 - Progressive Cane
|
||||
; #$C2 - Progressive Bug Net
|
||||
; #$FE - Server Request (Asychronous Chest)
|
||||
; #$FF - Null Chest
|
||||
;--------------------------------------------------------------------------------
|
||||
@@ -85,6 +86,12 @@ GetAnimatedSpriteGfxFile:
|
||||
CMP.b #$48 : BNE +
|
||||
LDY.b #$60 : JML GetAnimatedSpriteGfxFile_return
|
||||
+
|
||||
CMP.b #$4B : BNE +
|
||||
LDY.b #$50 : JML GetAnimatedSpriteGfxFile_return
|
||||
+
|
||||
CMP.b #$4C : BNE +
|
||||
LDY.b #$5E : JML GetAnimatedSpriteGfxFile_return
|
||||
+
|
||||
|
||||
CMP.b #$24 : !BGE +
|
||||
LDY.b #$5B : JML GetAnimatedSpriteGfxFile_return
|
||||
@@ -124,6 +131,9 @@ dw $09F0 ; Null-Item
|
||||
dw $09C0 ; Clock
|
||||
dw $0A20 ; Triforce
|
||||
dw $0A50 ; Power Star
|
||||
dw $09F0 ; Chicken
|
||||
dw $09C0 ; Fairy ($09F0 if using uncompressed version)
|
||||
dw $0988 ; Apple
|
||||
|
||||
GetAnimatedSpriteBufferPointer:
|
||||
;PHB : PHK : PLB
|
||||
@@ -178,7 +188,11 @@ ProcessEventItems:
|
||||
LDA GoalCounter : INC : STA GoalCounter
|
||||
CMP GoalItemRequirement : !BLT ++
|
||||
LDA TurnInGoalItems : AND.w #$00FF : BNE ++
|
||||
JSL.l ActivateGoal
|
||||
SEP #$20 ; set 8-bit accumulator
|
||||
LDA.b $8A : CMP.b #$80 : BNE +++
|
||||
LDA.b $23 : BNE +++
|
||||
JSL.l ActivateGoal
|
||||
+++
|
||||
++
|
||||
SEP #$20 ; set 8-bit accumulator
|
||||
LDX.b #$01 : BRA .done
|
||||
@@ -322,7 +336,10 @@ AddReceivedItemExpandedGetItem:
|
||||
+ CMP.b #$65 : BNE + ; Progressive Bow
|
||||
JMP .done
|
||||
+ CMP.b #$6A : BNE + ; Goal Collectable (Single/Triforce)
|
||||
JSL.l ActivateGoal
|
||||
LDA.b $8A : CMP.b #$80 : BNE ++
|
||||
LDA.b $23 : BNE ++
|
||||
JSL.l ActivateGoal
|
||||
++
|
||||
JMP .done
|
||||
+ CMP.b #$6B : BNE + ; Goal Collectable (Multi/Power Star)
|
||||
BRA .multi_collect
|
||||
@@ -333,7 +350,11 @@ AddReceivedItemExpandedGetItem:
|
||||
LDA.l GoalCounter : INC : STA.l GoalCounter
|
||||
CMP.w GoalItemRequirement : !BLT ++
|
||||
LDA.l TurnInGoalItems : AND.w #$00FF : BNE ++
|
||||
SEP #$20 ; set 8-bit accumulator
|
||||
LDA.b $8A : CMP.b #$80 : BNE +++
|
||||
LDA.b $23 : BNE +++
|
||||
JSL.l ActivateGoal
|
||||
+++
|
||||
++
|
||||
SEP #$20 ; set 8-bit accumulator
|
||||
JMP .done
|
||||
@@ -427,25 +448,30 @@ AddReceivedItemExpandedGetItem:
|
||||
LDA.b #$FF : STA.w $0B58,Y ; allows them to expire
|
||||
++ JMP .done
|
||||
+ CMP.b #$B3 : BNE + ; Chicken
|
||||
LDA.b #$0B : JSL Sprite_SpawnDynamically : BMI .done
|
||||
LDA.b #$0B : JSL Sprite_SpawnDynamically : BMI ++
|
||||
LDA $22 : CLC : ADC.b #$03 : AND.b #$F8 : STA $0D10,Y
|
||||
LDA $23 : ADC.b #$00 : STA $0D30,Y ; round X to nearest 8
|
||||
LDA.b $20 : SEC : SBC.b #$08 : STA.w $0D00,Y
|
||||
LDA.b $21 : SBC.b #$00 : STA.w $0D20,Y ; move up 8 pixels
|
||||
LDA.b $EE : STA.w $0F20,Y ; spawns on same layer as link
|
||||
BRA .done
|
||||
++ BRA .done
|
||||
+ CMP.b #$B4 : BNE + ; Big Magic
|
||||
LDA.b #$80 : STA MagicFiller ; fill magic
|
||||
BRA .done
|
||||
+ CMP.b #$B5 : BNE + ; 5 Arrows
|
||||
LDA.b #$05 : STA ArrowsFiller ; add 5 arrows
|
||||
+ CMP.b #$B5 : BNE + ; Good Bee
|
||||
LDA.b #$79 : JSL Sprite_SpawnDynamically : BMI .done
|
||||
LDA $22 : CLC : ADC.b #$03 : AND.b #$F8 : STA $0D10,Y
|
||||
LDA $23 : ADC.b #$00 : STA $0D30,Y ; round X to nearest 8
|
||||
LDA $20 : STA $0D00, Y : LDA $21 : STA $0D20, Y
|
||||
LDA.b $EE : STA.w $0F20,Y ; spawns on same layer as link
|
||||
JSL GoldBee_SpawnSelf_SetProperties
|
||||
BRA .done
|
||||
+ CMP.b #$B6 : BNE + ; Bomb Upgrade
|
||||
+ CMP.b #$C0 : BNE + ; Bomb Upgrade
|
||||
LDA #$01 : STA InfiniteBombsModifier ; infinite bombs
|
||||
JMP .done
|
||||
+ : CMP.b #$B7 : BNE + ; Cane Upgrade
|
||||
LDA.l SpecialWeapons : CMP #$03 : BEQ .blue_cane
|
||||
CMP #$04 : BEQ .red_cane
|
||||
BRA .done
|
||||
+ CMP.b #$C1 : BNE + ; Cane Upgrade
|
||||
LDA.l SpecialWeapons : AND.b #$7F : CMP.b #$03 : BEQ .blue_cane
|
||||
CMP.b #$04 : BEQ .red_cane
|
||||
BRA .done
|
||||
.blue_cane
|
||||
LDA #$01 : STA ByrnaEquipment
|
||||
@@ -453,6 +479,9 @@ AddReceivedItemExpandedGetItem:
|
||||
.red_cane
|
||||
LDA #$01 : STA SomariaEquipment
|
||||
BRA .done
|
||||
+ CMP.b #$C2 : BNE + ; Bug Net Upgrade
|
||||
LDA.b #$01 : STA BugNetEquipment
|
||||
BRA .done
|
||||
+
|
||||
.done
|
||||
PLX
|
||||
@@ -647,11 +676,12 @@ AddReceivedItemExpanded:
|
||||
db -4 ; Fairy
|
||||
db -4 ; Chicken
|
||||
db -4 ; Big Magic
|
||||
db -4 ; 5 Arrows
|
||||
db -4 ; Good Bee
|
||||
db -4, -4, -4, -4, -4, -4, -4, -4, -4, -4 ; Unused
|
||||
db -4 ; Bomb Upgrade
|
||||
db -4 ; Cane Upgrade
|
||||
db -4, -4, -4, -4, -4, -4, -4, -4 ; Unused
|
||||
db -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4 ; Unused
|
||||
db -4 ; Bug Net Upgrade
|
||||
db -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4 ; Unused
|
||||
db -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4 ; Unused
|
||||
db -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4 ; Unused
|
||||
|
||||
@@ -695,11 +725,12 @@ AddReceivedItemExpanded:
|
||||
db 0 ; Fairy
|
||||
db 0 ; Chicken
|
||||
db 4 ; Big Magic
|
||||
db 0 ; 5 Arrows
|
||||
db 0 ; Good Bee
|
||||
db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ; Unused
|
||||
db 0 ; Bomb Upgrade
|
||||
db 4 ; Cane Upgrade
|
||||
db 0, 0, 0, 0, 0, 0, 0, 0 ; Unused
|
||||
db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ; Unused
|
||||
db 0 ; Bug Net Upgrade
|
||||
db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ; Unused
|
||||
db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ; Unused
|
||||
db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ; Unused
|
||||
|
||||
@@ -748,11 +779,12 @@ AddReceivedItemExpanded:
|
||||
db $47 ; Fairy
|
||||
db $47 ; Chicken
|
||||
db $3B ; Big Magic
|
||||
db $02 ; 5 Arrows
|
||||
db $47 ; Good Bee
|
||||
db $49, $49, $49, $49, $49, $49, $49, $49, $49, $49 ; Unused
|
||||
db $13 ; Bomb Upgrade
|
||||
db $07 ; Cane Upgrade
|
||||
db $49, $49, $49, $49, $49, $49, $49, $49 ; Unused
|
||||
db $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49 ; Unused
|
||||
db $27 ; Bug Net Upgrade
|
||||
db $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49 ; Unused
|
||||
db $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49 ; Unused
|
||||
db $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49 ; Unused
|
||||
|
||||
@@ -795,11 +827,12 @@ AddReceivedItemExpanded:
|
||||
db $02 ; Fairy
|
||||
db $02 ; Chicken
|
||||
db $00 ; Big Magic
|
||||
db $02 ; 5 Arrows
|
||||
db $02 ; Good Bee
|
||||
db $02, $02, $02, $02, $02, $02, $02, $02, $02, $02 ; Unused
|
||||
db $02 ; Bomb Upgrade
|
||||
db $00 ; Cane Upgrade
|
||||
db $02, $02, $02, $02, $02, $02, $02, $02 ; Unused
|
||||
db $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02 ; Unused
|
||||
db $02 ; Bug Net Upgrade
|
||||
db $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02 ; Unused
|
||||
db $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02 ; Unused
|
||||
db $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02 ; Unused
|
||||
db $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02 ; Unused
|
||||
@@ -843,11 +876,12 @@ AddReceivedItemExpanded:
|
||||
db 1 ; Fairy
|
||||
db 1 ; Chicken
|
||||
db 4 ; Big Magic
|
||||
db 2 ; 5 Arrows
|
||||
db 1 ; Good Bee
|
||||
db 4, 4, 4, 4, 4, 4, 4, 4, 4, 4 ; Unused
|
||||
db 5 ; Bomb Upgrade
|
||||
db 5 ; Cane Upgrade
|
||||
db 4, 4, 4, 4, 4, 4, 4, 4 ; Unused
|
||||
db 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4 ; Unused
|
||||
db 1 ; Bug Net Upgrade
|
||||
db 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4 ; Unused
|
||||
db 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4 ; Unused
|
||||
db 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4 ; Unused
|
||||
db 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4 ; Unused
|
||||
@@ -892,11 +926,12 @@ AddReceivedItemExpanded:
|
||||
dw $F36A ; Fairy
|
||||
dw $F36A ; Chicken
|
||||
dw $F373 ; Big Magic
|
||||
dw $F376 ; 5 Arrows
|
||||
dw $F36A ; Good Bee
|
||||
dw $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A ; Unused
|
||||
dw $F38F ; Bomb Upgrade
|
||||
dw $F38F ; Cane Upgrade
|
||||
dw $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A ; Unused
|
||||
dw $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A ; Unused
|
||||
dw $F38F ; Bug Net Upgrade
|
||||
dw $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A ; Unused
|
||||
dw $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A ; Unused
|
||||
dw $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A ; Unused
|
||||
dw $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A ; Unused
|
||||
@@ -943,11 +978,12 @@ AddReceivedItemExpanded:
|
||||
db $FF ; Fairy
|
||||
db $FF ; Chicken
|
||||
db $80 ; Big Magic
|
||||
db $05 ; 5 Arrows
|
||||
db $FF ; Good Bee
|
||||
db $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF ; Unused
|
||||
db $FF ; Bomb Upgrade
|
||||
db $FF ; Cane Upgrade
|
||||
db $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF ; Unused
|
||||
db $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF ; Unused
|
||||
db $FF ; Bug Net Upgrade
|
||||
db $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF ; Unused
|
||||
db $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF ; Unused
|
||||
db $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF ; Unused
|
||||
db $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF ; Unused
|
||||
@@ -1036,11 +1072,12 @@ Link_ReceiveItemAlternatesExpanded:
|
||||
db -1 ; Fairy
|
||||
db -1 ; Chicken
|
||||
db -1 ; Big Magic
|
||||
db -1 ; 5 Arrows
|
||||
db -1 ; Good Bee
|
||||
db -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 ; Unused
|
||||
db -1 ; Bomb Upgrade
|
||||
db -1 ; Cane Upgrade
|
||||
db -1, -1, -1, -1, -1, -1, -1, -1 ; Unused
|
||||
db -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 ; Unused
|
||||
db -1 ; Bug Net Upgrade
|
||||
db -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 ; Unused
|
||||
db -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 ; Unused
|
||||
db -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 ; Unused
|
||||
db -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 ; Unused
|
||||
@@ -1275,22 +1312,12 @@ ChestPrep:
|
||||
SEC
|
||||
RTL
|
||||
;--------------------------------------------------------------------------------
|
||||
UpdateInventoryLocationExpanded:
|
||||
{
|
||||
REP #$30
|
||||
TYA : AND #$00FF : ASL A : TAX
|
||||
|
||||
; Tells what inventory location to write to.
|
||||
LDA.w AddReceivedItemExpanded_item_target_addr, X : STA $00
|
||||
|
||||
SEP #$30
|
||||
|
||||
LDA.b #$7E : STA $02
|
||||
|
||||
LDA.w AddReceivedItemExpanded_item_values, Y
|
||||
JSL ItemDowngradeFix
|
||||
RTL
|
||||
}
|
||||
Ancilla22_ItemReceipt_ContinueB:
|
||||
CMP.b #$6A : BNE .return
|
||||
JSL ActivateTriforceCutscene
|
||||
.return
|
||||
STZ.w $0C4A,X : STZ.w $0FC1 ; what we wrote over
|
||||
RTL
|
||||
;--------------------------------------------------------------------------------
|
||||
; Set a flag in SRAM if we pick up a compass in its own dungeon with HUD compass
|
||||
; counts on
|
||||
@@ -1339,7 +1366,7 @@ MaybeFlagCompassTotalEntrance:
|
||||
RTL
|
||||
;--------------------------------------------------------------------------------
|
||||
LoadReceivedItemExpandedProperties:
|
||||
CPX.b #$B6 : BEQ .bomb_upgrade
|
||||
CPX.b #$C0 : BEQ .bomb_upgrade
|
||||
LDA.l AddReceivedItemExpanded_properties, X ; load from table
|
||||
RTL
|
||||
.bomb_upgrade
|
||||
|
||||
591
owrando.asm
591
owrando.asm
@@ -11,9 +11,11 @@ OWMode:
|
||||
dw 0
|
||||
OWFlags:
|
||||
dw 0
|
||||
org $aa8010
|
||||
OWReserved:
|
||||
dw 0
|
||||
org $aa8010
|
||||
OWVersionInfo:
|
||||
dw $0000, $0000, $0000, $0000, $0000, $0000, $0000, $0000
|
||||
|
||||
;Hooks
|
||||
org $02a929
|
||||
@@ -27,6 +29,9 @@ BCS OWDetectTransitionReturn
|
||||
org $02a999
|
||||
jsl OWEdgeTransition : nop #4 ;LDA $02A4E3,X : ORA $7EF3CA
|
||||
|
||||
org $02aa07
|
||||
JSL OWMarkVisited : NOP
|
||||
|
||||
org $04e8ae
|
||||
JSL OWDetectSpecialTransition
|
||||
RTL : NOP
|
||||
@@ -45,21 +50,26 @@ Overworld_LoadSpecialOverworld_RoomId:
|
||||
org $04E8B4
|
||||
Overworld_LoadSpecialOverworld:
|
||||
|
||||
org $02A9DA
|
||||
JSL OWSkipPalettes
|
||||
BCC OverworldHandleTransitions_change_palettes : NOP #4
|
||||
|
||||
org $07982A
|
||||
Link_ResetSwimmingState:
|
||||
|
||||
|
||||
; mirror hooks
|
||||
org $02FBAB
|
||||
JSL OWMirrorSpriteRestore : NOP
|
||||
org $0283DC ; override world check when spawning mirror portal sprite in Crossed OWR
|
||||
jsl.l OWLightWorldOrCrossed
|
||||
org $05AF75
|
||||
Sprite_6C_MirrorPortal:
|
||||
jsl OWPreserveMirrorSprite : nop #2 ; LDA $7EF3CA : BNE $05AFDF
|
||||
jsl OWMirrorSpriteDisable ; LDA $7EF3CA
|
||||
org $05AF88
|
||||
jsl OWMirrorSpriteSkipDraw : NOP ; LDA.w $0FC6 : CMP.b #$03
|
||||
org $05AFDF
|
||||
Sprite_6C_MirrorPortal_missing_mirror:
|
||||
JML OWMirrorSpriteDelete : NOP ; STZ $0DD0,X : BRA $05AFF1
|
||||
org $0ABFBF
|
||||
JSL OWMirrorSpriteOnMap : BRA + : NOP #6 : +
|
||||
org $0ABFB6
|
||||
jsl OWMirrorSpriteOnMap : NOP ; LDA.w $008A : CMP.b #$40
|
||||
|
||||
; whirlpool shuffle cross world change
|
||||
org $02b3bd
|
||||
@@ -94,10 +104,6 @@ jsl OWOldManSpeed
|
||||
;org $09c957 ; <- 4c957
|
||||
;dw #$cb5f ; matches value on Central Bonk Rocks screen
|
||||
|
||||
; override world check when spawning mirror portal sprite in Crossed OWR
|
||||
org $0283dc
|
||||
jsl.l OWLightWorldOrCrossed
|
||||
|
||||
; override world check when viewing overworld (incl. title screen portion)
|
||||
org $0aba6c ; < ? - Bank0a.asm:474 ()
|
||||
jsl.l OWMapWorldCheck16 : nop
|
||||
@@ -155,8 +161,23 @@ jsl.l OWWorldCheck16 : nop
|
||||
org $02b16e ; AND #$3F : ORA 7EF3CA
|
||||
and #$7f : eor #$40 : nop #2
|
||||
|
||||
org $06AD4C
|
||||
jsl.l OWBonkDrops : nop #4
|
||||
org $09C3C4
|
||||
jsl.l OWBonkDropPrepSprite : nop #2
|
||||
org $09C801
|
||||
jsl.l OWBonkDropPrepSprite : nop #2
|
||||
org $06D052
|
||||
jsl.l OWBonkDropSparkle
|
||||
org $06AD49
|
||||
jsl.l OWBonkDropsOverworld : nop
|
||||
org $1EDE6A
|
||||
jsl.l OWBonkDropSparkle : BNE GoldBee_Dormant_exit
|
||||
jsl.l OWBonkDropsUnderworld : bra +
|
||||
GoldBee_SpawnSelf_SetProperties:
|
||||
phb : lda.b #$1E : pha : plb ; switch to bank 1E
|
||||
jsr GoldBee_SpawnSelf+12
|
||||
plb : rtl
|
||||
nop #2
|
||||
+
|
||||
|
||||
;Code
|
||||
org $aa8800
|
||||
@@ -230,66 +251,55 @@ OWWhirlpoolEnd:
|
||||
RTL
|
||||
}
|
||||
|
||||
OWDestroyItemSprites:
|
||||
{
|
||||
PHX : LDX.b #$0F
|
||||
.nextSprite
|
||||
LDA.w $0E20,X
|
||||
CMP.b #$D8 : BCC .continue
|
||||
CMP.b #$EC : BCS .continue
|
||||
.killSprite ; need to kill sprites from D8 to EB on screen transition
|
||||
STZ.w $0DD0,X
|
||||
.continue
|
||||
DEX : BPL .nextSprite
|
||||
PLX : RTL
|
||||
}
|
||||
|
||||
OWMirrorSpriteOnMap:
|
||||
{
|
||||
lda.w $1ac0,x : bit.b #$f0 : beq .continue
|
||||
lda.b #$00 : rtl
|
||||
.continue
|
||||
ora.w $1ab0,x
|
||||
ora.w $1ad0,x
|
||||
ora.w $1ae0,x
|
||||
rtl
|
||||
JSL OWWorldCheck
|
||||
CMP.b #$40 ; part of what we wrote over
|
||||
RTL
|
||||
}
|
||||
OWPreserveMirrorSprite:
|
||||
OWMirrorSpriteDisable:
|
||||
{
|
||||
lda.l OWMode+1 : and.b #!FLAG_OW_CROSSED : beq .vanilla ; if OW Crossed, skip world check and continue
|
||||
lda.b $10 : cmp.b #$0f : beq .vanilla ; if performing mirror superbunny
|
||||
rtl
|
||||
LDA.b $10 : CMP.b #$0F : BNE + ; avoid rare freeze during mirror superbunny
|
||||
PLA : PLA : PLA : JML Sprite_6C_MirrorPortal_missing_mirror
|
||||
+
|
||||
|
||||
lda.l OWMode+1 : and.b #!FLAG_OW_CROSSED : beq .vanilla
|
||||
lda.l InvertedMode : beq +
|
||||
lda.b #$40
|
||||
+ rtl
|
||||
|
||||
.vanilla
|
||||
lda.l InvertedMode : beq +
|
||||
lda.l CurrentWorld : beq .deleteMirror
|
||||
rtl
|
||||
+ lda.l CurrentWorld : bne .deleteMirror
|
||||
rtl
|
||||
|
||||
.deleteMirror
|
||||
lda.b $10 : cmp.b #$0f : bne +
|
||||
jsr.w OWMirrorSpriteMove ; if performing mirror superbunny
|
||||
+ pla : pla : pla : jml Sprite_6C_MirrorPortal_missing_mirror
|
||||
}
|
||||
OWMirrorSpriteMove:
|
||||
{
|
||||
lda.l OWMode+1 : and.b #!FLAG_OW_CROSSED : beq +
|
||||
lda.w $1acf : ora.b #$40 : sta.w $1acf
|
||||
+ rts
|
||||
}
|
||||
OWMirrorSpriteBonk:
|
||||
{
|
||||
jsr.w OWMirrorSpriteMove
|
||||
lda.b #$2c : jml SetGameModeLikeMirror ; what we wrote over
|
||||
}
|
||||
OWMirrorSpriteDelete:
|
||||
{
|
||||
stz.w $0dd0,x ; what we wrote over
|
||||
jsr.w OWMirrorSpriteMove
|
||||
jml Sprite_6C_MirrorPortal_dont_do_warp
|
||||
}
|
||||
OWMirrorSpriteRestore:
|
||||
{
|
||||
lda.l OWMode+1 : and.b #!FLAG_OW_CROSSED : beq .return
|
||||
lda.l InvertedMode : beq +
|
||||
lda.l CurrentWorld : beq .return
|
||||
bra .restorePortal
|
||||
+ lda.l CurrentWorld : bne .return
|
||||
|
||||
.restorePortal
|
||||
lda.w $1acf : and.b #$0f : sta.w $1acf
|
||||
|
||||
.return
|
||||
rep #$30 : lda.w $04AC ; what we wrote over
|
||||
lda.l CurrentWorld ; what we wrote over
|
||||
rtl
|
||||
}
|
||||
OWMirrorSpriteSkipDraw:
|
||||
{
|
||||
lda.l OWMode+1 : and.b #!FLAG_OW_CROSSED : beq .vanilla
|
||||
lda.l InvertedMode : beq +
|
||||
lda.l CurrentWorld : eor.b #$40
|
||||
bra ++
|
||||
+ lda.l CurrentWorld : ++ beq .vanilla
|
||||
stz.w $0D90,x ; disables collision
|
||||
sec : rtl
|
||||
|
||||
.vanilla
|
||||
LDA.w $0FC6 : CMP.b #$03 ; what we wrote over
|
||||
RTL
|
||||
}
|
||||
OWLightWorldOrCrossed:
|
||||
{
|
||||
lda.l OWMode+1 : and.b #!FLAG_OW_CROSSED : beq ++
|
||||
@@ -340,6 +350,16 @@ OWOldManSpeed:
|
||||
lda #$0c : sta $5e ; what we wrote over
|
||||
rtl
|
||||
}
|
||||
OWMarkVisited:
|
||||
{
|
||||
LDX.b $8A : STZ.w $0412 ; what we wrote over
|
||||
LDA.b $10 : CMP.b #$14 : BCS .return
|
||||
LDA.l OverworldEventDataWRAM,X
|
||||
ORA.b #$80 : STA.l OverworldEventDataWRAM,X
|
||||
|
||||
.return
|
||||
RTL
|
||||
}
|
||||
|
||||
LoadMapDarkOrMixed:
|
||||
{
|
||||
@@ -395,67 +415,157 @@ LoadMapDarkOrMixed:
|
||||
dw $0400+$0210 ; bottom right
|
||||
}
|
||||
|
||||
; Y = sprite slot index of bonk sprite
|
||||
OWBonkDropPrepSprite:
|
||||
{
|
||||
LDA.b $1B : BEQ +
|
||||
LDA.w $0FB5 ; what we wrote over
|
||||
PHA
|
||||
BRA .continue
|
||||
+
|
||||
STZ.w $0F20,X : STZ.w $0E30,X ; what we wrote over
|
||||
PHA
|
||||
|
||||
.continue
|
||||
LDA.l OWFlags+1 : AND.b #!FLAG_OW_BONKDROP : BEQ .return
|
||||
+ LDA.w $0E20,X : CMP.b #$D9 : BNE +
|
||||
LDA.b #$03 : STA.w $0F20,X
|
||||
BRA .prep
|
||||
+ CMP.b #$B2 : BEQ .prep
|
||||
PLA : RTL
|
||||
|
||||
.prep
|
||||
STZ.w !SPRITE_REDRAW,X
|
||||
PHB : PHK : PLB : PHY
|
||||
TXY : JSR OWBonkDropLookup : BCC .done
|
||||
; found match ; X = rec + 1
|
||||
INX : LDA.w OWBonkPrizeData,X : PHA
|
||||
JSR OWBonkDropCollected : PLA : BCC .done
|
||||
TYX : LDA.b #$01 : STA.w !SPRITE_REDRAW,X
|
||||
.done
|
||||
TYX : PLY : PLB
|
||||
|
||||
.return
|
||||
PLA : RTL
|
||||
}
|
||||
|
||||
OWBonkDropSparkle:
|
||||
{
|
||||
LDA.l OWFlags+1 : AND.b #!FLAG_OW_BONKDROP : BEQ .nosparkle
|
||||
LDA.w $0E90,X : BEQ .nosparkle
|
||||
LDA.w !SPRITE_REDRAW,X : BNE .nosparkle
|
||||
JSL Sprite_SpawnSparkleGarnish
|
||||
; move sparkle down 1 tile
|
||||
PHX : TYX : PLY
|
||||
LDA.l $7FF81E,X : CLC : ADC.b #$10 : STA.l $7FF81E,X
|
||||
LDA.l $7FF85A,X : ADC.b #$00 : STA.l $7FF85A,X
|
||||
PHY : TXY : PLX
|
||||
|
||||
.nosparkle
|
||||
LDA $0E20,X : CMP.b #$D9 : BEQ .greenrupee
|
||||
CMP.b #$B2 : BEQ .goodbee
|
||||
RTL
|
||||
|
||||
.goodbee
|
||||
LDA $0E90,X ; what we wrote over
|
||||
RTL
|
||||
|
||||
.greenrupee
|
||||
JSL Sprite_DrawRippleIfInWater ; what we wrote over
|
||||
RTL
|
||||
}
|
||||
|
||||
OWBonkDropsUnderworld:
|
||||
{
|
||||
LDA.l OWFlags+1 : AND.b #!FLAG_OW_BONKDROP : BNE .shuffled
|
||||
.vanilla ; what we wrote over
|
||||
STZ.w $0DD0,X
|
||||
LDA.l BottleContentsOne : ORA.l BottleContentsTwo
|
||||
ORA.l BottleContentsThree : ORA.l BottleContentsFour
|
||||
RTL
|
||||
|
||||
.shuffled
|
||||
LDA.w $0DD0,X : BNE +
|
||||
BRA .return+1
|
||||
+ PHY : TXY
|
||||
JSL OWBonkDrops
|
||||
|
||||
.return
|
||||
PLY
|
||||
LDA #$08 ; makes original good bee not spawn
|
||||
RTL
|
||||
}
|
||||
|
||||
OWBonkDropsOverworld:
|
||||
{
|
||||
LDA.l OWFlags+1 : AND.b #!FLAG_OW_BONKDROP : BNE .shuffled
|
||||
BRA .vanilla
|
||||
|
||||
.shuffled
|
||||
LDA.w $0DD0,Y : BNE +
|
||||
BRA .vanilla
|
||||
+ LDA.w $0E20,Y : CMP.b #$D9 : BEQ +
|
||||
BRA .vanilla+3
|
||||
+
|
||||
LDA.b #$00 : STA.w $0F20,Y ; restore proper layer
|
||||
JSL OWBonkDrops
|
||||
|
||||
.vanilla
|
||||
LDA.w $0E20,Y : CMP.b #$D8 ; what we wrote over
|
||||
RTL
|
||||
}
|
||||
|
||||
OWBonkDrops:
|
||||
{
|
||||
CMP.b #$D8 : BEQ +
|
||||
RTL
|
||||
+ LDA.l OWFlags+1 : AND.b #!FLAG_OW_CROSSED : BNE +
|
||||
JSL.l Sprite_TransmuteToBomb : RTL
|
||||
+
|
||||
|
||||
; loop thru rando bonk table to find match
|
||||
PHB : PHK : PLB
|
||||
LDA.b $8A
|
||||
LDX.b #(41*6) ; 41 bonk items, 6 bytes each
|
||||
- CMP.w OWBonkPrizeData,X : BNE +
|
||||
INX
|
||||
LDA.w $0D10,Y : LSR A : LSR A : LSR A : LSR A
|
||||
EOR.w $0D00,Y : CMP.w OWBonkPrizeData,X : BNE ++ ; X = row + 1
|
||||
BRA .found_match
|
||||
++ DEX : LDA.b $8A
|
||||
+ CPX.b #$00 : BNE +
|
||||
PLB : RTL
|
||||
+ DEX : DEX : DEX : DEX : DEX : DEX : BRA -
|
||||
LDA.b $1B : BEQ +
|
||||
LDX.b #((UWBonkPrizeData-OWBonkPrizeData)+1)
|
||||
BRA .found_match
|
||||
+
|
||||
JSR OWBonkDropLookup : BCS .found_match
|
||||
JMP .return+2
|
||||
|
||||
.found_match
|
||||
INX : LDA.w OWBonkPrizeData,X : PHX : PHA ; S = FlagBitmask, X (row + 2)
|
||||
LDX.b $8A : LDA.l OverworldEventDataWRAM,X : AND 1,S : PHA : BNE + ; S = Collected, FlagBitmask, X (row + 2)
|
||||
JSR OWBonkDropCollected : PHA : BCS .load_item_and_mw ; S = Collected, FlagBitmask, X (row + 2)
|
||||
LDA.b #$1B : STA $12F ; JSL Sound_SetSfx3PanLong ; seems that when you bonk, there is a pending bonk sfx, so we clear that out and replace with reveal secret sfx
|
||||
+
|
||||
; JSLSpriteSFX_QueueSFX3WithPan
|
||||
|
||||
.load_item_and_mw
|
||||
LDA 3,S : TAX : INX : LDA.w OWBonkPrizeData,X
|
||||
PHA : INX : LDA.w OWBonkPrizeData,X : BEQ +
|
||||
; multiworld item
|
||||
DEX : PLA ; X = row + 3
|
||||
DEX : PLA ; A = item id; X = row + 3
|
||||
JMP .spawn_item
|
||||
+ DEX : PLA ; X = row + 3
|
||||
+ DEX : PLA ; A = item id; X = row + 3
|
||||
|
||||
.determine_type ; A = item id ; S = Collected, FlagBitmask, X (row + 2)
|
||||
.determine_type ; A = item id; X = row + 3; S = Collected, FlagBitmask, X (row + 2)
|
||||
CMP.b #$B0 : BNE +
|
||||
LDA.b #$79 : JMP .sprite_transform ; transform to bees
|
||||
+ CMP.b #$42 : BNE +
|
||||
JSL.l Sprite_TransmuteToBomb ; transform a heart to bomb, vanilla behavior
|
||||
JMP .mark_collected
|
||||
+ CMP.b #$34 : BNE +
|
||||
LDA.b #$D9 : CLC : JMP .sprite_transform ; transform to single rupee
|
||||
LDA.b #$D9 : JMP .sprite_transform ; transform to single rupee
|
||||
+ CMP.b #$35 : BNE +
|
||||
LDA.b #$DA : CLC : BRA .sprite_transform ; transform to blue rupee
|
||||
LDA.b #$DA : JMP .sprite_transform ; transform to blue rupee
|
||||
+ CMP.b #$36 : BNE +
|
||||
LDA.b #$DB : CLC : BRA .sprite_transform ; transform to red rupee
|
||||
LDA.b #$DB : BRA .sprite_transform ; transform to red rupee
|
||||
+ CMP.b #$27 : BNE +
|
||||
LDA.b #$DC : CLC : BRA .sprite_transform ; transform to 1 bomb
|
||||
LDA.b #$DC : BRA .sprite_transform ; transform to 1 bomb
|
||||
+ CMP.b #$28 : BNE +
|
||||
LDA.b #$DD : CLC : BRA .sprite_transform ; transform to 4 bombs
|
||||
LDA.b #$DD : BRA .sprite_transform ; transform to 4 bombs
|
||||
+ CMP.b #$31 : BNE +
|
||||
LDA.b #$DE : CLC : BRA .sprite_transform ; transform to 8 bombs
|
||||
LDA.b #$DE : BRA .sprite_transform ; transform to 8 bombs
|
||||
+ CMP.b #$45 : BNE +
|
||||
LDA.b #$DF : CLC : BRA .sprite_transform ; transform to small magic
|
||||
LDA.b #$DF : BRA .sprite_transform ; transform to small magic
|
||||
+ CMP.b #$B4 : BNE +
|
||||
LDA.b #$E0 : CLC : BRA .sprite_transform ; transform to big magic
|
||||
LDA.b #$E0 : BRA .sprite_transform ; transform to big magic
|
||||
+ CMP.b #$B5 : BNE +
|
||||
LDA.b #$E1 : CLC : BRA .sprite_transform ; transform to 5 arrows
|
||||
LDA.b #$79 : JSL.l OWBonkSpritePrep
|
||||
JSL.l GoldBee_SpawnSelf_SetProperties ; transform to good bee
|
||||
BRA .mark_collected
|
||||
+ CMP.b #$44 : BNE +
|
||||
LDA.b #$E2 : CLC : BRA .sprite_transform ; transform to 10 arrows
|
||||
LDA.b #$E2 : BRA .sprite_transform ; transform to 10 arrows
|
||||
+ CMP.b #$B1 : BNE +
|
||||
LDA.b #$AC : BRA .sprite_transform ; transform to apples
|
||||
+ CMP.b #$B2 : BNE +
|
||||
@@ -465,9 +575,107 @@ OWBonkDrops:
|
||||
CLC : ADC.b #$08 : PHA
|
||||
LDA.w $0D00,Y : SEC : SBC.b 1,S : STA.w $0D00,Y
|
||||
LDA.w $0D20,Y : SBC.b #$00 : STA.w $0D20,Y : PLX
|
||||
LDA.b #$0B : SEC ; BRA .sprite_transform ; transform to chicken
|
||||
LDA.b #$0B ; BRA .sprite_transform ; transform to chicken
|
||||
|
||||
.sprite_transform
|
||||
JSL.l OWBonkSpritePrep
|
||||
|
||||
.mark_collected ; S = Collected, FlagBitmask, X (row + 2)
|
||||
PLA : BNE + ; S = FlagBitmask, X (row + 2)
|
||||
TYX : JSL Sprite_IsOnscreen : BCC +
|
||||
LDA.b $1B : BEQ ++
|
||||
LDA.l RoomDataWRAM[$0120].high : ORA 1,S : STA.l RoomDataWRAM[$0120].high
|
||||
LDA.w $0400 : ORA 1,S : STA.w $0400
|
||||
BRA .increment_collection
|
||||
++
|
||||
LDX.b $8A : LDA.l OverworldEventDataWRAM,X : ORA 1,S : STA.l OverworldEventDataWRAM,X
|
||||
|
||||
.increment_collection
|
||||
REP #$20
|
||||
LDA.l TotalItemCounter : INC : STA.l TotalItemCounter
|
||||
SEP #$20
|
||||
+ BRA .return
|
||||
|
||||
; spawn itemget item
|
||||
.spawn_item ; A = item id ; Y = bonk sprite slot ; S = Collected, FlagBitmask, X (row + 2)
|
||||
PLX : BEQ + : LDA.b #$00 : STA.w $0DD0,Y : BRA .return ; S = FlagBitmask, X (row + 2)
|
||||
+ PHA
|
||||
|
||||
LDA.b #$01 : STA !FORCE_HEART_SPAWN
|
||||
|
||||
LDA.b #$EB : STA.l $7FFE00
|
||||
JSL Sprite_SpawnDynamically+15 ; +15 to skip finding a new slot, use existing sprite
|
||||
|
||||
LDA.b #$01 : STA.w !SPRITE_REDRAW,Y
|
||||
|
||||
PLA : STA.w $0E80,Y
|
||||
|
||||
; affects the rate the item moves in the Y/X direction
|
||||
LDA.b #$00 : STA.w $0D40,Y
|
||||
LDA.b #$0A : STA.w $0D50,Y
|
||||
|
||||
LDA.b #$1A : STA.w $0F80,Y ; amount of force (gives height to the arch)
|
||||
LDA.b #$FF : STA.w $0B58,Y ; stun timer
|
||||
LDA.b #$30 : STA.w $0F10,Y ; aux delay timer 4 ?? dunno what that means
|
||||
|
||||
LDA.b #$00 : STA.w $0F20,Y ; layer the sprite is on
|
||||
|
||||
LDA.b $1B : BEQ +
|
||||
; sets the tile type that is underneath the sprite, water
|
||||
TYX : LDA.b #$09 : STA.l $7FF9C2,X ; TODO: Figure out how to get the game to set this
|
||||
+
|
||||
|
||||
; sets bitmask flag, uses free RAM
|
||||
PLA : STA.w $0ED0,Y ; S = X (row + 2)
|
||||
|
||||
; determines the initial spawn point of item
|
||||
PLX : INX : INX : INX
|
||||
LDA.w $0D00,Y : SEC : SBC.w OWBonkPrizeData,X : STA.w $0D00,Y
|
||||
LDA.w $0D20,Y : SBC #$00 : STA.w $0D20,Y
|
||||
|
||||
BRA .return+2
|
||||
|
||||
.return
|
||||
PLA : PLA : PLB
|
||||
RTL
|
||||
}
|
||||
|
||||
; Y = sprite slot; returns X = row + 1
|
||||
OWBonkDropLookup:
|
||||
{
|
||||
; loop thru rando bonk table to find match
|
||||
LDA.b $8A
|
||||
LDX.b #((UWBonkPrizeData-OWBonkPrizeData)-sizeof(OWBonkPrizeTable)) ; 41 bonk items, 6 bytes each
|
||||
- CMP.w OWBonkPrizeData,X : BNE +
|
||||
INX
|
||||
LDA.w $0D10,Y : LSR A : LSR A : LSR A : LSR A
|
||||
EOR.w $0D00,Y : CMP.w OWBonkPrizeData,X : BNE ++ ; X = row + 1
|
||||
SEC : RTS
|
||||
++ DEX : LDA.b $8A
|
||||
+ CPX.b #$00 : BNE +
|
||||
CLC : RTS
|
||||
+ DEX : DEX : DEX : DEX : DEX : DEX : BRA -
|
||||
}
|
||||
|
||||
; S = FlagBitmask ; returns SEC if collected
|
||||
OWBonkDropCollected:
|
||||
{
|
||||
; check if collected
|
||||
CLC
|
||||
LDA.b $1B : BEQ +
|
||||
LDA.l RoomDataWRAM[$0120].high : AND.b 3,S : BEQ .return ; S = Collected, FlagBitmask, X (row + 2)
|
||||
SEC : RTS
|
||||
+
|
||||
LDX.b $8A : LDA.l OverworldEventDataWRAM,X : AND 3,S : BEQ .return ; S = Collected, FlagBitmask, X (row + 2)
|
||||
SEC : RTS
|
||||
|
||||
.return
|
||||
RTS
|
||||
}
|
||||
|
||||
; A = SpriteID, Y = Sprite Slot Index, X = free/overwritten
|
||||
OWBonkSpritePrep:
|
||||
{
|
||||
STA.w $0E20,Y
|
||||
TYX : JSL.l Sprite_LoadProperties
|
||||
BEQ +
|
||||
@@ -475,59 +683,13 @@ OWBonkDrops:
|
||||
LDA #$30 : STA $0F80,Y ; amount of force (related to speed)
|
||||
LDA #$10 : STA $0D50,Y ; eastward rate of speed
|
||||
LDA #$FF : STA $0B58,Y ; expiration timer
|
||||
+
|
||||
|
||||
.mark_collected ; S = Collected, FlagBitmask, X (row + 2)
|
||||
PLA : BNE + ; S = FlagBitmask, X (row + 2)
|
||||
LDX.b $8A : LDA.l OverworldEventDataWRAM,X : ORA 1,S : STA.l OverworldEventDataWRAM,X
|
||||
|
||||
REP #$20
|
||||
LDA.l TotalItemCounter : INC : STA.l TotalItemCounter
|
||||
SEP #$20
|
||||
+ JMP .return
|
||||
|
||||
; spawn itemget item
|
||||
.spawn_item ; A = item id ; Y = tree sprite slot ; S = Collected, FlagBitmask, X (row + 2)
|
||||
PLX : BEQ + : LDA.b #$00 : STA.w $0DD0,Y : JMP .return ; S = FlagBitmask, X (row + 2)
|
||||
+ LDA 2,S : TAX : INX : INX
|
||||
LDA.w OWBonkPrizeData,X : STA.l !MULTIWORLD_SPRITEITEM_PLAYER_ID
|
||||
DEX
|
||||
|
||||
LDA.b #$01 : STA !REDRAW
|
||||
|
||||
LDA.b #$EB
|
||||
STA.l $7FFE00
|
||||
JSL Sprite_SpawnDynamically+15 ; +15 to skip finding a new slot, use existing sprite
|
||||
|
||||
; affects the rate the item moves in the Y/X direction
|
||||
LDA.b #$00 : STA.w $0D40,Y
|
||||
LDA.b #$0A : STA.w $0D50,Y
|
||||
|
||||
LDA.b #$20 : STA.w $0F80,Y ; amount of force (gives height to the arch)
|
||||
LDA.b #$FF : STA.w $0B58,Y ; stun timer
|
||||
LDA.b #$30 : STA.w $0F10,Y ; aux delay timer 4 ?? dunno what that means
|
||||
|
||||
LDA.b #$00 : STA.w $0F20,Y ; layer the sprite is on
|
||||
|
||||
; sets OW event bitmask flag, uses free RAM
|
||||
PLA : STA.w $0ED0,Y ; S = X (row + 2)
|
||||
|
||||
; determines the initial spawn point of item
|
||||
PLX : INX : INX : INX
|
||||
LDA.w $0D00,Y : SEC : SBC.w OWBonkPrizeData,X : STA.w $0D00,Y
|
||||
LDA.w $0D20,Y : SBC #$00 : STA.w $0D20,Y
|
||||
|
||||
LDA.b #$01 : STA !REDRAW : STA !FORCE_HEART_SPAWN
|
||||
|
||||
PLB : RTL
|
||||
|
||||
.return
|
||||
PLA : PLA : PLB : RTL
|
||||
+ RTL
|
||||
}
|
||||
|
||||
org $aa9000
|
||||
OWDetectEdgeTransition:
|
||||
{
|
||||
JSL OWDestroyItemSprites
|
||||
STZ.w $06FC
|
||||
LDA.l OWMode : ORA.l OWMode+1 : BEQ .vanilla
|
||||
JSR OWShuffle
|
||||
@@ -721,31 +883,33 @@ OWNewDestination:
|
||||
{
|
||||
tya : sta $4202 : lda #16 : sta $4203 ;wait 8 cycles
|
||||
rep #$20 : txa : nop : !add $4216 : tax ;a = offset to dest record
|
||||
lda.w $0006,x : sta $06 ;set coord
|
||||
lda.w $0008,x : sta $04 ;save dest OW slot/ID
|
||||
lda.w $000a,x : sta $84 ;VRAM
|
||||
|
||||
ldy $20 : lda $418 : dec #2 : bpl + : ldy $22 : + sty $06
|
||||
|
||||
;;22 e0 e2 61c 61e - X
|
||||
;;20 e6 e8 618 61a - Y
|
||||
;keep current position if within incoming gap
|
||||
lda.w $0000,x : and #$01ff : pha : lda.w $0002,x : and #$01ff : pha
|
||||
ldy $20 : lda $418 : dec #2 : bpl + : ldy $22
|
||||
+ tya : and #$01ff : cmp 3,s : !blt .adjustMainAxis
|
||||
dec : cmp 1,s : !bge .adjustMainAxis
|
||||
inc : pha : lda $06 : and #$fe00 : !add 1,s : sta $06 : pla
|
||||
LDA.l OWMode : AND.w #$0007 : BEQ .noLayoutShuffle ;temporary fix until VRAM issues are solved
|
||||
lda.w $0006,x : sta $06 ;set coord
|
||||
lda.w $000a,x : sta $84 ;VRAM
|
||||
tya : and #$01ff : cmp 3,s : !blt .adjustMainAxis
|
||||
dec : cmp 1,s : !bge .adjustMainAxis
|
||||
inc : pha : lda $06 : and #$fe00 : !add 1,s : sta $06 : pla
|
||||
|
||||
; adjust and set other VRAM addresses
|
||||
lda.w $0006,x : pha : lda $06 : !sub 1,s
|
||||
jsl DivideByTwoPreserveSign : jsl DivideByTwoPreserveSign : jsl DivideByTwoPreserveSign : jsl DivideByTwoPreserveSign : pha ; number of tiles
|
||||
lda $418 : dec #2 : bmi +
|
||||
pla : pea $0000 : bra ++ ;pla : asl #7 : pha : bra ++ ; y-axis shifts VRAM by increments of 0x80 (disabled for now)
|
||||
+ pla : asl : pha ; x-axis shifts VRAM by increments of 0x02
|
||||
++ lda $84 : !add 1,s : sta $84 : pla : pla
|
||||
; adjust and set other VRAM addresses
|
||||
lda.w $0006,x : pha : lda $06 : !sub 1,s
|
||||
jsl DivideByTwoPreserveSign : jsl DivideByTwoPreserveSign : jsl DivideByTwoPreserveSign : jsl DivideByTwoPreserveSign : pha ; number of tiles
|
||||
lda $418 : dec #2 : bmi +
|
||||
pla : pea $0000 : bra ++ ;pla : asl #7 : pha : bra ++ ; y-axis shifts VRAM by increments of 0x80 (disabled for now)
|
||||
+ pla : asl : pha ; x-axis shifts VRAM by increments of 0x02
|
||||
++ lda $84 : !add 1,s : sta $84 : pla : pla
|
||||
|
||||
.adjustMainAxis
|
||||
LDA $84 : SEC : SBC #$0400 : AND #$0F00 : ASL : XBA : STA $88 ; vram
|
||||
LDA $84 : SEC : SBC #$0010 : AND #$003E : LSR : STA $86
|
||||
.adjustMainAxis
|
||||
LDA $84 : SEC : SBC #$0400 : AND #$0F00 : ASL : XBA : STA $88 ; vram
|
||||
LDA $84 : SEC : SBC #$0010 : AND #$003E : LSR : STA $86
|
||||
|
||||
.noLayoutShuffle
|
||||
LDA.w $000F,X : AND.w #$00FF : STA.w $06FC ; position to walk to after transition (if non-zero)
|
||||
|
||||
LDY.w #$0000
|
||||
@@ -805,8 +969,12 @@ OWNewDestination:
|
||||
|
||||
; crossed OW shuffle and terrain
|
||||
ldx $05 : ldy $08 : jsr OWWorldTerrainUpdate
|
||||
|
||||
ldx $8a : lda $05 : sta $8a : stx $05 ; $05 is prev screen id, $8a is dest screen
|
||||
|
||||
lda $05 : sta $8a
|
||||
jsr OWGfxUpdate
|
||||
|
||||
lda $8a
|
||||
rep #$30 : rts
|
||||
}
|
||||
OWLoadSpecialArea:
|
||||
@@ -846,17 +1014,17 @@ OWWorldTerrainUpdate: ; x = owid of destination screen, y = 1 for land to water,
|
||||
lda #$38 : sta $012f ; play sfx - #$3b is an alternative
|
||||
|
||||
; toggle bunny mode
|
||||
lda MoonPearlEquipment : bne .nobunny
|
||||
lda.l InvertedMode : bne .inverted
|
||||
lda MoonPearlEquipment : beq + : jmp .nobunny
|
||||
+ lda.l InvertedMode : bne .inverted
|
||||
lda CurrentWorld : bra +
|
||||
.inverted lda CurrentWorld : eor #$40
|
||||
+ and #$40 : beq .nobunny
|
||||
|
||||
LDA.w $0703 : BEQ + ; check if forced transition
|
||||
CPY.b #$03 : BEQ .end_forced_whirlpool
|
||||
LDA.b #$17 : STA.b $5D
|
||||
LDA.b #$01 : STA.w $02E0 : STA.b $56
|
||||
LDA.w $0703 : BRA .end_forced_edge
|
||||
CPY.b #$03 : BEQ ++
|
||||
LDA.b #$17 : STA.b $5D
|
||||
LDA.b #$01 : STA.w $02E0 : STA.b $56
|
||||
LDA.w $0703 : JSR OWLoadGearPalettes : BRA .end_forced_edge
|
||||
++ JSR OWLoadGearPalettes : BRA .end_forced_whirlpool
|
||||
+
|
||||
CPY.b #$01 : BEQ .auto ; check if going from land to water
|
||||
CPY.b #$02 : BEQ .to_bunny_reset_swim ; bunny state if swimming to land
|
||||
@@ -875,8 +1043,8 @@ OWWorldTerrainUpdate: ; x = owid of destination screen, y = 1 for land to water,
|
||||
STZ.b $5D
|
||||
PLX
|
||||
BRA .to_pseudo_bunny
|
||||
.whirlpool
|
||||
PLX : RTS
|
||||
.whirlpool
|
||||
PLX : JMP OWLoadGearPalettes
|
||||
.to_bunny_reset_swim
|
||||
LDA.b $5D : CMP.b #$04 : BNE .to_bunny ; check if swimming
|
||||
JSL Link_ResetSwimmingState
|
||||
@@ -885,7 +1053,7 @@ OWWorldTerrainUpdate: ; x = owid of destination screen, y = 1 for land to water,
|
||||
LDA.b #$17 : STA.b $5D
|
||||
.to_pseudo_bunny
|
||||
LDA.b #$01 : STA.w $02E0 : STA.b $56
|
||||
RTS
|
||||
JMP OWLoadGearPalettes
|
||||
|
||||
.nobunny
|
||||
lda $5d : cmp #$17 : bne + ; retain current state unless bunny
|
||||
@@ -934,6 +1102,68 @@ OWWorldTerrainUpdate: ; x = owid of destination screen, y = 1 for land to water,
|
||||
.return
|
||||
RTS
|
||||
}
|
||||
OWGfxUpdate:
|
||||
{
|
||||
REP #$20 : LDA.l OWMode : AND.w #$0207 : BEQ .is_only_mixed : SEP #$20
|
||||
;;;;PLA : AND.b #$3F : BEQ .leaving_woods
|
||||
LDA.b $8A : AND.b #$3F : BEQ .entering_woods
|
||||
;LDA.b $05 : JSL OWSkipPalettes : BCS .skip_palettes
|
||||
LDA.b $8A : JSR OWDetermineScreensPaletteSet
|
||||
CPX.w $0AB3 : BEQ .skip_palettes ; check if next screen's palette is different
|
||||
LDA $00 : PHA
|
||||
JSL OverworldLoadScreensPaletteSet_long ; loading correct OW palette
|
||||
PLA : STA $00
|
||||
.leaving_woods
|
||||
.entering_woods
|
||||
.is_only_mixed
|
||||
.skip_palettes
|
||||
SEP #$20
|
||||
}
|
||||
OWLoadGearPalettes:
|
||||
{
|
||||
PHX : PHY : LDA $00 : PHA
|
||||
LDA.w $02E0 : BEQ +
|
||||
JSL LoadGearPalettes_bunny
|
||||
BRA .return
|
||||
+
|
||||
JSL LoadGearPalettes_link
|
||||
.return
|
||||
PLA : STA $00 : PLY : PLX
|
||||
RTS
|
||||
}
|
||||
OWDetermineScreensPaletteSet: ; A = OWID to check
|
||||
{
|
||||
LDX.b #$02
|
||||
PHA : AND.b #$3F
|
||||
CMP.b #$03 : BEQ .death_mountain
|
||||
CMP.b #$05 : BEQ .death_mountain
|
||||
CMP.b #$07 : BEQ .death_mountain
|
||||
LDX.b #$00
|
||||
.death_mountain
|
||||
PLA : PHX : TAX : LDA.l OWTileWorldAssoc,X : BEQ +
|
||||
PLX : INX : RTS
|
||||
+ PLX : RTS
|
||||
}
|
||||
OWSkipPalettes:
|
||||
{
|
||||
STA.b $05 ; A = previous screen, also stored in $05
|
||||
; only skip mosaic if OWR Layout or Crossed
|
||||
PHP : REP #$20 : LDA.l OWMode : AND.w #$0207 : BEQ .vanilla : PLP
|
||||
; checks to see if going to from any DM screens
|
||||
;LDA.b $05 : JSR OWDetermineScreensPaletteSet : TXA : AND.b #$FE : STA $04
|
||||
;LDA.b $8A : JSR OWDetermineScreensPaletteSet : TXA : AND.b #$FE
|
||||
;CMP.b $04 : BNE .skip_palettes
|
||||
BRA .vanilla+1
|
||||
|
||||
.vanilla
|
||||
PLP
|
||||
LDA.b $05 : AND.b #$3F : BEQ .skip_palettes ; what we
|
||||
LDA.b $8A : AND.b #$BF : BNE .change_palettes ; wrote over, kinda
|
||||
.skip_palettes
|
||||
SEC : RTL ; mosaic transition occurs
|
||||
.change_palettes
|
||||
CLC : RTL
|
||||
}
|
||||
OWAdjustExitPosition:
|
||||
{
|
||||
LDA.w $06FC : CMP.b #$60 : BEQ .stone_bridge
|
||||
@@ -1287,7 +1517,7 @@ 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 $0f70, $0fa8, $0038, $0f8c, $3a3a, $0000, $0000, $001f
|
||||
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
|
||||
@@ -1362,7 +1592,7 @@ 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 $0f70, $0fa8, $0038, $0f8c, $3039, $0000, $0000, $0020
|
||||
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
|
||||
@@ -1513,7 +1743,7 @@ db $18, $a8, $10, $b2, $00, $20
|
||||
db $18, $36, $08, $35, $00, $20
|
||||
db $1a, $8a, $10, $42, $00, $20
|
||||
db $1a, $1d, $08, $b2, $00, $20
|
||||
db $ff, $77, $04, $35, $00, $20 ; pre aga ONLY ; hijacked murahdahla bonk tree
|
||||
;db $1a, $77, $04, $35, $00, $20 ; pre aga ONLY ; hijacked murahdahla bonk tree
|
||||
db $1b, $46, $10, $b1, $00, $10
|
||||
db $1d, $6b, $10, $b1, $00, $20
|
||||
db $1e, $72, $10, $b2, $00, $20
|
||||
@@ -1524,6 +1754,7 @@ db $2e, $9c, $10, $b2, $00, $20
|
||||
db $2e, $b4, $08, $b0, $00, $20
|
||||
db $32, $29, $10, $42, $00, $20
|
||||
db $32, $9a, $08, $b2, $00, $20
|
||||
;db $34, $xx, $10, $xx, $00, $1c ; pre aga ONLY
|
||||
db $42, $66, $10, $b2, $00, $20
|
||||
db $51, $08, $10, $b2, $00, $04
|
||||
db $51, $09, $08, $b2, $00, $04
|
||||
@@ -1539,6 +1770,8 @@ db $6e, $8c, $10, $35, $00, $10
|
||||
db $6e, $90, $08, $b0, $00, $10
|
||||
db $6e, $a4, $04, $b1, $00, $10
|
||||
db $74, $4e, $10, $b1, $00, $1c
|
||||
UWBonkPrizeData:
|
||||
db $ff, $00, $02, $b5, $00, $08
|
||||
|
||||
; temporary fix - murahdahla replaces one of the bonk tree prizes
|
||||
; so we copy the sprite table here and update the pointer
|
||||
|
||||
@@ -33,6 +33,7 @@ QuickSwap:
|
||||
CPX.b #$01 : BEQ + ; bow
|
||||
CPX.b #$05 : BEQ + ; powder
|
||||
CPX.b #$0D : BEQ + ; flute
|
||||
CPX.b #$0E : BEQ + ; bug net
|
||||
CPX.b #$10 : BEQ + ; bottle
|
||||
BRA .store
|
||||
+ STX $0202 : JSL ProcessMenuButtons_y_pressed
|
||||
|
||||
@@ -24,7 +24,12 @@ StoreBombCount:
|
||||
.infinite
|
||||
PLA : LDA.b #$01 : RTL
|
||||
.finite
|
||||
PLA : STA BombsEquipment
|
||||
PLA : STA.l BombsEquipment
|
||||
BNE .done
|
||||
LDA.l ItemOnB : CMP #$04 : BNE .done
|
||||
LDA.b #$00 : STA.l ItemOnB
|
||||
.done
|
||||
LDA.l BombsEquipment
|
||||
RTL
|
||||
SearchForEquippedItem:
|
||||
LDA InfiniteBombsModifier : BEQ +
|
||||
|
||||
@@ -4,7 +4,6 @@
|
||||
;--------------------------------------------------------------------------------
|
||||
!BIGRAM = "$7EC900";
|
||||
;--------------------------------------------------------------------------------
|
||||
!SPRITE_OAM = "$7EC025"
|
||||
; A = Tile ID
|
||||
macro UploadOAM(dest)
|
||||
PHA : PHP
|
||||
@@ -770,8 +769,6 @@ RTS
|
||||
;--------------------------------------------------------------------------------
|
||||
;!SHOP_TYPE = "$7F5051"
|
||||
;!SHOP_INVENTORY = "$7F5052"
|
||||
!SPRITE_OAM = "$7EC025"
|
||||
!REDRAW = "$7F5000"
|
||||
Shopkeeper_DrawItems:
|
||||
PHB : PHK : PLB
|
||||
PHX : PHY
|
||||
@@ -787,14 +784,6 @@ Shopkeeper_DrawItems:
|
||||
+ CMP.b #$01 : BNE + : ++
|
||||
JSR.w Shopkeeper_DrawNextItem
|
||||
+
|
||||
LDA $A0 : CMP.b #$09 : BNE + ; render powder slot if potion shop
|
||||
LDA !REDRAW : BNE + ; if not redrawing
|
||||
LDA $02DA : BNE + ; if not buying item
|
||||
LDA $7F505E : BEQ + ; if potion slot filled
|
||||
LDA $0ABF : BEQ + ; haven't left the room
|
||||
LDA NpcFlags+1 : AND.b #$20 : BNE +
|
||||
LDX.b #$0C : LDY.b #$03 : JSR.w Shopkeeper_DrawNextItem
|
||||
+
|
||||
PLY : PLX
|
||||
PLB
|
||||
RTS
|
||||
@@ -820,14 +809,59 @@ Shopkeeper_DrawNextItem:
|
||||
SEP #$20 ; set 8-bit accumulator
|
||||
PLY
|
||||
|
||||
STZ $0E ; $0E will be used temporarily to store a non-zero value if VRAM slot is in OAM1
|
||||
PHX : LDA #0 : XBA : TXA : LSR #2 : TAX : LDA.l !SHOP_INVENTORY_DISGUISE, X : PLX : CMP #$0 : BNE ++
|
||||
LDA.l !SHOP_INVENTORY, X ; get item palette
|
||||
LDA.l !SHOP_INVENTORY, X
|
||||
++
|
||||
CMP.b #$2E : BNE + : BRA .potion
|
||||
+ CMP.b #$2F : BNE + : BRA .potion
|
||||
+ CMP.b #$30 : BEQ .potion
|
||||
CMP.b #$2E : BNE + : JMP .potion
|
||||
+ CMP.b #$2F : BNE + : JMP .potion
|
||||
+ CMP.b #$30 : BNE + : JMP .potion
|
||||
+ CMP.b #$B1 : BNE + : BRA .apple
|
||||
+ CMP.b #$B2 : BNE + : BRA .fairy
|
||||
+ CMP.b #$B5 : BNE + : BRA .goodbee
|
||||
+ CMP.b #$34 : BCC + : CMP.b #$36+1 : BCS +
|
||||
BRA .rupee
|
||||
+
|
||||
.normal
|
||||
LDA.w .tile_indices, Y : BRA + ; get item gfx index
|
||||
.rupee
|
||||
LDA.b #$0B ; rupee is #$0B because it's already there in VRAM
|
||||
STA.b $0E
|
||||
BRA .vramLoc
|
||||
.fairy
|
||||
REP #$20
|
||||
LDA.b $1A : SEC : SBC.w #$10 : AND.w #$0020 : BEQ ++ ; alternate every 32 frames
|
||||
LDA.l !SPRITE_OAM+2 : SEC : SBC.w #$02 ; move fairy up 2 pixels
|
||||
STA.l !SPRITE_OAM+2
|
||||
++
|
||||
SEP #$20
|
||||
LDA.b $1A : AND.b #$20 : BEQ ++ ; alternate every 32 frames
|
||||
LDA.b #$EC ; use other fairy GFX
|
||||
STA.b $0E
|
||||
BRA .vramLoc
|
||||
++
|
||||
LDA.b #$EA ; fairy is #$EA/EC because it's already there in VRAM
|
||||
STA.b $0E
|
||||
BRA .vramLoc
|
||||
.goodbee
|
||||
REP #$20
|
||||
LDA.b $1A : SEC : SBC.w #$10 : AND.w #$0020 : BEQ ++ ; alternate every 32 frames
|
||||
LDA.l !SPRITE_OAM+2 : SEC : SBC.w #$02 ; move bee up 2 pixels
|
||||
STA.l !SPRITE_OAM+2
|
||||
++
|
||||
SEP #$20
|
||||
LDA.b $1A : AND.b #$20 : BEQ ++ ; alternate every 32 frames
|
||||
LDA.b #$D4 ; use other bee GFX
|
||||
STA.b $0E
|
||||
BRA .vramLoc
|
||||
++
|
||||
LDA.b #$E4 ; good bee is #$E4/D4 because it's already there in VRAM
|
||||
STA.b $0E
|
||||
BRA .vramLoc
|
||||
.apple
|
||||
LDA.b #$E5 ; apple is #$E5 because it's already there in VRAM
|
||||
STA.b $0E
|
||||
BRA .vramLoc
|
||||
.potion
|
||||
LDA.b #$C0 ; potion is #$C0 because it's already there in VRAM
|
||||
+
|
||||
@@ -839,6 +873,7 @@ Shopkeeper_DrawNextItem:
|
||||
XBA
|
||||
|
||||
AND #$FE
|
||||
.vramLoc
|
||||
STA.l !SPRITE_OAM+4
|
||||
|
||||
PHX : LDA #0 : XBA : TXA : LSR #2 : TAX : LDA.l !SHOP_INVENTORY_DISGUISE, X : PLX : CMP #$0 : BNE ++
|
||||
@@ -846,11 +881,13 @@ Shopkeeper_DrawNextItem:
|
||||
++
|
||||
JSL.l GetSpritePalette : STA.l !SPRITE_OAM+5
|
||||
|
||||
LDA.w .tile_indices, Y : AND.b #$01 : BEQ +; get tile index sheet
|
||||
LDA.b $0E : BNE .oam1 ; item uses VRAM in OAM1
|
||||
LDA.w .tile_indices, Y : AND.b #$01 : BEQ ++ ; get tile index sheet
|
||||
.oam1
|
||||
LDA.l !SPRITE_OAM+5
|
||||
ORA.b #$1
|
||||
STA.l !SPRITE_OAM+5
|
||||
+
|
||||
++
|
||||
|
||||
LDA.b #$00 : STA.l !SPRITE_OAM+6
|
||||
|
||||
@@ -867,6 +904,10 @@ Shopkeeper_DrawNextItem:
|
||||
LDA.b #$00
|
||||
STA.l !SPRITE_OAM+7
|
||||
JSR.w PrepNarrowLower
|
||||
LDA.b $0E : AND.b #$0F : CMP.b #$04 : BNE +
|
||||
; special exception for bee gfx, need top tile to be blank
|
||||
LDA.b #$7C : STA.l !SPRITE_OAM+4
|
||||
+
|
||||
LDA.b #$02
|
||||
++
|
||||
PHX : PHA : LDA !SCRATCH_TEMP_X : TAX : PLA : JSR.w RequestItemOAM : PLX
|
||||
|
||||
@@ -10,7 +10,7 @@ DamageClassCalc:
|
||||
JSL Ganon_CheckAncillaVulnerability
|
||||
RTL
|
||||
+
|
||||
LDA SpecialWeapons : CMP #$06 : BEQ .cane_immune ; only crystal switches in bee mode
|
||||
LDA SpecialWeapons : AND.b #$7F : CMP #$06 : BEQ .cane_immune ; only crystal switches in bee mode
|
||||
PLA
|
||||
CMP #$01 : BEQ .red_cane
|
||||
CMP #$2C : BEQ .red_cane
|
||||
@@ -19,17 +19,15 @@ DamageClassCalc:
|
||||
BRA .not_cane_or_beam
|
||||
.red_cane
|
||||
PHA
|
||||
LDA SpecialWeapons : CMP #$01 : BEQ .cane_immune
|
||||
CMP #$03 : BEQ .cane_immune
|
||||
CMP #$04 : BEQ .special_cane
|
||||
CMP #$05 : BEQ .special_cane
|
||||
LDA SpecialWeapons : AND.b #$7F : CMP.b #$04 : BEQ .special_cane
|
||||
CMP.b #$05 : BEQ .special_cane
|
||||
LDA SpecialWeapons : AND.b #$80 : BNE .cane_immune
|
||||
BRA .normal
|
||||
.blue_cane
|
||||
PHA
|
||||
LDA SpecialWeapons : CMP #$01 : BEQ .cane_immune
|
||||
CMP #$03 : BEQ .special_cane
|
||||
CMP #$04 : BEQ .cane_immune
|
||||
CMP #$05 : BEQ .special_cane
|
||||
LDA SpecialWeapons : AND.b #$7F : CMP.b #$03 : BEQ .special_cane
|
||||
CMP.b #$05 : BEQ .special_cane
|
||||
LDA SpecialWeapons : AND.b #$80 : BNE .cane_immune
|
||||
BRA .normal
|
||||
.cane_immune
|
||||
LDA $0E20, X : CMP.b #$1E : BEQ .normal ; crystal switch
|
||||
@@ -45,7 +43,7 @@ DamageClassCalc:
|
||||
RTL
|
||||
.beam
|
||||
PHA
|
||||
LDA SpecialWeapons : CMP #$02 : BNE .normal
|
||||
LDA SpecialWeapons : AND.b #$7F : CMP.b #$02 : BNE .normal
|
||||
PLA
|
||||
LDA #$05
|
||||
RTL
|
||||
@@ -53,7 +51,7 @@ DamageClassCalc:
|
||||
PLA
|
||||
.not_cane_or_beam
|
||||
CMP #$07 : BNE .no_change
|
||||
LDA SpecialWeapons : CMP #$01 : BNE .normal_bombs
|
||||
LDA SpecialWeapons : AND.b #$7F : CMP #$01 : BNE .normal_bombs
|
||||
LDA SpecialWeaponLevel : BEQ .normal_bombs
|
||||
LDA $0E20, X : CMP.b #$D6 : BEQ .unstunned_ganon
|
||||
CMP.b #$D7 : BEQ .stunned_ganon
|
||||
@@ -103,7 +101,7 @@ DamageClassCalc:
|
||||
RTL
|
||||
.actual_silver_arrows
|
||||
LDA $0E20, X : CMP.b #$D7 : BNE +
|
||||
LDA SpecialWeapons : CMP #$01 : BEQ .normal_arrows
|
||||
LDA SpecialWeapons : AND.b #$7F : CMP #$01 : BEQ .normal_arrows
|
||||
LDA #$20 : STA $0F10, X
|
||||
+
|
||||
LDA #$09
|
||||
@@ -125,21 +123,21 @@ Utility_CheckAncillaOverlapWithSprite:
|
||||
JSL !UTILITY_CHECK_IF_HIT_BOXES_OVERLAP_LONG
|
||||
RTL
|
||||
.giant_moldorm
|
||||
LDA $0E10, Y : BNE .ignore_collision ; Moldy can have little a I-Frames, as a treat
|
||||
LDA.l SpecialWeapons : CMP #$01 : BNE ++
|
||||
LDA $0C4A, X : CMP #$07 : BEQ .check_collision_moldorm
|
||||
LDA.w $0E10, Y : BNE .ignore_collision ; Moldy can have little a I-Frames, as a treat
|
||||
LDA.l SpecialWeapons : AND.b #$7F : CMP.b #$01 : BNE ++
|
||||
LDA.w $0C4A, X : CMP.b #$07 : BEQ .check_collision_moldorm
|
||||
BRA .ignore_collision ; don't collide with non-bombs
|
||||
++ : LDA.l SpecialWeapons : CMP #$03 : BNE ++
|
||||
LDA $0C4A, X : CMP #$31 : BEQ .check_collision_moldorm
|
||||
++ : CMP.b #$03 : BNE ++
|
||||
LDA.w $0C4A, X : CMP.b #$31 : BEQ .check_collision_moldorm
|
||||
BRA .ignore_collision ; don't collide with non-byrna
|
||||
++ : LDA.l SpecialWeapons : CMP #$04 : BNE ++
|
||||
LDA $0C4A, X : CMP #$01 : BEQ .check_collision_moldorm
|
||||
CMP #$2C : BEQ .check_collision_moldorm
|
||||
++ : CMP.b #$04 : BNE ++
|
||||
LDA.w $0C4A, X : CMP.b #$01 : BEQ .check_collision_moldorm
|
||||
CMP.b #$2C : BEQ .check_collision_moldorm
|
||||
BRA .ignore_collision ; don't collide with non-somaria
|
||||
++ : LDA.l SpecialWeapons : CMP #$05 : BNE .ignore_collision
|
||||
LDA $0C4A, X : CMP #$01 : BEQ .check_collision_moldorm
|
||||
CMP #$2C : BEQ .check_collision_moldorm
|
||||
CMP #$31 : BEQ .check_collision_moldorm
|
||||
++ : CMP.b #$05 : BNE .ignore_collision
|
||||
LDA.w $0C4A, X : CMP.b #$01 : BEQ .check_collision_moldorm
|
||||
CMP.b #$2C : BEQ .check_collision_moldorm
|
||||
CMP.b #$31 : BEQ .check_collision_moldorm
|
||||
BRA .ignore_collision ; don't collide with non-canes
|
||||
|
||||
.check_collision_moldorm
|
||||
@@ -152,20 +150,20 @@ Utility_CheckAncillaOverlapWithSprite:
|
||||
RTL
|
||||
|
||||
.trinexx
|
||||
LDA.l SpecialWeapons : CMP #$01 : BNE ++
|
||||
LDA $0C4A, X : CMP #$07 : BEQ .check_collision_trinexx
|
||||
LDA.l SpecialWeapons : AND.b #$7F : CMP.b #$01 : BNE ++
|
||||
LDA.w $0C4A, X : CMP.b #$07 : BEQ .check_collision_trinexx
|
||||
BRA .ignore_collision ; don't collide with non-bombs
|
||||
++ : LDA.l SpecialWeapons : CMP #$03 : BNE ++
|
||||
LDA $0C4A, X : CMP #$31 : BEQ .check_collision_trinexx
|
||||
++ : CMP.b #$03 : BNE ++
|
||||
LDA.w $0C4A, X : CMP.b #$31 : BEQ .check_collision_trinexx
|
||||
JMP .ignore_collision ; don't collide with non-byrna
|
||||
++ : LDA.l SpecialWeapons : CMP #$04 : BNE ++
|
||||
LDA $0C4A, X : CMP #$01 : BEQ .check_collision_trinexx
|
||||
CMP #$2C : BEQ .check_collision_trinexx
|
||||
++ : CMP.b #$04 : BNE ++
|
||||
LDA.w $0C4A, X : CMP.b #$01 : BEQ .check_collision_trinexx
|
||||
CMP.b #$2C : BEQ .check_collision_trinexx
|
||||
JMP .ignore_collision ; don't collide with non-somaria
|
||||
++ : LDA.l SpecialWeapons : CMP #$05 : BNE .ignore_collision
|
||||
LDA $0C4A, X : CMP #$01 : BEQ .check_collision_trinexx
|
||||
CMP #$2C : BEQ .check_collision_trinexx
|
||||
CMP #$31 : BEQ .check_collision_trinexx
|
||||
++ : CMP #$05 : BNE .ignore_collision
|
||||
LDA.w $0C4A, X : CMP.b #$01 : BEQ .check_collision_trinexx
|
||||
CMP.b #$2C : BEQ .check_collision_trinexx
|
||||
CMP.b #$31 : BEQ .check_collision_trinexx
|
||||
JMP .ignore_collision ; don't collide with non-canes
|
||||
|
||||
.check_collision_trinexx
|
||||
@@ -242,45 +240,34 @@ SetUpMoldormHitbox:
|
||||
;--------------------------------------------------------------------------------
|
||||
; start with X = ancilla index, Y = sprite index
|
||||
Utility_CheckHelmasaurKingCollision:
|
||||
LDA.l SpecialWeapons : CMP #$01 : BNE ++
|
||||
LDA $0C4A, X : CMP #$07 : BEQ .collide
|
||||
LDA.l SpecialWeapons : AND.b #$7F : CMP.b #$01 : BNE ++
|
||||
LDA.w $0C4A, X : CMP.b #$07 : BEQ .collide
|
||||
BRA .normal ; normal behavior with non-bombs
|
||||
++ : LDA.l SpecialWeapons : CMP #$03 : BNE ++
|
||||
LDA $0C4A, X : CMP #$31 : BEQ .collide
|
||||
++ : CMP.b #$03 : BNE ++
|
||||
LDA.w $0C4A, X : CMP.b #$31 : BEQ .collide
|
||||
BRA .normal ; normal behavior with non-byrna
|
||||
++ : LDA.l SpecialWeapons : CMP #$04 : BNE ++
|
||||
LDA $0C4A, X : CMP #$01 : BEQ .collide
|
||||
CMP #$2C : BEQ .collide
|
||||
++ : CMP.b #$04 : BNE ++
|
||||
LDA.w $0C4A, X : CMP.b #$01 : BEQ .collide
|
||||
CMP.b #$2C : BEQ .collide
|
||||
BRA .normal ; normal behavior with non-somaria
|
||||
++ : LDA.l SpecialWeapons : CMP #$05 : BNE .normal
|
||||
LDA $0C4A, X : CMP #$01 : BEQ .collide
|
||||
CMP #$2C : BEQ .collide
|
||||
CMP #$31 : BEQ .collide
|
||||
++ : CMP.b #$05 : BNE .normal
|
||||
LDA.w $0C4A, X : CMP.b #$01 : BEQ .collide
|
||||
CMP.b #$2C : BEQ .collide
|
||||
CMP.b #$31 : BEQ .collide
|
||||
BRA .normal ; normal behavior with non-canes
|
||||
.collide
|
||||
CLC
|
||||
RTL
|
||||
.normal
|
||||
LDA $0DB0, Y : CMP.b #$03
|
||||
LDA.w $0DB0, Y : CMP.b #$03
|
||||
RTL
|
||||
; returns carry set if there is collision immunity
|
||||
;--------------------------------------------------------------------------------
|
||||
Utility_CheckHammerHelmasaurKingMask:
|
||||
LDA.l SpecialWeapons : CMP #$01 : BEQ .no_effect
|
||||
LDA $0301 : AND #$0A
|
||||
RTL
|
||||
.no_effect
|
||||
LDA #$00
|
||||
RTL
|
||||
;--------------------------------------------------------------------------------
|
||||
Utility_CheckImpervious:
|
||||
LDA $0E20, X : CMP.b #$CB : BNE .normal
|
||||
.trinexx
|
||||
LDA SpecialWeapons : CMP #$01 : BEQ +
|
||||
CMP #$03 : BEQ +
|
||||
CMP #$04 : BEQ +
|
||||
CMP #$05 : BEQ +
|
||||
CMP #$06 : BEQ .check_sidenexx
|
||||
LDA SpecialWeapons : AND.b #$7F : CMP.b #$06 : BEQ .check_sidenexx
|
||||
LDA SpecialWeapons : AND.b #$80 : BNE +
|
||||
BRA .normal
|
||||
+
|
||||
LDA $0301 : AND.b #$0A : BNE .impervious ; impervious to hammer
|
||||
@@ -294,12 +281,7 @@ Utility_CheckImpervious:
|
||||
LDA $0E20, X : CMP.b #$CC : BEQ .sidenexx : CMP.b #$CD : BEQ .sidenexx
|
||||
LDA $0301 : AND.b #$0A : BEQ .not_impervious ; normal behavior if not hammer
|
||||
JSL Ganon_CheckHammerVulnerability : BCS .not_impervious
|
||||
LDA SpecialWeapons : CMP #$01 : BEQ +
|
||||
CMP #$03 : BEQ +
|
||||
CMP #$04 : BEQ +
|
||||
CMP #$05 : BEQ +
|
||||
BRA .not_impervious
|
||||
+
|
||||
LDA SpecialWeapons : AND.b #$80 : BEQ .not_impervious
|
||||
LDA $0E20, X : CMP.b #$1E : BEQ .not_impervious ; crystal switch
|
||||
CMP.b #$40 : BEQ .not_impervious ; aga barrier
|
||||
BRA .impervious
|
||||
@@ -309,21 +291,11 @@ Utility_CheckImpervious:
|
||||
LDA #$01 : RTL
|
||||
.sidenexx
|
||||
LDA $0CAA, X : AND.b #$04 : BEQ .vulnerable
|
||||
LDA SpecialWeapons : CMP #$01 : BEQ +
|
||||
CMP #$03 : BEQ +
|
||||
CMP #$04 : BEQ +
|
||||
CMP #$05 : BEQ +
|
||||
BRA .not_impervious
|
||||
+
|
||||
LDA.l SpecialWeapons : AND.b #$80 : BEQ .not_impervious
|
||||
LDA $0CF2 : CMP #$06 : !BLT .impervious ; swords are ineffective
|
||||
BRA .not_impervious
|
||||
.vulnerable
|
||||
LDA SpecialWeapons : CMP #$01 : BEQ +
|
||||
CMP #$03 : BEQ +
|
||||
CMP #$04 : BEQ +
|
||||
CMP #$05 : BEQ +
|
||||
BRA .not_impervious
|
||||
+
|
||||
LDA.l SpecialWeapons : AND.b #$80 : BEQ .not_impervious
|
||||
LDA $0CF2 : CMP #$06 : !BGE .impervious ; non-swords are ineffective
|
||||
BRA .not_impervious
|
||||
; returns nonzero A if impervious
|
||||
@@ -332,11 +304,11 @@ Utility_CheckImpervious:
|
||||
; start with X = sprite index
|
||||
;--------------------------------------------------------------------------------
|
||||
AllowBombingMoldorm:
|
||||
LDA SpecialWeapons : CMP #$01 : BEQ .no_disable_projectiles
|
||||
CMP #$03 : BEQ .no_disable_projectiles
|
||||
CMP #$04 : BEQ .no_disable_projectiles
|
||||
CMP #$05 : BEQ .no_disable_projectiles
|
||||
CMP #$06 : BEQ .no_disable_projectiles
|
||||
LDA.l SpecialWeapons : AND.b #$7F : CMP.b #$01 : BEQ .no_disable_projectiles
|
||||
CMP.b #$03 : BEQ .no_disable_projectiles
|
||||
CMP.b #$04 : BEQ .no_disable_projectiles
|
||||
CMP.b #$05 : BEQ .no_disable_projectiles
|
||||
CMP.b #$06 : BEQ .no_disable_projectiles
|
||||
INC $0BA0, X
|
||||
.no_disable_projectiles
|
||||
JSL !SPRITE_INITIALIZED_SEGMENTED
|
||||
@@ -346,11 +318,11 @@ AllowBombingBarrier:
|
||||
; what we wrote over
|
||||
LDA $0D00, X : !SUB.b #$0C : STA $0D00, X
|
||||
LDA $0E20, X : CMP #$40 : BNE .disable_projectiles
|
||||
LDA SpecialWeapons : CMP #$01 : BEQ .no_disable_projectiles
|
||||
CMP #$03 : BEQ .no_disable_projectiles
|
||||
CMP #$04 : BEQ .no_disable_projectiles
|
||||
CMP #$05 : BEQ .no_disable_projectiles
|
||||
CMP #$06 : BEQ .no_disable_projectiles
|
||||
LDA.l SpecialWeapons : AND.b #$7F : CMP.b #$01 : BEQ .no_disable_projectiles
|
||||
CMP.b #$03 : BEQ .no_disable_projectiles
|
||||
CMP.b #$04 : BEQ .no_disable_projectiles
|
||||
CMP.b #$05 : BEQ .no_disable_projectiles
|
||||
CMP.b #$06 : BEQ .no_disable_projectiles
|
||||
.disable_projectiles
|
||||
INC $0BA0, X
|
||||
.no_disable_projectiles
|
||||
@@ -358,7 +330,7 @@ AllowBombingBarrier:
|
||||
;--------------------------------------------------------------------------------
|
||||
DrawBombInMenu:
|
||||
JSL LoadBombCount16 : AND.w #$00FF : BEQ .noBombs
|
||||
LDA SpecialWeapons : AND.w #$00FF : CMP.w #$0001 : BNE .vanillaBombs
|
||||
LDA SpecialWeapons : AND.w #$007F : CMP.w #$0001 : BNE .vanillaBombs
|
||||
LDA.l SpecialWeaponLevel : AND.w #$00FF : BEQ .noBombs : STA $02
|
||||
LDA.w #$FC81 : STA $04
|
||||
BRA .done
|
||||
@@ -373,10 +345,11 @@ DrawBombInMenu:
|
||||
RTL
|
||||
;--------------------------------------------------------------------------------
|
||||
DrawSwordInMenu:
|
||||
LDA SpecialWeapons : AND.w #$00FF : CMP.w #$0001 : BEQ .specialSword
|
||||
LDA SpecialWeapons : AND.w #$007F : CMP.w #$0001 : BEQ .specialSword
|
||||
CMP.w #$0003 : BEQ .specialSword
|
||||
CMP.w #$0004 : BEQ .specialSword
|
||||
CMP.w #$0005 : BEQ .specialSword
|
||||
CMP.w #$0008 : BEQ .specialSword
|
||||
LDA SwordEquipment : AND.w #$00FF : CMP.w #$00FF : BEQ .noSword
|
||||
.hasSword
|
||||
STA $02
|
||||
@@ -393,7 +366,7 @@ DrawSwordInMenu:
|
||||
;--------------------------------------------------------------------------------
|
||||
DrawBombInYBox:
|
||||
CPX.w #$0004 : BNE .done
|
||||
LDA SpecialWeapons : AND.w #$00FF : CMP.w #$0001 : BNE .vanilla
|
||||
LDA SpecialWeapons : AND.w #$007F : CMP.w #$0001 : BNE .vanilla
|
||||
LDA SpecialWeaponLevel : AND.w #$00FF : CLC : ADC.w #$00BD : BRA .done
|
||||
.vanilla
|
||||
LDA.w #$0001
|
||||
@@ -410,7 +383,7 @@ DrawBombOnHud:
|
||||
MVN $7E, $21
|
||||
PLB
|
||||
|
||||
LDA.l SpecialWeapons : AND.w #$00FF : CMP.w #$0001 : BNE .regularBombs
|
||||
LDA.l SpecialWeapons : AND.w #$007F : CMP.w #$0001 : BNE .regularBombs
|
||||
LDA.l SpecialWeaponLevel : AND.w #$00FF : ASL #2 : TAX
|
||||
LDA.l BombIcon, X : STA.l $7EC71A
|
||||
LDA.l BombIcon+2, X : STA.l $7EC71C
|
||||
@@ -420,7 +393,7 @@ DrawBombOnHud:
|
||||
BombSpriteColor:
|
||||
db $04, $08, $04, $02, $0A, $0A
|
||||
SetBombSpriteColor:
|
||||
LDA.l SpecialWeapons : CMP.b #$01 : BNE .normal
|
||||
LDA.l SpecialWeapons : AND.b #$7F : CMP.b #$01 : BNE .normal
|
||||
PHX
|
||||
LDA.l SpecialWeaponLevel
|
||||
TAX
|
||||
@@ -433,7 +406,7 @@ SetBombSpriteColor:
|
||||
RTL
|
||||
;--------------------------------------------------------------------------------
|
||||
StoreSwordDamage:
|
||||
LDA.l SpecialWeapons : CMP #$02 : BEQ +
|
||||
LDA.l SpecialWeapons : AND.b #$7F : CMP #$02 : BEQ +
|
||||
LDA.l $06ED39, X : RTL
|
||||
+
|
||||
LDA #$05
|
||||
@@ -447,7 +420,9 @@ BeeDamageClass:
|
||||
db $FF, $01, $01, $FF, $FF
|
||||
;--------------------------------------------------------------------------------
|
||||
CheckDetonateBomb:
|
||||
LDA.l SpecialWeapons : CMP.b #$01 : BNE .not_bomb_mode
|
||||
LDA.l SpecialWeapons : AND.b #$7F : CMP.b #$01 : BEQ .detonate_bombs
|
||||
CMP.b #$06 : BEQ .release_bee
|
||||
CLC : RTL
|
||||
.detonate_bombs
|
||||
LDX.b #09
|
||||
.check_ancilla
|
||||
@@ -459,15 +434,7 @@ CheckDetonateBomb:
|
||||
.next_ancilla
|
||||
DEX
|
||||
BPL .check_ancilla
|
||||
BRA .done
|
||||
.not_bomb_mode
|
||||
LDA.l SpecialWeapons : CMP.b #$06 : BEQ .release_bee
|
||||
CMP.b #$07 : BNE .done
|
||||
LDA.l HammerEquipment : BEQ .done
|
||||
LDA.b $3A : ORA.b #$40 : STA.b $3A
|
||||
LDA.b #$04 : STA.w $0304
|
||||
JSL Link_UseHammerLong
|
||||
BRA .done
|
||||
JMP .done
|
||||
.release_bee
|
||||
LDX.w $0202
|
||||
LDA.l BeeDamageClass, X : CMP.b #$FF : BEQ .nope
|
||||
@@ -491,13 +458,11 @@ CheckDetonateBomb:
|
||||
ORA.w $0CF8
|
||||
STA.w $012E
|
||||
.done
|
||||
; what we wrote over
|
||||
LDA.b #$80
|
||||
TSB.b $3A
|
||||
SEC
|
||||
RTL
|
||||
;--------------------------------------------------------------------------------
|
||||
SetBeeType:
|
||||
LDA.l SpecialWeapons : CMP.b #$06 : BEQ .bee_mode
|
||||
LDA.l SpecialWeapons : AND.b #$7F : CMP.b #$06 : BEQ .bee_mode
|
||||
LDX.w $0202
|
||||
.check_bee_type
|
||||
LDA.l $7EF33F, X
|
||||
@@ -517,7 +482,7 @@ SetBeeType:
|
||||
BRA .regular_bee
|
||||
;--------------------------------------------------------------------------------
|
||||
ArrghusBoing:
|
||||
LDA.l SpecialWeapons : CMP.b #$06 : BNE .done
|
||||
LDA.l SpecialWeapons : AND.b #$7F : CMP.b #$06 : BNE .done
|
||||
LDA.w $0F60, X : AND.b #$BF : STA.w $0F60, X
|
||||
.done
|
||||
; what we wrote over
|
||||
@@ -537,7 +502,7 @@ LDA.w $0F00,Y
|
||||
BNE .unsuitable_target
|
||||
|
||||
; in bee-mode skip targets that the bee can't hurt
|
||||
LDA.l SpecialWeapons : CMP.b #$06 : BNE +
|
||||
LDA.l SpecialWeapons : AND.b #$7F : CMP.b #$06 : BNE +
|
||||
JSR BeeCheckDamage
|
||||
CMP.b #$00 : BEQ .unsuitable_target
|
||||
+
|
||||
@@ -552,7 +517,7 @@ BNE .unsuitable_target
|
||||
LDA.w $0F60,Y
|
||||
AND.b #$40
|
||||
BEQ +
|
||||
LDA.l SpecialWeapons : CMP.b #$06 : BNE .unsuitable_target
|
||||
LDA.l SpecialWeapons : AND.b #$7F : CMP.b #$06 : BNE .unsuitable_target
|
||||
; in bee mode, allow targetting anti-fairies, bunny beams, and keese
|
||||
LDA.w $0E20,Y
|
||||
CMP.b #$15 : BEQ + ; anti-fairy
|
||||
@@ -594,12 +559,42 @@ SEP #$10
|
||||
PLP : PLX
|
||||
RTS
|
||||
;--------------------------------------------------------------------------------
|
||||
NoSwingHammerB:
|
||||
LDA.l SpecialWeapons : CMP.b #$07 : BNE .normal
|
||||
LDA.l HammerEquipment : BEQ .normal
|
||||
SEC : RTL
|
||||
.normal ; what we wrote over
|
||||
INC.b $3C
|
||||
LDA.b $3C
|
||||
CMP.b #$09
|
||||
CheckBugNet:
|
||||
LDA.w $037A : AND.b #$10 : BEQ .done ; normal behavior if not bugnet
|
||||
PHP ; we want to preserve the carry bit
|
||||
LDA.l SpecialWeapons : AND.b #$7F : CMP.b #$08 : BNE .return_10 ; normal behavior if not bugnet mode
|
||||
.bugnet_mode
|
||||
LDA.w $0E20, X : CMP.b #$E3 : BEQ .return_10 ; normal behavior if fairy
|
||||
CMP.b #$79 : BEQ .return_10 ; normal behavior if bee
|
||||
CMP.b #$B2 : BEQ .return_10 ; normal behavior if bee
|
||||
PLP : LDA.b #$00 : RTL
|
||||
.return_10
|
||||
PLP : LDA.b #$10
|
||||
.done
|
||||
RTL
|
||||
;--------------------------------------------------------------------------------
|
||||
SetHammerClass:
|
||||
LDA.l SpecialWeapons : AND.b #$7F : CMP.b #$08 : BNE .normal ; normal behavior if not bugnet mode
|
||||
LDA.w $037A : AND.b #$10 : BEQ .normal ; normal behavior if not bugnet
|
||||
LDA 4, S : TAX ; get sprite index off of stack
|
||||
LDA.w $0E20, X : CMP.b #$88 : BNE .not_mothula
|
||||
LDA.l SpecialWeaponLevel
|
||||
CMP #$04 : !BGE .fix_mothula
|
||||
BRA .done
|
||||
.fix_mothula
|
||||
LDA #$03
|
||||
BRA .done
|
||||
.not_mothula
|
||||
LDA.l SpecialWeaponLevel
|
||||
.done
|
||||
STA.w $0CF2
|
||||
RTL
|
||||
.normal
|
||||
LDA.w $0301
|
||||
AND.b #$0A
|
||||
BEQ .not_hammer
|
||||
LDA.b #$03
|
||||
STA.w $0CF2
|
||||
.not_hammer
|
||||
RTL
|
||||
;--------------------------------------------------------------------------------
|
||||
|
||||
14
sram.asm
14
sram.asm
@@ -168,22 +168,24 @@ CurrentGenericKeys: skip 1 ; Generic small keys
|
||||
;================================================================================
|
||||
; Tracking & Indicators ($7EF38C - $7EF3F0)
|
||||
;--------------------------------------------------------------------------------
|
||||
InventoryTracking: skip 2 ; b r m p n s k f - - - - - - o q (bitfield)
|
||||
InventoryTracking: skip 2 ; - - - - - - o q b r m p n s k f (bitfield)
|
||||
; b = Blue Boomerang | r = Red Boomerang | m = Mushroom Current
|
||||
; p = Magic Powder | n = Mushroom Past | s = Shovel
|
||||
; k = Inactive Flute | f = Active Flute | o = Any bomb acquired
|
||||
; q = Quickswap locked
|
||||
BowTracking: skip 1 ; b s p - - - - - (bitfield)
|
||||
; b = Bow | s = Silver Arrows Upgrade | p = Second Progressive Bow
|
||||
BowTracking: skip 2 ; - - - - - - - - b s p f - - - - (bitfield)
|
||||
; b = Any Bow | s = Silver Arrows Upgrade | p = Second Progressive Bow
|
||||
; f = First progressive bow
|
||||
; The front end writes two distinct progressive bow items. p
|
||||
; indicates whether the "second" has been found independent of
|
||||
; the first
|
||||
SpecialWeaponLevel: skip 1 ; Keeps track of level of weapon in bomb-only and cane-only modes
|
||||
ItemLimitCounts: skip 16 ; Keeps track of limited non-progressive items such as lamp.
|
||||
; See: ItemSubstitutionRules in tables.asm
|
||||
; Right now this is only used for three items but extra space is
|
||||
; reserved
|
||||
skip 37 ; Unused
|
||||
skip 35 ; Unused
|
||||
SpecialWeaponLevel: skip 1 ; Keeps track of level of weapon in item modes
|
||||
ItemOnB: skip 1 ; same table as $0202; $01 = arrows .. $14 = mirror
|
||||
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
|
||||
@@ -549,7 +551,7 @@ endmacro
|
||||
;--------------------------------------------------------------------------------
|
||||
%assertSRAM(InventoryTracking, $7EF38C)
|
||||
%assertSRAM(BowTracking, $7EF38E)
|
||||
%assertSRAM(SpecialWeaponLevel, $7EF38F)
|
||||
%assertSRAM(SpecialWeaponLevel, $7EF3C3)
|
||||
%assertSRAM(ItemLimitCounts, $7EF390)
|
||||
;--------------------------------------------------------------------------------
|
||||
%assertSRAM(GameCounter, $7EF3FF)
|
||||
|
||||
@@ -7,8 +7,7 @@
|
||||
;--------------------------------------------------------------------------------
|
||||
IncrementBonkCounter:
|
||||
LDA StatsLocked : BNE +
|
||||
LDA BonkCounter : INC
|
||||
CMP.b #100 : BEQ + ; decimal 100
|
||||
LDA BonkCounter : INC : BEQ + ; overflow
|
||||
STA BonkCounter
|
||||
+
|
||||
RTL
|
||||
@@ -328,9 +327,7 @@ RTL
|
||||
IndoorTileTransitionCounter:
|
||||
JMP StatTransitionCounter
|
||||
;--------------------------------------------------------------------------------
|
||||
!REDRAW = "$7F5000"
|
||||
IndoorSubtileTransitionCounter:
|
||||
LDA.b #$01 : STA !REDRAW ; set redraw flag for items
|
||||
STZ $0646 ; stuff we wrote over
|
||||
STZ $0642
|
||||
JMP StatTransitionCounter
|
||||
|
||||
@@ -772,44 +772,3 @@ endif
|
||||
%emptyline()
|
||||
|
||||
;---------------------------------------------------------------------------------------------------
|
||||
|
||||
!FIRST_SWORD_X = 19
|
||||
!FIRST_SWORD_Y = 310
|
||||
!PEGASUS_BOOTS_X = 19
|
||||
!PEGASUS_BOOTS_Y = 313
|
||||
!FLUTE_X = 19
|
||||
!FLUTE_Y = 316
|
||||
!MIRROR_X = 19
|
||||
!MIRROR_Y = 319
|
||||
!SWORDLESS_X = 23
|
||||
!SWORDLESS_Y = 327
|
||||
!FIGHTERS_SWORD_X = 23
|
||||
!FIGHTERS_SWORD_Y = 330
|
||||
!MASTER_SWORD_X = 23
|
||||
!MASTER_SWORD_Y = 333
|
||||
!TEMPERED_SWORD_X = 23
|
||||
!TEMPERED_SWORD_Y = 336
|
||||
!GOLD_SWORD_X = 23
|
||||
!GOLD_SWORD_Y = 339
|
||||
!DAMAGETAKEN_X = 26
|
||||
!DAMAGETAKEN_Y = 346
|
||||
!MAGICUSED_X = 26
|
||||
!MAGICUSED_Y = 349
|
||||
!BONKS_X = 26
|
||||
!BONKS_Y = 352
|
||||
!BOMBS_X = 26
|
||||
!BOMBS_Y = 355
|
||||
!SAVE_AND_QUITS_X = 26
|
||||
!SAVE_AND_QUITS_Y = 358
|
||||
!DEATHS_X = 26
|
||||
!DEATHS_Y = 361
|
||||
!FAERIE_REVIVALS_X = 26
|
||||
!FAERIE_REVIVALS_Y = 364
|
||||
!TOTAL_MENU_TIME_X = 19
|
||||
!TOTAL_MENU_TIME_Y = 367
|
||||
!TOTAL_LAG_TIME_X = 19
|
||||
!TOTAL_LAG_TIME_Y = 370
|
||||
!COLLECTION_RATE_X = 22
|
||||
!COLLECTION_RATE_Y = 380
|
||||
!TOTAL_TIME_X = 19
|
||||
!TOTAL_TIME_Y = 383
|
||||
|
||||
@@ -1,3 +1,44 @@
|
||||
!FIRST_SWORD_X = 19
|
||||
!FIRST_SWORD_Y = 310
|
||||
!PEGASUS_BOOTS_X = 19
|
||||
!PEGASUS_BOOTS_Y = 313
|
||||
!FLUTE_X = 19
|
||||
!FLUTE_Y = 316
|
||||
!MIRROR_X = 19
|
||||
!MIRROR_Y = 319
|
||||
!SWORDLESS_X = 23
|
||||
!SWORDLESS_Y = 327
|
||||
!FIGHTERS_SWORD_X = 23
|
||||
!FIGHTERS_SWORD_Y = 330
|
||||
!MASTER_SWORD_X = 23
|
||||
!MASTER_SWORD_Y = 333
|
||||
!TEMPERED_SWORD_X = 23
|
||||
!TEMPERED_SWORD_Y = 336
|
||||
!GOLD_SWORD_X = 23
|
||||
!GOLD_SWORD_Y = 339
|
||||
!DAMAGETAKEN_X = 26
|
||||
!DAMAGETAKEN_Y = 346
|
||||
!MAGICUSED_X = 26
|
||||
!MAGICUSED_Y = 349
|
||||
!BONKS_X = 26
|
||||
!BONKS_Y = 352
|
||||
!BOMBS_X = 26
|
||||
!BOMBS_Y = 355
|
||||
!SAVE_AND_QUITS_X = 26
|
||||
!SAVE_AND_QUITS_Y = 358
|
||||
!DEATHS_X = 26
|
||||
!DEATHS_Y = 361
|
||||
!FAERIE_REVIVALS_X = 26
|
||||
!FAERIE_REVIVALS_Y = 364
|
||||
!TOTAL_MENU_TIME_X = 19
|
||||
!TOTAL_MENU_TIME_Y = 367
|
||||
!TOTAL_LAG_TIME_X = 19
|
||||
!TOTAL_LAG_TIME_Y = 370
|
||||
!COLLECTION_RATE_X = 22
|
||||
!COLLECTION_RATE_Y = 380
|
||||
!TOTAL_TIME_X = 19
|
||||
!TOTAL_TIME_Y = 383
|
||||
|
||||
;(address, type, shiftRight, bits, digits, xPos, lineNumber)
|
||||
|
||||
%AddStat(SwordTime, 1, 0, 32, 4, !FIRST_SWORD_X, !FIRST_SWORD_Y)
|
||||
|
||||
@@ -60,11 +60,8 @@ LookupDamageLevel:
|
||||
LDA.l !StalfosBombDamage
|
||||
RTL
|
||||
+
|
||||
LDA SpecialWeapons : CMP #$01 : BEQ .bomb_table
|
||||
CMP #$02 : BEQ .pseudo_table
|
||||
CMP #$03 : BEQ .bomb_table
|
||||
CMP #$04 : BEQ .bomb_table
|
||||
CMP #$05 : BEQ .bomb_table
|
||||
LDA SpecialWeapons : AND.b #$7F : CMP.b #$02 : BEQ .pseudo_table
|
||||
LDA SpecialWeapons : AND.b #$80 : BNE .bomb_table
|
||||
%LookupDamageSubclass(Damage_Table) : RTL
|
||||
.bomb_table
|
||||
%LookupDamageSubclass(Damage_Table_Bombs) : RTL
|
||||
@@ -130,11 +127,12 @@ CheckTabletSword:
|
||||
LDA.l AllowHammerTablets : BEQ +
|
||||
LDA HammerEquipment : BNE .allow ; check for hammer
|
||||
+
|
||||
LDA.l SpecialWeapons : CMP #$01 : BEQ .check_special
|
||||
CMP #$03 : BEQ .check_special
|
||||
CMP #$04 : BEQ .check_special
|
||||
CMP #$05 : BEQ .check_special
|
||||
CMP #$06 : BEQ .allow
|
||||
LDA.l SpecialWeapons : AND.b #$7F : CMP.b #$01 : BEQ .check_special
|
||||
CMP.b #$03 : BEQ .check_special
|
||||
CMP.b #$04 : BEQ .check_special
|
||||
CMP.b #$05 : BEQ .check_special
|
||||
CMP.b #$06 : BEQ .allow
|
||||
CMP.b #$08 : BEQ .check_special
|
||||
BRA .normal
|
||||
.allow
|
||||
LDA.b #$02 : RTL
|
||||
@@ -148,8 +146,10 @@ GetSwordLevelForEvilBarrier:
|
||||
LDA.l AllowHammerEvilBarrierWithFighterSword : BEQ +
|
||||
LDA #$FF : RTL
|
||||
+
|
||||
LDA SwordEquipment
|
||||
RTL
|
||||
LDA.l SpecialWeapons : AND.b #$7F : CMP.b #$08 : BEQ +
|
||||
LDA.l SwordEquipment : RTL
|
||||
+
|
||||
LDA.l SpecialWeaponLevel : RTL
|
||||
;================================================================================
|
||||
CheckGanonHammerDamage:
|
||||
LDA.l HammerableGanon : BEQ +
|
||||
|
||||
37
tables.asm
37
tables.asm
@@ -98,29 +98,40 @@ db #$02 ; #$02 = Tempered Sword (default)
|
||||
;org $05EBD4 ; PC 0x2EBD4 - sprite_zelda.asm:23 - (LDA $7EF359 : CMP.b #$02 : BCS .hasMasterSword) - Zelda Spawnpoint Sword Check
|
||||
;db #$05 ; #$02 = Tempered Sword (default) - #$05 = All Swords
|
||||
;--------------------------------------------------------------------------------
|
||||
; 0x18002B- 0x18002C (Unused)
|
||||
; 0x18002B (Unused)
|
||||
;--------------------------------------------------------------------------------
|
||||
org $30802D ; PC 0x18003D
|
||||
org $30802C ; PC 0x18002C
|
||||
AllowedItemOnB:
|
||||
db #$00
|
||||
; $00 = None (default)
|
||||
; $01 - $20 = Only selected item
|
||||
; $FF = Any valid
|
||||
;--------------------------------------------------------------------------------
|
||||
org $30802D ; PC 0x18002D
|
||||
ChallengeModes:
|
||||
; ---- ---i
|
||||
; i: Permanent Ice Physics
|
||||
db #$00 ; #$00 = Default behavior;
|
||||
;--------------------------------------------------------------------------------
|
||||
org $30802E ; PC 0x18003E
|
||||
org $30802E ; PC 0x18002E
|
||||
GanonVulnerabilityItem:
|
||||
db #$00 ; #$00 = Default behavior (silver arrows)
|
||||
;--------------------------------------------------------------------------------
|
||||
org $30802F ; PC 0x18003F
|
||||
org $30802F ; PC 0x18002F
|
||||
SpecialWeapons:
|
||||
db #$00
|
||||
; s - - - m m m m (bitfield)
|
||||
; s - only swords damage can hurt enemies
|
||||
; m - special weapon mode
|
||||
; $00 = Off (default)
|
||||
; $01 = Bomb-Only mode
|
||||
; $01 = Bomb mode
|
||||
; $02 = Pseudosword
|
||||
; $03 = Byrna-Only mode
|
||||
; $04 = Somaria-Only mode
|
||||
; $05 = Canes-Only mode
|
||||
; $03 = Byrna mode
|
||||
; $04 = Somaria mode
|
||||
; $05 = Canes mode
|
||||
; $06 = Bee mode
|
||||
; $07 = Hammer on B (for use with swordless)
|
||||
; $07 = Unused
|
||||
; $08 = Bugnet mode
|
||||
;--------------------------------------------------------------------------------
|
||||
org $308030 ; PC 0x180030
|
||||
EnableSRAMTrace:
|
||||
@@ -1442,8 +1453,9 @@ db $04
|
||||
;B3 - Chicken
|
||||
;B4 - Big Magic
|
||||
;B5 - 5 Arrows
|
||||
;B6 - Progressive Bomb
|
||||
;B7 - Progressive Cane
|
||||
;C0 - Progressive Bomb
|
||||
;C1 - Progressive Cane
|
||||
;C2 - Progressive Bug Net
|
||||
;================================================================================
|
||||
;;Residual Portal
|
||||
;org $0283E0 ; PC 0x103E0 (Bank02.asm:816) (BNE)
|
||||
@@ -1510,8 +1522,9 @@ dw #9999 ; Rupee Limit
|
||||
; $2F8000 - $2F83FF - RNG Block
|
||||
;================================================================================
|
||||
; $7EC025 - $7EC034 - Item OAM Table
|
||||
; $7EC035 - $7EC044 - Dynamic Item OAM Table
|
||||
;================================================================================
|
||||
; $7F5000 - Redraw Flag
|
||||
; $7F5000 - FREE (Old Global Redraw Flag)
|
||||
; $7F5001 - Flipper Softlock Possible
|
||||
; $7F5002 - L/R Rotate
|
||||
; $7F5003 - HexToDec 1st Digit
|
||||
|
||||
@@ -34,7 +34,6 @@ SpawnTabletItem:
|
||||
JSL.l HeartPieceGetPlayer : STA !MULTIWORLD_SPRITEITEM_PLAYER_ID
|
||||
JSL.l LoadOutdoorValue
|
||||
PHA
|
||||
JSL.l PrepDynamicTile
|
||||
|
||||
LDA.b #$01 : STA !FORCE_HEART_SPAWN : STA !SKIP_HEART_SAVE
|
||||
JSL.l SetTabletItem
|
||||
@@ -42,6 +41,8 @@ SpawnTabletItem:
|
||||
LDA.b #$EB
|
||||
STA $7FFE00
|
||||
JSL Sprite_SpawnDynamically
|
||||
|
||||
LDA.b #$01 : STA.w !SPRITE_REDRAW, Y
|
||||
|
||||
PLA : STA $0E80, Y ; Store item type
|
||||
LDA $22 : STA $0D10, Y
|
||||
|
||||
@@ -155,15 +155,16 @@ RTL
|
||||
|
||||
;Bx
|
||||
db $2C ; Bee Trap
|
||||
db $4A ; Apples
|
||||
db $4A ; Fairy
|
||||
db $4A ; Chicken
|
||||
db $4D ; Apples
|
||||
db $4C ; Fairy
|
||||
db $4B ; Chicken
|
||||
db $3B ; Big Magic
|
||||
db $02 ; 5 Arrows
|
||||
db $4A ; Good Bee
|
||||
db $49, $49, $49, $49, $49, $49, $49, $49, $49, $49 ; Unused
|
||||
db $13 ; Bomb Upgrade
|
||||
db $07 ; Cane Upgrade
|
||||
db $49, $49, $49, $49, $49, $49, $49, $49 ; Unused
|
||||
db $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49 ; Unused
|
||||
db $27 ; Bug Net Upgrade
|
||||
db $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49 ; Unused
|
||||
db $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49 ; Unused
|
||||
db $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49 ; Unused
|
||||
db $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49 ; Reserved
|
||||
@@ -302,15 +303,16 @@ RTL
|
||||
db $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08 ; Free Big Key
|
||||
db $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08 ; Free Small Key
|
||||
db $04 ; Bee Trap
|
||||
db $08 ; Apples
|
||||
db $02 ; Apples
|
||||
db $08 ; Fairy
|
||||
db $08 ; Chicken
|
||||
db $02 ; Chicken
|
||||
db $08 ; Big Magic
|
||||
db $04 ; 5 Arrows
|
||||
db $04 ; Good Bee
|
||||
db $08, $08, $08, $08, $08, $08, $08, $08, $08, $08 ; Unused
|
||||
db $F7 ; Bomb Upgrade
|
||||
db $0A ; Cane Upgrade
|
||||
db $08, $08, $08, $08, $08, $08, $08, $08 ; Unused
|
||||
db $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08 ; Unused
|
||||
db $02 ; Bug Net Upgrade
|
||||
db $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08 ; Unused
|
||||
db $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08 ; Unused
|
||||
db $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08 ; Unused
|
||||
db $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08 ; Unused
|
||||
@@ -377,7 +379,7 @@ IsNarrowSprite:
|
||||
LDX.b #$00 ; set index counter to 0
|
||||
;----
|
||||
-
|
||||
CPX.b #$2A : !BGE .false ; finish if we've done the whole list
|
||||
CPX.b #(.smallSprites_end-.smallSprites) : !BGE .false ; finish if we've done the whole list
|
||||
CMP.l .smallSprites, X : BNE + ; skip to next if we don't match
|
||||
;--
|
||||
SEC ; set true state
|
||||
@@ -400,7 +402,8 @@ RTL
|
||||
db $15, $18, $24, $2A, $34, $35, $36, $42
|
||||
db $43, $45, $59, $A0, $A1, $A2, $A3, $A4
|
||||
db $A5, $A6, $A7, $A8, $A9, $AA, $AB, $AC
|
||||
db $AD, $AE, $AF, $B4, $B7, $FF, $FF, $FF
|
||||
db $AD, $AE, $AF, $B4, $B5, $C1
|
||||
.smallSprites_end
|
||||
}
|
||||
;--------------------------------------------------------------------------------
|
||||
|
||||
@@ -424,9 +427,10 @@ PrepDynamicTile:
|
||||
+
|
||||
TXA
|
||||
JSR.w LoadDynamicTileOAMTable
|
||||
JSL.l GetSpriteID ; convert loot id to sprite id
|
||||
JSL.l GetAnimatedSpriteTile_variable
|
||||
LDA.b #$00 : STA !MULTIWORLD_SPRITEITEM_PLAYER_ID
|
||||
CMP.b #$34 : BCC + : CMP.b #$36+1 : BCS + : BRA ++ ; if rupees, don't draw to OAM
|
||||
+ JSL.l GetSpriteID ; convert loot id to sprite id
|
||||
JSL.l GetAnimatedSpriteTile_variable
|
||||
++ LDA.b #$00 : STA !MULTIWORLD_SPRITEITEM_PLAYER_ID
|
||||
PLY : PLX : PLA
|
||||
RTL
|
||||
;--------------------------------------------------------------------------------
|
||||
@@ -435,8 +439,6 @@ RTL
|
||||
; LoadDynamicTileOAMTable
|
||||
; in: A - Loot ID
|
||||
;-------------------------------------------------------------------------------- 20/847B
|
||||
!SPRITE_OAM = "$7EC025"
|
||||
;--------------------------------------------------------------------------------
|
||||
LoadDynamicTileOAMTable:
|
||||
PHA : PHP
|
||||
|
||||
@@ -446,7 +448,11 @@ LoadDynamicTileOAMTable:
|
||||
STA.l !SPRITE_OAM+2
|
||||
LDA.w #$0200 : STA.l !SPRITE_OAM+6
|
||||
SEP #$20 ; set 8-bit accumulator
|
||||
LDA.b #$24 : STA.l !SPRITE_OAM+4
|
||||
LDA $01,s
|
||||
CMP.b #$34 : BCC + : CMP.b #$36+1 : BCS + ; if rupees, use animated gfx already in OAM
|
||||
LDA.b #$0B : BRA ++
|
||||
+ LDA.b #$24
|
||||
++ STA.l !SPRITE_OAM+4
|
||||
|
||||
LDA $01,s
|
||||
|
||||
@@ -458,11 +464,16 @@ LoadDynamicTileOAMTable:
|
||||
BRA .done
|
||||
|
||||
.narrow
|
||||
REP #$20 ; set 16-bit accumulator
|
||||
LDA $02,s
|
||||
CMP.b #$34 : BCC + : CMP.b #$36+1 : BCS + ; if rupees, use animated gfx already in OAM
|
||||
REP #$20
|
||||
LDA.w #$1B00 : BRA ++
|
||||
+ REP #$20
|
||||
LDA.w #$3400
|
||||
++ STA.l !SPRITE_OAM+11
|
||||
LDA.w #$0000 : STA.l !SPRITE_OAM+7
|
||||
STA.l !SPRITE_OAM+14
|
||||
LDA.w #$0800 : STA.l !SPRITE_OAM+9
|
||||
LDA.w #$3400 : STA.l !SPRITE_OAM+11
|
||||
|
||||
.done
|
||||
PLP : PLA
|
||||
@@ -476,7 +487,6 @@ RTS
|
||||
;--------------------------------------------------------------------------------
|
||||
; This wastes two OAM slots if you don't want a shadow - fix later - I wrote "fix later" over a year ago and it's still not fixed (Aug 6, 2017) - lol (May 25th, 2019)
|
||||
;-------------------------------------------------------------------------------- 2084B8
|
||||
!SPRITE_OAM = "$7EC025"
|
||||
!SKIP_EOR = "$7F5008"
|
||||
;--------------------------------------------------------------------------------
|
||||
DrawDynamicTile:
|
||||
|
||||
@@ -79,7 +79,7 @@ Ganon_CheckBeeVulnerability: ; we know it's a bee
|
||||
LDA #$09
|
||||
BRA .done
|
||||
.normal
|
||||
LDA.l SpecialWeapons : CMP.b #$06 : BNE .regular_bee
|
||||
LDA.l SpecialWeapons : AND.b #$7F : CMP.b #$06 : BNE .regular_bee
|
||||
LDA.w $0ED0, X
|
||||
BRA .done
|
||||
.regular_bee
|
||||
@@ -115,7 +115,7 @@ Ganon_CheckHammerVulnerability: ; we know it's hammer
|
||||
;--------------------------------------------------------------------------------
|
||||
CheckBeeBoss:
|
||||
; Y is sprite index
|
||||
LDA.l SpecialWeapons : CMP #$06 : BNE .not_bee_mode
|
||||
LDA.l SpecialWeapons : AND.b #$7F : CMP #$06 : BNE .not_bee_mode
|
||||
LDA #$00 : RTL
|
||||
.not_bee_mode
|
||||
LDA.l GanonVulnerabilityItem : CMP #$10 : BNE .normal ; ganon not vulnerable to bee
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
LoadZoraKingItemGFX:
|
||||
LDA.l ZoraItem_Player : STA !MULTIWORLD_SPRITEITEM_PLAYER_ID
|
||||
LDA.l $1DE1C3 ; location randomizer writes zora item to
|
||||
JML.l PrepDynamicTile
|
||||
JML RequestSlottedTile
|
||||
;--------------------------------------------------------------------------------
|
||||
JumpToSplashItemTarget:
|
||||
LDA $0D90, X
|
||||
|
||||
Reference in New Issue
Block a user