cadabra Docs

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-move

Top-down movement: one avatar per player, joystick or tilt steering, dash, wall bounce and body bumps.

Controlsjoystick tilt buttonArenatopdownParams58
ParamTypeRangeDefaultWhat it does
speednumber60 – 600260Top speed in px/s.
accelnumber200 – 80001800How fast velocity reaches the stick direction, px/s².
frictionnumber0 – 208Velocity decay per second when the stick is released (0 = ice, 20 = instant stop).
bounceWallsbooleantrue or falsetrueWalls bounce (true) or stop (false) avatars.
collidePlayersbooleantrue or falsetrueAvatars push each other apart (needed for bump/steal mechanics).
dashButtonstring≤ 32 chars"dash"Controller button id that dashes; '' disables dashing.
dashCooldownSecnumber0.2 – 101.5Seconds between dashes.
dashPowernumber1.2 – 42.4Dash speed as a multiple of `speed`.
dashMsnumber80 – 600180Dash duration, ms.
inputenum"joystick" "tilt""joystick"Steering source: phone joystick or phone tilt.
tiltSensitivitynumber0.5 – 41.5Tilt gain: phones are rarely tilted fully, so a modest tilt reaches top speed.
avatarScalenumber0.5 – 2.51Avatar size multiplier (bigger = easier to bump, harder to dodge).
dashShovenumber1 – 41A dashing avatar hits others this many times harder (shove rivals into hazards: knockouts).
shoveStunSecnumber0 – 20.3Seconds a dash-shoved victim can't steer (it slides). Teammates are never stunned.
calloutstring≤ 24 chars"play"Namespace for the headline events the TV calls out (<callout>.ringout, .crumble, .overload, .core.pass, .paint.tally); '' = off.
ringOutbooleantrue or falsefalseRING 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.
ringRadiusnumber160 – 400330RING OUT: platform radius at the start, px.
ringTilenumber32 – 9648RING OUT: floor tile size, px (one crumble ring is one tile wide).
ringShrinkTonumber60 – 400150RING OUT: the platform crumbles (evenly from 30% of the round to 6 s before the end) down to about this radius, px.
ringOutPointsinteger0 – 103RING OUT: points to the last player who touched a rival (within ringCreditSec) when that rival falls off.
ringFallPenaltyinteger0 – 51RING OUT: points lost for falling off (never below zero).
ringSurvivePointsinteger0 – 50RING OUT: points to everyone still on the platform when a ring drops.
ringComebackPointsinteger0 – 30RING OUT: comeback: a player in last place (behind everyone else) scores this when they respawn after a fall.
ringCreditSecnumber0.5 – 52RING OUT: a touch this recent earns the ring-out credit.
respawnSecnumber0.5 – 51.5RING OUT: seconds out after a fall before respawning in the centre.
respawnInvulnSecnumber0 – 31RING OUT: after respawning, can't fall or be bumped for this long, s.
ringCrumbleEventKindstring≤ 40 chars""RING OUT: timeline event kind (exact) that crumbles the next ring right away. '' = off.
overloadbooleantrue or falsefalseOVERLOAD 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.
overloadCoresinteger1 – 31OVERLOAD: cores live at once (at most one per two players: 4 players and 2 => two hot potatoes).
overloadFuseMinnumber3 – 307OVERLOAD: shortest fuse, s (each core gets a random fuse between min and max; it pulses faster as it burns).
overloadFuseMaxnumber3 – 3013OVERLOAD: longest fuse, s.
overloadPenaltyinteger0 – 103OVERLOAD: points the holder loses when the core detonates (never below zero).
overloadRewardinteger0 – 51OVERLOAD: points every other player gets on a detonation.
overloadAssistPointsinteger0 – 51OVERLOAD: extra points, on a detonation, for whoever handed the core to the holder (on top of overloadReward).
overloadClutchPointsinteger0 – 51OVERLOAD: points for passing the core while it is critical (its last 3 s): a clutch pass.
overloadSafePointsinteger0 – 30OVERLOAD: every 5 s, everyone not holding a core gets this many points (holding costs you).
overloadPassImmunitySecnumber0 – 30.8OVERLOAD: after passing the core you can't be given it back for this long, s.
overloadHolderSpeednumber1 – 1.51.12OVERLOAD: top speed multiplier of the core holder (keeps the chase fair).
overloadStunSecnumber0 – 31OVERLOAD: the holder is stunned this long by the detonation, s.
overloadEventKindstring≤ 40 chars""OVERLOAD: timeline event kind (exact) that burns the current fuse down to a few seconds. '' = off.
paintbooleantrue or falsefalsePAINT 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.
paintColsinteger6 – 2420PAINT: grid columns.
paintRowsinteger4 – 1412PAINT: grid rows.
paintEverySecnumber2 – 205PAINT: seconds between territory tallies.
paintPointsinteger1 – 5010PAINT: points a tally pays for owning the whole floor (split by tiles you painted).
paintFinalMulnumber1 – 52PAINT: the final tally at the buzzer pays this many times more.
paintBurstinteger0 – 31PAINT: a dash paints a square of (2b+1)² tiles around you (1 => 3×3).
paintUnderdogbooleantrue or falsefalsePAINT: players on the team (or player) behind on score dash-splash one size bigger (3×3 => 5×5): a comeback rubber band.
cratesbooleantrue or falsefalseCRATE 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.
crateZoneSizenumber140 – 320220CRATES: zone side length, px.
cratesPerZoneinteger1 – 95CRATES: crates stacked in each zone (players × this ≤ 36).
crateSizenumber0.6 – 1.61CRATES: crate size multiplier (1 = 44 px box).
crateKnockPointsinteger0 – 102CRATES: points for knocking a rival's crate out of its zone.
crateStandPointsinteger0 – 51CRATES: points per standing crate at each tally.
crateTallySecnumber3 – 3010CRATES: seconds between standing-crate tallies.
crateFinalMulnumber1 – 52CRATES: the final tally at the buzzer pays this many times more.
crateRefillEventKindstring≤ 40 chars""CRATES: timeline event kind (exact) that refills every zone to full right away. '' = off.
crateRefillSecnumber0 – 306CRATES: every this many seconds each zone gets a lost crate back (the last-place zone gets two); 0 = never.

Collect

collect

Items 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.

ControlsjoystickArenatopdownParams27
ParamTypeRangeDefaultWhat it does
itemSpritestring≤ 40 chars"item"Sprite key for items (art resolved by the renderer).
spawnEverySecnumber0.2 – 9991.2Seconds between item spawns.
maxItemsinteger1 – 408Most items on the field at once.
pointsPerIteminteger1 – 1001Points per item (on pickup, or at the goal in carry mode).
itemRadiusnumber8 – 4814Item size, px.
carryToGoalbooleantrue or falsefalseItems are carried and only score when brought to the goal.
goalXnumber0 – 10.5Goal centre X as a fraction of arena width (carry mode).
goalYnumber0 – 10.5Goal centre Y as a fraction of arena height (carry mode).
goalRadiusnumber30 – 24070Goal size, px (carry mode).
carryMaxinteger1 – 103Most items one player can carry at once.
stealOnBumpbooleantrue or falsetrueRamming a player steals one carried item (carry mode) or pointsPerItem points.
stealCooldownSecnumber0.3 – 101.5After a steal the thief can't steal again, and can't be robbed, for this long.
goldenChancenumber0 – 10.08Chance (0..1) that a spawned item is golden.
goldenMultipliernumber1 – 103Golden items are worth this many times pointsPerItem.
spawnAreaenum"anywhere" "centre""anywhere"Where items appear: anywhere, or within spawnRadius of the arena centre (e.g. around a sleeping guard: the risky zone).
spawnRadiusnumber60 – 800300Max distance of a spawn from the arena centre when spawnArea is 'centre', px.
homeBasesbooleantrue or falsefalseCarry mode: every player gets their own basket (kind 'base', in their colour, spread along the edges); loot banks only at your own basket.
bankBonusinteger0 – 50Carry mode: extra points per item beyond the first banked in one trip (1 => 1, 3, 6 for 1, 2, 3 items): rewards greedy trips.
carrySlowdownnumber0 – 0.30Carry mode: top speed lost per carried item, as a fraction (0.12 => 3 items = 64% speed).
carryNoisenumber0 – 20Carry mode: extra noise per carried item, as a multiple of normal (guards hear you better: 0.6 => 3 items = 2.8x as loud).
goldenEventKindstring≤ 40 chars""Timeline event kind (exact) that drops one golden item next to the guard / arena centre: a mid-round jackpot. '' = off.
frenzyEventKindstring≤ 40 chars""Timeline event kind (exact) that fills the field with items at once (a loot frenzy). '' = off.
calloutstring≤ 24 chars"play"Namespace for the headline events the TV calls out (<callout>.bank, .steal, .golden); '' = off.
teamBasesbooleantrue or falsefalseCarry 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.
stealNeedsDashbooleantrue or falsefalseOnly a dashing avatar (arena-move dash) can steal or knock loot loose; ordinary bumps do nothing.
knockLoosebooleantrue or falsefalseCarry mode: a steal knocks one carried item loose onto the floor (anyone can grab it) instead of handing it to the thief.
bankLabelstring≤ 24 chars"Banked!"Popup reason when loot is banked (e.g. 'BANKED').

Dodge

dodge

Telegraphed hazards (rain, sweeping walls, chasers, bullet rings) ramp up; survive, skim close for near-miss points.

ControlsjoystickArenatopdownParams22
ParamTypeRangeDefaultWhat it does
hazardSpritestring≤ 40 chars"hazard"Sprite key for hazards (art resolved by the renderer).
patternenum"rain" "sweep" "chase" "ring""rain"rain: drops from above; sweep: walls with gaps; chase: slow homing hunters; ring: bullet rings from a point.
startRatenumber0.1 – 100.8Waves per second at the start (scaled per pattern: sweeps and rings are bigger).
rampPerSecnumber0 – 0.50.03Added to the wave rate every second.
maxRatenumber0.5 – 204Cap on the wave rate, waves per second.
telegraphMsinteger400 – 3000700Minimum 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.
hazardSpeednumber60 – 900300Hazard speed, px/s.
hazardRadiusnumber8 – 8022Hazard size, px.
onHitenum"eliminate" "losePoints" "stun""losePoints"What a hit does: eliminate the player, lose hitPenalty points, or stun for stunSec.
hitPenaltyinteger0 – 503Points lost per hit when onHit is losePoints (score never drops below 0).
stunSecnumber0.3 – 51.2Stun length when onHit is stun, s.
invulnSecnumber0.3 – 51.5Grace period after a hit (with stun: at least stunSec + 0.5 s), so no double hits.
survivePointsinteger0 – 101Points for every surviveEverySec without being hit.
surviveEverySecnumber0.5 – 102Seconds between survival payouts.
nearMissPointsinteger0 – 101Points for an armed hazard passing close without hitting.
safeZonesinteger0 – 40Circles where hazards can't hurt you; they relocate every safeZoneShiftSec.
safeZoneRadiusnumber40 – 20090Safe zone size, px.
safeZoneShiftSecnumber3 – 6010Seconds between safe zone moves.
hitKnockbacknumber0 – 12000Hits fling the avatar away from the hazard at this speed, px/s (0 = none). Comedy with slippery movement.
knockoutPointsinteger0 – 100Points to whoever shoved (dash-bumped) the victim into a hazard within the last 1.5 s.
crumbleLastSecnumber0 – 300Floor 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.
calloutstring≤ 24 chars"play"Namespace for the headline events the TV calls out (<callout>.knockout, .crumble); '' = off.

