(svn r12431) [NoAI] -Add: added AIEventSubsidiaryOffer, which keeps you informed about new Subsidiaries
/* $Id$ */
/** @file ai_event.cpp Handling of in-game events. */
#include "ai_event.hpp"
/* TODO -- This include has to go */
#include "ai_event_types.hpp"
#include <queue>
#include <set>
struct AIEventData {
std::queue<AIEvent *> stack;
std::set<AIEvent::AIEventType> events;
bool events_disabled;
AIEventData() :
events_disabled(false)
{}
};
/* static */ void AIEventController::CreateEventPointer()
{
assert(AIObject::GetEventPointer() == NULL);
AIObject::GetEventPointer() = new AIEventData();
}
/* static */ void AIEventController::FreeEventPointer()
{
AIEventData *data = (AIEventData *)AIObject::GetEventPointer();
/* Free up the event-list */
data->events.clear();
/* Free all waiting events (if any) */
while (!data->stack.empty()) {
AIEvent *e = data->stack.front();
data->stack.pop();
delete e;
}
/* Now kill our data pointer */
delete data;
}
/* static */ bool AIEventController::IsEventWaiting()
{
if (AIObject::GetEventPointer() == NULL) AIEventController::CreateEventPointer();
AIEventData *data = (AIEventData *)AIObject::GetEventPointer();
return !data->stack.empty();
}
/* static */ AIEvent *AIEventController::GetNextEvent()
{
if (AIObject::GetEventPointer() == NULL) AIEventController::CreateEventPointer();
AIEventData *data = (AIEventData *)AIObject::GetEventPointer();
if (data->stack.empty()) return NULL;
AIEvent *e = data->stack.front();
data->stack.pop();
return e;
}
/* static */ void AIEventController::DisableEvent(AIEvent::AIEventType event)
{
if (AIObject::GetEventPointer() == NULL) AIEventController::CreateEventPointer();
AIEventData *data = (AIEventData *)AIObject::GetEventPointer();
if (data->events_disabled) data->events.erase(event);
else data->events.insert(event);
}
/* static */ void AIEventController::EnableEvent(AIEvent::AIEventType event)
{
if (AIObject::GetEventPointer() == NULL) AIEventController::CreateEventPointer();
AIEventData *data = (AIEventData *)AIObject::GetEventPointer();
if (!data->events_disabled) data->events.erase(event);
else data->events.insert(event);
}
/* static */ void AIEventController::DisableAllEvents()
{
if (AIObject::GetEventPointer() == NULL) AIEventController::CreateEventPointer();
AIEventData *data = (AIEventData *)AIObject::GetEventPointer();
data->events_disabled = true;
data->events.clear();
}
/* static */ void AIEventController::EnableAllEvents()
{
if (AIObject::GetEventPointer() == NULL) AIEventController::CreateEventPointer();
AIEventData *data = (AIEventData *)AIObject::GetEventPointer();
data->events_disabled = false;
data->events.clear();
}
/* static */ void AIEventController::InsertEvent(AIEvent *event)
{
if (AIObject::GetEventPointer() == NULL) AIEventController::CreateEventPointer();
AIEventData *data = (AIEventData *)AIObject::GetEventPointer();
/* If events_disabled is true, the list shows only the enabled events.
* If events_disabled is false, the list shows only the disabled events. */
if (data->events_disabled && data->events.count(event->GetEventType()) == 0) return;
if (!data->events_disabled && data->events.count(event->GetEventType()) != 0) return;
data->stack.push(event);
}
/* static */ void AIEventController::Test()
{
AIEventController::InsertEvent(new AIEventTest(42));
}