Merge branch 'master' of git://github.com/peterix/dfhack into peterix
						commit
						4254190560
					
				| @ -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,159 +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) |  | ||||||
| 
 |  | ||||||
| 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. |  | ||||||
| @ -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. | ||||||
| @ -0,0 +1,471 @@ | |||||||
|  | <?xml version="1.0" encoding="utf-8" ?> | ||||||
|  | <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> | ||||||
|  | <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> | ||||||
|  | <head> | ||||||
|  | <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> | ||||||
|  | <meta name="generator" content="Docutils 0.7: http://docutils.sourceforge.net/" /> | ||||||
|  | <title>Compiling DFHACK</title> | ||||||
|  | <style type="text/css"> | ||||||
|  | 
 | ||||||
|  | /* | ||||||
|  | :Author: David Goodger (goodger@python.org) | ||||||
|  | :Id: $Id: html4css1.css 6253 2010-03-02 00:24:53Z milde $ | ||||||
|  | :Copyright: This stylesheet has been placed in the public domain. | ||||||
|  | 
 | ||||||
|  | Default cascading style sheet for the HTML output of Docutils. | ||||||
|  | 
 | ||||||
|  | See http://docutils.sf.net/docs/howto/html-stylesheets.html for how to | ||||||
|  | customize this style sheet. | ||||||
|  | */ | ||||||
|  | 
 | ||||||
|  | /* used to remove borders from tables and images */ | ||||||
|  | .borderless, table.borderless td, table.borderless th { | ||||||
|  |   border: 0 } | ||||||
|  | 
 | ||||||
|  | table.borderless td, table.borderless th { | ||||||
|  |   /* Override padding for "table.docutils td" with "! important". | ||||||
|  |      The right padding separates the table cells. */ | ||||||
|  |   padding: 0 0.5em 0 0 ! important } | ||||||
|  | 
 | ||||||
|  | .first { | ||||||
|  |   /* Override more specific margin styles with "! important". */ | ||||||
|  |   margin-top: 0 ! important } | ||||||
|  | 
 | ||||||
|  | .last, .with-subtitle { | ||||||
|  |   margin-bottom: 0 ! important } | ||||||
|  | 
 | ||||||
|  | .hidden { | ||||||
|  |   display: none } | ||||||
|  | 
 | ||||||
|  | a.toc-backref { | ||||||
|  |   text-decoration: none ; | ||||||
|  |   color: black } | ||||||
|  | 
 | ||||||
|  | blockquote.epigraph { | ||||||
|  |   margin: 2em 5em ; } | ||||||
|  | 
 | ||||||
|  | dl.docutils dd { | ||||||
|  |   margin-bottom: 0.5em } | ||||||
|  | 
 | ||||||
|  | /* Uncomment (and remove this text!) to get bold-faced definition list terms | ||||||
|  | dl.docutils dt { | ||||||
|  |   font-weight: bold } | ||||||
|  | */ | ||||||
|  | 
 | ||||||
|  | div.abstract { | ||||||
|  |   margin: 2em 5em } | ||||||
|  | 
 | ||||||
|  | div.abstract p.topic-title { | ||||||
|  |   font-weight: bold ; | ||||||
|  |   text-align: center } | ||||||
|  | 
 | ||||||
|  | div.admonition, div.attention, div.caution, div.danger, div.error, | ||||||
|  | div.hint, div.important, div.note, div.tip, div.warning { | ||||||
|  |   margin: 2em ; | ||||||
|  |   border: medium outset ; | ||||||
|  |   padding: 1em } | ||||||
|  | 
 | ||||||
|  | div.admonition p.admonition-title, div.hint p.admonition-title, | ||||||
|  | div.important p.admonition-title, div.note p.admonition-title, | ||||||
|  | div.tip p.admonition-title { | ||||||
|  |   font-weight: bold ; | ||||||
|  |   font-family: sans-serif } | ||||||
|  | 
 | ||||||
|  | div.attention p.admonition-title, div.caution p.admonition-title, | ||||||
|  | div.danger p.admonition-title, div.error p.admonition-title, | ||||||
|  | div.warning p.admonition-title { | ||||||
|  |   color: red ; | ||||||
|  |   font-weight: bold ; | ||||||
|  |   font-family: sans-serif } | ||||||
|  | 
 | ||||||
|  | /* Uncomment (and remove this text!) to get reduced vertical space in | ||||||
|  |    compound paragraphs. | ||||||
|  | div.compound .compound-first, div.compound .compound-middle { | ||||||
|  |   margin-bottom: 0.5em } | ||||||
|  | 
 | ||||||
|  | div.compound .compound-last, div.compound .compound-middle { | ||||||
|  |   margin-top: 0.5em } | ||||||
|  | */ | ||||||
|  | 
 | ||||||
|  | div.dedication { | ||||||
|  |   margin: 2em 5em ; | ||||||
|  |   text-align: center ; | ||||||
|  |   font-style: italic } | ||||||
|  | 
 | ||||||
|  | div.dedication p.topic-title { | ||||||
|  |   font-weight: bold ; | ||||||
|  |   font-style: normal } | ||||||
|  | 
 | ||||||
|  | div.figure { | ||||||
|  |   margin-left: 2em ; | ||||||
|  |   margin-right: 2em } | ||||||
|  | 
 | ||||||
|  | div.footer, div.header { | ||||||
|  |   clear: both; | ||||||
|  |   font-size: smaller } | ||||||
|  | 
 | ||||||
|  | div.line-block { | ||||||
|  |   display: block ; | ||||||
|  |   margin-top: 1em ; | ||||||
|  |   margin-bottom: 1em } | ||||||
|  | 
 | ||||||
|  | div.line-block div.line-block { | ||||||
|  |   margin-top: 0 ; | ||||||
|  |   margin-bottom: 0 ; | ||||||
|  |   margin-left: 1.5em } | ||||||
|  | 
 | ||||||
|  | div.sidebar { | ||||||
|  |   margin: 0 0 0.5em 1em ; | ||||||
|  |   border: medium outset ; | ||||||
|  |   padding: 1em ; | ||||||
|  |   background-color: #ffffee ; | ||||||
|  |   width: 40% ; | ||||||
|  |   float: right ; | ||||||
|  |   clear: right } | ||||||
|  | 
 | ||||||
|  | div.sidebar p.rubric { | ||||||
|  |   font-family: sans-serif ; | ||||||
|  |   font-size: medium } | ||||||
|  | 
 | ||||||
|  | div.system-messages { | ||||||
|  |   margin: 5em } | ||||||
|  | 
 | ||||||
|  | div.system-messages h1 { | ||||||
|  |   color: red } | ||||||
|  | 
 | ||||||
|  | div.system-message { | ||||||
|  |   border: medium outset ; | ||||||
|  |   padding: 1em } | ||||||
|  | 
 | ||||||
|  | div.system-message p.system-message-title { | ||||||
|  |   color: red ; | ||||||
|  |   font-weight: bold } | ||||||
|  | 
 | ||||||
|  | div.topic { | ||||||
|  |   margin: 2em } | ||||||
|  | 
 | ||||||
|  | h1.section-subtitle, h2.section-subtitle, h3.section-subtitle, | ||||||
|  | h4.section-subtitle, h5.section-subtitle, h6.section-subtitle { | ||||||
|  |   margin-top: 0.4em } | ||||||
|  | 
 | ||||||
|  | h1.title { | ||||||
|  |   text-align: center } | ||||||
|  | 
 | ||||||
|  | h2.subtitle { | ||||||
|  |   text-align: center } | ||||||
|  | 
 | ||||||
|  | hr.docutils { | ||||||
|  |   width: 75% } | ||||||
|  | 
 | ||||||
|  | img.align-left, .figure.align-left, object.align-left { | ||||||
|  |   clear: left ; | ||||||
|  |   float: left ; | ||||||
|  |   margin-right: 1em } | ||||||
|  | 
 | ||||||
|  | img.align-right, .figure.align-right, object.align-right { | ||||||
|  |   clear: right ; | ||||||
|  |   float: right ; | ||||||
|  |   margin-left: 1em } | ||||||
|  | 
 | ||||||
