diff --git a/Sprites/Objects/deku_leaf.asm b/Sprites/Objects/deku_leaf.asm index 72e011e..644eda9 100644 --- a/Sprites/Objects/deku_leaf.asm +++ b/Sprites/Objects/deku_leaf.asm @@ -38,7 +38,12 @@ Sprite_DekuLeaf_Long: { PHB : PHK : PLB - JSR Sprite_DekuLeaf_Draw ; Call the draw code + LDA $8A : CMP.b #$3D : BEQ .whirlpool + JSR Sprite_DekuLeaf_Draw ; Call the draw code + JMP + + .whirlpool + JSR Sprite_Whirlpool_Draw + + JSL Sprite_CheckActive ; Check if game is not paused BCC .SpriteIsNotActive ; Skip Main code is sprite is innactive @@ -54,7 +59,10 @@ Sprite_DekuLeaf_Long: Sprite_DekuLeaf_Prep: { PHB : PHK : PLB - + + LDA $8A : CMP.b #$3D : BNE .not_whirlpool + LDA.b #$01 : STA.w SprAction, X + .not_whirlpool PLB RTL @@ -69,6 +77,8 @@ Sprite_DekuLeaf_Main: dw WaitForPlayer + dw Whirlpool_Main + WaitForPlayer: { %StartOnFrame(0) @@ -82,6 +92,66 @@ Sprite_DekuLeaf_Main: RTS } + + Whirlpool_Main: + { + %PlayAnimation(0, 2, 10) + JSR CheckIfPlayerIsOn : BCC .not_on + + LDA $0AAB : BEQ .not_on + + STZ $55 ; Reset cape flag + STZ $0AAB ; Reset underwater flag + STZ $0351 ; Reset ripple flag + STZ $037B ; Reset invincibility flag + STZ $02B2 + + LDA.b $10 + CMP.b #$0B + BEQ .exit + + LDA.b $8A + AND.b #$40 + STA.b $7B + + BEQ .no_mirror_portal + + LDA.b $20 + STA.w $1ADF + + LDA.b $21 + STA.w $1AEF + + LDA.b $22 + STA.w $1ABF + + LDA.b $23 + STA.w $1ACF + + .no_mirror_portal + LDA.b #$23 + + #SetGameModeLikeMirror: + STA.b $11 + + STZ.w $03F8 + + LDA.b #$01 + STA.w $02DB + + STZ.b $B0 + + STZ.b $27 + STZ.b $28 + + LDA.b #$14 ; LINKSTATE 14 + STA.b $5D + + .not_on + .exit + RTS + } + } ; ========================================================= @@ -159,4 +229,84 @@ Sprite_DekuLeaf_Draw: db $A0, $A2, $82, $80 .properties db $23, $23, $23, $23 +} + + +Sprite_Whirlpool_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 .properties, X : STA ($90), Y + + PHY + + TYA : LSR #2 : TAY + + LDA.b #$02 : ORA $0F : STA ($92), Y ; store size in oam buffer + + PLY : INY + + PLX : DEX : BPL .nextTile + + PLX + + RTS + + + + .start_index + db $00, $04, $08 + .nbr_of_tiles + db 3, 3, 3 + .x_offsets + dw -8, 8, -8, 8 + dw 8, -8, 8, -8 + dw -8, 8, -8, 8 + .y_offsets + dw -8, -8, 8, 8 + dw -8, -8, 8, 8 + dw 8, 8, -8, -8 + .chr + db $C4, $C6, $E4, $E6 + db $C4, $C6, $E4, $E6 + db $C4, $C6, $E4, $E6 + .properties + db $29, $29, $29, $29 + db $69, $69, $69, $69 + db $A9, $A9, $A9, $A9 } \ No newline at end of file diff --git a/Sprites/Objects/whirlpool.asm b/Sprites/Objects/whirlpool.asm deleted file mode 100644 index 1c5e8d0..0000000 --- a/Sprites/Objects/whirlpool.asm +++ /dev/null @@ -1,217 +0,0 @@ -; ========================================================= -; Sprite Properties -; ========================================================= - -!SPRID = Sprite_Whirlpool -!NbrTiles = 04 ; Number of tiles used in a frame -!Harmless = 01 ; 00 = Sprite is Harmful, 01 = Sprite is Harmless -!HVelocity = 00 ; Is your sprite going super fast? put 01 if it is -!Health = 00 ; Number of Health the sprite have -!Damage = 00 ; (08 is a whole heart), 04 is half heart -!DeathAnimation = 00 ; 00 = normal death, 01 = no death animation -!ImperviousAll = 00 ; 00 = Can be attack, 01 = attack will clink on it -!SmallShadow = 00 ; 01 = small shadow, 00 = no shadow -!Shadow = 00 ; 00 = don't draw shadow, 01 = draw a shadow -!Palette = 00 ; Unused in this template (can be 0 to 7) -!Hitbox = 00 ; 00 to 31, can be viewed in sprite draw tool -!Persist = 00 ; 01 = your sprite continue to live offscreen -!Statis = 00 ; 00 = is sprite is alive?, (kill all enemies room) -!CollisionLayer = 00 ; 01 = will check both layer for collision -!CanFall = 00 ; 01 sprite can fall in hole, 01 = can't fall -!DeflectArrow = 00 ; 01 = deflect arrows -!WaterSprite = 00 ; 01 = can only walk shallow water -!Blockable = 00 ; 01 = can be blocked by link's shield? -!Prize = 00 ; 00-15 = the prize pack the sprite will drop from -!Sound = 00 ; 01 = Play different sound when taking damage -!Interaction = 00 ; ?? No documentation -!Statue = 00 ; 01 = Sprite is statue -!DeflectProjectiles = 00 ; 01 = Sprite will deflect ALL projectiles -!ImperviousArrow = 00 ; 01 = Impervious to arrows -!ImpervSwordHammer = 00 ; 01 = Impervious to sword and hammer attacks -!Boss = 00 ; 00 = normal sprite, 01 = sprite is a boss - -%Set_Sprite_Properties(Sprite_Whirlpool_Prep, Sprite_Whirlpool_Long) - -; ========================================================= - -pushpc - -org $00D8F9 - db $66 - -pullpc - -Sprite_Whirlpool_Long: -{ - PHB : PHK : PLB - - JSR Sprite_Whirlpool_Draw ; Call the draw code - JSL Sprite_CheckActive ; Check if game is not paused - BCC .SpriteIsNotActive ; Skip Main code is sprite is innactive - - JSR Sprite_Whirlpool_Main ; Call the main sprite code - - .SpriteIsNotActive - PLB ; Get back the databank we stored previously - RTL ; Go back to original code -} - -; ========================================================= - -Sprite_Whirlpool_Prep: -{ - PHB : PHK : PLB - - - PLB - RTL -} -; ========================================================= - -Sprite_Whirlpool_Main: -{ - LDA.w SprAction, X - JSL UseImplicitRegIndexedLocalJumpTable - dw Whirlpool_Main - - - Whirlpool_Main: - { - %PlayAnimation(0, 2, 10) - JSR CheckIfPlayerIsOn : BCC .not_on - - LDA $0AAB : BEQ .not_on - - STZ $55 ; Reset cape flag - STZ $0AAB ; Reset underwater flag - STZ $0351 ; Reset ripple flag - STZ $037B ; Reset invincibility flag - STZ $02B2 - - LDA.b $10 - CMP.b #$0B - BEQ .exit - - LDA.b $8A - AND.b #$40 - STA.b $7B - - BEQ .no_mirror_portal - - LDA.b $20 - STA.w $1ADF - - LDA.b $21 - STA.w $1AEF - - LDA.b $22 - STA.w $1ABF - - LDA.b $23 - STA.w $1ACF - - .no_mirror_portal - LDA.b #$23 - - #SetGameModeLikeMirror: - STA.b $11 - - STZ.w $03F8 - - LDA.b #$01 - STA.w $02DB - - STZ.b $B0 - - STZ.b $27 - STZ.b $28 - - LDA.b #$14 ; LINKSTATE 14 - STA.b $5D - - .not_on - .exit - RTS - } -} - -; ========================================================= - -Sprite_Whirlpool_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 .properties, X : STA ($90), Y - - PHY - - TYA : LSR #2 : TAY - - LDA.b #$02 : ORA $0F : STA ($92), Y ; store size in oam buffer - - PLY : INY - - PLX : DEX : BPL .nextTile - - PLX - - RTS - - - - .start_index - db $00, $04, $08 - .nbr_of_tiles - db 3, 3, 3 - .x_offsets - dw -8, 8, -8, 8 - dw 8, -8, 8, -8 - dw -8, 8, -8, 8 - .y_offsets - dw -8, -8, 8, 8 - dw -8, -8, 8, 8 - dw 8, 8, -8, -8 - .chr - db $C4, $C6, $E4, $E6 - db $C4, $C6, $E4, $E6 - db $C4, $C6, $E4, $E6 - .properties - db $29, $29, $29, $29 - db $69, $69, $69, $69 - db $A9, $A9, $A9, $A9 -} \ No newline at end of file diff --git a/Sprites/all_sprites.asm b/Sprites/all_sprites.asm index 57b7fa6..8132c53 100644 --- a/Sprites/all_sprites.asm +++ b/Sprites/all_sprites.asm @@ -169,6 +169,7 @@ Sprite_Puffstool = $B1 incsrc "Sprites/Enemies/puffstool.asm" print "End of puffstool.asm ", pc +; Also beach whirlpool Sprite_DekuLeaf = $77 incsrc "Sprites/Objects/deku_leaf.asm" print "End of deku_leaf.asm ", pc @@ -201,10 +202,6 @@ Sprite_IceBlock = $D5 incsrc "Sprites/Objects/ice_block.asm" print "End of ice_block.asm ", pc -Sprite_Whirlpool = $52 -incsrc "Sprites/Objects/whirlpool.asm" -print "End of whirlpool.asm ", pc - ; ========================================================= incsrc "Sprites/NPCs/ranch_girl.asm"