From 43fbd89c23ca8a06c713443c56b727a975c355dd Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Wed, 3 May 2023 18:01:11 -0700 Subject: [PATCH] first step at saving features --- docs/plugins/logistics.rst | 2 +- plugins/stockpiles/StockpileSerializer.cpp | 47 +++++++++++++--------- plugins/stockpiles/StockpileSerializer.h | 5 ++- plugins/stockpiles/stockpiles.cpp | 2 +- 4 files changed, 33 insertions(+), 23 deletions(-) diff --git a/docs/plugins/logistics.rst b/docs/plugins/logistics.rst index 466e806be..1b36caa21 100644 --- a/docs/plugins/logistics.rst +++ b/docs/plugins/logistics.rst @@ -3,7 +3,7 @@ logistics .. dfhack-tool:: :summary: Automatically mark and route items in monitored stockpiles. - :tags: fort productivity items stockpiles + :tags: fort auto items stockpiles Commands act upon the stockpile selected in the UI unless another stockpile identifier is specified on the commandline. diff --git a/plugins/stockpiles/StockpileSerializer.cpp b/plugins/stockpiles/StockpileSerializer.cpp index b030cd873..2908f3329 100644 --- a/plugins/stockpiles/StockpileSerializer.cpp +++ b/plugins/stockpiles/StockpileSerializer.cpp @@ -185,7 +185,7 @@ bool StockpileSettingsSerializer::serialize_to_file(const string& file, uint32_t return serialize_to_ostream(&output, includedElements); } -bool StockpileSettingsSerializer::parse_from_istream(std::istream* input, DeserializeMode mode, const vector& filters) { +bool StockpileSettingsSerializer::parse_from_istream(color_ostream &out, std::istream* input, DeserializeMode mode, const vector& filters) { if (input->fail()) return false; mBuffer.Clear(); @@ -193,18 +193,18 @@ bool StockpileSettingsSerializer::parse_from_istream(std::istream* input, Deseri const bool res = mBuffer.ParseFromZeroCopyStream(&zero_copy_input) && input->eof(); if (res) - read(mode, filters); + read(out, mode, filters); return res; } -bool StockpileSettingsSerializer::unserialize_from_file(const string& file, DeserializeMode mode, const vector& filters) { +bool StockpileSettingsSerializer::unserialize_from_file(color_ostream &out, const string& file, DeserializeMode mode, const vector& filters) { std::fstream input(file, std::ios::in | std::ios::binary); if (input.fail()) { WARN(log).print("failed to open file for reading: '%s'\n", file.c_str()); return false; } - return parse_from_istream(&input, mode, filters); + return parse_from_istream(out, &input, mode, filters); } /** @@ -768,13 +768,15 @@ void StockpileSettingsSerializer::write(uint32_t includedElements) { } void StockpileSerializer::write(uint32_t includedElements) { + if (includedElements & INCLUDED_ELEMENTS_FEATURES) + write_features(); if (includedElements & INCLUDED_ELEMENTS_CONTAINERS) write_containers(); StockpileSettingsSerializer::write(includedElements); } -void StockpileSettingsSerializer::read(DeserializeMode mode, const vector& filters) { +void StockpileSettingsSerializer::read(color_ostream &out, DeserializeMode mode, const vector& filters) { DEBUG(log).print("==READ==\n"); read_general(mode); read_ammo(mode, filters); @@ -803,7 +805,8 @@ void StockpileSettingsSerializer::read(DeserializeMode mode, const vector& filters) { +void StockpileSerializer::read(color_ostream &out, DeserializeMode mode, const vector& filters) { + read_features(out, mode); read_containers(mode); StockpileSettingsSerializer::read(mode, filters); } @@ -913,19 +916,25 @@ void StockpileSerializer::write_features() { mBuffer.set_dump(mPile->settings.allow_organic); } -void StockpileSerializer::read_features(DeserializeMode mode) { - read_elem("use_links_only", mode, - std::bind(&StockpileSettings::has_use_links_only, mBuffer), - std::bind(&StockpileSettings::use_links_only, mBuffer), - mPile->use_links_only); - read_elem("allow_inorganic", mode, - std::bind(&StockpileSettings::has_allow_inorganic, mBuffer), - std::bind(&StockpileSettings::allow_inorganic, mBuffer), - mPile->settings.allow_inorganic); - read_elem("allow_organic", mode, - std::bind(&StockpileSettings::has_allow_organic, mBuffer), - std::bind(&StockpileSettings::allow_organic, mBuffer), - mPile->settings.allow_organic); +void StockpileSerializer::read_features(color_ostream &out, DeserializeMode mode) { + int32_t melt = -1, trade = -1, dump = -1; + read_elem("melt", mode, + std::bind(&StockpileSettings::has_melt, mBuffer), + std::bind(&StockpileSettings::melt, mBuffer), + melt); + read_elem("trade", mode, + std::bind(&StockpileSettings::has_trade, mBuffer), + std::bind(&StockpileSettings::trade, mBuffer), + trade); + read_elem("dump", mode, + std::bind(&StockpileSettings::has_dump, mBuffer), + std::bind(&StockpileSettings::dump, mBuffer), + dump); + + if (melt != -1 || trade != -1 || dump != -1) { + auto &core = Core::getInstance(); + core.runCommand(out, "logistics clear -s " + int_to_string(mPile->stockpile_number)); + } } static bool ammo_mat_is_allowed(const MaterialInfo& mi) { diff --git a/plugins/stockpiles/StockpileSerializer.h b/plugins/stockpiles/StockpileSerializer.h index 70e8909da..f8d122ac2 100644 --- a/plugins/stockpiles/StockpileSerializer.h +++ b/plugins/stockpiles/StockpileSerializer.h @@ -21,6 +21,7 @@ enum IncludedElements { INCLUDED_ELEMENTS_GENERAL = 0x02, INCLUDED_ELEMENTS_CATEGORIES = 0x04, INCLUDED_ELEMENTS_TYPES = 0x08, + INCLUDED_ELEMENTS_FEATURES = 0x10, }; enum DeserializeMode { @@ -82,12 +83,12 @@ public: /** * Again, copied from message.cc */ - bool parse_from_istream(std::istream* input, DeserializeMode mode, const std::vector& filters); + bool parse_from_istream(DFHack::color_ostream &out, std::istream* input, DeserializeMode mode, const std::vector& filters); /** * Read stockpile settings from file */ - bool unserialize_from_file(const std::string& file, DeserializeMode mode, const std::vector& filters); + bool unserialize_from_file(DFHack::color_ostream &out, const std::string& file, DeserializeMode mode, const std::vector& filters); protected: dfstockpiles::StockpileSettings mBuffer; diff --git a/plugins/stockpiles/stockpiles.cpp b/plugins/stockpiles/stockpiles.cpp index 23ceb849b..a289337a9 100644 --- a/plugins/stockpiles/stockpiles.cpp +++ b/plugins/stockpiles/stockpiles.cpp @@ -134,7 +134,7 @@ static bool stockpiles_import(color_ostream& out, string fname, int id, string m try { StockpileSerializer cereal(sp); - if (!cereal.unserialize_from_file(fname, mode, filters)) { + if (!cereal.unserialize_from_file(out, fname, mode, filters)) { out.printerr("deserialization failed: '%s'\n", fname.c_str()); return false; }