Advertisement
infiniteblock

Untitled

Nov 15th, 2019
289
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 39.79 KB | None | 0 0
  1. if not term.isColor() then
  2. print("Advanced computer required")
  3. error()
  4. end
  5. print("loading...")
  6.  
  7. monitor_textScale = 0.5
  8.  
  9. Style = {
  10. CDefault = colors.black,
  11. BGDefault = colors.lightGray,
  12.  
  13. CTitle = colors.orange,
  14. BGTitle = colors.black,
  15.  
  16. CFooter = colors.white,
  17. BGFooter = colors.blue,
  18.  
  19. CWarning = colors.white,
  20. BGWarning = colors.red,
  21.  
  22. CSuccess = colors.white,
  23. BGSuccess = colors.lime,
  24.  
  25. CDisabled = colors.gray,
  26. BGDisabled = colors.blue,
  27.  
  28. CRadarmap = colors.gray,
  29. BGRadarmap = colors.green,
  30.  
  31. CRadarborder = colors.white,
  32. BGRadarborder = colors.black,
  33.  
  34. CRadarself = colors.white,
  35. BGRadarself = colors.lime,
  36. TextRadarself = "R",
  37.  
  38. CRadarother = colors.black,
  39. BGRadarother = colors.red,
  40. TextRadarother = "#"
  41. }
  42.  
  43. ----------- Monitor support
  44.  
  45. function SetMonitorColorFrontBack(frontColor, backgroundColor)
  46. term.setBackgroundColor(backgroundColor)
  47. term.setTextColor(frontColor)
  48. if monitors ~= nil then
  49. for key,monitor in pairs(monitors) do
  50. monitor.setTextColor(frontColor)
  51. monitor.setBackgroundColor(backgroundColor)
  52. end
  53. end
  54. end
  55.  
  56. function Write(text)
  57. term.write(text)
  58. if monitors ~= nil then
  59. for key,monitor in pairs(monitors) do
  60. if key ~= data.radar_monitorIndex then
  61. monitor.write(text)
  62. end
  63. end
  64. end
  65. end
  66. local function getCursorPos()
  67. local x, y = term.getCursorPos()
  68. return x, y
  69. end
  70.  
  71. function SetCursorPos(x, y)
  72. term.setCursorPos(x, y)
  73. if monitors ~= nil then
  74. for key,monitor in pairs(monitors) do
  75. if key ~= data.radar_monitorIndex then
  76. monitor.setCursorPos(x, y)
  77. end
  78. end
  79. end
  80. end
  81.  
  82. local function getResolution()
  83. local sizeX, sizeY = term.getSize()
  84. return sizeX, sizeY
  85. end
  86.  
  87. function SetColorDefault()
  88. SetMonitorColorFrontBack(Style.CDefault, Style.BGDefault)
  89. end
  90.  
  91. function SetColorTitle()
  92. SetMonitorColorFrontBack(Style.CTitle, Style.BGTitle)
  93. end
  94.  
  95. function SetColorFooter()
  96. SetMonitorColorFrontBack(Style.CFooter, Style.BGFooter)
  97. end
  98.  
  99. function SetColorWarning()
  100. SetMonitorColorFrontBack(Style.CWarning, Style.BGWarning)
  101. end
  102.  
  103. function SetColorSuccess()
  104. SetMonitorColorFrontBack(Style.CSuccess, Style.BGSuccess)
  105. end
  106.  
  107. function SetColorDisabled()
  108. SetMonitorColorFrontBack(Style.CDisabled, Style.BGDisabled)
  109. end
  110.  
  111. function SetColorNormal()
  112. SetMonitorColorFrontBack(Style.CDefault, Style.BGDefault)
  113. end
  114.  
  115. function SetColorRadarmap()
  116. SetMonitorColorFrontBack(Style.CRadarmap, Style.BGRadarmap)
  117. end
  118.  
  119. function SetColorRadarborder()
  120. SetMonitorColorFrontBack(Style.CRadarborder, Style.BGRadarborder)
  121. end
  122.  
  123. local function clear(colorFront, colorBack)
  124. clearWarningTick = -1
  125. if CDefault == nil or BGDefault == nil then
  126. SetMonitorColorFrontBack(Style.CDefault, Style.BGDefault)
  127. else
  128. SetMonitorColorFrontBack(Style.CDefault, Style.BGDefault)
  129. end
  130. term.clear()
  131. if monitors ~= nil then
  132. for key, monitor in pairs(monitors) do
  133. if key ~= data.radar_monitorIndex then
  134. monitor.clear()
  135. end
  136. end
  137. end
  138. SetCursorPos(1, 1)
  139. end
  140.  
  141. local function clearLine()
  142. term.clearLine()
  143. if monitors ~= nil then
  144. for key, monitor in pairs(monitors) do
  145. if key ~= data.radar_monitorIndex then
  146. monitor.clearLine()
  147. end
  148. end
  149. end
  150. local x, y = getCursorPos()
  151. SetCursorPos(1, y)
  152. end
  153.  
  154. function WriteLn(text)
  155. Write(text)
  156. local x, y = term.getCursorPos()
  157. local width, height = term.getSize()
  158. if y > height - 1 then
  159. y = 1
  160. end
  161. SetCursorPos(1, y + 1)
  162. end
  163.  
  164. function WriteCentered(y, text)
  165. local unused
  166. if text == nil then
  167. text = y
  168. unused, y = getCursorPos()
  169. end
  170.  
  171. SetCursorPos((51 - text:len()) / 2, y)
  172. term.write(text)
  173. if monitors ~= nil then
  174. for key,monitor in pairs(monitors) do
  175. if key ~= data.radar_monitorIndex then
  176. local sizeX, sizeY = monitor.getSize()
  177. if sizeX ~= nil then
  178. monitor.setCursorPos((sizeX - text:len()) / 2, y)
  179. monitor.write(text)
  180. end
  181. end
  182. end
  183. end
  184. local xt, yt = term.getCursorPos()
  185. SetCursorPos(1, y + 1)
  186. end
  187. local function page_begin(text)
  188. clear()
  189. SetColorTitle()
  190. SetCursorPos(1, 1)
  191. SetColorTitle()
  192. clearLine()
  193. WriteCentered(1, text)
  194. SetCursorPos(1, 2)
  195. SetColorNormal()
  196. end
  197. function ShowTitle(text)
  198. clear()
  199. SetCursorPos(0, 1)
  200. SetColorTitle()
  201. clearLine()
  202. WriteCentered(1, text)
  203. SetCursorPos(1, 2)
  204. SetColorDefault()
  205. end
  206.  
  207. function ShowMenu(text)
  208. Write(text)
  209. local sizeX, sizeY = term.getSize()
  210. local xt, yt = term.getCursorPos()
  211. for i = xt, sizeX do
  212. Write(" ")
  213. end
  214. SetCursorPos(1, yt + 1)
  215. end
  216.  
  217. local clearWarningTick = -1
  218. function ShowWarning(text)
  219. local sizeX, sizeY = term.getSize()
  220. SetCursorPos(1, sizeY)
  221. clearLine()
  222. SetColorWarning()
  223. SetCursorPos((sizeX - text:len() - 2) / 2, sizeY)
  224. Write(" " .. text .. " ")
  225. SetColorDefault()
  226. clearWarningTick = 5
  227. -- clearLine()
  228. end
  229. function ClearWarning()
  230. if clearWarningTick > 0 then
  231. clearWarningTick = clearWarningTick - 1
  232. elseif clearWarningTick == 0 then
  233. SetColorDefault()
  234. local sizeX, sizeY = term.getSize()
  235. SetCursorPos(1, sizeY)
  236. clearLine()
  237. clearWarningTick = -1
  238. end
  239. end
  240.  
  241. ----------- Formatting & popups
  242.  
  243. function FormatFloat(value, nbchar)
  244. local str = "?"
  245. if value ~= nil then
  246. str = string.format("%g", value)
  247. end
  248. if nbchar ~= nil then
  249. str = string.sub(" " .. str, -nbchar)
  250. end
  251. return str
  252. end
  253. function FormatInteger(value, nbchar)
  254. local str = "?"
  255. if value ~= nil then
  256. str = string.format("%d", value)
  257. end
  258. if nbchar ~= nil then
  259. str = string.sub(" " .. str, -nbchar)
  260. end
  261. return str
  262. end
  263.  
  264. function boolToYesNo(bool)
  265. if bool then
  266. return "YES"
  267. else
  268. return "no"
  269. end
  270. end
  271.  
  272. function readInputNumber(currentValue)
  273. local inputAbort = false
  274. local input = string.format(currentValue)
  275. if input == "0" then
  276. input = ""
  277. end
  278. local x, y = term.getCursorPos()
  279. repeat
  280. ClearWarning()
  281. SetColorDefault()
  282. SetCursorPos(x, y)
  283. Write(input .. " ")
  284. input = string.sub(input, -9)
  285.  
  286. local params = { os.pullEventRaw() }
  287. local eventName = params[1]
  288. local address = params[2]
  289. if address == nil then address = "none" end
  290. if eventName == "key" then
  291. local keycode = params[2]
  292. if keycode >= 2 and keycode <= 10 then -- 1 to 9
  293. input = input .. string.format(keycode - 1)
  294. elseif keycode == 11 or keycode == 82 then -- 0 & keypad 0
  295. input = input .. "0"
  296. elseif keycode >= 79 and keycode <= 81 then -- keypad 1 to 3
  297. input = input .. string.format(keycode - 78)
  298. elseif keycode >= 75 and keycode <= 77 then -- keypad 4 to 6
  299. input = input .. string.format(keycode - 71)
  300. elseif keycode >= 71 and keycode <= 73 then -- keypad 7 to 9
  301. input = input .. string.format(keycode - 64)
  302. elseif keycode == 14 then -- Backspace
  303. input = string.sub(input, 1, string.len(input) - 1)
  304. elseif keycode == 211 then -- Delete
  305. input = ""
  306. elseif keycode == 28 then -- Enter
  307. inputAbort = true
  308. elseif keycode == 74 or keycode == 12 or keycode == 49 then -- - on numeric keypad or - on US top or n letter
  309. if string.sub(input, 1, 1) == "-" then
  310. input = string.sub(input, 2)
  311. else
  312. input = "-" .. input
  313. end
  314. elseif char == 43 or keycode == 78 then -- +
  315. if string.sub(input, 1, 1) == "-" then
  316. input = string.sub(input, 2)
  317. end
  318. else
  319. ShowWarning("Key " .. keycode .. " is invalid")
  320. end
  321. elseif eventName == "terminate" then
  322. inputAbort = true
  323. elseif not common_event(eventName, params[2]) then
  324. ShowWarning("Event '" .. eventName .. "', " .. address .. " is unsupported")
  325. end
  326. until inputAbort
  327. SetCursorPos(1, y + 1)
  328. if input == "" or input == "-" then
  329. return currentValue
  330. else
  331. return tonumber(input)
  332. end
  333. end
  334. function readInput(currentValue)
  335. local inputAbort = false
  336. local input = string.format(currentValue)
  337. local x, y = term.getCursorPos()
  338. Write(input)
  339. os.pullEventRaw() -- skip first char event
  340. repeat
  341. ClearWarning()
  342. SetColorDefault()
  343. SetCursorPos(x, y)
  344. Write(input .. " ")
  345. input = string.sub(input, -123)
  346.  
  347. local params = { os.pullEventRaw() }
  348. local eventName = params[1]
  349. local address = params[2]
  350. if address == nil then address = "none" end
  351. if eventName == "key" then
  352. local keycode = params[2]
  353. if keycode == 14 then -- Backspace
  354. input = string.sub(input, 1, string.len(input) - 1)
  355. elseif keycode == 211 then -- Delete
  356. input = ""
  357. elseif keycode == 28 then -- Enter
  358. inputAbort = true
  359. end
  360. elseif eventName == "char" then
  361. local char = params[2]
  362. if char >= ' ' and char <= '~' then -- 1 to 9
  363. input = input .. char
  364. end
  365. elseif eventName == "terminate" then
  366. inputAbort = true
  367. elseif eventName == "paste" then
  368. input = params[2]
  369. elseif not common_event(eventName, params[2]) then
  370. ShowWarning("Event '" .. eventName .. "', " .. address .. " is unsupported")
  371. end
  372. until inputAbort
  373. SetCursorPos(1, y + 1)
  374. if input == "" then
  375. return currentValue
  376. else
  377. return input
  378. end
  379. end
  380. function readInputText(currentValue)
  381. local inputAbort = false
  382. local input = string.format(currentValue)
  383. local x, y = term.getCursorPos()
  384. Write(input)
  385. os.pullEventRaw() -- skip first char event
  386. repeat
  387. ClearWarning()
  388. SetColorDefault()
  389. SetCursorPos(x, y)
  390. Write(input .. " ")
  391. input = string.sub(input, -30)
  392.  
  393. local params = { os.pullEventRaw() }
  394. local eventName = params[1]
  395. local address = params[2]
  396. if address == nil then address = "none" end
  397. if eventName == "key" then
  398. local keycode = params[2]
  399. if keycode == 14 then -- Backspace
  400. input = string.sub(input, 1, string.len(input) - 1)
  401. elseif keycode == 211 then -- Delete
  402. input = ""
  403. elseif keycode == 28 then -- Enter
  404. inputAbort = true
  405. else
  406. ShowWarning("Key " .. keycode .. " is invalid")
  407. end
  408. elseif eventName == "char" then
  409. local char = params[2]
  410. if char >= ' ' and char <= '~' then -- 1 to 9
  411. input = input .. char
  412. else
  413. ShowWarning("Char #" .. string.byte(char) .. " is invalid")
  414. end
  415. elseif eventName == "terminate" then
  416. inputAbort = true
  417. elseif not common_event(eventName, params[2]) then
  418. ShowWarning("Event '" .. eventName .. "', " .. address .. " is unsupported")
  419. end
  420. until inputAbort
  421. SetCursorPos(1, y + 1)
  422. if input == "" then
  423. return currentValue
  424. else
  425. return input
  426. end
  427. end
  428.  
  429. function readConfirmation(msg)
  430. if msg == nil then
  431. ShowWarning("Are you sure? (y/n)")
  432. else
  433. ShowWarning(msg)
  434. end
  435. repeat
  436. local params = { os.pullEventRaw() }
  437. local eventName = params[1]
  438. local address = params[2]
  439. if address == nil then address = "none" end
  440. if eventName == "key" then
  441. local keycode = params[2]
  442. if keycode == 21 then -- Y
  443. return true
  444. else
  445. return false
  446. end
  447. elseif eventName == "terminate" then
  448. return false
  449. elseif not common_event(eventName, params[2]) then
  450. ShowWarning("Event '" .. eventName .. "', " .. address .. " is unsupported")
  451. end
  452. until false
  453. end
  454.  
  455. ----------- commons: menu, event handlers, etc.
  456.  
  457. function common_event(eventName, param)
  458. if eventName == "redstone" then
  459. redstone_event(param)
  460. elseif eventName == "timer" then
  461. if param == radar_timerId then
  462. radar_timerEvent()
  463. end
  464. elseif eventName == "shipCoreCooldownDone" then
  465. ShowWarning("Ship core cooldown done")
  466. elseif eventName == "reactorPulse" then
  467. reactor_pulse(param)
  468. -- elseif eventName == "reactorDeactivation" then
  469. -- ShowWarning("Reactor deactivated")
  470. -- elseif eventName == "reactorActivation" then
  471. -- ShowWarning("Reactor activated")
  472. elseif eventName == "char" then
  473. elseif eventName == "key_up" then
  474. elseif eventName == "mouse_click" then
  475. elseif eventName == "mouse_up" then
  476. elseif eventName == "mouse_drag" then
  477. elseif eventName == "monitor_touch" then
  478. elseif eventName == "monitor_resize" then
  479. elseif eventName == "peripheral" then
  480. elseif eventName == "peripheral_detach" then
  481. else
  482. return false
  483. end
  484. return true
  485. end
  486.  
  487. function menu_common()
  488. SetCursorPos(1, 17)
  489. SetColorFooter()
  490. ShowMenu("0 Home 1 Ship 2 Cloak 3 Shield 4 Radar 5 Mining ")
  491. ShowMenu("6 Transport 7 Reactor 8 Hooks X eXit ")
  492. SetColorDefault()
  493. end
  494.  
  495. ----------- Redstone support
  496.  
  497. local tblRedstoneState = {-- Remember redstone state on each side
  498. ["top"] = rs.getInput("top"),
  499. ["front"] = rs.getInput("front"),
  500. ["left"] = rs.getInput("left"),
  501. ["right"] = rs.getInput("right"),
  502. ["back"] = rs.getInput("back"),
  503. ["bottom"] = rs.getInput("bottom"),
  504. }
  505. local tblSides = {-- list all sides and offset coordinates
  506. ["top" ] = { 3, 1},
  507. ["front" ] = { 1, 3},
  508. ["left" ] = { 3, 3},
  509. ["right" ] = { 5, 3},
  510. ["back" ] = { 5, 5},
  511. ["bottom"] = { 3, 5},
  512. }
  513.  
  514. function redstone_event()
  515. -- Event only returns nil so we need to check sides manually
  516. local message = ""
  517. for side, state in pairs(tblRedstoneState) do
  518. if rs.getInput(side) ~= state then
  519. -- print(side .. " is now " .. tostring(rs.getInput(side)))
  520. message = message .. side .. " "
  521. tblRedstoneState[side] = rs.getInput(side)
  522. end
  523. end
  524. if message ~= "" then
  525. message = "Redstone changed on " .. message
  526. showWarning(message)
  527. end
  528. end
  529.  
  530. ----------- Configuration
  531.  
  532. function data_save()
  533. local file = fs.open("shipdata.txt", "w")
  534. if file ~= nil then
  535. file.writeLine(textutils.serialize(data))
  536. file.close()
  537. else
  538. ShowWarning("No file system")
  539. os.sleep(3)
  540. end
  541. end
  542.  
  543. function data_read()
  544. data = { }
  545. if fs.exists("shipdata.txt") then
  546. local file = fs.open("shipdata.txt", "r")
  547. data = textutils.unserialize(file.readAll())
  548. file.close()
  549. if data == nil then data = {}; end
  550. end
  551. if data.core_summon == nil then data.core_summon = false; end
  552. if data.reactor_mode == nil then data.reactor_mode = 0; end
  553. if data.reactor_rate == nil then data.reactor_rate = 100; end
  554. if data.reactor_targetStability == nil then data.reactor_targetStability = 50; end
  555. if data.reactor_laserAmount == nil then data.reactor_laserAmount = 10000; end
  556. if data.radar_monitorIndex == nil then data.radar_monitorIndex = 0; end
  557. if data.radar_radius == nil then data.radar_radius = 500; end
  558. if data.radar_autoscan == nil then data.radar_autoscan = false; end
  559. if data.radar_autoscanDelay == nil then data.radar_autoscanDelay = 3; end
  560. if data.radar_results == nil then data.radar_results = {}; end
  561. if data.radar_scale == nil then data.radar_scale = 500; end
  562. if data.radar_offsetX == nil then data.radar_offsetX = 0; end
  563. if data.radar_offsetY == nil then data.radar_offsetY = 0; end
  564. if data.gps_hook == nil then data.gps_hook = 0; end
  565. if data.radar_hook == nil then data.radar_hook = 0; end
  566. if data.auto_hook == nil then data.auto_hook = 0; end
  567. end
  568.  
  569. function data_setName()
  570. if ship ~= nil then
  571. ShowTitle("<==== Set ship name ====>")
  572. else
  573. ShowTitle("<==== Set name ====>")
  574. end
  575.  
  576. SetCursorPos(1, 2)
  577. Write("Enter ship name: ")
  578. label = readInputText(label)
  579. os.setComputerLabel(label)
  580. if ship ~= nil then
  581. ship.coreFrequency(label)
  582. end
  583. os.reboot()
  584. end
  585.  
  586. function string_split(source, sep)
  587. local sep = sep or ":"
  588. local fields = {}
  589. local pattern = string.format("([^%s]+)", sep)
  590. source:gsub(pattern, function(c) fields[#fields + 1] = c end)
  591. return fields
  592. end
  593.  
  594. ----------- Radar support
  595.  
  596. radar_listOffset = 0
  597. radar_timerId = -1
  598. radar_timerLength = 1
  599. radar_x = 0
  600. radar_y = 0
  601. radar_z = 0
  602.  
  603. function radar_boot()
  604. if radar ~= nil then
  605. WriteLn("Booting Radar...")
  606. if data.radar_monitorIndex > 0 then
  607. local _, _, radar_x, radar_y, radar_z = radar.getGlobalPosition()
  608. radar_drawMap()
  609. end
  610. if data.radar_autoscan then
  611. scanAndDraw()
  612. end
  613. end
  614. end
  615.  
  616. function radar_key(char, keycode)
  617. if char == 83 or char == 115 or keycode == 31 then -- S
  618. data.radar_autoscan = false
  619. scanAndDraw()
  620. return true
  621. elseif keycode == 30 then -- A
  622. data.radar_autoscan = true
  623. scanAndDraw()
  624. return true
  625. elseif char == 80 or char == 112 or keycode == 25 then -- P
  626. data.radar_autoscan = false
  627. return true
  628. elseif keycode == 49 then -- N
  629. radar_setMonitorIndex(data.radar_monitorIndex + 1)
  630. data_save()
  631. radar_drawMap()
  632. return true
  633. elseif char == 71 or char == 103 or keycode == 34 then -- G
  634. radar_setRadius(data.radar_radius - 100)
  635. data_save()
  636. return true
  637. elseif char == 84 or char == 116 or keycode == 20 then -- T
  638. if data.radar_radius < 100 then
  639. radar_setRadius(100)
  640. else
  641. radar_setRadius(data.radar_radius + 100)
  642. end
  643. data_save()
  644. return true
  645. elseif keycode == 36 then -- J
  646. radar_listOffset = math.max(0, radar_listOffset - 3)
  647. return true
  648. elseif keycode == 22 then -- U
  649. radar_listOffset = math.min(#data.radar_results - 1, radar_listOffset + 3)
  650. return true
  651. elseif char == 45 or keycode == 74 then -- -
  652. data.radar_scale = math.min(10000, math.floor(data.radar_scale * 1.2 + 0.5))
  653. data_save()
  654. radar_drawMap()
  655. return true
  656. elseif char == 43 or keycode == 78 then -- +
  657. data.radar_scale = math.max(20, math.floor(data.radar_scale * 0.8 + 0.5))
  658. data_save()
  659. radar_drawMap()
  660. return true
  661. elseif keycode == 199 then -- home
  662. data.radar_offsetX = 0
  663. data.radar_offsetY = 0
  664. data.radar_scale = 20
  665. for i = 0, #data.radar_results - 1 do
  666. data.radar_scale = math.max(data.radar_scale, math.max(math.abs(radar_x - data.radar_results[i].x), math.abs(radar_z - data.radar_results[i].z)))
  667. end
  668. data.radar_scale = math.min(10000, math.floor(data.radar_scale * 1.1 + 0.5))
  669. data_save()
  670. radar_drawMap()
  671. return true
  672. elseif keycode == 203 then -- left
  673. data.radar_offsetX = data.radar_offsetX - 0.20 * data.radar_scale
  674. data_save()
  675. radar_drawMap()
  676. return true
  677. elseif keycode == 205 then -- right
  678. data.radar_offsetX = data.radar_offsetX + 0.20 * data.radar_scale
  679. data_save()
  680. radar_drawMap()
  681. return true
  682. elseif keycode == 200 then -- up
  683. data.radar_offsetY = data.radar_offsetY - 0.20 * data.radar_scale
  684. data_save()
  685. radar_drawMap()
  686. return true
  687. elseif keycode == 208 then -- down
  688. data.radar_offsetY = data.radar_offsetY + 0.20 * data.radar_scale
  689. data_save()
  690. radar_drawMap()
  691. return true
  692. elseif keycode == 46 then -- C
  693. radar_page_config()
  694. data_save()
  695. return true
  696. end
  697. return false
  698. end
  699.  
  700. function radar_page()
  701. local radar_resultsPerPage = 9
  702.  
  703. ShowTitle(label .. " - Radar map")
  704.  
  705. SetCursorPos(1, 2)
  706. if radar == nil or radar.isInterfaced() == nil then
  707. SetColorDisabled()
  708. Write("Radar not detected")
  709. else
  710. SetColorDefault()
  711. if #data.radar_results == 0 then
  712. Write("No contacts in range...")
  713. else
  714. local lastResultShown = radar_listOffset + radar_resultsPerPage - 1
  715. if lastResultShown >= #data.radar_results then
  716. lastResultShown = #data.radar_results - 1
  717. end
  718. Write("Displaying results " .. (radar_listOffset + 1) .. " to " .. (lastResultShown + 1) .. " of " .. #data.radar_results)
  719. for i = radar_listOffset, lastResultShown do
  720. SetCursorPos(4, 3 + i - radar_listOffset)
  721. if data.radar_results ~= nil then
  722. Write(FormatInteger(data.radar_results[i].x, 7) .. ", " .. FormatInteger(data.radar_results[i].y, 4) .. ", " .. FormatInteger(data.radar_results[i].z, 7))
  723. else
  724. Write("~nil~")
  725. end
  726. end
  727. end
  728.  
  729. SetColorDefault()
  730. local energyStored, energyMax, energyUnits = radar.getEnergyStatus()
  731. local success, result = radar.getEnergyRequired(data.radar_radius)
  732. local energyRequired = 0
  733. if success then
  734. energyRequired = result
  735. end
  736. SetCursorPos(1, 12)
  737. Write("Energy: ")
  738. if energyStored > energyRequired then
  739. SetColorSuccess()
  740. else
  741. SetColorWarning()
  742. end
  743. Write(FormatInteger(energyStored, 10) .. " " .. energyUnits)
  744. SetColorDefault()
  745. SetCursorPos(1, 13)
  746. Write("Radius: " .. data.radar_radius)
  747.  
  748. SetCursorPos(30, 13)
  749. Write("Monitor# " .. data.radar_monitorIndex .. "/" .. #monitors)
  750.  
  751. SetCursorPos(1, 14)
  752. Write("Autoscan: ")
  753. if data.radar_autoscan then SetColorSuccess() else SetColorDefault() end
  754. Write(boolToYesNo(data.radar_autoscan))
  755.  
  756. SetColorDefault()
  757. SetCursorPos(30, 14)
  758. Write("Delay " .. data.radar_autoscanDelay .. "s")
  759. end
  760.  
  761. SetColorFooter()
  762. SetCursorPos(1, 15)
  763. ShowMenu(" S - Scan once, A - Autoscan, P - Stop autoscan")
  764. SetCursorPos(1, 16)
  765. ShowMenu(" T/G - Scan radius, U/J - Scroll list")
  766. SetCursorPos(1, 17)
  767. ShowMenu(" +/- - Scale, N - Next monitor, C - Configuration")
  768. end
  769.  
  770. function radar_page_config()
  771. ShowTitle(label .. " - Radar configuration")
  772.  
  773. SetCursorPos(1, 2)
  774. if radar == nil or radar.isInterfaced() == nil then
  775. SetColorDisabled()
  776. Write("No radar detected")
  777. else
  778. SetColorDefault()
  779. SetCursorPos(1, 3)
  780. Write("Radar scan radius (" .. data.radar_radius .. " blocks): ")
  781. radar_setRadius(readInputNumber(data.radar_radius))
  782.  
  783. SetCursorPos(1, 5)
  784. Write("Autoscan delay in seconds (" .. data.radar_autoscanDelay .. "): ")
  785. radar_setAutoscanDelay(readInputNumber(data.radar_autoscanDelay))
  786.  
  787. SetCursorPos(1, 7)
  788. Write("Output monitor (" .. data.radar_monitorIndex .. "/" .. #monitors .. "): ")
  789. radar_setMonitorIndex(readInputNumber(data.radar_monitorIndex))
  790.  
  791. data_save()
  792. end
  793. end
  794. function hooks_page_config()
  795. ShowTitle(label .. " - Webhook configuration")
  796.  
  797. SetCursorPos(1, 2)
  798. SetColorDefault()
  799. SetCursorPos(1, 3)
  800. Write("Ship GPS Webhook: ")
  801. hook_gpsset(readInput(data.gps_hook))
  802.  
  803. SetCursorPos(1, 5)
  804. Write("Radar Results Webhook: ")
  805. hook_radset(readInput(data.radar_hook))
  806.  
  807. SetCursorPos(1, 7)
  808. Write("AutoPilot Webhook: ")
  809. hook_autoset(readInput(data.auto_hook))
  810.  
  811. data_save()
  812. end
  813. function hook_gpsset(newGps)
  814. data.gps_hook = newGps
  815. end
  816. function hook_radset(newRad)
  817. data.radar_hook = newRad
  818. end
  819. function hook_autoset(newAuto)
  820. data.auto_hook = newAuto
  821. end
  822. function radar_setRadius(newRadius)
  823. if newRadius < 1 then
  824. data.radar_radius = 1
  825. elseif newRadius >= 10000 then
  826. data.radar_radius = 10000
  827. else
  828. data.radar_radius = newRadius
  829. end
  830. end
  831.  
  832. function radar_setAutoscanDelay(newAutoscanDelay)
  833. if newAutoscanDelay < 1 then
  834. data.radar_autoscanDelay = 1
  835. elseif newAutoscanDelay >= 3600 then -- 1 hour
  836. data.radar_autoscanDelay = 3600
  837. else
  838. data.radar_autoscanDelay = newAutoscanDelay
  839. end
  840. end
  841.  
  842. function radar_setMonitorIndex(newIndex)
  843. if #monitors == 0 or newIndex < 0 or newIndex > #monitors then
  844. data.radar_monitorIndex = 0
  845. else
  846. data.radar_monitorIndex = newIndex
  847. end
  848. end
  849.  
  850. function radar_getMonitor()
  851. if data.radar_monitorIndex > 0 and data.radar_monitorIndex <= #monitors then
  852. return monitors[data.radar_monitorIndex]
  853. else
  854. return nil
  855. end
  856. end
  857.  
  858. function radar_scan()
  859. local monitor = radar_getMonitor()
  860. if radar == nil or radar.isInterfaced() == nil then
  861. draw_warning(monitor, "No radar")
  862. return false
  863. end
  864. local energyStored, energyMax, _ = radar.getEnergyStatus()
  865. if energyStored == nil then energyStored = 0 end
  866. if energyMax == nil or energyMax == 0 then energyMax = 1 end
  867.  
  868. radar.radius(radius)
  869. local success, result = radar.getEnergyRequired()
  870. if not success then
  871. showErrorAndExit(result)
  872. end
  873. local energyRequired = result
  874.  
  875. if energyRequired <= 0 or energyStored < energyRequired then
  876. textOut((w / 2) - 7, 1, " /!\\ LOW POWER ", colors.white, colors.red)
  877. os.sleep(1)
  878.  
  879. return 0
  880. end
  881. if radar_timerId ~= -1 and radar.getResultsCount() == -1 then
  882. draw_warning(monitor, "Already scanning...")
  883. return false
  884. end
  885. radar_timerId = os.startTimer(radar_timerLength)
  886.  
  887. radar.radius(data.radar_radius)
  888. if radar.start() then
  889. draw_warning(monitor, "Scanning...")
  890. end
  891. return false
  892. end
  893.  
  894. local function scanAndDraw()
  895. local energyStored, energyMax, _ = radar.getEnergyStatus()
  896. if energyStored == nil then energyStored = 0 end
  897. if energyMax == nil or energyMax == 0 then energyMax = 1 end
  898.  
  899. radar.radius(data.radar_radius)
  900. local success, result = radar.getEnergyRequired()
  901. if not success then
  902. showErrorAndExit(result)
  903. end
  904. local energyRequired = result
  905.  
  906. if energyRequired <= 0 or energyStored < energyRequired then
  907. textOut((w / 2) - 7, 1, " /!\\ LOW POWER ", colors.white, colors.red)
  908. os.sleep(1)
  909.  
  910. return 0
  911. end
  912.  
  913. radar.start()
  914. local scanDuration = radar.getScanDuration()
  915. textOut((w / 2) - 7, 1, " ping sent ", colors.gray, colors.black)
  916. os.sleep(scanDuration)
  917.  
  918. local delay = 0
  919. local numResults
  920. repeat
  921. numResults = radar.getResultsCount()
  922. os.sleep(0.05)
  923. delay = delay + 1
  924. until (numResults ~= nil and numResults ~= -1) or delay > 10
  925.  
  926. redraw()
  927.  
  928. drawContact(radarX, radarY, radarZ, "RAD", colors.yellow)
  929.  
  930. if numResults ~= nil and numResults > 0 then
  931. for i = 0, numResults-1 do
  932. local success, _, name, cx, cy, cz = radar.getResult(i)
  933. if success then
  934. drawContact(cx, cy, cz, name, colors.red)
  935. end
  936. end
  937. end
  938.  
  939. os.sleep(scanDuration)
  940. data_save()
  941. radar_drawMap()
  942. end
  943.  
  944. function draw_text(monitor, x, y, text, textColor, backgroundColor)
  945. if monitor == nil then
  946. term.setCursorPos(x, y)
  947. if textColor ~= nil then term.setTextColor(textColor) end
  948. if backgroundColor ~= nil then term.setBackgroundColor(backgroundColor) end
  949. term.write(text)
  950. local xt, yt = term.getCursorPos()
  951. term.setCursorPos(1, yt + 1)
  952. else
  953. monitor.setCursorPos(x, y)
  954. if textColor ~= nil then monitor.setTextColor(textColor) end
  955. if backgroundColor ~= nil then monitor.setBackgroundColor(backgroundColor) end
  956. monitor.write(text)
  957. local xt, yt = monitor.getCursorPos()
  958. monitor.setCursorPos(1, yt + 1)
  959. end
  960. end
  961.  
  962. function draw_warning(monitor, text)
  963. local screenWidth, screenHeight
  964. if monitor == nil then
  965. screenWidth, screenHeight = term.getSize()
  966. else
  967. screenWidth, screenHeight = monitor.getSize()
  968. end
  969. local centerX = math.floor(screenWidth / 2)
  970. local centerY = math.floor(screenHeight / 2)
  971. local halfWidth = math.ceil(string.len(text) / 2)
  972. local blank = string.sub(" ", - (string.len(text) + 2))
  973.  
  974. draw_text(monitor, centerX - halfWidth - 1, centerY - 1, blank, colors.white, colors.red)
  975. draw_text(monitor, centerX - halfWidth - 1, centerY , " " .. text .. " ", colors.white, colors.red)
  976. draw_text(monitor, centerX - halfWidth - 1, centerY + 1, blank, colors.white, colors.red)
  977. end
  978.  
  979. function draw_centeredText(monitor, y, text)
  980. local screenWidth, screenHeight
  981. if monitor == nil then
  982. screenWidth, screenHeight = term.getSize()
  983. else
  984. screenWidth, screenHeight = monitor.getSize()
  985. end
  986. local x = math.floor(screenWidth / 2 - string.len(text) / 2 + 0.5)
  987.  
  988. draw_text(monitor, x, y, text, nil, nil)
  989. end
  990.  
  991. function radar_drawContact(monitor, contact)
  992. local screenWidth, screenHeight
  993. if monitor == nil then
  994. screenWidth, screenHeight = term.getSize()
  995. else
  996. screenWidth, screenHeight = monitor.getSize()
  997. end
  998.  
  999. local screenX = (radar_x + data.radar_offsetX - contact.x) / data.radar_scale
  1000. local screenY = (radar_z + data.radar_offsetY - contact.z) / data.radar_scale
  1001. local visible = true
  1002.  
  1003. if screenX <= -1 or screenX >= 1 or screenY <= -1 or screenY >= 1 then
  1004. screenX = math.min(1, math.max(-1, screenX))
  1005. screenY = math.min(1, math.max(-1, screenY))
  1006. visible = false
  1007. end
  1008.  
  1009. screenX = math.floor(screenX * (screenWidth - 3) / 2 + ((screenWidth - 1) / 2) + 1.5)
  1010. screenY = math.floor(screenY * (screenHeight - 3) / 2 + ((screenHeight - 1) / 2) + 1.5)
  1011.  
  1012. if contact.type == "self" then
  1013. draw_text(monitor, screenX, screenY, Style.TextRadarself, Style.CRadarself, Style.BGRadarself)
  1014. else
  1015. draw_text(monitor, screenX, screenY, Style.TextRadarother, Style.CRadarother, Style.BGRadarother)
  1016. end
  1017. if visible then
  1018. local text = contact.name
  1019. screenX = math.min(screenWidth - 1 - string.len(text), math.max(2, math.floor(screenX - string.len(text) / 2 + 0.5)))
  1020. if screenY == (screenHeight - 1) then
  1021. screenY = screenY - 1
  1022. else
  1023. screenY = screenY + 1
  1024. end
  1025. draw_text(monitor, screenX, screenY, text, Style.CRadarother, Style.BGRadarother)
  1026. end
  1027. end
  1028.  
  1029. function radar_drawMap()
  1030. local screenWidth, screenHeight, x, y
  1031. local monitor = radar_getMonitor()
  1032. -- center area
  1033. SetColorRadarmap()
  1034. if monitor == nil then
  1035. term.clear()
  1036. screenWidth, screenHeight = term.getSize()
  1037. else
  1038. monitor.clear()
  1039. screenWidth, screenHeight = monitor.getSize()
  1040. end
  1041. -- borders
  1042. SetColorRadarborder()
  1043. for x = 1, screenWidth do
  1044. if monitor == nil then
  1045. term.setCursorPos(x, 1)
  1046. term.write(" ")
  1047. term.setCursorPos(x, screenHeight)
  1048. term.write(" ")
  1049. else
  1050. monitor.setCursorPos(x, 1)
  1051. monitor.write(" ")
  1052. monitor.setCursorPos(x, screenHeight)
  1053. monitor.write(" ")
  1054. end
  1055. end
  1056. for y = 2, screenHeight - 1 do
  1057. if monitor == nil then
  1058. term.setCursorPos(1, y)
  1059. term.write(" ")
  1060. term.setCursorPos(screenWidth, y)
  1061. term.write(" ")
  1062. else
  1063. monitor.setCursorPos(1, y)
  1064. monitor.write(" ")
  1065. monitor.setCursorPos(screenWidth, y)
  1066. monitor.write(" ")
  1067. end
  1068. end
  1069. -- title
  1070. local text = label .. " - Radar map"
  1071. if #data.radar_results == 0 then
  1072. text = text .. " (no contacts)"
  1073. else
  1074. text = text .. " (" .. #data.radar_results .. " contacts)"
  1075. end
  1076. draw_centeredText(monitor, 1, text)
  1077. -- status
  1078. local text = "Scan radius: " .. data.radar_radius
  1079. if radar ~= nil then
  1080. local energyStored, energyMax, energyUnits = radar.getEnergyStatus()
  1081. text = text .. " | Energy: " .. energyStored .. " " .. energyUnits
  1082. end
  1083. text = text .. " | Scale: " .. data.radar_scale
  1084. draw_centeredText(monitor, screenHeight, text)
  1085. -- results
  1086. SetCursorPos(1, 12)
  1087. radar_drawContact(monitor, {x = radar_x, y = radar_y, z = radar_z, name = "", type = "self"})
  1088. for i = 0, #data.radar_results - 1 do
  1089. radar_drawContact(monitor, data.radar_results[i])
  1090. end
  1091.  
  1092. -- restore defaults
  1093. SetColorDefault()
  1094. end
  1095.  
  1096. radar_waitingNextScan = false
  1097. function radar_timerEvent()
  1098. radar_timerId = -1
  1099. if radar_waitingNextScan then
  1100. radar_waitingNextScan = false
  1101. radar_scan() -- will restart timer
  1102. else
  1103. local numResults = radar.getResultsCount()
  1104. if numResults ~= -1 then
  1105. radar_scanDone()
  1106. if data.radar_autoscan then
  1107. radar_waitingNextScan = true
  1108. radar_timerId = os.startTimer(data.radar_autoscanDelay)
  1109. end
  1110. else -- still scanning
  1111. radar_timerId = os.startTimer(radar_timerLength)
  1112. end
  1113. end
  1114. end
  1115.  
  1116. ----------- Boot sequence
  1117. math.randomseed(os.time())
  1118. label = os.getComputerLabel()
  1119. if not label then
  1120. label = "" .. os.getComputerID()
  1121. end
  1122.  
  1123. -- read configuration
  1124. data_read()
  1125. clear()
  1126. print("data_read...")
  1127.  
  1128. -- initial scanning
  1129. monitors = {}
  1130. ShowTitle(label .. " - Connecting...")
  1131. WriteLn("")
  1132.  
  1133. sides = peripheral.getNames()
  1134. reactor = nil
  1135. mininglasers = {}
  1136. reactorlasers = {}
  1137. cloakingcores = {}
  1138. forcefieldprojectors = {}
  1139. warpdrivetransportercores = {}
  1140. shipcontrollers = {}
  1141. ship = nil
  1142. radar = nil
  1143. for key,side in pairs(sides) do
  1144. os.sleep(0)
  1145. Write("Checking " .. side .. " ")
  1146. local componentType = peripheral.getType(side)
  1147. Write(componentType .. " ")
  1148. if componentType == "warpdriveShipController" then
  1149. Write("wrapping!")
  1150. table.insert(shipcontrollers, peripheral.wrap(side))
  1151. elseif componentType == "warpdriveShipCore" then
  1152. Write("wrapping!")
  1153. ship = peripheral.wrap(side)
  1154. elseif componentType == "warpdriveEnanReactorCore" then
  1155. Write("wrapping!")
  1156. reactor = peripheral.wrap(side)
  1157. elseif componentType == "warpdriveEnanReactorLaser" then
  1158. Write("wrapping!")
  1159. local wrap = peripheral.wrap(side)
  1160. table.insert(reactorlasers, { side = wrap.side(), wrap = wrap })
  1161. elseif componentType == "warpdriveMiningLaser" then
  1162. WriteLn("Wrapping " .. side)
  1163. table.insert(mininglasers, peripheral.wrap(side))
  1164. elseif componentType == "warpdriveCloakingCore" then
  1165. Write("wrapping!")
  1166. table.insert(cloakingcores, peripheral.wrap(side))
  1167. elseif componentType == "warpdriveForceFieldProjector" then
  1168. Write("wrapping!")
  1169. table.insert(forcefieldprojectors, peripheral.wrap(side))
  1170. elseif componentType == "warpdriveTransporterCore" then
  1171. Write("wrapping!")
  1172. table.insert(warpdrivetransportercores, peripheral.wrap(side))
  1173. elseif componentType == "warpdriveRadar" then
  1174. Write("wrapping!")
  1175. radar = peripheral.wrap(side)
  1176. elseif componentType == "monitor" then
  1177. Write("wrapping!")
  1178. lmonitor = peripheral.wrap(side)
  1179. table.insert(monitors, lmonitor)
  1180. lmonitor.setTextScale(monitor_textScale)
  1181. end
  1182. WriteLn("")
  1183. end
  1184.  
  1185. if not os.getComputerLabel() and (ship ~= nil or reactor ~= nil) then
  1186. data_setName()
  1187. end
  1188.  
  1189. -- peripherals status
  1190. function connections_page()
  1191. SetCursorPos(0, 1)
  1192. SetColorTitle()
  1193. ShowTitle(label .. " - Connections")
  1194.  
  1195. WriteLn("")
  1196. if #monitors == 0 then
  1197. SetColorWarning()
  1198. WriteLn("No Monitor detected")
  1199. elseif #monitors == 1 then
  1200. SetColorSuccess()
  1201. WriteLn("1 monitor detected")
  1202. else
  1203. SetColorSuccess()
  1204. WriteLn(#monitors .. " Monitors detected")
  1205. end
  1206. if ship == nil or ship.isInterfaced() == nil then
  1207. SetColorDisabled()
  1208. WriteLn("No ship core detected")
  1209. else
  1210. SetColorSuccess()
  1211. WriteLn("Ship core detected")
  1212. end
  1213. if #shipcontrollers == 0 then
  1214. SetColorWarning()
  1215. WriteLn("No Ship controllers detected - Multi Core Disabled")
  1216. elseif #shipcontrollers == 1 then
  1217. SetColorSuccess()
  1218. WriteLn("1 Ship controller detected")
  1219. else
  1220. SetColorSuccess()
  1221. WriteLn(#shipcontrollers .. " Ship controllers detected - Multi Core Enabled!")
  1222. end
  1223.  
  1224. if reactor == nil or reactor.isInterfaced() == nil then
  1225. SetColorWarning()
  1226. WriteLn("No Enantiomorphic reactor detected")
  1227. else
  1228. SetColorSuccess()
  1229. WriteLn("Enantiomorphic reactor detected")
  1230. end
  1231.  
  1232. if #reactorlasers == 0 then
  1233. SetColorWarning()
  1234. WriteLn("No reactor stabilisation laser detected")
  1235. elseif #reactorlasers == 1 then
  1236. SetColorSuccess()
  1237. WriteLn("1 reactor stabilisation laser detected")
  1238. else
  1239. SetColorSuccess()
  1240. WriteLn(#reactorlasers .. " reactor stabilisation lasers detected")
  1241. end
  1242.  
  1243. if #mininglasers == 0 then
  1244. SetColorWarning()
  1245. WriteLn("No mining laser detected")
  1246. elseif #mininglasers == 1 then
  1247. SetColorSuccess()
  1248. WriteLn("1 mining laser detected")
  1249. else
  1250. SetColorSuccess()
  1251. WriteLn(#mininglasers .. " mining lasers detected")
  1252. end
  1253.  
  1254. if #cloakingcores == 0 then
  1255. SetColorWarning()
  1256. WriteLn("No cloaking core detected")
  1257. elseif #cloakingcores == 1 then
  1258. SetColorSuccess()
  1259. WriteLn("1 cloaking core detected")
  1260. else
  1261. SetColorSuccess()
  1262. WriteLn(#cloakingcores .. " cloaking cores detected")
  1263. end
  1264. if #forcefieldprojectors == 0 then
  1265. SetColorWarning()
  1266. WriteLn("No Force Fieldp Pojectors detected")
  1267. elseif #forcefieldprojectors == 1 then
  1268. SetColorSuccess()
  1269. WriteLn(#"1 Force Field Projector detected")
  1270. else
  1271. SetColorSuccess()
  1272. WriteLn(#forcefieldprojectors .. " Force Field Projectors detected")
  1273. end
  1274. if #warpdrivetransportercores == 0 then
  1275. SetColorWarning()
  1276. WriteLn("No Transporter Rooms detected")
  1277. elseif #warpdrivetransportercores == 1 then
  1278. SetColorSuccess()
  1279. WriteLn(#"1 Transporter Room detected")
  1280. else
  1281. SetColorSuccess()
  1282. WriteLn(#warpdrivetransportercores .. " Transporter Rooms detected")
  1283. end
  1284.  
  1285. if radar == nil or radar.isInterfaced() == nil then
  1286. SetColorWarning()
  1287. WriteLn("No radar detected")
  1288. else
  1289. SetColorSuccess()
  1290. WriteLn("Radar detected")
  1291. end
  1292.  
  1293. WriteLn("")
  1294. SetColorDefault()
  1295. WriteLn("Please refer to below menu for keyboard controls")
  1296. WriteLn("For example, press 1 to access Ship page")
  1297. end
  1298.  
  1299. -- peripheral boot up
  1300. clear()
  1301. connections_page()
  1302. SetColorDefault()
  1303. WriteLn("")
  1304. os.sleep(0)
  1305. radar_boot()
  1306. os.sleep(0)
  1307.  
  1308. -- main loop
  1309. abort = false
  1310. refresh = true
  1311. page = connections_page
  1312. keyHandler = nil
  1313. repeat
  1314. ClearWarning()
  1315. if refresh then
  1316. clear()
  1317. page()
  1318. menu_common()
  1319. refresh = false
  1320. end
  1321. params = { os.pullEventRaw() }
  1322. eventName = params[1]
  1323. address = params[2]
  1324. if address == nil then address = "none" end
  1325. -- WriteLn("...")
  1326. -- WriteLn("Event '" .. eventName .. "', " .. address .. ", " .. params[3] .. ", " .. params[4] .. " received")
  1327. -- os.sleep(0.2)
  1328. if eventName == "key" then
  1329. keycode = params[2]
  1330. if char == 88 or char == 120 or keycode == 45 then -- x for eXit
  1331. os.pullEventRaw()
  1332. abort = true
  1333. elseif char == 48 or keycode == 11 or keycode == 82 then -- 0
  1334. page = connections_page
  1335. keyHandler = nil
  1336. refresh = true
  1337. elseif char == 49 or keycode == 2 or keycode == 79 then -- 1
  1338. page = core_page
  1339. keyHandler = core_key
  1340. refresh = true
  1341. elseif char == 50 or keycode == 3 or keycode == 80 then -- 2
  1342. page = cloaking_page
  1343. keyHandler = cloaking_key
  1344. refresh = true
  1345. elseif char == 51 or keycode == 4 or keycode == 81 then -- 3
  1346. page = shield_page
  1347. keyHandler = shield_key
  1348. refresh = true
  1349. elseif char == 52 or keycode == 5 or keycode == 75 then -- 4
  1350. page = radar_page
  1351. keyHandler = radar_key
  1352. refresh = true
  1353. elseif char == 53 or keycode == 6 or keycode == 76 then -- 5
  1354. page = mining_page
  1355. keyHandler = mining_key
  1356. refresh = true
  1357. elseif char == 54 or keycode == 7 or keycode == 77 then -- 6
  1358. page = mining_page
  1359. keyHandler = mining_key
  1360. refresh = true
  1361. elseif char == 55 or keycode == 8 then -- 7
  1362. page = reactor_page
  1363. keyHandler = reactor_key
  1364. refresh = true
  1365. elseif char == 56 or keycode == 9 or keycode == 79 then -- 8
  1366. page = hooks_page_config
  1367. keyHandler = hooks_page_key
  1368. refresh = true
  1369. elseif keyHandler ~= nil and keyHandler(char, keycode) then
  1370. refresh = true
  1371. os.sleep(0)
  1372. elseif char == 0 then -- control chars
  1373. refresh = false
  1374. os.sleep(0)
  1375. else
  1376. ShowWarning("Key " .. keycode .. " is invalid")
  1377. os.sleep(0.2)
  1378. end
  1379. elseif eventName == "reactorPulse" then
  1380. reactor_pulse(params[2])
  1381. refresh = (page == reactor_page)
  1382. elseif eventName == "terminate" then
  1383. abort = true
  1384. elseif not common_event(eventName, params[2]) then
  1385. ShowWarning("Event '" .. eventName .. "', " .. address .. " is unsupported")
  1386. refresh = true
  1387. os.sleep(0.2)
  1388. end
  1389. until abort
  1390.  
  1391. -- exiting
  1392. if data.core_summon then
  1393. data.core_summon = false
  1394. data_save()
  1395. end
  1396.  
  1397. if ship ~= nil then
  1398. ship.enable()
  1399. end
  1400.  
  1401. -- clear screens on exit
  1402. SetMonitorColorFrontBack(colors.white, colors.black)
  1403. term.clear()
  1404. if monitors ~= nil then
  1405. for key,monitor in pairs(monitors) do
  1406. monitor.clear()
  1407. end
  1408. end
  1409. SetCursorPos(1, 1)
  1410. WriteLn("Program terminated")
  1411. WriteLn("Type startup to restart it")
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement