MineOS/Applications/Home.lua
2015-08-06 06:03:17 +03:00

263 lines
7.6 KiB
Lua
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

local c = require("component")
local computer = require("computer")
local event = require("event")
local ecs = require("ECSAPI")
local colors = require("colors")
local sides = require("sides")
local config = require("config")
local fs = require("filesystem")
local rs = c.redstone
local gpu = c.gpu
local modem = c.modem
modem.open(512)
---------------------------------------------------------------------
local pathToWhitelist = "System/Home/whitelist.txt"
local pathToDoors = "System/Home/doors.txt"
local whitelist
local doors
if not fs.exists(pathToWhitelist) then
fs.makeDirectory(fs.path(pathToWhitelist))
config.write(pathToWhitelist, "Igor_Timofeev", "owner")
end
if not fs.exists(pathToDoors) then
config.write(pathToDoors, "3b1ea", colors.lightblue)
config.write(pathToDoors, "9d482", colors.yellow)
doors = config.readAll(pathToDoors)
end
whitelist = config.readAll(pathToWhitelist)
doors = config.readAll(pathToDoors)
------------------------------------------------------------------------
local redstoneSide = sides.bottom
local xScale, yScale = 40, 20
local xSize, ySize = gpu.getResolution()
local doorTimer = 3
local buttons = {{false, 0x444444, colors.lightblue}, {false, 0x444444, colors.black}, {false, 0x444444, colors.brown}, {true, ecs.colors.green, colors.pink}, {true, ecs.colors.green, colors.red}, {true, ecs.colors.green, colors.orange}}
local killWireColor = colors.blue
---------------------------------------
local obj = {}
local function newObj(class, name, ...)
obj[class] = obj[class] or {}
obj[class][name] = {...}
end
local function getScreens()
local list = c.list()
local screens = {}
for key, val in pairs(list) do
if val == "screen" then
screens[key] = {val, c.isPrimary(key)}
end
end
return screens
end
local function clearMonitor(backColor, frontColor, text)
gpu.setBackground(backColor)
local xSize, ySize = gpu.getResolution()
gpu.fill(1, 1, xSize, ySize, " ")
gpu.setForeground(frontColor)
ecs.centerText("xy", 1, text)
end
local screens = getScreens()
local primaryScreen = c.getPrimary("screen").address
local function bind(address)
if address then
gpu.bind(address)
gpu.setResolution(xScale, yScale)
else
gpu.bind(primaryScreen)
gpu.setResolution(xSize, ySize)
end
end
local function checkNick(nick)
for key, val in pairs(whitelist) do
if key == nick then return true end
end
return false
end
--DOORS
local function door(which, open)
local color = 0
local address
for key, val in pairs(doors) do
address = c.get(key, "screen")
if address == which then
color = tonumber(val)
break
end
end
if open then
rs.setBundledOutput(redstoneSide, color, 100)
else
rs.setBundledOutput(redstoneSide, color, 0)
end
end
local function openAllDoors(open)
local color
for key, val in pairs(doors) do
color = tonumber(val)
if open then
rs.setBundledOutput(redstoneSide, color, 100)
else
rs.setBundledOutput(redstoneSide, color, 0)
end
end
end
local function mini()
clearMonitor(0xffffff, 0x444444, "Приложите палец для идентификации")
end
local function infa()
gpu.setBackground(0xffffff)
gpu.setForeground(0x444444)
local yPos = ySize - 3
if c.isAvailable("mfsu") then ecs.centerText("x", yPos, "Заряд МФСУ: "..c.mfsu.getStored()); yPos = yPos + 1 end
if c.isAvailable("reactor") then ecs.centerText("x", yPos, "Нагрев реактора: "..math.ceil(c.reactor.getHeat() / c.reactor.getMaxHeat() * 100).."%"); yPos = yPos + 1 end
if c.isAvailable("reactor_chamber") then ecs.centerText("x", yPos, "Нагрев реактора: "..math.ceil(c.reactor_chamber.getHeat() / c.reactor_chamber.getMaxHeat() * 100).."%"); yPos = yPos + 1 end
end
local function main()
gpu.setBackground(0xffffff)
gpu.fill(1, 1, xSize, ySize, " ")
local yCenter = math.floor(ySize / 2)
local yPos = yCenter - 12
newObj("buttons", 1, ecs.drawAdaptiveButton("auto", yPos, 3, 1, "Открыть двери", buttons[1][2] or 0x444444, 0xffffff)); yPos = yPos + 4
newObj("buttons", 2, ecs.drawAdaptiveButton("auto", yPos, 3, 1, "Фабрика материи", buttons[2][2] or 0x444444, 0xffffff)); yPos = yPos + 4
newObj("buttons", 3, ecs.drawAdaptiveButton("auto", yPos, 3, 1, "Управление реактором", buttons[3][2] or 0x444444, 0xffffff)); yPos = yPos + 4
newObj("buttons", 4, ecs.drawAdaptiveButton("auto", yPos, 3, 1, "Свет на втором этаже", buttons[4][2] or 0x444444, 0xffffff)); yPos = yPos + 4
newObj("buttons", 5, ecs.drawAdaptiveButton("auto", yPos, 3, 1, "Свет на первом этаже", buttons[5][2] or 0x444444, 0xffffff)); yPos = yPos + 4
newObj("buttons", 6, ecs.drawAdaptiveButton("auto", yPos, 3, 1, "Свет в шахте", buttons[6][2] or 0x444444, 0xffffff)); yPos = yPos + 4
infa()
end
local function redstoneRecontrol()
for i = 1, #buttons do
if buttons[i][1] then
rs.setBundledOutput(redstoneSide, buttons[i][3], 100)
else
rs.setBundledOutput(redstoneSide, buttons[i][3], 0)
end
end
end
local function killThemAll()
ecs.square(1, 1, xSize, ySize, 0xff0000)
gpu.setForeground(0xffffff)
ecs.centerText("xy", 1, "KILL THEM ALL!")
rs.setBundledOutput(redstoneSide, killWireColor, 100)
os.sleep(2)
rs.setBundledOutput(redstoneSide, killWireColor, 0)
main("Помещение очищено от всего живого.")
end
local function switchButton(key, buttonColor)
if buttons[key][1] then
buttons[key][1] = false
buttons[key][2] = 0x444444
else
buttons[key][1] = true
buttons[key][2] = buttonColor or ecs.colors.green
end
end
-----------------------------------------
main("Ничего интересного.")
for key, val in pairs(screens) do
if not val[2] then
bind(key)
mini()
bind()
end
end
while true do
local e = {event.pull()}
if e[1] == "touch" then
--ЕСЛИ КЛИКНУТО НА ГЛАВНОМ МОНИКЕ
if e[2] == primaryScreen then
for key, val in pairs(obj["buttons"]) do
if ecs.clickedAtArea(e[3], e[4], obj["buttons"][key][1], obj["buttons"][key][2], obj["buttons"][key][3], obj["buttons"][key][4]) then
local color
if key == 3 then color = ecs.colors.red end
switchButton(key, color)
main("Изменен параметр кнопки "..tostring(key).." на "..tostring(buttons[key][1]))
if key == 1 then
openAllDoors(buttons[key][1])
else
redstoneRecontrol()
end
break
end
end
--ЕСЛИ КЛИКНУТО НА КАКОМ-ТО ЛЕВОМ МОНИКЕ
else
bind(e[2])
if checkNick(e[6]) then
clearMonitor(0x44ff44, 0xffffff, "С возвращением, "..e[6].."!")
door(e[2], true)
os.sleep(doorTimer)
door(e[2], false)
mini()
bind()
main(e[6].." вернулся в нашу скромную обитель!")
else
clearMonitor(0xff0000, 0xffffff, "Недостойным дороги нет.")
bind()
killThemAll()
bind(e[2])
os.sleep(doorTimer)
mini()
bind()
main(e[6].." попытался зайти в дом. Убей его. Убей чужака!")
end
end
infa()
elseif e[1] == "modem_message" then
if e[6] == "killThemAll!" then
killThemAll()
elseif e[6] == "openAllDoors" then
switchButton(1)
openAllDoors(buttons[1][1])
main("Двери открыты!")
end
elseif e[1] == "key_down" then
if e[4] == 28 then
killThemAll()
end
end
end