summaryrefslogtreecommitdiff
path: root/src/spritespawner.cpp
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/spritespawner.cpp101
1 files changed, 101 insertions, 0 deletions
diff --git a/src/spritespawner.cpp b/src/spritespawner.cpp
new file mode 100644
index 0000000..d9ee51a
--- /dev/null
+++ b/src/spritespawner.cpp
@@ -0,0 +1,101 @@
+#include <common.h>
+#include <game.h>
+
+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
+ u8 lastEvState; // 0x3D6
+};
+
+struct EventTable_t {
+ u64 events;
+};
+
+
+struct VEC {
+ float x;
+ float y;
+ float z;
+};
+
+
+extern EventTable_t *EventTable;
+extern "C" void CreateActor(u16 classID, int settings, VEC pos, char rot, char layer);
+
+void SpriteSpawner_Update(SpriteSpawner *self);
+
+#define ACTIVATE 1
+#define DEACTIVATE 0
+
+
+
+
+bool SpriteSpawner_Create(SpriteSpawner *self) {
+ OSReport("I exist, dammit!");
+
+ char eventNum = (self->settings >> 24) & 0xFF;
+ self->eventFlag = (u64)1 << (eventNum - 1);
+
+
+ self->type = (self->settings) & 0xFFFF;
+
+ self->lastEvState = 0xFF;
+
+ SpriteSpawner_Update(self);
+
+ return true;
+}
+
+bool SpriteSpawner_Execute(SpriteSpawner *self) {
+ SpriteSpawner_Update(self);
+ return true;
+}
+
+
+void SpriteSpawner_Update(SpriteSpawner *self) {
+
+ u8 newEvState = 0;
+ if (EventTable->events & self->eventFlag)
+ newEvState = 1;
+
+ if (newEvState == self->lastEvState)
+ return;
+
+ u8 offState;
+ if (newEvState == ACTIVATE)
+ {
+ offState = (newEvState == 1) ? 1 : 0;
+
+ // Put an action for when the event turns on here
+
+ int spriteset = 0;
+ VEC pos;
+ pos.x = self->x;
+ pos.y = self->y;
+ pos.z = self->z;
+
+ OSReport("Spawning Sprite: %d at %f,%f,%f\n", self->type, pos.x, pos.y, pos.z);
+
+ CreateActor(self->type, spriteset, pos, 0, 0);
+ }
+
+ else
+ {
+ offState = (newEvState == 1) ? 0 : 1;
+
+ // Put an action for when the event turns off here
+
+ }
+
+ self->lastEvState = newEvState;
+}