https://gitlab.synchro.net/main/sbbs/-/commit/f5578ea57f856e06816444ad
Added Files:
src/doors/syncconquer/CMakeLists.txt DEFERRED.md DESIGN.md build.sh deploy.sh src/doors/syncconquer/door/door.h door_core.c door_input.c door_input.h door_io.c door_io.h door_node.c door_node.h soundio_termgfx.cpp video_termgfx.cpp wwkeyboard_termgfx.cpp src/doors/syncconquer/plans/2026-07-06-m1-vendor-headless.md 2026-07-07-m2-phase1-door.md src/doors/syncconquer/plans/m2-proto/FACTS.md keystone.patch menu-headless.png video_capture_extra.cpp src/doors/syncconquer/resources src/doors/termgfx/CLAUDE.md xtrn/syncalert/.gitignore fetch-assets.sh install-xtrn.ini
Modified Files:
src/doors/syncconquer/PROVENANCE.md src/doors/syncconquer/vanilla/common/soundio_common.cpp video_null.cpp src/doors/syncconquer/vanilla/redalert/conquer.cpp globals.cpp init.cpp src/doors/termgfx/README.md audio.c geometry.c geometry.h
Log Message:
syncalert: Red Alert (Command & Conquer) door for Synchronet
A terminal-playable Red Alert for Synchronet BBS -- the "SyncConquer"
door family's first title (syncalert = Red Alert; syncdawn = Tiberian
Dawn, deferred). Renders the running Vanilla Conquer engine to a sixel/JPEG-XL/PPM/text-block frame over the wire, maps terminal keyboard
and mouse to the engine, and streams the game audio as SyncTERM audio
APCs. Design and deferred-scope notes in DESIGN.md/DEFERRED.md; every vendored-engine edit is tracked in PROVENANCE.md.
Build & assets: build.sh drives the headless CMake build (the top-level CMakeLists folds the termgfx-backed video/keyboard/audio shims into the VanillaRA target and defines NEW_VIDEO_BUILD); fetch-assets.sh pulls the
RA95 freeware CD from archive.org (checksum-pinned) and extracts the MIX archives -- nothing EA-copyrighted is redistributed.
Rendering: a shared termgfx pipeline (sixel/JXL/text encoders, the APC
image transport, cap-probe, geometry). Tier auto-selection from the DA1/CTDA/Q;JXL probes with an F4 manual cycle (JXL > sixel > PPM > half/quadrant/sextant); DSR-ACK pacing with AIMD depth; whole-frame
de-dupe; OS-pointer-as-RTS-cursor.
Input: CSI/SS3/kitty/evdev keys and SGR mouse into the engine's
WWKeyboard; real held modifiers on evdev/kitty, plus SGR-report modifier
bits and SGR-Pixels (DEC 1016, auto-detected) so modifier-clicks and a pixel-granular cursor work where the terminal allows.
Audio: engine-decoded AUD/ADPCM PCM shipped through termgfx's audio_mgr
as upload-once SFX and a looping music track (Ogg/Opus, door-side disk
cache, C;L client-cache skip).
Synchronet integration: install-xtrn.ini, per-user UserPath via a
per-home REDALERT.INI + argv[0] override (multi-node safe), DOOR32.SYS, pre-engine asset validation, SIGTERM drain/teardown, argv sanitization,
node status / Ctrl-U / Ctrl-P, per-node logging, deploy.sh, and client-charset-aware block tiers (terminal.ini).
Vendored-engine local patches (PROVENANCE.md): fail-loud Bootstrap
mixfile caching, streamed-score whole-file decode (the ring path
desynced the IMA-ADPCM decoder), bNoMovies, and the video/keyboard/audio
seams. termgfx gained the audio_mgr music path, an Ogg/Opus resample, geom_fit_ex, and audio gain-staging / decode documentation
(README/CLAUDE).
Includes the live-test hardening pass: asset permissions, audio routing
and the score-decode fix, F4 under evdev, mouse/cell-size and sixel-
scroll geometry, screen-clear on tier change, per-tier bandwidth stats,
and the charset/tier gating above.
Co-Authored-By: Claude Fable 5 <
noreply@anthropic.com>
---
þ Synchronet þ Vertrauen þ Home of Synchronet þ [vert/cvs/bbs].synchro.net