summaryrefslogtreecommitdiff
path: root/src/spritespawner.cpp
blob: d9ee51ab6f4e18d7acdb0e6fff9861420078b0a6 (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
#include <common.h>
#include <game.h>

struct SpriteSpawner {
	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
	u16 type;		// 0x3D4
	u8 lastEvState;	// 0x3D6
};

struct EventTable_t {
	u64 events;
};


struct VEC {
	float x;
	float y;
	float z;
};


extern EventTable_t *EventTable;
extern "C" void CreateActor(u16 classID, int settings, VEC pos, char rot, char layer);

void SpriteSpawner_Update(SpriteSpawner *self);

#define ACTIVATE	1
#define DEACTIVATE	0




bool SpriteSpawner_Create(SpriteSpawner *self) {
	OSReport("I exist, dammit!");

	char eventNum	= (self->settings >> 24)	& 0xFF;
	self->eventFlag = (u64)1 << (eventNum - 1);
	
	
	self->type		= (self->settings)			& 0xFFFF;
	
	self->lastEvState = 0xFF;
	
	SpriteSpawner_Update(self);
	
	return true;
}

bool SpriteSpawner_Execute(SpriteSpawner *self) {
	SpriteSpawner_Update(self);
	return true;
}


void SpriteSpawner_Update(SpriteSpawner *self) {
	
	u8 newEvState = 0;
	if (EventTable->events & self->eventFlag)
		newEvState = 1;
	
	if (newEvState == self->lastEvState)
		return;
			
	u8 offState;
	if (newEvState == ACTIVATE)
	{
		offState = (newEvState == 1) ? 1 : 0;
		
		// Put an action for when the event turns on here
		
		int spriteset = 0;
		VEC pos;
		pos.x = self->x;
		pos.y = self->y;
		pos.z = self->z;

		OSReport("Spawning Sprite: %d at %f,%f,%f\n", self->type, pos.x, pos.y, pos.z);

		CreateActor(self->type, spriteset, pos, 0, 0);
	}
	
	else
	{
		offState = (newEvState == 1) ? 0 : 1;

		// Put an action for when the event turns off here

	}

	self->lastEvState = newEvState;
}