This is Undine from Secret of Mana as a boss for Super Mario World.
She flies around the room and periodically summons frostblocks which try to hurt Mario or three icicles which try to impale Mario from below.
Additionally, a tidal wave is present which tries to push Mario around to pull him down into the water.
When the frostblocks hit the tidal wave, they become carryable and can be thrown at Undine to hurt her. The wave becomes faster each time it gets hit by a frostblock.
Make sure to read the readme before using the sprite, as setting it up can be complicated.
Converted to PIXI and added SA-1 compatibility. Added more screenshots and tags.
The palette has been included separately from the example arena.
A lot of the sprite's components have been optimized. The wave speed glitch mentioned by GreenHammerBro looks rather intentional and I couldn't get it to overflow. The first graphical glitch still exists because I couldn't quite figure out exactly what causes it.
If you were to kick the ice block back to undine while she is preparing or launching the ice pillars, her sprite becomes garbled: link
Please ignore the missing scenery, I accidentally disable layer 1.
Another bug is the spawning ice block glitch, if you freeze ($9D) during the first frame the ice block appears (orb-like appearence), it will also garble: link
-palette and palmask not existent, you have to extract from the lvl file.
-the wave sprite gets faster every time it is hit by the ice sprite rather than the number of times the boss is hit, not sure if this counts as a bug, but in case if the user wanted it to only move faster based on how much HP left it has.
--Speaking of that "glitch", if you keep doing that without hurting the boss (by constantly throwing the ice block away intentionally), it will eventually causes an overflow bug:
---If fast enough, can push the player towards the edge of the screen and kill the player.
---Always pushes the player to the left, regardless on which side the player is on.
---If even further, the rightwards speed value overflows to a very low negative number, causing it to go left when facing rightwards towards the player. If it goes past the left edge of the screen with this x speed bug of the sprite, it will not be there permanently.
Note that $1504,x's bits 4-7 are the enemy's HP ([HHHHSSSS] where H is health, while S is state). Therefore, to get the amount of HP you want, simply input a value between 1 and 15, then leftshift 4 times (or multiply by 16), and that will be its HP.
In asm terms to get it work with my health bar, simply right shift 4 times (LSR #4) and use that value.
Here is the code to make it work with my enemy HP meter:
;Main, runs every frame (after the first PHB : PHK : PLB)
TXA ;>Don't worry, this copies X, not just transfer
CMP !Freeram_SprHPCurrSlot ;>Compare with the slot the HP bar is using
BEQ ..ItsOnThisSprite ;>If HP bar is on this current sprite, don't delete record
JSL !SubrAddr_GetHPPercent ;>Get current percent HP
LDA $00 ;\Remove Record effect (make them the same)
STA !Freeram_SprTbl_RecordEfft,x ;/
;Damage, CTRL+F "Play sound effect" and under the SFX, add this:
Moderator's note: To be perfectly honest I am not that big a fan of this boss because of how annoying it is to fight it. Still, it is well-programmed and easy to use. The readme should be clear enough in that regard but I'll put it here as well; you need No More Sprite Tile Limits for this boss to be displayed properly.