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>
50 lines
2.1 KiB
Markdown
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/`.
|