Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- if not term.isColor() then
- print("Advanced computer required")
- error()
- end
- print("loading...")
- monitor_textScale = 0.5
- Style = {
- CDefault = colors.black,
- BGDefault = colors.lightGray,
- CTitle = colors.orange,
- BGTitle = colors.black,
- CFooter = colors.white,
- BGFooter = colors.blue,
- CWarning = colors.white,
- BGWarning = colors.red,
- CSuccess = colors.white,
- BGSuccess = colors.lime,
- CDisabled = colors.gray,
- BGDisabled = colors.blue,
- CRadarmap = colors.gray,
- BGRadarmap = colors.green,
- CRadarborder = colors.white,
- BGRadarborder = colors.black,
- CRadarself = colors.white,
- BGRadarself = colors.lime,
- TextRadarself = "R",
- CRadarother = colors.black,
- BGRadarother = colors.red,
- TextRadarother = "#"
- }
- ----------- Monitor support
- function SetMonitorColorFrontBack(frontColor, backgroundColor)
- term.setBackgroundColor(backgroundColor)
- term.setTextColor(frontColor)
- if monitors ~= nil then
- for key,monitor in pairs(monitors) do
- monitor.setTextColor(frontColor)
- monitor.setBackgroundColor(backgroundColor)
- end
- end
- end
- function Write(text)
- term.write(text)
- if monitors ~= nil then
- for key,monitor in pairs(monitors) do
- if key ~= data.radar_monitorIndex then
- monitor.write(text)
- end
- end
- end
- end
- local function getCursorPos()
- local x, y = term.getCursorPos()
- return x, y
- end
- function SetCursorPos(x, y)
- term.setCursorPos(x, y)
- if monitors ~= nil then
- for key,monitor in pairs(monitors) do
- if key ~= data.radar_monitorIndex then
- monitor.setCursorPos(x, y)
- end
- end
- end
- end
- local function getResolution()
- local sizeX, sizeY = term.getSize()
- return sizeX, sizeY
- end
- function SetColorDefault()
- SetMonitorColorFrontBack(Style.CDefault, Style.BGDefault)
- end
- function SetColorTitle()
- SetMonitorColorFrontBack(Style.CTitle, Style.BGTitle)
- end
- function SetColorFooter()
- SetMonitorColorFrontBack(Style.CFooter, Style.BGFooter)
- end
- function SetColorWarning()
- SetMonitorColorFrontBack(Style.CWarning, Style.BGWarning)
- end
- function SetColorSuccess()
- SetMonitorColorFrontBack(Style.CSuccess, Style.BGSuccess)
- end
- function SetColorDisabled()
- SetMonitorColorFrontBack(Style.CDisabled, Style.BGDisabled)
- end
- function SetColorNormal()
- SetMonitorColorFrontBack(Style.CDefault, Style.BGDefault)
- end
- function SetColorRadarmap()
- SetMonitorColorFrontBack(Style.CRadarmap, Style.BGRadarmap)
- end
- function SetColorRadarborder()
- SetMonitorColorFrontBack(Style.CRadarborder, Style.BGRadarborder)
- end
- local function clear(colorFront, colorBack)
- clearWarningTick = -1
- if CDefault == nil or BGDefault == nil then
- SetMonitorColorFrontBack(Style.CDefault, Style.BGDefault)
- else
- SetMonitorColorFrontBack(Style.CDefault, Style.BGDefault)
- end
- term.clear()
- if monitors ~= nil then
- for key, monitor in pairs(monitors) do
- if key ~= data.radar_monitorIndex then
- monitor.clear()
- end
- end
- end
- SetCursorPos(1, 1)
- end
- local function clearLine()
- term.clearLine()
- if monitors ~= nil then
- for key, monitor in pairs(monitors) do
- if key ~= data.radar_monitorIndex then
- monitor.clearLine()
- end
- end
- end
- local x, y = getCursorPos()
- SetCursorPos(1, y)
- end
- function WriteLn(text)
- Write(text)
- local x, y = term.getCursorPos()
- local width, height = term.getSize()
- if y > height - 1 then
- y = 1
- end
- SetCursorPos(1, y + 1)
- end
- function WriteCentered(y, text)
- local unused
- if text == nil then
- text = y
- unused, y = getCursorPos()
- end
- SetCursorPos((51 - text:len()) / 2, y)
- term.write(text)
- if monitors ~= nil then
- for key,monitor in pairs(monitors) do
- if key ~= data.radar_monitorIndex then
- local sizeX, sizeY = monitor.getSize()
- if sizeX ~= nil then
- monitor.setCursorPos((sizeX - text:len()) / 2, y)
- monitor.write(text)
- end
- end
- end
- end
- local xt, yt = term.getCursorPos()
- SetCursorPos(1, y + 1)
- end
- local function page_begin(text)
- clear()
- SetColorTitle()
- SetCursorPos(1, 1)
- SetColorTitle()
- clearLine()
- WriteCentered(1, text)
- SetCursorPos(1, 2)
- SetColorNormal()
- end
- function ShowTitle(text)
- clear()
- SetCursorPos(0, 1)
- SetColorTitle()
- clearLine()
- WriteCentered(1, text)
- SetCursorPos(1, 2)
- SetColorDefault()
- end
- function ShowMenu(text)
- Write(text)
- local sizeX, sizeY = term.getSize()
- local xt, yt = term.getCursorPos()
- for i = xt, sizeX do
- Write(" ")
- end
- SetCursorPos(1, yt + 1)
- end
- local clearWarningTick = -1
- function ShowWarning(text)
- local sizeX, sizeY = term.getSize()
- SetCursorPos(1, sizeY)
- clearLine()
- SetColorWarning()
- SetCursorPos((sizeX - text:len() - 2) / 2, sizeY)
- Write(" " .. text .. " ")
- SetColorDefault()
- clearWarningTick = 5
- end
- function ClearWarning()
- if clearWarningTick > 0 then
- clearWarningTick = clearWarningTick - 1
- elseif clearWarningTick == 0 then
- SetColorDefault()
- local sizeX, sizeY = term.getSize()
- SetCursorPos(1, sizeY)
- clearLine()
- clearWarningTick = -1
- end
- end
- ----------- Formatting & popups
- function FormatFloat(value, nbchar)
- local str = "?"
- if value ~= nil then
- str = string.format("%g", value)
- end
- if nbchar ~= nil then
- str = string.sub(" " .. str, -nbchar)
- end
- return str
- end
- function FormatInteger(value, nbchar)
- local str = "?"
- if value ~= nil then
- str = string.format("%d", value)
- end
- if nbchar ~= nil then
- str = string.sub(" " .. str, -nbchar)
- end
- return str
- end
- function boolToYesNo(bool)
- if bool then
- return "YES"
- else
- return "no"
- end
- end
- function readInputNumber(currentValue)
- local inputAbort = false
- local input = string.format(currentValue)
- if input == "0" then
- input = ""
- end
- local x, y = term.getCursorPos()
- repeat
- ClearWarning()
- SetColorDefault()
- SetCursorPos(x, y)
- Write(input .. " ")
- input = string.sub(input, -9)
- local params = { os.pullEventRaw() }
- local eventName = params[1]
- local address = params[2]
- if address == nil then address = "none" end
- if eventName == "key" then
- local keycode = params[2]
- if keycode >= 2 and keycode <= 10 then -- 1 to 9
- input = input .. string.format(keycode - 1)
- elseif keycode == 11 or keycode == 82 then -- 0 & keypad 0
- input = input .. "0"
- elseif keycode >= 79 and keycode <= 81 then -- keypad 1 to 3
- input = input .. string.format(keycode - 78)
- elseif keycode >= 75 and keycode <= 77 then -- keypad 4 to 6
- input = input .. string.format(keycode - 71)
- elseif keycode >= 71 and keycode <= 73 then -- keypad 7 to 9
- input = input .. string.format(keycode - 64)
- elseif keycode == 14 then -- Backspace
- input = string.sub(input, 1, string.len(input) - 1)
- elseif keycode == 211 then -- Delete
- input = ""
- elseif keycode == 28 then -- Enter
- inputAbort = true
- elseif keycode == 74 or keycode == 12 or keycode == 49 then -- - on numeric keypad or - on US top or n letter
- if string.sub(input, 1, 1) == "-" then
- input = string.sub(input, 2)
- else
- input = "-" .. input
- end
- elseif char == 43 or keycode == 78 then -- +
- if string.sub(input, 1, 1) == "-" then
- input = string.sub(input, 2)
- end
- else
- ShowWarning("Key " .. keycode .. " is invalid")
- end
- elseif eventName == "terminate" then
- inputAbort = true
- elseif not common_event(eventName, params[2]) then
- ShowWarning("Event '" .. eventName .. "', " .. address .. " is unsupported")
- end
- until inputAbort
- SetCursorPos(1, y + 1)
- if input == "" or input == "-" then
- return currentValue
- else
- return tonumber(input)
- end
- end
- function readInput(currentValue)
- local inputAbort = false
- local input = string.format(currentValue)
- local x, y = term.getCursorPos()
- Write(input)
- os.pullEventRaw() -- skip first char event
- repeat
- ClearWarning()
- SetColorDefault()
- SetCursorPos(x, y)
- Write(input .. " ")
- input = string.sub(input, -123)
- local params = { os.pullEventRaw() }
- local eventName = params[1]
- local address = params[2]
- if address == nil then address = "none" end
- if eventName == "key" then
- local keycode = params[2]
- if keycode == 14 then -- Backspace
- input = string.sub(input, 1, string.len(input) - 1)
- elseif keycode == 211 then -- Delete
- input = ""
- elseif keycode == 28 then -- Enter
- inputAbort = true
- end
- elseif eventName == "char" then
- local char = params[2]
- if char >= ' ' and char <= '~' then -- 1 to 9
- input = input .. char
- end
- elseif eventName == "terminate" then
- inputAbort = true
- elseif eventName == "paste" then
- input = params[2]
- elseif not common_event(eventName, params[2]) then
- ShowWarning("Event '" .. eventName .. "', " .. address .. " is unsupported")
- end
- until inputAbort
- SetCursorPos(1, y + 1)
- if input == "" then
- return currentValue
- else
- return input
- end
- end
- function readInputText(currentValue)
- local inputAbort = false
- local input = string.format(currentValue)
- local x, y = term.getCursorPos()
- Write(input)
- os.pullEventRaw() -- skip first char event
- repeat
- ClearWarning()
- SetColorDefault()
- SetCursorPos(x, y)
- Write(input .. " ")
- input = string.sub(input, -30)
- local params = { os.pullEventRaw() }
- local eventName = params[1]
- local address = params[2]
- if address == nil then address = "none" end
- if eventName == "key" then
- local keycode = params[2]
- if keycode == 14 then -- Backspace
- input = string.sub(input, 1, string.len(input) - 1)
- elseif keycode == 211 then -- Delete
- input = ""
- elseif keycode == 28 then -- Enter
- inputAbort = true
- else
- ShowWarning("Key " .. keycode .. " is invalid")
- end
- elseif eventName == "char" then
- local char = params[2]
- if char >= ' ' and char <= '~' then -- 1 to 9
- input = input .. char
- else
- ShowWarning("Char #" .. string.byte(char) .. " is invalid")
- end
- elseif eventName == "terminate" then
- inputAbort = true
- elseif not common_event(eventName, params[2]) then
- ShowWarning("Event '" .. eventName .. "', " .. address .. " is unsupported")
- end
- until inputAbort
- SetCursorPos(1, y + 1)
- if input == "" then
- return currentValue
- else
- return input
- end
- end
- function readConfirmation(msg)
- if msg == nil then
- ShowWarning("Are you sure? (y/n)")
- else
- ShowWarning(msg)
- end
- repeat
- local params = { os.pullEventRaw() }
- local eventName = params[1]
- local address = params[2]
- if address == nil then address = "none" end
- if eventName == "key" then
- local keycode = params[2]
- if keycode == 21 then -- Y
- return true
- else
- return false
- end
- elseif eventName == "terminate" then
- return false
- elseif not common_event(eventName, params[2]) then
- ShowWarning("Event '" .. eventName .. "', " .. address .. " is unsupported")
- end
- until false
- end
- ----------- commons: menu, event handlers, etc.
- function common_event(eventName, param)
- if eventName == "redstone" then
- redstone_event(param)
- elseif eventName == "timer" then
- if param == radar_timerId then
- radar_timerEvent()
- end
- elseif eventName == "char" then
- elseif eventName == "key_up" then
- elseif eventName == "mouse_click" then
- elseif eventName == "mouse_up" then
- elseif eventName == "mouse_drag" then
- elseif eventName == "monitor_touch" then
- elseif eventName == "monitor_resize" then
- elseif eventName == "peripheral" then
- elseif eventName == "peripheral_detach" then
- else
- return false
- end
- return true
- end
- function menu_common()
- SetCursorPos(1, 18)
- SetColorFooter()
- ShowMenu(" 0 Home 1 Shields 2 Webhook ")
- SetColorDefault()
- end
- ----------- Redstone support
- local tblRedstoneState = {-- Remember redstone state on each side
- ["top"] = rs.getInput("top"),
- ["front"] = rs.getInput("front"),
- ["left"] = rs.getInput("left"),
- ["right"] = rs.getInput("right"),
- ["back"] = rs.getInput("back"),
- ["bottom"] = rs.getInput("bottom"),
- }
- local tblSides = {-- list all sides and offset coordinates
- ["top" ] = { 3, 1},
- ["front" ] = { 1, 3},
- ["left" ] = { 3, 3},
- ["right" ] = { 5, 3},
- ["back" ] = { 5, 5},
- ["bottom"] = { 3, 5},
- }
- function redstone_event()
- -- Event only returns nil so we need to check sides manually
- local message = ""
- for side, state in pairs(tblRedstoneState) do
- if rs.getInput(side) ~= state then
- -- print(side .. " is now " .. tostring(rs.getInput(side)))
- message = message .. side .. " "
- tblRedstoneState[side] = rs.getInput(side)
- end
- end
- if message ~= "" then
- message = "Redstone changed on " .. message
- showWarning(message)
- end
- end
- ----------- Shield support
- forcefieldprojector_currentKey = 1
- function shield_key(char, keycode)
- if char == 83 or char == 115 or keycode == 31 then -- S
- projector_start()
- return true
- elseif char == 80 or char == 112 or keycode == 25 then -- P
- projector_stop()
- return true
- end
- return false
- end
- function shield_page()
- SetCursorPos(0, 1)
- SetColorTitle()
- ShowTitle(label .. " - Shield Status")
- local forcefieldprojector = nil
- if forcefieldprojectors ~= nil then
- if forcefieldprojector_currentKey > #forcefieldprojectors then
- forcefieldprojector_currentKey = 1
- end
- forcefieldprojector = forcefieldprojectors[forcefieldprojector_currentKey]
- end
- SetCursorPos(1, 2)
- if #forcefieldprojectors == 0 then
- SetColorDisabled()
- Write("No Force Field Projectors detected...")
- elseif forcefieldprojector == nil or forcefieldprojector.isInterfaced() == nil then
- SetColorWarning()
- Write("Force Field Projector " .. forcefieldprojector_currentKey .. " of " .. #forcefieldprojectors .. " is invalid")
- else
- SetColorDefault()
- Write("Force Field Projector " .. forcefieldprojector_currentKey .. " of " .. #forcefieldprojectors)
- local isAssemblyValid = forcefieldprojector.getAssemblyStatus()
- local energyStored, energyMax, energyUnits = forcefieldprojector.getEnergyStatus()
- local isEnabled = forcefieldprojector.enable()
- local tier = forcefieldprojector.getTier()
- -- local upgrades = forcefieldprojector.getUpgrades()
- if tier == 1 then
- tier1 = "Basic"
- tierpower = 103427
- elseif tier == 2 then
- tier1 = "Advanced"
- tierpower = 35284
- else
- tier1 = "Superior"
- tierpower = 610141
- end
- if not isAssemblyValid then
- SetColorWarning()
- SetCursorPos(1, 3)
- Write("Invalid assembly!")
- SetColorDefault()
- SetCursorPos(1, 4)
- print("Projector is missing a upgrade or shape.")
- else
- SetCursorPos(1, 4)
- Write("Assembly is valid")
- if energyStored < tierpower then
- SetColorWarning()
- else
- SetColorDefault()
- end
- SetCursorPos(1, 6)
- Write("Energy level is " .. energyStored .. " " .. energyUnits)
- SetCursorPos(1, 7)
- Write("Tier is " .. tier1)
- SetCursorPos(1, 8)
- -- Write("Upgrades ")
- SetCursorPos(1, 9)
- -- Write(" "..(upgrades and 'true' or 'false'),0,1,2,3)
- SetCursorPos(1, 11)
- if isEnabled then
- if energyStored <= 500 then
- SetColorWarning()
- else
- SetColorSuccess()
- end
- Write("Projector is enabled")
- else
- SetColorWarning()
- Write("Projector is disabled")
- end
- end
- end
- os.sleep(0.1)
- forcefieldprojector_currentKey = forcefieldprojector_currentKey + 1
- SetColorDefault()
- SetCursorPos(1, 12)
- SetCursorPos(1, 13)
- SetColorFooter()
- SetCursorPos(1, 16)
- ShowMenu(" s(T)art Projector - st(O)p Projector ")
- ShowMenu(" (S)tart All Projectors - sto(P) All Projectors ")
- SetColorDefault()
- end
- function projector_start()
- for key,forcefieldprojector in pairs(forcefieldprojectors) do
- forcefieldprojector.enable(false)
- forcefieldprojector.enable(true)
- end
- end
- function projector_stop()
- for key,forcefieldprojector in pairs(forcefieldprojectors) do
- forcefieldprojector.enable(false)
- end
- end
- ----------- Configuration
- function data_save()
- local file = fs.open(".shield", "w")
- if file ~= nil then
- file.writeLine(textutils.serialize(data))
- file.close()
- else
- ShowWarning("No file system")
- os.sleep(3)
- end
- end
- function data_read()
- data = { }
- if fs.exists(".shield") then
- local file = fs.open(".shield", "r")
- data = textutils.unserialize(file.readAll())
- file.close()
- if data == nil then data = {}; end
- end
- if data.shield_hook == nil then data.auto_hook = 0; end
- end
- function data_setName()
- if ship ~= nil then
- ShowTitle("<==== Set Shield name ====>")
- else
- ShowTitle("<==== Set name ====>")
- end
- SetCursorPos(1, 2)
- Write("Enter ship name: ")
- label = readInputText(label)
- os.setComputerLabel(label)
- if ship ~= nil then
- ship.coreFrequency(label)
- end
- os.reboot()
- end
- function string_split(source, sep)
- local sep = sep or ":"
- local fields = {}
- local pattern = string.format("([^%s]+)", sep)
- source:gsub(pattern, function(c) fields[#fields + 1] = c end)
- return fields
- end
- function hooks_page_config()
- ShowTitle(label .. " - Webhook configuration")
- SetCursorPos(1, 2)
- SetColorDefault()
- SetCursorPos(1, 3)
- Write("Ship Shield Webhook: ")
- hook_shieldset(readInput(data.shield_hook))
- data_save()
- end
- function hook_shieldset(newShield)
- data.shield_hook = newShield
- end
- ----------- Boot sequence
- math.randomseed(os.time())
- label = os.getComputerLabel()
- if not label then
- label = "" .. os.getComputerID()
- end
- -- read configuration
- data_read()
- clear()
- print("data_read...")
- -- initial scanning
- monitors = {}
- ShowTitle(label .. " - Connecting...")
- WriteLn("")
- sides = peripheral.getNames()
- forcefieldprojectors = {}
- warpdrivetransportercores = {}
- for key,side in pairs(sides) do
- os.sleep(0)
- Write("Checking " .. side .. " ")
- local componentType = peripheral.getType(side)
- Write(componentType .. " ")
- if componentType == "warpdriveForceFieldProjector" then
- Write("wrapping!")
- table.insert(forcefieldprojectors, peripheral.wrap(side))
- elseif componentType == "monitor" then
- Write("wrapping!")
- lmonitor = peripheral.wrap(side)
- table.insert(monitors, lmonitor)
- lmonitor.setTextScale(monitor_textScale)
- end
- WriteLn("")
- end
- if not os.getComputerLabel() and (ship ~= nil or reactor ~= nil) then
- data_setName()
- end
- -- peripherals status
- function connections_page()
- SetCursorPos(0, 1)
- SetColorTitle()
- ShowTitle(label .. " - Connections")
- WriteLn("")
- if #monitors == 0 then
- SetColorWarning()
- WriteLn("No Monitor detected")
- elseif #monitors == 1 then
- SetColorSuccess()
- WriteLn("1 monitor detected")
- else
- SetColorSuccess()
- WriteLn(#monitors .. " Monitors detected")
- end
- if #forcefieldprojectors == 0 then
- SetColorWarning()
- WriteLn("No Force Field Pojectors detected")
- elseif #forcefieldprojectors == 1 then
- SetColorSuccess()
- WriteLn(#"1 Force Field Projector detected")
- else
- SetColorSuccess()
- WriteLn(#forcefieldprojectors .. " Force Field Projectors detected")
- end
- WriteLn("")
- SetColorDefault()
- WriteLn("Please refer to below menu for keyboard controls")
- WriteLn("For example, press 1 to access Ship page")
- end
- -- peripheral boot up
- clear()
- connections_page()
- SetColorDefault()
- WriteLn("")
- os.sleep(2)
- -- main loop
- abort = false
- refresh = true
- page = shield_page
- keyHandler = shield_key
- repeat
- ClearWarning()
- if refresh then
- clear()
- page()
- menu_common()
- refresh = false
- end
- params = { os.pullEventRaw() }
- eventName = params[1]
- address = params[2]
- if address == nil then address = "none" end
- -- WriteLn("...")
- -- WriteLn("Event '" .. eventName .. "', " .. address .. ", " .. params[3] .. ", " .. params[4] .. " received")
- -- os.sleep(0.2)
- if eventName == "key" then
- keycode = params[2]
- if char == 88 or char == 120 or keycode == 45 then -- x for eXit
- os.pullEventRaw()
- abort = true
- elseif char == 48 or keycode == 11 or keycode == 82 then -- 0
- page = connections_page
- keyHandler = nil
- refresh = true
- elseif char == 49 or keycode == 2 or keycode == 79 then -- 1
- page = shield_page
- keyHandler = shield_key
- refresh = true
- elseif char == 50 or keycode == 3 or keycode == 80 then -- 2
- page = hooks_page_config
- keyHandler = hooks_page_key
- refresh = true
- elseif keyHandler ~= nil and keyHandler(char, keycode) then
- refresh = true
- os.sleep(0)
- elseif char == 0 then -- control chars
- refresh = false
- os.sleep(0)
- else
- ShowWarning("Key " .. keycode .. " is invalid")
- os.sleep(0.2)
- end
- elseif eventName == "reactorPulse" then
- reactor_pulse(params[2])
- refresh = (page == reactor_page)
- elseif eventName == "terminate" then
- abort = true
- elseif not common_event(eventName, params[2]) then
- ShowWarning("Event '" .. eventName .. "', " .. address .. " is unsupported")
- refresh = true
- os.sleep(0.2)
- end
- until abort
- -- exiting
- if data.core_summon then
- data.core_summon = false
- data_save()
- end
- if ship ~= nil then
- ship.enable()
- end
- -- clear screens on exit
- SetMonitorColorFrontBack(colors.white, colors.black)
- term.clear()
- if monitors ~= nil then
- for key,monitor in pairs(monitors) do
- monitor.clear()
- end
- end
- SetCursorPos(1, 1)
- WriteLn("Program terminated")
- WriteLn("Type startup to restart it")
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement