-- 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")