|  | img.align-center, .figure.align-center, object.align-center { | ||||||
|  |   display: block; | ||||||
|  |   margin-left: auto; | ||||||
|  |   margin-right: auto; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .align-left { | ||||||
|  |   text-align: left } | ||||||
|  | 
 | ||||||
|  | .align-center { | ||||||
|  |   clear: both ; | ||||||
|  |   text-align: center } | ||||||
|  | 
 | ||||||
|  | .align-right { | ||||||
|  |   text-align: right } | ||||||
|  | 
 | ||||||
|  | /* reset inner alignment in figures */ | ||||||
|  | div.align-right { | ||||||
|  |   text-align: left } | ||||||
|  | 
 | ||||||
|  | /* div.align-center * { */ | ||||||
|  | /*   text-align: left } */ | ||||||
|  | 
 | ||||||
|  | ol.simple, ul.simple { | ||||||
|  |   margin-bottom: 1em } | ||||||
|  | 
 | ||||||
|  | ol.arabic { | ||||||
|  |   list-style: decimal } | ||||||
|  | 
 | ||||||
|  | ol.loweralpha { | ||||||
|  |   list-style: lower-alpha } | ||||||
|  | 
 | ||||||
|  | ol.upperalpha { | ||||||
|  |   list-style: upper-alpha } | ||||||
|  | 
 | ||||||
|  | ol.lowerroman { | ||||||
|  |   list-style: lower-roman } | ||||||
|  | 
 | ||||||
|  | ol.upperroman { | ||||||
|  |   list-style: upper-roman } | ||||||
|  | 
 | ||||||
|  | p.attribution { | ||||||
|  |   text-align: right ; | ||||||
|  |   margin-left: 50% } | ||||||
|  | 
 | ||||||
|  | p.caption { | ||||||
|  |   font-style: italic } | ||||||
|  | 
 | ||||||
|  | p.credits { | ||||||
|  |   font-style: italic ; | ||||||
|  |   font-size: smaller } | ||||||
|  | 
 | ||||||
|  | p.label { | ||||||
|  |   white-space: nowrap } | ||||||
|  | 
 | ||||||
|  | p.rubric { | ||||||
|  |   font-weight: bold ; | ||||||
|  |   font-size: larger ; | ||||||
|  |   color: maroon ; | ||||||
|  |   text-align: center } | ||||||
|  | 
 | ||||||
|  | p.sidebar-title { | ||||||
|  |   font-family: sans-serif ; | ||||||
|  |   font-weight: bold ; | ||||||
|  |   font-size: larger } | ||||||
|  | 
 | ||||||
|  | p.sidebar-subtitle { | ||||||
|  |   font-family: sans-serif ; | ||||||
|  |   font-weight: bold } | ||||||
|  | 
 | ||||||
|  | p.topic-title { | ||||||
|  |   font-weight: bold } | ||||||
|  | 
 | ||||||
|  | pre.address { | ||||||
|  |   margin-bottom: 0 ; | ||||||
|  |   margin-top: 0 ; | ||||||
|  |   font: inherit } | ||||||
|  | 
 | ||||||
|  | pre.literal-block, pre.doctest-block { | ||||||
|  |   margin-left: 2em ; | ||||||
|  |   margin-right: 2em } | ||||||
|  | 
 | ||||||
|  | span.classifier { | ||||||
|  |   font-family: sans-serif ; | ||||||
|  |   font-style: oblique } | ||||||
|  | 
 | ||||||
|  | span.classifier-delimiter { | ||||||
|  |   font-family: sans-serif ; | ||||||
|  |   font-weight: bold } | ||||||
|  | 
 | ||||||
|  | span.interpreted { | ||||||
|  |   font-family: sans-serif } | ||||||
|  | 
 | ||||||
|  | span.option { | ||||||
|  |   white-space: nowrap } | ||||||
|  | 
 | ||||||
|  | span.pre { | ||||||
|  |   white-space: pre } | ||||||
|  | 
 | ||||||
|  | span.problematic { | ||||||
|  |   color: red } | ||||||
|  | 
 | ||||||
|  | span.section-subtitle { | ||||||
|  |   /* font-size relative to parent (h1..h6 element) */ | ||||||
|  |   font-size: 80% } | ||||||
|  | 
 | ||||||
|  | table.citation { | ||||||
|  |   border-left: solid 1px gray; | ||||||
|  |   margin-left: 1px } | ||||||
|  | 
 | ||||||
|  | table.docinfo { | ||||||
|  |   margin: 2em 4em } | ||||||
|  | 
 | ||||||
|  | table.docutils { | ||||||
|  |   margin-top: 0.5em ; | ||||||
|  |   margin-bottom: 0.5em } | ||||||
|  | 
 | ||||||
|  | table.footnote { | ||||||
|  |   border-left: solid 1px black; | ||||||
|  |   margin-left: 1px } | ||||||
|  | 
 | ||||||
|  | table.docutils td, table.docutils th, | ||||||
|  | table.docinfo td, table.docinfo th { | ||||||
|  |   padding-left: 0.5em ; | ||||||
|  |   padding-right: 0.5em ; | ||||||
|  |   vertical-align: top } | ||||||
|  | 
 | ||||||
|  | table.docutils th.field-name, table.docinfo th.docinfo-name { | ||||||
|  |   font-weight: bold ; | ||||||
|  |   text-align: left ; | ||||||
|  |   white-space: nowrap ; | ||||||
|  |   padding-left: 0 } | ||||||
|  | 
 | ||||||
|  | h1 tt.docutils, h2 tt.docutils, h3 tt.docutils, | ||||||
|  | h4 tt.docutils, h5 tt.docutils, h6 tt.docutils { | ||||||
|  |   font-size: 100% } | ||||||
|  | 
 | ||||||
|  | ul.auto-toc { | ||||||
|  |   list-style-type: none } | ||||||
|  | 
 | ||||||
|  | </style> | ||||||
|  | </head> | ||||||
|  | <body> | ||||||
|  | <div class="document" id="compiling-dfhack"> | ||||||
|  | <h1 class="title">Compiling DFHACK</h1> | ||||||
|  | <h2 class="subtitle" id="here-s-how-you-build-dfhack">Here's how you build dfhack!</h2> | ||||||
|  | 
 | ||||||
|  | <div class="contents topic" id="contents"> | ||||||
|  | <p class="topic-title first">Contents</p> | ||||||
|  | <ul class="simple"> | ||||||
|  | <li><a class="reference internal" href="#dependencies" id="id1">Dependencies</a></li> | ||||||
|  | <li><a class="reference internal" href="#building-on-linux" id="id2">Building on Linux</a></li> | ||||||
|  | <li><a class="reference internal" href="#building-on-windows" id="id3">Building on Windows</a><ul> | ||||||
|  | <li><a class="reference internal" href="#using-mingw" id="id4">Using mingw</a><ul> | ||||||
|  | <li><a class="reference internal" href="#building" id="id5">Building</a></li> | ||||||
|  | </ul> | ||||||
|  | </li> | ||||||
|  | <li><a class="reference internal" href="#using-msvc" id="id6">Using MSVC</a></li> | ||||||
|  | <li><a class="reference internal" href="#using-some-other-compiler" id="id7">Using some other compiler</a></li> | ||||||
|  | </ul> | ||||||
|  | </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="#building-the-shared-memory-hook-library-shm" id="id10">Building the shared memory hook library (SHM)</a></li> | ||||||
|  | </ul> | ||||||
|  | </div> | ||||||
|  | <div class="section" id="dependencies"> | ||||||
|  | <h1><a class="toc-backref" href="#id1">Dependencies</a></h1> | ||||||
|  | <ul class="simple"> | ||||||
|  | <li><tt class="docutils literal">cmake</tt></li> | ||||||
|  | <li>A compiler for building the main lib and the various tools.</li> | ||||||
|  | <li>(Linux only) Veinlook requires the wide-character ncurses library (libncursesw)</li> | ||||||
|  | <li>(Linux only) You'll need X11 dev libraries.</li> | ||||||
|  | </ul> | ||||||
|  | </div> | ||||||
|  | <div class="section" id="building-on-linux"> | ||||||
|  | <h1><a class="toc-backref" href="#id2">Building on Linux</a></h1> | ||||||
|  | <p>To run in the output folder (without installing) building the library | ||||||
|  | is simple. Enter the build folder, run the tools. Like this:</p> | ||||||
|  | <pre class="literal-block"> | ||||||
|  | cd build | ||||||
|  | cmake .. -DCMAKE_BUILD_TYPE:string=Release | ||||||
|  | make | ||||||
|  | </pre> | ||||||
|  | <p>This will build the library and its tools and place them in <tt class="docutils literal">/output</tt>. | ||||||
|  | You can also use a cmake-friendly IDE like KDevelop 4 or the cmake GUI | ||||||
|  | program.</p> | ||||||
|  | <p>To be installed into the system or packaged:</p> | ||||||
|  | <pre class="literal-block"> | ||||||
|  | cd build | ||||||
|  | cmake -DCMAKE_BUILD_TYPE:string=Release \ | ||||||
|  |     -DCMAKE_INSTALL_PREFIX=/usr \ | ||||||
|  |     -DMEMXML_DATA_PATH:path=/usr/share/dfhack .. | ||||||
|  | make | ||||||
|  | make install | ||||||
|  | </pre> | ||||||
|  | <p>With this dfhack installs:</p> | ||||||
|  | <ul class="simple"> | ||||||
|  | <li>library to <tt class="docutils literal">$CMAKE_INSTALL_PREFIX/lib</tt></li> | ||||||
|  | <li>executables to <tt class="docutils literal">$CMAKE_INSTALL_PREFIX/bin</tt></li> | ||||||
|  | <li>The <tt class="docutils literal">Memory.xml</tt> file to <tt class="docutils literal">/usr/share/dfhack</tt></li> | ||||||
|  | </ul> | ||||||
|  | <p>See the section on the shared memory hook library (SHM).</p> | ||||||
|  | </div> | ||||||
|  | <div class="section" id="building-on-windows"> | ||||||
|  | <h1><a class="toc-backref" href="#id3">Building on Windows</a></h1> | ||||||
|  | <p>You need <tt class="docutils literal">cmake</tt>. Get the win32 installer version from the official | ||||||
|  | site: <a class="reference external" href="http://www.cmake.org/cmake/resources/software.html">http://www.cmake.org/cmake/resources/software.html</a></p> | ||||||
|  | <p>It has the usual installer wizard thing.</p> | ||||||
|  | <div class="section" id="using-mingw"> | ||||||
|  | <h2><a class="toc-backref" href="#id4">Using mingw</a></h2> | ||||||
|  | <p>You also need a compiler. I build dfhack using mingw. You can get it | ||||||
|  | from the mingw site: <a class="reference external" href="http://www.mingw.org/">http://www.mingw.org/</a></p> | ||||||
|  | <p>Get the automated installer, it will download newest version of mingw | ||||||
|  | and set things up nicely.</p> | ||||||
|  | <p>You'll have to add <tt class="docutils literal"><span class="pre">C:\MinGW\</span></tt> to your PATH variable.</p> | ||||||
|  | <div class="section" id="building"> | ||||||
|  | <h3><a class="toc-backref" href="#id5">Building</a></h3> | ||||||
|  | <p>open up cmd and navigate to the <tt class="docutils literal">dfhack\build</tt> folder, run <tt class="docutils literal">cmake</tt> | ||||||
|  | and the mingw version of make:</p> | ||||||
|  | <pre class="literal-block"> | ||||||
|  | cd build | ||||||
|  | cmake .. -G"MinGW Makefiles" -DCMAKE_BUILD_TYPE:string=Release | ||||||
|  | mingw32-make | ||||||
|  | </pre> | ||||||
|  | </div> | ||||||
|  | </div> | ||||||
|  | <div class="section" id="using-msvc"> | ||||||
|  | <h2><a class="toc-backref" href="#id6">Using MSVC</a></h2> | ||||||
|  | <p>open up <tt class="docutils literal">cmd</tt> and navigate to the <tt class="docutils literal">dfhack\build</tt> folder, run | ||||||
|  | <tt class="docutils literal">cmake</tt>:</p> | ||||||
|  | <pre class="literal-block"> | ||||||
|  | cd build | ||||||
|  | cmake .. | ||||||
|  | </pre> | ||||||
|  | <p>This will generate MSVC solution and project files.</p> | ||||||
|  | <div class="note"> | ||||||
|  | <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 | ||||||
|  | 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 <tt class="docutils literal">cmake</tt> on them!</p> | ||||||
|  | </div> | ||||||
|  | </div> | ||||||
|  | <div class="section" id="using-some-other-compiler"> | ||||||
|  | <h2><a class="toc-backref" href="#id7">Using some other compiler</a></h2> | ||||||
|  | <p>I'm afraid you are on your own. dfhack wasn't tested with any other | ||||||
|  | compiler.</p> | ||||||
|  | <p>Try using a different cmake generator that's intended for your tools.</p> | ||||||
|  | </div> | ||||||
|  | </div> | ||||||
|  | <div class="section" id="build-targets"> | ||||||
|  | <h1><a class="toc-backref" href="#id8">Build targets</a></h1> | ||||||
|  | <p>dfhack has a few build targets:</p> | ||||||
|  | <ul> | ||||||
|  | <li><p class="first">If you're only after the library run <tt class="docutils literal">make dfhack</tt>.</p> | ||||||
|  | </li> | ||||||
|  | <li><p class="first"><tt class="docutils literal">make</tt> will build everything.</p> | ||||||
|  | </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> | ||||||
|  | </div> | ||||||
|  | <div class="section" id="build-types"> | ||||||
|  | <h1><a class="toc-backref" href="#id9">Build types</a></h1> | ||||||
|  | <p><tt class="docutils literal">cmake</tt> allows you to pick a build type by changing this | ||||||
|  | variable: <tt class="docutils literal">CMAKE_BUILD_TYPE</tt></p> | ||||||
|  | <pre class="literal-block"> | ||||||
|  | cmake .. -DCMAKE_BUILD_TYPE:string=BUILD_TYPE | ||||||
|  | </pre> | ||||||
|  | <p>Without specifying a build type or 'None', cmake uses the | ||||||
|  | <tt class="docutils literal">CMAKE_CXX_FLAGS</tt> variable for building.</p> | ||||||
|  | <p>Valid an useful build types include 'Release', 'Debug' and | ||||||
|  | 'RelWithDebInfo'. There are others, but they aren't really that useful.</p> | ||||||
|  | <p>Have fun.</p> | ||||||
|  | </div> | ||||||
|  | <div class="section" id="building-the-shared-memory-hook-library-shm"> | ||||||
|  | <h1><a class="toc-backref" href="#id10">Building the shared memory hook library (SHM)</a></h1> | ||||||
|  | <p>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.</p> | ||||||
|  | <p>For DF 31.01 - 31.12 on Windows, use MSVC 2008. You can get the Express | ||||||
|  | edition for free from Microsoft.</p> | ||||||
|  | </div> | ||||||
|  | </div> | ||||||
|  | </body> | ||||||
|  | </html> | ||||||
| @ -1,174 +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 |  | ||||||
| 
 |  | ||||||
| * Linux |  | ||||||
|   wine together with the Windows versions |  | ||||||
| 
 |  | ||||||
| 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 :) |  | ||||||
| 
 |  | ||||||
|  - 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 ~ |  | ||||||
| @ -0,0 +1,260 @@ | |||||||
|  | ============ | ||||||
|  | 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. | ||||||
|  | 
 | ||||||
|  | dfprobe | ||||||
|  | ============ | ||||||
|  | Can be used to determine tile properties. | ||||||
|  | 
 | ||||||
|  | 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. | ||||||
|  | 
 | ||||||
|  | dfcleartask | ||||||
|  | =========== | ||||||
|  | Solves the problem of unusable items after reclaim by clearing the 'in_job' bit of all items. | ||||||
|  | 
 | ||||||
|  | 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. | ||||||
|  | 
 | ||||||
| @ -0,0 +1,601 @@ | |||||||
|  | <?xml version="1.0" encoding="utf-8" ?> | ||||||
|  | <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> | ||||||
|  | <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> | ||||||
|  | <head> | ||||||
|  | <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> | ||||||
|  | <meta name="generator" content="Docutils 0.7: http://docutils.sourceforge.net/" /> | ||||||
|  | <title></title> | ||||||
|  | <style type="text/css"> | ||||||
|  | 
 | ||||||
|  | /* | ||||||
|  | :Author: David Goodger (goodger@python.org) | ||||||
|  | :Id: $Id: html4css1.css 6253 2010-03-02 00:24:53Z milde $ | ||||||
|  | :Copyright: This stylesheet has been placed in the public domain. | ||||||
|  | 
 | ||||||
|  | Default cascading style sheet for the HTML output of Docutils. | ||||||
|  | 
 | ||||||
|  | See http://docutils.sf.net/docs/howto/html-stylesheets.html for how to | ||||||
|  | customize this style sheet. | ||||||
|  | */ | ||||||
|  | 
 | ||||||
|  | /* used to remove borders from tables and images */ | ||||||
|  | .borderless, table.borderless td, table.borderless th { | ||||||
|  |   border: 0 } | ||||||
|  | 
 | ||||||
|  | table.borderless td, table.borderless th { | ||||||
|  |   /* Override padding for "table.docutils td" with "! important". | ||||||
|  |      The right padding separates the table cells. */ | ||||||
|  |   padding: 0 0.5em 0 0 ! important } | ||||||
|  | 
 | ||||||
|  | .first { | ||||||
|  |   /* Override more specific margin styles with "! important". */ | ||||||
|  |   margin-top: 0 ! important } | ||||||
|  | 
 | ||||||
|  | .last, .with-subtitle { | ||||||
|  |   margin-bottom: 0 ! important } | ||||||
|  | 
 | ||||||
|  | .hidden { | ||||||
|  |   display: none } | ||||||
|  | 
 | ||||||
|  | a.toc-backref { | ||||||
|  |   text-decoration: none ; | ||||||
|  |   color: black } | ||||||
|  | 
 | ||||||
|  | blockquote.epigraph { | ||||||
|  |   margin: 2em 5em ; } | ||||||
|  | 
 | ||||||
|  | dl.docutils dd { | ||||||
|  |   margin-bottom: 0.5em } | ||||||
|  | 
 | ||||||
|  | /* Uncomment (and remove this text!) to get bold-faced definition list terms | ||||||
|  | dl.docutils dt { | ||||||
|  |   font-weight: bold } | ||||||
|  | */ | ||||||
|  | 
 | ||||||
|  | div.abstract { | ||||||
|  |   margin: 2em 5em } | ||||||
|  | 
 | ||||||
|  | div.abstract p.topic-title { | ||||||
|  |   font-weight: bold ; | ||||||
|  |   text-align: center } | ||||||
|  | 
 | ||||||
|  | div.admonition, div.attention, div.caution, div.danger, div.error, | ||||||
|  | div.hint, div.important, div.note, div.tip, div.warning { | ||||||
|  |   margin: 2em ; | ||||||
|  |   border: medium outset ; | ||||||
|  |   padding: 1em } | ||||||
|  | 
 | ||||||
|  | div.admonition p.admonition-title, div.hint p.admonition-title, | ||||||
|  | div.important p.admonition-title, div.note p.admonition-title, | ||||||
|  | div.tip p.admonition-title { | ||||||
|  |   font-weight: bold ; | ||||||
|  |   font-family: sans-serif } | ||||||
|  | 
 | ||||||
|  | div.attention p.admonition-title, div.caution p.admonition-title, | ||||||
|  | div.danger p.admonition-title, div.error p.admonition-title, | ||||||
|  | div.warning p.admonition-title { | ||||||
|  |   color: red ; | ||||||
|  |   font-weight: bold ; | ||||||
|  |   font-family: sans-serif } | ||||||
|  | 
 | ||||||
|  | /* Uncomment (and remove this text!) to get reduced vertical space in | ||||||
|  |    compound paragraphs. | ||||||
|  | div.compound .compound-first, div.compound .compound-middle { | ||||||
|  |   margin-bottom: 0.5em } | ||||||
|  | 
 | ||||||
|  | div.compound .compound-last, div.compound .compound-middle { | ||||||
|  |   margin-top: 0.5em } | ||||||
|  | */ | ||||||
|  | 
 | ||||||
|  | div.dedication { | ||||||
|  |   margin: 2em 5em ; | ||||||
|  |   text-align: center ; | ||||||
|  |   font-style: italic } | ||||||
|  | 
 | ||||||
|  | div.dedication p.topic-title { | ||||||
|  |   font-weight: bold ; | ||||||
|  |   font-style: normal } | ||||||
|  | 
 | ||||||
|  | div.figure { | ||||||
|  |   margin-left: 2em ; | ||||||
|  |   margin-right: 2em } | ||||||
|  | 
 | ||||||
|  | div.footer, div.header { | ||||||
|  |   clear: both; | ||||||
|  |   font-size: smaller } | ||||||
|  | 
 | ||||||
|  | div.line-block { | ||||||
|  |   display: block ; | ||||||
|  |   margin-top: 1em ; | ||||||
|  |   margin-bottom: 1em } | ||||||
|  | 
 | ||||||
|  | div.line-block div.line-block { | ||||||
|  |   margin-top: 0 ; | ||||||
|  |   margin-bottom: 0 ; | ||||||
|  |   margin-left: 1.5em } | ||||||
|  | 
 | ||||||
|  | div.sidebar { | ||||||
|  |   margin: 0 0 0.5em 1em ; | ||||||
|  |   border: medium outset ; | ||||||
|  |   padding: 1em ; | ||||||
|  |   background-color: #ffffee ; | ||||||
|  |   width: 40% ; | ||||||
|  |   float: right ; | ||||||
|  |   clear: right } | ||||||
|  | 
 | ||||||
