Загрузка данных


-- ═══════════════════════════════════════════════════════════
-- ЛАБОРАТОРИЯ ЧП v3 — УЛЬТРА ДЕТАЛЬНАЯ ВЕРСИЯ
-- Ретро R6 стиль, максимальная атмосфера
-- ═══════════════════════════════════════════════════════════

local C = {
    -- Основные
    asphalt = Color3.fromRGB(90, 90, 95),
    asphalt_dark = Color3.fromRGB(70, 70, 75),
    grass = Color3.fromRGB(65, 130, 65),
    grass_dark = Color3.fromRGB(50, 100, 50),
    dirt = Color3.fromRGB(120, 100, 80),
    
    -- Стены
    wall_white = Color3.fromRGB(230, 230, 235),
    wall_dirty = Color3.fromRGB(200, 200, 190),
    wall_grey = Color3.fromRGB(130, 130, 130),
    wall_concrete = Color3.fromRGB(160, 160, 160),
    
    -- Крыши
    roof_flat = Color3.fromRGB(45, 45, 50),
    roof_metal = Color3.fromRGB(60, 60, 70),
    
    -- Детали
    door_metal = Color3.fromRGB(80, 60, 50),
    door_rust = Color3.fromRGB(100, 70, 50),
    window_glass = Color3.fromRGB(170, 220, 255),
    window_broken = Color3.fromRGB(100, 150, 180),
    
    -- Забор
    fence_post = Color3.fromRGB(70, 70, 70),
    fence_chain = Color3.fromRGB(90, 90, 90),
    fence_rust = Color3.fromRGB(110, 80, 60),
    
    -- Декор
    crate_wood = Color3.fromRGB(140, 90, 60),
    crate_metal = Color3.fromRGB(100, 100, 110),
    barrel_oil = Color3.fromRGB(50, 50, 55),
    barrel_fire = Color3.fromRGB(80, 50, 40),
    barrel_toxic = Color3.fromRGB(60, 100, 50),
    
    -- Знаки
    sign_warning = Color3.fromRGB(220, 180, 30),
    sign_danger = Color3.fromRGB(200, 50, 50),
    sign_bio = Color3.fromRGB(200, 50, 150),
    
    -- Свет
    light_yellow = Color3.fromRGB(255, 240, 180),
    light_red = Color3.fromRGB(255, 80, 80),
    light_emergency = Color3.fromRGB(255, 100, 50),
    
    -- Паразит
    parasite_black = Color3.fromRGB(10, 10, 10),
    parasite_glow = Color3.fromRGB(255, 0, 50),
    
    -- Прочее
    blood = Color3.fromRGB(140, 30, 30),
    ash = Color3.fromRGB(80, 80, 80),
    paper = Color3.fromRGB(240, 240, 230)
}

-- Утилиты
function part(name, size, pos, color, parent, transparency, material)
    local p = Instance.new("Part")
    p.Name = name
    p.Size = size
    p.CFrame = CFrame.new(pos)
    p.Color = color
    p.Material = material or Enum.Material.Plastic
    p.Anchored = true
    p.TopSurface = Enum.SurfaceType.Studs
    p.BottomSurface = Enum.SurfaceType.Inlet
    p.Transparency = transparency or 0
    p.Parent = parent
    return p
end

function wall(name, size, pos, color, parent)
    local w = part(name, size, pos, color, parent)
    w.TopSurface = Enum.SurfaceType.Smooth
    w.BottomSurface = Enum.SurfaceType.Smooth
    return w
end

function smooth(name, size, pos, color, parent)
    local s = part(name, size, pos, color, parent)
    s.TopSurface = Enum.SurfaceType.Smooth
    s.BottomSurface = Enum.SurfaceType.Smooth
    s.LeftSurface = Enum.SurfaceType.Smooth
    s.RightSurface = Enum.SurfaceType.Smooth
    return s
end

-- ОЧИСТКА
for _, name in pairs({"Map", "NPCs", "Spawns", "GameLogic", "Atmosphere", "Effects"}) do
    local old = workspace:FindFirstChild(name)
    if old then old:Destroy() end
end

-- ПАПКИ
local map = Instance.new("Folder")
map.Name = "Map"
map.Parent = workspace

local npcs = Instance.new("Folder")
npcs.Name = "NPCs"
npcs.Parent = workspace

local spawns = Instance.new("Folder")
spawns.Name = "Spawns"
npcs.Parent = workspace

local gameLogic = Instance.new("Folder")
gameLogic.Name = "GameLogic"
gameLogic.Parent = workspace

local effects = Instance.new("Folder")
effects.Name = "Effects"
effects.Parent = workspace

