diff --git a/.gitignore b/.gitignore index 356bf6399..3d1c650da 100644 --- a/.gitignore +++ b/.gitignore @@ -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 e3b660711..52c3fb4de 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-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;tts != 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 f21d9170c..291845660 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 000000000..3cfbf5170 --- /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 +#include +#include +#include +#include +using namespace std; + +#include +#include + + +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 000000000..06d1847d3 --- /dev/null +++ b/tools/playground/hellhole.cpp @@ -0,0 +1,426 @@ +// Burn a hole straight to hell! + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +using namespace std; + +#include +#include +#include +using namespace DFHack; + + +#ifdef LINUX_BUILD +#include +void waitmsec (int delay) +{ + usleep(delay); +} +#else +#include +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 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 > 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 000000000..1016694c9 --- /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 +#include +#include +#include +#include +#include +#include +using namespace std; + +#include +#include + +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(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(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(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