Remove obsolete files.
							parent
							
								
									024f23c227
								
							
						
					
					
						commit
						8559966de2
					
				| @ -1,90 +0,0 @@ | ||||
| // Attach test
 | ||||
| // attachtest - 1000x suspend/resume
 | ||||
| 
 | ||||
| #include <iostream> | ||||
| #include <climits> | ||||
| #include <vector> | ||||
| #include <ctime> | ||||
| using namespace std; | ||||
| #include <DFHack.h> | ||||
| #include <dfhack/extra/termutil.h> | ||||
| 
 | ||||
| int main (void) | ||||
| { | ||||
|     bool temporary_terminal = TemporaryTerminal(); | ||||
|     time_t start, end; | ||||
|     double time_diff; | ||||
|     DFHack::ContextManager DFMgr("Memory.xml"); | ||||
|     DFHack::Context* DF; | ||||
|     try | ||||
|     { | ||||
|         DF = DFMgr.getSingleContext(); | ||||
|         DF->Attach(); | ||||
|         DF->Detach(); | ||||
|     } | ||||
|     catch (exception& e) | ||||
|     { | ||||
|         cerr << e.what() << endl; | ||||
|         if(temporary_terminal) | ||||
|             cin.ignore(); | ||||
|         return 1; | ||||
|     } | ||||
| /*
 | ||||
|     // attach/detach test
 | ||||
|     cout << "Testing attach/detach"  << endl; | ||||
|     time(&start); | ||||
|     bool all_ok = true; | ||||
|     for (int i = 0; i < 100; i++) | ||||
|     { | ||||
|         cout << "Try " << i << endl; | ||||
|         if(DF.Attach()) | ||||
|         { | ||||
|             if(DF.Detach()) | ||||
|             { | ||||
|                 continue; | ||||
|             } | ||||
|             else | ||||
|             { | ||||
|                 cout << "cycle " << i << ", detach failed" << endl; | ||||
|                 all_ok = false; | ||||
|             } | ||||
|         } | ||||
|         else | ||||
|         { | ||||
|             cout << "cycle " << i << ", attach failed" << endl; | ||||
|             all_ok = false; | ||||
|         } | ||||
|         cout << endl; | ||||
|     } | ||||
|     if(!all_ok) | ||||
|     { | ||||
|         cerr << "failed to attach or detach in cycle! exiting" << endl; | ||||
|         return 1; | ||||
|     } | ||||
|     time(&end); | ||||
|      | ||||
|     time_diff = difftime(end, start); | ||||
|     cout << "attach tests done in " << time_diff << " seconds." << endl; | ||||
|     */ | ||||
|     cout << "Testing suspend/resume"  << endl; | ||||
|     DF->Attach(); | ||||
|     time(&start); | ||||
|     for (int i = 0; i < 1000; i++) | ||||
|     { | ||||
|         DF->Suspend(); | ||||
|         if(i%10 == 0) | ||||
|             cout << i / 10 << "%" << endl; | ||||
|         DF->Resume(); | ||||
|     } | ||||
|     time(&end); | ||||
|     DF->Detach(); | ||||
|     time_diff = difftime(end, start); | ||||
|     cout << "suspend tests done in " << time_diff << " seconds." << endl; | ||||
| 
 | ||||
|     if(temporary_terminal) | ||||
|     { | ||||
|         cout << "Done. Press any key to continue" << endl; | ||||
|         cin.ignore(); | ||||
|     } | ||||
|     return 0; | ||||
| } | ||||
| @ -1,784 +0,0 @@ | ||||
| // this is an incremental search tool. It only works on Linux.
 | ||||
| // here be dragons... and ugly code :P
 | ||||
| #include <iostream> | ||||
| #include <climits> | ||||
| #include <vector> | ||||
| #include <map> | ||||
| #include <set> | ||||
| #include <list> | ||||
| #include <ctime> | ||||
| #include <string.h> | ||||
| #include <stdio.h> | ||||
| #include <algorithm> | ||||
| using namespace std; | ||||
| 
 | ||||
| #ifndef LINUX_BUILD | ||||
|     #define WINVER 0x0500 | ||||
|     // this one prevents windows from infecting the global namespace with filth
 | ||||
|     #define NOMINMAX | ||||
|     #define WIN32_LEAN_AND_MEAN | ||||
|     #include <windows.h> | ||||
| #endif | ||||
| 
 | ||||
| #include <DFHack.h> | ||||
| #include "SegmentedFinder.h" | ||||
| class Token | ||||
| { | ||||
| public: | ||||
|     Token(uint64_t _offset) | ||||
|     { | ||||
|         offset = _offset; | ||||
|         offset_valid = 1; | ||||
|         value_valid = 0; | ||||
|         parent = 0; | ||||
|     } | ||||
|     Token(const std::string & offsetn) | ||||
|     { | ||||
|         full_offset_name = offsetn; | ||||
|         offset_valid = 0; | ||||
|         value_valid = 0; | ||||
|         parent = 0; | ||||
|     } | ||||
|     Token() | ||||
|     { | ||||
|         offset_valid = 0; | ||||
|         value_valid = 0; | ||||
|         parent = 0; | ||||
|     } | ||||
|     virtual ~Token(){}; | ||||
|     virtual bool LoadData(SegmentedFinder * s) = 0; | ||||
|     virtual void EmptyData() | ||||
|     { | ||||
|         value_valid = false; | ||||
|     }; | ||||
|     virtual bool Match(SegmentedFinder * s, uint64_t offset) = 0; | ||||
|     virtual void EmptyOffset() | ||||
|     { | ||||
|         offset_valid = false; | ||||
|     }; | ||||
|     virtual bool AcquireOffset(DFHack::VersionInfo * vinfo) | ||||
|     { | ||||
|         vinfo->getOffset(full_offset_name); | ||||
|         return true; | ||||
|     } | ||||
|     virtual uint32_t Length() = 0; | ||||
|     virtual uint64_t getAbsolute(){if(parent) return parent->getAbsolute() + offset; else return offset;}; | ||||
|     void setParent( Token *par ) | ||||
|     { | ||||
|         par = parent; | ||||
|     } | ||||
| protected: | ||||
|     uint64_t offset;// offset from the start of the parent token
 | ||||
|     std::string full_offset_name; | ||||
|     Token * parent; | ||||
|     bool offset_valid :1; | ||||
|     bool value_valid :1; | ||||
| }; | ||||
| 
 | ||||
| class Byte: virtual public Token | ||||
| { | ||||
| public: | ||||
|     Byte(uint64_t _offset):Token(_offset){}; | ||||
|     Byte():Token(){}; | ||||
|     ~Byte(); | ||||
|     virtual bool LoadData(SegmentedFinder * s) | ||||
|     { | ||||
|         if(offset_valid) | ||||
|         { | ||||
|             char * ptr = s->Translate<char>(getAbsolute()); | ||||
|             if(ptr) | ||||
|             { | ||||
|                 value = *ptr; | ||||
|                 value_valid = true; | ||||
|                 return true; | ||||
|             } | ||||
|         } | ||||
|         return false; | ||||
|     }; | ||||
|     // is the loaded data same as data at offset? yes -> set our offset to that.
 | ||||
|     virtual bool Match(SegmentedFinder * s, uint64_t offs) | ||||
|     { | ||||
|         if(value_valid && (*s->Translate<char>(parent->getAbsolute() + offset)) == value ) | ||||
|         { | ||||
|             if(parent) | ||||
|                 offset = offs - parent->getAbsolute(); | ||||
|             else | ||||
|                 offset = offs; | ||||
|             return true; | ||||
|         } | ||||
|         return false; | ||||
|     }; | ||||
|     virtual uint32_t Length() | ||||
|     { | ||||
|         return 1; | ||||
|     }; | ||||
| private: | ||||
|     char value; | ||||
| }; | ||||
| 
 | ||||
| class Short: virtual public Token | ||||
| { | ||||
| public: | ||||
|     Short(uint64_t _offset):Token(_offset){}; | ||||
|     Short():Token(){}; | ||||
|     ~Short(); | ||||
|     virtual bool LoadData(SegmentedFinder * s) | ||||
|     { | ||||
|         if(offset_valid) | ||||
|         { | ||||
|             uint16_t * ptr = s->Translate<uint16_t>(getAbsolute()); | ||||
|             if(ptr) | ||||
|             { | ||||
|                 value = *ptr; | ||||
|                 value_valid = true; | ||||
|                 return true; | ||||
|             } | ||||
|         } | ||||
|         return false; | ||||
|     }; | ||||
|     // is the loaded data same as data at offset? yes -> set our offset to that.
 | ||||
|     virtual bool Match(SegmentedFinder * s, uint64_t offs) | ||||
|     { | ||||
|         if(value_valid && (*s->Translate<uint16_t>(parent->getAbsolute() + offset)) == value ) | ||||
|         { | ||||
|             if(parent) | ||||
|                 offset = offs - parent->getAbsolute(); | ||||
|             else | ||||
|                 offset = offs; | ||||
|             return true; | ||||
|         } | ||||
|         return false; | ||||
|     }; | ||||
|     virtual uint32_t Length() | ||||
|     { | ||||
|         return 2; | ||||
|     }; | ||||
| private: | ||||
|     uint16_t value; | ||||
| }; | ||||
| 
 | ||||
| class Long: virtual public Token | ||||
| { | ||||
| public: | ||||
|     Long(uint64_t _offset):Token(_offset){}; | ||||
|     Long():Token(){}; | ||||
|     ~Long(); | ||||
|     virtual bool LoadData(SegmentedFinder * s) | ||||
|     { | ||||
|         if(offset_valid) | ||||
|         { | ||||
|             uint32_t * ptr = s->Translate<uint32_t>(getAbsolute()); | ||||
|             if(ptr) | ||||
|             { | ||||
|                 value = *ptr; | ||||
|                 value_valid = true; | ||||
|                 return true; | ||||
|             } | ||||
|         } | ||||
|         return false; | ||||
|     }; | ||||
|     // is the loaded data same as data at offset? yes -> set our offset to that.
 | ||||
|     virtual bool Match(SegmentedFinder * s, uint64_t offs) | ||||
|     { | ||||
|         if(value_valid && (*s->Translate<uint32_t>(offs)) == value ) | ||||
|         { | ||||
|             if(parent) | ||||
|                 offset = offs - parent->getAbsolute(); | ||||
|             else | ||||
|                 offset = offs; | ||||
|             return true; | ||||
|         } | ||||
|         return false; | ||||
|              | ||||
|     }; | ||||
|     virtual uint32_t Length(){return 4;}; | ||||
| private: | ||||
|     uint32_t value; | ||||
| }; | ||||
| 
 | ||||
| class PtrVector : virtual public Token | ||||
| { | ||||
| public: | ||||
|     PtrVector(uint64_t _offset):Token(_offset){}; | ||||
|     PtrVector():Token(){}; | ||||
|     ~PtrVector(); | ||||
|     virtual uint32_t Length(){return 12;}; | ||||
| private: | ||||
|     vector <uint64_t> value; | ||||
| }; | ||||
| 
 | ||||
| class Pointer: virtual public Token | ||||
| { | ||||
| public: | ||||
|     Pointer(uint64_t _offset):Token(_offset){}; | ||||
|     Pointer():Token(){}; | ||||
|     ~Pointer(); | ||||
|     virtual uint32_t Length(){return 4;}; | ||||
| private: | ||||
|     uint64_t value; | ||||
| }; | ||||
| 
 | ||||
| class String: virtual public Token | ||||
| { | ||||
| protected: | ||||
|     string value; | ||||
| }; | ||||
| 
 | ||||
| class Struct: virtual public Token | ||||
| { | ||||
| public: | ||||
|     Struct(uint64_t _offset):Token(_offset){}; | ||||
|     Struct():Token(){}; | ||||
|     ~Struct(){}; | ||||
|     void Add( Token * t ){members.push_back(t);}; | ||||
|     virtual uint32_t Length(){return 0;}; // FIXME: temporary solution, should be the minimal length of all the contents combined
 | ||||
|     virtual bool LoadData(SegmentedFinder* s) | ||||
|     { | ||||
|         bool OK = true; | ||||
|         for(size_t i = 0; i < members.size() && OK; i++) | ||||
|             OK &= members[i]->LoadData(s); | ||||
|         return OK; | ||||
|     }; | ||||
|     // TODO: IMPLEMENT!
 | ||||
|     virtual bool Match(SegmentedFinder* s, uint64_t offset) | ||||
|     { | ||||
|         return false; | ||||
|     } | ||||
| private: | ||||
|     vector<Token*> members; | ||||
| }; | ||||
| 
 | ||||
| class LinuxString: virtual public String | ||||
| { | ||||
| public: | ||||
|     LinuxString(uint64_t _offset):Token(_offset){}; | ||||
|     LinuxString():Token(){}; | ||||
|     ~LinuxString(){}; | ||||
|     virtual uint32_t Length(){return 4;}; | ||||
|     virtual bool LoadData(SegmentedFinder* s) | ||||
|     { | ||||
|         return false; | ||||
|     } | ||||
|     virtual bool Match(SegmentedFinder* s, uint64_t offset) | ||||
|     { | ||||
|         return false; | ||||
|     } | ||||
|     /*
 | ||||
|         // read string pointer, translate to local scheme
 | ||||
|         char *str = sf->Translate<char>(*offset); | ||||
|         // verify
 | ||||
|         if(!str) | ||||
|             return false; | ||||
|         uint32_t length = *(uint32_t *)(offset - 12); | ||||
|         uint32_t capacity = *(uint32_t *)(offset - 8); | ||||
|         if(length > capacity) | ||||
|             return false; | ||||
|         //char * temp = new char[length+1];
 | ||||
|         // read data from inside the string structure
 | ||||
|         //memcpy(temp, str,length + 1);
 | ||||
|         output = str; | ||||
|         return true; | ||||
|  */ | ||||
| }; | ||||
| 
 | ||||
| class WindowsString: virtual public String | ||||
| { | ||||
| public: | ||||
|     WindowsString(uint64_t _offset):Token(_offset){}; | ||||
|     WindowsString():Token(){}; | ||||
|     ~WindowsString(){}; | ||||
|     virtual uint32_t Length(){return 0x1C;}; // FIXME: pouzivat Memory.xml?
 | ||||
|     virtual bool LoadData(SegmentedFinder* s) | ||||
|     { | ||||
|         return false; | ||||
|     } | ||||
|     virtual bool Match(SegmentedFinder* s, uint64_t offset) | ||||
|     { | ||||
|         return false; | ||||
|     } | ||||
|     string rdWinString( char * offset, SegmentedFinder & sf ) | ||||
|     { | ||||
|         char * start_offset = offset + 4; // FIXME: pouzivat Memory.xml?
 | ||||
|         uint32_t length = *(uint32_t *)(offset + 20); // FIXME: pouzivat Memory.xml?
 | ||||
|         uint32_t capacity = *(uint32_t *)(offset + 24); // FIXME: pouzivat Memory.xml?
 | ||||
|         char * temp = new char[capacity+1]; | ||||
| 
 | ||||
|         // read data from inside the string structure
 | ||||
|         if(capacity < 16) | ||||
|         { | ||||
|             memcpy(temp, start_offset,capacity); | ||||
|             //read(start_offset, capacity, (uint8_t *)temp);
 | ||||
|         } | ||||
|         else // read data from what the offset + 4 dword points to
 | ||||
|         { | ||||
|             start_offset = sf.Translate<char>(*(uint32_t*)start_offset); | ||||
|             memcpy(temp, start_offset,capacity); | ||||
|         } | ||||
| 
 | ||||
|         temp[length] = 0; | ||||
|         string ret = temp; | ||||
|         delete temp; | ||||
|         return ret; | ||||
|     } | ||||
| }; | ||||
| 
 | ||||
| inline void printRange(DFHack::t_memrange * tpr) | ||||
| { | ||||
|     std::cout << std::hex << tpr->start << " - " << tpr->end << "|" << (tpr->read ? "r" : "-") << (tpr->write ? "w" : "-") << (tpr->execute ? "x" : "-") << "|" << tpr->name << std::endl; | ||||
| } | ||||
| 
 | ||||
| bool getRanges(DFHack::Process * p, vector <DFHack::t_memrange>& selected_ranges) | ||||
| { | ||||
|     vector <DFHack::t_memrange> ranges; | ||||
|     selected_ranges.clear(); | ||||
|     p->getMemRanges(ranges); | ||||
|     cout << "Which range to search? (default is 1-4)" << endl; | ||||
|     for(size_t i = 0; i< ranges.size();i++) | ||||
|     { | ||||
|         cout << dec << "(" << i << ") "; | ||||
|         printRange(&(ranges[i])); | ||||
|     } | ||||
|     int start, end; | ||||
|     while(1) | ||||
|     { | ||||
|         string select; | ||||
|         cout << ">>"; | ||||
|         std::getline(cin, select); | ||||
|         if(select.empty()) | ||||
|         { | ||||
|             // empty input, assume default. observe the length of the memory range vector
 | ||||
|             // these are hardcoded values, intended for my convenience only
 | ||||
|             if(p->getDescriptor()->getOS() == DFHack::OS_WINDOWS) | ||||
|             { | ||||
|                 start = min(11, (int)ranges.size()); | ||||
|                 end = min(14, (int)ranges.size()); | ||||
|             } | ||||
|             else if(p->getDescriptor()->getOS() == DFHack::OS_LINUX) | ||||
|             { | ||||
|                 start = min(2, (int)ranges.size()); | ||||
|                 end = min(4, (int)ranges.size()); | ||||
|             } | ||||
|             else | ||||
|             { | ||||
|                 start = 1; | ||||
|                 end = 1; | ||||
|             } | ||||
|             break; | ||||
|         } | ||||
|         // I like the C variants here. much less object clutter
 | ||||
|         else if(sscanf(select.c_str(), "%d-%d", &start, &end) == 2) | ||||
|         { | ||||
|             start = min(start, (int)ranges.size()); | ||||
|             end = min(end, (int)ranges.size()); | ||||
|             break; | ||||
|         } | ||||
|         else | ||||
|         { | ||||
|             continue; | ||||
|         } | ||||
|         break; | ||||
|     } | ||||
|     end++; | ||||
|     cout << "selected ranges:" <<endl; | ||||
|     vector <DFHack::t_memrange>::iterator it; | ||||
|     it = ranges.begin() + start; | ||||
|     while (it != ranges.begin() + end) | ||||
|     { | ||||
|         // check if readable
 | ||||
|         if((*it).read) | ||||
|         { | ||||
|             selected_ranges.push_back(*it); | ||||
|             printRange(&*it); | ||||
|         } | ||||
|         it++; | ||||
|     } | ||||
|     return true; | ||||
| } | ||||
| 
 | ||||
