diff --git a/assets/_die_f.py b/assets/_die_f.py new file mode 100644 index 0000000..ab027c0 --- /dev/null +++ b/assets/_die_f.py @@ -0,0 +1,32 @@ +# p_die4_f.png / p_die5_f.png — the only two sprites in the game that are DERIVED, not drawn. +# +# python3 assets/_die_f.py +# +# The women's tour has its own death frames 1-3 (batch player_f_fall). Frames 4 and 5 have no batch: +# the image generator refuses to draw a dead woman, in every wording worth trying, and rephrasing +# until it complies is not something to automate. It does not matter much — by frame 4 she is flat +# and face down and by frame 5 she is a heap of torn cloth — so those two are the MEN'S drawing. +# The one thing you could actually see was the men's BLUE SHORTS popping in after three frames of +# white skirt, so this repaints the shorts into her kit's white and changes nothing else. +# +# Re-run this whenever player_death is regenerated, or her last two frames go stale. +import os +import numpy as np +from PIL import Image + +HERE = os.path.dirname(os.path.abspath(__file__)) +for n in ('p_die4', 'p_die5'): + a = np.asarray(Image.open(os.path.join(HERE, n + '.png')).convert('RGBA')).astype(np.int16) + r, g, b, al = a[..., 0], a[..., 1], a[..., 2], a[..., 3] + blue = (b > r + 25) & (b > g + 15) & (al > 40) + if not blue.sum(): + print(f'{n}: no blue to repaint'); continue + # keep the shading ORDER — the darkest short pixel stays the darkest — and move the whole ramp + # onto her skirt's range, so the fold shading survives instead of flattening to one white + lum = (r * 0.3 + g * 0.59 + b * 0.11)[blue] + t = (lum - lum.min()) / max(1, lum.max() - lum.min()) + out = a.copy() + for c, (dark, light) in enumerate(((150, 246), (156, 248), (168, 252))): + out[..., c][blue] = (dark + t * (light - dark)).astype(np.int16) + Image.fromarray(out.astype(np.uint8), 'RGBA').save(os.path.join(HERE, n + '_f.png')) + print(f'{n}_f.png written ({int(blue.sum())} px repainted)') diff --git a/assets/_regen.py b/assets/_regen.py index c5d8e04..05ccffa 100644 --- a/assets/_regen.py +++ b/assets/_regen.py @@ -55,13 +55,24 @@ NEW_STYLE = RES + ( # mid-throw). "newart" is wrong for it — it licenses the generator to repaint the character, and it # did: wound frames came back with living tan skin and a redesigned shirt while the healthy frame # stayed a grey-green corpse. Set "state": true for those. -STATE_STYLE = RES + ( - "This is the SAME character as the reference, not a new one. His colours, his clothing, his " - "build, his proportions and his height must be IDENTICAL to the reference — the only things " - "that change are the injuries and the pose described above. His skin stays exactly the same " - "dead grey-green as the reference: he is a walking corpse, never pink, never tan, never living " - "flesh. Do not redesign or recolour any garment. " -) + CANVAS +SAME_CHAR = ( + "This is the SAME character as the reference, not a new one. Their colours, their hair colour, " + "their clothing, their build, their proportions and their height must be IDENTICAL to the " + "reference — the only things that change are the pose and any injuries described above. Do not " + "redesign or recolour any garment. Draw them in FULL COLOUR in exactly the reference's drawing " + "style — never greyscale, never line art, never a different rendering style. " +) +CORPSE = ( + "Their skin stays exactly the same dead grey-green as the reference: this is a walking corpse, " + "never pink, never tan, never living flesh. " +) +STATE_STYLE = RES + SAME_CHAR + CORPSE + CANVAS +# ...and the fourth case, which the three above between them could not express: the same LIVING +# character in a NEW POSE. "newart" repaints them (a women's-tour batch anchored on the men's frames +# came back blonde in one batch, auburn in the next, and greyscale line art in a third — a different +# woman every sheet), and "state" is welded to the corpse palette. Set "pose": true, and anchor the +# batch on a frame OF THAT CHARACTER rather than on whoever the pose originally belonged to. +POSE_STYLE = RES + SAME_CHAR + CANVAS def batches(): with open(os.path.join(HERE, '_regen_batches.json')) as f: @@ -173,7 +184,7 @@ def run(name, spec, dry=False): ref = ref_sheet(shown, f'{SCRATCH}/{name}_ref.png', spec.get('scale', 2.0), frames=len(sprites) + (1 if lead else 0)) sheet = f'{SCRATCH}/{name}_hi.png' - prompt = f"{spec['subject']} {STATE_STYLE if spec.get('state') else NEW_STYLE if spec.get('newart') else STYLE}" + prompt = f"{spec['subject']} {STATE_STYLE if spec.get('state') else POSE_STYLE if spec.get('pose') else NEW_STYLE if spec.get('newart') else STYLE}" if dry: print(f'[{name}] would generate {len(sprites)} frames: {", ".join(sprites)}'); return True print(f'[{name}] generating {len(sprites)} frames...') diff --git a/assets/_regen_batches.json b/assets/_regen_batches.json index d660711..8306526 100644 --- a/assets/_regen_batches.json +++ b/assets/_regen_batches.json @@ -768,5 +768,160 @@ "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." + }, + "player_f_stance": { + "sprites": [ + "p_idle1_f", + "p_idle2_f", + "p_bounce_f", + "p_bounce2_f" + ], + "ref_only": [ + "p_idle1" + ], + "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." + }, + "opp_f_stance": { + "sprites": [ + "o_idle1_f", + "o_idle2_f", + "o_bounce_f", + "o_bounce2_f" + ], + "ref_only": [ + "o_idle1" + ], + "newart": true, + "check": "same", + "anchor": 0, + "subject": "Four frames of a female tennis opponent in a RED short-sleeved shirt and a DARK PLEATED TENNIS SKIRT (a short flared skirt, clearly NOT shorts), her hair in a PONYTAIL, seen from the FRONT across the net, holding a racket. She is the same height and drawing style as the reference but she is a woman, not the man in the reference. Draw NO ball. Frame 1: waiting, upright, weight on one foot, racket at her side. Frame 2: the same stance with her weight on the other foot. Frame 3: leaning forward with her free hand reaching DOWN low, as if she had just patted a ball to the ground. Frame 4: the same stance with that free hand raised to about waist height. Frames 3 and 4 must be the SAME drawing with only the free hand's height changed." + }, + "opp_f_run": { + "sprites": [ + "o_run1_f", + "o_run2_f" + ], + "ref": "o_idle1", + "newart": true, + "check": "same", + "anchor": 0, + "subject": "Three frames of a female tennis opponent in a RED short-sleeved shirt and a DARK PLEATED TENNIS SKIRT, her hair in a PONYTAIL, seen from the FRONT across the net. 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 two frames of her RUNNING sideways along the baseline towards the camera's left, leaning into the stride, opposite legs forward in the two frames, ponytail trailing." + }, + "cpu_f_walk": { + "sprites": [ + "z_c1_f", + "z_c2_f", + "z_c3_f", + "z_c4_f" + ], + "ref": "z_c1", + "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." + }, + "cpu_f_wounds": { + "sprites": [ + "z_cw1_f", + "z_cw2_f", + "z_cw1b_f", + "z_cw2b_f" + ], + "ref_only": [ + "z_c1_f", + "z_cw1", + "z_cw2" + ], + "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." + }, + "player_f_serve": { + "sprites": [ + "p_toss_f", + "p_smash_f", + "p_pull_f" + ], + "ref_only": [ + "p_idle1_f" + ], + "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." + }, + "player_f_run": { + "sprites": [ + "p_run1_f", + "p_run2_f", + "p_run3_f", + "p_run4_f" + ], + "ref_only": [ + "p_idle1_f" + ], + "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." + }, + "player_f_swing": { + "sprites": [ + "p_swing1_f", + "p_swing2_f" + ], + "ref_only": [ + "p_idle1_f" + ], + "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." + }, + "player_f_fall": { + "sprites": [ + "p_die1_f", + "p_die2_f", + "p_die3_f" + ], + "ref_only": [ + "p_idle1_f" + ], + "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." + }, + "opp_f_play": { + "sprites": [ + "o_toss_f", + "o_smash_f", + "o_swing1_f", + "o_swing2_f" + ], + "ref_only": [ + "o_idle1_f" + ], + "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." + }, + "player_f_bounce": { + "sprites": [ + "p_bounce_f", + "p_bounce2_f" + ], + "ref_only": [ + "p_idle1_f" + ], + "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." } } \ No newline at end of file diff --git a/assets/o_bounce2_f.png b/assets/o_bounce2_f.png new file mode 100644 index 0000000..ad4888c Binary files /dev/null and b/assets/o_bounce2_f.png differ diff --git a/assets/o_bounce_f.png b/assets/o_bounce_f.png new file mode 100644 index 0000000..5eb1c1c Binary files /dev/null and b/assets/o_bounce_f.png differ diff --git a/assets/o_idle1_f.png b/assets/o_idle1_f.png new file mode 100644 index 0000000..6922d8e Binary files /dev/null and b/assets/o_idle1_f.png differ diff --git a/assets/o_idle2_f.png b/assets/o_idle2_f.png new file mode 100644 index 0000000..70cd731 Binary files /dev/null and b/assets/o_idle2_f.png differ diff --git a/assets/o_run1_f.png b/assets/o_run1_f.png new file mode 100644 index 0000000..81f9295 Binary files /dev/null and b/assets/o_run1_f.png differ diff --git a/assets/o_run2_f.png b/assets/o_run2_f.png new file mode 100644 index 0000000..0f28cff Binary files /dev/null and b/assets/o_run2_f.png differ diff --git a/assets/o_smash_f.png b/assets/o_smash_f.png new file mode 100644 index 0000000..dbdb607 Binary files /dev/null and b/assets/o_smash_f.png differ diff --git a/assets/o_swing1_f.png b/assets/o_swing1_f.png new file mode 100644 index 0000000..e1f0de3 Binary files /dev/null and b/assets/o_swing1_f.png differ diff --git a/assets/o_swing2_f.png b/assets/o_swing2_f.png new file mode 100644 index 0000000..6da7532 Binary files /dev/null and b/assets/o_swing2_f.png differ diff --git a/assets/o_toss_f.png b/assets/o_toss_f.png new file mode 100644 index 0000000..0d4bba3 Binary files /dev/null and b/assets/o_toss_f.png differ diff --git a/assets/p_bounce2_f.png b/assets/p_bounce2_f.png new file mode 100644 index 0000000..791c92d Binary files /dev/null and b/assets/p_bounce2_f.png differ diff --git a/assets/p_bounce_f.png b/assets/p_bounce_f.png new file mode 100644 index 0000000..ddc782a Binary files /dev/null and b/assets/p_bounce_f.png differ diff --git a/assets/p_die1_f.png b/assets/p_die1_f.png new file mode 100644 index 0000000..027ce1e Binary files /dev/null and b/assets/p_die1_f.png differ diff --git a/assets/p_die2_f.png b/assets/p_die2_f.png new file mode 100644 index 0000000..678a3ce Binary files /dev/null and b/assets/p_die2_f.png differ diff --git a/assets/p_die3_f.png b/assets/p_die3_f.png new file mode 100644 index 0000000..36a9e69 Binary files /dev/null and b/assets/p_die3_f.png differ diff --git a/assets/p_die4_f.png b/assets/p_die4_f.png new file mode 100644 index 0000000..43ece93 Binary files /dev/null and b/assets/p_die4_f.png differ diff --git a/assets/p_die5_f.png b/assets/p_die5_f.png new file mode 100644 index 0000000..0373318 Binary files /dev/null and b/assets/p_die5_f.png differ diff --git a/assets/p_idle1_f.png b/assets/p_idle1_f.png new file mode 100644 index 0000000..dc32059 Binary files /dev/null and b/assets/p_idle1_f.png differ diff --git a/assets/p_idle2_f.png b/assets/p_idle2_f.png new file mode 100644 index 0000000..b4d2405 Binary files /dev/null and b/assets/p_idle2_f.png differ diff --git a/assets/p_pull_f.png b/assets/p_pull_f.png new file mode 100644 index 0000000..8d34b2a Binary files /dev/null and b/assets/p_pull_f.png differ diff --git a/assets/p_run1_f.png b/assets/p_run1_f.png new file mode 100644 index 0000000..82a4096 Binary files /dev/null and b/assets/p_run1_f.png differ diff --git a/assets/p_run2_f.png b/assets/p_run2_f.png new file mode 100644 index 0000000..4b30bcb Binary files /dev/null and b/assets/p_run2_f.png differ diff --git a/assets/p_run3_f.png b/assets/p_run3_f.png new file mode 100644 index 0000000..6529c8d Binary files /dev/null and b/assets/p_run3_f.png differ diff --git a/assets/p_run4_f.png b/assets/p_run4_f.png new file mode 100644 index 0000000..79faad0 Binary files /dev/null and b/assets/p_run4_f.png differ diff --git a/assets/p_smash_f.png b/assets/p_smash_f.png new file mode 100644 index 0000000..0d80c7b Binary files /dev/null and b/assets/p_smash_f.png differ diff --git a/assets/p_swing1_f.png b/assets/p_swing1_f.png new file mode 100644 index 0000000..66d9017 Binary files /dev/null and b/assets/p_swing1_f.png differ diff --git a/assets/p_swing2_f.png b/assets/p_swing2_f.png new file mode 100644 index 0000000..c29bb37 Binary files /dev/null and b/assets/p_swing2_f.png differ diff --git a/assets/p_toss_f.png b/assets/p_toss_f.png new file mode 100644 index 0000000..6f205db Binary files /dev/null and b/assets/p_toss_f.png differ diff --git a/assets/tour_m.png b/assets/tour_m.png new file mode 100644 index 0000000..7c10bcc Binary files /dev/null and b/assets/tour_m.png differ diff --git a/assets/tour_w.png b/assets/tour_w.png new file mode 100644 index 0000000..b61ae52 Binary files /dev/null and b/assets/tour_w.png differ diff --git a/assets/z_c1_f.png b/assets/z_c1_f.png new file mode 100644 index 0000000..c4ee1ce Binary files /dev/null and b/assets/z_c1_f.png differ diff --git a/assets/z_c2_f.png b/assets/z_c2_f.png new file mode 100644 index 0000000..bd2d0f8 Binary files /dev/null and b/assets/z_c2_f.png differ diff --git a/assets/z_c3_f.png b/assets/z_c3_f.png new file mode 100644 index 0000000..9a5707c Binary files /dev/null and b/assets/z_c3_f.png differ diff --git a/assets/z_c4_f.png b/assets/z_c4_f.png new file mode 100644 index 0000000..bd8ac8d Binary files /dev/null and b/assets/z_c4_f.png differ diff --git a/assets/z_cw1_f.png b/assets/z_cw1_f.png new file mode 100644 index 0000000..acd8114 Binary files /dev/null and b/assets/z_cw1_f.png differ diff --git a/assets/z_cw1b_f.png b/assets/z_cw1b_f.png new file mode 100644 index 0000000..861f3f5 Binary files /dev/null and b/assets/z_cw1b_f.png differ diff --git a/assets/z_cw2_f.png b/assets/z_cw2_f.png new file mode 100644 index 0000000..84113e1 Binary files /dev/null and b/assets/z_cw2_f.png differ diff --git a/assets/z_cw2b_f.png b/assets/z_cw2b_f.png new file mode 100644 index 0000000..7f94a26 Binary files /dev/null and b/assets/z_cw2b_f.png differ diff --git a/config.js b/config.js index 3ac4231..4740748 100644 --- a/config.js +++ b/config.js @@ -408,6 +408,15 @@ export const COURTS = [ out: '#25452f', lawn: '#1c3e5c', stripe: '#1c3e5c' } }, ]; +// The tour, picked on the same screen as the court. Only the two TENNIS PLAYERS and the turned CPU +// (the racket zombie — a zombified opponent) have a second drawing; the horde, the officials and +// the ball boys are shared, because they are staff, not the draw. `sfx` is the sprite-name suffix +// render.js appends: null means "the frames as drawn", which is the men's set. +export const TOURS = [ + { id: 'men', name: "MEN'S SINGLES", tile: 'tour_m', sfx: null }, + { id: 'women', name: "WOMEN'S SINGLES", tile: 'tour_w', sfx: '_f' }, +]; + // netW was the singles-stick width (10.06) while the court is drawn to the DOUBLES lines, so the // net stopped 0.46 m short of each sideline and visibly failed to meet the court edge. The posts // now stand exactly on the doubles sidelines. diff --git a/index.html b/index.html index ff61ffe..f6b9b4f 100644 --- a/index.html +++ b/index.html @@ -123,10 +123,22 @@ border: 2px solid #3b4354; color: inherit; font: inherit; text-align: left; cursor: pointer; -webkit-tap-highlight-color: transparent; } #courts button.court.on { border-color: #e0cc72; background: rgba(224,204,114,0.10); } - #courts img { width: 108px; height: 72px; display: block; image-rendering: pixelated; flex: none; } - #courts b { display: block; font: 400 11px Silkscreen, monospace; color: #dfe6f2; letter-spacing: 0.5px; } - #courts i { display: block; margin-top: 5px; font: 400 9px Silkscreen, monospace; color: #8a96ab; font-style: normal; } + /* scoped to #courtList, not #courts: the tour tiles above are portrait figures and must not + inherit the 108x72 court-thumbnail box */ + #courtList img { width: 108px; height: 72px; display: block; image-rendering: pixelated; flex: none; } + #courtList b { display: block; font: 400 11px Silkscreen, monospace; color: #dfe6f2; letter-spacing: 0.5px; } + #courtList i { display: block; margin-top: 5px; font: 400 9px Silkscreen, monospace; color: #8a96ab; font-style: normal; } #courts .acts { margin-top: 16px; } + /* the tour: two tiles SIDE BY SIDE, not two more full-width rows. The court screen already carries + three rows and a pair of buttons, and a phone has no room left. The figures face the camera — + in play you only ever see your player from behind, so a rear view would show nothing. */ + #tours { display: flex; gap: 8px; width: min(340px, 84vw); margin: 0 auto 10px; } + #tours button { flex: 1; display: flex; flex-direction: column; align-items: center; gap: 6px; + padding: 8px 6px 10px; background: rgba(255,255,255,0.04); border: 2px solid #3b4354; + color: inherit; font: inherit; cursor: pointer; -webkit-tap-highlight-color: transparent; } + #tours button.on { border-color: #e0cc72; background: rgba(224,204,114,0.10); } + #tours img { height: 92px; width: auto; display: block; image-rendering: pixelated; } + #tours b { font: 400 10px Silkscreen, monospace; color: #dfe6f2; letter-spacing: 0.5px; } /* tutorial: Marvin on the left, his line and the picture on the right */ #tutorial .page { display: flex; align-items: flex-end; gap: 14px; width: min(360px, 88vw); margin: 0 auto; text-align: left; min-height: 190px; } @@ -159,9 +171,11 @@
- +