sprite-fps

Enforces 24fps sprite animation timing using SPRITE_TICK constants in game code.

2|1|Updated Jun 28, 2026
One-click install
npx skills add https://github.com/lxsmnsyc/overwander --skill sprite-fps-lxsmnsyc
Or copy as Structured Prompt for Agent▼
Please help me install this Agent Skill.
Skill: sprite-fps
Source: https://github.com/lxsmnsyc/overwander/tree/main/.agents/skills/sprite-fps
Command: npx skills add https://github.com/lxsmnsyc/overwander --skill sprite-fps-lxsmnsyc

SYSTEM DOCUMENTATION & REQUIREMENTS

What problem does it solve? It prevents hardcoded frame-time literals and mismatched animation speeds when writing or reviewing sprite animation code, ensuring every sprite sheet in the game animates at a consistent 24fps. ## Core Features & Use Cases - Tick-based timing: All durations are expressed as SPRITE_TICK * frames (where SPRITE_TICK = 1000 / SPRITE_FPS in src/canvas/sprite-sheet.ts), never as magic numbers like 16.67 or 1000 / 60. - Playback rules: Clips play at their drawn speed by default; only caster throws are stretched to fit a move window, effects are never stretched, and looping clips repeat rather than slow down. - Scope separation: Distinguishes the 24fps sprite tick from the 60fps battle engine clock so cast windows, cooldowns, and move delays are never conflated with animation timing. - Use Case: When writing a test for a pokemon sheet animation, assert against sprite.length * SPRITE_TICK instead of a hand-computed millisecond figure, so the test stays correct if the frame rate changes. ## Quick Start Ask the assistant to review or write sprite animation code following the sprite-fps rules so all frame durations use SPRITE_TICK instead of hardcoded millisecond values.

Frequently Asked Questions about sprite-fps

High-intent search queries and answers about installing and using this skill.

FAQPage Schema
How do I convert sprite frame counts to milliseconds?▼

Multiply the frame count by SPRITE_TICK, which equals 1000 / SPRITE_FPS (24fps, about 41.67ms per tick). Never write a literal like 16.67 or a hand-computed millisecond figure, since it breaks when the rate changes.

What frame rate do game sprite sheets animate at?▼

All sprite sheets in this project animate at 24fps, including pokemon sheets, effect and particle atlases, and overworld characters. Durations are counted in ticks of SPRITE_TICK defined in src/canvas/sprite-sheet.ts.

Is the sprite animation tick the same as the battle engine clock?▼

No. The battle engine ticks at 60fps and governs cast windows, cooldowns, and move delays, while the sprite tick runs at 24fps and only controls how drawn frames play. The two timings are unrelated and must not be mixed.

When should a sprite animation be stretched to fit a time window?▼

Only when something must line up, such as a caster's throw fitted to the window its move is in the air. Effects like sparks and shockwaves are never stretched, and looping clips repeat via isLoopingCast rather than slowing down.

How should animation tests assert sprite durations?▼

Assert against SPRITE_TICK or the clip's own length and duration properties, for example expect(sprite.duration).toBeCloseTo(sprite.length * SPRITE_TICK). Avoid hardcoded millisecond expectations that break when the frame rate changes.