Merge branch 'master', remote branch 'peterix'

develop
Erik Youngren 2010-08-26 23:05:12 -07:00
commit 8fd3eafecd
46 changed files with 4360 additions and 258 deletions

@ -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)

@ -1,9 +1,8 @@
INCLUDE(CPack)
# main project file. use it from a build sub-folder, see COMPILE for details # main project file. use it from a build sub-folder, see COMPILE for details
PROJECT (dfhack) PROJECT (dfhack)
cmake_minimum_required(VERSION 2.6) cmake_minimum_required(VERSION 2.6)
SET(CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/CMake/Modules) 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 # disable warning, autosearch
if(COMMAND cmake_policy) if(COMMAND cmake_policy)
@ -20,10 +19,13 @@ ENDIF(NOT DEFINED CMAKE_BUILD_TYPE)
SET( LIBRARY_OUTPUT_PATH ${CMAKE_SOURCE_DIR}/output CACHE PATH "Output directory for the dfhack library" ) 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( 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_DOCUMENTATION "Create doxygen documentation for developers" OFF)
OPTION(BUILD_DFHACK_EXAMPLES "Build example tools" OFF) OPTION(BUILD_DFHACK_EXAMPLES "Build example tools" OFF)
OPTION(BUILD_DFHACK_PLAYGROUND "Build tools from the playground folder" 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)
OPTION(BUILD_OFFSET_EDITOR "Build the Offset GUI editor (not ready for use)." OFF)
include_directories (${CMAKE_SOURCE_DIR}/library/include/) include_directories (${CMAKE_SOURCE_DIR}/library/include/)
include_directories (${CMAKE_SOURCE_DIR}/library/shm/) include_directories (${CMAKE_SOURCE_DIR}/library/shm/)
@ -32,8 +34,12 @@ include_directories (${CMAKE_SOURCE_DIR}/library/depends/tinyxml/)
include_directories (${CMAKE_SOURCE_DIR}/library/depends/argstream/) include_directories (${CMAKE_SOURCE_DIR}/library/depends/argstream/)
add_subdirectory (library) add_subdirectory (library)
IF(BUILD_OFFSET_EDITOR)
add_subdirectory (offsetedit)
ENDIF(BUILD_OFFSET_EDITOR)
add_subdirectory (library/shm) add_subdirectory (library/shm)
#add_subdirectory (dfhack/python)
add_subdirectory (tools/examples) add_subdirectory (tools/examples)
add_subdirectory (tools/playground) add_subdirectory (tools/playground)
add_subdirectory (tools/supported) add_subdirectory (tools/supported)

@ -87,13 +87,9 @@ This will generate MSVC solution and project files.
.. note:: .. note::
You are working in the ``/build`` folder. Files added to You are working in the ``/build`` folder. Files added to
projects will end up there! (and that's wrong). Any changes to the projects from within MSVC will end up there! (and that's
build system should be done by changing cmake configs and running wrong). Any changes to the build system should be done
``cmake`` on them! by changing cmake configs and running ``cmake`` on them!
Also, 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 Using some other compiler
@ -111,6 +107,17 @@ dfhack has a few build targets:
* ``make`` will build everything. * ``make`` will build everything.
* ``make expbench`` will build the expbench testing program and the * ``make expbench`` will build the expbench testing program and the
library. 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 Build types
=========== ===========
@ -136,59 +143,5 @@ 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 itself, it has to be built with the same tools as DF and use the same C
and C++/STL libraries. and C++/STL libraries.
For DF 31.01 - 31.10 on Windows, use MSVC 2008. You can get the Express For DF 31.01 - 31.12 on Windows, use MSVC 2008. You can get the Express
edition for free from Microsoft. 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.
.. _google it: http://www.google.com/search?q=depends.exe
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.

@ -331,7 +331,6 @@ ul.auto-toc {
<li><a class="reference internal" href="#build-targets" id="id8">Build targets</a></li> <li><a class="reference internal" href="#build-targets" id="id8">Build targets</a></li>
<li><a class="reference internal" href="#build-types" id="id9">Build types</a></li> <li><a class="reference internal" href="#build-types" id="id9">Build types</a></li>
<li><a class="reference internal" href="#building-the-shared-memory-hook-library-shm" id="id10">Building the shared memory hook library (SHM)</a></li> <li><a class="reference internal" href="#building-the-shared-memory-hook-library-shm" id="id10">Building the shared memory hook library (SHM)</a></li>
<li><a class="reference internal" href="#checking-strings-support" id="id11">Checking strings support</a></li>
</ul> </ul>
</div> </div>
<div class="section" id="dependencies"> <div class="section" id="dependencies">
@ -407,13 +406,10 @@ cmake ..
<div class="note"> <div class="note">
<p class="first admonition-title">Note</p> <p class="first admonition-title">Note</p>
<p class="last">You are working in the <tt class="docutils literal">/build</tt> folder. Files added to <p class="last">You are working in the <tt class="docutils literal">/build</tt> folder. Files added to
projects will end up there! (and that's wrong). Any changes to the projects from within MSVC will end up there! (and that's
build system should be done by changing cmake configs and running wrong). Any changes to the build system should be done
<tt class="docutils literal">cmake</tt> on them!</p> by changing cmake configs and running <tt class="docutils literal">cmake</tt> on them!</p>
</div> </div>
<p>Also, you'll have to copy the <tt class="docutils literal">Memory.xml</tt> file to the build output
folders MSVC generates. For example from <tt class="docutils literal">output/</tt> to
<tt class="docutils literal">output/Release/</tt></p>
</div> </div>
<div class="section" id="using-some-other-compiler"> <div class="section" id="using-some-other-compiler">
<h2><a class="toc-backref" href="#id7">Using some other compiler</a></h2> <h2><a class="toc-backref" href="#id7">Using some other compiler</a></h2>
@ -425,11 +421,27 @@ compiler.</p>
<div class="section" id="build-targets"> <div class="section" id="build-targets">
<h1><a class="toc-backref" href="#id8">Build targets</a></h1> <h1><a class="toc-backref" href="#id8">Build targets</a></h1>
<p>dfhack has a few build targets:</p> <p>dfhack has a few build targets:</p>
<ul class="simple"> <ul>
<li>If you're only after the library run <tt class="docutils literal">make dfhack</tt>.</li> <li><p class="first">If you're only after the library run <tt class="docutils literal">make dfhack</tt>.</p>
<li><tt class="docutils literal">make</tt> will build everything.</li> </li>
<li><tt class="docutils literal">make expbench</tt> will build the expbench testing program and the <li><p class="first"><tt class="docutils literal">make</tt> will build everything.</p>
library.</li> </li>
<li><p class="first"><tt class="docutils literal">make expbench</tt> will build the expbench testing program and the
library.</p>
</li>
<li><p class="first">Some of the utilities and the doxygen documentation won't be
normally built. You can enable them by specifying some extra
CMake variables:</p>
<pre class="literal-block">
BUILD_DFHACK_DOCUMENTATION - generate the documentation (really bad)
BUILD_DFHACK_EXAMPLES - build tools from tools/examples
BUILD_DFHACK_PLAYGROUND - build tools from tools/playground
</pre>
<p>Example:</p>
<pre class="literal-block">
cmake .. -DBUILD_DFHACK_EXAMPLES=ON
</pre>
</li>
</ul> </ul>
</div> </div>
<div class="section" id="build-types"> <div class="section" id="build-types">
@ -451,55 +463,8 @@ cmake .. -DCMAKE_BUILD_TYPE:string=BUILD_TYPE
comes to compilation. Because it shares the memory space with DF 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 itself, it has to be built with the same tools as DF and use the same C
and C++/STL libraries.</p> and C++/STL libraries.</p>
<p>For DF 31.01 - 31.10 on Windows, use MSVC 2008. You can get the Express <p>For DF 31.01 - 31.12 on Windows, use MSVC 2008. You can get the Express
edition for free from Microsoft.</p> edition for free from Microsoft.</p>
<p>Windows dependencies can be determined by a tool like <tt class="docutils literal">depends.exe</tt>
(<a class="reference external" href="http://www.google.com/search?q=depends.exe">google it</a>). Both the fake <tt class="docutils literal">SDL.dll</tt> and DF have to use the same
version of the C runtime (MSVCRT). The SHM can only be debugged using a
RelWithDebInfo build!</p>
<p>Linux dependencies can be determined by setting the LD_DEBUG variable
and running ./df:</p>
<pre class="literal-block">
export LD_DEBUG=versions
./df
</pre>
<p>Example of (a part of a) relevant output from a working SHM
installation:</p>
<pre class="literal-block">
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]
</pre>
<p>libdfconnect is the SHM. Both are compiled against the same C++ library
and share the same CXXABI version.</p>
<p>Precompiled SHM libraries are provided in binary releases.</p>
</div>
<div class="section" id="checking-strings-support">
<h1><a class="toc-backref" href="#id11">Checking strings support</a></h1>
<p>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.</p>
<p>String writing is best tested with a fresh throw-away fort and
<tt class="docutils literal">dfrenamer</tt>.</p>
<p>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.</p>
</div> </div>
</div> </div>
</body> </body>

