rubidium@9723: /* $Id$ */ rubidium@9723: rubidium@10455: /** @file tile_map.cpp Global tile accessors. */ rubidium@9723: rubidium@9723: #include "stdafx.h" rubidium@9723: #include "openttd.h" rubidium@9723: #include "tile_map.h" rubidium@9723: #include "core/math_func.hpp" rubidium@9723: rubidium@9723: Slope GetTileSlope(TileIndex tile, uint *h) rubidium@9723: { rubidium@9723: uint a; rubidium@9723: uint b; rubidium@9723: uint c; rubidium@9723: uint d; rubidium@9723: uint min; rubidium@9723: uint r; rubidium@9723: rubidium@9723: assert(tile < MapSize()); rubidium@9723: rubidium@9723: if (TileX(tile) == MapMaxX() || TileY(tile) == MapMaxY()) { rubidium@9723: if (h != NULL) *h = 0; rubidium@9723: return SLOPE_FLAT; rubidium@9723: } rubidium@9723: rubidium@9723: min = a = TileHeight(tile); rubidium@9723: b = TileHeight(tile + TileDiffXY(1, 0)); rubidium@9723: if (min > b) min = b; rubidium@9723: c = TileHeight(tile + TileDiffXY(0, 1)); rubidium@9723: if (min > c) min = c; rubidium@9723: d = TileHeight(tile + TileDiffXY(1, 1)); rubidium@9723: if (min > d) min = d; rubidium@9723: rubidium@9723: r = SLOPE_FLAT; rubidium@9723: if ((a -= min) != 0) r += (--a << 4) + SLOPE_N; rubidium@9723: if ((c -= min) != 0) r += (--c << 4) + SLOPE_E; rubidium@9723: if ((d -= min) != 0) r += (--d << 4) + SLOPE_S; rubidium@9723: if ((b -= min) != 0) r += (--b << 4) + SLOPE_W; rubidium@9723: rubidium@9723: if (h != NULL) *h = min * TILE_HEIGHT; rubidium@9723: rubidium@9723: return (Slope)r; rubidium@9723: } rubidium@9723: rubidium@9723: uint GetTileZ(TileIndex tile) rubidium@9723: { rubidium@9723: if (TileX(tile) == MapMaxX() || TileY(tile) == MapMaxY()) return 0; rubidium@9723: rubidium@9723: uint h = TileHeight(tile); rubidium@9723: h = min(h, TileHeight(tile + TileDiffXY(1, 0))); rubidium@9723: h = min(h, TileHeight(tile + TileDiffXY(0, 1))); rubidium@9723: h = min(h, TileHeight(tile + TileDiffXY(1, 1))); rubidium@9723: rubidium@9723: return h * TILE_HEIGHT; rubidium@9723: } rubidium@9723: rubidium@9723: rubidium@9723: uint GetTileMaxZ(TileIndex t) rubidium@9723: { rubidium@9723: if (TileX(t) == MapMaxX() || TileY(t) == MapMaxY()) return 0; rubidium@9723: rubidium@9723: uint h = TileHeight(t); rubidium@9723: h = max(h, TileHeight(t + TileDiffXY(1, 0))); rubidium@9723: h = max(h, TileHeight(t + TileDiffXY(0, 1))); rubidium@9723: h = max(h, TileHeight(t + TileDiffXY(1, 1))); rubidium@9723: rubidium@9723: return h * TILE_HEIGHT; rubidium@9723: }