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 @@
+
+
+
+
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!
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 @@
+
+
+
+
+
+
+
+
+
+
+
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.
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.
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.
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).
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 ;)
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.
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.
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.
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.
+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 @@
+
+
+
+
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))