diff --git a/docs/changelog.txt b/docs/changelog.txt index 749b00c93..bac0d2848 100644 --- a/docs/changelog.txt +++ b/docs/changelog.txt @@ -79,6 +79,7 @@ Template for new versions: - ``dfhack.items.getValue()``: remove ``caravan_buying`` param as per C++ API change - ``widgets.BannerPanel``: panel with distinctive border for marking DFHack UI elements on otherwise vanilla screens - ``widgets.Panel``: new functions to override instead of setting corresponding properties (useful when subclassing instead of just setting attributes): ``onDragBegin``, ``onDragEnd``, ``onResizeBegin``, ``onResizeEnd`` +- ``dfhack.screen.readTile()``: now populates extended tile property fields (like top_of_text) in the returned Pen object ## Removed diff --git a/library/LuaApi.cpp b/library/LuaApi.cpp index 578bb4746..9dc86b526 100644 --- a/library/LuaApi.cpp +++ b/library/LuaApi.cpp @@ -844,6 +844,23 @@ static void make_pen_table(lua_State *L, Pen &pen) lua_pushboolean(L, false); lua_setfield(L, -2, "tile_color"); break; } + + if (pen.keep_lower) { + lua_pushboolean(L, true); + lua_setfield(L, -2, "keep_lower"); + } + if (pen.write_to_lower) { + lua_pushboolean(L, true); + lua_setfield(L, -2, "write_to_lower"); + } + if (pen.top_of_text) { + lua_pushboolean(L, true); + lua_setfield(L, -2, "top_of_text"); + } + if (pen.bottom_of_text) { + lua_pushboolean(L, true); + lua_setfield(L, -2, "bottom_of_text"); + } } } diff --git a/library/modules/Screen.cpp b/library/modules/Screen.cpp index 9cc7104d8..93f4773ec 100644 --- a/library/modules/Screen.cpp +++ b/library/modules/Screen.cpp @@ -294,6 +294,7 @@ static Pen doGetTile_default(int x, int y, bool map) { return Pen(0, 0, 0, -1); long *texpos = &gps->screentexpos[index]; + long *texpos_lower = &gps->screentexpos_lower[index]; uint32_t *flag = &gps->screentexpos_flag[index]; if (gps->top_in_use && @@ -301,6 +302,7 @@ static Pen doGetTile_default(int x, int y, bool map) { (use_graphics && gps->screentexpos_top[index]))) { screen = &gps->screen_top[index * 8]; texpos = &gps->screentexpos_top[index]; + texpos_lower = &gps->screentexpos_top_lower[index]; flag = &gps->screentexpos_top_flag[index]; } @@ -308,19 +310,37 @@ static Pen doGetTile_default(int x, int y, bool map) { uint8_t fg = to_16_bit_color(&screen[1]); uint8_t bg = to_16_bit_color(&screen[4]); int tile = 0; - if (use_graphics) + bool write_to_lower = false; + bool top_of_text = false; + bool bottom_of_text = false; + if (use_graphics) { tile = *texpos; + if (!tile && *texpos_lower) { + tile = *texpos_lower; + write_to_lower = true; + } + if (*flag & 0x8) + top_of_text = true; + else if (*flag &0x10) + bottom_of_text = true; + } + Pen ret; if (*flag & 1) { // TileColor - return Pen(ch, fg&7, bg, !!(fg&8), tile, fg, bg); + ret = Pen(ch, fg&7, bg, !!(fg&8), tile, fg, bg); } else if (*flag & 2) { // CharColor - return Pen(ch, fg, bg, tile, true); + ret = Pen(ch, fg, bg, tile, true); + } else { + // AsIs + ret = Pen(ch, fg, bg, tile, false); } - // AsIs - return Pen(ch, fg, bg, tile, false); + ret.write_to_lower = write_to_lower; + ret.top_of_text = top_of_text; + ret.bottom_of_text = bottom_of_text; + return ret; } GUI_HOOK_DEFINE(Screen::Hooks::get_tile, doGetTile_default);