Skip to content

Commit 2705dae

Browse files
committed
revise #4767, implementing review feedback and other improvements
1 parent 92616c8 commit 2705dae

5 files changed

Lines changed: 52 additions & 86 deletions

File tree

‎docs/changelog.txt‎

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,8 +66,14 @@ Template for new versions:
6666

6767
## API
6868

69+
``Screen``: new functions ``paintMapPortTile`` and ``readMapPortTile`` to write and read world and region map tiles.
70+
6971
## Lua
7072

73+
Added ``Screen::paintMapPortTile`` as ``dfhack.screen.paintMapPortTile``
74+
Added ``Screen::readMapPortTile`` as ``dfhack.screen.readMapPortTile``
75+
76+
7177
## Removed
7278

7379
# 53.15-r2

‎docs/dev/Lua API.rst‎

Lines changed: 20 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2872,12 +2872,9 @@ Common parameters to these functions include:
28722872
* ``x``, ``y``: screen coordinates in tiles; the upper left corner of the screen
28732873
is ``x = 0, y = 0``
28742874
* ``pen``: a `pen object <lua-screen-pen>`
2875-
* ``map``: a boolean indicating whether to draw to a separate map buffer
2876-
(defaults to false, which is suitable for off-map text or a screen that hides
2877-
the map entirely). Note that only third-party plugins like TWBT currently
2878-
implement a separate map buffer. If no such plugins are enabled, passing
2879-
``true`` has no effect. However, this parameter should still be used to ensure
2880-
that scripts work properly with such plugins.
2875+
* ``map``: a boolean (defaults to false) indicating whether to draw to a
2876+
separate map buffer. The Steam version uses separate map buffers with square
2877+
tiles for for all types of maps (i.e. fort, region, and world).
28812878

28822879
Functions:
28832880

@@ -2903,15 +2900,31 @@ Functions:
29032900
* ``dfhack.screen.paintTile(pen,x,y[,char[,tile[,map]]])``
29042901

29052902
Paints a tile using given parameters. `See below <lua-screen-pen>` for a
2906-
description of ``pen``.
2903+
description of ``pen``. The map argument is only supported for local maps
2904+
(i.e. fort mode and adventure mode outside of fast travel). The ``char`` and
2905+
``tile`` arguments allow overriding the respective parts of the ``pen``
2906+
without constructing a new pen beforehand.
29072907

29082908
Returns *false* on error, e.g., if coordinates are out of bounds
29092909

2910+
* ``dfhack.screen.paintMapPortTile(pen,x,y[,char[,tile]])``
2911+
2912+
Paints a tile using given parameters onto the interface texpos layer of a map
2913+
port (e.g., the world map or the zoomed-in map for embark selection). The
2914+
``char`` and ``tile`` arguments work as above.
2915+
29102916
* ``dfhack.screen.readTile(x,y[,map])``
29112917

29122918
Retrieves the contents of the specified tile from the screen buffers.
29132919
Returns a `pen object <lua-screen-pen>`, or *nil* if invalid or TrueType.
29142920

2921+
* ``dfhack.screen.readMapPortTile(x,y)``
2922+
2923+
Retrieves the contents of the specified tile from the screen buffers. Returns
2924+
a `pen object <lua-screen-pen>`, or *nil* if invalid.
2925+
2926+
For now only looks at the ``sites`` textpos layer.
2927+
29152928
* ``dfhack.screen.paintString(pen,x,y,text[,map])``
29162929

29172930
Paints the string starting at *x,y*. Uses the string characters

‎library/LuaApi.cpp‎

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3129,7 +3129,7 @@ static int screen_readTile(lua_State *L)
31293129
return 1;
31303130
}
31313131

3132-
static int screen_paintTileMapPort(lua_State *L)
3132+
static int screen_paintMapPortTile(lua_State *L)
31333133
{
31343134
Pen pen;
31353135
Lua::CheckPen(L, &pen, 1);
@@ -3144,15 +3144,15 @@ static int screen_paintTileMapPort(lua_State *L)
31443144
}
31453145
if (lua_gettop(L) >= 5 && !lua_isnil(L, 5))
31463146
pen.tile = luaL_checkint(L, 5);
3147-
lua_pushboolean(L, Screen::paintTileMapPort(pen, x, y));
3147+
lua_pushboolean(L, Screen::paintMapPortTile(pen, x, y));
31483148
return 1;
31493149
}
31503150

