@ -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 ) ,
SLE G_CONDARR( " produced_cargo " , SlIndustryProduced : : old_cargo , SLE_UINT8 , 2 , SLV_78 , SLV_EXTEND_INDUSTRY_CARGO_SLOTS ) ,
SLE G_CONDARR( " produced_cargo " , SlIndustryProduced : : old_cargo , SLE_UINT8 , 16 , SLV_EXTEND_INDUSTRY_CARGO_SLOTS , SL V_INDUSTRY_CARGO_REORGANISE ) ,
SLE G_CONDARR( " incoming_cargo_waiting " , SlIndustryAccepted : : old_waiting , SLE_UINT16 , 3 , SLV_70 , SLV_EXTEND_INDUSTRY_CARGO_SLOTS ) ,
SLE G_CONDARR( " incoming_cargo_waiting " , SlIndustryAccepted : : old_waiting , SLE_UINT16 , 16 , SLV_EXTEND_INDUSTRY_CARGO_SLOTS , SLV_INDUSTRY_CARGO_REORGANISE ) ,
SLE G_CONDARR( " produced_cargo_waiting " , SlIndustryProduced : : old_waiting , SLE_UINT16 , 2 , SL_MIN_VERSION , SLV_EXTEND_INDUSTRY_CARGO_SLOTS ) ,
SLE G_CONDARR( " produced_cargo_waiting " , SlIndustryProduced : : old_waiting , SLE_UINT16 , 16 , SLV_EXTEND_INDUSTRY_CARGO_SLOTS , SLV_INDUSTRY_CARGO_REORGANISE ) ,
SLE G_CONDARR( " production_rate " , SlIndustryProduced : : old_rate , SLE_UINT8 , 2 , SL_MIN_VERSION , SLV_EXTEND_INDUSTRY_CARGO_SLOTS ) ,
SLE G_CONDARR( " production_rate " , SlIndustryProduced : : old_rate , SLE_UINT8 , 16 , SLV_EXTEND_INDUSTRY_CARGO_SLOTS , SL V_INDUSTRY_CARGO_REORGANISE ) ,
SLE G_CONDARR( " accepts_cargo " , SlIndustryAccepted : : old_cargo , SLE_UINT8 , 3 , SLV_78 , SLV_EXTEND_INDUSTRY_CARGO_SLOTS ) ,
SLE G_CONDARR( " accepts_cargo " , SlIndustryAccepted : : old_cargo , SLE_UINT8 , 16 , SLV_EXTEND_INDUSTRY_CARGO_SLOTS , SL V_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 ) ,
SLE G_CONDVAR( " last_cargo_accepted_at[0] " , SlIndustryAccepted : : old_last_accepted [ 0 ] , SLE_INT32 , SLV_70 , SLV_EXTEND_INDUSTRY_CARGO_SLOTS ) ,
SLE G_CONDARR( " last_cargo_accepted_at " , SlIndustryAccepted : : old_last_accepted , SLE_INT32 , 16 , SLV_EXTEND_INDUSTRY_CARGO_SLOTS , SL V_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 ) ;
}
}