changeset 15170:432bee68ef70 draft

(svn r19799) -Change: give depots an unique name in the same manner buoys and waypoints are named
author rubidium <rubidium@openttd.org>
date Wed, 12 May 2010 19:21:00 +0000
parents ffd7a74a25a0
children af63fbdbbf80
files src/depot_base.h src/lang/english.txt src/rail_cmd.cpp src/road_cmd.cpp src/saveload/afterload.cpp src/saveload/depot_sl.cpp src/saveload/oldloader_sl.cpp src/saveload/saveload.cpp src/strings.cpp src/town_gui.cpp src/water_cmd.cpp
diffstat 11 files changed, 64 insertions(+), 14 deletions(-) [+]
line wrap: on
line diff
--- a/src/depot_base.h
+++ b/src/depot_base.h
@@ -19,8 +19,11 @@
 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 @@
 	{
 		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)
--- a/src/lang/english.txt
+++ b/src/lang/english.txt
@@ -4060,8 +4060,11 @@
 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
--- a/src/rail_cmd.cpp
+++ b/src/rail_cmd.cpp
@@ -867,10 +867,10 @@
 
 	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));
--- a/src/road_cmd.cpp
+++ b/src/road_cmd.cpp
@@ -909,10 +909,10 @@
 
 	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;
--- a/src/saveload/afterload.cpp
+++ b/src/saveload/afterload.cpp
@@ -2106,6 +2106,14 @@
 			/* 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 */
--- 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 @@
 	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},
 };
--- a/src/saveload/oldloader_sl.cpp
+++ b/src/saveload/oldloader_sl.cpp
@@ -662,7 +662,7 @@
 	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;
 	}
--- 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
 
--- a/src/strings.cpp
+++ b/src/strings.cpp
@@ -947,8 +947,14 @@
 
 			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;
 			}
 
--- a/src/town_gui.cpp
+++ b/src/town_gui.cpp
@@ -489,7 +489,7 @@
 		/* 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. */
--- a/src/water_cmd.cpp
+++ b/src/water_cmd.cpp
@@ -130,12 +130,12 @@
 
 	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]);