• src/doors/syncdoom/README

    From Rob Swindell (on Debian L@VERT to Git commit to main/sbbs/m on Saturday, June 20, 2026 14:04:00
    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 Saturday, June 20, 2026 14:04:00
    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 Saturday, June 20, 2026 14:04:00
    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 Sunday, June 21, 2026 00:59:00
    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 Sunday, June 21, 2026 00:59:00
    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 Monday, June 22, 2026 00:57:00
    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 Monday, June 22, 2026 00:57:00
    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 Monday, June 22, 2026 01:07:00
    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 Sunday, June 28, 2026 23:51:00
    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 Friday, July 03, 2026 01:03:00
    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 Saturday, July 04, 2026 00:42:00
    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 Sunday, July 05, 2026 14:25:00
    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 Sunday, July 05, 2026 16:37:00
    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 Monday, July 06, 2026 00:00:00
    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 Monday, July 06, 2026 00:11:00
    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 Monday, July 06, 2026 00:53:00
    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 Monday, July 06, 2026 00:53:00
    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 Friday, July 17, 2026 02:57:00
    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 Sunday, July 26, 2026 01:15:00
    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
  • From Rob Swindell (on Debian L@VERT to Git commit to main/sbbs/m on Tuesday, August 18, 2026 22:04:00
    https://gitlab.synchro.net/main/sbbs/-/commit/72b55dd0acebbe590e503eba
    Modified Files:
    src/doors/syncdoom/README.md syncdoom.c
    Log Message:
    syncdoom: the door-directory defaults have to work without syncdoom.ini

    A BBS-agnostic install is the executable and the WADs in one directory, and on that install a bare -iwad doom2.wad resolved against the current directory -- the BBS's, not the door's. read_syncdoom_ini() returns early when it cannot open the ini, and the [wads] block that resolves "blank = the door's own dir", exports DOOMWADDIR and fills g_wads_dir sits after that return, so the documented default applied only to the installs that had the file documenting it. The resolution moves into resolve_wads_dir(), called from both paths.

    A drop file the door cannot open was as quiet: read_door32() returned on the failed read and the door fell through to stdio, drawing to a console nobody sees and reading keys nobody pressed. It now names the file and the errno --
    a node macro the BBS never expanded shows up there as a directory that does
    not exist. That complaint and the existing "no use to this door" one go
    through dlog() instead of stderr, because on Windows a socket door's stderr
    is a throwaway console and the log file is the only sink that reaches the sysop; they are held until read_syncdoom_ini() has named it.

    The spaced -door32 <path> form read the drop file twice: the pre-scan took argv[i + 1] as the value without advancing i, so the next iteration matched that same path through the bare-door32.sys arm. Invisible while the failure
    was silent, and the new message printed twice.

    -door32 leaves the usage banner and the README, which document the drop file the way every sibling door takes it: a plain argument, recognized by its filename. The flag is still parsed, for the command lines that spell it. The README gains an install section for the BBSes that need any of this.

    Co-Authored-By: Claude Opus 5 (1M context) <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 Tuesday, August 18, 2026 22:04:00
    https://gitlab.synchro.net/main/sbbs/-/commit/fad3deb2b8a734a3668546c8
    Modified Files:
    src/doors/syncdoom/README.md syncdoom.c
    Log Message:
    syncdoom: take the player's name from the drop file

    DOOR32.SYS line 7 is the caller's alias, and the sibling doors read it. SyncDOOM never has: its own drop-file parser knew the comm type, the socket handle and the time limit, and the alias only came into existence when the
    five copies were replaced by one in termgfx, 19901be145 (genre-4-turned, 2026-07-11) -- at which point the doors already reading line 7 were wired to the new field and this one had nothing to wire.

    Nothing surfaced it because xtrn/syncdoom/lobby.js passes -name %a on every launch, so on the path that actually gets exercised the name arrives by
    another route. An xtrn entry that runs the door directly, or any BBS with no lobby, got "Player".

    The drop file now supplies the name, and an explicit -name still overrides it whatever the argument order -- the pre-scan that reads the drop file runs before the argument loop. SyncDuke resolves the same conflict the same way. SyncMOO1 deliberately does the opposite, letting the drop file outrank -name, but there -name exists only for the drop-file-less dev path; here it is a documented setting the lobby depends on.

    Co-Authored-By: Claude Opus 5 (1M context) <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 Tuesday, August 18, 2026 22:04:00
    https://gitlab.synchro.net/main/sbbs/-/commit/d2b74eb5a731aa879978ed75
    Modified Files:
    src/doors/syncdoom/README.md syncdoom.c src/doors/syncduke/README.md src/doors/syncretro/README.md
    Log Message:
    doors: README fixes where the docs describe code that has moved on

    SyncDOOM's Ctrl-S strip is drawn on the bottom row -- the row the graphics tiers leave empty, so it stays off DOOM's message line -- and the README still described the top-right strip it replaced. Its throughput field was missing too.

    Ctrl-O cycles off -> steer -> follow, and -mouse / [input] mouse take off|steer|follow (with on|true, none|false|0 and look|native|relative as aliases). The README and the usage banner both described a two-state on/off toggle, and the word "follow" appeared in neither, although the shipped syncdoom.example.ini has documented all three styles and the sensitivity
    slider all along. The Mouse control section now covers both styles and what each feels like, since the choice between a joystick and mouse-look is the whole point of having two.

    SyncDuke's door-hotkey table left out Ctrl-R (AutoRun, which frees R for Steroids) and the Ctrl-A..G mirror of F1..F7 -- the mirror being exactly what
    a player needs when their terminal keeps the function keys for itself.

    SyncRetro introduced the stdio path as the -stdio argument. The drop file selects it on its own (comm type 0 means there is no socket), and -stdio is
    the manual equivalent for a BBS that writes no drop file; the sibling READMEs all describe it that way round.

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

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