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