AIBUILDER2026

Pasted Oct 17, 2026, 2:24 PM1 file1,755 lines

Scan to open on your phone

Point a camera at the QR code - it opens this exact paste, no app needed.

https://codepastes.com/ai-bui
AIbuilder

-- AI BUILDER 2026
-- Professional Creator Edition
-- Runtime prototype for Roblox Studio Lite
-- Place this LocalScript in StarterPlayerScripts.

local Players = game:GetService("Players")
local TweenService = game:GetService("TweenService")

local player = Players.LocalPlayer
local playerGui = player:WaitForChild("PlayerGui")

local OBBY_ASSET_ID = 121219424139703

local OBBY_MAINTENANCE_MESSAGE =
    "The Obby generation is currently being worked on."

local SIMULATOR_MAINTENANCE_MESSAGE =
    "The simulator generation is currently being worked on."

local old = playerGui:FindFirstChild("AIBuilder2026")
if old then old:Destroy() end

local PURPLE = Color3.fromRGB(151, 91, 255)
local PURPLE_DARK = Color3.fromRGB(69, 43, 108)
local BG = Color3.fromRGB(17, 17, 23)
local PANEL = Color3.fromRGB(27, 27, 36)
local PANEL2 = Color3.fromRGB(36, 35, 47)
local WHITE = Color3.fromRGB(245, 244, 250)
local MUTED = Color3.fromRGB(160, 157, 177)
local GREEN = Color3.fromRGB(75, 210, 137)
local RED = Color3.fromRGB(235, 83, 100)

local gui = Instance.new("ScreenGui")
gui.Name = "AIBuilder2026"
gui.ResetOnSpawn = false
gui.DisplayOrder = 20
gui.Parent = playerGui

local generated = {}
local generatedDocks = {}
local serial = 0
local currentPage = "Builder"
local statusLabel
local itemList
local pageHolder
local pages = {}
local gold = 1000
local goldLabel
local goldGui

local function create(class, props, parent)
    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 round(obj, radius)
    create("UICorner", {
        CornerRadius = UDim.new(0, radius or 10)
    }, obj)
end

local function outline(obj, color, thickness)
    create("UIStroke", {
        Color = color or PURPLE,
        Thickness = thickness or 1,
        Transparency = 0.2
    }, obj)
end

local function makeLabel(parent, text, size, color, bold)
    return create("TextLabel", {
        BackgroundTransparency = 1,
        Text = text,
        TextColor3 = color or WHITE,
        TextSize = size or 14,
        Font = bold and Enum.Font.GothamBold or Enum.Font.Gotham,
        TextWrapped = true,
        TextXAlignment = Enum.TextXAlignment.Left,
        TextYAlignment = Enum.TextYAlignment.Center,
        Size = UDim2.new(1, 0, 0, 28)
    }, parent)
end

local function makeButton(parent, text, callback, height)
    local b = create("TextButton", {
        AutoButtonColor = true,
        BackgroundColor3 = PANEL2,
        BorderSizePixel = 0,
        Size = UDim2.new(1, 0, 0, height or 40),
        Text = text,
        TextColor3 = WHITE,
        TextSize = 13,
        Font = Enum.Font.GothamSemibold,
        TextWrapped = true
    }, parent)

    round(b, 9)
    outline(b, Color3.fromRGB(69, 66, 86), 1)

    b.Activated:Connect(function()
        if callback then callback() end
    end)

    return b
end

local function makeInput(parent, placeholder, default, height)
    local box = create("TextBox", {
        BackgroundColor3 = BG,
        BorderSizePixel = 0,
        Size = UDim2.new(1, 0, 0, height or 40),
        PlaceholderText = placeholder,
        PlaceholderColor3 = MUTED,
        Text = default or "",
        TextColor3 = WHITE,
        TextSize = 13,
        Font = Enum.Font.Gotham,
        ClearTextOnFocus = false,
        TextXAlignment = Enum.TextXAlignment.Left
    }, parent)

    round(box, 8)
    outline(box, Color3.fromRGB(65, 62, 80), 1)

    create("UIPadding", {
        PaddingLeft = UDim.new(0, 10),
        PaddingRight = UDim.new(0, 8)
    }, box)

    return box
end

local function makeSection(parent, title, description)
    local section = create("Frame", {
        BackgroundColor3 = PANEL,
        BorderSizePixel = 0,
        Size = UDim2.new(1, 0, 0, 10),
        AutomaticSize = Enum.AutomaticSize.Y
    }, parent)

    round(section, 12)

    create("UIPadding", {
        PaddingTop = UDim.new(0, 12),
        PaddingBottom = UDim.new(0, 12),
        PaddingLeft = UDim.new(0, 12),
        PaddingRight = UDim.new(0, 12)
    }, section)

    create("UIListLayout", {
        Padding = UDim.new(0, 8),
        SortOrder = Enum.SortOrder.LayoutOrder
    }, section)

    makeLabel(section, title, 16, WHITE, true).LayoutOrder = 1

    if description then
        local d = makeLabel(section, description, 12, MUTED, false)
        d.AutomaticSize = Enum.AutomaticSize.Y
        d.Size = UDim2.new(1, 0, 0, 30)
        d.LayoutOrder = 2
    end

    return section
end

local function setStatus(message, isError)
    if statusLabel then
        statusLabel.Text = message
        statusLabel.TextColor3 = isError and RED or GREEN
    end
end

-- GENERATED GUI DOCK MANAGER
-- Every generated GUI gets its own vertically stacked dock button.

local function relayoutGeneratedDocks()
    local liveDocks = {}

    for _, entry in ipairs(generatedDocks) do
        if entry.button and entry.button.Parent
            and entry.screen and entry.screen.Parent then
            table.insert(liveDocks, entry)
        end
    end

    table.clear(generatedDocks)

    for _, entry in ipairs(liveDocks) do
        table.insert(generatedDocks, entry)
    end

    for index, entry in ipairs(generatedDocks) do
        entry.button.Position = UDim2.new(
            0, 12,
            0, 86 + ((index - 1) * 53)
        )
    end
end