-- ═══════════════════════════════════════════════════════════
-- ЧАСТЬ 1: ОКРУЖЕНИЕ (НЕБО, ТУМАН, ОСВЕЩЕНИЕ)
-- ═══════════════════════════════════════════════════════════

-- Небо (тёмное, сумерки)
local lighting = game:GetService("Lighting")
lighting.Brightness = 0.4
lighting.ClockTime = 20
lighting.GeographicLatitude = 41.733
lighting.Ambient = Color3.fromRGB(60, 60, 80)
lighting.OutdoorAmbient = Color3.fromRGB(40, 50, 70)
lighting.FogColor = Color3.fromRGB(80, 90, 110)
lighting.FogStart = 50
lighting.FogEnd = 250

-- Atmosphere (туман)
local atmosphere = Instance.new("Atmosphere")
atmosphere.Density = 0.4
atmosphere.Offset = 0.25
atmosphere.Color = Color3.fromRGB(120, 130, 150)
atmosphere.Decay = Color3.fromRGB(80, 90, 110)
atmosphere.Glare = 0.3
atmosphere.Haze = 0.5
atmosphere.Parent = lighting

-- Sky (облака)
local sky = Instance.new("Sky")
sky.SkyboxBk = "rbxassetid://64133133"
sky.SkyboxDn = "rbxassetid://64133133"
sky.SkyboxFt = "rbxassetid://64133133"
sky.SkyboxLf = "rbxassetid://64133133"
sky.SkyboxRt = "rbxassetid://64133133"
sky.SkyboxUp = "rbxassetid://64133133"
sky.Parent = lighting

-- ═══════════════════════════════════════════════════════════
-- ЧАСТЬ 2: ЗЕМЛЯ (МНОГОУРОВНЕВАЯ)
-- ═══════════════════════════════════════════════════════════

-- Основной асфальт (неровный)
part("GroundMain", Vector3.new(300, 2, 300), Vector3.new(0, -1, 0), C.asphalt, map)

-- Трещины в асфальте
for i = 1, 15 do
    local x = math.random(-140, 140)
    local z = math.random(-140, 140)
    local len = math.random(10, 30)
    part("Crack"..i, Vector3.new(len, 0.1, math.random(1, 3)), Vector3.new(x, 0.05, z), C.asphalt_dark, map)
end

-- Лужи (масло, кровь)
for i = 1, 8 do
    local x = math.random(-120, 120)
    local z = math.random(-120, 120)
    local puddle = part("Puddle"..i, Vector3.new(math.random(5, 15), 0.1, math.random(5, 15)), Vector3.new(x, 0.06, z), C.blood, map, 0.3)
    puddle.Material = Enum.Material.Glass
end

-- Трава (разная высота)
local grassN = part("GrassNorth", Vector3.new(300, 3, 40), Vector3.new(0, -1.5, -170), C.grass, map)
grassN.TopSurface = Enum.SurfaceType.Studs
local grassS = part("GrassSouth", Vector3.new(300, 3, 40), Vector3.new(0, -1.5, 170), C.grass, map)
grassS.TopSurface = Enum.SurfaceType.Studs
local grassE = part("GrassEast", Vector3.new(40, 3, 220), Vector3.new(170, -1.5, 0), C.grass, map)
grassE.TopSurface = Enum.SurfaceType.Studs
local grassW = part("GrassWest", Vector3.new(40, 3, 220), Vector3.new(-170, -1.5, 0), C.grass, map)
grassW.TopSurface = Enum.SurfaceType.Studs

-- Грязь между асфальтом и травой
part("DirtNorth", Vector3.new(300, 1, 5), Vector3.new(0, 0.5, -150), C.dirt, map)
part("DirtSouth", Vector3.new(300, 1, 5), Vector3.new(0, 0.5, 150), C.dirt, map)
part("DirtEast", Vector3.new(5, 1, 220), Vector3.new(150, 0.5, 0), C.dirt, map)
part("DirtWest", Vector3.new(5, 1, 220), Vector3.new(-150, 0.5, 0), C.dirt, map)

-- ═══════════════════════════════════════════════════════════
-- ЧАСТЬ 3: ЗАБОР (МЕТАЛЛИЧЕСКИЙ, РАЗРУШЕННЫЙ)
-- ═══════════════════════════════════════════════════════════

