[FREE NO KEY] Guess Who AI Ultra *istant & Solver OPEN SOURS
Key Required

[FREE NO KEY] Guess Who AI Ultra *istant & Solver OPEN SOURS

[2 Player] Guess The Personjorik1111jorik1111 2.4K views 7.6K executesUpdated Aug 30, 2026
Unrated
00
Lua Script•1027 lines (37614 chars)
--[[
    GUESS WHO ULTRA ASSISTANT & SOLVER (УГАДАЙ КТО)
    [RU / EN Dual-Language Edition]
    
    Features:
    - Smart In-game Match HUD
    - 50/50 Information Theory Optimal Question Solver
    - Live Opponent & Board Candidate ESP
    - Auto-Flip Gamepass Unlocker & Fast Flip
    - Full Dashboard with RU / EN Language Switcher
    - Toggle with RightShift
]]

local Players = game:GetService("Players")
local TweenService = game:GetService("TweenService")
local UserInputService = game:GetService("UserInputService")
local RunService = game:GetService("RunService")
local ReplicatedStorage = game:GetService("ReplicatedStorage")

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

-- Cleanup previous instance
if PlayerGui:FindFirstChild("GuessWhoUltraAssistant") then
    PlayerGui.GuessWhoUltraAssistant:Destroy()
end
if _G.GuessWhoAssistant_Cleanup then
    pcall(_G.GuessWhoAssistant_Cleanup)
end

-- Game Modules & Remotes
local Shared = ReplicatedStorage:WaitForChild("Shared")
local CharacterData = require(Shared:WaitForChild("characters"):WaitForChild("CharacterData"))
local QuestionCatalogue = require(Shared:WaitForChild("match"):WaitForChild("QuestionCatalogue"))
local MatchConfig = require(Shared:WaitForChild("match"):WaitForChild("MatchConfig"))
local MatchRemotes = require(Shared:WaitForChild("match"):WaitForChild("MatchRemotes"))
local BoardConfig = require(Shared:WaitForChild("board"):WaitForChild("BoardConfig"))

-- 30 Character Image Asset IDs
local ICONS = {
    Ace = "rbxassetid://89692261343405",
    Bo = "rbxassetid://127959519815534",
    Coco = "rbxassetid://134513241817551",
    Daisy = "rbxassetid://75617017110034",
    Dex = "rbxassetid://104027422111427",
    Fern = "rbxassetid://94064121012694",
    Finn = "rbxassetid://102919375315159",
    Gigi = "rbxassetid://136187637834928",
    Gus = "rbxassetid://132003850037908",
    Hazel = "rbxassetid://109647626924661",
    Hugo = "rbxassetid://104735962518107",
    Ivy = "rbxassetid://105983806489389",
    Jack = "rbxassetid://105222372738901",
    June = "rbxassetid://82865657137200",
    Kai = "rbxassetid://112169148079681",
    Leo = "rbxassetid://120469717020970",
    Lulu = "rbxassetid://131498912177926",
    Max = "rbxassetid://79894298228368",
    Mia = "rbxassetid://87720413565534",
    Molly = "rbxassetid://76017943155366",
    Nell = "rbxassetid://83131275615167",
    Otis = "rbxassetid://112355432777561",
    Pip = "rbxassetid://106809036386303",
    Ruby = "rbxassetid://119142851521704",
    Sam = "rbxassetid://114057970904161",
    Tess = "rbxassetid://80452898973801",
    Vic = "rbxassetid://126736246055405",
    Winnie = "rbxassetid://133737866628801",
    Zack = "rbxassetid://70751546705117",
    Zara = "rbxassetid://80431301570767"
}

-- Localization Dictionaries
local RU_QUESTIONS = {
    ["Gender|Male"] = "Это мужчина?",
    ["Gender|Female"] = "Это женщина?",
    ["Hair|Short"] = "У него/неё короткие волосы?",
    ["Hair|Long"] = "У него/неё длинные волосы?",
    ["Hair|Bald"] = "Персонаж лысый?",
    ["HairColor|BlackHairColor"] = "Черные волосы?",
    ["HairColor|BrownHairColor"] = "Каштановые (коричневые) волосы?",
    ["HairColor|BlondeHairColor"] = "Светлые волосы (блондин)?",
    ["HairColor|GreyHairColor"] = "Седые волосы?",
    ["HairColor|RedHairColor"] = "Рыжие волосы?",
    ["EyeColor|BlueEyeColor"] = "Голубые глаза?",
    ["EyeColor|BrownEyeColor"] = "Карие глаза?",
    ["EyeColor|GreenEyeColor"] = "Зеленые глаза?",
    ["SkinTone|Light"] = "Светлая кожа?",
    ["SkinTone|Olive"] = "Оливковая кожа?",
    ["SkinTone|Dark"] = "Темная кожа?",
    ["FacialHair|Mustache"] = "Есть усы?",
    ["FacialHair|Beard"] = "Есть борода?",
    ["Accessories|Glassess"] = "Носит очки?",
    ["Accessories|Hat"] = "Есть головной убор (шляпа)?",
    ["Accessories|Jewellery"] = "Есть украшения (серьги/колье)?"
}

