diff options
Diffstat (limited to 'src/bossTopman.cpp')
-rw-r--r-- | src/bossTopman.cpp | 182 |
1 files changed, 156 insertions, 26 deletions
diff --git a/src/bossTopman.cpp b/src/bossTopman.cpp index 67052f3..41aac4d 100644 --- a/src/bossTopman.cpp +++ b/src/bossTopman.cpp @@ -25,6 +25,14 @@ public: bool isBouncing; char isInSpace; char fromBehind; + char isInvulnerable; + int isInvulnerableCountdown; + int isTurningCountdown; + char charging; + int pOneHit; + int pTwoHit; + int pThreeHit; + int pFourHit; float dying; @@ -49,6 +57,7 @@ public: void collisionCat13_Hammer(ActivePhysics *apThis, ActivePhysics *apOther); void collisionCatA_PenguinMario(ActivePhysics *apThis, ActivePhysics *apOther); + void addScoreWhenHit(void *other); USING_STATES(daDreidel); DECLARE_STATE(Walk); @@ -118,13 +127,17 @@ daDreidel *daDreidel::build() { // if (actor->damage > 2) { actor->doStateChange(&daDreidel::StateID_Outro); } // } // } + void daDreidel::addScoreWhenHit(void *other) { }; void daDreidel::spriteCollision(ActivePhysics *apThis, ActivePhysics *apOther) { if (apOther->owner->name == 390) { //time to get hurt + if (this->isInvulnerable) { + return; + } this->damage += 1; doStateChange(&StateID_Damage); - if (this->damage > 2) { doStateChange(&StateID_Outro); } + if (this->damage > 3) { doStateChange(&StateID_Outro); } } else { dEn_c::spriteCollision(apThis, apOther); } } @@ -136,27 +149,57 @@ daDreidel *daDreidel::build() { if(hitType == 1) { // regular jump this->_vf220(apOther->owner); + this->counter_504[apOther->owner->which_player] = 0; } else if(hitType == 3) { // spinning jump or whatever? this->_vf220(apOther->owner); + this->counter_504[apOther->owner->which_player] = 0; } else if(hitType == 0) { - EN_LandbarrelPlayerCollision(this, apThis, apOther); - if (this->pos.x > apOther->owner->pos.x) { - this->direction = 1; + + if (this->charging == 1) { + + char MarioPos; + + if (this->pos.x < apOther->owner->pos.x) { MarioPos = 0; } // Mario is to the right + else { MarioPos = 1; } // Mario is to the left + + + if (this->direction != MarioPos) { // Mario is stnading behind the boss + EN_LandbarrelPlayerCollision(this, apThis, apOther); + if (MarioPos == 1) { this->direction = 1; } + else { this->direction = 0; } + + doStateChange(&StateID_KnockBack); + } + + else { // Mario is standing in front of the boss + this->_vf220(apOther->owner); + EN_LandbarrelPlayerCollision(this, apThis, apOther); + } + } + + else if (this->isInvulnerable == 0) { + + if (this->pos.x > apOther->owner->pos.x) { + this->direction = 1; + } + else { + this->direction = 0; + } + + this->counter_504[apOther->owner->which_player] = 0; + EN_LandbarrelPlayerCollision(this, apThis, apOther); + doStateChange(&StateID_KnockBack); } else { - this->direction = 0; + this->counter_504[apOther->owner->which_player] = 0; + EN_LandbarrelPlayerCollision(this, apThis, apOther); } - doStateChange(&StateID_KnockBack); } - // fix multiple player collisions via megazig this->isDead = 0; this->flags_4FC |= (1<<(31-7)); - if(apOther->owner->which_player < 4) { - this->counter_504[apOther->owner->which_player] = 0; - } } void daDreidel::yoshiCollision(ActivePhysics *apThis, ActivePhysics *apOther) { @@ -167,8 +210,17 @@ daDreidel *daDreidel::build() { void daDreidel::collisionCat7_WMWaggleWater(ActivePhysics *apThis, ActivePhysics *apOther) { DamagePlayer(this, apThis, apOther); } void daDreidel::collisionCat7_WMWaggleWaterYoshi(ActivePhysics *apThis, ActivePhysics *apOther) { DamagePlayer(this, apThis, apOther); } - void daDreidel::collisionCat9_RollingObject(ActivePhysics *apThis, ActivePhysics *apOther) { doStateChange(&StateID_KnockBack); } - void daDreidel::collisionCatA_PenguinMario(ActivePhysics *apThis, ActivePhysics *apOther){ doStateChange(&StateID_KnockBack); } + void daDreidel::collisionCat9_RollingObject(ActivePhysics *apThis, ActivePhysics *apOther) { + if (this->isInvulnerable == 0) { + doStateChange(&StateID_KnockBack); + } + } + void daDreidel::collisionCatA_PenguinMario(ActivePhysics *apThis, ActivePhysics *apOther){ + if (this->isInvulnerable == 0) { + doStateChange(&StateID_KnockBack); + } + } + void daDreidel::collisionCat3_StarPower(ActivePhysics *apThis, ActivePhysics *apOther){ } void daDreidel::collisionCat13_Hammer(ActivePhysics *apThis, ActivePhysics *apOther) { } @@ -399,6 +451,7 @@ void daDreidel::updateModelMatrices() { } } void daDreidel::endState_Grow() { + this->chrAnimation.setUpdateRate(1.0); CleanupKameck(this, Kameck); } @@ -413,9 +466,18 @@ void daDreidel::updateModelMatrices() { this->max_speed.y = (this->isInSpace) ? -2.0 : -4.0; this->speed.y = (this->isInSpace) ? -2.0 : -4.0; this->y_speed_inc = (this->isInSpace) ? -0.09375 : -0.1875; + + this->isTurningCountdown = 0; } void daDreidel::executeState_Walk() { + if (this->isInvulnerableCountdown > 0) { + this->isInvulnerableCountdown--; + } + else { + this->isInvulnerable = 0; + } + PlaySound(this, SE_BOSS_JR_CROWN_JR_RIDE); // 5 bool ret = calculateTileCollisions(); @@ -423,6 +485,13 @@ void daDreidel::updateModelMatrices() { doStateChange(&StateID_Turn); } + u8 dir = dSprite_c__getXDirectionOfFurthestPlayerRelativeToVEC3(this, this->pos); + if (dir != this->direction) { + this->isTurningCountdown++; + } + + if (this->isTurningCountdown > 90) { doStateChange(&StateID_Turn); } + if(this->chrAnimation.isAnimationDone()) { this->chrAnimation.setCurrentFrame(0.0); } @@ -447,20 +516,21 @@ void daDreidel::updateModelMatrices() { int done = SmoothRotation(&this->rot.y, amt, 0x800); if(done) { - this->doStateChange(&StateID_Walk); + if (this->damage > 1) { doStateChange(&StateID_ChargePrep); } + else { doStateChange(&StateID_Walk); } } } - void daDreidel::endState_Turn() { } + void daDreidel::endState_Turn() { this->rot.y = (this->direction) ? 0xD800 : 0x2800; } /////////////// // Knockback State /////////////// void daDreidel::beginState_KnockBack() { - bindAnimChr_and_setUpdateRate("begoman_damage", 1, 0.0, 0.75); + bindAnimChr_and_setUpdateRate("begoman_damage", 1, 0.0, 0.65); - this->max_speed.x = (this->direction) ? this->XSpeed*5.0 : -this->XSpeed*5.0; - this->speed.x = (this->direction) ? 4.0f : -4.0f; + this->max_speed.x = (this->direction) ? 5.5f : -5.5f; + this->speed.x = (this->direction) ? 5.5f : -5.5f; } void daDreidel::executeState_KnockBack() { @@ -469,7 +539,8 @@ void daDreidel::updateModelMatrices() { bodyModel._vf1C(); if(this->chrAnimation.isAnimationDone()) { - doStateChange(&StateID_Damage); + if (this->damage > 1) { doStateChange(&StateID_ChargePrep); } + else { doStateChange(&StateID_Walk); } } } @@ -509,30 +580,62 @@ void daDreidel::updateModelMatrices() { void daDreidel::beginState_Charge() { bindAnimChr_and_setUpdateRate("begoman_attack3", 1, 0.0, 1.0); this->timer = 0; + this->isTurningCountdown = 0; + + this->max_speed.x = (this->direction) ? -this->XSpeed : this->XSpeed; + this->speed.x = (direction) ? -2.2f : 2.2f; + + this->max_speed.y = (this->isInSpace) ? -2.0 : -4.0; + this->speed.y = (this->isInSpace) ? -2.0 : -4.0; + this->y_speed_inc = (this->isInSpace) ? -0.09375 : -0.1875; + + this->charging = 1; } void daDreidel::executeState_Charge() { + + if (this->isInvulnerableCountdown > 0) { + this->isInvulnerableCountdown--; + } + else { + this->isInvulnerable = 0; + } + if(this->chrAnimation.isAnimationDone()) { this->chrAnimation.setCurrentFrame(0.0); } - this->timer += 1; - if (this->timer == 120) { - doStateChange(&StateID_ChargePrep); + bool ret = calculateTileCollisions(); + if (ret) { + doStateChange(&StateID_ChargeRecover); + } + + u8 dir = dSprite_c__getXDirectionOfFurthestPlayerRelativeToVEC3(this, this->pos); + if (dir != this->direction) { + this->isTurningCountdown++; + this->speed.x = this->speed.x / 1.04; } + if (this->isTurningCountdown > 90) { doStateChange(&StateID_Turn); } + } + void daDreidel::endState_Charge() { + this->charging = 0; + + this->counter_504[0] = 0; + this->counter_504[1] = 0; + this->counter_504[2] = 0; + this->counter_504[3] = 0; } - void daDreidel::endState_Charge() { } /////////////// // ChargeRecover State /////////////// void daDreidel::beginState_ChargeRecover() { - bindAnimChr_and_setUpdateRate("begoman_stand", 1, 0.0, 1.0); + bindAnimChr_and_setUpdateRate("begoman_stand", 1, 0.0, 0.5); } void daDreidel::executeState_ChargeRecover() { if(this->chrAnimation.isAnimationDone()) { - doStateChange(&StateID_ChargePrep); + doStateChange(&StateID_Turn); } } void daDreidel::endState_ChargeRecover() { } @@ -542,19 +645,46 @@ void daDreidel::updateModelMatrices() { // Damage State /////////////// void daDreidel::beginState_Damage() { + this->isInvulnerable = 1; bindAnimChr_and_setUpdateRate("begoman_wait", 1, 0.0, 1.0); this->timer = 0; + + PlaySound(this, SE_PLY_TOUCH_BIRI); + PlaySound(this, SE_BOSS_JR_ELEC_SPARK); + PlaySound(this, SE_EMY_BIRIKYU_SPARK); + + Vec front = {this->pos.x-4.0, this->pos.y+8.0, 5500.0}; + Vec back = {this->pos.x-4.0, this->pos.y+8.0, -5500.0}; + + SpawnEffect("Wm_ob_cmnspark", 0, &front, 0, &(Vec){2.5, 2.5, 1.5}); + SpawnEffect("Wm_mr_wirehit_line", 0, &front, 0, &(Vec){1.5, 1.5, 1.5}); + SpawnEffect("Wm_mr_kick_grain", 0, &front, 0, &(Vec){1.5, 1.5, 1.5}); + SpawnEffect("Wm_mr_wirehit_glow", 0, &back, 0, &(Vec){2.5, 2.5, 2.5}); } void daDreidel::executeState_Damage() { + if(this->chrAnimation.isAnimationDone()) { this->timer += 1; if (this->timer == 3) { - doStateChange(&StateID_ChargePrep); + + u8 dir = dSprite_c__getXDirectionOfFurthestPlayerRelativeToVEC3(this, this->pos); + if (dir != this->direction) { + doStateChange(&StateID_Turn); + } + else { + if (this->damage > 1) { doStateChange(&StateID_ChargePrep); } + else { doStateChange(&StateID_Walk); } + } + } + else { } this->chrAnimation.setCurrentFrame(0.0); } } - void daDreidel::endState_Damage() { } + void daDreidel::endState_Damage() { + bindAnimChr_and_setUpdateRate("begoman_wait2", 1, 0.0, 1.0); + this->isInvulnerableCountdown = 90; + } /////////////// |