Race

race

Lane race: mash or hold to run, jump obstacles, hit speed pads, optional relay with baton passes; heats repeat.

Controlsbutton swipe joystickArenalanesParams22
ParamTypeRangeDefaultWhat it does
laneCountinteger1 – 84Lanes drawn on screen; players share lanes round-robin when there are more players.
trackLengthnumber1000 – 200004000Length of one lap in track units (px of running at speed 1).
lapsinteger1 – 103Laps per heat.
checkpointCountinteger0 – 104Scoring gates per lap (each worth checkpointPoints).
checkpointPointsinteger0 – 101Points per checkpoint passed.
relaybooleantrue or falsefalseEach lap is two legs: runner 1 must hand the baton to runner 2 in the handoff zone.
batonPassButtonstring≤ 32 chars"pass"Controller button id that hands over the baton (relay).
obstacleDensitynumber0 – 10.3Obstacles per lap = round(obstacleDensity * 10); identical layout in every lane.
boostPadsinteger0 – 62Speed pads per lap (same positions in every lane).
mashToRunbooleantrue or falsetruetrue: tap runButton (or swipe right) to run; false: hold runButton / push the stick right.
runButtonstring≤ 32 chars"run"Controller button id used to run (tap or hold, see mashToRun).
jumpButtonstring≤ 32 chars"jump"Controller button id that jumps obstacles (swipe up also jumps).
runSpeednumber80 – 900320Top running speed, track units per second.
mashPowernumber0.05 – 0.50.16Speed gained per tap as a fraction of runSpeed (mash mode).
stumbleSecnumber0.2 – 30.6Seconds a runner stumbles after hitting an obstacle.
padBoostnumber1.1 – 31.5Speed multiplier from a speed pad.
padBoostSecnumber0.3 – 51.5How long a speed pad boost lasts, s.
gateCycleSecnumber0 – 800 = 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.
gateOnFracnumber0.2 – 0.80.5Share of each gate cycle the laser is live.
obstacleSpritestring≤ 40 chars"obstacle"Sprite key for obstacles (e.g. 'laser').
padSpritestring≤ 40 chars"boost-pad"Sprite key for speed pads (e.g. 'boost').
finishLinebooleantrue or falsefalseDraw a finish line entity (kind 'finish') at the end of the track.

Sneak

sneak

Creep past guards: moving makes noise, hold Tiptoe to stay quiet. Wake the guard and it stares; get caught moving and you lose points.

