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/VersionInfo.cpp b/library/VersionInfo.cpp
index e5c6873f9..a7d427056 100644
--- a/library/VersionInfo.cpp
+++ b/library/VersionInfo.cpp
@@ -127,8 +127,8 @@ void OffsetGroup::createString(const string & key)
void OffsetGroup::setOffset (const string & key, const string & value)
{
- int32_Iter it;
- if((it = OGd->offsets.find(key)) != OGd->offsets.end())
+ int32_Iter it = OGd->offsets.find(key);
+ if(it != OGd->offsets.end())
{
int32_t offset = strtol(value.c_str(), NULL, 16);
(*it).second.second = offset;
@@ -140,8 +140,8 @@ void OffsetGroup::setOffset (const string & key, const string & value)
void OffsetGroup::setAddress (const string & key, const string & value)
{
- uint32_Iter it;
- if((it = OGd->addresses.find(key)) != OGd->addresses.end())
+ uint32_Iter it = OGd->addresses.find(key);
+ if(it != OGd->addresses.end())
{
int32_t address = strtol(value.c_str(), NULL, 16);
(*it).second.second = address;
@@ -153,8 +153,8 @@ void OffsetGroup::setAddress (const string & key, const string & value)
void OffsetGroup::setHexValue (const string & key, const string & value)
{
- uint32_Iter it;
- if((it = OGd->hexvals.find(key)) != OGd->hexvals.end())
+ uint32_Iter it = OGd->hexvals.find(key);
+ if(it != OGd->hexvals.end())
{
(*it).second.second = strtol(value.c_str(), NULL, 16);
(*it).second.first = true;
@@ -165,8 +165,8 @@ void OffsetGroup::setHexValue (const string & key, const string & value)
void OffsetGroup::setString (const string & key, const string & value)
{
- strings_Iter it;
- if((it = OGd->strings.find(key)) != OGd->strings.end())
+ strings_Iter it = OGd->strings.find(key);
+ if(it != OGd->strings.end())
{
(*it).second.second = value;
(*it).second.first = true;
diff --git a/library/VersionInfoFactory.cpp b/library/VersionInfoFactory.cpp
index 14076426b..6a1bd517b 100644
--- a/library/VersionInfoFactory.cpp
+++ b/library/VersionInfoFactory.cpp
@@ -118,7 +118,7 @@ void VersionInfoFactory::ParseOffsets(TiXmlElement * parent, VersionInfo* target
// work variables
OffsetGroup * currentGroup = 0;
TiXmlElement * currentElem = 0;
- cerr << ""<< endl;
+ //cerr << ""<< endl;
while(1)
{
// get current work variables
@@ -137,7 +137,7 @@ void VersionInfoFactory::ParseOffsets(TiXmlElement * parent, VersionInfo* target
}
else
{
- cerr << "" << endl;
+ //cerr << "" << endl;
continue;
}
}
@@ -178,10 +178,10 @@ void VersionInfoFactory::ParseOffsets(TiXmlElement * parent, VersionInfo* target
og = currentGroup->createGroup(cstr_name);
else
og = currentGroup->getGroup(cstr_name);
- cerr << "" << endl;
+ //cerr << "" << endl;
// advance this level to the next element
groupPair & gp = breadcrumbs.back();
- gp.first = gp.first->NextSiblingElement();
+ gp.first = currentElem->NextSiblingElement();
// add a new level that will be processed next
breadcrumbs.push_back(groupPair(currentElem->FirstChildElement(), og));
@@ -250,10 +250,10 @@ void VersionInfoFactory::ParseOffsets(TiXmlElement * parent, VersionInfo* target
// advance to next element
groupPair & gp = breadcrumbs.back();
- gp.first = gp.first->NextSiblingElement();
+ gp.first = currentElem->NextSiblingElement();
continue;
}
- cerr << ""<< endl;
+ //cerr << ""<< endl;
}
void VersionInfoFactory::ParseBase (TiXmlElement* entry, VersionInfo* mem)
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 cd1022e4b..73f2691c7 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;
+}
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 b9113130a..c18c3806f 100644
--- a/tools/examples/creaturedump.cpp
+++ b/tools/examples/creaturedump.cpp
@@ -271,6 +271,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 +426,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 +462,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 +472,7 @@ int main (int numargs, char ** args)
printCreature(DF,temp);
addrs.push_back(temp.origin);
}
+ printf("!\n");
}
if(addrs.size() <= 10)
{
@@ -473,6 +487,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 963cffcbb..d9240f760 100644
--- a/tools/supported/dumpoffsets.cpp
+++ b/tools/supported/dumpoffsets.cpp
@@ -13,7 +13,6 @@ using namespace DFHack;
int main (int numargs, const char ** args)
{
-
DFHack::VersionInfoFactory * VIF = new DFHack::VersionInfoFactory("Memory.xml");
for(int i = 0; i < VIF->versions.size(); i++)
{