• src/doors/syncconquer/door/door_io.c

    From Rob Swindell (on Debian Linux)@VERT to Git commit to main/sbbs/master on Wed Jul 8 01:33:29 2026
    https://gitlab.synchro.net/main/sbbs/-/commit/cbea88cb7ee78a73e6657384
    Modified Files:
    src/doors/syncconquer/door/door_io.c
    Log Message:
    syncalert: TODO note 640x384 downscale + the DECSSDT status-line fix

    The engine is 640x400 (80x25) but SyncTERM defaults to an 80x24 / 640x384 canvas (its status line takes the 25th row), so every image tier downscales 0.96x and RA's single-pixel vertical bars drop -- text/gauges degrade;
    crisp only at a true 640x400. Record the proper fix inline: drop the status line with DECSSDT (CSI 0 $ ~), first saving the client's current setting via DECRQSS (DCS $ q $ ~ ST) so door exit can restore it. Notes the separate, smaller one-row sixel reserve too.

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

    ---
    þ Synchronet þ Vertrauen þ Home of Synchronet þ [vert/cvs/bbs].synchro.net
  • From Rob Swindell (on Debian Linux)@VERT to Git commit to main/sbbs/master on Fri Jul 10 23:41:57 2026
    https://gitlab.synchro.net/main/sbbs/-/commit/5936da4d1c60ec677eff815a
    Modified Files:
    src/doors/syncconquer/door/door_io.c
    Log Message:
    syncalert: play FMV cutscenes by default (-NOMOVIES now opt-in)

    The door forced -NOMOVIES into the engine argv, which suppressed Red
    Alert's VQA intro/campaign cutscenes. That suppression was intentional
    early on, but the movies actually stream fine over the terminal: the VQA
    frames route through the game page-flip into door_present(), and the
    movie loop keeps pumping the door's input/pacing (so they're skippable
    and don't stall the connection).

    Stop forcing the flag. -NOMOVIES is now injected only when the sysop
    sets the SYNCALERT_NOMOVIES environment variable, so cutscenes play by
    default. The door-arg neutering (sanitizing door-owned tokens out of the engine's view) is unchanged.

    Cutscenes are silent for now -- the no-video build links the null VQA
    audio backend; wiring VQA audio into termgfx is a separate follow-up.

    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 Linux)@VERT to Git commit to main/sbbs/master on Fri Jul 10 23:41:57 2026
    https://gitlab.synchro.net/main/sbbs/-/commit/0edf7a3435f121d8097ee0d6
    Modified Files:
    src/doors/syncconquer/door/door_io.c
    Log Message:
    syncalert: keep the PPM tier out of the F4 cycle when JXL is available

    The uncompressed PPM image tier is only a useful fallback for a SyncTERM
    build that lacks JPEG XL -- and a raw P6 carries no colorspace tag, so
    SyncTERM decodes it as BT.709 rather than our sRGB and the palette looks
    wrong. Real SyncTERM has JXL, so cycling into PPM with F4 was only ever a surprise with off colors.

    Add it to the F4 tier list only when JXL is not available. sa_auto_tier()
    still selects PPM as the automatic fallback for a no-JXL SyncTERM, so that niche keeps working.

    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 Linux)@VERT to Git commit to main/sbbs/master on Sat Jul 11 04:50:47 2026
    https://gitlab.synchro.net/main/sbbs/-/commit/bdd485515c8db099897fc76a
    Modified Files:
    src/doors/syncconquer/door/door_io.c
    Log Message:
    syncalert: merge REDALERT.INI instead of clobbering it

    door_setup_engine_paths() rewrote the per-user REDALERT.INI from scratch on every launch with only a [Paths] section. That wiped the engine's own
    persisted settings (music/sound volume, etc.) each session, and left
    [Intro] PlayIntro absent -- so it defaulted true, Special.IsFromInstall
    stayed true, and the door auto-started a Soviet campaign game on Normal
    every session instead of showing the main menu.

    Now merge with xpdev's INI reader/writer: read the existing file, (re)write only the runtime [Paths] UserPath/DataPath, and seed [Intro] PlayIntro=false ONLY when it is absent. So a fresh install boots to the main menu (with the Allies/Soviet and difficulty choosers), a sysop's or the engine's own later values survive, and iniWriteFile() rewinds+truncates so everything else in
    the file is preserved. Existing broken per-user INIs self-heal on the next launch.

    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 Linux)@VERT to Git commit to main/sbbs/master on Sat Jul 11 18:22:41 2026
    https://gitlab.synchro.net/main/sbbs/-/commit/28800fb9114d146eaf591669
    Modified Files:
    src/doors/syncconquer/door/door_io.c
    Log Message:
    syncalert: fit-toggle fixes and a tighter stats overlay

    Three fixes to the Ctrl-F Aspect<->Fill display toggle and the Ctrl-S
    stats overlay:

    - Clearing: door_fit_toggle() forced a repaint but not a screen clear,
    so switching Fill (full-width) -> Aspect (narrower, centered) left the
    old wider frame's pixels bleeding through the newly-exposed side
    margins. Request a clear, as door_tier_cycle() already does when the
    image re-centers.

    - Fill centering: Fill set the emitted width to the whole canvas width
    and centered on that, but door_emit_sixel then clamps sixel width to
    DOOR_SCALE_MAX. On a canvas wider than the cap the image landed
    flush-left with a lopsided right margin. Apply the same cap in
    door_calc_rect (sixel only) before centering so it stays symmetric.

    - Overlay: add a "fill" token (shown only in Fill mode, like "blob"),
    drop the space before the rate unit, round bytes/frame to KB, and
    remove the redundant trailing space, so the widest line (JXL with
    both blob and fill) fits one 80-column row instead of truncating.

    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 11)@VERT to Git commit to main/sbbs/master on Mon Jul 13 00:36:58 2026
    https://gitlab.synchro.net/main/sbbs/-/commit/54de3085923bf9535feec2ad
    Modified Files:
    src/doors/syncconquer/door/door_io.c
    Log Message:
    syncconquer: write the INI the ENGINE looks for, per title (syncdawn)

    SyncDawn replayed Tiberian Dawn's from-install path on every launch -- the
    long intro, then Choose_Side, then straight into a mission -- instead of reaching the main menu.

    door_setup_engine_paths() hardcoded "REDALERT.INI" as the file it writes into the per-user -home dir, for both titles. But each engine asks PathsClass::Init() for its OWN config filename -- redalert/startup.cpp passes "REDALERT.INI", tiberiandawn/startup.cpp passes "CONQUER.INI" -- and
    PathsClass looks for exactly that name. Under syncdawn the door was therefore writing a file the engine never opens, so [Intro] PlayIntro=false never
    reached it, Get_Bool("Intro", "PlayIntro", true) defaulted true, and Special.IsFromInstall fired every session (tiberiandawn/startup.cpp).

    Add DOOR_ENGINE_INI to the per-title identity block (CONQUER.INI for TD, REDALERT.INI for RA) and write that.

    It hid behind a door that otherwise worked. TD takes its mixes from door_engine_data_dir() rather than the INI's [Paths] DataPath, so the game
    data loaded fine and nothing looked wrong -- while PlayIntro, and the savegame location, silently never reached the engine.

    It also LOOKED platform-specific, and wasn't. With no INI beside argv[0] the engine's ini.Save() falls back to PathsClass::User_Path(): ~/.config/vanilla-conquer/vanillatd on POSIX, %APPDATA%\Vanilla-Conquer\vanillatd on Windows. That write persists for the *nix BBS user -- so from the second run on, Linux found PlayIntro=false and behaved, quietly papering over the bug -- but not for the Windows service account, where every run was thus a first run. That fallback is wrong for a door either way: it is ONE file shared by every caller, the very thing -home exists to prevent, and it is where TD's savegames had been going instead of
    the player's own directory.

    Verified on both hosts: data/user/<n>/tibdawn/CONQUER.INI is now created with our [Paths]/[Intro] plus the engine's own persisted [Mouse]/[Video] settings (the merge-don't-clobber path holding), and syncdawn boots to the main menu. The REDALERT.INI previously left in a tibdawn/ home is inert -- TD never read it -- and can be deleted.

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