|  | div.sidebar p.rubric { | ||||||
|  |   font-family: sans-serif ; | ||||||
|  |   font-size: medium } | ||||||
|  | 
 | ||||||
|  | div.system-messages { | ||||||
|  |   margin: 5em } | ||||||
|  | 
 | ||||||
|  | div.system-messages h1 { | ||||||
|  |   color: red } | ||||||
|  | 
 | ||||||
|  | div.system-message { | ||||||
|  |   border: medium outset ; | ||||||
|  |   padding: 1em } | ||||||
|  | 
 | ||||||
|  | div.system-message p.system-message-title { | ||||||
|  |   color: red ; | ||||||
|  |   font-weight: bold } | ||||||
|  | 
 | ||||||
|  | div.topic { | ||||||
|  |   margin: 2em } | ||||||
|  | 
 | ||||||
|  | h1.section-subtitle, h2.section-subtitle, h3.section-subtitle, | ||||||
|  | h4.section-subtitle, h5.section-subtitle, h6.section-subtitle { | ||||||
|  |   margin-top: 0.4em } | ||||||
|  | 
 | ||||||
|  | h1.title { | ||||||
|  |   text-align: center } | ||||||
|  | 
 | ||||||
|  | h2.subtitle { | ||||||
|  |   text-align: center } | ||||||
|  | 
 | ||||||
|  | hr.docutils { | ||||||
|  |   width: 75% } | ||||||
|  | 
 | ||||||
|  | img.align-left, .figure.align-left, object.align-left { | ||||||
|  |   clear: left ; | ||||||
|  |   float: left ; | ||||||
|  |   margin-right: 1em } | ||||||
|  | 
 | ||||||
|  | img.align-right, .figure.align-right, object.align-right { | ||||||
|  |   clear: right ; | ||||||
|  |   float: right ; | ||||||
|  |   margin-left: 1em } | ||||||
|  | 
 | ||||||
|  | img.align-center, .figure.align-center, object.align-center { | ||||||
|  |   display: block; | ||||||
|  |   margin-left: auto; | ||||||
|  |   margin-right: auto; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .align-left { | ||||||
|  |   text-align: left } | ||||||
|  | 
 | ||||||
|  | .align-center { | ||||||
|  |   clear: both ; | ||||||
|  |   text-align: center } | ||||||
|  | 
 | ||||||
|  | .align-right { | ||||||
|  |   text-align: right } | ||||||
|  | 
 | ||||||
|  | /* reset inner alignment in figures */ | ||||||
|  | div.align-right { | ||||||
|  |   text-align: left } | ||||||
|  | 
 | ||||||
|  | /* div.align-center * { */ | ||||||
|  | /*   text-align: left } */ | ||||||
|  | 
 | ||||||
|  | ol.simple, ul.simple { | ||||||
|  |   margin-bottom: 1em } | ||||||
|  | 
 | ||||||
|  | ol.arabic { | ||||||
|  |   list-style: decimal } | ||||||
|  | 
 | ||||||
|  | ol.loweralpha { | ||||||
|  |   list-style: lower-alpha } | ||||||
|  | 
 | ||||||
|  | ol.upperalpha { | ||||||
|  |   list-style: upper-alpha } | ||||||
|  | 
 | ||||||
|  | ol.lowerroman { | ||||||
|  |   list-style: lower-roman } | ||||||
|  | 
 | ||||||
|  | ol.upperroman { | ||||||
|  |   list-style: upper-roman } | ||||||
|  | 
 | ||||||
|  | p.attribution { | ||||||
|  |   text-align: right ; | ||||||
|  |   margin-left: 50% } | ||||||
|  | 
 | ||||||
|  | p.caption { | ||||||
|  |   font-style: italic } | ||||||
|  | 
 | ||||||
|  | p.credits { | ||||||
|  |   font-style: italic ; | ||||||
|  |   font-size: smaller } | ||||||
|  | 
 | ||||||
|  | p.label { | ||||||
|  |   white-space: nowrap } | ||||||
|  | 
 | ||||||
|  | p.rubric { | ||||||
|  |   font-weight: bold ; | ||||||
|  |   font-size: larger ; | ||||||
|  |   color: maroon ; | ||||||
|  |   text-align: center } | ||||||
|  | 
 | ||||||
|  | p.sidebar-title { | ||||||
|  |   font-family: sans-serif ; | ||||||
|  |   font-weight: bold ; | ||||||
|  |   font-size: larger } | ||||||
|  | 
 | ||||||
|  | p.sidebar-subtitle { | ||||||
|  |   font-family: sans-serif ; | ||||||
|  |   font-weight: bold } | ||||||
|  | 
 | ||||||
|  | p.topic-title { | ||||||
|  |   font-weight: bold } | ||||||
|  | 
 | ||||||
|  | pre.address { | ||||||
|  |   margin-bottom: 0 ; | ||||||
|  |   margin-top: 0 ; | ||||||
|  |   font: inherit } | ||||||
|  | 
 | ||||||
|  | pre.literal-block, pre.doctest-block { | ||||||
|  |   margin-left: 2em ; | ||||||
|  |   margin-right: 2em } | ||||||
|  | 
 | ||||||
|  | span.classifier { | ||||||
|  |   font-family: sans-serif ; | ||||||
|  |   font-style: oblique } | ||||||
|  | 
 | ||||||
|  | span.classifier-delimiter { | ||||||
|  |   font-family: sans-serif ; | ||||||
|  |   font-weight: bold } | ||||||
|  | 
 | ||||||
|  | span.interpreted { | ||||||
|  |   font-family: sans-serif } | ||||||
|  | 
 | ||||||
|  | span.option { | ||||||
|  |   white-space: nowrap } | ||||||
|  | 
 | ||||||
|  | span.pre { | ||||||
|  |   white-space: pre } | ||||||
|  | 
 | ||||||
|  | span.problematic { | ||||||
|  |   color: red } | ||||||
|  | 
 | ||||||
|  | span.section-subtitle { | ||||||
|  |   /* font-size relative to parent (h1..h6 element) */ | ||||||
|  |   font-size: 80% } | ||||||
|  | 
 | ||||||
|  | table.citation { | ||||||
|  |   border-left: solid 1px gray; | ||||||
|  |   margin-left: 1px } | ||||||
|  | 
 | ||||||
|  | table.docinfo { | ||||||
|  |   margin: 2em 4em } | ||||||
|  | 
 | ||||||
|  | table.docutils { | ||||||
|  |   margin-top: 0.5em ; | ||||||
|  |   margin-bottom: 0.5em } | ||||||
|  | 
 | ||||||
|  | table.footnote { | ||||||
|  |   border-left: solid 1px black; | ||||||
|  |   margin-left: 1px } | ||||||
|  | 
 | ||||||
|  | table.docutils td, table.docutils th, | ||||||
|  | table.docinfo td, table.docinfo th { | ||||||
|  |   padding-left: 0.5em ; | ||||||
|  |   padding-right: 0.5em ; | ||||||
|  |   vertical-align: top } | ||||||
|  | 
 | ||||||
|  | table.docutils th.field-name, table.docinfo th.docinfo-name { | ||||||
|  |   font-weight: bold ; | ||||||
|  |   text-align: left ; | ||||||
|  |   white-space: nowrap ; | ||||||
|  |   padding-left: 0 } | ||||||
|  | 
 | ||||||
|  | h1 tt.docutils, h2 tt.docutils, h3 tt.docutils, | ||||||
|  | h4 tt.docutils, h5 tt.docutils, h6 tt.docutils { | ||||||
|  |   font-size: 100% } | ||||||
|  | 
 | ||||||
|  | ul.auto-toc { | ||||||
|  |   list-style-type: none } | ||||||
|  | 
 | ||||||
|  | </style> | ||||||
|  | </head> | ||||||
|  | <body> | ||||||
|  | <div class="document"> | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | <div class="section" id="introduction"> | ||||||
|  | <h1><a class="toc-backref" href="#id1">Introduction</a></h1> | ||||||
|  | <p>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.</p> | ||||||
|  | <p>It is an attempt to unite the various ways tools access DF memory and | ||||||
|  | allow for easier development of new tools.</p> | ||||||
|  | <div class="contents topic" id="contents"> | ||||||
|  | <p class="topic-title first">Contents</p> | ||||||
|  | <ul class="simple"> | ||||||
|  | <li><a class="reference internal" href="#introduction" id="id1">Introduction</a></li> | ||||||
|  | <li><a class="reference internal" href="#getting-dfhack" id="id2">Getting DFHack</a><ul> | ||||||
|  | <li><a class="reference internal" href="#packages" id="id3">Packages</a></li> | ||||||
|  | </ul> | ||||||
|  | </li> | ||||||
|  | <li><a class="reference internal" href="#compatibility" id="id4">Compatibility</a><ul> | ||||||
|  | <li><a class="reference internal" href="#windows" id="id5">Windows</a></li> | ||||||
|  | <li><a class="reference internal" href="#linux" id="id6">Linux</a></li> | ||||||
|  | </ul> | ||||||
|  | </li> | ||||||
|  | <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="#dfliquids" id="id9">dfliquids</a></li> | ||||||
|  | <li><a class="reference internal" href="#dfposition" id="id10">dfposition</a></li> | ||||||
|  | <li><a class="reference internal" href="#dfprospector" id="id11">dfprospector</a></li> | ||||||
|  | <li><a class="reference internal" href="#dfreveal" id="id12">dfreveal</a></li> | ||||||
|  | <li><a class="reference internal" href="#dfunstuck" id="id13">dfunstuck</a></li> | ||||||
|  | <li><a class="reference internal" href="#dfvdig" id="id14">dfvdig</a></li> | ||||||
|  | <li><a class="reference internal" href="#dfflows" id="id15">dfflows</a></li> | ||||||
|  | <li><a class="reference internal" href="#dfattachtest" id="id16">dfattachtest</a></li> | ||||||
|  | <li><a class="reference internal" href="#dfsuspend" id="id17">dfsuspend</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> | ||||||
|  | </li> | ||||||
|  | <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="id23">Contributing to DFHack</a><ul> | ||||||
|  | <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="id25">How to get new code into DFHack</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="id27">Modules - what are they?</a></li> | ||||||
|  | <li><a class="reference internal" href="#dependencies" id="id28">Dependencies</a><ul> | ||||||
|  | <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="id30">Current external dependencies</a></li> | ||||||
|  | <li><a class="reference internal" href="#build-time-dependencies" id="id31">Build-time dependencies</a></li> | ||||||
|  | </ul> | ||||||
|  | </li> | ||||||
|  | </ul> | ||||||
|  | </li> | ||||||
|  | </ul> | ||||||
|  | </li> | ||||||
|  | <li><a class="reference internal" href="#memory-offset-definitions" id="id32">Memory offset definitions</a></li> | ||||||
|  | </ul> | ||||||
|  | </div> | ||||||
|  | </div> | ||||||
|  | <div class="section" id="getting-dfhack"> | ||||||
|  | <h1><a class="toc-backref" href="#id2">Getting DFHack</a></h1> | ||||||
|  | <p>The project is currently hosted on <a class="reference external" href="http://www.github.com/">github</a>, for both source and | ||||||
|  | binaries at  <a class="reference external" href="http://github.com/peterix/dfhack">http://github.com/peterix/dfhack</a></p> | ||||||
|  | <div class="section" id="packages"> | ||||||
|  | <h2><a class="toc-backref" href="#id3">Packages</a></h2> | ||||||
|  | <p>The library and tools are packaged for Archlinux and are available both | ||||||
|  | in AUR and the arch-games repository.</p> | ||||||
|  | <p>The package name is dfhack-git :)</p> | ||||||
|  | </div> | ||||||
|  | </div> | ||||||
|  | <div class="section" id="compatibility"> | ||||||
|  | <h1><a class="toc-backref" href="#id4">Compatibility</a></h1> | ||||||
|  | <p>DFHack works on Windows XP, Vista, 7 or any modern Linux distribution.</p> | ||||||
|  | <p>OSX is not supported due to lack of developers with a Mac.</p> | ||||||
|  | <p>Currently supported Dwarf Fortress versions are Windows and Linux.</p> | ||||||
|  | <div class="section" id="windows"> | ||||||
|  | <h2><a class="toc-backref" href="#id5">Windows</a></h2> | ||||||
|  | <div class="note"> | ||||||
|  | <p class="first admonition-title">Note</p> | ||||||
|  | <p class="last">Windows 2000 is currently <em>not supported</em> due to missing OS | ||||||
|  | functionality. If you know how to easily suspend processes, you can | ||||||
|  | fix it :)</p> | ||||||
|  | </div> | ||||||
|  | <p>0.31.01 - 0.31.03 legacy | ||||||
|  | 0.31.04 - 0.31.12 SDL</p> | ||||||
|  | </div> | ||||||
|  | <div class="section" id="linux"> | ||||||
|  | <h2><a class="toc-backref" href="#id6">Linux</a></h2> | ||||||
|  | <p>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.</p> | ||||||
|  | </div> | ||||||
|  | </div> | ||||||
|  | <div class="section" id="tools"> | ||||||
|  | <h1><a class="toc-backref" href="#id7">Tools</a></h1> | ||||||
|  | <p>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.</p> | ||||||
|  | <div class="section" id="dfcleanmap"> | ||||||
|  | <h2><a class="toc-backref" href="#id8">dfcleanmap</a></h2> | ||||||
|  | <p>Cleans all the splatter that get scattered all over the map. | ||||||
|  | Only exception is mud. It leaves mud alone.</p> | ||||||
|  | </div> | ||||||
|  | <div class="section" id="dfliquids"> | ||||||
|  | <h2><a class="toc-backref" href="#id9">dfliquids</a></h2> | ||||||
|  | <p>A command prompt for liquid creation and manipulation (the Moses | ||||||
|  | effect included!) Also allows painting obsidian walls directly.</p> | ||||||
|  | <div class="note"> | ||||||
|  | <p class="first admonition-title">Note</p> | ||||||
|  | <p class="last">Spawning and deleting liquids can F up pathing data and | ||||||
|  | temperatures (creating heat traps). You've been warned.</p> | ||||||
|  | </div> | ||||||
|  | </div> | ||||||
|  | <div class="section" id="dfposition"> | ||||||
|  | <h2><a class="toc-backref" href="#id10">dfposition</a></h2> | ||||||
|  | <p>Prints the current DF window properties and cursor position.</p> | ||||||
|  | </div> | ||||||
|  | <div class="section" id="dfprospector"> | ||||||
|  | <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> | ||||||
|  | </div> | ||||||
|  | <div class="section" id="dfreveal"> | ||||||
|  | <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 | ||||||
|  | the tool while it waits, the map remains revealed.</p> | ||||||
|  | </div> | ||||||
|  | <div class="section" id="dfunstuck"> | ||||||
|  | <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 | ||||||
|  | stuck.</p> | ||||||
|  | </div> | ||||||
|  | <div class="section" id="dfvdig"> | ||||||
|  | <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 | ||||||
|  | this thing :)</p> | ||||||
|  | </div> | ||||||
|  | <div class="section" id="dfflows"> | ||||||
|  | <h2><a class="toc-backref" href="#id15">dfflows</a></h2> | ||||||
|  | <p>A tool for checking how many liquid tiles are actively checked for | ||||||
|  | flows.</p> | ||||||
|  | </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"> | ||||||
|  | <h2><a class="toc-backref" href="#id21">Your tool here</a></h2> | ||||||
|  | <p>Write one ;)</p> | ||||||
|  | </div> | ||||||
|  | </div> | ||||||
|  | <div class="section" id="using-the-library-as-a-developer"> | ||||||
|  | <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 | ||||||
|  | MinGW32 and MSVC compilers. It is using the cmake build system. See | ||||||
|  | COMPILE for details.</p> | ||||||
|  | <p>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 :)</p> | ||||||
|  | <p>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).</p> | ||||||
|  | <div class="section" id="contributing-to-dfhack"> | ||||||
|  | <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> | ||||||
|  | <div class="section" id="coding-style"> | ||||||
|  | <h3><a class="toc-backref" href="#id24">Coding style</a></h3> | ||||||
|  | <p>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 <em>you</em> fix it ;)</p> | ||||||
|  | </div> | ||||||
|  | <div class="section" id="how-to-get-new-code-into-dfhack"> | ||||||
|  | <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 | ||||||
|  | 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> | ||||||
|  | <p>Fixes are higher in priority. If you want to work on something, but | ||||||
|  | don't know what, check out <a class="reference external" href="http://github.com/peterix/dfhack/issues">http://github.com/peterix/dfhack/issues</a> -- | ||||||
|  | this is also a good place to dump new ideas and/or bugs that need | ||||||
|  | fixing.</p> | ||||||
|  | </div> | ||||||
|  | <div class="section" id="layout-for-tools"> | ||||||
|  | <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 | ||||||
|  | categories.</p> | ||||||
|  | <dl class="docutils"> | ||||||
|  | <dt>distributed</dt> | ||||||
|  | <dd>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.</dd> | ||||||
|  | <dt>examples</dt> | ||||||
|  | <dd>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.</dd> | ||||||
|  | <dt>playground</dt> | ||||||
|  | <dd>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.</dd> | ||||||
|  | </dl> | ||||||
|  | </div> | ||||||
|  | <div class="section" id="modules-what-are-they"> | ||||||
|  | <h3><a class="toc-backref" href="#id27">Modules - what are they?</a></h3> | ||||||
|  | <p>DFHack uses modules to partition sets of features into manageable | ||||||
|  | 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 | ||||||
|  | generally written in C++. It is exposed to the users of DFHack.</p> | ||||||
|  | <p>Server side is used inside DF and serves to accelerate the client | ||||||
|  | modules. This is written mostly in C style.</p> | ||||||
|  | <p>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.</p> | ||||||
|  | <p>A good example of a module is Maps. Named the same in both client and | ||||||
|  | server, it allows accelerating the reading of map blocks.</p> | ||||||
|  | <p>Communication between modules happens by using shared memory. This is | ||||||
|  | pretty fast, but needs quite a bit of care to not break.</p> | ||||||
|  | </div> | ||||||
|  | <div class="section" id="dependencies"> | ||||||
|  | <h3><a class="toc-backref" href="#id28">Dependencies</a></h3> | ||||||
|  | <dl class="docutils"> | ||||||
|  | <dt>Internal</dt> | ||||||
|  | <dd>either part of the codebase or statically linked.</dd> | ||||||
|  | <dt>External</dt> | ||||||
|  | <dd>linked as dynamic loaded libraries (.dll, .so, etc.)</dd> | ||||||
|  | </dl> | ||||||
|  | <p>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.</p> | ||||||
|  | <div class="section" id="current-internal-dependencies"> | ||||||
|  | <h4><a class="toc-backref" href="#id29">Current internal dependencies</a></h4> | ||||||
|  | <dl class="docutils"> | ||||||
|  | <dt>tinyxml</dt> | ||||||
|  | <dd>used by core dfhack to read offset definitions from Memory.xml</dd> | ||||||
|  | <dt>md5</dt> | ||||||
|  | <dd>an implementation of the MD5 hash algorithm. Used for identifying | ||||||
|  | DF binaries on Linux.</dd> | ||||||
|  | <dt>argstream</dt> | ||||||
|  | <dd>Allows reading terminal application arguments. GPL!</dd> | ||||||
|  | </dl> | ||||||
|  | </div> | ||||||
|  | <div class="section" id="current-external-dependencies"> | ||||||
|  | <h4><a class="toc-backref" href="#id30">Current external dependencies</a></h4> | ||||||
|  | <dl class="docutils"> | ||||||
|  | <dt>wide-character ncurses</dt> | ||||||
|  | <dd>used for the veinlook tool on Linux.</dd> | ||||||
|  | <dt>x11 libraries</dt> | ||||||
|  | <dd>used for sending key events on linux</dd> | ||||||
|  | </dl> | ||||||
|  | </div> | ||||||
|  | <div class="section" id="build-time-dependencies"> | ||||||
|  | <h4><a class="toc-backref" href="#id31">Build-time dependencies</a></h4> | ||||||
|  | <dl class="docutils"> | ||||||
|  | <dt>cmake</dt> | ||||||
|  | <dd>you need cmake to generate the build system and some configuration | ||||||
|  | headers</dd> | ||||||
|  | </dl> | ||||||
|  | </div> | ||||||
|  | </div> | ||||||
|  | </div> | ||||||
|  | </div> | ||||||
|  | <div class="section" id="memory-offset-definitions"> | ||||||
|  | <h1><a class="toc-backref" href="#id32">Memory offset definitions</a></h1> | ||||||
|  | <p>The files with memory offset definitions used by dfhack can be found in the | ||||||
|  | data folder.</p> | ||||||
|  | </div> | ||||||
|  | </div> | ||||||
|  | </body> | ||||||
|  | </html> | ||||||
| @ -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,68 @@ | |||||||
|  | # repurposed from libnoise: http://github.com/qknight/libnoise/tree/master/doc/ | ||||||
|  | # following code and comments is by the original author, with some changes by | ||||||
|  | # me (peterix) | ||||||
|  | # ------------------------------------------------------------------------------ | ||||||
|  | # | ||||||
|  | # many thanks go to Philippe Poilbarbe for writing the code this file is based on | ||||||
|  | #  http://www.cmake.org/pipermail/cmake/2006-August/010794.html | ||||||
|  | # | ||||||
|  | # much later i also found this: | ||||||
|  | #  http://tobias.rautenkranz.ch/cmake/doxygen/ | ||||||
|  | # but it is hard to understand... | ||||||
|  | 
 | ||||||
