Get rid of pointless old code
							parent
							
								
									c0164c02bd
								
							
						
					
					
						commit
						1f2782d5b8
					
				| @ -1,43 +0,0 @@ | ||||
| if(NOT DEFINED DFHACK_CONSISTENCY) | ||||
|     MESSAGE(FATAL_ERROR "Please build the whole thing, not parts. You can turn parts on/off using options.") | ||||
| ENDIF() | ||||
| 
 | ||||
| # this is required to ensure we use the right configuration for the system. | ||||
| IF(UNIX) | ||||
|     add_definitions(-DLINUX_BUILD) | ||||
| ENDIF(UNIX) | ||||
| 
 | ||||
| # buildingsdump - dump buildings and their raw data filtered by type | ||||
| DFHACK_TOOL(dfbuildingsdump buildingsdump.cpp) | ||||
| 
 | ||||
| # constructiondump - dump engravings! | ||||
| DFHACK_TOOL(dfengravingdump engravingdump.cpp) | ||||
| 
 | ||||
| # constructiondump - dump constructions! | ||||
| DFHACK_TOOL(dfconstructiondump construction_dump.cpp) | ||||
| 
 | ||||
| # creaturedump - basic creature dump - a test of the creature related exports | ||||
| DFHACK_TOOL(dfcreaturedump creaturedump.cpp) | ||||
| 
 | ||||
| # materialtest - just list the first material of each type | ||||
| DFHACK_TOOL(dfmaterialtest materialtest.cpp) | ||||
| 
 | ||||
| # itemdump - dump the item under the cursor | ||||
| DFHACK_TOOL(dfitemdump dfitemdump.cpp) | ||||
| 
 | ||||
| # hotkeynotedump - dumps the hotkeys and notes for the loaded map | ||||
| # Author: belal | ||||
| DFHACK_TOOL(dfhotkeynotedump hotkeynotedump.cpp) | ||||
| 
 | ||||
| # settlementdump - dumps the settlements on the loaded map | ||||
| # Author: belal | ||||
| # DFHACK_TOOL(dfsettlementdump settlementdump.cpp) | ||||
| 
 | ||||
| # treedump - dump them trees! | ||||
| DFHACK_TOOL(dftreedump treedump.cpp) | ||||
| 
 | ||||
| # spatterdump - dump spatter 'veins' | ||||
| DFHACK_TOOL(dfspatterdump spatterdump.cpp) | ||||
| 
 | ||||
| # processenum - demonstrates the use of ProcessEnumerator | ||||
| DFHACK_TOOL(dfprocessenum processenum.cpp) | ||||
| @ -1,179 +0,0 @@ | ||||
| // Building dump
 | ||||
| 
 | ||||
| #include <iostream> | ||||
| #include <iomanip> | ||||
| #include <sstream> | ||||
| #include <climits> | ||||
| #include <vector> | ||||
| #include <stdio.h> | ||||
| //using namespace std;
 | ||||
| 
 | ||||
| #define DFHACK_WANT_MISCUTILS | ||||
| #include <DFHack.h> | ||||
| 
 | ||||