local TRANSLATIONS = {
    RU = {
        HUD_TITLE = "🎯 GUESS WHO ASSISTANT • В ИГРЕ",
        HUD_OPPONENT = "Оппонент: %s",
        HUD_OPPONENT_WAITING = "Ожидание оппонента...",
        HUD_TARGET_FOUND = "🌟 ЦЕЛЬ ОПРЕДЕЛЕНА: %s!",
        HUD_CANDIDATES = "🔍 Кандидатов: %d",
        HUD_BEST_Q = "💡 Рекомендуемый вопрос: %s (делит %d на %d)",
        HUD_ANY_Q = "💡 Задайте любой уточняющий вопрос",
        HUD_MAKE_GUESS = "🎯 СДЕЛАЙТЕ ДОГАДКУ: Выберите карточку %s на доске!",
        
        MINI_TOGGLE = "⚡ МЕНЮ [RShift]",
        MAIN_TITLE = "🔮 GUESS WHO SOLVER & ASSISTANT",
        
        TAB_SOLVER = "🎯 Солвер & Матч",
        TAB_CARDS = "🃏 Все Карточки (30)",
        TAB_TWEAKS = "⚡ Чит-Функции",
        TAB_RADAR = "👁 Столы Сервера",
        
        MATCH_INFO_TITLE = "ИНФОРМАЦИЯ О ТЕКУЩЕМ МАТЧЕ",
        MATCH_OPPONENT = "Соперник: %s",
        MATCH_OUT = "Вне матча",
        MATCH_TARGET_100 = "🌟 ЗАГАДАННАЯ КАРТОЧКА: %s (100% ГАРАНТИЯ)",
        MATCH_CANDIDATES_COUNT = "🎯 Кандидатов осталось: %d из 30",
        MATCH_RECOMMEND_MOVE = "💡 Рекомендуемый вопрос: %s",
        MATCH_WIN_CLICK = "🎯 Нажмите на %s на поле для победы!",
        REMAINING_CANDIDATES = "ОСТАВШИЕСЯ КАНДИДАТЫ ОППОНЕНТА:",
        
        TWEAK_AUTOFLIP = "🔓 Бесплатный Auto-Flip",
        TWEAK_AUTOFLIP_DESC = "Активирует авто-переворот неподходящих карточек",
        TWEAK_ESP = "✨ 3D ESP Подсветка Доски",
        TWEAK_ESP_DESC = "Подсвечивает стоящие тайлы на поле цветом статуса",
        TWEAK_HINT = "💡 Подсказка правильного ответа",
        TWEAK_HINT_DESC = "Подсвечивает верный ответ (Да/Нет) при вопросе соперника",
        TWEAK_INSTANT_FLIP = "⚡ Мгновенно сбросить все отсеянные карточки",
        
        ON = "ВКЛ",
        OFF = "ВЫКЛ",
        
        RADAR_ROW = "🎮 %s vs %s  •  Осталось карточек: %d  •  Вопросов: %d",
        RADAR_BOT = "Бот"
    },
    EN = {
        HUD_TITLE = "🎯 GUESS WHO ASSISTANT • IN MATCH",
        HUD_OPPONENT = "Opponent: %s",
        HUD_OPPONENT_WAITING = "Waiting for opponent...",
        HUD_TARGET_FOUND = "🌟 TARGET IDENTIFIED: %s!",
        HUD_CANDIDATES = "🔍 Candidates: %d",
        HUD_BEST_Q = "💡 Best Question: %s (splits %d vs %d)",
        HUD_ANY_Q = "💡 Ask any clarifying question",
        HUD_MAKE_GUESS = "🎯 MAKE A GUESS: Select card %s on board!",
        
        MINI_TOGGLE = "⚡ MENU [RShift]",
        MAIN_TITLE = "🔮 GUESS WHO SOLVER & ASSISTANT",
        
        TAB_SOLVER = "🎯 Solver & Match",
        TAB_CARDS = "🃏 All Cards (30)",
        TAB_TWEAKS = "⚡ Cheat Features",
        TAB_RADAR = "👁 Server Radar",
        
        MATCH_INFO_TITLE = "CURRENT MATCH INFORMATION",
        MATCH_OPPONENT = "Opponent: %s",
        MATCH_OUT = "Out of match",
        MATCH_TARGET_100 = "🌟 TARGET CARD: %s (100% ACCURACY)",
        MATCH_CANDIDATES_COUNT = "🎯 Candidates remaining: %d of 30",
        MATCH_RECOMMEND_MOVE = "💡 Recommended question: %s",
        MATCH_WIN_CLICK = "🎯 Select %s on the board to win!",
        REMAINING_CANDIDATES = "REMAINING OPPONENT CANDIDATES:",
        
        TWEAK_AUTOFLIP = "🔓 Free Auto-Flip",
        TWEAK_AUTOFLIP_DESC = "Enables auto-flipping of eliminated cards",
        TWEAK_ESP = "✨ 3D Board ESP Highlight",
        TWEAK_ESP_DESC = "Highlights standing tiles on board with status colors",
        TWEAK_HINT = "💡 True Answer Hint",
        TWEAK_HINT_DESC = "Highlights true reply (Yes/No) when opponent asks",
        TWEAK_INSTANT_FLIP = "⚡ Instant Flip All Eliminated Cards",
        
        ON = "ON",
        OFF = "OFF",
        
        RADAR_ROW = "🎮 %s vs %s  •  Cards Left: %d  •  Questions: %d",
        RADAR_BOT = "Bot"
    }
}

-- State
local State = {
    lang = "RU", -- "RU" or "EN"
    inMatch = false,
    opponent = nil,
    opponentUserId = nil,
    mySecret = nil,
    candidates = {},
    history = {},
    espEnabled = true,
    autoAnswerHint = true,
    menuOpen = false
}

local function T(key, ...)
    local dict = TRANSLATIONS[State.lang] or TRANSLATIONS.RU
    local str = dict[key] or key
    if select("#", ...) > 0 then
        return string.format(str, ...)
    end
    return str
end

for _, c in ipairs(CharacterData) do
    table.insert(State.candidates, c)
end

-- Unlock Gamepasses / Free Features
local function unlockFeatures()
    pcall(function()
        LocalPlayer:SetAttribute("OwnsAutoFlip", true)
        LocalPlayer:SetAttribute("AutoFlipEnabled", true)
        LocalPlayer:SetAttribute("DevFreeFlip", true)
    end)
end
unlockFeatures()

-- Solver Engine
local Solver = {}

function Solver.reset()
    State.candidates = {}
    for _, c in ipairs(CharacterData) do
        table.insert(State.candidates, c)
    end
    State.history = {}
end

function Solver.filter(question, answer, reply)
    table.insert(State.history, {question = question, answer = answer, reply = reply})
    local nextCandidates = {}
    local wantMatch = (reply == "Yes")
    
    for _, c in ipairs(State.candidates) do
        local matches = QuestionCatalogue.matches(c, question, answer)
        if matches == wantMatch then
            table.insert(nextCandidates, c)
        end
    end
    State.candidates = nextCandidates
