summaryrefslogtreecommitdiff
path: root/src/spriteswapper.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/spriteswapper.cpp')
-rwxr-xr-xsrc/spriteswapper.cpp243
1 files changed, 41 insertions, 202 deletions
diff --git a/src/spriteswapper.cpp b/src/spriteswapper.cpp
index a158efc..945da34 100755
--- a/src/spriteswapper.cpp
+++ b/src/spriteswapper.cpp
@@ -1,7 +1,7 @@
#include <common.h>
#include <game.h>
-struct SpriteSwapper {
+struct SpriteSpawnerTimed {
u32 id; // 0x00
u32 settings; // 0x04
u16 name; // 0x08
@@ -12,19 +12,11 @@ struct SpriteSwapper {
float z; // 0xB4
u8 _B8[0x318]; // 0xB8
// Any variables you add to the class go here; starting at offset 0x3D0
- u64 eventFlag;
- u64 alteventFlag;
- u8 alteventState;
- u8 alteventTrue;
- u16 firstType;
- u16 secondType;
- u8 lastEvState;
- u32 spawnedActor;
- u16 spawn;
- u16 spawned;
- u8 direction;
- Vec speed;
- S16Vec rot;
+ u64 eventFlag; // 0x3D0
+ u16 type; // 0x3D4
+ u32 inheritSet; // 0x3D6
+ u8 lastEvState; // 0x3DA
+ u32 timer;
};
struct EventTable_t {
@@ -32,15 +24,18 @@ struct EventTable_t {
};
+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 *CreateActor(u16 classID, int settings, VEC pos, char rot, char layer);
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);
+void SpriteSpawnerTimed_Update(SpriteSpawnerTimed *self);
#define ACTIVATE 1
#define DEACTIVATE 0
@@ -48,208 +43,52 @@ void SpriteSwapper_SpawnActor(SpriteSwapper *self, u16 newActorName);
-bool SpriteSwapper_Create(SpriteSwapper *self) {
+bool SpriteSpawnerTimed_Create(SpriteSpawnerTimed *self) {
OSReport("I exist, dammit!");
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->spawnedActor = 0;
- self->firstType = (self->settings >> 16) & 0xFFF;
- self->secondType = self->settings & 0xFFF;
-
- self->alteventState = 0;
- if (alteventNum > 0)
- self->alteventTrue = 1;
- else
- self->alteventTrue = 0;
-
- 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->spawnedActor = spawned->id;
- self->spawned = self->firstType;
- self->spawn = 0;
-
- OSReport("Spawned %d.", self->spawnedActor);
-
- SpriteSwapper_Update(self);
+ self->type = (self->settings >> 16) & 0xFFF;
- return true;
-}
-
-bool SpriteSwapper_Execute(SpriteSwapper *self) {
- SpriteSwapper_Update(self);
- return true;
-}
-
-
-
-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;
- //FIXME changed from fBase_c::Delete(void) to dStageActor_c::Delete(u8)
- spawned->Delete(spawned->_390);
+ short tempSet = self->settings & 0xFFFF;
+ self->inheritSet = (tempSet & 3) | ((tempSet & 0xC) << 2) | ((tempSet & 0x30) << 4) | ((tempSet & 0xC0) << 6) | ((tempSet & 0x300) << 8) | ((tempSet & 0xC00) << 10) | ((tempSet & 0x3000) << 12) | ((tempSet & 0xC000) << 14);
- self->spawnedActor = 0;
- OSReport("Now it's deleted.");
- }
+ self->timer = 0;
+ SpriteSpawnerTimed_Update(self);
- else {
- OSReport("Is dead, turn it off.... forever.");
- self->spawn = 0;
- }
+ return true;
}
-
-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);
-
+bool SpriteSpawnerTimed_Execute(SpriteSpawnerTimed *self) {
+ SpriteSpawnerTimed_Update(self);
+ return true;
}
-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)
- {
- OSReport("Spawning Event is on.");
- if (self->spawned == self->secondType)
- {
- OSReport("Second sprite already there.");
- return;
- }
+void SpriteSpawnerTimed_Update(SpriteSpawnerTimed *self) {
- OSReport("Event turned on.");
-
- self->spawn = self->secondType;
- SpriteSwapper_CopyAndDestroy(self);
- }
- else
+ if (EventTable->events & self->eventFlag)
+ {
+
+ if (self->timer == 0)
{
- OSReport("Spawning Event is off.");
- if (self->spawned == self->firstType)
- {
- OSReport("First sprite already there.");
- return;
- }
-
- OSReport("Event turned off.");
-
- self->spawn = self->firstType;
- SpriteSwapper_CopyAndDestroy(self);
- }
- }
+ VEC pos;
+ pos.x = self->x;
+ pos.y = self->y;
+ pos.z = self->z;
- // 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)
- {
- if (self->spawned == self->secondType)
- {
- OSReport("Second sprite already there.");
- return;
- }
-
- OSReport("Event turned on.");
-
- self->spawn = self->secondType;
- SpriteSwapper_CopyAndDestroy(self);
-
- EventTable->events = EventTable->events & ~self->alteventFlag;
- self->alteventState = 1;
- }
- }
-
- if (EventTable->events & self->alteventFlag)
- {
- OSReport("Second Event on, spawning is alteventState is 1.");
- if (self->alteventState == 1)
- {
- if (self->spawned == self->firstType)
- {
- OSReport("First sprite already there.");
- return;
- }
-
- OSReport("Alt Event turned on.");
-
- self->spawn = self->firstType;
- SpriteSwapper_CopyAndDestroy(self);
-
- EventTable->events = EventTable->events & ~self->eventFlag;
- self->alteventState = 0;
- }
- }
+ OSReport("Spawning Sprite: %d at %f,%f,%f\n", self->type, pos.x, pos.y, pos.z);
+
+ dStageActor_c *spawned = CreateActor(self->type, self->inheritSet, pos, 0, 0);
+ self->timer = 120;
+ }
}
+ else {
+ self->timer = 0;
+ }
+ self->timer--;
}