function createFenceSection(x, z, isHorizontal)
    local rot = isHorizontal and CFrame.Angles(0, 0, 0) or CFrame.Angles(0, math.pi/2, 0)
    
    -- Столб (толстый)
    local post = wall("FencePost", Vector3.new(2, 10, 2), Vector3.new(x, 5, z), C.fence_post, map)
    
    -- Если не разрушено
    if math.random() > 0.12 then
        -- Верхняя перемычка
        local rail1 = wall("RailTop", Vector3.new(isHorizontal and 10 or 1, 1, isHorizontal and 1 or 10), 
            Vector3.new(x + (isHorizontal and 5 or 0), 9, z + (isHorizontal and 0 or 5)), C.fence_chain, map)
        rail1.Transparency = 0.3
        
        -- Нижняя перемычка
        local rail2 = wall("RailBottom", Vector3.new(isHorizontal and 10 or 1, 1, isHorizontal and 1 or 10),
            Vector3.new(x + (isHorizontal and 5 or 0), 3, z + (isHorizontal and 0 or 5)), C.fence_chain, map)
        rail2.Transparency = 0.3
        
        -- Колючая проволока (сверху)
        for i = 1, 3 do
            local wire = part("Wire", Vector3.new(0.3, 2, 0.3), 
                Vector3.new(x + (isHorizontal and math.random(-4, 4) or 0), 10, z + (isHorizontal and 0 or math.random(-4, 4))), 
                C.fence_rust, map)
        end
    else
        -- Разрушенный участок — обломки
        for i = 1, 3 do
            local debris = part("Debris", Vector3.new(math.random(2, 4), math.random(1, 3), math.random(2, 4)),
                Vector3.new(x + math.random(-3, 3), 1, z + math.random(-3, 3)), C.fence_post, map)
            debris.Rotation = Vector3.new(math.random(-30, 30), math.random(-30, 30), math.random(-30, 30))
        end
    end
end

-- Север и Юг
for x = -150, 150, 10 do
    createFenceSection(x, -150, true)
    createFenceSection(x, 150, true)
end

-- Восток и Запад
for z = -150, 150, 10 do
    createFenceSection(-150, z, false)
    createFenceSection(150, z, false)
end

-- ═══════════════════════════════════════════════════════════
-- ЧАСТЬ 4: РЕСЕПШН (ГЛАВНОЕ ЗДАНИЕ, МАССИВНОЕ)
-- ═══════════════════════════════════════════════════════════

local rx, rz = -80, -80
local reception = Instance.new("Folder")
reception.Name = "Reception"
reception.Parent = map

-- Фундамент (поднят)
part("Foundation", Vector3.new(60, 3, 60), Vector3.new(rx, -1.5, rz), C.wall_concrete, reception)

-- Пол внутри
part("Floor", Vector3.new(56, 1, 56), Vector3.new(rx, 0.5, rz), C.wall_dirty, reception)

-- Стены (высота 30, толщина 2)
wall("WallBack", Vector3.new(60, 30, 2), Vector3.new(rx, 15, rz - 30), C.wall_white, reception)
wall("WallLeft", Vector3.new(2, 30, 60), Vector3.new(rx - 30, 15, rz), C.wall_white, reception)
wall("WallRight", Vector3.new(2, 30, 60), Vector3.new(rx + 30, 15, rz), C.wall_white, reception)

-- Передняя стена с ГЛАВНЫМ ВХОДОМ
wall("WallFrontLeft", Vector3.new(20, 30, 2), Vector3.new(rx - 20, 15, rz + 30), C.wall_white, reception)
wall("WallFrontRight", Vector3.new(20, 30, 2), Vector3.new(rx + 20, 15, rz + 30), C.wall_white, reception)

-- Над дверью (вывеска)
part("SignBoard", Vector3.new(24, 6, 1), Vector3.new(rx, 27, rz + 30.5), C.sign_warning, reception)
part("SignText", Vector3.new(20, 4, 0.5), Vector3.new(rx, 27, rz + 31), C.wall_white, reception)

-- Двойные двери (металлические, массивные)
local doorL = part("DoorLeft", Vector3.new(8, 20, 2), Vector3.new(rx - 4.5, 10, rz + 30.5), C.door_metal, reception)
doorL.TopSurface = Enum.SurfaceType.Smooth
local doorR = part("DoorRight", Vector3.new(8, 20, 2), Vector3.new(rx + 4.5, 10, rz + 30.5), C.door_metal, reception)
doorR.TopSurface = Enum.SurfaceType.Smooth

-- Рамка двери
wall("DoorFrameTop", Vector3.new(22, 2, 3), Vector3.new(rx, 21, rz + 30.5), C.fence_post, reception)
wall("DoorFrameLeft", Vector3.new(2, 20, 3), Vector3.new(rx - 11, 10, rz + 30.5), C.fence_post, reception)
wall("DoorFrameRight", Vector3.new(2, 20, 3), Vector3.new(rx + 11, 10, rz + 30.5), C.fence_post, reception)

