Shared-tower block stacking for Roblox — the arcade stacker genre rebuilt as pure property-tested laws: trim-to-overlap survival with an exact zero-contact collapse boundary, perfect-snap drops that restore width, streak-chained multipliers, and a monotone capped swing speed.
- A neon block swings over the tower's top; click (or DROP!) to land it.
- Only the overlap with the block below survives — sloppy drops shrink your platform toward oblivion; EXACTLY zero contact topples the tower.
- Land within the perfect threshold to snap dead-center and RESTORE width. Chain perfects: each consecutive one raises the multiplier, capped at x25. One sloppy drop resets streak AND multiplier.
- The swing speeds up every floor (capped so it stays humanly reactable). Topple and the whole server's tower resets after a short victory lap.
- Trim law: survivors are EXACTLY the overlap interval — width is
min(rights) − max(lefts), center is its midpoint (verified inside the below-block across 300 random drops); landing requires STRICTLY positive overlap — edges kissing at exactly zero collapses; widths never go negative. - Perfect law: judgment is boundary-exact at ±PerfectThresholdStuds; snapped centers are EXACT (the below-block's center verbatim); restored width never exceeds the initial width — perfect play keeps the tower at full width forever (50-floor invariant).
- Streak law: consecutive perfects increment by exactly 1 with the
multiplier chaining
1 + streakup to the hard cap of 25; any non-perfect resets BOTH to exactly 0/1; garbage-negative streaks clamp defensively. - Speed law: swing speed grows monotonically per floor, hard-capped at MaxSwingSpeed (verified to 200 floors and at 100000); negative floor counts clamp to base speed.
- Three functions referenced before their locals existed would have hit nil-globals mid-game — caught in review, forward-declared.
- The layer registry initially looked its part back up by name from the
workspace (
FindFirstChild("Layer"..n)) instead of using the placed part returned directly — fragile aliasing removed.
src/shared/ Config + StackMath (trim/perfect/streak/speed laws)
src/server/ Remotes + StackService (server-owned swing position,
authoritative verdicts)
src/client/ Network + stats/feed/DROP button HUD
tests/ lune headless specs (12) incl. 300-drop trim sweep
lune run tests/run_tests.luau # unit tests
lune run tests/syntax_check.luau # compile-check all sources
rojo build -o tower-of-time.rbxlx # validate project mapping
rojo serve # live-sync into StudioCI runs tests, syntax checks, and a Rojo build on every push.
- Shared single tower (co-op style); per-player towers with leaderboards are the roadmap
- No falling-block physics drama beyond unanchoring on collapse
- No Studio playtest yet (human dependency)