Author: dragonking
Date: Thu Mar 10 19:07:57 2011
New Revision: 48834
URL: http://svn.gna.org/viewcvs/wesnoth?rev=48834&view=rev
Log:
Improvements and fixes for replay controller and control buttons
Modified:
branches/1.8/src/display.cpp
branches/1.8/src/display.hpp
branches/1.8/src/play_controller.cpp
branches/1.8/src/play_controller.hpp
branches/1.8/src/replay.cpp
branches/1.8/src/replay_controller.cpp
branches/1.8/src/replay_controller.hpp
branches/1.8/src/theme.cpp
branches/1.8/src/theme.hpp
Modified: branches/1.8/src/display.cpp
URL:
http://svn.gna.org/viewcvs/wesnoth/branches/1.8/src/display.cpp?rev=48834&r1=48833&r2=48834&view=diff
==============================================================================
--- branches/1.8/src/display.cpp (original)
+++ branches/1.8/src/display.cpp Thu Mar 10 19:07:57 2011
@@ -101,6 +101,7 @@
fog_image_("terrain/" +
get_map().get_terrain_info(t_translation::FOGGED).minimap_image() + ".png"),
tod_(time_of_day()),
scroll_event_("scrolled"),
+ complete_redraw_event_("completely_redrawn"),
nextDraw_(0),
report_(),
buttons_(),
@@ -1864,6 +1865,8 @@
foreach (boost::function<void(display&)> f, redraw_observers_) {
f(*this);
}
+
+ complete_redraw_event_.notify_observers();
}
void display::add_redraw_observer(boost::function<void(display&)> f)
Modified: branches/1.8/src/display.hpp
URL:
http://svn.gna.org/viewcvs/wesnoth/branches/1.8/src/display.hpp?rev=48834&r1=48833&r2=48834&view=diff
==============================================================================
--- branches/1.8/src/display.hpp (original)
+++ branches/1.8/src/display.hpp Thu Mar 10 19:07:57 2011
@@ -434,6 +434,8 @@
/** Expose the event, so observers can be notified about map scrolling.
*/
events::generic_event &scroll_event() const { return scroll_event_; }
+
+ events::generic_event& complete_redraw_event() { return
complete_redraw_event_; }
/** Check if a tile is fully visible on screen. */
bool tile_fully_on_screen(const map_location& loc);
@@ -586,6 +588,12 @@
/** Event raised when the map is being scrolled */
mutable events::generic_event scroll_event_;
+
+ /**
+ * notify observers that the screen has been redrawn completely
+ * atm this is used for replay_controller to add replay controls to the
standard theme
+ */
+ events::generic_event complete_redraw_event_;
/**
* Holds the tick count for when the next drawing event is scheduled.
Modified: branches/1.8/src/play_controller.cpp
URL:
http://svn.gna.org/viewcvs/wesnoth/branches/1.8/src/play_controller.cpp?rev=48834&r1=48833&r2=48834&view=diff
==============================================================================
--- branches/1.8/src/play_controller.cpp (original)
+++ branches/1.8/src/play_controller.cpp Thu Mar 10 19:07:57 2011
@@ -482,7 +482,7 @@
team& current_team = teams_[team_index];
mouse_handler_.set_side(team_index + 1);
-
+
// If we are observers we move to watch next team if it is allowed
if (is_observer()
&& !current_team.get_disallow_observers()) {
@@ -502,13 +502,13 @@
|| is_replay)
return;
if (!loading_game_) recorder.init_side();
- do_init_side(team_index);
+ do_init_side(team_index, is_replay);
}
/**
* Called by replay handler or init_side() to do actual work for turn change.
*/
-void play_controller::do_init_side(const unsigned int team_index){
+void play_controller::do_init_side(const unsigned int team_index, bool
is_replay) {
log_scope("player turn");
team& current_team = teams_[team_index];
Modified: branches/1.8/src/play_controller.hpp
URL:
http://svn.gna.org/viewcvs/wesnoth/branches/1.8/src/play_controller.hpp?rev=48834&r1=48833&r2=48834&view=diff
==============================================================================
--- branches/1.8/src/play_controller.hpp (original)
+++ branches/1.8/src/play_controller.hpp Thu Mar 10 19:07:57 2011
@@ -92,7 +92,7 @@
virtual void toggle_grid();
virtual void search();
- virtual void do_init_side(const unsigned int team_index);
+ virtual void do_init_side(const unsigned int team_index, bool is_replay
= false);
virtual void play_side(const unsigned int team_num, bool save) = 0;
virtual void force_end_turn() = 0;
Modified: branches/1.8/src/replay.cpp
URL:
http://svn.gna.org/viewcvs/wesnoth/branches/1.8/src/replay.cpp?rev=48834&r1=48833&r2=48834&view=diff
==============================================================================
--- branches/1.8/src/replay.cpp (original)
+++ branches/1.8/src/replay.cpp Thu Mar 10 19:07:57 2011
@@ -905,7 +905,7 @@
else if (cfg->child("init_side"))
{
- resources::controller->do_init_side(side_num - 1);
+ resources::controller->do_init_side(side_num - 1, true);
}
//if there is an end turn directive
Modified: branches/1.8/src/replay_controller.cpp
URL:
http://svn.gna.org/viewcvs/wesnoth/branches/1.8/src/replay_controller.cpp?rev=48834&r1=48833&r2=48834&view=diff
==============================================================================
--- branches/1.8/src/replay_controller.cpp (original)
+++ branches/1.8/src/replay_controller.cpp Thu Mar 10 19:07:57 2011
@@ -66,7 +66,8 @@
delay_(0),
is_playing_(false),
show_everything_(false),
- show_team_(state_of_game.classification().campaign_type ==
"multiplayer" ? 0 : 1)
+ show_team_(state_of_game.classification().campaign_type ==
"multiplayer" ? 0 : 1),
+ buttons_()
{
init();
gamestate_start_ = gamestate_;
@@ -77,7 +78,8 @@
//YogiHH
//not absolutely sure if this is needed, but it makes me feel a lot
better ;-)
//feel free to delete this if it is not necessary
- gui_->get_theme().theme_reset().detach_handler(this);
+ gui_->get_theme().theme_reset_event().detach_handler(this);
+ gui_->complete_redraw_event().detach_handler(this);
}
void replay_controller::init(){
@@ -116,13 +118,16 @@
for(std::vector<team>::iterator t = teams_.begin(); t != teams_.end();
++t) {
t->reset_objectives_changed();
}
+
+ buttons_.update(gui_);
}
void replay_controller::init_replay_display(){
DBG_REPLAY << "initializing replay-display... " << (SDL_GetTicks() -
ticks_) << "\n";
rebuild_replay_theme();
- gui_->get_theme().theme_reset().attach_handler(this);
+ gui_->get_theme().theme_reset_event().attach_handler(this);
+ gui_->complete_redraw_event().attach_handler(this);
DBG_REPLAY << "done initializing replay-display... " << (SDL_GetTicks()
- ticks_) << "\n";
}
@@ -140,17 +145,120 @@
}
}
+
+void
replay_controller::replay_buttons_wrapper::update(boost::scoped_ptr<game_display>&
gui_)
+{
+ play_button_ = gui_->find_button("button-playreplay");
+ stop_button_ = gui_->find_button("button-stopreplay");
+ reset_button_ = gui_->find_button("button-resetreplay");
+ play_turn_button_ = gui_->find_button("button-nextturn");
+ play_side_button_ = gui_->find_button("button-nextside");
+
+ //check if we have all buttons - if someone messed with theme then some
buttons may be missing
+ //if any of the buttons is missing, we just disable everything
+ if( !play_button_ || !stop_button_ || !reset_button_ ||
!play_turn_button_ || !play_side_button_ ) {
+
+ is_valid_ = false;
+ enabled_buttons_ = 0;
+ } else {
+ is_valid_ = true;
+ if( enabled_buttons_ == 0)
+ enabled_buttons_ = PLAY_BUTTON_ENABLED |
PLAY_TURN_BUTTON_ENABLED | PLAY_SIDE_BUTTON_ENABLED;
+ }
+
+ update_buttons_states();
+}
+
+void replay_controller::replay_buttons_wrapper::update_buttons_states()
+{
+ if( enabled_buttons_ & PLAY_BUTTON_ENABLED ) {
+ play_button_->enable(true);
+ } else
+ play_button_->enable(false);
+
+ if( enabled_buttons_ & STOP_BUTTON_ENABLED ) {
+ stop_button_->enable(true);
+ } else
+ stop_button_->enable(false);
+
+ if( enabled_buttons_ & RESET_BUTTON_ENABLED ) {
+ reset_button_->enable(true);
+ } else
+ reset_button_->enable(false);
+
+ if( enabled_buttons_ & PLAY_TURN_BUTTON_ENABLED ) {
+ play_turn_button_->enable(true);
+ } else
+ play_turn_button_->enable(false);
+
+ if( enabled_buttons_ & PLAY_SIDE_BUTTON_ENABLED ) {
+ play_side_button_->enable(true);
+ } else
+ play_side_button_->enable(false);
+}
+
+void replay_controller::replay_buttons_wrapper::playback_should_start()
+{
+ if( !is_valid_ )
+ return;
+
+ play_button_->enable(false);
+ stop_button_->enable(true);
+ reset_button_->enable(false);
+ play_turn_button_->enable(false);
+ play_side_button_->enable(false);
+
+ enabled_buttons_ = STOP_BUTTON_ENABLED;
+}
+
+void replay_controller::replay_buttons_wrapper::playback_should_stop(bool
is_playing)
+{
+ if( !is_valid_)
+ return;
+
+ if( !recorder.at_end() ) {
+
+ enabled_buttons_ = PLAY_BUTTON_ENABLED | RESET_BUTTON_ENABLED |
PLAY_TURN_BUTTON_ENABLED | PLAY_SIDE_BUTTON_ENABLED;
+
+ update_buttons_states();
+
+ play_button_->release();
+ play_turn_button_->release();
+ play_side_button_->release();
+ } else {
+ enabled_buttons_ = RESET_BUTTON_ENABLED;
+
+ update_buttons_states();
+ }
+
+ if( !is_playing ) {
+ //user interrupted
+ stop_button_->release();
+ }
+}
+
+void replay_controller::replay_buttons_wrapper::reset_buttons()
+{
+ if( !is_valid_ )
+ return;
+
+ enabled_buttons_ = PLAY_BUTTON_ENABLED | PLAY_TURN_BUTTON_ENABLED |
PLAY_SIDE_BUTTON_ENABLED;
+
+ stop_button_->release();
+ reset_button_->release();
+
+ update_buttons_states();
+}
+
void replay_controller::reset_replay(){
- gui::button* b = gui_->find_button("button-playreplay");
- if (b != NULL) { b->release(); }
- b = gui_->find_button("button-stopreplay");
- if (b != NULL) { b->release(); }
gui_->clear_chat_messages();
is_playing_ = false;
player_number_ = 1;
current_turn_ = 1;
+ skip_replay_ = false;
tod_manager_= tod_manager_start_;
recorder.start_replay();
+ recorder.set_skip(false);
units_ = units_start_;
gamestate_ = gamestate_start_;
teams_ = teams_start_;
@@ -177,30 +285,33 @@
events::raise_draw_event();
(*gui_).invalidate_all();
(*gui_).draw();
- b = gui_->find_button("button-resetreplay");
- if (b != NULL) { b->release(); }
+ gui_->set_team(player_number_-1, show_everything_);
+ //gui_->scroll_to_leader(units_,
player_number_,game_display::ONSCREEN,false);
+
+ buttons_.reset_buttons();
}
void replay_controller::stop_replay(){
is_playing_ = false;
- gui::button* b = gui_->find_button("button-playreplay");
- if (b != NULL) { b->release(); }
}
void replay_controller::replay_next_turn(){
is_playing_ = true;
+ buttons_.playback_should_start();
+
play_turn();
- if (!skip_replay_){
+ if (!skip_replay_ || !is_playing_){
gui_->scroll_to_leader(units_,
player_number_,game_display::ONSCREEN,false);
}
- is_playing_ = false;
- gui::button* b = gui_->find_button("button-nextturn");
- if (b != NULL) { b->release(); }
+
+ buttons_.playback_should_stop(is_playing_);
}
void replay_controller::replay_next_side(){
is_playing_ = true;
+ buttons_.playback_should_start();
+
play_side(player_number_ - 1, false);
if (static_cast<size_t>(player_number_) > teams_.size()) {
@@ -208,13 +319,11 @@
current_turn_++;
}
- if (!skip_replay_) {
+ if (!skip_replay_ || !is_playing_) {
gui_->scroll_to_leader(units_,
player_number_,game_display::ONSCREEN,false);
}
- is_playing_ = false;
- gui::button* b = gui_->find_button("button-nextside");
- if (b != NULL) { b->release(); }
+ buttons_.playback_should_stop(is_playing_);
}
void replay_controller::process_oos(const std::string& msg) const
@@ -252,35 +361,37 @@
}
void replay_controller::replay_skip_animation(){
- recorder.set_skip(!recorder.is_skipping());
skip_replay_ = !skip_replay_;
+ recorder.set_skip(skip_replay_);
}
void replay_controller::play_replay(){
- gui::button* b = gui_->find_button("button-stopreplay");
- if (b != NULL) { b->release(); }
+
if (recorder.at_end()){
return;
}
try{
is_playing_ = true;
+ buttons_.playback_should_start();
DBG_REPLAY << "starting main loop\n" << (SDL_GetTicks() -
ticks_) << "\n";
for(; !recorder.at_end() && is_playing_; first_player_ = 1) {
play_turn();
} //end for loop
- is_playing_ = false;
+
+ if (!is_playing_) {
+ gui_->scroll_to_leader(units_,
player_number_,game_display::ONSCREEN,false);
+ }
}
catch(end_level_exception& e){
if (e.result == QUIT) { throw e; }
}
+
+ buttons_.playback_should_stop(is_playing_);
}
void replay_controller::play_turn(){
- if (recorder.at_end()){
- return;
- }
LOG_REPLAY << "turn: " << current_turn_ << "\n";
@@ -298,9 +409,6 @@
}
void replay_controller::play_side(const unsigned int /*team_index*/, bool){
- if (recorder.at_end()){
- return;
- }
DBG_REPLAY << "Status turn number: " << turn() << "\n";
DBG_REPLAY << "Replay_Controller turn number: " << current_turn_ <<
"\n";
@@ -333,6 +441,7 @@
finish_turn();
player_number_ = 1;
current_turn_++;
+ gui_->new_turn();
}
update_teams();
@@ -350,10 +459,14 @@
next_team = 1;
}
- if (!show_team_)
- gui_->set_team(next_team - 1, show_everything_);
+ if (!show_team_) {
+ gui_->set_team(next_team - 1, show_everything_);
+ } else {
+ gui_->set_team(show_team_ - 1, show_everything_);
+ }
::clear_shroud(next_team);
+
gui_->set_playing_team(next_team - 1);
gui_->invalidate_all();
}
@@ -375,8 +488,17 @@
menu_handler_.show_statistics(gui_->playing_team()+1);
}
-void replay_controller::handle_generic_event(const std::string& /*name*/){
- rebuild_replay_theme();
+void replay_controller::handle_generic_event(const std::string& name){
+
+ if( name == "completely_redrawn" ) {
+ buttons_.update(gui_);
+
+ gui::button* skip_animation_button =
gui_->find_button("skip-animation");
+
+ skip_animation_button->set_check(skip_replay_);
+ } else {
+ rebuild_replay_theme();
+ }
}
bool replay_controller::can_execute_command(hotkey::HOTKEY_COMMAND command,
int index) const
Modified: branches/1.8/src/replay_controller.hpp
URL:
http://svn.gna.org/viewcvs/wesnoth/branches/1.8/src/replay_controller.hpp?rev=48834&r1=48833&r2=48834&view=diff
==============================================================================
--- branches/1.8/src/replay_controller.hpp (original)
+++ branches/1.8/src/replay_controller.hpp Thu Mar 10 19:07:57 2011
@@ -64,7 +64,7 @@
void update_gui();
void init_replay_display();
void rebuild_replay_theme();
- void handle_generic_event(const std::string& /*name*/);
+ void handle_generic_event(const std::string& name);
game_state gamestate_start_;
unit_map units_start_;
@@ -76,6 +76,39 @@
bool show_everything_;
unsigned int show_team_;
+
+ class replay_buttons_wrapper {
+
+ bool is_valid_;
+
+ //bit mask
+ uint enabled_buttons_;
+
+ void update_buttons_states();
+
+ public:
+ static const uint PLAY_BUTTON_ENABLED = 1;
+ static const uint STOP_BUTTON_ENABLED = 2;
+ static const uint RESET_BUTTON_ENABLED = 4;
+ static const uint PLAY_TURN_BUTTON_ENABLED = 8;
+ static const uint PLAY_SIDE_BUTTON_ENABLED = 16;
+
+ replay_buttons_wrapper() : is_valid_(false), enabled_buttons_()
{}
+
+ gui::button* play_button_;
+ gui::button* stop_button_;
+ gui::button* reset_button_;
+ gui::button* play_turn_button_;
+ gui::button* play_side_button_;
+
+ void update(boost::scoped_ptr<game_display>& gui_);
+ void playback_should_start();
+ void playback_should_stop(bool is_playing);
+
+ void reset_buttons();
+ };
+
+ replay_buttons_wrapper buttons_;
};
Modified: branches/1.8/src/theme.cpp
URL:
http://svn.gna.org/viewcvs/wesnoth/branches/1.8/src/theme.cpp?rev=48834&r1=48833&r2=48834&view=diff
==============================================================================
--- branches/1.8/src/theme.cpp (original)
+++ branches/1.8/src/theme.cpp Thu Mar 10 19:07:57 2011
@@ -522,7 +522,7 @@
}
theme::theme(const config& cfg, const SDL_Rect& screen) :
- theme_reset_("theme_reset"),
+ theme_reset_event_("theme_reset"),
cur_theme(),
cfg_(),
panels_(),
@@ -594,7 +594,7 @@
m->set_title(title_stash[m->get_id()]);
}
- theme_reset_.notify_observers();
+ theme_reset_event_.notify_observers();
return result;
}
Modified: branches/1.8/src/theme.hpp
URL:
http://svn.gna.org/viewcvs/wesnoth/branches/1.8/src/theme.hpp?rev=48834&r1=48833&r2=48834&view=diff
==============================================================================
--- branches/1.8/src/theme.hpp (original)
+++ branches/1.8/src/theme.hpp Thu Mar 10 19:07:57 2011
@@ -226,7 +226,7 @@
const tborder& border() const { return border_; }
- events::generic_event& theme_reset() { return theme_reset_; }
+ events::generic_event& theme_reset_event() { return theme_reset_event_;
}
private:
theme::object& find_element(std::string id);
@@ -236,7 +236,7 @@
//notify observers that the theme has been rebuilt completely
//atm this is used for replay_controller to add replay controls to the
standard theme
- events::generic_event theme_reset_;
+ events::generic_event theme_reset_event_;
static std::map<std::string, config> known_themes;
std::string cur_theme;
_______________________________________________
Wesnoth-commits mailing list
[email protected]
https://mail.gna.org/listinfo/wesnoth-commits