Files
oracle-of-secrets/Sprites/Bosses/octoboss.asm
2024-06-17 11:47:39 -04:00

1096 lines
23 KiB
NASM

; =========================================================
; Octoboss by Zarby89
; TODO: Find a sprite to inject this into
; JSL Sprite_Octoboss_Long
BrotherSpr = $0EB0
Sprite_Octoboss_Long:
{
PHB : PHK : PLB
LDA.w SprMiscD, X : BNE + ; is the sprite already init
LDA #$04 : STA.w $0E40, X
;LDA.w SprHitbox, X : AND.b #$E0 : ORA.b #$23 : STA.w SprHitbox, X
;LDA.w $0CAA, X : AND #$7F : ORA.b #$81 : STA.w $0CAA, X
;LDA.b #$20 : STA.w SprHealth, X
STZ.w $0BA0, X
; TODO: Add a safety check to prevent player from leaving without the item
; example if player left without the item, item will be on the ground still
; when he'll came back on that screen
PHX
LDX.b $8A
LDA.l $7EF280, X : AND.b #$40 : BEQ .notKiledYet
PLX ; get back SPR index
; Is is killed? do we have the quake medallion tho ?
LDA.l $7EF349 : BNE .weHaveMedallion
; Spawn the medallion
STZ.w $0DD0, X
JSR SpawnMedallionAlt ; spawn standing medallion
BRA .SpriteIsNotActive
.weHaveMedallion
; Do nothing just kill this sprite
STZ.w $0DD0, X
BRA .SpriteIsNotActive
.notKiledYet
PLX
;LDA.w $0E60, X : AND.b #$BF : STA.w $0E60, X
;LDA.w $0F50, X : AND.b #$BF : STA.w $0F50, X
LDA.b #15 : STA.w SprFrame, X
LDA.b #$87 : STA.l $7EC664 : STA.l $7EC684
LDA.b #$55 : STA.l $7EC665 : STA.l $7EC685
INC.b $15
INC.w SprMiscD, X ; increase it so sprite is initialized
LDA.l $7EF343 : INC : STA.l $7EF343
+
LDA.w SprMiscF, X : BNE +
JSR Sprite_Octoboss_Draw ; Call the draw code
BRA ++
+
JSR Sprite_Octoboss_Draw2 ; Call the draw code
++
JSL Sprite_CheckActive ; Check if game is not paused
BCC .SpriteIsNotActive ; Skip Main code is sprite is innactive
LDA.w SprMiscF, X : BNE +
JSR Sprite_Octoboss_Main ; Call the main sprite code
BRA .SpriteIsNotActive
+
JSR Sprite_Octoboss_Secondary ; Call the Secondary sprite code
.SpriteIsNotActive
PLB ; Get back the databank we stored previously
RTL ; Go back to original code
}
Sprite_Octoboss_Main:
{
LDA.w SprAction, X; Load the SprAction
JSL UseImplicitRegIndexedLocalJumpTable; Goto the SprAction we are currently in
dw WaitForPlayerToApproach ; 00
dw Emerge ; 01
dw EmergedShowMessage ; 02
dw SpawnAndAwakeHisBrother ; 03
dw WaitForBrotherEmerge ; 04
dw SpawnPirateHats ; 05
dw IdlePhase ; 06
dw PickDirection ; 07
dw Moving ; 08
dw WaitMessageBeforeSurrender ; 09
dw RemoveHat ; 0A
dw Submerge ; 0B
dw SubmergeWaitWall ; 0C
dw EmergeWaitGiveItem ; 0D
dw SubmergeForeverKill ; 0E
Sprite_Octoboss_Secondary:
LDA.w SprAction, X; Load the SprAction
JSL UseImplicitRegIndexedLocalJumpTable; Goto the SprAction we are currently in
dw WaitForPlayerToApproach ; 00
dw Emerge ; 01
dw WaitDialog ; 02
dw IdlePhase ; 03
dw PickDirection ; 04
dw Moving2 ; 05
dw IdleWait ; 06
dw SubmergeForeverKill ; 07
WaitForPlayerToApproach:
REP #$20
LDA.b $20 : CMP #$08C8
SEP #$20
BCS .TooFar
INC.w SprAction, X
STZ.w SprFrame, X
JSR SpawnSplash
.TooFar
RTS
; 08B8
Emerge:
INC.w $02E4 ; prevent link from moving
LDA.w SprTimerB, X : BNE +
LDA.w SprFrame, X : INC : STA.w SprFrame, X : CMP.b #8 : BCC .noframereset
INC.w SprAction, X
.noframereset
LDA.b #2 : STA.w SprTimerB, X
+
RTS
EmergedShowMessage:
LDA.b #$48
LDY.b #$00
JSL Sprite_ShowMessageUnconditional
INC.w SprAction, X
RTS
WaitDialog:
RTS
SpawnAndAwakeHisBrother:
LDA.b #$40 : STA.w SprTimerC, X ; Will need to adjust
LDA.b #$3C
JSL Sprite_SpawnDynamically
TYA
STA.w BrotherSpr, X ; keep the brother id
LDA.b #$D0 : STA.w SprY, Y
LDA.b #$08 : STA.w SprYH, Y
LDA.b #$20 : STA.w SprX, Y
LDA.b #$09 : STA.w SprXH, Y
LDA.b #$01 : STA.w SprMiscF, Y
LDA.b #$00 : STA.w SprFrame, Y
; Do the spawning code
INC.w SprAction, X
RTS
WaitForBrotherEmerge:
LDA.w SprTimerC, X : BNE +
LDA.b #$49
LDY.b #$00
JSL Sprite_ShowMessageUnconditional
LDA #$16 : STA SprTimerC, X
INC.w SprAction, X
+
RTS
SpawnPirateHats:
LDA.w SprTimerC, X : CMP #$14 : BNE +
PHX
JSR SpawnBossPoof
PLX
PHX
LDA.w BrotherSpr, X : TAX
JSR SpawnBossPoof
PLX
+
LDY.w BrotherSpr, X
LDA.w SprTimerC, X : CMP #$0A : BNE +
LDA.b #10 : STA.w SprFrame, X
LDA.b #10 : STA.w SprFrame, Y
+
; Spawn Walls too
LDA.w SprTimerC, X : BNE +
LDA.w SprAction, Y : INC : STA.w SprAction, Y
LDA.b #$40
STA.w SprTimerC, Y
STA.w SprTimerC, X
STZ.w $02E4 ; allow link to move again
INC.w SprAction, X
; All the tiles spawned by the sprite
; you can use a sprite/item to get location from ZS
; and use the macro GetTilePos($x,$y)
;-------------------------------------------------------------
PHX
REP #$30
%GetTilePos($0F, $07)
LDA.w #$068F
JSL $1BC97C ; Overworld_DrawMap16_Persist
%GetTilePos($10, $07)
LDA.w #$068F
JSL $1BC97C ; Overworld_DrawMap16_Persist
%GetTilePos($11, $07)
LDA.w #$068F
JSL $1BC97C ; Overworld_DrawMap16_Persist
%GetTilePos($0F, $08)
LDA.w #$06A4
JSL $1BC97C ; Overworld_DrawMap16_Persist
%GetTilePos($10, $08)
LDA.w #$06A4
JSL $1BC97C ; Overworld_DrawMap16_Persist
%GetTilePos($11, $08)
LDA.w #$06A4
JSL $1BC97C ; Overworld_DrawMap16_Persist
SEP #$30
PLX
LDA.b #$01
STA.b $14
;-------------------------------------------------------------
+
RTS
IdlePhase:
LDA.w SprTimerC, X : CMP.b #$08 : BNE +
JSL Sprite_SpawnFireball
+
LDA.w SprTimerC, X : BNE +
INC.w SprAction, X
+
LDA.w SprTimerB, X : BNE +
LDA.b #$01 : STA.w SprHeight, X
LDA.w SprFrame, X : INC : STA.w SprFrame, X : CMP.b #12 : BCC .noframereset
LDA.b #10 : STA.w SprFrame, X
STZ.w SprHeight, X
.noframereset
LDA.b #18 : STA.w SprTimerB, X
+
LDA.w SprMiscF, X : BNE + ; is it the red octopus? (blue doesn't need to run that)
JSR ReturnTotalHealth ; return the health total of both sprite
CMP.b #$30 : BCS .tooMuchHealth
LDA.b #$09 : STA.w SprAction, X ; go to wait message action
.tooMuchHealth
+
JSL Sprite_CheckDamageFromPlayer
RTS
PickDirection:
JSL GetRandomInt : AND.b #$1F : SEC : SBC #$10 : STA.w SprXSpeed, X
JSL GetRandomInt : AND.b #$1F : SEC : SBC #$10 : STA.w SprYSpeed, X
INC.w SprAction, X
JSL GetRandomInt : AND.b #$4F : CLC : ADC.b #$1F : STA.w SprTimerC, X
RTS
Moving:
LDA.w SprTimerC, X : BNE +
DEC.w SprAction, X
DEC.w SprAction, X
JSL GetRandomInt : AND.b #$4F : CLC : ADC.b #$1F : STA.w SprTimerC, X
+
JSL Sprite_Move
LDA.w SprTimerB, X : BNE +
LDA.b #$01 : STA.w SprHeight, X
LDA.w SprFrame, X : INC : STA.w SprFrame, X : CMP.b #12 : BCC .noframereset
LDA.b #10 : STA.w SprFrame, X
STZ.w SprHeight, X
.noframereset
LDA.b #10 : STA.w SprTimerB, X
+
LDA.w SprX, X : CMP.b #$E2 : BCC .notTooFarRight
LDA.w SprXSpeed, X : BMI .notTooFarRight
EOR.b #$FF : STA.w SprXSpeed, X
.notTooFarRight
LDA.w SprX, X : CMP.b #$80 : BCS .notTooFarLeft
LDA.w SprXSpeed, X : BPL .notTooFarLeft
EOR.b #$FF : STA.w SprXSpeed, X
.notTooFarLeft
LDA.w SprY, X : CMP.b #$FB : BCC .notTooFarDown
LDA.w SprYSpeed, X : BMI .notTooFarDown
EOR.b #$FF : STA.w SprYSpeed, X
.notTooFarDown
LDA.w SprY, X : CMP.b #$B8 : BCS .notTooFarUp
LDA.w SprYSpeed, X : BPL .notTooFarUp
EOR.b #$FF : STA.w SprYSpeed, X
.notTooFarUp
JSR HandleMovingSplash
JSL Sprite_CheckDamageFromPlayer
JSR ReturnTotalHealth ; return the health total of both sprite
CMP.b #$30 : BCS .tooMuchHealth
LDA.b #$09 : STA.w SprAction, X ; go to wait message action
.tooMuchHealth
RTS
Moving2:
LDA.w SprTimerC, X : BNE +
DEC.w SprAction, X
DEC.w SprAction, X
JSL GetRandomInt : AND.b #$4F : CLC : ADC.b #$1F : STA.w SprTimerC, X
+
JSL Sprite_Move
LDA.w SprTimerB, X : BNE +
LDA.b #$01 : STA.w SprHeight, X
LDA.w SprFrame, X : INC : STA.w SprFrame, X : CMP.b #12 : BCC .noframereset
LDA.b #10 : STA.w SprFrame, X
STZ.w SprHeight, X
.noframereset
LDA.b #10 : STA.w SprTimerB, X
+
LDA.w SprX, X : CMP.b #$78 : BCC .notTooFarRight
LDA.w SprXSpeed, X : BMI .notTooFarRight
EOR.b #$FF : STA.w SprXSpeed, X
.notTooFarRight
LDA.w SprX, X : CMP.b #$10 : BCS .notTooFarLeft
LDA.w SprXSpeed, X : BPL .notTooFarLeft
EOR.b #$FF : STA.w SprXSpeed, X
.notTooFarLeft
LDA.w SprY, X : CMP.b #$FB : BCC .notTooFarDown
LDA.w SprYSpeed, X : BMI .notTooFarDown
EOR.b #$FF : STA.w SprYSpeed, X
.notTooFarDown
LDA.w SprY, X : CMP.b #$B8 : BCS .notTooFarUp
LDA.w SprYSpeed, X : BPL .notTooFarUp
EOR.b #$FF : STA.w SprYSpeed, X
.notTooFarUp
JSR HandleMovingSplash
JSL Sprite_CheckDamageFromPlayer
RTS
WaitMessageBeforeSurrender:
; display message 4A ; Wait! WAIT! please!
LDY.w BrotherSpr, X
LDA.b #$06 : STA.w SprAction, Y ; set brother to action 6
LDA.b #$50 : STA.w SprTimerC, X ; set timer to remove hat, surrender
LDA.b #$4A
LDY.b #$00
JSL Sprite_ShowMessageUnconditional
INC.w SprAction, X ; go to remove hat routine
RTS
RemoveHat:
INC.w $02E4
STZ.b $5D ; kill link action
; Use timer to remove hat like when it's spawning
LDA.w SprTimerC, X : CMP #$34 : BNE +
PHX
JSR SpawnBossPoof
PLX
PHX
LDA.w BrotherSpr, X : TAX
JSR SpawnBossPoof
PLX
+
LDY.w BrotherSpr, X
LDA.w SprTimerC, X : CMP #$3A : BNE +
LDA.b #9 : STA.w SprFrame, X
LDA.b #9 : STA.w SprFrame, Y
+
LDA.w SprTimerC, X : BNE +
LDA.b #$4B
LDY.b #$00
JSL Sprite_ShowMessageUnconditional
INC.w SprAction, X ; surrender message
+
RTS
Submerge:
; display message 4B ; Surrender message
LDA.w SprTimerB, X : BNE +
LDA.w SprFrame, X : DEC : STA.w SprFrame, X : CMP.b #01 : BCS .noframereset
JSR SpawnSplash
INC.w SprAction, X ; surrender message
LDA.b #15 : STA.w SprFrame, X
LDA.b #$B0 : STA.w SprX, X
LDA.b #$08 : STA.w SprXH, X : STA.w SprYH, X
LDA.b #$D4 : STA.w SprY, X
LDA.b #$90 : STA.w SprTimerC, X
.noframereset
LDA.b #2 : STA.w SprTimerB, X
+
RTS
SubmergeWaitWall:
; go under water to get the item - move back to original position
LDA.w SprTimerC, X : BNE +
STZ.w SprFrame, X
INC.w SprAction, X
LDA.b #$40 : STA.w SprTimerC, X
+
LDA.w SprTimerC, X : CMP.b #$40 : BNE +
;-------------------------------------------------------------
PHX
REP #$30
%GetTilePos($0F, $07)
LDA.w #$0034
JSL $1BC97C ; Overworld_DrawMap16_Persist
%GetTilePos($10, $07)
LDA.w #$0034
JSL $1BC97C ; Overworld_DrawMap16_Persist
%GetTilePos($11, $07)
LDA.w #$0034
JSL $1BC97C ; Overworld_DrawMap16_Persist
%GetTilePos($0F, $08)
LDA.w #$0034
JSL $1BC97C ; Overworld_DrawMap16_Persist
%GetTilePos($10, $08)
LDA.w #$0034
JSL $1BC97C ; Overworld_DrawMap16_Persist
%GetTilePos($11, $08)
LDA.w #$0034
JSL $1BC97C ; Overworld_DrawMap16_Persist
SEP #$30
PLX
LDA.b #$01
STA.b $14
;-------------------------------------------------------------
+
RTS
EmergeWaitGiveItem:
; Emerge back wait few frames, throw item in the middle moat, despawn wall
LDA.w SprTimerB, X : BNE +
LDA.w SprFrame, X : INC : STA.w SprFrame, X : CMP.b #9 : BCC .noframereset
LDA.b #$09 : STA.w SprFrame, X
.noframereset
LDA.b #2 : STA.w SprTimerB, X
+
LDA.w SprTimerC, X : BNE .noItemYet
INC.w SprAction, X
JSR SpawnMedallion
LDY.w BrotherSpr, X
LDA.b #$07 : STA.w SprAction, Y
; Throw item here
PHX
LDX.b $8A
LDA.l $7EF280, X : ORA.b #$40 : STA.l $7EF280, X ; save in HP sram
PLX
.noItemYet
RTS
SubmergeForeverKill:
; Set overworld sram flag for object collected on that screen
STZ.w $02E4 ; allow link to move
LDA.w SprTimerB, X : BNE +
LDA.w SprFrame, X : DEC : STA.w SprFrame, X : CMP.b #01 : BCS .noframereset
JSR SpawnSplash
STZ.w $0DD0, X
.noframereset
LDA.b #2 : STA.w SprTimerB, X
+
RTS
IdleWait:
RTS
ReturnTotalHealth:
LDY.w BrotherSpr, X
LDA.w SprHealth, Y : STA.b $00
LDA.w SprHealth, X : CLC : ADC.b $00
RTS
}
; =========================================================
; Sprite Draw code
; Draw the tiles on screen with the data provided by the sprite maker editor
; =========================================================
Sprite_Octoboss_Draw:
{
JSL Sprite_PrepOamCoord
JSL Sprite_OAM_AllocateDeferToPlayer
LDA $0DC0, X : CLC : ADC $0D90, X : TAY;Animation Frame
LDA .start_index, Y : STA $06
PHX
LDX .nbr_of_tiles, Y ;amount of tiles -1
LDY.b #$00
.nextTile
PHX ; Save current Tile Index?
TXA : CLC : ADC $06 ; Add Animation Index Offset
PHA ; Keep the value with animation index offset?
ASL A : TAX
REP #$20
LDA $00 : CLC : ADC .x_offsets, X : STA ($90), Y
AND.w #$0100 : STA $0E
INY
LDA $02 : CLC : ADC .y_offsets, X : STA ($90), Y
CLC : ADC #$0010 : CMP.w #$0100
SEP #$20
BCC .on_screen_y
LDA.b #$F0 : STA ($90), Y ;Put the sprite out of the way
STA $0E
.on_screen_y
PLX ; Pullback Animation Index Offset (without the *2 not 16bit anymore)
INY
LDA .chr, X : STA ($90), Y
INY
LDA.b $05 : ORA.w .properties, X : STA ($90), Y
PHY
TYA : LSR #2 : TAY
LDA .sizes, X : ORA $0F : STA ($92), Y ; store size in oam buffer
PLY : INY
PLX : DEX : BPL .nextTile
PLX
RTS
; =========================================================
; Sprite Draw Generated Data
; This is where the generated Data for the sprite go
; =========================================================
.start_index
db $00, $04, $0A, $10, $16, $1C, $20, $24, $28, $2C, $30, $34, $38, $3C, $40, $44
.nbr_of_tiles
db 3, 5, 5, 5, 5, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0
.x_offsets
dw -8, 8, -8, 8
dw -8, 8, -8, 8, -8, 8
dw -8, 8, -8, 8, -8, 8
dw -8, 8, -8, 8, -8, 8
dw -8, 8, -8, 8, -8, 8
dw -8, 8, -8, 8
dw -8, 8, -8, 8
dw -8, 8, -8, 8
dw -8, 8, -8, 8
dw -8, 8, -8, 8
dw -8, 8, -8, 8
dw -8, 8, -8, 8
dw -8, 8, -8, 8
dw -8, 8, -8, 8
dw -8, 8, -8, 8
dw 0
.y_offsets
dw 6, 6, 16, 16
dw 16, 16, 0, 0, 16, 16
dw 12, 12, -4, -4, 16, 16
dw 8, 8, -8, -8, 16, 16
dw 4, 4, -12, -12, 16, 16
dw 0, 0, -16, -16
dw -2, -2, -18, -18
dw 0, 0, -16, -16
dw -16, -16, 0, 0
dw 0, 0, -16, -16
dw 0, 0, -16, -16
dw 0, 0, -16, -16
dw 0, 0, -16, -16
dw 0, 0, -16, -16
dw 0, 0, -16, -16
dw 0
.chr
db $02, $04, $0E, $0E
db $2C, $2E, $02, $04, $0E, $0E
db $2C, $2E, $02, $04, $0E, $0E
db $2C, $2E, $02, $04, $0E, $0E
db $2C, $2E, $02, $04, $0E, $0E
db $2C, $2E, $02, $04
db $2C, $2E, $02, $04
db $2C, $2E, $02, $04
db $02, $04, $24, $26
db $20, $22, $02, $08
db $20, $22, $00, $00
db $28, $2A, $00, $00
db $2C, $2E, $00, $00
db $2C, $2E, $00, $00
db $24, $26, $00, $00
db $0E
.properties
db $37, $37, $37, $37
db $37, $37, $37, $37, $37, $37
db $37, $37, $37, $37, $37, $37
db $37, $37, $37, $37, $37, $37
db $37, $37, $37, $37, $37, $37
db $37, $37, $37, $37
db $37, $37, $37, $37
db $37, $37, $37, $37
db $37, $37, $37, $37
db $37, $37, $37, $37
db $37, $37, $37, $77
db $37, $37, $37, $77
db $37, $37, $37, $77
db $37, $37, $37, $77
db $37, $37, $37, $77
db $37
.sizes
db $02, $02, $02, $02
db $02, $02, $02, $02, $02, $02
db $02, $02, $02, $02, $02, $02
db $02, $02, $02, $02, $02, $02
db $02, $02, $02, $02, $02, $02
db $02, $02, $02, $02
db $02, $02, $02, $02
db $02, $02, $02, $02
db $02, $02, $02, $02
db $02, $02, $02, $02
db $02, $02, $02, $02
db $02, $02, $02, $02
db $02, $02, $02, $02
db $02, $02, $02, $02
db $02, $02, $02, $02
db $02
}
; =========================================================
; Sprite Draw code
; Draw the tiles on screen with the data provided by the sprite maker editor
; =========================================================
Sprite_Octoboss_Draw2:
{
JSL Sprite_PrepOamCoord
JSL Sprite_OAM_AllocateDeferToPlayer
LDA $0DC0, X : CLC : ADC $0D90, X : TAY;Animation Frame
LDA .start_index, Y : STA $06
PHX
LDX .nbr_of_tiles, Y ;amount of tiles -1
LDY.b #$00
.nextTile
PHX ; Save current Tile Index?
TXA : CLC : ADC $06 ; Add Animation Index Offset
PHA ; Keep the value with animation index offset?
ASL A : TAX
REP #$20
LDA $00 : CLC : ADC .x_offsets, X : STA ($90), Y
AND.w #$0100 : STA $0E
INY
LDA $02 : CLC : ADC .y_offsets, X : STA ($90), Y
CLC : ADC #$0010 : CMP.w #$0100
SEP #$20
BCC .on_screen_y
LDA.b #$F0 : STA ($90), Y ;Put the sprite out of the way
STA $0E
.on_screen_y
PLX ; Pullback Animation Index Offset (without the *2 not 16bit anymore)
INY
LDA .chr, X : STA ($90), Y
INY
LDA.b $05 : ORA.w .properties, X : STA ($90), Y
PHY
TYA : LSR #2 : TAY
LDA .sizes, X : ORA $0F : STA ($92), Y ; store size in oam buffer
PLY : INY
PLX : DEX : BPL .nextTile
PLX
RTS
; =========================================================
; Sprite Draw Generated Data
; This is where the generated Data for the sprite go
; =========================================================
.start_index
db $00, $04, $0A, $10, $16, $1C, $20, $24, $28, $2C, $30, $34, $38, $3C, $40, $44
.nbr_of_tiles
db 3, 5, 5, 5, 5, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0
.x_offsets
dw -8, 8, -8, 8
dw -8, 8, -8, 8, -8, 8
dw 8, -8, -8, 8, -8, 8
dw 8, -8, -8, 8, -8, 8
dw 8, -8, -8, 8, -8, 8
dw 8, -8, -8, 8
dw 8, -8, -8, 8
dw 8, -8, -8, 8
dw -8, 8, 8, -8
dw 8, -8, -8, 8
dw 8, -8, -8, 8
dw 8, -8, -8, 8
dw 8, -8, -8, 8
dw 8, -8, -8, 8
dw 8, -8, -8, 8
dw 0
.y_offsets
dw 6, 6, 16, 16
dw 16, 16, 0, 0, 16, 16
dw 12, 12, -4, -4, 16, 16
dw 8, 8, -8, -8, 16, 16
dw 4, 4, -12, -12, 16, 16
dw 0, 0, -16, -16
dw -2, -2, -18, -18
dw 0, 0, -16, -16
dw -16, -16, 0, 0
dw 0, 0, -16, -16
dw 0, 0, -16, -16
dw 0, 0, -16, -16
dw 0, 0, -16, -16
dw 0, 0, -16, -16
dw 0, 0, -16, -16
dw 0
.chr
db $02, $04, $0E, $0E
db $2C, $2E, $02, $04, $0E, $0E
db $2C, $2E, $02, $04, $0E, $0E
db $2C, $2E, $02, $04, $0E, $0E
db $2C, $2E, $02, $04, $0E, $0E
db $2C, $2E, $02, $04
db $2C, $2E, $02, $04
db $2C, $2E, $02, $04
db $02, $04, $24, $26
db $20, $22, $02, $08
db $20, $22, $00, $00
db $28, $2A, $00, $00
db $2C, $2E, $00, $00
db $2C, $2E, $00, $00
db $24, $26, $00, $00
db $0E
.properties
db $39, $39, $39, $39
db $39, $39, $39, $39, $39, $39
db $79, $79, $39, $39, $39, $39
db $79, $79, $39, $39, $39, $39
db $79, $79, $39, $39, $39, $39
db $79, $79, $39, $39
db $79, $79, $39, $39
db $79, $79, $39, $39
db $39, $39, $79, $79
db $79, $79, $39, $39
db $79, $79, $39, $79
db $79, $79, $39, $79
db $79, $79, $39, $79
db $79, $79, $39, $79
db $79, $79, $39, $79
db $39
.sizes
db $02, $02, $02, $02
db $02, $02, $02, $02, $02, $02
db $02, $02, $02, $02, $02, $02
db $02, $02, $02, $02, $02, $02
db $02, $02, $02, $02, $02, $02
db $02, $02, $02, $02
db $02, $02, $02, $02
db $02, $02, $02, $02
db $02, $02, $02, $02
db $02, $02, $02, $02
db $02, $02, $02, $02
db $02, $02, $02, $02
db $02, $02, $02, $02
db $02, $02, $02, $02
db $02, $02, $02, $02
db $02
}
SpawnSplash:
LDA.b #$EC ; SPRITE EC
JSL Sprite_SpawnDynamically
BMI .exit
JSL Sprite_SetSpawnedCoords
LDA.b #$03
STA.w $0DD0,Y
LDA.b #$0F
STA.w $0DF0,Y
LDA.b #$00
STA.w $0D80,Y
LDA.b #$03
STA.w $0E40,Y
LDA.b #$28 ; SFX2.28
JSL Sound_SetSfx2PanLong
.exit
RTS
SpawnBossPoof:
LDA.b #$0C ; SFX2.0C
STA.w $012E
LDA.b #$CE ; SPRITE CE
JSL Sprite_SpawnDynamically
LDA.b $00
CLC
ADC.b #$10
STA.w $0D10,Y
LDA.b $01
ADC.b #$00
STA.w $0D30,Y
LDA.b $02
CLC
ADC.b #$08
STA.w $0D00,Y
LDA.b $03
ADC.b #$00
STA.w $0D20,Y
LDA.b #$0F
STA.w $0DC0,Y
LDA.b #$01
STA.w $0D90,Y
LDA.b #$2F
STA.w $0DF0,Y
LDA.b #$09
STA.w $0E40,Y
STA.w $0BA0,Y
RTS
HandleMovingSplash:
LDA.b $1A
AND.b #$0F
BNE .exit
LDA.b #$28 ; SFX2.28
JSL Sound_SetSfx2PanLong
PHX
TXY
LDX.b #$1D
LDA.w $0D40,Y
BMI .next_slot
LDX.b #$0E
.next_slot
LDA.l $7FF800,X
BNE .slot_occupied
LDA.b #$15 ; GARNISH 15
STA.l $7FF800,X
STA.w $0FB4
LDA.w $0D10,Y
STA.l $7FF83C,X
LDA.w $0D30,Y
STA.l $7FF878,X
LDA.w $0D00,Y
CLC
ADC.b #$18
STA.l $7FF81E,X
LDA.w $0D20,Y
STA.l $7FF85A,X
LDA.b #$0F
STA.l $7FF90E,X
PLX
RTS
; ---------------------------------------------------------
.slot_occupied
DEX
BPL .next_slot
PLX
.exit
RTS
SpawnMedallion:
LDA.b #$C0 ; SPRITE C0
JSL Sprite_SpawnDynamically
BMI .exit
JSL $09AE64 ; Sprite_SetSpawnedCoordinates
PHX
TYX
LDA.b #$10
STA.w $0D50, X
LDA.b #$30
STA.w $0F80, X
LDA.b #$11 ; ITEMGET 11
STA.w $0D90, X
LDA.b #$20 ; SFX2.20
JSL $0DBB7C ; SpriteSFX_QueueSFX2WithPan
LDA.b #$83
STA.w $0E40,X
LDA.b #$58
STA.w $0E60,X
AND.b #$0F
STA.w $0F50,X
PLX
PHX
PHY
LDA.b #$1C
JSL $00D4ED ; WriteTo4BPPBuffer_item_gfx
PLY
PLX
.exit
RTS
SpawnMedallionAlt:
LDA.b #$C0 ; SPRITE C0
JSL Sprite_SpawnDynamically
BMI .exit
PHX
TYX
LDA.b #$11 ; ITEMGET 11
STA.w $0D90, X
LDA.b #$83
STA.w $0E40,X
LDA.b #$58
STA.w $0E60,X
AND.b #$0F
STA.w $0F50,X
LDA.b #$DC : STA.w SprY, X
LDA.b #$F7 : STA.w SprX, X
LDA.b #$08 : STA.w SprYH, X : STA.w SprXH, X
PLX
PHX
PHY
LDA.b #$1C
JSL $00D4ED ; WriteTo4BPPBuffer_item_gfx
PLY
PLX
.exit
RTS