From 2795ed5b091fa5580976547b3669bac78cd595ce Mon Sep 17 00:00:00 2001 From: rubidium Date: Sun, 17 Feb 2013 14:10:15 +0000 Subject: (svn r25008) -Codechange: Make CargoList::Truncate behave similarly to CargoList::MoveTo, i.e. pass the amount to truncate (fonsinchen) --- src/aircraft_cmd.cpp | 6 +++--- src/autoreplace_cmd.cpp | 2 +- src/cargopacket.cpp | 8 ++++++-- src/cargopacket.h | 2 +- src/station.cpp | 2 +- src/station_cmd.cpp | 2 +- src/vehicle.cpp | 2 +- src/vehicle_cmd.cpp | 10 ++++++++-- 8 files changed, 22 insertions(+), 12 deletions(-) (limited to 'src') diff --git a/src/aircraft_cmd.cpp b/src/aircraft_cmd.cpp index 385eb9be1..cad674a20 100644 --- a/src/aircraft_cmd.cpp +++ b/src/aircraft_cmd.cpp @@ -1160,8 +1160,8 @@ static void CrashAirplane(Aircraft *v) uint pass = v->Crash(); SetDParam(0, pass); - v->cargo.Truncate(0); - v->Next()->cargo.Truncate(0); + v->cargo.Truncate(); + v->Next()->cargo.Truncate(); const Station *st = GetTargetAirportIfValid(v); StringID newsitem; if (st == NULL) { @@ -1205,7 +1205,7 @@ static void MaybeCrashAirplane(Aircraft *v) /* Crash the airplane. Remove all goods stored at the station. */ for (CargoID i = 0; i < NUM_CARGO; i++) { st->goods[i].rating = 1; - st->goods[i].cargo.Truncate(0); + st->goods[i].cargo.Truncate(); } CrashAirplane(v); diff --git a/src/autoreplace_cmd.cpp b/src/autoreplace_cmd.cpp index 6afcc48d1..7571da114 100644 --- a/src/autoreplace_cmd.cpp +++ b/src/autoreplace_cmd.cpp @@ -111,7 +111,7 @@ void CheckCargoCapacity(Vehicle *v) } /* Any left-overs will be thrown away, but not their feeder share. */ - src->cargo.Truncate(src->cargo_cap); + if (src->cargo_cap < src->cargo.Count()) src->cargo.Truncate(src->cargo.Count() - src->cargo_cap); } } diff --git a/src/cargopacket.cpp b/src/cargopacket.cpp index 0b92de0c8..0603d9125 100644 --- a/src/cargopacket.cpp +++ b/src/cargopacket.cpp @@ -209,11 +209,14 @@ void CargoList::Append(CargoPacket *cp) /** * Truncates the cargo in this list to the given amount. It leaves the * first count cargo entities and removes the rest. - * @param max_remaining Maximum amount of entities to be in the list after the command. + * @param max_move Maximum amount of entities to be removed from the list. + * @return Amount of entities actually moved. */ template -void CargoList::Truncate(uint max_remaining) +uint CargoList::Truncate(uint max_move) { + max_move = min(this->count, max_move); + uint max_remaining = this->count - max_move; for (Iterator it(packets.begin()); it != packets.end(); /* done during loop*/) { CargoPacket *cp = *it; if (max_remaining == 0) { @@ -236,6 +239,7 @@ void CargoList::Truncate(uint max_remaining) } ++it; } + return max_move; } /** diff --git a/src/cargopacket.h b/src/cargopacket.h index dcb1415fc..1e2093134 100644 --- a/src/cargopacket.h +++ b/src/cargopacket.h @@ -246,7 +246,7 @@ public: void Append(CargoPacket *cp); - void Truncate(uint max_remaining); + uint Truncate(uint max_move = UINT_MAX); template bool MoveTo(Tother_inst *dest, uint count, MoveToAction mta, CargoPayment *payment, uint data = 0); diff --git a/src/station.cpp b/src/station.cpp index 43b659476..7fb6e1916 100644 --- a/src/station.cpp +++ b/src/station.cpp @@ -114,7 +114,7 @@ Station::~Station() DeleteStationNews(this->index); for (CargoID c = 0; c < NUM_CARGO; c++) { - this->goods[c].cargo.Truncate(0); + this->goods[c].cargo.Truncate(); } CargoPacket::InvalidateAllFrom(this->index); diff --git a/src/station_cmd.cpp b/src/station_cmd.cpp index dc898d9bc..128528672 100644 --- a/src/station_cmd.cpp +++ b/src/station_cmd.cpp @@ -3307,7 +3307,7 @@ static void UpdateStationRating(Station *st) waiting_changed = true; } - if (waiting_changed) ge->cargo.Truncate(waiting); + if (waiting_changed) ge->cargo.Truncate(ge->cargo.Count() - waiting); } } } diff --git a/src/vehicle.cpp b/src/vehicle.cpp index 2f11421d6..11269db5c 100644 --- a/src/vehicle.cpp +++ b/src/vehicle.cpp @@ -769,7 +769,7 @@ void Vehicle::PreDestructor() } InvalidateWindowClassesData(GetWindowClassForVehicleType(this->type), 0); - this->cargo.Truncate(0); + this->cargo.Truncate(); DeleteVehicleOrders(this); DeleteDepotHighlightOfVehicle(this); diff --git a/src/vehicle_cmd.cpp b/src/vehicle_cmd.cpp index 7271d27b0..2cbe2c654 100644 --- a/src/vehicle_cmd.cpp +++ b/src/vehicle_cmd.cpp @@ -386,14 +386,20 @@ static CommandCost RefitVehicle(Vehicle *v, bool only_this, uint8 num_vehicles, /* Store the result */ for (RefitResult *result = refit_result.Begin(); result != refit_result.End(); result++) { Vehicle *u = result->v; - u->cargo.Truncate((u->cargo_type == new_cid) ? result->capacity : 0); + if (u->cargo_type != new_cid) { + u->cargo.Truncate(u->cargo_cap); + } else if (u->cargo_cap > result->capacity) { + u->cargo.Truncate(u->cargo_cap - result->capacity); + } u->cargo_type = new_cid; u->cargo_cap = result->capacity; u->cargo_subtype = new_subtype; if (u->type == VEH_AIRCRAFT) { Vehicle *w = u->Next(); + if (w->cargo_cap > result->mail_capacity) { + w->cargo.Truncate(w->cargo_cap - result->mail_capacity); + } w->cargo_cap = result->mail_capacity; - w->cargo.Truncate(result->mail_capacity); } } } -- cgit v1.2.3-54-g00ecf