|
|
@ -1,37 +1,21 @@
|
|
|
|
|
|
|
|
|
|
|
|
#include "Debug.h"
|
|
|
|
#include "Debug.h"
|
|
|
|
#include "LuaTools.h"
|
|
|
|
#include "LuaTools.h"
|
|
|
|
#include "PluginManager.h"
|
|
|
|
#include "PluginManager.h"
|
|
|
|
#include "TileTypes.h"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#include "modules/Buildings.h"
|
|
|
|
#include "modules/Buildings.h"
|
|
|
|
#include "modules/Maps.h"
|
|
|
|
|
|
|
|
#include "modules/Items.h"
|
|
|
|
#include "modules/Items.h"
|
|
|
|
#include "modules/World.h"
|
|
|
|
#include "modules/World.h"
|
|
|
|
#include "modules/Designations.h"
|
|
|
|
|
|
|
|
#include "modules/Persistence.h"
|
|
|
|
#include "modules/Persistence.h"
|
|
|
|
#include "modules/Units.h"
|
|
|
|
|
|
|
|
#include "modules/Screen.h"
|
|
|
|
|
|
|
|
#include "modules/Gui.h"
|
|
|
|
#include "modules/Gui.h"
|
|
|
|
|
|
|
|
|
|
|
|
// #include "uicommon.h"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#include "df/world.h"
|
|
|
|
#include "df/world.h"
|
|
|
|
#include "df/building.h"
|
|
|
|
|
|
|
|
#include "df/world_raws.h"
|
|
|
|
|
|
|
|
#include "df/building_def.h"
|
|
|
|
|
|
|
|
#include "df/viewscreen_dwarfmodest.h"
|
|
|
|
|
|
|
|
#include "df/building_stockpilest.h"
|
|
|
|
#include "df/building_stockpilest.h"
|
|
|
|
#include "df/plotinfost.h"
|
|
|
|
|
|
|
|
#include "df/item_quality.h"
|
|
|
|
#include "df/item_quality.h"
|
|
|
|
|
|
|
|
|
|
|
|
#include <map>
|
|
|
|
#include <map>
|
|
|
|
#include <unordered_map>
|
|
|
|
#include <unordered_map>
|
|
|
|
|
|
|
|
|
|
|
|
using df::building_stockpilest;
|
|
|
|
|
|
|
|
using std::map;
|
|
|
|
using std::map;
|
|
|
|
using std::multimap;
|
|
|
|
|
|
|
|
using std::pair;
|
|
|
|
|
|
|
|
using std::string;
|
|
|
|
using std::string;
|
|
|
|
using std::unordered_map;
|
|
|
|
using std::unordered_map;
|
|
|
|
using std::vector;
|
|
|
|
using std::vector;
|
|
|
@ -41,10 +25,7 @@ using namespace df::enums;
|
|
|
|
|
|
|
|
|
|
|
|
DFHACK_PLUGIN("automelt");
|
|
|
|
DFHACK_PLUGIN("automelt");
|
|
|
|
DFHACK_PLUGIN_IS_ENABLED(is_enabled);
|
|
|
|
DFHACK_PLUGIN_IS_ENABLED(is_enabled);
|
|
|
|
REQUIRE_GLOBAL(gps);
|
|
|
|
|
|
|
|
REQUIRE_GLOBAL(world);
|
|
|
|
REQUIRE_GLOBAL(world);
|
|
|
|
REQUIRE_GLOBAL(cursor);
|
|
|
|
|
|
|
|
REQUIRE_GLOBAL(plotinfo);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
namespace DFHack
|
|
|
|
namespace DFHack
|
|
|
|
{
|
|
|
|
{
|
|
|
@ -57,16 +38,12 @@ static const string CONFIG_KEY = string(plugin_name) + "/config";
|
|
|
|
static const string STOCKPILE_CONFIG_KEY_PREFIX = string(plugin_name) + "/stockpile/";
|
|
|
|
static const string STOCKPILE_CONFIG_KEY_PREFIX = string(plugin_name) + "/stockpile/";
|
|
|
|
static PersistentDataItem config;
|
|
|
|
static PersistentDataItem config;
|
|
|
|
|
|
|
|
|
|
|
|
// static vector<PersistentDataItem> watched_stockpiles;
|
|
|
|
|
|
|
|
// static unordered_map<int, size_t> watched_stockpiles_indices;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static unordered_map<int32_t, PersistentDataItem> watched_stockpiles;
|
|
|
|
static unordered_map<int32_t, PersistentDataItem> watched_stockpiles;
|
|
|
|
|
|
|
|
|
|
|
|
enum StockpileConfigValues
|
|
|
|
enum StockpileConfigValues
|
|
|
|
{
|
|
|
|
{
|
|
|
|
STOCKPILE_CONFIG_ID = 0,
|
|
|
|
STOCKPILE_CONFIG_ID = 0,
|
|
|
|
STOCKPILE_CONFIG_MONITORED = 1,
|
|
|
|
STOCKPILE_CONFIG_MONITORED = 1,
|
|
|
|
|
|
|
|
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
static int get_config_val(PersistentDataItem &c, int index)
|
|
|
|
static int get_config_val(PersistentDataItem &c, int index)
|
|
|
@ -115,8 +92,8 @@ static void remove_stockpile_config(color_ostream &out, int id)
|
|
|
|
watched_stockpiles.erase(id);
|
|
|
|
watched_stockpiles.erase(id);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
static bool isStockpile(df::building * building) {
|
|
|
|
static bool isStockpile(df::building * bld) {
|
|
|
|
return building->getType() == df::building_type::Stockpile;
|
|
|
|
return bld && bld->getType() == df::building_type::Stockpile;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
static void validate_stockpile_configs(color_ostream &out)
|
|
|
|
static void validate_stockpile_configs(color_ostream &out)
|
|
|
@ -124,7 +101,7 @@ static void validate_stockpile_configs(color_ostream &out)
|
|
|
|
for (auto &c : watched_stockpiles) {
|
|
|
|
for (auto &c : watched_stockpiles) {
|
|
|
|
int id = get_config_val(c.second, STOCKPILE_CONFIG_ID);
|
|
|
|
int id = get_config_val(c.second, STOCKPILE_CONFIG_ID);
|
|
|
|
auto bld = df::building::find(id);
|
|
|
|
auto bld = df::building::find(id);
|
|
|
|
if (!bld || !isStockpile(bld))
|
|
|
|
if (!isStockpile(bld))
|
|
|
|
remove_stockpile_config(out, id);
|
|
|
|
remove_stockpile_config(out, id);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
@ -135,7 +112,7 @@ static int32_t cycle_timestamp = 0; // world->frame_counter at last cycle
|
|
|
|
static command_result do_command(color_ostream &out, vector<string> ¶meters);
|
|
|
|
static command_result do_command(color_ostream &out, vector<string> ¶meters);
|
|
|
|
static int32_t do_cycle(color_ostream &out);
|
|
|
|
static int32_t do_cycle(color_ostream &out);
|
|
|
|
|
|
|
|
|
|
|
|
DFhackCExport command_result plugin_init(color_ostream &out, std::vector<PluginCommand> &commands)
|
|
|
|
DFhackCExport command_result plugin_init(color_ostream &out, vector<PluginCommand> &commands)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
DEBUG(status, out).print("initializing %s\n", plugin_name);
|
|
|
|
DEBUG(status, out).print("initializing %s\n", plugin_name);
|
|
|
|
|
|
|
|
|
|
|
@ -222,7 +199,6 @@ DFhackCExport command_result plugin_onupdate(color_ostream &out)
|
|
|
|
return CR_OK;
|
|
|
|
return CR_OK;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static bool call_automelt_lua(color_ostream *out, const char *fn_name,
|
|
|
|
static bool call_automelt_lua(color_ostream *out, const char *fn_name,
|
|
|
|
int nargs = 0, int nres = 0,
|
|
|
|
int nargs = 0, int nres = 0,
|
|
|
|
Lua::LuaLambda && args_lambda = Lua::DEFAULT_LUA_LAMBDA,
|
|
|
|
Lua::LuaLambda && args_lambda = Lua::DEFAULT_LUA_LAMBDA,
|
|
|
@ -268,6 +244,8 @@ static command_result do_command(color_ostream &out, vector<string> ¶meters)
|
|
|
|
|
|
|
|
|
|
|
|
static inline bool is_metal_item(df::item *item)
|
|
|
|
static inline bool is_metal_item(df::item *item)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
|
|
|
|
if (!item)
|
|
|
|
|
|
|
|
return false;
|
|
|
|
MaterialInfo mat(item);
|
|
|
|
MaterialInfo mat(item);
|
|
|
|
return (mat.getCraftClass() == craft_material_class::Metal);
|
|
|
|
return (mat.getCraftClass() == craft_material_class::Metal);
|
|
|
|
}
|
|
|
|
}
|
|
|
@ -307,6 +285,9 @@ static inline bool can_melt(df::item *item)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
static const BadFlagsCanMelt bad_flags;
|
|
|
|
static const BadFlagsCanMelt bad_flags;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (!is_metal_item(item))
|
|
|
|
|
|
|
|
return false;
|
|
|
|
|
|
|
|
|
|
|
|
if (item->flags.whole & bad_flags.whole)
|
|
|
|
if (item->flags.whole & bad_flags.whole)
|
|
|
|
return false;
|
|
|
|
return false;
|
|
|
|
|
|
|
|
|
|
|
@ -315,9 +296,6 @@ static inline bool can_melt(df::item *item)
|
|
|
|
if (t == df::enums::item_type::BOX || t == df::enums::item_type::BAR)
|
|
|
|
if (t == df::enums::item_type::BOX || t == df::enums::item_type::BAR)
|
|
|
|
return false;
|
|
|
|
return false;
|
|
|
|
|
|
|
|
|
|
|
|
if (!is_metal_item(item))
|
|
|
|
|
|
|
|
return false;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
for (auto &g : item->general_refs)
|
|
|
|
for (auto &g : item->general_refs)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
switch (g->getType())
|
|
|
|
switch (g->getType())
|
|
|
@ -372,7 +350,7 @@ static int mark_item(color_ostream &out, df::item *item, BadFlagsMarkItem bad_fl
|
|
|
|
{
|
|
|
|
{
|
|
|
|
DEBUG(perf,out).print("assignedToStockpile\n");
|
|
|
|
DEBUG(perf,out).print("assignedToStockpile\n");
|
|
|
|
size_t marked_count = 0;
|
|
|
|
size_t marked_count = 0;
|
|
|
|
std::vector<df::item *> contents;
|
|
|
|
vector<df::item *> contents;
|
|
|
|
Items::getContainedItems(item, &contents);
|
|
|
|
Items::getContainedItems(item, &contents);
|
|
|
|
for (auto child = contents.begin(); child != contents.end(); child++)
|
|
|
|
for (auto child = contents.begin(); child != contents.end(); child++)
|
|
|
|
{
|
|
|
|
{
|
|
|
@ -414,7 +392,6 @@ static int mark_item(color_ostream &out, df::item *item, BadFlagsMarkItem bad_fl
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static int32_t mark_all_in_stockpile(color_ostream &out, PersistentDataItem & stockpile, int32_t &premarked_item_count, int32_t &item_count, map<int32_t, bool> &tracked_item_map, bool should_melt)
|
|
|
|
static int32_t mark_all_in_stockpile(color_ostream &out, PersistentDataItem & stockpile, int32_t &premarked_item_count, int32_t &item_count, map<int32_t, bool> &tracked_item_map, bool should_melt)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
DEBUG(perf,out).print("%s running mark_all_in_stockpile\nshould_melt=%d\n", plugin_name, should_melt);
|
|
|
|
DEBUG(perf,out).print("%s running mark_all_in_stockpile\nshould_melt=%d\n", plugin_name, should_melt);
|
|
|
@ -429,10 +406,8 @@ static int32_t mark_all_in_stockpile(color_ostream &out, PersistentDataItem & st
|
|
|
|
|
|
|
|
|
|
|
|
int spid = get_config_val(stockpile, STOCKPILE_CONFIG_ID);
|
|
|
|
int spid = get_config_val(stockpile, STOCKPILE_CONFIG_ID);
|
|
|
|
auto found = df::building::find(spid);
|
|
|
|
auto found = df::building::find(spid);
|
|
|
|
if (!isStockpile(found)){
|
|
|
|
if (!isStockpile(found))
|
|
|
|
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
df::building_stockpilest * pile_cast = virtual_cast<df::building_stockpilest>(found);
|
|
|
|
df::building_stockpilest * pile_cast = virtual_cast<df::building_stockpilest>(found);
|
|
|
|
|
|
|
|
|
|
|
@ -451,7 +426,6 @@ static int32_t mark_all_in_stockpile(color_ostream &out, PersistentDataItem & st
|
|
|
|
return marked_count;
|
|
|
|
return marked_count;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static int32_t scan_stockpiles(color_ostream &out, bool should_melt, map<int32_t, int32_t> &item_count_piles, map<int32_t, int32_t> &premarked_item_count_piles,
|
|
|
|
static int32_t scan_stockpiles(color_ostream &out, bool should_melt, map<int32_t, int32_t> &item_count_piles, map<int32_t, int32_t> &premarked_item_count_piles,
|
|
|
|
map<int32_t, int32_t> &marked_item_count_piles, map<int32_t, bool> &tracked_item_map) {
|
|
|
|
map<int32_t, int32_t> &marked_item_count_piles, map<int32_t, bool> &tracked_item_map) {
|
|
|
|
DEBUG(perf,out).print("running scan_stockpiles\n");
|
|
|
|
DEBUG(perf,out).print("running scan_stockpiles\n");
|
|
|
@ -518,8 +492,6 @@ static int32_t scan_count_all(color_ostream &out, bool should_melt, int32_t &mar
|
|
|
|
|
|
|
|
|
|
|
|
map<int32_t, bool> tracked_item_map_piles;
|
|
|
|
map<int32_t, bool> tracked_item_map_piles;
|
|
|
|
|
|
|
|
|
|
|
|
tracked_item_map_piles.clear();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
newly_marked_items_piles = scan_stockpiles(out, should_melt, item_count_piles, premarked_item_count_piles, marked_item_count_piles, tracked_item_map_piles);
|
|
|
|
newly_marked_items_piles = scan_stockpiles(out, should_melt, item_count_piles, premarked_item_count_piles, marked_item_count_piles, tracked_item_map_piles);
|
|
|
|
marked_item_count_global = scan_all_melt_designated(out, tracked_item_map_piles);
|
|
|
|
marked_item_count_global = scan_all_melt_designated(out, tracked_item_map_piles);
|
|
|
|
|
|
|
|
|
|
|
@ -557,20 +529,18 @@ static int32_t do_cycle(color_ostream &out) {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
static int getSelectedStockpile(color_ostream &out) {
|
|
|
|
static int getSelectedStockpile(color_ostream &out) {
|
|
|
|
df::building *selected_bldg = NULL;
|
|
|
|
df::building *bld = Gui::getSelectedBuilding(out, true);
|
|
|
|
selected_bldg = Gui::getSelectedBuilding(out, true);
|
|
|
|
if (!isStockpile(bld)) {
|
|
|
|
if (selected_bldg->getType() != df::building_type::Stockpile) {
|
|
|
|
|
|
|
|
DEBUG(status,out).print("Selected building is not stockpile\n");
|
|
|
|
DEBUG(status,out).print("Selected building is not stockpile\n");
|
|
|
|
return -1;
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return selected_bldg->id;
|
|
|
|
return bld->id;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
static PersistentDataItem *getSelectedStockpileConfig(color_ostream &out) {
|
|
|
|
static PersistentDataItem *getSelectedStockpileConfig(color_ostream &out) {
|
|
|
|
int32_t bldg_id = getSelectedStockpile(out);
|
|
|
|
int32_t bldg_id = getSelectedStockpile(out);
|
|
|
|
if (bldg_id == -1) {
|
|
|
|
if (bldg_id == -1) {
|
|
|
|
DEBUG(status,out).print("Selected bldg invalid\n");
|
|
|
|
|
|
|
|
return NULL;
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
@ -579,11 +549,10 @@ static PersistentDataItem *getSelectedStockpileConfig(color_ostream &out) {
|
|
|
|
if (watched_stockpiles.count(bldg_id)) {
|
|
|
|
if (watched_stockpiles.count(bldg_id)) {
|
|
|
|
c = &(watched_stockpiles[bldg_id]);
|
|
|
|
c = &(watched_stockpiles[bldg_id]);
|
|
|
|
return c;
|
|
|
|
return c;
|
|
|
|
} else {
|
|
|
|
|
|
|
|
DEBUG(status,out).print("No existing config\n");
|
|
|
|
|
|
|
|
return NULL;
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
DEBUG(status,out).print("No existing config\n");
|
|
|
|
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
static void push_stockpile_config(lua_State *L, int id, bool monitored) {
|
|
|
|
static void push_stockpile_config(lua_State *L, int id, bool monitored) {
|
|
|
@ -671,7 +640,7 @@ static void automelt_setStockpileConfig(color_ostream &out, int id, bool monitor
|
|
|
|
DEBUG(status,out).print("entering automelt_setStockpileConfig for id=%d and monitored=%d\n", id, monitored);
|
|
|
|
DEBUG(status,out).print("entering automelt_setStockpileConfig for id=%d and monitored=%d\n", id, monitored);
|
|
|
|
validate_stockpile_configs(out);
|
|
|
|
validate_stockpile_configs(out);
|
|
|
|
auto bldg = df::building::find(id);
|
|
|
|
auto bldg = df::building::find(id);
|
|
|
|
bool isInvalidStockpile = !bldg || !isStockpile(bldg);
|
|
|
|
bool isInvalidStockpile = !isStockpile(bldg);
|
|
|
|
bool hasNoData = !monitored;
|
|
|
|
bool hasNoData = !monitored;
|
|
|
|
if (isInvalidStockpile || hasNoData) {
|
|
|
|
if (isInvalidStockpile || hasNoData) {
|
|
|
|
DEBUG(cycle,out).print("calling remove_stockpile_config with id=%d monitored=%d\n", id, monitored);
|
|
|
|
DEBUG(cycle,out).print("calling remove_stockpile_config with id=%d monitored=%d\n", id, monitored);
|
|
|
@ -767,7 +736,6 @@ static int automelt_getSelectedStockpileConfig(lua_State *L){
|
|
|
|
return 1;
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//TODO
|
|
|
|
|
|
|
|
static int automelt_getItemCountsAndStockpileConfigs(lua_State *L) {
|
|
|
|
static int automelt_getItemCountsAndStockpileConfigs(lua_State *L) {
|
|
|
|
color_ostream *out = Lua::GetOutput(L);
|
|
|
|
color_ostream *out = Lua::GetOutput(L);
|
|
|
|
if (!out)
|
|
|
|
if (!out)
|
|
|
|