File diff r27437:c8c76aa89930 → r27438:22e72ba90974
src/saveload/industry_sl.cpp
Show inline comments
 
@@ -19,6 +19,119 @@
 

	
 
static OldPersistentStorage _old_ind_persistent_storage;
 

	
 
class SlIndustryAccepted : public DefaultSaveLoadHandler<SlIndustryAccepted, Industry> {
 
public:
 
	inline static const SaveLoad description[] = {
 
		 SLE_VAR(Industry::AcceptedCargo, cargo, SLE_UINT8),
 
		 SLE_VAR(Industry::AcceptedCargo, waiting, SLE_UINT16),
 
		 SLE_VAR(Industry::AcceptedCargo, last_accepted, SLE_INT32),
 
	};
 
	inline const static SaveLoadCompatTable compat_description = _industry_accepts_sl_compat;
 

	
 
	void Save(Industry *i) const override
 
	{
 
		SlSetStructListLength(i->accepted.size());
 

	
 
		for (auto &a : i->accepted) {
 
			SlObject(&a, this->GetDescription());
 
		}
 
	}
 

	
 
	void Load(Industry *i) const override
 
	{
 
		size_t len = SlGetStructListLength(i->accepted.size());
 

	
 
		for (auto &a : i->accepted) {
 
			if (--len > i->accepted.size()) break; // unsigned so wraps after hitting zero.
 
			SlObject(&a, this->GetDescription());
 
		}
 
	}
 

	
 
	/* Old array structure used for savegames before SLV_INDUSTRY_CARGO_REORGANISE. */
 
	static CargoID old_cargo[INDUSTRY_NUM_INPUTS];
 
	static uint16_t old_waiting[INDUSTRY_NUM_INPUTS];
 
	static TimerGameCalendar::Date old_last_accepted[INDUSTRY_NUM_INPUTS];
 
};
 

	
 
/* static */ CargoID SlIndustryAccepted::old_cargo[INDUSTRY_NUM_INPUTS];
 
/* static */ uint16_t SlIndustryAccepted::old_waiting[INDUSTRY_NUM_INPUTS];
 
/* static */ TimerGameCalendar::Date SlIndustryAccepted::old_last_accepted[INDUSTRY_NUM_INPUTS];
 

	
 
class SlIndustryProducedHistory : public DefaultSaveLoadHandler<SlIndustryProducedHistory, Industry::ProducedCargo> {
 
public:
 
	inline static const SaveLoad description[] = {
 
		 SLE_VAR(Industry::ProducedHistory, production, SLE_UINT16),
 
		 SLE_VAR(Industry::ProducedHistory, transported, SLE_UINT16),
 
	};
 
	inline const static SaveLoadCompatTable compat_description = _industry_produced_history_sl_compat;
 

	
 
	void Save(Industry::ProducedCargo *p) const override
 
	{
 
		SlSetStructListLength(p->history.size());
 

	
 
		for (auto &h : p->history) {
 
			SlObject(&h, this->GetDescription());
 
		}
 
	}
 

	
 
	void Load(Industry::ProducedCargo *p) const override
 
	{
 
		size_t len = SlGetStructListLength(p->history.size());
 

	
 
		for (auto &h : p->history) {
 
			if (--len > p->history.size()) break; // unsigned so wraps after hitting zero.
 
			SlObject(&h, this->GetDescription());
 
		}
 
	}
 
};
 

	
 
class SlIndustryProduced : public DefaultSaveLoadHandler<SlIndustryProduced, Industry> {
 
public:
 
	inline static const SaveLoad description[] = {
 
		 SLE_VAR(Industry::ProducedCargo, cargo, SLE_UINT8),
 
		 SLE_VAR(Industry::ProducedCargo, waiting, SLE_UINT16),
 
		 SLE_VAR(Industry::ProducedCargo, rate, SLE_UINT8),
 
		SLEG_STRUCTLIST("history", SlIndustryProducedHistory),
 
	};
 
	inline const static SaveLoadCompatTable compat_description = _industry_produced_sl_compat;
 

	
 
	void Save(Industry *i) const override
 