end

function Solver.getBestQuestion()
    local total = #State.candidates
    if total <= 1 then return nil end
    local target = total / 2
    local allPairs = QuestionCatalogue.allPairs()
    local bestPair = nil
    local bestDiff = math.huge
    
    for _, pair in ipairs(allPairs) do
        local yesCount = 0
        for _, c in ipairs(State.candidates) do
            if QuestionCatalogue.matches(c, pair.question, pair.answer) then
                yesCount = yesCount + 1
            end
        end
        if yesCount > 0 and yesCount < total then
            local diff = math.abs(yesCount - target)
            if diff < bestDiff then
                bestDiff = diff
                local engText = QuestionCatalogue.textFor(pair.question, pair.answer) or ""
                local ruKey = pair.question .. "|" .. pair.answer
                local ruText = RU_QUESTIONS[ruKey] or engText
                
                bestPair = {
                    question = pair.question,
                    answer = pair.answer,
                    text = (State.lang == "RU") and ruText or engText,
                    yesCount = yesCount,
                    noCount = total - yesCount,
                    diff = diff
                }
            end
        end
    end
    return bestPair
end

-- UI Construction
local screenGui = Instance.new("ScreenGui")
screenGui.Name = "GuessWhoUltraAssistant"
screenGui.ResetOnSpawn = false
screenGui.ZIndexBehavior = Enum.ZIndexBehavior.Sibling
screenGui.DisplayOrder = 1000
screenGui.Parent = PlayerGui

local function createCorner(parent, radius)
    local c = Instance.new("UICorner")
    c.CornerRadius = UDim.new(0, radius or 8)
    c.Parent = parent
    return c
end

local function createStroke(parent, color, thickness)
    local s = Instance.new("UIStroke")
    s.Color = color or Color3.fromRGB(60, 65, 90)
    s.Thickness = thickness or 1
    s.ApplyStrokeMode = Enum.ApplyStrokeMode.Border
    s.Parent = parent
    return s
end

-- Top In-Game HUD (Compact)
local matchHud = Instance.new("Frame")
matchHud.Name = "MatchHUD"
matchHud.Size = UDim2.new(0, 490, 0, 105)
matchHud.Position = UDim2.new(0.5, -245, 0, 15)
matchHud.BackgroundColor3 = Color3.fromRGB(15, 17, 26)
matchHud.BackgroundTransparency = 0.12
matchHud.BorderSizePixel = 0
matchHud.Visible = false
matchHud.Parent = screenGui
createCorner(matchHud, 14)
createStroke(matchHud, Color3.fromRGB(124, 58, 237), 1.5)

local hudGlow = Instance.new("ImageLabel")
hudGlow.Name = "Glow"
hudGlow.BackgroundTransparency = 1
hudGlow.Position = UDim2.new(0, -15, 0, -15)
hudGlow.Size = UDim2.new(1, 30, 1, 30)
hudGlow.Image = "rbxassetid://5028857084"
hudGlow.ImageColor3 = Color3.fromRGB(124, 58, 237)
hudGlow.ImageTransparency = 0.7
hudGlow.ScaleType = Enum.ScaleType.Slice
hudGlow.SliceCenter = Rect.new(24, 24, 276, 276)
hudGlow.Parent = matchHud

local hudTitle = Instance.new("TextLabel")
hudTitle.Name = "Title"
hudTitle.Size = UDim2.new(1, -28, 0, 22)
hudTitle.Position = UDim2.new(0, 14, 0, 6)
hudTitle.BackgroundTransparency = 1
hudTitle.Font = Enum.Font.GothamBold
hudTitle.TextSize = 13
hudTitle.TextColor3 = Color3.fromRGB(167, 139, 250)
hudTitle.TextXAlignment = Enum.TextXAlignment.Left
hudTitle.Text = T("HUD_TITLE")
hudTitle.Parent = matchHud

local hudOpponent = Instance.new("TextLabel")
hudOpponent.Size = UDim2.new(1, -28, 0, 18)
hudOpponent.Position = UDim2.new(0, 14, 0, 28)
hudOpponent.BackgroundTransparency = 1
hudOpponent.Font = Enum.Font.GothamMedium
hudOpponent.TextSize = 12
hudOpponent.TextColor3 = Color3.fromRGB(200, 205, 225)
hudOpponent.TextXAlignment = Enum.TextXAlignment.Left
hudOpponent.Text = T("HUD_OPPONENT", T("HUD_OPPONENT_WAITING"))
hudOpponent.Parent = matchHud

local hudTarget = Instance.new("TextLabel")
hudTarget.Size = UDim2.new(1, -28, 0, 24)
hudTarget.Position = UDim2.new(0, 14, 0, 48)
hudTarget.BackgroundTransparency = 1
hudTarget.Font = Enum.Font.GothamBold
hudTarget.TextSize = 15
hudTarget.TextColor3 = Color3.fromRGB(52, 211, 153)
hudTarget.TextXAlignment = Enum.TextXAlignment.Left
hudTarget.Text = T("HUD_CANDIDATES", 30)
hudTarget.Parent = matchHud

local hudBestQ = Instance.new("TextLabel")
hudBestQ.Size = UDim2.new(1, -28, 0, 22)
hudBestQ.Position = UDim2.new(0, 14, 0, 74)
hudBestQ.BackgroundTransparency = 1
hudBestQ.Font = Enum.Font.GothamMedium
hudBestQ.TextSize = 12
hudBestQ.TextColor3 = Color3.fromRGB(251, 191, 36)
hudBestQ.TextXAlignment = Enum.TextXAlignment.Left
hudBestQ.Text = T("HUD_BEST_Q", "...", 15, 15)
hudBestQ.Parent = matchHud

