diff --git a/CMake/Modules/CMakeVS10FindMake.cmake b/CMake/Modules/CMakeVS10FindMake.cmake new file mode 100644 index 000000000..460de25e5 --- /dev/null +++ b/CMake/Modules/CMakeVS10FindMake.cmake @@ -0,0 +1,28 @@ + +#============================================================================= +# Copyright 2009 Kitware, Inc. +# +# Distributed under the OSI-approved BSD License (the "License"); +# see accompanying file Copyright.txt for details. +# +# This software is distributed WITHOUT ANY WARRANTY; without even the +# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the License for more information. +#============================================================================= +# (To distributed this file outside of CMake, substitute the full +# License text for the above reference.) + +# We use MSBuild as the build tool for VS 10 +FIND_PROGRAM(CMAKE_MAKE_PROGRAM + NAMES MSBuild + HINTS + [HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\VisualStudio\\10.0\\Setup\\VS;ProductDir] + "$ENV{SYSTEMROOT}/Microsoft.NET/Framework/[HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\VisualStudio\\10.0;CLR Version]/" + "c:/WINDOWS/Microsoft.NET/Framework/[HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\VisualStudio\\10.0;CLR Version]/" + "$ENV{SYSTEMROOT}/Microsoft.NET/Framework/[HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\VCExpress\\10.0;CLR Version]/" + ) + +MARK_AS_ADVANCED(CMAKE_MAKE_PROGRAM) +SET(MSVC10 1) +SET(MSVC_VERSION 1600) + diff --git a/CMakeLists.txt b/CMakeLists.txt index f8458cb97..160b71a6f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,9 +1,8 @@ -INCLUDE(CPack) # main project file. use it from a build sub-folder, see COMPILE for details PROJECT (dfhack) cmake_minimum_required(VERSION 2.6) SET(CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/CMake/Modules) -SET ( DFHACK_VERSION "0.4.0.3-dev" ) +SET ( DFHACK_VERSION "0.4.1.0-dev" ) # disable warning, autosearch if(COMMAND cmake_policy) @@ -20,8 +19,12 @@ ENDIF(NOT DEFINED CMAKE_BUILD_TYPE) SET( LIBRARY_OUTPUT_PATH ${CMAKE_SOURCE_DIR}/output CACHE PATH "Output directory for the dfhack library" ) SET( EXECUTABLE_OUTPUT_PATH ${CMAKE_SOURCE_DIR}/output CACHE PATH "Output directory for the dfhack tools" ) +SET( DATA_OUTPUT_PATH ${CMAKE_SOURCE_DIR}/output CACHE PATH "Output directory for the dfhack data (offset files)" ) OPTION(BUILD_DFHACK_DOCUMENTATION "Create doxygen documentation for developers" OFF) +OPTION(BUILD_DFHACK_EXAMPLES "Build example tools" OFF) +OPTION(BUILD_DFHACK_PLAYGROUND "Build tools from the playground folder" OFF) +OPTION(BUILD_DFHACK_C_BINDIGS "Build the C portion of the library" ON) include_directories (${CMAKE_SOURCE_DIR}/library/include/) include_directories (${CMAKE_SOURCE_DIR}/library/shm/) @@ -30,8 +33,8 @@ include_directories (${CMAKE_SOURCE_DIR}/library/depends/tinyxml/) include_directories (${CMAKE_SOURCE_DIR}/library/depends/argstream/) add_subdirectory (library) +add_subdirectory (offsetedit) add_subdirectory (library/shm) -#add_subdirectory (dfhack/python) add_subdirectory (tools/examples) add_subdirectory (tools/playground) add_subdirectory (tools/supported) diff --git a/COMPILE b/COMPILE deleted file mode 100644 index cc3a5670b..000000000 --- a/COMPILE +++ /dev/null @@ -1,160 +0,0 @@ -Here's how you build dfhack! ----------------------------- - -Dependencies -============ - -You'll need cmake and 'a' compiler for building the main lib and the various tools. -(Linux only) Veinlook requires the wide-character ncurses library (libncursesw) -(Linux only) You'll need X11 dev libraries. - -Building on Linux: --------------------- - -* To run in the output folder (without installing): - -building the library is simple. Enter the build folder, run the tools. Like this: - -cd build -cmake .. -DCMAKE_BUILD_TYPE:string=Release -make - -This will build the library and its tools and place them in /output. -You can also use a cmake-friendly IDE like KDevelop 4 or the cmake GUI program. - -* To be installed into the system or packaged - -cd build -cmake -DCMAKE_BUILD_TYPE:string=Release -DCMAKE_INSTALL_PREFIX=/usr -DMEMXML_DATA_PATH:path=/usr/share/dfhack .. -make -make install - -With this dfhack installs: -library to $CMAKE_INSTALL_PREFIX/lib -executables to $CMAKE_INSTALL_PREFIX/bin -The Memory.xml file to /usr/share/dfhack - -See the section on the shared memory hook library (SHM). - -Building on Windows: --------------------- - -You need cmake. Get the win32 installer version from the official site: -http://www.cmake.org/cmake/resources/software.html -It has the usual installer wizard thing. - - -* Using mingw: - -You also need a compiler. I build dfhack using mingw. You can get it from the mingw site: -Get the automated installer, it will download newest version of mingw and set things up nicely. -You'll have to add C:\MinGW\ to your PATH variable. - - - Building: - open up cmd and navigate to the dfhack\build folder, run cmake and the mingw version of make: - cd build - cmake .. -G"MinGW Makefiles" -DCMAKE_BUILD_TYPE:string=Release - mingw32-make - - -* Using MSVC - -open up cmd and navigate to the dfhack\build folder, run cmake: -cd build -cmake .. - -This will generate MSVC solution and project files. -Note that: you are working in the /build folder. Files added to projects will - end up there! (and that's wrong). Any changes to the build system should -be done by changing cmake configs and running cmake on them! - -Alo, you'll have to copy the Memory.xml file to the build output folders -MSVC generates. For example from 'output/' to 'output/Release/' - - -* Using some other compiler: - -I'm afraid you are on your own. dfhack wasn't tested with any other compiler. -Try using a different cmake generator that's intended for your tools. - -Build targets -------------- - -dfhack has a few build targets. -If you're only after the library run 'make dfhack'. -'make' will build everything. -'make expbench' will build the expbench testing program and the library. - -Build types ------------ - -cmake allows you to pick a build type by changing this variable: CMAKE_BUILD_TYPE - -cmake .. -DCMAKE_BUILD_TYPE:string=BUILD_TYPE - -Without specifying a build type or 'None', cmake uses the CMAKE_CXX_FLAGS -variable for building. -Valid an useful build types include 'Release', 'Debug' and 'RelWithDebInfo'. -There are others, but they aren't really that useful. - -Have fun. - --------------------------------------------------------------------------------- -**Deprecated*Deprecated*Deprecated*Deprecated*Deprecated*Deprecated*Deprecated** --------------------------------------------------------------------------------- - -Building the shared memory hook library (SHM) ---------------------------------------------- - -Unlike the rest of DFHack, The SHM needs special treatment when it comes to -compilation. Because it shares the memory space with DF itself, it has to be -built with the same tools as DF and use the same C and C++/STL libraries. - -For DF 40d15 - 40d19_2 on Windows, use MSVC 2008. You can get the Express -edition for free from Microsoft. - -Windows dependencies can be determined by a tool like depends.exe (google it). -Both the fake SDL.dll and DF have to use the same version of the C runtime -(MSVCRT). -The SHM can only be debugged using a RelWithDebInfo build! - -Linux dependencies can be determined by setting the LD_DEBUG variable and -running ./df: -$export LD_DEBUG=versions -$./df - -Example of (a part of a) relevant output from a working SHM installation: - 24472: checking for version `GLIBC_2.0' in file /opt/lib32/lib/libpthread.so.0 [0] required by file ./dwarfort.exe [0] - 24472: checking for version `GCC_3.0' in file ./libs/libgcc_s.so.1 [0] required by file ./dwarfort.exe [0] - 24472: checking for version `GLIBC_2.0' in file ./libs/libgcc_s.so.1 [0] required by file ./dwarfort.exe [0] - 24472: checking for version `GLIBC_2.1' in file /opt/lib32/lib/libm.so.6 [0] required by file ./dwarfort.exe [0] - 24472: checking for version `GLIBC_2.0' in file /opt/lib32/lib/libm.so.6 [0] required by file ./dwarfort.exe [0] - 24472: checking for version `GLIBC_2.1.3' in file /opt/lib32/lib/libc.so.6 [0] required by file ./dwarfort.exe [0] - 24472: checking for version `GLIBC_2.3.4' in file /opt/lib32/lib/libc.so.6 [0] required by file ./dwarfort.exe [0] - 24472: checking for version `GLIBC_2.4' in file /opt/lib32/lib/libc.so.6 [0] required by file ./dwarfort.exe [0] - 24472: checking for version `GLIBC_2.0' in file /opt/lib32/lib/libc.so.6 [0] required by file ./dwarfort.exe [0] - 24472: checking for version `GLIBCXX_3.4.9' in file ./libs/libstdc++.so.6 [0] required by file ./dwarfort.exe [0] - 24472: checking for version `CXXABI_1.3' in file ./libs/libstdc++.so.6 [0] required by file ./dwarfort.exe [0] - 24472: checking for version `GLIBCXX_3.4' in file ./libs/libstdc++.so.6 [0] required by file ./dwarfort.exe [0] - 24472: checking for version `CXXABI_1.3' in file ./libs/libstdc++.so.6 [0] required by file ./libs/libdfconnect.so [0] - 24472: checking for version `GLIBCXX_3.4' in file ./libs/libstdc++.so.6 [0] required by file ./libs/libdfconnect.so [0] - 24472: checking for version `GLIBC_2.1.3' in file /opt/lib32/lib/libc.so.6 [0] required by file ./libs/libdfconnect.so [0] - 24472: checking for version `GLIBC_2.2' in file /opt/lib32/lib/libc.so.6 [0] required by file ./libs/libdfconnect.so [0] - 24472: checking for version `GLIBC_2.3.4' in file /opt/lib32/lib/libc.so.6 [0] required by file ./libs/libdfconnect.so [0] - 24472: checking for version `GLIBC_2.0' in file /opt/lib32/lib/libc.so.6 [0] required by file ./libs/libdfconnect.so [0] - -libdfconnect is the SHM. Both are compiled against the same C++ library and -share the same CXXABI version. - -Precompiled SHM libraries are provided in binary releases. - -* Checking strings support - -Strings are one of the important C++ types and a great indicator that the SHM -works. Tools like Dwarf Therapist depend on string support. Reading of strings -can be checked by running any of the tools that deal with materials. - -String writing is best tested with a fresh throw-away fort and dfrenamer. -Embark, give one dwarf a very long name using dfrenamer and save/exit. -If DF crashes during the save sequence, your SHM is not compatible with DF and -the throw-away fort is most probably lost. diff --git a/COMPILE.rst b/COMPILE.rst new file mode 100644 index 000000000..dc07456f0 --- /dev/null +++ b/COMPILE.rst @@ -0,0 +1,147 @@ +################ +Compiling DFHACK +################ + +============================ +Here's how you build dfhack! +============================ + +.. contents:: + + +Dependencies +============ +* ``cmake`` +* A compiler for building the main lib and the various tools. +* (Linux only) Veinlook requires the wide-character ncurses library (libncursesw) +* (Linux only) You'll need X11 dev libraries. + +Building on Linux +================= +To run in the output folder (without installing) building the library +is simple. Enter the build folder, run the tools. Like this:: + + cd build + cmake .. -DCMAKE_BUILD_TYPE:string=Release + make + +This will build the library and its tools and place them in ``/output``. +You can also use a cmake-friendly IDE like KDevelop 4 or the cmake GUI +program. + +To be installed into the system or packaged:: + + cd build + cmake -DCMAKE_BUILD_TYPE:string=Release \ + -DCMAKE_INSTALL_PREFIX=/usr \ + -DMEMXML_DATA_PATH:path=/usr/share/dfhack .. + make + make install + +With this dfhack installs: + +* library to ``$CMAKE_INSTALL_PREFIX/lib`` +* executables to ``$CMAKE_INSTALL_PREFIX/bin`` +* The ``Memory.xml`` file to ``/usr/share/dfhack`` + +See the section on the shared memory hook library (SHM). + +Building on Windows +=================== +You need ``cmake``. Get the win32 installer version from the official +site: http://www.cmake.org/cmake/resources/software.html + +It has the usual installer wizard thing. + +----------- +Using mingw +----------- +You also need a compiler. I build dfhack using mingw. You can get it +from the mingw site: http://www.mingw.org/ + +Get the automated installer, it will download newest version of mingw +and set things up nicely. + +You'll have to add ``C:\MinGW\`` to your PATH variable. + +Building +-------- +open up cmd and navigate to the ``dfhack\build`` folder, run ``cmake`` +and the mingw version of make:: + + cd build + cmake .. -G"MinGW Makefiles" -DCMAKE_BUILD_TYPE:string=Release + mingw32-make + +---------- +Using MSVC +---------- +open up ``cmd`` and navigate to the ``dfhack\build`` folder, run +``cmake``:: + + cd build + cmake .. + +This will generate MSVC solution and project files. + +.. note:: + + You are working in the ``/build`` folder. Files added to + projects from within MSVC will end up there! (and that's + wrong). Any changes to the build system should be done + by changing cmake configs and running ``cmake`` on them! + +------------------------- +Using some other compiler +------------------------- +I'm afraid you are on your own. dfhack wasn't tested with any other +compiler. + +Try using a different cmake generator that's intended for your tools. + +Build targets +============= +dfhack has a few build targets: + +* If you're only after the library run ``make dfhack``. +* ``make`` will build everything. +* ``make expbench`` will build the expbench testing program and the + library. +* Some of the utilities and the doxygen documentation won't be + normally built. You can enable them by specifying some extra + CMake variables:: + + BUILD_DFHACK_DOCUMENTATION - generate the documentation (really bad) + BUILD_DFHACK_EXAMPLES - build tools from tools/examples + BUILD_DFHACK_PLAYGROUND - build tools from tools/playground + + Example:: + + cmake .. -DBUILD_DFHACK_EXAMPLES=ON + +Build types +=========== +``cmake`` allows you to pick a build type by changing this +variable: ``CMAKE_BUILD_TYPE`` + +:: + + cmake .. -DCMAKE_BUILD_TYPE:string=BUILD_TYPE + +Without specifying a build type or 'None', cmake uses the +``CMAKE_CXX_FLAGS`` variable for building. + +Valid an useful build types include 'Release', 'Debug' and +'RelWithDebInfo'. There are others, but they aren't really that useful. + +Have fun. + +Building the shared memory hook library (SHM) +============================================= +Unlike the rest of DFHack, The SHM needs special treatment when it +comes to compilation. Because it shares the memory space with DF +itself, it has to be built with the same tools as DF and use the same C +and C++/STL libraries. + +For DF 31.01 - 31.12 on Windows, use MSVC 2008. You can get the Express +edition for free from Microsoft. diff --git a/Compile.html b/Compile.html new file mode 100644 index 000000000..d7bb44ce7 --- /dev/null +++ b/Compile.html @@ -0,0 +1,471 @@ + + + + + + +Compiling DFHACK + + + +
+

