• src/doors/syncdoom/syncdo

    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/4820eaed990ac607d5ece6da
    Modified Files:
    src/doors/syncdoom/syncdoom.c
    Log Message:
    syncdoom: anchor the sixel image at top-left when terminal pixels are unknown

    Sixel is positioned by text cell, but the image is sized in pixels; on a terminal
    that doesn't report its real cell-pixel size (e.g. xterm with allowWindowOps off)
    the door assumed 16px-tall cells, so the "centered" row landed too low and the frame looked bottom-anchored. When real geometry is unknown, anchor the sixel at
    row 1, col 1 -- predictable, and what a user expects. JXL/PPM (SyncTERM, real geometry) still center via the APC DX/DY offsets.

    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/b4c533c170213b49b9820604
    Modified Files:
    src/doors/syncdoom/syncdoom.c
    Log Message:
    syncdoom: cap the text-tier render grid on oversized terminals

    A maximized terminal can measure huge (e.g. 561x105); the text tier then renders
    the full grid -- ~330 KB per frame, 1.5+ MB/s -- which floods the link and trips
    the dead-client watchdog, so the door looks like it auto-terminates. Beyond Doom's own detail the extra cells add only bytes, so cap the text grid to [video] text_max_cols x text_max_rows (default 200x80; 0 = uncapped). Invisible for normal terminals; it only bounds the maximized case.

    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/6f60a597729a11e814984075
    Modified Files:
    src/doors/syncdoom/syncdoom.c xtrn/syncdoom/controls.msg
    Log Message:
    syncdoom: frame de-dupe + overlay throughput + auto-depth retune

    Follow-ups to the adaptive frame pacing (3f94d6c31), driven by live VPN/LAN testing and the exit telemetry now in the BBS log.

    Frame de-dupe:
    - emit_frame keeps a copy of the last framebuffer sent and skips a byte-identical
    re-render -- the duplicates Doom emits between its 35fps sim tics, plus any still
    scene. Caps the wire rate at the real visual rate and saves the redundant bytes
    (logs show 50-75% of renders skipped). Cache is invalidated on any label flash or
    geometry change so the screen never goes stale.
    - The Ctrl-S overlay no longer suspends de-dupe (which defeated the point while you
    watched the meter): the frame body is de-duped independently, and the overlay
    refreshes only when its text changes, so a static screen costs ~nothing. This also
    cures the overlay flicker (it was repainting row 1 every frame).

    Stats overlay + telemetry:
    - Overlay shows transmit throughput (KB/s to the player) and reads "depth N/auto";
    dropped the "SyncDOOM" label for room. Exit telemetry logs the de-duped count.
    - Ctrl-T's centered popup is suppressed while the overlay is up (it already shows
    the live depth/RTT) so it can't obscure the game.

    auto-depth retune (max_inflight):
    - Floor depth at 2 once RTT > ~30ms: depth 1 is one frame per round-trip -- a
    slideshow on a remote link -- so never auto-park a far player there.
    - The BDP cap now only applies while actively streaming (recent fps >= 10). An idle
    or de-duped lull drops the frame rate for lack of MOTION, not bandwidth; capping
    on that was clamping depth to 1 right as the next move began (the logged
    "depth=1 on a 211ms link" bug). The RTT-inflation backoff stays the real bloat
    guard, and heavy queuing now drains all the way to 1 to flush a backlog.

    controls.msg: add the Ctrl-S row + color/style refresh.

    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 02:00:00 2026
    https://gitlab.synchro.net/main/sbbs/-/commit/13c434bacedb40ab7da9e4da
    Modified Files:
    src/doors/syncdoom/syncdoom.c
    Log Message:
    syncdoom: stats-overlay display fixes (letterbox clear, shrink, MB/s)

    Three fixes to the Ctrl-S overlay (and the Ctrl-T/N/F4 labels), reported on a large Windows Terminal / SSH window where the centered game frame never repaints
    the top row:

    - Clear on dismiss: when a label's dwell ends (or the overlay is toggled off) the
    top row is wiped (ESC[1;1H ESC[2K) and a full repaint forced. In a letterboxed
    window that row is in the margin, so it was stranding the text otherwise.
    - Shrink-gap blanking: the overlay is right-justified, so a narrower redraw (fewer
    fps/lag digits, or KB/s -> MB/s) left the previous wider text's left end behind.
    Track the prior width and blank exactly the now-uncovered cells.
    - Throughput reads fractional MB/s above 999 KB/s (KiB/MiB of wire bytes) so the
    field stays narrow on a fast link (LAN sixel runs 3-6 MB/s).

    Confirmed fixed live on Windows Terminal (LAN).

    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 04:35:00 2026
    https://gitlab.synchro.net/main/sbbs/-/commit/a79701f82e3843aa41c490d7
    Modified Files:
    src/doors/syncdoom/syncdoom.c
    Log Message:
    syncdoom: anchor text-mode overlay + labels to the rendered grid width

    In text mode the grid is capped (text_max_cols, default 200), so on a terminal wider than the cap the stats overlay (right-justified) and the centered labels (DEPTH/DITHER/STATS/video) were positioned against the full g_cols and landed off
    to the right of the actual game view -- the overlay flew past the edge, the labels
    drifted right. Add overlay_cols() = the rendered width (g_text_cols in text mode,
    g_cols for the graphics tiers, where the overlay sits in the centered image's margin) and route the overlay's right-justify + all four label centerings through
    it. g_text_cols is set in setup_text_mode to the capped tcols.

    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 15:31:00 2026
    https://gitlab.synchro.net/main/sbbs/-/commit/a71b247db0bd90b40efae432
    Modified Files:
    src/doors/syncdoom/syncdoom.c
    Log Message:
    syncdoom: resolve a bare -iwad/-file against the [wads] dir, not CWD

    The door exports DOOMWADDIR from the [wads] dir so a bare
    "-iwad freedoom1.wad" -- the direct-exec single-player install entry --
    can locate the WAD in the configured directory. But the arg-rewrite that
    makes WAD paths absolute before the sandbox chdir ran abscopy(), which
    resolves a relative name against the door's CWD: "freedoom1.wad" became "<doordir>/freedoom1.wad" before Doom's own IWAD search ran, defeating DOOMWADDIR and failing with "IWAD file '<doordir>/freedoom1.wad' not
    found!" whenever the WAD lives in the wads/ subdir (the default layout).

    Add wadcopy(): a relative -iwad/-file/-merge value resolves against the configured (absolute) [wads] dir when the file is found there -- the same
    place the JS lobby loads from -- falling back to CWD-relative (abscopy) otherwise. The lobby, which passes absolute WAD paths, is unaffected.

    The installer's single-player launch string needs no change.

    Reported by Accession.

    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 15:31:00 2026
    https://gitlab.synchro.net/main/sbbs/-/commit/7f44fc1de5d847eecf099544
    Modified Files:
    src/doors/syncdoom/syncdoom.c
    Log Message:
    syncdoom: keep the waiting-room "waiting alone" prompt within 80 cols

    The controller-waiting-alone prompt ("Waiting for another player... auto- starts when full. Q cancel (then pick single-player to play solo).") was a single ~103-char line that ran off the right edge of an 80-column terminal, truncating the solo hint to "...pick si." (reported with a screenshot).

    Split it across the panel's two free rows: the "waiting / auto-starts" line
    on top+2 and the "Q to cancel / play solo" hint on top+3, each well within
    80 cols. The other two prompt cases already fit and are unchanged.

    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 15:31:00 2026
    https://gitlab.synchro.net/main/sbbs/-/commit/93fc68f6d451c6ca64026f9a
    Modified Files:
    src/doors/syncdoom/syncdoom.c
    Log Message:
    syncdoom: list waiting-room players one per row (fits 3-4 long names)

    The player list was a single row of "N.name" entries separated by spaces -- fine for two short aliases, but three or four longer ones (Synchronet allows 25-char aliases) overran 80 columns and truncated, like the prompt did.

    Put one player per row and size the status panel to the player count: it
    grows upward over the splash from 4 rows (1-2 players) to 6 (a full 4), so every name shows in full regardless of length. Validated via pyte at 1-4 players incl. a 25-char alias -- nothing reaches column 80.

    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/a5e95a1b2b7a601ad7afc7f6
    Modified Files:
    src/doors/syncdoom/syncdoom.c
    Log Message:
    syncdoom: accept a short or SAUCE-padded waiting.bin splash

    load_splash() required the file to be exactly 4000 bytes (80x25), so an editor that saved a shorter canvas (e.g. PabloDraw's 80x23 = 3680 bytes) or appended a SAUCE record was rejected and the door fell back to the baked-in art. Now it zero-fills the cell buffer and loads up to 4000 bytes from any non-empty file: a short image fills the top rows (rest black), a longer one has the extra bytes (SAUCE) ignored.

    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:56:00 2026
    https://gitlab.synchro.net/main/sbbs/-/commit/ccea2142336bc4513f0f5048
    Modified Files:
    src/doors/syncdoom/syncdoom.c
    Log Message:
    syncdoom: write per-user prefs fresh to fix lost settings

    The per-user prefs file (data/user/####/doom/syncdoom.ini) silently
    stopped saving and loading its [input] settings (mouse, instant_turn,
    kpturn, ...) and piled up duplicate keys. Cause: read-modify-write plus
    "remove a key when it equals the default" eventually emptied the [input] section, and an xpdev bug then misfiled every later [input] key at the end
    of the file under [video], where it was unreadable (gitlab #1168).

    Write the file fresh each time instead -- store only the current
    non-default prefs, sections built in order -- so the empty-section path is never hit and an already-corrupted file self-heals on the next save. These
    are generated prefs in data/, so there's nothing hand-edited to preserve
    by reading the old file first.

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

    ---
    þ Synchronet þ Vertrauen þ Home of Synchronet þ [vert/cvs/bbs].synchro.net
  • From Darksix@VERT/DARKSIX to Rob Swindell (on Debian L on Mon Jun 22 15:08:00 2026
    https://gitlab.synchro.net/main/sbbs/-/commit/4820eaed990ac607d5ece6da Modified Files: src/doors/syncdoom/syncdoom.c Log Message: syncdoom: anchor the
    sixel image at top-left when terminal pixels are unknown

    Sixel is positioned by text cell, but the image is sized in pixels; on a terminal that doesn't report its real cell-pixel size (e.g. xterm with
    allowWindowOps off) the door assumed 16px-tall cells, so the "centered" row landed too low and the frame looked bottom-anchored. When real geometry is
    unknown, anchor the sixel at row 1, col 1 -- predictable, and what a user expects. JXL/PPM (SyncTERM, real geometry) still center via the APC DX/DY
    offsets.

    Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
    ---
    þ Synchronet þ Vertrauen þ Home of Synchronet þ [vert/cvs/bbs].synchro.net

    Ya got DooM running as a door? That's awesome. Could maybe help out with that, since the other day I was relaying the same idea over Avatar-Chat to someone else. I've actually helped code mostly server code and a few other things for zdoom/zdaemon/skulltag in the past. Will there be an option for the real doom.wad or doom2.wad, perhaps Heretic and HeXen as well? They all use the same bsp and nodes and whatnot, just different IWADS and main wads. Will be happy to test it out, long as I update my git or lab whichever it was I got the latest version from a month or so ago now and compile.. BTW it is painful in gentoo linux to install/use this software, or either user error.

    =-\DaRKLoRD/-= The future of all mankind. darksix.org - all logins will be reported to /dev/null. (0)=----.,

    ---
    þ Synchronet þ DaRKLoRD BBS
  • From Darksix@VERT/DARKSIX to Rob Swindell (on Debian L on Mon Jun 22 15:08:00 2026
    https://gitlab.synchro.net/main/sbbs/-/commit/b4c533c170213b49b9820604 Modified Files: src/doors/syncdoom/syncdoom.c Log Message: syncdoom: cap the
    text-tier render grid on oversized terminals

    A maximized terminal can measure huge (e.g. 561x105); the text tier then renders the full grid -- ~330 KB per frame, 1.5+ MB/s -- which floods the link and
    trips the dead-client watchdog, so the door looks like it auto-terminates. Beyond Doom's own detail the extra cells add only bytes, so cap the text grid to
    [video] text_max_cols x text_max_rows (default 200x80; 0 = uncapped). Invisible for normal terminals; it only bounds the maximized case.

    Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
    ---
    þ Synchronet þ Vertrauen þ Home of Synchronet þ [vert/cvs/bbs].synchro.net

    330KB per frame is ridiculous, should be about 87 bytes at the most or less, need to send just the posistion for (x,y) of player, and other players coords.
    and use a central server to do the packet updates via that way, or others.. then it would be 2KB a second or around there.

    ---
    þ Synchronet þ DaRKLoRD BBS
  • From Rob Swindell (on Debian L@VERT to Git commit to main/sbbs/m on Mon Jun 22 18:22:00 2026
    https://gitlab.synchro.net/main/sbbs/-/commit/6fefefaa65b8c7bb75a4c05a
    Modified Files:
    src/doors/syncdoom/syncdoom.c
    Log Message:
    syncdoom: anchor mouse steering to the image + cap sixel size

    Two fixes for terminal mouse steering in a window much larger than the
    rendered game (notably xterm sixel):

    - Steer relative to the IMAGE, not the window. The steer center and
    full-deflection span are now taken from the rendered image's cell
    rectangle (g_img_col + width) instead of the terminal's center. With a
    letterboxed or top-left-anchored image the old window-center put the
    "idle" point out in the black margin, so the player spun until the
    pointer was dragged off into empty space; now idle sits on the picture's
    center and the image edge is full turn. Exact once the terminal's real
    cell size is known (SyncTERM always; xterm with allowWindowOps).

    - Never upscale the sixel past native 640x400, even when real pixel
    geometry was measured. Sixel is near-raw RLE, so a window-filling sixel
    on a large console is both too big for the terminal to render and a huge
    per-frame payload that stalls the DSR pacing -- the door froze on a blank
    screen once allowWindowOps let xterm report a big window. The 640 cap was
    previously skipped when geometry was known; sixel is impractical to
    upscale regardless. JXL/PPM (real compression) keep the full scale_max.

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

    ---
    þ Synchronet þ Vertrauen þ Home of Synchronet þ [vert/cvs/bbs].synchro.net
  • From Digital Man@VERT to Darksix on Mon Jun 22 23:13:00 2026
    Re: Re: src/doors/syncdoom/sy
    By: Darksix to Rob Swindell (on Debian L on Mon Jun 22 2026 03:08 pm

    Ya got DooM running as a door? That's awesome. Could maybe help out with that, since the other day I was relaying the same idea over Avatar-Chat to someone else. I've actually helped code mostly server code and a few other things for zdoom/zdaemon/skulltag in the past. Will there be an option for the real doom.wad or doom2.wad, perhaps Heretic and HeXen as well?

    Any WADs that are compatible with vanilla doom. Details here: https://gitlab.synchro.net/main/sbbs/-/blob/master/src/doors/syncdoom/README.md

    They all
    use the same bsp and nodes and whatnot, just different IWADS and main wads. Will be happy to test it out, long as I update my git or lab whichever it was I got the latest version from a month or so ago now and compile.. BTW it is painful in gentoo linux to install/use this software, or either user error.

    Without any provided details, hard to help with that.
    --
    digital man (rob)

    Steven Wright quote #11:
    I almost had a psychic girlfriend, ..... But she left me before we met.
    Norco, CA WX: 65.3øF, 76.0% humidity, 3 mph WNW wind, 0.00 inches rain/24hrs ---
    þ Synchronet þ Vertrauen þ Home of Synchronet þ [vert/cvs/bbs].synchro.net
  • From Digital Man@VERT to Darksix on Mon Jun 22 23:15:00 2026
    Re: Re: src/doors/syncdoom/sy
    By: Darksix to Rob Swindell (on Debian L on Mon Jun 22 2026 03:08 pm

    A maximized terminal can measure huge (e.g. 561x105); the text tier then renders the full grid -- ~330 KB per frame, 1.5+ MB/s -- which floods the

    330KB per frame is ridiculous, should be about 87 bytes at the most or less, need to send just the posistion for (x,y) of player, and other players coords. and use a central server to do the packet updates via that way, or others.. then it would be 2KB a second or around there.

    SyncDOOM is *server* rendered.
    --
    digital man (rob)

    Rush quote #48:
    The point of the journey is not to arrive. Anything can happen.
    Norco, CA WX: 65.3øF, 76.0% humidity, 3 mph WNW wind, 0.00 inches rain/24hrs ---
    þ 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 Tue Jun 23 00:45:00 2026
    https://gitlab.synchro.net/main/sbbs/-/commit/dc723e17eb4206850a50f7a2
    Modified Files:
    src/doors/syncdoom/syncdoom.c
    Log Message:
    syncdoom: add sixel to the F4 tier cycle on JXL terminals

    When JXL is the startup tier, the door now also probes sixel (the JXL
    ladder short-circuits before probe_sixel, and a JXL-capable SyncTERM
    answers the sixel CTDA query immediately), and adds it as a second
    graphics state so F4 cycles jxl -> sixel -> text tiers. Lets a player
    A/B the two graphics tiers live. Skipped when sixel is force-disabled.

    Graphics-tier cycle labels now name the tier (jxl/sixel/ppm) instead of
    the generic "graphics", so the F4 flash shows which one you're on.

    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 Tue Jun 23 00:45:00 2026
    https://gitlab.synchro.net/main/sbbs/-/commit/d494dace83cfbd93cb2f99d1
    Modified Files:
    src/doors/syncdoom/syncdoom.c
    Log Message:
    syncdoom: fix Windows Terminal sixel regression (per-frame palette)

    The define-once palette optimization assumed the terminal retains sixel
    color registers across separate DCS images. SyncTERM does, but Windows
    Terminal and xterm do NOT -- so frames that omitted the palette block referenced undefined registers and rendered with wrong/default colors.

    Gate define-once on g_is_syncterm; everywhere else re-send the palette
    every frame. It's now the stable 1:1 register<->index set, so a per-frame palette is identical each time (no churn) -- matches Deuce's guidance and restores correct sixel on WT/xterm while keeping SyncTERM's define-once.

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

    ---
    þ Synchronet þ Vertrauen þ Home of Synchronet þ [vert/cvs/bbs].synchro.net
  • From KrAAB@VERT/KRAABY to Digital Man on Tue Jun 23 03:39:00 2026
    Re: Re: src/doors/syncdoom/sy
    By: Digital Man to Darksix on Mon Jun 22 2026 23:13:56

    Any WADs that are compatible with vanilla doom. Details here: https://gitl ab.synchro.net/main/sbbs/-/blob/master/src/doors/syncdoom/README.md

    Be nice to find the Beavis and Butthead WAD file and do a version of Wolfenstein if possible like the doom game. I tried it on your system and is kinda fun, just a few issues with controls but I see mouse support of some kind was added and havent tried it with that yet.

    ---
    Barry Davis Jr
    SysOp
    KrAABY Gamer BBS
    ---
    þ Synchronet þ Sent from the KrAABY Gamer BBS
  • From Nightfox@VERT/DIGDIST to KrAAB on Tue Jun 23 08:43:00 2026
    Re: Re: src/doors/syncdoom/sy
    By: KrAAB to Digital Man on Tue Jun 23 2026 03:39 am

    Be nice to find the Beavis and Butthead WAD file and do a version of Wolfenstein if possible like the doom game.

    I've seen old DOS games hosted online in ways that allow a user to play them via a web browser, with some kind of web-enabled version of DOSBox. At one point, I thought about looking into how that's accomplished and hosting some old DOS games on my BBS web site - I'd probably include games such as Wofenstein, Doom, and others. You'd basically have the original version playable in a web browser.

    ---
    þ Synchronet þ Digital Distortion: digitaldistortionbbs.com
  • From Darksix@VERT/DARKSIX to Digital Man on Thu Jun 25 09:55:00 2026
    Re: Re: src/doors/syncdoom/sy By: Darksix to Rob Swindell (on Debian L on Mon Jun 22 2026 03:08 pm

    A maximized terminal can measure huge (e.g. 561x105); the text tier then renders the full grid -- ~330 KB per frame, 1.5+ MB/s -- which floods the

    330KB per frame is ridiculous, should be about 87 bytes at the most or less,
    need to send just the posistion for (x,y) of player, and other players coords. and use a central server to do the packet updates via that way, or
    others.. then it would be 2KB a second or around there.

    SyncDOOM is *server* rendered. -- digital man (rob)

    After watching and/or finding out about the video posting showing this in action, is really nice looking.
    I have not looked into the source actually yet, but probably will sometime soon. I'd figure there would be a
    way to decrease the size of the output, even if by just redoing the scale slider for how much view you get.
    Seems it is using full updates even when using the smaller screen with background, probably because of the
    playerbar stuff and that iirc with the slider down, it still had to draw the bg per frame, but it was looped
    from memory.. Probably hard to do with jpeg style things. Have you tried to do zlib compression on both sides yet?
    That may take some work, but probably would considerably lower that 1.5+ MB/s if it was sent to client as the text
    and then the client/your comp encodes it to the jpeg. Hmm that won't work either for compatibility I suppose though.
    MCCP2 might be an option. Would have to be integrated to SyncTerm though.. Just throwing spitballs here right now..

    I have the highest plan spectrum can offer residential.. 40Mbit upload, so ~5MB/s a second. So would tap out at 2 players
    give or take.. Got to wonder if there is some better way to go about it.. Guess I'll just dig into the src when I have time.

    ---
    þ Synchronet þ DaRKLoRD BBS
  • From Darksix@VERT/DARKSIX to Nightfox on Thu Jun 25 14:25:00 2026
    Re: Re: src/doors/syncdoom/sy By: KrAAB to Digital Man on Tue Jun 23 2026 03:39 am

    Be nice to find the Beavis and Butthead WAD file and do a version of Wolfenstein if possible like the doom game.

    I've seen old DOS games hosted online in ways that allow a user to play them via a web browser, with some kind of web-enabled version of DOSBox. At one
    point, I thought about looking into how that's accomplished and hosting some old DOS games on my BBS web site - I'd probably include games such as
    Wofenstein, Doom, and others. You'd basically have the original version playable in a web browser.
    ---
    þ Synchronet þ Digital Distortion: digitaldistortionbbs.com

    You have missed the point.. But i'm pretty sure i can find the beavis and butthead wad..but making it wolfenstein you'd have to do..cause here in the past few years i dont do my own wads, mainly cause Toke died.. pretty sure the B&B included a DEH..not sure though..

    ---
    þ Synchronet þ DaRKLoRD BBS
  • From Nightfox@VERT/DIGDIST to Darksix on Thu Jun 25 13:13:00 2026
    Re: Re: src/doors/syncdoom/sy
    By: Darksix to Nightfox on Thu Jun 25 2026 02:25 pm

    Be nice to find the Beavis and Butthead WAD file and do a version of
    Wolfenstein if possible like the doom game.

    I've seen old DOS games hosted online in ways that allow a user to play
    them
    via a web browser, with some kind of web-enabled version of DOSBox. At one

    You have missed the point.. But i'm pretty sure i can find the beavis and

    Oh, I understand the point, and I actually think SyncDoom is pretty cool. I was just commenting that I had also thought of hosting some DOS games on the web side with DOSBox.

    ---
    þ Synchronet þ Digital Distortion: digitaldistortionbbs.com
  • From Darksix@VERT/DARKSIX to Nightfox on Sat Jun 27 10:57:00 2026
    Re: Re: src/doors/syncdoom/sy By: Darksix to Nightfox on Thu Jun 25 2026 02:25 pm

    Be nice to find the Beavis and Butthead WAD file and do a version of
    Wolfenstein if possible like the doom game.

    I've seen old DOS games hosted online in ways that allow a user to play them via a web browser, with some kind of web-enabled version of DOSBox. At one

    You have missed the point.. But i'm pretty sure i can find the beavis and

    Oh, I understand the point, and I actually think SyncDoom is pretty cool. I was just commenting that I had also thought of hosting some DOS games on the
    web side with DOSBox.
    ---
    þ Synchronet þ Digital Distortion: digitaldistortionbbs.com

    SyncDoom seems alright without yet playing it myself. Anyways might be able to just use DOSemu for them, though I haven't really went
    and tested what it's capabilities are far as 32 bit.. But yeah you definitely can use DOSBox for web, but most have already been done
    and online somewhere though is all.. Most though get the sound not right or something else in configurations so it wouldn't be as good
    as one that is properly configured. So, go for it eh. :)


    ---
    þ Synchronet þ DaRKLoRD BBS
  • From Rob Swindell (on Debian L@VERT to Git commit to main/sbbs/m on Sun Jun 28 00:21:00 2026
    https://gitlab.synchro.net/main/sbbs/-/commit/08a80d9075f1cb72d08646d5
    Modified Files:
    src/doors/syncdoom/syncdoom.c
    Log Message:
    syncdoom: use shared termgfx_geom_fit/center (phase 2 of the geometry unification)

    SyncDOOM's compute_geometry computed the fit-to-canvas image size and the center offset inline; SyncDuke now calls the same logic in termgfx/geometry.c. Replace Doom's inline math with termgfx_geom_fit() + termgfx_geom_center() so the
    two doors share one implementation instead of parallel copies.

    This is a pure refactor -- verified bit-identical to the old inline code across 8910 (vw, vh, cap) cases, 0 mismatches. The sixel-640 cap selection, the PPM / no-scale-fit branches, and the sixel-without-real-cell-size top-left override all
    stay in Doom (they're tier/door policy around the shared fit/center core).

    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 00:21:00 2026
    https://gitlab.synchro.net/main/sbbs/-/commit/2f2f38f559bd01dc6efc897c
    Modified Files:
    src/doors/syncdoom/syncdoom.c src/doors/syncduke/syncduke_io.c src/doors/termgfx/pace.c pace.h
    Log Message:
    termgfx: share the DSR RTT-sample update between the doors

    Second slice of the present/pace unification. Both doors fold each DSR round-trip
    into a 3/4 RTT EMA, latch rt_high at 40ms, and track a min-RTT baseline, then run
    the AIMD -- the same logic, with two small divergences: SyncDOOM also rejects a stale sample (a late reply for a reclaimed frame, rtt < EMA/3) and re-seeds the baseline after an 8s window; SyncDuke does neither.

    Extract it as termgfx_rtt_sample() parameterized by those two knobs (stale_reject,
    rtt_min_window_ms): Duke passes (0, 0), Doom passes (1, RTT_MIN_WINDOW). The function returns whether the sample was accepted so each door runs the AIMD only
    then. The DSR send-time ring + inflight + the reclaim/gate stay per-door.

    Pure refactor -- proven bit-identical to each door's old inline RTT logic across
    14160 replayed samples (spanning stale/normal/spike RTT and the 8s window), 0 mismatches. Adds a rtt_min_at to SyncDuke (written by the helper, unused there since its window is 0).

    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 00:21:00 2026
    https://gitlab.synchro.net/main/sbbs/-/commit/2c96f1868ad988483e1de4dd
    Modified Files:
    src/doors/syncdoom/syncdoom.c
    Log Message:
    syncdoom: client-side sixel scaling (bandwidth reduction, like SyncDuke)

    emit_frame_sixel sent a full-resolution sixel (pan=1) at the display size; now it
    encodes at 1/SIXEL_SCALE and emits the "pan;pad raster aspect so the terminal scales it back up -- SyncTERM integer-doubles (pad=2), other sixel terminals get
    the 2:1 pixel aspect (pad=1). The encoded height is clamped to whole 6-row bands
    (a partial final band garbles under pan>1). Lossless on SyncTERM: Doom's indexed
    buffer (I_VideoBuffer) is natively 320x200, so a SyncTERM frame encodes at native
    res, not a downscale.

    ~1/4 the sixel bytes on SyncTERM (320x198 vs 640x400), ~1/2 on other sixel terminals -- and the two doors now emit byte-identical sixel frames. Reuses the
    shared termgfx sixel_encode_aspect.

    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 22:01:00 2026
    https://gitlab.synchro.net/main/sbbs/-/commit/07a345e9877bb6111267b752
    Modified Files:
    src/doors/syncdoom/syncdoom.c src/doors/syncduke/syncduke_io.c
    Log Message:
    syncduke/syncdoom: fill the terminal window without the last-row sixel white bar

    The image tiers now scale up to fill the probed window (sixel width cap
    raised 640 -> 1024) instead of a small centered image. To do that safely, reserve one text-cell row at the bottom of the sixel fit: a terminal that ignores DECSDM ?80l (e.g. Windows Terminal) scrolls a sixel that reaches its last text row, scrolling blank/white lines in below it -- the image renders short with a white bar beneath. Keeping the sixel off the last row avoids the scroll. JXL/PPM (positioned by APC pixel offset, not a text cell) are unaffected and keep the full scale_max.

    Both doors fit a 1.6:1 frame through the same path, so the change is mirrored in syncduke_io.c and syncdoom.c.

    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 22:01:00 2026
    https://gitlab.synchro.net/main/sbbs/-/commit/79cb5100c17d9ca0c116551d
    Modified Files:
    src/doors/syncdoom/syncdoom.c src/doors/syncduke/syncduke_io.c
    Log Message:
    syncduke/syncdoom: full-resolution sixel F4 opt-in for pan-ignoring terminals

    Default non-SyncTERM sixel encodes at half vertical resolution and relies on the
    terminal's "2;1 raster aspect to double it. Some terminals (e.g. WezTerm) ignore
    the aspect ratio and render the image at half height. Add a "sixel-full" stop to
    the F4 video-tier cycle (offered only on non-SyncTERM) that encodes at full vertical resolution (vsc=1, no terminal scaling) -- correct on any sixel terminal
    at ~2x the wire bytes. Default stays the cheap half-res; the choice is per-user sticky (SyncDOOM: <home>/syncdoom.ini [video] sixel_fullres; SyncDuke: a syncduke.fullres flag-file in the per-user dir). SyncTERM is unaffected (JXL tier;
    the vsc=1 path is gated off there).

    Also: shorten the F4 cycle banner to "Video: <tier>" (drop the app name and the "(F4 to cycle)" tip -- it only shows on an F4 press) and fix its centering to use
    the real cell width instead of out_w/8 (a wide font over-counted columns and ran
    the label off-screen); show "sixel-full" in the Ctrl-S stats strip in both doors.

    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 Wed Jul 1 23:24:00 2026
    https://gitlab.synchro.net/main/sbbs/-/commit/76dcea9e1900d1f06c00e09b
    Modified Files:
    src/doors/syncdoom/syncdoom.c src/doors/syncduke/syncduke_io.c
    Log Message:
    syncdoom/syncduke: name the frame image-cache slot per-door

    The SyncTERM APC cached-image Store used a shared "d.jxl"/"d.ppm" filename, so both doors reused the same client-side cache slot and it was opaque in SyncTERM's
    on-disk cache. Name it per-door instead: syncduke_frame.jxl and syncdoom_frame.{ppm,jxl} -- self-descriptive and no longer colliding across doors. Still a single reused per-tier slot (re-Stored every frame), so no cache growth.

    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/2ba9f7dd255cf0182e36eb22
    Modified Files:
    src/doors/syncdoom/syncdoom.c src/doors/termgfx/audio_mgr.c
    Log Message:
    SyncDOOM: fix no-audio in multiplayer + silence the muster waiting room

    Audio: the SyncTERM audio-capability probe reply was lost in a netgame. The connect handshake (D_CheckNetGame/BlockUntilStart) stalls the input pump for seconds, so the reply arrives coalesced in one large read -- and termgfx's cap-probe parser kept only the last 32 bytes of a read, discarding a reply buried earlier. Now it scans the whole buffer (rolling window kept only as a cross-feed fallback). The C waiting room (sd_waitroom_run) also drained the terminal socket without feeding the audio manager, throwing the reply away before pump_input could see it; it now feeds sd_audio at both read sites. Both host and joiner get SFX + music.

    Muster: with the JS lobby muster gathering everyone before anyone connects, the C waiting room is just the near-instant connect->launch handshake. A new -mustered flag makes sd_waitroom_run skip its splash draw and launch beep, so it
    no longer flashes on top of the lobby's "Joining..." (the joiner sees the game, not a redundant C splash).

    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 Fri Jul 3 18:20:00 2026
    https://gitlab.synchro.net/main/sbbs/-/commit/ea7b94702b931de835f5ab17
    Modified Files:
    src/doors/syncdoom/syncdoom.c src/doors/syncduke/Game/src/config.c player.c src/doors/syncduke/syncduke_input.c
    Log Message:
    SyncDOOM & SyncDuke: terminal-mouse FOLLOW (relative mouse-look) mode

    Terminals report only absolute, screen-clamped cell coordinates -- no
    relative motion, and the host can't recenter the pointer -- so the
    existing STEER model turns the player by the pointer's offset from the
    image centre (a virtual joystick). That never runs out of travel but
    keeps turning while the pointer sits off-centre, which some players
    dislike.

    Add FOLLOW as a second, opt-in style: turn by the pointer's change in
    column since the last game tic, so the view stops the instant the
    pointer stops -- the DOS-game mouse-look feel. Because the coordinates
    are absolute and clamped, a pointer pinned at the window edge would
    otherwise stall; a slow edge-creep (bounded by the idle timeout) lets a
    big turn finish anyway. The delta reference re-anchors after an idle gap
    so a resumed pointer doesn't lurch.

    Ctrl-O now cycles OFF -> STEER -> FOLLOW -> OFF (was on/off), and the
    mode persists per-user: SyncDOOM [input] mouse = off|steer|follow (with
    "on" accepted as a legacy alias for steer); SyncDuke [SyncDuke] MouseMode (legacy MouseSteering still honored). SyncDuke's existing sensitivity
    slider scales both styles.

    SyncDuke's player.c getinput() drains a per-tic delta accumulator (syncduke_mouse_turn_tic) rather than reading the steer level; config.c persists MouseMode; the on-screen flash names the mode.

    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 Jul 4 00:42:00 2026
    https://gitlab.synchro.net/main/sbbs/-/commit/3cd36459f8ead141a6ce36fe
    Modified Files:
    src/doors/syncdoom/syncdoom.c src/doors/syncduke/syncduke_io.c
    Log Message:
    syncduke/syncdoom: sixel image centering + full-res sixel option

    Two SyncTERM sixel improvements, tested live:

    Centering (SyncDuke): the sixel image hugged the left edge on SyncTERM while SyncDOOM centered. Cause -- SyncTERM answers the graphics-canvas probe
    (?2;1S) but not the cell-size probe (ESC[16t), so syncduke_term_cell_w()
    stays 0 and termgfx_geom_center() can't turn the centered pixel offset into a text column, falling back to column 1. Give the centering the same 8x16 cell-size fallback the bottom-row reserve already uses (SyncDOOM always has), so the image centers; also drop the stale is-SyncTERM special case in the mouse-steer center (SyncTERM honors the sixel cursor like other terminals).

    Full-res sixel (both doors): the default sixel encodes at half the display
    size and lets SyncTERM nearest-neighbor-double it -- lean on the wire but
    soft. Add a "sixel-full" tier that encodes 1:1 at the display size on
    SyncTERM too (it was gated to non-SyncTERM), for a sharper image at ~4x the bytes. In SyncDOOM the JXL-start F4 cycle now offers both the half- and full-res sixel stops, so "sixel-full" is actually reachable.

    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 Jul 4 00:42:00 2026
    https://gitlab.synchro.net/main/sbbs/-/commit/26de4325a8dc95431a70852e
    Modified Files:
    src/doors/syncdoom/syncdoom.c
    Log Message:
    syncdoom: decode the End/Home key on all terminals, not just kitty

    The menu already jumped to the last/first item on KEY_END/KEY_HOME, but the door only mapped CSI H/F (the standard Home/End) while the kitty keyboard protocol was active -- so on a non-kitty Windows Terminal, End (ESC[F) was dropped and the selection wouldn't move to the bottom of the menu. Map
    Home/End unconditionally (they're standard on every xterm-family terminal),
    and cover the other forms for good measure: SS3 F/H (application-cursor mode), ESC[1~/4~ (vt220), ESC[7~/8~ (rxvt), and bare ESC[K (SyncTERM's End without evdev). This brings SyncDOOM to parity with SyncDuke, whose parser already handled both the Windows Terminal (CSI F) and SyncTERM (CSI K) End forms.

    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 16:57:00 2026
    https://gitlab.synchro.net/main/sbbs/-/commit/05469f4d4b76030981fc0f45
    Modified Files:
    src/doors/syncdoom/syncdoom.c
    Log Message:
    syncdoom: fix -Wmisleading-indentation warnings (unstack crammed lines)

    GCC's -Wall flagged six lines where multiple statements were crammed onto
    one line so the trailing statement was misleadingly indented as if guarded
    by an if/else that didn't guard it:

    evdev_edge() case 29/97 (Ctrl) and 56/100 (Alt): "... ; else ...; return;"
    parse_byte() case 'P'/'Q'/'S' (kitty F1/F2/F4): "if (kitty) k = KEY_x; break;"
    sd_ingame_recv() the Ctrl-A strip: "if (*s==1) { if (s[1]) s++; continue; }"

    Purely a reformat -- one statement per line at the correct depth (tabs, per uncrustify.cfg) -- no behavior change. This is the one -Wall class that IS formatting-driven, so unstacking the lines clears it.

    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 Thu Jul 9 01:55:00 2026
    https://gitlab.synchro.net/main/sbbs/-/commit/716fdefcfab4f09a178bde67
    Modified Files:
    src/doors/syncdoom/syncdoom.c
    Log Message:
    syncdoom: move onto termgfx keymode

    The last of the four doors to stop carrying its own copy of the terminal key-mode negotiation. termgfx/keymode.h (cf67bccb2a, thrown-29-throw) now supplies the evdev/kitty enable and restore sequences, the evdev-wins precedence, the enable-time settle window, the 88-entry evdev->ASCII
    table and the modifier classifier.

    g_kitty_active and g_evdev_active stay as plain int globals, because
    m_menu.c reads them to grey out the key-feel sliders once a native
    key-up path is negotiated, and m_menu.c is vendored. They are now
    mirrors, set from the shared state after an enable succeeds and cleared
    in the restore -- rather than the state itself.

    The restore is a single termgfx_keymode_restore() emitting only what was actually enabled, in place of two hand-guarded literal writes.

    No change to the bytes on the wire, the settle window's 500ms, or the
    evdev key handling: Shift still asserts the engine's Run + Strafe
    scancodes, Ctrl and physical Alt are still tracked and never forwarded (SyncTERM reserves Alt+key), and the Shift-folds-to-upper-in-menus-only
    rule is unchanged.

    ---
    þ Synchronet þ Vertrauen þ Home of Synchronet þ [vert/cvs/bbs].synchro.net
  • From Rob Swindell (on Windows@VERT to Git commit to main/sbbs/m on Fri Jul 10 03:28:00 2026
    https://gitlab.synchro.net/main/sbbs/-/commit/93db999e1565beed127812e1
    Modified Files:
    src/doors/syncdoom/syncdoom.c src/doors/syncduke/syncduke_config.c xtrn/syncdoom/install-xtrn.ini syncdoom.example.ini xtrn/syncduke/install-xtrn.ini syncduke.example.ini
    Log Message:
    syncdoom/syncduke: log to file by default, then hide the local console

    Synchronet spawns a native door with CREATE_NEW_CONSOLE (sbbs3/xtrn.cpp),
    so both doors pop a console window on the BBS machine for every session.
    They draw to the CLIENT's terminal, so the window shows only diagnostics
    -- but until now that console WAS the only place those diagnostics
    existed: [debug] log defaulted to blank, i.e. logging off. Setting XTRN_NODISPLAY on its own would therefore have made a stock install
    silent, with a hangup or a fatal recorded nowhere. That is worse than a
    noisy window, so the two changes ship together:

    - [debug] log now defaults to "syncdoom.log" / "syncduke.log", which a
    BARE filename resolves to <SBBSDATA>/<door>/<door>_n<node>.log -- the
    shared data dir, node-tagged from $SBBSNNUM. An explicit blank
    `log =` still opts out; -log and $SYNC*_LOG still win.
    - install-xtrn.ini gains XTRN_NODISPLAY, so Synchronet spawns with
    CREATE_NO_WINDOW and no console window ever appears. A sysop who
    wants it back turns it off in SCFG -> External Programs -> <door> ->
    Disable Local Display. (Existing installs keep their flags; this only
    affects a fresh install-xtrn run.)

    Unlike syncalert -- which freopen()s stderr onto its node log and so can
    call FreeConsole() unconditionally -- these two write structured entries
    to a separate FILE* and leave the engine's raw stdout/stderr on the
    console. Keeping the flag a plain setting, rather than baking a
    FreeConsole() into the binary, leaves the sysop that lever.

    Two traps found while testing the default, both of which made it a no-op
    or a lie:

    - Both doors return early when their .ini is absent (syncdoom.c's
    read_syncdoom_ini(), syncduke_config.c's fopen guard), so a default
    applied inside the ini block never runs on a stock install -- exactly
    the case that most needs a log. Seed it on the no-ini path too.
    - iniGetString() returns its default for a blank value AND a missing
    key alike (xpdev ini_file.c), so a non-empty default made the
    documented `log =` opt-out unreachable: the door logged anyway.
    Use iniGetExistingString(), which returns NULL only when the key is
    truly absent.

    syncduke.example.ini's `log =` (blank) would have overridden the new
    default straight back to disabled for anyone copying the template; it now
    reads `log = syncduke.log`. Both example files also claimed a relative
    path -- bare filename included -- lands in the per-user dir. That is
    wrong for a BARE name, which both doors divert to <SBBSDATA>/<door>/
    before the CWD matters; a relative path WITH a separator does resolve
    against the per-user dir, because both doors chdir() there.

    Verified on Windows for both doors across five configurations each: no
    ini, ini without the key, ini with a blank `log =`, ini with an explicit
    name, and -log overriding a blank ini. Compiled under MSVC only.

    Co-Authored-By: Claude Opus 4.8 (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 Sat Jul 11 18:22:00 2026
    https://gitlab.synchro.net/main/sbbs/-/commit/842d355b5535e0369bcf846a
    Modified Files:
    src/doors/syncdoom/syncdoom.c src/doors/syncduke/syncduke.h syncduke_input.c syncduke_io.c
    Log Message:
    syncduke,syncdoom: reclaim the status-line row; fix DOOM keypad-plus

    Adopt SyncConquer's DECSSDT status-line hide in SyncDuke and SyncDOOM.
    On entry each door emits termgfx_term_status_off (DECSSDT Ps=0) before
    the canvas probe, so SyncTERM frees its 25th row and the game fills the
    full 80x25 / 640x400 canvas instead of the 640x384 it draws into while
    the status line is visible. The prefixed DECRQSS query's reply is
    captured (a rolling-window scan in the input pump) and restored on exit
    via termgfx_term_status_set, mirroring SyncConquer's door_term_restore.

    Also fix SyncDOOM's numeric-keypad '+': it emitted the character '+',
    but DOOM binds screen-size-up and automap zoom-in to KEY_EQUALS ('='),
    not '+'. keypad-'-' worked only because screen-size-down is KEY_MINUS
    ('-'), which the keypad character happens to match. Map keypad-'+' to
    '=' in both the evdev and kitty numpad tables so it resizes and zooms
    with the same parity keypad-'-' already had; the main '+'/'=' keys are untouched.

    Co-Authored-By: Claude Opus 4.8 (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 Sun Jul 12 05:11:00 2026
    https://gitlab.synchro.net/main/sbbs/-/commit/b740154ce8b57a09f7c86f9a
    Modified Files:
    src/doors/syncdoom/syncdoom.c src/doors/syncduke/syncduke.h syncduke_input.c syncduke_io.c
    Log Message:
    syncdoom/syncduke: bottom-row status bar, tier detail, text-grid fix

    Move the live stats strip (Ctrl-S) from the top row to the terminal's
    bottom row in both doors. In the sixel tier that row is already reserved
    empty (recompute_geom fits the image into vh-cellh so a sixel never
    reaches the last text row -- the Windows-Terminal scroll guard), so a
    bottom strip is genuinely non-invasive there, and it clears Doom's
    top-row message line and Duke's top-row pickup/quote messages. In the
    text tier the strip's row is excluded from the cell-diff so the game
    never repaints under it. Toggling the overlay off now erases the bottom
    row explicitly, since the graphics tiers never repaint that reserved
    row.

    Restyle the strip as a full-width status bar, following SyncConquer's
    idiom: set the background attribute first, then erase-to-end-of-line, so
    the erase paints the whole row in the bar color (black-on-cyan) instead
    of leaving a black tail. This also drops the old right-justify plus
    narrowing bookkeeping -- the background-color erase handles a shorter
    readout's stale tail.

    SyncDOOM: name the active text sub-tier in the readout (half-block, blocks+shades, quadrant, sextant) instead of flattening every one to
    "text", matching SyncDuke; and add the per-frame image size and encode
    time (KB / enc ms) fields SyncDuke already shows, timed with xpdev's xp_timer().

    SyncDuke: fix the text tier drawing past the screen canvas. It sized the character grid as px_w/8 by px_h/16, hardcoding an 8x16 cell, which
    overcounts on any terminal whose real cell differs (e.g. Windows
    Terminal) and spills the render past the canvas. Use the measured grid
    (the cursor-probe's g_grid_cols/rows, via new syncduke_term_cols/rows accessors, with px-over-cell and 80/24 fallbacks) -- identical to
    SyncTERM's true 8px cells, correct elsewhere. This mirrors how SyncDOOM
    already sizes its text grid.

    ---
    þ 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 13 00:36:00 2026
    https://gitlab.synchro.net/main/sbbs/-/commit/26a0e93afbed863f171c74a9
    Modified Files:
    src/doors/syncdoom/syncdoom.c src/doors/termgfx/OPUS_TRANSITION.md audio.c audio.h audio_mgr.c caps.h
    Log Message:
    termgfx: gate music on client Opus support; fix CTerm PPM version

    Two related SyncTERM-capability fixes.

    Opus gate (audio): termgfx switched music to Ogg-Opus unconditionally on 2026-07-01, carrying a known "silent music" risk on clients whose
    libsndfile lacks Opus (e.g. Ubuntu 22.04's 1.0.31) -- the coarse
    "libsndfile present?" probe couldn't tell Opus apart from bare
    libsndfile. SyncTERM's new Q;libsndfileFormat query (feature 101) reports per-codec support, so use it: once the digital audio tier is confirmed,
    probe libsndfileFormat 32;100 (SF_FORMAT_OGG>>16 ; SF_FORMAT_OPUS) and,
    when the reply is 0, suppress music uploads -- no render, no undecodable
    bytes on the wire. SFX (raw WAV) are unaffected. No regression: a client
    that reports Opus behaves exactly as before, and one that never answers
    (older SyncTERM) is treated as capable, i.e. unchanged. The gate lives in termgfx, so all three door families get it.

    CTerm PPM version (caps): TERMGFX_CTERM_VER_PPM was 1002 -- which is
    cterm.c CVS revision 1.2, the file's ~second revision, with no multimedia
    at all. That conflated a SyncTERM release number with the cterm.c CVS
    revision the field actually encodes (major*1000 + minor). APC PPM landed
    at cterm.c 1.315 (bare DrawPPM) / 1.316 (C;LoadPPM + copy buffers,
    Dec 2022), so the constant is now 1316 -- and since that's newer than
    Sixel (1189), any PPM-capable SyncTERM also has Sixel. The one user, syncdoom.c, wasn't gating PPM at all: it used the constant as a "this is SyncTERM" floor (which is why the bogus-low 1002 worked -- any real
    SyncTERM cleared it). A parsed CTerm version already implies SyncTERM, so
    set g_is_syncterm unconditionally there instead. No behavior change for
    real clients.

    Co-Authored-By: Claude Opus 4.8 (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 Wed Jul 22 20:38:00 2026
    https://gitlab.synchro.net/main/sbbs/-/commit/c97cc290d65f8acac11c2964
    Modified Files:
    src/doors/syncdoom/syncdoom.c src/doors/syncduke/syncduke_io.c src/doors/syncmoo1/syncmoo1_io.c
    Log Message:
    syncduke/syncdoom/syncmoo1: subset the full-frame palette off SyncTERM

    These three doors have no dirty path, but their non-SyncTERM full
    frames were re-sending all 256 registers every changed frame. Select SIXEL_PAL_USED there so a frame carries only its used colors; SyncTERM
    keeps FULL-on-change / NONE-reuse (byte-identical). All three feed a
    fixed indexed palette, so the subset is a clean win.

    Co-Authored-By: Claude Opus 4.8 (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 Thu Jul 23 02:18:00 2026
    https://gitlab.synchro.net/main/sbbs/-/commit/19ebfd3e8d467edf4eff0d97
    Modified Files:
    src/doors/syncdoom/syncdoom.c xtrn/syncdoom/syncdoom.example.ini
    Log Message:
    syncdoom: end the game when the player has stopped playing

    The fourth door to adopt the shared idle-user clock. Same reasoning as the siblings: the BBS's own "Maximum Inactivity" cannot see a DSR-paced door,
    since that counter is reset by any socket read and frame pacing makes the terminal answer ~10x/second on its own. Presence has to be judged on real input, which only the door can tell apart from its own pace-acks.

    Warn-then-terminate, countdown on the status row, same wording as the
    siblings, 10-minute default. Configured by -i<seconds> or the door's own
    [idle] section; the argument wins when given, so a launcher can pass -i0 to excuse an exempt user. Unset is NOT off, which the shipped template now
    says.

    -i IS MATCHED ON AN ALL-DIGIT SUFFIX, not by prefix like this door's other flags. Every one of those uses strncmp(argv[i], "-x", 2), and the same shape for "-i" would also match DOOM's own -iwad and swallow the WAD selection.
    The digit-suffix rule cannot: -i600 is ours, -iwad is the engine's. Parse
    and strip share the rule, so the engine's argv keeps -iwad untouched.

    The activity hook goes in TWO places, and deliberately not in the obvious
    one. key_seen() (the legacy-byte path) and key_dispatch() (the native kitty/evdev path) are hooked separately; their common keyq_push() is not, because expire_keys() synthesizes key-ups through it -- that would forge activity for a player who has already walked away. Mouse events count too, since -mouse steer/follow lets someone drive for a long stretch with no keystroke.

    Input that answers the countdown is consumed rather than delivered: in DOOM every key does something and Escape opens the menu, so "press any key" must
    not also press it at the game.

    The countdown does not get its own writer. It becomes emit_overlay()'s
    content while it is showing, so it lands on the row that function already
    owns and inherits its existing "the fresh frame painted over the reserved
    row -> redraw" handling for free. Two consequences worth naming: the row is drawn even when the player never pressed Ctrl-S (both call sites now open
    the gate for it), and when the countdown clears with no stats strip to put back, the row is wiped and a full repaint forced -- in the bitmap tiers that row is part of the picture, and a bare wipe would leave a black band,
    exactly the trap the sibling door hit.

    Arming needs no special ordering here: read_syncdoom_ini() already runs
    before the argument loop, so a single init after that loop sees both
    sources.

    Verified offline (-i fires to the millisecond, -i0 never does, the countdown ticks down on the wire with correct plurals, the ini alone works with no -i,
    an explicit -i overrides it, and -iwad still selects the WAD), and on a live node for the warning, the countdown and the termination.

    Co-Authored-By: Claude Opus 4.8 (1M context) <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 26 22:48:00 2026
    https://gitlab.synchro.net/main/sbbs/-/commit/18ccff2087bc6bba561d2433
    Modified Files:
    src/doors/syncdoom/syncdoom.c src/doors/syncduke/syncduke_io.c src/doors/syncretro/syncretro_io.c src/doors/termgfx/stats.c stats.h src/doors/termgfx/test/test_stats.c
    Log Message:
    termgfx: the Ctrl-S strip has to fit the row it is drawn on

    Spelling the turn-key model out -- " kitty/nat" became " kitty turn=nat"
    in 6b95aa66c0 (2026-07-26) -- cost five columns on a strip that was
    already within a few of the margin. SyncDuke's row measures 81 columns in
    the sixel-full tier, 82 in JXL with the inline-blob and upscale fields,
    and 84 on the widest text tier, against an 80-column SyncTERM. What the
    player sees depends on the terminal: the tail lost to the margin, or the overflow wrapped onto the last row of the game view and everything
    scrolled up a line.

    Two changes buy the width back and one keeps it bought.

    The shared head spells the pipeline depth "d3/auto" rather than
    "depth 3/auto", which is what termgfx_termio's row and SyncConquer's have always called it -- the same field read two ways depending on which door
    was open. That is five columns, and dropping the trailing space each door appended is a sixth: the strip ends in an erase-to-end-of-line that paints
    the rest of the row in the bar's own colors, so the space was never
    visible. Duke's three rows come to 75, 76 and 78.

    termgfx_stats_clip() is the part that keeps it. Clamping each number, which
    is all stats.c did, bounds no total -- fields accumulate, and this row overflowed by gaining one more of them. Every door now clips the assembled strip to its own column count as the last step before painting. The cut
    lands on a field boundary so a survivor is never a half-printed value, and
    a width not yet probed (cols <= 0) leaves the strip alone.

    SyncDOOM's and SyncRetro's rows change with the head; both were inside the margin already. The stderr stats line SyncDuke logs keeps "depth" -- a log
    is grepped and plotted, and costs no columns.

    test_stats asserts the two widths a door can actually reach -- the widest
    tier name, and JXL where the blob and upscale fields appear -- fit 80, and covers the clip's boundary cut and its untouched cases.

    Built and tested under MSVC only; not yet compiled under GCC/Clang.
    Uncrustify was unavailable on this machine, so the new code was written to
    the house style by hand.

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

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