diff --git a/src/collision.h b/src/collision.h index 378cf78..07414c7 100644 --- a/src/collision.h +++ b/src/collision.h @@ -41,17 +41,26 @@ struct Collision { getFloor(level, roomIndex, vec3(pos.x, hpos.y, pos.z)); if (checkHeight(level, roomIndex, hpos, vec2(0.0f), height, 0xFFFFFF, 0xFFFFFF, side = NONE)) { - pos -= velocity; + pos.x -= velocity.x; + pos.z -= velocity.z; side = FRONT; return; } - if (info[NONE].ceiling > hpos.y - maxHeight) { - pos.y = info[NONE].ceiling + maxHeight - offset.y; - side = TOP; + int hCell = info[NONE].ceiling - (hpos.y - maxHeight); + if (hCell > 0) { + if (hCell > 128) { + pos.x -= velocity.x; + pos.z -= velocity.z; + side = FRONT; + } else { + pos.y = info[NONE].ceiling + maxHeight - offset.y; + side = TOP; + } } - if (info[NONE].floor < hpos.y + minHeight) { + int hFloor = info[NONE].floor - (hpos.y + minHeight); + if (hFloor < 0 && hFloor > -256) { pos.y = info[NONE].floor - minHeight - offset.y; side = BOTTOM; } diff --git a/src/format.h b/src/format.h index d25730d..a553214 100644 --- a/src/format.h +++ b/src/format.h @@ -2127,7 +2127,7 @@ namespace TR { info.trigger = Trigger::ACTIVATE; info.trigCmdCount = 0; - if (s.floor == -127) + if (s.floor == NO_FLOOR) return; Room::Sector *sBelow = &s; diff --git a/src/lara.h b/src/lara.h index a846d51..704c66b 100644 --- a/src/lara.h +++ b/src/lara.h @@ -437,7 +437,7 @@ struct Lara : Character { //reset(14, vec3(40448, 3584, 60928), PI * 0.5f, STAND_ONWATER); // gym (pool) //reset(14, vec3(20215, 6656, 52942), PI); // level 1 (bridge) //reset(33, vec3(48229, 4608, 78420), 270 * DEG2RAD); // level 1 (end) - //reset(15, vec3(70067, -256, 29104), -0.68f); // level 2 (pool) + reset(15, vec3(70067, -256, 29104), -0.68f); // level 2 (pool) //reset(26, vec3(71980, 1546, 19000), 270 * DEG2RAD); // level 2 (underwater switch) //reset(61, vec3(27221, -1024, 29205), PI * 0.5f); // level 2 (blade) //reset(43, vec3(31400, -2560, 25200), PI); // level 2 (reach) @@ -1761,7 +1761,7 @@ struct Lara : Character { vec3 p = vec3(pos.x, bounds.min.y, pos.z); - Collision c = Collision(level, getRoomIndex(), p, getDir() * 32.0f, vec3(0.0f), LARA_RADIUS, angleExt, 0, 0, 0, 0); + Collision c = Collision(level, getRoomIndex(), p, getDir() * 128.0f, vec3(0.0f), LARA_RADIUS, angleExt, 0, 0, 0, 0); if (c.side != Collision::FRONT) return state; @@ -1777,6 +1777,7 @@ struct Lara : Character { updateEntity(); if (state == STATE_REACH) { + velocity = vec3(0.0f); vec3 p = pos + getDir() * 256.0f; TR::Level::FloorInfo info; level->getFloorInfo(getRoomIndex(), int(p.x), int(p.y), int(p.z), info);