2020-08-10 00:21:45 -05:00
|
|
|
#include "framework.h"
|
|
|
|
#include "lara.h"
|
|
|
|
#include "input.h"
|
2021-09-19 18:29:25 +03:00
|
|
|
#include "level.h"
|
2020-08-10 00:21:45 -05:00
|
|
|
#include "lara_tests.h"
|
|
|
|
#include "lara_collide.h"
|
2021-09-16 05:06:03 +03:00
|
|
|
#include "animation.h"
|
2021-09-19 18:29:25 +03:00
|
|
|
#include "control/los.h"
|
2021-09-27 18:18:03 +10:00
|
|
|
#include "lara_flare.h"
|
|
|
|
#include "lara_helpers.h"
|
2021-08-28 13:27:58 +02:00
|
|
|
#include "collide.h"
|
2021-09-19 23:41:26 +03:00
|
|
|
#include "items.h"
|
2021-08-28 13:27:58 +02:00
|
|
|
#include "camera.h"
|
2021-09-19 23:41:26 +03:00
|
|
|
#include "control/control.h"
|
2021-09-19 18:29:25 +03:00
|
|
|
|
2021-09-27 18:18:03 +10:00
|
|
|
// -----------------------------
|
2021-09-26 20:59:16 +10:00
|
|
|
// CRAWLING & CROUCHING
|
|
|
|
// Control & Collision Functions
|
2021-09-27 18:18:03 +10:00
|
|
|
// -----------------------------
|
2021-09-26 20:59:16 +10:00
|
|
|
|
2021-10-04 22:46:39 +11:00
|
|
|
// ----------
|
|
|
|
// CROUCHING:
|
|
|
|
// ----------
|
|
|
|
|
2021-09-26 20:59:16 +10:00
|
|
|
// State: LS_CROUCH_IDLE (71)
|
|
|
|
// Collision: lara_col_crouch()
|
2021-02-03 01:50:59 -03:00
|
|
|
void lara_as_duck(ITEM_INFO* item, COLL_INFO* coll)
|
2021-09-26 20:59:16 +10:00
|
|
|
{
|
2021-10-14 01:17:21 +11:00
|
|
|
// TODO: Deplete air meter if Lara's head is below the water. Original implementation had a weird buffer zone before
|
2021-10-15 18:26:03 +11:00
|
|
|
// wade depth where Lara couldn't crouch at all, and if the player forced her into the crouched state by
|
2021-10-14 01:17:21 +11:00
|
|
|
// crouching into the region from a run as late as possible, she wasn't able to turn or begin crawling.
|
|
|
|
// Since Lara can now crawl at a considerable depth, a region of peril would make sense. @Sezz 2021.13.21
|
|
|
|
|
2021-09-26 20:59:16 +10:00
|
|
|
coll->Setup.EnableSpaz = false;
|
|
|
|
coll->Setup.EnableObjectPush = true;
|
|
|
|
|
|
|
|
if (item->hitPoints <= 0)
|
|
|
|
{
|
2021-10-13 19:50:46 +11:00
|
|
|
item->goalAnimState = LS_DEATH;
|
2021-09-26 20:59:16 +10:00
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (TrInput & IN_LOOK)
|
|
|
|
LookUpDown();
|
|
|
|
|
2021-10-18 20:15:53 +11:00
|
|
|
// TODO: This MUST be true on the first frame that Lara climbs up into a crawlspace. Otherwise, Lara will stand up.
|
2021-10-14 01:59:55 +11:00
|
|
|
// See if setting Lara.keepDucked can be done before she is in the crawlspace. @Sezz 2021.10.14
|
2021-10-16 21:52:45 +11:00
|
|
|
Lara.keepDucked = TestLaraKeepDucked(coll);
|
2021-10-14 01:59:55 +11:00
|
|
|
|
2021-10-13 19:50:46 +11:00
|
|
|
if ((TrInput & IN_DUCK || Lara.keepDucked) &&
|
|
|
|
Lara.waterStatus != LW_WADE)
|
2021-09-26 20:59:16 +10:00
|
|
|
{
|
|
|
|
// FOR DEBUG PURPOSES UNTIL SCRIPTING IS FINISHED- ## LUA
|
|
|
|
Lara.NewAnims.CrouchRoll = true;
|
|
|
|
|
2021-10-13 19:50:46 +11:00
|
|
|
if ((TrInput & IN_SPRINT) &&
|
2021-10-16 22:53:29 +11:00
|
|
|
TestLaraCrouchRoll(item, coll) &&
|
2021-10-13 19:50:46 +11:00
|
|
|
Lara.NewAnims.CrouchRoll)
|
2021-09-26 20:59:16 +10:00
|
|
|
{
|
|
|
|
item->goalAnimState = LS_CROUCH_ROLL;
|
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2021-10-16 20:50:16 +11:00
|
|
|
// TODO: This will lock Lara if the dispatch can't happen.
|
|
|
|
// Maybe rejoining that split animation wasn't such a good idea... @Sezz 2021.10.16
|
2021-10-22 00:07:24 +11:00
|
|
|
if (TrInput & IN_FORWARD &&
|
|
|
|
coll->CollisionType != CT_FRONT &&
|
|
|
|
coll->CollisionType != CT_TOP_FRONT &&
|
|
|
|
TestLaraCrouchToCrawl(item))
|
|
|
|
{
|
|
|
|
item->goalAnimState = LS_CRAWL_IDLE;
|
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
else if (TrInput & IN_BACK &&
|
|
|
|
TestLaraCrouchToCrawl(item))
|
2021-09-26 20:59:16 +10:00
|
|
|
{
|
|
|
|
item->goalAnimState = LS_CRAWL_IDLE;
|
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2021-10-13 19:50:46 +11:00
|
|
|
if (TrInput & IN_LEFT)
|
2021-09-26 20:59:16 +10:00
|
|
|
{
|
|
|
|
item->goalAnimState = LS_CROUCH_TURN_LEFT;
|
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
2021-10-13 19:50:46 +11:00
|
|
|
else if (TrInput & IN_RIGHT)
|
2021-09-26 20:59:16 +10:00
|
|
|
{
|
|
|
|
item->goalAnimState = LS_CROUCH_TURN_RIGHT;
|
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2021-10-04 22:46:39 +11:00
|
|
|
item->goalAnimState = LS_CROUCH_IDLE;
|
|
|
|
|
2021-09-26 20:59:16 +10:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
item->goalAnimState = LS_STOP;
|
|
|
|
}
|
|
|
|
|
|
|
|
// LEGACY
|
|
|
|
void old_lara_as_duck(ITEM_INFO* item, COLL_INFO* coll)
|
2020-09-26 03:28:30 +10:00
|
|
|
{
|
2020-09-26 05:06:08 +10:00
|
|
|
/*state 71*/
|
|
|
|
/*collision: lara_col_duck*/
|
|
|
|
short roomNum;
|
2020-09-26 03:28:30 +10:00
|
|
|
|
2021-09-10 00:20:59 +03:00
|
|
|
coll->Setup.EnableSpaz = false;
|
|
|
|
coll->Setup.EnableObjectPush = true;
|
2020-08-10 00:21:45 -05:00
|
|
|
|
|
|
|
Lara.isDucked = true;
|
|
|
|
|
|
|
|
if (item->hitPoints <= 0)
|
|
|
|
{
|
|
|
|
item->goalAnimState = LS_CRAWL_IDLE;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2020-09-26 05:06:08 +10:00
|
|
|
roomNum = LaraItem->roomNumber;
|
2020-08-10 00:21:45 -05:00
|
|
|
|
|
|
|
if (TrInput & IN_LOOK)
|
|
|
|
LookUpDown();
|
|
|
|
|
2020-09-26 05:06:08 +10:00
|
|
|
GetFloor(LaraItem->pos.xPos, LaraItem->pos.yPos, LaraItem->pos.zPos, &roomNum);
|
|
|
|
|
2021-07-08 14:15:14 -05:00
|
|
|
// FOR DEBUG PURPOSES UNTIL SCRIPTING IS FINISHED- ## LUA
|
|
|
|
Lara.NewAnims.CrouchRoll = 1;
|
2020-09-26 05:06:08 +10:00
|
|
|
|
|
|
|
|
|
|
|
if ((TrInput & IN_FORWARD || TrInput & IN_BACK)
|
|
|
|
&& (TrInput & IN_DUCK || Lara.keepDucked)
|
|
|
|
&& Lara.gunStatus == LG_NO_ARMS
|
|
|
|
&& Lara.waterStatus != LW_WADE
|
|
|
|
|| Lara.waterSurfaceDist == 256
|
|
|
|
&& !(Lara.waterSurfaceDist > 256))
|
2020-08-10 00:21:45 -05:00
|
|
|
{
|
|
|
|
|
2020-09-26 05:06:08 +10:00
|
|
|
if ((item->animNumber == LA_CROUCH_IDLE
|
|
|
|
|| item->animNumber == LA_STAND_TO_CROUCH_END)
|
|
|
|
&& !(TrInput & IN_FLARE || TrInput & IN_DRAW)
|
2021-07-13 22:29:47 -05:00
|
|
|
&& (Lara.gunType != WEAPON_FLARE || Lara.flareAge < FLARE_AGE && Lara.flareAge != 0))
|
2020-08-10 00:21:45 -05:00
|
|
|
{
|
2020-09-26 05:06:08 +10:00
|
|
|
Lara.torsoYrot = 0;
|
2020-08-10 00:21:45 -05:00
|
|
|
Lara.torsoXrot = 0;
|
2020-09-26 05:06:08 +10:00
|
|
|
item->goalAnimState = LS_CRAWL_IDLE;
|
|
|
|
}
|
2020-08-10 00:21:45 -05:00
|
|
|
|
2020-09-26 05:06:08 +10:00
|
|
|
}
|
|
|
|
else if ((TrInput & IN_SPRINT) /*crouch roll*/
|
|
|
|
&& (TrInput & IN_DUCK || Lara.keepDucked)
|
|
|
|
&& Lara.gunStatus == LG_NO_ARMS
|
|
|
|
&& Lara.waterStatus != LW_WADE
|
|
|
|
|| Lara.waterSurfaceDist == 256
|
2021-07-08 14:15:14 -05:00
|
|
|
&& !(Lara.waterSurfaceDist > 256)
|
|
|
|
&& Lara.NewAnims.CrouchRoll)
|
2020-09-26 05:06:08 +10:00
|
|
|
{
|
|
|
|
if (LaraFloorFront(item, item->pos.yRot, 1024) >= 384 || //4 clicks away from holes in the floor
|
2021-09-14 00:41:11 +03:00
|
|
|
TestLaraWall(item, WALL_SIZE / 2, 0, -256)) //2 clicks away from walls + added a fix in lara_col_crouch_roll, better this way
|
2020-09-26 03:28:30 +10:00
|
|
|
return;
|
2020-08-10 00:21:45 -05:00
|
|
|
|
2020-09-26 05:06:08 +10:00
|
|
|
if (!(TrInput & IN_FLARE || TrInput & IN_DRAW) //avoids some flare spawning/wep stuff
|
2021-07-13 22:29:47 -05:00
|
|
|
&& (Lara.gunType != WEAPON_FLARE || Lara.flareAge < FLARE_AGE && Lara.flareAge != 0))
|
2020-09-26 05:06:08 +10:00
|
|
|
|
2020-08-10 00:21:45 -05:00
|
|
|
{
|
2020-09-26 05:06:08 +10:00
|
|
|
Lara.torsoYrot = 0;
|
2020-09-26 03:28:30 +10:00
|
|
|
Lara.torsoXrot = 0;
|
2020-09-26 05:06:08 +10:00
|
|
|
item->goalAnimState = LS_CROUCH_ROLL;
|
2020-08-10 00:21:45 -05:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-09-26 20:59:16 +10:00
|
|
|
// State: LS_CROUCH_IDLE (71)
|
2021-09-27 18:18:03 +10:00
|
|
|
// Control: lara_as_crouch()
|
2021-02-03 01:50:59 -03:00
|
|
|
void lara_col_duck(ITEM_INFO* item, COLL_INFO* coll)
|
2021-09-26 20:59:16 +10:00
|
|
|
{
|
|
|
|
Lara.moveAngle = item->pos.yRot;
|
2021-10-16 21:52:45 +11:00
|
|
|
Lara.keepDucked = TestLaraKeepDucked(coll);
|
2021-10-11 23:16:02 +11:00
|
|
|
Lara.isDucked = true;
|
2021-09-26 20:59:16 +10:00
|
|
|
item->gravityStatus = false;
|
|
|
|
item->fallspeed = 0;
|
|
|
|
coll->Setup.Height = LARA_HEIGHT_CRAWL;
|
|
|
|
coll->Setup.ForwardAngle = item->pos.yRot;
|
2021-10-22 00:07:24 +11:00
|
|
|
coll->Setup.BadHeightDown = STEP_SIZE - 1; // Was STEPUP_HEIGHT; crouching onto a step-high ledge from a run was unsightly. @Sezz 2021.10.22
|
|
|
|
coll->Setup.BadHeightUp = -(STEP_SIZE - 1); // Was -STEPUP_HEIGHT.
|
2021-09-26 20:59:16 +10:00
|
|
|
coll->Setup.BadCeilingHeight = 0;
|
|
|
|
coll->Setup.SlopesAreWalls = true;
|
|
|
|
GetCollisionInfo(coll, item);
|
|
|
|
|
|
|
|
if (TestLaraFall(coll))
|
|
|
|
{
|
|
|
|
Lara.gunStatus = LG_NO_ARMS;
|
|
|
|
SetLaraFallState(item);
|
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2021-09-27 18:18:03 +10:00
|
|
|
if (TestLaraSlideNew(coll))
|
2021-09-26 20:59:16 +10:00
|
|
|
{
|
|
|
|
SetLaraSlideState(item, coll);
|
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
ShiftItem(item, coll);
|
|
|
|
|
|
|
|
if (coll->Middle.Floor != NO_HEIGHT)
|
|
|
|
item->pos.yPos += coll->Middle.Floor;
|
|
|
|
}
|
|
|
|
|
|
|
|
// LEGACY
|
|
|
|
void old_lara_col_duck(ITEM_INFO* item, COLL_INFO* coll)
|
2020-08-10 00:21:45 -05:00
|
|
|
{
|
2020-09-26 05:06:08 +10:00
|
|
|
/*state 71*/
|
|
|
|
/*state code: lara_as_duck*/
|
2020-08-10 00:21:45 -05:00
|
|
|
item->gravityStatus = false;
|
|
|
|
item->fallspeed = 0;
|
|
|
|
|
2020-12-19 23:34:52 -03:00
|
|
|
Lara.moveAngle = item->pos.yRot;
|
2020-09-26 05:06:08 +10:00
|
|
|
|
2021-09-19 06:42:24 +03:00
|
|
|
coll->Setup.Height = LARA_HEIGHT_CRAWL;
|
2021-09-10 00:20:59 +03:00
|
|
|
coll->Setup.ForwardAngle = item->pos.yRot;
|
2021-09-19 17:48:32 +03:00
|
|
|
coll->Setup.BadHeightDown = STEPUP_HEIGHT;
|
|
|
|
coll->Setup.BadHeightUp = -STEPUP_HEIGHT;
|
2021-09-10 00:20:59 +03:00
|
|
|
coll->Setup.BadCeilingHeight = 0;
|
|
|
|
coll->Setup.SlopesAreWalls = true;
|
2020-08-10 00:21:45 -05:00
|
|
|
|
2021-09-19 06:42:24 +03:00
|
|
|
GetCollisionInfo(coll, item);
|
2020-08-10 00:21:45 -05:00
|
|
|
|
2020-09-26 05:06:08 +10:00
|
|
|
if (LaraFallen(item, coll))
|
2020-08-10 00:21:45 -05:00
|
|
|
{
|
2020-09-26 05:06:08 +10:00
|
|
|
Lara.gunStatus = LG_NO_ARMS;
|
2020-09-26 03:28:30 +10:00
|
|
|
}
|
2020-09-26 05:06:08 +10:00
|
|
|
else if (!TestLaraSlide(item, coll))
|
2020-09-26 03:28:30 +10:00
|
|
|
{
|
2021-10-16 21:52:45 +11:00
|
|
|
Lara.keepDucked = TestLaraKeepDucked(coll);
|
2020-09-26 05:06:08 +10:00
|
|
|
ShiftItem(item, coll);
|
2020-09-26 03:28:30 +10:00
|
|
|
|
2021-09-10 00:18:47 +03:00
|
|
|
if (coll->Middle.Floor != NO_HEIGHT)
|
|
|
|
item->pos.yPos += coll->Middle.Floor;
|
2020-09-26 03:28:30 +10:00
|
|
|
|
2020-09-26 05:06:08 +10:00
|
|
|
if (TrInput & IN_DUCK && Lara.waterStatus != LW_WADE ||
|
|
|
|
Lara.keepDucked ||
|
|
|
|
item->animNumber != LA_CROUCH_IDLE)
|
|
|
|
{
|
|
|
|
if (TrInput & IN_LEFT)
|
|
|
|
{
|
|
|
|
item->goalAnimState = LS_CROUCH_TURN_LEFT;
|
|
|
|
}
|
|
|
|
else if (TrInput & IN_RIGHT)
|
|
|
|
{
|
|
|
|
item->goalAnimState = LS_CROUCH_TURN_RIGHT;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
item->goalAnimState = LS_STOP;
|
|
|
|
}
|
2020-08-10 00:21:45 -05:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-09-27 18:18:03 +10:00
|
|
|
// State: LS_CROUCH_ROLL (72)
|
|
|
|
// Collision: lara_as_crouch_roll()
|
2021-09-26 20:59:16 +10:00
|
|
|
void lara_as_crouch_roll(ITEM_INFO* item, COLL_INFO* coll)
|
2021-09-27 18:18:03 +10:00
|
|
|
{
|
|
|
|
coll->Setup.EnableSpaz = false;
|
|
|
|
coll->Setup.EnableObjectPush = true;
|
|
|
|
|
|
|
|
Camera.targetElevation = -ANGLE(20.0f);
|
|
|
|
|
2021-10-28 16:13:56 +11:00
|
|
|
if (TrInput & IN_LEFT)
|
2021-09-27 18:18:03 +10:00
|
|
|
{
|
2021-10-13 19:50:46 +11:00
|
|
|
Lara.turnRate = -LARA_CROUCH_ROLL_TURN;
|
2021-09-27 18:18:03 +10:00
|
|
|
|
2021-10-22 01:50:43 +11:00
|
|
|
DoLaraLean(item, coll, -LARA_LEAN_MAX, 6);
|
2021-09-27 18:18:03 +10:00
|
|
|
}
|
2021-10-28 16:13:56 +11:00
|
|
|
else if (TrInput & IN_RIGHT)
|
2021-09-27 18:18:03 +10:00
|
|
|
{
|
2021-10-13 19:50:46 +11:00
|
|
|
Lara.turnRate = LARA_CROUCH_ROLL_TURN;
|
2021-09-27 18:18:03 +10:00
|
|
|
|
2021-10-22 01:50:43 +11:00
|
|
|
DoLaraLean(item, coll, LARA_LEAN_MAX, 6);
|
2021-09-27 18:18:03 +10:00
|
|
|
}
|
|
|
|
|
2021-10-22 01:50:43 +11:00
|
|
|
// TODO: Make crouch roll deplete sprint meter? @Sezz 2021.10.22
|
|
|
|
|
2021-09-27 18:18:03 +10:00
|
|
|
item->goalAnimState = LS_CROUCH_IDLE;
|
|
|
|
}
|
|
|
|
|
|
|
|
// LEGACY
|
|
|
|
void old_lara_as_crouch_roll(ITEM_INFO* item, COLL_INFO* coll)
|
2020-08-10 00:21:45 -05:00
|
|
|
{
|
2020-09-26 05:06:08 +10:00
|
|
|
/*state 72*/
|
|
|
|
/*collision: lara_col_crouch_roll*/
|
|
|
|
Camera.targetElevation = -ANGLE(20.0f);
|
2020-08-10 00:21:45 -05:00
|
|
|
item->goalAnimState = LS_CROUCH_IDLE;
|
|
|
|
}
|
|
|
|
|
2021-09-27 18:18:03 +10:00
|
|
|
// State: LS_CROUCH_ROLL (72)
|
|
|
|
// Control: lara_as_crouch_roll()
|
2021-09-26 20:59:16 +10:00
|
|
|
void lara_col_crouch_roll(ITEM_INFO* item, COLL_INFO* coll)
|
2021-09-27 18:18:03 +10:00
|
|
|
{
|
|
|
|
Lara.moveAngle = item->pos.yRot;
|
2021-10-16 21:52:45 +11:00
|
|
|
Lara.keepDucked = TestLaraKeepDucked(coll);
|
2021-10-11 23:16:02 +11:00
|
|
|
Lara.isDucked = true;
|
2021-09-27 18:18:03 +10:00
|
|
|
item->gravityStatus = 0;
|
|
|
|
item->fallspeed = 0;
|
|
|
|
coll->Setup.Height = LARA_HEIGHT_CRAWL;
|
2021-10-18 20:15:53 +11:00
|
|
|
coll->Setup.BadHeightDown = STEP_SIZE - 1;
|
|
|
|
coll->Setup.BadHeightUp = -(STEP_SIZE - 1);
|
2021-09-27 18:18:03 +10:00
|
|
|
coll->Setup.ForwardAngle = item->pos.yRot;
|
|
|
|
coll->Setup.BadCeilingHeight = 0;
|
|
|
|
coll->Setup.SlopesAreWalls = true;
|
|
|
|
GetCollisionInfo(coll, item);
|
|
|
|
|
2021-10-28 16:13:56 +11:00
|
|
|
if (LaraDeflectEdgeDuck(item, coll))
|
2021-10-14 01:17:21 +11:00
|
|
|
{
|
|
|
|
item->pos.xPos = coll->Setup.OldPosition.x;
|
|
|
|
item->pos.yPos = coll->Setup.OldPosition.y;
|
|
|
|
item->pos.zPos = coll->Setup.OldPosition.z;
|
|
|
|
}
|
|
|
|
|
2021-09-27 18:18:03 +10:00
|
|
|
if (TestLaraFall(coll))
|
|
|
|
{
|
|
|
|
Lara.gunStatus = LG_NO_ARMS;
|
2021-10-14 01:17:21 +11:00
|
|
|
item->speed /= 3; // Truncate speed to prevent flying off. TODO: Truncate on a curve. @Sezz 2021.06.27
|
2021-09-27 18:18:03 +10:00
|
|
|
SetLaraFallState(item);
|
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (TestLaraSlideNew(coll))
|
|
|
|
{
|
|
|
|
SetLaraSlideState(item, coll);
|
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2021-10-14 01:17:21 +11:00
|
|
|
ShiftItem(item, coll);
|
|
|
|
|
|
|
|
if (TestLaraHitCeiling(coll))
|
2021-09-27 18:18:03 +10:00
|
|
|
{
|
2021-10-14 01:17:21 +11:00
|
|
|
SetLaraHitCeiling(item, coll);
|
2021-09-27 18:18:03 +10:00
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2021-10-14 01:17:21 +11:00
|
|
|
if (TestLaraStep(coll))
|
2021-09-27 18:18:03 +10:00
|
|
|
{
|
2021-10-14 01:17:21 +11:00
|
|
|
DoLaraStep(item, coll);
|
2021-09-27 18:18:03 +10:00
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2021-10-14 01:17:21 +11:00
|
|
|
// LEGACY step
|
|
|
|
/*if (coll->Middle.Floor != NO_HEIGHT)
|
|
|
|
item->pos.yPos += coll->Middle.Floor;*/
|
2021-09-27 18:18:03 +10:00
|
|
|
}
|
|
|
|
|
|
|
|
// LEGACY
|
|
|
|
void old_lara_col_crouch_roll(ITEM_INFO* item, COLL_INFO* coll)
|
2020-08-10 00:21:45 -05:00
|
|
|
{
|
2020-09-26 05:06:08 +10:00
|
|
|
/*state 72*/
|
|
|
|
/*state code: lara_as_crouch_roll*/
|
2021-07-08 14:15:14 -05:00
|
|
|
item->gravityStatus = 0;
|
2020-08-10 00:21:45 -05:00
|
|
|
item->fallspeed = 0;
|
2021-09-19 06:42:24 +03:00
|
|
|
|
2020-12-19 23:34:52 -03:00
|
|
|
Lara.moveAngle = item->pos.yRot;
|
2021-09-19 06:42:24 +03:00
|
|
|
|
|
|
|
coll->Setup.Height = LARA_HEIGHT_CRAWL;
|
2021-09-19 17:48:32 +03:00
|
|
|
coll->Setup.BadHeightDown = STEPUP_HEIGHT;
|
2021-09-10 00:20:59 +03:00
|
|
|
coll->Setup.ForwardAngle = item->pos.yRot;
|
2021-09-19 17:48:32 +03:00
|
|
|
coll->Setup.BadHeightUp = -STEPUP_HEIGHT;
|
2021-09-10 00:20:59 +03:00
|
|
|
coll->Setup.BadCeilingHeight = 0;
|
|
|
|
coll->Setup.SlopesAreWalls = true;
|
2021-09-19 06:42:24 +03:00
|
|
|
|
|
|
|
GetCollisionInfo(coll, item);
|
2021-07-08 14:15:14 -05:00
|
|
|
|
|
|
|
if (LaraFallen(item, coll))
|
|
|
|
Lara.gunStatus = LG_NO_ARMS;
|
|
|
|
else if (!TestLaraSlide(item, coll))
|
|
|
|
{
|
2021-10-16 21:52:45 +11:00
|
|
|
Lara.keepDucked = TestLaraKeepDucked(coll);
|
2021-07-08 14:15:14 -05:00
|
|
|
|
2021-09-19 17:48:32 +03:00
|
|
|
if (coll->Middle.Floor < coll->Setup.BadHeightUp)//hit a wall, stop
|
2021-07-08 14:15:14 -05:00
|
|
|
{
|
2021-09-10 00:20:59 +03:00
|
|
|
item->pos.xPos = coll->Setup.OldPosition.x;
|
|
|
|
item->pos.yPos = coll->Setup.OldPosition.y;
|
|
|
|
item->pos.zPos = coll->Setup.OldPosition.z;
|
2021-07-08 14:15:14 -05:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
ShiftItem(item, coll);
|
2020-08-10 00:21:45 -05:00
|
|
|
|
2021-07-08 14:15:14 -05:00
|
|
|
if (!LaraHitCeiling(item, coll))
|
2021-09-10 00:18:47 +03:00
|
|
|
item->pos.yPos += coll->Middle.Floor;
|
2021-07-08 14:15:14 -05:00
|
|
|
}
|
2020-08-10 00:21:45 -05:00
|
|
|
}
|
2021-10-04 22:46:39 +11:00
|
|
|
|
|
|
|
// State: LS_CROUCH_TURN_LEFT (105)
|
2021-10-15 01:37:41 +11:00
|
|
|
// Collision: lara_col_duckl()
|
2021-10-04 22:46:39 +11:00
|
|
|
void lara_as_duckl(ITEM_INFO* item, COLL_INFO* coll)
|
|
|
|
{
|
|
|
|
coll->Setup.EnableSpaz = false;
|
|
|
|
|
|
|
|
if (item->hitPoints <= 0)
|
|
|
|
{
|
2021-10-13 19:50:46 +11:00
|
|
|
item->goalAnimState = LS_DEATH;
|
2021-10-04 22:46:39 +11:00
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (TrInput & IN_LOOK)
|
|
|
|
LookUpDown();
|
|
|
|
|
|
|
|
// TODO: Changing Lara.turnRate doesn't work in this state. Find out why. @Sezz 2021.10.03
|
|
|
|
/*Lara.turnRate -= ANGLE(1.5f);
|
|
|
|
if (Lara.turnRate < -LARA_TURN_RATE)
|
|
|
|
Lara.turnRate = -LARA_TURN_RATE;*/
|
|
|
|
item->pos.yRot -= ANGLE(1.5f);
|
|
|
|
|
2021-10-13 19:50:46 +11:00
|
|
|
if ((TrInput & IN_DUCK || Lara.keepDucked) &&
|
|
|
|
Lara.waterStatus != LW_WADE)
|
2021-10-04 22:46:39 +11:00
|
|
|
{
|
2021-10-14 01:17:21 +11:00
|
|
|
if ((TrInput & IN_SPRINT) &&
|
|
|
|
TestLaraCrouchRoll(item, coll) &&
|
|
|
|
Lara.NewAnims.CrouchRoll)
|
2021-10-04 22:46:39 +11:00
|
|
|
{
|
|
|
|
item->goalAnimState = LS_CROUCH_ROLL;
|
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2021-10-14 01:17:21 +11:00
|
|
|
if (TrInput & (IN_FORWARD | IN_BACK) &&
|
2021-10-22 00:07:24 +11:00
|
|
|
TestLaraCrouchToCrawl(item))
|
2021-10-04 22:46:39 +11:00
|
|
|
{
|
|
|
|
item->goalAnimState = LS_CRAWL_IDLE;
|
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (TrInput & IN_LEFT)
|
|
|
|
{
|
|
|
|
item->goalAnimState = LS_CROUCH_TURN_LEFT;
|
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
item->goalAnimState = LS_CROUCH_IDLE;
|
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2021-10-14 17:47:49 +11:00
|
|
|
item->goalAnimState = LS_STOP;
|
2021-10-04 22:46:39 +11:00
|
|
|
}
|
|
|
|
|
|
|
|
// LEGACY
|
|
|
|
void old_lara_as_duckl(ITEM_INFO* item, COLL_INFO* coll)
|
|
|
|
{
|
|
|
|
/*state 105*/
|
|
|
|
/*collision: lara_col_ducklr*/
|
|
|
|
coll->Setup.EnableSpaz = false;
|
|
|
|
if ((TrInput & (IN_DUCK | IN_LEFT)) != (IN_DUCK | IN_LEFT) || item->hitPoints <= 0)
|
|
|
|
item->goalAnimState = LS_CROUCH_IDLE;
|
|
|
|
item->pos.yRot -= ANGLE(1.5f);
|
|
|
|
}
|
|
|
|
|
2021-10-15 01:37:41 +11:00
|
|
|
// State: LS_CRAWL_TURN_LEFT (105)
|
|
|
|
// Control: lara_as_duckl()
|
|
|
|
void lara_col_duckl(ITEM_INFO* item, COLL_INFO* coll)
|
|
|
|
{
|
2021-10-18 20:15:53 +11:00
|
|
|
lara_col_duck(item, coll);
|
2021-10-15 01:37:41 +11:00
|
|
|
}
|
|
|
|
|
2021-10-04 22:46:39 +11:00
|
|
|
// State: LS_CROUCH_TURN_RIGHT (106)
|
2021-10-15 01:37:41 +11:00
|
|
|
// Collision: lara_col_duckr()
|
2021-10-04 22:46:39 +11:00
|
|
|
void lara_as_duckr(ITEM_INFO* item, COLL_INFO* coll)
|
|
|
|
{
|
|
|
|
coll->Setup.EnableSpaz = false;
|
|
|
|
|
|
|
|
if (item->hitPoints <= 0)
|
|
|
|
{
|
|
|
|
item->goalAnimState = LS_CROUCH_IDLE; // TODO: Dispatch death state. @Sezz 2021.10.03
|
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (TrInput & IN_LOOK)
|
|
|
|
LookUpDown();
|
|
|
|
|
|
|
|
// TODO: Changing Lara.turnRate doesn't work in this state. Find out why. @Sezz 2021.10.03
|
2021-10-13 19:50:46 +11:00
|
|
|
/*Lara.turnRate += ANGLE(1.5f);
|
|
|
|
if (Lara.turnRate > LARA_TURN_RATE)
|
|
|
|
Lara.turnRate = LARA_TURN_RATE;*/
|
2021-10-04 22:46:39 +11:00
|
|
|
item->pos.yRot += ANGLE(1.5f);
|
|
|
|
|
2021-10-13 19:50:46 +11:00
|
|
|
if ((TrInput & IN_DUCK || Lara.keepDucked) &&
|
|
|
|
Lara.waterStatus != LW_WADE)
|
2021-10-04 22:46:39 +11:00
|
|
|
{
|
2021-10-14 01:17:21 +11:00
|
|
|
if ((TrInput & IN_SPRINT) &&
|
|
|
|
TestLaraCrouchRoll(item, coll) &&
|
|
|
|
Lara.NewAnims.CrouchRoll)
|
2021-10-04 22:46:39 +11:00
|
|
|
{
|
|
|
|
item->goalAnimState = LS_CROUCH_ROLL;
|
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2021-10-14 01:17:21 +11:00
|
|
|
if (TrInput & (IN_FORWARD | IN_BACK) &&
|
2021-10-22 00:07:24 +11:00
|
|
|
TestLaraCrouchToCrawl(item))
|
2021-10-04 22:46:39 +11:00
|
|
|
{
|
|
|
|
item->goalAnimState = LS_CRAWL_IDLE;
|
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (TrInput & IN_RIGHT)
|
|
|
|
{
|
|
|
|
item->goalAnimState = LS_CROUCH_TURN_RIGHT;
|
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
item->goalAnimState = LS_CROUCH_IDLE;
|
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2021-10-14 17:47:49 +11:00
|
|
|
item->goalAnimState = LS_STOP;
|
2021-10-04 22:46:39 +11:00
|
|
|
}
|
|
|
|
|
|
|
|
// LEGACY
|
|
|
|
void old_lara_as_duckr(ITEM_INFO* item, COLL_INFO* coll)
|
|
|
|
{
|
|
|
|
/*state 106*/
|
|
|
|
/*collision: lara_col_ducklr*/
|
|
|
|
coll->Setup.EnableSpaz = false;
|
|
|
|
if ((TrInput & (IN_DUCK | IN_RIGHT)) != (IN_DUCK | IN_RIGHT) || item->hitPoints <= 0)
|
|
|
|
item->goalAnimState = LS_CROUCH_IDLE;
|
|
|
|
item->pos.yRot += ANGLE(1.5f);
|
|
|
|
}
|
|
|
|
|
2021-10-15 01:37:41 +11:00
|
|
|
// State: LS_CRAWL_TURN_RIGHT (106)
|
|
|
|
// Control: lara_as_duckr()
|
|
|
|
void lara_col_duckr(ITEM_INFO* item, COLL_INFO* coll)
|
2021-10-04 22:46:39 +11:00
|
|
|
{
|
2021-10-18 20:15:53 +11:00
|
|
|
lara_col_duck(item, coll);
|
2021-10-04 22:46:39 +11:00
|
|
|
}
|
|
|
|
|
|
|
|
// LEGACY
|
|
|
|
void old_lara_col_ducklr(ITEM_INFO* item, COLL_INFO* coll)
|
|
|
|
{
|
|
|
|
/*state 105 and 106*/
|
|
|
|
/*state code: lara_as_duckl(105) and lara_col_ducklr(106)*/
|
|
|
|
// FIXED
|
|
|
|
Lara.isDucked = true;
|
|
|
|
if (TrInput & IN_LOOK)
|
|
|
|
LookUpDown();
|
|
|
|
|
|
|
|
item->gravityStatus = false;
|
|
|
|
item->fallspeed = 0;
|
|
|
|
|
|
|
|
Lara.moveAngle = item->pos.yRot;
|
|
|
|
|
|
|
|
coll->Setup.Height = LARA_HEIGHT_CRAWL;
|
|
|
|
coll->Setup.ForwardAngle = item->pos.yRot;
|
|
|
|
coll->Setup.BadHeightDown = STEPUP_HEIGHT;
|
|
|
|
coll->Setup.BadHeightUp = -STEPUP_HEIGHT;
|
|
|
|
coll->Setup.BadCeilingHeight = 0;
|
|
|
|
coll->Setup.SlopesAreWalls = true;
|
|
|
|
|
|
|
|
GetCollisionInfo(coll, item);
|
|
|
|
|
|
|
|
if (LaraFallen(item, coll))
|
|
|
|
{
|
|
|
|
Lara.gunStatus = LG_NO_ARMS;
|
|
|
|
}
|
|
|
|
else if (!TestLaraSlide(item, coll))
|
|
|
|
{
|
2021-10-16 21:52:45 +11:00
|
|
|
Lara.keepDucked = TestLaraKeepDucked(coll);
|
2021-10-04 22:46:39 +11:00
|
|
|
ShiftItem(item, coll);
|
|
|
|
|
|
|
|
if (coll->Middle.Floor != NO_HEIGHT)
|
|
|
|
item->pos.yPos += coll->Middle.Floor;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// ---------
|
|
|
|
// CRAWLING:
|
|
|
|
// ---------
|
|
|
|
|
2021-10-16 20:50:16 +11:00
|
|
|
// State: LS_CRAWL_IDLE (80)
|
|
|
|
// Collision: lara_col_all4s()
|
2021-02-03 01:50:59 -03:00
|
|
|
void lara_as_all4s(ITEM_INFO* item, COLL_INFO* coll)
|
2021-10-16 20:50:16 +11:00
|
|
|
{
|
2021-10-24 13:27:46 +11:00
|
|
|
Lara.gunStatus = LG_HANDS_BUSY;
|
2021-10-16 20:50:16 +11:00
|
|
|
coll->Setup.EnableSpaz = false;
|
|
|
|
coll->Setup.EnableObjectPush = true;
|
|
|
|
|
|
|
|
if (item->hitPoints <= 0)
|
|
|
|
{
|
|
|
|
item->goalAnimState = LS_DEATH;
|
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (TrInput & IN_LOOK)
|
|
|
|
LookUpDown();
|
|
|
|
|
|
|
|
// TODO: Enable with lua!
|
2021-10-22 00:07:24 +11:00
|
|
|
Lara.NewAnims.Crawl1clickdown = true;
|
|
|
|
Lara.NewAnims.Crawl1clickup = true;
|
|
|
|
Lara.NewAnims.CrawlExit1click = true;
|
|
|
|
Lara.NewAnims.CrawlExit2click = true;
|
|
|
|
Lara.NewAnims.CrawlExit3click = true;
|
|
|
|
Lara.NewAnims.CrawlExitJump = true;
|
2021-10-16 20:50:16 +11:00
|
|
|
|
|
|
|
// TEMP
|
2021-10-16 21:52:45 +11:00
|
|
|
Lara.keepDucked = TestLaraKeepDucked(coll);
|
2021-10-16 20:50:16 +11:00
|
|
|
|
|
|
|
if ((TrInput & IN_DUCK || Lara.keepDucked) &&
|
|
|
|
Lara.waterStatus != LW_WADE)
|
|
|
|
{
|
|
|
|
// TODO: Not all weapons are classified as standing weapons??
|
|
|
|
// TODO: Allow standing vault up 2 steps when spawning flare while standing. @Sezz 2021.10.16
|
|
|
|
|
|
|
|
// TODO: Flare not working.
|
2021-10-28 15:25:25 +11:00
|
|
|
if (TrInput & IN_SPRINT ||
|
|
|
|
(TrInput & (IN_DRAW | IN_FLARE) &&
|
2021-10-16 20:50:16 +11:00
|
|
|
!IsStandingWeapon(Lara.gunType) && // TODO: From here or from crouch, it needs to be consistent.
|
2021-10-28 15:25:25 +11:00
|
|
|
TestLaraDrawWeaponsFromCrawlIdle(item)))
|
2021-10-16 20:50:16 +11:00
|
|
|
{
|
|
|
|
Lara.gunStatus = LG_NO_ARMS;
|
|
|
|
item->goalAnimState = LS_CROUCH_IDLE;
|
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2021-10-28 23:22:28 +11:00
|
|
|
if (TrInput & IN_FORWARD)
|
2021-10-16 20:50:16 +11:00
|
|
|
{
|
2021-10-28 15:25:25 +11:00
|
|
|
if (TrInput & (IN_ACTION | IN_JUMP) &&
|
2021-10-16 20:50:16 +11:00
|
|
|
TestLaraCrawlVault(item, coll))
|
|
|
|
{
|
|
|
|
DoLaraCrawlVault(item, coll);
|
2021-10-22 00:07:24 +11:00
|
|
|
|
|
|
|
return;
|
2021-10-16 20:50:16 +11:00
|
|
|
}
|
2021-10-28 23:22:28 +11:00
|
|
|
else if (TestLaraCrawlForward(item, coll) &&
|
|
|
|
coll->CollisionType != CT_FRONT &&
|
|
|
|
coll->CollisionType != CT_TOP_FRONT) [[likely]]
|
2021-10-22 00:07:24 +11:00
|
|
|
{
|
2021-10-16 20:50:16 +11:00
|
|
|
item->goalAnimState = LS_CRAWL_FORWARD;
|
|
|
|
|
2021-10-22 00:07:24 +11:00
|
|
|
return;
|
|
|
|
}
|
2021-10-16 20:50:16 +11:00
|
|
|
}
|
|
|
|
else if (TrInput & IN_BACK)
|
|
|
|
{
|
2021-10-28 15:25:25 +11:00
|
|
|
if (TrInput & (IN_ACTION | IN_JUMP) &&
|
2021-10-17 22:10:01 +11:00
|
|
|
TestLaraCrawlToHang(item, coll))
|
|
|
|
{
|
2021-10-18 15:22:38 +11:00
|
|
|
DoLaraCrawlToHangSnap(item, coll);
|
2021-10-17 22:10:01 +11:00
|
|
|
item->goalAnimState = LS_CRAWL_TO_HANG;
|
2021-10-22 00:07:24 +11:00
|
|
|
|
|
|
|
return;
|
2021-10-17 22:10:01 +11:00
|
|
|
}
|
2021-10-22 00:07:24 +11:00
|
|
|
// BUG: If Lara is stopped while crawling back, this test will fail.
|
|
|
|
// I'm certain it's not due to shifts or the use of BadHeightUp/Down. @Sezz 2021.10.22
|
2021-10-24 20:43:02 +11:00
|
|
|
else if (TestLaraCrawlBack(item, coll)) [[likely]]
|
2021-10-22 00:07:24 +11:00
|
|
|
{
|
2021-10-17 22:10:01 +11:00
|
|
|
item->goalAnimState = LS_CRAWL_BACK;
|
2021-10-16 20:50:16 +11:00
|
|
|
|
2021-10-22 00:07:24 +11:00
|
|
|
return;
|
|
|
|
}
|
2021-10-16 20:50:16 +11:00
|
|
|
}
|
|
|
|
|
|
|
|
if (TrInput & IN_LEFT)
|
|
|
|
{
|
|
|
|
item->goalAnimState = LS_CRAWL_TURN_LEFT;
|
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
else if (TrInput & IN_RIGHT)
|
|
|
|
{
|
|
|
|
item->goalAnimState = LS_CRAWL_TURN_RIGHT;
|
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
item->goalAnimState = LS_CRAWL_IDLE;
|
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
Lara.gunStatus = LG_NO_ARMS;
|
|
|
|
item->goalAnimState = LS_CROUCH_IDLE;
|
|
|
|
}
|
|
|
|
|
|
|
|
// LEGACY
|
|
|
|
void old_lara_as_all4s(ITEM_INFO* item, COLL_INFO* coll)
|
2020-08-10 00:21:45 -05:00
|
|
|
{
|
2020-09-26 05:06:08 +10:00
|
|
|
/*state 80*/
|
|
|
|
/*collision: lara_col_all4s*/
|
2020-08-10 00:21:45 -05:00
|
|
|
if (item->hitPoints <= 0)
|
|
|
|
{
|
|
|
|
item->goalAnimState = LS_DEATH;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2021-10-08 01:47:16 +03:00
|
|
|
// TODO: Enable with lua!
|
2021-10-08 01:46:29 +03:00
|
|
|
Lara.NewAnims.Crawl1clickdown = 1;
|
|
|
|
Lara.NewAnims.Crawl1clickup = 1;
|
|
|
|
Lara.NewAnims.CrawlExit1click = 1;
|
|
|
|
Lara.NewAnims.CrawlExit2click = 1;
|
|
|
|
Lara.NewAnims.CrawlExit3click = 1;
|
2021-07-09 19:41:56 -05:00
|
|
|
Lara.NewAnims.CrawlExitJump = 1;
|
|
|
|
|
|
|
|
if (TrInput & IN_JUMP && Lara.NewAnims.CrawlExitJump)
|
2020-08-10 00:21:45 -05:00
|
|
|
{
|
|
|
|
GAME_VECTOR s, d;
|
|
|
|
MESH_INFO* StaticMesh;
|
|
|
|
PHD_VECTOR v;
|
|
|
|
|
|
|
|
if (LaraFloorFront(item, item->pos.yRot, 512) > 768 &&
|
|
|
|
LaraCeilingFront(item, item->pos.yRot, 768, 512) != NO_HEIGHT &&
|
|
|
|
LaraCeilingFront(item, item->pos.yRot, 768, 512) <= 0)
|
|
|
|
{
|
|
|
|
s.x = LaraItem->pos.xPos;
|
|
|
|
s.y = LaraItem->pos.yPos - 96;
|
|
|
|
s.z = LaraItem->pos.zPos;
|
|
|
|
s.roomNumber = LaraItem->roomNumber;
|
|
|
|
|
2020-10-05 22:24:57 -03:00
|
|
|
d.x = s.x + 768 * phd_sin(LaraItem->pos.yRot);
|
2021-08-26 13:47:47 +03:00
|
|
|
d.y = s.y + LARA_HEADROOM;
|
2020-10-05 22:24:57 -03:00
|
|
|
d.z = s.z + 768 * phd_cos(LaraItem->pos.yRot);
|
2020-08-10 00:21:45 -05:00
|
|
|
|
|
|
|
if (LOS(&s, &d) && item->animNumber != LA_CROUCH_TO_CRAWL_START && item->animNumber != LA_CROUCH_TO_CRAWL_CONTINUE)
|
|
|
|
{
|
|
|
|
// TODO: fix ObjectOnLOS2
|
2021-09-13 10:22:00 +03:00
|
|
|
/*if (ObjectOnLOS2(&s, &d, &v, (PHD_VECTOR*)&StaticMesh) == NO_LOS_ITEM)
|
2020-08-10 00:21:45 -05:00
|
|
|
{*/
|
|
|
|
item->animNumber = LA_CRAWL_JUMP_FLIP_DOWN;
|
|
|
|
item->frameNumber = g_Level.Anims[item->animNumber].frameBase;
|
|
|
|
item->goalAnimState = LS_MISC_CONTROL;
|
|
|
|
item->currentAnimState = LS_MISC_CONTROL;
|
|
|
|
Lara.gunStatus = LG_HANDS_BUSY;
|
|
|
|
/*}*/
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else if (LaraFloorFront(item, item->pos.yRot, 256) == 768 &&
|
|
|
|
LaraCeilingFront(item, item->pos.yRot, 768, 512) != NO_HEIGHT &&
|
|
|
|
LaraCeilingFront(item, item->pos.yRot, 768, 512) <= 0)
|
|
|
|
{
|
|
|
|
s.x = LaraItem->pos.xPos;
|
|
|
|
s.y = LaraItem->pos.yPos - 96;
|
|
|
|
s.z = LaraItem->pos.zPos;
|
|
|
|
s.roomNumber = LaraItem->roomNumber;
|
|
|
|
|
2020-10-05 22:24:57 -03:00
|
|
|
d.x = s.x + 768 * phd_sin(LaraItem->pos.yRot);
|
2021-08-26 13:47:47 +03:00
|
|
|
d.y = s.y + LARA_HEADROOM;
|
2020-10-05 22:24:57 -03:00
|
|
|
d.z = s.z + 768 * phd_cos(LaraItem->pos.yRot);
|
2020-08-10 00:21:45 -05:00
|
|
|
|
2021-07-08 14:15:14 -05:00
|
|
|
if (LOS(&s, &d) && item->animNumber != LA_CROUCH_TO_CRAWL_START && item->animNumber != LA_CROUCH_TO_CRAWL_CONTINUE && Lara.NewAnims.CrawlExit3click)
|
2020-08-10 00:21:45 -05:00
|
|
|
{
|
|
|
|
item->animNumber = LA_CRAWL_JUMP_DOWN_23CLICK;
|
|
|
|
item->frameNumber = g_Level.Anims[item->animNumber].frameBase;
|
|
|
|
item->goalAnimState = LS_MISC_CONTROL;
|
|
|
|
item->currentAnimState = LS_MISC_CONTROL;
|
|
|
|
Lara.gunStatus = LG_HANDS_BUSY;
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else if (LaraFloorFront(item, item->pos.yRot, 256) == 512 &&
|
|
|
|
LaraCeilingFront(item, item->pos.yRot, 768, 512) != NO_HEIGHT &&
|
|
|
|
LaraCeilingFront(item, item->pos.yRot, 768, 512) <= 0)
|
|
|
|
{
|
|
|
|
|
|
|
|
s.x = LaraItem->pos.xPos;
|
|
|
|
s.y = LaraItem->pos.yPos - 96;
|
|
|
|
s.z = LaraItem->pos.zPos;
|
|
|
|
s.roomNumber = LaraItem->roomNumber;
|
|
|
|
|
2020-10-05 22:24:57 -03:00
|
|
|
d.x = s.x + 768 * phd_sin(LaraItem->pos.yRot);
|
2021-08-26 13:47:47 +03:00
|
|
|
d.y = s.y + LARA_HEADROOM;
|
2020-10-05 22:24:57 -03:00
|
|
|
d.z = s.z + 768 * phd_cos(LaraItem->pos.yRot);
|
2020-08-10 00:21:45 -05:00
|
|
|
|
2021-07-08 14:15:14 -05:00
|
|
|
if (LOS(&s, &d) && item->animNumber != LA_CROUCH_TO_CRAWL_START && item->animNumber != LA_CROUCH_TO_CRAWL_CONTINUE && Lara.NewAnims.CrawlExit2click)
|
2020-08-10 00:21:45 -05:00
|
|
|
{
|
|
|
|
item->animNumber = LA_CRAWL_JUMP_DOWN_23CLICK;
|
|
|
|
item->frameNumber = g_Level.Anims[item->animNumber].frameBase;
|
|
|
|
item->goalAnimState = LS_MISC_CONTROL;
|
|
|
|
item->currentAnimState = LS_MISC_CONTROL;
|
|
|
|
Lara.gunStatus = LG_HANDS_BUSY;
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else if (LaraFloorFront(item, item->pos.yRot, 256) == 256 &&
|
|
|
|
LaraCeilingFront(item, item->pos.yRot, 768, 512) != NO_HEIGHT &&
|
|
|
|
LaraCeilingFront(item, item->pos.yRot, 768, 512) <= 0)
|
|
|
|
{
|
|
|
|
s.x = LaraItem->pos.xPos;
|
|
|
|
s.y = LaraItem->pos.yPos - 96;
|
|
|
|
s.z = LaraItem->pos.zPos;
|
|
|
|
s.roomNumber = LaraItem->roomNumber;
|
|
|
|
|
2020-10-05 22:24:57 -03:00
|
|
|
d.x = s.x + 768 * phd_sin(LaraItem->pos.yRot);
|
2021-08-26 13:47:47 +03:00
|
|
|
d.y = s.y + LARA_HEADROOM;
|
2020-10-05 22:24:57 -03:00
|
|
|
d.z = s.z + 768 * phd_cos(LaraItem->pos.yRot);
|
2020-08-10 00:21:45 -05:00
|
|
|
|
2021-07-08 14:15:14 -05:00
|
|
|
if (LOS(&s, &d) && item->animNumber != LA_CROUCH_TO_CRAWL_START && item->animNumber != LA_CROUCH_TO_CRAWL_CONTINUE && Lara.NewAnims.CrawlExit1click)
|
2020-08-10 00:21:45 -05:00
|
|
|
{
|
|
|
|
item->animNumber = LA_CRAWL_JUMP_DOWN_1CLICK;
|
|
|
|
item->frameNumber = g_Level.Anims[item->animNumber].frameBase;
|
|
|
|
item->goalAnimState = LS_MISC_CONTROL;
|
|
|
|
item->currentAnimState = LS_MISC_CONTROL;
|
|
|
|
Lara.gunStatus = LG_HANDS_BUSY;
|
2020-09-26 05:06:08 +10:00
|
|
|
|
2020-08-10 00:21:45 -05:00
|
|
|
}
|
|
|
|
}
|
2020-09-26 05:06:08 +10:00
|
|
|
|
2020-08-10 00:21:45 -05:00
|
|
|
}
|
|
|
|
|
2020-09-26 05:06:08 +10:00
|
|
|
if ((TrInput & IN_ACTION) && (TrInput & IN_FORWARD) && item->animNumber != LA_CROUCH_TO_CRAWL_START && item->animNumber != LA_CROUCH_TO_CRAWL_CONTINUE)
|
2020-08-10 00:21:45 -05:00
|
|
|
{
|
|
|
|
if (LaraFloorFront(item, item->pos.yRot, 256) == -256 &&
|
|
|
|
LaraCeilingFront(item, item->pos.yRot, 256, 256) != NO_HEIGHT &&
|
2021-07-08 14:15:14 -05:00
|
|
|
LaraCeilingFront(item, item->pos.yRot, 256, 256) <= -512 &&
|
|
|
|
Lara.NewAnims.Crawl1clickup)
|
2020-08-10 00:21:45 -05:00
|
|
|
{
|
2020-09-26 05:06:08 +10:00
|
|
|
item->animNumber = LA_CRAWL_UP_STEP;
|
|
|
|
item->frameNumber = g_Level.Anims[item->animNumber].frameBase;
|
|
|
|
item->goalAnimState = LS_MISC_CONTROL;
|
|
|
|
item->currentAnimState = LS_MISC_CONTROL;
|
2020-08-10 00:21:45 -05:00
|
|
|
}
|
|
|
|
else
|
|
|
|
if (LaraFloorFront(item, item->pos.yRot, 256) == 256 &&
|
|
|
|
LaraCeilingFront(item, item->pos.yRot, 256, 256) != NO_HEIGHT &&
|
2021-07-08 14:15:14 -05:00
|
|
|
LaraCeilingFront(item, item->pos.yRot, 256, -256) <= -512 &&
|
|
|
|
Lara.NewAnims.Crawl1clickdown)
|
2020-08-10 00:21:45 -05:00
|
|
|
{
|
2020-09-26 05:06:08 +10:00
|
|
|
item->animNumber = LA_CRAWL_DOWN_STEP;
|
|
|
|
item->frameNumber = g_Level.Anims[item->animNumber].frameBase;
|
|
|
|
item->goalAnimState = LS_MISC_CONTROL;
|
|
|
|
item->currentAnimState = LS_MISC_CONTROL;
|
2020-08-10 00:21:45 -05:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
Lara.gunStatus = LG_HANDS_BUSY;
|
|
|
|
|
|
|
|
if (TrInput & IN_LOOK)
|
|
|
|
LookUpDown();
|
|
|
|
|
|
|
|
Lara.torsoXrot = 0;
|
|
|
|
Lara.torsoYrot = 0;
|
|
|
|
|
2021-09-10 00:20:59 +03:00
|
|
|
coll->Setup.EnableSpaz = false;
|
|
|
|
coll->Setup.EnableObjectPush = true;
|
2020-08-10 00:21:45 -05:00
|
|
|
|
|
|
|
if (item->animNumber == LA_CROUCH_TO_CRAWL_START)
|
|
|
|
Lara.gunStatus = LG_HANDS_BUSY;
|
|
|
|
|
2020-09-26 05:06:08 +10:00
|
|
|
Camera.targetElevation = -ANGLE(23.0f);
|
2020-08-10 00:21:45 -05:00
|
|
|
|
|
|
|
if (g_Level.Rooms[LaraItem->roomNumber].flags & ENV_FLAG_WATER)
|
|
|
|
{
|
|
|
|
item->goalAnimState = LS_CROUCH_IDLE;
|
|
|
|
item->requiredAnimState = LS_STOP;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-10-16 20:50:16 +11:00
|
|
|
// State: LS_CRAWL_IDLE (80)
|
|
|
|
// Control: lara_as_all4s()
|
2021-02-03 01:50:59 -03:00
|
|
|
void lara_col_all4s(ITEM_INFO* item, COLL_INFO* coll)
|
2021-10-16 20:50:16 +11:00
|
|
|
{
|
|
|
|
Lara.moveAngle = item->pos.yRot;
|
2021-10-16 21:52:45 +11:00
|
|
|
Lara.keepDucked = TestLaraKeepDucked(coll);
|
2021-10-16 20:50:16 +11:00
|
|
|
Lara.isDucked = true;
|
2021-10-28 23:57:49 +11:00
|
|
|
Lara.torsoXrot = 0; // TODO: More pleasing reset. @Sezz 2021.10.28
|
|
|
|
Lara.torsoYrot = 0;
|
2021-10-16 20:50:16 +11:00
|
|
|
item->fallspeed = 0;
|
|
|
|
item->gravityStatus = false;
|
|
|
|
coll->Setup.ForwardAngle = Lara.moveAngle;
|
|
|
|
coll->Setup.Radius = LARA_RAD_CRAWL;
|
|
|
|
coll->Setup.Height = LARA_HEIGHT_CRAWL;
|
|
|
|
coll->Setup.BadHeightDown = STEP_SIZE - 1;
|
2021-10-18 20:15:53 +11:00
|
|
|
coll->Setup.BadHeightUp = -(STEP_SIZE - 1);
|
2021-10-16 20:50:16 +11:00
|
|
|
coll->Setup.BadCeilingHeight = LARA_HEIGHT_CRAWL;
|
|
|
|
coll->Setup.SlopesAreWalls = true;
|
|
|
|
coll->Setup.SlopesArePits = true;
|
|
|
|
GetCollisionInfo(coll, item);
|
|
|
|
|
|
|
|
Camera.targetElevation = -ANGLE(23.0f);
|
|
|
|
|
|
|
|
if (TestLaraFall(coll))
|
|
|
|
{
|
|
|
|
Lara.gunStatus = LG_NO_ARMS;
|
|
|
|
SetLaraFallState(item);
|
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (TestLaraSlide(item, coll))
|
|
|
|
{
|
|
|
|
SetLaraSlideState(item, coll);
|
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
ShiftItem(item, coll);
|
|
|
|
|
|
|
|
if (coll->Middle.Floor != NO_HEIGHT && coll->Middle.Floor > -256)
|
|
|
|
item->pos.yPos += coll->Middle.Floor;
|
|
|
|
}
|
|
|
|
|
|
|
|
// LEGACY
|
|
|
|
void old_lara_col_all4s(ITEM_INFO* item, COLL_INFO* coll)
|
2020-08-10 00:21:45 -05:00
|
|
|
{
|
2020-09-26 05:06:08 +10:00
|
|
|
/*state 80*/
|
|
|
|
/*state code: lara_as_all4s*/
|
2020-08-10 00:21:45 -05:00
|
|
|
item->fallspeed = 0;
|
|
|
|
item->gravityStatus = false;
|
|
|
|
|
2020-09-26 05:06:08 +10:00
|
|
|
if (item->goalAnimState != LS_CRAWL_TO_HANG)
|
2020-08-10 00:21:45 -05:00
|
|
|
{
|
2020-12-19 23:34:52 -03:00
|
|
|
Lara.moveAngle = item->pos.yRot;
|
2020-08-10 00:21:45 -05:00
|
|
|
|
2021-09-19 06:42:24 +03:00
|
|
|
coll->Setup.ForwardAngle = Lara.moveAngle;
|
2021-09-10 01:22:27 +03:00
|
|
|
coll->Setup.Radius = LARA_RAD_CRAWL;
|
2021-09-19 06:42:24 +03:00
|
|
|
coll->Setup.Height = LARA_HEIGHT_CRAWL;
|
2021-09-19 17:48:32 +03:00
|
|
|
coll->Setup.BadHeightDown = STEP_SIZE - 1;
|
|
|
|
coll->Setup.BadHeightUp = -127;
|
2021-09-13 09:47:37 +03:00
|
|
|
coll->Setup.BadCeilingHeight = LARA_HEIGHT_CRAWL;
|
2021-09-10 00:20:59 +03:00
|
|
|
coll->Setup.SlopesAreWalls = true;
|
|
|
|
coll->Setup.SlopesArePits = true;
|
2020-08-10 00:21:45 -05:00
|
|
|
|
2021-09-19 06:42:24 +03:00
|
|
|
GetCollisionInfo(coll, item);
|
2020-08-10 00:21:45 -05:00
|
|
|
|
2020-09-26 05:06:08 +10:00
|
|
|
if (LaraFallen(item, coll))
|
|
|
|
{
|
|
|
|
Lara.gunStatus = LG_NO_ARMS;
|
|
|
|
}
|
|
|
|
else if (!TestLaraSlide(item, coll))
|
|
|
|
{
|
2021-09-10 00:18:47 +03:00
|
|
|
int slope = abs(coll->FrontLeft.Floor - coll->FrontRight.Floor);
|
2020-08-10 00:21:45 -05:00
|
|
|
|
2021-10-16 21:52:45 +11:00
|
|
|
Lara.keepDucked = TestLaraKeepDucked(coll);
|
2020-09-26 05:06:08 +10:00
|
|
|
ShiftItem(item, coll);
|
2020-09-26 03:28:30 +10:00
|
|
|
|
2021-09-10 00:18:47 +03:00
|
|
|
if (coll->Middle.Floor != NO_HEIGHT && coll->Middle.Floor > -256)
|
|
|
|
item->pos.yPos += coll->Middle.Floor;
|
2020-09-26 03:28:30 +10:00
|
|
|
|
2020-09-26 05:06:08 +10:00
|
|
|
if (TrInput & IN_DUCK || Lara.keepDucked &&
|
|
|
|
(!(TrInput & IN_FLARE) && !(TrInput & IN_DRAW) || TrInput & IN_FORWARD) &&
|
|
|
|
Lara.waterStatus != LW_WADE)
|
2020-08-10 00:21:45 -05:00
|
|
|
{
|
2020-09-26 05:06:08 +10:00
|
|
|
if (item->animNumber == LA_CRAWL_IDLE ||
|
|
|
|
item->animNumber == LA_CROUCH_TO_CRAWL_END ||
|
|
|
|
item->animNumber == LA_CRAWL_TO_IDLE_END_RIGHT_POINTLESS ||
|
|
|
|
item->animNumber == LA_CRAWL_TO_IDLE_END_LEFT_POINTLESS)
|
2020-08-10 00:21:45 -05:00
|
|
|
{
|
2020-09-26 05:06:08 +10:00
|
|
|
if (TrInput & IN_FORWARD)
|
2020-08-10 00:21:45 -05:00
|
|
|
{
|
2021-08-24 16:54:26 +03:00
|
|
|
auto collResult = LaraCollisionFront(item, item->pos.yRot, 256);
|
2021-09-25 13:41:01 +03:00
|
|
|
if (abs(collResult.Position.Floor) < 127 && !collResult.Position.Slope)
|
2020-09-26 05:06:08 +10:00
|
|
|
item->goalAnimState = LS_CRAWL_FORWARD;
|
2020-08-10 00:21:45 -05:00
|
|
|
}
|
2020-09-26 05:06:08 +10:00
|
|
|
else if (TrInput & IN_BACK)
|
2020-09-26 03:28:30 +10:00
|
|
|
{
|
2020-09-26 05:06:08 +10:00
|
|
|
short height = LaraCeilingFront(item, item->pos.yRot, -300, 128);
|
|
|
|
short heightl = 0;
|
|
|
|
short heightr = 0;
|
|
|
|
|
2021-01-28 13:30:23 -03:00
|
|
|
if (height != NO_HEIGHT && height <= -256)
|
2020-08-10 00:21:45 -05:00
|
|
|
{
|
2020-09-26 05:06:08 +10:00
|
|
|
if (TrInput & IN_ACTION)
|
2020-08-10 00:21:45 -05:00
|
|
|
{
|
|
|
|
int x = item->pos.xPos;
|
|
|
|
int z = item->pos.zPos;
|
|
|
|
|
2020-10-05 22:24:57 -03:00
|
|
|
item->pos.xPos += 128 * phd_sin(item->pos.yRot - ANGLE(90.0f));
|
|
|
|
item->pos.zPos += 128 * phd_cos(item->pos.yRot - ANGLE(90.0f));
|
2020-09-26 05:06:08 +10:00
|
|
|
|
|
|
|
heightl = LaraFloorFront(item, item->pos.yRot, -300);
|
2020-08-10 00:21:45 -05:00
|
|
|
|
2020-10-05 22:24:57 -03:00
|
|
|
item->pos.xPos += 256 * phd_sin(item->pos.yRot + ANGLE(90.0f));
|
|
|
|
item->pos.zPos += 256 * phd_cos(item->pos.yRot + ANGLE(90.0f));
|
2020-09-26 05:06:08 +10:00
|
|
|
|
|
|
|
heightr = LaraFloorFront(item, item->pos.yRot, -300);
|
2020-08-10 00:21:45 -05:00
|
|
|
|
|
|
|
item->pos.xPos = x;
|
|
|
|
item->pos.zPos = z;
|
2020-09-26 05:06:08 +10:00
|
|
|
}
|
2020-08-10 00:21:45 -05:00
|
|
|
|
2021-08-24 16:54:26 +03:00
|
|
|
auto collResult = LaraCollisionFront(item, item->pos.yRot, -300);
|
2021-09-10 00:43:26 +03:00
|
|
|
height = collResult.Position.Floor;
|
2020-09-26 05:06:08 +10:00
|
|
|
|
2021-09-17 22:55:09 +03:00
|
|
|
if (abs(height) >= STEP_SIZE - 1 || collResult.Position.Slope)
|
2020-09-26 05:06:08 +10:00
|
|
|
{
|
|
|
|
if (TrInput & IN_ACTION)
|
2020-08-10 00:21:45 -05:00
|
|
|
{
|
2020-09-26 05:06:08 +10:00
|
|
|
if (height > 768 &&
|
|
|
|
heightl > 768 &&
|
|
|
|
heightr > 768 &&
|
|
|
|
slope < 120)
|
2020-08-10 00:21:45 -05:00
|
|
|
{
|
2020-09-26 05:06:08 +10:00
|
|
|
int tmp;
|
|
|
|
int x = item->pos.xPos;
|
|
|
|
int z = item->pos.zPos;
|
|
|
|
|
2021-09-10 00:20:59 +03:00
|
|
|
item->pos.xPos -= 100 * phd_sin(coll->Setup.ForwardAngle);
|
|
|
|
item->pos.zPos -= 100 * phd_cos(coll->Setup.ForwardAngle);
|
2020-09-26 05:06:08 +10:00
|
|
|
|
2021-01-29 01:14:20 -03:00
|
|
|
tmp = GetCollidedObjects(item, 100, 1, CollidedItems, CollidedMeshes, 0);
|
2020-09-26 05:06:08 +10:00
|
|
|
|
|
|
|
item->pos.xPos = x;
|
|
|
|
item->pos.zPos = z;
|
|
|
|
|
|
|
|
if (!tmp)
|
|
|
|
{
|
|
|
|
switch (GetQuadrant(item->pos.yRot))
|
|
|
|
{
|
|
|
|
case 0:
|
|
|
|
item->pos.yRot = 0;
|
|
|
|
item->pos.zPos = (item->pos.zPos & 0xFFFFFC00) + 225;
|
|
|
|
break;
|
|
|
|
case 1:
|
|
|
|
item->pos.yRot = ANGLE(90.0f);
|
|
|
|
item->pos.xPos = (item->pos.xPos & 0xFFFFFC00) + 225;
|
|
|
|
break;
|
|
|
|
case 2:
|
|
|
|
item->pos.yRot = -ANGLE(180.0f);
|
|
|
|
item->pos.zPos = (item->pos.zPos | 0x3FF) - 225;
|
|
|
|
break;
|
|
|
|
case 3:
|
|
|
|
item->pos.yRot = -ANGLE(90.0f);
|
|
|
|
item->pos.xPos = (item->pos.xPos | 0x3FF) - 225;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
item->goalAnimState = LS_CRAWL_TO_HANG;
|
|
|
|
}
|
2020-08-10 00:21:45 -05:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2021-09-04 07:53:21 +02:00
|
|
|
else if (!(abs(height) >= STEP_SIZE))
|
2020-09-26 05:06:08 +10:00
|
|
|
{
|
|
|
|
item->goalAnimState = LS_CRAWL_BACK;
|
|
|
|
}
|
2020-08-10 00:21:45 -05:00
|
|
|
}
|
|
|
|
}
|
2020-09-26 05:06:08 +10:00
|
|
|
else if (TrInput & IN_LEFT)
|
2020-08-10 00:21:45 -05:00
|
|
|
{
|
2020-09-26 05:06:08 +10:00
|
|
|
item->animNumber = LA_CRAWL_TURN_LEFT;
|
|
|
|
item->frameNumber = g_Level.Anims[item->animNumber].frameBase;
|
|
|
|
item->currentAnimState = LS_CRAWL_TURN_LEFT;
|
|
|
|
item->goalAnimState = LS_CRAWL_TURN_LEFT;
|
|
|
|
}
|
|
|
|
else if (TrInput & IN_RIGHT)
|
|
|
|
{
|
|
|
|
item->animNumber = LA_CRAWL_TURN_RIGHT;
|
|
|
|
item->frameNumber = g_Level.Anims[item->animNumber].frameBase;
|
|
|
|
item->currentAnimState = LS_CRAWL_TURN_RIGHT;
|
|
|
|
item->goalAnimState = LS_CRAWL_TURN_RIGHT;
|
2020-08-10 00:21:45 -05:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2020-09-26 05:06:08 +10:00
|
|
|
else
|
2020-08-10 00:21:45 -05:00
|
|
|
{
|
2020-09-26 05:06:08 +10:00
|
|
|
item->goalAnimState = LS_CROUCH_IDLE;
|
2020-08-10 00:21:45 -05:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2020-09-26 03:28:30 +10:00
|
|
|
}
|
2020-08-10 00:21:45 -05:00
|
|
|
|
2021-10-04 23:52:23 +11:00
|
|
|
// WIP state.
|
|
|
|
// State: LS_CRAWL_FORWARD (81)
|
|
|
|
// Collision: lara_col_crawl()
|
2021-02-03 01:50:59 -03:00
|
|
|
void lara_as_crawl(ITEM_INFO* item, COLL_INFO* coll)
|
2021-10-04 23:52:23 +11:00
|
|
|
{
|
2021-10-24 13:27:46 +11:00
|
|
|
Lara.gunStatus = LG_HANDS_BUSY;
|
2021-10-04 23:52:23 +11:00
|
|
|
coll->Setup.EnableSpaz = false;
|
|
|
|
coll->Setup.EnableObjectPush = true;
|
|
|
|
|
|
|
|
Camera.targetElevation = -ANGLE(23.0f);
|
|
|
|
|
|
|
|
if (item->hitPoints <= 0)
|
|
|
|
{
|
2021-10-18 20:15:53 +11:00
|
|
|
item->goalAnimState = LS_DEATH;
|
2021-10-04 23:52:23 +11:00
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (TrInput & IN_LEFT)
|
|
|
|
{
|
|
|
|
Lara.turnRate -= LARA_TURN_RATE;
|
|
|
|
if (Lara.turnRate < -LARA_SLOW_TURN)
|
|
|
|
Lara.turnRate = -LARA_SLOW_TURN;
|
|
|
|
|
|
|
|
// TODO: Flexing.
|
|
|
|
/*Lara.headZrot -= (Lara.headZrot + LARA_CRAWL_FLEX) / 12;
|
|
|
|
Lara.torsoZrot = Lara.headZrot;*/
|
|
|
|
}
|
|
|
|
else if (TrInput & IN_RIGHT)
|
|
|
|
{
|
|
|
|
Lara.turnRate += LARA_TURN_RATE;
|
|
|
|
if (Lara.turnRate > LARA_SLOW_TURN)
|
|
|
|
Lara.turnRate = LARA_SLOW_TURN;
|
|
|
|
|
|
|
|
/*Lara.headZrot += (LARA_CRAWL_FLEX - Lara.headZrot) / 12;
|
|
|
|
Lara.torsoZrot = Lara.headZrot;*/
|
|
|
|
}
|
|
|
|
|
2021-10-16 20:50:16 +11:00
|
|
|
// TEMP
|
2021-10-16 21:52:45 +11:00
|
|
|
Lara.keepDucked = TestLaraKeepDucked(coll);
|
2021-10-16 20:50:16 +11:00
|
|
|
|
2021-10-22 00:07:24 +11:00
|
|
|
// TODO: Probe ahead please.
|
2021-10-13 19:50:46 +11:00
|
|
|
if ((TrInput & IN_DUCK || Lara.keepDucked) &&
|
|
|
|
Lara.waterStatus != LW_WADE)
|
2021-10-04 23:52:23 +11:00
|
|
|
{
|
2021-10-28 15:25:25 +11:00
|
|
|
if (TrInput & IN_SPRINT)
|
|
|
|
{
|
|
|
|
item->goalAnimState = LS_CRAWL_IDLE;
|
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2021-10-04 23:52:23 +11:00
|
|
|
if (TrInput & IN_FORWARD)
|
|
|
|
{
|
2021-10-28 15:25:25 +11:00
|
|
|
if (TrInput & (IN_ACTION | IN_JUMP) &&
|
2021-10-24 20:43:02 +11:00
|
|
|
TestLaraCrawlVault(item, coll))
|
|
|
|
{
|
|
|
|
DoLaraCrawlVault(item, coll);
|
2021-10-28 23:22:28 +11:00
|
|
|
|
|
|
|
return;
|
2021-10-24 20:43:02 +11:00
|
|
|
}
|
2021-10-28 23:22:28 +11:00
|
|
|
else if (TestLaraCrawlForward(item, coll) &&
|
|
|
|
coll->CollisionType != CT_FRONT &&
|
|
|
|
coll->CollisionType != CT_TOP_FRONT) [[likely]]
|
|
|
|
{
|
2021-10-24 20:43:02 +11:00
|
|
|
item->goalAnimState = LS_CRAWL_FORWARD;
|
2021-10-04 23:52:23 +11:00
|
|
|
|
2021-10-28 23:22:28 +11:00
|
|
|
return;
|
|
|
|
}
|
2021-10-04 23:52:23 +11:00
|
|
|
}
|
|
|
|
|
|
|
|
item->goalAnimState = LS_CRAWL_IDLE;
|
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
item->goalAnimState = LS_CRAWL_IDLE;
|
|
|
|
}
|
|
|
|
|
|
|
|
// LEGACY
|
|
|
|
void old_lara_as_crawl(ITEM_INFO* item, COLL_INFO* coll)
|
2020-09-26 03:28:30 +10:00
|
|
|
{
|
2020-09-26 05:06:08 +10:00
|
|
|
/*state 81*/
|
|
|
|
/*collision: lara_col_crawl*/
|
2021-07-09 19:41:56 -05:00
|
|
|
if (item->hitPoints <= 0)
|
2020-09-26 05:06:08 +10:00
|
|
|
{
|
|
|
|
item->goalAnimState = LS_CRAWL_IDLE;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (TrInput & IN_LOOK)
|
|
|
|
LookUpDown();
|
|
|
|
|
|
|
|
Lara.torsoXrot = 0;
|
2020-08-10 00:21:45 -05:00
|
|
|
Lara.torsoYrot = 0;
|
|
|
|
|
2021-09-10 00:20:59 +03:00
|
|
|
coll->Setup.EnableSpaz = false;
|
|
|
|
coll->Setup.EnableObjectPush = true;
|
2020-08-10 00:21:45 -05:00
|
|
|
|
2020-09-26 05:06:08 +10:00
|
|
|
Camera.targetElevation = -ANGLE(23.0f);
|
2020-08-10 00:21:45 -05:00
|
|
|
|
2020-09-26 05:06:08 +10:00
|
|
|
if (TrInput & IN_FORWARD
|
|
|
|
&& (TrInput & IN_DUCK || Lara.keepDucked)
|
|
|
|
&& Lara.waterStatus != LW_WADE)
|
2020-08-10 00:21:45 -05:00
|
|
|
{
|
2020-09-26 05:06:08 +10:00
|
|
|
if (TrInput & IN_LEFT)
|
2020-08-10 00:21:45 -05:00
|
|
|
{
|
2020-09-26 05:06:08 +10:00
|
|
|
Lara.turnRate -= LARA_TURN_RATE;
|
2020-08-10 00:21:45 -05:00
|
|
|
|
2020-09-26 05:06:08 +10:00
|
|
|
if (Lara.turnRate < -ANGLE(3.0f))
|
|
|
|
Lara.turnRate = -ANGLE(3.0f);
|
|
|
|
}
|
|
|
|
else if (TrInput & IN_RIGHT)
|
2020-09-26 03:28:30 +10:00
|
|
|
{
|
2020-09-26 05:06:08 +10:00
|
|
|
Lara.turnRate += LARA_TURN_RATE;
|
|
|
|
|
|
|
|
if (Lara.turnRate > ANGLE(3.0f))
|
|
|
|
Lara.turnRate = ANGLE(3.0f);
|
2020-08-10 00:21:45 -05:00
|
|
|
}
|
|
|
|
}
|
2020-09-26 05:06:08 +10:00
|
|
|
else
|
2020-08-10 00:21:45 -05:00
|
|
|
{
|
2020-09-26 05:06:08 +10:00
|
|
|
item->goalAnimState = LS_CRAWL_IDLE;
|
2020-08-10 00:21:45 -05:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-10-11 23:16:02 +11:00
|
|
|
// State: LS_CRAWL_FORWARD (81)
|
|
|
|
// Control: lara_as_crawl()
|
2021-02-03 01:50:59 -03:00
|
|
|
void lara_col_crawl(ITEM_INFO* item, COLL_INFO* coll)
|
2021-10-11 23:16:02 +11:00
|
|
|
{
|
|
|
|
Lara.moveAngle = item->pos.yRot;
|
2021-10-16 21:52:45 +11:00
|
|
|
Lara.keepDucked = TestLaraKeepDucked(coll);
|
2021-10-11 23:16:02 +11:00
|
|
|
Lara.isDucked = true;
|
2021-10-28 23:57:49 +11:00
|
|
|
Lara.torsoXrot = 0;
|
|
|
|
Lara.torsoYrot = 0;
|
2021-10-11 23:16:02 +11:00
|
|
|
item->gravityStatus = false;
|
|
|
|
item->fallspeed = 0;
|
|
|
|
coll->Setup.Radius = LARA_RAD_CRAWL;
|
|
|
|
coll->Setup.Height = LARA_HEIGHT_CRAWL;
|
2021-10-18 20:15:53 +11:00
|
|
|
coll->Setup.BadHeightDown = STEP_SIZE - 1; // Offset of 1 is required or Lara will crawl up/down steps.
|
2021-10-11 23:16:02 +11:00
|
|
|
coll->Setup.BadHeightUp = -(STEP_SIZE - 1);
|
|
|
|
coll->Setup.BadCeilingHeight = LARA_HEIGHT_CRAWL;
|
|
|
|
coll->Setup.SlopesArePits = true;
|
|
|
|
coll->Setup.SlopesAreWalls = true;
|
|
|
|
coll->Setup.ForwardAngle = Lara.moveAngle;
|
|
|
|
GetCollisionInfo(coll, item, true);
|
|
|
|
|
|
|
|
if (LaraDeflectEdgeDuck(item, coll))
|
|
|
|
{
|
|
|
|
item->currentAnimState = LS_CRAWL_IDLE;
|
|
|
|
item->goalAnimState = LS_CRAWL_IDLE;
|
|
|
|
|
|
|
|
if (item->animNumber != LA_CRAWL_IDLE)
|
|
|
|
{
|
|
|
|
item->animNumber = LA_CRAWL_IDLE;
|
|
|
|
item->frameNumber = g_Level.Anims[item->animNumber].frameBase;
|
|
|
|
}
|
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (TestLaraFall(coll))
|
|
|
|
{
|
|
|
|
Lara.gunStatus = LG_NO_ARMS;
|
|
|
|
SetLaraFallState(item);
|
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (TestLaraSlide(item, coll))
|
|
|
|
{
|
|
|
|
SetLaraSlideState(item, coll);
|
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
ShiftItem(item, coll);
|
|
|
|
|
|
|
|
if (TestLaraStep(coll))
|
|
|
|
{
|
|
|
|
DoLaraStep(item, coll);
|
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
// LEGACY step.
|
|
|
|
/*if (coll->Middle.Floor != NO_HEIGHT && coll->Middle.Floor > -256)
|
|
|
|
item->pos.yPos += coll->Middle.Floor;*/
|
|
|
|
}
|
|
|
|
|
|
|
|
// LEGACY
|
|
|
|
void old_lara_col_crawl(ITEM_INFO* item, COLL_INFO* coll)
|
2020-08-10 00:21:45 -05:00
|
|
|
{
|
2020-09-26 05:06:08 +10:00
|
|
|
/*state 81*/
|
|
|
|
/*state code: lara_as_crawl*/
|
2020-08-10 00:21:45 -05:00
|
|
|
item->gravityStatus = false;
|
|
|
|
item->fallspeed = 0;
|
|
|
|
|
2020-12-19 23:34:52 -03:00
|
|
|
Lara.moveAngle = item->pos.yRot;
|
2020-09-26 05:06:08 +10:00
|
|
|
|
2021-09-10 01:22:27 +03:00
|
|
|
coll->Setup.Radius = LARA_RAD_CRAWL;
|
2021-09-19 06:42:24 +03:00
|
|
|
coll->Setup.Height = LARA_HEIGHT_CRAWL;
|
2021-09-19 17:48:32 +03:00
|
|
|
coll->Setup.BadHeightDown = STEP_SIZE - 1;
|
|
|
|
coll->Setup.BadHeightUp = -127;
|
2021-09-13 09:47:37 +03:00
|
|
|
coll->Setup.BadCeilingHeight = LARA_HEIGHT_CRAWL;
|
2021-09-10 00:20:59 +03:00
|
|
|
coll->Setup.SlopesArePits = true;
|
|
|
|
coll->Setup.SlopesAreWalls = true;
|
|
|
|
coll->Setup.ForwardAngle = Lara.moveAngle;
|
2020-08-10 00:21:45 -05:00
|
|
|
|
2021-09-19 06:42:24 +03:00
|
|
|
GetCollisionInfo(coll, item, true);
|
2020-08-10 00:21:45 -05:00
|
|
|
|
2020-09-26 05:06:08 +10:00
|
|
|
if (LaraDeflectEdgeDuck(item, coll))
|
2020-08-10 00:21:45 -05:00
|
|
|
{
|
|
|
|
item->currentAnimState = LS_CRAWL_IDLE;
|
|
|
|
item->goalAnimState = LS_CRAWL_IDLE;
|
|
|
|
|
|
|
|
if (item->animNumber != LA_CRAWL_IDLE)
|
|
|
|
{
|
|
|
|
item->animNumber = LA_CRAWL_IDLE;
|
|
|
|
item->frameNumber = g_Level.Anims[item->animNumber].frameBase;
|
|
|
|
}
|
|
|
|
}
|
2020-09-26 05:06:08 +10:00
|
|
|
else if (LaraFallen(item, coll))
|
2020-08-10 00:21:45 -05:00
|
|
|
{
|
|
|
|
Lara.gunStatus = LG_NO_ARMS;
|
|
|
|
}
|
2020-09-26 05:06:08 +10:00
|
|
|
else if (!TestLaraSlide(item, coll))
|
2020-08-10 00:21:45 -05:00
|
|
|
{
|
2020-09-26 05:06:08 +10:00
|
|
|
ShiftItem(item, coll);
|
2020-08-10 00:21:45 -05:00
|
|
|
|
2021-09-10 00:18:47 +03:00
|
|
|
if (coll->Middle.Floor != NO_HEIGHT && coll->Middle.Floor > -256)
|
|
|
|
item->pos.yPos += coll->Middle.Floor;
|
2020-08-10 00:21:45 -05:00
|
|
|
}
|
2020-09-26 03:28:30 +10:00
|
|
|
}
|
2020-08-10 00:21:45 -05:00
|
|
|
|
2021-10-11 23:16:02 +11:00
|
|
|
// State: LS_CRAWL_BACK (86)
|
2021-10-05 00:12:22 +11:00
|
|
|
// Collision: lara_col_crawlb()
|
2021-02-03 01:50:59 -03:00
|
|
|
void lara_as_crawlb(ITEM_INFO* item, COLL_INFO* coll)
|
2021-10-05 00:12:22 +11:00
|
|
|
{
|
2021-10-24 13:27:46 +11:00
|
|
|
Lara.gunStatus = LG_HANDS_BUSY;
|
2021-10-05 00:12:22 +11:00
|
|
|
coll->Setup.EnableSpaz = false;
|
|
|
|
coll->Setup.EnableObjectPush = true;
|
|
|
|
|
|
|
|
Camera.targetElevation = -ANGLE(23.0f);
|
|
|
|
|
|
|
|
if (item->hitPoints <= 0)
|
|
|
|
{
|
2021-10-06 14:03:12 +11:00
|
|
|
item->goalAnimState = LS_DEATH;
|
2021-10-05 00:12:22 +11:00
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (TrInput & IN_LEFT)
|
|
|
|
{
|
2021-10-05 18:03:37 +11:00
|
|
|
Lara.turnRate -= LARA_TURN_RATE;
|
|
|
|
if (Lara.turnRate < -LARA_SLOW_TURN)
|
|
|
|
Lara.turnRate = -LARA_SLOW_TURN;
|
2021-10-05 00:12:22 +11:00
|
|
|
|
|
|
|
// TODO: Flexing.
|
|
|
|
/*Lara.headZrot -= (Lara.headZrot + LARA_CRAWL_FLEX) / 12;
|
|
|
|
Lara.torsoZrot = Lara.headZrot;*/
|
|
|
|
}
|
|
|
|
else if (TrInput & IN_RIGHT)
|
|
|
|
{
|
2021-10-05 18:03:37 +11:00
|
|
|
Lara.turnRate += LARA_TURN_RATE;
|
|
|
|
if (Lara.turnRate > LARA_SLOW_TURN)
|
|
|
|
Lara.turnRate = LARA_SLOW_TURN;
|
2021-10-05 00:12:22 +11:00
|
|
|
|
|
|
|
/*Lara.headZrot += (LARA_CRAWL_FLEX - Lara.headZrot) / 12;
|
|
|
|
Lara.torsoZrot = Lara.headZrot;*/
|
|
|
|
}
|
|
|
|
|
|
|
|
if ((TrInput & IN_DUCK || Lara.keepDucked)
|
|
|
|
&& Lara.waterStatus != LW_WADE)
|
|
|
|
{
|
|
|
|
if (TrInput & IN_BACK)
|
|
|
|
{
|
2021-10-18 15:22:38 +11:00
|
|
|
// TODO: Not quite working.
|
2021-10-28 15:25:25 +11:00
|
|
|
if (TrInput & (IN_ACTION | IN_JUMP) &&
|
2021-10-18 15:22:38 +11:00
|
|
|
TestLaraCrawlToHang(item, coll))
|
|
|
|
{
|
|
|
|
DoLaraCrawlToHangSnap(item, coll);
|
|
|
|
item->goalAnimState = LS_CRAWL_TO_HANG;
|
|
|
|
}
|
|
|
|
else [[likely]]
|
|
|
|
item->goalAnimState = LS_CRAWL_BACK;
|
2021-10-05 00:12:22 +11:00
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
item->goalAnimState = LS_CRAWL_IDLE;
|
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
item->goalAnimState = LS_CRAWL_IDLE;
|
|
|
|
}
|
|
|
|
|
2021-10-11 23:16:02 +11:00
|
|
|
// State: LS_CRAWL_BACK (86)
|
|
|
|
// Control: lara_as_crawlb()
|
|
|
|
void lara_col_crawlb(ITEM_INFO* item, COLL_INFO* coll)
|
2020-09-26 05:06:08 +10:00
|
|
|
{
|
2021-10-11 23:16:02 +11:00
|
|
|
Lara.moveAngle = item->pos.yRot + ANGLE(180.0f);
|
2021-10-16 21:52:45 +11:00
|
|
|
Lara.keepDucked = TestLaraKeepDucked(coll);
|
2021-10-11 23:16:02 +11:00
|
|
|
Lara.isDucked = true;
|
|
|
|
item->gravityStatus = false;
|
|
|
|
item->fallspeed = 0;
|
|
|
|
coll->Setup.Radius = LARA_RAD_CRAWL;
|
|
|
|
coll->Setup.Height = LARA_HEIGHT_CRAWL;
|
2021-10-18 20:15:53 +11:00
|
|
|
coll->Setup.BadHeightDown = STEP_SIZE - 1; // Offset of 1 is required or Lara will crawl up/down steps.
|
2021-10-11 23:16:02 +11:00
|
|
|
coll->Setup.BadHeightUp = -(STEP_SIZE - 1);
|
|
|
|
coll->Setup.BadCeilingHeight = LARA_HEIGHT_CRAWL;
|
|
|
|
coll->Setup.SlopesArePits = true;
|
|
|
|
coll->Setup.SlopesAreWalls = true;
|
|
|
|
coll->Setup.ForwardAngle = Lara.moveAngle;
|
|
|
|
GetCollisionInfo(coll, item, true);
|
|
|
|
|
|
|
|
// TODO: Binoculars?
|
|
|
|
|
|
|
|
// TODO: Generic deflect.
|
|
|
|
if (LaraDeflectEdgeDuck(item, coll))
|
2020-08-10 00:21:45 -05:00
|
|
|
{
|
2021-10-11 23:16:02 +11:00
|
|
|
item->currentAnimState = LS_CRAWL_IDLE;
|
2020-09-26 05:06:08 +10:00
|
|
|
item->goalAnimState = LS_CRAWL_IDLE;
|
2020-08-10 00:21:45 -05:00
|
|
|
|
2021-10-11 23:16:02 +11:00
|
|
|
if (item->animNumber != LA_CRAWL_IDLE)
|
|
|
|
{
|
|
|
|
item->animNumber = LA_CRAWL_IDLE;
|
|
|
|
item->frameNumber = g_Level.Anims[item->animNumber].frameBase;
|
|
|
|
}
|
2020-08-10 00:21:45 -05:00
|
|
|
|
2021-10-11 23:16:02 +11:00
|
|
|
return;
|
|
|
|
}
|
2020-08-10 00:21:45 -05:00
|
|
|
|
2021-10-11 23:16:02 +11:00
|
|
|
if (TestLaraFall(coll))
|
|
|
|
{
|
|
|
|
Lara.gunStatus = LG_NO_ARMS;
|
|
|
|
SetLaraFallState(item);
|
2020-08-10 00:21:45 -05:00
|
|
|
|
2021-10-11 23:16:02 +11:00
|
|
|
return;
|
|
|
|
}
|
2020-08-10 00:21:45 -05:00
|
|
|
|
2021-10-11 23:16:02 +11:00
|
|
|
if (TestLaraSlide(item, coll))
|
2020-08-10 00:21:45 -05:00
|
|
|
{
|
2021-10-11 23:16:02 +11:00
|
|
|
SetLaraSlideState(item, coll);
|
|
|
|
|
|
|
|
return;
|
2020-08-10 00:21:45 -05:00
|
|
|
}
|
2021-10-11 23:16:02 +11:00
|
|
|
|
|
|
|
ShiftItem(item, coll);
|
|
|
|
|
|
|
|
|
|
|
|
if (TestLaraStep(coll))
|
2020-08-10 00:21:45 -05:00
|
|
|
{
|
2021-10-11 23:16:02 +11:00
|
|
|
DoLaraStep(item, coll);
|
|
|
|
|
|
|
|
return;
|
2020-08-10 00:21:45 -05:00
|
|
|
}
|
2021-10-11 23:16:02 +11:00
|
|
|
|
|
|
|
// LEGACY step
|
|
|
|
/*if (coll->Middle.Floor != NO_HEIGHT && coll->Middle.Floor > -STEP_SIZE)
|
|
|
|
item->pos.yPos += coll->Middle.Floor;*/
|
2020-08-10 00:21:45 -05:00
|
|
|
}
|
|
|
|
|
2021-10-11 23:16:02 +11:00
|
|
|
// LEGACY
|
|
|
|
void old_lara_col_crawlb(ITEM_INFO* item, COLL_INFO* coll)
|
2020-08-10 00:21:45 -05:00
|
|
|
{
|
2020-09-26 05:06:08 +10:00
|
|
|
/*state 86*/
|
|
|
|
/*state code: lara_as_crawlb*/
|
2020-08-10 00:21:45 -05:00
|
|
|
item->gravityStatus = false;
|
|
|
|
item->fallspeed = 0;
|
|
|
|
|
2021-09-19 06:42:24 +03:00
|
|
|
Lara.moveAngle = item->pos.yRot + ANGLE(180);
|
|
|
|
|
2021-09-10 01:22:27 +03:00
|
|
|
coll->Setup.Radius = LARA_RAD_CRAWL + 50; // TODO: Check if it still works without 50?
|
2021-09-19 06:42:24 +03:00
|
|
|
coll->Setup.Height = LARA_HEIGHT_CRAWL;
|
2021-09-19 17:48:32 +03:00
|
|
|
coll->Setup.BadHeightDown = STEP_SIZE - 1;
|
|
|
|
coll->Setup.BadHeightUp = -(STEP_SIZE - 1);
|
2021-09-13 09:44:37 +03:00
|
|
|
coll->Setup.BadCeilingHeight = LARA_HEIGHT_CRAWL;
|
2021-09-10 00:20:59 +03:00
|
|
|
coll->Setup.SlopesArePits = true;
|
|
|
|
coll->Setup.SlopesAreWalls = true;
|
2020-09-26 05:06:08 +10:00
|
|
|
|
2021-09-10 00:20:59 +03:00
|
|
|
coll->Setup.ForwardAngle = Lara.moveAngle;
|
2020-08-10 00:21:45 -05:00
|
|
|
|
2021-09-19 06:42:24 +03:00
|
|
|
GetCollisionInfo(coll, item, true);
|
2020-08-10 00:21:45 -05:00
|
|
|
|
2020-09-26 05:06:08 +10:00
|
|
|
if (LaraDeflectEdgeDuck(item, coll))
|
2020-08-10 00:21:45 -05:00
|
|
|
{
|
|
|
|
item->currentAnimState = LS_CRAWL_IDLE;
|
|
|
|
item->goalAnimState = LS_CRAWL_IDLE;
|
|
|
|
|
|
|
|
if (item->animNumber != LA_CRAWL_IDLE)
|
|
|
|
{
|
|
|
|
item->animNumber = LA_CRAWL_IDLE;
|
|
|
|
item->frameNumber = g_Level.Anims[item->animNumber].frameBase;
|
|
|
|
}
|
|
|
|
}
|
2020-09-26 05:06:08 +10:00
|
|
|
else if (LaraFallen(item, coll))
|
2020-08-10 00:21:45 -05:00
|
|
|
{
|
|
|
|
Lara.gunStatus = LG_NO_ARMS;
|
|
|
|
}
|
2020-09-26 05:06:08 +10:00
|
|
|
else if (!TestLaraSlide(item, coll))
|
2020-08-10 00:21:45 -05:00
|
|
|
{
|
2020-09-26 05:06:08 +10:00
|
|
|
ShiftItem(item, coll);
|
2020-08-10 00:21:45 -05:00
|
|
|
|
2021-09-13 09:47:37 +03:00
|
|
|
if (coll->Middle.Floor != NO_HEIGHT && coll->Middle.Floor > -STEP_SIZE)
|
2021-09-10 00:18:47 +03:00
|
|
|
item->pos.yPos += coll->Middle.Floor;
|
2020-08-10 00:21:45 -05:00
|
|
|
|
2020-12-19 23:34:52 -03:00
|
|
|
Lara.moveAngle = item->pos.yRot;
|
2020-08-10 00:21:45 -05:00
|
|
|
}
|
|
|
|
}
|
2021-10-05 15:53:21 +11:00
|
|
|
|
2021-10-05 17:33:32 +11:00
|
|
|
// State: LS_CRAWL_TURN_LEFT (84)
|
2021-10-15 01:37:41 +11:00
|
|
|
// Collision: lara_col_all4turnl()
|
2021-10-05 15:53:21 +11:00
|
|
|
void lara_as_all4turnl(ITEM_INFO* item, COLL_INFO* coll)
|
2021-10-05 17:33:32 +11:00
|
|
|
{
|
2021-10-24 13:27:46 +11:00
|
|
|
Lara.gunStatus = LG_HANDS_BUSY;
|
2021-10-05 17:33:32 +11:00
|
|
|
coll->Setup.EnableSpaz = false;
|
|
|
|
coll->Setup.EnableObjectPush = true;
|
|
|
|
|
|
|
|
Camera.targetElevation = -ANGLE(23.0f);
|
|
|
|
|
|
|
|
if (item->hitPoints <= 0)
|
|
|
|
{
|
|
|
|
item->goalAnimState = LS_DEATH;
|
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
// TODO: Changing Lara.turnRate doesn't work in this state. Find out why.
|
|
|
|
/*Lara.turnRate -= ANGLE(1.5f);
|
|
|
|
if (Lara.turnRate < -LARA_TURN_RATE)
|
|
|
|
Lara.turnRate = -LARA_TURN_RATE;*/
|
|
|
|
item->pos.yRot -= ANGLE(1.5f);
|
|
|
|
|
|
|
|
if ((TrInput & IN_DUCK || Lara.keepDucked)
|
|
|
|
&& Lara.waterStatus != LW_WADE)
|
|
|
|
{
|
2021-10-28 15:25:25 +11:00
|
|
|
if (TrInput & IN_SPRINT)
|
|
|
|
{
|
|
|
|
item->goalAnimState = LS_CRAWL_IDLE;
|
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2021-10-22 00:07:24 +11:00
|
|
|
if (TrInput & IN_FORWARD &&
|
|
|
|
coll->CollisionType != CT_FRONT &&
|
2021-10-28 15:25:25 +11:00
|
|
|
coll->CollisionType != CT_TOP_FRONT &&
|
|
|
|
TestLaraCrawlForward(item, coll))
|
2021-10-05 17:33:32 +11:00
|
|
|
{
|
2021-10-28 15:25:25 +11:00
|
|
|
item->goalAnimState = LS_CRAWL_FORWARD;
|
2021-10-05 17:33:32 +11:00
|
|
|
|
2021-10-28 15:25:25 +11:00
|
|
|
return;
|
2021-10-05 17:33:32 +11:00
|
|
|
}
|
|
|
|
|
2021-10-22 00:07:24 +11:00
|
|
|
if (TrInput & IN_BACK &&
|
2021-10-24 20:43:02 +11:00
|
|
|
TestLaraCrawlBack(item, coll))
|
2021-10-05 17:33:32 +11:00
|
|
|
{
|
|
|
|
item->goalAnimState = LS_CRAWL_BACK;
|
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
// TODO: Allow for more granular turning. The animation needs to cancel, however.
|
|
|
|
/*Lara.turnRate -= ANGLE(1.5f);
|
|
|
|
if (Lara.turnRate < -LARA_TURN_RATE)
|
|
|
|
Lara.turnRate = -LARA_TURN_RATE;*/
|
|
|
|
if (TrInput & IN_LEFT)
|
|
|
|
{
|
|
|
|
item->goalAnimState = LS_CRAWL_TURN_LEFT;
|
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
item->goalAnimState = LS_CRAWL_IDLE;
|
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2021-10-18 20:15:53 +11:00
|
|
|
item->goalAnimState = LS_CRAWL_IDLE; // TODO: In the future, with animation blending, dispatch directly to LS_CRAWL_STOP. @Sezz 2021.10.18
|
2021-10-05 17:33:32 +11:00
|
|
|
}
|
|
|
|
|
|
|
|
// LEGACY
|
|
|
|
void old_lara_as_all4turnl(ITEM_INFO* item, COLL_INFO* coll)
|
2021-10-05 15:53:21 +11:00
|
|
|
{
|
|
|
|
/*state 84*/
|
|
|
|
/*collision: lara_col_all4turnlr*/
|
|
|
|
if (item->hitPoints <= 0)
|
|
|
|
{
|
|
|
|
item->goalAnimState = LS_CRAWL_IDLE;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
coll->Setup.EnableSpaz = false;
|
|
|
|
coll->Setup.EnableObjectPush = true;
|
|
|
|
Lara.torsoYrot = 0;
|
|
|
|
Lara.torsoXrot = 0;
|
|
|
|
Camera.targetElevation = -ANGLE(23.0f);
|
|
|
|
item->pos.yRot -= ANGLE(1.5f);
|
|
|
|
|
|
|
|
if (!(TrInput & IN_LEFT))
|
|
|
|
item->goalAnimState = LS_CRAWL_IDLE;
|
|
|
|
}
|
|
|
|
|
2021-10-15 01:37:41 +11:00
|
|
|
// State: LS_CRAWL_TURN_LEFT (84)
|
|
|
|
// Control: lara_as_all4turnl()
|
|
|
|
void lara_col_all4turnl(ITEM_INFO* item, COLL_INFO* coll)
|
|
|
|
{
|
2021-10-18 20:15:53 +11:00
|
|
|
lara_col_all4s(item, coll);
|
2021-10-15 01:37:41 +11:00
|
|
|
}
|
|
|
|
|
2021-10-05 17:33:32 +11:00
|
|
|
// State: LS_CRAWL_TURN_RIGHT (85)
|
2021-10-15 01:37:41 +11:00
|
|
|
// Collision: lara_col_all4turnr()
|
2021-10-05 15:53:21 +11:00
|
|
|
void lara_as_all4turnr(ITEM_INFO* item, COLL_INFO* coll)
|
2021-10-05 17:33:32 +11:00
|
|
|
{
|
2021-10-24 13:27:46 +11:00
|
|
|
Lara.gunStatus = LG_HANDS_BUSY;
|
2021-10-05 17:33:32 +11:00
|
|
|
coll->Setup.EnableSpaz = false;
|
|
|
|
coll->Setup.EnableObjectPush = true;
|
|
|
|
|
|
|
|
Camera.targetElevation = -ANGLE(23.0f);
|
|
|
|
|
|
|
|
if (item->hitPoints <= 0)
|
|
|
|
{
|
|
|
|
item->goalAnimState = LS_DEATH;
|
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
item->pos.yRot += ANGLE(1.5f);
|
|
|
|
|
|
|
|
if ((TrInput & IN_DUCK || Lara.keepDucked)
|
|
|
|
&& Lara.waterStatus != LW_WADE)
|
|
|
|
{
|
2021-10-28 15:25:25 +11:00
|
|
|
if (TrInput & IN_SPRINT)
|
|
|
|
{
|
|
|
|
item->goalAnimState = LS_CRAWL_IDLE;
|
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2021-10-22 00:07:24 +11:00
|
|
|
if (TrInput & IN_FORWARD &&
|
|
|
|
coll->CollisionType != CT_FRONT &&
|
2021-10-28 15:25:25 +11:00
|
|
|
coll->CollisionType != CT_TOP_FRONT &&
|
|
|
|
TestLaraCrawlForward(item, coll))
|
2021-10-05 17:33:32 +11:00
|
|
|
{
|
2021-10-28 15:25:25 +11:00
|
|
|
item->goalAnimState = LS_CRAWL_FORWARD;
|
2021-10-05 17:33:32 +11:00
|
|
|
|
2021-10-28 15:25:25 +11:00
|
|
|
return;
|
2021-10-05 17:33:32 +11:00
|
|
|
}
|
|
|
|
|
2021-10-22 00:07:24 +11:00
|
|
|
if (TrInput & IN_BACK &&
|
2021-10-24 20:43:02 +11:00
|
|
|
TestLaraCrawlBack(item, coll))
|
2021-10-05 17:33:32 +11:00
|
|
|
{
|
|
|
|
item->goalAnimState = LS_CRAWL_BACK;
|
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (TrInput & IN_RIGHT)
|
|
|
|
{
|
|
|
|
item->goalAnimState = LS_CRAWL_TURN_RIGHT;
|
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
item->goalAnimState = LS_CRAWL_IDLE;
|
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
item->goalAnimState = LS_CRAWL_IDLE;
|
|
|
|
}
|
|
|
|
|
|
|
|
// LEGACY
|
|
|
|
void old_lara_as_all4turnr(ITEM_INFO* item, COLL_INFO* coll)
|
2021-10-05 15:53:21 +11:00
|
|
|
{
|
|
|
|
/*state 85*/
|
|
|
|
/*collision: lara_col_all4turnlr*/
|
|
|
|
if (item->hitPoints <= 0)
|
|
|
|
{
|
|
|
|
item->goalAnimState = LS_CRAWL_IDLE;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
coll->Setup.EnableSpaz = false;
|
|
|
|
coll->Setup.EnableObjectPush = true;
|
|
|
|
Lara.torsoYrot = 0;
|
|
|
|
Lara.torsoXrot = 0;
|
|
|
|
Camera.targetElevation = -ANGLE(23.0f);
|
|
|
|
item->pos.yRot += ANGLE(1.5f);
|
|
|
|
|
|
|
|
if (!(TrInput & IN_RIGHT))
|
|
|
|
item->goalAnimState = LS_CRAWL_IDLE;
|
|
|
|
}
|
|
|
|
|
2021-10-15 01:37:41 +11:00
|
|
|
// State: LS_CRAWL_TURN_RIGHT (85)
|
|
|
|
// Control: lara_as_all4turnr()
|
|
|
|
void lara_col_all4turnr(ITEM_INFO* item, COLL_INFO* coll)
|
2021-10-11 23:16:02 +11:00
|
|
|
{
|
2021-10-18 20:15:53 +11:00
|
|
|
lara_col_all4s(item, coll);
|
2021-10-11 23:16:02 +11:00
|
|
|
}
|
|
|
|
|
|
|
|
// LEGACY
|
|
|
|
void old_lara_col_all4turnlr(ITEM_INFO* item, COLL_INFO* coll)
|
2021-10-05 15:53:21 +11:00
|
|
|
{
|
|
|
|
/*states 84 and 85*/
|
|
|
|
/*state code: lara_as_all4turnl(84) and lara_as_all4turnr(85)*/
|
|
|
|
coll->Setup.Height = LARA_HEIGHT_CRAWL;
|
|
|
|
GetCollisionInfo(coll, item);
|
|
|
|
|
|
|
|
if (!TestLaraSlide(item, coll))
|
|
|
|
{
|
|
|
|
if (coll->Middle.Floor != NO_HEIGHT && coll->Middle.Floor > -256)
|
|
|
|
item->pos.yPos += coll->Middle.Floor;
|
|
|
|
}
|
|
|
|
}
|
2020-08-11 03:55:34 -05:00
|
|
|
|
2021-02-03 01:50:59 -03:00
|
|
|
void lara_col_crawl2hang(ITEM_INFO* item, COLL_INFO* coll)
|
2020-08-11 03:55:34 -05:00
|
|
|
{
|
|
|
|
Camera.targetAngle = 0;
|
|
|
|
Camera.targetElevation = -ANGLE(45.0f);
|
|
|
|
|
2021-09-10 00:20:59 +03:00
|
|
|
coll->Setup.EnableSpaz = false;
|
|
|
|
coll->Setup.EnableObjectPush = false;
|
2020-08-11 03:55:34 -05:00
|
|
|
|
|
|
|
if (item->animNumber == LA_CRAWL_TO_HANG_END)
|
|
|
|
{
|
|
|
|
int edgeCatch;
|
|
|
|
int edge;
|
|
|
|
|
2021-10-19 17:32:46 +11:00
|
|
|
item->fallspeed = STEP_SIZE * 2;
|
|
|
|
item->pos.yPos += STEP_SIZE - 1;
|
2020-08-11 03:55:34 -05:00
|
|
|
|
2021-09-19 06:42:24 +03:00
|
|
|
coll->Setup.Height = LARA_HEIGHT_STRETCH;
|
2021-09-19 17:48:32 +03:00
|
|
|
coll->Setup.BadHeightDown = NO_BAD_POS;
|
|
|
|
coll->Setup.BadHeightUp = -STEPUP_HEIGHT;
|
2021-09-10 00:20:59 +03:00
|
|
|
coll->Setup.BadCeilingHeight = BAD_JUMP_CEILING;
|
2021-09-19 06:42:24 +03:00
|
|
|
coll->Setup.ForwardAngle = Lara.moveAngle;
|
2020-09-26 05:06:08 +10:00
|
|
|
|
2020-12-19 23:34:52 -03:00
|
|
|
Lara.moveAngle = item->pos.yRot;
|
2020-08-11 03:55:34 -05:00
|
|
|
|
2021-09-19 06:42:24 +03:00
|
|
|
GetCollisionInfo(coll, item);
|
2021-09-14 00:30:44 +03:00
|
|
|
edgeCatch = TestLaraEdgeCatch(item, coll, &edge);
|
2020-09-26 05:06:08 +10:00
|
|
|
|
2020-08-11 03:55:34 -05:00
|
|
|
if (edgeCatch)
|
|
|
|
{
|
2021-09-14 00:30:44 +03:00
|
|
|
if (edgeCatch >= 0 || TestLaraHangOnClimbWall(item, coll))
|
2020-08-11 03:55:34 -05:00
|
|
|
{
|
|
|
|
short angle = item->pos.yRot;
|
|
|
|
if (SnapToQuadrant(angle, 35))
|
|
|
|
{
|
|
|
|
BOUNDING_BOX* bounds;
|
|
|
|
|
|
|
|
if (TestHangSwingIn(item, angle))
|
|
|
|
{
|
|
|
|
|
|
|
|
Lara.headYrot = 0;
|
|
|
|
Lara.headXrot = 0;
|
|
|
|
Lara.torsoYrot = 0;
|
|
|
|
Lara.torsoXrot = 0;
|
|
|
|
item->animNumber = LA_JUMP_UP_TO_MONKEYSWING;
|
|
|
|
item->frameNumber = g_Level.Anims[item->animNumber].frameBase;
|
|
|
|
item->currentAnimState = LS_MONKEYSWING_IDLE;
|
|
|
|
item->goalAnimState = LS_MONKEYSWING_IDLE;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2021-07-09 19:41:56 -05:00
|
|
|
if (TestHangFeet(item, angle))
|
2020-08-11 03:55:34 -05:00
|
|
|
{
|
|
|
|
item->animNumber = LA_REACH_TO_HANG;
|
2021-10-19 17:32:46 +11:00
|
|
|
item->frameNumber = g_Level.Anims[item->animNumber].frameBase + 12;
|
2020-08-11 03:55:34 -05:00
|
|
|
item->currentAnimState = LS_HANG;
|
|
|
|
item->goalAnimState = LS_HANG_FEET;
|
|
|
|
}
|
2021-07-09 19:41:56 -05:00
|
|
|
else
|
2020-08-11 03:55:34 -05:00
|
|
|
{
|
|
|
|
item->animNumber = LA_REACH_TO_HANG;
|
2021-10-19 17:32:46 +11:00
|
|
|
item->frameNumber = g_Level.Anims[item->animNumber].frameBase + 12;
|
2020-08-11 03:55:34 -05:00
|
|
|
item->currentAnimState = LS_HANG;
|
|
|
|
item->goalAnimState = LS_HANG;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
bounds = GetBoundsAccurate(item);
|
|
|
|
|
|
|
|
if (edgeCatch <= 0)
|
|
|
|
{
|
|
|
|
item->pos.yPos = edge - bounds->Y1;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
|
2021-09-10 00:18:47 +03:00
|
|
|
/* item->pos.xPos += coll->Shift.x;
|
|
|
|
item->pos.zPos += coll->Shift.z;
|
2020-08-11 03:55:34 -05:00
|
|
|
@ORIGINAL_BUG: these two caused teleportation when Lara performed crawl2hang on triangulated geometry. replacing with shifts to the edges of blocks solved it*/
|
|
|
|
|
|
|
|
short angl = (unsigned short)(item->pos.yRot + ANGLE(45.0f)) / ANGLE(90.0f);
|
|
|
|
switch (angl)
|
|
|
|
{
|
|
|
|
case NORTH:
|
|
|
|
item->pos.zPos = (item->pos.zPos | (WALL_SIZE - 1)) - LARA_RAD;
|
|
|
|
break;
|
|
|
|
|
|
|
|
case EAST:
|
|
|
|
item->pos.xPos = (item->pos.xPos | (WALL_SIZE - 1)) - LARA_RAD;
|
|
|
|
break;
|
|
|
|
|
|
|
|
case SOUTH:
|
|
|
|
item->pos.zPos = (item->pos.zPos & -WALL_SIZE) + LARA_RAD;
|
|
|
|
break;
|
|
|
|
|
|
|
|
case WEST:
|
|
|
|
item->pos.xPos = (item->pos.xPos & -WALL_SIZE) + LARA_RAD;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
2021-09-10 00:18:47 +03:00
|
|
|
item->pos.yPos += coll->Front.Floor - bounds->Y1;
|
2020-08-11 03:55:34 -05:00
|
|
|
item->pos.yRot = angle;
|
|
|
|
|
|
|
|
item->gravityStatus = true;
|
|
|
|
item->speed = 2;
|
|
|
|
item->fallspeed = 1;
|
|
|
|
|
|
|
|
Lara.gunStatus = LG_HANDS_BUSY;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|