| void doWordPerLine(DFHack::Context *DF, DFHack::VersionInfo * mem, | ||||
|                    DFHack::Buildings * Bld, uint32_t numBuildings, | ||||
|                    const char* type, int lines) | ||||
| { | ||||
|     std::cout << numBuildings << std::endl; | ||||
|     std::vector < uint32_t > addresses; | ||||
|     for(uint32_t i = 0; i < numBuildings; i++) | ||||
|     { | ||||
|         DFHack::t_building temp; | ||||
|         Bld->Read(i, temp); | ||||
|         if(temp.type != 0xFFFFFFFF) // check if type isn't invalid
 | ||||
|         { | ||||
|             std::string typestr; | ||||
|             mem->resolveClassIDToClassname(temp.type, typestr); | ||||
|             std::cout << typestr << std::endl; | ||||
|             if(typestr == type) | ||||
|                 addresses.push_back(temp.origin); | ||||
|         } | ||||
|         else | ||||
|         { | ||||
|             // couldn't translate type, print out the vtable
 | ||||
|             std::cout << "unknown vtable: " << temp.vtable << std::endl; | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     if (addresses.empty()) | ||||
|     { | ||||
|         std::cout << "No buildings matching '" << type << "'" << endl; | ||||
|         return; | ||||
|     } | ||||
| 
 | ||||
|     interleave_hex(DF,addresses,lines / 4); | ||||
| } | ||||
| 
 | ||||
| void doUnderCursor(DFHack::Context *DF, DFHack::VersionInfo * mem, | ||||
|                    DFHack::Buildings * Bld, uint32_t numBuildings, | ||||
|                    int32_t x, int32_t y, int32_t z) | ||||
| { | ||||
|     std::map <uint32_t, std::string> custom_workshop_types; | ||||
|     Bld->ReadCustomWorkshopTypes(custom_workshop_types); | ||||
|      | ||||
|     uint32_t num_under_cursor = 0; | ||||
| 
 | ||||
|     for(uint32_t i = 0; i < numBuildings; i++) | ||||
|     { | ||||
|         DFHack::t_building temp; | ||||
|         Bld->Read(i, temp); | ||||
|         if(    (uint32_t)x >= temp.x1 | ||||
|                && (uint32_t)x <= temp.x2 | ||||
|                && (uint32_t)y >= temp.y1 | ||||
|                && (uint32_t)y <= temp.y2 | ||||
|                && (uint32_t)z == temp.z | ||||
|           ) | ||||
|         { | ||||
|             num_under_cursor++; | ||||
|             std::string typestr; | ||||
|             mem->resolveClassIDToClassname(temp.type, typestr); | ||||
|             printf("Address 0x%x, type %d (%s), %d/%d/%d\n", temp.origin, | ||||
|                    temp.type, typestr.c_str(), temp.x1, temp.y1, temp.z); | ||||
|             printf("Material %d %d\n", temp.material.type, | ||||
|                    temp.material.index); | ||||
|             int32_t custom; | ||||
|             if((custom = Bld->GetCustomWorkshopType(temp)) != -1) | ||||
|             { | ||||
|                 printf("Custom workshop type %s (%d)\n", | ||||
|                        custom_workshop_types[custom].c_str(), custom); | ||||
|             } | ||||
|             hexdump(DF, temp.origin, 34*16); | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     if (num_under_cursor == 0) | ||||
|         std::cout << "No buildings present under cursor." << endl; | ||||
| } | ||||
| 
 | ||||
| void doListAll(DFHack::VersionInfo * mem, DFHack::Buildings * Bld, | ||||
|                uint32_t numBuildings) | ||||
| { | ||||
|     std::cout << "Num buildings present: " << numBuildings << std::endl; | ||||
|     for(uint32_t i = 0; i < numBuildings; i++) | ||||
|     { | ||||
|         DFHack::t_building temp; | ||||
|         Bld->Read(i, temp); | ||||
|         std::string typestr; | ||||
|         mem->resolveClassIDToClassname(temp.type, typestr); | ||||
|         printf("Address 0x%x, type %d (%s), Coord %d/%d/%d\n", temp.origin, | ||||
|                temp.type, typestr.c_str(), temp.x1,temp.y1,temp.z); | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| void doFinish(DFHack::Context *DF) | ||||
| { | ||||
|     DF->Detach(); | ||||
|     #ifndef LINUX_BUILD | ||||
|         std::cout << "Done. Press any key to continue" << std::endl; | ||||
|         cin.ignore(); | ||||
|     #endif | ||||
| } | ||||
| 
 | ||||
| int main (int argc,const char* argv[]) | ||||
| { | ||||
|     int lines = 16; | ||||
|     bool word_per_line = false; | ||||
|     if (argc == 3) | ||||
|     { | ||||
|         std::string num = argv[2]; //blah. I don't care
 | ||||
|         std::istringstream ins; // Declare an input string stream.
 | ||||
|         ins.str(num);        // Specify string to read.
 | ||||
|         ins >> lines;     // Reads the integers from the string.
 | ||||
|         word_per_line = true; | ||||
|     } | ||||
|      | ||||
|     DFHack::ContextManager DFMgr ("Memory.xml"); | ||||
|     DFHack::Context *DF; | ||||
|     try | ||||
|     { | ||||
|         DF = DFMgr.getSingleContext(); | ||||
|         DF->Attach(); | ||||
|     } | ||||
|     catch (std::exception& e) | ||||
|     { | ||||
|         std::cerr << e.what() << std::endl; | ||||
|         #ifndef LINUX_BUILD | ||||
|             cin.ignore(); | ||||
|         #endif | ||||
|         return 1; | ||||
|     } | ||||
|      | ||||
|     DFHack::VersionInfo * mem = DF->getMemoryInfo(); | ||||
|     DFHack::Buildings * Bld = DF->getBuildings(); | ||||
|     DFHack::Gui * Gui = DF->getGui(); | ||||
|      | ||||
|     uint32_t numBuildings; | ||||
|     if(!Bld->Start(numBuildings)) | ||||
|     { | ||||
|         std::cerr << "buildings not supported for this DF version" << std::endl; | ||||
|         doFinish(DF); | ||||
|         return 1; | ||||
|     } | ||||
| 
 | ||||
|     if (numBuildings == 0) | ||||
|     { | ||||
|         cout << "No buildings on site." << endl; | ||||
|         doFinish(DF); | ||||
|         return 0; | ||||
|     } | ||||
| 
 | ||||
|     if (word_per_line) | ||||
|         doWordPerLine(DF, mem, Bld, numBuildings, argv[1], lines); | ||||
|     else | ||||
|     { | ||||
|         int32_t x,y,z; | ||||
|         Gui->getCursorCoords(x,y,z); | ||||
| 
 | ||||
|         if(x != -30000) | ||||
|             doUnderCursor(DF, mem, Bld, numBuildings, x, y, z); | ||||
|         else | ||||
|             doListAll(mem, Bld, numBuildings); | ||||
|     } | ||||
| 
 | ||||
|     Bld->Finish(); | ||||
| 
 | ||||
|     doFinish(DF); | ||||
| 
 | ||||
|     return 0; | ||||
| } | ||||
| @ -1,95 +0,0 @@ | ||||
| // Just show some position data
 | ||||
| 
 | ||||
| #include <iostream> | ||||
| #include <iomanip> | ||||
| #include <climits> | ||||
| #include <vector> | ||||
| #include <sstream> | ||||
| #include <ctime> | ||||
| #include <cstdio> | ||||
| #include <stdio.h> | ||||
| 
 | ||||
| #define DFHACK_WANT_MISCUTILS | ||||
| #include <DFHack.h> | ||||
| using namespace DFHack; | ||||
| 
 | ||||
| int main (int numargs, const char ** args) | ||||
| { | ||||
|     DFHack::ContextManager DFMgr("Memory.xml"); | ||||
|     DFHack::Context* DF; | ||||
|     try | ||||
|     { | ||||
|         DF = DFMgr.getSingleContext(); | ||||
|         DF->Attach(); | ||||
|     } | ||||
|     catch (std::exception& e) | ||||
|     { | ||||
|         std::cerr << e.what() << std::endl; | ||||
|         #ifndef LINUX_BUILD | ||||
|             cin.ignore(); | ||||
|         #endif | ||||
|         return 1; | ||||
|     } | ||||
|      | ||||
|     DFHack::Gui *Gui = DF->getGui(); | ||||
|      | ||||
|     DFHack::Constructions *Cons = DF->getConstructions(); | ||||
|     DFHack::Materials *Mats = DF->getMaterials(); | ||||
|     Mats->ReadInorganicMaterials(); | ||||
|     Mats->ReadOrganicMaterials(); | ||||
|     uint32_t numConstr; | ||||
|     Cons->Start(numConstr); | ||||
|      | ||||
|     int32_t cx, cy, cz; | ||||
|     Gui->getCursorCoords(cx,cy,cz); | ||||
|     if(cx != -30000) | ||||
|     { | ||||
|         t_construction con; | ||||
|         for(uint32_t i = 0; i < numConstr; i++) | ||||
|         { | ||||
|             Cons->Read(i,con); | ||||
|             if(cx == con.x && cy == con.y && cz == con.z) | ||||
|             { | ||||
|                 printf("Construction %d/%d/%d @ 0x%x\n", con.x, con.y, con.z,con.origin); | ||||
|                 // inorganic stuff - we can recognize that
 | ||||
|                 printf("Material: form %d, type %d, index %d\n",con.form, con.mat_type, con.mat_idx); | ||||
|                 std::string matstr = "unknown"; | ||||
|                 if(con.mat_type == 0) | ||||
|                 { | ||||
|                     if(con.mat_idx != 0xffffffff) | ||||
|                         matstr = Mats->inorganic[con.mat_idx].id; | ||||
|                     else matstr = "inorganic"; | ||||
|                 } | ||||
|                 if(con.mat_type == 420) | ||||
|                 { | ||||
|                     if(con.mat_idx != 0xffffffff) | ||||
|                         matstr = Mats->organic[con.mat_idx].id; | ||||
|                     else matstr = "organic"; | ||||
|                 } | ||||
|                 switch(con.form) | ||||
|                 { | ||||
|                     case constr_bar: | ||||
|                         printf("It is made of %s bars!\n",matstr.c_str()); | ||||
|                         break; | ||||
|                     case constr_block: | ||||
|                         printf("It is made of %s blocks!\n",matstr.c_str()); | ||||
|                         break; | ||||
|                     case constr_boulder: | ||||
|                         printf("It is made of %s stones!\n",matstr.c_str()); | ||||
|                         break; | ||||
|                     case constr_logs: | ||||
|                         printf("It is made of %s logs!\n",matstr.c_str()); | ||||
|                         break; | ||||
|                     default: | ||||
|                         printf("It is made of something we don't know yet! The material is %s.\n",matstr.c_str()); | ||||
|                 } | ||||
|                 hexdump(DF,con.origin,32); | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|     #ifndef LINUX_BUILD | ||||
|     cout << "Done. Press any key to continue" << endl; | ||||
|     cin.ignore(); | ||||
|     #endif | ||||
|     return 0; | ||||
| } | ||||
| @ -1,528 +0,0 @@ | ||||
| // Creature dump
 | ||||
| 
 | ||||
| #include <iostream> | ||||
| #include <climits> | ||||
| #include <string.h> | ||||
| #include <vector> | ||||
| #include <stdio.h> | ||||
| using namespace std; | ||||
| 
 | ||||
| #define DFHACK_WANT_MISCUTILS | ||||
| #include <DFHack.h> | ||||
| 
 | ||||
| enum likeType | ||||
| { | ||||
|     FAIL = 0, | ||||
|     MATERIAL = 1, | ||||
|     ITEM = 2, | ||||
|     FOOD = 3 | ||||
| }; | ||||
| 
 | ||||
| DFHack::Materials * Materials; | ||||
| DFHack::VersionInfo *mem; | ||||
| vector< vector<string> > englishWords; | ||||
| vector< vector<string> > foreignWords; | ||||
| DFHack::Creatures * Creatures = NULL; | ||||
| uint32_t current_year; | ||||
| uint32_t current_tick; | ||||
| /*
 | ||||
| likeType printLike40d(DFHack::t_like like, const matGlosses & mat,const vector< vector <DFHack::t_itemType> > & 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, 
 | ||||
|     //so I am not going to try and put all the possibilites here, only the low hanging fruit, with stones and metals, as well as items,
 | ||||
|     //you can easily find good canidates for military duty for instance
 | ||||
|     //The ideal thing to do would be to call the df function directly with the desired likes, the df function modifies a string, so it should be possible to do...
 | ||||
|     if(like.active){ | ||||
|         if(like.type ==0){ | ||||
|             switch (like.material.type) | ||||
|             { | ||||
|             case 0: | ||||
|                 cout << mat.woodMat[like.material.index].name; | ||||
|                 return(MATERIAL); | ||||
|             case 1: | ||||
|                 cout << mat.stoneMat[like.material.index].name; | ||||
|                 return(MATERIAL); | ||||
|             case 2: | ||||
|                 cout << mat.metalMat[like.material.index].name; | ||||
|                 return(MATERIAL); | ||||
|             case 12: // don't ask me why this has such a large jump, maybe this is not actually the matType for plants, but they all have this set to 12
 | ||||
|                 cout << mat.plantMat[like.material.index].name; | ||||
|                 return(MATERIAL); | ||||
|             case 32: | ||||
|                 cout << mat.plantMat[like.material.index].name; | ||||
|                 return(MATERIAL); | ||||
|             case 121: | ||||
|                 cout << mat.creatureMat[like.material.index].name; | ||||
|                 return(MATERIAL); | ||||
|             default: | ||||
|                 return(FAIL); | ||||
|             } | ||||
|         } | ||||
|         else if(like.type == 4 && like.itemIndex != -1){ | ||||
|             switch(like.itemClass) | ||||
|             { | ||||
|             case 24: | ||||
|                 cout << itemTypes[0][like.itemIndex].name; | ||||
|                 return(ITEM); | ||||
|             case 25: | ||||
|                 cout << itemTypes[4][like.itemIndex].name; | ||||
|                 return(ITEM); | ||||
|             case 26: | ||||
|                 cout << itemTypes[8][like.itemIndex].name; | ||||
|                 return(ITEM); | ||||
|             case 27: | ||||
|                 cout << itemTypes[9][like.itemIndex].name; | ||||
|                 return(ITEM); | ||||
|             case 28: | ||||
|                 cout << itemTypes[10][like.itemIndex].name; | ||||
|                 return(ITEM); | ||||
|             case 29: | ||||
|                 cout << itemTypes[7][like.itemIndex].name; | ||||
|                 return(ITEM); | ||||
|             case 38: | ||||
|                 cout << itemTypes[5][like.itemIndex].name; | ||||
|                 return(ITEM); | ||||
|             case 63: | ||||
|                 cout << itemTypes[11][like.itemIndex].name; | ||||
|                 return(ITEM); | ||||
|             case 68: | ||||
|             case 69: | ||||
|                 cout << itemTypes[6][like.itemIndex].name; | ||||
|                 return(ITEM); | ||||
|             case 70: | ||||
|                 cout << itemTypes[1][like.itemIndex].name; | ||||
|                 return(ITEM); | ||||
|             default: | ||||
|           //      cout << like.itemClass << ":" << like.itemIndex;
 | ||||
|                 return(FAIL); | ||||
|             } | ||||
|         } | ||||
|         else if(like.material.type != -1){// && like.material.index == -1){
 | ||||
|             if(like.type == 2){ | ||||
|                 switch(like.itemClass) | ||||
|                 { | ||||
|                 case 52: | ||||
|                 case 53: | ||||
|                 case 58: | ||||
|                     cout << mat.plantMat[like.material.type].name; | ||||
|                     return(FOOD); | ||||
|                 case 72: | ||||
|                     if(like.material.type =! 10){ // 10 is for milk stuff, which I don't know how to do
 | ||||
|                         cout << mat.plantMat[like.material.index].extract_name; | ||||
|                         return(FOOD); | ||||
|                     } | ||||
|                     return(FAIL); | ||||
|                 case 74: | ||||
|                     cout << mat.plantMat[like.material.index].drink_name; | ||||
|                     return(FOOD); | ||||
|                 case 75: | ||||
|                     cout << mat.plantMat[like.material.index].food_name; | ||||
|                     return(FOOD); | ||||
|                 case 47: | ||||
|                 case 48: | ||||
|                     cout << mat.creatureMat[like.material.type].name; | ||||
|                     return(FOOD); | ||||
|                 default: | ||||
|                     return(FAIL); | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|     return(FAIL); | ||||
| } | ||||
| */ | ||||
| 
 | ||||
| void printCreature(DFHack::Context * DF, const DFHack::t_creature & creature) | ||||
| { | ||||
|     uint32_t dayoflife; | ||||
|     cout << "address: " << hex <<  creature.origin << dec << ", creature race: " << creature.race << "/" << Materials->raceEx[creature.race].rawname  | ||||
|                 << "[" << Materials->raceEx[creature.race].tile_character | ||||
|                 << "," << Materials->raceEx[creature.race].tilecolor.fore | ||||
|                 << "," << Materials->raceEx[creature.race].tilecolor.back | ||||
|                 << "," << Materials->raceEx[creature.race].tilecolor.bright | ||||
|                 << "]" | ||||
|                 << ", position: " << creature.x << "x " << creature.y << "y "<< creature.z << "z" << endl; | ||||
|         bool addendl = false; | ||||
|         if(creature.name.first_name[0]) | ||||
|         { | ||||
|             cout << "first name: " << creature.name.first_name; | ||||
|             addendl = true; | ||||
|         } | ||||
|         if(creature.name.nickname[0]) | ||||
|         { | ||||
|             cout << ", nick name: " << creature.name.nickname; | ||||
|             addendl = true; | ||||
|         } | ||||
|          | ||||
|         DFHack::Translation *Tran = DF->getTranslation(); | ||||
|         DFHack::VersionInfo *mem = DF->getMemoryInfo(); | ||||
|          | ||||
|         string transName = Tran->TranslateName(creature.name,false); | ||||
|         if(!transName.empty()) | ||||
|         { | ||||
|             cout << ", trans name: " << transName; | ||||
|             addendl=true; | ||||
|         } | ||||
|          | ||||
|         transName = Tran->TranslateName(creature.name,true); | ||||
|         if(!transName.empty()) | ||||
|         { | ||||
|             cout << ", last name: " << transName; | ||||
|             addendl=true; | ||||
|         } | ||||
| 
 | ||||
|         if(creature.civ) | ||||
|         { | ||||
|             cout << ", civilization: " << creature.civ; | ||||
|             addendl = true; | ||||
|         } | ||||
| 
 | ||||
|         /*
 | ||||
|         cout << ", likes: "; | ||||
|         for(uint32_t i = 0;i<creature.numLikes; i++) | ||||
|         { | ||||
|             if(printLike(creature.likes[i],mat,itemTypes)) | ||||
|             { | ||||
|                 cout << ", "; | ||||
|             } | ||||
|         }  | ||||
|         */   | ||||
|         if(addendl) | ||||
|         { | ||||
|             cout << endl; | ||||
|             addendl = false; | ||||
|         } | ||||
|         cout << ", profession: " << mem->getProfession(creature.profession) << "(" << (int) creature.profession << ")"; | ||||
|          | ||||
|         if(creature.custom_profession[0]) | ||||
|         { | ||||
|             cout << ", custom profession: " << creature.custom_profession; | ||||
|         } | ||||
|          | ||||
|         if(creature.current_job.active) | ||||
|         { | ||||
|             try{ | ||||
|                 cout << ", current job: " << mem->getJob(creature.current_job.jobId); | ||||
|             } | ||||
|             catch(exception & e) | ||||
|             { | ||||
|                 cout << e.what() << endl; | ||||
|             } | ||||
|         } | ||||
|          | ||||
|         cout << endl; | ||||
|         dayoflife = creature.birth_year*12*28 + creature.birth_time/1200; | ||||
|         cout << "Born on the year " << creature.birth_year << ", month " << (creature.birth_time/1200/28) << ", day " << ((creature.birth_time/1200) % 28 + 1) << ", " << dayoflife << " days lived." << endl; | ||||
|         cout << "Appearance : "; | ||||
|         for(unsigned int i = 0; i<creature.nbcolors ; i++) | ||||
|         { | ||||
|             cout << Materials->raceEx[creature.race].castes[creature.caste].ColorModifier[i].part << " "; | ||||
|             uint32_t color = Materials->raceEx[creature.race].castes[creature.caste].ColorModifier[i].colorlist[creature.color[i]]; | ||||
|             if(color<Materials->color.size()) | ||||
|             { | ||||
|                 cout << Materials->color[color].name << "["  | ||||
|                      << (unsigned int) (Materials->color[color].red*255) << ":" | ||||
|                      << (unsigned int) (Materials->color[color].green*255) << ":" | ||||
|                      << (unsigned int) (Materials->color[color].blue*255) << "]"; | ||||
|             } | ||||
|             else if (color < Materials->alldesc.size()) | ||||
|             { | ||||
|                 cout << Materials->alldesc[color].id; | ||||
|             } | ||||
|             else | ||||
|             { | ||||
|                 cout << "Unknown color " << color << endl; | ||||
|             } | ||||
|             if( Materials->raceEx[creature.race].castes[creature.caste].ColorModifier[i].startdate > 0 ) | ||||
|             { | ||||
|                 if( (Materials->raceEx[creature.race].castes[creature.caste].ColorModifier[i].startdate <= dayoflife) && | ||||
|                     (Materials->raceEx[creature.race].castes[creature.caste].ColorModifier[i].enddate > dayoflife) ) | ||||
|                     cout << "[active]"; | ||||
|                 else | ||||
|                     cout << "[inactive]"; | ||||
|             } | ||||
|             cout << " - "; | ||||
| 
 | ||||
|         } | ||||
|         cout << endl; | ||||
|         cout << "happiness: "   << creature.happiness | ||||
|              << ", strength: "  << creature.strength.level  | ||||
|              << ", agility: "   << creature.agility.level | ||||
|              << ", toughness: " << creature.toughness.level | ||||
|              << ", endurance: " << creature.endurance.level | ||||
|              << ", recuperation: " << creature.recuperation.level | ||||
|              << ", disease resistance: " << creature.disease_resistance.level | ||||
|              //<< ", money: " << creature.money
 | ||||
|              << ", id: " << creature.id; | ||||
|         /*
 | ||||
|         if(creature.squad_leader_id != -1) | ||||
|         { | ||||
|             cout << ", squad_leader_id: " << creature.squad_leader_id; | ||||
|         } | ||||
|         if(creature.mood != -1){ | ||||
|             cout << ", mood: " << creature.mood << " "; | ||||
|         }*/ | ||||
|         cout << ", sex: "; | ||||
|         if(creature.sex == 0) | ||||
|         { | ||||
|             cout << "Female"; | ||||
|         } | ||||
|         else | ||||
|         { | ||||
|             cout <<"Male"; | ||||
|         } | ||||
|         cout << endl; | ||||
| 
 | ||||
|         if((creature.mood != -1) && (creature.mood<5)) | ||||
|         { | ||||
|             cout << "mood: " << creature.mood << ", skill: " << mem->getSkill(creature.mood_skill) << endl; | ||||
|             vector<DFHack::t_material> mymat; | ||||
|             if(Creatures->ReadJob(&creature, mymat)) | ||||
|             { | ||||
|                 for(unsigned int i = 0; i < mymat.size(); i++) | ||||
|                 { | ||||
|                     printf("\t%s(%d)\t%d %d %d - %.8x\n", Materials->getDescription(mymat[i]).c_str(), mymat[i].itemType, mymat[i].subType, mymat[i].subIndex, mymat[i].index, mymat[i].flags); | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         // FIXME: TOO BAD...
 | ||||
|         std::vector<uint32_t> inventory; | ||||
|         if( Creatures->ReadInventoryPtr(creature.origin, inventory)) | ||||
|         { | ||||
|             DFHack::Items * Items = DF->getItems(); | ||||
|             printf("\tInventory:\n"); | ||||
|             for(unsigned int i = 0; i < inventory.size(); i++) | ||||
|             { | ||||
|                 DFHack::dfh_item item; | ||||
|                 if (Items->readItem(inventory[i], item)) | ||||
|                     printf("\t\t%d: %s\n", item.id, Items->getItemDescription(item, Materials).c_str()); | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         std::vector<int32_t> owned; | ||||
|         if( Creatures->ReadOwnedItemsPtr(creature.origin, owned)) | ||||
|         { | ||||
|             DFHack::Items * Items = DF->getItems(); | ||||
|             printf("\tOwns:\n"); | ||||
|             for (int i = 0; i < owned.size(); i++) { | ||||
|                 uint32_t pitem = Items->findItemByID(owned[i]); | ||||
|                 DFHack::dfh_item item; | ||||
|                 if (!pitem || !Items->readItem(pitem,item)) | ||||
|                     pitem = 0; | ||||
|                 printf("\t\t%d: %s\n", owned[i], | ||||
|                        pitem ? Items->getItemDescription(item, Materials).c_str() : "?"); | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         /*
 | ||||
|         if(creature.pregnancy_timer > 0) | ||||
|             cout << "gives birth in " << creature.pregnancy_timer/1200 << " days. "; | ||||
|         cout << "Blood: " << creature.blood_current << "/" << creature.blood_max << " bleeding: " << creature.bleed_rate; | ||||
|         */ | ||||
|         cout << endl; | ||||
| 
 | ||||
|         if(creature.has_default_soul) | ||||
|         { | ||||
|             //skills
 | ||||
|             cout << "Skills" << endl; | ||||
|             for(unsigned int i = 0; i < creature.defaultSoul.numSkills;i++) | ||||
|             { | ||||
|                 if(i > 0) | ||||
|                 { | ||||
|                     cout << ", "; | ||||
|                 } | ||||
|                 try | ||||
|                 { | ||||
|                     cout << mem->getSkill(creature.defaultSoul.skills[i].id) << ": " << creature.defaultSoul.skills[i].rating; | ||||
|                 } | ||||
|                 catch(DFHack::Error::AllMemdef &e) | ||||
|                 { | ||||
|                     cout << "Unknown skill! : " << creature.defaultSoul.skills[i].id <<", rating: "  << creature.defaultSoul.skills[i].rating << endl; | ||||
|                     cout << e.what() << endl; | ||||
|                 } | ||||
|             } | ||||
|             cout << endl; | ||||
|             cout << "Traits" << endl; | ||||
|             for(uint32_t i = 0; i < 30;i++) | ||||
|             { | ||||
|                 string trait = mem->getTrait (i, creature.defaultSoul.traits[i]); | ||||
|                 if(!trait.empty()) cout << trait << ", "; | ||||
|             } | ||||
|             cout << endl; | ||||
|                      | ||||
|             // labors
 | ||||
|             cout << "Labors" << endl; | ||||
|             for(unsigned int i = 0; i < NUM_CREATURE_LABORS;i++) | ||||
|             { | ||||
|                 if(!creature.labors[i]) | ||||
|                     continue; | ||||
|                 string laborname; | ||||
|                 try | ||||
|                 { | ||||
|                     laborname = mem->getLabor(i); | ||||
|                 } | ||||
|                 catch(exception &) | ||||
|                 { | ||||
|                     break; | ||||
|                 } | ||||
|                 cout << laborname << ", "; | ||||
|             } | ||||
|             cout << endl; | ||||
|         } | ||||
|         /*
 | ||||
|          * 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; | ||||
|          | ||||
|         if(creature.flags1.bits.had_mood && (creature.mood == -1 || creature.mood == 8 ) ) | ||||
|         { | ||||
|             string artifact_name = Tran->TranslateName(creature.artifact_name,false); | ||||
|             cout << "artifact: " << artifact_name << endl; | ||||
|         } | ||||
| 
 | ||||
| 
 | ||||
|     cout << endl; | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| int main (int numargs, char ** args) | ||||
| { | ||||
|     DFHack::World * World; | ||||
|     DFHack::ContextManager DFMgr("Memory.xml"); | ||||
|     DFHack::Context* DF; | ||||
|     try | ||||
|     { | ||||
|         DF = DFMgr.getSingleContext(); | ||||
|         DF->Attach(); | ||||
|     } | ||||
|     catch (exception& e) | ||||
|     { | ||||
|         cerr << e.what() << endl; | ||||
|         #ifndef LINUX_BUILD | ||||
|             cin.ignore(); | ||||
|         #endif | ||||
|         return 1; | ||||
|     } | ||||
|     string check = ""; | ||||
|     if(numargs == 2) | ||||
|         check = args[1]; | ||||
|      | ||||
|     Creatures = DF->getCreatures(); | ||||
|     Materials = DF->getMaterials(); | ||||
|     World = DF->getWorld(); | ||||
|     current_year = World->ReadCurrentYear(); | ||||
|     current_tick = World->ReadCurrentTick(); | ||||
|     DFHack::Translation * Tran = DF->getTranslation(); | ||||
|      | ||||
|     uint32_t numCreatures; | ||||
|     if(!Creatures->Start(numCreatures)) | ||||
|     { | ||||
|         cerr << "Can't get creatures" << endl; | ||||
|         #ifndef LINUX_BUILD | ||||
|             cin.ignore(); | ||||
|         #endif | ||||
|         return 1; | ||||
|     } | ||||
|     if(!numCreatures) | ||||
|     { | ||||
|         cerr << "No creatures to print" << endl; | ||||
|         #ifndef LINUX_BUILD | ||||
|             cin.ignore(); | ||||
|         #endif | ||||
|         return 1; | ||||
|     } | ||||
| 
 | ||||
|     mem = DF->getMemoryInfo(); | ||||
|     Materials->ReadInorganicMaterials(); | ||||
|     Materials->ReadOrganicMaterials(); | ||||
|     Materials->ReadWoodMaterials(); | ||||
|     Materials->ReadPlantMaterials(); | ||||
|     Materials->ReadCreatureTypes(); | ||||
|     Materials->ReadCreatureTypesEx(); | ||||
|     //Materials->ReadDescriptorColors();
 | ||||
| 
 | ||||
|     if(!Tran->Start()) | ||||
|     { | ||||
|         cerr << "Can't get name tables" << endl; | ||||
|         return 1; | ||||
|     } | ||||
|     vector<uint32_t> addrs; | ||||
|     for(uint32_t i = 0; i < numCreatures; i++) | ||||
|     { | ||||
|         DFHack::t_creature temp; | ||||
|         Creatures->ReadCreature(i,temp); | ||||
|         if(check.empty() || string(Materials->raceEx[temp.race].rawname) == check) | ||||
|         { | ||||
|             printCreature(DF,temp); | ||||
|             addrs.push_back(temp.origin); | ||||
|         } | ||||
|     } | ||||
|     if(addrs.size() <= 10) | ||||
|     { | ||||
|         interleave_hex(DF,addrs,200); | ||||
|     } | ||||
|     Creatures->Finish(); | ||||
|     DF->Detach(); | ||||
|     #ifndef LINUX_BUILD | ||||
|     cout << "Done. Press any key to continue" << endl; | ||||
|     cin.ignore(); | ||||
|     #endif | ||||
|     return 0; | ||||
| } | ||||
| @ -1,121 +0,0 @@ | ||||
| /*
 | ||||
|  * Simple, pretty item dump example. | ||||
|  */ | ||||
| 
 | ||||
| #include <cstdio> | ||||
| #include <iostream> | ||||
| #include <iomanip> | ||||
| #include <sstream> | ||||
| #include <climits> | ||||
| #include <vector> | ||||
| #include <cstring> | ||||
| using namespace std; | ||||
| #define DFHACK_WANT_MISCUTILS | ||||
| #include <DFHack.h> | ||||
| #include <DFVector.h> | ||||
| 
 | ||||
| int main (int argc, char *argv[]) | ||||
| { | ||||
|     bool print_refs = false; | ||||
|     bool print_hex = false; | ||||
|     bool print_acc = false; | ||||
| 
 | ||||
|     for(int i = 1; i < argc; i++) | ||||
|     { | ||||
|         char *arg = argv[i]; | ||||
|         if (arg[0] != '-') | ||||
|             continue; | ||||
| 
 | ||||
|         for (; *arg; arg++) { | ||||
|             switch (arg[0]) { | ||||
|             case 'r': print_refs = true; break; | ||||
|             case 'x': print_hex = true; break; | ||||
|             case 'a': print_acc = true; break; | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
| 
 | ||||
|     DFHack::Process * p; | ||||
|     DFHack::ContextManager DFMgr("Memory.xml"); | ||||
|     DFHack::Context * DF; | ||||
|     try | ||||
|     { | ||||
|         DF = DFMgr.getSingleContext(); | ||||
|         DF->Attach(); | ||||
|     } | ||||
|     catch (exception& e) | ||||
|     { | ||||
|         cerr << e.what() << endl; | ||||
| #ifndef LINUX_BUILD | ||||
|         cin.ignore(); | ||||
| #endif | ||||
|         return 1; | ||||
|     } | ||||
|     DFHack::Materials * Materials = DF->getMaterials(); | ||||
|     Materials->ReadAllMaterials(); | ||||
|      | ||||
|     DFHack::Gui * Gui = DF->getGui(); | ||||
| 
 | ||||
|     DFHack::Items * Items = DF->getItems(); | ||||
|     Items->Start(); | ||||
| 
 | ||||
|     DFHack::VersionInfo * mem = DF->getMemoryInfo(); | ||||
|     p = DF->getProcess(); | ||||
|     int32_t x,y,z; | ||||
|     Gui->getCursorCoords(x,y,z); | ||||
| 
 | ||||
|     std::vector<uint32_t> p_items; | ||||
|     Items->readItemVector(p_items); | ||||
|     uint32_t size = p_items.size(); | ||||
| 
 | ||||
|     // FIXME: tools should never be exposed to DFHack internals!
 | ||||
|     DFHack::OffsetGroup* itemGroup = mem->getGroup("Items"); | ||||
|     uint32_t ref_vector = itemGroup->getOffset("item_ref_vector"); | ||||
| 
 | ||||
|     for(size_t i = 0; i < size; i++) | ||||
|     { | ||||
|         DFHack::dfh_item itm; | ||||
|         memset(&itm, 0, sizeof(DFHack::dfh_item)); | ||||
|         Items->readItem(p_items[i],itm); | ||||
| 
 | ||||
|         if (x != -30000 | ||||
|             && !(itm.base.x == x && itm.base.y == y && itm.base.z == z | ||||
|                  && itm.base.flags.on_ground | ||||
|                  && !itm.base.flags.in_chest | ||||
|                  && !itm.base.flags.in_inventory | ||||
|                  && !itm.base.flags.in_building)) | ||||
|             continue; | ||||
| 
 | ||||
|         printf( | ||||
|             "%5d: %08x %6d %08x (%d,%d,%d) #%08x [%d] *%d %s - %s\n", | ||||
|             i, itm.origin, itm.id, itm.base.flags.whole, | ||||
|             itm.base.x, itm.base.y, itm.base.z, | ||||
|             itm.base.vtable, | ||||
|             itm.wear_level, | ||||
|             itm.quantity, | ||||
|             Items->getItemClass(itm).c_str(), | ||||
|             Items->getItemDescription(itm, Materials).c_str() | ||||
|         ); | ||||
| 
 | ||||
|         if (print_hex) | ||||
|             hexdump(DF,p_items[i],0x300); | ||||
| 
 | ||||
|         if (print_acc) | ||||
|             cout << Items->dumpAccessors(itm) << endl; | ||||
| 
 | ||||
|         if (print_refs) { | ||||
|             DFHack::DfVector<uint32_t> p_refs(p, itm.origin + ref_vector); | ||||
|             for (size_t j = 0; j < p_refs.size(); j++) { | ||||
|                 uint32_t vptr = p->readDWord(p_refs[j]); | ||||
|                 uint32_t val = p->readDWord(p_refs[j]+4); | ||||
|                 printf("\t-> %d \t%s\n", int(val), p->readClassName(vptr).c_str()); | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| #ifndef LINUX_BUILD | ||||
|     cout << "Done. Press any key to continue" << endl; | ||||
|     cin.ignore(); | ||||
| #endif | ||||
|     return 0; | ||||
| } | ||||
| @ -1,105 +0,0 @@ | ||||
| // Just show some position data
 | ||||
| 
 | ||||
| #include <iostream> | ||||
| #include <iomanip> | ||||
| #include <climits> | ||||
| #include <vector> | ||||
| #include <sstream> | ||||
| #include <ctime> | ||||
| #include <cstdio> | ||||
| #include <stdio.h> | ||||
| 
 | ||||
| #define DFHACK_WANT_MISCUTILS | ||||
| #include <DFHack.h> | ||||
| using namespace DFHack; | ||||
| 
 | ||||
| void describe (dfh_engraving &engraving) | ||||
| { | ||||
|     t_engraving &data = engraving.s; | ||||
|     printf("Engraving %d/%d/%d @ 0x%x\n", data.x, data.y, data.z, engraving.origin); | ||||
|     // inorganic stuff - we can recognize that
 | ||||
|     printf("type %d, index %d, character %c\n",data.type, data.subtype_idx, data.display_character); | ||||
|     printf("quality %d\n",data.quality); | ||||
|     printf("engraved: "); | ||||
|     if(data.flags.floor) | ||||
|         printf("On the floor."); | ||||
|     if(data.flags.north) | ||||
|         printf("From north."); | ||||
|     if(data.flags.south) | ||||
|         printf("From south."); | ||||
|     if(data.flags.east) | ||||
|         printf("From east."); | ||||
|     if(data.flags.west) | ||||
|         printf("From west."); | ||||
|     if(data.flags.northeast) | ||||
|         printf("From north-east."); | ||||
|     if(data.flags.northwest) | ||||
|         printf("From north-west."); | ||||
|     if(data.flags.southeast) | ||||
|         printf("From south-east."); | ||||
|     if(data.flags.southwest) | ||||
|         printf("From south-west."); | ||||
|     printf("\n"); | ||||
|     if(data.flags.hidden) | ||||
|         printf("The symbol is hidden.\n"); | ||||
| }; | ||||
| 
 | ||||
| int main (int numargs, const char ** args) | ||||
| { | ||||
|     DFHack::ContextManager DFMgr("Memory.xml"); | ||||
|     DFHack::Context* DF; | ||||
|     try | ||||
|     { | ||||
|         DF = DFMgr.getSingleContext(); | ||||
|         DF->Attach(); | ||||
|     } | ||||
|     catch (std::exception& e) | ||||
|     { | ||||
|         std::cerr << e.what() << std::endl; | ||||
|         #ifndef LINUX_BUILD | ||||
|             cin.ignore(); | ||||
|         #endif | ||||
|         return 1; | ||||
|     } | ||||
|      | ||||
|     DFHack::Gui *Gui = DF->getGui(); | ||||
|      | ||||
|     DFHack::Engravings *Cons = DF->getEngravings(); | ||||
|     uint32_t numEngr; | ||||
|     Cons->Start(numEngr); | ||||
|      | ||||
|     int32_t cx, cy, cz; | ||||
|     Gui->getCursorCoords(cx,cy,cz); | ||||
|     if(cx != -30000) | ||||
|     { | ||||
|         dfh_engraving engraved; | ||||
|         t_engraving &data = engraved.s; | ||||
|         for(uint32_t i = 0; i < numEngr; i++) | ||||
|         { | ||||
|             Cons->Read(i,engraved); | ||||
|             if(cx == data.x && cy == data.y && cz == data.z) | ||||
|             { | ||||
|                 describe(engraved); | ||||
|                 hexdump(DF,engraved.origin,0x28); | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|     else | ||||
|     { | ||||
|         dfh_engraving engraved; | ||||
|         t_engraving &data = engraved.s; | ||||
|         for(uint32_t i = 0; i < numEngr; i++) | ||||
|         { | ||||
|             Cons->Read(i,engraved); | ||||
|             { | ||||
|                 describe(engraved); | ||||
|                 hexdump(DF,engraved.origin,0x28); | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|     #ifndef LINUX_BUILD | ||||
|     cout << "Done. Press any key to continue" << endl; | ||||
|     cin.ignore(); | ||||
|     #endif | ||||
|     return 0; | ||||
| } | ||||
| @ -1,66 +0,0 @@ | ||||
| // Hotkey and Note Dump
 | ||||
| // Or Hot Keynote Dump? :P
 | ||||
| #include <iostream> | ||||
| #include <climits> | ||||
| #include <vector> | ||||
| using namespace std; | ||||
| #include <DFHack.h> | ||||
| 
 | ||||
| 
 | ||||
| int main (void) | ||||
| { | ||||
|     DFHack::ContextManager DFMgr("Memory.xml"); | ||||
|     DFHack::Context * DF; | ||||
|     try | ||||
|     { | ||||
|         DF = DFMgr.getSingleContext(); | ||||
|         DF->Attach(); | ||||
|     } | ||||
|     catch (exception& e) | ||||
|     { | ||||
|         cerr << e.what() << endl; | ||||
|         #ifndef LINUX_BUILD | ||||
|             cin.ignore(); | ||||
|         #endif | ||||
|         return 1; | ||||
|     } | ||||
|      | ||||
|     DFHack::VersionInfo * mem = DF->getMemoryInfo(); | ||||
|     DFHack::Gui * Gui = DF->getGui(); | ||||
|     // get stone matgloss mapping
 | ||||
|     /*
 | ||||
|     uint32_t numNotes; | ||||
|     if(!DF.InitReadNotes(numNotes)) | ||||
|     { | ||||
|         cerr << "Can't get notes" << endl; | ||||
|         return 1; | ||||
|     } | ||||
|     */ | ||||
|     /*
 | ||||
|     cout << "Notes" << endl; | ||||
|     for(uint32_t i = 0; i < numNotes; i++) | ||||
|     { | ||||
|         DFHack::t_note temp; | ||||
|         DF.ReadNote(i,temp); | ||||
|         cout << "x: " << temp.x << "\ty: " << temp.y << "\tz: " << temp.z << | ||||
|             "\tsymbol: " << temp.symbol << "\tfg: " << temp.foreground << "\tbg: " << temp.background << | ||||
|             "\ttext: " << temp.name << endl; | ||||
|     } | ||||
|     */ | ||||
|     cout << "Hotkeys" << endl; | ||||
|     DFHack::t_hotkey hotkeys[NUM_HOTKEYS]; | ||||
|     Gui->ReadHotkeys(hotkeys); | ||||
|     for(uint32_t i =0;i< NUM_HOTKEYS;i++) | ||||
|     { | ||||
|         cout << "x: " << hotkeys[i].x << "\ty: " << hotkeys[i].y << "\tz: " << hotkeys[i].z << | ||||
|             "\ttext: " << hotkeys[i].name << endl; | ||||
|     } | ||||
|     //DF.FinishReadNotes();
 | ||||
|     DF->Detach(); | ||||
|     #ifndef LINUX_BUILD | ||||
|     cout << "Done. Press any key to continue" << endl; | ||||
|     cin.ignore(); | ||||
|     #endif | ||||
|     return 0; | ||||
| } | ||||
| 
 | ||||
| @ -1,149 +0,0 @@ | ||||
| // Just show some position data
 | ||||
| 
 | ||||
| #include <iostream> | ||||
| #include <climits> | ||||
| #include <vector> | ||||
| #include <sstream> | ||||
| #include <ctime> | ||||
| using namespace std; | ||||
| 
 | ||||
| #include <DFHack.h> | ||||
| 
 | ||||
| int main (int numargs, const char ** args) | ||||
| { | ||||
|     uint32_t addr; | ||||
|     if (numargs == 2) | ||||
|     { | ||||
|         istringstream input (args[1],istringstream::in); | ||||
|         input >> std::hex >> addr; | ||||
|     } | ||||
|      | ||||
|     DFHack::ContextManager DFMgr("Memory.xml"); | ||||
|     DFHack::Context * DF; | ||||
|     try | ||||
|     { | ||||
|         DF = DFMgr.getSingleContext(); | ||||
|         DF->Attach(); | ||||
|     } | ||||
|     catch (exception& e) | ||||
|     { | ||||
|         cerr << e.what() << endl; | ||||
|         #ifndef LINUX_BUILD | ||||
|             cin.ignore(); | ||||
|         #endif | ||||
|         return 1; | ||||
|     } | ||||
|      | ||||
|     DFHack::Process* p = DF->getProcess(); | ||||
|     DFHack::VersionInfo* mem = DF->getMemoryInfo(); | ||||
|     DFHack::Materials *Materials = DF->getMaterials(); | ||||
|      | ||||
|     cout << "----==== Inorganic ====----" << endl; | ||||
|     Materials->ReadInorganicMaterials (); | ||||
|     for(uint32_t i = 0; i < Materials->inorganic.size();i++) | ||||
|     { | ||||
|         cout << i << ": " << Materials->inorganic[i].id << endl; | ||||
|     } | ||||
|      | ||||
|     cout << endl << "----==== Organic ====----" << endl; | ||||
|     Materials->ReadOrganicMaterials (); | ||||
|     for(uint32_t i = 0; i < Materials->organic.size();i++) | ||||
|     { | ||||
|         cout << i << ": " << Materials->organic[i].id << endl; | ||||
|     } | ||||
|     cout << endl << "----==== Organic - trees ====----" << endl; | ||||
|     Materials->ReadWoodMaterials (); | ||||
|     for(uint32_t i = 0; i < Materials->tree.size();i++) | ||||
|     { | ||||
|         cout << i << ": " << Materials->tree[i].id << endl; | ||||
|     } | ||||
|     cout << endl << "----==== Organic - plants ====----" << endl; | ||||
|     Materials->ReadPlantMaterials (); | ||||
|     for(uint32_t i = 0; i < Materials->plant.size();i++) | ||||
|     { | ||||
|         cout << i << ": " << Materials->plant[i].id << endl; | ||||
|     } | ||||
|     cout << endl << "----==== Color descriptors ====----" << endl; | ||||
|     Materials->ReadDescriptorColors(); | ||||
|     for(uint32_t i = 0; i < Materials->color.size();i++) | ||||
|     { | ||||
| 	cout << i << ": " << Materials->color[i].id << " - " << Materials->color[i].name << "[" | ||||
| 		<< (unsigned int) (Materials->color[i].red*255) << ":" | ||||
| 		<< (unsigned int) (Materials->color[i].green*255) << ":" | ||||
| 		<< (unsigned int) (Materials->color[i].blue*255) | ||||
| 		<< "]" << endl; | ||||
|     } | ||||
|     cout << endl << "----==== All descriptors ====----" << endl; | ||||
|     Materials->ReadDescriptorColors(); | ||||
|     for(uint32_t i = 0; i < Materials->alldesc.size();i++) | ||||
|     { | ||||
| 	cout << i << ": " << Materials->alldesc[i].id << endl; | ||||
|     } | ||||
| 
 | ||||
|     cout << endl << "----==== Creature types ====----" << endl; | ||||
|     Materials->ReadCreatureTypesEx (); | ||||
|     for(uint32_t i = 0; i < Materials->raceEx.size();i++) | ||||
|     { | ||||
|         cout << i << ": " << Materials->raceEx[i].rawname << endl; | ||||
|         vector<DFHack::t_creaturecaste> & castes = Materials->raceEx[i].castes; | ||||
|         for(uint32_t j = 0; j < castes.size();j++) | ||||
|         { | ||||
|             cout << " [" | ||||
|             << castes[j].rawname << ":" | ||||
|             << castes[j].singular << ":" | ||||
|             << castes[j].plural << ":" | ||||
|             << castes[j].adjective << "] [" | ||||
|             << "st:" << castes[j].strength.level << "/" | ||||
|             << "ag:" << castes[j].agility.level << "/" | ||||
|             << "to:" << castes[j].toughness.level << "/" | ||||
|             << "en:" << castes[j].endurance.level << "/" | ||||
|             << "re:" << castes[j].recuperation.level << "/" | ||||
|             << "di:" << castes[j].disease_resistance.level << "/" | ||||
|             << "an:" << castes[j].analytical_ability.level << "/" | ||||
|             << "fo:" << castes[j].focus.level << "/" | ||||
|             << "wi:" << castes[j].willpower.level << "/" | ||||
|             << "cr:" << castes[j].creativity.level << "/" | ||||
|             << "in:" << castes[j].intuition.level << "/" | ||||
|             << "pa:" << castes[j].patience.level << "/" | ||||
|             << "me:" << castes[j].memory.level << "/" | ||||
|             << "li:" << castes[j].linguistic_ability.level << "/" | ||||
|             << "sp:" << castes[j].spatial_sense.level << "/" | ||||
|             << "mu:" << castes[j].musicality.level << "/" | ||||
|             << "ki:" << castes[j].kinesthetic_sense.level << "]"; | ||||
|             cout << endl; | ||||
|             for(uint32_t k = 0; k < castes[j].ColorModifier.size(); k++) | ||||
|             { | ||||
|                 cout << "    colormod[" << castes[j].ColorModifier[k].part; | ||||
|                 if(castes[j].ColorModifier[k].startdate>0) | ||||
|                     cout << " start:" << castes[j].ColorModifier[k].startdate << " days, end:" << castes[j].ColorModifier[k].enddate << " days"; | ||||
|                 cout << "] "; | ||||
|                 for(uint32_t l = 0; l < castes[j].ColorModifier[k].colorlist.size(); l++) | ||||
|                 { | ||||
|                     if( castes[j].ColorModifier[k].colorlist[l] < Materials->color.size() ) | ||||
|                         cout << Materials->color[castes[j].ColorModifier[k].colorlist[l]].name << " "; | ||||
|                     else | ||||
|                         cout << Materials->alldesc[castes[j].ColorModifier[k].colorlist[l]].id << " "; | ||||
|                 } | ||||
|                 cout << endl; | ||||
|             } | ||||
|             cout << "     body: "; | ||||
|             for(uint32_t k = 0; k < castes[j].bodypart.size(); k++) | ||||
|             { | ||||
|                 cout << castes[j].bodypart[k].category << " "; | ||||
|             } | ||||
|             cout << endl; | ||||
|         } | ||||
|         cout << endl; | ||||
|     } | ||||
|     cout << endl << "----==== Other ====----" << endl; | ||||
|     Materials->ReadOthers (); | ||||
|     for(uint32_t i = 0; i < Materials->other.size();i++) | ||||
|     { | ||||
|         cout << i << ": " << Materials->other[i].rawname << endl; | ||||
|     } | ||||
|     #ifndef LINUX_BUILD | ||||
|     cout << "Done. Press any key to continue" << endl; | ||||
|     cin.ignore(); | ||||
|     #endif | ||||
|     return 0; | ||||
| } | ||||
| @ -1,146 +0,0 @@ | ||||
| // Demonstrates the use of ProcessEnumerator
 | ||||
| // queries the Enumerator for all DF Processes on user input. Prints them to the terminal.
 | ||||
| // also tracks processes that were invalidated
 | ||||
| 
 | ||||
| #include <iostream> | ||||
| #include <climits> | ||||
| #include <vector> | ||||
| #include <ctime> | ||||
| using namespace std; | ||||
| 
 | ||||
| #include <DFHack.h> | ||||
| #include <DFProcessEnumerator.h> | ||||
| using namespace DFHack; | ||||
| #ifndef LINUX_BUILD | ||||
| #endif | ||||
| 
 | ||||
| void printhelp () | ||||
| { | ||||
|     cout << "enter empty line for next try." << endl; | ||||
|     cout << "enter 'next' or 'n' for next test." << endl; | ||||
|     cout << "enter 'help' to show this text again." << endl; | ||||
| } | ||||
| 
 | ||||
| int inputwait (const char * prompt) | ||||
| { | ||||
| inputwait_reset: | ||||
|     string command = ""; | ||||
|     cout <<"[" << prompt << "]# "; | ||||
|     getline(cin, command); | ||||
|     if(command == "help") | ||||
|     { | ||||
|         printhelp(); | ||||
|         goto inputwait_reset; | ||||
|     } | ||||
|     else if(command == "") | ||||
|     { | ||||
|         return 1; | ||||
|     } | ||||
|     else if(command == "next") | ||||
|     { | ||||
|         return 0; | ||||
|     } | ||||
|     else | ||||
|     { | ||||
|         cout << "Command not recognized. Try 'help' for a list of valid commands." << endl; | ||||
|         goto inputwait_reset; | ||||
|     } | ||||
|     return 0; | ||||
| } | ||||
| 
 | ||||
| int main (void) | ||||
| { | ||||
|     printhelp(); | ||||
|     cout << endl; | ||||
|     // first test ProcessEnumerator and BadProcesses
 | ||||
|     { | ||||
|         cout << "Testing ProcessEnumerator" << endl; | ||||
|         ProcessEnumerator Penum("Memory.xml"); | ||||
|         VersionInfo * mem; | ||||
|         do | ||||
|         { | ||||
|             // make the ProcessEnumerator update its list of Processes
 | ||||
|             // by passing the pointer to 'inval', we make it export expired
 | ||||
|             // processes instead of destroying them outright
 | ||||
|             // (processes expire when the OS kills them for whatever reason)
 | ||||
|             BadProcesses inval; | ||||
|             Penum.Refresh(&inval); | ||||
|             int nProc = Penum.size(); | ||||
|             int nInval = inval.size(); | ||||
| 
 | ||||
|             cout << "Processes:" << endl; | ||||
|             for(int i = 0; i < nProc; i++) | ||||
|             { | ||||
|                 mem = Penum[i]->getDescriptor(); | ||||
|                 cout << "DF instance: " << Penum[i]->getPID() | ||||
|                      << ", " << mem->getVersion() << endl; | ||||
|             } | ||||
| 
 | ||||
|             cout << "Invalidated:" << endl; | ||||
|             for(int i = 0; i < nInval; i++) | ||||
|             { | ||||
|                 mem = inval[i]->getDescriptor(); | ||||
|                 cout << "DF instance: " << inval[i]->getPID() | ||||
|                      << ", " << mem->getVersion() << endl; | ||||
|             } | ||||
|         } | ||||
|         while(inputwait("ProcessEnumerator")); | ||||
|     } | ||||
|     // next test ContextManager and BadContexts
 | ||||
|     { | ||||
|         cout << "Testing ContextManager" << endl; | ||||
|         ContextManager Cman("Memory.xml"); | ||||
|         VersionInfo * mem; | ||||
|         do | ||||
|         { | ||||
|             // make the ContextManager update its list of Contexts
 | ||||
|             // by passing the pointer to 'inval', we make it export expired
 | ||||
|             // contexts instead of destroying them outright
 | ||||
|             // (contexts expire when the OS kills their process for whatever
 | ||||
|             //  reason)
 | ||||
|             BadContexts inval; | ||||
|             Cman.Refresh(&inval); | ||||
|             int nCont = Cman.size(); | ||||
|             int nInval = inval.size(); | ||||
|             DFHack::Context * cont = Cman.getSingleContext(); | ||||
|             if(cont) | ||||
|             { | ||||
|                 if(cont->Attach()) | ||||
|                 { | ||||
|                     DFHack::Maps * mapz = cont->getMaps(); | ||||
|                     cont->Suspend(); | ||||
|                     mapz->Start(); | ||||
|                     cont->Resume(); | ||||
|                 } | ||||
| 
 | ||||
|                 bool result = cont->Detach(); | ||||
|                 if(!result) | ||||
|                 { | ||||
|                     cerr << "Something went horribly wrong during detach" << endl; | ||||
|                 } | ||||
|             } | ||||
| 
 | ||||
|             cout << "Contexts:" << endl; | ||||
|             for(int i = 0; i < nCont; i++) | ||||
|             { | ||||
|                 mem = Cman[i]->getMemoryInfo(); | ||||
|                 cout << "DF instance: " << Cman[i]->getProcess()->getPID() | ||||
|                      << ", " << mem->getVersion() << endl; | ||||
|             } | ||||
| 
 | ||||
|             cout << "Invalidated:" << endl; | ||||
|             for(int i = 0; i < nInval; i++) | ||||
|             { | ||||
|                 mem = inval[i]->getMemoryInfo(); | ||||
|                 cout << "DF instance: " << inval[i]->getProcess()->getPID() | ||||
|                      << ", " << mem->getVersion() << endl; | ||||
|             } | ||||
|         } | ||||
|         while(inputwait("ContextManager")); | ||||
|     } | ||||
|     #ifndef LINUX_BUILD | ||||
|         cout << "Done. Press any key to continue" << endl; | ||||
|         cin.ignore(); | ||||
|     #endif | ||||
|     return 0; | ||||
| } | ||||
| @ -1,85 +0,0 @@ | ||||
| #include <iostream> | ||||
| #include <iomanip> | ||||
| #include <sstream> | ||||
| #include <climits> | ||||
| #include <integers.h> | ||||
| #include <vector> | ||||
| using namespace std; | ||||
| 
 | ||||
| #include <DFTypes.h> | ||||
| #include <DFHackAPI.h> | ||||
| #include <stdio.h> | ||||
| 
 | ||||
| 
 | ||||
| void printSettlement(DFHack::ContextManager & DF, const DFHack::t_settlement & settlement, const vector< vector<string> > &englishWords, const vector< vector<string> > &foreignWords) | ||||
| { | ||||
|     cout << "First name: " << settlement.name.first_name << endl <<  "Nickname: " << settlement.name.nickname << endl; | ||||
|     cout << settlement.name.words[0] << " " << settlement.name.words[1] << " " << settlement.name.words[2] << " " | ||||
|     << settlement.name.words[3] << " " << settlement.name.words[4] << " " << settlement.name.words[5] << " " | ||||
|     << settlement.name.words[6] << " " << settlement.name.words[7] << endl; | ||||
|     cout << settlement.name.parts_of_speech[0] << " " << settlement.name.parts_of_speech[1] << " " << settlement.name.parts_of_speech[2] << " " | ||||
|     << settlement.name.parts_of_speech[3] << " " << settlement.name.parts_of_speech[4] << " " << settlement.name.parts_of_speech[5] << " " | ||||
|     << settlement.name.parts_of_speech[6] << " " << settlement.name.parts_of_speech[7] << endl; | ||||
| 
 | ||||
|     printf("Origin: 0x%x\n",settlement.origin); | ||||
|      | ||||
|     string genericName = DF.TranslateName(settlement.name,englishWords,foreignWords,true); | ||||
|     string dwarfName = DF.TranslateName(settlement.name,englishWords,foreignWords,false); | ||||
|     cout << dwarfName << " " << genericName << " " << "world x: " << settlement.world_x << " world y: " << settlement.world_y  | ||||
|         << " local_x: " << settlement.local_x1 << " local_y: " << settlement.local_y1 << " size: " << settlement.local_x2 - settlement.local_x1 << " by " << settlement.local_y2 - settlement.local_y1 << "\n"; | ||||
| } | ||||
| 
 | ||||
| int main (int argc,const char* argv[]) | ||||
| { | ||||
|     DFHack::ContextManager DF("Memory.xml"); | ||||
|     try | ||||
|     { | ||||
|         DF.Attach(); | ||||
|     } | ||||
|     catch (exception& e) | ||||
|     { | ||||
|         cerr << e.what() << endl; | ||||
|         #ifndef LINUX_BUILD | ||||
|             cin.ignore(); | ||||
|         #endif | ||||
|         return 1; | ||||
|     } | ||||
|      | ||||
|     DFHack::t_settlement current; | ||||
|     uint32_t numSettlements; | ||||
|     if(!DF.InitReadSettlements(numSettlements)) | ||||
|     { | ||||
|         cerr << "Could not read Settlements" << endl; | ||||
|         return 1; | ||||
|     } | ||||
|      | ||||
|     vector< vector<string> > englishWords; | ||||
|     vector< vector<string> > foreignWords; | ||||
|     if(!DF.InitReadNameTables(englishWords,foreignWords)) | ||||
|     { | ||||
|         cerr << "Can't get name tables" << endl; | ||||
|         return 1; | ||||
|     } | ||||
|      | ||||
|     cout << "Settlements\n"; | ||||
|     /*for(uint32_t i =0;i<numSettlements;i++){
 | ||||
|         DFHack::t_settlement temp; | ||||
|         DF.ReadSettlement(i,temp); | ||||
|         printSettlement(DF,temp,englishWords,foreignWords); | ||||
|     }*/ | ||||
|     // MSVC claims this is causing the heap to be corrupted, I think it is because the currentSettlement vector only has 1 item in it
 | ||||
|      | ||||
|     cout << "Current Settlement\n"; | ||||
|     if(DF.ReadCurrentSettlement(current)) | ||||
|         printSettlement(DF,current,englishWords,foreignWords); | ||||
| 
 | ||||
|     DF.FinishReadNameTables(); | ||||
|     DF.FinishReadSettlements(); | ||||
|     DF.Detach(); | ||||
|      | ||||
|     #ifndef LINUX_BUILD | ||||
|         cout << "Done. Press any key to continue" << endl; | ||||
|         cin.ignore(); | ||||
|     #endif | ||||
|     return 0; | ||||
| } | ||||
| @ -1,197 +0,0 @@ | ||||
| // Just show some position data
 | ||||
| 
 | ||||
| #include <iostream> | ||||
| #include <iomanip> | ||||
| #include <climits> | ||||
| #include <vector> | ||||
| #include <sstream> | ||||
| #include <ctime> | ||||
| #include <cstdio> | ||||
| using namespace std; | ||||
| #define DFHACK_WANT_MISCUTILS | ||||
| #include <DFHack.h> | ||||
| 
 | ||||
| using namespace DFHack; | ||||
| 
 | ||||
| //FIXME: A pile of magic numbers. looks like decompiled number
 | ||||
| typedef uint32_t _DWORD; | ||||
| int get_material_vector(uint32_t vein_8, uint16_t vein_4, int WORLD_) | ||||
| { | ||||
|   int result; // eax@2
 | ||||
|   int v4; // ecx@11
 | ||||
|   int v5; // eax@12
 | ||||
| 
 | ||||
|   if ( (uint16_t)(vein_4 - 0x1A3) > 0xC7u ) | ||||
|   { | ||||
|     if ( ((int16_t)vein_4 < 19 || (int16_t)vein_4 > 0xDAu) | ||||
|       && (uint16_t)(vein_4 - 219) > 0xC7u ) | ||||
|     { | ||||
|       if ( vein_4 ) | ||||
|       { | ||||
|         if ( vein_4 > 0x292u ) | ||||
|           result = 0; | ||||
|         else | ||||
|           result = *(_DWORD *)(WORLD_ + 4 * (int16_t)vein_4 + 0x5DF44); | ||||
|       } | ||||
|       else | ||||
|       { | ||||
|         if ( (signed int)vein_8 >= 0 | ||||
|           && (v4 = *(_DWORD *)(WORLD_ + 0x54B88), vein_8 < (*(_DWORD *)(WORLD_ + 0x54B8C) - v4) >> 2) | ||||
|           && (v5 = *(_DWORD *)(v4 + 4 * vein_8)) != 0 ) | ||||
|           result = v5 + 0x178; | ||||
|         else | ||||
|           result = *(_DWORD *)(WORLD_ + 0x5DF44); | ||||
|       } | ||||
|     } | ||||
|     else | ||||
|     { | ||||
|         /*
 | ||||
|       result = sub_4D47A0(vein_8, vein_4, WORLD_ + 0x54C84); | ||||
|       if ( !result ) | ||||
|         result = *(_DWORD *)(WORLD_ + 0x5DF90); | ||||
|       */ | ||||
|     } | ||||
|   } | ||||
|   else | ||||
|   { | ||||
|       /*
 | ||||
|     result = sub_41F430(WORLD_ + 0x54B94, vein_4); | ||||
|     if ( !result ) | ||||
|       result = *(_DWORD *)(WORLD_ + 0x5E5D0); | ||||
|     */ | ||||
|   } | ||||
|   return result; | ||||
| } | ||||
| char shades[10] = {'#','$','O','=','+','|','-','^','.',' '}; | ||||
| 
 | ||||
| void printSpatter(DFHack::Context * DF, t_spattervein & spatter) | ||||
| { | ||||
|     DFHack::Materials *Mats = DF->getMaterials(); | ||||
|     printf("Splatter\nmat1: %d\nunknown: %d\nmat2: %d\n",spatter.mat1,spatter.unk1,spatter.mat2); | ||||
|     printf ("Material : %d - ", spatter.matter_state); | ||||
|     // FIXME: stupid
 | ||||
|     switch(spatter.matter_state) | ||||
|     { | ||||
|         case state_gas: | ||||
|             printf("Gas "); | ||||
|             break; | ||||
|         case state_solid: | ||||
|             printf("Solid "); | ||||
|             break; | ||||
|         case state_liquid: | ||||
|             printf("Liquid "); | ||||
|             break; | ||||
|         case state_paste: | ||||
|             printf("Paste "); | ||||
|             break; | ||||
|         case state_powder: | ||||
|             printf("Powder "); | ||||
|             break; | ||||
|         case state_pressed: | ||||
|             printf("Pressed "); | ||||
|             break; | ||||
|         default: | ||||
|             printf("Unknown state "); | ||||
|     } | ||||
|     cout << PrintSplatterType(spatter.mat1,spatter.mat2,Mats->race) << endl; | ||||
|     printf("Address 0x%08x\n",spatter.address_of); | ||||
|     for(uint32_t yyy = 0; yyy < 16; yyy++) | ||||
|     { | ||||
|         cout << "|"; | ||||
|         for(uint32_t xxx = 0; xxx < 16; xxx++)  | ||||
|         { | ||||
|             uint8_t intensity = spatter.intensity[xxx][yyy]; | ||||
|             cout << shades[9 - (intensity / 28)]; | ||||
|         } | ||||
|         cout << "|" << endl; | ||||
|     } | ||||
|     hexdump(DF, spatter.address_of,20*16); | ||||
| } | ||||
| 
 | ||||
| int main (int numargs, const char ** args) | ||||
| { | ||||
|     uint32_t x_max,y_max,z_max; | ||||
|     vector<t_vein> veinVector; | ||||
|     vector<t_frozenliquidvein> IceVeinVector; | ||||
|     vector<t_spattervein> splatter; | ||||
| 
 | ||||
|     DFHack::ContextManager DFMgr("Memory.xml"); | ||||
|     DFHack::Context * DF; | ||||
|     try | ||||
|     { | ||||
|         DF = DFMgr.getSingleContext(); | ||||
|         DF->Attach(); | ||||
|     } | ||||
|     catch (exception& e) | ||||
|     { | ||||
|         cerr << e.what() << endl; | ||||
|         #ifndef LINUX_BUILD | ||||
|             cin.ignore(); | ||||
|         #endif | ||||
|         return 1; | ||||
|     } | ||||
|      | ||||
|     DFHack::Maps *Maps =DF->getMaps(); | ||||
|     DFHack::Gui *Gui =DF->getGui(); | ||||
|     DFHack::Materials *Mats =DF->getMaterials(); | ||||
|      | ||||
|     Mats->ReadCreatureTypes(); | ||||
|      | ||||
|     // init the map
 | ||||
|     if(!Maps->Start()) | ||||
|     { | ||||
|         cerr << "Can't init map." << endl; | ||||
|         #ifndef LINUX_BUILD | ||||
|             cin.ignore(); | ||||
|         #endif | ||||
|         return 1; | ||||
|     } | ||||
|      | ||||
|     int32_t cx, cy, cz; | ||||
|     Maps->getSize(x_max,y_max,z_max); | ||||
|     Gui->getCursorCoords(cx,cy,cz); | ||||
|     if(cx == -30000) | ||||
|     { | ||||
|         // walk the map
 | ||||
|         for(uint32_t x = 0; x< x_max;x++) for(uint32_t y = 0; y< y_max;y++) for(uint32_t z = 0; z< z_max;z++) | ||||
|         { | ||||
|             if(Maps->isValidBlock(x,y,z)) | ||||
|             { | ||||
|                 // look for splater veins
 | ||||
|                 Maps->ReadVeins(x,y,z,0,0,&splatter); | ||||
|                 if(splatter.size()) | ||||
|                 { | ||||
|                     printf("Block %d/%d/%d\n",x,y,z); | ||||
|                     for(uint32_t i = 0; i < splatter.size(); i++) | ||||
|                     { | ||||
|                         cout << i << ":" << endl; | ||||
|                         printSpatter(DF,splatter[i]); | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|     else | ||||
|     { | ||||
|         uint32_t bx,by,bz; | ||||
|         bx = cx / 16; | ||||
|         by = cy / 16; | ||||
|         bz = cz; | ||||
|         // look for splater veins
 | ||||
|         Maps->ReadVeins(bx,by,bz,0,0,&splatter); | ||||
|         if(splatter.size()) | ||||
|         { | ||||
|             printf("Block %d/%d/%d\n",bx,by,bz); | ||||
|             for(uint32_t i = 0; i < splatter.size(); i++) | ||||
|             { | ||||
|                 printSpatter(DF,splatter[i]); | ||||
|                 cout << endl; | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|     #ifndef LINUX_BUILD | ||||
|     cout << "Done. Press any key to continue" << endl; | ||||
|     cin.ignore(); | ||||
|     #endif | ||||
|     return 0; | ||||
| } | ||||
| @ -1,146 +0,0 @@ | ||||
| // Just show some position data
 | ||||
| 
 | ||||
| #include <iostream> | ||||
| #include <iomanip> | ||||
| #include <climits> | ||||
| #include <vector> | ||||
| #include <sstream> | ||||
| #include <ctime> | ||||
| #include <cstdio> | ||||
| using namespace std; | ||||
| 
 | ||||
| #define DFHACK_WANT_MISCUTILS | ||||
| #include <DFHack.h> | ||||
| /*
 | ||||
|         uint16_t material; // +0x3E
 | ||||
|         uint16_t x; // +0x40
 | ||||
|         uint16_t y; // +0x42
 | ||||
|         uint16_t z; // +0x44
 | ||||
|         uint16_t padding; // +0x46
 | ||||
|         uint32_t unknown_1; // +0x48
 | ||||
|         uint16_t temperature_1; // +0x4C
 | ||||
|         uint16_t temperature_2; // +0x4E - maybe fraction?
 | ||||
|         uint32_t mystery_flag; // 0x50: yes, just one
 | ||||
|         uint32_t unknown_2; // 0x54
 | ||||
|         uint32_t unknown_3; // 0x58
 | ||||
|         // a vector is here
 | ||||
|         uint32_t address; | ||||
|         */ | ||||
| void print_tree( DFHack::Context * DF , DFHack::dfh_plant & tree) | ||||
| { | ||||
|     DFHack::Materials * mat = DF->getMaterials(); | ||||
|     DFHack::t_plant & tdata = tree.sdata; | ||||
|     printf("%d:%d = ",tdata.type,tdata.material); | ||||
|     if(tdata.watery) | ||||
|     { | ||||
|         cout << "near-water "; | ||||
|     } | ||||
|     cout << mat->organic[tdata.material].id << " "; | ||||
|     if(!tdata.is_shrub) | ||||
|     { | ||||
|         cout << "tree"; | ||||
|     } | ||||
|     else | ||||
|     { | ||||
|         cout << "shrub"; | ||||
|     } | ||||
|     cout << endl; | ||||
|     printf("Grow counter: 0x%08x\n", tdata.grow_counter); | ||||
|     printf("temperature 1: %d\n", tdata.temperature_1); | ||||
|     printf("temperature 2: %d\n", tdata.temperature_2); | ||||
|     printf("On fire: %d\n", tdata.is_burning); | ||||
|     printf("hitpoints: 0x%08x\n", tdata.hitpoints); | ||||
|     printf("update order: %d\n", tdata.update_order); | ||||
|     printf("Address: 0x%x\n", tree.address); | ||||
|     hexdump(DF,tree.address,13*16); | ||||
| } | ||||
| 
 | ||||
| int main (int numargs, const char ** args) | ||||
| { | ||||
|     uint32_t addr; | ||||
|     if (numargs == 2) | ||||
|     { | ||||
|         istringstream input (args[1],istringstream::in); | ||||
|         input >> std::hex >> addr; | ||||
|     } | ||||
|     DFHack::ContextManager DFMgr("Memory.xml"); | ||||
|     DFHack::Context * DF; | ||||
|     try | ||||
|     { | ||||
|         DF = DFMgr.getSingleContext(); | ||||
|         DF->Attach(); | ||||
|     } | ||||
|     catch (exception& e) | ||||
|     { | ||||
|         cerr << e.what() << endl; | ||||
|         #ifndef LINUX_BUILD | ||||
|             cin.ignore(); | ||||
|         #endif | ||||
|         return 1; | ||||
|     } | ||||
| 
 | ||||
|     DFHack::Process* p = DF->getProcess(); | ||||
|     DFHack::VersionInfo* mem = DF->getMemoryInfo(); | ||||
|     DFHack::Gui * Gui = DF->getGui(); | ||||
|     DFHack::Vegetation * v = DF->getVegetation(); | ||||
|     DFHack::Maps * mps = DF->getMaps(); | ||||
|     DFHack::Materials * mat = DF->getMaterials(); | ||||
|     mat->ReadOrganicMaterials(); | ||||
| 
 | ||||
|     int32_t x,y,z; | ||||
|     Gui->getCursorCoords(x,y,z); | ||||
| 
 | ||||
|     uint32_t numVegs = 0; | ||||
|     v->Start(numVegs); | ||||
|     if(x == -30000) | ||||
|     { | ||||
|         cout << "----==== Trees ====----" << endl; | ||||
|         for(uint32_t i =0; i < numVegs; i++) | ||||
|         { | ||||
|             DFHack::dfh_plant tree; | ||||
|             v->Read(i,tree); | ||||
|             printf("%d/%d/%d, %d:%d\n",tree.sdata.x,tree.sdata.y,tree.sdata.z,tree.sdata.type,tree.sdata.material); | ||||
|         } | ||||
|     } | ||||
|     else | ||||
|     { | ||||
|         // new method, gets the vector of trees in a block. can show farm plants
 | ||||
|         if(mps->Start()) | ||||
|         { | ||||
|             vector<DFHack::dfh_plant> alltrees; | ||||
|             if(mps->ReadVegetation(x/16,y/16,z,&alltrees)) | ||||
|             { | ||||
|                 for(int i = 0 ; i < alltrees.size(); i++) | ||||
|                 { | ||||
|                     DFHack::dfh_plant & tree = alltrees[i]; | ||||
|                     // you could take the tree coords from the struct and % them with 16 for use in loops over the whole block
 | ||||
|                     if(tree.sdata.x == x && tree.sdata.y == y && tree.sdata.z == z) | ||||
|                     { | ||||
|                         cout << "----==== Tree at "<< x << "/" << y << "/" << z << " ====----" << endl; | ||||
|                         print_tree(DF, tree); | ||||
|                         break; | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|         // old method, gets the tree from the global vegetation vector. can't show farm plants
 | ||||
|         for(uint32_t i =0; i < numVegs; i++) | ||||
|         { | ||||
|             DFHack::dfh_plant tree; | ||||
|             v->Read(i,tree); | ||||
|             if(tree.sdata.x == x && tree.sdata.y == y && tree.sdata.z == z) | ||||
|             { | ||||
|                 cout << "----==== Tree at "<< dec << x << "/" << y << "/" << z << " ====----" << endl; | ||||
|                 print_tree(DF, tree); | ||||
|                 break; | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|     v->Finish(); | ||||
| 
 | ||||
|     #ifndef LINUX_BUILD | ||||
|     cout << "Done. Press any key to continue" << endl; | ||||
|     cin.ignore(); | ||||
|     #endif | ||||
|     return 0; | ||||
| } | ||||
| @ -1,66 +0,0 @@ | ||||
| // Invert/toggle all block flags, to see what they do.
 | ||||
| // Seems like they don't do anything...
 | ||||
| 
 | ||||
| #include <iostream> | ||||
| #include <iomanip> | ||||
| 
 | ||||
| using namespace std; | ||||
| #include <DFHack.h> | ||||
| #include <extra/MapExtras.h> | ||||
| #include <extra/termutil.h> | ||||
| 
 | ||||
| 
 | ||||
| int main(int argc, char *argv[]) | ||||
| { | ||||
|     bool temporary_terminal = TemporaryTerminal(); | ||||
| 
 | ||||
|     uint32_t x_max = 0, y_max = 0, z_max = 0; | ||||
|     DFHack::ContextManager manager("Memory.xml"); | ||||
| 
 | ||||
|     DFHack::Context *context = manager.getSingleContext(); | ||||
|     if (!context->Attach()) | ||||
|     { | ||||
|         std::cerr << "Unable to attach to DF!" << std::endl; | ||||
|         if(temporary_terminal) | ||||
|             std::cin.ignore(); | ||||
|         return 1; | ||||
|     } | ||||
| 
 | ||||
|     DFHack::Maps *maps = context->getMaps(); | ||||
|     if (!maps->Start()) | ||||
|     { | ||||
|         std::cerr << "Cannot get map info!" << std::endl; | ||||
|         context->Detach(); | ||||
|         if(temporary_terminal) | ||||
|             std::cin.ignore(); | ||||
|         return 1; | ||||
|     } | ||||
|     maps->getSize(x_max, y_max, z_max); | ||||
|     MapExtras::MapCache map(maps); | ||||
| 
 | ||||
|     for(uint32_t z = 0; z < z_max; z++) | ||||
|     { | ||||
|         for(uint32_t b_y = 0; b_y < y_max; b_y++) | ||||
|         { | ||||
|             for(uint32_t b_x = 0; b_x < x_max; b_x++) | ||||
|             { | ||||
|                 // Get the map block
 | ||||
|                 DFHack::DFCoord blockCoord(b_x, b_y); | ||||
|                 MapExtras::Block *b = map.BlockAt(DFHack::DFCoord(b_x, b_y, z)); | ||||
|                 if (!b || !b->valid) | ||||
|                 { | ||||
|                     continue; | ||||
|                 } | ||||
| 
 | ||||
|                 DFHack::t_blockflags flags = b->BlockFlags(); | ||||
|                 flags.whole = flags.whole ^ 0xFFFFFFFF; | ||||
|                 b->setBlockFlags(flags); | ||||
|                 b->Write(); | ||||
|             } // block x
 | ||||
|         } // block y
 | ||||
|     } // z
 | ||||
| 
 | ||||
|     maps->Finish(); | ||||
|     context->Detach(); | ||||
|     return 0; | ||||
| } | ||||
| @ -1,133 +0,0 @@ | ||||
| #include <iostream> | ||||
| #include <fstream> | ||||
| #include <sstream> | ||||
| #include <DFHack.h> | ||||
| 
 | ||||
| using namespace std; | ||||
| 
 | ||||
| bool getNumber (string prompt, int & output, int def, bool pdef = true) | ||||
| { | ||||
|     cout << prompt; | ||||
|     if(pdef) | ||||
|         cout << ", default=" << def << endl; | ||||
|     while (1) | ||||
|     { | ||||
|         string select; | ||||
|         cout << ">>"; | ||||
|         std::getline(cin, select); | ||||
|         if(select.empty()) | ||||
|         { | ||||
|             output = def; | ||||
|             break; | ||||
|         } | ||||
|         else if( sscanf(select.c_str(), "%d", &output) == 1 ) | ||||
|         { | ||||
|             break; | ||||
|         } | ||||
|         else | ||||
|         { | ||||
|             continue; | ||||
|         } | ||||
|     } | ||||
|     return true; | ||||
| } | ||||
| 
 | ||||
| bool splitvector(const vector<uint64_t> & in, vector<uint64_t> & out1, vector<uint64_t> & out2) | ||||
| { | ||||
|     size_t length = in.size(); | ||||
|     if(length > 1) | ||||
|     { | ||||
|         size_t split = length / 2; | ||||
|         out1.clear(); | ||||
|         out2.clear(); | ||||
|         out1.insert(out1.begin(),in.begin(),in.begin() + split); | ||||
|         out2.insert(out2.begin(),in.begin() + split,in.end()); | ||||
|         return true; | ||||
|     } | ||||
|     return false; | ||||
| } | ||||
| void printvector (const vector<uint64_t> &in) | ||||
| { | ||||
|     cout << "[" << endl; | ||||
|     for(size_t i = 0; i < in.size(); i++) | ||||
|     { | ||||
|         cout << hex << in[i] << endl; | ||||
|     } | ||||
|     cout << "]" << endl; | ||||
| } | ||||
| 
 | ||||
| bool tryvals (DFHack::Context * DF, const vector<uint64_t> &in, uint8_t current, uint8_t testing) | ||||
| { | ||||
|     DF->Suspend(); | ||||
|     DFHack::Process * p = DF->getProcess(); | ||||
|     for(size_t i = 0; i < in.size(); i++) | ||||
|     { | ||||
|         p->writeByte(in[i],testing); | ||||
|     } | ||||
|     DF->Resume(); | ||||
|     int result; | ||||
|     while (!getNumber("Is the change good? 0 for no, positive for yes.",result,0)); | ||||
|     DF->Suspend(); | ||||
|     for(size_t i = 0; i < in.size(); i++) | ||||
|     { | ||||
|         p->writeByte(in[i],current); | ||||
|     } | ||||
|     DF->Resume(); | ||||
|     if(result) | ||||
|         return true; | ||||
|     return false; | ||||
| } | ||||
| 
 | ||||
| bool dotry (DFHack::Context * DF, const vector<uint64_t> &in, uint8_t current, uint8_t testing) | ||||
| { | ||||
|     vector <uint64_t> a, b; | ||||
|     bool found = false; | ||||
|     if(!tryvals(DF,in,current,testing)) | ||||
|         return false; | ||||
|     if(splitvector(in, a,b)) | ||||
|     { | ||||
|         if(dotry(DF, a, current, testing)) | ||||
|             return true; | ||||
|         if(dotry(DF, b, current, testing)) | ||||
|             return true; | ||||
|         return false; | ||||
|     } | ||||
|     return false; | ||||
| } | ||||
| 
 | ||||
| int main() | ||||
| { | ||||
|     vector <uint64_t> addresses; | ||||
|     vector <uint64_t> a1; | ||||
|     vector <uint64_t> a2; | ||||
|     vector <uint8_t> values; | ||||
|     string line; | ||||
| 
 | ||||
|     DFHack::ContextManager CM("Memory.xml"); | ||||
|     DFHack::Context * DF = CM.getSingleContext(); | ||||
|     if(!DF) | ||||
|         return 1; | ||||
|     DF->Resume(); | ||||
| 
 | ||||
|     ifstream fin("siege.txt"); | ||||
|     if(!fin.is_open()) | ||||
|         return 1; | ||||
|     do | ||||
|     { | ||||
|         getline(fin,line); | ||||
|         stringstream input (line); | ||||
|         input << hex; | ||||
|         uint64_t value; | ||||
|         input >> value; | ||||
|         if(value) | ||||
|         { | ||||
|             cout << hex << value << endl; | ||||
|             addresses.push_back(value); | ||||
|         } | ||||
|     } while (!fin.eof()); | ||||
|     int val_current,val_testing; | ||||
|     while (!getNumber("Insert current value",val_current,1)); | ||||
|     while (!getNumber("Insert testing value",val_testing,0)); | ||||
|     dotry(DF, addresses,val_current,val_testing); | ||||
|     return 0; | ||||
| } | ||||
| @ -1,111 +0,0 @@ | ||||
| // Dwarf fortress names are a complicated beast, in objects they are displayed
 | ||||
| // as indexes into the language vectors
 | ||||
| //
 | ||||
| // use this tool if you are trying to find what the indexes are for a displayed
 | ||||
| // name, so you can then search for it in your object
 | ||||
| 
 | ||||
| #include <iostream> | ||||
| #include <iomanip> | ||||
| #include <vector> | ||||
| #include <algorithm> | ||||
| #include <sstream> | ||||
| using namespace std; | ||||
| 
 | ||||
| #include <DFHack.h> | ||||
| 
 | ||||
| // returns a lower case version of the string 
 | ||||
| string tolower (const string & s) | ||||
| { | ||||
|     string d (s); | ||||
| 
 | ||||
|     transform (d.begin (), d.end (), d.begin (), (int(*)(int)) tolower); | ||||
|     return d; | ||||
| } | ||||
| string groupBy2(const string & s) | ||||
| { | ||||
|     string d; | ||||
|     for(int i =2;i<s.length();i++){ | ||||
|         if(i%2==0) | ||||
|         { | ||||
|             d+= s.substr(i-2,2) + " "; | ||||
|         } | ||||
|     } | ||||
|     d+=s.substr(s.length()-2,2); | ||||
|     return(d); | ||||
| } | ||||
| 
 | ||||
| uint32_t endian_swap(uint32_t x) | ||||
| { | ||||
|     x = (x>>24) |  | ||||
|         ((x<<8) & 0x00FF0000) | | ||||
|         ((x>>8) & 0x0000FF00) | | ||||
|         (x<<24); | ||||
|     return x; | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| int main (void) | ||||
| { | ||||
|     DFHack::ContextManager DF("Memory.xml"); | ||||
|     DFHack::Context * C; | ||||
|     DFHack::Translation * Tran; | ||||
|     try | ||||
|     { | ||||
|         C = DF.getSingleContext(); | ||||
|     } | ||||
|     catch (exception& e) | ||||
|     { | ||||
|         cerr << e.what() << endl; | ||||
|         #ifndef LINUX_BUILD | ||||
|             cin.ignore(); | ||||
|         #endif | ||||
|         return 1; | ||||
|     } | ||||
| 
 | ||||
|     Tran = C->getTranslation(); | ||||
| 
 | ||||
|     if(!Tran->Start()) | ||||
|     { | ||||
|         cerr << "Could not get Names" << endl; | ||||
|         return 1; | ||||
|     } | ||||
|     DFHack::Dicts dicts = *(Tran->getDicts()); | ||||
|     DFHack::DFDict & englishWords = dicts.translations; | ||||
|     DFHack::DFDict & foreignWords = dicts.foreign_languages; | ||||
| 
 | ||||
|     C->Detach(); | ||||
|     string input; | ||||
| 
 | ||||
|     cout << "\nSelect Name to search or q to Quit" << endl; | ||||
|     getline (cin, input); | ||||
|     while(input != "q"){ | ||||
|         for( uint32_t i = 0; i < englishWords.size();i++){ | ||||
|             for( uint32_t j = 0;j < englishWords[i].size();j++){ | ||||
|                 if(englishWords[i][j] != ""){ | ||||
|                     uint32_t found = tolower(input).find(tolower(englishWords[i][j])); | ||||
|                     if(found != string::npos){ | ||||
|                         stringstream value; | ||||
|                         value << setfill('0') << setw(8) << hex << endian_swap(j); | ||||
|                         cout << englishWords[i][j] << " "  << groupBy2(value.str()) << endl; | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|         for( uint32_t i = 0; i < foreignWords.size();i++){ | ||||
|             for( uint32_t j = 0;j < foreignWords[i].size();j++){ | ||||
|                 uint32_t found = tolower(input).find(tolower(foreignWords[i][j])); | ||||
|                 if(found != string::npos){ | ||||
|                     stringstream value; | ||||
|                     value << setfill('0') << setw(8) << hex << endian_swap(j); | ||||
|                     cout << foreignWords[i][j] << " "  << groupBy2(value.str()) << endl; | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|         getline(cin,input); | ||||
|     } | ||||
|     #ifndef LINUX_BUILD | ||||
|         cout << "Done. Press any key to continue" << endl; | ||||
|         cin.ignore(); | ||||
|     #endif | ||||
|     return 0; | ||||
| } | ||||
											
												
													File diff suppressed because it is too large
													Load Diff
												
											
										
									
								| @ -1,219 +0,0 @@ | ||||
| /*
 | ||||
|  * Author: Silas Dunsmore aka 0x517A5D                          vim:ts=4:sw=4 | ||||
|  * | ||||
|  * Released under the MIT X11 license; feel free to use some or all of this | ||||
|  * code, as long as you include the copyright and license statement (below) | ||||
|  * in all copies of the source code.  In fact, I truly encourage reuse. | ||||
|  * | ||||
|  * If you do use large portions of this code, I suggest but do not require | ||||
|  * that you keep this code in a seperate file (such as this hexsearch.h file) | ||||
|  * so that it is clear that the terms of the license do not also apply to | ||||
|  * your code. | ||||
|  * | ||||
|  * Should you make fundamental changes, or bugfixes, to this code, I would | ||||
|  * appreciate it if you would give me a copy of your changes. | ||||
|  * | ||||
|  * | ||||
|  * Copyright (C) 2007-2008 Silas Dunsmore | ||||
|  * | ||||
|  * Permission is hereby granted, free of charge, to any person | ||||
|  * obtaining a copy of this software and associated documentation | ||||
|  * files (the "Software"), to deal in the Software without | ||||
|  * restriction, including without limitation the rights to use, | ||||
|  * copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||
|  * copies of the Software, and to permit persons to whom the | ||||
|  * Software is furnished to do so, subject to the following | ||||
|  * conditions: | ||||
|  *  | ||||
|  * The above copyright notice and this permission notice shall be | ||||
|  * included in all copies or substantial portions of the Software. | ||||
|  *  | ||||
|  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, | ||||
|  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES | ||||
|  * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND | ||||
|  * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT | ||||
|  * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, | ||||
|  * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING | ||||
|  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR | ||||
|  * OTHER DEALINGS IN THE SOFTWARE. | ||||
|  * | ||||
|  * See also:    http://www.opensource.org/licenses/mit-license.php
 | ||||
|  * and          http://en.wikipedia.org/wiki/MIT_License
 | ||||
|  */ | ||||
| 
 | ||||
| 
 | ||||
| #ifndef HEXSEARCH_H | ||||
| #define HEXSEARCH_H | ||||
| #ifdef __cplusplus | ||||
| extern "C" | ||||
| { | ||||
| #endif | ||||
| 
 | ||||
| 
 | ||||
| extern DWORD df_memory_base, df_memory_start, df_memory_end; | ||||
| extern HANDLE df_h_process, df_h_thread; | ||||
| extern DWORD df_pid, df_main_win_tid; | ||||
| 
 | ||||
| extern DWORD here[16]; | ||||
| extern DWORD target[16]; | ||||
| 
 | ||||
| // ============================================================================
 | ||||
| // export these in case you need to work with them directly.
 | ||||
| //extern HANDLE df_h_process, df_h_thread;
 | ||||
| //extern DWORD df_pid, df_main_win_tid;
 | ||||
| extern char *errormessage; | ||||
| 
 | ||||
| 
 | ||||
| // ============================================================================
 | ||||
| // send info to KERNEL32:OutputDebugString(), useful for non-console programs.
 | ||||
| // (you can watch this with SysInternals' DebugView.)
 | ||||
| // http://www.microsoft.com/technet/sysinternals/Miscellaneous/DebugView.mspx
 | ||||
| void d_printf(const char *format, ...); | ||||
| // it turned out that dprintf() is semi-standard to printf to a file descriptor.
 | ||||
| 
 | ||||
| 
 | ||||
| // ============================================================================
 | ||||
| // encapsulate the housekeeping.
 | ||||
| BOOL open_dwarf_fortress(void); | ||||
| void close_dwarf_fortress(void);        // is not (normally) necessary because
 | ||||
|                                         // it is done at exit time.
 | ||||
| 
 | ||||
| 
 | ||||
| // ============================================================================
 | ||||
| // memory reads and writes (peeks and pokes, in old BASIC terminology)
 | ||||
| BOOL isvalidaddress(DWORD ea); | ||||
| BOOL peekarb(DWORD ea, OUT void *data, DWORD len); | ||||
| BYTE peekb(DWORD ea); | ||||
| WORD peekw(DWORD ea); | ||||
| DWORD peekd(DWORD ea); | ||||
| char *peekstr(DWORD ea, OUT char *data, DWORD maxlen); | ||||
| char *peekustr(DWORD ea, OUT char *data, DWORD maxlen); | ||||
| BOOL pokearb(DWORD ea, const void *data, DWORD len); | ||||
| BOOL pokeb(DWORD ea, BYTE data); | ||||
| BOOL pokew(DWORD ea, WORD data); | ||||
| BOOL poked(DWORD ea, DWORD data); | ||||
| BOOL pokestr(DWORD ea, const BYTE *data); | ||||
| 
 | ||||
| 
 | ||||
| // ============================================================================
 | ||||
| // The name has changed because the API HAS CHANGED!
 | ||||
| //
 | ||||
| // Now instead of returning HERE, it always returns the start of the match.
 | ||||
| //
 | ||||
| // However, there is an array, here[], that is filled with the locations of
 | ||||
| //      the HERE tokens.
 | ||||
| //      (Starting at 1.  here[0] is a copy of the start of the match.)
 | ||||
| //
 | ||||
| // The here[] array, starting at 1, is filled with the locations of the
 | ||||
| //      HERE token.
 | ||||
| // here[0] is a copy of the start of the match.
 | ||||
| //
 | ||||
| // Also, the target[] array, starting at 1, is filled with the target
 | ||||
| //      addresses of all CALL, JMP, JZ, JNZ, and JCC tokens.
 | ||||
| //
 | ||||
| // Finally, you no longer pass it a search length.  Instead, each set of
 | ||||
| //      search terms must end with an EOL.
 | ||||
| //
 | ||||
| //
 | ||||
| //
 | ||||
| // Okay, I admit this one is complicated.  Treat it as a black box.
 | ||||
| //
 | ||||
| // Search Dwarf Fortress's code and initialized data segments for a pattern.
 | ||||
| //      (Does not search stack, heap, or thread-local memory.)
 | ||||
| //
 | ||||
| // Parameters: any number of search tokens, all unsigned ints.
 | ||||
| //      The last token must be EOL.
 | ||||
| //
 | ||||
| //          0x00 - 0xFF: Match this byte.
 | ||||
| //          EOL: End-of-list.  The match succeeds when this token is reached.
 | ||||
| //          ANYBYTE: Match any byte.
 | ||||
| //          DWORD_: Followed by a dword.  Exact-match the dword.
 | ||||
| //              Equivalent to 4 match-this-byte tokens.
 | ||||
| //          ANYDWORD: Match any dword.  Equivalant to 4 ANYBYTEs.
 | ||||
| //          HERE: Put the current address into the here[] array.
 | ||||
| //          SKIP_UP_TO, nn: Allow up to nn bytes between the previous match
 | ||||
| //              and the next match.  The next token must be a match-this-byte
 | ||||
| //              token.  There is sweet, sweet backtracking.
 | ||||
| //          EITHER: Accept either of the next two tokens as a match.
 | ||||
| //              Both must be match-this-byte tokens.
 | ||||
| //          RANGE_LO, nn: Set low byte for a range comparison.  DEPRECATED.
 | ||||
| //          RANGE_HI, nn: Set high byte for a range comparison, and do the
 | ||||
| //          comparison.  Should immediately follow a RANGE_LO.  DEPRECATED.
 | ||||
| //          BYTERANGE, nn, mm: followed by two bytes, the low and high limits
 | ||||
| //          of the range.  This is the new way to do ranges.
 | ||||
| //          DWORDRANGE, nnnnnnnn, mmmmmmmm: works like BYTERANGE.
 | ||||
| //          ADDRESS: Accept any legal address in the program's text.
 | ||||
| //              DOES NOT accept pointers into heap space and such.
 | ||||
| //          CALL: Match a near call instruction to a reasonable address.
 | ||||
| //          JUMP: Match a short or near unconditional jump to a reasonable
 | ||||
| //              address.
 | ||||
| //          JZ: Match a short or long jz (jump if zero) instruction.
 | ||||
| //          JNZ: Match a short or long jnz (jump if not zero) instruction.
 | ||||
| //          JCC: Match any short or long conditional jump instruction.
 | ||||
| //          More tokens can easily be added.
 | ||||
| //
 | ||||
| // Returns the offset in Dwarf Fortress of the first match of the pattern.
 | ||||
| //      Also sets global variables here[] and target[].
 | ||||
| //
 | ||||
| // Note: starting a pattern with ANYBYTE, ANYDWORD, SKIP_UP_TO, or EOL
 | ||||
| //          is explicitly illegal.
 | ||||
| //
 | ||||
| #define EOL         0x100 | ||||
| #define ANYBYTE     0x101 | ||||
| //#define FF_OR_00  0x102               // deprecated
 | ||||
| #define HERE        0x103 | ||||
| #define EITHER      0x104 | ||||
| #define SKIP_UP_TO  0x105 | ||||
| #define RANGE_LO    0x106               // deprecated
 | ||||
| #define RANGE_HI    0x107               // deprecated
 | ||||
| #define DWORD_      0x108 | ||||
| #define ANYDWORD    0x109 | ||||
| #define ADDRESS     0x10A | ||||
| #define BYTERANGE   0x10B | ||||
| #define DWORDRANGE  0x10C | ||||
| #define JZ          0x174 | ||||
| #define JNZ         0x175 | ||||
| #define JCC         0x170 | ||||
| #define CALL        0x1E8 | ||||
| #define JUMP        0x1E9 | ||||
| 
 | ||||
| 
 | ||||
| DWORD hexsearch2(DWORD token1, ...); | ||||
| 
 | ||||
| // You can use this to limit the search to a particular part of memory.
 | ||||
| // Use 0 for start to search from the very start of Dwarf Fortress.
 | ||||
| // Use 0 for end to stop searching at the very end of Dwarf Fortress.
 | ||||
| void set_hexsearch2_limits(DWORD start, DWORD end); | ||||
| 
 | ||||
| 
 | ||||
| // ============================================================================
 | ||||
| // patch2() and verify2() support a modified subset of hex_search2() tokens:
 | ||||
| //  The names changed because the API HAS CHANGED!
 | ||||
| //
 | ||||
| //          0x00 - 0xFF: pokes the byte.
 | ||||
| //          EOL: End-of-list.  Allows you to specify count as 10000 or so 
 | ||||
| //              and terminate (with success) when this token is reached.
 | ||||
| //          DWORD_: Followed by a DWORD.  Pokes the DWORD.
 | ||||
| //          CALL: given an _address_; pokes near call with the proper _delta_.
 | ||||
| //          JUMP: given an _address_; pokes near jump with the proper _delta_.
 | ||||
| //          JZ: given an _address_; assembles a near (not short) jz & delta.
 | ||||
| //          JNZ: given an _address_; assembles a near jnz & delta.
 | ||||
| //
 | ||||
| //  Particularly note that, unlike hex_search(), CALL, JUMP, JZ, and JNZ
 | ||||
| //      are followed by a dword-sized target address.
 | ||||
| //
 | ||||
| //  Note that patch2() does its own verify(), so you don't have to.
 | ||||
| 
 | ||||
| // TODO: is verify() useful enough to maintain?
 | ||||
| 
 | ||||
| // Make an offset in Dwarf Fortress have certain bytes.
 | ||||
| BOOL patch2(DWORD offset, ...); | ||||
| // Check that an offset in Dwarf Fortress has certain bytes.
 | ||||
| BOOL verify2(DWORD offset, ...); | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| #ifdef __cplusplus | ||||
| } | ||||
| #endif | ||||
| #endif // HEXSEARCH_H
 | ||||
| @ -1,5 +0,0 @@ | ||||
| 
 | ||||
| int main (int numargs, const char ** args) | ||||
| { | ||||
|     return 0; | ||||
| } | ||||
| @ -1,119 +0,0 @@ | ||||
| #include <iostream> | ||||
| #include <climits> | ||||
| #include <vector> | ||||
| #include <stdio.h> | ||||
| using namespace std; | ||||
| #include <DFHack.h> | ||||
| 
 | ||||
| DFHack::Materials * Materials; | ||||
| DFHack::VersionInfo *mem; | ||||
| vector< vector<string> > englishWords; | ||||
| vector< vector<string> > foreignWords; | ||||
| 
 | ||||
| int main (int numargs, char ** args) | ||||
| { | ||||
|     DFHack::ContextManager DFMgr("Memory.xml"); | ||||
|     DFHack::Context *DF = DFMgr.getSingleContext(); | ||||
|     DFHack::Process * p; | ||||
|     try | ||||
|     { | ||||
|         DF->Attach(); | ||||
|     } | ||||
|     catch (exception& e) | ||||
|     { | ||||
|         cerr << e.what() << endl; | ||||
|         #ifndef LINUX_BUILD | ||||
|             cin.ignore(); | ||||
|         #endif | ||||
|         return 1; | ||||
|     } | ||||
|     p = DF->getProcess(); | ||||
|     string check = ""; | ||||
|     if(numargs == 2) | ||||
|         check = args[1]; | ||||
| 
 | ||||
|     DFHack::Creatures * Creatures = DF->getCreatures(); | ||||
|     Materials = DF->getMaterials(); | ||||
|     DFHack::Translation * Tran = DF->getTranslation(); | ||||
| 
 | ||||
|     uint32_t numCreatures; | ||||
|     if(!Creatures->Start(numCreatures)) | ||||
|     { | ||||
|         cerr << "Can't get creatures" << endl; | ||||
|         #ifndef LINUX_BUILD | ||||
|             cin.ignore(); | ||||
|         #endif | ||||
|         return 1; | ||||
|     } | ||||
|     if(!numCreatures) | ||||
|     { | ||||
|         cerr << "No creatures to print" << endl; | ||||
|         #ifndef LINUX_BUILD | ||||
|             cin.ignore(); | ||||
|         #endif | ||||
|         return 1; | ||||
|     } | ||||
|     mem = DF->getMemoryInfo(); | ||||
| 
 | ||||
|     if(!Materials->ReadInorganicMaterials()) | ||||
|     { | ||||
|         cerr << "Can't get the inorganics types." << endl; | ||||
|         return 1; | ||||
|     } | ||||
|     if(!Materials->ReadCreatureTypesEx()) | ||||
|     { | ||||
|         cerr << "Can't get the creature types." << endl; | ||||
|         return 1;  | ||||
|     } | ||||
|     if(!Tran->Start()) | ||||
|     { | ||||
|         cerr << "Can't get name tables" << endl; | ||||
|         return 1; | ||||
|     } | ||||
|     vector<uint32_t> addrs; | ||||
|     //DF.InitViewAndCursor();
 | ||||
|     for(uint32_t i = 0; i < numCreatures; i++) | ||||
|     { | ||||
|         DFHack::t_creature temp; | ||||
|         unsigned int current_job; | ||||
|         unsigned int mat_start; | ||||
|         unsigned int mat_end; | ||||
|         unsigned int j,k; | ||||
|         unsigned int matptr; | ||||
| 
 | ||||
|         Creatures->ReadCreature(i,temp); | ||||
|         if(temp.mood>=0) | ||||
|         { | ||||
|             current_job = p->readDWord(temp.origin + 0x390); | ||||
|             if(current_job == 0) | ||||
|                 continue; | ||||
|             mat_start = p->readDWord(current_job + 0xa4 + 4*3); | ||||
|             mat_end = p->readDWord(current_job + 0xa4 + 4*4); | ||||
|             for(j=mat_start;j<mat_end;j+=4) | ||||
|             { | ||||
|                 matptr = p->readDWord(j); | ||||
|                 for(k=0;k<4;k++) | ||||
|                     printf("%.4X ", p->readWord(matptr + k*2)); | ||||
|                 for(k=0;k<3;k++) | ||||
|                     printf("%.8X ", p->readDWord(matptr + k*4 + 0x8)); | ||||
|                 for(k=0;k<2;k++) | ||||
|                     printf("%.4X ", p->readWord(matptr + k*2 + 0x14)); | ||||
|                 for(k=0;k<3;k++) | ||||
|                     printf("%.8X ", p->readDWord(matptr + k*4 + 0x18)); | ||||
|                 for(k=0;k<4;k++) | ||||
|                     printf("%.2X ", p->readByte(matptr + k + 0x24)); | ||||
|                 for(k=0;k<6;k++) | ||||
|                     printf("%.8X ", p->readDWord(matptr + k*4 + 0x28)); | ||||
|                 for(k=0;k<4;k++) | ||||
|                     printf("%.2X ", p->readByte(matptr + k + 0x40)); | ||||
|                 for(k=0;k<9;k++) | ||||
|                     printf("%.8X ", p->readDWord(matptr + k*4 + 0x44)); | ||||
|                 printf(" [%p]\n", matptr); | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|     Creatures->Finish(); | ||||
|     DF->Detach(); | ||||
|     return 0; | ||||
| } | ||||
| 
 | ||||
| @ -1,31 +0,0 @@ | ||||
| #include <iostream> | ||||
| using namespace std; | ||||
| 
 | ||||
| #include <DFHack.h> | ||||
| using namespace DFHack; | ||||
| 
 | ||||
| int main () | ||||
| { | ||||
|     DFHack::ContextManager DFMgr("Memory.xml"); | ||||
|     DFHack::Context *DF = DFMgr.getSingleContext(); | ||||
|     try | ||||
|     { | ||||
|         DF->Attach(); | ||||
|     } | ||||
|     catch (exception& e) | ||||
|     { | ||||
|         cerr << e.what() << endl; | ||||
|         #ifndef LINUX_BUILD | ||||
|             cin.ignore(); | ||||
|         #endif | ||||
|         return 1; | ||||
|     } | ||||
|     DFHack::Process * Process = DF->getProcess(); | ||||
|     DFHack::Gui * gui = DF->getGui(); | ||||
|     cout << Process->getPath() << endl; | ||||
|     #ifndef LINUX_BUILD | ||||
|         cout << "Done. Press any key to continue" << endl; | ||||
|         cin.ignore(); | ||||
|     #endif | ||||
|     return 0; | ||||
| } | ||||
| @ -1,27 +0,0 @@ | ||||
| #include <iostream> | ||||
| #include <iomanip> | ||||
| #include <climits> | ||||
| #include <vector> | ||||
| #include <sstream> | ||||
| #include <ctime> | ||||
| #include <cstdio> | ||||
| using namespace std; | ||||
| std::string teststr1; | ||||
|     std::string * teststr2; | ||||
|     std::string teststr3("test"); | ||||
| int main (int numargs, const char ** args) | ||||
| { | ||||
|     printf("std::string E : 0x%x\n", &teststr1); | ||||
|     teststr1 = "This is a fairly long string, much longer than the one made by default constructor."; | ||||
|     cin.ignore(); | ||||
|     printf("std::string L : 0x%x\n", &teststr1); | ||||
|     teststr1 = "This one is shorter"; | ||||
|     cin.ignore(); | ||||
|     printf("std::string S : 0x%x\n", &teststr1); | ||||
|     cin.ignore(); | ||||
|     teststr2 = new string(); | ||||
|     printf("std::string * : 0x%x\n", &teststr2); | ||||
|     printf("std::string(\"test\") : 0x%x\n", &teststr3); | ||||
|     cin.ignore(); | ||||
|     return 0; | ||||
| } | ||||
| @ -1,100 +0,0 @@ | ||||
| // Prints all the Tile Types known by DFHack.
 | ||||
| // File is both fixed-field and CSV parsable.
 | ||||
| 
 | ||||
| #include <stdio.h> | ||||
| #include <string.h> | ||||
| #include <iostream> | ||||
| #include <vector> | ||||
| #include <map> | ||||
| #include <stddef.h> | ||||
| #include <assert.h> | ||||
| using namespace std; | ||||
| 
 | ||||
| #include <DFHack.h> | ||||
| #include <DFTileTypes.h> | ||||
| 
 | ||||
| using namespace DFHack; | ||||
| 
 | ||||
| int main (int argc, char **argv) | ||||
| { | ||||
|     FILE *f=stdout; | ||||
|     const int Columns = 7; | ||||
|     const char * Headings[Columns] = {"TileTypeID","Class","Material","V","Special","Direction","Description"}; | ||||
|     size_t Size[ Columns ] = {}; | ||||
|     int i; | ||||
| 
 | ||||
|     //First, figure out column widths.
 | ||||
|     for(i=0;i<Columns;++i) | ||||
|     { | ||||
|         Size[i]=strlen(Headings[i])+1; | ||||
|     } | ||||
| 
 | ||||
|     //Classes
 | ||||
|     fprintf(f,"\nTile Type Classes:\n"); | ||||
|     for(i=0;i<tileshape_count;++i) | ||||
|     { | ||||
|         Size[1]=max<size_t>(Size[1],strlen(TileShapeString[i])); | ||||
|         fprintf(f,"%4i ; %s\n", i, TileShapeString[i] ,0 ); | ||||
|     } | ||||
| 
 | ||||
|     //Materials
 | ||||
|     fprintf(f,"\nTile Type Materials:\n"); | ||||
|     for(i=0;i<tilematerial_count;++i) | ||||
|     { | ||||
|         Size[2]=max<size_t>(Size[2],strlen(TileMaterialString[i])); | ||||
|         fprintf(f,"%4i ; %s\n", i, TileMaterialString[i] ,0 ); | ||||
|     } | ||||
| 
 | ||||
|     //Specials
 | ||||
|     fprintf(f,"\nTile Type Specials:\n"); | ||||
|     for(i=0;i<tilespecial_count;++i) | ||||
|     { | ||||
|         Size[4]=max<size_t>(Size[4],strlen(TileSpecialString[i])); | ||||
|         fprintf(f,"%4i ; %s\n", i, TileSpecialString[i] ,0 ); | ||||
|     } | ||||
| 
 | ||||
|     /* - Not needed for now -
 | ||||
|     //Direction is tricky
 | ||||
|     for(i=0;i<TILE_TYPE_ARRAY_LENGTH;++i) | ||||
|         Size[5]=max(Size[5], tileTypeTable[i].d.sum()+1 ); | ||||
|     */ | ||||
| 
 | ||||
|     //Print the headings first.
 | ||||
|     fprintf(f,"\nTile Types:\n"); | ||||
|     for(i=0;i<Columns;++i) | ||||
|     { | ||||
|         if(i) putc(';',f); | ||||
|         fprintf(f," %-*s ",Size[i],Headings[i],0); | ||||
|     } | ||||
|     fprintf(f,"\n"); | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
|     //Process the whole array.
 | ||||
|     //A macro should be used for making the strings safe, but they are left in naked ? blocks 
 | ||||
|     //to illustrate the array references more clearly.
 | ||||
|     for(i=0;i<TILE_TYPE_ARRAY_LENGTH;++i) | ||||
|     { | ||||
|         fprintf(f," %*i ; %-*s ; %-*s ; %*c ; %-*s ; %-*s ; %s\n", | ||||
|             Size[0], i, | ||||
|             Size[1], ( tileTypeTable[i].name ? TileShapeString[ tileTypeTable[i].shape ]    : "" ), | ||||
|             Size[2], ( tileTypeTable[i].name ? TileMaterialString[ tileTypeTable[i].material ] : "" ), | ||||
|             Size[3], ( tileTypeTable[i].variant ? '0'+tileTypeTable[i].variant : ' ' ), | ||||
|             Size[4], ( tileTypeTable[i].special ? TileSpecialString[ tileTypeTable[i].special ]  : "" ), | ||||
|             Size[5], ( tileTypeTable[i].direction.whole ? tileTypeTable[i].direction.getStr()        : "" ), | ||||
|             ( tileTypeTable[i].name ? tileTypeTable[i].name : "" ), | ||||
|             0 | ||||
|             ); | ||||
|     } | ||||
|     fprintf(f,"\n"); | ||||
| 
 | ||||
| 
 | ||||
|     #ifndef LINUX_BUILD | ||||
|     if( 1== argc) | ||||
|     { | ||||
|         cout << "Done. Press any key to continue" << endl; | ||||
|         cin.ignore(); | ||||
|     } | ||||
|     #endif | ||||
|     return 0; | ||||
| } | ||||
| @ -1,470 +0,0 @@ | ||||
| // Creature dump
 | ||||
| 
 | ||||
| #include <iostream> | ||||
| #include <sstream> | ||||
| #include <climits> | ||||
| #include <vector> | ||||
| using namespace std; | ||||
| 
 | ||||
| #define DFHACK_WANT_MISCUTILS | ||||
| #include <DFHack.h> | ||||
| #include <modules/Materials.h> | ||||
| #include <modules/Units.h> | ||||
| #include <modules/Translation.h> | ||||
| 
 | ||||
| vector< vector<string> > englishWords; | ||||
| vector< vector<string> > foreignWords; | ||||
| uint32_t numCreatures; | ||||
| vector<DFHack::t_matgloss> creaturestypes; | ||||
| 
 | ||||
| void printDwarves(DFHack::ContextManager & DF) | ||||
| { | ||||
|     int dwarfCounter = 0; | ||||
|     DFHack::Creatures * c = DF.getCreatures(); | ||||
|     for (uint32_t i = 0; i < numCreatures; i++) | ||||
|     { | ||||
|         DFHack::t_creature temp; | ||||
|         c->ReadCreature(i, temp); | ||||
|         string type = creaturestypes[temp.type].id; | ||||
|         if (type == "DWARF" && !temp.flags1.bits.dead && !temp.flags2.bits.killed) | ||||
|         { | ||||
|             cout << i << ":"; | ||||
|             if (temp.name.nickname[0]) | ||||
|             { | ||||
|                 cout << temp.name.nickname; | ||||
|             } | ||||
|             else | ||||
|             { | ||||
|                 cout << temp.name.first_name; | ||||
|             } | ||||
|             string transName = DF.TranslateName(temp.name,englishWords,foreignWords, false); | ||||
|             cout << " " << temp.custom_profession; //transName;
 | ||||
|             if (dwarfCounter%3 != 2) | ||||
|             { | ||||
|                 cout << '\t'; | ||||
|             } | ||||
|             else | ||||
|             { | ||||
|                 cout << endl; | ||||
|             } | ||||
|             dwarfCounter++; | ||||
|         } | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| bool getDwarfSelection(DFHack::ContextManager & DF, DFHack::t_creature & toChange,string & changeString, string & commandString,int & eraseAmount,int &dwarfNum,bool &isName) | ||||
| { | ||||
|     static string lastText; | ||||
|     bool dwarfSuccess = false; | ||||
| 
 | ||||
|     while (!dwarfSuccess) | ||||
|     { | ||||
|         string input; | ||||
|         cout << "\nSelect Dwarf to Change or q to Quit" << endl; | ||||
|         DF.Resume(); | ||||
|         getline (cin, input); | ||||
|         DF.Suspend(); | ||||
|         if (input == "q") | ||||
|         { | ||||
|             return false; | ||||
|         } | ||||
|         else if (input == "r") | ||||
|         { | ||||
|             printDwarves(DF); | ||||
|         } | ||||
|         else if (!input.empty()) | ||||
|         { | ||||
|             int num; | ||||
|             stringstream(input) >> num;//= atol(input.c_str());
 | ||||
|             dwarfSuccess = DF.ReadCreature(num,toChange); | ||||
|             string type = creaturestypes[toChange.type].id; | ||||
|             if (type != "DWARF") | ||||
|             { | ||||
|                 dwarfSuccess = false; | ||||
|             } | ||||
|             else | ||||
|             { | ||||
|                 dwarfNum = num; | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|     bool changeType = false; | ||||
|     while (!changeType) | ||||
|     { | ||||
|         string input; | ||||
|         cout << "\n(n)ickname or (p)rofession?" << endl; | ||||
|         getline(cin, input); | ||||
|         if (input == "q") | ||||
|         { | ||||
|             return false; | ||||
|         } | ||||
|         if (input == "n") | ||||
|         { | ||||
|             commandString = "pzyn"; | ||||
|             eraseAmount = string(toChange.name.nickname).length(); | ||||
|             changeType = true; | ||||
|             isName = true; | ||||
|         } | ||||
|         else if (input == "p") | ||||
|         { | ||||
|             commandString = "pzyp"; | ||||
|             eraseAmount = string(toChange.custom_profession).length(); | ||||
|             changeType = true; | ||||
|             isName = false; | ||||
|         } | ||||
|     } | ||||
|     bool changeValue = false; | ||||
|     while (!changeValue) | ||||
|     { | ||||
|         string input; | ||||
|         cout << "value to change to?" << endl; | ||||
|         getline(cin, input); | ||||
|         if (input == "q") | ||||
|         { | ||||
|             return false; | ||||
|         } | ||||
|         if (!lastText.empty() && input.empty()) | ||||
|         { | ||||
|             changeValue = true; | ||||
|         } | ||||
|         else if ( !input.empty()) | ||||
|         { | ||||
|             lastText = input; | ||||
|             changeValue = true; | ||||
|         } | ||||
|     } | ||||
|     changeString = lastText; | ||||
|     return true; | ||||
| } | ||||
| 
 | ||||
| bool waitTillChanged(DFHack::ContextManager &DF, int creatureToCheck, string changeValue, bool isName) | ||||
| { | ||||
|     DFHack::DFWindow * w = DF.getWindow(); | ||||
|     DF.Suspend(); | ||||
|     DFHack::t_creature testCre; | ||||
|     DF.ReadCreature(creatureToCheck,testCre); | ||||
|     int tryCount = 0; | ||||
|     if (isName) | ||||
|     { | ||||
|         while (testCre.name.nickname != changeValue && tryCount <50) | ||||
|         { | ||||
|             DF.Resume(); | ||||
|             w->TypeSpecial(DFHack::WAIT,1,100); | ||||
|             DF.Suspend(); | ||||
|             DF.ReadCreature(creatureToCheck,testCre); | ||||
|             tryCount++; | ||||
|         } | ||||
|     } | ||||
|     else | ||||
|     { | ||||
|         while (testCre.custom_profession != changeValue && tryCount < 50) | ||||
|         { | ||||
|             DF.Resume(); | ||||
|             w->TypeSpecial(DFHack::WAIT,1,100); | ||||
|             DF.Suspend(); | ||||
|             DF.ReadCreature(creatureToCheck,testCre); | ||||
|             tryCount++; | ||||
|         } | ||||
|     } | ||||
|     if (tryCount >= 50) | ||||
|     { | ||||
|         cerr << "Something went wrong, make sure that DF is at the correct screen"; | ||||
|         return false; | ||||
|     } | ||||
|     DF.Resume(); | ||||
|     return true; | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| bool waitTillScreenState(DFHack::ContextManager &DF, string screenState,bool EqualTo=true) | ||||
| { | ||||
|     DFHack::DFWindow * w = DF.getWindow(); | ||||
|     DFHack::t_viewscreen current; | ||||
|     DF.Suspend(); | ||||
|     DF.ReadViewScreen(current); | ||||
|     string nowScreenState; | ||||
|     DF.getMemoryInfo()->resolveClassIDToClassname(current.type,nowScreenState); | ||||
|     int tryCount = 0; | ||||
|     while (((EqualTo && nowScreenState != screenState) || (!EqualTo && nowScreenState == screenState)) && tryCount < 50) | ||||
|     { | ||||
|         DF.Resume(); | ||||
|         w->TypeSpecial(DFHack::WAIT,1,100); | ||||
|         DF.Suspend(); | ||||
|         DF.ReadViewScreen(current); | ||||
|         tryCount++; | ||||
|     } | ||||
|     if (tryCount >= 50) { | ||||
|         cerr << "Something went wrong, DF at " << nowScreenState << endl; | ||||
|         return false; | ||||
|     } | ||||
|     DF.Resume(); | ||||
|     return true; | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| bool waitTillCursorState(DFHack::ContextManager &DF, bool On) | ||||
| { | ||||
|     DFHack::DFWindow * w = DF.getWindow(); | ||||
|     int32_t x,y,z; | ||||
|     int tryCount = 0; | ||||
|     DF.Suspend(); | ||||
|     bool cursorResult = DF.getCursorCoords(x,y,z); | ||||
|     while (tryCount < 50 && On && !cursorResult || !On && cursorResult) | ||||
|     { | ||||
|         DF.Resume(); | ||||
|         w->TypeSpecial(DFHack::WAIT,1,100); | ||||
|         tryCount++; | ||||
|         DF.Suspend(); | ||||
|         cursorResult = DF.getCursorCoords(x,y,z); | ||||
|     } | ||||
|     if (tryCount >= 50) | ||||
|     { | ||||
|         cerr << "Something went wrong, cursor at x: " << x << " y: " << y << " z: " << z << endl; | ||||
|         return false; | ||||
|     } | ||||
|     DF.Resume(); | ||||
|     return true; | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| bool waitTillMenuState(DFHack::ContextManager &DF, uint32_t menuState,bool EqualTo=true) | ||||
| { | ||||
|     int tryCount = 0; | ||||
|     DFHack::DFWindow * w = DF.getWindow(); | ||||
|     DF.Suspend(); | ||||
|     uint32_t testState = DF.ReadMenuState(); | ||||
|     while (tryCount < 50 && ((EqualTo && menuState != testState) || (!EqualTo && menuState == testState))) | ||||
|     { | ||||
|         DF.Resume(); | ||||
|         w->TypeSpecial(DFHack::WAIT,1,100); | ||||
|         tryCount++; | ||||
|         DF.Suspend(); | ||||
|         testState = DF.ReadMenuState(); | ||||
|     } | ||||
|     if (tryCount >= 50) | ||||
|     { | ||||
|         cerr << "Something went wrong, menuState: "<<testState << endl; | ||||
|         return false; | ||||
|     } | ||||
|     DF.Resume(); | ||||
|     return true; | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| bool moveToBaseWindow(DFHack::ContextManager &DF) | ||||
| { | ||||
|     DFHack::DFWindow * w = DF.getWindow(); | ||||
|     DFHack::t_viewscreen current; | ||||
|     DF.ReadViewScreen(current); | ||||
|     string classname; | ||||
|     DF.getMemoryInfo()->resolveClassIDToClassname(current.type,classname); | ||||
|     while (classname != "viewscreen_dwarfmode") | ||||
|     { | ||||
|         w->TypeSpecial(DFHack::F9); // cancel out of text input in names
 | ||||
| //        DF.TypeSpecial(DFHack::ENTER); // cancel out of text input in hotkeys
 | ||||
|         w->TypeSpecial(DFHack::SPACE); // should move up a level
 | ||||
|         if (!waitTillScreenState(DF,classname,false)) return false; // wait until screen changes from current
 | ||||
|         DF.ReadViewScreen(current); | ||||
|         DF.getMemoryInfo()->resolveClassIDToClassname(current.type,classname); | ||||
|     } | ||||
|     if (DF.ReadMenuState() != 0) {// if menu state != 0 then there is a menu, so escape it
 | ||||
|         w->TypeSpecial(DFHack::F9); | ||||
|         w->TypeSpecial(DFHack::ENTER); // exit out of any text prompts
 | ||||
|         w->TypeSpecial(DFHack::SPACE); // go back to base state
 | ||||
|         if (!waitTillMenuState(DF,0))return false; | ||||
|     } | ||||
|     DF.Resume(); | ||||
|     return true; | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| bool setCursorToCreature(DFHack::ContextManager &DF) | ||||
| { | ||||
|     DFHack::DFWindow * w = DF.getWindow(); | ||||
|     int32_t x,y,z; | ||||
|     DF.Suspend(); | ||||
|     DF.getCursorCoords(x,y,z); | ||||
|     DF.Resume(); | ||||
|     if (x == -30000) { | ||||
|         w->TypeStr("v"); | ||||
|         if (!waitTillCursorState(DF,true)) return false; | ||||
|     } | ||||
|     else { // reset the cursor to be the creature cursor
 | ||||
|         w->TypeSpecial(DFHack::SPACE); | ||||
|         if (!waitTillCursorState(DF,false)) return false; | ||||
|         w->TypeStr("v"); | ||||
|         if (!waitTillCursorState(DF,true)) return false; | ||||
|     } | ||||
|     return true; | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| int main (void) | ||||
| { | ||||
|     DFHack::ContextManager DF("Memory.xml"); | ||||
|     DFHack::Creatures *c; | ||||
|     DFHack::Materials *m; | ||||
|     try | ||||
|     { | ||||
|         DF.Attach(); | ||||
|         c = DF.getCreatures(); | ||||
|          | ||||
|     } | ||||
|     catch (exception& e) | ||||
|     { | ||||
|         cerr << e.what() << endl; | ||||
|         #ifndef LINUX_BUILD | ||||
|             cin.ignore(); | ||||
|         #endif | ||||
|         return 1; | ||||
|     } | ||||
|      | ||||
|     DFHack::memory_info * mem = DF.getMemoryInfo(); | ||||
| 
 | ||||
|      | ||||
|     if (!m->ReadCreatureTypes(creaturestypes)) | ||||
|     { | ||||
|         cerr << "Can't get the creature types." << endl; | ||||
|         return 1; | ||||
|     } | ||||
| 
 | ||||
|     DF.InitReadNameTables(englishWords,foreignWords); | ||||
|     c->Start(numCreatures); | ||||
|     // DF.InitViewAndCursor();
 | ||||
|     DFHack::Process * p = DF.getProcess(); | ||||
|     DFHack::DFWindow * w = DF.getWindow(); | ||||
| 
 | ||||
|     DFHack::t_creature toChange; | ||||
|     string changeString,commandString; | ||||
|     int eraseAmount; | ||||
|     int toChangeNum; | ||||
|     bool isName; | ||||
|     bool useKeys = true; | ||||
|     string input2; | ||||
| 
 | ||||
|     // use key event emulation or direct writing?
 | ||||
|     cout << "\nUse \n1:Key simulation\n2:Direct Writing" << endl; | ||||
|     getline(cin,input2); | ||||
|     if (input2 == "1") | ||||
|     { | ||||
|         useKeys = true; | ||||
|     } | ||||
|     else { | ||||
|         useKeys = false; | ||||
|     } | ||||
|     printDwarves(DF); | ||||
| 
 | ||||
|     while (getDwarfSelection(DF,toChange,changeString,commandString,eraseAmount,toChangeNum,isName)) | ||||
|     { | ||||
|         // limit length, DF doesn't accept input after this point
 | ||||
|         if (changeString.size() > 39) | ||||
|         { | ||||
|             changeString.resize(39); | ||||
|         } | ||||
| start: | ||||
|         bool completed = false; | ||||
|         if (useKeys) { | ||||
|             if (moveToBaseWindow(DF) && setCursorToCreature(DF)) | ||||
|             { | ||||
|                 DF.Suspend(); | ||||
|                 DF.setCursorCoords(toChange.x, toChange.y,toChange.z); | ||||
|                 uint32_t underCursor; | ||||
|                 DF.getCurrentCursorCreature(underCursor); | ||||
|                 while (underCursor != toChangeNum) | ||||
|                 { | ||||
|                     DF.Resume(); | ||||
|                     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.
 | ||||
|                 //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
 | ||||
|                 if (underCursor[underCursor.size()-1] != toChange.origin) | ||||
|                 { | ||||
|                     for (int i = 0;i<underCursor.size()-1;i++) | ||||
|                     { | ||||
|                         DF.Resume(); | ||||
|                         w->TypeStr("v",100); | ||||
|                         if (underCursor[i] == toChange.origin) | ||||
|                         { | ||||
|                             break; | ||||
|                         } | ||||
|                     } | ||||
|                 }*/ | ||||
|                 DF.Resume(); | ||||
|                 w->TypeStr(commandString.c_str()); | ||||
|                 if (waitTillScreenState(DF,"viewscreen_customize_unit")) | ||||
|                 { | ||||
|                     DF.Resume(); | ||||
|                     w->TypeSpecial(DFHack::BACK_SPACE,eraseAmount); | ||||
|                     if (waitTillChanged(DF,toChangeNum,"",isName)) | ||||
|                     { | ||||
|                         DF.Resume(); | ||||
|                         w->TypeStr(changeString.c_str()); | ||||
|                         if (waitTillChanged(DF,toChangeNum,changeString,isName)) | ||||
|                         { | ||||
|                             DF.Resume(); | ||||
|                             w->TypeSpecial(DFHack::ENTER); | ||||
|                             w->TypeSpecial(DFHack::SPACE); // should take you to unit screen if everything worked
 | ||||
|                             if (waitTillScreenState(DF,"viewscreen_unit")) | ||||
|                             { | ||||
|                                 DF.Resume(); | ||||
|                                 w->TypeSpecial(DFHack::SPACE); | ||||
|                                 if (waitTillScreenState(DF,"viewscreen_dwarfmode")) | ||||
|                                 { | ||||
|                                     DF.Resume(); | ||||
|                                     w->TypeSpecial(DFHack::SPACE); | ||||
|                                     if (waitTillCursorState(DF,false)) | ||||
|                                     { | ||||
|                                         completed = true; | ||||
|                                     } | ||||
|                                 } | ||||
|                             } | ||||
|                         } | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
|             if (!completed) { | ||||
|                 cerr << "Something went wrong, please reset DF to its original state, then press any key to continue" << endl; | ||||
|                 goto start; | ||||
|             } | ||||
|         } | ||||
|         else | ||||
|         { | ||||
|             // will only work with the shm probably should check for it, but I don't know how,
 | ||||
|             // I have the writeString function do nothing for normal mode
 | ||||
|             if (commandString == "pzyn") // change nickname
 | ||||
|             { | ||||
|                 try | ||||
|                 { | ||||
|                     uint32_t nickname = mem->getOffset("creature_name") + mem->getOffset("name_nickname"); | ||||
|                     p->writeSTLString(toChange.origin+nickname,changeString); | ||||
|                 } | ||||
|                 catch (DFHack::Error::AllMemdef&) | ||||
|                 { | ||||
|                     cerr << "Writing creature nicknames unsupported in this version!" << endl; | ||||
|                 } | ||||
|             } | ||||
|             else | ||||
|             { | ||||
|                 try | ||||
|                 { | ||||
|                     uint32_t custom_prof = mem->getOffset("creature_custom_profession"); | ||||
|                     p->writeSTLString(toChange.origin+custom_prof,changeString); | ||||
|                 } | ||||
|                 catch (DFHack::Error::AllMemdef&) | ||||
|                 { | ||||
|                     cerr << "Writing creature custom profession unsupported in this version!" << endl; | ||||
|                 } | ||||
| 
 | ||||
|             } | ||||
|         } | ||||
|         DF.Suspend(); | ||||
|         printDwarves(DF); | ||||
|     } | ||||
|     return 0; | ||||
| } | ||||
| @ -1,58 +0,0 @@ | ||||
| #include <limits.h> | ||||
| #include <time.h> | ||||
| #include <stdio.h> | ||||
| 
 | ||||
| #include <DFHack_C.h> | ||||
| #include <dfhack-c/DFTypes_C.h> | ||||
| #include <dfhack-c/DFContext_C.h> | ||||
| #include <dfhack-c/modules/Maps_C.h> | ||||
| 
 | ||||
| int main (int numargs, const char ** args) | ||||
| { | ||||
|     printf("From C: "); | ||||
|     DFHackObject* cman = ContextManager_Alloc("Memory.xml"); | ||||
|     DFHackObject* context = ContextManager_getSingleContext(cman); | ||||
|     if(context) | ||||
|     { | ||||
|         Context_Attach(context); | ||||
|         DFHackObject * maps = Context_getMaps(context); | ||||
|         if(maps) | ||||
|         { | ||||
|             Maps_Start(maps); | ||||
|             uint32_t x,y,z; | ||||
|             Maps_getSize(maps, &x, &y, &z); | ||||
|             printf("Map size: %d, %d, %d\n", x,y,z); | ||||
|         } | ||||
|     } | ||||
|     ContextManager_Free(cman); | ||||
| 
 | ||||
|     cout << "From C++:"; | ||||
|     DFHack::ContextManager DFMgr("Memory.xml"); | ||||
|     DFHack::Context * DF; | ||||
|     try | ||||
|     { | ||||
|         DF = DFMgr.getSingleContext(); | ||||
|         DF->Attach(); | ||||
|     } | ||||
|     catch (exception& e) | ||||
|     { | ||||
|         cerr << e.what() << endl; | ||||
|         #ifndef LINUX_BUILD | ||||
|             cin.ignore(); | ||||
|         #endif | ||||
|         return 1; | ||||
|     } | ||||
|      | ||||
|     // DO STUFF HERE
 | ||||
|     Maps * m = DF->getMaps(); | ||||
|     m->Start(); | ||||
|     uint32_t x,y,z; | ||||
|     m->getSize(x,y,z); | ||||
|     cout << "Map size " << x << ", "<< y << ", " << z << endl; | ||||
|      | ||||
|     #ifndef LINUX_BUILD | ||||
|         cout << "Done. Press any key to continue" << endl; | ||||
|         cin.ignore(); | ||||
|     #endif | ||||
|     return 0; | ||||
| } | ||||
| @ -1,43 +0,0 @@ | ||||
| #include <iostream> | ||||
| #include <iomanip> | ||||
| #include <climits> | ||||
| #include <vector> | ||||
| #include <sstream> | ||||
| #include <ctime> | ||||
| #include <cstdio> | ||||
| using namespace std; | ||||
| 
 | ||||
| #include <DFHack.h> | ||||
| using namespace DFHack; | ||||
| 
 | ||||
| namespace TBlocks | ||||
| { | ||||
| 
 | ||||
| } | ||||
| 
 | ||||
| int main (int numargs, const char ** args) | ||||
| { | ||||
|     DFHack::ContextManager DFMgr("Memory.xml"); | ||||
|     DFHack::Context * DF; | ||||
|     try | ||||
|     { | ||||
|         DF = DFMgr.getSingleContext(); | ||||
|         DF->Attach(); | ||||
|     } | ||||
|     catch (exception& e) | ||||
|     { | ||||
|         cerr << e.what() << endl; | ||||
|         #ifndef LINUX_BUILD | ||||
|             cin.ignore(); | ||||
|         #endif | ||||
|         return 1; | ||||
|     } | ||||
|      | ||||
|     // DO STUFF HERE
 | ||||
|      | ||||
|     #ifndef LINUX_BUILD | ||||
|         cout << "Done. Press any key to continue" << endl; | ||||
|         cin.ignore(); | ||||
|     #endif | ||||
|     return 0; | ||||
| } | ||||
		Loading…
	
		Reference in New Issue