diff options
Diffstat (limited to '')
-rw-r--r-- | src/bossBalboaWrench.cpp | 711 | ||||
-rw-r--r-- | src/bossFuzzyBear.cpp | 1 | ||||
-rw-r--r-- | src/bossRamboo.cpp | 140 |
3 files changed, 813 insertions, 39 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() { } + + diff --git a/src/bossFuzzyBear.cpp b/src/bossFuzzyBear.cpp index 7ad7dcd..0c16d42 100644 --- a/src/bossFuzzyBear.cpp +++ b/src/bossFuzzyBear.cpp @@ -714,6 +714,7 @@ void daFuzzyBear_c::endState_Wait() { } void daFuzzyBear_c::beginState_Outro() { + this->removeMyActivePhysics(); this->timer = 0; } diff --git a/src/bossRamboo.cpp b/src/bossRamboo.cpp index 15304c5..6bc7e51 100644 --- a/src/bossRamboo.cpp +++ b/src/bossRamboo.cpp @@ -14,18 +14,19 @@ class daRamboo_c : public dEn_c { mHeapAllocator_c allocator; m3d::mdl_c bodyModel; + m3d::mdl_c hideModel; m3d::mdl_c fogModel; nw4r::g3d::ResFile resFile; - m3d::anmChr_c animationChrA; - m3d::anmChr_c animationChrB; - m3d::anmChr_c animationChrC; - m3d::anmChr_c animationChrD; - + m3d::anmChr_c anmFog; + m3d::anmChr_c anmWaitA; + m3d::anmChr_c anmShayA; + m3d::anmChr_c anmWaitB; + m3d::anmChr_c anmShayB; int timer; int ytimer; - char BigBossRamboo; + char Hiding; float Baseline; float dying; @@ -123,25 +124,33 @@ void daRamboo_c::setupModels() { bool ret; nw4r::g3d::ResMdl mdl = this->resFile.GetResMdl("fog"); - fogModel.setup(mdl, &allocator, 0x224, 1, 0); - SetupTextures_Enemy(&fogModel, 0); + this->fogModel.setup(mdl, &allocator, 0x224, 1, 0); + SetupTextures_Enemy(&this->fogModel, 0); nw4r::g3d::ResAnmChr anmChr = this->resFile.GetResAnmChr("fog"); - ret = this->animationChrA.setup(mdl, anmChr, &this->allocator, 0); + ret = this->anmFog.setup(mdl, anmChr, &this->allocator, 0); nw4r::g3d::ResMdl mdlB = this->resFile.GetResMdl("teresaA"); - bodyModel.setup(mdlB, &allocator, 0x224, 1, 0); - SetupTextures_Enemy(&bodyModel, 0); - - nw4r::g3d::ResAnmChr anmChrB = this->resFile.GetResAnmChr("move_cartain"); - ret = this->animationChrB.setup(mdlB, anmChrB, &this->allocator, 0); + this->bodyModel.setup(mdlB, &allocator, 0x224, 1, 0); + SetupTextures_Enemy(&this->bodyModel, 0); nw4r::g3d::ResAnmChr anmChrC = this->resFile.GetResAnmChr("shay_teresaA"); - ret = this->animationChrC.setup(mdlB, anmChrC, &this->allocator, 0); + ret = this->anmShayA.setup(mdlB, anmChrC, &this->allocator, 0); nw4r::g3d::ResAnmChr anmChrD = this->resFile.GetResAnmChr("wait"); - ret = this->animationChrD.setup(mdlB, anmChrD, &this->allocator, 0); + ret = this->anmWaitA.setup(mdlB, anmChrD, &this->allocator, 0); + + + nw4r::g3d::ResMdl mdlC = this->resFile.GetResMdl("teresaB"); + this->hideModel.setup(mdlC, &allocator, 0x224, 1, 0); + SetupTextures_Enemy(&this->bodyModel, 0); + + nw4r::g3d::ResAnmChr anmChrE = this->resFile.GetResAnmChr("shay_teresaB"); + ret = this->anmShayB.setup(mdlC, anmChrE, &this->allocator, 0); + + nw4r::g3d::ResAnmChr anmChrF = this->resFile.GetResAnmChr("shay_teresaB_wait"); + ret = this->anmWaitB.setup(mdlC, anmChrF, &this->allocator, 0); allocator.unlink(); } @@ -185,6 +194,7 @@ int daRamboo_c::onCreate() { this->rot.y = 0xE000; // Y is horizontal axis this->rot.z = 0; // Z is ... an axis >.> this->direction = 0; // Heading left. + this->Hiding = 0; this->speed.x = 0.0; this->ytimer = 0; @@ -194,7 +204,10 @@ int daRamboo_c::onCreate() { this->eventFlag = (u64)1 << (eventNum - 1); - bindAnimChr_and_setUpdateRates("fog", this->animationChrA, this->fogModel, 1.0); + nw4r::g3d::ResAnmChr anmChr = this->resFile.GetResAnmChr("fog"); + this->anmFog.bind(&this->fogModel, anmChr, 1); + this->fogModel.bindAnim(&this->anmFog, 0.0); + this->anmFog.setUpdateRate(1.0); OSReport("Setting the State"); doStateChange(&StateID_Grow); @@ -212,8 +225,10 @@ int daRamboo_c::onExecute() { acState.execute(); updateModelMatrices(); - if(this->animationChrA.isAnimationDone()) - this->animationChrA.setCurrentFrame(0.0); + this->fogModel._vf1C(); + + if(this->anmFog.isAnimationDone()) + this->anmFog.setCurrentFrame(0.0); if (this->aPhysics.result1 == 1) { char PlayerID = NearestPlayer(this); @@ -231,7 +246,11 @@ int daRamboo_c::onExecute() { int daRamboo_c::onDraw() { fogModel.scheduleForDrawing(); - bodyModel.scheduleForDrawing(); + + if (this->Hiding == 0) { + bodyModel.scheduleForDrawing(); } + else { + hideModel.scheduleForDrawing(); } return true; } @@ -247,9 +266,14 @@ void daRamboo_c::updateModelMatrices() { matrix.translation(pos.x + 160.0, pos.y - 80.0, pos.z + 200.0); matrix.applyRotationYXZ(&rot.x, &rot.y, &rot.z); - bodyModel.setDrawMatrix(matrix); - bodyModel.setScale(&scale); - bodyModel.calcWorld(false); + if (this->Hiding == 0) { + bodyModel.setDrawMatrix(matrix); + bodyModel.setScale(&scale); + bodyModel.calcWorld(false); } + else { + hideModel.setDrawMatrix(matrix); + hideModel.setScale(&scale); + hideModel.calcWorld(false); } } @@ -259,21 +283,17 @@ void daRamboo_c::beginState_Grow() { OSReport("Growing when Kameck Tells me to."); this->timer = 0; // PlaySound(this, SE_BOSS_ROY_MAGIC_MAKE_FAST); - bindAnimChr_and_setUpdateRates("wait", this->animationChrD, this->bodyModel, 1.0); } void daRamboo_c::executeState_Grow() { - if(this->animationChrD.isAnimationDone()) - this->animationChrD.setCurrentFrame(0.0); - 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)) { - PlaySound(this, SE_BOSS_IGGY_WANWAN_L_TO_M); scaleSpeed = 0.175; // yPosScaling = 0; @@ -311,13 +331,11 @@ void daRamboo_c::beginState_Advance() { this->speed.z = 0; this->timer = 0; - bindAnimChr_and_setUpdateRates("move_cartain", this->animationChrB, this->bodyModel, 1.0); } void daRamboo_c::executeState_Advance() { - if(this->animationChrB.isAnimationDone()) - this->animationChrB.setCurrentFrame(0.0); + this->bodyModel._vf1C(); this->pos.x -= this->timer / 32; this->pos.y = this->Baseline + sin(this->ytimer * 3.14 / 192) * 48; @@ -349,16 +367,36 @@ void daRamboo_c::beginState_Wait() { } void daRamboo_c::executeState_Wait() { + + if (this->timer == 55) { + nw4r::g3d::ResAnmChr anmChrB = this->resFile.GetResAnmChr("shay_teresaB"); + this->anmShayB.bind(&this->hideModel, anmChrB, 1); + this->hideModel.bindAnim(&this->anmShayB, 0.0); + this->anmShayB.setUpdateRate(1.0); + } + if (this->timer > 60) { PlaySound(this, SE_EMY_CS_TERESA_BEAT_YOU); doStateChange(&StateID_Advance); } + + + this->hideModel._vf1C(); this->timer += 1; } -void daRamboo_c::endState_Wait() { OSReport("No more bouncing."); } +void daRamboo_c::endState_Wait() { + + this->Hiding = 0; + + nw4r::g3d::ResAnmChr anmChr = this->resFile.GetResAnmChr("shay_teresaA"); + this->anmShayA.bind(&this->bodyModel, anmChr, 1); + this->bodyModel.bindAnim(&this->anmShayA, 0.0); + this->anmShayA.setUpdateRate(1.0); + + OSReport("No more bouncing."); } @@ -368,31 +406,55 @@ void daRamboo_c::endState_Wait() { OSReport("No more bouncing."); } void daRamboo_c::beginState_Flee() { - bindAnimChr_and_setUpdateRates("shay_teresaA", this->animationChrC, this->bodyModel, 1.0); +// bindAnimChr_and_setUpdateRates("shay_teresaA", this->animationChrC, this->bodyModel, 1.0); + + nw4r::g3d::ResAnmChr anmChr = this->resFile.GetResAnmChr("wait"); + this->anmWaitA.bind(&this->bodyModel, anmChr, 1); + this->bodyModel.bindAnim(&this->anmWaitA, 0.0); + this->anmWaitA.setUpdateRate(1.0); OSReport("Damnit that hurt."); this->timer = 0; + } void daRamboo_c::executeState_Flee() { - - if(this->animationChrC.isAnimationDone()) - this->animationChrC.setCurrentFrame(0.0); - + + if (timer == 10) { + this->Hiding = 1; + + nw4r::g3d::ResAnmChr anmChr = this->resFile.GetResAnmChr("shay_teresaB_wait"); + this->anmWaitB.bind(&this->hideModel, anmChr, 1); + this->hideModel.bindAnim(&this->anmWaitB, 0.0); + this->anmWaitB.setUpdateRate(1.0); + } + this->pos.x += (60 - this->timer) / 8; - if (this->timer > 60) { doStateChange(&StateID_Wait); } + if (timer < 10) { + this->bodyModel._vf1C(); } + else { + this->hideModel._vf1C(); } + + + if (this->timer > 60) { + doStateChange(&StateID_Wait); + } this->timer += 1; } -void daRamboo_c::endState_Flee() { OSReport("Ugh, so dizzy."); } +void daRamboo_c::endState_Flee() { + + OSReport("Ugh, so dizzy."); +} void daRamboo_c::beginState_Outro() { + this->removeMyActivePhysics(); this->timer = 0; this->rot.x = 0x0; // X is vertical axis this->rot.y = 0xE000; // Y is horizontal axis |