summaryrefslogtreecommitdiff
path: root/plugins/workflow.cpp
diff options
context:
space:
mode:
authorValentin Ochs2012-08-06 16:55:55 +0200
committerValentin Ochs2012-08-06 16:55:55 +0200
commitbb760bd376c0a0b4b622cbab0e1a7fca40598ed9 (patch)
tree7a58b0805e71da0a8d5f9aca613a2210f15a8f1a /plugins/workflow.cpp
parent81ea0345ad8f9347ce6ef14bdd779ee1bef438a7 (diff)
downloaddfhack-bb760bd376c0a0b4b622cbab0e1a7fca40598ed9.tar.gz
dfhack-bb760bd376c0a0b4b622cbab0e1a7fca40598ed9.tar.bz2
dfhack-bb760bd376c0a0b4b622cbab0e1a7fca40598ed9.tar.xz
Added quality constraints to workflow plugin
Diffstat (limited to 'plugins/workflow.cpp')
-rw-r--r--plugins/workflow.cpp35
1 files changed, 30 insertions, 5 deletions
diff --git a/plugins/workflow.cpp b/plugins/workflow.cpp
index dbf54607..c2875a1b 100644
--- a/plugins/workflow.cpp
+++ b/plugins/workflow.cpp
@@ -20,6 +20,7 @@
#include "df/job_list_link.h"
#include "df/dfhack_material_category.h"
#include "df/item.h"
+#include "df/item_quality.h"
#include "df/items_other_id.h"
#include "df/tool_uses.h"
#include "df/general_ref.h"
@@ -42,6 +43,7 @@ using std::string;
using std::endl;
using namespace DFHack;
using namespace df::enums;
+using namespace df::enums::item_quality;
using df::global::world;
using df::global::ui;
@@ -283,6 +285,8 @@ struct ItemConstraint {
int weight;
std::vector<ProtectedJob*> jobs;
+ enum item_quality min_quality;
+
int item_amount, item_count, item_inuse;
bool request_suspend, request_resume;
@@ -293,7 +297,7 @@ struct ItemConstraint {
public:
ItemConstraint()
: is_craft(false), weight(0), item_amount(0), item_count(0), item_inuse(0)
- , is_active(false), cant_resume_reported(false)
+ , is_active(false), cant_resume_reported(false), min_quality(Ordinary)
{}
int goalCount() { return config.ival(0); }
@@ -646,7 +650,7 @@ static ItemConstraint *get_constraint(color_ostream &out, const std::string &str
std::vector<std::string> tokens;
split_string(&tokens, str, "/");
- if (tokens.size() > 3)
+ if (tokens.size() > 4)
return NULL;
int weight = 0;
@@ -670,10 +674,10 @@ static ItemConstraint *get_constraint(color_ostream &out, const std::string &str
out.printerr("Cannot decode material mask: %s\n", maskstr.c_str());
return NULL;
}
-
+
if (mat_mask.whole != 0)
weight += 100;
-
+
MaterialInfo material;
std::string matstr = vector_get(tokens,2);
if (!matstr.empty() && (!material.find(matstr) || !material.isValid())) {
@@ -681,6 +685,22 @@ static ItemConstraint *get_constraint(color_ostream &out, const std::string &str
return NULL;
}
+ enum item_quality minqual = Ordinary;
+ std::string qualstr = vector_get(tokens, 3);
+ if(!qualstr.empty()) {
+ if(qualstr == "ordinary") minqual = Ordinary;
+ else if(qualstr == "wellcrafted") minqual = WellCrafted;
+ else if(qualstr == "finelycrafted") minqual = FinelyCrafted;
+ else if(qualstr == "superior") minqual = Superior;
+ else if(qualstr == "exceptional") minqual = Exceptional;
+ else if(qualstr == "masterful") minqual = Masterful;
+ else {
+ out.printerr("Cannot find quality: %s\nKnown qualities: ordinary, wellcrafted, finelycrafted, superior, exceptional, masterful\n", qualstr.c_str());
+ return NULL;
+ }
+
+ }
+
if (material.type >= 0)
weight += (material.index >= 0 ? 5000 : 1000);
@@ -694,7 +714,8 @@ static ItemConstraint *get_constraint(color_ostream &out, const std::string &str
ItemConstraint *ct = constraints[i];
if (ct->is_craft == is_craft &&
ct->item == item && ct->material == material &&
- ct->mat_mask.whole == mat_mask.whole)
+ ct->mat_mask.whole == mat_mask.whole &&
+ ct->min_quality == minqual)
return ct;
}
@@ -703,6 +724,7 @@ static ItemConstraint *get_constraint(color_ostream &out, const std::string &str
nct->item = item;
nct->material = material;
nct->mat_mask = mat_mask;
+ nct->min_quality = minqual;
nct->weight = weight;
if (cfg)
@@ -1179,6 +1201,9 @@ static void map_job_items(color_ostream &out)
(cv->item.subtype != -1 && cv->item.subtype != isubtype))
continue;
}
+ if(item->getQuality() < cv->min_quality) {
+ continue;
+ }
TMaterialCache::iterator it = cv->material_cache.find(matkey);