summaryrefslogtreecommitdiff
path: root/src/electricLine.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/electricLine.cpp')
-rw-r--r--src/electricLine.cpp144
1 files changed, 144 insertions, 0 deletions
diff --git a/src/electricLine.cpp b/src/electricLine.cpp
new file mode 100644
index 0000000..28822f1
--- /dev/null
+++ b/src/electricLine.cpp
@@ -0,0 +1,144 @@
+#include <common.h>
+#include <game.h>
+#include <g3dhax.h>
+#include <sfx.h>
+#include <stage.h>
+#include "effects.h"
+#include "player.h"
+
+class daElectricLine : public dEn_c {
+ int onCreate();
+ int onDelete();
+ int onExecute();
+ int onDraw();
+
+ mHeapAllocator_c allocator;
+ nw4r::g3d::ResFile resFile;
+
+ dEn_c *Needles;
+ u32 delay;
+ u32 timer;
+ char loops;
+
+ static daElectricLine *build();
+
+ USING_STATES(daElectricLine);
+ DECLARE_STATE(Activate);
+ DECLARE_STATE(Deactivate);
+ DECLARE_STATE(Die);
+};
+
+daElectricLine *daElectricLine::build() {
+ void *buffer = AllocFromGameHeap1(sizeof(daElectricLine));
+ return new(buffer) daElectricLine;
+}
+
+///////////////////////
+// Externs and States
+///////////////////////
+ extern "C" void *PlaySound(dStageActor_c *, int soundID);
+ extern "C" void *PlaySoundAsync(dStageActor_c *, int soundID);
+
+ extern "C" dStageActor_c *CreateActor(u16 classID, int settings, Vec pos, char rot, char layer);
+
+
+ CREATE_STATE(daElectricLine, Activate);
+ CREATE_STATE(daElectricLine, Deactivate);
+ CREATE_STATE(daElectricLine, Die);
+
+
+
+int daElectricLine::onCreate() {
+
+ Vec temppos = this->pos;
+ temppos.x += 24.0;
+
+ // Settings for rotation: 0 = facing right, 1 = facing left, 2 = facing up, 3 = facing down
+ char settings = 0;
+ if (this->settings & 0x1) {
+ settings = 1;
+ temppos.x -= 32.0;
+ }
+
+
+ Needles = (daNeedles*)create(NEEDLE_FOR_KOOPA_JR_B, settings, &temppos, &this->rot, 0);
+ Needles->doStateChange(&daNeedles::StateID_DemoWait);
+
+ // Delay in 1/6ths of a second
+ this->delay = (this->settings >> 16) * 10;
+ this->loops = (this->settings >> 4);
+
+ // State Changers
+ doStateChange(&StateID_Activate);
+
+ this->onExecute();
+ return true;
+}
+
+int daElectricLine::onDelete() {
+ return true;
+}
+
+int daElectricLine::onExecute() {
+ acState.execute();
+ return true;
+}
+
+int daElectricLine::onDraw() {
+ return true;
+}
+
+
+// States:
+//
+// DemoWait - all nullsubs, does nothing
+// DemoAwake - moves the spikes in their respective directions
+// Idle - Fires off an infinity of effects for some reason.
+// Die - removes physics, then nullsubs
+
+
+///////////////
+// Activate State
+///////////////
+ void daElectricLine::beginState_Activate() {
+ this->timer = this->delay;
+ Needles->doStateChange(&daNeedles::StateID_Idle);
+ }
+ void daElectricLine::executeState_Activate() {
+ if (this->loops) {
+ this->timer--;
+ if (this->timer == 0) {
+ this->loops += 1;
+ doStateChange(&StateID_Deactivate);
+ }
+ }
+ }
+ void daElectricLine::endState_Activate() { }
+
+///////////////
+// Deactivate State
+///////////////
+ void daElectricLine::beginState_Deactivate() {
+ this->timer = this->delay;
+ Needles->removeMyActivePhysics();
+ Needles->doStateChange(&daNeedles::StateID_DemoWait);
+ }
+ void daElectricLine::executeState_Deactivate() {
+
+ this->timer--;
+ if (this->timer == 0) {
+ doStateChange(&StateID_Activate);
+ }
+ }
+ void daElectricLine::endState_Deactivate() {
+ Needles->addMyActivePhysics();
+ }
+
+
+///////////////
+// Die State
+///////////////
+ void daElectricLine::beginState_Die() { Needles->doStateChange(&daNeedles::StateID_Die); }
+ void daElectricLine::executeState_Die() { }
+ void daElectricLine::endState_Die() { }
+