Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- os = require("os")
- fs = require("filesystem")
- component = require("component")
- computer = require("computer")
- term = require("term")
- event = require("event")
- ser = require("serialization")
- reactor = component.warpdriveEnanReactorCore
- if component.isAvailable("capacitor_bank") then
- cell = component.capacitor_bank
- else
- cell = {}
- cell.lie = true
- cell.getEnergyStored = function() return math.huge end
- cell.getMaxEnergyStored = function() return math.huge end
- cell.setIOMode = function() end
- end
- --Каждый элемент - таблица, в которой описаны: мин. состояние, стандартное состояние и макс. состояние, а так же номер состояния при выводе на экран
- defSettings = {
- ["Макс. энергия (%)(Батарея)"] = {0, 95, math.huge, 1},
- ["Мин. энергия (%)(Батарея)"] = {0, 10, 100, 2},
- ["Удерживаемая нестабильность"] = {0, 75, 99, 3},
- ["Критическая нестабильность"] = {0, 80, 99, 4},
- ["Верхний порог энергии (ядро)"] = {0, 99900000, 100000000, 5},
- ["Нижний порог энергии (ядро)"] = {0, 80000000, 100000000, 6},
- ["Энергия стабилизации"] = {1, 10000, math.huge, 7},
- ["Энергия крит. стабилизации"] = {10000, 100000, math.huge, 8},
- ["Макс. выводимая энергия"] = {0, 100000, math.huge, 9},
- ["Реактор активирован"] = {false, false, true, 10}
- }
- settings = {
- ["Макс. энергия (%)(Батарея)"] = 95,
- ["Мин. энергия (%)(Батарея)"] = 10,
- ["Удерживаемая нестабильность"] = 75,
- ["Критическая нестабильность"] = 80,
- ["Верхний порог энергии (ядро)"] = 99900000,
- ["Нижний порог энергии (ядро)"] = 80000000,
- ["Макс. выводимая энергия"] = 100000,
- ["Энергия стабилизации"] = 10000,
- ["Энергия крит. стабилизации"] = 100000,
- ["Реактор активирован"] = false
- }
- drawableState = {
- ["Нестабильность"] = 0,
- ["Заряд батарей"] = 0,
- ["Заряд реактора"] = 0,
- ["Вывод энергии"] = 0,
- ["Статус реактора"] = "shutdowned"
- }
- SA = {} --Settings Assotiates
- gState = {
- BODS = 3, --Begin Of Draw States
- EODS = 1, --End Of Draw States
- NOS = 0, --Number Of Setting
- EN = 0, --Entering number
- setState = false,
- SOS = 1, --Size Of Settings
- CFG --file of config
- }
- function drawStates()
- term.clear()
- y = gState.BODS
- for i = 1, gState.SOS do
- term.setCursor(1, i)
- term.write(i..". "..tostring(SA[i]))
- term.setCursor(40, i)
- term.write(tostring(settings[SA[i]]))
- end
- for name, state in pairs(drawableState) do
- term.setCursor(1, y)
- term.write(name)
- term.setCursor(40, y)
- term.write(tostring(state))
- y = y + 1
- end
- term.setCursor(1, y + 1)
- if gState.setState == false then
- term.write("Номер выбраной настройки: "..tostring(gState.EN).." -")
- term.setCursor(1, y + 2)
- term.write("Новое значение: 0")
- else
- term.write("Номер выбраной настройки: "..tostring(gState.NOS))
- term.setCursor(1, y + 2)
- term.write("Новое значение: "..tostring(gState.EN).." -")
- end
- end
- function checkSettings()
- for k, v in pairs(defSettings) do
- if type(v[1]) ~= "boolean" then
- if settings[k] < v[1] or settings[k] > v[3] then
- settings[k] = v[2]
- end
- end
- end
- end
- function updateData()
- drawableState["Нестабильность"] = reactor.instability()
- drawableState["Заряд батарей"] = (cell.getEnergyStored() / cell.getMaxEnergyStored()) * 100
- drawableState["Заряд реактора"] = reactor.energy()
- _, _, drawableState["Вывод энергии"] = reactor.energy()
- _, state = reactor.state()
- if state then
- drawableState["Статус реактора"] = "Работает"
- else
- drawableState["Статус реактора"] = "Не работает"
- end
- end
- function reactor_ctrl()
- _, state = reactor.state()
- shutdown = false
- OutMode = "push"
- RIMode = "pull"
- reactor.instabilityTarget(settings["Удерживаемая нестабильность"])
- reactor.stabilizerEnergy(settings["Энергия стабилизации"])
- if drawableState["Заряд батарей"] < settings["Мин. энергия (%)(Батарея)"] then
- reactor.release(true)
- OutMode = "pull"
- end
- if drawableState["Заряд батарей"] > settings["Макс. энергия (%)(Батарея)"] then
- reactor.release(true)
- shutdown = true
- elseif drawableState["Заряд реактора"] < settings["Нижний порог энергии (ядро)"] then
- reactor.release(false)
- OutMode = "pull"
- else
- reactor.releaseAbove(settings["Макс. выводимая энергия"])
- end
- if settings["Реактор активирован"] == false then
- shutdown = true
- end
- if drawableState["Заряд реактора"] > settings["Верхний порог энергии (ядро)"] then
- shutdown = true
- end
- if math.max(reactor.instability()) >= settings["Критическая нестабильность"] then
- if reactor.energy() < settings["Энергия крит. стабилизации"] then
- OutMode = "pull"
- end
- shutdown = true
- reactor.release(true)
- reactor.stabilizerEnergy(1000000)
- end
- if shutdown then
- reactor.enable(false)
- else
- reactor.enable(true)
- end
- cell.setIOMode(2, OutMode)
- cell.setIOMode(1, RIMode)
- end
- function CID(keyboardAddress, _char, code, playerName) --Check Input Data
- if keyboardAddress == nil or _char == nil or code == nil or playerName == nil then
- return false
- end
- code = tonumber(code)
- if code == 13 then
- if gState.setState == true then
- if type(settings[SA[gState.NOS]]) == "boolean" then
- if gState.EN > 0 then
- settings[SA[gState.NOS]] = true
- else
- settings[SA[gState.NOS]] = false
- end
- gState.EN = 0
- gState.NOS = 0
- elseif type(settings[SA[gState.NOS]]) == "number" then
- settings[SA[gState.NOS]] = gState.EN
- gState.EN = 0
- gState.NOS = 0
- end
- gState.setState = false
- fs.remove("/etc/ReactorControl.cfg")
- file = io.open("/etc/ReactorControl.cfg", 'w')
- file:write(ser.serialize(settings))
- file:flush()
- file:close()
- elseif gState.EN > 0 and gState.EN <= gState.SOS then
- gState.NOS = gState.EN
- gState.EN = 0
- gState.setState = true
- end
- elseif code == 8 then
- gState.EN = gState.EN - (gState.EN % 10)
- gState.EN = gState.EN / 10
- elseif code >= 48 and code <= 57 then
- code = code - 48
- gState.EN = gState.EN * 10
- gState.EN = gState.EN + code
- end
- if cell.lie == true then settings["Макс. энергия (%)(Батарея)"] = math.huge end
- end
- function init()
- if fs.exists("/etc/ReactorControl.cfg") ~= true then
- file = io.open("/etc/ReactorControl.cfg", 'w')
- file:write("")
- file:flush()
- file:close()
- else
- file = io.open("/etc/ReactorControl.cfg", 'r')
- settings = ser.unserialize(file:read("*a"))
- file:close()
- end
- term.setCursor(1, 1)
- term.write("Инициализация")
- reactor.enable(false)
- reactor.instabilityTarget(settings["Удерживаемая нестабильность"])
- reactor.stabilizerEnergy(10000)
- _, MEIR = reactor.energy()
- if settings["Верхний порог энергии (ядро)"] > MEIR then
- settings["Верхний порог энергии (ядро)"] = MEIR - 1
- end
- if settings["Нижний порог энергии (ядро)"] > settings["Верхний порог энергии (ядро)"] then
- settings["Нижний порог энергии (ядро)"] = settings["Верхний порог энергии (ядро)"] - 1
- end
- i = 1
- for k, v in pairs(settings) do
- if defSettings[k] ~= nil then
- SA[defSettings[k][4]] = k
- i = i + 1
- end
- end
- for k, v in pairs(settings) do
- if defSettings[k] == nil then
- SA[i] = k
- i = i + 1
- end
- end
- gState.SOS = i - 1
- gState.BODS = i + 2
- i = 1
- for k, v in pairs(drawableState) do
- i = i + 1
- end
- gState.EODS = i
- if cell.lie == true then settings["Макс. энергия (%)(Батарея)"] = math.huge end
- end
- init()
- while true do
- drawStates()
- updateData()
- checkSettings()
- reactor_ctrl()
- bufTab = table.pack(event.pull(0.1, "key_down"))
- if bufTab ~= nil then
- CID(table.unpack(bufTab))
- end
- end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement