@@ -117,6 +117,7 @@ mp_create_game::mp_create_game(saved_game& state, bool local_mode)
117117 , mod_list_ ()
118118 , eras_menu_button_ ()
119119 , local_mode_ (local_mode)
120+ , previous_settings_ ()
120121{
121122 level_types_ = {
122123 {level_type::type::scenario, _ (" Scenarios" )},
@@ -312,7 +313,7 @@ void mp_create_game::pre_show()
312313 //
313314 mod_list_ = &find_widget<listbox>(" mod_list" );
314315
315- const auto & activemods = prefs::get ().modifications ();
316+ const auto & activemods = prefs::get ().modifications ();//
316317 for (const auto & mod : create_engine_.get_extras_by_type (ng::create_engine::MOD )) {
317318 grid* row_grid = &mod_list_->add_row (widget_data{{ " mod_name" , {{ " label" , mod->name }}}});
318319
@@ -625,7 +626,55 @@ void mp_create_game::on_game_select()
625626 options_manager_->update_game_options ();
626627
627628 // Game settings
628- update_map_settings ();
629+ if (level_types_[find_widget<menu_button>(" game_types" ).get_value ()].first != level_type::type::preset) {
630+ update_map_settings ();
631+ } else {
632+ if (auto preset = prefs::get ().get_game_preset (create_engine_.preset_id_by_index (selected_game))) {
633+ use_map_settings_->set_widget_value (preset[" use_map_settings" ].to_bool ());
634+ fog_->set_widget_value (preset[" fog" ].to_bool ());
635+ shroud_->set_widget_value (preset[" shroud" ].to_bool ());
636+ start_time_->set_widget_value (preset[" random_start_time" ].to_bool ());
637+ shuffle_sides_->set_widget_value (preset[" shuffle_sides" ].to_bool ());
638+ observers_->set_widget_value (preset[" observer" ].to_bool ());
639+ turns_->set_widget_value (preset[" turns" ].to_int ());
640+ gold_->set_widget_value (preset[" village_gold" ].to_int ());
641+ support_->set_widget_value (preset[" village_support" ].to_int ());
642+ experience_->set_widget_value (preset[" experience_modifier" ].to_int ());
643+ time_limit_->set_widget_value (preset[" countdown" ].to_bool ());
644+ init_turn_limit_->set_widget_value (preset[" countdown_turn_limit" ].to_int ());
645+ turn_bonus_->set_widget_value (preset[" countdown_turn_bonus" ].to_int ());
646+ reservoir_->set_widget_value (preset[" countdown_reservoir" ].to_int ());
647+ action_bonus_->set_widget_value (preset[" countdown_action_bonus" ].to_int ());
648+
649+ random_faction_mode::type mode = random_faction_mode::get_enum (preset[" random_faction_mode" ].str ()).value_or (random_faction_mode::type::independent);
650+ find_widget<menu_button>(" random_faction_mode" ).set_selected (static_cast <int >(mode));
651+
652+ const int era_selection = create_engine_.find_extra_by_id (ng::create_engine::ERA , preset[" scenario" ].str ());
653+ if (era_selection >= 0 ) {
654+ eras_menu_button_->set_selected (era_selection);
655+ }
656+ on_era_select ();
657+
658+ int i = 0 ;
659+ const auto & activemods = utils::split (preset[" mp_modifications" ].str ());
660+ for (const auto & mod : create_engine_.get_extras_by_type (ng::create_engine::MOD )) {
661+ if (utils::contains (activemods, mod->id )) {
662+ toggle_button& mod_button = mod_list_->get_row_grid (i)->find_widget <toggle_button>(" mod_active_state" );
663+ mod_button.set_value_bool (true );
664+ on_mod_toggle (mod->id , &mod_button);
665+ } else {
666+ toggle_button& mod_button = mod_list_->get_row_grid (i)->find_widget <toggle_button>(" mod_active_state" );
667+ mod_button.set_value_bool (false );
668+ on_mod_toggle (mod->id , &mod_button);
669+ }
670+ i++;
671+ }
672+
673+ if (preset->has_child (" options" )) {
674+ options_manager_->set_options (preset->mandatory_child (" options" ));
675+ }
676+ }
677+ }
629678}
630679
631680void mp_create_game::on_tab_select ()
@@ -678,6 +727,10 @@ void mp_create_game::update_games_list()
678727
679728 display_games_of_type (level_types_[index].first , create_engine_.current_level ().id ());
680729 find_widget<button>(" save_preset" ).set_active (level_types_[index].first == level_type::type::scenario);
730+
731+ if (level_types_[index].first != level_type::type::preset) {
732+ backup_settings ();
733+ }
681734}
682735
683736void mp_create_game::display_games_of_type (level_type::type type, const std::string& level)
@@ -913,9 +966,7 @@ void mp_create_game::save_preset()
913966 preset[" observer" ] = observers_->get_widget_value ();
914967 preset[" use_map_settings" ] = use_map_settings_->get_widget_value ();
915968
916- // TODO: need to populate the same in the list of presets selectable in the game creation list
917- // TODO: test that addon info is stored in the database correctly
918- // TODO: test with non-mainline modifications/eras/scenarios
969+ // TODO: code de-duplication
919970 preset[" mp_modifications" ] = utils::join (create_engine_.active_mods (), " ," );
920971 preset.add_child (" options" , options_manager_->get_options_config ());
921972 random_faction_mode::type type = random_faction_mode::get_enum (selected_rfm_index_).value_or (random_faction_mode::type::independent);
@@ -924,6 +975,32 @@ void mp_create_game::save_preset()
924975 prefs::get ().add_game_preset (std::move (preset));
925976}
926977
978+ void mp_create_game::backup_settings ()
979+ {
980+ previous_settings_.clear ();
981+ previous_settings_[" scenario" ] = create_engine_.current_level ().id ();
982+ previous_settings_[" era" ] = create_engine_.current_era ().id ;
983+ previous_settings_[" fog" ] = fog_->get_widget_value ();
984+ previous_settings_[" shroud" ] = shroud_->get_widget_value ();
985+ previous_settings_[" village_gold" ] = gold_->get_widget_value ();
986+ previous_settings_[" village_support" ] = support_->get_widget_value ();
987+ previous_settings_[" experience_modifier" ] = experience_->get_widget_value ();
988+ previous_settings_[" countdown" ] = time_limit_->get_widget_value ();
989+ previous_settings_[" countdown_turn_limit" ] = init_turn_limit_->get_widget_value ();
990+ previous_settings_[" countdown_action_bonus" ] = action_bonus_->get_widget_value ();
991+ previous_settings_[" countdown_turn_bonus" ] = turn_bonus_->get_widget_value ();
992+ previous_settings_[" countdown_reservoir" ] = reservoir_->get_widget_value ();
993+ previous_settings_[" random_start_time" ] = start_time_->get_widget_value ();
994+ previous_settings_[" shuffle_sides" ] = shuffle_sides_->get_widget_value ();
995+ previous_settings_[" turns" ] = turns_->get_widget_value ();
996+ previous_settings_[" observer" ] = observers_->get_widget_value ();
997+ previous_settings_[" use_map_settings" ] = use_map_settings_->get_widget_value ();
998+ previous_settings_[" mp_modifications" ] = utils::join (create_engine_.active_mods (), " ," );
999+ previous_settings_.add_child (" options" , options_manager_->get_options_config ());
1000+ random_faction_mode::type type = random_faction_mode::get_enum (selected_rfm_index_).value_or (random_faction_mode::type::independent);
1001+ previous_settings_[" random_faction_mode" ] = random_faction_mode::get_string (type);
1002+ }
1003+
9271004std::vector<std::string> mp_create_game::get_active_mods ()
9281005{
9291006 int i = 0 ;
0 commit comments