Skip to content

More games: shorter notes ​

Each of these fits the platform as decided. The notes say which pieces you'd reach for, and what's not built yet.

Among Us ​

A working version is the sample plot/samples/hidden-roles (raw host API only: roles by visibility sets, lag-compensated shooting, a full-screen voting overlay, custom predicted movement).

  • Runtime, stashItems: true, lobbies: { size: 10 }. Lock the lobby and start the countdown when it's full (lobbies.lock(), lobbies.startCountdown({ protectEveryone: true })).

  • After onCountdownEnd, teleport the group from the lobby room to the ship (somewhere else inside your bounds).

  • Roles and kills are visibility sets. The impostor's kill button is a button only they get; vents and the body before it's reported can be { players: [...] }. Onlookers see players moving about, and no roles.

    ts
    ui.setButton(impostor, { id: "kill", side: "right", icon: "knife", cooldown: 30 });
    const body = scene.create({ Transform: { pos }, Model: { asset: "models/body.glb" } },
                              { visibility: { players: [impostor] } });   // until someone reports it
    scene.setVisibility(body, "lobby");
  • Meetings are your own full-screen UI (ui.drawOverlay with hit regions for votes) or ui.setScoreboard plus buttons. Votes come back as onButtonPress or channel messages.

  • Turn real nametags off for anonymity: players.setRealNametagsVisible(false).

Risk in blocks ​

  • Runtime, stashItems: true. Season stats in storage (storage.setPlot, storage.setPlayerProfile).
  • The board is blocks: the cheapest rendering there is, and onlookers see the live map.
  • After their entry protection, players.setCamera(p, { mode: "top", pos: [64, 120, 64], fov: 50 }).
  • Orders through buttons, or ui.drawOverlay hit regions plus InputEvent.pointer for tapping territories.
  • Fog of war: give hidden armies a visibility set per player.
  • No prediction needed: turns or slow ticks at the default 20 Hz are plenty.

Mario Galaxy ​

  • Runtime, stashItems: true. The planets are mesh terrain in your sky (glTF guide), or spheres of blocks.
  • Gravity toward the nearest planet is custom movement: players.setMovement(p, { kind: "custom" }) in onPlayerProtectionEnd, colliding through world.raycast.
  • The device predicts your custom movement with predictStep in client code (In progress: in the plots dev page; the room runs the same predictStep as the referee). Or use "movement": "client" for responsiveness.
  • At the seam, the player walks in under the base walk; your movement takes over from their velocity when their entry protection ends.

Skyrim ​

  • Runtime. Either stashItems: true (its own gear and saves: simplest), or stashItems: false so players bring their real gear: trying things out by default (undone when they leave), or keeping their items (players.askToKeepItems) to make gains and losses real.
  • One open world (lobbies: null), or lobbies of N for co-op parties.
  • Land and dungeons as mesh terrain with supplied collision meshes; engine LODs keep it visible from outside.
  • NPCs as entity types, moved by your code (no base mob AI runs in plots); quests in storage (storage.setPlayerProfile); dialogue with ui.showDialogue and onDialogueChoice (voice lines are Planned). Cutscenes are players.playCameraPath once a player's entry protection is over.
  • Combat: between players, the base game's PvP with their weapons; against your NPCs, your own hit checks (lag-compensated like the shooter) and content.damageEntity.

Horror ​

  • Runtime, stashItems: true, a lobby per group (lock it once the group is in).
  • Darkness: few Lights, dark materials. Audio: audio.play with to: { players: [target] } for scares only one player hears; positional sounds everywhere else.
  • Scares aimed at one player: entities with { players: [target] }. Outsiders see the building, not the scares.
  • Blackouts, flashes, full-screen video and camera-locked scares are all allowed (moderated, rated). There are no flash or loudness caps. The trusted layer stays on top, so the settings button, and its "Leave {plot}", is always there.

Duels and an own-items arena ​

  • Not stashed. Duels where players try things out: bring your strength (your real gear, fought with the base game's PvP), and everything's undone when you leave. An arena where they keep their items: ask with players.askToKeepItems(p) while they're protected; losses and gains are real.

A chest room (how the base game itself fits) ​

The base game's chest rooms become a lobby per chest: everyone who opens that chest is in its lobby, sees the same stacks and moves them together. It's the first real test of lobbies, and needs no client code.