Scope cut: drive-only MVP (remove racing + economy)
CI / quality (push) Successful in 1m1s

Per user direction, the MVP is now simply driving cars on the expressway.
- Removed RaceManager and Economy modules entirely
- Slimmed Remotes to DataUpdated / SpawnCar / EquipCar
- ProfileTemplate now just remembers the last driven car (v2)
- Cars: dropped price/rep/upgrade fields; kept identity + driving stats
- CarManager: stat-based tuning only; RX-7 allowlist via GameConfig.canDrive
- DataManager: assign default car on join; downgrade RX-7 if de-allowlisted
- Client: replaced garage/economy UI with a simple car picker + respawn
- Docs: GDD/ROADMAP/README rewritten for drive-only; added docs/MESH_SWAP.md
- Gates: stylua clean, selene 0/0, rojo builds
This commit is contained in:
2026-07-22 00:11:11 -04:00
parent 5fc03d611d
commit 07a67204ca
14 changed files with 347 additions and 781 deletions
+40 -42
View File
@@ -1,62 +1,60 @@
# Roadmap — realistic solo-dev plan
This replaces the original doc's optimistic 12-week timeline. It assumes **one
part-time developer learning as they go**. Ship the vertical slice, then layer
polish. Each milestone is independently playable/testable.
Assumes **one part-time developer learning as they go**. The MVP is intentionally
tiny — *just driving* — so there's a fun, testable thing FAST. Everything else is
layered on only after the driving feels good.
> Rule of thumb: the original guide's "weeks" are really "milestones." Expect
> **4–8 months** of part-time work to a polished, launch-ready MVP. That's normal.
> The goal of this order is that you always have something that *runs*.
> Expect **months, not weeks** to a polished full game. That's normal. This order
> guarantees you always have something that runs.
---
## ✅ M0 — Vertical slice (DONE — this repo)
Drive → race → earn → buy/upgrade → **save**. Server-authoritative. Placeholder
RX-7 block car, procedural expressway. Proves the whole stack end to end.
## ✅ M0 — Drive-only MVP (DONE — this repo)
Spawn on the neon expressway, drive a car, switch cars, respawn. RX-7 demo-locked
to owner + son. Cars persist between sessions. CI green on a self-hosted runner.
## M1 — Make it feel good (the real work)
## M1 — Make driving feel GOOD (the real work, do this next)
- [ ] Import the **real RX-7 mesh**; swap `CarManager.buildCarModel` only.
- [ ] Adopt a proven **constraint chassis** (A-Chassis or modern equivalent) for
real suspension/grip instead of the raw VehicleSeat. Do NOT hand-roll physics.
- [ ] Tune driving feel: acceleration curve, grip, camera.
- [ ] Sound: engine loop, boost, tire screech.
**Exit test:** the RX-7 is genuinely fun to just drive around.
See `docs/MESH_SWAP.md` for the exact steps.
- [ ] Adopt a proven **constraint chassis** (A-Chassis or a modern equivalent)
for real suspension/grip instead of the raw VehicleSeat. Do NOT hand-roll
physics.
- [ ] Tune acceleration curve, grip, and the chase camera.
- [ ] Sound: engine loop, tire screech, boost.
**Exit test:** the RX-7 is genuinely fun to just drive around. Ship nothing else
until this is true.
## M2 — Race depth
- [ ] Checkpoints + lap/segment timing (extend `RaceManager`).
- [ ] Personal best times saved to profile.
- [ ] A second race type (drag / point-to-point).
- [ ] Countdown + results screen.
## M2 — More cars + polish (still no racing)
- [ ] Import a few more real car meshes.
- [ ] Better map: more expressway sections, ramps, tunnels, scenery.
- [ ] Day/night, weather mood.
## M3 — Content & progression polish
- [ ] Flesh out the 25-car catalogue across tiers.
- [ ] Car customization cosmetics (rims, wraps, neon) — visual only for MVP.
- [ ] Daily missions (not just login): "win 3 races", "earn $5k".
- [ ] Tutorial for the first 10 minutes.
## M3 — Racing (the first "game" layer)
- [ ] Checkpoints + timing (a new RaceManager — the old one was removed in M0).
- [ ] Personal best times.
- [ ] Simple point-to-point and drag modes.
## M4 — Systems hardening
- [ ] Leaderboards (OrderedDataStore: top rep, fastest times).
- [ ] Anti-cheat pass 2 (validate race times against car stats).
- [ ] DataStore stress test / backup-version restore drill.
- [ ] Performance pass: StreamingEnabled tuning, part budget, mobile test.
## M4 — Progression & economy (only once racing is fun)
- [ ] Money from races, a garage, buying/unlocking cars, upgrades, reputation.
(These systems existed as scaffolding and were cut for the MVP; reintroduce
them deliberately when they have a purpose.)
## M5 — Monetization (only after it's fun)
- [ ] 2× Cash gamepass (the classic first product).
- [ ] VIP membership (daily bonus, cosmetic-only exclusives).
- [ ] Nitro/boost dev-products — **never** pay-to-win on ranked races.
- [ ] Receipt handling via ProfileStore `LastSavedData`.
## M5 — Systems hardening & monetization
- [ ] Leaderboards, anti-cheat pass 2, DataStore backup drill.
- [ ] Performance pass (StreamingEnabled, part budget, mobile).
- [ ] Fair gamepasses/products — never pay-to-win.
## M6 — Traffic AI (deferred hardest system)
- [ ] Start with **spline-following** dummy cars on fixed paths (cheap, no lag).
Only attempt true pathfinding AI if performance allows.
- [ ] Spawn/despawn by distance to keep part count sane.
- [ ] Spline-following dummy cars first (cheap). True AI only if perf allows.
---
## Standing engineering rules
- Every change must pass `stylua --check`, `selene`, and `rojo build` (CI enforces).
- Keep the client dumb: it requests, the server decides. No exceptions for money.
- Add new tunables to `GameConfig`, not scattered magic numbers.
- Every change must pass `stylua --check`, `selene`, and `rojo build` — CI on the
self-hosted Gitea runner enforces all three on every push.
- Keep the client dumb: it requests, the server decides. The RX-7 allowlist and
anti-cheat live server-side.
- Add tunables to `GameConfig`, not scattered magic numbers.
- Add a save key by adding it to `ProfileTemplate` (auto-reconciles); never remove
a key without a migration.
a key without a migration (bump `ProfileStoreName` `_vN` in dev to wipe).
- Test in Studio after every server change (ProfileStore uses a mock store there).