summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorplanetmaker <planetmaker@openttd.org>2013-05-06 20:48:18 +0000
committerplanetmaker <planetmaker@openttd.org>2013-05-06 20:48:18 +0000
commita8ba74843439e1ad1157db7621cbd1a5ae10e428 (patch)
tree5d3f98a9d2544cb8d344f3c45f9126a64586e4f3
parent26dd535c6b33c54b4d4218f1c90ddb527239bca4 (diff)
downloadopenttd-a8ba74843439e1ad1157db7621cbd1a5ae10e428.tar.xz
(svn r25229) -Feature: [NewGRF] Variable 0x82 for canals and rivers (dike map)
-rw-r--r--src/newgrf_canal.cpp24
-rw-r--r--src/water.h2
-rw-r--r--src/water_cmd.cpp2
3 files changed, 27 insertions, 1 deletions
diff --git a/src/newgrf_canal.cpp b/src/newgrf_canal.cpp
index 13b7e15d6..ef678a0cc 100644
--- a/src/newgrf_canal.cpp
+++ b/src/newgrf_canal.cpp
@@ -13,6 +13,7 @@
#include "debug.h"
#include "newgrf_spritegroup.h"
#include "newgrf_canal.h"
+#include "water.h"
#include "water_map.h"
/** Table of canal 'feature' sprite groups */
@@ -66,6 +67,29 @@ struct CanalResolverObject : public ResolverObject {
/* Terrain type */
case 0x81: return GetTerrainType(this->tile);
+ /* Dike map: Connectivity info for river and canal tiles
+ *
+ * Assignment of bits to directions defined in agreement with
+ * http://projects.tt-forums.net/projects/ttdpatch/repository/revisions/2367/entry/trunk/patches/water.asm#L879
+ * 7
+ * 3 0
+ * 6 * 4
+ * 2 1
+ * 5
+ */
+ case 0x82: {
+ uint32 connectivity =
+ (!IsWateredTile(TILE_ADDXY(tile, -1, 0), DIR_SW) << 0) // NE
+ + (!IsWateredTile(TILE_ADDXY(tile, 0, 1), DIR_NW) << 1) // SE
+ + (!IsWateredTile(TILE_ADDXY(tile, 1, 0), DIR_NE) << 2) // SW
+ + (!IsWateredTile(TILE_ADDXY(tile, 0, -1), DIR_SE) << 3) // NW
+ + (!IsWateredTile(TILE_ADDXY(tile, -1, 1), DIR_W) << 4) // E
+ + (!IsWateredTile(TILE_ADDXY(tile, 1, 1), DIR_N) << 5) // S
+ + (!IsWateredTile(TILE_ADDXY(tile, 1, -1), DIR_E) << 6) // W
+ + (!IsWateredTile(TILE_ADDXY(tile, -1, -1), DIR_S) << 7); // N
+ return connectivity;
+ }
+
/* Random data for river or canal tiles, otherwise zero */
case 0x83: return IsTileType(this->tile, MP_WATER) ? GetWaterTileRandomBits(this->tile) : 0;
}
diff --git a/src/water.h b/src/water.h
index 1e8152f73..cb7237fc7 100644
--- a/src/water.h
+++ b/src/water.h
@@ -41,6 +41,8 @@ void MakeWaterKeepingClass(TileIndex tile, Owner o);
bool RiverModifyDesertZone(TileIndex tile, void *data);
+bool IsWateredTile(TileIndex tile, Direction from);
+
/**
* Calculates the maintenance cost of a number of canal tiles.
* @param num Number of canal tiles.
diff --git a/src/water_cmd.cpp b/src/water_cmd.cpp
index ccda7fb06..b99741cfe 100644
--- a/src/water_cmd.cpp
+++ b/src/water_cmd.cpp
@@ -548,7 +548,7 @@ static CommandCost ClearTile_Water(TileIndex tile, DoCommandFlag flags)
* @return true iff the tile is water in the view of 'from'.
*
*/
-static bool IsWateredTile(TileIndex tile, Direction from)
+bool IsWateredTile(TileIndex tile, Direction from)
{
switch (GetTileType(tile)) {
case MP_WATER: