• src/doors/syncdoom/README

    From Rob Swindell (on Debian L@VERT to Git commit to main/sbbs/m on Sat Jun 20 14:04:00 2026
    https://gitlab.synchro.net/main/sbbs/-/commit/1844f1eb9b9083eae6d18879
    Modified Files:
    src/doors/syncdoom/README.md xtrn/syncdoom/controls.msg lobby.js
    Log Message:
    syncdoom: lobby help -- terminals & video-modes section; presentation fixes

    - controls.msg: add a TERMINALS & VIDEO MODES section (JXL needs SyncTERM 1.4+,
    sixel terminals, CP437/UTF-8 ANSI text), shorten "Run (toggle)", and replace
    the esoteric Ctrl-A cursor-right indent codes (and a stray trailing Ctrl-Z)
    with plain spaces so the file edits cleanly in any editor.
    - lobby.js: drop the redundant "Command:" prompt (the art is the menu) and stop
    passing P_NOPAUSE so the now-longer help auto-paginates.
    - README: JXL needs SyncTERM 1.4+, not 1.2+ (per src/syncterm/CHANGES).

    Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

    ---
    þ Synchronet þ Vertrauen þ Home of Synchronet þ [vert/cvs/bbs].synchro.net
  • From Rob Swindell (on Debian L@VERT to Git commit to main/sbbs/m on Sat Jun 20 14:04:00 2026
    https://gitlab.synchro.net/main/sbbs/-/commit/c17b099cc2c583f0adfc6fcc
    Modified Files:
    src/doors/syncdoom/README.md
    Log Message:
    syncdoom: document WASD controls and DeHackEd/WAD-merge support

    Rewrite the in-game controls section of the door README for the WASD scheme and the type-cheats/save-names-in-UPPERCASE rule, and document the -deh DeHackEd/BEX
    patch loading and -merge WAD-merge support now built into the door.

    Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

    ---
    þ Synchronet þ Vertrauen þ Home of Synchronet þ [vert/cvs/bbs].synchro.net
  • From Rob Swindell (on Debian L@VERT to Git commit to main/sbbs/m on Sat Jun 20 14:04:00 2026
    https://gitlab.synchro.net/main/sbbs/-/commit/96a148297f256e0fb9f02f66
    Modified Files:
    src/doors/syncdoom/README.md m_menu.c render_text.c render_text.h syncdoom.c xtrn/syncdoom/controls.msg lobby.js syncdoom.example.ini
    Log Message:
    syncdoom: Ctrl-N dither toggle + per-user syncdoom.ini; fix dither washout on F4 cycle

    - Dither washout fix: init_noise() rescaled noise_textures in place, and rt_config
    calls it on every F4 tier cycle, so the repeated rescaling flattened the dither
    until it vanished and never came back. Guard it to scale once (color depth is
    fixed for the life of the process). User-confirmed on Windows Terminal (8-bit).
    - Per-user prefs: the per-user file is now a sectioned syncdoom.ini in -home
    ([input] kp* graces + [video] dither), mirroring the house syncdoom.ini beside
    the exe (was a flat input.ini). Saved read-modify-write so unmanaged keys
    survive. Precedence: built-in -> house ini -> per-user -> CLI.
    - [video] dither = auto|on|off (auto = by color depth: on at 256-color, off at
    16-color and truecolor) plus a live Ctrl-N toggle -- no function key was free,
    so 0x0E is intercepted at the door level (never reaches Doom). rt_set_dither()
    re-derives the dither state without rescaling. Dither is text-tier only; off
    also trims text bandwidth (fewer SGR color escapes from broken-up flat runs). - Docs: Ctrl-N row in controls.msg (byte-correct codes + the per-user note) and
    the README controls table; example.ini [video] dither + per-user overlay note.
    - Lobby: drop the redundant console.pause() in sd_controls -- printfile's
    auto-pause is the single dismissal; trimmed controls.msg to one screen.

    Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

    ---
    þ Synchronet þ Vertrauen þ Home of Synchronet þ [vert/cvs/bbs].synchro.net
  • From Rob Swindell (on Debian L@VERT to Git commit to main/sbbs/m on Sun Jun 21 00:59:00 2026
    https://gitlab.synchro.net/main/sbbs/-/commit/1c8e12283a76e76768ba3e51
    Modified Files:
    src/doors/syncdoom/README.md m_menu.c syncdoom.c xtrn/syncdoom/controls.msg syncdoom.example.ini
    Log Message:
    syncdoom: adaptive frame pacing to lift remote frame rate (Ctrl-T / Ctrl-S)

    Over a high-latency link the DSR per-frame pacing capped the frame rate at ~1/RTT (a slideshow). Make the number of frames "in flight" configurable and, by default, adaptive.

    - [video] frames_in_flight = 1..5 | auto (now the default). A pipeline lets
    several frames cross the link at once, lifting a far-away player's frame rate
    toward Doom's 35fps sim; on a fast LAN it goes well past that (duplicate
    re-renders between tics -- a frame-dedupe pass, next, will trim those).
    - auto = delay-based + bandwidth-aware congestion control: base depth from the
    BASELINE (windowed-min) RTT, back off when the current RTT inflates above it
    (a queue we're causing), and cap at the bandwidth-delay product (recent_fps x
    min_RTT) so a high-latency *low-bandwidth* link (a far VPN) can't over-pipeline
    and bloat the input lag. Validated live across LAN and VPN, and in simulation
    (stable / queuing / bandwidth-limited links).
    - Ctrl-T cycles the depth (1..5 -> auto) live and saves it per-user; Ctrl-S
    toggles a top-right stats overlay (tier / fps / RTT current+baseline / depth).
    - Exit telemetry logs RTT (current + baseline min) and the effective depth.
    - Built-in default is auto (door is new -- no installed base to surprise); the
    example.ini ships frames_in_flight = auto. README + controls.msg + the F1
    help document the keys.

    Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

    ---
    þ Synchronet þ Vertrauen þ Home of Synchronet þ [vert/cvs/bbs].synchro.net
  • From Rob Swindell (on Debian L@VERT to Git commit to main/sbbs/m on Sun Jun 21 00:59:00 2026
    https://gitlab.synchro.net/main/sbbs/-/commit/aca73d11b58ef35374d9da33
    Modified Files:
    src/doors/syncdoom/README.md syncdoom.c xtrn/syncdoom/syncdoom.example.ini
    Log Message:
    syncdoom: AIMD auto-depth controller, stable depth, lag relabel, cap 8

    Follow-up to dfd77154e. Live VPN testing showed the base-minus-penalty auto depth oscillating 4/5<->1 on a jittery link, and the depth-1 dips were a slideshow. Rework the controller and the supporting RTT measurement.

    - auto depth is now a delay-based AIMD controller with a dead-band and a rate
    limit (max_inflight is a pure getter; auto_depth_update runs per DSR report):
    probe up one when the round-trip is clean (<1.25x baseline), ease down when it
    queues, HOLD in between -> it SETTLES at the link's sustainable depth instead
    of hunting. Heavy queuing eases down (no longer slams to 1). Validated: holds
    high on a fat VPN, stable on LAN, no oscillation.
    - RTT baseline integrity: a reclaimed frame's late DSR report could be
    mis-matched to a freshly-sent one, reading absurdly low and collapsing the
    ceiling to depth 1 (the "manual cycle -> dips to 1 -> slow crawl back" bug).
    Two guards: skip exactly the reports owed by reclaimed frames (g_dsr_stale),
    and ignore any sample far below the smoothed RTT.
    - g_rt_high (renamed from the misleading "g_remote"): the frame round-trip is
    network latency PLUS the client's decode/render time, so a LAN with non-instant
    JXL decode legitimately has a ~50ms round-trip. Once it's non-trivial, floor
    depth at 2 (depth 1 there only caps the frame rate) -- latched, so a corrupted
    sample can never strand a remote player at depth 1.
    - Relabel the displayed/logged "RTT" -> "lag": it isn't pure ping (includes
    decode), so "lag" is honest. Overlay, Ctrl-T popup, exit telemetry.
    - Raise the depth cap 5 -> 8 (DEPTH_MAX; DSR ring widened to 16). On a high-
    latency link frame rate ~= depth/round-trip, so 5 left fps on the table (e.g.
    ~19fps at depth 5 / 230ms); depth 8 reaches the 35fps sim cap there. auto
    climbs to ~6 on such a link on its own; 7-8 are manual. Docs updated.

    Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

    ---
    þ Synchronet þ Vertrauen þ Home of Synchronet þ [vert/cvs/bbs].synchro.net
  • From Rob Swindell (on Debian L@VERT to Git commit to main/sbbs/m on Mon Jun 22 00:57:00 2026
    https://gitlab.synchro.net/main/sbbs/-/commit/9f4ea24b3a4f4146d166b8a2
    Modified Files:
    src/doors/syncdoom/README.md syncdoom.c xtrn/syncdoom/syncdoom_lib.js Log Message:
    syncdoom: case-insensitive WAD resolution (DOOM2.WAD vs doom2.wad)

    On a case-sensitive (Linux) filesystem a configured "doom2.wad" did not find a real DOOM2.WAD -- DOS/Windows WADs are commonly upper-case -- so the lobby hid the wadset and the door reported it "not found". Resolve case-insensitively with
    the stock helpers: the lobby uses file_getcase() (presence check + launch args),
    and the door's wadcopy() uses fexistcase() (xpdev dirwrap), which rewrites the path to the real on-disk case. A no-op on case-insensitive (Windows) filesystems.

    Reported by nelgin.

    Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

    ---
    þ Synchronet þ Vertrauen þ Home of Synchronet þ [vert/cvs/bbs].synchro.net
  • From Rob Swindell (on Debian L@VERT to Git commit to main/sbbs/m on Mon Jun 22 00:57:00 2026
    https://gitlab.synchro.net/main/sbbs/-/commit/675892c7332670412e9c2622
    Modified Files:
    src/doors/syncdoom/README.md doomgeneric.h i_input.c syncdoom.c xtrn/syncdoom/README.md syncdoom.example.ini
    Log Message:
    syncdoom: terminal mouse steering (xterm SGR mouse)

    On SyncTERM and other xterm-mouse-capable clients the door now turns with
    the mouse, which bypasses Doom's turn-acceleration ramp and the door's key-up-synthesis grace machinery entirely -- so turning is markedly
    smoother and more precise than the arrow keys (no key-repeat lag).

    Terminals report the pointer's ABSOLUTE, screen-clamped cell position
    (no relative deltas, and the host can't recenter the pointer), so the
    model is a virtual joystick: the pointer's horizontal offset from
    screen-center sets a turn RATE -- hold it left of center to keep turning
    left, return to center to stop. A relative-delta "native feel" model was prototyped and dropped (it stalls uselessly at the window edge). An idle timeout relaxes steering to neutral when the pointer stops reporting, so abandoning it off-center (e.g. alt-tabbing away) no longer spins forever
    -- terminals send no focus-out event to signal it.

    Buttons map to Doom's defaults: left = fire, right = strafe-modifier,
    middle = forward. Vertical mouse and the wheel are unused. Button state
    comes only from real press/release events, never from motion reports
    (a motion report can carry stale/phantom button bits, which otherwise
    stuck the fire bit on while steering).

    Enable/disable with [input] mouse = on|off (default on) or -mouse on|off;
    saved per-user, suppressed in menus and while typing chat, and simply
    inert on terminals without mouse reporting.

    Implementation: parse SGR mouse reports (ESC[<b;col;row M/m) in the CSI
    parser (enlarged the param buffer); DG_GetMouse() projects state to a
    per-tic ev_mouse posted from I_GetEvent(); enable/disable the tracking
    modes (?1003h/?1006h) in DG_Init/terminal_restore.

    Also fixes the in-game Ctrl-P key, which a stale "return 't'" alias had
    been shadowing so it opened talk instead of reaching the page handler.

    Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

    ---
    þ Synchronet þ Vertrauen þ Home of Synchronet þ [vert/cvs/bbs].synchro.net
  • From Rob Swindell (on Debian L@VERT to Git commit to main/sbbs/m on Mon Jun 22 01:07:00 2026
    https://gitlab.synchro.net/main/sbbs/-/commit/6c1d2c906dac79f95b2a1225
    Modified Files:
    src/doors/syncdoom/README.md m_menu.c syncdoom.c xtrn/syncdoom/syncdoom.example.ini
    Log Message:
    syncdoom: Ctrl-O toggles mouse steering in-game + F1 help line

    Ctrl-O now flips terminal mouse steering on/off live, mirroring the Ctrl-S/Ctrl-T door hotkeys: it flashes a "MOUSE ON/OFF" label, switches
    the xterm tracking modes to match (?1003h/?1006h on, ?1003l/?1006l off),
    and saves the setting per-user. Turning it off also drops any held button
    and the last pointer offset so the player stops cleanly. This doubles as
    the per-user off switch for anyone who doesn't want mouse control.

    Also adds a "CTRL-O MOUSE / CTRL-S STATISTICS" line to the F1 controls
    help screen, shifting the control list up a few pixels to keep it clear
    of the skull.

    Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

    ---
    þ Synchronet þ Vertrauen þ Home of Synchronet þ [vert/cvs/bbs].synchro.net
  • From Rob Swindell (on Debian L@VERT to Git commit to main/sbbs/m on Sun Jun 28 23:51:00 2026
    https://gitlab.synchro.net/main/sbbs/-/commit/5b784e694db6d0eb5f47ba03
    Modified Files:
    src/doors/syncdoom/README.md m_menu.c syncdoom.c src/doors/syncduke/README.md
    Log Message:
    syncdoom: kitty keyboard protocol -- true key-up, hold-to-move, native turn

    Port SyncDuke's kitty keyboard support to SyncDOOM. On a terminal that speaks the
    kitty keyboard protocol (e.g. Contour) the door queries support at startup (CSI?u),
    pushes the progressive-enhancement flags on the reply (CSI>11u), and pops them on
    exit -- so it gets explicit key press/repeat/release instead of faking key-up with a
    timeout. Gated: terminals that don't answer keep the existing key-up-synthesis scheme, byte-for-byte unchanged.

    Under kitty:
    - parse_byte() handles the CSI-u key events plus the disambiguated F-key/nav forms
    Contour sends (F1=CSI P, F2=CSI Q, F3=13~, F4=CSI S, F5=15~, F6=17~; Home=CSI H,
    End=CSI F; numpad Private-Use-Area codepoints incl. numpad Enter). kitty_dispatch()
    routes door hotkeys (F4 tier-cycle, Ctrl-S/T/O/U/P) to key_seen() on press only and
    game keys to explicit keyq_push down/up -- bypassing the s_active grace machinery,
    so movement holds and Doom's native turn-accel ramp runs.
    - The Ctrl-S stats strip shows "kbd:kitty".
    - Options shows the now-moot TAP/HOLD/TURN/FAST-TURN knobs as "NATIVE" (the byte-path
    key-feel tuning does nothing with real key-up).
    - Home/End in a menu jump to the first/last item.

    Also document the kitty behavior in both door READMEs. Validated on Contour; SyncTERM and other terminals unaffected.

    Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

    ---
    þ Synchronet þ Vertrauen þ Home of Synchronet þ [vert/cvs/bbs].synchro.net
  • From Rob Swindell (on Debian L@VERT to Git commit to main/sbbs/m on Fri Jul 3 01:03:00 2026
    https://gitlab.synchro.net/main/sbbs/-/commit/3b8821c026f1c0d4a28e8ef9
    Modified Files:
    src/doors/syncdoom/README.md syncdoom.c src/doors/syncduke/README.md syncduke_door.c
    Log Message:
    SyncDOOM & SyncDuke: -help/usage banner + document every command-line argument

    Both doors now print a full option list on -help/--help/-?//? or a bare launch (no socket/args -> nothing to do but explain how to run it). SyncDOOM prints it from main(); SyncDuke prints it from its pre-main constructor, before the vendored engine parses argv (with an fflush since the caller _exit()s and that does not flush stdio). The banners group the door's own options (session, video,
    input, WADs, multiplayer client/server for Doom; session, config, multiplayer, engine slash-opts for Duke) and note that unrecognized switches pass through to the game engine.

    READMEs filled out to match: SyncDOOM gains -eventlog, -scaling, -wadname, a multiplayer client table (incl. -mustered) and the server metadata args (-maxplayers/-host/-wadset/-gamemode/-advertise/-gamesdir); SyncDuke gains -t, -name, -eventlog, tables for the -netrole/-netport/-netpeer and engine slash args, and its stale "single-player only, no multiplayer/audio" status line is corrected.

    Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
    Claude-Session: https://claude.ai/code/session_01KYmBzSZGyRondAXevh9RJP

    ---
    þ Synchronet þ Vertrauen þ Home of Synchronet þ [vert/cvs/bbs].synchro.net
  • From Rob Swindell (on Debian L@VERT to Git commit to main/sbbs/m on Sat Jul 4 00:42:00 2026
    https://gitlab.synchro.net/main/sbbs/-/commit/7adbd05c642e3a12eab697a6
    Modified Files:
    src/doors/syncdoom/README.md syncdoom.c src/doors/syncduke/README.md syncduke.h syncduke_input.c syncduke_node.c src/doors/termgfx/sbbs_node.c
    Log Message:
    syncduke/syncdoom: in-game Ctrl-P inter-node paging & messaging

    Add a non-blocking page/message overlay to both doors, opened with Ctrl-P during play. It lists who's online, then you type a message over the running game -- the game keeps ticking (your player just stands still, like the 'T' chat), so a co-op match never stalls waiting on your tics. A leading node number ("5 hi" / "5: hi") targets one node; a blank prefix broadcasts to every other online node. Esc, or a blank message, cancels; with nobody else online
    it just shows a "No one else is online" notice, like Ctrl-U.

    Each door routes the compose through its existing key path -- SyncDOOM feeds ASCII, SyncDuke feeds scancodes -- so printable text is captured in the ASCII layer and Enter/Esc/Backspace at the scancode chokepoint (press/hold_press), swallowing everything else so no movement leaks while you type. SyncDOOM
    forces a frame repaint per keystroke (its frame de-dupe would otherwise drop the overlay while you stand still); SyncDuke's banner has its own dirty signal.

    The incoming message reads "Node N: <sender> sent you a message: <text>" (shared termgfx sbbs_page_node), matching Synchronet's own user-message wording. The READMEs now document Ctrl-U (who's online) and Ctrl-P.

    Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

    ---
    þ Synchronet þ Vertrauen þ Home of Synchronet þ [vert/cvs/bbs].synchro.net
  • From Rob Swindell (on Windows@VERT to Git commit to main/sbbs/m on Sun Jul 5 14:25:00 2026
    https://gitlab.synchro.net/main/sbbs/-/commit/58a91e61093ea71d983e0918
    Modified Files:
    src/doors/syncdoom/README.md i_termsound.c src/doors/syncduke/README.md Log Message:
    syncduke/syncdoom: READMEs -- audio + native key-up need SyncTERM 1.10

    State the minimum SyncTERM versions for the terminal-side features (verified against the SyncTERM commit history: master = v1.10a, the syncterm-1.9 branch has neither):

    - Full audio (digital SFX + OPL-rendered music over the audio APC channel)
    requires SyncTERM v1.10+ (audio_apc.c, master-only); other terminals play
    silent but fully playable.
    - Native key-up via SyncTERM's evdev key reports requires v1.10+ too (conio
    "Add physical key event reporting", master-only).
    - JXL remains v1.4+ (already documented).

    SyncDOOM's README had no audio coverage at all -- add an Audio section -- and its key-up paragraph predated the evdev support: it credited only kitty terminals and cited a "kbd:kitty" stats token that doesn't exist (the strip shows "evdev/" or "kitty/" + nat/syn). Also fix i_termsound.c's stale header comment claiming music "stays absent for now" (i_termmusic.c has existed since the music port).

    Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

    ---
    þ Synchronet þ Vertrauen þ Home of Synchronet þ [vert/cvs/bbs].synchro.net
  • From Rob Swindell (on Windows@VERT to Git commit to main/sbbs/m on Sun Jul 5 16:37:00 2026
    https://gitlab.synchro.net/main/sbbs/-/commit/42b968575b3f556a9306fb5a
    Modified Files:
    src/doors/syncdoom/README.md i_system.c syncdoom.c xtrn/syncdoom/syncdoom.example.ini
    Log Message:
    syncdoom: log fatal errors to a file instead of a modal dialog

    A fatal engine error (I_Error -- e.g. a bad WAD) popped a modal GUI dialog (MessageBoxW on Win32, zenity on *nix). In a door that is actively harmful:
    the box BLOCKS the door process, and under a Windows service it lands on a non-interactive window station nobody can dismiss, so the node hangs until the session times out while the remote user sees a frozen screen -- and the sysop usually never sees the box at all.

    Record the error durably and non-interactively instead:

    - I_Error routes the message through dlog() -- stderr (captured into the BBS
    log on *nix) plus, on Win32, OutputDebugString (DebugView) -- then exits.
    - Add a durable file log, off by default: -log <path>, syncdoom.ini
    [debug] log, or $SYNCDOOM_LOG. dlog() now writes every diagnostic line and
    the fatal error to it. A bare filename lands in <SBBSDATA>/syncdoom/ (the
    door's data dir), a path with a separator is used verbatim; the filename is
    node-tagged as syncdoom_n<node>.log so concurrent sessions don't collide.
    This matters most on Windows, where a native socket door's stderr is NOT
    captured by the BBS (no EX_STDOUT pipe), so the file is the only durable sink.
    - Remove the now-dead popup code (MessageBoxW / CFUserNotification / zenity
    helpers) and the -nogui parm that only suppressed it.

    Also drop the -l<rows> fallback option: the door always live-probes the terminal size (then terminal.ini, else a 25-row default), so a manual row count is never needed. This also fixes a latent bug -- the -l prefix match silently swallowed -log -- and a legacy -l%R from an existing install command line is still harmlessly stripped before the engine sees it.

    Verified under MSVC: a forced I_Error (bogus IWAD) exits promptly with no dialog and writes the banner + "FATAL: ..." to <data>/syncdoom/syncdoom_n<N>.log
    via both the -log arg and the env var.

    Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

    ---
    þ Synchronet þ Vertrauen þ Home of Synchronet þ [vert/cvs/bbs].synchro.net
  • From Rob Swindell (on Debian L@VERT to Git commit to main/sbbs/m on Mon Jul 6 00:00:00 2026
    https://gitlab.synchro.net/main/sbbs/-/commit/de173a13b9babcf71e9da4ee
    Modified Files:
    src/doors/syncdoom/README.md xtrn/syncdoom/lobby.js syncdoom.example.ini
    Log Message:
    syncdoom: optional lobby enter_sound via SyncTERM audio

    Add [lobby] enter_sound: play a one-shot sysop-supplied sound (WAV/OGG/FLAC/VOC)
    once on lobby entry, on a SyncTERM that can decode audio files (silent otherwise),
    via the shared cterm_lib.js audio helpers. Nothing ships -- the sysop points it at
    a sound they supply (e.g. a shotgun/growl from their own WAD). Documented in the
    README (Audio section) and the example ini.

    Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

    ---
    þ Synchronet þ Vertrauen þ Home of Synchronet þ [vert/cvs/bbs].synchro.net
  • From Rob Swindell (on Debian L@VERT to Git commit to main/sbbs/m on Mon Jul 6 00:11:00 2026
    https://gitlab.synchro.net/main/sbbs/-/commit/7990cdec06a9cd8da271e0b7
    Modified Files:
    src/doors/syncdoom/README.md xtrn/syncdoom/lobby.js syncdoom.example.ini
    Log Message:
    syncdoom: enter_sound accepts a wildcard (random pick)

    [lobby] enter_sound may be a wildcard (e.g. sfx/*.wav); the lobby resolves it via
    directory() and plays a random match each entry (a plain path still plays that one
    file), mirroring how the attract art picks a random *.ans. README + example ini updated.

    Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

    ---
    þ Synchronet þ Vertrauen þ Home of Synchronet þ [vert/cvs/bbs].synchro.net
  • From Rob Swindell (on Debian L@VERT to Git commit to main/sbbs/m on Mon Jul 6 00:53:00 2026
    https://gitlab.synchro.net/main/sbbs/-/commit/22c6d37798e3f901e702a85b
    Modified Files:
    src/doors/syncdoom/README.md src/doors/syncduke/README.md
    Log Message:
    syncdoom/syncduke: drop Synchronet cmdstr specifiers + design-doc links from READMEs

    Non-Synchronet sysops (e.g. Mystic) installing these doors were faced with Synchronet-only %-cmdstr codes (%f/%T/%./%j/%4) in the READMEs' launch examples;
    replace them with the cross-BBS DOOR32.SYS drop file plus the door's own -s<fd>/-t<seconds>. Also drop the DESIGN.md/PLAN.md/SEAM.md cross-references (those
    internal dev docs are slated for removal). COMPILING.md (build guide) and the engine's GPLv2 attribution readme stay.

    Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

    ---
    þ Synchronet þ Vertrauen þ Home of Synchronet þ [vert/cvs/bbs].synchro.net
  • From Rob Swindell (on Debian L@VERT to Git commit to main/sbbs/m on Mon Jul 6 00:53:00 2026
    https://gitlab.synchro.net/main/sbbs/-/commit/db5c513a0fb73bd16a360b13
    Modified Files:
    src/doors/syncdoom/README.md d_main.c syncdoom.c xtrn/syncdoom/syncdoom.example.ini
    Log Message:
    syncdoom: add [game] attract_demos; hold the title page by default

    Harmonize with SyncDuke's same-named syncdoom.ini key: by default the door
    no longer cycles the title screen into the IWAD's demo1-demo4 playbacks --
    it shows TITLEPIC once and holds it (the title music plays once, and the
    menu still opens on any key), so an idle single-player door doesn't stream
    a demo's worth of frames the remote user didn't ask for. Set [game] attract_demos = true to restore the classic attract loop.

    The knob is read in read_syncdoom_ini() and applied by a small surgical
    edit in the vendored d_main.c: D_DoAdvanceDemo() pins demosequence to the
    title page and stretches pagetic so the page never re-runs (a re-run would restart the title music every page cycle). Documented in README.md and xtrn/syncdoom/syncdoom.example.ini.

    Validated by driving the door over a socketpair: with the option off, one
    title paint then zero output for 40 seconds (and Enter still opens the
    menu); with it on, sustained demo-playback frame traffic as before.

    ---
    þ Synchronet þ Vertrauen þ Home of Synchronet þ [vert/cvs/bbs].synchro.net
  • From Rob Swindell (on Debian L@VERT to Git commit to main/sbbs/m on Fri Jul 17 02:57:00 2026
    https://gitlab.synchro.net/main/sbbs/-/commit/71564a02fa7cfd44b359d51b
    Modified Files:
    src/doors/syncdoom/README.md i_video.c m_menu.c syncdoom.c
    Log Message:
    syncdoom: gamma correction -- persist it, and reach it with Ctrl-G

    F11 cycles Doom's gamma correction and I_SetPalette applies it, but the
    setting never survived a session: I_BindVideoVariables() is an empty stub
    in the terminal renderer, so usegamma was never bound to the config, and
    both the save and load paths skip unbound variables by design. Bind it --
    it then rides the existing save-on-exit paths, including the hangup and time-limit exits that bypass I_AtExit.

    F11 itself is unreliable over a terminal: host terminals commonly claim it
    for their own fullscreen toggle (Windows Terminal does), so it may never
    reach the door. Map Ctrl-G to it as well -- "G" for gamma, and 0x07 is the
    last free control byte (Ctrl-H/I/J are Backspace/Tab/Enter, which is why
    the existing Ctrl-A..F = F1..F6 run stops at F6). Every client path --
    legacy bytes, kitty, SyncTERM evdev -- folds Ctrl+letter to its control
    byte before map_ascii, so the single mapping covers all of them. F11 keeps working wherever the terminal passes it through.

    The in-game F1 controls reference now lists the key, and the README key
    table gains a Ctrl-G row.

    Also correct a stale claim in the README paragraph being edited: only
    cheat codes need typing in UPPERCASE. Save-game names and chat messages do
    not -- map_ascii lifts the WASD shadowing whenever menuactive or chat_on
    is set, so typed text arrives verbatim.

    ---
    þ Synchronet þ Vertrauen þ Home of Synchronet þ [vert/cvs/bbs].synchro.net
  • From Rob Swindell (on Debian L@VERT to Git commit to main/sbbs/m on Sun Jul 26 01:15:00 2026
    https://gitlab.synchro.net/main/sbbs/-/commit/eb01b826ab67bca70b4b0c58
    Modified Files:
    src/doors/syncdoom/README.md syncdoom.c src/doors/termgfx/README.md gfxgate.h
    Log Message:
    syncdoom: drop the PPM tier

    PPM was the door's first-light encoder, kept afterwards as an opt-in tier
    for a SyncTERM without JXL. It cannot earn its place: a frame costs about
    a megabyte where sixel costs ~133KB and JXL ~42KB, which is why it was
    never auto-selected and was documented as LAN-or-localhost only.

    What settles it is that the terminal it existed for does not exist.
    SyncTERM advertises sixel and PPM under one capability -- CTerm's "pixel operations" -- and gained sixel at 1189, years before PPM at 1316. Every terminal that can decode a DrawPPM can therefore decode a sixel, at an
    eighth of the bytes. A SyncTERM too old for either lands on the text tier
    and is playable there. The sibling door reached this conclusion already
    and never built a PPM tier; this was the last one.

    The auto ladder is unchanged in effect (JXL, else sixel, else text) since
    PPM was never in it. What changes: -jxl 0 now means "no JXL" and leaves
    the ladder to pick sixel or text, where it used to pin the session to PPM;
    a JXL encode failure falls to sixel for the rest of the session rather
    than to PPM; and the 320x200 half-size special case goes with it, since it existed only to make PPM's uncompressed bulk survivable.

    An existing [video] tier=ppm setting is not silently reinterpreted -- it
    says so in the BBS log and falls back to auto.

    Also fixes a comment in the shared graphics gate that credited SyncConquer
    with an APC PPM tier it never had.

    Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

    ---
    þ Synchronet þ Vertrauen þ Home of Synchronet þ [vert/cvs/bbs].synchro.net