From ea307bd0839926d1d8047c9f500b92c0ab22fe35 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Petr=20Mr=C3=A1zek?= Date: Wed, 10 Feb 2010 23:49:55 +0000 Subject: [PATCH] fixed dfitemdesignator crash bugs --- tools/itemdesignator.cpp | 119 +++++++++++++++++++++++++-------------- 1 file changed, 78 insertions(+), 41 deletions(-) diff --git a/tools/itemdesignator.cpp b/tools/itemdesignator.cpp index eb03920e6..9c4c87281 100644 --- a/tools/itemdesignator.cpp +++ b/tools/itemdesignator.cpp @@ -20,53 +20,62 @@ struct matGlosses vector creatureMat; }; -string getMaterialType(DFHack::t_item item, const vector & buildingTypes,const matGlosses & mat){ - if(item.type == 85 || item.type == 113 || item.type == 117) // item_plant or item_thread or item_seeds +const char * getMaterialType(DFHack::t_item item, const vector & buildingTypes,const matGlosses & mat) +{ + string itemtype = buildingTypes[item.type]; + // plant thread seeds + if(itemtype == "item_plant" || itemtype == "item_thread" || itemtype == "item_seeds" || itemtype == "item_leaves") { - return(string(mat.plantMat[item.material.type].id)); - } - else if(item.type == 109 || item.type == 114 || item.type == 115 || item.type == 116 || item.type==128 || item.type == 129|| item.type == 130|| item.type == 131) // item_skin_raw item_bones item_skill item_fish_raw item_pet item_skin_tanned item_shell + return mat.plantMat[item.material.type].id; + } + // item_skin_raw item_bones item_skull item_fish_raw item_pet item_skin_tanned item_shell + else if(itemtype == "item_skin_raw" || + itemtype == "item_skin_tanned" || + itemtype == "item_fish_raw" || + itemtype == "item_pet" || + itemtype == "item_shell" || + itemtype == "item_horn"|| + itemtype == "item_skull" || + itemtype == "item_bones" || + itemtype == "item_corpse" + ) { - return(string(mat.creatureMat[item.material.type].id)); - } - else if(item.type == 124){ //wood - return(string(mat.woodMat[item.material.type].id)); + return mat.creatureMat[item.material.type].id; } - else if(item.type == 118){ //blocks - return(string(mat.metalMat[item.material.index].id)); - } - else if(item.type == 86){ // item_glob I don't know what those are in game, just ignore them - return(string("")); + else if(itemtype == "item_wood") + { + return mat.woodMat[item.material.type].id; } - else{ + else + { switch (item.material.type) { case 0: - return(string(mat.woodMat[item.material.index].id)); + return mat.woodMat[item.material.index].id; break; case 1: - return(string(mat.stoneMat[item.material.index].id)); + return mat.stoneMat[item.material.index].id; break; case 2: - return(string(mat.metalMat[item.material.index].id)); + return mat.metalMat[item.material.index].id; break; case 12: // don't ask me why this has such a large jump, maybe this is not actually the matType for plants, but they all have this set to 12 - return(string(mat.plantMat[item.material.index].id)); + return mat.plantMat[item.material.index].id; break; case 3: case 9: case 10: case 11: case 121: - return(string(mat.creatureMat[item.material.index].id)); + return mat.creatureMat[item.material.index].id; break; default: - //DF.setCursorCoords(item.x,item.y,item.z); - return(string("")); + return 0; } } } -void printItem(DFHack::t_item item, const vector & buildingTypes,const matGlosses & mat){ +void printItem(DFHack::t_item item, const vector & buildingTypes,const matGlosses & mat) +{ cout << dec << "Item at x:" << item.x << " y:" << item.y << " z:" << item.z << endl; cout << "Type: " << (int) item.type << " " << buildingTypes[item.type] << " Address: " << hex << item.origin << endl; cout << "Material: "; @@ -78,12 +87,14 @@ int main () { DFHack::API DF ("Memory.xml"); - + cout << "This utility lets you mass-designate items by type and material." << endl <<"Like set on fire all MICROCLINE item_stone..." << endl + << "Some unusual combinations might be untested and cause the program to crash..."<< endl << "so, watch your step and backup your fort" << endl; if(!DF.Attach()) { cerr << "DF not found" << endl; return 1; } + DF.Suspend(); DF.InitViewAndCursor(); matGlosses mat; DF.ReadPlantMatgloss(mat.plantMat); @@ -103,16 +114,34 @@ int main () DFHack::t_item temp; DF.ReadItem(i,temp); if(temp.type != -1) - count[buildingtypes[temp.type]][getMaterialType(temp,buildingtypes,mat)].push_back(i); + { + const char * material = getMaterialType(temp,buildingtypes,mat); + if (material != 0) + { + count[buildingtypes[temp.type]][material].push_back(i); + } + else + { + cerr << "bad material string for item type: " << buildingtypes[temp.type] << "!" << endl; + } + } } map< string, map > >::iterator it1; int i =0; - for(it1 = count.begin(); it1!=count.end();it1++){ + for(it1 = count.begin(); it1!=count.end();it1++) + { cout << i << ": " << it1->first << "\n"; i++; } - cout << endl << "Select A Item Type:"; + if(i == 0) + { + cout << "No items found" << endl; + DF.FinishReadBuildings(); + DF.Detach(); + return 0; + } + cout << endl << "Select an item type from the list:"; int number; string in; stringstream ss; @@ -121,7 +150,8 @@ int main () ss >> number; int j = 0; it1 = count.begin(); - while(j < number && it1!=count.end()){ + while(j < number && it1!=count.end()) + { it1++; j++; } @@ -132,40 +162,47 @@ int main () cout << i << ":\t" << it2->first << " [" << it2->second.size() << "]" << endl; i++; } - cout << endl << "Select A Material Type: "; + cout << endl << "Select a material type: "; int number2; ss.clear(); getline(cin, in); ss.str(in); ss >> number2; - cout << "Select A Designation: " << flush; + + decideAgain: + cout << "Select a designation - (d)ump, (f)orbid, (m)melt, on fi(r)e :" << flush; string designationType; getline(cin,designationType); - //uint32_t changeFlag; DFHack::t_itemflags changeFlag = {0}; - if(designationType == "d"){ + if(designationType == "d" || designationType == "dump") + { changeFlag.bits.dump = 1; - //changeFlag = (1 << 21); } - else if(designationType == "f"){ + else if(designationType == "f" || designationType == "forbid") + { changeFlag.bits.forbid = 1; - //changeFlag = (1 << 19); } - else if(designationType == "m"){ + else if(designationType == "m" || designationType == "melt") + { changeFlag.bits.melt = 1; - //changeFlag = (1 << 23); } - else if(designationType == "r"){ + else if(designationType == "r" || designationType == "flame") + { changeFlag.bits.on_fire = 1; - //changeFlag = (1 << 22); + } + else + { + goto decideAgain; } j=0; it2= it1->second.begin(); - while(j < number2 && it2!=it1->second.end()){ + while(j < number2 && it2!=it1->second.end()) + { it2++; j++; } - for(uint32_t k = 0;k< it2->second.size();k++){ + for(uint32_t k = 0;k< it2->second.size();k++) + { DFHack::t_item temp; DF.ReadItem(it2->second[k],temp); temp.flags.whole |= changeFlag.whole;