CI / quality (push) Failing after 1m9s
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
70 lines
2.5 KiB
Luau
70 lines
2.5 KiB
Luau
-- Rebuild with the smoothing pass, then re-measure the SAME metrics as before
|
|
-- so the before/after is directly comparable. Target: east total heading change
|
|
-- down from 216deg toward the west's ~56deg, and ZERO segments turning >5deg
|
|
-- (the 58.2/50.1deg hinges must be gone). Also verify the parallel run and
|
|
-- the endpoints did not move -- smoothing must not detach the mouth.
|
|
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 module NOT FOUND" end
|
|
|
|
local ok, MB = pcall(require, mod)
|
|
if not ok then return "require failed: " .. tostring(MB) end
|
|
|
|
local t0 = os.clock()
|
|
local ok2, err = pcall(function() MB.build() end)
|
|
if not ok2 then return "build ERROR: " .. tostring(err) end
|
|
say(("build OK (%.2fs)"):format(os.clock() - t0))
|
|
|
|
local map = workspace:FindFirstChild("Map")
|
|
if not map then return "Map missing after build" end
|
|
|
|
local parts = 0
|
|
for _, d in ipairs(map:GetDescendants()) do
|
|
if d:IsA("BasePart") then parts += 1 end
|
|
end
|
|
say(("parts=%d"):format(parts))
|
|
|
|
for _, s in ipairs({ "PAWestSlip", "PAEastSlip" }) do
|
|
local segs = {}
|
|
for _, d in ipairs(map:GetDescendants()) do
|
|
if d:IsA("BasePart") then
|
|
local k = d.Name:match("^" .. s .. "_Deck_(%d+)$")
|
|
if k then table.insert(segs, { i = tonumber(k), p = d.Position, cf = d.CFrame }) end
|
|
end
|
|
end
|
|
table.sort(segs, function(a, b) return a.i < b.i end)
|
|
if #segs == 0 then say(s .. ": ABSENT") continue end
|
|
|
|
local total, worst, worstAt, over = 0, 0, -1, 0
|
|
for j = 2, #segs do
|
|
local a, b = segs[j - 1].cf.LookVector, segs[j].cf.LookVector
|
|
local d = math.deg(math.acos(math.clamp(a:Dot(b), -1, 1)))
|
|
total += d
|
|
if d > worst then worst = d; worstAt = segs[j].i end
|
|
if d > 5 then over += 1 end
|
|
end
|
|
|
|
local topY, level = segs[1].p.Y, 0
|
|
for _, sg in ipairs(segs) do
|
|
if math.abs(sg.p.Y - topY) < 0.5 then level += 1 else break end
|
|
end
|
|
|
|
local lmin, lmax = math.huge, -math.huge
|
|
for j = 2, #segs do
|
|
local L = (segs[j].p - segs[j - 1].p).Magnitude
|
|
lmin = math.min(lmin, L); lmax = math.max(lmax, L)
|
|
end
|
|
|
|
say(("%s: segs=%d total=%.1fdeg mean=%.2f worst=%.1f@%d over5=%d"):format(
|
|
s, #segs, total, total / (#segs - 1), worst, worstAt, over))
|
|
say((" level-run=%d startY=%.1f endY=%.1f spacing=%.1f..%.1f"):format(
|
|
level, segs[1].p.Y, segs[#segs].p.Y, lmin, lmax))
|
|
say((" start=(%.0f,%.0f,%.0f) end=(%.0f,%.0f,%.0f)"):format(
|
|
segs[1].p.X, segs[1].p.Y, segs[1].p.Z, segs[#segs].p.X, segs[#segs].p.Y, segs[#segs].p.Z))
|
|
end
|
|
|
|
return table.concat(out, "\n")
|