From a8ba74843439e1ad1157db7621cbd1a5ae10e428 Mon Sep 17 00:00:00 2001 From: planetmaker Date: Mon, 6 May 2013 20:48:18 +0000 Subject: [PATCH] (svn r25229) -Feature: [NewGRF] Variable 0x82 for canals and rivers (dike map) --- src/newgrf_canal.cpp | 24 ++++++++++++++++++++++++ src/water.h | 2 ++ src/water_cmd.cpp | 2 +- 3 files changed, 27 insertions(+), 1 deletion(-) diff --git a/src/newgrf_canal.cpp b/src/newgrf_canal.cpp index 13b7e15d6e..ef678a0ccc 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 1e8152f73a..cb7237fc7c 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 ccda7fb063..b99741cfe9 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: