changeset 3940:7f38159bcb1d draft

(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.
author peter1138 <peter1138@openttd.org>
date Sat, 03 Jun 2006 15:10:39 +0000
parents 092e19a5110e
children 24d9359cdd5d
files water_cmd.c water_map.h
diffstat 2 files changed, 26 insertions(+), 8 deletions(-) [+]
line wrap: on
line diff
--- a/water_cmd.c
+++ b/water_cmd.c
@@ -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
+++ b/water_map.h
@@ -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