diff options
| author | zilpin | 2010-10-17 00:21:18 -0400 |
|---|---|---|
| committer | zilpin | 2010-10-17 00:21:18 -0400 |
| commit | 3acc4108574332fab7978b0f11b5357e0a158f99 (patch) | |
| tree | c2900a24777065fd4fc1ddb161a19902d6854b70 | |
| parent | 6da86ef1deb2b1e7749afa61d797e6779815befa (diff) | |
| download | dfhack-3acc4108574332fab7978b0f11b5357e0a158f99.tar.gz dfhack-3acc4108574332fab7978b0f11b5357e0a158f99.tar.bz2 dfhack-3acc4108574332fab7978b0f11b5357e0a158f99.tar.xz | |
Tile Types update, and new hellhole n deramp tools in playground
| -rw-r--r-- | .gitignore | 2 | ||||
| -rw-r--r-- | library/include/dfhack/DFTileTypes.h | 1798 | ||||
| -rw-r--r-- | tools/playground/CMakeLists.txt | 28 | ||||
| -rw-r--r-- | tools/playground/deramp.cpp | 128 | ||||
| -rw-r--r-- | tools/playground/hellhole.cpp | 426 | ||||
| -rw-r--r-- | tools/playground/printtiletypes.cpp | 93 |
6 files changed, 1704 insertions, 771 deletions
@@ -29,3 +29,5 @@ dfhack/python/pydfhack/_pydfhack.so dfhack/python/PyDFHack.egg-info dfhack/python/build dfhack/python/dist +
+/cmakeall.bat
\ No newline at end of file diff --git a/library/include/dfhack/DFTileTypes.h b/library/include/dfhack/DFTileTypes.h index e3b66071..52c3fb4d 100644 --- a/library/include/dfhack/DFTileTypes.h +++ b/library/include/dfhack/DFTileTypes.h @@ -1,771 +1,1027 @@ -/* -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 TILETYPES_H_INCLUDED -#define TILETYPES_H_INCLUDED - -#include "DFPragma.h" - -namespace DFHack -{ - // tile class -- determines the general shape of the tile - enum TileClass - { - EMPTY,// empty - - WALL, - PILLAR, - FORTIFICATION, - - STAIR_UP, - STAIR_DOWN, - STAIR_UPDOWN, - - RAMP,// ramps have no direction - RAMP_TOP,// the top of a ramp. I assume it's used for path finding. - - FLOOR,// generic floor - TREE_DEAD, - TREE_OK, - SAPLING_DEAD, - SAPLING_OK, - SHRUB_DEAD, - SHRUB_OK, - BOULDER, - PEBBLES - }; - // material -- what material the tile is made of - enum TileMaterial - { - AIR,// empty - SOIL,// ordinary soil. material depends on geology - STONE,// ordinary layer stone. material depends on geology - FEATSTONE,// map feature stone. used for things like hell, the hell temple or adamantine tubes. material depends on local/global feature - OBSIDIAN,// cast obsidian - - VEIN,// vein stone. material depends on mineral veins present - ICE,// frozen water... not much to say. you can determine what was on the tile before it froze by looking into the 'ice vein' objects - GRASS,// grass (has 4 variants) - GRASS2,// grass (has 4 variants) - GRASS_DEAD,// dead grass (has 4 variants) - GRASS_DRY,// dry grass (has 4 variants) - DRIFTWOOD,// non-specified wood - normally on top of the local layer stone/soil. - HFS,// the stuff demon pits are made of - this makes them different from ordinary pits. - MAGMA,// material for semi-molten rock and 'magma flow' tiles - CAMPFIRE,// human armies make them when they siege. The original tile may be lost? - FIRE,// burning grass - ASHES,// what remains from a FIRE - CONSTRUCTED,// tile material depends on the construction present - CYAN_GLOW// the glowy stuff that disappears from the demon temple when you take the sword. - }; - // variants are used for tiles, where there are multiple variants of the same - like grass floors - enum TileVariant - { - VAR_1, - VAR_2, - VAR_3, - VAR_4 - }; - - struct TileRow - { - const char * name; - TileClass c; - TileMaterial m; - TileVariant v; - }; - - #define TILE_TYPE_ARRAY_LENGTH 520 - - const TileRow tileTypeTable[TILE_TYPE_ARRAY_LENGTH] = - { - // 0 - {"void",EMPTY, AIR, VAR_1}, - {"ramp top",RAMP_TOP, AIR, VAR_1}, - {"pool",FLOOR, SOIL, VAR_1}, - {0, EMPTY, AIR, VAR_1}, - {0, EMPTY, AIR, VAR_1}, - {0, EMPTY, AIR, VAR_1}, - {0, EMPTY, AIR, VAR_1}, - {0, EMPTY, AIR, VAR_1}, - {0, EMPTY, AIR, VAR_1}, - {0, EMPTY, AIR, VAR_1}, - - // 10 - {0, EMPTY, AIR, VAR_1}, - {0, EMPTY, AIR, VAR_1}, - {0, EMPTY, AIR, VAR_1}, - {0, EMPTY, AIR, VAR_1}, - {0, EMPTY, AIR, VAR_1}, - {0, EMPTY, AIR, VAR_1}, - {0, EMPTY, AIR, VAR_1}, - {0, EMPTY, AIR, VAR_1}, - {0, EMPTY, AIR, VAR_1}, - {"driftwood stack",FLOOR, DRIFTWOOD, VAR_1}, - - // 20 - {0 ,EMPTY, AIR, VAR_1}, - {0 ,EMPTY, AIR, VAR_1}, - {0 ,EMPTY, AIR, VAR_1}, - {0 ,EMPTY, AIR, VAR_1}, - {"tree",TREE_OK, SOIL, VAR_1}, - {"ice stair up/down",STAIR_UPDOWN, ICE, VAR_1}, - {"ice stair down",STAIR_DOWN, ICE, VAR_1}, - {"ice stair up",STAIR_UP, ICE, VAR_1}, - {0 ,EMPTY, AIR, VAR_1}, - {0 ,EMPTY, AIR, VAR_1}, - - // 30 - {0 ,EMPTY, AIR, VAR_1}, - {0 ,EMPTY, AIR, VAR_1}, - {"empty space",EMPTY, AIR, VAR_1}, - {0 ,EMPTY, AIR, VAR_1}, - {"shrub",SHRUB_OK, SOIL, VAR_1}, - {"chasm",FLOOR, AIR, VAR_1}, - {"obsidian stair up/down",STAIR_UPDOWN, OBSIDIAN, VAR_1}, - {"obsidian stair down",STAIR_DOWN, OBSIDIAN, VAR_1}, - {"obsidian stair up",STAIR_UP, OBSIDIAN, VAR_1}, - {"soil stair up/down",STAIR_UPDOWN, SOIL, VAR_1}, - - // 40 - {"soil stair down",STAIR_DOWN, SOIL, VAR_1}, - {"soil stair up",STAIR_UP, SOIL, VAR_1}, - {"eerie pit",FLOOR, HFS, VAR_1}, - {"smooth stone floor",FLOOR, STONE, VAR_1}, - {"smooth obsidian floor",FLOOR, OBSIDIAN, VAR_1}, - {"smooth featstone? floor",FLOOR, FEATSTONE, VAR_1}, - {"smooth vein floor",FLOOR, VEIN, VAR_1}, - {"smooth ice floor",FLOOR, ICE, VAR_1}, - {0 ,EMPTY, AIR, VAR_1}, - {"grass stair up/down",STAIR_UPDOWN, GRASS, VAR_1}, - - // 50 - {"grass stair down",STAIR_DOWN, GRASS, VAR_1}, - {"grass stair up",STAIR_UP, GRASS, VAR_1}, - {"grass2 stair up/down",STAIR_UPDOWN, GRASS2, VAR_1}, - {"grass2 stair down",STAIR_DOWN, GRASS2, VAR_1}, - {"grass2 stair up",STAIR_UP, GRASS2, VAR_1}, - {"stone stair up/down",STAIR_UPDOWN, STONE, VAR_1}, - {"stone stair down",STAIR_DOWN, STONE, VAR_1}, - {"stone stair up",STAIR_UP, STONE, VAR_1}, - {"vein stair up/down",STAIR_UPDOWN, VEIN, VAR_1}, - {"vein stair down",STAIR_DOWN, VEIN, VAR_1}, - - // 60 - {"vein stair up",STAIR_UP, VEIN, VAR_1}, - {"featstone? stair up/down",STAIR_UPDOWN, FEATSTONE, VAR_1}, - {"featstone? stair down",STAIR_DOWN, FEATSTONE, VAR_1}, - {"featstone? stair up",STAIR_UP, FEATSTONE, VAR_1}, - {0 ,EMPTY, AIR, VAR_1}, - {"stone fortification",FORTIFICATION, STONE, VAR_1}, - {0 ,EMPTY, AIR, VAR_1}, - {"campfire",FLOOR, CAMPFIRE, VAR_1}, - {0 ,EMPTY, AIR, VAR_1}, - {0 ,EMPTY, AIR, VAR_1}, - - // 70 - {"fire",FLOOR, FIRE, VAR_1}, - {0 ,EMPTY, AIR, VAR_1}, - {0 ,EMPTY, AIR, VAR_1}, - {0 ,EMPTY, AIR, VAR_1}, - {0 ,EMPTY, AIR, VAR_1}, - {0 ,EMPTY, AIR, VAR_1}, - {0 ,EMPTY, AIR, VAR_1}, - {0 ,EMPTY, AIR, VAR_1}, - {0 ,EMPTY, AIR, VAR_1}, - {"stone pillar",PILLAR, STONE, VAR_1}, - - //80 - {"obsidian pillar",PILLAR, OBSIDIAN, VAR_1}, - {"featstone? pillar",PILLAR, FEATSTONE, VAR_1}, - {"vein pillar",PILLAR, VEIN, VAR_1}, - {"ice pillar",PILLAR, ICE, VAR_1}, - {0 ,EMPTY, AIR, VAR_1}, - {0 ,EMPTY, AIR, VAR_1}, - {0 ,EMPTY, AIR, VAR_1}, - {0 ,EMPTY, AIR, VAR_1}, - {0 ,EMPTY, AIR, VAR_1}, - {"waterfall landing",FLOOR, SOIL, VAR_1}, // verify material - - // 90 - {"river source",FLOOR, SOIL, VAR_1}, // verify material - {0 ,EMPTY, AIR, VAR_1}, - {0 ,EMPTY, AIR, VAR_1}, - {0 ,EMPTY, AIR, VAR_1}, - {0 ,EMPTY, AIR, VAR_1}, - {0 ,EMPTY, AIR, VAR_1}, - {0 ,EMPTY, AIR, VAR_1}, - {0 ,EMPTY, AIR, VAR_1}, - {0 ,EMPTY, AIR, VAR_1}, - {0 ,EMPTY, AIR, VAR_1}, - - // 100 - {0 ,EMPTY, AIR, VAR_1}, - {0 ,EMPTY, AIR, VAR_1}, - {0 ,EMPTY, AIR, VAR_1}, - {0 ,EMPTY, AIR, VAR_1}, - {0 ,EMPTY, AIR, VAR_1}, - {0 ,EMPTY, AIR, VAR_1}, - {0 ,EMPTY, AIR, VAR_1}, - {0 ,EMPTY, AIR, VAR_1}, - {0 ,EMPTY, AIR, VAR_1}, - {0 ,EMPTY, AIR, VAR_1}, - - // 110 - {0 ,EMPTY, AIR, VAR_1}, - {0 ,EMPTY, AIR, VAR_1}, - {0 ,EMPTY, AIR, VAR_1}, - {0 ,EMPTY, AIR, VAR_1}, - {0 ,EMPTY, AIR, VAR_1}, - {0 ,EMPTY, AIR, VAR_1}, - {0 ,EMPTY, AIR, VAR_1}, - {0 ,EMPTY, AIR, VAR_1}, - {0 ,EMPTY, AIR, VAR_1}, - {0 ,EMPTY, AIR, VAR_1}, - - // 120 - {0 ,EMPTY, AIR, VAR_1}, - {0 ,EMPTY, AIR, VAR_1}, - {0 ,EMPTY, AIR, VAR_1}, - {0 ,EMPTY, AIR, VAR_1}, - {0 ,EMPTY, AIR, VAR_1}, - {0 ,EMPTY, AIR, VAR_1}, - {0 ,EMPTY, AIR, VAR_1}, - {0 ,EMPTY, AIR, VAR_1}, - {0 ,EMPTY, AIR, VAR_1}, - {0 ,EMPTY, AIR, VAR_1}, - - // 130 - {0 ,EMPTY, AIR, VAR_1}, - {0 ,EMPTY, AIR, VAR_1}, - {0 ,EMPTY, AIR, VAR_1}, - {0 ,EMPTY, AIR, VAR_1}, - {0 ,EMPTY, AIR, VAR_1}, - {0 ,EMPTY, AIR, VAR_1}, - {0 ,EMPTY, AIR, VAR_1}, - {0 ,EMPTY, AIR, VAR_1}, - {0 ,EMPTY, AIR, VAR_1}, - {0 ,EMPTY, AIR, VAR_1}, - - // 140 - {0 ,EMPTY, AIR, VAR_1}, - {0 ,EMPTY, AIR, VAR_1}, - {0 ,EMPTY, AIR, VAR_1}, - {0 ,EMPTY, AIR, VAR_1}, - {0 ,EMPTY, AIR, VAR_1}, - {0 ,EMPTY, AIR, VAR_1}, - {0 ,EMPTY, AIR, VAR_1}, - {0 ,EMPTY, AIR, VAR_1}, - {0 ,EMPTY, AIR, VAR_1}, - {0 ,EMPTY, AIR, VAR_1}, - - // 150 - {0 ,EMPTY, AIR, VAR_1}, - {0 ,EMPTY, AIR, VAR_1}, - {0 ,EMPTY, AIR, VAR_1}, - {0 ,EMPTY, AIR, VAR_1}, - {0 ,EMPTY, AIR, VAR_1}, - {0 ,EMPTY, AIR, VAR_1}, - {0 ,EMPTY, AIR, VAR_1}, - {0 ,EMPTY, AIR, VAR_1}, - {0 ,EMPTY, AIR, VAR_1}, - {0 ,EMPTY, AIR, VAR_1}, - - // 160 - {0 ,EMPTY, AIR, VAR_1}, - {0 ,EMPTY, AIR, VAR_1}, - {0 ,EMPTY, AIR, VAR_1}, - {0 ,EMPTY, AIR, VAR_1}, - {0 ,EMPTY, AIR, VAR_1}, - {0 ,EMPTY, AIR, VAR_1}, - {0 ,EMPTY, AIR, VAR_1}, - {0 ,EMPTY, AIR, VAR_1}, - {0 ,EMPTY, AIR, VAR_1}, - {0 ,EMPTY, AIR, VAR_1}, - - // 170 - {0 ,EMPTY, AIR, VAR_1}, - {0 ,EMPTY, AIR, VAR_1}, - {0 ,EMPTY, AIR, VAR_1}, - {0 ,EMPTY, AIR, VAR_1}, - {0 ,EMPTY, AIR, VAR_1}, - {0 ,EMPTY, AIR, VAR_1}, - {"cracked stone wall" ,WALL, STONE, VAR_1}, - {"damaged stone wall" ,WALL, STONE, VAR_1}, - {"worn stone wall" ,WALL, STONE, VAR_1}, - {0 ,EMPTY, AIR, VAR_1}, - - // 180 - {0 ,EMPTY, AIR, VAR_1}, - {0 ,EMPTY, AIR, VAR_1}, - {0 ,EMPTY, AIR, VAR_1}, - {0 ,EMPTY, AIR, VAR_1}, - {0 ,EMPTY, AIR, VAR_1}, - {0 ,EMPTY, AIR, VAR_1}, - {0 ,EMPTY, AIR, VAR_1}, - {0 ,EMPTY, AIR, VAR_1}, - {0 ,EMPTY, AIR, VAR_1}, - {0 ,EMPTY, AIR, VAR_1}, - - // 190 - {0 ,EMPTY, AIR, VAR_1}, - {0 ,EMPTY, AIR, VAR_1}, - {0 ,EMPTY, AIR, VAR_1}, - {0 ,EMPTY, AIR, VAR_1}, - {0 ,EMPTY, AIR, VAR_1}, - {0 ,EMPTY, AIR, VAR_1}, - {0 ,EMPTY, AIR, VAR_1}, - {0 ,EMPTY, AIR, VAR_1}, - {0 ,EMPTY, AIR, VAR_1}, - {0 ,EMPTY, AIR, VAR_1}, - - // 200 - {0 ,EMPTY, AIR, VAR_1}, - {0 ,EMPTY, AIR, VAR_1}, - {0 ,EMPTY, AIR, VAR_1}, - {0 ,EMPTY, AIR, VAR_1}, - {0 ,EMPTY, AIR, VAR_1}, - {0 ,EMPTY, AIR, VAR_1}, - {0 ,EMPTY, AIR, VAR_1}, - {0 ,EMPTY, AIR, VAR_1}, - {0 ,EMPTY, AIR, VAR_1}, - {0 ,EMPTY, AIR, VAR_1}, - - // 210 - {0 ,EMPTY, AIR, VAR_1}, - {0 ,EMPTY, AIR, VAR_1}, - {0 ,EMPTY, AIR, VAR_1}, - {0 ,EMPTY, AIR, VAR_1}, - {0 ,EMPTY, AIR, VAR_1}, - {0 ,EMPTY, AIR, VAR_1}, - {0 ,EMPTY, AIR, VAR_1}, - {0 ,EMPTY, AIR, VAR_1}, - {0 ,EMPTY, AIR, VAR_1}, - {"stone wall" ,WALL, STONE, VAR_1}, - - // 220 - {0 ,EMPTY, AIR, VAR_1}, - {0 ,EMPTY, AIR, VAR_1}, - {0 ,EMPTY, AIR, VAR_1}, - {0 ,EMPTY, AIR, VAR_1}, - {0 ,EMPTY, AIR, VAR_1}, - {0 ,EMPTY, AIR, VAR_1}, - {0 ,EMPTY, AIR, VAR_1}, - {0 ,EMPTY, AIR, VAR_1}, - {0 ,EMPTY, AIR, VAR_1}, - {0 ,EMPTY, AIR, VAR_1}, - - // 230 - {0 ,EMPTY, AIR, VAR_1}, - {"sapling" ,SAPLING_OK, SOIL, VAR_1}, - {0 ,EMPTY, AIR, VAR_1}, - {"dry grass ramp" ,RAMP, GRASS_DRY, VAR_1}, - {"dead grass ramp" ,RAMP, GRASS_DEAD, VAR_1}, - {"grass ramp" ,RAMP, GRASS, VAR_1}, - {"grass ramp" ,RAMP, GRASS2, VAR_1}, - {"stone ramp" ,RAMP, STONE, VAR_1}, - {"obsidian ramp" ,RAMP, OBSIDIAN, VAR_1}, - {"featstone? ramp" ,RAMP, FEATSTONE, VAR_1}, - - // 240 - {"vein ramp" ,RAMP, VEIN, VAR_1}, - {"soil ramp" ,RAMP, SOIL, VAR_1}, - {"ashes" ,FLOOR, ASHES, VAR_1}, - {"ashes" ,FLOOR, ASHES, VAR_2}, - {"ashes" ,FLOOR, ASHES, VAR_3}, - {"ice ramp" ,RAMP, ICE, VAR_1}, - {0 ,EMPTY, AIR, VAR_1}, - {0 ,EMPTY, AIR, VAR_1}, - {0 ,EMPTY, AIR, VAR_1}, - {0 ,EMPTY, AIR, VAR_1}, - - // 250 - {0 ,EMPTY, AIR, VAR_1}, - {0 ,EMPTY, AIR, VAR_1}, - {0 ,EMPTY, AIR, VAR_1}, - {0 ,EMPTY, AIR, VAR_1}, - {0 ,EMPTY, AIR, VAR_1}, - {0 ,EMPTY, AIR, VAR_1}, - {0 ,EMPTY, AIR, VAR_1}, - {0 ,EMPTY, AIR, VAR_1}, - {"ice floor" ,FLOOR, ICE, VAR_2}, - {"ice floor" ,FLOOR, ICE, VAR_3}, - - // 260 - {"ice floor" ,FLOOR, ICE, VAR_4}, - {"furrowed soil" ,FLOOR, SOIL, VAR_1}, - {"ice floor" ,FLOOR, ICE, VAR_1}, - {"semi-molten rock" ,WALL, MAGMA, VAR_1},// unminable magma wall - {"magma" ,FLOOR, MAGMA, VAR_1}, - {"soil wall" ,WALL, SOIL, VAR_1}, - {0 ,EMPTY, AIR, VAR_1}, - {"glowing floor" ,FLOOR, CYAN_GLOW, VAR_1}, - {0 ,EMPTY, AIR, VAR_1}, - {"smooth obsidian wall RD2",WALL,OBSIDIAN,VAR_1}, - - // 270 - {"smooth obsidian wall R2D",WALL,OBSIDIAN,VAR_1}, - {"smooth obsidian wall R2U",WALL,OBSIDIAN,VAR_1}, - {"smooth obsidian wall RU2",WALL,OBSIDIAN,VAR_1}, - {"smooth obsidian wall L2U",WALL,OBSIDIAN,VAR_1}, - {"smooth obsidian wall LU2",WALL,OBSIDIAN,VAR_1}, - {"smooth obsidian wall L2D",WALL,OBSIDIAN,VAR_1}, - {"smooth obsidian wall LD2",WALL,OBSIDIAN,VAR_1}, - {"smooth obsidian wall LRUD",WALL,OBSIDIAN,VAR_1}, - {"smooth obsidian wall RUD",WALL,OBSIDIAN,VAR_1}, - {"smooth obsidian wall LRD",WALL,OBSIDIAN,VAR_1}, - - // 280 - {"smooth obsidian wall LRU",WALL,OBSIDIAN,VAR_1}, - {"smooth obsidian wall LUD",WALL,OBSIDIAN,VAR_1}, - {"smooth obsidian wall RD",WALL,OBSIDIAN,VAR_1}, - {"smooth obsidian wall RU",WALL,OBSIDIAN,VAR_1}, - {"smooth obsidian wall LU",WALL,OBSIDIAN,VAR_1}, - {"smooth obsidian wall LD",WALL,OBSIDIAN,VAR_1}, - {"smooth obsidian wall UD",WALL,OBSIDIAN,VAR_1}, - {"smooth obsidian wall LR",WALL,OBSIDIAN,VAR_1}, - {"smooth featstone wall RD2",WALL,FEATSTONE,VAR_1}, - {"smooth featstone wall R2D",WALL,FEATSTONE,VAR_1}, - - // 290 - {"smooth featstone wall R2U",WALL,FEATSTONE,VAR_1}, - {"smooth featstone wall RU2",WALL,FEATSTONE,VAR_1}, - {"smooth featstone wall L2U",WALL,FEATSTONE,VAR_1}, - {"smooth featstone wall LU2",WALL,FEATSTONE,VAR_1}, - {"smooth featstone wall L2D",WALL,FEATSTONE,VAR_1}, - {"smooth featstone wall LD2",WALL,FEATSTONE,VAR_1}, - {"smooth featstone wall LRUD",WALL,FEATSTONE,VAR_1}, - {"smooth featstone wall RUD",WALL,FEATSTONE,VAR_1}, - {"smooth featstone wall LRD",WALL,FEATSTONE,VAR_1}, - {"smooth featstone wall LRU",WALL,FEATSTONE,VAR_1}, - - //300 - {"smooth featstone wall LUD",WALL,FEATSTONE,VAR_1}, - {"smooth featstone wall RD",WALL,FEATSTONE,VAR_1}, - {"smooth featstone wall RU",WALL,FEATSTONE,VAR_1}, - {"smooth featstone wall LU",WALL,FEATSTONE,VAR_1}, - {"smooth featstone wall LD",WALL,FEATSTONE,VAR_1}, - {"smooth featstone wall UD",WALL,FEATSTONE,VAR_1}, - {"smooth featstone wall LR",WALL,FEATSTONE,VAR_1}, - {"smooth stone wall RD2",WALL,STONE,VAR_1}, - {"smooth stone wall R2D",WALL,STONE,VAR_1}, - {"smooth stone wall R2U",WALL,STONE,VAR_1}, - - //310 - {"smooth stone wall RU2",WALL,STONE,VAR_1}, - {"smooth stone wall L2U",WALL,STONE,VAR_1}, - {"smooth stone wall LU2",WALL,STONE,VAR_1}, - {"smooth stone wall L2D",WALL,STONE,VAR_1}, - {"smooth stone wall LD2",WALL,STONE,VAR_1}, - {"smooth stone wall LRUD",WALL,STONE,VAR_1}, - {"smooth stone wall RUD",WALL,STONE,VAR_1}, - {"smooth stone wall LRD",WALL,STONE,VAR_1}, - {"smooth stone wall LRU",WALL,STONE,VAR_1}, - {"smooth stone wall LUD",WALL,STONE,VAR_1}, - - //320 - {"smooth stone wall RD",WALL,STONE,VAR_1}, - {"smooth stone wall RU",WALL,STONE,VAR_1}, - {"smooth stone wall LU",WALL,STONE,VAR_1}, - {"smooth stone wall LD",WALL,STONE,VAR_1}, - {"smooth stone wall UD",WALL,STONE,VAR_1}, - {"smooth stone wall LR",WALL,STONE,VAR_1}, - {"obsidian fortification",FORTIFICATION,OBSIDIAN,VAR_1}, - {"featstone? fortification",FORTIFICATION,FEATSTONE,VAR_1}, - {"cracked obsidian wall",WALL,OBSIDIAN,VAR_1}, - {"damaged obsidian wall",WALL,OBSIDIAN,VAR_1}, - - // 330 - {"worn obsidian wall",WALL,OBSIDIAN,VAR_1}, - {"obsidian wall",WALL,OBSIDIAN,VAR_1}, - /*MAPTILE_FEATSTONE_WALL_WORN1, - MAPTILE_FEATSTONE_WALL_WORN2, - MAPTILE_FEATSTONE_WALL_WORN3, - MAPTILE_FEATSTONE_WALL,*/ - {"cracked featstone wall",WALL,STONE,VAR_1}, - {"damaged featstone wall",WALL,STONE,VAR_1}, - {"worn featstone wall",WALL,STONE,VAR_1}, - {"featstone wall",WALL,STONE,VAR_1}, - {"stone floor",FLOOR,STONE,VAR_1}, - {"stone floor",FLOOR,STONE,VAR_2}, - {"stone floor",FLOOR,STONE,VAR_3}, - {"stone floor",FLOOR,STONE,VAR_4}, - - // 340 - {"obsidian floor",FLOOR,OBSIDIAN,VAR_1}, - {"obsidian floor",FLOOR,OBSIDIAN,VAR_2}, - {"obsidian floor",FLOOR,OBSIDIAN,VAR_3}, - {"obsidian floor",FLOOR,OBSIDIAN,VAR_4}, - {"featstone floor 1",FLOOR,FEATSTONE,VAR_1}, - {"featstone floor 2",FLOOR,FEATSTONE,VAR_2}, - {"featstone floor 3",FLOOR,FEATSTONE,VAR_3}, - {"featstone floor 4",FLOOR,FEATSTONE,VAR_4}, - {"grass 1",FLOOR,GRASS,VAR_1}, - {"grass 2",FLOOR,GRASS,VAR_2}, - - // 350 - {"grass 3",FLOOR,GRASS,VAR_3}, - {"grass 4",FLOOR,GRASS,VAR_4}, - {"soil floor",FLOOR,SOIL,VAR_1}, - {"soil floor",FLOOR,SOIL,VAR_2}, - {"soil floor",FLOOR,SOIL,VAR_3}, - {"soil floor",FLOOR,SOIL,VAR_4}, - {"wet soil floor",FLOOR,SOIL,VAR_1}, - {"wet soil floor",FLOOR,SOIL,VAR_2}, - {"wet soil floor",FLOOR,SOIL,VAR_3}, - {"wet soil floor",FLOOR,SOIL,VAR_4}, - - // 360 - {"ice fortification",FORTIFICATION,ICE,VAR_1}, - {"cracked ice wall",WALL,ICE,VAR_1}, - {"damaged ice wall",WALL,ICE,VAR_1}, - {"worn ice wall",WALL,ICE,VAR_1}, - {"ice wall",WALL,ICE,VAR_1}, - {"river N",FLOOR,SOIL,VAR_1}, - {"river S",FLOOR,SOIL,VAR_1}, - {"river E",FLOOR,SOIL,VAR_1}, - {"river W",FLOOR,SOIL,VAR_1}, - {"river NW",FLOOR,SOIL,VAR_1}, - - //370 - {"river NE",FLOOR,SOIL,VAR_1}, - {"river SW",FLOOR,SOIL,VAR_1}, - {"river SE",FLOOR,SOIL,VAR_1}, - {"stream bed N",FLOOR,SOIL,VAR_1}, - {"stream bed S",FLOOR,SOIL,VAR_1}, - {"stream bed E",FLOOR,SOIL,VAR_1}, - {"stream bed W",FLOOR,SOIL,VAR_1}, - {"stream bed NW",FLOOR,SOIL,VAR_1}, - {"stream bed NE",FLOOR,SOIL,VAR_1}, - {"stream bed SW",FLOOR,SOIL,VAR_1}, - - // 380 - {"stream bed SE",FLOOR,SOIL,VAR_1}, - {"stream top",FLOOR,SOIL,VAR_1}, - {0 ,EMPTY, AIR, VAR_1}, - {0 ,EMPTY, AIR, VAR_1}, - {0 ,EMPTY, AIR, VAR_1}, - {0 ,EMPTY, AIR, VAR_1}, - {0 ,EMPTY, AIR, VAR_1}, - {"dry grass 1",FLOOR,GRASS_DRY,VAR_1}, - {"dry grass 2",FLOOR,GRASS_DRY,VAR_2}, - {"dry grass 3",FLOOR,GRASS_DRY,VAR_3}, - - // 390 - {"dry grass 4",FLOOR,GRASS_DRY,VAR_4}, - {"dead tree",TREE_DEAD,SOIL,VAR_1}, - {"dead sapling",SAPLING_DEAD,SOIL,VAR_1}, - {"dead shrub",SHRUB_DEAD,SOIL,VAR_1}, - {"dead grass 1",FLOOR,GRASS_DEAD,VAR_1}, - {"dead grass 2",FLOOR,GRASS_DEAD,VAR_2}, - {"dead grass 3",FLOOR,GRASS_DEAD,VAR_3}, - {"dead grass 4",FLOOR,GRASS_DEAD,VAR_4}, - {"grass B1",FLOOR,GRASS2,VAR_1}, - {"grass B2",FLOOR,GRASS2,VAR_2}, - - // 400 - {"grass B3",FLOOR,GRASS2,VAR_3}, - {"grass B4",FLOOR,GRASS2,VAR_4}, - {"boulder",BOULDER,STONE,VAR_1}, - {"obsidian boulder",BOULDER,OBSIDIAN,VAR_1}, - {"featstone? boulder",BOULDER,FEATSTONE,VAR_1}, - {"pebbles 1",PEBBLES,STONE,VAR_1}, - {"pebbles 2",PEBBLES,STONE,VAR_2}, - {"pebbles 3",PEBBLES,STONE,VAR_3}, - {"pebbles 4",PEBBLES,STONE,VAR_4}, - {"obsidian shards",PEBBLES,OBSIDIAN,VAR_1}, - - // 410 - {"obsidian shards",PEBBLES,OBSIDIAN,VAR_2}, - {"obsidian shards",PEBBLES,OBSIDIAN,VAR_3}, - {"obsidian shards",PEBBLES,OBSIDIAN,VAR_4}, - {"featstone? pebbles",PEBBLES,FEATSTONE,VAR_1}, - {"featstone? pebbles",PEBBLES,FEATSTONE,VAR_2}, - {"featstone? pebbles",PEBBLES,FEATSTONE,VAR_3}, - {"featstone? pebbles",PEBBLES,FEATSTONE,VAR_4}, - {"smooth vein wall",WALL,VEIN,VAR_1}, - {"smooth vein wall",WALL,VEIN,VAR_1}, - {"smooth vein wall",WALL,VEIN,VAR_1}, - - // 420 - {"smooth vein wall",WALL,VEIN,VAR_1}, - {"smooth vein wall",WALL,VEIN,VAR_1}, - {"smooth vein wall",WALL,VEIN,VAR_1}, - {"smooth vein wall",WALL,VEIN,VAR_1}, - {"smooth vein wall",WALL,VEIN,VAR_1}, - {"smooth vein wall",WALL,VEIN,VAR_1}, - {"smooth vein wall",WALL,VEIN,VAR_1}, - {"smooth vein wall",WALL,VEIN,VAR_1}, - {"smooth vein wall",WALL,VEIN,VAR_1}, - {"smooth vein wall",WALL,VEIN,VAR_1}, - - // 430 - {"smooth vein wall",WALL,VEIN,VAR_1}, - {"smooth vein wall",WALL,VEIN,VAR_1}, - {"smooth vein wall",WALL,VEIN,VAR_1}, - {"smooth vein wall",WALL,VEIN,VAR_1}, - {"smooth vein wall",WALL,VEIN,VAR_1}, - {"smooth vein wall",WALL,VEIN,VAR_1}, - {"vein fortification",FORTIFICATION,VEIN,VAR_1}, - {"cracked vein wall",WALL,VEIN,VAR_1}, - {"damaged vein wall",WALL,VEIN,VAR_1}, - {"worn vein wall",WALL,VEIN,VAR_1}, - - // 440 - {"vein wall",WALL,VEIN,VAR_1}, - {"vein floor",FLOOR,VEIN,VAR_1}, - {"vein floor",FLOOR,VEIN,VAR_2}, - {"vein floor",FLOOR,VEIN,VAR_3}, - {"vein floor",FLOOR,VEIN,VAR_4}, - {"vein boulder",BOULDER,VEIN,VAR_1}, - {"vein pebbles",PEBBLES,VEIN,VAR_1}, - {"vein pebbles",PEBBLES,VEIN,VAR_2}, - {"vein pebbles",PEBBLES,VEIN,VAR_3}, - {"vein pebbles",PEBBLES,VEIN,VAR_4}, - - // 450 - {"smooth ice wall",WALL,ICE,VAR_1}, - {"smooth ice wall",WALL,ICE,VAR_1}, - {"smooth ice wall",WALL,ICE,VAR_1}, - {"smooth ice wall",WALL,ICE,VAR_1}, - {"smooth ice wall",WALL,ICE,VAR_1}, - {"smooth ice wall",WALL,ICE,VAR_1}, - {"smooth ice wall",WALL,ICE,VAR_1}, - {"smooth ice wall",WALL,ICE,VAR_1}, - {"smooth ice wall",WALL,ICE,VAR_1}, - {"smooth ice wall",WALL,ICE,VAR_1}, - - // 460 - {"smooth ice wall",WALL,ICE,VAR_1}, - {"smooth ice wall",WALL,ICE,VAR_1}, - {"smooth ice wall",WALL,ICE,VAR_1}, - {"smooth ice wall",WALL,ICE,VAR_1}, - {"smooth ice wall",WALL,ICE,VAR_1}, - {"smooth ice wall",WALL,ICE,VAR_1}, - {"smooth ice wall",WALL,ICE,VAR_1}, - {"smooth ice wall",WALL,ICE,VAR_1}, - {"smooth ice wall",WALL,ICE,VAR_1}, - {0 ,EMPTY, AIR, VAR_1}, - - // 470 - {0 ,EMPTY, AIR, VAR_1}, - {0 ,EMPTY, AIR, VAR_1}, - {0 ,EMPTY, AIR, VAR_1}, - {0 ,EMPTY, AIR, VAR_1}, - {0 ,EMPTY, AIR, VAR_1}, - {0 ,EMPTY, AIR, VAR_1}, - {0 ,EMPTY, AIR, VAR_1}, - {0 ,EMPTY, AIR, VAR_1}, - {0 ,EMPTY, AIR, VAR_1}, - {0 ,EMPTY, AIR, VAR_1}, - - // 480 - {0 ,EMPTY, AIR, VAR_1}, - {0 ,EMPTY, AIR, VAR_1}, - {0 ,EMPTY, AIR, VAR_1}, - {0 ,EMPTY, AIR, VAR_1}, - {0 ,EMPTY, AIR, VAR_1}, - {0 ,EMPTY, AIR, VAR_1}, - {0 ,EMPTY, AIR, VAR_1}, - {0 ,EMPTY, AIR, VAR_1}, - {0 ,EMPTY, AIR, VAR_1}, - {0 ,EMPTY, AIR, VAR_1}, - - // 490 - {0 ,EMPTY, AIR, VAR_1}, - {0 ,EMPTY, AIR, VAR_1}, - {0 ,EMPTY, AIR, VAR_1}, - {"constructed floor",FLOOR,CONSTRUCTED, VAR_1}, - {"constructed fortification",FORTIFICATION,CONSTRUCTED, VAR_1}, - {"constructed pillar",PILLAR,CONSTRUCTED, VAR_1}, - {"constructed wall",WALL,CONSTRUCTED, VAR_1}, - {"constructed wall",WALL,CONSTRUCTED, VAR_1}, - {"constructed wall",WALL,CONSTRUCTED, VAR_1}, - {"constructed wall",WALL,CONSTRUCTED, VAR_1}, - - // 500 - {"constructed wall",WALL,CONSTRUCTED, VAR_1}, - {"constructed wall",WALL,CONSTRUCTED, VAR_1}, - {"constructed wall",WALL,CONSTRUCTED, VAR_1}, - {"constructed wall",WALL,CONSTRUCTED, VAR_1}, - {"constructed wall",WALL,CONSTRUCTED, VAR_1}, - {"constructed wall",WALL,CONSTRUCTED, VAR_1}, - {"constructed wall",WALL,CONSTRUCTED, VAR_1}, - {"constructed wall",WALL,CONSTRUCTED, VAR_1}, - {"constructed wall",WALL,CONSTRUCTED, VAR_1}, - {"constructed wall",WALL,CONSTRUCTED, VAR_1}, - - // 510 - {"constructed wall",WALL,CONSTRUCTED, VAR_1}, - {"constructed wall",WALL,CONSTRUCTED, VAR_1}, - {"constructed wall",WALL,CONSTRUCTED, VAR_1}, - {"constructed wall",WALL,CONSTRUCTED, VAR_1}, - {"constructed wall",WALL,CONSTRUCTED, VAR_1}, - {"constructed stair up/down",STAIR_UPDOWN,CONSTRUCTED, VAR_1}, - {"constructed stair down",STAIR_DOWN,CONSTRUCTED, VAR_1}, - {"constructed stair up",STAIR_UP,CONSTRUCTED, VAR_1}, - {"constructed ramp",RAMP,CONSTRUCTED, VAR_1}, - {0 ,EMPTY, AIR, VAR_1} // end - }; - - inline - bool isWallTerrain(int in) - { - return tileTypeTable[in].c >= WALL && tileTypeTable[in].c <= FORTIFICATION ; - } - - inline - bool isFloorTerrain(int in) - { - return tileTypeTable[in].c >= FLOOR && tileTypeTable[in].c <= PEBBLES; - } - - inline - bool isRampTerrain(int in) - { - return tileTypeTable[in].c == RAMP; - } - - inline - bool isStairTerrain(int in) - { - return tileTypeTable[in].c >= STAIR_UP && tileTypeTable[in].c <= STAIR_UPDOWN; - } - - inline - bool isOpenTerrain(int in) - { - return tileTypeTable[in].c == EMPTY; - } - - inline - int getVegetationType(int in) - { - return tileTypeTable[in].c; - } -} - - - -#endif // TILETYPES_H_INCLUDED +/*
+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 TILETYPES_H_INCLUDED
+#define TILETYPES_H_INCLUDED
+
+#include "DFPragma.h"
+
+namespace DFHack
+{
+
+ // tile class -- determines the general shape of the tile
+ // enum and lookup table for string names created using X macros
+#define TILECLASS_MACRO \
+ X(EMPTY, "") \
+ X(WALL, "") \
+ X(PILLAR, "") \
+ X(FORTIFICATION, "") \
+ X(STAIR_UP, "") \
+ X(STAIR_DOWN, "") \
+ X(STAIR_UPDOWN, "") \
+ X(RAMP, "ramps have no direction" ) \
+ X(RAMP_TOP, "used for pathing?" ) \
+ X(FLOOR, "") \
+ X(TREE_DEAD, "") \
+ X(TREE_OK, "") \
+ X(SAPLING_DEAD, "") \
+ X(SAPLING_OK, "") \
+ X(SHRUB_DEAD, "") \
+ X(SHRUB_OK, "") \
+ X(BOULDER, "") \
+ X(PEBBLES, "")
+//end TILECLASS_MACRO
+
+ //define tile class enum
+ #define X(name,comment) name,
+ enum TileClass {
+ tileclass_invalid=-1,
+ TILECLASS_MACRO
+ tileclass_count,
+ };
+ #undef X
+
+ //Visual Studio screams if you don't do this for the const char* arrays
+ #ifndef char_p
+ typedef char * char_p;
+ #endif
+
+ //set tile class string lookup table (e.g. for printing to user)
+ #define X(name,comment) #name,
+ const char_p TileClassString[tileclass_count+1] = {
+ TILECLASS_MACRO
+ NULL
+ };
+ #undef X
+
+
+#define TILEMATERIAL_MACRO \
+ X(AIR, "empty" ) \
+ X(SOIL, "ordinary soil. material depends on geology" ) \
+ X(STONE, "ordinary layer stone. material depends on geology" ) \
+ X(FEATSTONE, "map special stone. used for things like hell, the hell temple or adamantine tubes. material depends on local/global special" ) \
+ X(OBSIDIAN, "cast obsidian" ) \
+ X(VEIN, "vein stone. material depends on mineral veins present" ) \
+ X(ICE, "frozen water... not much to say. you can determine what was on the tile before it froze by looking into the 'ice vein' objects" ) \
+ X(GRASS, "grass (has 4 variants)" ) \
+ X(GRASS2, "grass (has 4 variants)" ) \
+ X(GRASS_DEAD, "dead grass (has 4 variants)" ) \
+ X(GRASS_DRY, "dry grass (has 4 variants)" ) \
+ X(DRIFTWOOD, "non-specified wood - normally on top of the local layer stone/soil." ) \
+ X(HFS, "the stuff demon pits are made of - this makes them different from ordinary pits." ) \
+ X(MAGMA, "material for semi-molten rock and 'magma flow' tiles" ) \
+ X(CAMPFIRE, "human armies make them when they siege. The original tile may be lost?" ) \
+ X(FIRE, "burning grass" ) \
+ X(ASHES, "what remains from a FIRE" ) \
+ X(CONSTRUCTED,"tile material depends on the construction present" ) \
+ X(CYAN_GLOW, "the glowy stuff that disappears from the demon temple when you take the sword." )
+//end TILEMATERIAL_MACRO
+
+ // material enum
+ #define X(name,comment) name,
+ enum TileMaterial {
+ tilematerial_invalid=-1,
+ TILEMATERIAL_MACRO
+ tilematerial_count,
+ };
+ #undef X
+
+ //string lookup table (e.g. for printing to user)
+ #define X(name,comment) #name,
+ const char_p TileMaterialString[tilematerial_count+1] = {
+ TILEMATERIAL_MACRO
+ NULL
+ };
+ #undef X
+
+
+ // Special specials of the tile.
+ // Not the best way to do this, but compatible with existing code.
+ // When the TileType class gets created, everything should be re-thought.
+#define TILESPECIAL_MACRO \
+ X(NORMAL, "Default for all type, nothing present" ) \
+ X(SPECIAL, "General purpose, for any unique tile which can not otherwise be differenciated" ) \
+ X(POOL, "Murky Pool, will gather water from rain" ) \
+ X(STREAM, "Streams (and brooks too? maybe?)" ) \
+ X(STREAM_TOP, "The walkable surface of a stream/brook" ) \
+ X(RIVER_SOURCE, "Rivers Source, when it exists on a map" ) \
+ X(RIVER, "Rivers, and their entering and exiting tiles" ) \
+ X(WATERFALL, "Special case for Waterfall Landing. How's this used?" ) \
+ X(ENDLESS, "Eerie Pit and Old Chasm/Endless Pit" ) \
+ X(CRACKED, "Walls being dug" ) \
+ X(DAMAGED, "Walls being dug" ) \
+ X(WORN, "Walls being dug ??" ) \
+ X(SMOOTH, "Walls and floors." )
+//end TILESPECIAL_MACRO
+
+ //special enum
+ #define X(name,comment) TILE_##name,
+ enum TileSpecial {
+ tilespecial_invalid=-1,
+ TILESPECIAL_MACRO
+ tilespecial_count,
+ };
+ #undef X
+
+ //string lookup table (e.g. for printing to user)
+ #define X(name,comment) #name,
+ const char_p TileSpecialString[tilespecial_count+1] = {
+ TILESPECIAL_MACRO
+ NULL
+ };
+ #undef X
+
+
+ // variants are used for tiles, where there are multiple variants of the same - like grass floors
+ enum TileVariant
+ {
+ tilevariant_invalid=-1,
+ VAR_1, //Yes, the value of VAR_1 is 0. It's legacy. Deal with it.
+ VAR_2,
+ VAR_3,
+ VAR_4,
+ };
+
+
+ //Mainly walls and rivers
+ //Byte values are used because walls can have either 1 or 2 in any given direction.
+ const int TileDirectionCount = 4;
+ union TileDirection
+ {
+ uint32_t whole;
+ unsigned char b[TileDirectionCount];
+ struct {
+ //Maybe should add 'up' and 'down' for Z-levels?
+ unsigned char north,south,west,east;
+ };
+
+ inline TileDirection()
+ {
+ whole = 0;
+ }
+ TileDirection( uint32_t whole_bits)
+ {
+ whole = whole_bits;
+ }
+ TileDirection( unsigned char North, unsigned char South, unsigned char West, unsigned char East )
+ {
+ north=North; south=South; east=East; west=West;
+ }
+ TileDirection( const char *dir )
+ {
+ //This one just made for fun.
+ //Supports N S E W
+ const char *p = dir;
+ unsigned char *l=NULL;
+ north=south=east=west=0;
+ if(!dir) return;
+
+ for( ;*p;++p){
+ switch(*p){
+ case 'N': //North / Up
+ case 'n':
+ ++north; l=&north; break;
+ case 'S': //South / Down
+ case 's':
+ ++south; l=&south; break;
+ case 'E': //East / Right
+ case 'e':
+ ++east; l=&east; break;
+ case 'W': //West / Left
+ case 'w':
+ ++west; l=&west; break;
+ case '-':
+ case ' ':
+ //Explicitly ensure dash and space are ignored.
+ //Other characters/symbols may be assigned in the future.
+ break;
+ default:
+ if( l && '0' <= *p && '9' >= *p )
+ *l += *p - '0';
+ break;
+ }
+ }
+ }
+
+ //may be useful for some situations
+ inline uint32_t sum() const {
+ return 0L + north + south + east + west;
+ }
+
+ //Gives a string that represents the direction.
+ //This is a static string, overwritten with every call!
+ //Support values > 2 even though they should never happen.
+ //Copy string if it will be used.
+ inline char * getStr() const {
+ static char str[16];
+ //type punning trick
+ *( (uint64_t *)str ) = *( (uint64_t *)"--------" );
+ str[8]=0;
+#define DIRECTION(x,i,c) \
+ if(x){ \
+ str[i]=c; \
+ if(1==x) ; \
+ else if(2==x) str[i+1]=c; \
+ else str[i+1]='0'+x; \
+ }
+
+ DIRECTION(north,0,'N')
+ DIRECTION(south,2,'S')
+ DIRECTION(west,4,'W')
+ DIRECTION(east,6,'E')
+#undef DIRECTION
+ return str;
+ }
+
+
+ };
+
+ struct TileRow
+ {
+ const char * name;
+ TileClass c;
+ TileMaterial m;
+ TileVariant v;
+ TileSpecial s;
+ TileDirection d;
+ };
+
+ #define TILE_TYPE_ARRAY_LENGTH 520
+
+ const TileRow tileTypeTable[TILE_TYPE_ARRAY_LENGTH] =
+ {
+ // 0
+ {"void",EMPTY, AIR, VAR_1},
+ {"ramp top",RAMP_TOP, AIR, VAR_1},
+ {"pool",FLOOR, SOIL, VAR_1, TILE_POOL},
+ {0, EMPTY, AIR, VAR_1},
+ {0, EMPTY, AIR, VAR_1},
+ {0, EMPTY, AIR, VAR_1},
+ {0, EMPTY, AIR, VAR_1},
+ {0, EMPTY, AIR, VAR_1},
+ {0, EMPTY, AIR, VAR_1},
+ {0, EMPTY, AIR, VAR_1},
+
+ // 10
+ {0, EMPTY, AIR, VAR_1},
+ {0, EMPTY, AIR, VAR_1},
+ {0, EMPTY, AIR, VAR_1},
+ {0, EMPTY, AIR, VAR_1},
+ {0, EMPTY, AIR, VAR_1},
+ {0, EMPTY, AIR, VAR_1},
+ {0, EMPTY, AIR, VAR_1},
+ {0, EMPTY, AIR, VAR_1},
+ {0, EMPTY, AIR, VAR_1},
+ {"driftwood stack",FLOOR, DRIFTWOOD, VAR_1},
+
+ // 20
+ {0 ,EMPTY, AIR, VAR_1},
+ {0 ,EMPTY, AIR, VAR_1},
+ {0 ,EMPTY, AIR, VAR_1},
+ {0 ,EMPTY, AIR, VAR_1},
+ {"tree",TREE_OK, SOIL, VAR_1},
+ {"ice stair up/down",STAIR_UPDOWN, ICE, VAR_1},
+ {"ice stair down",STAIR_DOWN, ICE, VAR_1},
+ {"ice stair up",STAIR_UP, ICE, VAR_1},
+ {0 ,EMPTY, AIR, VAR_1},
+ {0 ,EMPTY, AIR, VAR_1},
+
+ // 30
+ {0 ,EMPTY, AIR, VAR_1},
+ {0 ,EMPTY, AIR, VAR_1},
+ {"empty space",EMPTY, AIR, VAR_1},
+ {0 ,EMPTY, AIR, VAR_1},
+ {"shrub",SHRUB_OK, SOIL, VAR_1},
+ {"chasm",FLOOR, AIR, VAR_1, TILE_ENDLESS },
+ {"obsidian stair up/down",STAIR_UPDOWN, OBSIDIAN, VAR_1},
+ {"obsidian stair down",STAIR_DOWN, OBSIDIAN, VAR_1},
+ {"obsidian stair up",STAIR_UP, OBSIDIAN, VAR_1},
+ {"soil stair up/down",STAIR_UPDOWN, SOIL, VAR_1},
+
+ // 40
+ {"soil stair down",STAIR_DOWN, SOIL, VAR_1},
+ {"soil stair up",STAIR_UP, SOIL, VAR_1},
+ {"eerie pit",FLOOR, HFS, VAR_1, TILE_ENDLESS},
+ {"smooth stone floor",FLOOR, STONE, VAR_1 , TILE_SMOOTH },
+ {"smooth obsidian floor",FLOOR, OBSIDIAN, VAR_1 , TILE_SMOOTH },
+ {"smooth featstone? floor",FLOOR, FEATSTONE, VAR_1 , TILE_SMOOTH },
+ {"smooth vein floor",FLOOR, VEIN, VAR_1 , TILE_SMOOTH },
+ {"smooth ice floor",FLOOR, ICE, VAR_1 , TILE_SMOOTH },
+ {0 ,EMPTY, AIR, VAR_1},
+ {"grass stair up/down",STAIR_UPDOWN, GRASS, VAR_1},
+
+ // 50
+ {"grass stair down",STAIR_DOWN, GRASS, VAR_1},
+ {"grass stair up",STAIR_UP, GRASS, VAR_1},
+ {"grass2 stair up/down",STAIR_UPDOWN, GRASS2, VAR_1},
+ {"grass2 stair down",STAIR_DOWN, GRASS2, VAR_1},
+ {"grass2 stair up",STAIR_UP, GRASS2, VAR_1},
+ {"stone stair up/down",STAIR_UPDOWN, STONE, VAR_1},
+ {"stone stair down",STAIR_DOWN, STONE, VAR_1},
+ {"stone stair up",STAIR_UP, STONE, VAR_1},
+ {"vein stair up/down",STAIR_UPDOWN, VEIN, VAR_1},
+ {"vein stair down",STAIR_DOWN, VEIN, VAR_1},
+
+ // 60
+ {"vein stair up",STAIR_UP, VEIN, VAR_1},
+ {"featstone? stair up/down",STAIR_UPDOWN, FEATSTONE, VAR_1},
+ {"featstone? stair down",STAIR_DOWN, FEATSTONE, VAR_1},
+ {"featstone? stair up",STAIR_UP, FEATSTONE, VAR_1},
+ {0 ,EMPTY, AIR, VAR_1},
+ {"stone fortification",FORTIFICATION, STONE, VAR_1},
+ {0 ,EMPTY, AIR, VAR_1},
+ {"campfire",FLOOR, CAMPFIRE, VAR_1},
+ {0 ,EMPTY, AIR, VAR_1},
+ {0 ,EMPTY, AIR, VAR_1},
+
+ // 70
+ {"fire",FLOOR, FIRE, VAR_1},
+ {0 ,EMPTY, AIR, VAR_1},
+ {0 ,EMPTY, AIR, VAR_1},
+ {0 ,EMPTY, AIR, VAR_1},
+ {0 ,EMPTY, AIR, VAR_1},
+ {0 ,EMPTY, AIR, VAR_1},
+ {0 ,EMPTY, AIR, VAR_1},
+ {0 ,EMPTY, AIR, VAR_1},
+ {0 ,EMPTY, AIR, VAR_1},
+ {"stone pillar",PILLAR, STONE, VAR_1},
+
+ //80
+ {"obsidian pillar",PILLAR, OBSIDIAN, VAR_1},
+ {"featstone? pillar",PILLAR, FEATSTONE, VAR_1},
+ {"vein pillar",PILLAR, VEIN, VAR_1},
+ {"ice pillar",PILLAR, ICE, VAR_1},
+ {0 ,EMPTY, AIR, VAR_1},
+ {0 ,EMPTY, AIR, VAR_1},
+ {0 ,EMPTY, AIR, VAR_1},
+ {0 ,EMPTY, AIR, VAR_1},
+ {0 ,EMPTY, AIR, VAR_1},
+ {"waterfall landing",FLOOR, SOIL, VAR_1, TILE_WATERFALL }, // verify material
+
+ // 90
+ {"river source",FLOOR, SOIL, VAR_1, TILE_RIVER_SOURCE }, // verify material
+ {0 ,EMPTY, AIR, VAR_1},
+ {0 ,EMPTY, AIR, VAR_1},
+ {0 ,EMPTY, AIR, VAR_1},
+ {0 ,EMPTY, AIR, VAR_1},
+ {0 ,EMPTY, AIR, VAR_1},
+ {0 ,EMPTY, AIR, VAR_1},
+ {0 ,EMPTY, AIR, VAR_1},
+ {0 ,EMPTY, AIR, VAR_1},
+ {0 ,EMPTY, AIR, VAR_1},
+
+ // 100
+ {0 ,EMPTY, AIR, VAR_1},
+ {0 ,EMPTY, AIR, VAR_1},
+ {0 ,EMPTY, AIR, VAR_1},
+ {0 ,EMPTY, AIR, VAR_1},
+ {0 ,EMPTY, AIR, VAR_1},
+ {0 ,EMPTY, AIR, VAR_1},
+ {0 ,EMPTY, AIR, VAR_1},
+ {0 ,EMPTY, AIR, VAR_1},
+ {0 ,EMPTY, AIR, VAR_1},
+ {0 ,EMPTY, AIR, VAR_1},
+
+ // 110
+ {0 ,EMPTY, AIR, VAR_1},
+ {0 ,EMPTY, AIR, VAR_1},
+ {0 ,EMPTY, AIR, VAR_1},
+ {0 ,EMPTY, AIR, VAR_1},
+ {0 ,EMPTY, AIR, VAR_1},
+ {0 ,EMPTY, AIR, VAR_1},
+ {0 ,EMPTY, AIR, VAR_1},
+ {0 ,EMPTY, AIR, VAR_1},
+ {0 ,EMPTY, AIR, VAR_1},
+ {0 ,EMPTY, AIR, VAR_1},
+
+ // 120
+ {0 ,EMPTY, AIR, VAR_1},
+ {0 ,EMPTY, AIR, VAR_1},
+ {0 ,EMPTY, AIR, VAR_1},
+ {0 ,EMPTY, AIR, VAR_1},
+ {0 ,EMPTY, AIR, VAR_1},
+ {0 ,EMPTY, AIR, VAR_1},
+ {0 ,EMPTY, AIR, VAR_1},
+ {0 ,EMPTY, AIR, VAR_1},
+ {0 ,EMPTY, AIR, VAR_1},
+ {0 ,EMPTY, AIR, VAR_1},
+
+ // 130
+ {0 ,EMPTY, AIR, VAR_1},
+ {0 ,EMPTY, AIR, VAR_1},
+ {0 ,EMPTY, AIR, VAR_1},
+ {0 ,EMPTY, AIR, VAR_1},
+ {0 ,EMPTY, AIR, VAR_1},
+ {0 ,EMPTY, AIR, VAR_1},
+ {0 ,EMPTY, AIR, VAR_1},
+ {0 ,EMPTY, AIR, VAR_1},
+ {0 ,EMPTY, AIR, VAR_1},
+ {0 ,EMPTY, AIR, VAR_1},
+
+ // 140
+ {0 ,EMPTY, AIR, VAR_1},
+ {0 ,EMPTY, AIR, VAR_1},
+ {0 ,EMPTY, AIR, VAR_1},
+ {0 ,EMPTY, AIR, VAR_1},
+ {0 ,EMPTY, AIR, VAR_1},
+ {0 ,EMPTY, AIR, VAR_1},
+ {0 ,EMPTY, AIR, VAR_1},
+ {0 ,EMPTY, AIR, VAR_1},
+ {0 ,EMPTY, AIR, VAR_1},
+ {0 ,EMPTY, AIR, VAR_1},
+
+ // 150
+ {0 ,EMPTY, AIR, VAR_1},
+ {0 ,EMPTY, AIR, VAR_1},
+ {0 ,EMPTY, AIR, VAR_1},
+ {0 ,EMPTY, AIR, VAR_1},
+ {0 ,EMPTY, AIR, VAR_1},
+ {0 ,EMPTY, AIR, VAR_1},
+ {0 ,EMPTY, AIR, VAR_1},
+ {0 ,EMPTY, AIR, VAR_1},
+ {0 ,EMPTY, AIR, VAR_1},
+ {0 ,EMPTY, AIR, VAR_1},
+
+ // 160
+ {0 ,EMPTY, AIR, VAR_1},
+ {0 ,EMPTY, AIR, VAR_1},
+ {0 ,EMPTY, AIR, VAR_1},
+ {0 ,EMPTY, AIR, VAR_1},
+ {0 ,EMPTY, AIR, VAR_1},
+ {0 ,EMPTY, AIR, VAR_1},
+ {0 ,EMPTY, AIR, VAR_1},
+ {0 ,EMPTY, AIR, VAR_1},
+ {0 ,EMPTY, AIR, VAR_1},
+ {0 ,EMPTY, AIR, VAR_1},
+
+ // 170
+ {0 ,EMPTY, AIR, VAR_1},
+ {0 ,EMPTY, AIR, VAR_1},
+ {0 ,EMPTY, AIR, VAR_1},
+ {0 ,EMPTY, AIR, VAR_1},
+ {0 ,EMPTY, AIR, VAR_1},
+ {0 ,EMPTY, AIR, VAR_1},
+ {"cracked stone wall" ,WALL, STONE, VAR_1, TILE_CRACKED },
+ {"damaged stone wall" ,WALL, STONE, VAR_1, TILE_DAMAGED },
+ {"worn stone wall" ,WALL, STONE, VAR_1, TILE_WORN },
+ {0 ,EMPTY, AIR, VAR_1},
+
+ // 180
+ {0 ,EMPTY, AIR, VAR_1},
+ {0 ,EMPTY, AIR, VAR_1},
+ {0 ,EMPTY, AIR, VAR_1},
+ {0 ,EMPTY, AIR, VAR_1},
+ {0 ,EMPTY, AIR, VAR_1},
+ {0 ,EMPTY, AIR, VAR_1},
+ {0 ,EMPTY, AIR, VAR_1},
+ {0 ,EMPTY, AIR, VAR_1},
+ {0 ,EMPTY, AIR, VAR_1},
+ {0 ,EMPTY, AIR, VAR_1},
+
+ // 190
+ {0 ,EMPTY, AIR, VAR_1},
+ {0 ,EMPTY, AIR, VAR_1},
+ {0 ,EMPTY, AIR, VAR_1},
+ {0 ,EMPTY, AIR, VAR_1},
+ {0 ,EMPTY, AIR, VAR_1},
+ {0 ,EMPTY, AIR, VAR_1},
+ {0 ,EMPTY, AIR, VAR_1},
+ {0 ,EMPTY, AIR, VAR_1},
+ {0 ,EMPTY, AIR, VAR_1},
+ {0 ,EMPTY, AIR, VAR_1},
+
+ // 200
+ {0 ,EMPTY, AIR, VAR_1},
+ {0 ,EMPTY, AIR, VAR_1},
+ {0 ,EMPTY, AIR, VAR_1},
+ {0 ,EMPTY, AIR, VAR_1},
+ {0 ,EMPTY, AIR, VAR_1},
+ {0 ,EMPTY, AIR, VAR_1},
+ {0 ,EMPTY, AIR, VAR_1},
+ {0 ,EMPTY, AIR, VAR_1},
+ {0 ,EMPTY, AIR, VAR_1},
+ {0 ,EMPTY, AIR, VAR_1},
+
+ // 210
+ {0 ,EMPTY, AIR, VAR_1},
+ {0 ,EMPTY, AIR, VAR_1},
+ {0 ,EMPTY, AIR, VAR_1},
+ {0 ,EMPTY, AIR, VAR_1},
+ {0 ,EMPTY, AIR, VAR_1},
+ {0 ,EMPTY, AIR, VAR_1},
+ {0 ,EMPTY, AIR, VAR_1},
+ {0 ,EMPTY, AIR, VAR_1},
+ {0 ,EMPTY, AIR, VAR_1},
+ {"stone wall" ,WALL, STONE, VAR_1},
+
+ // 220
+ {0 ,EMPTY, AIR, VAR_1},
+ {0 ,EMPTY, AIR, VAR_1},
+ {0 ,EMPTY, AIR, VAR_1},
+ {0 ,EMPTY, AIR, VAR_1},
+ {0 ,EMPTY, AIR, VAR_1},
+ {0 ,EMPTY, AIR, VAR_1},
+ {0 ,EMPTY, AIR, VAR_1},
+ {0 ,EMPTY, AIR, VAR_1},
+ {0 ,EMPTY, AIR, VAR_1},
+ {0 ,EMPTY, AIR, VAR_1},
+
+ // 230
+ {0 ,EMPTY, AIR, VAR_1},
+ {"sapling" ,SAPLING_OK, SOIL, VAR_1},
+ {0 ,EMPTY, AIR, VAR_1},
+ {"dry grass ramp" ,RAMP, GRASS_DRY, VAR_1},
+ {"dead grass ramp" ,RAMP, GRASS_DEAD, VAR_1},
+ {"grass ramp" ,RAMP, GRASS, VAR_1},
+ {"grass ramp" ,RAMP, GRASS2, VAR_1},
+ {"stone ramp" ,RAMP, STONE, VAR_1},
+ {"obsidian ramp" ,RAMP, OBSIDIAN, VAR_1},
+ {"featstone? ramp" ,RAMP, FEATSTONE, VAR_1},
+
+ // 240
+ {"vein ramp" ,RAMP, VEIN, VAR_1},
+ {"soil ramp" ,RAMP, SOIL, VAR_1},
+ {"ashes" ,FLOOR, ASHES, VAR_1},
+ {"ashes" ,FLOOR, ASHES, VAR_2},
+ {"ashes" ,FLOOR, ASHES, VAR_3},
+ {"ice ramp" ,RAMP, ICE, VAR_1},
+ {0 ,EMPTY, AIR, VAR_1},
+ {0 ,EMPTY, AIR, VAR_1},
+ {0 ,EMPTY, AIR, VAR_1},
+ {0 ,EMPTY, AIR, VAR_1},
+
+ // 250
+ {0 ,EMPTY, AIR, VAR_1},
+ {0 ,EMPTY, AIR, VAR_1},
+ {0 ,EMPTY, AIR, VAR_1},
+ {0 ,EMPTY, AIR, VAR_1},
+ {0 ,EMPTY, AIR, VAR_1},
+ {0 ,EMPTY, AIR, VAR_1},
+ {0 ,EMPTY, AIR, VAR_1},
+ {0 ,EMPTY, AIR, VAR_1},
+ {"ice floor" ,FLOOR, ICE, VAR_2},
+ {"ice floor" ,FLOOR, ICE, VAR_3},
+
+ // 260
+ {"ice floor" ,FLOOR, ICE, VAR_4},
+ {"furrowed soil" ,FLOOR, SOIL, VAR_1},
+ {"ice floor" ,FLOOR, ICE, VAR_1},
+ {"semi-molten rock" ,WALL, MAGMA, VAR_1},// unminable magma wall
+ {"magma" ,FLOOR, MAGMA, VAR_1},
+ {"soil wall" ,WALL, SOIL, VAR_1},
+ {0 ,EMPTY, AIR, VAR_1},
+ {"glowing floor" ,FLOOR, CYAN_GLOW, VAR_1},
+ {0 ,EMPTY, AIR, VAR_1},
+ {"smooth obsidian wall RD2",WALL,OBSIDIAN,VAR_1 , TILE_SMOOTH , "--SS--E-" },
+
+ // 270
+ {"smooth obsidian wall R2D",WALL,OBSIDIAN,VAR_1 , TILE_SMOOTH , "--S---EE" },
+ {"smooth obsidian wall R2U",WALL,OBSIDIAN,VAR_1 , TILE_SMOOTH , "N-----EE" },
+ {"smooth obsidian wall RU2",WALL,OBSIDIAN,VAR_1 , TILE_SMOOTH , "NN----E-" },
+ {"smooth obsidian wall L2U",WALL,OBSIDIAN,VAR_1 , TILE_SMOOTH , "N---WW--" },
+ {"smooth obsidian wall LU2",WALL,OBSIDIAN,VAR_1 , TILE_SMOOTH , "NN--W---" },
+ {"smooth obsidian wall L2D",WALL,OBSIDIAN,VAR_1 , TILE_SMOOTH , "--S-WW--" },
+ {"smooth obsidian wall LD2",WALL,OBSIDIAN,VAR_1 , TILE_SMOOTH , "--SSW---" },
+ {"smooth obsidian wall LRUD",WALL,OBSIDIAN,VAR_1 , TILE_SMOOTH ,"N-S-W-E-" },
+ {"smooth obsidian wall RUD",WALL,OBSIDIAN,VAR_1 , TILE_SMOOTH , "N-S---E-" },
+ {"smooth obsidian wall LRD",WALL,OBSIDIAN,VAR_1 , TILE_SMOOTH , "--S-W-E-" },
+
+ // 280
+ {"smooth obsidian wall LRU",WALL,OBSIDIAN,VAR_1 , TILE_SMOOTH , "N---W-E-" },
+ {"smooth obsidian wall LUD",WALL,OBSIDIAN,VAR_1 , TILE_SMOOTH , "N-S-W---" },
+ {"smooth obsidian wall RD",WALL,OBSIDIAN,VAR_1 , TILE_SMOOTH , "--S---E-" },
+ {"smooth obsidian wall RU",WALL,OBSIDIAN,VAR_1 , TILE_SMOOTH , "N-----E-" },
+ {"smooth obsidian wall LU",WALL,OBSIDIAN,VAR_1 , TILE_SMOOTH , "N---W---" },
+ {"smooth obsidian wall LD",WALL,OBSIDIAN,VAR_1 , TILE_SMOOTH , "--S-W---" },
+ {"smooth obsidian wall UD",WALL,OBSIDIAN,VAR_1 , TILE_SMOOTH , "N-S-----" },
+ {"smooth obsidian wall LR",WALL,OBSIDIAN,VAR_1 , TILE_SMOOTH , "----W-E-" },
+ {"smooth featstone wall RD2",WALL,FEATSTONE,VAR_1 , TILE_SMOOTH , "--SS--E-" },
+ {"smooth featstone wall R2D",WALL,FEATSTONE,VAR_1 , TILE_SMOOTH , "--S---EE" },
+
+ // 290
+ {"smooth featstone wall R2U",WALL,FEATSTONE,VAR_1 , TILE_SMOOTH , "N-----EE" },
+ {"smooth featstone wall RU2",WALL,FEATSTONE,VAR_1 , TILE_SMOOTH , "NN----E-" },
+ {"smooth featstone wall L2U",WALL,FEATSTONE,VAR_1 , TILE_SMOOTH , "N---WW--" },
+ {"smooth featstone wall LU2",WALL,FEATSTONE,VAR_1 , TILE_SMOOTH , "NN--W---" },
+ {"smooth featstone wall L2D",WALL,FEATSTONE,VAR_1 , TILE_SMOOTH , "--S-WW--" },
+ {"smooth featstone wall LD2",WALL,FEATSTONE,VAR_1 , TILE_SMOOTH , "--SSW---" },
+ {"smooth featstone wall LRUD",WALL,FEATSTONE,VAR_1 , TILE_SMOOTH ,"N-S-W-E-" },
+ {"smooth featstone wall RUD",WALL,FEATSTONE,VAR_1 , TILE_SMOOTH , "N-S---E-" },
+ {"smooth featstone wall LRD",WALL,FEATSTONE,VAR_1 , TILE_SMOOTH , "--S-W-E-" },
+ {"smooth featstone wall LRU",WALL,FEATSTONE,VAR_1 , TILE_SMOOTH , "N---W-E-" },
+
+ //300
+ {"smooth featstone wall LUD",WALL,FEATSTONE,VAR_1, TILE_SMOOTH , "N-S-W---" },
+ {"smooth featstone wall RD",WALL,FEATSTONE,VAR_1 , TILE_SMOOTH , "--S---E-" },
+ {"smooth featstone wall RU",WALL,FEATSTONE,VAR_1 , TILE_SMOOTH , "N-----E-" },
+ {"smooth featstone wall LU",WALL,FEATSTONE,VAR_1 , TILE_SMOOTH , "N---W---" },
+ {"smooth featstone wall LD",WALL,FEATSTONE,VAR_1 , TILE_SMOOTH , "--S-W---" },
+ {"smooth featstone wall UD",WALL,FEATSTONE,VAR_1 , TILE_SMOOTH , "N-S-----" },
+ {"smooth featstone wall LR",WALL,FEATSTONE,VAR_1 , TILE_SMOOTH , "----W-E-" },
+ {"smooth stone wall RD2",WALL,STONE,VAR_1 , TILE_SMOOTH , "--SS--E-" },
+ {"smooth stone wall R2D",WALL,STONE,VAR_1 , TILE_SMOOTH , "--S---EE" },
+ {"smooth stone wall R2U",WALL,STONE,VAR_1 , TILE_SMOOTH , "N-----EE" },
+
+ //310
+ {"smooth stone wall RU2",WALL,STONE,VAR_1 , TILE_SMOOTH , "NN----E-" },
+ {"smooth stone wall L2U",WALL,STONE,VAR_1 , TILE_SMOOTH , "N---WW--" },
+ {"smooth stone wall LU2",WALL,STONE,VAR_1 , TILE_SMOOTH , "NN--W---" },
+ {"smooth stone wall L2D",WALL,STONE,VAR_1 , TILE_SMOOTH , "--S-WW--" },
+ {"smooth stone wall LD2",WALL,STONE,VAR_1 , TILE_SMOOTH , "--SSW---" },
+ {"smooth stone wall LRUD",WALL,STONE,VAR_1 , TILE_SMOOTH , "N-S-W-E-" },
+ {"smooth stone wall RUD",WALL,STONE,VAR_1 , TILE_SMOOTH , "N-S---E-" },
+ {"smooth stone wall LRD",WALL,STONE,VAR_1 , TILE_SMOOTH , "--S-W-E-" },
+ {"smooth stone wall LRU",WALL,STONE,VAR_1 , TILE_SMOOTH , "N---W-E-" },
+ {"smooth stone wall LUD",WALL,STONE,VAR_1 , TILE_SMOOTH , "N-S-W---" },
+
+ //320
+ {"smooth stone wall RD",WALL,STONE,VAR_1 , TILE_SMOOTH , "--S---E-" },
+ {"smooth stone wall RU",WALL,STONE,VAR_1 , TILE_SMOOTH , "N-----E-" },
+ {"smooth stone wall LU",WALL,STONE,VAR_1 , TILE_SMOOTH , "N---W---" },
+ {"smooth stone wall LD",WALL,STONE,VAR_1 , TILE_SMOOTH , "--S-W---" },
+ {"smooth stone wall UD",WALL,STONE,VAR_1 , TILE_SMOOTH , "N-S-----" },
+ {"smooth stone wall LR",WALL,STONE,VAR_1 , TILE_SMOOTH , "----W-E-" },
+ {"obsidian fortification",FORTIFICATION,OBSIDIAN,VAR_1},
+ {"featstone? fortification",FORTIFICATION,FEATSTONE,VAR_1},
+ {"cracked obsidian wall",WALL,OBSIDIAN,VAR_1, TILE_CRACKED },
+ {"damaged obsidian wall",WALL,OBSIDIAN,VAR_1, TILE_DAMAGED },
+
+ // 330
+ {"worn obsidian wall",WALL,OBSIDIAN,VAR_1},
+ {"obsidian wall",WALL,OBSIDIAN,VAR_1},
+ /*MAPTILE_FEATSTONE_WALL_WORN1,
+ MAPTILE_FEATSTONE_WALL_WORN2,
+ MAPTILE_FEATSTONE_WALL_WORN3,
+ MAPTILE_FEATSTONE_WALL,*/
+ {"cracked featstone wall",WALL,STONE,VAR_1, TILE_CRACKED },
+ {"damaged featstone wall",WALL,STONE,VAR_1, TILE_DAMAGED },
+ {"worn featstone wall",WALL,STONE,VAR_1, TILE_WORN },
+ {"featstone wall",WALL,STONE,VAR_1},
+ {"stone floor",FLOOR,STONE,VAR_1},
+ {"stone floor",FLOOR,STONE,VAR_2},
+ {"stone floor",FLOOR,STONE,VAR_3},
+ {"stone floor",FLOOR,STONE,VAR_4},
+
+ // 340
+ {"obsidian floor",FLOOR,OBSIDIAN,VAR_1},
+ {"obsidian floor",FLOOR,OBSIDIAN,VAR_2},
+ {"obsidian floor",FLOOR,OBSIDIAN,VAR_3},
+ {"obsidian floor",FLOOR,OBSIDIAN,VAR_4},
+ {"featstone floor 1",FLOOR,FEATSTONE,VAR_1},
+ {"featstone floor 2",FLOOR,FEATSTONE,VAR_2},
+ {"featstone floor 3",FLOOR,FEATSTONE,VAR_3},
+ {"featstone floor 4",FLOOR,FEATSTONE,VAR_4},
+ {"grass 1",FLOOR,GRASS,VAR_1},
+ {"grass 2",FLOOR,GRASS,VAR_2},
+
+ // 350
+ {"grass 3",FLOOR,GRASS,VAR_3},
+ {"grass 4",FLOOR,GRASS,VAR_4},
+ {"soil floor",FLOOR,SOIL,VAR_1},
+ {"soil floor",FLOOR,SOIL,VAR_2},
+ {"soil floor",FLOOR,SOIL,VAR_3},
+ {"soil floor",FLOOR,SOIL,VAR_4},
+ {"wet soil floor",FLOOR,SOIL,VAR_1},
+ {"wet soil floor",FLOOR,SOIL,VAR_2},
+ {"wet soil floor",FLOOR,SOIL,VAR_3},
+ {"wet soil floor",FLOOR,SOIL,VAR_4},
+
+ // 360
+ {"ice fortification",FORTIFICATION,ICE,VAR_1},
+ {"cracked ice wall",WALL,ICE,VAR_1, TILE_CRACKED},
+ {"damaged ice wall",WALL,ICE,VAR_1, TILE_DAMAGED},
+ {"worn ice wall",WALL,ICE,VAR_1, TILE_WORN },
+ {"ice wall",WALL,ICE,VAR_1},
+ {"river N",FLOOR,SOIL,VAR_1, TILE_RIVER , "N" },
+ {"river S",FLOOR,SOIL,VAR_1, TILE_RIVER , "S" },
+ {"river E",FLOOR,SOIL,VAR_1, TILE_RIVER , "E" },
+ {"river W",FLOOR,SOIL,VAR_1, TILE_RIVER , "W" },
+ {"river NW",FLOOR,SOIL,VAR_1, TILE_RIVER, "NW"},
+
+ //370
+ {"river NE",FLOOR,SOIL,VAR_1, TILE_RIVER , "NE" },
+ {"river SW",FLOOR,SOIL,VAR_1, TILE_RIVER , "SW" },
+ {"river SE",FLOOR,SOIL,VAR_1, TILE_RIVER , "SE" },
+ {"stream bed N",FLOOR,SOIL,VAR_1, TILE_STREAM , "N" },
+ {"stream bed S",FLOOR,SOIL,VAR_1, TILE_STREAM , "S" },
+ {"stream bed E",FLOOR,SOIL,VAR_1, TILE_STREAM , "E" },
+ {"stream bed W",FLOOR,SOIL,VAR_1, TILE_STREAM , "W" },
+ {"stream bed NW",FLOOR,SOIL,VAR_1, TILE_STREAM, "NW" },
+ {"stream bed NE",FLOOR,SOIL,VAR_1, TILE_STREAM, "NE" },
+ {"stream bed SW",FLOOR,SOIL,VAR_1, TILE_STREAM, "SW" },
+
+ // 380
+ {"stream bed SE",FLOOR,SOIL,VAR_1, TILE_STREAM, "SE" },
+ {"stream top",FLOOR,SOIL,VAR_1, TILE_STREAM_TOP },
+ {0 ,EMPTY, AIR, VAR_1},
+ {0 ,EMPTY, AIR, VAR_1},
+ {0 ,EMPTY, AIR, VAR_1},
+ {0 ,EMPTY, AIR, VAR_1},
+ {0 ,EMPTY, AIR, VAR_1},
+ {"dry grass 1",FLOOR,GRASS_DRY,VAR_1},
+ {"dry grass 2",FLOOR,GRASS_DRY,VAR_2},
+ {"dry grass 3",FLOOR,GRASS_DRY,VAR_3},
+
+ // 390
+ {"dry grass 4",FLOOR,GRASS_DRY,VAR_4},
+ {"dead tree",TREE_DEAD,SOIL,VAR_1},
+ {"dead sapling",SAPLING_DEAD,SOIL,VAR_1},
+ {"dead shrub",SHRUB_DEAD,SOIL,VAR_1},
+ {"dead grass 1",FLOOR,GRASS_DEAD,VAR_1},
+ {"dead grass 2",FLOOR,GRASS_DEAD,VAR_2},
+ {"dead grass 3",FLOOR,GRASS_DEAD,VAR_3},
+ {"dead grass 4",FLOOR,GRASS_DEAD,VAR_4},
+ {"grass B1",FLOOR,GRASS2,VAR_1},
+ {"grass B2",FLOOR,GRASS2,VAR_2},
+
+ // 400
+ {"grass B3",FLOOR,GRASS2,VAR_3},
+ {"grass B4",FLOOR,GRASS2,VAR_4},
+ {"boulder",BOULDER,STONE,VAR_1},
+ {"obsidian boulder",BOULDER,OBSIDIAN,VAR_1},
+ {"featstone? boulder",BOULDER,FEATSTONE,VAR_1},
+ {"pebbles 1",PEBBLES,STONE,VAR_1},
+ {"pebbles 2",PEBBLES,STONE,VAR_2},
+ {"pebbles 3",PEBBLES,STONE,VAR_3},
+ {"pebbles 4",PEBBLES,STONE,VAR_4},
+ {"obsidian shards",PEBBLES,OBSIDIAN,VAR_1},
+
+ // 410
+ {"obsidian shards",PEBBLES,OBSIDIAN,VAR_2},
+ {"obsidian shards",PEBBLES,OBSIDIAN,VAR_3},
+ {"obsidian shards",PEBBLES,OBSIDIAN,VAR_4},
+ {"featstone? pebbles",PEBBLES,FEATSTONE,VAR_1},
+ {"featstone? pebbles",PEBBLES,FEATSTONE,VAR_2},
+ {"featstone? pebbles",PEBBLES,FEATSTONE,VAR_3},
+ {"featstone? pebbles",PEBBLES,FEATSTONE,VAR_4},
+ {"smooth vein wall",WALL,VEIN,VAR_1 , TILE_SMOOTH , "--SS--E-"},
+ {"smooth vein wall",WALL,VEIN,VAR_1 , TILE_SMOOTH , "--S---EE"},
+ {"smooth vein wall",WALL,VEIN,VAR_1 , TILE_SMOOTH , "N-----EE" },
+
+ // 420
+ {"smooth vein wall",WALL,VEIN,VAR_1 , TILE_SMOOTH , "NN----E-"},
+ {"smooth vein wall",WALL,VEIN,VAR_1 , TILE_SMOOTH , "N---WW--"},
+ {"smooth vein wall",WALL,VEIN,VAR_1 , TILE_SMOOTH , "NN--W---"},
+ {"smooth vein wall",WALL,VEIN,VAR_1 , TILE_SMOOTH , "--S-WW--" },
+ {"smooth vein wall",WALL,VEIN,VAR_1 , TILE_SMOOTH , "--SSW---"},
+ {"smooth vein wall",WALL,VEIN,VAR_1 , TILE_SMOOTH , "N-S-W-E-"},
+ {"smooth vein wall",WALL,VEIN,VAR_1 , TILE_SMOOTH , "N-S---E-"},
+ {"smooth vein wall",WALL,VEIN,VAR_1 , TILE_SMOOTH , "--S-W-E-"},
+ {"smooth vein wall",WALL,VEIN,VAR_1 , TILE_SMOOTH , "N---W-E-"},
+ {"smooth vein wall",WALL,VEIN,VAR_1 , TILE_SMOOTH , "N-S-W---"},
+
+ // 430
+ {"smooth vein wall",WALL,VEIN,VAR_1 , TILE_SMOOTH , "--S---E-"},
+ {"smooth vein wall",WALL,VEIN,VAR_1 , TILE_SMOOTH , "N-----E-"},
+ {"smooth vein wall",WALL,VEIN,VAR_1 , TILE_SMOOTH , "N---W---"},
+ {"smooth vein wall",WALL,VEIN,VAR_1 , TILE_SMOOTH , "--S-W---"},
+ {"smooth vein wall",WALL,VEIN,VAR_1 , TILE_SMOOTH , "N-S-----"},
+ {"smooth vein wall",WALL,VEIN,VAR_1 , TILE_SMOOTH , "----W-E-"},
+ {"vein fortification",FORTIFICATION,VEIN,VAR_1},
+ {"cracked vein wall",WALL,VEIN,VAR_1, TILE_CRACKED },
+ {"damaged vein wall",WALL,VEIN,VAR_1, TILE_DAMAGED },
+ {"worn vein wall",WALL,VEIN,VAR_1 , TILE_WORN },
+
+ // 440
+ {"vein wall",WALL,VEIN,VAR_1},
+ {"vein floor",FLOOR,VEIN,VAR_1},
+ {"vein floor",FLOOR,VEIN,VAR_2},
+ {"vein floor",FLOOR,VEIN,VAR_3},
+ {"vein floor",FLOOR,VEIN,VAR_4},
+ {"vein boulder",BOULDER,VEIN,VAR_1},
+ {"vein pebbles",PEBBLES,VEIN,VAR_1},
+ {"vein pebbles",PEBBLES,VEIN,VAR_2},
+ {"vein pebbles",PEBBLES,VEIN,VAR_3},
+ {"vein pebbles",PEBBLES,VEIN,VAR_4},
+
+ // 450
+ {"smooth ice wall",WALL,ICE,VAR_1 , TILE_SMOOTH , "--SS--E-"},
+ {"smooth ice wall",WALL,ICE,VAR_1 , TILE_SMOOTH , "--S---EE" },
+ {"smooth ice wall",WALL,ICE,VAR_1 , TILE_SMOOTH , "N-----EE" },
+ {"smooth ice wall",WALL,ICE,VAR_1 , TILE_SMOOTH , "NN----E-"},
+ {"smooth ice wall",WALL,ICE,VAR_1 , TILE_SMOOTH , "N---WW--" },
+ {"smooth ice wall",WALL,ICE,VAR_1 , TILE_SMOOTH , "NN--W---" },
+ {"smooth ice wall",WALL,ICE,VAR_1 , TILE_SMOOTH , "--S-WW--" },
+ {"smooth ice wall",WALL,ICE,VAR_1 , TILE_SMOOTH , "--SSW---" },
+ {"smooth ice wall",WALL,ICE,VAR_1 , TILE_SMOOTH , "N-S-W-E-"},
+ {"smooth ice wall",WALL,ICE,VAR_1 , TILE_SMOOTH , "N-S---E-" },
+
+ // 460
+ {"smooth ice wall",WALL,ICE,VAR_1 , TILE_SMOOTH , "--S-W-E-" },
+ {"smooth ice wall",WALL,ICE,VAR_1 , TILE_SMOOTH , "N---W-E-" },
+ {"smooth ice wall",WALL,ICE,VAR_1 , TILE_SMOOTH , "N-S-W---"},
+ {"smooth ice wall",WALL,ICE,VAR_1 , TILE_SMOOTH , "--S---E-"},
+ {"smooth ice wall",WALL,ICE,VAR_1 , TILE_SMOOTH , "N-----E-" },
+ {"smooth ice wall",WALL,ICE,VAR_1 , TILE_SMOOTH , "N---W---" },
+ {"smooth ice wall",WALL,ICE,VAR_1 , TILE_SMOOTH , "--S-W---" },
+ {"smooth ice wall",WALL,ICE,VAR_1 , TILE_SMOOTH , "N-S-----" },
+ {"smooth ice wall",WALL,ICE,VAR_1 , TILE_SMOOTH , "----W-E-"},
+ {0 ,EMPTY, AIR, VAR_1},
+
+ // 470
+ {0 ,EMPTY, AIR, VAR_1},
+ {0 ,EMPTY, AIR, VAR_1},
+ {0 ,EMPTY, AIR, VAR_1},
+ {0 ,EMPTY, AIR, VAR_1},
+ {0 ,EMPTY, AIR, VAR_1},
+ {0 ,EMPTY, AIR, VAR_1},
+ {0 ,EMPTY, AIR, VAR_1},
+ {0 ,EMPTY, AIR, VAR_1},
+ {0 ,EMPTY, AIR, VAR_1},
+ {0 ,EMPTY, AIR, VAR_1},
+
+ // 480
+ {0 ,EMPTY, AIR, VAR_1},
+ {0 ,EMPTY, AIR, VAR_1},
+ {0 ,EMPTY, AIR, VAR_1},
+ {0 ,EMPTY, AIR, VAR_1},
+ {0 ,EMPTY, AIR, VAR_1},
+ {0 ,EMPTY, AIR, VAR_1},
+ {0 ,EMPTY, AIR, VAR_1},
+ {0 ,EMPTY, AIR, VAR_1},
+ {0 ,EMPTY, AIR, VAR_1},
+ {0 ,EMPTY, AIR, VAR_1},
+
+ // 490
+ {0 ,EMPTY, AIR, VAR_1},
+ {0 ,EMPTY, AIR, VAR_1},
+ {0 ,EMPTY, AIR, VAR_1},
+ {"constructed floor",FLOOR,CONSTRUCTED, VAR_1},
+ {"constructed fortification",FORTIFICATION,CONSTRUCTED, VAR_1},
+ {"constructed pillar",PILLAR,CONSTRUCTED, VAR_1},
+ {"constructed wall",WALL,CONSTRUCTED, VAR_1 ,TILE_NORMAL, "--SS--E-" },
+ {"constructed wall",WALL,CONSTRUCTED, VAR_1 ,TILE_NORMAL, "--S---EE" },
+ {"constructed wall",WALL,CONSTRUCTED, VAR_1 ,TILE_NORMAL, "N-----EE" },
+ {"constructed wall",WALL,CONSTRUCTED, VAR_1 ,TILE_NORMAL, "NN----E-" },
+
+ // 500
+ {"constructed wall",WALL,CONSTRUCTED, VAR_1 ,TILE_NORMAL, "N---WW--" },
+ {"constructed wall",WALL,CONSTRUCTED, VAR_1 ,TILE_NORMAL, "NN--W---" },
+ {"constructed wall",WALL,CONSTRUCTED, VAR_1 ,TILE_NORMAL, "--S-WW--" },
+ {"constructed wall",WALL,CONSTRUCTED, VAR_1 ,TILE_NORMAL, "--SSW---" },
+ {"constructed wall",WALL,CONSTRUCTED, VAR_1 ,TILE_NORMAL, "N-S-W-E-" },
+ {"constructed wall",WALL,CONSTRUCTED, VAR_1 ,TILE_NORMAL, "N-S---E-" },
+ {"constructed wall",WALL,CONSTRUCTED, VAR_1 ,TILE_NORMAL, "--S-W-E-" },
+ {"constructed wall",WALL,CONSTRUCTED, VAR_1 ,TILE_NORMAL, "N---W-E-" },
+ {"constructed wall",WALL,CONSTRUCTED, VAR_1 ,TILE_NORMAL, "N-S-W---" },
+ {"constructed wall",WALL,CONSTRUCTED, VAR_1 ,TILE_NORMAL, "--S---E-" },
+
+ // 510
+ {"constructed wall",WALL,CONSTRUCTED, VAR_1 ,TILE_NORMAL, "N-----E-" },
+ {"constructed wall",WALL,CONSTRUCTED, VAR_1 ,TILE_NORMAL, "N---W---" },
+ {"constructed wall",WALL,CONSTRUCTED, VAR_1 ,TILE_NORMAL, "--S-W---" },
+ {"constructed wall",WALL,CONSTRUCTED, VAR_1 ,TILE_NORMAL, "N-S-----" },
+ {"constructed wall",WALL,CONSTRUCTED, VAR_1 ,TILE_NORMAL, "----W-E-" },
+ {"constructed stair up/down",STAIR_UPDOWN,CONSTRUCTED, VAR_1},
+ {"constructed stair down",STAIR_DOWN,CONSTRUCTED, VAR_1},
+ {"constructed stair up",STAIR_UP,CONSTRUCTED, VAR_1},
+ {"constructed ramp",RAMP,CONSTRUCTED, VAR_1},
+ {0 ,EMPTY, AIR, VAR_1} // end
+ };
+
+ inline
+ bool isWallTerrain(int in)
+ {
+ return tileTypeTable[in].c >= WALL && tileTypeTable[in].c <= FORTIFICATION ;
+ }
+
+ inline
+ bool isFloorTerrain(int in)
+ {
+ return tileTypeTable[in].c >= FLOOR && tileTypeTable[in].c <= PEBBLES;
+ }
+
+ inline
+ bool isRampTerrain(int in)
+ {
+ return tileTypeTable[in].c == RAMP;
+ }
+
+ inline
+ bool isStairTerrain(int in)
+ {
+ return tileTypeTable[in].c >= STAIR_UP && tileTypeTable[in].c <= STAIR_UPDOWN;
+ }
+
+ inline
+ bool isOpenTerrain(int in)
+ {
+ return tileTypeTable[in].c == EMPTY;
+ }
+
+ inline
+ int getVegetationType(int in)
+ {
+ return tileTypeTable[in].c;
+ }
+
+ //zilpin: for convenience, when you'll be using the tile information a lot.
+ inline const
+ TileRow * getTileTypeP(int in)
+ {
+ if( in<0 || in>=TILE_TYPE_ARRAY_LENGTH ) return NULL;
+ return ( const TileRow * ) &tileTypeTable[in];
+ }
+
+ //zilpin: Find the first tile entry which matches the given search criteria.
+ //All parameters are optional.
+ //To omit, use the 'invalid' enum for that type (e.g. tileclass_invalid, tilematerial_invalid, etc)
+ //For tile directions, pass NULL to omit.
+ //Returns matching index in tileTypeTable, or -1 if none found.
+ inline
+ int32_t findTileType( const TileClass tclass, const TileMaterial tmat, const TileVariant tvar, const TileSpecial tspecial, const TileDirection tdir )
+ {
+ int32_t tt;
+ for(tt=0;tt<TILE_TYPE_ARRAY_LENGTH; ++tt){
+ if( tclass>-1 ) if( tclass != tileTypeTable[tt].c ) continue;
+ if( tmat>-1 ) if( tmat != tileTypeTable[tt].m ) continue;
+ if( tvar>-1 ) if( tvar != tileTypeTable[tt].v ) continue;
+ if( tspecial>-1 ) if( tspecial != tileTypeTable[tt].s ) continue;
+ if( tdir.whole ) if( tdir.whole != tileTypeTable[tt].d.whole ) continue;
+ //Match!
+ return tt;
+ }
+ return -1;
+ }
+ //Convenience version of the above, to pass strings as the direction
+ inline
+ int32_t findTileType( const TileClass tclass, const TileMaterial tmat, const TileVariant tvar, const TileSpecial tspecial, const char *tdirStr )
+ {
+ if(tdirStr){
+ TileDirection tdir(tdirStr);
+ return findTileType(tclass,tmat,tvar,tspecial, tdir );
+ }else{
+ return findTileType(tclass,tmat,tvar,tspecial, NULL );
+ }
+ }
+
+
+ //zilpin: Find a tile type similar to the one given, but with a different class.
+ //Useful for tile-editing operations.
+ //If no match found, returns the sourceType
+ //Definitely needs improvement for wall directions, etc.
+ inline
+ int32_t findSimilarTileType( const int32_t sourceTileType, const TileClass tclass ){
+ int32_t tt, maybe=0, match=0;
+ int value=0, matchv=0;
+ const TileRow *source = &tileTypeTable[sourceTileType];
+ const char * sourcename = source->name;
+ const uint32_t sourcenameint = *((const uint32_t *)sourcename);
+
+#ifdef assert
+ assert( sourceTileType >=0 && sourceTileType < TILE_TYPE_ARRAY_LENGTH );
+#endif
+
+ for(tt=0;tt<TILE_TYPE_ARRAY_LENGTH; ++tt){
+ if( tclass == tileTypeTable[tt].c ){
+ //shortcut null entries
+ if(!tileTypeTable[tt].name) continue;
+ //Special flag match is absolutely mandatory!
+ if( source->s != tileTypeTable[tt].s ) continue;
+
+ maybe=tt; value=0;
+ //Material is high-value match
+ if( tileTypeTable[tt].m == source->m ) value|=8;
+ //Direction is medium value match
+ if( tileTypeTable[tt].d.whole == source->d.whole ) value|=4;
+ //Variant is low-value match
+ if( tileTypeTable[tt].v == source->v ) value|=1;
+
+ //Check value against last match
+ if( value>matchv ){
+ match=tt;
+ matchv=value;
+ }
+ }
+ }
+ if( match ) return match;
+ return sourceTileType;
+ }
+
+
+}
+
+
+
+#endif // TILETYPES_H_INCLUDED
diff --git a/tools/playground/CMakeLists.txt b/tools/playground/CMakeLists.txt index f21d9170..29184566 100644 --- a/tools/playground/CMakeLists.txt +++ b/tools/playground/CMakeLists.txt @@ -67,6 +67,31 @@ TARGET_LINK_LIBRARIES(dfcopypaste dfhack) ADD_EXECUTABLE(dfpaths paths.cpp) TARGET_LINK_LIBRARIES(dfpaths dfhack) +# deramp +# Author: zilpin +# seeks entire map for 'remove ramp' designation, makes a floor, removes designation. +# intended use is to simulate old 'channel' functionality. +ADD_EXECUTABLE(dfderamp deramp.cpp) +TARGET_LINK_LIBRARIES(dfderamp dfhack) + + +# printtiletypes +# Author: zilpin +# Prints CSV dump of all tile type information. +# No DF process needed. Intended only for debugging and information purposes. +ADD_EXECUTABLE(dfprinttiletypes printtiletypes.cpp) +TARGET_LINK_LIBRARIES(dfprinttiletypes dfhack) + +# hellhole +# Author: zilpin +# Creates a bottomless hole to hell. +# Experimental version hard-codes values. +# Will have many options in the future. +ADD_EXECUTABLE(dfhellhole hellhole.cpp) +TARGET_LINK_LIBRARIES(dfhellhole dfhack) + + + # this needs the C bindings IF(BUILD_DFHACK_C_BINDINGS) # for trying out some 'stuff' @@ -83,6 +108,9 @@ dfmoodump dfdigger dfdigger2 dfcatsplosion +dfderamp +dfprinttiletypes +dfhellhole RUNTIME DESTINATION bin ) IF(UNIX) diff --git a/tools/playground/deramp.cpp b/tools/playground/deramp.cpp new file mode 100644 index 00000000..3cfbf517 --- /dev/null +++ b/tools/playground/deramp.cpp @@ -0,0 +1,128 @@ +// De-ramp. All ramps marked for removal are replaced with given tile (presently, normal floor). + +#include <iostream> +#include <vector> +#include <map> +#include <stddef.h> +#include <assert.h> +using namespace std; + +#include <DFHack.h> +#include <dfhack/DFTileTypes.h> + + +int main (void) +{ + uint32_t x_max,y_max,z_max; + uint32_t num_blocks = 0; + uint32_t bytes_read = 0; + DFHack::designations40d designations; + DFHack::tiletypes40d tiles; + DFHack::tiletypes40d tilesAbove; + + //DFHack::TileRow *ptile; + int32_t oldT, newT; + int16_t t; + + int dirty=0, count=0; + + DFHack::ContextManager DFMgr("Memory.xml"); + DFHack::Context *DF = DFMgr.getSingleContext(); + + //sanity check + assert( sizeof(designations) == (16*16*sizeof(DFHack::t_designation)) ); + + //Init + try + { + DF->Attach(); + } + catch (exception& e) + { + cerr << e.what() << endl; + #ifndef LINUX_BUILD + cin.ignore(); + #endif + return 1; + } + DFHack::Maps *Mapz = DF->getMaps(); + + // init the map + if(!Mapz->Start()) + { + cerr << "Can't init map." << endl; + #ifndef LINUX_BUILD + cin.ignore(); + #endif + return 1; + } + + Mapz->getSize(x_max,y_max,z_max); + + uint8_t zeroes [16][16] = {0}; + + // walk the map + for(uint32_t x = 0; x< x_max;x++) + { + for(uint32_t y = 0; y< y_max;y++) + { + for(uint32_t z = 0; z< z_max;z++) + { + if(Mapz->isValidBlock(x,y,z)) + { + dirty=0; + Mapz->ReadDesignations(x,y,z, &designations); + Mapz->ReadTileTypes(x,y,z, &tiles); + if(Mapz->isValidBlock(x,y,z+1)){ + Mapz->ReadTileTypes(x,y,z+1, &tilesAbove); + }else{ + memset(&tilesAbove,0,sizeof(tilesAbove)); + } + + for(uint32_t ty=0;ty<16;++ty){ + for(uint32_t tx=0;tx<16;++tx){ + //Only the remove ramp designation (ignore channel designation, etc) + oldT = tiles[tx][ty]; + if( DFHack::designation_default == designations[tx][ty].bits.dig + && DFHack::RAMP==DFHack::tileTypeTable[oldT].c + ){ + //Current tile is a ramp. + //Set current tile, as accurately as can be expected + newT = DFHack::findSimilarTileType(oldT,DFHack::FLOOR); + + //If no change, skip it (couldn't find a good tile type) + if( oldT == newT) continue; + //Set new tile type, clear designation + tiles[tx][ty] = newT; + designations[tx][ty].bits.dig = DFHack::designation_no; + + //Check the tile above this one, in case a downward slope needs to be removed. + if( DFHack::RAMP_TOP == DFHack::tileTypeTable[tilesAbove[tx][ty]].c ){ + tilesAbove[tx][ty] = 32; + } + + dirty=-1; + ++count; + } + } + } + //If anything was changed, write it all. + if(dirty){ + Mapz->WriteDesignations(x,y,z, &designations); + Mapz->WriteTileTypes(x,y,z, &tiles); + if(Mapz->isValidBlock(x,y,z+1)){ + Mapz->WriteTileTypes(x,y,z+1, &tilesAbove); + } + } + } + } + } + } + DF->Detach(); + cout << "Found and changed " << count << " tiles." << endl; + #ifndef LINUX_BUILD + cout << "Done. Press any key to continue" << endl; + cin.ignore(); + #endif + return 0; +} diff --git a/tools/playground/hellhole.cpp b/tools/playground/hellhole.cpp new file mode 100644 index 00000000..06d1847d --- /dev/null +++ b/tools/playground/hellhole.cpp @@ -0,0 +1,426 @@ +// Burn a hole straight to hell!
+
+#include <stdlib.h>
+#include <time.h>
+
+#include <iostream>
+#include <vector>
+#include <map>
+#include <stddef.h>
+#include <assert.h>
+#include <math.h>
+#include <stdlib.h>
+using namespace std;
+
+#include <DFHack.h>
+#include <dfhack/DFTileTypes.h>
+#include <dfhack/modules/Gui.h>
+using namespace DFHack;
+
+
+#ifdef LINUX_BUILD
+#include <unistd.h>
+void waitmsec (int delay)
+{
+ usleep(delay);
+}
+#else
+#include <windows.h>
+void waitmsec (int delay)
+{
+ Sleep(delay);
+}
+#endif
+
+
+
+int main (void)
+{
+ srand ( time(NULL) );
+
+ int64_t n;
+ uint32_t x_max,y_max,z_max;
+
+ //The Tile Type to use for the walls lining the hole
+ //263 is semi-molten rock, 331 is obsidian
+ uint32_t whell=263, wmolten=263, wmagma=331, wcave=331;
+ //The Tile Type to use for the hole's floor at bottom of the map
+ //35 is chasm, 42 is eerie pit , 340 is obsidian floor
+ uint32_t floor=35, cap=340;
+ //Should tiles be revealed?
+ int reveal=0;
+
+
+ //Pattern to dig
+ unsigned char pattern[16][16] = {0,};
+
+ {
+ //Calculate a randomized circle.
+ //These values found through experimentation.
+ int radius=6;
+ int x=0, y=0;
+
+ for(y=-radius; y<=radius; ++y){
+ for(x=-radius; x<=radius; ++x){
+ if(x*x+y*y <= radius*radius + (rand()&31) ){
+ pattern[7+x][7+y]=1;
+ }
+ }
+ }
+ //Post-process to figure out where to put walls.
+ for(y=0;y<16;++y){
+ for(x=0;x<16;++x){
+ if( 1==pattern[x][y] ){
+ //No hole at edges.
+ if( x<1 || x>14 || y<1 || y>14 ){
+ pattern[x][y]=2;
+ }
+ }else if( 0==pattern[x][y] ){
+ //check neighbors
+ if( x>0 && y>0 && 1==pattern[x-1][y-1] ){ pattern[x][y]=2; continue; }
+ if( x>0 && 1==pattern[x-1][y ] ){ pattern[x][y]=2; continue; }
+ if( y>0 && 1==pattern[x ][y-1] ){ pattern[x][y]=2; continue; }
+ if( x<15 && 1==pattern[x+1][y ] ){ pattern[x][y]=2; continue; }
+ if( x<15&& y>0 && 1==pattern[x+1][y-1] ){ pattern[x][y]=2; continue; }
+ if( x<15&& y<15&& 1==pattern[x+1][y+1] ){ pattern[x][y]=2; continue; }
+ if( y<15&& 1==pattern[x ][y+1] ){ pattern[x][y]=2; continue; }
+ if( x>0 && y<15&& 1==pattern[x-1][y+1] ){ pattern[x][y]=2; continue; }
+ }
+ }
+ }
+ //Final pass, makes sure that somewhere random gets a vertical pillar of rock which is safe
+ //to dig stairs down, to permit access to anywhere within the pit from the top.
+ for(x=0, y=0; 1!=pattern[x][y]; x=rand()&15, y=rand()&15 ){}
+ pattern[x][y]=3;
+
+#if 0
+ cout << endl;
+ //Print the pattern (debugging)
+ for(y=0;y<16;++y){
+ for(x=0;x<16;++x){
+ printf("%d",pattern[x][y]);
+ }
+ cout << endl;
+ }
+ cout << endl;
+ cin.ignore();
+ return 0;
+#endif
+
+ }
+
+
+
+ DFHack::ContextManager DFMgr("Memory.xml");
+ DFHack::Context *DF = DFMgr.getSingleContext();
+
+
+ //Message of intent
+ cout <<
+ "DF Hell Hole" << endl <<
+ "This program will instantly dig a hole through hell, wherever your cursor is." << endl <<
+ "This can not be undone! End program now if you don't want hellish fun." << endl
+ ;
+ cin.ignore();
+
+ //Init
+ try
+ {
+ DF->Attach();
+ }
+ catch (exception& e)
+ {
+ cerr << e.what() << endl;
+ #ifndef LINUX_BUILD
+ cin.ignore();
+ #endif
+ return 1;
+ }
+
+ // init the map
+ DFHack::Maps *Mapz = DF->getMaps();
+ if(!Mapz->Start())
+ {
+ cerr << "Can't init map. Exiting." << endl;
+ #ifndef LINUX_BUILD
+ cin.ignore();
+ #endif
+ return 1;
+ }
+
+ Mapz->getSize(x_max,y_max,z_max);
+
+
+ //Get cursor
+ int32_t cursorX, cursorY, cursorZ;
+ DFHack::Position *Pos = DF->getPosition();
+ Pos->getCursorCoords(cursorX,cursorY,cursorZ);
+ if(-30000==cursorX){
+ cout << "No cursor position found. Exiting." << endl;
+ #ifndef LINUX_BUILD
+ cin.ignore();
+ #endif
+ return 1;
+ }
+
+ //Block coordinates
+ int32_t bx=cursorX/16, by=cursorY/16, bz=cursorZ;
+ //Tile coordinates within block
+ int32_t tx=cursorX%16, ty=cursorY%16, tz=cursorZ;
+
+
+ /*
+ //Access the DF interface to pause the game.
+ //Copied from the reveal tool.
+ DFHack::Gui *Gui =DF->getGui();
+ cout << "Pausing..." << endl;
+ Gui->SetPauseState(true);
+ DF->Resume();
+ waitmsec(1000);
+ DF->Suspend();
+ */
+
+
+ //Verify that every z-level at this location exists.
+ for(uint32_t z = 0; z<= bz ;z++){
+ if( ! Mapz->isValidBlock(bx,by,z) ){
+ cout << "This block does't exist yet!" << endl << "Designate the lowest level for digging to make DF allocate the block, then try again." << endl;
+ #ifndef LINUX_BUILD
+ cin.ignore();
+ #endif
+ return 1;
+ }
+ }
+
+ //Get all the map features.
+ vector<DFHack::t_feature> global_features;
+ if(!Mapz->ReadGlobalFeatures(global_features)){
+ cout << "Couldn't load global features! Probably a version problem." << endl;
+ #ifndef LINUX_BUILD
+ cin.ignore();
+ #endif
+ return 1;
+ }
+ std::map <DFHack::planecoord, std::vector<DFHack::t_feature *> > local_features;
+ if(!Mapz->ReadLocalFeatures(local_features)){
+ cout << "Couldn't load local features! Probably a version problem." << endl;
+ #ifndef LINUX_BUILD
+ cin.ignore();
+ #endif
+ return 1;
+ }
+
+ //Get info on current tile, to determine how to generate the pit
+ mapblock40d topblock;
+ Mapz->ReadBlock40d( bx, by, bz , &topblock );
+ //Related block info
+ planecoord pc;
+ pc.dim.x=bx; pc.dim.y=by;
+ mapblock40d block;
+ const TileRow * tp;
+ t_designation * d;
+
+ //From top to bottom, dig this dude.
+
+ //Top level, cap.
+ Mapz->ReadBlock40d( bx, by, bz , &block );
+ for(uint32_t x=0;x<16;++x){
+ for(uint32_t y=0;y<16;++y){
+ if(pattern[x][y]){
+ tp = getTileTypeP(block.tiletypes[x][y]);
+ d = &block.designation[x][y];
+ //Only modify this level if it's 'empty'
+ if( EMPTY != tp->c && RAMP_TOP != tp->c && STAIR_DOWN != tp->c && DFHack::TILE_STREAM_TOP != tp->s) continue;
+
+ //Need a floor for empty space.
+ if(reveal) d->bits.hidden = 0; //topblock.designation[x][y].bits.hidden;
+ //Always clear the dig designation.
+ d->bits.dig=designation_no;
+ //unlock fluids, so they fall down the pit.
+ d->bits.flow_forbid = d->bits.liquid_static=0;
+ block.blockflags.bits.liquid_1 = block.blockflags.bits.liquid_2 = 1;
+ //Remove aquifer, to prevent bugginess
+ d->bits.water_table=0;
+ //Set the tile.
+ block.tiletypes[x][y] = cap + rand()%4;
+ }
+ }
+ }
+ //Write the block.
+ Mapz->WriteBlockFlags(bx,by,bz, block.blockflags );
+ Mapz->WriteDesignations(bx,by,bz, &block.designation );
+ Mapz->WriteTileTypes(bx,by,bz, &block.tiletypes );
+ Mapz->WriteDirtyBit(bx,by,bz,1);
+
+ //All levels in between.
+ uint32_t t;
+ for(uint32_t z = bz-1; z>0 ; --z){
+ cout << z << endl;
+ assert( Mapz->isValidBlock(bx,by,z) );
+ if(!Mapz->ReadBlock40d( bx, by, z , &block )){
+ cout << "Bad block! " << bx << "," << by << "," << z;
+ }
+ for(uint32_t x=0;x<16;++x){
+ for(uint32_t y=0;y<16;++y){
+ t=0;
+ tp = getTileTypeP(block.tiletypes[x][y]);
+ d = &block.designation[x][y];
+ //Border or space?
+ switch(pattern[x][y]){
+ case 0:
+ continue;
+ break;
+ case 1:
+ //Empty Space
+ t=32;
+ //d->bits.light = topblock.designation[x][y].bits.light;
+ //d->bits.skyview = topblock.designation[x][y].bits.skyview;
+ //d->bits.subterranean = topblock.designation[x][y].bits.subterranean;
+
+ //Erase special markers
+ d->bits.feature_global = d->bits.feature_local = 0;
+
+ break;
+ case 2:
+ //Border.
+ //First guess based on current material
+ switch( tp->m ){
+ case OBSIDIAN:
+ t=wmagma;
+ break;
+ case MAGMA:
+ t=wmolten;
+ break;
+ case HFS:
+ t=whell;
+ break;
+ case VEIN:
+ t=440; //Solid vein block
+ break;
+ case FEATSTONE:
+ t=335; //Solid feature stone block
+ break;
+ default:
+ t=wcave;
+ }
+
+ //If the tile already is a feature, or if it is a vein, we're done.
+ //Otherwise, adopt block features.
+ if( VEIN!=tp->m && !d->bits.feature_global && !d->bits.feature_local ){
+ //Local Feature?
+ if( block.local_feature > -1 ){
+ switch( n=local_features[pc][block.local_feature]->type ){
+ case feature_Adamantine_Tube:
+ case feature_Underworld:
+ case feature_Hell_Temple:
+ //Whatever the feature is made of. "featstone wall"
+ d->bits.feature_local = 1;
+ t=335;
+ break;
+ default:
+ //something here. for debugging, it may be interesting to know.
+ if(n) cout << '(' << n << ')';
+ }
+ }
+ //Global Feature?
+ else if(block.global_feature > -1 ){
+ switch( n=global_features[block.global_feature].type ){
+ case feature_Adamantine_Tube:
+ case feature_Underworld:
+ case feature_Hell_Temple:
+ //Whatever the feature is made of. "featstone wall"
+ d->bits.feature_global = 1;
+ t=335;
+ break;
+ default:
+ //something here. for debugging, it may be interesting to know.
+ if(n) cout << '[' << n << ']';
+ }
+ }
+ }
+
+ //Erase any liquids, as they cause problems.
+ d->bits.flow_size=0;
+ d->bits.liquid_character = liquid_fresh;
+ d->bits.liquid_type=liquid_water;
+
+ break;
+
+ case 3:
+ //Special wall, always sets to obsidian, to give a stairway
+ t=331;
+
+ //Erase special markers
+ d->bits.feature_global = d->bits.feature_local = 0;
+
+ //Erase any liquids, as they cause problems.
+ d->bits.flow_size=0;
+ d->bits.liquid_character = liquid_fresh;
+ d->bits.liquid_type=liquid_water;
+ break;
+ default:
+ cout << ".err,bad pattern.";
+ }
+
+ //For all tiles.
+ if(reveal) d->bits.hidden = 0; //topblock.designation[x][y].bits.hidden;
+ //Always clear the dig designation.
+ d->bits.dig=designation_no;
+ //unlock fluids, so they fall down the pit.
+ d->bits.flow_forbid = d->bits.liquid_static=0;
+ block.blockflags.bits.liquid_1 = block.blockflags.bits.liquid_2 = 1;
+ //Remove aquifer, to prevent bugginess
+ d->bits.water_table=0;
+ //Set the tile.
+ block.tiletypes[x][y] = t;
+ }
+ }
+
+ //Write the block.
+ Mapz->WriteBlockFlags(bx,by,z, block.blockflags );
+ Mapz->WriteDesignations(bx,by,z, &block.designation );
+ Mapz->WriteTileTypes(bx,by,z, &block.tiletypes );
+ Mapz->WriteDirtyBit(bx,by,z,1);
+ }
+
+
+ //The bottom level is special.
+ Mapz->ReadBlock40d( bx, by, 0 , &block );
+ for(uint32_t x=0;x<16;++x){
+ for(uint32_t y=0;y<16;++y){
+ //Only the portion below the empty space is handled.
+ if(pattern[x][y]){
+ if( 1==pattern[x][y] ) t=floor;
+ else if( 3==pattern[x][y] ) t=331;
+ else continue;
+
+ tp = getTileTypeP(block.tiletypes[x][y]);
+ d = &block.designation[x][y];
+
+ //For all tiles.
+ if(reveal) d->bits.hidden = 0; //topblock.designation[x][y].bits.hidden;
+ //Always clear the dig designation.
+ d->bits.dig=designation_no;
+ //unlock fluids, so they fall down the pit.
+ d->bits.flow_forbid = d->bits.liquid_static=0;
+ block.blockflags.bits.liquid_1 = block.blockflags.bits.liquid_2 = 1;
+ //Set the tile.
+ block.tiletypes[x][y] = floor;
+ }
+ }
+ }
+ //Write the block.
+ Mapz->WriteBlockFlags(bx,by,0, block.blockflags );
+ Mapz->WriteDesignations(bx,by,0, &block.designation );
+ Mapz->WriteTileTypes(bx,by,0, &block.tiletypes );
+ Mapz->WriteDirtyBit(bx,by,0,1);
+
+
+
+ DF->Detach();
+ #ifndef LINUX_BUILD
+ cout << "Done. Press any key to continue" << endl;
+ cin.ignore();
+ #endif
+ return 0;
+}
diff --git a/tools/playground/printtiletypes.cpp b/tools/playground/printtiletypes.cpp new file mode 100644 index 00000000..1016694c --- /dev/null +++ b/tools/playground/printtiletypes.cpp @@ -0,0 +1,93 @@ +// Prints all the Tile Types known by DFHack. +// File is both fixed-field and CSV parsable. + +#include <stdio.h> +#include <string.h> +#include <iostream> +#include <vector> +#include <map> +#include <stddef.h> +#include <assert.h> +using namespace std; + +#include <DFHack.h> +#include <dfhack/DFTileTypes.h> + +using namespace DFHack; + +int main (int argc, char **argv) +{ + FILE *f=stdout; + const int Columns = 7; + const char * Headings[Columns] = {"TileTypeID","Class","Material","V","Special","Direction","Description"}; + size_t Size[ Columns ] = {}; + int i; + + //First, figure out column widths. + for(i=0;i<Columns;++i){ + Size[i]=strlen(Headings[i])+1; + } + + //Classes + fprintf(f,"\nTile Type Classes:\n"); + for(i=0;i<tileclass_count;++i){ + Size[1]=max<size_t>(Size[1],strlen(TileClassString[i])); + fprintf(f,"%4i ; %s\n", i, TileClassString[i] ,0 ); + } + + //Materials + fprintf(f,"\nTile Type Materials:\n"); + for(i=0;i<tilematerial_count;++i){ + Size[2]=max<size_t>(Size[2],strlen(TileMaterialString[i])); + fprintf(f,"%4i ; %s\n", i, TileMaterialString[i] ,0 ); + } + + //Specials + fprintf(f,"\nTile Type Specials:\n"); + for(i=0;i<tilespecial_count;++i){ + Size[4]=max<size_t>(Size[4],strlen(TileSpecialString[i])); + fprintf(f,"%4i ; %s\n", i, TileSpecialString[i] ,0 ); + } + + /* - Not needed for now - + //Direction is tricky + for(i=0;i<TILE_TYPE_ARRAY_LENGTH;++i) + Size[5]=max(Size[5], tileTypeTable[i].d.sum()+1 ); + */ + + //Print the headings first. + fprintf(f,"\nTile Types:\n"); + for(i=0;i<Columns;++i){ + if(i) putc(';',f); + fprintf(f," %-*s ",Size[i],Headings[i],0); + } + fprintf(f,"\n"); + + + + //Process the whole array. + //A macro should be used for making the strings safe, but they are left in naked ? blocks + //to illustrate the array references more clearly. + for(i=0;i<TILE_TYPE_ARRAY_LENGTH;++i){ + fprintf(f," %*i ; %-*s ; %-*s ; %*c ; %-*s ; %-*s ; %s\n", + Size[0], i, + Size[1], ( tileTypeTable[i].name ? TileClassString[ tileTypeTable[i].c ] : "" ), + Size[2], ( tileTypeTable[i].name ? TileMaterialString[ tileTypeTable[i].m ] : "" ), + Size[3], ( tileTypeTable[i].v ? '0'+tileTypeTable[i].v : ' ' ), + Size[4], ( tileTypeTable[i].s ? TileSpecialString[ tileTypeTable[i].s ] : "" ), + Size[5], ( tileTypeTable[i].d.whole ? tileTypeTable[i].d.getStr() : "" ), + ( tileTypeTable[i].name ? tileTypeTable[i].name : "" ), + 0 + ); + } + fprintf(f,"\n"); + + + #ifndef LINUX_BUILD + if( 1== argc){ + cout << "Done. Press any key to continue" << endl; + cin.ignore(); + } + #endif + return 0; +} |
