Add new "pathable" plugin
parent
d6c4aa823a
commit
2d07e5edea
@ -0,0 +1,11 @@
|
|||||||
|
local _ENV = mkmodule('plugins.pathable')
|
||||||
|
|
||||||
|
--[[
|
||||||
|
|
||||||
|
Native functions: (see Plugins.rst for details)
|
||||||
|
|
||||||
|
- paintScreen(cursor[,skip_unrevealed])
|
||||||
|
|
||||||
|
]]
|
||||||
|
|
||||||
|
return _ENV
|
@ -0,0 +1,90 @@
|
|||||||
|
#include "Console.h"
|
||||||
|
#include "Core.h"
|
||||||
|
#include "DataDefs.h"
|
||||||
|
#include "DataFuncs.h"
|
||||||
|
#include "DataIdentity.h"
|
||||||
|
#include "Export.h"
|
||||||
|
#include "LuaTools.h"
|
||||||
|
#include "PluginManager.h"
|
||||||
|
#include "modules/Gui.h"
|
||||||
|
#include "modules/Maps.h"
|
||||||
|
#include "modules/Screen.h"
|
||||||
|
#include "df/world.h"
|
||||||
|
|
||||||
|
using namespace DFHack;
|
||||||
|
|
||||||
|
DFHACK_PLUGIN("pathable");
|
||||||
|
REQUIRE_GLOBAL(world);
|
||||||
|
REQUIRE_GLOBAL(window_x);
|
||||||
|
REQUIRE_GLOBAL(window_y);
|
||||||
|
REQUIRE_GLOBAL(window_z);
|
||||||
|
|
||||||
|
DFhackCExport command_result plugin_init(color_ostream &out, std::vector<PluginCommand> &commands)
|
||||||
|
{
|
||||||
|
return CR_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
DFhackCExport command_result plugin_shutdown(color_ostream &out)
|
||||||
|
{
|
||||||
|
return CR_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void paintScreen(df::coord cursor, bool skip_unrevealed = false)
|
||||||
|
{
|
||||||
|
auto dims = Gui::getDwarfmodeViewDims();
|
||||||
|
for (int y = dims.map_y1; y <= dims.map_y2; y++)
|
||||||
|
{
|
||||||
|
for (int x = dims.map_x1; x <= dims.map_x2; x++)
|
||||||
|
{
|
||||||
|
Screen::Pen cur_tile = Screen::readTile(x, y, true);
|
||||||
|
if (!cur_tile.valid())
|
||||||
|
continue;
|
||||||
|
|
||||||
|
df::coord map_pos(
|
||||||
|
*window_x + x - dims.map_x1,
|
||||||
|
*window_y + y - dims.map_y1,
|
||||||
|
*window_z
|
||||||
|
);
|
||||||
|
|
||||||
|
// Keep yellow cursor
|
||||||
|
if (map_pos == cursor)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (map_pos.x < 0 || map_pos.x >= world->map.x_count ||
|
||||||
|
map_pos.y < 0 || map_pos.y >= world->map.y_count ||
|
||||||
|
map_pos.z < 0 || map_pos.z >= world->map.z_count)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (skip_unrevealed && !Maps::isTileVisible(map_pos))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
int color = Maps::canWalkBetween(cursor, map_pos) ? COLOR_GREEN : COLOR_RED;
|
||||||
|
|
||||||
|
if (cur_tile.fg && cur_tile.ch != ' ')
|
||||||
|
{
|
||||||
|
cur_tile.fg = color;
|
||||||
|
cur_tile.bg = 0;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
cur_tile.fg = 0;
|
||||||
|
cur_tile.bg = color;
|
||||||
|
}
|
||||||
|
|
||||||
|
cur_tile.bold = false;
|
||||||
|
|
||||||
|
if (cur_tile.tile)
|
||||||
|
cur_tile.tile_mode = Screen::Pen::CharColor;
|
||||||
|
|
||||||
|
Screen::paintTile(cur_tile, x, y, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
DFHACK_PLUGIN_LUA_FUNCTIONS {
|
||||||
|
DFHACK_LUA_FUNCTION(paintScreen),
|
||||||
|
DFHACK_LUA_END
|
||||||
|
};
|
||||||
|
|
@ -1 +1 @@
|
|||||||
Subproject commit 2840996c5f39917713cfb0e7ce1c6dca779177e1
|
Subproject commit 3baa24fec93461218b5b658de94884ebff0a0b23
|
Loading…
Reference in New Issue