• src/doors/syncrpg/COMPILING.md build.bat src/doors/syncrpg/easyrpg/res

    From Rob Swindell (on Windows 11)@VERT to Git commit to main/sbbs/master on Tuesday, July 21, 2026 02:34:35
    https://gitlab.synchro.net/main/sbbs/-/commit/d0804f39011c0a0d9e571c51
    Added Files:
    src/doors/syncrpg/COMPILING.md build.bat src/doors/syncrpg/easyrpg/resources/windows/player.manifest player.rc.in src/doors/syncrpg/easyrpg/src/platform/windows/midiout_device_win32.cpp midiout_device_win32.h utils.cpp utils.h
    Modified Files:
    src/doors/syncrpg/.gitignore CMakeLists.txt PROVENANCE.md README.md src/doors/syncrpg/door/CMakeLists.txt
    Log Message:
    syncrpg: build the door for Win32/MSVC (build.bat + COMPILING.md)

    SyncRPG shipped *nix-only in a2047e6cd3 (fiber-33-with); its README said a Windows build.bat and MSVC verification were "not yet confirmed on this
    host". Add them. Unlike SyncSCUMM's ScummVM, EasyRPG Player is CMake on
    every platform, so build.bat runs the SAME two stages as build.sh -- the termgfx/xpdev/inih static libs, then the vendored engine as an OBJECT
    library plus the door's own sources -- driven by CMake + Ninja under MSVC
    with the dependencies from vcpkg (x86-windows-static-md, the sibling
    termgfx doors' triplet). Output: build-msvc\Release\syncrpg.exe, where exec/load/door_deploy.js looks for it.

    What the MSVC path needed, each commented where it lives and collected in
    the new COMPILING.md:

    - VsDevCmd.bat OVERWRITES VCPKG_ROOT with VS 2022's own bundled vcpkg, and
    the failure is silent: CMake configures fine and merely records libjxl /
    libsndfile as NOTFOUND, quietly degrading the door to the sixel + raw-PCM
    tiers. build.bat stashes the caller's value and restores it after.
    - EasyRPG's PlayerConfigureWindows.cmake derives CMAKE_MSVC_RUNTIME_LIBRARY
    from VCPKG_CRT_LINKAGE, undefined when its CMakeLists.txt is
    add_subdirectory'd rather than top-level, so the generator expression
    collapsed to /MT against a /MD triplet -- ~76 unresolved __imp__*
    externals from every vcpkg archive. Force the cache entry first.
    - Without /Zc:__cplusplus, MSVC reports __cplusplus as 199711L, so xpdev's
    gen_defs.h concluded there was no <stdint.h> and rolled its own
    int8_t/int32_t/uint32_t -> C2371. Same flag SyncConquer's MSVC build uses.
    - Un-prune src/platform/windows/ and resources/windows/player.{rc.in,
    manifest}: Player's CMakeLists.txt compiles/configure_file()s them
    unconditionally on WIN32, and player.cpp + audio_generic_midiout.cpp
    reference them. Neither PLAYER_BUILD_EXECUTABLE nor PLAYER_CONSOLE_PORT
    can skip that block -- both are plain set()s, not cache options. Restored
    verbatim from the pinned upstream SHA; PROVENANCE.md records it.
    - libjxl's static closure (jxl_cms, hwy, brotli*, lcms2) does not survive
    the Stage-1 -> Stage-2 absolute-path seam, and there is no pkg-config
    here to read libjxl.pc's Requires.private, so door/CMakeLists.txt
    resolves the companions explicitly into jxl_libs.txt. The same seam
    needed IMPORTED_LOCATION_RELEASE for libsndfile, plus a parent-scope
    find_package -- IMPORTED targets are directory-scoped.
    - /FI rather than -include for the ui_term.h force-include; xpdev's Win32
    system libs restated; winmm linked because midiout_device_win32.cpp
    compiles even with PLAYER_WITH_NATIVE_MIDI=OFF -- kept off deliberately,
    since a door must never play game MIDI out of the BBS host's sound card.

    Stage 1 also grows an inih target, so the MSVC build gets the archive
    build.sh hand-compiles with cc; build.sh never requests it. No *nix
    behavior changes.

    Verified on Windows 11 / VS 2022, Win32 Release: clean build.bat run,
    PE32 console binary, JXL and libsndfile tiers both linked in, and a live
    sysop play-test of Yume Nikki over the terminal.

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

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