(svn r5084) - Add owner attribute to canals and locks. This makes them more useful in multiplayer games, as before, anyone could delete any canal or lock tile. This doesn't affect whose ships can use whose canals or locks.
authorpeter1138
Sat, 03 Jun 2006 15:10:39 +0000
changeset 3940 f3aa8e2969d4
parent 3939 ad6a197e1c2f
child 3941 34116fc17887
(svn r5084) - Add owner attribute to canals and locks. This makes them more useful in multiplayer games, as before, anyone could delete any canal or lock tile. This doesn't affect whose ships can use whose canals or locks.
water_cmd.c
water_map.h
--- a/water_cmd.c	Sat Jun 03 12:53:29 2006 +0000
+++ b/water_cmd.c	Sat Jun 03 15:10:39 2006 +0000
@@ -148,7 +148,7 @@
 	}
 
 	if (flags & DC_EXEC) {
-		MakeLock(tile, dir);
+		MakeLock(tile, _current_player, dir);
 		MarkTileDirtyByTile(tile);
 		MarkTileDirtyByTile(tile - delta);
 		MarkTileDirtyByTile(tile + delta);
@@ -161,6 +161,8 @@
 {
 	TileIndexDiff delta = TileOffsByDir(GetLockDirection(tile));
 
+	if (!CheckTileOwnership(tile)) return CMD_ERROR;
+
 	// make sure no vehicle is on the tile.
 	if (!EnsureNoVehicle(tile) || !EnsureNoVehicle(tile + delta) || !EnsureNoVehicle(tile - delta))
 		return CMD_ERROR;
@@ -249,7 +251,11 @@
 		cost += ret;
 
 		if (flags & DC_EXEC) {
-			MakeWater(tile);
+			if (TileHeight(tile) == 0) {
+				MakeWater(tile);
+			} else {
+				MakeCanal(tile, _current_player);
+			}
 			MarkTileDirtyByTile(tile);
 			MarkTilesAroundDirty(tile);
 		}
@@ -279,6 +285,8 @@
 				return_cmd_error(STR_0002_TOO_CLOSE_TO_EDGE_OF_MAP);
 			}
 
+			if (GetTileOwner(tile) != OWNER_WATER && !CheckTileOwnership(tile)) return CMD_ERROR;
+
 			if (flags & DC_EXEC) DoClearSquare(tile);
 			return _price.clear_water;
 
--- a/water_map.h	Sat Jun 03 12:53:29 2006 +0000
+++ b/water_map.h	Sat Jun 03 15:10:39 2006 +0000
@@ -95,6 +95,16 @@
 	_m[t].m5 = 1;
 }
 
+static inline void MakeCanal(TileIndex t, Owner o)
+{
+	SetTileType(t, MP_WATER);
+	SetTileOwner(t, o);
+	_m[t].m2 = 0;
+	_m[t].m3 = 0;
+	_m[t].m4 = 0;
+	_m[t].m5 = 0;
+}
+
 static inline void MakeShipDepot(TileIndex t, Owner o, DepotPart base, Axis a)
 {
 	SetTileType(t, MP_WATER);
@@ -105,23 +115,23 @@
 	_m[t].m5 = base + a * 2;
 }
 
-static inline void MakeLockTile(TileIndex t, byte section)
+static inline void MakeLockTile(TileIndex t, Owner o, byte section)
 {
 	SetTileType(t, MP_WATER);
-	SetTileOwner(t, OWNER_WATER);
+	SetTileOwner(t, o);
 	_m[t].m2 = 0;
 	_m[t].m3 = 0;
 	_m[t].m4 = 0;
 	_m[t].m5 = section;
 }
 
-static inline void MakeLock(TileIndex t, DiagDirection d)
+static inline void MakeLock(TileIndex t, Owner o, DiagDirection d)
 {
 	TileIndexDiff delta = TileOffsByDir(d);
 
-	MakeLockTile(t, LOCK_MIDDLE + d);
-	MakeLockTile(t - delta, LOCK_LOWER + d);
-	MakeLockTile(t + delta, LOCK_UPPER + d);
+	MakeLockTile(t, o, LOCK_MIDDLE + d);
+	MakeLockTile(t - delta, o, LOCK_LOWER + d);
+	MakeLockTile(t + delta, o, LOCK_UPPER + d);
 }
 
 #endif