Game kit
Every game in Cadabra, built-in or AI-made, is a GameSpec that composes these 9 blocks. This page is generated from kitCatalog(), the same catalogue the AI designer reads through list_blocks and get_block_schema.
Arena Move
arena-moveTop-down movement: one avatar per player, joystick or tilt steering, dash, wall bounce and body bumps.
| Param | Type | Range | Default | What it does |
|---|---|---|---|---|
speed | number | 60 – 600 | 260 | Top speed in px/s. |
accel | number | 200 – 8000 | 1800 | How fast velocity reaches the stick direction, px/s². |
friction | number | 0 – 20 | 8 | Velocity decay per second when the stick is released (0 = ice, 20 = instant stop). |
bounceWalls | boolean | true or false | true | Walls bounce (true) or stop (false) avatars. |
collidePlayers | boolean | true or false | true | Avatars push each other apart (needed for bump/steal mechanics). |
dashButton | string | ≤ 32 chars | "dash" | Controller button id that dashes; '' disables dashing. |
dashCooldownSec | number | 0.2 – 10 | 1.5 | Seconds between dashes. |
dashPower | number | 1.2 – 4 | 2.4 | Dash speed as a multiple of `speed`. |
dashMs | number | 80 – 600 | 180 | Dash duration, ms. |
input | enum | "joystick" "tilt" | "joystick" | Steering source: phone joystick or phone tilt. |
tiltSensitivity | number | 0.5 – 4 | 1.5 | Tilt gain: phones are rarely tilted fully, so a modest tilt reaches top speed. |
avatarScale | number | 0.5 – 2.5 | 1 | Avatar size multiplier (bigger = easier to bump, harder to dodge). |
dashShove | number | 1 – 4 | 1 | A dashing avatar hits others this many times harder (shove rivals into hazards: knockouts). |
shoveStunSec | number | 0 – 2 | 0.3 | Seconds a dash-shoved victim can't steer (it slides). Teammates are never stunned. |
callout | string | ≤ 24 chars | "play" | Namespace for the headline events the TV calls out (<callout>.ringout, .crumble, .overload, .core.pass, .paint.tally); '' = off. |
ringOut | boolean | true or false | false | RING OUT mode: the arena is a round floating platform of floor tiles that crumbles inward ring by ring; anyone off the platform falls out and respawns in the centre. |
ringRadius | number | 160 – 400 | 330 | RING OUT: platform radius at the start, px. |
ringTile | number | 32 – 96 | 48 | RING OUT: floor tile size, px (one crumble ring is one tile wide). |
ringShrinkTo | number | 60 – 400 | 150 | RING OUT: the platform crumbles (evenly from 30% of the round to 6 s before the end) down to about this radius, px. |
ringOutPoints | integer | 0 – 10 | 3 | RING OUT: points to the last player who touched a rival (within ringCreditSec) when that rival falls off. |
ringFallPenalty | integer | 0 – 5 | 1 | RING OUT: points lost for falling off (never below zero). |
ringSurvivePoints | integer | 0 – 5 | 0 | RING OUT: points to everyone still on the platform when a ring drops. |
ringComebackPoints | integer | 0 – 3 | 0 | RING OUT: comeback: a player in last place (behind everyone else) scores this when they respawn after a fall. |
ringCreditSec | number | 0.5 – 5 | 2 | RING OUT: a touch this recent earns the ring-out credit. |
respawnSec | number | 0.5 – 5 | 1.5 | RING OUT: seconds out after a fall before respawning in the centre. |
respawnInvulnSec | number | 0 – 3 | 1 | RING OUT: after respawning, can't fall or be bumped for this long, s. |
ringCrumbleEventKind | string | ≤ 40 chars | "" | RING OUT: timeline event kind (exact) that crumbles the next ring right away. '' = off. |
overload | boolean | true or false | false | OVERLOAD mode (hot potato): one player holds an unstable core; touching a rival passes it; when its hidden fuse runs out the holder loses overloadPenalty and everyone else gets overloadReward; then a new core goes to a random player. |
overloadCores | integer | 1 – 3 | 1 | OVERLOAD: cores live at once (at most one per two players: 4 players and 2 => two hot potatoes). |
overloadFuseMin | number | 3 – 30 | 7 | OVERLOAD: shortest fuse, s (each core gets a random fuse between min and max; it pulses faster as it burns). |
overloadFuseMax | number | 3 – 30 | 13 | OVERLOAD: longest fuse, s. |
overloadPenalty | integer | 0 – 10 | 3 | OVERLOAD: points the holder loses when the core detonates (never below zero). |
overloadReward | integer | 0 – 5 | 1 | OVERLOAD: points every other player gets on a detonation. |
overloadAssistPoints | integer | 0 – 5 | 1 | OVERLOAD: extra points, on a detonation, for whoever handed the core to the holder (on top of overloadReward). |
overloadClutchPoints | integer | 0 – 5 | 1 | OVERLOAD: points for passing the core while it is critical (its last 3 s): a clutch pass. |
overloadSafePoints | integer | 0 – 3 | 0 | OVERLOAD: every 5 s, everyone not holding a core gets this many points (holding costs you). |
overloadPassImmunitySec | number | 0 – 3 | 0.8 | OVERLOAD: after passing the core you can't be given it back for this long, s. |
overloadHolderSpeed | number | 1 – 1.5 | 1.12 | OVERLOAD: top speed multiplier of the core holder (keeps the chase fair). |
overloadStunSec | number | 0 – 3 | 1 | OVERLOAD: the holder is stunned this long by the detonation, s. |
overloadEventKind | string | ≤ 40 chars | "" | OVERLOAD: timeline event kind (exact) that burns the current fuse down to a few seconds. '' = off. |
paint | boolean | true or false | false | PAINT mode (territory): the floor is a tile grid; moving paints tiles in your team colour (own colour without teams); dashing paints a burst; tile share scores every paintEverySec and the final tally counts paintFinalMul times. |
paintCols | integer | 6 – 24 | 20 | PAINT: grid columns. |
paintRows | integer | 4 – 14 | 12 | PAINT: grid rows. |
paintEverySec | number | 2 – 20 | 5 | PAINT: seconds between territory tallies. |
paintPoints | integer | 1 – 50 | 10 | PAINT: points a tally pays for owning the whole floor (split by tiles you painted). |
paintFinalMul | number | 1 – 5 | 2 | PAINT: the final tally at the buzzer pays this many times more. |
paintBurst | integer | 0 – 3 | 1 | PAINT: a dash paints a square of (2b+1)² tiles around you (1 => 3×3). |
paintUnderdog | boolean | true or false | false | PAINT: players on the team (or player) behind on score dash-splash one size bigger (3×3 => 5×5): a comeback rubber band. |
crates | boolean | true or false | false | CRATE CRASH mode (turns physics on): every player owns a square platform zone stacked with physics crates. Knock rivals' crates out of their zone (dash, bump, or a barrel blast from world.props) for crateKnockPoints; every crateTallySec you score crateStandPoints per crate still standing in your zone; the final tally pays crateFinalMul times. |
crateZoneSize | number | 140 – 320 | 220 | CRATES: zone side length, px. |
cratesPerZone | integer | 1 – 9 | 5 | CRATES: crates stacked in each zone (players × this ≤ 36). |
crateSize | number | 0.6 – 1.6 | 1 | CRATES: crate size multiplier (1 = 44 px box). |
crateKnockPoints | integer | 0 – 10 | 2 | CRATES: points for knocking a rival's crate out of its zone. |
crateStandPoints | integer | 0 – 5 | 1 | CRATES: points per standing crate at each tally. |
crateTallySec | number | 3 – 30 | 10 | CRATES: seconds between standing-crate tallies. |
crateFinalMul | number | 1 – 5 | 2 | CRATES: the final tally at the buzzer pays this many times more. |
crateRefillEventKind | string | ≤ 40 chars | "" | CRATES: timeline event kind (exact) that refills every zone to full right away. '' = off. |
crateRefillSec | number | 0 – 30 | 6 | CRATES: every this many seconds each zone gets a lost crate back (the last-place zone gets two); 0 = never. |
Collect
collectItems pop up; grab them for points, or carry them home to bank (own baskets, carry limits that slow you and make noise, combo bonus for full trips). Golden items, bump-to-steal.
| Param | Type | Range | Default | What it does |
|---|---|---|---|---|
itemSprite | string | ≤ 40 chars | "item" | Sprite key for items (art resolved by the renderer). |
spawnEverySec | number | 0.2 – 999 | 1.2 | Seconds between item spawns. |
maxItems | integer | 1 – 40 | 8 | Most items on the field at once. |
pointsPerItem | integer | 1 – 100 | 1 | Points per item (on pickup, or at the goal in carry mode). |
itemRadius | number | 8 – 48 | 14 | Item size, px. |
carryToGoal | boolean | true or false | false | Items are carried and only score when brought to the goal. |
goalX | number | 0 – 1 | 0.5 | Goal centre X as a fraction of arena width (carry mode). |
goalY | number | 0 – 1 | 0.5 | Goal centre Y as a fraction of arena height (carry mode). |
goalRadius | number | 30 – 240 | 70 | Goal size, px (carry mode). |
carryMax | integer | 1 – 10 | 3 | Most items one player can carry at once. |
stealOnBump | boolean | true or false | true | Ramming a player steals one carried item (carry mode) or pointsPerItem points. |
stealCooldownSec | number | 0.3 – 10 | 1.5 | After a steal the thief can't steal again, and can't be robbed, for this long. |
goldenChance | number | 0 – 1 | 0.08 | Chance (0..1) that a spawned item is golden. |
goldenMultiplier | number | 1 – 10 | 3 | Golden items are worth this many times pointsPerItem. |
spawnArea | enum | "anywhere" "centre" | "anywhere" | Where items appear: anywhere, or within spawnRadius of the arena centre (e.g. around a sleeping guard: the risky zone). |
spawnRadius | number | 60 – 800 | 300 | Max distance of a spawn from the arena centre when spawnArea is 'centre', px. |
homeBases | boolean | true or false | false | Carry mode: every player gets their own basket (kind 'base', in their colour, spread along the edges); loot banks only at your own basket. |
bankBonus | integer | 0 – 5 | 0 | Carry mode: extra points per item beyond the first banked in one trip (1 => 1, 3, 6 for 1, 2, 3 items): rewards greedy trips. |
carrySlowdown | number | 0 – 0.3 | 0 | Carry mode: top speed lost per carried item, as a fraction (0.12 => 3 items = 64% speed). |
carryNoise | number | 0 – 2 | 0 | Carry mode: extra noise per carried item, as a multiple of normal (guards hear you better: 0.6 => 3 items = 2.8x as loud). |
goldenEventKind | string | ≤ 40 chars | "" | Timeline event kind (exact) that drops one golden item next to the guard / arena centre: a mid-round jackpot. '' = off. |
frenzyEventKind | string | ≤ 40 chars | "" | Timeline event kind (exact) that fills the field with items at once (a loot frenzy). '' = off. |
callout | string | ≤ 24 chars | "play" | Namespace for the headline events the TV calls out (<callout>.bank, .steal, .golden); '' = off. |
teamBases | boolean | true or false | false | Carry mode, team games: one base per team (kind 'base', team-tinted, left and right edges); loot banks at your team's base, and bumps never rob a teammate. Overrides homeBases. |
stealNeedsDash | boolean | true or false | false | Only a dashing avatar (arena-move dash) can steal or knock loot loose; ordinary bumps do nothing. |
knockLoose | boolean | true or false | false | Carry mode: a steal knocks one carried item loose onto the floor (anyone can grab it) instead of handing it to the thief. |
bankLabel | string | ≤ 24 chars | "Banked!" | Popup reason when loot is banked (e.g. 'BANKED'). |
Dodge
dodgeTelegraphed hazards (rain, sweeping walls, chasers, bullet rings) ramp up; survive, skim close for near-miss points.
| Param | Type | Range | Default | What it does |
|---|---|---|---|---|
hazardSprite | string | ≤ 40 chars | "hazard" | Sprite key for hazards (art resolved by the renderer). |
pattern | enum | "rain" "sweep" "chase" "ring" | "rain" | rain: drops from above; sweep: walls with gaps; chase: slow homing hunters; ring: bullet rings from a point. |
startRate | number | 0.1 – 10 | 0.8 | Waves per second at the start (scaled per pattern: sweeps and rings are bigger). |
rampPerSec | number | 0 – 0.5 | 0.03 | Added to the wave rate every second. |
maxRate | number | 0.5 – 20 | 4 | Cap on the wave rate, waves per second. |
telegraphMs | integer | 400 – 3000 | 700 | Minimum warning before a hazard can hurt anyone (never below 400 ms). The block lengthens it per hazard when the slowest/largest avatar needs longer to escape. |
hazardSpeed | number | 60 – 900 | 300 | Hazard speed, px/s. |
hazardRadius | number | 8 – 80 | 22 | Hazard size, px. |
onHit | enum | "eliminate" "losePoints" "stun" | "losePoints" | What a hit does: eliminate the player, lose hitPenalty points, or stun for stunSec. |
hitPenalty | integer | 0 – 50 | 3 | Points lost per hit when onHit is losePoints (score never drops below 0). |
stunSec | number | 0.3 – 5 | 1.2 | Stun length when onHit is stun, s. |
invulnSec | number | 0.3 – 5 | 1.5 | Grace period after a hit (with stun: at least stunSec + 0.5 s), so no double hits. |
survivePoints | integer | 0 – 10 | 1 | Points for every surviveEverySec without being hit. |
surviveEverySec | number | 0.5 – 10 | 2 | Seconds between survival payouts. |
nearMissPoints | integer | 0 – 10 | 1 | Points for an armed hazard passing close without hitting. |
safeZones | integer | 0 – 4 | 0 | Circles where hazards can't hurt you; they relocate every safeZoneShiftSec. |
safeZoneRadius | number | 40 – 200 | 90 | Safe zone size, px. |
safeZoneShiftSec | number | 3 – 60 | 10 | Seconds between safe zone moves. |
hitKnockback | number | 0 – 1200 | 0 | Hits fling the avatar away from the hazard at this speed, px/s (0 = none). Comedy with slippery movement. |
knockoutPoints | integer | 0 – 10 | 0 | Points to whoever shoved (dash-bumped) the victim into a hazard within the last 1.5 s. |
crumbleLastSec | number | 0 – 30 | 0 | Floor of tiles (kind 'tile') that crumbles from the edges inward in the final N seconds: tiles shake (props.crumbling), then drop; standing over a hole counts as a hit. 0 = no floor. |
callout | string | ≤ 24 chars | "play" | Namespace for the headline events the TV calls out (<callout>.knockout, .crumble); '' = off. |
Race
raceLane race: mash or hold to run, jump obstacles, hit speed pads, optional relay with baton passes; heats repeat.
| Param | Type | Range | Default | What it does |
|---|---|---|---|---|
laneCount | integer | 1 – 8 | 4 | Lanes drawn on screen; players share lanes round-robin when there are more players. |
trackLength | number | 1000 – 20000 | 4000 | Length of one lap in track units (px of running at speed 1). |
laps | integer | 1 – 10 | 3 | Laps per heat. |
checkpointCount | integer | 0 – 10 | 4 | Scoring gates per lap (each worth checkpointPoints). |
checkpointPoints | integer | 0 – 10 | 1 | Points per checkpoint passed. |
relay | boolean | true or false | false | Each lap is two legs: runner 1 must hand the baton to runner 2 in the handoff zone. |
batonPassButton | string | ≤ 32 chars | "pass" | Controller button id that hands over the baton (relay). |
obstacleDensity | number | 0 – 1 | 0.3 | Obstacles per lap = round(obstacleDensity * 10); identical layout in every lane. |
boostPads | integer | 0 – 6 | 2 | Speed pads per lap (same positions in every lane). |
mashToRun | boolean | true or false | true | true: tap runButton (or swipe right) to run; false: hold runButton / push the stick right. |
runButton | string | ≤ 32 chars | "run" | Controller button id used to run (tap or hold, see mashToRun). |
jumpButton | string | ≤ 32 chars | "jump" | Controller button id that jumps obstacles (swipe up also jumps). |
runSpeed | number | 80 – 900 | 320 | Top running speed, track units per second. |
mashPower | number | 0.05 – 0.5 | 0.16 | Speed gained per tap as a fraction of runSpeed (mash mode). |
stumbleSec | number | 0.2 – 3 | 0.6 | Seconds a runner stumbles after hitting an obstacle. |
padBoost | number | 1.1 – 3 | 1.5 | Speed multiplier from a speed pad. |
padBoostSec | number | 0.3 – 5 | 1.5 | How long a speed pad boost lasts, s. |
gateCycleSec | number | 0 – 8 | 0 | 0 = obstacles are always there. >0 = obstacles are laser gates that switch on and off on this cycle (each gate out of step with the next): only a live gate trips you, so time your run or jump it. |
gateOnFrac | number | 0.2 – 0.8 | 0.5 | Share of each gate cycle the laser is live. |
obstacleSprite | string | ≤ 40 chars | "obstacle" | Sprite key for obstacles (e.g. 'laser'). |
padSprite | string | ≤ 40 chars | "boost-pad" | Sprite key for speed pads (e.g. 'boost'). |
finishLine | boolean | true or false | false | Draw a finish line entity (kind 'finish') at the end of the track. |
Sneak
sneakCreep past guards: moving makes noise, hold Tiptoe to stay quiet. Wake the guard and it stares; get caught moving and you lose points.
| Param | Type | Range | Default | What it does |
|---|---|---|---|---|
guardSprite | string | ≤ 40 chars | "guard" | Sprite key for the guard (bear, grandma, cat...). |
guardKind | enum | "sleeper" "patrol" "watcher" | "sleeper" | sleeper: dozes until noise wakes it. patrol: walks a loop, sees ahead. watcher: stands still, sweeps its gaze. |
guardCount | integer | 1 – 4 | 1 | Number of guards. |
noiseLimit | number | 10 – 1000 | 100 | Noise a guard tolerates before it wakes. |
noisePerMove | number | 1 – 500 | 60 | Noise per second of full-speed movement right next to a guard (falls off with distance). |
noiseDecayPerSec | number | 0 – 500 | 12 | Noise a calm guard forgets per second. |
hearingRadius | number | 100 – 1200 | 420 | Movement farther than this from a guard makes no noise for it, px. |
tiptoeButton | string | ≤ 32 chars | "tiptoe" | Controller hold/button id: while held, avatars creep (slower, ~silent, invisible to calm guards). |
tiptoeSpeedFactor | number | 0.1 – 1 | 0.4 | Top-speed multiplier while tiptoeing. |
wakeDurationSec | number | 1 – 15 | 4 | How long a woken guard stays awake (after a short wind-up telegraph), s. |
wakePenalty | integer | 0 – 20 | 2 | Points lost by whoever woke the guard, and by anyone it then catches moving. |
visionConeDeg | number | 15 – 180 | 70 | Full angle of the guard's vision cone, degrees. |
visionRange | number | 80 – 1000 | 380 | How far a guard sees, px. |
daringPoints | integer | 0 – 10 | 1 | Points per few seconds spent creeping close to a calm guard (0 = off). |
onWake | enum | "stare" "chase" | "stare" | What a woken guard does. stare: stands and catches anyone moving in its vision cone. chase: runs after the loudest player (the culprit) for chaseSec; a catch makes them drop everything they carry and tumble. |
chaseSec | number | 1 – 10 | 3 | onWake 'chase': how long the guard chases before it gives up and plods home to sleep, s. |
chaseSpeed | number | 60 – 600 | 220 | onWake 'chase': guard run speed, px/s (set it between a loaded and an empty player's speed so greed is risky). |
callout | string | ≤ 24 chars | "play" | Namespace for the headline events the TV calls out (<callout>.chase.start, .caught); '' = off. |
Tug of War
tugTwo teams haul a rope: mash, pull on the beat, or hold and manage stamina. Drag the knot over your line to win the bout.
| Param | Type | Range | Default | What it does |
|---|---|---|---|---|
mode | enum | "mash" "rhythm" "hold" "beat" | "mash" | mash: tap to pull. rhythm: one pull per beat, scaled by timing. hold: hold to pull while stamina lasts. beat: rhythm-mash, every tap pulls but taps on the beat pull beatBonus times harder. |
ropeLength | number | 200 – 1200 | 640 | Distance the knot travels from the centre line to either team's win line and back, px. |
forcePerTap | number | 5 – 200 | 40 | Rope speed one tap adds (px/s), averaged over the team so uneven teams are fair. |
fatigue | number | 0 – 1 | 0.04 | Stamina lost per tap (mash/rhythm) or per second held (hold); 0 = tireless. |
rhythmBpm | number | 40 – 200 | 100 | Beat tempo for rhythm mode, beats per minute. |
suddenDeathAtSec | number | 5 – 120 | 50 | Sim second at which pulls get stronger (sudden death). |
pullButton | string | ≤ 32 chars | "pull" | Controller button / hold id used to pull (swipes also pull). |
winPoints | integer | 1 – 20 | 3 | Points to every member of a team that drags the knot over its line. |
beatBonus | number | 1 – 5 | 2.5 | beat mode: the first tap inside a beat's window (±150 ms, latency-compensated) pulls this many times harder than a normal tap. |
offBeatMul | number | 0 – 1 | 0.4 | beat mode: pull of an off-beat (or second same-beat) tap, and such taps cost 2.5x the stamina: mashing loses to rhythm. |
surgeCombo | integer | 0 – 16 | 0 | Beats in a row where every team member lands exactly one on-beat tap (no mashing) that trigger a SURGE (a big yank toward that team); 0 = off. beat/rhythm modes. |
suddenDeathBpmMul | number | 1 – 2 | 1 | At sudden death the beat speeds up by this factor (rhythm/beat modes). |
underdogBoost | number | 0 – 2 | 0 | Rubber band: the team behind on points pulls up to (1 + underdogBoost) times harder, scaling with the gap (full at 2 bouts behind). 0 = off. |
swingEventKind | string | ≤ 40 chars | "" | Timeline event kind (exact) that makes the knot lurch toward the team behind on points (e.g. 'bear-sneeze'). '' = off. |
callout | string | ≤ 24 chars | "tug" | Namespace for the headline events the TV calls out (<callout>.surge, .splash, .swing); '' = off. |
Draw & Judge
draw-judgeEveryone draws the prompt on their phone; an AI judge scores each drawing 0–10 with a roast.
| Param | Type | Range | Default | What it does |
|---|---|---|---|---|
prompt | string | ≤ 80 chars | "A cat who just became king" | What everyone draws (the AI fills it from the game's ingredients). |
drawSec | number | 10 – 120 | 30 | Seconds to draw each round. |
rounds | integer | 1 – 5 | 2 | Number of draw-and-judge rounds. |
judgeStyle | enum | "kind" "savage" "absurd" | "kind" | Voice of the AI judge's roasts. |
Trivia
triviaMultiple-choice quiz on the phones: answer fast for bonus points. Questions are AI-written about the game (or the players).
| Param | Type | Range | Default | What it does |
|---|---|---|---|---|
questions | array of object | 0 – 30 items | [] | AI-filled. Empty: the block asks the host for a 'trivia-gen' judgement and falls back to a built-in bank. |
secondsPerQuestion | number | 5 – 30 | 12 | Seconds to answer each question. |
pointsFast | integer | 1 – 20 | 3 | Points for a correct answer in the first half of the question's time. |
pointsSlow | integer | 0 – 20 | 1 | Points for a correct answer after that. |
aboutPlayers | boolean | true or false | false | Ask the generator for questions about the players themselves (names in the payload). |
Ball Sport
ball-sportA physics ball and two goals (2v2 car-soccer / pinball football) or free-for-all keep-away. Dash into the ball for a power shot; it banks off walls. Needs arena-move for movement.
| Param | Type | Range | Default | What it does |
|---|---|---|---|---|
mode | enum | "goals" "keepaway" | "goals" | goals = two goals on the left/right walls (teams: team 0 defends the left, team 1 the right; free-for-all: whoever touched the ball last scores in either goal). keepaway = no goals: whoever touched the ball last scores keepAwayPoints every keepAwayEverySec. |
ballSize | number | 0.6 – 3 | 1.3 | Ball size (1 = radius 24 px, a bit bigger than a player; 2 = a giant beach ball). |
ballBounce | number | 0 – 1.2 | 0.85 | Ball restitution: 0.4 = heavy, 0.85 = default lively, 1.1 = superball. |
ballMass | number | 0.1 – 3 | 0.35 | Ball mass relative to a crate (0.35 default: players punt it far; 2 = a heavy medicine ball). |
ballDamping | number | 0 – 5 | 0.4 | How fast the rolling ball slows (0 = never stops, 0.4 default). |
goalSize | number | 120 – 560 | 260 | Goal mouth height, px (arena is usually 720 tall). |
goalDepth | number | 30 – 140 | 60 | Goal depth from the wall, px: the ball scores once its centre is inside. |
goalPoints | integer | 1 – 10 | 3 | Points to the scorer (the scoring side's last toucher). |
assistPoints | integer | 0 – 10 | 1 | Points to every other player on the scoring team. |
behindBonus | integer | 0 – 6 | 0 | Comeback: extra points for a goal scored by the side (team, or player in free-for-all) that is behind on score ("COMEBACK GOAL!"). |
kickPower | number | 0 – 1500 | 520 | Extra px/s a DASHING player adds to the ball on contact (a power shot). |
kickoffReset | boolean | true or false | true | After a goal the ball returns to the centre and players to kickoff spots, frozen for kickoffSec. |
kickoffSec | number | 0 – 3 | 1 | Freeze after a kickoff reset, s. |
keepAwayEverySec | number | 0.5 – 5 | 1 | keepaway: seconds between possession points. |
keepAwayPoints | integer | 1 – 5 | 1 | keepaway: points per tick to whoever touched the ball last. |
multiballEventKind | string | ≤ 40 chars | "" | Timeline event kind (exact) that drops an extra ball in (max 3 balls). '' = off. |
callout | string | ≤ 24 chars | "play" | Namespace for headline events (<callout>.goal with data.moment 'goal', .multiball); '' = off. |
Physics world
spec.worldspec.world turns on rigid-body physics (planck.js) and adds physics props.
- world.physics turns on rigid-body physics (planck.js): players become round bodies, bumps carry momentum and spin, props roll, bounce, topple and explode. Omit `world` for classic arcade movement.
- Top-down arenas: leave gravity at 0 for a flat table; gravityY 200–600 = a sloped table everything slides down.
- Feel presets: floaty / low gravity = linearDamping 0.2, restitution 0.9, arena-move friction 2; bouncy = restitution 1.0–1.2; heavy = playerMass 2, knockback 0.7; chaos = knockback 2, bumperKick 900.
- world.props spawns balls, crates, bumpers (static pinball kickers) and barrels (explode when dashed into or slammed). Keep the total ≤ 40.
- ball-sport needs no world.physics (it turns physics on itself); arena-move `crates` also turns it on.
- theme.look picks the art: neon (glowing vector arcade), toybox (glossy plastic toys), cosmos (deep space), retro (pixel-art CRT). Set theme.sfxSet to the same id for matching music and sfx.
world.physics
| Param | Type | Range | Default | What it does |
|---|---|---|---|---|
enabled | boolean | true or false | true | Rigid-body physics on (default true when world.physics is present). Players become round bodies; bumps transfer momentum and spin. |
gravityX | number | -1500 – 1500 | 0 | Sideways pull on loose props (ball, crates, barrels) in px/s² (top-down default 0). Non-zero tilts the arena: things slide that way; players feel a gentle drift. |
gravityY | number | -1500 – 1500 | 0 | Downward (+) / upward (-) pull on loose props in px/s² (top-down default 0). E.g. 400 = a sloped table everything rolls down. |
restitution | number | 0 – 1.2 | 0.6 | Bounciness of every body and wall: 0 = dead thud, 0.6 = default, 1 = superball, >1 = pinball chaos. |
friction | number | 0 – 1 | 0.3 | Contact friction: how much grazing hits make things spin and drag along walls (0 = ice, 1 = rubber). |
linearDamping | number | 0 – 10 | 1.2 | How fast loose props slow down (0 = slide forever / floaty low-gravity feel, 1.2 = default, 5 = mud). Also scales how long knocked players slide. |
angularDamping | number | 0 – 10 | 1.5 | How fast spinning stops (0 = spins forever). |
playerMass | number | 0.25 – 4 | 1 | Player body mass relative to a crate (1). Heavy players bulldoze props and shrug off knockback; light players fly. |
spin | boolean | true or false | true | Bodies rotate and spin on grazing hits (false = fixed rotation). |
knockback | number | 0.25 – 4 | 1 | Multiplier on every player knock: bumps, dash shoves, bumper kicks and barrel blasts (2 = twice the chaos). |
walls | boolean | true or false | true | Arena edges are solid bouncy walls for props (false = props can leave the arena). |
bumperKick | number | 0 – 1500 | 520 | Extra px/s a pinball bumper fires anything that hits it. |
barrelPower | number | 0 – 2500 | 900 | Blast strength of an explosive barrel (px/s at the centre, falling off to 0 at 220 px). |
world.props
Physics props: balls, crates, bumpers and barrels.
| Param | Type | Range | Default | What it does |
|---|---|---|---|---|
kind | enum | "ball" "crate" "bumper" "barrel" | none | ball = round bouncy body; crate = box that slides, rotates and spins; bumper = static pinball bumper that kicks; barrel = explodes with a radial blast when dashed into or slammed. |
count | integer | 1 – 12 | none | How many (all props together at most 40). |
layout | enum | "scatter" "center" "ring" "edges" "corners" | none | Where they spawn: scatter (random, default), center (clustered in the middle), ring (evenly on a circle of `radius` around the centre), edges (along the walls), corners. |
size | number | 0.5 – 2.5 | none | Size multiplier (1 = about a player). |
radius | number | 40 – 500 | none | ring layout: circle radius in px (default 200). |
respawnSec | number | 0 – 30 | none | Barrels/balls that explode or leave come back at their spawn after this many seconds (0 = never; default 6). |
Looks
theme.look is one of neon, toybox, cosmos, retro. Set theme.sfxSet to the same id for matching music and sound.
No block or param matches that filter.