summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorsmatz <smatz@openttd.org>2009-02-26 14:07:42 +0000
committersmatz <smatz@openttd.org>2009-02-26 14:07:42 +0000
commit3fdac6f702b0a2e8534b8f1c26faba02118ed8df (patch)
tree0664bda97b6877da1207d3896c81ef561dbf9313
parenta41b143e58d1290f36ab62fd402953a05e9b7e0b (diff)
downloadopenttd-3fdac6f702b0a2e8534b8f1c26faba02118ed8df.tar.xz
(svn r15588) -Fix: change owner of waypoints and deleted stations when merging companies or when a company benkrupts
-rw-r--r--src/economy.cpp18
-rw-r--r--src/saveload/afterload.cpp28
-rw-r--r--src/station_cmd.cpp4
3 files changed, 39 insertions, 11 deletions
diff --git a/src/economy.cpp b/src/economy.cpp
index eaea1dd6e..c4a6e9a84 100644
--- a/src/economy.cpp
+++ b/src/economy.cpp
@@ -398,6 +398,24 @@ void ChangeOwnershipOfCompanyItems(Owner old_owner, Owner new_owner)
UpdateSignalsInBuffer();
}
+ /* convert owner of stations (including deleted ones, but excluding buoys) */
+ Station *st;
+ FOR_ALL_STATIONS(st) {
+ if (st->owner == old_owner) {
+ /* if a company goes bankrupt, set owner to OWNER_NONE so the sign doesn't disappear immediately
+ * also, drawing station window would cause reading invalid company's colour */
+ st->owner = new_owner == INVALID_OWNER ? OWNER_NONE : new_owner;
+ }
+ }
+
+ /* do the same for waypoints (we need to do this here so deleted waypoints are converted too) */
+ Waypoint *wp;
+ FOR_ALL_WAYPOINTS(wp) {
+ if (wp->owner == old_owner) {
+ wp->owner = new_owner == INVALID_OWNER ? OWNER_NONE : new_owner;
+ }
+ }
+
/* In all cases clear replace engine rules.
* Even if it was copied, it could interfere with new owner's rules */
RemoveAllEngineReplacementForCompany(GetCompany(old_owner));
diff --git a/src/saveload/afterload.cpp b/src/saveload/afterload.cpp
index 97f114c4e..2f2362a81 100644
--- a/src/saveload/afterload.cpp
+++ b/src/saveload/afterload.cpp
@@ -1615,14 +1615,6 @@ bool AfterLoadGame()
}
}
}
-
- /* Give owners to waypoints, based on rail tracks it is sitting on.
- * If none is available, specify OWNER_NONE */
- Waypoint *wp;
- FOR_ALL_WAYPOINTS(wp) {
- Owner owner = (IsRailWaypointTile(wp->xy) ? GetTileOwner(wp->xy) : OWNER_NONE);
- wp->owner = IsValidCompanyID(owner) ? owner : OWNER_NONE;
- }
}
if (CheckSavegameVersion(102)) {
@@ -1722,6 +1714,26 @@ bool AfterLoadGame()
}
}
+ if (CheckSavegameVersion(114)) {
+ /* There could be (deleted) stations with invalid owner, set owner to OWNER NONE.
+ * The conversion affects oil rigs and buoys too, but it doesn't matter as
+ * they have st->owner == OWNER_NONE already. */
+ Station *st;
+ FOR_ALL_STATIONS(st) {
+ if (!IsValidCompanyID(st->owner)) st->owner = OWNER_NONE;
+ }
+
+ /* Give owners to waypoints, based on rail tracks it is sitting on.
+ * If none is available, specify OWNER_NONE.
+ * This code was in CheckSavegameVersion(101) in the past, but in some cases,
+ * the owner of waypoints could be incorrect. */
+ Waypoint *wp;
+ FOR_ALL_WAYPOINTS(wp) {
+ Owner owner = IsTileType(wp->xy, MP_RAILWAY) ? GetTileOwner(wp->xy) : OWNER_NONE;
+ wp->owner = IsValidCompanyID(owner) ? owner : OWNER_NONE;
+ }
+ }
+
GamelogPrintDebug(1);
bool ret = InitializeWindowsAndCaches();
diff --git a/src/station_cmd.cpp b/src/station_cmd.cpp
index 8c3b1c737..1e19cc55d 100644
--- a/src/station_cmd.cpp
+++ b/src/station_cmd.cpp
@@ -3120,10 +3120,8 @@ static void ChangeTileOwner_Station(TileIndex tile, Owner old_owner, Owner new_o
if (!IsTileOwner(tile, old_owner)) return;
if (new_owner != INVALID_OWNER) {
- Station *st = GetStationByTile(tile);
-
+ /* for buoys, owner of tile is owner of water, st->owner == OWNER_NONE */
SetTileOwner(tile, new_owner);
- if (!IsBuoy(tile)) st->owner = new_owner; // do not set st->owner for buoys
InvalidateWindowClassesData(WC_STATION_LIST, 0);
} else {
if (IsDriveThroughStopTile(tile)) {