add missing itemdesignator source
parent
a351d2c242
commit
193a6f4d62
@ -0,0 +1,182 @@
|
||||
// Item dump
|
||||
|
||||
#include <iostream>
|
||||
#include <iomanip>
|
||||
#include <sstream>
|
||||
#include <climits>
|
||||
#include <integers.h>
|
||||
#include <vector>
|
||||
using namespace std;
|
||||
|
||||
#include <DFTypes.h>
|
||||
#include <DFHackAPI.h>
|
||||
|
||||
struct matGlosses
|
||||
{
|
||||
vector<DFHack::t_matgloss> plantMat;
|
||||
vector<DFHack::t_matgloss> woodMat;
|
||||
vector<DFHack::t_matgloss> stoneMat;
|
||||
vector<DFHack::t_matgloss> metalMat;
|
||||
vector<DFHack::t_matgloss> creatureMat;
|
||||
};
|
||||
|
||||
string getMaterialType(DFHack::t_item item, const vector<string> & 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<string> & 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 <string> buildingtypes;
|
||||
DF.InitReadBuildings(buildingtypes);
|
||||
uint32_t numItems = DF.InitReadItems();
|
||||
map< string, map<string,vector<uint32_t> > > 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<string,vector<uint32_t> > >::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<string,vector<uint32_t> >::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;
|
||||
}
|
Loading…
Reference in New Issue