jesse 8808b919c3 Rebuild Daikoku Futo PA from measured real-world data
The PA was a placeholder: 9 painted stripes and 4 lights on a slab.
Rebuilt it against sourced figures rather than recollection.

Sources:
  * OpenStreetMap way 59608205 (大黒ふ頭パーキングエリア) -- the apron is
    181 m x 174 m / 1.6 ha, i.e. essentially SQUARE, not circular.
  * ja.wikipedia 大黒パーキングエリア -- 首都高速で最大のPA, opened
    1989-09-27. Capacity 小型 341 + 大型 59 + 身障者用 4 = 404, now
    reproduced EXACTLY (11 rows x 31, 20/20/19, 1 row x 4).
  * 本館 on the west side, ベイサイドテラス二番館 on the north, per the
    same article. EV rapid charger (first on a Japanese expressway,
    2008-10-10) and the 段差 bumps retrofitted to deter lowered cars.

Stall dimensions (小型 2.5x5.0 m, 大型 3.3x12 m, 6 m aisles) are
conventional JP parking-design values and are commented as NOT
primary-sourced, unlike the 全標協 road markings. Building footprints
are art-directed to the aerial and flagged as such.

tools/verify_daikoku_pa.luau asserts capacity, containment, block
separation and building placement in-engine: 20 passed, 0 failed.

Two bugs found and fixed by that harness:
  * The hand-placed 小型 Z origin overlapped the 大型 bays by 42 studs.
    The origin is now DERIVED from the 二番館 frontage; clearance is
    61.4 studs. The first version of the overlap test compared
    consecutive head lines (always 0 for back-to-back rows), which was
    meaningless and hid this.
  * push_mapbuilder.py lost a byte whenever a chunk began with a
    newline -- Lua long-bracket literals swallow a newline directly
    after the opening bracket (assembled=65158 vs 65159). It now emits
    a deliberate leading newline; the push verifies match=true.
2026-08-01 19:26:48 -04:00

Tokyo Wangan Racing

A Roblox game where you cruise a neon Tokyo expressway at night in cool cars — starting with a real 1993 Mazda RX-7. The driving feel comes first; everything else layers on top of it. See docs/ROADMAP.md for what comes next.

Status: Playable. Spawn → drive → switch cars → respawn, plus the full three-mode Wangan loop. CI green on a self-hosted Gitea runner. Built code-first — nothing to hand-build in Studio.

The Daikoku loop (how you play)

Daikoku Futo PA is the hub, exactly like Tokyo Xtreme Racer. You are never "joining a match" — you park, pick how you want to run, and drive out.

        IN THE PA  ──►  pick a mode  ──►  cross the exit gate  ──►  RUNNING
             ▲                                                        │
             └──────────────── pull back into the PA ─────────────────┘
Mode 日本語 What it is
CRUISE 流し Free roam. Bank kilometres, meet other drivers. Rivals can pull alongside and challenge you.
DUEL バトル Hunt rivals. First to open a ~350-stud gap and hold it for 3s wins. No laps, no checkpoints — who breaks first.
TIME ATTACK タイムアタック Solo flying lap with 4 sector splits and a saved personal best. Rivals can't interrupt you.

Cruise and Duel both allow challenges, so a cruise can turn into a battle organically — pull alongside someone and the prompt appears for both of you. Time Attack deliberately opts out so a hot lap is never ruined.

Kilometres, lap times and duel records all persist via ProfileStore.


Prerequisites

Toolchain is managed by Rokit. With Rokit on your PATH:

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

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)

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-tokyo-wangan-racing/001-1993 Mazda RX-7/.

S
Description
Tokyo Wangan Racing — Roblox street-racing sim. Cruise, duel, or time-attack the Wangan from Daikoku Futo PA. Rojo + Wally + ProfileStore.
Readme
12 MiB
Languages
Luau 92.7%
Python 7.1%
PowerShell 0.2%