Skip to content

Commit 5322106

Browse files
committed
.
1 parent c87d67f commit 5322106

6 files changed

Lines changed: 108 additions & 5 deletions

File tree

src/game_initialization/create_engine.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -234,6 +234,7 @@ create_engine::create_engine(saved_game& state)
234234
, level_name_filter_()
235235
, player_count_filter_(1)
236236
, type_map_()
237+
, preset_ids_()
237238
, user_map_names_()
238239
, user_scenario_names_()
239240
, eras_()
@@ -750,6 +751,7 @@ void create_engine::init_all_levels()
750751

751752
if(data) {
752753
type_map_[level_type::type::preset].games.emplace_back(new scenario(*data));
754+
preset_ids_.emplace_back(preset["id"].to_int());
753755
}
754756
}
755757

src/game_initialization/create_engine.hpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -394,6 +394,8 @@ class create_engine
394394
/** Returns true if the current level has one or more [side] tags. */
395395
bool current_level_has_side_data();
396396

397+
int preset_id_by_index(int index) const { return preset_ids_.at(index); }
398+
397399
private:
398400
create_engine(const create_engine&) = delete;
399401
create_engine& operator=(const create_engine&) = delete;
@@ -438,6 +440,7 @@ class create_engine
438440
};
439441

440442
std::map<level_type::type, type_list> type_map_;
443+
std::vector<int> preset_ids_;
441444

442445
std::vector<std::string> user_map_names_;
443446
std::vector<std::string> user_scenario_names_;

src/gui/dialogs/multiplayer/mp_create_game.cpp

Lines changed: 82 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -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

631680
void 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

683736
void 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+
9271004
std::vector<std::string> mp_create_game::get_active_mods()
9281005
{
9291006
int i = 0;

src/gui/dialogs/multiplayer/mp_create_game.hpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,8 @@ class mp_create_game : public modal_dialog, private plugin_executor
9797

9898
bool local_mode_;
9999

100+
config previous_settings_;
101+
100102
template<typename widget>
101103
void on_filter_change(const std::string& id, bool do_select);
102104

@@ -131,6 +133,8 @@ class mp_create_game : public modal_dialog, private plugin_executor
131133

132134
void save_preset();
133135

136+
void backup_settings();
137+
134138
enum tab { TAB_GENERAL, TAB_OPTIONS, TAB_SETTINGS };
135139
};
136140

src/gui/dialogs/multiplayer/mp_options_helper.cpp

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,21 @@ mp_options_helper::mp_options_helper(window& window, ng::create_engine& create_e
4848
update_all_options();
4949
}
5050

51+
void mp_options_helper::set_options(const config& new_options)
52+
{
53+
visible_options_.clear();
54+
node_data_map_.clear();
55+
options_tree_.clear();
56+
57+
for(const auto [_, cfg] : new_options.all_children_view()) {
58+
for(const auto& saved_option : cfg.child_range("option")) {
59+
options_data_[cfg["id"]][saved_option["id"].str()] = saved_option["value"];
60+
}
61+
}
62+
63+
update_all_options();
64+
}
65+
5166
void mp_options_helper::update_all_options()
5267
{
5368
visible_options_.clear();

src/gui/dialogs/multiplayer/mp_options_helper.hpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,8 @@ class mp_options_helper
4444

4545
config get_options_config();
4646

47+
void set_options(const config& new_options);
48+
4749
private:
4850
struct option_source
4951
{

0 commit comments

Comments
 (0)