From 65bf8f69fd69211b659d3f0f5bc09705c87c3f54 Mon Sep 17 00:00:00 2001 From: Zhentar Date: Fri, 5 Mar 2010 00:02:41 -0600 Subject: [PATCH] Proper-fy name handling for creatures. For surnames and such, official DF logic is used. --- library/DFHackAPI.cpp | 119 +++++++++++++++++++++++++++++++++++------- library/DFHackAPI.h | 6 +-- library/DFTypes.h | 22 ++++---- output/Memory.xml | 9 ++-- 4 files changed, 118 insertions(+), 38 deletions(-) diff --git a/library/DFHackAPI.cpp b/library/DFHackAPI.cpp index 9b82582d0..515225366 100644 --- a/library/DFHackAPI.cpp +++ b/library/DFHackAPI.cpp @@ -65,9 +65,7 @@ public: uint32_t creature_type_offset; uint32_t creature_flags1_offset; uint32_t creature_flags2_offset; - uint32_t creature_first_name_offset; - uint32_t creature_nick_name_offset; - uint32_t creature_last_name_offset; + uint32_t creature_name_offset; uint32_t creature_custom_profession_offset; uint32_t creature_profession_offset; @@ -86,6 +84,7 @@ public: uint32_t creature_happiness_offset; uint32_t creature_traits_offset; uint32_t creature_likes_offset; + uint32_t creature_artifact_name_offset; uint32_t item_material_offset; @@ -875,9 +874,7 @@ bool API::InitReadCreatures( uint32_t &numcreatures ) d->creature_type_offset = minfo->getOffset ("creature_race"); d->creature_flags1_offset = minfo->getOffset ("creature_flags1"); d->creature_flags2_offset = minfo->getOffset ("creature_flags2"); - d->creature_first_name_offset = minfo->getOffset ("creature_first_name"); - d->creature_nick_name_offset = minfo->getOffset ("creature_nick_name"); - d->creature_last_name_offset = minfo->getOffset ("creature_last_name"); + d->creature_name_offset = minfo->getOffset ("creature_name"); d->creature_custom_profession_offset = minfo->getOffset ("creature_custom_profession"); d->creature_profession_offset = minfo->getOffset ("creature_profession"); d->creature_sex_offset = minfo->getOffset ("creature_sex"); @@ -895,6 +892,7 @@ bool API::InitReadCreatures( uint32_t &numcreatures ) d->creature_happiness_offset = minfo->getOffset ("creature_happiness"); d->creature_traits_offset = minfo->getOffset ("creature_traits"); d->creature_likes_offset = minfo->getOffset("creature_likes"); + d->creature_artifact_name_offset = minfo->getOffset("creature_artifact_name"); d->p_cre = new DfVector (d->p->readVector (creatures, 4)); //InitReadNameTables(); @@ -1103,6 +1101,13 @@ bool API::getItemIndexesInBox(vector &indexes, return true; } +void readName(t_name & name, uint32_t address) +{ + g_pProcess->readSTLString(address, name.first_name, 128); + g_pProcess->readSTLString(address + sizeof(string), name.nickname, 128); + g_pProcess->read(address + 2 * sizeof(string),48, (uint8_t *) name.words); +} + bool API::ReadCreature (const int32_t index, t_creature & furball) { if(!d->creaturesInited) return false; @@ -1114,15 +1119,12 @@ bool API::ReadCreature (const int32_t index, t_creature & furball) g_pProcess->readDWord (temp + d->creature_type_offset, furball.type); g_pProcess->readDWord (temp + d->creature_flags1_offset, furball.flags1.whole); g_pProcess->readDWord (temp + d->creature_flags2_offset, furball.flags2.whole); - // normal names - d->p->readSTLString (temp + d->creature_first_name_offset, furball.first_name, 128); - d->p->readSTLString (temp + d->creature_nick_name_offset, furball.nick_name, 128); + // names + readName(furball.name,temp + d->creature_name_offset); + readName(furball.squad_name, temp + d->creature_squad_name_offset); + readName(furball.artifact_name, temp + d->creature_artifact_name_offset); // custom profession - d->p->readSTLString (temp + d->creature_nick_name_offset, furball.nick_name, 128); fill_char_buf (furball.custom_profession, d->p->readSTLString (temp + d->creature_custom_profession_offset)); - // crazy composited names - g_pProcess->read (temp + d->creature_last_name_offset, sizeof (t_lastname), (uint8_t *) &furball.last_name); - g_pProcess->read (temp + d->creature_squad_name_offset, sizeof (t_squadname), (uint8_t *) &furball.squad_name); @@ -1183,7 +1185,7 @@ void API::WriteLabors(const uint32_t index, uint8_t labors[NUM_CREATURE_LABORS]) WriteRaw(temp + d->creature_labors_offset, NUM_CREATURE_LABORS, labors); } -bool API::InitReadNameTables (map< string, vector > & nameTable) +bool API::InitReadNameTables(vector> & translations , vector > & foreign_languages) //(map< string, vector > & nameTable) { try { @@ -1194,23 +1196,28 @@ bool API::InitReadNameTables (map< string, vector > & nameTable) DfVector genericVec (d->p->readVector (genericAddress, 4)); DfVector transVec (d->p->readVector (transAddress, 4)); + translations.resize(10); for (uint32_t i = 0;i < genericVec.getSize();i++) { uint32_t genericNamePtr = * (uint32_t *) genericVec.at (i); - string genericName = d->p->readSTLString (genericNamePtr); - nameTable["GENERIC"].push_back (genericName); + for(int i=0; i<10;i++) + { + string word = d->p->readSTLString (genericNamePtr + i * sizeof(string)); + translations[i].push_back (word); + } } + foreign_languages.resize(transVec.getSize()); for (uint32_t i = 0; i < transVec.getSize();i++) { uint32_t transPtr = * (uint32_t *) transVec.at (i); - string transName = d->p->readSTLString (transPtr); + //string transName = d->p->readSTLString (transPtr); DfVector trans_names_vec (d->p->readVector (transPtr + word_table_offset, 4)); for (uint32_t j = 0;j < trans_names_vec.getSize();j++) { uint32_t transNamePtr = * (uint32_t *) trans_names_vec.at (j); string name = d->p->readSTLString (transNamePtr); - nameTable[transName].push_back (name); + foreign_languages[i].push_back (name); } } d->nameTablesInited = true; @@ -1223,6 +1230,80 @@ bool API::InitReadNameTables (map< string, vector > & nameTable) } } +string API::TranslateName(const DFHack::t_name &name,const std::vector< std::vector > & translations ,const std::vector< std::vector > & foreign_languages, bool inEnglish) +{ + string out; + assert (d->nameTablesInited); + map >::const_iterator it; + + if(!inEnglish) + { + if(name.words[0] >=0 || name.words[1] >=0) + { + if(name.words[0]>=0) out.append(foreign_languages[name.language][name.words[0]]); + if(name.words[1]>=0) out.append(foreign_languages[name.language][name.words[1]]); + out[0] = toupper(out[0]); + } + if(name.words[5] >=0) + { + string word; + for(int i=2;i<=5;i++) + if(name.words[i]>=0) word.append(foreign_languages[name.language][name.words[i]]); + word[0] = toupper(word[0]); + if(out.length() > 0) out.append(" "); + out.append(word); + } + if(name.words[6] >=0) + { + string word; + word.append(foreign_languages[name.language][name.words[6]]); + word[0] = toupper(word[0]); + if(out.length() > 0) out.append(" "); + out.append(word); + } + } + else + { + if(name.words[0] >=0 || name.words[1] >=0) + { + if(name.words[0]>=0) out.append(translations[name.parts_of_speech[0]+1][name.words[0]]); + if(name.words[1]>=0) out.append(translations[name.parts_of_speech[1]+1][name.words[1]]); + out[0] = toupper(out[0]); + } + if(name.words[5] >=0) + { + if(out.length() > 0) + out.append(" the"); + else + out.append("The"); + string word; + for(int i=2;i<=5;i++) + { + if(name.words[i]>=0) + { + word = translations[name.parts_of_speech[i]+1][name.words[i]]; + word[0] = toupper(word[0]); + out.append(" " + word); + } + } + } + if(name.words[6] >=0) + { + if(out.length() > 0) + out.append(" of"); + else + out.append("Of"); + string word; + word.append(translations[name.parts_of_speech[6]+1][name.words[6]]); + word[0] = toupper(word[0]); + out.append(" " + word); + } + } + return out; +} + + +/* string API::TranslateName (const int names[], int size, const map > & nameTable, const string & language) { string trans; @@ -1288,7 +1369,7 @@ string API::TranslateName (const t_squadname & squad, const map getTraits(const uint32_t &index); vector getLabors(const uint32_t &index); */ - bool InitReadNameTables (std::map< std::string, std::vector > & nameTable); + bool InitReadNameTables (std::vector< std::vector > & translations , std::vector< std::vector > & foreign_languages); void FinishReadNameTables(); - std::string TranslateName(const t_lastname & last, const std::map< std::string, std::vector< std::string > > &nameTable,const std::string & language="GENERIC"); - std::string TranslateName(const t_squadname & squad, const std::map< std::string, std::vector< std::string > > &nameTable,const std::string & language="GENERIC"); - std::string TranslateName (const int names[], int size, const std::map > &nameTable, const std::string & language="GENERIC"); + std::string TranslateName(const t_name & name,const std::vector< std::vector > & translations ,const std::vector< std::vector > & foreign_languages, bool inEnglish=true); void WriteLabors(const uint32_t index, uint8_t labors[NUM_CREATURE_LABORS]); diff --git a/library/DFTypes.h b/library/DFTypes.h index 9959526d5..c2e2bd200 100644 --- a/library/DFTypes.h +++ b/library/DFTypes.h @@ -484,14 +484,17 @@ struct t_trait CREATURE */ -struct t_lastname -{ - int names[7]; -}; -struct t_squadname + +struct t_name { - int names[6]; + char first_name[128]; + char nickname[128]; + int words[7]; + short parts_of_speech[7]; + int language; + bool has_name; }; + struct t_skill { uint16_t id; @@ -522,10 +525,9 @@ struct t_creature uint32_t type; t_creaturflags1 flags1; t_creaturflags2 flags2; - char first_name [128]; - char nick_name [128]; - t_lastname last_name; - t_squadname squad_name; + t_name name; + t_name squad_name; + t_name artifact_name; uint8_t profession; char custom_profession[128]; // enabled labors diff --git a/output/Memory.xml b/output/Memory.xml index ca7db0204..379de0e1a 100644 --- a/output/Memory.xml +++ b/output/Memory.xml @@ -564,9 +564,7 @@ 0x1D64 - 0x00 - 0x1C - 0x38 + 0x00 0x6c 0x88 0x8C @@ -737,10 +735,11 @@ 0x100 0x10A 0x10C - 0x1D8 + 0x198 0x268 0x2F8 0x314 + 0x484 0x4F0 0x4F4 0x4F8 @@ -749,7 +748,7 @@ 0x544 0x610 0x700 - + 0x70