The host names the stakes: classic tennis, or the death match

Three chips under VS A FRIEND — the host's pick rides the room and the
start message rebuilds both courts on pairing. In the death match your
opponent IS the zombie: their lost points tear its wound stages, their
won points draw your blood, and bleeding out crosses the wire as the
other phone's win. The same receiver-is-judge verdicts drive the match
machinery through resolveInterlude, so the fall, the mop beat and the
burst come along unmodified. New: gushProne — the game-winning body
bleeds out on the ground, from prone-height anchors, until it bursts.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
wuwiandClaude Fable 5 committed 2026-08-14 18:02:44 +02:00
1 parent 5e80c4e69d
commit c0b59eee90
10 files changed
+241 -26

No files matched your search

+6 -2
View File
@@ -161,11 +161,15 @@ class Handler(SimpleHTTPRequestHandler):
code = ''.join(random.choice(WS_ALPHABET) for _ in range(4))
ROOMS[code] = [me]
me['room'] = code
# the host's ONE decision rides the room: classic tennis or the death match. The
# start message carries it to both phones, so the joiner never has to be asked.
me['death'] = 'death=1' in self.path
if len(ROOMS) > 200: # a lobby is two people; 200 stale rooms is a flood
ROOMS.pop(next(iter(ROOMS)))
if me['peer']: # paired: the host serves first, on both scoreboards
ws_send(me['peer'], '{"t":"start","side":"A"}')
ws_send(me, '{"t":"start","side":"B"}')
death = 'true' if me['peer'].get('death') else 'false'
ws_send(me['peer'], '{"t":"start","side":"A","death":%s}' % death)
ws_send(me, '{"t":"start","side":"B","death":%s}' % death)
else:
ws_send(me, json.dumps({'t': 'room', 'code': me['room']}))
try: