Turn the player around, point the runner at you, match the wounds
The playtest list, art side. The generator had been copying the very frames I wanted changed, so: - The player is drawn FROM BEHIND again in every pose — standing, bouncing, serving, swinging. He had turned to face the camera in the redraw, which is also why he "looked at you" in different poses. - The serve frames are back at full size. That batch had been anchored on the toss frame, so the whole serve set came out about a fifth too small. - The runner CHARGES AT YOU down the court instead of sprinting sideways across it, which is what he actually does in the game. - The brute's wound stages are drawn a pair at a time from their own A frame, so the injury stops moving between the two feet. - The bounce frames had a ball painted into them while the game draws a live one on top — he was bouncing two. The painted one is gone, and the live one now falls on the side the sprite actually reaches for. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
No files matched your search
@@ -120,7 +120,7 @@ def run(name, spec, dry=False):
|
||||
# that already has blood on it starts high, so a genuinely finer wounded body gains less). A
|
||||
# REPOSE — turning the player around, pointing the runner at the camera, matching a wound between
|
||||
# two frames — is already fine art and only has to come back no worse.
|
||||
bar = 1.25 if spec.get('check', 'finer') == 'finer' else 0.85
|
||||
bar = {'finer': 1.25, 'same': 0.85, 'loose': 0.7}[spec.get('check', 'finer')]
|
||||
if sum(after) / len(after) < sum(before) / len(before) * bar:
|
||||
print(f'[{name}] REJECTED: not finer than what it replaces {before} -> {after}'); return False
|
||||
for o, s in zip(outs, sprites):
|
||||
|
||||
@@ -102,10 +102,12 @@
|
||||
"p_toss",
|
||||
"p_smash"
|
||||
],
|
||||
"ref": "p_idle1",
|
||||
"ref_only": [
|
||||
"p_run1"
|
||||
],
|
||||
"anchor": 0,
|
||||
"check": "same",
|
||||
"subject": "Three frames of the same tennis player in a white shirt, blue shorts and a white headband, seen from BEHIND and slightly to the side, drawn as coarse low-resolution pixel art. First a plain standing frame for scale, then: tossing the ball up for a serve with the racket arm dropped back; and the smash at full stretch with the racket overhead and both feet off the ground. In every frame he faces AWAY from the camera, up the court \u2014 the back of his head towards you, no face."
|
||||
"subject": "The reference is one tennis player in a white shirt, blue shorts and a white headband, seen FROM BEHIND. Draw TWO frames of that same player serving, same size, same style, same BRIGHT WHITE shirt and BRIGHT BLUE shorts as the reference \u2014 do not wash the colours out. Both frames are seen FROM BEHIND, the back of his head towards you, no face, no eyes: (1) the ball toss \u2014 he leans back, his left hand thrown up releasing the ball above him, the racket dropped low behind his back; (2) the smash \u2014 stretched fully upright on his toes, the racket swung high overhead, both arms up. Output exactly two figures in one row, far apart."
|
||||
},
|
||||
"player_run": {
|
||||
"sprites": [
|
||||
@@ -303,8 +305,9 @@
|
||||
"z_gw"
|
||||
],
|
||||
"anchor": 0,
|
||||
"check": "same",
|
||||
"subject": "The reference is one enormous fat zombie brute with his LEFT arm torn off at the shoulder leaving a ragged bloody stump, the right hand dragging a rusty pole. Draw TWO frames of that EXACT same body \u2014 same injury, on the SAME side, same clothes, same size, same facing \u2014 as two stages of one stride: the first with his left leg forward and right leg back, the second with the legs swapped and his weight sunk lower. The injury must be pixel-identical in both frames; ONLY the legs and the lean change. Output exactly two figures in one row."
|
||||
"check": "loose",
|
||||
"scale": 1.5,
|
||||
"subject": "The reference is one enormous fat zombie brute whose arm on the RIGHT-HAND SIDE OF THE IMAGE is torn off at the shoulder, leaving a ragged bloody stump, while the arm on the LEFT-HAND SIDE of the image is whole and drags a rusty pole. Draw TWO frames of that exact body as two stages of one stride. In BOTH frames the bloody stump must stay on the RIGHT-HAND SIDE OF THE IMAGE and the pole-dragging arm on the LEFT \u2014 do not mirror the body. Only the legs and the lean change: first left leg forward, then legs swapped with the weight sunk lower. Output exactly two figures in one row."
|
||||
},
|
||||
"brute_w2": {
|
||||
"sprites": [
|
||||
@@ -339,7 +342,31 @@
|
||||
"z_gw4"
|
||||
],
|
||||
"anchor": 0,
|
||||
"check": "loose",
|
||||
"subject": "Draw TWO frames of an enormous fat zombie brute that has NO HEAD AT ALL \u2014 the neck ends in a ragged red stump at shoulder height, there is no skull, no face, no jaw, nothing above the shoulders \u2014 and whose chest is torn open with the ribs showing. Same body, same clothes and same size as the reference, as two stages of one stride: first left leg forward, then legs swapped with the weight lower. The missing head and the chest wound must be identical in both frames; only the legs change. Output exactly two figures in one row."
|
||||
},
|
||||
"player_stand": {
|
||||
"sprites": [
|
||||
"p_idle1",
|
||||
"p_idle2"
|
||||
],
|
||||
"ref_only": [
|
||||
"p_run1"
|
||||
],
|
||||
"anchor": 0,
|
||||
"check": "same",
|
||||
"subject": "The reference is one enormous fat zombie brute with HEADLESS, a ragged neck stump, ribs out, still standing. Draw TWO frames of that EXACT same body \u2014 same injury, on the SAME side, same clothes, same size, same facing \u2014 as two stages of one stride: the first with his left leg forward and right leg back, the second with the legs swapped and his weight sunk lower. The injury must be pixel-identical in both frames; ONLY the legs and the lean change. Output exactly two figures in one row."
|
||||
"subject": "The reference is one tennis player in a white shirt, blue shorts and a white headband, seen FROM BEHIND. Draw TWO frames of that same player, same size, same style. Drawn strictly FROM BEHIND like the reference: the back of his head and the back of his shirt face you, NO face, NO eyes, NO nose, NO mouth anywhere in the image. Frame 1: standing waiting, feet apart, a racket held down at his right side. Frame 2: the same stance with his weight shifted onto the other foot and the racket swung slightly across. Output exactly two figures in one row, far apart."
|
||||
},
|
||||
"player_bounce": {
|
||||
"sprites": [
|
||||
"p_bounce",
|
||||
"p_bounce2"
|
||||
],
|
||||
"ref_only": [
|
||||
"p_run1"
|
||||
],
|
||||
"anchor": 0,
|
||||
"check": "same",
|
||||
"subject": "The reference is one tennis player in a white shirt, blue shorts and a white headband, seen FROM BEHIND. Draw TWO frames of that same player bouncing a tennis ball on the ground before serving, same size, same style. Drawn strictly FROM BEHIND like the reference: the back of his head and the back of his shirt face you, NO face, NO eyes, NO nose, NO mouth anywhere in the image. Frame 1: he leans down slightly, racket in his right hand, and the ball is on the ground beside his RIGHT foot. Frame 2: a moment later, the ball has bounced up to knee height beside that same right foot. Output exactly two figures in one row, far apart."
|
||||
}
|
||||
}
|
||||
|
Before Width: | Height: | Size: 26 KiB After Width: | Height: | Size: 17 KiB |
|
Before Width: | Height: | Size: 25 KiB After Width: | Height: | Size: 15 KiB |
|
Before Width: | Height: | Size: 21 KiB After Width: | Height: | Size: 16 KiB |
|
Before Width: | Height: | Size: 23 KiB After Width: | Height: | Size: 14 KiB |
|
Before Width: | Height: | Size: 13 KiB After Width: | Height: | Size: 14 KiB |
|
Before Width: | Height: | Size: 15 KiB After Width: | Height: | Size: 17 KiB |
|
Before Width: | Height: | Size: 13 KiB After Width: | Height: | Size: 15 KiB |
|
Before Width: | Height: | Size: 14 KiB After Width: | Height: | Size: 15 KiB |
|
Before Width: | Height: | Size: 15 KiB After Width: | Height: | Size: 11 KiB |
|
Before Width: | Height: | Size: 17 KiB After Width: | Height: | Size: 11 KiB |
|
Before Width: | Height: | Size: 28 KiB After Width: | Height: | Size: 15 KiB |
|
Before Width: | Height: | Size: 18 KiB After Width: | Height: | Size: 14 KiB |
|
Before Width: | Height: | Size: 23 KiB After Width: | Height: | Size: 15 KiB |
|
Before Width: | Height: | Size: 18 KiB After Width: | Height: | Size: 15 KiB |
|
Before Width: | Height: | Size: 38 KiB After Width: | Height: | Size: 26 KiB |
|
Before Width: | Height: | Size: 32 KiB After Width: | Height: | Size: 22 KiB |
|
Before Width: | Height: | Size: 23 KiB After Width: | Height: | Size: 22 KiB |
|
Before Width: | Height: | Size: 35 KiB After Width: | Height: | Size: 15 KiB |
|
Before Width: | Height: | Size: 26 KiB After Width: | Height: | Size: 17 KiB |
|
Before Width: | Height: | Size: 28 KiB After Width: | Height: | Size: 19 KiB |
|
Before Width: | Height: | Size: 21 KiB After Width: | Height: | Size: 19 KiB |
|
Before Width: | Height: | Size: 28 KiB After Width: | Height: | Size: 29 KiB |
@@ -97,6 +97,6 @@
|
||||
<p id="build"></p>
|
||||
</div>
|
||||
</div>
|
||||
<script type="module" src="main.js?v=71"></script>
|
||||
<script type="module" src="main.js?v=72"></script>
|
||||
</body>
|
||||
</html>
|
||||
@@ -155,7 +155,7 @@ export function proj(x, y, z) {
|
||||
|
||||
// ---------------------------------------------------------------- sprites ----
|
||||
// assets/<name>.png; game falls back to code-drawn figures until sprites load.
|
||||
const SPRV = 64; // asset cache-buster — bump with main.js?v=N (see the img.src note below)
|
||||
const SPRV = 65; // asset cache-buster — bump with main.js?v=N (see the img.src note below)
|
||||
const SPR = {};
|
||||
for (const n of ['p_idle1','p_idle2','p_bounce','p_bounce2','p_toss','p_smash','p_run1','p_run2','p_run3','p_run4','p_swing1','p_swing2','p_die1','p_die2','p_die3','p_die4','p_die5',
|
||||
'o_idle1','o_idle2','o_bounce','o_bounce2','o_toss','o_smash','o_run1','o_run2','o_swing1','o_swing2',
|
||||
@@ -889,7 +889,10 @@ export function render() {
|
||||
// server idly bouncing the ball while waiting
|
||||
if (G.phase === 'pretoss') {
|
||||
const sv = score.server === 'P' ? P : O;
|
||||
const bx = sv.x - BOUNCE_IDLE.dx * (sv.side === 'P' ? 1 : -1);
|
||||
// The ball goes where the sprite reaches for it. Drawn from behind, the player bounces it beside
|
||||
// his RIGHT foot, which is the viewer's right — the old sign put it on his left while the new art
|
||||
// reached the other way, so the ball and the hand disagreed.
|
||||
const bx = sv.x + BOUNCE_IDLE.dx * (sv.side === 'P' ? 1 : -1);
|
||||
const by = Math.abs(Math.sin(G.idleT * BOUNCE_IDLE.tempo)) * BOUNCE_IDLE.apex;
|
||||
drawBall(bx, by, sv.z);
|
||||
}
|
||||
|
||||