3151-
static int screen_readTileMapPort(lua_State *L)
3151+
static int screen_readMapPortTile(lua_State *L)
31523152
{
31533153
int x = luaL_checkint(L, 1);
31543154
int y = luaL_checkint(L, 2);
3155-
Pen pen = Screen::readTileMapPort(x, y);
3155+
Pen pen = Screen::readMapPortTile(x, y, &df::graphic_map_portst::screentexpos_site);
31563156
Lua::Push(L, pen);
31573157
return 1;
31583158
}
@@ -3344,8 +3344,8 @@ static const luaL_Reg dfhack_screen_funcs[] = {
33443344
{ "getWindowSize", screen_getWindowSize },
33453345
{ "paintTile", screen_paintTile },
33463346
{ "readTile", screen_readTile },
3347-
{ "paintTileMapPort", screen_paintTileMapPort },
3348-
{ "readTileMapPort", screen_readTileMapPort },
3347+
{ "paintMapPortTile", screen_paintMapPortTile },
3348+
{ "readMapPortTile", screen_readMapPortTile },
33493349
{ "paintString", screen_paintString },
33503350
{ "fillRect", screen_fillRect },
33513351
{ "findGraphicsTile", screen_findGraphicsTile },

‎library/include/modules/Screen.h‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -202,10 +202,10 @@ namespace DFHack
202202
DFHACK_EXPORT Pen readTile(int x, int y, bool map = false, int32_t * df::graphic_viewportst::*texpos_field = NULL);
203203

204204
/// Paint one world map tile with the given pen
205-
DFHACK_EXPORT bool paintTileMapPort(const Pen &pen, int x, int y, int32_t * df::graphic_map_portst::*texpos_field = NULL);
205+
DFHACK_EXPORT bool paintMapPortTile(const Pen &pen, int x, int y, int32_t * df::graphic_map_portst::*texpos_field = NULL);
206206

207207
/// Retrieves one world map tile from the buffer
208-
DFHACK_EXPORT Pen readTileMapPort(int x, int y, int32_t * df::graphic_map_portst::*texpos_field = NULL);
208+
DFHACK_EXPORT Pen readMapPortTile(int x, int y, int32_t * df::graphic_map_portst::*texpos_field);
209209

210210
/// Paint a string onto the screen. Ignores ch and tile of pen.
211211
DFHACK_EXPORT bool paintString(const Pen &pen, int x, int y, const std::string &text, bool map = false);

‎library/modules/Screen.cpp‎

Lines changed: 18 additions & 71 deletions
Original file line numberDiff line numberDiff line change
@@ -372,11 +372,18 @@ Pen Screen::readTile(int x, int y, bool map, int32_t * df::graphic_viewportst::*
372372
return doGetTile(x, y, map, texpos_field);
373373
}
374374

375-
static bool doSetTile_map_port(const Pen &pen, int x, int y, int32_t * df::graphic_map_portst::*texpos_field) {
376-
auto &vp = gps->main_map_port;
375+
bool Screen::paintMapPortTile(const Pen &pen, int x, int y, int32_t * df::graphic_map_portst::*texpos_field)
376+
{
377+
if (!gps || !pen.valid()) return false;
378+
379+
bool use_graphics = Screen::inGraphicsMode();
380+
if (!use_graphics)
381+
return doSetTile_char(pen, x, y, use_graphics);
382+
377383
if (!texpos_field)
378384
texpos_field = &df::graphic_map_portst::screentexpos_interface;
379385

386+
auto &vp = gps->main_map_port;
380387
if (x < 0 || x >= vp->dim_x || y < 0 || y >= vp->dim_y)
381388
return false;
382389

@@ -393,96 +400,36 @@ static bool doSetTile_map_port(const Pen &pen, int x, int y, int32_t * df::graph
393400
return true;
394401
}
395402

396-
static bool doSetTile_map_port_default(const Pen &pen, int x, int y, int32_t * df::graphic_map_portst::*texpos_field) {
397-
bool use_graphics = Screen::inGraphicsMode();
398-
399-
if (use_graphics)
400-
return doSetTile_map_port(pen, x, y, texpos_field);
403+
Pen Screen::readMapPortTile(int x, int y, int32_t * df::graphic_map_portst::*texpos_field)
404+
{
405+
CHECK_NULL_POINTER(texpos_field)
401406

402-
return doSetTile_char(pen, x, y, use_graphics);
403-
}
407+
if (!gps) return Pen(0,0,0,-1);
404408

405-
bool Screen::paintTileMapPort(const Pen &pen, int x, int y, int32_t * df::graphic_map_portst::*texpos_field)
406-
{
407-
if (!gps || !pen.valid()) return false;
409+
bool use_graphics = Screen::inGraphicsMode();
408410

409-
doSetTile_map_port_default(pen, x, y, texpos_field);
410-
return true;
411-
}
411+
if (!use_graphics)
412+
return doGetTile_char(x, y, use_graphics);
412413

413-
static Pen doGetTile_map_port(int x, int y, int32_t * df::graphic_map_portst::*texpos_field) {
414414
auto &vp = gps->main_map_port;
415415

416416
if (x < 0 || x >= vp->dim_x || y < 0 || y >= vp->dim_y)
417417
return Pen(0, 0, 0, -1);
418418

419419
size_t max_index = vp->dim_x * vp->dim_y - 1;
420-
size_t index = (x * vp->dim_y) + y;
420+
size_t index = (y * vp->dim_x) + x;
421421

422422
if (index < 0 || index > max_index)
423423
return Pen(0, 0, 0, -1);
424424

425-
int tile = 0;
426-
if (!texpos_field) {
427-
if (tile == 0)
428-
tile = vp->screentexpos_base[index];
429-
if (tile == 0)
430-
tile = vp->screentexpos_detail[index];
431-
if (tile == 0)
432-
tile = vp->screentexpos_tunnel[index];
433-
if (tile == 0)
434-
tile = vp->screentexpos_river[index];
435-
if (tile == 0)
436-
tile = vp->screentexpos_road[index];
437-
if (tile == 0)
438-
tile = vp->screentexpos_site[index];
439-
if (tile == 0)
440-
tile = vp->screentexpos_army[index];
441-
if (tile == 0)
442-
tile = vp->screentexpos_interface[index];
443-
if (tile == 0)
444-
tile = vp->screentexpos_detail_to_n[index];
445-
if (tile == 0)
446-
tile = vp->screentexpos_detail_to_s[index];
447-
if (tile == 0)
448-
tile = vp->screentexpos_detail_to_w[index];
449-
if (tile == 0)
450-
tile = vp->screentexpos_detail_to_e[index];
451-
if (tile == 0)
452-
tile = vp->screentexpos_detail_to_nw[index];
453-
if (tile == 0)
454-
tile = vp->screentexpos_detail_to_ne[index];
455-
if (tile == 0)
456-
tile = vp->screentexpos_detail_to_sw[index];
457-
if (tile == 0)
458-
tile = vp->screentexpos_detail_to_se[index];
459-
if (tile == 0)
460-
tile = vp->screentexpos_site_to_s[index];
461-
} else {
462-
tile = (vp->*texpos_field)[index];
463-
}
425+
auto tile = (vp->*texpos_field)[index];
464426

465427
char ch = 0;
466428
uint8_t fg = 0;
467429
uint8_t bg = 0;
468430
return Pen(ch, fg, bg, tile, false);
469431
}
470432

471-
static Pen doGetTile_map_port_default(int x, int y, int32_t * df::graphic_map_portst::*texpos_field = NULL) {
472-
bool use_graphics = Screen::inGraphicsMode();
473-
474-
if (use_graphics)
475-
return doGetTile_map_port(x, y, texpos_field);
476-
return doGetTile_char(x, y, use_graphics);
477-
}
478-
479-
Pen Screen::readTileMapPort(int x, int y, int32_t * df::graphic_map_portst::*texpos_field)
480-
{
481-
if (!gps) return Pen(0,0,0,-1);
482-
483-
return doGetTile_map_port_default(x, y, texpos_field);
484-
}
485-
486433
bool Screen::paintString(const Pen &pen, int x, int y, const std::string &text, bool map)
487434
{
488435
auto dim = getWindowSize();

0 commit comments

Comments
 (0)