summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/shyguy.cpp46
1 files changed, 41 insertions, 5 deletions
diff --git a/src/shyguy.cpp b/src/shyguy.cpp
index ddd2923..21e285e 100644
--- a/src/shyguy.cpp
+++ b/src/shyguy.cpp
@@ -112,6 +112,8 @@ class daShyGuy : public dEn_c {
void _vf14C();
bool CreateIceActors();
+ bool willWalkOntoSuitableGround();
+
USING_STATES(daShyGuy);
DECLARE_STATE(Walk);
DECLARE_STATE(Turn);
@@ -655,7 +657,7 @@ int daShyGuy::onCreate() {
_324 = 16.0f;
// These structs tell stupid collider what to collide with - these are from koopa troopa
- static const lineSensor_s below(-0<<12, 0<<12, 0<<12);
+ static const lineSensor_s below(-6<<12, 6<<12, 0<<12);
static const pointSensor_s above(0<<12, 12<<12);
static const lineSensor_s adjacent(6<<12, 9<<12, 6<<12);
@@ -1190,6 +1192,29 @@ void daShyGuy::updateModelMatrices() {
///////////////
// Real Walk State
///////////////
+bool daShyGuy::willWalkOntoSuitableGround() {
+ static const float deltas[] = {2.5f, -2.5f};
+ VEC3 checkWhere = {
+ pos.x + deltas[direction],
+ 4.0f + pos.y,
+ pos.z};
+
+ u32 props = collMgr.getTileBehaviour2At(checkWhere.x, checkWhere.y, currentLayerID);
+
+ //if (getSubType(props) == B_SUB_LEDGE)
+ if (((props >> 16) & 0xFF) == 8)
+ return false;
+
+ float someFloat = 0.0f;
+ if (collMgr.sub_800757B0(&checkWhere, &someFloat, currentLayerID, 1, -1)) {
+ if (someFloat < checkWhere.y && someFloat > (pos.y - 5.0f))
+ return true;
+ }
+
+ return false;
+}
+
+
void daShyGuy::beginState_RealWalk() {
//inline this piece of code
this->max_speed.x = (this->direction) ? -this->XSpeed : this->XSpeed;
@@ -1203,14 +1228,16 @@ void daShyGuy::updateModelMatrices() {
chrAnimation.setUpdateRate(1.5f);
if (distance) {
+ // What the fuck. Somehow, having this code makes the shyguy not
+ // fall through solid-on-top platforms...
bool turn = collMgr.isOnTopOfTile();
if (!turn) {
if (!stillFalling) {
- stillFalling = 1;
+ stillFalling = true;
pos.x = direction ? pos.x + 1.5 : pos.x - 1.5;
- doStateChange(&StateID_RealTurn); }
- }
- else { stillFalling = 0; }
+ doStateChange(&StateID_RealTurn);
+ }
+ } else stillFalling = false;
}
bool ret = calculateTileCollisions();
@@ -1218,6 +1245,15 @@ void daShyGuy::updateModelMatrices() {
doStateChange(&StateID_RealTurn);
}
+ if (distance) {
+ if (collMgr.isOnTopOfTile()) {
+ if (!willWalkOntoSuitableGround()) {
+ pos.x = direction ? pos.x + 1.5 : pos.x - 1.5;
+ doStateChange(&StateID_RealTurn);
+ }
+ }
+ }
+
if(this->chrAnimation.isAnimationDone()) {
this->chrAnimation.setCurrentFrame(0.0);
}