summaryrefslogtreecommitdiff
path: root/src/bossBalboaWrench.cpp
diff options
context:
space:
mode:
authorStephen Simpson <megazig@gmail.com>2011-10-19 12:36:15 -0500
committerStephen Simpson <megazig@gmail.com>2011-10-19 12:36:15 -0500
commitb14405c831f2e94f771f65e786d7b2b88146ca97 (patch)
tree75e4b3d9eb75db7e2b09566dc51809be571f389c /src/bossBalboaWrench.cpp
parent4d5d95ec2c70578627353e40047462c82ac695c1 (diff)
parent80e51e409ca322ff22431be8a33131d2f705a8c7 (diff)
downloadkamek-b14405c831f2e94f771f65e786d7b2b88146ca97.tar.gz
kamek-b14405c831f2e94f771f65e786d7b2b88146ca97.zip
Merge branch 'level-select' into megaTestBoss
Diffstat (limited to 'src/bossBalboaWrench.cpp')
-rw-r--r--src/bossBalboaWrench.cpp711
1 files changed, 711 insertions, 0 deletions
diff --git a/src/bossBalboaWrench.cpp b/src/bossBalboaWrench.cpp
new file mode 100644
index 0000000..efb3abe
--- /dev/null
+++ b/src/bossBalboaWrench.cpp
@@ -0,0 +1,711 @@
+#include <common.h>
+#include <game.h>
+#include <g3dhax.h>
+#include <sfx.h>
+#include <stage.h>
+#include "effects.h"
+#include "player.h"
+
+class daBalboa_c : public dEn_c {
+ int onCreate();
+ int onDelete();
+ int onExecute();
+ int onDraw();
+
+ mHeapAllocator_c allocator;
+ m3d::mdl_c bodyModel;
+ m3d::mdl_c manholeModel;
+ m3d::mdl_c holeModel;
+
+ nw4r::g3d::ResFile resFile;
+ m3d::anmChr_c anmDead;
+ m3d::anmChr_c anmDead_2;
+ m3d::anmChr_c anmGo_out_ed;
+ m3d::anmChr_c anmGo_out_st;
+ m3d::anmChr_c anmThrow_1;
+ m3d::anmChr_c anmThrow_2;
+ m3d::anmChr_c anmThrow_3;
+ m3d::anmChr_c anmThrow_4Left;
+ m3d::anmChr_c anmThrow_4Right;
+ m3d::anmChr_c anmThrow_5;
+
+ int timer;
+ float Baseline;
+ float dying;
+ Vec PopUp [4];
+ dStageActor_c *homingWrench;
+ int homingWrenchLifeSpan;
+ float homingWrenchDirection;
+ char throwCount;
+
+ static daBalboa_c *build();
+
+ void setupModels();
+ 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(daBalboa_c);
+ DECLARE_STATE(Grow);
+ DECLARE_STATE(ManholeUp);
+ DECLARE_STATE(HeadPoke);
+ DECLARE_STATE(AllOut);
+ DECLARE_STATE(ThrowHoming);
+ DECLARE_STATE(ThrowWrench);
+ DECLARE_STATE(BackDown);
+ DECLARE_STATE(Outro);
+};
+
+daBalboa_c *daBalboa_c::build() {
+ void *buffer = AllocFromGameHeap1(sizeof(daBalboa_c));
+ return new(buffer) daBalboa_c;
+}
+
+
+extern "C" void *HandleXSpeed(daBalboa_c *);
+extern "C" void *HandleYSpeed(daBalboa_c *);
+extern "C" void *UpdateObjectPosBasedOnSpeedValues_real(daBalboa_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(daBalboa_c *, Vec pos);
+extern "C" dStageActor_c *GetSpecificPlayerActor(int number);
+extern "C" void *PlaySound(daBalboa_c *, int soundID);
+
+
+CREATE_STATE(daBalboa_c, Grow);
+CREATE_STATE(daBalboa_c, ManholeUp);
+CREATE_STATE(daBalboa_c, HeadPoke);
+CREATE_STATE(daBalboa_c, AllOut);
+CREATE_STATE(daBalboa_c, ThrowHoming);
+CREATE_STATE(daBalboa_c, ThrowWrench);
+CREATE_STATE(daBalboa_c, BackDown);
+CREATE_STATE(daBalboa_c, Outro);
+
+
+
+void daBalboa_c::playerCollision(ActivePhysics *apThis, ActivePhysics *apOther) {
+ this->_vf220(apOther->owner);
+ OSReport("I hit Mario.");
+}
+void daBalboa_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 daBalboa_c::collisionCat2_IceBall_15_YoshiIce(ActivePhysics *apThis, ActivePhysics *apOther) { OSReport("Hit Iceball"); return false; }
+void daBalboa_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);
+
+ apOther->owner->Delete();
+ doStateChange(&StateID_Outro);
+ }
+}
+void daBalboa_c::collisionCat13_Hammer(ActivePhysics *apThis, ActivePhysics *apOther) { OSReport("Hit Hammer"); }
+
+
+
+
+void daBalboa_c::setupModels() {
+ allocator.link(-1, GameHeaps[0], 0, 0x20);
+
+ nw4r::g3d::ResMdl mdl;
+ nw4r::g3d::ResAnmChr anmChr;
+
+ this->resFile.data = getResource("choropoo", "g3d/choropoo.brres");
+
+ mdl = this->resFile.GetResMdl("manhole");
+ this->manholeModel.setup(mdl, &allocator, 0x224, 1, 0);
+ SetupTextures_Enemy(&this->manholeModel, 0);
+
+ mdl = this->resFile.GetResMdl("choropoo_hole");
+ this->holeModel.setup(mdl, &allocator, 0x224, 1, 0);
+ SetupTextures_Enemy(&this->holeModel, 0);
+
+ mdl = this->resFile.GetResMdl("choropoo");
+ this->bodyModel.setup(mdl, &allocator, 0x224, 1, 0);
+ SetupTextures_Enemy(&this->bodyModel, 0);
+
+
+
+ anmChr = this->resFile.GetResAnmChr("dead");
+ this->anmDead.setup(mdl, anmChr, &this->allocator, 0);
+
+ anmChr = this->resFile.GetResAnmChr("dead_2");
+ this->anmDead_2.setup(mdl, anmChr, &this->allocator, 0);
+
+ anmChr = this->resFile.GetResAnmChr("go_out_ed");
+ this->anmGo_out_ed.setup(mdl, anmChr, &this->allocator, 0);
+
+ anmChr = this->resFile.GetResAnmChr("go_out_st");
+ this->anmGo_out_st.setup(mdl, anmChr, &this->allocator, 0);
+
+ anmChr = this->resFile.GetResAnmChr("throw_1");
+ this->anmThrow_1.setup(mdl, anmChr, &this->allocator, 0);
+
+ anmChr = this->resFile.GetResAnmChr("throw_2");
+ this->anmThrow_2.setup(mdl, anmChr, &this->allocator, 0);
+
+ anmChr = this->resFile.GetResAnmChr("throw_3");
+ this->anmThrow_3.setup(mdl, anmChr, &this->allocator, 0);
+
+ anmChr = this->resFile.GetResAnmChr("throw_4_left_hand");
+ this->anmThrow_4Left.setup(mdl, anmChr, &this->allocator, 0);
+
+ anmChr = this->resFile.GetResAnmChr("throw_4_right_hand");
+ this->anmThrow_4Right.setup(mdl, anmChr, &this->allocator, 0);
+
+ anmChr = this->resFile.GetResAnmChr("throw_5");
+ this->anmThrow_5.setup(mdl, anmChr, &this->allocator, 0);
+
+
+ allocator.unlink();
+}
+
+
+
+// Animation Order...
+// AppearLittle - Throw One, sound 0x21F
+// Search - Throw two
+// AppearFull - Throw 3 and sound 0x220
+// Attack - Throw 4
+// Disappear - Throw 5
+
+
+
+int daBalboa_c::onCreate() {
+
+ OSReport("Creating the Balboa Model");
+ setupModels();
+
+
+ OSReport("Setting Balboa's Size to 4.0");
+ this->scale = (Vec){1.0, 1.0, 1.0};
+
+ OSReport("Creating Balboa's Physics Struct");
+
+ ActivePhysics::Info HitMeBaby;
+ HitMeBaby.xDistToCenter = 0.0;
+ HitMeBaby.yDistToCenter = 36.0;
+
+ HitMeBaby.xDistToEdge = 24.0;
+ HitMeBaby.yDistToEdge = 30.0;
+
+ HitMeBaby.category1 = 0x3;
+ HitMeBaby.category2 = 0x0;
+ HitMeBaby.bitfield1 = 0x4F;
+ HitMeBaby.bitfield2 = 0xFFBAFFFE;
+ 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->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->pos.z = -800.0;
+
+ this->PopUp[0] = (Vec){this->pos.x, this->pos.y + 120.0, this->pos.z};
+ this->PopUp[1] = (Vec){this->pos.x - 320.0, this->pos.y - 60.0, this->pos.z};
+ this->PopUp[2] = (Vec){this->pos.x, this->pos.y + 120.0, this->pos.z};
+ this->PopUp[3] = (Vec){this->pos.x - 320.0, this->pos.y - 60.0, this->pos.z};
+
+
+ OSReport("Setting the State");
+ doStateChange(&StateID_Grow);
+
+ OSReport("Going to Execute Balboa");
+ this->onExecute();
+ return true;
+}
+
+int daBalboa_c::onDelete() {
+ return true;
+}
+
+int daBalboa_c::onExecute() {
+ acState.execute();
+ updateModelMatrices();
+
+ if (this->aPhysics.result1 == 1) {
+ char PlayerID = NearestPlayer(this);
+ dStageActor_c *Player = GetSpecificPlayerActor(PlayerID);
+
+ this->_vf220(Player);
+ }
+
+ if (this->homingWrenchLifeSpan > 1) {
+ this->homingWrench->pos.y += this->homingWrenchDirection;
+ this->homingWrenchLifeSpan -= 1;
+ }
+
+ if (this->homingWrenchLifeSpan == 1) {
+ this->homingWrench->Delete();
+ CreateEffect(&this->homingWrench->pos, &(S16Vec){0,0,0}, &(Vec){1.5, 1.5, 1.5}, 242);
+
+ this->homingWrenchLifeSpan = 0;
+ }
+
+
+ return true;
+}
+
+int daBalboa_c::onDraw() {
+
+ bodyModel.scheduleForDrawing();
+
+ return true;
+}
+
+
+void daBalboa_c::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);
+
+}
+
+
+// Grow State
+
+void daBalboa_c::beginState_Grow() {
+ OSReport("Growing when Kameck Tells me to.");
+ this->timer = 0;
+
+}
+
+void daBalboa_c::executeState_Grow() {
+
+ this->timer = this->timer + 1;
+
+ float scaleSpeed, yPosScaling;
+
+ if (this->timer == 60) { PlaySound(this, SE_BOSS_IGGY_WANWAN_TO_L); }
+ if ((this->timer > 60) && (this->timer < 140)) {
+ scaleSpeed = 0.025;
+// 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_CHOROPU_BOUND);
+ doStateChange(&StateID_BackDown);
+ }
+
+}
+void daBalboa_c::endState_Grow() {
+
+ OSReport("OK. All grown up now.");
+}
+
+
+
+
+
+// ManholeUp State
+
+void daBalboa_c::beginState_ManholeUp() {
+
+ nw4r::g3d::ResAnmChr anmChr = this->resFile.GetResAnmChr("throw_1");
+ this->anmThrow_1.bind(&this->bodyModel, anmChr, 1);
+ this->bodyModel.bindAnim(&this->anmThrow_1, 0.0);
+ this->anmThrow_1.setUpdateRate(1.0);
+
+ this->timer = 0;
+
+ int randChoice;
+ randChoice = GenerateRandomNumber(4);
+
+ this->pos = this->PopUp[randChoice];
+
+ if (randChoice < 2) { // On the left side!
+ this->rot.y = 0xE000;
+ this->direction = 0; }
+ else { // On the right side!
+ this->rot.y = 0x2000;
+ this->direction = 1; }
+
+ PlaySound(this, 0x21F);
+}
+
+void daBalboa_c::executeState_ManholeUp() {
+
+ this->bodyModel._vf1C();
+
+ if (this->timer < 30) {
+ this->pos.y += 0.5; } // Height is 80 pixels, move up 15 pixels.
+
+ if (this->timer > 90) {
+ doStateChange(&StateID_HeadPoke); }
+
+ this->timer += 1;
+
+}
+void daBalboa_c::endState_ManholeUp() { }
+
+
+
+
+// HeadPoke State
+
+void daBalboa_c::beginState_HeadPoke() {
+
+ nw4r::g3d::ResAnmChr anmChr = this->resFile.GetResAnmChr("throw_2");
+ this->anmThrow_2.bind(&this->bodyModel, anmChr, 1);
+ this->bodyModel.bindAnim(&this->anmThrow_2, 0.0);
+ this->anmThrow_2.setUpdateRate(1.0);
+
+ this->timer = 0;
+}
+
+void daBalboa_c::executeState_HeadPoke() {
+
+ if (this->timer < 30) {
+ this->pos.y += 1.0; } // Height is 80 pixels, move up another 30 pixels.
+
+ if (this->timer > 90) {
+ doStateChange(&StateID_AllOut); }
+
+ this->timer += 1;
+ this->bodyModel._vf1C();
+
+}
+void daBalboa_c::endState_HeadPoke() { }
+
+
+
+
+
+// AllOut State
+
+void daBalboa_c::beginState_AllOut() {
+
+ nw4r::g3d::ResAnmChr anmChr = this->resFile.GetResAnmChr("throw_3");
+ this->anmThrow_3.bind(&this->bodyModel, anmChr, 1);
+ this->bodyModel.bindAnim(&this->anmThrow_1, 0.0);
+ this->anmThrow_3.setUpdateRate(1.0);
+
+ this->timer = 0;
+
+ PlaySound(this, 0x220);
+}
+
+void daBalboa_c::executeState_AllOut() {
+
+ this->bodyModel._vf1C();
+
+ if (this->timer < 30) {
+ this->pos.y += 1.2; } // Height is 80 pixels, move up another 35 pixels.
+
+ if (this->timer > 90) {
+ int randChoice;
+ randChoice = GenerateRandomNumber(2);
+
+ if (randChoice == 0) {
+ doStateChange(&StateID_ThrowHoming); }
+ else {
+ doStateChange(&StateID_ThrowWrench); }
+ }
+
+ this->timer += 1;
+
+}
+void daBalboa_c::endState_AllOut() { }
+
+
+
+
+// ThrowHoming State
+
+void daBalboa_c::beginState_ThrowHoming() {
+
+ if (this->direction == 0) {
+ nw4r::g3d::ResAnmChr anmChr = this->resFile.GetResAnmChr("throw_4_left_hand");
+ this->anmThrow_4Left.bind(&this->bodyModel, anmChr, 1);
+ this->bodyModel.bindAnim(&this->anmThrow_4Left, 0.0);
+ this->anmThrow_4Left.setUpdateRate(1.0);
+ }
+ else {
+ nw4r::g3d::ResAnmChr anmChr = this->resFile.GetResAnmChr("throw_4_right_hand");
+ this->anmThrow_4Right.bind(&this->bodyModel, anmChr, 1);
+ this->bodyModel.bindAnim(&this->anmThrow_4Right, 0.0);
+ this->anmThrow_4Right.setUpdateRate(1.0);
+ }
+
+
+ Vec tempPos = this->pos;
+ if (this->direction == 0) {
+ tempPos.x -= 32.0;
+ tempPos.y += 10.0;
+
+ this->homingWrench = CreateActor(372, this->direction << 28, tempPos, 0, 0);
+ this->homingWrench->speed.x = -7.0;
+ this->homingWrench->scale = (Vec){3.0, 3.0, 3.0};
+
+ }
+ else {
+ tempPos.x += 32.0;
+ tempPos.y += 10.0;
+
+ this->homingWrench = CreateActor(372, this->direction << 28, tempPos, 0, 0);
+ this->homingWrench->speed.x = 7.0;
+ this->homingWrench->scale = (Vec){3.0, 3.0, 3.0};
+
+ }
+
+
+ char PlayerID = NearestPlayer(this);
+ dStageActor_c *Player = GetSpecificPlayerActor(PlayerID);
+
+
+ if ((Player->pos.y >= tempPos.y - 16.0) && (Player->pos.y <= tempPos.y + 16.0)) {
+ this->homingWrenchDirection = 0.0; }
+
+ else if ((Player->pos.y >= tempPos.y - 106.0) && (Player->pos.y < tempPos.y - 16.0)) {
+ this->homingWrenchDirection = -0.4; }
+
+ else if ((Player->pos.y <= tempPos.y + 106.0) && (Player->pos.y > tempPos.y + 16.0)) {
+ this->homingWrenchDirection = 0.4; }
+
+ else if (Player->pos.y < tempPos.y - 106.0) {
+ this->homingWrenchDirection = -0.8; }
+
+ else if (Player->pos.y > tempPos.y + 106.0) {
+ this->homingWrenchDirection = 0.8; }
+
+ else {
+ this->homingWrenchDirection = 0.0; }
+
+
+ PlaySound(this, 0x222);
+ this->homingWrenchLifeSpan = 360;
+
+ this->timer = 0;
+}
+
+void daBalboa_c::executeState_ThrowHoming() {
+ this->bodyModel._vf1C();
+
+ if (this->timer > 60) {
+ doStateChange(&StateID_BackDown); }
+
+ this->timer += 1;
+ this->bodyModel._vf1C();
+}
+void daBalboa_c::endState_ThrowHoming() { }
+
+
+
+
+// ThrowWrench State
+
+void daBalboa_c::beginState_ThrowWrench() {
+
+ this->timer = 0;
+}
+
+void daBalboa_c::executeState_ThrowWrench() {
+
+
+
+ if (this->timer == 60) {
+
+ if (this->throwCount & 1) {
+ nw4r::g3d::ResAnmChr anmChr = this->resFile.GetResAnmChr("throw_4_left_hand");
+ this->anmThrow_4Left.bind(&this->bodyModel, anmChr, 1);
+ this->bodyModel.bindAnim(&this->anmThrow_4Left, 0.0);
+ this->anmThrow_4Left.setUpdateRate(1.0);
+ }
+ else {
+ nw4r::g3d::ResAnmChr anmChr = this->resFile.GetResAnmChr("throw_4_right_hand");
+ this->anmThrow_4Right.bind(&this->bodyModel, anmChr, 1);
+ this->bodyModel.bindAnim(&this->anmThrow_4Right, 0.0);
+ this->anmThrow_4Right.setUpdateRate(1.0);
+ }
+
+
+ char PlayerID = NearestPlayer(this);
+ dStageActor_c *Player = GetSpecificPlayerActor(PlayerID);
+
+
+ float slope = ( (this->pos.y - Player->pos.y) / (this->pos.x - Player->pos.x) );
+
+
+ Vec tempPos = this->pos;
+ if (this->direction == 0) {
+ tempPos.x -= 32.0;
+ tempPos.y += 10.0;
+
+ dStageActor_c *wrench = CreateActor(372, this->direction << 28, tempPos, 0, 0);
+ wrench->speed.x = -8.0;
+ wrench->speed.y = -8.0 * slope;
+ }
+
+ else {
+ tempPos.x += 32.0;
+ tempPos.y += 10.0;
+
+ dStageActor_c *wrench = CreateActor(372, this->direction << 28, tempPos, 0, 0);
+ wrench->speed.x = 8.0;
+ wrench->speed.y = 8.0 * slope;
+ }
+
+ PlaySound(this, 0x222);
+
+ this->timer = 0;
+ this->throwCount += 1;
+ }
+
+ if (this->throwCount == 5) {
+ doStateChange(&StateID_BackDown); }
+
+ this->timer += 1;
+ this->bodyModel._vf1C();
+
+}
+void daBalboa_c::endState_ThrowWrench() { this->throwCount = 0; }
+
+
+
+// BackDown State
+
+void daBalboa_c::beginState_BackDown() {
+
+ nw4r::g3d::ResAnmChr anmChr = this->resFile.GetResAnmChr("throw_5");
+ this->anmThrow_5.bind(&this->bodyModel, anmChr, 1);
+ this->bodyModel.bindAnim(&this->anmThrow_5, 0.0);
+ this->anmThrow_5.setUpdateRate(1.0);
+
+ this->timer = 0;
+
+ PlaySound(this, 0x221);
+
+ CreateEffect(&this->pos, &(S16Vec){0,0,0}, &(Vec){2.0, 1.0, 1.0}, 351);
+ CreateEffect(&this->pos, &(S16Vec){0,0,0}, &(Vec){2.0, 1.0, 1.0}, 352);
+}
+
+void daBalboa_c::executeState_BackDown() {
+
+ if (this->timer < 60) {
+ this->pos.y -= 2.6667; } // Height is 80 pixels, move down 80 pixels.
+
+ if (this->timer > 90) {
+ doStateChange(&StateID_ManholeUp); }
+
+ this->timer += 1;
+ this->bodyModel._vf1C();
+
+}
+void daBalboa_c::endState_BackDown() { }
+
+
+
+
+void daBalboa_c::beginState_Outro() {
+
+ this->removeMyActivePhysics();
+ this->timer = 0;
+ this->rot.x = 0x0; // X is vertical axis
+ this->rot.y = 0xE000; // Y is horizontal axis
+ this->rot.z = 0x0; // Z is ... an axis >.>
+
+}
+void daBalboa_c::executeState_Outro() {
+
+ if (this->dying == 1) {
+ if (this->timer > 180) {
+ ExitStage(WORLD_MAP, 0, BEAT_LEVEL, MARIO_WIPE);
+ }
+
+ if (this->timer == 60) {
+
+ if (GetSpecificPlayerActor(0) != 0) {
+ PlaySound(this, SE_VOC_MA_CLEAR_BOSS);
+ // Send PlBase into DemoGoal State here, kthxbai
+ }
+
+ if (GetSpecificPlayerActor(1) != 0) {
+ PlaySound(this, SE_VOC_LU_CLEAR_BOSS);
+ // Send PlBase into DemoGoal State here, kthxbai
+ }
+
+ if (GetSpecificPlayerActor(2) != 0) {
+ PlaySound(this, SE_VOC_KO_CLEAR_BOSS);
+ // Send PlBase into DemoGoal State here, kthxbai
+ }
+
+ if (GetSpecificPlayerActor(3) != 0) {
+ PlaySound(this, SE_VOC_KO2_CLEAR_BOSS);
+ // Send PlBase into DemoGoal State here, kthxbai
+ }
+ }
+
+ this->timer += 1;
+ return;
+ }
+
+ if (this->scale.x > 0.1) {
+
+ PlaySound(this, SE_BOSS_CMN_DAMAGE_LAST);
+ PlaySound(this, SE_EMY_BIG_TERESA_DEAD);
+
+ // Adjust this to equal the scale of your boss / 80.
+ this->scale.x -= 0.175;
+ this->scale.y -= 0.175;
+ this->scale.z -= 0.175;
+
+ this->pos.y += 2.0;
+
+ 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 = 0;
+
+ PlaySound(this, STRM_BGM_SHIRO_BOSS_CLEAR);
+ }
+
+ this->timer += 1;
+
+}
+void daBalboa_c::endState_Outro() { }
+
+