	{
 
		SlSetStructListLength(i->produced.size());
 

	
 
		for (auto &p : i->produced) {
 
			SlObject(&p, this->GetDescription());
 
		}
 
	}
 

	
 
	void Load(Industry *i) const override
 
	{
 
		size_t len = SlGetStructListLength(i->produced.size());
 

	
 
		for (auto &p : i->produced) {
 
			if (--len > i->produced.size()) break; // unsigned so wraps after hitting zero.
 
			SlObject(&p, this->GetDescription());
 
		}
 
	}
 

	
 
	/* Old array structure used for savegames before SLV_INDUSTRY_CARGO_REORGANISE. */
 
	static CargoID old_cargo[INDUSTRY_NUM_OUTPUTS];
 
	static uint16_t old_waiting[INDUSTRY_NUM_OUTPUTS];
 
	static uint8_t old_rate[INDUSTRY_NUM_OUTPUTS];
 
	static uint16_t old_this_month_production[INDUSTRY_NUM_OUTPUTS];
 
	static uint16_t old_this_month_transported[INDUSTRY_NUM_OUTPUTS];
 
	static uint16_t old_last_month_production[INDUSTRY_NUM_OUTPUTS];
 
	static uint16_t old_last_month_transported[INDUSTRY_NUM_OUTPUTS];
 
};
 

	
 
/* static */ CargoID SlIndustryProduced::old_cargo[INDUSTRY_NUM_OUTPUTS];
 
/* static */ uint16_t SlIndustryProduced::old_waiting[INDUSTRY_NUM_OUTPUTS];
 
/* static */ uint8_t SlIndustryProduced::old_rate[INDUSTRY_NUM_OUTPUTS];
 
/* static */ uint16_t SlIndustryProduced::old_this_month_production[INDUSTRY_NUM_OUTPUTS];
 
/* static */ uint16_t SlIndustryProduced::old_this_month_transported[INDUSTRY_NUM_OUTPUTS];
 
/* static */ uint16_t SlIndustryProduced::old_last_month_production[INDUSTRY_NUM_OUTPUTS];
 
/* static */ uint16_t SlIndustryProduced::old_last_month_transported[INDUSTRY_NUM_OUTPUTS];
 

	
 