@ -49,10 +49,10 @@ Windows
Linux Linux
===== =====
0.31.04 - 0.31.12 native. 0.31.05 - 0.31.12 native.
There are missing offsets but Map tools should be OK. Linux support is 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 a bit lacking, I'm working on it. All supported Windows versions
running in wine can be used with DFHack. running in wine can be used with native DFHack binaries.
===== =====
Tools Tools
@ -66,10 +66,6 @@ dfcleanmap
Cleans all the splatter that get scattered all over the map. Cleans all the splatter that get scattered all over the map.
Only exception is mud. It leaves mud alone. Only exception is mud. It leaves mud alone.
dfexpbench
==========
Just a simple benchmark of the data export speed.
dfliquids dfliquids
========= =========
A command prompt for liquid creation and manipulation (the Moses A command prompt for liquid creation and manipulation (the Moses
@ -88,15 +84,15 @@ dfprospector
============ ============
Lists all available minerals on the map and how much of them there is. Lists all available minerals on the map and how much of them there is.
dfprobe
============
Can be used to determine tile properties.
dfreveal dfreveal
======== ========
Reveals the whole map, waits for input and hides it again. If you close Reveals the whole map, waits for input and hides it again. If you close
the tool while it waits, the map remains revealed. the tool while it waits, the map remains revealed.
dfsuspend
=========
Test of the process suspend/resume mechanism.
dfunstuck dfunstuck
========= =========
Use if you prematurely close any of the tools and DF appears to be Use if you prematurely close any of the tools and DF appears to be
@ -112,6 +108,26 @@ dfflows
A tool for checking how many liquid tiles are actively checked for A tool for checking how many liquid tiles are actively checked for
flows. 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.
dfcleartask
===========
Solves the problem of unusable items after reclaim by clearing the 'in_job' bit of all items.
Your tool here Your tool here
============== ==============
Write one ;) Write one ;)
@ -239,6 +255,6 @@ cmake
========================= =========================
Memory offset definitions Memory offset definitions
========================= =========================
The file with memory offset definitions used by dfhack can be found in the The files with memory offset definitions used by dfhack can be found in the
output folder. data folder.

