diff --git a/plugins/dig-now.cpp b/plugins/dig-now.cpp index 6836a6331..9f961c817 100644 --- a/plugins/dig-now.cpp +++ b/plugins/dig-now.cpp @@ -6,6 +6,7 @@ #include "PluginManager.h" #include "TileTypes.h" #include "LuaTools.h" +#include "Debug.h" #include "modules/Buildings.h" #include "modules/Gui.h" @@ -26,10 +27,23 @@ #include #include +#include + DFHACK_PLUGIN("dig-now"); REQUIRE_GLOBAL(plotinfo); REQUIRE_GLOBAL(world); +// Debugging +namespace DFHack { + DBG_DECLARE(dignow, general, DebugCategory::LINFO); + DBG_DECLARE(dignow, channels, DebugCategory::LINFO); +} + +#define COORD "%" PRIi16 " %" PRIi16 " %" PRIi16 +#define COORDARGS(id) id.x, id.y, id.z + +// todo: integrate logging for debugging the layered channel problem + using namespace DFHack; struct boulder_percent_options { @@ -321,10 +335,19 @@ static bool dig_tile(color_ostream &out, MapExtras::MapCache &map, df::tiletype tt = map.tiletypeAt(pos); if (!is_diggable(map, pos, tt)) { - out.print("dig_tile: not diggable\n"); + DEBUG(general).print("dig_tile: not diggable\n"); return false; } + /** The algorithm process seems to be: + * for each tile + * check for a designation + * if a designation exists send it to dig_tile + * + * dig_tile (below) then digs the layer below the channel designated tile + * thereby changing it and causing its designation to be lost + * */ + df::tiletype target_type = df::tiletype::Void; switch(designation) { case df::tile_dig_designation::Default: @@ -344,6 +367,7 @@ static bool dig_tile(color_ostream &out, MapExtras::MapCache &map, // todo: does can_dig_channel return false? if (can_dig_channel(tt) && map.ensureBlockAt(pos_below) && is_diggable(map, pos_below, map.tiletypeAt(pos_below))) { + TRACE(channels).print("dig_tile: channeling at (" COORD ")\n",COORDARGS(pos_below)); target_type = df::tiletype::OpenSpace; DFCoord pos_above(pos.x, pos.y, pos.z+1); if (map.ensureBlockAt(pos_above)) { @@ -360,6 +384,8 @@ static bool dig_tile(color_ostream &out, MapExtras::MapCache &map, } return true; } + } else { + DEBUG(channels).print("dig_tile: failed to channel at (" COORD ")\n", COORDARGS(pos_below)); } break; } @@ -414,6 +440,7 @@ static bool dig_tile(color_ostream &out, MapExtras::MapCache &map, return false; dug_tiles.emplace_back(map, pos); + TRACE(general).print("dig_tile: digging the designation tile at (" COORD ")\n",COORDARGS(pos)); dig_type(map, pos, target_type); // let light filter down to newly exposed tiles @@ -613,6 +640,8 @@ static void do_dig(color_ostream &out, std::vector &dug_coords, continue; // todo: check if tile is in the job list with a dig type + // todo: if it is cancel the job. Then check if the designation is removed on the map + // todo: if the designation does disappear on the map, just rewrite things to queue the designation info that needs to be processed DFCoord pos(x, y, z); df::tile_designation td = map.designationAt(pos);