cc-mek-scada/graphics/elements/indicators/coremap.lua

175 lines
4.6 KiB
Lua
Raw Normal View History

2022-08-01 16:05:39 +00:00
-- Reactor Core View Graphics Element
local util = require("scada-common.util")
local core = require("graphics.core")
local element = require("graphics.element")
---@class core_map_args
2022-08-02 14:46:21 +00:00
---@field reactor_l integer reactor length
---@field reactor_w integer reactor width
2022-08-01 16:05:39 +00:00
---@field parent graphics_element
---@field id? string element id
---@field x? integer 1 if omitted
2023-07-10 03:42:44 +00:00
---@field y? integer auto incremented if omitted
2022-08-01 16:05:39 +00:00
-- new core map box
2023-02-25 00:50:01 +00:00
---@nodiscard
2022-08-01 16:05:39 +00:00
---@param args core_map_args
---@return graphics_element element, element_id id
local function core_map(args)
2023-09-30 15:46:47 +00:00
element.assert(util.is_int(args.reactor_l), "reactor_l is a required field")
element.assert(util.is_int(args.reactor_w), "reactor_w is a required field")
2022-08-01 16:05:39 +00:00
-- require max dimensions
args.width = 18
args.height = 18
2022-08-02 14:46:21 +00:00
-- inherit only foreground color
2023-05-07 01:27:36 +00:00
args.fg_bg = core.cpair(args.parent.get_fg_bg().fgd, colors.gray)
2022-08-01 16:05:39 +00:00
-- create new graphics element base object
local e = element.new(args)
e.value = 0
2022-08-01 16:05:39 +00:00
local alternator = true
local core_l = args.reactor_l - 2
local core_w = args.reactor_w - 2
local shift_x = 8 - math.floor(core_l / 2)
local shift_y = 8 - math.floor(core_w / 2)
2022-08-01 16:05:39 +00:00
local start_x = 2 + shift_x
local start_y = 2 + shift_y
2022-08-02 14:46:21 +00:00
local inner_width = core_l
local inner_height = core_w
2022-08-02 14:46:21 +00:00
-- create coordinate grid and frame
local function draw_frame()
2023-08-31 01:11:57 +00:00
e.w_set_fgd(colors.white)
2022-08-02 14:46:21 +00:00
for x = 0, (inner_width - 1) do
2023-08-31 01:11:57 +00:00
e.w_set_cur(x + start_x, 1)
e.w_write(util.sprintf("%X", x))
end
2022-08-02 14:46:21 +00:00
for y = 0, (inner_height - 1) do
2023-08-31 01:11:57 +00:00
e.w_set_cur(1, y + start_y)
e.w_write(util.sprintf("%X", y))
end
-- even out bottom edge
2023-08-31 01:11:57 +00:00
e.w_set_fgd(e.fg_bg.bkg)
e.w_set_bkg(args.parent.get_fg_bg().bkg)
e.w_set_cur(1, e.frame.h)
e.w_write(string.rep("\x8f", e.frame.w))
e.w_set_fgd(e.fg_bg.fgd)
e.w_set_bkg(e.fg_bg.bkg)
end
2022-08-02 14:46:21 +00:00
2022-08-01 16:05:39 +00:00
-- draw the core
2022-08-02 14:46:21 +00:00
---@param t number temperature in K
local function draw_core(t)
2022-08-01 16:05:39 +00:00
local i = 1
2022-08-02 14:46:21 +00:00
local back_c = "F"
local text_c ---@type string
2022-08-01 16:05:39 +00:00
-- determine fuel assembly coloring
if t <= 300 then
-- gray
2022-08-02 14:46:21 +00:00
text_c = "8"
2022-08-01 16:05:39 +00:00
elseif t <= 350 then
-- blue
2022-08-02 14:46:21 +00:00
text_c = "3"
2022-08-01 16:05:39 +00:00
elseif t < 600 then
-- green
2022-08-02 14:46:21 +00:00
text_c = "D"
2022-08-01 16:05:39 +00:00
elseif t < 1000 then
-- yellow
2022-08-02 14:46:21 +00:00
text_c = "4"
-- back_c = "8"
2022-08-01 16:05:39 +00:00
elseif t < 1200 then
-- orange
2022-08-02 14:46:21 +00:00
text_c = "1"
2022-08-01 16:05:39 +00:00
elseif t < 1300 then
-- red
2022-08-02 14:46:21 +00:00
text_c = "E"
2022-08-01 16:05:39 +00:00
else
-- pink
2022-08-02 14:46:21 +00:00
text_c = "2"
2022-08-01 16:05:39 +00:00
end
-- draw pattern
for y = start_y, inner_height + (start_y - 1) do
2023-08-31 01:11:57 +00:00
e.w_set_cur(start_x, y)
for _ = 1, inner_width do
2022-08-01 16:05:39 +00:00
if alternator then
i = i + 1
2023-08-31 01:11:57 +00:00
e.w_blit("\x07", text_c, back_c)
2022-08-01 16:05:39 +00:00
else
2023-08-31 01:11:57 +00:00
e.w_blit("\x07", "7", "8")
2022-08-01 16:05:39 +00:00
end
alternator = not alternator
end
if inner_width % 2 == 0 then alternator = not alternator end
end
2022-10-03 01:17:13 +00:00
-- reset alternator
alternator = true
2022-08-01 16:05:39 +00:00
end
-- on state change
2022-08-02 14:46:21 +00:00
---@param temperature number temperature in Kelvin
2022-08-01 16:05:39 +00:00
function e.on_update(temperature)
e.value = temperature
draw_core(e.value)
2022-08-01 16:05:39 +00:00
end
-- set temperature to display
---@param val number degrees K
function e.set_value(val) e.on_update(val) end
-- resize reactor dimensions
---@param reactor_l integer reactor length (rendered in 2D top-down as width)
---@param reactor_w integer reactor width (rendered in 2D top-down as height)
function e.resize(reactor_l, reactor_w)
-- enforce possible dimensions
if reactor_l > 18 then reactor_l = 18 elseif reactor_l < 3 then reactor_l = 3 end
if reactor_w > 18 then reactor_w = 18 elseif reactor_w < 3 then reactor_w = 3 end
-- update dimensions
core_l = reactor_l - 2
core_w = reactor_w - 2
shift_x = 8 - math.floor(core_l / 2)
shift_y = 8 - math.floor(core_w / 2)
start_x = 2 + shift_x
start_y = 2 + shift_y
inner_width = core_l
inner_height = core_w
e.window.clear()
-- re-draw
draw_frame()
e.on_update(e.value)
end
-- redraw both frame and core
function e.redraw()
draw_frame()
draw_core(e.value)
end
-- initial draw
e.redraw()
return e.complete()
2022-08-01 16:05:39 +00:00
end
return core_map