-- Крыша (плоская, с парапетом)
part("RoofMain", Vector3.new(64, 2, 64), Vector3.new(rx, 31, rz), C.roof_flat, reception)
part("RoofParapet", Vector3.new(66, 3, 66), Vector3.new(rx, 33, rz), C.wall_concrete, reception)

-- Вентиляция на крыше
for i = 1, 3 do
    local vent = part("Vent"..i, Vector3.new(4, 6, 4), 
        Vector3.new(rx + math.random(-20, 20), 36, rz + math.random(-20, 20)), C.roof_metal, reception)
    vent.TopSurface = Enum.SurfaceType.Smooth
end

-- Окна (большие, 3 этажа)
for floor = 1, 3 do
    local y = floor * 8
    -- Лево
    part("WindowL"..floor, Vector3.new(1, 6, 12), Vector3.new(rx - 30.5, y, rz - 10 + (floor-1)*5), C.window_glass, reception, 0.4)
    -- Право
    part("WindowR"..floor, Vector3.new(1, 6, 12), Vector3.new(rx + 30.5, y, rz + 10 - (floor-1)*5), C.window_glass, reception, 0.4)
    -- Зад
    part("WindowB"..floor, Vector3.new(12, 6, 1), Vector3.new(rx - 10 + (floor-1)*5, y, rz - 30.5), C.window_glass, reception, 0.4)
end

-- Разбитое окно
part("WindowBroken", Vector3.new(1, 6, 8), Vector3.new(rx - 30.5, 8, rz + 15), C.window_broken, reception, 0.6)

-- Внутри: стойка ресепшна
part("DeskMain", Vector3.new(18, 3, 8), Vector3.new(rx, 1.5, rz + 15), C.wall_grey, reception)
part("DeskTop", Vector3.new(20, 1, 10), Vector3.new(rx, 3.5, rz + 15), C.wall_white, reception)
part("DeskBack", Vector3.new(20, 5, 2), Vector3.new(rx, 5.5, rz + 10), C.wall_grey, reception)

-- Компьютер на стойке
part("Monitor", Vector3.new(3, 2, 1), Vector3.new(rx - 5, 5, rz + 14), C.fence_post, reception)
part("MonitorScreen", Vector3.new(2.5, 1.5, 0.1), Vector3.new(rx - 5, 5, rz + 13.4), C.light_yellow, reception, 0.2)

-- Стул
part("Chair", Vector3.new(3, 4, 3), Vector3.new(rx + 8, 2, rz + 15), C.door_metal, reception)

-- Лавочка у входа
part("Bench", Vector3.new(12, 2, 3), Vector3.new(rx - 20, 1, rz + 35), C.door_metal, reception)

-- ═══════════════════════════════════════════════════════════
-- ЧАСТЬ 5: КЛАДОВКА (ЖЁЛТАЯ, МЕТАЛЛИЧЕСКАЯ)
-- ═══════════════════════════════════════════════════════════

local kx, kz = 100, 100
local storage = Instance.new("Folder")
storage.Name = "Storage"
storage.Parent = map

-- Фундамент
part("Foundation", Vector3.new(40, 2, 40), Vector3.new(kx, -1, kz), C.wall_concrete, storage)

-- Стены (металл, 20 высота)
wall("WallBack", Vector3.new(40, 20, 2), Vector3.new(kx, 10, kz - 20), C.wall_grey, storage)
wall("WallLeft", Vector3.new(2, 20, 40), Vector3.new(kx - 20, 10, kz), C.wall_grey, storage)
wall("WallRight", Vector3.new(2, 20, 40), Vector3.new(kx + 20, 10, kz), C.wall_grey, storage)

-- Дверь (гаражная, массивная)
wall("DoorFrameTop", Vector3.new(16, 2, 2), Vector3.new(kx, 19, kz + 20), C.fence_post, storage)
wall("DoorFrameLeft", Vector3.new(2, 16, 2), Vector3.new(kx - 8, 8, kz + 20), C.fence_post, storage)
wall("DoorFrameRight", Vector3.new(2, 16, 2), Vector3.new(kx + 8, 8, kz + 20), C.fence_post, storage)

part("Door", Vector3.new(12, 14, 2), Vector3.new(kx, 7, kz + 20.5), C.door_rust, storage)

-- Крыша (скатная)
part("Roof", Vector3.new(44, 3, 44), Vector3.new(kx, 21.5, kz), C.roof_metal, storage)
part("RoofPeak", Vector3.new(40, 2, 2), Vector3.new(kx, 23, kz), C.roof_metal, storage)

