← All projects

Published by KnownBetter Studios → This page is the engineering case study.

TRUSS

Simulation prototype

A Godot city-builder prototype with a truss solver, compressed eras, changing codes, decay, maintenance, and deterministic storm outcomes.

GameSimulationC#/.NETGodotStructural Engineering

At a glance

  • Outcome: TRUSS: Time-Resolved Urban Structural Simulator models load-bearing buildings through thirty years of storms, code changes and deferred maintenance. KnownBetter Studios lists an unannounced prototype.
  • Status: Built ten contract-frozen, gated increments across roughly two weeks in August 2026. Close-out and its review remain incomplete, with six decisions open.
  • Role: Solo. Defined product decisions, system boundaries, solver specification, contracts and gate discipline.
  • Stack & libraries: Uses C#/.NET on Godot 4.6, a C# core and GDScript interaction. A Nix flake pins the toolchain; shell scripts gate and export releases.
  • Validation: Verifies 92/92 regression suites from a clean tree, not their report. Release export and exported-build smoke tests also pass.
  • Limitations: Not playable. The hidden district view leaves campaign text over one truss; code remains StructuralCity until the rename.

Structural simulation

Models an approved braced ground-floor street bay. A tenant requests a clear storefront, so the contractor removes its brace and covers inactive connections. One inspector workday and limited repair budget precede the storm, testing design, compromise, hidden as-built state, discovery, repair and wind.

Computes member load paths and safety factors, not rolled outcomes. The limited solver handles tension/compression, drops failures and excludes bending/connections/dynamics. It cannot replace professional structural analysis.

Models changing codes, grandfathered buildings, material decay, owner funds, a city ledger and demolition costs. Maintenance bills can be refused; refusals are recorded.

Domain model

Projects separately save approved plans, physical structures and player knowledge; only physical state reaches the solver, and plan views cannot expose hidden facts.

Ranks every member fact by source: measurements outrank observations, then approved drawings because records can be wrong. Stronger evidence only upgrades weaker evidence, making belief order-independent.

Maps thirty narrative years onto short simulation blocks. The half-minute campaign compares maintained and neglected parcels under identical owners, weather and one storm.

Hashes fingerprinted state so fixtures catch changed historical results. Unknown materials, invalid observations and empty records refuse instead of guessing. A demolition flag outside the lifecycle lets demolished parcels resolve condemnation locks without corrupting lifecycle order.

Measures tick, save and solver budgets. Optimization made a quadratic retrofit loop incremental and indexed a full-stream save scan. Scouting identified orchestration, event streams and save loading as constraints, not the solver.

Presentation limits

All four mayor scenarios hide the district view beneath text decks. Thirty years of decay, neglect, demolition and rebuilding appear over the first increment’s single truss. The existing view renders parcels, water mains and residents; the final four district, code, economy and maintenance increments hide it. One building’s physics works end to end, but presentation remains unfinished.

Name and rename

Uses a STAAD / ETABS / RISA / NASTRAN-style backronym: time-resolved for the compressed era calendar, urban for parcels, residents and water network, structural for the member solver, and simulator for deterministic gated simulation. Each visit draws a title-screen term of art: Critical Load, Design Storm, As-Built, Factor of Safety or Service Life.

Recorded the name before renaming. The old identifier spans hundreds of files, so its measured file-by-file substitution will land in one post-close-out commit without obscuring the review range.