@@ -952,6 +954,7 @@
- m1: owner (for sea, rivers, and coasts normally 11)
+ - m2: Depot index (for depots only)
- m3 bits 1..0 : Water class (sea, canal or river)
- m4: Random data for canal or river tiles
- m5: tile type:
diff --git a/docs/landscape_grid.html b/docs/landscape_grid.html
--- a/docs/landscape_grid.html
+++ b/docs/landscape_grid.html
@@ -112,7 +112,7 @@ the array so you can quickly see what is
depot |
-inherit- |
-inherit- |
- OOOO OOOO OOOO OOOO |
+ XXXX XXXX XXXX XXXX |
OOOO ~~XX |
OOOO XXXX |
XXOX OXXX |
@@ -146,7 +146,7 @@ the array so you can quickly see what is
road depot |
-inherit- |
-inherit- |
- -inherit- |
+ XXXX XXXX XXXX XXXX |
OOOO OOOO |
OOOO OOOO |
XXOO OOXX |
@@ -282,7 +282,7 @@ the array so you can quickly see what is
shipdepot |
-inherit- |
-inherit- |
- OOOO OOOO OOOO OOOO |
+ XXXX XXXX XXXX XXXX |
OOOO OOXX |
OOOO OOOO |
-inherit- |
diff --git a/src/depot_map.h b/src/depot_map.h
--- a/src/depot_map.h
+++ b/src/depot_map.h
@@ -45,4 +45,17 @@ static inline bool IsDepotTile(TileIndex
return IsRailDepotTile(tile) || IsRoadDepotTile(tile) || IsShipDepotTile(tile) || IsHangarTile(tile);
}
+/**
+ * Get the index of which depot is attached to the tile.
+ * @param t the tile
+ * @pre IsRailDepotTile(t) || IsRoadDepotTile(t) || IsShipDepotTile(t)
+ * @return DepotID
+ */
+static inline DepotID GetDepotIndex(TileIndex t)
+{
+ /* Hangars don't have a Depot class, thus store no DepotID. */
+ assert(IsRailDepotTile(t) || IsRoadDepotTile(t) || IsShipDepotTile(t));
+ return _m[t].m2;
+}
+
#endif /* DEPOT_MAP_H */
diff --git a/src/rail_cmd.cpp b/src/rail_cmd.cpp
--- a/src/rail_cmd.cpp
+++ b/src/rail_cmd.cpp
@@ -789,11 +789,11 @@ CommandCost CmdBuildTrainDepot(TileIndex
if (flags & DC_EXEC) {
Depot *d = new Depot(tile);
- MakeRailDepot(tile, _current_company, dir, (RailType)p1);
+ d->town_index = ClosestTownFromTile(tile, UINT_MAX)->index;
+
+ MakeRailDepot(tile, _current_company, d->index, dir, (RailType)p1);
MarkTileDirtyByTile(tile);
- d->town_index = ClosestTownFromTile(tile, UINT_MAX)->index;
-
AddSideToSignalBuffer(tile, INVALID_DIAGDIR, _current_company);
YapfNotifyTrackLayoutChange(tile, DiagDirToDiagTrack(dir));
}
diff --git a/src/rail_map.h b/src/rail_map.h
--- a/src/rail_map.h
+++ b/src/rail_map.h
@@ -13,6 +13,7 @@
#define RAIL_MAP_H
#include "rail_type.h"
+#include "depot_type.h"
#include "signal_func.h"
#include "direction_func.h"
#include "track_func.h"
@@ -551,11 +552,11 @@ static inline void MakeRailNormal(TileIn
}
-static inline void MakeRailDepot(TileIndex t, Owner o, DiagDirection d, RailType r)
+static inline void MakeRailDepot(TileIndex t, Owner o, DepotID did, DiagDirection d, RailType r)
{
SetTileType(t, MP_RAILWAY);
SetTileOwner(t, o);
- _m[t].m2 = 0;
+ _m[t].m2 = did;
_m[t].m3 = r;
_m[t].m4 = 0;
_m[t].m5 = RAIL_TILE_DEPOT << 6 | d;
diff --git a/src/road_cmd.cpp b/src/road_cmd.cpp
--- a/src/road_cmd.cpp
+++ b/src/road_cmd.cpp
@@ -882,7 +882,7 @@ CommandCost CmdBuildRoadDepot(TileIndex
Depot *dep = new Depot(tile);
dep->town_index = ClosestTownFromTile(tile, UINT_MAX)->index;
- MakeRoadDepot(tile, _current_company, dir, rt);
+ MakeRoadDepot(tile, _current_company, dep->index, dir, rt);
MarkTileDirtyByTile(tile);
}
return cost.AddCost(_price.build_road_depot);
diff --git a/src/road_map.h b/src/road_map.h
--- a/src/road_map.h
+++ b/src/road_map.h
@@ -13,6 +13,7 @@
#define ROAD_MAP_H
#include "track_func.h"
+#include "depot_type.h"
#include "rail_type.h"
#include "town_type.h"
#include "road_func.h"
@@ -407,11 +408,11 @@ static inline void MakeRoadCrossing(Tile
}
-static inline void MakeRoadDepot(TileIndex t, Owner owner, DiagDirection dir, RoadType rt)
+static inline void MakeRoadDepot(TileIndex t, Owner owner, DepotID did, DiagDirection dir, RoadType rt)
{
SetTileType(t, MP_ROAD);
SetTileOwner(t, owner);
- _m[t].m2 = 0;
+ _m[t].m2 = did;
_m[t].m3 = 0;
_m[t].m4 = 0;
_m[t].m5 = ROAD_TILE_DEPOT << 6 | dir;
diff --git a/src/saveload/afterload.cpp b/src/saveload/afterload.cpp
--- a/src/saveload/afterload.cpp
+++ b/src/saveload/afterload.cpp
@@ -13,6 +13,7 @@
#include "../void_map.h"
#include "../signs_base.h"
#include "../roadstop_base.h"
+#include "../depot_base.h"
#include "../window_func.h"
#include "../fios.h"
#include "../train.h"
@@ -1951,6 +1952,14 @@ bool AfterLoadGame()
FOR_ALL_STATIONS(st) UpdateStationAcceptance(st, false);
}
+ if (CheckSavegameVersion(128)) {
+ const Depot *d;
+ FOR_ALL_DEPOTS(d) {
+ _m[d->xy].m2 = d->index;
+ if (IsTileType(d->xy, MP_WATER)) _m[GetOtherShipDepotTile(d->xy)].m2 = d->index;
+ }
+ }
+
AfterLoadLabelMaps();
GamelogPrintDebug(1);
diff --git a/src/town_cmd.cpp b/src/town_cmd.cpp
--- a/src/town_cmd.cpp
+++ b/src/town_cmd.cpp
@@ -2730,6 +2730,8 @@ Town *ClosestTownFromTile(TileIndex tile
{
switch (GetTileType(tile)) {
case MP_ROAD:
+ if (IsRoadDepot(tile)) return CalcClosestTownFromTile(tile, threshold);
+
if (!HasTownOwnedRoad(tile)) {
TownID tid = GetTownIndex(tile);
diff --git a/src/water_cmd.cpp b/src/water_cmd.cpp
--- a/src/water_cmd.cpp
+++ b/src/water_cmd.cpp
@@ -141,8 +141,8 @@ CommandCost CmdBuildShipDepot(TileIndex
Depot *depot = new Depot(tile);
depot->town_index = ClosestTownFromTile(tile, UINT_MAX)->index;
- MakeShipDepot(tile, _current_company, DEPOT_NORTH, axis, wc1);
- MakeShipDepot(tile2, _current_company, DEPOT_SOUTH, axis, wc2);
+ MakeShipDepot(tile, _current_company, depot->index, DEPOT_NORTH, axis, wc1);
+ MakeShipDepot(tile2, _current_company, depot->index, DEPOT_SOUTH, axis, wc2);
MarkTileDirtyByTile(tile);
MarkTileDirtyByTile(tile2);
}
diff --git a/src/water_map.h b/src/water_map.h
--- a/src/water_map.h
+++ b/src/water_map.h
@@ -13,6 +13,7 @@
#define WATER_MAP_H
#include "core/math_func.hpp"
+#include "depot_type.h"
enum WaterTileType {
WATER_TILE_CLEAR,
@@ -196,11 +197,11 @@ static inline void MakeCanal(TileIndex t
_me[t].m7 = 0;
}
-static inline void MakeShipDepot(TileIndex t, Owner o, DepotPart base, Axis a, WaterClass original_water_class)
+static inline void MakeShipDepot(TileIndex t, Owner o, DepotID did, DepotPart base, Axis a, WaterClass original_water_class)
{
SetTileType(t, MP_WATER);
SetTileOwner(t, o);
- _m[t].m2 = 0;
+ _m[t].m2 = did;
_m[t].m3 = original_water_class;
_m[t].m4 = 0;
_m[t].m5 = base + a * 2;
|