107 lines
2.2 KiB
C
107 lines
2.2 KiB
C
#include <stdlib.h>
|
|
|
|
#include "data.h";
|
|
#include "event.h";
|
|
|
|
event *events;
|
|
|
|
void initEvents(void)
|
|
{
|
|
events = NULL;
|
|
}
|
|
|
|
event *createEvent(char (*callback) (word counter))
|
|
{
|
|
event *myEvent;
|
|
|
|
myEvent = (event *) malloc(sizeof(event));
|
|
|
|
myEvent->VBlankCount = 0;
|
|
myEvent->callback = callback;
|
|
myEvent->nextEvent = NULL;
|
|
myEvent->previousEvent = NULL;
|
|
|
|
|
|
return myEvent;
|
|
}
|
|
|
|
event *addEvent(char (*callback) (word counter), int noDuplicateCallback)
|
|
{
|
|
|
|
event *lastEvent;
|
|
event *myEvent;
|
|
|
|
if (events == NULL) {
|
|
events = createEvent(callback);
|
|
return events;
|
|
} else {
|
|
lastEvent = events;
|
|
// TODO optimise this with noduplicate
|
|
while (lastEvent->nextEvent != NULL) {
|
|
if (noDuplicateCallback == 1 && lastEvent->callback == *callback) {
|
|
return NULL;
|
|
}
|
|
lastEvent = lastEvent->nextEvent;
|
|
}
|
|
if (noDuplicateCallback == 1 && lastEvent->callback == *callback) {
|
|
return NULL;
|
|
}
|
|
myEvent = createEvent(callback);
|
|
myEvent->previousEvent = lastEvent;
|
|
lastEvent->nextEvent = myEvent;
|
|
return myEvent;
|
|
}
|
|
|
|
|
|
}
|
|
|
|
void removeEvent(event * eventElement)
|
|
{
|
|
|
|
byte alone = 0;
|
|
event *next, *previous;
|
|
|
|
next = eventElement->nextEvent;
|
|
previous = eventElement->previousEvent;
|
|
|
|
if (eventElement->nextEvent != NULL && eventElement->previousEvent != NULL) {
|
|
alone++;
|
|
next->previousEvent = previous;
|
|
previous->nextEvent = next;
|
|
|
|
} else if (eventElement->nextEvent != NULL) {
|
|
alone++;
|
|
next->previousEvent = NULL;
|
|
events = next;
|
|
|
|
} else if (eventElement->previousEvent != NULL) {
|
|
alone++;
|
|
previous->nextEvent = NULL;
|
|
}
|
|
|
|
free(eventElement);
|
|
|
|
if (alone == 0) {
|
|
events = NULL;
|
|
}
|
|
}
|
|
|
|
void processEvents(void)
|
|
{
|
|
|
|
event *currentEvent;
|
|
char returnValue;
|
|
|
|
currentEvent = events;
|
|
while (currentEvent != NULL) {
|
|
returnValue = currentEvent->callback(currentEvent->VBlankCount);
|
|
if (returnValue == EVENT_CONTINUE) {
|
|
currentEvent->VBlankCount++;
|
|
} else {
|
|
removeEvent(currentEvent);
|
|
}
|
|
currentEvent = currentEvent->nextEvent;
|
|
}
|
|
|
|
}
|