summaryrefslogtreecommitdiff
path: root/src/bossRamboo.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/bossRamboo.cpp')
-rw-r--r--src/bossRamboo.cpp375
1 files changed, 375 insertions, 0 deletions
diff --git a/src/bossRamboo.cpp b/src/bossRamboo.cpp
new file mode 100644
index 0000000..f61ec33
--- /dev/null
+++ b/src/bossRamboo.cpp
@@ -0,0 +1,375 @@
+#include <common.h>
+#include <game.h>
+#include <g3dhax.h>
+#include <sfx.h>
+#include "effects.h"
+#include "player.h"
+
+class daRamboo_c : public dEn_c {
+ int onCreate();
+ int onDelete();
+ int onExecute();
+ int onDraw();
+
+ mHeapAllocator_c allocator;
+ m3d::mdl_c bodyModel;
+ m3d::mdl_c fogModel;
+
+ int timer;
+ int ytimer;
+ char BigBossRamboo;
+ float Baseline;
+ float dying;
+
+ u64 eventFlag;
+
+
+ void dieBigFall_Execute();
+ static daRamboo_c *build();
+
+ void updateModelMatrices();
+
+ void playerCollision(ActivePhysics *apThis, ActivePhysics *apOther);
+ void collisionCat1_Fireball_E_Explosion(ActivePhysics *apThis, ActivePhysics *apOther);
+ bool collisionCat2_IceBall_15_YoshiIce(ActivePhysics *apThis, ActivePhysics *apOther);
+ void collisionCat9_RollingObject(ActivePhysics *apThis, ActivePhysics *apOther);
+ void collisionCat13_Hammer(ActivePhysics *apThis, ActivePhysics *apOther);
+
+ USING_STATES(daRamboo_c);
+ DECLARE_STATE(Grow);
+ DECLARE_STATE(Advance);
+ DECLARE_STATE(Wait);
+ DECLARE_STATE(Flee);
+};
+
+daRamboo_c *daRamboo_c::build() {
+ void *buffer = AllocFromGameHeap1(sizeof(daRamboo_c));
+ return new(buffer) daRamboo_c;
+}
+
+
+extern "C" void *HandleXSpeed(daRamboo_c *);
+extern "C" void *HandleYSpeed(daRamboo_c *);
+extern "C" void *UpdateObjectPosBasedOnSpeedValues_real(daRamboo_c *);
+extern "C" u32 GenerateRandomNumber(int max);
+extern "C" dStageActor_c *CreateActor(u16 classID, int settings, Vec pos, char rot, char layer);
+extern "C" u8 dSprite_c__getXDirectionOfFurthestPlayerRelativeToVEC3(daRamboo_c *, Vec pos);
+extern "C" dStageActor_c *GetSpecificPlayerActor(int number);
+extern "C" void *PlaySound(daRamboo_c *, int soundID);
+
+
+CREATE_STATE(daRamboo_c, Grow);
+CREATE_STATE(daRamboo_c, Advance);
+CREATE_STATE(daRamboo_c, Wait);
+CREATE_STATE(daRamboo_c, Flee);
+
+
+struct EventTable_t {
+ u64 events;
+ // ...
+};
+
+extern EventTable_t *EventTable;
+
+
+void daRamboo_c::playerCollision(ActivePhysics *apThis, ActivePhysics *apOther) {
+ this->_vf220(apOther->owner);
+ OSReport("I hit Mario.");
+}
+void daRamboo_c::collisionCat1_Fireball_E_Explosion(ActivePhysics *apThis, ActivePhysics *apOther) {
+ OSReport("Hit Fireball");
+ CreateEffect(378, &apOther->owner->pos, &(S16Vec){0,0,0}, &(Vec){0.5, 0.5, 0.5});
+ this->pos.x += 6.0;
+}
+bool daRamboo_c::collisionCat2_IceBall_15_YoshiIce(ActivePhysics *apThis, ActivePhysics *apOther) { OSReport("Hit Iceball"); return false; }
+void daRamboo_c::collisionCat9_RollingObject(ActivePhysics *apThis, ActivePhysics *apOther) {
+ OSReport("Hit Rolling Object");
+
+ if (apOther->owner->name == 412) { // Check if it's a glow block
+ CreateEffect(378, &apOther->owner->pos);
+ CreateEffect(380, &apOther->owner->pos);
+
+ doStateChange(&StateID_Flee);
+ apOther->owner->Delete();
+ }
+}
+void daRamboo_c::collisionCat13_Hammer(ActivePhysics *apThis, ActivePhysics *apOther) { OSReport("Hit Hammer"); }
+
+
+void daRamboo_c::dieBigFall_Execute() {
+
+ if (this->dying == 1) { return; }
+
+ this->rot.x = 0x0; // X is vertical axis
+ this->rot.y = 0xE000; // Y is horizontal axis
+ this->rot.z = 0x0; // Z is ... an axis >.>
+
+ if (this->scale.x > 0.1) {
+
+ PlaySound(this, SE_BOSS_CMN_DAMAGE_LAST);
+ PlaySound(this, SE_EMY_BIG_TERESA_DEAD);
+
+ this->scale.x -= 0.175;
+ this->scale.y -= 0.175;
+ this->scale.z -= 0.175;
+
+ Vec tempPos = (Vec){this->pos.x + 160.0, this->pos.y - 80.0, 5500.0};
+
+ if (this->timer == 30) {
+ CreateEffect(&tempPos, &(S16Vec){0,0,0}, &(Vec){2.0, 2.0, 2.0}, 756);
+ CreateEffect(&tempPos, &(S16Vec){0,0,0}, &(Vec){2.0, 2.0, 2.0}, 801);
+ CreateEffect(&tempPos, &(S16Vec){0,0,0}, &(Vec){2.0, 2.0, 2.0}, 957);
+ this->timer = 0;
+ }
+ }
+ else {
+ this->scale.x = 0.0;
+ this->scale.y = 0.0;
+ this->scale.z = 0.0;
+
+ Vec tempPos = (Vec){this->pos.x + 160.0, this->pos.y - 80.0, 5500.0};
+
+ CreateEffect(&tempPos, &(S16Vec){0,0,0}, &(Vec){2.0, 2.0, 2.0}, 588);
+ this->dying = 1;
+ }
+
+ this->timer += 1;
+
+
+
+}
+
+
+int daRamboo_c::onCreate() {
+
+ OSReport("Creating the Ramboo Model");
+ allocator.link(-1, GameHeaps[0], 0, 0x20);
+
+ nw4r::g3d::ResFile rf(getResource("teresa", "g3d/teresa.brres"));
+
+ fogModel.setup(rf.GetResMdl("fog"), &allocator, 0x224, 1, 0);
+ SetupTextures_Enemy(&fogModel, 0);
+
+ bodyModel.setup(rf.GetResMdl("teresaA"), &allocator, 0x224, 1, 0);
+ SetupTextures_Enemy(&bodyModel, 0);
+
+
+ allocator.unlink();
+
+// this->BigBossRamboo = this->settings >> 28;
+
+
+ OSReport("Setting Ramboo's Size to 16.0");
+ this->scale = (Vec){2.0, 2.0, 2.0};
+
+ OSReport("Creating Ramboo's Physics Struct");
+
+ ActivePhysics::Info HitMeBaby;
+ HitMeBaby.xDistToCenter = 160.0;
+ HitMeBaby.yDistToCenter = -80.0;
+
+ HitMeBaby.xDistToEdge = 154.0;
+ HitMeBaby.yDistToEdge = 154.0;
+
+ HitMeBaby.category1 = 0x3;
+ HitMeBaby.category2 = 0x0;
+ HitMeBaby.bitfield1 = 0x4F;
+ HitMeBaby.bitfield2 = 0x222;
+ HitMeBaby.unkShort1C = 0;
+ HitMeBaby.callback = &dEn_c::collisionCallback;
+
+
+ OSReport("Making the Physics Class and adding to the list");
+ this->aPhysics.initWithStruct(this, &HitMeBaby);
+ this->aPhysics.addToList();
+
+ OSReport("Setting up the Box of Goodies");
+
+ this->Baseline = this->pos.y;
+ this->rot.x = 0; // X is vertical axis
+ this->rot.y = 0xE000; // Y is horizontal axis
+ this->rot.z = 0; // Z is ... an axis >.>
+ this->direction = 0; // Heading left.
+
+ this->speed.x = 0.0;
+ this->ytimer = 0;
+
+ char eventNum = (this->settings >> 16) & 0xFF;
+ OSReport("Event to activate: %d", eventNum);
+
+ this->eventFlag = (u64)1 << (eventNum - 1);
+
+
+
+ OSReport("Setting the State");
+ doStateChange(&StateID_Grow);
+
+ OSReport("Going to Execute Ramboo");
+ this->onExecute();
+ return true;
+}
+
+int daRamboo_c::onDelete() {
+ return true;
+}
+
+int daRamboo_c::onExecute() {
+ acState.execute();
+ updateModelMatrices();
+
+ if (this->aPhysics.result1 == 1) {
+ char PlayerID = NearestPlayer(this);
+ dStageActor_c *Player = GetSpecificPlayerActor(PlayerID);
+
+ this->_vf220(Player);
+ }
+
+ if (EventTable->events & this->eventFlag) {
+ doStateChange(&StateID_DieBigFall);
+ }
+
+ return true;
+}
+
+int daRamboo_c::onDraw() {
+ fogModel.scheduleForDrawing();
+ bodyModel.scheduleForDrawing();
+ return true;
+}
+
+
+void daRamboo_c::updateModelMatrices() {
+ // This won't work with wrap because I'm lazy.
+ matrix.translation(pos.x + 160.0, pos.y + (scale.x * 12.0) - 80.0, pos.z);
+
+ fogModel.setDrawMatrix(matrix);
+ fogModel.setScale(&scale);
+ fogModel.calcWorld(false);
+
+ matrix.translation(pos.x + 160.0, pos.y - 80.0, pos.z);
+ matrix.applyRotationYXZ(&rot.x, &rot.y, &rot.z);
+
+ bodyModel.setDrawMatrix(matrix);
+ bodyModel.setScale(&scale);
+ bodyModel.calcWorld(false);
+}
+
+
+// Grow State
+
+void daRamboo_c::beginState_Grow() {
+ OSReport("Growing when Kameck Tells me to.");
+ this->timer = 0;
+// PlaySound(this, SE_BOSS_ROY_MAGIC_MAKE_FAST);
+}
+
+void daRamboo_c::executeState_Grow() {
+
+ this->timer = this->timer + 1;
+
+ float scaleSpeed, yPosScaling;
+
+ if ((this->timer > 60) && (this->timer < 140)) {
+ scaleSpeed = 0.175;
+// yPosScaling = 0;
+
+ float modifier;
+
+ modifier = 2.0 + ((this->timer - 60) * scaleSpeed);
+
+ this->scale = (Vec){modifier, modifier, modifier};
+// this->pos.y = this->pos.y + (yPosScaling/80);
+
+ }
+
+ if (this->timer > 170) {
+ PlaySound(this, SE_EMY_CS_TERESA_BRING_IT);
+ doStateChange(&StateID_Advance);
+ }
+
+}
+void daRamboo_c::endState_Grow() {
+ this->Baseline = this->pos.y;
+// StopSound(SE_BOSS_ROY_MAGIC_MAKE_FAST);
+
+ OSReport("OK. All grown up now.");
+}
+
+
+
+
+
+// Advance State
+
+void daRamboo_c::beginState_Advance() {
+ OSReport("Charge!");
+ this->speed.y = 0;
+ this->speed.z = 0;
+ this->timer = 0;
+}
+void daRamboo_c::executeState_Advance() {
+
+ this->pos.x -= this->timer / 32;
+ this->pos.y = this->Baseline + sin(this->ytimer * 3.14 / 192) * 48;
+
+
+ if (this->timer >= 48) { this->timer = 47; }
+ if (this->ytimer >= 384) { this->ytimer = 0; }
+
+ PlaySound(this, SE_EMY_TERESA);
+
+ this->timer += 1;
+ this->ytimer += 1;
+}
+
+void daRamboo_c::endState_Advance() { OSReport("Ouch. Stop Charging."); }
+
+
+
+
+
+// Wait State
+
+void daRamboo_c::beginState_Wait() {
+
+ OSReport("Waiting");
+ this->timer = 0;
+ PlaySound(this, SE_EMY_TERESA_STOP);
+
+}
+void daRamboo_c::executeState_Wait() {
+
+ if (this->timer > 60) {
+ PlaySound(this, SE_EMY_CS_TERESA_BEAT_YOU);
+ doStateChange(&StateID_Advance);
+ }
+
+ this->timer += 1;
+
+}
+
+void daRamboo_c::endState_Wait() { OSReport("No more bouncing."); }
+
+
+
+
+
+// Flee State
+
+void daRamboo_c::beginState_Flee() {
+
+ OSReport("Damnit that hurt.");
+ this->timer = 0;
+
+}
+void daRamboo_c::executeState_Flee() {
+
+ this->pos.x += (60 - this->timer) / 8;
+
+ if (this->timer > 60) { doStateChange(&StateID_Wait); }
+
+ this->timer += 1;
+}
+
+void daRamboo_c::endState_Flee() { OSReport("Ugh, so dizzy."); }
+