73 lines
1.8 KiB
C
73 lines
1.8 KiB
C
/**
|
|
* Copyright (c) 2025 Dominic Masters
|
|
*
|
|
* This software is released under the MIT License.
|
|
* https://opensource.org/licenses/MIT
|
|
*/
|
|
|
|
#include "event.h"
|
|
#include "util/memory.h"
|
|
#include "assert/assert.h"
|
|
|
|
eventcallback_t EVENT_CALLBACKS[] = {
|
|
[EVENT_TYPE_NULL] = { NULL, NULL },
|
|
[EVENT_TYPE_TEXT] = { eventTextStart, eventTextUpdate },
|
|
};
|
|
|
|
event_t EVENT;
|
|
|
|
void eventInit() {
|
|
memoryZero(&EVENT, sizeof(event_t));
|
|
}
|
|
|
|
void eventUpdate() {
|
|
if(EVENT.active == NULL) {
|
|
return; // No active event to update
|
|
}
|
|
|
|
const eventitem_t *item = &EVENT.active->items[EVENT.item];
|
|
assertNotNull(
|
|
EVENT_CALLBACKS[item->type].update,
|
|
"Event type does not have an update callback"
|
|
);
|
|
|
|
EVENT_CALLBACKS[item->type].update(item);
|
|
}
|
|
|
|
void eventSetActive(const eventdata_t *event) {
|
|
assertNotNull(event, "Event data cannot be NULL");
|
|
assertTrue(
|
|
event->itemCount <= EVENT_ITEM_COUNT_MAX,
|
|
"Event count too high"
|
|
);
|
|
assertTrue(event->itemCount > 0, "Event must have at least one item");
|
|
|
|
EVENT.active = event;
|
|
EVENT.item = 0;
|
|
|
|
const eventitem_t *firstItem = &EVENT.active->items[EVENT.item];
|
|
|
|
assertNotNull(
|
|
EVENT_CALLBACKS[firstItem->type].start,
|
|
"Event type does not have a start callback"
|
|
);
|
|
EVENT_CALLBACKS[firstItem->type].start(firstItem);
|
|
}
|
|
|
|
void eventNext() {
|
|
assertNotNull(EVENT.active, "No active event to proceed with");
|
|
assertTrue(EVENT.item < EVENT.active->itemCount, "No more items in the event");
|
|
|
|
EVENT.item++;
|
|
if (EVENT.item >= EVENT.active->itemCount) {
|
|
EVENT.active = NULL;
|
|
return;
|
|
}
|
|
|
|
const eventitem_t *nextItem = &EVENT.active->items[EVENT.item];
|
|
assertNotNull(
|
|
EVENT_CALLBACKS[nextItem->type].start,
|
|
"Event type does not have a start callback"
|
|
);
|
|
EVENT_CALLBACKS[nextItem->type].start(nextItem);
|
|
} |