static const SaveLoad _industry_desc[] = {
 
	SLE_CONDVAR(Industry, location.tile,              SLE_FILE_U16 | SLE_VAR_U32,  SL_MIN_VERSION, SLV_6),
 
	SLE_CONDVAR(Industry, location.tile,              SLE_UINT32,                  SLV_6, SL_MAX_VERSION),
 
@@ -26,27 +139,25 @@ static const SaveLoad _industry_desc[] =
 
	    SLE_VAR(Industry, location.h,                 SLE_FILE_U8 | SLE_VAR_U16),
 
	    SLE_REF(Industry, town,                       REF_TOWN),
 
	SLE_CONDREF(Industry, neutral_station,            REF_STATION,                SLV_SERVE_NEUTRAL_INDUSTRIES, SL_MAX_VERSION),
 
	SLE_CONDARR(Industry, produced_cargo,             SLE_UINT8,   2,              SLV_78, SLV_EXTEND_INDUSTRY_CARGO_SLOTS),
 
	SLE_CONDARR(Industry, produced_cargo,             SLE_UINT8,  16,             SLV_EXTEND_INDUSTRY_CARGO_SLOTS, SL_MAX_VERSION),
 
	SLE_CONDARR(Industry, incoming_cargo_waiting,     SLE_UINT16,  3,              SLV_70, SLV_EXTEND_INDUSTRY_CARGO_SLOTS),
 
	SLE_CONDARR(Industry, incoming_cargo_waiting,     SLE_UINT16, 16,             SLV_EXTEND_INDUSTRY_CARGO_SLOTS, SL_MAX_VERSION),
 
	SLE_CONDARR(Industry, produced_cargo_waiting,     SLE_UINT16,  2,               SL_MIN_VERSION, SLV_EXTEND_INDUSTRY_CARGO_SLOTS),
 
	SLE_CONDARR(Industry, produced_cargo_waiting,     SLE_UINT16, 16,             SLV_EXTEND_INDUSTRY_CARGO_SLOTS, SL_MAX_VERSION),
 
	SLE_CONDARR(Industry, production_rate,            SLE_UINT8,   2,               SL_MIN_VERSION, SLV_EXTEND_INDUSTRY_CARGO_SLOTS),
 
	SLE_CONDARR(Industry, production_rate,            SLE_UINT8,  16,             SLV_EXTEND_INDUSTRY_CARGO_SLOTS, SL_MAX_VERSION),
 
	SLE_CONDARR(Industry, accepts_cargo,              SLE_UINT8,   3,              SLV_78, SLV_EXTEND_INDUSTRY_CARGO_SLOTS),
 
	SLE_CONDARR(Industry, accepts_cargo,              SLE_UINT8,  16,             SLV_EXTEND_INDUSTRY_CARGO_SLOTS, SL_MAX_VERSION),
 
	SLEG_CONDARR("produced_cargo",             SlIndustryProduced::old_cargo,                  SLE_UINT8,   2, SLV_78, SLV_EXTEND_INDUSTRY_CARGO_SLOTS),
 
	SLEG_CONDARR("produced_cargo",             SlIndustryProduced::old_cargo,                  SLE_UINT8,  16, SLV_EXTEND_INDUSTRY_CARGO_SLOTS, SLV_INDUSTRY_CARGO_REORGANISE),
 
	SLEG_CONDARR("incoming_cargo_waiting",     SlIndustryAccepted::old_waiting,                SLE_UINT16,  3, SLV_70, SLV_EXTEND_INDUSTRY_CARGO_SLOTS),
 
	SLEG_CONDARR("incoming_cargo_waiting",     SlIndustryAccepted::old_waiting,                SLE_UINT16, 16, SLV_EXTEND_INDUSTRY_CARGO_SLOTS, SLV_INDUSTRY_CARGO_REORGANISE),
 
	SLEG_CONDARR("produced_cargo_waiting",     SlIndustryProduced::old_waiting,                SLE_UINT16,  2, SL_MIN_VERSION, SLV_EXTEND_INDUSTRY_CARGO_SLOTS),
 
	SLEG_CONDARR("produced_cargo_waiting",     SlIndustryProduced::old_waiting,                SLE_UINT16, 16, SLV_EXTEND_INDUSTRY_CARGO_SLOTS, SLV_INDUSTRY_CARGO_REORGANISE),
 
	SLEG_CONDARR("production_rate",            SlIndustryProduced::old_rate,                   SLE_UINT8,   2, SL_MIN_VERSION, SLV_EXTEND_INDUSTRY_CARGO_SLOTS),
 
	SLEG_CONDARR("production_rate",            SlIndustryProduced::old_rate,                   SLE_UINT8,  16, SLV_EXTEND_INDUSTRY_CARGO_SLOTS, SLV_INDUSTRY_CARGO_REORGANISE),
 
	SLEG_CONDARR("accepts_cargo",              SlIndustryAccepted::old_cargo,                  SLE_UINT8,   3, SLV_78, SLV_EXTEND_INDUSTRY_CARGO_SLOTS),
 
	SLEG_CONDARR("accepts_cargo",              SlIndustryAccepted::old_cargo,                  SLE_UINT8,  16, SLV_EXTEND_INDUSTRY_CARGO_SLOTS, SLV_INDUSTRY_CARGO_REORGANISE),
 
	    SLE_VAR(Industry, prod_level,                 SLE_UINT8),
 
	SLE_CONDARR(Industry, this_month_production,      SLE_UINT16,  2,               SL_MIN_VERSION, SLV_EXTEND_INDUSTRY_CARGO_SLOTS),
 
	SLE_CONDARR(Industry, this_month_production,      SLE_UINT16, 16,             SLV_EXTEND_INDUSTRY_CARGO_SLOTS, SL_MAX_VERSION),
 
	SLE_CONDARR(Industry, this_month_transported,     SLE_UINT16,  2,               SL_MIN_VERSION, SLV_EXTEND_INDUSTRY_CARGO_SLOTS),
 
	SLE_CONDARR(Industry, this_month_transported,     SLE_UINT16, 16,             SLV_EXTEND_INDUSTRY_CARGO_SLOTS, SL_MAX_VERSION),
 
	SLE_CONDARR(Industry, last_month_pct_transported, SLE_UINT8,   2,               SL_MIN_VERSION, SLV_EXTEND_INDUSTRY_CARGO_SLOTS),
 
	SLE_CONDARR(Industry, last_month_pct_transported, SLE_UINT8,  16,             SLV_EXTEND_INDUSTRY_CARGO_SLOTS, SL_MAX_VERSION),
 
	SLE_CONDARR(Industry, last_month_production,      SLE_UINT16,  2,               SL_MIN_VERSION, SLV_EXTEND_INDUSTRY_CARGO_SLOTS),
 
	SLE_CONDARR(Industry, last_month_production,      SLE_UINT16, 16,             SLV_EXTEND_INDUSTRY_CARGO_SLOTS, SL_MAX_VERSION),
 
	SLE_CONDARR(Industry, last_month_transported,     SLE_UINT16,  2,               SL_MIN_VERSION, SLV_EXTEND_INDUSTRY_CARGO_SLOTS),
 
	SLE_CONDARR(Industry, last_month_transported,     SLE_UINT16, 16,             SLV_EXTEND_INDUSTRY_CARGO_SLOTS, SL_MAX_VERSION),
 
	SLEG_CONDARR("this_month_production",      SlIndustryProduced::old_this_month_production,  SLE_UINT16,  2, SL_MIN_VERSION, SLV_EXTEND_INDUSTRY_CARGO_SLOTS),
 
	SLEG_CONDARR("this_month_production",      SlIndustryProduced::old_this_month_production,  SLE_UINT16, 16, SLV_EXTEND_INDUSTRY_CARGO_SLOTS, SLV_INDUSTRY_CARGO_REORGANISE),
 
	SLEG_CONDARR("this_month_transported",     SlIndustryProduced::old_this_month_transported, SLE_UINT16,  2, SL_MIN_VERSION, SLV_EXTEND_INDUSTRY_CARGO_SLOTS),
 
	SLEG_CONDARR("this_month_transported",     SlIndustryProduced::old_this_month_transported, SLE_UINT16, 16, SLV_EXTEND_INDUSTRY_CARGO_SLOTS, SLV_INDUSTRY_CARGO_REORGANISE),
 
	SLEG_CONDARR("last_month_production",      SlIndustryProduced::old_last_month_production,  SLE_UINT16,  2, SL_MIN_VERSION, SLV_EXTEND_INDUSTRY_CARGO_SLOTS),
 
	SLEG_CONDARR("last_month_production",      SlIndustryProduced::old_last_month_production,  SLE_UINT16, 16, SLV_EXTEND_INDUSTRY_CARGO_SLOTS, SLV_INDUSTRY_CARGO_REORGANISE),
 
	SLEG_CONDARR("last_month_transported",     SlIndustryProduced::old_last_month_transported, SLE_UINT16,  2, SL_MIN_VERSION, SLV_EXTEND_INDUSTRY_CARGO_SLOTS),
 
	SLEG_CONDARR("last_month_transported",     SlIndustryProduced::old_last_month_transported, SLE_UINT16, 16, SLV_EXTEND_INDUSTRY_CARGO_SLOTS, SLV_INDUSTRY_CARGO_REORGANISE),
 

	
 
	    SLE_VAR(Industry, counter,                    SLE_UINT16),
 

	
 
@@ -61,8 +172,8 @@ static const SaveLoad _industry_desc[] =
 
	SLE_CONDVAR(Industry, founder,                    SLE_UINT8,                 SLV_70, SL_MAX_VERSION),
 
	SLE_CONDVAR(Industry, construction_date,          SLE_INT32,                 SLV_70, SL_MAX_VERSION),
 
	SLE_CONDVAR(Industry, construction_type,          SLE_UINT8,                 SLV_70, SL_MAX_VERSION),
 
	SLE_CONDVAR(Industry, last_cargo_accepted_at[0],  SLE_INT32,                 SLV_70, SLV_EXTEND_INDUSTRY_CARGO_SLOTS),
 
	SLE_CONDARR(Industry, last_cargo_accepted_at,     SLE_INT32, 16,            SLV_EXTEND_INDUSTRY_CARGO_SLOTS, SL_MAX_VERSION),
 
	SLEG_CONDVAR("last_cargo_accepted_at[0]",  SlIndustryAccepted::old_last_accepted[0], SLE_INT32,     SLV_70, SLV_EXTEND_INDUSTRY_CARGO_SLOTS),
 
	SLEG_CONDARR("last_cargo_accepted_at",     SlIndustryAccepted::old_last_accepted,    SLE_INT32, 16, SLV_EXTEND_INDUSTRY_CARGO_SLOTS, SLV_INDUSTRY_CARGO_REORGANISE),
 
	SLE_CONDVAR(Industry, selected_layout,            SLE_UINT8,                 SLV_73, SL_MAX_VERSION),
 
	SLE_CONDVAR(Industry, exclusive_supplier,         SLE_UINT8,                 SLV_GS_INDUSTRY_CONTROL, SL_MAX_VERSION),
 
	SLE_CONDVAR(Industry, exclusive_consumer,         SLE_UINT8,                 SLV_GS_INDUSTRY_CONTROL, SL_MAX_VERSION),
 
@@ -72,6 +183,9 @@ static const SaveLoad _industry_desc[] =
 

	
 
	SLE_CONDVAR(Industry, random,                     SLE_UINT16,                SLV_82, SL_MAX_VERSION),
 
	SLE_CONDSSTR(Industry, text,     SLE_STR | SLF_ALLOW_CONTROL,     SLV_INDUSTRY_TEXT, SL_MAX_VERSION),
 

	
 
	SLEG_CONDSTRUCTLIST("accepted", SlIndustryAccepted,                          SLV_INDUSTRY_CARGO_REORGANISE, SL_MAX_VERSION),
 
	SLEG_CONDSTRUCTLIST("produced", SlIndustryProduced,                          SLV_INDUSTRY_CARGO_REORGANISE, SL_MAX_VERSION),
 
};
 

	
 
