void play_controller::play_side() { //check for team-specific items in the scenario gui_->parse_team_overlays(); do { update_viewing_player(); { save_blocker blocker; maybe_do_init_side(); if(is_regular_game_end()) { return; } } // This flag can be set by derived classes (in overridden functions). player_type_changed_ = false; statistics::reset_turn_stats(gamestate().board_.teams()[current_side() - 1].save_id()); play_side_impl(); if(is_regular_game_end()) { return; } } while (player_type_changed_); // Keep looping if the type of a team (human/ai/networked) // has changed mid-turn sync_end_turn(); }
void playsingle_controller::play_side() { //check for team-specific items in the scenario gui_->parse_team_overlays(); maybe_do_init_side(); if(is_regular_game_end()) { return; } //flag used when we fallback from ai and give temporarily control to human bool temporary_human = false; do { //Update viewing team in case it has changed during the loop. if(int side_num = play_controller::find_last_visible_team()) { if(side_num != this->gui_->viewing_side()) { update_gui_to_player(side_num - 1); } } // This flag can be set by derived classes (in overridden functions). player_type_changed_ = false; if (!skip_next_turn_) end_turn_ = END_TURN_NONE; statistics::reset_turn_stats(gamestate_.board_.teams()[player_number_ - 1].save_id()); if((current_team().is_local_human() && current_team().is_proxy_human()) || temporary_human) { LOG_NG << "is human...\n"; temporary_human = false; // If a side is dead end the turn, but play at least side=1's // turn in case all sides are dead if (gamestate_.board_.side_units(player_number_) == 0 && !(gamestate_.board_.units().size() == 0 && player_number_ == 1)) { end_turn_ = END_TURN_REQUIRED; } before_human_turn(); if (end_turn_ == END_TURN_NONE) { play_human_turn(); } if(is_regular_game_end()) { return; } if ( !player_type_changed_ ) { after_human_turn(); } LOG_NG << "human finished turn...\n"; } else if(current_team().is_local_ai() || (current_team().is_local_human() && current_team().is_droid())) { try { play_ai_turn(); } catch(fallback_ai_to_human_exception&) { // Give control to a human for this turn. player_type_changed_ = true; temporary_human = true; } if(is_regular_game_end()) { return; } } else if(current_team().is_network()) { play_network_turn(); if(is_regular_game_end()) { return; } } else if(current_team().is_local_human() && current_team().is_idle()) { end_turn_enable(false); do_idle_notification(); before_human_turn(); if (end_turn_ == END_TURN_NONE) { play_idle_loop(); if(is_regular_game_end()) { return; } } } else { assert(current_team().is_empty()); // Do nothing. } } while (player_type_changed_); // Keep looping if the type of a team (human/ai/networked) // has changed mid-turn sync_end_turn(); assert(end_turn_ == END_TURN_SYNCED); skip_next_turn_ = false; }