- assets/art/sleeves_{a,b}.jpg: two 3x3 sheets of ORIGINAL fictional album
covers (18 total — dub, techno, metal, jazz, punk, synthwave, hip-hop,
psych, ambient, northern soul, krautrock, disco, white-label, bossa,
UKG, country, noise) generated with Gemini gemini-3-pro-image. No real
artists/albums — copyright-clean destructible content.
- assets/art/keyart.jpg: DESTROYULATOR title key art ("CLOCK OUT. SMASH
EVERYTHING.") for a future title screen.
- Main.gd _skin_record(): records duplicate their M_Sleeve_Front/Back
materials and window one random atlas tile via uv1_scale/uv1_offset —
one texture in VRAM serves nine covers, every record looks different.
- Verified headless: boots clean, "[art] records skinned: 15" (all of
them). The two dummy-renderer "material is null" prints are headless-
only (override materials have no RID in the dummy backend). Eyeball a
sleeve in the editor — if the art renders rotated, flip uv1 here.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
|
||
|---|---|---|
| assets | ||
| scripts | ||
| .gitignore | ||
| main.tscn | ||
| project.godot | ||
| README.md | ||
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:
/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_speedinSmashable.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. ThePROFILEStable is where material identity is authored (color · shard count · brittleness · bounce). Swapwood/cardboard/vinyl/glass/steelbehaviours 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/.