From 791ac8dd757a5159d494a9149006f8f3efbd2f2f Mon Sep 17 00:00:00 2001 From: belal Date: Fri, 12 Mar 2010 09:21:45 -0500 Subject: [PATCH] modify the renamer and creature dump to output the new current cursor creature code --- examples/creaturedump.cpp | 314 ++++++++++++++++++++------------------ examples/renamer.cpp | 12 +- library/DFHackAPI.cpp | 2 +- library/DFHackAPI.h | 4 +- 4 files changed, 177 insertions(+), 155 deletions(-) diff --git a/examples/creaturedump.cpp b/examples/creaturedump.cpp index 77743cc63..338148b8b 100644 --- a/examples/creaturedump.cpp +++ b/examples/creaturedump.cpp @@ -35,6 +35,12 @@ enum likeType ITEM = 2, FOOD = 3 }; + +vector creaturestypes; +matGlosses mat; +vector< vector > itemTypes; +map > names; +DFHack::memory_info *mem; likeType printLike(DFHack::t_like like, const matGlosses & mat,const vector< vector > & itemTypes) { // The function in DF which prints out the likes is a monster, it is a huge switch statement with tons of options and calls a ton of other functions as well, @@ -141,9 +147,154 @@ likeType printLike(DFHack::t_like like, const matGlosses & mat,const vector< vec } +void printCreature(DFHack::API & DF, const DFHack::t_creature & creature) +{ + if(string(creaturestypes[creature.type].id) == "DWARF") + { + cout << "address: " << creature.origin << " creature type: " << creaturestypes[creature.type].id << ", position: " << creature.x << "x " << creature.y << "y "<< creature.z << "z" << endl; + bool addendl = false; + if(creature.first_name[0]) + { + cout << "first name: " << creature.first_name; + addendl = true; + } + if(creature.nick_name[0]) + { + cout << ", nick name: " << creature.nick_name; + addendl = true; + } + string transName = DF.TranslateName(creature.last_name,names,creaturestypes[creature.type].id); + if(!transName.empty()) + { + cout << ", trans name: " << transName; + addendl=true; + } + //cout << ", generic name: " << DF.TranslateName(creature.last_name,names,"GENERIC"); + /* + if(!creature.trans_name.empty()){ + cout << ", trans name: " << creature.trans_name; + addendl =true; + } + if(!creature.generic_name.empty()){ + cout << ", generic name: " << creature.generic_name; + addendl=true; + } + */ + cout << ", likes: "; + for(uint32_t i = 0;igetProfession(creature.profession) << "(" << (int) creature.profession << ")"; + if(creature.custom_profession[0]) + { + cout << ", custom profession: " << creature.custom_profession; + } + if(creature.current_job.active) + { + cout << ", current job: " << mem->getJob(creature.current_job.jobId); + } + cout << endl; + cout << "happiness: " << creature.happiness << ", strength: " << creature.strength << ", agility: " + << creature.agility << ", toughness: " << creature.toughness << ", money: " << creature.money << ", id: " << creature.id; + if(creature.squad_leader_id != -1) + { + cout << ", squad_leader_id: " << creature.squad_leader_id; + } + cout << ", sex: "; + if(creature.sex == 0) + { + cout << "Female"; + } + else + { + cout <<"Male"; + } + cout << endl; + /* + //skills + for(unsigned int i = 0; i < creature.skills.size();i++){ + if(i > 0){ + cout << ", "; + } + cout << creature.skills[i].name << ": " << creature.skills[i].rating; + } + */ + /* + * FLAGS 1 + */ + cout << "flags1: "; + print_bits(creature.flags1.whole, cout); + cout << endl; + if(creature.flags1.bits.dead) + { + cout << "dead "; + } + if(creature.flags1.bits.on_ground) + { + cout << "on the ground, "; + } + if(creature.flags1.bits.skeleton) + { + cout << "skeletal "; + } + if(creature.flags1.bits.zombie) + { + cout << "zombie "; + } + if(creature.flags1.bits.tame) + { + cout << "tame "; + } + if(creature.flags1.bits.royal_guard) + { + cout << "royal_guard "; + } + if(creature.flags1.bits.fortress_guard) + { + cout << "fortress_guard "; + } + /* + * FLAGS 2 + */ + cout << endl << "flags2: "; + print_bits(creature.flags2.whole, cout); + cout << endl; + if(creature.flags2.bits.killed) + { + cout << "killed by kill function, "; + } + if(creature.flags2.bits.resident) + { + cout << "resident, "; + } + if(creature.flags2.bits.gutted) + { + cout << "gutted, "; + } + if(creature.flags2.bits.slaughter) + { + cout << "marked for slaughter, "; + } + if(creature.flags2.bits.underworld) + { + cout << "from the underworld, "; + } + cout << endl << endl; + } +} + + int main (void) { - vector creaturestypes; DFHack::API DF("Memory.xml"); if(!DF.Attach()) { @@ -151,25 +302,24 @@ int main (void) return 1; } - vector< vector > itemTypes; + DF.ReadItemTypes(itemTypes); - matGlosses mat; + DF.ReadPlantMatgloss(mat.plantMat); DF.ReadWoodMatgloss(mat.woodMat); DF.ReadStoneMatgloss(mat.stoneMat); DF.ReadMetalMatgloss(mat.metalMat); DF.ReadCreatureMatgloss(mat.creatureMat); - DFHack::memory_info *mem = DF.getMemoryInfo(); + mem = DF.getMemoryInfo(); // get stone matgloss mapping if(!DF.ReadCreatureMatgloss(creaturestypes)) { cerr << "Can't get the creature types." << endl; return 1; } - - map > names; + if(!DF.InitReadNameTables(names)) { cerr << "Can't get name tables" << endl; @@ -181,152 +331,20 @@ int main (void) cerr << "Can't get creatures" << endl; return 1; } + DF.InitViewAndCursor(); for(uint32_t i = 0; i < numCreatures; i++) { DFHack::t_creature temp; - DF.ReadCreature(i, temp); - if(string(creaturestypes[temp.type].id) == "DWARF") - { - cout << "address: " << temp.origin << " creature type: " << creaturestypes[temp.type].id << ", position: " << temp.x << "x " << temp.y << "y "<< temp.z << "z" << endl; - bool addendl = false; - if(temp.first_name[0]) - { - cout << "first name: " << temp.first_name; - addendl = true; - } - if(temp.nick_name[0]) - { - cout << ", nick name: " << temp.nick_name; - addendl = true; - } - string transName = DF.TranslateName(temp.last_name,names,creaturestypes[temp.type].id); - if(!transName.empty()) - { - cout << ", trans name: " << transName; - addendl=true; - } - //cout << ", generic name: " << DF.TranslateName(temp.last_name,names,"GENERIC"); - /* - if(!temp.trans_name.empty()){ - cout << ", trans name: " << temp.trans_name; - addendl =true; - } - if(!temp.generic_name.empty()){ - cout << ", generic name: " << temp.generic_name; - addendl=true; - } - */ - cout << ", likes: "; - for(uint32_t i = 0;igetProfession(temp.profession) << "(" << (int) temp.profession << ")"; - if(temp.custom_profession[0]) - { - cout << ", custom profession: " << temp.custom_profession; - } - if(temp.current_job.active) - { - cout << ", current job: " << mem->getJob(temp.current_job.jobId); - } - cout << endl; - cout << "happiness: " << temp.happiness << ", strength: " << temp.strength << ", agility: " - << temp.agility << ", toughness: " << temp.toughness << ", money: " << temp.money << ", id: " << temp.id; - if(temp.squad_leader_id != -1) - { - cout << ", squad_leader_id: " << temp.squad_leader_id; - } - cout << ", sex: "; - if(temp.sex == 0) - { - cout << "Female"; - } - else - { - cout <<"Male"; - } - cout << endl; - /* - //skills - for(unsigned int i = 0; i < temp.skills.size();i++){ - if(i > 0){ - cout << ", "; - } - cout << temp.skills[i].name << ": " << temp.skills[i].rating; - } - */ - /* - * FLAGS 1 - */ - cout << "flags1: "; - print_bits(temp.flags1.whole, cout); - cout << endl; - if(temp.flags1.bits.dead) - { - cout << "dead "; - } - if(temp.flags1.bits.on_ground) - { - cout << "on the ground, "; - } - if(temp.flags1.bits.skeleton) - { - cout << "skeletal "; - } - if(temp.flags1.bits.zombie) - { - cout << "zombie "; - } - if(temp.flags1.bits.tame) - { - cout << "tame "; - } - if(temp.flags1.bits.royal_guard) - { - cout << "royal_guard "; - } - if(temp.flags1.bits.fortress_guard) - { - cout << "fortress_guard "; - } - /* - * FLAGS 2 - */ - cout << endl << "flags2: "; - print_bits(temp.flags2.whole, cout); - cout << endl; - if(temp.flags2.bits.killed) - { - cout << "killed by kill function, "; - } - if(temp.flags2.bits.resident) - { - cout << "resident, "; - } - if(temp.flags2.bits.gutted) - { - cout << "gutted, "; - } - if(temp.flags2.bits.slaughter) - { - cout << "marked for slaughter, "; - } - if(temp.flags2.bits.underworld) - { - cout << "from the underworld, "; - } - cout << endl << endl; - } + DF.ReadCreature(i,temp); + printCreature(DF,temp); } + uint32_t currentIdx; + DFHack::t_creature currentCreature; + DF.getCurrentCursorCreature(currentIdx); + cout << "current creature" << endl; + + DF.ReadCreature(currentIdx, currentCreature); + printCreature(DF,currentCreature); DF.FinishReadCreatures(); DF.Detach(); #ifndef LINUX_BUILD diff --git a/examples/renamer.cpp b/examples/renamer.cpp index 4c8e94290..6d1e33cfc 100644 --- a/examples/renamer.cpp +++ b/examples/renamer.cpp @@ -364,16 +364,18 @@ start: { DF.Suspend(); DF.setCursorCoords(toChange.x, toChange.y,toChange.z); - vector underCursor; - while (!DF.getCurrentCursorCreatures(underCursor)) + uint32_t underCursor; + DF.getCurrentCursorCreature(underCursor); + while (underCursor != toChangeNum) { DF.Resume(); - w->TypeSpecial(DFHack::WAIT,1,100); + w->TypeStr("v",100); DF.Suspend(); DF.setCursorCoords(toChange.x, toChange.y,toChange.z); DF.ReadCreature(toChangeNum,toChange); + DF.getCurrentCursorCreature(underCursor); } - //CurrentCursorCreatures gives the creatures in the order that you see them with the 'k' cursor. + /*//CurrentCursorCreatures gives the creatures in the order that you see them with the 'k' cursor. //The 'v' cursor displays them in the order of last, then first,second,third and so on //Pretty weird, but it works //The only place that seems to display which creature is currently selected is on the stack, whose location is likely not static, so not usable @@ -388,7 +390,7 @@ start: break; } } - } + }*/ DF.Resume(); w->TypeStr(commandString.c_str()); if (waitTillScreenState(DF,"viewscreen_customize_unit")) diff --git a/library/DFHackAPI.cpp b/library/DFHackAPI.cpp index a69c4f951..90e071ed6 100644 --- a/library/DFHackAPI.cpp +++ b/library/DFHackAPI.cpp @@ -331,7 +331,7 @@ bool API::WriteTileTypes (uint32_t x, uint32_t y, uint32_t z, uint16_t *buffer) return false; } -bool API::getCurrentCursorCreature (uint32_t & creature_index) +bool API::getCurrentCursorCreature(uint32_t & creature_index) { if(!d->cursorWindowInited) return false; creature_index = g_pProcess->readDWord(d->current_cursor_creature_offset); diff --git a/library/DFHackAPI.h b/library/DFHackAPI.h index 71fcfb50d..e4470677c 100644 --- a/library/DFHackAPI.h +++ b/library/DFHackAPI.h @@ -199,7 +199,9 @@ namespace DFHack bool getCursorCoords (int32_t &x, int32_t &y, int32_t &z); bool setCursorCoords (const int32_t x, const int32_t y, const int32_t z); - bool API::getCurrentCursorCreature (uint32_t & creature_index); + /// This returns false if there is nothing under the cursor, it puts the addresses in a vector if there is + bool getCurrentCursorCreature (uint32_t & creature_index); + bool InitViewSize(); bool getWindowSize(int32_t & width, int32_t & height);