UnpatchaBomb (4th of july)
Key Required

UnpatchaBomb (4th of july)

Word Bombalsotwentycharactersalsotwentycharacters 1.7K views 512 executesUpdated Jun 29, 2026
5.0/ 5(2 votes)
20100% Positive
Lua Script•738 lines (26644 chars)
-- made by aedynjames17 on scriptblox
-- feel free to modify the script or contribute to it
-- new gui coming soon
local Services = {
    Players = game:GetService("Players"),
    ReplicatedStorage = game:GetService("ReplicatedStorage"),
    VirtualInputManager = game:GetService("VirtualInputManager"),
    UserInputService = game:GetService("UserInputService"),
    TweenService = game:GetService("TweenService"),
    RunService = game:GetService("RunService"),
    CoreGui = game:GetService("CoreGui")
}

local LocalPlayer = Services.Players.LocalPlayer

pcall(function()
    loadstring(game:HttpGet("https://raw.githubusercontent.com/MarsQQ/Unpatchabomb/master/unpatchabomb_english_words", true))()
end)

local WordList = {}
pcall(function()
    WordList = loadstring(game:HttpGet("https://raw.githubusercontent.com/jjengu/scripts/refs/heads/main/wordbomb/words.lua"))() or {}
end)

local WordList_Two = {}
pcall(function()
    WordList_Two = loadstring(game:HttpGet("https://raw.githubusercontent.com/jjengu/scripts/refs/heads/main/wordbomb/words_two.lua"))() or {}
end)

local WordList_Three = {
    "pseudopseudohypoparathyroidism", "floccinaucinihilipilification",
    "antidisestablishmentarianism", "supercalifragilisticexpialidocious",
    "hexakosioihexekontahexaphobia", "dichlorodiphenyltrichloroethane",
    "electroencephalographically", "xenotransplantations",
    "counterdemonstrations", "characteristically",
    "unconstitutionality", "intercontinental",
    "phenomenological", "oversimplification",
    "disenfranchisement", "incompatibilities",
    "thermodynamically", "magnetohydrodynamics",
    "uncharacteristically", "electroencephalogram",
    "counterrevolutionary", "internationalization",
    "counterproductive", "environmentalists",
    "telecommunications", "immunohistochemistry",
    "hypercholesterolemia", "incomprehensibilities",
    "deinstitutionalization", "psychopharmacological",
    "reconceptualizations", "reindustrialization",
    "spectroscopically", "standardizations",
    "vulnerabilities", "westernization", "xenotransplantation",
    "sphenopalatineganglioneuralgia", "duos", "duo", 
    "immunochemesties", "army", "haha", "hah",
}

