diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/aircraft_gui.cpp | 2 | ||||
-rw-r--r-- | src/autoreplace_cmd.cpp | 26 | ||||
-rw-r--r-- | src/cargopacket.h | 54 | ||||
-rw-r--r-- | src/depot_gui.cpp | 2 | ||||
-rw-r--r-- | src/economy.cpp | 26 | ||||
-rw-r--r-- | src/newgrf_engine.cpp | 6 | ||||
-rw-r--r-- | src/newgrf_station.cpp | 14 | ||||
-rw-r--r-- | src/roadveh.h | 2 | ||||
-rw-r--r-- | src/roadveh_cmd.cpp | 2 | ||||
-rw-r--r-- | src/roadveh_gui.cpp | 8 | ||||
-rw-r--r-- | src/saveload/afterload.cpp | 2 | ||||
-rw-r--r-- | src/script/api/script_station.cpp | 2 | ||||
-rw-r--r-- | src/script/api/script_vehicle.cpp | 2 | ||||
-rw-r--r-- | src/ship_gui.cpp | 4 | ||||
-rw-r--r-- | src/station_cmd.cpp | 8 | ||||
-rw-r--r-- | src/station_gui.cpp | 12 | ||||
-rw-r--r-- | src/train.h | 2 | ||||
-rw-r--r-- | src/train_cmd.cpp | 2 | ||||
-rw-r--r-- | src/train_gui.cpp | 6 | ||||
-rw-r--r-- | src/vehicle.cpp | 5 |
20 files changed, 105 insertions, 82 deletions
diff --git a/src/aircraft_gui.cpp b/src/aircraft_gui.cpp index faefaa907..fe94b0fd2 100644 --- a/src/aircraft_gui.cpp +++ b/src/aircraft_gui.cpp @@ -50,7 +50,7 @@ void DrawAircraftDetails(const Aircraft *v, int left, int right, int y) } if (u->cargo_cap != 0) { - uint cargo_count = u->cargo.Count(); + uint cargo_count = u->cargo.StoredCount(); y_offset += FONT_HEIGHT_NORMAL + 1; if (cargo_count != 0) { diff --git a/src/autoreplace_cmd.cpp b/src/autoreplace_cmd.cpp index e8d292140..27d6fddcd 100644 --- a/src/autoreplace_cmd.cpp +++ b/src/autoreplace_cmd.cpp @@ -91,27 +91,32 @@ bool CheckAutoreplaceValidity(EngineID from, EngineID to, CompanyID company) /** * Check the capacity of all vehicles in a chain and spread cargo if needed. * @param v The vehicle to check. + * @pre You can only do this if the consist is not loading or unloading. It + * must not carry reserved cargo, nor cargo to be unloaded or transferred. */ void CheckCargoCapacity(Vehicle *v) { assert(v == NULL || v->First() == v); for (Vehicle *src = v; src != NULL; src = src->Next()) { + assert(src->cargo.TotalCount() == src->cargo.ActionCount(VehicleCargoList::MTA_KEEP)); + /* Do we need to more cargo away? */ - if (src->cargo.Count() <= src->cargo_cap) continue; + if (src->cargo.TotalCount() <= src->cargo_cap) continue; /* We need to move a particular amount. Try that on the other vehicles. */ - uint to_spread = src->cargo.Count() - src->cargo_cap; + uint to_spread = src->cargo.TotalCount() - src->cargo_cap; for (Vehicle *dest = v; dest != NULL && to_spread != 0; dest = dest->Next()) { - if (dest->cargo.Count() >= dest->cargo_cap || dest->cargo_type != src->cargo_type) continue; + assert(dest->cargo.TotalCount() == dest->cargo.ActionCount(VehicleCargoList::MTA_KEEP)); + if (dest->cargo.TotalCount() >= dest->cargo_cap || dest->cargo_type != src->cargo_type) continue; - uint amount = min(to_spread, dest->cargo_cap - dest->cargo.Count()); + uint amount = min(to_spread, dest->cargo_cap - dest->cargo.TotalCount()); src->cargo.Shift(amount, &dest->cargo); to_spread -= amount; } /* Any left-overs will be thrown away, but not their feeder share. */ - if (src->cargo_cap < src->cargo.Count()) src->cargo.Truncate(src->cargo.Count() - src->cargo_cap); + if (src->cargo_cap < src->cargo.TotalCount()) src->cargo.Truncate(src->cargo.TotalCount() - src->cargo_cap); } } @@ -120,21 +125,26 @@ void CheckCargoCapacity(Vehicle *v) * @param old_veh Old vehicle that will be sold * @param new_head Head of the completely constructed new vehicle chain * @param part_of_chain The vehicle is part of a train + * @pre You can only do this if both consists are not loading or unloading. + * They must not carry reserved cargo, nor cargo to be unloaded or + * transferred. */ static void TransferCargo(Vehicle *old_veh, Vehicle *new_head, bool part_of_chain) { assert(!part_of_chain || new_head->IsPrimaryVehicle()); /* Loop through source parts */ for (Vehicle *src = old_veh; src != NULL; src = src->Next()) { + assert(src->cargo.TotalCount() == src->cargo.ActionCount(VehicleCargoList::MTA_KEEP)); if (!part_of_chain && src->type == VEH_TRAIN && src != old_veh && src != Train::From(old_veh)->other_multiheaded_part && !src->IsArticulatedPart()) { /* Skip vehicles, which do not belong to old_veh */ src = src->GetLastEnginePart(); continue; } - if (src->cargo_type >= NUM_CARGO || src->cargo.Count() == 0) continue; + if (src->cargo_type >= NUM_CARGO || src->cargo.TotalCount() == 0) continue; /* Find free space in the new chain */ - for (Vehicle *dest = new_head; dest != NULL && src->cargo.Count() > 0; dest = dest->Next()) { + for (Vehicle *dest = new_head; dest != NULL && src->cargo.TotalCount() > 0; dest = dest->Next()) { + assert(dest->cargo.TotalCount() == dest->cargo.ActionCount(VehicleCargoList::MTA_KEEP)); if (!part_of_chain && dest->type == VEH_TRAIN && dest != new_head && dest != Train::From(new_head)->other_multiheaded_part && !dest->IsArticulatedPart()) { /* Skip vehicles, which do not belong to new_head */ dest = dest->GetLastEnginePart(); @@ -142,7 +152,7 @@ static void TransferCargo(Vehicle *old_veh, Vehicle *new_head, bool part_of_chai } if (dest->cargo_type != src->cargo_type) continue; - uint amount = min(src->cargo.Count(), dest->cargo_cap - dest->cargo.Count()); + uint amount = min(src->cargo.TotalCount(), dest->cargo_cap - dest->cargo.TotalCount()); if (amount <= 0) continue; src->cargo.Shift(amount, &dest->cargo); diff --git a/src/cargopacket.h b/src/cargopacket.h index bffc845ea..15b233fd0 100644 --- a/src/cargopacket.h +++ b/src/cargopacket.h @@ -249,30 +249,12 @@ public: } /** - * Checks whether this list is empty. - * @return True if and only if the list is empty. - */ - inline bool Empty() const - { - return this->count == 0; - } - - /** - * Returns the number of cargo entities in this list. - * @return The before mentioned number. - */ - inline uint Count() const - { - return this->count; - } - - /** * Returns source of the first cargo packet in this list. * @return The before mentioned source. */ inline StationID Source() const { - return this->Empty() ? INVALID_STATION : this->packets.front()->source; + return this->count == 0 ? INVALID_STATION : this->packets.front()->source; } /** @@ -354,12 +336,30 @@ public: * reserved). * @return Cargo on board the vehicle. */ - inline uint OnboardCount() const + inline uint StoredCount() const { return this->count - this->action_counts[MTA_LOAD]; } /** + * Returns sum of cargo, including reserved cargo. + * @return Sum of cargo. + */ + inline uint TotalCount() const + { + return this->count; + } + + /** + * Returns sum of reserved cargo. + * @return Sum of reserved cargo. + */ + inline uint ReservedCount() const + { + return this->action_counts[MTA_LOAD]; + } + + /** * Returns sum of cargo to be moved out of the vehicle at the current station. * @return Cargo to be moved. */ @@ -446,6 +446,16 @@ public: friend class CargoReturn; /** + * Returns sum of cargo still available for loading at the sation. + * (i.e. not counting cargo which is already reserved for loading) + * @return Cargo on board the vehicle. + */ + inline uint AvailableCount() const + { + return this->count; + } + + /** * Returns sum of cargo reserved for loading onto vehicles. * @return Cargo reserved for loading. */ @@ -455,8 +465,8 @@ public: } /** - * Returns total count of cargo, including reserved cargo that's not - * actually in the list. + * Returns total count of cargo at the station, including + * cargo which is already reserved for loading. * @return Total cargo count. */ inline uint TotalCount() const diff --git a/src/depot_gui.cpp b/src/depot_gui.cpp index b16e40ae2..bfdf293fc 100644 --- a/src/depot_gui.cpp +++ b/src/depot_gui.cpp @@ -802,7 +802,7 @@ struct DepotWindow : Window { for (const Vehicle *w = v; w != NULL; w = w->Next()) { if (w->cargo_cap > 0 && w->cargo_type < NUM_CARGO) { capacity[w->cargo_type] += w->cargo_cap; - loaded [w->cargo_type] += w->cargo.Count(); + loaded [w->cargo_type] += w->cargo.StoredCount(); } if (w->type == VEH_TRAIN && !w->HasArticulatedPart()) { diff --git a/src/economy.cpp b/src/economy.cpp index 8a4e53520..9c599dafc 100644 --- a/src/economy.cpp +++ b/src/economy.cpp @@ -1216,7 +1216,7 @@ void PrepareUnload(Vehicle *front_v) if ((front_v->current_order.GetUnloadType() & OUFB_NO_UNLOAD) == 0) { for (Vehicle *v = front_v; v != NULL; v = v->Next()) { - if (v->cargo_cap > 0 && !v->cargo.Empty()) { + if (v->cargo_cap > 0 && v->cargo.TotalCount() > 0) { v->cargo.Stage( HasBit(Station::Get(front_v->last_station_visited)->goods[v->cargo_type].acceptance_pickup, GoodsEntry::GES_ACCEPTANCE), front_v->last_station_visited, front_v->current_order.GetUnloadType()); @@ -1323,7 +1323,7 @@ static bool IsArticulatedVehicleEmpty(Vehicle *v) v = v->GetFirstEnginePart(); for (; v != NULL; v = v->HasArticulatedPart() ? v->GetNextArticulatedPart() : NULL) { - if (v->cargo.Count() != 0) return false; + if (v->cargo.TotalCount() != 0) return false; } return true; @@ -1438,7 +1438,7 @@ static void LoadUnloadVehicle(Vehicle *front) /* This order has a refit, if this is the first vehicle part carrying cargo and the whole vehicle is empty, try refitting. */ if (front->current_order.IsRefit() && artic_part == 1 && IsArticulatedVehicleEmpty(v) && - (v->type != VEH_AIRCRAFT || (Aircraft::From(v)->IsNormalAircraft() && v->Next()->cargo.Count() == 0))) { + (v->type != VEH_AIRCRAFT || (Aircraft::From(v)->IsNormalAircraft() && v->Next()->cargo.TotalCount() == 0))) { Vehicle *v_start = v->GetFirstEnginePart(); CargoID new_cid = front->current_order.GetRefitCargo(); @@ -1456,7 +1456,7 @@ static void LoadUnloadVehicle(Vehicle *front) Vehicle *w = v_start; while (w->HasArticulatedPart()) { w = w->GetNextArticulatedPart(); - if (w->cargo.Count() > 0) new_cid = CT_NO_REFIT; + if (w->cargo.TotalCount() > 0) new_cid = CT_NO_REFIT; refit_mask |= EngInfo(w->engine_type)->refit_mask; } @@ -1467,12 +1467,12 @@ static void LoadUnloadVehicle(Vehicle *front) FOR_EACH_SET_CARGO_ID(cid, refit_mask) { /* Consider refitting to this cargo, if other vehicles of the consist cannot * already take the cargo without refitting */ - if ((int)st->goods[cid].cargo.Count() > (int)consist_capleft[cid] + amount) { + if ((int)st->goods[cid].cargo.AvailableCount() > (int)consist_capleft[cid] + amount) { /* Try to find out if auto-refitting would succeed. In case the refit is allowed, * the returned refit capacity will be greater than zero. */ DoCommand(v_start->tile, v_start->index, cid | 1U << 6 | 0xFF << 8 | 1U << 16, DC_QUERY_COST, GetCmdRefitVeh(v_start)); // Auto-refit and only this vehicle including artic parts. if (_returned_refit_capacity > 0) { - amount = st->goods[cid].cargo.Count() - consist_capleft[cid]; + amount = st->goods[cid].cargo.AvailableCount() - consist_capleft[cid]; new_cid = cid; } } @@ -1490,7 +1490,7 @@ static void LoadUnloadVehicle(Vehicle *front) w = v_start; do { st->goods[w->cargo_type].cargo.Reserve(w->cargo_cap, &w->cargo, st->xy); - consist_capleft[w->cargo_type] += w->cargo_cap - w->cargo.Count(); + consist_capleft[w->cargo_type] += w->cargo_cap - w->cargo.RemainingCount(); w = w->HasArticulatedPart() ? w->GetNextArticulatedPart() : NULL; } while (w != NULL); @@ -1523,10 +1523,10 @@ static void LoadUnloadVehicle(Vehicle *front) /* If there's goods waiting at the station, and the vehicle * has capacity for it, load it on the vehicle. */ - int cap_left = v->cargo_cap - v->cargo.OnboardCount(); - if (cap_left > 0 && (v->cargo.ActionCount(VehicleCargoList::MTA_LOAD) > 0 || !ge->cargo.Empty())) { + int cap_left = v->cargo_cap - v->cargo.StoredCount(); + if (cap_left > 0 && (v->cargo.ActionCount(VehicleCargoList::MTA_LOAD) > 0 || ge->cargo.AvailableCount() > 0)) { if (_settings_game.order.gradual_loading) cap_left = min(cap_left, load_amount); - if (v->cargo.OnboardCount() == 0) TriggerVehicle(v, VEHICLE_TRIGGER_NEW_CARGO); + if (v->cargo.StoredCount() == 0) TriggerVehicle(v, VEHICLE_TRIGGER_NEW_CARGO); uint loaded = ge->cargo.Load(cap_left, &v->cargo, st->xy); if (v->cargo.ActionCount(VehicleCargoList::MTA_LOAD) > 0) { @@ -1556,7 +1556,7 @@ static void LoadUnloadVehicle(Vehicle *front) st->time_since_load = 0; st->last_vehicle_type = v->type; - if (ge->cargo.Empty()) { + if (ge->cargo.TotalCount() == 0) { TriggerStationRandomisation(st, st->xy, SRT_CARGO_TAKEN, v->cargo_type); TriggerStationAnimation(st, st->xy, SAT_CARGO_TAKEN, v->cargo_type); AirportAnimationTrigger(st, AAT_STATION_CARGO_TAKEN, v->cargo_type); @@ -1568,7 +1568,7 @@ static void LoadUnloadVehicle(Vehicle *front) } } - if (v->cargo.OnboardCount() >= v->cargo_cap) { + if (v->cargo.StoredCount() >= v->cargo_cap) { SetBit(cargo_full, v->cargo_type); } else { SetBit(cargo_not_full, v->cargo_type); @@ -1608,7 +1608,7 @@ static void LoadUnloadVehicle(Vehicle *front) if (front->current_order.GetLoadType() == OLF_FULL_LOAD_ANY) { /* if the aircraft carries passengers and is NOT full, then * continue loading, no matter how much mail is in */ - if ((front->type == VEH_AIRCRAFT && IsCargoInClass(front->cargo_type, CC_PASSENGERS) && front->cargo_cap > front->cargo.OnboardCount()) || + if ((front->type == VEH_AIRCRAFT && IsCargoInClass(front->cargo_type, CC_PASSENGERS) && front->cargo_cap > front->cargo.StoredCount()) || (cargo_not_full && (cargo_full & ~cargo_not_full) == 0)) { // There are still non-full cargoes finished_loading = false; } diff --git a/src/newgrf_engine.cpp b/src/newgrf_engine.cpp index 556958ef3..0c2e190ad 100644 --- a/src/newgrf_engine.cpp +++ b/src/newgrf_engine.cpp @@ -768,8 +768,8 @@ static uint32 VehicleGetVariable(Vehicle *v, const VehicleScopeResolver *object, case 0x39: return v->cargo_type; case 0x3A: return v->cargo_cap; case 0x3B: return GB(v->cargo_cap, 8, 8); - case 0x3C: return ClampToU16(v->cargo.Count()); - case 0x3D: return GB(ClampToU16(v->cargo.Count()), 8, 8); + case 0x3C: return ClampToU16(v->cargo.StoredCount()); + case 0x3D: return GB(ClampToU16(v->cargo.StoredCount()), 8, 8); case 0x3E: return v->cargo.Source(); case 0x3F: return ClampU(v->cargo.DaysInTransit(), 0, 0xFF); case 0x40: return ClampToU16(v->age); @@ -922,7 +922,7 @@ static uint32 VehicleGetVariable(Vehicle *v, const VehicleScopeResolver *object, if (totalsets == 0) return NULL; - uint set = (v->cargo.Count() * totalsets) / max((uint16)1, v->cargo_cap); + uint set = (v->cargo.StoredCount() * totalsets) / max((uint16)1, v->cargo_cap); set = min(set, totalsets - 1); return in_motion ? group->loaded[set] : group->loading[set]; diff --git a/src/newgrf_station.cpp b/src/newgrf_station.cpp index d7dfe3845..399910d1f 100644 --- a/src/newgrf_station.cpp +++ b/src/newgrf_station.cpp @@ -421,7 +421,7 @@ uint32 Station::GetNewGRFVariable(const ResolverObject *object, byte variable, b const GoodsEntry *ge = &this->goods[c]; switch (variable) { - case 0x60: return min(ge->cargo.Count(), 4095); + case 0x60: return min(ge->cargo.TotalCount(), 4095); case 0x61: return ge->HasVehicleEverTriedLoading() ? ge->time_since_pickup : 0; case 0x62: return ge->HasRating() ? ge->rating : 0xFFFFFFFF; case 0x63: return ge->cargo.DaysInTransit(); @@ -440,8 +440,8 @@ uint32 Station::GetNewGRFVariable(const ResolverObject *object, byte variable, b if (variable >= 0x8C && variable <= 0xEC) { const GoodsEntry *g = &this->goods[GB(variable - 0x8C, 3, 4)]; switch (GB(variable - 0x8C, 0, 3)) { - case 0: return g->cargo.Count(); - case 1: return GB(min(g->cargo.Count(), 4095), 0, 4) | (GB(g->acceptance_pickup, GoodsEntry::GES_ACCEPTANCE, 1) << 7); + case 0: return g->cargo.TotalCount(); + case 1: return GB(min(g->cargo.TotalCount(), 4095), 0, 4) | (GB(g->acceptance_pickup, GoodsEntry::GES_ACCEPTANCE, 1) << 7); case 2: return g->time_since_pickup; case 3: return g->rating; case 4: return g->cargo.Source(); @@ -507,12 +507,12 @@ uint32 Waypoint::GetNewGRFVariable(const ResolverObject *object, byte variable, case CT_DEFAULT: for (CargoID cargo_type = 0; cargo_type < NUM_CARGO; cargo_type++) { - cargo += st->goods[cargo_type].cargo.Count(); + cargo += st->goods[cargo_type].cargo.TotalCount(); } break; default: - cargo = st->goods[this->station_scope.cargo_type].cargo.Count(); + cargo = st->goods[this->station_scope.cargo_type].cargo.TotalCount(); break; } @@ -587,7 +587,7 @@ static const SpriteGroup *ResolveStation(StationResolverObject *object) const CargoSpec *cs; FOR_ALL_CARGOSPECS(cs) { if (object->station_scope.statspec->grf_prop.spritegroup[cs->Index()] != NULL && - !st->goods[cs->Index()].cargo.Empty()) { + st->goods[cs->Index()].cargo.TotalCount() > 0) { ctype = cs->Index(); break; } @@ -998,7 +998,7 @@ void TriggerStationRandomisation(Station *st, TileIndex tile, StationRandomTrigg if (trigger == SRT_CARGO_TAKEN) { /* Create a bitmask of completely empty cargo types to be matched */ for (CargoID i = 0; i < NUM_CARGO; i++) { - if (st->goods[i].cargo.Empty()) { + if (st->goods[i].cargo.TotalCount() == 0) { SetBit(empty_mask, i); } } diff --git a/src/roadveh.h b/src/roadveh.h index 7dd4da140..5b265f047 100644 --- a/src/roadveh.h +++ b/src/roadveh.h @@ -157,7 +157,7 @@ protected: // These functions should not be called outside acceleration code. */ inline uint16 GetWeight() const { - uint16 weight = (CargoSpec::Get(this->cargo_type)->weight * this->cargo.Count()) / 16; + uint16 weight = (CargoSpec::Get(this->cargo_type)->weight * this->cargo.StoredCount()) / 16; /* Vehicle weight is not added for articulated parts. */ if (!this->IsArticulatedPart()) { diff --git a/src/roadveh_cmd.cpp b/src/roadveh_cmd.cpp index bba108d4c..32e180d83 100644 --- a/src/roadveh_cmd.cpp +++ b/src/roadveh_cmd.cpp @@ -133,7 +133,7 @@ SpriteID RoadVehicle::GetImage(Direction direction, EngineImageType image_type) sprite = direction + _roadveh_images[spritenum]; - if (this->cargo.Count() >= this->cargo_cap / 2U) sprite += _roadveh_full_adder[spritenum]; + if (this->cargo.StoredCount() >= this->cargo_cap / 2U) sprite += _roadveh_full_adder[spritenum]; return sprite; } diff --git a/src/roadveh_gui.cpp b/src/roadveh_gui.cpp index 03e283062..eea416659 100644 --- a/src/roadveh_gui.cpp +++ b/src/roadveh_gui.cpp @@ -81,9 +81,9 @@ void DrawRoadVehDetails(const Vehicle *v, int left, int right, int y) if (u->cargo_cap == 0) continue; str = STR_VEHICLE_DETAILS_CARGO_EMPTY; - if (!u->cargo.Empty()) { + if (u->cargo.StoredCount() > 0) { SetDParam(0, u->cargo_type); - SetDParam(1, u->cargo.Count()); + SetDParam(1, u->cargo.StoredCount()); SetDParam(2, u->cargo.Source()); str = STR_VEHICLE_DETAILS_CARGO_FROM; feeder_share += u->cargo.FeederShare(); @@ -101,9 +101,9 @@ void DrawRoadVehDetails(const Vehicle *v, int left, int right, int y) DrawString(left, right, y + FONT_HEIGHT_NORMAL + y_offset, STR_VEHICLE_INFO_CAPACITY); str = STR_VEHICLE_DETAILS_CARGO_EMPTY; - if (!v->cargo.Empty()) { + if (v->cargo.StoredCount() > 0) { SetDParam(0, v->cargo_type); - SetDParam(1, v->cargo.Count()); + SetDParam(1, v->cargo.StoredCount()); SetDParam(2, v->cargo.Source()); str = STR_VEHICLE_DETAILS_CARGO_FROM; feeder_share += v->cargo.FeederShare(); diff --git a/src/saveload/afterload.cpp b/src/saveload/afterload.cpp index 91ba3a5e8..a4be61774 100644 --- a/src/saveload/afterload.cpp +++ b/src/saveload/afterload.cpp @@ -1539,7 +1539,7 @@ bool AfterLoadGame() FOR_ALL_STATIONS(st) { for (CargoID c = 0; c < NUM_CARGO; c++) { st->goods[c].last_speed = 0; - if (st->goods[c].cargo.Count() != 0) SetBit(st->goods[c].acceptance_pickup, GoodsEntry::GES_PICKUP); + if (st->goods[c].cargo.AvailableCount() != 0) SetBit(st->goods[c].acceptance_pickup, GoodsEntry::GES_PICKUP); } } } diff --git a/src/script/api/script_station.cpp b/src/script/api/script_station.cpp index a7b8459fc..bcf5e08ce 100644 --- a/src/script/api/script_station.cpp +++ b/src/script/api/script_station.cpp @@ -41,7 +41,7 @@ if (!IsValidStation(station_id)) return -1; if (!ScriptCargo::IsValidCargo(cargo_id)) return -1; - return ::Station::Get(station_id)->goods[cargo_id].cargo.Count(); + return ::Station::Get(station_id)->goods[cargo_id].cargo.TotalCount(); } /* static */ bool ScriptStation::HasCargoRating(StationID station_id, CargoID cargo_id) diff --git a/src/script/api/script_vehicle.cpp b/src/script/api/script_vehicle.cpp index 5bbcd543a..84cfc99fc 100644 --- a/src/script/api/script_vehicle.cpp +++ b/src/script/api/script_vehicle.cpp @@ -399,7 +399,7 @@ uint32 amount = 0; for (const Vehicle *v = ::Vehicle::Get(vehicle_id); v != NULL; v = v->Next()) { - if (v->cargo_type == cargo) amount += v->cargo.Count(); + if (v->cargo_type == cargo) amount += v->cargo.StoredCount(); } return amount; diff --git a/src/ship_gui.cpp b/src/ship_gui.cpp index d036cef43..6a55c8154 100644 --- a/src/ship_gui.cpp +++ b/src/ship_gui.cpp @@ -70,9 +70,9 @@ void DrawShipDetails(const Vehicle *v, int left, int right, int y) DrawString(left, right, y + FONT_HEIGHT_NORMAL, STR_VEHICLE_INFO_CAPACITY); StringID str = STR_VEHICLE_DETAILS_CARGO_EMPTY; - if (!v->cargo.Empty()) { + if (v->cargo.StoredCount() > 0) { SetDParam(0, v->cargo_type); - SetDParam(1, v->cargo.Count()); + SetDParam(1, v->cargo.StoredCount()); SetDParam(2, v->cargo.Source()); str = STR_VEHICLE_DETAILS_CARGO_FROM; } diff --git a/src/station_cmd.cpp b/src/station_cmd.cpp index 67933160d..34304fbd4 100644 --- a/src/station_cmd.cpp +++ b/src/station_cmd.cpp @@ -3225,7 +3225,7 @@ static void UpdateStationRating(Station *st) bool skip = false; int rating = 0; - uint waiting = ge->cargo.Count(); + uint waiting = ge->cargo.TotalCount(); if (HasBit(cs->callback_mask, CBM_CARGO_STATION_RATING_CALC)) { /* Perform custom station rating. If it succeeds the speed, days in transit and @@ -3315,8 +3315,10 @@ static void UpdateStationRating(Station *st) waiting_changed = true; } - if (waiting_changed && waiting < ge->cargo.Count()) { - ge->cargo.Truncate(ge->cargo.Count() - waiting); + /* We can't truncate cargo that's already reserved for loading. + * Thus StoredCount() here. */ + if (waiting_changed && waiting < ge->cargo.AvailableCount()) { + ge->cargo.Truncate(ge->cargo.AvailableCount() - waiting); } } } diff --git a/src/station_gui.cpp b/src/station_gui.cpp index 98c5b3d22..1071ca429 100644 --- a/src/station_gui.cpp +++ b/src/station_gui.cpp @@ -231,8 +231,8 @@ protected: CargoID j; FOR_EACH_SET_CARGO_ID(j, cargo_filter) { - if (!(*a)->goods[j].cargo.Empty()) diff += GetTransportedGoodsIncome((*a)->goods[j].cargo.Count(), 20, 50, j); - if (!(*b)->goods[j].cargo.Empty()) diff -= GetTransportedGoodsIncome((*b)->goods[j].cargo.Count(), 20, 50, j); + if ((*a)->goods[j].cargo.TotalCount() > 0) diff += GetTransportedGoodsIncome((*a)->goods[j].cargo.TotalCount(), 20, 50, j); + if ((*b)->goods[j].cargo.TotalCount() > 0) diff -= GetTransportedGoodsIncome((*b)->goods[j].cargo.TotalCount(), 20, 50, j); } return ClampToI32(diff); @@ -407,7 +407,7 @@ public: /* show cargo waiting and station ratings */ for (uint j = 0; j < _sorted_standard_cargo_specs_size; j++) { CargoID cid = _sorted_cargo_specs[j]->Index(); - if (!st->goods[cid].cargo.Empty()) { + if (st->goods[cid].cargo.TotalCount() > 0) { /* For RTL we work in exactly the opposite direction. So * decrement the space needed first, then draw to the left * instead of drawing to the left and then incrementing @@ -416,7 +416,7 @@ public: x -= 20; if (x < r.left + WD_FRAMERECT_LEFT) break; } - StationsWndShowStationRating(x, x + 16, y, cid, st->goods[cid].cargo.Count(), st->goods[cid].rating); + StationsWndShowStationRating(x, x + 16, y, cid, st->goods[cid].cargo.TotalCount(), st->goods[cid].rating); if (!rtl) { x += 20; if (x > r.right - WD_FRAMERECT_RIGHT) break; @@ -934,7 +934,7 @@ struct StationViewWindow : public Window { /* count types of cargoes waiting in station */ for (CargoID i = 0; i < NUM_CARGO; i++) { - if (st->goods[i].cargo.Empty()) { + if (st->goods[i].cargo.TotalCount() == 0) { this->cargo_rows[i] = 0; } else { /* Add an entry for total amount of cargo of this type waiting. */ @@ -994,7 +994,7 @@ struct StationViewWindow : public Window { if (--pos < 0) { StringID str = STR_JUST_NOTHING; for (CargoID i = 0; i < NUM_CARGO; i++) { - if (!st->goods[i].cargo.Empty()) str = STR_EMPTY; + if (st->goods[i].cargo.TotalCount() > 0) str = STR_EMPTY; } SetDParam(0, str); DrawString(r.left + WD_FRAMERECT_LEFT, r.right - WD_FRAMERECT_RIGHT, y, STR_STATION_VIEW_WAITING_TITLE); diff --git a/src/train.h b/src/train.h index 2e118889f..8f4bc2a9b 100644 --- a/src/train.h +++ b/src/train.h @@ -199,7 +199,7 @@ protected: // These functions should not be called outside acceleration code. */ inline uint16 GetWeight() const { - uint16 weight = (CargoSpec::Get(this->cargo_type)->weight * this->cargo.Count() * FreightWagonMult(this->cargo_type)) / 16; + uint16 weight = (CargoSpec::Get(this->cargo_type)->weight * this->cargo.StoredCount() * FreightWagonMult(this->cargo_type)) / 16; /* Vehicle weight is not added for articulated parts. */ if (!this->IsArticulatedPart()) { diff --git a/src/train_cmd.cpp b/src/train_cmd.cpp index f1fb50393..0d12fe8e9 100644 --- a/src/train_cmd.cpp +++ b/src/train_cmd.cpp @@ -477,7 +477,7 @@ SpriteID Train::GetImage(Direction direction, EngineImageType image_type) const sprite = GetDefaultTrainSprite(spritenum, direction); - if (this->cargo.Count() >= this->cargo_cap / 2U) sprite += _wagon_full_adder[spritenum]; + if (this->cargo.StoredCount() >= this->cargo_cap / 2U) sprite += _wagon_full_adder[spritenum]; return sprite; } diff --git a/src/train_gui.cpp b/src/train_gui.cpp index f302d759c..866eab745 100644 --- a/src/train_gui.cpp +++ b/src/train_gui.cpp @@ -276,7 +276,7 @@ static void GetCargoSummaryOfArticulatedVehicle(const Train *v, CargoSummary *su } item->capacity += v->cargo_cap; - item->amount += v->cargo.Count(); + item->amount += v->cargo.StoredCount(); if (item->source == INVALID_STATION) item->source = v->cargo.Source(); } while ((v = v->Next()) != NULL && v->IsArticulatedPart()); } @@ -311,7 +311,7 @@ int GetTrainDetailsWndVScroll(VehicleID veh_id, TrainDetailsWindowTabs det_tab) CargoArray act_cargo; CargoArray max_cargo; for (const Vehicle *v = Vehicle::Get(veh_id); v != NULL; v = v->Next()) { - act_cargo[v->cargo_type] += v->cargo.Count(); + act_cargo[v->cargo_type] += v->cargo.StoredCount(); max_cargo[v->cargo_type] += v->cargo_cap; } @@ -424,7 +424,7 @@ void DrawTrainDetails(const Train *v, int left, int right, int y, int vscroll_po Money feeder_share = 0; for (const Vehicle *u = v; u != NULL; u = u->Next()) { - act_cargo[u->cargo_type] += u->cargo.Count(); + act_cargo[u->cargo_type] += u->cargo.StoredCount(); max_cargo[u->cargo_type] += u->cargo_cap; feeder_share += u->cargo.FeederShare(); } diff --git a/src/vehicle.cpp b/src/vehicle.cpp index caadbf49d..edbdd01e3 100644 --- a/src/vehicle.cpp +++ b/src/vehicle.cpp @@ -189,7 +189,8 @@ uint Vehicle::Crash(bool flooded) if (this->IsPrimaryVehicle()) this->vehstatus |= VS_STOPPED; /* crash all wagons, and count passengers */ for (Vehicle *v = this; v != NULL; v = v->Next()) { - if (IsCargoInClass(v->cargo_type, CC_PASSENGERS)) pass += v->cargo.Count(); + /* We do not transfer reserver cargo back, so TotalCount() instead of StoredCount() */ + if (IsCargoInClass(v->cargo_type, CC_PASSENGERS)) pass += v->cargo.TotalCount(); v->vehstatus |= VS_CRASHED; MarkSingleVehicleDirty(v); } @@ -1256,7 +1257,7 @@ uint8 CalcPercentVehicleFilled(const Vehicle *front, StringID *colour) /* Count up max and used */ for (const Vehicle *v = front; v != NULL; v = v->Next()) { - count += v->cargo.OnboardCount(); + count += v->cargo.StoredCount(); max += v->cargo_cap; if (v->cargo_cap != 0 && colour != NULL) { unloading += HasBit(v->vehicle_flags, VF_CARGO_UNLOADING) ? 1 : 0; |