--======================================================== -- CRIMSON iPAD OS 2.0 -- Delta Client-Side Tablet -- Mobile + PC --======================================================== local Players = game:GetService("Players") local UIS = game:GetService("UserInputService") local TeleportService = game:GetService("TeleportService") local MarketplaceService = game:GetService("MarketplaceService") local GuiService = game:GetService("GuiService") local Player = Players.LocalPlayer local PlayerGui = Player:WaitForChild("PlayerGui") -- CLEANUP pcall(function() game:GetService("CoreGui"):FindFirstChild("CrimsonOS2"):Destroy() end) pcall(function() PlayerGui:FindFirstChild("CrimsonOS2"):Destroy() end) -- COLORS local Accent = Color3.fromRGB(190, 20, 48) local Background = Color3.fromRGB(18, 18, 27) local Panel = Color3.fromRGB(32, 32, 43) local White = Color3.fromRGB(250, 250, 250) local Gray = Color3.fromRGB(170, 170, 185) local Themes = { Crimson = Color3.fromRGB(190,20,48), Purple = Color3.fromRGB(130,65,220), Blue = Color3.fromRGB(40,120,230), Green = Color3.fromRGB(30,165,100), Pink = Color3.fromRGB(230,70,145), Orange = Color3.fromRGB(230,115,30) } local WallpaperID = "" local Notes = "" local TabletVisible = true local CurrentApp = nil local GameScore = 0 -- GUI local Gui = Instance.new("ScreenGui") Gui.Name = "CrimsonOS2" Gui.ResetOnSpawn = false Gui.DisplayOrder = 999 Gui.ZIndexBehavior = Enum.ZIndexBehavior.Sibling local ok = pcall(function() Gui.Parent = game:GetService("CoreGui") end) if not ok or not Gui.Parent then Gui.Parent = PlayerGui end local function Corner(obj, radius) local c = Instance.new("UICorner") c.CornerRadius = UDim.new(0, radius or 12) c.Parent = obj end local function Stroke(obj, color) local s = Instance.new("UIStroke") s.Color = color or Accent s.Thickness = 1.5 s.Parent = obj return s end local function New(class, parent, props) local obj = Instance.new(class) for k,v in pairs(props or {}) do obj[k] = v end obj.Parent = parent return obj end local function Label(parent, text, pos, size, textSize) return New("TextLabel", parent, { Position = pos, Size = size, BackgroundTransparency = 1, Text = text, TextColor3 = White, Font = Enum.Font.Gotham, TextSize = textSize or 14, TextWrapped = true }) end local function Button(parent, text, pos, size, callback, color) local b = New("TextButton", parent, { Position = pos, Size = size, BackgroundColor3 = color or Accent, Text = text, TextColor3 = White, Font = Enum.Font.GothamBold, TextSize = 13, AutoButtonColor = true }) Corner(b, 10) b.MouseButton1Click:Connect(callback) return b end local function TextInput(parent, placeholder, pos, size) local t = New("TextBox", parent, { Position = pos, Size = size, BackgroundColor3 = Panel, Text = "", PlaceholderText = placeholder, PlaceholderColor3 = Gray, TextColor3 = White, Font = Enum.Font.Gotham, TextSize = 13, ClearTextOnFocus = false }) Corner(t, 9) return t end -- MAIN TABLET local Tablet = New("Frame", Gui, { Name = "Tablet", Size = UDim2.new(0.90, 0, 0.80, 0), Position = UDim2.new(0.05, 0, 0.10, 0), BackgroundColor3 = Background, BorderSizePixel = 0, ClipsDescendants = true }) Corner(Tablet, 23) Stroke(Tablet) local UIScale = New("UIScale", Tablet, {Scale = 1}) local function UpdateScale() local cam = workspace.CurrentCamera if cam then UIScale.Scale = math.clamp(cam.ViewportSize.X / 950, 0.65, 1) end end UpdateScale() -- WALLPAPER local Wallpaper = New("ImageLabel", Tablet, { Name = "Wallpaper", Size = UDim2.new(1,0,1,0), Position = UDim2.new(0,0,0,0), BackgroundColor3 = Background, BackgroundTransparency = 0, Image = "", ScaleType = Enum.ScaleType.Crop, ZIndex = 0 }) local function SetWallpaper(id) id = tostring(id):gsub("%s", "") id = id:match("%d+") or "" if id == "" then return false end WallpaperID = id Wallpaper.Image = "rbxassetid://" .. id Wallpaper.BackgroundTransparency = 0.3 return true end -- HEADER local Top = New("Frame", Tablet, { Size = UDim2.new(1,0,0,43), BackgroundColor3 = Accent, BackgroundTransparency = 0.04, BorderSizePixel = 0, ZIndex = 3 }) local Logo = Label(Top, "CRIMSON iPAD OS", UDim2.new(0,13,0,0), UDim2.new(0.5,0,1,0), 15) Logo.Font = Enum.Font.GothamBold Logo.TextXAlignment = Enum.TextXAlignment.Left local Clock = Label(Top, "--:--", UDim2.new(0.58,0,0,0), UDim2.new(0.22,0,1,0), 13) Clock.Font = Enum.Font.GothamBold Button(Top, "×", UDim2.new(1,-42,0,5), UDim2.fromOffset(34,32), function() Gui:Destroy() end) -- DRAGGING local dragging = false local dragStart local startPosition Top.InputBegan:Connect(function(input) if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then dragging = true dragStart = input.Position startPosition = Tablet.Position end end) UIS.InputChanged:Connect(function(input) if dragging and ( input.UserInputType == Enum.UserInputType.MouseMovement or input.UserInputType == Enum.UserInputType.Touch ) then local delta = input.Position - dragStart Tablet.Position = UDim2.new( startPosition.X.Scale, startPosition.X.Offset + delta.X, startPosition.Y.Scale, startPosition.Y.Offset + delta.Y ) end end) UIS.InputEnded:Connect(function(input) if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then dragging = false end end) -- BODY local Body = New("Frame", Tablet, { Position = UDim2.new(0,0,0,43), Size = UDim2.new(1,0,1,-83), BackgroundTransparency = 1, ZIndex = 1 }) local Home = New("Frame", Body, { Size = UDim2.new(1,0,1,0), BackgroundTransparency = 1 }) local AppPage = New("Frame", Body, { Size = UDim2.new(1,0,1,0), BackgroundTransparency = 1, Visible = false }) -- DOCK local Dock = New("Frame", Tablet, { Position = UDim2.new(0.08,0,1,-36), Size = UDim2.new(0.84,0,0,29), BackgroundColor3 = Panel, BackgroundTransparency = 0.08, ZIndex = 4 }) Corner(Dock, 12) Button(Dock, "⌂ HOME", UDim2.new(0.02,0,0,2), UDim2.new(0.47,0,0,25), function() AppPage.Visible = false Home.Visible = true CurrentApp = nil end) Button(Dock, "HIDE", UDim2.new(0.51,0,0,2), UDim2.new(0.47,0,0,25), function() Tablet.Visible = false TabletVisible = false end) -- FLOATING TOGGLE local Toggle = Button(Gui, "C", UDim2.new(0.85,0,0.80,0), UDim2.fromOffset(53,53), function() TabletVisible = not TabletVisible Tablet.Visible = TabletVisible end) Toggle.TextSize = 23 Corner(Toggle, 50) Stroke(Toggle) UIS.InputBegan:Connect(function(input, processed) if processed then return end if input.KeyCode == Enum.KeyCode.RightControl then TabletVisible = not TabletVisible Tablet.Visible = TabletVisible end end) -- APP SYSTEM local function ClearPage() for _, child in ipairs(AppPage:GetChildren()) do child:Destroy() end end local function AppHeader(name) local h = New("Frame", AppPage, { Size = UDim2.new(1,0,0,40), BackgroundColor3 = Panel, BackgroundTransparency = 0.05 }) Corner(h, 9) local title = Label(h, name, UDim2.new(0,12,0,0), UDim2.new(0.7,0,1,0), 16) title.Font = Enum.Font.GothamBold title.TextXAlignment = Enum.TextXAlignment.Left Button(h, "BACK", UDim2.new(1,-76,0,4), UDim2.fromOffset(70,32), function() AppPage.Visible = false Home.Visible = true CurrentApp = nil end) end local function ContentFrame() local f = New("Frame", AppPage, { Position = UDim2.new(0,0,0,45), Size = UDim2.new(1,0,1,-45), BackgroundTransparency = 1 }) return f end -- ROBLOX APP local function OpenRoblox(page) AppHeader("ROBLOX") local f = ContentFrame() Label(f, "ROBLOX", UDim2.new(0.05,0,0.01,0), UDim2.new(0.9,0,0,45), 25) Label(f, "Your Roblox profile and game launcher", UDim2.new(0.05,0,0.12,0), UDim2.new(0.9,0,0,30), 12) Button(f, "OPEN ROBLOX WEBSITE", UDim2.new(0.08,0,0.23,0), UDim2.new(0.84,0,0,43), function() local url = "https://www.roblox.com/home" if setclipboard then pcall(setclipboard, url) end if toclipboard then pcall(toclipboard, url) end Label(f, "Website link copied: roblox.com/home", UDim2.new(0.05,0,0.36,0), UDim2.new(0.9,0,0,30), 11) end) Button(f, "MY PROFILE", UDim2.new(0.08,0,0.39,0), UDim2.new(0.84,0,0,43), function() local url = "https://www.roblox.com/users/" .. Player.UserId .. "/profile" if setclipboard then pcall(setclipboard,url) end if toclipboard then pcall(toclipboard,url) end end) Label(f, "Username: @" .. Player.Name, UDim2.new(0.07,0,0.55,0), UDim2.new(0.86,0,0,30), 14) Label(f, "User ID: " .. Player.UserId, UDim2.new(0.07,0,0.64,0), UDim2.new(0.86,0,0,30), 12) Label(f, "JOIN A GAME", UDim2.new(0.07,0,0.75,0), UDim2.new(0.86,0,0,25), 13) local id = TextInput(f, "Enter Roblox Place ID", UDim2.new(0.07,0,0.82,0), UDim2.new(0.55,0,0,39)) Button(f, "JOIN", UDim2.new(0.65,0,0.82,0), UDim2.new(0.28,0,0,39), function() local place = tonumber(id.Text) if not place or place <= 0 or place % 1 ~= 0 then return end pcall(function() TeleportService:Teleport(place, Player) end) end) Label(f, "Recent experiences are available on your Roblox website account. Use the website button to view them.", UDim2.new(0.05,0,0.92,0), UDim2.new(0.9,0,0,35), 10) end -- WALLPAPER APP local function OpenWallpaper() AppHeader("WALLPAPER STUDIO") local f = ContentFrame() Label(f, "CUSTOM WALLPAPER", UDim2.new(0.05,0,0.04,0), UDim2.new(0.9,0,0,35), 20) Label(f, "Paste your Roblox image or decal ID below.", UDim2.new(0.05,0,0.15,0), UDim2.new(0.9,0,0,30), 12) local id = TextInput(f, "Example: 1234567890", UDim2.new(0.08,0,0.29,0), UDim2.new(0.84,0,0,45)) local status = Label(f, "Wallpaper not changed.", UDim2.new(0.05,0,0.43,0), UDim2.new(0.9,0,0,30), 12) status.TextColor3 = Gray Button(f, "APPLY WALLPAPER", UDim2.new(0.12,0,0.56,0), UDim2.new(0.76,0,0,45), function() if SetWallpaper(id.Text) then status.Text = "Wallpaper applied!" else status.Text = "Please enter a valid decal ID." end end) Button(f, "REMOVE WALLPAPER", UDim2.new(0.12,0,0.72,0), UDim2.new(0.76,0,0,42), function() Wallpaper.Image = "" WallpaperID = "" status.Text = "Default wallpaper restored." end) Label(f, "Some decals may not load because of moderation, privacy or asset permissions.", UDim2.new(0.05,0,0.88,0), UDim2.new(0.9,0,0,38), 10) end -- CLOCK APP local function OpenClock() AppHeader("CLOCK") local f = ContentFrame() local time = Label(f, os.date("%I:%M:%S %p"), UDim2.new(0,0,0.15,0), UDim2.new(1,0,0,75), 36) time.Font = Enum.Font.GothamBold local date = Label(f, os.date("%A, %B %d, %Y"), UDim2.new(0,0,0.34,0), UDim2.new(1,0,0,40), 16) local watch = Label(f, "Stopwatch: 0.00", UDim2.new(0,0,0.52,0), UDim2.new(1,0,0,45), 20) local running = false local started = 0 local elapsed = 0 Button(f, "START / PAUSE", UDim2.new(0.07,0,0.72,0), UDim2.new(0.42,0,0,42), function() if running then elapsed = elapsed + os.clock() - started running = false else started = os.clock() running = true end end) Button(f, "RESET", UDim2.new(0.53,0,0.72,0), UDim2.new(0.4,0,0,42), function() running = false elapsed = 0 watch.Text = "Stopwatch: 0.00" end) task.spawn(function() while f.Parent == AppPage do time.Text = os.date("%I:%M:%S %p") date.Text = os.date("%A, %B %d, %Y") local value = elapsed if running then value = value + os.clock() - started end watch.Text = string.format("Stopwatch: %.2f", value) task.wait(0.1) end end) end -- CALCULATOR APP local function OpenCalculator() AppHeader("CALCULATOR") local f = ContentFrame() local display = TextInput(f, "0", UDim2.new(0.05,0,0.04,0), UDim2.new(0.9,0,0,52)) display.Text = "0" display.TextSize = 22 local keys = { {"7","8","9","/"}, {"4","5","6","*"}, {"1","2","3","-"}, {"0",".","=","+"} } local grid = New("Frame", f, { Position = UDim2.new(0.05,0,0.20,0), Size = UDim2.new(0.9,0,0.65,0), BackgroundTransparency = 1 }) local layout = New("UIGridLayout", grid, { CellSize = UDim2.new(0.23,0,0.21,0), CellPadding = UDim2.new(0.02,0,0.025,0) }) local function Calculate(expression) -- Restricted arithmetic parser. local pos = 1 local parseExpression local function spaces() while expression:sub(pos,pos):match("%s") do pos = pos + 1 end end local function factor() spaces() if expression:sub(pos,pos) == "(" then pos = pos + 1 local value = parseExpression() spaces() assert(expression:sub(pos,pos) == ")") pos = pos + 1 return value end local start = pos if expression:sub(pos,pos) == "-" then pos = pos + 1 end while expression:sub(pos,pos):match("[%d%.]") do pos = pos + 1 end local n = tonumber(expression:sub(start,pos-1)) assert(n, "Invalid number") return n end local function term() local v = factor() while true do spaces() local op = expression:sub(pos,pos) if op ~= "*" and op ~= "/" then break end pos = pos + 1 local n = factor() if op == "*" then v = v*n else assert(n ~= 0, "Division by zero") v = v/n end end return v end parseExpression = function() local v = term() while true do spaces() local op = expression:sub(pos,pos) if op ~= "+" and op ~= "-" then break end pos = pos + 1 local n = term() if op == "+" then v = v+n else v = v-n end end return v end local result = parseExpression() spaces() assert(pos > #expression, "Invalid expression") return result end for _, row in ipairs(keys) do for _, key in ipairs(row) do local b = Button(grid, key, UDim2.new(), UDim2.new(), function() if key == "=" then local ok, result = pcall(Calculate, display.Text) display.Text = ok and tostring(result) or "ERROR" elseif display.Text == "0" or display.Text == "ERROR" then display.Text = key else display.Text = display.Text .. key end end) end end Button(f, "CLEAR", UDim2.new(0.25,0,0.88,0), UDim2.new(0.5,0,0,35), function() display.Text = "0" end) end -- NOTES APP local function OpenNotes() AppHeader("NOTES") local f = ContentFrame() local box = New("TextBox", f, { Position = UDim2.new(0.05,0,0.05,0), Size = UDim2.new(0.9,0,0.72,0), BackgroundColor3 = Panel, TextColor3 = White, PlaceholderColor3 = Gray, PlaceholderText = "Write something...", Text = Notes, Font = Enum.Font.Gotham, TextSize = 14, TextWrapped = true, TextXAlignment = Enum.TextXAlignment.Left, TextYAlignment = Enum.TextYAlignment.Top, MultiLine = true, ClearTextOnFocus = false }) Corner(box, 10) Button(f, "SAVE NOTES", UDim2.new(0.15,0,0.83,0), UDim2.new(0.7,0,0,42), function() Notes = box.Text end) end -- SETTINGS APP local function OpenSettings() AppHeader("SETTINGS") local f = ContentFrame() Label(f, "CHOOSE YOUR ACCENT COLOR", UDim2.new(0,0,0.03,0), UDim2.new(1,0,0,35), 16) local y = 0.13 for name, color in pairs(Themes) do local themeName = name local themeColor = color local b = Button(f, themeName, UDim2.new(0.12,0,y,0), UDim2.new(0.76,0,0,38), function() Accent = themeColor Top.BackgroundColor3 = Accent Toggle.BackgroundColor3 = Accent for _, obj in ipairs(Gui:GetDescendants()) do if obj:IsA("UIStroke") then obj.Color = Accent end end end, color) y = y + 0.115 end end -- BLOCK BLAST MINI-GAME local function OpenBlockBlast() AppHeader("BLOCK BLAST") local f = ContentFrame() local score = Label(f, "SCORE: 0", UDim2.new(0,0,0,0), UDim2.new(1,0,0,30), 17) score.Font = Enum.Font.GothamBold local selected = nil local board = {} local cells = {} local colors = { Color3.fromRGB(230,65,80), Color3.fromRGB(60,145,230), Color3.fromRGB(245,175,50), Color3.fromRGB(80,190,120) } for r=1,8 do board[r] = {} for c=1,8 do board[r][c] = 0 end end local shapes = { {{0,0}}, {{0,0},{0,1}}, {{0,0},{1,0}}, {{0,0},{0,1},{1,0}}, {{0,0},{0,1},{0,2}}, {{0,0},{1,0},{2,0}}, {{0,0},{0,1},{1,0},{1,1}}, {{0,0},{0,1},{0,2},{1,1}} } local boardFrame = New("Frame", f, { Position = UDim2.new(0.05,0,0.09,0), Size = UDim2.new(0.90,0,0.58,0), BackgroundTransparency = 1 }) local grid = New("UIGridLayout", boardFrame, { CellSize = UDim2.new(0.115,0,0,0), CellPadding = UDim2.new(0.01,0,0,4) }) grid.CellSize = UDim2.new(0.115,0,0.115,0) grid.CellPadding = UDim2.new(0.01,0,0.01,0) local function RefreshBoard() for r=1,8 do for c=1,8 do cells[r][c].BackgroundColor3 = board[r][c] == 0 and Panel or colors[board[r][c]] end end end local function ClearLines() local fullRows = {} local fullCols = {} for r=1,8 do local full = true for c=1,8 do if board[r][c] == 0 then full = false break end end if full then table.insert(fullRows,r) end end for c=1,8 do local full = true for r=1,8 do if board[r][c] == 0 then full = false break end end if full then table.insert(fullCols,c) end end for _,r in ipairs(fullRows) do for c=1,8 do board[r][c] = 0 end end for _,c in ipairs(fullCols) do for r=1,8 do board[r][c] = 0 end end GameScore = GameScore + (#fullRows + #fullCols)*10 score.Text = "SCORE: " .. GameScore end local function Place(r,c) if not selected then return end local shape = shapes[selected] local positions = {} for _,p in ipairs(shape) do local rr = r + p[1] local cc = c + p[2] if rr > 8 or cc > 8 or board[rr][cc] ~= 0 then return end table.insert(positions,{rr,cc}) end for _,p in ipairs(positions) do board[p[1]][p[2]] = math.random(1,#colors) end ClearLines() selected = nil RefreshBoard() end for r=1,8 do cells[r] = {} for c=1,8 do local rr,cc = r,c local b = Button(boardFrame, "", UDim2.new(), UDim2.new(), function() Place(rr,cc) end, Panel) b.Text = "" cells[r][c] = b end end local pieceLabel = Label(f, "SELECT A BLOCK", UDim2.new(0,0,0.69,0), UDim2.new(1,0,0,25), 12) local pieces = New("Frame", f, { Position = UDim2.new(0.04,0,0.76,0), Size = UDim2.new(0.92,0,0.20,0), BackgroundTransparency = 1 }) local pieceGrid = New("UIGridLayout", pieces, { CellSize = UDim2.new(0.23,0,0.85,0), CellPadding = UDim2.new(0.02,0,0,0) }) for i=1,4 do local index = i local b = Button(pieces, "BLOCK "..i, UDim2.new(), UDim2.new(), function() selected = math.random(1,#shapes) pieceLabel.Text = "SELECTED SHAPE: " .. selected .. " | TAP THE BOARD" end) b.TextSize = 10 end Button(f, "NEW GAME", UDim2.new(0.35,0,0.98,-1), UDim2.new(0.3,0,0,30), function() GameScore = 0 score.Text = "SCORE: 0" for r=1,8 do for c=1,8 do board[r][c] = 0 end end selected = nil RefreshBoard() end) GameScore = 0 RefreshBoard() end -- APP ICON SYSTEM local Apps = { {name="Roblox", icon="🎮", color=Color3.fromRGB(35,35,45), open=OpenRoblox}, {name="Block Blast", icon="🧩", color=Color3.fromRGB(30,130,105), open=OpenBlockBlast}, {name="Clock", icon="🕒", color=Color3.fromRGB(45,115,210), open=OpenClock}, {name="Calculator", icon="🧮", color=Color3.fromRGB(80,85,105), open=OpenCalculator}, {name="Notes", icon="📝", color=Color3.fromRGB(205,150,35), open=OpenNotes}, {name="Wallpaper", icon="🖼️", color=Color3.fromRGB(125,75,190), open=OpenWallpaper}, {name="Settings", icon="⚙️", color=Color3.fromRGB(85,90,110), open=OpenSettings} } local Greeting = Label(Home, "Welcome back, " .. Player.Name, UDim2.new(0.05,0,0.025,0), UDim2.new(0.9,0,0,38), 21) Greeting.Font = Enum.Font.GothamBold Greeting.TextXAlignment = Enum.TextXAlignment.Left local DateLabel = Label(Home, os.date("%A, %B %d"), UDim2.new(0.05,0,0.12,0), UDim2.new(0.9,0,0,25), 13) DateLabel.TextXAlignment = Enum.TextXAlignment.Left DateLabel.TextColor3 = Gray local AppGrid = New("ScrollingFrame", Home, { Position = UDim2.new(0.04,0,0.22,0), Size = UDim2.new(0.92,0,0.73,0), BackgroundTransparency = 1, BorderSizePixel = 0, ScrollBarThickness = 3 }) local Grid = New("UIGridLayout", AppGrid, { CellSize = UDim2.new(0.29,0,0,92), CellPadding = UDim2.new(0.04,0,0,12), SortOrder = Enum.SortOrder.LayoutOrder }) for _, app in ipairs(Apps) do local tile = New("TextButton", AppGrid, { Name = app.name, BackgroundColor3 = app.color, Text = "", AutoButtonColor = true }) Corner(tile, 15) local icon = Label(tile, app.icon, UDim2.new(0,0,0.03,0), UDim2.new(1,0,0.65,0), 33) icon.Font = Enum.Font.GothamBold local name = Label(tile, app.name, UDim2.new(0,2,0.68,0), UDim2.new(1,-4,0.27,0), 11) name.Font = Enum.Font.GothamBold tile.MouseButton1Click:Connect(function() ClearPage() AppPage.Visible = true Home.Visible = false CurrentApp = app.name app.open() end) end Grid:GetPropertyChangedSignal("AbsoluteContentSize"):Connect(function() AppGrid.CanvasSize = UDim2.new(0,0,0,Grid.AbsoluteContentSize.Y+10) end) -- CLOCK UPDATE task.spawn(function() while Gui.Parent do Clock.Text = os.date("%I:%M %p") DateLabel.Text = os.date("%A, %B %d") task.wait(1) end end) print("CRIMSON iPAD OS 2.0 LOADED!") print("Tap the floating C to toggle your tablet.")