Merge remote-tracking branch 'myk002/myk_metalhead_mario' into develop

develop
lethosor 2020-11-13 14:04:30 -05:00
commit 8cb38ecf5b
No known key found for this signature in database
GPG Key ID: 76A269552F4F58C1
9 changed files with 24 additions and 12 deletions

@ -1132,7 +1132,7 @@ Job module
Does basic sanity checks to verify if the suggested item type matches Does basic sanity checks to verify if the suggested item type matches
the flags in the job item. the flags in the job item.
* ``dfhack.job.isSuitableMaterial(job_item, mat_type, mat_index)`` * ``dfhack.job.isSuitableMaterial(job_item, mat_type, mat_index, item_type)``
Likewise, if replacing material. Likewise, if replacing material.

@ -51,6 +51,7 @@ changelog.txt uses a syntax similar to RST, with a few special sequences:
## API ## API
- `buildingplan`: added Lua interface API - `buildingplan`: added Lua interface API
- add item type param to dfhack.job.isSuitableMaterial() so the non_economic flag can be properly handled (it was being matched for all item types instead of just boulders)
# 0.47.04-r3 # 0.47.04-r3

@ -88,7 +88,9 @@ namespace DFHack
bool find(const std::string &token); bool find(const std::string &token);
bool matches(df::job_item_vector_id vec_id); bool matches(df::job_item_vector_id vec_id);
bool matches(const df::job_item &item, MaterialInfo *mat = NULL, bool skip_vector = false); bool matches(const df::job_item &item, MaterialInfo *mat = NULL,
bool skip_vector = false,
df::item_type itype = df::item_type::NONE);
}; };
inline bool operator== (const ItemTypeInfo &a, const ItemTypeInfo &b) { inline bool operator== (const ItemTypeInfo &a, const ItemTypeInfo &b) {

@ -102,7 +102,9 @@ namespace DFHack
int filter_idx = -1, int insert_idx = -1); int filter_idx = -1, int insert_idx = -1);
DFHACK_EXPORT bool isSuitableItem(df::job_item *item, df::item_type itype, int isubtype); DFHACK_EXPORT bool isSuitableItem(df::job_item *item, df::item_type itype, int isubtype);
DFHACK_EXPORT bool isSuitableMaterial(df::job_item *item, int mat_type, int mat_index); DFHACK_EXPORT bool isSuitableMaterial(df::job_item *item, int mat_type,
int mat_index,
df::item_type itype);
DFHACK_EXPORT std::string getName(df::job *job); DFHACK_EXPORT std::string getName(df::job *job);
} }

@ -156,7 +156,8 @@ namespace DFHack
bool matches(const df::job_material_category &cat); bool matches(const df::job_material_category &cat);
bool matches(const df::dfhack_material_category &cat); bool matches(const df::dfhack_material_category &cat);
bool matches(const df::job_item &item); bool matches(const df::job_item &item,
df::item_type itype = df::item_type::NONE);
}; };
DFHACK_EXPORT bool parseJobMaterialCategory(df::job_material_category *cat, const std::string &token); DFHACK_EXPORT bool parseJobMaterialCategory(df::job_material_category *cat, const std::string &token);

@ -279,12 +279,13 @@ bool ItemTypeInfo::matches(df::job_item_vector_id vec_id)
return true; return true;
} }
bool ItemTypeInfo::matches(const df::job_item &item, MaterialInfo *mat, bool skip_vector) bool ItemTypeInfo::matches(const df::job_item &item, MaterialInfo *mat,
bool skip_vector, df::item_type itype)
{ {
using namespace df::enums::item_type; using namespace df::enums::item_type;
if (!isValid()) if (!isValid())
return mat ? mat->matches(item) : false; return mat ? mat->matches(item, itype) : false;
if (Items::isCasteMaterial(type) && mat && !mat->isNone()) if (Items::isCasteMaterial(type) && mat && !mat->isNone())
return false; return false;

@ -605,10 +605,11 @@ bool Job::isSuitableItem(df::job_item *item, df::item_type itype, int isubtype)
ItemTypeInfo iinfo(itype, isubtype); ItemTypeInfo iinfo(itype, isubtype);
MaterialInfo minfo(item); MaterialInfo minfo(item);
return iinfo.isValid() && iinfo.matches(*item, &minfo); return iinfo.isValid() && iinfo.matches(*item, &minfo, false, itype);
} }
bool Job::isSuitableMaterial(df::job_item *item, int mat_type, int mat_index) bool Job::isSuitableMaterial(
df::job_item *item, int mat_type, int mat_index, df::item_type itype)
{ {
CHECK_NULL_POINTER(item); CHECK_NULL_POINTER(item);
@ -618,7 +619,7 @@ bool Job::isSuitableMaterial(df::job_item *item, int mat_type, int mat_index)
ItemTypeInfo iinfo(item); ItemTypeInfo iinfo(item);
MaterialInfo minfo(mat_type, mat_index); MaterialInfo minfo(mat_type, mat_index);
return minfo.isValid() && iinfo.matches(*item, &minfo); return minfo.isValid() && iinfo.matches(*item, &minfo, false, itype);
} }
std::string Job::getName(df::job *job) std::string Job::getName(df::job *job)

@ -444,19 +444,22 @@ bool MaterialInfo::matches(const df::dfhack_material_category &cat)
#undef TEST #undef TEST
bool MaterialInfo::matches(const df::job_item &item) bool MaterialInfo::matches(const df::job_item &item, df::item_type itype)
{ {
if (!isValid()) return false; if (!isValid()) return false;
df::job_item_flags1 ok1, mask1; df::job_item_flags1 ok1, mask1;
getMatchBits(ok1, mask1); getMatchBits(ok1, mask1);
df::job_item_flags2 ok2, mask2; df::job_item_flags2 ok2, mask2, xmask2;
getMatchBits(ok2, mask2); getMatchBits(ok2, mask2);
df::job_item_flags3 ok3, mask3; df::job_item_flags3 ok3, mask3;
getMatchBits(ok3, mask3); getMatchBits(ok3, mask3);
xmask2.bits.non_economic = itype != df::item_type::BOULDER;
mask2.whole &= ~xmask2.whole;
return bits_match(item.flags1.whole, ok1.whole, mask1.whole) && return bits_match(item.flags1.whole, ok1.whole, mask1.whole) &&
bits_match(item.flags2.whole, ok2.whole, mask2.whole) && bits_match(item.flags2.whole, ok2.whole, mask2.whole) &&
bits_match(item.flags3.whole, ok3.whole, mask3.whole); bits_match(item.flags3.whole, ok3.whole, mask3.whole);

@ -825,7 +825,8 @@ static bool matchesFilters(df::item * item,
return DFHack::Job::isSuitableItem( return DFHack::Job::isSuitableItem(
job_item, item->getType(), item->getSubtype()) job_item, item->getType(), item->getSubtype())
&& DFHack::Job::isSuitableMaterial( && DFHack::Job::isSuitableMaterial(
job_item, item->getMaterial(), item->getMaterialIndex()) job_item, item->getMaterial(), item->getMaterialIndex(),
item->getType())
&& item_filter.matches(item); && item_filter.matches(item);
} }