summaryrefslogtreecommitdiff
path: root/src/eventlooper.cpp
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);

}