diff --git a/src/cargopacket.cpp b/src/cargopacket.cpp index 853a493912..6b6778de0d 100644 --- a/src/cargopacket.cpp +++ b/src/cargopacket.cpp @@ -108,48 +108,59 @@ CargoPacket::CargoPacket() /** * Creates a new cargo packet. + * * @param first_station Source station of the packet. * @param source_xy Source location of the packet. * @param count Number of cargo entities to put in this packet. * @param source_type 'Type' of source the packet comes from (for subsidies). * @param source_id Actual source of the packet (for subsidies). * @pre count != 0 - * @note We have to zero memory ourselves here because we are using a 'new' - * that, in contrary to all other pools, does not memset to 0. */ -CargoPacket::CargoPacket(StationID first_station, TileIndex source_xy, uint16 count, SourceType source_type, SourceID source_id) : - count(count), - source_xy(source_xy), - source_id(source_id), - source_type(source_type), - first_station(first_station) +CargoPacket::CargoPacket(StationID first_station, TileIndex source_xy, uint16_t count, SourceType source_type, SourceID source_id) : + count(count), + source_xy(source_xy), + source_id(source_id), + source_type(source_type), + first_station(first_station) { dbg_assert(count != 0); } /** - * Creates a new cargo packet. Initializes the fields that cannot be changed later. - * Used when loading or splitting packets. + * Create a new cargo packet. Used for older savegames to load in their partial data. + * * @param count Number of cargo entities to put in this packet. * @param periods_in_transit Number of cargo aging periods the cargo has been in transit. * @param first_station Station the cargo was initially loaded. - * @param next_hop Next station the cargo wants to go. * @param source_xy Station location the cargo was initially loaded. * @param feeder_share Feeder share the packet has already accumulated. - * @param source_type 'Type' of source the packet comes from (for subsidies). - * @param source_id Actual source of the packet (for subsidies). - * @note We have to zero memory ourselves here because we are using a 'new' - * that, in contrary to all other pools, does not memset to 0. */ -CargoPacket::CargoPacket(uint16_t count, uint16_t periods_in_transit, StationID first_station, StationID next_hop, TileIndex source_xy, Money feeder_share, SourceType source_type, SourceID source_id) : +CargoPacket::CargoPacket(uint16_t count, uint16_t periods_in_transit, StationID first_station, TileIndex source_xy, Money feeder_share) : count(count), periods_in_transit(periods_in_transit), feeder_share(feeder_share), source_xy(source_xy), - source_id(source_id), - source_type(source_type), - first_station(first_station), - next_hop(next_hop) + first_station(first_station) +{ + assert(count != 0); +} + +/** + * Creates a new cargo packet. Used when loading or splitting packets. + * + * @param count Number of cargo entities to put in this packet. + * @param feeder_share Feeder share the packet has already accumulated. + * @param original The original packet we are splitting. + */ +CargoPacket::CargoPacket(uint16_t count, Money feeder_share, const CargoPacket &original) : + count(count), + periods_in_transit(original.periods_in_transit), + feeder_share(feeder_share), + source_xy(original.source_xy), + source_id(original.source_id), + source_type(original.source_type), + first_station(original.first_station), + next_hop(original.next_hop) { dbg_assert(count != 0); } @@ -174,7 +185,7 @@ CargoPacket *CargoPacket::Split(uint new_size) if (!CargoPacket::CanAllocateItem()) return nullptr; Money fs = this->GetFeederShare(new_size); - CargoPacket *cp_new = new CargoPacket(new_size, this->periods_in_transit, this->first_station, this->next_hop, this->source_xy, fs, this->source_type, this->source_id); + CargoPacket *cp_new = new CargoPacket(new_size, fs, *this); this->feeder_share -= fs; if (this->flags & CPF_HAS_DEFERRED_PAYMENT) { diff --git a/src/cargopacket.h b/src/cargopacket.h index 3c8e96b435..31d63076d7 100644 --- a/src/cargopacket.h +++ b/src/cargopacket.h @@ -80,7 +80,8 @@ public: CargoPacket(); CargoPacket(StationID first_station, TileIndex source_xy, uint16_t count, SourceType source_type, SourceID source_id); - CargoPacket(uint16_t count, uint16_t periods_in_transit, StationID first_station, StationID next_station, TileIndex source_xy, Money feeder_share = 0, SourceType source_type = SourceType::Industry, SourceID source_id = INVALID_SOURCE); + CargoPacket(uint16_t count, uint16_t periods_in_transit, StationID first_station, TileIndex source_xy, Money feeder_share); + CargoPacket(uint16_t count, Money feeder_share, const CargoPacket &original); ~CargoPacket(); CargoPacket *Split(uint new_size); diff --git a/src/saveload/station_sl.cpp b/src/saveload/station_sl.cpp index eba74449d0..1a0c975a12 100644 --- a/src/saveload/station_sl.cpp +++ b/src/saveload/station_sl.cpp @@ -305,7 +305,7 @@ public: assert(CargoPacket::CanAllocateItem()); /* Don't construct the packet with station here, because that'll fail with old savegames */ - CargoPacket *cp = new CargoPacket(GB(_waiting_acceptance, 0, 12), _cargo_periods, source, INVALID_STATION, _cargo_source_xy, _cargo_feeder_share); + CargoPacket *cp = new CargoPacket(GB(_waiting_acceptance, 0, 12), _cargo_periods, source, _cargo_source_xy, _cargo_feeder_share); ge->data->cargo.Append(cp, INVALID_STATION); SB(ge->status, GoodsEntry::GES_RATING, 1, 1); } diff --git a/src/saveload/vehicle_sl.cpp b/src/saveload/vehicle_sl.cpp index bd47d992b3..a462032512 100644 --- a/src/saveload/vehicle_sl.cpp +++ b/src/saveload/vehicle_sl.cpp @@ -533,7 +533,7 @@ struct VEHSChunkHandler : ChunkHandler { if (_cargo_count != 0 && IsCompanyBuildableVehicleType(v) && CargoPacket::CanAllocateItem()) { /* Don't construct the packet with station here, because that'll fail with old savegames */ - CargoPacket *cp = new CargoPacket(_cargo_count, _cargo_periods, _cargo_source, INVALID_STATION, _cargo_source_xy, _cargo_feeder_share); + CargoPacket *cp = new CargoPacket(_cargo_count, _cargo_periods, _cargo_source, _cargo_source_xy, _cargo_feeder_share); v->cargo.Append(cp); } diff --git a/src/sl/oldloader_sl.cpp b/src/sl/oldloader_sl.cpp index b03fa2154b..ad7a6ad13f 100644 --- a/src/sl/oldloader_sl.cpp +++ b/src/sl/oldloader_sl.cpp @@ -706,7 +706,7 @@ static bool LoadOldGood(LoadgameState *ls, int num) SB(ge->status, GoodsEntry::GES_ACCEPTANCE, 1, HasBit(_waiting_acceptance, 15)); SB(ge->status, GoodsEntry::GES_RATING, 1, _cargo_source != 0xFF); if (GB(_waiting_acceptance, 0, 12) != 0 && CargoPacket::CanAllocateItem()) { - ge->CreateData().cargo.Append(new CargoPacket(GB(_waiting_acceptance, 0, 12), _cargo_periods, (_cargo_source == 0xFF) ? INVALID_STATION : _cargo_source, 0, 0), + ge->CreateData().cargo.Append(new CargoPacket(GB(_waiting_acceptance, 0, 12), _cargo_periods, (_cargo_source == 0xFF) ? INVALID_STATION : _cargo_source, INVALID_TILE, 0), INVALID_STATION); } @@ -1352,8 +1352,8 @@ bool LoadOldVehicle(LoadgameState *ls, int num) if (_cargo_count != 0 && CargoPacket::CanAllocateItem()) { StationID source = (_cargo_source == 0xFF) ? INVALID_STATION : _cargo_source; - TileIndex source_xy = (source != INVALID_STATION) ? Station::Get(source)->xy : 0; - v->cargo.Append(new CargoPacket(_cargo_count, _cargo_periods, source, INVALID_STATION, source_xy)); + TileIndex source_xy = (source != INVALID_STATION) ? Station::Get(source)->xy : (TileIndex)0; + v->cargo.Append(new CargoPacket(_cargo_count, _cargo_periods, source, source_xy, 0)); } }