local function refreshItems()
    if not itemList then return end

    for _, child in ipairs(itemList:GetChildren()) do
        if child:IsA("Frame") or child:IsA("TextLabel") then
            child:Destroy()
        end
    end

    if #generated == 0 then
        local empty = makeLabel(
            itemList,
            "No generated items yet. Create something in a generator.",
            12,
            MUTED,
            false
        )
        empty.Size = UDim2.new(1, -8, 0, 48)
        return
    end

    for index = #generated, 1, -1 do
        local entry = generated[index]

        local row = create("Frame", {
            BackgroundColor3 = PANEL2,
            BorderSizePixel = 0,
            Size = UDim2.new(1, -4, 0, 54)
        }, itemList)

        round(row, 8)

        local name = makeLabel(row, entry.name, 12, WHITE, true)
        name.Position = UDim2.new(0, 9, 0, 3)
        name.Size = UDim2.new(1, -86, 0, 22)

        local kind = makeLabel(row, entry.kind, 10, MUTED, false)
        kind.Position = UDim2.new(0, 9, 0, 25)
        kind.Size = UDim2.new(1, -86, 0, 20)

        local delete = create("TextButton", {
            BackgroundColor3 = Color3.fromRGB(94, 39, 53),
            BorderSizePixel = 0,
            Text = "Delete",
            TextColor3 = WHITE,
            TextSize = 11,
            Font = Enum.Font.GothamBold,
            Size = UDim2.new(0, 60, 0, 30),
            Position = UDim2.new(1, -67, 0.5, -15)
        }, row)

        round(delete, 7)

        delete.Activated:Connect(function()
            if entry.object and entry.object.Parent then
                entry.object:Destroy()
            end

            if entry.gui and entry.gui.Parent then
                entry.gui:Destroy()
            end

            local actualIndex = table.find(generated, entry)
            if actualIndex then
                table.remove(generated, actualIndex)
            end

            refreshItems()
            relayoutGeneratedDocks()
            setStatus("Deleted: " .. entry.name)
        end)
    end
end

local function register(name, kind, object, extraGui)
    serial += 1

    table.insert(generated, {
        id = serial,
        name = name,
        kind = kind,
        object = object,
        gui = extraGui
    })

    refreshItems()
    setStatus("Generated: " .. name)
end

-- Flat, consistent directions prevent builds from drifting
-- when the player looks up or down.

local function playerOrigin()
    local character = player.Character
    local root = character and character:FindFirstChild("HumanoidRootPart")

    if root then
        local forward = Vector3.new(
            root.CFrame.LookVector.X,
            0,
            root.CFrame.LookVector.Z
        )

        if forward.Magnitude < 0.001 then
            forward = Vector3.new(0, 0, -1)
        else
            forward = forward.Unit
        end

        local right = Vector3.new(-forward.Z, 0, forward.X)

        return root.Position + forward * 45, forward, right
    end

    return Vector3.new(0, 10, 0),
        Vector3.new(0, 0, -1),
        Vector3.new(1, 0, 0)
end

local function newBuildFolder(name)
    local folder = Instance.new("Folder")
    folder.Name = "AIBuild_" .. name .. "_" .. tostring(serial + 1)
    folder.Parent = workspace
    return folder
end

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

-- Correctly orients parts to the player's horizontal direction.

local function orientedPart(parent, name, size, position, forward, color, material)
    local p = Instance.new("Part")
    p.Name = name
    p.Size = size
    p.Anchored = true
    p.Color = color or PURPLE
    p.Material = material or Enum.Material.SmoothPlastic
    p.TopSurface = Enum.SurfaceType.Smooth
    p.BottomSurface = Enum.SurfaceType.Smooth

    local flatForward = Vector3.new(forward.X, 0, forward.Z)

    if flatForward.Magnitude < 0.001 then
        flatForward = Vector3.new(0, 0, -1)
    else
        flatForward = flatForward.Unit
    end

    local right = Vector3.new(-flatForward.Z, 0, flatForward.X)
    p.CFrame = CFrame.fromMatrix(position, right, Vector3.yAxis, -flatForward)
    p.Parent = parent

    return p
end

local function addSign(parent, text, position, size)
    local p = part(
        parent,
        "Sign",
        size or Vector3.new(12, 4, 1),
        position,
        Color3.fromRGB(31, 28, 43),
        Enum.Material.SmoothPlastic
    )

    local surface = create("SurfaceGui", {
        Face = Enum.NormalId.Front,
        AlwaysOnTop = true,
        SizingMode = Enum.SurfaceGuiSizingMode.PixelsPerStud,
        PixelsPerStud = 35
    }, p)

    create("TextLabel", {
        BackgroundTransparency = 1,
        Size = UDim2.fromScale(1, 1),
        Text = text,
        TextColor3 = WHITE,
        TextScaled = true,
        Font = Enum.Font.GothamBold
    }, surface)

    return p
end

-- LOCAL DEMO CURRENCY

local function ensureGoldGui()
    if goldGui and goldGui.Parent then return end

    goldGui = create("ScreenGui", {
        Name = "AIBuildDemoCurrency",
        ResetOnSpawn = false,
        DisplayOrder = 12
    }, playerGui)

    local label = create("TextLabel", {
        Name = "GoldLabel",
        BackgroundColor3 = BG,
        BorderSizePixel = 0,
        Position = UDim2.new(1, -170, 0, 14),
        Size = UDim2.new(0, 155, 0, 40),
        Text = "Gold: " .. tostring(gold),
        TextColor3 = Color3.fromRGB(255, 221, 105),
        TextSize = 16,
        Font = Enum.Font.GothamBold
    }, goldGui)

    round(label, 10)
    outline(label, PURPLE, 1)
    goldLabel = label
end

local function addGold(amount)
    gold += amount
    ensureGoldGui()
    goldLabel.Text = "Gold: " .. tostring(gold)
end

local function updateGoldDisplay()
    ensureGoldGui()
    goldLabel.Text = "Gold: " .. tostring(gold)
end

-- BASIC BUILDER