@ -335,35 +335,38 @@ allow for easier development of new tools.</p>
</li> </li>
<li><a class="reference internal" href="#tools" id="id7">Tools</a><ul> <li><a class="reference internal" href="#tools" id="id7">Tools</a><ul>
<li><a class="reference internal" href="#dfcleanmap" id="id8">dfcleanmap</a></li> <li><a class="reference internal" href="#dfcleanmap" id="id8">dfcleanmap</a></li>
<li><a class="reference internal" href="#dfexpbench" id="id9">dfexpbench</a></li> <li><a class="reference internal" href="#dfliquids" id="id9">dfliquids</a></li>
<li><a class="reference internal" href="#dfliquids" id="id10">dfliquids</a></li> <li><a class="reference internal" href="#dfposition" id="id10">dfposition</a></li>
<li><a class="reference internal" href="#dfposition" id="id11">dfposition</a></li> <li><a class="reference internal" href="#dfprospector" id="id11">dfprospector</a></li>
<li><a class="reference internal" href="#dfprospector" id="id12">dfprospector</a></li> <li><a class="reference internal" href="#dfreveal" id="id12">dfreveal</a></li>
<li><a class="reference internal" href="#dfreveal" id="id13">dfreveal</a></li> <li><a class="reference internal" href="#dfunstuck" id="id13">dfunstuck</a></li>
<li><a class="reference internal" href="#dfsuspend" id="id14">dfsuspend</a></li> <li><a class="reference internal" href="#dfvdig" id="id14">dfvdig</a></li>
<li><a class="reference internal" href="#dfunstuck" id="id15">dfunstuck</a></li> <li><a class="reference internal" href="#dfflows" id="id15">dfflows</a></li>
<li><a class="reference internal" href="#dfvdig" id="id16">dfvdig</a></li> <li><a class="reference internal" href="#dfattachtest" id="id16">dfattachtest</a></li>
<li><a class="reference internal" href="#dfflows" id="id17">dfflows</a></li> <li><a class="reference internal" href="#dfsuspend" id="id17">dfsuspend</a></li>
<li><a class="reference internal" href="#your-tool-here" id="id18">Your tool here</a></li> <li><a class="reference internal" href="#dfexpbench" id="id18">dfexpbench</a></li>
<li><a class="reference internal" href="#dfdoffsets" id="id19">dfdoffsets</a></li>
<li><a class="reference internal" href="#dfcleartask" id="id20">dfcleartask</a></li>
<li><a class="reference internal" href="#your-tool-here" id="id21">Your tool here</a></li>
</ul> </ul>
</li> </li>
<li><a class="reference internal" href="#using-the-library-as-a-developer" id="id19">Using the library as a developer</a><ul> <li><a class="reference internal" href="#using-the-library-as-a-developer" id="id22">Using the library as a developer</a><ul>
<li><a class="reference internal" href="#contributing-to-dfhack" id="id20">Contributing to DFHack</a><ul> <li><a class="reference internal" href="#contributing-to-dfhack" id="id23">Contributing to DFHack</a><ul>
<li><a class="reference internal" href="#coding-style" id="id21">Coding style</a></li> <li><a class="reference internal" href="#coding-style" id="id24">Coding style</a></li>
<li><a class="reference internal" href="#how-to-get-new-code-into-dfhack" id="id22">How to get new code into DFHack</a></li> <li><a class="reference internal" href="#how-to-get-new-code-into-dfhack" id="id25">How to get new code into DFHack</a></li>
<li><a class="reference internal" href="#layout-for-tools" id="id23">Layout for tools</a></li> <li><a class="reference internal" href="#layout-for-tools" id="id26">Layout for tools</a></li>
<li><a class="reference internal" href="#modules-what-are-they" id="id24">Modules - what are they?</a></li> <li><a class="reference internal" href="#modules-what-are-they" id="id27">Modules - what are they?</a></li>
<li><a class="reference internal" href="#dependencies" id="id25">Dependencies</a><ul> <li><a class="reference internal" href="#dependencies" id="id28">Dependencies</a><ul>
<li><a class="reference internal" href="#current-internal-dependencies" id="id26">Current internal dependencies</a></li> <li><a class="reference internal" href="#current-internal-dependencies" id="id29">Current internal dependencies</a></li>
<li><a class="reference internal" href="#current-external-dependencies" id="id27">Current external dependencies</a></li> <li><a class="reference internal" href="#current-external-dependencies" id="id30">Current external dependencies</a></li>
<li><a class="reference internal" href="#build-time-dependencies" id="id28">Build-time dependencies</a></li> <li><a class="reference internal" href="#build-time-dependencies" id="id31">Build-time dependencies</a></li>
</ul> </ul>
</li> </li>
</ul> </ul>
</li> </li>
</ul> </ul>
</li> </li>
<li><a class="reference internal" href="#memory-offset-definitions" id="id29">Memory offset definitions</a></li> <li><a class="reference internal" href="#memory-offset-definitions" id="id32">Memory offset definitions</a></li>
</ul> </ul>
</div> </div>
</div> </div>
@ -396,10 +399,10 @@ fix it :)</p>
</div> </div>
<div class="section" id="linux"> <div class="section" id="linux">
<h2><a class="toc-backref" href="#id6">Linux</a></h2> <h2><a class="toc-backref" href="#id6">Linux</a></h2>
<p>0.31.04 - 0.31.12 native. <p>0.31.05 - 0.31.12 native.
There are missing offsets but Map tools should be OK. Linux support is 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 a bit lacking, I'm working on it. All supported Windows versions
running in wine can be used with DFHack.</p> running in wine can be used with native DFHack binaries.</p>
</div> </div>
</div> </div>
<div class="section" id="tools"> <div class="section" id="tools">
@ -412,12 +415,8 @@ be useful and are cross-platform just like the library itself.</p>
<p>Cleans all the splatter that get scattered all over the map. <p>Cleans all the splatter that get scattered all over the map.
Only exception is mud. It leaves mud alone.</p> Only exception is mud. It leaves mud alone.</p>
</div> </div>
<div class="section" id="dfexpbench">
<h2><a class="toc-backref" href="#id9">dfexpbench</a></h2>
<p>Just a simple benchmark of the data export speed.</p>
</div>
<div class="section" id="dfliquids"> <div class="section" id="dfliquids">
<h2><a class="toc-backref" href="#id10">dfliquids</a></h2> <h2><a class="toc-backref" href="#id9">dfliquids</a></h2>
<p>A command prompt for liquid creation and manipulation (the Moses <p>A command prompt for liquid creation and manipulation (the Moses
effect included!) Also allows painting obsidian walls directly.</p> effect included!) Also allows painting obsidian walls directly.</p>
<div class="note"> <div class="note">
@ -427,44 +426,60 @@ temperatures (creating heat traps). You've been warned.</p>
</div> </div>
</div> </div>
<div class="section" id="dfposition"> <div class="section" id="dfposition">
<h2><a class="toc-backref" href="#id11">dfposition</a></h2> <h2><a class="toc-backref" href="#id10">dfposition</a></h2>
<p>Prints the current DF window properties and cursor position.</p> <p>Prints the current DF window properties and cursor position.</p>
</div> </div>
<div class="section" id="dfprospector"> <div class="section" id="dfprospector">
<h2><a class="toc-backref" href="#id12">dfprospector</a></h2> <h2><a class="toc-backref" href="#id11">dfprospector</a></h2>
<p>Lists all available minerals on the map and how much of them there is.</p> <p>Lists all available minerals on the map and how much of them there is.</p>
</div> </div>
<div class="section" id="dfreveal"> <div class="section" id="dfreveal">
<h2><a class="toc-backref" href="#id13">dfreveal</a></h2> <h2><a class="toc-backref" href="#id12">dfreveal</a></h2>
<p>Reveals the whole map, waits for input and hides it again. If you close <p>Reveals the whole map, waits for input and hides it again. If you close
the tool while it waits, the map remains revealed.</p> the tool while it waits, the map remains revealed.</p>
</div> </div>
<div class="section" id="dfsuspend">
<h2><a class="toc-backref" href="#id14">dfsuspend</a></h2>
<p>Test of the process suspend/resume mechanism.</p>
</div>
<div class="section" id="dfunstuck"> <div class="section" id="dfunstuck">
<h2><a class="toc-backref" href="#id15">dfunstuck</a></h2> <h2><a class="toc-backref" href="#id13">dfunstuck</a></h2>
<p>Use if you prematurely close any of the tools and DF appears to be <p>Use if you prematurely close any of the tools and DF appears to be
stuck.</p> stuck.</p>
</div> </div>
<div class="section" id="dfvdig"> <div class="section" id="dfvdig">
<h2><a class="toc-backref" href="#id16">dfvdig</a></h2> <h2><a class="toc-backref" href="#id14">dfvdig</a></h2>
<p>Designates a whole vein for digging. Point the cursor at a vein and run <p>Designates a whole vein for digging. Point the cursor at a vein and run
this thing :)</p> this thing :)</p>
</div> </div>
<div class="section" id="dfflows"> <div class="section" id="dfflows">
<h2><a class="toc-backref" href="#id17">dfflows</a></h2> <h2><a class="toc-backref" href="#id15">dfflows</a></h2>
<p>A tool for checking how many liquid tiles are actively checked for <p>A tool for checking how many liquid tiles are actively checked for
flows.</p> flows.</p>
</div> </div>
<div class="section" id="dfattachtest">
<h2><a class="toc-backref" href="#id16">dfattachtest</a></h2>
<p>Test of the process attach/detach mechanism.</p>
</div>
<div class="section" id="dfsuspend">
<h2><a class="toc-backref" href="#id17">dfsuspend</a></h2>
<p>Test of the process suspend/resume mechanism.</p>
</div>
<div class="section" id="dfexpbench">
<h2><a class="toc-backref" href="#id18">dfexpbench</a></h2>
<p>Just a simple benchmark of the data export speed.</p>
</div>
<div class="section" id="dfdoffsets">
<h2><a class="toc-backref" href="#id19">dfdoffsets</a></h2>
<p>Dumps the offsets for the currently running DF version into the terminal.</p>
</div>
<div class="section" id="dfcleartask">
<h2><a class="toc-backref" href="#id20">dfcleartask</a></h2>
<p>Solves the problem of unusable items after reclaim by clearing the 'in_job' bit of all items.</p>
</div>
<div class="section" id="your-tool-here"> <div class="section" id="your-tool-here">
<h2><a class="toc-backref" href="#id18">Your tool here</a></h2> <h2><a class="toc-backref" href="#id21">Your tool here</a></h2>
<p>Write one ;)</p> <p>Write one ;)</p>
</div> </div>
</div> </div>
<div class="section" id="using-the-library-as-a-developer"> <div class="section" id="using-the-library-as-a-developer">
<h1><a class="toc-backref" href="#id19">Using the library as a developer</a></h1> <h1><a class="toc-backref" href="#id22">Using the library as a developer</a></h1>
<p>The library is compilable under Linux with GCC and under Windows with <p>The library is compilable under Linux with GCC and under Windows with
MinGW32 and MSVC compilers. It is using the cmake build system. See MinGW32 and MSVC compilers. It is using the cmake build system. See
COMPILE for details.</p> COMPILE for details.</p>
@ -475,17 +490,17 @@ the dfhack repository is welcome and the right thing to do :)</p>
code does have a lot of comments though (and getting better all the code does have a lot of comments though (and getting better all the
time).</p> time).</p>
<div class="section" id="contributing-to-dfhack"> <div class="section" id="contributing-to-dfhack">
<h2><a class="toc-backref" href="#id20">Contributing to DFHack</a></h2> <h2><a class="toc-backref" href="#id23">Contributing to DFHack</a></h2>
<p>Several things should be kept in mind when contributing to DFHack.</p> <p>Several things should be kept in mind when contributing to DFHack.</p>
<div class="section" id="coding-style"> <div class="section" id="coding-style">
<h3><a class="toc-backref" href="#id21">Coding style</a></h3> <h3><a class="toc-backref" href="#id24">Coding style</a></h3>
<p>DFhack uses ANSI formatting and four spaces as indentation. Line <p>DFhack uses ANSI formatting and four spaces as indentation. Line
endings are UNIX. The files use UTF-8 encoding. Code not following this 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 won't make me happy, because I'll have to fix it. There's a good chance
I'll make <em>you</em> fix it ;)</p> I'll make <em>you</em> fix it ;)</p>
</div> </div>
<div class="section" id="how-to-get-new-code-into-dfhack"> <div class="section" id="how-to-get-new-code-into-dfhack">
<h3><a class="toc-backref" href="#id22">How to get new code into DFHack</a></h3> <h3><a class="toc-backref" href="#id25">How to get new code into DFHack</a></h3>
<p>You can send patches or make a clone of the github repo and ask me on <p>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 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.</p> are any problems. I'll fix them if they are minor.</p>
@ -495,7 +510,7 @@ this is also a good place to dump new ideas and/or bugs that need
fixing.</p> fixing.</p>
</div> </div>
<div class="section" id="layout-for-tools"> <div class="section" id="layout-for-tools">
<h3><a class="toc-backref" href="#id23">Layout for tools</a></h3> <h3><a class="toc-backref" href="#id26">Layout for tools</a></h3>
<p>Tools live in the tools/ folder. There, they are split into three <p>Tools live in the tools/ folder. There, they are split into three
categories.</p> categories.</p>
<dl class="docutils"> <dl class="docutils">
@ -516,7 +531,7 @@ nasty business.</dd>
</dl> </dl>
</div> </div>
<div class="section" id="modules-what-are-they"> <div class="section" id="modules-what-are-they">
<h3><a class="toc-backref" href="#id24">Modules - what are they?</a></h3> <h3><a class="toc-backref" href="#id27">Modules - what are they?</a></h3>
<p>DFHack uses modules to partition sets of features into manageable <p>DFHack uses modules to partition sets of features into manageable
chunks. A module can have both client and server side.</p> chunks. A module can have both client and server side.</p>
<p>Client side is the part that goes into the main library and is <p>Client side is the part that goes into the main library and is
@ -533,7 +548,7 @@ server, it allows accelerating the reading of map blocks.</p>
pretty fast, but needs quite a bit of care to not break.</p> pretty fast, but needs quite a bit of care to not break.</p>
</div> </div>
<div class="section" id="dependencies"> <div class="section" id="dependencies">
<h3><a class="toc-backref" href="#id25">Dependencies</a></h3> <h3><a class="toc-backref" href="#id28">Dependencies</a></h3>
<dl class="docutils"> <dl class="docutils">
<dt>Internal</dt> <dt>Internal</dt>
<dd>either part of the codebase or statically linked.</dd> <dd>either part of the codebase or statically linked.</dd>
@ -545,7 +560,7 @@ dependencies for core dfhack should be either public domain or require
attribution at most. External dependencies for tools can be either attribution at most. External dependencies for tools can be either
that, or any Free Software licenses.</p> that, or any Free Software licenses.</p>
<div class="section" id="current-internal-dependencies"> <div class="section" id="current-internal-dependencies">
<h4><a class="toc-backref" href="#id26">Current internal dependencies</a></h4> <h4><a class="toc-backref" href="#id29">Current internal dependencies</a></h4>
<dl class="docutils"> <dl class="docutils">
<dt>tinyxml</dt> <dt>tinyxml</dt>
<dd>used by core dfhack to read offset definitions from Memory.xml</dd> <dd>used by core dfhack to read offset definitions from Memory.xml</dd>
@ -557,7 +572,7 @@ DF binaries on Linux.</dd>
</dl> </dl>
</div> </div>
<div class="section" id="current-external-dependencies"> <div class="section" id="current-external-dependencies">
<h4><a class="toc-backref" href="#id27">Current external dependencies</a></h4> <h4><a class="toc-backref" href="#id30">Current external dependencies</a></h4>
<dl class="docutils"> <dl class="docutils">
<dt>wide-character ncurses</dt> <dt>wide-character ncurses</dt>
<dd>used for the veinlook tool on Linux.</dd> <dd>used for the veinlook tool on Linux.</dd>
@ -566,7 +581,7 @@ DF binaries on Linux.</dd>
</dl> </dl>
</div> </div>
<div class="section" id="build-time-dependencies"> <div class="section" id="build-time-dependencies">
<h4><a class="toc-backref" href="#id28">Build-time dependencies</a></h4> <h4><a class="toc-backref" href="#id31">Build-time dependencies</a></h4>
<dl class="docutils"> <dl class="docutils">
<dt>cmake</dt> <dt>cmake</dt>
<dd>you need cmake to generate the build system and some configuration <dd>you need cmake to generate the build system and some configuration
@ -577,9 +592,9 @@ headers</dd>
</div> </div>
</div> </div>
<div class="section" id="memory-offset-definitions"> <div class="section" id="memory-offset-definitions">
<h1><a class="toc-backref" href="#id29">Memory offset definitions</a></h1> <h1><a class="toc-backref" href="#id32">Memory offset definitions</a></h1>
<p>The file with memory offset definitions used by dfhack can be found in the <p>The files with memory offset definitions used by dfhack can be found in the
output folder.</p> data folder.</p>
</div> </div>
</div> </div>
</body> </body>

