summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorfonsinchen <fonsinchen@openttd.org>2013-06-09 12:49:47 +0000
committerfonsinchen <fonsinchen@openttd.org>2013-06-09 12:49:47 +0000
commitdb671ffb8673c5088749663e64713d9b852ec1e5 (patch)
tree132d0af53b5101417f0ddd01feedc703d8d614a9
parentc8f068d979251fb6963a56e3c0f9dac5b9897c72 (diff)
downloadopenttd-db671ffb8673c5088749663e64713d9b852ec1e5.tar.xz
(svn r25346) -Codechange: Glue between stations and flow stats
-rw-r--r--src/station.cpp5
-rw-r--r--src/station_base.h28
-rw-r--r--src/station_cmd.cpp14
3 files changed, 47 insertions, 0 deletions
diff --git a/src/station.cpp b/src/station.cpp
index da5f09025..9f078a1a2 100644
--- a/src/station.cpp
+++ b/src/station.cpp
@@ -97,6 +97,11 @@ Station::~Station()
delete lg;
}
}
+ Station *st;
+ FOR_ALL_STATIONS(st) {
+ GoodsEntry *ge = &st->goods[c];
+ ge->flows.DeleteFlows(this->index);
+ }
}
Vehicle *v;
diff --git a/src/station_base.h b/src/station_base.h
index 200d97a97..b83c044a2 100644
--- a/src/station_base.h
+++ b/src/station_base.h
@@ -196,6 +196,7 @@ struct GoodsEntry {
LinkGraphID link_graph; ///< Link graph this station belongs to.
NodeID node; ///< ID of node in link graph referring to this goods entry.
+ FlowStatMap flows; ///< Planned flows through this station.
/**
* Reports whether a vehicle has ever tried to load the cargo at this station.
@@ -212,6 +213,33 @@ struct GoodsEntry {
{
return HasBit(this->acceptance_pickup, GES_PICKUP);
}
+
+ uint GetSumFlowVia(StationID via) const;
+
+ /**
+ * Get the best next hop for a cargo packet from station source.
+ * @param source Source of the packet.
+ * @return The chosen next hop or INVALID_STATION if none was found.
+ */
+ inline StationID GetVia(StationID source) const
+ {
+ FlowStatMap::const_iterator flow_it(this->flows.find(source));
+ return flow_it != this->flows.end() ? flow_it->second.GetVia() : INVALID_STATION;
+ }
+
+ /**
+ * Get the best next hop for a cargo packet from station source, optionally
+ * excluding one or two stations.
+ * @param source Source of the packet.
+ * @param excluded If this station would be chosen choose the second best one instead.
+ * @param excluded2 Second station to be excluded, if != INVALID_STATION.
+ * @return The chosen next hop or INVALID_STATION if none was found.
+ */
+ inline StationID GetVia(StationID source, StationID excluded, StationID excluded2 = INVALID_STATION) const
+ {
+ FlowStatMap::const_iterator flow_it(this->flows.find(source));
+ return flow_it != this->flows.end() ? flow_it->second.GetVia(excluded, excluded2) : INVALID_STATION;
+ }
};
/** All airport-related information. Only valid if tile != INVALID_TILE. */
diff --git a/src/station_cmd.cpp b/src/station_cmd.cpp
index 1dad5d292..7fdef90de 100644
--- a/src/station_cmd.cpp
+++ b/src/station_cmd.cpp
@@ -4161,6 +4161,20 @@ void FlowStatMap::DeleteFlows(StationID via)
}
}
+/**
+ * Get the sum of flows via a specific station from this GoodsEntry.
+ * @param via Remote station to look for.
+ * @return a FlowStat with all flows for 'via' added up.
+ */
+uint GoodsEntry::GetSumFlowVia(StationID via) const
+{
+ uint ret = 0;
+ for (FlowStatMap::const_iterator i = this->flows.begin(); i != this->flows.end(); ++i) {
+ ret += i->second.GetShare(via);
+ }
+ return ret;
+}
+
extern const TileTypeProcs _tile_type_station_procs = {
DrawTile_Station, // draw_tile_proc
GetSlopePixelZ_Station, // get_slope_z_proc