Compiling DFHACK

+

Here's how you build dfhack!

+ +
+

Contents

+ +
+
+

Dependencies

+ +
+
+

Building on Linux

+

To run in the output folder (without installing) building the library +is simple. Enter the build folder, run the tools. Like this:

+
+cd build
+cmake .. -DCMAKE_BUILD_TYPE:string=Release
+make
+
+

This will build the library and its tools and place them in /output. +You can also use a cmake-friendly IDE like KDevelop 4 or the cmake GUI +program.

+

To be installed into the system or packaged:

+
+cd build
+cmake -DCMAKE_BUILD_TYPE:string=Release \
+    -DCMAKE_INSTALL_PREFIX=/usr \
+    -DMEMXML_DATA_PATH:path=/usr/share/dfhack ..
+make
+make install
+
+

With this dfhack installs:

+ +

See the section on the shared memory hook library (SHM).

+
+
+

Building on Windows

+

You need cmake. Get the win32 installer version from the official +site: http://www.cmake.org/cmake/resources/software.html

+

It has the usual installer wizard thing.

+
+

Using mingw

+

You also need a compiler. I build dfhack using mingw. You can get it +from the mingw site: http://www.mingw.org/

+

Get the automated installer, it will download newest version of mingw +and set things up nicely.

+

You'll have to add C:\MinGW\ to your PATH variable.

+
+

Building

+

open up cmd and navigate to the dfhack\build folder, run cmake +and the mingw version of make:

+
+cd build
+cmake .. -G"MinGW Makefiles" -DCMAKE_BUILD_TYPE:string=Release
+mingw32-make
+
+
+
+
+

Using MSVC

+

open up cmd and navigate to the dfhack\build folder, run +cmake:

+
+cd build
+cmake ..
+
+

This will generate MSVC solution and project files.

+
+

Note

+

You are working in the /build folder. Files added to +projects from within MSVC will end up there! (and that's +wrong). Any changes to the build system should be done +by changing cmake configs and running cmake on them!

+
+
+
+

Using some other compiler

+

I'm afraid you are on your own. dfhack wasn't tested with any other +compiler.

+

Try using a different cmake generator that's intended for your tools.

+
+
+
+

Build targets

+

dfhack has a few build targets:

+ +
+
+

Build types

+

cmake allows you to pick a build type by changing this +variable: CMAKE_BUILD_TYPE

+
+cmake .. -DCMAKE_BUILD_TYPE:string=BUILD_TYPE
+
+

Without specifying a build type or 'None', cmake uses the +CMAKE_CXX_FLAGS variable for building.

+

Valid an useful build types include 'Release', 'Debug' and +'RelWithDebInfo'. There are others, but they aren't really that useful.

+

Have fun.

+
+
+

Building the shared memory hook library (SHM)

+

Unlike the rest of DFHack, The SHM needs special treatment when it +comes to compilation. Because it shares the memory space with DF +itself, it has to be built with the same tools as DF and use the same C +and C++/STL libraries.

+

For DF 31.01 - 31.12 on Windows, use MSVC 2008. You can get the Express +edition for free from Microsoft.

+
+
+ + diff --git a/README b/README deleted file mode 100644 index cc6e7c9ef..000000000 --- a/README +++ /dev/null @@ -1,179 +0,0 @@ -Introduction ------------- - -DFHack is a Dwarf Fortress memory access library and a set of basic tools using -this library. The library is a work in progress, so things might change as more -tools are written for it. - -It is an attempt to unite the various ways tools access DF memory and allow for -easier development of new tools. - -Getting DFHack ----------------- -The project is currently hosted on github, for both source and binaries: - http://github.com/peterix/dfhack - -* Packages - -The library and tools are packaged for Archlinux and are available both in AUR -and the arch-games repository. - -The package name is dfhack-git :) - -Compatibility -------------- - -DFHack works on Windows XP, Vista, 7 or any modern Linux distribution. - -Windows 2000 is currently *not supported* due to missing OS functionality. -If you know how to easily suspend processes, you can fix it :) - -OSX is also not supported due to lack of developers with a Mac. - -Currently supported Dwarf Fortress versions: -* Windows - 0.31.01 - 0.31.03 legacy - 0.31.04 - 0.31.08 SDL - -* Linux - 0.31.04 - 0.31.08 native. - There are missing offsets but Map tools should be OK. Linux support is a bit lacking, I'm working on it. - All supported Windows versions running in wine can be used with DFHack. - -Using the library as a developer --------------------------------- - -The library is compilable under Linux with GCC and under Windows with MinGW32 -and MSVC compilers. It is using the cmake build system. See COMPILE for details. - -DFHack is using the zlib/libpng license. This makes it easy to link to it, use -it in-source or add your own extensions. Contributing back to the dfhack -repository is welcome and the right thing to do :) - -At the time of writing there's no API reference or documentation. The code does -have a lot of comments though (and getting better all the time). - -Contributing to DFHack ----------------------- - -Several things should be kept in mind when contributing to DFHack. - -**** Coding style **** - -DFhack uses ANSI formatting and four spaces as indentation. Line endings are -UNIX. The files use UTF-8 encoding. Code not following this won't make me happy, -because I'll have to fix it. There's a good chance I'll make *you* fix it ;) - -**** How to get new code into DFHack **** - -You can send patches or make a clone of the github repo and ask me on the -IRC channel to pull your code in. I'll review it and see if there are any -problems. I'll fix them if they are minor. - -Fixes are higher in priority. If you want to work on something, but don't -know what, check out http://github.com/peterix/dfhack/issues -- this is also -a good place to dump new ideas and/or bugs that need fixing. - -**** Layout for tools **** - -Tools live in the tools/ folder. There, they are split into three categories: - -distributed: these tools get distributed with binary releases and are installed - by doing 'make install' on linux. They are supposed to be stable - and supported. Experimental, useless, buggy or untested stuff - doesn't belong here. -examples : examples are tools that aren't very useful, but show how DF - and DFHack work. They should use only DFHack API functions. - No actual hacking or 'magic offsets' are allowed. -playground : This is a catch-all folder for tools that aren't ready to be - examples or be distributed in binary releases. All new tools - should start here. They can contain actual hacking, magic values - and other nasty business. - -**** Modules - what are they? **** - -DFHack uses modules to partition sets of features into manageable chunks. -A module can have both client and server side. - -Client side is the part that goes into the main library and is generally -written in C++. It is exposed to the users of DFHack. - -Server side is used inside DF and serves to accelerate the client modules. -This is written mostly in C style. - -There's a Core module that shouldn't be changed, because it defines -the basic commands like reading and writing raw data. The client parts -for the Core module are the various implementations of the Process -interface. - -A good example of a module is Maps. Named the same in both client and -server, it allows accelerating the reading of map blocks. - -Communication between modules happens by using shared memory. This is -pretty fast, but needs quite a bit of care to not break. - -**** Dependencies **** - -Internal : either part of the codebase or statically linked. -External : linked as dynamic loaded libraries (.dll, .so, etc.) - -If you want to add dependencies, think twice about it. All internal dependencies -for core dfhack should be either public domain or require attribution at most. -Internal dependencies for tools can be either that, or any Free Software -licenses. - -** Current internal dependencies ** - -tinyxml : used by core dfhack to read offset definitions from Memory.xml -md5 : an implementation of the MD5 hash algorithm. Used for identifying - DF binaries on Linux. -argstream: Allows reading terminal application arguments. GPL! - -** Current external dependencies ** - -wide-character ncurses : used for the veinlook tool on Linux. -python 2.6 : required for building and using the python bindings. - -** Build-time dependencies ** -cmake: you need cmake to generate the build system and some configuration - headers - - -Tools ------ -All the DFHack tools are terminal programs. This might seem strange to Windows -users, but these are meant mostly as examples for developers. Still, they can -be useful and are cross-platform just like the library itself. - - - dfcleanmap : Cleans all the splatter that get scattered all over the map. - Only exception is mud. It leaves mud alone. - - dfexpbench : Just a simple benchmark of the data export speed. - - dfliquids : A command prompt for liquid creation and manipulation - (the Moses effect included!) - Also allows painting obsidian walls directly. - Note: - Spawning and deleting liquids can F up pathing data and - temperatures (creating heat traps). You've been warned. - - dfposition : Prints the current DF window properties and cursor position. - - dfprospector: Lists all available minerals on the map and how much - of them there is. - - dfreveal : Reveals the whole map, waits for input and hides it again. - If you close the tool while it waits, the map remains revealed. - - dfsuspend : Test of the process suspend/resume mechanism. - - dfunstuck : Use if you prematurely close any of the tools and DF - appears to be stuck. - - dfvdig : Designates a whole vein for digging. Point the cursor at a vein - and run this thing :) - - - dfflows : A tool for checking how many liquid tiles are actively checked - for flows. - - Your tool here: Write one ;) - - -Memory offset definitions -------------------------- - -The file with memory offset definitions used by dfhack can be found in the -output folder. - -~ EOF ~ diff --git a/README.rst b/README.rst new file mode 100644 index 000000000..e7184bd03 --- /dev/null +++ b/README.rst @@ -0,0 +1,252 @@ +============ +Introduction +============ + +DFHack is a Dwarf Fortress memory access library and a set of basic +tools using this library. The library is a work in progress, so things +might change as more tools are written for it. + +It is an attempt to unite the various ways tools access DF memory and +allow for easier development of new tools. + +.. contents:: + + +============== +Getting DFHack +============== +The project is currently hosted on github_, for both source and +binaries at http://github.com/peterix/dfhack + +.. _github: http://www.github.com/ + +Packages +======== +The library and tools are packaged for Archlinux and are available both +in AUR and the arch-games repository. + +The package name is dfhack-git :) + +============= +Compatibility +============= +DFHack works on Windows XP, Vista, 7 or any modern Linux distribution. + +OSX is not supported due to lack of developers with a Mac. + +Currently supported Dwarf Fortress versions are Windows and Linux. + +Windows +======= +.. note:: + + Windows 2000 is currently *not supported* due to missing OS + functionality. If you know how to easily suspend processes, you can + fix it :) + +0.31.01 - 0.31.03 legacy +0.31.04 - 0.31.12 SDL + +Linux +===== +0.31.05 - 0.31.12 native. +There are missing offsets but Map tools should be OK. Linux support is +a bit lacking, I'm working on it. All supported Windows versions +running in wine can be used with native DFHack binaries. + +===== +Tools +===== +All the DFHack tools are terminal programs. This might seem strange to Windows +users, but these are meant mostly as examples for developers. Still, they can +be useful and are cross-platform just like the library itself. + +dfcleanmap +========== +Cleans all the splatter that get scattered all over the map. +Only exception is mud. It leaves mud alone. + +dfliquids +========= +A command prompt for liquid creation and manipulation (the Moses +effect included!) Also allows painting obsidian walls directly. + +.. note:: + + Spawning and deleting liquids can F up pathing data and + temperatures (creating heat traps). You've been warned. + +dfposition +========== +Prints the current DF window properties and cursor position. + +dfprospector +============ +Lists all available minerals on the map and how much of them there is. + +dfreveal +======== +Reveals the whole map, waits for input and hides it again. If you close +the tool while it waits, the map remains revealed. + +dfunstuck +========= +Use if you prematurely close any of the tools and DF appears to be +stuck. + +dfvdig +====== +Designates a whole vein for digging. Point the cursor at a vein and run +this thing :) + +dfflows +======= +A tool for checking how many liquid tiles are actively checked for +flows. + +dfattachtest +============ +Test of the process attach/detach mechanism. + +dfsuspend +========= +Test of the process suspend/resume mechanism. + +dfexpbench +========== +Just a simple benchmark of the data export speed. + +dfdoffsets +========== +Dumps the offsets for the currently running DF version into the terminal. + +Your tool here +============== +Write one ;) + +================================ +Using the library as a developer +================================ +The library is compilable under Linux with GCC and under Windows with +MinGW32 and MSVC compilers. It is using the cmake build system. See +COMPILE for details. + +DFHack is using the zlib/libpng license. This makes it easy to link to +it, use it in-source or add your own extensions. Contributing back to +the dfhack repository is welcome and the right thing to do :) + +At the time of writing there's no API reference or documentation. The +code does have a lot of comments though (and getting better all the +time). + +Contributing to DFHack +====================== + +Several things should be kept in mind when contributing to DFHack. + +------------ +Coding style +------------ +DFhack uses ANSI formatting and four spaces as indentation. Line +endings are UNIX. The files use UTF-8 encoding. Code not following this +won't make me happy, because I'll have to fix it. There's a good chance +I'll make *you* fix it ;) + +------------------------------- +How to get new code into DFHack +------------------------------- +You can send patches or make a clone of the github repo and ask me on +the IRC channel to pull your code in. I'll review it and see if there +are any problems. I'll fix them if they are minor. + +Fixes are higher in priority. If you want to work on something, but +don't know what, check out http://github.com/peterix/dfhack/issues -- +this is also a good place to dump new ideas and/or bugs that need +fixing. + +---------------- +Layout for tools +---------------- +Tools live in the tools/ folder. There, they are split into three +categories. + +distributed + these tools get distributed with binary releases and are installed + by doing 'make install' on linux. They are supposed to be stable + and supported. Experimental, useless, buggy or untested stuff + doesn't belong here. +examples + examples are tools that aren't very useful, but show how DF and + DFHack work. They should use only DFHack API functions. No actual + hacking or 'magic offsets' are allowed. +playground + This is a catch-all folder for tools that aren't ready to be + examples or be distributed in binary releases. All new tools should + start here. They can contain actual hacking, magic values and other + nasty business. + +------------------------ +Modules - what are they? +------------------------ +DFHack uses modules to partition sets of features into manageable +chunks. A module can have both client and server side. + +Client side is the part that goes into the main library and is +generally written in C++. It is exposed to the users of DFHack. + +Server side is used inside DF and serves to accelerate the client +modules. This is written mostly in C style. + +There's a Core module that shouldn't be changed, because it defines the +basic commands like reading and writing raw data. The client parts for +the Core module are the various implementations of the Process +interface. + +A good example of a module is Maps. Named the same in both client and +server, it allows accelerating the reading of map blocks. + +Communication between modules happens by using shared memory. This is +pretty fast, but needs quite a bit of care to not break. + +------------ +Dependencies +------------ +Internal + either part of the codebase or statically linked. +External + linked as dynamic loaded libraries (.dll, .so, etc.) + +If you want to add dependencies, think twice about it. All internal +dependencies for core dfhack should be either public domain or require +attribution at most. External dependencies for tools can be either +that, or any Free Software licenses. + +Current internal dependencies +----------------------------- +tinyxml + used by core dfhack to read offset definitions from Memory.xml +md5 + an implementation of the MD5 hash algorithm. Used for identifying + DF binaries on Linux. +argstream + Allows reading terminal application arguments. GPL! + +Current external dependencies +----------------------------- +wide-character ncurses + used for the veinlook tool on Linux. +x11 libraries + used for sending key events on linux + +Build-time dependencies +----------------------- +cmake + you need cmake to generate the build system and some configuration + headers + +========================= +Memory offset definitions +========================= +The files with memory offset definitions used by dfhack can be found in the +data folder. + diff --git a/Readme.html b/Readme.html new file mode 100644 index 000000000..bebf7241f --- /dev/null +++ b/Readme.html @@ -0,0 +1,596 @@ + + + + + + + + + + +
+ + +
+

Introduction

+

DFHack is a Dwarf Fortress memory access library and a set of basic +tools using this library. The library is a work in progress, so things +might change as more tools are written for it.

+

It is an attempt to unite the various ways tools access DF memory and +allow for easier development of new tools.

+ +
+
+

Getting DFHack

+

The project is currently hosted on github, for both source and +binaries at http://github.com/peterix/dfhack

+
+

Packages

+

The library and tools are packaged for Archlinux and are available both +in AUR and the arch-games repository.

+

The package name is dfhack-git :)