@ -1,4 +0,0 @@
mkdir build-real
cd build-real
cmake ..\.. -G"Visual Studio 7"
pause

@ -1,4 +0,0 @@
mkdir build-real
cd build-real
cmake ..\.. -G"Visual Studio 7 .NET 2003"
pause

File diff suppressed because it is too large Load Diff

@ -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
<center>
\htmlonly
<h1>DFHack</h1>
<!--<img src="logo.png" alt="DFHack"/><br/>-->
\endhtmlonly
</center>
<h2>Introduction</h2>
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:
<ul>
PLACEHOLDER TERRITORY!
<li>Section \ref blah discusses some weird stuff
<a href="target">this is a link</a>
<li>Section \ref starting tells you how to cromulate at a distance!
</ul>
Second part has some details on DFHack development:
<ul>
<li>Section \ref starting tells you how to cromulate at a distance!
</ul>
The third part describes how to use the supported DFHack utilities
<ul>
<li>Section \ref dfattachtest shows how to use the \c dfattachtest program
<li>Section \ref dfcleanmap shows how to use the \c dfcleanmap program
<li>Section \ref dfexpbench shows how to use the \c dfexpbench program
<li>Section \ref dfflows shows how to use the \c dfflows program
<li>Section \ref dfliquids shows how to use the \c dfliquids program
<li>Section \ref dfprobe shows how to use the \c dfprobe program
<li>Section \ref dfprospector shows how to use the \c dfprospector program
<li>Section \ref dfreveal shows how to use the \c dfreveal program
<li>Section \ref dfsuspend shows how to use the \c dfsuspend program
<li>Section \ref dfunstuck shows how to use the \c dfunstuck program
<li>Section \ref dfvdig shows how to use the \c dfvdig program
</ul>
*/

