Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2.0 KiB
Sprite assets
Art: Kenney's 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
*.pngfilenames work — they're played back in alphabetical-sort order, looping, atIDLE_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_framesinsprite.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:
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.