Ensured there is always an event context when executing WML code.

This commit is contained in:
Guillaume Melquiond 2009-09-13 09:48:10 +00:00
parent 1f27f6edc1
commit 95a18a70b8

View file

@ -75,6 +75,7 @@ struct event_context
{
bool mutated;
bool skip_messages;
event_context(bool s): mutated(true), skip_messages(s) {}
};
static event_context *current_context;
@ -89,10 +90,8 @@ struct scoped_context
scoped_context()
: old_context(current_context)
, new_context()
, new_context(old_context ? old_context->skip_messages : false)
{
new_context.skip_messages = old_context ? old_context->skip_messages : false;
new_context.mutated = true;
current_context = &new_context;
}
@ -103,6 +102,28 @@ struct scoped_context
}
};
/**
* Failsafe context state, in case commands are executed outside an event.
*/
struct scoped_dummy_context
{
bool dummy_context;
scoped_dummy_context()
: dummy_context(!current_context)
{
if (!dummy_context) return;
current_context = new event_context(false);
}
~scoped_dummy_context()
{
if (!dummy_context) return;
delete current_context;
current_context = NULL;
}
};
static bool screen_needs_rebuild;
namespace {
@ -3662,6 +3683,7 @@ namespace game_events {
<< std::hex << std::setiosflags(std::ios::uppercase)
<< reinterpret_cast<uintptr_t>(&cfg.get_config()) << std::dec << "\n";
scoped_dummy_context dummy;
if (!call_wml_action_handler(cmd, event_info, cfg))
{
ERR_NG << "Couldn't find function for wml tag: "<< cmd <<"\n";