Skip to content

Commit 27343e3

Browse files
committed
Add unit and tile visibility functions
1 parent 9b63c45 commit 27343e3

6 files changed

Lines changed: 39 additions & 0 deletions

File tree

docs/Lua API.rst

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1135,6 +1135,10 @@ Units module
11351135
The unit is an alive sane citizen of the fortress; wraps the
11361136
same checks the game uses to decide game-over by extinction.
11371137

1138+
* ``dfhack.units.isVisible(unit)``
1139+
1140+
The unit is visible on the map.
1141+
11381142
* ``dfhack.units.getAge(unit[,true_age])``
11391143

11401144
Returns the age of the unit in years as a floating-point value.
@@ -1300,6 +1304,10 @@ Maps module
13001304

13011305
Checks if the given df::coord or x,y,z in local tile coordinates are valid.
13021306

1307+
* ``dfhack.maps.isTileVisible(coords)``, or ``isTileVisible(x,y,z)``
1308+
1309+
Checks if the given df::coord or x,y,z in local tile coordinates is visible.
1310+
13031311
* ``dfhack.maps.getTileBlock(coords)``, or ``getTileBlock(x,y,z)``
13041312

13051313
Returns a map block object for given df::coord or x,y,z in local tile coordinates.

library/LuaApi.cpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1572,6 +1572,7 @@ static const LuaWrapper::FunctionReg dfhack_units_module[] = {
15721572
WRAPM(Units, isSane),
15731573
WRAPM(Units, isDwarf),
15741574
WRAPM(Units, isCitizen),
1575+
WRAPM(Units, isVisible),
15751576
WRAPM(Units, getAge),
15761577
WRAPM(Units, getKillCount),
15771578
WRAPM(Units, getNominalSkill),
@@ -1818,6 +1819,13 @@ static int maps_isValidTilePos(lua_State *L)
18181819
return 1;
18191820
}
18201821

1822+
static int maps_isTileVisible(lua_State *L)
1823+
{
1824+
auto pos = CheckCoordXYZ(L, 1, true);
1825+
lua_pushboolean(L, Maps::isTileVisible(pos));
1826+
return 1;
1827+
}
1828+
18211829
static int maps_getTileBlock(lua_State *L)
18221830
{
18231831
auto pos = CheckCoordXYZ(L, 1, true);
@@ -1866,6 +1874,7 @@ static int maps_getTileBiomeRgn(lua_State *L)
18661874

18671875
static const luaL_Reg dfhack_maps_funcs[] = {
18681876
{ "isValidTilePos", maps_isValidTilePos },
1877+
{ "isTileVisible", maps_isTileVisible },
18691878
{ "getTileBlock", maps_getTileBlock },
18701879
{ "ensureTileBlock", maps_ensureTileBlock },
18711880
{ "getTileType", maps_getTileType },

library/include/modules/Maps.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -263,6 +263,9 @@ extern DFHACK_EXPORT void getPosition(int32_t& x, int32_t& y, int32_t& z);
263263
extern DFHACK_EXPORT bool isValidTilePos(int32_t x, int32_t y, int32_t z);
264264
inline bool isValidTilePos(df::coord pos) { return isValidTilePos(pos.x, pos.y, pos.z); }
265265

266+
extern DFHACK_EXPORT bool isTileVisible(int32_t x, int32_t y, int32_t z);
267+
inline bool isTileVisible(df::coord pos) { return isTileVisible(pos.x, pos.y, pos.z); }
268+
266269
/**
267270
* Get the map block or NULL if block is not valid
268271
*/

library/include/modules/Units.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,7 @@ DFHACK_EXPORT bool isAvailableForAdoption(df::unit* unit);
116116
DFHACK_EXPORT bool isOwnCiv(df::unit* unit);
117117
DFHACK_EXPORT bool isOwnGroup(df::unit* unit);
118118
DFHACK_EXPORT bool isOwnRace(df::unit* unit);
119+
DFHACK_EXPORT bool isVisible(df::unit* unit);
119120

120121
DFHACK_EXPORT std::string getRaceNameById(int32_t race_id);
121122
DFHACK_EXPORT std::string getRaceName(df::unit* unit);

library/modules/Maps.cpp

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -166,6 +166,17 @@ bool Maps::isValidTilePos(int32_t x, int32_t y, int32_t z)
166166
return true;
167167
}
168168

169+
bool Maps::isTileVisible(int32_t x, int32_t y, int32_t z)
170+
{
171+
df::map_block *block = getTileBlock(x, y, z);
172+
if (!block)
173+
return false;
174+
if (block->designation[x % 16][y % 16].bits.hidden)
175+
return false;
176+
177+
return true;
178+
}
179+
169180
df::map_block *Maps::getTileBlock (int32_t x, int32_t y, int32_t z)
170181
{
171182
if (!isValidTilePos(x,y,z))

library/modules/Units.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ using namespace std;
4242
// we connect to those
4343
#include "modules/Units.h"
4444
#include "modules/Items.h"
45+
#include "modules/Maps.h"
4546
#include "modules/Materials.h"
4647
#include "modules/Translation.h"
4748
#include "ModuleFactory.h"
@@ -526,6 +527,12 @@ bool Units::isOwnRace(df::unit* unit)
526527
return unit->race == ui->race_id;
527528
}
528529

530+
bool Units::isVisible(df::unit* unit)
531+
{
532+
CHECK_NULL_POINTER(unit);
533+
return Maps::isTileVisible(unit->pos);
534+
}
535+
529536
// get race name by id or unit pointer
530537
string Units::getRaceNameById(int32_t id)
531538
{

0 commit comments

Comments
 (0)