diff options
Diffstat (limited to 'src/spriteswapper.cpp')
-rwxr-xr-x | src/spriteswapper.cpp | 144 |
1 files changed, 144 insertions, 0 deletions
diff --git a/src/spriteswapper.cpp b/src/spriteswapper.cpp new file mode 100755 index 0000000..cbff99f --- /dev/null +++ b/src/spriteswapper.cpp @@ -0,0 +1,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); + } + } +} |