Files
oracle-of-secrets/Sprites/Bosses/octoboss.asm
2025-01-06 17:52:35 -05:00

945 lines
22 KiB
NASM

; =========================================================
; Octoboss by Zarby89
pushpc
; Sprite_A2_Kholdstare
org $1E9518
JSL Sprite_Octoboss_Long
RTS
pullpc
BrotherSpr = $0EB0
Sprite_Octoboss_Long:
{
PHB : PHK : PLB
LDA.w SprMiscD, X : BNE + ; is the sprite already init
LDA #$04 : STA.w SprNbrOAM, X
;LDA.w SprHitbox, X : AND.b #$E0 : ORA.b #$23 : STA.w SprHitbox, X
;LDA.w SprDefl, X : AND #$7F : ORA.b #$81 : STA.w SprDefl, X
;LDA.b #$20 : STA.w SprHealth, X
STZ.w SprBulletproof, 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 SprState, X
JSR SpawnMedallionAlt ; spawn standing medallion
BRA .SpriteIsNotActive
.weHaveMedallion
; Do nothing just kill this sprite
STZ.w SprState, X
BRA .SpriteIsNotActive
.notKiledYet
PLX
;LDA.w SprGfxProps, X : AND.b #$BF : STA.w SprGfxProps, X
;LDA.w SprProps, X : AND.b #$BF : STA.w SprProps, 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
BRA ++
+
JSR Sprite_Octoboss_Draw2
++
JSL Sprite_CheckActive : BCC .SpriteIsNotActive
LDA.w SprMiscF, X : BNE +
JSR Sprite_Octoboss_Main
BRA .SpriteIsNotActive
+
JSR Sprite_Octoboss_Secondary
.SpriteIsNotActive
PLB
RTL
}
Sprite_Octoboss_Main:
{
LDA.w SprAction, X
JSL UseImplicitRegIndexedLocalJumpTable
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
JSL UseImplicitRegIndexedLocalJumpTable
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
}
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:
{
%ShowUnconditionalMessage($0048)
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.w 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
%mode16()
%GetTilePos($0F, $07)
LDA.w #$068F : JSL Overworld_DrawMap16_Persist
%GetTilePos($10, $07)
LDA.w #$068F : JSL Overworld_DrawMap16_Persist
%GetTilePos($11, $07)
LDA.w #$068F : JSL Overworld_DrawMap16_Persist
%GetTilePos($0F, $08)
LDA.w #$06A4 : JSL Overworld_DrawMap16_Persist
%GetTilePos($10, $08)
LDA.w #$06A4 : JSL Overworld_DrawMap16_Persist
%GetTilePos($11, $08)
LDA.w #$06A4 : JSL Overworld_DrawMap16_Persist
%mode8()
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 : 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 : 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
%SetTimerC($50) ; set timer to remove hat, surrender
%ShowUnconditionalMessage($004A)
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
%mode16()
%GetTilePos($0F, $07)
LDA.w #$0034 : JSL Overworld_DrawMap16_Persist
%GetTilePos($10, $07)
LDA.w #$0034 : JSL Overworld_DrawMap16_Persist
%GetTilePos($11, $07)
LDA.w #$0034 : JSL Overworld_DrawMap16_Persist
%GetTilePos($0F, $08)
LDA.w #$0034 : JSL Overworld_DrawMap16_Persist
%GetTilePos($10, $08)
LDA.w #$0034 : JSL Overworld_DrawMap16_Persist
%GetTilePos($11, $08)
LDA.w #$0034 : JSL Overworld_DrawMap16_Persist
%mode8()
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 SprState, 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_Octoboss_Draw:
{
JSL Sprite_PrepOamCoord
JSL Sprite_OAM_AllocateDeferToPlayer
LDA $0DC0, X : CLC : ADC SprFrame, 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_Octoboss_Draw2:
{
JSL Sprite_PrepOamCoord
JSL Sprite_OAM_AllocateDeferToPlayer
LDA $0DC0, X : CLC : ADC SprFrame, 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
; =========================================================
.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 SprState, Y
LDA.b #$0F : STA.w SprTimerA, Y
LDA.b #$00 : STA.w $0D80, Y
LDA.b #$03 : STA.w SprNbrOAM,Y
LDA.b #$28 : JSL Sound_SetSfx2PanLong
.exit
RTS
}
SpawnBossPoof:
{
LDA.b #$0C
STA.w $012E
LDA.b #$CE
JSL Sprite_SpawnDynamically
LDA.b $00 : CLC : ADC.b #$10 : STA.w SprX,Y
LDA.b $01 : ADC.b #$00 : STA.w SprXH,Y
LDA.b $02 : CLC : ADC.b #$08 : STA.w SprY,Y
LDA.b $03 : ADC.b #$00 : STA.w SprYH,Y
LDA.b #$0F : STA.w $0DC0,Y
LDA.b #$01 : STA.w SprFrame,Y
LDA.b #$2F : STA.w SprTimerA,Y
LDA.b #$09
STA.w SprNbrOAM,Y
STA.w SprBulletproof,Y
RTS
}
HandleMovingSplash:
{
LDA.b $1A : AND.b #$0F : BNE .exit
LDA.b #$28 : JSL Sound_SetSfx2PanLong
PHX
TXY
LDX.b #$1D
LDA.w SprYSpeed, 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 SprX,Y : STA.l $7FF83C,X
LDA.w SprXH,Y : STA.l $7FF878,X
CLC : ADC.b #$18 : STA.l $7FF81E,X
LDA.w SprYH,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 SprXSpeed, X
LDA.b #$30 : STA.w $0F80, X
LDA.b #$11 : STA.w SprFrame, X ; ITEMGET 11
LDA.b #$20 ; SFX2.20
JSL $0DBB7C ; SpriteSFX_QueueSFX2WithPan
LDA.b #$83 : STA.w SprNbrOAM,X
LDA.b #$58 : STA.w SprGfxProps,X
AND.b #$0F : STA.w SprProps,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 SprFrame, X
LDA.b #$83 : STA.w SprNbrOAM,X
LDA.b #$58 : STA.w SprGfxProps,X
AND.b #$0F : STA.w SprProps,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
}