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