diff options
-rw-r--r-- | src/bossCaptainBowser.cpp | 68 |
1 files changed, 48 insertions, 20 deletions
diff --git a/src/bossCaptainBowser.cpp b/src/bossCaptainBowser.cpp index 4867afb..de3e017 100644 --- a/src/bossCaptainBowser.cpp +++ b/src/bossCaptainBowser.cpp @@ -56,7 +56,8 @@ public: m3d::anmChr_c chrAnimation; m3d::anmChr_c shipAnm; - Physics ShipPhysics; + static const int SHIP_COLL_COUNT = 7; + ActivePhysics shipCollisions[SHIP_COLL_COUNT]; ActivePhysics Roar; mEf::es2 effect; @@ -145,20 +146,23 @@ daCaptainBowser *daCaptainBowser::build() { } } - void ShipPhysicsCallback(daCaptainBowser *self, dEn_c *other) { - if (other->name == 657) { + void ShipAPhysicsCallback(ActivePhysics *apThis, ActivePhysics *apOther) { + daCaptainBowser *self = (daCaptainBowser*)apThis->owner; + if (apOther->owner->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); + SpawnEffect("Wm_en_burst_m", 0, &apOther->owner->pos, &(S16Vec){0,0,0}, &(Vec){1.0, 1.0, 1.0}); + PlaySound(apOther->owner, SE_OBJ_TARU_BREAK); + apOther->owner->Delete(1); if (self->damage == self->maxDamage/2) { self->doStateChange(&daCaptainBowser::StateID_Roar); } else if (self->damage < 0) { self->doStateChange(&daCaptainBowser::StateID_Outro); } + + apThis->someFlagByte |= 2; } } @@ -216,19 +220,43 @@ int daCaptainBowser::onCreate() { this->damage = this->maxDamage; - // Ship Physics! - // Normal rects are { left, top, right, bottom } - // Callbacks are Touching upwards, Touching Downwards, and unknown - - ShipPhysics.baseSetup(this, (void*)&ShipPhysicsCallback, 0, 0, 1, 0); - - ShipPhysics.x = 8.0; - ShipPhysics.y = 20.0; - - ShipPhysics.diameter = 12.0 * 16.0; - ShipPhysics.isRound = 1; - + for (int i = 0; i < SHIP_COLL_COUNT; i++) { + shipCollisions[i].owner = this; + shipCollisions[i].info.category1 = 3; + shipCollisions[i].info.category2 = 0; + shipCollisions[i].info.bitfield1 = 0x4F; + shipCollisions[i].info.bitfield2 = 0x8028E; + shipCollisions[i].info.unkShort1C = 0; + shipCollisions[i].info.callback = &ShipAPhysicsCallback; + } + static const float xToCentres[] = {-56.541185, 161.824968, 106.258581}; + static const float yToCentres[] = {-91.176745, -66.957921, 57.935231}; + static const float xToEdges[] = {39.481380, 11.698187, 24.371222}; + static const float yToEdges[] = {37.040555, 12.821730, 21.844430}; + static const float trpValues0[] = {-39.481380, -11.698187, -24.371222}; + static const float trpValues1[] = {-39.481380, -11.698187, 24.371222}; + static const float trpValues2[] = {-39.481380, -11.698187, -24.371222}; + static const float trpValues3[] = {39.481380, 11.698187, -24.371222}; + static const float scX1[] = {-176.447600, 64.340078, -157.925471, -157.925471}; + static const float scY1[] = {-128.217300, 112.570378, -109.695171, -109.695171}; + static const float scX2[] = {-176.447600, 64.340078, -157.925471, -157.925471}; + static const float scY2[] = {-128.217300, 112.570378, -109.695171, -109.695171}; + + for (int i = 0; i < SHIP_COLL_COUNT; i++) { + shipCollisions[i].info.xDistToCenter = xToCentres[i]; + shipCollisions[i].info.yDistToCenter = yToCentres[i]; + shipCollisions[i].info.xDistToEdge = xToEdges[i]; + shipCollisions[i].info.yDistToEdge = yToEdges[i]; + if (i >= 4) { + int xi = i - 4; + shipCollisions[i].trpValue0 = trpValues0[xi]; + shipCollisions[i].trpValue1 = trpValues1[xi]; + shipCollisions[i].trpValue2 = trpValues2[xi]; + shipCollisions[i].trpValue3 = trpValues3[xi]; + shipCollisions[i].collisionCheckType = 3; + } + } // Bowser Physics! ActivePhysics::Info BowserPhysics; @@ -280,7 +308,6 @@ int daCaptainBowser::onDelete() { int daCaptainBowser::onExecute() { acState.execute(); - this->ShipPhysics.update(); PlaySound(this, SE_BOSS_SHIP_PRPL); @@ -430,7 +457,8 @@ int daCaptainBowser::onDraw() { } void daCaptainBowser::endState_Intro() { - this->ShipPhysics.addToList(); + for (int i = 0; i < SHIP_COLL_COUNT; i++) + shipCollisions[i].addToList(); this->aPhysics.addToList(); this->isInvulnerable = 0; |