struct INDYChunkHandler : ChunkHandler {
 
@@ -88,6 +202,27 @@ struct INDYChunkHandler : ChunkHandler {
 
		}
 
	}
 

	
 
	void LoadMoveAcceptsProduced(Industry *i) const
 
	{
 
		for (uint j = 0; j != INDUSTRY_NUM_INPUTS; ++j) {
 
			auto &a = i->accepted[j];
 
			a.cargo = SlIndustryAccepted::old_cargo[j];
 
			a.waiting = SlIndustryAccepted::old_waiting[j];
 
			a.last_accepted = SlIndustryAccepted::old_last_accepted[j];
 
		}
 

	
 
		for (uint j = 0; j != INDUSTRY_NUM_OUTPUTS; ++j) {
 
			auto &p = i->produced[j];
 
			p.cargo = SlIndustryProduced::old_cargo[j];
 
			p.waiting = SlIndustryProduced::old_waiting[j];
 
			p.rate = SlIndustryProduced::old_rate[j];
 
			p.history[THIS_MONTH].production = SlIndustryProduced::old_this_month_production[j];
 
			p.history[THIS_MONTH].transported = SlIndustryProduced::old_this_month_transported[j];
 
			p.history[LAST_MONTH].production = SlIndustryProduced::old_last_month_production[j];
 
			p.history[LAST_MONTH].transported = SlIndustryProduced::old_last_month_transported[j];
 
		}
 
	}
 

	
 
	void Load() const override
 
	{
 
		const std::vector<SaveLoad> slt = SlCompatTableHeader(_industry_desc, _industry_sl_compat);
 
@@ -107,6 +242,7 @@ struct INDYChunkHandler : ChunkHandler {
 
				i->psa = new PersistentStorage(0, 0, 0);
 
				memcpy(i->psa->storage, _old_ind_persistent_storage.storage, sizeof(_old_ind_persistent_storage.storage));
 
			}
 
			if (IsSavegameVersionBefore(SLV_INDUSTRY_CARGO_REORGANISE)) LoadMoveAcceptsProduced(i);
 
			Industry::IncIndustryTypeCount(i->type);
 
		}
 
	}