-- Mini Floating Toggle Button
local miniToggle = Instance.new("TextButton")
miniToggle.Name = "MiniToggle"
miniToggle.Size = UDim2.new(0, 150, 0, 34)
miniToggle.Position = UDim2.new(0, 15, 0, 15)
miniToggle.BackgroundColor3 = Color3.fromRGB(20, 22, 34)
miniToggle.BackgroundTransparency = 0.15
miniToggle.Font = Enum.Font.GothamBold
miniToggle.TextSize = 12
miniToggle.TextColor3 = Color3.fromRGB(220, 225, 245)
miniToggle.Text = T("MINI_TOGGLE")
miniToggle.Parent = screenGui
createCorner(miniToggle, 8)
createStroke(miniToggle, Color3.fromRGB(124, 58, 237), 1)

-- Main Dashboard Window
local mainWindow = Instance.new("Frame")
mainWindow.Name = "MainWindow"
mainWindow.Size = UDim2.new(0, 690, 0, 465)
mainWindow.Position = UDim2.new(0.5, -345, 0.5, -232)
mainWindow.BackgroundColor3 = Color3.fromRGB(15, 17, 26)
mainWindow.BackgroundTransparency = 0.05
mainWindow.BorderSizePixel = 0
mainWindow.Visible = false
mainWindow.ClipsDescendants = true
mainWindow.Parent = screenGui
createCorner(mainWindow, 14)
createStroke(mainWindow, Color3.fromRGB(75, 80, 115), 1.5)

-- Draggable Header
local header = Instance.new("Frame")
header.Name = "Header"
header.Size = UDim2.new(1, 0, 0, 48)
header.BackgroundColor3 = Color3.fromRGB(22, 25, 38)
header.BorderSizePixel = 0
header.Parent = mainWindow
createCorner(header, 14)

local headerFlatBottom = Instance.new("Frame")
headerFlatBottom.Size = UDim2.new(1, 0, 0, 12)
headerFlatBottom.Position = UDim2.new(0, 0, 1, -12)
headerFlatBottom.BackgroundColor3 = Color3.fromRGB(22, 25, 38)
headerFlatBottom.BorderSizePixel = 0
headerFlatBottom.Parent = header

local title = Instance.new("TextLabel")
title.Size = UDim2.new(0.55, 0, 1, 0)
title.Position = UDim2.new(0, 16, 0, 0)
title.BackgroundTransparency = 1
title.Font = Enum.Font.GothamBold
title.TextSize = 15
title.TextColor3 = Color3.fromRGB(240, 240, 255)
title.TextXAlignment = Enum.TextXAlignment.Left
title.Text = T("MAIN_TITLE")
title.Parent = header

-- Language Switcher Button (in Header)
local langBtn = Instance.new("TextButton")
langBtn.Name = "LangSwitch"
langBtn.Size = UDim2.new(0, 85, 0, 30)
langBtn.Position = UDim2.new(1, -135, 0, 9)
langBtn.BackgroundColor3 = Color3.fromRGB(35, 40, 60)
langBtn.Font = Enum.Font.GothamBold
langBtn.TextSize = 11
langBtn.TextColor3 = Color3.fromRGB(250, 250, 255)
langBtn.Text = (State.lang == "RU") and "🇷🇺 RU" or "🇬🇧 EN"
langBtn.Parent = header
createCorner(langBtn, 6)
createStroke(langBtn, Color3.fromRGB(124, 58, 237), 1)

local closeBtn = Instance.new("TextButton")
closeBtn.Size = UDim2.new(0, 32, 0, 32)
closeBtn.Position = UDim2.new(1, -42, 0, 8)
closeBtn.BackgroundColor3 = Color3.fromRGB(40, 45, 65)
closeBtn.Font = Enum.Font.GothamBold
closeBtn.TextSize = 14
closeBtn.TextColor3 = Color3.fromRGB(200, 205, 220)
closeBtn.Text = "✕"
closeBtn.Parent = header
createCorner(closeBtn, 8)

-- Tab Switcher Bar
local tabContainer = Instance.new("Frame")
tabContainer.Name = "Tabs"
tabContainer.Size = UDim2.new(1, -32, 0, 36)
tabContainer.Position = UDim2.new(0, 16, 0, 56)
tabContainer.BackgroundColor3 = Color3.fromRGB(20, 23, 35)
tabContainer.Parent = mainWindow
createCorner(tabContainer, 8)

local tabLayout = Instance.new("UIListLayout")
tabLayout.FillDirection = Enum.FillDirection.Horizontal
tabLayout.Padding = UDim.new(0, 6)
tabLayout.SortOrder = Enum.SortOrder.LayoutOrder
tabLayout.Parent = tabContainer

local currentTab = "Solver"
local tabButtons = {}
local tabPages = {}

local pagesContainer = Instance.new("Frame")
pagesContainer.Name = "Pages"
pagesContainer.Size = UDim2.new(1, -32, 1, -110)
pagesContainer.Position = UDim2.new(0, 16, 0, 98)
pagesContainer.BackgroundTransparency = 1
pagesContainer.Parent = mainWindow

local function createTab(name, titleKey, layoutOrder)
    local btn = Instance.new("TextButton")
    btn.Name = name .. "Tab"
    btn.Size = UDim2.new(0, 152, 1, 0)
    btn.BackgroundColor3 = (name == currentTab) and Color3.fromRGB(124, 58, 237) or Color3.fromRGB(26, 30, 46)
    btn.Font = Enum.Font.GothamBold
    btn.TextSize = 12
    btn.TextColor3 = (name == currentTab) and Color3.fromRGB(255, 255, 255) or Color3.fromRGB(170, 175, 200)
    btn.Text = T(titleKey)
    btn.LayoutOrder = layoutOrder
    btn.Parent = tabContainer
    createCorner(btn, 6)
    tabButtons[name] = {btn = btn, key = titleKey}
    
    local page = Instance.new("ScrollingFrame")
    page.Name = name .. "Page"
    page.Size = UDim2.new(1, 0, 1, 0)
    page.BackgroundTransparency = 1
    page.BorderSizePixel = 0
    page.ScrollBarThickness = 4
    page.ScrollBarImageColor3 = Color3.fromRGB(90, 80, 150)
    page.Visible = (name == currentTab)
    page.Parent = pagesContainer
    tabPages[name] = page
    
    btn.Activated:Connect(function()
        currentTab = name
        for k, item in pairs(tabButtons) do
            local active = (k == currentTab)
            TweenService:Create(item.btn, TweenInfo.new(0.2), {
                BackgroundColor3 = active and Color3.fromRGB(124, 58, 237) or Color3.fromRGB(26, 30, 46),
                TextColor3 = active and Color3.fromRGB(255, 255, 255) or Color3.fromRGB(170, 175, 200)
            }):Play()
            if tabPages[k] then
                tabPages[k].Visible = active
            end
        end
    end)
    return page
