promotional bannermobile promotional banner

Loot & Baloot

Loot & Baloot — Play Saudi Baloot (بلوت) inside World of Warcraft. A four-player trick-taking card game over the party addon channel. Host with friends or play solo against bots, with full Hokm / Sun rules, melds, escalations, and SWA claims.

File Details

v3.2.18

  • R
  • May 17, 2026
  • 5.17 MB
  • 45
  • 12.0.5
  • Retail

File Name

WHEREDNGN-v3.2.18.zip

Supported Versions

  • 12.0.5

Loot & Baloot

v3.2.18 (2026-05-17)

Full Changelog Previous Releases

  • docs(CHANGELOG): add v3.2.18 release notes
    ISMCTS runtime memory guard — targets a whole-WoW-client freeze/crash
    class (high memory, ~trick 3, 1-human + 3-bot Saudi-Master games):
    memory emergency brake + per-move telemetry via /baloot ismctsdiag +
    conservative 3-bot world-count caps + single post-move incremental GC
    step (never a full collect). Also folds in the non-addon CLAUDE.md
    CurseForge project-ID doc fix. Single release point after v3.2.17.
    Co-Authored-By: Claude Opus 4.7 (1M context) noreply@anthropic.com
  • fix(BotMaster): v3.2.18 Codex polish — GC-step 0-disable + worldscompleted reset
    Two small follow-up blockers from Codex review of abfe653 (no rewrite
    of abfe653; follow-up commit only):
    1. GC-step disable semantics. Constants doc says
      K.BOT_ISMCTS_GC_STEP_KB = 0 disables the post-move step, but the
      bare if gcAvail then collectgarbage("step", (... or 256)) still
      issued step(0) when the tunable was 0. Now resolves
      local gcStepKB = (K and K.BOT_ISMCTS_GC_STEP_KB) or 256 and
      gates if gcAvail and gcStepKB > 0 then so 0 truly disables.
    2. Telemetry reset consistency. The per-move reset comment promises
      /baloot ismctsdiag never shows a stale world count on a
      short-circuit, but _lastWorldsCompleted was not reset there — the
      no-legal-moves / legal-build-failed exits could surface a prior
      heavy move's count. Added BM._lastWorldsCompleted = 0 to the
      reset block before the short-circuit exits.
      Tests (+8): G.3j/j2/j3/j4 pin the resolve + > 0 gate + gated call
      and assert the old un-gated form is gone; G.3k still enforces no
      collectgarbage("collect"); G.3m positionally pins the
      _lastWorldsCompleted reset before short-circuit exits; G.7 is a
      deterministic behavioral test that stubs R.IsLegalPlay→false to take
      the no-legal exit (which has no own _lastWorldsCompleted write) and
      proves a seeded stale 999 is cleared to 0 by the reset block.
      Full harness 1545/0; H1 11/0; H7 9/0; git diff --check main..HEAD
      clean.
      Co-Authored-By: Claude Opus 4.7 (1M context) noreply@anthropic.com
  • fix(BotMaster): ISMCTS runtime memory guard + 3-bot world-count cap (v3.2.18)
    HIGH stability incident: WoW client freeze / high-memory crash around
    trick ~3 in 1-human + 3-bot Saudi-Master games. The v0.11.17
    wall-clock budget bounds ISMCTS latency but not allocation — on a
    fast client the determinization/rollout loop allocates megabytes of
    transient tables well within 0.12s, and with 3 Saudi-Master bots
    sampling back-to-back per trick the Lua heap spikes faster than the
    incremental GC reclaims it.
    Changes (Saudi Master ISMCTS only — no UI/log-leak changes):
    • Runtime memory emergency brake in BM.PickPlay's world loop:
      collectgarbage("count") net-delta vs K.BOT_ISMCTS_MEM_BUDGET_KB
      (default 16384 — emergency-only, several× steady-state). On trip:
      stop sampling, vote with completed worlds; zero completed → the
      existing _restore(nil) heuristic fallback (unchanged). gcAvail-
      guarded so collectgarbage-less envs degrade gracefully.
    • Per-move telemetry (_lastMemKB, _lastMemCapped, _lastNumWorlds,
      _lastLegalCount, _lastTrickCount) surfaced via /baloot ismctsdiag
      (Δmem + [MEM-CAPPED] tag).
    • 3+-bot tables cap early/mid world counts more conservatively
      (trick≤2 100→50, ≤5 60→30, late 30→20) via math.min. Internal
      sample-count only — no rules/scoring/wire/UI/card-legality change.
    • Single post-move incremental collectgarbage("step", N) — never a
      full collect, never inside the per-world/per-card tight loops.
      Confirmed bounded and NOT changed: UI handPool (≤8, reused via
      clearHand), B.Log (200 fixed ring), freezeLog (200 ring, off by
      default), WHEREDNGNDB.history (200 ring, per-round).
      Tests: new test_botmaster.lua section G (38 asserts) — behavioral
      (telemetry populated + 3-bot cap = 50 @ trick0; 0-world → heuristic
      fallback) + source pins (guard structure, no full-collect literal,
      Constants tunables, ismctsdiag memory output). Full harness 1537/0;
      H1 11/0; H7 9/0.
      Co-Authored-By: Claude Opus 4.7 (1M context) noreply@anthropic.com
  • docs(CLAUDE): fix CurseForge project ID (1526129 -> 1529200)
    The documented CurseForge project ID was stale — 1526129 actually
    resolves to a different addon (GOBIGnINTERRUPT). WHEREDNGN is
    project 1529200 ("Loot & Baloot", slug wheredngn). Doc-only;
    no code/packaging change.
    Co-Authored-By: Claude Opus 4.7 (1M context) noreply@anthropic.com