-- Read the tiles from the screen and display info about them. 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()