![[FREE NO KEY] Guess Who AI Ultra *istant & Solver OPEN SOURS](https://cdn.kocakz.me/images/adf4b51b4de1fa1993ea478ebb24bfd7cc147141a04e456fc47dbfff26daaa56.webp)
Key Required
[FREE NO KEY] Guess Who AI Ultra *istant & Solver OPEN SOURS
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
Community Comments (0)
No comments yet for this script.
