From f81c66d9ea7b348eff07c74e420e5b4b0cb71a64 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Petr=20Mr=C3=A1zek?= Date: Wed, 7 Apr 2010 02:46:46 +0200 Subject: [PATCH] Reading creature skills --- dfhack/modules/Creatures.cpp | 18 ++++++++++++++++++ dfhack/shm/mod-creature2010.h | 3 +++ examples/creaturedump.cpp | 15 +++++++++------ output/Memory.xml | 4 +++- 4 files changed, 33 insertions(+), 7 deletions(-) diff --git a/dfhack/modules/Creatures.cpp b/dfhack/modules/Creatures.cpp index f925daddd..ea0fd615f 100644 --- a/dfhack/modules/Creatures.cpp +++ b/dfhack/modules/Creatures.cpp @@ -77,6 +77,10 @@ Creatures::Creatures(APIPrivate* _d) creatures.creature_labors_offset = minfo->getOffset ("creature_labors"); creatures.creature_happiness_offset = minfo->getOffset ("creature_happiness"); creatures.creature_artifact_name_offset = minfo->getOffset("creature_artifact_name"); + creatures.creature_soul_vector_offset = minfo->getOffset("creature_soul_vector"); + + // soul offsets + creatures.soul_skills_vector_offset = minfo->getOffset("soul_skills_vector"); // name offsets for the creature module creatures.name_firstname_offset = minfo->getOffset("name_firstname"); @@ -220,6 +224,20 @@ bool Creatures::ReadCreature (const int32_t index, t_creature & furball) g_pProcess->readDWord(temp + offs.creature_bleed_offset, furball.bleed_rate); */ + // enum soul pointer vector + DfVector souls(g_pProcess,temp + offs.creature_soul_vector_offset,4); + // get first soul's skills + DfVector skills(g_pProcess, *(uint32_t *)souls.at(0) + offs.soul_skills_vector_offset,4 ); + furball.numSkills = skills.getSize(); + for (uint32_t i = 0; i < furball.numSkills;i++) + { + uint32_t temp2 = * (uint32_t *) skills[i]; + //skills.read(i, (uint8_t *) &temp2); + // a byte: this gives us 256 skills maximum. + furball.skills[i].id = g_pProcess->readByte (temp2); + furball.skills[i].rating = g_pProcess->readByte (temp2 + 4); + furball.skills[i].experience = g_pProcess->readWord (temp2 + 8); + } return true; } diff --git a/dfhack/shm/mod-creature2010.h b/dfhack/shm/mod-creature2010.h index facd42de1..32adb1300 100644 --- a/dfhack/shm/mod-creature2010.h +++ b/dfhack/shm/mod-creature2010.h @@ -47,6 +47,9 @@ typedef struct uint32_t creature_labors_offset; uint32_t creature_happiness_offset; uint32_t creature_artifact_name_offset; + uint32_t creature_soul_vector_offset; + // soul offsets + uint32_t soul_skills_vector_offset; // name offsets (needed for reading creature names) uint32_t name_firstname_offset; uint32_t name_nickname_offset; diff --git a/examples/creaturedump.cpp b/examples/creaturedump.cpp index f09268442..e8c09f361 100644 --- a/examples/creaturedump.cpp +++ b/examples/creaturedump.cpp @@ -168,6 +168,7 @@ void printCreature(DFHack::API & DF, const DFHack::t_creature & creature) } DFHack::Translation *Tran = DF.getTranslation(); + DFHack::memory_info *mem = DF.getMemoryInfo(); string transName = Tran->TranslateName(creature.name,false); if(!transName.empty()) @@ -231,15 +232,18 @@ void printCreature(DFHack::API & DF, const DFHack::t_creature & creature) */ cout << endl; - /* + //skills - for(unsigned int i = 0; i < creature.skills.size();i++){ - if(i > 0){ + for(unsigned int i = 0; i < creature.numSkills;i++) + { + if(i > 0) + { cout << ", "; } - cout << creature.skills[i].name << ": " << creature.skills[i].rating; + cout << mem->getSkill(creature.skills[i].id) << ": " << creature.skills[i].rating; } - */ + cout << endl; + /* * FLAGS 1 */ @@ -301,7 +305,6 @@ void printCreature(DFHack::API & DF, const DFHack::t_creature & creature) cout << "from the underworld, "; } cout << endl; -#include /* if(creature.flags1.bits.had_mood && (creature.mood == -1 || creature.mood == 8 ) ) { diff --git a/output/Memory.xml b/output/Memory.xml index 3dd1e7c43..7690f4145 100644 --- a/output/Memory.xml +++ b/output/Memory.xml @@ -2973,7 +2973,9 @@ map_data_1b60_offset 0x1B9c 0x6D0 0x770 0x830 - 0x1FC + + 0x073C + 0x1F4
0x01470fbc
DWORD, OK