From 07f69d8b88f8252e38bb728702b4548d1656b188 Mon Sep 17 00:00:00 2001 From: frosch Date: Thu, 9 Feb 2012 22:38:39 +0000 Subject: [PATCH] (svn r23920) -Fix: Consider only the middle tile of a lock for lock-infrastructure costs. The other two tiles may be owned by other companies. Also do not count the middle tile of a lock as canal, independent of whether it is build on ground or river slope. --- src/saveload/company_sl.cpp | 9 ++++++++- src/water_cmd.cpp | 13 +++++++------ 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/src/saveload/company_sl.cpp b/src/saveload/company_sl.cpp index 588d0fb180..e9cd02d95c 100644 --- a/src/saveload/company_sl.cpp +++ b/src/saveload/company_sl.cpp @@ -173,7 +173,14 @@ void AfterLoadCompanyStats() case MP_WATER: if (IsShipDepot(tile) || IsLock(tile)) { c = Company::GetIfValid(GetTileOwner(tile)); - if (c != NULL) c->infrastructure.water += LOCK_DEPOT_TILE_FACTOR; + if (c != NULL) { + if (IsShipDepot(tile)) c->infrastructure.water += LOCK_DEPOT_TILE_FACTOR; + if (IsLock(tile) && GetLockPart(tile) == LOCK_PART_MIDDLE) { + /* The middle tile specifies the owner of the lock. */ + c->infrastructure.water += 3 * LOCK_DEPOT_TILE_FACTOR; // the middle tile specifies the owner of the + break; // do not count the middle tile as canal + } + } } /* FALL THROUGH */ diff --git a/src/water_cmd.cpp b/src/water_cmd.cpp index edaa30132a..8fbdf17f19 100644 --- a/src/water_cmd.cpp +++ b/src/water_cmd.cpp @@ -290,7 +290,6 @@ static CommandCost DoBuildLock(TileIndex tile, DiagDirection dir, DoCommandFlag Company *c = Company::GetIfValid(_current_company); if (c != NULL) { /* Counts for the water. */ - c->infrastructure.water++; if (!IsWaterTile(tile - delta)) c->infrastructure.water++; if (!IsWaterTile(tile + delta)) c->infrastructure.water++; /* Count for the lock itself. */ @@ -335,7 +334,7 @@ static CommandCost RemoveLock(TileIndex tile, DoCommandFlag flags) /* Remove middle part from company infrastructure count. */ Company *c = Company::GetIfValid(GetTileOwner(tile)); if (c != NULL) { - c->infrastructure.water -= 1 + 3 * LOCK_DEPOT_TILE_FACTOR; // Middle tile + three parts of the lock. + c->infrastructure.water -= 3 * LOCK_DEPOT_TILE_FACTOR; // three parts of the lock. DirtyCompanyInfrastructureWindows(c->index); } @@ -1259,13 +1258,15 @@ static void ChangeTileOwner_Water(TileIndex tile, Owner old_owner, Owner new_own { if (!IsTileOwner(tile, old_owner)) return; + bool is_lock_middle = IsLock(tile) && GetLockPart(tile) == LOCK_PART_MIDDLE; + /* No need to dirty company windows here, we'll redraw the whole screen anyway. */ - if (IsLock(tile) && GetLockPart(tile) == LOCK_PART_MIDDLE) Company::Get(old_owner)->infrastructure.water -= 3 * LOCK_DEPOT_TILE_FACTOR; // Lock has three parts. + if (is_lock_middle) Company::Get(old_owner)->infrastructure.water -= 3 * LOCK_DEPOT_TILE_FACTOR; // Lock has three parts. if (new_owner != INVALID_OWNER) { - if (IsLock(tile) && GetLockPart(tile) == LOCK_PART_MIDDLE) Company::Get(new_owner)->infrastructure.water += 3 * LOCK_DEPOT_TILE_FACTOR; // Lock has three parts. + if (is_lock_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) { + if (GetWaterClass(tile) == WATER_CLASS_CANAL && !is_lock_middle) { Company::Get(old_owner)->infrastructure.water--; Company::Get(new_owner)->infrastructure.water++; } @@ -1284,7 +1285,7 @@ static void ChangeTileOwner_Water(TileIndex tile, Owner old_owner, Owner new_own /* 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 (GetWaterClass(tile) == WATER_CLASS_CANAL) Company::Get(old_owner)->infrastructure.water--; + if (GetWaterClass(tile) == WATER_CLASS_CANAL && !is_lock_middle) Company::Get(old_owner)->infrastructure.water--; SetTileOwner(tile, OWNER_NONE); } }