Creature rework

develop
Petr Mrázek 2010-09-03 02:15:09 +02:00
parent ece423a611
commit dc6aa19083
3 changed files with 63 additions and 67 deletions

@ -50,6 +50,10 @@ struct Creatures::Private
{ {
bool Inited; bool Inited;
bool Started; bool Started;
bool Ft_basic;
bool Ft_advanced;
bool Ft_jobs;
bool Ft_soul;
Creatures2010::creature_offsets creatures; Creatures2010::creature_offsets creatures;
uint32_t creature_module; uint32_t creature_module;
uint32_t dwarf_race_index_addr; uint32_t dwarf_race_index_addr;
@ -69,17 +73,24 @@ Creatures::Creatures(DFContextShared* _d)
d->Inited = false; d->Inited = false;
d->Started = false; d->Started = false;
d->d->InitReadNames(); // throws on error d->d->InitReadNames(); // throws on error
try
{
VersionInfo * minfo = d->d->offset_descriptor; VersionInfo * minfo = d->d->offset_descriptor;
Creatures2010::creature_offsets &creatures = d->creatures;
OffsetGroup *OG_Creatures = minfo->getGroup("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"); creatures.vector = OG_Creatures->getAddress ("vector");
d->dwarf_race_index_addr = OG_Creatures->getAddress("current_race"); d->dwarf_race_index_addr = OG_Creatures->getAddress("current_race");
d->dwarf_civ_id_addr = OG_Creatures->getAddress("current_civ"); 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.name_offset = OG_creature->getOffset ("name");
creatures.custom_profession_offset = OG_creature->getOffset ("custom_profession"); creatures.custom_profession_offset = OG_creature->getOffset ("custom_profession");
creatures.profession_offset = OG_creature->getOffset ("profession"); creatures.profession_offset = OG_creature->getOffset ("profession");
@ -91,7 +102,12 @@ Creatures::Creatures(DFContextShared* _d)
creatures.caste_offset = OG_creature->getOffset ("caste"); creatures.caste_offset = OG_creature->getOffset ("caste");
creatures.id_offset = OG_creature->getOffset ("id"); creatures.id_offset = OG_creature->getOffset ("id");
creatures.civ_offset = OG_creature->getOffset ("civ"); 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.inventory_offset = OG_creature_ex->getOffset("inventory_vector");
creatures.pickup_equipment_bit = OG_creature_ex->getOffset("pickup_equipment_bit"); creatures.pickup_equipment_bit = OG_creature_ex->getOffset("pickup_equipment_bit");
@ -105,46 +121,24 @@ Creatures::Creatures(DFContextShared* _d)
creatures.physical_offset = OG_creature_ex->getOffset("physical"); creatures.physical_offset = OG_creature_ex->getOffset("physical");
creatures.appearance_vector_offset = OG_creature_ex->getOffset("appearance_vector"); creatures.appearance_vector_offset = OG_creature_ex->getOffset("appearance_vector");
creatures.artifact_name_offset = OG_creature_ex->getOffset("artifact_name"); 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.labors_offset = OG_creature_ex->getOffset ("labors");
creatures.happiness_offset = OG_creature_ex->getOffset ("happiness"); creatures.happiness_offset = OG_creature_ex->getOffset ("happiness");
} d->Ft_advanced = true;
} try
OffsetGroup *OG_soul = OG_Creatures->getGroup("soul");
{ {
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_mental_offset = OG_soul->getOffset("mental");
creatures.soul_skills_vector_offset = OG_soul->getOffset("skills_vector"); creatures.soul_skills_vector_offset = OG_soul->getOffset("skills_vector");
creatures.soul_traits_offset = OG_soul->getOffset("traits"); creatures.soul_traits_offset = OG_soul->getOffset("traits");
d->Ft_soul = true;
} }
catch(Error::All&){};
} }
// name offsets for the creature module catch(Error::All&){};
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&){};
d->Inited = true; d->Inited = true;
}
catch (Error::MissingMemoryDefinition&)
{
d->Inited = false;
throw;
}
} }
Creatures::~Creatures() Creatures::~Creatures()

@ -26,11 +26,13 @@ void printWeather(DFHack::WeatherType current)
break; break;
case RAINING: case RAINING:
cout << "It is raining." << endl; cout << "It is raining." << endl;
cout << "Options:" << endl;
cout << "'c' to clear the sky." << endl; cout << "'c' to clear the sky." << endl;
cout << "'s' to make it snow." << endl; cout << "'s' to make it snow." << endl;
break; break;
case SNOWING: case SNOWING:
cout << "It is snowing." << endl; cout << "It is snowing." << endl;
cout << "Options:" << endl;
cout << "'c' to clear the sky." << endl; cout << "'c' to clear the sky." << endl;
cout << "'r' to make it rain." << endl; cout << "'r' to make it rain." << endl;
break; break;