<roblox version="4">
  <Item class="ServerScriptService" referent="0">
    <Properties>
      <string name="Name">ServerScriptService</string>
    </Properties>
    <Item class="Script" referent="1">
      <Properties>
        <string name="Name">BomberServer</string>
        <token name="RunContext">0</token>
        <string name="Source"><![CDATA[local Players=game:GetService("Players") local RS=game:GetService("ReplicatedStorage") local Tween=game:GetService("TweenService") local Debris=game:GetService("Debris") local Lighting=game:GetService("Lighting")
local world=Instance.new("Folder",workspace) world.Name="BomblineGrid" local rem=Instance.new("Folder",RS) rem.Name="BomberRemotes" local choose=Instance.new("RemoteEvent",rem) choose.Name="ChooseTile" local sync=Instance.new("RemoteEvent",rem) sync.Name="Sync" local note=Instance.new("RemoteEvent",rem) note.Name="Notice"
local function part(n,s,cf,c,m) local p=Instance.new("Part",world) p.Name=n p.Size=s p.CFrame=cf p.Color=c p.Material=m or Enum.Material.SmoothPlastic p.Anchored=true p.TopSurface=Enum.SurfaceType.Smooth p.BottomSurface=Enum.SurfaceType.Smooth return p end
part("Base",Vector3.new(180,5,180),CFrame.new(0,-3,0),Color3.fromRGB(18,23,34),Enum.Material.Slate)
local tiles={} for x=-4,4 do for z=-4,4 do local p=part("Tile",Vector3.new(15,1,15),CFrame.new(x*17,0,z*17),Color3.fromRGB(63,76,94),Enum.Material.Metal) p:SetAttribute("GridX",x) p:SetAttribute("GridZ",z) tiles[x..":"..z]=p end end
local spawn=Instance.new("SpawnLocation",world) spawn.Size=Vector3.new(12,1,12) spawn.CFrame=CFrame.new(0,3,0) spawn.Anchored=true spawn.Neutral=true spawn.Transparency=1
local phase="Waiting" local timeLeft=5 local bomber=nil local marked={} local alive={} local round=0 local scores={}
local function send() sync:FireAllClients({phase=phase,time=timeLeft,bomber=bomber and bomber.Name or "AI DIRECTOR",round=round,scores=scores}) end
local function resetTiles() marked={} for _,t in pairs(tiles) do t.Color=Color3.fromRGB(63,76,94) t.Material=Enum.Material.Metal end end
local function mark(tile) if #marked>=3 or table.find(marked,tile) then return end table.insert(marked,tile) tile.Color=Color3.fromRGB(255,193,70) tile.Material=Enum.Material.Neon end
choose.OnServerEvent:Connect(function(p,x,z) if phase~="Marking" or p~=bomber then return end local t=tiles[tostring(math.floor(x))..":"..tostring(math.floor(z))] if t then mark(t) send() end end)
local function explode(t) t.Color=Color3.fromRGB(239,67,82) local e=part("ExplosionFX",Vector3.new(2,2,2),t.CFrame+Vector3.new(0,3,0),t.Color,Enum.Material.Neon) e.Shape=Enum.PartType.Ball e.CanCollide=false Tween:Create(e,TweenInfo.new(.3),{Size=Vector3.new(22,22,22),Transparency=1}):Play() Debris:AddItem(e,.35) for p in pairs(alive) do local r=p.Character and p.Character:FindFirstChild("HumanoidRootPart") local h=p.Character and p.Character:FindFirstChildOfClass("Humanoid") if r and h and math.abs(r.Position.X-t.Position.X)<8 and math.abs(r.Position.Z-t.Position.Z)<8 then h.Health=0 alive[p]=nil note:FireClient(p,"ELIMINATED") end end end
local function selectBomber(list) if #list>1 then local start=bomber and table.find(list,bomber) or 0 return list[start%#list+1] end return nil end
task.spawn(function() while true do
 local list=Players:GetPlayers() if #list==0 then phase="Waiting" timeLeft=3 send() task.wait(1) continue end
 round+=1 resetTiles() alive={} for _,p in ipairs(list) do alive[p]=true scores[p.Name]=scores[p.Name] or 0 local r=p.Character and p.Character:FindFirstChild("HumanoidRootPart") local h=p.Character and p.Character:FindFirstChildOfClass("Humanoid") if r then r.CFrame=CFrame.new(math.random(-3,3)*17,5,math.random(-3,3)*17) end if h then h.Health=h.MaxHealth end end bomber=selectBomber(list)
 phase="Marking" timeLeft=5 note:FireAllClients(bomber and (bomber.Name.." IS THE BOMBER") or "AI DIRECTOR IS MARKING")
 for i=5,1,-1 do timeLeft=i if not bomber and #marked<3 then local keys={} for k in pairs(tiles) do table.insert(keys,k) end mark(tiles[keys[math.random(1,#keys)]]) end send() task.wait(1) end
 phase="Escape" timeLeft=5 note:FireAllClients("ESCAPE THE MARKED TILES") for i=5,1,-1 do timeLeft=i send() task.wait(1) end
 phase="Blast" timeLeft=1 for _,t in ipairs(marked) do explode(t) end send() task.wait(1)
 local survivors=0 for p in pairs(alive) do if p~=bomber then scores[p.Name]=(scores[p.Name] or 0)+1 survivors+=1 note:FireClient(p,"SURVIVED +1") end end phase="Results" timeLeft=4 note:FireAllClients(survivors.." SURVIVORS") send() task.wait(4)
 end end)
Players.PlayerRemoving:Connect(function(p) alive[p]=nil if bomber==p then bomber=nil end end)
Lighting.ClockTime=21 Lighting.Brightness=2 Lighting.Ambient=Color3.fromRGB(55,62,82)
]]></string>
      </Properties>
    </Item>
    <Item class="Script" referent="2">
      <Properties>
        <string name="Name">PortfolioPolish</string>
        <token name="RunContext">0</token>
        <string name="Source"><![CDATA[local Players = game:GetService("Players")
local Lighting = game:GetService("Lighting")

local PROJECTS = {
	AetherDuel = {title = "AETHER DUEL", accent = Color3.fromRGB(67, 167, 255)},
	SkylineSprint = {title = "SKYLINE SPRINT", accent = Color3.fromRGB(45, 200, 255)},
	BomblineGrid = {title = "BOMBLINE GRID", accent = Color3.fromRGB(255, 193, 70)},
	SignalSiege = {title = "SIGNAL SIEGE", accent = Color3.fromRGB(55, 190, 255)},
	BuildAndSaveWorld = {title = "BUILD & SAVE", accent = Color3.fromRGB(255, 208, 84)},
	RailRushWorld = {title = "RAIL RUSH", accent = Color3.fromRGB(104, 205, 255)},
	FreightyardArena = {title = "TEAM SHOTGUN", accent = Color3.fromRGB(255, 133, 73)},
	CrystalFoundry = {title = "CRYSTAL FOUNDRY", accent = Color3.fromRGB(151, 103, 255)},
}

local function findProject()
	for name, config in pairs(PROJECTS) do
		local world = workspace:FindFirstChild(name)
		if world then return world, name, config end
	end
	for _ = 1, 100 do
		task.wait(0.1)
		for name, config in pairs(PROJECTS) do
			local world = workspace:FindFirstChild(name)
			if world then return world, name, config end
		end
	end
end

local world, projectName, config = findProject()
if not world then return end
workspace:SetAttribute("PortfolioProject", projectName)
workspace:SetAttribute("PortfolioTitle", config.title)
workspace:SetAttribute("PortfolioAccent", config.accent)

local polish = Instance.new("Folder")
polish.Name = "PresentationPolish"
polish.Parent = world

local function makePart(name, size, cframe, color, material, parent)
	local part = Instance.new("Part")
	part.Name = name
	part.Size = size
	part.CFrame = cframe
	part.Color = color
	part.Material = material or Enum.Material.SmoothPlastic
	part.Anchored = true
	part.TopSurface = Enum.SurfaceType.Smooth
	part.BottomSurface = Enum.SurfaceType.Smooth
	part.Parent = parent or polish
	return part
end

local function billboard(position, text, accent)
	local anchor = makePart("Landmark", Vector3.new(1, 1, 1), CFrame.new(position), accent, Enum.Material.Neon)
	anchor.Transparency = 1
	anchor.CanCollide = false
	local gui = Instance.new("BillboardGui")
	gui.Size = UDim2.fromOffset(420, 90)
	gui.AlwaysOnTop = false
	gui.MaxDistance = 260
	gui.Parent = anchor
	local label = Instance.new("TextLabel")
	label.Size = UDim2.fromScale(1, 1)
	label.BackgroundTransparency = 1
	label.Text = text
	label.TextColor3 = Color3.new(1, 1, 1)
	label.TextStrokeTransparency = 0.25
	label.Font = Enum.Font.GothamBlack
	label.TextScaled = true
	label.Parent = gui
end

local function barrier(size, position)
	local wall = makePart("SafetyBarrier", size, CFrame.new(position), Color3.new(1, 1, 1), Enum.Material.SmoothPlastic)
	wall.Transparency = 1
	wall.CanCollide = true
	wall.CanQuery = false
end

local function lamp(position, accent)
	makePart("LampPost", Vector3.new(1, 12, 1), CFrame.new(position + Vector3.new(0, 6, 0)), Color3.fromRGB(47, 53, 63), Enum.Material.Metal)
	local head = makePart("LampHead", Vector3.new(3, 1, 3), CFrame.new(position + Vector3.new(0, 12, 0)), accent, Enum.Material.Neon)
	head.CanCollide = false
	local light = Instance.new("PointLight")
	light.Color = accent
	light.Range = 24
	light.Brightness = 1.2
	light.Parent = head
end

local dressers = {}

dressers.AetherDuel = function()
	billboard(Vector3.new(0, 35, -49), "AETHER DUEL", config.accent)
	for _, position in ipairs({Vector3.new(-38, 2, 0), Vector3.new(38, 2, 0), Vector3.new(0, 2, -38), Vector3.new(0, 2, 38)}) do lamp(position, config.accent) end
	barrier(Vector3.new(116, 18, 2), Vector3.new(0, 8, -56)); barrier(Vector3.new(116, 18, 2), Vector3.new(0, 8, 56))
	barrier(Vector3.new(2, 18, 116), Vector3.new(-56, 8, 0)); barrier(Vector3.new(2, 18, 116), Vector3.new(56, 8, 0))
end

dressers.SkylineSprint = function()
	billboard(Vector3.new(0, 34, -150), "SKYLINE SPRINT", config.accent)
	for _, position in ipairs({Vector3.new(-185, 2, -168), Vector3.new(-90, 2, -168), Vector3.new(0, 2, -168), Vector3.new(90, 2, -168), Vector3.new(185, 2, -168)}) do lamp(position, config.accent) end
end

dressers.BomblineGrid = function()
	billboard(Vector3.new(0, 29, -82), "BOMBLINE GRID", config.accent)
	barrier(Vector3.new(170, 12, 2), Vector3.new(0, 5, -83)); barrier(Vector3.new(170, 12, 2), Vector3.new(0, 5, 83))
	barrier(Vector3.new(2, 12, 170), Vector3.new(-83, 5, 0)); barrier(Vector3.new(2, 12, 170), Vector3.new(83, 5, 0))
end

dressers.SignalSiege = function()
	billboard(Vector3.new(155, 39, 18), "PROTECT THE SIGNAL", config.accent)
	for _, position in ipairs({Vector3.new(-170, 1, -140), Vector3.new(-80, 1, 35), Vector3.new(45, 1, 55), Vector3.new(145, 1, 100)}) do lamp(position, config.accent) end
end

dressers.BuildAndSaveWorld = function()
	billboard(Vector3.new(0, 25, 36), "YOUR WORKSHOP", config.accent)
	for _, position in ipairs({Vector3.new(-43, 0, -43), Vector3.new(43, 0, -43), Vector3.new(-43, 0, 43), Vector3.new(43, 0, 43)}) do lamp(position, config.accent) end
end

dressers.RailRushWorld = function()
	billboard(Vector3.new(0, 53, 4), "RAIL RUSH", config.accent)
	for _, position in ipairs({Vector3.new(-18, 32, 8), Vector3.new(18, 32, 8), Vector3.new(-18, 30, -10), Vector3.new(18, 30, -10)}) do lamp(position, config.accent) end
end

dressers.FreightyardArena = function()
	billboard(Vector3.new(0, 29, -61), "FREIGHTYARD SHOWDOWN", config.accent)
	for _, position in ipairs({Vector3.new(-70, 0, -50), Vector3.new(-25, 0, 50), Vector3.new(25, 0, -50), Vector3.new(70, 0, 50)}) do lamp(position, config.accent) end
end

dressers.CrystalFoundry = function()
	billboard(Vector3.new(0, 28, 73), "CRYSTAL FOUNDRY", config.accent)
	for _, position in ipairs({Vector3.new(-32, 0, 35), Vector3.new(32, 0, 35), Vector3.new(-32, 0, 70), Vector3.new(32, 0, 70)}) do lamp(position, config.accent) end
end

if dressers[projectName] then dressers[projectName]() end

local colorCorrection = Instance.new("ColorCorrectionEffect")
colorCorrection.Name = "PortfolioColor"
colorCorrection.Brightness = 0.02
colorCorrection.Contrast = 0.08
colorCorrection.Saturation = 0.06
colorCorrection.Parent = Lighting

local function dressCharacter(character)
	local torso = character:WaitForChild("UpperTorso", 3) or character:WaitForChild("Torso", 3)
	if not torso or character:FindFirstChild("PortfolioArmor") then return end
	local folder = Instance.new("Folder")
	folder.Name = "PortfolioArmor"
	folder.Parent = character
	for _, offset in ipairs({-1, 1}) do
		local plate = Instance.new("Part")
		plate.Name = "ShoulderPlate"
		plate.Size = Vector3.new(1.5, 0.55, 1.8)
		plate.Color = config.accent
		plate.Material = Enum.Material.Metal
		plate.CanCollide = false
		plate.Massless = true
		plate.CFrame = torso.CFrame * CFrame.new(offset * 1.55, 0.75, 0)
		plate.Parent = folder
		local weld = Instance.new("WeldConstraint")
		weld.Part0 = torso
		weld.Part1 = plate
		weld.Parent = plate
	end
end

local function stabilizeCharacter(character)
	local humanoid = character:WaitForChild("Humanoid", 8)
	local root = character:WaitForChild("HumanoidRootPart", 8)
	if not humanoid or not root then return end

	-- Every portfolio map is generated by a server script. On a cold Studio play,
	-- Roblox can create the avatar before that map''s SpawnLocation is ready.
	local spawnLocation = world:FindFirstChildWhichIsA("SpawnLocation", true)
	if spawnLocation then
		root.AssemblyLinearVelocity = Vector3.zero
		root.AssemblyAngularVelocity = Vector3.zero
		root.CFrame = spawnLocation.CFrame * CFrame.new(0, 4, 0)
	end

	local forceField = Instance.new("ForceField")
	forceField.Name = "SpawnProtection"
	forceField.Visible = false
	forceField.Parent = character
	humanoid.Health = humanoid.MaxHealth

	local safeCFrame = root.CFrame
	local started = os.clock()
	local connection
	connection = game:GetService("RunService").Heartbeat:Connect(function()
		if not character.Parent or humanoid.Health <= 0 then
			connection:Disconnect()
			return
		end
		if root.Position.Y < -40 then
			root.AssemblyLinearVelocity = Vector3.zero
			root.AssemblyAngularVelocity = Vector3.zero
			root.CFrame = safeCFrame
			humanoid.Health = humanoid.MaxHealth
		end
		if os.clock() - started >= 8 then
			connection:Disconnect()
			if forceField.Parent then forceField:Destroy() end
		end
	end)
end

local function setupPlayer(player)
	player.CharacterAdded:Connect(function(character)
		task.spawn(stabilizeCharacter, character)
		task.spawn(dressCharacter, character)
	end)
	if player.Character then
		task.spawn(stabilizeCharacter, player.Character)
		task.spawn(dressCharacter, player.Character)
	end
end
Players.PlayerAdded:Connect(setupPlayer)
for _, player in ipairs(Players:GetPlayers()) do setupPlayer(player) end
]]></string>
      </Properties>
    </Item>
  </Item>
  <Item class="StarterPlayer" referent="3">
    <Properties>
      <string name="Name">StarterPlayer</string>
    </Properties>
    <Item class="StarterPlayerScripts" referent="4">
      <Properties>
        <string name="Name">StarterPlayerScripts</string>
      </Properties>
      <Item class="LocalScript" referent="5">
        <Properties>
          <string name="Name">BomberClient</string>
          <string name="Source"><![CDATA[local Players=game:GetService("Players") local RS=game:GetService("ReplicatedStorage") local p=Players.LocalPlayer local rem=RS:WaitForChild("BomberRemotes") local gui=Instance.new("ScreenGui",p:WaitForChild("PlayerGui")) gui.ResetOnSpawn=false
local function txt(v,pos,size,font,col) local t=Instance.new("TextLabel",gui) t.BackgroundTransparency=1 t.Position=pos t.Size=size t.Text=v t.Font=font or Enum.Font.Gotham t.TextColor3=col or Color3.new(1,1,1) t.TextSize=16 t.TextXAlignment=Enum.TextXAlignment.Center return t end
local title=txt("BOMBLINE GRID",UDim2.new(.5,-250,0,18),UDim2.fromOffset(500,35),Enum.Font.GothamBlack,Color3.fromRGB(255,193,70)) title.TextSize=27 local phase=txt("WAITING",UDim2.new(.5,-250,0,56),UDim2.fromOffset(500,28),Enum.Font.GothamBold) local timer=txt("5",UDim2.new(.5,-100,0,85),UDim2.fromOffset(200,70),Enum.Font.GothamBlack,Color3.fromRGB(239,67,82)) timer.TextSize=56 local info=txt("Click tiles when you are the bomber",UDim2.new(.5,-300,1,-55),UDim2.fromOffset(600,30),Enum.Font.GothamBold,Color3.fromRGB(190,204,220))
local banner=txt("",UDim2.new(.5,-350,.3,0),UDim2.fromOffset(700,55),Enum.Font.GothamBlack,Color3.fromRGB(255,193,70)) banner.TextSize=27 rem.Notice.OnClientEvent:Connect(function(m) banner.Text=m task.delay(1.5,function() if banner.Text==m then banner.Text="" end end) end)
rem.Sync.OnClientEvent:Connect(function(s) phase.Text=string.format("ROUND %d · %s · BOMBER: %s",s.round,string.upper(s.phase),s.bomber) timer.Text=tostring(s.time) info.Text=p.Name==s.bomber and "YOU ARE BOMBER · CLICK UP TO 3 TILES" or "WATCH THE WARNING COLORS AND MOVE" end)
local mouse=p:GetMouse() mouse.Button1Down:Connect(function() local t=mouse.Target if t and t:GetAttribute("GridX") then rem.ChooseTile:FireServer(t:GetAttribute("GridX"),t:GetAttribute("GridZ")) end end)
]]></string>
        </Properties>
      </Item>
      <Item class="LocalScript" referent="6">
        <Properties>
          <string name="Name">PortfolioPolish</string>
          <string name="Source"><![CDATA[local Players = game:GetService("Players")
local TweenService = game:GetService("TweenService")
local UserInputService = game:GetService("UserInputService")

local player = Players.LocalPlayer
local projectName = workspace:GetAttribute("PortfolioProject")
if not projectName then
	workspace:GetAttributeChangedSignal("PortfolioProject"):Wait()
	projectName = workspace:GetAttribute("PortfolioProject")
end

local title = workspace:GetAttribute("PortfolioTitle") or "NAKEL GAMEPLAY DEMO"
local accent = workspace:GetAttribute("PortfolioAccent") or Color3.fromRGB(68, 180, 255)
local instructions = {
	AetherDuel = "CLICK COMBO  •  E HEAVY  •  Q DASH  •  HOLD F BLOCK",
	SkylineSprint = "W/S THROTTLE  •  A/D STEER  •  SHIFT DRIFT  •  SPACE BOOST",
	BomblineGrid = "WATCH WARNING TILES  •  MOVE BEFORE THE BLAST",
	SignalSiege = "CLICK GOLD PADS  •  CLICK TOWERS TO SELECT  •  U UPGRADE",
	BuildAndSaveWorld = "B BUILD MODE  •  1–4 ITEM  •  R ROTATE  •  X DELETE",
	RailRushWorld = "E START  •  A/D CHOOSE ROUTE  •  SPACE JUMP",
	FreightyardArena = "CLICK FIRE  •  R RELOAD  •  USE COVER",
	CrystalFoundry = "CLICK OR E TO HARVEST  •  E AT STATIONS TO UPGRADE",
}

local gui = Instance.new("ScreenGui")
gui.Name = "PortfolioPresentation"
gui.IgnoreGuiInset = true
gui.ResetOnSpawn = false
gui.DisplayOrder = 100
gui.Parent = player:WaitForChild("PlayerGui")

local intro = Instance.new("Frame")
intro.Size = UDim2.fromScale(1, 1)
intro.BackgroundColor3 = Color3.fromRGB(7, 11, 18)
intro.Parent = gui

local line = Instance.new("Frame")
line.AnchorPoint = Vector2.new(0.5, 0.5)
line.Position = UDim2.fromScale(0.5, 0.58)
line.Size = UDim2.fromOffset(0, 3)
line.BackgroundColor3 = accent
line.BorderSizePixel = 0
line.Parent = intro

local heading = Instance.new("TextLabel")
heading.AnchorPoint = Vector2.new(0.5, 0.5)
heading.Position = UDim2.fromScale(0.5, 0.45)
heading.Size = UDim2.new(0.9, 0, 0, 80)
heading.BackgroundTransparency = 1
heading.Text = title
heading.TextColor3 = Color3.new(1, 1, 1)
heading.TextTransparency = 1
heading.Font = Enum.Font.GothamBlack
heading.TextScaled = true
heading.Parent = intro
local sizeConstraint = Instance.new("UITextSizeConstraint")
sizeConstraint.MaxTextSize = 46
sizeConstraint.MinTextSize = 24
sizeConstraint.Parent = heading

local subtitle = Instance.new("TextLabel")
subtitle.AnchorPoint = Vector2.new(0.5, 0.5)
subtitle.Position = UDim2.fromScale(0.5, 0.66)
subtitle.Size = UDim2.new(0.9, 0, 0, 40)
subtitle.BackgroundTransparency = 1
subtitle.Text = instructions[projectName] or "PLAYABLE PORTFOLIO PROTOTYPE"
subtitle.TextColor3 = Color3.fromRGB(188, 202, 219)
subtitle.TextTransparency = 1
subtitle.Font = Enum.Font.GothamBold
subtitle.TextSize = 14
subtitle.TextWrapped = true
subtitle.Parent = intro

TweenService:Create(heading, TweenInfo.new(0.35), {TextTransparency = 0}):Play()
TweenService:Create(line, TweenInfo.new(0.45), {Size = UDim2.new(0.5, 0, 0, 3)}):Play()
TweenService:Create(subtitle, TweenInfo.new(0.4), {TextTransparency = 0}):Play()
task.delay(1.8, function()
	TweenService:Create(intro, TweenInfo.new(0.45), {BackgroundTransparency = 1}):Play()
	TweenService:Create(heading, TweenInfo.new(0.3), {TextTransparency = 1}):Play()
	TweenService:Create(subtitle, TweenInfo.new(0.3), {TextTransparency = 1}):Play()
	TweenService:Create(line, TweenInfo.new(0.3), {BackgroundTransparency = 1}):Play()
	task.wait(0.5)
	intro:Destroy()
end)

if UserInputService.TouchEnabled then
	local touchHint = Instance.new("TextLabel")
	touchHint.AnchorPoint = Vector2.new(0.5, 1)
	touchHint.Position = UDim2.new(0.5, 0, 1, -10)
	touchHint.Size = UDim2.new(0.92, 0, 0, 26)
	touchHint.BackgroundColor3 = Color3.fromRGB(10, 16, 25)
	touchHint.BackgroundTransparency = 0.18
	touchHint.Text = "Desktop controls recommended for this portfolio build"
	touchHint.TextColor3 = Color3.fromRGB(213, 221, 232)
	touchHint.Font = Enum.Font.GothamMedium
	touchHint.TextSize = 11
	touchHint.Parent = gui
	Instance.new("UICorner", touchHint).CornerRadius = UDim.new(0, 8)
end
]]></string>
        </Properties>
      </Item>
    </Item>
  </Item>
</roblox>