# Fast & Furious: Tokyo Expressway — 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/`.