From 22915e16efa62f3169227f6121326cb5af5315ba Mon Sep 17 00:00:00 2001 From: Treeki Date: Fri, 9 Nov 2012 23:59:31 +0100 Subject: sprite spawner rewritten --- src/spritespawner.cpp | 145 +++++++++++++++++++------------------------------- 1 file changed, 56 insertions(+), 89 deletions(-) (limited to 'src') diff --git a/src/spritespawner.cpp b/src/spritespawner.cpp index 47dbf13..c9bc5ae 100755 --- a/src/spritespawner.cpp +++ b/src/spritespawner.cpp @@ -1,113 +1,80 @@ -#include #include -struct SpriteSpawner { - 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 type; // 0x3D4 - u32 inheritSet; // 0x3D6 - u8 lastEvState; // 0x3DA - u32 createdActor; - u8 respawn; -}; - +class dSpriteSpawner_c : public dStageActor_c { + public: + static dSpriteSpawner_c *build(); + u64 classicEventOverride; + Actors profileID; + bool respawn; + u32 childSettings; + u32 childID; -struct VEC { - float x; - float y; - float z; + int onCreate(); + int onExecute(); }; +/*****************************************************************************/ +// Glue Code +dSpriteSpawner_c *dSpriteSpawner_c::build() { + void *buffer = AllocFromGameHeap1(sizeof(dSpriteSpawner_c)); + dSpriteSpawner_c *c = new(buffer) dSpriteSpawner_c; + return c; +} -void SpriteSpawner_Update(SpriteSpawner *self); - -#define ACTIVATE 1 -#define DEACTIVATE 0 - - - +int dSpriteSpawner_c::onCreate() { + char classicEventNum = (settings >> 28) & 0xF; + classicEventOverride = (classicEventNum == 0) ? 0 : ((u64)1 << (classicEventNum - 1)); -bool SpriteSpawner_Create(SpriteSpawner *self) { + profileID = (Actors)((settings >> 16) & 0x7FF); + respawn = (settings >> 27) & 1; - char eventNum = (self->settings >> 28) & 0xF; + u16 tempSet = settings & 0xFFFF; + childSettings = + (tempSet & 3) | ((tempSet & 0xC) << 2) | + ((tempSet & 0x30) << 4) | ((tempSet & 0xC0) << 6) | + ((tempSet & 0x300) << 8) | ((tempSet & 0xC00) << 10) | + ((tempSet & 0x3000) << 12) | ((tempSet & 0xC000) << 14); - self->eventFlag = (u64)1 << (eventNum - 1); - self->createdActor = 0; - self->type = (self->settings >> 16) & 0x7FF; - self->respawn = (self->settings >> 27) & 0x1; - - 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); - - SpriteSpawner_Update(self); - return true; } -bool SpriteSpawner_Execute(SpriteSpawner *self) { - SpriteSpawner_Update(self); - return true; -} +int dSpriteSpawner_c::onExecute() { + u64 effectiveFlag = classicEventOverride | spriteFlagMask; -void SpriteSpawner_Update(SpriteSpawner *self) { - - // If the event is active... - if (dFlagMgr_c::instance->flags & self->eventFlag) { - - // And if the spawner hasn't spawned anything... - if (self->createdActor == 0) - { - Vec pos; - pos.x = self->x; - pos.y = self->y; - pos.z = self->z; - - - dStageActor_c *spawned = CreateActor(self->type, self->inheritSet, pos, 0, 0); - self->createdActor = spawned->id; - } + if (dFlagMgr_c::instance->flags & effectiveFlag) { + if (!childID) { + dStageActor_c *newAc = dStageActor_c::create(profileID, childSettings, &pos, 0, 0); + childID = newAc->id; + } + } else { + if (respawn) + return true; + + if (childID) { + dStageActor_c *ac = (dStageActor_c*)fBase_c::search(childID); + if (ac) { + pos = ac->pos; + ac->Delete(1); + } + childID = 0; + } } - else { - if (self->respawn) { return; } - if (self->createdActor != 0) { - dStageActor_c *spawned = Actor_SearchByID(self->createdActor); - if (spawned != 0) { - self->x = spawned->pos.x; - self->y = spawned->pos.y; - self->z = spawned->pos.z; + if (respawn) { + if (childID) { + dStageActor_c *ac = (dStageActor_c*)fBase_c::search(childID); - spawned->Delete(1); + if (!ac) { + dStageActor_c *newAc = dStageActor_c::create(profileID, childSettings, &pos, 0, 0); + childID = newAc->id; } - self->createdActor = 0; } } - if (self->respawn) { - if (self->createdActor != 0) { - dStageActor_c *spawned = Actor_SearchByID(self->createdActor); - if (spawned == 0) { - Vec pos; - pos.x = self->x; - pos.y = self->y; - pos.z = self->z; - - - dStageActor_c *spawned = CreateActor(self->type, self->inheritSet, pos, 0, 0); - self->createdActor = spawned->id; - } - } - } + return true; + } + -- cgit v1.2.3