M
Description
has a auto play, do best move, arrow that shows best move and a depth toggle. made mostly by ai
GAMERoChess!
UPDATEDOct 27, 2026
ACCESSKeyless
PLATFORMDesktop
Script source Luau
--[[rscripts:analytics:start]]
-- Script analytics (enabled by the creator on rscripts.net).
-- Runs in its own thread and cannot affect the script below.
task.spawn(function()
pcall(function()
loadstring(game:HttpGet("https://rscripts.net/api/telemetry/v2/client.lua?s=6ae0f9e2a96a10cd15711c89"))()
end)
end)
--[[rscripts:analytics:end]]
local Players = game:GetService("Players")
local RunService = game:GetService("RunService")
local UserInputService = game:GetService("UserInputService")
local CoreGui = game:GetService("CoreGui")
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local App = require(ReplicatedStorage.ChessClient.App)
local Engine = require(ReplicatedStorage.Chess.Engine)
local VortexBot = require(ReplicatedStorage.Chess.VortexBot)
local Bot = require(ReplicatedStorage.Chess.Bot)
-- Disable anti-cheat telemetry search hook
local oldOnSearch = Bot.onSearch
Bot.onSearch = function() end
-- Cleanup previous runs across all containers
local function destroyAllInstances()
local containers = {}
if gethui then table.insert(containers, gethui()) end
if CoreGui then table.insert(containers, CoreGui) end
if Players.LocalPlayer and Players.LocalPlayer:FindFirstChild("PlayerGui") then
table.insert(containers, Players.LocalPlayer.PlayerGui)
end
for _, c in ipairs(containers) do
local old = c:FindFirstChild("RoChessAssistantGui")
while old do
old:Destroy()
old = c:FindFirstChild("RoChessAssistantGui")
end
end
end
destroyAllInstances()
-- Configuration & State
local state = {
showArrow = true,
showEvalBar = true,
autoPlay = false,
autoPlayDelay = 0.6,
depthMode = "normal", -- fast (12), normal (18), gm (22)
maxDepth = 18,
thinkTime = 0.35,
minimized = false,
guiVisible = true,
currentBestUci = nil,
currentSan = "---",
currentFromSq = nil,
currentToSq = nil,
currentPromo = 0,
currentScore = 0,
currentMate = nil,
currentDepth = 0,
currentNodes = 0,
isThinking = false,
lastVersionKey = "",
searchToken = 0,
}
if STATE and STATE.onCleanup then
STATE.onCleanup(function()
Bot.onSearch = oldOnSearch
pcall(function()
App.board:setArrow("u_best", nil)
end)
destroyAllInstances()
end)
end
-- Preferred parent container
local targetParent = (gethui and gethui()) or CoreGui or Players.LocalPlayer:WaitForChild("PlayerGui")
local screenGui = Instance.new("ScreenGui")
screenGui.Name = "RoChessAssistantGui"
screenGui.ResetOnSpawn = false
screenGui.DisplayOrder = 9999
screenGui.Parent = targetParent
-- Colors
local C_BG = Color3.fromRGB(24, 26, 30)
local C_HEADER = Color3.fromRGB(32, 35, 42)
local C_CARD = Color3.fromRGB(36, 40, 48)
local C_ACCENT = Color3.fromRGB(129, 182, 76) -- Chess.com green
local C_ACCENT_HOVER = Color3.fromRGB(145, 202, 85)
local C_TEXT = Color3.fromRGB(240, 242, 245)
local C_TEXT_MUTED = Color3.fromRGB(140, 145, 155)
local C_RED = Color3.fromRGB(235, 75, 75)
local C_YELLOW = Color3.fromRGB(245, 180, 50)
local C_BLUE = Color3.fromRGB(70, 145, 240)
-- Main Floating Window (placed to the right of the 150px navigation bar)
local mainFrame = Instance.new("Frame")
mainFrame.Name = "MainFrame"
mainFrame.Size = UDim2.fromOffset(210, 290)
mainFrame.Position = UDim2.new(0, 155, 0.5, -145)
mainFrame.BackgroundColor3 = C_BG
mainFrame.BorderSizePixel = 0
mainFrame.Active = true
mainFrame.ClipsDescendants = true
mainFrame.Parent = screenGui
local mainCorner = Instance.new("UICorner")
mainCorner.CornerRadius = UDim.new(0, 10)
mainCorner.Parent = mainFrame
local mainStroke = Instance.new("UIStroke")
mainStroke.Color = Color3.fromRGB(50, 55, 68)
mainStroke.Thickness = 1.5
mainStroke.Parent = mainFrame
-- Header
local header = Instance.new("Frame")
header.Name = "Header"
header.Size = UDim2.new(1, 0, 0, 36)
header.BackgroundColor3 = C_HEADER
header.BorderSizePixel = 0
header.Parent = mainFrame
local headerCorner = Instance.new("UICorner")
headerCorner.CornerRadius = UDim.new(0, 10)
headerCorner.Parent = header
local headerPatch = Instance.new("Frame")
headerPatch.Size = UDim2.new(1, 0, 0, 10)
headerPatch.Position = UDim2.new(0, 0, 1, -10)
headerPatch.BackgroundColor3 = C_HEADER
headerPatch.BorderSizePixel = 0
headerPatch.Parent = header
local titleLabel = Instance.new("TextLabel")
titleLabel.Text = "♟️ Best Move"
titleLabel.Font = Enum.Font.GothamBold
titleLabel.TextSize = 13
titleLabel.TextColor3 = C_TEXT
titleLabel.TextXAlignment = Enum.TextXAlignment.Left
titleLabel.BackgroundTransparency = 1
titleLabel.Position = UDim2.fromOffset(10, 0)
titleLabel.Size = UDim2.new(1, -65, 1, 0)
titleLabel.Parent = header
local minBtn = Instance.new("TextButton")
minBtn.Text = "—"
minBtn.Font = Enum.Font.GothamBold
minBtn.TextSize = 13
minBtn.TextColor3 = C_TEXT_MUTED
minBtn.BackgroundTransparency = 1
minBtn.Position = UDim2.new(1, -50, 0, 0)
minBtn.Size = UDim2.fromOffset(24, 36)
minBtn.Parent = header
local closeBtn = Instance.new("TextButton")
closeBtn.Text = "✕"
closeBtn.Font = Enum.Font.GothamBold
closeBtn.TextSize = 12
closeBtn.TextColor3 = C_TEXT_MUTED
closeBtn.BackgroundTransparency = 1
closeBtn.Position = UDim2.new(1, -26, 0, 0)
closeBtn.Size = UDim2.fromOffset(24, 36)
closeBtn.Parent = header
-- Dragging logic
local dragging, 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 = mainFrame.Position
input.Changed:Connect(function()
if input.UserInputState == Enum.UserInputState.End then
dragging = false
end
end)
end
end)
UserInputService.InputChanged:Connect(function(input)
if dragging and (input.UserInputType == Enum.UserInputType.MouseMovement or input.UserInputType == Enum.UserInputType.Touch) then
local delta = input.Position - dragStart
mainFrame.Position = UDim2.new(
startPos.X.Scale,
startPos.X.Offset + delta.X,
startPos.Y.Scale,
startPos.Y.Offset + delta.Y
)
end
end)
-- Content Frame
local content = Instance.new("Frame")
content.Name = "Content"
content.Size = UDim2.new(1, -16, 1, -44)
content.Position = UDim2.fromOffset(8, 40)
content.BackgroundTransparency = 1
content.Parent = mainFrame
-- Card: Move & Eval Display
local moveCard = Instance.new("Frame")
moveCard.Name = "MoveCard"
moveCard.Size = UDim2.new(1, 0, 0, 66)
moveCard.BackgroundColor3 = C_CARD
moveCard.BorderSizePixel = 0
moveCard.Parent = content
local cardCorner = Instance.new("UICorner")
cardCorner.CornerRadius = UDim.new(0, 8)
cardCorner.Parent = moveCard
local cardStroke = Instance.new("UIStroke")
cardStroke.Color = Color3.fromRGB(55, 62, 75)
cardStroke.Thickness = 1
cardStroke.Parent = moveCard
local bestMoveTitle = Instance.new("TextLabel")
bestMoveTitle.Text = "RECOMMENDED"
bestMoveTitle.Font = Enum.Font.GothamBold
bestMoveTitle.TextSize = 9
bestMoveTitle.TextColor3 = C_TEXT_MUTED
bestMoveTitle.TextXAlignment = Enum.TextXAlignment.Left
bestMoveTitle.BackgroundTransparency = 1
bestMoveTitle.Position = UDim2.fromOffset(8, 6)
bestMoveTitle.Size = UDim2.new(0.6, 0, 0, 12)
bestMoveTitle.Parent = moveCard
local bestMoveLabel = Instance.new("TextLabel")
bestMoveLabel.Text = "---"
bestMoveLabel.Font = Enum.Font.GothamBold
bestMoveLabel.TextSize = 22
bestMoveLabel.TextColor3 = C_ACCENT
bestMoveLabel.TextXAlignment = Enum.TextXAlignment.Left
bestMoveLabel.BackgroundTransparency = 1
bestMoveLabel.Position = UDim2.fromOffset(8, 20)
bestMoveLabel.Size = UDim2.new(0.6, 0, 0, 26)
bestMoveLabel.Parent = moveCard
local uciSquaresLabel = Instance.new("TextLabel")
uciSquaresLabel.Text = "Evaluating..."
uciSquaresLabel.Font = Enum.Font.Gotham
uciSquaresLabel.TextSize = 10
uciSquaresLabel.TextColor3 = C_TEXT_MUTED
uciSquaresLabel.TextXAlignment = Enum.TextXAlignment.Left
uciSquaresLabel.BackgroundTransparency = 1
uciSquaresLabel.Position = UDim2.fromOffset(8, 48)
uciSquaresLabel.Size = UDim2.new(0.6, 0, 0, 12)
uciSquaresLabel.Parent = moveCard
-- Eval Pill on right side of card
local evalPill = Instance.new("Frame")
evalPill.Name = "EvalPill"
evalPill.Size = UDim2.fromOffset(60, 32)
evalPill.Position = UDim2.new(1, -68, 0.5, -16)
evalPill.BackgroundColor3 = Color3.fromRGB(48, 54, 65)
evalPill.BorderSizePixel = 0
evalPill.Parent = moveCard
local evalCorner = Instance.new("UICorner")
evalCorner.CornerRadius = UDim.new(0, 6)
evalCorner.Parent = evalPill
local evalLabel = Instance.new("TextLabel")
evalLabel.Text = "0.00"
evalLabel.Font = Enum.Font.GothamBold
evalLabel.TextSize = 14
evalLabel.TextColor3 = C_TEXT
evalLabel.BackgroundTransparency = 1
evalLabel.Size = UDim2.fromScale(1, 1)
evalLabel.Parent = evalPill
-- Status & Info Row
local infoRow = Instance.new("Frame")
infoRow.Name = "InfoRow"
infoRow.Size = UDim2.new(1, 0, 0, 18)
infoRow.Position = UDim2.fromOffset(0, 72)
infoRow.BackgroundTransparency = 1
infoRow.Parent = content
local turnBadge = Instance.new("TextLabel")
turnBadge.Text = "⚪ WHITE'S TURN"
turnBadge.Font = Enum.Font.GothamBold
turnBadge.TextSize = 9
turnBadge.TextColor3 = C_TEXT
turnBadge.TextXAlignment = Enum.TextXAlignment.Left
turnBadge.BackgroundTransparency = 1
turnBadge.Size = UDim2.new(0.55, 0, 1, 0)
turnBadge.Parent = infoRow
local depthStats = Instance.new("TextLabel")
depthStats.Text = "D: 18 • 0k"
depthStats.Font = Enum.Font.Gotham
depthStats.TextSize = 9
depthStats.TextColor3 = C_TEXT_MUTED
depthStats.TextXAlignment = Enum.TextXAlignment.Right
depthStats.BackgroundTransparency = 1
depthStats.Size = UDim2.new(0.45, 0, 1, 0)
depthStats.Position = UDim2.new(0.55, 0, 0, 0)
depthStats.Parent = infoRow
-- Primary Button: Play Move
local playMoveBtn = Instance.new("TextButton")
playMoveBtn.Name = "PlayMoveBtn"
playMoveBtn.Text = "▶ Play Best Move"
playMoveBtn.Font = Enum.Font.GothamBold
playMoveBtn.TextSize = 12
playMoveBtn.TextColor3 = Color3.new(1, 1, 1)
playMoveBtn.BackgroundColor3 = C_ACCENT
playMoveBtn.BorderSizePixel = 0
playMoveBtn.Position = UDim2.fromOffset(0, 94)
playMoveBtn.Size = UDim2.new(1, 0, 0, 30)
playMoveBtn.Parent = content
local playMoveCorner = Instance.new("UICorner")
playMoveCorner.CornerRadius = UDim.new(0, 6)
playMoveCorner.Parent = playMoveBtn
-- Row: Auto Move & Arrow Toggles
local togglesRow = Instance.new("Frame")
togglesRow.Name = "TogglesRow"
togglesRow.Size = UDim2.new(1, 0, 0, 26)
togglesRow.Position = UDim2.fromOffset(0, 130)
togglesRow.BackgroundTransparency = 1
togglesRow.Parent = content
local autoBtn = Instance.new("TextButton")
autoBtn.Name = "AutoBtn"
autoBtn.Text = "Auto: OFF"
autoBtn.Font = Enum.Font.GothamBold
autoBtn.TextSize = 10
autoBtn.TextColor3 = C_TEXT_MUTED
autoBtn.BackgroundColor3 = C_CARD
autoBtn.BorderSizePixel = 0
autoBtn.Size = UDim2.new(0.48, 0, 1, 0)
autoBtn.Parent = togglesRow
local autoCorner = Instance.new("UICorner")
autoCorner.CornerRadius = UDim.new(0, 6)
autoCorner.Parent = autoBtn
local arrowBtn = Instance.new("TextButton")
arrowBtn.Name = "ArrowBtn"
arrowBtn.Text = "Arrow: ON"
arrowBtn.Font = Enum.Font.GothamBold
arrowBtn.TextSize = 10
arrowBtn.TextColor3 = C_ACCENT
arrowBtn.BackgroundColor3 = C_CARD
arrowBtn.BorderSizePixel = 0
arrowBtn.Position = UDim2.new(0.52, 0, 0, 0)
arrowBtn.Size = UDim2.new(0.48, 0, 1, 0)
arrowBtn.Parent = togglesRow
local arrowCorner = Instance.new("UICorner")
arrowCorner.CornerRadius = UDim.new(0, 6)
arrowCorner.Parent = arrowBtn
-- Row: Eval Bar Toggle & Depth Presets
local depthRow = Instance.new("Frame")
depthRow.Name = "DepthRow"
depthRow.Size = UDim2.new(1, 0, 0, 26)
depthRow.Position = UDim2.fromOffset(0, 162)
depthRow.BackgroundTransparency = 1
depthRow.Parent = content
local evalBarBtn = Instance.new("TextButton")
evalBarBtn.Name = "EvalBarBtn"
evalBarBtn.Text = "EvalBar: ON"
evalBarBtn.Font = Enum.Font.GothamBold
evalBarBtn.TextSize = 10
evalBarBtn.TextColor3 = C_ACCENT
evalBarBtn.BackgroundColor3 = C_CARD
evalBarBtn.BorderSizePixel = 0
evalBarBtn.Size = UDim2.new(0.48, 0, 1, 0)
evalBarBtn.Parent = depthRow
local evalBarCorner = Instance.new("UICorner")
evalBarCorner.CornerRadius = UDim.new(0, 6)
evalBarCorner.Parent = evalBarBtn
local depthBtn = Instance.new("TextButton")
depthBtn.Name = "DepthBtn"
depthBtn.Text = "Depth: 18"
depthBtn.Font = Enum.Font.GothamBold
depthBtn.TextSize = 10
depthBtn.TextColor3 = C_TEXT
depthBtn.BackgroundColor3 = C_CARD
depthBtn.BorderSizePixel = 0
depthBtn.Position = UDim2.new(0.52, 0, 0, 0)
depthBtn.Size = UDim2.new(0.48, 0, 1, 0)
depthBtn.Parent = depthRow
local depthCorner = Instance.new("UICorner")
depthCorner.CornerRadius = UDim.new(0, 6)
depthCorner.Parent = depthBtn
-- Helper function to make the best move
local function executeBestMove()
local s = App.session
if not s or s.over then return false end
if not state.currentFromSq or not state.currentToSq then return false end
local ok = pcall(function()
App.onBoardMove(state.currentFromSq, state.currentToSq, state.currentPromo or 0, false)
end)
return ok
end
-- Button Handlers
playMoveBtn.MouseButton1Click:Connect(function()
executeBestMove()
end)
autoBtn.MouseButton1Click:Connect(function()
state.autoPlay = not state.autoPlay
if state.autoPlay then
autoBtn.Text = "Auto: ON"
autoBtn.TextColor3 = C_ACCENT
local s = App.session
if s and not s.over and s.engine and (s.myColor == nil or s.engine.side == s.myColor) then
task.delay(0.4, function()
if state.autoPlay then executeBestMove() end
end)
end
else
autoBtn.Text = "Auto: OFF"
autoBtn.TextColor3 = C_TEXT_MUTED
end
end)
arrowBtn.MouseButton1Click:Connect(function()
state.showArrow = not state.showArrow
if state.showArrow then
arrowBtn.Text = "Arrow: ON"
arrowBtn.TextColor3 = C_ACCENT
if state.currentFromSq and state.currentToSq then
App.board:setArrow("u_best", state.currentFromSq, state.currentToSq, C_ACCENT, 0.05)
end
else
arrowBtn.Text = "Arrow: OFF"
arrowBtn.TextColor3 = C_TEXT_MUTED
App.board:setArrow("u_best", nil)
end
end)
evalBarBtn.MouseButton1Click:Connect(function()
state.showEvalBar = not state.showEvalBar
if state.showEvalBar then
evalBarBtn.Text = "EvalBar: ON"
evalBarBtn.TextColor3 = C_ACCENT
if state.currentScore ~= nil then
App.setEval(state.currentScore, state.currentMate)
end
else
evalBarBtn.Text = "EvalBar: OFF"
evalBarBtn.TextColor3 = C_TEXT_MUTED
App.setEval(nil)
end
end)
local depthCycle = {
{ mode = "fast", depth = 12, time = 0.15, text = "Depth: 12" },
{ mode = "normal", depth = 18, time = 0.35, text = "Depth: 18" },
{ mode = "gm", depth = 22, time = 0.8, text = "Depth: 22" },
}
local depthIdx = 2
depthBtn.MouseButton1Click:Connect(function()
depthIdx = (depthIdx % #depthCycle) + 1
local cur = depthCycle[depthIdx]
state.depthMode = cur.mode
state.maxDepth = cur.depth
state.thinkTime = cur.time
depthBtn.Text = cur.text
state.lastVersionKey = ""
end)
-- Minimize toggle
local function setMinimized(min)
state.minimized = min
if min then
mainFrame.Size = UDim2.fromOffset(210, 36)
content.Visible = false
minBtn.Text = "□"
else
mainFrame.Size = UDim2.fromOffset(210, 240)
content.Visible = true
minBtn.Text = "—"
end
end
minBtn.MouseButton1Click:Connect(function()
setMinimized(not state.minimized)
end)
closeBtn.MouseButton1Click:Connect(function()
screenGui:Destroy()
App.board:setArrow("u_best", nil)
Bot.onSearch = oldOnSearch
end)
-- Toggle GUI hotkey: Press H to hide/show
UserInputService.InputBegan:Connect(function(input, gpe)
if not gpe and input.KeyCode == Enum.KeyCode.H then
state.guiVisible = not state.guiVisible
mainFrame.Visible = state.guiVisible
end
end)
-- Main Analysis Function
local function updateAnalysis()
local s = App.session
if not s or not s.engine then
bestMoveLabel.Text = "---"
uciSquaresLabel.Text = "No active board"
turnBadge.Text = "IDLE"
turnBadge.TextColor3 = C_TEXT_MUTED
App.board:setArrow("u_best", nil)
return
end
local plyCount = #s.ucis
local side = s.engine.side
local myCol = s.myColor or 1
local isMyTurn = (side == myCol)
local versionKey = tostring(s.id) .. ":" .. tostring(s.version or 0) .. ":" .. tostring(plyCount) .. ":" .. tostring(side) .. ":" .. tostring(s.over)
if versionKey == state.lastVersionKey then
return
end
state.lastVersionKey = versionKey
-- Turn status update
if s.over then
turnBadge.Text = "🏁 GAME OVER"
turnBadge.TextColor3 = C_YELLOW
bestMoveLabel.Text = "END"
uciSquaresLabel.Text = "Game finished"
playMoveBtn.Visible = false
App.board:setArrow("u_best", nil)
return
else
playMoveBtn.Visible = true
if isMyTurn then
turnBadge.Text = if side == 1 then "🟢 YOUR TURN (WHITE)" else "🟢 YOUR TURN (BLACK)"
turnBadge.TextColor3 = C_ACCENT
playMoveBtn.BackgroundColor3 = C_ACCENT
playMoveBtn.Text = "▶ Play Best Move"
else
turnBadge.Text = if side == 1 then "⏳ BOT TURN (WHITE)" else "⏳ BOT TURN (BLACK)"
turnBadge.TextColor3 = C_TEXT_MUTED
playMoveBtn.BackgroundColor3 = Color3.fromRGB(60, 65, 75)
playMoveBtn.Text = "⏳ Waiting for Bot..."
end
end
-- Run Search
state.searchToken = state.searchToken + 1
local thisToken = state.searchToken
task.spawn(function()
local isCancelled = function()
if STATE and STATE.alive and not STATE.alive() then return true end
if thisToken ~= state.searchToken then return true end
if App.session ~= s then return true end
return false
end
local startFen = s.startFen
local ucis = table.clone(s.ucis)
local res = VortexBot.analyse(startFen, ucis, state.thinkTime, state.maxDepth, { cancelled = isCancelled })
if isCancelled() or not res or not res.best then
return
end
state.currentBestUci = res.best
state.currentScore = res.score
state.currentMate = res.mate
state.currentDepth = res.depth or state.maxDepth
state.currentNodes = res.nodes or 0
-- Parse squares & promo
local fromAlg = string.sub(res.best, 1, 2)
local toAlg = string.sub(res.best, 3, 4)
local promoChar = string.sub(res.best, 5, 5)
local promoMap = { q = 5, r = 4, b = 3, n = 2 }
state.currentFromSq = Engine.algToIndex64(fromAlg)
state.currentToSq = Engine.algToIndex64(toAlg)
state.currentPromo = promoMap[promoChar] or 0
-- Convert to SAN
local m = s.engine:moveFromUci(res.best)
local san = if m then s.engine:moveToSan(m) else string.upper(res.best)
state.currentSan = san
-- Update Move Label & Subtitle
bestMoveLabel.Text = san
uciSquaresLabel.Text = fromAlg .. " → " .. toAlg .. (promoChar ~= "" and (" (" .. string.upper(promoChar) .. ")") or "")
-- Player-perspective evaluation
-- When playing as Black, a negative board score is positive advantage for the player
local myPerspectiveScore = (res.score or 0) * myCol
local myPerspectiveMate = if res.mate then (res.mate * myCol) else nil
if myPerspectiveMate and myPerspectiveMate ~= 0 then
local mSign = if myPerspectiveMate > 0 then "+M" else "-M"
evalLabel.Text = mSign .. tostring(math.abs(myPerspectiveMate))
evalPill.BackgroundColor3 = if myPerspectiveMate > 0 then Color3.fromRGB(40, 110, 50) else Color3.fromRGB(130, 40, 40)
else
local cpText = string.format("%+.2f", myPerspectiveScore / 100)
evalLabel.Text = cpText
if myPerspectiveScore > 40 then
evalPill.BackgroundColor3 = Color3.fromRGB(40, 105, 50)
elseif myPerspectiveScore < -40 then
evalPill.BackgroundColor3 = Color3.fromRGB(125, 40, 40)
else
evalPill.BackgroundColor3 = Color3.fromRGB(50, 55, 65)
end
end
-- Update Depth Stats
local nodeK = math.floor(state.currentNodes / 1000)
depthStats.Text = "D: " .. tostring(state.currentDepth) .. " • " .. tostring(nodeK) .. "k"
-- Draw Best Move Arrow with vivid green and high visibility
if state.showArrow and state.currentFromSq and state.currentToSq then
App.board:setArrow("u_best", state.currentFromSq, state.currentToSq, C_ACCENT, 0.05)
end
-- Update Eval Bar
if state.showEvalBar and res.score ~= nil then
App.setEval(res.score, res.mate)
end
-- Auto-Move execution
if state.autoPlay and isMyTurn and not s.over then
task.delay(state.autoPlayDelay, function()
if not isCancelled() and s == App.session and not s.over and (s.myColor == nil or s.engine.side == s.myColor) then
executeBestMove()
end
end)
end
end)
end
-- Loop to continuously monitor game state
task.spawn(function()
while screenGui.Parent do
if STATE and STATE.alive and not STATE.alive() then
break
end
pcall(updateAnalysis)
task.wait(0.1)
end
end)
print("[RoChess Assistant] Clean & Active!")
return "RoChess Best Move Assistant Active"
Review the source before using it. Executions count successful copies, capped at 10 per user and network per script in 24 hours.
Community discussion
0Start the conversation.


Your community, in one place