|  | IF (BUILD_DFHACK_DOCUMENTATION) | ||||||
|  | 
 | ||||||
|  | FIND_PACKAGE(Doxygen) | ||||||
|  | 
 | ||||||
|  | IF(DOXYGEN_FOUND) | ||||||
|  |   SET(DOXYGEN_LANGUAGE "English" CACHE STRING "Language used by doxygen") | ||||||
|  |   MARK_AS_ADVANCED(DOXYGEN_LANGUAGE) | ||||||
|  | 
 | ||||||
|  |   # you could also set the version with this, see Doxygen.in | ||||||
|  |   # there you will find a line like this:  | ||||||
|  |   #      PROJECT_NUMBER         = @DFHACK_VERSION@ | ||||||
|  |   # @DFHACK_VERSION@ is then replaced by our global DFHACK_VERSION | ||||||
|  |   # | ||||||
|  |   # for instance you could uncomment the next 3 lines and change the version for testing | ||||||
|  |   # SET(DFHACK_VERSION | ||||||
|  |   #     "1.2.3-foo500" | ||||||
|  |   # ) | ||||||
|  | 
 | ||||||
|  |   # doxygen can reference external images with IMAGE_PATH, this is how we set it dynamically | ||||||
|  |   SET( CMAKE_DOXYGEN_IMAGE_PATH | ||||||
|  |     "${CMAKE_CURRENT_SOURCE_DIR}/img" | ||||||
|  |   ) | ||||||
|  | 
 | ||||||
|  |   # doxygen searches for source code (defined in FILE_PATTERNS, for example: *.cpp *.h) | ||||||
|  |   # with DOXYGEN_SOURCE_DIR we fill a list of directories and later we write it into | ||||||
|  |   # the Doxyfile with a REGEX REPLACE (see below) | ||||||
|  |   SET( DOXYGEN_SOURCE_DIR | ||||||
|  |  #   "${CMAKE_SOURCE_DIR}/library" | ||||||
|  |     "${CMAKE_SOURCE_DIR}/doc/index.dxgen" | ||||||
|  |     "${CMAKE_SOURCE_DIR}/library/include" | ||||||
|  |     "${CMAKE_SOURCE_DIR}/library/include/dfhack" | ||||||
|  |     "${CMAKE_SOURCE_DIR}/library/include/dfhack/modules" | ||||||
|  |     "${CMAKE_SOURCE_DIR}/library/include/dfhack-c" | ||||||
|  |     "${CMAKE_SOURCE_DIR}/library/include/dfhack-c/modules" | ||||||
|  | #    "${CMAKE_SOURCE_DIR}/library/modules" | ||||||
|  | #    "${CMAKE_SOURCE_DIR}/library/shm" | ||||||
|  | #    "${CMAKE_SOURCE_DIR}/library/private" | ||||||
|  |   ) | ||||||
|  | 
 | ||||||
|  |   SET(DOXYGEN_OUTPUT_DIR html) | ||||||
|  |   STRING(REGEX REPLACE ";" " " CMAKE_DOXYGEN_INPUT_LIST "${DOXYGEN_SOURCE_DIR}") | ||||||
|  | 
 | ||||||
|  |   CONFIGURE_FILE(Doxyfile.in ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile) | ||||||
|  |   SET(HTML_TARGET "html" ) | ||||||
|  | 
 | ||||||
|  |   ADD_CUSTOM_TARGET(${HTML_TARGET} ALL | ||||||
|  |         /usr/bin/doxygen ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile | ||||||
|  |         DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile) | ||||||
|  | 
 | ||||||
