diff --git a/library/include/modules/Units.h b/library/include/modules/Units.h index 08baf98d6..80c7fcabf 100644 --- a/library/include/modules/Units.h +++ b/library/include/modules/Units.h @@ -60,123 +60,12 @@ namespace DFHack { namespace Units { -/** - * \ingroup grp_units - */ -struct t_skill -{ - uint32_t id; - uint32_t rating; - uint32_t experience; -}; -/** - * \ingroup grp_units - */ -struct t_job -{ - bool active; - uint32_t jobId; - uint8_t jobType; - uint32_t occupationPtr; -}; -/** - * \ingroup grp_units - */ -struct t_like -{ - int16_t type; - int16_t itemClass; - int16_t itemIndex; - t_matglossPair material; - bool active; - uint32_t mystery; -}; -// FIXME: THIS IS VERY, VERY BAD. -#define NUM_CREATURE_LABORS 96 -#define NUM_CREATURE_TRAITS 30 -#define NUM_CREATURE_MENTAL_ATTRIBUTES 13 -#define NUM_CREATURE_PHYSICAL_ATTRIBUTES 6 -/** - * Structure for holding a copy of a DF unit's soul - * \ingroup grp_units - */ -struct t_soul -{ - uint8_t numSkills; - t_skill skills[256]; - //uint8_t numLikes; - //t_like likes[32]; - uint16_t traits[NUM_CREATURE_TRAITS]; - t_attrib analytical_ability; - t_attrib focus; - t_attrib willpower; - t_attrib creativity; - t_attrib intuition; - t_attrib patience; - t_attrib memory; - t_attrib linguistic_ability; - t_attrib spatial_sense; - t_attrib musicality; - t_attrib kinesthetic_sense; - t_attrib empathy; - t_attrib social_awareness; -}; -#define MAX_COLORS 15 -struct df_unit; -/** - * Structure for holding a limited copy of a DF unit - * \ingroup grp_units - */ -struct t_unit -{ - df::unit * origin; - uint16_t x; - uint16_t y; - uint16_t z; - uint32_t race; - int32_t civ; - - df::unit_flags1 flags1; - df::unit_flags2 flags2; - df::unit_flags3 flags3; - - t_name name; - - int16_t mood; - int16_t mood_skill; - t_name artifact_name; - - uint8_t profession; - std::string custom_profession; - - // enabled labors - uint8_t labors[NUM_CREATURE_LABORS]; - t_job current_job; - - uint32_t happiness; - uint32_t id; - t_attrib strength; - t_attrib agility; - t_attrib toughness; - t_attrib endurance; - t_attrib recuperation; - t_attrib disease_resistance; - int32_t squad_leader_id; - uint8_t sex; - uint16_t caste; - uint32_t pregnancy_timer; //Countdown timer to giving birth - //bool has_default_soul; - //t_soul defaultSoul; - uint32_t nbcolors; - uint32_t color[MAX_COLORS]; - - int32_t birth_year; - uint32_t birth_time; -}; +static const int MAX_COLORS = 15; + /** - * The Creatures module - allows reading all non-vermin creatures and their properties + * The Units module - allows reading all non-vermin creatures and their properties * \ingroup grp_modules * \ingroup grp_units */ @@ -187,24 +76,12 @@ DFHACK_EXPORT bool isValid(); // Read creatures in a box, starting with index. Returns -1 if no more creatures // found. Call repeatedly do get all creatures in a specified box (uses tile coords) DFHACK_EXPORT int32_t getNumCreatures(); -DFHACK_EXPORT int32_t GetCreatureInBox(const int32_t index, df::unit ** furball, +DFHACK_EXPORT df::unit * getCreature(const int32_t index); +DFHACK_EXPORT int32_t getCreatureInBox(const int32_t index, df::unit ** furball, const uint16_t x1, const uint16_t y1,const uint16_t z1, const uint16_t x2, const uint16_t y2,const uint16_t z2); -DFHACK_EXPORT df::unit * GetCreature(const int32_t index); -DFHACK_EXPORT void CopyCreature(df::unit * source, t_unit & target); - -DFHACK_EXPORT bool ReadJob(const df::unit * unit, std::vector & mat); - -DFHACK_EXPORT bool ReadInventoryByIdx(const uint32_t index, std::vector & item); -DFHACK_EXPORT bool ReadInventoryByPtr(const df::unit * unit, std::vector & item); - -DFHACK_EXPORT int32_t FindIndexById(int32_t id); - -/* Getters */ -DFHACK_EXPORT uint32_t GetDwarfRaceIndex ( void ); -DFHACK_EXPORT int32_t GetDwarfCivId ( void ); -DFHACK_EXPORT void CopyNameTo(df::unit *creature, df::language_name * target); +DFHACK_EXPORT int32_t findIndexById(int32_t id); /// Returns the true position of the unit (non-trivial in case of caged). DFHACK_EXPORT df::coord getPosition(df::unit *unit); diff --git a/library/modules/Units.cpp b/library/modules/Units.cpp index 94b11b87e..b8170148c 100644 --- a/library/modules/Units.cpp +++ b/library/modules/Units.cpp @@ -93,7 +93,7 @@ int32_t Units::getNumCreatures() return world->units.all.size(); } -df::unit * Units::GetCreature (const int32_t index) +df::unit * Units::getCreature (const int32_t index) { if (!isValid()) return NULL; @@ -104,7 +104,7 @@ df::unit * Units::GetCreature (const int32_t index) } // returns index of creature actually read or -1 if no creature can be found -int32_t Units::GetCreatureInBox (int32_t index, df::unit ** furball, +int32_t Units::getCreatureInBox (int32_t index, df::unit ** furball, const uint16_t x1, const uint16_t y1, const uint16_t z1, const uint16_t x2, const uint16_t y2, const uint16_t z2) { @@ -133,387 +133,10 @@ int32_t Units::GetCreatureInBox (int32_t index, df::unit ** furball, return -1; } -void Units::CopyCreature(df::unit * source, t_unit & furball) -{ - if(!isValid()) return; - // read pointer from vector at position - furball.origin = source; - - //read creature from memory - // name - Translation::readName(furball.name, &source->name); - - // basic stuff - furball.id = source->id; - furball.x = source->pos.x; - furball.y = source->pos.y; - furball.z = source->pos.z; - furball.race = source->race; - furball.civ = source->civ_id; - furball.sex = source->sex; - furball.caste = source->caste; - furball.flags1.whole = source->flags1.whole; - furball.flags2.whole = source->flags2.whole; - furball.flags3.whole = source->flags3.whole; - // custom profession - furball.custom_profession = source->custom_profession; - // profession - furball.profession = source->profession; - // happiness - furball.happiness = 100;//source->status.happiness; - // physical attributes - memcpy(&furball.strength, source->body.physical_attrs, sizeof(source->body.physical_attrs)); - - // mood stuff - furball.mood = source->mood; - furball.mood_skill = source->job.mood_skill; // FIXME: really? More like currently used skill anyway. - Translation::readName(furball.artifact_name, &source->status.artifact_name); - - // labors - memcpy(&furball.labors, &source->status.labors, sizeof(furball.labors)); - - furball.birth_year = source->birth_year; - furball.birth_time = source->birth_time; - furball.pregnancy_timer = source->pregnancy_timer; - // appearance - furball.nbcolors = source->appearance.colors.size(); - if(furball.nbcolors>MAX_COLORS) - furball.nbcolors = MAX_COLORS; - for(uint32_t i = 0; i < furball.nbcolors; i++) - { - furball.color[i] = source->appearance.colors[i]; - } - - //likes. FIXME: where do they fit in now? The soul? - /* - 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]); - } - */ - /* - if(d->Ft_soul) - { - uint32_t soul = p->readDWord(addr_cr + offs.default_soul_offset); - furball.has_default_soul = false; - - if(soul) - { - furball.has_default_soul = true; - // get first soul's skills - DfVector skills(soul + offs.soul_skills_vector_offset); - furball.defaultSoul.numSkills = skills.size(); - - 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)); - } - - // 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); - } - } - */ - if(source->job.current_job == NULL) - { - furball.current_job.active = false; - } - else - { - furball.current_job.active = true; - furball.current_job.jobType = source->job.current_job->job_type; - furball.current_job.jobId = source->job.current_job->id; - } -} - -int32_t Units::FindIndexById(int32_t creature_id) +int32_t Units::findIndexById(int32_t creature_id) { return df::unit::binsearch_index(world->units.all, creature_id); } -/* -bool Creatures::WriteLabors(const uint32_t index, uint8_t labors[NUM_CREATURE_LABORS]) -{ - if(!d->Started || !d->Ft_advanced) return false; - - uint32_t temp = d->p_cre->at (index); - Process * p = d->owner; - - p->write(temp + d->creatures.labors_offset, NUM_CREATURE_LABORS, labors); - uint32_t pickup_equip; - p->readDWord(temp + d->creatures.pickup_equipment_bit, pickup_equip); - pickup_equip |= 1u; - p->writeDWord(temp + d->creatures.pickup_equipment_bit, pickup_equip); - return true; -} - -bool Creatures::WriteHappiness(const uint32_t index, const uint32_t happinessValue) -{ - if(!d->Started || !d->Ft_advanced) return false; - - uint32_t temp = d->p_cre->at (index); - Process * p = d->owner; - p->writeDWord (temp + d->creatures.happiness_offset, happinessValue); - return true; -} - -bool Creatures::WriteFlags(const uint32_t index, - const uint32_t flags1, - const uint32_t flags2) -{ - if(!d->Started || !d->Ft_basic) return false; - - uint32_t temp = d->p_cre->at (index); - Process * p = d->owner; - p->writeDWord (temp + d->creatures.flags1_offset, flags1); - p->writeDWord (temp + d->creatures.flags2_offset, flags2); - return true; -} - -bool Creatures::WriteFlags(const uint32_t index, - const uint32_t flags1, - const uint32_t flags2, - const uint32_t flags3) -{ - if(!d->Started || !d->Ft_basic) return false; - - uint32_t temp = d->p_cre->at (index); - Process * p = d->owner; - p->writeDWord (temp + d->creatures.flags1_offset, flags1); - p->writeDWord (temp + d->creatures.flags2_offset, flags2); - p->writeDWord (temp + d->creatures.flags3_offset, flags3); - return true; -} - -bool Creatures::WriteSkills(const uint32_t index, const t_soul &soul) -{ - if(!d->Started || !d->Ft_soul) return false; - - uint32_t temp = d->p_cre->at (index); - Process * p = d->owner; - uint32_t souloff = p->readDWord(temp + d->creatures.default_soul_offset); - - if(!souloff) - { - return false; - } - - DfVector skills(souloff + d->creatures.soul_skills_vector_offset); - - for (uint32_t i=0; iwriteByte(temp2 + offsetof(t_skill, rating), soul.skills[i].rating); - p->writeWord(temp2 + offsetof(t_skill, experience), soul.skills[i].experience); - } - - return true; -} - -bool Creatures::WriteAttributes(const uint32_t index, const t_creature &creature) -{ - if(!d->Started || !d->Ft_advanced || !d->Ft_soul) return false; - - uint32_t temp = d->p_cre->at (index); - Process * p = d->owner; - uint32_t souloff = p->readDWord(temp + d->creatures.default_soul_offset); - - if(!souloff) - { - return false; - } - - // physical attributes - p->write(temp + d->creatures.physical_offset, - sizeof(t_attrib) * NUM_CREATURE_PHYSICAL_ATTRIBUTES, - (uint8_t *)&creature.strength); - - // mental attributes are part of the soul - p->write(souloff + d->creatures.soul_mental_offset, - sizeof(t_attrib) * NUM_CREATURE_MENTAL_ATTRIBUTES, - (uint8_t *)&creature.defaultSoul.analytical_ability); - - return true; -} - -bool Creatures::WriteSex(const uint32_t index, const uint8_t sex) -{ - if(!d->Started || !d->Ft_basic ) return false; - - uint32_t temp = d->p_cre->at (index); - Process * p = d->owner; - p->writeByte (temp + d->creatures.sex_offset, sex); - - return true; -} - -bool Creatures::WriteTraits(const uint32_t index, const t_soul &soul) -{ - if(!d->Started || !d->Ft_soul) return false; - - uint32_t temp = d->p_cre->at (index); - Process * p = d->owner; - uint32_t souloff = p->readDWord(temp + d->creatures.default_soul_offset); - - if(!souloff) - { - return false; - } - - p->write(souloff + d->creatures.soul_traits_offset, - sizeof (uint16_t) * NUM_CREATURE_TRAITS, - (uint8_t *) &soul.traits); - - return true; -} - -bool Creatures::WriteMood(const uint32_t index, const uint16_t mood) -{ - if(!d->Started || !d->Ft_advanced) return false; - - uint32_t temp = d->p_cre->at (index); - Process * p = d->owner; - p->writeWord(temp + d->creatures.mood_offset, mood); - return true; -} - -bool Creatures::WriteMoodSkill(const uint32_t index, const uint16_t moodSkill) -{ - if(!d->Started || !d->Ft_advanced) return false; - - uint32_t temp = d->p_cre->at (index); - Process * p = d->owner; - p->writeWord(temp + d->creatures.mood_skill_offset, moodSkill); - return true; -} - -bool Creatures::WriteJob(const t_creature * furball, std::vector const& mat) -{ - if(!d->Inited || !d->Ft_job_materials) return false; - if(!furball->current_job.active) return false; - - unsigned int i; - Process * p = d->owner; - Private::t_offsets & off = d->creatures; - DfVector cmats(furball->current_job.occupationPtr + off.job_materials_vector); - - for(i=0;iwriteWord(cmats[i] + off.job_material_itemtype_o, mat[i].itemType); - p->writeWord(cmats[i] + off.job_material_subtype_o, mat[i].itemSubtype); - p->writeWord(cmats[i] + off.job_material_subindex_o, mat[i].subIndex); - p->writeDWord(cmats[i] + off.job_material_index_o, mat[i].index); - p->writeDWord(cmats[i] + off.job_material_flags_o, mat[i].flags); - } - return true; -} - -bool Creatures::WritePos(const uint32_t index, const t_creature &creature) -{ - if(!d->Started) return false; - - uint32_t temp = d->p_cre->at (index); - Process * p = d->owner; - p->write (temp + d->creatures.pos_offset, 3 * sizeof (uint16_t), (uint8_t *) & (creature.x)); - return true; -} - -bool Creatures::WriteCiv(const uint32_t index, const int32_t civ) -{ - if(!d->Started) return false; - - uint32_t temp = d->p_cre->at (index); - Process * p = d->owner; - p->writeDWord(temp + d->creatures.civ_offset, civ); - return true; -} - -bool Creatures::WritePregnancy(const uint32_t index, const uint32_t pregTimer) -{ - if(!d->Started) return false; - - uint32_t temp = d->p_cre->at (index); - Process * p = d->owner; - p->writeDWord(temp + d->creatures.pregnancy_offset, pregTimer); - return true; -} -*/ -uint32_t Units::GetDwarfRaceIndex() -{ - return ui->race_id; -} - -int32_t Units::GetDwarfCivId() -{ - return ui->civ_id; -} -/* -bool Creatures::getCurrentCursorCreature(uint32_t & creature_index) -{ - if(!d->cursorWindowInited) return false; - Process * p = d->owner; - creature_index = p->readDWord(d->current_cursor_creature_offset); - return true; -} -*/ -/* -bool Creatures::ReadJob(const t_creature * furball, vector & mat) -{ - unsigned int i; - if(!d->Inited || !d->Ft_job_materials) return false; - if(!furball->current_job.active) return false; - - Process * p = d->owner; - Private::t_offsets & off = d->creatures; - DfVector cmats(furball->current_job.occupationPtr + off.job_materials_vector); - mat.resize(cmats.size()); - for(i=0;ireadWord(cmats[i] + off.job_material_itemtype_o); - mat[i].itemSubtype = p->readWord(cmats[i] + off.job_material_subtype_o); - mat[i].subIndex = p->readWord(cmats[i] + off.job_material_subindex_o); - mat[i].index = p->readDWord(cmats[i] + off.job_material_index_o); - mat[i].flags = p->readDWord(cmats[i] + off.job_material_flags_o); - } - return true; -} -*/ -bool Units::ReadInventoryByIdx(const uint32_t index, std::vector & item) -{ - if(index >= world->units.all.size()) return false; - df::unit * temp = world->units.all[index]; - return ReadInventoryByPtr(temp, item); -} - -bool Units::ReadInventoryByPtr(const df::unit * unit, std::vector & items) -{ - if(!isValid()) return false; - if(!unit) return false; - items.clear(); - for (size_t i = 0; i < unit->inventory.size(); i++) - items.push_back(unit->inventory[i]->item); - return true; -} - -void Units::CopyNameTo(df::unit * creature, df::language_name * target) -{ - Translation::copyName(&creature->name, target); -} df::coord Units::getPosition(df::unit *unit) { diff --git a/plugins/zone.cpp b/plugins/zone.cpp index fe98e8811..e41704044 100644 --- a/plugins/zone.cpp +++ b/plugins/zone.cpp @@ -450,7 +450,7 @@ void unitInfo(color_ostream & out, df::unit* unit, bool verbose = false) if(verbose) { out << ". Pos: ("<pos.x << "/"<< unit->pos.y << "/" << unit->pos.z << ") " << endl; - out << "index in units vector: " << FindIndexById(unit->id) << endl; + out << "index in units vector: " << findIndexById(unit->id) << endl; } out << endl;