local function generateStructure(request)
    request = string.lower(request or "tower")

    local origin, forward, right = playerOrigin()
    local folder = newBuildFolder("Structure")

    local color = Color3.fromRGB(
        math.random(70, 220),
        math.random(70, 220),
        math.random(100, 255)
    )

    local stone = Color3.fromRGB(103, 105, 121)
    local name = "Tower"

    local function at(x, y, z)
        return origin + right * x + Vector3.new(0, y, 0) + forward * z
    end

    local function localPart(partName, size, x, y, z, partColor, material)
        return orientedPart(
            folder,
            partName,
            size,
            at(x, y, z),
            forward,
            partColor,
            material
        )
    end

    if string.find(request, "bridge") then
        name = "Bridge"

        local length = 80
        local deckY = 0

        orientedPart(folder, "BridgeDeck",
            Vector3.new(16, 2, length),
            at(0, deckY, 0), forward, stone,
            Enum.Material.Concrete)

        for _, side in ipairs({-1, 1}) do
            orientedPart(folder, "BridgeRail",
                Vector3.new(1, 3, length),
                at(side * 7, deckY + 2.5, 0),
                forward, color, Enum.Material.Metal)

            for z = -35, 35, 10 do
                orientedPart(folder, "RailingPost",
                    Vector3.new(1, 4, 1),
                    at(side * 7, deckY + 2, z),
                    forward, color, Enum.Material.Metal)
            end
        end

        for z = -30, 30, 15 do
            for _, side in ipairs({-1, 1}) do
                orientedPart(folder, "BridgeSupport",
                    Vector3.new(3, 12, 3),
                    at(side * 5, deckY - 8, z),
                    forward, stone, Enum.Material.Concrete)
            end
        end

        for _, z in ipairs({-48, 48}) do
            orientedPart(folder, "BridgeEntrance",
                Vector3.new(22, 2, 16),
                at(0, deckY, z),
                forward,
                Color3.fromRGB(75, 160, 115),
                Enum.Material.Concrete)
        end

        addSign(folder, "BRIDGE", at(0, 6, -49))

    elseif string.find(request, "castle")
        or string.find(request, "fort") then

        name = "Castle"

        localPart("CastleBase", Vector3.new(42, 4, 42),
            0, 0, 0, stone)

        for _, x in ipairs({-16, 16}) do
            for _, z in ipairs({-16, 16}) do
                localPart("CastleTower", Vector3.new(9, 24, 9),
                    x, 14, z, color)

                localPart("TowerTop", Vector3.new(11, 2, 11),
                    x, 27, z, stone)
            end
        end

        localPart("BackWall", Vector3.new(32, 15, 3),
            0, 9, -17, color)

        localPart("LeftWall", Vector3.new(3, 15, 32),
            -17, 9, 0, color)

        localPart("RightWall", Vector3.new(3, 15, 32),
            17, 9, 0, color)

        localPart("FrontWallLeft", Vector3.new(12, 15, 3),
            -10, 9, 17, color)

        localPart("FrontWallRight", Vector3.new(12, 15, 3),
            10, 9, 17, color)

        localPart("GateTop", Vector3.new(10, 4, 4),
            0, 15, 17, stone)

        localPart("GateFloor", Vector3.new(10, 1, 8),
            0, 2.5, 18, stone, Enum.Material.Concrete)

    elseif string.find(request, "skyscraper")
        or string.find(request, "building") then

        name = "Skyscraper"

        local width = 28
        local depth = 28
        local floors = 12
        local floorHeight = 4

        localPart("Foundation", Vector3.new(width + 4, 3, depth + 4),
            0, 0, 0, stone, Enum.Material.Concrete)

        for floor = 1, floors do
            local floorY = floor * floorHeight

            localPart("Floor_" .. floor,
                Vector3.new(width, 1, depth),
                0, floorY, 0, color, Enum.Material.Concrete)

            local wallHeight = floorHeight - 1

            localPart("FrontWall_" .. floor,
                Vector3.new(width, wallHeight, 0.5),
                0, floorY + 2, -depth / 2,
                color, Enum.Material.Concrete)

            localPart("BackWall_" .. floor,
                Vector3.new(width, wallHeight, 0.5),
                0, floorY + 2, depth / 2,
                color, Enum.Material.Concrete)

            localPart("LeftWall_" .. floor,
                Vector3.new(0.5, wallHeight, depth),
                -width / 2, floorY + 2, 0,
                color, Enum.Material.Concrete)

            localPart("RightWall_" .. floor,
                Vector3.new(0.5, wallHeight, depth),
                width / 2, floorY + 2, 0,
                color, Enum.Material.Concrete)

            for _, x in ipairs({-9, -3, 3, 9}) do
                for _, side in ipairs({-1, 1}) do
                    local window = localPart(
                        "Window",
                        Vector3.new(3, 2, 0.25),
                        x,
                        floorY + 2,
                        side * (depth / 2 + 0.3),
                        Color3.fromRGB(111, 208, 255),
                        Enum.Material.Glass
                    )

                    window.Transparency = 0.2
                    window.CanCollide = false
                end
            end

            for _, z in ipairs({-9, -3, 3, 9}) do
                for _, side in ipairs({-1, 1}) do
                    local window = localPart(
                        "SideWindow",
                        Vector3.new(0.25, 2, 3),
                        side * (width / 2 + 0.3),
                        floorY + 2,
                        z,
                        Color3.fromRGB(111, 208, 255),
                        Enum.Material.Glass
                    )

                    window.Transparency = 0.2
                    window.CanCollide = false
                end
            end
        end

        local roofY = floors * floorHeight + 2

        localPart("Roof", Vector3.new(width + 3, 2, depth + 3),
            0, roofY, 0, stone, Enum.Material.Metal)

        localPart("Antenna", Vector3.new(1, 12, 1),
            0, roofY + 7, 0, color, Enum.Material.Metal)

    elseif string.find(request, "tree") then
        name = "Giant Tree"

        part(folder, "Trunk", Vector3.new(7, 26, 7),
            at(0, 12, 0),
            Color3.fromRGB(112, 70, 42), Enum.Material.Wood)

        for _, offset in ipairs({
            Vector3.new(0, 26, 0),
            Vector3.new(7, 21, 0),
            Vector3.new(-7, 21, 0),
            Vector3.new(0, 21, 7),
            Vector3.new(0, 21, -7)
        }) do
            local leaf = part(folder, "Leaves",
                Vector3.new(15, 15, 15),
                origin + offset,
                Color3.fromRGB(57, 176, 93),
                Enum.Material.Grass)

            leaf.Shape = Enum.PartType.Ball
        end

    else
        name = "Tower"

        part(folder, "TowerBase", Vector3.new(22, 3, 22),
            at(0, 0, 0), stone)

        for floor = 1, 10 do
            local width = math.max(7, 20 - floor)

            part(folder, "TowerFloor_" .. floor,
                Vector3.new(width, 4, width),
                at(0, floor * 4, 0), color)
        end

        part(folder, "TowerRoof", Vector3.new(8, 8, 8),
            at(0, 45, 0), stone)

        part(folder, "TowerSpire", Vector3.new(2, 12, 2),
            at(0, 55, 0), color)
    end

    register(name, "Builder", folder)
