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