changeset 18837:a95e291b93b3 draft

(svn r23686) -Fix [FS#4921] (r23413): Infrastructure count of canals/locks/ship depots wasn't updated properly when a company went into bankruptcy or was taken over.
author michi_cc <michi_cc@openttd.org>
date Thu, 29 Dec 2011 20:10:06 +0000
parents 111d36804d79
children 2ec03d6f7fa6
files src/water_cmd.cpp
diffstat 1 files changed, 14 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/src/water_cmd.cpp
+++ b/src/water_cmd.cpp
@@ -1259,9 +1259,20 @@
 	if (!IsTileOwner(tile, old_owner)) return;
 
 	/* No need to dirty company windows here, we'll redraw the whole screen anyway. */
-	if (IsCanal(tile)) Company::Get(old_owner)->infrastructure.water--;
+	if (IsLock(tile) && GetLockPart(tile) == LOCK_PART_MIDDLE) Company::Get(old_owner)->infrastructure.water -= 3 * LOCK_DEPOT_TILE_FACTOR; // Lock has three parts.
 	if (new_owner != INVALID_OWNER) {
-		if (IsCanal(tile)) Company::Get(new_owner)->infrastructure.water++;
+		if (IsLock(tile) && GetLockPart(tile) == LOCK_PART_MIDDLE) Company::Get(new_owner)->infrastructure.water += 3 * LOCK_DEPOT_TILE_FACTOR; // Lock has three parts.
+		/* Only subtract from the old owner here if the new owner is valid,
+		 * otherwise we clear ship depots and canal water below. */
+		if (GetWaterClass(tile) == WATER_CLASS_CANAL) {
+			Company::Get(old_owner)->infrastructure.water--;
+			Company::Get(new_owner)->infrastructure.water++;
+		}
+		if (IsShipDepot(tile)) {
+			Company::Get(old_owner)->infrastructure.water -= LOCK_DEPOT_TILE_FACTOR;
+			Company::Get(new_owner)->infrastructure.water += LOCK_DEPOT_TILE_FACTOR;
+		}
+
 		SetTileOwner(tile, new_owner);
 		return;
 	}
@@ -1272,7 +1283,7 @@
 	/* Set owner of canals and locks ... and also canal under dock there was before.
 	 * Check if the new owner after removing depot isn't OWNER_WATER. */
 	if (IsTileOwner(tile, old_owner)) {
-		if (IsCanal(tile)) Company::Get(old_owner)->infrastructure.water--;
+		if (GetWaterClass(tile) == WATER_CLASS_CANAL) Company::Get(old_owner)->infrastructure.water--;
 		SetTileOwner(tile, OWNER_NONE);
 	}
 }