From f4d6836a85a90be3c88f3b809195e1e71c0fc1fc Mon Sep 17 00:00:00 2001 From: "U-glouglou\\simon" Date: Sun, 2 May 2010 12:50:51 +0200 Subject: [PATCH] A bit of debugging done, and the Items::getItemDescription is finally here ! --- dfhack/include/modules/Items.h | 7 +- dfhack/include/modules/Materials.h | 75 ++++++++++----------- dfhack/modules/Items.cpp | 52 +++++++++++++-- dfhack/modules/Materials.cpp | 104 +++++++++++++---------------- examples/dfitemdump.cpp | 53 ++------------- 5 files changed, 138 insertions(+), 153 deletions(-) diff --git a/dfhack/include/modules/Items.h b/dfhack/include/modules/Items.h index 181ee68ee..162701688 100644 --- a/dfhack/include/modules/Items.h +++ b/dfhack/include/modules/Items.h @@ -23,6 +23,7 @@ public: Accessor(uint32_t function, Process * p); Accessor(accessor_type type, int32_t constant, uint32_t offset1, uint32_t offset2, uint32_t dataWidth, Process * p); int32_t getValue(uint32_t objectPtr); + bool isConstant(); }; struct t_item @@ -47,6 +48,7 @@ public: bool getItem(uint32_t itemptr, t_item & item); std::string className; uint32_t vtable; + uint32_t mainType; }; class DFHACK_EXPORT Items @@ -54,12 +56,13 @@ class DFHACK_EXPORT Items public: Items(DFHack::APIPrivate * _d); ~Items(); - std::string getItemDescription(uint32_t itemptr); + std::string getItemDescription(uint32_t itemptr, Materials * Materials); + std::string getItemClass(int32_t index); bool getItemData(uint32_t itemptr, t_item & item); private: class Private; Private* d; - /*std::map descType; might be useful later */ + std::map descType; std::map descVTable; }; } diff --git a/dfhack/include/modules/Materials.h b/dfhack/include/modules/Materials.h index 1fd4d66fe..6fbbd2ab8 100644 --- a/dfhack/include/modules/Materials.h +++ b/dfhack/include/modules/Materials.h @@ -82,47 +82,46 @@ namespace DFHack class DFHACK_EXPORT Materials { - public: - - Materials(DFHack::APIPrivate * _d); - ~Materials(); + public: + Materials(DFHack::APIPrivate * _d); + ~Materials(); - std::vector inorganic; - std::vector organic; - std::vector tree; - std::vector plant; - std::vector race; - std::vector raceEx; - std::vector color; - std::vector other; - - bool ReadInorganicMaterials (void); - bool ReadOrganicMaterials (void); - bool ReadWoodMaterials (void); - bool ReadPlantMaterials (void); - bool ReadCreatureTypes (void); - bool ReadCreatureTypesEx (void); - bool ReadDescriptorColors(void); - bool ReadOthers (void); + std::vector inorganic; + std::vector organic; + std::vector tree; + std::vector plant; + std::vector race; + std::vector raceEx; + std::vector color; + std::vector other; - void ReadAllMaterials(void); + bool ReadInorganicMaterials (void); + bool ReadOrganicMaterials (void); + bool ReadWoodMaterials (void); + bool ReadPlantMaterials (void); + bool ReadCreatureTypes (void); + bool ReadCreatureTypesEx (void); + bool ReadDescriptorColors(void); + bool ReadOthers (void); - std::string getDescription(t_material & mat); - /* - bool ReadInorganicMaterials (std::vector & output); - bool ReadOrganicMaterials (std::vector & output); - bool ReadWoodMaterials (std::vector & output); - bool ReadPlantMaterials (std::vector & output); - - // TODO: maybe move to creatures? - bool ReadCreatureTypes (std::vector & output); - bool ReadCreatureTypesEx (vector & creatures); - bool ReadDescriptorColors(std::vector & output); - */ - private: - class Private; - Private* d; - }; + void ReadAllMaterials(void); + + std::string getDescription(t_material & mat); + /* + bool ReadInorganicMaterials (std::vector & output); + bool ReadOrganicMaterials (std::vector & output); + bool ReadWoodMaterials (std::vector & output); + bool ReadPlantMaterials (std::vector & output); + + // TODO: maybe move to creatures? + bool ReadCreatureTypes (std::vector & output); + bool ReadCreatureTypesEx (vector & creatures); + bool ReadDescriptorColors(std::vector & output); + */ + private: + class Private; + Private* d; + }; } #endif diff --git a/dfhack/modules/Items.cpp b/dfhack/modules/Items.cpp index ca9be516a..55c900feb 100644 --- a/dfhack/modules/Items.cpp +++ b/dfhack/modules/Items.cpp @@ -116,10 +116,16 @@ Accessor::Accessor(uint32_t function, Process *p) printf("bad accessor @0x%x\n", function); } -int32_t Accessor::getValue(uint32_t objectPtr) +bool Accessor::isConstant() { - int32_t sout; + if(this->type == ACCESSOR_CONSTANT) + return true; + else + return false; +} +int32_t Accessor::getValue(uint32_t objectPtr) +{ switch(this->type) { case ACCESSOR_CONSTANT: @@ -161,13 +167,21 @@ ItemDesc::ItemDesc(uint32_t VTable, Process *p) uint32_t funcOffsetQuality = p->getDescriptor()->getOffset("item_quality_accessor"); this->vtable = VTable; this->p = p; - this->className = p->readClassName(VTable); + this->className = p->readClassName(VTable).substr(5); + this->className.resize(this->className.size()-2); this->AMainType = new Accessor( p->readDWord( VTable + funcOffsetA ), p); this->ASubType = new Accessor( p->readDWord( VTable + funcOffsetB ), p); this->ASubIndex = new Accessor( p->readDWord( VTable + funcOffsetC ), p); this->AIndex = new Accessor( p->readDWord( VTable + funcOffsetD ), p); this->AQuality = new Accessor( p->readDWord( VTable + funcOffsetQuality ), p); this->hasDecoration = false; + if(this->AMainType->isConstant()) + this->mainType = this->AMainType->getValue(0); + else + { + fprintf(stderr, "Bad item main type at function %p\n", (void*) p->readDWord( VTable + funcOffsetA )); + this->mainType = 0; + } } bool ItemDesc::getItem(uint32_t itemptr, DFHack::t_item &item) @@ -176,8 +190,6 @@ bool ItemDesc::getItem(uint32_t itemptr, DFHack::t_item &item) item.matdesc.subType = this->ASubType->getValue(itemptr); item.matdesc.subIndex = this->ASubIndex->getValue(itemptr); item.matdesc.index = this->AIndex->getValue(itemptr); - if(item.matdesc.index == 0xffff) - printf("wtf"); item.quality = this->AQuality->getValue(itemptr); item.quantity = 1; /* TODO */ return true; @@ -195,6 +207,7 @@ bool Items::getItemData(uint32_t itemptr, DFHack::t_item &item) uint32_t vtable = p->readDWord(itemptr); desc = new ItemDesc(vtable, p); this->descVTable[vtable] = desc; + this->descType[desc->mainType] = desc; } else desc = it->second; @@ -202,12 +215,37 @@ bool Items::getItemData(uint32_t itemptr, DFHack::t_item &item) return desc->getItem(itemptr, item); } -std::string Items::getItemDescription(uint32_t itemptr) +std::string Items::getItemClass(int32_t index) +{ + std::map::iterator it; + std::string out; + + it = this->descType.find(index); + if(it==this->descType.end()) + return "unknown"; + out = it->second->className; + return out; +} + +std::string Items::getItemDescription(uint32_t itemptr, Materials * Materials) { DFHack::t_item item; std::string out; if(!this->getItemData(itemptr, item)) return "??"; - return "!!"; + switch(item.quality) + { + case 0: break; + case 1: out.append("Well crafted "); break; + case 2: out.append("Finely crafted "); break; + case 3: out.append("Superior quality "); break; + case 4: out.append("Exceptionnal "); break; + case 5: out.append("Masterful "); break; + default: out.append("Crazy quality "); break; + } + out.append(Materials->getDescription(item.matdesc)); + out.append(" "); + out.append(this->getItemClass(item.matdesc.itemType)); + return out; } \ No newline at end of file diff --git a/dfhack/modules/Materials.cpp b/dfhack/modules/Materials.cpp index 460725d8a..4303c3156 100644 --- a/dfhack/modules/Materials.cpp +++ b/dfhack/modules/Materials.cpp @@ -347,66 +347,52 @@ void Materials::ReadAllMaterials(void) std::string Materials::getDescription(t_material & mat) { std::string out; + int32_t typeC; - switch(mat.itemType) - { - case 0: - if(mat.index>=0) - { - if(uint32_t(mat.index) <= this->inorganic.size()) - { - out.append(this->inorganic[mat.index].id); - out.append(" bar"); - } - else - out = "invalid bar"; - } - else - out = "any metal bar"; - break; - case 1: - out = "cut gem"; - break; - case 2: - out = "block"; - break; - case 3: - switch(mat.subType) - { - case 3: out = "raw green glass"; break; - case 4: out = "raw clear glass"; break; - case 5: out = "raw crystal glass"; break; - default: out = "raw gems"; break; - } - break; - case 4: - out = "raw stone"; - break; - case 5: - out = "wood log"; - break; - case 24: - out = "weapon?"; - break; - case 26: - out = "footwear"; - break; - case 28: - out = "headwear"; - break; - case 54: - out = "leather"; - break; - case 57: - out = "cloth"; - break; - case 71: - out = "food"; - break; - default: - out = "unknown"; - break; - } + if ( (mat.subIndex<419) || (mat.subIndex>618) ) + { + if ( (mat.subIndex<19) || (mat.subIndex>218) ) + { + if (mat.subIndex) + if (mat.subIndex>0x292) + return "?"; + else + { + if (mat.subIndex>=this->other.size()) + { + if(mat.subIndex>=this->raceEx.size()) + return "stuff"; + else + return this->raceEx[mat.subIndex].rawname; + } + else + { + if (mat.index==-1) + return std::string(this->other[mat.subIndex].rawname); + else + return std::string(this->other[mat.subIndex].rawname) + " derivate"; + } + } + else + return this->inorganic[mat.index].id; + } + else + { + if (mat.index>=this->raceEx.size()) + return "unknown race"; + typeC = mat.subIndex; + typeC -=19; + if ((typeC<0) || (typeC>=this->raceEx[mat.index].extract.size())) + { + return string(this->raceEx[mat.index].rawname).append(" extract"); + } + return std::string(this->raceEx[mat.index].rawname).append(" ").append(this->raceEx[mat.index].extract[typeC].rawname); + } + } + else + { + return this->organic[mat.index].id; + } return out; } diff --git a/examples/dfitemdump.cpp b/examples/dfitemdump.cpp index 3848c32ad..59f0c70dd 100644 --- a/examples/dfitemdump.cpp +++ b/examples/dfitemdump.cpp @@ -22,55 +22,13 @@ using namespace std; DFHack::Materials * Materials; - -std::string getMatDesc(int32_t typeB, int32_t typeC, int32_t typeD) -{ - if ( (typeC<419) || (typeC>618) ) - { - if ( (typeC<19) || (typeC>218) ) - { - if (typeC) - if (typeC>0x292) - return "?"; - else - { - if (typeC>=Materials->other.size()) - return "stuff"; - else - { - if (typeD==-1) - return std::string(Materials->other[typeC].rawname); - else - return std::string(Materials->other[typeC].rawname) + " derivate"; - } - } - else - return Materials->inorganic[typeD].id; - } - else - { - if (typeD>=Materials->raceEx.size()) - return "unknown race"; - typeC-=19; - if ((typeC<0) || (typeC>=Materials->raceEx[typeD].extract.size())) - { - return string(Materials->raceEx[typeD].rawname).append(" extract"); - } - return std::string(Materials->raceEx[typeD].rawname).append(" ").append(Materials->raceEx[typeD].extract[typeC].rawname); - } - } - else - { - return Materials->organic[typeD].id; - } -} +DFHack::Items * Items; int main () { DFHack::API DF("Memory.xml"); DFHack::Process * p; unsigned int i,j; - DFHack::Items * Items; try { @@ -193,10 +151,11 @@ int main () printf("bad typeD func @%p\n", (void*) funcD); // printf("%p\t%.16LX\t", (void*) func2, funct2); - printf("%d\t%p\t%s\t%d\t[%d,%d,%d -> %s]", type, (void*)vtable, desc.c_str(), quality, - typeB, typeC, typeD, getMatDesc(typeB, typeC, typeD).c_str()); + printf("%d\t%p\t%s\t%d\t[%d,%d,%d]", type, (void*)vtable, desc.c_str(), quality, + typeB, typeC, typeD); + printf("\t%s", Items->getItemDescription(p_items[i], Materials).c_str()); // printf("\t%p\t%.16LX", (void *) funcD, funcDt); - if( (type!=itm.matdesc.itemType) || (typeB!=itm.matdesc.subType) || (typeC!=itm.matdesc.subIndex) || (typeD!=itm.matdesc.index) ) + if( (type!=itm.matdesc.itemType) || (typeB!=itm.matdesc.subType) || (typeC!=itm.matdesc.subIndex) || (typeD!=itm.matdesc.index) || (quality!=itm.quality) ) printf("\tbad[%d,%d,%d,%d]", itm.matdesc.itemType, itm.matdesc.subType, itm.matdesc.subIndex, itm.matdesc.index); if (hasDecorations) { @@ -223,7 +182,7 @@ int main () printf("bad decoration type function, address=%p\n", (void*) dtypefunc); if (sep) printf(","); - printf("%s[t=%d,q=%d,%s{%d,%d}]", ddesc.c_str(), dtype, dqual, getMatDesc(-1, dtypeC, dtypeD).c_str(), dtypeC, dtypeD); + //printf("%s[t=%d,q=%d,%s{%d,%d}]", ddesc.c_str(), dtype, dqual, getMatDesc(-1, dtypeC, dtypeD).c_str(), dtypeC, dtypeD); sep = true; } }