From 5051883b9911a11baca51f6157ccf11028dca9f5 Mon Sep 17 00:00:00 2001 From: Colin Noga Date: Sat, 9 Jun 2012 07:23:24 -0500 Subject: Updated and improved Bowser boss --- src/bossCaptainBowser.cpp | 217 +++++++++++++++++++++++++++++++--------------- 1 file changed, 148 insertions(+), 69 deletions(-) (limited to 'src') diff --git a/src/bossCaptainBowser.cpp b/src/bossCaptainBowser.cpp index 0f1cf96..c894ecd 100644 --- a/src/bossCaptainBowser.cpp +++ b/src/bossCaptainBowser.cpp @@ -5,14 +5,32 @@ #include #include "boss.h" -extern "C" void *BowserExtiDemoState(void *, unsigned int); -extern "C" void *MagicEnd(dStageActor_c *); - -void BowserDoom(dStageActor_c *Controller) { - OSReport("THERE IS A FUCKING STATE HERE"); - BowserExtiDemoState(WLClass::instance, 1); - MagicEnd(Controller); - // MakeMarioExitDemoMode(); +extern "C" void *BowserExitDemoState(void *, unsigned int); +extern "C" void *ForceMarioExitDemoMode(void *, unsigned int); +extern "C" void *ShakeScreen(void *, unsigned int, unsigned int, unsigned int); +extern "C" void *StageScreen; + + +void BowserDoomStart(dStageActor_c *Controller) { + OSReport("Here we go!"); + + dEn_c *Bowser = (dEn_c*)FindActorByType(EN_BOSS_KOOPA, (Actor*)Controller); + Bowser->Delete(1); + +} + +void BowserDoomExecute(dStageActor_c *Controller) { + dFlagMgr_c::instance->set(0, 0, true, false, false); + dFlagMgr_c::instance->set(1, 0, true, false, false); + dFlagMgr_c::instance->set(2, 0, true, false, false); + dFlagMgr_c::instance->set(3, 0, true, false, false); + dFlagMgr_c::instance->set(4, 0, true, false, false); + Controller->Delete(1); +} + +void BowserDoomEnd(dStageActor_c *Controller) { + OSReport("Bai bai everybody"); + Controller->Delete(1); } @@ -76,12 +94,14 @@ public: char isAngry; char isInvulnerable; + char isIntro; float scaleIncreaser; int homingBillCountdown; int homingBillSlot; int maxDamage; int playerCount; float sinTimer; + float roarLen; static daCaptainBowser *build(); @@ -110,23 +130,6 @@ daCaptainBowser *daCaptainBowser::build() { return new(buffer) daCaptainBowser; } -void ShipPhysicsCallback(daCaptainBowser *self, dEn_c *other) { - if (other->name == 657) { - OSReport("CANNON COLLISION"); - if (self->isInvulnerable) { - return; - } - self->damage -= 1; - - SpawnEffect("Wm_en_burst_m", 0, &other->pos, &(S16Vec){0,0,0}, &(Vec){1.0, 1.0, 1.0}); - PlaySound(other, SE_OBJ_TARU_BREAK); - other->Delete(1); - - if (self->damage == self->maxDamage/2) { self->doStateChange(&daCaptainBowser::StateID_Roar); } - else if (self->damage < 0) { self->doStateChange(&daCaptainBowser::StateID_Outro); } - } -} - /////////////////////// // Externs and States /////////////////////// @@ -169,6 +172,23 @@ void ShipPhysicsCallback(daCaptainBowser *self, dEn_c *other) { } } + void ShipPhysicsCallback(daCaptainBowser *self, dEn_c *other) { + if (other->name == 657) { + OSReport("CANNON COLLISION"); + if (self->isInvulnerable) { + return; + } + self->damage -= 1; + + SpawnEffect("Wm_en_burst_m", 0, &other->pos, &(S16Vec){0,0,0}, &(Vec){1.0, 1.0, 1.0}); + PlaySound(other, SE_OBJ_TARU_BREAK); + other->Delete(1); + + if (self->damage == self->maxDamage/2) { self->doStateChange(&daCaptainBowser::StateID_Roar); } + else if (self->damage < 0) { self->doStateChange(&daCaptainBowser::StateID_Outro); } + } + } + void daCaptainBowser::playerCollision(ActivePhysics *apThis, ActivePhysics *apOther) { DamagePlayer(this, apThis, apOther); } @@ -214,7 +234,7 @@ int daCaptainBowser::onCreate() { // Prep the goods this->playerCount = GetActivePlayerCount(); - this->maxDamage = (10* this->playerCount) +10; + this->maxDamage = (10 * this->playerCount) + 10; this->scale = (Vec){0.57, 0.57, 0.57}; @@ -277,7 +297,8 @@ int daCaptainBowser::onCreate() { // State Changers - doStateChange(&StateID_Wait); + this->isIntro = 3; + doStateChange(&StateID_Intro); return true; } @@ -295,49 +316,51 @@ int daCaptainBowser::onExecute() { bodyModel._vf1C(); shipModel._vf1C(); - float xmod = sin(this->sinTimer * 3.14 / 180.0) * 80.0; - float ymod = sin(this->sinTimer * 3.14 / 130.0) * 112.0; + if(this->isIntro == 0) { - pos.x = ClassWithCameraInfo::instance->screenCentreX + 200.0 + xmod; - pos.y = ClassWithCameraInfo::instance->screenCentreY - 180.0 + ymod; + float xmod = sin(this->sinTimer * 3.14 / 180.0) * 80.0; + float ymod = sin(this->sinTimer * 3.14 / 130.0) * 112.0; - this->sinTimer++; - - // this->homingBillCountdown--; - - // if (this->homingBillCountdown == 0) { + pos.x = ClassWithCameraInfo::instance->screenCentreX + 200.0 + xmod; + pos.y = ClassWithCameraInfo::instance->screenCentreY - 180.0 + ymod; + + this->sinTimer++; + } + // this->homingBillCountdown--; - // Vec tempPos; - - // switch (this->homingBillSlot) { - // case 0: - // this->homingBillSlot++; - // tempPos.x = this->pos.x - 26.0; - // tempPos.y = this->pos.y + 40.0; - // tempPos.z = this->pos.z + 2000.0; - // break; - - // case 1: - // this->homingBillSlot++; - // tempPos.x = this->pos.x + 22.0; - // tempPos.y = this->pos.y + 40.0; - // tempPos.z = this->pos.z + 2000.0; - // break; - - // case 2: - // this->homingBillSlot = 0; - // tempPos.x = this->pos.x + 70.0; - // tempPos.y = this->pos.y + 40.0; - // tempPos.z = this->pos.z + 2000.0; - // break; - // } - - // SpawnEffect("Wm_en_killervanish", 0, &tempPos, &(S16Vec){0,0,0}, &(Vec){0.1, 0.1, 0.1}); - // PlaySoundAsync(this, SE_EMY_SR_KILLER_SHOT); - // CreateActor(EN_SEARCH_KILLER, 0, tempPos, 0, 0); - - // this->homingBillCountdown = (isAngry) ? 90: 180; - // } + // if (this->homingBillCountdown == 0) { + + // Vec tempPos; + + // switch (this->homingBillSlot) { + // case 0: + // this->homingBillSlot++; + // tempPos.x = this->pos.x - 26.0; + // tempPos.y = this->pos.y + 40.0; + // tempPos.z = this->pos.z + 2000.0; + // break; + + // case 1: + // this->homingBillSlot++; + // tempPos.x = this->pos.x + 22.0; + // tempPos.y = this->pos.y + 40.0; + // tempPos.z = this->pos.z + 2000.0; + // break; + + // case 2: + // this->homingBillSlot = 0; + // tempPos.x = this->pos.x + 70.0; + // tempPos.y = this->pos.y + 40.0; + // tempPos.z = this->pos.z + 2000.0; + // break; + // } + + // SpawnEffect("Wm_en_killervanish", 0, &tempPos, &(S16Vec){0,0,0}, &(Vec){0.1, 0.1, 0.1}); + // PlaySoundAsync(this, SE_EMY_SR_KILLER_SHOT); + // CreateActor(EN_SEARCH_KILLER, 0, tempPos, 0, 0); + + // this->homingBillCountdown = (isAngry) ? 90: 180; + // } if(this->shipAnm.isAnimationDone()) { this->shipAnm.setCurrentFrame(0.0); @@ -347,6 +370,9 @@ int daCaptainBowser::onExecute() { } int daCaptainBowser::onDraw() { + + if(this->isIntro > 2) { return false; } + matrix.translation(pos.x-146.0, pos.y+122.0, pos.z-200.0); // 136.0 is the bottom of the platform footing short newrot = rot.y + 0xD800; matrix.applyRotationYXZ(&rot.x, &newrot, &rot.z); @@ -376,12 +402,65 @@ int daCaptainBowser::onDraw() { // State Intro ////////////////// void daCaptainBowser::beginState_Intro() { - + this->timer = 0; + bindAnimChr_and_setUpdateRate("kp_wait", 1, 0.0, 1.5); + this->isInvulnerable = 1; + roarLen = 300; } void daCaptainBowser::executeState_Intro() { + if (this->chrAnimation.isAnimationDone()) { + // End the intro + if (this->isIntro == 1) { + OSReport("We're done: %d", this->timer); + doStateChange(&StateID_Wait); + return; + } + this->chrAnimation.setCurrentFrame(0.0); } + + // Screen Rumble + // if ((this->timer > 180) && (this->timer < 420)) { + if (this->timer == 180) { + // Do Rumbly - 807CD3AC + + pos.x = ClassWithCameraInfo::instance->screenCentreX; + pos.y = ClassWithCameraInfo::instance->screenCentreY; + + ShakeScreen(StageScreen, 5, 1, 0); + OSReport("Shit Happens"); + PlaySound(this, SE_BOSS_KOOPA_RUMBLE1); // 0x5D4 + // Stage80::instance->ShakeScreen(self, 5, 1, 0); + } + + // Bowser Flies In + if (this->timer == 422) { this->isIntro = 2; } + if ((this->timer > 420) && (this->timer < (420 + roarLen))) { + pos.x = ClassWithCameraInfo::instance->screenCentreX + ((this->timer - 420.0) * 1.5) - ((roarLen * 1.5) - 200.0); + pos.y = ClassWithCameraInfo::instance->screenCentreY - 380.0 + ((this->timer - 420.0) * 1.5) - ((roarLen * 1.5) - 200.0); + } + + // Bowser does a shitty roar + if (this->timer == (roarLen - 190 + 420)) { + this->isIntro = 1; + bindAnimChr_and_setUpdateRate("kp_roar3", 1, 0.0, 1.0); + } + if (this->timer > (roarLen - 190 + 420)) { + + if (this->chrAnimation.getCurrentFrame() == 53.0) { + PlaySound(this, SE_VOC_KP_L_SHOUT); + } + + if (this->chrAnimation.getCurrentFrame() > 53.0) { + effect.spawn("Wm_ko_shout", 0, &(Vec){pos.x-186.0, pos.y+144.0, pos.z}, &(S16Vec){0,0,0x7000}, &(Vec){1.0, 1.0, 1.0}); + } + } + + this->timer++; + } + void daCaptainBowser::endState_Intro() { + this->isInvulnerable = 0; + this->isIntro = 0; } - void daCaptainBowser::endState_Intro() { } ////////////////// -- cgit v1.2.3