File diff r25692:2d58a4d0f451 → r25693:311303f64840
src/saveload/station_sl.cpp
Show inline comments
 
@@ -157,14 +157,14 @@ static const SaveLoad _roadstop_desc[] =
 
};
 

	
 
static uint16 _waiting_acceptance;
 
static uint32 _num_flows;
 
static uint32 _old_num_flows;
 
static uint16 _cargo_source;
 
static uint32 _cargo_source_xy;
 
static uint8  _cargo_days;
 
static Money  _cargo_feeder_share;
 

	
 
std::list<CargoPacket *> _packets;
 
uint32 _num_dests;
 
uint32 _old_num_dests;
 

	
 
struct FlowSaveLoad {
 
	FlowSaveLoad() : source(0), via(0), share(0), restricted(false) {}
 
@@ -209,6 +209,7 @@ public:
 

	
 
	void Save(BaseStation *bst) const override
 
	{
 
		SlSetStructListLength(bst->num_specs);
 
		for (uint i = 0; i < bst->num_specs; i++) {
 
			SlObject(&bst->speclist[i], this->GetDescription());
 
		}
 
@@ -216,6 +217,10 @@ public:
 

	
 
	void Load(BaseStation *bst) const override
 
	{
 
		if (!IsSavegameVersionBefore(SLV_SAVELOAD_LIST_LENGTH)) {
 
			bst->num_specs = (uint8)SlGetStructListLength(UINT8_MAX);
 
		}
 

	
 
		if (bst->num_specs != 0) {
 
			/* Allocate speclist memory when loading a game */
 
			bst->speclist = CallocT<StationSpecList>(bst->num_specs);
 
@@ -235,6 +240,7 @@ public:
 

	
 
	void Save(GoodsEntry *ge) const override
 
	{
 
		SlSetStructListLength(ge->cargo.Packets()->MapSize());
 
		for (StationCargoPacketMap::ConstMapIterator it(ge->cargo.Packets()->begin()); it != ge->cargo.Packets()->end(); ++it) {
 
			SlObject(const_cast<StationCargoPacketMap::value_type *>(&(*it)), this->GetDescription());
 
		}
 
@@ -242,8 +248,10 @@ public:
 

	
 
	void Load(GoodsEntry *ge) const override
 
	{
 
		size_t num_dests = IsSavegameVersionBefore(SLV_SAVELOAD_LIST_LENGTH) ? _old_num_dests : SlGetStructListLength(UINT32_MAX);
 

	
 
		StationCargoPair pair;
 
		for (uint j = 0; j < _num_dests; ++j) {
 
		for (uint j = 0; j < num_dests; ++j) {
 
			SlObject(&pair, this->GetDescription());
 
			const_cast<StationCargoPacketMap &>(*(ge->cargo.Packets()))[pair.first].swap(pair.second);
 
			assert(pair.second.empty());
 
@@ -269,6 +277,12 @@ public:
 

	
 
	void Save(GoodsEntry *ge) const override
 
	{
 
		uint32 num_flows = 0;
 
		for (FlowStatMap::const_iterator it(ge->flows.begin()); it != ge->flows.end(); ++it) {
 
			num_flows += (uint32)it->second.GetShares()->size();
 
		}
 
		SlSetStructListLength(num_flows);
 

	
 
		for (FlowStatMap::const_iterator outer_it(ge->flows.begin()); outer_it != ge->flows.end(); ++outer_it) {
 
			const FlowStat::SharesMap *shares = outer_it->second.GetShares();
 
			uint32 sum_shares = 0;
 
@@ -287,10 +301,12 @@ public:
 

	
 
	void Load(GoodsEntry *ge) const override
 
	{
 
		size_t num_flows = IsSavegameVersionBefore(SLV_SAVELOAD_LIST_LENGTH) ? _old_num_flows : SlGetStructListLength(UINT32_MAX);
 

	
 
		FlowSaveLoad flow;
 
		FlowStat *fs = nullptr;
 
		StationID prev_source = INVALID_STATION;
 
		for (uint32 j = 0; j < _num_flows; ++j) {
 
		for (uint32 j = 0; j < num_flows; ++j) {
 
			SlObject(&flow, this->GetDescription());
 
			if (fs == nullptr || prev_source != flow.source) {
 
				fs = &(ge->flows.insert(std::make_pair(flow.source, FlowStat(flow.via, flow.share, flow.restricted))).first->second);
 
@@ -330,11 +346,11 @@ public:
 
		SLEG_CONDVAR(            _cargo_feeder_share,  SLE_INT64,                  SLV_65, SLV_68),
 
		 SLE_CONDVAR(GoodsEntry, amount_fract,         SLE_UINT8,                 SLV_150, SL_MAX_VERSION),
 
		SLEG_CONDREFLIST(        _packets,             REF_CARGO_PACKET,           SLV_68, SLV_183),
 
		SLEG_CONDVAR(            _num_dests,           SLE_UINT32,                SLV_183, SL_MAX_VERSION),
 
		SLEG_CONDVAR(            _old_num_dests,       SLE_UINT32,                SLV_183, SLV_SAVELOAD_LIST_LENGTH),
 
		 SLE_CONDVAR(GoodsEntry, cargo.reserved_count, SLE_UINT,                  SLV_181, SL_MAX_VERSION),
 
		 SLE_CONDVAR(GoodsEntry, link_graph,           SLE_UINT16,                SLV_183, SL_MAX_VERSION),
 
		 SLE_CONDVAR(GoodsEntry, node,                 SLE_UINT16,                SLV_183, SL_MAX_VERSION),
 
		SLEG_CONDVAR(            _num_flows,           SLE_UINT32,                SLV_183, SL_MAX_VERSION),
 
		SLEG_CONDVAR(            _old_num_flows,       SLE_UINT32,                SLV_183, SLV_SAVELOAD_LIST_LENGTH),
 
		 SLE_CONDVAR(GoodsEntry, max_waiting_cargo,    SLE_UINT32,                SLV_183, SL_MAX_VERSION),
 
		SLEG_CONDSTRUCTLIST(SlStationFlow,                                        SLV_183, SL_MAX_VERSION),
 
		SLEG_CONDSTRUCTLIST(SlStationCargo,                                       SLV_183, SL_MAX_VERSION),
 
@@ -344,15 +360,26 @@ public:
 
	}
 
#endif
 

	
 
	/**
 
	 * Get the number of cargoes used by this savegame version.
 
	 * @return The number of cargoes used by this savegame version.
 
	 */
 
	size_t GetNumCargo() const
 
	{
 
		if (IsSavegameVersionBefore(SLV_55)) return 12;
 
		if (IsSavegameVersionBefore(SLV_EXTEND_CARGOTYPES)) return 32;
 
		if (IsSavegameVersionBefore(SLV_SAVELOAD_LIST_LENGTH)) return NUM_CARGO;
 
		/* Read from the savegame how long the list is. */
 
		return SlGetStructListLength(NUM_CARGO);
 
	}
 

	
 
	void Save(BaseStation *bst) const override
 
	{
 
		Station *st = Station::From(bst);
 

	
 
		SlSetStructListLength(NUM_CARGO);
 

	
 
		for (CargoID i = 0; i < NUM_CARGO; i++) {
 
			_num_dests = (uint32)st->goods[i].cargo.Packets()->MapSize();
 
			_num_flows = 0;
 
			for (FlowStatMap::const_iterator it(st->goods[i].flows.begin()); it != st->goods[i].flows.end(); ++it) {
 
				_num_flows += (uint32)it->second.GetShares()->size();
 
			}
 
			SlObject(&st->goods[i], this->GetDescription());
 
		}
 
	}
 
@@ -369,7 +396,7 @@ public:
 
			memcpy(st->airport.psa->storage, _old_st_persistent_storage.storage, sizeof(_old_st_persistent_storage.storage));
 
		}
 

	
 
		uint num_cargo = IsSavegameVersionBefore(SLV_55) ? 12 : IsSavegameVersionBefore(SLV_EXTEND_CARGOTYPES) ? 32 : NUM_CARGO;
 
		size_t num_cargo = this->GetNumCargo();
 
		for (CargoID i = 0; i < num_cargo; i++) {
 
			GoodsEntry *ge = &st->goods[i];
 
			SlObject(ge, this->GetDescription());
 
@@ -520,7 +547,7 @@ public:
 
		/* Used by newstations for graphic variations */
 
		    SLE_VAR(BaseStation, random_bits,            SLE_UINT16),
 
		    SLE_VAR(BaseStation, waiting_triggers,       SLE_UINT8),
 
		    SLE_VAR(BaseStation, num_specs,              SLE_UINT8),
 
		SLE_CONDVAR(BaseStation, num_specs,              SLE_UINT8,                   SL_MIN_VERSION, SLV_SAVELOAD_LIST_LENGTH),
 
	};
 

	
 
	void GenericSaveLoad(BaseStation *bst) const
 
@@ -626,7 +653,7 @@ static void Save_STNN()
 

	
 
static void Load_STNN()
 
{
 
	_num_flows = 0;
 
	_old_num_flows = 0;
 

	
 
	int index;
 
	while ((index = SlIterateArray()) != -1) {