end

-- MAP BUILDER

local function generateMap(mapType)
    mapType = string.lower(mapType or "island")

    local origin, forward, right = playerOrigin()
    local folder = newBuildFolder("Map")

    local green = Color3.fromRGB(70, 153, 90)
    local road = Color3.fromRGB(57, 59, 70)
    local name = "Island Map"

    local base = part(folder, "Ground",
        Vector3.new(180, 3, 180),
        origin - Vector3.new(0, 3, 0),
        green, Enum.Material.Grass)

    if string.find(mapType, "city") then
        name = "City Map"
        base.Color = Color3.fromRGB(83, 145, 88)

        part(folder, "MainRoad", Vector3.new(22, 0.5, 160),
            origin + Vector3.new(0, -1.2, 0), road)

        part(folder, "CrossRoad", Vector3.new(160, 0.5, 20),
            origin + Vector3.new(0, -1.1, 0), road)

        for x = -60, 60, 30 do
            for z = -60, 60, 30 do
                if math.abs(x) > 18 and math.abs(z) > 18 then
                    local height = math.random(18, 48)

                    part(folder, "CityBuilding",
                        Vector3.new(18, height, 18),
                        origin + Vector3.new(x, height / 2, z),
                        Color3.fromRGB(
                            math.random(85, 180),
                            math.random(85, 180),
                            math.random(100, 210)
                        ))
                end
            end
        end

    elseif string.find(mapType, "town") then
        name = "Town Map"
        base.Size = Vector3.new(180, 3, 180)
        base.Color = Color3.fromRGB(94, 151, 91)

        part(folder, "TownMainRoad", Vector3.new(14, 0.5, 150),
            origin + Vector3.new(0, -1.2, 0), road)

        part(folder, "TownCrossRoad", Vector3.new(150, 0.5, 12),
            origin + Vector3.new(0, -1.1, 0), road)

        for x = -60, 60, 30 do
            for z = -60, 60, 30 do
                if math.abs(x) > 12 or math.abs(z) > 12 then
                    local houseColor = Color3.fromRGB(
                        math.random(140, 235),
                        math.random(100, 190),
                        math.random(100, 210)
                    )

                    local houseHeight = math.random(10, 15)
                    local houseWidth = math.random(12, 16)
                    local houseDepth = math.random(12, 16)
                    local housePosition = origin + Vector3.new(x, 0, z)

                    part(folder, "House",
                        Vector3.new(houseWidth, houseHeight, houseDepth),
                        housePosition + Vector3.new(0, houseHeight / 2, 0),
                        houseColor)

                    part(folder, "HouseRoof",
                        Vector3.new(houseWidth + 2, 2, houseDepth + 2),
                        housePosition + Vector3.new(0, houseHeight + 1, 0),
                        Color3.fromRGB(90, 57, 67),
                        Enum.Material.Slate)

                    part(folder, "HouseDoor",
                        Vector3.new(3, 6, 0.5),
                        housePosition + Vector3.new(0, 3, -houseDepth / 2 - 0.3),
                        Color3.fromRGB(96, 61, 40),
                        Enum.Material.Wood)

                    for _, windowX in ipairs({-4, 4}) do
                        local window = part(folder, "HouseWindow",
                            Vector3.new(2.5, 2.5, 0.4),
                            housePosition + Vector3.new(
                                windowX, houseHeight * 0.65, -houseDepth / 2 - 0.35
                            ),
                            Color3.fromRGB(125, 208, 255),
                            Enum.Material.Glass)

                        window.Transparency = 0.15
                        window.CanCollide = false
                    end
                end
            end
        end

    elseif string.find(mapType, "forest") then
        name = "Forest Map"

        for i = 1, 35 do
            local x = math.random(-75, 75)
            local z = math.random(-75, 75)
            local trunkHeight = math.random(8, 15)

            part(folder, "TreeTrunk",
                Vector3.new(3, trunkHeight, 3),
                origin + Vector3.new(x, trunkHeight / 2, z),
                Color3.fromRGB(107, 70, 43), Enum.Material.Wood)

            local leaves = part(folder, "TreeLeaves",
                Vector3.new(12, 12, 12),
                origin + Vector3.new(x, trunkHeight + 5, z),
                Color3.fromRGB(44, math.random(115, 180), 65),
                Enum.Material.Grass)

            leaves.Shape = Enum.PartType.Ball
        end

    elseif string.find(mapType, "island")
        or string.find(mapType, "fantasy") then

        name = "Island Map"

        base.Size = Vector3.new(110, 8, 110)
        base.Position = origin - Vector3.new(0, 6, 0)
        base.Material = Enum.Material.Grass

        for i = 1, 12 do
            local x = math.random(-42, 42)
            local z = math.random(-42, 42)
            local h = math.random(8, 28)

            part(folder, "Rock",
                Vector3.new(math.random(8, 18), h, math.random(8, 18)),
                origin + Vector3.new(x, h / 2 - 2, z),
                Color3.fromRGB(91, 94, 111),
                Enum.Material.Slate)
        end

        for i = 1, 5 do
            local x = math.random(-35, 35)
            local z = math.random(-35, 35)

            part(folder, "IslandTree",
                Vector3.new(3, 15, 3),
                origin + Vector3.new(x, 7, z),
                Color3.fromRGB(105, 71, 43),
                Enum.Material.Wood)

            local leaves = part(folder, "IslandLeaves",
                Vector3.new(11, 11, 11),
                origin + Vector3.new(x, 16, z),
                Color3.fromRGB(60, 183, 103),
                Enum.Material.Grass)

            leaves.Shape = Enum.PartType.Ball
        end
    end

    addSign(folder, name,
        origin + forward * -68 + Vector3.new(0, 4, 0))

    register(name, "Map Builder", folder)
