From 6eb71ad6eb00097cac31897466b74ddc261b2f8d Mon Sep 17 00:00:00 2001 From: Chris Beck Date: Thu, 5 Jun 2014 12:17:14 -0400 Subject: [PATCH] push end play exceptions out of replay_controller::play_replay Returns a "possible_end_play_signal" now instead. This also required changes to the header in hotkey/command_executor. This seems pretty minor, and could perhaps be refactored later. --- src/hotkey/command_executor.hpp | 4 ++-- src/replay_controller.cpp | 40 ++++++++++++++++++++++----------- src/replay_controller.hpp | 4 +++- 3 files changed, 32 insertions(+), 16 deletions(-) diff --git a/src/hotkey/command_executor.hpp b/src/hotkey/command_executor.hpp index 68a26a5c8b0b..9a422ac5a4c0 100644 --- a/src/hotkey/command_executor.hpp +++ b/src/hotkey/command_executor.hpp @@ -17,7 +17,7 @@ #include "hotkey_command.hpp" #include "display.hpp" - +#include "game_end_exceptions.hpp" namespace hotkey { @@ -79,7 +79,7 @@ class command_executor virtual void ai_formula() {} virtual void clear_messages() {} virtual void change_language() {} - virtual void play_replay() {} + virtual possible_end_play_signal play_replay() { return boost::none; } virtual void reset_replay() {} virtual void stop_replay() {} virtual void replay_next_turn() {} diff --git a/src/replay_controller.cpp b/src/replay_controller.cpp index 21c51e47690d..3e3c8f44d6da 100644 --- a/src/replay_controller.cpp +++ b/src/replay_controller.cpp @@ -439,31 +439,45 @@ void replay_controller::replay_skip_animation(){ } //move all sides till stop/end -void replay_controller::play_replay(){ +possible_end_play_signal replay_controller::play_replay(){ if (recorder.at_end()){ //shouldn't actually happen - return; + return boost::none; } - try{ - is_playing_ = true; - replay_ui_playback_should_start(); + is_playing_ = true; + replay_ui_playback_should_start(); - DBG_REPLAY << "starting main loop\n" << (SDL_GetTicks() - ticks_) << "\n"; - for(; !recorder.at_end() && is_playing_; first_player_ = 1) { - play_turn(); - } + possible_end_play_signal signal = play_replay_main_loop(); - if (!is_playing_) { - gui_->scroll_to_leader(gameboard_.units_, player_number_,game_display::ONSCREEN,false); + if(signal) { + switch ( boost::apply_visitor(get_signal_type(), *signal)) { + case END_TURN: + return signal; + case END_LEVEL: + if ( boost::apply_visitor(get_result(), *signal) == QUIT) { + return signal; + } } + } - catch(end_level_exception& e){ - if (e.result == QUIT) throw; + + if (!is_playing_) { + gui_->scroll_to_leader(gameboard_.units_, player_number_,game_display::ONSCREEN,false); } replay_ui_playback_should_stop(); + + return boost::none; +} + +possible_end_play_signal replay_controller::play_replay_main_loop() { + DBG_REPLAY << "starting main loop\n" << (SDL_GetTicks() - ticks_) << "\n"; + for(; !recorder.at_end() && is_playing_; first_player_ = 1) { + HANDLE_END_PLAY_SIGNAL ( play_turn() ); + } + return boost::none; } //make all sides move, then stop diff --git a/src/replay_controller.hpp b/src/replay_controller.hpp index c0bc2d477feb..745e8823b3c4 100644 --- a/src/replay_controller.hpp +++ b/src/replay_controller.hpp @@ -36,7 +36,7 @@ class replay_controller : public play_controller //event handlers virtual void preferences(); virtual void show_statistics(); - void play_replay(); + possible_end_play_signal play_replay(); void reset_replay(); void stop_replay(); void replay_next_turn(); @@ -67,6 +67,8 @@ class replay_controller : public play_controller void rebuild_replay_theme(); void handle_generic_event(const std::string& /*name*/); + possible_end_play_signal play_replay_main_loop(); + void reset_replay_ui(); void update_replay_ui();