+
+
+
+

Compatibility

+

DFHack works on Windows XP, Vista, 7 or any modern Linux distribution.

+

OSX is not supported due to lack of developers with a Mac.

+

Currently supported Dwarf Fortress versions are Windows and Linux.

+
+

Windows

+
+

Note

+

Windows 2000 is currently not supported due to missing OS +functionality. If you know how to easily suspend processes, you can +fix it :)

+
+

0.31.01 - 0.31.03 legacy +0.31.04 - 0.31.12 SDL

+
+
+

Linux

+

0.31.05 - 0.31.12 native. +There are missing offsets but Map tools should be OK. Linux support is +a bit lacking, I'm working on it. All supported Windows versions +running in wine can be used with native DFHack binaries.

+
+
+
+

Tools

+

All the DFHack tools are terminal programs. This might seem strange to Windows +users, but these are meant mostly as examples for developers. Still, they can +be useful and are cross-platform just like the library itself.

+
+

dfcleanmap

+

Cleans all the splatter that get scattered all over the map. +Only exception is mud. It leaves mud alone.

+
+
+

dfliquids

+

A command prompt for liquid creation and manipulation (the Moses +effect included!) Also allows painting obsidian walls directly.

+
+

Note

+

Spawning and deleting liquids can F up pathing data and +temperatures (creating heat traps). You've been warned.

+
+
+
+

dfposition

+

Prints the current DF window properties and cursor position.

+
+
+

dfprospector

+

Lists all available minerals on the map and how much of them there is.

+
+
+

dfreveal

+

Reveals the whole map, waits for input and hides it again. If you close +the tool while it waits, the map remains revealed.

+
+
+

dfunstuck

+

Use if you prematurely close any of the tools and DF appears to be +stuck.

+
+
+

dfvdig

+

Designates a whole vein for digging. Point the cursor at a vein and run +this thing :)

+
+
+

dfflows

+

A tool for checking how many liquid tiles are actively checked for +flows.

+
+
+

dfattachtest

+

Test of the process attach/detach mechanism.

+
+
+

dfsuspend

+

Test of the process suspend/resume mechanism.

+
+
+

dfexpbench

+

Just a simple benchmark of the data export speed.

+
+
+

dfdoffsets

+

Dumps the offsets for the currently running DF version into the terminal.

+
+
+

Your tool here

+

Write one ;)

+
+
+
+

Using the library as a developer

+

The library is compilable under Linux with GCC and under Windows with +MinGW32 and MSVC compilers. It is using the cmake build system. See +COMPILE for details.

+

DFHack is using the zlib/libpng license. This makes it easy to link to +it, use it in-source or add your own extensions. Contributing back to +the dfhack repository is welcome and the right thing to do :)

+

At the time of writing there's no API reference or documentation. The +code does have a lot of comments though (and getting better all the +time).

+
+

Contributing to DFHack

+

Several things should be kept in mind when contributing to DFHack.

+
+

Coding style

+

DFhack uses ANSI formatting and four spaces as indentation. Line +endings are UNIX. The files use UTF-8 encoding. Code not following this +won't make me happy, because I'll have to fix it. There's a good chance +I'll make you fix it ;)

+
+
+

How to get new code into DFHack

+

You can send patches or make a clone of the github repo and ask me on +the IRC channel to pull your code in. I'll review it and see if there +are any problems. I'll fix them if they are minor.

+

Fixes are higher in priority. If you want to work on something, but +don't know what, check out http://github.com/peterix/dfhack/issues -- +this is also a good place to dump new ideas and/or bugs that need +fixing.

+
+
+

Layout for tools

+

Tools live in the tools/ folder. There, they are split into three +categories.

+
+
distributed
+
these tools get distributed with binary releases and are installed +by doing 'make install' on linux. They are supposed to be stable +and supported. Experimental, useless, buggy or untested stuff +doesn't belong here.
+
examples
+
examples are tools that aren't very useful, but show how DF and +DFHack work. They should use only DFHack API functions. No actual +hacking or 'magic offsets' are allowed.
+
playground
+
This is a catch-all folder for tools that aren't ready to be +examples or be distributed in binary releases. All new tools should +start here. They can contain actual hacking, magic values and other +nasty business.
+
+
+
+

Modules - what are they?

+

DFHack uses modules to partition sets of features into manageable +chunks. A module can have both client and server side.

+

Client side is the part that goes into the main library and is +generally written in C++. It is exposed to the users of DFHack.

+

Server side is used inside DF and serves to accelerate the client +modules. This is written mostly in C style.

+

There's a Core module that shouldn't be changed, because it defines the +basic commands like reading and writing raw data. The client parts for +the Core module are the various implementations of the Process +interface.

+

A good example of a module is Maps. Named the same in both client and +server, it allows accelerating the reading of map blocks.

+

Communication between modules happens by using shared memory. This is +pretty fast, but needs quite a bit of care to not break.

+
+
+

Dependencies

+
+
Internal
+
either part of the codebase or statically linked.
+
External
+
linked as dynamic loaded libraries (.dll, .so, etc.)
+
+

If you want to add dependencies, think twice about it. All internal +dependencies for core dfhack should be either public domain or require +attribution at most. External dependencies for tools can be either +that, or any Free Software licenses.

+
+

Current internal dependencies

+
+
tinyxml
+
used by core dfhack to read offset definitions from Memory.xml
+
md5
+
an implementation of the MD5 hash algorithm. Used for identifying +DF binaries on Linux.
+
argstream
+
Allows reading terminal application arguments. GPL!
+
+
+
+

