summaryrefslogtreecommitdiff
path: root/src/meteor.cpp
diff options
context:
space:
mode:
Diffstat (limited to '')
-rwxr-xr-xsrc/meteor.cpp118
1 files changed, 118 insertions, 0 deletions
diff --git a/src/meteor.cpp b/src/meteor.cpp
new file mode 100755
index 0000000..85b1358
--- /dev/null
+++ b/src/meteor.cpp
@@ -0,0 +1,118 @@
+#include <common.h>
+#include <game.h>
+#include <g3dhax.h>
+
+class dMeteor : public dStageActor_c {
+ int onCreate();
+ int onDelete();
+ int onExecute();
+ int onDraw();
+
+ static dMeteor *build();
+
+ mHeapAllocator_c allocator;
+ m3d::mdl_c bodyModel;
+ nw4r::g3d::ResFile resFile;
+
+ int timer;
+ int spinSpeed;
+ char spinDir;
+
+ Physics MakeItRound;
+
+ void updateModelMatrices();
+};
+
+dMeteor *dMeteor::build() {
+ void *buffer = AllocFromGameHeap1(sizeof(dMeteor));
+ return new(buffer) dMeteor;
+}
+
+
+// extern "C" dStageActor_c *GetSpecificPlayerActor(int num);
+// extern "C" void *modifyPlayerPropertiesWithRollingObject(dStageActor_c *Player, float _52C);
+extern "C" void *spinningPhysicsCallback();
+
+
+int dMeteor::onCreate() {
+
+ // Setup Model
+ allocator.link(-1, GameHeaps[0], 0, 0x20);
+
+ this->resFile.data = getResource("kazan_rock", "g3d/kazan_rock.brres");
+ nw4r::g3d::ResMdl mdl = this->resFile.GetResMdl("kazan_rock");
+ bodyModel.setup(mdl, &allocator, 0x224, 1, 0);
+ SetupTextures_Enemy(&bodyModel, 0);
+
+ allocator.unlink();
+
+
+ // Retrieve Scale and set it up
+ float sca = (float)((this->settings >> 8) & 0xFF);
+ sca = (sca/5.0) + 0.2;
+
+ this->scale = (Vec){sca,sca,sca};
+
+ // Other settings
+ this->spinDir = this->settings & 0x1;
+ this->spinSpeed = ((this->settings >> 16) & 0xFF) * 4;
+
+ // Setup Physics
+ MakeItRound.baseSetup(this, &spinningPhysicsCallback, 0, 0, 1, 1);
+
+ MakeItRound.x = 0.0;
+ MakeItRound.y = 0.0;
+
+ MakeItRound.diameter = 160.0 * sca;
+ MakeItRound.isRound = 1;
+
+ MakeItRound.update();
+
+ MakeItRound.addToList();
+
+ this->pos.z = -3458.0;
+
+ this->onExecute();
+ return true;
+}
+
+int dMeteor::onDelete() {
+ return true;
+}
+
+int dMeteor::onExecute() {
+
+ if (spinDir == 0) { rot.z -= spinSpeed; }
+ else { rot.z += spinSpeed; }
+
+ MakeItRound.update();
+ updateModelMatrices();
+
+ // 518 == opposite of direction
+
+ // for (i=0; i<4; i++) {
+ // dStageActor_c *player = GetSpecificPlayerActor(i);
+ // modifyPlayerPropertiesWithRollingObject(player, );
+ // }
+
+ return true;
+}
+
+int dMeteor::onDraw() {
+
+ bodyModel.scheduleForDrawing();
+ bodyModel._vf1C();
+ return true;
+}
+
+void dMeteor::updateModelMatrices() {
+ // This won't work with wrap because I'm lazy.
+ matrix.translation(pos.x, pos.y, pos.z);
+ matrix.applyRotationYXZ(&rot.x, &rot.y, &rot.z);
+
+ bodyModel.setDrawMatrix(matrix);
+ bodyModel.setScale(&scale);
+ bodyModel.calcWorld(false);
+}
+
+