Files
tokyo-wangan-racing/docs/ROADMAP.md
T
jesse 2ae3bf8bdb
CI / quality (push) Successful in 56s
M1/M2: engine + tyre audio, night-city ambience
SoundController (client):
- Looping engine sound on the car body: pitch 0.7->1.9 tracks speed
  (curved so low speed feels torquey), volume swells with throttle
- Tyre squeal loop faded by lateral slip (velocity along body RightVector)
  and hard braking from speed; always playing at 0 volume to avoid pops
- 3D sounds with rolloff so other players hear cars pass
- Asset IDs from safe sources (Roblox Resources engine loop,
  ProSoundEffects squeal); swap in SOUNDS table after audition

Ambience (server):
- Atmosphere (purple-grey haze, glare) so neon reads in the air
- BloomEffect for neon pop + subtle cool ColorCorrection
- Slow ClockTime ping-pong 22:00->03:00 over 10 min: always night,
  but the sky breathes
2026-07-22 01:52:30 -04:00

74 lines
3.9 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)
- [x] Adopt a **constraint chassis** for real suspension/grip instead of the raw
VehicleSeat: springs + prismatic suspension, servo steering (speed-sensitive
lock), motor-driven wheels, engine braking, ballast anti-roll. Shared tuning
in `src/shared/Chassis.luau`; client-side `ChassisController` drives it
(driver owns network physics). **Needs a Studio playtest to tune feel.**
- [ ] Import the **real RX-7 mesh**; weld the shell onto the chassis `Body`.
See `docs/MESH_SWAP.md` for the exact steps (needs Studio for asset upload).
- [ ] Tune acceleration curve and grip (after first playtest).
- [x] **Chase camera**: scriptable follow cam while seated — damped chase with
look-ahead, flat horizon (ignores car pitch/roll), speed-based FOV kick.
`src/client/CameraController.luau`. Tune constants after playtest.
- [x] Sound: engine loop (pitch tracks speed, volume swells with throttle) +
tyre squeal on lateral slip / hard braking. `src/client/SoundController.luau`.
Asset IDs are placeholders from safe sources (Roblox Resources engine loop,
ProSoundEffects squeal) — audition in Studio and swap in the SOUNDS table
if they don't fit. Boost sound deferred until boost exists.
**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.
- [x] Better map v2: 3200-stud expressway with gantry arches, a neon-lit
tunnel, jump ramps (right lane; left stays flat), end wall, and a
procedural neon skyline flanking the route.
- [x] Day/night, weather mood: `src/server/Ambience.luau` — Atmosphere haze
catching the neon, bloom + cool color-correction post effects, and a slow
22:00→03:00 clock drift (10-min ping-pong) so the night sky breathes.
## 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).