• src/doors/syncmoo1/hw_term.c syncmoo1.h syncmoo1_config.c syncmoo1_con

    From Rob Swindell (on Debian Linux)@VERT to Git commit to main/sbbs/master on Thursday, July 23, 2026 02:18:02
    https://gitlab.synchro.net/main/sbbs/-/commit/be1749f4909c49a6135486f4
    Modified Files:
    src/doors/syncmoo1/hw_term.c syncmoo1.h syncmoo1_config.c syncmoo1_config.h syncmoo1_door.c syncmoo1_input.c syncmoo1_io.c xtrn/syncmoo1/syncmoo1.example.ini
    Log Message:
    syncmoo1: end the game when the player has stopped playing

    The third door to adopt the shared idle-user clock. Same reasoning as the siblings: the BBS's own "Maximum Inactivity" cannot see a DSR-paced door,
    since that counter is reset by any socket traffic and frame pacing makes the terminal answer ~10x/second on its own. Presence has to be judged on real input, which only the door can tell apart from its own pace-acks.

    Warn-then-terminate, countdown on the bottom row, same wording as the
    siblings, 10-minute default. Configured by -i<seconds> or the door's own
    [idle] section; the argument wins when given, so a launcher can pass -i0 to excuse an exempt user. Unset is NOT off -- that is what the shipped template now says.

    Both keyboard and mouse feed the clock. Mouse MOTION counts, not just
    clicks: MoO1 is played almost entirely with the mouse, so a player who never touches the keyboard must not be judged absent. The mouse hook sits deliberately AFTER the pointer-position update, so waking the door moves nothing and clicks nothing -- only the event is consumed.

    Input that answers the countdown is consumed rather than delivered. That matters more here than in the sibling doors: in MoO1 nearly every key does something and Escape opens a menu, so "press any key" would otherwise press that key at the game. All five key-delivery sites now route through one sm_key_deliver() helper instead of five copies of the check -- and
    deliberately NOT sm_csi_final()'s dispatcher, which also sees the DSR
    pace-ack and the capability replies, neither of which proves a player is
    there.

    -i is parsed AND stripped, sharing a predicate with -s/-t exactly as this door's own comment already required. The stakes are higher than elsewhere: 1oom's options_parse() aborts main_1oom() outright on an unrecognized "-"
    flag, so an unstripped -i600 would not misbehave subtly, it would refuse to start the door.

    The clock is armed after sm_config_apply(), not beside the -t deadline in sm_door_setup(). Setup is step 1 of main()'s sequence and the ini read is
    step 3, so arming there would see a threshold of zero and silently leave
    every install with no timeout at all.

    This door had no overlay of any kind, so one is added: sm_io_notice() plus a tick that erases it and an expire that retires it early. It needs none of
    the repaint machinery the sibling required, because sm_geom_fit_page()
    ALREADY holds the bottom row back from the image -- so the notice cannot
    paint over the picture and its erase cannot punch a hole in it. There is no stats strip here to share the row with either.

    Worth knowing: the check runs once per present, and 1oom does not present
    until roughly four seconds in while it scans its LBX files, so thresholds shorter than that floor out. Irrelevant at minute scale.

    Verified offline (-i fires to the millisecond, -i0 never does, the ini alone works with no -i, an explicit -i overrides it, and the door genuinely reads
    the installed syncmoo1.ini), and on a live node for the countdown itself.

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

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