diff options
Diffstat (limited to 'src/bossPodouble.cpp')
-rw-r--r-- | src/bossPodouble.cpp | 57 |
1 files changed, 34 insertions, 23 deletions
diff --git a/src/bossPodouble.cpp b/src/bossPodouble.cpp index dd47463..260ca9d 100644 --- a/src/bossPodouble.cpp +++ b/src/bossPodouble.cpp @@ -19,6 +19,8 @@ class daPodouble : public daBoss { int onExecute(); int onDraw(); + void updateHitboxSize(); + mHeapAllocator_c allocator; nw4r::g3d::ResFile resFile; @@ -26,6 +28,7 @@ class daPodouble : public daBoss { m3d::mdl_c fogModel; m3d::mdl_c fog2Model; + m3d::anmChr_c fleeAnimation; m3d::anmTexSrt_c body; m3d::anmChr_c fogChr; @@ -118,12 +121,6 @@ daPodouble *daPodouble::build() { bool daPodouble::collisionCat13_Hammer(ActivePhysics *apThis, ActivePhysics *apOther) { apOther->owner->kill(); - if (this->isInvulnerable) { return true; } - - this->damage += 2; - - if (this->damage < 12) { doStateChange(&StateID_Damage); } - else { doStateChange(&StateID_Outro); } return true; } @@ -132,7 +129,7 @@ daPodouble *daPodouble::build() { if (this->isInvulnerable) { return true; } if (this->isFire == 0) { - this->damage += 3; + this->damage += 4; if (this->damage < 12) { doStateChange(&StateID_Damage); } else { doStateChange(&StateID_Outro); } @@ -158,7 +155,7 @@ daPodouble *daPodouble::build() { if (this->isFire == 1) { if (apOther->owner->name == 104) { this->damage += 2; } - else { this->damage += 3; } + else { this->damage += 4; } if (this->damage < 12) { doStateChange(&StateID_Damage); } else { doStateChange(&StateID_Outro); } @@ -169,6 +166,12 @@ daPodouble *daPodouble::build() { } +void daPodouble::updateHitboxSize() { + aPhysics.info.xDistToEdge = 11.429f * scale.x; + aPhysics.info.yDistToEdge = 11.429f * scale.y; +} + + int daPodouble::onCreate() { this->isFire = this->settings >> 28; @@ -187,7 +190,9 @@ int daPodouble::onCreate() { // Body and anms nw4r::g3d::ResMdl mdl = this->resFile.GetResMdl("bubble"); + nw4r::g3d::ResAnmChr shit = resFile.GetResAnmChr(isFire ? "RedFlee" : "BlueFlee"); bodyModel.setup(mdl, &allocator, 0x224, 1, 0); + fleeAnimation.setup(mdl, shit, &allocator, 0); nw4r::g3d::ResAnmTexSrt anmRes = this->resFile.GetResAnmTexSrt("bubble"); this->body.setup(mdl, anmRes, &this->allocator, 0, 1); @@ -325,7 +330,10 @@ int daPodouble::onDraw() { bodyModel.calcWorld(false); bodyModel.scheduleForDrawing(); + bodyModel._vf1C(); this->body.process(); + if (acState.getCurrentState() == &StateID_SyncDie) + fleeAnimation.process(); return true; } @@ -538,6 +546,14 @@ int daPodouble::onDraw() { this->rot.y = amt; this->rot.y += (direction) ? 0xD800 : 0x2800; + float targetScale = 3.5f - (damage * 0.175f); + if (scale.x > targetScale) { + float newScale = scale.x - 0.006f; + if (newScale < targetScale) + newScale = targetScale; + scale.x = scale.y = scale.z = newScale; + updateHitboxSize(); + } if (this->timer > 180) { doStateChange(&StateID_Bounce); @@ -571,8 +587,8 @@ int daPodouble::onDraw() { daPodouble *other = (daPodouble*)FindActorByType(SHIP_WINDOW, 0); if (other->id == this->id) { other = (daPodouble*)FindActorByType(SHIP_WINDOW, (Actor*)this); - other->doStateChange(&StateID_SyncDie); } + other->doStateChange(&StateID_SyncDie); OutroSetup(this); this->timer = 0; @@ -612,21 +628,16 @@ int daPodouble::onDraw() { this->removeMyActivePhysics(); this->timer = 0; - } - void daPodouble::executeState_SyncDie() { - if (this->dying == 1) { return; } - - bool ret; - ret = ShrinkBoss(this, &this->pos, 3.5, this->timer); - - if (ret == true) { - BossExplode(this, &this->pos); - this->dying = 1; - this->timer = 0; - } - else { PlaySound(this, SE_EMY_BUBBLE_EXTINCT); } - this->timer += 1; + nw4r::g3d::ResAnmChr anmChr = resFile.GetResAnmChr(isFire ? "RedFlee" : "BlueFlee"); + fleeAnimation.bind(&bodyModel, anmChr, 1); + bodyModel.bindAnim(&fleeAnimation, 0.0); + fleeAnimation.setUpdateRate(0.5f); + PlaySound(this, SE_EMY_GABON_ROCK_THROW); + } + void daPodouble::executeState_SyncDie() { + if (fleeAnimation.isAnimationDone()) + Delete(0); } void daPodouble::endState_SyncDie() { } |