Browser 3D sequel to Tiny Turbo — Micro Machines V3 chaos on household tables (Godot 4.7 / WebGL2)
  • GDScript 95.1%
  • Shell 1.3%
  • GAP 0.9%
  • Python 0.8%
  • HTML 0.7%
  • Other 1.2%
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
alex 4e4fcb5777 fix(surface): the stairs are gone - softer grade, eased transitions, forgiving landing
The operator's complaint, measured and fixed at the surface rather than in the car.

Before: at 30 m/s the south pass / ramp / deck transitions demanded 15-17 m/s^2 of
centripetal acceleration where gravity supplies 9.8, so the car unloaded - 7% of
ticks in contact, 101 contact losses, 0.763 units airborne down the plank descent.

Three changes, together (the operator chose 'both'):
- the grade is halved. The ramp climbed ~9.4 units over ~32 horizontal units (29%,
  not the 16% its comment claimed); the deck drops 12.09 -> 8.54 and the climb is
  spread over more of the approach. Max demand per elevated section is now 7-8 m/s^2
  at 30 m/s, i.e. under gravity.
- CONTACT_BOUNCE 0.35 -> 0.15, and the contact spin-out now needs a real impact
  rather than any contact, so a landing costs speed rather than steering.
- ELEVATION_EASE 12 keeps every flat<->slope join continuous (one profile, read by
  the ribbon, collision, kerbs and checkpoints alike).

Measured after, same instrument, same driver: at 30 m/s the descent is 100% of
ticks in contact, 0 contact losses, peak lift 0.005 units, mean vertical accel 4.6;
at 16 m/s, 100% contact and mean 6.7. The two failed tests are green, plus the west
U-turn and the brake-into-a-corner wedge regression the smaller car caused.

194 test cases, 0 failures.
2026-10-25 10:46:49 +01:00
.pi/agents docs: adopt the title Tiny Turbo: Table Turmoil and record the routing decisions 2026-10-24 14:13:33 +02:00
addons/gdUnit4 chore(m0): vendor gdUnit4 v6.2.2 and prove the test harness 2026-10-24 14:18:14 +02:00
assets feat(art): add M1.5 surface family (worn track cloth, felt, turf, wood, water, stone) 2026-10-24 23:46:47 +02:00
data fix(surface): the stairs are gone - softer grade, eased transitions, forgiving landing 2026-10-25 10:46:49 +01:00
docs fix(surface): the stairs are gone - softer grade, eased transitions, forgiving landing 2026-10-25 10:46:49 +01:00
scenes feat(race): the race — countdown, laps, standings, AI, results and a trace of a whole race 2026-10-24 21:58:05 +02:00
scripts fix(surface): the stairs are gone - softer grade, eased transitions, forgiving landing 2026-10-25 10:46:49 +01:00
shaders feat(hud): the minimap draws the circuit, and the break-cut reads as a hit 2026-10-25 02:14:25 +02:00
tests fix(surface): the stairs are gone - softer grade, eased transitions, forgiving landing 2026-10-25 10:46:49 +01:00
.gitattributes chore(m0): scaffold Godot 4.7.2 project, gate and the plan for Tiny Turbo 3D 2026-10-24 13:46:12 +02:00
.gitignore chore: stop tracking the dex store 2026-10-24 14:22:30 +02:00
AGENTS.md docs: adopt the title Tiny Turbo: Table Turmoil and record the routing decisions 2026-10-24 14:13:33 +02:00
CONTRIBUTING.md feat(check): a board-live sweep, so the signature rule has a proof somewhere 2026-10-25 02:14:22 +01:00
export_presets.cfg art: ship a tileable cloth, keep the AI attempt as reference 2026-10-24 14:53:07 +02:00
GLOSSARY.md chore(m0): scaffold Godot 4.7.2 project, gate and the plan for Tiny Turbo 3D 2026-10-24 13:46:12 +02:00
project.godot feat(race): the race — countdown, laps, standings, AI, results and a trace of a whole race 2026-10-24 21:58:05 +02:00
README.md docs: the spec and README describe HEAD, including what is NOT implemented 2026-10-25 02:51:05 +01:00

Tiny Turbo: Table Turmoil 🏎️

The 3D browser sequel to Tiny Turbo: the same eight comical drivers and the same household tables, now raced in three dimensions with Micro Machines V3's chaos — weapon pickups and the 8-bulb Screen Break duel. M2 ships the breakfast table; the rest of the tables are M4's work.

Built with Godot 4.7.2 / GDScript, exported to WebGL2 (Compatibility renderer, single-threaded) and served as a static site on the home-lab arcade.