|  |   INSTALL( DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/html/" DESTINATION "/usr/share/doc/dfhack-${DFHACK_VERSION}" ) | ||||||
|  | 
 | ||||||
|  | ELSE(DOXYGEN_FOUND) | ||||||
|  |   MESSAGE (FATAL_ERROR "doxygen binary couldn't be found") | ||||||
|  | ENDIF(DOXYGEN_FOUND) | ||||||
|  | 
 | ||||||
|  | ENDIF (BUILD_DFHACK_DOCUMENTATION) | ||||||
| @ -0,0 +1,212 @@ | |||||||
|  | # Doxyfile 1.3.9.1 | ||||||
|  | 
 | ||||||
|  | #--------------------------------------------------------------------------- | ||||||
|  | # Project related configuration options | ||||||
|  | #--------------------------------------------------------------------------- | ||||||
|  | PROJECT_NAME           = dfhack | ||||||
|  | PROJECT_NUMBER         = @DFHACK_VERSION@ | ||||||
|  | OUTPUT_DIRECTORY       = . | ||||||
|  | CREATE_SUBDIRS         = NO | ||||||
|  | OUTPUT_LANGUAGE        = English | ||||||
|  | USE_WINDOWS_ENCODING   = NO | ||||||
|  | BRIEF_MEMBER_DESC      = YES | ||||||
|  | REPEAT_BRIEF           = YES | ||||||
|  | ABBREVIATE_BRIEF       =  | ||||||
|  | ALWAYS_DETAILED_SEC    = NO | ||||||
|  | INLINE_INHERITED_MEMB  = NO | ||||||
|  | FULL_PATH_NAMES        = NO | ||||||
|  | STRIP_FROM_PATH        =  | ||||||
|  | STRIP_FROM_INC_PATH    =  | ||||||
|  | SHORT_NAMES            = NO | ||||||
|  | JAVADOC_AUTOBRIEF      = YES | ||||||
|  | MULTILINE_CPP_IS_BRIEF = NO | ||||||
|  | DETAILS_AT_TOP         = YES | ||||||
|  | INHERIT_DOCS           = YES | ||||||
|  | DISTRIBUTE_GROUP_DOC   = NO | ||||||
|  | TAB_SIZE               = 4 | ||||||
|  | ALIASES                =  | ||||||
|  | OPTIMIZE_OUTPUT_FOR_C  = NO | ||||||
|  | OPTIMIZE_OUTPUT_JAVA   = NO | ||||||
|  | SUBGROUPING            = YES | ||||||
|  | #--------------------------------------------------------------------------- | ||||||
|  | # Build related configuration options | ||||||
|  | #--------------------------------------------------------------------------- | ||||||
|  | EXTRACT_ALL            = NO | ||||||
|  | EXTRACT_PRIVATE        = NO | ||||||
|  | EXTRACT_STATIC         = NO | ||||||
|  | EXTRACT_LOCAL_CLASSES  = NO | ||||||
|  | EXTRACT_LOCAL_METHODS  = NO | ||||||
|  | HIDE_UNDOC_MEMBERS     = NO | ||||||
|  | HIDE_UNDOC_CLASSES     = NO | ||||||
|  | HIDE_FRIEND_COMPOUNDS  = NO | ||||||
|  | HIDE_IN_BODY_DOCS      = NO | ||||||
|  | INTERNAL_DOCS          = NO | ||||||
|  | CASE_SENSE_NAMES       = YES | ||||||
|  | HIDE_SCOPE_NAMES       = NO | ||||||
|  | SHOW_INCLUDE_FILES     = YES | ||||||
|  | INLINE_INFO            = YES | ||||||
|  | SORT_MEMBER_DOCS       = YES | ||||||
|  | SORT_BRIEF_DOCS        = NO | ||||||
|  | SORT_BY_SCOPE_NAME     = NO | ||||||
|  | GENERATE_TODOLIST      = YES | ||||||
|  | GENERATE_TESTLIST      = YES | ||||||
|  | GENERATE_BUGLIST       = YES | ||||||
|  | GENERATE_DEPRECATEDLIST= YES | ||||||
|  | ENABLED_SECTIONS       =  | ||||||
|  | MAX_INITIALIZER_LINES  = 30 | ||||||
|  | SHOW_USED_FILES        = YES | ||||||
|  | SHOW_DIRECTORIES       = YES | ||||||
|  | #--------------------------------------------------------------------------- | ||||||
|  | # configuration options related to warning and progress messages | ||||||
|  | #--------------------------------------------------------------------------- | ||||||
|  | QUIET                  = NO | ||||||
|  | WARNINGS               = YES | ||||||
|  | WARN_IF_UNDOCUMENTED   = YES | ||||||
|  | WARN_IF_DOC_ERROR      = YES | ||||||
|  | WARN_FORMAT            = "$file:$line: $text" | ||||||
|  | WARN_LOGFILE           =  | ||||||
|  | #--------------------------------------------------------------------------- | ||||||
|  | # configuration options related to the input files | ||||||
|  | #--------------------------------------------------------------------------- | ||||||
|  | INPUT                  = @CMAKE_DOXYGEN_INPUT_LIST@ | ||||||
|  | FILE_PATTERNS          = *.cpp *.h *.dxgen | ||||||
|  | RECURSIVE              = NO | ||||||
|  | EXCLUDE                =  | ||||||
|  | EXCLUDE_SYMLINKS       = NO | ||||||
|  | EXCLUDE_PATTERNS       =  | ||||||
|  | EXAMPLE_PATH           =  | ||||||
|  | EXAMPLE_PATTERNS       =  | ||||||
|  | EXAMPLE_RECURSIVE      = NO | ||||||
|  | IMAGE_PATH             = @CMAKE_DOXYGEN_IMAGE_PATH@ | ||||||
|  | INPUT_FILTER           =  | ||||||
|  | FILTER_PATTERNS        =  | ||||||
|  | FILTER_SOURCE_FILES    = NO | ||||||
|  | #--------------------------------------------------------------------------- | ||||||
|  | # configuration options related to source browsing | ||||||
|  | #--------------------------------------------------------------------------- | ||||||
|  | SOURCE_BROWSER         = NO | ||||||
|  | INLINE_SOURCES         = NO | ||||||
|  | STRIP_CODE_COMMENTS    = YES | ||||||
|  | REFERENCED_BY_RELATION = YES | ||||||
|  | REFERENCES_RELATION    = YES | ||||||
|  | VERBATIM_HEADERS       = YES | ||||||
|  | #--------------------------------------------------------------------------- | ||||||
|  | # configuration options related to the alphabetical class index | ||||||
|  | #--------------------------------------------------------------------------- | ||||||
|  | ALPHABETICAL_INDEX     = NO | ||||||
|  | COLS_IN_ALPHA_INDEX    = 5 | ||||||
|  | IGNORE_PREFIX          =  | ||||||
|  | #--------------------------------------------------------------------------- | ||||||
|  | # configuration options related to the HTML output | ||||||
|  | #--------------------------------------------------------------------------- | ||||||
|  | GENERATE_HTML          = YES | ||||||
|  | HTML_OUTPUT            = html | ||||||
|  | HTML_FILE_EXTENSION    = .html | ||||||
|  | 
 | ||||||
|  | HTML_ALIGN_MEMBERS     = YES | ||||||
|  | GENERATE_HTMLHELP      = NO | ||||||
|  | CHM_FILE               =  | ||||||
|  | HHC_LOCATION           =  | ||||||
|  | GENERATE_CHI           = NO | ||||||
|  | BINARY_TOC             = NO | ||||||
|  | TOC_EXPAND             = NO | ||||||
|  | DISABLE_INDEX          = NO | ||||||
|  | ENUM_VALUES_PER_LINE   = 8 | ||||||
|  | GENERATE_TREEVIEW      = NO | ||||||
|  | TREEVIEW_WIDTH         = 250 | ||||||
|  | #--------------------------------------------------------------------------- | ||||||
|  | # configuration options related to the LaTeX output | ||||||
|  | #--------------------------------------------------------------------------- | ||||||
|  | GENERATE_LATEX         = NO | ||||||
|  | LATEX_OUTPUT           = latex | ||||||
|  | LATEX_CMD_NAME         = latex | ||||||
|  | MAKEINDEX_CMD_NAME     = makeindex | ||||||
|  | COMPACT_LATEX          = NO | ||||||
|  | PAPER_TYPE             = a4wide | ||||||
|  | EXTRA_PACKAGES         =  | ||||||
|  | LATEX_HEADER           =  | ||||||
|  | PDF_HYPERLINKS         = NO | ||||||
|  | USE_PDFLATEX           = NO | ||||||
|  | LATEX_BATCHMODE        = NO | ||||||
|  | LATEX_HIDE_INDICES     = NO | ||||||
|  | #--------------------------------------------------------------------------- | ||||||
|  | # configuration options related to the RTF output | ||||||
|  | #--------------------------------------------------------------------------- | ||||||
|  | GENERATE_RTF           = NO | ||||||
|  | RTF_OUTPUT             = rtf | ||||||
|  | COMPACT_RTF            = NO | ||||||
|  | RTF_HYPERLINKS         = NO | ||||||
|  | RTF_STYLESHEET_FILE    =  | ||||||
|  | RTF_EXTENSIONS_FILE    =  | ||||||
|  | #--------------------------------------------------------------------------- | ||||||
|  | # configuration options related to the man page output | ||||||
|  | #--------------------------------------------------------------------------- | ||||||
|  | GENERATE_MAN           = NO | ||||||
|  | MAN_OUTPUT             = man | ||||||
|  | MAN_EXTENSION          = .3 | ||||||
|  | MAN_LINKS              = NO | ||||||
|  | #--------------------------------------------------------------------------- | ||||||
|  | # configuration options related to the XML output | ||||||
|  | #--------------------------------------------------------------------------- | ||||||
|  | GENERATE_XML           = NO | ||||||
|  | XML_OUTPUT             = xml | ||||||
|  | XML_SCHEMA             =  | ||||||
|  | XML_DTD                =  | ||||||
|  | XML_PROGRAMLISTING     = YES | ||||||
|  | #--------------------------------------------------------------------------- | ||||||
|  | # configuration options for the AutoGen Definitions output | ||||||
|  | #--------------------------------------------------------------------------- | ||||||
|  | GENERATE_AUTOGEN_DEF   = NO | ||||||
|  | #--------------------------------------------------------------------------- | ||||||
|  | # configuration options related to the Perl module output | ||||||
|  | #--------------------------------------------------------------------------- | ||||||
|  | GENERATE_PERLMOD       = NO | ||||||
|  | PERLMOD_LATEX          = NO | ||||||
|  | PERLMOD_PRETTY         = YES | ||||||
|  | PERLMOD_MAKEVAR_PREFIX =  | ||||||
|  | #--------------------------------------------------------------------------- | ||||||
|  | # Configuration options related to the preprocessor    | ||||||
|  | #--------------------------------------------------------------------------- | ||||||
|  | ENABLE_PREPROCESSING   = YES | ||||||
|  | MACRO_EXPANSION        = NO | ||||||
|  | EXPAND_ONLY_PREDEF     = NO | ||||||
|  | SEARCH_INCLUDES        = NO | ||||||
|  | INCLUDE_PATH           =  | ||||||
|  | INCLUDE_FILE_PATTERNS  =  | ||||||
|  | PREDEFINED             = DOXYGEN_SHOULD_SKIP_THIS | ||||||
|  | EXPAND_AS_DEFINED      =  | ||||||
|  | SKIP_FUNCTION_MACROS   = YES | ||||||
|  | #--------------------------------------------------------------------------- | ||||||
|  | # Configuration::additions related to external references    | ||||||
|  | #--------------------------------------------------------------------------- | ||||||
|  | TAGFILES               =  | ||||||
|  | GENERATE_TAGFILE       =  | ||||||
|  | ALLEXTERNALS           = NO | ||||||
|  | EXTERNAL_GROUPS        = YES | ||||||
|  | PERL_PATH              = /usr/bin/perl | ||||||
|  | #--------------------------------------------------------------------------- | ||||||
|  | # Configuration options related to the dot tool    | ||||||
|  | #--------------------------------------------------------------------------- | ||||||
|  | CLASS_DIAGRAMS         = YES | ||||||
|  | HIDE_UNDOC_RELATIONS   = YES | ||||||
|  | HAVE_DOT               = NO | ||||||
|  | CLASS_GRAPH            = YES | ||||||
|  | COLLABORATION_GRAPH    = YES | ||||||
|  | UML_LOOK               = NO | ||||||
|  | TEMPLATE_RELATIONS     = YES | ||||||
|  | INCLUDE_GRAPH          = YES | ||||||
|  | INCLUDED_BY_GRAPH      = YES | ||||||
|  | CALL_GRAPH             = YES | ||||||
|  | GRAPHICAL_HIERARCHY    = YES | ||||||
|  | DOT_IMAGE_FORMAT       = png | ||||||
|  | DOT_PATH               =  | ||||||
|  | DOTFILE_DIRS           =  | ||||||
|  | MAX_DOT_GRAPH_WIDTH    = 1024 | ||||||
|  | MAX_DOT_GRAPH_HEIGHT   = 1024 | ||||||
|  | MAX_DOT_GRAPH_DEPTH    = 0 | ||||||
|  | GENERATE_LEGEND        = YES | ||||||
|  | DOT_CLEANUP            = YES | ||||||
|  | #--------------------------------------------------------------------------- | ||||||
|  | # Configuration::additions related to the search engine    | ||||||
|  | #--------------------------------------------------------------------------- | ||||||
|  | SEARCHENGINE           = NO | ||||||
| @ -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> | ||||||
|  | */ | ||||||
|  | 
 | ||||||
| @ -0,0 +1,3 @@ | |||||||
|  | #!/bin/bash | ||||||
|  | rst2html  README.rst > Readme.html | ||||||
|  | rst2html  COMPILE.rst > Compile.html | ||||||
| @ -1,135 +0,0 @@ | |||||||
| /*
 |  | ||||||
| www.sourceforge.net/projects/dfhack |  | ||||||
| Copyright (c) 2009 Petr Mrázek (peterix), Kenneth Ferland (Impaler[WrG]), dorf |  | ||||||
| 
 |  | ||||||
| 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. |  | ||||||
| */ |  | ||||||
| 
 |  | ||||||
| #include "Internal.h" |  | ||||||
| #include "dfhack/DFProcessEnumerator.h" |  | ||||||
| #include "dfhack/DFProcess.h" |  | ||||||
| #include "dfhack/DFMemInfo.h" |  | ||||||
| #include "dfhack/DFMemInfoManager.h" |  | ||||||
| #include <sys/shm.h> |  | ||||||
| #include <sys/types.h> |  | ||||||
| #include <sys/ipc.h> |  | ||||||
| #include <time.h> |  | ||||||
| #include "shms.h" |  | ||||||
| 
 |  | ||||||
| using namespace DFHack; |  | ||||||
| 
 |  | ||||||
| class DFHack::ProcessEnumerator::Private |  | ||||||
| { |  | ||||||
|     public: |  | ||||||
|         Private(){}; |  | ||||||
|         MemInfoManager *meminfo; |  | ||||||
|         std::vector<Process *> processes; |  | ||||||
| }; |  | ||||||
| 
 |  | ||||||
| bool ProcessEnumerator::findProcessess() |  | ||||||
| { |  | ||||||
|     DIR *dir_p; |  | ||||||
|     struct dirent *dir_entry_p; |  | ||||||
|     // Open /proc/ directory
 |  | ||||||
|     dir_p = opendir("/proc/"); |  | ||||||
|     // Reading /proc/ entries
 |  | ||||||
|     while(NULL != (dir_entry_p = readdir(dir_p))) |  | ||||||
|     { |  | ||||||
|         // Only PID folders (numbers)
 |  | ||||||
|         if (strspn(dir_entry_p->d_name, "0123456789") != strlen(dir_entry_p->d_name)) |  | ||||||
|         { |  | ||||||
|             continue; |  | ||||||
|         } |  | ||||||
|         Process *p1 = new SHMProcess(atoi(dir_entry_p->d_name),d->meminfo->meminfo); |  | ||||||
|         if(p1->isIdentified()) |  | ||||||
|         { |  | ||||||
|             d->processes.push_back(p1); |  | ||||||
|             continue; |  | ||||||
|         } |  | ||||||
|         else |  | ||||||
|         { |  | ||||||
|             delete p1; |  | ||||||
|         } |  | ||||||
|         Process *p2 = new NormalProcess(atoi(dir_entry_p->d_name),d->meminfo->meminfo); |  | ||||||
|         if(p2->isIdentified()) |  | ||||||
|         { |  | ||||||
|             d->processes.push_back(p2); |  | ||||||
|             continue; |  | ||||||
|         } |  | ||||||
|         else |  | ||||||
|         { |  | ||||||
|             delete p2; |  | ||||||
|         } |  | ||||||
|         Process *p3 = new WineProcess(atoi(dir_entry_p->d_name),d->meminfo->meminfo); |  | ||||||
|         if(p3->isIdentified()) |  | ||||||
|         { |  | ||||||
|             d->processes.push_back(p3); |  | ||||||
|             continue; |  | ||||||
|         } |  | ||||||
|         else |  | ||||||
|         { |  | ||||||
|             delete p3; |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|     } |  | ||||||
|     closedir(dir_p); |  | ||||||
|     // return value depends on if we found some DF processes
 |  | ||||||
|     if(d->processes.size()) |  | ||||||
|     { |  | ||||||
|         return true; |  | ||||||
|     } |  | ||||||
|     return false; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| uint32_t ProcessEnumerator::size() |  | ||||||
| { |  | ||||||
|     return d->processes.size(); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| Process * ProcessEnumerator::operator[](uint32_t index) |  | ||||||
| { |  | ||||||
|     assert(index < d->processes.size()); |  | ||||||
|     return d->processes[index]; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| ProcessEnumerator::ProcessEnumerator( string path_to_xml ) |  | ||||||
| : d(new Private()) |  | ||||||
| { |  | ||||||
|     d->meminfo = new MemInfoManager(path_to_xml); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void ProcessEnumerator::purge() |  | ||||||
| { |  | ||||||
|     for(uint32_t i = 0;i < d->processes.size();i++) |  | ||||||
|     { |  | ||||||
|         delete d->processes[i]; |  | ||||||
|     } |  | ||||||
|     d->processes.clear(); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| ProcessEnumerator::~ProcessEnumerator() |  | ||||||
| { |  | ||||||
|     // delete all processes
 |  | ||||||
|     purge(); |  | ||||||
|     delete d->meminfo; |  | ||||||
|     delete d; |  | ||||||
| } |  | ||||||
| @ -1,147 +0,0 @@ | |||||||
| /*
 |  | ||||||
| www.sourceforge.net/projects/dfhack |  | ||||||
| Copyright (c) 2009 Petr Mrázek (peterix), Kenneth Ferland (Impaler[WrG]), dorf |  | ||||||
| 
 |  | ||||||
| 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. |  | ||||||
| */ |  | ||||||
| 
 |  | ||||||
| #include "Internal.h" |  | ||||||
| #include "dfhack/DFProcessEnumerator.h" |  | ||||||
| #include "dfhack/DFProcess.h" |  | ||||||
| #include "dfhack/DFMemInfo.h" |  | ||||||
| #include "dfhack/DFMemInfoManager.h" |  | ||||||
| using namespace DFHack; |  | ||||||
| 
 |  | ||||||
| class DFHack::ProcessEnumerator::Private |  | ||||||
| { |  | ||||||
|     public: |  | ||||||
|         Private(){}; |  | ||||||
|         MemInfoManager *meminfo; |  | ||||||
|         std::vector<Process *> processes; |  | ||||||
| }; |  | ||||||
| 
 |  | ||||||
| // some magic - will come in handy when we start doing debugger stuff on Windows
 |  | ||||||
| bool EnableDebugPriv() |  | ||||||
| { |  | ||||||
|     bool               bRET = FALSE; |  | ||||||
|     TOKEN_PRIVILEGES   tp; |  | ||||||
|     HANDLE             hToken; |  | ||||||
| 
 |  | ||||||
|     if (LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &tp.Privileges[0].Luid)) |  | ||||||
|     { |  | ||||||
|         if (OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &hToken)) |  | ||||||
|         { |  | ||||||
|             if (hToken != INVALID_HANDLE_VALUE) |  | ||||||
|             { |  | ||||||
|                 tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; |  | ||||||
|                 tp.PrivilegeCount = 1; |  | ||||||
|                 if (AdjustTokenPrivileges(hToken, FALSE, &tp, 0, 0, 0)) |  | ||||||
|                 { |  | ||||||
|                     bRET = TRUE; |  | ||||||
|                 } |  | ||||||
|                 CloseHandle(hToken); |  | ||||||
|             } |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
|     return bRET; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // WINDOWS version of the process finder
 |  | ||||||
| bool ProcessEnumerator::findProcessess() |  | ||||||
| { |  | ||||||
|     // Get the list of process identifiers.
 |  | ||||||
|     DWORD ProcArray[2048], memoryNeeded, numProccesses; |  | ||||||
|     //EnableDebugPriv();
 |  | ||||||
|     if ( !EnumProcesses( ProcArray, sizeof(ProcArray), &memoryNeeded ) ) |  | ||||||
|     { |  | ||||||
|         cout << "EnumProcesses fail'd" << endl; |  | ||||||
|         return false; |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     // Calculate how many process identifiers were returned.
 |  | ||||||
|     numProccesses = memoryNeeded / sizeof(DWORD); |  | ||||||
|     EnableDebugPriv(); |  | ||||||
|      |  | ||||||
|     // iterate through processes
 |  | ||||||
|     for ( int i = 0; i < (int)numProccesses; i++ ) |  | ||||||
|     { |  | ||||||
|         Process *p = new SHMProcess(ProcArray[i],d->meminfo->meminfo); |  | ||||||
|         if(p->isIdentified()) |  | ||||||
|         { |  | ||||||
|             d->processes.push_back(p); |  | ||||||
|             continue; |  | ||||||
|         } |  | ||||||
|         else |  | ||||||
|         { |  | ||||||
|             delete p; |  | ||||||
|             p = 0; |  | ||||||
|         } |  | ||||||
|         p = new NormalProcess(ProcArray[i],d->meminfo->meminfo); |  | ||||||
|         if(p->isIdentified()) |  | ||||||
|         { |  | ||||||
|             d->processes.push_back(p); |  | ||||||
|             continue; |  | ||||||
|         } |  | ||||||
|         else |  | ||||||
|         { |  | ||||||
|             delete p; |  | ||||||
|             p = 0; |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
|     if(d->processes.size()) |  | ||||||
|         return true; |  | ||||||
|     return false; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| uint32_t ProcessEnumerator::size() |  | ||||||
| { |  | ||||||
|     return d->processes.size(); |  | ||||||
| }; |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| Process * ProcessEnumerator::operator[](uint32_t index) |  | ||||||
| { |  | ||||||
|     assert(index < d->processes.size()); |  | ||||||
|     return d->processes[index]; |  | ||||||
| }; |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| ProcessEnumerator::ProcessEnumerator( string path_to_xml ) |  | ||||||
| : d(new Private()) |  | ||||||
| { |  | ||||||
|     d->meminfo = new MemInfoManager(path_to_xml); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void ProcessEnumerator::purge() |  | ||||||
| { |  | ||||||
|     for(uint32_t i = 0;i < d->processes.size();i++) |  | ||||||
|     { |  | ||||||
|        delete d->processes[i]; |  | ||||||
|     } |  | ||||||
|     d->processes.clear(); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| ProcessEnumerator::~ProcessEnumerator() |  | ||||||
| { |  | ||||||
|     // delete all processes
 |  | ||||||
|     purge(); |  | ||||||
|     delete d->meminfo; |  | ||||||
|     delete d; |  | ||||||
| } |  | ||||||
| @ -0,0 +1,380 @@ | |||||||
|  | /*
 | ||||||
|  | www.sourceforge.net/projects/dfhack | ||||||
|  | Copyright (c) 2009 Petr Mrázek (peterix), Kenneth Ferland (Impaler[WrG]), dorf | ||||||
|  | 
 | ||||||
|  | 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. | ||||||
|  | */ | ||||||
|  | 
 | ||||||
|  | #include "Internal.h" | ||||||
|  | #include "DFMemInfoManager.h" | ||||||
|  | 
 | ||||||
|  | #include "dfhack/DFProcessEnumerator.h" | ||||||
|  | #include "dfhack/DFProcess.h" | ||||||
|  | #include "dfhack/DFMemInfo.h" | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | using namespace DFHack; | ||||||
|  | 
 | ||||||
|  | typedef std::vector<Process *> PROC_V; | ||||||
|  | typedef std::map<ProcessID, Process*> PID2PROC; | ||||||
|  | 
 | ||||||
|  | class DFHack::ProcessEnumerator::Private | ||||||
|  | { | ||||||
|  |     public: | ||||||
|  |         Private(){}; | ||||||
|  |         MemInfoManager *meminfo; | ||||||
|  |         PROC_V Processes; | ||||||
|  |         PID2PROC ProcMap; | ||||||
|  |         Process *GetProcessObject(ProcessID ID); | ||||||
|  |         void EnumPIDs (vector <ProcessID> &PIDs); | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | class DFHack::BadProcesses::Private | ||||||
|  | { | ||||||
|  |     public: | ||||||
|  |         Private(){}; | ||||||
|  |         PROC_V bad; | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | BadProcesses::BadProcesses():d(new Private()){} | ||||||
|  | 
 | ||||||
|  | BadProcesses::~BadProcesses() | ||||||
|  | { | ||||||
|  |     clear(); | ||||||
|  |     delete d; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | bool BadProcesses::Contains(Process* p) | ||||||
|  | { | ||||||
|  |     for(int i = 0; i < d->bad.size(); i++) | ||||||
|  |     { | ||||||
|  |         if(d->bad[i] == p) | ||||||
|  |             return true; | ||||||
|  |     } | ||||||
|  |     return false; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | bool BadProcesses::excise(Process* p) | ||||||
|  | { | ||||||
|  |     vector<Process*>::iterator it = d->bad.begin(); | ||||||
|  |     while(it != d->bad.end()) | ||||||
|  |     { | ||||||
|  |         if((*it) == p) | ||||||
|  |         { | ||||||
|  |             d->bad.erase(it); | ||||||
|  |             return true; | ||||||
|  |         } | ||||||
|  |         else | ||||||
|  |         { | ||||||
|  |             it++; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |     return false; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | uint32_t BadProcesses::size() | ||||||
|  | { | ||||||
|  |     return d->bad.size(); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void BadProcesses::clear() | ||||||
|  | { | ||||||
|  |     for(int i = 0; i < d->bad.size(); i++) | ||||||
|  |     { | ||||||
|  |         delete d->bad[i]; | ||||||
|  |     } | ||||||
|  |     d->bad.clear(); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void BadProcesses::push_back(Process* p) | ||||||
|  | { | ||||||
|  |     if(p) | ||||||
|  |         d->bad.push_back(p); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | Process * BadProcesses::operator[](uint32_t index) | ||||||
|  | { | ||||||
|  |     if(index < d->bad.size()) | ||||||
|  |         return d->bad[index]; | ||||||
|  |     return 0; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | //FIXME: wasteful
 | ||||||
|  | Process *ProcessEnumerator::Private::GetProcessObject(ProcessID ID) | ||||||
|  | { | ||||||
|  |      | ||||||
|  |     Process *p1 = new SHMProcess(ID.pid,meminfo->meminfo); | ||||||
|  |     if(p1->isIdentified()) | ||||||
|  |         return p1; | ||||||
|  |     else | ||||||
|  |         delete p1; | ||||||
|  |      | ||||||
|  |     Process *p2 = new NormalProcess(ID.pid,meminfo->meminfo); | ||||||
|  |     if(p2->isIdentified()) | ||||||
|  |         return p2; | ||||||
|  |     else | ||||||
|  |         delete p2; | ||||||
|  | #ifdef LINUX_BUILD | ||||||
|  |     Process *p3 = new WineProcess(ID.pid,meminfo->meminfo); | ||||||
|  |     if(p3->isIdentified()) | ||||||
|  |         return p3; | ||||||
|  |     else | ||||||
|  |         delete p3; | ||||||
|  | #endif | ||||||
|  |     return 0; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | #ifdef LINUX_BUILD | ||||||
|  | void ProcessEnumerator::Private::EnumPIDs (vector <ProcessID> &PIDs) | ||||||
|  | { | ||||||
|  |     DIR *dir_p; | ||||||
|  |     struct dirent *dir_entry_p; | ||||||
|  |     struct stat st; | ||||||
|  |     char fullname[512]; | ||||||
|  |     fullname[0] = 0; | ||||||
|  |     PIDs.clear(); // make sure the vector is clear
 | ||||||
|  | 
 | ||||||
|  |     // Open /proc/ directory
 | ||||||
|  |     dir_p = opendir("/proc/"); | ||||||
|  |     // Reading /proc/ entries
 | ||||||
|  |     while(NULL != (dir_entry_p = readdir(dir_p))) | ||||||
|  |     { | ||||||
|  |         // Only PID folders (numbers)
 | ||||||
|  |         if (strspn(dir_entry_p->d_name, "0123456789") != strlen(dir_entry_p->d_name)) | ||||||
|  |         { | ||||||
|  |             continue; | ||||||
|  |         } | ||||||
|  |         sprintf(fullname, "/proc/%s", dir_entry_p->d_name); | ||||||
|  |         int ierr = stat (fullname, &st); | ||||||
|  |         if (ierr != 0) | ||||||
|  |         { | ||||||
|  |             printf("Cannot stat %s: ierr= %d\n", fullname, ierr); | ||||||
|  |             continue; | ||||||
|  |         } | ||||||
|  |         uint64_t Pnum = atoi(dir_entry_p->d_name); | ||||||
|  |         uint64_t ctime = st.st_ctime; | ||||||
|  |         PIDs.push_back(ProcessID(ctime,Pnum)); | ||||||
|  |     } | ||||||
|  |     closedir(dir_p); | ||||||
|  | } | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | #ifndef LINUX_BUILD | ||||||
|  | // some magic - will come in handy when we start doing debugger stuff on Windows
 | ||||||
|  | bool EnableDebugPriv() | ||||||
|  | { | ||||||
|  |     bool               bRET = FALSE; | ||||||
|  |     TOKEN_PRIVILEGES   tp; | ||||||
|  |     HANDLE             hToken; | ||||||
|  | 
 | ||||||
|  |     if (LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &tp.Privileges[0].Luid)) | ||||||
|  |     { | ||||||
|  |         if (OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &hToken)) | ||||||
|  |         { | ||||||
|  |             if (hToken != INVALID_HANDLE_VALUE) | ||||||
|  |             { | ||||||
|  |                 tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; | ||||||
|  |                 tp.PrivilegeCount = 1; | ||||||
|  |                 if (AdjustTokenPrivileges(hToken, FALSE, &tp, 0, 0, 0)) | ||||||
|  |                 { | ||||||
|  |                     bRET = TRUE; | ||||||
|  |                 } | ||||||
|  |                 CloseHandle(hToken); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |     return bRET; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | typedef union | ||||||
|  | { | ||||||
|  |     struct | ||||||
|  |     { | ||||||
|  |         uint32_t LowDword; | ||||||
|  |         uint32_t HighDword; | ||||||
|  |     }; | ||||||
|  |     uint64_t Quad; | ||||||
|  | } TWO_DWORDS; | ||||||
|  | 
 | ||||||
|  | // Convert Windows FileTime structs to POSIX timestamp
 | ||||||
|  | // from http://frenk.wordpress.com/2009/12/14/convert-filetime-to-unix-timestamp/
 | ||||||
|  | uint64_t FileTime_to_POSIX(FILETIME ft) | ||||||
|  | { | ||||||
|  |     // takes the last modified date
 | ||||||
|  |     TWO_DWORDS date, adjust; | ||||||
|  |     date.HighDword = ft.dwHighDateTime; | ||||||
|  |     date.LowDword = ft.dwLowDateTime; | ||||||
|  | 
 | ||||||
|  |     // 100-nanoseconds = milliseconds * 10000
 | ||||||
|  |     adjust.Quad = 11644473600000LL * 10000LL; | ||||||
|  | 
 | ||||||
|  |     // removes the diff between 1970 and 1601
 | ||||||
|  |     date.Quad -= adjust.Quad; | ||||||
|  | 
 | ||||||
|  |     // converts back from 100-nanoseconds to seconds
 | ||||||
|  |     return date.Quad / 10000000LL; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void ProcessEnumerator::Private::EnumPIDs (vector <ProcessID> &PIDs) | ||||||
|  | { | ||||||
|  |     FILETIME ftCreate, ftExit, ftKernel, ftUser; | ||||||
|  | 
 | ||||||
|  |     PIDs.clear(); // make sure the vector is clear
 | ||||||
|  | 
 | ||||||
|  |     // Get the list of process identifiers.
 | ||||||
|  |     DWORD ProcArray[2048], memoryNeeded, numProccesses; | ||||||
|  |     //EnableDebugPriv();
 | ||||||
|  |     if ( !EnumProcesses( ProcArray, sizeof(ProcArray), &memoryNeeded ) ) | ||||||
|  |     { | ||||||
|  |         cout << "EnumProcesses fail'd" << endl; | ||||||
|  |         return; | ||||||
|  |     } | ||||||
|  |     // Calculate how many process identifiers were returned.
 | ||||||
|  |     numProccesses = memoryNeeded / sizeof(DWORD); | ||||||
|  |     EnableDebugPriv(); | ||||||
|  |     // iterate through processes
 | ||||||
|  |     for ( int i = 0; i < (int)numProccesses; i++ ) | ||||||
|  |     { | ||||||
|  |         HANDLE proc = OpenProcess (PROCESS_QUERY_INFORMATION, false, ProcArray[i]); | ||||||
|  |         if(!proc) | ||||||
|  |             continue; | ||||||
|  |         if(GetProcessTimes(proc, &ftCreate, &ftExit, &ftKernel, &ftUser)) | ||||||
|  |         { | ||||||
|  |             uint64_t ctime = FileTime_to_POSIX(ftCreate); | ||||||
|  |             uint64_t Pnum = ProcArray[i]; | ||||||
|  |             PIDs.push_back(ProcessID(ctime,Pnum)); | ||||||
|  |         } | ||||||
|  |         CloseHandle(proc); | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | bool ProcessEnumerator::Refresh( BadProcesses* invalidated_processes ) | ||||||
|  | { | ||||||
|  |     // PIDs to process
 | ||||||
|  |     vector <ProcessID> PIDs; | ||||||
|  |     // this will be the new process map
 | ||||||
|  |     PID2PROC temporary; | ||||||
|  |     // clear the vector
 | ||||||
|  |     d->Processes.clear(); | ||||||
|  |     if(invalidated_processes) | ||||||
|  |         invalidated_processes->clear(); | ||||||
|  | 
 | ||||||
|  |     d->EnumPIDs(PIDs); | ||||||
|  | 
 | ||||||
|  |     for(uint64_t i = 0; i < PIDs.size();i++) | ||||||
|  |     { | ||||||
|  |         ProcessID & PID = PIDs[i]; | ||||||
|  |         // check if we know about the OS process already
 | ||||||
|  |         PID2PROC::iterator found= d->ProcMap.find(PID); | ||||||
|  |         if( found != d->ProcMap.end()) | ||||||
|  |         { | ||||||
|  |             // we do
 | ||||||
|  |             // check if it does have a DFHack Process object associated with it
 | ||||||
|  |             Process * p = (*found).second; | ||||||
|  |             if(p) | ||||||
|  |             { | ||||||
|  |                 // add it back to the vector we export
 | ||||||
|  |                 d->Processes.push_back(p); | ||||||
|  |             } | ||||||
|  |             // remove the OS Process from ProcMap
 | ||||||
|  |             d->ProcMap.erase(found); | ||||||
|  |             // add the OS Process to what will be the new ProcMap
 | ||||||
|  |             temporary[PID] = p; | ||||||
|  |         } | ||||||
|  |         else | ||||||
|  |         { | ||||||
|  |             // an OS process we don't know yet!
 | ||||||
|  |             // try to make a DFHack Process object for it
 | ||||||
|  |             if(Process*p = d->GetProcessObject(PID)) | ||||||
|  |             { | ||||||
|  |                 // allright. this is something that can be used
 | ||||||
|  |                 d->Processes.push_back(p); | ||||||
|  |                 temporary[PID] = p; | ||||||
|  |             } | ||||||
|  |             else | ||||||
|  |             { | ||||||
|  |                 // just a process. we track it anyway. Why not.
 | ||||||
|  |                 temporary[PID] = 0; | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |     // now the vector we export is filled again and a temporary map with valid processes is created.
 | ||||||
|  |     // we iterate over the old Process map and destroy all the processes that are dead.
 | ||||||
|  |     for(PID2PROC::const_iterator idx = d->ProcMap.begin(); idx != d->ProcMap.end();++idx) | ||||||
|  |     { | ||||||
|  |         Process * p = (*idx).second; | ||||||
|  |         if(p) | ||||||
|  |         { | ||||||
|  |             if(invalidated_processes) | ||||||
|  |             { | ||||||
|  |                 invalidated_processes->push_back(p); | ||||||
|  |             } | ||||||
|  |             else | ||||||
|  |             { | ||||||
|  |                 delete p; | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |     d->ProcMap.swap(temporary); | ||||||
|  |     // return value depends on if we found some DF processes
 | ||||||
|  |     if(d->Processes.size()) | ||||||
|  |     { | ||||||
|  |         return true; | ||||||
|  |     } | ||||||
|  |     return false; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | uint32_t ProcessEnumerator::size() | ||||||
|  | { | ||||||
|  |     return d->Processes.size(); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | Process * ProcessEnumerator::operator[](uint32_t index) | ||||||
|  | { | ||||||
|  |     assert(index < d->Processes.size()); | ||||||
|  |     return d->Processes[index]; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | ProcessEnumerator::ProcessEnumerator( string path_to_xml ) | ||||||
|  | : d(new Private()) | ||||||
|  | { | ||||||
|  |     d->meminfo = new MemInfoManager(path_to_xml); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void ProcessEnumerator::purge() | ||||||
|  | { | ||||||
|  |     for(uint32_t i = 0;i < d->Processes.size();i++) | ||||||
|  |     { | ||||||
|  |         delete d->Processes[i]; | ||||||
|  |     } | ||||||
|  |     d->ProcMap.clear(); | ||||||
|  |     d->Processes.clear(); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | ProcessEnumerator::~ProcessEnumerator() | ||||||
|  | { | ||||||
|  |     // delete all processes
 | ||||||
|  |     purge(); | ||||||
|  |     delete d->meminfo; | ||||||
|  |     delete d; | ||||||
|  | } | ||||||
| @ -0,0 +1,43 @@ | |||||||
|  | /*
 | ||||||
|  | www.sourceforge.net/projects/dfhack | ||||||
|  | Copyright (c) 2009 Petr Mrázek (peterix), Kenneth Ferland (Impaler[WrG]), dorf, doomchild | ||||||
|  | 
 | ||||||
|  | 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. | ||||||
|  | */ | ||||||
|  | 
 | ||||||
|  | #ifndef WINDOWIO_C_API | ||||||
|  | #define WINDOWIO_C_API | ||||||
|  | 
 | ||||||
|  | #include "DFHack_C.h" | ||||||
|  | #include "dfhack/modules/WindowIO.h" | ||||||
|  | 
 | ||||||
|  | #ifdef __cplusplus | ||||||
|  | extern "C" { | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | DFHACK_EXPORT int WindowIO_TypeStr(DFHackObject* window, const char* input, int delay, bool useShift); | ||||||
|  | 
 | ||||||
|  | DFHACK_EXPORT int WindowIO_TypeSpecial(DFHackObject* window, t_special command, int count, int delay); | ||||||
|  | 
 | ||||||
|  | #ifdef __cplusplus | ||||||
|  | } | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | #endif | ||||||
| @ -0,0 +1,47 @@ | |||||||
|  | /*
 | ||||||
|  | www.sourceforge.net/projects/dfhack | ||||||
|  | Copyright (c) 2009 Petr Mrázek (peterix), Kenneth Ferland (Impaler[WrG]), dorf, doomchild | ||||||
|  | 
 | ||||||
|  | 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. | ||||||
|  | */ | ||||||
|  | 
 | ||||||
|  | #ifndef WORLD_C_API | ||||||
|  | #define WORLD_C_API | ||||||
|  | 
 | ||||||
|  | #include "DFHack_C.h" | ||||||
|  | #include "dfhack/modules/World.h" | ||||||
|  | 
 | ||||||
|  | #ifdef __cplusplus | ||||||
|  | extern "C" { | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | DFHACK_EXPORT int World_Start(DFHackObject* world); | ||||||
|  | DFHACK_EXPORT int World_Finish(DFHackObject* world); | ||||||
|  | 
 | ||||||
|  | DFHACK_EXPORT int World_ReadCurrentTick(DFHackObject* world, uint32_t* tick); | ||||||
|  | DFHACK_EXPORT int World_ReadCurrentYear(DFHackObject* world, uint32_t* year); | ||||||
|  | DFHACK_EXPORT int World_ReadCurrentMonth(DFHackObject* world, uint32_t* month); | ||||||
|  | DFHACK_EXPORT int World_ReadCurrentDay(DFHackObject* world, uint32_t* day); | ||||||
|  | 
 | ||||||
|  | #ifdef __cplusplus | ||||||
|  | } | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | #endif | ||||||
| @ -0,0 +1,54 @@ | |||||||
|  | 
 | ||||||
|  | /*
 | ||||||
|  | www.sourceforge.net/projects/dfhack | ||||||
|  | Copyright (c) 2009 Petr Mrázek (peterix), Kenneth Ferland (Impaler[WrG]), dorf | ||||||
|  | 
 | ||||||
|  | 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. | ||||||
|  | */ | ||||||
|  | 
 | ||||||
|  | #ifndef MODULE_H_INCLUDED | ||||||
|  | #define MODULE_H_INCLUDED | ||||||
|  | 
 | ||||||
|  | #include "DFExport.h" | ||||||
|  | namespace DFHack | ||||||
|  | { | ||||||
|  |     class Context; | ||||||
|  |     class DFHACK_EXPORT Module | ||||||
|  |     { | ||||||
|  |         public: | ||||||
|  |         virtual ~Module(){}; | ||||||
|  |         virtual bool Start(){return true;};// default start...
 | ||||||
|  |         virtual bool Finish() = 0;// everything should have a Finish()
 | ||||||
|  |         // 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
 | ||||||
|  | 
 | ||||||
| @ -0,0 +1,67 @@ | |||||||
|  | /*
 | ||||||
|  | www.sourceforge.net/projects/dfhack | ||||||
|  | Copyright (c) 2009 Petr Mrázek (peterix), Kenneth Ferland (Impaler[WrG]), dorf, doomchild | ||||||
|  | 
 | ||||||
|  | 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. | ||||||
|  | */ | ||||||
|  | 
 | ||||||
|  | #include <vector> | ||||||
|  | #include <map> | ||||||
|  | #include <string> | ||||||
|  | using namespace std; | ||||||
|  | 
 | ||||||
|  | #include "dfhack/DFIntegers.h" | ||||||
|  | #include "DFHack.h" | ||||||
|  | #include "DFHack_C.h" | ||||||
|  | #include "dfhack/modules/WindowIO.h" | ||||||
|  | #include "dfhack-c/modules/WindowIO_C.h" | ||||||
|  | 
 | ||||||
|  | using namespace DFHack; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | #ifdef __cplusplus | ||||||
|  | extern "C" { | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | int WindowIO_TypeStr(DFHackObject* window, const char* input, int delay, bool useShift) | ||||||
|  | { | ||||||
|  | 	if(window != NULL) | ||||||
|  | 	{ | ||||||
|  | 		((DFHack::WindowIO*)window)->TypeStr(input, delay, useShift); | ||||||
|  | 		return 1; | ||||||
|  | 	} | ||||||
|  | 	 | ||||||
|  | 	return -1; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | int WindowIO_TypeSpecial(DFHackObject* window, t_special command, int count, int delay) | ||||||
|  | { | ||||||
|  | 	if(window != NULL) | ||||||
|  | 	{ | ||||||
|  | 		((DFHack::WindowIO*)window)->TypeSpecial(command, count, delay); | ||||||
|  | 		return 1; | ||||||
|  | 	} | ||||||
|  | 	 | ||||||
|  | 	return -1; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | #ifdef __cplusplus | ||||||
|  | } | ||||||
|  | #endif | ||||||
| @ -0,0 +1,105 @@ | |||||||
|  | /*
 | ||||||
|  | www.sourceforge.net/projects/dfhack | ||||||
|  | Copyright (c) 2009 Petr Mrázek (peterix), Kenneth Ferland (Impaler[WrG]), dorf, doomchild | ||||||
|  | 
 | ||||||
|  | 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. | ||||||
|  | */ | ||||||
|  | 
 | ||||||
|  | #include "DFHack_C.h" | ||||||
|  | #include "dfhack/modules/World.h" | ||||||
|  | #include "dfhack-c/modules/World_C.h" | ||||||
|  | 
 | ||||||
|  | #ifdef __cplusplus | ||||||
|  | extern "C" { | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | int World_Start(DFHackObject* world) | ||||||
|  | { | ||||||
|  | 	if(world != NULL) | ||||||
|  | 	{ | ||||||
|  | 		if(((DFHack::World*)world)->Start()) | ||||||
|  | 			return 1; | ||||||
|  | 		else | ||||||
|  | 			return 0; | ||||||
|  | 	} | ||||||
|  | 	 | ||||||
|  | 	return -1; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | int World_Finish(DFHackObject* world) | ||||||
|  | { | ||||||
|  | 	if(world != NULL) | ||||||
|  | 	{ | ||||||
|  | 		if(((DFHack::World*)world)->Finish()) | ||||||
|  | 			return 1; | ||||||
|  | 		else | ||||||
|  | 			return 0; | ||||||
|  | 	} | ||||||
|  | 	 | ||||||
|  | 	return -1; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | int World_ReadCurrentTick(DFHackObject* world, uint32_t* tick) | ||||||
|  | { | ||||||
|  | 	if(world != NULL) | ||||||
|  | 	{ | ||||||
|  | 		*tick = ((DFHack::World*)world)->ReadCurrentTick(); | ||||||
|  | 		return 1; | ||||||
|  | 	} | ||||||
|  | 	 | ||||||
|  | 	return -1; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | int World_ReadCurrentYear(DFHackObject* world, uint32_t* year) | ||||||
|  | { | ||||||
|  | 	if(world != NULL) | ||||||
|  | 	{ | ||||||
|  | 		*year = ((DFHack::World*)world)->ReadCurrentYear(); | ||||||
|  | 		return 1; | ||||||
|  | 	} | ||||||
|  | 	 | ||||||
|  | 	return -1; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | int World_ReadCurrentMonth(DFHackObject* world, uint32_t* month) | ||||||
|  | { | ||||||
|  | 	if(world != NULL) | ||||||
|  | 	{ | ||||||
|  | 		*month = ((DFHack::World*)world)->ReadCurrentMonth(); | ||||||
|  | 		return 1; | ||||||
|  | 	} | ||||||
|  | 	 | ||||||
|  | 	return -1; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | int World_ReadCurrentDay(DFHackObject* world, uint32_t* day) | ||||||
|  | { | ||||||
|  | 	if(world != NULL) | ||||||
|  | 	{ | ||||||
|  | 		*day = ((DFHack::World*)world)->ReadCurrentDay(); | ||||||
|  | 		return 1; | ||||||
|  | 	} | ||||||
|  | 	 | ||||||
|  | 	return -1; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | #ifdef __cplusplus | ||||||
|  | } | ||||||
|  | #endif | ||||||
| @ -1,25 +0,0 @@ | |||||||
| from ctypes import * |  | ||||||
| from pydfhack import libdfhack, ViewScreen |  | ||||||
| 
 |  | ||||||
| libdfhack.Gui_ReadViewScreen.argtypes = [ c_void_p, c_void_p ] |  | ||||||
| 
 |  | ||||||
| class Gui(object): |  | ||||||
|     def __init__(self, ptr): |  | ||||||
|         self._gui_ptr = ptr |  | ||||||
| 
 |  | ||||||
|     def start(self): |  | ||||||
|         return libdfhack.Gui_Start(self._gui_ptr) |  | ||||||
| 
 |  | ||||||
|     def finish(self): |  | ||||||
|         return libdfhack.Gui_Finish(self._gui_ptr) |  | ||||||
| 
 |  | ||||||
|     def read_pause_state(self): |  | ||||||
|         return libdfhack.Gui_ReadPauseState(self._pos_ptr) > 0 |  | ||||||
| 
 |  | ||||||
|     def read_view_screen(self): |  | ||||||
|         s = ViewScreen() |  | ||||||
| 
 |  | ||||||
|         if libdfhack.Gui_ReadViewScreen(self._gui_ptr, byref(s)) > 0: |  | ||||||
|             return s |  | ||||||
|         else: |  | ||||||
|             return None |  | ||||||
| @ -1,141 +0,0 @@ | |||||||
| from ctypes import * |  | ||||||
| from pydftypes import libdfhack |  | ||||||
| from util import * |  | ||||||
| 
 |  | ||||||
| _get_arg_types = [ c_void_p, _arr_create_func ] |  | ||||||
| 
 |  | ||||||
| libdfhack.Materials_getInorganic.argtypes = _get_arg_types |  | ||||||
| libdfhack.Materials_getOrganic.argtypes = _get_arg_types |  | ||||||
| libdfhack.Materials_getTree.argtypes = _get_arg_types |  | ||||||
| libdfhack.Materials_getPlant.argtypes = _get_arg_types |  | ||||||
| libdfhack.Materials_getRace.argtypes = _get_arg_types |  | ||||||
| #libdfhack.Materials_getRaceEx.argtypes = _get_arg_types |  | ||||||
| libdfhack.Materials_getColor.argtypes = _get_arg_types |  | ||||||
| libdfhack.Materials_getOther.argtypes = _get_arg_types |  | ||||||
| 
 |  | ||||||
| class Materials(object): |  | ||||||
|     def __init__(self, ptr): |  | ||||||
|         self._mat_ptr = ptr |  | ||||||
| 
 |  | ||||||
|         self.inorganic = None |  | ||||||
|         self.organic = None |  | ||||||
|         self.tree = None |  | ||||||
|         self.plant = None |  | ||||||
|         self.race = None |  | ||||||
|         self.race_ex = None |  | ||||||
|         self.color = None |  | ||||||
|         self.other = None |  | ||||||
| 
 |  | ||||||
|     def read_inorganic(self): |  | ||||||
|         return libdfhack.Materials_ReadInorganicMaterials(self._mat_ptr) |  | ||||||
| 
 |  | ||||||
|     def read_organic(self): |  | ||||||
|         return libdfhack.Materials_ReadOrganicMaterials(self._mat_ptr) |  | ||||||
| 
 |  | ||||||
|     def read_wood(self): |  | ||||||
|         return libdfhack.Materials_ReadWoodMaterials(self._mat_ptr) |  | ||||||
| 
 |  | ||||||
|     def read_plant(self): |  | ||||||
|         return libdfhack.Materials_ReadPlantMaterials(self._mat_ptr) |  | ||||||
| 
 |  | ||||||
|     def read_creature_types(self): |  | ||||||
|         return libdfhack.Materials_ReadCreatureTypes(self._mat_ptr) |  | ||||||
| 
 |  | ||||||
|     def read_creature_types_ex(self): |  | ||||||
|         return libdfhack.Materials_ReadCreatureTypesEx(self._mat_ptr) |  | ||||||
| 
 |  | ||||||
|     def read_descriptor_colors(self): |  | ||||||
|         return libdfhack.Materials_ReadDescriptorColors(self._mat_ptr) |  | ||||||
| 
 |  | ||||||
|     def read_others(self): |  | ||||||
|         return libdfhack.Materials_ReadOthers(self._mat_ptr) |  | ||||||
| 
 |  | ||||||
|     def read_all(self): |  | ||||||
|         libdfhack.Materials_ReadAllMaterials(self._mat_ptr) |  | ||||||
| 
 |  | ||||||
|     def get_description(self, material): |  | ||||||
|         return libdfhack.Materials_getDescription(self._mat_ptr, byref(material)) |  | ||||||
| 
 |  | ||||||
|     def update_inorganic_cache(self): |  | ||||||
|         def update_callback(count): |  | ||||||
|             allocated = _allocate_array(Matgloss, count) |  | ||||||
| 
 |  | ||||||
|             self.inorganic = allocated[0] |  | ||||||
| 
 |  | ||||||
|             return allocated[1] |  | ||||||
| 
 |  | ||||||
|         callback = _arr_create_func(update_callback) |  | ||||||
| 
 |  | ||||||
|         return libdfhack.Materials_getInorganic(self._mat_ptr, callback) |  | ||||||
| 
 |  | ||||||
|     def update_organic_cache(self): |  | ||||||
|         def update_callback(count): |  | ||||||
|             allocated = _allocate_array(Matgloss, count) |  | ||||||
| 
 |  | ||||||
|             self.organic = allocated[0] |  | ||||||
| 
 |  | ||||||
|             return allocated[1] |  | ||||||
| 
 |  | ||||||
|         callback = _arr_create_func(update_callback) |  | ||||||
| 
 |  | ||||||
|         return libdfhack.Materials_getOrganic(self._mat_ptr, callback) |  | ||||||
| 
 |  | ||||||
|     def update_tree_cache(self): |  | ||||||
|         def update_callback(count): |  | ||||||
|             allocated = _allocate_array(Matgloss, count) |  | ||||||
| 
 |  | ||||||
|             self.tree = allocated[0] |  | ||||||
| 
 |  | ||||||
|             return allocated[1] |  | ||||||
| 
 |  | ||||||
|         callback = _arr_create_func(update_callback) |  | ||||||
| 
 |  | ||||||
|         return libdfhack.Materials_getTree(self._mat_ptr, callback) |  | ||||||
| 
 |  | ||||||
|     def update_plant_cache(self): |  | ||||||
|         def update_callback(count): |  | ||||||
|             allocated = _allocate_array(Matgloss, count) |  | ||||||
| 
 |  | ||||||
|             self.plant = allocated[0] |  | ||||||
| 
 |  | ||||||
|             return allocated[1] |  | ||||||
| 
 |  | ||||||
|         callback = _arr_create_func(update_callback) |  | ||||||
| 
 |  | ||||||
|         return libdfhack.Materials_getPlant(self._mat_ptr, callback) |  | ||||||
| 
 |  | ||||||
|     def update_race_cache(self): |  | ||||||
|         def update_callback(count): |  | ||||||
|             allocated = _allocate_array(Matgloss, count) |  | ||||||
| 
 |  | ||||||
|             self.race = allocated[0] |  | ||||||
| 
 |  | ||||||
|             return allocated[1] |  | ||||||
| 
 |  | ||||||
|         callback = _arr_create_func(update_callback) |  | ||||||
| 
 |  | ||||||
|         return libdfhack.Materials_getRace(self._mat_ptr, callback) |  | ||||||
| 
 |  | ||||||
|     def update_color_cache(self): |  | ||||||
|         def update_callback(count): |  | ||||||
|             allocated = _allocate_array(DescriptorColor, count) |  | ||||||
| 
 |  | ||||||
|             self.color = allocated[0] |  | ||||||
|              |  | ||||||
|             return allocated[1] |  | ||||||
| 
 |  | ||||||
|         callback = _arr_create_func(update_callback) |  | ||||||
| 
 |  | ||||||
|         return libdfhack.Materials_getColor(self._mat_ptr, callback) |  | ||||||
| 
 |  | ||||||
|     def update_other_cache(self): |  | ||||||
|         def update_callback(count): |  | ||||||
|             allocated = _allocate_array(MatglossOther, count) |  | ||||||
| 
 |  | ||||||
|             self.other = allocated[0] |  | ||||||
|              |  | ||||||
|             return allocated[1] |  | ||||||
| 
 |  | ||||||
|         callback = _arr_create_func(update_callback) |  | ||||||
| 
 |  | ||||||
|         return libdfhack.Materials_getOther(self._mat_ptr, callback) |  | ||||||
| @ -1,43 +0,0 @@ | |||||||
| from ctypes import * |  | ||||||
| from pydftypes import libdfhack |  | ||||||
| 
 |  | ||||||
| class Position(object): |  | ||||||
|     def __init__(self, ptr): |  | ||||||
|         self._pos_ptr = ptr |  | ||||||
| 
 |  | ||||||
|         self._vx, self._vy, self._vz = c_int(), c_int(), c_int() |  | ||||||
|         self._cx, self._cy, self._cz = c_int(), c_int(), c_int() |  | ||||||
|         self._ww, self._wh = c_int(), c_int() |  | ||||||
| 
 |  | ||||||
|     def get_view_coords(self): |  | ||||||
|         if libdfhack.Position_getViewCoords(self._pos_ptr, byref(self._vx), byref(self._vy), byref(self._vz)) > 0: |  | ||||||
|             return (self._vx.value, self._vy.value, self._vz.value) |  | ||||||
|         else: |  | ||||||
|             return (-1, -1, -1) |  | ||||||
| 
 |  | ||||||
|     def set_view_coords(self, v_coords): |  | ||||||
|         self._vx.value, self._vy.value, self._vz.value = v_coords |  | ||||||
| 
 |  | ||||||
|         libdfhack.Position_setViewCoords(self._pos_ptr, self._vx, self._vy, self._vz) |  | ||||||
| 
 |  | ||||||
|     view_coords = property(get_view_coords, set_view_coords) |  | ||||||
|      |  | ||||||
|     def get_cursor_coords(self): |  | ||||||
|         if libdfhack.Position_getCursorCoords(self._pos_ptr, byref(self._cx), byref(self._cy), byref(self._cz)) > 0: |  | ||||||
|             return (self._cx.value, self._cy.value, self._cz.value) |  | ||||||
|         else: |  | ||||||
|             return (-1, -1, -1) |  | ||||||
| 
 |  | ||||||
|     def set_cursor_coords(self, c_coords): |  | ||||||
|         self._cx.value, self._cy.value, self_cz.value = c_coords |  | ||||||
| 
 |  | ||||||
|         libdfhack.Position_setCursorCoords(self._pos_ptr, self._cx, self._cy, self._cz) |  | ||||||
| 
 |  | ||||||
|     cursor_coords = property(get_cursor_coords, set_cursor_coords) |  | ||||||
| 
 |  | ||||||
|     @property |  | ||||||
|     def window_size(self): |  | ||||||
|         if libdfhack.Position_getWindowSize(self._pos_ptr, byref(self._ww), byref(self._wh)) > 0: |  | ||||||
|             return (self._ww.value, self._wh.value) |  | ||||||
|         else: |  | ||||||
|             return (-1, -1) |  | ||||||
| @ -1,66 +0,0 @@ | |||||||
| from ctypes import * |  | ||||||
| 
 |  | ||||||
| def _uintify(x, y, z): |  | ||||||
|     return (c_uint(x), c_uint(y), c_uint(z)) |  | ||||||
| 
 |  | ||||||
| def _allocate_array(t_type, count): |  | ||||||
|     arr_type = t_type * count |  | ||||||
| 
 |  | ||||||
|     arr = arr_type() |  | ||||||
| 
 |  | ||||||
|     ptr = c_void_p() |  | ||||||
|     ptr = addressof(arr) |  | ||||||
| 
 |  | ||||||
|     return (arr, ptr) |  | ||||||
| 
 |  | ||||||
| def _alloc_int_buffer(count): |  | ||||||
|     a = _allocate_array(c_int, count) |  | ||||||
| 
 |  | ||||||
|     return a[1] |  | ||||||
| 
 |  | ||||||
| alloc_int_buffer = CFUNCTYPE(POINTER(c_int), c_uint)(_alloc_int_buffer) |  | ||||||
| 
 |  | ||||||
| def _alloc_uint_buffer(count): |  | ||||||
|     a = _allocate_array(c_uint, count) |  | ||||||
| 
 |  | ||||||
|     return a[1] |  | ||||||
| 
 |  | ||||||
| alloc_uint_buffer = CFUNCTYPE(POINTER(c_uint), c_uint)(_alloc_uint_buffer) |  | ||||||
| 
 |  | ||||||
| def _alloc_short_buffer(count): |  | ||||||
|     a = _allocate_array(c_short, count) |  | ||||||
| 
 |  | ||||||
|     return a[1] |  | ||||||
| 
 |  | ||||||
| alloc_short_buffer = CFUNCTYPE(POINTER(c_short), c_uint)(_alloc_short_buffer) |  | ||||||
| 
 |  | ||||||
| def _alloc_ushort_buffer(count): |  | ||||||
|     a = _allocate_array(c_ushort, count) |  | ||||||
| 
 |  | ||||||
|     return a[1] |  | ||||||
| 
 |  | ||||||
| alloc_ushort_buffer = CFUNCTYPE(POINTER(c_ushort), c_uint)(_alloc_ushort_buffer) |  | ||||||
| 
 |  | ||||||
| def _alloc_byte_buffer(count): |  | ||||||
|     a = _allocate_array(c_byte, count) |  | ||||||
| 
 |  | ||||||
|     return a[1] |  | ||||||
| 
 |  | ||||||
| alloc_byte_buffer = CFUNCTYPE(POINTER(c_byte), c_uint)(_alloc_byte_buffer) |  | ||||||
| 
 |  | ||||||
| def _alloc_ubyte_buffer(count): |  | ||||||
|     a = _allocate_array(c_ubyte, count) |  | ||||||
| 
 |  | ||||||
|     return a[1] |  | ||||||
| 
 |  | ||||||
| alloc_ubyte_buffer = CFUNCTYPE(POINTER(c_ubyte), c_uint)(_alloc_ubyte_buffer) |  | ||||||
| 
 |  | ||||||
| def _alloc_char_buffer(count): |  | ||||||
|     c = create_string_buffer(count) |  | ||||||
| 
 |  | ||||||
|     ptr = c_void_p() |  | ||||||
|     ptr = addressof(c) |  | ||||||
| 
 |  | ||||||
|     return ptr |  | ||||||
| 
 |  | ||||||
| alloc_char_buffer = CFUNCTYPE(POINTER(c_char), c_uint)(_alloc_char_buffer) |  | ||||||
| @ -1,25 +0,0 @@ | |||||||
| from ctypes import * |  | ||||||
| from pydftypes import libdfhack, Tree |  | ||||||
| 
 |  | ||||||
| class Vegetation(object): |  | ||||||
|     def __init__(self, ptr): |  | ||||||
|         self._v_ptr = ptr |  | ||||||
| 
 |  | ||||||
|     def start(self): |  | ||||||
|         n = c_uint(0) |  | ||||||
|          |  | ||||||
|         if libdfhack.Vegetation_Start(self._v_ptr, byref(n)) > 0: |  | ||||||
|             return int(n.value) |  | ||||||
|         else: |  | ||||||
|             return -1 |  | ||||||
| 
 |  | ||||||
|     def finish(self): |  | ||||||
|         return libdfhack.Vegetation_Finish(self._v_ptr) > 0 |  | ||||||
| 
 |  | ||||||
|     def read(self, index): |  | ||||||
|         t = Tree() |  | ||||||
| 
 |  | ||||||
|         if libdfhack.Vegetation_Read(self._v_ptr, c_uint(index), byref(t)) > 0: |  | ||||||
|             return t |  | ||||||
|         else: |  | ||||||
|             return None |  | ||||||
Some files were not shown because too many files have changed in this diff Show More
		Loading…
	
		Reference in New Issue