summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--eventlooper.yaml15
-rw-r--r--src/eventlooper.cpp104
2 files changed, 119 insertions, 0 deletions
diff --git a/eventlooper.yaml b/eventlooper.yaml
new file mode 100644
index 0000000..b47d21d
--- /dev/null
+++ b/eventlooper.yaml
@@ -0,0 +1,15 @@
+---
+# Replaces EN_HELPOS
+
+source_files: [../src/eventlooper.cpp]
+hooks:
+ - name: eventlooper_Create
+ type: add_func_pointer
+ src_addr_pal: 0x80AEE18C
+ target_func: 'EventLooper_Create(EventLooper *)'
+
+ - name: eventlooper_Execute
+ type: add_func_pointer
+ src_addr_pal: 0x80AEE1A4
+ target_func: 'EventLooper_Execute(EventLooper *)'
+ \ No newline at end of file
diff --git a/src/eventlooper.cpp b/src/eventlooper.cpp
new file mode 100644
index 0000000..3c1fe7d
--- /dev/null
+++ b/src/eventlooper.cpp
@@ -0,0 +1,104 @@
+#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
+ 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) {
+ OSReport("Sprite Created");
+ char eventStart = (self->settings >> 24) & 0xFF;
+ char eventEnd = (self->settings >> 16) & 0xFF;
+
+ OSReport("Mark 1");
+
+ // Putting all the events into the flag
+ int i;
+ int q;
+ for(i=eventStart;i<eventEnd;i++)
+ q = q & ((u64)1 << (i - 1));
+
+ OSReport("Mark 2");
+
+ self->eventFlag = q;
+
+ self->delay = ((self->settings) & FF) * 10;
+ self->delayCount = 0;
+
+
+ OSReport("About to first update");
+
+ EventLooper_Update(self);
+
+ return true;
+}
+
+bool EventLooper_Execute(EventLooper *self) {
+ OSReport("Sprite Update");
+ EventLooper_Update(self);
+ return true;
+}
+
+
+void EventLooper_Update(EventLooper *self) {
+
+
+ // Waiting for the right moment
+ if (self->delayCount < self->delay)
+ {
+ OSReport("Delaying: %d\n", self->delayCount);
+
+ self->delayCount = self->delayCount + 1;
+ return;
+ }
+
+ OSReport("Event flag Start: %08x %08x\n", self->eventFlag >> 32, self->eventFlag & 0xFFFFFFFF);
+ OSReport("Event TableStart: %08x %08x\n", EventTable->events >> 32, EventTable->events & 0xFFFFFFFF);
+
+ // Find which event(s) is/are on
+ u64 evState = EventTable->events & self->eventFlag;
+
+ // Turn off the old events
+ EventTable->events & (~self->eventFlag);
+
+ // Shift them right if they can, if not, reset!
+ if (evState < eventFlag)
+ {
+ evState << 1;
+ EventTable->events = EventTable->events | evState;
+ }
+
+ else
+ {
+ char eventStart = (self->settings >> 24) & 0xFF;
+ evState = (u64)1 << (eventStart - 1);
+ EventTable->events = EventTable->events | evState;
+ }
+
+ OSReport("Event flag End: %08x %08x\n", self->eventFlag >> 32, self->eventFlag & 0xFFFFFFFF);
+ OSReport("Event Table End: %08x %08x\n", EventTable->events >> 32, EventTable->events & 0xFFFFFFFF);
+
+}