diff --git a/data/Memory-ng.xml b/data/Memory-ng.xml index a6f2961b5..e7b93bb34 100644 --- a/data/Memory-ng.xml +++ b/data/Memory-ng.xml @@ -1737,13 +1737,15 @@ - + diff --git a/library/modules/Creatures.cpp b/library/modules/Creatures.cpp index e7c203f60..0d26f336b 100644 --- a/library/modules/Creatures.cpp +++ b/library/modules/Creatures.cpp @@ -124,16 +124,16 @@ Creatures::Creatures(DFContextShared* _d) creatures.labors_offset = OG_creature_ex->getOffset ("labors"); creatures.happiness_offset = OG_creature_ex->getOffset ("happiness"); d->Ft_advanced = true; - try - { - creatures.soul_vector_offset = OG_creature_ex->getOffset("soul_vector"); - creatures.default_soul_offset = OG_creature_ex->getOffset("current_soul"); - creatures.soul_mental_offset = OG_soul->getOffset("mental"); - creatures.soul_skills_vector_offset = OG_soul->getOffset("skills_vector"); - creatures.soul_traits_offset = OG_soul->getOffset("traits"); - d->Ft_soul = true; - } - catch(Error::All&){}; + } + catch(Error::All&){}; + try + { + creatures.soul_vector_offset = OG_creature_ex->getOffset("soul_vector"); + creatures.default_soul_offset = OG_creature_ex->getOffset("current_soul"); + creatures.soul_mental_offset = OG_soul->getOffset("mental"); + creatures.soul_skills_vector_offset = OG_soul->getOffset("skills_vector"); + creatures.soul_traits_offset = OG_soul->getOffset("traits"); + d->Ft_soul = true; } catch(Error::All&){}; } @@ -169,6 +169,7 @@ bool Creatures::Finish() bool Creatures::ReadCreature (const int32_t index, t_creature & furball) { if(!d->Started) return false; + memset(&furball, 0, sizeof(t_creature)); // SHM fast path Process * p = d->owner; /* @@ -190,129 +191,120 @@ bool Creatures::ReadCreature (const int32_t index, t_creature & furball) Creatures2010::creature_offsets &offs = d->creatures; //read creature from memory - - // name - d->d->readName(furball.name,temp + offs.name_offset); - - // basic stuff - p->readDWord (temp + offs.happiness_offset, furball.happiness); - p->readDWord (temp + offs.id_offset, furball.id); - p->read (temp + offs.pos_offset, 3 * sizeof (uint16_t), (uint8_t *) & (furball.x)); // xyz really - p->readDWord (temp + offs.race_offset, furball.race); - furball.civ = p->readDWord (temp + offs.civ_offset); - p->readByte (temp + offs.sex_offset, furball.sex); - p->readWord (temp + offs.caste_offset, furball.caste); - p->readDWord (temp + offs.flags1_offset, furball.flags1.whole); - p->readDWord (temp + offs.flags2_offset, furball.flags2.whole); - - // physical attributes - p->read(temp + offs.physical_offset, - sizeof(t_attrib) * NUM_CREATURE_PHYSICAL_ATTRIBUTES, - (uint8_t *)&furball.strength); - - // mood stuff - furball.mood = (int16_t) p->readWord (temp + offs.mood_offset); - furball.mood_skill = p->readWord (temp + offs.mood_skill_offset); - d->d->readName(furball.artifact_name, temp + offs.artifact_name_offset); - - // custom profession - p->readSTLString(temp + offs.custom_profession_offset, furball.custom_profession, sizeof(furball.custom_profession)); - //fill_char_buf (furball.custom_profession, p->readSTLString (temp + offs.custom_profession_offset)); - - // labors - p->read (temp + offs.labors_offset, NUM_CREATURE_LABORS, furball.labors); - - // profession - furball.profession = p->readByte (temp + offs.profession_offset); - - furball.current_job.occupationPtr = p->readDWord (temp + offs.current_job_offset); - if(furball.current_job.occupationPtr) + if(d->Ft_basic) { - furball.current_job.active = true; - furball.current_job.jobType = p->readByte (furball.current_job.occupationPtr + d->OG_jobs->getOffset("type") ); - furball.current_job.jobId = p->readDWord (furball.current_job.occupationPtr + d->OG_jobs->getOffset("id") ); + // name + d->d->readName(furball.name,temp + offs.name_offset); + + // basic stuff + p->readDWord (temp + offs.id_offset, furball.id); + p->read (temp + offs.pos_offset, 3 * sizeof (uint16_t), (uint8_t *) & (furball.x)); // xyz really + p->readDWord (temp + offs.race_offset, furball.race); + furball.civ = p->readDWord (temp + offs.civ_offset); + p->readByte (temp + offs.sex_offset, furball.sex); + p->readWord (temp + offs.caste_offset, furball.caste); + p->readDWord (temp + offs.flags1_offset, furball.flags1.whole); + p->readDWord (temp + offs.flags2_offset, furball.flags2.whole); + // custom profession + p->readSTLString(temp + offs.custom_profession_offset, furball.custom_profession, sizeof(furball.custom_profession)); + // profession + furball.profession = p->readByte (temp + offs.profession_offset); } - else + if(d->Ft_advanced) { - furball.current_job.active = false;; - } - - furball.birth_year = p->readDWord (temp + offs.birth_year_offset ); - furball.birth_time = p->readDWord (temp + offs.birth_time_offset ); - - // current job HACK: the job object isn't cleanly represented here - /* - uint32_t jobIdAddr = p->readDWord (temp + offs.creature_current_job_offset); + // happiness + p->readDWord (temp + offs.happiness_offset, furball.happiness); + + // physical attributes + p->read(temp + offs.physical_offset, + sizeof(t_attrib) * NUM_CREATURE_PHYSICAL_ATTRIBUTES, + (uint8_t *)&furball.strength); + + // mood stuff + furball.mood = (int16_t) p->readWord (temp + offs.mood_offset); + furball.mood_skill = p->readWord (temp + offs.mood_skill_offset); + d->d->readName(furball.artifact_name, temp + offs.artifact_name_offset); + + // labors + p->read (temp + offs.labors_offset, NUM_CREATURE_LABORS, furball.labors); + furball.birth_year = p->readDWord (temp + offs.birth_year_offset ); + furball.birth_time = p->readDWord (temp + offs.birth_time_offset ); + /* + * p->readDWord(temp + offs.creature_pregnancy_offset, furball.pregnancy_timer); + */ + + // appearance + DfVector app(p, temp + offs.appearance_vector_offset); + furball.nbcolors = app.size(); + if(furball.nbcolors>MAX_COLORS) + furball.nbcolors = MAX_COLORS; + for(uint32_t i = 0; i < furball.nbcolors; i++) + { + furball.color[i] = app[i]; + } - if (jobIdAddr) - { - furball.current_job.active = true; - furball.current_job.jobId = p->readByte (jobIdAddr + offs.creature_current_job_id_offset); + //likes + /* + DfVector likes(d->p, temp + offs.creature_likes_offset); + furball.numLikes = likes.getSize(); + for(uint32_t i = 0;iread(temp2,sizeof(t_like),(uint8_t *) &furball.likes[i]); + }*/ } - else + if(d->Ft_soul) { - furball.current_job.active = false; - } - */ - - /* - p->readDWord(temp + offs.creature_pregnancy_offset, furball.pregnancy_timer); - */ + /* + // enum soul pointer vector + DfVector souls(p,temp + offs.creature_soul_vector_offset); + */ + uint32_t soul = p->readDWord(temp + offs.default_soul_offset); + furball.has_default_soul = false; + + if(soul) + { + furball.has_default_soul = true; + // get first soul's skills + DfVector skills(p, soul + offs.soul_skills_vector_offset); + furball.defaultSoul.numSkills = skills.size(); - /* - // enum soul pointer vector - DfVector souls(p,temp + offs.creature_soul_vector_offset); - */ - uint32_t soul = p->readDWord(temp + offs.default_soul_offset); - furball.has_default_soul = false; + for (uint32_t i = 0; i < furball.defaultSoul.numSkills;i++) + { + uint32_t temp2 = skills[i]; + // a byte: this gives us 256 skills maximum. + furball.defaultSoul.skills[i].id = p->readByte (temp2); + furball.defaultSoul.skills[i].rating = + p->readByte (temp2 + offsetof(t_skill, rating)); + furball.defaultSoul.skills[i].experience = + p->readWord (temp2 + offsetof(t_skill, experience)); + } - if(soul) - { - furball.has_default_soul = true; - // get first soul's skills - DfVector skills(p, soul + offs.soul_skills_vector_offset); - furball.defaultSoul.numSkills = skills.size(); + // mental attributes are part of the soul + p->read(soul + offs.soul_mental_offset, + sizeof(t_attrib) * NUM_CREATURE_MENTAL_ATTRIBUTES, + (uint8_t *)&furball.defaultSoul.analytical_ability); - for (uint32_t i = 0; i < furball.defaultSoul.numSkills;i++) - { - uint32_t temp2 = skills[i]; - // a byte: this gives us 256 skills maximum. - furball.defaultSoul.skills[i].id = p->readByte (temp2); - furball.defaultSoul.skills[i].rating = - p->readByte (temp2 + offsetof(t_skill, rating)); - furball.defaultSoul.skills[i].experience = - p->readWord (temp2 + offsetof(t_skill, experience)); + // traits as well + p->read(soul + offs.soul_traits_offset, + sizeof (uint16_t) * NUM_CREATURE_TRAITS, + (uint8_t *) &furball.defaultSoul.traits); } - - // mental attributes are part of the soul - p->read(soul + offs.soul_mental_offset, - sizeof(t_attrib) * NUM_CREATURE_MENTAL_ATTRIBUTES, - (uint8_t *)&furball.defaultSoul.analytical_ability); - - // traits as well - p->read(soul + offs.soul_traits_offset, - sizeof (uint16_t) * NUM_CREATURE_TRAITS, - (uint8_t *) &furball.defaultSoul.traits); } - - DfVector app(p, temp + offs.appearance_vector_offset); - furball.nbcolors = app.size(); - if(furball.nbcolors>MAX_COLORS) - furball.nbcolors = MAX_COLORS; - for(uint32_t i = 0; i < furball.nbcolors; i++) + if(d->Ft_jobs) { - furball.color[i] = app[i]; + furball.current_job.occupationPtr = p->readDWord (temp + offs.current_job_offset); + if(furball.current_job.occupationPtr) + { + furball.current_job.active = true; + furball.current_job.jobType = p->readByte (furball.current_job.occupationPtr + d->OG_jobs->getOffset("type") ); + furball.current_job.jobId = p->readDWord (furball.current_job.occupationPtr + d->OG_jobs->getOffset("id") ); + } + else + { + furball.current_job.active = false;; + } } - //likes - /* - DfVector likes(d->p, temp + offs.creature_likes_offset); - furball.numLikes = likes.getSize(); - for(uint32_t i = 0;iread(temp2,sizeof(t_like),(uint8_t *) &furball.likes[i]); - }*/ - return true; } diff --git a/library/modules/Materials.cpp b/library/modules/Materials.cpp index a7f4e63da..2ad78361e 100644 --- a/library/modules/Materials.cpp +++ b/library/modules/Materials.cpp @@ -29,6 +29,7 @@ distribution. #include "dfhack/VersionInfo.h" #include "dfhack/DFProcess.h" #include "dfhack/DFVector.h" +#include using namespace DFHack; @@ -335,20 +336,38 @@ bool Materials::ReadCreatureTypesEx (void) uint32_t extract_vector_offset = OG_Creature->getOffset ("extract_vector"); uint32_t tile_offset = OG_Creature->getOffset ("tile"); uint32_t tile_color_offset = OG_Creature->getOffset ("tile_color"); + + bool have_advanced = false; + uint32_t caste_colormod_offset; + uint32_t caste_attributes_offset; + uint32_t caste_bodypart_offset; + uint32_t bodypart_id_offset; + uint32_t bodypart_category_offset; + uint32_t bodypart_layers_offset; + uint32_t bodypart_singular_offset; + uint32_t bodypart_plural_offset; + uint32_t color_modifier_part_offset; + uint32_t color_modifier_startdate_offset; + uint32_t color_modifier_enddate_offset; + try + { OffsetGroup * OG_Caste = OG_Creature->getGroup("caste"); - uint32_t caste_colormod_offset = OG_Caste->getOffset ("color_modifiers"); - uint32_t caste_attributes_offset = OG_Caste->getOffset ("attributes"); - uint32_t caste_bodypart_offset = OG_Caste->getOffset ("bodypart_vector"); + caste_colormod_offset = OG_Caste->getOffset ("color_modifiers"); + caste_attributes_offset = OG_Caste->getOffset ("attributes"); + caste_bodypart_offset = OG_Caste->getOffset ("bodypart_vector"); OffsetGroup * OG_CasteBodyparts = OG_Creature->getGroup("caste_bodyparts"); - uint32_t bodypart_id_offset = OG_CasteBodyparts->getOffset ("id"); - uint32_t bodypart_category_offset = OG_CasteBodyparts->getOffset ("category"); - uint32_t bodypart_layers_offset = OG_CasteBodyparts->getOffset ("layers_vector"); // unused - uint32_t bodypart_singular_offset = OG_CasteBodyparts->getOffset ("singular_vector"); // unused - uint32_t bodypart_plural_offset = OG_CasteBodyparts->getOffset ("plural_vector"); // unused + bodypart_id_offset = OG_CasteBodyparts->getOffset ("id"); + bodypart_category_offset = OG_CasteBodyparts->getOffset ("category"); + bodypart_layers_offset = OG_CasteBodyparts->getOffset ("layers_vector"); // unused + bodypart_singular_offset = OG_CasteBodyparts->getOffset ("singular_vector"); // unused + bodypart_plural_offset = OG_CasteBodyparts->getOffset ("plural_vector"); // unused OffsetGroup * OG_CasteColorMods = OG_Creature->getGroup("caste_color_mods"); - uint32_t color_modifier_part_offset = OG_CasteColorMods->getOffset ("part"); - uint32_t color_modifier_startdate_offset = OG_CasteColorMods->getOffset ("startdate"); - uint32_t color_modifier_enddate_offset = OG_CasteColorMods->getOffset ("enddate"); + color_modifier_part_offset = OG_CasteColorMods->getOffset ("part"); + color_modifier_startdate_offset = OG_CasteColorMods->getOffset ("startdate"); + color_modifier_enddate_offset = OG_CasteColorMods->getOffset ("enddate"); + have_advanced = true; + } + catch (Error::All &){}; uint32_t size = p_races.size(); uint32_t sizecas = 0; @@ -383,38 +402,36 @@ bool Materials::ReadCreatureTypesEx (void) p->readSTLString (caste_start + sizeof_string, caste.singular, sizeof(caste.singular)); p->readSTLString (caste_start + 2 * sizeof_string, caste.plural, sizeof(caste.plural)); p->readSTLString (caste_start + 3 * sizeof_string, caste.adjective, sizeof(caste.adjective)); - - /* color mod reading */ - DfVector p_colormod(p, caste_start + caste_colormod_offset); - sizecolormod = p_colormod.size(); - caste.ColorModifier.resize(sizecolormod); - for(uint32_t k = 0; k < sizecolormod;k++) - { - DfVector p_colorlist(p, p_colormod[k]); - sizecolorlist = p_colorlist.size(); - caste.ColorModifier[k].colorlist.resize(sizecolorlist); - for(uint32_t l = 0; l < sizecolorlist; l++) - caste.ColorModifier[k].colorlist[l] = p_colorlist[l]; - p->readSTLString( p_colormod[k] + color_modifier_part_offset, caste.ColorModifier[k].part, sizeof(caste.ColorModifier[k].part)); - caste.ColorModifier[k].startdate = p->readDWord( p_colormod[k] + color_modifier_startdate_offset ); - caste.ColorModifier[k].enddate = p->readDWord( p_colormod[k] + color_modifier_enddate_offset ); - } - - /* body parts */ - DfVector p_bodypart(p, caste_start + caste_bodypart_offset); - caste.bodypart.empty(); - sizebp = p_bodypart.size(); - for(uint32_t k = 0; k < sizebp; k++) + if(have_advanced) { - t_bodypart part; - p->readSTLString (p_bodypart[k] + bodypart_id_offset, part.id, sizeof(part.id)); - p->readSTLString (p_bodypart[k] + bodypart_category_offset, part.category, sizeof(part.category)); - caste.bodypart.push_back(part); + /* color mod reading */ + DfVector p_colormod(p, caste_start + caste_colormod_offset); + sizecolormod = p_colormod.size(); + caste.ColorModifier.resize(sizecolormod); + for(uint32_t k = 0; k < sizecolormod;k++) + { + DfVector p_colorlist(p, p_colormod[k]); + sizecolorlist = p_colorlist.size(); + caste.ColorModifier[k].colorlist.resize(sizecolorlist); + for(uint32_t l = 0; l < sizecolorlist; l++) + caste.ColorModifier[k].colorlist[l] = p_colorlist[l]; + p->readSTLString( p_colormod[k] + color_modifier_part_offset, caste.ColorModifier[k].part, sizeof(caste.ColorModifier[k].part)); + caste.ColorModifier[k].startdate = p->readDWord( p_colormod[k] + color_modifier_startdate_offset ); + caste.ColorModifier[k].enddate = p->readDWord( p_colormod[k] + color_modifier_enddate_offset ); + } + /* body parts */ + DfVector p_bodypart(p, caste_start + caste_bodypart_offset); + caste.bodypart.empty(); + sizebp = p_bodypart.size(); + for(uint32_t k = 0; k < sizebp; k++) + { + t_bodypart part; + p->readSTLString (p_bodypart[k] + bodypart_id_offset, part.id, sizeof(part.id)); + p->readSTLString (p_bodypart[k] + bodypart_category_offset, part.category, sizeof(part.category)); + caste.bodypart.push_back(part); + } + p->read(caste_start + caste_attributes_offset, sizeof(t_attrib) * (6+11), (uint8_t *)&caste.strength); } - - - p->read(caste_start + caste_attributes_offset, sizeof(t_attrib) * (6+11), (uint8_t *)&caste.strength); - mat.castes.push_back(caste); } DfVector p_extract(p, p_races[i] + extract_vector_offset); @@ -438,7 +455,7 @@ void Materials::ReadAllMaterials(void) this->ReadCreatureTypes(); this->ReadCreatureTypesEx(); this->ReadDescriptorColors(); - this->ReadOthers(); + //this->ReadOthers(); } std::string Materials::getDescription(t_material & mat) diff --git a/tools/examples/creaturedump.cpp b/tools/examples/creaturedump.cpp index c4bb8e4ac..eb611eefe 100644 --- a/tools/examples/creaturedump.cpp +++ b/tools/examples/creaturedump.cpp @@ -453,8 +453,14 @@ int main (int numargs, char ** args) } mem = DF->getMemoryInfo(); - Materials->ReadAllMaterials(); - + Materials->ReadInorganicMaterials(); + Materials->ReadOrganicMaterials(); + Materials->ReadWoodMaterials(); + Materials->ReadPlantMaterials(); + Materials->ReadCreatureTypes(); + Materials->ReadCreatureTypesEx(); + Materials->ReadDescriptorColors(); + if(!Tran->Start()) { cerr << "Can't get name tables" << endl;