mirror of
https://github.com/JGRennison/OpenTTD-patches.git
synced 2024-11-09 19:10:38 +00:00
(svn r27614) -Codechange: Use a fixed array instead of a map for link refresher cargo capacities. (JGR)
This commit is contained in:
parent
a81b7a24a6
commit
ff96590312
@ -72,10 +72,15 @@ LinkRefresher::LinkRefresher(Vehicle *vehicle, HopSet *seen_hops, bool allow_mer
|
|||||||
vehicle(vehicle), seen_hops(seen_hops), cargo(CT_INVALID), allow_merge(allow_merge),
|
vehicle(vehicle), seen_hops(seen_hops), cargo(CT_INVALID), allow_merge(allow_merge),
|
||||||
is_full_loading(is_full_loading)
|
is_full_loading(is_full_loading)
|
||||||
{
|
{
|
||||||
|
memset(this->capacities, 0, sizeof(this->capacities));
|
||||||
|
|
||||||
/* Assemble list of capacities and set last loading stations to 0. */
|
/* Assemble list of capacities and set last loading stations to 0. */
|
||||||
for (Vehicle *v = this->vehicle; v != NULL; v = v->Next()) {
|
for (Vehicle *v = this->vehicle; v != NULL; v = v->Next()) {
|
||||||
this->refit_capacities.push_back(RefitDesc(v->cargo_type, v->cargo_cap, v->refit_cap));
|
this->refit_capacities.push_back(RefitDesc(v->cargo_type, v->cargo_cap, v->refit_cap));
|
||||||
if (v->refit_cap > 0) this->capacities[v->cargo_type] += v->refit_cap;
|
if (v->refit_cap > 0) {
|
||||||
|
assert(v->cargo_type < NUM_CARGO);
|
||||||
|
this->capacities[v->cargo_type] += v->refit_cap;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -200,11 +205,11 @@ void LinkRefresher::RefreshStats(const Order *cur, const Order *next)
|
|||||||
StationID next_station = next->GetDestination();
|
StationID next_station = next->GetDestination();
|
||||||
Station *st = Station::GetIfValid(cur->GetDestination());
|
Station *st = Station::GetIfValid(cur->GetDestination());
|
||||||
if (st != NULL && next_station != INVALID_STATION && next_station != st->index) {
|
if (st != NULL && next_station != INVALID_STATION && next_station != st->index) {
|
||||||
for (CapacitiesMap::const_iterator i = this->capacities.begin(); i != this->capacities.end(); ++i) {
|
for (CargoID c = 0; c < NUM_CARGO; c++) {
|
||||||
/* Refresh the link and give it a minimum capacity. */
|
/* Refresh the link and give it a minimum capacity. */
|
||||||
|
|
||||||
if (i->second == 0) continue;
|
uint cargo_quantity = this->capacities[c];
|
||||||
CargoID c = i->first;
|
if (cargo_quantity == 0) continue;
|
||||||
|
|
||||||
/* If not allowed to merge link graphs, make sure the stations are
|
/* If not allowed to merge link graphs, make sure the stations are
|
||||||
* already in the same link graph. */
|
* already in the same link graph. */
|
||||||
@ -225,7 +230,7 @@ void LinkRefresher::RefreshStats(const Order *cur, const Order *next)
|
|||||||
st->index == vehicle->last_station_visited &&
|
st->index == vehicle->last_station_visited &&
|
||||||
this->vehicle->orders.list->GetTotalDuration() >
|
this->vehicle->orders.list->GetTotalDuration() >
|
||||||
(Ticks)this->vehicle->current_order_time) {
|
(Ticks)this->vehicle->current_order_time) {
|
||||||
uint effective_capacity = i->second * this->vehicle->load_unload_ticks;
|
uint effective_capacity = cargo_quantity * this->vehicle->load_unload_ticks;
|
||||||
if (effective_capacity > (uint)this->vehicle->orders.list->GetTotalDuration()) {
|
if (effective_capacity > (uint)this->vehicle->orders.list->GetTotalDuration()) {
|
||||||
IncreaseStats(st, c, next_station, effective_capacity /
|
IncreaseStats(st, c, next_station, effective_capacity /
|
||||||
this->vehicle->orders.list->GetTotalDuration(), 0,
|
this->vehicle->orders.list->GetTotalDuration(), 0,
|
||||||
@ -233,10 +238,10 @@ void LinkRefresher::RefreshStats(const Order *cur, const Order *next)
|
|||||||
} else if (RandomRange(this->vehicle->orders.list->GetTotalDuration()) < effective_capacity) {
|
} else if (RandomRange(this->vehicle->orders.list->GetTotalDuration()) < effective_capacity) {
|
||||||
IncreaseStats(st, c, next_station, 1, 0, EUM_INCREASE | restricted_mode);
|
IncreaseStats(st, c, next_station, 1, 0, EUM_INCREASE | restricted_mode);
|
||||||
} else {
|
} else {
|
||||||
IncreaseStats(st, c, next_station, i->second, 0, EUM_REFRESH | restricted_mode);
|
IncreaseStats(st, c, next_station, cargo_quantity, 0, EUM_REFRESH | restricted_mode);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
IncreaseStats(st, c, next_station, i->second, 0, EUM_REFRESH | restricted_mode);
|
IncreaseStats(st, c, next_station, cargo_quantity, 0, EUM_REFRESH | restricted_mode);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -80,11 +80,10 @@ protected:
|
|||||||
};
|
};
|
||||||
|
|
||||||
typedef std::vector<RefitDesc> RefitList;
|
typedef std::vector<RefitDesc> RefitList;
|
||||||
typedef std::map<CargoID, uint> CapacitiesMap;
|
|
||||||
typedef std::set<Hop> HopSet;
|
typedef std::set<Hop> HopSet;
|
||||||
|
|
||||||
Vehicle *vehicle; ///< Vehicle for which the links should be refreshed.
|
Vehicle *vehicle; ///< Vehicle for which the links should be refreshed.
|
||||||
CapacitiesMap capacities; ///< Current added capacities per cargo ID in the consist.
|
uint capacities[NUM_CARGO]; ///< Current added capacities per cargo ID in the consist.
|
||||||
RefitList refit_capacities; ///< Current state of capacity remaining from previous refits versus overall capacity per vehicle in the consist.
|
RefitList refit_capacities; ///< Current state of capacity remaining from previous refits versus overall capacity per vehicle in the consist.
|
||||||
HopSet *seen_hops; ///< Hops already seen. If the same hop is seen twice we stop the algorithm. This is shared between all Refreshers of the same run.
|
HopSet *seen_hops; ///< Hops already seen. If the same hop is seen twice we stop the algorithm. This is shared between all Refreshers of the same run.
|
||||||
CargoID cargo; ///< Cargo given in last refit order.
|
CargoID cargo; ///< Cargo given in last refit order.
|
||||||
|
Loading…
Reference in New Issue
Block a user