summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/bossSamurshai.cpp48
1 files changed, 43 insertions, 5 deletions
diff --git a/src/bossSamurshai.cpp b/src/bossSamurshai.cpp
index 3a1ecc4..b608916 100644
--- a/src/bossSamurshai.cpp
+++ b/src/bossSamurshai.cpp
@@ -69,6 +69,8 @@ class daSamurshai : public daBoss {
void addScoreWhenHit(void *other);
int randomPlayer();
+ bool isNearWall();
+
USING_STATES(daSamurshai);
DECLARE_STATE(Intro);
@@ -420,7 +422,7 @@ void daSamurshai::updateModelMatrices() {
WLClass::instance->_4 = 4;
WLClass::instance->_8 = 0;
- BossGoalForAllPlayers();
+ MakeMarioEnterDemoMode();
// Make sure to use the correct position
Vec KamekPos = (Vec){pos.x - 124.0, pos.y + 104.0, 3564.0};
@@ -535,8 +537,9 @@ void daSamurshai::updateModelMatrices() {
amountCharged += abs(speed.x);
// should we stop charging?
- if (amountCharged > 480.0f) {
- doStateChange(&StateID_ChargeSlash);
+ if (amountCharged > 480.0f && !isNearWall()) {
+ speed.x = (this->direction) ? -this->XSpeed : this->XSpeed;
+ doStateChange(&StateID_Uppercut);
}
}
@@ -558,7 +561,8 @@ void daSamurshai::updateModelMatrices() {
// if (xDistance < 32.0) { doStateChange(&StateID_SpinAttack); }
// Condition for Uppercut
- if ((xDistance > 48.0) && (xDistance < 64.0)) { doStateChange(&StateID_Uppercut); }
+ if ((xDistance > 48.0) && (xDistance < 64.0) && !isNearWall())
+ doStateChange(&StateID_Uppercut);
}
bool ret = calculateTileCollisions();
@@ -918,6 +922,7 @@ void daSamurshai::updateModelMatrices() {
}
void daSamurshai::executeState_Outro() {
+ calculateTileCollisions();
if (this->dying == 1) {
@@ -937,7 +942,7 @@ void daSamurshai::updateModelMatrices() {
SpawnEffect("Wm_mr_wirehit_hit", 0, &(Vec){pos.x + 8.0, pos.y, pos.z + 500.0}, &(S16Vec){0,0,0}, &(Vec){1.0, 1.0, 1.0});
MapSoundPlayer(SoundRelatedClass, STRM_BGM_SHIRO_BOSS_CLEAR, 1);
- MakeMarioEnterDemoMode();
+ BossGoalForAllPlayers();
this->dying = 1;
this->timer = 0;
@@ -947,3 +952,36 @@ void daSamurshai::updateModelMatrices() {
}
void daSamurshai::endState_Outro() { }
+bool daSamurshai::isNearWall() {
+ // back up our current settings
+ VEC3 savePos = pos;
+ VEC3 saveSpeed = speed;
+ int saveDirection = direction;
+
+ float checkLeft = (direction == 0) ? 8.0f : 104.0f;
+ float checkRight = (direction == 0) ? 104.0f : 8.0f;
+
+ bool result = false;
+
+ speed.x = -0.1f;
+ speed.y = 0.0f;
+ pos.x = savePos.x - checkLeft;
+ direction = 1; // left
+ if (collMgr.calculateAdjacentCollision())
+ result = true;
+
+ speed.x = 0.1f;
+ speed.y = 0.0f;
+ pos.x = savePos.x + checkRight;
+ direction = 0; // right
+ if (collMgr.calculateAdjacentCollision())
+ result = true;
+
+ // restore our settings
+ pos = savePos;
+ speed = saveSpeed;
+ direction = saveDirection;
+
+ return result;
+}
+