summaryrefslogtreecommitdiff
path: root/src/spriteswapper.cpp
blob: cbff99fc255fff7295f106de3edc8a8a49d3742c (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
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
#include <common.h>
#include <game.h>

struct SpriteSwapper {
	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 firstType;		// 0x3D4
	u16 secondType;		// 0x3D4
	u8 lastEvState;	// 0x3DA
	u32 firstActor;
	u32 secondActor;
};

struct EventTable_t {
	u64 events;
};


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


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

void SpriteSwapper_Update(SpriteSwapper *self);

#define ACTIVATE	1
#define DEACTIVATE	0




bool SpriteSwapper_Create(SpriteSwapper *self) {
	OSReport("I exist, dammit!");

	char eventNum	= (self->settings >> 28)	& 0xF;
	OSReport("Event to activate: %d", eventNum);

	self->eventFlag = (u64)1 << (eventNum - 1);
	self->firstActor = 0;
	self->secondActor = 0;
	self->firstType = (self->settings >> 16) & 0xFFF;
	self->secondType = self->settings & 0xFFF;
			
	VEC pos;
	pos.x = self->x;
	pos.y = self->y;
	pos.z = self->z;

	OSReport("Spawning first sprite.");

	dStageActor_c *spawned = CreateActor(self->firstType, 0, pos, 0, 0);
	self->firstActor = spawned->id;

	OSReport("Spawned %d.", self->firstActor);

	SpriteSwapper_Update(self);
	
	return true;
}

bool SpriteSwapper_Execute(SpriteSwapper *self) {
	SpriteSwapper_Update(self);
	return true;
}


void SpriteSwapper_Update(SpriteSwapper *self) {
				
	if (EventTable->events & self->eventFlag)
	{		
		// Put an action for when the event turns on here
		OSReport("Event turned on.");
		
		if (self->firstActor != 0)
		{
			OSReport("Found the first sprite.");

			dStageActor_c *spawned = Actor_SearchByID(self->firstActor);
			if (spawned != 0) {
				OSReport("It's still alive.");
				self->x = spawned->pos.x;
				self->y = spawned->pos.y;
				self->z = spawned->pos.z;
				spawned->Delete();
			}
			self->firstActor = 0;
			OSReport("Now it's deleted.");

			VEC pos;
			pos.x = self->x;
			pos.y = self->y;
			pos.z = self->z;
	
			OSReport("Making second sprite.");
			dStageActor_c *spawner = CreateActor(self->secondType, 0, pos, 0, 0);
			self->secondActor = spawner->id;
			OSReport("Spawned %d.", self->secondActor);
		}		
//		EventTable->events = EventTable->events & ~self->eventFlag;
	}
	else
	{
		OSReport("Event turned off.");
		if (self->secondActor != 0)
		{
			OSReport("Found the second sprite.");
			dStageActor_c *spawned = Actor_SearchByID(self->secondActor);
			if (spawned != 0) {
				OSReport("It's still alive.");
				self->x = spawned->pos.x;
				self->y = spawned->pos.y;
				self->z = spawned->pos.z;
				spawned->Delete();
			}
			self->secondActor = 0;
			OSReport("Now it's deleted.");

			VEC pos;
			pos.x = self->x;
			pos.y = self->y;
			pos.z = self->z;
	
			OSReport("Making first sprite again.");
			dStageActor_c *spawner = CreateActor(self->firstType, 0, pos, 0, 0);
			self->firstActor = spawner->id;
			OSReport("Spawned %d.", self->firstActor);
		}		
	}
}