@ -54,6 +54,11 @@ include/dfhack/modules/WindowIO.h
include/dfhack/modules/World.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 SET(PROJECT_SRCS
DFMemInfo.cpp DFMemInfo.cpp
DFMemInfoManager.cpp DFMemInfoManager.cpp
@ -61,8 +66,6 @@ DFContextManager.cpp
DFContext.cpp DFContext.cpp
DFProcessEnumerator.cpp DFProcessEnumerator.cpp
ContextShared.cpp ContextShared.cpp
DFContext_C.cpp
DFTypes_C.cpp
depends/md5/md5.cpp depends/md5/md5.cpp
depends/md5/md5wrapper.cpp depends/md5/md5wrapper.cpp
@ -83,6 +86,11 @@ modules/Position.cpp
modules/Translation.cpp modules/Translation.cpp
modules/Vegetation.cpp modules/Vegetation.cpp
modules/World.cpp modules/World.cpp
)
SET(PROJECT_C_SRCS
DFContext_C.cpp
DFTypes_C.cpp
modules/Buildings_C.cpp modules/Buildings_C.cpp
modules/Constructions_C.cpp modules/Constructions_C.cpp
@ -126,6 +134,11 @@ ELSE(UNIX)
LIST(APPEND PROJECT_SRCS ${PROJECT_SRCS_WINDOWS}) LIST(APPEND PROJECT_SRCS ${PROJECT_SRCS_WINDOWS})
ENDIF(UNIX) 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 ) SET_SOURCE_FILES_PROPERTIES( ${PROJECT_HDRS} PROPERTIES HEADER_FILE_ONLY TRUE )
LIST(APPEND PROJECT_SRCS ${PROJECT_HDRS}) LIST(APPEND PROJECT_SRCS ${PROJECT_HDRS})
@ -164,6 +177,28 @@ SET_TARGET_PROPERTIES(dfhack PROPERTIES DEBUG_POSTFIX "-debug" )
TARGET_LINK_LIBRARIES(dfhack ${PROJECT_LIBS}) 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
)
ADD_CUSTOM_COMMAND(TARGET dfhack POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_SOURCE_DIR}/Compile.html $(TargetDir)/Compile.html
)
ADD_CUSTOM_COMMAND(TARGET dfhack POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_SOURCE_DIR}/Readme.html $(TargetDir)/Readme.html
)
else(MSVC)
# Just put the file in the output directory on Linux and Mac
configure_file(${CMAKE_SOURCE_DIR}/data/Memory.xml ${DATA_OUTPUT_PATH}/Memory.xml COPYONLY)
configure_file(${CMAKE_SOURCE_DIR}/Compile.html ${DATA_OUTPUT_PATH}/Compile.html COPYONLY)
configure_file(${CMAKE_SOURCE_DIR}/Readme.html ${DATA_OUTPUT_PATH}/Readme.html COPYONLY)
endif(MSVC)
IF(UNIX) IF(UNIX)
install(TARGETS dfhack LIBRARY DESTINATION lib) install(TARGETS dfhack LIBRARY DESTINATION lib)
install(FILES ${CMAKE_SOURCE_DIR}/output/Memory.xml DESTINATION share/dfhack) install(FILES ${CMAKE_SOURCE_DIR}/output/Memory.xml DESTINATION share/dfhack)

