• xtrn/zzt: installer writes zzt.ini to ctrl/, but the game reads it fro

    From Rob Swindell@VERT to GitLab issue in main/sbbs on Fri Jul 31 19:48:44 2026
    open https://gitlab.synchro.net/main/sbbs/-/issues/1209

    The ZZT installer writes the sysop's high-score-server choice to `ctrl/zzt.ini`, but the game only ever reads `xtrn/zzt/zzt.ini`. The
    prompt therefore has no effect: a sysop who answers "yes" still ends up
    with the built-in default.

    ### Why it happens

    `xtrn/zzt/install-xtrn.ini` has:

    ```ini
    [ini:zzt.ini]
    prompt = Use Futureland.today for InterBBS High Score Server?
    keys = server
    values = 'futureland.today'
    ```

    No `zzt.ini` is shipped in `xtrn/zzt/`, and `install-xtrn.js` falls back to
    the ctrl directory when an `[ini:]` target does not exist in the door's `startup_dir` (`exec/install-xtrn.js`, the `item.filename` / `file_exists` check in the `ini:` loop):

    ```js
    item.filename = startup_dir + a[0];
    if(!file_exists(item.filename))
    item.filename = file_cfgname(system.ctrl_dir, a[0]);
    ```

    So the value lands in `ctrl/zzt.ini`. The game reads it from the door
    directory instead: `applyIniOverrides()` in `zzt.js` calls `ZZT.execPath("zzt.ini")`, and `execPath()` is `safeJoin(ZZT.runtime.getExecDir(), name)`.

    The key name is fine, for what it is worth: `SERVER` is one of the keys `applyIniOverrides()` recognizes. Only the location is wrong.

    ### Reproduced

    Installed ZZT into a throwaway ctrl tree with
    `jsexec install-xtrn.js -auto -overwrite <path>/xtrn/zzt/`. Neither `xtrn/zzt/zzt.ini` nor `ctrl/zzt.ini` existed beforehand. The installer reported success:

    ```
    Use Futureland.today for InterBBS High Score Server? (Y/n)? Setting server = futureland.today
    Installed 1 external programs.
    ```

    Afterwards:

    ```
    xtrn/zzt/zzt.ini absent
    ctrl/zzt.ini EXISTS: server=futureland.today
    ```

    ### Suggested fix

    Ship a default `xtrn/zzt/zzt.ini` so the `[ini:]` target exists, or seed one from a tracked template with a `[copy:]` section, which runs before the `[ini:]` sections:

    ```ini
    [copy:zzt.example.ini]
    dest = zzt.ini
    ```

    The second form also keeps a sysop-edited `zzt.ini` from showing up as a
    dirty working tree, provided `zzt.ini` stays untracked and ignored.

    Found while converting the JSON-DB doors to prefer a `<config>.local.ini` override. ZZT was left alone in that work.

    — *Authored by Claude (Claude Code), on behalf of @rswindell*

    ---
    ï¿­ Synchronet ï¿­ Vertrauen ï¿­ Home of Synchronet ï¿­ [vert/cvs/bbs].synchro.net
  • From HM Derdok@VERT to GitLab note in main/sbbs on Fri Jul 31 21:27:09 2026
    https://gitlab.synchro.net/main/sbbs/-/issues/1209#note_9825

    Thanks for report! Will take a look this weekend...

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