diff --git a/tools/itemdesignator.cpp b/tools/itemdesignator.cpp new file mode 100644 index 000000000..eb03920e6 --- /dev/null +++ b/tools/itemdesignator.cpp @@ -0,0 +1,182 @@ +// Item dump + +#include +#include +#include +#include +#include +#include +using namespace std; + +#include +#include + +struct matGlosses +{ + vector plantMat; + vector woodMat; + vector stoneMat; + vector metalMat; + 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 + { + 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(string(mat.creatureMat[item.material.type].id)); + } + else if(item.type == 124){ //wood + return(string(mat.woodMat[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{ + switch (item.material.type) + { + case 0: + return(string(mat.woodMat[item.material.index].id)); + break; + case 1: + return(string(mat.stoneMat[item.material.index].id)); + break; + case 2: + return(string(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)); + break; + case 3: + case 9: + case 10: + case 11: + case 121: + return(string(mat.creatureMat[item.material.index].id)); + break; + default: + //DF.setCursorCoords(item.x,item.y,item.z); + return(string("")); + } + } +} +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: "; + + string itemType = getMaterialType(item,buildingTypes,mat); + cout << itemType << endl; +} +int main () +{ + + DFHack::API DF ("Memory.xml"); + + if(!DF.Attach()) + { + cerr << "DF not found" << endl; + return 1; + } + DF.InitViewAndCursor(); + matGlosses mat; + DF.ReadPlantMatgloss(mat.plantMat); + DF.ReadWoodMatgloss(mat.woodMat); + DF.ReadStoneMatgloss(mat.stoneMat); + DF.ReadMetalMatgloss(mat.metalMat); + DF.ReadCreatureMatgloss(mat.creatureMat); + DF.ForceResume(); + + vector buildingtypes; + DF.InitReadBuildings(buildingtypes); + uint32_t numItems = DF.InitReadItems(); + map< string, map > > count; + int failedItems = 0; + for(uint32_t i=0; i< numItems; i++) + { + DFHack::t_item temp; + DF.ReadItem(i,temp); + if(temp.type != -1) + count[buildingtypes[temp.type]][getMaterialType(temp,buildingtypes,mat)].push_back(i); + } + + map< string, map > >::iterator it1; + int i =0; + for(it1 = count.begin(); it1!=count.end();it1++){ + cout << i << ": " << it1->first << "\n"; + i++; + } + cout << endl << "Select A Item Type:"; + int number; + string in; + stringstream ss; + getline(cin, in); + ss.str(in); + ss >> number; + int j = 0; + it1 = count.begin(); + while(j < number && it1!=count.end()){ + it1++; + j++; + } + cout << it1->first << "\n"; + map >::iterator it2; + i=0; + for(it2 = it1->second.begin();it2!=it1->second.end();it2++){ + cout << i << ":\t" << it2->first << " [" << it2->second.size() << "]" << endl; + i++; + } + cout << endl << "Select A Material Type: "; + int number2; + ss.clear(); + getline(cin, in); + ss.str(in); + ss >> number2; + cout << "Select A Designation: " << flush; + string designationType; + getline(cin,designationType); + //uint32_t changeFlag; + DFHack::t_itemflags changeFlag = {0}; + if(designationType == "d"){ + changeFlag.bits.dump = 1; + //changeFlag = (1 << 21); + } + else if(designationType == "f"){ + changeFlag.bits.forbid = 1; + //changeFlag = (1 << 19); + } + else if(designationType == "m"){ + changeFlag.bits.melt = 1; + //changeFlag = (1 << 23); + } + else if(designationType == "r"){ + changeFlag.bits.on_fire = 1; + //changeFlag = (1 << 22); + } + j=0; + it2= it1->second.begin(); + while(j < number2 && it2!=it1->second.end()){ + it2++; + j++; + } + 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; + DF.WriteRaw(temp.origin+12,sizeof(uint32_t),(uint8_t *)&temp.flags.whole); + } + + DF.FinishReadBuildings(); + DF.Detach(); +#ifndef LINUX_BUILD + cout << "Done. Press any key to continue" << endl; + cin.ignore(); +#endif + return 0; +}