end

local solverPage = createTab("Solver", "TAB_SOLVER", 1)
local cardsPage = createTab("Cards", "TAB_CARDS", 2)
local tweaksPage = createTab("Tweaks", "TAB_TWEAKS", 3)
local radarPage = createTab("Radar", "TAB_RADAR", 4)

-- TAB 1: SOLVER
local solverLayout = Instance.new("UIListLayout")
solverLayout.Padding = UDim.new(0, 10)
solverLayout.SortOrder = Enum.SortOrder.LayoutOrder
solverLayout.Parent = solverPage

local statusCard = Instance.new("Frame")
statusCard.Size = UDim2.new(1, -6, 0, 110)
statusCard.BackgroundColor3 = Color3.fromRGB(22, 26, 40)
statusCard.Parent = solverPage
createCorner(statusCard, 10)
createStroke(statusCard, Color3.fromRGB(55, 60, 85), 1)

local statusTitle = Instance.new("TextLabel")
statusTitle.Size = UDim2.new(1, -20, 0, 24)
statusTitle.Position = UDim2.new(0, 12, 0, 8)
statusTitle.BackgroundTransparency = 1
statusTitle.Font = Enum.Font.GothamBold
statusTitle.TextSize = 14
statusTitle.TextColor3 = Color3.fromRGB(139, 92, 246)
statusTitle.TextXAlignment = Enum.TextXAlignment.Left
statusTitle.Text = T("MATCH_INFO_TITLE")
statusTitle.Parent = statusCard

local solverOpponentText = Instance.new("TextLabel")
solverOpponentText.Size = UDim2.new(0.5, 0, 0, 20)
solverOpponentText.Position = UDim2.new(0, 12, 0, 34)
solverOpponentText.BackgroundTransparency = 1
solverOpponentText.Font = Enum.Font.GothamMedium
solverOpponentText.TextSize = 13
solverOpponentText.TextColor3 = Color3.fromRGB(220, 225, 240)
solverOpponentText.TextXAlignment = Enum.TextXAlignment.Left
solverOpponentText.Text = T("MATCH_OPPONENT", T("MATCH_OUT"))
solverOpponentText.Parent = statusCard

local solverTargetText = Instance.new("TextLabel")
solverTargetText.Size = UDim2.new(1, -24, 0, 24)
solverTargetText.Position = UDim2.new(0, 12, 0, 56)
solverTargetText.BackgroundTransparency = 1
solverTargetText.Font = Enum.Font.GothamBold
solverTargetText.TextSize = 15
solverTargetText.TextColor3 = Color3.fromRGB(52, 211, 153)
solverTargetText.TextXAlignment = Enum.TextXAlignment.Left
solverTargetText.Text = T("MATCH_CANDIDATES_COUNT", 30)
solverTargetText.Parent = statusCard

local solverBestQText = Instance.new("TextLabel")
solverBestQText.Size = UDim2.new(1, -24, 0, 22)
solverBestQText.Position = UDim2.new(0, 12, 0, 80)
solverBestQText.BackgroundTransparency = 1
solverBestQText.Font = Enum.Font.GothamMedium
solverBestQText.TextSize = 12
solverBestQText.TextColor3 = Color3.fromRGB(251, 191, 36)
solverBestQText.TextXAlignment = Enum.TextXAlignment.Left
solverBestQText.Text = T("MATCH_RECOMMEND_MOVE", "...")
solverBestQText.Parent = statusCard

local candidateSectionTitle = Instance.new("TextLabel")
candidateSectionTitle.Size = UDim2.new(1, -6, 0, 24)
candidateSectionTitle.BackgroundTransparency = 1
candidateSectionTitle.Font = Enum.Font.GothamBold
candidateSectionTitle.TextSize = 13
candidateSectionTitle.TextColor3 = Color3.fromRGB(160, 165, 190)
candidateSectionTitle.TextXAlignment = Enum.TextXAlignment.Left
candidateSectionTitle.Text = T("REMAINING_CANDIDATES")
candidateSectionTitle.Parent = solverPage

local candidateGrid = Instance.new("Frame")
candidateGrid.Size = UDim2.new(1, -6, 0, 160)
candidateGrid.BackgroundTransparency = 1
candidateGrid.Parent = solverPage

local gridLayout = Instance.new("UIGridLayout")
gridLayout.CellSize = UDim2.new(0, 92, 0, 76)
gridLayout.CellPadding = UDim2.new(0, 8, 0, 8)
gridLayout.Parent = candidateGrid

-- TAB 2: 30 CARDS GALLERY
local cardsGrid = Instance.new("Frame")
cardsGrid.Size = UDim2.new(1, -6, 0, 520)
cardsGrid.BackgroundTransparency = 1
cardsGrid.Parent = cardsPage

local cardsGridLayout = Instance.new("UIGridLayout")
cardsGridLayout.CellSize = UDim2.new(0, 96, 0, 96)
cardsGridLayout.CellPadding = UDim2.new(0, 8, 0, 8)
cardsGridLayout.Parent = cardsGrid

