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);
}
}
}
|