The whites take a wash, the friend brings their own colours, and the menu shows the man
Three things off the back of the picker. THE LIVE PLAYER on the setup screen is the real sprite through the real tint, not a mock-up of the pick — so the menu cannot promise a colour the court will not keep. It redraws on every tap of a tour, a kit or a skin. THE WOMEN'S TOUR IS NO LONGER SAT OUT. Her set is drawn head to toe in whites, so there was no hue to rotate — the answer is not a dye but a WASH: the pick laid over her whites at a low saturation with the lightness kept, which is how you dye a white kit in life and gives rose, powder blue, mint, lilac. Her hair and skin fall out of it on lightness alone, which is exactly what a dye could not manage. THE FRIEND ACROSS THE NET now wears what they picked on their own phone. Their look crosses on pairing, and since the opponent art is red rather than blue the kit rides its own hue arc — safe there for the one reason it would not be on the player's own sheets: the opponent sprites carry no drawn blood. An older build simply never sends it and the opponent draws as before; the match still plays. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
1 parent
1daa3e9d6a
commit
b5838b2b24
6 files changed
+194
-64
No files matched your search
+13
-2
@@ -17,8 +17,8 @@
|
||||
//
|
||||
// ponytail: no reconnect-and-resume. A dropped radio ends the match with a card; the recorded
|
||||
// plan calls reconnection "the bulk of the real work" and a prototype must not start there.
|
||||
import { COURT, UI } from './config.js';
|
||||
import { G, P, O, ball, score, setupPoint, selectCourt, court } from './state.js';
|
||||
import { COURT, UI, KITS, SKINS } from './config.js';
|
||||
import { G, P, O, ball, score, setupPoint, selectCourt, court, kit, skin } from './state.js';
|
||||
import { pointTo, fault, showModal, tossBall } from './gameplay.js';
|
||||
import { startMatch, matchReady, resolveInterlude, netMatchWon } from './beats.js'; // runtime-only cycle: beats sends verdicts back through this module
|
||||
import { zombies } from './zombies.js';
|
||||
@@ -116,6 +116,9 @@ function netSync(m) {
|
||||
|
||||
function netStart(side, death, courtId) {
|
||||
G.net.ready = true; G.net.side = side;
|
||||
// tell them how we look, the moment there is somebody to tell. Sent once, on pairing: neither
|
||||
// phone can change its pick mid-match, because the setup screen is only reachable between runs.
|
||||
send({ t: 'look', k: kit.id, s: skin.id });
|
||||
G.modal = null; G.modalQ.length = 0; // the waiting card has done its job
|
||||
// THE HOST'S COURT RIDES THE ROOM, exactly as the death-match pick does — two phones playing the
|
||||
// same rally on two different surfaces disagree about the bounce as well as the picture, and the
|
||||
@@ -176,6 +179,14 @@ export function netMsg(m) {
|
||||
else if (m.t === 'fault') netApplyFault();
|
||||
else if (m.t === 'dead') netMatchWon(); // their blood ran out: this side's win ending
|
||||
else if (m.t === 'pos') { G.net.opp = m; if (m.srv) netSync(m); }
|
||||
// WHAT THEY LOOK LIKE. Their phone's kit and skin, resolved against our own tables so a build
|
||||
// that has never heard of a colour falls back to the drawn one rather than drawing nothing.
|
||||
// Unknown message types are ignored above, so an older build simply never sends this and their
|
||||
// friend sees the opponent as drawn — the match still plays.
|
||||
else if (m.t === 'look') G.net.look = {
|
||||
kit: KITS.find(k => k.id === m.k) || KITS[0],
|
||||
skin: SKINS.find(s => s.id === m.s) || SKINS[0],
|
||||
};
|
||||
}
|
||||
|
||||
// ticked from update() while G.net: the position stream out, the O sprite in
|
||||
|
||||
Reference in new issue
Block a user