tron@3111: /* $Id$ */ tron@3111: tron@3111: #ifndef WATER_MAP_H tron@3111: #define WATER_MAP_H tron@3111: celestar@3402: typedef enum WaterTileType { celestar@3402: WATER_CLEAR, celestar@3402: WATER_COAST, celestar@3402: WATER_LOCK, celestar@3402: WATER_DEPOT, celestar@3402: } WaterTileType; celestar@3402: celestar@3372: typedef enum DepotPart { celestar@3372: DEPOT_NORTH = 0x80, celestar@3373: DEPOT_SOUTH = 0x81, celestar@3373: DEPOT_END = 0x84, celestar@3372: } DepotPart; celestar@3372: celestar@3372: typedef enum LockPart { celestar@3372: LOCK_MIDDLE = 0x10, celestar@3372: LOCK_LOWER = 0x14, celestar@3402: LOCK_UPPER = 0x18, celestar@3402: LOCK_END = 0x1C celestar@3372: } LockPart; celestar@3372: celestar@3402: static inline WaterTileType GetWaterTileType(TileIndex t) celestar@3373: { celestar@3402: if (_m[t].m5 == 0) return WATER_CLEAR; celestar@3402: if (_m[t].m5 == 1) return WATER_COAST; celestar@3402: if (IS_INT_INSIDE(_m[t].m5, LOCK_MIDDLE, LOCK_END)) return WATER_LOCK; celestar@3402: celestar@3424: assert(IS_INT_INSIDE(_m[t].m5, DEPOT_NORTH, DEPOT_END)); celestar@3424: return WATER_DEPOT; celestar@3402: } celestar@3402: celestar@3402: static inline bool IsWater(TileIndex t) celestar@3402: { celestar@3402: return GetWaterTileType(t) == WATER_CLEAR; celestar@3402: } celestar@3402: celestar@3423: static inline bool IsCoast(TileIndex t) celestar@3423: { celestar@3423: return GetWaterTileType(t) == WATER_COAST; celestar@3423: } celestar@3423: celestar@3402: static inline bool IsClearWaterTile(TileIndex t) celestar@3402: { tron@3636: return IsTileType(t, MP_WATER) && IsWater(t) && GetTileSlope(t, NULL) == SLOPE_FLAT; celestar@3373: } celestar@3373: celestar@3373: static inline TileIndex GetOtherShipDepotTile(TileIndex t) celestar@3373: { celestar@3373: return t + (HASBIT(_m[t].m5, 0) ? -1 : 1) * (HASBIT(_m[t].m5, 1) ? TileDiffXY(0, 1) : TileDiffXY(1, 0)); celestar@3373: } celestar@3373: celestar@3373: static inline TileIndex IsShipDepot(TileIndex t) celestar@3373: { celestar@3373: return IS_INT_INSIDE(_m[t].m5, DEPOT_NORTH, DEPOT_END); celestar@3373: } celestar@3373: celestar@3423: static inline Axis GetShipDepotAxis(TileIndex t) celestar@3423: { celestar@3423: return (Axis)GB(_m[t].m5, 1, 1); celestar@3423: } celestar@3423: tron@3953: static inline DiagDirection GetShipDepotDirection(TileIndex t) tron@3953: { tron@3953: return XYNSToDiagDir(GetShipDepotAxis(t), GB(_m[t].m5, 0, 1)); tron@3953: } tron@3953: celestar@3373: static inline DiagDirection GetLockDirection(TileIndex t) celestar@3373: { celestar@3373: return (DiagDirection)GB(_m[t].m5, 0, 2); celestar@3373: } celestar@3373: celestar@3425: static inline byte GetSection(TileIndex t) celestar@3425: { celestar@3425: assert(GetWaterTileType(t) == WATER_LOCK || GetWaterTileType(t) == WATER_DEPOT); celestar@3425: return GB(_m[t].m5, 0, 4); celestar@3425: } celestar@3425: celestar@3373: tron@3111: static inline void MakeWater(TileIndex t) tron@3111: { tron@3111: SetTileType(t, MP_WATER); tron@3111: SetTileOwner(t, OWNER_WATER); tron@3111: _m[t].m2 = 0; tron@3111: _m[t].m3 = 0; tron@3111: _m[t].m4 = 0; tron@3111: _m[t].m5 = 0; tron@3111: } tron@3111: tron@3111: static inline void MakeShore(TileIndex t) tron@3111: { tron@3111: SetTileType(t, MP_WATER); tron@3111: SetTileOwner(t, OWNER_WATER); tron@3111: _m[t].m2 = 0; tron@3111: _m[t].m3 = 0; tron@3111: _m[t].m4 = 0; tron@3111: _m[t].m5 = 1; tron@3111: } tron@3111: peter1138@3940: static inline void MakeCanal(TileIndex t, Owner o) peter1138@3940: { peter1138@3940: SetTileType(t, MP_WATER); peter1138@3940: SetTileOwner(t, o); peter1138@3940: _m[t].m2 = 0; peter1138@3940: _m[t].m3 = 0; peter1138@3940: _m[t].m4 = 0; peter1138@3940: _m[t].m5 = 0; peter1138@3940: } peter1138@3940: celestar@3372: static inline void MakeShipDepot(TileIndex t, Owner o, DepotPart base, Axis a) celestar@3372: { celestar@3372: SetTileType(t, MP_WATER); celestar@3372: SetTileOwner(t, o); celestar@3372: _m[t].m2 = 0; celestar@3372: _m[t].m3 = 0; celestar@3372: _m[t].m4 = 0; celestar@3372: _m[t].m5 = base + a * 2; celestar@3372: } celestar@3372: peter1138@3940: static inline void MakeLockTile(TileIndex t, Owner o, byte section) celestar@3372: { celestar@3372: SetTileType(t, MP_WATER); peter1138@3940: SetTileOwner(t, o); celestar@3372: _m[t].m2 = 0; celestar@3372: _m[t].m3 = 0; celestar@3372: _m[t].m4 = 0; celestar@3372: _m[t].m5 = section; celestar@3372: } celestar@3372: peter1138@3940: static inline void MakeLock(TileIndex t, Owner o, DiagDirection d) celestar@3372: { Darkvater@4559: TileIndexDiff delta = TileOffsByDiagDir(d); celestar@3372: peter1138@3940: MakeLockTile(t, o, LOCK_MIDDLE + d); peter1138@3940: MakeLockTile(t - delta, o, LOCK_LOWER + d); peter1138@3940: MakeLockTile(t + delta, o, LOCK_UPPER + d); celestar@3372: } celestar@3372: peter1138@4666: #endif /* WATER_MAP_H */