local function populateCardsGallery()
    for _, c in ipairs(CharacterData) do
        local card = Instance.new("Frame")
        card.Name = c.name
        card.BackgroundColor3 = Color3.fromRGB(22, 26, 40)
        card.Parent = cardsGrid
        createCorner(card, 8)
        createStroke(card, Color3.fromRGB(50, 55, 75), 1)
        
        local icon = Instance.new("ImageLabel")
        icon.Size = UDim2.new(1, -12, 1, -26)
        icon.Position = UDim2.new(0, 6, 0, 6)
        icon.BackgroundTransparency = 1
        icon.Image = ICONS[c.name] or ""
        icon.ScaleType = Enum.ScaleType.Fit
        icon.Parent = card
        
        local name = Instance.new("TextLabel")
        name.Size = UDim2.new(1, 0, 0, 16)
        name.Position = UDim2.new(0, 0, 1, -18)
        name.BackgroundTransparency = 1
        name.Font = Enum.Font.GothamBold
        name.TextSize = 11
        name.TextColor3 = Color3.fromRGB(220, 225, 245)
        name.Text = c.name
        name.Parent = card
    end
end
populateCardsGallery()

-- TAB 3: TWEAKS
local tweaksLayout = Instance.new("UIListLayout")
tweaksLayout.Padding = UDim.new(0, 8)
tweaksLayout.Parent = tweaksPage

local tweakControls = {}

local function createToggle(parent, titleKey, descKey, initialVal, onToggle)
    local row = Instance.new("Frame")
    row.Size = UDim2.new(1, -6, 0, 56)
    row.BackgroundColor3 = Color3.fromRGB(22, 26, 40)
    row.Parent = parent
    createCorner(row, 8)
    createStroke(row, Color3.fromRGB(50, 55, 75), 1)
    
    local lbl = Instance.new("TextLabel")
    lbl.Size = UDim2.new(0.7, 0, 0, 20)
    lbl.Position = UDim2.new(0, 12, 0, 8)
    lbl.BackgroundTransparency = 1
    lbl.Font = Enum.Font.GothamBold
    lbl.TextSize = 13
    lbl.TextColor3 = Color3.fromRGB(240, 240, 255)
    lbl.TextXAlignment = Enum.TextXAlignment.Left
    lbl.Text = T(titleKey)
    lbl.Parent = row
    
    local desc = Instance.new("TextLabel")
    desc.Size = UDim2.new(0.7, 0, 0, 18)
    desc.Position = UDim2.new(0, 12, 0, 28)
    desc.BackgroundTransparency = 1
    desc.Font = Enum.Font.Gotham
    desc.TextSize = 11
    desc.TextColor3 = Color3.fromRGB(150, 155, 180)
    desc.TextXAlignment = Enum.TextXAlignment.Left
    desc.Text = T(descKey)
    desc.Parent = row
    
    local btn = Instance.new("TextButton")
    btn.Size = UDim2.new(0, 70, 0, 32)
    btn.Position = UDim2.new(1, -82, 0, 12)
    btn.BackgroundColor3 = initialVal and Color3.fromRGB(16, 185, 129) or Color3.fromRGB(45, 50, 70)
    btn.Font = Enum.Font.GothamBold
    btn.TextSize = 11
    btn.TextColor3 = Color3.fromRGB(255, 255, 255)
    btn.Text = initialVal and T("ON") or T("OFF")
    btn.Parent = row
    createCorner(btn, 6)
    
    local val = initialVal
    btn.Activated:Connect(function()
        val = not val
        btn.Text = val and T("ON") or T("OFF")
        TweenService:Create(btn, TweenInfo.new(0.2), {
            BackgroundColor3 = val and Color3.fromRGB(16, 185, 129) or Color3.fromRGB(45, 50, 70)
        }):Play()
        onToggle(val)
    end)
    
    table.insert(tweakControls, {
        lbl = lbl, titleKey = titleKey,
        desc = desc, descKey = descKey,
        btn = btn, getVal = function() return val end
    })
    return row
end

createToggle(tweaksPage, "TWEAK_AUTOFLIP", "TWEAK_AUTOFLIP_DESC", true, function(v)
    LocalPlayer:SetAttribute("OwnsAutoFlip", v)
    LocalPlayer:SetAttribute("AutoFlipEnabled", v)
end)

createToggle(tweaksPage, "TWEAK_ESP", "TWEAK_ESP_DESC", State.espEnabled, function(v)
    State.espEnabled = v
end)

createToggle(tweaksPage, "TWEAK_HINT", "TWEAK_HINT_DESC", State.autoAnswerHint, function(v)
    State.autoAnswerHint = v
end)

local flipBtn = Instance.new("TextButton")
flipBtn.Size = UDim2.new(1, -6, 0, 42)
flipBtn.BackgroundColor3 = Color3.fromRGB(124, 58, 237)
flipBtn.Font = Enum.Font.GothamBold
flipBtn.TextSize = 13
flipBtn.TextColor3 = Color3.fromRGB(255, 255, 255)
flipBtn.Text = T("TWEAK_INSTANT_FLIP")
flipBtn.Parent = tweaksPage
createCorner(flipBtn, 8)

flipBtn.Activated:Connect(function()
    pcall(function()
        local myBoard = workspace.Boards:FindFirstChild("Board_" .. LocalPlayer.Name)
        if myBoard and myBoard:FindFirstChild("Tiles") then
            for _, tile in ipairs(myBoard.Tiles:GetChildren()) do
                local charName = tile:GetAttribute("CharacterName")
                local isCandidate = false
                for _, c in ipairs(State.candidates) do
                    if c.name == charName then isCandidate = true break end
                end
                if not isCandidate then
                    local remote = ReplicatedStorage.Remotes.Board.TileFlipped
                    remote:FireServer(tile.Name, true)
                end
            end
        end
    end)
end)

-- TAB 4: RADAR
local radarLayout = Instance.new("UIListLayout")
radarLayout.Padding = UDim.new(0, 8)
radarLayout.Parent = radarPage