-- Внутри: ящики (много, разные)
for i = 1, 12 do
    local cx = kx + math.random(-15, 15)
    local cz = kz + math.random(-15, 15)
    local size = math.random(3, 6)
    local crate = part("Crate"..i, Vector3.new(size, size, size), Vector3.new(cx, size/2, cz), 
        i % 2 == 0 and C.crate_wood or C.crate_metal, storage)
    crate.Rotation = Vector3.new(0, math.random(-20, 20), 0)
end

-- Полки
for i = 1, 3 do
    local shelf = part("Shelf"..i, Vector3.new(30, 1, 6), 
        Vector3.new(kx, i * 5, kz - 10 + i * 3), C.fence_post, storage)
end

-- ═══════════════════════════════════════════════════════════
-- ЧАСТЬ 6: ВЫШКА ОХРАНЫ (ВЫСОКАЯ, ДЕТАЛЬНАЯ)
-- ═══════════════════════════════════════════════════════════

local vx, vz = 120, -120
local tower = Instance.new("Folder")
tower.Name = "Tower"
tower.Parent = map

-- Бетонное основание (поднято)
part("Base", Vector3.new(20, 4, 20), Vector3.new(vx, -2, vz), C.wall_concrete, tower)

-- Лестница наружная (снизу до платформы)
for i = 1, 20 do
    local y = i * 1.5
    -- Ступень
    part("Step"..i, Vector3.new(4, 0.5, 2), Vector3.new(vx + 12, y, vz), C.fence_post, tower)
    -- Перила
    if i > 1 then
        wall("Rail"..i, Vector3.new(0.5, 1.5, 0.5), Vector3.new(vx + 14, y + 0.75, vz), C.fence_rust, tower)
    end
end

-- Опоры (толстые, 4 штуки)
for _, offset in pairs({{-8, -8}, {8, -8}, {-8, 8}, {8, 8}}) do
    wall("Leg", Vector3.new(4, 35, 4), Vector3.new(vx + offset[1], 17.5, vz + offset[2]), C.fence_post, tower)
end

-- Платформа (с перилами)
part("Platform", Vector3.new(24, 2, 24), Vector3.new(vx, 36, vz), C.fence_post, tower)
wall("RailingN", Vector3.new(24, 4, 1), Vector3.new(vx, 38, vz - 12), C.fence_rust, tower)
wall("RailingS", Vector3.new(24, 4, 1), Vector3.new(vx, 38, vz + 12), C.fence_rust, tower)
wall("RailingW", Vector3.new(1, 4, 24), Vector3.new(vx - 12, 38, vz), C.fence_rust, tower)
wall("RailingE", Vector3.new(1, 4, 24), Vector3.new(vx + 12, 38, vz), C.fence_rust, tower)

-- Кабина (закрытая)
part("Cabin", Vector3.new(20, 8, 20), Vector3.new(vx, 41, vz), C.wall_grey, tower)
part("CabinRoof", Vector3.new(22, 2, 22), Vector3.new(vx, 46, vz), C.roof_metal, tower)

-- Окна кабины
part("CabinWindow", Vector3.new(1, 4, 6), Vector3.new(vx + 10.5, 41, vz), C.window_glass, tower, 0.3)
part("CabinWindow2", Vector3.new(6, 4, 1), Vector3.new(vx, 41, vz + 10.5), C.window_glass, tower, 0.3)

-- Прожектор на крыше
local spotlight = part("Spotlight", Vector3.new(4, 4, 4), Vector3.new(vx, 48, vz), C.light_yellow, tower)
spotlight.Material = Enum.Material.Neon
local spotLight = Instance.new("SpotLight")
spotLight.Brightness = 10
spotLight.Range = 80
spotLight.Angle = 60
spotLight.Color = Color3.fromRGB(255, 255, 200)
spotLight.Parent = spotlight

-- Антенны
for i = 1, 3 do
    local antenna = wall("Antenna"..i, Vector3.new(1, 15, 1), 
        Vector3.new(vx + math.random(-8, 8), 53, vz + math.random(-8, 8)), C.fence_rust, tower)
end

-- ═══════════════════════════════════════════════════════════
-- ЧАСТЬ 7: ДЕКОР УЛИЦЫ (МАКСИМУМ ДЕТАЛЕЙ)
-- ═══════════════════════════════════════════════════════════

