Oliver walked the sprite bench and reported the same two faults on every family: the healthy walk loses its head, and the wounded walk's feet do not move. Both were in the ONE FILE every zombie tennis character is drawn from — and the family pipeline had copied it faithfully, which is the pipeline working. WHERE IT CAME FROM. That sheet was not composed from the sprites. It was a GENERATED RE-DRAW of the club pro, made in nine separate 4K calls, one per row band, then stacked (gen4k.py, in a session scratchpad, untracked and now gone). Nine calls returned nine scales, and call 1 came back with the shuffle frame decapitated. Measured against the sprite it was drawn from, that one figure scaled 2.341 wide and 1.996 tall where all thirty others were proportional to three decimals: 33 px missing off the top, width untouched. The local input to that call was exact at 2.000x. The sheet lost the head, not the sprite. THE FIX IS TO STOP PUTTING THE REFERENCE THROUGH THE MODEL. _famref.py composes it from the 31 z_r* frames on disk — one scale, applied once, NEAREST — and costs no tokens. That kills the head and the five scales together, and it explains two things in _zsheet.py that read like fudges: the fall1 re-anchor and the walk-frame levelling exist only to undo per-band scale drift. The levelling is also what turned a headless z_sh2 into a headless AND 13% oversized one, by reading the missing head as a height error and scaling up to compensate. THE GATE WAS MISSING ON THE INPUT. _zsheet.py checks what comes BACK from the model — band count, figure count, stacked bodies, edges, palette, heights — and nothing had ever checked the sheet handed TO it. _famref.check() re-reads the file it just wrote with _zsheet's own detection and refuses one where any figure's width and height scales disagree by 2%, or where a stride pair is frozen. THE THIRD DEFECT NEEDED NEW ART. z_rw1b had the same legs as z_rw1 (15.1% against the healthy pair's 51.1%), so the club pro has slid through both wound stages since the day he shipped, and every family inherited it. _stride.py draws the missing twin, and what made it work after words had failed for as long as they were tried is SHOWING the edit: image 2 is the healthy pair side by side, the same character performing exactly the change being asked for. The headless twin then took the ARM-OFF pair as its example — a wounded body is a closer picture of the edit, the same chaining the wound ladder already uses. Its gate measures three things and prints all three: legs moved, body above the hips did not, racket kept its bed. The thresholds are CALIBRATED on pairs that already ship, not chosen — my first guesses rejected z_e1/z_e2 and z_g1/z_g2, both accepted art. And a twin FILLS the racket bed instead of keying it out: the first rolls came back with 959 px of enclosed transparency against their base's 0, which would have flickered the racket face empty/filled once per step. AFTER, on the installed sprites — leg difference within each stride pair, where the wounded pairs used to sit between 4.8% and 19.7%: r 51.1 / 68.1 / 36.7 ru 55.9 / 59.1 / 38.7 br 40.7 / 42.0 / 26.8 gk 41.1 / 44.6 / 30.6 sh 59.4 / 71.4 / 43.9 lj 38.4 / 45.5 / 27.4 bb 56.5 / 67.1 / 43.2 st 51.6 / 66.1 / 35.7 All seven families re-rolled off the rebuilt reference, every play row with its head, and all 24 family/wound-stage states alternating a real pair — checked by instrumenting drawImage on the bench, not by eye. br and lj sit lowest on the headless pair and are worth a re-roll if they ever read as stiff; lj needed one, its first roll came back frozen on all three pairs with the headless row 31 px short. AND THE REFERENCE IS TRACKED NOW. It lived in gitignored _refcheck/, so the thing the entire pipeline rests on was unreproducible for as long as it existed. It is assets/_pose_ref_family.png, next to _pose_ref_serve.png, and the scripts that build and consume it are in the repo instead of a scratchpad. Also in here: the SHAMBLE BOB, which was a 1 px lift on a wall clock applied to every body every frame whether it was moving or not — a held pose bobbed forever and a corpse bobbed while it lay on the ground. It only happens while walking now, and it steps off ground covered, which is the same rule the strides follow. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
26 KiB
203x224px
26 KiB
203x224px