diff options
Diffstat (limited to '')
-rw-r--r-- | src/bossFuzzyBear.cpp | 259 |
1 files changed, 178 insertions, 81 deletions
diff --git a/src/bossFuzzyBear.cpp b/src/bossFuzzyBear.cpp index 6b0fab0..65e6ab6 100644 --- a/src/bossFuzzyBear.cpp +++ b/src/bossFuzzyBear.cpp @@ -1,6 +1,7 @@ #include <common.h> #include <game.h> #include <g3dhax.h> +#include <sfx.h> class daFuzzyBear_c : public dEn_c { int onCreate(); @@ -25,7 +26,8 @@ class daFuzzyBear_c : public dEn_c { Vec RolyPos; char falldown; char damage; - char fireballs; + char roly; + char isInvulnerable; void dieBigFall_Execute(); static daFuzzyBear_c *build(); @@ -46,6 +48,7 @@ class daFuzzyBear_c : public dEn_c { DECLARE_STATE(Needles); DECLARE_STATE(Spray); DECLARE_STATE(RolyPoly); + DECLARE_STATE(Wait); }; daFuzzyBear_c *daFuzzyBear_c::build() { @@ -57,6 +60,9 @@ daFuzzyBear_c *daFuzzyBear_c::build() { extern "C" void *HandleXSpeed(daFuzzyBear_c *); extern "C" void *HandleYSpeed(daFuzzyBear_c *); extern "C" void *UpdateObjectPosBasedOnSpeedValues_real(daFuzzyBear_c *); +extern "C" void *doSpriteMovement(dEn_c *); +extern "C" void *PlaySound(daFuzzyBear_c *, int soundID); + 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(daFuzzyBear_c *, Vec pos); @@ -71,6 +77,7 @@ CREATE_STATE(daFuzzyBear_c, Bounce); CREATE_STATE(daFuzzyBear_c, Needles); CREATE_STATE(daFuzzyBear_c, Spray); CREATE_STATE(daFuzzyBear_c, RolyPoly); +CREATE_STATE(daFuzzyBear_c, Wait); #define ACTIVATE 1 @@ -78,27 +85,65 @@ CREATE_STATE(daFuzzyBear_c, RolyPoly); void daFuzzyBear_c::playerCollision(ActivePhysics *apThis, ActivePhysics *apOther) { + this->_vf220(apOther->owner); OSReport("I hit Mario."); } void daFuzzyBear_c::collisionCat1_Fireball_E_Explosion(ActivePhysics *apThis, ActivePhysics *apOther) { + + if (this->isInvulnerable == 1) { return; } + OSReport("Hit Fireball"); this->timer = 0; - this->fireballs = this->fireballs + 1; - if (this->fireballs > 4) { this->damage = this->damage + 1; } - if (this->damage > 2) { doStateChange(&StateID_DieBigFall); } + PlaySound(this, SE_BOSS_KOOPA_FIRE_DISAPP); + this->damage++; + if (this->damage > 14) { doStateChange(&StateID_DieBigFall); } } bool daFuzzyBear_c::collisionCat2_IceBall_15_YoshiIce(ActivePhysics *apThis, ActivePhysics *apOther) { OSReport("Hit Iceball"); return false; } void daFuzzyBear_c::collisionCat9_RollingObject(ActivePhysics *apThis, ActivePhysics *apOther) { OSReport("Hit Rolling Object"); + + if (this->isInvulnerable == 1) { return; } + + this->timer = 0; - this->damage = this->damage + 1; - if (this->damage > 2) { doStateChange(&StateID_DieBigFall); } } + this->damage = this->damage + 5; + + dActor_c *block = apOther->owner; + dEn_c *blah = (dEn_c*)block; + + this->pos.x += blah->speed.x; + + blah->speed.x = -blah->speed.x; + blah->pos.x += blah->speed.x; + + if (blah->direction == 0) { blah->direction = 1; this->roly = 0; } + else { blah->direction = 0; this->roly = 1; } + + if (blah->speed.y < 0) { + blah->speed.y = -blah->speed.y; } + + doSpriteMovement(blah); + doSpriteMovement(blah); + + PlaySound(this, SE_EMY_BLOW_PAKKUN_DOWN); + + + if (this->damage > 14) { doStateChange(&StateID_DieBigFall); } + else { doStateChange(&StateID_RolyPoly); } +} void daFuzzyBear_c::collisionCat13_Hammer(ActivePhysics *apThis, ActivePhysics *apOther) { + + if (this->isInvulnerable == 1) { return; } + + PlaySound(this, SE_EMY_BIG_PAKKUN_DAMAGE_1); OSReport("Hit Hammer"); this->timer = 0; - this->damage = this->damage + 1; - if (this->damage > 2) { doStateChange(&StateID_DieBigFall); } } + this->damage += 3; + + if (this->damage > 14) { doStateChange(&StateID_DieBigFall); } + else { doStateChange(&StateID_RolyPoly); } +} void daFuzzyBear_c::collisionCat14_YoshiFire(ActivePhysics *apThis, ActivePhysics *apOther) { OSReport("Hit Yoshi Fire"); } @@ -139,18 +184,16 @@ int daFuzzyBear_c::onCreate() { HitMeBaby.yDistToCenter = 0.0; if (BigBossFuzzyBear == 0) { + HitMeBaby.xDistToEdge = 32.0; + HitMeBaby.yDistToEdge = 32.0; } + else { HitMeBaby.xDistToEdge = 38.0; HitMeBaby.yDistToEdge = 38.0; } - else { - HitMeBaby.xDistToEdge = 50.0; - HitMeBaby.yDistToEdge = 50.0; } - HitMeBaby.category1 = 0x7; + HitMeBaby.category1 = 0x3; HitMeBaby.category2 = 0x0; - HitMeBaby.bitfield1 = 0x0; - HitMeBaby.bitfield2 = 0x0; -// HitMeBaby.bitfield1 = 0x4F; -// HitMeBaby.bitfield2 = 0x828E; + HitMeBaby.bitfield1 = 0x4F; + HitMeBaby.bitfield2 = 0x8828E; HitMeBaby.unkShort1C = 0; HitMeBaby.callback = &dEn_c::collisionCallback; @@ -177,8 +220,9 @@ int daFuzzyBear_c::onCreate() { this->initialPos = this->pos; this->storeSpeed = 0; this->falldown = 0; - this->fireballs = 0; + this->roly = 0; this->damage = 0; + this->isInvulnerable = 0; OSReport("Setting Fuzzy Bear's State"); doStateChange(&StateID_Grow); @@ -279,6 +323,7 @@ void daFuzzyBear_c::updateModelMatrices() { void daFuzzyBear_c::beginState_Grow() { OSReport("Growing when Kameck Tells me to."); this->timer = 0; +// PlaySound(this, SE_BOSS_ROY_MAGIC_MAKE_FAST); } void daFuzzyBear_c::executeState_Grow() { @@ -288,12 +333,12 @@ void daFuzzyBear_c::executeState_Grow() { float scaleSpeed, yPosScaling; if ((this->timer > 60) && (this->timer < 140)) { - if (BigBossFuzzyBear == 0) { + if (BigBossFuzzyBear == 1) { scaleSpeed = 0.025; yPosScaling = 25; } else { - scaleSpeed = 0.0375; - yPosScaling = 33; } + scaleSpeed = 0.01875; + yPosScaling = 18; } float modifier; @@ -301,6 +346,7 @@ void daFuzzyBear_c::executeState_Grow() { this->scale = (Vec){modifier, modifier, modifier}; this->pos.y = this->pos.y + (yPosScaling/80); + } if (this->timer > 170) { doStateChange(&StateID_Bounce); } @@ -320,8 +366,8 @@ void daFuzzyBear_c::endState_Grow() { void daFuzzyBear_c::beginState_Bounce() { OSReport("Begin Bouncing"); - if (this->direction = 0) { this->speed.x = ((this->settings >> 16) && 0xF) * 0.5; } - else { this->speed.x = ((this->settings >> 16) && 0xF) * -0.5; } + if (this->direction = 0) { this->speed.x = 1.5; } + else { this->speed.x = -1.5 ; } if (this->storeSpeed != 0) { this->speed.x = this->storeSpeed; } @@ -332,17 +378,17 @@ void daFuzzyBear_c::executeState_Bounce() { float wallDistance, scaleDown, scaleUp, scaleBase; if (BigBossFuzzyBear == 0) { + wallDistance = 32.0; + scaleDown = 12.0; + scaleUp = 10.0; + scaleBase = 2.5; + } + else { wallDistance = 38.0; - scaleDown = 3.0; + scaleDown = 16.0; scaleUp = 12.0; scaleBase = 3.0; } - else { - wallDistance = 50.0; - scaleDown = 4.0; - scaleUp = 16.0; - scaleBase = 4.0; - } if (this->falldown == 1) { this->speed.x = 0; this->timer = 0; } @@ -350,12 +396,12 @@ void daFuzzyBear_c::executeState_Bounce() { // Check for walls - if (this->pos.x <= this->initialPos.x - ((AreaWidthLeft * 24.0) + wallDistance)) { // Hit left wall, head right. + if (this->pos.x <= this->initialPos.x - ((15 * 24.0) + wallDistance)) { // Hit left wall, head right. this->speed.x = -this->speed.x; this->direction = 1; this->pos.x = this->pos.x + 1.0; } - if (this->pos.x >= this->initialPos.x + ((AreaWidthRight * 24.0) - wallDistance)) { // Hit right wall, head left. + if (this->pos.x >= this->initialPos.x + ((5 * 24.0) - wallDistance)) { // Hit right wall, head left. this->speed.x = -this->speed.x; this->direction = 0; this->pos.x = this->pos.x - 1.0; } @@ -389,29 +435,19 @@ void daFuzzyBear_c::executeState_Bounce() { this->scale.y = modifier; this->pos.y = this->pos.y + (scaleUp/10.0); if (this->pos.y > this->Baseline) { this->pos.y = this->Baseline - 1.0; } + PlaySound(this, SE_PLY_JUMPDAI); } if (this->timer >= 20) { int randChoice; - if (BigBossFuzzyBear == 1) { - randChoice = GenerateRandomNumber(5); - - if (randChoice == 0) { doStateChange(&StateID_Spray); } - else if (randChoice == 1) { doStateChange(&StateID_Needles); } - else if (randChoice == 2) { doStateChange(&StateID_RolyPoly); } - - } - else { - randChoice = GenerateRandomNumber(2); - if (randChoice == 0) { doStateChange(&StateID_RolyPoly); } - } - randChoice = GenerateRandomNumber(5); - - if (randChoice == 0) { this->speed.y = LaunchSpeedHigh; } - else { this->speed.y = LaunchSpeedShort; } + if (randChoice == 0) { doStateChange(&StateID_Wait); } + + randChoice = GenerateRandomNumber(4); + if (randChoice == 0) { this->speed.y = 8.0; } + else { this->speed.y = 6.0; } this->timer = 0; this->pos.y = this->Baseline + 1; @@ -452,49 +488,49 @@ void daFuzzyBear_c::executeState_Needles() { this->speed.x = 0; if (BigBossFuzzyBear == 0) { - origScale = 3.0; + origScale = 2.5; } else { - origScale = 4.0; + origScale = 3.0; } this->timer = this->timer + 1; OSReport("Needle Timer: %d", this->timer); - if (this->timer < 120) { + if (this->timer <= 120) { this->scale.y = (sin(this->timer * 3.14 / 5.0) / 2.0) + origScale; // 3 shakes per second, exactly 24 shakes overall this->scale.x = (sin(this->timer * 3.14 / 5.0) / 2.0) + origScale; // 3 shakes per second, exactly 24 shakes overall if (this->timer == 30) { - dStageActor_c *spawner = CreateActor(511, 0, this->pos, 0, 0); + dStageActor_c *spawner = CreateActor(339, 0, this->pos, 0, 0); spawner->speed.x = -6.0; spawner->speed.y = 0.0; spawner->scale = (Vec){1.0, 1.0, 1.0}; } if (this->timer == 45) { - dStageActor_c *spawner = CreateActor(511, 0, this->pos, 0, 0); + dStageActor_c *spawner = CreateActor(339, 0, this->pos, 0, 0); spawner->speed.x = 6.0; spawner->speed.y = 6.0; spawner->scale = (Vec){1.0, 1.0, 1.0}; } if (this->timer == 60) { - dStageActor_c *spawner = CreateActor(511, 0, this->pos, 0, 0); + dStageActor_c *spawner = CreateActor(339, 0, this->pos, 0, 0); spawner->speed.x = 0.0; spawner->speed.y = 6.0; spawner->scale = (Vec){1.0, 1.0, 1.0}; } if (this->timer == 75) { - dStageActor_c *spawner = CreateActor(511, 0, this->pos, 0, 0); + dStageActor_c *spawner = CreateActor(339, 0, this->pos, 0, 0); spawner->speed.x = -6.0; spawner->speed.y = 6.0; spawner->scale = (Vec){1.0, 1.0, 1.0}; } if (this->timer == 90) { - dStageActor_c *spawner = CreateActor(511, 0, this->pos, 0, 0); + dStageActor_c *spawner = CreateActor(339, 0, this->pos, 0, 0); spawner->speed.x = -6.0; spawner->speed.y = 0.0; spawner->scale = (Vec){1.0, 1.0, 1.0}; @@ -532,18 +568,20 @@ void daFuzzyBear_c::executeState_Spray() { this->rot.y = sin(this->timer * 3.14 / 5) * 4000; // 3 shakes per second, exactly 24 shakes overall int randChoice; - randChoice = GenerateRandomNumber(20); // 1.3 Fuzzies per second, 6 fuzzies overall + randChoice = GenerateRandomNumber(18); // 1.3 Fuzzies per second, 6 fuzzies overall if (randChoice == 0) { int randChoiceX, randChoiceY; - randChoiceX = GenerateRandomNumber(24); - randChoiceY = GenerateRandomNumber(16); + randChoiceX = GenerateRandomNumber(92); + randChoiceY = GenerateRandomNumber(48); + + float xa, ya; + xa = randChoiceX - 48.0; + ya = randChoiceY - 24.0; - dStageActor_c *spawner = CreateActor(144, 0, this->pos, 0, 0); - spawner->speed.x = randChoiceX - 12.0; - spawner->speed.y = randChoiceY * 1.0; - spawner->scale = (Vec){1.0, 1.0, 1.0}; - } } + CreateActor(144, 0, (Vec){this->pos.x + xa, this->pos.y + ya, this->pos.z}, 0, 0); + } + } else { doStateChange(&StateID_Bounce); } @@ -571,16 +609,39 @@ void daFuzzyBear_c::endState_Spray() { // Roly Poly State - Rolls from left to right, bounces off both walls, and returns to original position. void daFuzzyBear_c::beginState_RolyPoly() { - this->speed.x = this->storeSpeed; + + this->isInvulnerable = 1; + + if (this->roly == 0) { this->speed.x = 12.0; } + else { this->speed.x = -12.0; } + this->speed.y = 0; this->RolyBounces = 0; this->RolyPos = this->pos; OSReport("Fuzzy Roly State Begin"); + + if (BigBossFuzzyBear == 0) { + this->scale = (Vec){2.5, 2.5, 2.5}; + } + else { + this->scale = (Vec){3.0, 3.0, 3.0}; + } + } void daFuzzyBear_c::executeState_RolyPoly() { OSReport("Fuzzy Roly State Execute"); float wallDistance, scaleDown, scaleUp; + PlaySound(this, SE_OBJ_TEKKYU_G_ROLL); + + if (this->pos.y > this->Baseline) { this->pos.y -= 2.0; } + else { this->pos.y = this->Baseline - 1.0; } + + if (this->direction == 0) { // is even + this->pos.x = this->pos.x - 4.0; } + else { // is odd + this->pos.x = this->pos.x + 4.0; } + if (BigBossFuzzyBear == 0) { wallDistance = 38.0; } @@ -588,16 +649,16 @@ void daFuzzyBear_c::executeState_RolyPoly() { wallDistance = 50.0; } - this->speed.y = 0; + - if (this->pos.x <= this->initialPos.x - ((AreaWidthLeft * 24.0) + wallDistance)) { // Hit left wall, head right. + if (this->pos.x <= this->initialPos.x - ((15 * 24.0) + wallDistance)) { // Hit left wall, head right. this->speed.x = -this->speed.x; this->direction = 1; this->pos.x = this->pos.x + 1.0; this->RolyBounces = this->RolyBounces + 1; } - if (this->pos.x >= this->initialPos.x + ((AreaWidthRight * 24.0) - wallDistance)) { // Hit right wall, head left. + if (this->pos.x >= this->initialPos.x + ((5 * 24.0) - wallDistance)) { // Hit right wall, head left. this->speed.x = -this->speed.x; this->direction = 0; this->pos.x = this->pos.x - 1.0; @@ -605,24 +666,60 @@ void daFuzzyBear_c::executeState_RolyPoly() { } - if (this->direction == 1) { this->rot.z = this->rot.z + 0x1000; } - else { this->rot.z = this->rot.z - 0x1000; } + if (this->direction == 1) { this->rot.z = this->rot.z - 0x400; } + else { this->rot.z = this->rot.z + 0x400; } if (this->RolyBounces == 2) { - if (this->direction == 1) { - if (this->pos.x > this->RolyPos.x) { - this->speed.x = 0; - if (this->rot.z == 0) { doStateChange(&StateID_Bounce); } } } - else { - if (this->pos.x < this->RolyPos.x) { - this->speed.x = 0; - if (this->rot.z == 0) { doStateChange(&StateID_Bounce); } } } + if ((this->pos.x > this->RolyPos.x -20.0) && (this->pos.x < this->RolyPos.x + 20.0)) { + this->speed.x = 0; + if (this->rot.z == 0) { doStateChange(&StateID_Bounce); } } } - HandleXSpeed(this); - HandleYSpeed(this); - UpdateObjectPosBasedOnSpeedValues_real(this); + +// HandleXSpeed(this); +// HandleYSpeed(this); + +// doSpriteMovement(this); +// UpdateObjectPosBasedOnSpeedValues_real(this); } -void daFuzzyBear_c::endState_RolyPoly() { this->rot.z = 0; OSReport("Fuzzy Roly State End"); } +void daFuzzyBear_c::endState_RolyPoly() { + this->rot.z = 0; + OSReport("Fuzzy Roly State End"); + this->isInvulnerable = 0; +} + + + + + + + +void daFuzzyBear_c::beginState_Wait() { this->timer = 0;} +void daFuzzyBear_c::executeState_Wait() { + + this->timer = this->timer + 1; + + if (this->timer > 60) { + int randChoice; + + if (BigBossFuzzyBear == 1) { + + randChoice = GenerateRandomNumber(3); + + if (randChoice == 0) { doStateChange(&StateID_Spray); } +// else if (randChoice == 1) { doStateChange(&StateID_Needles); } + else { doStateChange(&StateID_RolyPoly); } + + } + else { + doStateChange(&StateID_Bounce); + } + } +} +void daFuzzyBear_c::endState_Wait() { } + + + + |