# Sprite assets Art: [Kenney's Robot Pack](https://kenney.nl/assets/robot-pack) (CC0 — no attribution required, credited here anyway), the green side-view robot. Source pack lives at `~/Documents/kenney_robot-pack`; only the frames listed below were copied in. Convention the loader (`bolt_pet/ui/sprite.py`) expects: ``` assets/sprites/ idle/ frame_00.png robot_greenBody (standing) listening/ frame_00.png, frame_01.png robot_greenDrive1/2 (tracks rolling — "leaning in") thinking/ frame_00.png, frame_01.png robot_greenDamage1/2 (flicker — "processing") talking/ frame_00.png, frame_01.png robot_greenBody, robot_greenJump (bounce) error/ frame_00.png robot_greenHurt ``` - One subfolder per pet state (matches `bolt_pet.state.PetState`). - Any `*.png` filenames work — they're played back in alphabetical-sort order, looping, at `IDLE_ANIMATION_FPS` (see `.env`). - Frames are scaled to fit within `PET_SIZE` (default 160px), keeping aspect ratio, and centered in the (square) pet window — the source art here isn't square, so don't assume it fills the frame edge-to-edge. - A state directory with no frames in it falls back to a small procedurally-drawn placeholder blob (see `_placeholder_frames` in `sprite.py`). ## Swapping in different art Replace any state's PNGs (same alphabetical-order-loops convention) to change its look — no code changes needed. If your source is a single grid spritesheet (rows/cols of frames in one PNG) rather than one-file-per-frame, use `scripts/slice_spritesheet.py` to cut it into this folder-of-frames convention: ```bash python scripts/slice_spritesheet.py path/to/idle_sheet.png assets/sprites/idle \ --cols 6 --rows 1 ``` If your format is something else entirely (a single animated GIF/APNG, a Spine/DragonBones skeletal export, an Aseprite `.json` atlas, etc.) — tell me the format and I'll adapt `sprite.py`'s loader rather than making you convert by hand.