diff options
Diffstat (limited to 'src/spriteswapper.cpp')
-rwxr-xr-x | src/spriteswapper.cpp | 243 |
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--; } |