00001
00002
00003
00004
00005
00006
00007
00008
00009
00012 #ifndef TILE_MAP_H
00013 #define TILE_MAP_H
00014
00015 #include "slope_type.h"
00016 #include "map_func.h"
00017 #include "core/bitmath_func.hpp"
00018 #include "settings_type.h"
00019
00031 static inline uint TileHeight(TileIndex tile)
00032 {
00033 assert(tile < MapSize());
00034 return GB(_m[tile].type_height, 0, 4);
00035 }
00036
00047 static inline void SetTileHeight(TileIndex tile, uint height)
00048 {
00049 assert(tile < MapSize());
00050 assert(height <= MAX_TILE_HEIGHT);
00051 SB(_m[tile].type_height, 0, 4, height);
00052 }
00053
00062 static inline uint TilePixelHeight(TileIndex tile)
00063 {
00064 return TileHeight(tile) * TILE_HEIGHT;
00065 }
00066
00074 static inline TileType GetTileType(TileIndex tile)
00075 {
00076 assert(tile < MapSize());
00077 return (TileType)GB(_m[tile].type_height, 4, 4);
00078 }
00079
00087 static inline bool IsInnerTile(TileIndex tile)
00088 {
00089 assert(tile < MapSize());
00090
00091 uint x = TileX(tile);
00092 uint y = TileY(tile);
00093
00094 return x < MapMaxX() && y < MapMaxY() && ((x > 0 && y > 0) || !_settings_game.construction.freeform_edges);
00095 }
00096
00109 static inline void SetTileType(TileIndex tile, TileType type)
00110 {
00111 assert(tile < MapSize());
00112
00113
00114
00115 assert(IsInnerTile(tile) == (type != MP_VOID));
00116 SB(_m[tile].type_height, 4, 4, type);
00117 }
00118
00128 static inline bool IsTileType(TileIndex tile, TileType type)
00129 {
00130 return GetTileType(tile) == type;
00131 }
00132
00139 static inline bool IsValidTile(TileIndex tile)
00140 {
00141 return tile < MapSize() && !IsTileType(tile, MP_VOID);
00142 }
00143
00156 static inline Owner GetTileOwner(TileIndex tile)
00157 {
00158 assert(IsValidTile(tile));
00159 assert(!IsTileType(tile, MP_HOUSE));
00160 assert(!IsTileType(tile, MP_INDUSTRY));
00161
00162 return (Owner)GB(_m[tile].m1, 0, 5);
00163 }
00164
00176 static inline void SetTileOwner(TileIndex tile, Owner owner)
00177 {
00178 assert(IsValidTile(tile));
00179 assert(!IsTileType(tile, MP_HOUSE));
00180 assert(!IsTileType(tile, MP_INDUSTRY));
00181
00182 SB(_m[tile].m1, 0, 5, owner);
00183 }
00184
00192 static inline bool IsTileOwner(TileIndex tile, Owner owner)
00193 {
00194 return GetTileOwner(tile) == owner;
00195 }
00196
00203 static inline void SetTropicZone(TileIndex tile, TropicZone type)
00204 {
00205 assert(tile < MapSize());
00206 assert(!IsTileType(tile, MP_VOID) || type == TROPICZONE_NORMAL);
00207 SB(_m[tile].m6, 0, 2, type);
00208 }
00209
00216 static inline TropicZone GetTropicZone(TileIndex tile)
00217 {
00218 assert(tile < MapSize());
00219 return (TropicZone)GB(_m[tile].m6, 0, 2);
00220 }
00221
00228 static inline byte GetAnimationFrame(TileIndex t)
00229 {
00230 assert(IsTileType(t, MP_HOUSE) || IsTileType(t, MP_OBJECT) || IsTileType(t, MP_INDUSTRY) ||IsTileType(t, MP_STATION));
00231 return _me[t].m7;
00232 }
00233
00240 static inline void SetAnimationFrame(TileIndex t, byte frame)
00241 {
00242 assert(IsTileType(t, MP_HOUSE) || IsTileType(t, MP_OBJECT) || IsTileType(t, MP_INDUSTRY) ||IsTileType(t, MP_STATION));
00243 _me[t].m7 = frame;
00244 }
00245
00246 Slope GetTileSlope(TileIndex tile, int *h = NULL);
00247 int GetTileZ(TileIndex tile);
00248 int GetTileMaxZ(TileIndex tile);
00249
00250 bool IsTileFlat(TileIndex tile, int *h = NULL);
00251
00258 static inline Slope GetTilePixelSlope(TileIndex tile, int *h)
00259 {
00260 Slope s = GetTileSlope(tile, h);
00261 if (h != NULL) *h *= TILE_HEIGHT;
00262 return s;
00263 }
00264
00270 static inline int GetTilePixelZ(TileIndex tile)
00271 {
00272 return GetTileZ(tile) * TILE_HEIGHT;
00273 }
00274
00280 static inline int GetTileMaxPixelZ(TileIndex tile)
00281 {
00282 return GetTileMaxZ(tile) * TILE_HEIGHT;
00283 }
00284
00285
00293 static inline uint TileHash(uint x, uint y)
00294 {
00295 uint hash = x >> 4;
00296 hash ^= x >> 6;
00297 hash ^= y >> 4;
00298 hash -= y >> 6;
00299 return hash;
00300 }
00301
00311 static inline uint TileHash2Bit(uint x, uint y)
00312 {
00313 return GB(TileHash(x, y), 0, 2);
00314 }
00315
00316 #endif