@ -88,6 +88,7 @@ bool Context::Detach()
{ {
if (!d->p->detach()) if (!d->p->detach())
{ {
cerr << "Context::Detach failed!" << endl;
return false; return false;
} }
d->shm_start = 0; d->shm_start = 0;

@ -739,31 +739,40 @@ std::string memory_info::getMood(const uint32_t moodID)
std::string memory_info::PrintOffsets() std::string memory_info::PrintOffsets()
{ {
ostringstream ss; ostringstream ss;
ss << "version: " << getVersion(); ss << "<Version name=\"" << getVersion() << "\">" << endl;
switch (getOS()) switch (getOS())
{ {
case OS_LINUX: case OS_LINUX:
ss << " LINUX" << endl; ss << "<MD5 value=\"" << getString("md5") << "\" />" << endl;
ss << "md5 hash: " << getString("md5") << endl;
break; break;
case OS_WINDOWS: case OS_WINDOWS:
ss << " WINDOWS" << endl; ss << "<PETimeStamp value=\"" << hex << "0x" << getHexValue("pe_timestamp") << "\" />" << endl;
ss << "PE timestamp: " << hex << "0x" << getHexValue("pe_timestamp") << endl; ss << "<MD5 value=\"" << getString("md5") << "\" />" << endl;
ss << "md5 hash: " << getString("md5") << endl;
break; break;
default: default:
ss << " UNKNOWN" << endl; ss << " UNKNOWN" << endl;
} }
ss << "<Offsets>" << endl;
map<string,uint32_t>::const_iterator iter; map<string,uint32_t>::const_iterator iter;
for(iter = d->addresses.begin(); iter != d->addresses.end(); iter++) for(iter = d->addresses.begin(); iter != d->addresses.end(); iter++)
{ {
ss << "address " << (*iter).first << " : " << hex << "0x" << (*iter).second << endl; ss << " <Address name=\"" << (*iter).first << "\" value=\"" << hex << "0x" << (*iter).second << "\" />" << endl;
} }
map<string,int32_t>::const_iterator iter2; map<string,int32_t>::const_iterator iter2;
for(iter2 = d->offsets.begin(); iter2 != d->offsets.end(); iter2++) for(iter2 = d->offsets.begin(); iter2 != d->offsets.end(); iter2++)
{ {
ss << "offset " << (*iter2).first << " : " << hex << "0x" << (*iter2).second << endl; ss << " <Offset name=\"" << (*iter2).first << "\" value=\"" << hex << "0x" << (*iter2).second <<"\" />" << endl;
}
for(iter = d->hexvals.begin(); iter != d->hexvals.end(); iter++)
{
ss << " <HexValue name=\"" << (*iter).first << "\" value=\"" << hex << "0x" << (*iter).second <<"\" />" << endl;
}
map<string,string>::const_iterator iter3;
for(iter3 = d->strings.begin(); iter3 != d->strings.end(); iter3++)
{
ss << " <String name=\"" << (*iter3).first << "\" value=\"" << (*iter3).second <<"\" />" << endl;
} }
ss << "</Offsets>" << endl;
ss << "</Version>" << endl;
return ss.str(); return ss.str();
} }

@ -154,9 +154,9 @@ void MemInfoManager::ParseEntry (TiXmlElement* entry, memory_info* mem, map <str
const char *cstr_type = pMemEntry->Value(); const char *cstr_type = pMemEntry->Value();
const char *cstr_name = pMemEntry->Attribute("name"); const char *cstr_name = pMemEntry->Attribute("name");
const char *cstr_value = pMemEntry->GetText(); const char *cstr_value = pMemEntry->GetText();
if(!cstr_value) if(!cstr_value)
cstr_value = pMemEntry->Attribute("id"); cstr_value = pMemEntry->Attribute("id");
// check for missing parts // check for missing parts
string type, name, value; string type, name, value;

@ -569,10 +569,7 @@ bool SHMProcess::attach()
bool SHMProcess::detach() bool SHMProcess::detach()
{ {
if(!d->attached) if(!d->attached) return true;
{
return false;
}
if(d->locked) if(d->locked)
{ {
resume(); resume();

@ -331,7 +331,7 @@ bool WineProcess::attach()
bool WineProcess::detach() bool WineProcess::detach()
{ {
if(!d->attached) return false; if(!d->attached) return true;
if(!d->suspended) suspend(); if(!d->suspended) suspend();
int result = 0; int result = 0;
// close /proc/PID/mem // close /proc/PID/mem

@ -318,7 +318,7 @@ bool NormalProcess::attach()
bool NormalProcess::detach() bool NormalProcess::detach()
{ {
if(!d->attached) return false; if(!d->attached) return true;
if(!d->suspended) suspend(); if(!d->suspended) suspend();
int result = 0; int result = 0;
// close /proc/PID/mem // close /proc/PID/mem

@ -632,10 +632,7 @@ bool SHMProcess::attach()
bool SHMProcess::detach() bool SHMProcess::detach()
{ {
if(!d->attached) if(!d->attached) return true;
{
return false;
}
//cerr << "detach" << endl;// FIXME: throw //cerr << "detach" << endl;// FIXME: throw
if(d->locked) if(d->locked)
{ {

@ -249,10 +249,7 @@ bool NormalProcess::attach()
bool NormalProcess::detach() bool NormalProcess::detach()
{ {
if(!d->attached) if(!d->attached) return true;
{
return false;
}
resume(); resume();
d->attached = false; d->attached = false;
return true; return true;

@ -33,7 +33,7 @@ namespace DFHack
class DFHACK_EXPORT Module class DFHACK_EXPORT Module
{ {
public: public:
~Module(){}; virtual ~Module(){};
virtual bool Start(){return true;};// default start... virtual bool Start(){return true;};// default start...
virtual bool Finish() = 0;// everything should have a Finish() virtual bool Finish() = 0;// everything should have a Finish()
// should Context call Finish when Resume is called? // should Context call Finish when Resume is called?

@ -380,7 +380,6 @@ namespace DFHack
int32_t GetDwarfCivId ( void ); int32_t GetDwarfCivId ( void );
/* Write Functions */ /* Write Functions */
// write labors of a creature (for Dwarf Therapist)
bool WriteLabors(const uint32_t index, uint8_t labors[NUM_CREATURE_LABORS]); bool WriteLabors(const uint32_t index, uint8_t labors[NUM_CREATURE_LABORS]);
bool WriteHappiness(const uint32_t index, const uint32_t happinessValue); bool WriteHappiness(const uint32_t index, const uint32_t happinessValue);
bool WriteFlags(const uint32_t index, const uint32_t flags1, const uint32_t flags2); 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 WriteTraits(const uint32_t index, const t_soul &soul);
bool WriteMood(const uint32_t index, const uint16_t mood); bool WriteMood(const uint32_t index, const uint16_t mood);
bool WriteMoodSkill(const uint32_t index, const uint16_t moodSkill); bool WriteMoodSkill(const uint32_t index, const uint16_t moodSkill);
bool WriteJob(const t_creature * furball, std::vector<t_material> const& mat);
bool WritePos(const uint32_t index, const t_creature &creature); bool WritePos(const uint32_t index, const t_creature &creature);
bool WriteCiv(const uint32_t index, const int32_t civ); bool WriteCiv(const uint32_t index, const int32_t civ);

@ -519,6 +519,27 @@ bool Creatures::WriteMoodSkill(const uint32_t index, const uint16_t moodSkill)
return true; return true;
} }
bool Creatures::WriteJob(const t_creature * furball, std::vector<t_material> 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 <uint32_t> cmats(p, furball->current_job.occupationPtr + minfo->getOffset("job_materials_vector"));
for(i=0;i<cmats.size();i++)
{
p->writeWord(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) bool Creatures::WritePos(const uint32_t index, const t_creature &creature)
{ {
if(!d->Started) if(!d->Started)

@ -125,6 +125,7 @@ Maps::~Maps()
{ {
if(d->Started) if(d->Started)
Finish(); Finish();
delete d;
} }
/*-----------------------------------* /*-----------------------------------*

@ -258,24 +258,24 @@ bool Materials::ReadCreatureTypes (void)
bool Materials::ReadOthers(void) bool Materials::ReadOthers(void)
{ {
Process * p = d->owner; Process * p = d->owner;
uint32_t matBase = p->getDescriptor()->getAddress ("mat_other"); uint32_t matBase = p->getDescriptor()->getAddress ("mat_other");
uint32_t i = 0; uint32_t i = 0;
uint32_t ptr; uint32_t ptr;
other.clear(); other.clear();
while(1) while(1)
{ {
t_matglossOther mat; t_matglossOther mat;
ptr = p->readDWord(matBase + i*4); ptr = p->readDWord(matBase + i*4);
if(ptr==0) if(ptr==0)
break; break;
p->readSTLString(ptr, mat.rawname, sizeof(mat.rawname)); p->readSTLString(ptr, mat.rawname, sizeof(mat.rawname));
other.push_back(mat); other.push_back(mat);
i++; i++;
} }
return true; return true;
} }
bool Materials::ReadDescriptorColors (void) bool Materials::ReadDescriptorColors (void)

@ -0,0 +1,9 @@
project(dfoffsetedit)
cmake_minimum_required(VERSION 2.6)
find_package(Qt4 QUIET)
if(QT4_FOUND)
add_subdirectory (src)
else(QT4_FOUND)
MESSAGE(STATUS "Qt4 libraries not found - offset editor can't be built.")
endif(QT4_FOUND)

@ -0,0 +1,25 @@
include_directories(${QT_INCLUDES} ${CMAKE_CURRENT_BINARY_DIR})
set ( dfoffsetedit_SRCS
dfedit.cpp
memxmlModel.cpp
main.cpp
)
SET ( dfoffsetedit_UI
gui/main.ui
)
SET( dfoffsetedit_RCS
gui/resources.qrc
)
# this command will generate rules that will run rcc on all files from dfoffsetedit_RCS
# in result dfoffsetedit_RC_SRCS variable will contain paths to files produced by rcc
QT4_ADD_RESOURCES( dfoffsetedit_RC_SRCS ${dfoffsetedit_RCS} )
QT4_WRAP_UI(dfoffsetedit_UI_h ${dfoffsetedit_UI})
qt4_automoc(${dfoffsetedit_SRCS})
add_executable(dfoffsetedit ${dfoffsetedit_SRCS} ${dfoffsetedit_RC_SRCS} ${dfoffsetedit_UI_h})
target_link_libraries(dfoffsetedit ${QT_QTCORE_LIBRARY} ${QT_QTGUI_LIBRARY} ${QT_QTXML_LIBRARY} )

@ -0,0 +1,95 @@
#include "dfedit.h"
#include <QFileDialog>
#include <QDebug>
#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"

@ -0,0 +1,26 @@
#ifndef dfedit_H
#define dfedit_H
#include <QtGui/QMainWindow>
#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

File diff suppressed because it is too large Load Diff

After

Width:  |  Height:  |  Size: 114 KiB

@ -0,0 +1,195 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>MainWindow</class>
<widget class="QMainWindow" name="MainWindow">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>633</width>
<height>622</height>
</rect>
</property>
<property name="windowTitle">
<string>MainWindow</string>
</property>
<property name="windowIcon">
<iconset resource="resources.qrc">
<normaloff>:/main_icon/main_64.png</normaloff>:/main_icon/main_64.png</iconset>
</property>
<widget class="QWidget" name="centralwidget">
<layout class="QVBoxLayout" name="verticalLayout_2">
<item>
<widget class="QTreeView" name="entryView"/>
</item>
</layout>
</widget>
<widget class="QStatusBar" name="statusbar"/>
<widget class="QToolBar" name="toolBar">
<property name="windowTitle">
<string>toolBar</string>
</property>
<attribute name="toolBarArea">
<enum>TopToolBarArea</enum>
</attribute>
<attribute name="toolBarBreak">
<bool>false</bool>
</attribute>
<addaction name="actionOpen"/>
<addaction name="actionSave"/>
<addaction name="actionSave_As"/>
<addaction name="actionRun_DF"/>
</widget>
<widget class="QDockWidget" name="descriptioDock">
<property name="features">
<set>QDockWidget::DockWidgetFloatable|QDockWidget::DockWidgetMovable</set>
</property>
<property name="allowedAreas">
<set>Qt::LeftDockWidgetArea|Qt::RightDockWidgetArea</set>
</property>
<property name="windowTitle">
<string>Description</string>
</property>
<attribute name="dockWidgetArea">
<number>2</number>
</attribute>
<widget class="QWidget" name="dockWidgetContents">
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QLabel" name="DescriptionPanel">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Expanding">
<horstretch>1</horstretch>
<verstretch>1</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>0</width>
<height>0</height>
</size>
</property>
<property name="frameShape">
<enum>QFrame::NoFrame</enum>
</property>
<property name="frameShadow">
<enum>QFrame::Raised</enum>
</property>
<property name="lineWidth">
<number>1</number>
</property>
<property name="midLineWidth">
<number>0</number>
</property>
<property name="text">
<string>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
p, li { white-space: pre-wrap; }
&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;&quot;&gt;
&lt;p style=&quot; margin-top:18px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:xx-large; font-weight:600;&quot;&gt;Title text&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;Some other text.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="textFormat">
<enum>Qt::AutoText</enum>
</property>
<property name="scaledContents">
<bool>false</bool>
</property>
<property name="alignment">
<set>Qt::AlignTop</set>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
</widget>
</item>
</layout>
</widget>
</widget>
<widget class="QDockWidget" name="dockWidget">
<property name="floating">
<bool>false</bool>
</property>
<property name="features">
<set>QDockWidget::DockWidgetFloatable|QDockWidget::DockWidgetMovable</set>
</property>
<property name="allowedAreas">
<set>Qt::LeftDockWidgetArea|Qt::RightDockWidgetArea</set>
</property>
<property name="windowTitle">
<string>Entries</string>
</property>
<attribute name="dockWidgetArea">
<number>1</number>
</attribute>
<widget class="QWidget" name="dockWidgetContents_2">
<layout class="QVBoxLayout" name="verticalLayout_3">
<item>
<widget class="QTreeView" name="structureView"/>
</item>
</layout>
</widget>
</widget>
<widget class="QMenuBar" name="menubar">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>633</width>
<height>22</height>
</rect>
</property>
<widget class="QMenu" name="menuFile">
<property name="title">
<string>File</string>
</property>
<addaction name="actionOpen"/>
<addaction name="actionSave"/>
<addaction name="actionSave_As"/>
<addaction name="actionQuit"/>
</widget>
<widget class="QMenu" name="menuSettings">
<property name="title">
<string>Settings</string>
</property>
<addaction name="actionSetup_DF_executables"/>
</widget>
<addaction name="menuFile"/>
<addaction name="menuSettings"/>
</widget>
<action name="actionOpen">
<property name="text">
<string>Open</string>
</property>
</action>
<action name="actionSave">
<property name="text">
<string>Save</string>
</property>
</action>
<action name="actionSave_As">
<property name="text">
<string>Save As</string>
</property>
</action>
<action name="actionQuit">
<property name="text">
<string>Quit</string>
</property>
</action>
<action name="actionRun_DF">
<property name="text">
<string>Run DF</string>
</property>
</action>
<action name="actionSetup_DF_executables">
<property name="text">
<string>Setup DF executables</string>
</property>
</action>
</widget>
<resources>
<include location="resources.qrc"/>
</resources>
<connections/>
</ui>

Binary file not shown.

After

Width:  |  Height:  |  Size: 718 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

@ -0,0 +1,7 @@
<RCC>
<qresource prefix="main_icon">
<file>main_64.png</file>
<file>main_16.png</file>
<file>main_32.png</file>
</qresource>
</RCC>

@ -0,0 +1,11 @@
#include <QtGui/QApplication>
#include "dfedit.h"
int main(int argc, char** argv)
{
QApplication app(argc, argv);
dfedit appGui;
appGui.show();
return app.exec();
}

@ -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 <QtGui>
#include <QtXml>
#include <QDomNode>
#include <QHash>
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<int,DomItem*> 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<int,DomItem*>::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<DomItem*>(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<DomItem*>(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<DomItem*>(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<DomItem*>(parent.internalPointer());
return parentItem->node().childNodes().count();
}
#include "memxmlModel.moc"

@ -0,0 +1,30 @@
#ifndef memxmlModel_H
#define memxmlModel_H
#include <qabstractitemmodel.h>
#include <qdom.h>
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

@ -24,10 +24,6 @@ TARGET_LINK_LIBRARIES(dfcreaturedump dfhack)
ADD_EXECUTABLE(dfmaterialtest materialtest.cpp) ADD_EXECUTABLE(dfmaterialtest materialtest.cpp)
TARGET_LINK_LIBRARIES(dfmaterialtest dfhack) 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 # itemdump - dump the item under the cursor
ADD_EXECUTABLE(dfitemdump dfitemdump.cpp) ADD_EXECUTABLE(dfitemdump dfitemdump.cpp)
TARGET_LINK_LIBRARIES(dfitemdump dfhack) TARGET_LINK_LIBRARIES(dfitemdump dfhack)
@ -59,7 +55,6 @@ dfbuildingsdump
dfconstructiondump dfconstructiondump
dfcreaturedump dfcreaturedump
dfmaterialtest dfmaterialtest
dfposition
dfitemdump dfitemdump
dfhotkeynotedump dfhotkeynotedump
dftreedump dftreedump

@ -102,6 +102,23 @@ int main (void)
Cman.Refresh(&inval); Cman.Refresh(&inval);
int nCont = Cman.size(); int nCont = Cman.size();
int nInval = inval.size(); int nInval = inval.size();
DFHack::Context * cont = Cman.getSingleContext();
if(cont)
{
if(cont->Attach())
{
DFHack::Maps * mapz = cont->getMaps();
cont->Suspend();
mapz->Start();
cont->Resume();
}
bool result = cont->Detach();
if(!result)
{
cerr << "Something went horribly wrong during detach" << endl;
}
}
cout << "Contexts:" << endl; cout << "Contexts:" << endl;
for(int i = 0; i < nCont; i++) for(int i = 0; i < nCont; i++)

@ -12,14 +12,6 @@ ENDIF(UNIX)
ADD_EXECUTABLE(dfmoodump moodump.cpp) ADD_EXECUTABLE(dfmoodump moodump.cpp)
TARGET_LINK_LIBRARIES(dfmoodump dfhack) 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 # bauxite - turn all mechanisms into bauxite mechanisms
# Author: Alex Legg # Author: Alex Legg
#ADD_EXECUTABLE(dfbauxite dfbauxite.cpp) #ADD_EXECUTABLE(dfbauxite dfbauxite.cpp)
@ -64,10 +56,19 @@ TARGET_LINK_LIBRARIES(dfcatsplosion dfhack)
#ADD_EXECUTABLE(dfrenamer renamer.cpp) #ADD_EXECUTABLE(dfrenamer renamer.cpp)
#TARGET_LINK_LIBRARIES(dfrenamer dfhack) #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 install(TARGETS
dfmoodump dfmoodump
dftest
dfdoffsets
dfdigger dfdigger
dfdigger2 dfdigger2
dfcatsplosion dfcatsplosion

@ -51,6 +51,19 @@ TARGET_LINK_LIBRARIES(dfflows dfhack)
ADD_EXECUTABLE(dfliquids liquids.cpp) ADD_EXECUTABLE(dfliquids liquids.cpp)
TARGET_LINK_LIBRARIES(dfliquids dfhack) TARGET_LINK_LIBRARIES(dfliquids dfhack)
# Solves the problem of unusable items after reclaim by clearing the 'in_job' bit of all items.
# Original author: Quietust
ADD_EXECUTABLE(dfcleartask cleartask.cpp)
TARGET_LINK_LIBRARIES(dfcleartask 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) IF(UNIX)
SET(CURSES_NEED_WIDE "YES") SET(CURSES_NEED_WIDE "YES")
SET(CURSES_NEED_NCURSES "NO") SET(CURSES_NEED_NCURSES "NO")
@ -89,11 +102,14 @@ ENDIF(UNIX)
install(TARGETS install(TARGETS
dfreveal dfreveal
dfprospector dfprospector
dfposition
dfvdig dfvdig
dfcleanmap dfcleanmap
dfunstuck dfunstuck
dfprobe dfprobe
dfdoffsets
dfattachtest dfattachtest
dfcleartask
dfexpbench dfexpbench
dfsuspend dfsuspend
dfflows dfflows

@ -0,0 +1,73 @@
// clears the "tasked" flag on all items
// original code by Quietust (http://www.bay12forums.com/smf/index.php?action=profile;u=18111)
#include <stdio.h>
#include <iostream>
#include <iomanip>
#include <sstream>
#include <climits>
#include <vector>
using namespace std;
#include <DFHack.h>
#include <dfhack/DFVector.h>
#include <dfhack/DFTypes.h>
int main ()
{
DFHack::Process * p;
unsigned int i;
DFHack::ContextManager DFMgr("Memory.xml");
DFHack::Context * DF;
try
{
DF = DFMgr.getSingleContext();
DF->Attach();
}
catch (exception& e)
{
cerr << e.what() << endl;
#ifndef LINUX_BUILD
cin.ignore();
#endif
return 1;
}
DFHack::memory_info * mem = DF->getMemoryInfo();
p = DF->getProcess();
uint32_t item_vec_offset = 0;
try
{
item_vec_offset = p->getDescriptor()->getAddress ("items_vector");
}
catch(DFHack::Error::MissingMemoryDefinition & e)
{
cerr << "missing offset for the item vector, exiting :(" << endl;
#ifndef LINUX_BUILD
cin.ignore();
#endif
return 1;
}
DFHack::DfVector <uint32_t> p_items (p, item_vec_offset);
uint32_t size = p_items.size();
int numtasked = 0;
for (i=0;i<size;i++)
{
DFHack::t_itemflags flags;
flags.whole = p->readDWord(p_items[i] + 0x0C);
if (flags.bits.in_job)
{
flags.bits.in_job = 0;
p->writeDWord(p_items[i] + 0x0C, flags.whole);
numtasked++;
}
}
cout << "Found and untasked " << numtasked << " items." << endl;
#ifndef LINUX_BUILD
cout << "Done. Press any key to continue" << endl;
cin.ignore();
#endif
return 0;
}