void create::process_event() { int mousex, mousey; SDL_GetMouseState(&mousex,&mousey); tooltips::process(mousex, mousey); if (cancel_game_.pressed()) { set_result(QUIT); return; } if (launch_game_.pressed() || levels_menu_.double_clicked()) { if (engine_.current_level().can_launch_game()) { if (engine_.current_level_type() == level::CAMPAIGN || engine_.current_level_type() == level::SP_CAMPAIGN) { std::string difficulty = select_campaign_difficulty(); if (difficulty == "CANCEL") { return; } engine_.prepare_for_campaign(difficulty); } engine_.prepare_for_new_level(); set_result(CREATE); return; } else { gui2::show_transient_message(disp_.video(), "", _("The level is invalid.")); } } if (level_type_combo_.changed()) { init_level_type_changed(0); } if (load_game_.pressed()) { engine_.prepare_for_saved_game(); set_result(LOAD_GAME); return; } bool update_mod_button_label = mod_selection_ != mods_menu_.selection(); if (select_mod_.pressed() || mods_menu_.double_clicked()) { int index = mods_menu_.selection(); engine_.set_current_mod_index(index); engine_.toggle_current_mod(); update_mod_button_label = true; synchronize_selections(); } if (update_mod_button_label) { mod_selection_ = mods_menu_.selection(); engine_.set_current_mod_index(mod_selection_); set_description(engine_.current_extra(create_engine::MOD).description); if (engine_.dependency_manager().is_modification_active(mod_selection_)) { select_mod_.set_label(_("Deactivate")); } else { select_mod_.set_label(_("Activate")); } } bool era_changed = era_selection_ != eras_menu_.selection(); era_selection_ = eras_menu_.selection(); if (era_changed) { engine_.set_current_era_index(era_selection_); set_description(engine_.current_extra(create_engine::ERA).description); synchronize_selections(); } if (filter_name_.text() != engine_.level_name_filter()) { engine_.apply_level_filter(filter_name_.text()); init_level_type_changed(0); } bool level_changed = level_selection_ != levels_menu_.selection(); level_selection_ = levels_menu_.selection(); if (level_changed && level_selection_ >= 0) { init_level_changed(level_selection_); synchronize_selections(); } if (engine_.generator_assigned() && generator_settings_.pressed()) { engine_.generator_user_config(disp_); level_changed = true; } if(engine_.generator_assigned() && (level_changed || regenerate_map_.pressed())) { const cursor::setter cursor_setter(cursor::WAIT); cursor::setter cur(cursor::WAIT); engine_.init_generated_level_data(); if (!engine_.current_level().data()["error_message"].empty()) gui2::show_message(disp().video(), "map generation error", engine_.current_level().data()["error_message"]); level_changed = true; } if(level_changed) { std::stringstream players; std::stringstream map_size; players << _("Players: "); engine_.current_level().set_metadata(); draw_level_image(); set_description(engine_.current_level().description()); switch (engine_.current_level_type()) { case level::SCENARIO: case level::USER_MAP: case level::USER_SCENARIO: case level::RANDOM_MAP: { scenario* current_scenario = dynamic_cast<scenario*>(&engine_.current_level()); players << current_scenario->num_players(); map_size << _("Size: ") << current_scenario->map_size(); break; } case level::CAMPAIGN: case level::SP_CAMPAIGN: { campaign* current_campaign = dynamic_cast<campaign*>(&engine_.current_level()); players << current_campaign->min_players(); if (current_campaign->max_players() != current_campaign->min_players()) { players << " to " << current_campaign->max_players(); } break; } } // end switch map_size_label_.set_text(map_size.str()); num_players_label_.set_text(players.str()); launch_game_.enable(engine_.current_level().can_launch_game()); generator_settings_.enable(engine_.generator_assigned()); regenerate_map_.enable(engine_.generator_assigned()); } if (filter_num_players_slider_.value() != engine_.player_num_filter()) { const int val = filter_num_players_slider_.value(); engine_.apply_level_filter(val); std::stringstream ss; if (val == 1) { ss << _("Number of players: any"); } else { ss << _("Number of players: ") << val; } filter_num_players_label_.set_text(ss.str()); init_level_type_changed(0); } }
void create::process_event_impl(const process_event_data & data) { if (data.quit) { set_result(QUIT); return; } if (data.create) { if (engine_.current_level().can_launch_game()) { engine_.prepare_for_era_and_mods(); if (engine_.current_level_type() == ng::level::TYPE::CAMPAIGN || engine_.current_level_type() == ng::level::TYPE::SP_CAMPAIGN) { std::string difficulty = engine_.select_campaign_difficulty(); if (difficulty == "CANCEL") { return; } engine_.prepare_for_campaign(difficulty); } else if (engine_.current_level_type() == ng::level::TYPE::SCENARIO) { engine_.prepare_for_scenario(); } else { //This means define= doesn't work for random generated scenarios engine_.prepare_for_other(); } engine_.prepare_for_new_level(); set_result(CREATE); return; } else { gui2::show_transient_message(disp_.video(), "", _("The level is invalid.")); } } if (level_type_combo_.changed()) { init_level_type_changed(0); } if (data.load) { try { savegame::loadgame load(disp_, game_config_manager::get()->game_config(), engine_.get_state()); if (data.filename) { if (!load.load_game(*data.filename, false, false, false, "", true)) { return ; } } else { if (!load.load_multiplayer_game()) { return ; } } if (load.cancel_orders()) engine_.get_state().cancel_orders(); engine_.prepare_for_saved_game(); set_result(LOAD_GAME); return; } catch(config::error&) { } } if (mod_selection_ != mods_menu_.selection()) { mod_selection_ = mods_menu_.selection(); engine_.set_current_mod_index(mod_selection_); set_description(engine_.current_extra(ng::create_engine::MOD).description); } int changed_mod = mods_menu_.last_changed(); if (changed_mod != -1) { engine_.set_current_mod_index(changed_mod); engine_.toggle_current_mod(); synchronize_selections(); } bool era_changed = era_selection_ != eras_menu_.selection(); era_selection_ = eras_menu_.selection(); if (era_changed) { engine_.set_current_era_index(era_selection_); set_description(engine_.current_extra(ng::create_engine::ERA).description); synchronize_selections(); } if (filter_name_.text() != engine_.level_name_filter()) { engine_.apply_level_filter(filter_name_.text()); init_level_type_changed(0); } bool level_changed = level_selection_ != levels_menu_.selection(); level_selection_ = levels_menu_.selection(); if (level_changed && level_selection_ >= 0) { init_level_changed(level_selection_); synchronize_selections(); } if (engine_.generator_assigned() && generator_settings_.pressed()) { engine_.generator_user_config(disp_); level_changed = true; } if(engine_.generator_assigned() && (level_changed || regenerate_map_.pressed())) { const cursor::setter cursor_setter(cursor::WAIT); cursor::setter cur(cursor::WAIT); engine_.init_generated_level_data(); if (!engine_.current_level().data()["error_message"].empty()) gui2::show_message(disp().video(), "map generation error", engine_.current_level().data()["error_message"]); level_changed = true; } if(level_changed) { std::stringstream players; std::stringstream map_size; players << _("Players: "); engine_.current_level().set_metadata(); draw_level_image(); set_description(engine_.current_level().description()); switch (engine_.current_level_type().v) { case ng::level::TYPE::SCENARIO: case ng::level::TYPE::USER_MAP: case ng::level::TYPE::USER_SCENARIO: case ng::level::TYPE::RANDOM_MAP: { ng::scenario* current_scenario = dynamic_cast<ng::scenario*>(&engine_.current_level()); assert(current_scenario); players << current_scenario->num_players(); map_size << _("Size: ") << current_scenario->map_size(); break; } case ng::level::TYPE::CAMPAIGN: case ng::level::TYPE::SP_CAMPAIGN: { ng::campaign* current_campaign = dynamic_cast<ng::campaign*>(&engine_.current_level()); assert(current_campaign); players << current_campaign->min_players(); if (current_campaign->max_players() != current_campaign->min_players()) { players << " to " << current_campaign->max_players(); } break; } } // end switch map_size_label_.set_text(map_size.str()); num_players_label_.set_text(players.str()); launch_game_.enable(engine_.current_level().can_launch_game()); generator_settings_.enable(engine_.generator_assigned()); regenerate_map_.enable(engine_.generator_assigned()); } if (filter_num_players_slider_.value() != engine_.player_num_filter()) { const int val = filter_num_players_slider_.value(); engine_.apply_level_filter(val); std::stringstream ss; if (val == 1) { ss << _("Number of players: any"); } else { ss << _("Number of players: ") << val; } filter_num_players_label_.set_text(ss.str()); init_level_type_changed(0); } }