2020-08-14 17:54:25 -05:00
|
|
|
#include "framework.h"
|
|
|
|
#include "lara.h"
|
|
|
|
#include "lara_basic.h"
|
|
|
|
#include "lara_tests.h"
|
|
|
|
#include "lara_collide.h"
|
|
|
|
#include "lara_slide.h"
|
|
|
|
#include "lara_monkey.h"
|
2021-09-28 01:22:47 +10:00
|
|
|
#include "lara_helpers.h"
|
2020-08-14 17:54:25 -05:00
|
|
|
#include "input.h"
|
2021-09-19 18:29:25 +03:00
|
|
|
#include "level.h"
|
2021-09-25 16:04:16 +03:00
|
|
|
#include "setup.h"
|
2020-08-14 17:54:25 -05:00
|
|
|
#include "health.h"
|
2021-09-19 18:29:25 +03:00
|
|
|
#include "Sound/sound.h"
|
2021-09-16 05:06:03 +03:00
|
|
|
#include "animation.h"
|
2021-09-11 10:13:04 +03:00
|
|
|
#include "pickup.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-25 11:27:47 +02:00
|
|
|
|
2021-10-09 14:39:06 +11:00
|
|
|
// ------------------------------
|
|
|
|
// BASIC MOVEMENT & MISCELLANEOUS
|
2021-10-08 20:08:55 +11:00
|
|
|
// Control & Collision Functions
|
2021-10-09 14:39:06 +11:00
|
|
|
// ------------------------------
|
|
|
|
|
|
|
|
// --------------
|
|
|
|
// MISCELLANEOUS:
|
|
|
|
// --------------
|
2021-10-08 20:08:55 +11:00
|
|
|
|
2021-02-03 01:50:59 -03:00
|
|
|
void lara_void_func(ITEM_INFO* item, COLL_INFO* coll)
|
2020-08-14 17:54:25 -05:00
|
|
|
{
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2021-02-03 01:50:59 -03:00
|
|
|
void lara_default_col(ITEM_INFO* item, COLL_INFO* coll)
|
2020-08-14 17:54:25 -05:00
|
|
|
{
|
2020-12-19 23:34:52 -03:00
|
|
|
Lara.moveAngle = 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.SlopesArePits = true;
|
|
|
|
coll->Setup.SlopesAreWalls = true;
|
|
|
|
coll->Setup.ForwardAngle = Lara.moveAngle;
|
2021-09-19 06:42:24 +03:00
|
|
|
GetCollisionInfo(coll, item);
|
2021-09-25 13:00:14 +03:00
|
|
|
LaraResetGravityStatus(item, coll);
|
2020-08-14 17:54:25 -05:00
|
|
|
}
|
|
|
|
|
2021-02-03 01:50:59 -03:00
|
|
|
void lara_as_special(ITEM_INFO* item, COLL_INFO* coll)
|
2020-08-14 17:54:25 -05:00
|
|
|
{
|
|
|
|
Camera.flags = CF_FOLLOW_CENTER;
|
|
|
|
Camera.targetAngle = ANGLE(170.0f);
|
2020-09-26 05:06:08 +10:00
|
|
|
Camera.targetElevation = -ANGLE(25.0f);
|
2020-08-14 17:54:25 -05:00
|
|
|
}
|
|
|
|
|
2021-02-03 01:50:59 -03:00
|
|
|
void lara_as_null(ITEM_INFO* item, COLL_INFO* coll)
|
2020-08-14 17:54:25 -05:00
|
|
|
{
|
2021-09-10 00:20:59 +03:00
|
|
|
coll->Setup.EnableObjectPush = false;
|
|
|
|
coll->Setup.EnableSpaz = false;
|
2020-08-14 17:54:25 -05:00
|
|
|
}
|
|
|
|
|
2021-02-03 01:50:59 -03:00
|
|
|
void lara_as_controlled(ITEM_INFO* item, COLL_INFO* coll)
|
2020-08-14 17:54:25 -05:00
|
|
|
{
|
|
|
|
Lara.look = false;
|
2021-09-10 00:20:59 +03:00
|
|
|
coll->Setup.EnableObjectPush = false;
|
|
|
|
coll->Setup.EnableSpaz = false;
|
2021-10-09 14:39:06 +11:00
|
|
|
|
2020-08-14 17:54:25 -05:00
|
|
|
if (item->frameNumber == g_Level.Anims[item->animNumber].frameEnd - 1)
|
|
|
|
{
|
|
|
|
Lara.gunStatus = LG_NO_ARMS;
|
2021-10-09 14:39:06 +11:00
|
|
|
|
2020-08-14 17:54:25 -05:00
|
|
|
if (UseForcedFixedCamera)
|
|
|
|
UseForcedFixedCamera = 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-02-03 01:50:59 -03:00
|
|
|
void lara_as_controlledl(ITEM_INFO* item, COLL_INFO* coll)
|
2020-08-14 17:54:25 -05:00
|
|
|
{
|
|
|
|
Lara.look = false;
|
2021-09-10 00:20:59 +03:00
|
|
|
coll->Setup.EnableObjectPush = false;
|
|
|
|
coll->Setup.EnableSpaz = false;
|
2020-08-14 17:54:25 -05:00
|
|
|
}
|
|
|
|
|
2021-10-09 14:39:06 +11:00
|
|
|
// ---------------
|
|
|
|
// BASIC MOVEMENT:
|
|
|
|
// ---------------
|
|
|
|
|
|
|
|
// State: LS_WALK_FORWARD (0)
|
|
|
|
// Collision: lara_col_walk()
|
2021-02-03 01:50:59 -03:00
|
|
|
void lara_as_walk(ITEM_INFO* item, COLL_INFO* coll)
|
2021-10-09 14:39:06 +11:00
|
|
|
{
|
|
|
|
if (item->hitPoints <= 0)
|
|
|
|
{
|
2021-10-24 20:43:02 +11:00
|
|
|
item->goalAnimState = LS_DEATH;
|
2021-10-09 14:39:06 +11:00
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2021-11-01 15:07:42 +11:00
|
|
|
// TODO: Implement item alignment properly. @Sezz 2021.11.01
|
|
|
|
if (Lara.isMoving)
|
|
|
|
return;
|
2021-10-09 14:39:06 +11:00
|
|
|
|
2021-11-02 14:22:58 +11:00
|
|
|
// TODO: If stopping and holding WALK without FORWARD, Lara can't turn. @Sezz 2021.10.09
|
2021-10-09 14:39:06 +11:00
|
|
|
if (TrInput & IN_LEFT)
|
|
|
|
{
|
|
|
|
Lara.turnRate -= LARA_TURN_RATE;
|
|
|
|
if (Lara.turnRate < -LARA_SLOW_TURN)
|
|
|
|
Lara.turnRate = -LARA_SLOW_TURN;
|
|
|
|
|
2021-10-30 12:52:01 +11:00
|
|
|
DoLaraLean(item, coll, -LARA_LEAN_MAX / 3, 16);
|
2021-10-09 14:39:06 +11:00
|
|
|
}
|
|
|
|
else if (TrInput & IN_RIGHT)
|
|
|
|
{
|
|
|
|
Lara.turnRate += LARA_TURN_RATE;
|
|
|
|
if (Lara.turnRate > LARA_SLOW_TURN)
|
|
|
|
Lara.turnRate = LARA_SLOW_TURN;
|
|
|
|
|
2021-10-30 12:52:01 +11:00
|
|
|
DoLaraLean(item, coll, LARA_LEAN_MAX / 3, 16);
|
2021-10-09 14:39:06 +11:00
|
|
|
}
|
|
|
|
|
|
|
|
if (TrInput & IN_FORWARD)
|
|
|
|
{
|
|
|
|
if (Lara.waterStatus == LW_WADE)
|
|
|
|
item->goalAnimState = LS_WADE_FORWARD;
|
2021-11-02 14:22:58 +11:00
|
|
|
else if (TrInput & IN_WALK) [[likely]]
|
2021-10-09 14:39:06 +11:00
|
|
|
item->goalAnimState = LS_WALK_FORWARD;
|
|
|
|
else
|
|
|
|
item->goalAnimState = LS_RUN_FORWARD;
|
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
item->goalAnimState = LS_STOP;
|
|
|
|
}
|
|
|
|
|
|
|
|
// LEGACY
|
|
|
|
void old_lara_as_walk(ITEM_INFO* item, COLL_INFO* coll)
|
2020-08-14 17:54:25 -05:00
|
|
|
{
|
2020-09-26 05:06:08 +10:00
|
|
|
/*state 0*/
|
|
|
|
/*collision: lara_col_walk*/
|
2020-08-14 17:54:25 -05:00
|
|
|
if (item->hitPoints <= 0)
|
|
|
|
{
|
|
|
|
item->goalAnimState = LS_STOP;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2020-09-26 05:06:08 +10:00
|
|
|
if (!Lara.isMoving)
|
2020-09-26 03:28:30 +10:00
|
|
|
{
|
2020-09-26 05:06:08 +10:00
|
|
|
if (TrInput & IN_LEFT)
|
2020-08-14 17:54:25 -05:00
|
|
|
{
|
2020-09-26 05:06:08 +10:00
|
|
|
Lara.turnRate -= LARA_TURN_RATE;
|
2021-10-02 15:44:34 +03:00
|
|
|
if (Lara.turnRate < -LARA_SLOW_TURN)
|
|
|
|
Lara.turnRate = -LARA_SLOW_TURN;
|
2020-08-14 17:54:25 -05:00
|
|
|
}
|
2020-09-26 05:06:08 +10:00
|
|
|
else if (TrInput & IN_RIGHT)
|
2020-08-14 17:54:25 -05:00
|
|
|
{
|
2020-09-26 05:06:08 +10:00
|
|
|
Lara.turnRate += LARA_TURN_RATE;
|
2021-10-02 15:44:34 +03:00
|
|
|
if (Lara.turnRate > LARA_SLOW_TURN)
|
|
|
|
Lara.turnRate = LARA_SLOW_TURN;
|
2020-08-14 17:54:25 -05:00
|
|
|
}
|
|
|
|
|
2020-09-26 05:06:08 +10:00
|
|
|
if (TrInput & IN_FORWARD)
|
2020-09-26 03:28:30 +10:00
|
|
|
{
|
2020-09-26 05:06:08 +10:00
|
|
|
if (Lara.waterStatus == LW_WADE)
|
|
|
|
{
|
|
|
|
item->goalAnimState = LS_WADE_FORWARD;
|
|
|
|
}
|
|
|
|
else if (TrInput & IN_WALK)
|
|
|
|
{
|
|
|
|
item->goalAnimState = LS_WALK_FORWARD;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
item->goalAnimState = LS_RUN_FORWARD;
|
|
|
|
}
|
2020-08-14 17:54:25 -05:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2020-09-26 05:06:08 +10:00
|
|
|
item->goalAnimState = LS_STOP;
|
2020-08-14 17:54:25 -05:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-10-09 14:39:06 +11:00
|
|
|
// State: LA_WALK_FORWARD (0)
|
|
|
|
// Control: lara_as_walk_forward()
|
2021-02-03 01:50:59 -03:00
|
|
|
void lara_col_walk(ITEM_INFO* item, COLL_INFO* coll)
|
2021-10-09 14:39:06 +11:00
|
|
|
{
|
|
|
|
Lara.moveAngle = item->pos.yRot;
|
|
|
|
item->gravityStatus = false;
|
|
|
|
item->fallspeed = 0;
|
|
|
|
coll->Setup.BadHeightDown = STEPUP_HEIGHT;
|
|
|
|
coll->Setup.BadHeightUp = -STEPUP_HEIGHT;
|
|
|
|
coll->Setup.BadCeilingHeight = 0;
|
|
|
|
coll->Setup.SlopesAreWalls = true;
|
|
|
|
coll->Setup.SlopesArePits = true;
|
2021-10-17 20:07:30 +11:00
|
|
|
coll->Setup.DeathFlagIsPit = true;
|
2021-10-09 14:39:06 +11:00
|
|
|
coll->Setup.ForwardAngle = Lara.moveAngle;
|
|
|
|
GetCollisionInfo(coll, item);
|
|
|
|
|
|
|
|
if (TestLaraHitCeiling(coll))
|
|
|
|
{
|
|
|
|
SetLaraHitCeiling(item, coll);
|
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (LaraDeflectEdge(item, coll))
|
|
|
|
{
|
|
|
|
item->goalAnimState = LS_SPLAT;
|
|
|
|
if (GetChange(item, &g_Level.Anims[item->animNumber]))
|
|
|
|
return;
|
|
|
|
|
|
|
|
LaraCollideStop(item, coll);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (TestLaraFall(coll))
|
|
|
|
{
|
|
|
|
SetLaraFallState(item);
|
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2021-11-05 21:29:00 +11:00
|
|
|
if (TestLaraSlide(item, coll))
|
2021-10-09 16:56:07 +11:00
|
|
|
return;
|
|
|
|
|
2021-10-17 20:07:30 +11:00
|
|
|
if (TestLaraVault(item, coll))
|
|
|
|
return;
|
|
|
|
|
2021-10-28 23:22:28 +11:00
|
|
|
if (TestLaraStep(coll) &&
|
|
|
|
coll->CollisionType != CT_FRONT)
|
2021-10-09 14:39:06 +11:00
|
|
|
{
|
|
|
|
DoLaraStep(item, coll);
|
|
|
|
|
2021-10-09 16:56:07 +11:00
|
|
|
return;
|
2021-10-09 14:39:06 +11:00
|
|
|
}
|
|
|
|
|
2021-10-09 23:00:26 +11:00
|
|
|
// LEGACY step
|
2021-10-09 14:39:06 +11:00
|
|
|
/*if (coll->Middle.Floor > STEP_SIZE / 2)
|
|
|
|
{
|
|
|
|
if (coll->Front.Floor == NO_HEIGHT || coll->Front.Floor <= STEP_SIZE / 2)
|
|
|
|
{
|
|
|
|
coll->Middle.Floor = 0;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
item->goalAnimState = LS_STEP_DOWN;
|
|
|
|
GetChange(item, &g_Level.Anims[item->animNumber]);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (coll->Middle.Floor >= -STEPUP_HEIGHT && coll->Middle.Floor < -STEP_SIZE / 2)
|
|
|
|
{
|
|
|
|
if (coll->Front.Floor == NO_HEIGHT ||
|
|
|
|
coll->Front.Floor < -STEPUP_HEIGHT ||
|
|
|
|
coll->Front.Floor >= -STEP_SIZE / 2)
|
|
|
|
{
|
|
|
|
coll->Middle.Floor = 0;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
item->goalAnimState = LS_STEP_UP;
|
|
|
|
GetChange(item, &g_Level.Anims[item->animNumber]);
|
|
|
|
}
|
|
|
|
}*/
|
|
|
|
}
|
|
|
|
|
|
|
|
// LEGACY
|
|
|
|
void old_lara_col_walk(ITEM_INFO* item, COLL_INFO* coll)
|
2020-08-14 17:54:25 -05:00
|
|
|
{
|
2020-09-26 05:06:08 +10:00
|
|
|
/*state 0*/
|
|
|
|
/*state code: lara_as_walk*/
|
2020-08-14 17:54:25 -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 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;
|
2020-09-26 05:06:08 +10:00
|
|
|
|
2021-09-10 00:20:59 +03:00
|
|
|
coll->Setup.SlopesAreWalls = true;
|
|
|
|
coll->Setup.SlopesArePits = true;
|
2021-09-13 09:55:54 +03:00
|
|
|
coll->Setup.DeathFlagIsPit = 1;
|
2020-09-26 03:28:30 +10:00
|
|
|
|
2021-09-10 00:20:59 +03:00
|
|
|
coll->Setup.ForwardAngle = Lara.moveAngle;
|
2021-09-19 06:42:24 +03:00
|
|
|
GetCollisionInfo(coll, item);
|
2020-08-14 17:54:25 -05:00
|
|
|
|
2020-09-26 05:06:08 +10:00
|
|
|
if (!LaraHitCeiling(item, coll) && !TestLaraVault(item, coll))
|
2020-08-14 17:54:25 -05:00
|
|
|
{
|
2020-09-26 05:06:08 +10:00
|
|
|
if (LaraDeflectEdge(item, coll))
|
2020-08-14 17:54:25 -05:00
|
|
|
{
|
2020-09-26 05:06:08 +10:00
|
|
|
item->goalAnimState = LS_SPLAT;
|
|
|
|
if (GetChange(item, &g_Level.Anims[item->animNumber]))
|
|
|
|
return;
|
|
|
|
|
|
|
|
LaraCollideStop(item, coll);
|
2020-09-26 03:28:30 +10:00
|
|
|
}
|
2020-09-26 05:06:08 +10:00
|
|
|
|
|
|
|
if (!LaraFallen(item, coll))
|
2020-09-26 03:28:30 +10:00
|
|
|
{
|
2021-09-10 00:18:47 +03:00
|
|
|
if (coll->Middle.Floor > STEP_SIZE / 2)
|
2020-08-14 17:54:25 -05:00
|
|
|
{
|
2021-09-10 00:18:47 +03:00
|
|
|
if (coll->Front.Floor == NO_HEIGHT || coll->Front.Floor <= STEP_SIZE / 2)
|
2020-09-26 05:06:08 +10:00
|
|
|
{
|
2021-09-10 00:18:47 +03:00
|
|
|
coll->Middle.Floor = 0;
|
2020-09-26 05:06:08 +10:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
item->goalAnimState = LS_STEP_DOWN;
|
|
|
|
GetChange(item, &g_Level.Anims[item->animNumber]);
|
|
|
|
}
|
|
|
|
}
|
2021-09-10 00:18:47 +03:00
|
|
|
if (coll->Middle.Floor >= -STEPUP_HEIGHT && coll->Middle.Floor < -STEP_SIZE / 2)
|
2020-09-26 05:06:08 +10:00
|
|
|
{
|
2021-09-10 00:18:47 +03:00
|
|
|
if (coll->Front.Floor == NO_HEIGHT ||
|
|
|
|
coll->Front.Floor < -STEPUP_HEIGHT ||
|
|
|
|
coll->Front.Floor >= -STEP_SIZE / 2)
|
2020-09-26 05:06:08 +10:00
|
|
|
{
|
2021-09-10 00:18:47 +03:00
|
|
|
coll->Middle.Floor = 0;
|
2020-09-26 05:06:08 +10:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
item->goalAnimState = LS_STEP_UP;
|
|
|
|
GetChange(item, &g_Level.Anims[item->animNumber]);
|
|
|
|
}
|
2020-08-14 17:54:25 -05:00
|
|
|
}
|
2020-09-26 03:28:30 +10:00
|
|
|
|
2021-10-22 12:43:17 +03:00
|
|
|
if (!TestLaraSlide(item, coll) && coll->Middle.Floor != NO_HEIGHT && coll->CollisionType != CT_FRONT)
|
2021-09-10 00:18:47 +03:00
|
|
|
item->pos.yPos += coll->Middle.Floor;
|
2020-09-26 03:28:30 +10:00
|
|
|
}
|
|
|
|
}
|
2020-09-26 05:06:08 +10:00
|
|
|
}
|
2020-09-26 03:28:30 +10:00
|
|
|
|
2021-09-26 17:51:28 +10:00
|
|
|
// State: LS_RUN_FORWARD (1)
|
|
|
|
// Collision: lara_col_run()
|
2021-02-03 01:50:59 -03:00
|
|
|
void lara_as_run(ITEM_INFO* item, COLL_INFO* coll)
|
2021-09-26 17:51:28 +10:00
|
|
|
{
|
|
|
|
if (item->hitPoints <= 0)
|
|
|
|
{
|
|
|
|
item->goalAnimState = LS_DEATH;
|
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (TrInput & IN_LEFT)
|
|
|
|
{
|
|
|
|
Lara.turnRate -= LARA_TURN_RATE;
|
|
|
|
if (Lara.turnRate < -LARA_FAST_TURN)
|
|
|
|
Lara.turnRate = -LARA_FAST_TURN;
|
|
|
|
|
2021-10-28 16:13:56 +11:00
|
|
|
DoLaraLean(item, coll, -LARA_LEAN_MAX, 12);
|
2021-09-26 17:51:28 +10:00
|
|
|
}
|
|
|
|
else if (TrInput & IN_RIGHT)
|
|
|
|
{
|
|
|
|
Lara.turnRate += LARA_TURN_RATE;
|
|
|
|
if (Lara.turnRate > LARA_FAST_TURN)
|
|
|
|
Lara.turnRate = LARA_FAST_TURN;
|
|
|
|
|
2021-10-28 16:13:56 +11:00
|
|
|
DoLaraLean(item, coll, LARA_LEAN_MAX, 12);
|
2021-09-26 17:51:28 +10:00
|
|
|
}
|
|
|
|
|
2021-09-28 14:00:58 +10:00
|
|
|
static bool allowJump = false;
|
2021-09-26 17:51:28 +10:00
|
|
|
|
|
|
|
if (item->animNumber == LA_STAND_TO_RUN)
|
2021-09-28 14:00:58 +10:00
|
|
|
allowJump = false;
|
2021-10-29 21:41:00 +11:00
|
|
|
else if (item->animNumber == LA_RUN)
|
|
|
|
{
|
|
|
|
if (item->frameNumber == 4)
|
|
|
|
allowJump = true;
|
|
|
|
}
|
2021-09-26 17:51:28 +10:00
|
|
|
else
|
2021-09-28 14:00:58 +10:00
|
|
|
allowJump = true;
|
2021-09-26 17:51:28 +10:00
|
|
|
|
2021-10-17 20:07:30 +11:00
|
|
|
// TODO: Do something about wade checks. @Sezz 2021.10.17
|
|
|
|
|
2021-09-28 14:00:58 +10:00
|
|
|
// Pseudo action queue which makes JUMP input take complete precedence.
|
2021-11-05 22:42:33 +11:00
|
|
|
// Creates a committal lock to perform a forward jump when JUMP is pressed and released while allowJump isn't true yet.
|
2021-09-28 14:00:58 +10:00
|
|
|
static bool commitToJump = false;
|
2021-09-26 17:51:28 +10:00
|
|
|
|
2021-10-09 14:39:06 +11:00
|
|
|
if ((TrInput & IN_JUMP || commitToJump) &&
|
2021-10-17 20:07:30 +11:00
|
|
|
!item->gravityStatus &&
|
|
|
|
Lara.waterStatus != LW_WADE)
|
2021-09-26 17:51:28 +10:00
|
|
|
{
|
2021-09-28 14:00:58 +10:00
|
|
|
commitToJump = TrInput & IN_FORWARD;
|
2021-09-26 17:51:28 +10:00
|
|
|
|
2021-09-28 14:00:58 +10:00
|
|
|
if (allowJump)
|
2021-09-26 17:51:28 +10:00
|
|
|
{
|
2021-09-28 14:00:58 +10:00
|
|
|
commitToJump = false;
|
2021-09-26 17:51:28 +10:00
|
|
|
item->goalAnimState = LS_JUMP_FORWARD;
|
|
|
|
}
|
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2021-10-09 14:39:06 +11:00
|
|
|
if (TrInput & IN_SPRINT &&
|
2021-10-17 20:07:30 +11:00
|
|
|
DashTimer &&
|
|
|
|
Lara.waterStatus != LW_WADE)
|
2021-09-26 17:51:28 +10:00
|
|
|
{
|
|
|
|
item->goalAnimState = LS_SPRINT;
|
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2021-10-17 20:07:30 +11:00
|
|
|
if (TrInput & IN_ROLL &&
|
|
|
|
Lara.waterStatus != LW_WADE)
|
2021-09-26 17:51:28 +10:00
|
|
|
{
|
2021-10-04 22:02:02 +11:00
|
|
|
item->goalAnimState = LS_ROLL_FORWARD;
|
2021-09-26 17:51:28 +10:00
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2021-11-02 14:22:58 +11:00
|
|
|
if (TrInput & IN_DUCK &&
|
2021-10-09 14:39:06 +11:00
|
|
|
(Lara.gunStatus == LG_NO_ARMS || !IsStandingWeapon(Lara.gunType)) &&
|
2021-10-17 20:07:30 +11:00
|
|
|
Lara.waterStatus != LW_WADE)
|
2021-09-26 17:51:28 +10:00
|
|
|
{
|
|
|
|
item->goalAnimState = LS_CROUCH_IDLE;
|
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (TrInput & IN_FORWARD)
|
|
|
|
{
|
|
|
|
if (Lara.waterStatus == LW_WADE)
|
|
|
|
item->goalAnimState = LS_WADE_FORWARD;
|
|
|
|
else if (TrInput & IN_WALK)
|
|
|
|
item->goalAnimState = LS_WALK_FORWARD;
|
|
|
|
else [[likely]]
|
|
|
|
item->goalAnimState = LS_RUN_FORWARD;
|
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
item->goalAnimState = LS_STOP;
|
|
|
|
}
|
|
|
|
|
|
|
|
// LEGACY
|
|
|
|
void old_lara_as_run(ITEM_INFO* item, COLL_INFO* coll)
|
2020-09-26 05:06:08 +10:00
|
|
|
{
|
|
|
|
/*state 1*/
|
|
|
|
/*collision: lara_col_run*/
|
|
|
|
if (item->hitPoints <= 0)
|
2020-09-26 03:28:30 +10:00
|
|
|
{
|
2020-09-26 05:06:08 +10:00
|
|
|
item->goalAnimState = LS_DEATH;
|
|
|
|
return;
|
2020-09-26 03:28:30 +10:00
|
|
|
}
|
|
|
|
|
2020-09-26 05:06:08 +10:00
|
|
|
if (TrInput & IN_ROLL)
|
2020-09-26 03:28:30 +10:00
|
|
|
{
|
2020-09-26 05:06:08 +10:00
|
|
|
item->animNumber = LA_ROLL_180_START;
|
|
|
|
item->frameNumber = g_Level.Anims[item->animNumber].frameBase + 2;
|
|
|
|
item->currentAnimState = LS_ROLL_FORWARD;
|
|
|
|
item->goalAnimState = LS_STOP;
|
2020-08-14 17:54:25 -05:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2020-09-26 05:06:08 +10:00
|
|
|
if (TrInput & IN_SPRINT && DashTimer)
|
2020-08-14 17:54:25 -05:00
|
|
|
{
|
2020-09-26 05:06:08 +10:00
|
|
|
item->goalAnimState = LS_SPRINT;
|
2020-09-26 03:28:30 +10:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2020-09-26 05:06:08 +10:00
|
|
|
if (TrInput & IN_DUCK &&
|
|
|
|
Lara.waterStatus != LW_WADE &&
|
|
|
|
(Lara.gunStatus == LG_NO_ARMS ||
|
|
|
|
Lara.gunType == WEAPON_NONE ||
|
|
|
|
Lara.gunType == WEAPON_PISTOLS ||
|
|
|
|
Lara.gunType == WEAPON_REVOLVER ||
|
|
|
|
Lara.gunType == WEAPON_UZI ||
|
|
|
|
Lara.gunType == WEAPON_FLARE))
|
2020-09-26 03:28:30 +10:00
|
|
|
{
|
2020-09-26 05:06:08 +10:00
|
|
|
item->goalAnimState = LS_CROUCH_IDLE;
|
2020-08-14 17:54:25 -05:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (TrInput & IN_LEFT)
|
|
|
|
{
|
|
|
|
Lara.turnRate -= LARA_TURN_RATE;
|
|
|
|
if (Lara.turnRate < -LARA_FAST_TURN)
|
2020-09-26 03:28:30 +10:00
|
|
|
Lara.turnRate = -LARA_FAST_TURN;
|
2020-09-26 05:06:08 +10:00
|
|
|
|
2021-10-22 01:50:43 +11:00
|
|
|
DoLaraLean(item, coll, -LARA_LEAN_MAX, 7);
|
2020-08-14 17:54:25 -05:00
|
|
|
}
|
|
|
|
else if (TrInput & IN_RIGHT)
|
|
|
|
{
|
|
|
|
Lara.turnRate += LARA_TURN_RATE;
|
|
|
|
if (Lara.turnRate > LARA_FAST_TURN)
|
2020-09-26 03:28:30 +10:00
|
|
|
Lara.turnRate = LARA_FAST_TURN;
|
2020-09-26 05:06:08 +10:00
|
|
|
|
2021-10-22 01:50:43 +11:00
|
|
|
DoLaraLean(item, coll, LARA_LEAN_MAX, 7);
|
2020-08-14 17:54:25 -05:00
|
|
|
}
|
|
|
|
|
2021-09-14 00:35:10 +03:00
|
|
|
static bool doJump = false;
|
2021-09-13 09:19:35 +03:00
|
|
|
|
2020-08-14 17:54:25 -05:00
|
|
|
if (item->animNumber == LA_STAND_TO_RUN)
|
|
|
|
{
|
2021-09-13 09:19:35 +03:00
|
|
|
doJump = false;
|
2020-08-14 17:54:25 -05:00
|
|
|
}
|
2020-09-26 05:06:08 +10:00
|
|
|
else if (item->animNumber == LA_RUN)
|
2020-08-14 17:54:25 -05:00
|
|
|
{
|
2020-09-26 05:06:08 +10:00
|
|
|
if (item->frameNumber == 4)
|
2021-09-13 09:19:35 +03:00
|
|
|
doJump = true;
|
2020-08-14 17:54:25 -05:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2021-09-13 09:19:35 +03:00
|
|
|
doJump = true;
|
2020-08-14 17:54:25 -05:00
|
|
|
}
|
|
|
|
|
2021-09-13 09:19:35 +03:00
|
|
|
if (TrInput & IN_JUMP && doJump && !item->gravityStatus)
|
2020-08-14 17:54:25 -05:00
|
|
|
{
|
|
|
|
item->goalAnimState = LS_JUMP_FORWARD;
|
|
|
|
}
|
2020-09-26 05:06:08 +10:00
|
|
|
else if (TrInput & IN_FORWARD)
|
2020-08-14 17:54:25 -05:00
|
|
|
{
|
|
|
|
if (Lara.waterStatus == LW_WADE)
|
|
|
|
{
|
|
|
|
item->goalAnimState = LS_WADE_FORWARD;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2020-09-26 05:06:08 +10:00
|
|
|
if (TrInput & IN_WALK)
|
|
|
|
item->goalAnimState = LS_WALK_FORWARD;
|
|
|
|
else
|
|
|
|
item->goalAnimState = LS_RUN_FORWARD;
|
2020-08-14 17:54:25 -05:00
|
|
|
}
|
|
|
|
}
|
2020-09-26 05:06:08 +10:00
|
|
|
else
|
|
|
|
{
|
|
|
|
item->goalAnimState = LS_STOP;
|
|
|
|
}
|
2020-08-14 17:54:25 -05:00
|
|
|
}
|
|
|
|
|
2021-10-09 16:56:07 +11:00
|
|
|
// State: LS_RUN_FORWARD (1)
|
|
|
|
// Control: lara_as_run()
|
2021-02-03 01:50:59 -03:00
|
|
|
void lara_col_run(ITEM_INFO* item, COLL_INFO* coll)
|
2021-10-09 16:56:07 +11:00
|
|
|
{
|
|
|
|
Lara.moveAngle = item->pos.yRot;
|
|
|
|
coll->Setup.BadHeightDown = NO_BAD_POS;
|
|
|
|
coll->Setup.BadHeightUp = -STEPUP_HEIGHT;
|
|
|
|
coll->Setup.BadCeilingHeight = 0;
|
|
|
|
coll->Setup.SlopesAreWalls = true;
|
|
|
|
coll->Setup.ForwardAngle = Lara.moveAngle;
|
|
|
|
GetCollisionInfo(coll, item);
|
|
|
|
LaraResetGravityStatus(item, coll);
|
|
|
|
|
|
|
|
if (TestLaraHitCeiling(coll))
|
|
|
|
{
|
|
|
|
SetLaraHitCeiling(item, coll);
|
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (LaraDeflectEdge(item, coll))
|
|
|
|
{
|
|
|
|
item->pos.zRot = 0;
|
|
|
|
|
2021-11-03 21:44:48 +11:00
|
|
|
if (coll->HitTallObject || TestLaraWall(item, 256, 0, -640) != SPLAT_COLL::NONE)
|
2021-10-09 16:56:07 +11:00
|
|
|
{
|
|
|
|
item->goalAnimState = LS_SPLAT;
|
|
|
|
if (GetChange(item, &g_Level.Anims[item->animNumber]))
|
|
|
|
{
|
|
|
|
item->currentAnimState = LS_SPLAT;
|
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
LaraCollideStop(item, coll);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (TestLaraFall(coll))
|
|
|
|
{
|
|
|
|
SetLaraFallState(item);
|
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2021-11-05 21:29:00 +11:00
|
|
|
if (TestLaraSlide(item, coll))
|
2021-10-09 16:56:07 +11:00
|
|
|
return;
|
|
|
|
|
2021-10-19 21:28:36 +11:00
|
|
|
if (TestLaraVault(item, coll))
|
|
|
|
return;
|
|
|
|
|
2021-10-28 23:22:28 +11:00
|
|
|
if (TestLaraStep(coll) &&
|
|
|
|
coll->CollisionType != CT_FRONT)
|
2021-10-09 16:56:07 +11:00
|
|
|
{
|
|
|
|
DoLaraStep(item, coll);
|
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
2021-10-09 23:00:26 +11:00
|
|
|
|
|
|
|
// LEGACY step
|
|
|
|
//if (coll->Front.Floor == NO_HEIGHT || coll->Front.Floor < -STEPUP_HEIGHT || coll->Front.Floor >= -STEP_SIZE / 2)
|
|
|
|
//{
|
|
|
|
// coll->Middle.Floor = 0;
|
|
|
|
//}
|
|
|
|
//else
|
|
|
|
//{
|
|
|
|
// item->goalAnimState = LS_STEP_UP;
|
|
|
|
// GetChange(item, &g_Level.Anims[item->animNumber]);
|
|
|
|
//}
|
|
|
|
//if (coll->Middle.Floor < 50)
|
|
|
|
//{
|
|
|
|
// if (coll->Middle.Floor != NO_HEIGHT)
|
|
|
|
// item->pos.yPos += coll->Middle.Floor;
|
|
|
|
//}
|
|
|
|
//else
|
|
|
|
//{
|
|
|
|
// item->goalAnimState = LS_STEP_DOWN; // for theoretical running stepdown anims, not in default anims
|
|
|
|
// if (GetChange(item, &g_Level.Anims[item->animNumber]))
|
|
|
|
// item->pos.yPos += coll->Middle.Floor; // move Lara to middle.Floor
|
|
|
|
// else
|
|
|
|
// item->pos.yPos += 50; // do the default aligment
|
|
|
|
//}
|
2021-10-09 16:56:07 +11:00
|
|
|
}
|
|
|
|
|
|
|
|
// LEGACY
|
|
|
|
void old_lara_col_run(ITEM_INFO* item, COLL_INFO* coll)
|
2020-08-14 17:54:25 -05:00
|
|
|
{
|
2020-09-26 05:06:08 +10:00
|
|
|
/*state 1*/
|
|
|
|
/*state code: lara_col_run*/
|
2020-12-19 23:34:52 -03:00
|
|
|
Lara.moveAngle = item->pos.yRot;
|
2020-08-14 17:54:25 -05:00
|
|
|
|
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 = 0;
|
|
|
|
coll->Setup.SlopesAreWalls = true;
|
|
|
|
coll->Setup.ForwardAngle = Lara.moveAngle;
|
2021-09-17 22:55:09 +03:00
|
|
|
|
2021-09-19 06:42:24 +03:00
|
|
|
GetCollisionInfo(coll, item);
|
2021-09-25 13:00:14 +03:00
|
|
|
LaraResetGravityStatus(item, coll);
|
2020-08-14 17:54:25 -05:00
|
|
|
|
2020-09-26 05:06:08 +10:00
|
|
|
if (!LaraHitCeiling(item, coll) && !TestLaraVault(item, coll))
|
2020-08-14 17:54:25 -05:00
|
|
|
{
|
2020-09-26 05:06:08 +10:00
|
|
|
if (LaraDeflectEdge(item, coll))
|
2020-08-14 17:54:25 -05:00
|
|
|
{
|
2020-09-26 05:06:08 +10:00
|
|
|
item->pos.zRot = 0;
|
|
|
|
|
2021-10-27 09:48:31 +03:00
|
|
|
if (coll->HitTallObject || TestLaraWall(item, 256, 0, -640) != SPLAT_COLL::NONE)
|
2020-08-14 17:54:25 -05:00
|
|
|
{
|
2020-09-26 05:06:08 +10:00
|
|
|
item->goalAnimState = LS_SPLAT;
|
|
|
|
if (GetChange(item, &g_Level.Anims[item->animNumber]))
|
|
|
|
{
|
|
|
|
item->currentAnimState = LS_SPLAT;
|
|
|
|
return;
|
|
|
|
}
|
2020-08-14 17:54:25 -05:00
|
|
|
}
|
2020-09-26 05:06:08 +10:00
|
|
|
|
|
|
|
LaraCollideStop(item, coll);
|
2020-08-14 17:54:25 -05:00
|
|
|
}
|
2020-09-26 05:06:08 +10:00
|
|
|
|
|
|
|
if (!LaraFallen(item, coll))
|
2020-08-14 17:54:25 -05:00
|
|
|
{
|
2021-09-10 00:18:47 +03:00
|
|
|
if (coll->Middle.Floor >= -STEPUP_HEIGHT && coll->Middle.Floor < -STEP_SIZE / 2)
|
2020-08-14 17:54:25 -05:00
|
|
|
{
|
2021-09-10 00:18:47 +03:00
|
|
|
if (coll->Front.Floor == NO_HEIGHT || coll->Front.Floor < -STEPUP_HEIGHT || coll->Front.Floor >= -STEP_SIZE / 2)
|
2020-09-26 05:06:08 +10:00
|
|
|
{
|
2021-09-10 00:18:47 +03:00
|
|
|
coll->Middle.Floor = 0;
|
2020-09-26 05:06:08 +10:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
item->goalAnimState = LS_STEP_UP;
|
|
|
|
GetChange(item, &g_Level.Anims[item->animNumber]);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-10-22 12:28:27 +03:00
|
|
|
if (!TestLaraSlide(item, coll) && coll->CollisionType != CT_FRONT)
|
2020-09-26 05:06:08 +10:00
|
|
|
{
|
2021-09-10 00:18:47 +03:00
|
|
|
if (coll->Middle.Floor < 50)
|
2020-09-26 05:06:08 +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 05:06:08 +10:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
item->goalAnimState = LS_STEP_DOWN; // for theoretical running stepdown anims, not in default anims
|
|
|
|
if (GetChange(item, &g_Level.Anims[item->animNumber]))
|
2021-09-10 00:18:47 +03:00
|
|
|
item->pos.yPos += coll->Middle.Floor; // move Lara to middle.Floor
|
2020-09-26 05:06:08 +10:00
|
|
|
else
|
|
|
|
item->pos.yPos += 50; // do the default aligment
|
|
|
|
}
|
2020-08-14 17:54:25 -05:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2020-09-26 05:06:08 +10:00
|
|
|
}
|
2020-08-14 17:54:25 -05:00
|
|
|
|
2021-09-28 01:22:47 +10:00
|
|
|
// State: LS_STOP (2)
|
|
|
|
// Collision: lara_col_stop()
|
2020-09-26 05:06:08 +10:00
|
|
|
void lara_as_stop(ITEM_INFO* item, COLL_INFO* coll)
|
2021-09-28 01:22:47 +10:00
|
|
|
{
|
|
|
|
// TODO: Hardcoding. @Sezz 2021.09.28
|
2021-10-17 20:07:30 +11:00
|
|
|
if (item->animNumber != LA_SPRINT_TO_STAND_RIGHT &&
|
|
|
|
item->animNumber != LA_SPRINT_TO_STAND_LEFT)
|
2021-09-28 01:22:47 +10:00
|
|
|
StopSoundEffect(SFX_TR4_LARA_SLIPPING);
|
|
|
|
|
|
|
|
if (item->hitPoints <= 0)
|
|
|
|
{
|
|
|
|
item->goalAnimState = LS_DEATH;
|
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
// TODO: Hardcoding. @Sezz 2021.09.28
|
|
|
|
// Handles waterskin and clockwork beetle.
|
|
|
|
if (UseSpecialItem(item))
|
|
|
|
return;
|
|
|
|
|
|
|
|
if (TrInput & IN_LOOK)
|
|
|
|
LookUpDown();
|
|
|
|
|
2021-09-28 23:06:20 +10:00
|
|
|
// Permit turning when Lara is stationary and cannot dispatch into a true turn.
|
2021-10-08 15:47:54 +11:00
|
|
|
if (TrInput & IN_LEFT &&
|
2021-10-17 20:07:30 +11:00
|
|
|
!(TrInput & IN_JUMP)) // JUMP locks y rotation.
|
2021-09-28 13:05:29 +10:00
|
|
|
{
|
|
|
|
Lara.turnRate -= LARA_TURN_RATE;
|
2021-09-28 23:06:20 +10:00
|
|
|
if (Lara.turnRate < -LARA_SLOW_TURN)
|
|
|
|
Lara.turnRate = -LARA_SLOW_TURN;
|
2021-09-28 13:05:29 +10:00
|
|
|
}
|
2021-10-08 15:47:54 +11:00
|
|
|
else if (TrInput & IN_RIGHT &&
|
|
|
|
!(TrInput & IN_JUMP))
|
2021-09-28 13:05:29 +10:00
|
|
|
{
|
|
|
|
Lara.turnRate += LARA_TURN_RATE;
|
2021-09-28 23:06:20 +10:00
|
|
|
if (Lara.turnRate > LARA_SLOW_TURN)
|
|
|
|
Lara.turnRate = LARA_SLOW_TURN;
|
2021-09-28 13:05:29 +10:00
|
|
|
}
|
|
|
|
|
2021-09-28 01:22:47 +10:00
|
|
|
// TODO: Refine this handling. Create LS_WADE_IDLE state? Might complicate things. @Sezz 2021.09.28
|
|
|
|
if (Lara.waterStatus == LW_WADE)
|
|
|
|
{
|
2021-10-19 21:28:36 +11:00
|
|
|
LaraWadeStop(item, coll);
|
2021-09-28 01:22:47 +10:00
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2021-10-08 15:47:54 +11:00
|
|
|
if (TrInput & IN_JUMP &&
|
2021-10-17 20:07:30 +11:00
|
|
|
coll->Middle.Ceiling < -LARA_HEADROOM * 0.7f)
|
2021-09-28 01:22:47 +10:00
|
|
|
{
|
|
|
|
item->goalAnimState = LS_JUMP_PREPARE;
|
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (TrInput & IN_ROLL)
|
|
|
|
{
|
2021-10-04 22:02:02 +11:00
|
|
|
item->goalAnimState = LS_ROLL_FORWARD;
|
2021-09-28 01:22:47 +10:00
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2021-11-02 14:22:58 +11:00
|
|
|
if (TrInput & IN_DUCK &&
|
2021-10-08 15:47:54 +11:00
|
|
|
(Lara.gunStatus == LG_NO_ARMS || !IsStandingWeapon(Lara.gunType)))
|
2021-09-28 01:22:47 +10:00
|
|
|
{
|
2021-10-24 20:43:02 +11:00
|
|
|
item->goalAnimState = LS_CROUCH_IDLE;
|
2021-09-28 01:22:47 +10:00
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2021-10-28 23:22:28 +11:00
|
|
|
if (TrInput & IN_FORWARD)
|
2021-09-28 01:22:47 +10:00
|
|
|
{
|
2021-10-24 20:43:02 +11:00
|
|
|
if (TrInput & IN_WALK)
|
2021-10-28 23:22:28 +11:00
|
|
|
{
|
|
|
|
if (TestLaraWalkForward(item, coll))
|
|
|
|
{
|
|
|
|
item->goalAnimState = LS_WALK_FORWARD;
|
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else if (TrInput & IN_SPRINT &&
|
|
|
|
TestLaraRunForward(item, coll))
|
|
|
|
{
|
2021-10-13 19:50:46 +11:00
|
|
|
item->goalAnimState = LS_SPRINT;
|
2021-10-28 23:22:28 +11:00
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
else if (TestLaraRunForward(item, coll)) [[likely]]
|
|
|
|
{
|
2021-09-28 01:22:47 +10:00
|
|
|
item->goalAnimState = LS_RUN_FORWARD;
|
|
|
|
|
2021-10-28 23:22:28 +11:00
|
|
|
return;
|
|
|
|
}
|
2021-09-28 01:22:47 +10:00
|
|
|
}
|
2021-10-19 21:28:36 +11:00
|
|
|
// TODO: Create new LS_WADE_BACK state? Its function would make a direct call to lara_as_back(). @Sezz 2021.06.27
|
2021-10-22 00:07:24 +11:00
|
|
|
else if (TrInput & IN_BACK)
|
2021-09-28 01:22:47 +10:00
|
|
|
{
|
2021-10-24 20:43:02 +11:00
|
|
|
if (TrInput & IN_WALK &&
|
|
|
|
TestLaraWalkBack(item, coll))
|
2021-09-28 01:22:47 +10:00
|
|
|
{
|
2021-10-24 20:43:02 +11:00
|
|
|
item->goalAnimState = LS_WALK_BACK;
|
2021-10-19 21:28:36 +11:00
|
|
|
|
|
|
|
return;
|
2021-09-28 01:22:47 +10:00
|
|
|
}
|
2021-10-24 20:43:02 +11:00
|
|
|
else if (!(TrInput & IN_WALK) &&
|
|
|
|
TestLaraHopBack(item, coll)) [[likely]]
|
2021-10-06 14:03:12 +11:00
|
|
|
{
|
2021-09-28 01:22:47 +10:00
|
|
|
item->goalAnimState = LS_HOP_BACK;
|
|
|
|
|
2021-10-19 21:28:36 +11:00
|
|
|
return;
|
|
|
|
}
|
2021-09-28 01:22:47 +10:00
|
|
|
}
|
|
|
|
|
2021-10-13 19:50:46 +11:00
|
|
|
if (TrInput & IN_LSTEP &&
|
2021-10-19 21:28:36 +11:00
|
|
|
TestLaraStepLeft(item, coll))
|
2021-09-28 01:22:47 +10:00
|
|
|
{
|
2021-10-08 15:47:54 +11:00
|
|
|
item->goalAnimState = LS_STEP_LEFT;
|
2021-09-28 01:22:47 +10:00
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
2021-10-13 19:50:46 +11:00
|
|
|
else if (TrInput & IN_RSTEP &&
|
2021-10-19 21:28:36 +11:00
|
|
|
TestLaraStepRight(item, coll))
|
2021-09-28 01:22:47 +10:00
|
|
|
{
|
2021-10-08 15:47:54 +11:00
|
|
|
item->goalAnimState = LS_STEP_RIGHT;
|
2021-09-28 01:22:47 +10:00
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2021-10-08 15:47:54 +11:00
|
|
|
if (TrInput & IN_LEFT)
|
2021-09-28 01:22:47 +10:00
|
|
|
{
|
2021-10-08 20:08:55 +11:00
|
|
|
if (TrInput & IN_SPRINT ||
|
2021-11-04 18:41:13 +11:00
|
|
|
(Lara.gunStatus == LG_READY && Lara.gunType != WEAPON_TORCH) ||
|
|
|
|
(Lara.gunStatus == LG_DRAW_GUNS && Lara.gunType != WEAPON_FLARE)) // Why are these weapons??? @Sezz 2021.10.10
|
2021-10-08 20:08:55 +11:00
|
|
|
{
|
|
|
|
item->goalAnimState = LS_TURN_LEFT_FAST;
|
|
|
|
}
|
|
|
|
else [[likely]]
|
|
|
|
item->goalAnimState = LS_TURN_LEFT_SLOW;
|
2021-09-28 01:22:47 +10:00
|
|
|
|
2021-10-04 22:02:02 +11:00
|
|
|
return;
|
2021-09-28 01:22:47 +10:00
|
|
|
}
|
2021-10-08 15:47:54 +11:00
|
|
|
else if (TrInput & IN_RIGHT)
|
2021-09-28 01:22:47 +10:00
|
|
|
{
|
2021-10-08 20:08:55 +11:00
|
|
|
if (TrInput & IN_SPRINT ||
|
2021-11-04 18:41:13 +11:00
|
|
|
(Lara.gunStatus == LG_READY && Lara.gunType != WEAPON_TORCH) ||
|
|
|
|
(Lara.gunStatus == LG_DRAW_GUNS && Lara.gunType != WEAPON_FLARE))
|
2021-10-08 20:08:55 +11:00
|
|
|
{
|
|
|
|
item->goalAnimState = LS_TURN_RIGHT_FAST;
|
|
|
|
}
|
|
|
|
else [[likely]]
|
|
|
|
item->goalAnimState = LS_TURN_RIGHT_SLOW;
|
2021-09-28 01:22:47 +10:00
|
|
|
|
2021-10-04 22:02:02 +11:00
|
|
|
return;
|
2021-09-28 01:22:47 +10:00
|
|
|
}
|
|
|
|
|
2021-11-04 21:07:47 +11:00
|
|
|
// TODO: LUA.
|
|
|
|
// TODO: Without animation blending, the AFK pose animation's
|
|
|
|
// movement lock will be rather obnoxious.
|
|
|
|
// TODO: Adding some idle breathing would be nice. @Sezz 2021.10.31
|
|
|
|
Lara.NewAnims.Pose = false;
|
|
|
|
|
|
|
|
if (Lara.poseCount == LARA_POSE_TIME &&
|
|
|
|
TestLaraPose(item, coll) &&
|
|
|
|
Lara.NewAnims.Pose)
|
|
|
|
{
|
|
|
|
item->goalAnimState = LS_POSE;
|
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2021-09-28 01:22:47 +10:00
|
|
|
item->goalAnimState = LS_STOP;
|
|
|
|
}
|
|
|
|
|
2021-10-13 19:50:46 +11:00
|
|
|
// TODO: Future-proof for raising water.
|
|
|
|
// TODO: See if making these into true states would be beneficial. @Sezz 2021.10.13
|
|
|
|
// Pseudo-state for idling in wade-height water.
|
2021-10-19 21:28:36 +11:00
|
|
|
void LaraWadeStop(ITEM_INFO* item, COLL_INFO* coll)
|
2021-09-28 01:22:47 +10:00
|
|
|
{
|
2021-10-13 19:50:46 +11:00
|
|
|
if (TrInput & IN_JUMP &&
|
|
|
|
!(g_Level.Rooms[item->roomNumber].flags & ENV_FLAG_SWAMP))
|
2021-09-28 01:22:47 +10:00
|
|
|
{
|
|
|
|
item->goalAnimState = LS_JUMP_PREPARE;
|
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2021-10-13 19:50:46 +11:00
|
|
|
// TODO: Clean this.
|
2021-10-19 21:28:36 +11:00
|
|
|
if (TrInput & IN_FORWARD &&
|
2021-10-22 00:07:24 +11:00
|
|
|
coll->CollisionType != CT_FRONT &&
|
|
|
|
coll->CollisionType != CT_TOP_FRONT)
|
2021-09-28 01:22:47 +10:00
|
|
|
{
|
|
|
|
bool wade = false;
|
|
|
|
|
2021-10-19 21:28:36 +11:00
|
|
|
/*if ((fHeight.Position.Floor > -(STEPUP_HEIGHT - 1) &&
|
2021-10-13 19:50:46 +11:00
|
|
|
g_Level.Rooms[item->roomNumber].flags & ENV_FLAG_SWAMP) ||
|
|
|
|
(fHeight.Position.Floor < (STEPUP_HEIGHT - 1) &&
|
|
|
|
fHeight.Position.Floor > -(STEPUP_HEIGHT - 1)))
|
2021-09-28 01:22:47 +10:00
|
|
|
{
|
2021-10-19 21:28:36 +11:00
|
|
|
wade = true;*/
|
2021-09-28 01:22:47 +10:00
|
|
|
item->goalAnimState = LS_WADE_FORWARD;
|
2021-10-19 21:28:36 +11:00
|
|
|
/*}
|
2021-09-28 01:22:47 +10:00
|
|
|
|
|
|
|
if (!wade)
|
|
|
|
{
|
|
|
|
Lara.moveAngle = item->pos.yRot;
|
|
|
|
coll->Setup.BadHeightDown = NO_BAD_POS;
|
|
|
|
coll->Setup.BadHeightUp = -STEPUP_HEIGHT;
|
|
|
|
coll->Setup.BadCeilingHeight = 0;
|
|
|
|
coll->Setup.SlopesAreWalls = true;
|
|
|
|
coll->Setup.Radius = LARA_RAD + 2;
|
|
|
|
coll->Setup.ForwardAngle = Lara.moveAngle;
|
|
|
|
GetCollisionInfo(coll, item);
|
|
|
|
|
|
|
|
if (TestLaraVault(item, coll))
|
|
|
|
return;
|
|
|
|
|
|
|
|
coll->Setup.Radius = LARA_RAD;
|
2021-10-19 21:28:36 +11:00
|
|
|
}*/
|
2021-09-28 01:22:47 +10:00
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
2021-10-04 22:02:02 +11:00
|
|
|
|
2021-10-26 13:05:19 +11:00
|
|
|
if (TrInput & IN_BACK &&
|
|
|
|
TestLaraWalkBack(item, coll))
|
2021-09-28 01:22:47 +10:00
|
|
|
{
|
2021-10-13 19:50:46 +11:00
|
|
|
item->goalAnimState = LS_WALK_BACK;
|
2021-09-28 01:22:47 +10:00
|
|
|
|
2021-10-13 19:50:46 +11:00
|
|
|
return;
|
2021-09-28 01:22:47 +10:00
|
|
|
}
|
|
|
|
|
2021-11-02 14:22:58 +11:00
|
|
|
if (TrInput & IN_LEFT)
|
2021-10-14 21:11:59 +11:00
|
|
|
{
|
2021-11-02 14:22:58 +11:00
|
|
|
item->goalAnimState = LS_TURN_LEFT_SLOW;
|
2021-10-14 21:11:59 +11:00
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
2021-11-02 14:22:58 +11:00
|
|
|
else if (TrInput & IN_RIGHT)
|
2021-10-14 21:11:59 +11:00
|
|
|
{
|
2021-11-02 14:22:58 +11:00
|
|
|
item->goalAnimState = LS_TURN_RIGHT_SLOW;
|
2021-10-14 21:11:59 +11:00
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2021-11-02 14:22:58 +11:00
|
|
|
if (TrInput & IN_LSTEP &&
|
|
|
|
TestLaraStepLeft(item, coll))
|
2021-10-05 22:09:07 +11:00
|
|
|
{
|
2021-11-02 14:22:58 +11:00
|
|
|
item->goalAnimState = LS_STEP_LEFT;
|
2021-10-05 22:09:07 +11:00
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
2021-11-02 14:22:58 +11:00
|
|
|
else if (TrInput & IN_RSTEP &&
|
|
|
|
TestLaraStepRight(item, coll))
|
2021-10-05 22:09:07 +11:00
|
|
|
{
|
2021-11-02 14:22:58 +11:00
|
|
|
item->goalAnimState = LS_STEP_RIGHT;
|
2021-10-05 22:09:07 +11:00
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2021-09-28 01:22:47 +10:00
|
|
|
item->goalAnimState = LS_STOP;
|
|
|
|
}
|
|
|
|
|
|
|
|
// LEGACY
|
|
|
|
void old_lara_as_stop(ITEM_INFO* item, COLL_INFO* coll)
|
2020-09-26 05:06:08 +10:00
|
|
|
{
|
|
|
|
/*state 2*/
|
|
|
|
/*collision: lara_col_stop*/
|
2021-09-10 00:43:26 +03:00
|
|
|
COLL_RESULT fheight = {}; fheight.Position.Floor = NO_HEIGHT;
|
|
|
|
COLL_RESULT rheight = {}; rheight.Position.Floor = NO_HEIGHT;
|
2020-08-14 17:54:25 -05:00
|
|
|
|
2020-09-26 05:06:08 +10:00
|
|
|
if (item->hitPoints <= 0)
|
2020-08-14 17:54:25 -05:00
|
|
|
{
|
2020-09-26 05:06:08 +10:00
|
|
|
item->goalAnimState = LS_DEATH;
|
2020-08-14 17:54:25 -05:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2020-09-26 03:28:30 +10:00
|
|
|
if (item->animNumber != LA_SPRINT_TO_STAND_RIGHT && item->animNumber != LA_SPRINT_TO_STAND_LEFT)
|
2021-05-26 06:04:32 +02:00
|
|
|
StopSoundEffect(SFX_TR4_LARA_SLIPPING);
|
2020-09-26 03:28:30 +10:00
|
|
|
|
2020-09-26 05:06:08 +10:00
|
|
|
// Handles waterskin and clockwork beetle
|
|
|
|
if (UseSpecialItem(item))
|
|
|
|
return;
|
|
|
|
|
|
|
|
if (TrInput & IN_ROLL && Lara.waterStatus != LW_WADE)
|
2020-09-26 03:28:30 +10:00
|
|
|
{
|
2020-09-26 05:06:08 +10:00
|
|
|
item->animNumber = LA_ROLL_180_START;
|
|
|
|
item->frameNumber = g_Level.Anims[item->animNumber].frameBase + 2;
|
|
|
|
item->currentAnimState = LS_ROLL_FORWARD;
|
|
|
|
item->goalAnimState = LS_STOP;
|
2020-08-14 17:54:25 -05:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2020-09-26 05:06:08 +10:00
|
|
|
if (TrInput & IN_DUCK
|
2021-10-04 22:02:02 +11:00
|
|
|
&& Lara.waterStatus != LW_WADE
|
2020-09-26 05:06:08 +10:00
|
|
|
&& item->currentAnimState == LS_STOP
|
|
|
|
&& (Lara.gunStatus == LG_NO_ARMS
|
|
|
|
|| Lara.gunType == WEAPON_NONE
|
|
|
|
|| Lara.gunType == WEAPON_PISTOLS
|
2021-06-09 18:28:25 -04:00
|
|
|
|| (Lara.gunType == WEAPON_REVOLVER && !LaserSight)
|
2020-09-26 05:06:08 +10:00
|
|
|
|| Lara.gunType == WEAPON_UZI
|
|
|
|
|| Lara.gunType == WEAPON_FLARE))
|
2020-08-14 17:54:25 -05:00
|
|
|
{
|
2020-09-26 05:06:08 +10:00
|
|
|
item->goalAnimState = LS_CROUCH_IDLE;
|
2020-08-14 17:54:25 -05:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
item->goalAnimState = LS_STOP;
|
|
|
|
|
|
|
|
if (TrInput & IN_LOOK)
|
|
|
|
LookUpDown();
|
|
|
|
|
2021-09-18 00:36:28 +03:00
|
|
|
if (TrInput & IN_LSTEP)
|
2020-09-26 03:28:30 +10:00
|
|
|
{
|
2021-09-18 00:36:28 +03:00
|
|
|
auto collFloorResult = LaraCollisionFront(item, item->pos.yRot - ANGLE(90.0f), LARA_RAD + 48);
|
|
|
|
auto collCeilingResult = LaraCeilingCollisionFront(item, item->pos.yRot - ANGLE(90.0f), LARA_RAD + 48, LARA_HEIGHT);
|
|
|
|
|
2021-10-04 22:02:02 +11:00
|
|
|
if ((collFloorResult.Position.Floor < 128 && collFloorResult.Position.Floor > -128) && !collFloorResult.Position.Slope && collCeilingResult.Position.Ceiling <= 0)
|
2021-09-18 00:36:28 +03:00
|
|
|
item->goalAnimState = LS_STEP_LEFT;
|
2020-09-26 03:28:30 +10:00
|
|
|
}
|
2021-09-18 00:36:28 +03:00
|
|
|
else if (TrInput & IN_RSTEP)
|
2020-09-26 03:28:30 +10:00
|
|
|
{
|
2021-09-18 00:36:28 +03:00
|
|
|
auto collFloorResult = LaraCollisionFront(item, item->pos.yRot + ANGLE(90.0f), LARA_RAD + 48);
|
|
|
|
auto collCeilingResult = LaraCeilingCollisionFront(item, item->pos.yRot + ANGLE(90.0f), LARA_RAD + 48, LARA_HEIGHT);
|
2020-09-26 03:28:30 +10:00
|
|
|
|
2021-10-04 22:02:02 +11:00
|
|
|
if ((collFloorResult.Position.Floor < 128 && collFloorResult.Position.Floor > -128) && !collFloorResult.Position.Slope && collCeilingResult.Position.Ceiling <= 0)
|
2021-09-18 00:36:28 +03:00
|
|
|
item->goalAnimState = LS_STEP_RIGHT;
|
|
|
|
}
|
|
|
|
else if (TrInput & IN_LEFT)
|
|
|
|
{
|
2021-10-02 15:44:34 +03:00
|
|
|
Lara.turnRate -= LARA_TURN_RATE;
|
|
|
|
if (Lara.turnRate < -LARA_FAST_TURN)
|
|
|
|
Lara.turnRate = -LARA_FAST_TURN;
|
|
|
|
|
2021-09-18 00:36:28 +03:00
|
|
|
item->goalAnimState = LS_TURN_LEFT_SLOW;
|
2020-08-14 17:54:25 -05:00
|
|
|
}
|
2021-09-18 00:36:28 +03:00
|
|
|
else if (TrInput & IN_RIGHT)
|
|
|
|
{
|
2021-10-02 15:44:34 +03:00
|
|
|
Lara.turnRate += LARA_TURN_RATE;
|
|
|
|
if (Lara.turnRate > LARA_FAST_TURN)
|
|
|
|
Lara.turnRate = LARA_FAST_TURN;
|
|
|
|
|
2021-09-18 00:36:28 +03:00
|
|
|
item->goalAnimState = LS_TURN_RIGHT_SLOW;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (TrInput & IN_FORWARD)
|
|
|
|
fheight = LaraCollisionFront(item, item->pos.yRot, LARA_RAD + 4);
|
|
|
|
else if (TrInput & IN_BACK)
|
|
|
|
rheight = LaraCollisionFront(item, item->pos.yRot - ANGLE(180.0f), LARA_RAD + 4); // TR3: item->pos.yRot + ANGLE(180)?
|
2020-08-14 17:54:25 -05:00
|
|
|
|
|
|
|
if (Lara.waterStatus == LW_WADE)
|
|
|
|
{
|
|
|
|
if (TrInput & IN_JUMP && !(g_Level.Rooms[item->roomNumber].flags & ENV_FLAG_SWAMP))
|
|
|
|
item->goalAnimState = LS_JUMP_PREPARE;
|
|
|
|
|
|
|
|
if (TrInput & IN_FORWARD)
|
|
|
|
{
|
2021-10-02 15:44:34 +03:00
|
|
|
item->goalAnimState = LS_WADE_FORWARD;
|
|
|
|
|
2020-09-26 05:06:08 +10:00
|
|
|
bool wade = false;
|
|
|
|
|
|
|
|
if (g_Level.Rooms[item->roomNumber].flags & ENV_FLAG_SWAMP)
|
2020-08-14 17:54:25 -05:00
|
|
|
{
|
2021-09-10 00:43:26 +03:00
|
|
|
if (fheight.Position.Floor > -(STEPUP_HEIGHT - 1))
|
2020-09-26 05:06:08 +10:00
|
|
|
wade = true;
|
2020-08-14 17:54:25 -05:00
|
|
|
}
|
2020-09-26 05:06:08 +10:00
|
|
|
else
|
2020-08-14 17:54:25 -05:00
|
|
|
{
|
2021-09-10 00:43:26 +03:00
|
|
|
if ((fheight.Position.Floor < (STEPUP_HEIGHT - 1)) && (fheight.Position.Floor > -(STEPUP_HEIGHT - 1)))
|
2020-09-26 05:06:08 +10:00
|
|
|
wade = true;
|
2020-08-14 17:54:25 -05:00
|
|
|
}
|
|
|
|
|
2020-09-26 05:06:08 +10:00
|
|
|
if (!wade)
|
2020-08-14 17:54:25 -05:00
|
|
|
{
|
2020-12-19 23:34:52 -03:00
|
|
|
Lara.moveAngle = item->pos.yRot;
|
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 = 0;
|
|
|
|
coll->Setup.SlopesAreWalls = true;
|
|
|
|
coll->Setup.Radius = LARA_RAD + 2;
|
|
|
|
coll->Setup.ForwardAngle = Lara.moveAngle;
|
2020-09-26 05:06:08 +10:00
|
|
|
|
2021-09-19 06:42:24 +03:00
|
|
|
GetCollisionInfo(coll, item);
|
2020-09-26 05:06:08 +10:00
|
|
|
if (TestLaraVault(item, coll))
|
|
|
|
return;
|
|
|
|
|
2021-09-10 00:20:59 +03:00
|
|
|
coll->Setup.Radius = LARA_RAD;
|
2020-08-14 17:54:25 -05:00
|
|
|
}
|
|
|
|
}
|
2020-09-26 05:06:08 +10:00
|
|
|
else if (TrInput & IN_BACK)
|
2020-08-14 17:54:25 -05:00
|
|
|
{
|
2021-10-02 15:44:34 +03:00
|
|
|
if (TrInput & IN_WALK)
|
|
|
|
{
|
|
|
|
if ((rheight.Position.Floor < (STEPUP_HEIGHT - 1)) && (rheight.Position.Floor > -(STEPUP_HEIGHT - 1)) && !rheight.Position.Slope)
|
|
|
|
item->goalAnimState = LS_WALK_BACK;
|
|
|
|
}
|
|
|
|
else if (rheight.Position.Floor > -(STEPUP_HEIGHT - 1))
|
|
|
|
{
|
|
|
|
item->goalAnimState = LS_HOP_BACK;
|
|
|
|
}
|
2020-08-14 17:54:25 -05:00
|
|
|
}
|
|
|
|
}
|
2020-09-26 05:06:08 +10:00
|
|
|
else
|
2020-08-14 17:54:25 -05:00
|
|
|
{
|
|
|
|
if (TrInput & IN_JUMP)
|
|
|
|
{
|
2021-10-02 17:26:12 +03:00
|
|
|
if (coll->Middle.Ceiling < -LARA_HEADROOM * 0.7f)
|
2021-09-18 00:36:28 +03:00
|
|
|
item->goalAnimState = LS_JUMP_PREPARE;
|
2020-08-14 17:54:25 -05:00
|
|
|
}
|
2020-09-26 05:06:08 +10:00
|
|
|
else if (TrInput & IN_FORWARD)
|
2020-09-26 03:28:30 +10:00
|
|
|
{
|
2021-09-18 00:36:28 +03:00
|
|
|
auto cheight = LaraCeilingCollisionFront(item, item->pos.yRot, LARA_RAD + 4, LARA_HEIGHT);
|
2021-10-04 22:02:02 +11:00
|
|
|
|
2021-09-25 13:35:10 +03:00
|
|
|
// Don't try to move if there is slope in front
|
2021-09-18 00:36:28 +03:00
|
|
|
if (fheight.Position.Slope && (fheight.Position.Floor < 0 || cheight.Position.Ceiling > 0))
|
2021-09-17 22:55:09 +03:00
|
|
|
return; // item->goalAnimState = LS_STOP was removed here because it prevented Lara from rotating while still holding forward. -- Lwmte, 17.09.2021
|
|
|
|
|
2021-10-02 15:44:34 +03:00
|
|
|
if (TestLaraVault(item, coll))
|
|
|
|
return;
|
|
|
|
|
2021-09-18 03:06:21 +03:00
|
|
|
if (TrInput & IN_WALK)
|
2021-10-22 16:22:11 +03:00
|
|
|
{
|
|
|
|
if (coll->CollisionType == CT_FRONT) // Never try to walk if there's collision in front
|
|
|
|
return;
|
2021-10-02 15:44:34 +03:00
|
|
|
item->goalAnimState = LS_WALK_FORWARD;
|
2021-10-22 16:22:11 +03:00
|
|
|
}
|
2020-08-14 17:54:25 -05:00
|
|
|
else
|
2021-10-22 16:22:11 +03:00
|
|
|
{
|
|
|
|
if (cheight.Position.Ceiling > 0) // Only try to run if there's no overhang ceiling in front
|
|
|
|
return;
|
2021-10-02 15:44:34 +03:00
|
|
|
item->goalAnimState = LS_RUN_FORWARD;
|
2021-10-22 16:22:11 +03:00
|
|
|
}
|
2020-08-14 17:54:25 -05:00
|
|
|
}
|
2020-09-26 05:06:08 +10:00
|
|
|
else if (TrInput & IN_BACK)
|
2020-08-14 17:54:25 -05:00
|
|
|
{
|
2020-09-26 05:06:08 +10:00
|
|
|
if (TrInput & IN_WALK)
|
2020-08-14 17:54:25 -05:00
|
|
|
{
|
2021-09-17 22:55:09 +03:00
|
|
|
if ((rheight.Position.Floor < (STEPUP_HEIGHT - 1)) && (rheight.Position.Floor > -(STEPUP_HEIGHT - 1)) && !rheight.Position.Slope)
|
2021-10-02 15:44:34 +03:00
|
|
|
item->goalAnimState = LS_WALK_BACK;
|
2020-08-14 17:54:25 -05:00
|
|
|
}
|
2021-09-10 00:43:26 +03:00
|
|
|
else if (rheight.Position.Floor > -(STEPUP_HEIGHT - 1))
|
2020-08-14 17:54:25 -05:00
|
|
|
{
|
|
|
|
item->goalAnimState = LS_HOP_BACK;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-09-28 01:22:47 +10:00
|
|
|
// State: LS_STOP (2)
|
|
|
|
// Control: lara_as_stop()
|
2021-10-04 15:34:36 +11:00
|
|
|
void lara_col_stop(ITEM_INFO* item, COLL_INFO* coll)
|
2021-09-28 01:22:47 +10:00
|
|
|
{
|
|
|
|
Lara.moveAngle = item->pos.yRot;
|
2021-10-22 00:07:24 +11:00
|
|
|
coll->Setup.BadHeightDown = STEPUP_HEIGHT;
|
2021-10-10 00:58:30 +11:00
|
|
|
coll->Setup.BadHeightUp = -STEPUP_HEIGHT;
|
2021-09-28 01:22:47 +10:00
|
|
|
coll->Setup.BadCeilingHeight = 0;
|
|
|
|
item->gravityStatus = false;
|
|
|
|
item->fallspeed = 0;
|
|
|
|
coll->Setup.SlopesArePits = true;
|
|
|
|
coll->Setup.SlopesAreWalls = true;
|
|
|
|
coll->Setup.ForwardAngle = Lara.moveAngle;
|
|
|
|
GetCollisionInfo(coll, item);
|
|
|
|
|
|
|
|
if (TestLaraHitCeiling(coll))
|
|
|
|
{
|
|
|
|
SetLaraHitCeiling(item, coll);
|
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (TestLaraFall(coll))
|
|
|
|
{
|
|
|
|
SetLaraFallState(item);
|
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2021-11-05 21:29:00 +11:00
|
|
|
if (TestLaraSlide(item, coll))
|
2021-09-28 01:22:47 +10:00
|
|
|
return;
|
|
|
|
|
2021-10-15 00:46:15 +11:00
|
|
|
ShiftItem(item, coll);
|
|
|
|
|
2021-10-24 20:43:02 +11:00
|
|
|
// TODO: Vaulting from this state.
|
2021-09-28 01:22:47 +10:00
|
|
|
|
|
|
|
#if 1
|
|
|
|
if (coll->Middle.Floor != NO_HEIGHT)
|
|
|
|
item->pos.yPos += coll->Middle.Floor;
|
|
|
|
#else
|
|
|
|
if (!(g_Level.Rooms[item->roomNumber].flags & ENV_FLAG_SWAMP) || coll->Middle.Floor < 0)
|
|
|
|
item->pos.yPos += coll->Middle.Floor;
|
|
|
|
else if (g_Level.Rooms[item->roomNumber].flags & ENV_FLAG_SWAMP && coll->Middle.Floor)
|
|
|
|
item->pos.yPos += SWAMP_GRAVITY;
|
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
|
|
|
// LEGACY
|
|
|
|
void old_lara_col_stop(ITEM_INFO* item, COLL_INFO* coll)
|
2020-08-14 17:54:25 -05:00
|
|
|
{
|
2020-09-26 05:06:08 +10:00
|
|
|
/*state 2*/
|
|
|
|
/*state code: lara_as_stop*/
|
2020-12-19 23:34:52 -03:00
|
|
|
Lara.moveAngle = 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;
|
2020-09-26 05:06:08 +10:00
|
|
|
item->gravityStatus = false;
|
|
|
|
item->fallspeed = 0;
|
2021-09-10 00:20:59 +03:00
|
|
|
coll->Setup.SlopesArePits = true;
|
|
|
|
coll->Setup.SlopesAreWalls = true;
|
|
|
|
coll->Setup.ForwardAngle = Lara.moveAngle;
|
2021-09-19 06:42:24 +03:00
|
|
|
GetCollisionInfo(coll, item);
|
2020-08-14 17:54:25 -05:00
|
|
|
|
2020-09-26 05:06:08 +10:00
|
|
|
if (LaraHitCeiling(item, coll))
|
2020-08-14 17:54:25 -05:00
|
|
|
return;
|
|
|
|
|
2020-09-26 05:06:08 +10:00
|
|
|
if (LaraFallen(item, coll))
|
2020-08-14 17:54:25 -05:00
|
|
|
return;
|
|
|
|
|
2020-09-26 05:06:08 +10:00
|
|
|
if (TestLaraSlide(item, coll))
|
2020-08-14 17:54:25 -05:00
|
|
|
return;
|
|
|
|
|
|
|
|
ShiftItem(item, coll);
|
|
|
|
|
|
|
|
#if 1
|
2021-09-10 00:18:47 +03:00
|
|
|
if (coll->Middle.Floor != NO_HEIGHT)
|
|
|
|
item->pos.yPos += coll->Middle.Floor;
|
2020-08-14 17:54:25 -05:00
|
|
|
#else
|
2021-09-10 00:18:47 +03:00
|
|
|
if (!(g_Level.Rooms[item->roomNumber].flags & ENV_FLAG_SWAMP) || coll->Middle.Floor < 0)
|
|
|
|
item->pos.yPos += coll->Middle.Floor;
|
|
|
|
else if (g_Level.Rooms[item->roomNumber].flags & ENV_FLAG_SWAMP && coll->Middle.Floor)
|
2020-08-14 17:54:25 -05:00
|
|
|
item->pos.yPos += SWAMP_GRAVITY;
|
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
2021-02-03 01:50:59 -03:00
|
|
|
void lara_as_forwardjump(ITEM_INFO* item, COLL_INFO* coll)
|
2020-08-14 17:54:25 -05:00
|
|
|
{
|
2020-09-26 05:06:08 +10:00
|
|
|
/*state 3*/
|
|
|
|
/*collision: */
|
|
|
|
if (item->goalAnimState == LS_SWANDIVE_START ||
|
|
|
|
item->goalAnimState == LS_REACH)
|
|
|
|
item->goalAnimState = LS_JUMP_FORWARD;
|
2020-08-14 17:54:25 -05:00
|
|
|
|
2020-09-26 05:06:08 +10:00
|
|
|
if (item->goalAnimState != LS_DEATH &&
|
|
|
|
item->goalAnimState != LS_STOP &&
|
|
|
|
item->goalAnimState != LS_RUN_FORWARD)
|
2020-08-14 17:54:25 -05:00
|
|
|
{
|
2020-09-26 05:06:08 +10:00
|
|
|
if (Lara.gunStatus == LG_NO_ARMS && TrInput & IN_ACTION)
|
|
|
|
item->goalAnimState = LS_REACH;
|
|
|
|
|
|
|
|
if (TrInput & IN_BACK || TrInput & IN_ROLL)
|
|
|
|
item->goalAnimState = LS_JUMP_ROLL_180;
|
|
|
|
|
|
|
|
if (Lara.gunStatus == LG_NO_ARMS && TrInput & IN_WALK)
|
|
|
|
item->goalAnimState = LS_SWANDIVE_START;
|
|
|
|
|
|
|
|
if (item->fallspeed > LARA_FREEFALL_SPEED)
|
|
|
|
item->goalAnimState = LS_FREEFALL;
|
2020-08-14 17:54:25 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
if (TrInput & IN_LEFT)
|
|
|
|
{
|
|
|
|
Lara.turnRate -= LARA_TURN_RATE;
|
2020-09-26 05:06:08 +10:00
|
|
|
|
2021-09-28 01:22:47 +10:00
|
|
|
if (Lara.turnRate < -LARA_JUMP_TURN)
|
|
|
|
Lara.turnRate = -LARA_JUMP_TURN;
|
2020-08-14 17:54:25 -05:00
|
|
|
}
|
|
|
|
else if (TrInput & IN_RIGHT)
|
|
|
|
{
|
|
|
|
Lara.turnRate += LARA_TURN_RATE;
|
2020-09-26 05:06:08 +10:00
|
|
|
|
2021-09-28 01:22:47 +10:00
|
|
|
if (Lara.turnRate > LARA_JUMP_TURN)
|
|
|
|
Lara.turnRate = LARA_JUMP_TURN;
|
2020-08-14 17:54:25 -05:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-02-03 01:50:59 -03:00
|
|
|
void lara_col_forwardjump(ITEM_INFO* item, COLL_INFO* coll)
|
2020-08-14 17:54:25 -05:00
|
|
|
{
|
2020-09-26 05:06:08 +10:00
|
|
|
/*state 3*/
|
|
|
|
/*state code: lara_as_forwardjump*/
|
2020-08-14 17:54:25 -05:00
|
|
|
if (item->speed < 0)
|
2020-12-19 23:34:52 -03:00
|
|
|
Lara.moveAngle = item->pos.yRot + ANGLE(180);
|
2020-08-14 17:54:25 -05:00
|
|
|
else
|
2020-12-19 23:34:52 -03:00
|
|
|
Lara.moveAngle = item->pos.yRot;
|
2020-08-14 17:54:25 -05:00
|
|
|
|
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;
|
2020-09-26 03:28:30 +10:00
|
|
|
|
2021-09-10 00:20:59 +03:00
|
|
|
coll->Setup.ForwardAngle = Lara.moveAngle;
|
2021-09-19 06:42:24 +03:00
|
|
|
GetCollisionInfo(coll, item);
|
2020-08-14 17:54:25 -05:00
|
|
|
LaraDeflectEdgeJump(item, coll);
|
|
|
|
|
2020-09-26 05:06:08 +10:00
|
|
|
if (item->speed < 0)
|
2020-12-19 23:34:52 -03:00
|
|
|
Lara.moveAngle = item->pos.yRot;
|
2020-08-14 17:54:25 -05:00
|
|
|
|
2021-09-10 00:18:47 +03:00
|
|
|
if (coll->Middle.Floor <= 0 && item->fallspeed > 0)
|
2020-08-14 17:54:25 -05:00
|
|
|
{
|
2020-09-26 05:06:08 +10:00
|
|
|
if (LaraLandedBad(item, coll))
|
2020-08-14 17:54:25 -05:00
|
|
|
{
|
|
|
|
item->goalAnimState = LS_DEATH;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
if (Lara.waterStatus == LW_WADE)
|
|
|
|
{
|
|
|
|
item->goalAnimState = LS_STOP;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2020-09-26 05:06:08 +10:00
|
|
|
if (TrInput & IN_FORWARD && !(TrInput & IN_STEPSHIFT))
|
2020-08-14 17:54:25 -05:00
|
|
|
item->goalAnimState = LS_RUN_FORWARD;
|
|
|
|
else
|
|
|
|
item->goalAnimState = LS_STOP;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
item->gravityStatus = false;
|
|
|
|
item->fallspeed = 0;
|
|
|
|
item->speed = 0;
|
|
|
|
|
2021-09-10 00:18:47 +03:00
|
|
|
if (coll->Middle.Floor != NO_HEIGHT)
|
|
|
|
item->pos.yPos += coll->Middle.Floor;
|
2020-08-14 17:54:25 -05:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-10-13 19:50:46 +11:00
|
|
|
// State: LS_POSE (4)
|
2021-10-31 18:33:39 +11:00
|
|
|
// Control: lara_col_pose()
|
|
|
|
void lara_as_pose(ITEM_INFO* item, COLL_INFO* coll)
|
|
|
|
{
|
|
|
|
if (item->hitPoints <= 0)
|
|
|
|
{
|
|
|
|
item->goalAnimState = LS_DEATH;
|
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (TrInput & IN_LOOK)
|
|
|
|
LookUpDown();
|
|
|
|
|
|
|
|
if (TestLaraPose(item, coll))
|
|
|
|
{
|
|
|
|
if (TrInput & IN_ROLL)
|
|
|
|
{
|
|
|
|
item->goalAnimState = LS_ROLL_FORWARD;
|
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (TrInput & IN_WAKE)
|
|
|
|
{
|
|
|
|
item->goalAnimState = LS_STOP;
|
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
item->goalAnimState = LS_POSE;
|
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
item->goalAnimState = LS_STOP;
|
|
|
|
}
|
|
|
|
|
|
|
|
// State: LS_POSE (4)
|
|
|
|
// Control: lara_as_pose()
|
2021-02-03 01:50:59 -03:00
|
|
|
void lara_col_pose(ITEM_INFO* item, COLL_INFO* coll)
|
2020-08-14 17:54:25 -05:00
|
|
|
{
|
|
|
|
lara_col_stop(item, coll);
|
|
|
|
}
|
|
|
|
|
2021-10-09 20:19:34 +11:00
|
|
|
// State: LS_HOP_BACK (5)
|
|
|
|
// Collision: lara_col_fastback()
|
2021-02-03 01:50:59 -03:00
|
|
|
void lara_as_fastback(ITEM_INFO* item, COLL_INFO* coll)
|
2021-10-09 20:19:34 +11:00
|
|
|
{
|
|
|
|
if (TrInput & IN_LEFT)
|
|
|
|
{
|
|
|
|
Lara.turnRate -= LARA_TURN_RATE;
|
|
|
|
if (Lara.turnRate < -LARA_MED_TURN)
|
|
|
|
Lara.turnRate = -LARA_MED_TURN;
|
|
|
|
|
2021-10-22 01:50:43 +11:00
|
|
|
DoLaraLean(item, coll, -LARA_LEAN_MAX / 2, 12);
|
2021-10-09 20:19:34 +11:00
|
|
|
}
|
|
|
|
else if (TrInput & IN_RIGHT)
|
|
|
|
{
|
|
|
|
Lara.turnRate += LARA_TURN_RATE;
|
|
|
|
if (Lara.turnRate > LARA_MED_TURN)
|
|
|
|
Lara.turnRate = LARA_MED_TURN;
|
|
|
|
|
2021-10-22 01:50:43 +11:00
|
|
|
DoLaraLean(item, coll, LARA_LEAN_MAX / 2, 12);
|
2021-10-09 20:19:34 +11:00
|
|
|
}
|
|
|
|
|
2021-10-30 12:24:16 +11:00
|
|
|
if (TrInput & IN_ROLL)
|
|
|
|
{
|
|
|
|
item->goalAnimState = LS_ROLL_FORWARD;
|
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2021-10-09 20:19:34 +11:00
|
|
|
item->goalAnimState = LS_STOP;
|
|
|
|
}
|
|
|
|
|
|
|
|
// LEGACY
|
|
|
|
void old_lara_as_fastback(ITEM_INFO* item, COLL_INFO* coll)
|
2020-08-14 17:54:25 -05:00
|
|
|
{
|
2020-09-26 05:06:08 +10:00
|
|
|
/*state: 5*/
|
|
|
|
/*collision: lara_col_fastback*/
|
|
|
|
item->goalAnimState = LS_STOP;
|
2020-08-14 17:54:25 -05:00
|
|
|
if (TrInput & IN_LEFT)
|
|
|
|
{
|
|
|
|
Lara.turnRate -= LARA_TURN_RATE;
|
2021-10-02 15:44:34 +03:00
|
|
|
if (Lara.turnRate < -LARA_MED_TURN)
|
|
|
|
Lara.turnRate = -LARA_MED_TURN;
|
2020-08-14 17:54:25 -05:00
|
|
|
}
|
|
|
|
else if (TrInput & IN_RIGHT)
|
|
|
|
{
|
|
|
|
Lara.turnRate += LARA_TURN_RATE;
|
2021-10-02 15:44:34 +03:00
|
|
|
if (Lara.turnRate > LARA_MED_TURN)
|
|
|
|
Lara.turnRate = LARA_MED_TURN;
|
2020-08-14 17:54:25 -05:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-10-09 20:19:34 +11:00
|
|
|
// State: LS_HOP_BACK (5)
|
|
|
|
// Control: lara_as_fastback()
|
2021-02-03 01:50:59 -03:00
|
|
|
void lara_col_fastback(ITEM_INFO* item, COLL_INFO* coll)
|
2021-10-09 20:19:34 +11:00
|
|
|
{
|
2021-10-26 14:42:10 +11:00
|
|
|
Lara.moveAngle = item->pos.yRot + ANGLE(180.0f);
|
2021-10-09 20:19:34 +11:00
|
|
|
item->fallspeed = 0;
|
|
|
|
item->gravityStatus = false;
|
2021-10-26 13:06:27 +11:00
|
|
|
coll->Setup.SlopesAreWalls = false;
|
2021-10-09 20:19:34 +11:00
|
|
|
coll->Setup.SlopesArePits = true;
|
|
|
|
coll->Setup.BadHeightDown = NO_BAD_POS;
|
|
|
|
coll->Setup.BadHeightUp = -STEPUP_HEIGHT;
|
|
|
|
coll->Setup.BadCeilingHeight = 0;
|
|
|
|
coll->Setup.ForwardAngle = Lara.moveAngle;
|
|
|
|
GetCollisionInfo(coll, item);
|
|
|
|
|
|
|
|
if (TestLaraHitCeiling(coll))
|
|
|
|
{
|
|
|
|
SetLaraHitCeiling(item, coll);
|
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (LaraDeflectEdge(item, coll))
|
|
|
|
LaraCollideStop(item, coll);
|
|
|
|
|
|
|
|
if (coll->Middle.Floor > STEPUP_HEIGHT / 2)
|
|
|
|
{
|
2021-10-14 19:58:29 +11:00
|
|
|
SetLaraFallBackState(item);
|
2021-10-09 20:19:34 +11:00
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2021-11-05 21:29:00 +11:00
|
|
|
if (TestLaraSlide(item, coll))
|
2021-10-09 20:19:34 +11:00
|
|
|
return;
|
|
|
|
|
|
|
|
if (TestLaraStep(coll))
|
|
|
|
{
|
|
|
|
DoLaraStep(item, coll);
|
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
2021-10-09 23:00:26 +11:00
|
|
|
|
|
|
|
// LEGACY step
|
|
|
|
/*if (coll->Middle.Floor <= 200)
|
|
|
|
{
|
|
|
|
if (LaraDeflectEdge(item, coll))
|
|
|
|
LaraCollideStop(item, coll);
|
|
|
|
|
|
|
|
if (!TestLaraSlide(item, coll) && coll->Middle.Floor != NO_HEIGHT)
|
|
|
|
item->pos.yPos += coll->Middle.Floor;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
item->fallspeed = 0;
|
|
|
|
|
|
|
|
item->animNumber = LA_FALL_BACK;
|
|
|
|
item->frameNumber = g_Level.Anims[item->animNumber].frameBase;
|
|
|
|
item->currentAnimState = LS_FALL_BACK;
|
|
|
|
item->goalAnimState = LS_FALL_BACK;
|
|
|
|
|
|
|
|
item->gravityStatus = true;
|
|
|
|
}*/
|
2021-10-09 20:19:34 +11:00
|
|
|
}
|
|
|
|
|
|
|
|
// LEGACY
|
|
|
|
void old_lara_col_fastback(ITEM_INFO* item, COLL_INFO* coll)
|
2020-08-14 17:54:25 -05:00
|
|
|
{
|
2020-09-26 05:06:08 +10:00
|
|
|
/*state: 5*/
|
|
|
|
/*state code: lara_as_fastback*/
|
2020-08-14 17:54:25 -05:00
|
|
|
item->fallspeed = 0;
|
|
|
|
item->gravityStatus = false;
|
|
|
|
|
2020-12-19 23:34:52 -03:00
|
|
|
Lara.moveAngle = item->pos.yRot + ANGLE(180);
|
2020-09-26 05:06:08 +10:00
|
|
|
|
2021-09-10 00:20:59 +03:00
|
|
|
coll->Setup.SlopesAreWalls = false;
|
|
|
|
coll->Setup.SlopesArePits = true;
|
2020-09-26 05:06:08 +10:00
|
|
|
|
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 = 0;
|
2020-09-26 03:28:30 +10:00
|
|
|
|
2021-09-10 00:20:59 +03:00
|
|
|
coll->Setup.ForwardAngle = Lara.moveAngle;
|
2021-09-19 06:42:24 +03:00
|
|
|
GetCollisionInfo(coll, item);
|
2020-08-14 17:54:25 -05:00
|
|
|
|
2020-09-26 05:06:08 +10:00
|
|
|
if (!LaraHitCeiling(item, coll))
|
2020-09-26 03:28:30 +10:00
|
|
|
{
|
2021-09-10 00:18:47 +03:00
|
|
|
if (coll->Middle.Floor <= 200)
|
2020-09-26 03:28:30 +10:00
|
|
|
{
|
2020-09-26 05:06:08 +10:00
|
|
|
if (LaraDeflectEdge(item, coll))
|
|
|
|
LaraCollideStop(item, coll);
|
|
|
|
|
2021-09-10 00:18:47 +03:00
|
|
|
if (!TestLaraSlide(item, coll) && coll->Middle.Floor != NO_HEIGHT)
|
|
|
|
item->pos.yPos += coll->Middle.Floor;
|
2020-08-14 17:54:25 -05:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2020-09-26 05:06:08 +10:00
|
|
|
item->fallspeed = 0;
|
2020-08-14 17:54:25 -05:00
|
|
|
|
2020-09-26 05:06:08 +10:00
|
|
|
item->animNumber = LA_FALL_BACK;
|
|
|
|
item->frameNumber = g_Level.Anims[item->animNumber].frameBase;
|
|
|
|
item->currentAnimState = LS_FALL_BACK;
|
|
|
|
item->goalAnimState = LS_FALL_BACK;
|
2020-08-14 17:54:25 -05:00
|
|
|
|
2020-09-26 05:06:08 +10:00
|
|
|
item->gravityStatus = true;
|
|
|
|
}
|
2020-09-26 03:28:30 +10:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-10-05 22:09:07 +11:00
|
|
|
// State: LS_TURN_RIGHT_SLOW (6)
|
|
|
|
// Collision: lara_col_turn_r()
|
2021-02-03 01:50:59 -03:00
|
|
|
void lara_as_turn_r(ITEM_INFO* item, COLL_INFO* coll)
|
2021-10-05 22:09:07 +11:00
|
|
|
{
|
|
|
|
if (item->hitPoints <= 0)
|
|
|
|
{
|
2021-10-08 15:47:54 +11:00
|
|
|
item->goalAnimState = LS_DEATH;
|
2021-10-05 22:09:07 +11:00
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2021-10-08 15:47:54 +11:00
|
|
|
// TODO: This can't be anywhere below the run dispatch because tests to prevent forward/back movement currently don't exist.
|
|
|
|
Lara.turnRate += LARA_TURN_RATE;
|
2021-10-06 14:03:12 +11:00
|
|
|
|
2021-10-13 19:50:46 +11:00
|
|
|
if (Lara.waterStatus == LW_WADE)
|
2021-10-05 22:09:07 +11:00
|
|
|
{
|
2021-10-13 19:50:46 +11:00
|
|
|
LaraWadeTurnRight(item, coll);
|
2021-10-05 22:09:07 +11:00
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2021-10-17 20:07:30 +11:00
|
|
|
if (TrInput & IN_JUMP &&
|
|
|
|
coll->Middle.Ceiling < -LARA_HEADROOM * 0.7f)
|
2021-10-05 22:09:07 +11:00
|
|
|
{
|
2021-10-13 19:50:46 +11:00
|
|
|
item->goalAnimState = LS_JUMP_PREPARE;
|
2021-10-05 22:09:07 +11:00
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2021-10-13 19:50:46 +11:00
|
|
|
if (TrInput & IN_ROLL)
|
2021-10-05 22:09:07 +11:00
|
|
|
{
|
|
|
|
item->goalAnimState = LS_ROLL_FORWARD;
|
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2021-10-16 21:52:45 +11:00
|
|
|
if ((TrInput & IN_DUCK/* || TestLaraKeepDucked(coll)*/) &&
|
2021-10-13 19:50:46 +11:00
|
|
|
(Lara.gunStatus == LG_NO_ARMS || !IsStandingWeapon(Lara.gunType)))
|
2021-10-05 22:09:07 +11:00
|
|
|
{
|
|
|
|
item->goalAnimState = LS_CROUCH_IDLE;
|
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2021-10-28 23:22:28 +11:00
|
|
|
if (TrInput & IN_FORWARD)
|
2021-10-05 22:09:07 +11:00
|
|
|
{
|
2021-10-13 19:50:46 +11:00
|
|
|
if (TrInput & IN_WALK)
|
2021-10-28 23:22:28 +11:00
|
|
|
{
|
|
|
|
if (TestLaraWalkForward(item, coll))
|
|
|
|
{
|
|
|
|
item->goalAnimState = LS_WALK_FORWARD;
|
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else if (TrInput & IN_SPRINT &&
|
|
|
|
TestLaraRunForward(item, coll))
|
|
|
|
{
|
2021-10-13 19:50:46 +11:00
|
|
|
item->goalAnimState = LS_SPRINT;
|
2021-10-28 23:22:28 +11:00
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
else if (TestLaraRunForward(item, coll)) [[likely]]
|
|
|
|
{
|
2021-10-05 22:09:07 +11:00
|
|
|
item->goalAnimState = LS_RUN_FORWARD;
|
|
|
|
|
2021-10-28 23:22:28 +11:00
|
|
|
return;
|
|
|
|
}
|
2021-10-05 22:09:07 +11:00
|
|
|
}
|
2021-10-22 00:07:24 +11:00
|
|
|
else if (TrInput & IN_BACK)
|
2021-10-05 22:09:07 +11:00
|
|
|
{
|
2021-10-24 20:43:02 +11:00
|
|
|
if (TrInput & IN_WALK &&
|
|
|
|
TestLaraWalkBack(item, coll))
|
|
|
|
{
|
2021-10-05 22:09:07 +11:00
|
|
|
item->goalAnimState = LS_WALK_BACK;
|
2021-10-24 20:43:02 +11:00
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
else if (!(TrInput & IN_WALK) &&
|
|
|
|
TestLaraHopBack(item, coll)) [[likely]]
|
|
|
|
{
|
2021-10-05 22:09:07 +11:00
|
|
|
item->goalAnimState = LS_HOP_BACK;
|
|
|
|
|
2021-10-24 20:43:02 +11:00
|
|
|
return;
|
|
|
|
}
|
2021-10-05 22:09:07 +11:00
|
|
|
}
|
|
|
|
|
2021-10-08 15:47:54 +11:00
|
|
|
if (TrInput & IN_LSTEP &&
|
2021-10-19 21:28:36 +11:00
|
|
|
TestLaraStepLeft(item, coll))
|
2021-10-08 15:47:54 +11:00
|
|
|
{
|
|
|
|
item->goalAnimState = LS_STEP_LEFT;
|
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
else if (TrInput & IN_RSTEP &&
|
2021-10-19 21:28:36 +11:00
|
|
|
TestLaraStepRight(item, coll))
|
2021-10-08 15:47:54 +11:00
|
|
|
{
|
|
|
|
item->goalAnimState = LS_STEP_RIGHT;
|
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2021-10-16 20:50:16 +11:00
|
|
|
// TODO: Lara can get locked in the turn right/left animation when, holding forward against a wall,
|
|
|
|
// the player presses and holds the button to turn the opposite way. @Sezz 2021.10.16
|
2021-10-05 22:09:07 +11:00
|
|
|
if (TrInput & IN_RIGHT)
|
|
|
|
{
|
2021-10-13 19:50:46 +11:00
|
|
|
if (TrInput & IN_WALK) // TODO: This hasn't worked since TR1.
|
2021-10-05 22:09:07 +11:00
|
|
|
{
|
|
|
|
if (Lara.turnRate > LARA_SLOW_TURN)
|
|
|
|
Lara.turnRate = LARA_SLOW_TURN;
|
|
|
|
|
|
|
|
item->goalAnimState = LS_TURN_RIGHT_SLOW;
|
|
|
|
}
|
2021-10-08 20:08:55 +11:00
|
|
|
else if (Lara.turnRate > LARA_SLOW_TURN)
|
|
|
|
item->goalAnimState = LS_TURN_RIGHT_FAST;
|
2021-10-05 22:09:07 +11:00
|
|
|
else [[likely]]
|
|
|
|
item->goalAnimState = LS_TURN_RIGHT_SLOW;
|
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
item->goalAnimState = LS_STOP;
|
|
|
|
}
|
|
|
|
|
2021-10-13 19:50:46 +11:00
|
|
|
// Pseudo-state for turning right in wade-height water.
|
|
|
|
void LaraWadeTurnRight(ITEM_INFO* item, COLL_INFO* coll)
|
|
|
|
{
|
|
|
|
if (TrInput & IN_JUMP &&
|
|
|
|
!(g_Level.Rooms[item->roomNumber].flags & ENV_FLAG_SWAMP))
|
|
|
|
{
|
|
|
|
item->goalAnimState = LS_JUMP_PREPARE;
|
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2021-10-15 18:26:03 +11:00
|
|
|
if (TrInput & IN_FORWARD &&
|
|
|
|
coll->CollisionType != CT_FRONT &&
|
|
|
|
coll->CollisionType != CT_TOP_FRONT)
|
2021-10-13 19:50:46 +11:00
|
|
|
{
|
|
|
|
item->goalAnimState = LS_WADE_FORWARD;
|
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
2021-10-26 13:05:19 +11:00
|
|
|
else if (TrInput & IN_BACK &&
|
|
|
|
TestLaraWalkBack(item, coll))
|
2021-10-13 19:50:46 +11:00
|
|
|
{
|
|
|
|
item->goalAnimState = LS_WALK_BACK;
|
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (TrInput & IN_LSTEP &&
|
2021-10-19 21:28:36 +11:00
|
|
|
TestLaraStepLeft(item, coll))
|
2021-10-13 19:50:46 +11:00
|
|
|
{
|
|
|
|
item->goalAnimState = LS_STEP_LEFT;
|
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
else if (TrInput & IN_RSTEP &&
|
2021-10-19 21:28:36 +11:00
|
|
|
TestLaraStepRight(item, coll))
|
2021-10-13 19:50:46 +11:00
|
|
|
{
|
|
|
|
item->goalAnimState = LS_STEP_RIGHT;
|
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (TrInput & IN_RIGHT)
|
|
|
|
{
|
|
|
|
if (Lara.turnRate > LARA_SLOW_TURN)
|
|
|
|
Lara.turnRate = LARA_SLOW_TURN;
|
|
|
|
|
|
|
|
item->goalAnimState = LS_TURN_RIGHT_SLOW;
|
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
item->goalAnimState = LS_STOP;
|
|
|
|
}
|
|
|
|
|
2021-10-05 22:09:07 +11:00
|
|
|
// LEGACY
|
|
|
|
void old_lara_as_turn_r(ITEM_INFO* item, COLL_INFO* coll)
|
2020-09-26 03:28:30 +10:00
|
|
|
{
|
2020-09-26 05:06:08 +10:00
|
|
|
/*state: 6*/
|
|
|
|
/*collision: */
|
2020-09-26 03:28:30 +10:00
|
|
|
if (item->hitPoints <= 0)
|
|
|
|
{
|
|
|
|
item->goalAnimState = LS_STOP;
|
2020-09-26 05:06:08 +10:00
|
|
|
|
2020-09-26 03:28:30 +10:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
Lara.turnRate += LARA_TURN_RATE;
|
2020-09-26 05:06:08 +10:00
|
|
|
|
|
|
|
if (Lara.gunStatus != LG_READY || Lara.waterStatus == LW_WADE)
|
2020-09-26 03:28:30 +10:00
|
|
|
{
|
2021-10-02 15:44:34 +03:00
|
|
|
if (Lara.turnRate > LARA_SLOW_TURN)
|
2020-09-26 03:28:30 +10:00
|
|
|
{
|
2021-09-18 00:36:28 +03:00
|
|
|
if (TrInput & IN_WALK || Lara.waterStatus == LW_WADE)
|
2021-10-02 15:44:34 +03:00
|
|
|
Lara.turnRate = LARA_SLOW_TURN;
|
2020-09-26 05:06:08 +10:00
|
|
|
else
|
2021-10-08 20:08:55 +11:00
|
|
|
item->goalAnimState;// = LS_TURN_FAST;
|
2020-08-14 17:54:25 -05:00
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2021-10-08 20:08:55 +11:00
|
|
|
item->goalAnimState;// = LS_TURN_FAST;
|
2020-08-14 17:54:25 -05:00
|
|
|
}
|
|
|
|
|
2021-09-25 13:35:10 +03:00
|
|
|
// Don't try to move forward if button isn't pressed or there's no headroom in front
|
2021-10-06 14:03:12 +11:00
|
|
|
if (!(TrInput & IN_FORWARD))
|
2020-08-14 17:54:25 -05:00
|
|
|
{
|
2020-09-26 05:06:08 +10:00
|
|
|
if (!(TrInput & IN_RIGHT))
|
|
|
|
item->goalAnimState = LS_STOP;
|
2020-09-26 03:28:30 +10:00
|
|
|
|
2020-08-14 17:54:25 -05:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2020-09-26 05:06:08 +10:00
|
|
|
if (Lara.waterStatus == LW_WADE)
|
2020-08-14 17:54:25 -05:00
|
|
|
{
|
2020-09-26 05:06:08 +10:00
|
|
|
item->goalAnimState = LS_WADE_FORWARD;
|
2020-08-14 17:54:25 -05:00
|
|
|
}
|
2020-09-26 05:06:08 +10:00
|
|
|
else if (TrInput & IN_WALK)
|
2020-08-14 17:54:25 -05:00
|
|
|
{
|
2020-09-26 05:06:08 +10:00
|
|
|
item->goalAnimState = LS_WALK_FORWARD;
|
2020-08-14 17:54:25 -05:00
|
|
|
}
|
2020-09-26 05:06:08 +10:00
|
|
|
else
|
2020-08-14 17:54:25 -05:00
|
|
|
{
|
2020-09-26 05:06:08 +10:00
|
|
|
item->goalAnimState = LS_RUN_FORWARD;
|
2020-08-14 17:54:25 -05:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-10-15 00:46:15 +11:00
|
|
|
// State: LS_TURN_RIGHT_SLOW (6)
|
|
|
|
// Control: lara_as_turn_r()
|
2021-02-03 01:50:59 -03:00
|
|
|
void lara_col_turn_r(ITEM_INFO* item, COLL_INFO* coll)
|
2021-10-15 00:46:15 +11:00
|
|
|
{
|
|
|
|
lara_col_stop(item, coll);
|
|
|
|
}
|
|
|
|
|
|
|
|
// LEGACY
|
|
|
|
void old_lara_col_turn_r(ITEM_INFO* item, COLL_INFO* coll)
|
2020-08-14 17:54:25 -05:00
|
|
|
{
|
2020-09-26 05:06:08 +10:00
|
|
|
/*state: 6*/
|
|
|
|
/*state code: lara_as_turn_r*/
|
2020-08-14 17:54:25 -05:00
|
|
|
item->fallspeed = 0;
|
|
|
|
item->gravityStatus = false;
|
2020-12-19 23:34:52 -03:00
|
|
|
Lara.moveAngle = 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;
|
|
|
|
coll->Setup.SlopesArePits = true;
|
|
|
|
coll->Setup.ForwardAngle = Lara.moveAngle;
|
2021-09-19 06:42:24 +03:00
|
|
|
GetCollisionInfo(coll, item);
|
2020-08-14 17:54:25 -05:00
|
|
|
|
|
|
|
#if 1
|
2021-09-10 00:18:47 +03:00
|
|
|
if (coll->Middle.Floor > 100)
|
2020-08-14 17:54:25 -05:00
|
|
|
#else
|
2021-09-10 00:18:47 +03:00
|
|
|
if (coll->Middle.Floor > 100 && !(g_Level.Rooms[item->roomNumber].flags & ENV_FLAG_SWAMP))
|
2020-08-14 17:54:25 -05:00
|
|
|
#endif
|
|
|
|
{
|
|
|
|
item->fallspeed = 0;
|
2020-09-26 05:06:08 +10:00
|
|
|
item->animNumber = LA_FALL_START;
|
|
|
|
item->frameNumber = g_Level.Anims[item->animNumber].frameBase;
|
|
|
|
item->currentAnimState = LS_JUMP_FORWARD;
|
|
|
|
item->goalAnimState = LS_JUMP_FORWARD;
|
2020-08-14 17:54:25 -05:00
|
|
|
item->gravityStatus = true;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2020-09-26 05:06:08 +10:00
|
|
|
if (TestLaraSlide(item, coll))
|
2020-08-14 17:54:25 -05:00
|
|
|
return;
|
|
|
|
|
|
|
|
#if 1
|
2021-09-10 00:18:47 +03:00
|
|
|
if (coll->Middle.Floor != NO_HEIGHT)
|
|
|
|
item->pos.yPos += coll->Middle.Floor;
|
2020-08-14 17:54:25 -05:00
|
|
|
#else
|
2021-09-10 00:18:47 +03:00
|
|
|
if (!(g_Level.Rooms[item->roomNumber].flags & ENV_FLAG_SWAMP) || coll->Middle.Floor < 0)
|
|
|
|
item->pos.yPos += coll->Middle.Floor;
|
|
|
|
else if (g_Level.Rooms[item->roomNumber].flags & ENV_FLAG_SWAMP && coll->Middle.Floor)
|
2020-08-14 17:54:25 -05:00
|
|
|
item->pos.yPos += SWAMP_GRAVITY;
|
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
2021-10-08 15:47:54 +11:00
|
|
|
// State: LS_TURN_LEFT_SLOW (7)
|
|
|
|
// Collision: lara_col_turn_l()
|
2021-02-03 01:50:59 -03:00
|
|
|
void lara_as_turn_l(ITEM_INFO* item, COLL_INFO* coll)
|
2021-10-08 15:47:54 +11:00
|
|
|
{
|
|
|
|
if (item->hitPoints <= 0)
|
|
|
|
{
|
|
|
|
item->goalAnimState = LS_DEATH;
|
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
Lara.turnRate -= LARA_TURN_RATE;
|
|
|
|
|
2021-10-13 19:50:46 +11:00
|
|
|
if (Lara.waterStatus == LW_WADE)
|
2021-10-08 15:47:54 +11:00
|
|
|
{
|
2021-10-13 19:50:46 +11:00
|
|
|
LaraWadeTurnLeft(item, coll);
|
2021-10-08 15:47:54 +11:00
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2021-10-17 20:07:30 +11:00
|
|
|
if (TrInput & IN_JUMP &&
|
|
|
|
coll->Middle.Ceiling < -LARA_HEADROOM * 0.7f)
|
2021-10-08 15:47:54 +11:00
|
|
|
{
|
2021-10-13 19:50:46 +11:00
|
|
|
item->goalAnimState = LS_JUMP_PREPARE;
|
2021-10-08 15:47:54 +11:00
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2021-10-13 19:50:46 +11:00
|
|
|
if (TrInput & IN_ROLL)
|
2021-10-08 15:47:54 +11:00
|
|
|
{
|
|
|
|
item->goalAnimState = LS_ROLL_FORWARD;
|
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2021-11-02 14:22:58 +11:00
|
|
|
if ((TrInput & IN_DUCK) &&
|
2021-10-13 19:50:46 +11:00
|
|
|
(Lara.gunStatus == LG_NO_ARMS || !IsStandingWeapon(Lara.gunType)))
|
2021-10-08 15:47:54 +11:00
|
|
|
{
|
|
|
|
item->goalAnimState = LS_CROUCH_IDLE;
|
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2021-10-28 23:22:28 +11:00
|
|
|
if (TrInput & IN_FORWARD)
|
2021-10-08 15:47:54 +11:00
|
|
|
{
|
2021-10-13 19:50:46 +11:00
|
|
|
if (TrInput & IN_WALK)
|
2021-10-28 23:22:28 +11:00
|
|
|
{
|
|
|
|
if (TestLaraWalkForward(item, coll))
|
|
|
|
{
|
|
|
|
item->goalAnimState = LS_WALK_FORWARD;
|
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else if (TrInput & IN_SPRINT &&
|
|
|
|
TestLaraRunForward(item, coll))
|
|
|
|
{
|
2021-10-13 19:50:46 +11:00
|
|
|
item->goalAnimState = LS_SPRINT;
|
2021-10-28 23:22:28 +11:00
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
else if (TestLaraRunForward(item, coll)) [[likely]]
|
|
|
|
{
|
2021-10-08 15:47:54 +11:00
|
|
|
item->goalAnimState = LS_RUN_FORWARD;
|
|
|
|
|
2021-10-28 23:22:28 +11:00
|
|
|
return;
|
|
|
|
}
|
2021-10-08 15:47:54 +11:00
|
|
|
}
|
2021-10-22 00:07:24 +11:00
|
|
|
else if (TrInput & IN_BACK)
|
2021-10-08 15:47:54 +11:00
|
|
|
{
|
2021-10-24 20:43:02 +11:00
|
|
|
if (TrInput & IN_WALK &&
|
|
|
|
TestLaraWalkBack(item, coll))
|
|
|
|
{
|
2021-10-08 15:47:54 +11:00
|
|
|
item->goalAnimState = LS_WALK_BACK;
|
2021-10-24 20:43:02 +11:00
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
else if (!(TrInput & IN_WALK) &&
|
|
|
|
TestLaraHopBack(item, coll)) [[likely]]
|
|
|
|
{
|
2021-10-08 15:47:54 +11:00
|
|
|
item->goalAnimState = LS_HOP_BACK;
|
|
|
|
|
2021-10-24 20:43:02 +11:00
|
|
|
return;
|
|
|
|
}
|
2021-10-08 15:47:54 +11:00
|
|
|
}
|
|
|
|
|
|
|
|
if (TrInput & IN_LSTEP &&
|
2021-10-19 21:28:36 +11:00
|
|
|
TestLaraStepLeft(item, coll))
|
2021-10-08 15:47:54 +11:00
|
|
|
{
|
|
|
|
item->goalAnimState = LS_STEP_LEFT;
|
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
2021-10-24 20:43:02 +11:00
|
|
|
// TODO: Lara steps left. Why?? @Sezz 2021.10.08
|
|
|
|
else if (TrInput & IN_RSTEP &&
|
2021-10-19 21:28:36 +11:00
|
|
|
TestLaraStepRight(item, coll))
|
2021-10-08 15:47:54 +11:00
|
|
|
{
|
|
|
|
item->goalAnimState = LS_STEP_RIGHT;
|
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (TrInput & IN_LEFT)
|
|
|
|
{
|
2021-10-13 19:50:46 +11:00
|
|
|
if (TrInput & IN_WALK)
|
2021-10-08 15:47:54 +11:00
|
|
|
{
|
|
|
|
if (Lara.turnRate < -LARA_SLOW_TURN)
|
|
|
|
Lara.turnRate = -LARA_SLOW_TURN;
|
|
|
|
|
|
|
|
item->goalAnimState = LS_TURN_LEFT_SLOW;
|
|
|
|
}
|
2021-10-08 20:08:55 +11:00
|
|
|
else if (Lara.turnRate < -LARA_SLOW_TURN)
|
|
|
|
item->goalAnimState = LS_TURN_LEFT_FAST;
|
2021-10-08 15:47:54 +11:00
|
|
|
else [[likely]]
|
|
|
|
item->goalAnimState = LS_TURN_RIGHT_SLOW;
|
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
item->goalAnimState = LS_STOP;
|
|
|
|
}
|
|
|
|
|
2021-10-13 19:50:46 +11:00
|
|
|
// Pseudo-state for turning left in wade-height water.
|
|
|
|
void LaraWadeTurnLeft(ITEM_INFO* item, COLL_INFO* coll)
|
|
|
|
{
|
|
|
|
if (TrInput & IN_JUMP &&
|
|
|
|
!(g_Level.Rooms[item->roomNumber].flags & ENV_FLAG_SWAMP))
|
|
|
|
{
|
|
|
|
item->goalAnimState = LS_JUMP_PREPARE;
|
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2021-10-15 18:26:03 +11:00
|
|
|
if (TrInput & IN_FORWARD &&
|
|
|
|
coll->CollisionType != CT_FRONT &&
|
|
|
|
coll->CollisionType != CT_TOP_FRONT)
|
2021-10-13 19:50:46 +11:00
|
|
|
{
|
|
|
|
item->goalAnimState = LS_WADE_FORWARD;
|
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
2021-10-26 13:05:19 +11:00
|
|
|
else if (TrInput & IN_BACK &&
|
|
|
|
TestLaraWalkBack(item, coll))
|
2021-10-13 19:50:46 +11:00
|
|
|
{
|
|
|
|
item->goalAnimState = LS_WALK_BACK;
|
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (TrInput & IN_LSTEP &&
|
2021-10-19 21:28:36 +11:00
|
|
|
TestLaraStepLeft(item, coll))
|
2021-10-13 19:50:46 +11:00
|
|
|
{
|
|
|
|
item->goalAnimState = LS_STEP_LEFT;
|
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
else if (TrInput & IN_RSTEP &&
|
2021-10-19 21:28:36 +11:00
|
|
|
TestLaraStepRight(item, coll))
|
2021-10-13 19:50:46 +11:00
|
|
|
{
|
|
|
|
item->goalAnimState = LS_STEP_RIGHT;
|
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (TrInput & IN_LEFT)
|
|
|
|
{
|
|
|
|
if (Lara.turnRate < -LARA_SLOW_TURN)
|
|
|
|
Lara.turnRate = -LARA_SLOW_TURN;
|
|
|
|
|
|
|
|
item->goalAnimState = LS_TURN_LEFT_SLOW;
|
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
item->goalAnimState = LS_STOP;
|
|
|
|
}
|
|
|
|
|
2021-10-08 15:47:54 +11:00
|
|
|
// LEGACY
|
|
|
|
void old_lara_as_turn_l(ITEM_INFO* item, COLL_INFO* coll)
|
2020-08-14 17:54:25 -05:00
|
|
|
{
|
2020-09-26 05:06:08 +10:00
|
|
|
/*state 7*/
|
|
|
|
/*collision: lara_col_turn_l*/
|
2020-08-14 17:54:25 -05:00
|
|
|
if (item->hitPoints <= 0)
|
|
|
|
{
|
|
|
|
item->goalAnimState = LS_STOP;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
Lara.turnRate -= LARA_TURN_RATE;
|
2020-09-26 05:06:08 +10:00
|
|
|
|
|
|
|
if (Lara.gunStatus != LG_READY || Lara.waterStatus == LW_WADE)
|
2020-08-14 17:54:25 -05:00
|
|
|
{
|
2021-10-02 15:44:34 +03:00
|
|
|
if (Lara.turnRate < -LARA_SLOW_TURN)
|
2020-08-14 17:54:25 -05:00
|
|
|
{
|
2021-09-18 00:36:28 +03:00
|
|
|
if (TrInput & IN_WALK || Lara.waterStatus == LW_WADE)
|
2021-10-02 15:44:34 +03:00
|
|
|
Lara.turnRate = -LARA_SLOW_TURN;
|
2020-09-26 05:06:08 +10:00
|
|
|
else
|
2021-10-13 19:50:46 +11:00
|
|
|
item->goalAnimState;// = LS_TURN_FAST; // Dead state.
|
2020-08-14 17:54:25 -05:00
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2021-10-13 19:50:46 +11:00
|
|
|
item->goalAnimState;// = LS_TURN_FAST; // Dead state.
|
2020-08-14 17:54:25 -05:00
|
|
|
}
|
|
|
|
|
2021-09-25 13:35:10 +03:00
|
|
|
// Don't try to move forward if button isn't pressed or there's no headroom in front
|
|
|
|
if (!(TrInput & IN_FORWARD) || coll->CollisionType == CT_FRONT)
|
2020-08-14 17:54:25 -05:00
|
|
|
{
|
2020-09-26 05:06:08 +10:00
|
|
|
if (!(TrInput & IN_LEFT))
|
|
|
|
item->goalAnimState = LS_STOP;
|
2020-09-26 03:28:30 +10:00
|
|
|
|
2020-08-14 17:54:25 -05:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2020-09-26 05:06:08 +10:00
|
|
|
if (Lara.waterStatus == LW_WADE)
|
2020-08-14 17:54:25 -05:00
|
|
|
{
|
2020-09-26 05:06:08 +10:00
|
|
|
item->goalAnimState = LS_WADE_FORWARD;
|
2020-08-14 17:54:25 -05:00
|
|
|
}
|
2020-09-26 05:06:08 +10:00
|
|
|
else if (TrInput & IN_WALK)
|
2020-08-14 17:54:25 -05:00
|
|
|
{
|
2020-09-26 05:06:08 +10:00
|
|
|
item->goalAnimState = LS_WALK_FORWARD;
|
2020-08-14 17:54:25 -05:00
|
|
|
}
|
2020-09-26 05:06:08 +10:00
|
|
|
else
|
2020-08-14 17:54:25 -05:00
|
|
|
{
|
2020-09-26 05:06:08 +10:00
|
|
|
item->goalAnimState = LS_RUN_FORWARD;
|
2020-08-14 17:54:25 -05:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-10-15 00:46:15 +11:00
|
|
|
// State: LS_TURN_LEFT_SLOW (7)
|
|
|
|
// Control: lara_as_turn_l()
|
2021-02-03 01:50:59 -03:00
|
|
|
void lara_col_turn_l(ITEM_INFO* item, COLL_INFO* coll)
|
2020-08-14 17:54:25 -05:00
|
|
|
{
|
2020-09-26 05:06:08 +10:00
|
|
|
lara_col_turn_r(item, coll);
|
2020-08-14 17:54:25 -05:00
|
|
|
}
|
|
|
|
|
2021-02-03 01:50:59 -03:00
|
|
|
void lara_as_death(ITEM_INFO* item, COLL_INFO* coll)
|
2020-08-14 17:54:25 -05:00
|
|
|
{
|
2020-09-26 05:06:08 +10:00
|
|
|
/*state 8*/
|
|
|
|
/*collision: lara_col_death*/
|
2020-08-14 17:54:25 -05:00
|
|
|
Lara.look = false;
|
2021-09-10 00:20:59 +03:00
|
|
|
coll->Setup.EnableObjectPush = false;
|
|
|
|
coll->Setup.EnableSpaz = false;
|
2020-08-14 17:54:25 -05:00
|
|
|
if (BinocularRange)
|
|
|
|
{
|
|
|
|
BinocularRange = 0;
|
|
|
|
LaserSight = 0;
|
2020-09-26 05:06:08 +10:00
|
|
|
AlterFOV(ANGLE(80.0f));
|
2020-08-14 17:54:25 -05:00
|
|
|
LaraItem->meshBits = -1;
|
|
|
|
Lara.busy = false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-02-03 01:50:59 -03:00
|
|
|
void lara_col_death(ITEM_INFO* item, COLL_INFO* coll)
|
2020-08-14 17:54:25 -05:00
|
|
|
{
|
2020-09-26 05:06:08 +10:00
|
|
|
/*state 8*/
|
|
|
|
/*state code: lara_as_death*/
|
2021-05-26 06:04:32 +02:00
|
|
|
StopSoundEffect(SFX_TR4_LARA_FALL);
|
2020-09-26 03:28:30 +10:00
|
|
|
|
2020-12-19 23:34:52 -03:00
|
|
|
Lara.moveAngle = 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;
|
2021-09-10 01:19:15 +03:00
|
|
|
coll->Setup.Radius = LARA_RAD_DEATH;
|
2020-09-26 03:28:30 +10:00
|
|
|
|
2021-09-10 00:20:59 +03:00
|
|
|
coll->Setup.ForwardAngle = Lara.moveAngle;
|
2021-09-19 06:42:24 +03:00
|
|
|
GetCollisionInfo(coll, item);
|
2020-08-14 17:54:25 -05:00
|
|
|
ShiftItem(item, coll);
|
|
|
|
|
|
|
|
item->hitPoints = -1;
|
|
|
|
Lara.air = -1;
|
|
|
|
|
2021-09-10 00:18:47 +03:00
|
|
|
if (coll->Middle.Floor != NO_HEIGHT)
|
|
|
|
item->pos.yPos += coll->Middle.Floor;
|
2020-08-14 17:54:25 -05:00
|
|
|
}
|
|
|
|
|
2021-02-03 01:50:59 -03:00
|
|
|
void lara_as_fastfall(ITEM_INFO* item, COLL_INFO* coll)
|
2020-08-14 17:54:25 -05:00
|
|
|
{
|
2020-09-26 05:06:08 +10:00
|
|
|
/*state 9*/
|
|
|
|
/*collision: lara_col_fastfall*/
|
2020-08-14 17:54:25 -05:00
|
|
|
item->speed = (item->speed * 95) / 100;
|
|
|
|
if (item->fallspeed == 154)
|
2021-05-26 06:04:32 +02:00
|
|
|
SoundEffect(SFX_TR4_LARA_FALL, &item->pos, 0);
|
2020-08-14 17:54:25 -05:00
|
|
|
}
|
|
|
|
|
2021-02-03 01:50:59 -03:00
|
|
|
void lara_col_fastfall(ITEM_INFO* item, COLL_INFO* coll)
|
2020-08-14 17:54:25 -05:00
|
|
|
{
|
2020-09-26 05:06:08 +10:00
|
|
|
/*state 9*/
|
|
|
|
/*state code: lara_as_fastfall*/
|
2020-08-14 17:54:25 -05:00
|
|
|
item->gravityStatus = true;
|
|
|
|
|
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;
|
2020-09-26 03:28:30 +10:00
|
|
|
|
2021-09-10 00:20:59 +03:00
|
|
|
coll->Setup.ForwardAngle = Lara.moveAngle;
|
2021-09-19 06:42:24 +03:00
|
|
|
GetCollisionInfo(coll, item);
|
2020-09-26 05:06:08 +10:00
|
|
|
LaraSlideEdgeJump(item, coll);
|
2020-08-14 17:54:25 -05:00
|
|
|
|
2021-09-10 00:18:47 +03:00
|
|
|
if (coll->Middle.Floor <= 0)
|
2020-08-14 17:54:25 -05:00
|
|
|
{
|
|
|
|
if (LaraLandedBad(item, coll))
|
|
|
|
{
|
|
|
|
item->goalAnimState = LS_DEATH;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
item->goalAnimState = LS_STOP;
|
2020-09-26 05:06:08 +10:00
|
|
|
item->currentAnimState = LS_STOP;
|
|
|
|
item->animNumber = LA_FREEFALL_LAND;
|
|
|
|
item->frameNumber = g_Level.Anims[item->animNumber].frameBase;
|
2020-08-14 17:54:25 -05:00
|
|
|
}
|
|
|
|
|
2021-05-26 06:04:32 +02:00
|
|
|
StopSoundEffect(SFX_TR4_LARA_FALL);
|
2020-09-26 05:06:08 +10:00
|
|
|
|
2020-08-14 17:54:25 -05:00
|
|
|
item->fallspeed = 0;
|
|
|
|
item->gravityStatus = false;
|
|
|
|
|
2021-09-10 00:18:47 +03:00
|
|
|
if (coll->Middle.Floor != NO_HEIGHT)
|
|
|
|
item->pos.yPos += coll->Middle.Floor;
|
2020-08-14 17:54:25 -05:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-02-03 01:50:59 -03:00
|
|
|
void lara_as_reach(ITEM_INFO* item, COLL_INFO* coll)
|
2020-08-14 17:54:25 -05:00
|
|
|
{
|
2020-09-26 05:06:08 +10:00
|
|
|
/*state 11*/
|
|
|
|
/*collision: lara_col_reach*/
|
2020-08-14 17:54:25 -05:00
|
|
|
Camera.targetAngle = ANGLE(85.0f);
|
|
|
|
if (item->fallspeed > LARA_FREEFALL_SPEED)
|
|
|
|
item->goalAnimState = LS_FREEFALL;
|
|
|
|
}
|
|
|
|
|
2021-02-03 01:50:59 -03:00
|
|
|
void lara_col_reach(ITEM_INFO* item, COLL_INFO* coll)
|
2020-08-14 17:54:25 -05:00
|
|
|
{
|
2020-09-26 05:06:08 +10:00
|
|
|
/*state 11*/
|
|
|
|
/*state code: lara_as_reach*/
|
2020-08-14 17:54:25 -05:00
|
|
|
if (Lara.ropePtr == -1)
|
|
|
|
item->gravityStatus = true;
|
|
|
|
|
2020-12-19 23:34:52 -03:00
|
|
|
Lara.moveAngle = item->pos.yRot;
|
2020-08-14 17:54:25 -05:00
|
|
|
|
2021-10-03 21:13:00 +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 = 0;
|
2021-09-10 00:20:59 +03:00
|
|
|
coll->Setup.BadCeilingHeight = BAD_JUMP_CEILING;
|
|
|
|
coll->Setup.ForwardAngle = Lara.moveAngle;
|
2021-10-27 09:48:48 +03:00
|
|
|
coll->Setup.Radius = coll->Setup.Radius * 1.2f;
|
|
|
|
coll->Setup.Mode = COLL_PROBE_MODE::FREE_FORWARD;
|
2021-10-03 21:13:00 +03:00
|
|
|
|
2021-09-19 06:42:24 +03:00
|
|
|
GetCollisionInfo(coll, item);
|
2020-08-14 17:54:25 -05:00
|
|
|
|
2021-10-27 09:48:48 +03:00
|
|
|
if (TestLaraHangJump(item, coll))
|
|
|
|
return;
|
2020-08-14 17:54:25 -05:00
|
|
|
|
2021-10-27 09:48:48 +03:00
|
|
|
LaraSlideEdgeJump(item, coll);
|
|
|
|
coll->Setup.ForwardAngle = Lara.moveAngle;
|
|
|
|
GetCollisionInfo(coll, item);
|
|
|
|
ShiftItem(item, coll);
|
2020-08-14 17:54:25 -05:00
|
|
|
|
2021-10-27 09:48:48 +03:00
|
|
|
if (item->fallspeed > 0 && coll->Middle.Floor <= 0)
|
2020-08-14 17:54:25 -05:00
|
|
|
{
|
2021-10-27 09:48:48 +03:00
|
|
|
if (LaraLandedBad(item, coll))
|
2020-08-14 17:54:25 -05:00
|
|
|
{
|
2021-10-27 09:48:48 +03:00
|
|
|
item->goalAnimState = LS_DEATH;
|
2020-08-14 17:54:25 -05:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2021-10-27 09:48:48 +03:00
|
|
|
item->goalAnimState = LS_STOP;
|
|
|
|
item->fallspeed = 0;
|
|
|
|
item->gravityStatus = false;
|
|
|
|
if (coll->Middle.Floor != NO_HEIGHT)
|
|
|
|
item->pos.yPos += coll->Middle.Floor;
|
2020-08-14 17:54:25 -05:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-02-03 01:50:59 -03:00
|
|
|
void lara_as_splat(ITEM_INFO* item, COLL_INFO* coll)
|
2020-08-14 17:54:25 -05:00
|
|
|
{
|
|
|
|
Lara.look = false;
|
|
|
|
}
|
|
|
|
|
2021-02-03 01:50:59 -03:00
|
|
|
void lara_col_splat(ITEM_INFO* item, COLL_INFO* coll)
|
2020-08-14 17:54:25 -05:00
|
|
|
{
|
2020-12-19 23:34:52 -03:00
|
|
|
Lara.moveAngle = item->pos.yRot;
|
2020-08-14 17:54:25 -05:00
|
|
|
|
2021-09-10 00:20:59 +03:00
|
|
|
coll->Setup.SlopesAreWalls = true;
|
|
|
|
coll->Setup.SlopesArePits = true;
|
2020-09-26 05:06:08 +10:00
|
|
|
|
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;
|
2020-09-26 03:28:30 +10:00
|
|
|
|
2021-09-10 00:20:59 +03:00
|
|
|
coll->Setup.ForwardAngle = Lara.moveAngle;
|
2021-09-19 06:42:24 +03:00
|
|
|
GetCollisionInfo(coll, item);
|
2020-08-14 17:54:25 -05:00
|
|
|
ShiftItem(item, coll);
|
|
|
|
|
2021-09-10 00:18:47 +03:00
|
|
|
if (coll->Middle.Floor >= -256 && coll->Middle.Floor <= 256)
|
|
|
|
item->pos.yPos += coll->Middle.Floor;
|
2020-08-14 17:54:25 -05:00
|
|
|
}
|
|
|
|
|
2021-02-03 01:50:59 -03:00
|
|
|
void lara_col_land(ITEM_INFO* item, COLL_INFO* coll)
|
2020-08-14 17:54:25 -05:00
|
|
|
{
|
2020-09-26 05:06:08 +10:00
|
|
|
/*state 14*/
|
|
|
|
/*state code: lara_void_func*/
|
|
|
|
lara_col_stop(item, coll);
|
|
|
|
}
|
|
|
|
|
2021-10-15 22:20:34 +11:00
|
|
|
// State: LS_JUMP_PREPARE (15)
|
|
|
|
// Collision: lara_col_compress()
|
2020-09-26 05:06:08 +10:00
|
|
|
void lara_as_compress(ITEM_INFO* item, COLL_INFO* coll)
|
2021-10-15 22:20:34 +11:00
|
|
|
{
|
|
|
|
// TODO: dispatch
|
|
|
|
/*if (item->hitPoints <= 0)
|
|
|
|
{
|
|
|
|
item->goalAnimState = LS_DEATH;
|
|
|
|
|
|
|
|
return;
|
|
|
|
}*/
|
|
|
|
|
|
|
|
if (Lara.waterStatus == LW_WADE)
|
|
|
|
{
|
|
|
|
item->goalAnimState = LS_JUMP_UP;
|
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2021-10-16 23:51:42 +11:00
|
|
|
if (TrInput & IN_LEFT &&
|
|
|
|
TrInput & (IN_FORWARD | IN_BACK))
|
|
|
|
{
|
|
|
|
Lara.turnRate -= LARA_TURN_RATE;
|
|
|
|
if (Lara.turnRate < -LARA_SLOW_TURN)
|
|
|
|
Lara.turnRate = -LARA_SLOW_TURN;
|
|
|
|
}
|
|
|
|
else if (TrInput & IN_RIGHT &&
|
|
|
|
TrInput & (IN_FORWARD | IN_BACK))
|
|
|
|
{
|
|
|
|
Lara.turnRate += LARA_TURN_RATE;
|
|
|
|
if (Lara.turnRate > LARA_SLOW_TURN)
|
|
|
|
Lara.turnRate = LARA_SLOW_TURN;
|
|
|
|
}
|
|
|
|
|
2021-10-15 22:20:34 +11:00
|
|
|
if (TrInput & IN_FORWARD &&
|
2021-10-17 20:40:17 +11:00
|
|
|
TestLaraStandingJump(item, coll, item->pos.yRot))
|
2021-10-15 22:20:34 +11:00
|
|
|
{
|
2021-10-16 23:51:42 +11:00
|
|
|
Lara.moveAngle = coll->Setup.ForwardAngle;
|
2021-10-15 22:20:34 +11:00
|
|
|
item->goalAnimState = LS_JUMP_FORWARD;
|
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
else if (TrInput & IN_BACK &&
|
2021-10-17 20:40:17 +11:00
|
|
|
TestLaraStandingJump(item, coll, item->pos.yRot + ANGLE(180.0f)))
|
2021-10-15 22:20:34 +11:00
|
|
|
{
|
2021-10-16 23:51:42 +11:00
|
|
|
Lara.moveAngle = coll->Setup.ForwardAngle + ANGLE(180.0f);
|
2021-10-15 22:20:34 +11:00
|
|
|
item->goalAnimState = LS_JUMP_BACK;
|
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (TrInput & IN_LEFT &&
|
2021-10-17 20:40:17 +11:00
|
|
|
TestLaraStandingJump(item, coll, item->pos.yRot - ANGLE(90.0f)))
|
2021-10-15 22:20:34 +11:00
|
|
|
{
|
2021-10-16 23:51:42 +11:00
|
|
|
Lara.moveAngle = coll->Setup.ForwardAngle - ANGLE(90.0f);
|
2021-10-15 22:20:34 +11:00
|
|
|
item->goalAnimState = LS_JUMP_LEFT;
|
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
else if (TrInput & IN_RIGHT &&
|
2021-10-17 20:40:17 +11:00
|
|
|
TestLaraStandingJump(item, coll, item->pos.yRot + ANGLE(90.0f)))
|
2021-10-15 22:20:34 +11:00
|
|
|
{
|
2021-10-16 23:51:42 +11:00
|
|
|
Lara.moveAngle = coll->Setup.ForwardAngle + ANGLE(90.0f);
|
2021-10-15 22:20:34 +11:00
|
|
|
item->goalAnimState = LS_JUMP_RIGHT;
|
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
item->goalAnimState = LS_JUMP_UP;
|
|
|
|
}
|
|
|
|
|
|
|
|
// LEGACY
|
|
|
|
void old_lara_as_compress(ITEM_INFO* item, COLL_INFO* coll)
|
2020-09-26 05:06:08 +10:00
|
|
|
{
|
|
|
|
/*state 15*/
|
|
|
|
/*collision: lara_col_compress*/
|
2020-08-14 17:54:25 -05:00
|
|
|
if (Lara.waterStatus != LW_WADE)
|
|
|
|
{
|
2021-10-16 13:49:14 +11:00
|
|
|
if (TrInput & IN_FORWARD && !TestLaraFacingCorner(item, item->pos.yRot, 256) && LaraFloorFront(item, item->pos.yRot, 256) >= -384)
|
2020-08-14 17:54:25 -05:00
|
|
|
{
|
|
|
|
item->goalAnimState = LS_JUMP_FORWARD;
|
2020-12-19 23:34:52 -03:00
|
|
|
Lara.moveAngle = item->pos.yRot;
|
2020-08-14 17:54:25 -05:00
|
|
|
}
|
2021-10-16 13:49:14 +11:00
|
|
|
else if (TrInput & IN_LEFT && !TestLaraFacingCorner(item, item->pos.yRot - ANGLE(90.0f), 256) && LaraFloorFront(item, item->pos.yRot - ANGLE(90.0f), 256) >= -384)
|
2020-08-14 17:54:25 -05:00
|
|
|
{
|
2020-09-02 15:59:57 -05:00
|
|
|
item->goalAnimState = LS_JUMP_LEFT;
|
2020-12-19 23:34:52 -03:00
|
|
|
Lara.moveAngle = item->pos.yRot - ANGLE(90);
|
2020-08-14 17:54:25 -05:00
|
|
|
}
|
2021-10-16 13:49:14 +11:00
|
|
|
else if (TrInput & IN_RIGHT && !TestLaraFacingCorner(item, item->pos.yRot + ANGLE(90.0f), 256) && LaraFloorFront(item, item->pos.yRot + ANGLE(90.0f), 256) >= -384)
|
2020-08-14 17:54:25 -05:00
|
|
|
{
|
2020-09-02 15:59:57 -05:00
|
|
|
item->goalAnimState = LS_JUMP_RIGHT;
|
2020-12-19 23:34:52 -03:00
|
|
|
Lara.moveAngle = item->pos.yRot + ANGLE(90);
|
2020-08-14 17:54:25 -05:00
|
|
|
}
|
2021-10-16 13:49:14 +11:00
|
|
|
else if (TrInput & IN_BACK && !TestLaraFacingCorner(item, item->pos.yRot - ANGLE(180.0f), 256) && LaraFloorFront(item, item->pos.yRot - ANGLE(180.0f), 256) >= -384)
|
2020-08-14 17:54:25 -05:00
|
|
|
{
|
2020-09-26 05:06:08 +10:00
|
|
|
item->goalAnimState = LS_JUMP_BACK;
|
2020-12-19 23:34:52 -03:00
|
|
|
Lara.moveAngle = item->pos.yRot + ANGLE(180);
|
2020-08-14 17:54:25 -05:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (item->fallspeed > LARA_FREEFALL_SPEED)
|
|
|
|
item->goalAnimState = LS_FREEFALL;
|
|
|
|
}
|
|
|
|
|
2021-10-15 22:20:34 +11:00
|
|
|
// State: LS_JUMP_PREPARE (15)
|
|
|
|
// Collision: lara_as_compress()
|
2021-02-03 01:50:59 -03:00
|
|
|
void lara_col_compress(ITEM_INFO* item, COLL_INFO* coll)
|
2021-10-15 22:20:34 +11:00
|
|
|
{
|
|
|
|
item->fallspeed = 0;
|
|
|
|
item->gravityStatus = false;
|
|
|
|
coll->Setup.BadHeightDown = NO_BAD_POS;
|
|
|
|
coll->Setup.BadHeightUp = NO_HEIGHT;
|
|
|
|
coll->Setup.BadCeilingHeight = 0;
|
|
|
|
coll->Setup.ForwardAngle = Lara.moveAngle;
|
|
|
|
GetCollisionInfo(coll, item);
|
|
|
|
|
|
|
|
if (TestLaraFall(coll))
|
|
|
|
{
|
|
|
|
SetLaraFallState(item);
|
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2021-11-05 21:29:00 +11:00
|
|
|
if (TestLaraSlide(item, coll))
|
2021-10-15 22:20:34 +11:00
|
|
|
return;
|
|
|
|
|
|
|
|
// TODO: Better handling.
|
|
|
|
if (coll->Middle.Ceiling > -100)
|
|
|
|
{
|
|
|
|
item->animNumber = LA_STAND_SOLID;
|
|
|
|
item->frameNumber = g_Level.Anims[item->animNumber].frameBase;
|
|
|
|
item->goalAnimState = LS_STOP;
|
|
|
|
item->currentAnimState = LS_STOP;
|
|
|
|
|
|
|
|
item->speed = 0;
|
|
|
|
item->fallspeed = 0;
|
|
|
|
item->gravityStatus = false;
|
|
|
|
|
|
|
|
item->pos.xPos = coll->Setup.OldPosition.x;
|
|
|
|
item->pos.yPos = coll->Setup.OldPosition.y;
|
|
|
|
item->pos.zPos = coll->Setup.OldPosition.z;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (coll->Middle.Floor > -STEP_SIZE && coll->Middle.Floor < STEP_SIZE)
|
|
|
|
item->pos.yPos += coll->Middle.Floor;
|
|
|
|
}
|
|
|
|
|
|
|
|
// LEGACY
|
|
|
|
void old_lara_col_compress(ITEM_INFO* item, COLL_INFO* coll)
|
2020-08-14 17:54:25 -05:00
|
|
|
{
|
2020-09-26 05:06:08 +10:00
|
|
|
/*state 15*/
|
|
|
|
/*state code: lara_as_compress*/
|
2020-08-14 17:54:25 -05:00
|
|
|
item->fallspeed = 0;
|
|
|
|
item->gravityStatus = false;
|
|
|
|
|
2021-09-19 17:48:32 +03:00
|
|
|
coll->Setup.BadHeightDown = NO_BAD_POS;
|
|
|
|
coll->Setup.BadHeightUp = NO_HEIGHT;
|
2021-09-10 00:20:59 +03:00
|
|
|
coll->Setup.BadCeilingHeight = 0;
|
2020-09-26 03:28:30 +10:00
|
|
|
|
2021-09-10 00:20:59 +03:00
|
|
|
coll->Setup.ForwardAngle = Lara.moveAngle;
|
2021-09-19 06:42:24 +03:00
|
|
|
GetCollisionInfo(coll, item);
|
2020-08-14 17:54:25 -05:00
|
|
|
|
2020-09-26 05:06:08 +10:00
|
|
|
if (!LaraFallen(item, coll))
|
2020-09-26 03:28:30 +10:00
|
|
|
{
|
2021-09-10 00:18:47 +03:00
|
|
|
if (coll->Middle.Ceiling > -100)
|
2020-09-26 05:06:08 +10:00
|
|
|
{
|
|
|
|
item->animNumber = LA_STAND_SOLID;
|
|
|
|
item->frameNumber = g_Level.Anims[item->animNumber].frameBase;
|
|
|
|
item->goalAnimState = LS_STOP;
|
|
|
|
item->currentAnimState = LS_STOP;
|
2020-08-14 17:54:25 -05:00
|
|
|
|
2020-09-26 05:06:08 +10:00
|
|
|
item->speed = 0;
|
|
|
|
item->fallspeed = 0;
|
|
|
|
item->gravityStatus = false;
|
2020-09-26 03:28:30 +10: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;
|
2020-09-26 05:06:08 +10:00
|
|
|
}
|
2020-09-26 03:28:30 +10:00
|
|
|
|
2021-09-10 00:18:47 +03:00
|
|
|
if (coll->Middle.Floor > -256 && coll->Middle.Floor < 256)
|
|
|
|
item->pos.yPos += coll->Middle.Floor;
|
2020-08-14 17:54:25 -05:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-10-09 23:00:26 +11:00
|
|
|
// State: LS_WALK_BACK (16)
|
|
|
|
// Collision: lara_col_back()
|
2021-02-03 01:50:59 -03:00
|
|
|
void lara_as_back(ITEM_INFO* item, COLL_INFO* coll)
|
2021-10-09 23:00:26 +11:00
|
|
|
{
|
|
|
|
if (item->hitPoints <= 0)
|
|
|
|
{
|
2021-10-15 22:20:34 +11:00
|
|
|
item->goalAnimState = LS_STOP; // TODO dispatch
|
2021-10-09 23:00:26 +11:00
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2021-11-01 15:07:42 +11:00
|
|
|
if (Lara.isMoving)
|
|
|
|
return;
|
2021-10-09 23:00:26 +11:00
|
|
|
|
|
|
|
if (TrInput & IN_LEFT)
|
|
|
|
{
|
|
|
|
Lara.turnRate -= LARA_TURN_RATE;
|
|
|
|
if (Lara.turnRate < -LARA_SLOW_TURN)
|
|
|
|
Lara.turnRate = -LARA_SLOW_TURN;
|
|
|
|
|
2021-10-22 01:50:43 +11:00
|
|
|
DoLaraLean(item, coll, -LARA_LEAN_MAX / 3, 12);
|
|
|
|
|
2021-10-09 23:00:26 +11:00
|
|
|
}
|
|
|
|
else if (TrInput & IN_RIGHT)
|
|
|
|
{
|
|
|
|
Lara.turnRate += LARA_TURN_RATE;
|
|
|
|
if (Lara.turnRate > LARA_SLOW_TURN)
|
|
|
|
Lara.turnRate = LARA_SLOW_TURN;
|
|
|
|
|
2021-10-22 01:50:43 +11:00
|
|
|
DoLaraLean(item, coll, LARA_LEAN_MAX / 3, 12);
|
2021-10-09 23:00:26 +11:00
|
|
|
}
|
|
|
|
|
2021-10-14 01:17:21 +11:00
|
|
|
if (TrInput & IN_BACK &&
|
|
|
|
(TrInput & IN_WALK || Lara.waterStatus == LW_WADE))
|
2021-10-09 23:00:26 +11:00
|
|
|
{
|
2021-10-14 01:17:21 +11:00
|
|
|
item->goalAnimState = LS_WALK_BACK;
|
2021-10-09 23:00:26 +11:00
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
item->goalAnimState = LS_STOP;
|
|
|
|
}
|
|
|
|
|
|
|
|
// LEGACY
|
|
|
|
void old_lara_as_back(ITEM_INFO* item, COLL_INFO* coll)
|
2020-08-14 17:54:25 -05:00
|
|
|
{
|
2020-09-26 05:06:08 +10:00
|
|
|
/*state 16*/
|
|
|
|
/*collision: lara_col_back*/
|
2020-08-14 17:54:25 -05:00
|
|
|
if (item->hitPoints <= 0)
|
|
|
|
{
|
|
|
|
item->goalAnimState = LS_STOP;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2020-09-26 05:06:08 +10:00
|
|
|
if (!Lara.isMoving)
|
2020-08-14 17:54:25 -05:00
|
|
|
{
|
2020-09-26 05:06:08 +10:00
|
|
|
if ((TrInput & IN_BACK) && ((TrInput & IN_WALK) || Lara.waterStatus == LW_WADE))
|
|
|
|
item->goalAnimState = LS_WALK_BACK;
|
|
|
|
else
|
|
|
|
item->goalAnimState = LS_STOP;
|
2020-08-14 17:54:25 -05:00
|
|
|
|
2020-09-26 05:06:08 +10:00
|
|
|
if (TrInput & IN_LEFT)
|
2020-08-14 17:54:25 -05:00
|
|
|
{
|
2020-09-26 05:06:08 +10:00
|
|
|
Lara.turnRate -= LARA_TURN_RATE;
|
2021-10-02 15:44:34 +03:00
|
|
|
if (Lara.turnRate < -LARA_SLOW_TURN)
|
|
|
|
Lara.turnRate = -LARA_SLOW_TURN;
|
2020-08-14 17:54:25 -05:00
|
|
|
}
|
2020-09-26 05:06:08 +10:00
|
|
|
else if (TrInput & IN_RIGHT)
|
2020-08-14 17:54:25 -05:00
|
|
|
{
|
2020-09-26 05:06:08 +10:00
|
|
|
Lara.turnRate += LARA_TURN_RATE;
|
2021-10-02 15:44:34 +03:00
|
|
|
if (Lara.turnRate > LARA_SLOW_TURN)
|
|
|
|
Lara.turnRate = LARA_SLOW_TURN;
|
2020-08-14 17:54:25 -05:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-10-09 23:00:26 +11:00
|
|
|
// State: LS_WALK_BACK (16)
|
|
|
|
// Control: lara_as_back()
|
2021-02-03 01:50:59 -03:00
|
|
|
void lara_col_back(ITEM_INFO* item, COLL_INFO* coll)
|
2021-10-09 23:00:26 +11:00
|
|
|
{
|
|
|
|
Lara.moveAngle = item->pos.yRot + ANGLE(180);
|
|
|
|
item->gravityStatus = false;
|
|
|
|
item->fallspeed = 0;
|
|
|
|
coll->Setup.BadHeightDown = Lara.waterStatus == LW_WADE ? NO_BAD_POS : STEPUP_HEIGHT;
|
|
|
|
coll->Setup.BadHeightUp = -STEPUP_HEIGHT;
|
|
|
|
coll->Setup.BadCeilingHeight = 0;
|
|
|
|
coll->Setup.SlopesArePits = true;
|
|
|
|
coll->Setup.SlopesAreWalls = true;
|
|
|
|
coll->Setup.ForwardAngle = Lara.moveAngle;
|
|
|
|
GetCollisionInfo(coll, item);
|
|
|
|
|
|
|
|
if (TestLaraHitCeiling(coll))
|
|
|
|
{
|
|
|
|
SetLaraHitCeiling(item, coll);
|
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (LaraDeflectEdge(item, coll))
|
|
|
|
LaraCollideStop(item, coll);
|
|
|
|
|
|
|
|
if (TestLaraFall(coll))
|
|
|
|
{
|
|
|
|
SetLaraFallState(item);
|
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2021-11-05 21:29:00 +11:00
|
|
|
if (TestLaraSlide(item, coll))
|
2021-10-09 23:00:26 +11:00
|
|
|
return;
|
|
|
|
|
|
|
|
if (TestLaraStep(coll))
|
|
|
|
{
|
|
|
|
DoLaraStep(item, coll);
|
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
// LEGACY step
|
|
|
|
/*if (coll->Middle.Floor > STEP_SIZE / 2 && coll->Middle.Floor < STEPUP_HEIGHT)
|
|
|
|
{
|
|
|
|
item->goalAnimState = LS_STEP_BACK_DOWN;
|
|
|
|
GetChange(item, &g_Level.Anims[item->animNumber]);
|
|
|
|
}*/
|
|
|
|
|
|
|
|
// TODO
|
|
|
|
#if 0
|
|
|
|
if (!(g_Level.Rooms[item->roomNumber].flags & ENV_FLAG_SWAMP) || coll->Middle.Floor < 0)
|
|
|
|
item->pos.yPos += coll->Middle.Floor;
|
|
|
|
else if (g_Level.Rooms[item->roomNumber].flags & ENV_FLAG_SWAMP && coll->Middle.Floor)
|
|
|
|
item->pos.yPos += SWAMP_GRAVITY;
|
|
|
|
#else
|
|
|
|
if (coll->Middle.Floor != NO_HEIGHT)
|
|
|
|
item->pos.yPos += coll->Middle.Floor;
|
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
|
|
|
// LEGACY
|
|
|
|
void old_lara_col_back(ITEM_INFO* item, COLL_INFO* coll)
|
2020-08-14 17:54:25 -05:00
|
|
|
{
|
2020-09-26 05:06:08 +10:00
|
|
|
/*state 16*/
|
|
|
|
/*state code: lara_as_back*/
|
2020-08-14 17:54:25 -05:00
|
|
|
item->gravityStatus = false;
|
|
|
|
item->fallspeed = 0;
|
2020-12-19 23:34:52 -03:00
|
|
|
Lara.moveAngle = item->pos.yRot + ANGLE(180);
|
2020-08-14 17:54:25 -05:00
|
|
|
|
|
|
|
if (Lara.waterStatus == LW_WADE)
|
2021-09-19 17:48:32 +03:00
|
|
|
coll->Setup.BadHeightDown = NO_BAD_POS;
|
2020-08-14 17:54:25 -05:00
|
|
|
else
|
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.SlopesArePits = true;
|
|
|
|
coll->Setup.SlopesAreWalls = true;
|
|
|
|
coll->Setup.ForwardAngle = Lara.moveAngle;
|
2021-09-19 06:42:24 +03:00
|
|
|
GetCollisionInfo(coll, item);
|
2020-08-14 17:54:25 -05:00
|
|
|
|
|
|
|
if (LaraHitCeiling(item, coll))
|
|
|
|
return;
|
|
|
|
|
|
|
|
if (LaraDeflectEdge(item, coll))
|
|
|
|
LaraCollideStop(item, coll);
|
|
|
|
|
2020-09-26 05:06:08 +10:00
|
|
|
if (LaraFallen(item, coll))
|
2020-08-14 17:54:25 -05:00
|
|
|
return;
|
|
|
|
|
2021-09-10 00:18:47 +03:00
|
|
|
if (coll->Middle.Floor > STEP_SIZE / 2 && coll->Middle.Floor < STEPUP_HEIGHT)
|
2020-08-14 17:54:25 -05:00
|
|
|
{
|
2020-09-26 05:06:08 +10:00
|
|
|
item->goalAnimState = LS_STEP_BACK_DOWN;
|
|
|
|
GetChange(item, &g_Level.Anims[item->animNumber]);
|
2020-08-14 17:54:25 -05:00
|
|
|
}
|
|
|
|
|
2020-09-26 05:06:08 +10:00
|
|
|
if (TestLaraSlide(item, coll))
|
2020-08-14 17:54:25 -05:00
|
|
|
return;
|
|
|
|
|
|
|
|
#if 0
|
2021-09-10 00:18:47 +03:00
|
|
|
if (!(g_Level.Rooms[item->roomNumber].flags & ENV_FLAG_SWAMP) || coll->Middle.Floor < 0)
|
|
|
|
item->pos.yPos += coll->Middle.Floor;
|
|
|
|
else if (g_Level.Rooms[item->roomNumber].flags & ENV_FLAG_SWAMP && coll->Middle.Floor)
|
2020-08-14 17:54:25 -05:00
|
|
|
item->pos.yPos += SWAMP_GRAVITY;
|
|
|
|
#else
|
2021-09-10 00:18:47 +03:00
|
|
|
if (coll->Middle.Floor != NO_HEIGHT)
|
|
|
|
item->pos.yPos += coll->Middle.Floor;
|
2020-08-14 17:54:25 -05:00
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
2021-10-08 20:08:55 +11:00
|
|
|
// State: LS_TURN_RIGHT_FAST (20)
|
|
|
|
// Collision: lara_col_turn_right_fast()
|
|
|
|
void lara_as_turn_right_fast(ITEM_INFO* item, COLL_INFO* coll)
|
2021-10-08 15:47:54 +11:00
|
|
|
{
|
|
|
|
if (item->hitPoints <= 0)
|
|
|
|
{
|
|
|
|
item->goalAnimState = LS_DEATH;
|
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2021-10-13 19:50:46 +11:00
|
|
|
// TODO: Wade handling. @Sezz 2021.10.13
|
2021-10-08 15:47:54 +11:00
|
|
|
|
2021-10-17 20:07:30 +11:00
|
|
|
if (TrInput & IN_JUMP &&
|
|
|
|
coll->Middle.Ceiling < -LARA_HEADROOM * 0.7f)
|
2021-10-08 15:47:54 +11:00
|
|
|
{
|
|
|
|
item->goalAnimState = LS_JUMP_PREPARE;
|
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (TrInput & IN_ROLL &&
|
|
|
|
Lara.waterStatus != LW_WADE)
|
|
|
|
{
|
|
|
|
item->goalAnimState = LS_ROLL_FORWARD;
|
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2021-10-16 21:52:45 +11:00
|
|
|
if ((TrInput & IN_DUCK/* || TestLaraKeepDucked(coll)*/) &&
|
2021-10-08 15:47:54 +11:00
|
|
|
(Lara.gunStatus == LG_NO_ARMS || !IsStandingWeapon(Lara.gunType)) &&
|
|
|
|
Lara.waterStatus != LW_WADE)
|
|
|
|
{
|
|
|
|
item->goalAnimState = LS_CROUCH_IDLE;
|
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2021-10-28 23:22:28 +11:00
|
|
|
if (TrInput & IN_FORWARD)
|
2021-10-08 15:47:54 +11:00
|
|
|
{
|
2021-10-28 23:22:28 +11:00
|
|
|
if (Lara.waterStatus == LW_WADE) // Should not be possible, but here for security.
|
|
|
|
{
|
|
|
|
if (TestLaraRunForward(item, coll))
|
|
|
|
{
|
|
|
|
item->goalAnimState = LS_WADE_FORWARD;
|
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
2021-10-08 15:47:54 +11:00
|
|
|
else if (TrInput & IN_WALK)
|
2021-10-28 23:22:28 +11:00
|
|
|
{
|
|
|
|
if (TestLaraWalkForward(item, coll))
|
|
|
|
{
|
|
|
|
item->goalAnimState = LS_WALK_FORWARD;
|
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else if (TrInput & IN_SPRINT &&
|
|
|
|
TestLaraRunForward(item, coll))
|
|
|
|
{
|
2021-10-13 19:50:46 +11:00
|
|
|
item->goalAnimState = LS_SPRINT;
|
2021-10-28 23:22:28 +11:00
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
else if (TestLaraRunForward(item, coll)) [[likely]]
|
|
|
|
{
|
2021-10-08 15:47:54 +11:00
|
|
|
item->goalAnimState = LS_RUN_FORWARD;
|
|
|
|
|
2021-10-28 23:22:28 +11:00
|
|
|
return;
|
|
|
|
}
|
2021-10-08 15:47:54 +11:00
|
|
|
}
|
2021-10-22 00:07:24 +11:00
|
|
|
else if (TrInput & IN_BACK)
|
2021-10-08 15:47:54 +11:00
|
|
|
{
|
2021-10-24 20:43:02 +11:00
|
|
|
if (TrInput & IN_WALK &&
|
|
|
|
TestLaraWalkBack(item, coll))
|
|
|
|
{
|
2021-10-08 15:47:54 +11:00
|
|
|
item->goalAnimState = LS_WALK_BACK;
|
2021-10-24 20:43:02 +11:00
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
else if (!(TrInput & IN_WALK) &&
|
|
|
|
TestLaraHopBack(item, coll)) [[likely]]
|
|
|
|
{
|
2021-10-08 15:47:54 +11:00
|
|
|
item->goalAnimState = LS_HOP_BACK;
|
|
|
|
|
2021-10-24 20:43:02 +11:00
|
|
|
return;
|
|
|
|
}
|
2021-10-08 15:47:54 +11:00
|
|
|
}
|
|
|
|
|
|
|
|
if (TrInput & IN_LSTEP &&
|
2021-10-19 21:28:36 +11:00
|
|
|
TestLaraStepLeft(item, coll))
|
2021-10-08 15:47:54 +11:00
|
|
|
{
|
|
|
|
item->goalAnimState = LS_STEP_LEFT;
|
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
2021-10-24 20:43:02 +11:00
|
|
|
else if (TrInput & IN_RSTEP &&
|
2021-10-19 21:28:36 +11:00
|
|
|
TestLaraStepRight(item, coll))
|
2021-10-08 15:47:54 +11:00
|
|
|
{
|
|
|
|
item->goalAnimState = LS_STEP_RIGHT;
|
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
// TODO: Hold WALK to slow down again.
|
|
|
|
if (TrInput & IN_RIGHT)
|
|
|
|
{
|
|
|
|
Lara.turnRate += LARA_TURN_RATE;
|
2021-10-24 20:43:02 +11:00
|
|
|
if (Lara.turnRate < LARA_MED_TURN)
|
|
|
|
Lara.turnRate = LARA_MED_TURN;
|
|
|
|
else if (Lara.turnRate > LARA_FAST_TURN)
|
|
|
|
Lara.turnRate = LARA_FAST_TURN;
|
2021-10-08 15:47:54 +11:00
|
|
|
|
2021-10-08 20:08:55 +11:00
|
|
|
item->goalAnimState = LS_TURN_RIGHT_FAST;
|
2021-10-08 15:47:54 +11:00
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
item->goalAnimState = LS_STOP;
|
|
|
|
}
|
|
|
|
|
2021-10-08 20:08:55 +11:00
|
|
|
// State: LS_TURN_RIGHT_FAST (20)
|
|
|
|
// Control: lara_as_turn_right_fast()
|
|
|
|
void lara_col_turn_right_fast(ITEM_INFO* item, COLL_INFO* coll)
|
|
|
|
{
|
|
|
|
lara_col_stop(item, coll);
|
|
|
|
}
|
|
|
|
|
|
|
|
// LEGACY
|
|
|
|
void lara_as_fastturn(ITEM_INFO* item, COLL_INFO* coll)
|
2020-08-14 17:54:25 -05:00
|
|
|
{
|
2020-09-26 05:06:08 +10:00
|
|
|
/*state 20*/
|
|
|
|
/*collision: lara_col_fastturn*/
|
2020-08-14 17:54:25 -05:00
|
|
|
if (item->hitPoints <= 0)
|
|
|
|
{
|
|
|
|
item->goalAnimState = LS_STOP;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2020-09-26 05:06:08 +10:00
|
|
|
if (Lara.turnRate < 0)
|
2020-08-14 17:54:25 -05:00
|
|
|
{
|
2020-09-26 05:06:08 +10:00
|
|
|
Lara.turnRate = -LARA_FAST_TURN;
|
2020-08-14 17:54:25 -05:00
|
|
|
|
2020-09-26 05:06:08 +10:00
|
|
|
if (!(TrInput & IN_LEFT))
|
|
|
|
item->goalAnimState = LS_STOP;
|
|
|
|
}
|
|
|
|
else
|
2020-09-26 03:28:30 +10:00
|
|
|
{
|
2020-09-26 05:06:08 +10:00
|
|
|
Lara.turnRate = LARA_FAST_TURN;
|
|
|
|
|
|
|
|
if (!(TrInput & IN_RIGHT))
|
|
|
|
item->goalAnimState = LS_STOP;
|
2020-08-14 17:54:25 -05:00
|
|
|
}
|
2020-09-26 05:06:08 +10:00
|
|
|
}
|
2020-09-26 03:28:30 +10:00
|
|
|
|
2021-10-08 20:08:55 +11:00
|
|
|
// LEGACY
|
2021-02-03 01:50:59 -03:00
|
|
|
void lara_col_fastturn(ITEM_INFO* item, COLL_INFO* coll)
|
2020-08-14 17:54:25 -05:00
|
|
|
{
|
2020-09-26 05:06:08 +10:00
|
|
|
/*state 20*/
|
|
|
|
/*state code: lara_as_fastturn*/
|
|
|
|
lara_col_stop(item, coll);
|
2020-09-26 03:28:30 +10:00
|
|
|
}
|
|
|
|
|
2021-10-08 20:08:55 +11:00
|
|
|
// State: LS_TURN_LEFT_FAST (152)
|
|
|
|
// Collision: lara_col_turn_left_fast()
|
|
|
|
void lara_as_turn_left_fast(ITEM_INFO* item, COLL_INFO* coll)
|
|
|
|
{
|
|
|
|
if (item->hitPoints <= 0)
|
|
|
|
{
|
|
|
|
item->goalAnimState = LS_DEATH;
|
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2021-10-17 20:07:30 +11:00
|
|
|
if (TrInput & IN_JUMP &&
|
|
|
|
coll->Middle.Ceiling < -LARA_HEADROOM * 0.7f)
|
2021-10-08 20:08:55 +11:00
|
|
|
{
|
|
|
|
item->goalAnimState = LS_JUMP_PREPARE;
|
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (TrInput & IN_ROLL &&
|
|
|
|
Lara.waterStatus != LW_WADE)
|
|
|
|
{
|
|
|
|
item->goalAnimState = LS_ROLL_FORWARD;
|
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2021-10-16 21:52:45 +11:00
|
|
|
if ((TrInput & IN_DUCK/* || TestLaraKeepDucked(coll)*/) &&
|
2021-10-08 20:08:55 +11:00
|
|
|
(Lara.gunStatus == LG_NO_ARMS || !IsStandingWeapon(Lara.gunType)) &&
|
|
|
|
Lara.waterStatus != LW_WADE)
|
|
|
|
{
|
|
|
|
item->goalAnimState = LS_CROUCH_IDLE;
|
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2021-10-28 23:22:28 +11:00
|
|
|
if (TrInput & IN_FORWARD)
|
2021-10-08 20:08:55 +11:00
|
|
|
{
|
2021-10-28 23:22:28 +11:00
|
|
|
if (Lara.waterStatus == LW_WADE) // Should not be possible, but here for security.
|
|
|
|
{
|
|
|
|
if (TestLaraRunForward(item, coll))
|
|
|
|
{
|
|
|
|
item->goalAnimState = LS_WADE_FORWARD;
|
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
2021-10-08 20:08:55 +11:00
|
|
|
else if (TrInput & IN_WALK)
|
2021-10-28 23:22:28 +11:00
|
|
|
{
|
|
|
|
if (TestLaraWalkForward(item, coll))
|
|
|
|
{
|
|
|
|
item->goalAnimState = LS_WALK_FORWARD;
|
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else if (TrInput & IN_SPRINT &&
|
|
|
|
TestLaraRunForward(item, coll))
|
|
|
|
{
|
2021-10-13 19:50:46 +11:00
|
|
|
item->goalAnimState = LS_SPRINT;
|
2021-10-28 23:22:28 +11:00
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
else if (TestLaraRunForward(item, coll)) [[likely]]
|
|
|
|
{
|
2021-10-08 20:08:55 +11:00
|
|
|
item->goalAnimState = LS_RUN_FORWARD;
|
|
|
|
|
2021-10-28 23:22:28 +11:00
|
|
|
return;
|
|
|
|
}
|
2021-10-08 20:08:55 +11:00
|
|
|
}
|
2021-10-22 00:07:24 +11:00
|
|
|
else if (TrInput & IN_BACK)
|
2021-10-08 20:08:55 +11:00
|
|
|
{
|
|
|
|
if (Lara.waterStatus == LW_WADE)
|
2021-10-24 20:43:02 +11:00
|
|
|
{
|
|
|
|
item->goalAnimState = LS_WADE_FORWARD;
|
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
else if (TrInput & IN_WALK &&
|
|
|
|
TestLaraWalkBack(item, coll))
|
|
|
|
{
|
2021-10-08 20:08:55 +11:00
|
|
|
item->goalAnimState = LS_WALK_BACK;
|
2021-10-24 20:43:02 +11:00
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
else if (!(TrInput & IN_WALK) &&
|
|
|
|
TestLaraHopBack(item, coll)) [[likely]]
|
|
|
|
{
|
2021-10-08 20:08:55 +11:00
|
|
|
item->goalAnimState = LS_HOP_BACK;
|
|
|
|
|
2021-10-24 20:43:02 +11:00
|
|
|
return;
|
|
|
|
}
|
2021-10-08 20:08:55 +11:00
|
|
|
}
|
|
|
|
|
|
|
|
if (TrInput & IN_LSTEP &&
|
2021-10-19 21:28:36 +11:00
|
|
|
TestLaraStepLeft(item, coll))
|
2021-10-08 20:08:55 +11:00
|
|
|
{
|
|
|
|
item->goalAnimState = LS_STEP_LEFT;
|
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
2021-10-24 20:43:02 +11:00
|
|
|
// TODO: Lara steps left. Why?? @Sezz 2021.10.08
|
2021-10-08 20:08:55 +11:00
|
|
|
else if (TrInput & IN_RSTEP &&
|
2021-10-19 21:28:36 +11:00
|
|
|
TestLaraStepRight(item, coll))
|
2021-10-08 20:08:55 +11:00
|
|
|
{
|
|
|
|
item->goalAnimState = LS_STEP_RIGHT;
|
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (TrInput & IN_LEFT)
|
|
|
|
{
|
|
|
|
Lara.turnRate -= LARA_TURN_RATE;
|
2021-10-24 20:43:02 +11:00
|
|
|
if (Lara.turnRate < -LARA_FAST_TURN)
|
|
|
|
Lara.turnRate = -LARA_FAST_TURN;
|
|
|
|
else if (Lara.turnRate > -LARA_MED_TURN)
|
|
|
|
Lara.turnRate = -LARA_MED_TURN;
|
2021-10-08 20:08:55 +11:00
|
|
|
|
|
|
|
item->goalAnimState = LS_TURN_LEFT_FAST;
|
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
item->goalAnimState = LS_STOP;
|
|
|
|
}
|
|
|
|
|
|
|
|
// State: LS_TURN_LEFT_FAST (152)
|
|
|
|
// Control: lara_as_turn_left_fast()
|
|
|
|
void lara_col_turn_left_fast(ITEM_INFO* item, COLL_INFO* coll)
|
|
|
|
{
|
|
|
|
lara_col_stop(item, coll);
|
|
|
|
}
|
|
|
|
|
2021-10-14 17:19:38 +11:00
|
|
|
// State: LS_SIDESTEP_RIGHT (21)
|
|
|
|
// Collision: lara_col_stepright()
|
2021-02-03 01:50:59 -03:00
|
|
|
void lara_as_stepright(ITEM_INFO* item, COLL_INFO* coll)
|
2021-10-14 17:19:38 +11:00
|
|
|
{
|
|
|
|
Lara.look = false;
|
|
|
|
|
|
|
|
if (item->hitPoints <= 0)
|
|
|
|
{
|
|
|
|
item->goalAnimState = LS_STOP;
|
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2021-11-01 15:07:42 +11:00
|
|
|
if (Lara.isMoving)
|
|
|
|
return;
|
2021-10-14 17:19:38 +11:00
|
|
|
|
|
|
|
if (TrInput & IN_LEFT)
|
|
|
|
{
|
|
|
|
Lara.turnRate -= LARA_TURN_RATE;
|
|
|
|
if (Lara.turnRate < -LARA_SLOW_TURN)
|
|
|
|
Lara.turnRate = -LARA_SLOW_TURN;
|
|
|
|
}
|
|
|
|
else if (TrInput & IN_RIGHT)
|
|
|
|
{
|
|
|
|
Lara.turnRate += LARA_TURN_RATE;
|
|
|
|
if (Lara.turnRate > LARA_SLOW_TURN)
|
|
|
|
Lara.turnRate = LARA_SLOW_TURN;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (TrInput & IN_RSTEP)
|
|
|
|
{
|
|
|
|
item->goalAnimState = LS_STEP_RIGHT;
|
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
item->goalAnimState = LS_STOP;
|
|
|
|
}
|
|
|
|
|
|
|
|
// LEGACY
|
|
|
|
void old_lara_as_stepright(ITEM_INFO* item, COLL_INFO* coll)
|
2020-09-26 03:28:30 +10:00
|
|
|
{
|
2020-09-26 05:06:08 +10:00
|
|
|
/*state 21*/
|
|
|
|
/*collision: lara_col_stepright*/
|
2020-09-26 03:28:30 +10:00
|
|
|
Lara.look = false;
|
|
|
|
|
|
|
|
if (item->hitPoints <= 0)
|
|
|
|
{
|
|
|
|
item->goalAnimState = LS_STOP;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2020-09-26 05:06:08 +10:00
|
|
|
if (!Lara.isMoving)
|
2020-09-26 03:28:30 +10:00
|
|
|
{
|
2020-09-26 05:06:08 +10:00
|
|
|
if (!(TrInput & IN_RSTEP))
|
|
|
|
{
|
|
|
|
item->goalAnimState = LS_STOP;
|
|
|
|
}
|
2020-09-26 03:28:30 +10:00
|
|
|
|
2020-09-26 05:06:08 +10:00
|
|
|
if (TrInput & IN_LEFT)
|
2020-08-14 17:54:25 -05:00
|
|
|
{
|
2020-09-26 05:06:08 +10:00
|
|
|
Lara.turnRate -= LARA_TURN_RATE;
|
2021-10-02 15:44:34 +03:00
|
|
|
if (Lara.turnRate < -LARA_SLOW_TURN)
|
|
|
|
Lara.turnRate = -LARA_SLOW_TURN;
|
2020-08-14 17:54:25 -05:00
|
|
|
}
|
2020-09-26 05:06:08 +10:00
|
|
|
else if (TrInput & IN_RIGHT)
|
2020-08-14 17:54:25 -05:00
|
|
|
{
|
2020-09-26 05:06:08 +10:00
|
|
|
Lara.turnRate += LARA_TURN_RATE;
|
2021-10-02 15:44:34 +03:00
|
|
|
if (Lara.turnRate > LARA_SLOW_TURN)
|
|
|
|
Lara.turnRate = LARA_SLOW_TURN;
|
2020-08-14 17:54:25 -05:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-10-10 14:03:38 +11:00
|
|
|
// State: LS_STEP_RIGHT (21)
|
|
|
|
// Control: lara_as_stepright()
|
2021-02-03 01:50:59 -03:00
|
|
|
void lara_col_stepright(ITEM_INFO* item, COLL_INFO* coll)
|
2021-10-10 14:03:38 +11:00
|
|
|
{
|
|
|
|
Lara.moveAngle = item->pos.yRot + ANGLE(90);
|
|
|
|
coll->Setup.BadHeightDown = (Lara.waterStatus == LW_WADE) ? NO_BAD_POS : STEP_SIZE / 2;
|
|
|
|
coll->Setup.BadHeightUp = -STEP_SIZE / 2;
|
|
|
|
coll->Setup.BadCeilingHeight = 0;
|
|
|
|
item->gravityStatus = false;
|
|
|
|
item->fallspeed = 0;
|
|
|
|
coll->Setup.SlopesArePits = true;
|
|
|
|
coll->Setup.SlopesAreWalls = true;
|
|
|
|
coll->Setup.ForwardAngle = Lara.moveAngle;
|
|
|
|
GetCollisionInfo(coll, item);
|
|
|
|
|
|
|
|
if (TestLaraHitCeiling(coll))
|
|
|
|
{
|
|
|
|
SetLaraHitCeiling(item, coll);
|
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (LaraDeflectEdge(item, coll))
|
|
|
|
LaraCollideStop(item, coll);
|
|
|
|
|
|
|
|
if (TestLaraFall(coll))
|
|
|
|
{
|
|
|
|
SetLaraFallState(item);
|
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2021-11-05 21:29:00 +11:00
|
|
|
if (TestLaraSlide(item, coll))
|
2021-10-10 14:03:38 +11:00
|
|
|
return;
|
|
|
|
|
|
|
|
if (TestLaraStep(coll))
|
|
|
|
{
|
|
|
|
DoLaraStep(item, coll);
|
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
// LEGACY step
|
|
|
|
/*if (coll->Middle.Floor != NO_HEIGHT)
|
|
|
|
item->pos.yPos += coll->Middle.Floor;*/
|
|
|
|
}
|
|
|
|
|
|
|
|
// LEGACY
|
|
|
|
void old_lara_col_stepright(ITEM_INFO* item, COLL_INFO* coll)
|
2020-08-14 17:54:25 -05:00
|
|
|
{
|
2020-09-26 05:06:08 +10:00
|
|
|
/*state 21*/
|
|
|
|
/*state code: lara_as_stepright*/
|
|
|
|
if (item->currentAnimState == LS_STEP_RIGHT)
|
2020-12-19 23:34:52 -03:00
|
|
|
Lara.moveAngle = item->pos.yRot + ANGLE(90);
|
2020-09-26 05:06:08 +10:00
|
|
|
else
|
2020-12-19 23:34:52 -03:00
|
|
|
Lara.moveAngle = item->pos.yRot - ANGLE(90);
|
2020-08-14 17:54:25 -05:00
|
|
|
|
|
|
|
item->gravityStatus = false;
|
|
|
|
item->fallspeed = 0;
|
|
|
|
|
|
|
|
if (Lara.waterStatus == LW_WADE)
|
2021-09-19 17:48:32 +03:00
|
|
|
coll->Setup.BadHeightDown = NO_BAD_POS;
|
2020-08-14 17:54:25 -05:00
|
|
|
else
|
2021-09-19 17:48:32 +03:00
|
|
|
coll->Setup.BadHeightDown = 128;
|
2020-08-14 17:54:25 -05:00
|
|
|
|
2021-09-10 00:20:59 +03:00
|
|
|
coll->Setup.SlopesAreWalls = true;
|
|
|
|
coll->Setup.SlopesArePits = true;
|
2020-09-26 05:06:08 +10:00
|
|
|
|
2021-09-19 17:48:32 +03:00
|
|
|
coll->Setup.BadHeightUp = -128;
|
2021-09-10 00:20:59 +03:00
|
|
|
coll->Setup.BadCeilingHeight = 0;
|
2020-09-26 03:28:30 +10:00
|
|
|
|
2021-09-10 00:20:59 +03:00
|
|
|
coll->Setup.ForwardAngle = Lara.moveAngle;
|
2021-09-19 06:42:24 +03:00
|
|
|
GetCollisionInfo(coll, item);
|
2020-08-14 17:54:25 -05:00
|
|
|
|
2020-09-26 05:06:08 +10:00
|
|
|
if (!LaraHitCeiling(item, coll))
|
2020-09-26 03:28:30 +10:00
|
|
|
{
|
2020-09-26 05:06:08 +10:00
|
|
|
if (LaraDeflectEdge(item, coll))
|
|
|
|
LaraCollideStop(item, coll);
|
2020-09-26 03:28:30 +10:00
|
|
|
|
2021-09-10 00:18:47 +03:00
|
|
|
if (!LaraFallen(item, coll) && !TestLaraSlide(item, coll) && coll->Middle.Floor != NO_HEIGHT)
|
|
|
|
item->pos.yPos += coll->Middle.Floor;
|
2020-08-14 17:54:25 -05:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-10-14 17:19:38 +11:00
|
|
|
// State: LS_SIDESTEP_LEFT (22)
|
|
|
|
// Collision: lara_col_stepleft()
|
2021-02-03 01:50:59 -03:00
|
|
|
void lara_as_stepleft(ITEM_INFO* item, COLL_INFO* coll)
|
2021-10-14 17:19:38 +11:00
|
|
|
{
|
|
|
|
Lara.look = false;
|
|
|
|
|
|
|
|
if (item->hitPoints <= 0)
|
|
|
|
{
|
|
|
|
item->goalAnimState = LS_STOP;
|
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2021-11-01 15:07:42 +11:00
|
|
|
if (Lara.isMoving)
|
|
|
|
return;
|
2021-10-14 17:19:38 +11:00
|
|
|
|
|
|
|
if (TrInput & IN_LEFT)
|
|
|
|
{
|
|
|
|
Lara.turnRate -= LARA_TURN_RATE;
|
|
|
|
if (Lara.turnRate < -LARA_SLOW_TURN)
|
|
|
|
Lara.turnRate = -LARA_SLOW_TURN;
|
|
|
|
}
|
|
|
|
else if (TrInput & IN_RIGHT)
|
|
|
|
{
|
|
|
|
Lara.turnRate += LARA_TURN_RATE;
|
|
|
|
if (Lara.turnRate > LARA_SLOW_TURN)
|
|
|
|
Lara.turnRate = LARA_SLOW_TURN;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (TrInput & IN_LSTEP)
|
|
|
|
{
|
|
|
|
item->goalAnimState = LS_STEP_LEFT;
|
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
item->goalAnimState = LS_STOP;
|
|
|
|
}
|
|
|
|
|
|
|
|
// LEGACY
|
|
|
|
void old_lara_as_stepleft(ITEM_INFO* item, COLL_INFO* coll)
|
2020-08-14 17:54:25 -05:00
|
|
|
{
|
2020-09-26 05:06:08 +10:00
|
|
|
/*state 22*/
|
|
|
|
/*collision: lara_col_stepleft*/
|
2020-08-14 17:54:25 -05:00
|
|
|
Lara.look = false;
|
|
|
|
|
|
|
|
if (item->hitPoints <= 0)
|
|
|
|
{
|
|
|
|
item->goalAnimState = LS_STOP;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2020-09-26 05:06:08 +10:00
|
|
|
if (!Lara.isMoving)
|
2020-09-26 03:28:30 +10:00
|
|
|
{
|
2020-09-26 05:06:08 +10:00
|
|
|
if (!(TrInput & IN_LSTEP))
|
2020-08-14 17:54:25 -05:00
|
|
|
{
|
2020-09-26 05:06:08 +10:00
|
|
|
item->goalAnimState = LS_STOP;
|
2020-08-14 17:54:25 -05:00
|
|
|
}
|
2020-09-26 03:28:30 +10:00
|
|
|
|
2020-09-26 05:06:08 +10:00
|
|
|
if (TrInput & IN_LEFT)
|
2020-09-26 03:28:30 +10:00
|
|
|
{
|
2020-09-26 05:06:08 +10:00
|
|
|
Lara.turnRate -= LARA_TURN_RATE;
|
|
|
|
if (Lara.turnRate < -LARA_SLOW_TURN)
|
|
|
|
Lara.turnRate = -LARA_SLOW_TURN;
|
2020-09-26 03:28:30 +10:00
|
|
|
}
|
2020-09-26 05:06:08 +10:00
|
|
|
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 > LARA_SLOW_TURN)
|
|
|
|
Lara.turnRate = LARA_SLOW_TURN;
|
2020-09-26 03:28:30 +10:00
|
|
|
}
|
|
|
|
}
|
2020-09-26 05:06:08 +10:00
|
|
|
}
|
2020-09-26 03:28:30 +10:00
|
|
|
|
2021-10-10 14:03:38 +11:00
|
|
|
// State: LS_STEP_LEFT (22)
|
|
|
|
// Control: lara_as_stepleft()
|
2021-02-03 01:50:59 -03:00
|
|
|
void lara_col_stepleft(ITEM_INFO* item, COLL_INFO* coll)
|
2021-10-10 14:03:38 +11:00
|
|
|
{
|
|
|
|
Lara.moveAngle = item->pos.yRot - ANGLE(90);
|
|
|
|
coll->Setup.BadHeightDown = (Lara.waterStatus == LW_WADE) ? NO_BAD_POS : STEP_SIZE / 2;
|
|
|
|
coll->Setup.BadHeightUp = -STEP_SIZE / 2;
|
|
|
|
coll->Setup.BadCeilingHeight = 0;
|
|
|
|
item->gravityStatus = false;
|
|
|
|
item->fallspeed = 0;
|
|
|
|
coll->Setup.SlopesArePits = true;
|
|
|
|
coll->Setup.SlopesAreWalls = true;
|
|
|
|
coll->Setup.ForwardAngle = Lara.moveAngle;
|
|
|
|
GetCollisionInfo(coll, item);
|
|
|
|
|
|
|
|
if (TestLaraHitCeiling(coll))
|
|
|
|
{
|
|
|
|
SetLaraHitCeiling(item, coll);
|
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (LaraDeflectEdge(item, coll))
|
|
|
|
LaraCollideStop(item, coll);
|
|
|
|
|
|
|
|
if (TestLaraFall(coll))
|
|
|
|
{
|
|
|
|
SetLaraFallState(item);
|
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2021-11-05 21:29:00 +11:00
|
|
|
if (TestLaraSlide(item, coll))
|
2021-10-10 14:03:38 +11:00
|
|
|
return;
|
|
|
|
|
|
|
|
if (TestLaraStep(coll))
|
|
|
|
{
|
|
|
|
DoLaraStep(item, coll);
|
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
// LEGACY step
|
|
|
|
/*if (coll->Middle.Floor != NO_HEIGHT)
|
|
|
|
item->pos.yPos += coll->Middle.Floor;*/
|
|
|
|
}
|
|
|
|
|
|
|
|
// LEGACY
|
|
|
|
void old_lara_col_stepleft(ITEM_INFO* item, COLL_INFO* coll)
|
2020-09-26 05:06:08 +10:00
|
|
|
{
|
|
|
|
/*state 22*/
|
|
|
|
/*state code: lara_as_stepleft*/
|
|
|
|
lara_col_stepright(item, coll);
|
2020-08-14 17:54:25 -05:00
|
|
|
}
|
|
|
|
|
2021-10-14 19:58:29 +11:00
|
|
|
// State: LS_ROLL_FORWARD (23)
|
2021-11-07 12:57:34 +11:00
|
|
|
// Collision: lara_col_roll2()
|
|
|
|
void lara_as_roll2(ITEM_INFO* item, COLL_INFO* coll)
|
|
|
|
{
|
|
|
|
if (TrInput & IN_LEFT &&
|
|
|
|
!(TrInput & IN_JUMP)) // JUMP locks y rotation.
|
|
|
|
{
|
|
|
|
Lara.turnRate -= LARA_TURN_RATE;
|
|
|
|
if (Lara.turnRate < -LARA_MED_TURN)
|
|
|
|
Lara.turnRate = -LARA_MED_TURN;
|
|
|
|
}
|
|
|
|
else if (TrInput & IN_RIGHT &&
|
|
|
|
!(TrInput & IN_JUMP))
|
|
|
|
{
|
|
|
|
Lara.turnRate += LARA_TURN_RATE;
|
|
|
|
if (Lara.turnRate > LARA_MED_TURN)
|
|
|
|
Lara.turnRate = LARA_MED_TURN;
|
|
|
|
}
|
|
|
|
|
|
|
|
item->goalAnimState = LS_ROLL_BACK;
|
|
|
|
}
|
|
|
|
|
|
|
|
// State: LS_ROLL_FORWARD (23)
|
|
|
|
// Control: lara_as_roll2()
|
2021-02-03 01:50:59 -03:00
|
|
|
void lara_col_roll2(ITEM_INFO* item, COLL_INFO* coll)
|
2021-10-14 19:58:29 +11:00
|
|
|
{
|
|
|
|
Camera.laraNode = 0;
|
|
|
|
Lara.moveAngle = item->pos.yRot + ANGLE(180);
|
|
|
|
item->gravityStatus = false;
|
|
|
|
item->fallspeed = 0;
|
|
|
|
coll->Setup.BadHeightDown = NO_BAD_POS;
|
|
|
|
coll->Setup.BadHeightUp = -STEPUP_HEIGHT;
|
|
|
|
coll->Setup.BadCeilingHeight = 0;
|
|
|
|
coll->Setup.SlopesAreWalls = true;
|
|
|
|
coll->Setup.ForwardAngle = Lara.moveAngle;
|
|
|
|
GetCollisionInfo(coll, item);
|
|
|
|
|
|
|
|
if (TestLaraHitCeiling(coll))
|
|
|
|
{
|
|
|
|
SetLaraHitCeiling(item, coll);
|
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2021-11-05 21:29:00 +11:00
|
|
|
if (TestLaraSlide(item, coll))
|
2021-10-14 19:58:29 +11:00
|
|
|
return;
|
|
|
|
|
|
|
|
if (coll->Middle.Floor > STEPUP_HEIGHT / 2) // Was 200.
|
|
|
|
{
|
|
|
|
SetLaraFallBackState(item);
|
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
ShiftItem(item, coll);
|
|
|
|
|
|
|
|
if (TestLaraStep(coll))
|
|
|
|
{
|
|
|
|
DoLaraStep(item, coll);
|
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
// LEGACY step
|
|
|
|
/*if (coll->Middle.Floor != NO_HEIGHT)
|
|
|
|
item->pos.yPos += coll->Middle.Floor;*/
|
|
|
|
}
|
|
|
|
|
|
|
|
// LEGACY
|
|
|
|
void old_lara_col_roll2(ITEM_INFO* item, COLL_INFO* coll)
|
2020-08-14 17:54:25 -05:00
|
|
|
{
|
2020-09-26 05:06:08 +10:00
|
|
|
/*state 23*/
|
|
|
|
/*state code: lara_void_func*/
|
2020-08-14 17:54:25 -05:00
|
|
|
Camera.laraNode = 0;
|
2020-12-19 23:34:52 -03:00
|
|
|
Lara.moveAngle = item->pos.yRot + ANGLE(180);
|
2020-08-14 17:54:25 -05:00
|
|
|
|
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 = 0;
|
|
|
|
coll->Setup.SlopesAreWalls = true;
|
2020-09-26 03:28:30 +10:00
|
|
|
|
2020-09-26 05:06:08 +10:00
|
|
|
item->gravityStatus = false;
|
|
|
|
item->fallspeed = 0;
|
|
|
|
|
2021-09-10 00:20:59 +03:00
|
|
|
coll->Setup.ForwardAngle = Lara.moveAngle;
|
2021-09-19 06:42:24 +03:00
|
|
|
GetCollisionInfo(coll, item);
|
2020-08-14 17:54:25 -05:00
|
|
|
|
|
|
|
if (LaraHitCeiling(item, coll))
|
|
|
|
return;
|
2020-09-26 05:06:08 +10:00
|
|
|
if (TestLaraSlide(item, coll))
|
2020-08-14 17:54:25 -05:00
|
|
|
return;
|
|
|
|
|
2021-09-10 00:18:47 +03:00
|
|
|
if (coll->Middle.Floor > 200)
|
2020-08-14 17:54:25 -05:00
|
|
|
{
|
2020-09-26 05:06:08 +10:00
|
|
|
item->animNumber = LA_FALL_BACK;
|
|
|
|
item->frameNumber = g_Level.Anims[item->animNumber].frameBase;
|
|
|
|
item->currentAnimState = LS_FALL_BACK;
|
2020-08-14 17:54:25 -05:00
|
|
|
item->goalAnimState = LS_FALL_BACK;
|
|
|
|
item->fallspeed = 0;
|
|
|
|
item->gravityStatus = true;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
ShiftItem(item, coll);
|
|
|
|
|
2021-09-10 00:18:47 +03:00
|
|
|
if (coll->Middle.Floor != NO_HEIGHT)
|
|
|
|
item->pos.yPos += coll->Middle.Floor;
|
2020-08-14 17:54:25 -05:00
|
|
|
}
|
|
|
|
|
2021-02-03 01:50:59 -03:00
|
|
|
void lara_as_backjump(ITEM_INFO* item, COLL_INFO* coll)
|
2020-08-14 17:54:25 -05:00
|
|
|
{
|
2020-09-26 05:06:08 +10:00
|
|
|
/*state 25*/
|
|
|
|
/*collision: lara_col_backjump*/
|
2020-08-14 17:54:25 -05:00
|
|
|
Camera.targetAngle = ANGLE(135.0f);
|
2020-09-26 05:06:08 +10:00
|
|
|
if (item->fallspeed <= LARA_FREEFALL_SPEED)
|
2020-08-14 17:54:25 -05:00
|
|
|
{
|
2020-09-26 05:06:08 +10:00
|
|
|
if (item->goalAnimState == LS_RUN_FORWARD)
|
|
|
|
{
|
|
|
|
item->goalAnimState = LS_STOP;
|
|
|
|
}
|
|
|
|
else if ((TrInput & IN_FORWARD || TrInput & IN_ROLL) && item->goalAnimState != LS_STOP)
|
|
|
|
{
|
|
|
|
item->goalAnimState = LS_JUMP_ROLL_180;
|
|
|
|
}
|
2020-08-14 17:54:25 -05:00
|
|
|
}
|
2020-09-26 05:06:08 +10:00
|
|
|
else
|
2020-08-14 17:54:25 -05:00
|
|
|
{
|
2020-09-26 05:06:08 +10:00
|
|
|
item->goalAnimState = LS_FREEFALL;
|
2020-08-14 17:54:25 -05:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-02-03 01:50:59 -03:00
|
|
|
void lara_col_backjump(ITEM_INFO* item, COLL_INFO* coll)
|
2020-08-14 17:54:25 -05:00
|
|
|
{
|
2020-09-26 05:06:08 +10:00
|
|
|
/*state 25*/
|
|
|
|
/*state code: lara_as_backjump*/
|
2020-12-19 23:34:52 -03:00
|
|
|
Lara.moveAngle = item->pos.yRot + ANGLE(180);
|
2020-09-26 05:06:08 +10:00
|
|
|
lara_col_jumper(item, coll);
|
2020-08-14 17:54:25 -05:00
|
|
|
}
|
|
|
|
|
2021-02-03 01:50:59 -03:00
|
|
|
void lara_as_rightjump(ITEM_INFO* item, COLL_INFO* coll)
|
2020-08-14 17:54:25 -05:00
|
|
|
{
|
2020-09-26 05:06:08 +10:00
|
|
|
/*state 26*/
|
|
|
|
/*collision: lara_col_rightjump*/
|
2020-08-14 17:54:25 -05:00
|
|
|
Lara.look = false;
|
|
|
|
if (item->fallspeed > LARA_FREEFALL_SPEED)
|
|
|
|
item->goalAnimState = LS_FREEFALL;
|
2020-09-26 05:06:08 +10:00
|
|
|
else if (TrInput & IN_LEFT && item->goalAnimState != LS_STOP)
|
2020-08-14 17:54:25 -05:00
|
|
|
item->goalAnimState = LS_JUMP_ROLL_180;
|
|
|
|
}
|
|
|
|
|
2021-02-03 01:50:59 -03:00
|
|
|
void lara_col_rightjump(ITEM_INFO* item, COLL_INFO* coll)
|
2020-08-14 17:54:25 -05:00
|
|
|
{
|
2020-09-26 05:06:08 +10:00
|
|
|
/*state 26*/
|
|
|
|
/*state code: lara_as_rightjump*/
|
2020-12-19 23:34:52 -03:00
|
|
|
Lara.moveAngle = item->pos.yRot + ANGLE(90);
|
2020-09-26 05:06:08 +10:00
|
|
|
lara_col_jumper(item, coll);
|
2020-08-14 17:54:25 -05:00
|
|
|
}
|
|
|
|
|
2021-02-03 01:50:59 -03:00
|
|
|
void lara_as_leftjump(ITEM_INFO* item, COLL_INFO* coll)
|
2020-08-14 17:54:25 -05:00
|
|
|
{
|
2020-09-26 05:06:08 +10:00
|
|
|
/*state 27*/
|
|
|
|
/*collision: lara_col_leftjump*/
|
2020-08-14 17:54:25 -05:00
|
|
|
Lara.look = false;
|
|
|
|
if (item->fallspeed > LARA_FREEFALL_SPEED)
|
|
|
|
item->goalAnimState = LS_FREEFALL;
|
2020-09-26 05:06:08 +10:00
|
|
|
else if (TrInput & IN_RIGHT && item->goalAnimState != LS_STOP)
|
2020-08-14 17:54:25 -05:00
|
|
|
item->goalAnimState = LS_JUMP_ROLL_180;
|
|
|
|
}
|
|
|
|
|
2021-02-03 01:50:59 -03:00
|
|
|
void lara_col_leftjump(ITEM_INFO* item, COLL_INFO* coll)
|
2020-08-14 17:54:25 -05:00
|
|
|
{
|
2020-09-26 05:06:08 +10:00
|
|
|
/*state 27*/
|
|
|
|
/*state code: lara_as_leftjump*/
|
2020-12-19 23:34:52 -03:00
|
|
|
Lara.moveAngle = item->pos.yRot - ANGLE(90);
|
2020-09-26 05:06:08 +10:00
|
|
|
lara_col_jumper(item, coll);
|
2020-08-14 17:54:25 -05:00
|
|
|
}
|
|
|
|
|
2020-09-26 05:06:08 +10:00
|
|
|
void lara_col_jumper(ITEM_INFO* item, COLL_INFO* coll)
|
2020-08-14 17:54:25 -05:00
|
|
|
{
|
2020-09-26 05:06:08 +10:00
|
|
|
/*states 25, 26, 27*/
|
|
|
|
/*state code: none, but is called in lara_col_backjump, lara_col_rightjump and lara_col_leftjump*/
|
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;
|
|
|
|
coll->Setup.ForwardAngle = Lara.moveAngle;
|
2020-08-14 17:54:25 -05:00
|
|
|
|
2021-09-19 06:42:24 +03:00
|
|
|
GetCollisionInfo(coll, item);
|
2020-08-14 17:54:25 -05:00
|
|
|
LaraDeflectEdgeJump(item, coll);
|
|
|
|
|
2021-09-10 00:18:47 +03:00
|
|
|
if (item->fallspeed > 0 && coll->Middle.Floor <= 0)
|
2020-08-14 17:54:25 -05:00
|
|
|
{
|
|
|
|
if (LaraLandedBad(item, coll))
|
|
|
|
item->goalAnimState = LS_DEATH;
|
|
|
|
else
|
|
|
|
item->goalAnimState = LS_STOP;
|
|
|
|
|
|
|
|
item->fallspeed = 0;
|
|
|
|
item->gravityStatus = 0;
|
|
|
|
|
2021-09-10 00:18:47 +03:00
|
|
|
if (coll->Middle.Floor != NO_HEIGHT)
|
|
|
|
item->pos.yPos += coll->Middle.Floor;
|
2020-08-14 17:54:25 -05:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-02-03 01:50:59 -03:00
|
|
|
void lara_as_upjump(ITEM_INFO* item, COLL_INFO* coll)
|
2020-08-14 17:54:25 -05:00
|
|
|
{
|
2020-09-26 05:06:08 +10:00
|
|
|
/*state 28*/
|
|
|
|
/*collision: lara_col_upjump*/
|
2020-09-26 03:28:30 +10:00
|
|
|
if (item->fallspeed > LARA_FREEFALL_SPEED)
|
2020-08-14 17:54:25 -05:00
|
|
|
{
|
2020-09-26 03:28:30 +10:00
|
|
|
item->goalAnimState = LS_FREEFALL;
|
2020-08-14 17:54:25 -05:00
|
|
|
}
|
2020-09-26 03:28:30 +10:00
|
|
|
}
|
|
|
|
|
2021-02-03 01:50:59 -03:00
|
|
|
void lara_col_upjump(ITEM_INFO* item, COLL_INFO* coll)
|
2020-09-26 03:28:30 +10:00
|
|
|
{
|
2020-09-26 05:06:08 +10:00
|
|
|
/*state 28*/
|
|
|
|
/*state code: lara_as_upjump*/
|
|
|
|
if (item->hitPoints <= 0)
|
|
|
|
{
|
|
|
|
item->goalAnimState = LS_STOP;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2020-12-19 23:34:52 -03:00
|
|
|
Lara.moveAngle = item->pos.yRot;
|
2020-08-14 17:54:25 -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;
|
|
|
|
coll->Setup.ForwardAngle = item->speed < 0 ? Lara.moveAngle + ANGLE(180.0f) : Lara.moveAngle;
|
2021-10-27 12:46:36 +03:00
|
|
|
coll->Setup.Mode = COLL_PROBE_MODE::FREE_FORWARD;
|
2020-08-14 17:54:25 -05:00
|
|
|
|
2021-09-19 06:42:24 +03:00
|
|
|
GetCollisionInfo(coll, item);
|
2020-08-14 17:54:25 -05:00
|
|
|
|
2021-10-27 10:13:47 +03:00
|
|
|
if (TestLaraHangJumpUp(item, coll))
|
|
|
|
return;
|
2020-08-14 17:54:25 -05:00
|
|
|
|
2021-09-10 00:18:47 +03:00
|
|
|
if (coll->CollisionType == CT_CLAMP ||
|
|
|
|
coll->CollisionType == CT_TOP ||
|
|
|
|
coll->CollisionType == CT_TOP_FRONT)
|
2020-08-14 17:54:25 -05:00
|
|
|
item->fallspeed = 1;
|
|
|
|
|
2021-10-28 03:12:12 +03:00
|
|
|
ShiftItem(item, coll);
|
|
|
|
|
2021-09-10 00:18:47 +03:00
|
|
|
if (coll->CollisionType == CT_NONE)
|
2020-08-14 17:54:25 -05:00
|
|
|
{
|
|
|
|
if (item->fallspeed < -70)
|
|
|
|
{
|
|
|
|
if (TrInput & IN_FORWARD && item->speed < 5)
|
|
|
|
{
|
|
|
|
item->speed++;
|
|
|
|
}
|
|
|
|
else if (TrInput & IN_BACK && item->speed > -5)
|
|
|
|
{
|
|
|
|
item->speed -= 2;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
item->speed = item->speed <= 0 ? -2 : 2;
|
|
|
|
}
|
|
|
|
|
2021-09-10 00:18:47 +03:00
|
|
|
if (item->fallspeed > 0 && coll->Middle.Floor <= 0)
|
2020-08-14 17:54:25 -05:00
|
|
|
{
|
|
|
|
item->goalAnimState = LaraLandedBad(item, coll) ? LS_DEATH : LS_STOP;
|
|
|
|
|
|
|
|
item->gravityStatus = false;
|
|
|
|
item->fallspeed = 0;
|
|
|
|
|
2021-09-10 00:18:47 +03:00
|
|
|
if (coll->Middle.Floor != NO_HEIGHT)
|
|
|
|
item->pos.yPos += coll->Middle.Floor;
|
2020-08-14 17:54:25 -05:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-02-03 01:50:59 -03:00
|
|
|
void lara_as_fallback(ITEM_INFO* item, COLL_INFO* coll)
|
2020-08-14 17:54:25 -05:00
|
|
|
{
|
2020-09-26 05:06:08 +10:00
|
|
|
/*state 29*/
|
|
|
|
/*collision: lara_col_fallback*/
|
2020-08-14 17:54:25 -05:00
|
|
|
if (item->fallspeed > LARA_FREEFALL_SPEED)
|
|
|
|
item->goalAnimState = LS_FREEFALL;
|
|
|
|
|
2020-09-26 05:06:08 +10:00
|
|
|
if (TrInput & IN_ACTION)
|
|
|
|
if (Lara.gunStatus == LG_NO_ARMS)
|
|
|
|
item->goalAnimState = LS_REACH;
|
2020-08-14 17:54:25 -05:00
|
|
|
}
|
|
|
|
|
2021-02-03 01:50:59 -03:00
|
|
|
void lara_col_fallback(ITEM_INFO* item, COLL_INFO* coll)
|
2020-08-14 17:54:25 -05:00
|
|
|
{
|
2020-09-26 05:06:08 +10:00
|
|
|
/*state 29*/
|
|
|
|
/*state code: lara_as_fallback*/
|
2020-12-19 23:34:52 -03:00
|
|
|
Lara.moveAngle = item->pos.yRot + ANGLE(180);
|
2020-08-14 17:54:25 -05:00
|
|
|
|
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;
|
2020-09-26 03:28:30 +10:00
|
|
|
|
2021-09-10 00:20:59 +03:00
|
|
|
coll->Setup.ForwardAngle = Lara.moveAngle;
|
2021-09-19 06:42:24 +03:00
|
|
|
GetCollisionInfo(coll, item);
|
2020-08-14 17:54:25 -05:00
|
|
|
LaraDeflectEdgeJump(item, coll);
|
|
|
|
|
2021-09-10 00:18:47 +03:00
|
|
|
if (item->fallspeed > 0 && coll->Middle.Floor <= 0)
|
2020-08-14 17:54:25 -05:00
|
|
|
{
|
|
|
|
if (LaraLandedBad(item, coll))
|
|
|
|
item->goalAnimState = LS_DEATH;
|
|
|
|
else
|
|
|
|
item->goalAnimState = LS_STOP;
|
|
|
|
|
|
|
|
item->fallspeed = 0;
|
|
|
|
item->gravityStatus = 0;
|
|
|
|
|
2021-09-10 00:18:47 +03:00
|
|
|
if (coll->Middle.Floor != NO_HEIGHT)
|
|
|
|
item->pos.yPos += coll->Middle.Floor;
|
2020-08-14 17:54:25 -05:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-10-15 18:26:03 +11:00
|
|
|
// State: LS_ROLL_FORWARD (45)
|
2021-11-07 12:57:34 +11:00
|
|
|
// Collision: lara_col_roll()
|
|
|
|
void lara_as_roll(ITEM_INFO* item, COLL_INFO* coll)
|
|
|
|
{
|
|
|
|
if (TrInput & IN_LEFT &&
|
|
|
|
!(TrInput & IN_JUMP)) // JUMP locks y rotation.
|
|
|
|
{
|
|
|
|
Lara.turnRate -= LARA_TURN_RATE;
|
|
|
|
if (Lara.turnRate < -LARA_MED_TURN)
|
|
|
|
Lara.turnRate = -LARA_MED_TURN;
|
|
|
|
}
|
|
|
|
else if (TrInput & IN_RIGHT &&
|
|
|
|
!(TrInput & IN_JUMP))
|
|
|
|
{
|
|
|
|
Lara.turnRate += LARA_TURN_RATE;
|
|
|
|
if (Lara.turnRate > LARA_MED_TURN)
|
|
|
|
Lara.turnRate = LARA_MED_TURN;
|
|
|
|
}
|
|
|
|
|
|
|
|
// TODO: Interpolation instead.
|
|
|
|
Lara.NewAnims.SwandiveRollRun = true;
|
|
|
|
|
|
|
|
if (TrInput & IN_FORWARD &&
|
|
|
|
item->animNumber == LA_SWANDIVE_ROLL &&
|
|
|
|
Lara.NewAnims.SwandiveRollRun)
|
|
|
|
{
|
|
|
|
item->goalAnimState = LS_RUN_FORWARD;
|
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
item->goalAnimState = LS_ROLL_FORWARD;
|
|
|
|
}
|
|
|
|
|
|
|
|
// State: LS_ROLL_FORWARD (45)
|
|
|
|
// Control: lara_as_roll()
|
2021-02-03 01:50:59 -03:00
|
|
|
void lara_col_roll(ITEM_INFO* item, COLL_INFO* coll)
|
2021-10-15 18:26:03 +11:00
|
|
|
{
|
|
|
|
Lara.moveAngle = item->pos.yRot;
|
|
|
|
item->gravityStatus = false;
|
|
|
|
item->fallspeed = 0;
|
|
|
|
coll->Setup.BadHeightDown = NO_BAD_POS;
|
|
|
|
coll->Setup.BadHeightUp = -STEPUP_HEIGHT;
|
|
|
|
coll->Setup.BadCeilingHeight = 0;
|
|
|
|
coll->Setup.SlopesArePits = false;
|
|
|
|
coll->Setup.SlopesAreWalls = true;
|
|
|
|
coll->Setup.ForwardAngle = Lara.moveAngle;
|
|
|
|
GetCollisionInfo(coll, item);
|
|
|
|
|
|
|
|
if (TestLaraHitCeiling(coll))
|
|
|
|
{
|
|
|
|
SetLaraHitCeiling(item, coll);
|
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (TestLaraFall(coll))
|
|
|
|
{
|
|
|
|
SetLaraFallState(item);
|
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2021-11-05 21:29:00 +11:00
|
|
|
if (TestLaraSlide(item, coll))
|
2021-10-15 18:26:03 +11:00
|
|
|
return;
|
|
|
|
|
|
|
|
ShiftItem(item, coll);
|
|
|
|
|
|
|
|
if (TestLaraStep(coll))
|
|
|
|
{
|
|
|
|
DoLaraStep(item, coll);
|
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
// LEGACY step
|
|
|
|
/*if (coll->Middle.Floor != NO_HEIGHT)
|
|
|
|
item->pos.yPos += coll->Middle.Floor;*/
|
|
|
|
}
|
|
|
|
|
|
|
|
// LEGACY
|
|
|
|
void old_lara_col_roll(ITEM_INFO* item, COLL_INFO* coll)
|
2020-08-14 17:54:25 -05:00
|
|
|
{
|
2020-09-26 05:06:08 +10:00
|
|
|
/*state 45*/
|
|
|
|
/*state code: lara_void_func*/
|
2020-12-19 23:34:52 -03:00
|
|
|
Lara.moveAngle = item->pos.yRot;
|
2020-08-14 17:54:25 -05:00
|
|
|
|
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 = 0;
|
|
|
|
coll->Setup.SlopesArePits = false;
|
|
|
|
coll->Setup.SlopesAreWalls = true;
|
2020-09-26 03:28:30 +10:00
|
|
|
|
2020-09-26 05:06:08 +10:00
|
|
|
item->gravityStatus = false;
|
|
|
|
item->fallspeed = 0;
|
|
|
|
|
2021-09-10 00:20:59 +03:00
|
|
|
coll->Setup.ForwardAngle = Lara.moveAngle;
|
2021-09-19 06:42:24 +03:00
|
|
|
GetCollisionInfo(coll, item);
|
2020-08-14 17:54:25 -05:00
|
|
|
|
|
|
|
if (LaraHitCeiling(item, coll))
|
|
|
|
return;
|
2020-09-26 05:06:08 +10:00
|
|
|
if (TestLaraSlide(item, coll))
|
2020-08-14 17:54:25 -05:00
|
|
|
return;
|
2020-09-26 05:06:08 +10:00
|
|
|
if (LaraFallen(item, coll))
|
2020-08-14 17:54:25 -05:00
|
|
|
return;
|
|
|
|
|
2021-07-09 19:41:56 -05:00
|
|
|
//##LUA debug etc.
|
|
|
|
Lara.NewAnims.SwandiveRollRun = 1;
|
|
|
|
|
|
|
|
if (TrInput & IN_FORWARD && item->animNumber == LA_SWANDIVE_ROLL && Lara.NewAnims.SwandiveRollRun)
|
2020-08-14 17:54:25 -05:00
|
|
|
{
|
|
|
|
item->goalAnimState = LS_RUN_FORWARD;
|
|
|
|
}
|
|
|
|
|
|
|
|
ShiftItem(item, coll);
|
|
|
|
|
2021-09-10 00:18:47 +03:00
|
|
|
if (coll->Middle.Floor != NO_HEIGHT)
|
|
|
|
item->pos.yPos += coll->Middle.Floor;
|
2020-08-14 17:54:25 -05:00
|
|
|
}
|
|
|
|
|
2021-02-03 01:50:59 -03:00
|
|
|
void lara_as_swandive(ITEM_INFO* item, COLL_INFO* coll)
|
2020-08-14 17:54:25 -05:00
|
|
|
{
|
2020-09-26 05:06:08 +10:00
|
|
|
/*state 52*/
|
|
|
|
/*collision: lara_col_swandive*/
|
2021-09-10 00:20:59 +03:00
|
|
|
coll->Setup.EnableObjectPush = true;
|
|
|
|
coll->Setup.EnableSpaz = false;
|
2021-11-07 12:57:34 +11:00
|
|
|
|
2021-10-30 14:19:48 +11:00
|
|
|
if (TrInput & IN_LEFT)
|
|
|
|
{
|
|
|
|
Lara.turnRate -= LARA_TURN_RATE;
|
|
|
|
if (Lara.turnRate < -LARA_JUMP_TURN)
|
|
|
|
Lara.turnRate = -LARA_JUMP_TURN;
|
|
|
|
}
|
|
|
|
else if (TrInput & IN_RIGHT)
|
|
|
|
{
|
|
|
|
Lara.turnRate += LARA_TURN_RATE;
|
|
|
|
if (Lara.turnRate > LARA_JUMP_TURN)
|
|
|
|
Lara.turnRate = LARA_JUMP_TURN;
|
|
|
|
}
|
|
|
|
|
2020-09-26 05:06:08 +10:00
|
|
|
if (item->fallspeed > LARA_FREEFALL_SPEED && item->goalAnimState != LS_DIVE)
|
2020-08-14 17:54:25 -05:00
|
|
|
item->goalAnimState = LS_SWANDIVE_END;
|
|
|
|
}
|
|
|
|
|
2021-02-03 01:50:59 -03:00
|
|
|
void lara_col_swandive(ITEM_INFO* item, COLL_INFO* coll)
|
2020-08-14 17:54:25 -05:00
|
|
|
{
|
2020-09-26 05:06:08 +10:00
|
|
|
/*state 52*/
|
|
|
|
/*state code: lara_as_swandive*/
|
2020-12-19 23:34:52 -03:00
|
|
|
Lara.moveAngle = item->pos.yRot;
|
2020-08-14 17:54:25 -05:00
|
|
|
|
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;
|
2020-09-26 03:28:30 +10:00
|
|
|
|
2021-09-10 00:20:59 +03:00
|
|
|
coll->Setup.ForwardAngle = Lara.moveAngle;
|
2021-09-19 06:42:24 +03:00
|
|
|
GetCollisionInfo(coll, item);
|
2020-08-14 17:54:25 -05:00
|
|
|
LaraDeflectEdgeJump(item, coll);
|
|
|
|
|
2021-09-10 00:18:47 +03:00
|
|
|
if (coll->Middle.Floor <= 0 && item->fallspeed > 0)
|
2020-08-14 17:54:25 -05:00
|
|
|
{
|
|
|
|
item->goalAnimState = LS_STOP;
|
|
|
|
item->fallspeed = 0;
|
|
|
|
item->gravityStatus = 0;
|
|
|
|
|
2021-09-10 00:18:47 +03:00
|
|
|
if (coll->Middle.Floor != NO_HEIGHT)
|
|
|
|
item->pos.yPos += coll->Middle.Floor;
|
2020-08-14 17:54:25 -05:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-02-03 01:50:59 -03:00
|
|
|
void lara_as_fastdive(ITEM_INFO* item, COLL_INFO* coll)
|
2020-08-14 17:54:25 -05:00
|
|
|
{
|
2020-09-26 05:06:08 +10:00
|
|
|
/*state 53*/
|
|
|
|
/*collision: lara_col_fastdive*/
|
|
|
|
if (TrInput & IN_ROLL && item->goalAnimState == LS_SWANDIVE_END)
|
|
|
|
item->goalAnimState = LS_JUMP_ROLL_180;
|
2021-09-10 00:20:59 +03:00
|
|
|
coll->Setup.EnableObjectPush = true;
|
|
|
|
coll->Setup.EnableSpaz = false;
|
2020-09-26 05:06:08 +10:00
|
|
|
item->speed = (item->speed * 95) / 100;
|
2020-08-14 17:54:25 -05:00
|
|
|
}
|
|
|
|
|
2021-02-03 01:50:59 -03:00
|
|
|
void lara_col_fastdive(ITEM_INFO* item, COLL_INFO* coll)
|
2020-08-14 17:54:25 -05:00
|
|
|
{
|
2020-09-26 05:06:08 +10:00
|
|
|
/*state 53*/
|
|
|
|
/*state code: lara_as_fastdive*/
|
2020-12-19 23:34:52 -03:00
|
|
|
Lara.moveAngle = item->pos.yRot;
|
2020-08-14 17:54:25 -05:00
|
|
|
|
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;
|
2020-09-26 03:28:30 +10:00
|
|
|
|
2021-09-10 00:20:59 +03:00
|
|
|
coll->Setup.ForwardAngle = Lara.moveAngle;
|
2021-09-19 06:42:24 +03:00
|
|
|
GetCollisionInfo(coll, item);
|
2020-08-14 17:54:25 -05:00
|
|
|
LaraDeflectEdgeJump(item, coll);
|
|
|
|
|
2021-09-10 00:18:47 +03:00
|
|
|
if (coll->Middle.Floor <= 0 && item->fallspeed > 0)
|
2020-08-14 17:54:25 -05:00
|
|
|
{
|
|
|
|
if (item->fallspeed <= 133)
|
|
|
|
item->goalAnimState = LS_STOP;
|
|
|
|
else
|
|
|
|
item->goalAnimState = LS_DEATH;
|
|
|
|
|
|
|
|
item->fallspeed = 0;
|
|
|
|
item->gravityStatus = 0;
|
|
|
|
|
2021-09-10 00:18:47 +03:00
|
|
|
if (coll->Middle.Floor != NO_HEIGHT)
|
|
|
|
item->pos.yPos += coll->Middle.Floor;
|
2020-08-14 17:54:25 -05:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-02-03 01:50:59 -03:00
|
|
|
void lara_as_gymnast(ITEM_INFO* item, COLL_INFO* coll)
|
2020-09-26 05:06:08 +10:00
|
|
|
{
|
|
|
|
/*state 54*/
|
|
|
|
/*collision: lara_default_col*/
|
2021-09-10 00:20:59 +03:00
|
|
|
coll->Setup.EnableObjectPush = false;
|
|
|
|
coll->Setup.EnableSpaz = false;
|
2020-09-26 05:06:08 +10:00
|
|
|
}
|
|
|
|
|
2021-10-14 17:40:22 +11:00
|
|
|
// State: LS_WADE_FORWARD (65)
|
|
|
|
// Collision: lara_col_wade()
|
2021-02-03 01:50:59 -03:00
|
|
|
void lara_as_wade(ITEM_INFO* item, COLL_INFO* coll)
|
2021-10-14 17:40:22 +11:00
|
|
|
{
|
|
|
|
Camera.targetElevation = -ANGLE(22.0f);
|
|
|
|
|
|
|
|
if (item->hitPoints <= 0)
|
|
|
|
{
|
|
|
|
item->goalAnimState = LS_STOP;
|
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (g_Level.Rooms[item->roomNumber].flags & ENV_FLAG_SWAMP)
|
|
|
|
{
|
|
|
|
LaraWadeSwamp(item, coll);
|
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (TrInput & IN_LEFT)
|
|
|
|
{
|
|
|
|
Lara.turnRate -= LARA_TURN_RATE;
|
|
|
|
if (Lara.turnRate < -LARA_FAST_TURN)
|
|
|
|
Lara.turnRate = -LARA_FAST_TURN;
|
|
|
|
|
2021-10-22 01:50:43 +11:00
|
|
|
DoLaraLean(item, coll, -LARA_LEAN_MAX, 16);
|
2021-10-14 17:40:22 +11:00
|
|
|
}
|
|
|
|
else if (TrInput & IN_RIGHT)
|
|
|
|
{
|
|
|
|
Lara.turnRate += LARA_TURN_RATE;
|
|
|
|
if (Lara.turnRate > LARA_FAST_TURN)
|
|
|
|
Lara.turnRate = LARA_FAST_TURN;
|
|
|
|
|
2021-10-22 01:50:43 +11:00
|
|
|
DoLaraLean(item, coll, LARA_LEAN_MAX, 16);
|
2021-10-14 17:40:22 +11:00
|
|
|
}
|
|
|
|
|
|
|
|
if (TrInput & IN_FORWARD)
|
|
|
|
{
|
|
|
|
if (Lara.waterStatus == LW_ABOVE_WATER)
|
|
|
|
item->goalAnimState = LS_RUN_FORWARD;
|
|
|
|
else [[likely]]
|
|
|
|
item->goalAnimState = LS_WADE_FORWARD;
|
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
item->goalAnimState = LS_STOP;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Pseudo-state for wading in a swamp.
|
|
|
|
void LaraWadeSwamp(ITEM_INFO* item, COLL_INFO* coll)
|
|
|
|
{
|
|
|
|
if (TrInput & IN_LEFT)
|
|
|
|
{
|
|
|
|
Lara.turnRate -= LARA_TURN_RATE;
|
|
|
|
if (Lara.turnRate < -LARA_SLOW_TURN)
|
|
|
|
Lara.turnRate = -LARA_SLOW_TURN;
|
|
|
|
|
2021-10-22 01:50:43 +11:00
|
|
|
DoLaraLean(item, coll, -LARA_LEAN_MAX / 2, 24);
|
2021-10-14 17:40:22 +11:00
|
|
|
}
|
|
|
|
else if (TrInput & IN_RIGHT)
|
|
|
|
{
|
|
|
|
Lara.turnRate += LARA_TURN_RATE;
|
|
|
|
if (Lara.turnRate > LARA_SLOW_TURN)
|
|
|
|
Lara.turnRate = LARA_SLOW_TURN;
|
|
|
|
|
2021-10-22 01:50:43 +11:00
|
|
|
DoLaraLean(item, coll, LARA_LEAN_MAX / 2, 24);
|
2021-10-14 17:40:22 +11:00
|
|
|
}
|
|
|
|
|
|
|
|
if (TrInput & IN_FORWARD)
|
|
|
|
{
|
|
|
|
item->goalAnimState = LS_WADE_FORWARD;
|
2021-10-30 13:42:55 +11:00
|
|
|
|
2021-10-14 17:40:22 +11:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
item->goalAnimState = LS_STOP;
|
|
|
|
}
|
|
|
|
|
|
|
|
// LEGACY
|
|
|
|
void old_lara_as_wade(ITEM_INFO* item, COLL_INFO* coll)
|
2020-08-14 17:54:25 -05:00
|
|
|
{
|
2020-09-26 05:06:08 +10:00
|
|
|
/*state 65*/
|
|
|
|
/*collision: lara_col_wade*/
|
2020-08-14 17:54:25 -05:00
|
|
|
if (item->hitPoints <= 0)
|
|
|
|
{
|
2020-09-26 05:06:08 +10:00
|
|
|
item->goalAnimState = LS_STOP;
|
2020-08-14 17:54:25 -05:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2020-09-26 05:06:08 +10:00
|
|
|
Camera.targetElevation = -ANGLE(22.0f);
|
2020-09-26 03:28:30 +10:00
|
|
|
|
2020-09-26 05:06:08 +10:00
|
|
|
if (g_Level.Rooms[item->roomNumber].flags & ENV_FLAG_SWAMP)
|
2020-08-14 17:54:25 -05:00
|
|
|
{
|
2020-09-26 05:06:08 +10:00
|
|
|
if (TrInput & IN_LEFT)
|
2020-08-14 17:54:25 -05:00
|
|
|
{
|
2020-09-26 05:06:08 +10:00
|
|
|
Lara.turnRate -= LARA_TURN_RATE;
|
2021-09-26 13:39:34 +10:00
|
|
|
if (Lara.turnRate < -LARA_SLOW_TURN)
|
|
|
|
Lara.turnRate = -LARA_SLOW_TURN;
|
2020-09-26 05:06:08 +10:00
|
|
|
|
2021-10-22 01:50:43 +11:00
|
|
|
DoLaraLean(item, coll, -LARA_LEAN_MAX / 2, 16);
|
2020-08-14 17:54:25 -05:00
|
|
|
}
|
2020-09-26 05:06:08 +10:00
|
|
|
else if (TrInput & IN_RIGHT)
|
2020-08-14 17:54:25 -05:00
|
|
|
{
|
2020-09-26 05:06:08 +10:00
|
|
|
Lara.turnRate += LARA_TURN_RATE;
|
2021-09-26 13:39:34 +10:00
|
|
|
if (Lara.turnRate > LARA_SLOW_TURN)
|
|
|
|
Lara.turnRate = LARA_SLOW_TURN;
|
2020-09-26 05:06:08 +10:00
|
|
|
|
2021-10-22 01:50:43 +11:00
|
|
|
DoLaraLean(item, coll, LARA_LEAN_MAX / 2, 16);
|
2020-08-14 17:54:25 -05:00
|
|
|
}
|
|
|
|
|
2020-09-26 05:06:08 +10:00
|
|
|
if (TrInput & IN_FORWARD)
|
|
|
|
item->goalAnimState = LS_WADE_FORWARD;
|
|
|
|
else
|
|
|
|
item->goalAnimState = LS_STOP;
|
2020-09-26 03:28:30 +10:00
|
|
|
}
|
2020-09-26 05:06:08 +10:00
|
|
|
else
|
2020-09-26 03:28:30 +10:00
|
|
|
{
|
2020-09-26 05:06:08 +10:00
|
|
|
if (TrInput & IN_LEFT)
|
|
|
|
{
|
|
|
|
Lara.turnRate -= LARA_TURN_RATE;
|
|
|
|
if (Lara.turnRate < -LARA_FAST_TURN)
|
|
|
|
Lara.turnRate = -LARA_FAST_TURN;
|
2020-09-26 03:28:30 +10:00
|
|
|
|
2021-10-22 01:50:43 +11:00
|
|
|
DoLaraLean(item, coll, -LARA_LEAN_MAX, 7);
|
2020-09-26 05:06:08 +10:00
|
|
|
}
|
|
|
|
else if (TrInput & IN_RIGHT)
|
|
|
|
{
|
|
|
|
Lara.turnRate += LARA_TURN_RATE;
|
|
|
|
if (Lara.turnRate > LARA_FAST_TURN)
|
|
|
|
Lara.turnRate = LARA_FAST_TURN;
|
2020-09-26 03:28:30 +10:00
|
|
|
|
2021-10-22 01:50:43 +11:00
|
|
|
DoLaraLean(item, coll, LARA_LEAN_MAX, 7);
|
2020-09-26 05:06:08 +10:00
|
|
|
}
|
2020-09-26 03:28:30 +10:00
|
|
|
|
2020-09-26 05:06:08 +10:00
|
|
|
if (TrInput & IN_FORWARD)
|
2020-08-14 17:54:25 -05:00
|
|
|
{
|
2020-09-26 05:06:08 +10:00
|
|
|
if (Lara.waterStatus == LW_ABOVE_WATER)
|
|
|
|
item->goalAnimState = LS_RUN_FORWARD;
|
|
|
|
else
|
|
|
|
item->goalAnimState = LS_WADE_FORWARD;
|
2020-08-14 17:54:25 -05:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2020-09-26 05:06:08 +10:00
|
|
|
item->goalAnimState = LS_STOP;
|
2020-08-14 17:54:25 -05:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-10-24 22:18:22 +11:00
|
|
|
// State: LS_WADE_FORWARD (65)
|
|
|
|
// Control: lara_as_wade()
|
2020-09-26 05:06:08 +10:00
|
|
|
void lara_col_wade(ITEM_INFO* item, COLL_INFO* coll)
|
2021-10-24 22:18:22 +11:00
|
|
|
{
|
|
|
|
Lara.moveAngle = item->pos.yRot;
|
|
|
|
coll->Setup.BadHeightDown = NO_BAD_POS;
|
|
|
|
coll->Setup.BadHeightUp = -STEPUP_HEIGHT;
|
|
|
|
coll->Setup.BadCeilingHeight = 0;
|
|
|
|
coll->Setup.SlopesAreWalls = true;
|
|
|
|
coll->Setup.ForwardAngle = Lara.moveAngle;
|
|
|
|
GetCollisionInfo(coll, item);
|
|
|
|
|
|
|
|
if (TestLaraHitCeiling(coll))
|
|
|
|
{
|
|
|
|
SetLaraHitCeiling(item, coll);
|
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (LaraDeflectEdge(item, coll))
|
|
|
|
{
|
|
|
|
item->pos.zRot = 0;
|
|
|
|
|
2021-10-26 13:05:19 +11:00
|
|
|
if (!coll->Front.Slope && coll->Front.Floor < -(STEPUP_HEIGHT) &&
|
2021-10-24 22:18:22 +11:00
|
|
|
!(g_Level.Rooms[item->roomNumber].flags & ENV_FLAG_SWAMP))
|
|
|
|
{
|
|
|
|
item->goalAnimState = LS_SPLAT;
|
|
|
|
if (GetChange(item, &g_Level.Anims[item->animNumber]))
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
LaraCollideStop(item, coll);
|
|
|
|
}
|
|
|
|
|
2021-10-26 13:05:19 +11:00
|
|
|
if (TestLaraVault(item, coll))
|
|
|
|
return;
|
|
|
|
|
2021-10-25 18:41:53 +11:00
|
|
|
if (TestLaraStep(coll)
|
|
|
|
&& !(g_Level.Rooms[item->roomNumber].flags & ENV_FLAG_SWAMP))
|
2021-10-24 22:18:22 +11:00
|
|
|
{
|
2021-10-25 18:41:53 +11:00
|
|
|
DoLaraStep(item, coll);
|
2021-10-24 22:18:22 +11:00
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2021-10-25 18:41:53 +11:00
|
|
|
// Swamp step. TODO: Test it when swamps work again. @Sezz 2021.10.25
|
|
|
|
if (coll->Middle.Floor < 0)
|
2021-10-24 22:18:22 +11:00
|
|
|
item->pos.yPos += coll->Middle.Floor;
|
2021-10-25 18:41:53 +11:00
|
|
|
else if (coll->Middle.Floor)
|
2021-10-24 22:18:22 +11:00
|
|
|
item->pos.yPos += SWAMP_GRAVITY;
|
|
|
|
}
|
|
|
|
|
|
|
|
// LEGACY
|
|
|
|
void old_lara_col_wade(ITEM_INFO* item, COLL_INFO* coll)
|
2020-08-14 17:54:25 -05:00
|
|
|
{
|
2020-09-26 05:06:08 +10:00
|
|
|
/*state 65*/
|
|
|
|
/*state code: lara_as_wade*/
|
2020-12-19 23:34:52 -03:00
|
|
|
Lara.moveAngle = item->pos.yRot;
|
2020-08-14 17:54:25 -05:00
|
|
|
|
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 = 0;
|
2020-09-26 03:28:30 +10:00
|
|
|
|
2021-09-10 00:20:59 +03:00
|
|
|
coll->Setup.SlopesAreWalls = true;
|
2020-09-26 03:28:30 +10:00
|
|
|
|
2021-09-10 00:20:59 +03:00
|
|
|
coll->Setup.ForwardAngle = Lara.moveAngle;
|
2021-09-19 06:42:24 +03:00
|
|
|
GetCollisionInfo(coll, item);
|
2020-08-14 17:54:25 -05:00
|
|
|
|
2020-09-26 05:06:08 +10:00
|
|
|
if (LaraHitCeiling(item, coll))
|
2020-08-14 17:54:25 -05:00
|
|
|
return;
|
|
|
|
|
2020-09-26 05:06:08 +10:00
|
|
|
if (TestLaraVault(item, coll))
|
2020-08-14 17:54:25 -05:00
|
|
|
return;
|
|
|
|
|
|
|
|
if (LaraDeflectEdge(item, coll))
|
|
|
|
{
|
|
|
|
item->pos.zRot = 0;
|
|
|
|
|
2020-09-26 05:06:08 +10:00
|
|
|
|
2021-09-17 22:55:09 +03:00
|
|
|
if (!coll->Front.Slope && coll->Front.Floor < -((STEP_SIZE * 5) / 2) && !(g_Level.Rooms[item->roomNumber].flags & ENV_FLAG_SWAMP))
|
2020-08-14 17:54:25 -05:00
|
|
|
{
|
|
|
|
item->goalAnimState = LS_SPLAT;
|
|
|
|
if (GetChange(item, &g_Level.Anims[item->animNumber]))
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
LaraCollideStop(item, coll);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2021-09-10 00:18:47 +03:00
|
|
|
if (coll->Middle.Floor >= -STEPUP_HEIGHT && coll->Middle.Floor < -STEP_SIZE / 2 && !(g_Level.Rooms[item->roomNumber].flags & ENV_FLAG_SWAMP))
|
2020-09-26 05:06:08 +10:00
|
|
|
{
|
|
|
|
item->goalAnimState = LS_STEP_UP;
|
|
|
|
GetChange(item, &g_Level.Anims[item->animNumber]);
|
2020-08-14 17:54:25 -05:00
|
|
|
}
|
|
|
|
|
2021-09-10 00:18:47 +03:00
|
|
|
if (coll->Middle.Floor >= 50 && !(g_Level.Rooms[item->roomNumber].flags & ENV_FLAG_SWAMP))
|
2020-08-14 17:54:25 -05:00
|
|
|
{
|
2020-09-26 05:06:08 +10:00
|
|
|
item->pos.yPos += 50;
|
|
|
|
return;
|
|
|
|
}
|
2020-08-14 17:54:25 -05:00
|
|
|
|
2021-09-10 00:18:47 +03:00
|
|
|
if (!(g_Level.Rooms[item->roomNumber].flags & ENV_FLAG_SWAMP) || coll->Middle.Floor < 0)
|
|
|
|
item->pos.yPos += coll->Middle.Floor; // Enforce to floor height.. if not a swamp room.
|
|
|
|
else if (g_Level.Rooms[item->roomNumber].flags & ENV_FLAG_SWAMP && coll->Middle.Floor)
|
2020-09-26 05:06:08 +10:00
|
|
|
item->pos.yPos += SWAMP_GRAVITY;
|
|
|
|
}
|
2020-09-26 03:28:30 +10:00
|
|
|
|
2021-09-29 18:35:21 +10:00
|
|
|
// State: LS_SPRINT (73)
|
|
|
|
// Collision: lara_col_dash()
|
2021-02-03 01:50:59 -03:00
|
|
|
void lara_as_dash(ITEM_INFO* item, COLL_INFO* coll)
|
2021-09-29 18:35:21 +10:00
|
|
|
{
|
|
|
|
DashTimer--; // TODO: Move global to LaraItem? health.cpp needs deglobalisation in general. @Sezz 2021.09.29
|
|
|
|
|
|
|
|
if (item->hitPoints <= 0)
|
|
|
|
{
|
2021-10-13 19:50:46 +11:00
|
|
|
item->goalAnimState = LS_DEATH;
|
2021-09-29 18:35:21 +10:00
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (TrInput & IN_LEFT)
|
|
|
|
{
|
|
|
|
Lara.turnRate -= LARA_TURN_RATE;
|
|
|
|
if (Lara.turnRate < -LARA_SLOW_TURN)
|
|
|
|
Lara.turnRate = -LARA_SLOW_TURN;
|
|
|
|
|
2021-10-28 16:13:56 +11:00
|
|
|
DoLaraLean(item, coll, -(LARA_LEAN_MAX * 3) / 5, 8);
|
2021-09-29 18:35:21 +10:00
|
|
|
}
|
|
|
|
else if (TrInput & IN_RIGHT)
|
|
|
|
{
|
|
|
|
Lara.turnRate += LARA_TURN_RATE;
|
|
|
|
if (Lara.turnRate > LARA_SLOW_TURN)
|
|
|
|
Lara.turnRate = LARA_SLOW_TURN;
|
|
|
|
|
2021-10-28 16:13:56 +11:00
|
|
|
DoLaraLean(item, coll, (LARA_LEAN_MAX * 3) / 5, 8);
|
2021-09-29 18:35:21 +10:00
|
|
|
}
|
|
|
|
|
|
|
|
if (TrInput & IN_JUMP)
|
|
|
|
{
|
|
|
|
item->goalAnimState = LS_SPRINT_ROLL;
|
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2021-10-16 21:52:45 +11:00
|
|
|
if ((TrInput & IN_DUCK/* || TestLaraKeepDucked(coll)*/) &&
|
2021-10-11 00:05:49 +11:00
|
|
|
(Lara.gunStatus == LG_NO_ARMS || !IsStandingWeapon(Lara.gunType)))
|
2021-09-29 18:35:21 +10:00
|
|
|
{
|
|
|
|
item->goalAnimState = LS_CROUCH_IDLE;
|
2021-10-13 19:50:46 +11:00
|
|
|
|
2021-09-29 18:35:21 +10:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
// TODO: Supposedly there is a bug wherein sprinting into the boundary between shallow and deep water
|
|
|
|
// under some condition allows Lara to run around in the water room. Investigate. @Sezz 2021.09.29
|
|
|
|
if (TrInput & IN_FORWARD)
|
|
|
|
{
|
|
|
|
if (Lara.waterStatus == LW_WADE)
|
|
|
|
item->goalAnimState = LS_RUN_FORWARD; // TODO: Dispatch to wade forward state. @Sezz 2021.09.29
|
|
|
|
else if (TrInput & IN_WALK)
|
|
|
|
item->goalAnimState = LS_WALK_FORWARD;
|
|
|
|
else if (TrInput & IN_SPRINT && DashTimer > 0) [[likely]]
|
|
|
|
item->goalAnimState = LS_SPRINT;
|
|
|
|
else
|
|
|
|
item->goalAnimState = LS_RUN_FORWARD;
|
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
item->goalAnimState = LS_STOP;
|
|
|
|
}
|
|
|
|
|
|
|
|
// LEGACY
|
|
|
|
void old_lara_as_dash(ITEM_INFO* item, COLL_INFO* coll)
|
2020-09-26 05:06:08 +10:00
|
|
|
{
|
|
|
|
/*state 73*/
|
|
|
|
/*collision: lara_col_dash*/
|
|
|
|
if (item->hitPoints <= 0 || !DashTimer || !(TrInput & IN_SPRINT) || Lara.waterStatus == LW_WADE)
|
|
|
|
{
|
|
|
|
item->goalAnimState = LS_RUN_FORWARD;
|
|
|
|
return;
|
2020-09-26 03:28:30 +10:00
|
|
|
}
|
2020-08-14 17:54:25 -05:00
|
|
|
|
2020-09-26 05:06:08 +10:00
|
|
|
DashTimer--;
|
|
|
|
|
|
|
|
if (TrInput & IN_DUCK
|
|
|
|
&& (Lara.gunStatus == LG_NO_ARMS
|
|
|
|
|| Lara.gunType == WEAPON_NONE
|
|
|
|
|| Lara.gunType == WEAPON_PISTOLS
|
|
|
|
|| Lara.gunType == WEAPON_REVOLVER
|
|
|
|
|| Lara.gunType == WEAPON_UZI
|
|
|
|
|| Lara.gunType == WEAPON_FLARE))
|
2020-08-14 17:54:25 -05:00
|
|
|
{
|
2020-09-26 05:06:08 +10:00
|
|
|
item->goalAnimState = LS_CROUCH_IDLE;
|
2020-08-14 17:54:25 -05:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (TrInput & IN_LEFT)
|
|
|
|
{
|
|
|
|
Lara.turnRate -= LARA_TURN_RATE;
|
2021-09-26 12:23:58 +10:00
|
|
|
if (Lara.turnRate < -LARA_SLOW_TURN)
|
|
|
|
Lara.turnRate = -LARA_SLOW_TURN;
|
2020-09-26 05:06:08 +10:00
|
|
|
|
2021-10-22 01:50:43 +11:00
|
|
|
DoLaraLean(item, coll, -LARA_LEAN_MAX, 7);
|
2020-08-14 17:54:25 -05:00
|
|
|
}
|
|
|
|
else if (TrInput & IN_RIGHT)
|
|
|
|
{
|
|
|
|
Lara.turnRate += LARA_TURN_RATE;
|
2021-09-26 12:23:58 +10:00
|
|
|
if (Lara.turnRate > LARA_SLOW_TURN)
|
|
|
|
Lara.turnRate = LARA_SLOW_TURN;
|
2020-08-14 17:54:25 -05:00
|
|
|
|
2021-10-22 01:50:43 +11:00
|
|
|
DoLaraLean(item, coll, LARA_LEAN_MAX, 7);
|
2020-08-14 17:54:25 -05:00
|
|
|
}
|
|
|
|
|
2020-09-26 05:06:08 +10:00
|
|
|
if (!(TrInput & IN_JUMP) || item->gravityStatus)
|
2020-08-14 17:54:25 -05:00
|
|
|
{
|
2020-09-26 05:06:08 +10:00
|
|
|
if (TrInput & IN_FORWARD)
|
|
|
|
{
|
|
|
|
if (TrInput & IN_WALK)
|
|
|
|
item->goalAnimState = LS_WALK_FORWARD;
|
|
|
|
else
|
|
|
|
item->goalAnimState = LS_SPRINT;
|
|
|
|
}
|
|
|
|
else if (!(TrInput & IN_LEFT) && !(TrInput & IN_RIGHT))
|
|
|
|
{
|
|
|
|
item->goalAnimState = LS_STOP;
|
|
|
|
}
|
2020-08-14 17:54:25 -05:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2020-09-26 05:06:08 +10:00
|
|
|
item->goalAnimState = LS_SPRINT_ROLL;
|
2020-08-14 17:54:25 -05:00
|
|
|
}
|
2020-09-26 05:06:08 +10:00
|
|
|
}
|
|
|
|
|
2021-10-09 23:53:39 +11:00
|
|
|
// State: LS_SPRINT (73)
|
|
|
|
// Control: lara_as_dash()
|
2021-02-03 01:50:59 -03:00
|
|
|
void lara_col_dash(ITEM_INFO* item, COLL_INFO* coll)
|
2021-10-09 23:53:39 +11:00
|
|
|
{
|
|
|
|
Lara.moveAngle = item->pos.yRot;
|
|
|
|
coll->Setup.BadHeightDown = NO_BAD_POS;
|
|
|
|
coll->Setup.BadHeightUp = -STEPUP_HEIGHT;
|
|
|
|
coll->Setup.BadCeilingHeight = 0;
|
|
|
|
coll->Setup.SlopesAreWalls = true;
|
|
|
|
coll->Setup.ForwardAngle = Lara.moveAngle;
|
|
|
|
GetCollisionInfo(coll, item);
|
|
|
|
|
|
|
|
if (TestLaraHitCeiling(coll))
|
|
|
|
{
|
|
|
|
SetLaraHitCeiling(item, coll);
|
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (TestLaraVault(item, coll))
|
|
|
|
return;
|
|
|
|
|
|
|
|
if (LaraDeflectEdge(item, coll))
|
|
|
|
{
|
|
|
|
item->pos.zRot = 0;
|
|
|
|
|
2021-11-03 21:16:06 +11:00
|
|
|
if (coll->HitTallObject || TestLaraWall(item, 256, 0, -640) != SPLAT_COLL::NONE)
|
2021-10-09 23:53:39 +11:00
|
|
|
{
|
|
|
|
item->goalAnimState = LS_SPLAT;
|
|
|
|
if (GetChange(item, &g_Level.Anims[item->animNumber]))
|
|
|
|
{
|
|
|
|
item->currentAnimState = LS_SPLAT;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
LaraCollideStop(item, coll);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (TestLaraFall(coll))
|
|
|
|
{
|
|
|
|
SetLaraFallState(item);
|
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2021-11-05 21:29:00 +11:00
|
|
|
if (TestLaraSlide(item, coll))
|
2021-10-09 23:53:39 +11:00
|
|
|
return;
|
|
|
|
|
|
|
|
if (TestLaraStep(coll))
|
|
|
|
{
|
|
|
|
DoLaraStep(item, coll);
|
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
// LEGACY step
|
|
|
|
//if (coll->Middle.Floor >= -STEPUP_HEIGHT && coll->Middle.Floor < -STEP_SIZE / 2)
|
|
|
|
//{
|
|
|
|
// item->goalAnimState = LS_STEP_UP;
|
|
|
|
// GetChange(item, &g_Level.Anims[item->animNumber]);
|
|
|
|
//}
|
|
|
|
//
|
|
|
|
//if (coll->Middle.Floor < 50)
|
|
|
|
//{
|
|
|
|
// if (coll->Middle.Floor != NO_HEIGHT)
|
|
|
|
// item->pos.yPos += coll->Middle.Floor;
|
|
|
|
//}
|
|
|
|
//else
|
|
|
|
//{
|
|
|
|
// item->goalAnimState = LS_STEP_DOWN; // for theoretical sprint stepdown anims, not in default anims
|
|
|
|
// if (GetChange(item, &g_Level.Anims[item->animNumber]))
|
|
|
|
// item->pos.yPos += coll->Middle.Floor; // move Lara to middle.Floor
|
|
|
|
// else
|
|
|
|
// item->pos.yPos += 50; // do the default aligment
|
|
|
|
//}
|
|
|
|
}
|
|
|
|
|
|
|
|
// LEGACY
|
|
|
|
void old_lara_col_dash(ITEM_INFO* item, COLL_INFO* coll)
|
2020-09-26 05:06:08 +10:00
|
|
|
{
|
|
|
|
/*state 73*/
|
|
|
|
/*state code: lara_as_dash*/
|
2020-12-19 23:34:52 -03:00
|
|
|
Lara.moveAngle = item->pos.yRot;
|
2020-08-14 17:54:25 -05:00
|
|
|
|
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 = 0;
|
2020-09-26 05:06:08 +10:00
|
|
|
|
2021-09-10 00:20:59 +03:00
|
|
|
coll->Setup.SlopesAreWalls = true;
|
2020-09-26 03:28:30 +10:00
|
|
|
|
2021-09-10 00:20:59 +03:00
|
|
|
coll->Setup.ForwardAngle = Lara.moveAngle;
|
2021-09-19 06:42:24 +03:00
|
|
|
GetCollisionInfo(coll, item);
|
2020-08-14 17:54:25 -05:00
|
|
|
|
2020-09-26 05:06:08 +10:00
|
|
|
if (!LaraHitCeiling(item, coll) && !TestLaraVault(item, coll))
|
2020-08-14 17:54:25 -05:00
|
|
|
{
|
2020-09-26 05:06:08 +10:00
|
|
|
if (LaraDeflectEdge(item, coll))
|
2020-08-14 17:54:25 -05:00
|
|
|
{
|
2020-09-26 05:06:08 +10:00
|
|
|
item->pos.zRot = 0;
|
|
|
|
|
2021-10-27 09:48:31 +03:00
|
|
|
if (coll->HitTallObject || TestLaraWall(item, 256, 0, -640) != SPLAT_COLL::NONE)
|
2020-08-14 17:54:25 -05:00
|
|
|
{
|
2020-09-26 05:06:08 +10:00
|
|
|
item->goalAnimState = LS_SPLAT;
|
|
|
|
if (GetChange(item, &g_Level.Anims[item->animNumber]))
|
|
|
|
{
|
|
|
|
item->currentAnimState = LS_SPLAT;
|
|
|
|
return;
|
|
|
|
}
|
2020-08-14 17:54:25 -05:00
|
|
|
}
|
2020-09-26 05:06:08 +10:00
|
|
|
|
|
|
|
LaraCollideStop(item, coll);
|
2020-08-14 17:54:25 -05:00
|
|
|
}
|
2020-09-26 05:06:08 +10:00
|
|
|
|
|
|
|
if (!LaraFallen(item, coll))
|
2020-08-14 17:54:25 -05:00
|
|
|
{
|
2021-09-10 00:18:47 +03:00
|
|
|
if (coll->Middle.Floor >= -STEPUP_HEIGHT && coll->Middle.Floor < -STEP_SIZE / 2)
|
2020-09-26 05:06:08 +10:00
|
|
|
{
|
|
|
|
item->goalAnimState = LS_STEP_UP;
|
|
|
|
GetChange(item, &g_Level.Anims[item->animNumber]);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!TestLaraSlide(item, coll))
|
|
|
|
{
|
2021-09-10 00:18:47 +03:00
|
|
|
if (coll->Middle.Floor < 50)
|
2020-09-26 05:06:08 +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 05:06:08 +10:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
item->goalAnimState = LS_STEP_DOWN; // for theoretical sprint stepdown anims, not in default anims
|
|
|
|
if (GetChange(item, &g_Level.Anims[item->animNumber]))
|
2021-09-10 00:18:47 +03:00
|
|
|
item->pos.yPos += coll->Middle.Floor; // move Lara to middle.Floor
|
2020-09-26 05:06:08 +10:00
|
|
|
else
|
|
|
|
item->pos.yPos += 50; // do the default aligment
|
|
|
|
}
|
|
|
|
}
|
2020-08-14 17:54:25 -05:00
|
|
|
}
|
|
|
|
}
|
2020-09-26 05:06:08 +10:00
|
|
|
}
|
2020-08-14 17:54:25 -05:00
|
|
|
|
2021-10-14 19:58:29 +11:00
|
|
|
// State: LS_SPRINT_ROLL (74)
|
|
|
|
// Collision: lara_col_dashdive()
|
2021-02-03 01:50:59 -03:00
|
|
|
void lara_as_dashdive(ITEM_INFO* item, COLL_INFO* coll)
|
2021-10-14 19:58:29 +11:00
|
|
|
{
|
|
|
|
if (TrInput & IN_LEFT)
|
|
|
|
{
|
|
|
|
Lara.turnRate -= LARA_TURN_RATE;
|
|
|
|
if (Lara.turnRate < -LARA_SLOW_TURN)
|
|
|
|
Lara.turnRate = -LARA_SLOW_TURN;
|
|
|
|
|
2021-10-30 13:42:55 +11:00
|
|
|
DoLaraLean(item, coll, -(LARA_LEAN_MAX * 3) / 5, 8);
|
2021-10-14 19:58:29 +11:00
|
|
|
}
|
|
|
|
else if (TrInput & IN_RIGHT)
|
|
|
|
{
|
|
|
|
Lara.turnRate += LARA_TURN_RATE;
|
|
|
|
if (Lara.turnRate > LARA_SLOW_TURN)
|
|
|
|
Lara.turnRate = LARA_SLOW_TURN;
|
|
|
|
|
2021-10-30 13:42:55 +11:00
|
|
|
DoLaraLean(item, coll, (LARA_LEAN_MAX * 3) / 5, 8);
|
2021-10-14 19:58:29 +11:00
|
|
|
}
|
|
|
|
|
|
|
|
// TODO: What?
|
|
|
|
if (item->goalAnimState != LS_DEATH &&
|
|
|
|
item->goalAnimState != LS_STOP &&
|
|
|
|
item->goalAnimState != LS_RUN_FORWARD &&
|
|
|
|
item->fallspeed > LARA_FREEFALL_SPEED)
|
2021-10-30 13:42:55 +11:00
|
|
|
{
|
2021-10-14 19:58:29 +11:00
|
|
|
item->goalAnimState = LS_FREEFALL;
|
2021-10-30 13:42:55 +11:00
|
|
|
}
|
2021-10-14 19:58:29 +11:00
|
|
|
}
|
|
|
|
|
|
|
|
// LEGACY
|
|
|
|
void old_lara_as_dashdive(ITEM_INFO* item, COLL_INFO* coll)
|
2020-09-26 05:06:08 +10:00
|
|
|
{
|
|
|
|
/*state 74*/
|
|
|
|
/*collision: lara_col_dashdive*/
|
|
|
|
if (item->goalAnimState != LS_DEATH &&
|
|
|
|
item->goalAnimState != LS_STOP &&
|
|
|
|
item->goalAnimState != LS_RUN_FORWARD &&
|
|
|
|
item->fallspeed > LARA_FREEFALL_SPEED)
|
|
|
|
item->goalAnimState = LS_FREEFALL;
|
|
|
|
}
|
2020-08-14 17:54:25 -05:00
|
|
|
|
2021-02-03 01:50:59 -03:00
|
|
|
void lara_col_dashdive(ITEM_INFO* item, COLL_INFO* coll)
|
2020-09-26 05:06:08 +10:00
|
|
|
{
|
|
|
|
/*state 74*/
|
|
|
|
/*state code: lara_as_dashdive*/
|
|
|
|
if (item->speed < 0)
|
2020-12-19 23:34:52 -03:00
|
|
|
Lara.moveAngle = item->pos.yRot + ANGLE(180);
|
2020-09-26 05:06:08 +10:00
|
|
|
else
|
2020-12-19 23:34:52 -03:00
|
|
|
Lara.moveAngle = item->pos.yRot;
|
2020-09-26 05:06:08 +10:00
|
|
|
|
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;
|
2020-09-26 05:06:08 +10:00
|
|
|
|
2021-09-10 00:20:59 +03:00
|
|
|
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;
|
2021-09-19 06:42:24 +03:00
|
|
|
GetCollisionInfo(coll, item);
|
2020-09-26 05:06:08 +10:00
|
|
|
LaraDeflectEdgeJump(item, coll);
|
2020-08-14 17:54:25 -05:00
|
|
|
|
2020-09-26 05:06:08 +10:00
|
|
|
if (!LaraFallen(item, coll))
|
|
|
|
{
|
2020-08-14 17:54:25 -05:00
|
|
|
if (item->speed < 0)
|
2020-12-19 23:34:52 -03:00
|
|
|
Lara.moveAngle = item->pos.yRot;
|
2020-08-14 17:54:25 -05:00
|
|
|
|
2021-09-10 00:18:47 +03:00
|
|
|
if (coll->Middle.Floor <= 0 && item->fallspeed > 0)
|
2020-08-14 17:54:25 -05:00
|
|
|
{
|
|
|
|
if (LaraLandedBad(item, coll))
|
|
|
|
{
|
|
|
|
item->goalAnimState = LS_DEATH;
|
|
|
|
}
|
|
|
|
else if (Lara.waterStatus == LW_WADE || !(TrInput & IN_FORWARD) || TrInput & IN_WALK)
|
|
|
|
{
|
|
|
|
item->goalAnimState = LS_STOP;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
item->goalAnimState = LS_RUN_FORWARD;
|
|
|
|
}
|
|
|
|
|
2020-09-26 05:06:08 +10:00
|
|
|
item->gravityStatus = false;
|
|
|
|
item->fallspeed = 0;
|
2021-09-10 00:18:47 +03:00
|
|
|
item->pos.yPos += coll->Middle.Floor;
|
2020-09-26 05:06:08 +10:00
|
|
|
item->speed = 0;
|
|
|
|
|
2020-08-14 17:54:25 -05:00
|
|
|
AnimateLara(item);
|
|
|
|
}
|
|
|
|
|
|
|
|
ShiftItem(item, coll);
|
|
|
|
|
2021-09-10 00:18:47 +03:00
|
|
|
if (coll->Middle.Floor != NO_HEIGHT)
|
|
|
|
item->pos.yPos += coll->Middle.Floor;
|
2020-08-14 17:54:25 -05:00
|
|
|
}
|
|
|
|
}
|