2015-06-13 15:13:09 -06:00
|
|
|
local _ENV = mkmodule('plugins.dwarfmonitor')
|
|
|
|
|
2022-11-02 13:40:18 -06:00
|
|
|
local json = require('json')
|
|
|
|
local guidm = require('gui.dwarfmode')
|
|
|
|
local overlay = require('plugins.overlay')
|
2015-06-13 15:13:09 -06:00
|
|
|
|
2022-11-02 13:40:18 -06:00
|
|
|
local DWARFMONITOR_CONFIG_FILE = 'dfhack-config/dwarfmonitor.json'
|
2015-06-13 15:13:09 -06:00
|
|
|
|
2022-11-02 13:40:18 -06:00
|
|
|
-- --------------
|
|
|
|
-- Widget_weather
|
|
|
|
-- --------------
|
2015-06-13 15:13:09 -06:00
|
|
|
|
2022-11-02 13:40:18 -06:00
|
|
|
Widget_weather = defclass(Widget_weather, overlay.OverlayWidget)
|
2015-06-13 15:13:09 -06:00
|
|
|
|
2022-11-02 13:40:18 -06:00
|
|
|
function Widget_weather:init()
|
|
|
|
self.rain = false
|
|
|
|
self.snow = false
|
2015-06-13 15:13:09 -06:00
|
|
|
end
|
|
|
|
|
2022-11-02 13:40:18 -06:00
|
|
|
function Widget_weather:overlay_onupdate()
|
|
|
|
local rain, snow = false, false
|
|
|
|
local cw = df.global.current_weather
|
|
|
|
for i=0,4 do
|
|
|
|
for j=0,4 do
|
|
|
|
weather = cw[i][j]
|
|
|
|
if weather == df.weather_type.Rain then self.rain = true end
|
|
|
|
if weather == df.weather_type.Snow then self.snow = true end
|
2015-06-13 15:13:09 -06:00
|
|
|
end
|
|
|
|
end
|
2022-11-02 13:40:18 -06:00
|
|
|
self.frame.w = (rain and 4 or 0) + (snow and 4 or 0) +
|
|
|
|
((snow and rain) and 1 or 0)
|
|
|
|
self.rain, self.snow = rain, snow
|
2015-06-13 15:13:09 -06:00
|
|
|
end
|
|
|
|
|
2022-11-02 13:40:18 -06:00
|
|
|
function Widget_weather:onRenderBody(dc)
|
|
|
|
if self.rain then dc:string('Rain', COLOR_LIGHTBLUE):advance(1) end
|
|
|
|
if self.snow then dc:string('Snow', COLOR_WHITE) end
|
2015-06-13 15:13:09 -06:00
|
|
|
end
|
|
|
|
|
2022-11-02 13:40:18 -06:00
|
|
|
-- -----------
|
|
|
|
-- Widget_date
|
|
|
|
-- -----------
|
2015-06-13 15:13:09 -06:00
|
|
|
|
2022-11-02 13:40:18 -06:00
|
|
|
local function get_date_format()
|
|
|
|
local ok, config = pcall(json.decode_file, DWARFMONITOR_CONFIG_FILE)
|
|
|
|
if not ok or not config.date_format then
|
|
|
|
return 'Y-M-D'
|
2015-06-13 15:13:09 -06:00
|
|
|
end
|
2022-11-02 13:40:18 -06:00
|
|
|
return config.date_format
|
|
|
|
end
|
|
|
|
|
|
|
|
Widget_date = defclass(Widget_date, overlay.OverlayWidget)
|
|
|
|
|
|
|
|
function Widget_date:init()
|
|
|
|
self.datestr = ''
|
|
|
|
self.fmt = get_date_format()
|
|
|
|
end
|
|
|
|
|
|
|
|
function Widget_date:overlay_onupdate()
|
2015-06-13 15:13:09 -06:00
|
|
|
local year = dfhack.world.ReadCurrentYear()
|
|
|
|
local month = dfhack.world.ReadCurrentMonth() + 1
|
|
|
|
local day = dfhack.world.ReadCurrentDay()
|
2022-11-02 13:40:18 -06:00
|
|
|
|
|
|
|
local fmt = self.fmt
|
|
|
|
local datestr = 'Date:'
|
|
|
|
for i=1,#fmt do
|
|
|
|
local c = fmt:sub(i, i)
|
2015-06-13 15:13:09 -06:00
|
|
|
if c == 'y' or c == 'Y' then
|
2022-11-02 13:40:18 -06:00
|
|
|
datestr = datestr .. year
|
2015-06-13 15:13:09 -06:00
|
|
|
elseif c == 'm' or c == 'M' then
|
|
|
|
if c == 'M' and month < 10 then
|
2022-11-02 13:40:18 -06:00
|
|
|
datestr = datestr .. '0'
|
2015-06-13 15:13:09 -06:00
|
|
|
end
|
2022-11-02 13:40:18 -06:00
|
|
|
datestr = datestr .. month
|
2015-06-13 15:13:09 -06:00
|
|
|
elseif c == 'd' or c == 'D' then
|
|
|
|
if c == 'D' and day < 10 then
|
2022-11-02 13:40:18 -06:00
|
|
|
datestr = datestr .. '0'
|
2015-06-13 15:13:09 -06:00
|
|
|
end
|
2022-11-02 13:40:18 -06:00
|
|
|
datestr = datestr .. day
|
2015-06-13 15:13:09 -06:00
|
|
|
else
|
2022-11-02 13:40:18 -06:00
|
|
|
datestr = datestr .. c
|
2015-06-13 15:13:09 -06:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2022-11-02 13:40:18 -06:00
|
|
|
self.frame.w = #datestr
|
|
|
|
self.datestr = datestr
|
2015-06-13 15:13:09 -06:00
|
|
|
end
|
|
|
|
|
2022-11-02 13:40:18 -06:00
|
|
|
function Widget_date:onRenderBody(dc)
|
|
|
|
dc:string(self.datestr, COLOR_GREY)
|
2015-06-13 15:13:09 -06:00
|
|
|
end
|
|
|
|
|
2022-11-02 13:40:18 -06:00
|
|
|
-- -------------
|
|
|
|
-- Widget_misery
|
|
|
|
-- -------------
|
|
|
|
|
|
|
|
Widget_misery = defclass(Widget_misery, overlay.OverlayWidget)
|
2015-06-13 15:13:09 -06:00
|
|
|
|
2022-11-02 13:40:18 -06:00
|
|
|
function Widget_misery:init()
|
|
|
|
self.colors = getStressCategoryColors()
|
|
|
|
self.stress_category_counts = {}
|
2015-06-13 15:13:09 -06:00
|
|
|
end
|
|
|
|
|
2022-11-02 13:40:18 -06:00
|
|
|
function Widget_misery:overlay_onupdate()
|
|
|
|
local counts, num_colors = {}, #self.colors
|
|
|
|
for _,unit in ipairs(df.global.world.units.active) do
|
|
|
|
local stress_category = math.min(num_colors,
|
|
|
|
dfhack.units.getStressCategory(unit))
|
|
|
|
counts[stress_category] = (counts[stress_category] or 0) + 1
|
2015-06-13 15:13:09 -06:00
|
|
|
end
|
|
|
|
|
2022-11-02 13:40:18 -06:00
|
|
|
local width = 2 + num_colors - 1 -- 'H:' plus the slashes
|
|
|
|
for i=1,num_colors do
|
|
|
|
width = width + #tostring(counts[i] or 0)
|
2015-06-13 15:13:09 -06:00
|
|
|
end
|
|
|
|
|
2022-11-02 13:40:18 -06:00
|
|
|
self.stress_category_counts = counts
|
|
|
|
self.frame.w = width
|
|
|
|
end
|
2015-06-15 11:42:29 -06:00
|
|
|
|
2022-11-02 13:40:18 -06:00
|
|
|
function Widget_misery:onRenderBody(dc)
|
|
|
|
dc:string('H:', COLOR_WHITE)
|
|
|
|
local counts = self.stress_category_counts
|
|
|
|
for i,color in ipairs(self.colors) do
|
|
|
|
dc:string(tostring(counts[i] or 0), color)
|
|
|
|
if i < #self.colors then dc:string('/', COLOR_WHITE) end
|
2015-06-15 11:42:29 -06:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2022-11-02 13:40:18 -06:00
|
|
|
-- -------------
|
|
|
|
-- Widget_cursor
|
|
|
|
-- -------------
|
2015-06-15 11:42:29 -06:00
|
|
|
|
2022-11-02 13:40:18 -06:00
|
|
|
Widget_cursor = defclass(Widget_cursor, overlay.OverlayWidget)
|
2015-06-15 11:42:29 -06:00
|
|
|
|
2022-11-02 13:40:18 -06:00
|
|
|
function Widget_cursor:onRenderBody(dc)
|
|
|
|
local screenx, screeny = dfhack.screen.getMousePos()
|
|
|
|
local mouse_map = dfhack.gui.getMousePos()
|
|
|
|
local keyboard_map = guidm.getCursorPos()
|
2015-06-13 15:13:09 -06:00
|
|
|
|
2022-11-02 13:40:18 -06:00
|
|
|
local text = {}
|
|
|
|
table.insert(text, ('mouse UI grid (%d,%d)'):format(screenx, screeny))
|
|
|
|
if mouse_map then
|
|
|
|
table.insert(text, ('mouse map coord (%d,%d,%d)')
|
|
|
|
:format(mouse_map.x, mouse_map.y, mouse_map.z))
|
2015-06-13 15:13:09 -06:00
|
|
|
end
|
2022-11-02 13:40:18 -06:00
|
|
|
if keyboard_map then
|
|
|
|
table.insert(text, ('kbd cursor coord (%d,%d,%d)')
|
|
|
|
:format(keyboard_map.x, keyboard_map.y, keyboard_map.z))
|
2015-06-13 15:13:09 -06:00
|
|
|
end
|
2022-11-02 13:40:18 -06:00
|
|
|
local width = 0
|
|
|
|
for i,line in ipairs(text) do
|
|
|
|
dc:seek(0, i-1):string(line)
|
|
|
|
width = math.max(width, #line)
|
2015-06-13 15:13:09 -06:00
|
|
|
end
|
2022-11-02 13:40:18 -06:00
|
|
|
self.frame.w = width
|
|
|
|
self.frame.h = #text
|
2015-06-13 15:13:09 -06:00
|
|
|
end
|
|
|
|
|
|
|
|
return _ENV
|