Current external dependencies

+
+
wide-character ncurses
+
used for the veinlook tool on Linux.
+
x11 libraries
+
used for sending key events on linux
+
+
+
+

Build-time dependencies

+
+
cmake
+
you need cmake to generate the build system and some configuration +headers
+
+
+
+
+
+
+

Memory offset definitions

+

The files with memory offset definitions used by dfhack can be found in the +data folder.

+
+
+ + diff --git a/build/generate-MSVC-2002.bat b/build/generate-MSVC-2002.bat deleted file mode 100644 index 4f6b68065..000000000 --- a/build/generate-MSVC-2002.bat +++ /dev/null @@ -1,4 +0,0 @@ -mkdir build-real -cd build-real -cmake ..\.. -G"Visual Studio 7" -pause \ No newline at end of file diff --git a/build/generate-MSVC-2003.bat b/build/generate-MSVC-2003.bat deleted file mode 100644 index c45e02e4f..000000000 --- a/build/generate-MSVC-2003.bat +++ /dev/null @@ -1,4 +0,0 @@ -mkdir build-real -cd build-real -cmake ..\.. -G"Visual Studio 7 .NET 2003" -pause \ No newline at end of file diff --git a/output/Memory-40d.xml b/data/Memory-40d.xml similarity index 100% rename from output/Memory-40d.xml rename to data/Memory-40d.xml diff --git a/data/Memory-ng.xml b/data/Memory-ng.xml new file mode 100644 index 000000000..294886988 --- /dev/null +++ b/data/Memory-ng.xml @@ -0,0 +1,1665 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + TODO: Parse this and turn it into Job tags + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+ +
+ + + + + + .,:rsr, + :2;,;r2A@@5 + @2::s5A#@@@ @r. . + sd;:riXA#@@ :@@@Gir;;AS9 + Bs::sS3A#@2 @@#AhXirsS#; + iHrLr5d#@@@ .@#95sr;;rie + i*' `*@3 @@A2sr;:;r#5 + :..:rll: @@A5sr::r3@ + @Hr;iZ#@@@@ `:rr;;;;: + S@r.;i2#@@@ @s. .. + @2::ri2A@@# B@G2ir:...5i + :@r,r3X##@@ @G5sr:..,:A + .@Ar;;rSB@@# H#2sr;,..,is + .' `* ,@ASs;:..,:B + ;rr;:,..,:. + `''' + W I N D O W S + and + W I N E + + + + + + + + + + + + +
+ + + + + + + + + + + + + + +
+
+
+
+
+ + +
+
+
+
+ + +
+
+
+
+
+
+
+
+
+
+
+
+ + + + + + + + + + + + + + + +
+ + + + + +
+ + + + + +
+
+ + + + + vector + vector + + + +
+
+
+ + + + + + + + + + + + + + + + + + + + + the skill that will be increased at the end of the mood (or not) + + seems to be indexes in the list of possible colors defined in the raws for each group + + + + + + + + + + + + + + + + + Incrementaly assigned + seems to be just like the old occupations + + + like mood materials, 0=bars, 4=stone, 5=wood, 57=cloth, 54=leather ... + subsubtype ? + subtype ? + index of material (for example, 2 is for silver) + set only for shell / bone mood requirements ? + + + + +
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+
+ + + +
+ + + +
+ +
+ + + + +
+ + + + + + + + + + + + + + + + WORLD: 0x0165c1d0 ? + +
Was 0x17f5ab8 + + +
+
+
+
+
+
+
+
+
+
+
+
+ + +
+ + +
+ + + +
+
+ + + +
+ + + + + + + + + + + +
+
+
+
+
+
+ +
+ + +
+ + + +
+ + + +
+ + +
+
+ + +
+ + + +
+
+ + +
+ List of offsets in the VTable : + + + + + + + + + + (in the vtable) + + +
+
+ + + + + + + + +
+
+
+ + +
+
+
+
+
+
+ +
+
+
+ + + +
+
+ + +
+
+ + +
+
+
+
+
+
+
+
+
+
+
+
+ + +
+ + +
+ + + +
+
+ + + +
+ + +
+ + +
+ + +
+ + +
+
+
+
+
+ + + + + + + + +
+
BOGUS! + + +
+
+
+
+
+ + +
+
+ + + + + + + +
+ + + + + + + +
+
+
+
+
+ + + + + + + + +
+ + + + + + + + +
+ + +
+
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+ + + + + + + + + .-"""-. + ' \ + |,. ,-. | _________________________ + |()L( ()| | \ \ + |,' `".| | /_ Argh !!! \ + |.___.',| ` \________________________\ + .j `--"' ` `. + / ' ' \ + / / ` `. + / / ` . + / / l | + . , L I N U X | | + ,"`. .| | + _.' ``. | `..-'l + | `.`, | `. + | `. __.j ) + |__ |--""___| ,-' + `"--...,+"""" `._,.-' + + + + + + + +
+ + + + + + + + + + + + + + +
+
+
+
+
+ + +
+
+
+
+ + +
+
+
+
+
+
+
+
+
+
+
+
+ + + + + + + + + + + + + + +
+ + + + + +
+ + + + + +
+
+ + + + + vector + vector + + + +
+
+
+ + + + + + + + + + + + + + CHMOD + VERIFY! + + + chmod + + + + + + + + + + + + + + + CHMOD + + + + + Incrementaly assigned + seems to be just like the old occupations + + + like mood materials, 0=bars, 4=stone, 5=wood, 57=cloth, 54=leather ... + subsubtype ? + subtype ? + index of material (for example, 2 is for silver) + set only for shell / bone mood requirements ? + + + + +
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ + + +
+ + + +
+
+ + + +
+ + + +
+
+ + + + + + +
+ +
VERIFIED + + Creatures + ========= + WORLD + 0x139E0 + 0x92d79d4 + 0x92d79e0 = real one? seems like it + 0x92d7a10 + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + + + + + + + + +
VERIFIED +
VERIFIED +
VERIFIED +
VERIFIED + + + + + + + + diff --git a/output/Memory.xml b/data/Memory.xml old mode 100755 new mode 100644 similarity index 91% rename from output/Memory.xml rename to data/Memory.xml index cf5a8d886..fd0072623 --- a/output/Memory.xml +++ b/data/Memory.xml @@ -1485,20 +1485,23 @@ map_data_1b60_offset 0x1B9c Castes ====== - 0x70 - 0x64 - 0x68 0x51C - 0xACC 0x654 + 0xACC - Body Parts - ========== - 0x0 - 0x1C - 0x44 - 0x78 - 0x90 + Color Mods + ========== + 0x70 + 0x64 + 0x68 + + Body Parts + ========== + 0x0 + 0x1C + 0x44 + 0x78 + 0x90 Materials ========= @@ -1680,7 +1683,45 @@ map_data_1b60_offset 0x1B9c map size Y: 0x16c4b14 --> + rebase="0xD030" + + + 1a85839ab03df082974dc5629d3fbc26 + 0x4C3897C0 +
0xaff2d8
+
0x16D33CC
+
0x16D33FC
+ 0x4c + Creatures + ========= +
0x168E73C
+
0x014b9f1c
+ 0X1F4 + 0x4AC + 0x64c + 0x71c + 0x7Bc + 0x0788 + 0x07A0 + 0x87c +
+ + 349d1ad6eda7b6c5e87f8e4726a0999a + 0x4C398089 + + + 552cfa417fd131204ebfee66aefc4adb + 0x4C496D93 +
0xB062D8
+
0xe81114
VERIFIED +
0xeAF1E8
VERIFIED +
0xeAF1C4
VERIFIED +
+ + f0459165a426a9f2dd8d957e9fa7f01d + 0x4C4C32E7 + .-"""-. ' \ |,. ,-. | _________________________ @@ -1698,9 +1739,8 @@ map_data_1b60_offset 0x1B9c | `.`, | `. | `. __.j ) |__ |--""___| ,-' - `"--...,+"""" `._,.-' - - + `"--...,+"""" `._,.-' + @@ -1750,48 +1790,38 @@ map_data_1b60_offset 0x1B9c Creature offsets ================ - 0x0 - 0x6c - 0x3c * - 0x44 * - 0x90 - 0x8C * - 0x90 * - 0x110 - 0xA6 * - 0x114 - 0XB4 * - 0X1F4 - 0X21C - - 0x18C * - 0x19C * - 0x1A0 * - 0x464 - 0x390 from chmod - 0x394 the skill that will be increased at the end of the mood (or not) - 0x604 - 0x6D4 - 0x774 - 0x0740 - 0x0758 - 0x834 + 0x0 VERIFIED + 0x3c CHMOD + 0x40 CHMOD + 0x44 CHMOD + 0x90 BAD!! + 0x8C CHMOD + 0x90 CHMOD + 0xA4 VERIFY + 0xA6 CHMOD + 0xA8 CHMOD + 0xB4 VERIFY! + 0X144 CHMOD + 0x18C VERIFY! + 0x19C VERIFY! + 0x1A0 VERIFY! + 0x464 BAD! + 0x258 CHMOD + 0x394 VERIFY! + the skill that will be increased at the end of the mood (or not) + 0x604 BAD! + 0x6D4 BAD! + 0x51C CHMOD + 0x0500 CHMOD + 0x0758 BAD! + 0x5AC CHMOD Souls ===== 0x0 - 0x1F4 - 0x224 - 0x88 - - Castes - ====== - 0x70 - 0x64 - 0x68 - 0x51C - 0xACC - 0x654 + 0x1C4 CHMOD + 0x1DC CHMOD + 0x88 BAD! Body Parts ========== @@ -1829,6 +1859,14 @@ map_data_1b60_offset 0x1B9c 0x20 VERIFIED 0x36 LOOKS OK + Castes + ====== + 0x70 + 0x64 + 0x68 + 0x51C + 0xACC + 0x654 + + 4f1f988bc1b425d4193d3d8b7b0579a5 + stealing memory... + looking for vectors... + ------------------- + !!LANGUAGE TABLES!! + ------------------- + translation vector: 0x932bf2c + lang vector: 0x932bf14 + word table offset: 0x1c + ------------- + !!MATERIALS!! + ------------- + inorganics: + 0x932bda8 + organics: + 0x932bdb4 + trees: + 0x932bdd8 + plants: + 0x932bdc0 + color descriptors: + 0x93302b8 + Amber color:0xaf842e0 + all descriptors: + 0x93302d0 + toad-first creature types: + 0x932be54 + all creature types: + 0x932be2c + 0x932be54 + Toad: 0xb076f88 + Toad: rawname = 0x0 + Toad: character (not reliable) = 0x20 + Toad: caste vector = 0x60 + Toad: extract? vector = 0x18f4 + Toad: colors = 0x36 + + + 3e7bea269018a6fb88ef53715685aa64 + ------------------- + !!LANGUAGE TABLES!! + ------------------- + translation vector: 0x932bf2c + lang vector: 0x932bf14 + word table offset: 0x1c + ------------- + !!MATERIALS!! + ------------- + inorganics: + 0x932bda8 + organics: + 0x932bdb4 + trees: + 0x932bdd8 + plants: + 0x932bdc0 + color descriptors: + 0x93302b8 + Amber color:0xcc3a770 + all descriptors: + 0x93302d0 + toad-first creature types: + 0x932be54 + elephant-first creature types: + all creature types: + 0x932be2c + 0x932be54 + Toad: 0xc77d798 + Toad: rawname = 0x0 + Toad: character (not reliable) = 0x20 + Toad: caste vector = 0x60 + Toad: extract? vector = 0x18f4 + Toad: colors = 0x36 + + Buildings + ========= +
0x92eb068
+ 0xE0 + +
0x93302e8
+ 0x4 + 0x8 + + + + + + +
+ + + 7b04ad536b8b657588ac209a7f95e1d1 +
0x8cf7a58
VERIFIED +
0x8cf7a5C
VERIFIED +
0x8cf7a60
VERIFIED +
0x8b3b328
VERIFIED + ------------------- + !!LANGUAGE TABLES!! + ------------------- + translation vector: 0x9348f4c + lang vector: 0x9348f34 + word table offset: 0x1c + ------------- + !!MATERIALS!! + ------------- + inorganics: + 0x9348dc8 + organics: + 0x9348dd4 + trees: + 0x9348df8 + plants: + 0x9348de0 + color descriptors: + 0x934d2d8 + Amber color:0xac014c0 + all descriptors: + 0x934d2f0 + toad-first creature types: + 0x9348e74 + all creature types: + 0x9348e4c + 0x9348e74 + Toad: 0xadae390 + Toad: rawname = 0x0 + Toad: character (not reliable) = 0x20 + Toad: caste vector = 0x60 + Toad: extract? vector = 0x18f4 + Toad: colors = 0x36 +
+ + e79cead03187ecb692961b316b7cdcd4 + diff --git a/doc/CMakeLists.txt b/doc/CMakeLists.txt index 67c7cd6a5..1ced1fd7b 100644 --- a/doc/CMakeLists.txt +++ b/doc/CMakeLists.txt @@ -38,6 +38,7 @@ IF(DOXYGEN_FOUND) # the Doxyfile with a REGEX REPLACE (see below) SET( DOXYGEN_SOURCE_DIR # "${CMAKE_SOURCE_DIR}/library" + "${CMAKE_SOURCE_DIR}/doc/index.dxgen" "${CMAKE_SOURCE_DIR}/library/include" "${CMAKE_SOURCE_DIR}/library/include/dfhack" "${CMAKE_SOURCE_DIR}/library/include/dfhack/modules" diff --git a/doc/Doxyfile.in b/doc/Doxyfile.in index adb67ed94..7c4302fa2 100644 --- a/doc/Doxyfile.in +++ b/doc/Doxyfile.in @@ -8,7 +8,7 @@ PROJECT_NUMBER = @DFHACK_VERSION@ OUTPUT_DIRECTORY = . CREATE_SUBDIRS = NO OUTPUT_LANGUAGE = English -USE_WINDOWS_ENCODING = YES +USE_WINDOWS_ENCODING = NO BRIEF_MEMBER_DESC = YES REPEAT_BRIEF = YES ABBREVIATE_BRIEF = @@ -31,7 +31,7 @@ SUBGROUPING = YES #--------------------------------------------------------------------------- # Build related configuration options #--------------------------------------------------------------------------- -EXTRACT_ALL = YES +EXTRACT_ALL = NO EXTRACT_PRIVATE = NO EXTRACT_STATIC = NO EXTRACT_LOCAL_CLASSES = NO @@ -69,7 +69,7 @@ WARN_LOGFILE = # configuration options related to the input files #--------------------------------------------------------------------------- INPUT = @CMAKE_DOXYGEN_INPUT_LIST@ -FILE_PATTERNS = *.cpp *.h +FILE_PATTERNS = *.cpp *.h *.dxgen RECURSIVE = NO EXCLUDE = EXCLUDE_SYMLINKS = NO @@ -102,10 +102,6 @@ IGNORE_PREFIX = GENERATE_HTML = YES HTML_OUTPUT = html HTML_FILE_EXTENSION = .html -# this code is needed if you want to build this doxygen docu for a static wep page as http://libnoise.sourceforge.net/ -#HTML_HEADER = htmldata/templateheader.html -#HTML_FOOTER = htmldata/templatefooter.html -#HTML_STYLESHEET = htmldata/doxygen.css HTML_ALIGN_MEMBERS = YES GENERATE_HTMLHELP = NO diff --git a/doc/index.dxgen b/doc/index.dxgen new file mode 100644 index 000000000..d356131f6 --- /dev/null +++ b/doc/index.dxgen @@ -0,0 +1,73 @@ +/******************************************************************************* +www.sourceforge.net/projects/dfhack +Copyright (c) 2009 Petr Mrázek (peterix) + +This software is provided 'as-is', without any express or implied +warranty. In no event will the authors be held liable for any +damages arising from the use of this software. + +Permission is granted to anyone to use this software for any +purpose, including commercial applications, and to alter it and +redistribute it freely, subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must +not claim that you wrote the original software. If you use this +software in a product, an acknowledgment in the product documentation +would be appreciated but is not required. + +2. Altered source versions must be plainly marked as such, and +must not be misrepresented as being the original software. + +3. This notice may not be removed or altered from any source +distribution. +*/ + +/*! \page index +
+\htmlonly +

DFHack

+ +\endhtmlonly +
+ +

Introduction

+DFHack is a Dwarf Fortress memory access library and a set of basic tools using +this library. The library is a work in progress, so things might change as more +tools are written for it. + +It is an attempt to unite the various ways tools access DF memory and allow for +easier development of new tools. In general, you can use it to move memory +objects in and out of Dwarf Fortress really fast, regardless of DF version or OS. + +First part of the manual deals with the basic of using DFHack as a library: +
    +PLACEHOLDER TERRITORY! + +
  • Section \ref blah discusses some weird stuff + this is a link +
  • Section \ref starting tells you how to cromulate at a distance! +
+ +Second part has some details on DFHack development: + +
    +
  • Section \ref starting tells you how to cromulate at a distance! +
+ +The third part describes how to use the supported DFHack utilities + +
    +
  • Section \ref dfattachtest shows how to use the \c dfattachtest program +
  • Section \ref dfcleanmap shows how to use the \c dfcleanmap program +
  • Section \ref dfexpbench shows how to use the \c dfexpbench program +
  • Section \ref dfflows shows how to use the \c dfflows program +
  • Section \ref dfliquids shows how to use the \c dfliquids program +
  • Section \ref dfprobe shows how to use the \c dfprobe program +
  • Section \ref dfprospector shows how to use the \c dfprospector program +
  • Section \ref dfreveal shows how to use the \c dfreveal program +
  • Section \ref dfsuspend shows how to use the \c dfsuspend program +
  • Section \ref dfunstuck shows how to use the \c dfunstuck program +
  • Section \ref dfvdig shows how to use the \c dfvdig program +
+*/ + diff --git a/fixTexts.sh b/fixTexts.sh new file mode 100755 index 000000000..30ee0c52c --- /dev/null +++ b/fixTexts.sh @@ -0,0 +1,3 @@ +#!/bin/bash +rst2html README.rst > Readme.html +rst2html COMPILE.rst > Compile.html diff --git a/library/CMakeLists.txt b/library/CMakeLists.txt index f036a7a44..d66f0af51 100644 --- a/library/CMakeLists.txt +++ b/library/CMakeLists.txt @@ -54,6 +54,11 @@ include/dfhack/modules/WindowIO.h include/dfhack/modules/World.h ) +SET(PROJECT_C_HDRS +include/dfhack-c/DFTypes_C.h +include/dfhack-c/DFContext_C.h +) + SET(PROJECT_SRCS DFMemInfo.cpp DFMemInfoManager.cpp @@ -61,8 +66,6 @@ DFContextManager.cpp DFContext.cpp DFProcessEnumerator.cpp ContextShared.cpp -DFContext_C.cpp -DFTypes_C.cpp depends/md5/md5.cpp depends/md5/md5wrapper.cpp @@ -83,6 +86,11 @@ modules/Position.cpp modules/Translation.cpp modules/Vegetation.cpp modules/World.cpp +) + +SET(PROJECT_C_SRCS +DFContext_C.cpp +DFTypes_C.cpp modules/Buildings_C.cpp modules/Constructions_C.cpp @@ -126,6 +134,11 @@ ELSE(UNIX) LIST(APPEND PROJECT_SRCS ${PROJECT_SRCS_WINDOWS}) ENDIF(UNIX) +IF(BUILD_DFHACK_C_BINDIGS) + LIST(APPEND PROJECT_HDRS ${PROJECT_C_HDRS}) + LIST(APPEND PROJECT_SRCS ${PROJECT_C_SRCS}) +ENDIF(BUILD_DFHACK_C_BINDIGS) + SET_SOURCE_FILES_PROPERTIES( ${PROJECT_HDRS} PROPERTIES HEADER_FILE_ONLY TRUE ) LIST(APPEND PROJECT_SRCS ${PROJECT_HDRS}) @@ -164,6 +177,20 @@ SET_TARGET_PROPERTIES(dfhack PROPERTIES DEBUG_POSTFIX "-debug" ) TARGET_LINK_LIBRARIES(dfhack ${PROJECT_LIBS}) +if(MSVC) + # This is a MSVC hack used for copying files into the target directory + # of build target set in MSVC. + # It exploits the fact that MSVC has some variables in .vcproj files, much like cmake does here. + # + # So, $(TargetDir) is ignored by cmake, and replaced with the actual output directory by MSVC + ADD_CUSTOM_COMMAND(TARGET dfhack POST_BUILD + COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_SOURCE_DIR}/data/Memory.xml $(TargetDir)/Memory.xml + ) +else(MSVC) + # Just put the file in the output directory on Linux and Mac + configure_file(${CMAKE_SOURCE_DIR}/data/Memory-ng.xml ${DATA_OUTPUT_PATH}/Memory.xml COPYONLY) +endif(MSVC) + IF(UNIX) install(TARGETS dfhack LIBRARY DESTINATION lib) install(FILES ${CMAKE_SOURCE_DIR}/output/Memory.xml DESTINATION share/dfhack) diff --git a/library/DFContext.cpp b/library/DFContext.cpp index 41ac6e333..15939dee9 100644 --- a/library/DFContext.cpp +++ b/library/DFContext.cpp @@ -173,6 +173,10 @@ bool Context::AsyncSuspend() bool Context::Resume() { + for(int i = 0 ; i < d->allModules.size(); i++) + { + d->allModules[i]->OnResume(); + } return d->p->resume(); } bool Context::ForceResume() diff --git a/library/DFMemInfo.cpp b/library/DFMemInfo.cpp index e8cee4b0c..ca7c58d03 100644 --- a/library/DFMemInfo.cpp +++ b/library/DFMemInfo.cpp @@ -739,31 +739,40 @@ std::string memory_info::getMood(const uint32_t moodID) std::string memory_info::PrintOffsets() { ostringstream ss; - ss << "version: " << getVersion(); + ss << "" << endl; switch (getOS()) { case OS_LINUX: - ss << " LINUX" << endl; - ss << "md5 hash: " << getString("md5") << endl; + ss << "" << endl; break; case OS_WINDOWS: - ss << " WINDOWS" << endl; - ss << "PE timestamp: " << hex << "0x" << getHexValue("pe_timestamp") << endl; - ss << "md5 hash: " << getString("md5") << endl; + ss << "" << endl; + ss << "" << endl; break; default: ss << " UNKNOWN" << endl; } - + ss << "" << endl; map::const_iterator iter; for(iter = d->addresses.begin(); iter != d->addresses.end(); iter++) { - ss << "address " << (*iter).first << " : " << hex << "0x" << (*iter).second << endl; + ss << "
" << endl; } map::const_iterator iter2; for(iter2 = d->offsets.begin(); iter2 != d->offsets.end(); iter2++) { - ss << "offset " << (*iter2).first << " : " << hex << "0x" << (*iter2).second << endl; + ss << " " << endl; + } + for(iter = d->hexvals.begin(); iter != d->hexvals.end(); iter++) + { + ss << " " << endl; + } + map::const_iterator iter3; + for(iter3 = d->strings.begin(); iter3 != d->strings.end(); iter3++) + { + ss << " " << endl; } + ss << "" << endl; + ss << "" << endl; return ss.str(); } \ No newline at end of file diff --git a/library/DFMemInfoManager.cpp b/library/DFMemInfoManager.cpp index 48ea3f8a2..cc4c5de4a 100644 --- a/library/DFMemInfoManager.cpp +++ b/library/DFMemInfoManager.cpp @@ -154,9 +154,9 @@ void MemInfoManager::ParseEntry (TiXmlElement* entry, memory_info* mem, map Value(); const char *cstr_name = pMemEntry->Attribute("name"); const char *cstr_value = pMemEntry->GetText(); - - if(!cstr_value) - cstr_value = pMemEntry->Attribute("id"); + + if(!cstr_value) + cstr_value = pMemEntry->Attribute("id"); // check for missing parts string type, name, value; diff --git a/library/DFTypes_C.cpp b/library/DFTypes_C.cpp index cef3190bd..4a4de9f34 100644 --- a/library/DFTypes_C.cpp +++ b/library/DFTypes_C.cpp @@ -23,6 +23,7 @@ distribution. */ #include "dfhack/DFIntegers.h" +#include "dfhack/DFTileTypes.h" #include #include "string.h" #include diff --git a/library/include/dfhack/DFModule.h b/library/include/dfhack/DFModule.h index 95f8877a0..d4c840b64 100644 --- a/library/include/dfhack/DFModule.h +++ b/library/include/dfhack/DFModule.h @@ -36,9 +36,18 @@ namespace DFHack ~Module(){}; virtual bool Start(){return true;};// default start... virtual bool Finish() = 0;// everything should have a Finish() - virtual bool doFinishOnResume(){return true;}; // should Context call Finish when Resume is called? - virtual bool doFinishOnMapChange(){return false;}; // Finish when map change is detected? - virtual bool doFinishOnDetach(){return false;}; // Finish in Context::Detach? + // should Context call Finish when Resume is called? + virtual bool OnResume() + { + Finish(); + return true; + }; + // Finish when map change is detected? + // TODO: implement + virtual bool OnMapChange() + { + return false; + }; }; } #endif //MODULE_H_INCLUDED diff --git a/library/include/dfhack/modules/Creatures.h b/library/include/dfhack/modules/Creatures.h index 1ba4d36af..1686be281 100644 --- a/library/include/dfhack/modules/Creatures.h +++ b/library/include/dfhack/modules/Creatures.h @@ -380,7 +380,6 @@ namespace DFHack int32_t GetDwarfCivId ( void ); /* Write Functions */ - // write labors of a creature (for Dwarf Therapist) bool WriteLabors(const uint32_t index, uint8_t labors[NUM_CREATURE_LABORS]); bool WriteHappiness(const uint32_t index, const uint32_t happinessValue); bool WriteFlags(const uint32_t index, const uint32_t flags1, const uint32_t flags2); @@ -390,6 +389,7 @@ namespace DFHack bool WriteTraits(const uint32_t index, const t_soul &soul); bool WriteMood(const uint32_t index, const uint16_t mood); bool WriteMoodSkill(const uint32_t index, const uint16_t moodSkill); + bool WriteJob(const t_creature * furball, std::vector const& mat); bool WritePos(const uint32_t index, const t_creature &creature); bool WriteCiv(const uint32_t index, const int32_t civ); diff --git a/library/include/dfhack/modules/Materials.h b/library/include/dfhack/modules/Materials.h index aac990751..f3ac6425c 100644 --- a/library/include/dfhack/modules/Materials.h +++ b/library/include/dfhack/modules/Materials.h @@ -145,6 +145,7 @@ namespace DFHack void ReadAllMaterials(void); + std::string getType(t_material & mat); std::string getDescription(t_material & mat); private: class Private; diff --git a/library/include/dfhack/modules/Position.h b/library/include/dfhack/modules/Position.h index 06fc23336..376208df2 100644 --- a/library/include/dfhack/modules/Position.h +++ b/library/include/dfhack/modules/Position.h @@ -17,6 +17,16 @@ namespace DFHack int32_t z; }; + struct t_screen + { + uint8_t symbol; + uint8_t foreground; + uint8_t background; + uint8_t bright; + uint8_t gtile; + uint8_t grayscale; + }; + class DFContextShared; class DFHACK_EXPORT Position : public Module { @@ -44,6 +54,11 @@ namespace DFHack */ bool getWindowSize(int32_t & width, int32_t & height); + /* + * Screen tiles + */ + bool getScreenTiles(int32_t width, int32_t height, t_screen screen[]); + private: struct Private; Private *d; diff --git a/library/modules/Creatures.cpp b/library/modules/Creatures.cpp index a467a9e6b..2e9e319cd 100644 --- a/library/modules/Creatures.cpp +++ b/library/modules/Creatures.cpp @@ -202,7 +202,7 @@ bool Creatures::ReadCreature (const int32_t index, t_creature & furball) // mood stuff furball.mood = (int16_t) p->readWord (temp + offs.mood_offset); furball.mood_skill = p->readWord (temp + offs.mood_skill_offset); - d->d->readName(furball.artifact_name, temp + offs.artifact_name_offset); + d->d->readName(furball.artifact_name, temp + offs.artifact_name_offset); // custom profession p->readSTLString(temp + offs.custom_profession_offset, furball.custom_profession, sizeof(furball.custom_profession)); @@ -519,6 +519,27 @@ bool Creatures::WriteMoodSkill(const uint32_t index, const uint16_t moodSkill) return true; } +bool Creatures::WriteJob(const t_creature * furball, std::vector const& mat) +{ + unsigned int i; + if(!d->Inited) return false; + if(!furball->current_job.active) return false; + Process * p = d->owner; + memory_info * minfo = d->d->offset_descriptor; + + DfVector cmats(p, furball->current_job.occupationPtr + minfo->getOffset("job_materials_vector")); + + for(i=0;iwriteWord(cmats[i] + minfo->getOffset("job_material_maintype"), mat[i].itemType); + p->writeWord(cmats[i] + minfo->getOffset("job_material_sectype1"), mat[i].subType); + p->writeWord(cmats[i] + minfo->getOffset("job_material_sectype2"), mat[i].subIndex); + p->writeDWord(cmats[i] + minfo->getOffset("job_material_sectype3"), mat[i].index); + p->writeDWord(cmats[i] + minfo->getOffset("job_material_flags"), mat[i].flags); + } + return true; +} + bool Creatures::WritePos(const uint32_t index, const t_creature &creature) { if(!d->Started) diff --git a/library/modules/Maps_C.cpp b/library/modules/Maps_C.cpp index 0700e0a9a..09a7dc065 100644 --- a/library/modules/Maps_C.cpp +++ b/library/modules/Maps_C.cpp @@ -308,7 +308,7 @@ t_frozenliquidvein* Maps_ReadFrozenVeins(DFHackObject* maps, uint32_t x, uint32_ { if(maps != NULL) { - if(alloc_frozenliquidvein_callback == NULL) + if(alloc_frozenliquidvein_buffer_callback == NULL) return NULL; vector veins; @@ -339,7 +339,7 @@ t_spattervein* Maps_ReadSpatterVeins(DFHackObject* maps, uint32_t x, uint32_t y, { if(maps != NULL) { - if(alloc_spattervein_callback == NULL) + if(alloc_spattervein_buffer_callback == NULL) return NULL; vector veins; diff --git a/library/modules/Materials.cpp b/library/modules/Materials.cpp index 481d23568..fe8e3f339 100644 --- a/library/modules/Materials.cpp +++ b/library/modules/Materials.cpp @@ -258,24 +258,24 @@ bool Materials::ReadCreatureTypes (void) bool Materials::ReadOthers(void) { - Process * p = d->owner; - uint32_t matBase = p->getDescriptor()->getAddress ("mat_other"); - uint32_t i = 0; - uint32_t ptr; + Process * p = d->owner; + uint32_t matBase = p->getDescriptor()->getAddress ("mat_other"); + uint32_t i = 0; + uint32_t ptr; - other.clear(); + other.clear(); - while(1) - { - t_matglossOther mat; - ptr = p->readDWord(matBase + i*4); - if(ptr==0) - break; - p->readSTLString(ptr, mat.rawname, sizeof(mat.rawname)); - other.push_back(mat); - i++; - } - return true; + while(1) + { + t_matglossOther mat; + ptr = p->readDWord(matBase + i*4); + if(ptr==0) + break; + p->readSTLString(ptr, mat.rawname, sizeof(mat.rawname)); + other.push_back(mat); + i++; + } + return true; } bool Materials::ReadDescriptorColors (void) @@ -470,3 +470,53 @@ std::string Materials::getDescription(t_material & mat) return out; } +//type of material only so we know which vector to retrieve +std::string Materials::getType(t_material & mat) +{ + if((mat.subIndex<419) || (mat.subIndex>618)) + { + if((mat.subIndex<19) || (mat.subIndex>218)) + { + if(mat.subIndex) + { + if(mat.subIndex>0x292) + { + return "unknown"; + } + else + { + if(mat.subIndex>=this->other.size()) + { + if(mat.subIndex<0) + return "any"; + + if(mat.subIndex>=this->raceEx.size()) + return "unknown"; + + return "racex"; + } + else + { + if (mat.index==-1) + return "other"; + else + return "other derivate"; + } + } + } + else + return "inorganic"; + } + else + { + if (mat.index>=this->raceEx.size()) + return "unknown"; + + return "racex extract"; + } + } + else + { + return "organic"; + } +} \ No newline at end of file diff --git a/library/modules/Position.cpp b/library/modules/Position.cpp index 0d3ae1819..ab3fccba3 100644 --- a/library/modules/Position.cpp +++ b/library/modules/Position.cpp @@ -41,12 +41,15 @@ struct Position::Private uint32_t hotkey_mode_offset; uint32_t hotkey_xyz_offset; uint32_t hotkey_size; + + uint32_t screen_tiles_ptr_offset; DFContextShared *d; Process * owner; bool Inited; bool Started; bool StartedHotkeys; + bool StartedScreen; }; Position::Position(DFContextShared * d_) @@ -55,7 +58,7 @@ Position::Position(DFContextShared * d_) d->d = d_; d->owner = d_->p; d->Inited = true; - d->StartedHotkeys = d->Started = false; + d->StartedHotkeys = d->Started = d->StartedScreen = false; memory_info * mem; try { @@ -66,7 +69,10 @@ Position::Position(DFContextShared * d_) d->cursor_xyz_offset = mem->getAddress ("cursor_xyz"); d->window_dims_offset = mem->getAddress ("window_dims"); d->Started = true; - + } + catch(exception &){}; + try + { d->hotkey_start = mem->getAddress("hotkey_start"); d->hotkey_mode_offset = mem->getOffset ("hotkey_mode"); d->hotkey_xyz_offset = mem->getOffset("hotkey_xyz"); @@ -74,6 +80,12 @@ Position::Position(DFContextShared * d_) d->StartedHotkeys = true; } catch(exception &){}; + try + { + d->screen_tiles_ptr_offset = mem->getAddress ("screen_tiles_pointer"); + d->StartedScreen = true; + } + catch(exception &){}; } Position::~Position() @@ -158,3 +170,33 @@ bool Position::getWindowSize (int32_t &width, int32_t &height) return true; } + +bool Position::getScreenTiles (int32_t width, int32_t height, t_screen screen[]) +{ + if(!d->Inited) return false; + if(!d->StartedScreen) return false; + + uint32_t screen_addr; + d->owner->read (d->screen_tiles_ptr_offset, sizeof(uint32_t), (uint8_t *) screen_addr); + + uint8_t* tiles = new uint8_t[width*height*4/* + 80 + width*height*4*/]; + + d->owner->read (screen_addr, (width*height*4/* + 80 + width*height*4*/), (uint8_t *) tiles); + + for(int32_t iy=0; iy +#include +#include "memxmlModel.h" + +dfedit::dfedit(QWidget *parent): QMainWindow(parent) +{ + ui.setupUi(this); + connect(ui.actionOpen,SIGNAL(triggered(bool)),this,SLOT(slotOpen(bool))); + connect(ui.actionQuit,SIGNAL(triggered(bool)),this,SLOT(slotQuit(bool))); + connect(ui.actionRun_DF,SIGNAL(triggered(bool)),this,SLOT(slotRunDF(bool))); + connect(ui.actionSave,SIGNAL(triggered(bool)),this,SLOT(slotSave(bool))); + connect(ui.actionSave_As,SIGNAL(triggered(bool)),this,SLOT(slotSaveAs(bool))); + connect(ui.actionSetup_DF_executables,SIGNAL(triggered(bool)),this,SLOT(slotSetupDFs(bool))); + ui.actionOpen->setIcon(QIcon::fromTheme("document-open")); + ui.actionOpen->setIconText(tr("Open")); + ui.actionSave->setIcon(QIcon::fromTheme("document-save")); + ui.actionSave->setIconText(tr("Save")); + ui.actionSave_As->setIcon(QIcon::fromTheme("document-save-as")); + ui.actionSave_As->setIconText(tr("Save As")); + ui.actionRun_DF->setIcon(QIcon::fromTheme("system-run")); + ui.actionRun_DF->setIconText(tr("Run DF")); + ui.actionQuit->setIcon(QIcon::fromTheme("application-exit")); + ui.actionQuit->setIconText(tr("Run DF")); +} + +dfedit::~dfedit() +{} + +void dfedit::slotOpen(bool ) +{ + QFileDialog fd(this,tr("Locate the Memoxy.xml file")); + fd.setNameFilter(tr("Memory definition (*.xml)")); + fd.setFileMode(QFileDialog::ExistingFile); + fd.setAcceptMode(QFileDialog::AcceptOpen); + int result = fd.exec(); + if(result == QDialog::Accepted) + { + QStringList files = fd.selectedFiles(); + QString fileName = files[0]; + QDomDocument doc("memxml"); + QFile file(fileName); + if(!file.open(QIODevice::ReadOnly)) + { + return; + } + if(!doc.setContent(&file)) + { + file.close(); + return; + } + mod = new MemXMLModel(doc,this); + ui.entryView->setModel(mod); + file.close(); + } +} + +void dfedit::slotQuit(bool ) +{ + close(); +} + +void dfedit::slotSave(bool ) +{ + // blah +} + +void dfedit::slotRunDF(bool ) +{ + // blah +} + +void dfedit::slotSaveAs(bool ) +{ + QFileDialog fd(this,tr("Choose file to save as...")); + fd.setNameFilter(tr("Memory definition (*.xml)")); + fd.setFileMode(QFileDialog::AnyFile); + fd.selectFile("Memory.xml"); + fd.setAcceptMode(QFileDialog::AcceptSave); + int result = fd.exec(); + if(result == QDialog::Accepted) + { + QStringList files = fd.selectedFiles(); + QString file = files[0]; + qDebug() << "File:" << file; + } +} + +void dfedit::slotSetupDFs(bool ) +{ + // dialog showing all the versions in Memory.xml that lets the user set up ways to run those versions... + // currently unimplemented +} + +#include "dfedit.moc" diff --git a/offsetedit/src/dfedit.h b/offsetedit/src/dfedit.h new file mode 100644 index 000000000..2a30ef7aa --- /dev/null +++ b/offsetedit/src/dfedit.h @@ -0,0 +1,26 @@ +#ifndef dfedit_H +#define dfedit_H + +#include +#include "ui_main.h" +#include "memxmlModel.h" + +class dfedit : public QMainWindow +{ + Q_OBJECT +public: + dfedit(QWidget *parent = 0); + virtual ~dfedit(); + +private: + Ui::MainWindow ui; + MemXMLModel * mod; +public slots: + void slotOpen(bool); + void slotQuit(bool); + void slotSave(bool); + void slotSaveAs(bool); + void slotRunDF(bool); + void slotSetupDFs(bool); +}; +#endif // dfedit_H diff --git a/offsetedit/src/gui/dIsForDwarf.svg b/offsetedit/src/gui/dIsForDwarf.svg new file mode 100644 index 000000000..51b7acf0f --- /dev/null +++ b/offsetedit/src/gui/dIsForDwarf.svg @@ -0,0 +1,1621 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + D + D + + + + + + X + + + + + X + + + + + + + + + + + + + 32 x 32 + 16 x 16 + X + + + + + X + + + + + + diff --git a/offsetedit/src/gui/main.ui b/offsetedit/src/gui/main.ui new file mode 100644 index 000000000..dfff8fa02 --- /dev/null +++ b/offsetedit/src/gui/main.ui @@ -0,0 +1,195 @@ + + + MainWindow + + + + 0 + 0 + 633 + 622 + + + + MainWindow + + + + :/main_icon/main_64.png:/main_icon/main_64.png + + + + + + + + + + + + toolBar + + + TopToolBarArea + + + false + + + + + + + + + QDockWidget::DockWidgetFloatable|QDockWidget::DockWidgetMovable + + + Qt::LeftDockWidgetArea|Qt::RightDockWidgetArea + + + Description + + + 2 + + + + + + + + 1 + 1 + + + + + 0 + 0 + + + + QFrame::NoFrame + + + QFrame::Raised + + + 1 + + + 0 + + + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:18px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:xx-large; font-weight:600;">Title text</span></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Some other text.</p></body></html> + + + Qt::AutoText + + + false + + + Qt::AlignTop + + + true + + + + + + + + + false + + + QDockWidget::DockWidgetFloatable|QDockWidget::DockWidgetMovable + + + Qt::LeftDockWidgetArea|Qt::RightDockWidgetArea + + + Entries + + + 1 + + + + + + + + + + + + + 0 + 0 + 633 + 22 + + + + + File + + + + + + + + + Settings + + + + + + + + + Open + + + + + Save + + + + + Save As + + + + + Quit + + + + + Run DF + + + + + Setup DF executables + + + + + + + + diff --git a/offsetedit/src/gui/main_16.png b/offsetedit/src/gui/main_16.png new file mode 100644 index 000000000..04367e58d Binary files /dev/null and b/offsetedit/src/gui/main_16.png differ diff --git a/offsetedit/src/gui/main_32.png b/offsetedit/src/gui/main_32.png new file mode 100644 index 000000000..39137fed1 Binary files /dev/null and b/offsetedit/src/gui/main_32.png differ diff --git a/offsetedit/src/gui/main_64.png b/offsetedit/src/gui/main_64.png new file mode 100644 index 000000000..e6823a94f Binary files /dev/null and b/offsetedit/src/gui/main_64.png differ diff --git a/offsetedit/src/gui/resources.qrc b/offsetedit/src/gui/resources.qrc new file mode 100644 index 000000000..707294060 --- /dev/null +++ b/offsetedit/src/gui/resources.qrc @@ -0,0 +1,7 @@ + + + main_64.png + main_16.png + main_32.png + + diff --git a/offsetedit/src/main.cpp b/offsetedit/src/main.cpp new file mode 100644 index 000000000..36334656d --- /dev/null +++ b/offsetedit/src/main.cpp @@ -0,0 +1,11 @@ +#include +#include "dfedit.h" + + +int main(int argc, char** argv) +{ + QApplication app(argc, argv); + dfedit appGui; + appGui.show(); + return app.exec(); +} diff --git a/offsetedit/src/memxmlModel.cpp b/offsetedit/src/memxmlModel.cpp new file mode 100644 index 000000000..3df8849bf --- /dev/null +++ b/offsetedit/src/memxmlModel.cpp @@ -0,0 +1,210 @@ +/**************************************************************************** +** +** Copyright (C) 2005-2006 Trolltech ASA. All rights reserved. +** +** This file was part of the example classes of the Qt Toolkit. +** Now it's being hacked into some other shape... :) +** +** This file may be used under the terms of the GNU General Public +** License version 2.0 as published by the Free Software Foundation +** and appearing in the file LICENSE.GPL included in the packaging of +** this file. Please review the following information to ensure GNU +** General Public Licensing requirements will be met: +** http://www.trolltech.com/products/qt/opensource.html +** +** If you are unsure which license is appropriate for your use, please +** review the following information: +** http://www.trolltech.com/products/qt/licensing.html or contact the +** sales department at sales@trolltech.com. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +****************************************************************************/ + +#include "memxmlModel.h" +#include +#include +#include +#include + +class DomItem +{ +public: + DomItem(QDomNode &node, int row, DomItem *parent = 0); + ~DomItem(); + DomItem *child(int i); + DomItem *parent(); + QDomNode node() const; + int row(); + +private: + QDomNode domNode; + QHash childItems; + DomItem *parentItem; + int rowNumber; +}; + +DomItem::DomItem(QDomNode &node, int row, DomItem *parent) +{ + domNode = node; + // Record the item's location within its parent. + rowNumber = row; + parentItem = parent; +} + +DomItem::~DomItem() +{ + QHash::iterator it; + for (it = childItems.begin(); it != childItems.end(); ++it) + delete it.value(); +} + +QDomNode DomItem::node() const +{ + return domNode; +} + +DomItem *DomItem::parent() +{ + return parentItem; +} + +DomItem *DomItem::child(int i) +{ + if (childItems.contains(i)) + return childItems[i]; + + if (i >= 0 && i < domNode.childNodes().count()) { + QDomNode childNode = domNode.childNodes().item(i); + DomItem *childItem = new DomItem(childNode, i, this); + childItems[i] = childItem; + return childItem; + } + return 0; +} + +int DomItem::row() +{ + return rowNumber; +} + +MemXMLModel::MemXMLModel(QDomDocument document, QObject *parent) + : QAbstractItemModel(parent), domDocument(document) +{ + rootItem = new DomItem(domDocument, 0); +} + +MemXMLModel::~MemXMLModel() +{ + delete rootItem; +} + +int MemXMLModel::columnCount(const QModelIndex & parent) const +{ + Q_UNUSED(parent); + return 3; +} + +QVariant MemXMLModel::data(const QModelIndex &index, int role) const +{ + if (!index.isValid()) + return QVariant(); + + if (role != Qt::DisplayRole) + return QVariant(); + + DomItem *item = static_cast(index.internalPointer()); + + QDomNode node = item->node(); + QStringList attributes; + QDomNamedNodeMap attributeMap = node.attributes(); + + switch (index.column()) { + case 0: + return node.nodeName(); + case 1: + for (int i = 0; (unsigned int)(i) < attributeMap.count(); ++i) + { + QDomNode attribute = attributeMap.item(i); + attributes << attribute.nodeName() + "=\"" +attribute.nodeValue() + "\""; + } + return attributes.join(" "); + case 2: + return node.nodeValue().split("\n").join(" "); + default: + return QVariant(); + } +} + +Qt::ItemFlags MemXMLModel::flags(const QModelIndex &index) const +{ + if (!index.isValid()) + { + return Qt::ItemIsEnabled; + } + + return Qt::ItemIsEnabled | Qt::ItemIsSelectable; +} + +QVariant MemXMLModel::headerData(int section, Qt::Orientation orientation, int role) const +{ + if (orientation == Qt::Horizontal && role == Qt::DisplayRole) { + switch (section) { + case 0: + return tr("Name"); + case 1: + return tr("Attributes"); + case 2: + return tr("Value"); + default: + return QVariant(); + } + } + + return QVariant(); +} + +QModelIndex MemXMLModel::index(int row, int column, const QModelIndex &parent) const +{ + DomItem *parentItem; + + if (!parent.isValid()) + parentItem = rootItem; + else + parentItem = static_cast(parent.internalPointer()); + + DomItem *childItem = parentItem->child(row); + if (childItem) + return createIndex(row, column, childItem); + else + return QModelIndex(); +} + +QModelIndex MemXMLModel::parent(const QModelIndex &child) const +{ + if (!child.isValid()) + return QModelIndex(); + + DomItem *childItem = static_cast(child.internalPointer()); + DomItem *parentItem = childItem->parent(); + + if (!parentItem || parentItem == rootItem) + return QModelIndex(); + + return createIndex(parentItem->row(), 0, parentItem); +} + +int MemXMLModel::rowCount(const QModelIndex &parent) const +{ + DomItem *parentItem; + + if (!parent.isValid()) + parentItem = rootItem; + else + parentItem = static_cast(parent.internalPointer()); + + return parentItem->node().childNodes().count(); +} + +#include "memxmlModel.moc" diff --git a/offsetedit/src/memxmlModel.h b/offsetedit/src/memxmlModel.h new file mode 100644 index 000000000..2879f4b5f --- /dev/null +++ b/offsetedit/src/memxmlModel.h @@ -0,0 +1,30 @@ +#ifndef memxmlModel_H +#define memxmlModel_H + +#include +#include + +class DomItem; + +class MemXMLModel : public QAbstractItemModel +{ + Q_OBJECT +public: + MemXMLModel(QDomDocument document, QObject *parent = 0); + ~MemXMLModel(); + + QVariant data(const QModelIndex &index, int role) const; + Qt::ItemFlags flags(const QModelIndex &index) const; + QVariant headerData(int section, Qt::Orientation orientation, + int role = Qt::DisplayRole) const; + QModelIndex index(int row, int column, + const QModelIndex &parent = QModelIndex()) const; + QModelIndex parent(const QModelIndex &child) const; + int rowCount(const QModelIndex &parent = QModelIndex()) const; + int columnCount(const QModelIndex &parent = QModelIndex()) const; + +private: + QDomDocument domDocument; + DomItem *rootItem; +}; +#endif // memxmlModel diff --git a/tools/examples/CMakeLists.txt b/tools/examples/CMakeLists.txt index 190dff3cc..05d03e3d8 100644 --- a/tools/examples/CMakeLists.txt +++ b/tools/examples/CMakeLists.txt @@ -1,5 +1,8 @@ # don't use this file directly. use the one in the root folder of the project +# only build this stuff when BUILD_DFHACK_EXAMPLES is set to ON +IF (BUILD_DFHACK_EXAMPLES) + # this is required to ensure we use the right configuration for the system. IF(UNIX) add_definitions(-DLINUX_BUILD) @@ -21,10 +24,6 @@ TARGET_LINK_LIBRARIES(dfcreaturedump dfhack) ADD_EXECUTABLE(dfmaterialtest materialtest.cpp) TARGET_LINK_LIBRARIES(dfmaterialtest dfhack) -# position - check the DF window and cursor parameters -ADD_EXECUTABLE(dfposition position.cpp) -TARGET_LINK_LIBRARIES(dfposition dfhack) - # itemdump - dump the item under the cursor ADD_EXECUTABLE(dfitemdump dfitemdump.cpp) TARGET_LINK_LIBRARIES(dfitemdump dfhack) @@ -51,38 +50,16 @@ TARGET_LINK_LIBRARIES(dfspatterdump dfhack) ADD_EXECUTABLE(dfprocessenum processenum.cpp) TARGET_LINK_LIBRARIES(dfprocessenum dfhack) -IF(UNIX) - SET(CURSES_NEED_WIDE "YES") - SET(CURSES_NEED_NCURSES "NO") - find_package(Curses QUIET) - - IF(CURSES_FOUND) - if(CURSES_HAVE_NCURSESW_NCURSES_H) - SET(NCURSES_H "ncursesw/ncurses.h") - elseif(CURSES_HAVE_NCURSESW_CURSES_H) - SET(NCURSES_H "ncursesw/curses.h") - elseif(CURSES_HAVE_NCURSESW_H) - SET(NCURSES_H "ncursesw.h") - elseif(CURSES_HAVE_CURSESW_H) - SET(NCURSES_H "cursesw.h") - endif(CURSES_HAVE_NCURSESW_NCURSES_H) - IF(NCURSES_H) - # OPTION( VARIABLE "Description" Initial state) - #OPTION( WITH_FOO "Enable FOO support" ON ) - #OPTION( WITH_BAR "Enable BAR component" OFF ) - #SET( BAZ 18 ) - CONFIGURE_FILE( ${CMAKE_CURRENT_SOURCE_DIR}/fake-curses.h.cmake ${CMAKE_CURRENT_SOURCE_DIR}/fake-curses.h ) - - # veinlook - look at the map... sort of - ADD_EXECUTABLE(dfveinlook veinlook.cpp) - INCLUDE_DIRECTORIES(${CURSES_INCLUDE_DIR}) - TARGET_LINK_LIBRARIES(dfveinlook dfhack ${CURSES_LIBRARIES}) - install(TARGETS - dfveinlook - RUNTIME DESTINATION bin - ) - ENDIF(NCURSES_H) - ELSE(CURSES_FOUND) - MESSAGE(STATUS "Wide-character ncurses library not found - veinlook can't be built") - ENDIF(CURSES_FOUND) -ENDIF(UNIX) \ No newline at end of file +install(TARGETS +dfbuildingsdump +dfconstructiondump +dfcreaturedump +dfmaterialtest +dfitemdump +dfhotkeynotedump +dftreedump +dfspatterdump +dfprocessenum +RUNTIME DESTINATION bin +) +ENDIF (BUILD_DFHACK_EXAMPLES) \ No newline at end of file diff --git a/tools/playground/CMakeLists.txt b/tools/playground/CMakeLists.txt index eff712d97..a28597475 100644 --- a/tools/playground/CMakeLists.txt +++ b/tools/playground/CMakeLists.txt @@ -1,5 +1,8 @@ # don't use this file directly. use the one in the root folder of the project +# only build this stuff when BUILD_DFHACK_PLAYGROUND is set to ON +IF (BUILD_DFHACK_PLAYGROUND) + # this is required to ensure we use the right configuration for the system. IF(UNIX) add_definitions(-DLINUX_BUILD) @@ -9,14 +12,6 @@ ENDIF(UNIX) ADD_EXECUTABLE(dfmoodump moodump.cpp) TARGET_LINK_LIBRARIES(dfmoodump dfhack) -# for trying out some 'stuff' -ADD_EXECUTABLE(dftest test.cpp) -TARGET_LINK_LIBRARIES(dftest dfhack) - -# just dump offsets of the current version -ADD_EXECUTABLE(dfdoffsets dumpoffsets.cpp) -TARGET_LINK_LIBRARIES(dfdoffsets dfhack) - # bauxite - turn all mechanisms into bauxite mechanisms # Author: Alex Legg #ADD_EXECUTABLE(dfbauxite dfbauxite.cpp) @@ -60,3 +55,29 @@ TARGET_LINK_LIBRARIES(dfcatsplosion dfhack) # Author: belal #ADD_EXECUTABLE(dfrenamer renamer.cpp) #TARGET_LINK_LIBRARIES(dfrenamer dfhack) + +# this needs the C bindings +IF(BUILD_DFHACK_C_BINDIGS) + # for trying out some 'stuff' + ADD_EXECUTABLE(dftest test.cpp) + TARGET_LINK_LIBRARIES(dftest dfhack) + install(TARGETS + dftest + RUNTIME DESTINATION bin + ) +ENDIF(BUILD_DFHACK_C_BINDIGS) + +install(TARGETS +dfmoodump +dfdigger +dfdigger2 +dfcatsplosion +RUNTIME DESTINATION bin +) +IF(UNIX) + install(TARGETS + dfincremental + RUNTIME DESTINATION bin + ) +ENDIF(UNIX) +ENDIF (BUILD_DFHACK_PLAYGROUND) \ No newline at end of file diff --git a/tools/playground/incrementalsearch.cpp b/tools/playground/incrementalsearch.cpp index 2671ab6bc..0e9529cf1 100644 --- a/tools/playground/incrementalsearch.cpp +++ b/tools/playground/incrementalsearch.cpp @@ -397,8 +397,9 @@ void FindVectorByLength(DFHack::ContextManager & DFMgr, vector Attach(); SegmentedFinder sf(ranges,DF); - sf.Incremental(0,4,found,vectorAll); - sf.Filter(length * element_size,found,vectorLength); + //sf.Incremental(0,4,found,vectorAll); + //sf.Filter(length * element_size,found,vectorLength); + sf.Incremental(length * element_size, 4 , found, vectorLength); DF->Detach(); } } diff --git a/tools/playground/test.cpp b/tools/playground/test.cpp index e62b35d2a..b67608f9a 100644 --- a/tools/playground/test.cpp +++ b/tools/playground/test.cpp @@ -8,10 +8,32 @@ using namespace std; #include +#include +#include +#include +#include using namespace DFHack; int main (int numargs, const char ** args) { + printf("From C: "); + DFHackObject* cman = ContextManager_Alloc("Memory.xml"); + DFHackObject* context = ContextManager_getSingleContext(cman); + if(context) + { + Context_Attach(context); + DFHackObject * maps = Context_getMaps(context); + if(maps) + { + Maps_Start(maps); + uint32_t x,y,z; + Maps_getSize(maps, &x, &y, &z); + printf("Map size: %d, %d, %d\n", x,y,z); + } + } + ContextManager_Free(cman); + + cout << "From C++:"; DFHack::ContextManager DFMgr("Memory.xml"); DFHack::Context * DF; try @@ -29,6 +51,11 @@ int main (int numargs, const char ** args) } // DO STUFF HERE + Maps * m = DF->getMaps(); + m->Start(); + uint32_t x,y,z; + m->getSize(x,y,z); + cout << "Map size " << x << ", "<< y << ", " << z << endl; #ifndef LINUX_BUILD cout << "Done. Press any key to continue" << endl; diff --git a/tools/supported/CMakeLists.txt b/tools/supported/CMakeLists.txt index c8b278997..0a0d93f68 100644 --- a/tools/supported/CMakeLists.txt +++ b/tools/supported/CMakeLists.txt @@ -51,14 +51,58 @@ TARGET_LINK_LIBRARIES(dfflows dfhack) ADD_EXECUTABLE(dfliquids liquids.cpp) TARGET_LINK_LIBRARIES(dfliquids dfhack) +# position - check the DF window and cursor parameters +ADD_EXECUTABLE(dfposition position.cpp) +TARGET_LINK_LIBRARIES(dfposition dfhack) + +# just dump offsets of the current version +ADD_EXECUTABLE(dfdoffsets dumpoffsets.cpp) +TARGET_LINK_LIBRARIES(dfdoffsets dfhack) + IF(UNIX) + SET(CURSES_NEED_WIDE "YES") + SET(CURSES_NEED_NCURSES "NO") + find_package(Curses QUIET) + IF(CURSES_FOUND) + if(CURSES_HAVE_NCURSESW_NCURSES_H) + SET(NCURSES_H "ncursesw/ncurses.h") + elseif(CURSES_HAVE_NCURSESW_CURSES_H) + SET(NCURSES_H "ncursesw/curses.h") + elseif(CURSES_HAVE_NCURSESW_H) + SET(NCURSES_H "ncursesw.h") + elseif(CURSES_HAVE_CURSESW_H) + SET(NCURSES_H "cursesw.h") + endif(CURSES_HAVE_NCURSESW_NCURSES_H) + IF(NCURSES_H) + # OPTION( VARIABLE "Description" Initial state) + #OPTION( WITH_FOO "Enable FOO support" ON ) + #OPTION( WITH_BAR "Enable BAR component" OFF ) + #SET( BAZ 18 ) + CONFIGURE_FILE( ${CMAKE_CURRENT_SOURCE_DIR}/fake-curses.h.cmake ${CMAKE_CURRENT_SOURCE_DIR}/fake-curses.h ) + # veinlook - look at the map... sort of + ADD_EXECUTABLE(dfveinlook veinlook.cpp) + INCLUDE_DIRECTORIES(${CURSES_INCLUDE_DIR}) + TARGET_LINK_LIBRARIES(dfveinlook dfhack ${CURSES_LIBRARIES}) + install(TARGETS + dfveinlook + RUNTIME DESTINATION bin + ) + ENDIF(NCURSES_H) + ELSE(CURSES_FOUND) + MESSAGE(STATUS "Wide-character ncurses library not found - veinlook can't be built") + ENDIF(CURSES_FOUND) +ENDIF(UNIX) + + install(TARGETS dfreveal dfprospector +dfposition dfvdig dfcleanmap dfunstuck dfprobe +dfdoffsets dfattachtest dfexpbench dfsuspend @@ -66,4 +110,9 @@ dfflows dfliquids RUNTIME DESTINATION bin ) +IF(UNIX) + install(TARGETS + dfveinlook + RUNTIME DESTINATION bin + ) ENDIF(UNIX) diff --git a/tools/playground/dumpoffsets.cpp b/tools/supported/dumpoffsets.cpp similarity index 100% rename from tools/playground/dumpoffsets.cpp rename to tools/supported/dumpoffsets.cpp diff --git a/tools/examples/fake-curses.h.cmake b/tools/supported/fake-curses.h.cmake similarity index 100% rename from tools/examples/fake-curses.h.cmake rename to tools/supported/fake-curses.h.cmake diff --git a/tools/examples/position.cpp b/tools/supported/position.cpp similarity index 100% rename from tools/examples/position.cpp rename to tools/supported/position.cpp diff --git a/tools/examples/veinlook.cpp b/tools/supported/veinlook.cpp similarity index 99% rename from tools/examples/veinlook.cpp rename to tools/supported/veinlook.cpp index e0fc79004..1f489b355 100644 --- a/tools/examples/veinlook.cpp +++ b/tools/supported/veinlook.cpp @@ -719,6 +719,10 @@ main(int argc, char *argv[]) // Supend, read/write data DF->Suspend(); + // restart cleared modules + Maps->Start(); + Mats->Start(); + Mats->ReadInorganicMaterials(); uint32_t effectnum; /* if(DF.InitReadEffects(effectnum))