initial checkin
This commit is contained in:
395
heartpieces.asm
Normal file
395
heartpieces.asm
Normal file
@@ -0,0 +1,395 @@
|
||||
;================================================================================
|
||||
; Randomize Heart Pieces
|
||||
;--------------------------------------------------------------------------------
|
||||
HeartPieceGet:
|
||||
PHX : PHY
|
||||
JSL.l LoadHeartPieceRoomValue : TAY ; load item value into Y register
|
||||
JSL.l MaybeMarkDigSpotCollected
|
||||
|
||||
.skipLoad
|
||||
|
||||
STZ $02E9 ; 0 = Receiving item from an NPC or message
|
||||
|
||||
CPY.b #$26 : BNE .notHeart ; don't add a 1/4 heart if it's not a heart piece
|
||||
LDA $7EF36B : INC A : AND.b #$03 : STA $7EF36B : BNE .unfinished_heart ; add up heart quarters
|
||||
BRA .giveItem
|
||||
|
||||
.notHeart
|
||||
|
||||
.giveItem
|
||||
JSL.l $0791B3 ; Player_HaltDashAttackLong
|
||||
JSL.l Link_ReceiveItem
|
||||
CLC ; return false
|
||||
BRL .done ; finished
|
||||
|
||||
.unfinished_heart
|
||||
SEC ; return true
|
||||
.done
|
||||
|
||||
JSL MaybeUnlockTabletAnimation
|
||||
|
||||
PLY : PLX
|
||||
RTL
|
||||
;--------------------------------------------------------------------------------
|
||||
HeartContainerGet:
|
||||
PHX : PHY
|
||||
JSL.l LoadHeartContainerRoomValue : TAY ; load item value into Y register
|
||||
|
||||
BRA HeartPieceGet_skipLoad
|
||||
;--------------------------------------------------------------------------------
|
||||
!REDRAW = "$7F5000"
|
||||
DrawHeartPieceGFX:
|
||||
PHP
|
||||
JSL.l Sprite_IsOnscreen : BCC .offscreen
|
||||
|
||||
PHA : PHY
|
||||
LDA !REDRAW : BEQ .skipInit ; skip init if already ready
|
||||
JSL.l HeartPieceSpritePrep
|
||||
BRL .done ; don't draw on the init frame
|
||||
|
||||
.skipInit
|
||||
JSL.l LoadHeartPieceRoomValue
|
||||
|
||||
.skipLoad
|
||||
|
||||
PHA
|
||||
JSL.l IsNarrowSprite : BCC +
|
||||
LDA $0E60, X : ORA.b #$20 : STA $0E60, X
|
||||
+
|
||||
;LDA $0E60, X : ORA.b #$10 : STA $0E60, X
|
||||
|
||||
PLA
|
||||
|
||||
JSL.l DrawDynamicTile
|
||||
JSL.l Sprite_DrawShadowLong
|
||||
|
||||
.done
|
||||
PLY : PLA
|
||||
.offscreen
|
||||
PLP
|
||||
RTL
|
||||
;--------------------------------------------------------------------------------
|
||||
!REDRAW = "$7F5000"
|
||||
DrawHeartContainerGFX:
|
||||
PHP
|
||||
JSL.l Sprite_IsOnscreen : BCC DrawHeartPieceGFX_offscreen
|
||||
|
||||
PHA : PHY
|
||||
LDA !REDRAW : BEQ .skipInit ; skip init if already ready
|
||||
JSL.l HeartContainerSpritePrep
|
||||
BRA DrawHeartPieceGFX_done ; don't draw on the init frame
|
||||
|
||||
.skipInit
|
||||
JSL.l LoadHeartContainerRoomValue
|
||||
|
||||
BRA DrawHeartPieceGFX_skipLoad
|
||||
;--------------------------------------------------------------------------------
|
||||
HeartContainerSound:
|
||||
CPY.b #$20 : BEQ + ; Skip for Crystal
|
||||
CPY.b #$37 : BEQ + ; Skip for Pendants
|
||||
CPY.b #$38 : BEQ +
|
||||
CPY.b #$39 : BEQ +
|
||||
JSL.l CheckIfBossRoom : BCC + ; Skip if not in a boss room
|
||||
LDA.b #$2E
|
||||
SEC
|
||||
RTL
|
||||
+
|
||||
CLC
|
||||
RTL
|
||||
;--------------------------------------------------------------------------------
|
||||
NormalItemSkipSound:
|
||||
LDA $0C5E, X ; thing we wrote over
|
||||
|
||||
CPY.b #$20 : BEQ + ; Skip for Crystal
|
||||
CPY.b #$37 : BEQ + ; Skip for Pendants
|
||||
CPY.b #$38 : BEQ +
|
||||
CPY.b #$39 : BEQ +
|
||||
|
||||
PHA
|
||||
JSL.l CheckIfBossRoom
|
||||
PLA
|
||||
RTL
|
||||
+
|
||||
CLC
|
||||
RTL
|
||||
;--------------------------------------------------------------------------------
|
||||
HeartUpgradeSpawnDecision: ; this should return #$00 to make the hp spawn
|
||||
LDA !FORCE_HEART_SPAWN : BEQ .normal_behavior
|
||||
|
||||
DEC : STA !FORCE_HEART_SPAWN
|
||||
LDA #$00
|
||||
RTL
|
||||
|
||||
.normal_behavior
|
||||
LDA $7EF280, X
|
||||
RTL
|
||||
;--------------------------------------------------------------------------------
|
||||
SaveHeartCollectedStatus:
|
||||
LDA !SKIP_HEART_SAVE : BEQ .normal_behavior
|
||||
|
||||
DEC : STA !SKIP_HEART_SAVE
|
||||
RTL
|
||||
|
||||
.normal_behavior
|
||||
LDA $7EF280, X : ORA.b #$40 : STA $7EF280, X
|
||||
RTL
|
||||
;--------------------------------------------------------------------------------
|
||||
!REDRAW = "$7F5000"
|
||||
HeartPieceSpritePrep:
|
||||
PHA
|
||||
|
||||
LDA #$01 : STA !REDRAW
|
||||
LDA $5D : CMP #$14 : BEQ .skip ; skip if we're mid-mirror
|
||||
|
||||
LDA #$00 : STA !REDRAW
|
||||
JSL.l LoadHeartPieceRoomValue ; load item type
|
||||
JSL.l PrepDynamicTile
|
||||
|
||||
.skip
|
||||
PLA
|
||||
RTL
|
||||
;--------------------------------------------------------------------------------
|
||||
!REDRAW = "$7F5000"
|
||||
HeartContainerSpritePrep:
|
||||
PHA
|
||||
|
||||
LDA #$00 : STA !REDRAW
|
||||
JSL.l LoadHeartContainerRoomValue ; load item type
|
||||
JSL.l PrepDynamicTile
|
||||
|
||||
PLA
|
||||
RTL
|
||||
;--------------------------------------------------------------------------------
|
||||
LoadHeartPieceRoomValue:
|
||||
LDA $1B : BEQ .outdoors ; check if we're indoors or outdoors
|
||||
.indoors
|
||||
JSL.l LoadIndoorValue
|
||||
BRL .done
|
||||
.outdoors
|
||||
JSL.l LoadOutdoorValue
|
||||
.done
|
||||
RTL
|
||||
;--------------------------------------------------------------------------------
|
||||
!REDRAW = "$7F5000"
|
||||
HPItemReset:
|
||||
JSL $09AD58 ; GiveRupeeGift - thing we wrote over
|
||||
PHA : LDA #$01 : STA !REDRAW : PLA
|
||||
RTL
|
||||
;--------------------------------------------------------------------------------
|
||||
MaybeMarkDigSpotCollected:
|
||||
PHA : PHP
|
||||
LDA $1B : BNE +
|
||||
REP #$20 ; set 16-bit accumulator
|
||||
LDA $8A
|
||||
CMP.w #$2A : BNE +
|
||||
LDA !HAS_GROVE_ITEM : ORA.w #$0001 : STA !HAS_GROVE_ITEM
|
||||
+
|
||||
PLP : PLA
|
||||
RTL
|
||||
;--------------------------------------------------------------------------------
|
||||
LoadIndoorValue:
|
||||
PHP
|
||||
REP #$20 ; set 16-bit accumulator
|
||||
LDA $A0 ; these are all decimal because i got them that way
|
||||
CMP.w #225 : BNE +
|
||||
LDA HeartPiece_Forest_Thieves
|
||||
BRL .done
|
||||
+ CMP.w #226 : BNE +
|
||||
LDA HeartPiece_Lumberjack_Tree
|
||||
BRL .done
|
||||
+ CMP.w #234 : BNE +
|
||||
LDA HeartPiece_Spectacle_Cave
|
||||
BRL .done
|
||||
+ CMP.w #283 : BNE +
|
||||
LDA $22 : XBA : AND.w #$0001 ; figure out where link is
|
||||
BNE ++
|
||||
LDA HeartPiece_Circle_Bushes
|
||||
BRL .done
|
||||
++
|
||||
LDA HeartPiece_Graveyard_Warp
|
||||
BRL .done
|
||||
+ CMP.w #294 : BNE +
|
||||
LDA HeartPiece_Mire_Warp
|
||||
BRL .done
|
||||
+ CMP.w #295 : BNE +
|
||||
LDA HeartPiece_Smith_Pegs
|
||||
BRL .done
|
||||
+ CMP.w #135 : BNE +
|
||||
LDA StandingKey_Hera
|
||||
BRL .done
|
||||
+
|
||||
LDA.w #$0017 ; default to a normal hp
|
||||
.done
|
||||
AND.w #$00FF ; the loads are words but the values are 1-byte so we need to clear the top half of the accumulator - no guarantee it was 8-bit before
|
||||
PLP
|
||||
RTL
|
||||
;--------------------------------------------------------------------------------
|
||||
;225 - HeartPiece_Forest_Thieves
|
||||
;226 - HeartPiece_Lumberjack_Tree
|
||||
;234 - HeartPiece_Spectacle_Cave
|
||||
;283 - HeartPiece_Circle_Bushes
|
||||
;283 - HeartPiece_Graveyard_Warp
|
||||
;294 - HeartPiece_Mire_Warp
|
||||
;295 - HeartPiece_Smith_Pegs
|
||||
;--------------------------------------------------------------------------------
|
||||
LoadOutdoorValue:
|
||||
PHP
|
||||
REP #$20 ; set 16-bit accumulator
|
||||
LDA $8A
|
||||
CMP.w #$03 : BNE +
|
||||
LDA $22 : CMP.w #1890 : !BLT ++
|
||||
LDA HeartPiece_Spectacle
|
||||
BRL .done
|
||||
++
|
||||
LDA EtherItem
|
||||
BRL .done
|
||||
+ CMP.w #$05 : BNE +
|
||||
LDA HeartPiece_Mountain_Warp
|
||||
BRL .done
|
||||
+ CMP.w #$28 : BNE +
|
||||
LDA HeartPiece_Maze
|
||||
BRL .done
|
||||
+ CMP.w #$2A : BNE +
|
||||
LDA HauntedGroveItem
|
||||
BRL .done
|
||||
+ CMP.w #$30 : BNE +
|
||||
LDA $22 : CMP.w #512 : !BGE ++
|
||||
LDA HeartPiece_Desert
|
||||
BRL .done
|
||||
++
|
||||
LDA BombosItem
|
||||
BRL .done
|
||||
+ CMP.w #$35 : BNE +
|
||||
LDA HeartPiece_Lake
|
||||
BRL .done
|
||||
+ CMP.w #$3B : BNE +
|
||||
LDA HeartPiece_Swamp
|
||||
BRL .done
|
||||
+ CMP.w #$42 : BNE +
|
||||
LDA HeartPiece_Cliffside
|
||||
BRL .done
|
||||
+ CMP.w #$4A : BNE +
|
||||
LDA HeartPiece_Cliffside
|
||||
BRL .done
|
||||
+ CMP.w #$5B : BNE +
|
||||
LDA HeartPiece_Pyramid
|
||||
BRL .done
|
||||
+ CMP.w #$68 : BNE +
|
||||
LDA HeartPiece_Digging
|
||||
BRL .done
|
||||
+ CMP.w #$81 : BNE +
|
||||
LDA HeartPiece_Zora
|
||||
BRL .done
|
||||
+
|
||||
LDA.w #$0017 ; default to a normal hp
|
||||
.done
|
||||
AND.w #$00FF ; the loads are words but the values are 1-byte so we need to clear the top half of the accumulator - no guarantee it was 8-bit before
|
||||
PLP
|
||||
RTL
|
||||
;--------------------------------------------------------------------------------
|
||||
;$03 - HeartPiece_Spectacle
|
||||
;$05 - HeartPiece_Mountain_Warp
|
||||
;$28 - HeartPiece_Maze
|
||||
;$30 - HeartPiece_Desert
|
||||
;$35 - HeartPiece_Lake
|
||||
;$3B - HeartPiece_Swamp
|
||||
;$42 - HeartPiece_Cliffside - not really but the gfx load weird otherwise
|
||||
;$4A - HeartPiece_Cliffside
|
||||
;$5B - HeartPiece_Pyramid
|
||||
;$68 - HeartPiece_Digging
|
||||
;$81 - HeartPiece_Zora
|
||||
;--------------------------------------------------------------------------------
|
||||
LoadHeartContainerRoomValue:
|
||||
LoadBossValue:
|
||||
PHP
|
||||
REP #$20 ; set 16-bit accumulator
|
||||
LDA $A0 ; these are all decimal because i got them that way
|
||||
CMP.w #200 : BNE +
|
||||
LDA HeartContainer_ArmosKnights
|
||||
BRL .done
|
||||
+ CMP.w #51 : BNE +
|
||||
LDA HeartContainer_Lanmolas
|
||||
BRL .done
|
||||
+ CMP.w #7 : BNE +
|
||||
LDA HeartContainer_Moldorm
|
||||
BRL .done
|
||||
+ CMP.w #90 : BNE +
|
||||
LDA HeartContainer_HelmasaurKing
|
||||
BRL .done
|
||||
+ CMP.w #6 : BNE +
|
||||
LDA HeartContainer_Arrghus
|
||||
BRL .done
|
||||
+ CMP.w #41 : BNE +
|
||||
LDA HeartContainer_Mothula
|
||||
BRL .done
|
||||
+ CMP.w #172 : BNE +
|
||||
LDA HeartContainer_Blind
|
||||
BRL .done
|
||||
+ CMP.w #222 : BNE +
|
||||
LDA HeartContainer_Kholdstare
|
||||
BRL .done
|
||||
+ CMP.w #144 : BNE +
|
||||
LDA HeartContainer_Vitreous
|
||||
BRL .done
|
||||
+ CMP.w #164 : BNE +
|
||||
LDA HeartContainer_Trinexx
|
||||
BRL .done
|
||||
+
|
||||
LDA.w #$003E ; default to a normal boss heart
|
||||
.done
|
||||
AND.w #$00FF ; the loads are words but the values are 1-byte so we need to clear the top half of the accumulator - no guarantee it was 8-bit before
|
||||
PLP
|
||||
RTL
|
||||
;--------------------------------------------------------------------------------
|
||||
CheckIfBossRoom:
|
||||
;--------------------------------------------------------------------------------
|
||||
; Carry set if we're in a boss room, unset otherwise.
|
||||
;--------------------------------------------------------------------------------
|
||||
REP #$20 ; set 16-bit accumulator
|
||||
LDA $A0 ; these are all decimal because i got them that way
|
||||
CMP.w #200 : BNE +
|
||||
SEC : BRL .done
|
||||
+ CMP.w #51 : BNE +
|
||||
SEC : BRL .done
|
||||
+ CMP.w #7 : BNE +
|
||||
SEC : BRL .done
|
||||
+ CMP.w #90 : BNE +
|
||||
SEC : BRL .done
|
||||
+ CMP.w #6 : BNE +
|
||||
SEC : BRL .done
|
||||
+ CMP.w #41 : BNE +
|
||||
SEC : BRL .done
|
||||
+ CMP.w #172 : BNE +
|
||||
SEC : BRL .done
|
||||
+ CMP.w #222 : BNE +
|
||||
SEC : BRL .done
|
||||
+ CMP.w #144 : BNE +
|
||||
SEC : BRL .done
|
||||
+ CMP.w #164 : BNE +
|
||||
SEC : BRL .done
|
||||
+
|
||||
CLC
|
||||
.done
|
||||
SEP #$20 ; set 8-bit accumulator
|
||||
RTL
|
||||
;--------------------------------------------------------------------------------
|
||||
;#200 - Eastern Palace - Armos Knights
|
||||
;#51 - Desert Palace - Lanmolas
|
||||
;#7 - Tower of Hera - Moldorm
|
||||
;#32 - Agahnim's Tower - Agahnim I
|
||||
;#90 - Palace of Darkness - Helmasaur King
|
||||
;#6 - Swamp Palace - Arrghus
|
||||
;#41 - Skull Woods - Mothula
|
||||
;#172 - Thieves' Town - Blind
|
||||
;#222 - Ice Palace - Kholdstare
|
||||
;#144 - Misery Mire - Vitreous
|
||||
;#164 - Turtle Rock - Trinexx
|
||||
;#13 - Ganon's Tower - Agahnim II
|
||||
;#0 - Pyramid of Power - Ganon
|
||||
;--------------------------------------------------------------------------------
|
||||
;JSL $06DD40 ; DashKey_Draw
|
||||
;JSL $06DBF8 ; Sprite_PrepAndDrawSingleLargeLong
|
||||
;JSL $06DC00 ; Sprite_PrepAndDrawSingleSmallLong ; draw first cell correctly
|
||||
;JSL $00D51B ; GetAnimatedSpriteTile
|
||||
;JSL $00D52D ; GetAnimatedSpriteTile.variable
|
||||
;================================================================================
|
||||
Reference in New Issue
Block a user