• src/doors/syncduke/Game/s

    From Rob Swindell (on Debian L@VERT to Git commit to main/sbbs/m on Friday, June 26, 2026 17:57:00
    https://gitlab.synchro.net/main/sbbs/-/commit/8fb1ed22fe35eb429e310167
    Modified Files:
    src/doors/syncduke/Game/src/game.c src/doors/syncduke/syncduke_door.c Log Message:
    syncduke: strip door args before the engine's command-line parser

    A sysop reported SyncDuke dumping the Duke3D command-line help to syslog and never starting. The vendored engine's DOS-era checkcommandline() treats any argv element beginning with '/' as a "/option" and, on an unrecognized one, prints comlinehelp() and exits. On a Unix host the DOOR32.SYS drop-file path (Synchronet's %f) and the -home/-grpdir values are ABSOLUTE paths starting
    with '/', so the engine misreads them -- e.g. "/home/.../door32.sys" parses as option '/h' -> unknown -> help+exit.

    It only "worked" when the install path's first letter happened to be a handled option letter (e.g. /sbbs -> 's', which is the skill flag and survives -- as a side effect forcing player skill 0). And it surfaced only once the user had a GRP: GRP init runs before checkcommandline and exits early when no GRP is present, so a GRP-less install hits the GRP error first, masking this.

    Fix: syncduke_sanitize_cmdline() compacts argv to remove the door's own args (DOOR32.SYS path, -home, -grpdir, -s<fd>) just before checkcommandline, handing the engine an engine-only argv. All of these are already consumed by the pre-main constructors, so stripping them is safe. Path-independent, and it also eliminates the incidental skill-0 side effect.

    Reproduced (GRP present, /home launch path -> help dump) and verified fixed (loads the GRP, proceeds into init, no help dump); /sbbs path unregressed.

    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 Friday, June 26, 2026 22:40:00
    https://gitlab.synchro.net/main/sbbs/-/commit/705a840fe95017643a65bdfc
    Modified Files:
    src/doors/syncduke/Game/src/game.c src/doors/syncduke/syncduke_config.c Log Message:
    syncduke: fix two Windows door startup failures (setvbuf, GRP dir)

    Both killed the Win32 door at launch -- it died straight back to the BBS
    after the "Loading..." splash; found while bringing up the MSVC build.

    1. syncduke_config.c: setvbuf(stdout, NULL, _IOLBF, 0) (used to route the
    engine's diagnostics to the BBS log) is fine on glibc, but MSVC's CRT
    rejects _IOLBF with size 0 (it requires size >= 2) -> invalid-parameter
    fast-fail (c0000409), confirmed from the WER minidump. Use _IONBF on
    Windows (unbuffered, valid with size 0, flushes immediately); *nix keeps
    _IOLBF.

    2. Game/src/game.c: the Windows findGRPToUse() never consulted
    syncduke_grpdir (only the *nix branch did), so with -home (CWD = the
    per-user dir) it scanned the wrong directory and exited with
    "Can't find 'duke3d*.grp'". Honor syncduke_grpdir first, mirroring the
    *nix branch, so the GRP opens by absolute path regardless of CWD.

    Verified on Windows via an inherited-socket harness matching the live launch (-s<socket> -home <userdir>): loads DUKE3D.GRP by absolute path and renders (sixel and JXL tiers).

    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 Saturday, June 27, 2026 03:03:00
    https://gitlab.synchro.net/main/sbbs/-/commit/6fa3f070bfb8cd978721b44b
    Modified Files:
    src/doors/syncduke/Game/src/menues.c xtrn/syncduke/syncduke.example.ini Log Message:
    syncduke: menu UX -- slider values, demo/RECORD + RESOLUTION removed, build footer

    Setup Controls: show each keyboard-feel slider's live 0..63 value right- justified just left of its bar; rename STEER SENSITIVITY -> MOUSE SENSITIVITY and MOUSE STEERING -> MOUSE (the toggle also gates the mouse buttons).

    Options: drop the RECORD (demo) item from the menu unless syncduke.ini
    [game] record=true -- a demo file is useless to a user who can't download it and just wastes disk (off by default; documented in syncduke.example.ini).

    Video Setup: remove the RESOLUTION item (the door renders a fixed 320x200 scaled to the terminal, so it had no effect); the remaining items renumber up.

    Main menu: show the git hash (lower-left) and build date (lower-right) via
    the generated git_hash.h, like SyncDOOM.

    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 Saturday, June 27, 2026 03:03:00
    https://gitlab.synchro.net/main/sbbs/-/commit/fd460772eee71cbc26cb5a46
    Modified Files:
    src/doors/syncduke/Game/src/game.c premap.c
    Log Message:
    syncduke: restore intro fade-ins; gate demo recording

    Now that the GRP is cached and loads are near-instant, the splash screens flashed by. Restore the gradual palette fade-in by presenting EACH fade step (each is a distinct frame, so the de-dupe keeps it), keeping the existing holds/animations:
    - the ENTERING <level> screen (premap.c) -- a visible fade + ~1.5s hold so
    the level name is readable;
    - the 3D Realms logo and the title screen (game.c).

    Also gate opendemowrite() on syncduke_record_enabled() so a stale recstat=1 (from a saved duke3d.cfg) can't write a demo when recording is disabled.

    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 Saturday, June 27, 2026 03:03:00
    https://gitlab.synchro.net/main/sbbs/-/commit/c46bb552ccdf9e9b520ed29f
    Modified Files:
    src/doors/syncduke/Game/src/player.c src/doors/syncduke/syncduke.h syncduke_input.c
    Log Message:
    syncduke: responsive keyboard turning + reset input state on load

    Turning: a terminal can't hold a key and the door refreshes key-down only once per presented frame, so Duke's per-sim-tic turn-key polling produced uneven, frame-tied bursts that no key-hold slider could smooth. Drive a time-windowed continuous turn level from the arrow bytes that getinput() adds to angvel every sim-tic (player.c) -- like the door's mouse steer / SyncDOOM's steady turn. Rate
    comes from the TURN slider (small floor so 0 ~ barely turns); FAST TURN is now a
    +50% turbo. Arrows stay raw scancodes in menus for navigation.

    Load: syncduke_input_reset() (called from loadplayer) clears the sticky-crouch latch, pending key-holds, queued scancodes, and turn/look momentum, so the pre-load session's input no longer bleeds into a restored game (e.g. crouch).

    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 Saturday, June 27, 2026 03:03:00
    https://gitlab.synchro.net/main/sbbs/-/commit/2a140faf49b1bb10b8bc285e
    Modified Files:
    src/doors/syncduke/Game/src/menues.c
    Log Message:
    syncduke: 2-page Controls Help, TURN SPEED label, reset input on load

    - Controls Help (case 707) is now two pages: page 1 = movement/action + door
    hotkeys, page 2 = the pass-through keys (Quick Kick, Holoduke/Jetpack/Night
    Vision/Medkit, use-inventory, turn-around, map-follow, crosshair, auto-aim).
    A key turns the page; ESC / a second key exits.
    - Rename the TURN HOLD slider to TURN SPEED (it now sets the continuous turn
    rate, not a key-hold duration).
    - loadplayer() calls syncduke_input_reset() so a restored game starts from the
    saved state rather than the pre-load crouch/turn latches.

    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 Sunday, June 28, 2026 22:01:00
    https://gitlab.synchro.net/main/sbbs/-/commit/1cabc433bdaea1a1f8b67424
    Modified Files:
    src/doors/syncduke/Game/src/player.c
    Log Message:
    syncduke: fix co-op desync from non-synced terminal look (horiz)

    The terminal PgUp/PgDn "look" applied a per-node variable (syncduke_pitch_step) straight to ps[snum].horiz in processinput, which runs for every player -- so the
    looking player's node moved that player's pitch while the other node's copy of the
    variable was 0. horiz diverged between the two sims and the lockstep syncval check
    tripped "OUT OF SYNC". (Root-caused by logging the syncval components on both nodes
    and diffing: horiz was the lone diverging field.)

    Route the pitch through the synced input, like the mouse-steer turn already is: getinput folds one notch/tic into the FIFO's horz field, and processinput applies
    sync[snum].horz to the correct player on both sims (in either aim mode, after the
    auto-center so a tap holds). Verified: extended 2-player co-op play with look, no
    desync.

    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 22:01:00
    https://gitlab.synchro.net/main/sbbs/-/commit/020594f74ec29bfb92e238e0
    Modified Files:
    src/doors/syncduke/Game/src/game.c
    Log Message:
    syncduke: allow 11-char player names; strip whitespace when over-long

    getnames() and the type-6 receive both capped the netgame name at 10 chars (the stock fragbar-field limit), truncating an 11-char alias like "Digital Man" to "DIGITAL MA". Raise both ends to 11 (= MAXPLAYERNAMELENGTH; user_name[] is 32 and
    the name packet is variable-length, so the arrays/protocol already have room). For
    an alias longer than 11, drop whitespace first so the cap keeps more alphanumerics
    ("Digital Man Jr" -> "DIGITALMANJ"). The deathmatch fragbar column is drawn for 10,
    so an 11th char sits a touch wide there (cosmetic; co-op's player list has room).

    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 29, 2026 23:35:00
    https://gitlab.synchro.net/main/sbbs/-/commit/b41b5caffb62b77df42c1b05
    Modified Files:
    src/doors/syncduke/Game/src/menues.c player.c src/doors/syncduke/syncduke_input.c xtrn/syncduke/controls.msg
    Log Message:
    syncduke: complete the control bindings + redesign the in-game help

    Comparing the door's keymap against Duke's default key table turned up
    real gaps (R was stolen for AutoRun, no inventory cycle, no chase view).

    Keymap (syncduke_input.c):
    - R now reaches Duke's Steroids hotkey; AutoRun moved to Ctrl-R (frees the
    natural key, matching Duke).
    - [ / ] -> inventory select (reaches Scuba/Boots, no direct hotkey).
    - F7 / Ctrl-G -> chase view (extended the Ctrl-A..F->F1..F6 block to
    Ctrl-G; also map xterm F7 = CSI 18~). Engine already toggles on sc_F7.

    Ctrl-O mouse-steering toggle now flashes "MOUSE STEERING ON/OFF" on screen (player.c), via the same FTA quote path Duke uses for its own toggles --
    the door raises a flag, the engine prints it (slot 122, unused in SP).

    In-game GAME CONTROLS chart (menues.c case 707) redesigned: two pages (movement/weapons/terminal, inventory/view) instead of one cramped sheet, colorized like Duke's F1 help -- yellow section headings, orange keys,
    blue actions (gametextpal pal 7 / pal 2) -- with ^X notation for the control-key shortcuts. Reflects the new R/Ctrl-R/[ ]/F7 bindings.

    controls.msg (lobby quick-ref) synced to the full, correct key set.

    Live-confirmed: help pages, R=Steroids, Ctrl-O popup, F7/Ctrl-G chase
    (incl. F7 on Contour w/ kitty-keys, which still sends legacy CSI 18~).

    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 29, 2026 23:37:00
    https://gitlab.synchro.net/main/sbbs/-/commit/8cca8daeb5a7d6163cf01607
    Modified Files:
    src/doors/syncduke/Game/src/menues.c
    Log Message:
    syncduke: declutter the in-game help footer

    Drop the verbose "- PAGE n OF 2 : PRESS A KEY ... -" prompt on both help
    pages for a minimal "PAGE n / 2" indicator -- the page affordance stays,
    the clutter goes.

    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 Wednesday, July 01, 2026 02:20:00
    https://gitlab.synchro.net/main/sbbs/-/commit/089adf2bcfff88bff9d35295
    Modified Files:
    src/doors/syncduke/Game/src/game.c src/doors/syncduke/syncduke_stubs.c Log Message:
    syncduke: restore the original intro hold timing when audio is up

    The Logo() intro holds -- the 3D Realms logo, and the "DUKE NUKEM 3D" fly-in with
    the two pipebomb explosions -- were cut from ~7s/~8s down to ~2s/~3s back when the
    door had no audio, since the holds were dead waits for intro music/reverb that never played. Audio works now, so run the full original holds so the explosion reverb (and the FLY_BY) and the intro MIDI fade out before the menu, as in the original -- but ONLY when the terminal has digital audio (tier >= 1), re-checked
    each loop iteration so it extends the moment the capability probe resolves. A silent terminal keeps the short intro (still no dead wait). New syncduke_audio_active() exposes the tier to the engine.

    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 Wednesday, July 01, 2026 02:20:00
    https://gitlab.synchro.net/main/sbbs/-/commit/f4955c3b7bfc713eb70bdcd9
    Modified Files:
    src/doors/syncduke/Game/src/game.c
    Log Message:
    syncduke: don't hang on multi-GRP getch() prompt (Win32 door)

    The Win32 findGRPToUse() interactively prompted (printf + getch()) when the
    GRP directory held more than one duke3d*.grp. In a socket door that hangs the node: the prompt targets the host console, not the remote user, so nobody can answer it -- and getch() returning EOF (no console) spins the selection loop forever. That branch also assigned a char* (groupfile[kbdKey-'1']) into the
    int grpID and then used it as an array index -> out-of-bounds read.

    Take the first match deterministically (grpID = 0), logging a notice when more than one is found -- mirroring the *nix branch, which already returned the first match with no prompt. A specific GRP can still be isolated via [grp] dir.

    Win32-only change (#ifdef _WIN32); the *nix path is unchanged. Verified: builds clean under MSVC.

    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 Wednesday, July 01, 2026 02:20:00
    https://gitlab.synchro.net/main/sbbs/-/commit/6aeadc29787b9c1bc753c409
    Modified Files:
    src/doors/syncduke/Game/src/game.c src/doors/syncduke/syncduke.h syncduke_game.c syncduke_io.c
    Log Message:
    syncduke: legible text-tier HUD + skip illegible exit splashes

    Two text-tier legibility fixes for block/half-block terminals (conhost, etc.), mirroring SyncDOOM's approach:

    1. Legible HUD overlay. In a text tier the game's own quote font rasterises to
    unreadable blocks. operatefta() now CAPTURES the on-screen quote/chat strings
    (syncduke_hud_add) instead of drawing them whenever syncduke_text_hud is set,
    and the door's text-tier present() redraws them as real ANSI characters over
    the block frame (centered, on the row matching the Duke Y), excluding those
    cells from the block renderer so nothing bleeds through. A HUD-aware de-dupe
    signature + rt_invalidate() keeps an appearing/expiring quote from being
    dropped (the quote isn't in the framebuffer, so the fb memcmp can't see it)
    and repaints vacated rows. In an image tier (sixel/JXL) the flag is 0 and the
    game font renders normally, as before. Storage in syncduke_game.c; the flag
    and capture reset each present so a menu (no operatefta) shows no stale line.

    2. Skip the two exit "order" splashes (showtwoscreens, tiles 3291/3290) in a
    text tier: they're full-screen images that render as illegible blocks AND
    block on a keypress, trapping the player. New door query syncduke_text_tier()
    (active F4/auto tier is text) gates the early return.

    Verified working on the Windows/VERT build. Cross-platform C (no GCC/Clang traps; explicit <string.h> for strncpy). The Linux ELF must be rebuilt separately (./build.sh && ./deploy.sh) to carry these on Linux nodes.

    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 Thursday, July 02, 2026 21:40:00
    https://gitlab.synchro.net/main/sbbs/-/commit/2f6a6ac6ca2a51866b7cea16
    Modified Files:
    src/doors/syncduke/Game/src/menues.c
    Log Message:
    syncduke: two-column controls help (page 1) with terminal keys + ^U User List

    Rework the F1 GAME CONTROLS chart (case 707) page 1 into two side-by-side
    topic columns: left = movement + weapons (shifted left, text unchanged),
    right = the door's TERMINAL keys as a proper key/action list instead of the single cramped bottom line.

    The terminal column documents F4 Graphics, ^S STATS, ^T FRAMES, ^O MOUSE,
    ^U User List, and F1 THIS HELP. ^U (who's-online) was already wired in the input handler but had never appeared on the chart; it's now listed.

    gametext/gametextpal left-justify at any x except exactly 160 (where they centre), so the columns use off-centre x's and only the PAGE n/2 footer is centred. Page 2 (inventory / view & map) is 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 Friday, July 03, 2026 01:03:00
    https://gitlab.synchro.net/main/sbbs/-/commit/eb4c406bdf6d79ccf8fb71ea
    Modified Files:
    src/doors/syncduke/Game/src/menues.c src/doors/syncduke/README.md
    Log Message:
    SyncDuke: center page-1 controls help; refresh stale README status line

    Shift every x-coordinate in the F1 controls chart's page-1 two-column block right by 6 virtual pixels so the block (which spanned x~14..292, center ~153) sits centered on the 320-wide screen. Only x-coords change; y-positions, palettes, the centered footer, and page 2's separate layout are untouched.

    Also correct the README intro, which still claimed "single-player only, no multiplayer / no JS lobby / no audio" -- all three now ship (co-op + dukematch via the JS lobby, digital SFX + OPL/MIDI music).

    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 Friday, July 03, 2026 18:20:00
    https://gitlab.synchro.net/main/sbbs/-/commit/eefae1238e50b5e64eae0b8a
    Modified Files:
    src/doors/syncduke/Game/src/menues.c
    Log Message:
    SyncDuke: rework OPTIONS menu toward the original + mouse-mode integration

    Restructure the in-game OPTIONS menu to match the shareware original:
    DETAIL, SCREEN SIZE and BRIGHTNESS move up onto OPTIONS itself instead of
    a separate video screen. The VIDEO sub-menu is removed entirely -- its FULLSCREEN item is a no-op in a terminal door and SHOW FPS isn't wanted,
    and once DETAIL/SCREEN SIZE/BRIGHTNESS move out nothing else remains.
    "SETUP CONTROLS" and "SETUP SOUND" are renamed to "CONTROLS" and
    "SOUNDS" (both the OPTIONS entry and the sub-menu title). The sub-menus' ESC-back cursor targets are updated to the moved rows.

    Also surface the terminal-mouse mode here: the Setup Controls MOUSE row
    shows OFF/STEER/FOLLOW and clicking it cycles them (like Ctrl-O), and
    MOUSE SENSITIVITY is greyed and locked while the mouse is off.

    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 18:20:00
    https://gitlab.synchro.net/main/sbbs/-/commit/1ec9fe84a1baa627d26d8cec
    Modified Files:
    src/doors/syncduke/Game/src/game.c premap.c
    Log Message:
    syncduke: "PRESS F1 or ^A for HELP" hint at the first level of a new game

    The original shareware Duke shows "PRESS F1 FOR HELP" at the top when the
    first level starts; SyncDuke didn't. Draw a text hint (text so it can name
    the terminal's ^A alongside F1) at the top of the display loop, only at E1L1
    of a new game, aged out over ~5 seconds. It reuses the shareware banner's suppression so it hides over the menu/help 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 Saturday, July 04, 2026 00:42:00
    https://gitlab.synchro.net/main/sbbs/-/commit/645caf877c49927ef3a5c607
    Modified Files:
    src/doors/syncduke/Game/src/actors.c
    Log Message:
    syncduke: keep the burning-bin flames animating (wake occluded fire)

    The dumpster flames in E1L1 froze intermittently -- animated when first seen, then stuck once occluded (e.g. after a trooper left the bin). A flame is a dormant STATNUM-2 actor woken by movefta() only when the player is close AND has a clear cansee() line-of-sight; a flame tucked inside the bin fails cansee and never wakes, so its CON animation stalls. This is stock Chocolate-Duke behavior, just more noticeable in a terminal view. Wake BURNING/FIRE/BURNING2/ FIRE2 on proximity alone (they're already inside the distance + timetosleep gate) so an occluded flame near you still animates.

    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, July 04, 2026 00:42:00
    https://gitlab.synchro.net/main/sbbs/-/commit/f37742432860a0a19a6efb16
    Modified Files:
    src/doors/syncduke/Game/src/menues.c
    Log Message:
    syncduke: hide the Mouse Sensitivity option when the mouse is off

    It was drawn greyed/locked when mouse steering is off; hide the row entirely instead -- there's nothing to tune -- and enable the mouse via the MOUSE row
    to reveal it. The hover-hint on that spot still points to Ctrl-O.

    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, July 04, 2026 00:42:00
    https://gitlab.synchro.net/main/sbbs/-/commit/035f98173534fb56396a67cf
    Modified Files:
    src/doors/syncduke/Game/src/menues.c
    Log Message:
    syncduke: keep the menu cursor off the hidden Mouse Sensitivity row

    Follow-up to hiding MOUSE SENSITIVITY when terminal-mouse steering is
    off. It is the first Controls row, so the spinning cursor could still
    land on the now-blank row 0; bump it to row 1 when that happens. Also
    drop the stale "ENABLE THE MOUSE FIRST (CTRL-O)" hint -- with the row
    hidden and the cursor skipping it, that hint only flickered for the
    single frame the cursor grazed row 0 before the bump.

    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, July 04, 2026 20:14:00
    https://gitlab.synchro.net/main/sbbs/-/commit/0225557a182a64fee49da574
    Modified Files:
    src/doors/syncduke/Game/src/game.c src/doors/syncduke/syncduke_config.c xtrn/syncduke/syncduke.example.ini
    Log Message:
    syncduke: play Duke's title attract demos only when enabled

    The Atomic / full 1.3D-1.5 GRPs ship the DEMO*.DMO lumps (the shareware
    GRP does not), so an idle title screen would start streaming demo
    playback at a remote user who just picked single-player -- a demo's
    worth of frames they didn't ask for. Skip the attract loop by default; syncduke.ini [game] attract_demos = true restores the classic behavior.

    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, July 05, 2026 03:53:00
    https://gitlab.synchro.net/main/sbbs/-/commit/a55fa5877a42f6b3c5067d35
    Modified Files:
    src/doors/syncduke/Game/src/game.c premap.c src/doors/syncduke/syncduke_door.c
    Log Message:
    syncduke: make -map (third-party user maps) actually work

    Three defects each independently broke playing a user map, all found smoke-testing Pascal Rouaud's "Roch" against the Atomic GRP:

    - The engine's -map handler consumed only the flag, not its value, so
    the map PATH was re-parsed on the next pass of the argument loop. A
    DOS-style relative name fell through harmlessly (all -map ever worked
    with); a Unix absolute path parsed as a "/option" and dumped the
    command-line help, exiting the door.

    - The door's argv sanitizer didn't strip -log/-eventlog, leaking their
    absolute-path values into that same DOS-era parser. The stock install
    only survived by luck: "/sbbs/..." happens to parse as option 's'
    (skill). Both are door-consumed flags; strip them like -home/-grpdir.

    - premap built the usermap candidate as "<gamedir>\<file>" even with an
    EMPTY game dir, yielding "\<path>". SafeFileExists() normalizes the
    backslash and reported it present, but loadboard()'s open does not --
    so the load failed and the sane bare-path fallback never ran: every
    user map ended in "User Map x not found!". Only prepend the game dir
    when there is one.

    Also record gameexit()'s reason in the door debug log: engine errors
    ("User Map x not found!", CON errors, ...) otherwise only flash on the
    closing screen, invisible after the fact.

    Validated headless (frame captures show Roch rendering in-game) and
    live through the lobby.

    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 03:53:00
    https://gitlab.synchro.net/main/sbbs/-/commit/e18dca57bcabbb4fb7550876
    Modified Files:
    src/doors/syncduke/Game/src/premap.c
    Log Message:
    syncduke: don't show the user map's full path on the ENTERING screen

    The ENTERING USER MAP screen printed boardfilename verbatim, which is
    the full -map path (s:\sbbs\xtrn\syncduke\maps\Roch.map) -- noise, and
    a host-filesystem-layout leak, to the remote user. Show just the
    filename via xpdev's getfname().

    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 Sunday, July 05, 2026 18:04:00
    https://gitlab.synchro.net/main/sbbs/-/commit/f2d0fb57aa7f1bd50336d97b
    Modified Files:
    src/doors/syncduke/Game/src/game.c src/doors/syncduke/README.md xtrn/syncduke/syncduke.example.ini
    Log Message:
    syncduke: fix /g stack overflow; correct add-on CON docs (D.C. validated)

    Validated the lobby picker's add-on-GRP path end-to-end with Duke It Out
    In D.C. (Megaton packaging: CON scripts, replacement ART and all ten maps inside dukedc.grp) -- the episode menu lists the add-on episode and
    DUKEDC1 renders with its replacement art, headless FIFO+PPM-capture
    driven.

    Two fixes fell out:

    - Game/src/game.c: the vendored /g (add-on group file) handler declared
    char fullpathgrpfile[16] -- with upstream's own "// 16 not enough"
    comment -- so any /g path over 15 characters smashed the stack, i.e.
    every absolute path the lobby picker generates. Widened to 512.
    The mechanics are otherwise sound: the base GRP loads before
    checkcommandline() parses /g, and kopen4load() searches group files
    newest-first, so the add-on's CONs/ART shadow the base with /g alone.

    - README.md + syncduke.example.ini: both [map:*] examples paired the
    D.C. entry with "con = addons/dukedc.con", but the usual add-on GRP
    packaging carries its CON scripts inside the GRP (no such loose file
    exists), and a con= pointing at a missing file makes the engine
    Error()-exit at launch. Dropped con= from the example and documented
    when it actually applies (add-ons shipping loose CON files only).

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

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