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
{
2021-11-14 21:01:50 +11:00
LaraInfo * & info = item - > data ;
info - > 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 ;
2021-11-14 22:51:43 +11:00
coll - > Setup . ForwardAngle = info - > 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
{
2021-11-14 22:51:43 +11:00
LaraInfo * & info = item - > data ;
info - > 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
2021-11-14 19:02:28 +11:00
if ( item - > frameNumber = = TestLastFrame ( item , item - > animNumber ) - 1 )
2020-08-14 17:54:25 -05:00
{
2021-11-14 22:51:43 +11:00
info - > 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
{
2021-11-14 22:51:43 +11:00
LaraInfo * & info = item - > data ;
info - > 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
{
2021-11-14 22:51:43 +11:00
LaraInfo * & info = item - > data ;
2021-11-19 22:48:47 +11:00
info - > jumpCount + + ;
2021-11-20 16:50:18 +11:00
if ( info - > jumpCount > LARA_JUMP_TIME / 2 + 2 ) // TODO: Remove the "+ 2" when anim blending becomes a feature; right now, it is a temporary measure to avoid stuttering. @Sezz 2021.11.19
2021-11-19 22:48:47 +11:00
info - > jumpCount = LARA_JUMP_TIME / 2 + 2 ;
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-19 22:48:47 +11:00
// TODO: Implement item alignment properly someday. @Sezz 2021.11.01
2021-11-14 22:51:43 +11:00
if ( info - > isMoving )
2021-11-01 15:07:42 +11:00
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 )
{
2021-11-14 22:51:43 +11:00
info - > turnRate - = LARA_TURN_RATE ;
if ( info - > turnRate < - LARA_SLOW_TURN )
info - > turnRate = - LARA_SLOW_TURN ;
2021-10-09 14:39:06 +11:00
2021-11-19 22:48:47 +11:00
DoLaraLean ( item , coll , - LARA_LEAN_MAX / 3 , LARA_LEAN_RATE / 4 ) ;
2021-10-09 14:39:06 +11:00
}
else if ( TrInput & IN_RIGHT )
{
2021-11-14 22:51:43 +11:00
info - > turnRate + = LARA_TURN_RATE ;
if ( info - > turnRate > LARA_SLOW_TURN )
info - > turnRate = LARA_SLOW_TURN ;
2021-10-09 14:39:06 +11:00
2021-11-19 22:48:47 +11:00
DoLaraLean ( item , coll , LARA_LEAN_MAX / 3 , LARA_LEAN_RATE / 4 ) ;
2021-10-09 14:39:06 +11:00
}
if ( TrInput & IN_FORWARD )
{
2021-11-14 22:51:43 +11:00
if ( info - > waterStatus = = LW_WADE )
2021-10-09 14:39:06 +11:00
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 ;
}
// 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
{
2021-11-14 22:51:43 +11:00
LaraInfo * & info = item - > data ;
info - > moveAngle = item - > pos . yRot ;
2021-10-09 14:39:06 +11:00
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-11-14 22:51:43 +11:00
coll - > Setup . ForwardAngle = info - > moveAngle ;
2021-10-09 14:39:06 +11:00
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 ) ;
}
2021-11-20 12:25:51 +11:00
if ( TestLaraFall ( item , coll ) )
2021-10-09 14:39:06 +11:00
{
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-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
{
2021-11-14 22:51:43 +11:00
LaraInfo * & info = item - > data ;
2021-11-19 22:48:47 +11:00
info - > jumpCount + + ;
2021-09-26 17:51:28 +10:00
if ( item - > hitPoints < = 0 )
{
item - > goalAnimState = LS_DEATH ;
return ;
}
if ( TrInput & IN_LEFT )
{
2021-11-14 22:51:43 +11:00
info - > turnRate - = LARA_TURN_RATE ;
if ( info - > turnRate < - LARA_FAST_TURN )
info - > turnRate = - LARA_FAST_TURN ;
2021-09-26 17:51:28 +10:00
2021-11-17 15:59:51 +11:00
DoLaraLean ( item , coll , - LARA_LEAN_MAX , LARA_LEAN_RATE ) ;
2021-09-26 17:51:28 +10:00
}
else if ( TrInput & IN_RIGHT )
{
2021-11-14 22:51:43 +11:00
info - > turnRate + = LARA_TURN_RATE ;
if ( info - > turnRate > LARA_FAST_TURN )
info - > turnRate = LARA_FAST_TURN ;
2021-09-26 17:51:28 +10:00
2021-11-17 15:59:51 +11:00
DoLaraLean ( item , coll , LARA_LEAN_MAX , LARA_LEAN_RATE ) ;
2021-09-26 17:51:28 +10:00
}
2021-11-19 22:48:47 +11:00
// TODO: Do something about wade checks someday. @Sezz 2021.10.17
2021-10-17 20:07:30 +11:00
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-11-19 22:48:47 +11:00
static bool commitJump = false ;
2021-09-26 17:51:28 +10:00
2021-11-19 22:48:47 +11:00
if ( ( TrInput & IN_JUMP | | commitJump ) & &
2021-10-17 20:07:30 +11:00
! item - > gravityStatus & &
2021-11-14 22:51:43 +11:00
info - > waterStatus ! = LW_WADE )
2021-09-26 17:51:28 +10:00
{
2021-11-19 22:48:47 +11:00
commitJump = TrInput & IN_FORWARD ;
2021-09-26 17:51:28 +10:00
2021-11-19 22:48:47 +11:00
if ( info - > jumpCount > = LARA_JUMP_TIME )
2021-09-26 17:51:28 +10:00
{
2021-11-19 22:48:47 +11:00
commitJump = 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-11-14 22:51:43 +11:00
info - > sprintTimer & &
info - > 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 & &
2021-11-14 22:51:43 +11:00
info - > 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-11-14 22:51:43 +11:00
( info - > gunStatus = = LG_NO_ARMS | | ! IsStandingWeapon ( info - > gunType ) ) & &
info - > waterStatus ! = LW_WADE )
2021-09-26 17:51:28 +10:00
{
item - > goalAnimState = LS_CROUCH_IDLE ;
return ;
}
if ( TrInput & IN_FORWARD )
{
2021-11-14 22:51:43 +11:00
if ( info - > waterStatus = = LW_WADE )
2021-09-26 17:51:28 +10:00
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 ;
}
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
{
2021-11-14 22:51:43 +11:00
LaraInfo * & info = item - > data ;
info - > moveAngle = item - > pos . yRot ;
2021-10-09 16:56:07 +11:00
coll - > Setup . BadHeightDown = NO_BAD_POS ;
coll - > Setup . BadHeightUp = - STEPUP_HEIGHT ;
coll - > Setup . BadCeilingHeight = 0 ;
coll - > Setup . SlopesAreWalls = true ;
2021-11-14 22:51:43 +11:00
coll - > Setup . ForwardAngle = info - > moveAngle ;
2021-10-09 16:56:07 +11:00
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 ) ;
}
2021-11-20 12:25:51 +11:00
if ( TestLaraFall ( item , coll ) )
2021-10-09 16:56:07 +11:00
{
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
}
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
{
2021-11-14 21:01:50 +11:00
LaraInfo * & info = item - > data ;
2021-11-14 22:51:43 +11:00
info - > look = ( ( TestLaraSwamp ( item ) & & info - > waterStatus = = LW_WADE ) | | item - > animNumber = = LA_SWANDIVE_ROLL ) ? false : true ;
2021-11-14 17:31:00 +11:00
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 ;
2021-11-14 22:51:43 +11:00
if ( TrInput & IN_LOOK & & info - > look )
2021-09-28 01:22:47 +10:00
LookUpDown ( ) ;
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
{
2021-11-14 22:51:43 +11:00
info - > turnRate - = LARA_TURN_RATE ;
if ( info - > turnRate < - LARA_SLOW_TURN )
info - > 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
{
2021-11-14 22:51:43 +11:00
info - > turnRate + = LARA_TURN_RATE ;
if ( info - > turnRate > LARA_SLOW_TURN )
info - > 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
2021-11-14 22:51:43 +11:00
if ( info - > waterStatus = = LW_WADE )
2021-09-28 01:22:47 +10:00
{
2021-11-07 21:55:38 +11:00
if ( TestLaraSwamp ( item ) )
LaraSwampStop ( item , coll ) ;
else [[likely]]
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-11-14 22:51:43 +11:00
( info - > gunStatus = = LG_NO_ARMS | | ! IsStandingWeapon ( info - > 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-11-12 15:35:16 +11:00
if ( TrInput & IN_WALK )
2021-09-28 01:22:47 +10:00
{
2021-11-12 15:35:16 +11:00
if ( TestLaraWalkBack ( item , coll ) )
{
item - > goalAnimState = LS_WALK_BACK ;
2021-10-19 21:28:36 +11:00
2021-11-12 15:35:16 +11:00
return ;
}
2021-09-28 01:22:47 +10:00
}
2021-11-12 15:35:16 +11:00
else if ( 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-14 23:08:58 +11:00
info - > turnRate < = - LARA_SLOW_TURN | |
2021-11-14 22:51:43 +11:00
( info - > gunStatus = = LG_READY & & info - > gunType ! = WEAPON_TORCH ) | |
( info - > gunStatus = = LG_DRAW_GUNS & & info - > 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-14 23:08:58 +11:00
info - > turnRate > = LARA_SLOW_TURN | |
2021-11-14 22:51:43 +11:00
( info - > gunStatus = = LG_READY & & info - > gunType ! = WEAPON_TORCH ) | |
( info - > gunStatus = = LG_DRAW_GUNS & & info - > 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
2021-11-14 22:51:43 +11:00
info - > NewAnims . Pose = false ;
2021-11-04 21:07:47 +11:00
2021-11-19 22:48:47 +11:00
if ( info - > poseCount > = LARA_POSE_TIME & &
2021-11-04 21:07:47 +11:00
TestLaraPose ( item , coll ) & &
2021-11-14 22:51:43 +11:00
info - > NewAnims . Pose )
2021-11-04 21:07:47 +11:00
{
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-11-07 21:55:38 +11:00
if ( TrInput & IN_JUMP )
2021-09-28 01:22:47 +10:00
{
item - > goalAnimState = LS_JUMP_PREPARE ;
return ;
}
2021-11-07 21:55:38 +11:00
if ( TrInput & IN_FORWARD & &
coll - > CollisionType ! = CT_FRONT & &
coll - > CollisionType ! = CT_TOP_FRONT )
{
item - > goalAnimState = LS_WADE_FORWARD ;
return ;
}
if ( TrInput & IN_BACK & &
TestLaraWalkBack ( item , coll ) )
{
item - > goalAnimState = LS_WALK_BACK ;
return ;
}
if ( TrInput & IN_LEFT )
{
item - > goalAnimState = LS_TURN_LEFT_SLOW ;
return ;
}
else if ( TrInput & IN_RIGHT )
{
item - > goalAnimState = LS_TURN_RIGHT_SLOW ;
return ;
}
if ( TrInput & IN_LSTEP & &
TestLaraStepLeft ( item , coll ) )
{
item - > goalAnimState = LS_STEP_LEFT ;
return ;
}
else if ( TrInput & IN_RSTEP & &
TestLaraStepRight ( item , coll ) )
{
item - > goalAnimState = LS_STEP_RIGHT ;
return ;
}
item - > goalAnimState = LS_STOP ;
}
// Pseudo-state for idling in swamps.
void LaraSwampStop ( ITEM_INFO * item , COLL_INFO * coll )
{
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
{
2021-11-07 21:55:38 +11:00
item - > goalAnimState = LS_WADE_FORWARD ;
2021-11-08 00:54:26 +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 & &
2021-11-07 21:55:38 +11:00
TestLaraWalkBackSwamp ( 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 & &
2021-11-07 21:55:38 +11:00
TestLaraStepLeftSwamp ( 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 & &
2021-11-07 21:55:38 +11:00
TestLaraStepRightSwamp ( 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 ;
}
// 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
{
2021-11-14 22:51:43 +11:00
LaraInfo * & info = item - > data ;
info - > moveAngle = item - > pos . yRot ;
2021-11-07 21:55:38 +11:00
coll - > Setup . BadHeightDown = TestLaraSwamp ( item ) ? NO_BAD_POS : 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 ;
2021-11-14 22:51:43 +11:00
coll - > Setup . ForwardAngle = info - > moveAngle ;
2021-09-28 01:22:47 +10:00
GetCollisionInfo ( coll , item ) ;
if ( TestLaraHitCeiling ( coll ) )
{
SetLaraHitCeiling ( item , coll ) ;
return ;
}
2021-11-20 12:25:51 +11:00
if ( TestLaraFall ( item , coll ) )
2021-09-28 01:22:47 +10:00
{
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
2021-11-07 13:26:45 +11:00
LaraSnapToHeight ( item , coll ) ;
2021-09-28 01:22:47 +10: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
{
2021-11-14 22:51:43 +11:00
LaraInfo * & info = item - > data ;
2021-10-09 20:19:34 +11:00
if ( TrInput & IN_LEFT )
{
2021-11-14 22:51:43 +11:00
info - > turnRate - = LARA_TURN_RATE ;
if ( info - > turnRate < - LARA_MED_TURN )
info - > turnRate = - LARA_MED_TURN ;
2021-10-09 20:19:34 +11:00
2021-11-17 15:59:51 +11:00
DoLaraLean ( item , coll , - LARA_LEAN_MAX / 2 , LARA_LEAN_RATE / 2 ) ;
2021-10-09 20:19:34 +11:00
}
else if ( TrInput & IN_RIGHT )
{
2021-11-14 22:51:43 +11:00
info - > turnRate + = LARA_TURN_RATE ;
if ( info - > turnRate > LARA_MED_TURN )
info - > turnRate = LARA_MED_TURN ;
2021-10-09 20:19:34 +11:00
2021-11-17 15:59:51 +11:00
DoLaraLean ( item , coll , LARA_LEAN_MAX / 2 , LARA_LEAN_RATE / 2 ) ;
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 ;
}
// 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-11-14 22:51:43 +11:00
LaraInfo * & info = item - > data ;
info - > 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 ;
2021-11-14 22:51:43 +11:00
coll - > Setup . ForwardAngle = info - > moveAngle ;
2021-10-09 20:19:34 +11:00
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-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
{
2021-11-14 22:51:43 +11:00
LaraInfo * & info = item - > data ;
info - > look = ( TestLaraSwamp ( item ) & & info - > waterStatus = = LW_WADE ) ? false : true ;
2021-11-14 17:31:00 +11:00
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-11-12 17:38:36 +11:00
// TODO: This can't be anywhere below the run dispatch because a test to prevent forward movement without embedding currently can't exist. @Sezz 2021.11.12
2021-11-14 22:51:43 +11:00
info - > turnRate + = LARA_TURN_RATE ;
2021-10-06 14:03:12 +11:00
2021-11-14 22:51:43 +11:00
if ( info - > waterStatus = = LW_WADE )
2021-10-05 22:09:07 +11:00
{
2021-11-07 23:58:51 +11:00
if ( TestLaraSwamp ( item ) )
LaraSwampTurnRight ( item , coll ) ;
else [[likely]]
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-11-13 18:10:22 +11:00
if ( ( TrInput & IN_DUCK /* || TestLaraKeepCrouched(coll)*/ ) & &
2021-11-14 22:51:43 +11:00
( info - > gunStatus = = LG_NO_ARMS | | ! IsStandingWeapon ( info - > 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-11-12 15:35:16 +11:00
if ( TrInput & IN_WALK )
2021-10-24 20:43:02 +11:00
{
2021-11-12 15:35:16 +11:00
if ( TestLaraWalkBack ( item , coll ) )
{
item - > goalAnimState = LS_WALK_BACK ;
2021-10-24 20:43:02 +11:00
2021-11-12 15:35:16 +11:00
return ;
}
2021-10-24 20:43:02 +11:00
}
2021-11-12 15:35:16 +11:00
else if ( TestLaraHopBack ( item , coll ) ) [[likely]]
2021-10-24 20:43:02 +11:00
{
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-11-14 22:51:43 +11:00
if ( info - > turnRate < 0 )
info - > turnRate = 0 ;
2021-11-16 13:47:05 +11:00
else if ( info - > turnRate > ( LARA_MED_TURN + ANGLE ( 1.0f ) ) )
info - > turnRate = LARA_MED_TURN + ANGLE ( 1.0f ) ;
2021-11-12 17:38:36 +11:00
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
{
2021-11-14 22:51:43 +11:00
if ( info - > turnRate > LARA_SLOW_TURN )
info - > turnRate = LARA_SLOW_TURN ;
2021-10-05 22:09:07 +11:00
item - > goalAnimState = LS_TURN_RIGHT_SLOW ;
}
2021-11-15 00:21:52 +11:00
else if ( info - > turnRate > LARA_SLOW_TURN )
2021-10-08 20:08:55 +11:00
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 )
{
2021-11-14 22:51:43 +11:00
LaraInfo * & info = item - > data ;
2021-11-07 23:58:51 +11:00
if ( TrInput & IN_JUMP )
2021-10-13 19:50:46 +11:00
{
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 )
{
2021-11-16 14:01:26 +11:00
if ( info - > turnRate > ( LARA_SLOW_TURN + ANGLE ( 1.5f ) ) )
info - > turnRate = LARA_SLOW_TURN + ANGLE ( 1.5f ) ;
2021-10-13 19:50:46 +11:00
item - > goalAnimState = LS_TURN_RIGHT_SLOW ;
return ;
}
item - > goalAnimState = LS_STOP ;
}
2021-11-07 23:58:51 +11:00
// Pseudo-state for turning right in swamps.
void LaraSwampTurnRight ( ITEM_INFO * item , COLL_INFO * coll )
{
2021-11-14 22:51:43 +11:00
LaraInfo * & info = item - > data ;
2021-11-07 23:58:51 +11:00
if ( TrInput & IN_FORWARD & &
coll - > CollisionType ! = CT_FRONT & &
coll - > CollisionType ! = CT_TOP_FRONT )
{
item - > goalAnimState = LS_WADE_FORWARD ;
return ;
}
else if ( TrInput & IN_BACK & &
TestLaraWalkBackSwamp ( item , coll ) )
{
item - > goalAnimState = LS_WALK_BACK ;
return ;
}
if ( TrInput & IN_LSTEP & &
TestLaraStepLeftSwamp ( item , coll ) )
{
item - > goalAnimState = LS_STEP_LEFT ;
return ;
}
else if ( TrInput & IN_RSTEP & &
TestLaraStepRightSwamp ( item , coll ) )
{
item - > goalAnimState = LS_STEP_RIGHT ;
return ;
}
if ( TrInput & IN_RIGHT )
{
2021-11-15 00:21:52 +11:00
if ( info - > turnRate > LARA_SLOW_TURN / 2 )
info - > turnRate = LARA_SLOW_TURN / 2 ;
2021-11-07 23:58:51 +11:00
2021-11-13 22:23:38 +11:00
item - > goalAnimState = LS_TURN_RIGHT_SLOW ;
2020-08-14 17:54:25 -05:00
return ;
}
2021-11-13 22:23:38 +11:00
item - > goalAnimState = LS_STOP ;
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 ) ;
}
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
{
2021-11-14 22:51:43 +11:00
LaraInfo * & info = item - > data ;
info - > look = ( TestLaraSwamp ( item ) & & info - > waterStatus = = LW_WADE ) ? false : true ;
2021-11-14 17:31:00 +11:00
2021-10-08 15:47:54 +11:00
if ( item - > hitPoints < = 0 )
{
item - > goalAnimState = LS_DEATH ;
return ;
}
2021-11-14 22:51:43 +11:00
info - > turnRate - = LARA_TURN_RATE ;
2021-10-08 15:47:54 +11:00
2021-11-14 22:51:43 +11:00
if ( info - > waterStatus = = LW_WADE )
2021-10-08 15:47:54 +11:00
{
2021-11-07 23:58:51 +11:00
if ( TestLaraSwamp ( item ) )
LaraSwampTurnLeft ( item , coll ) ;
else [[likely]]
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-11-14 22:51:43 +11:00
( info - > gunStatus = = LG_NO_ARMS | | ! IsStandingWeapon ( info - > 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-11-12 15:35:16 +11:00
if ( TrInput & IN_WALK )
2021-10-24 20:43:02 +11:00
{
2021-11-12 15:35:16 +11:00
if ( TestLaraWalkBack ( item , coll ) )
{
item - > goalAnimState = LS_WALK_BACK ;
2021-10-24 20:43:02 +11:00
2021-11-12 15:35:16 +11:00
return ;
}
2021-10-24 20:43:02 +11:00
}
2021-11-12 15:35:16 +11:00
else if ( TestLaraHopBack ( item , coll ) ) [[likely]]
2021-10-24 20:43:02 +11:00
{
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-11-14 22:51:43 +11:00
if ( info - > turnRate > 0 )
info - > turnRate = 0 ;
2021-11-16 13:47:05 +11:00
else if ( info - > turnRate < - ( LARA_MED_TURN + ANGLE ( 1.0f ) ) )
info - > turnRate = - ( LARA_MED_TURN + ANGLE ( 1.0f ) ) ;
2021-11-12 17:38:36 +11:00
2021-10-13 19:50:46 +11:00
if ( TrInput & IN_WALK )
2021-10-08 15:47:54 +11:00
{
2021-11-14 22:51:43 +11:00
if ( info - > turnRate < - LARA_SLOW_TURN )
info - > turnRate = - LARA_SLOW_TURN ;
2021-10-08 15:47:54 +11:00
item - > goalAnimState = LS_TURN_LEFT_SLOW ;
}
2021-11-14 22:51:43 +11:00
else if ( info - > turnRate < - LARA_MED_TURN )
2021-10-08 20:08:55 +11:00
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 )
{
2021-11-14 22:51:43 +11:00
LaraInfo * & info = item - > data ;
2021-11-07 23:58:51 +11:00
if ( TrInput & IN_JUMP )
2021-10-13 19:50:46 +11:00
{
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 )
{
2021-11-16 14:01:26 +11:00
if ( info - > turnRate < - ( LARA_SLOW_TURN + ANGLE ( 1.5f ) ) )
info - > turnRate = - ( LARA_SLOW_TURN + ANGLE ( 1.5f ) ) ;
2021-10-13 19:50:46 +11:00
item - > goalAnimState = LS_TURN_LEFT_SLOW ;
return ;
}
item - > goalAnimState = LS_STOP ;
}
2021-11-07 23:58:51 +11:00
// Pseudo-state for turning left in swamps.
void LaraSwampTurnLeft ( ITEM_INFO * item , COLL_INFO * coll )
{
2021-11-14 22:51:43 +11:00
LaraInfo * & info = item - > data ;
2021-11-07 23:58:51 +11:00
if ( TrInput & IN_FORWARD & &
coll - > CollisionType ! = CT_FRONT & &
coll - > CollisionType ! = CT_TOP_FRONT )
{
item - > goalAnimState = LS_WADE_FORWARD ;
return ;
}
else if ( TrInput & IN_BACK & &
TestLaraWalkBack ( item , coll ) )
{
item - > goalAnimState = LS_WALK_BACK ;
return ;
}
if ( TrInput & IN_LSTEP & &
TestLaraStepLeft ( item , coll ) )
{
item - > goalAnimState = LS_STEP_LEFT ;
return ;
}
else if ( TrInput & IN_RSTEP & &
TestLaraStepRight ( item , coll ) )
{
item - > goalAnimState = LS_STEP_RIGHT ;
return ;
}
if ( TrInput & IN_LEFT )
{
2021-11-15 00:21:52 +11:00
if ( info - > turnRate < - LARA_SLOW_TURN / 2 )
info - > turnRate = - LARA_SLOW_TURN / 2 ;
2021-11-07 23:58:51 +11:00
item - > goalAnimState = LS_TURN_LEFT_SLOW ;
return ;
}
item - > goalAnimState = LS_STOP ;
}
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
{
2021-11-14 22:51:43 +11:00
LaraInfo * & info = item - > data ;
2020-09-26 05:06:08 +10:00
/*state 8*/
/*collision: lara_col_death*/
2021-11-14 22:51:43 +11:00
info - > look = false ;
2021-09-10 00:20:59 +03:00
coll - > Setup . EnableObjectPush = false ;
coll - > Setup . EnableSpaz = false ;
2021-11-14 22:51:43 +11:00
2020-08-14 17:54:25 -05:00
if ( BinocularRange )
{
BinocularRange = 0 ;
2021-11-08 19:35:17 +03:00
LaserSight = false ;
2020-09-26 05:06:08 +10:00
AlterFOV ( ANGLE ( 80.0f ) ) ;
2020-08-14 17:54:25 -05:00
LaraItem - > meshBits = - 1 ;
2021-11-14 22:51:43 +11:00
info - > busy = false ;
2020-08-14 17:54:25 -05:00
}
}
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
{
2021-11-14 22:51:43 +11:00
LaraInfo * & info = item - > data ;
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
2021-11-14 22:51:43 +11:00
info - > 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-11-14 22:51:43 +11:00
coll - > Setup . ForwardAngle = info - > 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 ;
2021-11-14 22:51:43 +11:00
info - > air = - 1 ;
2020-08-14 17:54:25 -05:00
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_splat ( ITEM_INFO * item , COLL_INFO * coll )
2020-08-14 17:54:25 -05:00
{
2021-11-14 22:51:43 +11:00
LaraInfo * & info = item - > data ;
info - > look = false ;
2020-08-14 17:54:25 -05:00
}
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
{
2021-11-14 22:51:43 +11:00
LaraInfo * & info = item - > data ;
info - > 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-11-14 22:51:43 +11:00
coll - > Setup . ForwardAngle = info - > 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-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
{
2021-11-14 22:51:43 +11:00
LaraInfo * & info = item - > data ;
info - > look = ( TestLaraSwamp ( item ) & & info - > waterStatus = = LW_WADE ) ? false : true ;
2021-11-14 17:31:00 +11:00
2021-10-09 23:00:26 +11:00
if ( item - > hitPoints < = 0 )
{
2021-11-20 17:52:18 +11:00
item - > goalAnimState = LS_DEATH ;
2021-10-09 23:00:26 +11:00
return ;
}
2021-11-14 22:51:43 +11:00
if ( info - > isMoving )
2021-11-01 15:07:42 +11:00
return ;
2021-10-09 23:00:26 +11:00
2021-11-17 16:49:21 +11:00
if ( TestLaraSwamp ( item ) & &
info - > waterStatus = = LW_WADE )
{
LaraSwampWalkBack ( item , coll ) ;
return ;
}
2021-10-09 23:00:26 +11:00
if ( TrInput & IN_LEFT )
{
2021-11-14 22:51:43 +11:00
info - > turnRate - = LARA_TURN_RATE ;
if ( info - > turnRate < - LARA_SLOW_TURN )
info - > turnRate = - LARA_SLOW_TURN ;
2021-10-09 23:00:26 +11:00
2021-11-17 15:59:51 +11:00
DoLaraLean ( item , coll , - LARA_LEAN_MAX / 3 , LARA_LEAN_RATE / 2 ) ;
2021-10-22 01:50:43 +11:00
2021-10-09 23:00:26 +11:00
}
else if ( TrInput & IN_RIGHT )
{
2021-11-14 22:51:43 +11:00
info - > turnRate + = LARA_TURN_RATE ;
if ( info - > turnRate > LARA_SLOW_TURN )
info - > turnRate = LARA_SLOW_TURN ;
2021-10-09 23:00:26 +11:00
2021-11-17 15:59:51 +11:00
DoLaraLean ( item , coll , LARA_LEAN_MAX / 3 , LARA_LEAN_RATE / 2 ) ;
2021-10-09 23:00:26 +11:00
}
2021-10-14 01:17:21 +11:00
if ( TrInput & IN_BACK & &
2021-11-14 22:51:43 +11:00
( TrInput & IN_WALK | | info - > 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 ;
}
2021-11-17 16:49:21 +11:00
// Pseudo-state for walking back in swamps.
void LaraSwampWalkBack ( ITEM_INFO * item , COLL_INFO * coll )
{
LaraInfo * & info = item - > data ;
if ( TrInput & IN_LEFT )
{
info - > turnRate - = LARA_TURN_RATE ;
if ( info - > turnRate < - LARA_SLOW_TURN / 3 )
info - > turnRate = - LARA_SLOW_TURN / 3 ;
DoLaraLean ( item , coll , - LARA_LEAN_MAX / 3 , LARA_LEAN_RATE / 3 ) ;
}
else if ( TrInput & IN_RIGHT )
{
info - > turnRate + = LARA_TURN_RATE ;
if ( info - > turnRate > LARA_SLOW_TURN / 3 )
info - > turnRate = LARA_SLOW_TURN / 3 ;
DoLaraLean ( item , coll , LARA_LEAN_MAX / 3 , LARA_LEAN_RATE / 3 ) ;
}
if ( TrInput & IN_BACK )
{
item - > goalAnimState = LS_WALK_BACK ;
return ;
}
item - > goalAnimState = LS_STOP ;
}
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
{
2021-11-14 22:51:43 +11:00
LaraInfo * & info = item - > data ;
info - > moveAngle = item - > pos . yRot + ANGLE ( 180 ) ;
2021-10-09 23:00:26 +11:00
item - > gravityStatus = false ;
item - > fallspeed = 0 ;
2021-11-14 22:51:43 +11:00
coll - > Setup . BadHeightDown = info - > waterStatus = = LW_WADE ? NO_BAD_POS : STEPUP_HEIGHT ;
2021-10-09 23:00:26 +11:00
coll - > Setup . BadHeightUp = - STEPUP_HEIGHT ;
coll - > Setup . BadCeilingHeight = 0 ;
coll - > Setup . SlopesArePits = true ;
coll - > Setup . SlopesAreWalls = true ;
2021-11-14 22:51:43 +11:00
coll - > Setup . ForwardAngle = info - > moveAngle ;
2021-10-09 23:00:26 +11:00
GetCollisionInfo ( coll , item ) ;
if ( TestLaraHitCeiling ( coll ) )
{
SetLaraHitCeiling ( item , coll ) ;
return ;
}
if ( LaraDeflectEdge ( item , coll ) )
LaraCollideStop ( item , coll ) ;
2021-11-20 12:25:51 +11:00
if ( TestLaraFall ( item , coll ) )
2021-10-09 23:00:26 +11:00
{
SetLaraFallState ( item ) ;
return ;
}
2021-11-05 21:29:00 +11:00
if ( TestLaraSlide ( item , coll ) )
2021-10-09 23:00:26 +11:00
return ;
2021-11-07 21:55:38 +11:00
if ( TestLaraStep ( coll ) )
2021-10-09 23:00:26 +11:00
{
DoLaraStep ( item , coll ) ;
return ;
}
}
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
{
2021-11-14 22:51:43 +11:00
LaraInfo * & info = item - > data ;
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 & &
2021-11-14 22:51:43 +11:00
info - > waterStatus ! = LW_WADE )
2021-10-08 15:47:54 +11:00
{
item - > goalAnimState = LS_ROLL_FORWARD ;
return ;
}
2021-11-13 18:10:22 +11:00
if ( ( TrInput & IN_DUCK /* || TestLaraKeepCrouched(coll)*/ ) & &
2021-11-14 22:51:43 +11:00
( info - > gunStatus = = LG_NO_ARMS | | ! IsStandingWeapon ( info - > gunType ) ) & &
info - > waterStatus ! = LW_WADE )
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-11-14 22:51:43 +11:00
if ( info - > waterStatus = = LW_WADE ) // Should not be possible, but here for security.
2021-10-28 23:22:28 +11:00
{
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-11-12 15:35:16 +11:00
if ( TrInput & IN_WALK )
2021-10-24 20:43:02 +11:00
{
2021-11-12 15:35:16 +11:00
if ( TestLaraWalkBack ( item , coll ) )
{
item - > goalAnimState = LS_WALK_BACK ;
2021-10-24 20:43:02 +11:00
2021-11-12 15:35:16 +11:00
return ;
}
2021-10-24 20:43:02 +11:00
}
2021-11-12 15:35:16 +11:00
else if ( TestLaraHopBack ( item , coll ) ) [[likely]]
2021-10-24 20:43:02 +11:00
{
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 )
{
2021-11-14 22:51:43 +11:00
info - > turnRate + = LARA_TURN_RATE ;
if ( info - > turnRate < LARA_MED_TURN )
info - > turnRate = LARA_MED_TURN ;
else if ( info - > turnRate > LARA_FAST_TURN )
info - > 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 ) ;
}
// State: LS_TURN_LEFT_FAST (152)
// Collision: lara_col_turn_left_fast()
void lara_as_turn_left_fast ( ITEM_INFO * item , COLL_INFO * coll )
{
2021-11-14 22:51:43 +11:00
LaraInfo * & info = item - > data ;
2021-10-08 20:08:55 +11:00
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 & &
2021-11-14 22:51:43 +11:00
info - > waterStatus ! = LW_WADE )
2021-10-08 20:08:55 +11:00
{
item - > goalAnimState = LS_ROLL_FORWARD ;
return ;
}
2021-11-13 18:10:22 +11:00
if ( ( TrInput & IN_DUCK /* || TestLaraKeepCrouched(coll)*/ ) & &
2021-11-14 22:51:43 +11:00
( info - > gunStatus = = LG_NO_ARMS | | ! IsStandingWeapon ( info - > gunType ) ) & &
info - > waterStatus ! = LW_WADE )
2021-10-08 20:08:55 +11:00
{
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-11-14 22:51:43 +11:00
if ( info - > waterStatus = = LW_WADE ) // Should not be possible, but here for security.
2021-10-28 23:22:28 +11:00
{
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
{
2021-11-12 15:35:16 +11:00
if ( TrInput & IN_WALK )
2021-10-24 20:43:02 +11:00
{
2021-11-12 15:35:16 +11:00
if ( TestLaraWalkBack ( item , coll ) )
{
item - > goalAnimState = LS_WALK_BACK ;
2021-10-24 20:43:02 +11:00
2021-11-12 15:35:16 +11:00
return ;
}
2021-10-24 20:43:02 +11:00
}
2021-11-12 15:35:16 +11:00
else if ( TestLaraHopBack ( item , coll ) ) [[likely]]
2021-10-24 20:43:02 +11:00
{
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 )
{
2021-11-14 22:51:43 +11:00
info - > turnRate - = LARA_TURN_RATE ;
if ( info - > turnRate > - LARA_MED_TURN )
info - > turnRate = - LARA_MED_TURN ;
else if ( info - > turnRate < - LARA_FAST_TURN )
info - > turnRate = - LARA_FAST_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
{
2021-11-14 22:51:43 +11:00
LaraInfo * & info = item - > data ;
info - > look = false ;
2021-10-14 17:19:38 +11:00
if ( item - > hitPoints < = 0 )
{
item - > goalAnimState = LS_STOP ;
return ;
}
2021-11-14 22:51:43 +11:00
if ( info - > isMoving )
2021-11-01 15:07:42 +11:00
return ;
2021-10-14 17:19:38 +11:00
if ( TrInput & IN_LEFT )
{
2021-11-14 22:51:43 +11:00
info - > turnRate - = LARA_TURN_RATE ;
if ( info - > turnRate < - LARA_SLOW_TURN )
info - > turnRate = - LARA_SLOW_TURN ;
2021-10-14 17:19:38 +11:00
}
else if ( TrInput & IN_RIGHT )
{
2021-11-14 22:51:43 +11:00
info - > turnRate + = LARA_TURN_RATE ;
if ( info - > turnRate > LARA_SLOW_TURN )
info - > turnRate = LARA_SLOW_TURN ;
2021-10-14 17:19:38 +11:00
}
if ( TrInput & IN_RSTEP )
{
item - > goalAnimState = LS_STEP_RIGHT ;
return ;
}
item - > goalAnimState = LS_STOP ;
}
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
{
2021-11-14 22:51:43 +11:00
LaraInfo * & info = item - > data ;
info - > moveAngle = item - > pos . yRot + ANGLE ( 90.0f ) ;
2021-10-10 14:03:38 +11:00
item - > gravityStatus = false ;
item - > fallspeed = 0 ;
2021-11-14 22:51:43 +11:00
coll - > Setup . BadHeightDown = ( info - > waterStatus = = LW_WADE ) ? NO_BAD_POS : STEP_SIZE / 2 ;
coll - > Setup . BadHeightUp = - STEP_SIZE / 2 ;
coll - > Setup . BadCeilingHeight = 0 ;
2021-10-10 14:03:38 +11:00
coll - > Setup . SlopesArePits = true ;
coll - > Setup . SlopesAreWalls = true ;
2021-11-14 22:51:43 +11:00
coll - > Setup . ForwardAngle = info - > moveAngle ;
2021-10-10 14:03:38 +11:00
GetCollisionInfo ( coll , item ) ;
if ( TestLaraHitCeiling ( coll ) )
{
SetLaraHitCeiling ( item , coll ) ;
return ;
}
if ( LaraDeflectEdge ( item , coll ) )
LaraCollideStop ( item , coll ) ;
2021-11-20 12:25:51 +11:00
if ( TestLaraFall ( item , coll ) )
2021-10-10 14:03:38 +11:00
{
SetLaraFallState ( item ) ;
return ;
}
2021-11-05 21:29:00 +11:00
if ( TestLaraSlide ( item , coll ) )
2021-10-10 14:03:38 +11:00
return ;
2021-11-07 23:58:51 +11:00
if ( TestLaraStep ( coll ) | | TestLaraSwamp ( item ) )
2021-10-10 14:03:38 +11:00
{
DoLaraStep ( item , coll ) ;
return ;
}
}
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
{
2021-11-14 22:51:43 +11:00
LaraInfo * & info = item - > data ;
info - > look = false ;
2021-10-14 17:19:38 +11:00
if ( item - > hitPoints < = 0 )
{
item - > goalAnimState = LS_STOP ;
return ;
}
2021-11-14 22:51:43 +11:00
if ( info - > isMoving )
2021-11-01 15:07:42 +11:00
return ;
2021-10-14 17:19:38 +11:00
if ( TrInput & IN_LEFT )
{
2021-11-14 22:51:43 +11:00
info - > turnRate - = LARA_TURN_RATE ;
if ( info - > turnRate < - LARA_SLOW_TURN )
info - > turnRate = - LARA_SLOW_TURN ;
2021-10-14 17:19:38 +11:00
}
else if ( TrInput & IN_RIGHT )
{
2021-11-14 22:51:43 +11:00
info - > turnRate + = LARA_TURN_RATE ;
if ( info - > turnRate > LARA_SLOW_TURN )
info - > turnRate = LARA_SLOW_TURN ;
2021-10-14 17:19:38 +11:00
}
if ( TrInput & IN_LSTEP )
{
2021-11-13 22:23:38 +11:00
item - > goalAnimState = LS_STEP_LEFT ;
2020-09-26 03:28:30 +10:00
2021-11-13 22:23:38 +11:00
return ;
2020-09-26 03:28:30 +10:00
}
2021-11-13 22:23:38 +11:00
item - > goalAnimState = LS_STOP ;
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
{
2021-11-14 22:51:43 +11:00
LaraInfo * & info = item - > data ;
info - > moveAngle = item - > pos . yRot - ANGLE ( 90.0f ) ;
2021-10-10 14:03:38 +11:00
item - > gravityStatus = false ;
item - > fallspeed = 0 ;
2021-11-14 22:51:43 +11:00
coll - > Setup . BadHeightDown = ( info - > waterStatus = = LW_WADE ) ? NO_BAD_POS : STEP_SIZE / 2 ;
coll - > Setup . BadHeightUp = - STEP_SIZE / 2 ;
coll - > Setup . BadCeilingHeight = 0 ;
2021-10-10 14:03:38 +11:00
coll - > Setup . SlopesArePits = true ;
coll - > Setup . SlopesAreWalls = true ;
2021-11-14 22:51:43 +11:00
coll - > Setup . ForwardAngle = info - > moveAngle ;
2021-10-10 14:03:38 +11:00
GetCollisionInfo ( coll , item ) ;
if ( TestLaraHitCeiling ( coll ) )
{
SetLaraHitCeiling ( item , coll ) ;
return ;
}
if ( LaraDeflectEdge ( item , coll ) )
LaraCollideStop ( item , coll ) ;
2021-11-20 12:25:51 +11:00
if ( TestLaraFall ( item , coll ) )
2021-10-10 14:03:38 +11:00
{
SetLaraFallState ( item ) ;
return ;
}
2021-11-05 21:29:00 +11:00
if ( TestLaraSlide ( item , coll ) )
2021-10-10 14:03:38 +11:00
return ;
2021-11-07 23:58:51 +11:00
if ( TestLaraStep ( coll ) | | TestLaraSwamp ( item ) )
2021-10-10 14:03:38 +11:00
{
DoLaraStep ( item , coll ) ;
return ;
}
}
2021-11-13 17:34:24 +11:00
// State: LS_ROLL_BACK(23)
2021-11-07 12:57:34 +11:00
// Collision: lara_col_roll2()
void lara_as_roll2 ( ITEM_INFO * item , COLL_INFO * coll )
{
2021-11-14 22:51:43 +11:00
LaraInfo * & info = item - > data ;
info - > look = false ;
2021-11-14 19:02:28 +11:00
2021-11-13 17:34:24 +11:00
if ( TrInput & IN_ROLL )
{
item - > goalAnimState = LS_ROLL_BACK ;
return ;
}
item - > goalAnimState = LS_STOP ;
2021-11-07 12:57:34 +11:00
}
2021-11-13 17:34:24 +11:00
// State: LS_ROLL_BACK (23)
2021-11-07 12:57:34 +11:00
// 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
{
2021-11-14 22:51:43 +11:00
LaraInfo * & info = item - > data ;
2021-10-14 19:58:29 +11:00
Camera . laraNode = 0 ;
2021-11-14 22:51:43 +11:00
info - > moveAngle = item - > pos . yRot + ANGLE ( 180 ) ;
2021-10-14 19:58:29 +11:00
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 ;
2021-11-14 22:51:43 +11:00
coll - > Setup . ForwardAngle = info - > moveAngle ;
2021-10-14 19:58:29 +11:00
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 ;
}
}
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 )
{
2021-11-14 22:51:43 +11:00
LaraInfo * & info = item - > data ;
info - > look = false ;
2021-11-14 19:02:28 +11:00
2021-11-07 12:57:34 +11:00
// TODO: Interpolation instead.
2021-11-14 22:51:43 +11:00
info - > NewAnims . SwandiveRollRun = true ;
2021-11-07 12:57:34 +11:00
if ( TrInput & IN_FORWARD & &
item - > animNumber = = LA_SWANDIVE_ROLL & &
2021-11-14 22:51:43 +11:00
info - > NewAnims . SwandiveRollRun )
2021-11-07 12:57:34 +11:00
{
item - > goalAnimState = LS_RUN_FORWARD ;
return ;
}
2021-11-13 17:34:24 +11:00
if ( TrInput & IN_ROLL )
{
item - > goalAnimState = LS_ROLL_FORWARD ;
return ;
}
item - > goalAnimState = LS_STOP ;
2021-11-07 12:57:34 +11:00
}
// 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
{
2021-11-14 22:51:43 +11:00
LaraInfo * & info = item - > data ;
info - > moveAngle = item - > pos . yRot ;
2021-10-15 18:26:03 +11:00
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 ;
2021-11-14 22:51:43 +11:00
coll - > Setup . ForwardAngle = info - > moveAngle ;
2021-10-15 18:26:03 +11:00
GetCollisionInfo ( coll , item ) ;
if ( TestLaraHitCeiling ( coll ) )
{
SetLaraHitCeiling ( item , coll ) ;
return ;
}
2021-11-20 12:25:51 +11:00
if ( TestLaraFall ( item , coll ) )
2021-10-15 18:26:03 +11:00
{
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 ;
}
}
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
{
2021-11-14 22:51:43 +11:00
LaraInfo * & info = item - > data ;
2021-11-14 17:31:00 +11:00
2021-11-14 22:51:43 +11:00
info - > look = ( TestLaraSwamp ( item ) & & info - > waterStatus = = LW_WADE ) ? false : true ;
2021-10-14 17:40:22 +11:00
Camera . targetElevation = - ANGLE ( 22.0f ) ;
if ( item - > hitPoints < = 0 )
{
item - > goalAnimState = LS_STOP ;
return ;
}
2021-11-07 13:26:45 +11:00
if ( TestLaraSwamp ( item ) )
2021-10-14 17:40:22 +11:00
{
LaraWadeSwamp ( item , coll ) ;
return ;
}
if ( TrInput & IN_LEFT )
{
2021-11-14 22:51:43 +11:00
info - > turnRate - = LARA_TURN_RATE ;
if ( info - > turnRate < - LARA_FAST_TURN )
info - > turnRate = - LARA_FAST_TURN ;
2021-10-14 17:40:22 +11:00
2021-11-17 15:59:51 +11:00
DoLaraLean ( item , coll , - LARA_LEAN_MAX , LARA_LEAN_RATE / 2 ) ;
2021-10-14 17:40:22 +11:00
}
else if ( TrInput & IN_RIGHT )
{
2021-11-14 22:51:43 +11:00
info - > turnRate + = LARA_TURN_RATE ;
if ( info - > turnRate > LARA_FAST_TURN )
info - > turnRate = LARA_FAST_TURN ;
2021-10-14 17:40:22 +11:00
2021-11-17 15:59:51 +11:00
DoLaraLean ( item , coll , LARA_LEAN_MAX , LARA_LEAN_RATE / 2 ) ;
2021-10-14 17:40:22 +11:00
}
if ( TrInput & IN_FORWARD )
{
2021-11-14 22:51:43 +11:00
if ( info - > waterStatus = = LW_ABOVE_WATER )
2021-10-14 17:40:22 +11:00
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 )
{
2021-11-14 22:51:43 +11:00
LaraInfo * & info = item - > data ;
2021-10-14 17:40:22 +11:00
if ( TrInput & IN_LEFT )
{
2021-11-14 22:51:43 +11:00
info - > turnRate - = LARA_TURN_RATE ;
2021-11-15 00:21:52 +11:00
if ( info - > turnRate < - LARA_SLOW_TURN / 2 )
info - > turnRate = - LARA_SLOW_TURN / 2 ;
2021-10-14 17:40:22 +11:00
2021-11-17 15:59:51 +11:00
DoLaraLean ( item , coll , - LARA_LEAN_MAX / 5 * 3 , LARA_LEAN_RATE / 3 ) ;
2021-10-14 17:40:22 +11:00
}
else if ( TrInput & IN_RIGHT )
{
2021-11-14 22:51:43 +11:00
info - > turnRate + = LARA_TURN_RATE ;
2021-11-15 00:21:52 +11:00
if ( info - > turnRate > LARA_SLOW_TURN / 2 )
info - > turnRate = LARA_SLOW_TURN / 2 ;
2021-10-14 17:40:22 +11:00
2021-11-17 15:59:51 +11:00
DoLaraLean ( item , coll , LARA_LEAN_MAX / 5 * 3 , LARA_LEAN_RATE / 3 ) ;
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 ;
}
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
{
2021-11-14 22:51:43 +11:00
LaraInfo * & info = item - > data ;
info - > moveAngle = item - > pos . yRot ;
2021-10-24 22:18:22 +11:00
coll - > Setup . BadHeightDown = NO_BAD_POS ;
coll - > Setup . BadHeightUp = - STEPUP_HEIGHT ;
coll - > Setup . BadCeilingHeight = 0 ;
coll - > Setup . SlopesAreWalls = true ;
2021-11-14 22:51:43 +11:00
coll - > Setup . ForwardAngle = info - > moveAngle ;
2021-10-24 22:18:22 +11:00
GetCollisionInfo ( coll , item ) ;
if ( TestLaraHitCeiling ( coll ) )
{
SetLaraHitCeiling ( item , coll ) ;
return ;
}
if ( LaraDeflectEdge ( item , coll ) )
{
item - > pos . zRot = 0 ;
2021-11-07 13:26:45 +11:00
if ( coll - > Front . Floor < - STEPUP_HEIGHT & &
! coll - > Front . Slope & &
! TestLaraSwamp ( item ) )
2021-10-24 22:18:22 +11:00
{
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-11-07 23:58:51 +11:00
if ( TestLaraStep ( coll ) | | TestLaraSwamp ( item ) )
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-11-13 21:57:10 +11:00
// LEGACY step
/*if (coll->Middle.Floor >= -STEPUP_HEIGHT && coll->Middle.Floor < -STEP_SIZE / 2 && !TestLaraSwamp(item))
{
item - > goalAnimState = LS_STEP_UP ;
GetChange ( item , & g_Level . Anims [ item - > animNumber ] ) ;
}
if ( coll - > Middle . Floor > = 50 & & ! TestLaraSwamp ( item ) )
{
item - > pos . yPos + = 50 ;
return ;
}
LaraSnapToHeight ( item , coll ) ; */
2021-10-24 22:18:22 +11: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
{
2021-11-14 22:51:43 +11:00
LaraInfo * & info = item - > data ;
info - > sprintTimer - - ;
2021-09-29 18:35:21 +10:00
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 )
{
2021-11-14 22:51:43 +11:00
info - > turnRate - = LARA_TURN_RATE ;
if ( info - > turnRate < - LARA_SLOW_TURN )
info - > turnRate = - LARA_SLOW_TURN ;
2021-09-29 18:35:21 +10:00
2021-11-17 15:59:51 +11:00
DoLaraLean ( item , coll , - LARA_LEAN_MAX , LARA_LEAN_RATE ) ;
2021-09-29 18:35:21 +10:00
}
else if ( TrInput & IN_RIGHT )
{
2021-11-14 22:51:43 +11:00
info - > turnRate + = LARA_TURN_RATE ;
if ( info - > turnRate > LARA_SLOW_TURN )
info - > turnRate = LARA_SLOW_TURN ;
2021-09-29 18:35:21 +10:00
2021-11-17 15:59:51 +11:00
DoLaraLean ( item , coll , LARA_LEAN_MAX , LARA_LEAN_RATE ) ;
2021-09-29 18:35:21 +10:00
}
if ( TrInput & IN_JUMP )
{
item - > goalAnimState = LS_SPRINT_ROLL ;
return ;
}
2021-11-13 18:10:22 +11:00
if ( ( TrInput & IN_DUCK /* || TestLaraKeepCrouched(coll)*/ ) & &
2021-11-14 22:51:43 +11:00
( info - > gunStatus = = LG_NO_ARMS | | ! IsStandingWeapon ( info - > 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 )
{
2021-11-14 22:51:43 +11:00
if ( info - > waterStatus = = LW_WADE )
2021-09-29 18:35:21 +10:00
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 ;
2021-11-14 22:51:43 +11:00
else if ( TrInput & IN_SPRINT & & info - > sprintTimer > 0 ) [[likely]]
2021-09-29 18:35:21 +10:00
item - > goalAnimState = LS_SPRINT ;
else
item - > goalAnimState = LS_RUN_FORWARD ;
return ;
}
item - > goalAnimState = LS_STOP ;
}
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
{
2021-11-14 22:51:43 +11:00
LaraInfo * & info = item - > data ;
info - > moveAngle = item - > pos . yRot ;
2021-10-09 23:53:39 +11:00
coll - > Setup . BadHeightDown = NO_BAD_POS ;
coll - > Setup . BadHeightUp = - STEPUP_HEIGHT ;
coll - > Setup . BadCeilingHeight = 0 ;
coll - > Setup . SlopesAreWalls = true ;
2021-11-14 22:51:43 +11:00
coll - > Setup . ForwardAngle = info - > moveAngle ;
2021-10-09 23:53:39 +11:00
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 ) ;
}
2021-11-20 12:25:51 +11:00
if ( TestLaraFall ( item , coll ) )
2021-10-09 23:53:39 +11:00
{
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
//}
}
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
{
2021-11-14 22:51:43 +11:00
LaraInfo * & info = item - > data ;
2021-10-14 19:58:29 +11:00
if ( TrInput & IN_LEFT )
{
2021-11-14 22:51:43 +11:00
info - > turnRate - = LARA_TURN_RATE ;
if ( info - > turnRate < - LARA_SLOW_TURN )
info - > turnRate = - LARA_SLOW_TURN ;
2021-10-14 19:58:29 +11:00
2021-11-17 15:59:51 +11:00
DoLaraLean ( item , coll , - ( LARA_LEAN_MAX * 3 ) / 5 , LARA_LEAN_RATE ) ;
2021-10-14 19:58:29 +11:00
}
else if ( TrInput & IN_RIGHT )
{
2021-11-14 22:51:43 +11:00
info - > turnRate + = LARA_TURN_RATE ;
if ( info - > turnRate > LARA_SLOW_TURN )
info - > turnRate = LARA_SLOW_TURN ;
2021-10-14 19:58:29 +11:00
2021-11-17 15:59:51 +11:00
DoLaraLean ( item , coll , ( LARA_LEAN_MAX * 3 ) / 5 , LARA_LEAN_RATE ) ;
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
}
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
{
2021-11-14 22:51:43 +11:00
LaraInfo * & info = item - > data ;
2020-09-26 05:06:08 +10:00
/*state 74*/
/*state code: lara_as_dashdive*/
if ( item - > speed < 0 )
2021-11-14 22:51:43 +11:00
info - > moveAngle = item - > pos . yRot + ANGLE ( 180 ) ;
2020-09-26 05:06:08 +10:00
else
2021-11-14 22:51:43 +11:00
info - > 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-11-14 22:51:43 +11:00
coll - > Setup . ForwardAngle = info - > 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 )
2021-11-14 22:51:43 +11:00
info - > 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 ;
}
2021-11-14 22:51:43 +11:00
else if ( info - > waterStatus = = LW_WADE | | ! ( TrInput & IN_FORWARD ) | | TrInput & IN_WALK )
2020-08-14 17:54:25 -05:00
{
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
}
}