From b7543f771e2e92d807ec60ca747e939f6808d031 Mon Sep 17 00:00:00 2001 From: scawful Date: Sat, 9 Mar 2024 08:46:16 -0500 Subject: [PATCH] Add Octoboss by Zarby89 --- Sprites/Bosses/octoboss.asm | 1124 +++++++++++++++++++++++++++++++++++ Sprites/all_sprites.asm | 3 + 2 files changed, 1127 insertions(+) create mode 100644 Sprites/Bosses/octoboss.asm diff --git a/Sprites/Bosses/octoboss.asm b/Sprites/Bosses/octoboss.asm new file mode 100644 index 0000000..69f237d --- /dev/null +++ b/Sprites/Bosses/octoboss.asm @@ -0,0 +1,1124 @@ +; ========================================================= +; Octoboss by Zarby89 + +; Replaces Sprite 0x3C KidInKak +org $06C04E +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 \ No newline at end of file diff --git a/Sprites/all_sprites.asm b/Sprites/all_sprites.asm index 7dded0e..3531001 100644 --- a/Sprites/all_sprites.asm +++ b/Sprites/all_sprites.asm @@ -107,6 +107,9 @@ print "End of Lanmola.asm ", pc incsrc "Sprites/Bosses/lanmola_Expanded.asm" print "End of Lanmola_Expanded.asm ", pc +incsrc "Sprites/Bosses/octoboss.asm" +print "End of octoboss.asm ", pc + incsrc "Sprites/NPCs/bug_net_kid.asm" warnpc $328000 \ No newline at end of file