diff --git a/assets/_regen_batches.json b/assets/_regen_batches.json index 94acec3..3395c74 100644 --- a/assets/_regen_batches.json +++ b/assets/_regen_batches.json @@ -65,7 +65,7 @@ "z_dw", "z_dwb" ], - "subject": "Two frames of the same badly wounded zombie stadium steward in a torn high-visibility ORANGE vest \u2014 one arm mangled, a deep bloody gash across the chest, head lolling \u2014 walking, two stages of one stride, drawn as coarse low-resolution pixel art.", + "subject": "Two frames of the same badly wounded zombie stadium steward in a torn high-visibility ORANGE vest — one arm mangled, a deep bloody gash across the chest, head lolling — walking, two stages of one stride, drawn as coarse low-resolution pixel art.", "anchor": 0, "state": true }, @@ -76,7 +76,7 @@ "z_c3", "z_c4" ], - "subject": "Four frames of the same zombie tennis player facing the viewer \u2014 yellow hair, red headband, red shirt, grey shorts, a wooden racket hanging from one hand \u2014 a four-frame shuffle towards the camera, drawn as coarse low-resolution pixel art.", + "subject": "Four frames of the same zombie tennis player facing the viewer — yellow hair, red headband, red shirt, grey shorts, a wooden racket hanging from one hand — a four-frame shuffle towards the camera, drawn as coarse low-resolution pixel art.", "anchor": 0 }, "cpu_wounds": { @@ -109,7 +109,7 @@ ], "ref": "p_idle1", "anchor": 0, - "subject": "Five frames of the same tennis player in a white shirt and blue shorts, drawn as coarse low-resolution pixel art. Every figure is seen strictly FROM BEHIND \u2014 the back of his head and the back of his shirt face the viewer, no face, no eyes, no nose, he is running or standing AWAY from the camera. First a standing frame for scale, then a four-frame run cycle, running away from the camera with no racket.", + "subject": "Five frames of the same tennis player in a white shirt and blue shorts, drawn as coarse low-resolution pixel art. Every figure is seen strictly FROM BEHIND — the back of his head and the back of his shirt face the viewer, no face, no eyes, no nose, he is running or standing AWAY from the camera. First a standing frame for scale, then a four-frame run cycle, running away from the camera with no racket.", "check": "same" }, "player_death": { @@ -155,7 +155,7 @@ ], "anchor": 0, "check": "same", - "subject": "The reference is ONE tennis opponent in a RED polo shirt, dark grey shorts and a RED HEADBAND, seen from the front, gripping a tennis racket in his right hand. Draw FOUR frames of that same man RUNNING towards the camera. THE FOUR FRAMES MUST BE FOUR DIFFERENT BODY POSITIONS \u2014 no two frames alike, do not repeat a pose: (1) his RIGHT knee lifted high in front of him, left leg stretched out straight behind, left arm forward; (2) his right foot planted flat on the ground under him taking his weight, left knee just beginning to swing forward, both arms low; (3) his LEFT knee lifted high in front of him, right leg stretched out straight behind, right arm forward; (4) his left foot planted flat on the ground under him taking his weight, right knee just beginning to swing forward, both arms low. Every figure is the SAME man as the reference and the SAME size: red polo shirt, dark grey shorts, RED HEADBAND, blond hair, seen from the FRONT. Same face, same colours, same proportions, standing the same height. IN EVERY ONE OF THE FOUR FRAMES he is HOLDING THE TENNIS RACKET in his right hand \u2014 the full racket, with its oval head, its strings, its throat and its grip all drawn, exactly like the reference's racket, carried close in front of his chest. NO FRAME MAY HAVE AN EMPTY RIGHT HAND and no frame may show a racket with the head missing. The whole figure and the whole racket sit fully inside the canvas with clear space around them. The canvas must contain EXACTLY FOUR figures and no others. Do NOT redraw the standing reference pose as an extra figure.", + "subject": "The reference is ONE tennis opponent in a RED polo shirt, dark grey shorts and a RED HEADBAND, seen from the front, gripping a tennis racket in his right hand. Draw FOUR frames of that same man RUNNING towards the camera. THE FOUR FRAMES MUST BE FOUR DIFFERENT BODY POSITIONS — no two frames alike, do not repeat a pose: (1) his RIGHT knee lifted high in front of him, left leg stretched out straight behind, left arm forward; (2) his right foot planted flat on the ground under him taking his weight, left knee just beginning to swing forward, both arms low; (3) his LEFT knee lifted high in front of him, right leg stretched out straight behind, right arm forward; (4) his left foot planted flat on the ground under him taking his weight, right knee just beginning to swing forward, both arms low. Every figure is the SAME man as the reference and the SAME size: red polo shirt, dark grey shorts, RED HEADBAND, blond hair, seen from the FRONT. Same face, same colours, same proportions, standing the same height. IN EVERY ONE OF THE FOUR FRAMES he is HOLDING THE TENNIS RACKET in his right hand — the full racket, with its oval head, its strings, its throat and its grip all drawn, exactly like the reference's racket, carried close in front of his chest. NO FRAME MAY HAVE AN EMPTY RIGHT HAND and no frame may show a racket with the head missing. The whole figure and the whole racket sit fully inside the canvas with clear space around them. The canvas must contain EXACTLY FOUR figures and no others. Do NOT redraw the standing reference pose as an extra figure.", "palette_ref": "o_idle1" }, "ump_boy": { @@ -224,7 +224,7 @@ "z_sdown" ], "anchor": 0, - "subject": "One frame of a zombie spectator in a grey-brown coat who has just had his wooden folding chair knocked DOWN out of his hands \u2014 the chair is falling beside him and he is staggering with his arms up \u2014 drawn as coarse low-resolution pixel art." + "subject": "One frame of a zombie spectator in a grey-brown coat who has just had his wooden folding chair knocked DOWN out of his hands — the chair is falling beside him and he is staggering with his arms up — drawn as coarse low-resolution pixel art." }, "boy_run_2": { "sprites": [ @@ -260,7 +260,7 @@ ], "anchor": 0, "check": "same", - "subject": "The reference is one zombie drawn FACING THE VIEWER. Draw FOUR frames of a DIFFERENT zombie in that same front-facing style, same size: a lean SPRINTING zombie in a torn grey-green tracksuit, charging straight down the court AT THE VIEWER. In every frame his chest and face point at you and he is coming towards you, foreshortened \u2014 one knee driven up high towards the camera, the other leg trailing far behind, arms pumping across his chest, body leaning into the run. The four frames are four stages of that charge: left knee up, mid-air stretch, right knee up, mid-air stretch the other way. He must NEVER be running sideways across the frame. Torn tracksuit, exposed ribs, green skin, sunken eyes and teeth. Output exactly four figures in one row." + "subject": "The reference is one zombie drawn FACING THE VIEWER. Draw FOUR frames of a DIFFERENT zombie in that same front-facing style, same size: a lean SPRINTING zombie in a torn grey-green tracksuit, charging straight down the court AT THE VIEWER. In every frame his chest and face point at you and he is coming towards you, foreshortened — one knee driven up high towards the camera, the other leg trailing far behind, arms pumping across his chest, body leaning into the run. The four frames are four stages of that charge: left knee up, mid-air stretch, right knee up, mid-air stretch the other way. He must NEVER be running sideways across the frame. Torn tracksuit, exposed ribs, green skin, sunken eyes and teeth. Output exactly four figures in one row." }, "brute_all_wounds": { "sprites": [ @@ -270,7 +270,7 @@ "z_gw2b" ], "anchor": 0, - "subject": "Four frames of the same enormous fat zombie brute, drawn as coarse low-resolution pixel art. The FIRST TWO are the same damage stage \u2014 his LEFT arm torn off at the shoulder leaving a ragged bloody stump, the right arm dragging a rusty pole \u2014 shown as two stages of one stride. The LAST TWO are the next damage stage, BOTH arms gone at the shoulders, again two stages of one stride. Within each pair the injuries must be IDENTICAL and on the same side of the body: only the legs change.", + "subject": "Four frames of the same enormous fat zombie brute, drawn as coarse low-resolution pixel art. The FIRST TWO are the same damage stage — his LEFT arm torn off at the shoulder leaving a ragged bloody stump, the right arm dragging a rusty pole — shown as two stages of one stride. The LAST TWO are the next damage stage, BOTH arms gone at the shoulders, again two stages of one stride. Within each pair the injuries must be IDENTICAL and on the same side of the body: only the legs change.", "check": "same", "state": true }, @@ -282,7 +282,7 @@ "z_gw4b" ], "anchor": 0, - "subject": "Four frames of the same enormous fat zombie brute, drawn as coarse low-resolution pixel art. The FIRST TWO are the same damage stage \u2014 chest and belly torn wide open with the ribs showing \u2014 as two stages of one stride. The LAST TWO are the final stage, HEADLESS with the ribs out, still standing, again two stages of one stride. Within each pair the injuries must be IDENTICAL and in the same place: only the legs change.", + "subject": "Four frames of the same enormous fat zombie brute, drawn as coarse low-resolution pixel art. The FIRST TWO are the same damage stage — chest and belly torn wide open with the ribs showing — as two stages of one stride. The LAST TWO are the final stage, HEADLESS with the ribs out, still standing, again two stages of one stride. Within each pair the injuries must be IDENTICAL and in the same place: only the legs change.", "check": "same" }, "player_swing": { @@ -293,7 +293,7 @@ "ref": "p_idle1", "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, drawn as coarse low-resolution pixel art. First a plain standing frame for scale, then two frames of a forehand swing \u2014 racket drawn back across the body, then followed through. In both he faces AWAY from the camera, up the court \u2014 the back of his head towards you, no face." + "subject": "Three frames of the same tennis player in a white shirt, blue shorts and a white headband, seen from BEHIND, drawn as coarse low-resolution pixel art. First a plain standing frame for scale, then two frames of a forehand swing — racket drawn back across the body, then followed through. In both he faces AWAY from the camera, up the court — the back of his head towards you, no face." }, "brute_w1": { "sprites": [ @@ -306,7 +306,7 @@ "anchor": 0, "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." + "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 — 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": [ @@ -318,7 +318,7 @@ ], "anchor": 0, "check": "same", - "subject": "The reference is one enormous fat zombie brute with BOTH arms torn off at the shoulders, two ragged bloody stumps. 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 enormous fat zombie brute with BOTH arms torn off at the shoulders, two ragged bloody stumps. Draw TWO frames of that EXACT same body — same injury, on the SAME side, same clothes, same size, same facing — 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." }, "brute_w3": { "sprites": [ @@ -330,7 +330,7 @@ ], "anchor": 0, "check": "same", - "subject": "The reference is one enormous fat zombie brute with his chest and belly torn wide open with the ribs showing through. 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 enormous fat zombie brute with his chest and belly torn wide open with the ribs showing through. Draw TWO frames of that EXACT same body — same injury, on the SAME side, same clothes, same size, same facing — 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." }, "brute_w4": { "sprites": [ @@ -342,7 +342,7 @@ ], "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." + "subject": "Draw TWO frames of an enormous fat zombie brute that has NO HEAD AT ALL — the neck ends in a ragged red stump at shoulder height, there is no skull, no face, no jaw, nothing above the shoulders — 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." }, "brute_stages": { "sprites": [ @@ -357,7 +357,7 @@ "anchor": 0, "check": "loose", "scale": 1.5, - "subject": "The reference is an enormous fat zombie brute \u2014 huge belly, stained shirt, brown trousers, dragging a rusty pole. Draw FOUR frames of that SAME body at that SAME size and bulk, standing, as four stages of damage: (1) the arm on the right-hand side of the image torn off at the shoulder leaving a ragged bloody stump, the other arm still dragging the pole; (2) BOTH arms torn off at the shoulders, two bloody stumps, no pole; (3) both arms gone and the chest and belly torn wide open with ribs showing through; (4) all of that AND no head at all \u2014 the neck ends in a ragged red stump at shoulder height, no skull, no face. He must stay the same enormous size and shape in all four \u2014 do not slim him down as the damage grows. Output exactly four figures in one row, evenly spaced." + "subject": "The reference is an enormous fat zombie brute — huge belly, stained shirt, brown trousers, dragging a rusty pole. Draw FOUR frames of that SAME body at that SAME size and bulk, standing, as four stages of damage: (1) the arm on the right-hand side of the image torn off at the shoulder leaving a ragged bloody stump, the other arm still dragging the pole; (2) BOTH arms torn off at the shoulders, two bloody stumps, no pole; (3) both arms gone and the chest and belly torn wide open with ribs showing through; (4) all of that AND no head at all — the neck ends in a ragged red stump at shoulder height, no skull, no face. He must stay the same enormous size and shape in all four — do not slim him down as the damage grows. Output exactly four figures in one row, evenly spaced." }, "brute_s12": { "sprites": [ @@ -370,7 +370,7 @@ "anchor": 0, "check": "loose", "scale": 1.4, - "subject": "The reference is an enormous fat zombie brute \u2014 huge belly, stained shirt, brown trousers. Draw TWO frames of that SAME body at that SAME enormous size and bulk, standing, as two stages of damage: (1) the arm on the right-hand side of the image torn off at the shoulder leaving a ragged bloody stump, the other arm still dragging a rusty pole; (2) BOTH arms torn off at the shoulders, two bloody stumps, no pole. Do not slim him down. Output exactly two figures in one row, far apart." + "subject": "The reference is an enormous fat zombie brute — huge belly, stained shirt, brown trousers. Draw TWO frames of that SAME body at that SAME enormous size and bulk, standing, as two stages of damage: (1) the arm on the right-hand side of the image torn off at the shoulder leaving a ragged bloody stump, the other arm still dragging a rusty pole; (2) BOTH arms torn off at the shoulders, two bloody stumps, no pole. Do not slim him down. Output exactly two figures in one row, far apart." }, "brute_s34": { "sprites": [ @@ -383,7 +383,7 @@ "anchor": 0, "check": "loose", "scale": 1.4, - "subject": "The reference is an enormous fat zombie brute \u2014 huge belly, stained shirt, brown trousers. Draw TWO frames of that SAME body at that SAME enormous size and bulk, standing, as two stages of damage: (1) both arms gone and the chest and belly torn wide open with the ribs showing through; (2) all of that AND no head at all \u2014 the neck ends in a ragged red stump at shoulder height, no skull, no face, nothing above the shoulders. Do not slim him down. Output exactly two figures in one row, far apart." + "subject": "The reference is an enormous fat zombie brute — huge belly, stained shirt, brown trousers. Draw TWO frames of that SAME body at that SAME enormous size and bulk, standing, as two stages of damage: (1) both arms gone and the chest and belly torn wide open with the ribs showing through; (2) all of that AND no head at all — the neck ends in a ragged red stump at shoulder height, no skull, no face, nothing above the shoulders. Do not slim him down. Output exactly two figures in one row, far apart." }, "player_stance_r": { "sprites": [ @@ -397,7 +397,7 @@ ], "anchor": 0, "check": "same", - "subject": "The reference is ONE tennis player in a white shirt, blue shorts and a white headband, seen from behind, serving with the racket high in his right hand. Draw FOUR frames of that same man. Every figure is seen strictly FROM BEHIND \u2014 the back of his head and the back of his shirt towards you, NO face, NO eyes, NO nose, NO mouth. Every figure is drawn from exactly the same viewpoint: same camera height, same distance, straight on, standing on the same level ground line, with no perspective distortion, no foreshortening, no worm's-eye or bird's-eye angle and no three-quarter turn. Same size, same body, same style, same BRIGHT WHITE shirt and BRIGHT BLUE shorts as the reference \u2014 do not wash the colours out. He is RIGHT-HANDED and the racket NEVER changes hands: in every single frame the racket is in his RIGHT hand, which \u2014 because he is drawn from behind \u2014 is on the RIGHT-HAND SIDE OF THE IMAGE, exactly as in the reference. His empty left arm is on the LEFT-HAND SIDE OF THE IMAGE. Draw NO ball anywhere in any frame \u2014 the game draws the ball. Frame 1: he STANDS upright and relaxed at the baseline, arms down, the racket hanging at his right side. Frame 2: he leans forward a little and his empty LEFT hand reaches down and out to the LEFT-HAND SIDE OF THE IMAGE, palm down, as if patting a ball on the ground beside his left foot; the racket stays in his right hand at his right side. Frame 3 IS THE SAME DRAWING AS FRAME 2 \u2014 identical stance, identical legs, identical head, identical racket, identical everything \u2014 and the ONLY difference is that his left elbow is bent a little more so that left hand has risen about one hand's width higher, as if the ball had bounced back up into it. Frame 4: the ball toss \u2014 he leans back and throws that same empty LEFT arm up high above him on the LEFT-HAND SIDE OF THE IMAGE, having just released the ball, while the racket stays in his right hand down at his right side. Output exactly four figures in one row, evenly spaced and far apart." + "subject": "The reference is ONE tennis player in a white shirt, blue shorts and a white headband, seen from behind, serving with the racket high in his right hand. Draw FOUR frames of that same man. Every figure is seen strictly FROM BEHIND — the back of his head and the back of his shirt towards you, NO face, NO eyes, NO nose, NO mouth. Every figure is drawn from exactly the same viewpoint: same camera height, same distance, straight on, standing on the same level ground line, with no perspective distortion, no foreshortening, no worm's-eye or bird's-eye angle and no three-quarter turn. Same size, same body, same style, same BRIGHT WHITE shirt and BRIGHT BLUE shorts as the reference — do not wash the colours out. He is RIGHT-HANDED and the racket NEVER changes hands: in every single frame the racket is in his RIGHT hand, which — because he is drawn from behind — is on the RIGHT-HAND SIDE OF THE IMAGE, exactly as in the reference. His empty left arm is on the LEFT-HAND SIDE OF THE IMAGE. Draw NO ball anywhere in any frame — the game draws the ball. Frame 1: he STANDS upright and relaxed at the baseline, arms down, the racket hanging at his right side. Frame 2: he leans forward a little and his empty LEFT hand reaches down and out to the LEFT-HAND SIDE OF THE IMAGE, palm down, as if patting a ball on the ground beside his left foot; the racket stays in his right hand at his right side. Frame 3 IS THE SAME DRAWING AS FRAME 2 — identical stance, identical legs, identical head, identical racket, identical everything — and the ONLY difference is that his left elbow is bent a little more so that left hand has risen about one hand's width higher, as if the ball had bounced back up into it. Frame 4: the ball toss — he leans back and throws that same empty LEFT arm up high above him on the LEFT-HAND SIDE OF THE IMAGE, having just released the ball, while the racket stays in his right hand down at his right side. Output exactly four figures in one row, evenly spaced and far apart." }, "opponent_swing": { "sprites": [ @@ -407,7 +407,7 @@ "ref": "o_idle1", "anchor": 0, "check": "loose", - "subject": "Three frames of the same tennis opponent, drawn as coarse low-resolution pixel art, side by side. FRAME 1: a plain standing frame for scale, exactly like the reference. FRAME 2 \u2014 THE BACKSWING: he has turned his shoulders and taken the racket BACK BEHIND HIS RIGHT HIP, low and well behind his body, arm coiled, racket head pointing backwards away from the net, weight on his back foot. He has NOT hit the ball yet. FRAME 3 \u2014 THE FOLLOW-THROUGH: the swing is FINISHED. His arm has swept all the way ACROSS HIS CHEST to the OTHER SIDE of his body and the racket head is now UP AND OVER HIS LEFT SHOULDER, near his left ear, his chest turned to face the net, weight on his front foot. FRAMES 2 AND 3 MUST LOOK COMPLETELY DIFFERENT FROM EACH OTHER \u2014 in frame 2 the racket is BEHIND him on his RIGHT, in frame 3 it is HIGH on his LEFT. This contrast is the whole point of the pair. Every figure is the SAME man as the reference and the SAME size: RED polo shirt, DARK CHARCOAL GREY shorts, RED cloth headband, blond hair, white shoes, seen from the FRONT. Same face, same colours, same proportions. His headband is RED, never white or cream. In both swing frames he stays UPRIGHT at his full standing height \u2014 head at the same level as the standing frame, back straight, knees only slightly bent, never crouching or lunging low. The whole racket is drawn and fully inside the canvas. His shoes are WHITE with RED socks and his shirt is a BRIGHT PURE RED, exactly like the reference \u2014 not brick, not brown, not orange.", + "subject": "Three frames of the same tennis opponent, drawn as coarse low-resolution pixel art, side by side. FRAME 1: a plain standing frame for scale, exactly like the reference. FRAME 2 — THE BACKSWING: he has turned his shoulders and taken the racket BACK BEHIND HIS RIGHT HIP, low and well behind his body, arm coiled, racket head pointing backwards away from the net, weight on his back foot. He has NOT hit the ball yet. FRAME 3 — THE FOLLOW-THROUGH: the swing is FINISHED. His arm has swept all the way ACROSS HIS CHEST to the OTHER SIDE of his body and the racket head is now UP AND OVER HIS LEFT SHOULDER, near his left ear, his chest turned to face the net, weight on his front foot. FRAMES 2 AND 3 MUST LOOK COMPLETELY DIFFERENT FROM EACH OTHER — in frame 2 the racket is BEHIND him on his RIGHT, in frame 3 it is HIGH on his LEFT. This contrast is the whole point of the pair. Every figure is the SAME man as the reference and the SAME size: RED polo shirt, DARK CHARCOAL GREY shorts, RED cloth headband, blond hair, white shoes, seen from the FRONT. Same face, same colours, same proportions. His headband is RED, never white or cream. In both swing frames he stays UPRIGHT at his full standing height — head at the same level as the standing frame, back straight, knees only slightly bent, never crouching or lunging low. The whole racket is drawn and fully inside the canvas. His shoes are WHITE with RED socks and his shirt is a BRIGHT PURE RED, exactly like the reference — not brick, not brown, not orange.", "palette_ref": "o_idle1" }, "opponent_idle": { @@ -420,7 +420,7 @@ ], "anchor": 0, "check": "same", - "subject": "The reference is ONE tennis opponent standing and waiting, gripping a tennis racket in his right hand. Draw TWO frames of that same man waiting to receive, standing at the SAME FULL HEIGHT as the reference: the two frames are one relaxed weight shift, first with his weight on his left foot, then on his right, racket held ready in front of him in both. Every figure is the SAME man as the reference and the SAME size: RED polo shirt, dark grey shorts, RED headband, blond hair, seen from the FRONT across the net. Same face, same colours, same proportions. CRITICAL: the ENTIRE racket \u2014 head, strings, throat and grip \u2014 is fully inside the canvas in both frames, with clear empty space between the racket and every edge. Nothing is cut off at an edge. He stands upright and does not crouch. His headband is RED, the same red as his shirt \u2014 it is NEVER white, cream or grey." + "subject": "The reference is ONE tennis opponent standing and waiting, gripping a tennis racket in his right hand. Draw TWO frames of that same man waiting to receive, standing at the SAME FULL HEIGHT as the reference: the two frames are one relaxed weight shift, first with his weight on his left foot, then on his right, racket held ready in front of him in both. Every figure is the SAME man as the reference and the SAME size: RED polo shirt, dark grey shorts, RED headband, blond hair, seen from the FRONT across the net. Same face, same colours, same proportions. CRITICAL: the ENTIRE racket — head, strings, throat and grip — is fully inside the canvas in both frames, with clear empty space between the racket and every edge. Nothing is cut off at an edge. He stands upright and does not crouch. His headband is RED, the same red as his shirt — it is NEVER white, cream or grey." }, "opponent_toss": { "sprites": [ @@ -430,7 +430,7 @@ "ref": "o_idle1", "anchor": 0, "check": "loose", - "subject": "Three frames of the same tennis opponent, drawn as coarse low-resolution pixel art. FIRST a plain standing frame for scale, exactly like the reference. THEN the ball TOSS \u2014 standing tall, his free hand stretched straight up above his head having just released the ball, racket back and low. THEN the SMASH \u2014 at full stretch, the racket swung up overhead to hit. Every figure is the SAME man as the reference and the SAME size: RED polo shirt, dark grey shorts, RED cloth headband, blond hair, seen from the FRONT. Same face, same colours, same proportions. His headband is RED, the same red as his shirt \u2014 never white, cream or grey. In the toss and smash frames his FEET STAY ON THE GROUND LINE and his body stays the same size as the standing frame; only his arms reach above his head. The whole racket is drawn and fully inside the canvas. His shorts are DARK CHARCOAL GREY, almost black \u2014 the same dark grey as the reference figure standing beside them, definitely NOT pale grey, light grey or blue. His shoes are white. Match the reference palette exactly in every frame.", + "subject": "Three frames of the same tennis opponent, drawn as coarse low-resolution pixel art. FIRST a plain standing frame for scale, exactly like the reference. THEN the ball TOSS — standing tall, his free hand stretched straight up above his head having just released the ball, racket back and low. THEN the SMASH — at full stretch, the racket swung up overhead to hit. Every figure is the SAME man as the reference and the SAME size: RED polo shirt, dark grey shorts, RED cloth headband, blond hair, seen from the FRONT. Same face, same colours, same proportions. His headband is RED, the same red as his shirt — never white, cream or grey. In the toss and smash frames his FEET STAY ON THE GROUND LINE and his body stays the same size as the standing frame; only his arms reach above his head. The whole racket is drawn and fully inside the canvas. His shorts are DARK CHARCOAL GREY, almost black — the same dark grey as the reference figure standing beside them, definitely NOT pale grey, light grey or blue. His shoes are white. Match the reference palette exactly in every frame.", "palette_ref": "o_idle1" }, "opponent_bounce": { @@ -441,7 +441,7 @@ "ref": "o_idle1", "anchor": 0, "check": "loose", - "subject": "Three frames of the same tennis opponent, drawn as coarse low-resolution pixel art. FIRST a plain standing frame for scale, exactly like the reference. THEN TWO frames of him standing at the baseline BOUNCING A BALL on the ground before serving, with NO ball drawn. Every figure is the SAME man as the reference and the SAME size: RED polo shirt, dark grey shorts, RED cloth headband, blond hair, seen from the FRONT. Same face, same colours, same proportions. His headband is RED, the same red as his shirt \u2014 never white, cream or grey. In both bouncing frames his racket is held out to the side in his RIGHT hand \u2014 which is on the LEFT-HAND SIDE OF THE IMAGE \u2014 and his other arm is stretched DOWN AND OUT to the RIGHT-HAND SIDE OF THE IMAGE, well clear of his body, with the palm open and facing the ground as if patting a ball. CRITICAL: the two bouncing frames are otherwise the IDENTICAL drawing \u2014 same stance, same legs, same head, same racket, same size \u2014 and the ONLY difference between them is the height of that patting hand: in the first it is low, near knee height; in the second it is higher, near his waist. Draw NO ball in any frame.", + "subject": "Three frames of the same tennis opponent, drawn as coarse low-resolution pixel art. FIRST a plain standing frame for scale, exactly like the reference. THEN TWO frames of him standing at the baseline BOUNCING A BALL on the ground before serving, with NO ball drawn. Every figure is the SAME man as the reference and the SAME size: RED polo shirt, dark grey shorts, RED cloth headband, blond hair, seen from the FRONT. Same face, same colours, same proportions. His headband is RED, the same red as his shirt — never white, cream or grey. In both bouncing frames his racket is held out to the side in his RIGHT hand — which is on the LEFT-HAND SIDE OF THE IMAGE — and his other arm is stretched DOWN AND OUT to the RIGHT-HAND SIDE OF THE IMAGE, well clear of his body, with the palm open and facing the ground as if patting a ball. CRITICAL: the two bouncing frames are otherwise the IDENTICAL drawing — same stance, same legs, same head, same racket, same size — and the ONLY difference between them is the height of that patting hand: in the first it is low, near knee height; in the second it is higher, near his waist. Draw NO ball in any frame.", "palette_ref": "o_idle1" }, "ballboy_walk": { @@ -497,7 +497,7 @@ ], "anchor": 0, "check": "same", - "subject": "The reference is one big walking zombie seen from the SIDE and facing LEFT. Draw FOUR frames of a walk cycle, seen from the SIDE and facing LEFT, of a dead SECURITY STEWARD working the tournament gate: a big heavy-set man with a shaven head and a thick neck, wearing an open BLACK bomber jacket over a bright YELLOW high-visibility vest with SECURITY in black block letters, a white shirt collar showing at the throat, a red accreditation lanyard, grey-green cargo trousers with deep pockets and visible seams, a chunky leather belt with a silver buckle, tan boots, tattoos down one bare forearm, and a coiled clear earpiece wire running up to one ear. Green-grey dead skin, jaw hanging, teeth bared. He is broad and slab-shouldered \u2014 noticeably heavier than the reference, but still a normal human silhouette \u2014 and he walks with his arms held out from his body, shoving forward. Draw him at the same overall height as the reference. The four frames are the four stages of ONE shambling stride: front leg reaching forward with the GAP BETWEEN THE FEET WIDE; then the feet together and passing; then the other leg reaching forward with the gap wide the other way; then the feet together again. The gap between his feet must visibly open and close, and the arms swing opposite the legs. Output exactly four figures in one row, evenly spaced.", + "subject": "The reference is one big walking zombie seen from the SIDE and facing LEFT. Draw FOUR frames of a walk cycle, seen from the SIDE and facing LEFT, of a dead SECURITY STEWARD working the tournament gate: a big heavy-set man with a shaven head and a thick neck, wearing an open BLACK bomber jacket over a bright YELLOW high-visibility vest with SECURITY in black block letters, a white shirt collar showing at the throat, a red accreditation lanyard, grey-green cargo trousers with deep pockets and visible seams, a chunky leather belt with a silver buckle, tan boots, tattoos down one bare forearm, and a coiled clear earpiece wire running up to one ear. Green-grey dead skin, jaw hanging, teeth bared. He is broad and slab-shouldered — noticeably heavier than the reference, but still a normal human silhouette — and he walks with his arms held out from his body, shoving forward. Draw him at the same overall height as the reference. The four frames are the four stages of ONE shambling stride: front leg reaching forward with the GAP BETWEEN THE FEET WIDE; then the feet together and passing; then the other leg reaching forward with the gap wide the other way; then the feet together again. The gap between his feet must visibly open and close, and the arms swing opposite the legs. Output exactly four figures in one row, evenly spaced.", "state": true }, "bouncer_w1": { @@ -536,7 +536,7 @@ ], "anchor": 0, "check": "same", - "subject": "The reference is the dead SECURITY steward in his black bomber jacket over a bright yellow hi-vis vest, seen from the SIDE and facing LEFT. Draw TWO frames of that SAME man, the same size and bulk and the same clothes, still walking, now WOUNDED: both arms are gone at the shoulders AND he has no head at all \u2014 the neck ends in a ragged red stump at shoulder height, no skull, no face \u2014 the earpiece wire dangling loose into the wound. Do not slim him down. The two frames are the two halves of ONE stride: in the first the front foot is far forward and the GAP BETWEEN THE FEET IS WIDE, in the second the feet are together and passing. Output exactly two figures in one row.", + "subject": "The reference is the dead SECURITY steward in his black bomber jacket over a bright yellow hi-vis vest, seen from the SIDE and facing LEFT. Draw TWO frames of that SAME man, the same size and bulk and the same clothes, still walking, now WOUNDED: both arms are gone at the shoulders AND he has no head at all — the neck ends in a ragged red stump at shoulder height, no skull, no face — the earpiece wire dangling loose into the wound. Do not slim him down. The two frames are the two halves of ONE stride: in the first the front foot is far forward and the GAP BETWEEN THE FEET IS WIDE, in the second the feet are together and passing. Output exactly two figures in one row.", "state": true }, "roller_walk": { @@ -551,7 +551,7 @@ ], "anchor": 0, "check": "same", - "subject": "The reference is one enormous walking zombie brute seen from the SIDE and facing LEFT. Draw FOUR frames of a heavy walk cycle, seen from the SIDE and facing LEFT, of a dead GROUNDSMAN hauling a heavy court roller: a colossal man in filthy green overalls with the sleeves cut off, a leather tool belt, mud-caked rubber boots, leaning hard into a two-handed steel T-handle. The roller itself is a squat heavy cylinder on a short frame close behind his heels \u2014 it must stay small and entirely INSIDE his own frame, never reaching toward the next figure. Green-grey dead skin, one eye gone, teeth bared with effort. He is even bigger and heavier than the reference, hunched forward under the load. The four frames are the four stages of ONE shambling stride: front leg reaching forward with the GAP BETWEEN THE FEET WIDE; then the feet together and passing; then the other leg reaching forward with the gap wide the other way; then the feet together again. The gap between his feet must visibly open and close, and the arms swing opposite the legs. Output exactly four figures in one row, evenly spaced.", + "subject": "The reference is one enormous walking zombie brute seen from the SIDE and facing LEFT. Draw FOUR frames of a heavy walk cycle, seen from the SIDE and facing LEFT, of a dead GROUNDSMAN hauling a heavy court roller: a colossal man in filthy green overalls with the sleeves cut off, a leather tool belt, mud-caked rubber boots, leaning hard into a two-handed steel T-handle. The roller itself is a squat heavy cylinder on a short frame close behind his heels — it must stay small and entirely INSIDE his own frame, never reaching toward the next figure. Green-grey dead skin, one eye gone, teeth bared with effort. He is even bigger and heavier than the reference, hunched forward under the load. The four frames are the four stages of ONE shambling stride: front leg reaching forward with the GAP BETWEEN THE FEET WIDE; then the feet together and passing; then the other leg reaching forward with the gap wide the other way; then the feet together again. The gap between his feet must visibly open and close, and the arms swing opposite the legs. Output exactly four figures in one row, evenly spaced.", "state": true }, "roller_w1": { @@ -564,7 +564,7 @@ ], "anchor": 0, "check": "any", - "subject": "The reference is the dead groundsman in filthy green overalls, seen from the SIDE and facing LEFT. Draw TWO frames of that SAME man, the same colossal size and bulk and the same overalls, still walking, now WOUNDED: the arm on the right-hand side of the image is COMPLETELY GONE \u2014 severed at the shoulder joint, no upper arm, no forearm, no hand, nothing below it but a ragged red stump of bone and muscle at the shoulder \u2014 while his other arm still grips the roller handle. He must stay exactly as enormous \u2014 do not slim him down as the damage grows. The two frames are the two halves of ONE stride: in the first the front foot is far forward and the GAP BETWEEN THE FEET IS WIDE, in the second the feet are together and passing. Output exactly two figures in one row.", + "subject": "The reference is the dead groundsman in filthy green overalls, seen from the SIDE and facing LEFT. Draw TWO frames of that SAME man, the same colossal size and bulk and the same overalls, still walking, now WOUNDED: the arm on the right-hand side of the image is COMPLETELY GONE — severed at the shoulder joint, no upper arm, no forearm, no hand, nothing below it but a ragged red stump of bone and muscle at the shoulder — while his other arm still grips the roller handle. He must stay exactly as enormous — do not slim him down as the damage grows. The two frames are the two halves of ONE stride: in the first the front foot is far forward and the GAP BETWEEN THE FEET IS WIDE, in the second the feet are together and passing. Output exactly two figures in one row.", "state": true }, "roller_w2": { @@ -577,7 +577,7 @@ ], "anchor": 0, "check": "any", - "subject": "The reference is the dead groundsman in filthy green overalls, seen from the SIDE and facing LEFT. Draw TWO frames of that SAME man, the same colossal size and bulk and the same overalls, still walking, now WOUNDED: BOTH arms are torn off at the shoulders leaving two bloody stumps and the roller is gone entirely. He must stay exactly as enormous \u2014 do not slim him down as the damage grows. The two frames are the two halves of ONE stride: in the first the front foot is far forward and the GAP BETWEEN THE FEET IS WIDE, in the second the feet are together and passing. Output exactly two figures in one row.", + "subject": "The reference is the dead groundsman in filthy green overalls, seen from the SIDE and facing LEFT. Draw TWO frames of that SAME man, the same colossal size and bulk and the same overalls, still walking, now WOUNDED: BOTH arms are torn off at the shoulders leaving two bloody stumps and the roller is gone entirely. He must stay exactly as enormous — do not slim him down as the damage grows. The two frames are the two halves of ONE stride: in the first the front foot is far forward and the GAP BETWEEN THE FEET IS WIDE, in the second the feet are together and passing. Output exactly two figures in one row.", "state": true }, "roller_w3": { @@ -590,7 +590,7 @@ ], "anchor": 0, "check": "same", - "subject": "The reference is the dead groundsman in filthy green overalls, seen from the SIDE and facing LEFT. Draw TWO frames of that SAME man, the same colossal size and bulk and the same overalls, still walking, now WOUNDED: both arms are gone AND his chest and belly are torn wide open with the ribs showing through, the overalls hanging in bloody strips. He must stay exactly as enormous \u2014 do not slim him down as the damage grows. The two frames are the two halves of ONE stride: in the first the front foot is far forward and the GAP BETWEEN THE FEET IS WIDE, in the second the feet are together and passing. Output exactly two figures in one row.", + "subject": "The reference is the dead groundsman in filthy green overalls, seen from the SIDE and facing LEFT. Draw TWO frames of that SAME man, the same colossal size and bulk and the same overalls, still walking, now WOUNDED: both arms are gone AND his chest and belly are torn wide open with the ribs showing through, the overalls hanging in bloody strips. He must stay exactly as enormous — do not slim him down as the damage grows. The two frames are the two halves of ONE stride: in the first the front foot is far forward and the GAP BETWEEN THE FEET IS WIDE, in the second the feet are together and passing. Output exactly two figures in one row.", "state": true }, "roller_w4": { @@ -603,7 +603,7 @@ ], "anchor": 0, "check": "same", - "subject": "The reference is the dead groundsman in filthy green overalls, seen from the SIDE and facing LEFT. Draw TWO frames of that SAME man, the same colossal size and bulk and the same overalls, still walking, now WOUNDED: both arms are gone, the chest is torn open with ribs showing, AND he has no head at all \u2014 the neck ends in a ragged red stump at shoulder height. He must stay exactly as enormous \u2014 do not slim him down as the damage grows. The two frames are the two halves of ONE stride: in the first the front foot is far forward and the GAP BETWEEN THE FEET IS WIDE, in the second the feet are together and passing. Output exactly two figures in one row.", + "subject": "The reference is the dead groundsman in filthy green overalls, seen from the SIDE and facing LEFT. Draw TWO frames of that SAME man, the same colossal size and bulk and the same overalls, still walking, now WOUNDED: both arms are gone, the chest is torn open with ribs showing, AND he has no head at all — the neck ends in a ragged red stump at shoulder height. He must stay exactly as enormous — do not slim him down as the damage grows. The two frames are the two halves of ONE stride: in the first the front foot is far forward and the GAP BETWEEN THE FEET IS WIDE, in the second the feet are together and passing. Output exactly two figures in one row.", "state": true }, "boss_coach_walk": { @@ -617,7 +617,7 @@ "anchor": 0, "check": "same", "newart": true, - "subject": "The reference is a huge chapter-boss zombie drawn FACING THE VIEWER. Draw TWO frames of a DIFFERENT boss in that same front-facing style and at that same enormous size: THE HEAD COACH \u2014 a towering dead tennis coach facing the viewer, in a zipped navy and white tracksuit with a national-team crest on the chest and white piping down the sleeves, a steel whistle on a cord round his neck, wraparound sunglasses pushed up on his forehead, and a wire ball-hopper basket full of tennis balls gripped in one huge fist. Green-grey dead skin, hollow cheeks, teeth bared in a shout. In both frames his chest and face point straight at the viewer. The two frames are two stages of one heavy stride straight toward the viewer, one knee lifted in each. Output exactly two figures in one row." + "subject": "The reference is a huge chapter-boss zombie drawn FACING THE VIEWER. Draw TWO frames of a DIFFERENT boss in that same front-facing style and at that same enormous size: THE HEAD COACH — a towering dead tennis coach facing the viewer, in a zipped navy and white tracksuit with a national-team crest on the chest and white piping down the sleeves, a steel whistle on a cord round his neck, wraparound sunglasses pushed up on his forehead, and a wire ball-hopper basket full of tennis balls gripped in one huge fist. Green-grey dead skin, hollow cheeks, teeth bared in a shout. In both frames his chest and face point straight at the viewer. The two frames are two stages of one heavy stride straight toward the viewer, one knee lifted in each. Output exactly two figures in one row." }, "boss_coach_wounds": { "sprites": [ @@ -630,7 +630,7 @@ ], "anchor": 0, "check": "loose", - "subject": "The reference is THE HEAD COACH \u2014 a towering dead tennis coach facing the viewer, in a zipped navy and white tracksuit with a national-team crest on the chest and white piping down the sleeves, a steel whistle on a cord round his neck, wraparound sunglasses pushed up on his forehead, and a wire ball-hopper basket full of tennis balls gripped in one huge fist. Green-grey dead skin, hollow cheeks, teeth bared in a shout, facing the viewer. Draw THREE frames of that SAME boss, the same enormous size and the same costume, standing and facing the viewer, as three worsening stages of damage: (1) the arm on the left-hand side of the image is torn off at the shoulder leaving a ragged bloody stump \u2014 the OTHER arm is untouched and still holding what it held; (2) his chest and belly are torn wide open with the ribs showing through and the clothing hanging in bloody strips \u2014 one arm is still whole and still holding what it held; (3) his chest is torn open with ribs showing AND he has no head at all, the neck ending in a ragged red stump at shoulder height \u2014 one arm is still whole and still holding what it held. He must stay the same enormous size in all three \u2014 do not slim him down as the damage grows. Output exactly three figures in one row.", + "subject": "The reference is THE HEAD COACH — a towering dead tennis coach facing the viewer, in a zipped navy and white tracksuit with a national-team crest on the chest and white piping down the sleeves, a steel whistle on a cord round his neck, wraparound sunglasses pushed up on his forehead, and a wire ball-hopper basket full of tennis balls gripped in one huge fist. Green-grey dead skin, hollow cheeks, teeth bared in a shout, facing the viewer. Draw THREE frames of that SAME boss, the same enormous size and the same costume, standing and facing the viewer, as three worsening stages of damage: (1) the arm on the left-hand side of the image is torn off at the shoulder leaving a ragged bloody stump — the OTHER arm is untouched and still holding what it held; (2) his chest and belly are torn wide open with the ribs showing through and the clothing hanging in bloody strips — one arm is still whole and still holding what it held; (3) his chest is torn open with ribs showing AND he has no head at all, the neck ending in a ragged red stump at shoulder height — one arm is still whole and still holding what it held. He must stay the same enormous size in all three — do not slim him down as the damage grows. Output exactly three figures in one row.", "state": true }, "boss_coach_throw": { @@ -648,7 +648,7 @@ ], "anchor": 0, "check": "loose", - "subject": "The reference shows the SAME boss in four states: undamaged, then three worsening stages of damage. Draw all FOUR of those exact states again, in the same order, same size, same costume, same wounds \u2014 but each one caught MID-THROW: the whole body wound up and twisted, the surviving arm drawn back high over the shoulder about to hurl a tennis ball straight at the viewer, weight on the back foot. The wounds must stay clearly visible in every frame. Output exactly four figures in one row.", + "subject": "The reference shows the SAME boss in four states: undamaged, then three worsening stages of damage. Draw all FOUR of those exact states again, in the same order, same size, same costume, same wounds — but each one caught MID-THROW: the whole body wound up and twisted, the surviving arm drawn back high over the shoulder about to hurl a tennis ball straight at the viewer, weight on the back foot. The wounds must stay clearly visible in every frame. Output exactly four figures in one row.", "state": true }, "boss_physio_walk": { @@ -662,7 +662,7 @@ "anchor": 0, "check": "same", "newart": true, - "subject": "The reference is a huge chapter-boss zombie drawn FACING THE VIEWER. Draw TWO frames of a DIFFERENT boss in that same front-facing style and at that same enormous size: THE PHYSIO \u2014 a towering dead sports physiotherapist facing the viewer, in a white medical polo with a red cross on the breast and blood to the elbows, torn blue latex gloves, a bandolier of rolled strapping tape across the chest, a folding massage table strapped flat to his back, an ice pack gripped in one huge fist. Green-grey dead skin, wire-framed glasses cracked across one lens, jaw slack. In both frames his chest and face point straight at the viewer. The two frames are two stages of one heavy stride straight toward the viewer, one knee lifted in each. Output exactly two figures in one row." + "subject": "The reference is a huge chapter-boss zombie drawn FACING THE VIEWER. Draw TWO frames of a DIFFERENT boss in that same front-facing style and at that same enormous size: THE PHYSIO — a towering dead sports physiotherapist facing the viewer, in a white medical polo with a red cross on the breast and blood to the elbows, torn blue latex gloves, a bandolier of rolled strapping tape across the chest, a folding massage table strapped flat to his back, an ice pack gripped in one huge fist. Green-grey dead skin, wire-framed glasses cracked across one lens, jaw slack. In both frames his chest and face point straight at the viewer. The two frames are two stages of one heavy stride straight toward the viewer, one knee lifted in each. Output exactly two figures in one row." }, "boss_physio_wounds": { "sprites": [ @@ -675,7 +675,7 @@ ], "anchor": 0, "check": "loose", - "subject": "The reference is THE PHYSIO \u2014 a towering dead sports physiotherapist facing the viewer, in a white medical polo with a red cross on the breast and blood to the elbows, torn blue latex gloves, a bandolier of rolled strapping tape across the chest, a folding massage table strapped flat to his back, an ice pack gripped in one huge fist. Green-grey dead skin, wire-framed glasses cracked across one lens, jaw slack, facing the viewer. Draw THREE frames of that SAME boss, the same enormous size and the same costume, standing and facing the viewer, as three worsening stages of damage: (1) the arm on the left-hand side of the image is torn off at the shoulder leaving a ragged bloody stump \u2014 the OTHER arm is untouched and still holding what it held; (2) his chest and belly are torn wide open with the ribs showing through and the clothing hanging in bloody strips \u2014 one arm is still whole and still holding what it held; (3) his chest is torn open with ribs showing AND he has no head at all, the neck ending in a ragged red stump at shoulder height \u2014 one arm is still whole and still holding what it held. He must stay the same enormous size in all three \u2014 do not slim him down as the damage grows. Output exactly three figures in one row.", + "subject": "The reference is THE PHYSIO — a towering dead sports physiotherapist facing the viewer, in a white medical polo with a red cross on the breast and blood to the elbows, torn blue latex gloves, a bandolier of rolled strapping tape across the chest, a folding massage table strapped flat to his back, an ice pack gripped in one huge fist. Green-grey dead skin, wire-framed glasses cracked across one lens, jaw slack, facing the viewer. Draw THREE frames of that SAME boss, the same enormous size and the same costume, standing and facing the viewer, as three worsening stages of damage: (1) the arm on the left-hand side of the image is torn off at the shoulder leaving a ragged bloody stump — the OTHER arm is untouched and still holding what it held; (2) his chest and belly are torn wide open with the ribs showing through and the clothing hanging in bloody strips — one arm is still whole and still holding what it held; (3) his chest is torn open with ribs showing AND he has no head at all, the neck ending in a ragged red stump at shoulder height — one arm is still whole and still holding what it held. He must stay the same enormous size in all three — do not slim him down as the damage grows. Output exactly three figures in one row.", "state": true }, "boss_physio_throw": { @@ -693,7 +693,7 @@ ], "anchor": 0, "check": "loose", - "subject": "The reference shows the SAME boss in four states: undamaged, then three worsening stages of damage. Draw all FOUR of those exact states again, in the same order, same size, same costume, same wounds \u2014 but each one caught MID-THROW: the whole body wound up and twisted, the surviving arm drawn back high over the shoulder about to hurl a tennis ball straight at the viewer, weight on the back foot. The wounds must stay clearly visible in every frame. Output exactly four figures in one row.", + "subject": "The reference shows the SAME boss in four states: undamaged, then three worsening stages of damage. Draw all FOUR of those exact states again, in the same order, same size, same costume, same wounds — but each one caught MID-THROW: the whole body wound up and twisted, the surviving arm drawn back high over the shoulder about to hurl a tennis ball straight at the viewer, weight on the back foot. The wounds must stay clearly visible in every frame. Output exactly four figures in one row.", "state": true }, "boss_mascot_walk": { @@ -707,7 +707,7 @@ "anchor": 0, "check": "same", "newart": true, - "subject": "The reference is a huge chapter-boss zombie drawn FACING THE VIEWER. Draw TWO frames of a DIFFERENT boss in that same front-facing style and at that same enormous size: THE SPONSOR MASCOT \u2014 a towering dead tournament mascot facing the viewer, wearing a giant fuzzy tennis-ball costume: an enormous yellow-green foam sphere for a head and body with the white curved seam painted across it, stubby green sleeves and leggings, oversized cartoon shoes, white gloves. Through a dark mesh mouth-hole in the ball a rotting green face is just visible. He grips a tennis ball in one glove. In both frames his chest and face point straight at the viewer. The two frames are two stages of one heavy stride straight toward the viewer, one knee lifted in each. Output exactly two figures in one row." + "subject": "The reference is a huge chapter-boss zombie drawn FACING THE VIEWER. Draw TWO frames of a DIFFERENT boss in that same front-facing style and at that same enormous size: THE SPONSOR MASCOT — a towering dead tournament mascot facing the viewer, wearing a giant fuzzy tennis-ball costume: an enormous yellow-green foam sphere for a head and body with the white curved seam painted across it, stubby green sleeves and leggings, oversized cartoon shoes, white gloves. Through a dark mesh mouth-hole in the ball a rotting green face is just visible. He grips a tennis ball in one glove. In both frames his chest and face point straight at the viewer. The two frames are two stages of one heavy stride straight toward the viewer, one knee lifted in each. Output exactly two figures in one row." }, "boss_mascot_wounds": { "sprites": [ @@ -720,7 +720,7 @@ ], "anchor": 0, "check": "loose", - "subject": "The reference is THE SPONSOR MASCOT \u2014 a towering dead tournament mascot facing the viewer, wearing a giant fuzzy tennis-ball costume: an enormous yellow-green foam sphere for a head and body with the white curved seam painted across it, stubby green sleeves and leggings, oversized cartoon shoes, white gloves. Through a dark mesh mouth-hole in the ball a rotting green face is just visible. He grips a tennis ball in one glove, facing the viewer. Draw THREE frames of that SAME boss, the same enormous size and the same costume, standing and facing the viewer, as three worsening stages of damage: (1) the arm on the left-hand side of the image is torn off at the shoulder leaving a ragged bloody stump \u2014 the OTHER arm is untouched and still holding what it held; (2) his chest and belly are torn wide open with the ribs showing through and the clothing hanging in bloody strips \u2014 one arm is still whole and still holding what it held; (3) his chest is torn open with ribs showing AND he has no head at all, the neck ending in a ragged red stump at shoulder height \u2014 one arm is still whole and still holding what it held. He must stay the same enormous size in all three \u2014 do not slim him down as the damage grows. Output exactly three figures in one row.", + "subject": "The reference is THE SPONSOR MASCOT — a towering dead tournament mascot facing the viewer, wearing a giant fuzzy tennis-ball costume: an enormous yellow-green foam sphere for a head and body with the white curved seam painted across it, stubby green sleeves and leggings, oversized cartoon shoes, white gloves. Through a dark mesh mouth-hole in the ball a rotting green face is just visible. He grips a tennis ball in one glove, facing the viewer. Draw THREE frames of that SAME boss, the same enormous size and the same costume, standing and facing the viewer, as three worsening stages of damage: (1) the arm on the left-hand side of the image is torn off at the shoulder leaving a ragged bloody stump — the OTHER arm is untouched and still holding what it held; (2) his chest and belly are torn wide open with the ribs showing through and the clothing hanging in bloody strips — one arm is still whole and still holding what it held; (3) his chest is torn open with ribs showing AND he has no head at all, the neck ending in a ragged red stump at shoulder height — one arm is still whole and still holding what it held. He must stay the same enormous size in all three — do not slim him down as the damage grows. Output exactly three figures in one row.", "state": true }, "boss_mascot_throw": { @@ -738,7 +738,7 @@ ], "anchor": 0, "check": "loose", - "subject": "The reference shows the SAME boss in four states: undamaged, then three worsening stages of damage. Draw all FOUR of those exact states again, in the same order, same size, same costume, same wounds \u2014 but each one caught MID-THROW: the whole body wound up and twisted, the surviving arm drawn back high over the shoulder about to hurl a tennis ball straight at the viewer, weight on the back foot. The wounds must stay clearly visible in every frame. Output exactly four figures in one row.", + "subject": "The reference shows the SAME boss in four states: undamaged, then three worsening stages of damage. Draw all FOUR of those exact states again, in the same order, same size, same costume, same wounds — but each one caught MID-THROW: the whole body wound up and twisted, the surviving arm drawn back high over the shoulder about to hurl a tennis ball straight at the viewer, weight on the back foot. The wounds must stay clearly visible in every frame. Output exactly four figures in one row.", "state": true }, "barrel": { @@ -753,7 +753,7 @@ "check": "any", "newart": true, "h": 150, - "subject": "The reference is a piece of tennis-court equipment drawn as pixel art, seen from the side. Draw TWO frames of a DIFFERENT object in that same style: a squat STEEL DRUM lying on its side like a barrel about to be rolled, banded with two raised hoops, its curved end-cap facing the viewer. The drum is DARK GUNMETAL GREY steel, heavily dented and streaked with rust, with bold YELLOW AND BLACK hazard chevrons stencilled around the middle band and a thin band of glowing PALE CYAN-WHITE light leaking from the seams between the staves. IMPORTANT: no part of the drum may be pink, magenta, purple or violet \u2014 use only grey steel, rust brown, yellow, black and pale cyan-white. It is a wide low object, clearly wider than it is tall, and it sits ON THE GROUND. The two frames are the same drum rotated part of a turn, so the hoops, chevrons and dents sit at visibly DIFFERENT angles \u2014 frame two is rolled about a third of a turn from frame one. Output exactly two objects in one row, evenly spaced." + "subject": "The reference is a piece of tennis-court equipment drawn as pixel art, seen from the side. Draw TWO frames of a DIFFERENT object in that same style: a squat STEEL DRUM lying on its side like a barrel about to be rolled, banded with two raised hoops, its curved end-cap facing the viewer. The drum is DARK GUNMETAL GREY steel, heavily dented and streaked with rust, with bold YELLOW AND BLACK hazard chevrons stencilled around the middle band and a thin band of glowing PALE CYAN-WHITE light leaking from the seams between the staves. IMPORTANT: no part of the drum may be pink, magenta, purple or violet — use only grey steel, rust brown, yellow, black and pale cyan-white. It is a wide low object, clearly wider than it is tall, and it sits ON THE GROUND. The two frames are the same drum rotated part of a turn, so the hoops, chevrons and dents sit at visibly DIFFERENT angles — frame two is rolled about a third of a turn from frame one. Output exactly two objects in one row, evenly spaced." }, "player_f_stance": { "sprites": [ @@ -768,7 +768,7 @@ "newart": true, "check": "same", "anchor": 0, - "subject": "Four frames of a female tennis player in a bright white short-sleeved shirt and a WHITE PLEATED TENNIS SKIRT (a short flared skirt, clearly NOT shorts), white socks and white tennis shoes, her hair tied back in a PONYTAIL. She is the same height and the same drawing style as the reference and stands on the same ground line, but she is a woman, not the man in the reference. Every figure is seen strictly FROM BEHIND \u2014 the back of her head, her ponytail and the back of her shirt face the viewer, NO face, NO eyes, NO nose, NO mouth. Every figure is drawn from exactly the same viewpoint: same camera height, same distance, straight on, no foreshortening, no worm's-eye or bird's-eye angle, no three-quarter turn. She is RIGHT-HANDED and the racket NEVER changes hands: in every frame the racket is in her RIGHT hand, which \u2014 because she is drawn from behind \u2014 is on the RIGHT-HAND SIDE OF THE IMAGE. Her empty left arm is on the LEFT-HAND SIDE OF THE IMAGE. Draw NO ball anywhere in any frame \u2014 the game draws the ball. Frame 1: she stands upright and relaxed at the baseline, weight on her left foot, racket hanging at her right side. Frame 2: the same stance with her weight shifted onto her right foot \u2014 identical otherwise. Frame 3: she leans forward slightly and her empty LEFT hand reaches DOWN and out to the LEFT, palm low near her knee, as if she had just patted a ball to the ground. Frame 4: the same stance with that same LEFT hand raised, palm out at about waist height, as if the ball had bounced back up to it. Frames 3 and 4 must be the SAME drawing with only the left hand's height changed \u2014 identical legs, identical body, identical racket." + "subject": "Four frames of a female tennis player in a bright white short-sleeved shirt and a WHITE PLEATED TENNIS SKIRT (a short flared skirt, clearly NOT shorts), white socks and white tennis shoes, her hair tied back in a PONYTAIL. She is the same height and the same drawing style as the reference and stands on the same ground line, but she is a woman, not the man in the reference. Every figure is seen strictly FROM BEHIND — the back of her head, her ponytail and the back of her shirt face the viewer, NO face, NO eyes, NO nose, NO mouth. Every figure is drawn from exactly the same viewpoint: same camera height, same distance, straight on, no foreshortening, no worm's-eye or bird's-eye angle, no three-quarter turn. She is RIGHT-HANDED and the racket NEVER changes hands: in every frame the racket is in her RIGHT hand, which — because she is drawn from behind — is on the RIGHT-HAND SIDE OF THE IMAGE. Her empty left arm is on the LEFT-HAND SIDE OF THE IMAGE. Draw NO ball anywhere in any frame — the game draws the ball. Frame 1: she stands upright and relaxed at the baseline, weight on her left foot, racket hanging at her right side. Frame 2: the same stance with her weight shifted onto her right foot — identical otherwise. Frame 3: she leans forward slightly and her empty LEFT hand reaches DOWN and out to the LEFT, palm low near her knee, as if she had just patted a ball to the ground. Frame 4: the same stance with that same LEFT hand raised, palm out at about waist height, as if the ball had bounced back up to it. Frames 3 and 4 must be the SAME drawing with only the left hand's height changed — identical legs, identical body, identical racket." }, "opp_f_stance": { "sprites": [ @@ -807,7 +807,7 @@ "newart": true, "check": "same", "anchor": 0, - "subject": "Five frames of the same FEMALE ZOMBIE TENNIS PLAYER facing the viewer \u2014 she is the turned opponent: grey-green dead skin, sunken eyes, a red headband, a RED shirt torn and bloodstained, a DARK PLEATED TENNIS SKIRT, her hair still in a matted PONYTAIL, a wooden racket hanging from one hand. She is the same height and drawing style as the reference but she is a woman, not the man in the reference. First a plain STANDING frame for scale, then a four-frame shuffle straight TOWARDS the camera, arms hanging, the stride alternating." + "subject": "Five frames of the same FEMALE ZOMBIE TENNIS PLAYER facing the viewer — she is the turned opponent: grey-green dead skin, sunken eyes, a red headband, a RED shirt torn and bloodstained, a DARK PLEATED TENNIS SKIRT, her hair still in a matted PONYTAIL, a wooden racket hanging from one hand. She is the same height and drawing style as the reference but she is a woman, not the man in the reference. First a plain STANDING frame for scale, then a four-frame shuffle straight TOWARDS the camera, arms hanging, the stride alternating." }, "cpu_f_wounds": { "sprites": [ @@ -824,7 +824,7 @@ "newart": true, "check": "same", "anchor": 0, - "subject": "Four frames of the FEMALE ZOMBIE TENNIS PLAYER shown in the FIRST reference image \u2014 same woman, same red torn shirt, same dark pleated tennis skirt, same grey-green skin, facing the viewer. The second and third reference images show the two DAMAGE STAGES to copy onto her. Frame 1: her racket arm has been torn off at the shoulder, the stump gushing, still walking, left leg forward. Frame 2: HEADLESS \u2014 her head and ponytail are gone entirely and the neck is a ragged stump, so this figure is A CLEAR HEAD SHORTER THAN THE OTHERS, still walking, left leg forward. Frame 3: identical to frame 1 but with the RIGHT leg forward instead. Frame 4: identical to frame 2 but with the RIGHT leg forward instead. Frames 1 and 3 must be the same drawing with only the legs swapped, and so must frames 2 and 4." + "subject": "Four frames of the FEMALE ZOMBIE TENNIS PLAYER shown in the FIRST reference image — same woman, same red torn shirt, same dark pleated tennis skirt, same grey-green skin, facing the viewer. The second and third reference images show the two DAMAGE STAGES to copy onto her. Frame 1: her racket arm has been torn off at the shoulder, the stump gushing, still walking, left leg forward. Frame 2: HEADLESS — her head and ponytail are gone entirely and the neck is a ragged stump, so this figure is A CLEAR HEAD SHORTER THAN THE OTHERS, still walking, left leg forward. Frame 3: identical to frame 1 but with the RIGHT leg forward instead. Frame 4: identical to frame 2 but with the RIGHT leg forward instead. Frames 1 and 3 must be the same drawing with only the legs swapped, and so must frames 2 and 4." }, "player_f_serve": { "sprites": [ @@ -838,7 +838,7 @@ "pose": true, "check": "same", "anchor": 0, - "subject": "Three frames of the woman in the reference \u2014 same DARK ALMOST-BLACK ponytail, same white shirt, same white pleated tennis skirt. She is seen strictly FROM BEHIND \u2014 the back of her head, her ponytail and the back of her shirt face the viewer, NO face, NO eyes, NO nose, NO mouth \u2014 from exactly the reference's viewpoint: same camera height, same distance, straight on, no foreshortening and no three-quarter turn. She is RIGHT-HANDED and the racket NEVER changes hands: in every frame the racket is in her RIGHT hand, which \u2014 because she is drawn from behind \u2014 is on the RIGHT-HAND SIDE OF THE IMAGE. Her empty left arm is on the LEFT-HAND SIDE OF THE IMAGE. Draw NO ball anywhere in any frame \u2014 the game draws the ball. Frame 1: the serve toss \u2014 her empty LEFT arm thrown straight UP above her head, fingers open, the racket in her right hand still held low. Frame 2: the smash \u2014 at full stretch, up on her toes, the racket in her right hand swung high overhead and slightly forward. Frame 3: the wind-up \u2014 coiled, knees bent, the racket in her right hand DROPPED DOWN AND BACK BEHIND her with its head pointing at the ground." + "subject": "Three frames of the woman in the reference — same DARK ALMOST-BLACK ponytail, same white shirt, same white pleated tennis skirt. She is seen strictly FROM BEHIND — the back of her head, her ponytail and the back of her shirt face the viewer, NO face, NO eyes, NO nose, NO mouth — from exactly the reference's viewpoint: same camera height, same distance, straight on, no foreshortening and no three-quarter turn. She is RIGHT-HANDED and the racket NEVER changes hands: in every frame the racket is in her RIGHT hand, which — because she is drawn from behind — is on the RIGHT-HAND SIDE OF THE IMAGE. Her empty left arm is on the LEFT-HAND SIDE OF THE IMAGE. Draw NO ball anywhere in any frame — the game draws the ball. Frame 1: the serve toss — her empty LEFT arm thrown straight UP above her head, fingers open, the racket in her right hand still held low. Frame 2: the smash — at full stretch, up on her toes, the racket in her right hand swung high overhead and slightly forward. Frame 3: the wind-up — coiled, knees bent, the racket in her right hand DROPPED DOWN AND BACK BEHIND her with its head pointing at the ground." }, "player_f_run": { "sprites": [ @@ -853,7 +853,7 @@ "pose": true, "check": "same", "anchor": 0, - "subject": "Four frames of the woman in the reference \u2014 same DARK ALMOST-BLACK ponytail, same white shirt, same white pleated tennis skirt. She is seen strictly FROM BEHIND, RUNNING DIRECTLY AWAY FROM THE CAMERA up the court, so you see her back and the soles of her shoes lifting behind her \u2014 NEVER in profile, NEVER from the side, NO face. She leans forward, arms swinging, ponytail lifting, and carries NO racket. The four frames are ONE FULL STRIDE and each must be a clearly DIFFERENT leg position: Frame 1 \u2014 her LEFT leg is kicked up and bent behind her with the sole of her LEFT shoe turned towards the camera, while her RIGHT leg is straight and planted on the ground. Frame 2 \u2014 both legs are together underneath her, passing each other, neither lifted, both shoes near the ground. Frame 3 \u2014 the MIRROR of frame 1: her RIGHT leg is kicked up and bent behind her with the sole of her RIGHT shoe turned towards the camera, while her LEFT leg is straight and planted. Frame 4 \u2014 both legs together passing again, the opposite arm forward from frame 2. Frames 1 and 3 must lift OPPOSITE legs and must not be the same drawing; frames 2 and 4 must swing opposite arms. All four figures are exactly the same height." + "subject": "Four frames of the woman in the reference — same DARK ALMOST-BLACK ponytail, same white shirt, same white pleated tennis skirt. She is seen strictly FROM BEHIND, RUNNING DIRECTLY AWAY FROM THE CAMERA up the court, so you see her back and the soles of her shoes lifting behind her — NEVER in profile, NEVER from the side, NO face. She leans forward, arms swinging, ponytail lifting, and carries NO racket. The four frames are ONE FULL STRIDE and each must be a clearly DIFFERENT leg position: Frame 1 — her LEFT leg is kicked up and bent behind her with the sole of her LEFT shoe turned towards the camera, while her RIGHT leg is straight and planted on the ground. Frame 2 — both legs are together underneath her, passing each other, neither lifted, both shoes near the ground. Frame 3 — the MIRROR of frame 1: her RIGHT leg is kicked up and bent behind her with the sole of her RIGHT shoe turned towards the camera, while her LEFT leg is straight and planted. Frame 4 — both legs together passing again, the opposite arm forward from frame 2. Frames 1 and 3 must lift OPPOSITE legs and must not be the same drawing; frames 2 and 4 must swing opposite arms. All four figures are exactly the same height." }, "player_f_swing": { "sprites": [ @@ -866,7 +866,7 @@ "pose": true, "check": "same", "anchor": 0, - "subject": "Two frames of the woman in the reference \u2014 same DARK ALMOST-BLACK ponytail, same white shirt, same white pleated tennis skirt, same FULL-COLOUR drawing style. She is seen strictly FROM BEHIND \u2014 the back of her head, her ponytail and the back of her shirt face the viewer, NO face, NO eyes, NO nose, NO mouth \u2014 from exactly the reference's viewpoint: same camera height, same distance, straight on, no foreshortening and no three-quarter turn. She is RIGHT-HANDED and the racket NEVER changes hands: in every frame the racket is in her RIGHT hand, which \u2014 because she is drawn from behind \u2014 is on the RIGHT-HAND SIDE OF THE IMAGE. Her empty left arm is on the LEFT-HAND SIDE OF THE IMAGE. Draw NO ball anywhere in any frame \u2014 the game draws the ball. Frame 1: a forehand wound up \u2014 the racket drawn back low across her body to her right, shoulders turned. Frame 2: the same forehand followed through \u2014 the racket swung up and across to her left, hips turned through. In both she still faces AWAY from the camera, up the court." + "subject": "Two frames of the woman in the reference — same DARK ALMOST-BLACK ponytail, same white shirt, same white pleated tennis skirt, same FULL-COLOUR drawing style. She is seen strictly FROM BEHIND — the back of her head, her ponytail and the back of her shirt face the viewer, NO face, NO eyes, NO nose, NO mouth — from exactly the reference's viewpoint: same camera height, same distance, straight on, no foreshortening and no three-quarter turn. She is RIGHT-HANDED and the racket NEVER changes hands: in every frame the racket is in her RIGHT hand, which — because she is drawn from behind — is on the RIGHT-HAND SIDE OF THE IMAGE. Her empty left arm is on the LEFT-HAND SIDE OF THE IMAGE. Draw NO ball anywhere in any frame — the game draws the ball. Frame 1: a forehand wound up — the racket drawn back low across her body to her right, shoulders turned. Frame 2: the same forehand followed through — the racket swung up and across to her left, hips turned through. In both she still faces AWAY from the camera, up the court." }, "player_f_fall": { "sprites": [ @@ -880,7 +880,7 @@ "pose": true, "check": "same", "anchor": 0, - "subject": "Three frames of the woman in the reference \u2014 same DARK ALMOST-BLACK ponytail, same white shirt, same white pleated tennis skirt \u2014 falling over, each one clearly and measurably shorter than the one before it: arched over backwards with both arms flung up, still at full standing height; dropped onto her knees, about four fifths of that height; pitched forward onto one hand, about half of it." + "subject": "Three frames of the woman in the reference — same DARK ALMOST-BLACK ponytail, same white shirt, same white pleated tennis skirt — falling over, each one clearly and measurably shorter than the one before it: arched over backwards with both arms flung up, still at full standing height; dropped onto her knees, about four fifths of that height; pitched forward onto one hand, about half of it." }, "opp_f_play": { "sprites": [ @@ -895,7 +895,7 @@ "pose": true, "check": "same", "anchor": 0, - "subject": "Four frames of the woman in the reference \u2014 same hair, same ponytail, same RED shirt, same dark pleated tennis skirt \u2014 seen from the FRONT across the net, from exactly the reference's viewpoint. Draw NO ball. Frame 1: the serve toss, her free arm thrown straight up above her head. Frame 2: the smash at full stretch, up on her toes, racket high overhead. Frame 3: a forehand wound up, racket drawn back across her body. Frame 4: the same forehand followed through, racket swung up and across." + "subject": "Four frames of the woman in the reference — same hair, same ponytail, same RED shirt, same dark pleated tennis skirt — seen from the FRONT across the net, from exactly the reference's viewpoint. Draw NO ball. Frame 1: the serve toss, her free arm thrown straight up above her head. Frame 2: the smash at full stretch, up on her toes, racket high overhead. Frame 3: a forehand wound up, racket drawn back across her body. Frame 4: the same forehand followed through, racket swung up and across." }, "player_f_bounce": { "sprites": [ @@ -908,6 +908,186 @@ "pose": true, "check": "same", "anchor": 0, - "subject": "Two frames of the woman in the reference \u2014 same DARK ALMOST-BLACK ponytail, same white shirt, same white pleated tennis skirt. She is seen strictly FROM BEHIND, the back of her head and her ponytail towards the viewer, NO face, from exactly the reference's viewpoint. The racket stays in her RIGHT hand (the RIGHT-HAND SIDE OF THE IMAGE) in both frames; her empty LEFT hand is on the LEFT-HAND SIDE OF THE IMAGE. Draw NO ball. She is patting a ball against the ground before serving, so her empty LEFT hand stays LOW in BOTH frames \u2014 it NEVER rises above her waist and NEVER comes near her shoulder or her head. Frame 1: she leans forward slightly and her LEFT arm reaches DOWN and out to the left, the palm turned down at about KNEE height. Frame 2: the SAME stance with that same LEFT hand lifted only a little, the palm still turned down, now at about HIP height. Frames 1 and 2 must be the same drawing with ONLY the left hand's height changed \u2014 identical legs, identical body, identical racket, identical height." + "subject": "Two frames of the woman in the reference — same DARK ALMOST-BLACK ponytail, same white shirt, same white pleated tennis skirt. She is seen strictly FROM BEHIND, the back of her head and her ponytail towards the viewer, NO face, from exactly the reference's viewpoint. The racket stays in her RIGHT hand (the RIGHT-HAND SIDE OF THE IMAGE) in both frames; her empty LEFT hand is on the LEFT-HAND SIDE OF THE IMAGE. Draw NO ball. She is patting a ball against the ground before serving, so her empty LEFT hand stays LOW in BOTH frames — it NEVER rises above her waist and NEVER comes near her shoulder or her head. Frame 1: she leans forward slightly and her LEFT arm reaches DOWN and out to the left, the palm turned down at about KNEE height. Frame 2: the SAME stance with that same LEFT hand lifted only a little, the palm still turned down, now at about HIP height. Frames 1 and 2 must be the same drawing with ONLY the left hand's height changed — identical legs, identical body, identical racket, identical height." + }, + "boss_string_walk": { + "sprites": [ + "z_string1", + "z_string2" + ], + "ref_only": [ + "z_boss1" + ], + "anchor": 0, + "check": "same", + "newart": true, + "subject": "The reference is a huge chapter-boss zombie drawn FACING THE VIEWER. Draw TWO frames of a DIFFERENT boss in that same front-facing style and at that same enormous size: THE STRINGER — a towering dead racket stringer facing the viewer, in a scuffed leather work apron over a sweat-stained club polo with the sleeves rolled up, both forearms wound with loops of pale gut string, a bandolier of string spools across his chest, long-nosed pliers and an awl hanging from his belt, and three bare racket frames strapped across his back. Green-grey dead skin, a length of string bitten between his teeth, sunken eyes. He grips a tennis ball in one huge fist. In both frames his chest and face point straight at the viewer. The two frames are two stages of one heavy stride straight toward the viewer, one knee lifted in each. Output exactly two figures in one row." + }, + "boss_string_wounds": { + "sprites": [ + "z_stringw1", + "z_stringw2", + "z_stringw3" + ], + "ref_only": [ + "z_string1" + ], + "anchor": 0, + "check": "loose", + "state": true, + "subject": "The reference is THE STRINGER — a towering dead racket stringer facing the viewer, in a scuffed leather work apron over a sweat-stained club polo with the sleeves rolled up, both forearms wound with loops of pale gut string, a bandolier of string spools across his chest, long-nosed pliers and an awl hanging from his belt, and three bare racket frames strapped across his back. Green-grey dead skin, a length of string bitten between his teeth, sunken eyes. He grips a tennis ball in one huge fist. Draw THREE frames of that SAME boss, the same enormous size and the same costume, standing and facing the viewer, as three worsening stages of damage: (1) the arm on the left-hand side of the image is torn off at the shoulder leaving a ragged bloody stump — the OTHER arm is untouched and still holding what it held; (2) his chest and belly are torn wide open with the ribs showing through and the clothing hanging in bloody strips — one arm is still whole and still holding what it held; (3) his chest is torn open with ribs showing AND he has no head at all, the neck ending in a ragged red stump at shoulder height — one arm is still whole and still holding what it held. He must stay the same enormous size in all three — do not slim him down as the damage grows. Output exactly three figures in one row." + }, + "boss_string_throw": { + "sprites": [ + "z_stringt0", + "z_stringt1", + "z_stringt2", + "z_stringt3" + ], + "ref_only": [ + "z_string1", + "z_stringw1", + "z_stringw2", + "z_stringw3" + ], + "anchor": 0, + "check": "any", + "state": true, + "subject": "The reference shows the SAME boss in four states: undamaged, then three worsening stages of damage. Draw all FOUR of those exact states again, in the same order, same size, same costume, same wounds — but each one caught MID-THROW: the whole body wound up and twisted, the surviving arm drawn back high over the shoulder about to hurl a tennis ball straight at the viewer, weight on the back foot. The wounds must stay clearly visible in every frame. Output exactly four figures in one row." + }, + "boss_dir_walk": { + "sprites": [ + "z_dir1", + "z_dir2" + ], + "ref_only": [ + "z_boss1" + ], + "anchor": 0, + "check": "same", + "newart": true, + "subject": "The reference is a huge chapter-boss zombie drawn FACING THE VIEWER. Draw TWO frames of a DIFFERENT boss in that same front-facing style and at that same enormous size: THE TOURNAMENT DIRECTOR — a towering dead official facing the viewer, in a double-breasted navy blazer with a gold club crest on the breast pocket, a striped club tie, cream trousers, and an accreditation lanyard round his neck. A black two-way radio is raised in one hand and a clipboard of order-of-play sheets is clamped under that arm. Green-grey dead skin, half-moon spectacles, jaw hanging open mid-announcement. He grips a tennis ball in his other huge fist. In both frames his chest and face point straight at the viewer. The two frames are two stages of one heavy stride straight toward the viewer, one knee lifted in each. Output exactly two figures in one row." + }, + "boss_dir_wounds": { + "sprites": [ + "z_dirw1", + "z_dirw2", + "z_dirw3" + ], + "ref_only": [ + "z_dir1" + ], + "anchor": 0, + "check": "loose", + "state": true, + "subject": "The reference is THE TOURNAMENT DIRECTOR — a towering dead official facing the viewer, in a double-breasted navy blazer with a gold club crest on the breast pocket, a striped club tie, cream trousers, and an accreditation lanyard round his neck. A black two-way radio is raised in one hand and a clipboard of order-of-play sheets is clamped under that arm. Green-grey dead skin, half-moon spectacles, jaw hanging open mid-announcement. He grips a tennis ball in his other huge fist. Draw THREE frames of that SAME boss, the same enormous size and the same costume, standing and facing the viewer, as three worsening stages of damage: (1) the arm on the left-hand side of the image is torn off at the shoulder leaving a ragged bloody stump — the OTHER arm is untouched and still holding what it held; (2) his chest and belly are torn wide open with the ribs showing through and the clothing hanging in bloody strips — one arm is still whole and still holding what it held; (3) his chest is torn open with ribs showing AND he has no head at all, the neck ending in a ragged red stump at shoulder height — one arm is still whole and still holding what it held. He must stay the same enormous size in all three — do not slim him down as the damage grows. Output exactly three figures in one row." + }, + "boss_dir_throw": { + "sprites": [ + "z_dirt0", + "z_dirt1", + "z_dirt2", + "z_dirt3" + ], + "ref_only": [ + "z_dir1", + "z_dirw1", + "z_dirw2", + "z_dirw3" + ], + "anchor": 0, + "check": "loose", + "state": true, + "subject": "The reference shows the SAME boss in four states: undamaged, then three worsening stages of damage. Draw all FOUR of those exact states again, in the same order, same size, same costume, same wounds — but each one caught MID-THROW: the whole body wound up and twisted, the surviving arm drawn back high over the shoulder about to hurl a tennis ball straight at the viewer, weight on the back foot. The wounds must stay clearly visible in every frame. Output exactly four figures in one row." + }, + "boss_berry_walk": { + "sprites": [ + "z_berry1", + "z_berry2" + ], + "ref_only": [ + "z_boss1" + ], + "anchor": 0, + "check": "same", + "newart": true, + "subject": "The reference is a huge chapter-boss zombie drawn FACING THE VIEWER. Draw TWO frames of a DIFFERENT boss in that same front-facing style and at that same enormous size: THE STRAWBERRY SELLER — a towering dead tournament vendor facing the viewer, in a white apron soaked through with deep red and a folded paper cap, a wooden vendor's tray slung from a neck strap across his belly loaded with punnets of DEEP RED strawberries and white jugs of cream, sleeves shoved up over blood-smeared forearms, a serving ladle hanging from his belt. Green-grey dead skin, cream down his chin, hollow eyes. He grips a tennis ball in one huge fist. Use only deep blood red, white, cream and brown — absolutely no pink, no magenta, no violet and no purple anywhere in the drawing. In both frames his chest and face point straight at the viewer. The two frames are two stages of one heavy stride straight toward the viewer, one knee lifted in each. Output exactly two figures in one row." + }, + "boss_berry_wounds": { + "sprites": [ + "z_berryw1", + "z_berryw2", + "z_berryw3" + ], + "ref_only": [ + "z_berry1" + ], + "anchor": 0, + "check": "loose", + "state": true, + "subject": "The reference is THE STRAWBERRY SELLER — a towering dead tournament vendor facing the viewer, in a white apron soaked through with deep red and a folded paper cap, a wooden vendor's tray slung from a neck strap across his belly loaded with punnets of DEEP RED strawberries and white jugs of cream, sleeves shoved up over blood-smeared forearms, a serving ladle hanging from his belt. Green-grey dead skin, cream down his chin, hollow eyes. He grips a tennis ball in one huge fist. Use only deep blood red, white, cream and brown — absolutely no pink, no magenta, no violet and no purple anywhere in the drawing. Draw THREE frames of that SAME boss, the same enormous size and the same costume, standing and facing the viewer, as three worsening stages of damage: (1) the arm on the left-hand side of the image is torn off at the shoulder leaving a ragged bloody stump — the OTHER arm is untouched and still holding what it held; (2) his chest and belly are torn wide open with the ribs showing through and the clothing hanging in bloody strips — one arm is still whole and still holding what it held; (3) his chest is torn open with ribs showing AND he has no head at all, the neck ending in a ragged red stump at shoulder height — one arm is still whole and still holding what it held. He must stay the same enormous size in all three — do not slim him down as the damage grows. Output exactly three figures in one row." + }, + "boss_berry_throw": { + "sprites": [ + "z_berryt0", + "z_berryt1", + "z_berryt2", + "z_berryt3" + ], + "ref_only": [ + "z_berry1", + "z_berryw1", + "z_berryw2", + "z_berryw3" + ], + "anchor": 0, + "check": "loose", + "state": true, + "subject": "The reference shows the SAME boss in four states: undamaged, then three worsening stages of damage. Draw all FOUR of those exact states again, in the same order, same size, same costume, same wounds — but each one caught MID-THROW: the whole body wound up and twisted, the surviving arm drawn back high over the shoulder about to hurl a tennis ball straight at the viewer, weight on the back foot. The wounds must stay clearly visible in every frame. Output exactly four figures in one row." + }, + "boss_champ_walk": { + "sprites": [ + "z_champ1", + "z_champ2" + ], + "ref_only": [ + "z_boss1" + ], + "anchor": 0, + "check": "same", + "newart": true, + "subject": "The reference is a huge chapter-boss zombie drawn FACING THE VIEWER. Draw TWO frames of a DIFFERENT boss in that same front-facing style and at that same enormous size: THE CHAMPION — the towering dead fourteen-time champion facing the viewer, in a torn all-white tennis kit gone grey and yellow with age, gold trim at the collar, a laurel of white strapping tape wound round his head like a crown, an old sweatband on each wrist. A huge silver trophy is gripped in one fist and held slightly out from his body. Green-grey dead skin drawn tight over a heavy champion's jaw, sunken eyes, teeth bared. He grips a tennis ball in his other huge fist. In both frames his chest and face point straight at the viewer. The two frames are two stages of one heavy stride straight toward the viewer, one knee lifted in each. Output exactly two figures in one row." + }, + "boss_champ_wounds": { + "sprites": [ + "z_champw1", + "z_champw2", + "z_champw3" + ], + "ref_only": [ + "z_champ1" + ], + "anchor": 0, + "check": "loose", + "state": true, + "subject": "The reference is THE CHAMPION — the towering dead fourteen-time champion facing the viewer, in a torn all-white tennis kit gone grey and yellow with age, gold trim at the collar, a laurel of white strapping tape wound round his head like a crown, an old sweatband on each wrist. A huge silver trophy is gripped in one fist and held slightly out from his body. Green-grey dead skin drawn tight over a heavy champion's jaw, sunken eyes, teeth bared. He grips a tennis ball in his other huge fist. Draw THREE frames of that SAME boss, the same enormous size and the same costume, standing and facing the viewer, as three worsening stages of damage: (1) the arm on the left-hand side of the image is torn off at the shoulder leaving a ragged bloody stump — the OTHER arm is untouched and still holding what it held; (2) his chest and belly are torn wide open with the ribs showing through and the clothing hanging in bloody strips — one arm is still whole and still holding what it held; (3) his chest is torn open with ribs showing AND he has no head at all, the neck ending in a ragged red stump at shoulder height — one arm is still whole and still holding what it held. He must stay the same enormous size in all three — do not slim him down as the damage grows. Output exactly three figures in one row." + }, + "boss_champ_throw": { + "sprites": [ + "z_champt0", + "z_champt1", + "z_champt2", + "z_champt3" + ], + "ref_only": [ + "z_champ1", + "z_champw1", + "z_champw2", + "z_champw3" + ], + "anchor": 0, + "check": "any", + "state": true, + "subject": "The reference shows the SAME boss in four states: undamaged, then three worsening stages of damage. Draw all FOUR of those exact states again, in the same order, same size, same costume, same wounds — but each one caught MID-THROW: the whole body wound up and twisted, the surviving arm drawn back high over the shoulder about to hurl a tennis ball straight at the viewer, weight on the back foot. The wounds must stay clearly visible in every frame. Output exactly four figures in one row." } -} +} \ No newline at end of file diff --git a/assets/z_berry1.png b/assets/z_berry1.png new file mode 100644 index 0000000..deb0731 Binary files /dev/null and b/assets/z_berry1.png differ diff --git a/assets/z_berry2.png b/assets/z_berry2.png new file mode 100644 index 0000000..83272a0 Binary files /dev/null and b/assets/z_berry2.png differ diff --git a/assets/z_berryt0.png b/assets/z_berryt0.png new file mode 100644 index 0000000..77e1d6a Binary files /dev/null and b/assets/z_berryt0.png differ diff --git a/assets/z_berryt1.png b/assets/z_berryt1.png new file mode 100644 index 0000000..03579b0 Binary files /dev/null and b/assets/z_berryt1.png differ diff --git a/assets/z_berryt2.png b/assets/z_berryt2.png new file mode 100644 index 0000000..8c9c285 Binary files /dev/null and b/assets/z_berryt2.png differ diff --git a/assets/z_berryt3.png b/assets/z_berryt3.png new file mode 100644 index 0000000..c7d51fb Binary files /dev/null and b/assets/z_berryt3.png differ diff --git a/assets/z_berryw1.png b/assets/z_berryw1.png new file mode 100644 index 0000000..aac4c51 Binary files /dev/null and b/assets/z_berryw1.png differ diff --git a/assets/z_berryw2.png b/assets/z_berryw2.png new file mode 100644 index 0000000..7c37609 Binary files /dev/null and b/assets/z_berryw2.png differ diff --git a/assets/z_berryw3.png b/assets/z_berryw3.png new file mode 100644 index 0000000..eb7d4e2 Binary files /dev/null and b/assets/z_berryw3.png differ diff --git a/assets/z_champ1.png b/assets/z_champ1.png new file mode 100644 index 0000000..33ad8a9 Binary files /dev/null and b/assets/z_champ1.png differ diff --git a/assets/z_champ2.png b/assets/z_champ2.png new file mode 100644 index 0000000..b540708 Binary files /dev/null and b/assets/z_champ2.png differ diff --git a/assets/z_champt0.png b/assets/z_champt0.png new file mode 100644 index 0000000..2e1eac8 Binary files /dev/null and b/assets/z_champt0.png differ diff --git a/assets/z_champt1.png b/assets/z_champt1.png new file mode 100644 index 0000000..7d2ac15 Binary files /dev/null and b/assets/z_champt1.png differ diff --git a/assets/z_champt2.png b/assets/z_champt2.png new file mode 100644 index 0000000..a25c823 Binary files /dev/null and b/assets/z_champt2.png differ diff --git a/assets/z_champt3.png b/assets/z_champt3.png new file mode 100644 index 0000000..5531d90 Binary files /dev/null and b/assets/z_champt3.png differ diff --git a/assets/z_champw1.png b/assets/z_champw1.png new file mode 100644 index 0000000..c19ee39 Binary files /dev/null and b/assets/z_champw1.png differ diff --git a/assets/z_champw2.png b/assets/z_champw2.png new file mode 100644 index 0000000..22fcf4c Binary files /dev/null and b/assets/z_champw2.png differ diff --git a/assets/z_champw3.png b/assets/z_champw3.png new file mode 100644 index 0000000..1ac70d5 Binary files /dev/null and b/assets/z_champw3.png differ diff --git a/assets/z_dir1.png b/assets/z_dir1.png new file mode 100644 index 0000000..44c0e1b Binary files /dev/null and b/assets/z_dir1.png differ diff --git a/assets/z_dir2.png b/assets/z_dir2.png new file mode 100644 index 0000000..6a7a632 Binary files /dev/null and b/assets/z_dir2.png differ diff --git a/assets/z_dirt0.png b/assets/z_dirt0.png new file mode 100644 index 0000000..a5e3465 Binary files /dev/null and b/assets/z_dirt0.png differ diff --git a/assets/z_dirt1.png b/assets/z_dirt1.png new file mode 100644 index 0000000..0f80b86 Binary files /dev/null and b/assets/z_dirt1.png differ diff --git a/assets/z_dirt2.png b/assets/z_dirt2.png new file mode 100644 index 0000000..8238e78 Binary files /dev/null and b/assets/z_dirt2.png differ diff --git a/assets/z_dirt3.png b/assets/z_dirt3.png new file mode 100644 index 0000000..c46c337 Binary files /dev/null and b/assets/z_dirt3.png differ diff --git a/assets/z_dirw1.png b/assets/z_dirw1.png new file mode 100644 index 0000000..c8057ba Binary files /dev/null and b/assets/z_dirw1.png differ diff --git a/assets/z_dirw2.png b/assets/z_dirw2.png new file mode 100644 index 0000000..a12a476 Binary files /dev/null and b/assets/z_dirw2.png differ diff --git a/assets/z_dirw3.png b/assets/z_dirw3.png new file mode 100644 index 0000000..354e267 Binary files /dev/null and b/assets/z_dirw3.png differ diff --git a/assets/z_string1.png b/assets/z_string1.png new file mode 100644 index 0000000..ef1bbdd Binary files /dev/null and b/assets/z_string1.png differ diff --git a/assets/z_string2.png b/assets/z_string2.png new file mode 100644 index 0000000..915d97e Binary files /dev/null and b/assets/z_string2.png differ diff --git a/assets/z_stringt0.png b/assets/z_stringt0.png new file mode 100644 index 0000000..a6fa262 Binary files /dev/null and b/assets/z_stringt0.png differ diff --git a/assets/z_stringt1.png b/assets/z_stringt1.png new file mode 100644 index 0000000..f1e93d3 Binary files /dev/null and b/assets/z_stringt1.png differ diff --git a/assets/z_stringt2.png b/assets/z_stringt2.png new file mode 100644 index 0000000..7d79a65 Binary files /dev/null and b/assets/z_stringt2.png differ diff --git a/assets/z_stringt3.png b/assets/z_stringt3.png new file mode 100644 index 0000000..7c8b998 Binary files /dev/null and b/assets/z_stringt3.png differ diff --git a/assets/z_stringw1.png b/assets/z_stringw1.png new file mode 100644 index 0000000..81cbc3e Binary files /dev/null and b/assets/z_stringw1.png differ diff --git a/assets/z_stringw2.png b/assets/z_stringw2.png new file mode 100644 index 0000000..93e8d11 Binary files /dev/null and b/assets/z_stringw2.png differ diff --git a/assets/z_stringw3.png b/assets/z_stringw3.png new file mode 100644 index 0000000..1a04d0c Binary files /dev/null and b/assets/z_stringw3.png differ diff --git a/config.js b/config.js index 6fd96f6..469842c 100644 --- a/config.js +++ b/config.js @@ -500,15 +500,62 @@ export const BOSS_ART = [ { name: 'THE PHYSIO', walk: ['z_physio1', 'z_physio2'], wounds: ['z_physiow1', 'z_physiow2', 'z_physiow3'], throws: ['z_physiot0', 'z_physiot1', 'z_physiot2', 'z_physiot3'], - move: 'charge', hpMul: 0.8, // fast and fragile: the BODY is the weapon, and contact - volley: 1, cycle: 3.4, wind: 0.35, shot: 21, spread: 0.15 }, // is still instant death + // THE BODY IS THE WEAPON — which it never once was. One ball every 3.4 s and a withdrawal that + // gave back 4.2 of every 6.3 m it charged meant the fight was over long before it arrived: + // Oliver, "the physio does basically nothing but move towards the net, too easy". It now keeps + // three quarters of every rush (withdraw) and covers the ground half again as fast (speedMul), + // so it is on top of you inside two charges, and it drills you on the way in. + move: 'charge', hpMul: 0.9, speedMul: 1.45, withdraw: 0.2, + volley: 3, gap: 0.26, cycle: 2.4, wind: 0.3, shot: 22, spread: 0.5 }, { name: 'THE SPONSOR MASCOT', walk: ['z_mascot1', 'z_mascot2'], wounds: ['z_mascotw1', 'z_mascotw2', 'z_mascotw3'], throws: ['z_mascott0', 'z_mascott1', 'z_mascott2', 'z_mascott3'], move: 'bounce', hpMul: 1.3, speedMul: 0.6, // soaks, and answers with a WALL: five at once, so volley: 5, gap: 0, spread: 1.6, cycle: 3.2, wind: 0.65, shot: 14 }, // there is nothing to parry + { name: 'THE STRINGER', walk: ['z_string1', 'z_string2'], + wounds: ['z_stringw1', 'z_stringw2', 'z_stringw3'], + throws: ['z_stringt0', 'z_stringt1', 'z_stringt2', 'z_stringt3'], + move: 'shadow', paceMul: 1.6, hpMul: 1.1, // he never mis-strings: he takes your lane and puts + volley: 2, gap: 0.28, spread: 0.1, cycle: 2.1, wind: 0.34, shot: 23 }, // two dead-straight ones on it + { name: 'THE TOURNAMENT DIRECTOR', walk: ['z_dir1', 'z_dir2'], + wounds: ['z_dirw1', 'z_dirw2', 'z_dirw3'], + throws: ['z_dirt0', 'z_dirt1', 'z_dirt2', 'z_dirt3'], + move: 'surge', hpMul: 1.2, // the one fight you cannot stand still in: he has a + volley: 2, gap: 0.4, spread: 0.7, cycle: 3.0, wind: 0.5, // radio, and he calls security with it + line: 'HE IS CALLING SECURITY.', adds: { every: 6, variant: 'd', cap: 5 } }, + { name: 'THE STRAWBERRY SELLER', walk: ['z_berry1', 'z_berry2'], + wounds: ['z_berryw1', 'z_berryw2', 'z_berryw3'], + throws: ['z_berryt0', 'z_berryt1', 'z_berryt2', 'z_berryt3'], + move: 'charge', hpMul: 1.4, speedMul: 1.15, withdraw: 0.3, // a tray of cream and a ladle: he + volley: 4, gap: 0.12, spread: 1.4, cycle: 3.0, wind: 0.55, shot: 15 }, // sprays, then comes for you + // THE FINAL BOSS, and the only row that is not in the chapter rotation: bossArt() hands him out + // every TENTH chapter (game 100, then 200). Two things make him the wall the run ends on. + // `rally` he RETURNS anything that is not a splatter-quality kill shot — see the boss branch in + // zombies.js. Every other body in the game can be worn down with soft balls; he is the + // one you have to out-HIT, and a lazy serve comes straight back at your head. + // `phases` three rows that override this one as his health falls (bossPlan), each with its own + // cry. He holds the baseline and rallies, then runs the line drilling volleys, then + // drops the trophy and comes for you. Same body, three fights. + { name: 'THE CHAMPION', walk: ['z_champ1', 'z_champ2'], + wounds: ['z_champw1', 'z_champw2', 'z_champw3'], + throws: ['z_champt0', 'z_champt1', 'z_champt2', 'z_champt3'], + rally: true, hpMul: 1.6, line: 'HE RETURNS EVERYTHING.', + phases: [ + { move: 'pace', paceMul: 0.9, volley: 1, cycle: 3.2, wind: 0.6, shot: 17, spread: 0.3 }, + { move: 'shadow', paceMul: 1.8, volley: 4, gap: 0.22, cycle: 2.2, wind: 0.4, shot: 20, spread: 0.5, + cry: 'SECOND SET.' }, + { move: 'charge', speedMul: 1.5, withdraw: 0.15, volley: 3, gap: 0.1, cycle: 1.9, wind: 0.3, + shot: 24, spread: 1.1, cry: 'MATCH POINT.' }, + ] }, ]; +// WHICH design a chapter gets. The roster is walked one design per chapter, and every TENTH chapter +// is THE CHAMPION — last in the array and never part of the rotation. The floor(ch/10) term takes +// his chapters back out of the count, so chapter 11 opens the second lap on the groundskeeper +// instead of skipping him. +export const bossArt = ch => ch % 10 === 0 ? BOSS_ART[BOSS_ART.length - 1] + : BOSS_ART[(ch - 1 - Math.floor(ch / 10)) % (BOSS_ART.length - 1)]; + // The roster, as the BODY COUNT screen reads it. Until now a variant's NAME lived only in the // comment above its hp value — fine while nothing ever had to print one. The key is the `variant` // char the zombie already carries, except that 'a' and 'b' fold together (they are one shambler in @@ -533,8 +580,9 @@ export const ENEMIES = { r: { name: 'THE CLUB PRO', spr: 'z_c1', sub: 'STILL HAS A BACKHAND' }, m: { name: 'THE BALL MACHINE', spr: 'z_mach1', sub: 'FIRES BACK · FURNITURE' }, }; -for (let i = 0; i < BOSS_ART.length; i++) // the six chapter bosses, named where they already are - ENEMIES['B' + i] = { name: BOSS_ART[i].name, spr: BOSS_ART[i].walk[0], sub: 'CHAPTER BOSS', boss: true }; +for (let i = 0; i < BOSS_ART.length; i++) // the chapter bosses, named where they already are + ENEMIES['B' + i] = { name: BOSS_ART[i].name, spr: BOSS_ART[i].walk[0], boss: true, + sub: i === BOSS_ART.length - 1 ? 'THE FINAL · EVERY TENTH CHAPTER' : 'CHAPTER BOSS' }; // Which wound stage a body is in: 0 = unhurt, 1..n = the skins, spread evenly over its full health. // This is the rule the chapter boss already used, and it turns out to reproduce the brute's old diff --git a/gameplay.js b/gameplay.js index 52973f4..32cf1d5 100644 --- a/gameplay.js +++ b/gameplay.js @@ -1,6 +1,6 @@ // Game logic: ballistics, swings, serves, rules/scoring, AI, and the per-frame update. -import { TUNE, UI, BOSS_ART, APPLAUSE_T, EATEN_BURST, EATEN_SUMMARY, COURT, CONTACT, VOLLEY, ZONE_DEPTH, HOME, P_BOUNDS, TOSS, SHOT_DEPTH, POSE_TIME, BOUNCE_IDLE, zombieH, Z_CHEST , WEAPONS, RACK_MAX , BARREL_WEAPONS } from './config.js'; +import { TUNE, UI, bossArt, APPLAUSE_T, EATEN_BURST, EATEN_SUMMARY, COURT, CONTACT, VOLLEY, ZONE_DEPTH, HOME, P_BOUNDS, TOSS, SHOT_DEPTH, POSE_TIME, BOUNCE_IDLE, zombieH, Z_CHEST , WEAPONS, RACK_MAX , BARREL_WEAPONS } from './config.js'; import { P, O, ball, score, crowd, G, court, other, deuceSide, setupPoint, sendBoy, resetState } from './state.js'; import { audio, pock, swish, whoosh, applause, voice, sfx, aww, zombieMusic, zombieDuck, menuDuck, splat, shriek, boom } from './audio.js'; import { axisX, axisZ, takeFlickAim, touchPX, resetInput } from './input.js'; @@ -748,8 +748,8 @@ export function startBossFight(chapter) { spawnChapterBoss(chapter); zombieDuck(true); // the music drops out for it voice('ump_boss_arrives', 0, 0.9); voice('sudden_death', 2.6, 0.85); - const art = BOSS_ART[(chapter - 1) % BOSS_ART.length]; - G.card = { title: 'CHAPTER ' + chapter, sub1: art.name, sub2: 'IT THROWS. RETURN IT.', + const art = bossArt(chapter); + G.card = { title: 'CHAPTER ' + chapter, sub1: art.name, sub2: art.line || 'IT THROWS. RETURN IT.', color: UI.bad, t: TUNE.setCardT }; G.flash = null; if (!G.seen.boss) { // the rules change: a wall, and a thing that shoots back diff --git a/index.html b/index.html index 9d29ea6..70ec242 100644 --- a/index.html +++ b/index.html @@ -359,6 +359,6 @@ - + diff --git a/render.js b/render.js index c0409d1..7ec6da5 100644 --- a/render.js +++ b/render.js @@ -194,7 +194,7 @@ export function proj(x, y, z) { // Asset cache-buster — bump with main.js?v=N (see the img.src note below). EXPORTED because the // menu screens hang tags on the same files, and two copies of this number is one copy too // many: the one that does not get bumped is the one that serves a cached 404. -export const SPRV = 87; +export const SPRV = 88; // The boot bar in main.js watches this. Nothing here CHANGES when things load — every sprite was // already requested at import — it just makes the wait visible and holds the menu back until the // last sheet has landed. See the onerror note below for the other half of "sometimes missing". @@ -214,12 +214,17 @@ for (const n of ['p_idle1','p_idle2','p_bounce','p_bounce2','p_toss','p_smash',' 'z_boss1','z_boss2','z_bossw1','z_bossw2','z_bossw3', // the CHAPTER BOSS: 2-frame stride + three wound stages (arm off -> ribs out -> headless) 'z_bosst0','z_bosst1','z_bosst2','z_bosst3', // ...and each of those four states mid-THROW (windT) 'z_mach1','z_mach2','z_machw1','z_machw2', // the ball machine: idle, firing, dented, split open - 'z_judge1','z_judge2','z_judgew','z_judget','z_judgewt', // boss design 2 (chapter 2, 8, ...) - 'z_chair1','z_chair2','z_chairw','z_chairt','z_chairwt', // boss design 3 (chapter 3, 9, ...) - // designs 4-6, each with the full set the groundskeeper has: 2 stride, 3 wounds, 4 throws + 'z_judge1','z_judge2','z_judgew','z_judget','z_judgewt', // boss design 2 (chapter 2, then the second lap) + 'z_chair1','z_chair2','z_chairw','z_chairt','z_chairwt', // boss design 3 (chapter 3, then the second lap) + // designs 4-9 and the final boss, each with the full set the groundskeeper has: 2 stride, 3 wounds, 4 throws 'z_coach1','z_coach2','z_coachw1','z_coachw2','z_coachw3','z_coacht0','z_coacht1','z_coacht2','z_coacht3', 'z_physio1','z_physio2','z_physiow1','z_physiow2','z_physiow3','z_physiot0','z_physiot1','z_physiot2','z_physiot3', 'z_mascot1','z_mascot2','z_mascotw1','z_mascotw2','z_mascotw3','z_mascott0','z_mascott1','z_mascott2','z_mascott3', + // designs 7-9 and THE CHAMPION (the final boss, every tenth chapter — see bossArt) + 'z_string1','z_string2','z_stringw1','z_stringw2','z_stringw3','z_stringt0','z_stringt1','z_stringt2','z_stringt3', + 'z_dir1','z_dir2','z_dirw1','z_dirw2','z_dirw3','z_dirt0','z_dirt1','z_dirt2','z_dirt3', + 'z_berry1','z_berry2','z_berryw1','z_berryw2','z_berryw3','z_berryt0','z_berryt1','z_berryt2','z_berryt3', + 'z_champ1','z_champ2','z_champw1','z_champw2','z_champw3','z_champt0','z_champt1','z_champt2','z_champt3', // the late roster: ball boy (3 hp, 2 skins), bouncer (6 hp, 3), roller man (9 hp, 4). // Every skin has its …b stride twin, so a wounded body keeps walking (see ZWOUND). 'z_e1','z_e2','z_e3','z_e4','z_ew','z_ewb','z_ew2','z_ew2b', @@ -624,7 +629,9 @@ function drawZombie(zb) { // that paces or hops sideways would slide across the court with its feet frozen. (zb.z is the // fallback so a boss spawned by an older path still animates.) const walked = (zb.dist ?? zb.z) / TUNE.bruteStride; - const wanted = zb.windT > 0 ? A.throws[Math.min(idx, A.throws.length - 1)] + // retT is the CHAMPION'S RETURN — the same throw frame, held briefly, so a ball he sends back + // has a stroke behind it instead of arriving out of a body that never moved. + const wanted = zb.windT > 0 || zb.retT > 0 ? A.throws[Math.min(idx, A.throws.length - 1)] : idx ? A.wounds[idx - 1] : A.walk[stepFrame(walked, 2)]; // a design whose sheet has not been generated (or has not loaded) degrades to design 1 rather diff --git a/zombies.js b/zombies.js index 8486ded..90407b3 100644 --- a/zombies.js +++ b/zombies.js @@ -3,7 +3,7 @@ // your baseline — one crossing it is a point for THEM. // (zombies <-> gameplay is a runtime-only import cycle, same pattern as input.) -import { TUNE, UI, COURT, CONTACT, BOSS_ART, WEAPONS, BARREL_WEAPONS, woundStage, zombieH, EATEN_BURST, EATEN_SUMMARY, EATEN_FEED_R } from './config.js'; +import { TUNE, UI, COURT, CONTACT, BOSS_ART, bossArt, WEAPONS, BARREL_WEAPONS, woundStage, zombieH, EATEN_BURST, EATEN_SUMMARY, EATEN_FEED_R } from './config.js'; import { G, P, ball, sendBoy, setupPoint } from './state.js'; import { splat, moan, pock, thud, zap, voice, boom, swish, shriek, aww, sfx , whoosh, flame } from './audio.js'; import { splatPoint, cheer, spentBall, resolveInterlude, endBossFight, aside, grantWeapon, endBurst, sliceCarom } from './gameplay.js'; @@ -124,7 +124,7 @@ export function spawnMachine() { // reach you is the ordinary instant death. Reuses the whole existing damage model — it is just a // body with a lot of hp (see the wound() invariant in HANDOFF), so no weapon needs special-casing. export function spawnChapterBoss(chapter) { - const art = BOSS_ART[(chapter - 1) % BOSS_ART.length]; // which of the boss designs this chapter is + const art = bossArt(chapter); // which of the boss designs this chapter is (every tenth = THE CHAMPION) // Every behaviour field on the design is OPTIONAL and falls back to the shared TUNE number, so a // design row that carries nothing but art behaves exactly the way a boss did before there were any. const hp = Math.round((TUNE.bossHp + (chapter - 1) * TUNE.bossHpPerChapter) * (art.hpMul ?? 1)); @@ -152,22 +152,38 @@ export function spawnChapterBoss(chapter) { // motion is "close on the player's x" arrives, stops, and is static for the rest of the fight, which // is the exact complaint this work exists to fix. Every style below therefore moves under its OWN // power and only BIASES toward the player. Measured: each of the six covers 5-14 m a minute. +// WHICH PHASE a boss is in, or -1 for a design that has none. Health drives it, so it is derived +// rather than stored and cannot desync from the hp it is meant to describe. +const bossPhase = zb => { + const n = zb.art?.phases?.length; + return n ? Math.min(n - 1, Math.floor((1 - zb.hp / zb.hpMax) * n)) : -1; +}; +// The design a boss is FIGHTING as, this instant: its own row, with the current phase's fields laid +// over it. Everything that reads a boss's behaviour goes through here, so a phase stays a data row +// and never becomes a second code path. (There is one boss on court; the object per call is free.) +export const bossPlan = zb => { + const A = zb.art || {}, i = bossPhase(zb); + return i < 0 ? A : { ...A, ...A.phases[i] }; +}; + function bossAI(zb, dt) { if (zb.windT > 0 || zb.salvo > 0) return; // planted: throwing is not a moving action - const x0 = zb.x, z0 = zb.z, style = zb.art?.move || 'advance'; - const strafe = TUNE.bossStrafe * (zb.art?.paceMul ?? 1); + const x0 = zb.x, z0 = zb.z, A = bossPlan(zb), style = A.move || 'advance'; + const strafe = TUNE.bossStrafe * (A.paceMul ?? 1); if (style === 'charge') { zb.moveT -= dt; + const v = TUNE.bossChargeV * (A.speedMul ?? 1); if (zb.charging) { const dx = P.x - zb.x; zb.x += Math.sign(dx) * Math.min(Math.abs(dx), TUNE.bossStrafe * dt); - zb.z = Math.min(P.z, zb.z + TUNE.bossChargeV * dt); // AT you and NO FURTHER: unclamped it ran + zb.z = Math.min(P.z, zb.z + v * dt); // AT you and NO FURTHER: unclamped it ran if (zb.moveT <= 0) { zb.charging = false; zb.moveT = TUNE.bossChargeRest; } // off the back of the court } else { - // It withdraws LESS than it charged, so the fight has a visible clock: it is a couple of metres - // nearer after every rush and reaches you in about half a minute. A withdrawal that undid the - // whole charge made "the body is the weapon" untrue — it never once got near you. - zb.z = Math.max(TUNE.bossZMin, zb.z - TUNE.bossChargeV * 0.45 * dt); + // It withdraws LESS than it charged, so the fight has a visible clock: it is nearer after every + // rush and arrives while you are still fighting it. A withdrawal that undid the whole charge + // made "the body is the weapon" untrue — it never once got near you, which is exactly what the + // physio's old 0.45 still did over a whole fight (`withdraw` is per design now). + zb.z = Math.max(TUNE.bossZMin, zb.z - v * (A.withdraw ?? 0.45) * dt); if (zb.moveT <= 0) { zb.charging = true; zb.moveT = TUNE.bossChargeT; } } } else if (style === 'shadow') { @@ -214,6 +230,17 @@ function bossAI(zb, dt) { zb.dist = (zb.dist || 0) + Math.hypot(zb.x - x0, zb.z - z0); } +// HE CALLS SECURITY. A design with `adds` puts bodies on the court while you fight it — the one +// thing a boss fight could not do before, since startBossFight clears the stage and normal spawning +// is off for the duration. `cap` counts the boss itself, so the court cannot silt up while a slow +// player works on a big health bar. +function bossAdds(zb, dt) { + const A = bossPlan(zb); + if (!A.adds || (zb.addT = (zb.addT ?? A.adds.every) - dt) > 0) return; + zb.addT = A.adds.every; + if (zombies.length < (A.adds.cap ?? 5)) spawnZombie((Math.random() * 2 - 1) * 5, -1.5 - Math.random(), A.adds.variant); +} + // ---- the player's second health channel. Only these two functions touch it. export function hurtPlayer(n) { // G.hurtT is the grace window: a volley must not delete you at once. G.dodgeI is the SIDESTEP — @@ -515,9 +542,18 @@ function ignite(x, z, r) { // needs no new code: every weapon is already proportional to it. function wound(zb, amount, fx = true) { zb.chip = (zb.chip || 0) + amount; + const ph = bossPhase(zb); let took = 0; while (zb.chip >= 1 && zb.hp > 0) { zb.chip -= 1; zb.hp--; took++; } if (took && fx) { splat(0.5, bodySize(zb)); woundBurst(zb); } + // A PHASED BOSS TURNING IS AN EVENT, not a silent change of numbers. Same body, new fight: the + // crowd comes up, the court shakes, and he says which set this is. Without the beat the champion's + // second gear would arrive as "the boss suddenly got faster" and read as the game glitching. + if (zb.hp > 0 && bossPhase(zb) > ph) { + const cry = bossPlan(zb).cry; + if (cry) G.flash = { text: cry, t: 1.6 }; + G.shake = { t: 0.4, mag: 6 }; cheer(1.4, 0.7); moan(0.7); + } return zb.hp <= 0; } @@ -922,11 +958,12 @@ export function updateZombies(dt) { if (zb.shieldT > 0) zb.shieldT -= dt; // staggered chair comes back up when this runs out if (zb.hitT > 0) zb.hitT -= dt; // boss contact cooldown (see TUNE.bossHitCool) + if (zb.retT > 0) zb.retT -= dt; // the champion's return stroke, held long enough to read // ---- the two RANGED attackers. Both wind up visibly before firing (TUNE.machWind / drawZombie's // charge glow) because a shot you cannot see coming is not a fairness contract, it is a gotcha. if (!held && !G.interlude && (zb.variant === 'm' || zb.variant === 'B') && G.mode === 'splatter' && zb.rollTo === undefined) { // a cart on the roll cannot aim — that is the window to close on it - const boss = zb.variant === 'B', A = zb.art; + const boss = zb.variant === 'B', A = boss ? bossPlan(zb) : zb.art; if (zb.salvo > 0) { // mid-volley: the rest of the balls are still coming zb.salvoT -= dt; // A gap of 0 means the WHOLE volley leaves in this one frame — the mascot's wall of five, @@ -1004,7 +1041,7 @@ export function updateZombies(dt) { if (zb.hp < zb.hpMax * 0.5 && Math.random() < dt * 6) smokePuff(zb.x, 1.1, zb.z, 0.25); // wrecked: it smokes where it stands } else if (held || zb.variant === 'r') { /* nothing moves on a changeover; a duelling opponent owns his x */ } - else if (zb.variant === 'B') { if (G.mode === 'splatter' && !G.interlude) bossAI(zb, dt); } + else if (zb.variant === 'B') { if (G.mode === 'splatter' && !G.interlude) { bossAI(zb, dt); bossAdds(zb, dt); } } else if (G.mode === 'splatter' && zb.z > COURT.netZ) { // on YOUR half they close in — each on its own lane, not a column const tx = P.x + zb.homeOff; zb.x += Math.sign(tx - zb.x) * Math.min(Math.abs(tx - zb.x), zb.v * 0.7 * dt) @@ -1051,6 +1088,15 @@ export function updateZombies(dt) { ball.vx *= 0.3; ball.vz *= 0.3; ball.lastHit = 'X'; // spent on the hit if (dead) { splatter(i); continue; } // killing blow: full gore + point } + // ...AND THE CHAMPION RETURNS THE REST. Every other body in the game can be worn down with + // soft balls; the final boss sends anything under splatter quality straight back at your + // head, which is what makes him the one you have to out-HIT. The ball is spent on his + // racket and comes back as an incoming shot — parry it, swish it away, or step aside. + else if (bossPlan(zb).rally) { + fireAtPlayer(zb.x, zb.z, (Math.random() * 2 - 1) * 0.4, bossPlan(zb).shot ?? TUNE.bossShotSpeed); + zb.retT = 0.3; // the throw frame, so the return is drawn + ball.vx *= 0.2; ball.vz *= 0.2; ball.lastHit = 'X'; + } continue; // soft balls pass through ON PURPOSE, for racketAI to return — that rally IS the // feedback that it wasn't hard enough, so no clank here; see HANDOFF }