From 325e817d71bf37ee20b0cc1dd5ba854b98d8205c Mon Sep 17 00:00:00 2001 From: Alexander Gavrilov Date: Mon, 11 Apr 2011 14:33:30 +0400 Subject: [PATCH] Improve the owner cleanup program a bit more. --- tools/playground/cleanowned.cpp | 91 ++++++++++++++++++++++++--------- 1 file changed, 67 insertions(+), 24 deletions(-) diff --git a/tools/playground/cleanowned.cpp b/tools/playground/cleanowned.cpp index ddd54de69..116754dc8 100644 --- a/tools/playground/cleanowned.cpp +++ b/tools/playground/cleanowned.cpp @@ -14,25 +14,30 @@ using namespace std; #include #include -DFHack::Materials * Materials; -DFHack::Items * Items; - int main (int argc, char *argv[]) { bool dump_scattered = false; + bool confiscate_all = false; + bool dry_run = false; int wear_dump_level = 65536; - + for(int i = 1; i < argc; i++) { char *arg = argv[i]; if (arg[0] != '-') continue; - + for (; *arg; arg++) { switch (arg[0]) { - case 'j': + case 'd': + dry_run = true; + break; + case 'l': dump_scattered = true; break; + case 'a': + confiscate_all = true; + break; case 'x': wear_dump_level = 1; break; @@ -42,7 +47,7 @@ int main (int argc, char *argv[]) } } } - + DFHack::Process * p; unsigned int i,j; DFHack::ContextManager DFMgr("Memory.xml"); @@ -62,16 +67,22 @@ int main (int argc, char *argv[]) } DFHack::VersionInfo * mem = DF->getMemoryInfo(); - Materials = DF->getMaterials(); - Items = DF->getItems(); - + DFHack::Materials *Materials = DF->getMaterials(); + DFHack::Items *Items = DF->getItems(); + DFHack::Creatures *Creatures = DF->getCreatures(); + DFHack::Translation *Tran = DF->getTranslation(); + Materials->ReadAllMaterials(); + uint32_t num_creatures; + Creatures->Start(num_creatures); + Tran->Start(); + p = DF->getProcess(); DFHack::OffsetGroup* itemGroup = mem->getGroup("Items"); unsigned vector_addr = itemGroup->getAddress("items_vector"); DFHack::DfVector p_items (p, vector_addr); uint32_t size = p_items.size(); - + printf("Found total %d items.\n", size); for (i=0;igetItemData(curItem, itm); - + if (!itm.header.flags.bits.owned) continue; bool confiscate = false; bool dump = false; - + if (itm.header.flags.bits.rotten) { - printf("Confiscating a rotten item.\n"); + printf("Confiscating a rotten item: \t"); confiscate = true; } 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; dump = true; } 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; dump = true; } - + else if (confiscate_all) + { + printf("Confiscating: \t"); + confiscate = true; + } + if (confiscate) { itm.header.flags.bits.owned = 0; if (dump) itm.header.flags.bits.dump = 1; - Items->setItemFlags(curItem, itm.header.flags); + if (!dry_run) + Items->setItemFlags(curItem, itm.header.flags); printf( - "%5d: %08x %08x (%d,%d,%d) #%08x [%d] %s - %s\n", - i, curItem, itm.header.flags.whole, - itm.header.x, itm.header.y, itm.header.z, + "%s (wear %d)", + Items->getItemDescription(curItem, Materials).c_str(), + 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), itm.wear_level, 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 cout << "Done. Press any key to continue" << endl;