add "scenario_end" event

unlike 'victory' and 'defeat' events this event is synced.
This commit is contained in:
gfgtdf 2015-03-01 16:36:06 +01:00
parent 7111e9bbfd
commit 341c31a6b9
3 changed files with 39 additions and 17 deletions

View file

@ -398,6 +398,10 @@ LEVEL_RESULT playsingle_controller::play_scenario(
return VICTORY;
}
pump().fire(is_victory ? "victory" : "defeat");
{ // Block for set_scontext_synced_base
set_scontext_synced_base sync;
pump().fire("scenario_end");
}
if(end_level.proceed_to_next_level) {
gamestate_.board_.heal_all_survivors();
}

View file

@ -351,14 +351,36 @@ config synced_context::ask_server_for_seed()
}
}
set_scontext_synced_base::set_scontext_synced_base()
: new_rng_(synced_context::get_rng_for_action())
, old_rng_(random_new::generator)
{
LOG_REPLAY << "set_scontext_synced_base::set_scontext_synced_base\n";
assert(synced_context::get_synced_state() == synced_context::UNSYNCED);
synced_context::set_synced_state(synced_context::SYNCED);
synced_context::reset_is_simultaneously();
synced_context::set_last_unit_id(n_unit::id_manager::instance().get_save_id());
old_rng_ = random_new::generator;
random_new::generator = new_rng_.get();
}
set_scontext_synced_base::~set_scontext_synced_base()
{
LOG_REPLAY << "set_scontext_synced_base:: destructor\n";
assert(synced_context::get_synced_state() == synced_context::SYNCED);
random_new::generator = old_rng_;
synced_context::set_synced_state(synced_context::UNSYNCED);
}
set_scontext_synced::set_scontext_synced()
: new_rng_(synced_context::get_rng_for_action()), new_checkup_(generate_checkup("checkup")), disabler_()
: set_scontext_synced_base()
, new_checkup_(generate_checkup("checkup")), disabler_()
{
init();
}
set_scontext_synced::set_scontext_synced(int number)
: new_rng_(synced_context::get_rng_for_action()), new_checkup_(generate_checkup("checkup" + boost::lexical_cast<std::string>(number))), disabler_()
: set_scontext_synced_base()
, new_checkup_(generate_checkup("checkup" + boost::lexical_cast<std::string>(number))), disabler_()
{
init();
}
@ -381,17 +403,9 @@ checkup* set_scontext_synced::generate_checkup(const std::string& tagname)
void set_scontext_synced::init()
{
LOG_REPLAY << "set_scontext_synced::set_scontext_synced\n";
assert(synced_context::get_synced_state() == synced_context::UNSYNCED);
synced_context::set_synced_state(synced_context::SYNCED);
synced_context::reset_is_simultaneously();
synced_context::set_last_unit_id(n_unit::id_manager::instance().get_save_id());
did_final_checkup_ = false;
old_checkup_ = checkup_instance;
checkup_instance = &*new_checkup_;
old_rng_ = random_new::generator;
random_new::generator = new_rng_.get();
}
void set_scontext_synced::do_final_checkup(bool dont_throw)
@ -437,15 +451,11 @@ void set_scontext_synced::do_final_checkup(bool dont_throw)
set_scontext_synced::~set_scontext_synced()
{
LOG_REPLAY << "set_scontext_synced:: destructor\n";
assert(synced_context::get_synced_state() == synced_context::SYNCED);
assert(checkup_instance == &*new_checkup_);
if(!did_final_checkup_)
{
do_final_checkup(true);
}
random_new::generator = old_rng_;
synced_context::set_synced_state(synced_context::UNSYNCED);
checkup_instance = old_checkup_;
}

View file

@ -140,10 +140,20 @@ private:
static int last_unit_id_;
};
class set_scontext_synced_base
{
public:
set_scontext_synced_base();
~set_scontext_synced_base();
protected:
boost::shared_ptr<random_new::rng> new_rng_;
random_new::rng* old_rng_;
};
/*
a RAII object to enter the synced context, cannot be called if we are already in a synced context.
*/
class set_scontext_synced
class set_scontext_synced : set_scontext_synced_base
{
public:
set_scontext_synced();
@ -158,8 +168,6 @@ private:
//only called by contructors.
void init();
static checkup* generate_checkup(const std::string& tagname);
random_new::rng* old_rng_;
boost::shared_ptr<random_new::rng> new_rng_;
checkup* old_checkup_;
boost::scoped_ptr<checkup> new_checkup_;
events::command_disabler disabler_;