152 lines
4.9 KiB
Lua
152 lines
4.9 KiB
Lua
local kUInt32Max = 4294967295
|
|
local kInt32Max = 2147483647
|
|
local alphabet = "\nbcdghjklmnpqrtvwyz23456789BCDGHJKLMNPQRTVWYZ"
|
|
|
|
|
|
|
|
local options = {
|
|
polynomials = {0xEDB88320, 0x82F63B78, 0xEB31D82E, 0x992C1A4C},
|
|
gui = {"TextButton", "TextBox", "TextLabel"},
|
|
--gui = {"Frame"},
|
|
ha = {"Enum.HorizontalAlignment.Right", "Enum.HorizontalAlignment.Left", "Enum.HorizontalAlignment.Center"},
|
|
va = {"Enum.VerticalAlignment.Top", "Enum.VerticalAlignment.Bottom", "Enum.VerticalAlignment.Center"},
|
|
fillDirection = {"Enum.FillDirection.Horizontal", "Enum.FillDirection.Vertical"},
|
|
borderMode = {"Enum.BorderMode.Outline", "Enum.BorderMode.Middle", "Enum.BorderMode.Inset" },
|
|
boolean = {"true","false"}
|
|
}
|
|
|
|
local function makeRandomChallenge(seed)
|
|
local rng = Random.new(seed)
|
|
local code = {"-- hi"}
|
|
local function replace(ctx) return function(s, o)
|
|
if s == "rand" then return string.sub(rng:NextNumber(),1,5) end
|
|
if s == "text" then
|
|
local str = ""
|
|
for i=1,rng:NextInteger(1,10) do
|
|
local idx = rng:NextInteger(0,#alphabet)
|
|
str = str .. alphabet:sub(idx,idx):gsub("\n","\\n")
|
|
end
|
|
return str
|
|
end
|
|
if tonumber(s) then return ctx[tonumber(s)] end
|
|
local list = options[s]
|
|
return list[rng:NextInteger(1, #list)]
|
|
end end
|
|
local function append(s,...) code[#code+1] = s:gsub("%$%{([a-z0-9][a-zA-Z]*)%}", replace({...})) end
|
|
append("local xv, yv = ...")
|
|
|
|
append([==[
|
|
local result = {};
|
|
local r = Random.new(xv+yv)
|
|
local function rand() return r:NextInteger(0,0x400)/0x400 end
|
|
|
|
local b = Instance.new("Frame")
|
|
b.Name = "Base"
|
|
local elements = {b}
|
|
|
|
local function crc32(s,crc)
|
|
crc = crc and bit32.bnot(crc) or 0xFFFFFFFF
|
|
for i=1,#s do
|
|
local l = bit32.rshift(crc,8)
|
|
crc = bit32.bxor(bit32.band(crc, 0xFF), s:byte(i))
|
|
crc = (bit32.band(crc,1) == 1) and bit32.bxor(bit32.rshift(crc,1), ${polynomials}) or bit32.rshift(crc,1)
|
|
crc = (bit32.band(crc,1) == 1) and bit32.bxor(bit32.rshift(crc,1), ${polynomials}) or bit32.rshift(crc,1)
|
|
crc = (bit32.band(crc,1) == 1) and bit32.bxor(bit32.rshift(crc,1), ${polynomials}) or bit32.rshift(crc,1)
|
|
crc = (bit32.band(crc,1) == 1) and bit32.bxor(bit32.rshift(crc,1), ${polynomials}) or bit32.rshift(crc,1)
|
|
crc = (bit32.band(crc,1) == 1) and bit32.bxor(bit32.rshift(crc,1), ${polynomials}) or bit32.rshift(crc,1)
|
|
crc = (bit32.band(crc,1) == 1) and bit32.bxor(bit32.rshift(crc,1), ${polynomials}) or bit32.rshift(crc,1)
|
|
crc = (bit32.band(crc,1) == 1) and bit32.bxor(bit32.rshift(crc,1), ${polynomials}) or bit32.rshift(crc,1)
|
|
crc = (bit32.band(crc,1) == 1) and bit32.bxor(bit32.rshift(crc,1), ${polynomials}) or bit32.rshift(crc,1)
|
|
crc = bit32.bxor(l, crc)
|
|
end
|
|
return bit32.bnot(crc)
|
|
end
|
|
local result = 0
|
|
local function a(...)
|
|
local str = string.format(...)
|
|
result = crc32(str, result)
|
|
--print(str)
|
|
end
|
|
|
|
local e = nil
|
|
]==])
|
|
|
|
for i=1,rng:NextInteger(10,15) do
|
|
append([==[
|
|
e = Instance.new("${gui}")
|
|
e.BorderSizePixel = r:NextInteger(1,10)
|
|
e.AnchorPoint = Vector2.new(4*rand()*${rand}, rand())
|
|
e.Rotation = r:NextInteger(0,360)
|
|
e.Position = UDim2.new(2*rand(), r:NextInteger(1,100), 2*rand(), r:NextInteger(1,100))
|
|
e.Size = UDim2.new(2*rand(), r:NextInteger(1,100), 2*rand(), r:NextInteger(1,100))
|
|
e.BackgroundColor3 = Color3.new(rand(), rand(), rand())
|
|
--e.BorderMode = ${borderMode}
|
|
e.Parent = elements[#elements]
|
|
e.Name = "${text}"
|
|
elements[#elements+1] = e
|
|
]==])
|
|
|
|
if rng:NextInteger(0,2) == 0 then
|
|
append([==[
|
|
e = Instance.new("UIScale")
|
|
e.Scale = 4 * ${rand} * rand()
|
|
e.Name = "Modifier-${text}"
|
|
e.Parent = elements[#elements]
|
|
]==])
|
|
end
|
|
|
|
if rng:NextInteger(0,2) == 0 then
|
|
append([==[
|
|
e = Instance.new("UIPadding")
|
|
e.PaddingTop = UDim.new(4*rand()*${rand}, r:NextInteger(1,100)*${rand})
|
|
e.PaddingLeft = UDim.new(4*rand()*${rand}, r:NextInteger(1,100)*${rand})
|
|
e.PaddingBottom = UDim.new(4*rand()*${rand}, r:NextInteger(1,100)*${rand})
|
|
e.PaddingRight = UDim.new(4*rand()*${rand}, r:NextInteger(1,100)*${rand})
|
|
e.Name = "Modifier-${text}"
|
|
e.Parent = elements[#elements]
|
|
]==])
|
|
end
|
|
|
|
if rng:NextInteger(0,2) == 0 then
|
|
append([==[
|
|
e = Instance.new("UIListLayout")
|
|
e.Name = "Modifier-${text}"
|
|
e.HorizontalAlignment = ${ha}
|
|
e.VerticalAlignment = ${va}
|
|
e.FillDirection = ${fillDirection}
|
|
e.Parent = elements[#elements]
|
|
]==])
|
|
end
|
|
end
|
|
|
|
append("a(game.JobId)")
|
|
|
|
append([==[
|
|
for k,v in ipairs(elements) do
|
|
a("%d) %d,%d %dx%d %d %s", k,
|
|
v.AbsolutePosition.X, v.AbsolutePosition.Y,
|
|
v.AbsoluteSize.X, v.AbsoluteSize.Y,
|
|
v.Rotation, BrickColor.new(v.BackgroundColor3).Name
|
|
)
|
|
end
|
|
|
|
--b.Parent = script.Parent
|
|
|
|
]==])
|
|
append("return result")
|
|
|
|
return table.concat(code,"\n")
|
|
end
|
|
|
|
local seed = ...
|
|
if seed == nil then
|
|
seed = Random.new():NextInteger(0, kUInt32Max)
|
|
end
|
|
|
|
local code = makeRandomChallenge(seed)
|
|
local rs = game:GetService("RunService")
|
|
if rs:IsServer() and not rs:IsClient() then
|
|
game:GetService("NetworkServer"):RegisterDynLuaChallenge(code, seed)
|
|
end
|
|
return code
|