<roblox version="4">
  <Item class="ServerScriptService" referent="0">
    <Properties>
      <string name="Name">ServerScriptService</string>
    </Properties>
    <Item class="Script" referent="1">
      <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 class="Script" referent="2">
      <Properties>
        <string name="Name">TDServer</string>
        <token name="RunContext">0</token>
        <string name="Source"><![CDATA[local Players=game:GetService("Players") local RS=game:GetService("ReplicatedStorage") local Run=game:GetService("RunService") local Tween=game:GetService("TweenService") local Debris=game:GetService("Debris") local Lighting=game:GetService("Lighting")
local world=Instance.new("Folder",workspace) world.Name="SignalSiege" local rem=Instance.new("Folder",RS) rem.Name="TDRemotes" local action=Instance.new("RemoteEvent",rem) action.Name="Action" local sync=Instance.new("RemoteEvent",rem) sync.Name="Sync" local note=Instance.new("RemoteEvent",rem) note.Name="Notice"
local C={ground=Color3.fromRGB(48,70,63),path=Color3.fromRGB(74,79,91),blue=Color3.fromRGB(55,190,255),gold=Color3.fromRGB(255,194,68),red=Color3.fromRGB(240,71,86),dark=Color3.fromRGB(24,30,42)}
local function part(parent,n,s,cf,c,m) local p=Instance.new("Part",parent) 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(world,"Ground",Vector3.new(430,5,320),CFrame.new(0,-4,0),C.ground,Enum.Material.Grass)
local points={Vector3.new(-190,2,-110),Vector3.new(-95,2,-110),Vector3.new(-95,2,-25),Vector3.new(30,2,-25),Vector3.new(30,2,85),Vector3.new(125,2,85),Vector3.new(190,2,15)}
for i=1,#points-1 do local a,b=points[i],points[i+1] local d=(b-a).Magnitude part(world,"Path",Vector3.new(34,2,d),CFrame.lookAt((a+b)/2,b),C.path,Enum.Material.Cobblestone) end
local core=part(world,"SignalCore",Vector3.new(26,30,26),CFrame.new(points[#points]+Vector3.new(0,14,0)),C.blue,Enum.Material.Neon)
local pads={} local padPositions={Vector3.new(-145,1,-72),Vector3.new(-55,1,-75),Vector3.new(-58,1,15),Vector3.new(-15,1,-67),Vector3.new(72,1,10),Vector3.new(-10,1,75),Vector3.new(72,1,115),Vector3.new(135,1,45),Vector3.new(155,1,115)}
for i,pos in ipairs(padPositions) do local p=part(world,"BuildPad"..i,Vector3.new(18,1,18),CFrame.new(pos),C.gold,Enum.Material.Neon) p:SetAttribute("PadIndex",i) pads[i]=p end
for i=1,24 do local x=-205+(i*37)%410 local z=-145+(i*61)%290 local h=12+(i*9)%35 part(world,"Ruin",Vector3.new(16,h,16),CFrame.new(x,h/2-1,z),Color3.fromRGB(65,73,80),Enum.Material.Concrete) end
local spawn=Instance.new("SpawnLocation",world) spawn.Size=Vector3.new(12,1,12) spawn.CFrame=CFrame.new(160,4,-100) spawn.Anchored=true spawn.Neutral=true spawn.Transparency=.3 spawn.Color=C.blue
local enemies={} local towers={} local profiles={} local wave=0 local baseHealth=20 local phase="Build" local countdown=8
local function send(p) local d=profiles[p] if d then local selectedTower=towers[d.selected] sync:FireClient(p,{cash=d.cash,wave=wave,baseHealth=baseHealth,phase=phase,countdown=countdown,selected=d.selected,selectedLevel=selectedTower and selectedTower.level or 0,upgradeCost=selectedTower and selectedTower.level<4 and 80*selectedTower.level or 0}) end end local function sendAll() for p in pairs(profiles) do send(p) end end
local function beam(a,b,color) local d=(b-a).Magnitude local p=part(world,"Shot",Vector3.new(.4,.4,d),CFrame.lookAt(a,b)*CFrame.new(0,0,-d/2),color,Enum.Material.Neon) p.CanCollide=false Debris:AddItem(p,.12) end
local function towerModel(pad,owner) local m=Instance.new("Model",world) m.Name="PulseTower" local base=part(m,"Base",Vector3.new(8,3,8),pad.CFrame+Vector3.new(0,2,0),C.dark,Enum.Material.Metal) local head=part(m,"Head",Vector3.new(5,5,5),pad.CFrame+Vector3.new(0,6,0),C.blue,Enum.Material.Neon) local padIndex=pad:GetAttribute("PadIndex") base:SetAttribute("PadIndex",padIndex) head:SetAttribute("PadIndex",padIndex) m.PrimaryPart=base m:SetAttribute("Owner",owner.UserId) m:SetAttribute("Level",1) return m end
action.OnServerEvent:Connect(function(p,kind,index) local d=profiles[p] local pad=pads[tonumber(index) or -1] if not d then return end
 if kind=="Pad" and pad then local existing=towers[index] if existing then if existing.owner==p then d.selected=index note:FireClient(p,"TOWER SELECTED · PRESS U TO UPGRADE") end elseif d.cash>=100 then d.cash-=100 local m=towerModel(pad,p) towers[index]={model=m,owner=p,level=1,damage=18,range=65,cooldown=.75,next=0} pad.Transparency=.75 d.selected=index note:FireClient(p,"PULSE TOWER PLACED") end send(p)
 elseif kind=="Upgrade" then local t=towers[d.selected] local cost=t and 80*t.level if t and t.owner==p and t.level<4 and d.cash>=cost then d.cash-=cost t.level+=1 t.damage+=12 t.range+=8 t.cooldown=math.max(.3,t.cooldown-.1) t.model:SetAttribute("Level",t.level) t.model.Head.Size+=Vector3.new(.7,.7,.7) note:FireClient(p,"TOWER UPGRADED TO LEVEL "..t.level) send(p) end end
end)
local function spawnEnemy(id) local m=Instance.new("Model",world) m.Name="WaveEnemy" local root=part(m,"Root",Vector3.new(6,6,6),CFrame.new(points[1]+Vector3.new(0,3,0)),wave%3==0 and C.red or Color3.fromRGB(185,200,211),Enum.Material.Metal) root.Shape=Enum.PartType.Ball local hp=80+wave*22 local e={model=m,root=root,hp=hp,max=hp,index=2,speed=15+math.min(wave,10),reward=18+wave*2,id=id} m.PrimaryPart=root table.insert(enemies,e) end
local function kill(e) if not e.model.Parent then return end e.model:Destroy() for _,d in pairs(profiles) do d.cash+=e.reward end end
Run.Heartbeat:Connect(function(dt)
 for i=#enemies,1,-1 do local e=enemies[i] if not e.model.Parent then table.remove(enemies,i) else local target=points[e.index] local delta=target-e.root.Position if delta.Magnitude<2 then e.index+=1 if e.index>#points then e.model:Destroy() table.remove(enemies,i) baseHealth-=1 if baseHealth<=0 then baseHealth=20 wave=0 note:FireAllClients("CORE LOST · RESETTING") for j=#enemies,1,-1 do if enemies[j].model.Parent then enemies[j].model:Destroy() end table.remove(enemies,j) end end else target=points[e.index] end end if e.model.Parent and target then local step=delta.Magnitude>0 and delta.Unit*math.min(delta.Magnitude,e.speed*dt) or Vector3.zero e.model:PivotTo(CFrame.lookAt(e.root.Position+step,target)) end end end
 local now=os.clock() for _,t in pairs(towers) do if t.model.Parent and now>=t.next then local best,progress for _,e in ipairs(enemies) do if e.model.Parent then local dist=(e.root.Position-t.model.PrimaryPart.Position).Magnitude local pr=e.index*1000-dist if dist<=t.range and (not progress or pr>progress) then best,progress=e,pr end end end if best then t.next=now+t.cooldown best.hp-=t.damage beam(t.model.Head.Position,best.root.Position,C.blue) if best.hp<=0 then kill(best) end end end end sendAll()
end)
local function setup(p) profiles[p]={cash=300,selected=0} p.CharacterAdded:Connect(function() task.wait(.5) send(p) end) end Players.PlayerAdded:Connect(setup) for _,p in ipairs(Players:GetPlayers()) do setup(p) end Players.PlayerRemoving:Connect(function(p) profiles[p]=nil end)
task.spawn(function() while true do phase="Build" for i=8,1,-1 do countdown=i sendAll() task.wait(1) end wave+=1 phase="Wave" note:FireAllClients("WAVE "..wave) local count=5+wave*2 for i=1,count do spawnEnemy(i) task.wait(math.max(.35,1-wave*.03)) end repeat countdown=#enemies sendAll() task.wait(.5) until #enemies==0 or baseHealth<=0 end end)
Lighting.ClockTime=18.5 Lighting.Brightness=2 Lighting.Ambient=Color3.fromRGB(72,82,91)
]]></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">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 class="LocalScript" referent="6">
        <Properties>
          <string name="Name">TDClient</string>
          <string name="Source"><![CDATA[local Players=game:GetService("Players") local RS=game:GetService("ReplicatedStorage") local UIS=game:GetService("UserInputService") local p=Players.LocalPlayer local rem=RS:WaitForChild("TDRemotes") local gui=Instance.new("ScreenGui",p:WaitForChild("PlayerGui")) gui.ResetOnSpawn=false
local function text(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.Left return t end
local title=text("SIGNAL SIEGE TD",UDim2.fromOffset(20,18),UDim2.fromOffset(360,30),Enum.Font.GothamBlack,Color3.fromRGB(55,190,255)) title.TextSize=24 local stats=text("WAVE 0 · CORE 20 · $300",UDim2.fromOffset(20,54),UDim2.fromOffset(460,25),Enum.Font.GothamBold) local phase=text("BUILD PHASE",UDim2.fromOffset(20,82),UDim2.fromOffset(430,22),Enum.Font.GothamBold,Color3.fromRGB(255,194,68)) local help=text("Click a glowing pad: place/select tower · U: upgrade",UDim2.fromOffset(20,110),UDim2.fromOffset(470,22),Enum.Font.GothamMedium,Color3.fromRGB(190,205,220)) help.TextSize=12
local banner=text("",UDim2.new(.5,-300,.18,0),UDim2.fromOffset(600,50),Enum.Font.GothamBlack,Color3.fromRGB(255,194,68)) banner.TextXAlignment=Enum.TextXAlignment.Center banner.TextSize=25 rem.Notice.OnClientEvent:Connect(function(m) banner.Text=m task.delay(1.4,function() if banner.Text==m then banner.Text="" end end) end)
local selected=0 rem.Sync.OnClientEvent:Connect(function(s) selected=s.selected stats.Text=string.format("WAVE %d · CORE %d · $%d",s.wave,s.baseHealth,s.cash) phase.Text=string.upper(s.phase).." · "..s.countdown if s.selectedLevel and s.selectedLevel>0 then help.Text=s.selectedLevel>=4 and "SELECTED TOWER · LEVEL 4 MAX" or string.format("SELECTED TOWER · LEVEL %d · PRESS U TO UPGRADE ($%d)",s.selectedLevel,s.upgradeCost) else help.Text="Click a glowing pad: place/select tower · U: upgrade" end end)
local mouse=p:GetMouse() mouse.Button1Down:Connect(function() local t=mouse.Target local i=t and t:GetAttribute("PadIndex") if i then rem.Action:FireServer("Pad",i) end end) UIS.InputBegan:Connect(function(i,g) if not g and i.KeyCode==Enum.KeyCode.U then rem.Action:FireServer("Upgrade",selected) end end)
]]></string>
        </Properties>
      </Item>
    </Item>
  </Item>
</roblox>