local function updateRadar()
    for _, ch in ipairs(radarPage:GetChildren()) do
        if ch:IsA("Frame") then ch:Destroy() end
    end
    
    for _, p in ipairs(Players:GetPlayers()) do
        local phase = p:GetAttribute("MatchPhase")
        local oppId = p:GetAttribute("MatchOpponentUserId")
        if phase == "Playing" and oppId then
            local opp = nil
            for _, other in ipairs(Players:GetPlayers()) do
                if other.UserId == oppId then opp = other break end
            end
            local b = workspace.Boards:FindFirstChild("Board_" .. p.Name)
            local count = b and b:FindFirstChild("Tiles") and #b.Tiles:GetChildren() or 0
            
            local row = Instance.new("Frame")
            row.Size = UDim2.new(1, -6, 0, 52)
            row.BackgroundColor3 = Color3.fromRGB(22, 26, 40)
            row.Parent = radarPage
            createCorner(row, 8)
            createStroke(row, Color3.fromRGB(50, 55, 75), 1)
            
            local txt = Instance.new("TextLabel")
            txt.Size = UDim2.new(1, -20, 1, 0)
            txt.Position = UDim2.new(0, 12, 0, 0)
            txt.BackgroundTransparency = 1
            txt.Font = Enum.Font.GothamMedium
            txt.TextSize = 12
            txt.TextColor3 = Color3.fromRGB(220, 225, 240)
            txt.TextXAlignment = Enum.TextXAlignment.Left
            txt.Text = T("RADAR_ROW", p.DisplayName, opp and opp.DisplayName or T("RADAR_BOT"), count, p:GetAttribute("QuestionsAsked") or 0)
            txt.Parent = row
        end
    end
end

local function refreshCandidateGrid()
    for _, ch in ipairs(candidateGrid:GetChildren()) do
        if ch:IsA("Frame") then ch:Destroy() end
    end
    
    local count = #State.candidates
    candidateGrid.Size = UDim2.new(1, -6, 0, math.ceil(count / 6) * 84 + 10)
    
    for _, c in ipairs(State.candidates) do
        local card = Instance.new("Frame")
        card.Name = c.name
        card.BackgroundColor3 = Color3.fromRGB(26, 30, 46)
        card.Parent = candidateGrid
        createCorner(card, 6)
        
        local icon = Instance.new("ImageLabel")
        icon.Size = UDim2.new(1, -8, 1, -22)
        icon.Position = UDim2.new(0, 4, 0, 4)
        icon.BackgroundTransparency = 1
        icon.Image = ICONS[c.name] or ""
        icon.ScaleType = Enum.ScaleType.Fit
        icon.Parent = card
        
        local lbl = Instance.new("TextLabel")
        lbl.Size = UDim2.new(1, 0, 0, 16)
        lbl.Position = UDim2.new(0, 0, 1, -16)
        lbl.BackgroundTransparency = 1
        lbl.Font = Enum.Font.GothamBold
        lbl.TextSize = 10
        lbl.TextColor3 = Color3.fromRGB(220, 225, 245)
        lbl.Text = c.name
        lbl.Parent = card
    end
end

local function updateUI()
    local count = #State.candidates
    local oppName = State.opponent and State.opponent.DisplayName or T("HUD_OPPONENT_WAITING")
    
    hudTitle.Text = T("HUD_TITLE")
    hudOpponent.Text = T("HUD_OPPONENT", oppName)
    solverOpponentText.Text = T("MATCH_OPPONENT", State.opponent and State.opponent.DisplayName or T("MATCH_OUT"))
    statusTitle.Text = T("MATCH_INFO_TITLE")
    candidateSectionTitle.Text = T("REMAINING_CANDIDATES")
    miniToggle.Text = T("MINI_TOGGLE")
    title.Text = T("MAIN_TITLE")
    flipBtn.Text = T("TWEAK_INSTANT_FLIP")
    
    for _, item in pairs(tweakControls) do
        item.lbl.Text = T(item.titleKey)
        item.desc.Text = T(item.descKey)
        item.btn.Text = item.getVal() and T("ON") or T("OFF")
    end
    
    for _, item in pairs(tabButtons) do
        item.btn.Text = T(item.key)
    end
    
    if count == 1 then
        local target = State.candidates[1].name
        hudTarget.Text = T("HUD_TARGET_FOUND", target)
        hudTarget.TextColor3 = Color3.fromRGB(251, 191, 36)
        solverTargetText.Text = T("MATCH_TARGET_100", target)
        solverTargetText.TextColor3 = Color3.fromRGB(251, 191, 36)
        hudBestQ.Text = T("HUD_MAKE_GUESS", target)
        solverBestQText.Text = T("MATCH_WIN_CLICK", target)
    else
        hudTarget.Text = T("HUD_CANDIDATES", count)
        hudTarget.TextColor3 = Color3.fromRGB(52, 211, 153)
        solverTargetText.Text = T("MATCH_CANDIDATES_COUNT", count)
        solverTargetText.TextColor3 = Color3.fromRGB(52, 211, 153)
        
        local best = Solver.getBestQuestion()
        if best then
            hudBestQ.Text = T("HUD_BEST_Q", best.text, best.yesCount, best.noCount)
            solverBestQText.Text = T("MATCH_RECOMMEND_MOVE", best.text)
        else
            hudBestQ.Text = T("HUD_ANY_Q")
            solverBestQText.Text = T("HUD_ANY_Q")
        end
    end
    
    refreshCandidateGrid()
end

-- Language Switch Action
langBtn.Activated:Connect(function()
    State.lang = (State.lang == "RU") and "EN" or "RU"
    langBtn.Text = (State.lang == "RU") and "🇷🇺 RU" or "🇬🇧 EN"
    updateUI()
    updateRadar()
end)

-- Dragging
local dragging = false
local dragInput, dragStart, startPos
header.InputBegan:Connect(function(input)
    if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then
        dragging = true
        dragStart = input.Position
        startPos = mainWindow.Position
    end
end)
UserInputService.InputEnded:Connect(function(input)
    if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then
        dragging = false
    end
end)
header.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
        mainWindow.Position = UDim2.new(startPos.X.Scale, startPos.X.Offset + delta.X, startPos.Y.Scale, startPos.Y.Offset + delta.Y)
    end
end)

-- Toggle Menu
local function toggleMenu()
    State.menuOpen = not State.menuOpen
    mainWindow.Visible = State.menuOpen
    if State.menuOpen then
        updateRadar()
        updateUI()
        mainWindow.Size = UDim2.new(0, 690, 0, 425)
        TweenService:Create(mainWindow, TweenInfo.new(0.25, Enum.EasingStyle.Back, Enum.EasingDirection.Out), {
            Size = UDim2.new(0, 690, 0, 465)
        }):Play()
    end