end

-- OBBY GENERATOR
-- Temporarily disabled while the generator is being worked on.

local function generateObby()
    setStatus(OBBY_MAINTENANCE_MESSAGE)
end

-- ADVANCED GUI GENERATOR

local function generateUI(style)
    style = string.lower(style or "shop")

    local screen = Instance.new("ScreenGui")
    screen.Name = "Generated_" .. style .. "_" .. tostring(serial + 1)
    screen.ResetOnSpawn = false
    screen.DisplayOrder = 10
    screen.Parent = playerGui

    local panel = create("Frame", {
        Name = "MainPanel",
        AnchorPoint = Vector2.new(0.5, 0.5),
        Position = UDim2.fromScale(0.5, 0.5),
        Size = UDim2.new(0.75, 0, 0.7, 0),
        BackgroundColor3 = BG,
        BorderSizePixel = 0
    }, screen)

    round(panel, 15)
    outline(panel, PURPLE, 2)

    create("UISizeConstraint", {
        MinSize = Vector2.new(280, 250),
        MaxSize = Vector2.new(650, 560)
    }, panel)

    local header = create("Frame", {
        BackgroundColor3 = Color3.fromRGB(37, 30, 53),
        BorderSizePixel = 0,
        Size = UDim2.new(1, 0, 0, 55)
    }, panel)

    round(header, 15)

    local titleText = string.upper(style)
    local title = makeLabel(header, titleText, 18, WHITE, true)
    title.Position = UDim2.new(0, 16, 0, 3)
    title.Size = UDim2.new(1, -70, 1, -6)

    local close = create("TextButton", {
        BackgroundColor3 = Color3.fromRGB(62, 39, 76),
        BorderSizePixel = 0,
        Size = UDim2.new(0, 35, 0, 35),
        Position = UDim2.new(1, -44, 0, 10),
        Text = "X",
        TextColor3 = WHITE,
        Font = Enum.Font.GothamBold,
        TextSize = 16
    }, header)

    round(close, 9)

    close.Activated:Connect(function()
        panel.Visible = false
    end)

    local content = create("ScrollingFrame", {
        BackgroundTransparency = 1,
        BorderSizePixel = 0,
        Position = UDim2.new(0, 12, 0, 65),
        Size = UDim2.new(1, -24, 1, -78),
        CanvasSize = UDim2.new(),
        AutomaticCanvasSize = Enum.AutomaticSize.Y,
        ScrollBarThickness = 4,
        ScrollBarImageColor3 = PURPLE
    }, panel)

    create("UIListLayout", {
        Padding = UDim.new(0, 10),
        SortOrder = Enum.SortOrder.LayoutOrder
    }, content)

    local function card(cardTitle, description, buttonText, callback)
        local c = makeSection(content, cardTitle, description)
        makeButton(c, buttonText, callback, 38)
        return c
    end

    if string.find(style, "shop") then
        for i = 1, 4 do
            card("Item " .. i,
                "A sample shop item. Connect a real purchase system to sell items.",
                "BUY - " .. (i * 100) .. " Gold",
                function()
                    setStatus("Demo shop button pressed. Add a server purchase script for real buying.")
                end)
        end

    elseif string.find(style, "inventory") then
        card("Your Inventory",
            "Sample inventory slots for a generated interface.",
            "Slot 1  |  Empty",
            function()
                setStatus("Inventory slot selected.")
            end)

        card("Equipment", "Put equipment controls here.",
            "Equip Item", function()
                setStatus("Demo equip button pressed.")
            end)

    elseif string.find(style, "setting") then
        card("Settings", "Sample settings panel.",
            "Toggle Music", function()
                setStatus("Demo setting toggled.")
            end)

        card("Gameplay", "More settings can be connected to your game.",
            "Toggle Effects", function()
                setStatus("Demo effects setting toggled.")
            end)

    elseif string.find(style, "loading") then
        local barBack = create("Frame", {
            BackgroundColor3 = PANEL2,
            BorderSizePixel = 0,
            Size = UDim2.new(1, 0, 0, 20)
        }, content)

        round(barBack, 8)

        local bar = create("Frame", {
            BackgroundColor3 = PURPLE,
            BorderSizePixel = 0,
            Size = UDim2.new(0, 0, 1, 0)
        }, barBack)

        round(bar, 8)

        TweenService:Create(bar, TweenInfo.new(2), {
            Size = UDim2.fromScale(1, 1)
        }):Play()

    else
        card("Welcome", "A polished generated game menu.",
            "PLAY", function()
                panel.Visible = false
                setStatus("Play button pressed.")
            end)

        card("Options", "Customize your experience.",
            "SETTINGS", function()
                setStatus("Settings button pressed.")
            end)

        card("About", "Created using AI BUILDER 2026.",
            "CLOSE MENU", function()
                panel.Visible = false
            end)
    end

    local dock = create("TextButton", {
        BackgroundColor3 = PURPLE_DARK,
        BorderSizePixel = 0,
        Position = UDim2.new(0, 12, 0, 86),
        Size = UDim2.new(0, 54, 0, 45),
        Text = string.upper(string.sub(style, 1, 4)),
        TextColor3 = WHITE,
        TextSize = 11,
        Font = Enum.Font.GothamBold
    }, screen)

    round(dock, 10)
    outline(dock, PURPLE, 1)

    dock.Activated:Connect(function()
        panel.Visible = not panel.Visible
    end)

    table.insert(generatedDocks, {
        button = dock,
        screen = screen
    })

    relayoutGeneratedDocks()

    register("Advanced " .. titleText .. " GUI",
        "GUI Generator", nil, screen)
end

-- TYCOON GENERATOR

