diff --git a/src/water_map.h b/src/water_map.h --- a/src/water_map.h +++ b/src/water_map.h @@ -16,27 +16,31 @@ #include "depot_type.h" #include "tile_map.h" +/** Available water tile types. */ enum WaterTileType { - WATER_TILE_CLEAR, - WATER_TILE_COAST, - WATER_TILE_LOCK, - WATER_TILE_DEPOT, + WATER_TILE_CLEAR, // Plain water. + WATER_TILE_COAST, // Coast. + WATER_TILE_LOCK, // Water lock. + WATER_TILE_DEPOT, // Water Depot. }; +/** classes of water (for #WATER_TILE_CLEAR water tile type). */ enum WaterClass { - WATER_CLASS_SEA, - WATER_CLASS_CANAL, - WATER_CLASS_RIVER, - WATER_CLASS_INVALID, ///< Used for industry tiles on land (also for oilrig if newgrf says so) + WATER_CLASS_SEA, ///< Sea. + WATER_CLASS_CANAL, ///< Canal. + WATER_CLASS_RIVER, ///< River. + WATER_CLASS_INVALID, ///< Used for industry tiles on land (also for oilrig if newgrf says so). }; template <> struct EnumPropsT : MakeEnumPropsT {}; +/** Sections of the water depot. */ enum DepotPart { DEPOT_NORTH = 0x80, DEPOT_SOUTH = 0x81, DEPOT_END = 0x84, }; +/** Sections of the water lock. */ enum LockPart { LOCK_MIDDLE = 0x10, LOCK_LOWER = 0x14, @@ -44,6 +48,10 @@ enum LockPart { LOCK_END = 0x1C }; +/** Get the water tile type at a tile. + * @param t Water tile to query. + * @return Water tile type at the tile. + */ static inline WaterTileType GetWaterTileType(TileIndex t) { assert(IsTileType(t, MP_WATER)); @@ -56,12 +64,20 @@ static inline WaterTileType GetWaterTile return WATER_TILE_DEPOT; } +/** Get the water class at a tile. + * @param t Water tile to query. + * @return Water class at the tile. + */ static inline WaterClass GetWaterClass(TileIndex t) { assert(IsTileType(t, MP_WATER) || IsTileType(t, MP_STATION) || IsTileType(t, MP_INDUSTRY)); return (WaterClass)(IsTileType(t, MP_INDUSTRY) ? GB(_m[t].m1, 5, 2) : GB(_m[t].m3, 0, 2)); } +/** Set the water class at a tile. + * @param t Water tile to change. + * @param wc New water class. + */ static inline void SetWaterClass(TileIndex t, WaterClass wc) { assert(IsTileType(t, MP_WATER) || IsTileType(t, MP_STATION) || IsTileType(t, MP_INDUSTRY)); @@ -72,84 +88,147 @@ static inline void SetWaterClass(TileInd } } -/** IsWater return true if any type of clear water like ocean, river, canal */ +/** Is it a plain water tile? + * @param t Water tile to query. + * @return \c true if any type of clear water like ocean, river, or canal. + */ static inline bool IsWater(TileIndex t) { return GetWaterTileType(t) == WATER_TILE_CLEAR; } +/** Is it a sea water tile? + * @param t Water tile to query. + * @return \c true if it is a sea water tile. + */ static inline bool IsSea(TileIndex t) { return IsWater(t) && GetWaterClass(t) == WATER_CLASS_SEA; } +/** Is it a canal tile? + * @param t Water tile to query. + * @return \c true if it is a canal tile. + */ static inline bool IsCanal(TileIndex t) { return IsWater(t) && GetWaterClass(t) == WATER_CLASS_CANAL; } +/** Is it a river water tile? + * @param t Water tile to query. + * @return \c true if it is a river water tile. + */ static inline bool IsRiver(TileIndex t) { return IsWater(t) && GetWaterClass(t) == WATER_CLASS_RIVER; } +/** Is it a water tile with plain water? + * @param t Tile to query. + * @return \c true if it is a plain water tile. + */ static inline bool IsWaterTile(TileIndex t) { return IsTileType(t, MP_WATER) && IsWater(t); } +/** Is it a coast tile? + * @param t Water tile to query. + * @return \c true if it is a sea water tile. + */ static inline bool IsCoast(TileIndex t) { return GetWaterTileType(t) == WATER_TILE_COAST; } +/** Get the other tile of the ship depot. + * @param t Tile to query, containing one section of a ship depot. + * @return Tile containing the other section of the depot. + */ static inline TileIndex GetOtherShipDepotTile(TileIndex t) { return t + (HasBit(_m[t].m5, 0) ? -1 : 1) * (HasBit(_m[t].m5, 1) ? TileDiffXY(0, 1) : TileDiffXY(1, 0)); } +/** Is it a water tile with a ship depot on it? + * @param t Water tile to query. + * @return \c true if it is a ship depot tile. + */ static inline bool IsShipDepot(TileIndex t) { return IsInsideMM(_m[t].m5, DEPOT_NORTH, DEPOT_END); } +/** Is it a ship depot tile? + * @param t Tile to query. + * @return \c true if it is a ship depot tile. + */ static inline bool IsShipDepotTile(TileIndex t) { return IsTileType(t, MP_WATER) && IsShipDepot(t); } +/** Get the axis of the ship depot. + * @param t Water tile to query. + * @return Axis of the depot. + */ static inline Axis GetShipDepotAxis(TileIndex t) { return (Axis)GB(_m[t].m5, 1, 1); } +/** Get the direction of the ship depot. + * @param t Water tile to query. + * @return Direction of the depot. + */ static inline DiagDirection GetShipDepotDirection(TileIndex t) { return XYNSToDiagDir(GetShipDepotAxis(t), GB(_m[t].m5, 0, 1)); } +/** Is it a water lock tile? + * @param t Water tile to query. + * @return \c true if it is a water lock tile. + */ static inline bool IsLock(TileIndex t) { return IsInsideMM(_m[t].m5, LOCK_MIDDLE, LOCK_END); } +/** Get the direction of the water lock. + * @param t Water tile to query. + * @return Direction of the lock. + */ static inline DiagDirection GetLockDirection(TileIndex t) { return (DiagDirection)GB(_m[t].m5, 0, 2); } +/** Get a section of a depot or a lock. + * @param t Water tile to query. + * @return The section. + */ static inline byte GetSection(TileIndex t) { assert(GetWaterTileType(t) == WATER_TILE_LOCK || GetWaterTileType(t) == WATER_TILE_DEPOT); return GB(_m[t].m5, 0, 4); } +/** Get the random bits of the water tile. + * @param t Water tile to query. + * @return Random bits of the tile. + */ static inline byte GetWaterTileRandomBits(TileIndex t) { return _m[t].m4; } +/** + * Helper function to make a coast tile. + * @param t The tile to change into water + */ static inline void MakeShore(TileIndex t) { SetTileType(t, MP_WATER); @@ -212,6 +291,15 @@ static inline void MakeCanal(TileIndex t MakeWater(t, o, WATER_CLASS_CANAL, random_bits); } +/** + * Make a ship depot section. + * @param t Tile to place the ship depot section. + * @param o Owner of the depot. + * @param did Depot ID. + * @param base Depot base (either #DEPOT_NORTH or #DEPOT_SOUTH). + * @param a Axis of the depot. + * @param original_water_class Original water class. + */ static inline void MakeShipDepot(TileIndex t, Owner o, DepotID did, DepotPart base, Axis a, WaterClass original_water_class) { SetTileType(t, MP_WATER); @@ -224,6 +312,13 @@ static inline void MakeShipDepot(TileInd _me[t].m7 = 0; } +/** Make a lock section. + * @param t Tile to place the water lock section. + * @param o Owner of the lock. + * @param section Section to place. + * @param original_water_class Original water class. + * @see MakeLock + */ static inline void MakeLockTile(TileIndex t, Owner o, byte section, WaterClass original_water_class) { SetTileType(t, MP_WATER); @@ -236,6 +331,14 @@ static inline void MakeLockTile(TileInde _me[t].m7 = 0; } +/** + * Make a water lock. + * @param t Tile to place the water lock section. + * @param o Owner of the lock. + * @param d Direction of the water lock. + * @param wc_lower Original water class of the lower part. + * @param wc_upper Original water class of the upper part. + */ static inline void MakeLock(TileIndex t, Owner o, DiagDirection d, WaterClass wc_lower, WaterClass wc_upper) { TileIndexDiff delta = TileOffsByDiagDir(d);