summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/depot_base.h16
-rw-r--r--src/lang/english.txt3
-rw-r--r--src/rail_cmd.cpp2
-rw-r--r--src/road_cmd.cpp2
-rw-r--r--src/saveload/afterload.cpp8
-rw-r--r--src/saveload/depot_sl.cpp29
-rw-r--r--src/saveload/oldloader_sl.cpp2
-rw-r--r--src/saveload/saveload.cpp2
-rw-r--r--src/strings.cpp10
-rw-r--r--src/town_gui.cpp2
-rw-r--r--src/water_cmd.cpp2
11 files changed, 64 insertions, 14 deletions
diff --git a/src/depot_base.h b/src/depot_base.h
index 82d78eb60..8a7305088 100644
--- a/src/depot_base.h
+++ b/src/depot_base.h
@@ -19,8 +19,11 @@ typedef Pool<Depot, DepotID, 64, 64000> DepotPool;
extern DepotPool _depot_pool;
struct Depot : DepotPool::PoolItem<&_depot_pool> {
+ Town *town;
+ const char *name;
+
TileIndex xy;
- TownID town_index;
+ uint16 town_cn; ///< The Nth depot for this town (consecutive number)
Depot(TileIndex xy = INVALID_TILE) : xy(xy) {}
~Depot();
@@ -29,6 +32,17 @@ struct Depot : DepotPool::PoolItem<&_depot_pool> {
{
return Depot::Get(GetDepotIndex(tile));
}
+
+ /**
+ * Is the "type" of depot the same as the given depot,
+ * i.e. are both a rail, road or ship depots?
+ * @param d The depot to compare to.
+ * @return true iff their types are equal.
+ */
+ FORCEINLINE bool IsOfType(const Depot *d) const
+ {
+ return GetTileType(d->xy) == GetTileType(this->xy);
+ }
};
#define FOR_ALL_DEPOTS_FROM(var, start) FOR_ALL_ITEMS_FROM(Depot, depot_index, var, start)
diff --git a/src/lang/english.txt b/src/lang/english.txt
index f542cf576..c6e54c5d8 100644
--- a/src/lang/english.txt
+++ b/src/lang/english.txt
@@ -4060,8 +4060,11 @@ STR_FORMAT_WAYPOINT_NAME :{TOWN} Waypoint
STR_FORMAT_WAYPOINT_NAME_SERIAL :{TOWN} Waypoint #{COMMA}
STR_FORMAT_DEPOT_NAME_TRAIN :{TOWN} Train Depot
+STR_FORMAT_DEPOT_NAME_TRAIN_SERIAL :{TOWN} Train Depot #{COMMA}
STR_FORMAT_DEPOT_NAME_ROAD_VEHICLE :{TOWN} Road Vehicle Depot
+STR_FORMAT_DEPOT_NAME_ROAD_VEHICLE_SERIAL :{TOWN} Road Vehicle Depot #{COMMA}
STR_FORMAT_DEPOT_NAME_SHIP :{TOWN} Ship Depot
+STR_FORMAT_DEPOT_NAME_SHIP_SERIAL :{TOWN} Ship Depot #{COMMA}
STR_FORMAT_DEPOT_NAME_AIRCRAFT :{STATION} Hangar
STR_UNKNOWN_STATION :unknown station
diff --git a/src/rail_cmd.cpp b/src/rail_cmd.cpp
index 81bd3a5bc..abba2058f 100644
--- a/src/rail_cmd.cpp
+++ b/src/rail_cmd.cpp
@@ -867,10 +867,10 @@ CommandCost CmdBuildTrainDepot(TileIndex tile, DoCommandFlag flags, uint32 p1, u
if (flags & DC_EXEC) {
Depot *d = new Depot(tile);
- d->town_index = ClosestTownFromTile(tile, UINT_MAX)->index;
MakeRailDepot(tile, _current_company, d->index, dir, railtype);
MarkTileDirtyByTile(tile);
+ MakeDefaultName(d);
AddSideToSignalBuffer(tile, INVALID_DIAGDIR, _current_company);
YapfNotifyTrackLayoutChange(tile, DiagDirToDiagTrack(dir));
diff --git a/src/road_cmd.cpp b/src/road_cmd.cpp
index 27e84b44e..ac81ea005 100644
--- a/src/road_cmd.cpp
+++ b/src/road_cmd.cpp
@@ -909,10 +909,10 @@ CommandCost CmdBuildRoadDepot(TileIndex tile, DoCommandFlag flags, uint32 p1, ui
if (flags & DC_EXEC) {
Depot *dep = new Depot(tile);
- dep->town_index = ClosestTownFromTile(tile, UINT_MAX)->index;
MakeRoadDepot(tile, _current_company, dep->index, dir, rt);
MarkTileDirtyByTile(tile);
+ MakeDefaultName(dep);
}
cost.AddCost(_price[PR_BUILD_DEPOT_ROAD]);
return cost;
diff --git a/src/saveload/afterload.cpp b/src/saveload/afterload.cpp
index 4ff915742..9ab519242 100644
--- a/src/saveload/afterload.cpp
+++ b/src/saveload/afterload.cpp
@@ -2106,6 +2106,14 @@ bool AfterLoadGame()
/* Reset tropic zone for VOID tiles, they shall not have any. */
if (IsTileType(t, MP_VOID)) SetTropicZone(t, TROPICZONE_NORMAL);
}
+
+ /* We need to properly number/name the depots.
+ * The first step is making sure none of the depots uses the
+ * 'default' names, after that we can assign the names. */
+ Depot *d;
+ FOR_ALL_DEPOTS(d) d->town_cn = UINT16_MAX;
+
+ FOR_ALL_DEPOTS(d) MakeDefaultName(d);
}
/* Road stops is 'only' updating some caches */
diff --git a/src/saveload/depot_sl.cpp b/src/saveload/depot_sl.cpp
index 3ef999780..a0b32eaac 100644
--- a/src/saveload/depot_sl.cpp
+++ b/src/saveload/depot_sl.cpp
@@ -11,14 +11,20 @@
#include "../stdafx.h"
#include "../depot_base.h"
+#include "../town.h"
#include "saveload.h"
+static TownID _town_index;
+
static const SaveLoad _depot_desc[] = {
- SLE_CONDVAR(Depot, xy, SLE_FILE_U16 | SLE_VAR_U32, 0, 5),
- SLE_CONDVAR(Depot, xy, SLE_UINT32, 6, SL_MAX_VERSION),
- SLE_VAR(Depot, town_index, SLE_UINT16),
- SLE_END()
+ SLE_CONDVAR(Depot, xy, SLE_FILE_U16 | SLE_VAR_U32, 0, 5),
+ SLE_CONDVAR(Depot, xy, SLE_UINT32, 6, SL_MAX_VERSION),
+ SLEG_CONDVAR(_town_index, SLE_UINT16, 0, 140),
+ SLE_CONDREF(Depot, town, REF_TOWN, 141, SL_MAX_VERSION),
+ SLE_CONDVAR(Depot, town_cn, SLE_UINT16, 141, SL_MAX_VERSION),
+ SLE_CONDSTR(Depot, name, SLE_STR, 0, 141, SL_MAX_VERSION),
+ SLE_END()
};
static void Save_DEPT()
@@ -38,9 +44,22 @@ static void Load_DEPT()
while ((index = SlIterateArray()) != -1) {
Depot *depot = new (index) Depot();
SlObject(depot, _depot_desc);
+
+ /* Set the town 'pointer' so we can restore it later. */
+ if (CheckSavegameVersion(141)) depot->town = (Town *)_town_index;
+ }
+}
+
+static void Ptrs_DEPT()
+{
+ Depot *depot;
+
+ FOR_ALL_DEPOTS(depot) {
+ SlObject(depot, _depot_desc);
+ if (CheckSavegameVersion(141)) depot->town = Town::Get((size_t)depot->town);
}
}
extern const ChunkHandler _depot_chunk_handlers[] = {
- { 'DEPT', Save_DEPT, Load_DEPT, NULL, CH_ARRAY | CH_LAST},
+ { 'DEPT', Save_DEPT, Load_DEPT, Ptrs_DEPT, CH_ARRAY | CH_LAST},
};
diff --git a/src/saveload/oldloader_sl.cpp b/src/saveload/oldloader_sl.cpp
index 68c3daf7a..cc49d10b8 100644
--- a/src/saveload/oldloader_sl.cpp
+++ b/src/saveload/oldloader_sl.cpp
@@ -662,7 +662,7 @@ static bool LoadOldDepot(LoadgameState *ls, int num)
if (!LoadChunk(ls, d, depot_chunk)) return false;
if (d->xy != 0) {
- d->town_index = RemapTownIndex(_old_town_index);
+ d->town = Town::Get(RemapTownIndex(_old_town_index));
} else {
delete d;
}
diff --git a/src/saveload/saveload.cpp b/src/saveload/saveload.cpp
index 329ca2a5c..4f48080c2 100644
--- a/src/saveload/saveload.cpp
+++ b/src/saveload/saveload.cpp
@@ -46,7 +46,7 @@
#include "saveload_internal.h"
-extern const uint16 SAVEGAME_VERSION = 140;
+extern const uint16 SAVEGAME_VERSION = 141;
SavegameType _savegame_type; ///< type of savegame we are loading
diff --git a/src/strings.cpp b/src/strings.cpp
index 1f9d96096..6e1130227 100644
--- a/src/strings.cpp
+++ b/src/strings.cpp
@@ -947,8 +947,14 @@ static char *FormatString(char *buff, const char *str, int64 *argv, uint casei,
case SCC_DEPOT_NAME: { // {DEPOT}
VehicleType vt = (VehicleType)GetInt32(&argv);
- int64 temp[1] = { vt == VEH_AIRCRAFT ? GetInt32(&argv) : Depot::Get(GetInt32(&argv))->town_index };
- buff = GetStringWithArgs(buff, STR_FORMAT_DEPOT_NAME_TRAIN + vt, temp, last);
+ if (vt == VEH_AIRCRAFT) {
+ int64 temp[] = { GetInt32(&argv) };
+ buff = GetStringWithArgs(buff, STR_FORMAT_DEPOT_NAME_AIRCRAFT + vt, temp, last);
+ } else {
+ const Depot *d = Depot::Get(GetInt32(&argv));
+ int64 temp[] = { d->town->index, d->town_cn + 1 };
+ buff = GetStringWithArgs(buff, STR_FORMAT_DEPOT_NAME_TRAIN + 2 * vt + (d->town_cn == 0 ? 0 : 1), temp, last);
+ }
break;
}
diff --git a/src/town_gui.cpp b/src/town_gui.cpp
index 4cbc209c4..f2e5bebfb 100644
--- a/src/town_gui.cpp
+++ b/src/town_gui.cpp
@@ -489,7 +489,7 @@ public:
/* Depots refer to towns. */
const Depot *d;
FOR_ALL_DEPOTS(d) {
- if (d->town_index == this->town->index) return false;
+ if (d->town == this->town) return false;
}
/* Check all tiles for town ownership. */
diff --git a/src/water_cmd.cpp b/src/water_cmd.cpp
index e93b268db..4f05633aa 100644
--- a/src/water_cmd.cpp
+++ b/src/water_cmd.cpp
@@ -130,12 +130,12 @@ CommandCost CmdBuildShipDepot(TileIndex tile, DoCommandFlag flags, uint32 p1, ui
if (flags & DC_EXEC) {
Depot *depot = new Depot(tile);
- depot->town_index = ClosestTownFromTile(tile, UINT_MAX)->index;
MakeShipDepot(tile, _current_company, depot->index, DEPOT_NORTH, axis, wc1);
MakeShipDepot(tile2, _current_company, depot->index, DEPOT_SOUTH, axis, wc2);
MarkTileDirtyByTile(tile);
MarkTileDirtyByTile(tile2);
+ MakeDefaultName(depot);
}
return CommandCost(EXPENSES_CONSTRUCTION, _price[PR_BUILD_DEPOT_SHIP]);