local function generateTycoon()
    local origin, forward, right = playerOrigin()
    local folder = newBuildFolder("Tycoon")

    part(folder, "TycoonBase", Vector3.new(100, 3, 100),
        origin, Color3.fromRGB(74, 119, 88))

    addSign(folder, "YOUR TYCOON",
        origin + forward * -35 + Vector3.new(0, 5, 0))

    for i = 1, 4 do
        local x = (i - 2.5) * 20

        part(folder, "Machine_" .. i,
            Vector3.new(12, 12, 12),
            origin + right * x + forward * -5 + Vector3.new(0, 8, 0),
            Color3.fromHSV(i / 5, 0.7, 1))

        local pad = part(folder, "PurchasePad_" .. i,
            Vector3.new(12, 1, 12),
            origin + right * x + forward * 20,
            Color3.fromRGB(70, 215, 130),
            Enum.Material.Neon)

        addSign(folder, "BUY " .. i,
            pad.Position + Vector3.new(0, 4, 0))

        local bought = false

        pad.Touched:Connect(function(hit)
            local character = player.Character
            if not character or not hit:IsDescendantOf(character) then
                return
            end

            if bought then return end

            local price = i * 100

            if gold >= price then
                gold -= price
                updateGoldDisplay()
                bought = true
                pad.Color = Color3.fromRGB(75, 90, 85)
                setStatus("Demo purchase " .. i .. " activated.")
            else
                setStatus("Not enough demo Gold for purchase " .. i, true)
            end
        end)
    end

    local conveyor = part(folder, "Conveyor",
        Vector3.new(16, 1, 40),
        origin + forward * -25 + Vector3.new(0, 2, 0),
        Color3.fromRGB(76, 81, 100),
        Enum.Material.Metal)

    part(folder, "CashCollector",
        Vector3.new(15, 4, 8),
        conveyor.Position + forward * -20 + Vector3.new(0, 2, 0),
        Color3.fromRGB(255, 207, 71),
        Enum.Material.Neon)

    register("Starter Tycoon", "Tycoon Generator", folder)
end

-- SIMULATOR GENERATOR
-- Temporarily disabled while the generator is being worked on.

local function generateSimulator()
    setStatus(SIMULATOR_MAINTENANCE_MESSAGE)
end

-- SCRIPT TEMPLATE LIBRARY

local templates = {
    ["Gold leaderstats"] = [[
-- Place this Script in ServerScriptService
game.Players.PlayerAdded:Connect(function(player)
    local stats = Instance.new("Folder")
    stats.Name = "leaderstats"
    stats.Parent = player

    local gold = Instance.new("IntValue")
    gold.Name = "Gold"
    gold.Value = 1000
    gold.Parent = stats
end)
]],

    ["Create a part"] = [[
-- Place this Script in ServerScriptService
local part = Instance.new("Part")
part.Name = "GeneratedPart"
part.Size = Vector3.new(8, 2, 8)
part.Position = Vector3.new(0, 5, 0)
part.Anchored = true
part.Parent = workspace
]],

    ["Touch for Gold"] = [[
-- Put this Script inside a Part in Workspace
local pad = script.Parent
local debounce = {}

pad.Touched:Connect(function(hit)
    local character = hit.Parent
    local player = game.Players:GetPlayerFromCharacter(character)
    if not player or debounce[player] then return end

    local stats = player:FindFirstChild("leaderstats")
    local gold = stats and stats:FindFirstChild("Gold")
    if not gold then return end

    debounce[player] = true
    gold.Value += 10
    task.wait(1)
    debounce[player] = nil
end)
]],

    ["Kill brick"] = [[
-- Put this Script inside a Part in Workspace
local brick = script.Parent

brick.Touched:Connect(function(hit)
    local character = hit.Parent
    local humanoid = character:FindFirstChildOfClass("Humanoid")
    if humanoid then
        humanoid.Health = 0
    end
end)
]],

    ["Speed pad"] = [[
-- Put this Script inside a Part in Workspace
local pad = script.Parent
local debounce = {}

pad.Touched:Connect(function(hit)
    local character = hit.Parent
    local humanoid = character:FindFirstChildOfClass("Humanoid")
    if not humanoid or debounce[character] then return end

    debounce[character] = true
    local oldSpeed = humanoid.WalkSpeed
    humanoid.WalkSpeed = 32

    task.wait(5)

    if humanoid.Parent then
        humanoid.WalkSpeed = oldSpeed
    end

    debounce[character] = nil
end)
]]
}

-- MAIN INTERFACE

local main = create("Frame", {
    Name = "MainWindow",
    AnchorPoint = Vector2.new(0.5, 0.5),
    Position = UDim2.fromScale(0.5, 0.5),
    Size = UDim2.new(0.88, 0, 0.82, 0),
    BackgroundColor3 = BG,
    BorderSizePixel = 0,
    Visible = true
}, gui)

round(main, 14)
outline(main, Color3.fromRGB(74, 63, 100), 1)

create("UISizeConstraint", {
    MinSize = Vector2.new(310, 360),
    MaxSize = Vector2.new(780, 650)
}, main)

local top = create("Frame", {
    BackgroundColor3 = Color3.fromRGB(25, 23, 34),
    BorderSizePixel = 0,
    Size = UDim2.new(1, 0, 0, 58)
}, main)

round(top, 14)

local title = makeLabel(top, "AI BUILDER 2026", 18, WHITE, true)
title.Position = UDim2.new(0, 16, 0, 4)
title.Size = UDim2.new(1, -75, 0, 27)

local subtitle = makeLabel(top, "PROFESSIONAL CREATOR EDITION", 9, MUTED, true)
subtitle.Position = UDim2.new(0, 17, 0, 31)
subtitle.Size = UDim2.new(1, -75, 0, 17)

local closeMain = create("TextButton", {
    BackgroundColor3 = Color3.fromRGB(62, 39, 76),
    BorderSizePixel = 0,
    Size = UDim2.new(0, 35, 0, 35),
    Position = UDim2.new(1, -45, 0, 11),
    Text = "X",
    TextColor3 = WHITE,
    TextSize = 16,
    Font = Enum.Font.GothamBold
}, top)

round(closeMain, 9)

local dockMain = create("TextButton", {
    BackgroundColor3 = PURPLE_DARK,
    BorderSizePixel = 0,
    Position = UDim2.new(0, 10, 0.5, -24),
    Size = UDim2.new(0, 48, 0, 48),
    Text = "AI\nBUILD",
    TextColor3 = WHITE,
    TextSize = 11,
    Font = Enum.Font.GothamBold,
    Visible = false
}, gui)

round(dockMain, 10)
outline(dockMain, PURPLE, 1)

closeMain.Activated:Connect(function()
    main.Visible = false
    dockMain.Visible = true
end)

