MineOS/Applications/TurretControl/TurretControl.lua
2016-03-31 23:59:38 +03:00

269 lines
9.6 KiB
Lua

local component = require("component")
local buffer = require("doubleBuffering")
local image = require("image")
local event = require("event")
local ecs = require("ECSAPI")
local serialization = require("serialization")
local unicode = require("unicode")
-------------------------------------------------------------------------------------------------------------------------------------
buffer.start()
local pathToTurretPicture = "MineOS/Applications/TurretControl.app/Resources/Turret.pic"
local turretImage = image.load(pathToTurretPicture)
local turrets = {}
local proxies = {}
local turretConfig = {
turretsOn = false,
attacksNeutrals = false,
attacksPlayers = false,
attacksMobs = false,
}
local yTurrets = 2
local spaceBetweenTurretsHorizontal = 2
local spaceBetweenTurretsVertical = 1
local turretHeight = turretImage.height + 12
local turretWidth = turretImage.width + 8
local countOfTurretsCanBeShowByWidth = math.floor(buffer.screen.width / (turretWidth + spaceBetweenTurretsHorizontal))
local xTurrets = math.floor(buffer.screen.width / 2 - (countOfTurretsCanBeShowByWidth * (turretWidth + spaceBetweenTurretsHorizontal)) / 2 ) + math.floor(spaceBetweenTurretsHorizontal / 2)
local yellowColor = 0xFFDB40
-------------------------------------------------------------------------------------------------------------------------------------
--Объекты
local obj = {}
local function newObj(class, name, ...)
obj[class] = obj[class] or {}
obj[class][name] = {...}
end
local function getProxiesOfAllComponents(name)
for address in pairs(component.list(name)) do
table.insert(proxies, component.proxy(address))
end
end
local function getTurrets()
getProxiesOfAllComponents("tierOneTurretBase")
getProxiesOfAllComponents("tierTwoTurretBase")
getProxiesOfAllComponents("tierThreeTurretBase")
getProxiesOfAllComponents("tierFourTurretBase")
getProxiesOfAllComponents("tierFiveTurretBase")
for i = 1, #proxies do
-- print(proxies[i].type)
if type(proxies[i].getCurrentEnergyStorage()) ~= "string" then
local turret = {}
turret.type = proxies[i].type
-- turret.isActive = (proxies[i].isAttacksPlayers() and proxies[i].isAttacksMobs()) and true or false
turret.energyPercent = math.ceil(proxies[i].getCurrentEnergyStorage() / proxies[i].getMaxEnergyStorage() * 100)
turret.proxy = proxies[i]
table.insert(turrets, turret)
turret.isActive = turretConfig.turretsOn
turret.proxy.setAttacksNeutrals(turretConfig.attacksNeutrals)
turret.proxy.setAttacksPlayers(turretConfig.attacksPlayers)
turret.proxy.setAttacksMobs(turretConfig.attacksMobs)
end
end
end
local function progressBar(x, y, width, height, background, foreground, percent)
buffer.square(x, y, width, height, background)
buffer.frame(x, y, width, height, foreground)
width = width - 2
local cykaWidth = math.ceil(width * percent / 100)
buffer.text(x + 1, y + 1, foreground, string.rep("", cykaWidth))
end
local function drawTurrets(y)
local counter = 0
local x = xTurrets
if #turrets <= 0 then
local text = "Подключите турели из мода OpenModularTurrets"
local x = math.floor(buffer.screen.width / 2 - unicode.len(text) / 2)
buffer.text(x, math.floor(buffer.screen.height / 2 - 2), yellowColor, text)
end
for turret = 1, #turrets do
local yPos = y
buffer.frame(x, yPos, turretWidth, turretHeight, yellowColor)
yPos = yPos + 1
buffer.text(x + 2, yPos, yellowColor, ecs.stringLimit("end", "Турель " .. turrets[turret].proxy.address, turretWidth - 4))
yPos = yPos + 2
buffer.image(x + 4, yPos, turretImage)
yPos = yPos + turretImage.height + 1
buffer.text(x + 2, yPos, yellowColor, "Энергия:")
yPos = yPos + 1
progressBar(x + 1, yPos, turretWidth - 2, 3, 0x000000, yellowColor, turrets[turret].energyPercent)
yPos = yPos + 4
local widthOfButton = 13
-- local isActive = turrets[turret].getActive()
local isActive = turrets[turret].isActive
newObj("TurretOn", turret, buffer.button(x + 2, yPos, widthOfButton, 1, isActive and yellowColor or 0x000000, isActive and 0x000000 or yellowColor, "ВКЛ"))
obj.TurretOn[turret].proxy = turrets[turret].proxy
newObj("TurretOff", turret, buffer.button(x + 2 + widthOfButton + 2, yPos, widthOfButton, 1, not isActive and yellowColor or 0x000000, not isActive and 0x000000 or yellowColor, "ВЫКЛ"))
yPos = yPos + 1
x = x + turretWidth + spaceBetweenTurretsHorizontal
counter = counter + 1
if counter % countOfTurretsCanBeShowByWidth == 0 then
x = xTurrets
y = y + turretHeight + spaceBetweenTurretsVertical
end
end
end
local function drawSeparator(y)
buffer.text(1, y, yellowColor, string.rep("", buffer.screen.width))
end
local function drawButtonWithState(x, y, width, height, text, state)
if state then
buffer.button(x, y, width, height, yellowColor, 0x000000, text)
else
buffer.framedButton(x, y, width, height, 0x000000, yellowColor, text)
end
return (x + width + 1)
end
local function drawBottomBar()
local height = 6
local y = buffer.screen.height - height + 1
buffer.square(1, y, buffer.screen.width, height, 0x000000, yellowColor, " ")
drawSeparator(y)
local text = " ECS® Security Systems™ "
local x = math.floor(buffer.screen.width / 2 - unicode.len(text) / 2)
buffer.text(x, y, yellowColor, text)
y = y + 2
local widthOfButton = 19
local totalWidth = (widthOfButton + 2) * 6
local x = math.floor(buffer.screen.width / 2 - totalWidth / 2) + 1
newObj("BottomButtons", "On", x, y, x + widthOfButton - 1, y + 2)
x = drawButtonWithState(x, y, widthOfButton, 3, "Турели ВКЛ", turretConfig.turretsOn)
newObj("BottomButtons", "Off", x, y, x + widthOfButton - 1, y + 2)
x = drawButtonWithState(x, y, widthOfButton, 3, "Турели ВЫКЛ", not turretConfig.turretsOn)
newObj("BottomButtons", "AddPlayer", x, y, x + widthOfButton - 1, y + 2)
x = drawButtonWithState(x, y, widthOfButton, 3, "Добавить игрока", false)
newObj("BottomButtons", "AttacksMobs", x, y, x + widthOfButton - 1, y + 2)
x = drawButtonWithState(x, y, widthOfButton, 3, "Атака мобов", turretConfig.attacksMobs)
newObj("BottomButtons", "AttacksNeutrals", x, y, x + widthOfButton - 1, y + 2)
x = drawButtonWithState(x, y, widthOfButton, 3, "Атака нейтралов", turretConfig.attacksNeutrals)
newObj("BottomButtons", "AttacksPlayers", x, y, x + widthOfButton - 1, y + 2)
x = drawButtonWithState(x, y, widthOfButton, 3, "Атака игроков", turretConfig.attacksPlayers)
end
local function drawAll()
buffer.clear(0x000000)
drawTurrets(yTurrets)
drawBottomBar()
buffer.draw()
end
local function refresh()
turrets = {}
proxies = {}
getTurrets()
drawAll()
end
local function changeTurretState(i, state)
turrets[i].isActive = state
if state == true then
turrets[i].proxy.setAttacksNeutrals(turretConfig.attacksNeutrals)
turrets[i].proxy.setAttacksPlayers(turretConfig.attacksPlayers)
turrets[i].proxy.setAttacksMobs(turretConfig.attacksMobs)
else
turrets[i].proxy.setAttacksNeutrals(false)
turrets[i].proxy.setAttacksPlayers(false)
turrets[i].proxy.setAttacksMobs(false)
end
end
-------------------------------------------------------------------------------------------------------------------------------------
refresh()
while true do
local e = {event.pull()}
if e[1] == "touch" then
for key in pairs(obj.TurretOn) do
if ecs.clickedAtArea(e[3], e[4], obj.TurretOn[key][1], obj.TurretOn[key][2], obj.TurretOn[key][3], obj.TurretOn[key][4]) then
changeTurretState(key, true)
drawAll()
break
end
end
for key in pairs(obj.TurretOff) do
if ecs.clickedAtArea(e[3], e[4], obj.TurretOff[key][1], obj.TurretOff[key][2], obj.TurretOff[key][3], obj.TurretOff[key][4]) then
changeTurretState(key, false)
drawAll()
break
end
end
for key in pairs(obj.BottomButtons) do
if ecs.clickedAtArea(e[3], e[4], obj.BottomButtons[key][1], obj.BottomButtons[key][2], obj.BottomButtons[key][3], obj.BottomButtons[key][4]) then
if key == "On" then
turretConfig.turretsOn = true
for i = 1, #turrets do changeTurretState(i, true) end
drawAll()
elseif key == "Off" then
turretConfig.turretsOn = false
for i = 1, #turrets do changeTurretState(i, false) end
drawAll()
elseif key == "AttacksNeutrals" then
turretConfig.attacksNeutrals = not turretConfig.attacksNeutrals
for i = 1, #turrets do changeTurretState(i, turrets[i].isActive) end
drawAll()
elseif key == "AttacksMobs" then
turretConfig.attacksMobs = not turretConfig.attacksMobs
for i = 1, #turrets do changeTurretState(i, turrets[i].isActive) end
drawAll()
elseif key == "AttacksPlayers" then
turretConfig.attacksPlayers = not turretConfig.attacksPlayers
for i = 1, #turrets do changeTurretState(i, turrets[i].isActive) end
drawAll()
elseif key == "AddPlayer" then
local data = ecs.universalWindow("auto", "auto", 30, 0x1e1e1e, true, {"EmptyLine"}, {"CenterText", ecs.colors.orange, "Добавить игрока"}, {"EmptyLine"}, {"Input", 0xFFFFFF, ecs.colors.orange, "Никнейм"}, {"EmptyLine"}, {"Button", {ecs.colors.orange, 0xffffff, "OK"}, {0x999999, 0xffffff, "Отмена"}} )
if data[2] == "OK" then for i = 1, #turrets do turrets[i].proxy.addTrustedPlayer(data[1]) end end
end
break
end
end
elseif e[1] == "scroll" then
if e[5] == 1 then
yTurrets = yTurrets + 2
else
yTurrets = yTurrets - 2
end
drawAll()
elseif e[1] == "component_added" or e[1] == "component_removed" then
if e[3] == "tierOneTurretBase" or e[3] == "tierTwoTurretBase" or e[3] == "tierThreeTurretBase" or e[3] == "tierFourTurretBase" or e[3] == "tierFiveTurretBase" then
refresh()
end
end
end