Treat the board as a model, then test one change
Which patterns come from the authored rules, and which measurements would you need for a real board game?
Compare three fictional layouts, change the bounce and gravity inputs, apply random dice forces, and place a spinner, spike or booster. The circular tokens use Matter.js rigid-body dynamics with authored dimensions and parameters. Character roles and the dungeon theme are decorative fixtures, not rules or gameplay reproduced from a named commercial game.
The displayed chaos and motion values are authored indices, not physical entropy or momentum. Density weights are not kilograms, and gravity inputs are not calibrated Earth-g units. Random forces, viewport geometry, simulation timing and manually driven obstacles affect outcomes. This sandbox does not establish game balance, catch-up fairness, real material properties or a winning strategy.
Try a worked example
The Scoutβs stored restitution is 0.9. At chaos 0.85, its restitution is min(1, 0.9 Γ 0.85) = 0.765; at chaos 0.1 it is 0.09. The engine combines a contacting pair using the larger restitution. For a hypothetical one-second snapshot with total token speed 10, two collision-start pairs and chaos 0.85, the chaos index is 10 Γ 0.15 + 2 Γ 0.4 Γ 0.85 = 2.18 and the motion index is 10 Γ 2.8 = 28.0. These are demonstration formulas.
Separate engine parameters from physical units
Matter.js 0.19.0 derives body mass from density and polygon area. This app passes density = 0.002 Γ the roleβs stored weight; it does not directly assign that weight as body mass. Different token radii also change area. The engine source documents restitution and friction as body parameters; values here are assumed rather than measured materials. Matter.js 0.19.0: body source
The app sets gravity direction y from the slider and scale to 0.001. The pinned engine treats direction and magnitude as separate components. Without a length/time calibration, the slider does not report an acceleration in Earth-g units. Spinners are rotated directly each engine update, while spikes apply random force and boosters set velocity; this is an actively driven sandbox. Matter.js 0.19.0: engine source
Read the displayed indices honestly
Each one-second UI refresh sums token speed. Chaos index = 0.15 Γ summed speed + 0.4 Γ collision-start pair count Γ chaos input. Motion index = 2.8 Γ summed speed. The collision value counts newly starting pairs in the last refresh interval, not individual impacts or all persistent contacts. The FPS badge is a status label, not a measured frame-rate counter.
Physical linear momentum uses mass and velocity and has direction. Multiplying an unweighted sum of speeds by 2.8 does not compute that quantity. Use the textbook reference to compare the physical definition with this intentionally simple motion index; do not interpret it as kgΒ·m/s or a conserved total. OpenStax: linear momentum
Know what changes and what stays
Changing chaos updates existing token restitution and the displayed index weight. The initial chaotic presetβs spinner speed is set when the board loads; changing chaos alone does not update that spinner speed. Dice applies random forces to tokens that have not escaped. Reaching the goal sensor marks a token escaped but does not remove it or prevent dragging. Any token touching the dungeon switch can open the gate; no role-specific cooperation rule is implemented.
Reset Meeples replaces the four tokens while retaining the layout, custom objects, slider values and collision history. Selecting a preset rebuilds the layout and removes custom objects while retaining slider values and accumulated collision history. Resizing the board width by more than 20 pixels also reloads the current preset. Clearing the ledger changes visible messages, not the engine or lifetime collision total.
Use the export as a snapshot
Export samples the current positions, velocities, escaped flags, preset, input values and accumulated collision-start pair count. The tracked obstacle count includes unique live custom objects, spinners and gates; it is not a count of every ramp, wall, bumper, sensor or body in the world. A custom spinner must count once, and a cleared custom object must disappear from that count.
Opening the modal freezes the JSON snapshot while physics continues. Copy and Download use that same text even if tokens have moved. Reopen it for a new sample. It omits custom-object coordinates, the full board geometry, dice outcomes, event messages and entropy/motion indices. It cannot restore a complete session or reproduce a random run.
Sources and further reading