Add three-mode Wangan loop; rename project to Tokyo Wangan Racing
CI / quality (push) Successful in 1m18s

Daikoku Futo PA becomes the hub (Tokyo Xtreme Racer structure): park, pick a
mode, drive out the exit gate to start the run, pull back into the PA to end it.

Modes:
- CRUISE      free roam, banks session + lifetime kilometres
- DUEL        gap-based battle: hold 350 studs for 3s to win
- TIME ATTACK solo flying lap, 4 sector splits, saved personal best

New shared modules:
- Circuit.luau  one source of truth for loop geometry. progressOf(pos) gives
                lap distance, which drives lap detection, sectors and duel gaps
                alike, so the map and gameplay can never drift apart.
- Modes.luau    mode definitions + duel/time-attack tuning constants

Server-authoritative throughout: ModeManager samples the car real position on
Heartbeat and the client never reports distance, lap time or gap. Teleport and
respawn jumps are rejected from distance accumulation.

ProfileTemplate v3 adds DistanceStuds, BestLapTime, BestSectors, DuelsWon and
DuelsLost; ProfileStore Reconcile migrates existing saves.

Rename: repo, wally package, local dir and stale NAS asset paths all move off
the old fnf-sim name. NAS folder was already 0-tokyo-wangan-racing, so those
doc paths were broken before this.
This commit is contained in:
2026-07-30 20:16:04 -04:00
parent 681c3462c6
commit be52290093
14 changed files with 1371 additions and 30 deletions
+17
View File
@@ -360,6 +360,23 @@ local function buildDaikoku(map: Folder)
spawn.Parent = folder
makeSign("大黒PA DAIKOKU PA", CFrame.new(0, 12, z0 + 4) * CFrame.Angles(0, math.pi, 0), folder)
-- Mode gate ---------------------------------------------------------------
-- The exit slip road out of the PA. Crossing this line is what ARMS your
-- chosen mode into a live run (ModeManager watches position, not this part,
-- but the marker tells the player exactly where the commitment happens).
local gate = part({
Name = "ExitGate",
Size = Vector3.new(220, 1, 4),
CFrame = CFrame.new(0, 1.4, z0 + 6),
Color = Color3.fromRGB(255, 200, 60),
Material = Enum.Material.Neon,
Transparency = 0.35,
CanCollide = false,
})
gate.Parent = folder
makeSign("出口 EXIT -> WANGAN", CFrame.new(0, 20, z0 + 30) * CFrame.Angles(0, math.pi, 0), folder)
end
-- Rainbow Bridge towers over the east straight -----------------------------------