forked from osmarks/potatOS
242 lines
6.4 KiB
Lua
242 lines
6.4 KiB
Lua
|
-- POTATOPLEX: The best potatOS feature
|
||
|
|
||
|
local args = {...}
|
||
|
local targs = table.concat(args, " ")
|
||
|
local text
|
||
|
|
||
|
if args[1] and fs.exists(args[1]) then
|
||
|
local f = fs.open(args[1], "r")
|
||
|
text = f.readAll()
|
||
|
f.close()
|
||
|
end
|
||
|
|
||
|
local function randpick(l)
|
||
|
if #l == 1 then return l[1] end
|
||
|
return l[math.random(1, #l)]
|
||
|
end
|
||
|
|
||
|
local function potatoplex_is_installed()
|
||
|
if fs.isDir "startup" then return false end
|
||
|
local f = fs.open("startup", "r")
|
||
|
if not f then return false end
|
||
|
return f.readAll():match "POTATOPLEX"
|
||
|
end
|
||
|
|
||
|
if commands then
|
||
|
print "Enabling Command Potatoplex mode. Do not attempt to resist."
|
||
|
_G.os.pullEvent = coroutine.yield
|
||
|
|
||
|
if not potatoplex_is_installed() then
|
||
|
print "Installing as startup"
|
||
|
settings.set("shell.allow_startup", true)
|
||
|
settings.set("shell.allow_disk_startup", false)
|
||
|
settings.save ".settings"
|
||
|
if fs.exists "startup" then fs.delete "startup" end
|
||
|
local f = fs.open("startup", "w")
|
||
|
f.write([[
|
||
|
-- POTATOPLEX!!!!!
|
||
|
_G.os.pullEvent = coroutine.yield
|
||
|
local h = http.get "https://pastebin.com/raw/wYBZjQhN"
|
||
|
local t = h.readAll()
|
||
|
h.close()
|
||
|
local fn, err = load(t, "=potatoplex")
|
||
|
if not fn then error(err)
|
||
|
else fn() end
|
||
|
]])
|
||
|
end
|
||
|
|
||
|
local items = {
|
||
|
"minecraft:diamond_block",
|
||
|
"minecraft:emerald_block",
|
||
|
"minecraft:redstone_block",
|
||
|
"minecraft:lapis_block",
|
||
|
"minecraft:iron_block",
|
||
|
"minecraft:gold_block",
|
||
|
"minecraft:command_block",
|
||
|
"computronics:oc_special_parts",
|
||
|
"opencomputers:casecreative",
|
||
|
{"opencomputers:material", 25},
|
||
|
{"opencomputers:material", 22},
|
||
|
{"opencomputers:material", 19},
|
||
|
{"opencomputers:component", 19},
|
||
|
{"opencomputers:component", 18},
|
||
|
{"opencomputers:component", 12},
|
||
|
{"opencomputers:component", 32},
|
||
|
{"opencomputers:card", 0},
|
||
|
{"plethora:module", 7},
|
||
|
{"plethora:module", 1},
|
||
|
"bibliocraft:bookcasecreative",
|
||
|
"minecraft:nether_star",
|
||
|
"quark:pirate_hat"
|
||
|
}
|
||
|
|
||
|
local baseblocks = {
|
||
|
"minecraft:wool",
|
||
|
"minecraft:concrete",
|
||
|
"minecraft:concrete_powder",
|
||
|
"chisel:antiblock",
|
||
|
"chisel:energizedvoidstone",
|
||
|
"chisel:voidstonerunic",
|
||
|
"chisel:voidstone",
|
||
|
"minecraft:end_portal",
|
||
|
"quark:stained_clay_tiles",
|
||
|
"quark:stained_planks",
|
||
|
"quark:quilted_wool",
|
||
|
"quark:cavecrystal",
|
||
|
"minecraft:stained_hardened_clay",
|
||
|
"minecraft:stained_glass",
|
||
|
"minecraft:stained_glass_pane",
|
||
|
{"minecraft:white_glazed_terracotta", 0},
|
||
|
{"minecraft:orange_glazed_terracotta", 0},
|
||
|
{"minecraft:magneta_glazed_terracotta", 0},
|
||
|
{"minecraft:light_blue_glazed_terracotta", 0},
|
||
|
{"minecraft:yellow_glazed_terracotta", 0},
|
||
|
{"minecraft:lime_glazed_terracotta", 0},
|
||
|
{"minecraft:pink_glazed_terracotta", 0},
|
||
|
{"minecraft:gray_glazed_terracotta", 0},
|
||
|
{"minecraft:silver_glazed_terracotta", 0},
|
||
|
{"minecraft:cyan_glazed_terracotta", 0},
|
||
|
{"minecraft:purple_glazed_terracotta", 0},
|
||
|
{"minecraft:blue_glazed_terracotta", 0},
|
||
|
{"minecraft:brown_glazed_terracotta", 0},
|
||
|
{"minecraft:green_glazed_terracotta", 0},
|
||
|
{"minecraft:red_glazed_terracotta", 0},
|
||
|
{"minecraft:black_glazed_terracotta", 0},
|
||
|
{"minecraft:bedrock", 0},
|
||
|
{"minecraft:diamond_block", 0},
|
||
|
{"minecraft:emerald_block", 0},
|
||
|
{"minecraft:redstone_block", 0},
|
||
|
{"minecraft:lapis_block", 0},
|
||
|
{"minecraft:iron_block", 0},
|
||
|
{"minecraft:gold_block", 0}
|
||
|
}
|
||
|
|
||
|
local blocks = {}
|
||
|
for _, b in pairs(baseblocks) do
|
||
|
if type(b) == "table" then table.insert(blocks, b)
|
||
|
else
|
||
|
for i = 0, 15 do
|
||
|
table.insert(blocks, {b, i})
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
|
||
|
local x, y, z = commands.getBlockPosition()
|
||
|
local cx, cz = math.floor(x / 16) * 16, math.floor(z / 16) * 16
|
||
|
|
||
|
local give_items = not targs:match "scrooge"
|
||
|
|
||
|
while true do
|
||
|
for i = 1, 8 do
|
||
|
local rx, ry, rz = math.random(cx, cx + 15), math.random(0, 255), math.random(cz, cz + 15)
|
||
|
local pick = randpick(blocks)
|
||
|
local meta, block = pick[2], pick[1]
|
||
|
if rx ~= x and ry ~= y and rz ~= z then
|
||
|
commands.execAsync(("setblock %d %d %d %s %d replace"):format(rx, ry, rz, block, meta))
|
||
|
end
|
||
|
end
|
||
|
if give_items and math.random(0, 1000) == 42 then
|
||
|
print "POTATO FESTIVAL!"
|
||
|
for i = 1, 36 do
|
||
|
local pick = randpick(items)
|
||
|
local meta = 0
|
||
|
local item = pick
|
||
|
if type(pick) == "table" then meta = pick[2] item = pick[1] end
|
||
|
commands.execAsync(("give @a %s 64 %d"):format(item, meta))
|
||
|
end
|
||
|
end
|
||
|
sleep()
|
||
|
end
|
||
|
end
|
||
|
|
||
|
local monitors = {peripheral.find "monitor"}
|
||
|
local signs = {peripheral.find "minecraft:sign"}
|
||
|
table.insert(monitors, term.current())
|
||
|
|
||
|
local duochrome_mode = targs:find "duochrome" ~= nil
|
||
|
local function random_color()
|
||
|
if duochrome_mode then
|
||
|
if math.random(0, 1) == 0 then return colors.black
|
||
|
else return colors.white end
|
||
|
end
|
||
|
return math.pow(2, math.random(0, 15))
|
||
|
end
|
||
|
|
||
|
local function random_segment(text)
|
||
|
local start = math.random(1, #text)
|
||
|
return text:sub(start, math.random(start, #text))
|
||
|
end
|
||
|
|
||
|
local sixel_mode = targs:find "sixel" ~= nil
|
||
|
local min, max = 0, 255
|
||
|
if sixel_mode then
|
||
|
min, max = 128, 159
|
||
|
end
|
||
|
|
||
|
local function random_char()
|
||
|
return string.char(math.random(min, max))
|
||
|
end
|
||
|
|
||
|
local colors = {}
|
||
|
for i = 0, 15 do table.insert(colors, ("%x"):format(i)) end
|
||
|
|
||
|
local function random_pick(list)
|
||
|
return list[math.random(1, #list)]
|
||
|
end
|
||
|
|
||
|
local function one_pixel(m, x, y)
|
||
|
m.setCursorPos(x, y)
|
||
|
if text then
|
||
|
m.setBackgroundColor(random_color())
|
||
|
m.setTextColor(random_color())
|
||
|
m.write(random_segment(text))
|
||
|
else
|
||
|
m.blit(random_char(), random_pick(colors), random_pick(colors))
|
||
|
end
|
||
|
end
|
||
|
|
||
|
local chat_colors = {
|
||
|
"k",
|
||
|
"l",
|
||
|
"m",
|
||
|
"n",
|
||
|
"o"
|
||
|
}
|
||
|
for i = 0, 16 do table.insert(chat_colors, string.format("%x", i)) end
|
||
|
|
||
|
local hook = _G.potatoplex_hook
|
||
|
|
||
|
local slowpalette_mode = targs:find "slowpalette" ~= nil
|
||
|
local function run(m)
|
||
|
local w, h = m.getSize()
|
||
|
|
||
|
for i = 1, 16 do
|
||
|
local x, y = math.random(1, w), math.random(1, h)
|
||
|
one_pixel(m, x, y)
|
||
|
end
|
||
|
if not slowpalette_mode or math.random(0, 20) == 13 then
|
||
|
m.setPaletteColor(random_color(), math.random(), math.random(), math.random())
|
||
|
end
|
||
|
if hook then hook(m) end
|
||
|
end
|
||
|
|
||
|
for k, v in pairs(monitors) do if v.setTextScale then v.setTextScale(1) end end
|
||
|
|
||
|
local function line()
|
||
|
local out = "\167" .. random_pick(chat_colors)
|
||
|
for i = 1, 32 do
|
||
|
out = out .. random_char()
|
||
|
end
|
||
|
return out
|
||
|
end
|
||
|
|
||
|
while true do
|
||
|
for k, v in pairs(monitors) do
|
||
|
pcall(run, v)
|
||
|
sleep(0)
|
||
|
end
|
||
|
for k, v in pairs(signs) do
|
||
|
pcall(v.setSignText, line(), line(), line(), line())
|
||
|
sleep()
|
||
|
end
|
||
|
end
|