(svn r25900) -Change [FS#5677]: Allow restricted flows to be picked for kept cargo.

pull/155/head
fonsinchen 11 years ago
parent 7025a145e3
commit 809df5aaf6

@ -408,6 +408,29 @@ void VehicleCargoList::SetTransferLoadPlace(TileIndex xy)
} }
} }
/**
* Choose action to be performed with the given cargo packet.
* @param cp The packet.
* @param cargo_next Next hop the cargo wants to pass.
* @param current_station Current station of the vehicle carrying the cargo.
* @param accepted If the cargo is accepted at the current station.
* @param next_station Next station(s) the vehicle may stop at.
* @return MoveToAction to be performed.
*/
/* static */ VehicleCargoList::MoveToAction VehicleCargoList::ChooseAction(const CargoPacket *cp, StationID cargo_next,
StationID current_station, bool accepted, StationIDStack next_station)
{
if (cargo_next == INVALID_STATION) {
return (accepted && cp->source != current_station) ? MTA_DELIVER : MTA_KEEP;
} else if (cargo_next == current_station) {
return MTA_DELIVER;
} else if (next_station.Contains(cargo_next)) {
return MTA_KEEP;
} else {
return MTA_TRANSFER;
}
}
/** /**
* Stages cargo for unloading. The cargo is sorted so that packets to be * Stages cargo for unloading. The cargo is sorted so that packets to be
* transferred, delivered or kept are in consecutive chunks in the list. At the * transferred, delivered or kept are in consecutive chunks in the list. At the
@ -470,15 +493,19 @@ bool VehicleCargoList::Stage(bool accepted, StationID current_station, StationID
if (cp->source == INVALID_STATION && !ge->flows.empty()) { if (cp->source == INVALID_STATION && !ge->flows.empty()) {
cp->source = ge->flows.begin()->first; cp->source = ge->flows.begin()->first;
} }
cargo_next = ge->GetVia(cp->source); bool restricted = false;
if (cargo_next == INVALID_STATION) { FlowStatMap::const_iterator flow_it(ge->flows.find(cp->source));
action = (accepted && cp->source != current_station) ? MTA_DELIVER : MTA_KEEP; if (flow_it == ge->flows.end()) {
} else if (cargo_next == current_station) { cargo_next = INVALID_STATION;
action = MTA_DELIVER;
} else if (next_station.Contains(cargo_next)) {
action = MTA_KEEP;
} else { } else {
action = MTA_TRANSFER; cargo_next = flow_it->second.GetViaWithRestricted(restricted);
}
action = VehicleCargoList::ChooseAction(cp, cargo_next, current_station, accepted, next_station);
if (restricted && action == MTA_TRANSFER) {
/* If the flow is restricted we can't transfer to it. Choose an
* unrestricted one instead. */
cargo_next = flow_it->second.GetVia();
action = VehicleCargoList::ChooseAction(cp, cargo_next, current_station, accepted, next_station);
} }
} }
Money share; Money share;

@ -311,6 +311,9 @@ protected:
void AddToMeta(const CargoPacket *cp, MoveToAction action); void AddToMeta(const CargoPacket *cp, MoveToAction action);
void RemoveFromMeta(const CargoPacket *cp, MoveToAction action, uint count); void RemoveFromMeta(const CargoPacket *cp, MoveToAction action, uint count);
static MoveToAction ChooseAction(const CargoPacket *cp, StationID cargo_next,
StationID current_station, bool accepted, StationIDStack next_station);
public: public:
/** The station cargo list needs to control the unloading. */ /** The station cargo list needs to control the unloading. */
friend class StationCargoList; friend class StationCargoList;

@ -252,7 +252,7 @@
* 184 25508 * 184 25508
* 185 25620 * 185 25620
* 186 25833 * 186 25833
* 187 ????? * 187 25899
*/ */
extern const uint16 SAVEGAME_VERSION = 187; ///< Current savegame version of OpenTTD. extern const uint16 SAVEGAME_VERSION = 187; ///< Current savegame version of OpenTTD.

Loading…
Cancel
Save