Give each stage its own role
Pick a clear warning, a travel cue when the spell moves, and a resolution that shows its target. These stages can share a color family while differing in scale and silhouette. Let gameplay determine when damage or healing happens; the final frame of a cast animation is not an automatic event contract.
Keep conditions separate from impacts
A frozen or cursed condition can remain after the original hit has vanished. Use a restrained ongoing cue rather than replaying the full attack burst indefinitely. Match each source’s loop metadata to the role you intend, and test interruption when an ability is cancelled or a target disappears.
Give each casting phase a different job
Spell-charge and magic-circle-cast establish anticipation. Rune-circle can remain under the caster, while mana-burst provides a short release. Portal and arcane-orb suit persistent magical objects. Arcane-missiles and arcane-beam cover moving or directed attacks when the spell needs a visible destination.
Choose examples by animation purpose as well as color. A looping rune should remain readable behind a character, while a bright beam may need a short screen time. Keep charge, release and aftermath distinct enough that the player can recognize an interruptible cast.
Assemble one casting sequence
Export spell-charge and mana-burst with their native timing. Play the charge at the character origin, trigger the burst on the release event, and test both over the same floor tile. Use the provided JSON frame count to exclude empty atlas cells.
For another spell school, apply one palette to a small Pro batch in Sprite Maker. Keep each effect at its native FPS, compare the silhouettes, and adjust engine playback timing if your gameplay animation needs a different anticipation length.