Files
tokyo-wangan-racing/tools/probe_fix2.luau
T
jesse 6e50f9718d
CI / quality (push) Failing after 1m9s
Aux-lane suppression + PA geometry fixes; probe/verify tooling
MapBuilder.luau
  - Suppress the aux lane across samples 525-550 (AUX_SUPPRESS_FROM/TO),
    honoring the user's hand deletion in Studio so a rebuild no longer
    regenerates it.
  - Smoothstep the width ramp over AUX_BLEND=5 samples on each side. A hard
    cut produced a 26-stud lateral fence jog; the blend removes it.
  - DO NOT remove this suppression. Re-enabling it resurrects geometry the
    user deleted by hand.

rokit.toml
  - rojo 7.5.1 -> 7.7.0 to match the auto-updating Studio plugin.
    Server older than plugin fails the handshake with
    "attempt to index number with 'protocolVersion'".

tools/
  - 34 read-only probe/verify/capture scripts used to measure the datamodel
    instead of reasoning from source.

Verified-good baseline at this commit:
  total parts       16788
  PAWestSlip        60 segs, 34.4 deg total bend, worst 1.4, 0 kinks >5
  PAEastSlip        60 segs, 30.7 deg total bend, worst 1.3, 0 kinks >5
  AuxLane parts     30 (samples 525-550 deliberately absent)
  barrier coverage  823 samples, 0 unguarded
  fence jogs >10st  0
2026-08-06 08:27:47 -04:00

136 lines
4.5 KiB
Luau

-- Rebuild with AUX_SUPPRESS widened to 525..550, then verify BOTH marked
-- defects are gone:
-- (A) left oval -> zero samples with no left barrier
-- (B) right circle -> no 26-stud lateral snap at the suppression boundary
-- The 6.3-stud steps at 512/513/563 are the aux lane's own smooth taper
-- (width 26 -> 19 -> 13 -> 7 -> 0) and are CORRECT; the parapet rides the
-- taper. Only steps much larger than that are real juts.
local SS = game:GetService("ServerScriptService")
local out = {}
local function say(s) table.insert(out, s) end
local mod = SS:FindFirstChild("MapBuilder", true)
if not mod then return "MapBuilder NOT FOUND" end
local fresh = mod:Clone()
fresh.Name = "MB_fresh_" .. tostring(math.random(1e6))
fresh.Parent = SS
local ok, MB = pcall(require, fresh)
if not ok then fresh:Destroy() return "require FAILED: " .. tostring(MB) end
local ok2, err = pcall(function() MB.build() end)
fresh:Destroy()
if not ok2 then return "build ERROR: " .. tostring(err) end
say("build OK")
local map = workspace:FindFirstChild("Map")
local parts = 0
for _, d in ipairs(map:GetDescendants()) do
if d:IsA("BasePart") then parts += 1 end
end
say(("parts=%d"):format(parts))
local UP = Vector3.new(0, 1, 0)
local deck, aux, bars = {}, {}, {}
for _, d in ipairs(map:GetDescendants()) do
if d:IsA("BasePart") then
local k = d.Name:match("^Road_(%d+)$") or d.Name:match("^Deck_(%d+)$")
if k then deck[tonumber(k)] = d end
local a = d.Name:match("^AuxLane_(%d+)$")
if a then aux[tonumber(a)] = d end
if d.Name == "Barrier" then table.insert(bars, d) end
end
end
say("sample | auxW | left barrier lat | step")
local prevLat, jogs, gaps = nil, {}, {}
for i = 505, 570 do
local d = deck[i]
if d then
local right = d.CFrame.LookVector:Cross(UP).Unit
local c = d.Position
local best, bestLat = math.huge, nil
for _, b in ipairs(bars) do
if math.abs(b.Position.Y - c.Y) < 14 then
local rel = b.Position - c
local along = math.abs(rel:Dot(d.CFrame.LookVector))
local lat = rel:Dot(right)
if along < 22 and lat < 0 and along < best then best = along; bestLat = lat end
end
end
local auxW = aux[i] and aux[i].Size.X or 0
if bestLat then
local step = prevLat and math.abs(math.abs(bestLat) - math.abs(prevLat)) or 0
if step > 10 then table.insert(jogs, ("%d(%.1f)"):format(i, step)) end
if step > 10 or i % 5 == 0 then
say((" %d | aux=%.0f | lat=%.1f | step=%.1f%s"):format(
i, auxW, bestLat, step, step > 10 and " <<< JOG" or ""))
end
prevLat = bestLat
else
table.insert(gaps, i)
say((" %d | aux=%.0f | NO LEFT BARRIER <<< GAP"):format(i, auxW))
prevLat = nil
end
end
end
say(("BIG JOGS (>10): %d %s"):format(#jogs, #jogs > 0 and table.concat(jogs, " ") or "(none)"))
say(("GAPS: %d %s"):format(#gaps, #gaps > 0 and table.concat(gaps, ",") or "(none)"))
-- full-loop unguarded sweep, same rule as before
local function flat(v) return Vector3.new(v.X, 0, v.Z) end
local allBars = {}
for _, d in ipairs(map:GetDescendants()) do
if d:IsA("BasePart") and (d.Name == "Barrier" or d.Name == "EdgeRail") then
table.insert(allBars, d)
end
end
local slipParts = {}
for _, d in ipairs(map:GetDescendants()) do
if d:IsA("BasePart") and d.Name:match("Slip") then table.insert(slipParts, d) end
end
local holes, swept = {}, 0
for i, d in pairs(deck) do
swept += 1
local right = d.CFrame.LookVector:Cross(UP).Unit
for _, sgn in ipairs({ -1, 1 }) do
local edge = d.Position + right * sgn * (d.Size.X / 2 + 2)
local bd = math.huge
for _, b in ipairs(allBars) do
if math.abs(b.Position.Y - edge.Y) < 14 then
local dd = (flat(b.Position) - flat(edge)).Magnitude
if dd < bd then bd = dd end
end
end
if bd >= 12 then
local ok2b = false
local a = aux[i]
if a then
local outer = a.Position + right * sgn * (a.Size.X / 2 + 2)
local bd2 = math.huge
for _, b in ipairs(allBars) do
if math.abs(b.Position.Y - outer.Y) < 14 then
local dd = (flat(b.Position) - flat(outer)).Magnitude
if dd < bd2 then bd2 = dd end
end
end
if bd2 < 14 then ok2b = true end
end
if not ok2b then
local sd = math.huge
for _, p in ipairs(slipParts) do
local dd = (flat(p.Position) - flat(edge)).Magnitude
if dd < sd then sd = dd end
end
if sd > 30 then table.insert(holes, i .. (sgn < 0 and "L" or "R")) end
end
end
end
end
say(("FULL SWEEP: %d samples, unguarded=%d %s"):format(swept, #holes,
#holes > 0 and table.concat(holes, ",") or "(none)"))
local auxN = 0
for _ in pairs(aux) do auxN += 1 end
say(("AuxLane total=%d (want 30)"):format(auxN))
return table.concat(out, "\n")