|
|
|
@ -50,6 +50,10 @@ struct Creatures::Private
|
|
|
|
|
{
|
|
|
|
|
bool Inited;
|
|
|
|
|
bool Started;
|
|
|
|
|
bool Ft_basic;
|
|
|
|
|
bool Ft_advanced;
|
|
|
|
|
bool Ft_jobs;
|
|
|
|
|
bool Ft_soul;
|
|
|
|
|
Creatures2010::creature_offsets creatures;
|
|
|
|
|
uint32_t creature_module;
|
|
|
|
|
uint32_t dwarf_race_index_addr;
|
|
|
|
@ -69,17 +73,24 @@ Creatures::Creatures(DFContextShared* _d)
|
|
|
|
|
d->Inited = false;
|
|
|
|
|
d->Started = false;
|
|
|
|
|
d->d->InitReadNames(); // throws on error
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
VersionInfo * minfo = d->d->offset_descriptor;
|
|
|
|
|
Creatures2010::creature_offsets &creatures = d->creatures;
|
|
|
|
|
OffsetGroup *OG_Creatures = minfo->getGroup("Creatures");
|
|
|
|
|
OffsetGroup *OG_creature = OG_Creatures->getGroup("creature");
|
|
|
|
|
OffsetGroup *OG_creature_ex = OG_creature->getGroup("advanced");
|
|
|
|
|
OffsetGroup *OG_soul = OG_Creatures->getGroup("soul");
|
|
|
|
|
OffsetGroup * OG_name = minfo->getGroup("name");
|
|
|
|
|
d->OG_jobs = OG_Creatures->getGroup("job");
|
|
|
|
|
d->OG_job_mats = d->OG_jobs->getGroup("material");
|
|
|
|
|
d->Ft_basic = d->Ft_advanced = d->Ft_jobs = d->Ft_soul = false;
|
|
|
|
|
|
|
|
|
|
Creatures2010::creature_offsets &creatures = d->creatures;
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
// Creatures
|
|
|
|
|
creatures.vector = OG_Creatures->getAddress ("vector");
|
|
|
|
|
d->dwarf_race_index_addr = OG_Creatures->getAddress("current_race");
|
|
|
|
|
d->dwarf_civ_id_addr = OG_Creatures->getAddress("current_civ");
|
|
|
|
|
OffsetGroup *OG_creature = OG_Creatures->getGroup("creature");
|
|
|
|
|
{
|
|
|
|
|
// Creatures/creature
|
|
|
|
|
creatures.name_offset = OG_creature->getOffset ("name");
|
|
|
|
|
creatures.custom_profession_offset = OG_creature->getOffset ("custom_profession");
|
|
|
|
|
creatures.profession_offset = OG_creature->getOffset ("profession");
|
|
|
|
@ -91,7 +102,12 @@ Creatures::Creatures(DFContextShared* _d)
|
|
|
|
|
creatures.caste_offset = OG_creature->getOffset ("caste");
|
|
|
|
|
creatures.id_offset = OG_creature->getOffset ("id");
|
|
|
|
|
creatures.civ_offset = OG_creature->getOffset ("civ");
|
|
|
|
|
OffsetGroup *OG_creature_ex = OG_creature->getGroup("advanced");
|
|
|
|
|
// name struct
|
|
|
|
|
creatures.name_firstname_offset = OG_name->getOffset("first");
|
|
|
|
|
creatures.name_nickname_offset = OG_name->getOffset("nick");
|
|
|
|
|
creatures.name_words_offset = OG_name->getOffset("second_words");
|
|
|
|
|
d->Ft_basic = true;
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
creatures.inventory_offset = OG_creature_ex->getOffset("inventory_vector");
|
|
|
|
|
creatures.pickup_equipment_bit = OG_creature_ex->getOffset("pickup_equipment_bit");
|
|
|
|
@ -105,47 +121,25 @@ Creatures::Creatures(DFContextShared* _d)
|
|
|
|
|
creatures.physical_offset = OG_creature_ex->getOffset("physical");
|
|
|
|
|
creatures.appearance_vector_offset = OG_creature_ex->getOffset("appearance_vector");
|
|
|
|
|
creatures.artifact_name_offset = OG_creature_ex->getOffset("artifact_name");
|
|
|
|
|
creatures.soul_vector_offset = OG_creature_ex->getOffset("soul_vector");
|
|
|
|
|
creatures.default_soul_offset = OG_creature_ex->getOffset("current_soul");
|
|
|
|
|
creatures.labors_offset = OG_creature_ex->getOffset ("labors");
|
|
|
|
|
creatures.happiness_offset = OG_creature_ex->getOffset ("happiness");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
OffsetGroup *OG_soul = OG_Creatures->getGroup("soul");
|
|
|
|
|
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&){};
|
|
|
|
|
}
|
|
|
|
|
// name offsets for the creature module
|
|
|
|
|
OffsetGroup * OG_name = minfo->getGroup("name");
|
|
|
|
|
{
|
|
|
|
|
creatures.name_firstname_offset = OG_name->getOffset("first");
|
|
|
|
|
creatures.name_nickname_offset = OG_name->getOffset("nick");
|
|
|
|
|
creatures.name_words_offset = OG_name->getOffset("second_words");
|
|
|
|
|
}
|
|
|
|
|
d->OG_jobs = OG_Creatures->getGroup("job");
|
|
|
|
|
d->OG_job_mats = d->OG_jobs->getGroup("material");
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
// upload offsets to the SHM
|
|
|
|
|
if(p->getModuleIndex("Creatures2010",1,d->creature_module))
|
|
|
|
|
{
|
|
|
|
|
// supply the module with offsets so it can work with them
|
|
|
|
|
memcpy(SHMDATA(Creatures2010::creature_offsets),&creatures,sizeof(Creatures2010::creature_offsets));
|
|
|
|
|
const uint32_t cmd = Creatures2010::CREATURE_INIT + (d->creature_module << 16);
|
|
|
|
|
p->SetAndWait(cmd);
|
|
|
|
|
catch(Error::All&){};
|
|
|
|
|
}
|
|
|
|
|
*/
|
|
|
|
|
catch(Error::All&){};
|
|
|
|
|
d->Inited = true;
|
|
|
|
|
}
|
|
|
|
|
catch (Error::MissingMemoryDefinition&)
|
|
|
|
|
{
|
|
|
|
|
d->Inited = false;
|
|
|
|
|
throw;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Creatures::~Creatures()
|
|
|
|
|
{
|
|
|
|
|