@ -20,6 +20,7 @@
static const std : : string planned_building_persistence_key_v1 = " buildingplan/constraints " ;
static const std : : string planned_building_persistence_key_v1 = " buildingplan/constraints " ;
static const std : : string planned_building_persistence_key_v2 = " buildingplan/constraints2 " ;
static const std : : string planned_building_persistence_key_v2 = " buildingplan/constraints2 " ;
static const std : : string global_settings_persistence_key = " buildingplan/global " ;
/*
/*
* ItemFilter
* ItemFilter
@ -501,13 +502,69 @@ void migrateV1ToV2()
}
}
}
}
static void init_global_settings ( std : : map < std : : string , bool > & settings )
// assumes no setting has '=' or '|' characters
static std : : string serialize_settings ( std : : map < std : : string , bool > & settings )
{
std : : ostringstream ser ;
for ( auto & entry : settings )
{
ser < < entry . first < < " = " < < ( entry . second ? " 1 " : " 0 " ) < < " | " ;
}
return ser . str ( ) ;
}
static void deserialize_settings ( std : : map < std : : string , bool > & settings ,
std : : string ser )
{
std : : vector < std : : string > tokens ;
split_string ( & tokens , ser , " | " ) ;
for ( auto token : tokens )
{
if ( token . empty ( ) )
continue ;
std : : vector < std : : string > parts ;
split_string ( & parts , token , " = " ) ;
if ( parts . size ( ) ! = 2 )
{
debug ( " invalid serialized setting format: '%s' " , token . c_str ( ) ) ;
continue ;
}
std : : string key = parts [ 0 ] ;
if ( settings . count ( key ) = = 0 )
{
debug ( " unknown serialized setting: '%s " , key . c_str ( ) ) ;
continue ;
}
settings [ key ] = static_cast < bool > ( atoi ( parts [ 1 ] . c_str ( ) ) ) ;
debug ( " deserialized setting: %s = %d " , key . c_str ( ) , settings [ key ] ) ;
}
}
static DFHack : : PersistentDataItem init_global_settings (
std : : map < std : : string , bool > & settings )
{
{
settings . clear ( ) ;
settings . clear ( ) ;
settings [ " blocks " ] = true ;
settings [ " blocks " ] = true ;
settings [ " boulders " ] = true ;
settings [ " boulders " ] = true ;
settings [ " logs " ] = true ;
settings [ " logs " ] = true ;
settings [ " bars " ] = false ;
settings [ " bars " ] = false ;
// load persistent global settings if they exist; otherwise create them
std : : vector < PersistentDataItem > items ;
DFHack : : World : : GetPersistentData ( & items , global_settings_persistence_key ) ;
if ( items . size ( ) = = 1 )
{
DFHack : : PersistentDataItem & config = items [ 0 ] ;
deserialize_settings ( settings , config . val ( ) ) ;
return config ;
}
debug ( " initializing persistent global settings " ) ;
DFHack : : PersistentDataItem config =
DFHack : : World : : AddPersistentData ( global_settings_persistence_key ) ;
config . val ( ) = serialize_settings ( settings ) ;
return config ;
}
}
const std : : map < std : : string , bool > & Planner : : getGlobalSettings ( ) const
const std : : map < std : : string , bool > & Planner : : getGlobalSettings ( ) const
@ -525,6 +582,8 @@ bool Planner::setGlobalSetting(std::string name, bool value)
debug ( " global setting '%s' %d -> %d " ,
debug ( " global setting '%s' %d -> %d " ,
name . c_str ( ) , global_settings [ name ] , value ) ;
name . c_str ( ) , global_settings [ name ] , value ) ;
global_settings [ name ] = value ;
global_settings [ name ] = value ;
if ( config . isValid ( ) )
config . val ( ) = serialize_settings ( global_settings ) ;
return true ;
return true ;
}
}
@ -535,7 +594,7 @@ void Planner::reset()
planned_buildings . clear ( ) ;
planned_buildings . clear ( ) ;
tasks . clear ( ) ;
tasks . clear ( ) ;
init_global_settings( global_settings ) ;
config = init_global_settings( global_settings ) ;
migrateV1ToV2 ( ) ;
migrateV1ToV2 ( ) ;