Free crystals and ability to shuffle dungeon prizes

Overworld map code via Aerinon
This commit is contained in:
cassidoxa
2023-08-06 23:07:39 -04:00
parent cb16ffc20b
commit 87e665965c
26 changed files with 1225 additions and 547 deletions

View File

@@ -62,6 +62,7 @@ incsrc ram.asm
incsrc sram.asm incsrc sram.asm
incsrc registers.asm incsrc registers.asm
incsrc vanillalabels.asm incsrc vanillalabels.asm
incsrc overworldmap.asm ; Overwrites some code in bank $8A
org $A08000 ; bank $20 org $A08000 ; bank $20
incsrc itemdowngrade.asm incsrc itemdowngrade.asm

View File

@@ -2,7 +2,7 @@ PalettesCustom:
.master_sword .master_sword
dw $0000, $7E4E, $6FF4, $1CF5, $7FFF, $1CE7, $7A10, $64A5 dw $0000, $7E4E, $6FF4, $1CF5, $7FFF, $1CE7, $7A10, $64A5
.tempered_sword .tempered_sword
dw $0000, $093B, $169F, $7E8D, $7FFF, $1CE7, $7A10, $64A5 dw $0000, $7FFF, $1979, $14B6, $39DC, $14A5, $66F7, $45EF
.golden_sword .golden_sword
dw $0000, $033F, $7FFF, $2640, $7FFF, $1CE7, $7A10, $64A5 dw $0000, $033F, $7FFF, $2640, $7FFF, $1CE7, $7A10, $64A5
.fighter_shield .fighter_shield
@@ -12,6 +12,6 @@ dw $0000, $7FFF, $27FF, $5E2D, $4F5F, $1CE7, $2E9C, $14B6
.mirror_shield .mirror_shield
dw $0000, $7FFF, $27FF, $5E2D, $7399, $1CE7, $02F9, $0233 dw $0000, $7FFF, $27FF, $5E2D, $7399, $1CE7, $02F9, $0233
.crystal .crystal
dw $7FFF, $7FFF, $5F9F, $000A, $7E15, $2C24, $75D0, $612B dw $7FFF, $7FFF, $0000, $5907, $6E0E, $0000, $7FBB, $7672
.off_black .off_black
dw $0000, $14A5, $14A5, $14A5, $14A5, $14A5, $14A5, $14A5 dw $0000, $14A5, $14A5, $14A5, $14A5, $14A5, $14A5, $14A5

View File

@@ -114,14 +114,19 @@ FreeDungeonItemNotice:
+ : LDA.l FreeItemText : AND.b #$08 : BEQ + ; show message for dungeon big key + : LDA.l FreeItemText : AND.b #$08 : BEQ + ; show message for dungeon big key
LDA.w ScratchBufferV : AND.b #$F0 : CMP.b #$90 : BNE + ; big key of... LDA.w ScratchBufferV : AND.b #$F0 : CMP.b #$90 : BNE + ; big key of...
%CopyDialog(Notice_BigKeyOf) %CopyDialog(Notice_BigKeyOf)
BRA .dungeon JMP .dungeon
+ : LDA.l FreeItemText : AND.b #$01 : BEQ + ; show message for dungeon small key + : LDA.l FreeItemText : AND.b #$01 : BEQ + ; show message for dungeon small key
LDA.w ScratchBufferV : AND.b #$F0 : CMP.b #$A0 : BNE + ; small key of... LDA.w ScratchBufferV : AND.b #$F0 : CMP.b #$A0 : BNE + ; small key of...
LDA.w ScratchBufferV : CMP.b #$AF : BNE ++ : JMP .skip : ++ LDA.w ScratchBufferV : CMP.b #$AF : BNE ++ : JMP .skip : ++
%CopyDialog(Notice_SmallKeyOf) %CopyDialog(Notice_SmallKeyOf)
LDA.b #$01 : STA.w ScratchBufferNV ; set up a flip for small keys LDA.b #$01 : STA.w ScratchBufferNV ; set up a flip for small keys
BRA .dungeon BRA .dungeon
+ + : LDA.l FreeItemText : AND.b #$20 : BEQ + ; show message for crystal
LDA.w ScratchBufferV : CMP.b #$B0 : !BLT + ; crystal #
CMP.b #$B7 : !BGE +
%CopyDialog(Notice_Crystal)
JMP .crystal
+
JMP .skip ; it's not something we are going to give a notice for JMP .skip ; it's not something we are going to give a notice for
.dungeon .dungeon
@@ -170,12 +175,34 @@ FreeDungeonItemNotice:
+ : CMP.b #$0C : BNE + ; ...desert palace + : CMP.b #$0C : BNE + ; ...desert palace
%CopyDialog(Notice_Desert) : JMP .done %CopyDialog(Notice_Desert) : JMP .done
+ : CMP.b #$0D : BNE + ; ...eastern palace + : CMP.b #$0D : BNE + ; ...eastern palace
%CopyDialog(Notice_Eastern) : BRA .done %CopyDialog(Notice_Eastern) : JMP .done
+ : CMP.b #$0E : BNE + ; ...hyrule castle + : CMP.b #$0E : BNE + ; ...hyrule castle
%CopyDialog(Notice_Castle) : BRA .done %CopyDialog(Notice_Castle) : JMP .done
+ : CMP.b #$0F : BNE + ; ...sewers + : CMP.b #$0F : BNE + ; ...sewers
%CopyDialog(Notice_Sewers) %CopyDialog(Notice_Sewers)
+ +
JMP .done
.crystal
LDA.l DialogReturnPointer : DEC #2 : STA.l DialogOffsetPointer
LDA.w ScratchBufferV
AND.b #$0F ; looking at low bits only
CMP.b #$00 : BNE +
%CopyDialog(Notice_Six) : JMP .done
+ : CMP.b #$01 : BNE +
%CopyDialog(Notice_One) : JMP .done
+ : CMP.b #$02 : BNE +
%CopyDialog(Notice_Five) : JMP .done
+ : CMP.b #$03 : BNE +
%CopyDialog(Notice_Seven) : JMP .done
+ : CMP.b #$04 : BNE +
%CopyDialog(Notice_Two) : JMP .done
+ : CMP.b #$05 : BNE +
%CopyDialog(Notice_Four) : JMP .done
+ : CMP.b #$06 : BNE +
%CopyDialog(Notice_Three) : JMP .done
+
.done .done
STZ.w TextID : STZ.w TextID+1 ; reset decompression buffer STZ.w TextID : STZ.w TextID+1 ; reset decompression buffer

View File

@@ -1,9 +1,328 @@
;================================================================================ ;================================================================================
; Dungeon & Boss Drop Fixes ; Dungeon & Boss Drop Fixes
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
DropSafeDungeon: SpawnDungeonPrize:
LDA.w DungeonID : CMP.b #$08 : BEQ + PHX : PHB
LDA.l $81C6FC, X : JML Sprite_SpawnFallingItem JSL.l ResolveLootIDLong
+ STA.w ItemReceiptID
TAX
LDA.b #$29 : LDY.b #$06
JSL.l AddAncillaLong
BCS .failed_spawn
LDA.w ItemReceiptID
STA.w AncillaGet,X : STA.w SpriteID,X
JSR.w AddDungeonPrizeAncilla
.failed_spawn
PLB : PLX
RTL
AddDungeonPrizeAncilla:
LDY.w ItemReceiptID
STZ.w AncillaVelocityY,X
STZ.w AncillaVelocityX,X
STZ.w AncillaGeneral,X
STZ.w $0385,X
STZ.w $0C54,X
LDA.b #$D0 : STA.w AncillaVelocityZ,X
LDA.b #$80 : STA.w AncillaZCoord,X
LDA.b #$09 : STA.w AncillaTimer,X
LDA.b #$00 : STA.w $0394,X
LDA.w AncillaGet,X : STA.w ItemReceiptID
LDA.w DungeonID : CMP.b #$14 : BNE .not_hera
LDA.b LinkAbsoluteY+1 : AND.b #$FE
INC A
STA.b Scrap01
STZ.b Scrap00
LDA.b LinkAbsoluteX+1 : AND.b #$FE
INC A
STA.b Scrap03
STZ.b Scrap02
BRA .set_coords_exit
.not_hera
TYA : ASL : TAY
REP #$20
LDA.w #$0078
CLC : ADC.b BG2V
STA.b Scrap00
LDA.w #$0078
CLC : ADC.b BG2H
STA.b Scrap02
SEP #$20
.set_coords_exit
LDA.b Scrap00 : STA.w AncillaCoordYLow,X
LDA.b Scrap01 : STA.w AncillaCoordYHigh,X
LDA.b Scrap02 : STA.w AncillaCoordXLow,X
LDA.b Scrap03 : STA.w AncillaCoordXHigh,X
RTS
PrepPrizeTile:
PHA : PHX : PHY
LDA.w AncillaGet, X
JSL.l ResolveLootIDLong
STA.w SpriteID,X
JSL.l TransferItemReceiptToBuffer_using_ReceiptID
PLY : PLX : PLA
RTL
SetItemPose:
PHA
LDA.w RoomItemsTaken : BIT.b #$80 : BNE +
.one_handed
PLA
JML $8799F2
+
JSR.w CrystalOrPendantBehavior : BCC .one_handed
.two_handed
PLA
JML $8799EE ; cool pose
SetPrizeCoords:
PHX : PHY
STZ.b Scrap03
LDA.w ItemReceiptMethod : CMP.b #$03 : BEQ +
.regular_coords
PLY : PLX
LDY.w AncillaGet,X
RTL
+
JSR.w CrystalOrPendantBehavior : BCC .regular_coords
PLY : PLX
LDY.b #$20 ; Treat as crystal
RTL
SetCutsceneFlag:
; Out: c - Cutscene flag $02 if set, $01 if unset.
PHX
LDY.b #$01 ; wrote over
LDA.w RoomItemsTaken : BIT #$80 : BNE .dungeon_prize
.no_cutscene
PLX
CLC
RTL
.dungeon_prize
JSR.w SetDungeonCompletion
LDA.w ItemReceiptID : TAX
LDA.l InventoryTable_properties,X : BPL .no_cutscene
PLX
SEC
RTL
AnimatePrizeCutscene:
LDA.w ItemReceiptMethod : CMP.b #$03 : BNE +
JSR.w CrystalOrPendantBehavior : BCC +
LDA.w RoomItemsTaken : BIT #$80 : BEQ +
SEC
RTL
+
CLC
RTL
PrizeDropSparkle:
LDA.w AncillaID,X : CMP.b #$29 : BNE .no_sparkle
JSR.w CrystalOrPendantBehavior : BCC .no_sparkle
SEC
RTL
.no_sparkle
CLC
RTL
HandleDropSFX:
LDA.w RoomItemsTaken : BIT #$80 : BEQ .no_sound
JSR.w CrystalOrPendantBehavior : BCC .no_sound
SEC
RTL
.no_sound
CLC
RTL
HandleCrystalsField:
TAX
LDA.w ItemReceiptID : CMP.b #$20 : BNE .not_crystal
TXA
STA.l CrystalsField
RTL
.not_crystal
RTL
MaybeKeepLootID:
PHA
LDA.w RoomItemsTaken : BIT #$80 : BNE .prize
STZ.w ItemReceiptID
STZ.w ItemReceiptPose
PLA
RTL
.prize
STZ.w ItemReceiptPose
PLA
RTL
CheckSpawnPrize:
; In: A - DungeonID
; Out: c - Spawn prize if set
REP #$20
LDX.w DungeonID
LDA.l DungeonItemMasks,X : AND.l DungeonsCompleted : BEQ .spawn
SEP #$20
CLC
RTL
.spawn
SEP #$21
RTL
SetDungeonCompletion:
LDX.w DungeonID : BMI +
REP #$20
LDA.l DungeonItemMasks, X : ORA.l DungeonsCompleted : STA.l DungeonsCompleted
SEP #$20
+
RTS
CheckDungeonCompletion:
LDX.w DungeonID
REP #$20
LDA.l DungeonItemMasks,X : AND.l DungeonsCompleted
SEP #$20
RTL
MaybeOpenDoor:
;LDA.w ItemReceiptID : TAX
LDA.w DungeonID : LSR : TAX
LDA.l DungeonPrizeReceiptID,X : TAX
LDA.l InventoryTable_properties,X : BMI .no_open
REP #$20
LDX.w DungeonID
LDA.l DungeonMask,X : AND.l DungeonsCompleted
SEP #$20
SEC
RTL
.no_open
REP #$20
LDX.w DungeonID
LDA.l DungeonMask,X : AND.l DungeonsCompleted
SEP #$20
CLC
RTL
PendantMusicCheck:
; In: A - Item receipt ID
PHX
TAY
LDA.w ItemReceiptMethod : CMP.b #$03 : BNE .dont_wait
TYX
LDA.l InventoryTable_properties,X : BMI .dont_wait
PLX
SEC
RTL
.dont_wait
PLX
CLC
RTL
PrepPrizeOAMCoordinates:
PHX : PHY
LDY.w AncillaLayer,X
LDA.w $F67F,Y : STA.b $65
STZ.b $64
LDA.w AncillaCoordYLow,X : STA.b Scrap00
LDA.w AncillaCoordYHigh,X : STA.b Scrap01
LDA.w AncillaCoordXLow,X : STA.b Scrap02
LDA.w AncillaCoordXHigh,X : STA.b Scrap03
REP #$20
LDA.b Scrap00
SEC : SBC.w $0122
STA.b Scrap00
LDA.b Scrap02
SEC : SBC.w $011E
STA.b Scrap02
STA.b Scrap04
REP #$20
LDA.w $029E,X
AND.w #$00FF
STA.b $72
LDA.b $00
STA.b $06
SEC
SBC.b $72
STA.b $00
SEP #$20
TXY
LDA.w AncillaGet,X : TAX
LDA.l SpriteProperties_chest_width,X : BNE .wide
TYX
LDA.w AncillaID,X : CMP.b #$3E : BEQ .rising_crystal
REP #$20
LDA.b Scrap00
CLC : ADC.w #$0008
STA.b Scrap08
LDA.b Scrap02
CLC : ADC.w #$0004
STA.b Scrap02 : STA.b Scrap0A
BRA .wide
.rising_crystal
REP #$20
LDA.b Scrap00
CLC : ADC.w #$0008 : STA.b Scrap08
LDA.b Scrap02 : STA.b Scrap0A
.wide
PLY : PLX
SEP #$20
RTL
PrepPrizeShadow:
PHX
LDA.w ItemReceiptID : TAX
LDA.l SpriteProperties_standing_width,X : BNE .wide
LDA.b Scrap02
SEC : SBC.b #$04
STA.b Scrap02
.wide
LDA.b #$20 : STA.b Scrap04 ; What we wrote over
PLX
RTL
CheckPoseItemCoordinates:
PHX
LDA.w ItemReceiptPose : BEQ .done
BIT.b #$02 : BEQ .done
LDA.w AncillaGet,X : TAX
LDA.l SpriteProperties_chest_width,X : BNE .done
LDA.b Scrap02
CLC : ADC.b #$04
STA.b Scrap02
.done
PLX
LDA.w AncillaGet,X
TAX
RTL
CrystalOrPendantBehavior:
; Out: c - Crystal Behavior if set, pendant if unset
PHA : PHX
LDA.w AncillaGet,X : TAX
LDA.l InventoryTable_properties,X : BMI .crystal_behavior
PLX : PLA
CLC
RTS
.crystal_behavior
PLX : PLA
SEC
RTS
CheckDungeonWorld:
; Maintain vanilla door opening behavior with dungeon prizes
TXA : CMP.b #$05 : BCS .dark_world
REP #$02
RTL
.dark_world
SEP #$02
RTL RTL
;--------------------------------------------------------------------------------

View File

@@ -20,6 +20,10 @@ OnDungeonEntrance:
INC.w UpdateHUD INC.w UpdateHUD
RTL RTL
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
OnDungeonBossExit:
JSL.l StatTransitionCounter
RTL
;--------------------------------------------------------------------------------
OnPlayerDead: OnPlayerDead:
PHA PHA
JSL.l SetDeathWorldChecked JSL.l SetDeathWorldChecked

View File

@@ -5,9 +5,6 @@ SpawnHauntedGroveItem:
LDA.b OverworldIndex : CMP.b #$2A : BEQ + : RTL : + ; Skip if not the haunted grove LDA.b OverworldIndex : CMP.b #$2A : BEQ + : RTL : + ; Skip if not the haunted grove
LDA.b IndoorsFlag : BEQ + : RTL : + ; Skip if indoors LDA.b IndoorsFlag : BEQ + : RTL : + ; Skip if indoors
%GetPossiblyEncryptedItem(HauntedGroveItem, HeartPieceOutdoorValues)
JSL.l PrepDynamicTile
LDA.b #$EB LDA.b #$EB
STA.l MiniGameTime STA.l MiniGameTime
JSL Sprite_SpawnDynamically JSL Sprite_SpawnDynamically

View File

@@ -70,7 +70,7 @@ GetAgahnimLightning:
;1 = Forbid ;1 = Forbid
AllowJoypadInput: AllowJoypadInput:
LDA.l PermitSQFromBosses : BEQ .fullCheck LDA.l PermitSQFromBosses : BEQ .fullCheck
LDA.w ItemsTaken : AND.b #$80 : BEQ .fullCheck LDA.w RoomItemsTaken : AND.b #$80 : BEQ .fullCheck
LDA.w MedallionFlag : ORA.w CutsceneFlag ; we have heart container, do short check LDA.w MedallionFlag : ORA.w CutsceneFlag ; we have heart container, do short check
RTL RTL
.fullCheck .fullCheck

View File

@@ -71,32 +71,27 @@ DrawHeartContainerGFX:
BRA DrawHeartPieceGFX_skipLoad BRA DrawHeartPieceGFX_skipLoad
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
HeartContainerSound: HeartContainerSound:
CPY.b #$20 : BEQ + ; Skip for Crystal LDA.w ItemReceiptMethod : CMP.b #$03 : BEQ +
CPY.b #$37 : BEQ + ; Skip for Pendants JSL.l CheckIfBossRoom : BCC + ; Skip if not in a boss room
CPY.b #$38 : BEQ + LDA.b #$2E
CPY.b #$39 : BEQ + SEC
JSL.l CheckIfBossRoom : BCC + ; Skip if not in a boss room RTL
LDA.b #$2E
SEC
RTL
+ +
CLC CLC
RTL RTL
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
NormalItemSkipSound: NormalItemSkipSound:
LDA.w AncillaGet, X ; thing we wrote over ; Out: C - skip sounds if set
JSL.l CheckIfBossRoom : BCS .boss_room
CPY.b #$20 : BEQ + ; Skip for Crystal LDA.b #$00
CPY.b #$37 : BEQ + ; Skip for Pendants
CPY.b #$38 : BEQ +
CPY.b #$39 : BEQ +
PHA
JSL.l CheckIfBossRoom
PLA
RTL RTL
+ .boss_room
CLC LDA.w ItemReceiptMethod : CMP.b #$03 : BEQ +
SEC
RTL
+
LDA.b #$20
CLC
RTL RTL
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
HeartPieceSpritePrep: HeartPieceSpritePrep:

