Skip to content
RoRoScripts
Team sonic select (Beta) preview
UnknownHub

Team sonic select (Beta)

Script
Script hubc00lkiddthec00lk1ng
Views
377
Likes
0
Dislikes
0
Added
Script
-- SONIC + TAILS + KNUCKLES: character select screen. Pick a character, tap OK. (Run this one file; run it again to pick someone else.)
-- decoder: base64 + inflate (raw deflate), written without bit operators
local pow2 = {}
for i = 0, 40 do pow2[i] = 2 ^ i end

local B64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
local B64MAP = {}
for i = 1, 64 do B64MAP[string.byte(B64, i)] = i - 1 end

local function b64decode(str)
	local out, n, buf, cnt = {}, 0, 0, 0
	for i = 1, #str do
		local v = B64MAP[string.byte(str, i)]
		if v then
			buf = buf * 64 + v
			cnt = cnt + 6
			if cnt >= 8 then
				cnt = cnt - 8
				local d = pow2[cnt]
				n = n + 1
				out[n] = math.floor(buf / d)
				buf = buf % d
			end
		end
	end
	local parts = {}
	for i = 1, n, 1500 do
		parts[#parts + 1] = string.char(table.unpack(out, i, math.min(i + 1499, n)))
	end
	return table.concat(parts)
end

local LBASE = {3,4,5,6,7,8,9,10,11,13,15,17,19,23,27,31,35,43,51,59,67,83,99,115,131,163,195,227,258}
local LEXT = {0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0}
local DBASE = {1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193,257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577}
local DEXT = {0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13}
local ORDER = {16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15}

local function build(lengths, start, n)
	local count = {}
	for i = 0, 15 do count[i] = 0 end
	for s = 0, n - 1 do
		local l = lengths[start + s]
		count[l] = count[l] + 1
	end
	local offs = {}
	offs[1] = 0
	for l = 1, 14 do offs[l + 1] = offs[l] + count[l] end
	local symbol = {}
	for s = 0, n - 1 do
		local l = lengths[start + s]
		if l ~= 0 then
			symbol[offs[l]] = s
			offs[l] = offs[l] + 1
		end
	end
	return {count = count, symbol = symbol}
end

local function inflate(src)
	local pos, bitbuf, bitcnt = 1, 0, 0
	local out, outn = {}, 0

	local function bits(need)
		local val = bitbuf
		while bitcnt < need do
			val = val + string.byte(src, pos) * pow2[bitcnt]
			pos = pos + 1
			bitcnt = bitcnt + 8
		end
		bitbuf = math.floor(val / pow2[need])
		bitcnt = bitcnt - need
		return val % pow2[need]
	end

	local function decode(h)
		local code, first, index = 0, 0, 0
		for len = 1, 15 do
			code = code + bits(1)
			local count = h.count[len]
			if code - count < first then
				return h.symbol[index + (code - first)]
			end
			index = index + count
			first = (first + count) * 2
			code = code * 2
		end
		error("bad code")
	end

	local function codes(lencode, distcode)
		while true do
			local sym = decode(lencode)
			if sym < 256 then
				outn = outn + 1
				out[outn] = sym
			elseif sym == 256 then
				return
			else
				sym = sym - 257
				local len = LBASE[sym + 1] + bits(LEXT[sym + 1])
				local ds = decode(distcode)
				local dist = DBASE[ds + 1] + bits(DEXT[ds + 1])
				for _ = 1, len do
					outn = outn + 1
					out[outn] = out[outn - dist]
				end
			end
		end
	end

	local fixedLen, fixedDist
	repeat
		local last = bits(1)
		local btype = bits(2)
		if btype == 0 then
			bitbuf, bitcnt = 0, 0
			local len = string.byte(src, pos) + string.byte(src, pos + 1) * 256
			pos = pos + 4
			for i = 0, len - 1 do
				outn = outn + 1
				out[outn] = string.byte(src, pos + i)
			end
			pos = pos + len
		elseif btype == 1 then
			if not fixedLen then
				local l = {}
				for i = 0, 143 do l[i] = 8 end
				for i = 144, 255 do l[i] = 9 end
				for i = 256, 279 do l[i] = 7 end
				for i = 280, 287 do l[i] = 8 end
				fixedLen = build(l, 0, 288)
				local d = {}
				for i = 0, 29 do d[i] = 5 end
				fixedDist = build(d, 0, 30)
			end
			codes(fixedLen, fixedDist)
		else
			local nlen = bits(5) + 257
			local ndist = bits(5) + 1
			local ncode = bits(4) + 4
			local lengths = {}
			for i = 0, 18 do lengths[i] = 0 end
			for i = 1, ncode do lengths[ORDER[i]] = bits(3) end
			local lencode = build(lengths, 0, 19)
			lengths = {}
			local idx = 0
			while idx < nlen + ndist do
				local sym = decode(lencode)
				if sym < 16 then
					lengths[idx] = sym
					idx = idx + 1
				else
					local len, rep = 0, 0
					if sym == 16 then
						len = lengths[idx - 1]
						rep = 3 + bits(2)
					elseif sym == 17 then
						rep = 3 + bits(3)
					else
						rep = 11 + bits(7)
					end
					for _ = 1, rep do
						lengths[idx] = len
						idx = idx + 1
					end
				end
			end
			codes(build(lengths, 0, nlen), build(lengths, nlen, ndist))
		end
	until last == 1

	local parts = {}
	for i = 1, outn, 1500 do
		parts[#parts + 1] = string.char(table.unpack(out, i, math.min(i + 1499, outn)))
	end
	return table.concat(parts)
end

local SONIC_B64 = [==[
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
]==]

local TAILS_B64 = [==[
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
]==]

local KNUCKLES_B64 = [==[
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
]==]

-- ---------- character select screen (Sonic Origins style) ----------
local Players = game:GetService("Players")
local TweenService = game:GetService("TweenService")
local RunService = game:GetService("RunService")
local lp = Players.LocalPlayer

local gui = Instance.new("ScreenGui")
gui.Name = "SonicCharacterSelect"
gui.ResetOnSpawn = false
gui.IgnoreGuiInset = true
gui.DisplayOrder = 100
local placed = pcall(function()
	gui.Parent = (gethui and gethui()) or game:GetService("CoreGui")
end)
if not placed then gui.Parent = lp:WaitForChild("PlayerGui") end

local BLOBS = {sonic = SONIC_B64, tails = TAILS_B64, knuckles = KNUCKLES_B64}
local conns = {}
local launched = false

local function launch(which)
	if launched then return end
	launched = true
	for _, c in ipairs(conns) do c:Disconnect() end
	gui:Destroy()
	local ok, src = pcall(function() return inflate(b64decode(BLOBS[which])) end)
	if not ok then
		print("[Select] could not unpack: " .. tostring(src))
		return
	end
	local run = loadstring or load
	local fn, err = run(src)
	if not fn then
		print("[Select] could not start: " .. tostring(err))
		return
	end
	local okRun, e = pcall(fn)
	if not okRun then print("[Select] error: " .. tostring(e)) end
end

-- small drawing helper: rounded / rotated boxes for the portraits and background
local function box(parent, w, h, x, y, color, round, rot, z)
	local f = Instance.new("Frame")
	f.AnchorPoint = Vector2.new(0.5, 0.5)
	f.Size = UDim2.fromOffset(w, h)
	f.Position = UDim2.fromOffset(x, y)
	f.BackgroundColor3 = color
	f.BorderSizePixel = 0
	f.Rotation = rot or 0
	f.ZIndex = z or 2
	if round then
		local c = Instance.new("UICorner")
		c.CornerRadius = UDim.new(round, 0)
		c.Parent = f
	end
	f.Parent = parent
	return f
end

-- ---------- background: blue sky, drifting clouds, scrolling sea ----------
local bg = Instance.new("Frame")
bg.Size = UDim2.fromScale(1, 1)
bg.BackgroundColor3 = Color3.new(1, 1, 1)
bg.BorderSizePixel = 0
bg.Parent = gui
local bgGrad = Instance.new("UIGradient")
bgGrad.Rotation = 90
bgGrad.Color = ColorSequence.new({
	ColorSequenceKeypoint.new(0, Color3.fromRGB(70, 140, 255)),
	ColorSequenceKeypoint.new(0.6, Color3.fromRGB(20, 50, 190)),
	ColorSequenceKeypoint.new(0.62, Color3.fromRGB(10, 25, 150)),
	ColorSequenceKeypoint.new(1, Color3.fromRGB(5, 15, 110)),
})
bgGrad.Parent = bg

local clouds, stripes = {}, {}
for i = 1, 7 do
	local c = Instance.new("Frame")
	c.AnchorPoint = Vector2.new(0.5, 0.5)
	c.Size = UDim2.fromOffset(70 + (i * 37) % 60, 18 + (i * 7) % 10)
	c.BackgroundColor3 = Color3.new(1, 1, 1)
	c.BackgroundTransparency = 0.1
	c.BorderSizePixel = 0
	c.Parent = bg
	local cc = Instance.new("UICorner")
	cc.CornerRadius = UDim.new(1, 0)
	cc.Parent = c
	table.insert(clouds, {f = c, x = (i * 0.17) % 1.1, y = 0.08 + ((i * 0.13) % 0.4), s = 0.01 + i * 0.002})
end
for i = 1, 16 do
	local s = Instance.new("Frame")
	s.AnchorPoint = Vector2.new(0.5, 0.5)
	s.Size = UDim2.fromOffset(40 + (i * 29) % 90, 3)
	s.BackgroundColor3 = Color3.fromRGB(150, 190, 255)
	s.BackgroundTransparency = 0.45
	s.BorderSizePixel = 0
	s.Parent = bg
	table.insert(stripes, {f = s, x = (i * 0.23) % 1.2, y = 0.66 + ((i * 0.047) % 0.32), s = 0.03 + (i % 4) * 0.012})
end
table.insert(conns, RunService.RenderStepped:Connect(function(dt)
	for _, c in ipairs(clouds) do
		c.x = c.x - c.s * dt
		if c.x < -0.1 then c.x = 1.1 end
		c.f.Position = UDim2.fromScale(c.x, c.y)
	end
	for _, s in ipairs(stripes) do
		s.x = s.x - s.s * dt
		if s.x < -0.1 then s.x = 1.1 end
		s.f.Position = UDim2.fromScale(s.x, s.y)
	end
end))

-- ---------- the panel ----------
local panelShadow = Instance.new("Frame")
panelShadow.AnchorPoint = Vector2.new(0.5, 0.5)
panelShadow.Size = UDim2.fromOffset(620, 306)
panelShadow.Position = UDim2.new(0.5, 6, 0.5, 8)
panelShadow.BackgroundColor3 = Color3.fromRGB(0, 0, 40)
panelShadow.BackgroundTransparency = 0.5
panelShadow.BorderSizePixel = 0
panelShadow.ZIndex = 2
panelShadow.Parent = gui
local psc = Instance.new("UICorner")
psc.CornerRadius = UDim.new(0, 16)
psc.Parent = panelShadow

local panel = Instance.new("Frame")
panel.AnchorPoint = Vector2.new(0.5, 0.5)
panel.Size = UDim2.fromOffset(620, 306)
panel.Position = UDim2.new(0.5, 0, 0.5, 0)
panel.BackgroundColor3 = Color3.new(1, 1, 1)
panel.BorderSizePixel = 0
panel.ZIndex = 3
panel.Parent = gui
local pc = Instance.new("UICorner")
pc.CornerRadius = UDim.new(0, 16)
pc.Parent = panel
local pg = Instance.new("UIGradient")
pg.Rotation = 90
pg.Color = ColorSequence.new(Color3.fromRGB(250, 251, 255), Color3.fromRGB(205, 212, 226))
pg.Parent = panel
local pst = Instance.new("UIStroke")
pst.Color = Color3.new(1, 1, 1)
pst.Thickness = 4
pst.ApplyStrokeMode = Enum.ApplyStrokeMode.Border
pst.Parent = panel

local title = Instance.new("TextLabel")
title.Size = UDim2.new(1, 0, 0, 40)
title.Position = UDim2.fromOffset(0, 6)
title.BackgroundTransparency = 1
title.Font = Enum.Font.GothamBlack
title.TextSize = 24
title.TextColor3 = Color3.fromRGB(15, 35, 120)
title.Text = "CHARACTER SELECT"
title.ZIndex = 4
title.Parent = panel

-- ---------- portraits (drawn with shapes) ----------
local BLUE, PEACH = Color3.fromRGB(30, 100, 240), Color3.fromRGB(255, 215, 170)
local ORANGE, RED = Color3.fromRGB(255, 150, 25), Color3.fromRGB(225, 40, 45)
local WHITE, BLACK = Color3.new(1, 1, 1), Color3.new(0, 0, 0)

local function eyes(p, y, pupil)
	box(p, 20, 26, 40, y, WHITE, 1, 0, 4)
	box(p, 20, 26, 60, y, WHITE, 1, 0, 4)
	box(p, 8, 14, 42, y + 2, pupil, 1, 0, 5)
	box(p, 8, 14, 58, y + 2, pupil, 1, 0, 5)
end

local function sonic(p)
	box(p, 46, 18, 22, 46, BLUE, 0.5, -28, 2)
	box(p, 48, 18, 16, 68, BLUE, 0.5, -8, 2)
	box(p, 46, 18, 22, 90, BLUE, 0.5, 14, 2)
	box(p, 16, 24, 36, 22, BLUE, 0.3, -12, 3)
	box(p, 16, 24, 64, 22, BLUE, 0.3, 12, 3)
	box(p, 64, 62, 50, 56, BLUE, 1, 0, 3)
	box(p, 36, 28, 50, 74, PEACH, 1, 0, 4)
	eyes(p, 50, Color3.fromRGB(40, 170, 80))
	box(p, 9, 8, 50, 70, BLACK, 1, 0, 6)
	box(p, 44, 34, 50, 104, BLUE, 0.4, 0, 3)
	box(p, 30, 12, 36, 124, RED, 1, 0, 3)
	box(p, 30, 12, 66, 124, RED, 1, 0, 3)
end

local function tails(p)
	box(p, 48, 20, 20, 98, ORANGE, 1, 32, 2)
	box(p, 16, 16, 8, 110, WHITE, 1, 32, 2)
	box(p, 48, 20, 80, 98, ORANGE, 1, -32, 2)
	box(p, 16, 16, 92, 110, WHITE, 1, -32, 2)
	box(p, 40, 36, 50, 100, ORANGE, 0.4, 0, 3)
	box(p, 22, 24, 50, 104, WHITE, 1, 0, 4)
	box(p, 18, 32, 34, 20, ORANGE, 0.3, -12, 3)
	box(p, 18, 32, 66, 20, ORANGE, 0.3, 12, 3)
	box(p, 8, 22, 50, 22, ORANGE, 0.5, 0, 3)
	box(p, 62, 56, 50, 54, ORANGE, 1, 0, 3)
	box(p, 38, 26, 50, 72, WHITE, 1, 0, 4)
	eyes(p, 48, Color3.fromRGB(50, 140, 230))
	box(p, 9, 8, 50, 68, BLACK, 1, 0, 6)
	box(p, 30, 12, 38, 124, RED, 1, 0, 3)
	box(p, 30, 12, 64, 124, RED, 1, 0, 3)
end

local function knuckles(p)
	box(p, 12, 26, 34, 20, RED, 0.5, -22, 2)
	box(p, 12, 28, 50, 14, RED, 0.5, 0, 2)
	box(p, 12, 26, 66, 20, RED, 0.5, 22, 2)
	box(p, 64, 58, 50, 54, RED, 1, 0, 3)
	box(p, 36, 28, 50, 74, PEACH, 1, 0, 4)
	eyes(p, 48, Color3.fromRGB(130, 60, 190))
	box(p, 9, 8, 50, 68, BLACK, 1, 0, 6)
	box(p, 40, 34, 50, 102, RED, 0.4, 0, 3)
	box(p, 22, 10, 50, 94, WHITE, 1, 0, 4)
	box(p, 20, 20, 16, 100, WHITE, 1, 0, 4)
	box(p, 20, 20, 84, 100, WHITE, 1, 0, 4)
	box(p, 30, 12, 36, 124, RED, 1, 0, 3)
	box(p, 30, 12, 66, 124, RED, 1, 0, 3)
end

local function silhouette(p)
	box(p, 60, 56, 50, 54, Color3.fromRGB(20, 60, 150), 1, 0, 3)
	box(p, 16, 26, 34, 24, Color3.fromRGB(20, 60, 150), 0.3, -12, 3)
	box(p, 16, 26, 66, 24, Color3.fromRGB(20, 60, 150), 0.3, 12, 3)
	box(p, 44, 40, 50, 104, Color3.fromRGB(20, 60, 150), 0.4, 0, 3)
end

-- ---------- cards ----------
local cards = {}
local selected = nil
local okBtn, hint

local function updateOk()
	if not okBtn then return end
	okBtn.BackgroundColor3 = selected and Color3.fromRGB(30, 110, 255) or Color3.fromRGB(110, 130, 175)
	hint.Text = selected and "TAP OK TO START" or "TAP A CHARACTER"
end

local function choose(key)
	selected = key
	for k, c in pairs(cards) do
		local on = (k == key)
		c.stroke.Color = on and Color3.fromRGB(255, 215, 0) or Color3.fromRGB(10, 30, 130)
		c.stroke.Thickness = on and 5 or 3
		c.check.Visible = on
		TweenService:Create(c.scale, TweenInfo.new(0.15), {Scale = on and 1.07 or 1}):Play()
	end
	updateOk()
end

local function card(i, key, name, draw)
	local x = 78 + (i - 1) * 116
	local f = Instance.new("TextButton")
	f.AnchorPoint = Vector2.new(0.5, 0)
	f.Size = UDim2.fromOffset(104, 176)
	f.Position = UDim2.fromOffset(x, 56)
	f.BackgroundColor3 = Color3.new(1, 1, 1)
	f.BorderSizePixel = 0
	f.AutoButtonColor = false
	f.Text = ""
	f.ZIndex = 4
	f.Parent = panel
	local fg = Instance.new("UIGradient")
	fg.Rotation = 90
	fg.Color = ColorSequence.new(Color3.fromRGB(110, 225, 255), Color3.fromRGB(30, 130, 235))
	fg.Parent = f
	local stroke = Instance.new("UIStroke")
	stroke.Color = Color3.fromRGB(10, 30, 130)
	stroke.Thickness = 3
	stroke.ApplyStrokeMode = Enum.ApplyStrokeMode.Border
	stroke.Parent = f
	local scale = Instance.new("UIScale")
	scale.Parent = f
	-- diagonal shine
	local clip = Instance.new("Frame")
	clip.Size = UDim2.new(1, 0, 1, 0)
	clip.BackgroundTransparency = 1
	clip.ClipsDescendants = true
	clip.ZIndex = 4
	clip.Parent = f
	for s = 0, 2 do
		local sh = box(clip, 16, 260, 20 + s * 38, 90, WHITE, nil, 28, 4)
		sh.BackgroundTransparency = 0.82
	end
	-- portrait area
	local portrait = Instance.new("Frame")
	portrait.Size = UDim2.fromOffset(100, 134)
	portrait.Position = UDim2.fromOffset(2, 4)
	portrait.BackgroundTransparency = 1
	portrait.ZIndex = 4
	portrait.Parent = f
	draw(portrait)
	-- name bar
	local bar = Instance.new("TextLabel")
	bar.Size = UDim2.new(1, 0, 0, 30)
	bar.Position = UDim2.new(0, 0, 1, -30)
	bar.BackgroundColor3 = Color3.fromRGB(20, 50, 170)
	bar.BorderSizePixel = 0
	bar.Font = Enum.Font.GothamBlack
	bar.TextSize = 13
	bar.TextColor3 = Color3.new(1, 1, 1)
	bar.Text = name
	bar.ZIndex = 5
	bar.Parent = f
	-- check mark (shown on the chosen card)
	local check = Instance.new("TextLabel")
	check.Size = UDim2.fromOffset(22, 22)
	check.Position = UDim2.new(1, -26, 0, 4)
	check.BackgroundColor3 = Color3.fromRGB(255, 215, 0)
	check.BorderSizePixel = 0
	check.Font = Enum.Font.GothamBlack
	check.TextSize = 16
	check.TextColor3 = Color3.fromRGB(60, 30, 0)
	check.Text = "OK"
	check.TextScaled = true
	check.Visible = false
	check.ZIndex = 6
	check.Parent = f
	if key then
		cards[key] = {f = f, stroke = stroke, scale = scale, check = check}
		f.MouseButton1Click:Connect(function()
			if selected == key then launch(key) else choose(key) end
		end)
	end
end

card(1, nil, "???", silhouette)
card(2, "sonic", "SONIC", sonic)
card(3, "tails", "TAILS", tails)
card(4, "knuckles", "KNUCKLES", knuckles)
card(5, nil, "???", silhouette)

-- ---------- OK / Close ----------
local function pill(text, x, onClick)
	local dot = box(panel, 22, 22, x, 268, BLACK, 1, 0, 4)
	local b = Instance.new("TextButton")
	b.AnchorPoint = Vector2.new(0, 0.5)
	b.Size = UDim2.fromOffset(78, 26)
	b.Position = UDim2.fromOffset(x + 4, 268)
	b.BackgroundColor3 = Color3.fromRGB(30, 110, 255)
	b.BorderSizePixel = 0
	b.Font = Enum.Font.GothamBlack
	b.TextSize = 14
	b.TextColor3 = Color3.new(1, 1, 1)
	b.Text = text
	b.ZIndex = 5
	b.Parent = panel
	local c = Instance.new("UICorner")
	c.CornerRadius = UDim.new(0.5, 0)
	c.Parent = b
	b.MouseButton1Click:Connect(onClick)
	return b
end
okBtn = pill("OK", 24, function()
	if selected then launch(selected) end
end)
pill("Close", 130, function()
	if launched then return end
	launched = true
	for _, c in ipairs(conns) do c:Disconnect() end
	gui:Destroy()
end)

-- blinking hint under the panel
hint = Instance.new("TextLabel")
hint.AnchorPoint = Vector2.new(0.5, 0)
hint.Position = UDim2.new(0.5, 0, 0.5, 168)
hint.Size = UDim2.fromOffset(360, 28)
hint.BackgroundTransparency = 1
hint.Font = Enum.Font.GothamBlack
hint.TextSize = 20
hint.TextColor3 = Color3.fromRGB(255, 225, 60)
hint.TextStrokeColor3 = Color3.fromRGB(10, 20, 110)
hint.TextStrokeTransparency = 0
hint.Text = "TAP A CHARACTER"
hint.ZIndex = 6
hint.Parent = gui
updateOk()
table.insert(conns, RunService.RenderStepped:Connect(function()
	local a = (math.sin(tick() * 5) + 1) / 2
	hint.TextTransparency = a * 0.55
end))

-- panel drops in
panel.Position = UDim2.new(0.5, 0, -0.4, 0)
panelShadow.Position = UDim2.new(0.5, 6, -0.4, 8)
TweenService:Create(panel, TweenInfo.new(0.55, Enum.EasingStyle.Back, Enum.EasingDirection.Out), {Position = UDim2.new(0.5, 0, 0.5, 0)}):Play()
TweenService:Create(panelShadow, TweenInfo.new(0.55, Enum.EasingStyle.Back, Enum.EasingDirection.Out), {Position = UDim2.new(0.5, 6, 0.5, 8)}):Play()
Team sonic select (Beta) · RoScripts