837 lines
29 KiB
NASM
837 lines
29 KiB
NASM
;================================================================================
|
|
; Inventory Updates
|
|
;================================================================================
|
|
;--------------------------------------------------------------------------------
|
|
; ProcessMenuButtons:
|
|
; out: Carry - 0 = No Button, 1 = Yes Button
|
|
;--------------------------------------------------------------------------------
|
|
ProcessMenuButtons:
|
|
LDA.b Joy1A_New : BIT.b #$40 : BNE .y_pressed ; check for P1 Y-button
|
|
BIT.b #$20 : BNE .sel_pressed ; check for P1 Select button
|
|
LDA.b Joy1A_All : BIT.b #$20 : BNE .sel_held
|
|
.sel_unheld
|
|
LDA.l HudFlag : AND.b #$60 : BEQ +
|
|
LDA.b #$00 : STA.l HudFlag
|
|
JSL MaybePlaySelectSFX
|
|
+
|
|
JSL ResetEquipment
|
|
+
|
|
.sel_held
|
|
CLC ; no buttons
|
|
RTL
|
|
.sel_pressed
|
|
LDA.l HUDDungeonItems : BIT.b #$0C : BNE +
|
|
LDA.b #$40
|
|
BRA .store_flag
|
|
+
|
|
LDA.b #$60
|
|
.store_flag
|
|
STA.l HudFlag
|
|
JSL MaybePlaySelectSFX
|
|
JSL ResetEquipment
|
|
RTL
|
|
.y_pressed ; Note: used as entry point by quickswap code. Must preserve X.
|
|
LDA.b #$10 : STA.w MenuBlink
|
|
LDA.w ItemCursor ; check selected item
|
|
CMP.b #$02 : BNE + ; boomerang
|
|
LDA.l InventoryTracking : AND.b #$C0 : CMP.b #$C0 : BNE .errorJump ; make sure we have both boomerangs
|
|
LDA.l BoomerangEquipment : EOR.b #$03 : STA.l BoomerangEquipment ; swap blue & red boomerang
|
|
LDA.b #$20 : STA.w SFX3 ; menu select sound
|
|
JMP .captured
|
|
+ CMP.b #$01 : BNE + ; bow
|
|
LDA.l BowTracking : AND.b #$C0 : CMP.b #$C0 : BNE .errorJump ; make sure we have both bows
|
|
PHX : LDX.b #$00 ; scan ancilla table for arrows
|
|
-- : CPX.b #$0A : !BGE ++
|
|
LDA.w AncillaID, X : CMP.b #$09 : BNE +++
|
|
PLX : BRA .errorJump2 ; found an arrow, don't allow the swap
|
|
+++
|
|
INX : BRA -- : ++
|
|
PLX
|
|
LDA.l SilverArrowsUseRestriction : BEQ ++
|
|
LDA.b RoomIndex : ORA.b RoomIndex+1 : BEQ ++ ; not in ganon's room in restricted mode
|
|
LDA.l BowEquipment : CMP.b #$03 : !BLT .errorJump : !SUB.b #$02 : STA.l BowEquipment
|
|
BRA .errorJump2
|
|
++
|
|
LDA.l BowEquipment : !SUB.b #$01 : EOR.b #$02 : !ADD.b #$01 : STA.l BowEquipment ; swap bows
|
|
LDA.b #$20 : STA.w SFX3 ; menu select sound
|
|
JMP .captured
|
|
+ BRA +
|
|
.errorJump
|
|
BRA .errorJump2
|
|
+ CMP.b #$05 : BNE + ; powder
|
|
LDA.l InventoryTracking : AND.b #$30 : CMP.b #$30 : BNE .errorJump ; make sure we have mushroom & magic powder
|
|
LDA.l PowderEquipment : EOR.b #$03 : STA.l PowderEquipment ; swap mushroom & magic powder
|
|
LDA.b #$20 : STA.w SFX3 ; menu select sound
|
|
JMP .captured
|
|
+ BRA +
|
|
.errorJump2
|
|
BRA .error
|
|
+ CMP.b #$0D : BNE + ; flute
|
|
LDA.w UseY2 : CMP.b #$01 : BEQ .midShovel ; inside a shovel animation, force the shovel & make error sound
|
|
LDA.l InventoryTracking : BIT.b #$04 : BEQ .error ; make sure we have shovel
|
|
AND.b #$03 : BEQ .error ; make sure we have one of the flutes
|
|
LDA.l FluteEquipment : CMP.b #01 : BNE .toShovel ; not shovel
|
|
|
|
LDA.l InventoryTracking : AND.b #$01 : BEQ .toFakeFlute ; check for real flute
|
|
LDA.b #$03 ; set real flute
|
|
BRA .fluteSuccess
|
|
.toFakeFlute
|
|
LDA.b #$02 ; set fake flute
|
|
BRA .fluteSuccess
|
|
.toShovel
|
|
LDA.b #$01 ; set shovel
|
|
.fluteSuccess
|
|
STA.l FluteEquipment ; store set item
|
|
LDA.b #$20 : STA.w SFX3 ; menu select sound
|
|
BRA .captured
|
|
+
|
|
CMP.b #$10 : BNE .error : JSL ProcessBottleMenu : BRA .captured : +
|
|
CLC
|
|
RTL
|
|
.midShovel
|
|
.error
|
|
LDA.b #$3C : STA.w SFX2 ; error sound
|
|
.captured
|
|
SEC
|
|
RTL
|
|
;--------------------------------------------------------------------------------
|
|
|
|
;--------------------------------------------------------------------------------
|
|
;ProcessBottleMenu:
|
|
;--------------------------------------------------------------------------------
|
|
ProcessBottleMenu:
|
|
LDA.l BottleIndex ; check bottle state
|
|
BEQ .no_bottles ; skip if we have no bottles
|
|
PHX
|
|
INC : CMP.b #$05 : !BLT + : LDA.b #$01 : + ;increment and wrap 1-4
|
|
TAX : LDA.l BottleContents-1, X ; check bottle
|
|
BNE + : LDX.b #$01 : + ; wrap if we reached the last bottle
|
|
TXA : STA.l BottleIndex ; set bottle index
|
|
LDA.b #$20 : STA.w SFX3 ; menu select sound
|
|
PLX
|
|
.no_bottles
|
|
LDA.b #$00 ; pretend like the controller state was 0 from the overridden load
|
|
RTL
|
|
|
|
;--------------------------------------------------------------------------------
|
|
;OpenBottleMenu:
|
|
;--------------------------------------------------------------------------------
|
|
OpenBottleMenu:
|
|
LDA.b Joy1B_New : AND.b #$40 : BEQ .x_not_pressed ; skip if X is not down
|
|
LDA.b #$10 : STA.w MenuBlink ; set 16 frame cool off
|
|
LDA.b #$20 : STA.w SFX3 ; make menu sound
|
|
LDA.b #$07 : STA.w SubModuleInterface ; thing we wrote over - opens bottle menu
|
|
.x_not_pressed
|
|
RTL
|
|
;--------------------------------------------------------------------------------
|
|
;CloseBottleMenu:
|
|
;--------------------------------------------------------------------------------
|
|
CloseBottleMenu:
|
|
LDA.b Joy1B_New : AND.b #$40 : BEQ .x_not_pressed ; skip if X is not down
|
|
LDA.b #$10 : STA.w MenuBlink ; set 16 frame cool off
|
|
LDA.b #$20 : STA.w SFX3 ; make menu sound
|
|
|
|
INC.w SubModuleInterface ; return to normal menu
|
|
STZ.w BottleMenuCounter
|
|
LDA.b #$00
|
|
RTL
|
|
.x_not_pressed
|
|
LDA.b Joy1A_New : AND.b #$0C ; thing we wrote over (probably)
|
|
RTL
|
|
;--------------------------------------------------------------------------------
|
|
; AddInventory:
|
|
;--------------------------------------------------------------------------------
|
|
AddInventory:
|
|
; In: Y - Receipt ID
|
|
; Uses $0B-$0D for long absolute addressing
|
|
PHA : PHX : PHY : PHP : PHB
|
|
PHK : PLB
|
|
LDA.b #$7E : STA.b Scrap0D
|
|
LDA.l StatsLocked : BNE .done
|
|
LDA.l !MULTIWORLD_ITEM_PLAYER_ID : BNE .countDungeonChecks
|
|
REP #$30
|
|
TYA : AND.w #$00FF : ASL : TAX
|
|
SEP #$20
|
|
LDA.w InventoryTable_properties,X : BIT.b #$01 : BEQ .done
|
|
JSR ShopCheck : BCS .done
|
|
.countDungeonChecks
|
|
JSR DungeonIncrement : BCS .done
|
|
LDA.l !MULTIWORLD_ITEM_PLAYER_ID : BNE .totalCount
|
|
JSR IncrementByOne
|
|
JSR StampItem
|
|
SEP #$20
|
|
JSR IncrementYAItems
|
|
.totalCount
|
|
LDA.l !MULTIWORLD_RECEIVING_ITEM : BNE .done
|
|
REP #$30
|
|
LDA.l TotalItemCounter : INC : TAY
|
|
LDA.l BootsEquipment : AND.w #$00FF : BNE +
|
|
TYA : STA.l PreBootsLocations
|
|
+
|
|
LDA.l MirrorEquipment : AND.w #$00FE : BNE + ; FE to ignore mirror scroll
|
|
TYA : STA.l PreMirrorLocations
|
|
+
|
|
LDA.l FluteEquipment : AND.w #$00FF : BNE +
|
|
TYA : STA.l PreFluteLocations
|
|
+
|
|
TYA
|
|
STA.l TotalItemCounter
|
|
.done
|
|
SEP #$30
|
|
PLB : PLP : PLY : PLX : PLA
|
|
RTL
|
|
|
|
ShopCheck:
|
|
; In: X - Receipt ID << 1
|
|
; TODO: If we write all shops, we can use the ShopPurchase flag instead of this
|
|
PHX
|
|
LDA.b IndoorsFlag : BEQ .count
|
|
LDA.w ItemReceiptMethod : CMP.b #$01 : BEQ .count
|
|
LDA.l ShopEnableCount : BNE .count
|
|
LDA.w InventoryTable_properties,X : BIT.b #$02 : BNE .count
|
|
REP #$20
|
|
LDA.b RoomIndex
|
|
CMP.w #274 : BEQ .nocount ; dark world death mountain shop, ornamental shield shop
|
|
CMP.w #271 : BEQ .nocount ; villiage of outcasts shop, lumberjack shop, lake hylia shop, dark world magic shop
|
|
CMP.w #272 : BEQ .nocount ; red shield shop
|
|
CMP.w #284 : BEQ .nocount ; bomb shop
|
|
CMP.w #265 : BEQ .nocount ; potion shop - powder is flagged as "ShopEnableCount" in CollectPowder
|
|
; these room contain pots so you must check the quadrant as well for pottery lottery
|
|
CMP.w #287 : BNE + : LDA.b LinkQuadrantH : CMP.w #$0201 : BEQ .nocount ; kakariko shop
|
|
LDA.b RoomIndex
|
|
+ CMP.w #255 : BNE + : LDA.b LinkQuadrantH : BEQ .nocount ; light world death mountain shop
|
|
LDA.b RoomIndex
|
|
+ CMP.w #276 : BNE + : LDA.b LinkQuadrantH : CMP.w #$0200 : BEQ .nocount ; waterfall fairy
|
|
LDA.b RoomIndex
|
|
+ CMP.w #277 : BEQ .nocount ; upgrade fairy (shop)
|
|
CMP.w #278 : BEQ .nocount ; pyramid fairy
|
|
SEP #$20
|
|
.count
|
|
CLC
|
|
PLX
|
|
RTS
|
|
.nocount
|
|
SEP #$21
|
|
PLX
|
|
RTS
|
|
|
|
DungeonIncrement:
|
|
; In: X - Receipt ID << 1
|
|
REP #$10
|
|
PHX
|
|
LDA.w InventoryTable_properties,X : BIT.b #$40 : BEQ +
|
|
JSL CountChestKeyLong
|
|
+
|
|
LDA.l !MULTIWORLD_RECEIVING_ITEM : BNE .done
|
|
SEP #$10
|
|
LDA.b IndoorsFlag : BEQ .done
|
|
LDA.w DungeonID : BMI .done
|
|
CMP.l BallNChainDungeon : BNE +
|
|
CPY.b #$32 : BEQ .ballchain_bigkey
|
|
+
|
|
CMP.b #$00 : BNE +
|
|
INC #2
|
|
+ TAX : REP #$20 : LDA.l DungeonLocationsChecked, X : INC : STA.l DungeonLocationsChecked, X : SEP #$20
|
|
CPX.b #$0D : BNE +
|
|
LDA.l BigKeyField : BIT.b #$04 : BNE ++
|
|
LDA.l PreGTBKLocations : INC : STA.l PreGTBKLocations
|
|
++
|
|
+
|
|
.done
|
|
REP #$11
|
|
PLX
|
|
RTS
|
|
.ballchain_bigkey
|
|
REP #$10
|
|
PLX
|
|
SEC
|
|
RTS
|
|
|
|
StampItem:
|
|
REP #$30
|
|
LDA.w InventoryTable_stamp,X : BEQ .skip
|
|
STA.b Scrap0B
|
|
LDA.b [Scrap0B] : BNE .skip
|
|
INC.b Scrap0B : INC.b Scrap0B
|
|
LDA.b [Scrap0B] : BNE .skip
|
|
LDA.l NMIFrames+2 : STA.b [Scrap0B]
|
|
DEC.b Scrap0B : DEC.b Scrap0B
|
|
LDA.l NMIFrames : STA.b [Scrap0B]
|
|
.skip
|
|
SEP #$20
|
|
RTS
|
|
|
|
IncrementYAItems:
|
|
PHX
|
|
LDA.w InventoryTable_properties,X
|
|
BIT.b #$10 : BNE .bomb_check
|
|
BIT.b #$20 : BNE .bow_check
|
|
BIT.b #$04 : BEQ .not_y
|
|
.y_item
|
|
LDA.l YAItemCounter : !ADD.b #$08 : STA.l YAItemCounter
|
|
BRA .done
|
|
.not_y
|
|
BIT.b #$08 : BEQ .done
|
|
.a_item
|
|
LDA.l YAItemCounter : INC : AND.b #$07 : TAX
|
|
LDA.l YAItemCounter : AND.b #$F8 : STA.l YAItemCounter
|
|
TXA : ORA.l YAItemCounter : STA.l YAItemCounter
|
|
.done
|
|
PLX
|
|
RTS
|
|
.bow_check
|
|
LDA.l BowEquipment : BNE +
|
|
BRA .y_item
|
|
.bomb_check
|
|
LDA.l InventoryTracking+1 : BIT.b #$02 : BNE +
|
|
ORA.b #$02 : STA.l InventoryTracking+1
|
|
BRA .y_item
|
|
+
|
|
PLX
|
|
RTS
|
|
|
|
IncrementByOne:
|
|
PHX
|
|
REP #$20
|
|
LDA.w InventoryTable_stat,X : BEQ .skip
|
|
STA.b Scrap0B
|
|
SEP #$21
|
|
LDA.b #$00 : ADC.b [Scrap0B] : STA.b [Scrap0B]
|
|
.skip
|
|
SEP #$20
|
|
PLX
|
|
RTS
|
|
|
|
IncrementBossSword:
|
|
PHX
|
|
LDA.l StatsLocked : BNE .done
|
|
LDA.l SwordEquipment : CMP.b #$FF : BNE +
|
|
BRA .none
|
|
+
|
|
ASL : TAX
|
|
JMP (.vectors,X)
|
|
|
|
.vectors
|
|
dw .none
|
|
dw .fighter
|
|
dw .master
|
|
dw .tempered
|
|
dw .golden
|
|
|
|
.none
|
|
LDA.l SwordlessBossKills : INC : STA.l SwordlessBossKills
|
|
.done
|
|
PLX
|
|
RTL
|
|
.fighter
|
|
LDA.l SwordBossKills
|
|
CLC : ADC.b #$10
|
|
STA.l SwordBossKills
|
|
PLX
|
|
RTL
|
|
.master
|
|
LDA.l SwordBossKills : INC : AND.b #$0F : TAX
|
|
LDA.l SwordBossKills : AND.b #$F0 : STA.l SwordBossKills
|
|
TXA : ORA.l SwordBossKills : STA.l SwordBossKills
|
|
PLX
|
|
RTL
|
|
.tempered
|
|
LDA.l SwordBossKills+1
|
|
CLC : ADC.b #$10
|
|
STA.l SwordBossKills+1
|
|
PLX
|
|
RTL
|
|
.golden
|
|
LDA.l SwordBossKills+1 : INC : AND.b #$0F : TAX
|
|
LDA.l SwordBossKills+1 : AND.b #$F0 : STA.l SwordBossKills+1
|
|
TXA : ORA.l SwordBossKills+1 : STA.l SwordBossKills+1
|
|
PLX
|
|
RTL
|
|
|
|
;--------------------------------------------------------------------------------
|
|
IncrementFinalSword:
|
|
PHX
|
|
REP #$20
|
|
LDA.b RoomIndex : BNE .done
|
|
SEP #$20
|
|
LDA.l SwordEquipment : CMP.b #$FF : BNE +
|
|
BRA IncrementBossSword_none
|
|
+
|
|
ASL : TAX
|
|
JMP (IncrementBossSword_vectors,X)
|
|
.done
|
|
SEP #$20
|
|
PLX
|
|
RTL
|
|
;--------------------------------------------------------------------------------
|
|
HUDRefresh:
|
|
LDA.l BombsEquipment : BNE + ; skip if we have bombs
|
|
LDA.l BombCapacity : BEQ + ; skip if we can't have bombs
|
|
LDA.l BombsFiller : BEQ + ; skip if we are filling no bombs
|
|
DEC : STA.l BombsFiller ; decrease bomb fill count
|
|
LDA.b #$01 : STA.l BombsEquipment ; increase actual bomb count
|
|
+
|
|
|
|
JSL HUD_RefreshIconLong ; thing we wrote over
|
|
LDA.b #$01 : STA.l UpdateHUDFlag
|
|
JSL PostItemGet
|
|
RTL
|
|
;--------------------------------------------------------------------------------
|
|
|
|
;--------------------------------------------------------------------------------
|
|
; HandleBombAbsorbtion:
|
|
;--------------------------------------------------------------------------------
|
|
HandleBombAbsorbtion:
|
|
STA.l BombsFiller ; thing we wrote over
|
|
LDA.w CurrentYItem : BNE + ; skip if we already have some item selected
|
|
LDA.l BombCapacity : BEQ + ; skip if we can't have bombs
|
|
LDA.b #$04 : STA.w ItemCursor ; set selected item to bombs
|
|
LDA.b #$01 : STA.w CurrentYItem ; set selected item to bombs
|
|
JSL HUD_RebuildLong
|
|
LDA.b #$01 : STA.l UpdateHUDFlag
|
|
+
|
|
RTL
|
|
;--------------------------------------------------------------------------------
|
|
|
|
;--------------------------------------------------------------------------------
|
|
; AddYMarker:
|
|
;--------------------------------------------------------------------------------
|
|
AddYMarker:
|
|
LDA.w ItemCursor : AND.w #$FF ; load item value
|
|
CMP.w #$02 : BNE + ; boomerang
|
|
LDA.l InventoryTracking : AND.w #$C0 : CMP.w #$C0 : BEQ .drawYBubble : BRA .drawNormal
|
|
+ CMP.w #$01 : BNE + ; bow
|
|
LDA.l BowTracking : AND.w #$C0 : CMP.w #$C0 : BEQ .drawYBubble : BRA .drawNormal
|
|
+ CMP.w #$05 : BNE + ; powder
|
|
LDA.l InventoryTracking : AND.w #$30 : CMP.w #$30 : BEQ .drawYBubble : BRA .drawNormal
|
|
+ CMP.w #$0D : BNE + ; flute
|
|
LDA.l InventoryTracking : BIT.w #$04 : BEQ .drawNormal ; make sure we have shovel
|
|
AND.w #$03 : BNE .drawYBubble ; make sure we have one of the flutes
|
|
BRA .drawNormal
|
|
+ CMP.w #$10 : BEQ .drawJarMarker
|
|
|
|
.drawNormal
|
|
LDA.w #$7C60
|
|
BRA .drawTile
|
|
|
|
.drawJarMarker
|
|
LDA.w MenuBlink : AND.w #$0020 : BNE .drawXBubble
|
|
|
|
.drawYBubble
|
|
LDA.w #$3D4F
|
|
BRA .drawTile
|
|
|
|
.drawXBubble
|
|
JSR MakeCircleBlue
|
|
LDA.w #$2D3E
|
|
|
|
.drawTile
|
|
STA.w $FFC4, Y
|
|
RTL
|
|
;--------------------------------------------------------------------------------
|
|
|
|
;--------------------------------------------------------------------------------
|
|
; MakeCircleBlue
|
|
; this is horrible, make it better
|
|
;--------------------------------------------------------------------------------
|
|
MakeCircleBlue:
|
|
LDA.w $FFC0, Y : AND.w #$EFFF : STA.w $FFC0, Y
|
|
LDA.w $FFC2, Y : AND.w #$EFFF : STA.w $FFC2, Y
|
|
|
|
LDA.w $FFFE, Y : AND.w #$EFFF : STA.w $FFFE, Y
|
|
LDA.w $0004, Y : AND.w #$EFFF : STA.w $0004, Y
|
|
|
|
LDA.w $003E, Y : AND.w #$EFFF : STA.w $003E, Y
|
|
LDA.w $0044, Y : AND.w #$EFFF : STA.w $0044, Y
|
|
|
|
LDA.w $0080, Y : AND.w #$EFFF : STA.w $0080, Y
|
|
LDA.w $0082, Y : AND.w #$EFFF : STA.w $0082, Y
|
|
|
|
LDA.w $FFBE, Y : AND.w #$EFFF : STA.w $FFBE, Y
|
|
LDA.w $FFC4, Y : AND.w #$EFFF : STA.w $FFC4, Y
|
|
LDA.w $0084, Y : AND.w #$EFFF : STA.w $0084, Y
|
|
LDA.w $007E, Y : AND.w #$EFFF : STA.w $007E, Y
|
|
RTS
|
|
;--------------------------------------------------------------------------------
|
|
|
|
;--------------------------------------------------------------------------------
|
|
; UpgradeFlute:
|
|
;--------------------------------------------------------------------------------
|
|
UpgradeFlute:
|
|
LDA.l InventoryTracking : AND.b #$FC : ORA.b #$01 : STA.l InventoryTracking ; switch to the working flute
|
|
LDA.b #$03 : STA.l FluteEquipment ; upgrade primary inventory
|
|
RTL
|
|
;--------------------------------------------------------------------------------
|
|
|
|
;--------------------------------------------------------------------------------
|
|
; FluteCallForDuck:
|
|
;--------------------------------------------------------------------------------
|
|
; sets A to #$02 to ignore summoning the duck
|
|
FluteCallForDuck:
|
|
LDA.l OverworldEventDataWRAM+$18 : AND.b #$20 : BNE .vanilla ; allow flute in rain state if weathervane activated
|
|
LDA.l ProgressIndicator : CMP.b #$02 : BCS .vanilla ; must rescue Zelda first
|
|
|
|
.noDuck
|
|
LDA.b #$02 : RTL
|
|
|
|
.vanilla
|
|
LDA.l FluteEquipment ; what we wrote over
|
|
RTL
|
|
;--------------------------------------------------------------------------------
|
|
|
|
;--------------------------------------------------------------------------------
|
|
; CheckKeys:
|
|
;--------------------------------------------------------------------------------
|
|
CheckKeys:
|
|
LDA.l GenericKeys : BEQ + : RTL : +
|
|
LDA.w DungeonID : CMP.b #$FF
|
|
RTL
|
|
;--------------------------------------------------------------------------------
|
|
|
|
;--------------------------------------------------------------------------------
|
|
; DrawKeyIcon:
|
|
;--------------------------------------------------------------------------------
|
|
DrawKeyIcon:
|
|
LDA.b Scrap04 : AND.w #$00FF : CMP.w #$0090 : BNE + : LDA.w #$007F : + : ORA.w #$2400 : STA.l HUDKeyDigits
|
|
LDA.b Scrap05 : AND.w #$00FF : ORA.w #$2400 : STA.l HUDTileMapBuffer+$66
|
|
RTL
|
|
;--------------------------------------------------------------------------------
|
|
|
|
;--------------------------------------------------------------------------------
|
|
; LoadKeys:
|
|
;--------------------------------------------------------------------------------
|
|
LoadKeys:
|
|
LDA.l GenericKeys : BEQ +
|
|
LDA.l CurrentGenericKeys
|
|
RTL
|
|
+
|
|
LDA.l DungeonKeys, X
|
|
RTL
|
|
;--------------------------------------------------------------------------------
|
|
|
|
;--------------------------------------------------------------------------------
|
|
; SaveKeys:
|
|
;--------------------------------------------------------------------------------
|
|
SaveKeys:
|
|
PHA
|
|
LDA.l GenericKeys : BEQ +
|
|
PLA : STA.l CurrentGenericKeys
|
|
RTL
|
|
+
|
|
PLA : STA.l DungeonKeys, X
|
|
CPX.b #$00 : BNE +
|
|
STA.l HyruleCastleKeys ; copy HC to sewers
|
|
+
|
|
CPX.b #$01 : BNE +
|
|
STA.l SewerKeys ; copy sewers to HC
|
|
+
|
|
RTL
|
|
;--------------------------------------------------------------------------------
|
|
|
|
;--------------------------------------------------------------------------------
|
|
; ClearOWKeys:
|
|
;--------------------------------------------------------------------------------
|
|
ClearOWKeys:
|
|
PHA
|
|
|
|
JSL TurtleRockEntranceFix
|
|
JSL FakeWorldFix
|
|
JSL FixBunnyOnExitToLightWorld
|
|
LDA.l GenericKeys : BEQ +
|
|
PLA : LDA.l CurrentGenericKeys : STA.l CurrentSmallKeys
|
|
RTL
|
|
+
|
|
PLA : STA.l CurrentSmallKeys
|
|
RTL
|
|
;--------------------------------------------------------------------------------
|
|
|
|
;--------------------------------------------------------------------------------
|
|
; PrepItemScreenBigKey:
|
|
;--------------------------------------------------------------------------------
|
|
PrepItemScreenBigKey:
|
|
STZ.b Scrap02
|
|
STZ.b Scrap03
|
|
REP #$30 ; thing we wrote over - set 16-bit accumulator
|
|
RTL
|
|
;--------------------------------------------------------------------------------
|
|
|
|
;--------------------------------------------------------------------------------
|
|
; LoadPowder:
|
|
;--------------------------------------------------------------------------------
|
|
LoadPowder:
|
|
JSL Sprite_SpawnDynamically ; thing we wrote over
|
|
.justGFX
|
|
LDA.l WitchItem_Player : STA.w SprItemMWPlayer, Y : STA.l !MULTIWORLD_SPRITEITEM_PLAYER_ID
|
|
%GetPossiblyEncryptedItem(WitchItem, SpriteItemValues)
|
|
STA.w SprSourceItemId, Y
|
|
JSL AttemptItemSubstitution
|
|
JSL ResolveLootIDLong
|
|
STA.l PowderFlag
|
|
PHX : TYX : PLY
|
|
JSL RequestStandingItemVRAMSlot_resolved
|
|
PHY : TXY : PLX
|
|
RTL
|
|
;--------------------------------------------------------------------------------
|
|
|
|
;--------------------------------------------------------------------------------
|
|
; InitializeBottles:
|
|
;--------------------------------------------------------------------------------
|
|
InitializeBottles:
|
|
STA.l BottleContents, X ; thing we wrote over
|
|
PHA
|
|
LDA.l BottleIndex : BNE +
|
|
TXA : INC : STA.l BottleIndex ; write bottle index to menu properly
|
|
+
|
|
PLA
|
|
RTL
|
|
;--------------------------------------------------------------------------------
|
|
|
|
;--------------------------------------------------------------------------------
|
|
; DrawPowder:
|
|
;--------------------------------------------------------------------------------
|
|
DrawPowder:
|
|
;LDA.w ItemReceiptPose : BNE .defer ; defer if link is buying a potion
|
|
LDA.w SprRedrawFlag, X : BEQ +
|
|
LDA.w SprItemMWPlayer, X : STA.l !MULTIWORLD_SPRITEITEM_PLAYER_ID
|
|
LDA.w SprSourceItemId, X
|
|
JSL AttemptItemSubstitution
|
|
JSL ResolveLootIDLong
|
|
STA.l PowderFlag
|
|
JML RequestStandingItemVRAMSlot_resolved
|
|
+
|
|
; this fights with the shopkeep code, so had to move the powder draw there when potion shop is custom
|
|
; LDA.l ShopType : CMP.b #$FF : BNE .defer
|
|
LDA.w SprItemReceipt, X ; Retrieve stored item type
|
|
JML DrawPotItem
|
|
.defer
|
|
RTL
|
|
;--------------------------------------------------------------------------------
|
|
|
|
;--------------------------------------------------------------------------------
|
|
; LoadMushroom:
|
|
;--------------------------------------------------------------------------------
|
|
LoadMushroom:
|
|
LDA.b #$00 : STA.w SpriteGFXControl, X ; thing we wrote over
|
|
.justGFX
|
|
PHA
|
|
INC.w SkipBeeTrapDisguise
|
|
LDA.l MushroomItem_Player : STA.w SprItemMWPlayer : STA.l !MULTIWORLD_SPRITEITEM_PLAYER_ID
|
|
%GetPossiblyEncryptedItem(MushroomItem, SpriteItemValues)
|
|
STA.w SprSourceItemId, X
|
|
JSL RequestStandingItemVRAMSlot
|
|
PLA
|
|
RTL
|
|
;--------------------------------------------------------------------------------
|
|
|
|
;--------------------------------------------------------------------------------
|
|
; DrawMushroom:
|
|
;--------------------------------------------------------------------------------
|
|
DrawMushroom:
|
|
PHA : PHY
|
|
LDA.w SprRedrawFlag, X : BEQ .draw ; skip init if already ready
|
|
JSL LoadMushroom_justGFX
|
|
LDA.w SprRedrawFlag, X : CMP.b #$02 : BEQ .draw
|
|
BRA .done ; don't draw on the init frame
|
|
|
|
.draw
|
|
LDA.w SprItemReceipt, X ; Retrieve stored item type
|
|
JSL DrawPotItem
|
|
|
|
.done
|
|
PLY : PLA
|
|
RTL
|
|
;--------------------------------------------------------------------------------
|
|
|
|
;--------------------------------------------------------------------------------
|
|
; CollectPowder:
|
|
;--------------------------------------------------------------------------------
|
|
CollectPowder:
|
|
LDY.w SprSourceItemId, X ; Retrieve stored item type
|
|
BNE +
|
|
; if for any reason the item value is 0 reload it, just in case
|
|
%GetPossiblyEncryptedItem(WitchItem, SpriteItemValues) : TAY
|
|
+ PHA
|
|
LDA.l WitchItem_Player : STA.l !MULTIWORLD_ITEM_PLAYER_ID
|
|
LDA.b #$01 : STA.l ShopEnableCount
|
|
PLA
|
|
STZ.w ItemReceiptMethod ; item from NPC
|
|
JSL Link_ReceiveItem
|
|
PHA : LDA.b #$00 : STA.l ShopEnableCount : STA.l PowderFlag : PLA
|
|
JSL ItemSet_Powder
|
|
RTL
|
|
;--------------------------------------------------------------------------------
|
|
|
|
;--------------------------------------------------------------------------------
|
|
; RemoveMushroom:
|
|
;--------------------------------------------------------------------------------
|
|
RemoveMushroom:
|
|
LDA.l InventoryTracking : AND.b #$DF : STA.l InventoryTracking ; remove the mushroom
|
|
AND.b #$10 : BEQ .empty ; check if we have powder
|
|
LDA.b #$02 : STA.l PowderEquipment ; give powder if we have it
|
|
RTL
|
|
.empty
|
|
LDA.b #$00 : STA.l PowderEquipment ; clear the inventory slot if we don't have powder
|
|
RTL
|
|
;--------------------------------------------------------------------------------
|
|
|
|
;--------------------------------------------------------------------------------
|
|
; DrawMagicHeader:
|
|
;--------------------------------------------------------------------------------
|
|
DrawMagicHeader:
|
|
LDA.l MagicConsumption : AND.w #$00FF : CMP.w #$0002 : BEQ .quarterMagic
|
|
.halfMagic
|
|
LDA.w #$28F7 : STA.l HUDTileMapBuffer+$04
|
|
LDA.w #$2851 : STA.l HUDTileMapBuffer+$06
|
|
LDA.w #$28FA : STA.l HUDTileMapBuffer+$08
|
|
RTL
|
|
.quarterMagic
|
|
LDA.w #$28F7 : STA.l HUDTileMapBuffer+$04
|
|
LDA.w #$2800 : STA.l HUDTileMapBuffer+$06
|
|
LDA.w #$2801 : STA.l HUDTileMapBuffer+$08
|
|
RTL
|
|
;--------------------------------------------------------------------------------
|
|
|
|
;--------------------------------------------------------------------------------
|
|
; SpawnShovelGamePrizeSFX:
|
|
;--------------------------------------------------------------------------------
|
|
SpawnShovelGamePrizeSFX:
|
|
STA.l MiniGameTime ; thing we wrote over
|
|
PHA
|
|
LDA.b #$1B : STA.w SFX3 ; play puzzle sound
|
|
PLA
|
|
RTL
|
|
;--------------------------------------------------------------------------------
|
|
|
|
;--------------------------------------------------------------------------------
|
|
; SpawnChestGamePrizeSFX:
|
|
;--------------------------------------------------------------------------------
|
|
SpawnChestGamePrizeSFX:
|
|
CPX.b #$07 : BNE .normal
|
|
LDA.b RoomIndex : CMP.b #$06 : BNE .normal
|
|
.prize
|
|
LDA.b #$1B : STA.w SFX3 : RTL ; play puzzle sound
|
|
.normal
|
|
LDA.b #$0E : STA.w SFX3 ; play chest sound
|
|
RTL
|
|
;--------------------------------------------------------------------------------
|
|
|
|
;--------------------------------------------------------------------------------
|
|
; SpawnShovelItem:
|
|
;--------------------------------------------------------------------------------
|
|
SpawnShovelGamePrize:
|
|
JSL Sprite_SpawnDynamically ; thing we wrote over
|
|
LDA.b #$01 : STA.w SprRedrawFlag, Y
|
|
RTL
|
|
;--------------------------------------------------------------------------------
|
|
SpawnShovelItem:
|
|
LDA.w YButtonOverride : BEQ +
|
|
JSL DiggingGameGuy_AttemptPrizeSpawn
|
|
JMP .skip
|
|
+
|
|
|
|
LDA.w TileActDig : AND.b #$01 : BNE + : JMP .skip : + ; corner dig fix
|
|
|
|
PHY : PHP
|
|
PHB : PHK : PLB
|
|
SEP #$30 ; set 8-bit accumulator and index registers
|
|
|
|
LDA.b IndoorsFlag : BEQ + : JMP .no_drop : + ; skip if indoors
|
|
|
|
LDA.b OverworldIndex : CMP.b #$2A : BEQ .no_drop ; don't drop in the haunted grove
|
|
CMP.b #$68 : BEQ .no_drop ; don't drop in the digging game area
|
|
|
|
JSL GetRandomInt : BIT.b #$03 : BNE .no_drop ; drop with 1/4 chance
|
|
|
|
LSR #2 : TAX ; clobber lower 2 bis - we have 64 slots now
|
|
|
|
LDA.l ShovelSpawnTable, X ; look up the drop on the table
|
|
|
|
;most of this part below is copied from the digging game
|
|
|
|
JSL Sprite_SpawnDynamically
|
|
|
|
LDX.b #$00
|
|
LDA.b LinkDirection : CMP.b #$04 : BEQ + : INX : +
|
|
|
|
LDA.l .x_speeds, X : STA.w SpriteVelocityX, Y
|
|
|
|
LDA.b #$00 : STA.w SpriteVelocityY, Y
|
|
LDA.b #$18 : STA.w SpriteVelocityZ, Y
|
|
LDA.b #$FF : STA.w EnemyStunTimer, Y
|
|
LDA.b #$30 : STA.w SpriteTimerE, Y
|
|
|
|
LDA.b LinkPosX : !ADD.l .x_offsets, X
|
|
AND.b #$F0 : STA.w SpritePosXLow, Y
|
|
LDA.b LinkPosX+1 : ADC.b #$00 : STA.w SpritePosXHigh, Y
|
|
|
|
LDA.b LinkPosY : !ADD.b #$16 : AND.b #$F0 : STA.w SpritePosYLow, Y
|
|
LDA.b LinkPosY+1 : ADC.b #$00 : STA.w SpritePosYHigh, Y
|
|
|
|
LDA.b #$00 : STA.w SpriteLayer, Y
|
|
TYX
|
|
|
|
LDA.b #$30 : JSL Sound_SetSfx3PanLong
|
|
|
|
.no_drop
|
|
PLB
|
|
PLP : PLY
|
|
.skip
|
|
RTL
|
|
|
|
;DATA - Shovel Spawn Information
|
|
{
|
|
|
|
.x_speeds
|
|
db $F0
|
|
db $10
|
|
|
|
.x_offsets
|
|
db $00
|
|
db $13
|
|
|
|
}
|
|
;--------------------------------------------------------------------------------
|
|
MaybePlaySelectSFX:
|
|
LDA.w DungeonID : BMI .not_dungeon
|
|
.play
|
|
LDA.b #$20 : STA.w SFX3 ; menu select sound
|
|
RTL
|
|
.not_dungeon
|
|
LDA.l HUDDungeonItems : BIT.b #$13 : BEQ .dont_play
|
|
BIT.b #$0C : BEQ .dont_play
|
|
BRA .play
|
|
.dont_play
|
|
RTL
|
|
;--------------------------------------------------------------------------------
|
|
; A = item id being collected
|
|
ItemGetAlternateSFX:
|
|
PEA.w $C567 ; SNES to RTS to in bank 08
|
|
LDA.w AncillaGet, X : CMP.b #$4A : BNE +
|
|
; collecting pre-activated flute
|
|
LDA.b #$13 : JML Ancilla_SFX2_Near
|
|
+ ; not pre-activated flute
|
|
JSL.l ItemIsJunk : BEQ .normal
|
|
|
|
.junk
|
|
LDA.b #$3B : JML Ancilla_SFX3_Near ; what we wrote over
|
|
|
|
.normal
|
|
LDA.b #$0F : JML Ancilla_SFX3_Near ; what we wrote over
|
|
|
|
; A = item id being collected
|
|
ItemGetOverworldAlternateSFX:
|
|
CPY.b #$4A : BNE +
|
|
JSL Sound_SetSfxPanWithPlayerCoords : ORA.b #$13 : STA.w SFX2
|
|
RTL
|
|
+ ; normal itemget sfx
|
|
JSL.l ItemIsJunk : BEQ .normal
|
|
|
|
.junk
|
|
JSL Sound_SetSfxPanWithPlayerCoords : ORA.b #$3B : STA.w SFX3
|
|
RTL
|
|
|
|
.normal
|
|
JSL Sound_SetSfxPanWithPlayerCoords : ORA.b #$0F : STA.w SFX3 ; what we wrote over
|
|
RTL
|
|
;--------------------------------------------------------------------------------
|