blob: 3c1fe7ddfe6df978413b0640842da686ae262cd9 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
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);
}
|