src/water_map.h
branchNewGRF_ports
changeset 6877 889301acc299
parent 6872 1c4a4a609f85
child 6878 7d1ff2f621c7
--- a/src/water_map.h	Sun Feb 03 01:34:21 2008 +0000
+++ b/src/water_map.h	Sun Feb 03 20:34:26 2008 +0000
@@ -10,7 +10,12 @@
 	WATER_TILE_COAST,
 	WATER_TILE_LOCK,
 	WATER_TILE_DEPOT,
-	WATER_TILE_RIVER,
+};
+
+enum WaterClass {
+	WATER_CLASS_SEA,
+	WATER_CLASS_CANAL,
+	WATER_CLASS_RIVER,
 };
 
 enum DepotPart {
@@ -32,13 +37,24 @@
 
 	if (_m[t].m5 == 0) return WATER_TILE_CLEAR;
 	if (_m[t].m5 == 1) return WATER_TILE_COAST;
-	if (_m[t].m5 == 2) return WATER_TILE_RIVER;
 	if (IsInsideMM(_m[t].m5, LOCK_MIDDLE, LOCK_END)) return WATER_TILE_LOCK;
 
 	assert(IsInsideMM(_m[t].m5, DEPOT_NORTH, DEPOT_END));
 	return WATER_TILE_DEPOT;
 }
 
+static inline WaterClass GetWaterClass(TileIndex t)
+{
+	assert(IsTileType(t, MP_WATER) || IsTileType(t, MP_STATION));
+	return (WaterClass)GB(_m[t].m3, 0, 2);
+}
+
+static inline void SetWaterClass(TileIndex t, WaterClass wc)
+{
+	assert(IsTileType(t, MP_WATER) || IsTileType(t, MP_STATION));
+	SB(_m[t].m3, 0, 2, wc);
+}
+
 /** IsWater return true if any type of clear water like ocean, river, canal */
 static inline bool IsWater(TileIndex t)
 {
@@ -47,9 +63,22 @@
 
 static inline bool IsSea(TileIndex t)
 {
-	if (GetWaterTileType(t) != WATER_TILE_CLEAR) return false;
-	if (!IsTileOwner(t, OWNER_WATER)) return false; // 'Human' built water = canal, not sea
-	return true;
+	return IsWater(t) && GetWaterClass(t) == WATER_CLASS_SEA;
+}
+
+static inline bool IsCanal(TileIndex t)
+{
+	return IsWater(t) && GetWaterClass(t) == WATER_CLASS_CANAL;
+}
+
+static inline bool IsRiver(TileIndex t)
+{
+	return IsWater(t) && GetWaterClass(t) == WATER_CLASS_RIVER;
+}
+
+static inline bool IsWaterTile(TileIndex t)
+{
+	return IsTileType(t, MP_WATER) && IsWater(t);
 }
 
 static inline bool IsCoast(TileIndex t)
@@ -57,21 +86,6 @@
 	return GetWaterTileType(t) == WATER_TILE_COAST;
 }
 
-static inline bool IsCanal(TileIndex t)
-{
-	return GetWaterTileType(t) == WATER_TILE_CLEAR && GetTileOwner(t) != OWNER_WATER;
-}
-
-static inline bool IsRiver(TileIndex t)
-{
-	return GetWaterTileType(t) == WATER_TILE_RIVER;
-}
-
-static inline bool IsWaterTile(TileIndex t)
-{
-	return IsTileType(t, MP_WATER) && IsWater(t);
-}
-
 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));
@@ -119,7 +133,7 @@
 	SetTileType(t, MP_WATER);
 	SetTileOwner(t, OWNER_WATER);
 	_m[t].m2 = 0;
-	_m[t].m3 = 0;
+	_m[t].m3 = WATER_CLASS_SEA;
 	_m[t].m4 = 0;
 	_m[t].m5 = 0;
 }
@@ -139,9 +153,9 @@
 	SetTileType(t, MP_WATER);
 	SetTileOwner(t, OWNER_WATER);
 	_m[t].m2 = 0;
-	_m[t].m3 = 0;
+	_m[t].m3 = WATER_CLASS_RIVER;
 	_m[t].m4 = random_bits;
-	_m[t].m5 = 2;
+	_m[t].m5 = 0;
 }
 
 static inline void MakeCanal(TileIndex t, Owner o, uint8 random_bits)
@@ -150,38 +164,38 @@
 	SetTileType(t, MP_WATER);
 	SetTileOwner(t, o);
 	_m[t].m2 = 0;
-	_m[t].m3 = 0;
+	_m[t].m3 = WATER_CLASS_CANAL;
 	_m[t].m4 = random_bits;
 	_m[t].m5 = 0;
 }
 
-static inline void MakeShipDepot(TileIndex t, Owner o, DepotPart base, Axis a, Owner original_owner)
+static inline void MakeShipDepot(TileIndex t, Owner o, DepotPart base, Axis a, WaterClass original_water_class, Owner original_owner)
 {
 	SetTileType(t, MP_WATER);
 	SetTileOwner(t, o);
 	_m[t].m2 = 0;
-	_m[t].m3 = 0;
+	_m[t].m3 = original_water_class;
 	_m[t].m4 = original_owner;
 	_m[t].m5 = base + a * 2;
 }
 
-static inline void MakeLockTile(TileIndex t, Owner o, byte section)
+static inline void MakeLockTile(TileIndex t, Owner o, byte section, WaterClass original_water_class)
 {
 	SetTileType(t, MP_WATER);
 	SetTileOwner(t, o);
 	_m[t].m2 = 0;
-	_m[t].m3 = 0;
+	_m[t].m3 = original_water_class;
 	_m[t].m4 = 0;
 	_m[t].m5 = section;
 }
 
-static inline void MakeLock(TileIndex t, Owner o, DiagDirection d)
+static inline void MakeLock(TileIndex t, Owner o, DiagDirection d, WaterClass wc_lower, WaterClass wc_upper)
 {
 	TileIndexDiff delta = TileOffsByDiagDir(d);
 
-	MakeLockTile(t, o, LOCK_MIDDLE + d);
-	MakeLockTile(t - delta, o, LOCK_LOWER + d);
-	MakeLockTile(t + delta, o, LOCK_UPPER + d);
+	MakeLockTile(t, o, LOCK_MIDDLE + d, WATER_CLASS_CANAL);
+	MakeLockTile(t - delta, o, LOCK_LOWER + d, wc_lower);
+	MakeLockTile(t + delta, o, LOCK_UPPER + d, wc_upper);
 }
 
 #endif /* WATER_MAP_H */