One table per component
Each component is authored by one table, kept beside it so every copy keeps its own rows. A world is the components plus their rows.
A game engine built in TouchDesigner
TouchDesigner components that play a game you declare in tables: stages, rules, vehicles, quests, bosses. Grand Theft Banana is the open-world game we built with them. You play Gros Michel, the banana a fungus wiped off the world's plantations in the 1950s, seventy years later and back in Panamá to face it.
The game · BigMike2
Almirante is the hub: talk to the town, wash your boots, pick a job from one of six portals. Each job changes how you move.



The engine · TDXGTB
Grand Theft Banana runs on TDXGTB, a family of TouchDesigner components. Each feature below is one of them, dropped into the world and filled with rows.
Every game needs the same plumbing: a health bar, a timer, a portal that starts a level, a boss that gets angry at half health. TDXGTB has a component for each of those.
Each component owns one job and reads one table. The Director reads stages, Vitals reads things that can be hurt, Fx reads which events should look like what. They talk over an EventBus, in one event grammar. A consequence no component owns is a row in the bus's Rules table before it is a line of code.
This is a stage from our test world, exactly as the Director reads it:
Each component is authored by one table, kept beside it so every copy keeps its own rows. A world is the components plus their rows.
kind, kind:object, kind@subject. vitals.dead@player is "the player died"; vitals.dead:player is "the player killed something". Director, Hud, Fx, Launcher and the Rules all ask the bus.
A rule that names a missing operator or a method that is not public shows up as a red script error on the bus. Runtime state survives a reinit.
Components
Each card is generated from the component's own code: its docstring, its parameter declarations, its public methods and the events it publishes.
Made here
All seventeen glTF models in the game, Gros Michel included, were generated locally with Modly from coloured blockouts we built first. Blender fits each mesh back onto its blockout, decimates it, bakes the colours into a texture and rigs it. The end-to-end test fails if a model from anywhere else ever gets back in.
Everything else is TouchDesigner geometry: the skyline, the sea, the pier, the barge, the jungle. The town is 340 people on a sidewalk graph, 48 cars and 24 reefer trucks, 54 pelicans and nine boats, all instanced.
The sound effects were generated locally too, with Stable Audio, and the trailer's music is our own song.

Try it in the browser
The rows below are the real Rules, Fx Triggers and Hud Lines from our test world. The matching and the rule calls are a line-for-line port of the EventBus; the effects are the Fx component's shader.
Building a world
Each component is a master COMP. A world holds clones of them, so a fix to a master reaches every world, and each clone keeps its own table rows.
Point the components at each other with parameters (Bus, World, Player) and fill their tables: stages, things that can be hurt, items, zones, gates, NPCs, triggers.
A consequence no component owns is a when | do row on the bus: vitals.below@boss:50 → npcs Set boss interval 1.6.
Tests drive the real world from outside TouchDesigner: gates across the physics and the game, run with realtime off so no frame is skipped.