summaryrefslogtreecommitdiff
path: root/src/bossBalboaWrench.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/bossBalboaWrench.cpp')
-rw-r--r--src/bossBalboaWrench.cpp54
1 files changed, 51 insertions, 3 deletions
diff --git a/src/bossBalboaWrench.cpp b/src/bossBalboaWrench.cpp
index fe53a17..e53505c 100644
--- a/src/bossBalboaWrench.cpp
+++ b/src/bossBalboaWrench.cpp
@@ -13,6 +13,7 @@ class daBalboa_c : public daBoss {
mHeapAllocator_c allocator;
m3d::mdl_c bodyModel;
+ m3d::mdl_c spikesModel;
nw4r::g3d::ResFile resFile;
m3d::anmChr_c animationChr;
@@ -29,6 +30,10 @@ class daBalboa_c : public daBoss {
int isBigBoss;
char isRevenging;
int spinner;
+
+ ActivePhysics spikeCollision;
+ float spikeOffset;
+ bool spikeGoingUp, spikeGoingDown;
static daBalboa_c *build();
@@ -132,7 +137,9 @@ bool daBalboa_c::prePlayerCollision(ActivePhysics *apThis, ActivePhysics *apOthe
mario->doSpriteMovement();
mario->doSpriteMovement();
- if (!isRevenging) {
+ if (isRevenging) {
+ _vf220(apOther->owner);
+ } else {
this->damage -= 1;
apOther->someFlagByte |= 2;
@@ -181,6 +188,11 @@ void daBalboa_c::setupModels() {
anmChr = this->resFile.GetResAnmChr("throw_1"); // 11
this->animationChr.setup(mdl, anmChr, &this->allocator, 0);
+ nw4r::g3d::ResFile togeRes;
+ togeRes.data = getResource("lift_zen", "g3d/lift_zen.brres");
+ mdl = togeRes.GetResMdl("lift_togeU");
+ spikesModel.setup(mdl, &allocator, 0, 1, 0);
+
// throw_1 // 11
// throw_2 // 75
// throw_3 // 33
@@ -231,7 +243,16 @@ int daBalboa_c::onCreate() {
this->aPhysics.initWithStruct(this, &HitMeBaby);
this->aPhysics.addToList();
-
+ ActivePhysics::Info spikeInfo = {
+ 0.0f, 0.0f, 16.0f, 16.0f,
+ 3, 0, 0x4F, 0xFFBAFFFE, 0, &dEn_c::collisionCallback};
+ spikeCollision.initWithStruct(this, &spikeInfo);
+ spikeCollision.trpValue0 = 0.0f;
+ spikeCollision.trpValue1 = 0.0f;
+ spikeCollision.trpValue2 = -16.0f;
+ spikeCollision.trpValue3 = 16.0f;
+ spikeCollision.collisionCheckType = 3;
+
this->rot.x = 0; // X is vertical axis
this->rot.y = 0xE000; // Y is horizontal axis
this->rot.z = 0; // Z is ... an axis >.>
@@ -261,6 +282,21 @@ int daBalboa_c::onDelete() {
int daBalboa_c::onExecute() {
acState.execute();
updateModelMatrices();
+
+ if (spikeGoingUp) {
+ spikeOffset += 2.5f;
+ if (spikeOffset >= 48.0f) {
+ spikeOffset = 48.0f;
+ spikeGoingUp = false;
+ }
+ } else if (spikeGoingDown) {
+ spikeOffset -= 2.5f;
+ if (spikeOffset <= 0.0f) {
+ spikeOffset = 0.0f;
+ spikeGoingDown = false;
+ }
+ }
+ spikeCollision.info.yDistToCenter = 16.0f + spikeOffset;
bodyModel._vf1C();
@@ -270,6 +306,8 @@ int daBalboa_c::onExecute() {
int daBalboa_c::onDraw() {
bodyModel.scheduleForDrawing();
+ if (spikeOffset > 0.0f)
+ spikesModel.scheduleForDrawing();
return true;
}
@@ -283,6 +321,12 @@ void daBalboa_c::updateModelMatrices() {
bodyModel.setScale(&scale);
bodyModel.calcWorld(false);
+ mMtx spikeMatrix;
+ VEC3 spikeScale = {2.0f,1.8f,2.0f};
+ spikeMatrix.translation(pos.x, pos.y + spikeOffset, pos.z);
+ spikesModel.setDrawMatrix(spikeMatrix);
+ spikesModel.setScale(&spikeScale);
+ spikesModel.calcWorld(false);
}
// Grow State
@@ -292,7 +336,7 @@ void daBalboa_c::updateModelMatrices() {
SetupKameck(this, Kameck);
- bindAnimChr_and_setUpdateRate("throw_2", 1, 0.0, 0.6);
+ bindAnimChr_and_setUpdateRate("begin_boss", 1, 0.0, 0.6);
}
void daBalboa_c::executeState_Grow() {
@@ -604,6 +648,8 @@ void daBalboa_c::updateModelMatrices() {
isRevenging = 1;
bindAnimChr_and_setUpdateRate("throw_3", 1, 0.0, 1.0);
+ spikeGoingUp = true;
+ spikeCollision.addToList();
PlaySound(this, 0x220);
}
@@ -677,4 +723,6 @@ void daBalboa_c::updateModelMatrices() {
}
void daBalboa_c::endState_Revenge() {
isRevenging = 0;
+ spikeGoingDown = true;
+ spikeCollision.removeFromList();
}