Status: M2 — the chaos layer. One race is playable end to end in the browser: three laps of the breakfast table against three AI drivers, five weapon pickups plus the tank's shell, and the Screen Break bulb board. One archetype ships (sports), one table ships, and there is no front end yet — the game boots straight into a race. The plan is in docs/plan/roadmap.md; M3 is the second archetype and the cups.

What it is

Camera Chase cam behind the car: boom and FOV that move in opposite senses with speed, a dolly punch-in, shake on contact
Race 3 laps of the breakfast table, 4 cars (you + 3 AI on a fixed seed), countdown, standings, results board, pause
The V3 rule Screen Break — earn 34 m of daylight on the nearest rival that still holds a bulb, inside a 4 s window (a standing lead is not an event: a clean car's ceiling is 34 m in 4 s, so it takes a fall or a hit), max 2 steals per lap, hold all 8 to win the race instantly. No pause: the steal costs 0.35 s of slow motion and a camera punch (V3's most-criticised feature, deliberately removed)
Weapons Five pickups — missile, hammer, oil slick, shield, turbo can — plus the tank's shell. The AI fires on the same seam the player does
Vehicles One archetype ships: sports. The buggy, tank and hovercraft rows exist in data/vehicles.gd and in the race model's balancing runs, but the race scene places every car as a sports car (M3)
Drivers Leodin, Nitro Nana, Sir Reginald, Capt. Whiskers, Lili-Anna, Clara, Tina Turbo, Moni Mayhem — carried over unchanged, four of them on the grid
Tables One ships: the breakfast table (procedural gingham ribbon, kerbs, plank bridge, props). Pool table, pitch, study desk, kitchen counter and garden pond are planned (M4)
Structure M2 has no cups, no points and no menus: one race, then R restarts it. The 2 × 3-table cup and the prize cars are M4
Look Glossy toy diorama: saturated palette, one warm sun, blob shadows, procedural seamless surfaces (numpy recipes in scripts/tools/make_surfaces.py), every mesh built from code
Not yet wired Syrup/milk hazard discs are placed and drawn but no query reads them yet (a surface that slows you is M3); there is no audio system, so nothing in the game makes a sound

Run it

./scripts/gate.sh          # import → parse-check → tests → trace → web export
./scripts/serve.sh         # http://127.0.0.1:8060
./scripts/shot.sh <pose>   # render a named pose to shots/<pose>.png for review

Needs Godot 4.7.2 at /Applications/Godot.app (not on PATH) and the 4.7.2 export templates. Both are installed and verified; see docs/research/engine-choice.md.

Why Godot and not Phaser

tiny-turbo is Phaser 4 + TypeScript and stays that way. The sequel needs real 3D — elevation, ramps, loops, a chase camera over a tabletop — which Phaser cannot do without writing a renderer. Godot exports a single-page WebGL2 build with no server requirements, and GDScript is the only option because Godot 4 cannot export C# projects to the web.

Documentation

Doc Contents
CONTRIBUTING.md run/verify/ship, the gate, the traps (read before any shader or export change)
GLOSSARY.md the domain words: table, corridor, break, bulb, archetype, trace, pose
docs/research/micromachines-v3.md the V3 research with sources, and the deltas we take
docs/research/engine-choice.md Godot 4.7.2 and the web/Compatibility constraints
docs/design/gameplay-spec.md physics, archetypes, weapons, Screen Break, cups, tables
docs/design/visual-spec.md palette, materials, lighting, camera, HUD, quality tiers
docs/plan/roadmap.md M0–M6, each with the proof it must produce
docs/plan/subagent-playbook.md how the work is split across subagents and verified
docs/implementation/ per-milestone implementation notes
docs/implementation/m0-foundation.md M0: the gate (measured cold/warm timings), toolchain, web build, traps, Compatibility feature limits, and what is NOT verified
docs/implementation/m1.5-look.md M1.5: the surface split, the kerbs, the sky and the room — with the four acceptance renders read honestly, and what is still wrong
docs/implementation/m1.5b-pass.md M1.5b: the deck gets a body, the car wins on chroma, the cream paints stop clipping — with the measurements, including the two fixes that were tried and did not work
docs/implementation/m2-hud-fixes.md M2 review fixes: the position readout's contrast (measured), the minimap's real spline, and the break-cut's flash and banner punch — with the stills read honestly

Credits

  • Design reference: Micro Machines V3 (Codemasters/Psygnosis, 1997). No assets are taken from it; research and mechanic inspiration only, documented in docs/research/.
  • Characters and the tabletop premise carry over from tiny-turbo.
  • Image assets are committed with the recipe, prompt and seed that produced them (assets/manifest.md). The shipped surface family — the gingham ribbon, felt, turf, wood, water, stone — is procedural, generated by scripts/tools/make_surfaces.py and seam-gated; Qwen-Image-2.1 (mflux/MLX) is the tool for art with composition (key art, portraits), which is M4's work.