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
61 lines
2.7 KiB
Markdown
61 lines
2.7 KiB
Markdown
# Roadmap — realistic solo-dev plan
|
|
|
|
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.
|
|
|
|
> Expect **months, not weeks** to a polished full game. That's normal. This order
|
|
> guarantees you always have something that runs.
|
|
|
|
---
|
|
|
|
## ✅ 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 driving feel GOOD (the real work, do this next)
|
|
- [ ] Import the **real RX-7 mesh**; swap `CarManager.buildCarModel` only.
|
|
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 — 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 — 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 — 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 — 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)
|
|
- [ ] 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 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 (bump `ProfileStoreName` `_vN` in dev to wipe).
|
|
- Test in Studio after every server change (ProfileStore uses a mock store there).
|