2020-08-10 00:21:45 -05:00
# include "framework.h"
# include "lara.h"
# include "input.h"
2021-09-19 18:29:25 +03:00
# include "level.h"
2020-08-10 00:21:45 -05:00
# include "lara_tests.h"
# include "lara_collide.h"
2021-09-16 05:06:03 +03:00
# include "animation.h"
2021-09-19 18:29:25 +03:00
# include "control/los.h"
2021-09-27 18:18:03 +10:00
# include "lara_flare.h"
# include "lara_helpers.h"
2021-08-28 13:27:58 +02:00
# include "collide.h"
2021-09-19 23:41:26 +03:00
# include "items.h"
2021-08-28 13:27:58 +02:00
# include "camera.h"
2021-09-19 23:41:26 +03:00
# include "control/control.h"
2021-09-19 18:29:25 +03:00
2021-09-27 18:18:03 +10:00
// -----------------------------
2021-09-26 20:59:16 +10:00
// CRAWLING & CROUCHING
// Control & Collision Functions
2021-09-27 18:18:03 +10:00
// -----------------------------
2021-09-26 20:59:16 +10:00
2021-10-04 22:46:39 +11:00
// ----------
// CROUCHING:
// ----------
2021-09-26 20:59:16 +10:00
// State: LS_CROUCH_IDLE (71)
2021-10-30 12:45:52 +11:00
// Collision: lara_col_crouch_idle()
void lara_as_crouch_idle ( ITEM_INFO * item , COLL_INFO * coll )
2021-09-26 20:59:16 +10:00
{
2021-10-14 01:17:21 +11:00
// TODO: Deplete air meter if Lara's head is below the water. Original implementation had a weird buffer zone before
2021-10-15 18:26:03 +11:00
// wade depth where Lara couldn't crouch at all, and if the player forced her into the crouched state by
2021-10-14 01:17:21 +11:00
// crouching into the region from a run as late as possible, she wasn't able to turn or begin crawling.
// Since Lara can now crawl at a considerable depth, a region of peril would make sense. @Sezz 2021.13.21
2021-11-05 21:29:00 +11:00
Lara . keepDucked = TestLaraKeepDucked ( item , coll ) ; // TODO: This MUST be true on the first frame that Lara climbs up into a crawlspace. @Sezz 2021.10.14
2021-09-26 20:59:16 +10:00
coll - > Setup . EnableSpaz = false ;
coll - > Setup . EnableObjectPush = true ;
2021-11-08 22:24:49 +11:00
Camera . targetElevation = - ANGLE ( 24.0f ) ;
2021-09-26 20:59:16 +10:00
if ( item - > hitPoints < = 0 )
{
2021-10-13 19:50:46 +11:00
item - > goalAnimState = LS_DEATH ;
2021-09-26 20:59:16 +10:00
return ;
}
if ( TrInput & IN_LOOK )
LookUpDown ( ) ;
2021-10-30 13:42:55 +11:00
if ( TrInput & IN_LEFT )
2021-11-01 17:57:43 +11:00
Lara . turnRate = - LARA_CRAWL_TURN ;
2021-10-30 13:42:55 +11:00
else if ( TrInput & IN_RIGHT )
2021-11-01 17:57:43 +11:00
Lara . turnRate = LARA_CRAWL_TURN ;
2021-10-14 01:59:55 +11:00
2021-10-13 19:50:46 +11:00
if ( ( TrInput & IN_DUCK | | Lara . keepDucked ) & &
Lara . waterStatus ! = LW_WADE )
2021-09-26 20:59:16 +10:00
{
2021-11-01 17:57:43 +11:00
// TODO: LUA
2021-09-26 20:59:16 +10:00
Lara . NewAnims . CrouchRoll = true ;
2021-10-13 19:50:46 +11:00
if ( ( TrInput & IN_SPRINT ) & &
2021-10-16 22:53:29 +11:00
TestLaraCrouchRoll ( item , coll ) & &
2021-11-11 23:31:04 +11:00
Lara . gunStatus = = LG_NO_ARMS & &
2021-10-13 19:50:46 +11:00
Lara . NewAnims . CrouchRoll )
2021-09-26 20:59:16 +10:00
{
item - > goalAnimState = LS_CROUCH_ROLL ;
return ;
}
2021-10-16 20:50:16 +11:00
// TODO: This will lock Lara if the dispatch can't happen.
// Maybe rejoining that split animation wasn't such a good idea... @Sezz 2021.10.16
2021-10-22 00:07:24 +11:00
if ( TrInput & IN_FORWARD & &
TestLaraCrouchToCrawl ( item ) )
{
item - > goalAnimState = LS_CRAWL_IDLE ;
return ;
}
else if ( TrInput & IN_BACK & &
TestLaraCrouchToCrawl ( item ) )
2021-09-26 20:59:16 +10:00
{
item - > goalAnimState = LS_CRAWL_IDLE ;
return ;
}
2021-10-13 19:50:46 +11:00
if ( TrInput & IN_LEFT )
2021-09-26 20:59:16 +10:00
{
item - > goalAnimState = LS_CROUCH_TURN_LEFT ;
return ;
}
2021-10-13 19:50:46 +11:00
else if ( TrInput & IN_RIGHT )
2021-09-26 20:59:16 +10:00
{
item - > goalAnimState = LS_CROUCH_TURN_RIGHT ;
return ;
}
2021-10-04 22:46:39 +11:00
item - > goalAnimState = LS_CROUCH_IDLE ;
2021-09-26 20:59:16 +10:00
return ;
}
item - > goalAnimState = LS_STOP ;
}
// LEGACY
2021-10-30 12:45:52 +11:00
void old_lara_as_crouch_idle ( ITEM_INFO * item , COLL_INFO * coll )
2020-09-26 03:28:30 +10:00
{
2020-09-26 05:06:08 +10:00
/*state 71*/
/*collision: lara_col_duck*/
short roomNum ;
2020-09-26 03:28:30 +10:00
2021-09-10 00:20:59 +03:00
coll - > Setup . EnableSpaz = false ;
coll - > Setup . EnableObjectPush = true ;
2020-08-10 00:21:45 -05:00
Lara . isDucked = true ;
if ( item - > hitPoints < = 0 )
{
item - > goalAnimState = LS_CRAWL_IDLE ;
return ;
}
2020-09-26 05:06:08 +10:00
roomNum = LaraItem - > roomNumber ;
2020-08-10 00:21:45 -05:00
if ( TrInput & IN_LOOK )
LookUpDown ( ) ;
2020-09-26 05:06:08 +10:00
GetFloor ( LaraItem - > pos . xPos , LaraItem - > pos . yPos , LaraItem - > pos . zPos , & roomNum ) ;
2021-07-08 14:15:14 -05:00
// FOR DEBUG PURPOSES UNTIL SCRIPTING IS FINISHED- ## LUA
Lara . NewAnims . CrouchRoll = 1 ;
2020-09-26 05:06:08 +10:00
if ( ( TrInput & IN_FORWARD | | TrInput & IN_BACK )
& & ( TrInput & IN_DUCK | | Lara . keepDucked )
& & Lara . gunStatus = = LG_NO_ARMS
& & Lara . waterStatus ! = LW_WADE
| | Lara . waterSurfaceDist = = 256
& & ! ( Lara . waterSurfaceDist > 256 ) )
2020-08-10 00:21:45 -05:00
{
2020-09-26 05:06:08 +10:00
if ( ( item - > animNumber = = LA_CROUCH_IDLE
| | item - > animNumber = = LA_STAND_TO_CROUCH_END )
& & ! ( TrInput & IN_FLARE | | TrInput & IN_DRAW )
2021-07-13 22:29:47 -05:00
& & ( Lara . gunType ! = WEAPON_FLARE | | Lara . flareAge < FLARE_AGE & & Lara . flareAge ! = 0 ) )
2020-08-10 00:21:45 -05:00
{
2020-09-26 05:06:08 +10:00
Lara . torsoYrot = 0 ;
2020-08-10 00:21:45 -05:00
Lara . torsoXrot = 0 ;
2020-09-26 05:06:08 +10:00
item - > goalAnimState = LS_CRAWL_IDLE ;
}
2020-08-10 00:21:45 -05:00
2020-09-26 05:06:08 +10:00
}
else if ( ( TrInput & IN_SPRINT ) /*crouch roll*/
& & ( TrInput & IN_DUCK | | Lara . keepDucked )
& & Lara . gunStatus = = LG_NO_ARMS
& & Lara . waterStatus ! = LW_WADE
| | Lara . waterSurfaceDist = = 256
2021-07-08 14:15:14 -05:00
& & ! ( Lara . waterSurfaceDist > 256 )
& & Lara . NewAnims . CrouchRoll )
2020-09-26 05:06:08 +10:00
{
2021-10-27 09:48:31 +03:00
if ( LaraFloorFront ( item , item - > pos . yRot , 1024 ) > = 384 | | // 4 clicks away from holes in the floor
TestLaraWall ( item , WALL_SIZE / 2 , 0 , - 256 ) ! = SPLAT_COLL : : NONE ) // 2 clicks away from walls + added a fix in lara_col_crouch_roll, better this way
2020-09-26 03:28:30 +10:00
return ;
2020-08-10 00:21:45 -05:00
2020-09-26 05:06:08 +10:00
if ( ! ( TrInput & IN_FLARE | | TrInput & IN_DRAW ) //avoids some flare spawning/wep stuff
2021-07-13 22:29:47 -05:00
& & ( Lara . gunType ! = WEAPON_FLARE | | Lara . flareAge < FLARE_AGE & & Lara . flareAge ! = 0 ) )
2020-09-26 05:06:08 +10:00
2020-08-10 00:21:45 -05:00
{
2020-09-26 05:06:08 +10:00
Lara . torsoYrot = 0 ;
2020-09-26 03:28:30 +10:00
Lara . torsoXrot = 0 ;
2020-09-26 05:06:08 +10:00
item - > goalAnimState = LS_CROUCH_ROLL ;
2020-08-10 00:21:45 -05:00
}
}
}
2021-09-26 20:59:16 +10:00
// State: LS_CROUCH_IDLE (71)
2021-10-30 12:45:52 +11:00
// Control: lara_as_crouch_idle()
void lara_col_crouch_idle ( ITEM_INFO * item , COLL_INFO * coll )
2021-09-26 20:59:16 +10:00
{
2021-11-05 21:29:00 +11:00
Lara . keepDucked = TestLaraKeepDucked ( item , coll ) ;
2021-10-11 23:16:02 +11:00
Lara . isDucked = true ;
2021-11-05 17:50:53 +11:00
Lara . moveAngle = item - > pos . yRot ;
2021-09-26 20:59:16 +10:00
item - > gravityStatus = false ;
item - > fallspeed = 0 ;
coll - > Setup . Height = LARA_HEIGHT_CRAWL ;
coll - > Setup . ForwardAngle = item - > pos . yRot ;
2021-10-22 00:07:24 +11:00
coll - > Setup . BadHeightDown = STEP_SIZE - 1 ; // Was STEPUP_HEIGHT; crouching onto a step-high ledge from a run was unsightly. @Sezz 2021.10.22
coll - > Setup . BadHeightUp = - ( STEP_SIZE - 1 ) ; // Was -STEPUP_HEIGHT.
2021-09-26 20:59:16 +10:00
coll - > Setup . BadCeilingHeight = 0 ;
coll - > Setup . SlopesAreWalls = true ;
GetCollisionInfo ( coll , item ) ;
if ( TestLaraFall ( coll ) )
{
Lara . gunStatus = LG_NO_ARMS ;
SetLaraFallState ( item ) ;
return ;
}
2021-11-05 21:29:00 +11:00
if ( TestLaraSlide ( item , coll ) )
2021-09-26 20:59:16 +10:00
return ;
ShiftItem ( item , coll ) ;
if ( coll - > Middle . Floor ! = NO_HEIGHT )
item - > pos . yPos + = coll - > Middle . Floor ;
}
// LEGACY
2021-10-30 12:45:52 +11:00
void old_lara_col_crouch_idle ( ITEM_INFO * item , COLL_INFO * coll )
2020-08-10 00:21:45 -05:00
{
2020-09-26 05:06:08 +10:00
/*state 71*/
/*state code: lara_as_duck*/
2020-08-10 00:21:45 -05:00
item - > gravityStatus = false ;
item - > fallspeed = 0 ;
2020-12-19 23:34:52 -03:00
Lara . moveAngle = item - > pos . yRot ;
2020-09-26 05:06:08 +10:00
2021-09-19 06:42:24 +03:00
coll - > Setup . Height = LARA_HEIGHT_CRAWL ;
2021-09-10 00:20:59 +03:00
coll - > Setup . ForwardAngle = item - > pos . yRot ;
2021-09-19 17:48:32 +03:00
coll - > Setup . BadHeightDown = STEPUP_HEIGHT ;
coll - > Setup . BadHeightUp = - STEPUP_HEIGHT ;
2021-09-10 00:20:59 +03:00
coll - > Setup . BadCeilingHeight = 0 ;
coll - > Setup . SlopesAreWalls = true ;
2020-08-10 00:21:45 -05:00
2021-09-19 06:42:24 +03:00
GetCollisionInfo ( coll , item ) ;
2020-08-10 00:21:45 -05:00
2020-09-26 05:06:08 +10:00
if ( LaraFallen ( item , coll ) )
2020-08-10 00:21:45 -05:00
{
2020-09-26 05:06:08 +10:00
Lara . gunStatus = LG_NO_ARMS ;
2020-09-26 03:28:30 +10:00
}
2020-09-26 05:06:08 +10:00
else if ( ! TestLaraSlide ( item , coll ) )
2020-09-26 03:28:30 +10:00
{
2021-11-05 21:29:00 +11:00
Lara . keepDucked = TestLaraKeepDucked ( item , coll ) ;
2020-09-26 05:06:08 +10:00
ShiftItem ( item , coll ) ;
2020-09-26 03:28:30 +10:00
2021-09-10 00:18:47 +03:00
if ( coll - > Middle . Floor ! = NO_HEIGHT )
item - > pos . yPos + = coll - > Middle . Floor ;
2020-09-26 03:28:30 +10:00
2020-09-26 05:06:08 +10:00
if ( TrInput & IN_DUCK & & Lara . waterStatus ! = LW_WADE | |
Lara . keepDucked | |
item - > animNumber ! = LA_CROUCH_IDLE )
{
if ( TrInput & IN_LEFT )
{
item - > goalAnimState = LS_CROUCH_TURN_LEFT ;
}
else if ( TrInput & IN_RIGHT )
{
item - > goalAnimState = LS_CROUCH_TURN_RIGHT ;
}
}
else
{
item - > goalAnimState = LS_STOP ;
}
2020-08-10 00:21:45 -05:00
}
}
2021-09-27 18:18:03 +10:00
// State: LS_CROUCH_ROLL (72)
// Collision: lara_as_crouch_roll()
2021-09-26 20:59:16 +10:00
void lara_as_crouch_roll ( ITEM_INFO * item , COLL_INFO * coll )
2021-09-27 18:18:03 +10:00
{
coll - > Setup . EnableSpaz = false ;
coll - > Setup . EnableObjectPush = true ;
2021-11-08 22:24:49 +11:00
Camera . targetElevation = - ANGLE ( 24.0f ) ;
2021-09-27 18:18:03 +10:00
2021-10-28 16:13:56 +11:00
if ( TrInput & IN_LEFT )
2021-09-27 18:18:03 +10:00
{
2021-10-13 19:50:46 +11:00
Lara . turnRate = - LARA_CROUCH_ROLL_TURN ;
2021-09-27 18:18:03 +10:00
2021-11-09 17:59:36 +11:00
DoLaraLean ( item , coll , - LARA_LEAN_MAX , 7 ) ;
2021-09-27 18:18:03 +10:00
}
2021-10-28 16:13:56 +11:00
else if ( TrInput & IN_RIGHT )
2021-09-27 18:18:03 +10:00
{
2021-10-13 19:50:46 +11:00
Lara . turnRate = LARA_CROUCH_ROLL_TURN ;
2021-09-27 18:18:03 +10:00
2021-11-09 17:59:36 +11:00
DoLaraLean ( item , coll , LARA_LEAN_MAX , 7 ) ;
2021-09-27 18:18:03 +10:00
}
2021-10-22 01:50:43 +11:00
// TODO: Make crouch roll deplete sprint meter? @Sezz 2021.10.22
2021-09-27 18:18:03 +10:00
item - > goalAnimState = LS_CROUCH_IDLE ;
}
// LEGACY
void old_lara_as_crouch_roll ( ITEM_INFO * item , COLL_INFO * coll )
2020-08-10 00:21:45 -05:00
{
2020-09-26 05:06:08 +10:00
/*state 72*/
/*collision: lara_col_crouch_roll*/
Camera . targetElevation = - ANGLE ( 20.0f ) ;
2020-08-10 00:21:45 -05:00
item - > goalAnimState = LS_CROUCH_IDLE ;
}
2021-09-27 18:18:03 +10:00
// State: LS_CROUCH_ROLL (72)
// Control: lara_as_crouch_roll()
2021-09-26 20:59:16 +10:00
void lara_col_crouch_roll ( ITEM_INFO * item , COLL_INFO * coll )
2021-09-27 18:18:03 +10:00
{
2021-11-05 21:29:00 +11:00
Lara . keepDucked = TestLaraKeepDucked ( item , coll ) ;
2021-10-11 23:16:02 +11:00
Lara . isDucked = true ;
2021-11-05 17:50:53 +11:00
Lara . moveAngle = item - > pos . yRot ;
2021-09-27 18:18:03 +10:00
item - > gravityStatus = 0 ;
item - > fallspeed = 0 ;
coll - > Setup . Height = LARA_HEIGHT_CRAWL ;
2021-10-18 20:15:53 +11:00
coll - > Setup . BadHeightDown = STEP_SIZE - 1 ;
coll - > Setup . BadHeightUp = - ( STEP_SIZE - 1 ) ;
2021-09-27 18:18:03 +10:00
coll - > Setup . ForwardAngle = item - > pos . yRot ;
coll - > Setup . BadCeilingHeight = 0 ;
coll - > Setup . SlopesAreWalls = true ;
GetCollisionInfo ( coll , item ) ;
2021-11-02 14:22:58 +11:00
// TODO: With sufficient speed, Lara can still roll off ledges. This is particularly a problem when
// she becomes airborne within a crawlspace, as collision handling will push her back very rapidly. @Sezz 2021.11.02
2021-10-28 16:13:56 +11:00
if ( LaraDeflectEdgeDuck ( item , coll ) )
2021-10-14 01:17:21 +11:00
{
item - > pos . xPos = coll - > Setup . OldPosition . x ;
item - > pos . yPos = coll - > Setup . OldPosition . y ;
item - > pos . zPos = coll - > Setup . OldPosition . z ;
}
2021-09-27 18:18:03 +10:00
if ( TestLaraFall ( coll ) )
{
Lara . gunStatus = LG_NO_ARMS ;
2021-10-14 01:17:21 +11:00
item - > speed / = 3 ; // Truncate speed to prevent flying off. TODO: Truncate on a curve. @Sezz 2021.06.27
2021-09-27 18:18:03 +10:00
SetLaraFallState ( item ) ;
return ;
}
2021-11-05 21:29:00 +11:00
if ( TestLaraSlide ( item , coll ) )
2021-09-27 18:18:03 +10:00
return ;
2021-10-14 01:17:21 +11:00
ShiftItem ( item , coll ) ;
if ( TestLaraHitCeiling ( coll ) )
2021-09-27 18:18:03 +10:00
{
2021-10-14 01:17:21 +11:00
SetLaraHitCeiling ( item , coll ) ;
2021-09-27 18:18:03 +10:00
return ;
}
2021-10-14 01:17:21 +11:00
if ( TestLaraStep ( coll ) )
2021-09-27 18:18:03 +10:00
{
2021-10-14 01:17:21 +11:00
DoLaraStep ( item , coll ) ;
2021-09-27 18:18:03 +10:00
return ;
}
2021-10-14 01:17:21 +11:00
// LEGACY step
/*if (coll->Middle.Floor != NO_HEIGHT)
item - > pos . yPos + = coll - > Middle . Floor ; */
2021-09-27 18:18:03 +10:00
}
// LEGACY
void old_lara_col_crouch_roll ( ITEM_INFO * item , COLL_INFO * coll )
2020-08-10 00:21:45 -05:00
{
2020-09-26 05:06:08 +10:00
/*state 72*/
/*state code: lara_as_crouch_roll*/
2021-07-08 14:15:14 -05:00
item - > gravityStatus = 0 ;
2020-08-10 00:21:45 -05:00
item - > fallspeed = 0 ;
2021-09-19 06:42:24 +03:00
2020-12-19 23:34:52 -03:00
Lara . moveAngle = item - > pos . yRot ;
2021-09-19 06:42:24 +03:00
coll - > Setup . Height = LARA_HEIGHT_CRAWL ;
2021-09-19 17:48:32 +03:00
coll - > Setup . BadHeightDown = STEPUP_HEIGHT ;
2021-09-10 00:20:59 +03:00
coll - > Setup . ForwardAngle = item - > pos . yRot ;
2021-09-19 17:48:32 +03:00
coll - > Setup . BadHeightUp = - STEPUP_HEIGHT ;
2021-09-10 00:20:59 +03:00
coll - > Setup . BadCeilingHeight = 0 ;
coll - > Setup . SlopesAreWalls = true ;
2021-09-19 06:42:24 +03:00
GetCollisionInfo ( coll , item ) ;
2021-07-08 14:15:14 -05:00
if ( LaraFallen ( item , coll ) )
Lara . gunStatus = LG_NO_ARMS ;
else if ( ! TestLaraSlide ( item , coll ) )
{
2021-11-05 21:29:00 +11:00
Lara . keepDucked = TestLaraKeepDucked ( item , coll ) ;
2021-07-08 14:15:14 -05:00
2021-09-19 17:48:32 +03:00
if ( coll - > Middle . Floor < coll - > Setup . BadHeightUp ) //hit a wall, stop
2021-07-08 14:15:14 -05:00
{
2021-09-10 00:20:59 +03:00
item - > pos . xPos = coll - > Setup . OldPosition . x ;
item - > pos . yPos = coll - > Setup . OldPosition . y ;
item - > pos . zPos = coll - > Setup . OldPosition . z ;
2021-07-08 14:15:14 -05:00
return ;
}
ShiftItem ( item , coll ) ;
2020-08-10 00:21:45 -05:00
2021-07-08 14:15:14 -05:00
if ( ! LaraHitCeiling ( item , coll ) )
2021-09-10 00:18:47 +03:00
item - > pos . yPos + = coll - > Middle . Floor ;
2021-07-08 14:15:14 -05:00
}
2020-08-10 00:21:45 -05:00
}
2021-10-04 22:46:39 +11:00
// State: LS_CROUCH_TURN_LEFT (105)
2021-10-30 12:45:52 +11:00
// Collision: lara_col_crouch_turn_left()
void lara_as_crouch_turn_left ( ITEM_INFO * item , COLL_INFO * coll )
2021-10-04 22:46:39 +11:00
{
coll - > Setup . EnableSpaz = false ;
2021-11-08 22:24:49 +11:00
Camera . targetElevation = - ANGLE ( 24.0f ) ;
2021-10-04 22:46:39 +11:00
if ( item - > hitPoints < = 0 )
{
2021-10-13 19:50:46 +11:00
item - > goalAnimState = LS_DEATH ;
2021-10-04 22:46:39 +11:00
return ;
}
if ( TrInput & IN_LOOK )
LookUpDown ( ) ;
2021-11-01 17:57:43 +11:00
Lara . turnRate = - LARA_CRAWL_TURN ;
2021-10-04 22:46:39 +11:00
2021-10-13 19:50:46 +11:00
if ( ( TrInput & IN_DUCK | | Lara . keepDucked ) & &
Lara . waterStatus ! = LW_WADE )
2021-10-04 22:46:39 +11:00
{
2021-10-14 01:17:21 +11:00
if ( ( TrInput & IN_SPRINT ) & &
TestLaraCrouchRoll ( item , coll ) & &
Lara . NewAnims . CrouchRoll )
2021-10-04 22:46:39 +11:00
{
item - > goalAnimState = LS_CROUCH_ROLL ;
return ;
}
2021-10-14 01:17:21 +11:00
if ( TrInput & ( IN_FORWARD | IN_BACK ) & &
2021-10-22 00:07:24 +11:00
TestLaraCrouchToCrawl ( item ) )
2021-10-04 22:46:39 +11:00
{
item - > goalAnimState = LS_CRAWL_IDLE ;
return ;
}
if ( TrInput & IN_LEFT )
{
item - > goalAnimState = LS_CROUCH_TURN_LEFT ;
return ;
}
item - > goalAnimState = LS_CROUCH_IDLE ;
return ;
}
2021-10-14 17:47:49 +11:00
item - > goalAnimState = LS_STOP ;
2021-10-04 22:46:39 +11:00
}
// LEGACY
2021-10-30 12:45:52 +11:00
void old_lara_as_crouch_turn_left ( ITEM_INFO * item , COLL_INFO * coll )
2021-10-04 22:46:39 +11:00
{
/*state 105*/
/*collision: lara_col_ducklr*/
coll - > Setup . EnableSpaz = false ;
if ( ( TrInput & ( IN_DUCK | IN_LEFT ) ) ! = ( IN_DUCK | IN_LEFT ) | | item - > hitPoints < = 0 )
item - > goalAnimState = LS_CROUCH_IDLE ;
item - > pos . yRot - = ANGLE ( 1.5f ) ;
}
2021-10-15 01:37:41 +11:00
// State: LS_CRAWL_TURN_LEFT (105)
2021-10-30 12:45:52 +11:00
// Control: lara_as_crouch_turn_left()
void lara_col_crouch_turn_left ( ITEM_INFO * item , COLL_INFO * coll )
2021-10-15 01:37:41 +11:00
{
2021-10-30 12:45:52 +11:00
lara_col_crouch_idle ( item , coll ) ;
2021-10-15 01:37:41 +11:00
}
2021-10-04 22:46:39 +11:00
// State: LS_CROUCH_TURN_RIGHT (106)
2021-10-30 12:45:52 +11:00
// Collision: lara_col_crouch_turn_right()
void lara_as_crouch_turn_right ( ITEM_INFO * item , COLL_INFO * coll )
2021-10-04 22:46:39 +11:00
{
coll - > Setup . EnableSpaz = false ;
2021-11-08 22:24:49 +11:00
Camera . targetElevation = - ANGLE ( 24.0f ) ;
2021-10-04 22:46:39 +11:00
if ( item - > hitPoints < = 0 )
{
item - > goalAnimState = LS_CROUCH_IDLE ; // TODO: Dispatch death state. @Sezz 2021.10.03
return ;
}
if ( TrInput & IN_LOOK )
LookUpDown ( ) ;
2021-11-01 17:57:43 +11:00
Lara . turnRate = LARA_CRAWL_TURN ;
2021-10-04 22:46:39 +11:00
2021-10-13 19:50:46 +11:00
if ( ( TrInput & IN_DUCK | | Lara . keepDucked ) & &
Lara . waterStatus ! = LW_WADE )
2021-10-04 22:46:39 +11:00
{
2021-10-14 01:17:21 +11:00
if ( ( TrInput & IN_SPRINT ) & &
TestLaraCrouchRoll ( item , coll ) & &
Lara . NewAnims . CrouchRoll )
2021-10-04 22:46:39 +11:00
{
item - > goalAnimState = LS_CROUCH_ROLL ;
return ;
}
2021-10-14 01:17:21 +11:00
if ( TrInput & ( IN_FORWARD | IN_BACK ) & &
2021-10-22 00:07:24 +11:00
TestLaraCrouchToCrawl ( item ) )
2021-10-04 22:46:39 +11:00
{
item - > goalAnimState = LS_CRAWL_IDLE ;
return ;
}
if ( TrInput & IN_RIGHT )
{
item - > goalAnimState = LS_CROUCH_TURN_RIGHT ;
return ;
}
item - > goalAnimState = LS_CROUCH_IDLE ;
return ;
}
2021-10-14 17:47:49 +11:00
item - > goalAnimState = LS_STOP ;
2021-10-04 22:46:39 +11:00
}
// LEGACY
2021-10-30 12:45:52 +11:00
void old_lara_as_crouch_turn_right ( ITEM_INFO * item , COLL_INFO * coll )
2021-10-04 22:46:39 +11:00
{
/*state 106*/
/*collision: lara_col_ducklr*/
coll - > Setup . EnableSpaz = false ;
if ( ( TrInput & ( IN_DUCK | IN_RIGHT ) ) ! = ( IN_DUCK | IN_RIGHT ) | | item - > hitPoints < = 0 )
item - > goalAnimState = LS_CROUCH_IDLE ;
item - > pos . yRot + = ANGLE ( 1.5f ) ;
}
2021-10-15 01:37:41 +11:00
// State: LS_CRAWL_TURN_RIGHT (106)
2021-10-30 12:45:52 +11:00
// Control: lara_as_crouch_turn_right()
void lara_col_crouch_turn_right ( ITEM_INFO * item , COLL_INFO * coll )
2021-10-04 22:46:39 +11:00
{
2021-10-30 12:45:52 +11:00
lara_col_crouch_idle ( item , coll ) ;
2021-10-04 22:46:39 +11:00
}
// LEGACY
2021-10-30 12:45:52 +11:00
void old_lara_col_crouch_turn_right ( ITEM_INFO * item , COLL_INFO * coll )
2021-10-04 22:46:39 +11:00
{
/*state 105 and 106*/
/*state code: lara_as_duckl(105) and lara_col_ducklr(106)*/
// FIXED
Lara . isDucked = true ;
if ( TrInput & IN_LOOK )
LookUpDown ( ) ;
item - > gravityStatus = false ;
item - > fallspeed = 0 ;
Lara . moveAngle = item - > pos . yRot ;
coll - > Setup . Height = LARA_HEIGHT_CRAWL ;
coll - > Setup . ForwardAngle = item - > pos . yRot ;
coll - > Setup . BadHeightDown = STEPUP_HEIGHT ;
coll - > Setup . BadHeightUp = - STEPUP_HEIGHT ;
coll - > Setup . BadCeilingHeight = 0 ;
coll - > Setup . SlopesAreWalls = true ;
GetCollisionInfo ( coll , item ) ;
if ( LaraFallen ( item , coll ) )
{
Lara . gunStatus = LG_NO_ARMS ;
}
else if ( ! TestLaraSlide ( item , coll ) )
{
2021-11-05 21:29:00 +11:00
Lara . keepDucked = TestLaraKeepDucked ( item , coll ) ;
2021-10-04 22:46:39 +11:00
ShiftItem ( item , coll ) ;
if ( coll - > Middle . Floor ! = NO_HEIGHT )
item - > pos . yPos + = coll - > Middle . Floor ;
}
}
// ---------
// CRAWLING:
// ---------
2021-10-16 20:50:16 +11:00
// State: LS_CRAWL_IDLE (80)
2021-10-30 12:45:52 +11:00
// Collision: lara_col_crawl_idle()
void lara_as_crawl_idle ( ITEM_INFO * item , COLL_INFO * coll )
2021-10-16 20:50:16 +11:00
{
2021-10-24 13:27:46 +11:00
Lara . gunStatus = LG_HANDS_BUSY ;
2021-10-16 20:50:16 +11:00
coll - > Setup . EnableSpaz = false ;
coll - > Setup . EnableObjectPush = true ;
2021-11-08 22:24:49 +11:00
Camera . targetElevation = - ANGLE ( 24.0f ) ;
2021-10-16 20:50:16 +11:00
if ( item - > hitPoints < = 0 )
{
item - > goalAnimState = LS_DEATH ;
return ;
}
if ( TrInput & IN_LOOK )
LookUpDown ( ) ;
2021-11-01 17:57:43 +11:00
if ( TrInput & IN_LEFT )
Lara . turnRate = - LARA_CRAWL_TURN ;
else if ( TrInput & IN_RIGHT )
Lara . turnRate = LARA_CRAWL_TURN ;
// TODO: LUA
2021-11-05 22:42:33 +11:00
Lara . NewAnims . CrawlExtended = true ;
2021-10-16 20:50:16 +11:00
if ( ( TrInput & IN_DUCK | | Lara . keepDucked ) & &
Lara . waterStatus ! = LW_WADE )
{
// TODO: Not all weapons are classified as standing weapons??
// TODO: Allow standing vault up 2 steps when spawning flare while standing. @Sezz 2021.10.16
// TODO: Flare not working.
2021-11-11 23:31:04 +11:00
if ( ( TrInput & IN_SPRINT & & TestLaraCrouchRoll ( item , coll ) ) | |
( ( TrInput & ( IN_DRAW | IN_FLARE ) & &
2021-10-16 20:50:16 +11:00
! IsStandingWeapon ( Lara . gunType ) & & // TODO: From here or from crouch, it needs to be consistent.
2021-11-11 23:31:04 +11:00
TestLaraDrawWeaponsFromCrawlIdle ( item ) ) ) )
2021-10-16 20:50:16 +11:00
{
Lara . gunStatus = LG_NO_ARMS ;
item - > goalAnimState = LS_CROUCH_IDLE ;
return ;
}
2021-10-28 23:22:28 +11:00
if ( TrInput & IN_FORWARD )
2021-10-16 20:50:16 +11:00
{
2021-10-28 15:25:25 +11:00
if ( TrInput & ( IN_ACTION | IN_JUMP ) & &
2021-11-05 22:42:33 +11:00
TestLaraCrawlVault ( item , coll ) & &
Lara . NewAnims . CrawlExtended )
2021-10-16 20:50:16 +11:00
{
DoLaraCrawlVault ( item , coll ) ;
2021-10-22 00:07:24 +11:00
return ;
2021-10-16 20:50:16 +11:00
}
2021-11-08 22:24:49 +11:00
else [[likely]]
2021-10-22 00:07:24 +11:00
{
2021-10-16 20:50:16 +11:00
item - > goalAnimState = LS_CRAWL_FORWARD ;
2021-10-22 00:07:24 +11:00
return ;
}
2021-10-16 20:50:16 +11:00
}
else if ( TrInput & IN_BACK )
{
2021-10-28 15:25:25 +11:00
if ( TrInput & ( IN_ACTION | IN_JUMP ) & &
2021-10-17 22:10:01 +11:00
TestLaraCrawlToHang ( item , coll ) )
{
2021-10-18 15:22:38 +11:00
DoLaraCrawlToHangSnap ( item , coll ) ;
2021-10-17 22:10:01 +11:00
item - > goalAnimState = LS_CRAWL_TO_HANG ;
2021-10-22 00:07:24 +11:00
return ;
2021-10-17 22:10:01 +11:00
}
2021-10-24 20:43:02 +11:00
else if ( TestLaraCrawlBack ( item , coll ) ) [[likely]]
2021-10-22 00:07:24 +11:00
{
2021-10-17 22:10:01 +11:00
item - > goalAnimState = LS_CRAWL_BACK ;
2021-10-16 20:50:16 +11:00
2021-10-22 00:07:24 +11:00
return ;
}
2021-10-16 20:50:16 +11:00
}
if ( TrInput & IN_LEFT )
{
item - > goalAnimState = LS_CRAWL_TURN_LEFT ;
return ;
}
else if ( TrInput & IN_RIGHT )
{
item - > goalAnimState = LS_CRAWL_TURN_RIGHT ;
return ;
}
item - > goalAnimState = LS_CRAWL_IDLE ;
return ;
}
Lara . gunStatus = LG_NO_ARMS ;
item - > goalAnimState = LS_CROUCH_IDLE ;
}
// LEGACY
2021-10-30 12:45:52 +11:00
void old_lara_as_crawl_idle ( ITEM_INFO * item , COLL_INFO * coll )
2020-08-10 00:21:45 -05:00
{
2020-09-26 05:06:08 +10:00
/*state 80*/
/*collision: lara_col_all4s*/
2020-08-10 00:21:45 -05:00
if ( item - > hitPoints < = 0 )
{
item - > goalAnimState = LS_DEATH ;
return ;
}
2021-10-08 01:47:16 +03:00
// TODO: Enable with lua!
2021-10-08 01:46:29 +03:00
Lara . NewAnims . Crawl1clickdown = 1 ;
Lara . NewAnims . Crawl1clickup = 1 ;
Lara . NewAnims . CrawlExit1click = 1 ;
Lara . NewAnims . CrawlExit2click = 1 ;
Lara . NewAnims . CrawlExit3click = 1 ;
2021-07-09 19:41:56 -05:00
Lara . NewAnims . CrawlExitJump = 1 ;
if ( TrInput & IN_JUMP & & Lara . NewAnims . CrawlExitJump )
2020-08-10 00:21:45 -05:00
{
GAME_VECTOR s , d ;
MESH_INFO * StaticMesh ;
PHD_VECTOR v ;
if ( LaraFloorFront ( item , item - > pos . yRot , 512 ) > 768 & &
LaraCeilingFront ( item , item - > pos . yRot , 768 , 512 ) ! = NO_HEIGHT & &
LaraCeilingFront ( item , item - > pos . yRot , 768 , 512 ) < = 0 )
{
s . x = LaraItem - > pos . xPos ;
s . y = LaraItem - > pos . yPos - 96 ;
s . z = LaraItem - > pos . zPos ;
s . roomNumber = LaraItem - > roomNumber ;
2020-10-05 22:24:57 -03:00
d . x = s . x + 768 * phd_sin ( LaraItem - > pos . yRot ) ;
2021-08-26 13:47:47 +03:00
d . y = s . y + LARA_HEADROOM ;
2020-10-05 22:24:57 -03:00
d . z = s . z + 768 * phd_cos ( LaraItem - > pos . yRot ) ;
2020-08-10 00:21:45 -05:00
if ( LOS ( & s , & d ) & & item - > animNumber ! = LA_CROUCH_TO_CRAWL_START & & item - > animNumber ! = LA_CROUCH_TO_CRAWL_CONTINUE )
{
// TODO: fix ObjectOnLOS2
2021-09-13 10:22:00 +03:00
/*if (ObjectOnLOS2(&s, &d, &v, (PHD_VECTOR*)&StaticMesh) == NO_LOS_ITEM)
2020-08-10 00:21:45 -05:00
{ */
item - > animNumber = LA_CRAWL_JUMP_FLIP_DOWN ;
item - > frameNumber = g_Level . Anims [ item - > animNumber ] . frameBase ;
item - > goalAnimState = LS_MISC_CONTROL ;
item - > currentAnimState = LS_MISC_CONTROL ;
Lara . gunStatus = LG_HANDS_BUSY ;
/*}*/
}
}
else if ( LaraFloorFront ( item , item - > pos . yRot , 256 ) = = 768 & &
LaraCeilingFront ( item , item - > pos . yRot , 768 , 512 ) ! = NO_HEIGHT & &
LaraCeilingFront ( item , item - > pos . yRot , 768 , 512 ) < = 0 )
{
s . x = LaraItem - > pos . xPos ;
s . y = LaraItem - > pos . yPos - 96 ;
s . z = LaraItem - > pos . zPos ;
s . roomNumber = LaraItem - > roomNumber ;
2020-10-05 22:24:57 -03:00
d . x = s . x + 768 * phd_sin ( LaraItem - > pos . yRot ) ;
2021-08-26 13:47:47 +03:00
d . y = s . y + LARA_HEADROOM ;
2020-10-05 22:24:57 -03:00
d . z = s . z + 768 * phd_cos ( LaraItem - > pos . yRot ) ;
2020-08-10 00:21:45 -05:00
2021-07-08 14:15:14 -05:00
if ( LOS ( & s , & d ) & & item - > animNumber ! = LA_CROUCH_TO_CRAWL_START & & item - > animNumber ! = LA_CROUCH_TO_CRAWL_CONTINUE & & Lara . NewAnims . CrawlExit3click )
2020-08-10 00:21:45 -05:00
{
item - > animNumber = LA_CRAWL_JUMP_DOWN_23CLICK ;
item - > frameNumber = g_Level . Anims [ item - > animNumber ] . frameBase ;
item - > goalAnimState = LS_MISC_CONTROL ;
item - > currentAnimState = LS_MISC_CONTROL ;
Lara . gunStatus = LG_HANDS_BUSY ;
}
}
else if ( LaraFloorFront ( item , item - > pos . yRot , 256 ) = = 512 & &
LaraCeilingFront ( item , item - > pos . yRot , 768 , 512 ) ! = NO_HEIGHT & &
LaraCeilingFront ( item , item - > pos . yRot , 768 , 512 ) < = 0 )
{
s . x = LaraItem - > pos . xPos ;
s . y = LaraItem - > pos . yPos - 96 ;
s . z = LaraItem - > pos . zPos ;
s . roomNumber = LaraItem - > roomNumber ;
2020-10-05 22:24:57 -03:00
d . x = s . x + 768 * phd_sin ( LaraItem - > pos . yRot ) ;
2021-08-26 13:47:47 +03:00
d . y = s . y + LARA_HEADROOM ;
2020-10-05 22:24:57 -03:00
d . z = s . z + 768 * phd_cos ( LaraItem - > pos . yRot ) ;
2020-08-10 00:21:45 -05:00
2021-07-08 14:15:14 -05:00
if ( LOS ( & s , & d ) & & item - > animNumber ! = LA_CROUCH_TO_CRAWL_START & & item - > animNumber ! = LA_CROUCH_TO_CRAWL_CONTINUE & & Lara . NewAnims . CrawlExit2click )
2020-08-10 00:21:45 -05:00
{
item - > animNumber = LA_CRAWL_JUMP_DOWN_23CLICK ;
item - > frameNumber = g_Level . Anims [ item - > animNumber ] . frameBase ;
item - > goalAnimState = LS_MISC_CONTROL ;
item - > currentAnimState = LS_MISC_CONTROL ;
Lara . gunStatus = LG_HANDS_BUSY ;
}
}
else if ( LaraFloorFront ( item , item - > pos . yRot , 256 ) = = 256 & &
LaraCeilingFront ( item , item - > pos . yRot , 768 , 512 ) ! = NO_HEIGHT & &
LaraCeilingFront ( item , item - > pos . yRot , 768 , 512 ) < = 0 )
{
s . x = LaraItem - > pos . xPos ;
s . y = LaraItem - > pos . yPos - 96 ;
s . z = LaraItem - > pos . zPos ;
s . roomNumber = LaraItem - > roomNumber ;
2020-10-05 22:24:57 -03:00
d . x = s . x + 768 * phd_sin ( LaraItem - > pos . yRot ) ;
2021-08-26 13:47:47 +03:00
d . y = s . y + LARA_HEADROOM ;
2020-10-05 22:24:57 -03:00
d . z = s . z + 768 * phd_cos ( LaraItem - > pos . yRot ) ;
2020-08-10 00:21:45 -05:00
2021-07-08 14:15:14 -05:00
if ( LOS ( & s , & d ) & & item - > animNumber ! = LA_CROUCH_TO_CRAWL_START & & item - > animNumber ! = LA_CROUCH_TO_CRAWL_CONTINUE & & Lara . NewAnims . CrawlExit1click )
2020-08-10 00:21:45 -05:00
{
item - > animNumber = LA_CRAWL_JUMP_DOWN_1CLICK ;
item - > frameNumber = g_Level . Anims [ item - > animNumber ] . frameBase ;
item - > goalAnimState = LS_MISC_CONTROL ;
item - > currentAnimState = LS_MISC_CONTROL ;
Lara . gunStatus = LG_HANDS_BUSY ;
2020-09-26 05:06:08 +10:00
2020-08-10 00:21:45 -05:00
}
}
2020-09-26 05:06:08 +10:00
2020-08-10 00:21:45 -05:00
}
2020-09-26 05:06:08 +10:00
if ( ( TrInput & IN_ACTION ) & & ( TrInput & IN_FORWARD ) & & item - > animNumber ! = LA_CROUCH_TO_CRAWL_START & & item - > animNumber ! = LA_CROUCH_TO_CRAWL_CONTINUE )
2020-08-10 00:21:45 -05:00
{
if ( LaraFloorFront ( item , item - > pos . yRot , 256 ) = = - 256 & &
LaraCeilingFront ( item , item - > pos . yRot , 256 , 256 ) ! = NO_HEIGHT & &
2021-07-08 14:15:14 -05:00
LaraCeilingFront ( item , item - > pos . yRot , 256 , 256 ) < = - 512 & &
Lara . NewAnims . Crawl1clickup )
2020-08-10 00:21:45 -05:00
{
2020-09-26 05:06:08 +10:00
item - > animNumber = LA_CRAWL_UP_STEP ;
item - > frameNumber = g_Level . Anims [ item - > animNumber ] . frameBase ;
item - > goalAnimState = LS_MISC_CONTROL ;
item - > currentAnimState = LS_MISC_CONTROL ;
2020-08-10 00:21:45 -05:00
}
else
if ( LaraFloorFront ( item , item - > pos . yRot , 256 ) = = 256 & &
LaraCeilingFront ( item , item - > pos . yRot , 256 , 256 ) ! = NO_HEIGHT & &
2021-07-08 14:15:14 -05:00
LaraCeilingFront ( item , item - > pos . yRot , 256 , - 256 ) < = - 512 & &
Lara . NewAnims . Crawl1clickdown )
2020-08-10 00:21:45 -05:00
{
2020-09-26 05:06:08 +10:00
item - > animNumber = LA_CRAWL_DOWN_STEP ;
item - > frameNumber = g_Level . Anims [ item - > animNumber ] . frameBase ;
item - > goalAnimState = LS_MISC_CONTROL ;
item - > currentAnimState = LS_MISC_CONTROL ;
2020-08-10 00:21:45 -05:00
}
}
Lara . gunStatus = LG_HANDS_BUSY ;
if ( TrInput & IN_LOOK )
LookUpDown ( ) ;
Lara . torsoXrot = 0 ;
Lara . torsoYrot = 0 ;
2021-09-10 00:20:59 +03:00
coll - > Setup . EnableSpaz = false ;
coll - > Setup . EnableObjectPush = true ;
2020-08-10 00:21:45 -05:00
if ( item - > animNumber = = LA_CROUCH_TO_CRAWL_START )
Lara . gunStatus = LG_HANDS_BUSY ;
2020-09-26 05:06:08 +10:00
Camera . targetElevation = - ANGLE ( 23.0f ) ;
2020-08-10 00:21:45 -05:00
2021-11-07 13:26:45 +11:00
if ( TestLaraWater ( item ) )
2020-08-10 00:21:45 -05:00
{
item - > goalAnimState = LS_CROUCH_IDLE ;
item - > requiredAnimState = LS_STOP ;
}
}
2021-10-16 20:50:16 +11:00
// State: LS_CRAWL_IDLE (80)
2021-10-30 12:45:52 +11:00
// Control: lara_as_crawl_idle()
void lara_col_crawl_idle ( ITEM_INFO * item , COLL_INFO * coll )
2021-10-16 20:50:16 +11:00
{
2021-11-05 21:29:00 +11:00
Lara . keepDucked = TestLaraKeepDucked ( item , coll ) ;
2021-10-16 20:50:16 +11:00
Lara . isDucked = true ;
2021-11-05 17:50:53 +11:00
Lara . moveAngle = item - > pos . yRot ;
2021-10-28 23:57:49 +11:00
Lara . torsoXrot = 0 ; // TODO: More pleasing reset. @Sezz 2021.10.28
Lara . torsoYrot = 0 ;
2021-10-16 20:50:16 +11:00
item - > fallspeed = 0 ;
item - > gravityStatus = false ;
coll - > Setup . ForwardAngle = Lara . moveAngle ;
coll - > Setup . Radius = LARA_RAD_CRAWL ;
coll - > Setup . Height = LARA_HEIGHT_CRAWL ;
coll - > Setup . BadHeightDown = STEP_SIZE - 1 ;
2021-10-18 20:15:53 +11:00
coll - > Setup . BadHeightUp = - ( STEP_SIZE - 1 ) ;
2021-10-16 20:50:16 +11:00
coll - > Setup . BadCeilingHeight = LARA_HEIGHT_CRAWL ;
coll - > Setup . SlopesAreWalls = true ;
coll - > Setup . SlopesArePits = true ;
GetCollisionInfo ( coll , item ) ;
if ( TestLaraFall ( coll ) )
{
Lara . gunStatus = LG_NO_ARMS ;
SetLaraFallState ( item ) ;
return ;
}
if ( TestLaraSlide ( item , coll ) )
return ;
ShiftItem ( item , coll ) ;
if ( coll - > Middle . Floor ! = NO_HEIGHT & & coll - > Middle . Floor > - 256 )
item - > pos . yPos + = coll - > Middle . Floor ;
}
// LEGACY
2021-10-30 12:45:52 +11:00
void old_lara_col_crawl_idle ( ITEM_INFO * item , COLL_INFO * coll )
2020-08-10 00:21:45 -05:00
{
2020-09-26 05:06:08 +10:00
/*state 80*/
/*state code: lara_as_all4s*/
2020-08-10 00:21:45 -05:00
item - > fallspeed = 0 ;
item - > gravityStatus = false ;
2020-09-26 05:06:08 +10:00
if ( item - > goalAnimState ! = LS_CRAWL_TO_HANG )
2020-08-10 00:21:45 -05:00
{
2020-12-19 23:34:52 -03:00
Lara . moveAngle = item - > pos . yRot ;
2020-08-10 00:21:45 -05:00
2021-09-19 06:42:24 +03:00
coll - > Setup . ForwardAngle = Lara . moveAngle ;
2021-09-10 01:22:27 +03:00
coll - > Setup . Radius = LARA_RAD_CRAWL ;
2021-09-19 06:42:24 +03:00
coll - > Setup . Height = LARA_HEIGHT_CRAWL ;
2021-09-19 17:48:32 +03:00
coll - > Setup . BadHeightDown = STEP_SIZE - 1 ;
coll - > Setup . BadHeightUp = - 127 ;
2021-09-13 09:47:37 +03:00
coll - > Setup . BadCeilingHeight = LARA_HEIGHT_CRAWL ;
2021-09-10 00:20:59 +03:00
coll - > Setup . SlopesAreWalls = true ;
coll - > Setup . SlopesArePits = true ;
2020-08-10 00:21:45 -05:00
2021-09-19 06:42:24 +03:00
GetCollisionInfo ( coll , item ) ;
2020-08-10 00:21:45 -05:00
2020-09-26 05:06:08 +10:00
if ( LaraFallen ( item , coll ) )
{
Lara . gunStatus = LG_NO_ARMS ;
}
else if ( ! TestLaraSlide ( item , coll ) )
{
2021-09-10 00:18:47 +03:00
int slope = abs ( coll - > FrontLeft . Floor - coll - > FrontRight . Floor ) ;
2020-08-10 00:21:45 -05:00
2021-11-05 21:29:00 +11:00
Lara . keepDucked = TestLaraKeepDucked ( item , coll ) ;
2020-09-26 05:06:08 +10:00
ShiftItem ( item , coll ) ;
2020-09-26 03:28:30 +10:00
2021-09-10 00:18:47 +03:00
if ( coll - > Middle . Floor ! = NO_HEIGHT & & coll - > Middle . Floor > - 256 )
item - > pos . yPos + = coll - > Middle . Floor ;
2020-09-26 03:28:30 +10:00
2020-09-26 05:06:08 +10:00
if ( TrInput & IN_DUCK | | Lara . keepDucked & &
( ! ( TrInput & IN_FLARE ) & & ! ( TrInput & IN_DRAW ) | | TrInput & IN_FORWARD ) & &
Lara . waterStatus ! = LW_WADE )
2020-08-10 00:21:45 -05:00
{
2020-09-26 05:06:08 +10:00
if ( item - > animNumber = = LA_CRAWL_IDLE | |
item - > animNumber = = LA_CROUCH_TO_CRAWL_END | |
item - > animNumber = = LA_CRAWL_TO_IDLE_END_RIGHT_POINTLESS | |
item - > animNumber = = LA_CRAWL_TO_IDLE_END_LEFT_POINTLESS )
2020-08-10 00:21:45 -05:00
{
2020-09-26 05:06:08 +10:00
if ( TrInput & IN_FORWARD )
2020-08-10 00:21:45 -05:00
{
2021-08-24 16:54:26 +03:00
auto collResult = LaraCollisionFront ( item , item - > pos . yRot , 256 ) ;
2021-09-25 13:41:01 +03:00
if ( abs ( collResult . Position . Floor ) < 127 & & ! collResult . Position . Slope )
2020-09-26 05:06:08 +10:00
item - > goalAnimState = LS_CRAWL_FORWARD ;
2020-08-10 00:21:45 -05:00
}
2020-09-26 05:06:08 +10:00
else if ( TrInput & IN_BACK )
2020-09-26 03:28:30 +10:00
{
2020-09-26 05:06:08 +10:00
short height = LaraCeilingFront ( item , item - > pos . yRot , - 300 , 128 ) ;
short heightl = 0 ;
short heightr = 0 ;
2021-01-28 13:30:23 -03:00
if ( height ! = NO_HEIGHT & & height < = - 256 )
2020-08-10 00:21:45 -05:00
{
2020-09-26 05:06:08 +10:00
if ( TrInput & IN_ACTION )
2020-08-10 00:21:45 -05:00
{
int x = item - > pos . xPos ;
int z = item - > pos . zPos ;
2020-10-05 22:24:57 -03:00
item - > pos . xPos + = 128 * phd_sin ( item - > pos . yRot - ANGLE ( 90.0f ) ) ;
item - > pos . zPos + = 128 * phd_cos ( item - > pos . yRot - ANGLE ( 90.0f ) ) ;
2020-09-26 05:06:08 +10:00
heightl = LaraFloorFront ( item , item - > pos . yRot , - 300 ) ;
2020-08-10 00:21:45 -05:00
2020-10-05 22:24:57 -03:00
item - > pos . xPos + = 256 * phd_sin ( item - > pos . yRot + ANGLE ( 90.0f ) ) ;
item - > pos . zPos + = 256 * phd_cos ( item - > pos . yRot + ANGLE ( 90.0f ) ) ;
2020-09-26 05:06:08 +10:00
heightr = LaraFloorFront ( item , item - > pos . yRot , - 300 ) ;
2020-08-10 00:21:45 -05:00
item - > pos . xPos = x ;
item - > pos . zPos = z ;
2020-09-26 05:06:08 +10:00
}
2020-08-10 00:21:45 -05:00
2021-08-24 16:54:26 +03:00
auto collResult = LaraCollisionFront ( item , item - > pos . yRot , - 300 ) ;
2021-09-10 00:43:26 +03:00
height = collResult . Position . Floor ;
2020-09-26 05:06:08 +10:00
2021-09-17 22:55:09 +03:00
if ( abs ( height ) > = STEP_SIZE - 1 | | collResult . Position . Slope )
2020-09-26 05:06:08 +10:00
{
if ( TrInput & IN_ACTION )
2020-08-10 00:21:45 -05:00
{
2020-09-26 05:06:08 +10:00
if ( height > 768 & &
heightl > 768 & &
heightr > 768 & &
slope < 120 )
2020-08-10 00:21:45 -05:00
{
2020-09-26 05:06:08 +10:00
int tmp ;
int x = item - > pos . xPos ;
int z = item - > pos . zPos ;
2021-09-10 00:20:59 +03:00
item - > pos . xPos - = 100 * phd_sin ( coll - > Setup . ForwardAngle ) ;
item - > pos . zPos - = 100 * phd_cos ( coll - > Setup . ForwardAngle ) ;
2020-09-26 05:06:08 +10:00
2021-01-29 01:14:20 -03:00
tmp = GetCollidedObjects ( item , 100 , 1 , CollidedItems , CollidedMeshes , 0 ) ;
2020-09-26 05:06:08 +10:00
item - > pos . xPos = x ;
item - > pos . zPos = z ;
if ( ! tmp )
{
2021-10-26 18:05:16 +03:00
coll - > Setup . ForwardAngle + = ANGLE ( 180 ) ;
GetCollisionInfo ( coll , item ) ;
SnapItemToLedge ( item , coll ) ;
MoveItem ( item , coll - > Setup . ForwardAngle , - ( coll - > Setup . Radius - STEP_SIZE / 2 ) ) ;
item - > pos . yRot + = ANGLE ( 180 ) ;
LaraResetGravityStatus ( item , coll ) ;
2020-09-26 05:06:08 +10:00
item - > goalAnimState = LS_CRAWL_TO_HANG ;
}
2020-08-10 00:21:45 -05:00
}
}
}
2021-09-04 07:53:21 +02:00
else if ( ! ( abs ( height ) > = STEP_SIZE ) )
2020-09-26 05:06:08 +10:00
{
item - > goalAnimState = LS_CRAWL_BACK ;
}
2020-08-10 00:21:45 -05:00
}
}
2020-09-26 05:06:08 +10:00
else if ( TrInput & IN_LEFT )
2020-08-10 00:21:45 -05:00
{
2020-09-26 05:06:08 +10:00
item - > animNumber = LA_CRAWL_TURN_LEFT ;
item - > frameNumber = g_Level . Anims [ item - > animNumber ] . frameBase ;
item - > currentAnimState = LS_CRAWL_TURN_LEFT ;
item - > goalAnimState = LS_CRAWL_TURN_LEFT ;
}
else if ( TrInput & IN_RIGHT )
{
item - > animNumber = LA_CRAWL_TURN_RIGHT ;
item - > frameNumber = g_Level . Anims [ item - > animNumber ] . frameBase ;
item - > currentAnimState = LS_CRAWL_TURN_RIGHT ;
item - > goalAnimState = LS_CRAWL_TURN_RIGHT ;
2020-08-10 00:21:45 -05:00
}
}
}
2020-09-26 05:06:08 +10:00
else
2020-08-10 00:21:45 -05:00
{
2020-09-26 05:06:08 +10:00
item - > goalAnimState = LS_CROUCH_IDLE ;
2020-08-10 00:21:45 -05:00
}
}
}
2020-09-26 03:28:30 +10:00
}
2020-08-10 00:21:45 -05:00
2021-10-04 23:52:23 +11:00
// State: LS_CRAWL_FORWARD (81)
2021-10-30 12:45:52 +11:00
// Collision: lara_col_crawl_forward()
void lara_as_crawl_forward ( ITEM_INFO * item , COLL_INFO * coll )
2021-10-04 23:52:23 +11:00
{
2021-11-08 22:24:49 +11:00
Lara . keepDucked = TestLaraKeepDucked ( item , coll ) ;
2021-10-24 13:27:46 +11:00
Lara . gunStatus = LG_HANDS_BUSY ;
2021-10-04 23:52:23 +11:00
coll - > Setup . EnableSpaz = false ;
coll - > Setup . EnableObjectPush = true ;
2021-11-08 22:24:49 +11:00
Camera . targetElevation = - ANGLE ( 24.0f ) ;
2021-10-04 23:52:23 +11:00
if ( item - > hitPoints < = 0 )
{
2021-10-18 20:15:53 +11:00
item - > goalAnimState = LS_DEATH ;
2021-10-04 23:52:23 +11:00
return ;
}
if ( TrInput & IN_LEFT )
{
Lara . turnRate - = LARA_TURN_RATE ;
if ( Lara . turnRate < - LARA_SLOW_TURN )
Lara . turnRate = - LARA_SLOW_TURN ;
// TODO: Flexing.
/*Lara.headZrot -= (Lara.headZrot + LARA_CRAWL_FLEX) / 12;
Lara . torsoZrot = Lara . headZrot ; */
}
else if ( TrInput & IN_RIGHT )
{
Lara . turnRate + = LARA_TURN_RATE ;
if ( Lara . turnRate > LARA_SLOW_TURN )
Lara . turnRate = LARA_SLOW_TURN ;
/*Lara.headZrot += (LARA_CRAWL_FLEX - Lara.headZrot) / 12;
Lara . torsoZrot = Lara . headZrot ; */
}
2021-10-22 00:07:24 +11:00
// TODO: Probe ahead please.
2021-10-13 19:50:46 +11:00
if ( ( TrInput & IN_DUCK | | Lara . keepDucked ) & &
Lara . waterStatus ! = LW_WADE )
2021-10-04 23:52:23 +11:00
{
2021-11-11 23:31:04 +11:00
if ( TrInput & IN_SPRINT & & TestLaraCrouchRoll ( item , coll ) )
2021-10-28 15:25:25 +11:00
{
item - > goalAnimState = LS_CRAWL_IDLE ;
return ;
}
2021-10-04 23:52:23 +11:00
if ( TrInput & IN_FORWARD )
{
2021-10-28 15:25:25 +11:00
if ( TrInput & ( IN_ACTION | IN_JUMP ) & &
2021-11-05 22:42:33 +11:00
TestLaraCrawlVault ( item , coll ) & &
Lara . NewAnims . CrawlExtended )
2021-10-24 20:43:02 +11:00
{
DoLaraCrawlVault ( item , coll ) ;
2021-10-28 23:22:28 +11:00
return ;
2021-10-24 20:43:02 +11:00
}
2021-11-08 22:24:49 +11:00
else [[likely]]
2021-10-28 23:22:28 +11:00
{
2021-10-24 20:43:02 +11:00
item - > goalAnimState = LS_CRAWL_FORWARD ;
2021-10-04 23:52:23 +11:00
2021-10-28 23:22:28 +11:00
return ;
}
2021-10-04 23:52:23 +11:00
}
item - > goalAnimState = LS_CRAWL_IDLE ;
return ;
}
item - > goalAnimState = LS_CRAWL_IDLE ;
}
// LEGACY
2021-10-30 12:45:52 +11:00
void old_lara_as_crawl_forward ( ITEM_INFO * item , COLL_INFO * coll )
2020-09-26 03:28:30 +10:00
{
2020-09-26 05:06:08 +10:00
/*state 81*/
/*collision: lara_col_crawl*/
2021-07-09 19:41:56 -05:00
if ( item - > hitPoints < = 0 )
2020-09-26 05:06:08 +10:00
{
item - > goalAnimState = LS_CRAWL_IDLE ;
return ;
}
if ( TrInput & IN_LOOK )
LookUpDown ( ) ;
Lara . torsoXrot = 0 ;
2020-08-10 00:21:45 -05:00
Lara . torsoYrot = 0 ;
2021-09-10 00:20:59 +03:00
coll - > Setup . EnableSpaz = false ;
coll - > Setup . EnableObjectPush = true ;
2020-08-10 00:21:45 -05:00
2020-09-26 05:06:08 +10:00
Camera . targetElevation = - ANGLE ( 23.0f ) ;
2020-08-10 00:21:45 -05:00
2020-09-26 05:06:08 +10:00
if ( TrInput & IN_FORWARD
& & ( TrInput & IN_DUCK | | Lara . keepDucked )
& & Lara . waterStatus ! = LW_WADE )
2020-08-10 00:21:45 -05:00
{
2020-09-26 05:06:08 +10:00
if ( TrInput & IN_LEFT )
2020-08-10 00:21:45 -05:00
{
2020-09-26 05:06:08 +10:00
Lara . turnRate - = LARA_TURN_RATE ;
2020-08-10 00:21:45 -05:00
2020-09-26 05:06:08 +10:00
if ( Lara . turnRate < - ANGLE ( 3.0f ) )
Lara . turnRate = - ANGLE ( 3.0f ) ;
}
else if ( TrInput & IN_RIGHT )
2020-09-26 03:28:30 +10:00
{
2020-09-26 05:06:08 +10:00
Lara . turnRate + = LARA_TURN_RATE ;
if ( Lara . turnRate > ANGLE ( 3.0f ) )
Lara . turnRate = ANGLE ( 3.0f ) ;
2020-08-10 00:21:45 -05:00
}
}
2020-09-26 05:06:08 +10:00
else
2020-08-10 00:21:45 -05:00
{
2020-09-26 05:06:08 +10:00
item - > goalAnimState = LS_CRAWL_IDLE ;
2020-08-10 00:21:45 -05:00
}
}
2021-10-11 23:16:02 +11:00
// State: LS_CRAWL_FORWARD (81)
2021-10-30 12:45:52 +11:00
// Control: lara_as_crawl_forward()
void lara_col_crawl_forward ( ITEM_INFO * item , COLL_INFO * coll )
2021-10-11 23:16:02 +11:00
{
2021-11-05 21:29:00 +11:00
Lara . keepDucked = TestLaraKeepDucked ( item , coll ) ;
2021-10-11 23:16:02 +11:00
Lara . isDucked = true ;
2021-11-05 17:50:53 +11:00
Lara . moveAngle = item - > pos . yRot ;
2021-10-28 23:57:49 +11:00
Lara . torsoXrot = 0 ;
Lara . torsoYrot = 0 ;
2021-10-11 23:16:02 +11:00
item - > gravityStatus = false ;
item - > fallspeed = 0 ;
coll - > Setup . Radius = LARA_RAD_CRAWL ;
coll - > Setup . Height = LARA_HEIGHT_CRAWL ;
2021-10-18 20:15:53 +11:00
coll - > Setup . BadHeightDown = STEP_SIZE - 1 ; // Offset of 1 is required or Lara will crawl up/down steps.
2021-11-01 00:18:29 +11:00
coll - > Setup . BadHeightUp = - ( STEP_SIZE - 1 ) ; // TODO: Stepping approach is different from walk/run because new anims do not submerge Lara. Resolve this. @Sezz 2021.10.31
2021-10-11 23:16:02 +11:00
coll - > Setup . BadCeilingHeight = LARA_HEIGHT_CRAWL ;
coll - > Setup . SlopesArePits = true ;
coll - > Setup . SlopesAreWalls = true ;
coll - > Setup . ForwardAngle = Lara . moveAngle ;
GetCollisionInfo ( coll , item , true ) ;
if ( LaraDeflectEdgeDuck ( item , coll ) )
2021-11-08 22:24:49 +11:00
LaraCollideStopCrawl ( item , coll ) ;
2021-10-11 23:16:02 +11:00
if ( TestLaraFall ( coll ) )
{
Lara . gunStatus = LG_NO_ARMS ;
SetLaraFallState ( item ) ;
return ;
}
if ( TestLaraSlide ( item , coll ) )
return ;
ShiftItem ( item , coll ) ;
if ( TestLaraStep ( coll ) )
{
DoLaraStep ( item , coll ) ;
return ;
}
// LEGACY step.
/*if (coll->Middle.Floor != NO_HEIGHT && coll->Middle.Floor > -256)
item - > pos . yPos + = coll - > Middle . Floor ; */
}
// LEGACY
2021-10-30 12:45:52 +11:00
void old_lara_col_crawl_forward ( ITEM_INFO * item , COLL_INFO * coll )
2020-08-10 00:21:45 -05:00
{
2020-09-26 05:06:08 +10:00
/*state 81*/
/*state code: lara_as_crawl*/
2020-08-10 00:21:45 -05:00
item - > gravityStatus = false ;
item - > fallspeed = 0 ;
2020-12-19 23:34:52 -03:00
Lara . moveAngle = item - > pos . yRot ;
2020-09-26 05:06:08 +10:00
2021-09-10 01:22:27 +03:00
coll - > Setup . Radius = LARA_RAD_CRAWL ;
2021-09-19 06:42:24 +03:00
coll - > Setup . Height = LARA_HEIGHT_CRAWL ;
2021-09-19 17:48:32 +03:00
coll - > Setup . BadHeightDown = STEP_SIZE - 1 ;
coll - > Setup . BadHeightUp = - 127 ;
2021-09-13 09:47:37 +03:00
coll - > Setup . BadCeilingHeight = LARA_HEIGHT_CRAWL ;
2021-09-10 00:20:59 +03:00
coll - > Setup . SlopesArePits = true ;
coll - > Setup . SlopesAreWalls = true ;
coll - > Setup . ForwardAngle = Lara . moveAngle ;
2020-08-10 00:21:45 -05:00
2021-09-19 06:42:24 +03:00
GetCollisionInfo ( coll , item , true ) ;
2020-08-10 00:21:45 -05:00
2020-09-26 05:06:08 +10:00
if ( LaraDeflectEdgeDuck ( item , coll ) )
2020-08-10 00:21:45 -05:00
{
item - > currentAnimState = LS_CRAWL_IDLE ;
item - > goalAnimState = LS_CRAWL_IDLE ;
if ( item - > animNumber ! = LA_CRAWL_IDLE )
{
item - > animNumber = LA_CRAWL_IDLE ;
item - > frameNumber = g_Level . Anims [ item - > animNumber ] . frameBase ;
}
}
2020-09-26 05:06:08 +10:00
else if ( LaraFallen ( item , coll ) )
2020-08-10 00:21:45 -05:00
{
Lara . gunStatus = LG_NO_ARMS ;
}
2020-09-26 05:06:08 +10:00
else if ( ! TestLaraSlide ( item , coll ) )
2020-08-10 00:21:45 -05:00
{
2020-09-26 05:06:08 +10:00
ShiftItem ( item , coll ) ;
2020-08-10 00:21:45 -05:00
2021-09-10 00:18:47 +03:00
if ( coll - > Middle . Floor ! = NO_HEIGHT & & coll - > Middle . Floor > - 256 )
item - > pos . yPos + = coll - > Middle . Floor ;
2020-08-10 00:21:45 -05:00
}
2020-09-26 03:28:30 +10:00
}
2020-08-10 00:21:45 -05:00
2021-10-11 23:16:02 +11:00
// State: LS_CRAWL_BACK (86)
2021-10-30 12:45:52 +11:00
// Collision: lara_col_crawl_back()
void lara_as_crawl_back ( ITEM_INFO * item , COLL_INFO * coll )
2021-10-05 00:12:22 +11:00
{
2021-10-24 13:27:46 +11:00
Lara . gunStatus = LG_HANDS_BUSY ;
2021-10-05 00:12:22 +11:00
coll - > Setup . EnableSpaz = false ;
coll - > Setup . EnableObjectPush = true ;
2021-11-08 22:24:49 +11:00
Camera . targetElevation = - ANGLE ( 24.0f ) ;
2021-10-05 00:12:22 +11:00
if ( item - > hitPoints < = 0 )
{
2021-10-06 14:03:12 +11:00
item - > goalAnimState = LS_DEATH ;
2021-10-05 00:12:22 +11:00
return ;
}
if ( TrInput & IN_LEFT )
{
2021-10-05 18:03:37 +11:00
Lara . turnRate - = LARA_TURN_RATE ;
if ( Lara . turnRate < - LARA_SLOW_TURN )
Lara . turnRate = - LARA_SLOW_TURN ;
2021-10-05 00:12:22 +11:00
// TODO: Flexing.
/*Lara.headZrot -= (Lara.headZrot + LARA_CRAWL_FLEX) / 12;
Lara . torsoZrot = Lara . headZrot ; */
}
else if ( TrInput & IN_RIGHT )
{
2021-10-05 18:03:37 +11:00
Lara . turnRate + = LARA_TURN_RATE ;
if ( Lara . turnRate > LARA_SLOW_TURN )
Lara . turnRate = LARA_SLOW_TURN ;
2021-10-05 00:12:22 +11:00
/*Lara.headZrot += (LARA_CRAWL_FLEX - Lara.headZrot) / 12;
Lara . torsoZrot = Lara . headZrot ; */
}
if ( ( TrInput & IN_DUCK | | Lara . keepDucked )
& & Lara . waterStatus ! = LW_WADE )
{
if ( TrInput & IN_BACK )
{
2021-10-18 15:22:38 +11:00
// TODO: Not quite working.
2021-10-28 15:25:25 +11:00
if ( TrInput & ( IN_ACTION | IN_JUMP ) & &
2021-10-18 15:22:38 +11:00
TestLaraCrawlToHang ( item , coll ) )
{
DoLaraCrawlToHangSnap ( item , coll ) ;
item - > goalAnimState = LS_CRAWL_TO_HANG ;
2021-11-06 19:35:48 +11:00
return ;
2021-10-18 15:22:38 +11:00
}
2021-11-06 19:35:48 +11:00
else if ( TestLaraCrawlForward ( item , coll ) & &
coll - > CollisionType ! = CT_FRONT & &
coll - > CollisionType ! = CT_TOP_FRONT ) [[likely]]
{
2021-10-18 15:22:38 +11:00
item - > goalAnimState = LS_CRAWL_BACK ;
2021-10-05 00:12:22 +11:00
2021-11-06 19:35:48 +11:00
return ;
}
2021-10-05 00:12:22 +11:00
}
item - > goalAnimState = LS_CRAWL_IDLE ;
return ;
}
item - > goalAnimState = LS_CRAWL_IDLE ;
}
2021-10-11 23:16:02 +11:00
// State: LS_CRAWL_BACK (86)
2021-10-30 12:45:52 +11:00
// Control: lara_as_crawl_back()
void lara_col_crawl_back ( ITEM_INFO * item , COLL_INFO * coll )
2020-09-26 05:06:08 +10:00
{
2021-11-05 21:29:00 +11:00
Lara . keepDucked = TestLaraKeepDucked ( item , coll ) ;
2021-10-11 23:16:02 +11:00
Lara . isDucked = true ;
2021-11-05 17:50:53 +11:00
Lara . moveAngle = item - > pos . yRot + ANGLE ( 180.0f ) ;
2021-10-11 23:16:02 +11:00
item - > gravityStatus = false ;
item - > fallspeed = 0 ;
coll - > Setup . Radius = LARA_RAD_CRAWL ;
coll - > Setup . Height = LARA_HEIGHT_CRAWL ;
2021-10-18 20:15:53 +11:00
coll - > Setup . BadHeightDown = STEP_SIZE - 1 ; // Offset of 1 is required or Lara will crawl up/down steps.
2021-10-11 23:16:02 +11:00
coll - > Setup . BadHeightUp = - ( STEP_SIZE - 1 ) ;
coll - > Setup . BadCeilingHeight = LARA_HEIGHT_CRAWL ;
coll - > Setup . SlopesArePits = true ;
coll - > Setup . SlopesAreWalls = true ;
coll - > Setup . ForwardAngle = Lara . moveAngle ;
GetCollisionInfo ( coll , item , true ) ;
if ( LaraDeflectEdgeDuck ( item , coll ) )
2021-11-08 22:24:49 +11:00
LaraCollideStopCrawl ( item , coll ) ;
2020-08-10 00:21:45 -05:00
2021-10-11 23:16:02 +11:00
if ( TestLaraFall ( coll ) )
{
Lara . gunStatus = LG_NO_ARMS ;
SetLaraFallState ( item ) ;
2020-08-10 00:21:45 -05:00
2021-10-11 23:16:02 +11:00
return ;
}
2020-08-10 00:21:45 -05:00
2021-10-11 23:16:02 +11:00
if ( TestLaraSlide ( item , coll ) )
return ;
ShiftItem ( item , coll ) ;
if ( TestLaraStep ( coll ) )
2020-08-10 00:21:45 -05:00
{
2021-10-11 23:16:02 +11:00
DoLaraStep ( item , coll ) ;
return ;
2020-08-10 00:21:45 -05:00
}
2021-10-11 23:16:02 +11:00
// LEGACY step
/*if (coll->Middle.Floor != NO_HEIGHT && coll->Middle.Floor > -STEP_SIZE)
item - > pos . yPos + = coll - > Middle . Floor ; */
2020-08-10 00:21:45 -05:00
}
2021-10-11 23:16:02 +11:00
// LEGACY
2021-10-30 12:45:52 +11:00
void old_lara_col_crawl_back ( ITEM_INFO * item , COLL_INFO * coll )
2020-08-10 00:21:45 -05:00
{
2020-09-26 05:06:08 +10:00
/*state 86*/
/*state code: lara_as_crawlb*/
2020-08-10 00:21:45 -05:00
item - > gravityStatus = false ;
item - > fallspeed = 0 ;
2021-09-19 06:42:24 +03:00
Lara . moveAngle = item - > pos . yRot + ANGLE ( 180 ) ;
2021-09-10 01:22:27 +03:00
coll - > Setup . Radius = LARA_RAD_CRAWL + 50 ; // TODO: Check if it still works without 50?
2021-09-19 06:42:24 +03:00
coll - > Setup . Height = LARA_HEIGHT_CRAWL ;
2021-09-19 17:48:32 +03:00
coll - > Setup . BadHeightDown = STEP_SIZE - 1 ;
coll - > Setup . BadHeightUp = - ( STEP_SIZE - 1 ) ;
2021-09-13 09:44:37 +03:00
coll - > Setup . BadCeilingHeight = LARA_HEIGHT_CRAWL ;
2021-09-10 00:20:59 +03:00
coll - > Setup . SlopesArePits = true ;
coll - > Setup . SlopesAreWalls = true ;
2020-09-26 05:06:08 +10:00
2021-09-10 00:20:59 +03:00
coll - > Setup . ForwardAngle = Lara . moveAngle ;
2020-08-10 00:21:45 -05:00
2021-09-19 06:42:24 +03:00
GetCollisionInfo ( coll , item , true ) ;
2020-08-10 00:21:45 -05:00
2020-09-26 05:06:08 +10:00
if ( LaraDeflectEdgeDuck ( item , coll ) )
2020-08-10 00:21:45 -05:00
{
item - > currentAnimState = LS_CRAWL_IDLE ;
item - > goalAnimState = LS_CRAWL_IDLE ;
if ( item - > animNumber ! = LA_CRAWL_IDLE )
{
item - > animNumber = LA_CRAWL_IDLE ;
item - > frameNumber = g_Level . Anims [ item - > animNumber ] . frameBase ;
}
}
2020-09-26 05:06:08 +10:00
else if ( LaraFallen ( item , coll ) )
2020-08-10 00:21:45 -05:00
{
Lara . gunStatus = LG_NO_ARMS ;
}
2020-09-26 05:06:08 +10:00
else if ( ! TestLaraSlide ( item , coll ) )
2020-08-10 00:21:45 -05:00
{
2020-09-26 05:06:08 +10:00
ShiftItem ( item , coll ) ;
2020-08-10 00:21:45 -05:00
2021-09-13 09:47:37 +03:00
if ( coll - > Middle . Floor ! = NO_HEIGHT & & coll - > Middle . Floor > - STEP_SIZE )
2021-09-10 00:18:47 +03:00
item - > pos . yPos + = coll - > Middle . Floor ;
2020-08-10 00:21:45 -05:00
2020-12-19 23:34:52 -03:00
Lara . moveAngle = item - > pos . yRot ;
2020-08-10 00:21:45 -05:00
}
}
2021-10-05 15:53:21 +11:00
2021-10-05 17:33:32 +11:00
// State: LS_CRAWL_TURN_LEFT (84)
2021-10-30 12:45:52 +11:00
// Collision: lara_col_crawl_turn_left()
void lara_as_crawl_turn_left ( ITEM_INFO * item , COLL_INFO * coll )
2021-10-05 17:33:32 +11:00
{
2021-10-24 13:27:46 +11:00
Lara . gunStatus = LG_HANDS_BUSY ;
2021-10-05 17:33:32 +11:00
coll - > Setup . EnableSpaz = false ;
coll - > Setup . EnableObjectPush = true ;
2021-11-08 22:24:49 +11:00
Camera . targetElevation = - ANGLE ( 24.0f ) ;
2021-10-05 17:33:32 +11:00
if ( item - > hitPoints < = 0 )
{
item - > goalAnimState = LS_DEATH ;
return ;
}
2021-11-01 17:57:43 +11:00
Lara . turnRate = - LARA_CRAWL_TURN ;
2021-10-05 17:33:32 +11:00
if ( ( TrInput & IN_DUCK | | Lara . keepDucked )
& & Lara . waterStatus ! = LW_WADE )
{
2021-11-11 23:31:04 +11:00
if ( TrInput & IN_SPRINT & & TestLaraCrouchRoll ( item , coll ) )
2021-10-28 15:25:25 +11:00
{
item - > goalAnimState = LS_CRAWL_IDLE ;
return ;
}
2021-10-22 00:07:24 +11:00
if ( TrInput & IN_FORWARD & &
coll - > CollisionType ! = CT_FRONT & &
2021-10-28 15:25:25 +11:00
coll - > CollisionType ! = CT_TOP_FRONT & &
TestLaraCrawlForward ( item , coll ) )
2021-10-05 17:33:32 +11:00
{
2021-10-28 15:25:25 +11:00
item - > goalAnimState = LS_CRAWL_FORWARD ;
2021-10-05 17:33:32 +11:00
2021-10-28 15:25:25 +11:00
return ;
2021-10-05 17:33:32 +11:00
}
2021-10-22 00:07:24 +11:00
if ( TrInput & IN_BACK & &
2021-10-24 20:43:02 +11:00
TestLaraCrawlBack ( item , coll ) )
2021-10-05 17:33:32 +11:00
{
item - > goalAnimState = LS_CRAWL_BACK ;
return ;
}
if ( TrInput & IN_LEFT )
{
item - > goalAnimState = LS_CRAWL_TURN_LEFT ;
return ;
}
item - > goalAnimState = LS_CRAWL_IDLE ;
return ;
}
2021-11-01 17:57:43 +11:00
item - > goalAnimState = LS_CRAWL_IDLE ;
2021-10-05 17:33:32 +11:00
}
// LEGACY
2021-10-30 12:45:52 +11:00
void old_lara_as_crawl_turn_left ( ITEM_INFO * item , COLL_INFO * coll )
2021-10-05 15:53:21 +11:00
{
/*state 84*/
/*collision: lara_col_all4turnlr*/
if ( item - > hitPoints < = 0 )
{
item - > goalAnimState = LS_CRAWL_IDLE ;
return ;
}
coll - > Setup . EnableSpaz = false ;
coll - > Setup . EnableObjectPush = true ;
Lara . torsoYrot = 0 ;
Lara . torsoXrot = 0 ;
Camera . targetElevation = - ANGLE ( 23.0f ) ;
item - > pos . yRot - = ANGLE ( 1.5f ) ;
if ( ! ( TrInput & IN_LEFT ) )
item - > goalAnimState = LS_CRAWL_IDLE ;
}
2021-10-15 01:37:41 +11:00
// State: LS_CRAWL_TURN_LEFT (84)
2021-10-30 12:45:52 +11:00
// Control: lara_as_crawl_turn_left()
void lara_col_crawl_turn_left ( ITEM_INFO * item , COLL_INFO * coll )
2021-10-15 01:37:41 +11:00
{
2021-10-30 12:45:52 +11:00
lara_col_crawl_idle ( item , coll ) ;
2021-10-15 01:37:41 +11:00
}
2021-10-05 17:33:32 +11:00
// State: LS_CRAWL_TURN_RIGHT (85)
2021-10-30 12:45:52 +11:00
// Collision: lara_col_crawl_turn_right()
void lara_as_crawl_turn_right ( ITEM_INFO * item , COLL_INFO * coll )
2021-10-05 17:33:32 +11:00
{
2021-10-24 13:27:46 +11:00
Lara . gunStatus = LG_HANDS_BUSY ;
2021-10-05 17:33:32 +11:00
coll - > Setup . EnableSpaz = false ;
coll - > Setup . EnableObjectPush = true ;
2021-11-08 22:24:49 +11:00
Camera . targetElevation = - ANGLE ( 24.0f ) ;
2021-10-05 17:33:32 +11:00
if ( item - > hitPoints < = 0 )
{
item - > goalAnimState = LS_DEATH ;
return ;
}
2021-11-01 17:57:43 +11:00
Lara . turnRate = LARA_CRAWL_TURN ;
2021-10-05 17:33:32 +11:00
if ( ( TrInput & IN_DUCK | | Lara . keepDucked )
& & Lara . waterStatus ! = LW_WADE )
{
2021-11-11 23:31:04 +11:00
if ( TrInput & IN_SPRINT & & TestLaraCrouchRoll ( item , coll ) )
2021-10-28 15:25:25 +11:00
{
item - > goalAnimState = LS_CRAWL_IDLE ;
return ;
}
2021-10-22 00:07:24 +11:00
if ( TrInput & IN_FORWARD & &
coll - > CollisionType ! = CT_FRONT & &
2021-10-28 15:25:25 +11:00
coll - > CollisionType ! = CT_TOP_FRONT & &
TestLaraCrawlForward ( item , coll ) )
2021-10-05 17:33:32 +11:00
{
2021-10-28 15:25:25 +11:00
item - > goalAnimState = LS_CRAWL_FORWARD ;
2021-10-05 17:33:32 +11:00
2021-10-28 15:25:25 +11:00
return ;
2021-10-05 17:33:32 +11:00
}
2021-10-22 00:07:24 +11:00
if ( TrInput & IN_BACK & &
2021-10-24 20:43:02 +11:00
TestLaraCrawlBack ( item , coll ) )
2021-10-05 17:33:32 +11:00
{
item - > goalAnimState = LS_CRAWL_BACK ;
return ;
}
if ( TrInput & IN_RIGHT )
{
item - > goalAnimState = LS_CRAWL_TURN_RIGHT ;
return ;
}
item - > goalAnimState = LS_CRAWL_IDLE ;
return ;
}
item - > goalAnimState = LS_CRAWL_IDLE ;
}
// LEGACY
2021-10-30 12:45:52 +11:00
void old_lara_as_crawl_turn_right ( ITEM_INFO * item , COLL_INFO * coll )
2021-10-05 15:53:21 +11:00
{
/*state 85*/
/*collision: lara_col_all4turnlr*/
if ( item - > hitPoints < = 0 )
{
item - > goalAnimState = LS_CRAWL_IDLE ;
return ;
}
coll - > Setup . EnableSpaz = false ;
coll - > Setup . EnableObjectPush = true ;
Lara . torsoYrot = 0 ;
Lara . torsoXrot = 0 ;
Camera . targetElevation = - ANGLE ( 23.0f ) ;
item - > pos . yRot + = ANGLE ( 1.5f ) ;
if ( ! ( TrInput & IN_RIGHT ) )
item - > goalAnimState = LS_CRAWL_IDLE ;
}
2021-10-15 01:37:41 +11:00
// State: LS_CRAWL_TURN_RIGHT (85)
2021-10-30 12:45:52 +11:00
// Control: lara_as_crawl_turn_right()
void lara_col_crawl_turn_right ( ITEM_INFO * item , COLL_INFO * coll )
2021-10-11 23:16:02 +11:00
{
2021-10-30 12:45:52 +11:00
lara_col_crawl_idle ( item , coll ) ;
2021-10-11 23:16:02 +11:00
}
// LEGACY
void old_lara_col_all4turnlr ( ITEM_INFO * item , COLL_INFO * coll )
2021-10-05 15:53:21 +11:00
{
/*states 84 and 85*/
/*state code: lara_as_all4turnl(84) and lara_as_all4turnr(85)*/
coll - > Setup . Height = LARA_HEIGHT_CRAWL ;
GetCollisionInfo ( coll , item ) ;
if ( ! TestLaraSlide ( item , coll ) )
{
if ( coll - > Middle . Floor ! = NO_HEIGHT & & coll - > Middle . Floor > - 256 )
item - > pos . yPos + = coll - > Middle . Floor ;
}
}
2020-08-11 03:55:34 -05:00
2021-02-03 01:50:59 -03:00
void lara_col_crawl2hang ( ITEM_INFO * item , COLL_INFO * coll )
2020-08-11 03:55:34 -05:00
{
Camera . targetAngle = 0 ;
Camera . targetElevation = - ANGLE ( 45.0f ) ;
2021-09-10 00:20:59 +03:00
coll - > Setup . EnableSpaz = false ;
coll - > Setup . EnableObjectPush = false ;
2020-08-11 03:55:34 -05:00
if ( item - > animNumber = = LA_CRAWL_TO_HANG_END )
{
2021-09-19 06:42:24 +03:00
coll - > Setup . Height = LARA_HEIGHT_STRETCH ;
2021-09-19 17:48:32 +03:00
coll - > Setup . BadHeightDown = NO_BAD_POS ;
coll - > Setup . BadHeightUp = - STEPUP_HEIGHT ;
2021-09-10 00:20:59 +03:00
coll - > Setup . BadCeilingHeight = BAD_JUMP_CEILING ;
2021-09-19 06:42:24 +03:00
coll - > Setup . ForwardAngle = Lara . moveAngle ;
2020-09-26 05:06:08 +10:00
2020-12-19 23:34:52 -03:00
Lara . moveAngle = item - > pos . yRot ;
2020-08-11 03:55:34 -05:00
2021-10-26 18:05:16 +03:00
MoveItem ( item , item - > pos . yRot , - STEP_SIZE ) ;
2021-09-19 06:42:24 +03:00
GetCollisionInfo ( coll , item ) ;
2021-10-26 18:05:16 +03:00
SnapItemToLedge ( item , coll ) ;
2020-09-26 05:06:08 +10:00
2021-10-26 18:05:16 +03:00
if ( TestHangSwingIn ( item , item - > pos . yRot ) )
2020-08-11 03:55:34 -05:00
{
2021-10-26 18:05:16 +03:00
Lara . headYrot = 0 ;
Lara . headXrot = 0 ;
Lara . torsoYrot = 0 ;
Lara . torsoXrot = 0 ;
2021-11-11 01:02:50 +11:00
SetAnimation ( item , LA_JUMP_UP_TO_MONKEYSWING ) ;
2021-10-26 18:05:16 +03:00
}
else
{
2021-11-11 01:02:50 +11:00
SetAnimation ( item , LA_REACH_TO_HANG , 12 ) ;
2021-11-06 19:35:48 +11:00
2021-10-26 18:05:16 +03:00
if ( TestHangFeet ( item , item - > pos . yRot ) )
item - > goalAnimState = LS_HANG_FEET ;
}
2020-08-11 03:55:34 -05:00
2021-10-26 18:05:16 +03:00
GetCollisionInfo ( coll , item ) ;
item - > pos . yPos + = coll - > Front . Floor - GetBoundsAccurate ( item ) - > Y1 - 20 ;
2020-08-11 03:55:34 -05:00
2021-10-26 18:05:16 +03:00
item - > gravityStatus = true ;
item - > speed = 2 ;
item - > fallspeed = 1 ;
2020-08-11 03:55:34 -05:00
2021-10-26 18:05:16 +03:00
Lara . gunStatus = LG_HANDS_BUSY ;
2020-08-11 03:55:34 -05:00
}
}