destroyulator/game/README.md
Monster Robot Party 5852322606 Restructure into monorepo: game/ is the Godot lane
Repo root moves up from game/ to the project folder. Lanes live as top-level
dirs (game/ now, web/ planned); LANES/ will hold parallel-session specs.
3D-STORE asset vault stays out of git. History preserved as renames.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-14 15:33:13 +10:00

50 lines
2.1 KiB
Markdown

# Destroyulator — Cascade Prototype
Mac-first (Apple Silicon / Metal), **Godot 4.7**, **Jolt** physics. Built to prove two
things on the M3 *before* committing: the destruction feels good, and the frame rate holds.
## Run it
**Editor (easiest):** open `/Applications/Godot.app`, import this folder (`game/`), press **F5** / ▶.
**CLI:**
```sh
/Applications/Godot.app/Contents/MacOS/Godot --path /Users/m3ultra/Documents/Destroyulater/game
```
## Controls
| Input | Does |
|---|---|
| **Left-click** | Swing the (nerf) hammer at whatever's under the cursor |
| **S** | Rain **500** rigid bodies — the **Day-0 stress gate**. Watch the FPS counter hold. |
| **R** | Reset the rack |
Top-left HUD shows **FPS · live body count · things smashed**.
## What it's proving — the cascade
The rack is nested the same way your store's DB is (`rack → shelf → crate → jacket → record`):
- **Frame + shelves** start *frozen* (act static, hold everything up).
- Smash a **shelf** → it bursts into shards and vanishes → the **crates** on it fall →
the **cardboard jackets** spill → the **vinyl records** tumble out →
- **records are brittle** (`brittle_speed` in `Smashable.gd`) → they **crack a beat later
when they smack the floor**. A record that lands flat *survives* — there's your comedy/score beat.
No scripted "release" logic — gravity reads the hierarchy. That's the whole point.
## Files
- `scripts/Smashable.gd` — one component for every breakable piece. The `PROFILES` table is
where **material identity** is authored (color · shard count · brittleness · bounce).
Swap `wood/cardboard/vinyl/glass/steel` behaviours here.
- `scripts/Main.gd` — builds the world + rack from primitives, hammer raycast, stress test, HUD.
## Next step: real art (one function)
Everything is grey primitives so it runs with zero import deps. To use your actual assets,
change `_piece()` in `Main.gd` to load a GLB instead of building a BoxMesh, e.g.
`load("res://assets/wooden-rack-type-long.glb").instantiate()` for the visual, keep the
convex collider. Your `3D-STORE/clean_glbs/*.glb` are ready to copy into `game/assets/`.