
KeylessUniversal

-- FunGui.lua (LocalScript)
-- Place in StarterPlayerScripts
local Players = game:GetService("Players")
local TweenService = game:GetService("TweenService")
local RunService = game:GetService("RunService")
local UserInputService = game:GetService("UserInputService")
local player = Players.LocalPlayer
local playerGui = player:WaitForChild("PlayerGui")
----------------------------------------------------------------
-- CONFIG STATE
----------------------------------------------------------------
local Config = {
BorderColor = Color3.fromRGB(0, 170, 255),
BackgroundColor = Color3.fromRGB(35, 35, 40),
RGBBorder = false,
Font = Enum.Font.GothamBold,
}
local Modifiers = {
LimitedVision = false,
QuickClick = false,
SoundCue = false,
SillyPopup = false,
}
local activeConnections = {} -- track loops so we can cancel them on "remove modifiers"
----------------------------------------------------------------
-- ROOT GUI
----------------------------------------------------------------
local screenGui = Instance.new("ScreenGui")
screenGui.Name = "FunGui"
screenGui.ResetOnSpawn = false
screenGui.ZIndexBehavior = Enum.ZIndexBehavior.Sibling
screenGui.Parent = playerGui
----------------------------------------------------------------
-- MODAL / INPUT BLOCKER SYSTEM
-- While a minigame window is open, this transparent frame sits
-- above every other button and eats their clicks. The game
-- window itself is given a higher ZIndex so it stays usable.
----------------------------------------------------------------
local blocker = Instance.new("Frame")
blocker.Name = "InputBlocker"
blocker.Size = UDim2.new(1, 0, 1, 0)
blocker.BackgroundTransparency = 1
blocker.Active = true
blocker.Visible = false
blocker.ZIndex = 90
blocker.Parent = screenGui
local currentGame = nil
local function isGameActive()
return currentGame ~= nil and currentGame.Parent ~= nil
end
local function setGameActive(active, window)
blocker.Visible = active
if active then
currentGame = window
if window then
window.ZIndex = 100
end
else
currentGame = nil
end
end
----------------------------------------------------------------
-- UTILITY
----------------------------------------------------------------
local function makeDraggable(topBar, frame)
local dragging, dragInput, dragStart, startPos
topBar.InputBegan:Connect(function(input)
if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then
dragging = true
dragStart = input.Position
startPos = frame.Position
input.Changed:Connect(function()
if input.UserInputState == Enum.UserInputState.End then
dragging = false
end
end)
end
end)
topBar.InputChanged:Connect(function(input)
if input.UserInputType == Enum.UserInputType.MouseMovement or input.UserInputType == Enum.UserInputType.Touch then
dragInput = input
end
end)
UserInputService.InputChanged:Connect(function(input)
if input == dragInput and dragging then
local delta = input.Position - dragStart
frame.Position = UDim2.new(
startPos.X.Scale, startPos.X.Offset + delta.X,
startPos.Y.Scale, startPos.Y.Offset + delta.Y
)
end
end)
end
local function newWindow(name, size, title)
local frame = Instance.new("Frame")
frame.Name = name
frame.Size = size
frame.Position = UDim2.new(0.5, -size.X.Offset / 2, 0.5, -size.Y.Offset / 2)
frame.BackgroundColor3 = Config.BackgroundColor
frame.BorderSizePixel = 0
frame.Parent = screenGui
local corner = Instance.new("UICorner")
corner.CornerRadius = UDim.new(0, 10)
corner.Parent = frame
local stroke = Instance.new("UIStroke")
stroke.Thickness = 3
stroke.Color = Config.BorderColor
stroke.Parent = frame
local topBar = Instance.new("Frame")
topBar.Name = "TopBar"
topBar.Size = UDim2.new(1, 0, 0, 36)
topBar.BackgroundColor3 = Config.BorderColor
topBar.BorderSizePixel = 0
topBar.Parent = frame
local topCorner = Instance.new("UICorner")
topCorner.CornerRadius = UDim.new(0, 10)
topCorner.Parent = topBar
local titleLabel = Instance.new("TextLabel")
titleLabel.BackgroundTransparency = 1
titleLabel.Size = UDim2.new(1, -40, 1, 0)
titleLabel.Position = UDim2.new(0, 10, 0, 0)
titleLabel.Font = Config.Font
titleLabel.Text = title
titleLabel.TextColor3 = Color3.new(1, 1, 1)
titleLabel.TextXAlignment = Enum.TextXAlignment.Left
titleLabel.TextSize = 18
titleLabel.Parent = topBar
local closeBtn = Instance.new("TextButton")
closeBtn.Name = "CloseButton"
closeBtn.Size = UDim2.new(0, 28, 0, 28)
closeBtn.Position = UDim2.new(1, -32, 0, 4)
closeBtn.BackgroundColor3 = Color3.fromRGB(200, 60, 60)
closeBtn.Text = "X"
closeBtn.Font = Config.Font
closeBtn.TextColor3 = Color3.new(1, 1, 1)
closeBtn.Parent = topBar
local closeCorner = Instance.new("UICorner")
closeCorner.CornerRadius = UDim.new(0, 6)
closeCorner.Parent = closeBtn
closeBtn.MouseButton1Click:Connect(function()
frame:Destroy()
end)
makeDraggable(topBar, frame)
return frame, stroke, titleLabel
end
local function newButton(parent, text, size, pos)
local btn = Instance.new("TextButton")
btn.Size = size
btn.Position = pos
btn.BackgroundColor3 = Config.BackgroundColor
btn.Text = text
btn.Font = Config.Font
btn.TextColor3 = Color3.new(1, 1, 1)
btn.TextSize = 16
btn.Parent = parent
local stroke = Instance.new("UIStroke")
stroke.Thickness = 2
stroke.Color = Config.BorderColor
stroke.Parent = btn
local corner = Instance.new("UICorner")
corner.CornerRadius = UDim.new(0, 8)
corner.Parent = btn
return btn
end
----------------------------------------------------------------
-- MAIN GUI
----------------------------------------------------------------
local main = Instance.new("Frame")
main.Name = "MainWindow"
main.Size = UDim2.new(0, 260, 0, 340)
main.Position = UDim2.new(0.02, 0, 0.2, 0)
main.BackgroundColor3 = Config.BackgroundColor
main.BorderSizePixel = 0
main.Parent = screenGui
local mainCorner = Instance.new("UICorner")
mainCorner.CornerRadius = UDim.new(0, 10)
mainCorner.Parent = main
local mainStroke = Instance.new("UIStroke")
mainStroke.Thickness = 3
mainStroke.Color = Config.BorderColor
mainStroke.Parent = main
local mainTop = Instance.new("Frame")
mainTop.Size = UDim2.new(1, 0, 0, 40)
mainTop.BackgroundColor3 = Config.BorderColor
mainTop.BorderSizePixel = 0
mainTop.Parent = main
local mainTopCorner = Instance.new("UICorner")
mainTopCorner.CornerRadius = UDim.new(0, 10)
mainTopCorner.Parent = mainTop
local titleText = Instance.new("TextLabel")
titleText.BackgroundTransparency = 1
titleText.Size = UDim2.new(1, -40, 1, 0)
titleText.Position = UDim2.new(0, 10, 0, 0)
titleText.Font = Config.Font
titleText.Text = "Fun GUI"
titleText.TextColor3 = Color3.new(1, 1, 1)
titleText.TextSize = 22
titleText.TextXAlignment = Enum.TextXAlignment.Left
titleText.Parent = mainTop
-- Close button for the main window
local mainCloseBtn = Instance.new("TextButton")
mainCloseBtn.Size = UDim2.new(0, 28, 0, 28)
mainCloseBtn.Position = UDim2.new(1, -34, 0, 6)
mainCloseBtn.BackgroundColor3 = Color3.fromRGB(200, 60, 60)
mainCloseBtn.Text = "X"
mainCloseBtn.Font = Config.Font
mainCloseBtn.TextColor3 = Color3.new(1, 1, 1)
mainCloseBtn.Parent = mainTop
local mainCloseCorner = Instance.new("UICorner")
mainCloseCorner.CornerRadius = UDim.new(0, 6)
mainCloseCorner.Parent = mainCloseBtn
mainCloseBtn.MouseButton1Click:Connect(function()
screenGui:Destroy()
end)
makeDraggable(mainTop, main)
local scrollFrame = Instance.new("ScrollingFrame")
scrollFrame.Size = UDim2.new(1, -20, 1, -60)
scrollFrame.Position = UDim2.new(0, 10, 0, 50)
scrollFrame.BackgroundTransparency = 1
scrollFrame.BorderSizePixel = 0
scrollFrame.ScrollBarThickness = 6
scrollFrame.CanvasSize = UDim2.new(0, 0, 0, 220)
scrollFrame.Parent = main
local layout = Instance.new("UIListLayout")
layout.Padding = UDim.new(0, 12)
layout.Parent = scrollFrame
local minigamesBtn = newButton(scrollFrame, "Minigames", UDim2.new(1, 0, 0, 50), UDim2.new(0, 0, 0, 0))
local configBtn = newButton(scrollFrame, "Config", UDim2.new(1, 0, 0, 50), UDim2.new(0, 0, 0, 0))
local modifiersBtn = newButton(scrollFrame, "Modifiers", UDim2.new(1, 0, 0, 50), UDim2.new(0, 0, 0, 0))
----------------------------------------------------------------
-- STYLE REFRESH (applies Config to all live elements)
----------------------------------------------------------------
local allStrokes = {mainStroke}
local allFontObjects = {titleText}
local allBgObjects = {main}
local allTopBars = {mainTop}
local function applyStyle()
for _, s in ipairs(allStrokes) do
if s and s.Parent then s.Color = Config.BorderColor end
end
for _, t in ipairs(allTopBars) do
if t and t.Parent then t.BackgroundColor3 = Config.BorderColor end
end
for _, f in ipairs(allFontObjects) do
if f and f.Parent then f.Font = Config.Font end
end
for _, b in ipairs(allBgObjects) do
if b and b.Parent then b.BackgroundColor3 = Config.BackgroundColor end
end
end
----------------------------------------------------------------
-- RGB BORDER LOOP
----------------------------------------------------------------
local rgbConn
local function startRGB()
if rgbConn then return end
local hue = 0
rgbConn = RunService.RenderStepped:Connect(function(dt)
if not Config.RGBBorder then return end
hue = (hue + dt * 0.15) % 1
Config.BorderColor = Color3.fromHSV(hue, 1, 1)
applyStyle()
end)
end
startRGB()
----------------------------------------------------------------
-- CONFIG WINDOW
----------------------------------------------------------------
local function openConfig()
if screenGui:FindFirstChild("ConfigWindow") then return end
local win = newWindow("ConfigWindow", UDim2.new(0, 300, 0, 400), "Config")
table.insert(allStrokes, win.UIStroke)
local list = Instance.new("UIListLayout")
list.Padding = UDim.new(0, 10)
list.Parent = win
local pad = Instance.new("UIPadding")
pad.PaddingTop = UDim.new(0, 46)
pad.PaddingLeft = UDim.new(0, 10)
pad.PaddingRight = UDim.new(0, 10)
pad.Parent = win
local borderColorBtn = newButton(win, "Change Border Color", UDim2.new(1, 0, 0, 40), UDim2.new(0, 0, 0, 0))
local bgColorBtn = newButton(win, "Change Background Color", UDim2.new(1, 0, 0, 40), UDim2.new(0, 0, 0, 0))
local rgbBtn = newButton(win, "Toggle RGB Border: OFF", UDim2.new(1, 0, 0, 40), UDim2.new(0, 0, 0, 0))
local fontBtn = newButton(win, "Change Font", UDim2.new(1, 0, 0, 40), UDim2.new(0, 0, 0, 0))
local resetBtn = newButton(win, "Remove All Modifiers", UDim2.new(1, 0, 0, 40), UDim2.new(0, 0, 0, 0))
local colorOptions = {
Color3.fromRGB(0, 170, 255),
Color3.fromRGB(255, 60, 60),
Color3.fromRGB(60, 255, 100),
Color3.fromRGB(255, 200, 0),
Color3.fromRGB(180, 80, 255),
}
local bgOptions = {
Color3.fromRGB(35, 35, 40),
Color3.fromRGB(20, 20, 25),
Color3.fromRGB(50, 30, 30),
Color3.fromRGB(25, 45, 35),
}
local fontOptions = {
Enum.Font.GothamBold,
Enum.Font.SourceSansBold,
Enum.Font.Cartoon,
Enum.Font.Fantasy,
Enum.Font.Code,
}
local colorIndex, bgIndex, fontIndex = 1, 1, 1
borderColorBtn.MouseButton1Click:Connect(function()
if Config.RGBBorder then return end
colorIndex = (colorIndex % #colorOptions) + 1
Config.BorderColor = colorOptions[colorIndex]
applyStyle()
end)
bgColorBtn.MouseButton1Click:Connect(function()
bgIndex = (bgIndex % #bgOptions) + 1
Config.BackgroundColor = bgOptions[bgIndex]
applyStyle()
end)
rgbBtn.MouseButton1Click:Connect(function()
Config.RGBBorder = not Config.RGBBorder
rgbBtn.Text = "Toggle RGB Border: " .. (Config.RGBBorder and "ON" or "OFF")
end)
fontBtn.MouseButton1Click:Connect(function()
fontIndex = (fontIndex % #fontOptions) + 1
Config.Font = fontOptions[fontIndex]
applyStyle()
end)
resetBtn.MouseButton1Click:Connect(function()
for key in pairs(Modifiers) do
Modifiers[key] = false
end
for _, conn in ipairs(activeConnections) do
if conn then conn:Disconnect() end
end
activeConnections = {}
local overlay = screenGui:FindFirstChild("VisionOverlay")
if overlay then overlay:Destroy() end
resetBtn.Text = "Modifiers Removed!"
task.delay(1.2, function()
if resetBtn and resetBtn.Parent then
resetBtn.Text = "Remove All Modifiers"
end
end)
end)
end
----------------------------------------------------------------
-- MODIFIERS WINDOW (all harmless)
----------------------------------------------------------------
local function startQuickClick()
local conn
conn = task.spawn(function()
while Modifiers.QuickClick do
task.wait(math.random(6, 12))
if not Modifiers.QuickClick then break end
local btn = Instance.new("TextButton")
btn.Size = UDim2.new(0, 70, 0, 70)
btn.Position = UDim2.new(math.random(10, 80) / 100, 0, math.random(10, 80) / 100, 0)
btn.BackgroundColor3 = Color3.fromRGB(255, 210, 0)
btn.Text = "Click!"
btn.Font = Config.Font
btn.TextColor3 = Color3.new(0, 0, 0)
btn.Parent = screenGui
local corner = Instance.new("UICorner")
corner.CornerRadius = UDim.new(1, 0)
corner.Parent = btn
local clicked = false
btn.MouseButton1Click:Connect(function()
clicked = true
btn:Destroy()
end)
task.delay(2, function()
if not clicked and btn.Parent then
local tint = Instance.new("Frame")
tint.Size = UDim2.new(1, 0, 1, 0)
tint.BackgroundColor3 = Color3.fromRGB(255, 255, 255)
tint.BackgroundTransparency = 0.85
tint.ZIndex = 50
tint.Parent = screenGui
TweenService:Create(tint, TweenInfo.new(0.6), {BackgroundTransparency = 1}):Play()
task.delay(0.6, function() tint:Destroy() end)
btn:Destroy()
end
end)
end
end)
table.insert(activeConnections, conn)
end
local function startSoundCue()
local conn
conn = task.spawn(function()
while Modifiers.SoundCue do
task.wait(math.random(60, 150))
if not Modifiers.SoundCue then break end
local sound = Instance.new("Sound")
sound.SoundId = "rbxassetid://6042053626" -- soft chime, short, not loud
sound.Volume = 0.4
sound.Parent = screenGui
sound:Play()
game:GetService("Debris"):AddItem(sound, 3)
end
end)
table.insert(activeConnections, conn)
end
local function startSillyPopup()
local conn
conn = task.spawn(function()
while Modifiers.SillyPopup do
task.wait(math.random(90, 180))
if not Modifiers.SillyPopup then break end
local popup = Instance.new("Frame")
popup.Size = UDim2.new(0, 220, 0, 100)
popup.Position = UDim2.new(math.random(20, 60) / 100, 0, math.random(20, 60) / 100, 0)
popup.BackgroundColor3 = Color3.fromRGB(255, 240, 200)
popup.Parent = screenGui
local corner = Instance.new("UICorner")
corner.CornerRadius = UDim.new(0, 10)
corner.Parent = popup
local label = Instance.new("TextLabel")
label.Size = UDim2.new(1, -10, 1, -40)
label.Position = UDim2.new(0, 5, 0, 5)
label.BackgroundTransparency = 1
label.Text = "Gotcha! 😄 Just a silly popup."
label.Font = Config.Font
label.TextWrapped = true
label.TextColor3 = Color3.new(0, 0, 0)
label.Parent = popup
local okBtn = newButton(popup, "OK", UDim2.new(0, 80, 0, 28), UDim2.new(0.5, -40, 1, -34))
okBtn.MouseButton1Click:Connect(function()
popup:Destroy()
end)
end
end)
table.insert(activeConnections, conn)
end
local function toggleLimitedVision(on)
local existing = screenGui:FindFirstChild("VisionOverlay")
if on then
if existing then return end
local overlay = Instance.new("Frame")
overlay.Name = "VisionOverlay"
overlay.Size = UDim2.new(0.25, 0, 1, 0)
overlay.Position = UDim2.new(0.75, 0, 0, 0)
overlay.BackgroundColor3 = Color3.fromRGB(0, 0, 0)
overlay.BackgroundTransparency = 0.15
overlay.BorderSizePixel = 0
overlay.ZIndex = 40
overlay.Parent = screenGui
else
if existing then existing:Destroy() end
end
end
local function openModifiers()
if screenGui:FindFirstChild("ModifiersWindow") then return end
local win = newWindow("ModifiersWindow", UDim2.new(0, 320, 0, 380), "Modifiers")
table.insert(allStrokes, win.UIStroke)
local pad = Instance.new("UIPadding")
pad.PaddingTop = UDim.new(0, 46)
pad.PaddingLeft = UDim.new(0, 10)
pad.PaddingRight = UDim.new(0, 10)
pad.Parent = win
local list = Instance.new("UIListLayout")
list.Padding = UDim.new(0, 10)
list.Parent = win
local function makeToggle(name, key, onStart)
local btn = newButton(win, name .. ": OFF", UDim2.new(1, 0, 0, 45), UDim2.new(0, 0, 0, 0))
btn.MouseButton1Click:Connect(function()
Modifiers[key] = not Modifiers[key]
btn.Text = name .. ": " .. (Modifiers[key] and "ON" or "OFF")
if Modifiers[key] then
onStart()
end
end)
return btn
end
makeToggle("Limited Vision", "LimitedVision", function()
toggleLimitedVision(true)
end)
makeToggle("Quick Click", "QuickClick", startQuickClick)
makeToggle("Sound Cue", "SoundCue", startSoundCue)
makeToggle("Silly Popup", "SillyPopup", startSillyPopup)
task.spawn(function()
while win.Parent do
toggleLimitedVision(Modifiers.LimitedVision)
task.wait(0.5)
end
end)
end
----------------------------------------------------------------
-- MINIGAMES: "PC" LAUNCHER WINDOW
----------------------------------------------------------------
-- PING PONG (rebuilt: proper paddle sync, correct bounce math,
-- cleaned-up connections so it doesn't leak or desync)
local function openPingPong()
if isGameActive() then return end
local win = newWindow("PingPongGame", UDim2.new(0, 400, 0, 320), "Ping Pong")
table.insert(allStrokes, win.UIStroke)
setGameActive(true, win)
local court = Instance.new("Frame")
court.Size = UDim2.new(1, -20, 1, -60)
court.Position = UDim2.new(0, 10, 0, 46)
court.BackgroundColor3 = Color3.fromRGB(10, 10, 15)
court.ClipsDescendants = true
court.Parent = win
local paddle = Instance.new("Frame")
paddle.Size = UDim2.new(0, 10, 0, 60)
paddle.Position = UDim2.new(0, 10, 0, 0)
paddle.BackgroundColor3 = Color3.new(1, 1, 1)
paddle.Parent = court
local ball = Instance.new("Frame")
ball.Size = UDim2.new(0, 14, 0, 14)
ball.BackgroundColor3 = Color3.new(1, 1, 1)
ball.Parent = court
local scoreLabel = Instance.new("TextLabel")
scoreLabel.Size = UDim2.new(1, 0, 0, 20)
scoreLabel.BackgroundTransparency = 1
scoreLabel.Text = "Score: 0"
scoreLabel.Font = Config.Font
scoreLabel.TextColor3 = Color3.new(1, 1, 1)
scoreLabel.Parent = court
local running = true
local score = 0
local baseSpeed = Vector2.new(180, 120)
local velocity = baseSpeed
local pos = Vector2.new(0, 0)
-- keep paddle centered on cursor/finger, clamped inside the court
local inputConn
inputConn = UserInputService.InputChanged:Connect(function(input)
if not running then return end
if input.UserInputType == Enum.UserInputType.MouseMovement
or input.UserInputType == Enum.UserInputType.Touch then
local h = paddle.AbsoluteSize.Y
local courtH = court.AbsoluteSize.Y
local relY = (input.Position.Y - court.AbsolutePosition.Y) - h / 2
relY = math.clamp(relY, 0, math.max(0, courtH - h))
paddle.Position = UDim2.new(0, 10, 0, relY)
end
end)
local hbConn
local function stopGame()
if not running then return end
running = false
if hbConn then hbConn:Disconnect() end
if inputConn then inputConn:Disconnect() end
setGameActive(false)
end
win.Destroying:Connect(stopGame)
-- wait one frame so AbsoluteSize is valid before starting
task.wait()
local size = court.AbsoluteSize
pos = Vector2.new(size.X / 2, size.Y / 2)
hbConn = RunService.Heartbeat:Connect(function(dt)
if not running or not win.Parent then return end
size = court.AbsoluteSize
if size.X <= 0 or size.Y <= 0 then return end
pos = pos + velocity * dt
-- bounce off top/bottom
if pos.Y <= 7 then
pos = Vector2.new(pos.X, 7)
velocity = Vector2.new(velocity.X, math.abs(velocity.Y))
elseif pos.Y >= size.Y - 7 then
pos = Vector2.new(pos.X, size.Y - 7)
velocity = Vector2.new(velocity.X, -math.abs(velocity.Y))
end
-- bounce off right wall
if pos.X >= size.X - 7 then
pos = Vector2.new(size.X - 7, pos.Y)
velocity = Vector2.new(-math.abs(velocity.X), velocity.Y)
end
-- paddle collision / miss on the left
if pos.X <= 20 then
local paddleTop = paddle.Position.Y.Offset
local paddleBottom = paddleTop + paddle.AbsoluteSize.Y
if pos.Y >= paddleTop and pos.Y <= paddleBottom then
pos = Vector2.new(20, pos.Y)
local newSpeedX = math.min(math.abs(velocity.X) * 1.05, 500)
velocity = Vector2.new(newSpeedX, velocity.Y)
score += 1
scoreLabel.Text = "Score: " .. score
elseif pos.X <= 0 then
pos = Vector2.new(size.X / 2, size.Y / 2)
velocity = baseSpeed
score = 0
scoreLabel.Text = "Score: 0 (missed!)"
end
end
ball.Position = UDim2.new(0, pos.X - 7, 0, pos.Y - 7)
end)
end
-- MINESWEEPER (with a mobile-friendly Flag Mode toggle)
local function openMinesweeper()
if isGameActive() then return end
local win = newWindow("MinesweeperGame", UDim2.new(0, 340, 0, 440), "Minesweeper")
table.insert(allStrokes, win.UIStroke)
setGameActive(true, win)
win.Destroying:Connect(function() setGameActive(false) end)
local flagMode = false
local flagModeBtn = Instance.new("TextButton")
flagModeBtn.Size = UDim2.new(1, -20, 0, 34)
flagModeBtn.Position = UDim2.new(0, 10, 0, 44)
flagModeBtn.BackgroundColor3 = Config.BackgroundColor
flagModeBtn.Text = "Flag Mode: OFF (tap to toggle)"
flagModeBtn.Font = Config.Font
flagModeBtn.TextColor3 = Color3.new(1, 1, 1)
flagModeBtn.TextSize = 14
flagModeBtn.Parent = win
local flagStroke = Instance.new("UIStroke")
flagStroke.Thickness = 2
flagStroke.Color = Config.BorderColor
flagStroke.Parent = flagModeBtn
table.insert(allStrokes, flagStroke)
local flagCorner = Instance.new("UICorner")
flagCorner.CornerRadius = UDim.new(0, 8)
flagCorner.Parent = flagModeBtn
local grid = Instance.new("Frame")
grid.Size = UDim2.new(1, -20, 1, -130)
grid.Position = UDim2.new(0, 10, 0, 86)
grid.BackgroundTransparency = 1
grid.Parent = win
local gridLayout = Instance.new("UIGridLayout")
gridLayout.CellSize = UDim2.new(0, 36, 0, 36)
gridLayout.CellPadding = UDim2.new(0, 2, 0, 2)
gridLayout.Parent = grid
flagModeBtn.MouseButton1Click:Connect(function()
flagMode = not flagMode
flagModeBtn.Text = flagMode
and "Flag Mode: ON (tap tiles to flag)"
or "Flag Mode: OFF (tap to toggle)"
flagModeBtn.BackgroundColor3 = flagMode and Color3.fromRGB(90, 70, 20) or Config.BackgroundColor
end)
local size = 8
local mineCount = 10
local cells = {}
local mines = {}
for i = 1, mineCount do
local p
repeat
p = math.random(1, size * size)
until not mines[p]
mines[p] = true
end
local function neighbors(index)
local x = (index - 1) % size
local y = math.floor((index - 1) / size)
local result = {}
for dx = -1, 1 do
for dy = -1, 1 do
if not (dx == 0 and dy == 0) then
local nx, ny = x + dx, y + dy
if nx >= 0 and nx < size and ny >= 0 and ny < size then
table.insert(result, ny * size + nx + 1)
end
end
end
end
return result
end
local gameOver = false
local function reveal(index)
if gameOver then return end
local cellData = cells[index]
if cellData.revealed or cellData.flagged then return end
cellData.revealed = true
if mines[index] then
cellData.button.BackgroundColor3 = Color3.fromRGB(255, 80, 80)
cellData.button.Text = "*"
gameOver = true
for i, c in pairs(cells) do
if mines[i] then
c.button.Text = "*"
end
end
return
end
local count = 0
for _, n in ipairs(neighbors(index)) do
if mines[n] then count += 1 end
end
cellData.button.BackgroundColor3 = Color3.fromRGB(60, 60, 70)
cellData.button.Text = count > 0 and tostring(count) or ""
if count == 0 then
for _, n in ipairs(neighbors(index)) do
reveal(n)
end
end
end
for i = 1, size * size do
local btn = Instance.new("TextButton")
btn.BackgroundColor3 = Color3.fromRGB(90, 90, 100)
btn.Text = ""
btn.Font = Config.Font
btn.TextColor3 = Color3.new(1, 1, 1)
btn.LayoutOrder = i
btn.Parent = grid
local corner = Instance.new("UICorner")
corner.CornerRadius = UDim.new(0, 4)
corner.Parent = btn
cells[i] = {button = btn, revealed = false, flagged = false}
btn.MouseButton1Click:Connect(function()
if flagMode then
if gameOver or cells[i].revealed then return end
cells[i].flagged = not cells[i].flagged
btn.Text = cells[i].flagged and "F" or ""
else
reveal(i)
end
end)
-- desktop right-click flagging still works regardless of Flag Mode
btn.MouseButton2Click:Connect(function()
if gameOver or cells[i].revealed then return end
cells[i].flagged = not cells[i].flagged
btn.Text = cells[i].flagged and "F" or ""
end)
end
end
-- CATCH THE LIGHTBULB
local function openCatchLightbulb()
if isGameActive() then return end
local win = newWindow("CatchLightbulbGame", UDim2.new(0, 380, 0, 320), "Catch the Lightbulb")
table.insert(allStrokes, win.UIStroke)
setGameActive(true, win)
local area = Instance.new("Frame")
area.Size = UDim2.new(1, -20, 1, -70)
area.Position = UDim2.new(0, 10, 0, 46)
area.BackgroundColor3 = Color3.fromRGB(15, 15, 20)
area.ClipsDescendants = true
area.Parent = win
local scoreLabel = Instance.new("TextLabel")
scoreLabel.Size = UDim2.new(1, 0, 0, 20)
scoreLabel.Position = UDim2.new(0, 0, 1, -20)
scoreLabel.BackgroundTransparency = 1
scoreLabel.Text = "Score: 0"
scoreLabel.Font = Config.Font
scoreLabel.TextColor3 = Color3.new(1, 1, 1)
scoreLabel.Parent = win
local bulb = Instance.new("TextButton")
bulb.Size = UDim2.new(0, 50, 0, 50)
bulb.BackgroundColor3 = Color3.fromRGB(255, 230, 100)
bulb.Text = "💡"
bulb.TextSize = 24
bulb.Parent = area
local bulbCorner = Instance.new("UICorner")
bulbCorner.CornerRadius = UDim.new(1, 0)
bulbCorner.Parent = bulb
local score = 0
local running = true
win.Destroying:Connect(function()
running = false
setGameActive(false)
end)
local function moveBulb()
local x = math.random(0, math.max(0, area.AbsoluteSize.X - 50))
local y = math.random(0, math.max(0, area.AbsoluteSize.Y - 50))
bulb.Position = UDim2.new(0, x, 0, y)
end
bulb.MouseButton1Click:Connect(function()
score += 1
scoreLabel.Text = "Score: " .. score
moveBulb()
end)
task.spawn(function()
while running and win.Parent do
task.wait(1.5)
if running and win.Parent then
moveBulb()
end
end
end)
moveBulb()
end
local function openMinigames()
if screenGui:FindFirstChild("MinigamesLauncher") then return end
local win = newWindow("MinigamesLauncher", UDim2.new(0, 300, 0, 260), "Minigames PC")
table.insert(allStrokes, win.UIStroke)
local pad = Instance.new("UIPadding")
pad.PaddingTop = UDim.new(0, 46)
pad.PaddingLeft = UDim.new(0, 10)
pad.PaddingRight = UDim.new(0, 10)
pad.Parent = win
local list = Instance.new("UIListLayout")
list.Padding = UDim.new(0, 10)
list.Parent = win
local pingBtn = newButton(win, "Ping Pong", UDim2.new(1, 0, 0, 45), UDim2.new(0, 0, 0, 0))
local mineBtn = newButton(win, "Minesweeper", UDim2.new(1, 0, 0, 45), UDim2.new(0, 0, 0, 0))
local bulbBtn = newButton(win, "Catch a Lightbulb", UDim2.new(1, 0, 0, 45), UDim2.new(0, 0, 0, 0))
pingBtn.MouseButton1Click:Connect(openPingPong)
mineBtn.MouseButton1Click:Connect(openMinesweeper)
bulbBtn.MouseButton1Click:Connect(openCatchLightbulb)
end
----------------------------------------------------------------
-- WIRE UP MAIN BUTTONS
----------------------------------------------------------------
minigamesBtn.MouseButton1Click:Connect(openMinigames)
configBtn.MouseButton1Click:Connect(openConfig)
modifiersBtn.MouseButton1Click:Connect(openModifiers)No comments yet for this script.



