Walk, die and attack animations for all creatures (sheets, prompts and scripts)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Richard ZinkandClaude Opus 5.5 committed 2026-11-08 01:00:31 +01:00
1 parent 8c5afe872f
commit 48c20fabbc
405 files changed
+1332 -32

No files matched your search

+162 -4
View File
@@ -1,4 +1,4 @@
# Creature animations (pilot: knight, kobold)
# Creature animations
Generated on 2026-11-07 with `fal-ai/nano-banana-pro/edit` (`resolution: 2K`, `num_images: 1`,
`output_format: png`), following the imp's digging animation (`../../imp-sprite/PROMPTS.md`).
@@ -146,6 +146,164 @@ No extra colours were needed: the steel of both weapons is in the idle palettes.
## Raw files
The raws `*-raw*.png` are large and not covered by `.gitignore` (which only ignores
`art/generated/sprites/*-raw*.png`); add `art/generated/sprites/anim/*-raw*.png` before
committing.
The raws `*-raw*.png` are large and git-ignored (`art/generated/sprites/anim/*-raw*.png`).
# Batch: walk for all, die for all, attack for six (2026-11-07/08)
After the pilot: `walk` for the other 29 creatures (incl. the imp), `die` for all 31, `attack`
for ogre, spider, mage, archer, dwarf and paladin. `manifest.json` lists the accepted
animations per creature (`{"id", "kind", "anims"}`), `progress.json` the image count and the
status and notes per sheet. `sheet-notes.txt` is the review list (input of `anim_manifest.py`), `pix-commands.sh` holds every pix command that was run (the last
one per sheet is the accepted one). Requests: **79 images, about $11.85** (+ the pilot's 11).
Three requests failed with "connection reset"; the image counter counts only delivered
images, so if fal billed those, add up to $0.45. No sheet was skipped.
## Script changes (`../scripts/make_anim.py`)
- `die` as a third animation; `gen`/`pix` accept `imp` (raw = the lower row of
`../../imp-sprite/raw-1.png`, crop `0,0.27,1,0.72`; idle = `../../imp-sprite/imp-<size>.png`;
description in `BY_ID["imp"]`, kind `Worker`).
- Wording per creature type (`kind_of`: `HOVER`, `SIEGE` from `creatures.py`, `QUAD` = spider,
cave bear, beetle, else biped): walk = `WALK_FRONT` (biped), `QUAD_FRAMES[id]` (own gait),
`HOVER_FRAMES` (hovering wing flap; the first, softer wording was used only for the bat),
`SIEGE_FRAMES` (rolling, wheels turning); die = `DIE[type]` (see below).
- `WEAPON` entries for every creature with an item (so the walk keeps it), `ATTACK` for the six.
- **die pixelization**: the step is set by frame 1 only (still standing, so its core height =
idle); frames 2-4 keep their position relative to frame 1 as drawn in the raw (the tool
centres every figure in its cell; the source offsets from the column centres are put back),
the lowest part on the feet row, pulled back into the cell when it fits. Width check on frame 1
only. A 5th field in a `--view` segment (`FILE:BAND/N:COUNT:PICKS:REF`) names the figure of
that row that sets the scale (for mixing a falling figure from another row).
- `strip_lines`: dark horizontal lines across most of the image (ground lines, row separators
the model drew; at most 12 px thick, >75% of the width) are keyed out; a flat background in
another colour (the catapult raws came white and pale blue) is keyed out too.
- `row_bands`: tiny bands (a halo or sparkles floating above a row) belong to the next row
(before, a priest's halo landed in the row above and broke the scaling).
- `fal`: retries on 429/5xx/connection errors (60 s, 120 s, ...), counts every delivered image
in `progress.json` (file lock, so parallel runs are safe).
- `../scripts/peek.py` (raws side by side, small), `../scripts/pv.py` (32 previews side by side,
half size) for reviewing; `../scripts/anim_manifest.py NOTES` writes `manifest.json` and the
sheet notes into `progress.json`.
## Prompts
Same templates as the pilot (`prompt_front` / `prompt_back`, `--print` shows them). The animation
texts:
```text
walk (biped): "a looping walk cycle: the <name> walks forward in the direction it faces, at a steady pace, carrying <WEAPON> as in the idle pose"
walk (quad): same, columns from QUAD_FRAMES (spider: legs 1 and 3 on the left and 2 and 4 on the right stepping forward ...;
beetle: front and back legs on the left and the middle leg on the right ...; cave bear: right front paw and left hind paw ...)
walk (hover): "a looping hovering flight cycle: the <name> hovers in place in the air, flapping its wings"
columns: 1 upstroke - the wings raised straight up high above the head, the wing tips pointing up, the body at its highest point;
2 downstroke - the wings swept out level to the sides, fully spread; 3 down - the wings pulled down below the body, the wing
tips pointing down, the body at its lowest point; 4 recovery - the wings half raised and folded a little, swinging back up
+ "The creature stays in the middle of its cell ...; the wings flap with big, clearly different wing positions in the four frames ..."
walk (siege): "rolling forward: the <name> rolls forward in the direction it faces, its wooden wheels turning" (columns: wheel marks at 0, 1/4, 1/2, 3/4 turn)
die (biped): "a death: the character is struck by a fatal blow and falls over backwards (away from the direction it faces) onto its back,
where it lies still - in every view it falls the same way, backwards relative to its own facing"
columns: 1 hit - recoiling from the blow, still standing upright on both feet, head thrown back, eyes shut in pain, arms flung out;
2 falling - tipping over backwards, the knees buckling, the arms flailing; 3 hitting the ground - landing on its back, the body
flat and low, limbs bouncing up a little; 4 lying still - lying flat on its back on the ground, limbs limp, eyes closed or crossed out, motionless
+ "Frame 1 has the same size and position as the idle figure; in frames 2-4 the body sinks to the ground, the lowest part always
on the baseline of the row, and stays within its own cell. Frame 4 lies flat and low on the ground."
die (quad): staggers, collapses and rolls over onto its side, legs curled up
die (hover): wings fail, drops out of the air, lies with the wings spread flat
die (siege): "its destruction: the machine is smashed - planks crack and splinter, a wheel breaks off, and it collapses into a heap of broken wood"
attack: ATTACK[id] (ogre: two-fisted smash; spider: rearing pounce and bite; mage: staff thrust casting a purple shadow orb;
archer: draw from the quiver, aim, release, lower; dwarf: overhead pickaxe blow; paladin: two-handed diagonal swing with the glowing blade)
```
## Procedure
1. All front requests in parallel (10 at a time; this hit fal's rate limit, hence the retries).
2. Each front raw was looked at; a back request was only made when rows 4-5 of the front raw
were unusable (the model now often draws all five rows correctly). Back requests: bat, ram
walk and ogre die (before this rule), ogre/gargoyle/wyrm/giant walk, mage/ogre/archer/dwarf
attack (`--strict`), dwarf attack again.
3. `pix` with per-view picks (`pix-commands.sh`), then every 32 preview was checked against idle.
## Results and quality
General:
- **die**: in every raw the model draws frame 1 in the row's view, but frames 2-4 as the *same*
sideways fall in all five rows (it ignores the view once the body falls; a back request for the
ogre showed the same). So the dying body falls the same way on screen whatever the view,
usually head to the right. It still reads well as a death; asking for more would need one
request per view. The lying body is often wider than the cell and cut at the cell sides
(revenant, imp, the knight's sword).
- Several creatures come out wider/bulkier than their slim idle sheet (paladin, archer, thief,
monk, fairy and wyrm wings), so switching idle -> animation shows a slightly broader figure.
- Siege engines: the wheel turning is not visible at 32 px; the walk is mostly a gentle rock.
Per sheet (also in `progress.json`):
| sheet | status | notes |
| --- | --- | --- |
| archer-attack | accepted | front rows from the front raw, back rows from the back raw (--strict); the front three-quarter archer is drawn larger/wider than idle; side view: the draw is small |
| archer-die | accepted | good |
| archer-walk | accepted | raw had 6 frames per row (0,1,3,4 used); drawn a bit wider than idle, bow thinner |
| bat-die | accepted | good drop and splayed wings |
| bat-walk | accepted | all 5 rows from the front raw; wing flap is subtle (back raw had a smeared middle row, unused) |
| battlemage-die | accepted | good (hat falls off in the back view) |
| battlemage-walk | accepted | good |
| beetle-die | accepted | good: tips over onto its back, legs up |
| beetle-walk | accepted | legs barely visible (small steps); two stray antenna pixels above the front three-quarter frames 1 and 3 |
| catapult-die | accepted | the model drew a pale blue background (keyed out); in the back view frames 2-3 the wreck is drawn larger than the machine |
| catapult-walk | accepted | the model drew a white background (keyed out); wheel turning not visible, the machine only rocks slightly; back three-quarter drawn smaller than idle |
| cavebear-die | accepted | good; front view frame 1 a little smaller than the idle bear |
| cavebear-walk | accepted | good four-legged gait; side view touches the cell edges |
| chainbreaker-die | accepted | good |
| chainbreaker-walk | accepted | good |
| cogling-die | accepted | good |
| cogling-walk | accepted | good |
| dwarf-attack | accepted | back raw needed a retry (first one showed the face in the impact frames); back three-quarter impact frame from the back row |
| dwarf-die | accepted | good |
| dwarf-walk | accepted | good |
| fairy-die | accepted | good |
| fairy-walk | accepted | wings drawn bigger than in idle; back 3/4 = 2 frames alternating (others showed the face) |
| gargoyle-die | accepted | good |
| gargoyle-walk | accepted | back three-quarter frames 0,1,2,1 of the front raw (frame 4 showed the face), back view from the back raw (both back rows came out straight from behind) |
| giant-die | accepted | good (the club drops) |
| giant-walk | accepted | front row frames 0,2,3,2 (the club vanished in one frame); back view from the back raw (2 frames alternating, the others lost the club) |
| imp-die | accepted | frames 2-4 are the same sideways fall in every view (model limitation, as in all die sheets); the lying imp touches the cell edge |
| imp-walk | accepted | front and front 3/4 rows: frames 0,1,2,1 (frame 4 of the raw was a back view) |
| inquisitor-die | accepted | good: the holy book flies off; frame 1 wider than idle (arms flung out) |
| inquisitor-walk | accepted | back three-quarter frames 0,1,2,1 (frame 4 was a straight back view) |
| jailer-die | accepted | the raw had 5 figures in rows 2-5 (standing figures repeated, no falling frame there): the falling frame of rows 3-5 is borrowed from the front row; thin remnants of ground lines the model drew show under the lying body (mostly at 64) |
| jailer-walk | accepted | drawn a little wider than idle; the dark grey skin against the near-black outline looks noisy (as in idle) |
| knight-die | accepted | side and back rows: the raw had 5 figures (3 standing + fall + lying): frames 0,3,4,4 used, so the hit-the-ground and lying frames are the same there |
| kobold-die | accepted | first front raw dropped (mid-air flip with a shadow, back rows not falling); retry: back views take frame 1 from their own row and frames 2-4 from the front row |
| mage-attack | accepted | good: staff raised, thrust, a dark orb leaves the gem; back rows from the back raw |
| mage-die | accepted | good (eyes closed, so the glowing eyes are gone) |
| mage-walk | accepted | good |
| monk-die | accepted | good |
| monk-walk | accepted | wider than idle, fists lowered while walking (idle raises them) |
| ogre-attack | accepted | front rows from the front raw, back rows from the back raw (--strict); back view frame 2 taken from the back three-quarter row (the back row showed the face there) |
| ogre-die | accepted | frames 2-4 are the same sideways fall in every view (the model ignores the view once the body falls); back views from the back raw |
| ogre-walk | accepted | back views from the back raw (the front raw had no back three-quarter row) |
| owl-die | accepted | good |
| owl-walk | accepted | good flapping |
| paladin-attack | accepted | all 5 rows from the front raw; clear two-handed swing; blade cut at the cell edge in the impact frames; bulkier than the slim idle |
| paladin-die | accepted | drawn bulkier than the slim idle paladin; the white/gold armour gets blotchy when lying; sword drops beside the body |
| paladin-walk | accepted | drawn wider/stockier than idle; back 3/4 = 2 frames alternating (the row mixed front and back figures) |
| priest-die | accepted | the halo is lost in frame 1, so frame 1 is scaled a little larger than idle (about one tenth); the halo comes back while falling |
| priest-walk | accepted | first pixelization lost the halo of the front row (a floating halo was cut into the row above); fixed in row_bands and re-run |
| priestess-die | accepted | good |
| priestess-walk | accepted | good |
| ram-die | accepted | breaks into a heap of planks; frames 2-4 are the same sideways collapse in every view |
| ram-walk | accepted | front view static (frame 1 x4: the other front frames were turned); back view from the back raw; wheel turning barely visible, slight rocking |
| ranger-die | accepted | the bow stands apart from the ranger in frame 1 of the side and back rows and is dropped there; grid lines in the raw removed by the tool |
| ranger-walk | accepted | good |
| revenant-die | accepted | the lying skeleton is longer than the cell and is cut at the cell sides in frames 3-4 |
| revenant-walk | accepted | 6 frames per row with mixed views, picks per row; small jitter |
| spider-attack | accepted | raw had 6 rows; only the wind-up (front legs raised) reads clearly, the bite frames move little |
| spider-die | accepted | back three-quarter = back view (as in idle); collapses with curled legs |
| spider-walk | accepted | raw had 6 rows (an extra front three-quarter row turned left); back three-quarter = back view as in idle |
| thief-die | accepted | good |
| thief-walk | accepted | raw had 5 frames per row (0,1,3,4 used); a little wider than idle |
| trader-die | accepted | good |
| trader-walk | accepted | good |
| wyrm-die | accepted | frame 1 shows the wyrm with wings spread, wider than the idle pose; lying frames are a sideways dragon in every view |
| wyrm-walk | accepted | strong wing flap, but the wings are spread much wider than in the idle pose (idle has them folded); back three-quarter = 2 frames alternating from the back raw (the other two showed the face) |
Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 53 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 55 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 51 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 64 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 63 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 55 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 52 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 68 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 64 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 56 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 51 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 79 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 77 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 64 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 51 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 64 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 65 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 55 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 60 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 53 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 79 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 86 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 43 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 67 KiB

Loaded 100 of 405 files, more files were not shown because too many files have changed in this diff. Show more