-- Бочки (разные типы, 15 штук)
local barrelTypes = {C.barrel_oil, C.barrel_fire, C.barrel_toxic, C.crate_wood}
for i = 1, 15 do
    local bx = math.random(-130, 130)
    local bz = math.random(-130, 130)
    -- Не внутри зданий
    if (math.abs(bx - rx) > 35 or math.abs(bz - rz) > 35) and 
       (math.abs(bx - kx) > 25 or math.abs(bz - kz) > 25) then
        local barrel = part("Barrel"..i, Vector3.new(3, 5, 3), Vector3.new(bx, 2.5, bz), 
            barrelTypes[math.random(1, #barrelTypes)], map)
        barrel.Rotation = Vector3.new(0, math.random(-30, 30), 0)
        
        -- Некоторые лежат
        if math.random() > 0.7 then
            barrel.Rotation = Vector3.new(90, 0, math.random(-30, 30))
            barrel.Position = Vector3.new(bx, 1.5, bz)
        end
    end
end

-- Палатки (4 штуки, с внутренностями)
for i = 1, 4 do
    local tx = math.random(-110, 110)
    local tz = math.random(-110, 110)
    if (math.abs(tx - rx) > 40 or math.abs(tz - rz) > 40) then
        -- Основание
        part("TentBase"..i, Vector3.new(14, 1, 14), Vector3.new(tx, 0.5, tz), C.tent, map)
        -- Крыша
        part("TentRoof"..i, Vector3.new(16, 8, 16), Vector3.new(tx, 4, tz), C.tent, map)
        -- Вход
        part("TentDoor"..i, Vector3.new(4, 6, 1), Vector3.new(tx, 3, tz + 8), C.tent, map, 0.5)
        
        -- Внутри: стол
        part("TentTable"..i, Vector3.new(6, 2, 3), Vector3.new(tx, 1, tz), C.door_metal, map)
        -- Стул
        part("TentChair"..i, Vector3.new(2, 3, 2), Vector3.new(tx + 4, 1.5, tz), C.door_metal, map)
    end
end

-- Знаки (на столбах, 6 штук)
local signPositions = {{-50, -50}, {50, 50}, {-50, 50}, {50, -50}, {0, -80}, {0, 80}}
for i, pos in pairs(signPositions) do
    -- Столб
    wall("SignPole"..i, Vector3.new(1, 10, 1), Vector3.new(pos[1], 5, pos[2]), C.fence_post, map)
    -- Доска
    local signType = i % 3 == 1 and C.sign_warning or (i % 3 == 2 and C.sign_danger or C.sign_bio)
    part("SignBoard"..i, Vector3.new(5, 6, 1), Vector3.new(pos[1], 9, pos[2] + 1), signType, map)
    -- Текстура (полоски)
    part("SignStripes"..i, Vector3.new(4, 5, 0.2), Vector3.new(pos[1], 9, pos[2] + 1.5), C.wall_white, map)
end

-- Разбитая машина (детальная)
local carX, carZ = -70, 70
part("CarBody", Vector3.new(16, 5, 8), Vector3.new(carX, 2.5, carZ), C.wall_grey, map)
part("CarHood", Vector3.new(6, 2, 8), Vector3.new(carX - 10, 1, carZ), C.wall_grey, map)
part("CarTrunk", Vector3.new(5, 3, 8), Vector3.new(carX + 10, 2, carZ), C.wall_grey, map)
-- Колёса
part("Wheel1", Vector3.new(3, 3, 1), Vector3.new(carX - 6, 1.5, carZ - 4), C.fence_post, map)
part("Wheel2", Vector3.new(3, 3, 1), Vector3.new(carX + 6, 1.5, carZ + 4), C.fence_post, map)
part("Wheel3", Vector3.new(2, 2, 1), Vector3.new(carX - 6, 1, carZ + 4), C.fence_post, map) -- спущено
-- Огни
part("CarLightL", Vector3.new(1, 1, 1), Vector3.new(carX - 8, 3, carZ - 3), C.light_red, map, 0.3)
part("CarLightR", Vector3.new(1, 1, 1), Vector3.new(carX - 8, 3, carZ + 3), C.light_yellow, map, 0.3)

-- Мусор (бумаги, обломки)
for i = 1, 20 do
    local mx = math.random(-130, 130)
    local mz = math.random(-130, 130)
    part("Trash"..i, Vector3.new(math.random(1, 3), 0.1, math.random(1, 3)), 
        Vector3.new(mx, 0.1, mz), C.paper, map)
end

-- Кровавые следы
for i = 1, 5 do
    local sx = math.random(-100, 100)
    local sz = math.random(-100, 100)
    part("BloodTrail"..i, Vector3.new(math.random(5, 15), 0.1, math.random(2, 4)), 
        Vector3.new(sx, 0.1, sz), C.blood, map, 0.4)
end

-- ═══════════════════════════════════════════════════════════
-- ЧАСТЬ 8: УЛИЧНЫЕ ФОНАРИ (ВЫСОКИЕ, МНОГО)
-- ═══════════════════════════════════════════════════════════

local lampPositions = {{-100, -100}, {100, 100}, {-100, 100}, {100, -100}, {0, -100}, {0, 100}, {-100, 0}, {100, 0}}
for i, pos in pairs(lampPositions) do
    -- Столб (высокий)
    wall("LampPole"..i, Vector3.new(2, 20, 2), Vector3.new(pos[1], 10, pos[2]), C.fence_post, map)
    -- Кронштейн
    part("LampArm"..i, Vector3.new(4, 1, 1), Vector3.new(pos[1], 20, pos[2] + 2), C.fence_post, map)
    -- Фонарь
    local lamp = part("LampHead"..i, Vector3.new(5, 3, 5), Vector3.new(pos[1], 21, pos[2] + 3), C.light_yellow, map)
    lamp.Material = Enum.Material.Neon
    
    local light = Instance.new("PointLight")
    light.Brightness = 10
    light.Range = 50
    light.Color = Color3.fromRGB(255, 240, 180)
    light.Parent = lamp
    
    -- Мигающий (сломанный) для атмосферы
    if i % 3 == 0 then
        spawn(function()
            while true do
                wait(math.random(0.1, 2))
                lamp.Transparency = lamp.Transparency == 0 and 0.7 or 0
                light.Enabled = not light.Enabled
            end
        end)
    end
end

-- ═══════════════════════════════════════════════════════════
-- ЧАСТЬ 9: СПАВНЫ (ЯРКИЕ, ПО УГЛАМ)
-- ═══════════════════════════════════════════════════════════

local spawnData = {
    {"SpawnAlpha", Vector3.new(-140, 0.5, -140), Color3.fromRGB(75, 151, 75), "КОМАНДА АЛЬФА"},
    {"SpawnBravo", Vector3.new(-140, 0.5, 140), Color3.fromRGB(196, 40, 28), "КОМАНДА БРАВО"},
    {"SpawnCharlie", Vector3.new(140, 0.5, -140), Color3.fromRGB(13, 105, 172), "КОМАНДА ЧАРЛИ"},
    {"SpawnDelta", Vector3.new(140, 0.5, 140), Color3.fromRGB(245, 205, 48), "КОМАНДА ДЕЛЬТА"}
}

for _, s in pairs(spawnData) do
    -- Платформа
    part(s[1].."Base", Vector3.new(12, 1, 12), Vector3.new(s[2].X, -0.5, s[2].Z), C.wall_concrete, map)
    
    -- Спавн
    local sp = Instance.new("SpawnLocation")
    sp.Name = s[1]
    sp.Size = Vector3.new(10, 1, 10)
    sp.CFrame = CFrame.new(s[2])
    sp.Color = s[3]
    sp.Material = Enum.Material.Plastic
    sp.TopSurface = Enum.SurfaceType.Studs
    sp.BottomSurface = Enum.SurfaceType.Inlet
    sp.Parent = spawns
    
    -- Флаг
    wall(s[1].."FlagPole", Vector3.new(1, 15, 1), Vector3.new(s[2].X + 8, 7.5, s[2].Z + 8), C.fence_post, map)
    part(s[1].."Flag", Vector3.new(6, 4, 1), Vector3.new(s[2].X + 11, 13, s[2].Z + 8), s[3], map)
    
    -- Текст (буквы на платформе)
    part(s[1].."Text", Vector3.new(8, 0.5, 2), Vector3.new(s[2].X, 0.6, s[2].Z - 4), C.wall_white, map)
end

-- ═══════════════════════════════════════════════════════════
-- ЧАСТЬ 10: ПАРАЗИТ (С ЭФФЕКТАМИ)
-- ═══════════════════════════════════════════════════════════

local parasite = Instance.new("Part")
parasite.Name = "Parasite"
parasite.Shape = Enum.PartType.Ball
parasite.Size = Vector3.new(3, 3, 3)
parasite.Position = Vector3.new(0, 60, 0)
parasite.Color = C.parasite_black
parasite.Material = Enum.Material.Neon
parasite.Transparency = 0.3
parasite.Anchored = true
parasite.Parent = gameLogic

-- Красное свечение
local pLight = Instance.new("PointLight")
pLight.Color = C.parasite_glow
pLight.Brightness = 10
pLight.Range = 15
pLight.Parent = parasite

-- Частицы (пульсация)
local attachment = Instance.new("Attachment")
attachment.Parent = parasite

local particle = Instance.new("ParticleEmitter")
particle.Texture = "rbxassetid://258128463"
particle.Color = ColorSequence.new(C.parasite_glow)
particle.Size = NumberSequence.new(1, 3)
particle.Transparency = NumberSequence.new(0, 1)
particle.Lifetime = NumberRange.new(0.5, 1)
particle.Rate = 20
particle.Speed = NumberRange.new(2, 5)
particle.Parent = attachment

-- ═══════════════════════════════════════════════════════════
-- ЧАСТЬ 11: ТОЧКИ NPC (МНОГО, РАЗБРОСАНО)
-- ═══════════════════════════════════════════════════════════

local npcZones = {
    {"Reception", -80, -80},
    {"Street1", -60, 0},
    {"Street2", 60, 0},
    {"Street3", 0, -60},
    {"Street4", 0, 60},
    {"Street5", -100, 100},
    {"Street6", 100, -100},
    {"Storage", 100, 100},
    {"Tower", 120, -120},
    {"Fence1", -140, 0},
    {"Fence2", 140, 0},
    {"Center", 0, 0},
    {"Corner1", -100, -100},
    {"Corner2", 100, 100},
    {"Corner3", -100, 100},
    {"Corner4", 100, -100}
}

for _, zone in pairs(npcZones) do
    local f = Instance.new("Folder")
    f.Name = zone[1] .. "_Points"
    f.Parent = npcs
    
    for i = 1, 6 do
        local point = Instance.new("Part")
        point.Name = "Point" .. i
        point.Size = Vector3.new(1, 1, 1)
        point.CFrame = CFrame.new(
            zone[2] + math.random(-30, 30),
            0.5,
            zone[3] + math.random(-30, 30)
        )
        point.Transparency = 1
        point.CanCollide = false
        point.Anchored = true
        point.Parent = f
    end
end

-- ═══════════════════════════════════════════════════════════
-- ЧАСТЬ 12: ДЫМ И АТМОСФЕРА (ЭФФЕКТЫ)
-- ═══════════════════════════════════════════════════════════

-- Дым из вентиляции
for i = 1, 3 do
    local smoke = Instance.new("Part")
    smoke.Name = "Smoke"..i
    smoke.Size = Vector3.new(2, 2, 2)
    smoke.Position = Vector3.new(rx + math.random(-20, 20), 35, rz + math.random(-20, 20))
    smoke.Color = Color3.fromRGB(100, 100, 100)
    smoke.Material = Enum.Material.Smoke
    smoke.Transparency = 0.5
    smoke.Anchored = true
    smoke.Parent = effects
    
    local particle = Instance.new("ParticleEmitter")
    particle.Texture = "rbxassetid://258128463"
    particle.Color = ColorSequence.new(Color3.fromRGB(150, 150, 150))
    particle.Size = NumberSequence.new(3, 8)
    particle.Transparency = NumberSequence.new(0.3, 1)
    particle.Lifetime = NumberRange.new(2, 4)
    particle.Rate = 10
    particle.Speed = NumberRange.new(1, 3)
    particle.VelocitySpread = 30
    particle.Parent = Instance.new("Attachment", smoke)
end

-- Искры от фонаря
local spark = Instance.new("Part")
spark.Size = Vector3.new(1, 1, 1)
spark.Position = Vector3.new(-100, 20, -100)
spark.Transparency = 1
spark.Anchored = true
spark.Parent = effects

local sparkParticle = Instance.new("ParticleEmitter")
sparkParticle.Texture = "rbxassetid://258128463"
sparkParticle.Color = ColorSequence.new(Color3.fromRGB(255, 200, 50))
sparkParticle.Size = NumberSequence.new(0.5, 0)
sparkParticle.Lifetime = NumberRange.new(0.2, 0.5)
sparkParticle.Rate = 5
sparkParticle.Speed = NumberRange.new(5, 10)
sparkParticle.Parent = Instance.new("Attachment", spark)

print("═══════════════════════════════════════")
print("  ЛАБОРАТОРИЯ ЧП v3 — УЛЬТРА ВЕРСИЯ")
print("═══════════════════════════════════════")
print("Размер: 300x300")
print("Высота стен: 30 studs")
print("Зданий: 3 (Ресепшн, Кладовка, Вышка)")
print("Декора: 100+ объектов")
print("NPC зон: 16")
print("Эффекты: дым, искры, мигающие фонари")
print("═══════════════════════════════════════")
print("Сохрани: Ctrl+S")