dockMain.Activated:Connect(function()
    main.Visible = true
    dockMain.Visible = false
end)

local nav = create("ScrollingFrame", {
    Name = "Navigation",
    BackgroundTransparency = 1,
    BorderSizePixel = 0,
    Position = UDim2.new(0, 10, 0, 68),
    Size = UDim2.new(0, 125, 1, -80),
    CanvasSize = UDim2.new(),
    AutomaticCanvasSize = Enum.AutomaticSize.Y,
    ScrollBarThickness = 3,
    ScrollBarImageColor3 = PURPLE
}, main)

create("UIListLayout", {
    Padding = UDim.new(0, 6),
    SortOrder = Enum.SortOrder.LayoutOrder
}, nav)

pageHolder = create("Frame", {
    Name = "Pages",
    BackgroundTransparency = 1,
    Position = UDim2.new(0, 145, 0, 68),
    Size = UDim2.new(1, -155, 1, -80)
}, main)

local function makePage(name)
    local page = create("ScrollingFrame", {
        Name = name,
        BackgroundTransparency = 1,
        BorderSizePixel = 0,
        Size = UDim2.fromScale(1, 1),
        CanvasSize = UDim2.new(),
        AutomaticCanvasSize = Enum.AutomaticSize.Y,
        ScrollBarThickness = 4,
        ScrollBarImageColor3 = PURPLE,
        Visible = false
    }, pageHolder)

    create("UIListLayout", {
        Padding = UDim.new(0, 10),
        SortOrder = Enum.SortOrder.LayoutOrder
    }, page)

    pages[name] = page
    return page
end

local tabNames = {
    "Builder",
    "Advanced Obby",
    "Advanced GUI",
    "Map Builder",
    "Tycoon",
    "Simulator",
    "Scripting",
    "Ask AI",
    "Generated Items"
}

local function switchPage(name)
    currentPage = name

    for pageName, page in pairs(pages) do
        page.Visible = pageName == name
    end

    for _, button in ipairs(nav:GetChildren()) do
        if button:IsA("TextButton") then
            local selected = button.Name == name
            button.BackgroundColor3 = selected and PURPLE_DARK or PANEL
        end
    end
end

for _, name in ipairs(tabNames) do
    local button = create("TextButton", {
        Name = name,
        BackgroundColor3 = PANEL,
        BorderSizePixel = 0,
        Size = UDim2.new(1, -3, 0, 38),
        Text = name,
        TextColor3 = WHITE,
        TextSize = 11,
        Font = Enum.Font.GothamSemibold,
        TextWrapped = true
    }, nav)

    round(button, 8)

    button.Activated:Connect(function()
        switchPage(name)
    end)

    makePage(name)
end

-- BUILDER PAGE

do
    local page = pages["Builder"]

    local intro = makeSection(page, "Build something cool",
        "Create towers, castles, skyscrapers, bridges, trees, and complete maps.")

    local structureInput = makeInput(intro,
        "Try: tower, castle, skyscraper, bridge, tree", "tower")

    makeButton(intro, "Generate Structure", function()
        generateStructure(structureInput.Text)
    end)

    local map = makeSection(page, "World Builder",
        "Map Builder is also available here. Choose a world theme.")

    local mapInput = makeInput(map, "city, island, forest, town", "island")

    makeButton(map, "Generate World Map", function()
        generateMap(mapInput.Text)
    end)

    local quick = makeSection(page, "Quick Builds",
        "One-tap builds for common structures.")

    makeButton(quick, "Tall Tower", function()
        generateStructure("tower")
    end)

    makeButton(quick, "Castle / Fort", function()
        generateStructure("castle")
    end)

    makeButton(quick, "Skyscraper", function()
        generateStructure("skyscraper")
    end)

    makeButton(quick, "Bridge", function()
        generateStructure("bridge")
    end)

    makeButton(quick, "Giant Tree", function()
        generateStructure("tree")
    end)
end

-- ADVANCED OBBY PAGE
-- Displays a maintenance notice instead of a generator button.

do
    local page = pages["Advanced Obby"]

    local section = makeSection(page, "Obby Generation",
        "The obby generator is temporarily unavailable.")

    local notice = makeLabel(
        section,
        OBBY_MAINTENANCE_MESSAGE,
        15,
        WHITE,
        true
    )

    notice.AutomaticSize = Enum.AutomaticSize.Y
    notice.Size = UDim2.new(1, 0, 0, 54)
end

-- ADVANCED GUI PAGE

do
    local page = pages["Advanced GUI"]

    local section = makeSection(page, "Advanced GUI Generator",
        "Generate a polished sample interface with a close button, a reopen dock, and styled content.")

    local styleInput = makeInput(section,
        "shop, inventory, settings, menu, loading", "shop")

    makeButton(section, "Generate GUI", function()
        generateUI(styleInput.Text)
    end)

    local presets = makeSection(page, "GUI Presets",
        "Try one of the prepared interface layouts.")

    makeButton(presets, "Shop UI", function()
        generateUI("shop")
    end)

    makeButton(presets, "Inventory UI", function()
        generateUI("inventory")
    end)

    makeButton(presets, "Settings UI", function()
        generateUI("settings")
    end)

    makeButton(presets, "Main Menu UI", function()
        generateUI("menu")
    end)

    makeButton(presets, "Loading Screen", function()
        generateUI("loading")
    end)
end

-- MAP BUILDER PAGE

do
    local page = pages["Map Builder"]

    local section = makeSection(page, "Map Builder",
        "Build an environment around your current location.")

    local mapInput = makeInput(section,
        "city, town, island, forest", "city")

    makeButton(section, "Generate Map", function()
        generateMap(mapInput.Text)
    end)

    local presets = makeSection(page, "Map Presets",
        "Choose a themed environment.")

    makeButton(presets, "City", function()
        generateMap("city")
    end)

    makeButton(presets, "Town", function()
        generateMap("town")
    end)

    makeButton(presets, "Fantasy Island", function()
        generateMap("island")
    end)

    makeButton(presets, "Forest", function()
        generateMap("forest")
    end)
end

-- TYCOON PAGE