| 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 getString (string prompt, string & output) | ||||
| { | ||||
|     cout << prompt; | ||||
|     cout << ">>"; | ||||
|     string select; | ||||
|     std::getline(cin, select); | ||||
|     if(select.empty()) | ||||
|     { | ||||
|         return false; | ||||
|     } | ||||
|     else | ||||
|     { | ||||
|         output = select; | ||||
|         return true; | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| // meh
 | ||||
| #pragma pack(1) | ||||
| struct tilecolors | ||||
| { | ||||
|     uint16_t fore; | ||||
|     uint16_t back; | ||||
|     uint16_t bright; | ||||
| }; | ||||
| #pragma pack() | ||||
| 
 | ||||
| void printFound(vector <uint64_t> &found, const char * what) | ||||
| { | ||||
|     cout << what << ":" << endl; | ||||
|     for(size_t i = 0; i < found.size();i++) | ||||
|     { | ||||
|         cout << hex << "0x" << found[i] << endl; | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| void printFoundStrVec(vector <uint64_t> &found, const char * what, SegmentedFinder & s) | ||||
| { | ||||
|     cout << what << ":" << endl; | ||||
|     for(size_t i = 0; i < found.size();i++) | ||||
|     { | ||||
|         cout << hex << "0x" << found[i] << endl; | ||||
|         cout << "--------------------------" << endl; | ||||
|         vecTriplet * vt = s.Translate<vecTriplet>(found[i]); | ||||
|         if(vt) | ||||
|         { | ||||
|             int j = 0; | ||||
|             for(uint32_t idx = vt->start; idx < vt->finish; idx += sizeof(uint32_t)) | ||||
|             { | ||||
|                 uint32_t object_ptr; | ||||
|                 // deref ptr idx, get ptr to object
 | ||||
|                 if(!s.Read(idx,object_ptr)) | ||||
|                 { | ||||
|                     cout << "BAD!" << endl; | ||||
|                     break; | ||||
|                 } | ||||
|                 // deref ptr to first object, get ptr to string
 | ||||
|                 uint32_t string_ptr; | ||||
|                 if(!s.Read(object_ptr,string_ptr)) | ||||
|                 { | ||||
|                     cout << "BAD!" << endl; | ||||
|                     break; | ||||
|                 } | ||||
|                 // get string location in our local cache
 | ||||
|                 char * str = s.Translate<char>(string_ptr); | ||||
|                 if(!str) | ||||
|                 { | ||||
|                     cout << "BAD!" << endl; | ||||
|                     break; | ||||
|                 } | ||||
|                 cout << dec << j << ":" << hex << "0x" << object_ptr << " : " << str << endl; | ||||
|                 j++; | ||||
|             } | ||||
|         } | ||||
|         else | ||||
|         { | ||||
|             cout << "BAD!" << endl; | ||||
|             break; | ||||
|         } | ||||
|         cout << "--------------------------" << endl; | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| class TokenFactory | ||||
| { | ||||
|     DFHack::OSType platform; | ||||
| public: | ||||
|     TokenFactory(DFHack::OSType platform_in) | ||||
|     { | ||||
|         platform = platform_in; | ||||
|     } | ||||
|     template <class T> | ||||
|     T * Build() | ||||
|     { | ||||
|         return new T; | ||||
|     } | ||||
|     template <class T> | ||||
|     T * Build(uint64_t offset) | ||||
|     { | ||||
|         return new T(offset); | ||||
|     } | ||||
| }; | ||||
| template <> | ||||
| String * TokenFactory::Build() | ||||
| { | ||||
|     switch(platform) | ||||
|     { | ||||
|         case DFHack::OS_WINDOWS: | ||||
|             return new WindowsString(); | ||||
|         case DFHack::OS_LINUX: | ||||
|         case DFHack::OS_APPLE: | ||||
|             return new LinuxString(); | ||||
|         case DFHack::OS_BAD: | ||||
|             return 0; | ||||
|     } | ||||
| }; | ||||
| template <> | ||||
| String * TokenFactory::Build(uint64_t offset) | ||||
| { | ||||
|     switch(platform) | ||||
|     { | ||||
|         case DFHack::OS_WINDOWS: | ||||
|             return new WindowsString(offset); | ||||
|         case DFHack::OS_LINUX: | ||||
|         case DFHack::OS_APPLE: | ||||
|             return new LinuxString(offset); | ||||
|         case DFHack::OS_BAD: | ||||
|             return 0; | ||||
|     } | ||||
| }; | ||||
| 
 | ||||
| void autoSearch(DFHack::Context * DF, vector <DFHack::t_memrange>& ranges, DFHack::OSType platform) | ||||
| { | ||||
|     cout << "stealing memory..." << endl; | ||||
|     SegmentedFinder sf(ranges, DF); | ||||
|     TokenFactory tf(platform); | ||||
|     cout << "done!" << endl; | ||||
|     Struct maps; | ||||
|     maps.Add(tf.Build<String>()); | ||||
|     maps.Add(tf.Build<String>()); | ||||
|     /*
 | ||||
|     vector <uint64_t> allVectors; | ||||
|     vector <uint64_t> filtVectors; | ||||
|     vector <uint64_t> to_filter; | ||||
| 
 | ||||
|     cout << "stealing memory..." << endl; | ||||
|     SegmentedFinder sf(ranges, DF); | ||||
|     cout << "looking for vectors..." << endl; | ||||
|     sf.Find<int ,vecTriplet>(0,4,allVectors, vectorAll); | ||||
| 
 | ||||
|     filtVectors = allVectors; | ||||
|     cout << "-------------------" << endl; | ||||
|     cout << "!!LANGUAGE TABLES!!" << endl; | ||||
|     cout << "-------------------" << endl; | ||||
| 
 | ||||
|     uint64_t kulet_vector; | ||||
|     uint64_t word_table_offset; | ||||
|     uint64_t DWARF_vector; | ||||
|     uint64_t DWARF_object; | ||||
| 
 | ||||
|     // find lang vector (neutral word table)
 | ||||
|     to_filter = filtVectors; | ||||
|     sf.Filter<const char * ,vecTriplet>("ABBEY",to_filter, vectorStringFirst); | ||||
|     uint64_t lang_addr = to_filter[0]; | ||||
| 
 | ||||
|     // find dwarven language word table
 | ||||
|     to_filter = filtVectors; | ||||
|     sf.Filter<const char * ,vecTriplet>("kulet",to_filter, vectorStringFirst); | ||||
|     kulet_vector = to_filter[0]; | ||||
| 
 | ||||
|     // find vector of languages
 | ||||
|     to_filter = filtVectors; | ||||
|     sf.Filter<const char * ,vecTriplet>("DWARF",to_filter, vectorStringFirst); | ||||
| 
 | ||||
|     // verify
 | ||||
|     for(int i = 0; i < to_filter.size(); i++) | ||||
|     { | ||||
|         vecTriplet * vec = sf.Translate<vecTriplet>(to_filter[i]); | ||||
|         if(((vec->finish - vec->start) / 4) == 4) // verified
 | ||||
|         { | ||||
|             DWARF_vector = to_filter[i]; | ||||
|             DWARF_object = sf.Read<uint32_t>(vec->start); | ||||
|             // compute word table offset from dwarf word table and dwarf language object addresses
 | ||||
|             word_table_offset = kulet_vector - DWARF_object; | ||||
|             break; | ||||
|         } | ||||
|     } | ||||
|     cout << "translation vector: " << hex << "0x" << DWARF_vector << endl; | ||||
|     cout << "lang vector: " << hex << "0x" << lang_addr << endl; | ||||
|     cout << "word table offset: " << hex << "0x" << word_table_offset << endl; | ||||
| 
 | ||||
|     cout << "-------------" << endl; | ||||
|     cout << "!!MATERIALS!!" << endl; | ||||
|     cout << "-------------" << endl; | ||||
|     // inorganics vector
 | ||||
|     to_filter = filtVectors; | ||||
|     //sf.Find<uint32_t,vecTriplet>(257 * 4,4,to_filter,vectorLength<uint32_t>);
 | ||||
|     sf.Filter<const char * ,vecTriplet>("IRON",to_filter, vectorString); | ||||
|     sf.Filter<const char * ,vecTriplet>("ONYX",to_filter, vectorString); | ||||
|     sf.Filter<const char * ,vecTriplet>("RAW_ADAMANTINE",to_filter, vectorString); | ||||
|     sf.Filter<const char * ,vecTriplet>("BLOODSTONE",to_filter, vectorString); | ||||
|     printFound(to_filter,"inorganics"); | ||||
| 
 | ||||
|     // organics vector
 | ||||
|     to_filter = filtVectors; | ||||
|     sf.Filter<uint32_t,vecTriplet>(52 * 4,to_filter,vectorLength<uint32_t>); | ||||
|     sf.Filter<const char * ,vecTriplet>("MUSHROOM_HELMET_PLUMP",to_filter, vectorStringFirst); | ||||
|     printFound(to_filter,"organics"); | ||||
| 
 | ||||
|     // tree vector
 | ||||
|     to_filter = filtVectors; | ||||
|     sf.Filter<uint32_t,vecTriplet>(31 * 4,to_filter,vectorLength<uint32_t>); | ||||
|     sf.Filter<const char * ,vecTriplet>("MANGROVE",to_filter, vectorStringFirst); | ||||
|     printFound(to_filter,"trees"); | ||||
| 
 | ||||
|     // plant vector
 | ||||
|     to_filter = filtVectors; | ||||
|     sf.Filter<uint32_t,vecTriplet>(21 * 4,to_filter,vectorLength<uint32_t>); | ||||
|     sf.Filter<const char * ,vecTriplet>("MUSHROOM_HELMET_PLUMP",to_filter, vectorStringFirst); | ||||
|     printFound(to_filter,"plants"); | ||||
| 
 | ||||
|     // color descriptors
 | ||||
|     //AMBER, 112
 | ||||
|     to_filter = filtVectors; | ||||
|     sf.Filter<uint32_t,vecTriplet>(112 * 4,to_filter,vectorLength<uint32_t>); | ||||
|     sf.Filter<const char * ,vecTriplet>("AMBER",to_filter, vectorStringFirst); | ||||
|     printFound(to_filter,"color descriptors"); | ||||
|     if(!to_filter.empty()) | ||||
|     { | ||||
|         uint64_t vec = to_filter[0]; | ||||
|         vecTriplet *vtColors = sf.Translate<vecTriplet>(vec); | ||||
|         uint32_t colorObj = sf.Read<uint32_t>(vtColors->start); | ||||
|         cout << "Amber color:" << hex << "0x" << colorObj << endl; | ||||
|         // TODO: find string 'amber', the floats
 | ||||
|     } | ||||
| 
 | ||||
|     // all descriptors
 | ||||
|     //AMBER, 338
 | ||||
|     to_filter = filtVectors; | ||||
|     sf.Filter<uint32_t,vecTriplet>(338 * 4,to_filter,vectorLength<uint32_t>); | ||||
|     sf.Filter<const char * ,vecTriplet>("AMBER",to_filter, vectorStringFirst); | ||||
|     printFound(to_filter,"all descriptors"); | ||||
| 
 | ||||
|     // creature type
 | ||||
|     //ELEPHANT, ?? (demons abound)
 | ||||
|     to_filter = filtVectors; | ||||
|     //sf.Find<uint32_t,vecTriplet>(338 * 4,4,to_filter,vectorLength<uint32_t>);
 | ||||
|     sf.Filter<const char * ,vecTriplet>("ELEPHANT",to_filter, vectorString); | ||||
|     sf.Filter<const char * ,vecTriplet>("CAT",to_filter, vectorString); | ||||
|     sf.Filter<const char * ,vecTriplet>("DWARF",to_filter, vectorString); | ||||
|     sf.Filter<const char * ,vecTriplet>("WAMBLER_FLUFFY",to_filter, vectorString); | ||||
|     sf.Filter<const char * ,vecTriplet>("TOAD",to_filter, vectorString); | ||||
|     sf.Filter<const char * ,vecTriplet>("DEMON_1",to_filter, vectorString); | ||||
| 
 | ||||
|     vector <uint64_t> toad_first = to_filter; | ||||
|     vector <uint64_t> elephant_first = to_filter; | ||||
|     sf.Filter<const char * ,vecTriplet>("TOAD",toad_first, vectorStringFirst); | ||||
|     sf.Filter<const char * ,vecTriplet>("ELEPHANT",elephant_first, vectorStringFirst); | ||||
|     printFoundStrVec(toad_first,"toad-first creature types",sf); | ||||
|     printFound(elephant_first,"elephant-first creature types"); | ||||
|     printFound(to_filter,"all creature types"); | ||||
|      | ||||
|     uint64_t to_use = 0; | ||||
|     if(!elephant_first.empty()) | ||||
|     { | ||||
|         to_use = elephant_first[0]; | ||||
|         vecTriplet *vtCretypes = sf.Translate<vecTriplet>(to_use); | ||||
|         uint32_t elephant = sf.Read<uint32_t>(vtCretypes->start); | ||||
|         uint64_t Eoffset; | ||||
|         cout << "Elephant: 0x" << hex << elephant << endl; | ||||
|         cout << "Elephant: rawname = 0x0" << endl; | ||||
|         uint8_t letter_E = 'E'; | ||||
|         Eoffset = sf.FindInRange<uint8_t,uint8_t> (letter_E,equalityP<uint8_t>, elephant, 0x300 ); | ||||
|         if(Eoffset) | ||||
|         { | ||||
|             cout << "Elephant: big E = 0x" << hex << Eoffset - elephant << endl; | ||||
|         } | ||||
|         Eoffset = sf.FindInRange<const char *,vecTriplet> ("FEMALE",vectorStringFirst, elephant, 0x300 ); | ||||
|         if(Eoffset) | ||||
|         { | ||||
|             cout << "Elephant: caste vector = 0x" << hex << Eoffset - elephant << endl; | ||||
|         } | ||||
|         Eoffset = sf.FindInRange<const char *,vecTriplet> ("SKIN",vectorStringFirst, elephant, 0x2000 ); | ||||
|         if(Eoffset) | ||||
|         { | ||||
|             cout << "Elephant: extract? vector = 0x" << hex << Eoffset - elephant << endl; | ||||
|         } | ||||
|         tilecolors eletc = {7,0,0}; | ||||
|         Bytestream bs_eletc(&eletc, sizeof(tilecolors)); | ||||
|         cout << bs_eletc; | ||||
|         Eoffset = sf.FindInRange<Bytestream,tilecolors> (bs_eletc, findBytestream, elephant, 0x300 ); | ||||
|         if(Eoffset) | ||||
|         { | ||||
|             cout << "Elephant: colors = 0x" << hex << Eoffset - elephant << endl; | ||||
|         } | ||||
|         //cout << "Amber color:" << hex << "0x" << colorObj << endl;
 | ||||
|         // TODO: find string 'amber', the floats
 | ||||
|     } | ||||
|     if(!toad_first.empty()) | ||||
|     { | ||||
|         to_use = toad_first[0]; | ||||
|         vecTriplet *vtCretypes = sf.Translate<vecTriplet>(to_use); | ||||
|         uint32_t toad = sf.Read<uint32_t>(vtCretypes->start); | ||||
|         uint64_t Eoffset; | ||||
|         cout << "Toad: 0x" << hex << toad << endl; | ||||
|         cout << "Toad: rawname = 0x0" << endl; | ||||
|         Eoffset = sf.FindInRange<uint8_t,uint8_t> (0xF9,equalityP<uint8_t>, toad, 0x300 ); | ||||
|         if(Eoffset) | ||||
|         { | ||||
|             cout << "Toad: character (not reliable) = 0x" << hex << Eoffset - toad << endl; | ||||
|         } | ||||
|         Eoffset = sf.FindInRange<const char *,vecTriplet> ("FEMALE",vectorStringFirst, toad, 0x300 ); | ||||
|         if(Eoffset) | ||||
|         { | ||||
|             cout << "Toad: caste vector = 0x" << hex << Eoffset - toad << endl; | ||||
|         } | ||||
|         Eoffset = sf.FindInRange<const char *,vecTriplet> ("SKIN",vectorStringFirst, toad, 0x2000 ); | ||||
|         if(Eoffset) | ||||
|         { | ||||
|             cout << "Toad: extract? vector = 0x" << hex << Eoffset - toad << endl; | ||||
|         } | ||||
|         tilecolors toadtc = {2,0,0}; | ||||
|         Bytestream bs_toadc(&toadtc, sizeof(tilecolors)); | ||||
|         Eoffset = sf.FindInRange<Bytestream,tilecolors> (bs_toadc, findBytestream, toad, 0x300 ); | ||||
|         if(Eoffset) | ||||
|         { | ||||
|             cout << "Toad: colors = 0x" << hex << Eoffset - toad << endl; | ||||
|         } | ||||
|     }*/ | ||||
| } | ||||
| 
 | ||||
| int main (void) | ||||
| { | ||||
|     string select; | ||||
|     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 * p = DF->getProcess(); | ||||
|     vector <DFHack::t_memrange> selected_ranges; | ||||
|     getRanges(p,selected_ranges); | ||||
| 
 | ||||
|     DFHack::VersionInfo *minfo = DF->getMemoryInfo(); | ||||
|     autoSearch(DF,selected_ranges, minfo->getOS()); | ||||
|     #ifndef LINUX_BUILD | ||||
|         cout << "Done. Press any key to continue" << endl; | ||||
|         cin.ignore(); | ||||
|     #endif | ||||
|     return 0; | ||||
| } | ||||
| @ -1,105 +0,0 @@ | ||||
| // Map cleaner. Removes all the snow, mud spills, blood and vomit from map tiles.
 | ||||
| 
 | ||||
| #include <iostream> | ||||
| #include <vector> | ||||
| #include <map> | ||||
| #include <stddef.h> | ||||
| #include <cstring> | ||||
| using namespace std; | ||||
| 
 | ||||
| #include <DFHack.h> | ||||
| #include <dfhack/extra/termutil.h> | ||||
| 
 | ||||
| // magic globals.
 | ||||
| const uint32_t water_idx = 6; | ||||
| const uint32_t mud_idx = 12; | ||||
| 
 | ||||
| int main (int argc, char** argv) | ||||
| { | ||||
|     bool temporary_terminal = TemporaryTerminal(); | ||||
|     bool quiet = false; | ||||
|     for(int i = 1; i < argc; i++) | ||||
|     { | ||||
|         string test = argv[i]; | ||||
|         if(test == "-q") | ||||
|         { | ||||
|             quiet = true; | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     uint32_t x_max,y_max,z_max; | ||||
|     vector<DFHack::t_spattervein> splatter; | ||||
| 
 | ||||
|     DFHack::ContextManager DFMgr("Memory.xml"); | ||||
|     DFHack::Context *DF = DFMgr.getSingleContext(); | ||||
|     try | ||||
|     { | ||||
|         DF->Attach(); | ||||
|     } | ||||
|     catch (exception& e) | ||||
|     { | ||||
|         cerr << e.what() << endl; | ||||
|         if(temporary_terminal) | ||||
|             cin.ignore(); | ||||
|         return 1; | ||||
|     } | ||||
|     DFHack::Maps *Mapz = DF->getMaps(); | ||||
| 
 | ||||
|     // init the map
 | ||||
|     if(!Mapz->Start()) | ||||
|     { | ||||
|         cerr << "Can't init map." << endl; | ||||
|         if(temporary_terminal) | ||||
|             cin.ignore(); | ||||
|         return 1; | ||||
|     } | ||||
| 
 | ||||
|     Mapz->getSize(x_max,y_max,z_max); | ||||
| 
 | ||||
|     uint8_t zeroes [16][16] = {{0}}; | ||||
|     DFHack::occupancies40d occ; | ||||
|     // 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(Mapz->isValidBlock(x,y,z)) | ||||
|                 { | ||||
|                     Mapz->ReadVeins(x,y,z,0,0,&splatter); | ||||
|                     Mapz->ReadOccupancy(x,y,z,&occ); | ||||
|                     for(int i = 0; i < 16; i++) | ||||
|                         for(int j = 0; j < 16; j++) | ||||
|                         { | ||||
|                             occ[i][j].bits.arrow_color = 0; | ||||
|                             occ[i][j].bits.broken_arrows_variant = 0; | ||||
|                         } | ||||
|                     Mapz->WriteOccupancy(x,y,z,&occ); | ||||
|                     for(uint32_t i = 0; i < splatter.size(); i++) | ||||
|                     { | ||||
|                         DFHack::t_spattervein & vein = splatter[i]; | ||||
|                         // filter snow
 | ||||
|                         if(vein.mat1 == water_idx && vein.matter_state == DFHack::state_powder) | ||||
|                             continue; | ||||
|                         // filter mud
 | ||||
|                         if(vein.mat1 == mud_idx && vein.matter_state == DFHack::state_solid) | ||||
|                             continue; | ||||
|                         uint32_t addr = vein.address_of; | ||||
|                         uint32_t offset = offsetof(DFHack::t_spattervein, intensity); | ||||
|                         // TODO: make this actually destroy the objects/remove them from the vector?
 | ||||
|                         // still, this is safe.
 | ||||
|                         DF->WriteRaw(addr + offset,sizeof(zeroes),(uint8_t *) zeroes); | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|     DF->Detach(); | ||||
|     if (!quiet && temporary_terminal)  | ||||
|     { | ||||
|         cout << "Done. Press any key to continue" << endl; | ||||
|         cin.ignore(); | ||||
|     } | ||||
|     return 0; | ||||
| } | ||||
| @ -1,104 +0,0 @@ | ||||
| // This program exports the entire map from DF. Takes roughly 6.6 seconds for 1000 cycles on my Linux machine. ~px
 | ||||
| 
 | ||||
| #include <iostream> | ||||
| #include <vector> | ||||
| #include <ctime> | ||||
| #include <sstream> | ||||
| #include <string> | ||||
| 
 | ||||
| using namespace std; | ||||
| 
 | ||||
| #include <DFHack.h> | ||||
| #include <dfhack/extra/termutil.h> | ||||
| void print_progress (int current, int total) | ||||
| { | ||||
|     if(total < 100) | ||||
|     { | ||||
|         cout << "\b" << current << " / " <<  total << " %\xd" << std::flush; | ||||
|     } | ||||
|     else | ||||
|     { | ||||
|         if( current % (total/100) == 0 ) | ||||
|         { | ||||
|             int percentage = current / (total/100); | ||||
|             // carridge return, not line feed, so percentage, less console spam :)
 | ||||
|             cout << "\b" << percentage << " %\xd" << std::flush; // and a flush for good measure
 | ||||
|         } | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| int main (int numargs, char** args) | ||||
| { | ||||
|     bool temporary_terminal = TemporaryTerminal(); | ||||
|     time_t start, end; | ||||
|     double time_diff; | ||||
| 
 | ||||
|     unsigned int iterations = 0; | ||||
|     if (numargs == 2) | ||||
|     { | ||||
|         istringstream input (args[1],istringstream::in); | ||||
|         input >> iterations; | ||||
|     } | ||||
|     if(iterations == 0) | ||||
|         iterations = 1000; | ||||
| 
 | ||||
|     uint32_t x_max,y_max,z_max; | ||||
|     uint32_t num_blocks = 0; | ||||
|     uint64_t bytes_read = 0; | ||||
|     DFHack::mapblock40d Block; | ||||
|     DFHack::Maps *Maps = 0; | ||||
|     DFHack::ContextManager DFMgr("Memory.xml"); | ||||
|     DFHack::Context *DF; | ||||
|     try | ||||
|     { | ||||
|         DF = DFMgr.getSingleContext(); | ||||
|         DF->Attach(); | ||||
|         Maps = DF->getMaps(); | ||||
|     } | ||||
|     catch (exception& e) | ||||
|     { | ||||
|         cerr << e.what() << endl; | ||||
|         if(temporary_terminal) | ||||
|             cin.ignore(); | ||||
|         return 1; | ||||
|     } | ||||
| 
 | ||||
|     time(&start); | ||||
| 
 | ||||
|     cout << "doing " << iterations << " iterations" << endl; | ||||
|     for(uint32_t i = 0; i< iterations;i++) | ||||
|     { | ||||
|         print_progress (i, iterations); | ||||
|         if(!Maps->Start()) | ||||
|             break; | ||||
|         Maps->getSize(x_max,y_max,z_max); | ||||
|         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)) | ||||
|                     { | ||||
|                         Maps->ReadBlock40d(x, y, z, &Block); | ||||
|                         num_blocks ++; | ||||
|                         bytes_read += sizeof(DFHack::mapblock40d); | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|         Maps->Finish(); | ||||
|     } | ||||
|     DF->Detach(); | ||||
|     time(&end); | ||||
|     time_diff = difftime(end, start); | ||||
|     cout << num_blocks << " blocks read" << endl; | ||||
|     cout << bytes_read / (1024 * 1024) << " MB" << endl; | ||||
|     cout << "map export tests done in " << time_diff << " seconds." << endl; | ||||
|     if(temporary_terminal) | ||||
|     { | ||||
|         cout << "Done. Press any key to continue" << endl; | ||||
|         cin.ignore(); | ||||
|     } | ||||
|     return 0; | ||||
| } | ||||
| @ -1,49 +0,0 @@ | ||||
| // This forces the game to pause.
 | ||||
| 
 | ||||
| #include <iostream> | ||||
| #include <vector> | ||||
| #include <map> | ||||
| using namespace std; | ||||
| 
 | ||||
| #include <DFHack.h> | ||||
| #include <dfhack/modules/Gui.h> | ||||
| #include <dfhack/extra/termutil.h> | ||||
| 
 | ||||
| int main (int argc, char** argv) | ||||
| { | ||||
|     bool temporary_terminal = TemporaryTerminal(); | ||||
|     bool quiet = false; | ||||
|     for(int i = 1; i < argc; i++) | ||||
|     { | ||||
|         string test = argv[i]; | ||||
|         if(test == "-q") | ||||
|         { | ||||
|             quiet = true; | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     DFHack::ContextManager DFMgr("Memory.xml"); | ||||
|     DFHack::Context *DF; | ||||
|     try | ||||
|     { | ||||
|         DF = DFMgr.getSingleContext(); | ||||
|         DF->Attach(); | ||||
|     } | ||||
|     catch (exception& e) | ||||
|     { | ||||
|         cerr << e.what() << endl; | ||||
|         if(!quiet && temporary_terminal) | ||||
|             cin.ignore(); | ||||
|         return 1; | ||||
|     } | ||||
| 
 | ||||
|     DFHack::World *World =DF->getWorld(); | ||||
|     cout << "Pausing..." << endl; | ||||
| 
 | ||||
|     World->SetPauseState(true); | ||||
|     DF->Resume(); | ||||
|     cout << "Done. The current game frame will have to finish first. This can take some time on bugged maps." << endl; | ||||
|     if(!quiet && temporary_terminal) | ||||
|         cin.ignore(); | ||||
|     return 0; | ||||
| } | ||||
| @ -1,61 +0,0 @@ | ||||
| // Test suspend/resume
 | ||||
| 
 | ||||
| #include <iostream> | ||||
| #include <climits> | ||||
| #include <vector> | ||||
| #include <ctime> | ||||
| #include <string> | ||||
| using namespace std; | ||||
| 
 | ||||
| #include <DFHack.h> | ||||
| #include <dfhack/extra/termutil.h> | ||||
| 
 | ||||
| int main (void) | ||||
| { | ||||
|     bool temporary_terminal = TemporaryTerminal(); | ||||
|     string blah; | ||||
|     DFHack::ContextManager DFMgr("Memory.xml"); | ||||
|     DFHack::Context * DF; | ||||
|     try | ||||
|     { | ||||
|         DF = DFMgr.getSingleContext(); | ||||
|         DF->Attach(); | ||||
|     } | ||||
|     catch (exception& e) | ||||
|     { | ||||
|         cerr << e.what() << endl; | ||||
|         if(temporary_terminal) | ||||
|             cin.ignore(); | ||||
|         return 1; | ||||
|     } | ||||
|     cout << "Attached, DF should be suspended now" << endl; | ||||
|     getline(cin, blah); | ||||
|      | ||||
|     DF->Resume(); | ||||
|     cout << "Resumed, DF should be running" << endl; | ||||
|     getline(cin, blah); | ||||
|      | ||||
|     DF->Suspend(); | ||||
|     cout << "Suspended, DF should be suspended now" << endl; | ||||
|     getline(cin, blah); | ||||
|      | ||||
|     DF->Resume(); | ||||
|     cout << "Resumed, testing ForceResume. Suspend using SysInternals Process Explorer" << endl; | ||||
|     getline(cin, blah); | ||||
| 
 | ||||
|     DF->ForceResume(); | ||||
|     cout << "ForceResumed. DF should be running." << endl; | ||||
|     getline(cin, blah); | ||||
| 
 | ||||
|     if(!DF->Detach()) | ||||
|     { | ||||
|         cerr << "Can't detach from DF" << endl; | ||||
|         if(temporary_terminal) | ||||
|             cin.ignore(); | ||||
|         return 1; | ||||
|     } | ||||
|     cout << "Detached, DF should be running again" << endl; | ||||
|     if(temporary_terminal) | ||||
|         getline(cin, blah); | ||||
|     return 0; | ||||
| } | ||||
| @ -1,41 +0,0 @@ | ||||
| // Make stuck DF run again.
 | ||||
| 
 | ||||
| #include <iostream> | ||||
| #include <climits> | ||||
| #include <vector> | ||||
| #include <ctime> | ||||
| #include <string> | ||||
| using namespace std; | ||||
| 
 | ||||
| #include <DFHack.h> | ||||
| #include <dfhack/extra/termutil.h> | ||||
| int main (void) | ||||
| { | ||||
|     bool temporary_terminal = TemporaryTerminal(); | ||||
|     string blah; | ||||
|     DFHack::ContextManager DFMgr("Memory.xml"); | ||||
|     DFHack::Context *DF; | ||||
|     try | ||||
|     { | ||||
|         DF = DFMgr.getSingleContext(); | ||||
|         DF->Attach(); | ||||
|     } | ||||
|     catch (exception& e) | ||||
|     { | ||||
|         cerr << e.what() << endl; | ||||
|         if(temporary_terminal) | ||||
|             cin.ignore(); | ||||
|         return 1; | ||||
|     } | ||||
| 
 | ||||
|     DF->ForceResume(); | ||||
|     cout << "DF should be running again :)" << endl; | ||||
|     getline(cin, blah); | ||||
| 
 | ||||
|     if(!DF->Detach()) | ||||
|     { | ||||
|         cerr << "Can't detach from DF" << endl; | ||||
|         return 1; | ||||
|     } | ||||
|     return 0; | ||||
| } | ||||
| @ -1,208 +0,0 @@ | ||||
| #include <iostream> | ||||
| #include <string.h> // for memset | ||||
| #include <string> | ||||
| #include <vector> | ||||
| #include <stack> | ||||
| #include <map> | ||||
| #include <stdio.h> | ||||
| #include <cstdlib> | ||||
| using namespace std; | ||||
| 
 | ||||
| #include <DFHack.h> | ||||
| #include <dfhack/extra/MapExtras.h> | ||||
| #include <dfhack/extra/termutil.h> | ||||
| using namespace MapExtras; | ||||
| 
 | ||||
| int main (int argc, char* argv[]) | ||||
| { | ||||
|     bool temporary_terminal = TemporaryTerminal(); | ||||
|     // Command line options
 | ||||
|     bool updown = false; | ||||
|     if(argc > 1 && strcmp(argv[1],"-x") == 0) | ||||
|         updown = true; | ||||
| 
 | ||||
|     DFHack::ContextManager DFMgr("Memory.xml"); | ||||
|     DFHack::Context * DF; | ||||
|     try | ||||
|     { | ||||
|         DF = DFMgr.getSingleContext(); | ||||
|         DF->Attach(); | ||||
|     } | ||||
|     catch (exception& e) | ||||
|     { | ||||
|         cerr << e.what() << endl; | ||||
|         if(temporary_terminal) | ||||
|             cin.ignore(); | ||||
|         return 1; | ||||
|     } | ||||
| 
 | ||||
|     uint32_t x_max,y_max,z_max; | ||||
|     DFHack::Maps * Maps = DF->getMaps(); | ||||
|     DFHack::Gui * Gui = DF->getGui(); | ||||
| 
 | ||||
|     // init the map
 | ||||
|     if(!Maps->Start()) | ||||
|     { | ||||
|         cerr << "Can't init map. Make sure you have a map loaded in DF." << endl; | ||||
|         DF->Detach(); | ||||
|         if(temporary_terminal) | ||||
|             cin.ignore(); | ||||
|         return 1; | ||||
|     } | ||||
| 
 | ||||
|     int32_t cx, cy, cz; | ||||
|     Maps->getSize(x_max,y_max,z_max); | ||||
|     uint32_t tx_max = x_max * 16; | ||||
|     uint32_t ty_max = y_max * 16; | ||||
| 
 | ||||
|     Gui->getCursorCoords(cx,cy,cz); | ||||
|     while(cx == -30000) | ||||
|     { | ||||
|         cerr << "Cursor is not active. Point the cursor at a vein." << endl; | ||||
|         DF->Resume(); | ||||
|         cin.ignore(); | ||||
|         DF->Suspend(); | ||||
|         Gui->getCursorCoords(cx,cy,cz); | ||||
|     } | ||||
|     DFHack::DFCoord xy ((uint32_t)cx,(uint32_t)cy,cz); | ||||
|     if(xy.x == 0 || xy.x == tx_max - 1 || xy.y == 0 || xy.y == ty_max - 1) | ||||
|     { | ||||
|         cerr << "I won't dig the borders. That would be cheating!" << endl; | ||||
|         DF->Detach(); | ||||
|         if(temporary_terminal) | ||||
|             cin.ignore(); | ||||
|         return 1; | ||||
|     } | ||||
|     MapCache * MCache = new MapCache(Maps); | ||||
| 
 | ||||
|     DFHack::t_designation des = MCache->designationAt(xy); | ||||
|     int16_t tt = MCache->tiletypeAt(xy); | ||||
|     int16_t veinmat = MCache->veinMaterialAt(xy); | ||||
| 
 | ||||
|     if( veinmat == -1 ) | ||||
|     { | ||||
|         cerr << "This tile is non-vein. Bye :)" << endl; | ||||
|         delete MCache; | ||||
|         DF->Detach(); | ||||
|         if(temporary_terminal) | ||||
|             cin.ignore(); | ||||
|         return 1; | ||||
|     } | ||||
|     printf("%d/%d/%d tiletype: %d, veinmat: %d, designation: 0x%x ... DIGGING!\n", cx,cy,cz, tt, veinmat, des.whole); | ||||
|     stack <DFHack::DFCoord> flood; | ||||
|     flood.push(xy); | ||||
| 
 | ||||
| 
 | ||||
|     while( !flood.empty() ) | ||||
|     { | ||||
|         DFHack::DFCoord current = flood.top(); | ||||
|         flood.pop(); | ||||
|         int16_t vmat2 = MCache->veinMaterialAt(current); | ||||
|         tt = MCache->tiletypeAt(current); | ||||
|         if(!DFHack::isWallTerrain(tt)) | ||||
|             continue; | ||||
|         if(vmat2!=veinmat) | ||||
|             continue; | ||||
| 
 | ||||
|         // found a good tile, dig+unset material
 | ||||
|         DFHack::t_designation des = MCache->designationAt(current); | ||||
|         DFHack::t_designation des_minus; | ||||
|         DFHack::t_designation des_plus; | ||||
|         des_plus.whole = des_minus.whole = 0; | ||||
|         int16_t vmat_minus = -1; | ||||
|         int16_t vmat_plus = -1; | ||||
|         bool below = 0; | ||||
|         bool above = 0; | ||||
|         if(updown) | ||||
|         { | ||||
|             if(MCache->testCoord(current-1)) | ||||
|             { | ||||
|                 below = 1; | ||||
|                 des_minus = MCache->designationAt(current-1); | ||||
|                 vmat_minus = MCache->veinMaterialAt(current-1); | ||||
|             } | ||||
| 
 | ||||
|             if(MCache->testCoord(current+1)) | ||||
|             { | ||||
|                 above = 1; | ||||
|                 des_plus = MCache->designationAt(current+1); | ||||
|                 vmat_plus = MCache->veinMaterialAt(current+1); | ||||
|             } | ||||
|         } | ||||
|         if(MCache->testCoord(current)) | ||||
|         { | ||||
|             MCache->clearMaterialAt(current); | ||||
|             if(current.x < tx_max - 2) | ||||
|             { | ||||
|                 flood.push(DFHack::DFCoord(current.x + 1, current.y, current.z)); | ||||
|                 if(current.y < ty_max - 2) | ||||
|                 { | ||||
|                     flood.push(DFHack::DFCoord(current.x + 1, current.y + 1,current.z)); | ||||
|                     flood.push(DFHack::DFCoord(current.x, current.y + 1,current.z)); | ||||
|                 } | ||||
|                 if(current.y > 1) | ||||
|                 { | ||||
|                     flood.push(DFHack::DFCoord(current.x + 1, current.y - 1,current.z)); | ||||
|                     flood.push(DFHack::DFCoord(current.x, current.y - 1,current.z)); | ||||
|                 } | ||||
|             } | ||||
|             if(current.x > 1) | ||||
|             { | ||||
|                 flood.push(DFHack::DFCoord(current.x - 1, current.y,current.z)); | ||||
|                 if(current.y < ty_max - 2) | ||||
|                 { | ||||
|                     flood.push(DFHack::DFCoord(current.x - 1, current.y + 1,current.z)); | ||||
|                     flood.push(DFHack::DFCoord(current.x, current.y + 1,current.z)); | ||||
|                 } | ||||
|                 if(current.y > 1) | ||||
|                 { | ||||
|                     flood.push(DFHack::DFCoord(current.x - 1, current.y - 1,current.z)); | ||||
|                     flood.push(DFHack::DFCoord(current.x, current.y - 1,current.z)); | ||||
|                 } | ||||
|             } | ||||
|             if(updown) | ||||
|             { | ||||
|                 if(current.z > 0 && below && vmat_minus == vmat2) | ||||
|                 { | ||||
|                     flood.push(current-1); | ||||
| 
 | ||||
|                     if(des_minus.bits.dig == DFHack::designation_d_stair) | ||||
|                         des_minus.bits.dig = DFHack::designation_ud_stair; | ||||
|                     else | ||||
|                         des_minus.bits.dig = DFHack::designation_u_stair; | ||||
|                     MCache->setDesignationAt(current-1,des_minus); | ||||
| 
 | ||||
|                     des.bits.dig = DFHack::designation_d_stair; | ||||
|                 } | ||||
|                 if(current.z < z_max - 1 && above && vmat_plus == vmat2) | ||||
|                 { | ||||
|                     flood.push(current+ 1); | ||||
| 
 | ||||
|                     if(des_plus.bits.dig == DFHack::designation_u_stair) | ||||
|                         des_plus.bits.dig = DFHack::designation_ud_stair; | ||||
|                     else | ||||
|                         des_plus.bits.dig = DFHack::designation_d_stair; | ||||
|                     MCache->setDesignationAt(current+1,des_plus); | ||||
| 
 | ||||
|                     if(des.bits.dig == DFHack::designation_d_stair) | ||||
|                         des.bits.dig = DFHack::designation_ud_stair; | ||||
|                     else | ||||
|                         des.bits.dig = DFHack::designation_u_stair; | ||||
|                 } | ||||
|             } | ||||
|             if(des.bits.dig == DFHack::designation_no) | ||||
|                 des.bits.dig = DFHack::designation_default; | ||||
|             MCache->setDesignationAt(current,des); | ||||
|         } | ||||
|     } | ||||
|     MCache->WriteAll(); | ||||
|     delete MCache; | ||||
|     DF->Detach(); | ||||
|     if(temporary_terminal) | ||||
|     { | ||||
|         cout << "Done. Press any key to continue" << endl; | ||||
|         cin.ignore(); | ||||
|     } | ||||
|     return 0; | ||||
| } | ||||
| 
 | ||||
| @ -1,120 +0,0 @@ | ||||
| // Just show some position data
 | ||||
| 
 | ||||
| #include <iostream> | ||||
| #include <iomanip> | ||||
| #include <climits> | ||||
| #include <vector> | ||||
| #include <sstream> | ||||
| #include <ctime> | ||||
| #include <cstdio> | ||||
| 
 | ||||
| #define DFHACK_WANT_MISCUTILS | ||||
| #define DFHACK_WANT_TILETYPES | ||||
| #include <DFHack.h> | ||||
| 
 | ||||
| using namespace DFHack; | ||||
| 
 | ||||
| void printWeather(DFHack::WeatherType current) | ||||
| { | ||||
|     switch (current) | ||||
|     { | ||||
|         case CLEAR: | ||||
|             cout << "The sky is clear." << endl; | ||||
|             cout << "Options:" << endl; | ||||
|             cout << "'r' to make it rain." << endl; | ||||
|             cout << "'s' to make it snow." << endl; | ||||
|             break; | ||||
|         case RAINING: | ||||
|             cout << "It is raining." << endl; | ||||
|             cout << "Options:" << endl; | ||||
|             cout << "'c' to clear the sky." << endl; | ||||
|             cout << "'s' to make it snow." << endl; | ||||
|             break; | ||||
|         case SNOWING: | ||||
|             cout << "It is snowing." << endl; | ||||
|             cout << "Options:" << endl; | ||||
|             cout << "'c' to clear the sky." << endl; | ||||
|             cout << "'r' to make it rain." << endl; | ||||
|             break; | ||||
|     } | ||||
|     cout << "'q' to quit." << endl; | ||||
|     cout << "anything else to refresh" << endl; | ||||
|     cout << ">"; | ||||
| } | ||||
| 
 | ||||
| using namespace DFHack; | ||||
| int main (int argc, char** argv) | ||||
| { | ||||
|     string command = ""; | ||||
|     bool quiet = false; | ||||
|     bool cmdarg = false; | ||||
|     for(int i = 1; i < argc; i++) | ||||
|     { | ||||
|         string test = argv[i]; | ||||
|         if(test == "-q") | ||||
|         { | ||||
|             quiet = true; | ||||
|         } | ||||
|         else | ||||
|         { | ||||
|             command = test; | ||||
|             cmdarg = true; | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     DFHack::ContextManager DFMgr("Memory.xml"); | ||||
|     DFHack::Context *DF = DFMgr.getSingleContext(); | ||||
| 
 | ||||
|     try | ||||
|     { | ||||
|         DF->Attach(); | ||||
|     } | ||||
|     catch (std::exception& e) | ||||
|     { | ||||
|         std::cerr << e.what() << std::endl; | ||||
|         #ifndef LINUX_BUILD | ||||
|             cin.ignore(); | ||||
|         #endif | ||||
|         return 1; | ||||
|     } | ||||
| 
 | ||||
|     World *W = DF->getWorld(); | ||||
|     W->Start(); | ||||
|     bool end = false; | ||||
|     while(!end) | ||||
|     { | ||||
|         WeatherType current = (WeatherType) W->ReadCurrentWeather(); | ||||
|         DF->Resume(); | ||||
|         printWeather(current); | ||||
|         if (command == "") getline(cin, command); // only read from stdin if command hasn't been passed on the console
 | ||||
|         DF->Suspend(); | ||||
|         if(command == "c") | ||||
|         { | ||||
|             W->SetCurrentWeather(CLEAR); | ||||
|         } | ||||
|         else if(command == "r") | ||||
|         { | ||||
|             W->SetCurrentWeather(RAINING); | ||||
|         } | ||||
|         else if(command == "s") | ||||
|         { | ||||
|             W->SetCurrentWeather(SNOWING); | ||||
|         } | ||||
|         else if(command == "q") | ||||
|         { | ||||
|             end = true; | ||||
|         } | ||||
|         command = ""; | ||||
|         if(cmdarg) end = true; // exit the loop when a cmd line arg has been passed.
 | ||||
|     } | ||||
|     #ifndef LINUX_BUILD | ||||
|         if (!quiet) | ||||
|         { | ||||
|             std::cout << "Done. Press any key to continue" << std::endl; | ||||
|             cin.ignore(); | ||||
|         } | ||||
|     #endif | ||||
|     DF->Resume(); | ||||
|     DF->Detach(); | ||||
|     return 0; | ||||
| } | ||||
		Loading…
	
		Reference in New Issue