end

closeBtn.Activated:Connect(toggleMenu)
miniToggle.Activated:Connect(toggleMenu)

-- Keybind: RightShift
UserInputService.InputBegan:Connect(function(input, processed)
    if processed then return end
    if input.KeyCode == Enum.KeyCode.RightShift then
        toggleMenu()
    end
end)

-- Match Remotes
MatchRemotes.secretCharacter().OnClientEvent:Connect(function(charName)
    State.mySecret = charName
end)

MatchRemotes.questionAnswered().OnClientEvent:Connect(function(q, a, reply)
    local role = LocalPlayer:GetAttribute("MatchRole")
    if role == "Asking" then
        Solver.filter(q, a, reply)
        updateUI()
    end
end)

-- Watcher Loop
task.spawn(function()
    while screenGui.Parent do
        unlockFeatures()
        local phase = LocalPlayer:GetAttribute("MatchPhase")
        local inGame = (phase == "Playing" or phase == "ReadyUpPhase" or phase == "Reveal")
        
        if inGame ~= State.inMatch then
            State.inMatch = inGame
            matchHud.Visible = inGame
            if inGame then
                Solver.reset()
                local oppId = LocalPlayer:GetAttribute("MatchOpponentUserId")
                if oppId then
                    for _, p in ipairs(Players:GetPlayers()) do
                        if p.UserId == oppId then State.opponent = p break end
                    end
                end
                updateUI()
            end
        end
        
        -- 3D ESP
        if State.espEnabled and inGame then
            pcall(function()
                local myBoard = workspace.Boards:FindFirstChild("Board_" .. LocalPlayer.Name)
                if myBoard and myBoard:FindFirstChild("Tiles") then
                    for _, tile in ipairs(myBoard.Tiles:GetChildren()) do
                        local name = tile:GetAttribute("CharacterName")
                        local hl = tile:FindFirstChild("SolverHighlight") or Instance.new("Highlight")
                        hl.Name = "SolverHighlight"
                        hl.Adornee = tile
                        hl.Parent = tile
                        
                        local isCandidate = false
                        for _, c in ipairs(State.candidates) do
                            if c.name == name then isCandidate = true break end
                        end
                        
                        if #State.candidates == 1 and isCandidate then
                            hl.FillColor = Color3.fromRGB(251, 191, 36)
                            hl.OutlineColor = Color3.fromRGB(255, 255, 255)
                            hl.FillTransparency = 0.2
                        elseif isCandidate then
                            hl.FillColor = Color3.fromRGB(16, 185, 129)
                            hl.OutlineColor = Color3.fromRGB(52, 211, 153)
                            hl.FillTransparency = 0.5
                        else
                            hl.FillColor = Color3.fromRGB(239, 68, 68)
                            hl.OutlineColor = Color3.fromRGB(150, 40, 40)
                            hl.FillTransparency = 0.8
                        end
                    end
                end
            end)
        end
        
        task.wait(0.5)
    end
end)

-- Cleanup Handler
_G.GuessWhoAssistant_Cleanup = function()
    if screenGui then screenGui:Destroy() end
    for _, b in ipairs(workspace.Boards:GetChildren()) do
        for _, t in ipairs(b:GetDescendants()) do
            if t.Name == "SolverHighlight" then t:Destroy() end
        end
    end
end

updateUI()
print("[GuessWho] Ultra Assistant [RU/EN] loaded successfully!")

Features & Information

OPEN SOURS GUESS WHO ULTRA ASSISTANT & SOLVER (УГАДАЙ КТО) [RU / EN Dual-Language Edition] Features: - Smart In-game Match HUD - 50/50 Information Theory Optimal Question Solver - Live Opponent & Board Candidate ESP - Auto-Flip Gamepass Unlocker & Fast Flip - Full Dashboard with RU / EN Language Switcher - Toggle with RightShift 🌟 Core Features & Modules 1. 🎯 Smart In-Game Match HUD (Compact Overlay) Auto-Activation: Seamlessly fades in at the top of your screen as soon as you sit down at a board and start playing, and hides when you return to the lobby. Opponent Tracker: Displays your current table opponent’s username/display name in real time. Remaining Candidates Counter: Continuously tracks and updates the number of possible characters remaining. 100% Target Identification: As soon as deductive elimination leaves only 1 candidate, the HUD flashes with a golden glow: 🌟 TARGET IDENTIFIED: [Character Name]!. 50/50 Optimal Question Solver: Powered by Information Theory, it calculates the mathematically optimal question to split remaining candidates 50/50 ( 15 → 7 → 3 → 1 15→7→3→1), allowing you to win any match in just 2–3 turns. 2. 🔮 Main Dashboard (4 Feature Tabs) Tab 1: 🎯 Solver & Match Full match overview: Opponent details, current stage, and recommended move. Live visual candidate grid: Displays real-time portraits of all remaining characters. Tab 2: 🃏 All Cards (30 Characters) Complete interactive database of all 30 game characters featuring high-resolution avatars and official in-game assets. Tab 3: ⚡ Cheat Features & Tweaks 🔓 Free Auto-Flip Gamepass Unlocker: Activates the paid Auto-Flip gamepass for free via client attribute overrides. ⚡ Instant Flip (One-Click): Instantly forces all eliminated tiles on your board to drop down in 0.01 0.01 seconds (faster than paid Auto-Flip). ✨ 3D Board ESP Highlights: Renders custom bounding highlights over physical board tiles (🟢 Green = Valid Candidate, 🔴 Red = Eliminated, 🟡 Gold = Guaranteed Win Target). 💡 True Answer Helper: Automatically calculates and highlights the true response ("Yes" / "No") whenever your opponent asks a question. Tab 4: 👁 Server Radar (Live Spectator) Real-time monitoring feed of every table on the server, tracking standing tile counts, asked question numbers, and match progress. СДЕЛАНО НЕЙРОНКОЙ Create by AI
#Free#NoKey#GuessThePerson

Community Comments (0)

No comments yet for this script.