mirror of https://github.com/OpenTTD/OpenTTD.git
(svn r19799) -Change: give depots an unique name in the same manner buoys and waypoints are named
This commit is contained in:
parent
863ff6522b
commit
93ff7d78e1
|
@ -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)
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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));
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -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},
|
||||
};
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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. */
|
||||
|
|
|
@ -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]);
|
||||
|
|
Loading…
Reference in New Issue