diff --git a/data/Memory.xml b/data/Memory.xml index fd0072623..9c5bd6e48 100644 --- a/data/Memory.xml +++ b/data/Memory.xml @@ -1698,6 +1698,7 @@ map_data_1b60_offset 0x1B9c
0x168E73C
0x014b9f1c
0X1F4 + 0x2FC 0x4AC 0x64c 0x71c diff --git a/library/include/dfhack/modules/Creatures.h b/library/include/dfhack/modules/Creatures.h index 1686be281..67418d08a 100644 --- a/library/include/dfhack/modules/Creatures.h +++ b/library/include/dfhack/modules/Creatures.h @@ -5,6 +5,7 @@ */ #include "dfhack/DFExport.h" #include "dfhack/DFModule.h" +#include "dfhack/modules/Items.h" namespace DFHack { /* @@ -374,6 +375,8 @@ namespace DFHack const uint16_t x2, const uint16_t y2,const uint16_t z2); bool ReadCreature(const int32_t index, t_creature & furball); bool ReadJob(const t_creature * furball, std::vector & mat); + bool ReadInventoryIdx(const uint32_t index, std::vector & item); + bool ReadInventoryPtr(const uint32_t index, std::vector & item); /* Getters */ uint32_t GetDwarfRaceIndex ( void ); diff --git a/library/modules/Creatures.cpp b/library/modules/Creatures.cpp index 2e9e319cd..ac8e38d14 100644 --- a/library/modules/Creatures.cpp +++ b/library/modules/Creatures.cpp @@ -109,6 +109,9 @@ Creatures::Creatures(DFContextShared* _d) creatures.name_firstname_offset = minfo->getOffset("name_firstname"); creatures.name_nickname_offset = minfo->getOffset("name_nickname"); creatures.name_words_offset = minfo->getOffset("name_words"); + + creatures.inventory_offset = minfo->getOffset("creature_inventory_vector"); + d->dwarf_race_index_addr = minfo->getAddress("dwarf_race_index"); d->dwarf_civ_id_addr = minfo->getAddress("dwarf_civ_id"); /* @@ -609,3 +612,26 @@ bool Creatures::ReadJob(const t_creature * furball, vector & mat) } return true; } + +bool Creatures::ReadInventoryIdx(const uint32_t index, std::vector & item) +{ + if(!d->Started) return false; + Process * p = d->owner; + uint32_t temp = d->p_cre->at (index); + return this->ReadInventoryPtr(temp, item); +} + +bool Creatures::ReadInventoryPtr(const uint32_t temp, std::vector & item) +{ + unsigned int i; + if(!d->Started) return false; + Process * p = d->owner; + + DfVector citem(p, temp + d->creatures.inventory_offset); + if(citem.size() == 0) + return false; + item.resize(citem.size()); + for(i=0;ireadDWord(citem[i]); + return true; +} \ No newline at end of file diff --git a/library/shm/mod-creature2010.h b/library/shm/mod-creature2010.h index f52122127..64a9936a6 100644 --- a/library/shm/mod-creature2010.h +++ b/library/shm/mod-creature2010.h @@ -67,6 +67,7 @@ typedef struct uint32_t appearance_vector_offset; uint32_t birth_year_offset; uint32_t birth_time_offset; + uint32_t inventory_offset; } creature_offsets; typedef struct diff --git a/tools/examples/creaturedump.cpp b/tools/examples/creaturedump.cpp index 81fc3da8d..9d5e95ffc 100644 --- a/tools/examples/creaturedump.cpp +++ b/tools/examples/creaturedump.cpp @@ -19,6 +19,7 @@ enum likeType }; DFHack::Materials * Materials; +DFHack::Items * Items; DFHack::memory_info *mem; vector< vector > englishWords; vector< vector > foreignWords; @@ -271,6 +272,17 @@ void printCreature(DFHack::Context * DF, const DFHack::t_creature & creature) } } + std::vector inventory; + + if( Creatures->ReadInventoryPtr(creature.origin, inventory) ) + { + printf("\tInventory:\n"); + for(unsigned int i = 0; i < inventory.size(); i++) + { + printf("\t\t%s\n", Items->getItemDescription(inventory[i], Materials).c_str()); + } + } + /* if(creature.pregnancy_timer > 0) cout << "gives birth in " << creature.pregnancy_timer/1200 << " days. "; @@ -415,6 +427,7 @@ int main (int numargs, char ** args) Creatures = DF->getCreatures(); Materials = DF->getMaterials(); + Items = DF->getItems(); World = DF->getWorld(); current_year = World->ReadCurrentYear(); current_tick = World->ReadCurrentTick(); @@ -450,6 +463,7 @@ int main (int numargs, char ** args) //DF.InitViewAndCursor(); for(uint32_t i = 0; i < numCreatures; i++) { + printf("%d/%d\n", i, numCreatures); DFHack::t_creature temp; Creatures->ReadCreature(i,temp); if(check.empty() || string(Materials->raceEx[temp.race].rawname) == check) @@ -459,6 +473,7 @@ int main (int numargs, char ** args) printCreature(DF,temp); addrs.push_back(temp.origin); } + printf("!\n"); } if(addrs.size() <= 10) { @@ -473,6 +488,7 @@ int main (int numargs, char ** args) DF.ReadCreature(currentIdx, currentCreature); printCreature(DF,currentCreature); */ + Creatures->Finish(); DF->Detach(); #ifndef LINUX_BUILD diff --git a/tools/supported/dumpoffsets.cpp b/tools/supported/dumpoffsets.cpp index 2257ca1de..54ff1c516 100644 --- a/tools/supported/dumpoffsets.cpp +++ b/tools/supported/dumpoffsets.cpp @@ -12,11 +12,12 @@ using namespace DFHack; int main (int numargs, const char ** args) { - DFHack::ContextManager DFMgr("Memory.xml"); + DFHack::ContextManager * DFMgr; DFHack::Context * DF; try { - DF = DFMgr.getSingleContext(); + DFMgr = new DFHack::ContextManager("Memory.xml"); + DF = DFMgr->getSingleContext(); DF->Attach(); } catch (exception& e)