View File

@@ -560,7 +560,7 @@ org $86D192 ; <- 35192 - sprite_absorbable.asm : 274 (STA $7EF36F)
JSL IncrementSmallKeysNoPrimary JSL IncrementSmallKeysNoPrimary
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
org $80F945 ; <- 7945 - Bank00.asm : 8557 (JSL SavePalaceDeaths) org $80F945 ; <- 7945 - Bank00.asm : 8557 (JSL SavePalaceDeaths)
JSL StatTransitionCounter ; we're not bothering to restore the instruction we wrote over JSL OnDungeonBossExit
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
org $89F443 ; <- 4F443 - module_death.asm : 257 (STA $7EF35C, X) org $89F443 ; <- 4F443 - module_death.asm : 257 (STA $7EF35C, X)
JSL IncrementFairyRevivalCounter JSL IncrementFairyRevivalCounter
@@ -928,14 +928,11 @@ org $88C6C8 ; 446C8 - ancilla_receive_item.asm:538 (LDA AddReceiveItem.propertie
JSL CheckReceivedItemPropertiesBeforeLoad JSL CheckReceivedItemPropertiesBeforeLoad
org $88C6DE ; 446DE - ancilla_receive_item.asm:550 (LDA .wide_item_flag, X) org $88C6DE ; 446DE - ancilla_receive_item.asm:550 (LDA .wide_item_flag, X)
LDA.l SpriteProperties_chest_width, X JSL.l ItemReceiptWidthCheck
org $88C6F9 ; 446F9 - ancilla_receive_item.asm:570 (LDA AddReceiveItem.properties, X) org $88C6F9 ; 446F9 - ancilla_receive_item.asm:570 (LDA AddReceiveItem.properties, X)
JSL CheckReceivedItemPropertiesBeforeLoad JSL CheckReceivedItemPropertiesBeforeLoad
;org $88C70F ; 4470F - ancilla_receive_item.asm : 582 - (LDA.b #$00 : STA ($92), Y)
;JSL LoadNarrowObject
org $8985ED ; 485ED - ancilla_init.asm:693 (LDA $02E9 : CMP.b #$01) org $8985ED ; 485ED - ancilla_init.asm:693 (LDA $02E9 : CMP.b #$01)
JSL AddReceivedItemExpandedGetItem : NOP JSL AddReceivedItemExpandedGetItem : NOP
@@ -993,10 +990,32 @@ JSL LockAgahnimDoors : BNE Overworld_Entrance_BRANCH_EPSILON : NOP #6
org $9BBCC1 ; <- DBCC1 - Bank1B.asm : 223 (LDA $0F8004, X : AND.w #$01FF : STA $00) org $9BBCC1 ; <- DBCC1 - Bank1B.asm : 223 (LDA $0F8004, X : AND.w #$01FF : STA $00)
Overworld_Entrance_BRANCH_EPSILON: ; go here to lock doors Overworld_Entrance_BRANCH_EPSILON: ; go here to lock doors
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
; -- HOOK THIS LATER TO FUCK WITH BOSS DROPS -- ; Dungeon Drops
org $81C73E ; <- C73E - Bank01.asm : 10377 (LDA $01C6FC, X : JSL Sprite_SpawnFallingItem)
JSL DropSafeDungeon : NOP #4
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
org $81C50D : JSL.l CheckDungeonWorld
org $81C517 : JSL.l CheckDungeonCompletion
org $81C523 : JSL.l CheckDungeonCompletion
org $81C710 : JSL.l CheckSpawnPrize
BCS RoomTag_GetHeartForPrize_spawn_prize : BRA RoomTag_GetHeartForPrize_delete_tag
org $81C742 : JSL.l SpawnDungeonPrize
org $8799EA : JML.l SetItemPose
org $88C415 : JSL.l PendantMusicCheck
BCS Ancilla22_ItemReceipt_is_pendant : BRA Ancilla22_ItemReceipt_wait_for_music
org $88C452 : JSL.l MaybeKeepLootID : NOP #2
org $88C61D : JSL.l AnimatePrizeCutscene : NOP
org $88C622 : BCC ItemReceipt_Animate_continue
org $88C6BA : JSL.l CheckPoseItemCoordinates
org $88CAD6 : JSL.l HandleDropSFX : NOP #2
org $88CADC : BCC Ancilla29_MilestoneItemReceipt_skip_crystal_sfx
org $88CAE9 : JSL.l PrepPrizeTile
org $88CB23 : JSL.l PrizeDropSparkle : BCC Ancilla29_MilestoneItemReceipt_no_sparkle : NOP #2
org $88CB97 : JSL.l PrepPrizeOAMCoordinates : BRA + : NOP #$12 : +
org $88CBFF : JSL.l PrepPrizeShadow
org $88CC6C : JSL.l HandleCrystalsField
org $88CCA6 : JSL.l PrepPrizeOAMCoordinates : NOP
org $8985FA : JSL.l SetCutsceneFlag : NOP #3 : BCC AncillaAdd_ItemReceipt_not_crystal
org $8988B2 : JSL.l SetPrizeCoords : NOP
;================================================================================ ;================================================================================
; Uncle / Sage Fixes - Old Man Fixes - Link's House Fixes ; Uncle / Sage Fixes - Old Man Fixes - Link's House Fixes
@@ -1569,11 +1588,6 @@ JSL HUDRebuildIndoorHole
; Pendant / Crystal Fixes ; Pendant / Crystal Fixes
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
;================================================================================ ;================================================================================
org $898BB0 ; <- 048BB0 - ancilla_init.asm:1663 - (STX $02D8 : JSR AddAncilla)
JSL TryToSpawnCrystalUntilSuccess : NOP
org $81C74B ; <- 00C74B - bank01.asm:10368 - (STZ $AE, X)
NOP #2 ; this STZ is what makes the crystal never spawn if it fails to spawn on the first try
;================================================================================
org $8DE9C8 ; <- 6E9C8 - equipment.asm:1623 - (LDA $7EF3C5 : CMP.b #$03 : BCC .beforeAgahnim) org $8DE9C8 ; <- 6E9C8 - equipment.asm:1623 - (LDA $7EF3C5 : CMP.b #$03 : BCC .beforeAgahnim)
JSL DrawPendantCrystalDiagram : RTS JSL DrawPendantCrystalDiagram : RTS
;================================================================================ ;================================================================================
@@ -1596,21 +1610,13 @@ org $82B15C ; <- 1315C - Bank02.asm:7672 - (LDA $7EF3CA : EOR.b #$40 : STA $7EF3
JSL IncrementOWMirror JSL IncrementOWMirror
JSL FlipLWDWFlag : NOP #2 JSL FlipLWDWFlag : NOP #2
;================================================================================ ;================================================================================
;Clear level to open doors ;org $8AC5BB ; < 545BB - Bank0A.asm:1856 - (LDA $7EF3C7 : CMP.b #$03 : BNE .fail)
org $81C50D ; 0xC50D - Bank01.asm:10032 - (LDA $7EF3CA : BNE .inDarkWorld) ;JSL OverworldMap_CheckObject : RTS
LDA CrystalPendantFlags_2, X ;org $8AC5D8 ; < 545D8 - Bank0A.asm:1885 - (LDA $7EF3C7 : CMP.b #$07 : BNE OverworldMap_CheckPendant_fail)
;================================================================================ ;JSL OverworldMap_CheckObject : RTS
;Kill enemy to clear level
org $81C715 ; <- C715 - Bank01.asm:10358 - (LDA $7EF3CA : BNE .inDarkWorld)
LDA CrystalPendantFlags_2, X
;================================================================================
org $8AC5BB ; < 545BB - Bank0A.asm:1856 - (LDA $7EF3C7 : CMP.b #$03 : BNE .fail)
JSL OverworldMap_CheckObject : RTS
org $8AC5D8 ; < 545D8 - Bank0A.asm:1885 - (LDA $7EF3C7 : CMP.b #$07 : BNE OverworldMap_CheckPendant_fail)
JSL OverworldMap_CheckObject : RTS
;================================================================================ ;================================================================================
org $8AC53E ; <- 5453E - Bank0A.asm:1771 - (LDA $0AC50D, X : STA $0D) org $8AC53E ; <- 5453E - Bank0A.asm:1771 - (LDA $0AC50D, X : STA $0D)
JSL GetCrystalNumber LDA.l CrystalNumberTable-1,X
;================================================================================ ;================================================================================
; EVERY INSTANCE OF STA $7EF3C7 IN THE ENTIRE CODEBASE ; EVERY INSTANCE OF STA $7EF3C7 IN THE ENTIRE CODEBASE
org $829D51 : JSL SetLWDWMap org $829D51 : JSL SetLWDWMap
@@ -1625,28 +1631,11 @@ org $898687 : JSL SetLWDWMap
org $9ECEDD : JSL SetLWDWMap org $9ECEDD : JSL SetLWDWMap
org $9ECF0D : JSL SetLWDWMap org $9ECF0D : JSL SetLWDWMap
;================================================================================ ;================================================================================
; EVERY INSTANCE OF LDA $7EF3C7 IN THE ENTIRE CODEBASE
org $85DDFE : JSL GetMapMode org $85DDFE : JSL GetMapMode
org $85EE25 : JSL GetMapMode org $85EE25 : JSL GetMapMode
org $85F17D : JSL GetMapMode org $85F17D : JSL GetMapMode
org $85FF7D : JSL GetMapMode org $85FF7D : JSL GetMapMode
org $8AC01A : JSL GetMapMode org $8AC01A : JSL GetMapMode
org $8AC037 : JSL GetMapMode
org $8AC079 : JSL GetMapMode
org $8AC0B8 : JSL GetMapMode
org $8AC0F8 : JSL GetMapMode
org $8AC137 : JSL GetMapMode
org $8AC179 : JSL GetMapMode
org $8AC1B3 : JSL GetMapMode
org $8AC1F5 : JSL GetMapMode
org $8AC22F : JSL GetMapMode
org $8AC271 : JSL GetMapMode
org $8AC2AB : JSL GetMapMode
org $8AC2ED : JSL GetMapMode
org $8AC327 : JSL GetMapMode
org $8AC369 : JSL GetMapMode
org $8DC849 : JSL GetMapMode org $8DC849 : JSL GetMapMode
;================================================================================ ;================================================================================
org $8AC012 ; <- 54012 - Bank0A.asm:1039 (LDA $7EF2DB : AND.b #$20 : BNE BRANCH_DELTA) org $8AC012 ; <- 54012 - Bank0A.asm:1039 (LDA $7EF2DB : AND.b #$20 : BNE BRANCH_DELTA)
@@ -1746,9 +1735,7 @@ org $9ECE47 ; <- F4E47 - sprite_crystal_maiden.asm : 220
JML MaidenCrystalScript JML MaidenCrystalScript
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
org $9ECCEB ; <- F4CEB - sprite_crystal_maiden.asm : 25 ; skip all palette nonsense org $9ECCEB ; <- F4CEB - sprite_crystal_maiden.asm : 25 ; skip all palette nonsense
JML SkipCrystalPalette BRA CrystalCutscene_Initialize_skip_palette
org $9ECD39
SkipCrystalPalette:
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
org $88C3FD ; <- 443FD - ancilla_receive_item.asm : 89 org $88C3FD ; <- 443FD - ancilla_receive_item.asm : 89
BRA + : NOP #4 : + BRA + : NOP #4 : +
@@ -2515,7 +2502,6 @@ org $82ADE9 : JSL TransferItemReceiptToBuffer_using_GraphicsID
org $869261 : JSL TransferItemReceiptToBuffer_using_GraphicsID org $869261 : JSL TransferItemReceiptToBuffer_using_GraphicsID
; falling items ; falling items
org $88CAE9 : JSL TransferItemReceiptToBuffer_using_GraphicsID
org $898BD2 : JSL TransferItemReceiptToBuffer_using_GraphicsID org $898BD2 : JSL TransferItemReceiptToBuffer_using_GraphicsID
; misc ; misc

View File

@@ -191,8 +191,11 @@ RTS
RTS RTS
DungeonIncrement: DungeonIncrement:
LDA.w InventoryTable_properties,Y : BIT.b #$40 : BEQ +
JSL.l CountChestKeyLong
+
LDA.b IndoorsFlag : BEQ .count LDA.b IndoorsFlag : BEQ .count
LDA.w DungeonID : CMP.b #$FF : BEQ .count LDA.w DungeonID : BMI .count
CMP.l BallNChainDungeon : BNE + CMP.l BallNChainDungeon : BNE +
CPY.b #$32 : BEQ .ballchain_bigkey CPY.b #$32 : BEQ .ballchain_bigkey
+ +
@@ -266,6 +269,7 @@ RTS
IncrementBossSword: IncrementBossSword:
PHX PHX
LDA.l StatsLocked : BNE .done
LDA.l SwordEquipment : CMP.b #$FF : BNE + LDA.l SwordEquipment : CMP.b #$FF : BNE +
BRA .none BRA .none
+ +
@@ -281,6 +285,7 @@ IncrementBossSword:
.none .none
LDA.l SwordlessBossKills : INC : STA.l SwordlessBossKills LDA.l SwordlessBossKills : INC : STA.l SwordlessBossKills
.done
PLX PLX
RTL RTL
.fighter .fighter
@@ -308,15 +313,6 @@ IncrementBossSword:
PLX PLX
RTL RTL
SetDungeonCompletion:
; TODO: move this
LDX.w DungeonID : BMI +
REP #$20
LDA.l DungeonMask, X : ORA.l DungeonsCompleted : STA.l DungeonsCompleted
SEP #$20
+
RTS
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
Link_ReceiveItem_HUDRefresh: Link_ReceiveItem_HUDRefresh:
LDA.l BombsEquipment : BNE + ; skip if we have bombs LDA.l BombsEquipment : BNE + ; skip if we have bombs

View File

@@ -2,7 +2,6 @@ ItemReceipts:
.offset_y : fillbyte $00 : fill 256 .offset_y : fillbyte $00 : fill 256
.offset_x : fillbyte $00 : fill 256 .offset_x : fillbyte $00 : fill 256
.graphics : fillbyte $00 : fill 256 ; item_graphics_indices .graphics : fillbyte $00 : fill 256 ; item_graphics_indices
.width : fillbyte $00 : fill 256 ; wide_item_flag
.target : fillword $0000 : fill 256*2 ; item_target_addr .target : fillword $0000 : fill 256*2 ; item_target_addr
.value : fillbyte $00 : fill 256 ; item_values .value : fillbyte $00 : fill 256 ; item_values
.behavior : fillword $0000 : fill 256*2 ; ItemBehavior .behavior : fillword $0000 : fill 256*2 ; ItemBehavior
@@ -64,14 +63,14 @@ endmacro
%ReceiptProps($26, -4, 0, $03, $F36C, $FF, skip, skip) ; 26 - Heart container from 4/4 %ReceiptProps($26, -4, 0, $03, $F36C, $FF, skip, skip) ; 26 - Heart container from 4/4
%ReceiptProps($27, -4, 0, $13, $F375, $FF, skip, skip) ; 27 - Bomb %ReceiptProps($27, -4, 0, $13, $F375, $FF, skip, skip) ; 27 - Bomb
%ReceiptProps($28, -4, 0, $01, $F375, $FF, skip, skip) ; 28 - 3 bombs %ReceiptProps($28, -4, 0, $01, $F375, $FF, skip, skip) ; 28 - 3 bombs
%ReceiptProps($29, -4, 0, $1E, $F344, $FF, mushroom, skip) ; 29 - Mushroom %ReceiptProps($29, -4, 0, $1F, $F344, $FF, mushroom, skip) ; 29 - Mushroom
%ReceiptProps($2A, -2, 5, $10, $F341, $02, red_boomerang, skip) ; 2A - Red boomerang %ReceiptProps($2A, -2, 5, $10, $F341, $02, red_boomerang, skip) ; 2A - Red boomerang
%ReceiptProps($2B, -4, 0, $00, $F35C, $FF, skip, bottles) ; 2B - Full bottle (red) %ReceiptProps($2B, -4, 0, $1E, $F35C, $FF, skip, bottles) ; 2B - Full bottle (red)
%ReceiptProps($2C, -4, 0, $00, $F35C, $FF, skip, bottles) ; 2C - Full bottle (green) %ReceiptProps($2C, -4, 0, $1E, $F35C, $FF, skip, bottles) ; 2C - Full bottle (green)
%ReceiptProps($2D, -4, 0, $00, $F35C, $FF, skip, bottles) ; 2D - Full bottle (blue) %ReceiptProps($2D, -4, 0, $1E, $F35C, $FF, skip, bottles) ; 2D - Full bottle (blue)
%ReceiptProps($2E, -4, 0, $00, $F36D, $FF, skip, bottles) ; 2E - Potion refill (red) %ReceiptProps($2E, -4, 0, $1E, $F36D, $FF, skip, bottles) ; 2E - Potion refill (red)
%ReceiptProps($2F, -4, 0, $00, $F36E, $FF, skip, bottles) ; 2F - Potion refill (green) %ReceiptProps($2F, -4, 0, $1E, $F36E, $FF, skip, bottles) ; 2F - Potion refill (green)
%ReceiptProps($30, -4, 0, $00, $F36E, $FF, skip, bottles) ; 30 - Potion refill (blue) %ReceiptProps($30, -4, 0, $1E, $F36E, $FF, skip, bottles) ; 30 - Potion refill (blue)
%ReceiptProps($31, -4, 0, $30, $F375, $FF, skip, skip) ; 31 - 10 bombs %ReceiptProps($31, -4, 0, $30, $F375, $FF, skip, skip) ; 31 - 10 bombs
%ReceiptProps($32, -4, 0, $22, $F366, $FF, dungeon_bigkey, skip) ; 32 - Big key %ReceiptProps($32, -4, 0, $22, $F366, $FF, dungeon_bigkey, skip) ; 32 - Big key
%ReceiptProps($33, -4, 0, $21, $F368, $FF, dungeon_map, skip) ; 33 - Map %ReceiptProps($33, -4, 0, $21, $F368, $FF, dungeon_map, skip) ; 33 - Map
@@ -199,14 +198,14 @@ endmacro
%ReceiptProps($AD, -4, 4, $0F, $F36A, $FF, free_smallkey, skip) ; AD - Small key of Ganon's Tower %ReceiptProps($AD, -4, 4, $0F, $F36A, $FF, free_smallkey, skip) ; AD - Small key of Ganon's Tower
%ReceiptProps($AE, -4, 4, $0F, $F36A, $FF, skip, skip) ; AE - Reserved %ReceiptProps($AE, -4, 4, $0F, $F36A, $FF, skip, skip) ; AE - Reserved
%ReceiptProps($AF, -4, 4, $0F, $F36A, $FF, generic_smallkey, skip) ; AF - Generic small key %ReceiptProps($AF, -4, 4, $0F, $F36A, $FF, generic_smallkey, skip) ; AF - Generic small key
%ReceiptProps($B0, -4, 0, $49, $F36A, $FF, skip, skip) ; B0 - %ReceiptProps($B0, -4, 0, $28, $F36A, $FF, free_crystal, skip) ; B0 - Crystal 6
%ReceiptProps($B1, -4, 0, $49, $F36A, $FF, skip, skip) ; B1 - %ReceiptProps($B1, -4, 0, $28, $F36A, $FF, free_crystal, skip) ; B1 - Crystal 1
%ReceiptProps($B2, -4, 0, $49, $F36A, $FF, skip, skip) ; B2 - %ReceiptProps($B2, -4, 0, $28, $F36A, $FF, free_crystal, skip) ; B2 - Crystal 5
%ReceiptProps($B3, -4, 0, $49, $F36A, $FF, skip, skip) ; B3 - %ReceiptProps($B3, -4, 0, $28, $F36A, $FF, free_crystal, skip) ; B3 - Crystal 7
%ReceiptProps($B4, -4, 0, $49, $F36A, $FF, skip, skip) ; B4 - %ReceiptProps($B4, -4, 0, $28, $F36A, $FF, free_crystal, skip) ; B4 - Crystal 2
%ReceiptProps($B5, -4, 0, $49, $F36A, $FF, skip, skip) ; B5 - %ReceiptProps($B5, -4, 0, $28, $F36A, $FF, free_crystal, skip) ; B5 - Crystal 4
%ReceiptProps($B6, -4, 0, $49, $F36A, $FF, skip, skip) ; B6 - %ReceiptProps($B6, -4, 0, $28, $F36A, $FF, free_crystal, skip) ; B6 - Crystal 3
%ReceiptProps($B7, -4, 0, $49, $F36A, $FF, skip, skip) ; B7 - %ReceiptProps($B7, -4, 0, $49, $F36A, $FF, skip, skip) ; B7 - Reserved
%ReceiptProps($B8, -4, 0, $49, $F36A, $FF, skip, skip) ; B8 - %ReceiptProps($B8, -4, 0, $49, $F36A, $FF, skip, skip) ; B8 -
%ReceiptProps($B9, -4, 0, $49, $F36A, $FF, skip, skip) ; B9 - %ReceiptProps($B9, -4, 0, $49, $F36A, $FF, skip, skip) ; B9 -
%ReceiptProps($BA, -4, 0, $49, $F36A, $FF, skip, skip) ; BA - %ReceiptProps($BA, -4, 0, $49, $F36A, $FF, skip, skip) ; BA -
@@ -560,10 +559,11 @@ endmacro
%SpriteProps($FF, 2, 2, $04, $04, $0000) ; FF - %SpriteProps($FF, 2, 2, $04, $04, $0000) ; FF -
;------------------------------------------------------------------------------ ;------------------------------------------------------------------------------
; Properties: - - w o a y s t ; Properties: p k w o a y s t
; t = Count for total item counter | s = Count for total in shops ; t = Count for total item counter | s = Count for total in shops
; y = Y item | a = A item ; y = Y item | a = A item
; o = Bomb item | w = Bow item ; o = Bomb item | w = Bow item
; k = Chest Key | p = Crystal prize behavior (sparkle, etc) if set
InventoryTable: InventoryTable:
.properties : fillbyte $00 : fill 256 ; See above .properties : fillbyte $00 : fill 256 ; See above
.stamp : fillword $0000 : fill 256*2 ; Address to stamp with 32-bit time (bank $7E) .stamp : fillword $0000 : fill 256*2 ; Address to stamp with 32-bit time (bank $7E)
@@ -577,55 +577,55 @@ macro InventoryItem(id, props, stamp, stat)
pullpc pullpc
endmacro endmacro
%InventoryItem($00, $01, SwordTime, $0000) ; 00 - Fighter sword & Shield %InventoryItem($00, $81, SwordTime, $0000) ; 00 - Fighter sword & Shield
%InventoryItem($01, $01, SwordTime, $0000) ; 01 - Master sword %InventoryItem($01, $81, SwordTime, $0000) ; 01 - Master sword
%InventoryItem($02, $01, SwordTime, $0000) ; 02 - Tempered sword %InventoryItem($02, $01, SwordTime, $0000) ; 02 - Tempered sword
%InventoryItem($03, $01, SwordTime, $0000) ; 03 - Butter sword %InventoryItem($03, $81, SwordTime, $0000) ; 03 - Butter sword
%InventoryItem($04, $01, $0000, $0000) ; 04 - Fighter shield %InventoryItem($04, $81, $0000, $0000) ; 04 - Fighter shield
%InventoryItem($05, $01, $0000, $0000) ; 05 - Fire shield %InventoryItem($05, $81, $0000, $0000) ; 05 - Fire shield
%InventoryItem($06, $01, $0000, $0000) ; 06 - Mirror shield %InventoryItem($06, $81, $0000, $0000) ; 06 - Mirror shield
%InventoryItem($07, $05, $0000, $0000) ; 07 - Fire rod %InventoryItem($07, $85, $0000, $0000) ; 07 - Fire rod
%InventoryItem($08, $05, $0000, $0000) ; 08 - Ice rod %InventoryItem($08, $85, $0000, $0000) ; 08 - Ice rod
%InventoryItem($09, $05, $0000, $0000) ; 09 - Hammer %InventoryItem($09, $85, $0000, $0000) ; 09 - Hammer
%InventoryItem($0A, $05, $0000, $0000) ; 0A - Hookshot %InventoryItem($0A, $85, $0000, $0000) ; 0A - Hookshot
%InventoryItem($0B, $25, $0000, $0000) ; 0B - Bow %InventoryItem($0B, $85, $0000, $0000) ; 0B - Bow
%InventoryItem($0C, $05, $0000, $0000) ; 0C - Blue Boomerang %InventoryItem($0C, $85, $0000, $0000) ; 0C - Blue Boomerang
%InventoryItem($0D, $05, $0000, $0000) ; 0D - Powder %InventoryItem($0D, $85, $0000, $0000) ; 0D - Powder
%InventoryItem($0E, $01, $0000, $0000) ; 0E - Bottle refill (bee) %InventoryItem($0E, $81, $0000, $0000) ; 0E - Bottle refill (bee)
%InventoryItem($0F, $05, $0000, $0000) ; 0F - Bombos %InventoryItem($0F, $85, $0000, $0000) ; 0F - Bombos
%InventoryItem($10, $05, $0000, $0000) ; 10 - Ether %InventoryItem($10, $85, $0000, $0000) ; 10 - Ether
%InventoryItem($11, $05, $0000, $0000) ; 11 - Quake %InventoryItem($11, $85, $0000, $0000) ; 11 - Quake
%InventoryItem($12, $05, $0000, $0000) ; 12 - Lamp %InventoryItem($12, $85, $0000, $0000) ; 12 - Lamp
%InventoryItem($13, $05, $0000, $0000) ; 13 - Shovel %InventoryItem($13, $85, $0000, $0000) ; 13 - Shovel
%InventoryItem($14, $05, FluteTime, $0000) ; 14 - Flute (inactive) %InventoryItem($14, $85, FluteTime, $0000) ; 14 - Flute (inactive)
%InventoryItem($15, $05, $0000, $0000) ; 15 - Somaria %InventoryItem($15, $85, $0000, $0000) ; 15 - Somaria
%InventoryItem($16, $05, $0000, $0000) ; 16 - Bottle %InventoryItem($16, $85, $0000, $0000) ; 16 - Bottle
%InventoryItem($17, $01, $0000, HeartPieceCounter) ; 17 - Heart piece %InventoryItem($17, $01, $0000, HeartPieceCounter) ; 17 - Heart piece
%InventoryItem($18, $05, $0000, $0000) ; 18 - Byrna %InventoryItem($18, $85, $0000, $0000) ; 18 - Byrna
%InventoryItem($19, $05, $0000, $0000) ; 19 - Cape %InventoryItem($19, $85, $0000, $0000) ; 19 - Cape
%InventoryItem($1A, $05, MirrorTime, $0000) ; 1A - Mirror %InventoryItem($1A, $85, MirrorTime, $0000) ; 1A - Mirror
%InventoryItem($1B, $09, $0000, $0000) ; 1B - Glove %InventoryItem($1B, $89, $0000, $0000) ; 1B - Glove
%InventoryItem($1C, $09, $0000, $0000) ; 1C - Mitts %InventoryItem($1C, $89, $0000, $0000) ; 1C - Mitts
%InventoryItem($1D, $05, $0000, $0000) ; 1D - Book %InventoryItem($1D, $85, $0000, $0000) ; 1D - Book
%InventoryItem($1E, $09, $0000, $0000) ; 1E - Flippers %InventoryItem($1E, $89, $0000, $0000) ; 1E - Flippers
%InventoryItem($1F, $01, $0000, $0000) ; 1F - Pearl %InventoryItem($1F, $81, $0000, $0000) ; 1F - Pearl
%InventoryItem($20, $00, $0000, CrystalCounter) ; 20 - Crystal %InventoryItem($20, $80, $0000, CrystalCounter) ; 20 - Crystal
%InventoryItem($21, $05, $0000, $0000) ; 21 - Net %InventoryItem($21, $85, $0000, $0000) ; 21 - Net
%InventoryItem($22, $01, $0000, $0000) ; 22 - Blue mail %InventoryItem($22, $81, $0000, $0000) ; 22 - Blue mail
%InventoryItem($23, $01, $0000, $0000) ; 23 - Red mail %InventoryItem($23, $81, $0000, $0000) ; 23 - Red mail
%InventoryItem($24, $01, $0000, SmallKeyCounter) ; 24 - Small key %InventoryItem($24, $41, $0000, SmallKeyCounter) ; 24 - Small key
%InventoryItem($25, $01, $0000, $0000) ; 25 - Compass %InventoryItem($25, $01, $0000, $0000) ; 25 - Compass
%InventoryItem($26, $00, $0000, $0000) ; 26 - Heart container from 4/4 %InventoryItem($26, $00, $0000, $0000) ; 26 - Heart container from 4/4
%InventoryItem($27, $15, $0000, $0000) ; 27 - Bomb %InventoryItem($27, $15, $0000, $0000) ; 27 - Bomb
%InventoryItem($28, $15, $0000, $0000) ; 28 - 3 bombs %InventoryItem($28, $15, $0000, $0000) ; 28 - 3 bombs
%InventoryItem($29, $05, $0000, $0000) ; 29 - Mushroom %InventoryItem($29, $85, $0000, $0000) ; 29 - Mushroom
%InventoryItem($2A, $05, $0000, $0000) ; 2A - Red boomerang %InventoryItem($2A, $05, $0000, $0000) ; 2A - Red boomerang
%InventoryItem($2B, $05, $0000, $0000) ; 2B - Full bottle (red) %InventoryItem($2B, $85, $0000, $0000) ; 2B - Full bottle (red)
%InventoryItem($2C, $05, $0000, $0000) ; 2C - Full bottle (green) %InventoryItem($2C, $85, $0000, $0000) ; 2C - Full bottle (green)
%InventoryItem($2D, $05, $0000, $0000) ; 2D - Full bottle (blue) %InventoryItem($2D, $85, $0000, $0000) ; 2D - Full bottle (blue)
%InventoryItem($2E, $00, $0000, $0000) ; 2E - Potion refill (red) %InventoryItem($2E, $80, $0000, $0000) ; 2E - Potion refill (red)
%InventoryItem($2F, $00, $0000, $0000) ; 2F - Potion refill (green) %InventoryItem($2F, $80, $0000, $0000) ; 2F - Potion refill (green)
%InventoryItem($30, $00, $0000, $0000) ; 30 - Potion refill (blue) %InventoryItem($30, $80, $0000, $0000) ; 30 - Potion refill (blue)
%InventoryItem($31, $11, $0000, $0000) ; 31 - 10 bombs %InventoryItem($31, $11, $0000, $0000) ; 31 - 10 bombs
%InventoryItem($32, $01, $0000, $0000) ; 32 - Big key %InventoryItem($32, $01, $0000, $0000) ; 32 - Big key
%InventoryItem($33, $01, $0000, $0000) ; 33 - Map %InventoryItem($33, $01, $0000, $0000) ; 33 - Map
@@ -635,12 +635,12 @@ endmacro
%InventoryItem($37, $00, $0000, PendantCounter) ; 37 - Green pendant %InventoryItem($37, $00, $0000, PendantCounter) ; 37 - Green pendant
%InventoryItem($38, $00, $0000, PendantCounter) ; 38 - Red pendant %InventoryItem($38, $00, $0000, PendantCounter) ; 38 - Red pendant
%InventoryItem($39, $00, $0000, PendantCounter) ; 39 - Blue pendant %InventoryItem($39, $00, $0000, PendantCounter) ; 39 - Blue pendant
%InventoryItem($3A, $25, $0000, $0000) ; 3A - Bow And Arrows %InventoryItem($3A, $A5, $0000, $0000) ; 3A - Bow And Arrows
%InventoryItem($3B, $25, $0000, $0000) ; 3B - Silver Bow %InventoryItem($3B, $A5, $0000, $0000) ; 3B - Silver Bow
%InventoryItem($3C, $05, $0000, $0000) ; 3C - Full bottle (bee) %InventoryItem($3C, $85, $0000, $0000) ; 3C - Full bottle (bee)
%InventoryItem($3D, $05, $0000, $0000) ; 3D - Full bottle (fairy) %InventoryItem($3D, $85, $0000, $0000) ; 3D - Full bottle (fairy)
%InventoryItem($3E, $01, $0000, HeartContainerCounter) ; 3E - Boss heart %InventoryItem($3E, $01, $0000, HeartContainerCounter) ; 3E - Boss heart
%InventoryItem($3F, $01, $0000, HeartContainerCounter) ; 3F - Sanc heart %InventoryItem($3F, $81, $0000, HeartContainerCounter) ; 3F - Sanc heart
%InventoryItem($40, $01, $0000, $0000) ; 40 - 100 rupees %InventoryItem($40, $01, $0000, $0000) ; 40 - 100 rupees
%InventoryItem($41, $01, $0000, $0000) ; 41 - 50 rupees %InventoryItem($41, $01, $0000, $0000) ; 41 - 50 rupees
%InventoryItem($42, $01, $0000, $0000) ; 42 - Heart %InventoryItem($42, $01, $0000, $0000) ; 42 - Heart
@@ -649,15 +649,15 @@ endmacro
%InventoryItem($45, $01, $0000, $0000) ; 45 - Small magic %InventoryItem($45, $01, $0000, $0000) ; 45 - Small magic
%InventoryItem($46, $01, $0000, $0000) ; 46 - 300 rupees %InventoryItem($46, $01, $0000, $0000) ; 46 - 300 rupees
%InventoryItem($47, $01, $0000, $0000) ; 47 - 20 rupees green %InventoryItem($47, $01, $0000, $0000) ; 47 - 20 rupees green
%InventoryItem($48, $05, $0000, $0000) ; 48 - Full bottle (good bee) %InventoryItem($48, $85, $0000, $0000) ; 48 - Full bottle (good bee)
%InventoryItem($49, $01, $0000, $0000) ; 49 - Tossed fighter sword %InventoryItem($49, $81, $0000, $0000) ; 49 - Tossed fighter sword
%InventoryItem($4A, $05, FluteTime, $0000) ; 4A - Active Flute %InventoryItem($4A, $85, FluteTime, $0000) ; 4A - Active Flute
%InventoryItem($4B, $09, BootsTime, $0000) ; 4B - Boots %InventoryItem($4B, $89, BootsTime, $0000) ; 4B - Boots
%InventoryItem($4C, $15, $0000, CapacityUpgrades) ; 4C - Bomb capacity (50) %InventoryItem($4C, $15, $0000, CapacityUpgrades) ; 4C - Bomb capacity (50)
%InventoryItem($4D, $01, $0000, CapacityUpgrades) ; 4D - Arrow capacity (70) %InventoryItem($4D, $01, $0000, CapacityUpgrades) ; 4D - Arrow capacity (70)
%InventoryItem($4E, $01, $0000, CapacityUpgrades) ; 4E - 1/2 magic %InventoryItem($4E, $81, $0000, CapacityUpgrades) ; 4E - 1/2 magic
%InventoryItem($4F, $01, $0000, CapacityUpgrades) ; 4F - 1/4 magic %InventoryItem($4F, $81, $0000, CapacityUpgrades) ; 4F - 1/4 magic
%InventoryItem($50, $01, SwordTime, $0000) ; 50 - Master Sword (safe) %InventoryItem($50, $81, SwordTime, $0000) ; 50 - Master Sword (safe)
%InventoryItem($51, $15, $0000, CapacityUpgrades) ; 51 - Bomb capacity (+5) %InventoryItem($51, $15, $0000, CapacityUpgrades) ; 51 - Bomb capacity (+5)
%InventoryItem($52, $15, $0000, CapacityUpgrades) ; 52 - Bomb capacity (+10) %InventoryItem($52, $15, $0000, CapacityUpgrades) ; 52 - Bomb capacity (+10)
%InventoryItem($53, $01, $0000, CapacityUpgrades) ; 53 - Arrow capacity (+5) %InventoryItem($53, $01, $0000, CapacityUpgrades) ; 53 - Arrow capacity (+5)
@@ -665,27 +665,27 @@ endmacro
%InventoryItem($55, $01, $0000, $0000) ; 55 - Programmable item 1 %InventoryItem($55, $01, $0000, $0000) ; 55 - Programmable item 1
%InventoryItem($56, $01, $0000, $0000) ; 56 - Programmable item 2 %InventoryItem($56, $01, $0000, $0000) ; 56 - Programmable item 2
%InventoryItem($57, $01, $0000, $0000) ; 57 - Programmable item 3 %InventoryItem($57, $01, $0000, $0000) ; 57 - Programmable item 3
%InventoryItem($58, $01, $0000, $0000) ; 58 - Upgrade-only Silver Arrows %InventoryItem($58, $81, $0000, $0000) ; 58 - Upgrade-only Silver Arrows
%InventoryItem($59, $01, $0000, $0000) ; 59 - Rupoor %InventoryItem($59, $01, $0000, $0000) ; 59 - Rupoor
%InventoryItem($5A, $01, $0000, $0000) ; 5A - Nothing %InventoryItem($5A, $01, $0000, $0000) ; 5A - Nothing
%InventoryItem($5B, $01, $0000, $0000) ; 5B - Red clock %InventoryItem($5B, $81, $0000, $0000) ; 5B - Red clock
%InventoryItem($5C, $01, $0000, $0000) ; 5C - Blue clock %InventoryItem($5C, $81, $0000, $0000) ; 5C - Blue clock
%InventoryItem($5D, $01, $0000, $0000) ; 5D - Green clock %InventoryItem($5D, $81, $0000, $0000) ; 5D - Green clock
%InventoryItem($5E, $01, $0000, $0000) ; 5E - Progressive sword %InventoryItem($5E, $81, $0000, $0000) ; 5E - Progressive sword
%InventoryItem($5F, $01, $0000, $0000) ; 5F - Progressive shield %InventoryItem($5F, $81, $0000, $0000) ; 5F - Progressive shield
%InventoryItem($60, $01, $0000, $0000) ; 60 - Progressive armor %InventoryItem($60, $81, $0000, $0000) ; 60 - Progressive armor
%InventoryItem($61, $09, $0000, $0000) ; 61 - Progressive glove %InventoryItem($61, $89, $0000, $0000) ; 61 - Progressive glove
%InventoryItem($62, $01, $0000, $0000) ; 62 - RNG pool item (single) %InventoryItem($62, $01, $0000, $0000) ; 62 - RNG pool item (single)
%InventoryItem($63, $01, $0000, $0000) ; 63 - RNG pool item (multi) %InventoryItem($63, $01, $0000, $0000) ; 63 - RNG pool item (multi)
%InventoryItem($64, $25, $0000, $0000) ; 64 - Progressive bow %InventoryItem($64, $A5, $0000, $0000) ; 64 - Progressive bow
%InventoryItem($65, $25, $0000, $0000) ; 65 - Progressive bow %InventoryItem($65, $A5, $0000, $0000) ; 65 - Progressive bow
%InventoryItem($66, $01, $0000, $0000) ; 66 - %InventoryItem($66, $01, $0000, $0000) ; 66 -
%InventoryItem($67, $01, $0000, $0000) ; 67 - %InventoryItem($67, $01, $0000, $0000) ; 67 -
%InventoryItem($68, $01, $0000, $0000) ; 68 - %InventoryItem($68, $01, $0000, $0000) ; 68 -
%InventoryItem($69, $01, $0000, $0000) ; 69 - %InventoryItem($69, $01, $0000, $0000) ; 69 -
%InventoryItem($6A, $01, $0000, $0000) ; 6A - Triforce %InventoryItem($6A, $81, $0000, $0000) ; 6A - Triforce
%InventoryItem($6B, $01, $0000, $0000) ; 6B - Power star %InventoryItem($6B, $81, $0000, $0000) ; 6B - Power star
%InventoryItem($6C, $01, $0000, $0000) ; 6C - Triforce Piece %InventoryItem($6C, $81, $0000, $0000) ; 6C - Triforce Piece
%InventoryItem($6D, $01, $0000, $0000) ; 6D - Server request item %InventoryItem($6D, $01, $0000, $0000) ; 6D - Server request item
%InventoryItem($6E, $01, $0000, $0000) ; 6E - Server request item (dungeon drop) %InventoryItem($6E, $01, $0000, $0000) ; 6E - Server request item (dungeon drop)
%InventoryItem($6F, $01, $0000, $0000) ; 6F - %InventoryItem($6F, $01, $0000, $0000) ; 6F -
@@ -721,7 +721,7 @@ endmacro
%InventoryItem($8D, $01, $0000, $0000) ; 8D - Compass of Eastern Palace %InventoryItem($8D, $01, $0000, $0000) ; 8D - Compass of Eastern Palace
%InventoryItem($8E, $01, $0000, $0000) ; 8E - Compass of Hyrule Castle %InventoryItem($8E, $01, $0000, $0000) ; 8E - Compass of Hyrule Castle
%InventoryItem($8F, $01, $0000, $0000) ; 8F - Compass of Sewers %InventoryItem($8F, $01, $0000, $0000) ; 8F - Compass of Sewers
%InventoryItem($90, $01, $0000, $0000) ; 90 - Skull key %InventoryItem($90, $81, $0000, $0000) ; 90 - Skull key
%InventoryItem($91, $01, $0000, $0000) ; 91 - Reserved %InventoryItem($91, $01, $0000, $0000) ; 91 - Reserved
%InventoryItem($92, $01, $0000, $0000) ; 92 - Big key of Ganon's Tower %InventoryItem($92, $01, $0000, $0000) ; 92 - Big key of Ganon's Tower
%InventoryItem($93, $01, $0000, $0000) ; 93 - Big key of Turtle Rock %InventoryItem($93, $01, $0000, $0000) ; 93 - Big key of Turtle Rock
@@ -737,30 +737,30 @@ endmacro
%InventoryItem($9D, $01, $0000, $0000) ; 9D - Big key of Eastern Palace %InventoryItem($9D, $01, $0000, $0000) ; 9D - Big key of Eastern Palace
%InventoryItem($9E, $01, $0000, $0000) ; 9E - Big key of Hyrule Castle %InventoryItem($9E, $01, $0000, $0000) ; 9E - Big key of Hyrule Castle
%InventoryItem($9F, $01, $0000, $0000) ; 9F - Big key of Sewers %InventoryItem($9F, $01, $0000, $0000) ; 9F - Big key of Sewers
%InventoryItem($A0, $01, $0000, SmallKeyCounter) ; A0 - Small key of Sewers %InventoryItem($A0, $41, $0000, SmallKeyCounter) ; A0 - Small key of Sewers
%InventoryItem($A1, $01, $0000, SmallKeyCounter) ; A1 - Small key of Hyrule Castle %InventoryItem($A1, $41, $0000, SmallKeyCounter) ; A1 - Small key of Hyrule Castle
%InventoryItem($A2, $01, $0000, SmallKeyCounter) ; A2 - Small key of Eastern Palace %InventoryItem($A2, $41, $0000, SmallKeyCounter) ; A2 - Small key of Eastern Palace
%InventoryItem($A3, $01, $0000, SmallKeyCounter) ; A3 - Small key of Desert Palace %InventoryItem($A3, $41, $0000, SmallKeyCounter) ; A3 - Small key of Desert Palace
%InventoryItem($A4, $01, $0000, SmallKeyCounter) ; A4 - Small key of Agahnim's Tower %InventoryItem($A4, $41, $0000, SmallKeyCounter) ; A4 - Small key of Agahnim's Tower
%InventoryItem($A5, $01, $0000, SmallKeyCounter) ; A5 - Small key of Swamp Palace %InventoryItem($A5, $41, $0000, SmallKeyCounter) ; A5 - Small key of Swamp Palace
%InventoryItem($A6, $01, $0000, SmallKeyCounter) ; A6 - Small key of Dark Palace %InventoryItem($A6, $41, $0000, SmallKeyCounter) ; A6 - Small key of Dark Palace
%InventoryItem($A7, $01, $0000, SmallKeyCounter) ; A7 - Small key of Misery Mire %InventoryItem($A7, $41, $0000, SmallKeyCounter) ; A7 - Small key of Misery Mire
%InventoryItem($A8, $01, $0000, SmallKeyCounter) ; A8 - Small key of Skull Woods %InventoryItem($A8, $41, $0000, SmallKeyCounter) ; A8 - Small key of Skull Woods
%InventoryItem($A9, $01, $0000, SmallKeyCounter) ; A9 - Small key of Ice Palace %InventoryItem($A9, $41, $0000, SmallKeyCounter) ; A9 - Small key of Ice Palace
%InventoryItem($AA, $01, $0000, SmallKeyCounter) ; AA - Small key of Tower of Hera %InventoryItem($AA, $41, $0000, SmallKeyCounter) ; AA - Small key of Tower of Hera
%InventoryItem($AB, $01, $0000, SmallKeyCounter) ; AB - Small key of Thieves' Town %InventoryItem($AB, $41, $0000, SmallKeyCounter) ; AB - Small key of Thieves' Town
%InventoryItem($AC, $01, $0000, SmallKeyCounter) ; AC - Small key of Turtle Rock %InventoryItem($AC, $41, $0000, SmallKeyCounter) ; AC - Small key of Turtle Rock
%InventoryItem($AD, $01, $0000, SmallKeyCounter) ; AD - Small key of Ganon's Tower %InventoryItem($AD, $41, $0000, SmallKeyCounter) ; AD - Small key of Ganon's Tower
%InventoryItem($AE, $01, $0000, $0000) ; AE - Reserved %InventoryItem($AE, $01, $0000, $0000) ; AE - Reserved
%InventoryItem($AF, $01, $0000, SmallKeyCounter) ; AF - Generic small key %InventoryItem($AF, $01, $0000, SmallKeyCounter) ; AF - Generic small key
%InventoryItem($B0, $01, $0000, $0000) ; B0 - %InventoryItem($B0, $81, $0000, CrystalCounter) ; B0 - Crystal 6
%InventoryItem($B1, $01, $0000, $0000) ; B1 - %InventoryItem($B1, $81, $0000, CrystalCounter) ; B1 - Crystal 1
%InventoryItem($B2, $01, $0000, $0000) ; B2 - %InventoryItem($B2, $81, $0000, CrystalCounter) ; B2 - Crystal 5
%InventoryItem($B3, $01, $0000, $0000) ; B3 - %InventoryItem($B3, $81, $0000, CrystalCounter) ; B3 - Crystal 7
%InventoryItem($B4, $01, $0000, $0000) ; B4 - %InventoryItem($B4, $81, $0000, CrystalCounter) ; B4 - Crystal 2
%InventoryItem($B5, $01, $0000, $0000) ; B5 - %InventoryItem($B5, $81, $0000, CrystalCounter) ; B5 - Crystal 4
%InventoryItem($B6, $01, $0000, $0000) ; B6 - %InventoryItem($B6, $81, $0000, CrystalCounter) ; B6 - Crystal 3
%InventoryItem($B7, $01, $0000, $0000) ; B7 - %InventoryItem($B7, $01, $0000, $0000) ; B7 - Reserved
%InventoryItem($B8, $01, $0000, $0000) ; B8 - %InventoryItem($B8, $01, $0000, $0000) ; B8 -
%InventoryItem($B9, $01, $0000, $0000) ; B9 - %InventoryItem($B9, $01, $0000, $0000) ; B9 -
%InventoryItem($BA, $01, $0000, $0000) ; BA - %InventoryItem($BA, $01, $0000, $0000) ; BA -
@@ -1017,15 +1017,14 @@ ItemReceiptGraphicsOffsets:
dw BigDecompressionBuffer+$1DC0 ; AD - Small key of Ganon's Tower dw BigDecompressionBuffer+$1DC0 ; AD - Small key of Ganon's Tower
dw $0 ; AE - Reserved dw $0 ; AE - Reserved
dw BigDecompressionBuffer+$1DC0 ; AF - Generic small key dw BigDecompressionBuffer+$1DC0 ; AF - Generic small key
dw BigDecompressionBuffer+$08A0 ; B0 - Crystal 6
dw $0 ; B0 - dw BigDecompressionBuffer+$08A0 ; B1 - Crystal 1
dw $0 ; B1 - dw BigDecompressionBuffer+$08A0 ; B2 - Crystal 5
dw $0 ; B2 - dw BigDecompressionBuffer+$08A0 ; B3 - Crystal 7
dw $0 ; B3 - dw BigDecompressionBuffer+$08A0 ; B4 - Crystal 2
dw $0 ; B4 - dw BigDecompressionBuffer+$08A0 ; B5 - Crystal 4
dw $0 ; B5 - dw BigDecompressionBuffer+$08A0 ; B6 - Crystal 3
dw $0 ; B6 - dw $0 ; B7 - Reserved
dw $0 ; B7 -
dw $0 ; B8 - dw $0 ; B8 -
dw $0 ; B9 - dw $0 ; B9 -
dw $0 ; BA - dw $0 ; BA -
@@ -1288,15 +1287,14 @@ StandingItemGraphicsOffsets:
dw BigDecompressionBuffer+$1DC0 ; AD - Small key of Ganon's Tower dw BigDecompressionBuffer+$1DC0 ; AD - Small key of Ganon's Tower
dw $0 ; AE - Reserved dw $0 ; AE - Reserved
dw BigDecompressionBuffer+$1DC0 ; AF - Generic small key dw BigDecompressionBuffer+$1DC0 ; AF - Generic small key
dw BigDecompressionBuffer+$08A0 ; B0 - Crystal 6
dw $0 ; B0 - dw BigDecompressionBuffer+$08A0 ; B1 - Crystal 1
dw $0 ; B1 - dw BigDecompressionBuffer+$08A0 ; B2 - Crystal 5
dw $0 ; B2 - dw BigDecompressionBuffer+$08A0 ; B3 - Crystal 7
dw $0 ; B3 - dw BigDecompressionBuffer+$08A0 ; B4 - Crystal 2
dw $0 ; B4 - dw BigDecompressionBuffer+$08A0 ; B5 - Crystal 4
dw $0 ; B5 - dw BigDecompressionBuffer+$08A0 ; B6 - Crystal 3
dw $0 ; B6 - dw $0 ; B7 - Reserved
dw $0 ; B7 -
dw $0 ; B8 - dw $0 ; B8 -
dw $0 ; B9 - dw $0 ; B9 -
dw $0 ; BA - dw $0 ; BA -

View File

@@ -2,11 +2,6 @@
; Item Downgrade Fix ; Item Downgrade Fix
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
ItemDowngradeFix: ItemDowngradeFix:
JSR ItemDowngradeFixMain
JSL CountChestKeyLong
RTL
ItemDowngradeFixMain:
JSL.l AddInventory JSL.l AddInventory
BMI .dontWrite ; thing we wrote over part 1 BMI .dontWrite ; thing we wrote over part 1
@@ -34,7 +29,7 @@ ItemDowngradeFixMain:
.done .done
STA.b [Scrap00] ; thing we wrote over part 2 STA.b [Scrap00] ; thing we wrote over part 2
.dontWrite .dontWrite
RTS RTL
.isPowerGloves .isPowerGloves
.isBlueShield .isBlueShield
.isRedShield .isRedShield
@@ -43,7 +38,7 @@ RTS
.isBowAndArrows .isBowAndArrows
CMP.b [$00] : !BGE .done ; finished if we're upgrading CMP.b [$00] : !BGE .done ; finished if we're upgrading
LDA.b [$00] ; reload old value LDA.b [$00] ; reload old value
RTS RTL
.isSilverArrowBow .isSilverArrowBow
.isRedBoomerang .isRedBoomerang
.isMagicPowder .isMagicPowder
@@ -54,10 +49,10 @@ RTS
LDA.b [Scrap00] : BNE + ; don't upgrade if we already have the toggle for it LDA.b [Scrap00] : BNE + ; don't upgrade if we already have the toggle for it
PLA PLA
STA.b [Scrap00] STA.b [Scrap00]
RTS RTL
+ +
PLA PLA
RTS RTL
.isSword .isSword
PHA PHA
LDA.l HighestSword : STA.b Scrap04 LDA.l HighestSword : STA.b Scrap04
@@ -77,5 +72,5 @@ JMP .done
INC.b Scrap00 INC.b Scrap00
LDA.l HighestShield : STA.b [Scrap00] LDA.l HighestShield : STA.b [Scrap00]
PLA PLA
RTS RTL
;================================================================================ ;================================================================================

View File

@@ -27,6 +27,11 @@ Notice_SmallKeyOf:
db $75, $00, $BC, $00, $B6, $00, $AA, $00, $B5, $00, $B5, $00, $FF, $00, $B4, $00, $AE, $00, $C2, $00, $FF, $00, $BD, $00, $B8 db $75, $00, $BC, $00, $B6, $00, $AA, $00, $B5, $00, $B5, $00, $FF, $00, $B4, $00, $AE, $00, $C2, $00, $FF, $00, $BD, $00, $B8
dw #$7F7F dw #$7F7F
;
Notice_Crystal:
db $74, $00, $C2, $00, $B8, $00, $BE, $00, $FF, $00, $B9, $00, $B2, $00, $AC, $00, $B4, $00, $AE, $00, $AD, $00, $FF, $00, $BE, $00, $B9
dw $7F7F
; light world ; light world
Notice_LightWorld: Notice_LightWorld:
db $76, $00, $B5, $00, $B2, $00, $B0, $00, $B1, $00, $BD, $00, $FF, $00, $C0, $00, $B8, $00, $BB, $00, $B5, $00, $AD db $76, $00, $B5, $00, $B2, $00, $B0, $00, $B1, $00, $BD, $00, $FF, $00, $C0, $00, $B8, $00, $BB, $00, $B5, $00, $AD
@@ -111,3 +116,32 @@ Notice_Sewers:
Notice_Self: Notice_Self:
db $76, $00, $BD, $00, $B1, $00, $B2, $00, $BC, $00, $FF, $00, $AD, $00, $BE, $00, $B7, $00, $B0, $00, $AE, $00, $B8, $00, $B7 db $76, $00, $BD, $00, $B1, $00, $B2, $00, $BC, $00, $FF, $00, $AD, $00, $BE, $00, $B7, $00, $B0, $00, $AE, $00, $B8, $00, $B7
dw #$7F7F dw #$7F7F
; Crystal numbers
Notice_One:
db $75, $00, $AC, $00, $BB, $00, $C2, $00, $BC, $00, $BD, $00, $AA, $00, $B5, $00, $FF, $00, $B8, $00, $B7, $00, $AE
dw #$7F7F
Notice_Two:
db $75, $00, $AC, $00, $BB, $00, $C2, $00, $BC, $00, $BD, $00, $AA, $00, $B5, $00, $FF, $00, $BD, $00, $C0, $00, $B8
dw #$7F7F
Notice_Three:
db $75, $00, $AC, $00, $BB, $00, $C2, $00, $BC, $00, $BD, $00, $AA, $00, $B5, $00, $FF, $00, $BD, $00, $B1, $00, $BB, $00, $AE, $00, $AE
dw #$7F7F
Notice_Four:
db $75, $00, $AC, $00, $BB, $00, $C2, $00, $BC, $00, $BD, $00, $AA, $00, $B5, $00, $FF, $00, $AF, $00, $B8, $00, $BE, $00, $BB
dw #$7F7F
Notice_Five:
db $75, $00, $AC, $00, $BB, $00, $C2, $00, $BC, $00, $BD, $00, $AA, $00, $B5, $00, $FF, $00, $AF, $00, $B2, $00, $BF, $00, $AE
dw #$7F7F
Notice_Six:
db $75, $00, $AC, $00, $BB, $00, $C2, $00, $BC, $00, $BD, $00, $AA, $00, $B5, $00, $FF, $00, $BC, $00, $B2, $00, $C1
dw #$7F7F
Notice_Seven:
db $75, $00, $AC, $00, $BB, $00, $C2, $00, $BC, $00, $BD, $00, $AA, $00, $B5, $00, $FF, $00, $BC, $00, $AE, $00, $BF, $00, $AE, $00, $B7
dw #$7F7F

View File

@@ -24,9 +24,14 @@ Notice_BigKeyOf:
; small key to ; small key to
Notice_SmallKeyOf: Notice_SmallKeyOf:
db $74, $00, $BD, $00, $37, $00, $38, $00, $42, $00, $FF, $00, $38, $00, $42, $00, $FF, $00, $30 db $74, $00, $BD, $00, $37, $00, $38, $00, $42, $00, $FF, $00, $38, $00, $42, $00, $FF, $00, $30
db $75, $00, $42, $00, $3C, $00, $30, $00, $3B, $00, $3B, $00, $FF, $00, $3A, $00, $34, $00, $48, $00, $FF, $00, $43, $00, $3e db $75, $00, $42, $00, $3C, $00, $30, $00, $3B, $00, $3B, $00, $FF, $00, $3A, $00, $34, $00, $48, $00, $FF, $00, $43, $00, $3E
dw #$7F7F dw #$7F7F
; You picked up
Notice_Crystal:
db $74, $00, $C2, $00, $3E, $00, $44, $00, $FF, $00, $3F, $00, $38, $00, $32, $00, $3A, $00, $34, $00, $33, $00, $FF, $00, $44, $00, $3F
dw $7F7F
; light world ; light world
Notice_LightWorld: Notice_LightWorld:
db $76, $00, $B5, $00, $38, $00, $36, $00, $37, $00, $43, $00, $FF, $00, $C0, $00, $3E, $00, $41, $00, $3B, $00, $33 db $76, $00, $B5, $00, $38, $00, $36, $00, $37, $00, $43, $00, $FF, $00, $C0, $00, $3E, $00, $41, $00, $3B, $00, $33
@@ -44,12 +49,12 @@ Notice_GTower:
; Turtle Rock ; Turtle Rock
Notice_TRock: Notice_TRock:
db $76, $00, $BD, $00, $44, $00, $41, $00, $43, $00, $3B, $00, $34, $00, $FF, $00, $BB, $00, $3E, $00, $32, $00, $3a db $76, $00, $BD, $00, $44, $00, $41, $00, $43, $00, $3B, $00, $34, $00, $FF, $00, $BB, $00, $3E, $00, $32, $00, $3A
dw #$7F7F dw #$7F7F
; Thieves Town ; Thieves Town
Notice_Thieves: Notice_Thieves:
db $76, $00, $BD, $00, $37, $00, $38, $00, $34, $00, $45, $00, $34, $00, $42, $00, $FF, $00, $BD, $00, $3E, $00, $46, $00, $3d db $76, $00, $BD, $00, $37, $00, $38, $00, $34, $00, $45, $00, $34, $00, $42, $00, $FF, $00, $BD, $00, $3E, $00, $46, $00, $3D
dw #$7F7F dw #$7F7F
; Tower of Hera ; Tower of Hera
@@ -110,4 +115,33 @@ Notice_Sewers:
; This Dungeon ; This Dungeon
Notice_Self: Notice_Self:
db $76, $00, $43, $00, $37, $00, $38, $00, $42, $00, $FF, $00, $33, $00, $44, $00, $3D, $00, $36, $00, $34, $00, $3E, $00, $3d db $76, $00, $43, $00, $37, $00, $38, $00, $42, $00, $FF, $00, $33, $00, $44, $00, $3D, $00, $36, $00, $34, $00, $3E, $00, $3d
dw #$7F7F dw #$7F7F
; Crystal numbers
Notice_One:
db $75, $00, $32, $00, $41, $00, $48, $00, $42, $00, $43, $00, $30, $00, $3B, $00, $FF, $00, $3E, $00, $3D, $00, $34
dw #$7F7F
Notice_Two:
db $75, $00, $32, $00, $41, $00, $48, $00, $42, $00, $43, $00, $30, $00, $3B, $00, $FF, $00, $43, $00, $46, $00, $3E
dw #$7F7F
Notice_Three:
db $75, $00, $32, $00, $41, $00, $48, $00, $42, $00, $43, $00, $30, $00, $3B, $00, $FF, $00, $43, $00, $37, $00, $41, $00, $34, $00, $34
dw #$7F7F
Notice_Four:
db $75, $00, $32, $00, $41, $00, $48, $00, $42, $00, $43, $00, $30, $00, $3B, $00, $FF, $00, $35, $00, $3E, $00, $44, $00, $41
dw #$7F7F
Notice_Five:
db $75, $00, $32, $00, $41, $00, $48, $00, $42, $00, $43, $00, $30, $00, $3B, $00, $FF, $00, $35, $00, $38, $00, $45, $00, $34
dw #$7F7F
Notice_Six:
db $75, $00, $32, $00, $41, $00, $48, $00, $42, $00, $43, $00, $30, $00, $3B, $00, $FF, $00, $42, $00, $38, $00, $47
dw #$7F7F
Notice_Seven:
db $75, $00, $32, $00, $41, $00, $48, $00, $42, $00, $43, $00, $30, $00, $3B, $00, $FF, $00, $42, $00, $34, $00, $45, $00, $34, $00, $3D
dw #$7F7F

View File

@@ -177,7 +177,10 @@ NewHUD_DrawPrizeIcon:
.prize .prize
TYX TYX
LDA.l CrystalPendantFlags_2,X LDA.l CrystalPendantFlags_2,X
AND.w #$0040 BIT.w #$0080
BNE .no_icon
BIT.w #$0040
BNE .crystal BNE .crystal
LDY.w #!PTile LDY.w #!PTile
@@ -185,6 +188,10 @@ NewHUD_DrawPrizeIcon:
.crystal .crystal
LDY.w #!CTile LDY.w #!CTile
BRA .draw_prize
.no_icon
LDY.w #!BlankTile
.draw_prize .draw_prize
STY.w HUDPrizeIcon STY.w HUDPrizeIcon

View File

@@ -75,14 +75,6 @@ macro ProgrammableItemLogic(index)
?end: ?end:
endmacro endmacro
macro ValueShift()
TAX : LDA.b #$01
?start:
CPX #$00 : BEQ ?end
ASL
DEX
BRA ?start : ?end:
endmacro
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
;carry clear if pass ;carry clear if pass
;carry set if caught ;carry set if caught
@@ -109,7 +101,7 @@ ProcessEventItems:
REP #$20 ; set 16-bit accumulator REP #$20 ; set 16-bit accumulator
LDA.l GoalItemRequirement : BEQ ++ LDA.l GoalItemRequirement : BEQ ++
LDA.l GoalCounter : INC : STA.l GoalCounter LDA.l GoalCounter : INC : STA.l GoalCounter
CMP.l GoalItemRequirement : !BLT ++ CMP.l GoalItemRequirement : BCC ++
LDA.l TurnInGoalItems : AND.w #$00FF : BNE ++ LDA.l TurnInGoalItems : AND.w #$00FF : BNE ++
JSL.l ActivateGoal JSL.l ActivateGoal
++ ++
@@ -139,6 +131,7 @@ AddReceivedItemExpandedGetItem:
SEP #$30 SEP #$30
PLB : PLX PLB : PLX
STZ.w ShopPurchaseFlag
LDA.w ItemReceiptMethod : CMP.b #$01 ; thing we wrote over LDA.w ItemReceiptMethod : CMP.b #$01 ; thing we wrote over
RTL RTL
@@ -187,42 +180,42 @@ ItemBehavior:
LDX.b #$01 LDX.b #$01
JSR .increment_sword JSR .increment_sword
JSR .increment_shield JSR .increment_shield
REP #$10
RTS RTS
.master_sword .master_sword
SEP #$10 SEP #$10
LDX.b #$02 LDX.b #$02
JSR .increment_sword JSR .increment_sword
REP #$10
RTS RTS
.tempered_sword .tempered_sword
SEP #$10 SEP #$10
LDX.b #$03 LDX.b #$03
JSR .increment_sword JSR .increment_sword
REP #$10
RTS RTS
.gold_sword .gold_sword
SEP #$10 SEP #$10
LDX.b #$04 LDX.b #$04
JSR .increment_sword JSR .increment_sword
REP #$10
RTS RTS
.fighter_shield .fighter_shield
SEP #$10 SEP #$10
LDX.b #$01 LDX.b #$01
JSR .increment_shield JSR .increment_shield
REP #$10
RTS RTS
.red_shield .red_shield
SEP #$10 SEP #$10
LDX.b #$02 LDA.w ShopPurchaseFlag : BNE .shop_shield
JSR .increment_shield -
REP #$10 LDX.b #$02
JSR .increment_shield
RTS
.shop_shield
TYX
LDA.l InventoryTable_properties,X : BIT.b #$02 : BNE -
RTS RTS
.mirror_shield .mirror_shield
@@ -291,10 +284,12 @@ ItemBehavior:
REP #$20 REP #$20
LDA.w DungeonID : CMP.w #$0003 : BCC ..hc_sewers LDA.w DungeonID : CMP.w #$0003 : BCC ..hc_sewers
TAX TAX
LDA.l DungeonMask,X : ORA.l CompassField : STA.l CompassField LDA.l DungeonItemMasks,X : TAY
ORA.l CompassField : STA.l CompassField
JMP.w .increment_compass JMP.w .increment_compass
..hc_sewers ..hc_sewers
LDA.w #$C000 : ORA.l CompassField : STA.l CompassField LDA.w #$C000 : TAY
ORA.l CompassField : STA.l CompassField
JMP.w .increment_compass JMP.w .increment_compass
@@ -302,7 +297,7 @@ ItemBehavior:
REP #$20 REP #$20
LDA.w DungeonID : CMP.w #$0003 : BCC ..hc_sewers LDA.w DungeonID : CMP.w #$0003 : BCC ..hc_sewers
TAX TAX
LDA.l DungeonMask,X : ORA.l BigKeyField : STA.l BigKeyField LDA.l DungeonItemMasks,X : ORA.l BigKeyField : STA.l BigKeyField
JMP.w .increment_bigkey JMP.w .increment_bigkey
..hc_sewers ..hc_sewers
LDA.w #$C000 : ORA.l BigKeyField : STA.l BigKeyField LDA.w #$C000 : ORA.l BigKeyField : STA.l BigKeyField
@@ -312,10 +307,12 @@ ItemBehavior:
REP #$20 REP #$20
LDA.w DungeonID : CMP.w #$0003 : BCC ..hc_sewers LDA.w DungeonID : CMP.w #$0003 : BCC ..hc_sewers
TAX TAX
LDA.l DungeonMask,X : ORA.l MapField : STA.l MapField LDA.l DungeonItemMasks,X : TAY
ORA.l MapField : STA.l MapField
JMP.w .increment_map JMP.w .increment_map
..hc_sewers ..hc_sewers
LDA.w #$C000 : ORA.l MapField : STA.l MapField LDA.w #$C000 : TAY
ORA.l MapField : STA.l MapField
JMP.w .increment_map JMP.w .increment_map
.bow_and_arrows .bow_and_arrows
@@ -451,7 +448,7 @@ ItemBehavior:
REP #$20 ; set 16-bit accumulator REP #$20 ; set 16-bit accumulator
LDA.l GoalItemRequirement : BEQ + LDA.l GoalItemRequirement : BEQ +
LDA.l GoalCounter : INC : STA.l GoalCounter LDA.l GoalCounter : INC : STA.l GoalCounter
CMP.w GoalItemRequirement : !BLT + CMP.w GoalItemRequirement : BCC +
LDA.l TurnInGoalItems : AND.w #$00FF : BNE + LDA.l TurnInGoalItems : AND.w #$00FF : BNE +
JSL.l ActivateGoal JSL.l ActivateGoal
+ +
@@ -479,12 +476,15 @@ ItemBehavior:
LSR LSR
AND.w #$000F : ASL : TAX AND.w #$000F : ASL : TAX
LDA.w DungeonItemIDMap,X : TAX LDA.w DungeonItemIDMap,X : TAX
LDA.l DungeonMask,X : ORA.l MapField : STA.l MapField LDA.l DungeonItemMasks,X : TAY
ORA.l MapField : STA.l MapField
SEP #$20 SEP #$20
JMP.w .increment_map JMP.w .increment_map
.hc_map .hc_map
LDA.b #$C0 : ORA.l MapField+1 : STA.l MapField+1 REP #$20
LDA.w #$C000 : TAY
ORA.l MapField : STA.l MapField
JMP.w .increment_map JMP.w .increment_map
.free_compass .free_compass
@@ -492,12 +492,16 @@ ItemBehavior:
LSR LSR
AND.w #$000F : ASL : TAX AND.w #$000F : ASL : TAX
LDA.w DungeonItemIDMap,X : TAX LDA.w DungeonItemIDMap,X : TAX
LDA.l DungeonMask,X : ORA.l CompassField : STA.l CompassField LDA.l DungeonItemMasks,X : TAY
ORA.l CompassField : STA.l CompassField
SEP #$20 SEP #$20
JMP.w .increment_compass JMP.w .increment_compass
.hc_compass .hc_compass
LDA.b #$C0 : ORA.l CompassField+1 : STA.l CompassField+1 REP #$20
LDA.w #$C000 : TAY
ORA.l CompassField : STA.l CompassField
SEP #$20
JMP.w .increment_compass JMP.w .increment_compass
.free_bigkey .free_bigkey
@@ -505,7 +509,7 @@ ItemBehavior:
LSR LSR
AND.w #$000F : ASL : TAX AND.w #$000F : ASL : TAX
LDA.w DungeonItemIDMap,X : TAX LDA.w DungeonItemIDMap,X : TAX
LDA.l DungeonMask,X : ORA.l BigKeyField : STA.l BigKeyField LDA.l DungeonItemMasks,X : ORA.l BigKeyField : STA.l BigKeyField
SEP #$20 SEP #$20
JMP.w .increment_bigkey JMP.w .increment_bigkey
@@ -537,50 +541,68 @@ ItemBehavior:
LDA.l CurrentSmallKeys : INC : STA.l CurrentSmallKeys LDA.l CurrentSmallKeys : INC : STA.l CurrentSmallKeys
RTS RTS
.normal .normal
LDA.w DungeonID : CMP.b #$FF : BEQ .done LDA.w DungeonID : BMI +
LDA.l CurrentSmallKeys : INC : STA.l CurrentSmallKeys LDA.l CurrentSmallKeys : INC : STA.l CurrentSmallKeys
RTS
+
RTS
.increment_sword .increment_sword
LDA.l HighestSword LDA.l HighestSword
INC : STA.b Scrap04 : CPX.b Scrap04 : !BLT + ; don't increment unless we're getting a better sword INC : STA.b Scrap04 : CPX.b Scrap04 : BCC + ; don't increment unless we're getting a better sword
TXA : STA.l HighestSword TXA : STA.l HighestSword
+ +
RTS RTS
.increment_shield .increment_shield
LDA.l HighestShield LDA.l HighestShield
INC : STA.b Scrap04 : CPX.b Scrap04 : !BLT + ; don't increment unless we're getting a better shield INC : STA.b Scrap04 : CPX.b Scrap04 : BCC + ; don't increment unless we're getting a better shield
TXA : STA.l HighestShield TXA : STA.l HighestShield
+ +
RTS RTS
.increment_mail .increment_mail
LDA.l HighestMail LDA.l HighestMail
INC : STA.b Scrap04 : CPX.b Scrap04 : !BLT + ; don't increment unless we're getting a better mail INC : STA.b Scrap04 : CPX.b Scrap04 : BCC + ; don't increment unless we're getting a better mail
TXA : STA.l HighestMail TXA : STA.l HighestMail
+ +
RTS RTS
.increment_bigkey .increment_bigkey
SEP #$30 SEP #$20
LDA.l BigKeysBigChests LDA.l BigKeysBigChests
CLC : ADC.b #$10 CLC : ADC.b #$10
STA.l BigKeysBigChests STA.l BigKeysBigChests
RTS RTS
.increment_map .increment_map
SEP #$30 SEP #$20
LDA.l MapsCompasses LDA.l MapsCompasses
CLC : ADC.b #$10 CLC : ADC.b #$10
STA.l MapsCompasses STA.l MapsCompasses
JSL.l MaybeFlagMapTotalPickup
RTS RTS
.increment_compass .increment_compass
SEP #$30 SEP #$20
LDA.l MapsCompasses : INC : AND.b #$0F : TAX LDA.l MapsCompasses : INC : AND.b #$0F : TAX
LDA.l MapsCompasses : AND.b #$F0 : STA.l MapsCompasses LDA.l MapsCompasses : AND.b #$F0 : STA.l MapsCompasses
TXA : ORA.l MapsCompasses : STA.l MapsCompasses TXA : ORA.l MapsCompasses : STA.l MapsCompasses
JSL MaybeFlagCompassTotalPickup JSL MaybeFlagCompassTotalPickup
RTS
.free_crystal
REP #$20
LSR
AND.w #$000F : TAX
LDA.w #$0000
SEC
-
ROL
DEX
BPL -
SEP #$20
ORA.l CrystalsField : STA.l CrystalsField
.done .done
RTS RTS
@@ -589,10 +611,10 @@ ResolveReceipt:
PHA : PHX PHA : PHX
PHK : PLB PHK : PLB
JSL.l PreItemGet JSL.l PreItemGet
LDA.w ItemReceiptID ; Item Value LDA.w ItemReceiptID
.get_item .get_item
JSR.w AttemptItemSubstitution JSR.w AttemptItemSubstitution
JSR.w HandleBowTracking ; Progressive bows get resolved to new loot id JSR.w HandleBowTracking
JSR.w ResolveLootID JSR.w ResolveLootID
.have_item .have_item
STA.w ItemReceiptID STA.w ItemReceiptID
@@ -617,10 +639,10 @@ ResolveLootID:
TAY TAY
REP #$30 REP #$30
AND.w #$00FF : ASL : TAX AND.w #$00FF : ASL : TAX
SEP #$30
TYA TYA
JMP.w (ItemReceipts_resolution,X) JMP.w (ItemReceipts_resolution,X)
.have_item .have_item
SEP #$30
PLB : PLX PLB : PLX
RTS RTS
@@ -628,14 +650,16 @@ ResolveLootID:
JMP.w .have_item JMP.w .have_item
.bottles .bottles
JSR.w CountBottles : CMP.l BottleLimit : !BLT + SEP #$30
JSR.w CountBottles : CMP.l BottleLimit : BCC +
LDA.l BottleLimitReplacement LDA.l BottleLimitReplacement
JMP.w .get_item JMP.w .get_item
+ +
LDA.w ItemReceiptID TYA
JMP.w .have_item JMP.w .have_item
.magic .magic
SEP #$20
LDA.l MagicConsumption : TAX LDA.l MagicConsumption : TAX
LDA.w ResolveLootID_magic_ids,X LDA.w ResolveLootID_magic_ids,X
JMP.w .have_item JMP.w .have_item
@@ -643,6 +667,7 @@ ResolveLootID:
db $4E, $4F, $4F db $4E, $4F, $4F
.prog_sword .prog_sword
SEP #$20
LDA.l HighestSword LDA.l HighestSword
CMP.l ProgressiveSwordLimit : BCC + CMP.l ProgressiveSwordLimit : BCC +
LDA.l ProgressiveSwordReplacement LDA.l ProgressiveSwordReplacement
@@ -655,6 +680,7 @@ ResolveLootID:
db $49, $50, $02, $03, $03 db $49, $50, $02, $03, $03
.shields .shields
SEP #$20
LDA.l HighestShield LDA.l HighestShield
CMP.l ProgressiveShieldLimit : BCC + CMP.l ProgressiveShieldLimit : BCC +
LDA.l ProgressiveShieldReplacement LDA.l ProgressiveShieldReplacement
@@ -667,6 +693,7 @@ ResolveLootID:
db $04, $05, $06, $06 db $04, $05, $06, $06
.armor .armor
SEP #$20
LDA.l HighestMail LDA.l HighestMail
CMP.l ProgressiveArmorLimit : BCC + CMP.l ProgressiveArmorLimit : BCC +
LDA.l ProgressiveArmorReplacement LDA.l ProgressiveArmorReplacement
@@ -679,6 +706,7 @@ ResolveLootID:
.gloves .gloves
SEP #$20
LDA.l GloveEquipment : TAX LDA.l GloveEquipment : TAX
LDA.w ResolveLootID_gloves_ids,X LDA.w ResolveLootID_gloves_ids,X
JMP.w .have_item JMP.w .have_item
@@ -686,6 +714,7 @@ ResolveLootID:
db $1B, $1C, $1C db $1B, $1C, $1C
.progressive_bow .progressive_bow
SEP #$20
LDA.l BowEquipment : INC : LSR : CMP.l ProgressiveBowLimit : BCC + LDA.l BowEquipment : INC : LSR : CMP.l ProgressiveBowLimit : BCC +
LDA.l ProgressiveBowReplacement LDA.l ProgressiveBowReplacement
JMP.w .get_item JMP.w .get_item
@@ -696,6 +725,7 @@ ResolveLootID:
JMP.w .get_item JMP.w .get_item
.progressive_bow_2 .progressive_bow_2
SEP #$20
LDA.l BowEquipment : INC : LSR : CMP.l ProgressiveBowLimit : BCC + LDA.l BowEquipment : INC : LSR : CMP.l ProgressiveBowLimit : BCC +
LDA.l ProgressiveBowReplacement LDA.l ProgressiveBowReplacement
JMP.w .get_item JMP.w .get_item
@@ -826,7 +856,7 @@ GetRNGItemSingle:
LDX.b #$00 LDX.b #$00
.single_reroll .single_reroll
JSL.l GetRandomInt : AND.b #$7F ; select random value JSL.l GetRandomInt : AND.b #$7F ; select random value
INX : CPX.b #$7F : !BLT + : LDA.b #$00 : BRA +++ : + ; default to 0 if too many attempts INX : CPX.b #$7F : BCC + : LDA.b #$00 : BRA +++ : + ; default to 0 if too many attempts
CMP.l RNGSingleTableSize : !BGE .single_reroll CMP.l RNGSingleTableSize : !BGE .single_reroll
+++ +++
@@ -837,9 +867,9 @@ GetRNGItemSingle:
TYA TYA
JSR.w CheckSingleItem : BEQ .single_unused ; already used JSR.w CheckSingleItem : BEQ .single_unused ; already used
LDA.w ScratchBufferV : INC ; increment index LDA.w ScratchBufferV : INC ; increment index
CMP.l RNGSingleTableSize : !BLT +++ : LDA.b #$00 : +++ ; rollover index if needed CMP.l RNGSingleTableSize : BCC +++ : LDA.b #$00 : +++ ; rollover index if needed
STA.w ScratchBufferV ; store index STA.w ScratchBufferV ; store index
INX : TAY : TXA : CMP.l RNGSingleTableSize : !BLT .recheck INX : TAY : TXA : CMP.l RNGSingleTableSize : BCC .recheck
LDA.b #$5A ; everything is gone, default to null item - MAKE THIS AN OPTION FOR THIS AND THE OTHER ONE LDA.b #$5A ; everything is gone, default to null item - MAKE THIS AN OPTION FOR THIS AND THE OTHER ONE
BRA .single_done BRA .single_done
.single_unused .single_unused
@@ -891,7 +921,7 @@ GetRNGItemMulti:
LDX.b #$00 LDX.b #$00
- ; reroll - ; reroll
JSL.l GetRandomInt : AND.b #$7F ; select random value JSL.l GetRandomInt : AND.b #$7F ; select random value
INX : CPX.b #$7F : !BLT + : LDA.b 00 : BRA .done : + ; default to 0 if too many attempts INX : CPX.b #$7F : BCC + : LDA.b 00 : BRA .done : + ; default to 0 if too many attempts
CMP.l RNGMultiTableSize : !BGE - CMP.l RNGMultiTableSize : !BGE -
.done .done
STA.l RNGLockIn STA.l RNGLockIn
@@ -930,12 +960,13 @@ AttemptItemSubstitution:
TXA : LSR #2 : TAX TXA : LSR #2 : TAX
LDA.l ItemLimitCounts, X LDA.l ItemLimitCounts, X
PLX PLX
CMP.l ItemSubstitutionRules+1, X : !BLT + CMP.l ItemSubstitutionRules+1, X : BCC +
LDA.l ItemSubstitutionRules+2, X : STA.b 1,S LDA.l ItemSubstitutionRules+2, X : STA.b 1,S
+: BEQ .exit +
.noMatch BEQ .exit
.noMatch
INX #4 INX #4
BRA - BRA -
.exit .exit
PLA : PLX PLA : PLX
RTS RTS
@@ -967,101 +998,66 @@ ChestPrep:
LDY.b Scrap0C ; get item value LDY.b Scrap0C ; get item value
SEC SEC
RTL RTL
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
; Set a flag in SRAM if we pick up a compass in its own dungeon with HUD compass
; counts on
MaybeFlagCompassTotalPickup: MaybeFlagCompassTotalPickup:
LDA.l CompassMode : AND.b #$0F : BEQ .done LDA.l CompassMode : AND.b #$0F : BEQ .done
LDA.w DungeonID : CMP.b #$FF : BEQ .done LDA.w DungeonID : BMI .done
LSR : STA.b Scrap04 : LDA.b #$0F : !SUB Scrap04 ; Compute flag "index" LDA.w ItemReceiptID : CMP.b #$25 : BEQ .set_flag
CPY.b #$25 : BEQ .setFlag ; Set flag if it's a compass for this dungeon REP #$20
STA.b Scrap04 AND.w #$000F : ASL : TAX
TYA : AND.b #$0F : CMP.b Scrap04 : BNE .done ; Check if compass is for this dungeon LDA.w DungeonItemIDMap,X : CMP.w DungeonID : BNE .done
.setFlag .set_flag
CMP.b #$08 : !BGE ++ REP #$20
%ValueShift() TYA : ORA.l CompassCountDisplay : STA.l CompassCountDisplay
ORA.l CompassCountDisplay : STA.l CompassCountDisplay
BRA .done
++
!SUB #$08
%ValueShift()
BIT.b #$C0 : BEQ + : LDA.b #$C0 : + ; Make Hyrule Castle / Sewers Count for Both
ORA.l CompassCountDisplay+1 : STA.l CompassCountDisplay+1
.done .done
RTL RTL
MaybeFlagMapTotalPickup:
LDA.l MapHUDMode : AND.b #$0F : BEQ .done
LDA.w DungeonID : BMI .done
LDA.w ItemReceiptID : CMP.b #$33 : BEQ .set_flag
REP #$20
AND.w #$000F : ASL : TAX
LDA.w DungeonItemIDMap,X : CMP.w DungeonID : BNE .done
.set_flag
REP #$20
TYA : ORA.l MapCountDisplay : STA.l MapCountDisplay
.done
RTL
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
; Set the dungeon item count display flags if we're entering a dungeon and have the ; Set the dungeon item count display flags if we're entering a dungeon and have the
; corresponding dungeon item ; corresponding dungeon item
MaybeFlagDungeonTotalsEntrance: MaybeFlagDungeonTotalsEntrance:
LDX.w DungeonID : CPX.b #$FF : BEQ .done ; Skip if we're not entering dungeon LDX.w DungeonID : BMI .done ; Skip if we're not entering dungeon
LDA.l CompassMode : AND.w #$000F : BEQ .maps ; Skip if we're not showing compass counts REP #$10
JSR.w FlagCompassCount LDA.l DungeonItemMasks,X : TAY
.maps LDA.l CompassMode : AND.w #$000F : BEQ .maps ; Skip if we're not showing compass counts
LDA.l MapHUDMode : AND.w #$000F : BEQ .done JSR.w FlagCompassCount
LDX.w DungeonID .maps
JSR.w FlagMapCount LDA.l MapHUDMode : AND.w #$000F : BEQ .done
LDX.w DungeonID
JSR.w FlagMapCount
.done .done
RTL RTL
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
FlagCompassCount: FlagCompassCount:
CMP.w #$0002 : BEQ .compassShown CMP.w #$0002 : BEQ .compass_shown
LDA.l CompassField : AND.l DungeonItemMasks, X : BEQ .done ; skip if we don't have compass LDA.l CompassField : AND.l DungeonItemMasks, X : BEQ .done ; skip if we don't have compass
.compassShown .compass_shown
SEP #$20 TYA : ORA.l CompassCountDisplay : STA.l CompassCountDisplay
TXA : LSR : STA.b Scrap04 : LDA.b #$0F : !SUB Scrap04 ; Compute flag index
CMP.b #$08 : !BGE ++
%ValueShift()
ORA.l CompassCountDisplay : STA.l CompassCountDisplay
REP #$20
BRA .done
++
!SUB #$08
%ValueShift()
BIT.b #$C0 : BEQ + : LDA.b #$C0 : + ; Make Hyrule Castle / Sewers Count for Both
ORA.l CompassCountDisplay+1 : STA.l CompassCountDisplay+1
REP #$20
.done .done
RTS RTS
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
FlagMapCount: FlagMapCount:
CMP.w #$0002 : BEQ .mapShown CMP.w #$0002 : BEQ .mapShown
LDA.l MapField : AND.l DungeonItemMasks, X : BEQ .done ; skip if we don't have map LDA.l MapField : AND.l DungeonItemMasks, X : BEQ .done ; skip if we don't have map
.mapShown .mapShown
SEP #$20 TYA : ORA.l MapCountDisplay : STA.l MapCountDisplay
TXA : LSR : STA.b Scrap04 : LDA.b #$0F : !SUB Scrap04 ; Compute flag index
CMP.b #$08 : !BGE ++
%ValueShift()
ORA.l MapCountDisplay : STA.l MapCountDisplay
REP #$20
BRA .done
++
!SUB #$08
%ValueShift()
BIT.b #$C0 : BEQ + : LDA.b #$C0 : + ; Make Hyrule Castle / Sewers Count for Both
ORA.l MapCountDisplay+1 : STA.l MapCountDisplay+1
REP #$20
.done .done
RTS RTS
;--------------------------------------------------------------------------------
MaybeFlagMapTotalPickup:
LDA.l MapHUDMode : AND.b #$0F : BEQ .done
LDA.w DungeonID : CMP.b #$FF : BEQ .done
LSR : STA.b Scrap04 : LDA.b #$0F : !SUB Scrap04 ; Compute flag "index"
CPY.b #$33 : BEQ .setFlag ; Set flag if it's a compass for this dungeon
STA.b Scrap04
TYA : AND.b #$0F : CMP.b Scrap04 : BNE .done ; Check if map is for this dungeon
.setFlag
CMP.b #$08 : !BGE ++
%ValueShift()
ORA.l MapCountDisplay : STA.l MapCountDisplay
BRA .done
++
!SUB #$08
%ValueShift()
BIT.b #$C0 : BEQ + : LDA.b #$C0 : + ; Make Hyrule Castle / Sewers Count for Both
ORA.l MapCountDisplay+1 : STA.l MapCountDisplay+1
.done
RTL
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
DungeonItemIDMap: ; Maps lower four bits of our new dungeon items to DungeonID DungeonItemIDMap: ; Maps lower four bits of our new dungeon items to DungeonID
dw $FFFF dw $FFFF

View File

@@ -47,11 +47,11 @@ ItemCheck_SickKid:
RTL RTL
ItemCheck_TreeKid: ItemCheck_TreeKid:
LDA.l NpcFlags : AND.b #$08 ; FluteBoy_Chillin - 73: LDA FluteEquipment LDA.l NpcFlags : AND.b #$08
RTL RTL
ItemCheck_TreeKid2: ItemCheck_TreeKid2:
LDA.l NpcFlags : AND.b #$08 : CMP.b #$08 ; FluteAardvark_InitialStateFromFluteState - 225: LDA FluteEquipment : AND.b #$03 LDA.l NpcFlags : AND.b #$08 : CMP.b #$08
TDC ; ?? TODO TDC ; ?? TODO
RTL RTL

143
overworldmap.asm Normal file
View File

@@ -0,0 +1,143 @@
pushpc
org $0AC02B
DrawPrizesOverride:
LDX.b #$FF
.loopStart
INX : PHX
JSR OverworldMap_CheckForPrize
BCC + : JMP .skip_draw : +
TXA : ASL A : TAX
LDA.l MapCompassFlag
AND #$01 : BNE +
LDA.l WorldMapIcon_posx_vanilla+1, X : STA.l $7EC10B
LDA.l WorldMapIcon_posx_vanilla, X : STA.l $7EC10A
LDA.l WorldMapIcon_posy_vanilla+1, X : STA.l $7EC109
LDA.l WorldMapIcon_posy_vanilla, X : STA.l $7EC108
BRA .adjustment
+ LDA.l WorldMapIcon_posx_located+1, X : STA.l $7EC10B
LDA.l WorldMapIcon_posx_located, X : STA.l $7EC10A
LDA.l WorldMapIcon_posy_located+1, X : STA.l $7EC109
LDA.l WorldMapIcon_posy_located, X : STA.l $7EC108
.adjustment
LDA.l WorldMapIcon_tile, X : CMP #$FF : BEQ .skip_draw
LDA.l WorldMapIcon_tile+1, X : BEQ .dont_adjust
CMP.b #$64 : BEQ .is_crystal
LDA.b $1A : AND.b #$10 : BNE .skip_draw
.is_crystal
JSR.w WorldMapIcon_AdjustCoordinate
.dont_adjust
JSR.w WorldMap_CalculateOAMCoordinates
BCC .skip_draw
PLX : PHX : TXA : ASL A : TAX
LDA.l WorldMapIcon_tile+1, X : BEQ .is_red_x
LDA.l MapCompassFlag : CMP.b #$01 : BEQ .is_red_x
LDA.l WorldMapIcon_tile+1, X : STA.b $0D
LDA.l WorldMapIcon_tile, X : STA.b $0C
LDA.b #$02 : BRA .continue
.is_red_x
LDA.b $1A : LSR #3 : AND.b #$03 : TAX
LDA.l WorldMap_RedXChars,X : STA.b $0D
LDA.b #$32 : STA.b $0C : LDA.b #$00
.continue
STA.b $0B
PLX : PHX
INX : JSR.w WorldMap_HandleSpriteBlink
.skip_draw
; end of loop
PLX : CPX #12 : BCS + : JMP .loopStart : +
PLA : STA.l $7EC10B
PLA : STA.l $7EC10A
PLA : STA.l $7EC109
PLA : STA.l $7EC108
RTS
; X - the index of the prize marker
OverworldMap_CheckForPrize:
PHX
LDA #$00 : STA.l MapCompassFlag
JSR OverworldMap_CheckForCompass
BCC +
LDA.l MapCompassFlag : ORA #$01 : STA.l MapCompassFlag
LDA CurrentWorld : AND #$40 : BNE ++ ; is the compass position on LW or DW?
LDA.l WorldCompassMask, X : BEQ + : JMP .fail
++ LDA.l WorldCompassMask, X : BNE + : JMP .fail
+ JSR OverworldMap_CheckForMap
BCC +
LDA.l MapCompassFlag : ORA #$02 : STA.l MapCompassFlag
+
LDA.l MapCompassFlag : BEQ .fail
CMP #$02 : BNE .checkIfObtained
LDA CurrentWorld : AND #$40 : BNE +
CPX #3 : BCS .fail : BRA .checkIfObtained
+ CPX #10 : BCS .fail
CPX #3 : BCC .fail
.checkIfObtained
LDA.l MC_DungeonIdsForPrize, X
BPL +++ : CLC : BRA .done : +++ ; non-prize flags
CMP.b #$03 : BCC .hyrule_castle
ASL : TAX
REP #$20
LDA.l DungeonsCompleted : AND.l DungeonItemMasks,X : BNE .fail
CLC : BRA .done
; see if hyrule castle has been completely cleared
.hyrule_castle
LDA.l CompassTotalsWRAM, X : SEC : SBC DungeonLocationsChecked, X : BEQ .fail
CLC : BRA .done
.fail
SEC
.done
SEP #$20
PLX
RTS
; X - which compass in question
; CLC - should not move indicator
; SEC - yep indicator can move
OverworldMap_CheckForCompass:
LDA.l CompassMode : AND #$80 : BEQ .unset ; should I check for compass logic
LDA.l CompassMode : AND #$40 : BEQ .set ; compasses/maps aren't shuffled
LDA.l CompassMode : AND #$20 : BNE +
JSR OverworldMap_CheckForMap : BCC .unset : BRA .set
+ LDA.l CompassExists, X : BEQ .set ; compass doesn't exist
PHX
LDA.l MC_SRAM_Offsets, X : TAX ; put compass offset into X
LDA CompassField, X : ORA MapOverlay, X
PLX
AND.l MC_Masks, X : BNE .set ; is the compass obtained
.unset
CLC
RTS
.set
SEC
RTS
; map - which map in question
; CLC - should not show exact prize
; SEC - yep should show exact prize
OverworldMap_CheckForMap:
LDA.l MapMode : BEQ .set ; obtaining map doesn't change anything
LDA CurrentWorld : AND #$40 : BNE + ; not really sure on this check
LDA MapField : ORA MapOverlay : AND.b #$01 : BNE .set : BRA .continue
+ LDA MapField : ORA MapOverlay : AND.b #$02 : BNE .set
.continue
PHX
LDA.l MC_SRAM_Offsets, X : TAX ; put map offset into X
LDA MapField, X : ORA MapOverlay, X
PLX
AND.l MC_Masks, X : BNE .set ; is the map obtained?
.unset
CLC
RTS
.set
SEC
RTS
pullpc

View File

@@ -51,70 +51,6 @@ GetCrystalNumber:
PLX PLX
RTL RTL
;================================================================================ ;================================================================================
OverworldMap_CheckObject:
PHX
;CPX.b #$01 : BNE + : JMP ++ : + : JMP .fail
LDA.l CurrentWorld : AND.b #$40 : BNE +
;LW Map
LDA.l MapMode : BEQ +++
LDA.l MapField : ORA.l MapOverlay : AND.b #$01 : BNE +++
PHX
LDA.l .lw_map_offsets, X : TAX ; put map offset into X
LDA.l MapField, X : ORA.l MapOverlay, X
PLX
AND.l .lw_map_masks, X : BNE +++
JMP .fail
+++
LDA.l .lw_offsets, X
BPL +++ : CLC : BRA .done : +++ ; don't display master sword
TAX : BRA ++
+
;DW Map
LDA.l MapMode : BEQ +++
LDA.l MapField : ORA.l MapOverlay : AND.b #$02 : BNE +++
PHX
LDA.l .dw_map_offsets, X : TAX ; put map offset into X
LDA.l MapField, X : ORA.l MapOverlay, X
PLX
AND.l .dw_map_masks, X : BNE +++
JMP .fail
+++
LDA.l .dw_offsets, X
TAX : BRA ++
SEC
PLX
RTL
++
LDA.l CrystalPendantFlags_2, X
AND.b #$40 : BNE .checkCrystal
.checkPendant
LDA.l PendantsField : AND.l CrystalPendantFlags, X : BNE .fail
CLC : BRA .done
.checkCrystal
LDA.l CrystalsField : AND.l CrystalPendantFlags, X : BNE .fail
CLC : BRA .done
.fail
SEC
.done
PLX
RTL
.lw_offsets
db $02, $0A, $03, $FF
.dw_offsets
db $06, $08, $0C, $0B, $07, $09, $05
.lw_map_offsets
db $01, $00, $01
; pod skull trock thieves mire ice swamp
.dw_map_offsets
db $01, $00, $00, $00, $01, $00, $01
.lw_map_masks
db $20, $20, $10, $00
.dw_map_masks
db $02, $80, $08, $10, $01, $40, $04
;================================================================================
SetLWDWMap: SetLWDWMap:
PHP PHP
SEP #$20 ; set 8-bit accumulator SEP #$20 ; set 8-bit accumulator

31
ram.asm
View File

@@ -48,6 +48,8 @@ NMIHUD = $7E0016 ; during NMI.
NMIINCR = $7E0017 ; NMIINCR = $7E0017 ;
NMIUP1100 = $7E0018 ; NMIUP1100 = $7E0018 ;
UPINCVH = $7E0019 ; Incremental upload VRAM high byte UPINCVH = $7E0019 ; Incremental upload VRAM high byte
LinkAbsoluteY = $7E0020 ; Link's absolute coordinates. Word length
LinkAbsoluteX = $7E0022 ;
FrameCounter = $7E001A ; Increments every frame that the game isn't lagging FrameCounter = $7E001A ; Increments every frame that the game isn't lagging
IndoorsFlag = $7E001B ; $00 = Outdoors | $01 = Indoors IndoorsFlag = $7E001B ; $00 = Outdoors | $01 = Indoors
MAINDESQ = $7E001C ; PPU register queues written during NMI MAINDESQ = $7E001C ; PPU register queues written during NMI
@@ -186,8 +188,12 @@ RaceGameFlag = $7E021B ;
; ;
MessageJunk = $7E0223 ; Zeroed but never used (?) MessageJunk = $7E0223 ; Zeroed but never used (?)
; ;
;CoolScratch = $7E0224 ; 0x5C bytes of free ram ShopPurchaseFlag = $7E0224 ; $01 = Shop purchase item receipt.
SpriteID = $7E0230 ; ;CoolScratch = $7E0226 ; 0x5A bytes of free ram
SpriteID = $7E0230 ; 0x0A bytes
;
AncillaVelocityZ = $7E0294 ; 0x0A bytes
AncillaZCoord = $7E029E ; 0x0A bytes
; ;
ItemReceiptID = $7E02D8 ; ItemReceiptID = $7E02D8 ;
ItemReceiptPose = $7E02DA ; $00 = No pose | $01 = One hand up | $02 = Two hands up ItemReceiptPose = $7E02DA ; $00 = No pose | $01 = One hand up | $02 = Two hands up
@@ -196,7 +202,7 @@ BunnyFlag = $7E02E0 ; $00 = Link | $01 = Bunny
Poofing = $7E02E1 ; Flags cape and bunny poof. Poofing = $7E02E1 ; Flags cape and bunny poof.
PoofTimer = $7E02E2 ; Countdown timer for poofing. PoofTimer = $7E02E2 ; Countdown timer for poofing.
SwordCooldown = $7E02E3 ; Cooldown for sword after dashing through an enemy. SwordCooldown = $7E02E3 ; Cooldown for sword after dashing through an enemy.
CutsceneFlag = $7E02E4 ; Flags various cutscenes. All non-zero behave the same. CutsceneFlag = $7E02E4 ; Flags various cutscenes.
; ;
ItemReceiptMethod = $7E02E9 ; ItemReceiptMethod = $7E02E9 ;
; ;
@@ -233,7 +239,7 @@ FluteTimer = $7E03F0 ; Countdown timer for being able to use the fl
; ;
YButtonOverride = $7E03FC ; Y override for minigames. $00 = Selected item | $01 = Shovel | $02 = Bow YButtonOverride = $7E03FC ; Y override for minigames. $00 = Selected item | $01 = Shovel | $02 = Bow
; ;
ItemsTaken = $7E0403 ; Items taken in a room: b k u t s e h c RoomItemsTaken = $7E0403 ; Items taken in a room: b k u t s e h c
; b = boss kill/item | k = key/heart piece (prevents crystals) ; b = boss kill/item | k = key/heart piece (prevents crystals)
; u = 2nd key/heart piece | t = chest 4/rupees/swamp drain/bomb floor/mire wall ; u = 2nd key/heart piece | t = chest 4/rupees/swamp drain/bomb floor/mire wall
; s = chest 3/pod or dp wall | e, h, c = chest 2, 1, 0 ; s = chest 3/pod or dp wall | e, h, c = chest 2, 1, 0
@@ -295,6 +301,11 @@ SaveFileIndex = $7E0B9D ;
; ;
SpriteAncillaInteract = $7E0BA0 ; If nonzero, ancillae do not interact with the sprite. $10 bytes. SpriteAncillaInteract = $7E0BA0 ; If nonzero, ancillae do not interact with the sprite. $10 bytes.
; ;
AncillaCoordYLow = $7E0BFA ;
AncillaCoordXLow = $7E0C04 ;
AncillaCoordYHigh = $7E0C0E ;
AncillaCoordXHigh = $7E0C18 ;
;
AncillaVelocityY = $7E0C22 ; $0A bytes. AncillaVelocityY = $7E0C22 ; $0A bytes.
AncillaVelocityX = $7E0C2C ; $0A bytes. AncillaVelocityX = $7E0C2C ; $0A bytes.
; ;
@@ -302,6 +313,8 @@ AncillaID = $7E0C4A ; $0A bytes.
; ;
AncillaGet = $7E0C5E ; Used by varius ancilla in various ways. $0F bytes. AncillaGet = $7E0C5E ; Used by varius ancilla in various ways. $0F bytes.
; ;
AncillaLayer = $7E0C7C ;
;
SpriteBump = $7E0CD2 ; See symbols_wram.asm. $10 bytes. SpriteBump = $7E0CD2 ; See symbols_wram.asm. $10 bytes.
; ;
TreePullKills = $7E0CFB ; Kills for tree pulls. TreePullKills = $7E0CFB ; Kills for tree pulls.
@@ -349,6 +362,8 @@ SpriteZCoord = $7E0F70 ;
SpriteVelocityZ = $7E0F80 ; SpriteVelocityZ = $7E0F80 ;
SpriteSubPixelZ = $7E0F90 ; SpriteSubPixelZ = $7E0F90 ;
; ;
CurrentSpriteSlot = $7E0FA0 ; Holds the current sprite/ancilla's index
;
FreezeSprites = $7E0FC1 ; "Seems to freeze sprites" FreezeSprites = $7E0FC1 ; "Seems to freeze sprites"
; ;
PrizePackIndexes = $7E0FC7 ; $07 bytes. One for each prize pack. PrizePackIndexes = $7E0FC7 ; $07 bytes. One for each prize pack.
@@ -572,7 +587,8 @@ CompassTotalsWRAM: skip $10 ; \ Compass and map dungeon HUD display total
MapTotalsWRAM: skip $10 ; / on boot for tracking. MapTotalsWRAM: skip $10 ; / on boot for tracking.
skip $30 ; Reserved for general dungeon tracking data. May have over skip $30 ; Reserved for general dungeon tracking data. May have over
; allocated here. Feel free to reassign. ; allocated here. Feel free to reassign.
skip $40 ; Unused MapCompassFlag: skip 2 ; Used to flag overworld map drawing.
skip $3E ; Unused
skip $260 ; Unused skip $260 ; Unused
DialogBuffer: skip $100 ; Dialog Buffer DialogBuffer: skip $100 ; Dialog Buffer
; ;
@@ -730,7 +746,7 @@ endmacro
%assertRAM(ForceSwordUp, $7E03EF) %assertRAM(ForceSwordUp, $7E03EF)
%assertRAM(FluteTimer, $7E03F0) %assertRAM(FluteTimer, $7E03F0)
%assertRAM(YButtonOverride, $7E03FC) %assertRAM(YButtonOverride, $7E03FC)
%assertRAM(ItemsTaken, $7E0403) %assertRAM(RoomItemsTaken, $7E0403)
%assertRAM(DungeonID, $7E040C) %assertRAM(DungeonID, $7E040C)
%assertRAM(LayerAdjustment, $7E047A) %assertRAM(LayerAdjustment, $7E047A)
%assertRAM(RoomIndexMirror, $7E048E) %assertRAM(RoomIndexMirror, $7E048E)
@@ -768,6 +784,7 @@ endmacro
%assertRAM(AncillaVelocityX, $7E0C2C) %assertRAM(AncillaVelocityX, $7E0C2C)
%assertRAM(AncillaID, $7E0C4A) %assertRAM(AncillaID, $7E0C4A)
%assertRAM(AncillaGet, $7E0C5E) %assertRAM(AncillaGet, $7E0C5E)
%assertRAM(AncillaLayer, $7E0C7C)
%assertRAM(SpriteBump, $7E0CD2) %assertRAM(SpriteBump, $7E0CD2)
%assertRAM(SpritePosYLow, $7E0D00) %assertRAM(SpritePosYLow, $7E0D00)
%assertRAM(SpritePosXLow, $7E0D10) %assertRAM(SpritePosXLow, $7E0D10)
@@ -826,6 +843,7 @@ endmacro
%assertRAM(SpriteZCoord, $7E0F70) %assertRAM(SpriteZCoord, $7E0F70)
%assertRAM(SpriteVelocityZ, $7E0F80) %assertRAM(SpriteVelocityZ, $7E0F80)
%assertRAM(SpriteSubPixelZ, $7E0F90) %assertRAM(SpriteSubPixelZ, $7E0F90)
%assertRAM(CurrentSpriteSlot, $7E0FA0)
%assertRAM(FreezeSprites, $7E0FC1) %assertRAM(FreezeSprites, $7E0FC1)
%assertRAM(PrizePackIndexes, $7E0FC7) %assertRAM(PrizePackIndexes, $7E0FC7)
%assertRAM(SpriteCoordCacheX, $7E0FD8) %assertRAM(SpriteCoordCacheX, $7E0FD8)
@@ -945,6 +963,7 @@ endmacro
%assertRAM(TxStatus, $7F53FF) %assertRAM(TxStatus, $7F53FF)
%assertRAM(CompassTotalsWRAM, $7F5410) %assertRAM(CompassTotalsWRAM, $7F5410)
%assertRAM(MapTotalsWRAM, $7F5420) %assertRAM(MapTotalsWRAM, $7F5420)
%assertRAM(MapCompassFlag, $7F5460)
%assertRAM(DialogBuffer, $7F5700) %assertRAM(DialogBuffer, $7F5700)
%assertRAM(MiniGameTime, $7FFE00) %assertRAM(MiniGameTime, $7FFE00)
%assertRAM(MiniGameTimeFinal, $7FFE04) %assertRAM(MiniGameTimeFinal, $7FFE04)

View File

@@ -21,7 +21,7 @@ RigChestRNG:
RTL RTL
.forceHeart .forceHeart
LDA.b #$33 : STA.b ScrapBufferBD+$0B ; assure the correct state if player talked to shopkeeper LDA.b #$33 : STA.b ScrapBufferBD+$0B ; assure the correct state if player talked to shopkeeper
LDA.w ItemsTaken : AND.b #$40 : BNE .notHeart LDA.w RoomItemsTaken : AND.b #$40 : BNE .notHeart
LDA.b #$07 ; give prize item LDA.b #$07 ; give prize item
RTL RTL
.notHeart .notHeart

View File

@@ -350,59 +350,59 @@ Shopkeeper_SetupHitboxes:
RTS RTS
Shopkeeper_BuyItem: Shopkeeper_BuyItem:
PHX : PHY PHX : PHY
TYX TYX
LDA.l ShopInventory, X LDA.l ShopInventory, X
CMP.b #$0E : BEQ .refill ; Bee Refill CMP.b #$0E : BEQ .refill ; Bee Refill
CMP.b #$2E : BEQ .refill ; Red Potion Refill CMP.b #$2E : BEQ .refill ; Red Potion Refill
CMP.b #$2F : BEQ .refill ; Green Potion Refill CMP.b #$2F : BEQ .refill ; Green Potion Refill
CMP.b #$30 : BEQ .refill ; Blue Potion Refill CMP.b #$30 : BEQ .refill ; Blue Potion Refill
BRA + BRA +
.refill .refill
JSL.l Sprite_GetEmptyBottleIndex : BMI .full_bottles JSL.l Sprite_GetEmptyBottleIndex : BMI .full_bottles
+ +
LDA.l ShopType : AND.b #$80 : BNE .buy ; don't charge if this is a take-any LDA.l ShopType : AND.b #$80 : BNE .buy ; don't charge if this is a take-any
REP #$20 : LDA.l CurrentRupees : CMP.l ShopInventory+1, X : SEP #$20 : !BGE .buy REP #$20 : LDA.l CurrentRupees : CMP.l ShopInventory+1, X : SEP #$20 : !BGE .buy
.cant_afford .cant_afford
LDA.b #$7A LDA.b #$7A
LDY.b #$01 LDY.b #$01
JSL.l Sprite_ShowMessageUnconditional JSL.l Sprite_ShowMessageUnconditional
LDA.b #$3C : STA.w SFX2 ; error sound LDA.b #$3C : STA.w SFX2 ; error sound
JMP .done JMP .done
.full_bottles .full_bottles
LDA.b #$6B LDA.b #$6B : LDY.b #$01
LDY.b #$01 JSL.l Sprite_ShowMessageUnconditional
JSL.l Sprite_ShowMessageUnconditional LDA.b #$3C : STA.w SFX2 ; error sound
LDA.b #$3C : STA.w SFX2 ; error sound JMP .done
JMP .done .buy
.buy LDA.l ShopType : AND.b #$80 : BNE ++ ; don't charge if this is a take-any
LDA.l ShopType : AND.b #$80 : BNE ++ ; don't charge if this is a take-any REP #$20 : LDA.l CurrentRupees : !SUB ShopInventory+1, X : STA.l CurrentRupees : SEP #$20 ; Take price away
REP #$20 : LDA.l CurrentRupees : !SUB ShopInventory+1, X : STA.l CurrentRupees : SEP #$20 ; Take price away ++
++ INC.w ShopPurchaseFlag
LDA.l ShopInventory, X : TAY : JSL.l Link_ReceiveItem LDA.l ShopInventory, X : TAY : JSL.l Link_ReceiveItem
LDA.l ShopInventory+3, X : INC : STA.l ShopInventory+3, X LDA.l ShopInventory+3, X : INC : STA.l ShopInventory+3, X
TXA : LSR #2 : TAX TXA : LSR #2 : TAX
LDA.l ShopType : BIT.b #$80 : BNE + LDA.l ShopType : BIT.b #$80 : BNE +
LDA.l ShopState : ORA.w Shopkeeper_ItemMasks, X : STA.l ShopState LDA.l ShopState : ORA.w Shopkeeper_ItemMasks, X : STA.l ShopState
PHX PHX
TXA : !ADD ShopSRAMIndex : TAX TXA : !ADD ShopSRAMIndex : TAX
LDA.l PurchaseCounts, X : INC : BEQ +++ : STA.l PurchaseCounts, X : +++ LDA.l PurchaseCounts, X : INC : BEQ +++ : STA.l PurchaseCounts, X : +++
PLX PLX
BRA ++ BRA ++
+ ; Take-any + ; Take-any
BIT.b #$20 : BNE .takeAll BIT.b #$20 : BNE .takeAll
.takeAny .takeAny
LDA.l ShopState : ORA.b #$07 : STA.l ShopState LDA.l ShopState : ORA.b #$07 : STA.l ShopState
PHX : LDA.l ShopSRAMIndex : TAX : LDA.b #$01 : STA.l PurchaseCounts, X : PLX PHX : LDA.l ShopSRAMIndex : TAX : LDA.b #$01 : STA.l PurchaseCounts, X : PLX
BRA ++ BRA ++
.takeAll .takeAll
LDA.l ShopState : ORA.w Shopkeeper_ItemMasks, X : STA.l ShopState LDA.l ShopState : ORA.w Shopkeeper_ItemMasks, X : STA.l ShopState
PHX : LDA.l ShopSRAMIndex : TAX : LDA.l ShopState : STA.l PurchaseCounts, X : PLX PHX : LDA.l ShopSRAMIndex : TAX : LDA.l ShopState : STA.l PurchaseCounts, X : PLX
++ ++
.done .done
PLY : PLX PLY : PLX
RTS RTS

View File

@@ -115,53 +115,56 @@ DecrementSmallKeys:
JSL.l UpdateKeys JSL.l UpdateKeys
RTL RTL
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
CountChestKeyLong: ; called from ItemDowngradeFix in itemdowngrade.asm CountChestKeyLong:
JSR CountChestKey JSR.w CountChestKey
RTL RTL
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
CountChestKey: ; called by neighbor functions CountChestKey:
PHA : PHX PHA : PHX
CPY.b #$24 : BEQ + ; small key for this dungeon - use DungeonID LDA.l StatsLocked : BNE .done
CPY.b #$A0 : !BLT .end ; Ignore most items CPY.b #$24 : BEQ .this_dungeon
CPY.b #$AE : !BGE .end ; Ignore reserved key and generic key TYA
TYA : AND.B #$0F AND.b #$0F : CMP.b #$02 : BCC .hc_sewers
TAX : BRA .count ; use Key id instead of DungeonID (Keysanity) TAX
+ LDA.l DungeonCollectedKeys,X : INC : STA.l DungeonCollectedKeys
LDA.w DungeonID : LSR : TAX BRA .done
.count .this_dungeon
LDA.l DungeonCollectedKeys, X : INC : STA.l DungeonCollectedKeys, X LDA.w DungeonID : CMP.b #$03 : BCC .hc_sewers
LSR : TAX
LDA.l DungeonCollectedKeys,X : INC : STA.l DungeonCollectedKeys,X
BRA .done
CPX.b #$00 : BNE + .hc_sewers
STA.l HCCollectedKeys ; copy HC to sewers LDA.l SewerCollectedKeys : INC
+ STA.l SewerCollectedKeys : STA.l HCCollectedKeys
CPX.b #$01 : BNE +
STA.l SewerCollectedKeys ; copy sewers to HC .done
+
.end
PLX : PLA PLX : PLA
RTS RTS
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
CountBonkItem: ; called from GetBonkItem in bookofmudora.asm CountBonkItem: ; called from GetBonkItem in bookofmudora.asm
LDA.b RoomIndex ; check room ID - only bonk keys in 2 rooms so we're just checking the lower byte LDA.b RoomIndex
CMP.b #115 : BNE + ; Desert Bonk Key CMP.b #115 : BNE +
LDA.l BonkKey_Desert : BRA ++ LDA.l BonkKey_Desert
+ : CMP.b #140 : BNE + ; GTower Bonk Key BRA ++
LDA.l BonkKey_GTower : BRA ++ +
+ LDA.b #$24 ; default to small key CMP.b #140 : BNE +
++ LDA.l BonkKey_GTower : BRA ++
CMP.b #$24 : BNE + +
PHY LDA.b #$24
TAY : JSR CountChestKey ++
PLY CMP.b #$24 : BNE +
+ PHY
TAY
JSR CountChestKey
PLY
+
RTL RTL
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
IncrementAgahnim2Sword: IncrementAgahnim2Sword:
PHA PHA
LDA.l StatsLocked : BNE + JSL.l IncrementBossSword
JSL.l IncrementBossSword PLA
+
PLA
RTL RTL
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
IncrementDeathCounter: IncrementDeathCounter:

View File

@@ -129,6 +129,7 @@ MapMode:
db $00 ; #$00 = Always On (default) - #$01 = Require Map Item db $00 ; #$00 = Always On (default) - #$01 = Require Map Item
CompassMode: CompassMode:
db $00 ; #$00 = Off (default) - #$01 = Display Dungeon Count w/Compass - #$02 = Display Dungeon Count Always db $00 ; #$00 = Off (default) - #$01 = Display Dungeon Count w/Compass - #$02 = Display Dungeon Count Always
; #$80 = Move prizes to custom postion - #$40 = Compasses are shuffled and must be obtained to show position if bit on
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
org $B0803D ; PC 0x18003D org $B0803D ; PC 0x18003D
PersistentFloodgate: PersistentFloodgate:
@@ -229,7 +230,7 @@ db $01 ; #$00 = Off - #$01 = On (default)
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
org $B08050 ; PC 0x180050 - 0x18005C org $B08050 ; PC 0x180050 - 0x18005C
CrystalPendantFlags_2: CrystalPendantFlags_2:
db $00 ; Sewers db $02 ; Ganons Tower - because 5D is not available right now - sewers doesn't get one
db $00 ; Hyrule Castle db $00 ; Hyrule Castle
db $00 ; Eastern Palace db $00 ; Eastern Palace
db $00 ; Desert Palace db $00 ; Desert Palace
@@ -245,6 +246,9 @@ CrystalPendantFlags_2:
db $40 ; Turtle Rock db $40 ; Turtle Rock
;Pendant: $00 ;Pendant: $00
;Crystal: $40 ;Crystal: $40
;No Icon: $80
;Aga1: $01
;Aga2: $02
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
org $B0805E ; PC 0x18005E - Number of crystals required to enter GT org $B0805E ; PC 0x18005E - Number of crystals required to enter GT
NumberOfCrystalsRequiredForTower: NumberOfCrystalsRequiredForTower:
@@ -275,20 +279,20 @@ dl $000000
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
org $B08070 ; PC 0x180070 - 0x18007F org $B08070 ; PC 0x180070 - 0x18007F
CrystalNumberTable: CrystalNumberTable:
db $00 ; db $69 ; Eastern
db $69 ; Hera
db $69 ; Desert
db $7F ; Darkness
db $6C ; Skull
db $7C ; TRock
db $6D ; Thieves
db $6F ; Mire
db $6E ; Ice
db $79 ; Swamp db $79 ; Swamp
db $00 ; db $00 ;
db $6E ; Ice
db $00 ; db $00 ;
db $6F ; Mire
db $00 ; db $00 ;
db $6D ; Thieves db $00 ;
db $69 ; Desert
db $7C ; TRock
db $69 ; Hera
db $6C ; Skull
db $69 ; Eastern
db $7F ; Darkness
db $00 ; db $00 ;
db $00 ; db $00 ;
@@ -588,7 +592,7 @@ dw $0100 ; #$6234 - Master Sword
org $8ABEF8 ; PC 0x53EF8 org $8ABEF8 ; PC 0x53EF8
MapObject_Eastern: MapObject_Eastern:
dw $6038 ; #$6038 - Green Pendant / Courage dw $6238 ; #$6038 - Green Pendant / Courage
org $8ABF1C ; PC 0x53F1C org $8ABF1C ; PC 0x53F1C
MapObject_Desert: MapObject_Desert:
@@ -658,6 +662,7 @@ CrystalPendantFlags:
;Dungeons with no drops should match their respective world's normal vanilla prize ;xxx ;Dungeons with no drops should match their respective world's normal vanilla prize ;xxx
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
org $81C6FC ; PC 0xC6FC - Bank01.asm:10344 - (db $00, $00, $01, $02, $00, $06, $06, $06, $06, $06, $03, $06, $06) org $81C6FC ; PC 0xC6FC - Bank01.asm:10344 - (db $00, $00, $01, $02, $00, $06, $06, $06, $06, $06, $03, $06, $06)
DungeonPrizeReceiptID:
db $00 ; Sewers db $00 ; Sewers
db $00 ; Hyrule Castle db $00 ; Hyrule Castle
db $01 ; Eastern Palace db $01 ; Eastern Palace
@@ -665,8 +670,8 @@ org $81C6FC ; PC 0xC6FC - Bank01.asm:10344 - (db $00, $00, $01, $02, $00, $06, $
db $00 ; Agahnim's Tower db $00 ; Agahnim's Tower
db $06 ; Swamp Palace db $06 ; Swamp Palace
db $06 ; Palace of Darkness db $06 ; Palace of Darkness
db $06 ; Misery Mire db $20 ; Misery Mire
db $06 ; Skull Woods db $20 ; Skull Woods
db $06 ; Ice Palace db $06 ; Ice Palace
db $03 ; Tower of Hera db $03 ; Tower of Hera
db $06 ; Thieves' Town db $06 ; Thieves' Town
@@ -815,7 +820,8 @@ db $01 ; #00 = Never Locked - #$01 = Locked During Escape (default) - #$02 = Loc
org $B0816A ; PC 0x18016A org $B0816A ; PC 0x18016A
FreeItemText: FreeItemText:
db $00 ; #00 = Off (default) db $00 ; #00 = Off (default)
;---o bmcs ;--po bmcs
;p - enabled for non-prize crystals
;o - enabled for outside dungeon items ;o - enabled for outside dungeon items
;b - enabled for inside big key items ;b - enabled for inside big key items
;m - enabled for inside map items ;m - enabled for inside map items
@@ -2575,9 +2581,139 @@ db $01, $01, $00, $01, $02, $01, $06, $03, $03, $02, $01, $01, $04, $04, $00, $0
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
;--------------------------------------------------------------------------------
; Overworld Map Tables
;--------------------------------------------------------------------------------
org $8ABDF6
WorldMapIcon_posx_vanilla:
dw $0F31 ; prize1
dw $08D0 ; prize2
dw $0108
dw $0F40
dw $0082
dw $0F11
dw $01D0
dw $0100
dw $0CA0
dw $0759
dw $FF00
dw $FF00
dw $FF00
dw $FFFF ; reserved - not used
dw $FFFF
dw $FFFF
org $8ABE16
WorldMapIcon_posy_vanilla:
dw $0620 ; prize1
dw $0080 ; prize2
dw $0D70
dw $0620
dw $00B0
dw $0103
dw $0780
dw $0CA0
dw $0DA0
dw $0ED0
dw $FF00
dw $FF00
dw $FF00
dw $FFFF ; reserved - not used
dw $FFFF
dw $FFFF
org $8ABE36
WorldMapIcon_posx_located:
dw $FF00 ; prize1
dw $FF00 ; prize2
dw $FF00
dw $FF00
dw $FF00
dw $FF00
dw $FF00
dw $FF00
dw $FF00
dw $FF00
dw $FF00
dw $FF00
dw $FF00
dw $FFFF ; reserved - not used
dw $FFFF
dw $FFFF
org $8ABE56
WorldMapIcon_posy_located:
dw $FF00 ; prize1
dw $FF00 ; prize2
dw $FF00
dw $FF00
dw $FF00
dw $FF00
dw $FF00
dw $FF00
dw $FF00
dw $FF00
dw $FF00
dw $FF00
dw $FF00
dw $FFFF ; reserved - not used
dw $FFFF
dw $FFFF
org $8ABE76
WorldMapIcon_tile:
db $38, $62 ; green pendant
db $32, $60 ; red pendant
db $34, $60 ; blue pendant
db $34, $64 ; crystal
db $34, $64 ; crystal
db $34, $64 ; crystal
db $34, $64 ; crystal
db $32, $64 ; crystal
db $32, $64 ; crystal
db $34, $64 ; crystal
db $32, $66 ; skull looking thing
db $00, $00 ; red x
db $00, $00 ; red x
db $00, $00 ; unused red x's
db $00, $00
db $00, $00
org $8ABE96
CompassExists:
; dw $37FC ; todo: convert to two bytes with masks? so much extra code...
; eastern hera desert pod skull trock thieves mire ice swamp gt at escape
db $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $00, $00, $00, $00, $00
; 0 = light world, 1 = dark world
org $8ABEA6
WorldCompassMask:
; eastern desert hera pod skull trock thieves mire ice swamp gt at escape x1 x2 x3
db $00, $00, $00, $01, $01, $01, $01, $01, $01, $01, $01, $00, $00, $00, $00, $00
; eastern desert hera pod skull trock thieves mire ice swamp gt at escape
MC_DungeonIdsForPrize:
db $02, $0A, $03, $06, $08, $0C, $0B, $07, $09, $05, $00, $04, $01
MC_SRAM_Offsets:
db $01, $00, $01, $01, $00, $00, $00, $01, $00, $01, $00, $01, $01
MC_Masks:
; EP TH DP PD SK TR TT MM
db $20, $20, $10, $02, $80, $08, $10, $01, $40, $04, $04, $08, $40

View File

@@ -93,7 +93,6 @@ LoadDynamicTileOAMTable:
PLX PLX
PLP PLP
RTS RTS
;--------------------------------------------------------------------------------
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
; DrawDynamicTile ; DrawDynamicTile
@@ -334,13 +333,21 @@ RTL
;------------------------------------------------------------------------------ ;------------------------------------------------------------------------------
CheckReceivedItemPropertiesBeforeLoad: CheckReceivedItemPropertiesBeforeLoad:
LDA.b RoomIndex : BEQ .normalCode PHX
LDA.l RoomFade : BNE .load_palette LDX.w CurrentSpriteSlot
LDA.l SpriteProperties_chest_palette,X : BIT #$80 : BNE .load_palette LDA.w AncillaID,X : CMP.b #$29 : BEQ .falling_sprite
.normalCode PLX
RTL LDA.b RoomIndex : BEQ .normalCode
.load_palette LDA.l RoomFade : BNE .load_palette
JSL.l LoadItemPalette .normalCode
LDA.l SpriteProperties_chest_palette,X : BIT #$80 : BNE .load_palette
RTL
.load_palette
JSL.l LoadItemPalette
RTL
.falling_sprite
PLX
LDA.l SpriteProperties_standing_palette,X : BIT #$80 : BNE .load_palette
RTL RTL
;------------------------------------------------------------------------------ ;------------------------------------------------------------------------------
@@ -380,3 +387,16 @@ TransferVRAMStripes:
JSL.l DoDungeonMapBossIcon JSL.l DoDungeonMapBossIcon
LDA.b NMISTRIPES : CMP.b #$01 ; What we wrote over LDA.b NMISTRIPES : CMP.b #$01 ; What we wrote over
RTL RTL
ItemReceiptWidthCheck:
PHX
LDX.w CurrentSpriteSlot
LDA.w AncillaID,X : CMP.b #$29 : BEQ .falling_sprite
PLX
LDA.l SpriteProperties_chest_width, X
RTL
.falling_sprite
PLX
LDA.l SpriteProperties_standing_width, X
RTL

View File

@@ -28,6 +28,7 @@ LoadSelectScreenGfx = $80E529
PrepDungeonExit = $80F945 PrepDungeonExit = $80F945
Mirror_InitHdmaSettings = $80FDEE Mirror_InitHdmaSettings = $80FDEE
Dungeon_LoadRoom = $81873A Dungeon_LoadRoom = $81873A
Underworld_HandleRoomTags = $81C2FD
Module_PreDungeon = $82821E Module_PreDungeon = $82821E
Module_PreDungeon_setAmbientSfx = $828296 Module_PreDungeon_setAmbientSfx = $828296
Dungeon_SaveRoomData = $82A0A8 Dungeon_SaveRoomData = $82A0A8
@@ -36,7 +37,7 @@ Dungeon_SaveRoomQuadrantData = $82B861
LoadGearPalettes_bunny = $82FD8A LoadGearPalettes_bunny = $82FD8A
LoadGearPalettes_variable = $82FD95 LoadGearPalettes_variable = $82FD95
Filter_Majorly_Whiten_Color = $82FEAB Filter_Majorly_Whiten_Color = $82FEAB
Sprite_SpawnFallingItem = $85A51D Ancilla_SpawnFallingPrize = $85A51D
Sprite_DrawMultiple = $85DF6C Sprite_DrawMultiple = $85DF6C
Sprite_DrawMultiple_quantity_preset = $85DF70 Sprite_DrawMultiple_quantity_preset = $85DF70
Sprite_DrawMultiple_player_deferred = $85DF75 Sprite_DrawMultiple_player_deferred = $85DF75
@@ -44,8 +45,10 @@ Sprite_ShowSolicitedMessageIfPlayerFacing = $85E1A7
Sprite_ShowMessageFromPlayerContact = $85E1F0 Sprite_ShowMessageFromPlayerContact = $85E1F0
Sprite_ShowMessageUnconditional = $85E219 Sprite_ShowMessageUnconditional = $85E219
Sprite_ZeldaLong = $85EC96 Sprite_ZeldaLong = $85EC96
Sprite_EA_HeartContainer = $85EF3F
Sprite_EB_HeartPiece_handle_flags = $85F0C0 Sprite_EB_HeartPiece_handle_flags = $85F0C0
Player_ApplyRumbleToSprites = $8680FA Player_ApplyRumbleToSprites = $8680FA
Sprite_Main = $868328
Utility_CheckIfHitBoxesOverlapLong = $8683E6 Utility_CheckIfHitBoxesOverlapLong = $8683E6
Sprite_PrepAndDrawSingleLargeLong = $86DBF8 Sprite_PrepAndDrawSingleLargeLong = $86DBF8
Sprite_PrepAndDrawSingleSmallLong = $86DC00 Sprite_PrepAndDrawSingleSmallLong = $86DC00
@@ -58,13 +61,16 @@ OAM_AllocateDeferToPlayerLong = $86F86A
Player_HaltDashAttackLong = $8791B3 Player_HaltDashAttackLong = $8791B3
Link_ReceiveItem = $87999D Link_ReceiveItem = $87999D
Sprite_CheckIfPlayerPreoccupied = $87F4AA Sprite_CheckIfPlayerPreoccupied = $87F4AA
Ancilla_Main = $888242
Ancilla_ReceiveItem = $88C3AE Ancilla_ReceiveItem = $88C3AE
Ancilla_BreakTowerSeal_draw_single_crystal = $88CE93 Ancilla_BreakTowerSeal_draw_single_crystal = $88CE93
Ancilla_BreakTowerSeal_stop_spawning_sparkles = $88CEC3 Ancilla_BreakTowerSeal_stop_spawning_sparkles = $88CEC3
BreakTowerSeal_ExecuteSparkles = $88CF59 BreakTowerSeal_ExecuteSparkles = $88CF59
Ancilla_SetOam_XY_Long = $88F710 Ancilla_SetOam_XY_Long = $88F710
AddReceivedItem = $8985E2 AddReceivedItem = $8985E2
AddPendantOrCrystal = $898BAD AncillaAdd_ItemReceipt_not_crystal = $898605
AncillaAdd_FallingPrize = $898BAD
AncillaAdd_FallingPrize_not_medallion = $898BD6
AddWeathervaneExplosion = $898CFD AddWeathervaneExplosion = $898CFD
AddDashTremor = $8993DF AddDashTremor = $8993DF
AddAncillaLong = $899D04 AddAncillaLong = $899D04
@@ -114,13 +120,31 @@ Sprite_SpawnDynamically = $9DF65D
Sprite_SpawnDynamically_arbitrary = $9DF65F Sprite_SpawnDynamically_arbitrary = $9DF65F
DiggingGameGuy_AttemptPrizeSpawn = $9DFD4B DiggingGameGuy_AttemptPrizeSpawn = $9DFD4B
Sprite_GetEmptyBottleIndex = $9EDE28 Sprite_GetEmptyBottleIndex = $9EDE28
CrystalCutscene_Initialize_skip_palette = $9ECD39
Sprite_PlayerCantPassThrough = $9EF4E7 Sprite_PlayerCantPassThrough = $9EF4E7
;=================================================================================================== ;===================================================================================================
; Local routines (use JSR) ; Local routines (use JSR)
;=================================================================================================== ;===================================================================================================
RoomTag_PrizeTriggerDoor_open = $81C529
RoomTag_PrizeTriggerDoor_exit = $81C529
RoomTag_GetHeartForPrize = $81C709
RoomTag_GetHeartForPrize_spawn_prize = $81C731
RoomTag_GetHeartForPrize_delete_tag = $81C749
Chicken_SpawnAvengerChicken = $86A7DB Chicken_SpawnAvengerChicken = $86A7DB
Link_PerformOpenChest_no_replacement = $87B59F Link_PerformOpenChest_no_replacement = $87B59F
Sprite_EA_HeartContainer_main = $85EF47
Ancilla_ExecuteAll = $88832B
Ancilla_ExecuteOne = $88833C
Ancilla22_ItemReceipt_is_pendant = $88C421
Ancilla22_ItemReceipt_wait_for_music = $88C42B
ItemReceipt_Animate_continue = $88C637
AncillaDraw_ItemReceipt = $88C6B4
Ancilla29_MilestoneItemReceipt = $88CAB0
Ancilla29_MilestoneItemReceipt_skip_crystal_sfx = $88CAE5
Ancilla29_MilestoneItemReceipt_no_sparkle = $88CB2E
Ancilla_SetOAM_XY = $88F6F3
Ancilla_AddAncilla = $899CCE
DrawProgressIcons = $8DE9C8 DrawProgressIcons = $8DE9C8
ItemMenu_DrawEquippedYItem = $8DEB3A ItemMenu_DrawEquippedYItem = $8DEB3A
ItemMenu_DrawEquippedYItem_exit = $8DECE6 ItemMenu_DrawEquippedYItem_exit = $8DECE6
@@ -130,11 +154,19 @@ DrawEquipment = $8DED29
;=================================================================================================== ;===================================================================================================
; Palettes ; Palettes
;=================================================================================================== ;===================================================================================================
PalettesVanillaBank = $9B0000 PalettesVanillaBank = $9B0000
PalettesVanilla_none = $9B0000 PalettesVanilla_none = $9B0000
PalettesVanilla_red_melon = $9BD218 PalettesVanilla_red_melon = $9BD218
PalettesVanilla_blue_ice = $9BD236 PalettesVanilla_blue_ice = $9BD236
PalettesVanilla_green_blue_guard = $9BD272 PalettesVanilla_green_blue_guard = $9BD272
PalettesVanilla_dark_world_melon = $9BD290 PalettesVanilla_dark_world_melon = $9BD290
PalettesVanilla_blue_dark_ice = $9BD2BC PalettesVanilla_blue_dark_ice = $9BD2BC
PalettesVanilla_spraux09 = $9BD47E PalettesVanilla_spraux09 = $9BD47E
;===================================================================================================
; Misc. Data
;===================================================================================================
WorldMapIcon_AdjustCoordinate = $8AC59B
WorldMap_CalculateOAMCoordinates = $8AC3B1
WorldMap_HandleSpriteBlink = $8AC52E
WorldMap_RedXChars = $8ABF70