diff --git a/dfhack/include/config.h b/dfhack/include/config.h old mode 100644 new mode 100755 index 7deb6c158..070e5f175 --- a/dfhack/include/config.h +++ b/dfhack/include/config.h @@ -1,6 +1,6 @@ -#ifndef CONFIG_H -#define CONFIG_H - -#define MEMXML_DATA_PATH . - -#endif // CONFIG_H +#ifndef CONFIG_H +#define CONFIG_H + +#define MEMXML_DATA_PATH . + +#endif // CONFIG_H diff --git a/tools/CMakeLists.txt b/tools/CMakeLists.txt index 2be94dc20..41d235cd0 100644 --- a/tools/CMakeLists.txt +++ b/tools/CMakeLists.txt @@ -9,6 +9,10 @@ ENDIF(UNIX) ADD_EXECUTABLE(dfreveal reveal.cpp) TARGET_LINK_LIBRARIES(dfreveal dfhack) +# a reveal clone +ADD_EXECUTABLE(dfmoodump moodump.cpp) +TARGET_LINK_LIBRARIES(dfmoodump dfhack) + # prospector - produces a list of available materials and their quantities ADD_EXECUTABLE(dfprospector prospector.cpp) TARGET_LINK_LIBRARIES(dfprospector dfhack) @@ -63,6 +67,7 @@ dfincremental #dfmagma_create dfprospector dfreveal +dfmoodump RUNTIME DESTINATION bin ) -ENDIF(UNIX) \ No newline at end of file +ENDIF(UNIX) diff --git a/tools/moodump.cpp b/tools/moodump.cpp new file mode 100755 index 000000000..fa03be5ac --- /dev/null +++ b/tools/moodump.cpp @@ -0,0 +1,136 @@ +#include +#include +#include +#include +#include +using namespace std; + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +struct matGlosses +{ + vector plantMat; + vector woodMat; + vector stoneMat; + vector metalMat; + vector creatureMat; +}; + +vector creaturestypes; +matGlosses mat; +vector< vector > itemTypes; +DFHack::memory_info *mem; +vector< vector > englishWords; +vector< vector > foreignWords; + +int main (int numargs, char ** args) +{ + DFHack::API DF("Memory.xml"); + DFHack::Process * p; + try + { + DF.Attach(); + } + catch (exception& e) + { + cerr << e.what() << endl; + #ifndef LINUX_BUILD + cin.ignore(); + #endif + return 1; + } + p = DF.getProcess(); + string check = ""; + if(numargs == 2) + check = args[1]; + + DFHack::Creatures * Creatures = DF.getCreatures(); + DFHack::Materials * Materials = DF.getMaterials(); + DFHack::Translation * Tran = DF.getTranslation(); + + uint32_t numCreatures; + if(!Creatures->Start(numCreatures)) + { + cerr << "Can't get creatures" << endl; + #ifndef LINUX_BUILD + cin.ignore(); + #endif + return 1; + } + if(!numCreatures) + { + cerr << "No creatures to print" << endl; + #ifndef LINUX_BUILD + cin.ignore(); + #endif + return 1; + } + mem = DF.getMemoryInfo(); + // get stone matgloss mapping + if(!Materials->ReadCreatureTypesEx(creaturestypes)) + { + cerr << "Can't get the creature types." << endl; + return 1; + } + + if(!Tran->Start()) + { + cerr << "Can't get name tables" << endl; + return 1; + } + vector addrs; + //DF.InitViewAndCursor(); + for(uint32_t i = 0; i < numCreatures; i++) + { + DFHack::t_creature temp; + unsigned int current_job; + unsigned int mat_start; + unsigned int mat_end; + unsigned int j,k; + unsigned int matptr; + unsigned int tmp; + + Creatures->ReadCreature(i,temp); + if(temp.mood>=0) + { + current_job = p->readDWord(temp.origin + 0x390); + if(current_job == 0) + continue; + mat_start = p->readDWord(current_job + 0xa4 + 4*3); + mat_end = p->readDWord(current_job + 0xa4 + 4*4); + for(j=mat_start;jreadDWord(j); + for(k=0;k<4;k++) + printf("%.4X ", p->readWord(matptr + k*2)); + for(k=0;k<3;k++) + printf("%.8X ", p->readDWord(matptr + k*4 + 0x8)); + for(k=0;k<2;k++) + printf("%.4X ", p->readWord(matptr + k*2 + 0x14)); + for(k=0;k<3;k++) + printf("%.8X ", p->readDWord(matptr + k*4 + 0x18)); + for(k=0;k<4;k++) + printf("%.2X ", p->readByte(matptr + k + 0x24)); + for(k=0;k<6;k++) + printf("%.8X ", p->readDWord(matptr + k*4 + 0x28)); + for(k=0;k<4;k++) + printf("%.2X ", p->readByte(matptr + k + 0x40)); + for(k=0;k<9;k++) + printf("%.8X ", p->readDWord(matptr + k*4 + 0x44)); + printf(" [%p]\n", matptr); + } + } + } + Creatures->Finish(); + DF.Detach(); + return 0; +} +