Improve the owner cleanup program a bit more.

develop
Alexander Gavrilov 2011-04-11 14:33:30 +04:00
parent 2e0ec2db72
commit 325e817d71
1 changed files with 67 additions and 24 deletions

@ -14,25 +14,30 @@ using namespace std;
#include <dfhack/DFVector.h> #include <dfhack/DFVector.h>
#include <dfhack/DFTypes.h> #include <dfhack/DFTypes.h>
DFHack::Materials * Materials;
DFHack::Items * Items;
int main (int argc, char *argv[]) int main (int argc, char *argv[])
{ {
bool dump_scattered = false; bool dump_scattered = false;
bool confiscate_all = false;
bool dry_run = false;
int wear_dump_level = 65536; int wear_dump_level = 65536;
for(int i = 1; i < argc; i++) for(int i = 1; i < argc; i++)
{ {
char *arg = argv[i]; char *arg = argv[i];
if (arg[0] != '-') if (arg[0] != '-')
continue; continue;
for (; *arg; arg++) { for (; *arg; arg++) {
switch (arg[0]) { switch (arg[0]) {
case 'j': case 'd':
dry_run = true;
break;
case 'l':
dump_scattered = true; dump_scattered = true;
break; break;
case 'a':
confiscate_all = true;
break;
case 'x': case 'x':
wear_dump_level = 1; wear_dump_level = 1;
break; break;
@ -42,7 +47,7 @@ int main (int argc, char *argv[])
} }
} }
} }
DFHack::Process * p; DFHack::Process * p;
unsigned int i,j; unsigned int i,j;
DFHack::ContextManager DFMgr("Memory.xml"); DFHack::ContextManager DFMgr("Memory.xml");
@ -62,16 +67,22 @@ int main (int argc, char *argv[])
} }
DFHack::VersionInfo * mem = DF->getMemoryInfo(); DFHack::VersionInfo * mem = DF->getMemoryInfo();
Materials = DF->getMaterials(); DFHack::Materials *Materials = DF->getMaterials();
Items = DF->getItems(); DFHack::Items *Items = DF->getItems();
DFHack::Creatures *Creatures = DF->getCreatures();
DFHack::Translation *Tran = DF->getTranslation();
Materials->ReadAllMaterials(); Materials->ReadAllMaterials();
uint32_t num_creatures;
Creatures->Start(num_creatures);
Tran->Start();
p = DF->getProcess(); p = DF->getProcess();
DFHack::OffsetGroup* itemGroup = mem->getGroup("Items"); DFHack::OffsetGroup* itemGroup = mem->getGroup("Items");
unsigned vector_addr = itemGroup->getAddress("items_vector"); unsigned vector_addr = itemGroup->getAddress("items_vector");
DFHack::DfVector <uint32_t> p_items (p, vector_addr); DFHack::DfVector <uint32_t> p_items (p, vector_addr);
uint32_t size = p_items.size(); uint32_t size = p_items.size();
printf("Found total %d items.\n", size); printf("Found total %d items.\n", size);
for (i=0;i<size;i++) for (i=0;i<size;i++)
@ -79,50 +90,82 @@ int main (int argc, char *argv[])
uint32_t curItem = p_items[i]; uint32_t curItem = p_items[i];
DFHack::t_item itm; DFHack::t_item itm;
Items->getItemData(curItem, itm); Items->getItemData(curItem, itm);
if (!itm.header.flags.bits.owned) if (!itm.header.flags.bits.owned)
continue; continue;
bool confiscate = false; bool confiscate = false;
bool dump = false; bool dump = false;
if (itm.header.flags.bits.rotten) if (itm.header.flags.bits.rotten)
{ {
printf("Confiscating a rotten item.\n"); printf("Confiscating a rotten item: \t");
confiscate = true; confiscate = true;
} }
else if (itm.wear_level >= wear_dump_level) else if (itm.wear_level >= wear_dump_level)
{ {
printf("Confiscating and dumping a worn item.\n"); printf("Confiscating and dumping a worn item: \t");
confiscate = true; confiscate = true;
dump = true; dump = true;
} }
else if (dump_scattered && itm.header.flags.bits.on_ground) else if (dump_scattered && itm.header.flags.bits.on_ground)
{ {
printf("Confiscating and dumping an untidily placed item.\n"); printf("Confiscating and dumping litter: \t");
confiscate = true; confiscate = true;
dump = true; dump = true;
} }
else if (confiscate_all)
{
printf("Confiscating: \t");
confiscate = true;
}
if (confiscate) if (confiscate)
{ {
itm.header.flags.bits.owned = 0; itm.header.flags.bits.owned = 0;
if (dump) if (dump)
itm.header.flags.bits.dump = 1; itm.header.flags.bits.dump = 1;
Items->setItemFlags(curItem, itm.header.flags); if (!dry_run)
Items->setItemFlags(curItem, itm.header.flags);
printf( printf(
"%5d: %08x %08x (%d,%d,%d) #%08x [%d] %s - %s\n", "%s (wear %d)",
i, curItem, itm.header.flags.whole, Items->getItemDescription(curItem, Materials).c_str(),
itm.header.x, itm.header.y, itm.header.z, itm.wear_level
);
int32_t owner = Items->getItemOwnerID(curItem);
int32_t owner_index = Creatures->FindIndexById(owner);
std::string info;
if (owner_index >= 0)
{
DFHack::t_creature temp;
Creatures->ReadCreature(owner_index,temp);
temp.name.first_name[0] = toupper(temp.name.first_name[0]);
info = temp.name.first_name;
if (temp.name.nickname[0])
info += std::string(" '") + temp.name.nickname + "'";
info += " ";
info += Tran->TranslateName(temp.name,false);
printf(", owner %s", info.c_str());
}
printf("\n");
/* printf(
"%5d: %08x %08x (%d,%d,%d) #%08x [%d] %s - %s %s\n",
i, curItem, itm.header.flags.whole,
itm.header.x, itm.header.y, itm.header.z,
p->readDWord(curItem), p->readDWord(curItem),
itm.wear_level, itm.wear_level,
Items->getItemClass(itm.matdesc.itemType).c_str(), Items->getItemClass(itm.matdesc.itemType).c_str(),
Items->getItemDescription(curItem, Materials).c_str() Items->getItemDescription(curItem, Materials).c_str(),
); info.c_str()
);*/
} }
} }
#ifndef LINUX_BUILD #ifndef LINUX_BUILD
cout << "Done. Press any key to continue" << endl; cout << "Done. Press any key to continue" << endl;