dfhack/scripts/devel/inspect-screen.lua

111 lines
4.0 KiB
Lua

-- Read the tiles from the screen and display info about them.
--[[=begin
devel/inspect-screen
====================
Read the tiles from the screen and display info about them.
=end]]
local utils = require 'utils'
local gui = require 'gui'
InspectScreen = defclass(InspectScreen, gui.Screen)
function InspectScreen:init(args)
local w,h = dfhack.screen.getWindowSize()
self.cursor_x = math.floor(w/2)
self.cursor_y = math.floor(h/2)
end
function InspectScreen:computeFrame(parent_rect)
local sw, sh = parent_rect.width, parent_rect.height
self.cursor_x = math.max(0, math.min(self.cursor_x, sw-1))
self.cursor_y = math.max(0, math.min(self.cursor_y, sh-1))
local frame = { w = 14, r = 1, h = 10, t = 1 }
if self.cursor_x > sw/2 then
frame = { w = 14, l = 1, h = 10, t = 1 }
end
return gui.compute_frame_body(sw, sh, frame, 1, 0, false)
end
function InspectScreen:onRenderFrame(dc, rect)
self:renderParent()
self.cursor_pen = dfhack.screen.readTile(self.cursor_x, self.cursor_y)
if gui.blink_visible(100) then
dfhack.screen.paintTile({ch='X',fg=COLOR_LIGHTGREEN}, self.cursor_x, self.cursor_y)
end
dc:fill(rect, {ch=' ',fg=COLOR_WHITE,bg=COLOR_CYAN})
end
local FG_PEN = {fg=COLOR_WHITE,bg=COLOR_BLACK,tile_color=true}
local BG_PEN = {fg=COLOR_BLACK,bg=COLOR_WHITE,tile_color=true}
local TXT_PEN = {fg=COLOR_WHITE}
function InspectScreen:onRenderBody(dc)
dc:pen(COLOR_WHITE, COLOR_CYAN)
if self.cursor_pen then
local info = self.cursor_pen
dc:string('CH: '):char(info.ch, FG_PEN):char(info.ch, BG_PEN):string(' '):string(''..info.ch,TXT_PEN):newline()
local fgcolor = info.fg
local fgstr = info.fg
if info.bold then
fgcolor = (fgcolor+8)%16
fgstr = fgstr..'+8'
end
dc:string('FG: '):string('NN',{fg=fgcolor}):string(' '):string(''..fgstr,TXT_PEN)
dc:seek(dc.width-1):char(info.ch,{fg=info.fg,bold=info.bold}):newline()
dc:string('BG: '):string('NN',{fg=info.bg}):string(' '):string(''..info.bg,TXT_PEN)
dc:seek(dc.width-1):char(info.ch,{fg=COLOR_BLACK,bg=info.bg}):newline()
local bstring = 'false'
if info.bold then bstring = 'true' end
dc:string('Bold: '..bstring):newline():newline()
if info.tile and gui.USE_GRAPHICS then
dc:string('TL: '):tile(' ', info.tile, FG_PEN):tile(' ', info.tile, BG_PEN):string(' '..info.tile):newline()
if info.tile_color then
dc:string('Color: true')
elseif info.tile_fg then
dc:string('FG: '):string('NN',{fg=info.tile_fg}):string(' '):string(''..info.tile_fg,TXT_PEN):newline()
dc:string('BG: '):string('NN',{fg=info.tile_bg}):string(' '):string(''..info.tile_bg,TXT_PEN):newline()
end
end
else
dc:string('Invalid', COLOR_LIGHTRED)
end
end
local MOVEMENT_KEYS = {
CURSOR_UP = { 0, -1, 0 }, CURSOR_DOWN = { 0, 1, 0 },
CURSOR_LEFT = { -1, 0, 0 }, CURSOR_RIGHT = { 1, 0, 0 },
CURSOR_UPLEFT = { -1, -1, 0 }, CURSOR_UPRIGHT = { 1, -1, 0 },
CURSOR_DOWNLEFT = { -1, 1, 0 }, CURSOR_DOWNRIGHT = { 1, 1, 0 },
CURSOR_UP_FAST = { 0, -1, 0, true }, CURSOR_DOWN_FAST = { 0, 1, 0, true },
CURSOR_LEFT_FAST = { -1, 0, 0, true }, CURSOR_RIGHT_FAST = { 1, 0, 0, true },
CURSOR_UPLEFT_FAST = { -1, -1, 0, true }, CURSOR_UPRIGHT_FAST = { 1, -1, 0, true },
CURSOR_DOWNLEFT_FAST = { -1, 1, 0, true }, CURSOR_DOWNRIGHT_FAST = { 1, 1, 0, true },
}
function InspectScreen:onInput(keys)
if keys.LEAVESCREEN then
self:dismiss()
else
for k,v in pairs(MOVEMENT_KEYS) do
if keys[k] then
local delta = 1
if v[4] then
delta = 10
end
self.cursor_x = self.cursor_x + delta*v[1]
self.cursor_y = self.cursor_y + delta*v[2]
self:updateLayout()
return
end
end
end
end
InspectScreen{}:show()