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