tron@2186: /* $Id$ */ tron@2186: rubidium@10429: /** @file tile_map.cpp Global tile accessors. */ belugas@6918: darkvater@1213: #include "stdafx.h" rubidium@8604: #include "openttd.h" rubidium@8604: #include "tile_map.h" rubidium@8609: #include "core/math_func.hpp" tron@1211: tron@3636: Slope GetTileSlope(TileIndex tile, uint *h) tron@1335: { tron@1335: uint a; tron@1335: uint b; tron@1335: uint c; tron@1335: uint d; tron@4067: uint min; tron@4067: uint r; tron@1335: tron@1335: assert(tile < MapSize()); tron@1335: tron@1335: if (TileX(tile) == MapMaxX() || TileY(tile) == MapMaxY()) { tron@1335: if (h != NULL) *h = 0; rubidium@5838: return SLOPE_FLAT; tron@1335: } tron@1335: tron@4067: min = a = TileHeight(tile); tron@1981: b = TileHeight(tile + TileDiffXY(1, 0)); rubidium@7819: if (min > b) min = b; tron@1981: c = TileHeight(tile + TileDiffXY(0, 1)); rubidium@7819: if (min > c) min = c; tron@1981: d = TileHeight(tile + TileDiffXY(1, 1)); rubidium@7819: if (min > d) min = d; tron@1335: tron@4067: r = SLOPE_FLAT; tron@4067: if ((a -= min) != 0) r += (--a << 4) + SLOPE_N; tron@4067: if ((c -= min) != 0) r += (--c << 4) + SLOPE_E; tron@4067: if ((d -= min) != 0) r += (--d << 4) + SLOPE_S; tron@4067: if ((b -= min) != 0) r += (--b << 4) + SLOPE_W; tron@4067: tron@4067: if (h != NULL) *h = min * TILE_HEIGHT; tron@4067: rubidium@5838: return (Slope)r; tron@1335: } tron@1335: tron@1335: uint GetTileZ(TileIndex tile) tron@1335: { rubidium@7819: if (TileX(tile) == MapMaxX() || TileY(tile) == MapMaxY()) return 0; rubidium@7819: rubidium@7819: uint h = TileHeight(tile); rubidium@7819: h = min(h, TileHeight(tile + TileDiffXY(1, 0))); rubidium@7819: h = min(h, TileHeight(tile + TileDiffXY(0, 1))); rubidium@7819: h = min(h, TileHeight(tile + TileDiffXY(1, 1))); rubidium@7819: rubidium@7819: return h * TILE_HEIGHT; tron@1335: } tron@3773: tron@3773: tron@3773: uint GetTileMaxZ(TileIndex t) tron@3773: { rubidium@7820: if (TileX(t) == MapMaxX() || TileY(t) == MapMaxY()) return 0; tron@3773: rubidium@7819: uint h = TileHeight(t); rubidium@7819: h = max(h, TileHeight(t + TileDiffXY(1, 0))); rubidium@7819: h = max(h, TileHeight(t + TileDiffXY(0, 1))); rubidium@7819: h = max(h, TileHeight(t + TileDiffXY(1, 1))); rubidium@7819: rubidium@7819: return h * TILE_HEIGHT; tron@3773: }