changeset 12999:07a634b14de8 draft

(svn r17493) -Codechange: store the depot index on the map
author rubidium <rubidium@openttd.org>
date Thu, 10 Sep 2009 14:33:07 +0000
parents c71e77a71cad
children ddc019d8b839
files docs/landscape.html docs/landscape_grid.html src/depot_map.h src/rail_cmd.cpp src/rail_map.h src/road_cmd.cpp src/road_map.h src/saveload/afterload.cpp src/town_cmd.cpp src/water_cmd.cpp src/water_map.h
diffstat 11 files changed, 45 insertions(+), 15 deletions(-) [+]
line wrap: on
line diff
--- a/docs/landscape.html
+++ b/docs/landscape.html
@@ -454,6 +454,7 @@
      </li>
      <li>m5 bit 7 set, bit 6 set: railway depot
       <ul>
+       <li>m2: Depot index</li>
        <li>m5 bits 1..0: exit towards
         <table>
          <tr>
@@ -609,6 +610,7 @@
      <li>m5 bit 7 set, bit 6 clear: road depot
       <ul>
        <li>m1: <a href="#OwnershipInfo">owner</a> of the depot</li>
+       <li>m2: Depot index</li>
        <li>m5 bits 3..0: exit towards:
         <table>
          <tr>
@@ -952,6 +954,7 @@
    <td>
     <ul>
      <li>m1: <a href="#OwnershipInfo">owner</a> (for sea, rivers, and coasts normally <tt>11</tt>)</li>
+     <li>m2: Depot index (for depots only)</li>
      <li>m3 bits 1..0 : Water class (sea, canal or river)
      <li>m4: Random data for canal or river tiles</li>
      <li>m5: tile type:
--- a/docs/landscape_grid.html
+++ b/docs/landscape_grid.html
@@ -112,7 +112,7 @@
       <td class="caption">depot</td>
       <td class="bits">-inherit-</td>
       <td class="bits">-inherit-</td>
-      <td class="bits"><span class="free">OOOO OOOO OOOO OOOO</span></td>
+      <td class="bits">XXXX XXXX XXXX XXXX</td>
       <td class="bits"><span class="free">OOOO</span> <span class="option">~~</span>XX</td>
       <td class="bits"><span class="free">OOOO</span> XXXX</td>
       <td class="bits">XX<span class="free">O</span>X <span class="free">O</span>XXX</td>
@@ -146,7 +146,7 @@
       <td class="caption">road depot</td>
       <td class="bits">-inherit-</td>
       <td class="bits">-inherit-</td>
-      <td class="bits">-inherit-</td>
+      <td class="bits">XXXX XXXX XXXX XXXX</td>
       <td class="bits"><span class="free">OOOO OOOO</span></td>
       <td class="bits"><span class="free">OOOO OOOO</span></td>
       <td class="bits">XX<span class="free">OO OO</span>XX</td>
@@ -282,7 +282,7 @@
       <td class="caption">shipdepot</td>
       <td class="bits">-inherit-</td>
       <td class="bits">-inherit-</td>
-      <td class="bits"><span class="free">OOOO OOOO OOOO OOOO</span></td>
+      <td class="bits">XXXX XXXX XXXX XXXX</td>
       <td class="bits"><span class="free">OOOO OO</span>XX</td>
       <td class="bits"><span class="free">OOOO OOOO</span></td>
       <td class="bits">-inherit-</td>
--- a/src/depot_map.h
+++ b/src/depot_map.h
@@ -45,4 +45,17 @@
 	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 */
--- a/src/rail_cmd.cpp
+++ b/src/rail_cmd.cpp
@@ -789,11 +789,11 @@
 
 	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));
 	}
--- 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 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;
--- a/src/road_cmd.cpp
+++ b/src/road_cmd.cpp
@@ -882,7 +882,7 @@
 		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);
--- 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 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;
--- 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 @@
 		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);
--- a/src/town_cmd.cpp
+++ b/src/town_cmd.cpp
@@ -2730,6 +2730,8 @@
 {
 	switch (GetTileType(tile)) {
 		case MP_ROAD:
+			if (IsRoadDepot(tile)) return CalcClosestTownFromTile(tile, threshold);
+
 			if (!HasTownOwnedRoad(tile)) {
 				TownID tid = GetTownIndex(tile);
 
--- a/src/water_cmd.cpp
+++ b/src/water_cmd.cpp
@@ -141,8 +141,8 @@
 		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);
 	}
--- 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 @@
 	_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;