Aux-lane suppression + PA geometry fixes; probe/verify tooling
CI / quality (push) Failing after 1m9s
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
This commit is contained in:
@@ -0,0 +1,74 @@
|
||||
-- "Changes were reverted" -- WHERE? Distinguish three separate states that can
|
||||
-- each independently be stale:
|
||||
-- (a) the MapBuilder SOURCE inside Studio (Rojo sync state)
|
||||
-- (b) the BUILT geometry sitting in workspace (may predate the source)
|
||||
-- (c) the place file itself
|
||||
local out = {}
|
||||
local function say(s) table.insert(out, s) end
|
||||
|
||||
say("place: " .. tostring(game.Name))
|
||||
|
||||
-- (a) SOURCE state in Studio
|
||||
local SS = game:GetService("ServerScriptService")
|
||||
local mb
|
||||
for _, d in ipairs(SS:GetDescendants()) do
|
||||
if d:IsA("ModuleScript") and d.Name == "MapBuilder" then mb = d end
|
||||
end
|
||||
if not mb then
|
||||
say("SOURCE: MapBuilder NOT FOUND in ServerScriptService")
|
||||
else
|
||||
local ok, src = pcall(function() return mb.Source end)
|
||||
if ok and type(src) == "string" then
|
||||
say(("SOURCE: len=%d PARALLEL_RUN=%s PA_DEC_SPAN=%s PA_SLIP=%s"):format(
|
||||
#src,
|
||||
tostring(src:find("PARALLEL_RUN") ~= nil),
|
||||
tostring(src:find("PA_DEC_SPAN") ~= nil),
|
||||
tostring(src:find("local PA_SLIP") ~= nil)))
|
||||
else
|
||||
say("SOURCE: unreadable " .. tostring(src))
|
||||
end
|
||||
end
|
||||
|
||||
-- (b) BUILT geometry actually in the workspace right now
|
||||
local map = workspace:FindFirstChild("Map")
|
||||
if not map then
|
||||
say("BUILT: workspace.Map MISSING")
|
||||
return table.concat(out, "\n")
|
||||
end
|
||||
|
||||
local slipSegs, auxSegs = {}, 0
|
||||
for _, d in ipairs(map:GetDescendants()) do
|
||||
if d:IsA("BasePart") then
|
||||
for _, s in ipairs({ "PAWestSlip", "PAEastSlip" }) do
|
||||
local k = d.Name:match("^" .. s .. "_Deck_(%d+)$")
|
||||
if k then
|
||||
slipSegs[s] = slipSegs[s] or {}
|
||||
table.insert(slipSegs[s], { i = tonumber(k), p = d.Position })
|
||||
end
|
||||
end
|
||||
if d.Name:match("^AuxLane_%d+$") then auxSegs += 1 end
|
||||
end
|
||||
end
|
||||
|
||||
say("BUILT: aux lane segments = " .. auxSegs .. " (expect ~52 with decel+accel)")
|
||||
|
||||
for _, s in ipairs({ "PAWestSlip", "PAEastSlip" }) do
|
||||
local g = slipSegs[s]
|
||||
if not g or #g == 0 then
|
||||
say(("BUILT: %s -- NO DECK SEGMENTS (ramp absent)"):format(s))
|
||||
else
|
||||
table.sort(g, function(a, b) return a.i < b.i end)
|
||||
-- How many segments hold deck height before the descent starts?
|
||||
local topY = g[1].p.Y
|
||||
local level = 0
|
||||
for _, seg in ipairs(g) do
|
||||
if math.abs(seg.p.Y - topY) < 0.5 then level += 1 else break end
|
||||
end
|
||||
local drop = topY - g[#g].p.Y
|
||||
say(("BUILT: %s segs=%d startY=%.1f endY=%.1f drop=%.1f level-run=%d/%d %s"):format(
|
||||
s, #g, topY, g[#g].p.Y, drop, level, #g,
|
||||
level >= 12 and "<- PARALLEL FIX PRESENT" or "<- OLD DIVING PROFILE"))
|
||||
end
|
||||
end
|
||||
|
||||
return table.concat(out, "\n")
|
||||
Reference in New Issue
Block a user