Advertisement
Umaler

WDRC

May 29th, 2020 (edited)
551
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 8.69 KB | None | 0 0
  1. os = require("os")
  2. fs = require("filesystem")
  3. component = require("component")
  4. computer = require("computer")
  5. term = require("term")
  6. event = require("event")
  7. ser = require("serialization")
  8. reactor = component.warpdriveEnanReactorCore
  9.  
  10. if component.isAvailable("capacitor_bank") then
  11.     cell = component.capacitor_bank
  12. else
  13.     cell = {}
  14.     cell.lie = true
  15.     cell.getEnergyStored = function() return math.huge end
  16.     cell.getMaxEnergyStored = function() return math.huge end
  17.     cell.setIOMode = function() end
  18. end
  19.  
  20. --Каждый элемент - таблица, в которой описаны: мин. состояние, стандартное состояние и макс. состояние, а так же номер состояния при выводе на экран
  21. defSettings = {
  22.     ["Макс. энергия (%)(Батарея)"] = {0, 95, math.huge, 1},
  23.     ["Мин. энергия (%)(Батарея)"] = {0, 10, 100, 2},
  24.     ["Удерживаемая нестабильность"] = {0, 75, 99, 3},
  25.     ["Критическая нестабильность"] = {0, 80, 99, 4},
  26.     ["Верхний порог энергии (ядро)"] = {0, 99900000, 100000000, 5},
  27.     ["Нижний порог энергии (ядро)"] = {0, 80000000, 100000000, 6},
  28.     ["Энергия стабилизации"] = {1, 10000, math.huge, 7},
  29.     ["Энергия крит. стабилизации"] = {10000, 100000, math.huge, 8},
  30.     ["Макс. выводимая энергия"] = {0, 100000, math.huge, 9},
  31.     ["Реактор активирован"] = {false, false, true, 10}
  32. }
  33.  
  34. settings = {
  35.     ["Макс. энергия (%)(Батарея)"] = 95,
  36.     ["Мин. энергия (%)(Батарея)"] = 10,
  37.     ["Удерживаемая нестабильность"] = 75,
  38.     ["Критическая нестабильность"] = 80,
  39.     ["Верхний порог энергии (ядро)"] = 99900000,
  40.     ["Нижний порог энергии (ядро)"] = 80000000,
  41.     ["Макс. выводимая энергия"] = 100000,
  42.     ["Энергия стабилизации"] = 10000,
  43.     ["Энергия крит. стабилизации"] = 100000,
  44.     ["Реактор активирован"] = false
  45. }
  46.  
  47. drawableState = {
  48.     ["Нестабильность"] = 0,
  49.     ["Заряд батарей"] = 0,
  50.     ["Заряд реактора"] = 0,
  51.     ["Вывод энергии"] = 0,
  52.     ["Статус реактора"] = "shutdowned"
  53. }
  54.  
  55. SA = {} --Settings Assotiates
  56.  
  57. gState = {
  58.    
  59.     BODS = 3,       --Begin Of Draw States
  60.    
  61.     EODS = 1,       --End Of Draw States
  62.    
  63.     NOS = 0,                --Number Of Setting
  64.     EN = 0,             --Entering number
  65.     setState = false,
  66.    
  67.     SOS = 1,            --Size Of Settings
  68.    
  69.     CFG                 --file of config
  70. }
  71.  
  72. function drawStates()
  73.     term.clear()
  74.     y = gState.BODS
  75.     for i = 1, gState.SOS do
  76.         term.setCursor(1, i)
  77.         term.write(i..". "..tostring(SA[i]))
  78.         term.setCursor(40, i)
  79.         term.write(tostring(settings[SA[i]]))
  80.     end
  81.     for name, state in pairs(drawableState) do
  82.         term.setCursor(1, y)
  83.         term.write(name)
  84.         term.setCursor(40, y)
  85.         term.write(tostring(state))
  86.         y = y + 1
  87.     end
  88.     term.setCursor(1, y + 1)
  89.     if gState.setState == false then
  90.         term.write("Номер выбраной настройки: "..tostring(gState.EN).."    -")
  91.         term.setCursor(1, y + 2)
  92.         term.write("Новое значение: 0")
  93.     else
  94.         term.write("Номер выбраной настройки: "..tostring(gState.NOS))
  95.         term.setCursor(1, y + 2)
  96.         term.write("Новое значение: "..tostring(gState.EN).."    -")
  97.     end
  98. end
  99.  
  100. function checkSettings()
  101.     for k, v in pairs(defSettings) do
  102.         if type(v[1]) ~= "boolean" then
  103.             if settings[k] < v[1] or settings[k] > v[3] then
  104.                 settings[k] = v[2]
  105.             end
  106.         end
  107.     end
  108. end
  109.  
  110. function updateData()
  111.     drawableState["Нестабильность"] = reactor.instability()
  112.     drawableState["Заряд батарей"] = (cell.getEnergyStored() / cell.getMaxEnergyStored()) * 100
  113.     drawableState["Заряд реактора"] = reactor.energy()
  114.     _, _, drawableState["Вывод энергии"] = reactor.energy()
  115.     _, state = reactor.state()
  116.     if state then
  117.         drawableState["Статус реактора"] = "Работает"
  118.     else
  119.         drawableState["Статус реактора"] = "Не работает"
  120.     end
  121. end
  122.  
  123. function reactor_ctrl()
  124.     _, state = reactor.state()
  125.     shutdown = false
  126.     OutMode = "push"
  127.     RIMode = "pull"
  128.    
  129.     reactor.instabilityTarget(settings["Удерживаемая нестабильность"])
  130.     reactor.stabilizerEnergy(settings["Энергия стабилизации"])
  131.    
  132.     if drawableState["Заряд батарей"] < settings["Мин. энергия (%)(Батарея)"] then
  133.         reactor.release(true)
  134.         OutMode = "pull"
  135.     end
  136.    
  137.     if drawableState["Заряд батарей"] > settings["Макс. энергия (%)(Батарея)"] then
  138.         reactor.release(true)
  139.         shutdown = true
  140.     elseif drawableState["Заряд реактора"] < settings["Нижний порог энергии (ядро)"] then
  141.         reactor.release(false)
  142.         OutMode = "pull"
  143.     else
  144.         reactor.releaseAbove(settings["Макс. выводимая энергия"])
  145.     end
  146.    
  147.     if settings["Реактор активирован"] == false then
  148.         shutdown = true
  149.     end
  150.    
  151.     if drawableState["Заряд реактора"] > settings["Верхний порог энергии (ядро)"] then
  152.         shutdown = true
  153.     end
  154.    
  155.     if math.max(reactor.instability()) >= settings["Критическая нестабильность"] then
  156.         if reactor.energy() < settings["Энергия крит. стабилизации"] then
  157.             OutMode = "pull"
  158.         end
  159.         shutdown = true
  160.         reactor.release(true)
  161.         reactor.stabilizerEnergy(1000000)
  162.     end
  163.    
  164.     if shutdown then
  165.         reactor.enable(false)
  166.     else
  167.         reactor.enable(true)
  168.     end
  169.    
  170.     cell.setIOMode(2, OutMode)
  171.     cell.setIOMode(1, RIMode)
  172.    
  173. end
  174.  
  175. function CID(keyboardAddress, _char, code, playerName)                      --Check Input Data
  176.     if keyboardAddress == nil or _char == nil or code == nil or playerName == nil then
  177.         return false
  178.     end
  179.     code = tonumber(code)
  180.     if code == 13 then
  181.         if gState.setState == true then
  182.             if type(settings[SA[gState.NOS]]) == "boolean" then
  183.                 if gState.EN > 0 then
  184.                     settings[SA[gState.NOS]] = true
  185.                 else
  186.                     settings[SA[gState.NOS]] = false
  187.                 end
  188.                 gState.EN = 0
  189.                 gState.NOS = 0
  190.             elseif type(settings[SA[gState.NOS]]) == "number" then
  191.                 settings[SA[gState.NOS]] = gState.EN
  192.                 gState.EN = 0
  193.                 gState.NOS = 0
  194.             end
  195.             gState.setState = false
  196.             fs.remove("/etc/ReactorControl.cfg")
  197.             file = io.open("/etc/ReactorControl.cfg", 'w')
  198.             file:write(ser.serialize(settings))
  199.             file:flush()
  200.             file:close()
  201.         elseif gState.EN > 0 and gState.EN <= gState.SOS then
  202.             gState.NOS = gState.EN
  203.             gState.EN = 0
  204.             gState.setState = true
  205.         end
  206.     elseif code == 8 then
  207.         gState.EN = gState.EN - (gState.EN % 10)
  208.         gState.EN = gState.EN / 10
  209.     elseif code >= 48 and code <= 57 then
  210.         code = code - 48
  211.         gState.EN = gState.EN * 10
  212.         gState.EN = gState.EN + code
  213.     end
  214.     if cell.lie == true then settings["Макс. энергия (%)(Батарея)"] = math.huge end
  215. end
  216.  
  217. function init()
  218.     if fs.exists("/etc/ReactorControl.cfg") ~= true then
  219.         file = io.open("/etc/ReactorControl.cfg", 'w')
  220.         file:write("")
  221.         file:flush()
  222.         file:close()
  223.     else
  224.         file = io.open("/etc/ReactorControl.cfg", 'r')
  225.         settings = ser.unserialize(file:read("*a"))
  226.         file:close()
  227.     end
  228.  
  229.     term.setCursor(1, 1)
  230.     term.write("Инициализация")
  231.  
  232.     reactor.enable(false)
  233.     reactor.instabilityTarget(settings["Удерживаемая нестабильность"])
  234.     reactor.stabilizerEnergy(10000)
  235.  
  236.     _, MEIR = reactor.energy()
  237.     if settings["Верхний порог энергии (ядро)"] > MEIR then
  238.         settings["Верхний порог энергии (ядро)"] = MEIR - 1
  239.     end
  240.     if settings["Нижний порог энергии (ядро)"] > settings["Верхний порог энергии (ядро)"] then
  241.         settings["Нижний порог энергии (ядро)"] = settings["Верхний порог энергии (ядро)"] - 1
  242.     end
  243.  
  244.     i = 1
  245.     for k, v in pairs(settings) do
  246.         if defSettings[k] ~= nil then
  247.             SA[defSettings[k][4]] = k
  248.             i = i + 1
  249.         end
  250.     end
  251.     for k, v in pairs(settings) do
  252.         if defSettings[k] == nil then
  253.             SA[i] = k
  254.             i = i + 1
  255.         end
  256.     end
  257.     gState.SOS = i - 1
  258.     gState.BODS = i + 2
  259.    
  260.     i = 1
  261.     for k, v in pairs(drawableState) do
  262.         i = i + 1
  263.     end
  264.     gState.EODS = i
  265.    
  266.     if cell.lie == true then settings["Макс. энергия (%)(Батарея)"] = math.huge end
  267.    
  268. end
  269.  
  270. init()
  271.  
  272. while true do
  273.     drawStates()
  274.     updateData()
  275.     checkSettings()
  276.     reactor_ctrl()
  277.     bufTab = table.pack(event.pull(0.1, "key_down"))
  278.     if bufTab ~= nil then
  279.         CID(table.unpack(bufTab))
  280.     end
  281. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement