Files
tokyo-wangan-racing/README.md
T
Hermes 681c3462c6 Rename: Tokyo Wangan Racing (was Fast & Furious: Tokyo Expressway)
- Title in README + GDD, UI/log prefixes FnF -> Wangan
- Rojo project name -> TokyoWanganRacing
- Fix undefined `H` in CarManager seat CFrame (selene error) -> Chassis.BODY_SIZE.Y
2026-07-30 20:03:52 -04:00

83 lines
2.9 KiB
Markdown

# Tokyo Wangan Racing — MVP (drive-only)
A Roblox game where you cruise a neon Tokyo expressway at night in cool cars —
starting with a real 1993 Mazda RX-7. **This MVP is deliberately tiny: just
driving.** No racing, money, or upgrades yet — the goal is to nail the driving
feel and be testable fast. See `docs/ROADMAP.md` for what comes next.
**Status:** Playable. Spawn → drive → switch cars → respawn. CI green on a
self-hosted Gitea runner. Built code-first — nothing to hand-build in Studio.
---
## Prerequisites
Toolchain is managed by [Rokit](https://github.com/rojo-rbx/rokit). With Rokit on
your `PATH`:
```bash
rokit install # rojo, wally, selene, stylua at pinned versions
wally install # restores ProfileStore into ServerPackages/
```
| Tool | Purpose |
|---|---|
| rojo | Sync/build code ↔ Roblox place |
| wally | Package manager (ProfileStore) |
| selene | Static analysis / linter |
| stylua | Code formatter |
## Build & run
```bash
rojo build --output build.rbxl # standalone place file to open in Studio
# OR live-sync into an open Studio place (install the Rojo Studio plugin):
rojo serve
```
In Studio press **Play**. You spawn on the expressway in your car. Bottom bar:
**CARS** (switch car) and **RESPAWN** (re-spawn if you flip). The RX-7 only
appears for allowlisted accounts.
## Quality gates (CI enforces these on every push)
```bash
stylua --check src/ # formatting
selene src/ # lint
rojo build --output build.rbxl # must compile
```
CI runs on a self-hosted **Gitea Actions** runner on UNRAID-1 (Ubuntu 24.04 job
container — rojo's binary needs glibc 2.39). Workflow: `.gitea/workflows/ci.yml`.
---
## Architecture (server-authoritative)
Clients **request**, the server **decides**. The RX-7 allowlist and anti-cheat
are server-side.
```
ReplicatedStorage/Shared GameConfig, Cars, ProfileTemplate, Remotes
ServerScriptService/Server init.server + managers (below)
ServerScriptService/ServerPackages ProfileStore (Wally)
StarterPlayerScripts/Client init.client (HUD + car picker)
```
| Module | Responsibility |
|---|---|
| `DataManager` | Wraps **ProfileStore** — session locking, reconcile, Studio mock. Remembers your last car. |
| `CarManager` | Spawns the equipped car (VehicleSeat-driven placeholder) and enforces the RX-7 allowlist. |
| `MapBuilder` | Procedurally builds the expressway, spawn pad, neon pylons, kill walls. |
| `AntiCheat` | Movement sanity check (speed/teleport) — a speed bump, not a fortress. |
The RX-7 demo-lock: `GameConfig.RX7AllowedUserIds` holds the owner's + son's
Roblox UserIds; only they can select/drive the RX-7 (enforced in `CarManager` and
the `EquipCar` remote).
## Replacing the placeholder RX-7 with the real mesh
One function changes: `CarManager.buildCarModel`. Full step-by-step in
`docs/MESH_SWAP.md`. Reference photos live on the NAS at
`unraid-1:/mnt/user/data/yy-roblox-games/0-fast-n-furious-sim/001-1993 Mazda RX-7/`.