do
    local page = pages["Tycoon"]

    local section = makeSection(page, "Tycoon Generator",
        "Creates a base, machines, purchase pads, a conveyor, and a collector.")

    makeButton(section, "Generate Starter Tycoon", function()
        generateTycoon()
    end)

    local note = makeSection(page, "About Tycoon Gameplay",
        "The generated pads have local demo purchase behavior. For a real multiplayer tycoon, purchases, currency, and saving should be handled by server scripts.")

    makeButton(note, "Show Tycoon Script Templates", function()
        switchPage("Scripting")
        setStatus("Choose a template in the Scripting tab.")
    end)
end

-- SIMULATOR PAGE
-- Displays a maintenance notice instead of generator controls.

do
    local page = pages["Simulator"]

    local section = makeSection(page, "Simulator Generation",
        "The simulator generator is temporarily unavailable.")

    local notice = makeLabel(
        section,
        SIMULATOR_MAINTENANCE_MESSAGE,
        15,
        WHITE,
        true
    )

    notice.AutomaticSize = Enum.AutomaticSize.Y
    notice.Size = UDim2.new(1, 0, 0, 54)
end

-- SCRIPTING PAGE

do
    local page = pages["Scripting"]

    local section = makeSection(page, "Script Template Library",
        "Choose a template to display example Lua code. Copy it into the appropriate Script or LocalScript in Studio.")

    local output = create("TextBox", {
        Name = "ScriptOutput",
        BackgroundColor3 = Color3.fromRGB(12, 12, 17),
        BorderSizePixel = 0,
        Size = UDim2.new(1, 0, 0, 220),
        Text = "-- Choose a template below.",
        TextColor3 = Color3.fromRGB(204, 195, 255),
        TextSize = 11,
        Font = Enum.Font.Code,
        TextXAlignment = Enum.TextXAlignment.Left,
        TextYAlignment = Enum.TextYAlignment.Top,
        TextWrapped = false,
        ClearTextOnFocus = false,
        MultiLine = true
    }, section)

    round(output, 8)
    outline(output, PURPLE, 1)

    local buttons = makeSection(page, "Templates",
        "These are examples. Place each template in the location mentioned in its comments.")

    for _, name in ipairs({
        "Gold leaderstats",
        "Create a part",
        "Touch for Gold",
        "Kill brick",
        "Speed pad"
    }) do
        makeButton(buttons, name, function()
            output.Text = templates[name]
            output.CursorPosition = 1
            setStatus("Loaded template: " .. name)
        end)
    end

    makeSection(page, "Important",
        "This tab displays code only. It does not automatically insert runnable scripts into ServerScriptService or Workspace.")
end

-- ASK AI PAGE

do
    local page = pages["Ask AI"]

    local section = makeSection(page, "Ask AI",
        "Enter a request. This prototype recognizes built-in commands and presets; it is not connected to an external AI service.")

    local prompt = makeInput(section,
        "Example: make a big castle or generate an obby", "")

    makeButton(section, "Generate From Request", function()
        local request = string.lower(prompt.Text)

        if string.find(request, "obby") then
            setStatus(OBBY_MAINTENANCE_MESSAGE)

        elseif string.find(request, "simulator") then
            setStatus(SIMULATOR_MAINTENANCE_MESSAGE)

        elseif string.find(request, "tycoon") then
            generateTycoon()

        elseif string.find(request, "gui")
            or string.find(request, "interface")
            or string.find(request, "shop")
            or string.find(request, "inventory")
            or string.find(request, "settings")
            or string.find(request, "menu") then

            if string.find(request, "inventory") then
                generateUI("inventory")
            elseif string.find(request, "settings") then
                generateUI("settings")
            elseif string.find(request, "menu") then
                generateUI("menu")
            else
                generateUI("shop")
            end

        elseif string.find(request, "map")
            or string.find(request, "city")
            or string.find(request, "forest")
            or string.find(request, "island")
            or string.find(request, "town") then

            if string.find(request, "forest") then
                generateMap("forest")
            elseif string.find(request, "island") then
                generateMap("island")
            elseif string.find(request, "town") then
                generateMap("town")
            else
                generateMap("city")
            end

        elseif string.find(request, "tower")
            or string.find(request, "castle")
            or string.find(request, "bridge")
            or string.find(request, "tree")
            or string.find(request, "building")
            or string.find(request, "skyscraper") then

            generateStructure(request)

        else
            setStatus("I don't recognize that request yet. Try a built-in preset.", true)
        end
    end)

    local presets = makeSection(page, "Quick Requests",
        "Try these supported commands.")

    makeButton(presets, "Make a castle", function()
        generateStructure("castle")
    end)

    makeButton(presets, "Make a city map", function()
        generateMap("city")
    end)

    makeButton(presets, "Make a tycoon", function()
        generateTycoon()
    end)
end

-- GENERATED ITEMS PAGE

do
    local page = pages["Generated Items"]

    local section = makeSection(page, "Generated Items",
        "See and delete objects generated during this Play session.")

    itemList = create("Frame", {
        BackgroundTransparency = 1,
        Size = UDim2.new(1, 0, 0, 10),
        AutomaticSize = Enum.AutomaticSize.Y
    }, section)

    create("UIListLayout", {
        Padding = UDim.new(0, 7),
        SortOrder = Enum.SortOrder.LayoutOrder
    }, itemList)

    makeButton(section, "Delete All Generated Items", function()
        for _, entry in ipairs(generated) do
            if entry.object and entry.object.Parent then
                entry.object:Destroy()
            end

            if entry.gui and entry.gui.Parent then
                entry.gui:Destroy()
            end
        end

        table.clear(generated)
        refreshItems()
        relayoutGeneratedDocks()
        setStatus("Deleted all tracked generated items.")
    end)
end

-- FOOTER STATUS

statusLabel = create("TextLabel", {
    Name = "Status",
    BackgroundColor3 = Color3.fromRGB(22, 22, 30),
    BorderSizePixel = 0,
    Position = UDim2.new(0, 145, 1, -25),
    Size = UDim2.new(1, -155, 0, 19),
    Text = "Ready. Choose a tool to get started.",
    TextColor3 = GREEN,
    TextSize = 10,
    Font = Enum.Font.Gotham,
    TextXAlignment = Enum.TextXAlignment.Left
}, main)

switchPage("Builder")
refreshItems()

print("AI BUILDER 2026 loaded.")

49,330 chars · codepastes.com