MineOS/Applications/Home.lua
2015-08-05 06:14:27 +03:00

238 lines
6.5 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}, {true, ecs.colors.green, colors.pink}, {true, ecs.colors.green, colors.red}, {true, ecs.colors.green, colors.orange}, {true, ecs.colors.green, colors.red}}
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 = val
if open then
rs.setBundledOutput(redstoneSide, color, 100)
else
rs.setBundledOutput(redstoneSide, color, 100)
end
end
end
local function mini()
clearMonitor(0xffffff, 0x444444, "Приложите палец для идентификации")
end
local function main(info)
gpu.setBackground(0xffffff)
gpu.fill(1, 1, xSize, ySize, " ")
local yCenter = math.floor(ySize / 2)
local yPos = yCenter - 9
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
gpu.setBackground(0xffffff)
gpu.setForeground(0x444444)
ecs.centerText("x", ySize - 3, info)
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
-----------------------------------------
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
if buttons[key][1] then
buttons[key][1] = false
buttons[key][2] = 0x444444
else
buttons[key][1] = true
buttons[key][2] = ecs.colors.green
end
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, "Недостойным дороги нет.")
killThemAll()
os.sleep(doorTimer)
mini()
bind()
main(e[6].." попытался зайти в дом. Убей его. Убей чужака!")
end
end
elseif e[1] == "modem_message" then
if e[6] == "killThemAll!" then
killThemAll()
end
elseif e[1] == "key_down" then
if e[4] == 28 then
killThemAll()
end
end
end