2020-05-27 09:21:20 +02:00
# include "framework.h"
2019-11-21 07:43:34 +01:00
# include "Lara.h"
2020-08-08 15:15:15 -05:00
# include "lara_tests.h"
2020-08-08 16:35:05 -05:00
# include "lara_collide.h"
2020-08-09 19:18:29 -05:00
# include "lara_monkey.h"
2018-08-19 09:46:58 +02:00
# include "control.h"
# include "items.h"
2019-11-18 07:48:35 +01:00
# include "inventory.h"
2018-11-12 20:15:55 +01:00
# include "larafire.h"
2019-12-15 19:07:38 +01:00
# include "misc.h"
2019-11-21 07:43:34 +01:00
# include "draw.h"
# include "sphere.h"
2020-05-27 09:21:20 +02:00
# include "camera.h"
2019-11-21 07:43:34 +01:00
# include "larasurf.h"
# include "laraswim.h"
# include "lara1gun.h"
# include "lara2gun.h"
# include "laraflar.h"
# include "laramisc.h"
# include "laraclmb.h"
2019-12-07 08:36:13 +01:00
# include "rope.h"
2020-05-27 09:21:20 +02:00
# include "health.h"
# include "level.h"
# include "input.h"
2020-04-24 19:15:05 +02:00
# include "sound.h"
2020-05-30 17:58:09 +02:00
# include "setup.h"
2018-08-19 09:46:58 +02:00
2020-05-27 09:21:20 +02:00
# include "motorbike.h"
# include "cannon.h"
# include "quad.h"
# include "snowmobile.h"
# include "jeep.h"
# include "boat.h"
# include "upv.h"
# include "kayak.h"
# include "minecart.h"
2020-06-20 23:39:08 +02:00
using std : : function ;
2019-11-21 07:43:34 +01:00
2020-06-16 19:45:06 +02:00
extern Inventory g_Inventory ;
2019-11-18 07:48:35 +01:00
2019-12-02 09:11:21 +01:00
short elevation = 57346 ;
2019-11-21 07:43:34 +01:00
bool doJump = false ;
2020-04-27 14:01:00 +02:00
LaraInfo Lara ;
2020-04-23 19:22:01 +02:00
ITEM_INFO * LaraItem ;
2020-05-28 15:17:34 +02:00
byte LaraNodeUnderwater [ NUM_LARA_MESHES ] ;
2019-12-02 06:39:51 +01:00
2020-05-28 15:17:34 +02:00
function < LaraRoutineFunction > lara_control_routines [ NUM_LARA_STATES + 1 ] = {
2019-12-02 06:39:51 +01:00
lara_as_walk ,
lara_as_run ,
lara_as_stop ,
lara_as_forwardjump ,
lara_void_func ,
lara_as_fastback ,
lara_as_turn_r ,
lara_as_turn_l ,
lara_as_death ,
lara_as_fastfall ,
lara_as_hang ,
lara_as_reach ,
lara_as_splat ,
lara_as_tread ,
lara_void_func ,
lara_as_compress ,
lara_as_back ,
lara_as_swim ,
lara_as_glide ,
lara_as_null ,
lara_as_fastturn ,
lara_as_stepright ,
lara_as_stepleft ,
lara_void_func ,
lara_as_slide ,
lara_as_backjump ,
lara_as_rightjump ,
lara_as_leftjump ,
lara_as_upjump ,
lara_as_fallback ,
lara_as_hangleft ,
lara_as_hangright ,
lara_as_slideback ,
lara_as_surftread ,
lara_as_surfswim ,
lara_as_dive ,
lara_as_pushblock ,
lara_as_pullblock ,
lara_as_ppready ,
lara_as_pickup ,
lara_as_switchon ,
lara_as_switchoff ,
lara_as_usekey ,
lara_as_usepuzzle ,
lara_as_uwdeath ,
lara_void_func ,
lara_as_special ,
lara_as_surfback ,
lara_as_surfleft ,
lara_as_surfright ,
lara_void_func ,
lara_void_func ,
lara_as_swandive ,
lara_as_fastdive ,
lara_as_gymnast ,
lara_as_waterout ,
lara_as_climbstnc ,
lara_as_climbing ,
lara_as_climbleft ,
lara_as_climbend ,
lara_as_climbright ,
lara_as_climbdown ,
lara_void_func ,
lara_void_func ,
lara_void_func ,
lara_as_wade ,
lara_as_waterroll ,
lara_as_pickupflare ,
lara_void_func ,
lara_void_func ,
lara_as_deathslide ,
lara_as_duck ,
2020-05-01 21:19:03 -05:00
lara_as_crouch_roll ,
2019-12-02 06:39:51 +01:00
lara_as_dash ,
lara_as_dashdive ,
lara_as_hang2 ,
lara_as_monkeyswing ,
lara_as_monkeyl ,
lara_as_monkeyr ,
lara_as_monkey180 ,
lara_as_all4s ,
lara_as_crawl ,
lara_as_hangturnl ,
lara_as_hangturnr ,
lara_as_all4turnl ,
lara_as_all4turnr ,
lara_as_crawlb ,
lara_as_null ,
lara_as_null ,
lara_as_controlled ,
lara_as_ropel ,
lara_as_roper ,
lara_as_controlled ,
lara_as_controlled ,
lara_as_controlled ,
lara_as_controlledl ,
lara_as_controlledl ,
lara_as_controlled ,
lara_as_pickup ,
lara_as_null ,
lara_as_null ,
lara_as_null ,
lara_as_poleleft ,
lara_as_poleright ,
lara_as_pulley ,
lara_as_duckl ,
lara_as_duckr ,
lara_as_extcornerl ,
lara_as_extcornerr ,
lara_as_intcornerl ,
lara_as_intcornerr ,
lara_as_rope ,
lara_as_climbrope ,
lara_as_climbroped ,
lara_as_rope ,
lara_as_rope ,
lara_void_func ,
lara_as_controlled ,
lara_as_swimcheat ,
lara_as_trpose ,
lara_as_null ,
lara_as_trwalk ,
lara_as_trfall ,
lara_as_trfall ,
lara_as_null ,
lara_as_null ,
lara_as_switchon ,
lara_as_null ,
lara_as_parallelbars ,
lara_as_pbleapoff ,
lara_as_null ,
lara_as_null ,
lara_as_null ,
lara_as_null ,
lara_as_null ,
lara_as_null ,
lara_as_null ,
lara_as_null ,
2020-05-23 15:59:18 -05:00
lara_as_null ,
lara_as_hang_feet ,
lara_as_hang_feet_shimmyr ,
lara_as_hang_feet_shimmyl ,
2020-05-24 03:10:00 -05:00
lara_as_hang_feet_inRcorner ,
lara_as_hang_feet_inLcorner ,
lara_as_hang_feet_outRcorner ,
lara_as_hang_feet_outLcorner ,
2020-06-13 14:51:13 -05:00
lara_as_controlledl ,
2020-07-23 23:26:19 +02:00
lara_as_null ,
lara_as_null ,
lara_as_null ,
lara_as_stepoff_left ,
lara_as_stepoff_right
2019-12-02 06:39:51 +01:00
} ;
2020-05-28 15:17:34 +02:00
function < LaraRoutineFunction > lara_collision_routines [ NUM_LARA_STATES + 1 ] = {
2019-12-02 06:39:51 +01:00
lara_col_walk ,
lara_col_run ,
lara_col_stop ,
lara_col_forwardjump ,
lara_col_pose ,
lara_col_fastback ,
lara_col_turn_r ,
lara_col_turn_l ,
lara_col_death ,
lara_col_fastfall ,
lara_col_hang ,
lara_col_reach ,
lara_col_splat ,
lara_col_tread ,
lara_col_land ,
lara_col_compress ,
lara_col_back ,
lara_col_swim ,
lara_col_glide ,
lara_default_col ,
lara_col_fastturn ,
lara_col_stepright ,
lara_col_stepleft ,
lara_col_roll2 ,
lara_col_slide ,
lara_col_backjump ,
lara_col_rightjump ,
lara_col_leftjump ,
lara_col_upjump ,
lara_col_fallback ,
lara_col_hangleft ,
lara_col_hangright ,
lara_col_slideback ,
lara_col_surftread ,
lara_col_surfswim ,
lara_col_dive ,
lara_default_col ,
lara_default_col ,
lara_default_col ,
lara_default_col ,
lara_default_col ,
lara_default_col ,
lara_default_col ,
lara_default_col ,
lara_col_uwdeath ,
lara_col_roll ,
lara_void_func ,
lara_col_surfback ,
lara_col_surfleft ,
lara_col_surfright ,
lara_void_func ,
lara_void_func ,
lara_col_swandive ,
lara_col_fastdive ,
lara_default_col ,
lara_default_col ,
lara_col_climbstnc ,
lara_col_climbing ,
lara_col_climbleft ,
lara_col_climbend ,
lara_col_climbright ,
lara_col_climbdown ,
lara_void_func ,
lara_void_func ,
lara_void_func ,
lara_col_wade ,
lara_col_waterroll ,
lara_default_col ,
lara_void_func ,
lara_void_func ,
lara_void_func ,
lara_col_duck ,
lara_col_duck ,
lara_col_dash ,
lara_col_dashdive ,
lara_col_hang2 ,
lara_col_monkeyswing ,
lara_col_monkeyl ,
lara_col_monkeyr ,
lara_col_monkey180 ,
lara_col_all4s ,
lara_col_crawl ,
lara_col_hangturnlr ,
lara_col_hangturnlr ,
lara_col_all4turnlr ,
lara_col_all4turnlr ,
lara_col_crawlb ,
lara_void_func ,
lara_col_crawl2hang ,
lara_default_col ,
lara_void_func ,
lara_void_func ,
lara_default_col ,
lara_void_func ,
lara_void_func ,
lara_col_turnswitch ,
lara_void_func ,
lara_void_func ,
lara_default_col ,
lara_col_polestat ,
lara_col_poleup ,
lara_col_poledown ,
lara_void_func ,
lara_void_func ,
lara_default_col ,
lara_col_ducklr ,
lara_col_ducklr ,
lara_default_col ,
lara_default_col ,
lara_default_col ,
lara_default_col ,
lara_col_rope ,
lara_void_func ,
lara_void_func ,
lara_col_ropefwd ,
lara_col_ropefwd ,
lara_void_func ,
lara_void_func ,
lara_col_swim ,
lara_default_col ,
lara_default_col ,
lara_default_col ,
lara_default_col ,
lara_default_col ,
lara_default_col ,
lara_default_col ,
lara_default_col ,
lara_default_col ,
lara_default_col ,
lara_default_col ,
lara_void_func ,
lara_void_func ,
lara_void_func ,
lara_void_func ,
lara_void_func ,
lara_void_func ,
lara_void_func ,
lara_void_func ,
2020-05-23 15:59:18 -05:00
lara_void_func ,
lara_col_hang_feet ,
lara_col_hang_feet_shimmyr ,
lara_col_hang_feet_shimmyl ,
2020-05-24 03:10:00 -05:00
lara_default_col ,
lara_default_col ,
lara_default_col ,
lara_default_col ,
2020-06-13 14:51:13 -05:00
lara_void_func ,
2020-07-23 23:26:19 +02:00
lara_void_func ,
lara_void_func ,
lara_void_func ,
lara_default_col ,
lara_default_col
2019-12-02 06:39:51 +01:00
} ;
2020-08-09 00:54:57 -05:00
void LaraAboveWater ( ITEM_INFO * item , COLL_INFO * coll ) //hmmmm
2018-09-16 15:05:16 +02:00
{
coll - > old . x = item - > pos . xPos ;
coll - > old . y = item - > pos . yPos ;
coll - > old . z = item - > pos . zPos ;
coll - > oldAnimState = item - > currentAnimState ;
coll - > enableBaddiePush = true ;
coll - > enableSpaz = true ;
coll - > slopesAreWalls = false ;
coll - > slopesArePits = false ;
coll - > lavaIsPit = false ;
coll - > oldAnimNumber = item - > animNumber ;
coll - > oldFrameNumber = item - > frameNumber ;
2020-05-19 13:20:44 +02:00
coll - > radius = LARA_RAD ;
coll - > trigger = NULL ;
2018-09-16 15:05:16 +02:00
2020-05-28 15:17:34 +02:00
if ( ( TrInput & IN_LOOK ) & & Lara . ExtraAnim = = NO_ITEM & & Lara . look )
2018-11-12 20:15:55 +01:00
LookLeftRight ( ) ;
2018-09-16 15:05:16 +02:00
else
ResetLook ( ) ;
Lara . look = true ;
2018-11-24 09:39:37 +01:00
// Process Vehicles
2020-04-27 14:01:00 +02:00
if ( Lara . Vehicle ! = NO_ITEM )
2018-09-16 15:05:16 +02:00
{
2020-07-21 09:56:47 +02:00
switch ( g_Level . Items [ Lara . Vehicle ] . objectNumber )
2018-09-16 15:05:16 +02:00
{
2020-06-07 22:24:22 +02:00
case ID_QUAD :
if ( QuadBikeControl ( ) )
return ;
break ;
2019-06-16 21:59:20 +02:00
2020-06-07 22:24:22 +02:00
case ID_JEEP :
if ( JeepControl ( ) )
return ;
break ;
2019-06-16 21:59:20 +02:00
2020-06-07 22:24:22 +02:00
case ID_MOTORBIKE :
if ( MotorbikeControl ( ) )
return ;
break ;
2020-05-19 13:20:44 +02:00
2020-06-07 22:24:22 +02:00
case ID_KAYAK :
if ( KayakControl ( ) )
return ;
break ;
2019-06-16 21:59:20 +02:00
2020-06-07 22:24:22 +02:00
case ID_SNOWMOBILE :
if ( SkidooControl ( ) )
return ;
break ;
2019-11-20 14:12:21 +01:00
2020-05-27 09:21:20 +02:00
//case ID_SPEEDBOAT:
// if (BoatControl())
// return;
// break;
//case ID_RUBBERBOAT:
// if (RubberBoatControl())
// return;
// break;
2019-12-02 14:49:19 +01:00
//case ID_UPV:
// if (SubControl())
// return;
// break;
//case ID_MINECART:
// if (MineCartControl())
// return;
// break;
2019-06-16 21:59:20 +02:00
2020-06-07 22:24:22 +02:00
default :
break ;
2018-09-16 15:05:16 +02:00
}
}
// Handle current Lara status
2020-05-28 15:17:34 +02:00
lara_control_routines [ item - > currentAnimState ] ( item , coll ) ;
2018-09-16 15:05:16 +02:00
2020-05-19 13:20:44 +02:00
if ( item - > pos . zRot > = - ANGLE ( 1.0f ) & & item - > pos . zRot < = ANGLE ( 1.0f ) )
2020-06-07 22:24:22 +02:00
item - > pos . zRot = 0 ;
2020-05-19 13:20:44 +02:00
else if ( item - > pos . zRot < - ANGLE ( 1.0f ) )
item - > pos . zRot + = ANGLE ( 1.0f ) ;
2018-09-16 15:05:16 +02:00
else
2020-05-19 13:20:44 +02:00
item - > pos . zRot - = ANGLE ( 1.0f ) ;
2018-09-16 15:05:16 +02:00
2020-05-19 13:20:44 +02:00
if ( Lara . turnRate > = - ANGLE ( 2.0f ) & & Lara . turnRate < = ANGLE ( 2.0f ) )
2020-06-07 22:24:22 +02:00
Lara . turnRate = 0 ;
2020-05-19 13:20:44 +02:00
else if ( Lara . turnRate < - ANGLE ( 2.0f ) )
Lara . turnRate + = ANGLE ( 2.0f ) ;
2018-09-16 15:05:16 +02:00
else
2020-05-19 13:20:44 +02:00
Lara . turnRate - = ANGLE ( 2.0f ) ;
2018-09-16 15:05:16 +02:00
item - > pos . yRot + = Lara . turnRate ;
// Animate Lara
AnimateLara ( item ) ;
2020-05-28 15:17:34 +02:00
if ( Lara . ExtraAnim = = NO_ITEM )
2019-06-18 21:21:11 +02:00
{
// Check for collision with items
LaraBaddieCollision ( item , coll ) ;
2018-09-16 15:05:16 +02:00
2019-06-18 21:21:11 +02:00
// Handle Lara collision
2020-04-27 14:01:00 +02:00
if ( Lara . Vehicle = = NO_ITEM )
2020-05-28 15:17:34 +02:00
lara_collision_routines [ item - > currentAnimState ] ( item , coll ) ;
2019-06-18 21:21:11 +02:00
}
2018-09-16 15:05:16 +02:00
2020-06-07 22:24:22 +02:00
UpdateLaraRoom ( item , - LARA_HITE / 2 ) ;
2018-09-16 15:05:16 +02:00
2018-11-15 18:39:13 +01:00
//if (Lara.gunType == WEAPON_CROSSBOW && !LaserSight)
// TrInput &= ~IN_ACTION;
2018-09-16 15:05:16 +02:00
// Handle weapons
LaraGun ( ) ;
// Test if there's a trigger
2019-12-11 18:07:27 +01:00
TestTriggers ( coll - > trigger , FALSE , 0 ) ;
2018-09-16 15:05:16 +02:00
}
2020-08-09 00:54:57 -05:00
int UseSpecialItem ( ITEM_INFO * item ) // to pickup.cpp?
2018-11-28 13:19:01 +01:00
{
2020-07-23 23:26:19 +02:00
2020-06-16 19:45:06 +02:00
short selectedObject = g_Inventory . GetSelectedObject ( ) ;
2019-11-18 07:48:35 +01:00
2020-08-04 20:32:07 +10:00
if ( item - > animNumber ! = LA_STAND_IDLE | | Lara . gunStatus | | selectedObject = = NO_ITEM )
2020-07-07 07:32:33 +02:00
return false ;
2018-11-28 13:19:01 +01:00
2019-11-18 07:48:35 +01:00
if ( selectedObject > = ID_WATERSKIN1_EMPTY & & selectedObject < = ID_WATERSKIN2_5 )
2018-11-28 13:19:01 +01:00
{
item - > itemFlags [ 2 ] = 25 ;
2019-11-18 07:48:35 +01:00
if ( selectedObject ! = ID_WATERSKIN1_3 & & selectedObject ! = ID_WATERSKIN2_5 )
2018-11-28 13:19:01 +01:00
{
2019-11-18 07:48:35 +01:00
if ( selectedObject > = ID_WATERSKIN2_EMPTY )
2020-04-27 14:01:00 +02:00
Lara . Waterskin2 . Quantity = 5 ;
2018-11-28 13:19:01 +01:00
else
2020-04-27 14:01:00 +02:00
Lara . Waterskin1 . Quantity = 3 ;
2018-11-28 13:19:01 +01:00
2020-08-04 20:32:07 +10:00
item - > animNumber = LA_WATERSKIN_FILL ;
2018-11-28 13:19:01 +01:00
}
else
{
2019-11-18 07:48:35 +01:00
if ( selectedObject > = ID_WATERSKIN2_EMPTY )
2018-11-28 13:19:01 +01:00
{
2020-04-27 14:01:00 +02:00
item - > itemFlags [ 3 ] = Lara . Waterskin2 . Quantity ;
Lara . Waterskin2 . Quantity = 1 ;
2018-11-28 13:19:01 +01:00
}
else
{
2020-04-27 14:01:00 +02:00
item - > itemFlags [ 3 ] = Lara . Waterskin1 . Quantity ;
Lara . Waterskin1 . Quantity = 1 ;
2018-11-28 13:19:01 +01:00
}
2020-08-04 20:32:07 +10:00
item - > animNumber = LA_WATERSKIN_POUR_LOW ;
2018-11-28 13:19:01 +01:00
}
}
2019-11-18 07:48:35 +01:00
else if ( selectedObject = = ID_CLOCKWORK_BEETLE )
2018-11-28 13:19:01 +01:00
{
2020-08-04 20:32:07 +10:00
item - > animNumber = LA_MECHANICAL_BEETLE_USE ;
2018-11-28 13:19:01 +01:00
//UseClockworkBeetle(1);
}
else
{
2020-07-07 07:32:33 +02:00
return false ;
2018-11-28 13:19:01 +01:00
}
2020-07-21 09:56:47 +02:00
item - > frameNumber = g_Level . Anims [ item - > animNumber ] . frameBase ;
2020-08-04 20:32:07 +10:00
item - > goalAnimState = LS_MISC_CONTROL ;
item - > currentAnimState = LS_MISC_CONTROL ;
2018-11-28 13:19:01 +01:00
Lara . gunStatus = LG_HANDS_BUSY ;
2020-06-16 19:45:06 +02:00
g_Inventory . SetSelectedObject ( NO_ITEM ) ;
2018-11-28 13:19:01 +01:00
2020-07-07 07:32:33 +02:00
return true ;
2018-11-28 13:19:01 +01:00
}
2019-12-02 14:49:19 +01:00
void lara_as_stop ( ITEM_INFO * item , COLL_INFO * coll )
2018-11-28 13:19:01 +01:00
{
2019-12-02 09:11:21 +01:00
short fheight = NO_HEIGHT ;
short rheight = NO_HEIGHT ;
2018-11-28 13:19:01 +01:00
if ( item - > hitPoints < = 0 )
{
2020-08-04 20:32:07 +10:00
item - > goalAnimState = LS_DEATH ;
2018-11-28 13:19:01 +01:00
return ;
}
2020-08-04 20:32:07 +10:00
if ( item - > animNumber ! = LA_SPRINT_TO_STAND_RIGHT & & item - > animNumber ! = LA_SPRINT_TO_STAND_LEFT )
2018-11-28 13:19:01 +01:00
StopSoundEffect ( SFX_LARA_SLIPPING ) ;
// Handles waterskin and clockwork beetle
if ( UseSpecialItem ( item ) )
return ;
2019-06-16 21:59:20 +02:00
if ( TrInput & IN_ROLL & & Lara . waterStatus ! = LW_WADE )
2018-11-28 13:19:01 +01:00
{
2020-08-04 20:32:07 +10:00
item - > animNumber = LA_ROLL_180_START ;
2020-07-21 09:56:47 +02:00
item - > frameNumber = g_Level . Anims [ item - > animNumber ] . frameBase + 2 ;
2020-08-04 20:32:07 +10:00
item - > currentAnimState = LS_ROLL_FORWARD ;
item - > goalAnimState = LS_STOP ;
2018-11-28 13:19:01 +01:00
return ;
}
2019-12-11 18:07:27 +01:00
if ( TrInput & IN_DUCK
& & Lara . waterStatus ! = LW_WADE
2020-08-04 20:32:07 +10:00
& & item - > currentAnimState = = LS_STOP
2019-12-11 18:07:27 +01:00
& & ( Lara . gunStatus = = LG_NO_ARMS
| | Lara . gunType = = WEAPON_NONE
| | Lara . gunType = = WEAPON_PISTOLS
| | Lara . gunType = = WEAPON_REVOLVER
| | Lara . gunType = = WEAPON_UZI
| | Lara . gunType = = WEAPON_FLARE ) )
2018-11-28 13:19:01 +01:00
{
2020-08-04 20:32:07 +10:00
item - > goalAnimState = LS_CROUCH_IDLE ;
2018-11-28 13:19:01 +01:00
return ;
}
2020-08-04 20:32:07 +10:00
item - > goalAnimState = LS_STOP ;
2018-11-28 13:19:01 +01:00
if ( TrInput & IN_LOOK )
LookUpDown ( ) ;
if ( TrInput & IN_FORWARD )
2019-12-11 18:07:27 +01:00
fheight = LaraFloorFront ( item , item - > pos . yRot , LARA_RAD + 4 ) ;
2018-11-28 13:19:01 +01:00
else if ( TrInput & IN_BACK )
2020-05-31 04:20:52 -05:00
rheight = LaraFloorFront ( item , item - > pos . yRot - ANGLE ( 180.0f ) , LARA_RAD + 4 ) ; // TR3: item->pos.yRot + ANGLE(180) ?
2018-11-28 13:19:01 +01:00
2020-07-21 09:56:47 +02:00
if ( g_Level . Rooms [ item - > roomNumber ] . flags & ENV_FLAG_SWAMP )
2018-11-28 13:19:01 +01:00
{
2019-12-29 20:35:25 +01:00
if ( TrInput & IN_LEFT )
2020-08-04 20:32:07 +10:00
item - > goalAnimState = LS_TURN_LEFT_SLOW ;
2019-12-29 20:35:25 +01:00
else if ( TrInput & IN_RIGHT )
2020-08-04 20:32:07 +10:00
item - > goalAnimState = LS_TURN_RIGHT_SLOW ;
2018-11-28 13:19:01 +01:00
}
2019-12-29 20:35:25 +01:00
else
2018-11-28 13:19:01 +01:00
{
2019-12-29 20:35:25 +01:00
if ( TrInput & IN_LSTEP )
{
short height , ceiling ;
2019-12-11 18:07:27 +01:00
2020-05-31 04:20:52 -05:00
height = LaraFloorFront ( item , item - > pos . yRot - ANGLE ( 90.0f ) , LARA_RAD + 48 ) ;
ceiling = LaraCeilingFront ( item , item - > pos . yRot - ANGLE ( 90.0f ) , LARA_RAD + 48 , LARA_HITE ) ;
2019-12-11 18:07:27 +01:00
2019-12-29 20:35:25 +01:00
if ( ( height < 128 & & height > - 128 ) & & HeightType ! = BIG_SLOPE & & ceiling < = 0 )
2020-08-04 20:32:07 +10:00
item - > goalAnimState = LS_STEP_LEFT ;
2019-12-29 20:35:25 +01:00
}
else if ( TrInput & IN_RSTEP )
{
short height , ceiling ;
2020-05-31 04:20:52 -05:00
height = LaraFloorFront ( item , item - > pos . yRot + ANGLE ( 90.0f ) , LARA_RAD + 48 ) ;
ceiling = LaraCeilingFront ( item , item - > pos . yRot + ANGLE ( 90.0f ) , LARA_RAD + 48 , LARA_HITE ) ;
2019-12-29 20:35:25 +01:00
if ( ( height < 128 & & height > - 128 ) & & HeightType ! = BIG_SLOPE & & ceiling < = 0 )
2020-08-04 20:32:07 +10:00
item - > goalAnimState = LS_STEP_RIGHT ;
2019-12-29 20:35:25 +01:00
}
else if ( TrInput & IN_LEFT )
{
2020-08-04 20:32:07 +10:00
item - > goalAnimState = LS_TURN_LEFT_SLOW ;
2019-12-29 20:35:25 +01:00
}
else if ( TrInput & IN_RIGHT )
{
2020-08-04 20:32:07 +10:00
item - > goalAnimState = LS_TURN_RIGHT_SLOW ;
2019-12-29 20:35:25 +01:00
}
2018-11-28 13:19:01 +01:00
}
2019-12-11 18:07:27 +01:00
if ( Lara . waterStatus = = LW_WADE )
2018-11-28 13:19:01 +01:00
{
2020-07-21 09:56:47 +02:00
if ( TrInput & IN_JUMP & & ! ( g_Level . Rooms [ item - > roomNumber ] . flags & ENV_FLAG_SWAMP ) )
2020-08-04 20:32:07 +10:00
item - > goalAnimState = LS_JUMP_PREPARE ;
2018-11-28 13:19:01 +01:00
if ( TrInput & IN_FORWARD )
{
2019-12-11 18:07:27 +01:00
bool wade = false ;
2020-07-21 09:56:47 +02:00
if ( g_Level . Rooms [ item - > roomNumber ] . flags & ENV_FLAG_SWAMP )
2019-12-29 20:35:25 +01:00
{
if ( fheight > - ( STEPUP_HEIGHT - 1 ) )
{
lara_as_wade ( item , coll ) ;
wade = true ;
}
}
else
2019-12-11 18:07:27 +01:00
{
2019-12-29 20:35:25 +01:00
if ( ( fheight < ( STEPUP_HEIGHT - 1 ) ) & & ( fheight > - ( STEPUP_HEIGHT - 1 ) ) )
{
lara_as_wade ( item , coll ) ;
wade = true ;
}
2019-12-11 18:07:27 +01:00
}
2020-06-07 22:24:22 +02:00
2019-12-11 18:07:27 +01:00
if ( ! wade )
2018-11-28 13:19:01 +01:00
{
2020-06-09 22:24:36 -03:00
Lara . moveAngle = 0 ;
2019-12-11 18:07:27 +01:00
coll - > badPos = NO_BAD_POS ;
coll - > badNeg = - STEPUP_HEIGHT ;
2018-11-28 13:19:01 +01:00
coll - > badCeiling = 0 ;
2019-06-16 21:59:20 +02:00
coll - > slopesAreWalls = true ;
2020-01-14 14:25:37 +01:00
coll - > radius = LARA_RAD + 2 ;
2020-06-09 22:51:03 -03:00
coll - > facing = Lara . moveAngle ;
2018-11-28 13:19:01 +01:00
2020-06-09 22:51:03 -03:00
GetCollisionInfo ( coll , item - > pos . xPos , item - > pos . yPos , item - > pos . zPos , item - > roomNumber , LARA_HITE ) ;
2020-01-14 14:25:37 +01:00
if ( TestLaraVault ( item , coll ) )
return ;
coll - > radius = LARA_RAD ;
2018-11-28 13:19:01 +01:00
}
}
2019-12-11 18:07:27 +01:00
else if ( TrInput & IN_BACK )
2018-11-28 13:19:01 +01:00
{
2020-06-07 22:24:22 +02:00
if ( ( rheight < ( STEPUP_HEIGHT - 1 ) ) & & ( rheight > - ( STEPUP_HEIGHT - 1 ) ) )
2019-12-11 18:07:27 +01:00
lara_as_back ( item , coll ) ;
2018-11-28 13:19:01 +01:00
}
}
2019-12-11 18:07:27 +01:00
else
2018-11-28 13:19:01 +01:00
{
2019-12-11 18:07:27 +01:00
if ( TrInput & IN_JUMP )
2018-11-28 13:19:01 +01:00
{
2020-08-04 20:32:07 +10:00
item - > goalAnimState = LS_JUMP_PREPARE ;
2018-11-28 13:19:01 +01:00
}
2019-12-11 18:07:27 +01:00
else if ( TrInput & IN_FORWARD )
2018-11-28 13:19:01 +01:00
{
2019-12-11 18:07:27 +01:00
short height , ceiling ;
2018-11-28 13:19:01 +01:00
2020-06-07 22:24:22 +02:00
height = LaraFloorFront ( item , item - > pos . yRot , LARA_RAD + 4 ) ;
ceiling = LaraCeilingFront ( item , item - > pos . yRot , LARA_RAD + 4 , LARA_HITE ) ;
2019-11-21 07:43:34 +01:00
2019-12-11 18:07:27 +01:00
if ( ( HeightType = = BIG_SLOPE | | HeightType = = DIAGONAL ) & & ( height < 0 | | ceiling > 0 ) )
{
2020-08-04 20:32:07 +10:00
item - > goalAnimState = LS_STOP ;
2019-12-11 18:07:27 +01:00
return ;
}
2019-12-02 06:39:51 +01:00
2020-06-22 19:34:25 -05:00
// if (height >= -STEP_SIZE || fheight >= -STEP_SIZE)
// {
2019-12-11 18:07:27 +01:00
if ( TrInput & IN_WALK )
lara_as_walk ( item , coll ) ;
else
lara_as_run ( item , coll ) ;
2020-06-22 19:34:25 -05:00
/* }
2019-12-11 18:07:27 +01:00
else
2019-12-02 06:39:51 +01:00
{
2020-06-09 22:24:36 -03:00
Lara . moveAngle = 0 ;
2019-12-02 06:39:51 +01:00
2019-12-11 18:07:27 +01:00
coll - > badPos = NO_BAD_POS ;
coll - > badNeg = - STEPUP_HEIGHT ;
coll - > badCeiling = 0 ;
coll - > radius = LARA_RAD + 2 ;
coll - > slopesAreWalls = true ;
2020-06-09 22:51:03 -03:00
coll - > facing = Lara . moveAngle ;
2019-12-11 18:07:27 +01:00
2020-06-09 22:51:03 -03:00
GetCollisionInfo ( coll , item - > pos . xPos , item - > pos . yPos , item - > pos . zPos , item - > roomNumber , LARA_HITE ) ;
2019-12-11 18:07:27 +01:00
if ( ! TestLaraVault ( item , coll ) )
{
coll - > radius = LARA_RAD ;
2020-08-04 20:32:07 +10:00
item - > goalAnimState = LS_STOP ;
2019-12-11 18:07:27 +01:00
}
2020-06-22 19:34:25 -05:00
} */
2019-12-02 06:39:51 +01:00
}
2019-12-11 18:07:27 +01:00
else if ( TrInput & IN_BACK )
2019-12-02 06:39:51 +01:00
{
2019-12-11 18:07:27 +01:00
if ( TrInput & IN_WALK )
{
2020-06-07 22:24:22 +02:00
if ( ( rheight < ( STEPUP_HEIGHT - 1 ) ) & & ( rheight > - ( STEPUP_HEIGHT - 1 ) ) & & HeightType ! = BIG_SLOPE )
2019-12-11 18:07:27 +01:00
lara_as_back ( item , coll ) ;
}
2020-06-07 22:24:22 +02:00
else if ( rheight > - ( STEPUP_HEIGHT - 1 ) )
2019-12-11 18:07:27 +01:00
{
2020-08-04 20:32:07 +10:00
item - > goalAnimState = LS_HOP_BACK ;
2019-12-11 18:07:27 +01:00
}
2019-12-02 06:39:51 +01:00
}
}
}
2019-11-21 07:43:34 +01:00
2019-12-02 14:49:19 +01:00
void lara_as_pbleapoff ( ITEM_INFO * item , COLL_INFO * coll ) //1D244, 1D3D8 (F)
2019-11-21 07:43:34 +01:00
{
ITEM_INFO * pitem = ( ITEM_INFO * ) Lara . generalPtr ;
item - > gravityStatus = true ;
2020-07-21 09:56:47 +02:00
if ( item - > frameNumber = = g_Level . Anims [ item - > animNumber ] . frameBase )
2019-11-21 07:43:34 +01:00
{
2019-12-02 09:11:21 +01:00
int dist ;
2019-11-21 07:43:34 +01:00
if ( item - > pos . yRot = = pitem - > pos . yRot )
{
dist = pitem - > triggerFlags / 100 - 2 ;
}
else
{
dist = pitem - > triggerFlags % 100 - 2 ;
}
item - > fallspeed = - ( 20 * dist + 64 ) ;
item - > speed = 20 * dist + 58 ;
}
2020-07-21 09:56:47 +02:00
if ( item - > frameNumber = = g_Level . Anims [ item - > animNumber ] . frameEnd )
2019-11-21 07:43:34 +01:00
{
2020-04-25 16:23:53 +02:00
item - > pos . xPos + = 700 * phd_sin ( item - > pos . yRot ) > > W2V_SHIFT ;
2019-12-26 07:24:39 +01:00
item - > pos . yPos - = 361 ;
2020-04-25 16:23:53 +02:00
item - > pos . zPos + = 700 * phd_cos ( item - > pos . yRot ) > > W2V_SHIFT ;
2019-11-21 07:43:34 +01:00
2020-08-04 20:32:07 +10:00
item - > animNumber = LA_REACH ;
2020-07-21 09:56:47 +02:00
item - > frameNumber = g_Level . Anims [ item - > animNumber ] . frameBase ;
2019-11-21 07:43:34 +01:00
2020-08-04 20:32:07 +10:00
item - > goalAnimState = LS_REACH ;
item - > currentAnimState = LS_REACH ;
2019-11-21 07:43:34 +01:00
}
}
2020-06-07 22:24:22 +02:00
void lara_as_parallelbars ( ITEM_INFO * item , COLL_INFO * coll )
2019-11-21 07:43:34 +01:00
{
if ( ! ( TrInput & IN_ACTION ) )
{
2020-08-04 20:32:07 +10:00
item - > goalAnimState = LS_BARS_JUMP ;
2019-11-21 07:43:34 +01:00
}
}
2020-06-07 22:24:22 +02:00
void lara_as_trfall ( ITEM_INFO * item , COLL_INFO * coll )
2019-11-21 07:43:34 +01:00
{
2020-08-04 20:32:07 +10:00
if ( item - > animNumber = = LA_TIGHTROPE_FALL_LEFT | | item - > animNumber = = LA_TIGHTROPE_FALL_RIGHT )
2019-11-21 07:43:34 +01:00
{
2020-07-21 09:56:47 +02:00
if ( item - > frameNumber = = g_Level . Anims [ item - > animNumber ] . frameEnd )
2019-11-21 07:43:34 +01:00
{
PHD_VECTOR pos ;
pos . x = 0 ;
pos . y = 0 ;
pos . z = 0 ;
2020-04-29 06:43:53 +02:00
GetLaraJointPosition ( & pos , LM_RFOOT ) ;
2019-11-21 07:43:34 +01:00
item - > pos . xPos = pos . x ;
item - > pos . yPos = pos . y + 75 ;
item - > pos . zPos = pos . z ;
2020-08-04 20:32:07 +10:00
item - > goalAnimState = LS_FREEFALL ;
item - > currentAnimState = LS_FREEFALL ;
2019-11-21 07:43:34 +01:00
2020-08-04 20:32:07 +10:00
item - > animNumber = LA_FREEFALL ;
2020-07-21 09:56:47 +02:00
item - > frameNumber = g_Level . Anims [ item - > animNumber ] . frameBase ;
2019-11-21 07:43:34 +01:00
item - > fallspeed = 81 ;
Camera . targetspeed = 16 ;
}
}
else
{
2019-12-02 09:11:21 +01:00
int undoInp , wrongInput ;
int undoAnim , undoFrame ;
2019-11-21 07:43:34 +01:00
if ( Lara . tightRopeOnCount > 0 )
Lara . tightRopeOnCount - - ;
2020-08-04 20:32:07 +10:00
if ( item - > animNumber = = LA_TIGHTROPE_UNBALANCE_LEFT )
2019-11-21 07:43:34 +01:00
{
undoInp = IN_RIGHT ;
wrongInput = IN_LEFT ;
2020-08-04 20:32:07 +10:00
undoAnim = LA_TIGHTROPE_RECOVER_LEFT ;
2019-11-21 07:43:34 +01:00
}
2020-08-04 20:32:07 +10:00
else if ( item - > animNumber = = LA_TIGHTROPE_UNBALANCE_RIGHT )
2019-11-21 07:43:34 +01:00
{
undoInp = IN_LEFT ;
wrongInput = IN_RIGHT ;
2020-08-04 20:32:07 +10:00
undoAnim = LA_TIGHTROPE_RECOVER_RIGHT ;
2019-11-21 07:43:34 +01:00
}
else
{
return ;
}
2020-07-21 09:56:47 +02:00
undoFrame = g_Level . Anims [ item - > animNumber ] . frameEnd + g_Level . Anims [ undoAnim ] . frameBase - item - > frameNumber ;
2019-11-21 07:43:34 +01:00
if ( TrInput & undoInp & & Lara . tightRopeOnCount = = 0 )
{
2020-08-04 20:32:07 +10:00
item - > currentAnimState = LS_TIGHTROPE_RECOVER_BALANCE ;
item - > goalAnimState = LS_TIGHTROPE_IDLE ;
2019-11-21 07:43:34 +01:00
item - > animNumber = undoAnim ;
item - > frameNumber = undoFrame ;
Lara . tightRopeFall - - ;
}
else
{
if ( TrInput & wrongInput )
{
if ( Lara . tightRopeOnCount < 10 )
Lara . tightRopeOnCount + = ( GetRandomControl ( ) & 3 ) + 2 ;
}
}
}
}
2019-12-02 14:49:19 +01:00
void lara_as_trwalk ( ITEM_INFO * item , COLL_INFO * coll )
2019-11-21 07:43:34 +01:00
{
if ( Lara . tightRopeOnCount )
{
Lara . tightRopeOnCount - - ;
}
else if ( Lara . tightRopeOff )
{
2019-12-02 09:11:21 +01:00
short roomNumber = item - > roomNumber ;
2019-11-21 07:43:34 +01:00
if ( GetFloorHeight ( GetFloor ( item - > pos . xPos , item - > pos . yPos , item - > pos . zPos , & roomNumber ) ,
item - > pos . xPos , item - > pos . yPos , item - > pos . zPos ) = = item - > pos . yPos )
{
Lara . tightRopeOff = 0 ;
2020-08-04 20:32:07 +10:00
item - > goalAnimState = LS_TIGHTROPE_EXIT ;
2019-11-21 07:43:34 +01:00
}
}
else
{
GetTighRopeFallOff ( 127 ) ;
}
2020-08-04 20:32:07 +10:00
if ( LaraItem - > currentAnimState ! = LS_TIGHTROPE_UNBALANCE_LEFT )
2019-11-21 07:43:34 +01:00
{
if ( TrInput & IN_LOOK )
{
LookUpDown ( ) ;
}
2020-08-04 20:32:07 +10:00
if ( item - > goalAnimState ! = LS_TIGHTROPE_EXIT & &
2019-11-21 07:43:34 +01:00
( Lara . tightRopeFall
| | ( TrInput & IN_BACK | | TrInput & IN_ROLL | | ! ( TrInput & IN_FORWARD ) ) & & ! Lara . tightRopeOnCount & & ! Lara . tightRopeOff ) )
{
2020-08-04 20:32:07 +10:00
item - > goalAnimState = LS_TIGHTROPE_IDLE ;
2019-11-21 07:43:34 +01:00
}
}
}
2020-06-07 22:24:22 +02:00
void lara_as_trpose ( ITEM_INFO * item , COLL_INFO * coll )
2019-11-21 07:43:34 +01:00
{
if ( TrInput & IN_LOOK )
LookUpDown ( ) ;
GetTighRopeFallOff ( 127 ) ;
2020-08-04 20:32:07 +10:00
if ( LaraItem - > currentAnimState ! = LS_TIGHTROPE_UNBALANCE_LEFT )
2019-11-21 07:43:34 +01:00
{
if ( Lara . tightRopeFall )
{
if ( GetRandomControl ( ) & 1 )
2020-08-04 20:32:07 +10:00
item - > goalAnimState = LS_TIGHTROPE_UNBALANCE_RIGHT ;
2019-11-21 07:43:34 +01:00
else
2020-08-04 20:32:07 +10:00
item - > goalAnimState = LS_TIGHTROPE_UNBALANCE_LEFT ;
2019-11-21 07:43:34 +01:00
}
else
{
if ( TrInput & IN_FORWARD )
{
2020-08-04 20:32:07 +10:00
item - > goalAnimState = LS_TIGHTROPE_FORWARD ;
2019-11-21 07:43:34 +01:00
}
else if ( ( TrInput & IN_ROLL ) | | ( TrInput & IN_BACK ) )
{
2020-08-04 20:32:07 +10:00
if ( item - > animNumber = = LA_TIGHTROPE_IDLE )
2019-11-21 07:43:34 +01:00
{
2020-08-04 20:32:07 +10:00
item - > currentAnimState = LS_TIGHTROPE_TURN_180 ;
item - > animNumber = LA_TIGHTROPE_TURN_180 ;
2020-07-21 09:56:47 +02:00
item - > frameNumber = g_Level . Anims [ item - > animNumber ] . frameBase ;
2019-11-21 07:43:34 +01:00
GetTighRopeFallOff ( 1 ) ;
}
}
}
}
}
2020-06-07 22:24:22 +02:00
void lara_col_jumper ( ITEM_INFO * item , COLL_INFO * coll )
2019-11-21 07:43:34 +01:00
{
2019-12-11 18:07:27 +01:00
coll - > badPos = NO_BAD_POS ;
coll - > badNeg = - STEPUP_HEIGHT ;
coll - > badCeiling = BAD_JUMP_CEILING ;
2020-06-09 22:51:03 -03:00
coll - > facing = Lara . moveAngle ;
2019-11-21 07:43:34 +01:00
2020-06-09 22:51:03 -03:00
GetCollisionInfo ( coll , item - > pos . xPos , item - > pos . yPos , item - > pos . zPos , item - > roomNumber , LARA_HITE ) ;
2019-11-21 07:43:34 +01:00
LaraDeflectEdgeJump ( item , coll ) ;
if ( item - > fallspeed > 0 & & coll - > midFloor < = 0 )
{
if ( LaraLandedBad ( item , coll ) )
2020-08-04 20:32:07 +10:00
item - > goalAnimState = LS_DEATH ;
2019-11-21 07:43:34 +01:00
else
2020-08-04 20:32:07 +10:00
item - > goalAnimState = LS_STOP ;
2019-11-21 07:43:34 +01:00
item - > fallspeed = 0 ;
2019-12-16 19:04:28 +01:00
item - > gravityStatus = 0 ;
2019-11-21 07:43:34 +01:00
if ( coll - > midFloor ! = NO_HEIGHT )
item - > pos . yPos + = coll - > midFloor ;
}
}
2019-12-02 14:49:19 +01:00
void lara_default_col ( ITEM_INFO * item , COLL_INFO * coll ) //1C80C(<), 1C940(<) (F)
2019-11-21 07:43:34 +01:00
{
2020-06-09 22:24:36 -03:00
Lara . moveAngle = 0 ;
2019-12-16 19:04:28 +01:00
coll - > badPos = 384 ;
2019-12-11 18:07:27 +01:00
coll - > badNeg = - STEPUP_HEIGHT ;
2019-11-21 07:43:34 +01:00
coll - > badCeiling = 0 ;
2019-12-29 20:35:25 +01:00
coll - > slopesArePits = true ;
coll - > slopesAreWalls = true ;
2020-06-09 22:51:03 -03:00
coll - > facing = Lara . moveAngle ;
GetCollisionInfo ( coll , item - > pos . xPos , item - > pos . yPos , item - > pos . zPos , item - > roomNumber , LARA_HITE ) ;
2019-11-21 07:43:34 +01:00
}
2020-06-07 22:24:22 +02:00
void lara_col_wade ( ITEM_INFO * item , COLL_INFO * coll )
2019-11-21 07:43:34 +01:00
{
2020-06-09 22:24:36 -03:00
Lara . moveAngle = 0 ;
2019-11-21 07:43:34 +01:00
2019-12-11 18:07:27 +01:00
coll - > badPos = NO_BAD_POS ;
coll - > badNeg = - STEPUP_HEIGHT ;
2019-11-21 07:43:34 +01:00
coll - > badCeiling = 0 ;
2019-12-29 20:35:25 +01:00
coll - > slopesAreWalls = true ;
2019-11-21 07:43:34 +01:00
2020-06-09 22:51:03 -03:00
coll - > facing = Lara . moveAngle ;
GetCollisionInfo ( coll , item - > pos . xPos , item - > pos . yPos , item - > pos . zPos , item - > roomNumber , LARA_HITE ) ;
2019-11-21 07:43:34 +01:00
2020-01-14 14:25:37 +01:00
if ( LaraHitCeiling ( item , coll ) )
return ;
2019-12-16 19:04:28 +01:00
2020-01-14 14:25:37 +01:00
if ( TestLaraVault ( item , coll ) )
return ;
2019-12-16 17:11:24 +01:00
2020-01-14 14:25:37 +01:00
if ( LaraDeflectEdge ( item , coll ) )
{
item - > pos . zRot = 0 ;
2019-12-16 19:04:28 +01:00
2020-01-14 14:25:37 +01:00
2020-07-21 09:56:47 +02:00
if ( ( coll - > frontType = = WALL | | coll - > frontType = = SPLIT_TRI ) & & coll - > frontFloor < - ( ( STEP_SIZE * 5 ) / 2 ) & & ! ( g_Level . Rooms [ item - > roomNumber ] . flags & ENV_FLAG_SWAMP ) )
2019-12-16 19:04:28 +01:00
{
2020-08-04 20:32:07 +10:00
item - > goalAnimState = LS_SPLAT ;
2020-07-23 23:26:19 +02:00
if ( GetChange ( item , & g_Level . Anims [ item - > animNumber ] ) )
2020-01-14 14:25:37 +01:00
return ;
2019-11-21 07:43:34 +01:00
}
2020-01-14 14:25:37 +01:00
LaraCollideStop ( item , coll ) ;
}
2020-07-26 10:51:06 +02:00
2020-07-21 09:56:47 +02:00
if ( coll - > midFloor > = - STEPUP_HEIGHT & & coll - > midFloor < - STEP_SIZE / 2 & & ! ( g_Level . Rooms [ item - > roomNumber ] . flags & ENV_FLAG_SWAMP ) )
2020-01-14 14:25:37 +01:00
{
2020-08-04 20:32:07 +10:00
item - > goalAnimState = LS_STEP_UP ;
2020-07-23 23:26:19 +02:00
GetChange ( item , & g_Level . Anims [ item - > animNumber ] ) ;
2020-01-14 14:25:37 +01:00
}
2019-12-29 20:35:25 +01:00
2020-07-21 09:56:47 +02:00
if ( coll - > midFloor > = 50 & & ! ( g_Level . Rooms [ item - > roomNumber ] . flags & ENV_FLAG_SWAMP ) )
2020-01-14 14:25:37 +01:00
{
item - > pos . yPos + = 50 ;
return ;
2019-11-21 07:43:34 +01:00
}
2020-01-14 14:25:37 +01:00
2020-07-21 09:56:47 +02:00
if ( ! ( g_Level . Rooms [ item - > roomNumber ] . flags & ENV_FLAG_SWAMP ) | | coll - > midFloor < 0 )
2020-01-14 14:25:37 +01:00
item - > pos . yPos + = coll - > midFloor ; // Enforce to floor height.. if not a swamp room.
2020-07-21 09:56:47 +02:00
else if ( g_Level . Rooms [ item - > roomNumber ] . flags & ENV_FLAG_SWAMP & & coll - > midFloor )
2020-01-14 14:25:37 +01:00
item - > pos . yPos + = SWAMP_GRAVITY ;
2019-11-21 07:43:34 +01:00
}
2019-12-02 14:49:19 +01:00
void lara_col_fastdive ( ITEM_INFO * item , COLL_INFO * coll ) //1C558(<), 1C68C(<) (F)
2019-11-21 07:43:34 +01:00
{
2020-06-09 22:24:36 -03:00
Lara . moveAngle = 0 ;
2019-11-21 07:43:34 +01:00
2019-12-11 18:07:27 +01:00
coll - > badPos = NO_BAD_POS ;
coll - > badNeg = - STEPUP_HEIGHT ;
coll - > badCeiling = BAD_JUMP_CEILING ;
2019-11-21 07:43:34 +01:00
2020-06-09 22:51:03 -03:00
coll - > facing = Lara . moveAngle ;
GetCollisionInfo ( coll , item - > pos . xPos , item - > pos . yPos , item - > pos . zPos , item - > roomNumber , LARA_HITE ) ;
2019-11-21 07:43:34 +01:00
LaraDeflectEdgeJump ( item , coll ) ;
if ( coll - > midFloor < = 0 & & item - > fallspeed > 0 )
{
if ( item - > fallspeed < = 133 )
2020-08-04 20:32:07 +10:00
item - > goalAnimState = LS_STOP ;
2019-11-21 07:43:34 +01:00
else
2020-08-04 20:32:07 +10:00
item - > goalAnimState = LS_DEATH ;
2019-11-21 07:43:34 +01:00
item - > fallspeed = 0 ;
2019-12-16 19:04:28 +01:00
item - > gravityStatus = 0 ;
2019-11-21 07:43:34 +01:00
if ( coll - > midFloor ! = NO_HEIGHT )
item - > pos . yPos + = coll - > midFloor ;
}
}
2019-12-02 14:49:19 +01:00
void lara_col_swandive ( ITEM_INFO * item , COLL_INFO * coll ) //1C4A0(<), 1C5D4(<) (F)
2019-11-21 07:43:34 +01:00
{
2020-06-09 22:24:36 -03:00
Lara . moveAngle = 0 ;
2019-11-21 07:43:34 +01:00
2019-12-11 18:07:27 +01:00
coll - > badPos = NO_BAD_POS ;
coll - > badNeg = - STEPUP_HEIGHT ;
coll - > badCeiling = BAD_JUMP_CEILING ;
2019-11-21 07:43:34 +01:00
2020-06-09 22:51:03 -03:00
coll - > facing = Lara . moveAngle ;
GetCollisionInfo ( coll , item - > pos . xPos , item - > pos . yPos , item - > pos . zPos , item - > roomNumber , LARA_HITE ) ;
2019-11-21 07:43:34 +01:00
LaraDeflectEdgeJump ( item , coll ) ;
if ( coll - > midFloor < = 0 & & item - > fallspeed > 0 )
{
2020-08-04 20:32:07 +10:00
item - > goalAnimState = LS_STOP ;
2019-11-21 07:43:34 +01:00
item - > fallspeed = 0 ;
2019-12-16 19:04:28 +01:00
item - > gravityStatus = 0 ;
2020-05-20 03:18:36 -05:00
2019-11-21 07:43:34 +01:00
if ( coll - > midFloor ! = NO_HEIGHT )
item - > pos . yPos + = coll - > midFloor ;
}
}
2019-12-02 14:49:19 +01:00
void lara_col_roll2 ( ITEM_INFO * item , COLL_INFO * coll ) //1C384, 1C4B8 (F)
2019-11-21 07:43:34 +01:00
{
Camera . laraNode = 0 ;
2020-06-09 22:24:36 -03:00
Lara . moveAngle = ANGLE ( 180 ) ;
2019-11-21 07:43:34 +01:00
2019-12-11 18:07:27 +01:00
coll - > badPos = NO_BAD_POS ;
coll - > badNeg = - STEPUP_HEIGHT ;
2019-11-21 07:43:34 +01:00
coll - > badCeiling = 0 ;
2019-12-11 18:07:27 +01:00
coll - > slopesAreWalls = true ;
item - > gravityStatus = false ;
item - > fallspeed = 0 ;
2019-11-21 07:43:34 +01:00
2020-06-09 22:51:03 -03:00
coll - > facing = Lara . moveAngle ;
GetCollisionInfo ( coll , item - > pos . xPos , item - > pos . yPos , item - > pos . zPos , item - > roomNumber , LARA_HITE ) ;
2019-11-21 07:43:34 +01:00
2019-12-11 18:07:27 +01:00
if ( LaraHitCeiling ( item , coll ) )
return ;
if ( TestLaraSlide ( item , coll ) )
return ;
2019-11-21 07:43:34 +01:00
2019-12-11 18:07:27 +01:00
if ( coll - > midFloor > 200 )
{
2020-08-04 20:32:07 +10:00
item - > animNumber = LA_FALL_BACK ;
2020-07-21 09:56:47 +02:00
item - > frameNumber = g_Level . Anims [ item - > animNumber ] . frameBase ;
2020-08-04 20:32:07 +10:00
item - > currentAnimState = LS_FALL_BACK ;
item - > goalAnimState = LS_FALL_BACK ;
2019-12-11 18:07:27 +01:00
item - > fallspeed = 0 ;
item - > gravityStatus = true ;
return ;
}
2019-11-21 07:43:34 +01:00
2019-12-11 18:07:27 +01:00
ShiftItem ( item , coll ) ;
2019-11-21 07:43:34 +01:00
2019-12-11 18:07:27 +01:00
if ( coll - > midFloor ! = NO_HEIGHT )
item - > pos . yPos + = coll - > midFloor ;
2019-11-21 07:43:34 +01:00
}
2019-12-02 14:49:19 +01:00
void lara_col_roll ( ITEM_INFO * item , COLL_INFO * coll ) //1C2B0, 1C3E4 (F)
2019-11-21 07:43:34 +01:00
{
2020-06-09 22:24:36 -03:00
Lara . moveAngle = 0 ;
2019-11-21 07:43:34 +01:00
2019-12-11 18:07:27 +01:00
coll - > badPos = NO_BAD_POS ;
coll - > badNeg = - STEPUP_HEIGHT ;
2019-11-21 07:43:34 +01:00
coll - > badCeiling = 0 ;
2019-12-11 18:07:27 +01:00
coll - > slopesArePits = false ;
coll - > slopesAreWalls = true ;
2019-11-21 07:43:34 +01:00
item - > gravityStatus = false ;
item - > fallspeed = 0 ;
2020-06-09 22:51:03 -03:00
coll - > facing = Lara . moveAngle ;
GetCollisionInfo ( coll , item - > pos . xPos , item - > pos . yPos , item - > pos . zPos , item - > roomNumber , LARA_HITE ) ;
2019-11-21 07:43:34 +01:00
2019-12-11 18:07:27 +01:00
if ( LaraHitCeiling ( item , coll ) )
return ;
if ( TestLaraSlide ( item , coll ) )
return ;
if ( LaraFallen ( item , coll ) )
return ;
2020-05-20 03:18:36 -05:00
2020-08-04 20:32:07 +10:00
if ( TrInput & IN_FORWARD & & item - > animNumber = = LA_SWANDIVE_ROLL )
2020-05-20 03:18:36 -05:00
{
2020-08-04 20:32:07 +10:00
item - > goalAnimState = LS_RUN_FORWARD ;
2020-05-20 03:18:36 -05:00
}
2020-06-07 22:24:22 +02:00
2019-12-11 18:07:27 +01:00
ShiftItem ( item , coll ) ;
2019-11-21 07:43:34 +01:00
2019-12-11 18:07:27 +01:00
if ( coll - > midFloor ! = NO_HEIGHT )
item - > pos . yPos + = coll - > midFloor ;
2019-11-21 07:43:34 +01:00
}
2019-12-02 14:49:19 +01:00
void lara_col_slideback ( ITEM_INFO * item , COLL_INFO * coll ) //1C284(<), 1C3B8(<) (F)
2019-11-21 07:43:34 +01:00
{
2020-06-09 22:24:36 -03:00
Lara . moveAngle = ANGLE ( 180 ) ;
2019-11-21 07:43:34 +01:00
lara_slide_slope ( item , coll ) ;
}
2019-12-02 14:49:19 +01:00
void lara_col_fallback ( ITEM_INFO * item , COLL_INFO * coll ) //1C1B4(<), 1C2E8(<) (F)
2019-11-21 07:43:34 +01:00
{
2020-06-09 22:24:36 -03:00
Lara . moveAngle = ANGLE ( 180 ) ;
2019-11-21 07:43:34 +01:00
2019-12-11 18:07:27 +01:00
coll - > badPos = NO_BAD_POS ;
coll - > badNeg = - STEPUP_HEIGHT ;
coll - > badCeiling = BAD_JUMP_CEILING ;
2019-11-21 07:43:34 +01:00
2020-06-09 22:51:03 -03:00
coll - > facing = Lara . moveAngle ;
GetCollisionInfo ( coll , item - > pos . xPos , item - > pos . yPos , item - > pos . zPos , item - > roomNumber , LARA_HITE ) ;
2019-11-21 07:43:34 +01:00
LaraDeflectEdgeJump ( item , coll ) ;
if ( item - > fallspeed > 0 & & coll - > midFloor < = 0 )
{
if ( LaraLandedBad ( item , coll ) )
2020-08-04 20:32:07 +10:00
item - > goalAnimState = LS_DEATH ;
2019-11-21 07:43:34 +01:00
else
2020-08-04 20:32:07 +10:00
item - > goalAnimState = LS_STOP ;
2019-11-21 07:43:34 +01:00
item - > fallspeed = 0 ;
2019-12-16 19:04:28 +01:00
item - > gravityStatus = 0 ;
2019-11-21 07:43:34 +01:00
if ( coll - > midFloor ! = NO_HEIGHT )
item - > pos . yPos + = coll - > midFloor ;
}
}
2019-12-02 14:49:19 +01:00
void lara_col_leftjump ( ITEM_INFO * item , COLL_INFO * coll ) //1C188(<), 1C2BC(<) (F)
2019-11-21 07:43:34 +01:00
{
2020-06-09 22:24:36 -03:00
Lara . moveAngle = - ANGLE ( 90 ) ;
2019-11-21 07:43:34 +01:00
lara_col_jumper ( item , coll ) ;
}
2019-12-02 14:49:19 +01:00
void lara_col_rightjump ( ITEM_INFO * item , COLL_INFO * coll ) //1C15C(<), 1C290(<) (F)
2019-11-21 07:43:34 +01:00
{
2020-06-09 22:24:36 -03:00
Lara . moveAngle = ANGLE ( 90 ) ;
2019-11-21 07:43:34 +01:00
lara_col_jumper ( item , coll ) ;
}
2019-12-02 14:49:19 +01:00
void lara_col_backjump ( ITEM_INFO * item , COLL_INFO * coll ) //1C130(<), 1C264(<) (F)
2019-11-21 07:43:34 +01:00
{
2020-06-09 22:24:36 -03:00
Lara . moveAngle = ANGLE ( 180 ) ;
2019-11-21 07:43:34 +01:00
lara_col_jumper ( item , coll ) ;
}
2019-12-02 14:49:19 +01:00
void lara_col_slide ( ITEM_INFO * item , COLL_INFO * coll ) //1C108(<), 1C23C(<) (F)
2019-11-21 07:43:34 +01:00
{
2020-06-09 22:24:36 -03:00
Lara . moveAngle = 0 ;
2019-11-21 07:43:34 +01:00
lara_slide_slope ( item , coll ) ;
}
2019-12-02 14:49:19 +01:00
void lara_col_stepleft ( ITEM_INFO * item , COLL_INFO * coll ) //1C0E8(<), 1C21C(<) (F)
2019-11-21 07:43:34 +01:00
{
lara_col_stepright ( item , coll ) ;
}
2019-12-02 14:49:19 +01:00
void lara_col_stepright ( ITEM_INFO * item , COLL_INFO * coll ) //1BFB0, 1C0E4 (F)
2019-11-21 07:43:34 +01:00
{
2020-08-04 20:32:07 +10:00
if ( item - > currentAnimState = = LS_STEP_RIGHT )
2020-06-09 22:24:36 -03:00
Lara . moveAngle = ANGLE ( 90 ) ;
2019-11-21 07:43:34 +01:00
else
2020-06-09 22:24:36 -03:00
Lara . moveAngle = - ANGLE ( 90 ) ;
2019-11-21 07:43:34 +01:00
item - > gravityStatus = false ;
item - > fallspeed = 0 ;
if ( Lara . waterStatus = = LW_WADE )
2019-12-11 18:07:27 +01:00
coll - > badPos = NO_BAD_POS ;
2019-11-21 07:43:34 +01:00
else
coll - > badPos = 128 ;
2019-12-29 20:35:25 +01:00
coll - > slopesAreWalls = true ;
coll - > slopesArePits = true ;
2019-11-21 07:43:34 +01:00
coll - > badNeg = - 128 ;
coll - > badCeiling = 0 ;
2020-06-09 22:51:03 -03:00
coll - > facing = Lara . moveAngle ;
GetCollisionInfo ( coll , item - > pos . xPos , item - > pos . yPos , item - > pos . zPos , item - > roomNumber , LARA_HITE ) ;
2019-11-21 07:43:34 +01:00
if ( ! LaraHitCeiling ( item , coll ) )
{
if ( LaraDeflectEdge ( item , coll ) )
LaraCollideStop ( item , coll ) ;
if ( ! LaraFallen ( item , coll ) & & ! TestLaraSlide ( item , coll ) & & coll - > midFloor ! = NO_HEIGHT )
item - > pos . yPos + = coll - > midFloor ;
}
}
2020-03-31 21:03:28 -03:00
void lara_col_back ( ITEM_INFO * item , COLL_INFO * coll ) // (F) (D)
2019-11-21 07:43:34 +01:00
{
item - > gravityStatus = false ;
item - > fallspeed = 0 ;
2020-06-09 22:24:36 -03:00
Lara . moveAngle = ANGLE ( 180 ) ;
2019-11-21 07:43:34 +01:00
2019-12-29 20:35:25 +01:00
if ( Lara . waterStatus = = LW_WADE )
2019-12-11 18:07:27 +01:00
coll - > badPos = NO_BAD_POS ;
2019-11-21 07:43:34 +01:00
else
2019-12-29 20:35:25 +01:00
coll - > badPos = STEPUP_HEIGHT ;
2019-12-11 18:07:27 +01:00
coll - > badNeg = - STEPUP_HEIGHT ;
2019-11-21 07:43:34 +01:00
coll - > badCeiling = 0 ;
2019-12-29 20:35:25 +01:00
coll - > slopesArePits = true ;
2020-03-31 21:03:28 -03:00
coll - > slopesAreWalls = 1 ;
2020-06-09 22:51:03 -03:00
coll - > facing = Lara . moveAngle ;
GetCollisionInfo ( coll , item - > pos . xPos , item - > pos . yPos , item - > pos . zPos , item - > roomNumber , LARA_HITE ) ;
2019-11-21 07:43:34 +01:00
2020-01-14 14:25:37 +01:00
if ( LaraHitCeiling ( item , coll ) )
return ;
2019-11-21 07:43:34 +01:00
2020-01-14 14:25:37 +01:00
if ( LaraDeflectEdge ( item , coll ) )
LaraCollideStop ( item , coll ) ;
2019-11-21 07:43:34 +01:00
2020-01-14 14:25:37 +01:00
if ( LaraFallen ( item , coll ) )
return ;
2019-12-29 20:35:25 +01:00
2020-03-31 21:03:28 -03:00
if ( coll - > midFloor > STEP_SIZE / 2 & & coll - > midFloor < STEPUP_HEIGHT )
2020-01-14 14:25:37 +01:00
{
2020-08-04 20:32:07 +10:00
item - > goalAnimState = LS_STEP_BACK_DOWN ;
2020-07-23 23:26:19 +02:00
GetChange ( item , & g_Level . Anims [ item - > animNumber ] ) ;
2019-11-21 07:43:34 +01:00
}
2020-01-14 14:25:37 +01:00
if ( TestLaraSlide ( item , coll ) )
return ;
2020-03-31 21:03:28 -03:00
#if 0
2020-07-21 09:56:47 +02:00
if ( ! ( g_Level . Rooms [ item - > roomNumber ] . flags & ENV_FLAG_SWAMP ) | | coll - > midFloor < 0 )
2020-01-14 14:25:37 +01:00
item - > pos . yPos + = coll - > midFloor ;
2020-07-21 09:56:47 +02:00
else if ( g_Level . Rooms [ item - > roomNumber ] . flags & ENV_FLAG_SWAMP & & coll - > midFloor )
2020-01-14 14:25:37 +01:00
item - > pos . yPos + = SWAMP_GRAVITY ;
2020-03-31 21:03:28 -03:00
# else
if ( coll - > midFloor ! = NO_HEIGHT )
item - > pos . yPos + = coll - > midFloor ;
# endif
2019-11-21 07:43:34 +01:00
}
2019-12-02 14:49:19 +01:00
void lara_col_compress ( ITEM_INFO * item , COLL_INFO * coll ) //1BD30, 1BE64 (F)
2019-11-21 07:43:34 +01:00
{
item - > fallspeed = 0 ;
item - > gravityStatus = false ;
2019-12-11 18:07:27 +01:00
coll - > badPos = NO_BAD_POS ;
2019-11-21 07:43:34 +01:00
coll - > badNeg = NO_HEIGHT ;
coll - > badCeiling = 0 ;
2020-06-09 22:51:03 -03:00
coll - > facing = Lara . moveAngle ;
GetCollisionInfo ( coll , item - > pos . xPos , item - > pos . yPos , item - > pos . zPos , item - > roomNumber , LARA_HITE ) ;
2019-11-21 07:43:34 +01:00
if ( ! LaraFallen ( item , coll ) )
{
if ( coll - > midCeiling > - 100 )
{
2020-08-04 20:32:07 +10:00
item - > animNumber = LA_STAND_SOLID ;
2020-07-21 09:56:47 +02:00
item - > frameNumber = g_Level . Anims [ item - > animNumber ] . frameBase ;
2020-08-04 20:32:07 +10:00
item - > goalAnimState = LS_STOP ;
item - > currentAnimState = LS_STOP ;
2019-11-21 07:43:34 +01:00
item - > speed = 0 ;
item - > fallspeed = 0 ;
item - > gravityStatus = false ;
item - > pos . xPos = coll - > old . x ;
item - > pos . yPos = coll - > old . y ;
item - > pos . zPos = coll - > old . z ;
}
if ( coll - > midFloor > - 256 & & coll - > midFloor < 256 )
item - > pos . yPos + = coll - > midFloor ;
}
}
2019-12-02 14:49:19 +01:00
void lara_col_land ( ITEM_INFO * item , COLL_INFO * coll ) //1BD10(<), 1BE44(<) (F)
2019-11-21 07:43:34 +01:00
{
lara_col_stop ( item , coll ) ;
}
2019-12-02 14:49:19 +01:00
void lara_col_splat ( ITEM_INFO * item , COLL_INFO * coll ) //1BC74(<), 1BDA8(<) (F)
2019-11-21 07:43:34 +01:00
{
2020-06-09 22:24:36 -03:00
Lara . moveAngle = 0 ;
2019-11-21 07:43:34 +01:00
2019-12-29 20:35:25 +01:00
coll - > slopesAreWalls = true ;
coll - > slopesArePits = true ;
2019-11-21 07:43:34 +01:00
coll - > badPos = 384 ;
2019-12-11 18:07:27 +01:00
coll - > badNeg = - STEPUP_HEIGHT ;
2019-11-21 07:43:34 +01:00
coll - > badCeiling = 0 ;
2020-06-09 22:51:03 -03:00
coll - > facing = Lara . moveAngle ;
GetCollisionInfo ( coll , item - > pos . xPos , item - > pos . yPos , item - > pos . zPos , item - > roomNumber , LARA_HITE ) ;
2019-11-21 07:43:34 +01:00
ShiftItem ( item , coll ) ;
if ( coll - > midFloor > = - 256 & & coll - > midFloor < = 256 )
item - > pos . yPos + = coll - > midFloor ;
}
2019-12-02 14:49:19 +01:00
void lara_col_fastfall ( ITEM_INFO * item , COLL_INFO * coll ) //1BB88, 1BCBC (F)
2019-11-21 07:43:34 +01:00
{
item - > gravityStatus = true ;
2019-12-11 18:07:27 +01:00
coll - > badPos = NO_BAD_POS ;
coll - > badNeg = - STEPUP_HEIGHT ;
coll - > badCeiling = BAD_JUMP_CEILING ;
2019-11-21 07:43:34 +01:00
2020-06-09 22:51:03 -03:00
coll - > facing = Lara . moveAngle ;
GetCollisionInfo ( coll , item - > pos . xPos , item - > pos . yPos , item - > pos . zPos , item - > roomNumber , LARA_HITE ) ;
2019-11-21 07:43:34 +01:00
LaraSlideEdgeJump ( item , coll ) ;
if ( coll - > midFloor < = 0 )
{
if ( LaraLandedBad ( item , coll ) )
{
2020-08-04 20:32:07 +10:00
item - > goalAnimState = LS_DEATH ;
2019-11-21 07:43:34 +01:00
}
else
{
2020-08-04 20:32:07 +10:00
item - > goalAnimState = LS_STOP ;
item - > currentAnimState = LS_STOP ;
item - > animNumber = LA_FREEFALL_LAND ;
2020-07-21 09:56:47 +02:00
item - > frameNumber = g_Level . Anims [ item - > animNumber ] . frameBase ;
2019-11-21 07:43:34 +01:00
}
StopSoundEffect ( SFX_LARA_FALL ) ;
item - > fallspeed = 0 ;
item - > gravityStatus = false ;
if ( coll - > midFloor ! = NO_HEIGHT )
item - > pos . yPos + = coll - > midFloor ;
}
}
2019-12-02 14:49:19 +01:00
void lara_col_death ( ITEM_INFO * item , COLL_INFO * coll ) //1BADC(<), 1BC10(<) (F)
2019-11-21 07:43:34 +01:00
{
StopSoundEffect ( SFX_LARA_FALL ) ;
2020-06-09 22:24:36 -03:00
Lara . moveAngle = 0 ;
2019-11-21 07:43:34 +01:00
coll - > badPos = 384 ;
2019-12-11 18:07:27 +01:00
coll - > badNeg = - STEPUP_HEIGHT ;
2019-11-21 07:43:34 +01:00
coll - > badCeiling = 0 ;
coll - > radius = 400 ;
2020-06-09 22:51:03 -03:00
coll - > facing = Lara . moveAngle ;
GetCollisionInfo ( coll , item - > pos . xPos , item - > pos . yPos , item - > pos . zPos , item - > roomNumber , LARA_HITE ) ;
2019-11-21 07:43:34 +01:00
ShiftItem ( item , coll ) ;
item - > hitPoints = - 1 ;
Lara . air = - 1 ;
if ( coll - > midFloor ! = NO_HEIGHT )
item - > pos . yPos + = coll - > midFloor ;
}
2020-01-25 23:31:26 -03:00
void lara_col_turn_l ( ITEM_INFO * item , COLL_INFO * coll ) // (F) (D)
2019-11-21 07:43:34 +01:00
{
lara_col_turn_r ( item , coll ) ;
}
2020-01-25 23:31:26 -03:00
void lara_col_turn_r ( ITEM_INFO * item , COLL_INFO * coll ) // (F) (D)
2019-11-21 07:43:34 +01:00
{
item - > fallspeed = 0 ;
item - > gravityStatus = false ;
2020-06-09 22:24:36 -03:00
Lara . moveAngle = 0 ;
2019-12-29 20:35:25 +01:00
coll - > badPos = STEPUP_HEIGHT ;
2019-12-11 18:07:27 +01:00
coll - > badNeg = - STEPUP_HEIGHT ;
2019-11-21 07:43:34 +01:00
coll - > badCeiling = 0 ;
2020-01-25 23:31:26 -03:00
coll - > slopesAreWalls = 1 ;
2019-12-29 20:35:25 +01:00
coll - > slopesArePits = true ;
2020-06-09 22:51:03 -03:00
coll - > facing = Lara . moveAngle ;
GetCollisionInfo ( coll , item - > pos . xPos , item - > pos . yPos , item - > pos . zPos , item - > roomNumber , LARA_HITE ) ;
2019-11-21 07:43:34 +01:00
2020-01-29 08:29:15 +01:00
# if 1
2020-01-25 23:31:26 -03:00
if ( coll - > midFloor > 100 )
2020-01-29 08:29:15 +01:00
# else
2020-07-21 09:56:47 +02:00
if ( coll - > midFloor > 100 & & ! ( g_Level . Rooms [ item - > roomNumber ] . flags & ENV_FLAG_SWAMP ) )
2020-01-29 08:29:15 +01:00
# endif
2019-11-21 07:43:34 +01:00
{
item - > fallspeed = 0 ;
2020-08-04 20:32:07 +10:00
item - > animNumber = LA_FALL_START ;
2020-07-21 09:56:47 +02:00
item - > frameNumber = g_Level . Anims [ item - > animNumber ] . frameBase ;
2020-08-04 20:32:07 +10:00
item - > currentAnimState = LS_JUMP_FORWARD ;
item - > goalAnimState = LS_JUMP_FORWARD ;
2019-11-21 07:43:34 +01:00
item - > gravityStatus = true ;
2019-12-29 20:35:25 +01:00
return ;
2019-11-21 07:43:34 +01:00
}
2019-12-29 20:35:25 +01:00
if ( TestLaraSlide ( item , coll ) )
return ;
2020-01-29 08:29:15 +01:00
# if 1
if ( coll - > midFloor ! = NO_HEIGHT )
item - > pos . yPos + = coll - > midFloor ;
# else
2020-07-21 09:56:47 +02:00
if ( ! ( g_Level . Rooms [ item - > roomNumber ] . flags & ENV_FLAG_SWAMP ) | | coll - > midFloor < 0 )
2019-12-29 20:35:25 +01:00
item - > pos . yPos + = coll - > midFloor ;
2020-07-21 09:56:47 +02:00
else if ( g_Level . Rooms [ item - > roomNumber ] . flags & ENV_FLAG_SWAMP & & coll - > midFloor )
2019-12-29 20:35:25 +01:00
item - > pos . yPos + = SWAMP_GRAVITY ;
2020-01-29 08:29:15 +01:00
# endif
2019-11-21 07:43:34 +01:00
}
2019-12-02 14:49:19 +01:00
void lara_col_fastback ( ITEM_INFO * item , COLL_INFO * coll ) //1B89C, 1B9D0 (F)
2019-11-21 07:43:34 +01:00
{
item - > fallspeed = 0 ;
item - > gravityStatus = false ;
2020-06-09 22:24:36 -03:00
Lara . moveAngle = ANGLE ( 180 ) ;
2019-11-21 07:43:34 +01:00
coll - > slopesAreWalls = 0 ;
2019-12-29 20:35:25 +01:00
coll - > slopesArePits = true ;
2019-11-21 07:43:34 +01:00
2019-12-11 18:07:27 +01:00
coll - > badPos = NO_BAD_POS ;
coll - > badNeg = - STEPUP_HEIGHT ;
2019-11-21 07:43:34 +01:00
coll - > badCeiling = 0 ;
2020-06-09 22:51:03 -03:00
coll - > facing = Lara . moveAngle ;
GetCollisionInfo ( coll , item - > pos . xPos , item - > pos . yPos , item - > pos . zPos , item - > roomNumber , LARA_HITE ) ;
2019-11-21 07:43:34 +01:00
if ( ! LaraHitCeiling ( item , coll ) )
{
if ( coll - > midFloor < = 200 )
{
if ( LaraDeflectEdge ( item , coll ) )
LaraCollideStop ( item , coll ) ;
if ( ! TestLaraSlide ( item , coll ) & & coll - > midFloor ! = NO_HEIGHT )
item - > pos . yPos + = coll - > midFloor ;
}
else
{
item - > fallspeed = 0 ;
2020-08-04 20:32:07 +10:00
item - > animNumber = LA_FALL_BACK ;
2020-07-21 09:56:47 +02:00
item - > frameNumber = g_Level . Anims [ item - > animNumber ] . frameBase ;
2020-08-04 20:32:07 +10:00
item - > currentAnimState = LS_FALL_BACK ;
item - > goalAnimState = LS_FALL_BACK ;
2019-11-21 07:43:34 +01:00
item - > gravityStatus = true ;
}
}
}
2019-12-02 14:49:19 +01:00
void lara_col_pose ( ITEM_INFO * item , COLL_INFO * coll ) //1B87C(<), 1B9B0(<) (F)
2019-11-21 07:43:34 +01:00
{
lara_col_stop ( item , coll ) ;
}
2019-12-02 14:49:19 +01:00
void lara_col_run ( ITEM_INFO * item , COLL_INFO * coll ) //1B64C, 1B780 (F)
2019-11-21 07:43:34 +01:00
{
2020-06-09 22:24:36 -03:00
Lara . moveAngle = 0 ;
2019-11-21 07:43:34 +01:00
2019-12-11 18:07:27 +01:00
coll - > badPos = NO_BAD_POS ;
coll - > badNeg = - STEPUP_HEIGHT ;
2019-11-21 07:43:34 +01:00
coll - > badCeiling = 0 ;
2019-12-29 20:35:25 +01:00
coll - > slopesAreWalls = true ;
2019-11-21 07:43:34 +01:00
2020-06-09 22:51:03 -03:00
coll - > facing = Lara . moveAngle ;
GetCollisionInfo ( coll , item - > pos . xPos , item - > pos . yPos , item - > pos . zPos , item - > roomNumber , LARA_HITE ) ;
2019-11-21 07:43:34 +01:00
if ( ! LaraHitCeiling ( item , coll ) & & ! TestLaraVault ( item , coll ) )
{
if ( LaraDeflectEdge ( item , coll ) )
{
item - > pos . zRot = 0 ;
2020-07-25 14:28:59 +02:00
if ( TestWall ( item , 256 , 0 , - 640 ) )
2019-11-21 07:43:34 +01:00
{
2020-08-04 20:32:07 +10:00
item - > goalAnimState = LS_SPLAT ;
2020-07-25 14:28:59 +02:00
if ( GetChange ( item , & g_Level . Anims [ item - > animNumber ] ) )
2019-11-21 07:43:34 +01:00
{
2020-08-04 20:32:07 +10:00
item - > currentAnimState = LS_SPLAT ;
2019-11-21 07:43:34 +01:00
return ;
}
}
LaraCollideStop ( item , coll ) ;
}
if ( ! LaraFallen ( item , coll ) )
{
2020-07-23 23:26:19 +02:00
if ( coll - > midFloor > = - STEPUP_HEIGHT & & coll - > midFloor < - STEP_SIZE / 2 )
2019-11-21 07:43:34 +01:00
{
2020-07-23 23:26:19 +02:00
if ( coll - > frontFloor = = NO_HEIGHT | | coll - > frontFloor < - STEPUP_HEIGHT | | coll - > frontFloor > = - STEP_SIZE / 2 )
2019-11-21 07:43:34 +01:00
{
coll - > midFloor = 0 ;
}
else
{
2020-08-04 20:32:07 +10:00
item - > goalAnimState = LS_STEP_UP ;
2020-07-23 23:26:19 +02:00
GetChange ( item , & g_Level . Anims [ item - > animNumber ] ) ;
2019-11-21 07:43:34 +01:00
}
}
if ( ! TestLaraSlide ( item , coll ) )
{
if ( coll - > midFloor < 50 )
{
if ( coll - > midFloor ! = NO_HEIGHT )
item - > pos . yPos + = coll - > midFloor ;
}
else
{
2020-08-04 20:32:07 +10:00
item - > goalAnimState = LS_STEP_DOWN ; // for theoretical running stepdown anims, not in default anims
2020-07-23 23:26:19 +02:00
if ( GetChange ( item , & g_Level . Anims [ item - > animNumber ] ) )
item - > pos . yPos + = coll - > midFloor ; // move Lara to midFloor
else
item - > pos . yPos + = 50 ; // do the default aligment
2019-11-21 07:43:34 +01:00
}
}
}
}
}
2019-12-02 14:49:19 +01:00
void lara_col_walk ( ITEM_INFO * item , COLL_INFO * coll ) //1B3E8, 1B51C (F)
2019-11-21 07:43:34 +01:00
{
item - > gravityStatus = false ;
item - > fallspeed = 0 ;
2020-06-09 22:24:36 -03:00
Lara . moveAngle = 0 ;
2019-11-21 07:43:34 +01:00
coll - > badPos = 384 ;
2019-12-11 18:07:27 +01:00
coll - > badNeg = - STEPUP_HEIGHT ;
2019-11-21 07:43:34 +01:00
coll - > badCeiling = 0 ;
2019-12-29 20:35:25 +01:00
coll - > slopesAreWalls = true ;
coll - > slopesArePits = true ;
2019-11-21 07:43:34 +01:00
coll - > lavaIsPit = 1 ;
2020-06-09 22:51:03 -03:00
coll - > facing = Lara . moveAngle ;
GetCollisionInfo ( coll , item - > pos . xPos , item - > pos . yPos , item - > pos . zPos , item - > roomNumber , LARA_HITE ) ;
2019-11-21 07:43:34 +01:00
if ( ! LaraHitCeiling ( item , coll ) & & ! TestLaraVault ( item , coll ) )
{
if ( LaraDeflectEdge ( item , coll ) )
{
2020-08-04 20:32:07 +10:00
item - > goalAnimState = LS_SPLAT ;
2020-07-23 23:26:19 +02:00
if ( GetChange ( item , & g_Level . Anims [ item - > animNumber ] ) )
return ;
LaraCollideStop ( item , coll ) ;
2019-11-21 07:43:34 +01:00
}
if ( ! LaraFallen ( item , coll ) )
{
2020-07-23 23:26:19 +02:00
if ( coll - > midFloor > STEP_SIZE / 2 )
2019-11-21 07:43:34 +01:00
{
2020-07-23 23:26:19 +02:00
if ( coll - > frontFloor = = NO_HEIGHT | | coll - > frontFloor < = STEP_SIZE / 2 )
2019-11-21 07:43:34 +01:00
{
coll - > midFloor = 0 ;
}
else
{
2020-08-04 20:32:07 +10:00
item - > goalAnimState = LS_STEP_DOWN ;
2020-07-23 23:26:19 +02:00
GetChange ( item , & g_Level . Anims [ item - > animNumber ] ) ;
2019-11-21 07:43:34 +01:00
}
}
2020-07-23 23:26:19 +02:00
if ( coll - > midFloor > = - STEPUP_HEIGHT & & coll - > midFloor < - STEP_SIZE / 2 )
2019-11-21 07:43:34 +01:00
{
if ( coll - > frontFloor = = NO_HEIGHT | |
2020-07-23 23:26:19 +02:00
coll - > frontFloor < - STEPUP_HEIGHT | |
coll - > frontFloor > = - STEP_SIZE / 2 )
2019-11-21 07:43:34 +01:00
{
coll - > midFloor = 0 ;
}
else
{
2020-08-04 20:32:07 +10:00
item - > goalAnimState = LS_STEP_UP ;
2020-07-23 23:26:19 +02:00
GetChange ( item , & g_Level . Anims [ item - > animNumber ] ) ;
2019-11-21 07:43:34 +01:00
}
}
if ( ! TestLaraSlide ( item , coll ) & & coll - > midFloor ! = NO_HEIGHT )
item - > pos . yPos + = coll - > midFloor ;
}
}
}
2019-12-02 14:49:19 +01:00
void lara_as_pulley ( ITEM_INFO * item , COLL_INFO * coll ) //1B288, 1B3BC (F)
2019-11-21 07:43:34 +01:00
{
2020-06-07 22:24:22 +02:00
ITEM_INFO * p = ( ITEM_INFO * ) Lara . generalPtr ;
2019-11-21 07:43:34 +01:00
Lara . look = false ;
coll - > enableSpaz = false ;
coll - > enableBaddiePush = false ;
if ( TrInput & IN_ACTION & & p - > triggerFlags )
{
2020-08-04 20:32:07 +10:00
item - > goalAnimState = LS_PULLEY ;
2019-11-21 07:43:34 +01:00
}
else
{
2020-08-04 20:32:07 +10:00
item - > goalAnimState = LS_STOP ;
2019-11-21 07:43:34 +01:00
}
2020-08-04 20:32:07 +10:00
if ( item - > animNumber = = LA_PULLEY_PULL & & item - > frameNumber = = g_Level . Anims [ LA_PULLEY_PULL ] . frameBase + 44 )
2019-11-21 07:43:34 +01:00
{
if ( p - > triggerFlags )
{
p - > triggerFlags - - ;
if ( p - > triggerFlags )
{
if ( p - > itemFlags [ 2 ] )
{
p - > itemFlags [ 2 ] = 0 ;
p - > status = ITEM_DEACTIVATED ;
}
}
else
{
if ( ! p - > itemFlags [ 1 ] )
p - > status = ITEM_DEACTIVATED ;
p - > itemFlags [ 2 ] = 1 ;
if ( p - > itemFlags [ 3 ] > = 0 )
p - > triggerFlags = abs ( p - > itemFlags [ 3 ] ) ;
else
p - > itemFlags [ 0 ] = 1 ;
}
}
}
2020-08-04 20:32:07 +10:00
if ( item - > animNumber = = LA_PULLEY_RELEASE & & item - > frameNumber = = g_Level . Anims [ item - > animNumber ] . frameEnd - 1 )
2019-11-21 07:43:34 +01:00
Lara . gunStatus = LG_NO_ARMS ;
}
2019-12-02 14:49:19 +01:00
void lara_col_turnswitch ( ITEM_INFO * item , COLL_INFO * coll ) //1B1B4(<), 1B2E8(<) (F)
2019-11-21 07:43:34 +01:00
{
if ( coll - > old . x ! = item - > pos . xPos | | coll - > old . z ! = item - > pos . zPos )
{
2020-08-04 20:32:07 +10:00
if ( item - > animNumber = = LA_TURNSWITCH_PUSH_COUNTER_CLOCKWISE_CONTINUE )
2019-11-21 07:43:34 +01:00
{
2020-05-31 04:20:52 -05:00
item - > pos . yRot - = ANGLE ( 90.0f ) ;
2019-11-21 07:43:34 +01:00
2020-08-04 20:32:07 +10:00
item - > animNumber = LA_TURNSWITCH_PUSH_COUNTER_CLOCKWISE_END ;
2020-07-21 09:56:47 +02:00
item - > frameNumber = g_Level . Anims [ item - > animNumber ] . frameBase ;
2019-11-21 07:43:34 +01:00
}
2020-08-04 20:32:07 +10:00
if ( item - > animNumber = = LA_TURNSWITCH_PUSH_CLOCKWISE_CONTINUE )
2019-11-21 07:43:34 +01:00
{
2020-05-31 04:20:52 -05:00
item - > pos . yRot + = ANGLE ( 90.0f ) ;
2019-11-21 07:43:34 +01:00
2020-08-04 20:32:07 +10:00
item - > animNumber = LA_TURNSWITCH_PUSH_CLOCKWISE_END ;
2020-07-21 09:56:47 +02:00
item - > frameNumber = g_Level . Anims [ item - > animNumber ] . frameBase ;
2019-11-21 07:43:34 +01:00
}
}
}
2019-12-02 14:49:19 +01:00
void lara_as_controlledl ( ITEM_INFO * item , COLL_INFO * coll ) //1B180(<), 1B2B4(<) (F)
2019-11-21 07:43:34 +01:00
{
Lara . look = false ;
coll - > enableBaddiePush = false ;
coll - > enableSpaz = false ;
}
2019-12-02 14:49:19 +01:00
void lara_as_controlled ( ITEM_INFO * item , COLL_INFO * coll ) //1B0FC(<), 1B230(<) (F)
2019-11-21 07:43:34 +01:00
{
Lara . look = false ;
coll - > enableBaddiePush = false ;
coll - > enableSpaz = false ;
2020-07-21 09:56:47 +02:00
if ( item - > frameNumber = = g_Level . Anims [ item - > animNumber ] . frameEnd - 1 )
2019-11-21 07:43:34 +01:00
{
Lara . gunStatus = LG_NO_ARMS ;
if ( UseForcedFixedCamera )
UseForcedFixedCamera = 0 ;
}
}
2019-12-02 14:49:19 +01:00
void lara_as_deathslide ( ITEM_INFO * item , COLL_INFO * coll ) //1B038, 1B16C (F)
2019-11-21 07:43:34 +01:00
{
2019-12-02 09:11:21 +01:00
short roomNumber = item - > roomNumber ;
2019-11-21 07:43:34 +01:00
2020-05-31 04:20:52 -05:00
Camera . targetAngle = ANGLE ( 70.0f ) ;
2019-11-21 07:43:34 +01:00
GetFloorHeight ( GetFloor ( item - > pos . xPos , item - > pos . yPos , item - > pos . zPos , & roomNumber ) ,
item - > pos . xPos , item - > pos . yPos , item - > pos . zPos ) ;
coll - > trigger = TriggerIndex ;
if ( ! ( TrInput & IN_ACTION ) )
{
2020-08-04 20:32:07 +10:00
item - > goalAnimState = LS_JUMP_FORWARD ;
2019-11-21 07:43:34 +01:00
AnimateLara ( item ) ;
LaraItem - > gravityStatus = true ;
LaraItem - > speed = 100 ;
LaraItem - > fallspeed = 40 ;
2020-06-09 22:24:36 -03:00
Lara . moveAngle = 0 ;
2019-11-21 07:43:34 +01:00
}
}
2019-12-02 14:49:19 +01:00
void lara_as_wade ( ITEM_INFO * item , COLL_INFO * coll ) //1AF10, 1B044 (F)
2019-11-21 07:43:34 +01:00
{
if ( item - > hitPoints < = 0 )
{
2020-08-04 20:32:07 +10:00
item - > goalAnimState = LS_STOP ;
2019-11-21 07:43:34 +01:00
return ;
}
2020-05-31 04:20:52 -05:00
Camera . targetElevation = - ANGLE ( 22.0f ) ;
2019-11-21 07:43:34 +01:00
2020-07-21 09:56:47 +02:00
if ( g_Level . Rooms [ item - > roomNumber ] . flags & ENV_FLAG_SWAMP )
2019-11-21 07:43:34 +01:00
{
2019-12-29 20:35:25 +01:00
if ( TrInput & IN_LEFT )
{
Lara . turnRate - = LARA_TURN_RATE ;
2020-01-14 14:25:37 +01:00
if ( Lara . turnRate < - ( LARA_FAST_TURN > > 1 ) )
Lara . turnRate = - ( LARA_FAST_TURN > > 1 ) ;
2019-11-21 07:43:34 +01:00
2019-12-29 20:35:25 +01:00
item - > pos . zRot - = LARA_LEAN_RATE ;
2020-01-14 14:25:37 +01:00
if ( item - > pos . zRot < - ( LARA_LEAN_MAX > > 1 ) )
item - > pos . zRot = - ( LARA_LEAN_MAX > > 1 ) ;
2019-12-29 20:35:25 +01:00
}
else if ( TrInput & IN_RIGHT )
{
Lara . turnRate + = LARA_TURN_RATE ;
2020-01-14 14:25:37 +01:00
if ( Lara . turnRate > ( LARA_FAST_TURN > > 1 ) )
Lara . turnRate = ( LARA_FAST_TURN > > 1 ) ;
2019-11-21 07:43:34 +01:00
2019-12-29 20:35:25 +01:00
item - > pos . zRot + = LARA_LEAN_RATE ;
2020-01-14 14:25:37 +01:00
if ( item - > pos . zRot > ( LARA_LEAN_MAX > > 1 ) )
item - > pos . zRot = ( LARA_LEAN_MAX > > 1 ) ;
2019-12-29 20:35:25 +01:00
}
2019-11-21 07:43:34 +01:00
2019-12-29 20:35:25 +01:00
if ( TrInput & IN_FORWARD )
2020-08-04 20:32:07 +10:00
item - > goalAnimState = LS_WADE_FORWARD ;
2019-12-29 20:35:25 +01:00
else
2020-08-04 20:32:07 +10:00
item - > goalAnimState = LS_STOP ;
2019-11-21 07:43:34 +01:00
}
else
{
2019-12-29 20:35:25 +01:00
if ( TrInput & IN_LEFT )
{
Lara . turnRate - = LARA_TURN_RATE ;
if ( Lara . turnRate < - LARA_FAST_TURN )
Lara . turnRate = - LARA_FAST_TURN ;
item - > pos . zRot - = LARA_LEAN_RATE ;
if ( item - > pos . zRot < - LARA_LEAN_MAX )
item - > pos . zRot = - LARA_LEAN_MAX ;
}
else if ( TrInput & IN_RIGHT )
{
Lara . turnRate + = LARA_TURN_RATE ;
if ( Lara . turnRate > LARA_FAST_TURN )
Lara . turnRate = LARA_FAST_TURN ;
item - > pos . zRot + = LARA_LEAN_RATE ;
if ( item - > pos . zRot > LARA_LEAN_MAX )
item - > pos . zRot = LARA_LEAN_MAX ;
}
if ( TrInput & IN_FORWARD )
{
if ( Lara . waterStatus = = LW_ABOVE_WATER )
2020-08-04 20:32:07 +10:00
item - > goalAnimState = LS_RUN_FORWARD ;
2019-12-29 20:35:25 +01:00
else
2020-08-04 20:32:07 +10:00
item - > goalAnimState = LS_WADE_FORWARD ;
2019-12-29 20:35:25 +01:00
}
else
{
2020-08-04 20:32:07 +10:00
item - > goalAnimState = LS_STOP ;
2019-12-29 20:35:25 +01:00
}
2019-11-21 07:43:34 +01:00
}
}
2019-12-02 14:49:19 +01:00
void lara_as_waterout ( ITEM_INFO * item , COLL_INFO * coll ) //1AEE4(<), 1B018(<) (F)
2019-11-21 07:43:34 +01:00
{
coll - > enableBaddiePush = false ;
coll - > enableSpaz = false ;
Camera . flags = CF_FOLLOW_CENTER ;
}
2019-12-02 14:49:19 +01:00
void lara_as_gymnast ( ITEM_INFO * item , COLL_INFO * coll ) //1AEC8(<), 1AFFC(<) (F)
2019-11-21 07:43:34 +01:00
{
coll - > enableBaddiePush = false ;
coll - > enableSpaz = false ;
}
2019-12-02 14:49:19 +01:00
void lara_as_fastdive ( ITEM_INFO * item , COLL_INFO * coll ) //1AE4C(<), 1AF80(<) (F)
2019-11-21 07:43:34 +01:00
{
2020-08-04 20:32:07 +10:00
if ( TrInput & IN_ROLL & & item - > goalAnimState = = LS_SWANDIVE_END )
item - > goalAnimState = LS_JUMP_ROLL_180 ;
2019-11-21 07:43:34 +01:00
coll - > enableBaddiePush = true ;
coll - > enableSpaz = false ;
item - > speed = ( item - > speed * 95 ) / 100 ;
}
2019-12-02 14:49:19 +01:00
void lara_as_swandive ( ITEM_INFO * item , COLL_INFO * coll ) //1AE08(<), 1AF3C(<) (F)
2019-11-21 07:43:34 +01:00
{
coll - > enableBaddiePush = true ;
coll - > enableSpaz = false ;
2020-08-04 20:32:07 +10:00
if ( item - > fallspeed > LARA_FREEFALL_SPEED & & item - > goalAnimState ! = LS_DIVE )
item - > goalAnimState = LS_SWANDIVE_END ;
2019-11-21 07:43:34 +01:00
}
2019-12-02 14:49:19 +01:00
void lara_as_special ( ITEM_INFO * item , COLL_INFO * coll ) //1ADDC(<), 1AF10(<) (F)
2019-11-21 07:43:34 +01:00
{
Camera . flags = CF_FOLLOW_CENTER ;
2020-05-31 04:20:52 -05:00
Camera . targetAngle = ANGLE ( 170.0f ) ;
Camera . targetElevation = - ANGLE ( 25.0f ) ;
2019-11-21 07:43:34 +01:00
}
2019-12-02 14:49:19 +01:00
void lara_as_usepuzzle ( ITEM_INFO * item , COLL_INFO * coll ) //1AD18(<), 1AE4C(<) (F)
2019-11-21 07:43:34 +01:00
{
Lara . look = false ;
coll - > enableBaddiePush = false ;
coll - > enableSpaz = false ;
2020-05-31 04:20:52 -05:00
Camera . targetAngle = - ANGLE ( 80.0f ) ;
Camera . targetElevation = - ANGLE ( 25.0f ) ;
2019-11-21 07:43:34 +01:00
Camera . targetDistance = SECTOR ( 1 ) ;
2020-07-21 09:56:47 +02:00
if ( item - > frameNumber = = g_Level . Anims [ item - > animNumber ] . frameEnd )
2019-11-21 07:43:34 +01:00
{
if ( item - > itemFlags [ 0 ] )
{
item - > animNumber = item - > itemFlags [ 0 ] ;
2020-08-04 20:32:07 +10:00
item - > currentAnimState = LS_MISC_CONTROL ;
2020-07-21 09:56:47 +02:00
item - > frameNumber = g_Level . Anims [ item - > animNumber ] . frameBase ;
2019-11-21 07:43:34 +01:00
}
}
}
2019-12-02 14:49:19 +01:00
void lara_as_usekey ( ITEM_INFO * item , COLL_INFO * coll ) //1ACBC(<), 1ADF0(<) (F)
2019-11-21 07:43:34 +01:00
{
Lara . look = false ;
coll - > enableBaddiePush = false ;
coll - > enableSpaz = false ;
2020-05-31 04:20:52 -05:00
Camera . targetAngle = - ANGLE ( 80.0f ) ;
2019-12-16 19:04:28 +01:00
Camera . targetElevation = - 4550 ;
2019-11-21 07:43:34 +01:00
Camera . targetDistance = SECTOR ( 1 ) ;
}
2019-12-02 14:49:19 +01:00
void lara_as_switchoff ( ITEM_INFO * item , COLL_INFO * coll ) //1AC54(<), 1AD88(<) (F)
2019-11-21 07:43:34 +01:00
{
2019-12-11 18:07:27 +01:00
Lara . look = false ;
2019-11-21 07:43:34 +01:00
coll - > enableBaddiePush = false ;
coll - > enableSpaz = false ;
2020-05-31 04:20:52 -05:00
Camera . targetAngle = ANGLE ( 80.0f ) ;
Camera . targetElevation = - ANGLE ( 25.0f ) ;
2019-11-21 07:43:34 +01:00
Camera . targetDistance = SECTOR ( 1 ) ;
Camera . speed = 6 ;
}
2019-12-02 14:49:19 +01:00
void lara_as_switchon ( ITEM_INFO * item , COLL_INFO * coll ) //1ABEC(<), 1AD20(<) (F)
2019-11-21 07:43:34 +01:00
{
2019-12-11 18:07:27 +01:00
Lara . look = false ;
2019-11-21 07:43:34 +01:00
coll - > enableBaddiePush = false ;
coll - > enableSpaz = false ;
2020-05-31 04:20:52 -05:00
Camera . targetAngle = ANGLE ( 80.0f ) ;
Camera . targetElevation = - ANGLE ( 25.0f ) ;
2019-11-21 07:43:34 +01:00
Camera . targetDistance = SECTOR ( 1 ) ;
Camera . speed = 6 ;
}
2019-12-02 14:49:19 +01:00
void lara_as_pickupflare ( ITEM_INFO * item , COLL_INFO * coll ) //1AB5C(<), 1AC90(<) (F)
2019-11-21 07:43:34 +01:00
{
2019-12-11 18:07:27 +01:00
Lara . look = false ;
2019-11-21 07:43:34 +01:00
coll - > enableBaddiePush = false ;
coll - > enableSpaz = false ;
2020-05-31 04:20:52 -05:00
Camera . targetAngle = ANGLE ( 130.0f ) ;
Camera . targetElevation = - ANGLE ( 15.0f ) ;
2019-11-21 07:43:34 +01:00
Camera . targetDistance = SECTOR ( 1 ) ;
2020-07-21 09:56:47 +02:00
if ( item - > frameNumber = = g_Level . Anims [ item - > animNumber ] . frameEnd - 1 )
2019-11-21 07:43:34 +01:00
Lara . gunStatus = LG_NO_ARMS ;
}
2019-12-02 14:49:19 +01:00
void lara_as_pickup ( ITEM_INFO * item , COLL_INFO * coll ) //1AB00(<), 1AC34(<) (F)
2019-11-21 07:43:34 +01:00
{
2019-12-11 18:07:27 +01:00
Lara . look = false ;
2019-11-21 07:43:34 +01:00
coll - > enableBaddiePush = false ;
coll - > enableSpaz = false ;
2020-05-31 04:20:52 -05:00
Camera . targetAngle = - ANGLE ( 130.0f ) ;
Camera . targetElevation = - ANGLE ( 15.0f ) ;
2019-11-21 07:43:34 +01:00
Camera . targetDistance = SECTOR ( 1 ) ;
}
2019-12-02 14:49:19 +01:00
void lara_as_ppready ( ITEM_INFO * item , COLL_INFO * coll ) //1AABC(<), 1ABF0(<) (F)
2019-11-21 07:43:34 +01:00
{
coll - > enableBaddiePush = false ;
coll - > enableSpaz = false ;
2020-05-31 04:20:52 -05:00
Camera . targetAngle = ANGLE ( 75.0f ) ;
2019-11-21 07:43:34 +01:00
if ( ! ( TrInput & IN_ACTION ) )
2020-08-04 20:32:07 +10:00
item - > goalAnimState = LS_STOP ;
2019-11-21 07:43:34 +01:00
}
2019-12-02 14:49:19 +01:00
void lara_as_pullblock ( ITEM_INFO * item , COLL_INFO * coll ) //1AA60(<), 1AB94(<) (F)
2019-11-21 07:43:34 +01:00
{
2019-12-11 18:07:27 +01:00
Lara . look = false ;
2019-11-21 07:43:34 +01:00
coll - > enableBaddiePush = false ;
coll - > enableSpaz = false ;
Camera . flags = CF_FOLLOW_CENTER ;
2020-05-31 04:20:52 -05:00
Camera . targetAngle = ANGLE ( 35.0f ) ;
Camera . targetElevation = - ANGLE ( 25.0f ) ;
2019-11-21 07:43:34 +01:00
}
2019-12-02 14:49:19 +01:00
void lara_as_pushblock ( ITEM_INFO * item , COLL_INFO * coll ) //1AA04(<), 1AB38(<) (F)
2019-11-21 07:43:34 +01:00
{
2019-12-11 18:07:27 +01:00
Lara . look = false ;
2019-11-21 07:43:34 +01:00
coll - > enableBaddiePush = false ;
coll - > enableSpaz = false ;
Camera . flags = CF_FOLLOW_CENTER ;
2020-05-31 04:20:52 -05:00
Camera . targetAngle = ANGLE ( 90.0f ) ;
Camera . targetElevation = - ANGLE ( 25.0f ) ;
2019-11-21 07:43:34 +01:00
}
2019-12-02 14:49:19 +01:00
void lara_as_slideback ( ITEM_INFO * item , COLL_INFO * coll ) //1A9E0(<), 1AB14(<) (F)
2019-11-21 07:43:34 +01:00
{
if ( ( TrInput & IN_JUMP ) & & ! ( TrInput & IN_FORWARD ) )
{
2020-08-04 20:32:07 +10:00
item - > goalAnimState = LS_JUMP_BACK ;
2019-11-21 07:43:34 +01:00
}
}
2019-12-02 14:49:19 +01:00
void lara_as_fallback ( ITEM_INFO * item , COLL_INFO * coll ) //1959C(<), 196D0(<) (F)
2019-11-21 07:43:34 +01:00
{
if ( item - > fallspeed > LARA_FREEFALL_SPEED )
2020-08-04 20:32:07 +10:00
item - > goalAnimState = LS_FREEFALL ;
2019-11-21 07:43:34 +01:00
if ( TrInput & IN_ACTION )
if ( Lara . gunStatus = = LG_NO_ARMS )
2020-08-04 20:32:07 +10:00
item - > goalAnimState = LS_REACH ;
2019-11-21 07:43:34 +01:00
}
2019-12-02 14:49:19 +01:00
void lara_as_leftjump ( ITEM_INFO * item , COLL_INFO * coll ) //1A92C(<), 1AA60(<) (F)
2019-11-21 07:43:34 +01:00
{
Lara . look = false ;
2019-12-11 18:07:27 +01:00
if ( item - > fallspeed > LARA_FREEFALL_SPEED )
2020-08-04 20:32:07 +10:00
item - > goalAnimState = LS_FREEFALL ;
else if ( TrInput & IN_RIGHT & & item - > goalAnimState ! = LS_STOP )
item - > goalAnimState = LS_JUMP_ROLL_180 ;
2019-11-21 07:43:34 +01:00
}
2019-12-02 14:49:19 +01:00
void lara_as_rightjump ( ITEM_INFO * item , COLL_INFO * coll ) //1A8C4(<), 1A9F8(<) (F)
2019-11-21 07:43:34 +01:00
{
Lara . look = false ;
2019-12-11 18:07:27 +01:00
if ( item - > fallspeed > LARA_FREEFALL_SPEED )
2020-08-04 20:32:07 +10:00
item - > goalAnimState = LS_FREEFALL ;
else if ( TrInput & IN_LEFT & & item - > goalAnimState ! = LS_STOP )
item - > goalAnimState = LS_JUMP_ROLL_180 ;
2019-11-21 07:43:34 +01:00
}
2019-12-02 14:49:19 +01:00
void lara_as_backjump ( ITEM_INFO * item , COLL_INFO * coll ) //1A854(<), 1A988(<) (F)
2019-11-21 07:43:34 +01:00
{
2020-05-31 04:20:52 -05:00
Camera . targetAngle = ANGLE ( 135.0f ) ;
2019-11-21 07:43:34 +01:00
if ( item - > fallspeed < = LARA_FREEFALL_SPEED )
{
2020-08-04 20:32:07 +10:00
if ( item - > goalAnimState = = LS_RUN_FORWARD )
2019-11-21 07:43:34 +01:00
{
2020-08-04 20:32:07 +10:00
item - > goalAnimState = LS_STOP ;
2019-11-21 07:43:34 +01:00
}
2020-08-04 20:32:07 +10:00
else if ( ( TrInput & IN_FORWARD | | TrInput & IN_ROLL ) & & item - > goalAnimState ! = LS_STOP )
2019-11-21 07:43:34 +01:00
{
2020-08-04 20:32:07 +10:00
item - > goalAnimState = LS_JUMP_ROLL_180 ;
2019-11-21 07:43:34 +01:00
}
}
else
{
2020-08-04 20:32:07 +10:00
item - > goalAnimState = LS_FREEFALL ;
2019-11-21 07:43:34 +01:00
}
}
2019-12-02 14:49:19 +01:00
void lara_as_slide ( ITEM_INFO * item , COLL_INFO * coll ) //1A824(<), 1A958(<) (F)
2019-11-21 07:43:34 +01:00
{
2020-05-31 04:20:52 -05:00
Camera . targetElevation = - ANGLE ( 45.0f ) ; // FIXED
2019-11-21 07:43:34 +01:00
if ( ( TrInput & IN_JUMP ) & & ! ( TrInput & IN_BACK ) )
2020-08-04 20:32:07 +10:00
item - > goalAnimState = LS_JUMP_FORWARD ;
2019-11-21 07:43:34 +01:00
}
2019-12-02 14:49:19 +01:00
void lara_as_stepleft ( ITEM_INFO * item , COLL_INFO * coll ) //1A750(<), 1A884(<) (F)
2019-11-21 07:43:34 +01:00
{
2019-12-11 18:07:27 +01:00
Lara . look = false ;
2019-11-21 07:43:34 +01:00
if ( item - > hitPoints < = 0 )
{
2020-08-04 20:32:07 +10:00
item - > goalAnimState = LS_STOP ;
2019-11-21 07:43:34 +01:00
return ;
}
if ( ! Lara . isMoving )
{
if ( ! ( TrInput & IN_LSTEP ) )
{
2020-08-04 20:32:07 +10:00
item - > goalAnimState = LS_STOP ;
2019-11-21 07:43:34 +01:00
}
if ( TrInput & IN_LEFT )
{
2019-12-11 18:07:27 +01:00
Lara . turnRate - = LARA_TURN_RATE ;
if ( Lara . turnRate < - LARA_SLOW_TURN )
Lara . turnRate = - LARA_SLOW_TURN ;
2019-11-21 07:43:34 +01:00
}
else if ( TrInput & IN_RIGHT )
{
2019-12-11 18:07:27 +01:00
Lara . turnRate + = LARA_TURN_RATE ;
if ( Lara . turnRate > LARA_SLOW_TURN )
Lara . turnRate = LARA_SLOW_TURN ;
2019-11-21 07:43:34 +01:00
}
}
}
2019-12-02 14:49:19 +01:00
void lara_as_stepright ( ITEM_INFO * item , COLL_INFO * coll ) //1A67C(<), 1A7B0(<) (F)
2019-11-21 07:43:34 +01:00
{
2019-12-11 18:07:27 +01:00
Lara . look = false ;
2019-11-21 07:43:34 +01:00
if ( item - > hitPoints < = 0 )
{
2020-08-04 20:32:07 +10:00
item - > goalAnimState = LS_STOP ;
2019-11-21 07:43:34 +01:00
return ;
}
if ( ! Lara . isMoving )
{
if ( ! ( TrInput & IN_RSTEP ) )
{
2020-08-04 20:32:07 +10:00
item - > goalAnimState = LS_STOP ;
2019-11-21 07:43:34 +01:00
}
if ( TrInput & IN_LEFT )
{
2019-12-11 18:07:27 +01:00
Lara . turnRate - = LARA_TURN_RATE ;
2020-05-31 04:20:52 -05:00
if ( Lara . turnRate < - ANGLE ( 4.0f ) )
Lara . turnRate = - ANGLE ( 4.0f ) ;
2019-11-21 07:43:34 +01:00
}
else if ( TrInput & IN_RIGHT )
{
2019-12-11 18:07:27 +01:00
Lara . turnRate + = LARA_TURN_RATE ;
2020-05-31 04:20:52 -05:00
if ( Lara . turnRate > ANGLE ( 4.0f ) )
Lara . turnRate = ANGLE ( 4.0f ) ;
2019-11-21 07:43:34 +01:00
}
}
}
2019-12-02 14:49:19 +01:00
void lara_col_fastturn ( ITEM_INFO * item , COLL_INFO * coll ) //1A65C(<), 1A790(<) (F)
2019-11-21 07:43:34 +01:00
{
lara_col_stop ( item , coll ) ;
}
2019-12-02 14:49:19 +01:00
void lara_as_fastturn ( ITEM_INFO * item , COLL_INFO * coll ) //1A5F8(<), 1A72C(<) (F)
2019-11-21 07:43:34 +01:00
{
if ( item - > hitPoints < = 0 )
{
2020-08-04 20:32:07 +10:00
item - > goalAnimState = LS_STOP ;
2019-11-21 07:43:34 +01:00
return ;
}
2019-12-11 18:07:27 +01:00
if ( Lara . turnRate < 0 )
2019-11-21 07:43:34 +01:00
{
2019-12-11 18:07:27 +01:00
Lara . turnRate = - LARA_FAST_TURN ;
2019-11-21 07:43:34 +01:00
2019-12-11 18:07:27 +01:00
if ( ! ( TrInput & IN_LEFT ) )
2020-08-04 20:32:07 +10:00
item - > goalAnimState = LS_STOP ;
2019-11-21 07:43:34 +01:00
}
else
{
2019-12-11 18:07:27 +01:00
Lara . turnRate = LARA_FAST_TURN ;
2019-11-21 07:43:34 +01:00
2019-12-11 18:07:27 +01:00
if ( ! ( TrInput & IN_RIGHT ) )
2020-08-04 20:32:07 +10:00
item - > goalAnimState = LS_STOP ;
2019-11-21 07:43:34 +01:00
}
}
2019-12-02 14:49:19 +01:00
void lara_as_null ( ITEM_INFO * item , COLL_INFO * coll ) //1A5DC(<), 1A710(<) (F)
2019-11-21 07:43:34 +01:00
{
coll - > enableBaddiePush = false ;
coll - > enableSpaz = false ;
}
2019-12-02 14:49:19 +01:00
void lara_as_back ( ITEM_INFO * item , COLL_INFO * coll ) //1A4F0(<), 1A624(<) (F)
2019-11-21 07:43:34 +01:00
{
if ( item - > hitPoints < = 0 )
{
2020-08-04 20:32:07 +10:00
item - > goalAnimState = LS_STOP ;
2019-11-21 07:43:34 +01:00
return ;
}
if ( ! Lara . isMoving )
{
if ( ( TrInput & IN_BACK ) & & ( ( TrInput & IN_WALK ) | | Lara . waterStatus = = LW_WADE ) )
2020-08-04 20:32:07 +10:00
item - > goalAnimState = LS_WALK_BACK ;
2019-11-21 07:43:34 +01:00
else
2020-08-04 20:32:07 +10:00
item - > goalAnimState = LS_STOP ;
2019-11-21 07:43:34 +01:00
if ( TrInput & IN_LEFT )
{
2019-12-11 18:07:27 +01:00
Lara . turnRate - = LARA_TURN_RATE ;
2020-05-31 04:20:52 -05:00
if ( Lara . turnRate < - ANGLE ( 4.0f ) )
Lara . turnRate = - ANGLE ( 4.0f ) ;
2019-11-21 07:43:34 +01:00
}
else if ( TrInput & IN_RIGHT )
{
2019-12-11 18:07:27 +01:00
Lara . turnRate + = LARA_TURN_RATE ;
2020-05-31 04:20:52 -05:00
if ( Lara . turnRate > ANGLE ( 4.0f ) )
Lara . turnRate = ANGLE ( 4.0f ) ;
2019-11-21 07:43:34 +01:00
}
}
}
2020-06-07 22:24:22 +02:00
void lara_as_compress ( ITEM_INFO * item , COLL_INFO * coll )
2019-11-21 07:43:34 +01:00
{
if ( Lara . waterStatus ! = LW_WADE )
{
if ( TrInput & IN_FORWARD & & LaraFloorFront ( item , item - > pos . yRot , 256 ) > = - 384 )
{
2020-08-04 20:32:07 +10:00
item - > goalAnimState = LS_JUMP_FORWARD ;
2020-06-09 22:24:36 -03:00
Lara . moveAngle = 0 ;
2019-11-21 07:43:34 +01:00
}
2020-05-31 04:20:52 -05:00
else if ( TrInput & IN_LEFT & & LaraFloorFront ( item , item - > pos . yRot - ANGLE ( 90.0f ) , 256 ) > = - 384 )
2019-11-21 07:43:34 +01:00
{
2020-08-04 20:32:07 +10:00
item - > goalAnimState = LS_JUMP_RIGHT ;
2020-06-09 22:24:36 -03:00
Lara . moveAngle = - ANGLE ( 90 ) ;
2019-11-21 07:43:34 +01:00
}
2020-05-31 04:20:52 -05:00
else if ( TrInput & IN_RIGHT & & LaraFloorFront ( item , item - > pos . yRot + ANGLE ( 90.0f ) , 256 ) > = - 384 )
2019-11-21 07:43:34 +01:00
{
2020-08-04 20:32:07 +10:00
item - > goalAnimState = LS_JUMP_LEFT ;
2020-06-09 22:24:36 -03:00
Lara . moveAngle = ANGLE ( 90 ) ;
2019-11-21 07:43:34 +01:00
}
2020-05-31 04:20:52 -05:00
else if ( TrInput & IN_BACK & & LaraFloorFront ( item , item - > pos . yRot - ANGLE ( 180.0f ) , 256 ) > = - 384 )
2019-11-21 07:43:34 +01:00
{
2020-08-04 20:32:07 +10:00
item - > goalAnimState = LS_JUMP_BACK ;
2020-06-09 22:24:36 -03:00
Lara . moveAngle = ANGLE ( 180 ) ;
2019-11-21 07:43:34 +01:00
}
}
if ( item - > fallspeed > LARA_FREEFALL_SPEED )
2020-08-04 20:32:07 +10:00
item - > goalAnimState = LS_FREEFALL ;
2019-11-21 07:43:34 +01:00
}
2019-12-02 14:49:19 +01:00
void lara_as_splat ( ITEM_INFO * item , COLL_INFO * coll ) //1A340(<), 1A474(<) (F)
2019-11-21 07:43:34 +01:00
{
Lara . look = false ;
}
2019-12-02 14:49:19 +01:00
void lara_as_intcornerr ( ITEM_INFO * item , COLL_INFO * coll ) //1A2EC(<), 1A420(<) (F)
2019-11-21 07:43:34 +01:00
{
Camera . laraNode = 8 ;
2020-05-31 04:20:52 -05:00
Camera . targetElevation = ANGLE ( 33.0f ) ;
SetCornerAnim ( item , coll , ANGLE ( 90.0f ) ,
2020-08-04 20:32:07 +10:00
item - > animNumber = = LA_SHIMMY_RIGHT_CORNER_INNER_END | |
item - > animNumber = = LA_LADDER_RIGHT_CORNER_INNER_END ) ;
2019-11-21 07:43:34 +01:00
}
2019-12-02 14:49:19 +01:00
void lara_as_intcornerl ( ITEM_INFO * item , COLL_INFO * coll ) //1A298(<), 1A3CC(<) (F)
2019-11-21 07:43:34 +01:00
{
Camera . laraNode = 8 ;
2020-05-31 04:20:52 -05:00
Camera . targetElevation = ANGLE ( 33.0f ) ;
SetCornerAnim ( item , coll , - ANGLE ( 90.0f ) ,
2020-08-04 20:32:07 +10:00
item - > animNumber = = LA_SHIMMY_LEFT_CORNER_INNER_END | |
item - > animNumber = = LA_LADDER_LEFT_CORNER_INNER_END ) ;
2019-11-21 07:43:34 +01:00
}
2019-12-02 14:49:19 +01:00
void lara_as_extcornerr ( ITEM_INFO * item , COLL_INFO * coll ) //1A244(<), 1A378(<) (F)
2019-11-21 07:43:34 +01:00
{
Camera . laraNode = 8 ;
2020-05-31 04:20:52 -05:00
Camera . targetElevation = ANGLE ( 33.0f ) ;
SetCornerAnim ( item , coll , - ANGLE ( 90.0f ) ,
2020-08-04 20:32:07 +10:00
item - > animNumber = = LA_SHIMMY_RIGHT_CORNER_OUTER_END | |
item - > animNumber = = LA_LADDER_RIGHT_CORNER_OUTER_END ) ;
2019-11-21 07:43:34 +01:00
}
2019-12-02 14:49:19 +01:00
void lara_as_extcornerl ( ITEM_INFO * item , COLL_INFO * coll ) //1A1F0(<), 1A324(<) (F)
2019-11-21 07:43:34 +01:00
{
Camera . laraNode = 8 ;
2020-05-31 04:20:52 -05:00
Camera . targetElevation = ANGLE ( 33.0f ) ;
SetCornerAnim ( item , coll , ANGLE ( 90.0f ) ,
2020-08-04 20:32:07 +10:00
item - > animNumber = = LA_SHIMMY_LEFT_CORNER_OUTER_END | |
item - > animNumber = = LA_LADDER_LEFT_CORNER_OUTER_END ) ;
2019-11-21 07:43:34 +01:00
}
2020-03-27 19:27:21 -03:00
void lara_col_hangright ( ITEM_INFO * item , COLL_INFO * coll ) // (F) (D)
2019-11-21 07:43:34 +01:00
{
2020-06-09 22:24:36 -03:00
Lara . moveAngle = ANGLE ( 90 ) ;
2020-03-27 19:27:21 -03:00
coll - > radius = 102 ; /* @ORIGINAL_BUG: this value (instead of LARA_RAD) can make Lara glitch if coll->frontType is DIAGONAL or SPLIT_TRI */
2019-11-21 07:43:34 +01:00
LaraHangTest ( item , coll ) ;
2020-06-09 22:24:36 -03:00
Lara . moveAngle = ANGLE ( 90 ) ;
2019-11-21 07:43:34 +01:00
}
2020-03-27 19:27:21 -03:00
void lara_as_hangright ( ITEM_INFO * item , COLL_INFO * coll ) // (F) (D)
2019-11-21 07:43:34 +01:00
{
coll - > enableBaddiePush = false ;
coll - > enableSpaz = false ;
Camera . targetAngle = 0 ;
2020-05-31 04:20:52 -05:00
Camera . targetElevation = - ANGLE ( 45.0f ) ;
2019-11-21 07:43:34 +01:00
if ( ! ( TrInput & ( IN_RIGHT | IN_RSTEP ) ) )
2020-08-04 20:32:07 +10:00
item - > goalAnimState = LS_HANG ;
2019-11-21 07:43:34 +01:00
}
2020-03-27 19:27:21 -03:00
void lara_col_hangleft ( ITEM_INFO * item , COLL_INFO * coll ) // (F) (D)
2019-11-21 07:43:34 +01:00
{
2020-06-09 22:24:36 -03:00
Lara . moveAngle = - ANGLE ( 90 ) ;
2020-03-27 19:27:21 -03:00
coll - > radius = 102 ; /* @ORIGINAL_BUG: this value (instead of LARA_RAD) can make Lara glitch if coll->frontType is DIAGONAL or SPLIT_TRI */
2019-11-21 07:43:34 +01:00
LaraHangTest ( item , coll ) ;
2020-06-09 22:24:36 -03:00
Lara . moveAngle = - ANGLE ( 90 ) ;
2019-11-21 07:43:34 +01:00
}
2020-03-27 19:27:21 -03:00
void lara_as_hangleft ( ITEM_INFO * item , COLL_INFO * coll ) // (F) (D)
2019-11-21 07:43:34 +01:00
{
coll - > enableBaddiePush = false ;
coll - > enableSpaz = false ;
Camera . targetAngle = 0 ;
2020-05-31 04:20:52 -05:00
Camera . targetElevation = - ANGLE ( 45.0f ) ;
2019-11-21 07:43:34 +01:00
if ( ! ( TrInput & ( IN_LEFT | IN_LSTEP ) ) )
2020-08-04 20:32:07 +10:00
item - > goalAnimState = LS_HANG ;
2019-11-21 07:43:34 +01:00
}
2019-12-02 14:49:19 +01:00
void lara_col_hang ( ITEM_INFO * item , COLL_INFO * coll ) //19AC8, 19BFC (F)
2019-11-21 07:43:34 +01:00
{
item - > fallspeed = 0 ;
item - > gravityStatus = false ;
2020-08-04 20:32:07 +10:00
if ( item - > animNumber = = LA_REACH_TO_HANG )
2019-11-21 07:43:34 +01:00
{
2019-12-02 09:11:21 +01:00
int flag ;
2019-11-21 07:43:34 +01:00
if ( TrInput & IN_LEFT | | TrInput & IN_LSTEP )
{
2020-05-31 04:20:52 -05:00
if ( CanLaraHangSideways ( item , coll , - ANGLE ( 90.0f ) ) )
2019-11-21 07:43:34 +01:00
{
2020-08-04 20:32:07 +10:00
item - > goalAnimState = LS_SHIMMY_LEFT ;
2019-11-21 07:43:34 +01:00
return ;
}
flag = LaraHangLeftCornerTest ( item , coll ) ;
if ( flag ! = 0 )
{
if ( flag < = 0 )
2020-08-04 20:32:07 +10:00
item - > goalAnimState = LS_SHIMMY_INNER_LEFT ;
2019-11-21 07:43:34 +01:00
else
2020-08-04 20:32:07 +10:00
item - > goalAnimState = LS_SHIMMY_OUTER_LEFT ;
2019-11-21 07:43:34 +01:00
return ;
}
}
if ( TrInput & IN_RIGHT | | TrInput & IN_RSTEP )
{
2020-05-31 04:20:52 -05:00
if ( CanLaraHangSideways ( item , coll , ANGLE ( 90.0f ) ) )
2019-11-21 07:43:34 +01:00
{
2020-08-04 20:32:07 +10:00
item - > goalAnimState = LS_SHIMMY_RIGHT ;
2019-11-21 07:43:34 +01:00
return ;
}
flag = LaraHangRightCornerTest ( item , coll ) ;
if ( flag ! = 0 )
{
if ( flag < = 0 )
2020-08-04 20:32:07 +10:00
item - > goalAnimState = LS_SHIMMY_INNER_RIGHT ;
2019-11-21 07:43:34 +01:00
else
2020-08-04 20:32:07 +10:00
item - > goalAnimState = LS_SHIMMY_OUTER_RIGHT ;
2019-11-21 07:43:34 +01:00
return ;
}
}
}
2020-06-09 22:24:36 -03:00
Lara . moveAngle = 0 ;
2019-11-21 07:43:34 +01:00
LaraHangTest ( item , coll ) ;
2020-08-04 20:32:07 +10:00
if ( item - > animNumber = = LA_REACH_TO_HANG )
2019-11-21 07:43:34 +01:00
{
TestForObjectOnLedge ( item , coll ) ;
if ( TrInput & IN_FORWARD )
{
if ( coll - > frontFloor > - 850 )
{
if ( coll - > frontFloor < - 650 & &
coll - > frontFloor > = coll - > frontCeiling & &
coll - > frontFloor > = coll - > leftCeiling2 & &
coll - > frontFloor > = coll - > rightCeiling2 )
{
if ( abs ( coll - > leftFloor2 - coll - > rightFloor2 ) < 60 & & ! coll - > hitStatic )
{
if ( TrInput & IN_WALK )
{
2020-08-04 20:32:07 +10:00
item - > goalAnimState = LS_HANDSTAND ;
2019-11-21 07:43:34 +01:00
}
else if ( TrInput & IN_DUCK )
{
2020-08-04 20:32:07 +10:00
item - > goalAnimState = LS_HANG_TO_CRAWL ;
item - > requiredAnimState = LS_CROUCH_IDLE ;
2019-11-21 07:43:34 +01:00
}
else
{
2020-08-04 20:32:07 +10:00
item - > goalAnimState = LS_GRABBING ;
2019-11-21 07:43:34 +01:00
}
return ;
}
}
if ( coll - > frontFloor < - 650 & &
coll - > frontFloor - coll - > frontCeiling > = - 256 & &
coll - > frontFloor - coll - > leftCeiling2 > = - 256 & &
coll - > frontFloor - coll - > rightCeiling2 > = - 256 )
{
if ( abs ( coll - > leftFloor2 - coll - > rightFloor2 ) < 60 & & ! coll - > hitStatic )
{
2020-08-04 20:32:07 +10:00
item - > goalAnimState = LS_HANG_TO_CRAWL ;
item - > requiredAnimState = LS_CROUCH_IDLE ;
2019-11-21 07:43:34 +01:00
return ;
}
}
}
if ( Lara . climbStatus ! = 0 & &
coll - > midCeiling < = - 256 & &
abs ( coll - > leftCeiling2 - coll - > rightCeiling2 ) < 60 )
{
if ( LaraTestClimbStance ( item , coll ) )
{
2020-08-04 20:32:07 +10:00
item - > goalAnimState = LS_LADDER_IDLE ;
2019-11-21 07:43:34 +01:00
}
else
{
2020-08-04 20:32:07 +10:00
item - > animNumber = LA_LADDER_SHIMMY_UP ;
2020-07-21 09:56:47 +02:00
item - > frameNumber = g_Level . Anims [ item - > animNumber ] . frameBase ;
2020-08-04 20:32:07 +10:00
item - > goalAnimState = LS_HANG ;
item - > currentAnimState = LS_HANG ;
2019-11-21 07:43:34 +01:00
}
}
return ;
}
if ( TrInput & IN_BACK & &
Lara . climbStatus & &
coll - > midFloor > 344 & &
2020-08-04 20:32:07 +10:00
item - > animNumber = = LA_REACH_TO_HANG )
2019-11-21 07:43:34 +01:00
{
2020-06-12 00:56:10 -05:00
if ( LaraTestClimbStance ( item , coll ) )
2019-11-21 07:43:34 +01:00
{
2020-08-04 20:32:07 +10:00
item - > goalAnimState = LS_LADDER_IDLE ;
2020-06-12 00:56:10 -05:00
}
else
{
2020-08-04 20:32:07 +10:00
item - > animNumber = LA_LADDER_SHIMMY_DOWN ;
item - > goalAnimState = LS_HANG ;
item - > currentAnimState = LS_HANG ;
2020-07-21 09:56:47 +02:00
item - > frameNumber = g_Level . Anims [ item - > animNumber ] . frameBase ;
2019-11-21 07:43:34 +01:00
}
}
}
}
2019-12-02 14:49:19 +01:00
void lara_as_hang ( ITEM_INFO * item , COLL_INFO * coll ) //19A28, 19B5C (F)
2019-11-21 07:43:34 +01:00
{
Lara . isClimbing = false ;
if ( item - > hitPoints < = 0 )
{
2020-08-04 20:32:07 +10:00
item - > goalAnimState = LS_STOP ;
2019-11-21 07:43:34 +01:00
return ;
}
if ( TrInput & IN_LOOK )
LookUpDown ( ) ;
coll - > enableBaddiePush = false ;
coll - > enableSpaz = false ;
Camera . targetAngle = 0 ;
2020-05-31 04:20:52 -05:00
Camera . targetElevation = - ANGLE ( 45.0f ) ;
2019-11-21 07:43:34 +01:00
}
2019-12-02 14:49:19 +01:00
void lara_void_func ( ITEM_INFO * item , COLL_INFO * coll ) //19928(<), 19A5C(<) (F)
2019-11-21 07:43:34 +01:00
{
return ;
}
2019-12-02 14:49:19 +01:00
void lara_as_fastfall ( ITEM_INFO * item , COLL_INFO * coll ) //198BC(<), 199F0(<) (F)
2019-11-21 07:43:34 +01:00
{
item - > speed = ( item - > speed * 95 ) / 100 ;
if ( item - > fallspeed = = 154 )
SoundEffect ( SFX_LARA_FALL , & item - > pos , 0 ) ;
}
2019-12-02 14:49:19 +01:00
void lara_as_death ( ITEM_INFO * item , COLL_INFO * coll ) //19830(<), 19964(<) (F)
2019-11-21 07:43:34 +01:00
{
Lara . look = false ;
coll - > enableBaddiePush = false ;
coll - > enableSpaz = false ;
if ( BinocularRange )
{
BinocularRange = 0 ;
LaserSight = 0 ;
2020-05-31 04:20:52 -05:00
AlterFOV ( ANGLE ( 80.0f ) ) ;
2019-11-21 07:43:34 +01:00
LaraItem - > meshBits = - 1 ;
Lara . busy = false ;
}
}
2019-12-02 14:49:19 +01:00
void lara_as_turn_l ( ITEM_INFO * item , COLL_INFO * coll ) //1972C(<), 19860(<) (F)
2019-11-21 07:43:34 +01:00
{
if ( item - > hitPoints < = 0 )
{
2020-08-04 20:32:07 +10:00
item - > goalAnimState = LS_STOP ;
2019-11-21 07:43:34 +01:00
return ;
}
2019-12-11 18:07:27 +01:00
Lara . turnRate - = LARA_TURN_RATE ;
2019-11-21 07:43:34 +01:00
if ( Lara . gunStatus ! = LG_READY | | Lara . waterStatus = = LW_WADE )
{
2020-05-31 04:20:52 -05:00
if ( Lara . turnRate < - ANGLE ( 4.0f ) )
2019-11-21 07:43:34 +01:00
{
if ( TrInput & IN_WALK )
2020-05-31 04:20:52 -05:00
Lara . turnRate = - ANGLE ( 4.0f ) ;
2019-11-21 07:43:34 +01:00
else
2020-08-04 20:32:07 +10:00
item - > goalAnimState = LS_TURN_FAST ;
2019-11-21 07:43:34 +01:00
}
}
else
{
2020-08-04 20:32:07 +10:00
item - > goalAnimState = LS_TURN_FAST ;
2019-11-21 07:43:34 +01:00
}
if ( ! ( TrInput & IN_FORWARD ) )
{
if ( ! ( TrInput & IN_LEFT ) )
2020-08-04 20:32:07 +10:00
item - > goalAnimState = LS_STOP ;
2019-11-21 07:43:34 +01:00
return ;
}
if ( Lara . waterStatus = = LW_WADE )
{
2020-08-04 20:32:07 +10:00
item - > goalAnimState = LS_WADE_FORWARD ;
2019-11-21 07:43:34 +01:00
}
else if ( TrInput & IN_WALK )
{
2020-08-04 20:32:07 +10:00
item - > goalAnimState = LS_WALK_FORWARD ;
2019-11-21 07:43:34 +01:00
}
else
{
2020-08-04 20:32:07 +10:00
item - > goalAnimState = LS_RUN_FORWARD ;
2019-11-21 07:43:34 +01:00
}
}
2019-12-02 14:49:19 +01:00
void lara_as_turn_r ( ITEM_INFO * item , COLL_INFO * coll ) //19628(<), 1975C(<) (F)
2019-11-21 07:43:34 +01:00
{
if ( item - > hitPoints < = 0 )
{
2020-08-04 20:32:07 +10:00
item - > goalAnimState = LS_STOP ;
2019-11-21 07:43:34 +01:00
return ;
}
2019-12-11 18:07:27 +01:00
Lara . turnRate + = LARA_TURN_RATE ;
2019-11-21 07:43:34 +01:00
if ( Lara . gunStatus ! = LG_READY | | Lara . waterStatus = = LW_WADE )
{
2020-05-31 04:20:52 -05:00
if ( Lara . turnRate > ANGLE ( 4.0f ) )
2019-11-21 07:43:34 +01:00
{
if ( TrInput & IN_WALK )
2020-05-31 04:20:52 -05:00
Lara . turnRate = ANGLE ( 4.0f ) ;
2019-11-21 07:43:34 +01:00
else
2020-08-04 20:32:07 +10:00
item - > goalAnimState = LS_TURN_FAST ;
2019-11-21 07:43:34 +01:00
}
}
else
{
2020-08-04 20:32:07 +10:00
item - > goalAnimState = LS_TURN_FAST ;
2019-11-21 07:43:34 +01:00
}
if ( ! ( TrInput & IN_FORWARD ) )
{
if ( ! ( TrInput & IN_RIGHT ) )
2020-08-04 20:32:07 +10:00
item - > goalAnimState = LS_STOP ;
2019-11-21 07:43:34 +01:00
return ;
}
if ( Lara . waterStatus = = LW_WADE )
{
2020-08-04 20:32:07 +10:00
item - > goalAnimState = LS_WADE_FORWARD ;
2019-11-21 07:43:34 +01:00
}
else if ( TrInput & IN_WALK )
{
2020-08-04 20:32:07 +10:00
item - > goalAnimState = LS_WALK_FORWARD ;
2019-11-21 07:43:34 +01:00
}
else
{
2020-08-04 20:32:07 +10:00
item - > goalAnimState = LS_RUN_FORWARD ;
2019-11-21 07:43:34 +01:00
}
}
2019-12-02 14:49:19 +01:00
void lara_as_fastback ( ITEM_INFO * item , COLL_INFO * coll ) //1959C(<), 196D0(<) (F)
2019-11-21 07:43:34 +01:00
{
2020-08-04 20:32:07 +10:00
item - > goalAnimState = LS_STOP ;
2019-11-21 07:43:34 +01:00
if ( TrInput & IN_LEFT )
{
2019-12-11 18:07:27 +01:00
Lara . turnRate - = LARA_TURN_RATE ;
2020-05-31 04:20:52 -05:00
if ( Lara . turnRate < - ANGLE ( 6.0f ) )
Lara . turnRate = - ANGLE ( 6.0f ) ;
2019-11-21 07:43:34 +01:00
}
else if ( TrInput & IN_RIGHT )
{
2019-12-11 18:07:27 +01:00
Lara . turnRate + = LARA_TURN_RATE ;
2020-05-31 04:20:52 -05:00
if ( Lara . turnRate > ANGLE ( 6.0f ) )
Lara . turnRate = ANGLE ( 6.0f ) ;
2019-11-21 07:43:34 +01:00
}
}
2019-12-02 14:49:19 +01:00
void lara_as_run ( ITEM_INFO * item , COLL_INFO * coll ) //192EC, 19420 (F)
2019-11-21 07:43:34 +01:00
{
if ( item - > hitPoints < = 0 )
{
2020-08-04 20:32:07 +10:00
item - > goalAnimState = LS_DEATH ;
2019-11-21 07:43:34 +01:00
return ;
}
if ( TrInput & IN_ROLL )
{
2020-08-04 20:32:07 +10:00
item - > animNumber = LA_ROLL_180_START ;
2020-07-21 09:56:47 +02:00
item - > frameNumber = g_Level . Anims [ item - > animNumber ] . frameBase + 2 ;
2020-08-04 20:32:07 +10:00
item - > currentAnimState = LS_ROLL_FORWARD ;
item - > goalAnimState = LS_STOP ;
2019-11-21 07:43:34 +01:00
return ;
}
if ( TrInput & IN_SPRINT & & DashTimer )
{
2020-08-04 20:32:07 +10:00
item - > goalAnimState = LS_SPRINT ;
2019-11-21 07:43:34 +01:00
return ;
}
if ( TrInput & IN_DUCK & &
Lara . waterStatus ! = LW_WADE & &
2020-06-07 22:24:22 +02:00
( Lara . gunStatus = = LG_NO_ARMS | |
Lara . gunType = = WEAPON_NONE | |
Lara . gunType = = WEAPON_PISTOLS | |
Lara . gunType = = WEAPON_REVOLVER | |
Lara . gunType = = WEAPON_UZI | |
Lara . gunType = = WEAPON_FLARE ) )
2019-11-21 07:43:34 +01:00
{
2020-08-04 20:32:07 +10:00
item - > goalAnimState = LS_CROUCH_IDLE ;
2019-11-21 07:43:34 +01:00
return ;
}
if ( TrInput & IN_LEFT )
{
2019-12-11 18:07:27 +01:00
Lara . turnRate - = LARA_TURN_RATE ;
if ( Lara . turnRate < - LARA_FAST_TURN )
Lara . turnRate = - LARA_FAST_TURN ;
2019-11-21 07:43:34 +01:00
2019-12-11 18:07:27 +01:00
item - > pos . zRot - = LARA_LEAN_RATE ;
if ( item - > pos . zRot < - LARA_LEAN_MAX )
item - > pos . zRot = - LARA_LEAN_MAX ;
2019-11-21 07:43:34 +01:00
}
else if ( TrInput & IN_RIGHT )
{
2019-12-11 18:07:27 +01:00
Lara . turnRate + = LARA_TURN_RATE ;
if ( Lara . turnRate > LARA_FAST_TURN )
Lara . turnRate = LARA_FAST_TURN ;
2019-11-21 07:43:34 +01:00
2019-12-11 18:07:27 +01:00
item - > pos . zRot + = LARA_LEAN_RATE ;
if ( item - > pos . zRot > LARA_LEAN_MAX )
item - > pos . zRot = LARA_LEAN_MAX ;
2019-11-21 07:43:34 +01:00
}
2020-08-04 20:32:07 +10:00
if ( item - > animNumber = = LA_STAND_TO_RUN )
2019-11-21 07:43:34 +01:00
{
doJump = false ;
}
2020-08-04 20:32:07 +10:00
else if ( item - > animNumber = = LA_RUN )
2019-12-11 18:07:27 +01:00
{
if ( item - > frameNumber = = 4 )
doJump = true ;
}
else
2019-11-21 07:43:34 +01:00
{
doJump = true ;
}
if ( TrInput & IN_JUMP & & doJump & & ! item - > gravityStatus )
{
2020-08-04 20:32:07 +10:00
item - > goalAnimState = LS_JUMP_FORWARD ;
2019-11-21 07:43:34 +01:00
}
else if ( TrInput & IN_FORWARD )
{
if ( Lara . waterStatus = = LW_WADE )
{
2020-08-04 20:32:07 +10:00
item - > goalAnimState = LS_WADE_FORWARD ;
2019-11-21 07:43:34 +01:00
}
else
{
2019-12-11 18:07:27 +01:00
if ( TrInput & IN_WALK )
2020-08-04 20:32:07 +10:00
item - > goalAnimState = LS_WALK_FORWARD ;
2019-12-11 18:07:27 +01:00
else
2020-08-04 20:32:07 +10:00
item - > goalAnimState = LS_RUN_FORWARD ;
2019-11-21 07:43:34 +01:00
}
}
else
{
2020-08-04 20:32:07 +10:00
item - > goalAnimState = LS_STOP ;
2019-11-21 07:43:34 +01:00
}
}
2019-12-02 14:49:19 +01:00
void lara_as_walk ( ITEM_INFO * item , COLL_INFO * coll ) //191B8(<), 192EC(<) (F)
2019-11-21 07:43:34 +01:00
{
if ( item - > hitPoints < = 0 )
{
2020-08-04 20:32:07 +10:00
item - > goalAnimState = LS_STOP ;
2019-11-21 07:43:34 +01:00
return ;
}
if ( ! Lara . isMoving )
{
if ( TrInput & IN_LEFT )
{
2019-12-11 18:07:27 +01:00
Lara . turnRate - = LARA_TURN_RATE ;
2020-05-31 04:20:52 -05:00
if ( Lara . turnRate < - ANGLE ( 4.0f ) )
Lara . turnRate = - ANGLE ( 4.0f ) ;
2019-11-21 07:43:34 +01:00
}
else if ( TrInput & IN_RIGHT )
{
2019-12-11 18:07:27 +01:00
Lara . turnRate + = LARA_TURN_RATE ;
2020-05-31 04:20:52 -05:00
if ( Lara . turnRate > ANGLE ( 4.0f ) )
Lara . turnRate = ANGLE ( 4.0f ) ;
2019-11-21 07:43:34 +01:00
}
if ( TrInput & IN_FORWARD )
{
if ( Lara . waterStatus = = LW_WADE )
{
2020-08-04 20:32:07 +10:00
item - > goalAnimState = LS_WADE_FORWARD ;
2019-11-21 07:43:34 +01:00
}
else if ( TrInput & IN_WALK )
{
2020-08-04 20:32:07 +10:00
item - > goalAnimState = LS_WALK_FORWARD ;
2019-11-21 07:43:34 +01:00
}
else
{
2020-08-04 20:32:07 +10:00
item - > goalAnimState = LS_RUN_FORWARD ;
2019-11-21 07:43:34 +01:00
}
}
else
{
2020-08-04 20:32:07 +10:00
item - > goalAnimState = LS_STOP ;
2019-11-21 07:43:34 +01:00
}
}
}
// FIXED
2019-12-02 14:49:19 +01:00
void lara_col_reach ( ITEM_INFO * item , COLL_INFO * coll ) //18D0C, 18E40 (F)
2019-11-21 07:43:34 +01:00
{
if ( Lara . ropePtr = = - 1 )
item - > gravityStatus = true ;
2020-06-09 22:24:36 -03:00
Lara . moveAngle = 0 ;
2019-11-21 07:43:34 +01:00
2019-12-11 18:07:27 +01:00
coll - > badPos = NO_BAD_POS ;
2019-11-21 07:43:34 +01:00
coll - > badNeg = 0 ;
2019-12-11 18:07:27 +01:00
coll - > badCeiling = BAD_JUMP_CEILING ;
2019-11-21 07:43:34 +01:00
2020-06-09 22:51:03 -03:00
coll - > facing = Lara . moveAngle ;
GetCollisionInfo ( coll , item - > pos . xPos , item - > pos . yPos , item - > pos . zPos , item - > roomNumber , LARA_HITE ) ;
2019-11-21 07:43:34 +01:00
2020-06-06 15:48:38 -03:00
short angle ;
bool result = false ;
2019-12-02 09:11:21 +01:00
int edge = 0 ;
int edgeCatch = 0 ;
2019-11-21 07:43:34 +01:00
if ( TrInput & IN_ACTION & & Lara . gunStatus = = LG_NO_ARMS & & ! coll - > hitStatic )
{
if ( Lara . canMonkeySwing & & coll - > collType = = CT_TOP )
{
Lara . headYrot = 0 ;
Lara . headXrot = 0 ;
Lara . torsoYrot = 0 ;
Lara . torsoXrot = 0 ;
Lara . gunStatus = LG_HANDS_BUSY ;
2020-08-04 20:32:07 +10:00
item - > animNumber = LA_REACH_TO_MONKEYSWING ;
2020-07-21 09:56:47 +02:00
item - > frameNumber = g_Level . Anims [ item - > animNumber ] . frameBase ;
2020-08-04 20:32:07 +10:00
item - > goalAnimState = LS_MONKEYSWING_IDLE ;
item - > currentAnimState = LS_MONKEYSWING_IDLE ;
2019-11-21 07:43:34 +01:00
item - > gravityStatus = false ;
item - > speed = 0 ;
item - > fallspeed = 0 ;
return ;
}
if ( coll - > midCeiling < = - 384 & &
coll - > midFloor > = 200 & &
coll - > collType = = CT_FRONT )
{
edgeCatch = LaraTestEdgeCatch ( item , coll , & edge ) ;
if ( ! ( ! edgeCatch | | edgeCatch < 0 & & ! LaraTestHangOnClimbWall ( item , coll ) ) )
{
angle = item - > pos . yRot ;
2020-06-07 19:25:05 +02:00
if ( coll - > midSplitFloor & & coll - > frontSplitFloor = = coll - > midSplitFloor )
2020-06-09 16:26:14 +02:00
{
2020-06-09 12:09:00 -03:00
result = SnapToDiagonal ( angle , 35 ) ;
2020-06-09 16:26:14 +02:00
}
2019-11-21 07:43:34 +01:00
else
2020-06-09 16:26:14 +02:00
{
2020-06-09 12:09:00 -03:00
result = SnapToQuadrant ( angle , 35 ) ;
2020-06-09 16:26:14 +02:00
}
2019-11-21 07:43:34 +01:00
}
}
}
2020-06-06 15:48:38 -03:00
if ( ! result )
2019-11-21 07:43:34 +01:00
{
LaraSlideEdgeJump ( item , coll ) ;
2020-06-09 22:51:03 -03:00
coll - > facing = Lara . moveAngle ;
GetCollisionInfo ( coll , item - > pos . xPos , item - > pos . yPos , item - > pos . zPos , item - > roomNumber , LARA_HITE ) ;
2019-11-21 07:43:34 +01:00
ShiftItem ( item , coll ) ;
if ( item - > fallspeed > 0 & & coll - > midFloor < = 0 )
{
if ( LaraLandedBad ( item , coll ) )
{
2020-08-04 20:32:07 +10:00
item - > goalAnimState = LS_DEATH ;
2019-11-21 07:43:34 +01:00
}
else
{
2020-08-04 20:32:07 +10:00
item - > goalAnimState = LS_STOP ;
2019-11-21 07:43:34 +01:00
item - > fallspeed = 0 ;
item - > gravityStatus = false ;
if ( coll - > midFloor ! = NO_HEIGHT )
item - > pos . yPos + = coll - > midFloor ;
}
}
}
else
{
if ( TestHangSwingIn ( item , angle ) )
{
2020-08-08 15:15:15 -05:00
/* if (TR12_OSCILLATE_HANG == true)
2020-06-10 23:24:18 -05:00
{
Lara . headYrot = 0 ;
Lara . headXrot = 0 ;
Lara . torsoYrot = 0 ;
Lara . torsoXrot = 0 ;
2020-08-04 20:32:07 +10:00
item - > animNumber = LA_REACH_TO_HANG_OSCILLATE ;
2020-07-21 09:56:47 +02:00
item - > frameNumber = g_Level . Anims [ item - > animNumber ] . frameBase ;
2020-08-04 20:32:07 +10:00
item - > currentAnimState = LS_HANG ;
item - > goalAnimState = LS_HANG ;
2020-06-10 23:24:18 -05:00
}
else
2020-08-08 15:15:15 -05:00
{ */
2020-06-10 23:24:18 -05:00
Lara . headYrot = 0 ;
Lara . headXrot = 0 ;
Lara . torsoYrot = 0 ;
Lara . torsoXrot = 0 ;
2020-08-04 20:32:07 +10:00
item - > animNumber = LA_REACH_TO_MONKEYSWING ;
2020-07-21 09:56:47 +02:00
item - > frameNumber = g_Level . Anims [ item - > animNumber ] . frameBase ;
2020-08-04 20:32:07 +10:00
item - > currentAnimState = LS_MONKEYSWING_IDLE ;
item - > goalAnimState = LS_MONKEYSWING_IDLE ;
2020-08-08 15:15:15 -05:00
// }
2019-11-21 07:43:34 +01:00
}
else
{
2020-05-24 03:10:00 -05:00
if ( TestHangFeet ( item , angle ) )
2020-05-23 15:59:18 -05:00
{
2020-08-04 20:32:07 +10:00
item - > animNumber = LA_REACH_TO_HANG ;
2020-07-21 09:56:47 +02:00
item - > frameNumber = g_Level . Anims [ item - > animNumber ] . frameBase ;
2020-08-04 20:32:07 +10:00
item - > currentAnimState = LS_HANG ;
item - > goalAnimState = LS_HANG_FEET ;
2020-05-23 15:59:18 -05:00
}
else
{
2020-08-04 20:32:07 +10:00
item - > animNumber = LA_REACH_TO_HANG ;
2020-07-21 09:56:47 +02:00
item - > frameNumber = g_Level . Anims [ item - > animNumber ] . frameBase ;
2020-08-04 20:32:07 +10:00
item - > currentAnimState = LS_HANG ;
item - > goalAnimState = LS_HANG ;
2020-05-23 15:59:18 -05:00
}
2019-11-21 07:43:34 +01:00
}
2020-07-25 18:02:35 +02:00
BOUNDING_BOX * bounds = GetBoundsAccurate ( item ) ;
2019-11-21 07:43:34 +01:00
if ( edgeCatch < = 0 )
{
2020-07-25 18:02:35 +02:00
item - > pos . yPos = edge - bounds - > Y1 - 22 ;
2019-11-21 07:43:34 +01:00
}
else
{
2020-07-25 18:02:35 +02:00
item - > pos . yPos + = coll - > frontFloor - bounds - > Y1 ;
2019-11-21 07:43:34 +01:00
2020-06-07 19:25:05 +02:00
if ( coll - > midSplitFloor )
2019-11-21 07:43:34 +01:00
{
2020-06-07 19:25:05 +02:00
Vector2 v = GetDiagonalIntersect ( item - > pos . xPos , item - > pos . zPos , coll - > midSplitFloor , LARA_RAD , angle ) ;
item - > pos . xPos = v . x ;
item - > pos . zPos = v . y ;
}
else
{
Vector2 v = GetOrthogonalIntersect ( item - > pos . xPos , item - > pos . zPos , LARA_RAD , angle ) ;
item - > pos . xPos = v . x ;
item - > pos . zPos = v . y ;
2019-11-21 07:43:34 +01:00
}
}
item - > pos . yRot = angle ;
item - > gravityStatus = true ;
item - > speed = 2 ;
item - > fallspeed = 1 ;
Lara . gunStatus = LG_HANDS_BUSY ;
}
}
2019-12-02 14:49:19 +01:00
void lara_as_reach ( ITEM_INFO * item , COLL_INFO * coll ) //18CE0(<), 18E14(<) (F)
2019-11-21 07:43:34 +01:00
{
2020-05-31 04:20:52 -05:00
Camera . targetAngle = ANGLE ( 85.0f ) ;
2019-11-21 07:43:34 +01:00
if ( item - > fallspeed > LARA_FREEFALL_SPEED )
2020-08-04 20:32:07 +10:00
item - > goalAnimState = LS_FREEFALL ;
2019-11-21 07:43:34 +01:00
}
2019-12-02 14:49:19 +01:00
void lara_col_forwardjump ( ITEM_INFO * item , COLL_INFO * coll ) //18B88, 18CBC (F)
2019-11-21 07:43:34 +01:00
{
if ( item - > speed < 0 )
2020-06-09 22:24:36 -03:00
Lara . moveAngle = ANGLE ( 180 ) ;
2019-11-21 07:43:34 +01:00
else
2020-06-09 22:24:36 -03:00
Lara . moveAngle = 0 ;
2019-11-21 07:43:34 +01:00
2019-12-11 18:07:27 +01:00
coll - > badPos = NO_BAD_POS ;
coll - > badNeg = - STEPUP_HEIGHT ;
coll - > badCeiling = BAD_JUMP_CEILING ;
2019-11-21 07:43:34 +01:00
2020-06-09 22:51:03 -03:00
coll - > facing = Lara . moveAngle ;
GetCollisionInfo ( coll , item - > pos . xPos , item - > pos . yPos , item - > pos . zPos , item - > roomNumber , LARA_HITE ) ;
2019-11-21 07:43:34 +01:00
LaraDeflectEdgeJump ( item , coll ) ;
if ( item - > speed < 0 )
2020-06-09 22:24:36 -03:00
Lara . moveAngle = 0 ;
2019-11-21 07:43:34 +01:00
if ( coll - > midFloor < = 0 & & item - > fallspeed > 0 )
{
if ( LaraLandedBad ( item , coll ) )
{
2020-08-04 20:32:07 +10:00
item - > goalAnimState = LS_DEATH ;
2019-11-21 07:43:34 +01:00
}
else
{
2019-12-11 18:07:27 +01:00
if ( Lara . waterStatus = = LW_WADE )
{
2020-08-04 20:32:07 +10:00
item - > goalAnimState = LS_STOP ;
2019-12-11 18:07:27 +01:00
}
else
{
if ( TrInput & IN_FORWARD & & ! ( TrInput & IN_STEPSHIFT ) )
2020-08-04 20:32:07 +10:00
item - > goalAnimState = LS_RUN_FORWARD ;
2019-12-11 18:07:27 +01:00
else
2020-08-04 20:32:07 +10:00
item - > goalAnimState = LS_STOP ;
2019-12-11 18:07:27 +01:00
}
2019-11-21 07:43:34 +01:00
}
item - > gravityStatus = false ;
item - > fallspeed = 0 ;
item - > speed = 0 ;
if ( coll - > midFloor ! = NO_HEIGHT )
item - > pos . yPos + = coll - > midFloor ;
2019-12-11 18:07:27 +01:00
AnimateLara ( item ) ;
2019-11-21 07:43:34 +01:00
}
}
2019-12-02 14:49:19 +01:00
void lara_as_forwardjump ( ITEM_INFO * item , COLL_INFO * coll ) //18A34, 18B68 (F)
2019-11-21 07:43:34 +01:00
{
2020-08-04 20:32:07 +10:00
if ( item - > goalAnimState = = LS_SWANDIVE_START | |
item - > goalAnimState = = LS_REACH )
item - > goalAnimState = LS_JUMP_FORWARD ;
2019-11-21 07:43:34 +01:00
2020-08-04 20:32:07 +10:00
if ( item - > goalAnimState ! = LS_DEATH & &
item - > goalAnimState ! = LS_STOP & &
item - > goalAnimState ! = LS_RUN_FORWARD )
2019-11-21 07:43:34 +01:00
{
if ( Lara . gunStatus = = LG_NO_ARMS & & TrInput & IN_ACTION )
2020-08-04 20:32:07 +10:00
item - > goalAnimState = LS_REACH ;
2019-11-21 07:43:34 +01:00
if ( TrInput & IN_BACK | | TrInput & IN_ROLL )
2020-08-04 20:32:07 +10:00
item - > goalAnimState = LS_JUMP_ROLL_180 ;
2019-11-21 07:43:34 +01:00
if ( Lara . gunStatus = = LG_NO_ARMS & & TrInput & IN_WALK )
2020-08-04 20:32:07 +10:00
item - > goalAnimState = LS_SWANDIVE_START ;
2019-11-21 07:43:34 +01:00
if ( item - > fallspeed > LARA_FREEFALL_SPEED )
2020-08-04 20:32:07 +10:00
item - > goalAnimState = LS_FREEFALL ;
2019-11-21 07:43:34 +01:00
}
if ( TrInput & IN_LEFT )
{
2019-12-11 18:07:27 +01:00
Lara . turnRate - = LARA_TURN_RATE ;
2019-11-21 07:43:34 +01:00
2020-05-31 04:20:52 -05:00
if ( Lara . turnRate < - ANGLE ( 3.0f ) )
Lara . turnRate = - ANGLE ( 3.0f ) ;
2019-11-21 07:43:34 +01:00
}
else if ( TrInput & IN_RIGHT )
{
2019-12-11 18:07:27 +01:00
Lara . turnRate + = LARA_TURN_RATE ;
2019-11-21 07:43:34 +01:00
2020-05-31 04:20:52 -05:00
if ( Lara . turnRate > ANGLE ( 3.0f ) )
Lara . turnRate = ANGLE ( 3.0f ) ;
2019-11-21 07:43:34 +01:00
}
}
2020-01-27 00:13:39 -03:00
void lara_col_upjump ( ITEM_INFO * item , COLL_INFO * coll ) // (F) (D)
2019-11-21 07:43:34 +01:00
{
if ( item - > hitPoints < = 0 )
{
2020-08-04 20:32:07 +10:00
item - > goalAnimState = LS_STOP ;
2019-11-21 07:43:34 +01:00
return ;
}
2020-06-09 22:24:36 -03:00
Lara . moveAngle = 0 ;
2019-11-21 07:43:34 +01:00
2019-12-11 18:07:27 +01:00
coll - > badPos = NO_BAD_POS ;
coll - > badNeg = - STEPUP_HEIGHT ;
coll - > badCeiling = BAD_JUMP_CEILING ;
coll - > hitCeiling = false ;
2020-05-31 04:20:52 -05:00
coll - > facing = item - > speed < 0 ? Lara . moveAngle + ANGLE ( 180.0f ) : Lara . moveAngle ;
2019-11-21 07:43:34 +01:00
GetCollisionInfo ( coll , item - > pos . xPos , item - > pos . yPos , item - > pos . zPos , item - > roomNumber , 870 ) ;
if ( TrInput & IN_ACTION & & Lara . gunStatus = = LG_NO_ARMS & & ! coll - > hitStatic )
{
if ( Lara . canMonkeySwing & & coll - > collType = = CT_TOP )
{
2020-08-04 20:32:07 +10:00
item - > goalAnimState = LS_MONKEYSWING_IDLE ;
item - > currentAnimState = LS_MONKEYSWING_IDLE ;
item - > animNumber = LA_JUMP_UP_TO_MONKEYSWING ;
2020-07-21 09:56:47 +02:00
item - > frameNumber = g_Level . Anims [ item - > animNumber ] . frameBase ;
2019-11-21 07:43:34 +01:00
item - > gravityStatus = false ;
item - > speed = 0 ;
item - > fallspeed = 0 ;
Lara . gunStatus = LG_HANDS_BUSY ;
MonkeySwingSnap ( item , coll ) ;
return ;
}
2020-01-27 00:13:39 -03:00
if ( coll - > collType = = CT_FRONT & & coll - > midCeiling < = - STEPUP_HEIGHT )
2019-11-21 07:43:34 +01:00
{
2019-12-02 09:11:21 +01:00
int edge ;
int edgeCatch = LaraTestEdgeCatch ( item , coll , & edge ) ;
2019-11-21 07:43:34 +01:00
if ( edgeCatch )
{
if ( edgeCatch > = 0 | | LaraTestHangOnClimbWall ( item , coll ) )
{
2019-12-02 09:11:21 +01:00
short angle = item - > pos . yRot ;
2020-06-09 12:09:00 -03:00
bool result ;
2020-06-09 16:26:14 +02:00
2020-06-07 19:25:05 +02:00
if ( coll - > midSplitFloor & & coll - > frontSplitFloor = = coll - > midSplitFloor )
2020-06-09 16:26:14 +02:00
{
2020-06-09 12:09:00 -03:00
result = SnapToDiagonal ( angle , 35 ) ;
2020-06-09 16:26:14 +02:00
}
2020-06-07 19:25:05 +02:00
else
2020-06-09 16:26:14 +02:00
{
2020-06-09 12:09:00 -03:00
result = SnapToQuadrant ( angle , 35 ) ;
2020-06-09 16:26:14 +02:00
}
2019-11-21 07:43:34 +01:00
2020-06-09 12:09:00 -03:00
if ( result )
2019-11-21 07:43:34 +01:00
{
2020-07-25 18:02:35 +02:00
BOUNDING_BOX * bounds ;
2019-11-21 07:43:34 +01:00
if ( TestHangSwingIn ( item , angle ) )
{
2020-08-04 20:32:07 +10:00
item - > animNumber = LA_JUMP_UP_TO_MONKEYSWING ;
2020-07-21 09:56:47 +02:00
item - > frameNumber = g_Level . Anims [ item - > animNumber ] . frameBase ;
2020-08-04 20:32:07 +10:00
item - > goalAnimState = LS_MONKEYSWING_IDLE ;
item - > currentAnimState = LS_MONKEYSWING_IDLE ;
2019-11-21 07:43:34 +01:00
}
else
{
2020-05-24 03:10:00 -05:00
if ( TestHangFeet ( item , angle ) )
2020-05-23 15:59:18 -05:00
{
2020-08-04 20:32:07 +10:00
item - > animNumber = LA_REACH_TO_HANG ;
2020-07-21 09:56:47 +02:00
item - > frameNumber = g_Level . Anims [ item - > animNumber ] . frameBase + 12 ;
2020-08-04 20:32:07 +10:00
item - > currentAnimState = LS_HANG ;
item - > goalAnimState = LS_HANG_FEET ;
2020-05-23 15:59:18 -05:00
}
else
{
2020-08-04 20:32:07 +10:00
item - > animNumber = LA_REACH_TO_HANG ;
2020-07-21 09:56:47 +02:00
item - > frameNumber = g_Level . Anims [ item - > animNumber ] . frameBase + 12 ;
2020-08-04 20:32:07 +10:00
item - > currentAnimState = LS_HANG ;
item - > goalAnimState = LS_HANG ;
2020-05-23 15:59:18 -05:00
}
2019-11-21 07:43:34 +01:00
}
2020-07-25 18:02:35 +02:00
bounds = GetBoundsAccurate ( item ) ;
2019-11-21 07:43:34 +01:00
if ( edgeCatch < = 0 )
2020-07-25 18:02:35 +02:00
item - > pos . yPos = edge - bounds - > Y1 + 4 ;
2019-11-21 07:43:34 +01:00
else
2020-07-25 18:02:35 +02:00
item - > pos . yPos + = coll - > frontFloor - bounds - > Y1 ;
2019-11-21 07:43:34 +01:00
2020-06-07 19:25:05 +02:00
if ( coll - > midSplitFloor )
{
Vector2 v = GetDiagonalIntersect ( item - > pos . xPos , item - > pos . zPos , coll - > midSplitFloor , LARA_RAD , item - > pos . yRot ) ;
item - > pos . xPos = v . x ;
item - > pos . zPos = v . y ;
}
else
{
Vector2 v = GetOrthogonalIntersect ( item - > pos . xPos , item - > pos . zPos , LARA_RAD , item - > pos . yRot ) ;
item - > pos . xPos = v . x ;
item - > pos . zPos = v . y ;
}
2019-11-21 07:43:34 +01:00
item - > pos . yRot = angle ;
item - > gravityStatus = false ;
item - > speed = 0 ;
item - > fallspeed = 0 ;
Lara . gunStatus = LG_HANDS_BUSY ;
Lara . torsoYrot = 0 ;
Lara . torsoXrot = 0 ;
return ;
}
}
}
}
}
ShiftItem ( item , coll ) ;
if ( coll - > collType = = CT_CLAMP | |
coll - > collType = = CT_TOP | |
coll - > collType = = CT_TOP_FRONT | |
coll - > hitCeiling )
item - > fallspeed = 1 ;
if ( coll - > collType = = CT_NONE )
{
if ( item - > fallspeed < - 70 )
{
if ( TrInput & IN_FORWARD & & item - > speed < 5 )
{
item - > speed + + ;
}
else if ( TrInput & IN_BACK & & item - > speed > - 5 )
{
item - > speed - = 2 ;
}
}
}
else
{
item - > speed = item - > speed < = 0 ? - 2 : 2 ;
}
if ( item - > fallspeed > 0 & & coll - > midFloor < = 0 )
{
2020-08-04 20:32:07 +10:00
item - > goalAnimState = LaraLandedBad ( item , coll ) ? LS_DEATH : LS_STOP ;
2019-11-21 07:43:34 +01:00
item - > gravityStatus = false ;
item - > fallspeed = 0 ;
if ( coll - > midFloor ! = NO_HEIGHT )
item - > pos . yPos + = coll - > midFloor ;
}
}
2020-01-27 00:13:39 -03:00
void lara_as_upjump ( ITEM_INFO * item , COLL_INFO * coll ) // (F) (D)
2019-11-21 07:43:34 +01:00
{
if ( item - > fallspeed > LARA_FREEFALL_SPEED )
{
2020-08-04 20:32:07 +10:00
item - > goalAnimState = LS_FREEFALL ;
2019-11-21 07:43:34 +01:00
}
}
2020-01-25 23:31:26 -03:00
void lara_col_stop ( ITEM_INFO * item , COLL_INFO * coll ) // (F) (D)
2019-11-21 07:43:34 +01:00
{
2020-06-09 22:24:36 -03:00
Lara . moveAngle = 0 ;
2019-12-29 20:35:25 +01:00
coll - > badPos = STEPUP_HEIGHT ;
2019-12-11 18:07:27 +01:00
coll - > badNeg = - STEPUP_HEIGHT ;
2019-11-21 07:43:34 +01:00
coll - > badCeiling = 0 ;
item - > gravityStatus = false ;
item - > fallspeed = 0 ;
2019-12-29 20:35:25 +01:00
coll - > slopesArePits = true ;
2020-01-25 23:31:26 -03:00
coll - > slopesAreWalls = 1 ;
2020-06-09 22:51:03 -03:00
coll - > facing = Lara . moveAngle ;
GetCollisionInfo ( coll , item - > pos . xPos , item - > pos . yPos , item - > pos . zPos , item - > roomNumber , LARA_HITE ) ;
2019-11-21 07:43:34 +01:00
2020-01-14 14:25:37 +01:00
if ( LaraHitCeiling ( item , coll ) )
return ;
2019-11-21 07:43:34 +01:00
2020-01-14 14:25:37 +01:00
if ( LaraFallen ( item , coll ) )
return ;
if ( TestLaraSlide ( item , coll ) )
return ;
ShiftItem ( item , coll ) ;
2020-01-29 08:29:15 +01:00
# if 1
if ( coll - > midFloor ! = NO_HEIGHT )
item - > pos . yPos + = coll - > midFloor ;
# else
2020-07-21 09:56:47 +02:00
if ( ! ( g_Level . Rooms [ item - > roomNumber ] . flags & ENV_FLAG_SWAMP ) | | coll - > midFloor < 0 )
2020-01-14 14:25:37 +01:00
item - > pos . yPos + = coll - > midFloor ;
2020-07-21 09:56:47 +02:00
else if ( g_Level . Rooms [ item - > roomNumber ] . flags & ENV_FLAG_SWAMP & & coll - > midFloor )
2020-01-14 14:25:37 +01:00
item - > pos . yPos + = SWAMP_GRAVITY ;
2020-01-29 08:29:15 +01:00
# endif
2019-11-21 07:43:34 +01:00
}
2020-01-27 00:13:39 -03:00
void lara_as_climbroped ( ITEM_INFO * item , COLL_INFO * coll ) // (F) (D)
2019-11-21 07:43:34 +01:00
{
2019-12-07 08:36:13 +01:00
LaraClimbRope ( item , coll ) ;
2019-11-21 07:43:34 +01:00
}
2020-01-27 00:13:39 -03:00
void lara_as_climbrope ( ITEM_INFO * item , COLL_INFO * coll ) // (F) (D)
2019-11-21 07:43:34 +01:00
{
if ( TrInput & IN_ROLL )
{
FallFromRope ( item ) ;
}
else
{
2020-05-31 04:20:52 -05:00
Camera . targetAngle = ANGLE ( 30.0f ) ;
2019-11-21 07:43:34 +01:00
2020-07-21 09:56:47 +02:00
if ( g_Level . Anims [ item - > animNumber ] . frameEnd = = item - > frameNumber )
2019-11-21 07:43:34 +01:00
{
2020-07-21 09:56:47 +02:00
item - > frameNumber = g_Level . Anims [ item - > animNumber ] . frameBase ;
2019-11-21 07:43:34 +01:00
Lara . ropeSegment - = 2 ;
}
2020-01-15 22:26:49 -03:00
if ( ! ( TrInput & IN_FORWARD ) | | Lara . ropeSegment < = 4 )
2020-08-04 20:32:07 +10:00
item - > goalAnimState = LS_ROPE_IDLE ;
2019-11-21 07:43:34 +01:00
}
}
2020-01-27 00:13:39 -03:00
void lara_col_ropefwd ( ITEM_INFO * item , COLL_INFO * coll ) // (F) (D)
2019-11-21 07:43:34 +01:00
{
2019-12-07 08:36:13 +01:00
Camera . targetDistance = SECTOR ( 2 ) ;
2019-11-21 07:43:34 +01:00
UpdateRopeSwing ( item ) ;
2020-08-04 20:32:07 +10:00
if ( item - > animNumber = = LA_ROPE_SWING )
2019-11-21 07:43:34 +01:00
{
if ( TrInput & IN_SPRINT )
{
2019-12-02 09:11:21 +01:00
int vel ;
2019-11-21 07:43:34 +01:00
if ( abs ( Lara . ropeLastX ) < 9000 )
2020-01-15 22:26:49 -03:00
vel = 192 * ( 9000 - abs ( Lara . ropeLastX ) ) / 9000 ;
2019-11-21 07:43:34 +01:00
else
vel = 0 ;
ApplyVelocityToRope ( Lara . ropeSegment - 2 ,
2020-05-31 04:20:52 -05:00
item - > pos . yRot + ( Lara . ropeDirection ? ANGLE ( 0.0f ) : ANGLE ( 180.0f ) ) ,
2020-01-15 22:26:49 -03:00
vel > > 5 ) ;
2019-11-21 07:43:34 +01:00
}
if ( Lara . ropeFrame > Lara . ropeDFrame )
{
2020-06-07 22:24:22 +02:00
Lara . ropeFrame - = ( unsigned short ) Lara . ropeFrameRate ;
2019-11-21 07:43:34 +01:00
if ( Lara . ropeFrame < Lara . ropeDFrame )
Lara . ropeFrame = Lara . ropeDFrame ;
}
else if ( Lara . ropeFrame < Lara . ropeDFrame )
{
2020-06-07 22:24:22 +02:00
Lara . ropeFrame + = ( unsigned short ) Lara . ropeFrameRate ;
2019-11-21 07:43:34 +01:00
if ( Lara . ropeFrame > Lara . ropeDFrame )
Lara . ropeFrame = Lara . ropeDFrame ;
}
2020-01-15 22:26:49 -03:00
item - > frameNumber = Lara . ropeFrame > > 8 ;
2019-11-21 07:43:34 +01:00
if ( ! ( TrInput & IN_SPRINT ) & &
2020-08-04 20:32:07 +10:00
item - > frameNumber = = g_Level . Anims [ LA_ROPE_SWING ] . frameBase + 32 & &
2019-11-21 07:43:34 +01:00
Lara . ropeMaxXBackward < 6750 & &
Lara . ropeMaxXForward < 6750 )
{
2020-08-04 20:32:07 +10:00
item - > animNumber = LA_JUMP_UP_TO_ROPE_END ;
2020-07-21 09:56:47 +02:00
item - > frameNumber = g_Level . Anims [ item - > animNumber ] . frameBase ;
2019-11-21 07:43:34 +01:00
2020-08-04 20:32:07 +10:00
item - > currentAnimState = LS_ROPE_IDLE ;
item - > goalAnimState = LS_ROPE_IDLE ;
2019-11-21 07:43:34 +01:00
}
if ( TrInput & IN_JUMP )
JumpOffRope ( item ) ;
}
2020-08-04 20:32:07 +10:00
else if ( item - > frameNumber = = g_Level . Anims [ LA_ROPE_IDLE_TO_SWING ] . frameBase + 15 )
2019-11-21 07:43:34 +01:00
{
ApplyVelocityToRope ( Lara . ropeSegment , item - > pos . yRot , 128 ) ;
2019-12-07 08:36:13 +01:00
}
2019-11-21 07:43:34 +01:00
}
2020-01-27 00:13:39 -03:00
void lara_as_roper ( ITEM_INFO * item , COLL_INFO * coll ) // (F) (D)
2019-11-21 07:43:34 +01:00
{
if ( TrInput & IN_ACTION )
{
2020-01-15 22:26:49 -03:00
if ( TrInput & IN_RIGHT )
2019-11-21 07:43:34 +01:00
{
Lara . ropeY - = 256 ;
}
else
{
2020-08-04 20:32:07 +10:00
item - > goalAnimState = LS_ROPE_IDLE ;
2019-11-21 07:43:34 +01:00
}
}
else
{
FallFromRope ( item ) ;
}
}
2020-01-27 00:13:39 -03:00
void lara_as_ropel ( ITEM_INFO * item , COLL_INFO * coll ) // (F) (D)
2019-11-21 07:43:34 +01:00
{
if ( TrInput & IN_ACTION )
{
if ( TrInput & IN_LEFT )
{
Lara . ropeY + = 256 ;
}
else
{
2020-08-04 20:32:07 +10:00
item - > goalAnimState = LS_ROPE_IDLE ;
2019-11-21 07:43:34 +01:00
}
}
else
{
FallFromRope ( item ) ;
}
}
2020-01-27 00:13:39 -03:00
void lara_col_rope ( ITEM_INFO * item , COLL_INFO * coll ) // (F) (D)
2019-11-21 07:43:34 +01:00
{
if ( TrInput & IN_ACTION )
{
UpdateRopeSwing ( item ) ;
if ( TrInput & IN_SPRINT )
{
2020-08-04 20:32:07 +10:00
Lara . ropeDFrame = ( g_Level . Anims [ LA_ROPE_SWING ] . frameBase + 32 ) < < 8 ;
2019-11-21 07:43:34 +01:00
Lara . ropeFrame = Lara . ropeDFrame ;
2020-08-04 20:32:07 +10:00
item - > goalAnimState = LS_ROPE_SWING ;
2019-11-21 07:43:34 +01:00
}
else if ( TrInput & IN_FORWARD & & Lara . ropeSegment > 4 )
{
2020-08-04 20:32:07 +10:00
item - > goalAnimState = LS_ROPE_UP ;
2019-11-21 07:43:34 +01:00
}
else if ( TrInput & IN_BACK & & Lara . ropeSegment < 21 )
{
2020-08-04 20:32:07 +10:00
item - > goalAnimState = LS_ROPE_DOWN ;
2019-11-21 07:43:34 +01:00
Lara . ropeFlag = 0 ;
Lara . ropeCount = 0 ;
}
else if ( TrInput & IN_LEFT )
{
2020-08-04 20:32:07 +10:00
item - > goalAnimState = LS_ROPE_TURN_CLOCKWISE ;
2019-11-21 07:43:34 +01:00
}
else if ( TrInput & IN_RIGHT )
{
2020-08-04 20:32:07 +10:00
item - > goalAnimState = LS_ROPE_TURN_COUNTER_CLOCKWISE ;
2019-11-21 07:43:34 +01:00
}
}
else
{
FallFromRope ( item ) ;
}
}
2020-01-27 00:13:39 -03:00
void lara_as_rope ( ITEM_INFO * item , COLL_INFO * coll ) // (F) (D)
2019-11-21 07:43:34 +01:00
{
if ( ! ( TrInput & IN_ACTION ) )
FallFromRope ( item ) ;
if ( TrInput & IN_LOOK )
LookUpDown ( ) ;
}
2019-12-02 14:49:19 +01:00
void lara_col_poledown ( ITEM_INFO * item , COLL_INFO * coll ) //171A0, 172D4 (F)
2019-11-21 07:43:34 +01:00
{
coll - > enableSpaz = false ;
coll - > enableBaddiePush = false ;
if ( TrInput & IN_LOOK )
LookUpDown ( ) ;
2019-12-22 17:06:25 -03:00
if ( ( TrInput & ( IN_BACK | IN_ACTION ) ) ! = ( IN_BACK | IN_ACTION ) | | item - > hitPoints < = 0 )
2020-08-04 20:32:07 +10:00
item - > goalAnimState = LS_POLE_IDLE ;
2019-11-21 07:43:34 +01:00
2019-12-11 18:07:27 +01:00
coll - > badPos = NO_BAD_POS ;
coll - > badNeg = - STEPUP_HEIGHT ;
2019-11-21 07:43:34 +01:00
coll - > badCeiling = 0 ;
2020-06-09 22:24:36 -03:00
Lara . moveAngle = 0 ;
2019-11-21 07:43:34 +01:00
2019-12-29 20:35:25 +01:00
coll - > slopesAreWalls = true ;
2019-11-21 07:43:34 +01:00
coll - > facing = Lara . moveAngle ;
2019-12-16 19:04:28 +01:00
coll - > radius = 100 ;
2019-11-21 07:43:34 +01:00
2020-06-09 22:51:03 -03:00
coll - > facing = Lara . moveAngle ;
GetCollisionInfo ( coll , item - > pos . xPos , item - > pos . yPos , item - > pos . zPos , item - > roomNumber , LARA_HITE ) ;
2019-11-21 07:43:34 +01:00
if ( coll - > midFloor < 0 )
{
2019-12-02 09:11:21 +01:00
short roomNumber = item - > roomNumber ;
2019-11-21 07:43:34 +01:00
item - > floor = GetFloorHeight ( GetFloor ( item - > pos . xPos , item - > pos . yPos , item - > pos . zPos , & roomNumber ) ,
item - > pos . xPos , item - > pos . yPos - 762 , item - > pos . zPos ) ;
2020-08-04 20:32:07 +10:00
item - > goalAnimState = LS_POLE_IDLE ;
2019-11-21 07:43:34 +01:00
item - > itemFlags [ 2 ] = 0 ;
}
if ( TrInput & IN_LEFT )
{
item - > pos . yRot + = 256 ;
}
else if ( TrInput & IN_RIGHT )
{
item - > pos . yRot - = 256 ;
}
2020-08-04 20:32:07 +10:00
if ( item - > animNumber = = LA_POLE_DOWN_END )
2019-11-21 07:43:34 +01:00
{
item - > itemFlags [ 2 ] - = SECTOR ( 1 ) ;
}
else
{
item - > itemFlags [ 2 ] + = 256 ;
}
// CHECK
SoundEffect ( SFX_LARA_ROPEDOWN_LOOP , & item - > pos , 0 ) ;
2020-05-31 04:20:52 -05:00
item - > itemFlags [ 2 ] = CLAMP ( item - > itemFlags [ 2 ] , 0 , ANGLE ( 90.0f ) ) ;
2019-11-21 07:43:34 +01:00
item - > pos . yPos + = item - > itemFlags [ 2 ] > > 8 ;
}
2019-12-02 14:49:19 +01:00
void lara_col_poleup ( ITEM_INFO * item , COLL_INFO * coll ) //170D8(<), 1720C(<) (F)
2019-11-21 07:43:34 +01:00
{
coll - > enableBaddiePush = false ;
coll - > enableSpaz = false ;
if ( TrInput & IN_LOOK )
LookUpDown ( ) ;
if ( ! ( TrInput & IN_ACTION ) | | ! ( TrInput & IN_FORWARD ) | | item - > hitPoints < = 0 )
2020-08-04 20:32:07 +10:00
item - > goalAnimState = LS_POLE_IDLE ;
2019-11-21 07:43:34 +01:00
2019-12-02 09:11:21 +01:00
short roomNumber = item - > roomNumber ;
2019-11-21 07:43:34 +01:00
if ( item - > pos . yPos -
GetCeiling ( GetFloor ( item - > pos . xPos , item - > pos . yPos , item - > pos . zPos , & roomNumber ) ,
item - > pos . xPos , item - > pos . yPos , item - > pos . zPos ) < SECTOR ( 1 ) )
2020-08-04 20:32:07 +10:00
item - > goalAnimState = LS_POLE_IDLE ;
2019-11-21 07:43:34 +01:00
}
2019-12-02 14:49:19 +01:00
void lara_as_poleright ( ITEM_INFO * item , COLL_INFO * coll ) //1707C(<), 171B0(<) (F)
2019-11-21 07:43:34 +01:00
{
coll - > enableBaddiePush = false ;
coll - > enableSpaz = false ;
if ( ! ( TrInput & IN_RIGHT ) | | ! ( TrInput & IN_ACTION ) | | ( TrInput & ( IN_FORWARD | IN_BACK ) ) | | item - > hitPoints < = 0 )
2020-08-04 20:32:07 +10:00
item - > goalAnimState = LS_POLE_IDLE ;
2019-11-21 07:43:34 +01:00
else
item - > pos . yRot - = 256 ;
}
2019-12-02 14:49:19 +01:00
void lara_as_poleleft ( ITEM_INFO * item , COLL_INFO * coll ) //17020(<), 17154(<) (F)
2019-11-21 07:43:34 +01:00
{
coll - > enableBaddiePush = false ;
coll - > enableSpaz = false ;
if ( ! ( TrInput & IN_LEFT ) | | ! ( TrInput & IN_ACTION ) | | ( TrInput & ( IN_FORWARD | IN_BACK ) ) | | item - > hitPoints < = 0 )
2020-08-04 20:32:07 +10:00
item - > goalAnimState = LS_POLE_IDLE ;
2019-11-21 07:43:34 +01:00
else
item - > pos . yRot + = 256 ;
}
2019-12-02 14:49:19 +01:00
void lara_col_polestat ( ITEM_INFO * item , COLL_INFO * coll ) //16DFC, 16F30 (F)
2019-11-21 07:43:34 +01:00
{
if ( item - > hitPoints < = 0 )
{
2020-08-04 20:32:07 +10:00
item - > goalAnimState = LS_FREEFALL ;
2019-11-21 07:43:34 +01:00
return ;
}
coll - > enableSpaz = false ;
coll - > enableBaddiePush = false ;
2020-08-04 20:32:07 +10:00
if ( item - > animNumber = = LA_POLE_IDLE )
2019-11-21 07:43:34 +01:00
{
2019-12-11 18:07:27 +01:00
coll - > badPos = NO_BAD_POS ;
coll - > badNeg = - STEPUP_HEIGHT ;
coll - > badCeiling = BAD_JUMP_CEILING ;
2019-11-21 07:43:34 +01:00
2020-06-09 22:24:36 -03:00
Lara . moveAngle = 0 ;
2019-11-21 07:43:34 +01:00
coll - > facing = Lara . moveAngle ;
2019-12-16 19:04:28 +01:00
coll - > radius = 100 ;
2019-12-29 20:35:25 +01:00
coll - > slopesAreWalls = true ;
2019-11-21 07:43:34 +01:00
2020-06-09 22:51:03 -03:00
GetCollisionInfo ( coll , item - > pos . xPos , item - > pos . yPos , item - > pos . zPos , item - > roomNumber , LARA_HITE ) ;
2019-11-21 07:43:34 +01:00
if ( TrInput & IN_ACTION )
{
2020-08-04 20:32:07 +10:00
item - > goalAnimState = LS_POLE_IDLE ;
2019-11-21 07:43:34 +01:00
if ( TrInput & IN_LEFT )
{
2020-08-04 20:32:07 +10:00
item - > goalAnimState = LS_POLE_TURN_CLOCKWISE ;
2019-11-21 07:43:34 +01:00
}
else if ( TrInput & IN_RIGHT )
{
2020-08-04 20:32:07 +10:00
item - > goalAnimState = LS_POLE_TURN_COUNTER_CLOCKWISE ;
2019-11-21 07:43:34 +01:00
}
if ( TrInput & IN_LOOK )
LookUpDown ( ) ;
if ( TrInput & IN_FORWARD )
{
2019-12-02 09:11:21 +01:00
short roomNum = item - > roomNumber ;
2019-11-21 07:43:34 +01:00
if ( item - > pos . yPos - GetCeiling ( GetFloor ( item - > pos . xPos , item - > pos . yPos , item - > pos . zPos , & roomNum ) ,
item - > pos . xPos , item - > pos . yPos , item - > pos . zPos ) > SECTOR ( 1 ) )
{
2020-08-04 20:32:07 +10:00
item - > goalAnimState = LS_POLE_UP ;
2019-11-21 07:43:34 +01:00
}
}
else if ( TrInput & IN_BACK & & coll - > midFloor > 0 )
{
2020-08-04 20:32:07 +10:00
item - > goalAnimState = LS_POLE_DOWN ;
2019-11-21 07:43:34 +01:00
item - > itemFlags [ 2 ] = 0 ;
}
if ( TrInput & IN_JUMP )
2020-08-04 20:32:07 +10:00
item - > goalAnimState = LS_JUMP_BACK ;
2019-11-21 07:43:34 +01:00
}
else if ( coll - > midFloor < = 0 )
{
2020-08-04 20:32:07 +10:00
item - > goalAnimState = LS_STOP ;
2019-11-21 07:43:34 +01:00
}
else
{
2020-04-25 16:23:53 +02:00
item - > pos . xPos - = ( phd_sin ( item - > pos . yRot ) ) < < 6 > > W2V_SHIFT ;
item - > pos . zPos - = ( phd_cos ( item - > pos . yRot ) ) < < 6 > > W2V_SHIFT ;
2020-08-04 20:32:07 +10:00
item - > goalAnimState = LS_FREEFALL ;
2019-11-21 07:43:34 +01:00
}
}
}
2019-12-02 14:49:19 +01:00
void lara_col_dashdive ( ITEM_INFO * item , COLL_INFO * coll ) //15E5C, 15F90 (F)
2019-11-21 07:43:34 +01:00
{
if ( item - > speed < 0 )
2020-06-09 22:24:36 -03:00
Lara . moveAngle = ANGLE ( 180 ) ;
2019-11-21 07:43:34 +01:00
else
2020-06-09 22:24:36 -03:00
Lara . moveAngle = 0 ;
2019-11-21 07:43:34 +01:00
2019-12-11 18:07:27 +01:00
coll - > badPos = NO_BAD_POS ;
2019-11-21 07:43:34 +01:00
coll - > badNeg = - 256 ;
2019-12-11 18:07:27 +01:00
coll - > badCeiling = BAD_JUMP_CEILING ;
2019-11-21 07:43:34 +01:00
2019-12-29 20:35:25 +01:00
coll - > slopesAreWalls = true ;
2019-11-21 07:43:34 +01:00
2020-06-09 22:51:03 -03:00
coll - > facing = Lara . moveAngle ;
GetCollisionInfo ( coll , item - > pos . xPos , item - > pos . yPos , item - > pos . zPos , item - > roomNumber , LARA_HITE ) ;
2019-11-21 07:43:34 +01:00
LaraDeflectEdgeJump ( item , coll ) ;
if ( ! LaraFallen ( item , coll ) )
{
if ( item - > speed < 0 )
2020-06-09 22:24:36 -03:00
Lara . moveAngle = 0 ;
2019-11-21 07:43:34 +01:00
if ( coll - > midFloor < = 0 & & item - > fallspeed > 0 )
{
if ( LaraLandedBad ( item , coll ) )
{
2020-08-04 20:32:07 +10:00
item - > goalAnimState = LS_DEATH ;
2019-11-21 07:43:34 +01:00
}
else if ( Lara . waterStatus = = LW_WADE | | ! ( TrInput & IN_FORWARD ) | | TrInput & IN_WALK )
{
2020-08-04 20:32:07 +10:00
item - > goalAnimState = LS_STOP ;
2019-11-21 07:43:34 +01:00
}
else
{
2020-08-04 20:32:07 +10:00
item - > goalAnimState = LS_RUN_FORWARD ;
2019-11-21 07:43:34 +01:00
}
item - > gravityStatus = false ;
item - > fallspeed = 0 ;
item - > pos . yPos + = coll - > midFloor ;
item - > speed = 0 ;
AnimateLara ( item ) ;
}
ShiftItem ( item , coll ) ;
if ( coll - > midFloor ! = NO_HEIGHT )
item - > pos . yPos + = coll - > midFloor ;
}
}
2019-12-02 14:49:19 +01:00
void lara_as_dashdive ( ITEM_INFO * item , COLL_INFO * coll ) //15E1C(<), 15F50(<) (F)
2019-11-21 07:43:34 +01:00
{
2020-08-04 20:32:07 +10:00
if ( item - > goalAnimState ! = LS_DEATH & &
item - > goalAnimState ! = LS_STOP & &
item - > goalAnimState ! = LS_RUN_FORWARD & &
2019-11-21 07:43:34 +01:00
item - > fallspeed > LARA_FREEFALL_SPEED )
2020-08-04 20:32:07 +10:00
item - > goalAnimState = LS_FREEFALL ;
2019-11-21 07:43:34 +01:00
}
2019-12-02 14:49:19 +01:00
void lara_col_dash ( ITEM_INFO * item , COLL_INFO * coll ) //15C50, 15D84 (F)
2019-11-21 07:43:34 +01:00
{
2020-06-09 22:24:36 -03:00
Lara . moveAngle = 0 ;
2019-11-21 07:43:34 +01:00
2019-12-11 18:07:27 +01:00
coll - > badPos = NO_BAD_POS ;
coll - > badNeg = - STEPUP_HEIGHT ;
2019-11-21 07:43:34 +01:00
coll - > badCeiling = 0 ;
2019-12-29 20:35:25 +01:00
coll - > slopesAreWalls = true ;
2019-11-21 07:43:34 +01:00
2020-06-09 22:51:03 -03:00
coll - > facing = Lara . moveAngle ;
GetCollisionInfo ( coll , item - > pos . xPos , item - > pos . yPos , item - > pos . zPos , item - > roomNumber , LARA_HITE ) ;
2019-11-21 07:43:34 +01:00
if ( ! LaraHitCeiling ( item , coll ) & & ! TestLaraVault ( item , coll ) )
{
if ( LaraDeflectEdge ( item , coll ) )
{
item - > pos . zRot = 0 ;
if ( TestWall ( item , 256 , 0 , - 640 ) )
{
2020-08-04 20:32:07 +10:00
item - > goalAnimState = LS_SPLAT ;
2020-07-23 23:26:19 +02:00
if ( GetChange ( item , & g_Level . Anims [ item - > animNumber ] ) )
2020-07-25 14:28:59 +02:00
{
2020-08-04 20:32:07 +10:00
item - > currentAnimState = LS_SPLAT ;
2020-07-23 23:26:19 +02:00
return ;
2020-07-25 14:28:59 +02:00
}
2019-11-21 07:43:34 +01:00
}
LaraCollideStop ( item , coll ) ;
}
if ( ! LaraFallen ( item , coll ) )
{
2020-07-23 23:26:19 +02:00
if ( coll - > midFloor > = - STEPUP_HEIGHT & & coll - > midFloor < - STEP_SIZE / 2 )
2019-11-21 07:43:34 +01:00
{
2020-08-04 20:32:07 +10:00
item - > goalAnimState = LS_STEP_UP ;
2020-07-23 23:26:19 +02:00
GetChange ( item , & g_Level . Anims [ item - > animNumber ] ) ;
2019-11-21 07:43:34 +01:00
}
if ( ! TestLaraSlide ( item , coll ) )
{
if ( coll - > midFloor < 50 )
{
if ( coll - > midFloor ! = NO_HEIGHT )
item - > pos . yPos + = coll - > midFloor ;
}
else
{
2020-08-04 20:32:07 +10:00
item - > goalAnimState = LS_STEP_DOWN ; // for theoretical sprint stepdown anims, not in default anims
2020-07-23 23:26:19 +02:00
if ( GetChange ( item , & g_Level . Anims [ item - > animNumber ] ) )
item - > pos . yPos + = coll - > midFloor ; // move Lara to midFloor
else
item - > pos . yPos + = 50 ; // do the default aligment
2019-11-21 07:43:34 +01:00
}
}
}
}
}
2019-12-02 14:49:19 +01:00
void lara_as_dash ( ITEM_INFO * item , COLL_INFO * coll ) //15A28, 15B5C (F)
2019-11-21 07:43:34 +01:00
{
if ( item - > hitPoints < = 0 | | ! DashTimer | | ! ( TrInput & IN_SPRINT ) | | Lara . waterStatus = = LW_WADE )
{
2020-08-04 20:32:07 +10:00
item - > goalAnimState = LS_RUN_FORWARD ;
2019-11-21 07:43:34 +01:00
return ;
}
DashTimer - - ;
if ( TrInput & IN_DUCK
2019-12-16 19:04:28 +01:00
& & ( Lara . gunStatus = = LG_NO_ARMS
| | Lara . gunType = = WEAPON_NONE
| | Lara . gunType = = WEAPON_PISTOLS
| | Lara . gunType = = WEAPON_REVOLVER
| | Lara . gunType = = WEAPON_UZI
| | Lara . gunType = = WEAPON_FLARE ) )
2019-11-21 07:43:34 +01:00
{
2020-08-04 20:32:07 +10:00
item - > goalAnimState = LS_CROUCH_IDLE ;
2019-11-21 07:43:34 +01:00
return ;
}
if ( TrInput & IN_LEFT )
{
2019-12-16 19:04:28 +01:00
Lara . turnRate - = LARA_TURN_RATE ;
2020-05-31 04:20:52 -05:00
if ( Lara . turnRate < - ANGLE ( 4.0f ) )
Lara . turnRate = - ANGLE ( 4.0f ) ;
2019-11-21 07:43:34 +01:00
2020-05-31 04:20:52 -05:00
item - > pos . zRot - = ANGLE ( 1.5f ) ;
if ( item - > pos . zRot < - ANGLE ( 16.0f ) )
item - > pos . zRot = - ANGLE ( 16.0f ) ;
2019-11-21 07:43:34 +01:00
}
else if ( TrInput & IN_RIGHT )
{
2019-12-16 19:04:28 +01:00
Lara . turnRate + = LARA_TURN_RATE ;
2020-05-31 04:20:52 -05:00
if ( Lara . turnRate > ANGLE ( 4.0f ) )
Lara . turnRate = ANGLE ( 4.0f ) ;
2019-11-21 07:43:34 +01:00
2020-05-31 04:20:52 -05:00
item - > pos . zRot + = ANGLE ( 1.5f ) ;
if ( item - > pos . zRot > ANGLE ( 16.0f ) )
item - > pos . zRot = ANGLE ( 16.0f ) ;
2019-11-21 07:43:34 +01:00
}
if ( ! ( TrInput & IN_JUMP ) | | item - > gravityStatus )
{
if ( TrInput & IN_FORWARD )
{
if ( TrInput & IN_WALK )
2020-08-04 20:32:07 +10:00
item - > goalAnimState = LS_WALK_FORWARD ;
2019-11-21 07:43:34 +01:00
else
2020-08-04 20:32:07 +10:00
item - > goalAnimState = LS_SPRINT ;
2019-11-21 07:43:34 +01:00
}
2019-12-16 19:04:28 +01:00
else if ( ! ( TrInput & IN_LEFT ) & & ! ( TrInput & IN_RIGHT ) )
2019-11-21 07:43:34 +01:00
{
2020-08-04 20:32:07 +10:00
item - > goalAnimState = LS_STOP ;
2019-11-21 07:43:34 +01:00
}
}
else
{
2020-08-04 20:32:07 +10:00
item - > goalAnimState = LS_SPRINT_ROLL ;
2019-11-21 07:43:34 +01:00
}
}
2019-12-02 14:49:19 +01:00
void lara_col_crawl2hang ( ITEM_INFO * item , COLL_INFO * coll ) //15770, 158A4 (F)
2019-11-21 07:43:34 +01:00
{
Camera . targetAngle = 0 ;
2020-05-31 04:20:52 -05:00
Camera . targetElevation = - ANGLE ( 45.0f ) ;
2019-11-21 07:43:34 +01:00
coll - > enableSpaz = false ;
coll - > enableBaddiePush = false ;
2020-08-04 20:32:07 +10:00
if ( item - > animNumber = = LA_CRAWL_TO_HANG_END )
2019-11-21 07:43:34 +01:00
{
int edgeCatch ;
2019-12-02 09:11:21 +01:00
int edge ;
2019-12-16 19:04:28 +01:00
2019-11-21 07:43:34 +01:00
item - > fallspeed = 512 ;
2019-12-16 19:04:28 +01:00
item - > pos . yPos + = 255 ;
2019-11-21 07:43:34 +01:00
2019-12-11 18:07:27 +01:00
coll - > badPos = NO_BAD_POS ;
coll - > badNeg = - STEPUP_HEIGHT ;
coll - > badCeiling = BAD_JUMP_CEILING ;
2019-11-21 07:43:34 +01:00
2020-06-09 22:24:36 -03:00
Lara . moveAngle = 0 ;
2019-12-16 19:04:28 +01:00
coll - > facing = Lara . moveAngle ;
2019-11-21 07:43:34 +01:00
2019-12-16 19:04:28 +01:00
GetCollisionInfo ( coll , item - > pos . xPos , item - > pos . yPos , item - > pos . zPos , item - > roomNumber , 870 ) ;
2019-12-16 17:11:24 +01:00
edgeCatch = LaraTestEdgeCatch ( item , coll , & edge ) ;
2019-11-21 07:43:34 +01:00
2019-12-16 19:04:28 +01:00
if ( edgeCatch )
2019-12-16 17:11:24 +01:00
{
2019-12-16 19:04:28 +01:00
if ( edgeCatch > = 0 | | LaraTestHangOnClimbWall ( item , coll ) )
{
short angle = item - > pos . yRot ;
2020-06-06 15:48:38 -03:00
if ( SnapToQuadrant ( angle , 35 ) )
2019-12-16 19:04:28 +01:00
{
2020-07-25 18:02:35 +02:00
BOUNDING_BOX * bounds ;
2019-11-21 07:43:34 +01:00
2019-12-16 19:04:28 +01:00
if ( TestHangSwingIn ( item , angle ) )
{
2019-11-21 07:43:34 +01:00
2020-06-10 23:24:18 -05:00
Lara . headYrot = 0 ;
Lara . headXrot = 0 ;
Lara . torsoYrot = 0 ;
Lara . torsoXrot = 0 ;
2020-08-04 20:32:07 +10:00
item - > animNumber = LA_JUMP_UP_TO_MONKEYSWING ;
2020-07-21 09:56:47 +02:00
item - > frameNumber = g_Level . Anims [ item - > animNumber ] . frameBase ;
2020-08-04 20:32:07 +10:00
item - > currentAnimState = LS_MONKEYSWING_IDLE ;
item - > goalAnimState = LS_MONKEYSWING_IDLE ;
2019-12-16 19:04:28 +01:00
}
else
{
2020-05-24 03:10:00 -05:00
if ( TestHangFeet ( item , angle ) )
2020-05-23 15:59:18 -05:00
{
2020-08-04 20:32:07 +10:00
item - > animNumber = LA_REACH_TO_HANG ;
2020-07-21 09:56:47 +02:00
item - > frameNumber = g_Level . Anims [ item - > animNumber ] . frameBase ;
2020-08-04 20:32:07 +10:00
item - > currentAnimState = LS_HANG ;
item - > goalAnimState = LS_HANG_FEET ;
2020-05-23 15:59:18 -05:00
}
else
{
2020-08-04 20:32:07 +10:00
item - > animNumber = LA_REACH_TO_HANG ;
2020-07-21 09:56:47 +02:00
item - > frameNumber = g_Level . Anims [ item - > animNumber ] . frameBase ;
2020-08-04 20:32:07 +10:00
item - > currentAnimState = LS_HANG ;
item - > goalAnimState = LS_HANG ;
2020-05-23 15:59:18 -05:00
}
2019-12-16 19:04:28 +01:00
}
2019-11-21 07:43:34 +01:00
2019-12-16 19:04:28 +01:00
bounds = GetBoundsAccurate ( item ) ;
2019-11-21 07:43:34 +01:00
2019-12-16 19:04:28 +01:00
if ( edgeCatch < = 0 )
{
2020-07-25 18:02:35 +02:00
item - > pos . yPos = edge - bounds - > Y1 ;
2019-12-16 19:04:28 +01:00
}
else
{
2020-06-04 16:17:05 -05:00
2020-06-07 22:24:22 +02:00
/* item->pos.xPos += coll->shift.x;
item - > pos . zPos + = coll - > shift . z ;
@ ORIGINAL_BUG : these two caused teleportation when Lara performed crawl2hang on triangulated geometry . replacing with shifts to the edges of blocks solved it */
2020-06-04 16:17:05 -05:00
short angl = ( unsigned short ) ( item - > pos . yRot + ANGLE ( 45.0f ) ) / ANGLE ( 90.0f ) ;
switch ( angl )
{
case NORTH :
item - > pos . zPos = ( item - > pos . zPos | ( WALL_SIZE - 1 ) ) - LARA_RAD ;
break ;
2019-12-16 19:04:28 +01:00
2020-06-04 16:17:05 -05:00
case EAST :
item - > pos . xPos = ( item - > pos . xPos | ( WALL_SIZE - 1 ) ) - LARA_RAD ;
break ;
case SOUTH :
item - > pos . zPos = ( item - > pos . zPos & - WALL_SIZE ) + LARA_RAD ;
break ;
2019-12-16 19:04:28 +01:00
2020-06-04 16:17:05 -05:00
case WEST :
item - > pos . xPos = ( item - > pos . xPos & - WALL_SIZE ) + LARA_RAD ;
break ;
}
}
2020-07-25 18:02:35 +02:00
item - > pos . yPos + = coll - > frontFloor - bounds - > Y1 ;
2019-12-16 19:04:28 +01:00
item - > pos . yRot = angle ;
item - > gravityStatus = true ;
item - > speed = 2 ;
item - > fallspeed = 1 ;
Lara . gunStatus = LG_HANDS_BUSY ;
}
}
}
2019-11-21 07:43:34 +01:00
}
}
2019-12-02 14:49:19 +01:00
void lara_col_crawlb ( ITEM_INFO * item , COLL_INFO * coll ) //15614, 15748 (F)
2019-11-21 07:43:34 +01:00
{
item - > gravityStatus = false ;
item - > fallspeed = 0 ;
coll - > radius = 250 ;
coll - > badPos = 255 ;
2020-07-13 22:13:15 -05:00
coll - > badNeg = - 127 ;
2019-11-21 07:43:34 +01:00
coll - > badCeiling = 400 ;
2019-12-29 20:35:25 +01:00
coll - > slopesArePits = true ;
coll - > slopesAreWalls = true ;
2019-11-21 07:43:34 +01:00
2020-06-09 22:24:36 -03:00
Lara . moveAngle = ANGLE ( 180 ) ;
2019-11-21 07:43:34 +01:00
coll - > facing = Lara . moveAngle ;
GetCollisionInfo ( coll , item - > pos . xPos , item - > pos . yPos , item - > pos . zPos , item - > roomNumber , 400 ) ;
if ( LaraDeflectEdgeDuck ( item , coll ) )
{
2020-08-04 20:32:07 +10:00
item - > currentAnimState = LS_CRAWL_IDLE ;
item - > goalAnimState = LS_CRAWL_IDLE ;
2019-11-21 07:43:34 +01:00
2020-08-04 20:32:07 +10:00
if ( item - > animNumber ! = LA_CRAWL_IDLE )
2019-11-21 07:43:34 +01:00
{
2020-08-04 20:32:07 +10:00
item - > animNumber = LA_CRAWL_IDLE ;
2020-07-21 09:56:47 +02:00
item - > frameNumber = g_Level . Anims [ item - > animNumber ] . frameBase ;
2019-11-21 07:43:34 +01:00
}
}
else if ( LaraFallen ( item , coll ) )
{
Lara . gunStatus = LG_NO_ARMS ;
}
else if ( ! TestLaraSlide ( item , coll ) )
{
ShiftItem ( item , coll ) ;
if ( coll - > midFloor ! = NO_HEIGHT & & coll - > midFloor > - 256 )
item - > pos . yPos + = coll - > midFloor ;
2020-06-09 22:24:36 -03:00
Lara . moveAngle = 0 ;
2019-11-21 07:43:34 +01:00
}
}
2019-12-02 14:49:19 +01:00
void lara_as_crawlb ( ITEM_INFO * item , COLL_INFO * coll ) //154F0, 15624 (F)
2019-11-21 07:43:34 +01:00
{
if ( item - > hitPoints < = 0 | | Lara . waterStatus = = 4 )
{
2020-08-04 20:32:07 +10:00
item - > goalAnimState = LS_CRAWL_IDLE ;
2019-11-21 07:43:34 +01:00
return ;
}
if ( TrInput & IN_LOOK )
LookUpDown ( ) ;
coll - > enableSpaz = false ;
coll - > enableBaddiePush = true ;
Lara . torsoYrot = 0 ;
Lara . torsoXrot = 0 ;
2020-05-31 04:20:52 -05:00
Camera . targetElevation = - ANGLE ( 23.0f ) ;
2019-11-21 07:43:34 +01:00
if ( TrInput & IN_BACK )
{
if ( TrInput & IN_RIGHT )
{
2019-12-11 18:07:27 +01:00
Lara . turnRate - = LARA_TURN_RATE ;
2020-05-31 04:20:52 -05:00
if ( Lara . turnRate < - ANGLE ( 3.0f ) )
Lara . turnRate = - ANGLE ( 3.0f ) ;
2019-11-21 07:43:34 +01:00
}
else if ( TrInput & IN_LEFT )
{
2019-12-11 18:07:27 +01:00
Lara . turnRate + = LARA_TURN_RATE ;
2020-05-31 04:20:52 -05:00
if ( Lara . turnRate > ANGLE ( 3.0f ) )
Lara . turnRate = ANGLE ( 3.0f ) ;
2019-11-21 07:43:34 +01:00
}
}
else
{
2020-08-04 20:32:07 +10:00
item - > goalAnimState = LS_CRAWL_IDLE ;
2019-11-21 07:43:34 +01:00
}
}
2019-12-02 14:49:19 +01:00
void lara_as_all4turnr ( ITEM_INFO * item , COLL_INFO * coll ) //15484(<), 155B8(<) (F)
2019-11-21 07:43:34 +01:00
{
if ( item - > hitPoints < = 0 )
{
2020-08-04 20:32:07 +10:00
item - > goalAnimState = LS_CRAWL_IDLE ;
2019-11-21 07:43:34 +01:00
return ;
}
coll - > enableSpaz = 0 ;
coll - > enableBaddiePush = 1 ;
Lara . torsoYrot = 0 ;
Lara . torsoXrot = 0 ;
2020-05-31 04:20:52 -05:00
Camera . targetElevation = - ANGLE ( 23.0f ) ;
item - > pos . yRot + = ANGLE ( 1.5f ) ;
2019-11-21 07:43:34 +01:00
if ( ! ( TrInput & IN_RIGHT ) )
2020-08-04 20:32:07 +10:00
item - > goalAnimState = LS_CRAWL_IDLE ;
2019-11-21 07:43:34 +01:00
}
2019-12-02 14:49:19 +01:00
void lara_col_all4turnlr ( ITEM_INFO * item , COLL_INFO * coll ) //153FC, 15530 (F)
2019-11-21 07:43:34 +01:00
{
GetCollisionInfo ( coll , item - > pos . xPos , item - > pos . yPos , item - > pos . zPos , item - > roomNumber , 400 ) ;
if ( ! TestLaraSlide ( item , coll ) )
{
if ( coll - > midFloor ! = NO_HEIGHT & & coll - > midFloor > - 256 )
item - > pos . yPos + = coll - > midFloor ;
}
}
2019-12-02 14:49:19 +01:00
void lara_as_all4turnl ( ITEM_INFO * item , COLL_INFO * coll ) //15390(<), 154C4(<) (F)
2019-11-21 07:43:34 +01:00
{
if ( item - > hitPoints < = 0 )
{
2020-08-04 20:32:07 +10:00
item - > goalAnimState = LS_CRAWL_IDLE ;
2019-11-21 07:43:34 +01:00
return ;
}
coll - > enableSpaz = 0 ;
coll - > enableBaddiePush = 1 ;
Lara . torsoYrot = 0 ;
Lara . torsoXrot = 0 ;
2020-05-31 04:20:52 -05:00
Camera . targetElevation = - ANGLE ( 23.0f ) ;
item - > pos . yRot - = ANGLE ( 1.5f ) ;
2019-11-21 07:43:34 +01:00
if ( ! ( TrInput & IN_LEFT ) )
2020-08-04 20:32:07 +10:00
item - > goalAnimState = LS_CRAWL_IDLE ;
2019-11-21 07:43:34 +01:00
}
2019-12-02 14:49:19 +01:00
void lara_col_crawl ( ITEM_INFO * item , COLL_INFO * coll ) //1523C, 15370 (F)
2019-11-21 07:43:34 +01:00
{
item - > gravityStatus = false ;
item - > fallspeed = 0 ;
2020-06-09 22:24:36 -03:00
Lara . moveAngle = 0 ;
2019-11-21 07:43:34 +01:00
coll - > radius = 200 ;
coll - > badPos = 255 ;
2020-07-13 22:13:15 -05:00
coll - > badNeg = - 127 ;
2019-11-21 07:43:34 +01:00
coll - > badCeiling = 400 ;
2019-12-29 20:35:25 +01:00
coll - > slopesArePits = true ;
coll - > slopesAreWalls = true ;
2019-11-21 07:43:34 +01:00
coll - > facing = Lara . moveAngle ;
GetCollisionInfo ( coll , item - > pos . xPos , item - > pos . yPos , item - > pos . zPos , item - > roomNumber , - 400 ) ;
if ( LaraDeflectEdgeDuck ( item , coll ) )
{
2020-08-04 20:32:07 +10:00
item - > currentAnimState = LS_CRAWL_IDLE ;
item - > goalAnimState = LS_CRAWL_IDLE ;
2019-11-21 07:43:34 +01:00
2020-08-04 20:32:07 +10:00
if ( item - > animNumber ! = LA_CRAWL_IDLE )
2019-11-21 07:43:34 +01:00
{
2020-08-04 20:32:07 +10:00
item - > animNumber = LA_CRAWL_IDLE ;
2020-07-21 09:56:47 +02:00
item - > frameNumber = g_Level . Anims [ item - > animNumber ] . frameBase ;
2019-11-21 07:43:34 +01:00
}
}
else if ( LaraFallen ( item , coll ) )
{
Lara . gunStatus = LG_NO_ARMS ;
}
else if ( ! TestLaraSlide ( item , coll ) )
{
ShiftItem ( item , coll ) ;
if ( coll - > midFloor ! = NO_HEIGHT & & coll - > midFloor > - 256 )
item - > pos . yPos + = coll - > midFloor ;
}
}
2019-12-02 14:49:19 +01:00
void lara_as_crawl ( ITEM_INFO * item , COLL_INFO * coll ) //150F4, 15228 (F)
2019-11-21 07:43:34 +01:00
{
if ( item - > hitPoints < = 0 | | TrInput & IN_JUMP )
{
2020-08-04 20:32:07 +10:00
item - > goalAnimState = LS_CRAWL_IDLE ;
2019-11-21 07:43:34 +01:00
return ;
}
if ( TrInput & IN_LOOK )
LookUpDown ( ) ;
Lara . torsoXrot = 0 ;
Lara . torsoYrot = 0 ;
coll - > enableSpaz = false ;
coll - > enableBaddiePush = true ;
2020-05-31 04:20:52 -05:00
Camera . targetElevation = - ANGLE ( 23.0f ) ;
2019-11-21 07:43:34 +01:00
if ( TrInput & IN_FORWARD
& & ( TrInput & IN_DUCK | | Lara . keepDucked )
& & Lara . waterStatus ! = LW_WADE )
{
if ( TrInput & IN_LEFT )
{
2019-12-11 18:07:27 +01:00
Lara . turnRate - = LARA_TURN_RATE ;
2019-11-21 07:43:34 +01:00
2020-05-31 04:20:52 -05:00
if ( Lara . turnRate < - ANGLE ( 3.0f ) )
Lara . turnRate = - ANGLE ( 3.0f ) ;
2019-11-21 07:43:34 +01:00
}
else if ( TrInput & IN_RIGHT )
{
2019-12-11 18:07:27 +01:00
Lara . turnRate + = LARA_TURN_RATE ;
2019-11-21 07:43:34 +01:00
2020-05-31 04:20:52 -05:00
if ( Lara . turnRate > ANGLE ( 3.0f ) )
Lara . turnRate = ANGLE ( 3.0f ) ;
2019-11-21 07:43:34 +01:00
}
}
else
{
2020-08-04 20:32:07 +10:00
item - > goalAnimState = LS_CRAWL_IDLE ;
2019-11-21 07:43:34 +01:00
}
}
2019-12-02 14:49:19 +01:00
void lara_col_all4s ( ITEM_INFO * item , COLL_INFO * coll ) //14B40, 14C74 (F)
2019-11-21 07:43:34 +01:00
{
item - > fallspeed = 0 ;
item - > gravityStatus = false ;
2020-08-04 20:32:07 +10:00
if ( item - > goalAnimState ! = LS_CRAWL_TO_HANG )
2019-11-21 07:43:34 +01:00
{
2020-06-09 22:24:36 -03:00
Lara . moveAngle = 0 ;
2019-11-21 07:43:34 +01:00
coll - > facing = Lara . moveAngle ;
coll - > radius = 200 ;
coll - > badPos = 255 ;
2020-07-13 22:13:15 -05:00
coll - > badNeg = - 127 ;
2019-11-21 07:43:34 +01:00
coll - > badCeiling = 400 ;
2019-12-29 20:35:25 +01:00
coll - > slopesAreWalls = true ;
coll - > slopesArePits = true ;
2019-11-21 07:43:34 +01:00
GetCollisionInfo ( coll , item - > pos . xPos , item - > pos . yPos , item - > pos . zPos , item - > roomNumber , 400 ) ;
if ( LaraFallen ( item , coll ) )
{
Lara . gunStatus = LG_NO_ARMS ;
}
else if ( ! TestLaraSlide ( item , coll ) )
{
2019-12-02 09:11:21 +01:00
int slope = abs ( coll - > leftFloor2 - coll - > rightFloor2 ) ;
2019-11-21 07:43:34 +01:00
Lara . keepDucked = coll - > midCeiling > = - 362 ;
ShiftItem ( item , coll ) ;
if ( coll - > midFloor ! = NO_HEIGHT & & coll - > midFloor > - 256 )
item - > pos . yPos + = coll - > midFloor ;
if ( TrInput & IN_DUCK | | Lara . keepDucked & &
( ! ( TrInput & IN_FLARE ) & & ! ( TrInput & IN_DRAW ) | | TrInput & IN_FORWARD ) & &
Lara . waterStatus ! = LW_WADE )
{
2020-08-04 20:32:07 +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 )
2019-11-21 07:43:34 +01:00
{
if ( TrInput & IN_FORWARD )
{
2020-07-13 22:13:15 -05:00
if ( abs ( LaraFloorFront ( item , item - > pos . yRot , 256 ) ) < 127 & & HeightType ! = BIG_SLOPE )
2020-08-04 20:32:07 +10:00
item - > goalAnimState = LS_CRAWL_FORWARD ;
2019-11-21 07:43:34 +01:00
}
else if ( TrInput & IN_BACK )
{
2019-12-02 09:11:21 +01:00
short height = LaraCeilingFront ( item , item - > pos . yRot , - 300 , 128 ) ;
short heightl = 0 ;
short heightr = 0 ;
2019-11-21 07:43:34 +01:00
if ( height ! = NO_HEIGHT & & height < = 256 )
{
if ( TrInput & IN_ACTION )
{
2019-12-02 09:11:21 +01:00
int x = item - > pos . xPos ;
int z = item - > pos . zPos ;
2019-11-21 07:43:34 +01:00
2020-05-31 04:20:52 -05:00
item - > pos . xPos + = 128 * phd_sin ( item - > pos . yRot - ANGLE ( 90.0f ) ) > > W2V_SHIFT ;
item - > pos . zPos + = 128 * phd_cos ( item - > pos . yRot - ANGLE ( 90.0f ) ) > > W2V_SHIFT ;
2019-11-21 07:43:34 +01:00
heightl = LaraFloorFront ( item , item - > pos . yRot , - 300 ) ;
2020-05-31 04:20:52 -05:00
item - > pos . xPos + = 256 * phd_sin ( item - > pos . yRot + ANGLE ( 90.0f ) ) > > W2V_SHIFT ;
item - > pos . zPos + = 256 * phd_cos ( item - > pos . yRot + ANGLE ( 90.0f ) ) > > W2V_SHIFT ;
2019-11-21 07:43:34 +01:00
heightr = LaraFloorFront ( item , item - > pos . yRot , - 300 ) ;
item - > pos . xPos = x ;
item - > pos . zPos = z ;
}
height = LaraFloorFront ( item , item - > pos . yRot , - 300 ) ;
if ( abs ( height ) > = 255 | | HeightType = = BIG_SLOPE )
{
if ( TrInput & IN_ACTION )
{
if ( height > 768 & &
heightl > 768 & &
heightr > 768 & &
slope < 120 )
{
2019-12-02 09:11:21 +01:00
int tmp ;
2019-11-21 07:43:34 +01:00
ITEM_INFO * tmp1 ;
MESH_INFO * tmp2 ;
2019-12-02 09:11:21 +01:00
int x = item - > pos . xPos ;
int z = item - > pos . zPos ;
2019-11-21 07:43:34 +01:00
2020-04-25 16:23:53 +02:00
item - > pos . xPos - = 100 * phd_sin ( coll - > facing ) > > W2V_SHIFT ;
item - > pos . zPos - = 100 * phd_cos ( coll - > facing ) > > W2V_SHIFT ;
2019-11-21 07:43:34 +01:00
tmp = GetCollidedObjects ( item , 100 , 1 , & tmp1 , & tmp2 , 0 ) ;
item - > pos . xPos = x ;
item - > pos . zPos = z ;
if ( ! tmp )
{
2020-06-06 15:48:38 -03:00
switch ( GetQuadrant ( item - > pos . yRot ) )
2019-11-21 07:43:34 +01:00
{
case 0 :
item - > pos . yRot = 0 ;
item - > pos . zPos = ( item - > pos . zPos & 0xFFFFFC00 ) + 225 ;
break ;
case 1 :
2020-05-31 04:20:52 -05:00
item - > pos . yRot = ANGLE ( 90.0f ) ;
2019-11-21 07:43:34 +01:00
item - > pos . xPos = ( item - > pos . xPos & 0xFFFFFC00 ) + 225 ;
break ;
case 2 :
2020-05-31 04:20:52 -05:00
item - > pos . yRot = - ANGLE ( 180.0f ) ;
2019-11-21 07:43:34 +01:00
item - > pos . zPos = ( item - > pos . zPos | 0x3FF ) - 225 ;
break ;
case 3 :
2020-05-31 04:20:52 -05:00
item - > pos . yRot = - ANGLE ( 90.0f ) ;
2019-11-21 07:43:34 +01:00
item - > pos . xPos = ( item - > pos . xPos | 0x3FF ) - 225 ;
break ;
}
2020-08-04 20:32:07 +10:00
item - > goalAnimState = LS_CRAWL_TO_HANG ;
2019-11-21 07:43:34 +01:00
}
}
}
}
2020-07-13 22:13:15 -05:00
else if ( ! ( abs ( height ) > = 127 ) )
2019-11-21 07:43:34 +01:00
{
2020-08-04 20:32:07 +10:00
item - > goalAnimState = LS_CRAWL_BACK ;
2019-11-21 07:43:34 +01:00
}
}
}
else if ( TrInput & IN_LEFT )
{
2020-08-04 20:32:07 +10:00
item - > animNumber = LA_CRAWL_TURN_LEFT ;
2020-07-21 09:56:47 +02:00
item - > frameNumber = g_Level . Anims [ item - > animNumber ] . frameBase ;
2020-08-04 20:32:07 +10:00
item - > currentAnimState = LS_CRAWL_TURN_LEFT ;
item - > goalAnimState = LS_CRAWL_TURN_LEFT ;
2019-11-21 07:43:34 +01:00
}
else if ( TrInput & IN_RIGHT )
{
2020-08-04 20:32:07 +10:00
item - > animNumber = LA_CRAWL_TURN_RIGHT ;
2020-07-21 09:56:47 +02:00
item - > frameNumber = g_Level . Anims [ item - > animNumber ] . frameBase ;
2020-08-04 20:32:07 +10:00
item - > currentAnimState = LS_CRAWL_TURN_RIGHT ;
item - > goalAnimState = LS_CRAWL_TURN_RIGHT ;
2019-11-21 07:43:34 +01:00
}
}
}
else
{
2020-08-04 20:32:07 +10:00
item - > goalAnimState = LS_CROUCH_IDLE ;
2019-11-21 07:43:34 +01:00
}
}
}
}
2019-12-02 14:49:19 +01:00
void lara_as_all4s ( ITEM_INFO * item , COLL_INFO * coll ) //14970, 14A78 (F)
2019-11-21 07:43:34 +01:00
{
if ( item - > hitPoints < = 0 )
{
2020-08-04 20:32:07 +10:00
item - > goalAnimState = LS_DEATH ;
2019-11-21 07:43:34 +01:00
return ;
}
2020-05-26 07:36:09 -05:00
// FOR DEBUG PURPOSES UNTIL SCRIPTING IS FINISHED
2020-08-08 15:15:15 -05:00
// EnableCrawlFlex1clickdown = true;
// EnableCrawlFlex1clickup = true;
// EnableCrawlFlex3clickE = true;
// EnableCrawlFlex2clickE = true;
// EnableCrawlFlex1clickE = true;
2020-06-07 22:24:22 +02:00
2020-05-30 13:02:24 -05:00
2020-05-26 07:36:09 -05:00
2019-11-21 07:43:34 +01:00
if ( TrInput & IN_JUMP )
{
2020-05-20 06:31:17 -05:00
GAME_VECTOR s , d ;
MESH_INFO * StaticMesh ;
PHD_VECTOR v ;
2020-05-31 05:16:23 -05:00
if ( LaraFloorFront ( item , item - > pos . yRot , 512 ) > 768 & &
2019-11-21 07:43:34 +01:00
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-04-25 16:23:53 +02:00
d . x = s . x + ( 768 * phd_sin ( LaraItem - > pos . yRot ) > > W2V_SHIFT ) ;
2019-11-21 07:43:34 +01:00
d . y = s . y + 160 ;
2020-04-25 16:23:53 +02:00
d . z = s . z + ( 768 * phd_cos ( LaraItem - > pos . yRot ) > > W2V_SHIFT ) ;
2019-11-21 07:43:34 +01:00
2020-08-04 20:32:07 +10:00
if ( LOS ( & s , & d ) & & item - > animNumber ! = LA_CROUCH_TO_CRAWL_START & & item - > animNumber ! = LA_CROUCH_TO_CRAWL_CONTINUE )
2019-11-21 07:43:34 +01:00
{
2019-12-14 08:51:28 +01:00
// TODO: fix ObjectOnLOS2
2019-12-01 08:13:19 +01:00
/*if (ObjectOnLOS2(&s, &d, &v, (PHD_VECTOR*)&StaticMesh) == 999)
2019-12-14 08:51:28 +01:00
{ */
2020-08-04 20:32:07 +10:00
item - > animNumber = LA_CRAWL_JUMP_FLIP_DOWN ;
2020-07-21 09:56:47 +02:00
item - > frameNumber = g_Level . Anims [ item - > animNumber ] . frameBase ;
2020-08-04 20:32:07 +10:00
item - > goalAnimState = LS_MISC_CONTROL ;
item - > currentAnimState = LS_MISC_CONTROL ;
2020-05-01 09:55:36 -05:00
Lara . gunStatus = LG_HANDS_BUSY ;
2019-12-14 08:51:28 +01:00
/*}*/
2019-11-21 07:43:34 +01:00
}
}
2020-05-31 05:16:23 -05:00
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 ;
d . x = s . x + ( 768 * phd_sin ( LaraItem - > pos . yRot ) > > W2V_SHIFT ) ;
d . y = s . y + 160 ;
d . z = s . z + ( 768 * phd_cos ( LaraItem - > pos . yRot ) > > W2V_SHIFT ) ;
2020-08-08 15:15:15 -05:00
if ( LOS ( & s , & d ) & & item - > animNumber ! = LA_CROUCH_TO_CRAWL_START & & item - > animNumber ! = LA_CROUCH_TO_CRAWL_CONTINUE ) // && EnableCrawlFlex3clickE == true)
2020-05-31 05:16:23 -05:00
{
2020-08-04 20:32:07 +10:00
item - > animNumber = LA_CRAWL_JUMP_DOWN_23CLICK ;
2020-07-21 09:56:47 +02:00
item - > frameNumber = g_Level . Anims [ item - > animNumber ] . frameBase ;
2020-08-04 20:32:07 +10:00
item - > goalAnimState = LS_MISC_CONTROL ;
item - > currentAnimState = LS_MISC_CONTROL ;
2020-05-31 05:16:23 -05:00
Lara . gunStatus = LG_HANDS_BUSY ;
}
2020-06-07 22:24:22 +02:00
}
2020-05-20 06:31:17 -05:00
else if ( LaraFloorFront ( item , item - > pos . yRot , 256 ) = = 512 & &
2020-06-07 22:24:22 +02:00
LaraCeilingFront ( item , item - > pos . yRot , 768 , 512 ) ! = NO_HEIGHT & &
LaraCeilingFront ( item , item - > pos . yRot , 768 , 512 ) < = 0 )
{
2020-05-20 06:31:17 -05:00
s . x = LaraItem - > pos . xPos ;
s . y = LaraItem - > pos . yPos - 96 ;
s . z = LaraItem - > pos . zPos ;
s . roomNumber = LaraItem - > roomNumber ;
d . x = s . x + ( 768 * phd_sin ( LaraItem - > pos . yRot ) > > W2V_SHIFT ) ;
d . y = s . y + 160 ;
d . z = s . z + ( 768 * phd_cos ( LaraItem - > pos . yRot ) > > W2V_SHIFT ) ;
2020-08-08 15:15:15 -05:00
if ( LOS ( & s , & d ) & & item - > animNumber ! = LA_CROUCH_TO_CRAWL_START & & item - > animNumber ! = LA_CROUCH_TO_CRAWL_CONTINUE ) // && EnableCrawlFlex2clickE == true)
2020-05-20 06:31:17 -05:00
{
2020-08-04 20:32:07 +10:00
item - > animNumber = LA_CRAWL_JUMP_DOWN_23CLICK ;
2020-07-21 09:56:47 +02:00
item - > frameNumber = g_Level . Anims [ item - > animNumber ] . frameBase ;
2020-08-04 20:32:07 +10:00
item - > goalAnimState = LS_MISC_CONTROL ;
item - > currentAnimState = LS_MISC_CONTROL ;
2020-05-20 06:31:17 -05:00
Lara . gunStatus = LG_HANDS_BUSY ;
}
2020-06-07 22:24:22 +02:00
}
2020-05-20 06:31:17 -05:00
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 ;
d . x = s . x + ( 768 * phd_sin ( LaraItem - > pos . yRot ) > > W2V_SHIFT ) ;
d . y = s . y + 160 ;
d . z = s . z + ( 768 * phd_cos ( LaraItem - > pos . yRot ) > > W2V_SHIFT ) ;
2020-08-08 15:15:15 -05:00
if ( LOS ( & s , & d ) & & item - > animNumber ! = LA_CROUCH_TO_CRAWL_START & & item - > animNumber ! = LA_CROUCH_TO_CRAWL_CONTINUE ) // && EnableCrawlFlex1clickE == true)
2020-05-20 06:31:17 -05:00
{
2020-08-04 20:32:07 +10:00
item - > animNumber = LA_CRAWL_JUMP_DOWN_1CLICK ;
2020-07-21 09:56:47 +02:00
item - > frameNumber = g_Level . Anims [ item - > animNumber ] . frameBase ;
2020-08-04 20:32:07 +10:00
item - > goalAnimState = LS_MISC_CONTROL ;
item - > currentAnimState = LS_MISC_CONTROL ;
2020-05-20 06:31:17 -05:00
Lara . gunStatus = LG_HANDS_BUSY ;
}
}
2020-06-07 22:24:22 +02:00
2020-05-20 06:31:17 -05:00
}
2020-08-04 20:32:07 +10:00
if ( ( TrInput & IN_ACTION ) & & ( TrInput & IN_FORWARD ) & & item - > animNumber ! = LA_CROUCH_TO_CRAWL_START & & item - > animNumber ! = LA_CROUCH_TO_CRAWL_CONTINUE )
2020-05-20 06:31:17 -05:00
{
if ( LaraFloorFront ( item , item - > pos . yRot , 256 ) = = - 256 & &
LaraCeilingFront ( item , item - > pos . yRot , 256 , 256 ) ! = NO_HEIGHT & &
2020-08-08 15:15:15 -05:00
LaraCeilingFront ( item , item - > pos . yRot , 256 , 256 ) < = - 512 ) // &&
// EnableCrawlFlex1clickup == true)
2020-05-20 06:31:17 -05:00
{
2020-08-04 20:32:07 +10:00
item - > animNumber = LA_CRAWL_UP_STEP ;
2020-07-21 09:56:47 +02:00
item - > frameNumber = g_Level . Anims [ item - > animNumber ] . frameBase ;
2020-08-04 20:32:07 +10:00
item - > goalAnimState = LS_MISC_CONTROL ;
item - > currentAnimState = LS_MISC_CONTROL ;
2020-05-20 06:31:17 -05:00
}
2020-05-26 07:36:09 -05:00
else
if ( LaraFloorFront ( item , item - > pos . yRot , 256 ) = = 256 & &
LaraCeilingFront ( item , item - > pos . yRot , 256 , 256 ) ! = NO_HEIGHT & &
2020-08-08 15:15:15 -05:00
LaraCeilingFront ( item , item - > pos . yRot , 256 , - 256 ) < = - 512 ) // &&
// EnableCrawlFlex1clickdown == true)
2020-05-26 07:36:09 -05:00
{
2020-08-04 20:32:07 +10:00
item - > animNumber = LA_CRAWL_DOWN_STEP ;
2020-07-21 09:56:47 +02:00
item - > frameNumber = g_Level . Anims [ item - > animNumber ] . frameBase ;
2020-08-04 20:32:07 +10:00
item - > goalAnimState = LS_MISC_CONTROL ;
item - > currentAnimState = LS_MISC_CONTROL ;
2020-05-26 07:36:09 -05:00
}
2019-11-21 07:43:34 +01:00
}
2020-05-31 15:21:28 -05:00
Lara . gunStatus = LG_HANDS_BUSY ;
2019-11-21 07:43:34 +01:00
if ( TrInput & IN_LOOK )
LookUpDown ( ) ;
Lara . torsoXrot = 0 ;
Lara . torsoYrot = 0 ;
coll - > enableSpaz = false ;
coll - > enableBaddiePush = true ;
2020-08-04 20:32:07 +10:00
if ( item - > animNumber = = LA_CROUCH_TO_CRAWL_START )
2019-11-21 07:43:34 +01:00
Lara . gunStatus = LG_HANDS_BUSY ;
2020-05-31 04:20:52 -05:00
Camera . targetElevation = - ANGLE ( 23.0f ) ;
2020-05-20 22:07:27 -05:00
2020-07-21 09:56:47 +02:00
if ( g_Level . Rooms [ LaraItem - > roomNumber ] . flags & ENV_FLAG_WATER )
2020-05-20 22:07:27 -05:00
{
2020-08-04 20:32:07 +10:00
item - > goalAnimState = LS_CROUCH_IDLE ;
item - > requiredAnimState = LS_STOP ;
2020-05-20 22:07:27 -05:00
}
2019-11-21 07:43:34 +01:00
}
2019-12-02 14:49:19 +01:00
void lara_col_duck ( ITEM_INFO * item , COLL_INFO * coll ) //147C4, 148CC (F)
2019-11-21 07:43:34 +01:00
{
item - > gravityStatus = false ;
item - > fallspeed = 0 ;
2020-06-09 22:24:36 -03:00
Lara . moveAngle = 0 ;
2019-11-21 07:43:34 +01:00
coll - > facing = item - > pos . yRot ;
coll - > badPos = 384 ;
2019-12-11 18:07:27 +01:00
coll - > badNeg = - STEPUP_HEIGHT ;
2019-11-21 07:43:34 +01:00
coll - > badCeiling = 0 ;
2019-12-29 20:35:25 +01:00
coll - > slopesAreWalls = true ;
2019-11-21 07:43:34 +01:00
GetCollisionInfo ( coll , item - > pos . xPos , item - > pos . yPos , item - > pos . zPos , item - > roomNumber , 400 ) ;
if ( LaraFallen ( item , coll ) )
{
Lara . gunStatus = LG_NO_ARMS ;
}
else if ( ! TestLaraSlide ( item , coll ) )
{
2019-12-02 18:19:05 +01:00
Lara . keepDucked = coll - > midCeiling > = - 362 ;
2019-11-21 07:43:34 +01:00
ShiftItem ( item , coll ) ;
if ( coll - > midFloor ! = NO_HEIGHT )
item - > pos . yPos + = coll - > midFloor ;
if ( TrInput & IN_DUCK & & Lara . waterStatus ! = LW_WADE | |
Lara . keepDucked | |
2020-08-04 20:32:07 +10:00
item - > animNumber ! = LA_CROUCH_IDLE )
2019-11-21 07:43:34 +01:00
{
if ( TrInput & IN_LEFT )
{
2020-08-04 20:32:07 +10:00
item - > goalAnimState = LS_CROUCH_TURN_LEFT ;
2019-11-21 07:43:34 +01:00
}
else if ( TrInput & IN_RIGHT )
{
2020-08-04 20:32:07 +10:00
item - > goalAnimState = LS_CROUCH_TURN_RIGHT ;
2019-11-21 07:43:34 +01:00
}
}
else
{
2020-08-04 20:32:07 +10:00
item - > goalAnimState = LS_STOP ;
2019-11-21 07:43:34 +01:00
}
}
}
2019-12-02 14:49:19 +01:00
void lara_as_duck ( ITEM_INFO * item , COLL_INFO * coll ) //14688, 14738 (F)
2019-11-21 07:43:34 +01:00
{
2019-12-02 09:11:21 +01:00
short roomNum ;
2019-11-21 07:43:34 +01:00
coll - > enableSpaz = false ;
coll - > enableBaddiePush = true ;
Lara . isDucked = true ;
if ( item - > hitPoints < = 0 )
{
2020-08-04 20:32:07 +10:00
item - > goalAnimState = LS_CRAWL_IDLE ;
2019-11-21 07:43:34 +01:00
return ;
}
roomNum = LaraItem - > roomNumber ;
if ( TrInput & IN_LOOK )
LookUpDown ( ) ;
GetFloor ( LaraItem - > pos . xPos , LaraItem - > pos . yPos , LaraItem - > pos . zPos , & roomNum ) ;
2020-05-26 07:36:09 -05:00
// FOR DEBUG PURPOSES UNTIL SCRIPTING IS FINISHED-
2020-08-08 15:15:15 -05:00
// EnableCrouchRoll = true;
2020-05-26 07:36:09 -05:00
2019-11-21 07:43:34 +01:00
if ( ( TrInput & IN_FORWARD | | TrInput & IN_BACK )
& & ( TrInput & IN_DUCK | | Lara . keepDucked )
& & Lara . gunStatus = = LG_NO_ARMS
& & Lara . waterStatus ! = LW_WADE
2020-05-20 22:07:27 -05:00
| | Lara . waterSurfaceDist = = 256
2020-08-04 14:40:34 -05:00
& & ! ( Lara . waterSurfaceDist > 256 ) )
2019-11-21 07:43:34 +01:00
{
2020-08-04 20:32:07 +10:00
if ( ( item - > animNumber = = LA_CROUCH_IDLE
| | item - > animNumber = = LA_STAND_TO_CROUCH_END )
2019-11-21 07:43:34 +01:00
& & ! ( TrInput & IN_FLARE | | TrInput & IN_DRAW )
& & ( Lara . gunType ! = WEAPON_FLARE | | Lara . flareAge < 900 & & Lara . flareAge ! = 0 ) )
{
Lara . torsoYrot = 0 ;
Lara . torsoXrot = 0 ;
2020-08-04 20:32:07 +10:00
item - > goalAnimState = LS_CRAWL_IDLE ;
2019-11-21 07:43:34 +01:00
}
2020-05-01 21:19:03 -05:00
}
2020-08-04 14:40:34 -05: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
2020-08-08 15:15:15 -05:00
& & ! ( Lara . waterSurfaceDist > 256 ) )
// && EnableCrouchRoll == true)
2020-08-04 14:40:34 -05:00
{
if ( LaraFloorFront ( item , item - > pos . yRot , 1024 ) > = 384 | | //4 clicks away from holes in the floor
TestWall ( item , 1024 , 0 , - 256 ) ) //4 clicks away from walls
return ;
2020-05-01 21:19:03 -05:00
2020-08-04 14:40:34 -05:00
if ( ! ( TrInput & IN_FLARE | | TrInput & IN_DRAW ) //avoids some flare spawning/wep stuff
& & ( Lara . gunType ! = WEAPON_FLARE | | Lara . flareAge < 900 & & Lara . flareAge ! = 0 ) )
2020-06-07 22:24:22 +02:00
{
2020-08-04 14:40:34 -05:00
Lara . torsoYrot = 0 ;
Lara . torsoXrot = 0 ;
item - > goalAnimState = LS_CROUCH_ROLL ;
2020-06-07 22:24:22 +02:00
}
2020-08-04 14:40:34 -05:00
}
2020-05-01 21:19:03 -05:00
}
2020-05-01 21:47:35 -05:00
void lara_as_crouch_roll ( ITEM_INFO * item , COLL_INFO * coll )
2020-05-01 21:19:03 -05:00
{
2020-08-04 14:40:34 -05:00
Camera . targetElevation = - ANGLE ( 20.0f ) ;
item - > goalAnimState = LS_CROUCH_IDLE ;
2020-05-01 21:19:03 -05:00
}
2020-05-02 12:05:42 -05:00
2020-05-01 21:47:35 -05:00
void lara_col_crouch_roll ( ITEM_INFO * item , COLL_INFO * coll )
2020-05-01 21:19:03 -05:00
{
2020-06-07 22:24:22 +02:00
Lara . isDucked = true ;
item - > gravityStatus = false ;
item - > fallspeed = 0 ;
2020-06-09 22:24:36 -03:00
Lara . moveAngle = 0 ;
2020-06-07 22:24:22 +02:00
coll - > facing = item - > pos . yRot ;
coll - > badPos = STEPUP_HEIGHT ;
coll - > badNeg = - STEPUP_HEIGHT ;
coll - > badCeiling = 0 ;
coll - > slopesAreWalls = true ;
2020-06-09 22:51:03 -03:00
coll - > facing = Lara . moveAngle ;
GetCollisionInfo ( coll , item - > pos . xPos , item - > pos . yPos , item - > pos . zPos , item - > roomNumber , LARA_HITE ) ;
2020-06-07 22:24:22 +02:00
ShiftItem ( item , coll ) ;
2020-08-04 14:40:34 -05:00
if ( coll - > midFloor ! = NO_HEIGHT )
2020-05-02 12:05:42 -05:00
item - > pos . yPos + = coll - > midFloor ;
2019-11-21 07:43:34 +01:00
}
2020-05-01 21:19:03 -05:00
2019-12-02 14:49:19 +01:00
void lara_col_ducklr ( ITEM_INFO * item , COLL_INFO * coll ) //14534, 145E4 (F)
2019-11-21 07:43:34 +01:00
{
// FIXED
Lara . isDucked = true ;
if ( TrInput & IN_LOOK )
LookUpDown ( ) ;
item - > gravityStatus = false ;
item - > fallspeed = 0 ;
2020-06-09 22:24:36 -03:00
Lara . moveAngle = 0 ;
2019-11-21 07:43:34 +01:00
coll - > facing = item - > pos . yRot ;
coll - > badPos = 384 ;
2019-12-11 18:07:27 +01:00
coll - > badNeg = - STEPUP_HEIGHT ;
2019-11-21 07:43:34 +01:00
coll - > badCeiling = 0 ;
2019-12-29 20:35:25 +01:00
coll - > slopesAreWalls = true ;
2019-11-21 07:43:34 +01:00
GetCollisionInfo ( coll , item - > pos . xPos , item - > pos . yPos , item - > pos . zPos , item - > roomNumber , 400 ) ;
if ( LaraFallen ( item , coll ) )
{
Lara . gunStatus = LG_NO_ARMS ;
}
else if ( ! TestLaraSlide ( item , coll ) )
{
if ( coll - > midCeiling < - 362 )
Lara . keepDucked = false ;
else
Lara . keepDucked = true ;
ShiftItem ( item , coll ) ;
if ( coll - > midFloor ! = NO_HEIGHT )
item - > pos . yPos + = coll - > midFloor ;
}
}
2020-01-27 00:13:39 -03:00
void lara_as_duckr ( ITEM_INFO * item , COLL_INFO * coll ) // (F) (D)
2019-11-21 07:43:34 +01:00
{
coll - > enableSpaz = false ;
2020-01-27 00:13:39 -03:00
if ( ( TrInput & ( IN_DUCK | IN_LEFT ) ) ! = ( IN_DUCK | IN_LEFT ) | | item - > hitPoints < = 0 ) /* @ORIGINAL_BUG: the condition checks for IN_LEFT instead of IN_RIGHT */
2020-08-04 20:32:07 +10:00
item - > goalAnimState = LS_CROUCH_IDLE ;
2020-05-31 04:20:52 -05:00
item - > pos . yRot + = ANGLE ( 1.5f ) ;
2019-11-21 07:43:34 +01:00
}
2020-01-27 00:13:39 -03:00
void lara_as_duckl ( ITEM_INFO * item , COLL_INFO * coll ) // (F) (D)
2019-11-21 07:43:34 +01:00
{
coll - > enableSpaz = false ;
2019-12-22 17:06:25 -03:00
if ( ( TrInput & ( IN_DUCK | IN_LEFT ) ) ! = ( IN_DUCK | IN_LEFT ) | | item - > hitPoints < = 0 )
2020-08-04 20:32:07 +10:00
item - > goalAnimState = LS_CROUCH_IDLE ;
2020-05-31 04:20:52 -05:00
item - > pos . yRot - = ANGLE ( 1.5f ) ;
2019-11-21 07:43:34 +01:00
}
2020-08-08 15:15:15 -05:00
void LaraSlideEdgeJump ( ITEM_INFO * item , COLL_INFO * coll ) //12B18, 12BC8 (F)
{
ShiftItem ( item , coll ) ;
2019-11-21 07:43:34 +01:00
2020-08-08 15:15:15 -05:00
switch ( coll - > collType )
2019-11-21 07:43:34 +01:00
{
2020-08-08 15:15:15 -05:00
case CT_LEFT :
item - > pos . yRot + = ANGLE ( 5.0f ) ;
2019-11-21 07:43:34 +01:00
break ;
2020-08-08 15:15:15 -05:00
case CT_RIGHT :
item - > pos . yRot - = ANGLE ( 5.0f ) ;
2019-11-21 07:43:34 +01:00
break ;
2020-08-08 15:15:15 -05:00
case CT_TOP :
case CT_TOP_FRONT :
if ( item - > fallspeed < = 0 )
item - > fallspeed = 1 ;
2019-11-21 07:43:34 +01:00
break ;
2020-08-08 15:15:15 -05:00
case CT_CLAMP :
item - > pos . zPos - = ( 400 * phd_cos ( coll - > facing ) ) > > W2V_SHIFT ;
item - > pos . xPos - = ( 400 * phd_sin ( coll - > facing ) ) > > W2V_SHIFT ;
2019-11-21 07:43:34 +01:00
2020-08-08 15:15:15 -05:00
item - > speed = 0 ;
2019-11-21 07:43:34 +01:00
2020-08-08 15:15:15 -05:00
coll - > midFloor = 0 ;
2019-11-21 07:43:34 +01:00
2020-08-08 15:15:15 -05:00
if ( item - > fallspeed < = 0 )
item - > fallspeed = 16 ;
2019-11-21 07:43:34 +01:00
2020-08-08 15:15:15 -05:00
break ;
2019-11-21 07:43:34 +01:00
}
}
2020-08-08 15:15:15 -05:00
void lara_slide_slope ( ITEM_INFO * item , COLL_INFO * coll ) //127BC, 1286C (F)
2019-11-21 07:43:34 +01:00
{
2020-08-08 15:15:15 -05:00
coll - > badPos = NO_BAD_POS ;
coll - > badNeg = - 512 ;
coll - > badCeiling = 0 ;
2019-11-21 07:43:34 +01:00
2020-08-08 15:15:15 -05:00
coll - > facing = Lara . moveAngle ;
GetCollisionInfo ( coll , item - > pos . xPos , item - > pos . yPos , item - > pos . zPos , item - > roomNumber , LARA_HITE ) ;
2019-11-21 07:43:34 +01:00
2020-08-08 15:15:15 -05:00
if ( ! LaraHitCeiling ( item , coll ) )
2019-11-21 07:43:34 +01:00
{
2020-08-08 15:15:15 -05:00
LaraDeflectEdge ( item , coll ) ;
2019-11-21 07:43:34 +01:00
2020-08-08 15:15:15 -05:00
if ( coll - > midFloor < = 200 )
2019-11-21 07:43:34 +01:00
{
2020-08-08 15:15:15 -05:00
TestLaraSlide ( item , coll ) ;
item - > pos . yPos + = coll - > midFloor ;
if ( abs ( coll - > tiltX ) < = 2 & & abs ( coll - > tiltZ ) < = 2 )
2019-11-21 07:43:34 +01:00
{
2020-08-08 15:15:15 -05:00
if ( TrInput & IN_FORWARD & & item - > currentAnimState ! = LS_SLIDE_BACK )
{
item - > goalAnimState = LS_RUN_FORWARD ;
}
else
2020-08-04 20:32:07 +10:00
item - > goalAnimState = LS_STOP ;
2020-08-08 15:15:15 -05:00
StopSoundEffect ( SFX_LARA_SLIPPING ) ;
2020-01-14 14:25:37 +01:00
}
2019-12-16 19:04:28 +01:00
}
2020-08-08 15:15:15 -05:00
else
2019-12-02 06:39:51 +01:00
{
2020-08-08 15:15:15 -05:00
if ( item - > currentAnimState = = LS_SLIDE_FORWARD )
2020-01-14 14:25:37 +01:00
{
2020-08-08 15:15:15 -05:00
item - > animNumber = LA_FALL_START ;
item - > frameNumber = g_Level . Anims [ LA_FALL_START ] . frameBase ;
2019-12-29 20:35:25 +01:00
2020-08-08 15:15:15 -05:00
item - > currentAnimState = LS_JUMP_FORWARD ;
item - > goalAnimState = LS_JUMP_FORWARD ;
2020-01-14 14:25:37 +01:00
}
else
{
2020-08-08 15:15:15 -05:00
item - > animNumber = LA_FALL_BACK ;
item - > frameNumber = g_Level . Anims [ LA_FALL_BACK ] . frameBase ;
2020-01-14 14:25:37 +01:00
2020-08-08 15:15:15 -05:00
item - > currentAnimState = LS_FALL_BACK ;
item - > goalAnimState = LS_FALL_BACK ;
2019-12-02 06:39:51 +01:00
}
2019-12-17 17:37:53 +01:00
2020-08-08 15:15:15 -05:00
StopSoundEffect ( SFX_LARA_SLIPPING ) ;
2019-12-02 06:39:51 +01:00
2020-08-08 15:15:15 -05:00
item - > gravityStatus = true ;
item - > fallspeed = 0 ;
}
}
}
2019-12-16 19:04:28 +01:00
2020-05-24 03:10:00 -05:00
/**********************
2020-08-06 03:02:11 -05:00
NEW FEET HANGING STUFF
////obviously, not all animations were made yet, we still need:
- crouch pull up ( works well , tested with placeholder anim )
- corner anims ( works well , tested with placeholder anim )
- handstand ( not tested )
2020-05-24 03:10:00 -05:00
* * * * * * * * * * * * * * * * * * * * * * */
2020-05-23 15:59:18 -05:00
void lara_as_hang_feet ( ITEM_INFO * item , COLL_INFO * coll )
{
Lara . isClimbing = false ;
if ( item - > hitPoints < = 0 )
{
2020-08-04 20:32:07 +10:00
item - > goalAnimState = LS_STOP ;
2020-05-23 15:59:18 -05:00
return ;
}
if ( TrInput & IN_LOOK )
LookUpDown ( ) ;
coll - > enableBaddiePush = false ;
coll - > enableSpaz = false ;
Camera . targetAngle = 0 ;
2020-05-31 04:20:52 -05:00
Camera . targetElevation = - ANGLE ( 45.0f ) ;
2020-05-23 15:59:18 -05:00
}
void lara_col_hang_feet ( ITEM_INFO * item , COLL_INFO * coll )
{
item - > fallspeed = 0 ;
item - > gravityStatus = false ;
2020-06-09 22:24:36 -03:00
Lara . moveAngle = 0 ;
2020-05-23 15:59:18 -05:00
LaraHangTest ( item , coll ) ;
if ( ! ( TrInput & IN_ACTION ) )
2020-08-04 20:32:07 +10:00
item - > goalAnimState = LS_JUMP_UP ;
2020-05-23 15:59:18 -05:00
2020-08-04 20:32:07 +10:00
if ( item - > animNumber = = LA_HANG_FEET_IDLE )
2020-05-23 15:59:18 -05:00
{
int flag ;
if ( TrInput & IN_LEFT | | TrInput & IN_LSTEP )
{
2020-05-31 04:20:52 -05:00
if ( CanLaraHangSideways ( item , coll , - ANGLE ( 90.0f ) ) )
2020-05-23 15:59:18 -05:00
{
2020-08-04 20:32:07 +10:00
item - > goalAnimState = LS_SHIMMY_FEET_LEFT ;
2020-05-23 15:59:18 -05:00
return ;
}
2020-08-04 15:55:28 -05:00
flag = LaraHangLeftCornerTest ( item , coll ) ;
2020-05-24 03:10:00 -05:00
if ( flag ! = 0 )
{
if ( flag < = 0 )
2020-08-04 15:55:28 -05:00
item - > goalAnimState = LS_SHIMMY_FEET_INNER_LEFT ;
2020-05-24 03:10:00 -05:00
else
2020-08-04 15:55:28 -05:00
item - > goalAnimState = LS_SHIMMY_FEET_OUTER_LEFT ;
2020-05-23 15:59:18 -05:00
return ;
}
2020-05-24 03:10:00 -05:00
2020-05-23 15:59:18 -05:00
}
if ( TrInput & IN_RIGHT | | TrInput & IN_RSTEP )
{
2020-05-31 04:20:52 -05:00
if ( CanLaraHangSideways ( item , coll , ANGLE ( 90.0f ) ) )
2020-05-23 15:59:18 -05:00
{
2020-08-04 20:32:07 +10:00
item - > goalAnimState = LS_SHIMMY_FEET_RIGHT ;
2020-05-23 15:59:18 -05:00
return ;
}
2020-08-04 15:55:28 -05:00
flag = LaraHangRightCornerTest ( item , coll ) ;
2020-05-24 03:10:00 -05:00
if ( flag ! = 0 )
{
if ( flag < = 0 )
2020-08-04 15:55:28 -05:00
item - > goalAnimState = LS_SHIMMY_FEET_INNER_RIGHT ;
2020-05-24 03:10:00 -05:00
else
2020-08-04 15:55:28 -05:00
item - > goalAnimState = LS_SHIMMY_FEET_OUTER_RIGHT ;
2020-05-24 03:10:00 -05:00
return ;
2020-08-04 15:55:28 -05:00
}
2020-05-23 15:59:18 -05:00
}
TestForObjectOnLedge ( item , coll ) ;
if ( TrInput & IN_FORWARD )
{
if ( coll - > frontFloor > - 850 )
{
if ( coll - > frontFloor < - 650 & &
coll - > frontFloor > = coll - > frontCeiling & &
coll - > frontFloor > = coll - > leftCeiling2 & &
coll - > frontFloor > = coll - > rightCeiling2 )
{
if ( abs ( coll - > leftFloor2 - coll - > rightFloor2 ) < 60 & & ! coll - > hitStatic )
{
if ( TrInput & IN_WALK )
{
2020-08-04 20:32:07 +10:00
//till anim item->goalAnimState = LS_HANDSTAND;
2020-05-23 15:59:18 -05:00
}
else if ( TrInput & IN_DUCK )
{
2020-08-04 20:32:07 +10:00
item - > goalAnimState = LS_HANG_TO_CRAWL ;
item - > requiredAnimState = LS_CROUCH_IDLE ;
2020-05-23 15:59:18 -05:00
}
else
{
2020-08-04 20:32:07 +10:00
item - > goalAnimState = LS_GRABBING ;
2020-05-23 15:59:18 -05:00
}
return ;
}
}
}
2020-05-24 03:10:00 -05:00
if ( coll - > frontFloor < - 650 & &
coll - > frontFloor - coll - > frontCeiling > = - 256 & &
coll - > frontFloor - coll - > leftCeiling2 > = - 256 & &
coll - > frontFloor - coll - > rightCeiling2 > = - 256 )
{
if ( abs ( coll - > leftFloor2 - coll - > rightFloor2 ) < 60 & & ! coll - > hitStatic )
2020-05-23 15:59:18 -05:00
{
2020-08-04 20:32:07 +10:00
item - > goalAnimState = LS_HANG_TO_CRAWL ;
item - > requiredAnimState = LS_CROUCH_IDLE ;
2020-05-24 03:10:00 -05:00
return ;
2020-05-23 15:59:18 -05:00
}
}
2020-05-24 03:10:00 -05:00
}
/*
2020-05-23 15:59:18 -05:00
if ( Lara . climbStatus ! = 0 & &
coll - > midCeiling < = - 256 & &
abs ( coll - > leftCeiling2 - coll - > rightCeiling2 ) < 60 )
{
if ( LaraTestClimbStance ( item , coll ) )
{
2020-08-04 20:32:07 +10:00
item - > goalAnimState = LS_LADDER_IDLE ;
2020-05-23 15:59:18 -05:00
}
else
{
2020-08-04 20:32:07 +10:00
item - > animNumber = LA_LADDER_UP_HANDS ;
2020-07-21 09:56:47 +02:00
item - > frameNumber = g_Level . Anims [ item - > animNumber ] . frameBase ;
2020-08-04 20:32:07 +10:00
item - > goalAnimState = LS_HANG ;
item - > currentAnimState = LS_HANG ;
2020-05-23 15:59:18 -05:00
}
}
return ;
} */ //commenting till daniel makes anims
2020-05-24 03:10:00 -05:00
2020-06-09 22:24:36 -03:00
Lara . moveAngle = 0 ;
2020-05-24 03:10:00 -05:00
LaraHangTest ( item , coll ) ;
2020-05-23 15:59:18 -05:00
}
}
2020-06-07 22:24:22 +02:00
void lara_as_hang_feet_shimmyr ( ITEM_INFO * item , COLL_INFO * coll )
2020-05-23 15:59:18 -05:00
{
2020-06-07 22:24:22 +02:00
coll - > enableBaddiePush = false ;
coll - > enableSpaz = false ;
Camera . targetAngle = 0 ;
Camera . targetElevation = - ANGLE ( 45.0f ) ;
2020-05-23 15:59:18 -05:00
2020-05-23 16:50:53 -05:00
if ( ! ( TrInput & ( IN_RIGHT | IN_RSTEP ) ) )
2020-08-04 20:32:07 +10:00
item - > goalAnimState = LS_HANG_FEET ;
2020-05-23 15:59:18 -05:00
}
void lara_col_hang_feet_shimmyr ( ITEM_INFO * item , COLL_INFO * coll )
{
2020-06-09 22:24:36 -03:00
Lara . moveAngle = ANGLE ( 90 ) ;
2020-08-04 15:55:28 -05:00
coll - > radius = LARA_RAD ;
2020-05-23 15:59:18 -05:00
LaraHangTest ( item , coll ) ;
2020-06-09 22:24:36 -03:00
Lara . moveAngle = ANGLE ( 90 ) ;
2020-05-23 15:59:18 -05:00
}
void lara_as_hang_feet_shimmyl ( ITEM_INFO * item , COLL_INFO * coll )
{
coll - > enableBaddiePush = false ;
coll - > enableSpaz = false ;
Camera . targetAngle = 0 ;
2020-05-31 04:20:52 -05:00
Camera . targetElevation = - ANGLE ( 45.0f ) ;
2020-05-23 16:50:53 -05:00
if ( ! ( TrInput & ( IN_LEFT | IN_LSTEP ) ) )
2020-08-04 20:32:07 +10:00
item - > goalAnimState = LS_HANG_FEET ;
2020-05-23 15:59:18 -05:00
}
void lara_col_hang_feet_shimmyl ( ITEM_INFO * item , COLL_INFO * coll )
{
2020-06-09 22:24:36 -03:00
Lara . moveAngle = - ANGLE ( 90 ) ;
2020-08-04 15:55:28 -05:00
coll - > radius = LARA_RAD ;
2020-05-23 15:59:18 -05:00
LaraHangTest ( item , coll ) ;
2020-06-09 22:24:36 -03:00
Lara . moveAngle = - ANGLE ( 90 ) ;
2020-05-24 03:10:00 -05:00
}
void lara_as_hang_feet_inRcorner ( ITEM_INFO * item , COLL_INFO * coll )
{
Camera . laraNode = 8 ;
2020-05-31 04:20:52 -05:00
Camera . targetElevation = ANGLE ( 33.0f ) ;
2020-08-06 03:02:11 -05:00
if ( item - > frameNumber = = g_Level . Anims [ LA_SHIMMY_FEET_RIGHT_CORNER_INNER ] . frameEnd ) // I don't like this either but it's better than adding 4 new 1 frame anims?
2020-05-31 04:20:52 -05:00
SetCornerAnimFeet ( item , coll , ANGLE ( 90.0f ) ,
2020-08-04 20:32:07 +10:00
item - > animNumber = LA_SHIMMY_FEET_RIGHT_CORNER_INNER ) ;
2020-05-24 03:10:00 -05:00
}
void lara_as_hang_feet_inLcorner ( ITEM_INFO * item , COLL_INFO * coll )
{
Camera . laraNode = 8 ;
2020-05-31 04:20:52 -05:00
Camera . targetElevation = ANGLE ( 33.0f ) ;
2020-08-06 03:02:11 -05:00
if ( item - > frameNumber = = g_Level . Anims [ LA_SHIMMY_FEET_LEFT_CORNER_INNER ] . frameEnd )
2020-05-31 04:20:52 -05:00
SetCornerAnimFeet ( item , coll , - ANGLE ( 90.0f ) ,
2020-08-04 20:32:07 +10:00
item - > animNumber = LA_SHIMMY_FEET_LEFT_CORNER_INNER ) ;
2020-05-24 03:10:00 -05:00
}
void lara_as_hang_feet_outRcorner ( ITEM_INFO * item , COLL_INFO * coll )
{
Camera . laraNode = 8 ;
2020-05-31 04:20:52 -05:00
Camera . targetElevation = ANGLE ( 33.0f ) ;
2020-08-06 03:02:11 -05:00
if ( item - > frameNumber = = g_Level . Anims [ LA_SHIMMY_FEET_RIGHT_CORNER_OUTER ] . frameEnd )
2020-05-31 04:20:52 -05:00
SetCornerAnimFeet ( item , coll , - ANGLE ( 90.0f ) ,
2020-08-04 20:32:07 +10:00
item - > animNumber = LA_SHIMMY_FEET_RIGHT_CORNER_OUTER ) ;
2020-05-24 03:10:00 -05:00
}
void lara_as_hang_feet_outLcorner ( ITEM_INFO * item , COLL_INFO * coll )
{
Camera . laraNode = 8 ;
2020-05-31 04:20:52 -05:00
Camera . targetElevation = ANGLE ( 33.0f ) ;
2020-08-06 03:02:11 -05:00
if ( item - > frameNumber = = g_Level . Anims [ LA_SHIMMY_FEET_LEFT_CORNER_OUTER ] . frameEnd )
2020-05-31 04:20:52 -05:00
SetCornerAnimFeet ( item , coll , ANGLE ( 90.0f ) ,
2020-08-04 20:32:07 +10:00
item - > animNumber = LA_SHIMMY_FEET_LEFT_CORNER_OUTER ) ;
2020-05-24 03:10:00 -05:00
}