summaryrefslogtreecommitdiff
path: root/src/spriteswapper.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/spriteswapper.cpp')
-rwxr-xr-xsrc/spriteswapper.cpp307
1 files changed, 132 insertions, 175 deletions
diff --git a/src/spriteswapper.cpp b/src/spriteswapper.cpp
index 0eec8b1..4929e7c 100755
--- a/src/spriteswapper.cpp
+++ b/src/spriteswapper.cpp
@@ -12,16 +12,19 @@ struct SpriteSwapper {
float z; // 0xB4
u8 _B8[0x318]; // 0xB8
// Any variables you add to the class go here; starting at offset 0x3D0
- u64 eventFlag; // 0x3D0
- u64 alteventFlag; // 0x3D0
+ u64 eventFlag;
+ u64 alteventFlag;
u8 alteventState;
u8 alteventTrue;
- u16 firstType; // 0x3D4
- u16 secondType; // 0x3D4
- u8 lastEvState; // 0x3DA
- u32 firstActor;
- u32 secondActor;
- u8 direction; // 0x3D0
+ u16 firstType;
+ u16 secondType;
+ u8 lastEvState;
+ u32 spawnedActor;
+ u16 spawn;
+ u16 spawned;
+ u8 direction;
+ Vec speed;
+ S16Vec rot;
};
struct EventTable_t {
@@ -36,6 +39,8 @@ extern "C" dStageActor_c *CreateActor(u16 classID, int settings, Vec pos, char r
extern "C" dStageActor_c *Actor_SearchByID(u32 actorID);
void SpriteSwapper_Update(SpriteSwapper *self);
+void SpriteSwapper_CopyAndDestroy(SpriteSwapper *self, dStageActor_c *actor);
+void SpriteSwapper_SpawnActor(SpriteSwapper *self, u16 newActorName);
#define ACTIVATE 1
#define DEACTIVATE 0
@@ -49,11 +54,11 @@ bool SpriteSwapper_Create(SpriteSwapper *self) {
char eventNum = (self->settings >> 28) & 0xF;
char alteventNum = (self->settings >> 12) & 0xF;
OSReport("Event to activate: %d", eventNum);
+ OSReport("AltEvent to activate: %d", alteventNum);
self->eventFlag = (u64)1 << (eventNum - 1);
self->alteventFlag = (u64)1 << (alteventNum - 1);
- self->firstActor = 0;
- self->secondActor = 0;
+ self->spawnedActor = 0;
self->firstType = (self->settings >> 16) & 0xFFF;
self->secondType = self->settings & 0xFFF;
@@ -71,9 +76,11 @@ bool SpriteSwapper_Create(SpriteSwapper *self) {
OSReport("Spawning first sprite.");
dStageActor_c *spawned = CreateActor(self->firstType, 0, pos, 0, 0);
- self->firstActor = spawned->id;
+ self->spawnedActor = spawned->id;
+ self->spawned = self->firstType;
+ self->spawn = 0;
- OSReport("Spawned %d.", self->firstActor);
+ OSReport("Spawned %d.", self->spawnedActor);
SpriteSwapper_Update(self);
@@ -86,155 +93,136 @@ bool SpriteSwapper_Execute(SpriteSwapper *self) {
}
+
+void SpriteSwapper_CopyAndDestroy(SpriteSwapper *self) {
+
+ dStageActor_c *spawned = Actor_SearchByID(self->spawnedActor);
+ if (spawned != 0) {
+ OSReport("It's still alive.");
+ self->x = spawned->pos.x;
+ self->y = spawned->pos.y;
+ self->z = spawned->pos.z;
+ self->direction = spawned->direction;
+ self->speed = spawned->speed;
+ self->rot = spawned->rot;
+ spawned->Delete();
+
+ self->spawnedActor = 0;
+ OSReport("Now it's deleted.");
+ }
+
+ else {
+ OSReport("Is dead, turn it off.... forever.");
+ self->spawn = 0;
+ }
+}
+
+
+void SpriteSwapper_SpawnActor(SpriteSwapper *self, u16 newActorName) {
+
+ Vec pos;
+ pos.x = self->x;
+ pos.y = self->y;
+ pos.z = self->z;
+
+ OSReport("Making sprite.");
+ dStageActor_c *spawner = CreateActor(newActorName, 0, pos, 0, 0);
+ self->spawnedActor = spawner->id;
+// spawner->direction = self->direction;
+// spawner->speed = self->speed;
+
+// OSReport("Direction is %d.", spawner->direction);
+// OSReport("Initial Rotation is %x %x.", spawner->rot.y, spawner->_106.y);
+// if (spawner->direction == 0) {
+// spawner->rot.y = 0xF556 + spawner->rot.y; }
+// else {
+// spawner->rot.y = 0xC000; }
+// OSReport("Current Rotation is %x %x.", spawner->rot.y, spawner->_106.y);
+
+
+
+//Direction is 1.
+//Initial Rotation is ffffd556
+//
+// Direction is 0.
+//Initial Rotation is ffffc000
+//
+//Direction is 0
+//Initial Rotation is ffffd556
+
+
+
+// spawner->rot = self->rot;
+ OSReport("Spawned %d.", self->spawnedActor);
+
+}
+
+
void SpriteSwapper_Update(SpriteSwapper *self) {
+ if (self->spawn != 0)
+ {
+ OSReport("Spawning %d.", self->spawn);
+ SpriteSwapper_SpawnActor(self, self->spawn);
+ self->spawned = self->spawn;
+ self->spawn = 0;
+ return;
+ }
+
+ // Sprites alternate when event a is turned on or off.
if (self->alteventTrue == 0)
{
+ OSReport("Single Event Type.");
if (EventTable->events & self->eventFlag)
{
- // Put an action for when the event turns on here
- OSReport("Event turned on.");
-
- if (self->firstActor != 0)
+ OSReport("Spawning Event is on.");
+ if (self->spawned == self->secondType)
{
- 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;
- self->direction = spawned->direction;
- Vec speed = spawned->speed;
- S16Vec rot = spawned->rot;
- 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("Second sprite already there.");
+ return;
+ }
- int x = 0;
- while (x < 100000) {
- x = x+1;
- }
+ OSReport("Event turned on.");
- OSReport("Making second sprite.");
- dStageActor_c *spawner = CreateActor(self->secondType, 0, pos, 0, 0);
- self->secondActor = spawner->id;
- spawner->direction = self->direction;
- spawner->speed = speed;
- spawner->rot = rot;
- OSReport("Spawned %d.", self->secondActor);
- }
-
- else {
- OSReport("Looks dead to me.");
- }
- }
- // EventTable->events = EventTable->events & ~self->eventFlag;
+ self->spawn = self->secondType;
+ SpriteSwapper_CopyAndDestroy(self);
}
else
{
- OSReport("Event turned off.");
- if (self->secondActor != 0)
+ OSReport("Spawning Event is off.");
+ if (self->spawned == self->firstType)
{
- 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;
- self->direction = spawned->direction;
- Vec speed = spawned->speed;
- S16Vec rot = spawned->rot;
- spawned->Delete();
+ OSReport("First sprite already there.");
+ return;
+ }
- self->secondActor = 0;
- OSReport("Now it's deleted.");
-
- Vec pos;
- pos.x = self->x;
- pos.y = self->y;
- pos.z = self->z;
-
- int x = 0;
- while (x < 100000) {
- x = x+1;
- }
-
- OSReport("Making first sprite again.");
- dStageActor_c *spawner = CreateActor(self->firstType, 0, pos, 0, 0);
- self->firstActor = spawner->id;
- spawner->direction = self->direction;
- spawner->speed = speed;
- spawner->rot = rot;
- OSReport("Spawned %d.", self->firstActor);
- }
+ OSReport("Event turned off.");
- else {
- OSReport("Looks dead to me.");
- }
- }
+ self->spawn = self->firstType;
+ SpriteSwapper_CopyAndDestroy(self);
}
-
}
+
+ // Sprites alternate when event a or b is turned on.
else
{
+ OSReport("Dual Event Type. EventState is %d.", self->alteventState);
if (EventTable->events & self->eventFlag)
{
+ OSReport("First Event on, spawning is alteventState is 0.");
if (self->alteventState == 0)
{
- // Put an action for when the event turns on here
- OSReport("Event turned on.");
-
- if (self->firstActor != 0)
+ if (self->spawned == self->secondType)
{
- 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;
- self->direction = spawned->direction;
- Vec speed = spawned->speed;
- S16Vec rot = spawned->rot;
- spawned->Delete();
+ OSReport("Second sprite already there.");
+ return;
+ }
- self->firstActor = 0;
- OSReport("Now it's deleted.");
-
- Vec pos;
- pos.x = self->x;
- pos.y = self->y;
- pos.z = self->z;
-
- int x = 0;
- while (x < 100000) {
- x = x+1;
- }
+ OSReport("Event turned on.");
- OSReport("Making second sprite.");
- dStageActor_c *spawner = CreateActor(self->secondType, 0, pos, 0, 0);
- self->secondActor = spawner->id;
- spawner->direction = self->direction;
- spawner->speed = speed;
- spawner->rot = rot;
- OSReport("Spawned %d.", self->secondActor);
- }
-
- else {
- OSReport("Looks dead to me.");
- }
-
- }
+ self->spawn = self->secondType;
+ SpriteSwapper_CopyAndDestroy(self);
+
EventTable->events = EventTable->events & ~self->alteventFlag;
self->alteventState = 1;
}
@@ -242,51 +230,20 @@ void SpriteSwapper_Update(SpriteSwapper *self) {
if (EventTable->events & self->alteventFlag)
{
+ OSReport("Second Event on, spawning is alteventState is 1.");
if (self->alteventState == 1)
{
- OSReport("Event turned off.");
- if (self->secondActor != 0)
+ if (self->spawned == self->firstType)
{
- 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;
- self->direction = spawned->direction;
- Vec speed = spawned->speed;
- S16Vec rot = spawned->rot;
- spawned->Delete();
+ OSReport("First sprite already there.");
+ return;
+ }
- self->secondActor = 0;
- OSReport("Now it's deleted.");
-
- Vec pos;
- pos.x = self->x;
- pos.y = self->y;
- pos.z = self->z;
+ OSReport("Alt Event turned on.");
+
+ self->spawn = self->firstType;
+ SpriteSwapper_CopyAndDestroy(self);
- int x = 0;
- while (x < 100000) {
- x = x+1;
- }
-
- OSReport("Making first sprite again.");
- dStageActor_c *spawner = CreateActor(self->firstType, 0, pos, 0, 0);
- self->firstActor = spawner->id;
- spawner->direction = self->direction;
- spawner->speed = speed;
- spawner->rot = rot;
- OSReport("Spawned %d.", self->firstActor);
- }
-
-
- else {
- OSReport("Looks dead to me.");
- }
-
- }
EventTable->events = EventTable->events & ~self->eventFlag;
self->alteventState = 0;
}