MP Create: implemented most remaining functionality

This commit is contained in:
Charles Dang 2016-08-19 21:34:20 +11:00
parent 369cabc9ae
commit da561512a4
3 changed files with 94 additions and 93 deletions

View file

@ -141,7 +141,7 @@
horizontal_grow = "true"
[combobox]
id = "era"
id = "random_faction_mode"
definition = "default"
[option]
@ -1473,7 +1473,7 @@
border_size = 5
horizontal_alignment = "left"
[toggle_button]
id = "shuffle_sides_toggle"
id = "shuffle_sides"
definition = "default"
label = _ "Shuffle Sides"
@ -1489,7 +1489,7 @@
border_size = 5
horizontal_alignment = "left"
[toggle_button]
id = "observers_toggle"
id = "observers"
definition = "default"
label = _ "Observers"
@ -1505,7 +1505,7 @@
border_size = 5
horizontal_alignment = "left"
[toggle_button]
id = "registered_users_toggle"
id = "registered_users"
definition = "default"
label = _ "Registered Users Only"
@ -1521,7 +1521,7 @@
border_size = 5
horizontal_alignment = "left"
[toggle_button]
id = "debug_oos"
id = "strict_sync"
definition = "default"
label = _ "Strict Synchronization"

View file

@ -51,6 +51,9 @@
namespace gui2
{
// Shorthand
namespace prefs = preferences;
REGISTER_DIALOG(mp_create_game)
tmp_create_game::tmp_create_game(const config& cfg, ng::create_engine& create_eng)
@ -58,34 +61,25 @@ tmp_create_game::tmp_create_game(const config& cfg, ng::create_engine& create_en
, create_engine_(create_eng)
, config_engine_()
, selected_game_index_(-1)
, use_map_settings_(register_bool("use_map_settings",
true, preferences::use_map_settings, preferences::set_use_map_settings,
dialog_callback<tmp_create_game, &tmp_create_game::update_map_settings>))
, fog_(register_bool("fog",
true, preferences::fog, preferences::set_fog))
, shroud_(register_bool("shroud",
true, preferences::shroud, preferences::set_shroud))
, start_time_(register_bool("random_start_time",
true, preferences::random_start_time, preferences::set_random_start_time))
, time_limit_(register_bool("time_limit",
true, preferences::countdown, preferences::set_countdown,
dialog_callback<tmp_create_game, &tmp_create_game::update_map_settings>))
, turns_(register_integer("turn_count",
true, preferences::turns, preferences::set_turns))
, gold_(register_integer("village_gold",
true, preferences::village_gold, preferences::set_village_gold))
, support_(register_integer("village_support",
false, preferences::village_support, preferences::set_village_support))
, experience_(register_integer("experience_modifier",
true, preferences::xp_modifier, preferences::set_xp_modifier))
, init_turn_limit(register_integer("init_turn_limit",
true, preferences::countdown_init_time, preferences::set_countdown_init_time))
, turn_bonus_(register_integer("turn_bonus",
true, preferences::countdown_turn_bonus, preferences::set_countdown_turn_bonus))
, reservior_(register_integer("reservior",
true, preferences::countdown_reservoir_time, preferences::set_countdown_reservoir_time))
, action_bonus_(register_integer("action_bonus",
true, preferences::countdown_action_bonus, preferences::set_countdown_action_bonus))
, use_map_settings_(register_bool( "use_map_settings", true, prefs::use_map_settings, prefs::set_use_map_settings,
dialog_callback<tmp_create_game, &tmp_create_game::update_map_settings>))
, fog_(register_bool("fog", true, prefs::fog, prefs::set_fog))
, shroud_(register_bool("shroud", true, prefs::shroud, prefs::set_shroud))
, start_time_(register_bool("random_start_time", true, prefs::random_start_time, prefs::set_random_start_time))
, time_limit_(register_bool("time_limit", true, prefs::countdown, prefs::set_countdown,
dialog_callback<tmp_create_game, &tmp_create_game::update_map_settings>))
, shuffle_sides_(register_bool("shuffle_sides", true, prefs::shuffle_sides, prefs::set_shuffle_sides))
, observers_(register_bool("observers", true, prefs::allow_observers, prefs::set_allow_observers))
, registered_users_(register_bool("registered_users", true, prefs::registered_users_only, prefs::set_registered_users_only))
, strict_sync_(register_bool("strict_sync", true))
, turns_(register_integer("turn_count", true, prefs::turns, prefs::set_turns))
, gold_(register_integer("village_gold", true, prefs::village_gold, prefs::set_village_gold))
, support_(register_integer("village_support", true, prefs::village_support, prefs::set_village_support))
, experience_(register_integer("experience_modifier", true, prefs::xp_modifier, prefs::set_xp_modifier))
, init_turn_limit(register_integer("init_turn_limit", true, prefs::countdown_init_time, prefs::set_countdown_init_time))
, turn_bonus_(register_integer("turn_bonus", true, prefs::countdown_turn_bonus, prefs::set_countdown_turn_bonus))
, reservior_(register_integer("reservior", true, prefs::countdown_reservoir_time, prefs::set_countdown_reservoir_time))
, action_bonus_(register_integer("action_bonus", true, prefs::countdown_action_bonus, prefs::set_countdown_action_bonus))
{
level_types_ = {
{ng::level::TYPE::SCENARIO, _("Scenarios")},
@ -145,12 +139,12 @@ void tmp_create_game::pre_show(twindow& window)
// Set up filtering
//
connect_signal_notify_modified(find_widget<tslider>(&window, "num_players", false),
std::bind(&tmp_create_game::filter_changed_callback<tslider>, this, std::ref(window), "num_players"));
std::bind(&tmp_create_game::on_filter_change<tslider>, this, std::ref(window), "num_players"));
ttext_box& filter = find_widget<ttext_box>(&window, "game_filter", false);
filter.set_text_changed_callback(
std::bind(&tmp_create_game::filter_changed_callback<ttext_box>, this, std::ref(window), "game_filter"));
std::bind(&tmp_create_game::on_filter_change<ttext_box>, this, std::ref(window), "game_filter"));
window.add_to_keyboard_chain(&filter);
@ -197,20 +191,17 @@ void tmp_create_game::pre_show(twindow& window)
//
tlistbox& mod_list = find_widget<tlistbox>(&window, "mod_list", false);
//std::vector<std::string> mods = create_engine_.extras_menu_item_names(ng::create_engine::MOD, false);
for(const auto& mod : create_engine_.get_const_extras_by_type(ng::create_engine::MOD)) {
for(const auto& mod : create_engine_.extras_menu_item_names(ng::create_engine::MOD, false)) {
std::map<std::string, string_map> data;
string_map item;
item["label"] = mod->name;
item["label"] = mod;
data.emplace("mod_name", item);
tgrid* row_grid = &mod_list.add_row(data);
ttoggle_button& mog_toggle = find_widget<ttoggle_button>(row_grid, "mod_active_state", false);
// TODO
//mog_toggle.set_active(true);
mog_toggle.set_callback_state_change(std::bind(&tmp_create_game::on_mod_toggle, this, mod_list.get_item_count() - 1, _1));
}
@ -257,6 +248,23 @@ void tmp_create_game::pre_show(twindow& window)
on_tab_select(window);
}
template<typename widget>
void tmp_create_game::on_filter_change(twindow& window, const std::string& id)
{
create_engine_.apply_level_filter(find_widget<widget>(&window, id, false).get_value());
tlistbox& game_list = find_widget<tlistbox>(&window, "games_list", false);
std::vector<bool> filtered(game_list.get_item_count());
for(const size_t i : create_engine_.get_filtered_level_indices(create_engine_.current_level_type())) {
filtered[i] = true;
}
game_list.set_row_shown(filtered);
update_details(window);
}
void tmp_create_game::on_game_select(twindow& window)
{
if(find_widget<tlistbox>(&window, "games_list", false).get_selected_row() != selected_game_index_) {
@ -285,28 +293,26 @@ void tmp_create_game::on_tab_select(twindow& window)
}
}
template<typename widget>
void tmp_create_game::filter_changed_callback(twindow& window, const std::string& id)
void tmp_create_game::on_mod_select(twindow& window)
{
create_engine_.apply_level_filter(find_widget<widget>(&window, id, false).get_value());
create_engine_.set_current_mod_index(find_widget<tlistbox>(&window, "mod_list", false).get_selected_row());
tlistbox& game_list = find_widget<tlistbox>(&window, "games_list", false);
std::vector<bool> filtered(game_list.get_item_count());
for(const size_t i : create_engine_.get_filtered_level_indices(create_engine_.current_level_type())) {
filtered[i] = true;
}
game_list.set_row_shown(filtered);
update_details(window);
find_widget<tcontrol>(&window, "description", false).set_label(
create_engine_.current_extra(ng::create_engine::MOD).description);
}
void tmp_create_game::update_games_list(twindow& window)
void tmp_create_game::on_mod_toggle(const int index, twidget&)
{
const int index = find_widget<tcombobox>(&window, "game_types", false).get_value();
create_engine_.set_current_mod_index(index);
create_engine_.toggle_current_mod();
}
display_games_of_type(window, level_types_[index].first);
void tmp_create_game::on_era_select(twindow& window)
{
create_engine_.set_current_era_index(find_widget<tcombobox>(&window, "eras", false).get_value());
find_widget<tcontrol>(&window, "description", false).set_label(
create_engine_.current_extra(ng::create_engine::ERA).description);
}
void tmp_create_game::display_games_of_type(twindow& window, ng::level::TYPE type)
@ -347,40 +353,6 @@ void tmp_create_game::display_games_of_type(twindow& window, ng::level::TYPE typ
update_details(window);
}
void tmp_create_game::dialog_exit_hook(twindow& window) {
if(create_engine_.current_level_type() == ng::level::TYPE::CAMPAIGN ||
create_engine_.current_level_type() == ng::level::TYPE::SP_CAMPAIGN) {
if(create_engine_.select_campaign_difficulty() == "CANCEL") {
return;
}
}
window.set_retval(twindow::OK);
}
void tmp_create_game::on_mod_select(twindow& window)
{
create_engine_.set_current_mod_index(find_widget<tlistbox>(&window, "mod_list", false).get_selected_row());
find_widget<tcontrol>(&window, "description", false).set_label(
create_engine_.current_extra(ng::create_engine::MOD).description);
}
void tmp_create_game::on_mod_toggle(const int index, twidget&)
{
create_engine_.set_current_mod_index(index);
create_engine_.toggle_current_mod();
}
void tmp_create_game::on_era_select(twindow& window)
{
create_engine_.set_current_era_index(find_widget<tcombobox>(&window, "eras", false).get_value());
find_widget<tcontrol>(&window, "description", false).set_label(
create_engine_.current_extra(ng::create_engine::ERA).description);
}
template<typename T>
static config::attribute_value cav(const T& v)
{
@ -506,6 +478,13 @@ void tmp_create_game::display_custom_options(ttree_view& tree, std::string&& typ
}
}
void tmp_create_game::update_games_list(twindow& window)
{
const int index = find_widget<tcombobox>(&window, "game_types", false).get_value();
display_games_of_type(window, level_types_[index].first);
}
void tmp_create_game::update_options_list(twindow& window)
{
ttree_view& options_tree = find_widget<ttree_view>(&window, "custom_options", false);
@ -619,6 +598,7 @@ void tmp_create_game::update_details(twindow& window)
}
players.set_label(players_str.str());
map_size.set_label(utils::unicode_em_dash);
break;
}
@ -668,6 +648,18 @@ void tmp_create_game::update_map_settings(twindow& window)
}
}
void tmp_create_game::dialog_exit_hook(twindow& window) {
if(create_engine_.current_level_type() == ng::level::TYPE::CAMPAIGN ||
create_engine_.current_level_type() == ng::level::TYPE::SP_CAMPAIGN) {
if(create_engine_.select_campaign_difficulty() == "CANCEL") {
return;
}
}
window.set_retval(twindow::OK);
}
void tmp_create_game::post_show(twindow& window)
{
if(get_retval() == twindow::OK) {
@ -679,7 +671,7 @@ void tmp_create_game::post_show(twindow& window)
} else if(create_engine_.current_level_type() == ng::level::TYPE::SCENARIO) {
create_engine_.prepare_for_scenario();
} else {
//This means define= doesn't work for random generated scenarios
// This means define= doesn't work for randomly generated scenarios
create_engine_.prepare_for_other();
}
@ -706,6 +698,15 @@ void tmp_create_game::post_show(twindow& window)
config_engine_->set_mp_countdown_reservoir_time(reservior_->get_widget_value(window));
config_engine_->set_mp_countdown_action_bonus(action_bonus_->get_widget_value(window));
config_engine_->set_allow_observers(observers_->get_widget_value(window));
config_engine_->set_registered_users_only(registered_users_->get_widget_value(window));
config_engine_->set_oos_debug(strict_sync_->get_widget_value(window));
config_engine_->set_shuffle_sides(shuffle_sides_->get_widget_value(window));
// TODO: we rely on a hardcoded list in the WML file. Should we procedurally generate the contents?
config_engine_->set_random_faction_mode(mp_game_settings::RANDOM_FACTION_MODE::from_int(
find_widget<tcombobox>(&window, "random_faction_mode", false).get_value()));
config options;
for(const auto& mod_pair : visible_options_) {
config& mod = options.add_child(mod_pair.first[0]);

View file

@ -68,12 +68,12 @@ private:
* manually controlled as well so add the pointers here as well.
*/
tfield_bool* use_map_settings_, *fog_, *shroud_, *start_time_, *time_limit_;
tfield_bool* use_map_settings_, *fog_, *shroud_, *start_time_, *time_limit_, *shuffle_sides_, *observers_, *registered_users_, *strict_sync_;
tfield_integer* turns_, *gold_, *support_, *experience_, *init_turn_limit, *turn_bonus_, *reservior_, *action_bonus_;
template<typename widget>
void filter_changed_callback(twindow& window, const std::string& id);
void on_filter_change(twindow& window, const std::string& id);
void on_game_select(twindow& window);