src/ai/api/ai_event.cpp
author truebrain
Wed, 26 Mar 2008 15:17:40 +0000
branchnoai
changeset 9823 0b7f816cf46f
parent 9820 8c116d4c6033
child 9833 89a64246458f
permissions -rw-r--r--
(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));
}