• src/doors/syncconquer/PROVENANCE.md src/doors/syncconquer/vanilla/reda

    From Rob Swindell (on Debian Linux)@VERT to Git commit to main/sbbs/master on Mon Jul 27 20:26:18 2026
    https://gitlab.synchro.net/main/sbbs/-/commit/35881f16ef0daf4dce26b628
    Modified Files:
    src/doors/syncconquer/PROVENANCE.md src/doors/syncconquer/vanilla/redalert/audio.cpp xtrn/syncalert/README.md syncalert.example.ini
    Log Message:
    syncconquer: caption the EVA announcements in Red Alert too

    Tiberian Dawn has captioned its spoken EVA callouts since the vendored
    patch that added them; Red Alert did not, so the same door shipped an accessibility feature to one title and not the other -- a deaf player, or
    one on a terminal with no audio, simply lost "construction complete",
    "unit ready" and "our base is under attack" in SyncAlert.

    Same shape as the Tiberian Dawn patch: a caption table aligned to the
    engine's own Speech[] table, emitted from Speak() when the door's
    [game] captions gate is true. Red Alert's engine differs enough that
    the code could not be copied across. Its VoxType carries 116 entries
    rather than 40, including unused slots (captioned NULL, which the caption helper skips) and one that exists only in an English build, so the table reproduces that conditional to stay aligned elsewhere. Its message list
    hangs off Session and takes a different argument list, so captions follow
    Red Alert's own system-message call sites in house.cpp and taction.cpp
    for color and timeout rather than Tiberian Dawn's. And its Add_Message()
    does not dedup by id, so the "don't stack a repeat while it is still on
    screen" behavior the other title gets for free is done explicitly with a
    lookup first; caption ids are offset out of the TutorialText id space
    those same call sites use, so an unrelated message can never be mistaken
    for a caption already showing.

    The caption is emitted ahead of, and independently of, Red Alert's audio
    gate -- that gate gives up on volume, sample type or quiet mode, which is exactly the case captions exist to cover.

    syncalert.example.ini gains the [game] captions key so the setting is discoverable rather than merely implemented, documented as the same
    tri-state the sibling title uses: on, off, or auto (show them only when
    the client has no usable audio).

    Live-verified against a real session: the caption appears, and matches
    the line being spoken.

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

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