diff options
Diffstat (limited to 'src/eventlooper.cpp')
-rw-r--r-- | src/eventlooper.cpp | 116 |
1 files changed, 116 insertions, 0 deletions
diff --git a/src/eventlooper.cpp b/src/eventlooper.cpp new file mode 100644 index 0000000..755742d --- /dev/null +++ b/src/eventlooper.cpp @@ -0,0 +1,116 @@ +#include <common.h>
+#include <game.h>
+
+struct EventLooper {
+ u32 id; // 0x00
+ u32 settings; // 0x04
+ u16 name; // 0x08
+ u8 _0A[6]; // 0x0A
+ u8 _10[0x9C]; // 0x10
+ float x; // 0xAC
+ float y; // 0xB0
+ float z; // 0xB4
+ u8 _B8[0x318]; // 0xB8
+ // Any variables you add to the class go here; starting at offset 0x3D0
+ u64 eventFlag; // 0x3D0
+ u64 eventActive; // 0x3D0
+ u8 delay; // 0x3D4
+ u8 delayCount; // 0x3D7
+};
+
+struct EventTable_t {
+ u64 events;
+ // ...
+};
+
+extern EventTable_t *EventTable;
+ +void EventLooper_Update(EventLooper *self);
+ + +
+bool EventLooper_Create(EventLooper *self) {
+ char eventStart = (self->settings >> 24) & 0xFF;
+ char eventEnd = (self->settings >> 16) & 0xFF;
+ + // Putting all the events into the flag + int i; + u64 q = (u64)0; + for(i=eventStart;i<(eventEnd+1);i++) + { + q = q | ((u64)1 << (i - 1)); + } + + self->eventFlag = q;
+ + self->delay = (((self->settings) & 0xFF) + 1) * 10;
+ self->delayCount = 0;
+ + char tmpEvent= (self->settings >> 8) & 0xFF;
+ if (tmpEvent == 0) + { + self->eventActive = (u64)0xFFFFFFFFFFFFFFFF; + } + else + { + self->eventActive = (u64)1 << (tmpEvent - 1);
+ + } + + + if (EventTable->events & self->eventActive) + {
+ u64 evState = (u64)1 << (eventStart - 1); + EventTable->events = EventTable->events | evState; + } + + EventLooper_Update(self);
+
+ return true;
+}
+
+bool EventLooper_Execute(EventLooper *self) {
+ EventLooper_Update(self);
+ return true;
+}
+
+ +void EventLooper_Update(EventLooper *self) {
+ + if ((EventTable->events & self->eventActive) == 0) + return; + + // Waiting for the right moment + if (self->delayCount < self->delay) + { +// OSReport("Delaying: %d / %d\n", self->delayCount, self->delay);
+ + self->delayCount = self->delayCount + 1; + return; + } + + // Reset the delay + self->delayCount = 0; + + // Find which event(s) is/are on + u64 evState = EventTable->events & self->eventFlag;
+ + // Turn off the old events + EventTable->events = EventTable->events & (~self->eventFlag); + + // Shift them right if they can, if not, reset! + evState = evState << 1; + if (evState < self->eventFlag) + { + EventTable->events = EventTable->events | evState; + } + + else + { + char eventStart = (self->settings >> 24) & 0xFF;
+ evState = (u64)1 << (eventStart - 1); + EventTable->events = EventTable->events | evState; + } + + +} |