local MegaList = {}
local function merge(tbl)
    if type(tbl) ~= "table" then return end
    for _, v in pairs(tbl) do
        if type(v) == "string" then MegaList[#MegaList + 1] = v end
    end
end

if type(ENGLISH_WORDS) == "table" then merge(ENGLISH_WORDS) end
merge(WordList)
merge(WordList_Two)
merge(WordList_Three)

local seen = {}
local UniqueMegaList = {}
for _, word in ipairs(MegaList) do
    local lower = string.lower(word)
    if not seen[lower] then
        seen[lower] = true
        UniqueMegaList[#UniqueMegaList + 1] = word
    end
end

local FinalWordList = UniqueMegaList

local TypoNeighbours = {
    a="s", b="v", c="v", d="f", e="w", f="d", g="h", h="j",
    i="o", j="h", k="l", l="k", m="n", n="m", o="i", p="o",
    q="w", r="t", s="a", t="r", u="y", v="c", w="e", x="z",
    y="u", z="x",
}

local Games = Services.ReplicatedStorage:WaitForChild("Network", 10)
if Games then Games = Games:WaitForChild("Games", 10) end

local GameID  = "-1"
local UsedWords  = {}
local Typing     = false
local TypingActive = false
local LastWord   = ""

local Settings = {
    WordList      = 0,
    AutoType      = false,
    AutoJoin      = false,
    WPM           = 120,
    WordTypeDelay = 0.3,
    HumaniseWPM   = true,
    ReactionTime  = 0.35,
    TypoChance    = 0.04,
    BurstMin      = 3,
    BurstMax      = 7,
    MinLen        = 1,
    MaxLen        = 99
}

local burstCounter  = 0
local burstTarget   = math.random(3, 7)

local function GetLetterDelay()
    local base = 60 / (Settings.WPM * 5)
    if Settings.HumaniseWPM then
        local roll = math.random()
        if roll < 0.15 then
            base = base * (0.35 + math.random() * 0.25)
        elseif roll < 0.80 then
            base = base * (0.80 + math.random() * 0.40)
        else
            base = base * (1.20 + math.random() * 0.60)
        end
        burstCounter = burstCounter + 1
        if burstCounter >= burstTarget then
            burstCounter = 0
            burstTarget  = math.random(Settings.BurstMin, Settings.BurstMax)
            base = base + (0.04 + math.random() * 0.08)
        end
    end
    return math.max(base, 0.005)
end

local alreadyUsed = {}

local function tableItemExists(array, val)
    for _, v in pairs(array) do if v == val then return true end end
    return false
end

local function findWord(str)
    local best, bestLen = nil, 0
    local lowerStr = string.lower(str)
    for _, v in ipairs(FinalWordList) do
        if string.find(string.lower(v), lowerStr, 1, true) and not tableItemExists(alreadyUsed, v) then
            if #v >= Settings.MinLen and #v <= Settings.MaxLen and #v > bestLen then
                best = v
                bestLen = #v
            end
        end
    end
    if best then table.insert(alreadyUsed, best) end
    return best
end

local function FindWordAuto(l)
    if not l or l == "" then return nil end
    local lowerL = string.lower(l)
    local best, bestLen = nil, 0

    for _, v in ipairs(FinalWordList) do
        local lv = string.lower(v)
        if string.find(lv, lowerL, 1, true)
            and not table.find(UsedWords, string.upper(v))
            and string.upper(v) ~= LastWord
            and #v >= Settings.MinLen
            and #v <= Settings.MaxLen
            and #v > bestLen
        then
            best = v
            bestLen = #v
        end
    end

    if best then 
        table.insert(UsedWords, string.upper(best))
        return string.upper(best) 
    end
    return nil
end

local function GetTurn()
    local s, r = pcall(function()
        for _, v in pairs(getgc()) do
            if type(v) == "function" and debug.getinfo(v).name == "updateInfoFrame" then
                for __, vv in ipairs(debug.getupvalues(v)) do
                    if type(vv) == "table" and vv.PlayerID ~= nil then return vv.PlayerID end
                end
            end
        end
    end)
    if s and r then return r end
    return nil
end

local function GetLetters()
    local s, r = pcall(function()
        for _, v in pairs(getgc()) do
            if type(v) == "function" and debug.getinfo(v).name == "updateInfoFrame" then
                for __, vv in pairs(debug.getupvalues(v)) do
                    if type(vv) == "table" and vv.Prompt ~= nil then return vv.Prompt end
                end
            end
        end
    end)
    if s and r then return r end

    local PlayerGui = LocalPlayer:FindFirstChild("PlayerGui")
    if PlayerGui then
        local PromptLbl = PlayerGui:FindFirstChild("PromptLabel", true)
        if PromptLbl then return PromptLbl.Text end
    end
    return ""
end

local function SimulateKey(character)
    local keyCode
    if character == "\n" or character == "\r" then
        keyCode = Enum.KeyCode.Return
    else
        pcall(function() keyCode = Enum.KeyCode[string.upper(character)] end)
    end
    if keyCode then
        Services.VirtualInputManager:SendKeyEvent(true,  keyCode, false, game)
        task.wait(0.01)
        Services.VirtualInputManager:SendKeyEvent(false, keyCode, false, game)
    end
end

local function SimulateBackspace()
    Services.VirtualInputManager:SendKeyEvent(true,  Enum.KeyCode.Backspace, false, game)
    task.wait(0.01)
    Services.VirtualInputManager:SendKeyEvent(false, Enum.KeyCode.Backspace, false, game)
end

if Services.CoreGui:FindFirstChild("Unpatchabomb") then
    Services.CoreGui.Unpatchabomb:Destroy()
end

local Unpatchabomb = Instance.new("ScreenGui")
Unpatchabomb.Name             = "Unpatchabomb"
Unpatchabomb.Parent           = Services.CoreGui
Unpatchabomb.ZIndexBehavior   = Enum.ZIndexBehavior.Sibling
Unpatchabomb.ResetOnSpawn     = false

local OuterFrame = Instance.new("Frame")
OuterFrame.Name                 = "OuterFrame"
OuterFrame.Parent               = Unpatchabomb
OuterFrame.BackgroundColor3     = Color3.fromRGB(25, 25, 30)
OuterFrame.BorderSizePixel      = 0
OuterFrame.Position             = UDim2.new(0.5, -160, 0.5, -240)
OuterFrame.Size                 = UDim2.new(0, 320, 0, 0)
OuterFrame.ClipsDescendants     = true
OuterFrame.BackgroundTransparency = 1
Instance.new("UICorner", OuterFrame).CornerRadius = UDim.new(0, 8)

local TopFrame = Instance.new("Frame")
TopFrame.Parent             = OuterFrame
TopFrame.BackgroundColor3   = Color3.fromRGB(12, 12, 12)
TopFrame.BorderSizePixel    = 0
TopFrame.Size               = UDim2.new(1, 0, 0, 28)
TopFrame.BackgroundTransparency = 1
Instance.new("UICorner", TopFrame).CornerRadius = UDim.new(0, 8)

local T1 = Instance.new("TextLabel")
T1.Parent               = TopFrame
T1.BackgroundTransparency = 1
T1.Size                 = UDim2.new(0.5, 0, 1, 0)
T1.Position             = UDim2.new(0.04, 0, 0, 0)
T1.Font                 = Enum.Font.GothamBold
T1.Text                 = "UnpatchaBomb ⚡ 4th of July! 🎇"
T1.TextColor3           = Color3.fromRGB(255, 255, 255)
T1.TextSize             = 14
T1.TextXAlignment       = Enum.TextXAlignment.Left

local T2 = Instance.new("TextLabel")
T2.Parent               = TopFrame
T2.BackgroundTransparency = 1
T2.Size                 = UDim2.new(0.4, 0, 1, 0)
T2.Position             = UDim2.new(0.34, 0, 0, 0)
T2.Font                 = Enum.Font.Gotham
T2.TextColor3           = Color3.fromRGB(200, 200, 200)
T2.TextSize             = 14
T2.TextXAlignment       = Enum.TextXAlignment.Left

local MinimizeButton = Instance.new("TextButton")
MinimizeButton.Parent               = TopFrame
MinimizeButton.BackgroundTransparency = 1
MinimizeButton.Position             = UDim2.new(1, -28, 0, 0)
MinimizeButton.Size                 = UDim2.new(0, 28, 1, 0)
MinimizeButton.Font                 = Enum.Font.GothamBold
MinimizeButton.Text                 = "—"
MinimizeButton.TextColor3           = Color3.fromRGB(255, 255, 255)
MinimizeButton.TextSize             = 18

local IntroFrame = Instance.new("Frame")
IntroFrame.Parent           = OuterFrame
IntroFrame.BackgroundColor3 = Color3.fromRGB(22, 22, 22)
IntroFrame.BorderSizePixel  = 0
IntroFrame.Position         = UDim2.new(0, 0, 0, 28)
IntroFrame.Size             = UDim2.new(1, 0, 1, -28)
IntroFrame.ZIndex           = 5

local function MakeIntroLabel(posY, sizeY, text, font)
    local l = Instance.new("TextLabel")
    l.Parent              = IntroFrame
    l.BackgroundTransparency = 1
    l.Position            = UDim2.new(0, 0, posY, 0)
    l.Size                = UDim2.new(1, 0, sizeY, 0)
    l.Font                = font or Enum.Font.Gotham
    l.Text                = text
    l.TextColor3          = Color3.fromRGB(255, 255, 255)
    l.TextScaled          = true
    l.ZIndex              = 5
    return l
end

MakeIntroLabel(0.38, 0.15, "UNPATCHABOMB", Enum.Font.GothamBold)
MakeIntroLabel(0.54, 0.08, "PRO EDITION")
local LoadingLabel = MakeIntroLabel(0.76, 0.08, "Loading...")

task.spawn(function()
    while LoadingLabel and LoadingLabel.Parent do
        LoadingLabel.Text = "Loading."  ; task.wait(0.15)
        LoadingLabel.Text = "Loading.." ; task.wait(0.15)
        LoadingLabel.Text = "Loading..."; task.wait(0.15)
    end
end)

local MainFrame = Instance.new("Frame")
MainFrame.Parent            = OuterFrame
MainFrame.BackgroundColor3  = Color3.fromRGB(22, 22, 22)
MainFrame.BorderSizePixel   = 0
MainFrame.Position          = UDim2.new(0, 0, 0, 28)
MainFrame.Size              = UDim2.new(1, 0, 1, -28)
MainFrame.ClipsDescendants  = true
MainFrame.BackgroundTransparency = 1

Services.TweenService:Create(
    OuterFrame,
    TweenInfo.new(0.6, Enum.EasingStyle.Back, Enum.EasingDirection.Out),
    {Size = UDim2.new(0, 320, 0, 480),
     Position = UDim2.new(0.5, -160, 0.5, -240),
     BackgroundTransparency = 0}
):Play()

task.spawn(function()
    for i = 1, 10 do
        MainFrame.BackgroundTransparency = 1 - i/10
        TopFrame.BackgroundTransparency  = 1 - i/10
        task.wait(0.03)
    end
end)

local function MakeLabel(parent, posY, sizeY, text, font)
    local l = Instance.new("TextLabel")
    l.Parent              = parent
    l.BackgroundTransparency = 1
    l.Position            = UDim2.new(0.02, 0, posY, 0)
    l.Size                = UDim2.new(0.96, 0, sizeY, 0)
    l.Font                = font or Enum.Font.Gotham
    l.Text                = text
    l.TextColor3          = Color3.fromRGB(255, 255, 255)
    l.TextScaled          = true
    return l
end

local function MakeButton(parent, posY, sizeY, text, color)
    local b = Instance.new("TextButton")
    b.Parent            = parent
    b.BackgroundColor3  = color or Color3.fromRGB(35, 35, 35)
    b.BorderSizePixel   = 0
    b.Position          = UDim2.new(0.02, 0, posY, 0)
    b.Size              = UDim2.new(0.96, 0, sizeY, 0)
    b.Font              = Enum.Font.GothamBold
    b.Text              = text
    b.TextColor3        = Color3.fromRGB(255, 255, 255)
    b.TextScaled        = true
    Instance.new("UICorner", b).CornerRadius = UDim.new(0, 4)
    b.InputBegan:Connect(function(inp)
        if inp.UserInputType == Enum.UserInputType.MouseButton1 or inp.UserInputType == Enum.UserInputType.Touch then
            Services.TweenService:Create(b, TweenInfo.new(0.08, Enum.EasingStyle.Quad, Enum.EasingDirection.Out),
                {Size = UDim2.new(0.96, 0, sizeY * 0.95, 0)}):Play()
        end
    end)
    b.InputEnded:Connect(function(inp)
        if inp.UserInputType == Enum.UserInputType.MouseButton1 or inp.UserInputType == Enum.UserInputType.Touch then
            Services.TweenService:Create(b, TweenInfo.new(0.08, Enum.EasingStyle.Quad, Enum.EasingDirection.Out),
                {Size = UDim2.new(0.96, 0, sizeY, 0)}):Play()
        end
    end)
    return b
end

local function MakeTextBox(parent, posY, sizeY, placeholder)
    local tb = Instance.new("TextBox")
    tb.Parent              = parent
    tb.BackgroundColor3    = Color3.fromRGB(12, 12, 12)
    tb.BorderSizePixel     = 0
    tb.Position            = UDim2.new(0.02, 0, posY, 0)
    tb.Size                = UDim2.new(0.96, 0, sizeY, 0)
    tb.Font                = Enum.Font.GothamBold
    tb.PlaceholderText     = placeholder
    tb.Text                = ""
    tb.TextColor3          = Color3.fromRGB(255, 255, 255)
    tb.TextScaled          = true
    tb.ClearTextOnFocus    = true
    Instance.new("UICorner", tb).CornerRadius = UDim.new(0, 4)
    return tb
end

local function MakeSmallTextBox(parent, posX, posY, sizeX, sizeY, placeholder)
    local tb = Instance.new("TextBox")
    tb.Parent              = parent
    tb.BackgroundColor3    = Color3.fromRGB(12, 12, 12)
    tb.BorderSizePixel     = 0
    tb.Position            = UDim2.new(posX, 0, posY, 0)
    tb.Size                = UDim2.new(sizeX, 0, sizeY, 0)
    tb.Font                = Enum.Font.GothamBold
    tb.PlaceholderText     = placeholder
    tb.Text                = ""
    tb.TextColor3          = Color3.fromRGB(255, 255, 255)
    tb.TextScaled          = true
    tb.ClearTextOnFocus    = true
    Instance.new("UICorner", tb).CornerRadius = UDim.new(0, 4)
    return tb
end

local WordText     = MakeLabel(MainFrame,  0.01, 0.06, "UNPATCHABOMB", Enum.Font.GothamBold)
local LetterBox    = MakeTextBox(MainFrame, 0.08, 0.06, "Type letters + Enter to auto-type")
local StatusLabel  = MakeLabel(MainFrame,  0.15, 0.06, "Status: Waiting for round...")
StatusLabel.TextColor3 = Color3.fromRGB(180, 180, 180)

local AutoTypeToggle = MakeButton(MainFrame, 0.22, 0.06, "Auto Type: OFF",   Color3.fromRGB(40, 40, 40))
local AutoJoinToggle = MakeButton(MainFrame, 0.29, 0.06, "Auto Join: OFF",   Color3.fromRGB(40, 40, 40))
local WPMBox         = MakeTextBox(MainFrame, 0.36, 0.06, "Typing WPM (default: 120)")
local JitterToggle   = MakeButton(MainFrame, 0.43, 0.06, "Humanise WPM: ON", Color3.fromRGB(40, 80, 40))

local TypoPresets   = {0, 0.02, 0.04, 0.08, 0.12, 0.20}
local TypoIndex     = 3
local TypoButton    = MakeButton(MainFrame, 0.50, 0.06,
    string.format("Typo Chance: %d%%", math.floor(TypoPresets[TypoIndex] * 100)),
    Color3.fromRGB(80, 40, 40))

local MinLenBox = MakeSmallTextBox(MainFrame, 0.02, 0.57, 0.47, 0.06, "Min Length (1)")
local MaxLenBox = MakeSmallTextBox(MainFrame, 0.51, 0.57, 0.47, 0.06, "Max Length (99)")

local OldGUIButton = MakeButton(MainFrame, 0.64, 0.06, "Switch to Old GUI", Color3.fromRGB(50, 50, 50))

local HowToUseText = MakeLabel(MainFrame, 0.75, 0.1,
    "Modern UI Active\nMin/Max len set via textboxes")
HowToUseText.TextColor3 = Color3.fromRGB(140, 140, 140)

local function SetStatus(msg) StatusLabel.Text = "Status: " .. msg end

local TypeBox

local function LinkTypeBox()
    local GameUI = LocalPlayer.PlayerGui:WaitForChild("GameUI", 5)
    if GameUI then
        TypeBox = GameUI:FindFirstChild("Typebox", true)
        GameUI.DescendantAdded:Connect(function(c)
            if c.Name == "Typebox" then
                TypeBox = c
                TypeBox:GetPropertyChangedSignal("Visible"):Connect(function()
                    if Settings.AutoType then task.spawn(TryTyping) end
                end)
            end
        end)
    end
end

task.spawn(LinkTypeBox)

local function TypeWord(word)
    if Typing then return end
    Typing = true
    burstCounter = 0
    burstTarget  = math.random(Settings.BurstMin, Settings.BurstMax)

    SetStatus(string.format("Typing '%s' @ %d WPM  (typo: %d%%)",
        word, Settings.WPM, math.floor(Settings.TypoChance * 100)))

    if TypeBox then pcall(function() TypeBox:CaptureFocus() end) end

    local i = 1
    while i <= #word do
        local char = string.sub(word, i, i)

        if Settings.TypoChance > 0 and math.random() < Settings.TypoChance then
            local lower   = string.lower(char)
            local typoKey = TypoNeighbours[lower] or lower
            SimulateKey(typoKey)
            task.wait(GetLetterDelay())
            task.wait(0.04 + math.random() * 0.08)
            SimulateBackspace()
            task.wait(0.03 + math.random() * 0.05)
            SimulateKey(char)
        else
            SimulateKey(char)
        end

        task.wait(GetLetterDelay())
        i = i + 1
    end

    task.wait(0.05)
    SimulateKey("\n")
    SetStatus("Submitted: " .. word)
    Typing = false
end

function TryTyping()
    if not Settings.AutoType or TypingActive then return end
    TypingActive = true

    while GetTurn() ~= LocalPlayer.UserId do
        if not Settings.AutoType then TypingActive = false return end
        task.wait(0.1)
    end

    if not Settings.AutoType then TypingActive = false return end

    local Word, attempts = nil, 0
    repeat
        task.wait()
        local detectedLetters = GetLetters()
        if detectedLetters and detectedLetters ~= "" then
            LetterBox.Text = detectedLetters
            Word = FindWordAuto(detectedLetters)
            attempts = attempts + 1
            if not Settings.AutoType then TypingActive = false return end
        end
    until Word or attempts >= 10

    if Word then
        LastWord = Word
        task.wait(Settings.WordTypeDelay)
        if not Typing then TypeWord(Word) end
        task.wait(Settings.WordTypeDelay)
        if GetTurn() == LocalPlayer.UserId and Settings.AutoType then
            SetStatus("Still my turn — retrying…")
            LastWord = ""
            TypingActive = false
            TryTyping()
            return
        end
    else
        SetStatus("No word found for: " .. GetLetters())
    end

    TypingActive = false
end

task.spawn(function()
    local lastPrompt = ""
    while task.wait(0.25) do
        if Settings.AutoType and GetTurn() == LocalPlayer.UserId and not Typing and not TypingActive then
            local currentPrompt = GetLetters() or ""
            if currentPrompt ~= "" and currentPrompt ~= lastPrompt then
                lastPrompt = currentPrompt
                task.spawn(TryTyping)
            end
        elseif GetTurn() ~= LocalPlayer.UserId then
            lastPrompt = ""
        end
    end
end)

LetterBox.FocusLost:Connect(function(enterPressed)
    if not enterPressed then return end
    local sub = LetterBox.Text
    if not sub or sub == "" then
        sub = GetLetters()
        if not sub or sub == "" then WordText.Text = "Error: empty input." return end
    end
    WordText.Text = sub .. " — Searching..."
    task.wait(0.1)
    local word = FindWordAuto(sub) or findWord(sub)
    if word then
        WordText.Text = "Typing: '" .. word .. "'..."
        task.spawn(function()
            TypeWord(word)
            WordText.Text = "Done: '" .. word .. "'"
        end)
    else
        WordText.Text = "No word found :("
    end
end)

AutoTypeToggle.MouseButton1Click:Connect(function()
    Settings.AutoType = not Settings.AutoType
    local on = Settings.AutoType
    AutoTypeToggle.Text           = "Auto Type: " .. (on and "ON" or "OFF")
    AutoTypeToggle.BackgroundColor3 = on and Color3.fromRGB(40, 80, 40) or Color3.fromRGB(40, 40, 40)
    SetStatus("Auto Type " .. (on and "Enabled" or "Disabled"))
    if not on then TypingActive = false end
    if on then task.spawn(TryTyping) end
end)

AutoJoinToggle.MouseButton1Click:Connect(function()
    Settings.AutoJoin = not Settings.AutoJoin
    local on = Settings.AutoJoin
    AutoJoinToggle.Text           = "Auto Join: " .. (on and "ON" or "OFF")
    AutoJoinToggle.BackgroundColor3 = on and Color3.fromRGB(40, 80, 40) or Color3.fromRGB(40, 40, 40)
    SetStatus("Auto Join " .. (on and "Enabled" or "Disabled"))
    if on and Games then
        pcall(function()
            for i = -1, -1000, -1 do Games.GameEvent:FireServer(i, "JoinGame") end
        end)
    end
end)

WPMBox.FocusLost:Connect(function()
    local n = tonumber(WPMBox.Text)
    if n then
        Settings.WPM = math.clamp(n, 10, 9999)
        SetStatus(string.format("WPM → %d  (%.4fs/char)", Settings.WPM, 60 / (Settings.WPM * 5)))
    else
        SetStatus("Invalid WPM — enter a number.")
    end
end)

MinLenBox.FocusLost:Connect(function()
    local n = tonumber(MinLenBox.Text)
    if n then
        Settings.MinLen = math.clamp(n, 1, 99)
        SetStatus("Min Length → " .. Settings.MinLen)
    else
        Settings.MinLen = 1
        SetStatus("Min Length → Default (1)")
    end
end)

MaxLenBox.FocusLost:Connect(function()
    local n = tonumber(MaxLenBox.Text)
    if n then
        Settings.MaxLen = math.clamp(n, 1, 99)
        SetStatus("Max Length → " .. Settings.MaxLen)
    else
        Settings.MaxLen = 99
        SetStatus("Max Length → Default (99)")
    end
end)

JitterToggle.MouseButton1Click:Connect(function()
    Settings.HumaniseWPM = not Settings.HumaniseWPM
    local on = Settings.HumaniseWPM
    JitterToggle.Text           = "Humanise WPM: " .. (on and "ON" or "OFF")
    JitterToggle.BackgroundColor3 = on and Color3.fromRGB(40, 80, 40) or Color3.fromRGB(40, 40, 40)
    SetStatus("WPM jitter " .. (on and "ON" or "OFF"))
end)

TypoButton.MouseButton1Click:Connect(function()
    TypoIndex = (TypoIndex % #TypoPresets) + 1
    Settings.TypoChance = TypoPresets[TypoIndex]
    TypoButton.Text = string.format("Typo Chance: %d%%", math.floor(Settings.TypoChance * 100))
    StatusLabel.Text = string.format("Status: Typo chance → %d%%", math.floor(Settings.TypoChance * 100))
end)

OldGUIButton.MouseButton1Click:Connect(function()
    SetStatus("Old GUI not implemented in single file.")
end)

do
    local dragging, dragInput, dragStart, startPos
    TopFrame.InputBegan:Connect(function(input)
        if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then
            dragging  = true
            dragStart = input.Position
            startPos  = OuterFrame.Position
            input.Changed:Connect(function()
                if input.UserInputState == Enum.UserInputState.End then dragging = false end
            end)
        end
    end)
    TopFrame.InputChanged:Connect(function(input)
        if input.UserInputType == Enum.UserInputType.MouseMovement or input.UserInputType == Enum.UserInputType.Touch then
            dragInput = input
        end
    end)
    Services.UserInputService.InputChanged:Connect(function(input)
        if input == dragInput and dragging then
            local d = input.Position - dragStart
            OuterFrame.Position = UDim2.new(
                startPos.X.Scale,  startPos.X.Offset + d.X,
                startPos.Y.Scale,  startPos.Y.Offset + d.Y
            )
        end
    end)
end

local minimized = false

MinimizeButton.MouseButton1Click:Connect(function()
    minimized = not minimized
    local targetSize     = minimized and UDim2.new(0, 320, 0, 28)      or UDim2.new(0, 320, 0, 480)
    local targetBodySize = minimized and UDim2.new(1, 0, 0, 0)         or UDim2.new(1, 0, 1, -28)

    local glow = Instance.new("ImageLabel")
    glow.Parent               = OuterFrame
    glow.BackgroundTransparency = 1
    glow.Image                = "rbxassetid://5028857084"
    glow.ImageColor3          = Color3.fromRGB(255, 255, 255)
    glow.Size                 = UDim2.new(1, 20, 1, 20)
    glow.Position             = UDim2.new(0, -10, 0, -10)
    glow.ImageTransparency    = 1
    Services.TweenService:Create(glow, TweenInfo.new(0.4, Enum.EasingStyle.Quad, Enum.EasingDirection.Out),
        {ImageTransparency = 0.7}):Play()
    task.delay(0.4, function() glow:Destroy() end)

    Services.TweenService:Create(OuterFrame,  TweenInfo.new(0.4, Enum.EasingStyle.Quad, Enum.EasingDirection.Out), {Size = targetSize}):Play()
    Services.TweenService:Create(MainFrame,   TweenInfo.new(0.4, Enum.EasingStyle.Quad, Enum.EasingDirection.Out), {Size = targetBodySize}):Play()
    Services.TweenService:Create(IntroFrame,  TweenInfo.new(0.4, Enum.EasingStyle.Quad, Enum.EasingDirection.Out), {Size = targetBodySize}):Play()

    MinimizeButton.Text = minimized and "+" or "—"
end)

task.delay(2, function()
    Services.TweenService:Create(IntroFrame, TweenInfo.new(0.5, Enum.EasingStyle.Quad, Enum.EasingDirection.Out),
        {Position = UDim2.new(0, 0, 1, 0)}):Play()
end)

if Games then
    local registerGame = Games:FindFirstChild("RegisterGame")
    if registerGame then
        registerGame.OnClientEvent:Connect(function(int)
            GameID    = int
            UsedWords = {}
            LastWord  = ""
            SetStatus("Game registered — ID: " .. int)
            if Settings.AutoJoin then 
                pcall(function() Games.GameEvent:FireServer(int, "JoinGame") end)
            end
            task.wait(1)
            if Settings.AutoType then task.spawn(TryTyping) end
        end)
    end
end

Features & Information

THE THIRD VERSION! --new features: better gui added min/max word length (recommended by @ALTERRATIC and more! the script is now fully operational.

Community Comments (2)

HandigeHasanHandigeHasanJun 29, 2026(edited)

Great script, definitely saw someone else using the same script. Only downside of this script is, that certain words combinations dont allign, voor example having 'zzv' as a word. The script wouldn't finish it. Which would result, me 2 times losing the game. 1+ Like from me.

Replying to @HandigeHasan

@HandigeHasan thanks! i appreciate the like. i am definitely working on some bugs (there are others, too), but i am glad to have the only currently working Word Bomb script! UnpatchaBomb will remain free, and u*fuscated. if you want to contribute to it, the script is open source. if you could report any combinations it doesnt work on, that'd be great! thanks.

More Scripts for Word Bomb