(svn r25361) -Feature: distribute cargo according to plan given by linkgraph
This commit is contained in:
@@ -12,6 +12,7 @@
|
||||
#include "stdafx.h"
|
||||
#include "economy_base.h"
|
||||
#include "cargoaction.h"
|
||||
#include "station_base.h"
|
||||
|
||||
/**
|
||||
* Decides if a packet needs to be split.
|
||||
@@ -153,7 +154,7 @@ bool CargoReturn::operator()(CargoPacket *cp)
|
||||
assert(cp_new->Count() <= this->destination->reserved_count);
|
||||
this->source->RemoveFromMeta(cp_new, VehicleCargoList::MTA_LOAD, cp_new->Count());
|
||||
this->destination->reserved_count -= cp_new->Count();
|
||||
this->destination->Append(cp_new);
|
||||
this->destination->Append(cp_new, this->next);
|
||||
return cp_new == cp;
|
||||
}
|
||||
|
||||
@@ -167,8 +168,8 @@ bool CargoTransfer::operator()(CargoPacket *cp)
|
||||
CargoPacket *cp_new = this->Preprocess(cp);
|
||||
if (cp_new == NULL) return false;
|
||||
this->source->RemoveFromMeta(cp_new, VehicleCargoList::MTA_TRANSFER, cp_new->Count());
|
||||
cp_new->AddFeederShare(this->payment->PayTransfer(cp_new, cp_new->Count()));
|
||||
this->destination->Append(cp_new);
|
||||
/* No transfer credits here as they were already granted during Stage(). */
|
||||
this->destination->Append(cp_new, cp_new->NextStation());
|
||||
return cp_new == cp;
|
||||
}
|
||||
|
||||
@@ -186,6 +187,29 @@ bool CargoShift::operator()(CargoPacket *cp)
|
||||
return cp_new == cp;
|
||||
}
|
||||
|
||||
/**
|
||||
* Reroutes some cargo from one Station sublist to another.
|
||||
* @param cp Packet to be rerouted.
|
||||
* @return True if the packet was completely rerouted, false if part of it was.
|
||||
*/
|
||||
bool CargoReroute::operator()(CargoPacket *cp)
|
||||
{
|
||||
CargoPacket *cp_new = this->Preprocess(cp);
|
||||
if (cp_new == NULL) cp_new = cp;
|
||||
StationID next = this->ge->GetVia(cp_new->SourceStation(), this->avoid, this->avoid2);
|
||||
assert(next != this->avoid && next != this->avoid2);
|
||||
if (this->source != this->destination) {
|
||||
this->source->RemoveFromCache(cp_new, cp_new->Count());
|
||||
this->destination->AddToCache(cp_new);
|
||||
}
|
||||
|
||||
/* Legal, as insert doesn't invalidate iterators in the MultiMap, however
|
||||
* this might insert the packet between range.first and range.second (which might be end())
|
||||
* This is why we check for GetKey above to avoid infinite loops. */
|
||||
this->destination->packets.Insert(next, cp_new);
|
||||
return cp_new == cp;
|
||||
}
|
||||
|
||||
template uint CargoRemoval<VehicleCargoList>::Preprocess(CargoPacket *cp);
|
||||
template uint CargoRemoval<StationCargoList>::Preprocess(CargoPacket *cp);
|
||||
template bool CargoRemoval<VehicleCargoList>::Postprocess(CargoPacket *cp, uint remove);
|
||||
|
Reference in New Issue
Block a user