Controlsjoystick hold buttonArenatopdownParams18
ParamTypeRangeDefaultWhat it does
guardSpritestring≤ 40 chars"guard"Sprite key for the guard (bear, grandma, cat...).
guardKindenum"sleeper" "patrol" "watcher""sleeper"sleeper: dozes until noise wakes it. patrol: walks a loop, sees ahead. watcher: stands still, sweeps its gaze.
guardCountinteger1 – 41Number of guards.
noiseLimitnumber10 – 1000100Noise a guard tolerates before it wakes.
noisePerMovenumber1 – 50060Noise per second of full-speed movement right next to a guard (falls off with distance).
noiseDecayPerSecnumber0 – 50012Noise a calm guard forgets per second.
hearingRadiusnumber100 – 1200420Movement farther than this from a guard makes no noise for it, px.
tiptoeButtonstring≤ 32 chars"tiptoe"Controller hold/button id: while held, avatars creep (slower, ~silent, invisible to calm guards).
tiptoeSpeedFactornumber0.1 – 10.4Top-speed multiplier while tiptoeing.
wakeDurationSecnumber1 – 154How long a woken guard stays awake (after a short wind-up telegraph), s.
wakePenaltyinteger0 – 202Points lost by whoever woke the guard, and by anyone it then catches moving.
visionConeDegnumber15 – 18070Full angle of the guard's vision cone, degrees.
visionRangenumber80 – 1000380How far a guard sees, px.
daringPointsinteger0 – 101Points per few seconds spent creeping close to a calm guard (0 = off).
onWakeenum"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.
chaseSecnumber1 – 103onWake 'chase': how long the guard chases before it gives up and plods home to sleep, s.
chaseSpeednumber60 – 600220onWake 'chase': guard run speed, px/s (set it between a loaded and an empty player's speed so greed is risky).
calloutstring≤ 24 chars"play"Namespace for the headline events the TV calls out (<callout>.chase.start, .caught); '' = off.

Tug of War

tug

Two teams haul a rope: mash, pull on the beat, or hold and manage stamina. Drag the knot over your line to win the bout.

Controlsbutton hold swipeArenatugParams15
ParamTypeRangeDefaultWhat it does
modeenum"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.
ropeLengthnumber200 – 1200640Distance the knot travels from the centre line to either team's win line and back, px.
forcePerTapnumber5 – 20040Rope speed one tap adds (px/s), averaged over the team so uneven teams are fair.
fatiguenumber0 – 10.04Stamina lost per tap (mash/rhythm) or per second held (hold); 0 = tireless.
rhythmBpmnumber40 – 200100Beat tempo for rhythm mode, beats per minute.
suddenDeathAtSecnumber5 – 12050Sim second at which pulls get stronger (sudden death).
pullButtonstring≤ 32 chars"pull"Controller button / hold id used to pull (swipes also pull).
winPointsinteger1 – 203Points to every member of a team that drags the knot over its line.
beatBonusnumber1 – 52.5beat mode: the first tap inside a beat's window (±150 ms, latency-compensated) pulls this many times harder than a normal tap.
offBeatMulnumber0 – 10.4beat mode: pull of an off-beat (or second same-beat) tap, and such taps cost 2.5x the stamina: mashing loses to rhythm.
surgeCombointeger0 – 160Beats 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.
suddenDeathBpmMulnumber1 – 21At sudden death the beat speeds up by this factor (rhythm/beat modes).
underdogBoostnumber0 – 20Rubber band: the team behind on points pulls up to (1 + underdogBoost) times harder, scaling with the gap (full at 2 bouts behind). 0 = off.
swingEventKindstring≤ 40 chars""Timeline event kind (exact) that makes the knot lurch toward the team behind on points (e.g. 'bear-sneeze'). '' = off.
calloutstring≤ 24 chars"tug"Namespace for the headline events the TV calls out (<callout>.surge, .splash, .swing); '' = off.

Draw & Judge

draw-judge

Everyone draws the prompt on their phone; an AI judge scores each drawing 0–10 with a roast.

ControlsdrawArenacanvasParams4
ParamTypeRangeDefaultWhat it does
promptstring≤ 80 chars"A cat who just became king"What everyone draws (the AI fills it from the game's ingredients).
drawSecnumber10 – 12030Seconds to draw each round.
roundsinteger1 – 52Number of draw-and-judge rounds.
judgeStyleenum"kind" "savage" "absurd""kind"Voice of the AI judge's roasts.

Trivia

trivia

Multiple-choice quiz on the phones: answer fast for bonus points. Questions are AI-written about the game (or the players).

ControlsvoteArenaquizParams5
ParamTypeRangeDefaultWhat it does
questionsarray of object0 – 30 items[]AI-filled. Empty: the block asks the host for a 'trivia-gen' judgement and falls back to a built-in bank.
secondsPerQuestionnumber5 – 3012Seconds to answer each question.
pointsFastinteger1 – 203Points for a correct answer in the first half of the question's time.
pointsSlowinteger0 – 201Points for a correct answer after that.
aboutPlayersbooleantrue or falsefalseAsk the generator for questions about the players themselves (names in the payload).

Ball Sport

ball-sport

A 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.

Controlsjoystick tilt buttonArenatopdownParams17
ParamTypeRangeDefaultWhat it does
modeenum"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.
ballSizenumber0.6 – 31.3Ball size (1 = radius 24 px, a bit bigger than a player; 2 = a giant beach ball).
ballBouncenumber0 – 1.20.85Ball restitution: 0.4 = heavy, 0.85 = default lively, 1.1 = superball.
ballMassnumber0.1 – 30.35Ball mass relative to a crate (0.35 default: players punt it far; 2 = a heavy medicine ball).
ballDampingnumber0 – 50.4How fast the rolling ball slows (0 = never stops, 0.4 default).
goalSizenumber120 – 560260Goal mouth height, px (arena is usually 720 tall).
goalDepthnumber30 – 14060Goal depth from the wall, px: the ball scores once its centre is inside.
goalPointsinteger1 – 103Points to the scorer (the scoring side's last toucher).
assistPointsinteger0 – 101Points to every other player on the scoring team.
behindBonusinteger0 – 60Comeback: extra points for a goal scored by the side (team, or player in free-for-all) that is behind on score ("COMEBACK GOAL!").
kickPowernumber0 – 1500520Extra px/s a DASHING player adds to the ball on contact (a power shot).
kickoffResetbooleantrue or falsetrueAfter a goal the ball returns to the centre and players to kickoff spots, frozen for kickoffSec.
kickoffSecnumber0 – 31Freeze after a kickoff reset, s.
keepAwayEverySecnumber0.5 – 51keepaway: seconds between possession points.
keepAwayPointsinteger1 – 51keepaway: points per tick to whoever touched the ball last.
multiballEventKindstring≤ 40 chars""Timeline event kind (exact) that drops an extra ball in (max 3 balls). '' = off.
calloutstring≤ 24 chars"play"Namespace for headline events (<callout>.goal with data.moment 'goal', .multiball); '' = off.

Physics world

spec.world

spec.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

ParamTypeRangeDefaultWhat it does
enabledbooleantrue or falsetrueRigid-body physics on (default true when world.physics is present). Players become round bodies; bumps transfer momentum and spin.
gravityXnumber-1500 – 15000Sideways 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.
gravityYnumber-1500 – 15000Downward (+) / upward (-) pull on loose props in px/s² (top-down default 0). E.g. 400 = a sloped table everything rolls down.
restitutionnumber0 – 1.20.6Bounciness of every body and wall: 0 = dead thud, 0.6 = default, 1 = superball, >1 = pinball chaos.
frictionnumber0 – 10.3Contact friction: how much grazing hits make things spin and drag along walls (0 = ice, 1 = rubber).
linearDampingnumber0 – 101.2How fast loose props slow down (0 = slide forever / floaty low-gravity feel, 1.2 = default, 5 = mud). Also scales how long knocked players slide.
angularDampingnumber0 – 101.5How fast spinning stops (0 = spins forever).
playerMassnumber0.25 – 41Player body mass relative to a crate (1). Heavy players bulldoze props and shrug off knockback; light players fly.
spinbooleantrue or falsetrueBodies rotate and spin on grazing hits (false = fixed rotation).
knockbacknumber0.25 – 41Multiplier on every player knock: bumps, dash shoves, bumper kicks and barrel blasts (2 = twice the chaos).
wallsbooleantrue or falsetrueArena edges are solid bouncy walls for props (false = props can leave the arena).
bumperKicknumber0 – 1500520Extra px/s a pinball bumper fires anything that hits it.
barrelPowernumber0 – 2500900Blast 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.

ParamTypeRangeDefaultWhat it does
kindenum"ball" "crate" "bumper" "barrel"noneball = 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.
countinteger1 – 12noneHow many (all props together at most 40).
layoutenum"scatter" "center" "ring" "edges" "corners"noneWhere 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.
sizenumber0.5 – 2.5noneSize multiplier (1 = about a player).
radiusnumber40 – 500nonering layout: circle radius in px (default 200).
respawnSecnumber0 – 30noneBarrels/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.

View the source on GitHubLast updated 23 October 2026