mirror of
https://github.com/TombEngine/TombEngine.git
synced 2025-05-10 20:46:47 +03:00
Cleanup, control code standardisation, some command-query separation, un-hardcoding of animation state dispatches, QOL improvements to Lara's basic moveset.
This commit is contained in:
parent
856d11150a
commit
2ee7059470
33 changed files with 6256 additions and 4054 deletions
|
@ -1,5 +1,5 @@
|
|||
#include "framework.h"
|
||||
#include "Lara.h"
|
||||
#include "lara.h"
|
||||
#include "lara_basic.h"
|
||||
#include "lara_tests.h"
|
||||
#include "lara_monkey.h"
|
||||
|
@ -49,52 +49,58 @@ ITEM_INFO* LaraItem;
|
|||
COLL_INFO lara_coll;
|
||||
byte LaraNodeUnderwater[NUM_LARA_MESHES];
|
||||
|
||||
// For later.
|
||||
bool EnableActionToggle;
|
||||
bool EnableJumpUpAlign;
|
||||
bool EnableClimbAssist;
|
||||
bool EnableSafetyDrop;
|
||||
|
||||
function<LaraRoutineFunction> lara_control_routines[NUM_LARA_STATES + 1] = {
|
||||
lara_as_walk,
|
||||
lara_as_run,
|
||||
lara_as_stop,
|
||||
lara_as_forwardjump,
|
||||
lara_as_walk_forward,//0
|
||||
lara_as_run,//1
|
||||
lara_as_stop,//2
|
||||
lara_as_jump_forward,//3
|
||||
lara_void_func,//4
|
||||
lara_as_fastback,//5
|
||||
lara_as_turn_r,//6
|
||||
lara_as_turn_l,//7
|
||||
lara_as_hop_back,//5
|
||||
lara_as_turn_right,//6
|
||||
lara_as_turn_left,//7
|
||||
lara_as_death,//8
|
||||
lara_as_fastfall,
|
||||
lara_as_hang,
|
||||
lara_as_reach,
|
||||
lara_as_splat,
|
||||
lara_as_tread,
|
||||
lara_void_func,
|
||||
lara_as_compress,//15
|
||||
lara_as_back,//16
|
||||
lara_as_swim,//17
|
||||
lara_as_freefall,//9
|
||||
lara_as_hang,//10
|
||||
lara_as_reach,//11
|
||||
lara_as_splat,//12
|
||||
lara_as_underwater_stop,//13
|
||||
lara_void_func,//14
|
||||
lara_as_jump_prepare,//15
|
||||
lara_as_walk_back,//16
|
||||
lara_as_underwater_swim,//17
|
||||
lara_as_glide,//18
|
||||
lara_as_null,//19
|
||||
lara_as_fastturn,//20
|
||||
lara_as_stepright,//21
|
||||
lara_as_stepleft,//22
|
||||
lara_void_func,
|
||||
lara_as_turn_right_fast,//20
|
||||
lara_as_step_right,//21
|
||||
lara_as_step_left,//22
|
||||
lara_void_func,//23
|
||||
lara_as_slide,//24
|
||||
lara_as_backjump,//25
|
||||
lara_as_rightjump,//26
|
||||
lara_as_leftjump,//27
|
||||
lara_as_upjump,//28
|
||||
lara_as_fallback,//29
|
||||
lara_as_hangleft,//30
|
||||
lara_as_hangright,//31
|
||||
lara_as_slideback,//32
|
||||
lara_as_surftread,
|
||||
lara_as_surfswim,
|
||||
lara_as_dive,
|
||||
lara_as_pushblock,//36
|
||||
lara_as_pullblock,//37
|
||||
lara_as_ppready,//38
|
||||
lara_as_jump_back,//25
|
||||
lara_as_jump_right,//26
|
||||
lara_as_jump_left,//27
|
||||
lara_as_jump_up,//28
|
||||
lara_as_fall_back,//29
|
||||
lara_as_shimmy_left,//30
|
||||
lara_as_shimmy_right,//31
|
||||
lara_as_slide_back,//32
|
||||
lara_as_surftread,//33
|
||||
lara_as_surfswim,//34
|
||||
lara_as_dive,//35
|
||||
lara_as_pushable_push,//36
|
||||
lara_as_pushable_pull,//37
|
||||
lara_as_pushable_ready,//38
|
||||
lara_as_pickup,//39
|
||||
lara_as_switchon,//40
|
||||
lara_as_switchoff,//41
|
||||
lara_as_usekey,//42
|
||||
lara_as_usepuzzle,//43
|
||||
lara_as_uwdeath,//44
|
||||
lara_as_switch,//40
|
||||
lara_as_switch,//41 //
|
||||
lara_as_use_key,//42
|
||||
lara_as_use_puzzle,//43
|
||||
lara_as_underwater_death,//44
|
||||
lara_void_func,//45
|
||||
lara_as_special,//46
|
||||
lara_as_surfback,//47
|
||||
|
@ -102,8 +108,8 @@ function<LaraRoutineFunction> lara_control_routines[NUM_LARA_STATES + 1] = {
|
|||
lara_as_surfright,//49
|
||||
lara_void_func,//50
|
||||
lara_void_func,//51
|
||||
lara_as_swandive,//52
|
||||
lara_as_fastdive,//53
|
||||
lara_as_swandive_start,//52
|
||||
lara_as_swandive_freefall,//53
|
||||
lara_as_gymnast,//54
|
||||
lara_as_waterout,
|
||||
lara_as_climbstnc,
|
||||
|
@ -111,37 +117,37 @@ function<LaraRoutineFunction> lara_control_routines[NUM_LARA_STATES + 1] = {
|
|||
lara_as_climbleft,
|
||||
lara_as_climbend,
|
||||
lara_as_climbright,
|
||||
lara_as_climbdown,//
|
||||
lara_as_climbdown, //
|
||||
lara_void_func,
|
||||
lara_void_func,
|
||||
lara_void_func,
|
||||
lara_as_wade,//65
|
||||
lara_as_waterroll,//66
|
||||
lara_as_pickupflare,//67
|
||||
lara_as_underwater_roll_180,//66
|
||||
lara_as_pickup_flare,//67
|
||||
lara_void_func,//68
|
||||
lara_void_func,//69
|
||||
lara_as_deathslide,//70
|
||||
lara_as_duck,//71
|
||||
lara_as_zipline,//70
|
||||
lara_as_crouch,//71
|
||||
lara_as_crouch_roll,//72
|
||||
lara_as_dash,
|
||||
lara_as_dashdive,
|
||||
lara_as_sprint,
|
||||
lara_as_sprint_roll,
|
||||
lara_as_hang2,
|
||||
lara_as_monkeyswing,
|
||||
lara_as_monkeyl,
|
||||
lara_as_monkeyr,
|
||||
lara_as_monkey180,
|
||||
lara_as_all4s,//80
|
||||
lara_as_crawl,//81
|
||||
lara_as_hangturnl,
|
||||
lara_as_hangturnr,
|
||||
lara_as_all4turnl,//84
|
||||
lara_as_all4turnr,//85
|
||||
lara_as_crawlb,//86
|
||||
lara_as_crawl_stop,//80
|
||||
lara_as_crawl_forward,//81
|
||||
lara_as_hangturnl,//82
|
||||
lara_as_hangturnr,//83
|
||||
lara_as_crawl_turn_left,//84
|
||||
lara_as_crawl_turn_right,//85
|
||||
lara_as_crawl_back,//86
|
||||
lara_as_null,
|
||||
lara_as_null,
|
||||
lara_as_controlled,
|
||||
lara_as_ropel,
|
||||
lara_as_roper,
|
||||
lara_as_rope_turn_clockwise,
|
||||
lara_as_rope_turn_counter_clockwise,
|
||||
lara_as_controlled,
|
||||
lara_as_controlled,
|
||||
lara_as_controlled,
|
||||
|
@ -152,34 +158,34 @@ function<LaraRoutineFunction> lara_control_routines[NUM_LARA_STATES + 1] = {
|
|||
lara_as_null,//99
|
||||
lara_as_null,//100
|
||||
lara_as_null,//101
|
||||
lara_as_poleleft,//102
|
||||
lara_as_poleright,//103
|
||||
lara_as_pole_turn_clockwise,//102
|
||||
lara_as_pole_turn_counter_clockwise,//103
|
||||
lara_as_pulley,//104
|
||||
lara_as_duckl,//105
|
||||
lara_as_duckr,//106
|
||||
lara_as_crouch_turn_left,//105
|
||||
lara_as_crouch_turn_right,//106
|
||||
lara_as_extcornerl,//107
|
||||
lara_as_extcornerr,//108
|
||||
lara_as_intcornerl,//109
|
||||
lara_as_intcornerr,//110
|
||||
lara_as_rope,//111
|
||||
lara_as_climbrope,//112
|
||||
lara_as_climbroped,//113
|
||||
lara_as_rope_up,//112
|
||||
lara_as_rope_down,//113
|
||||
lara_as_rope,//114
|
||||
lara_as_rope,//115
|
||||
lara_void_func,
|
||||
lara_as_controlled,
|
||||
lara_as_swimcheat,
|
||||
lara_as_trpose,//119
|
||||
lara_void_func,//116
|
||||
lara_as_controlled,//117
|
||||
lara_as_swim_cheat,//118
|
||||
lara_as_tightrope_stop,//119
|
||||
lara_as_null,//120
|
||||
lara_as_trwalk,//121
|
||||
lara_as_trfall,//122
|
||||
lara_as_trfall,//123
|
||||
lara_as_tightrope_walk,//121
|
||||
lara_as_tightrope_fall,//122
|
||||
lara_as_tightrope_fall,//123
|
||||
lara_as_null,//124
|
||||
lara_as_null,//125
|
||||
lara_as_switchon,//126
|
||||
lara_as_switch,//126
|
||||
lara_as_null,//127
|
||||
lara_as_parallelbars,//128
|
||||
lara_as_pbleapoff,//129
|
||||
lara_as_swing_bar,//128
|
||||
lara_as_swing_bar_leap,//129
|
||||
lara_as_null,//130
|
||||
lara_as_null,//131
|
||||
lara_as_null,//132
|
||||
|
@ -190,53 +196,60 @@ function<LaraRoutineFunction> lara_control_routines[NUM_LARA_STATES + 1] = {
|
|||
lara_as_null,//137
|
||||
lara_as_null,//138
|
||||
lara_as_hang_feet,//139
|
||||
lara_as_hang_feet_shimmyr,//140
|
||||
lara_as_hang_feet_shimmyl,//141
|
||||
lara_as_hang_feet_inRcorner,//142
|
||||
lara_as_hang_feet_inLcorner,//143
|
||||
lara_as_hang_feet_outRcorner,//144
|
||||
lara_as_hang_feet_outLcorner,//145
|
||||
lara_as_shimmy_feet_right,//140
|
||||
lara_as_shimmy_feet_left,//141
|
||||
lara_as_hang_feet_right_corner_inner,//142
|
||||
lara_as_hang_feet_left_corner_inner,//143
|
||||
lara_as_hang_feet_right_corner_outer,//144
|
||||
lara_as_hang_feet_left_corner_outer,//145
|
||||
lara_as_controlledl,
|
||||
lara_as_null,
|
||||
lara_as_null,
|
||||
lara_as_null,
|
||||
lara_as_stepoff_left,
|
||||
lara_as_stepoff_right
|
||||
lara_as_stepoff_left,//150
|
||||
lara_as_stepoff_right,
|
||||
lara_as_steep_slide,
|
||||
lara_as_steep_slide_back,
|
||||
lara_as_slide_turn_180,
|
||||
lara_as_jump_forward,
|
||||
lara_as_turn_left_fast,//156
|
||||
lara_as_null,//157
|
||||
};
|
||||
|
||||
function<LaraRoutineFunction> lara_collision_routines[NUM_LARA_STATES + 1] = {
|
||||
lara_col_walk,
|
||||
lara_col_walk_forward,
|
||||
lara_col_run,
|
||||
lara_col_stop,
|
||||
lara_col_forwardjump,
|
||||
lara_col_jump_forward,
|
||||
lara_col_pose,
|
||||
lara_col_fastback,
|
||||
lara_col_turn_r,
|
||||
lara_col_turn_l,
|
||||
lara_col_hop_back,
|
||||
lara_col_turn_right,
|
||||
lara_col_turn_left,
|
||||
lara_col_death,
|
||||
lara_col_fastfall,
|
||||
lara_col_freefall,
|
||||
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_underwater_stop,
|
||||
lara_col_stop,
|
||||
lara_col_jump_prepare,
|
||||
lara_col_walk_back,
|
||||
lara_col_underwater_swim,
|
||||
lara_col_glide,
|
||||
lara_default_col,
|
||||
lara_col_fastturn,
|
||||
lara_col_stepright,
|
||||
lara_col_stepleft,
|
||||
lara_col_turn_right_fast,//20
|
||||
lara_col_step_right,
|
||||
lara_col_step_left,
|
||||
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_jump_back,
|
||||
lara_col_jump_right,
|
||||
lara_col_jump_left,
|
||||
lara_col_jump_up,
|
||||
lara_col_fall_back,
|
||||
lara_col_shimmy_left,
|
||||
lara_col_shimmy_right,
|
||||
lara_col_slide_back,
|
||||
lara_col_surftread,
|
||||
lara_col_surfswim,
|
||||
lara_col_dive,
|
||||
|
@ -248,7 +261,7 @@ function<LaraRoutineFunction> lara_collision_routines[NUM_LARA_STATES + 1] = {
|
|||
lara_default_col,
|
||||
lara_default_col,
|
||||
lara_default_col,
|
||||
lara_col_uwdeath,
|
||||
lara_col_underwater_death,
|
||||
lara_col_roll,
|
||||
lara_void_func,
|
||||
lara_col_surfback,
|
||||
|
@ -256,8 +269,8 @@ function<LaraRoutineFunction> lara_collision_routines[NUM_LARA_STATES + 1] = {
|
|||
lara_col_surfright,
|
||||
lara_void_func,
|
||||
lara_void_func,
|
||||
lara_col_swandive,
|
||||
lara_col_fastdive,
|
||||
lara_col_swandive_start,
|
||||
lara_col_swandive_freefall,
|
||||
lara_default_col,
|
||||
lara_default_col,
|
||||
lara_col_climbstnc,
|
||||
|
@ -270,29 +283,29 @@ function<LaraRoutineFunction> lara_collision_routines[NUM_LARA_STATES + 1] = {
|
|||
lara_void_func,
|
||||
lara_void_func,
|
||||
lara_col_wade,
|
||||
lara_col_waterroll,
|
||||
lara_col_underwater_roll_180,
|
||||
lara_default_col,
|
||||
lara_void_func,
|
||||
lara_void_func,
|
||||
lara_void_func,
|
||||
lara_col_duck,
|
||||
lara_col_crouch,
|
||||
lara_col_crouch_roll,
|
||||
lara_col_dash,
|
||||
lara_col_dashdive,
|
||||
lara_col_sprint,
|
||||
lara_col_sprint_roll,
|
||||
lara_col_hang2,
|
||||
lara_col_monkeyswing,
|
||||
lara_col_monkeyl,
|
||||
lara_col_monkeyr,
|
||||
lara_col_monkey180,
|
||||
lara_col_all4s,
|
||||
lara_col_crawl,
|
||||
lara_col_crawl_stop,
|
||||
lara_col_crawl_forward,
|
||||
lara_col_hangturnlr,
|
||||
lara_col_hangturnlr,
|
||||
lara_col_all4turnlr,
|
||||
lara_col_all4turnlr,
|
||||
lara_col_crawlb,
|
||||
lara_col_crawl_turn,
|
||||
lara_col_crawl_turn,
|
||||
lara_col_crawl_back,
|
||||
lara_void_func,
|
||||
lara_col_crawl2hang,
|
||||
lara_col_crawl_to_hang,
|
||||
lara_default_col,
|
||||
lara_void_func,
|
||||
lara_void_func,
|
||||
|
@ -303,14 +316,14 @@ function<LaraRoutineFunction> lara_collision_routines[NUM_LARA_STATES + 1] = {
|
|||
lara_void_func,
|
||||
lara_void_func,
|
||||
lara_default_col,
|
||||
lara_col_polestat,
|
||||
lara_col_poleup,
|
||||
lara_col_poledown,
|
||||
lara_col_pole_stop,
|
||||
lara_col_pole_up,
|
||||
lara_col_pole_down,
|
||||
lara_void_func,
|
||||
lara_void_func,
|
||||
lara_default_col,
|
||||
lara_col_ducklr,
|
||||
lara_col_ducklr,
|
||||
lara_col_crouch_turn,
|
||||
lara_col_crouch_turn,
|
||||
lara_default_col,
|
||||
lara_default_col,
|
||||
lara_default_col,
|
||||
|
@ -318,11 +331,11 @@ function<LaraRoutineFunction> lara_collision_routines[NUM_LARA_STATES + 1] = {
|
|||
lara_col_rope,
|
||||
lara_void_func,
|
||||
lara_void_func,
|
||||
lara_col_ropefwd,
|
||||
lara_col_ropefwd,
|
||||
lara_col_rope_swing,
|
||||
lara_col_rope_swing,
|
||||
lara_void_func,
|
||||
lara_void_func,
|
||||
lara_col_swim,
|
||||
lara_col_underwater_swim,
|
||||
lara_default_col,
|
||||
lara_default_col,
|
||||
lara_default_col,
|
||||
|
@ -344,8 +357,8 @@ function<LaraRoutineFunction> lara_collision_routines[NUM_LARA_STATES + 1] = {
|
|||
lara_void_func,
|
||||
lara_void_func,
|
||||
lara_col_hang_feet,
|
||||
lara_col_hang_feet_shimmyr,
|
||||
lara_col_hang_feet_shimmyl,
|
||||
lara_col_shimmy_feet_right,
|
||||
lara_col_shimmy_feet_right,
|
||||
lara_default_col,
|
||||
lara_default_col,
|
||||
lara_default_col,
|
||||
|
@ -354,8 +367,14 @@ function<LaraRoutineFunction> lara_collision_routines[NUM_LARA_STATES + 1] = {
|
|||
lara_void_func,
|
||||
lara_void_func,
|
||||
lara_void_func,
|
||||
lara_default_col,//150
|
||||
lara_default_col,//151
|
||||
lara_default_col,
|
||||
lara_default_col
|
||||
lara_default_col,
|
||||
lara_default_col,
|
||||
lara_default_col,
|
||||
lara_col_turn_left_fast,//156
|
||||
lara_default_col,//157
|
||||
};
|
||||
|
||||
void LaraControl(short itemNumber) // (AF) (D)
|
||||
|
@ -375,7 +394,9 @@ void LaraControl(short itemNumber) // (AF) (D)
|
|||
}
|
||||
|
||||
if (!DisableLaraControl)
|
||||
{
|
||||
Lara.locationPad = 128;
|
||||
}
|
||||
|
||||
int oldX = LaraItem->pos.xPos;
|
||||
int oldY = LaraItem->pos.yPos;
|
||||
|
@ -391,7 +412,9 @@ void LaraControl(short itemNumber) // (AF) (D)
|
|||
}
|
||||
|
||||
if (item->currentAnimState != LS_SPRINT && DashTimer < 120)
|
||||
{
|
||||
DashTimer++;
|
||||
}
|
||||
|
||||
Lara.isDucked = false;
|
||||
|
||||
|
@ -402,13 +425,19 @@ void LaraControl(short itemNumber) // (AF) (D)
|
|||
|
||||
int hfw;
|
||||
if (wh != NO_HEIGHT)
|
||||
{
|
||||
hfw = item->pos.yPos - wh;
|
||||
}
|
||||
else
|
||||
{
|
||||
hfw = NO_HEIGHT;
|
||||
}
|
||||
Lara.waterSurfaceDist = -hfw;
|
||||
|
||||
if (Lara.Vehicle == NO_ITEM)
|
||||
{
|
||||
WadeSplash(item, wh, wd);
|
||||
}
|
||||
|
||||
short roomNumber;
|
||||
|
||||
|
@ -430,8 +459,8 @@ void LaraControl(short itemNumber) // (AF) (D)
|
|||
}
|
||||
else if (isWater & ENV_FLAG_SWAMP)
|
||||
{
|
||||
if (item->currentAnimState == LS_SWANDIVE_START
|
||||
|| item->currentAnimState == LS_SWANDIVE_END) // Is Lara swan-diving?
|
||||
if (item->currentAnimState == LS_SWANDIVE_START ||
|
||||
item->currentAnimState == LS_SWANDIVE_END) // Is Lara swan-diving?
|
||||
item->pos.yPos = wh + 1000;
|
||||
|
||||
item->goalAnimState = LS_WADE_FORWARD;
|
||||
|
@ -453,21 +482,21 @@ void LaraControl(short itemNumber) // (AF) (D)
|
|||
|
||||
if (item->currentAnimState == LS_SWANDIVE_START)
|
||||
{
|
||||
item->pos.xRot = -ANGLE(45);
|
||||
item->pos.xRot = ANGLE(-45.0f);
|
||||
item->goalAnimState = LS_DIVE;
|
||||
AnimateLara(item);
|
||||
item->fallspeed *= 2;
|
||||
}
|
||||
else if (item->currentAnimState == LS_SWANDIVE_END)
|
||||
{
|
||||
item->pos.xRot = -ANGLE(85);
|
||||
item->pos.xRot = ANGLE(-85.0f);
|
||||
item->goalAnimState = LS_DIVE;
|
||||
AnimateLara(item);
|
||||
item->fallspeed *= 2;
|
||||
}
|
||||
else
|
||||
{
|
||||
item->pos.xRot = -ANGLE(45);
|
||||
item->pos.xRot = ANGLE(-45.0f);
|
||||
item->animNumber = LA_FREEFALL_DIVE;
|
||||
item->frameNumber = g_Level.Anims[item->animNumber].frameBase;
|
||||
item->currentAnimState = LS_DIVE;
|
||||
|
@ -483,7 +512,7 @@ void LaraControl(short itemNumber) // (AF) (D)
|
|||
Splash(LaraItem);
|
||||
}
|
||||
|
||||
Camera.targetElevation = -ANGLE(22);
|
||||
Camera.targetElevation = ANGLE(-22.0f);
|
||||
if (hfw >= 256) /* @ORIGINAL_BUG: checking hfw for equality with 256 results in the wade bug */
|
||||
{
|
||||
if (hfw > 730)
|
||||
|
@ -540,7 +569,9 @@ void LaraControl(short itemNumber) // (AF) (D)
|
|||
LaraItem->roomNumber;
|
||||
Lara.waterStatus = LW_ABOVE_WATER;
|
||||
if (item->currentAnimState == LS_WADE_FORWARD)
|
||||
{
|
||||
item->goalAnimState = LS_RUN_FORWARD;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -711,7 +742,9 @@ void LaraControl(short itemNumber) // (AF) (D)
|
|||
{
|
||||
Lara.waterStatus = LW_ABOVE_WATER;
|
||||
if (item->currentAnimState == LS_WADE_FORWARD)
|
||||
{
|
||||
item->goalAnimState = LS_RUN_FORWARD;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
@ -722,7 +755,9 @@ void LaraControl(short itemNumber) // (AF) (D)
|
|||
item->hitPoints = -1;
|
||||
|
||||
if (Lara.deathCount == 0)
|
||||
{
|
||||
S_CDStop();
|
||||
}
|
||||
|
||||
Lara.deathCount++;
|
||||
if ((LaraItem->flags & 0x100))
|
||||
|
@ -736,7 +771,7 @@ void LaraControl(short itemNumber) // (AF) (D)
|
|||
{
|
||||
case LW_ABOVE_WATER:
|
||||
case LW_WADE:
|
||||
if ((g_Level.Rooms[item->roomNumber].flags & ENV_FLAG_SWAMP)
|
||||
if ((g_Level.Rooms[item->roomNumber].flags & ENV_FLAG_SWAMP)
|
||||
&& Lara.waterSurfaceDist < -775)
|
||||
{
|
||||
if (item->hitPoints >= 0)
|
||||
|
@ -764,7 +799,9 @@ void LaraControl(short itemNumber) // (AF) (D)
|
|||
{
|
||||
Lara.air += 10;
|
||||
if (Lara.air > 1800)
|
||||
{
|
||||
Lara.air = 1800;
|
||||
}
|
||||
}
|
||||
}
|
||||
LaraAboveWater(item, &lara_coll);
|
||||
|
@ -784,7 +821,9 @@ void LaraControl(short itemNumber) // (AF) (D)
|
|||
if (Lara.air < 0)
|
||||
{
|
||||
if (LaraDrawType == LARA_DIVESUIT && Lara.anxiety < 251)
|
||||
{
|
||||
Lara.anxiety += 4;
|
||||
}
|
||||
Lara.air = -1;
|
||||
item->hitPoints -= 5;
|
||||
}
|
||||
|
@ -797,7 +836,9 @@ void LaraControl(short itemNumber) // (AF) (D)
|
|||
{
|
||||
Lara.air += 10;
|
||||
if (Lara.air > 1800)
|
||||
{
|
||||
Lara.air = 1800;
|
||||
}
|
||||
}
|
||||
LaraSurface(item, &lara_coll);
|
||||
break;
|
||||
|
@ -830,9 +871,13 @@ void LaraAboveWater(ITEM_INFO* item, COLL_INFO* coll) //hmmmm
|
|||
coll->trigger = NULL;
|
||||
|
||||
if ((TrInput & IN_LOOK) && Lara.ExtraAnim == NO_ITEM && Lara.look)
|
||||
{
|
||||
LookLeftRight();
|
||||
}
|
||||
else
|
||||
{
|
||||
ResetLook();
|
||||
}
|
||||
|
||||
Lara.look = true;
|
||||
|
||||
|
@ -891,23 +936,36 @@ void LaraAboveWater(ITEM_INFO* item, COLL_INFO* coll) //hmmmm
|
|||
// Handle current Lara status
|
||||
lara_control_routines[item->currentAnimState](item, coll);
|
||||
|
||||
if (item->pos.zRot >= -ANGLE(1.0f) && item->pos.zRot <= ANGLE(1.0f))
|
||||
if (item->pos.zRot >= ANGLE(-1.0f) && item->pos.zRot <= ANGLE(1.0f))
|
||||
{
|
||||
item->pos.zRot = 0;
|
||||
else if (item->pos.zRot < -ANGLE(1.0f))
|
||||
}
|
||||
else if (item->pos.zRot < ANGLE(-1.0f))
|
||||
{
|
||||
item->pos.zRot += ANGLE(1.0f);
|
||||
}
|
||||
else
|
||||
{
|
||||
item->pos.zRot -= ANGLE(1.0f);
|
||||
}
|
||||
|
||||
if (Lara.turnRate >= -ANGLE(2.0f) && Lara.turnRate <= ANGLE(2.0f))
|
||||
if (Lara.turnRate >= ANGLE(-2.0f) && Lara.turnRate <= ANGLE(2.0f))
|
||||
{
|
||||
Lara.turnRate = 0;
|
||||
else if (Lara.turnRate < -ANGLE(2.0f))
|
||||
}
|
||||
else if (Lara.turnRate < ANGLE(-2.0f))
|
||||
{
|
||||
Lara.turnRate += ANGLE(2.0f);
|
||||
}
|
||||
else
|
||||
{
|
||||
Lara.turnRate -= ANGLE(2.0f);
|
||||
}
|
||||
item->pos.yRot += Lara.turnRate;
|
||||
|
||||
// OLD
|
||||
// Animate Lara
|
||||
AnimateLara(item);
|
||||
//AnimateLara(item);
|
||||
|
||||
if (Lara.ExtraAnim == -1)
|
||||
{
|
||||
|
@ -916,9 +974,14 @@ void LaraAboveWater(ITEM_INFO* item, COLL_INFO* coll) //hmmmm
|
|||
|
||||
// Handle Lara collision
|
||||
if (Lara.Vehicle == NO_ITEM)
|
||||
{
|
||||
lara_collision_routines[item->currentAnimState](item, coll);
|
||||
}
|
||||
}
|
||||
|
||||
// Animate Lara after collision.
|
||||
AnimateLara(item);
|
||||
|
||||
UpdateLaraRoom(item, -LARA_HITE / 2);
|
||||
|
||||
//if (Lara.gunType == WEAPON_CROSSBOW && !LaserSight)
|
||||
|
@ -952,9 +1015,13 @@ void LaraUnderWater(ITEM_INFO* item, COLL_INFO* coll)//4BFB4, 4C418 (F)
|
|||
coll->trigger = NULL;
|
||||
|
||||
if (TrInput & IN_LOOK && Lara.look)
|
||||
{
|
||||
LookLeftRight();
|
||||
}
|
||||
else
|
||||
{
|
||||
ResetLook();
|
||||
}
|
||||
|
||||
Lara.look = true;
|
||||
|
||||
|
@ -962,7 +1029,7 @@ void LaraUnderWater(ITEM_INFO* item, COLL_INFO* coll)//4BFB4, 4C418 (F)
|
|||
|
||||
if (LaraDrawType == LARA_DIVESUIT)
|
||||
{
|
||||
if (Lara.turnRate < -ANGLE(0.5))
|
||||
if (Lara.turnRate < ANGLE(-0.5))
|
||||
{
|
||||
Lara.turnRate += ANGLE(0.5);
|
||||
}
|
||||
|
@ -975,13 +1042,13 @@ void LaraUnderWater(ITEM_INFO* item, COLL_INFO* coll)//4BFB4, 4C418 (F)
|
|||
Lara.turnRate = 0;
|
||||
}
|
||||
}
|
||||
else if (Lara.turnRate < -ANGLE(2))
|
||||
else if (Lara.turnRate < ANGLE(-2.0f))
|
||||
{
|
||||
Lara.turnRate += ANGLE(2);
|
||||
Lara.turnRate += ANGLE(2.0f);
|
||||
}
|
||||
else if (Lara.turnRate > ANGLE(2))
|
||||
else if (Lara.turnRate > ANGLE(2.0f))
|
||||
{
|
||||
Lara.turnRate -= ANGLE(2);
|
||||
Lara.turnRate -= ANGLE(2.0f);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -991,37 +1058,59 @@ void LaraUnderWater(ITEM_INFO* item, COLL_INFO* coll)//4BFB4, 4C418 (F)
|
|||
item->pos.yRot += Lara.turnRate;
|
||||
|
||||
if (LaraDrawType == LARA_DIVESUIT)
|
||||
{
|
||||
UpdateSubsuitAngles();
|
||||
}
|
||||
|
||||
if (item->pos.zRot < -ANGLE(2))
|
||||
item->pos.zRot += ANGLE(2);
|
||||
else if (item->pos.zRot > ANGLE(2))
|
||||
item->pos.zRot -= ANGLE(2);
|
||||
if (item->pos.zRot < ANGLE(-2.0f))
|
||||
{
|
||||
item->pos.zRot += ANGLE(2.0f);
|
||||
}
|
||||
else if (item->pos.zRot > ANGLE(2.0f))
|
||||
{
|
||||
item->pos.zRot -= ANGLE(2.0f);
|
||||
}
|
||||
else
|
||||
{
|
||||
item->pos.zRot = 0;
|
||||
}
|
||||
|
||||
if (item->pos.xRot < -ANGLE(85))
|
||||
item->pos.xRot = -ANGLE(85);
|
||||
else if (item->pos.xRot > ANGLE(85))
|
||||
item->pos.xRot = ANGLE(85);
|
||||
if (item->pos.xRot < ANGLE(-85.0f))
|
||||
{
|
||||
item->pos.xRot = ANGLE(-85.0f);
|
||||
}
|
||||
else if (item->pos.xRot > ANGLE(85.0f))
|
||||
{
|
||||
item->pos.xRot = ANGLE(85.0f);
|
||||
}
|
||||
|
||||
if (LaraDrawType == LARA_DIVESUIT)
|
||||
{
|
||||
if (item->pos.zRot > ANGLE(44))
|
||||
item->pos.zRot = ANGLE(44);
|
||||
else if (item->pos.zRot < -ANGLE(44))
|
||||
item->pos.zRot = -ANGLE(44);
|
||||
if (item->pos.zRot > ANGLE(44.0f))
|
||||
{
|
||||
item->pos.zRot = ANGLE(44.0f);
|
||||
}
|
||||
else if (item->pos.zRot < ANGLE(44.0f))
|
||||
{
|
||||
item->pos.zRot = ANGLE(-44.0f);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (item->pos.zRot > ANGLE(22))
|
||||
item->pos.zRot = ANGLE(22);
|
||||
else if (item->pos.zRot < -ANGLE(22))
|
||||
item->pos.zRot = -ANGLE(22);
|
||||
if (item->pos.zRot > ANGLE(22.0f))
|
||||
{
|
||||
item->pos.zRot = ANGLE(22.0f);
|
||||
}
|
||||
else if (item->pos.zRot < ANGLE(-22.0f))
|
||||
{
|
||||
item->pos.zRot = ANGLE(-22.0f);
|
||||
}
|
||||
}
|
||||
|
||||
if (Lara.currentActive && Lara.waterStatus != LW_FLYCHEAT)
|
||||
{
|
||||
LaraWaterCurrent(coll);
|
||||
}
|
||||
|
||||
AnimateLara(item);
|
||||
|
||||
|
@ -1032,7 +1121,9 @@ void LaraUnderWater(ITEM_INFO* item, COLL_INFO* coll)//4BFB4, 4C418 (F)
|
|||
LaraBaddieCollision(item, coll);
|
||||
|
||||
if (/*Lara.ExtraAnim == -1 &&*/ Lara.Vehicle == NO_ITEM)
|
||||
{
|
||||
lara_collision_routines[item->currentAnimState](item, coll);
|
||||
}
|
||||
|
||||
UpdateLaraRoom(item, 0);
|
||||
|
||||
|
@ -1043,7 +1134,7 @@ void LaraUnderWater(ITEM_INFO* item, COLL_INFO* coll)//4BFB4, 4C418 (F)
|
|||
|
||||
void LaraSurface(ITEM_INFO* item, COLL_INFO* coll)//4D684, 4DAE8 (F)
|
||||
{
|
||||
Camera.targetElevation = -ANGLE(22);
|
||||
Camera.targetElevation = ANGLE(-22.0f);
|
||||
|
||||
coll->badPos = 32512;
|
||||
coll->badNeg = -128;
|
||||
|
@ -1063,23 +1154,35 @@ void LaraSurface(ITEM_INFO* item, COLL_INFO* coll)//4D684, 4DAE8 (F)
|
|||
coll->trigger = NULL;
|
||||
|
||||
if (TrInput & IN_LOOK && Lara.look)
|
||||
{
|
||||
LookLeftRight();
|
||||
}
|
||||
else
|
||||
{
|
||||
ResetLook();
|
||||
}
|
||||
|
||||
Lara.look = true;
|
||||
|
||||
lara_control_routines[item->currentAnimState](item, coll);
|
||||
|
||||
if (item->pos.zRot >= -ANGLE(2) && item->pos.zRot <= ANGLE(2))
|
||||
if (item->pos.zRot >= ANGLE(-2.0f) && item->pos.zRot <= ANGLE(2.0f))
|
||||
{
|
||||
item->pos.zRot = 0;
|
||||
}
|
||||
else if (item->pos.zRot < 0)
|
||||
item->pos.zRot += ANGLE(2);
|
||||
{
|
||||
item->pos.zRot += ANGLE(2.0f);
|
||||
}
|
||||
else
|
||||
item->pos.zRot -= ANGLE(2);
|
||||
{
|
||||
item->pos.zRot -= ANGLE(2.0f);
|
||||
}
|
||||
|
||||
if (Lara.currentActive && Lara.waterStatus != LW_FLYCHEAT)
|
||||
{
|
||||
LaraWaterCurrent(coll);
|
||||
}
|
||||
|
||||
AnimateLara(item);
|
||||
|
||||
|
@ -1089,7 +1192,9 @@ void LaraSurface(ITEM_INFO* item, COLL_INFO* coll)//4D684, 4DAE8 (F)
|
|||
LaraBaddieCollision(item, coll);
|
||||
|
||||
if (Lara.Vehicle == NO_ITEM)
|
||||
{
|
||||
lara_collision_routines[item->currentAnimState](item, coll);
|
||||
}
|
||||
|
||||
UpdateLaraRoom(item, 100);
|
||||
|
||||
|
@ -1232,7 +1337,6 @@ void AnimateLara(ITEM_INFO* item)
|
|||
|
||||
default:
|
||||
break;
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1253,10 +1357,14 @@ void AnimateLara(ITEM_INFO* item)
|
|||
item->gravityStatus = false;
|
||||
}
|
||||
if (item->fallspeed > 128)
|
||||
{
|
||||
item->fallspeed >>= 1;
|
||||
}
|
||||
item->fallspeed -= item->fallspeed >> 2;
|
||||
if (item->fallspeed < 4)
|
||||
{
|
||||
item->fallspeed = 4;
|
||||
}
|
||||
item->pos.yPos += item->fallspeed;
|
||||
}
|
||||
else
|
||||
|
@ -1276,28 +1384,34 @@ void AnimateLara(ITEM_INFO* item)
|
|||
{
|
||||
velocity = (anim->velocity >> 1);
|
||||
if (anim->acceleration)
|
||||
{
|
||||
velocity += (anim->acceleration * (item->frameNumber - anim->frameBase)) >> 2;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
velocity = anim->velocity;
|
||||
if (anim->acceleration)
|
||||
{
|
||||
velocity += anim->acceleration * (item->frameNumber - anim->frameBase);
|
||||
}
|
||||
}
|
||||
|
||||
item->speed = velocity >> 16;
|
||||
}
|
||||
|
||||
if (Lara.ropePtr != -1)
|
||||
{
|
||||
DelAlignLaraToRope(item);
|
||||
}
|
||||
|
||||
if (!Lara.isMoving) // TokyoSU: i dont know why but it's wreid, in TR3 only the 2 first line there is used and worked fine !
|
||||
{
|
||||
item->pos.xPos += item->speed * phd_sin(item->pos.yRot + Lara.moveAngle) >> W2V_SHIFT;
|
||||
item->pos.zPos += item->speed * phd_cos(item->pos.yRot + Lara.moveAngle) >> W2V_SHIFT;
|
||||
|
||||
item->pos.xPos += lateral * phd_sin(item->pos.yRot + Lara.moveAngle + ANGLE(90)) >> W2V_SHIFT;
|
||||
item->pos.zPos += lateral * phd_cos(item->pos.yRot + Lara.moveAngle + ANGLE(90)) >> W2V_SHIFT;
|
||||
item->pos.xPos += lateral * phd_sin(item->pos.yRot + Lara.moveAngle + ANGLE(90.0f)) >> W2V_SHIFT;
|
||||
item->pos.zPos += lateral * phd_cos(item->pos.yRot + Lara.moveAngle + ANGLE(90.0f)) >> W2V_SHIFT;
|
||||
}
|
||||
|
||||
// Update matrices
|
||||
|
|
|
@ -20,6 +20,12 @@ extern ITEM_INFO* LaraItem;
|
|||
extern COLL_INFO lara_coll;
|
||||
extern byte LaraNodeUnderwater[NUM_LARA_MESHES];
|
||||
|
||||
// For later.
|
||||
extern bool EnableActionToggle;
|
||||
extern bool EnableJumpUpAlign;
|
||||
extern bool EnableClimbAssist;
|
||||
extern bool EnableSafetyDrop;
|
||||
|
||||
#define LARA_MESHES(slot, mesh) Lara.meshPtrs[mesh] = MESHES(slot, mesh)
|
||||
#define CHECK_LARA_MESHES(slot, mesh) Lara.meshPtrs[mesh] == MESHES(slot, mesh)
|
||||
#define INIT_LARA_MESHES(mesh, to, from) Lara.meshPtrs[mesh] = LARA_MESHES(to, mesh) = LARA_MESHES(from, mesh)
|
||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -1,71 +1,76 @@
|
|||
#pragma once
|
||||
#include "lara_struct.h"
|
||||
|
||||
/*generic functions*/
|
||||
// Auxiliary functions.
|
||||
bool TestLaraStepDown(COLL_INFO* coll);
|
||||
bool TestLaraStepUp(COLL_INFO* coll);
|
||||
void DoLaraStep(ITEM_INFO* item, COLL_INFO* coll);
|
||||
|
||||
// General control & collision functions.
|
||||
void lara_void_func(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_default_col(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_as_special(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_as_null(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_as_controlled(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_as_controlledl(ITEM_INFO* item, COLL_INFO* coll);
|
||||
/*end generic functions*/
|
||||
/*-*/
|
||||
/*basic movement*/
|
||||
void lara_as_walk(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_col_walk(ITEM_INFO* item, COLL_INFO* coll);
|
||||
|
||||
// Basic movement control & collision functions.
|
||||
void lara_as_walk_forward(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_col_walk_forward(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_as_run(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_col_run(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_as_stop(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_col_stop(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_as_forwardjump(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_col_forwardjump(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_as_jump_forward(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_col_jump_forward(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_col_pose(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_as_fastback(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_col_fastback(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_as_turn_r(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_col_turn_r(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_as_turn_l(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_col_turn_l(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_as_hop_back(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_col_hop_back(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_as_turn_right(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_col_turn_right(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_as_turn_left(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_col_turn_left(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_as_death(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_col_death(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_as_fastfall(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_col_fastfall(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_as_freefall(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_col_freefall(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_as_reach(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_col_reach(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_as_splat(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_col_splat(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_col_land(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_as_compress(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_col_compress(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_as_back(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_col_back(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_as_fastturn(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_col_fastturn(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_as_stepright(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_col_stepright(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_as_stepleft(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_col_stepleft(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_as_jump_prepare(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_col_jump_prepare(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_as_walk_back(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_col_walk_back(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_as_turn_right_fast(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_col_turn_right_fast(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_as_turn_left_fast(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_col_turn_left_fast(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_as_step_right(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_col_step_right(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_as_step_left(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_col_step_left(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_col_roll2(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_as_backjump(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_col_backjump(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_as_rightjump(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_col_rightjump(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_as_leftjump(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_col_leftjump(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_col_jumper(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_as_upjump(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_col_upjump(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_as_fallback(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_col_fallback(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_as_jump_back(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_col_jump_back(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_as_jump_right(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_col_jump_right(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_as_jump_left(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_col_jump_left(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_col_jump(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_as_jump_up(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_col_jump_up(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_as_fall_back(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_col_fall_back(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_col_roll(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_as_swandive(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_col_swandive(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_as_fastdive(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_col_fastdive(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_as_swandive_start(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_col_swandive_start(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_as_swandive_freefall(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_col_swandive_freefall(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_as_gymnast(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_as_wade(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_col_wade(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_as_dash(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_col_dash(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_as_dashdive(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_col_dashdive(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_as_sprint(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_col_sprint(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_as_sprint_roll(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_col_sprint_roll(ITEM_INFO* item, COLL_INFO* coll);
|
||||
|
|
|
@ -7,34 +7,37 @@
|
|||
#include "effect2.h"
|
||||
#include "sound.h"
|
||||
|
||||
|
||||
extern GameFlow* g_GameFlow;
|
||||
int NoCheatCounter;
|
||||
|
||||
void lara_as_swimcheat(ITEM_INFO* item, COLL_INFO* coll)//4C3A8, 4C80C (F)
|
||||
void lara_as_swim_cheat(ITEM_INFO* item, COLL_INFO* coll)//4C3A8, 4C80C (F)
|
||||
{
|
||||
if (TrInput & IN_FORWARD)
|
||||
{
|
||||
item->pos.xRot -= ANGLE(3);
|
||||
item->pos.xRot -= ANGLE(3.0f);
|
||||
}
|
||||
else if (TrInput & IN_BACK)
|
||||
{
|
||||
item->pos.xRot += ANGLE(3);
|
||||
item->pos.xRot += ANGLE(3.0f);
|
||||
}
|
||||
|
||||
if (TrInput & IN_LEFT)
|
||||
{
|
||||
Lara.turnRate -= 613;
|
||||
|
||||
if (Lara.turnRate < -ANGLE(6))
|
||||
Lara.turnRate = -ANGLE(6);
|
||||
if (Lara.turnRate < ANGLE(-6.0f))
|
||||
{
|
||||
Lara.turnRate = ANGLE(-6.0f);
|
||||
}
|
||||
}
|
||||
else if (TrInput & IN_RIGHT)
|
||||
{
|
||||
Lara.turnRate += 613;
|
||||
|
||||
if (Lara.turnRate > ANGLE(6))
|
||||
Lara.turnRate = ANGLE(6);
|
||||
if (Lara.turnRate > ANGLE(6.0f))
|
||||
{
|
||||
Lara.turnRate = ANGLE(6.0f);
|
||||
}
|
||||
}
|
||||
|
||||
if (TrInput & IN_ACTION)
|
||||
|
@ -44,7 +47,7 @@ void lara_as_swimcheat(ITEM_INFO* item, COLL_INFO* coll)//4C3A8, 4C80C (F)
|
|||
|
||||
if (TrInput & IN_OPTION)
|
||||
{
|
||||
Lara.turnRate = -ANGLE(12);
|
||||
Lara.turnRate = ANGLE(-12.0f);
|
||||
}
|
||||
|
||||
if (TrInput & IN_JUMP)
|
||||
|
@ -52,14 +55,20 @@ void lara_as_swimcheat(ITEM_INFO* item, COLL_INFO* coll)//4C3A8, 4C80C (F)
|
|||
item->fallspeed += 16;
|
||||
|
||||
if (item->fallspeed > 400)
|
||||
{
|
||||
item->fallspeed = 400;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (item->fallspeed >= 8)
|
||||
{
|
||||
item->fallspeed -= item->fallspeed >> 3;
|
||||
}
|
||||
else
|
||||
{
|
||||
item->fallspeed = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -71,10 +80,9 @@ void LaraCheatyBits() // (F) (D)
|
|||
{
|
||||
if (Lara.Vehicle == NO_ITEM)
|
||||
{
|
||||
|
||||
LaraCheatGetStuff();
|
||||
|
||||
DelsGiveLaraItemsCheat();
|
||||
GiveLaraItemsCheat();
|
||||
|
||||
LaraItem->pos.yPos -= 128;
|
||||
|
||||
|
@ -105,7 +113,9 @@ void LaraCheatyBits() // (F) (D)
|
|||
}
|
||||
}
|
||||
if (NoCheatCounter)
|
||||
{
|
||||
NoCheatCounter--;
|
||||
}
|
||||
}
|
||||
|
||||
void LaraCheatGetStuff() // (F) (D)
|
||||
|
@ -115,10 +125,14 @@ void LaraCheatGetStuff() // (F) (D)
|
|||
Lara.NumLargeMedipacks = -1;
|
||||
|
||||
if (Objects[ID_CROWBAR_ITEM].loaded)
|
||||
{
|
||||
Lara.Crowbar = true;
|
||||
}
|
||||
|
||||
if (Objects[ID_LASERSIGHT_ITEM].loaded)
|
||||
{
|
||||
Lara.Lasersight = true;
|
||||
}
|
||||
|
||||
if (Objects[ID_REVOLVER_ITEM].loaded)
|
||||
{
|
||||
|
@ -198,7 +212,7 @@ void LaraCheatGetStuff() // (F) (D)
|
|||
g_Inventory.LoadObjects(false);
|
||||
}
|
||||
|
||||
void DelsGiveLaraItemsCheat() // (AF) (D)
|
||||
void GiveLaraItemsCheat() // (AF) (D)
|
||||
{
|
||||
int i;
|
||||
|
||||
|
|
|
@ -1,7 +1,6 @@
|
|||
#pragma once
|
||||
|
||||
|
||||
void lara_as_swimcheat(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_as_swim_cheat(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void LaraCheatyBits();
|
||||
void LaraCheatGetStuff();
|
||||
void DelsGiveLaraItemsCheat();
|
||||
void GiveLaraItemsCheat();
|
||||
|
|
|
@ -8,6 +8,12 @@
|
|||
#include "level.h"
|
||||
#include "input.h"
|
||||
|
||||
// LADDER CLIMBING
|
||||
|
||||
// ------------------------------
|
||||
// Auxiliary Functions
|
||||
// ------------------------------
|
||||
|
||||
short LeftIntRightExtTab[4] = // offset 0xA0B7C
|
||||
{
|
||||
0x0800, 0x0100, 0x0200, 0x0400
|
||||
|
@ -37,25 +43,106 @@ short GetClimbTrigger(int x, int y, int z, short roomNumber) // (F) (D)
|
|||
return (*data & DATA_TYPE) == CLIMB_TYPE ? *data : 0;
|
||||
}
|
||||
|
||||
void lara_col_climbend(ITEM_INFO* item, COLL_INFO* coll)//46E30(<), 47294(<) (F)
|
||||
bool TestLaraLetGo(ITEM_INFO* item)
|
||||
{
|
||||
return;
|
||||
if (((TrInput & IN_ACTION && !EnableActionToggle) ||
|
||||
(!(TrInput & IN_ACTION) && EnableActionToggle)) && // TODO: Instead, check if button has been RELEASED.
|
||||
item->hitPoints > 0)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void SetLaraLetGo(ITEM_INFO* item, COLL_INFO* coll)
|
||||
{
|
||||
item->gravityStatus = false;
|
||||
item->fallspeed = 0;
|
||||
|
||||
short roomNumber = item->roomNumber;
|
||||
FLOOR_INFO* floor = GetFloor(item->pos.xPos, item->pos.yPos, item->pos.zPos, &roomNumber);
|
||||
GetFloorHeight(floor, item->pos.xPos, item->pos.yPos, item->pos.zPos);
|
||||
|
||||
Lara.gunStatus = LG_NO_ARMS;
|
||||
Lara.torsoYrot = 0;
|
||||
Lara.torsoXrot = 0;
|
||||
Lara.headYrot = 0;
|
||||
Lara.headXrot = 0;
|
||||
|
||||
item->goalAnimState = LS_JUMP_FORWARD;
|
||||
item->currentAnimState = LS_JUMP_FORWARD;
|
||||
item->animNumber = LA_FALL_START;
|
||||
item->frameNumber = g_Level.Anims[item->animNumber].frameBase;
|
||||
item->speed = 2;
|
||||
item->gravityStatus = true;
|
||||
item->fallspeed = 1;
|
||||
|
||||
coll->trigger = TriggerIndex;
|
||||
}
|
||||
|
||||
// TODO: delete.
|
||||
int LaraCheckForLetGo(ITEM_INFO* item, COLL_INFO* coll)//45434, 45898 (F)
|
||||
{
|
||||
short roomNumber = item->roomNumber;
|
||||
|
||||
item->gravityStatus = false;
|
||||
item->fallspeed = 0;
|
||||
|
||||
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 && item->hitPoints > 0)
|
||||
return 0;
|
||||
|
||||
Lara.torsoYrot = 0;
|
||||
Lara.torsoXrot = 0;
|
||||
|
||||
Lara.headYrot = 0;
|
||||
Lara.headXrot = 0;
|
||||
|
||||
item->goalAnimState = LS_JUMP_FORWARD;
|
||||
item->currentAnimState = LS_JUMP_FORWARD;
|
||||
item->animNumber = LA_FALL_START;
|
||||
item->frameNumber = g_Level.Anims[item->animNumber].frameBase;
|
||||
|
||||
item->speed = 2;
|
||||
item->gravityStatus = true;
|
||||
item->fallspeed = 1;
|
||||
|
||||
Lara.gunStatus = LG_NO_ARMS;
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
// ------------------------------
|
||||
// LADDER CLIMBING
|
||||
// State & Collision Functions
|
||||
// ------------------------------
|
||||
|
||||
void lara_as_climbend(ITEM_INFO* item, COLL_INFO* coll)//46DF8(<), 4725C(<) (F)
|
||||
{
|
||||
coll->enableBaddiePush = false;
|
||||
coll->enableSpaz = false;
|
||||
|
||||
Camera.flags = CF_FOLLOW_CENTER;
|
||||
Camera.targetAngle = -ANGLE(45);
|
||||
Camera.targetAngle = ANGLE(-45.0f);
|
||||
}
|
||||
|
||||
void lara_col_climbend(ITEM_INFO* item, COLL_INFO* coll)//46E30(<), 47294(<) (F)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
void lara_col_climbdown(ITEM_INFO* item, COLL_INFO* coll)//46BD0, 47034 (F)
|
||||
{
|
||||
if (LaraCheckForLetGo(item, coll)
|
||||
|| item->animNumber != LA_LADDER_DOWN)
|
||||
if (TestLaraLetGo(item) || item->animNumber != LA_LADDER_DOWN)
|
||||
{
|
||||
SetLaraLetGo(item, coll);
|
||||
return;
|
||||
}
|
||||
|
||||
int frame = item->frameNumber - g_Level.Anims[LA_LADDER_DOWN].frameBase;
|
||||
int xShift;
|
||||
|
@ -214,10 +301,10 @@ void lara_col_climbing(ITEM_INFO* item, COLL_INFO* coll)//469B0, 46E14 (F)
|
|||
|
||||
void lara_as_climbing(ITEM_INFO* item, COLL_INFO* coll)//46984(<), 46DE8(<) (F)
|
||||
{
|
||||
Camera.targetElevation = ANGLE(30.0f);
|
||||
|
||||
coll->enableBaddiePush = false;
|
||||
coll->enableSpaz = false;
|
||||
|
||||
Camera.targetElevation = ANGLE(30);
|
||||
}
|
||||
|
||||
void lara_col_climbright(ITEM_INFO* item, COLL_INFO* coll)//46908(<), 46D6C(<) (F)
|
||||
|
@ -235,8 +322,8 @@ void lara_as_climbright(ITEM_INFO* item, COLL_INFO* coll)//468B8(<), 46D1C(<) (F
|
|||
coll->enableBaddiePush = false;
|
||||
coll->enableSpaz = false;
|
||||
|
||||
Camera.targetAngle = ANGLE(30);
|
||||
Camera.targetElevation = -ANGLE(15);
|
||||
Camera.targetAngle = ANGLE(30.0f);
|
||||
Camera.targetElevation = ANGLE(-15.0f);
|
||||
|
||||
if (!(TrInput & (IN_RIGHT | IN_RSTEP)))
|
||||
item->goalAnimState = LS_LADDER_IDLE;
|
||||
|
@ -247,7 +334,7 @@ void lara_col_climbleft(ITEM_INFO* item, COLL_INFO* coll)//46834(<), 46C98(<) (F
|
|||
if (!LaraCheckForLetGo(item, coll))
|
||||
{
|
||||
int shift = 0;
|
||||
Lara.moveAngle = -ANGLE(90);
|
||||
Lara.moveAngle = ANGLE(90.0f);
|
||||
LaraDoClimbLeftRight(item, coll, LaraTestClimbPos(item, coll->radius, -(coll->radius + 120), -512, 512, &shift), shift);
|
||||
}
|
||||
}
|
||||
|
@ -257,8 +344,8 @@ void lara_as_climbleft(ITEM_INFO* item, COLL_INFO* coll)//467E4(<), 46C48(<) (F)
|
|||
coll->enableBaddiePush = false;
|
||||
coll->enableSpaz = false;
|
||||
|
||||
Camera.targetAngle = -ANGLE(30);
|
||||
Camera.targetElevation = -ANGLE(15);
|
||||
Camera.targetAngle = ANGLE(30.0f);
|
||||
Camera.targetElevation = ANGLE(15.0f);
|
||||
|
||||
if (!(TrInput & (IN_LEFT | IN_LSTEP)))
|
||||
item->goalAnimState = LS_LADDER_IDLE;
|
||||
|
@ -277,10 +364,14 @@ void lara_col_climbstnc(ITEM_INFO* item, COLL_INFO* coll) // (F) (D)
|
|||
if (!(TrInput & IN_FORWARD))
|
||||
{
|
||||
if (!(TrInput & IN_BACK))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if (item->goalAnimState == LS_HANG)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
item->goalAnimState = LS_LADDER_IDLE;
|
||||
item->pos.yPos += 256;
|
||||
|
@ -291,16 +382,22 @@ void lara_col_climbstnc(ITEM_INFO* item, COLL_INFO* coll) // (F) (D)
|
|||
item->pos.yPos -= 256;
|
||||
|
||||
if (!resultRight || !resultLeft || resultLeft == -2 || resultRight == -2)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
yShift = ledgeLeft;
|
||||
|
||||
if (ledgeRight && ledgeLeft)
|
||||
{
|
||||
if (ledgeLeft < 0 != ledgeRight < 0)
|
||||
{
|
||||
return;
|
||||
}
|
||||
if (ledgeRight < 0 == ledgeRight < ledgeLeft)
|
||||
{
|
||||
yShift = ledgeRight;
|
||||
}
|
||||
}
|
||||
|
||||
if (resultRight == 1 && resultLeft == 1)
|
||||
|
@ -320,7 +417,9 @@ void lara_col_climbstnc(ITEM_INFO* item, COLL_INFO* coll) // (F) (D)
|
|||
resultLeft = LaraTestClimbUpPos(item, coll->radius, -120 - coll->radius, &shiftLeft, &ledgeLeft);
|
||||
|
||||
if (!resultRight || !resultLeft)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if (resultRight >= 0 && resultLeft >= 0)
|
||||
{
|
||||
|
@ -367,12 +466,16 @@ void lara_as_climbstnc(ITEM_INFO* item, COLL_INFO* coll)//463F0, 46854 (F)
|
|||
coll->enableSpaz = false;
|
||||
coll->enableBaddiePush = false;
|
||||
|
||||
Camera.targetElevation = -ANGLE(20);
|
||||
Camera.targetElevation = ANGLE(-20.0f);
|
||||
|
||||
if (item->animNumber == LA_LADDER_DISMOUNT_LEFT_START)
|
||||
Camera.targetAngle = -ANGLE(60.0f);
|
||||
{
|
||||
Camera.targetAngle = ANGLE(-60.0f);
|
||||
}
|
||||
if (item->animNumber == LA_LADDER_DISMOUNT_RIGHT_START)
|
||||
{
|
||||
Camera.targetAngle = ANGLE(60.0f);
|
||||
}
|
||||
|
||||
if (TrInput & IN_LOOK)
|
||||
{
|
||||
|
@ -382,12 +485,12 @@ void lara_as_climbstnc(ITEM_INFO* item, COLL_INFO* coll)//463F0, 46854 (F)
|
|||
if (TrInput & IN_LEFT || TrInput & IN_LSTEP)
|
||||
{
|
||||
item->goalAnimState = LS_LADDER_LEFT;
|
||||
Lara.moveAngle = -ANGLE(90);
|
||||
Lara.moveAngle = ANGLE(-90.0f);
|
||||
}
|
||||
else if (TrInput & IN_RIGHT || TrInput & IN_RSTEP)
|
||||
{
|
||||
item->goalAnimState = LS_LADDER_RIGHT;
|
||||
Lara.moveAngle = ANGLE(90);
|
||||
Lara.moveAngle = ANGLE(90.0f);
|
||||
}
|
||||
else if (TrInput & IN_JUMP)
|
||||
{
|
||||
|
@ -405,8 +508,8 @@ void lara_as_stepoff_left(ITEM_INFO* item, COLL_INFO* coll)
|
|||
coll->enableBaddiePush = false;
|
||||
coll->enableSpaz = false;
|
||||
|
||||
Camera.targetAngle = -ANGLE(60.0f);
|
||||
Camera.targetElevation = -ANGLE(15.0f);
|
||||
Camera.targetAngle = ANGLE(-60.0f);
|
||||
Camera.targetElevation = ANGLE(-15.0f);
|
||||
|
||||
item->pos.yRot -= ANGLE(90.0f);
|
||||
}
|
||||
|
@ -417,7 +520,7 @@ void lara_as_stepoff_right(ITEM_INFO* item, COLL_INFO* coll)
|
|||
coll->enableSpaz = false;
|
||||
|
||||
Camera.targetAngle = ANGLE(60.0f);
|
||||
Camera.targetElevation = -ANGLE(15.0f);
|
||||
Camera.targetElevation = ANGLE(-15.0f);
|
||||
|
||||
item->pos.yRot += ANGLE(90.0f);
|
||||
}
|
||||
|
@ -626,7 +729,7 @@ int LaraClimbRightCornerTest(ITEM_INFO* item, COLL_INFO* coll)//45DE4, 46248
|
|||
Lara.cornerX = x;
|
||||
item->pos.zPos = z;
|
||||
Lara.cornerZ = z;
|
||||
item->pos.yRot += ANGLE(90);
|
||||
item->pos.yRot += ANGLE(90.0f);
|
||||
Lara.moveAngle = 0;
|
||||
|
||||
result = LaraTestClimbPos(item, coll->radius, coll->radius + 120, -512, 512, &shift);
|
||||
|
@ -672,7 +775,7 @@ int LaraClimbRightCornerTest(ITEM_INFO* item, COLL_INFO* coll)//45DE4, 46248
|
|||
Lara.cornerX = newX;
|
||||
item->pos.zPos = newZ;
|
||||
Lara.cornerZ = newZ;
|
||||
item->pos.yRot -= ANGLE(90);
|
||||
item->pos.yRot -= ANGLE(90.0f);
|
||||
Lara.moveAngle = 0;
|
||||
result = LaraTestClimbPos(item, coll->radius, coll->radius + 120, -512, 512, &shift) != 0;
|
||||
}
|
||||
|
@ -724,7 +827,7 @@ int LaraClimbLeftCornerTest(ITEM_INFO* item, COLL_INFO* coll)//45ABC, 45F20
|
|||
Lara.cornerX = x;
|
||||
item->pos.zPos = z;
|
||||
Lara.cornerZ = z;
|
||||
item->pos.yRot -= ANGLE(90);
|
||||
item->pos.yRot -= ANGLE(90.0f);
|
||||
Lara.moveAngle = 0;
|
||||
|
||||
result = LaraTestClimbPos(item, coll->radius, -coll->radius - 120, -512, 512, &shift);
|
||||
|
@ -771,7 +874,7 @@ int LaraClimbLeftCornerTest(ITEM_INFO* item, COLL_INFO* coll)//45ABC, 45F20
|
|||
Lara.cornerX = newX;
|
||||
item->pos.zPos = newZ;
|
||||
Lara.cornerZ = newZ;
|
||||
item->pos.yRot += ANGLE(90);
|
||||
item->pos.yRot += ANGLE(90.0f);
|
||||
Lara.moveAngle = 0;
|
||||
item->itemFlags[3] = LaraTestClimbPos(item, coll->radius, -coll->radius - 120, -512, 512, &shift);
|
||||
result = item->itemFlags[3] != 0;
|
||||
|
@ -792,7 +895,6 @@ int LaraClimbLeftCornerTest(ITEM_INFO* item, COLL_INFO* coll)//45ABC, 45F20
|
|||
|
||||
int LaraTestClimb(int x, int y, int z, int xFront, int zFront, int itemHeight, int itemRoom, int* shift)//457F0, 45C54
|
||||
{
|
||||
|
||||
*shift = 0;
|
||||
int hang = 1;
|
||||
if (!Lara.climbStatus)
|
||||
|
@ -986,38 +1088,3 @@ int LaraTestClimbUpPos(ITEM_INFO* item, int front, int right, int* shift, int* l
|
|||
|
||||
return -2;
|
||||
}
|
||||
|
||||
int LaraCheckForLetGo(ITEM_INFO* item, COLL_INFO* coll)//45434, 45898 (F)
|
||||
{
|
||||
short roomNumber = item->roomNumber;
|
||||
|
||||
item->gravityStatus = false;
|
||||
item->fallspeed = 0;
|
||||
|
||||
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 && item->hitPoints > 0)
|
||||
return 0;
|
||||
|
||||
Lara.torsoYrot = 0;
|
||||
Lara.torsoXrot = 0;
|
||||
|
||||
Lara.headYrot = 0;
|
||||
Lara.headXrot = 0;
|
||||
|
||||
item->goalAnimState = LS_JUMP_FORWARD;
|
||||
item->currentAnimState = LS_JUMP_FORWARD;
|
||||
item->animNumber = LA_FALL_START;
|
||||
item->frameNumber = g_Level.Anims[item->animNumber].frameBase;
|
||||
|
||||
item->speed = 2;
|
||||
item->gravityStatus = true;
|
||||
item->fallspeed = 1;
|
||||
|
||||
Lara.gunStatus = LG_NO_ARMS;
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
|
|
@ -4,9 +4,53 @@
|
|||
#include "draw.h"
|
||||
#include "effect2.h"
|
||||
|
||||
/*this file has all the generic **collision** test functions called in lara's state code*/
|
||||
// Generic collision test functions
|
||||
|
||||
int LaraDeflectEdge(ITEM_INFO* item, COLL_INFO* coll) // (F) (D)
|
||||
bool TestLaraWallDeflect(COLL_INFO* coll)
|
||||
{
|
||||
if (coll->collType == CT_FRONT ||
|
||||
coll->collType == CT_TOP_FRONT ||
|
||||
coll->collType == CT_LEFT ||
|
||||
coll->collType == CT_RIGHT)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
// TODO: For statics?
|
||||
void SetLaraWallDeflect(ITEM_INFO* item, COLL_INFO* coll)
|
||||
{
|
||||
switch (coll->collType)
|
||||
{
|
||||
case CT_FRONT:
|
||||
case CT_TOP_FRONT:
|
||||
{
|
||||
ShiftItem(item, coll);
|
||||
|
||||
item->goalAnimState = LS_STOP;
|
||||
item->speed = 0;
|
||||
item->gravityStatus = false;
|
||||
break;
|
||||
}
|
||||
case CT_LEFT:
|
||||
{
|
||||
ShiftItem(item, coll);
|
||||
item->pos.yRot += ANGLE(5.0f);
|
||||
break;
|
||||
}
|
||||
case CT_RIGHT:
|
||||
{
|
||||
ShiftItem(item, coll);
|
||||
item->pos.yRot -= ANGLE(5.0f);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Legacy function.
|
||||
bool LaraDeflectEdge(ITEM_INFO* item, COLL_INFO* coll) // (F) (D)
|
||||
{
|
||||
if (coll->collType == CT_FRONT || coll->collType == CT_TOP_FRONT)
|
||||
{
|
||||
|
@ -16,7 +60,7 @@ int LaraDeflectEdge(ITEM_INFO* item, COLL_INFO* coll) // (F) (D)
|
|||
item->speed = 0;
|
||||
item->gravityStatus = false;
|
||||
|
||||
return 1;
|
||||
return true;
|
||||
}
|
||||
|
||||
if (coll->collType == CT_LEFT)
|
||||
|
@ -30,7 +74,7 @@ int LaraDeflectEdge(ITEM_INFO* item, COLL_INFO* coll) // (F) (D)
|
|||
item->pos.yRot -= ANGLE(5.0f);
|
||||
}
|
||||
|
||||
return 0;
|
||||
return false;
|
||||
}
|
||||
|
||||
void LaraDeflectEdgeJump(ITEM_INFO* item, COLL_INFO* coll)//12904, 129B4 (F)
|
||||
|
@ -49,7 +93,6 @@ void LaraDeflectEdgeJump(ITEM_INFO* item, COLL_INFO* coll)//12904, 129B4 (F)
|
|||
{
|
||||
item->goalAnimState = LS_GRAB_TO_FALL;
|
||||
item->currentAnimState = LS_GRAB_TO_FALL;
|
||||
|
||||
item->animNumber = LA_JUMP_UP_LAND;
|
||||
item->frameNumber = g_Level.Anims[LA_JUMP_UP_LAND].frameBase;
|
||||
}
|
||||
|
@ -58,7 +101,6 @@ void LaraDeflectEdgeJump(ITEM_INFO* item, COLL_INFO* coll)//12904, 129B4 (F)
|
|||
{
|
||||
item->goalAnimState = LS_FREEFALL;
|
||||
item->currentAnimState = LS_FREEFALL;
|
||||
|
||||
item->animNumber = LA_JUMP_WALL_SMASH_START;
|
||||
item->frameNumber = g_Level.Anims[LA_JUMP_WALL_SMASH_START].frameBase + 1;
|
||||
}
|
||||
|
@ -67,7 +109,9 @@ void LaraDeflectEdgeJump(ITEM_INFO* item, COLL_INFO* coll)//12904, 129B4 (F)
|
|||
Lara.moveAngle += ANGLE(180);
|
||||
|
||||
if (item->fallspeed <= 0)
|
||||
{
|
||||
item->fallspeed = 1;
|
||||
}
|
||||
}
|
||||
|
||||
break;
|
||||
|
@ -96,33 +140,35 @@ void LaraDeflectEdgeJump(ITEM_INFO* item, COLL_INFO* coll)//12904, 129B4 (F)
|
|||
}
|
||||
}
|
||||
|
||||
int LaraDeflectEdgeDuck(ITEM_INFO* item, COLL_INFO* coll) // (F) (D)
|
||||
bool TestLaraHitCeiling(COLL_INFO* coll)
|
||||
{
|
||||
if (coll->collType == CT_FRONT || coll->collType == CT_TOP_FRONT)
|
||||
if (coll->collType == CT_TOP ||
|
||||
coll->collType == CT_CLAMP)
|
||||
{
|
||||
ShiftItem(item, coll);
|
||||
|
||||
item->gravityStatus = false;
|
||||
item->speed = 0;
|
||||
|
||||
return 1;
|
||||
return true;
|
||||
}
|
||||
|
||||
if (coll->collType == CT_LEFT)
|
||||
{
|
||||
ShiftItem(item, coll);
|
||||
item->pos.yRot += ANGLE(2.0f);
|
||||
}
|
||||
else if (coll->collType == CT_RIGHT)
|
||||
{
|
||||
ShiftItem(item, coll);
|
||||
item->pos.yRot -= ANGLE(2.0f);
|
||||
}
|
||||
|
||||
return 0;
|
||||
return false;
|
||||
}
|
||||
|
||||
int LaraHitCeiling(ITEM_INFO* item, COLL_INFO* coll) // (F) (D)
|
||||
// TODO: Better handling of collision with ceiling when on ground. This function should become obsolete.
|
||||
void SetLaraHitCeiling(ITEM_INFO* item, COLL_INFO* coll)
|
||||
{
|
||||
item->pos.xPos = coll->old.x;
|
||||
item->pos.yPos = coll->old.y;
|
||||
item->pos.zPos = coll->old.z;
|
||||
|
||||
/*item->goalAnimState = LS_STOP;
|
||||
item->currentAnimState = LS_STOP;
|
||||
item->animNumber = LA_STAND_SOLID;
|
||||
item->frameNumber = g_Level.Anims[item->animNumber].frameBase;*/
|
||||
|
||||
item->speed = 0;
|
||||
item->fallspeed = 0;// -item->fallspeed;
|
||||
}
|
||||
|
||||
// Legacy function.
|
||||
bool LaraHitCeiling(ITEM_INFO* item, COLL_INFO* coll) // (F) (D)
|
||||
{
|
||||
if (coll->collType == CT_TOP || coll->collType == CT_CLAMP)
|
||||
{
|
||||
|
@ -140,9 +186,9 @@ int LaraHitCeiling(ITEM_INFO* item, COLL_INFO* coll) // (F) (D)
|
|||
item->fallspeed = 0;
|
||||
item->gravityStatus = false;
|
||||
|
||||
return 1;
|
||||
return true;
|
||||
}
|
||||
return 0;
|
||||
return false;
|
||||
}
|
||||
|
||||
void LaraCollideStop(ITEM_INFO* item, COLL_INFO* coll)//126F0(<), 127A0(<) (F)
|
||||
|
@ -152,7 +198,8 @@ void LaraCollideStop(ITEM_INFO* item, COLL_INFO* coll)//126F0(<), 127A0(<) (F)
|
|||
case LS_STOP:
|
||||
case LS_TURN_RIGHT_SLOW:
|
||||
case LS_TURN_LEFT_SLOW:
|
||||
case LS_TURN_FAST:
|
||||
case LS_TURN_RIGHT_FAST:
|
||||
case LS_TURN_LEFT_FAST:
|
||||
item->currentAnimState = coll->oldAnimState;
|
||||
item->animNumber = coll->oldAnimNumber;
|
||||
item->frameNumber = coll->oldFrameNumber;
|
||||
|
|
|
@ -1,11 +1,15 @@
|
|||
#pragma once
|
||||
#include "lara_struct.h"
|
||||
|
||||
int LaraDeflectEdge(ITEM_INFO* item, COLL_INFO* coll);
|
||||
bool LaraDeflectEdge(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void LaraDeflectEdgeJump(ITEM_INFO* item, COLL_INFO* coll);
|
||||
int LaraDeflectEdgeDuck(ITEM_INFO* item, COLL_INFO* coll);
|
||||
int LaraHitCeiling(ITEM_INFO* item, COLL_INFO* coll);
|
||||
bool LaraHitCeiling(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void LaraCollideStop(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void SnapLaraToEdgeOfBlock(ITEM_INFO* item, COLL_INFO* coll, short angle);
|
||||
short GetDirOctant(int rot);
|
||||
void GetLaraDeadlyBounds();
|
||||
|
||||
bool TestLaraWallDeflect(COLL_INFO* coll);
|
||||
void SetLaraWallDeflect(ITEM_INFO* item, COLL_INFO* coll);
|
||||
bool TestLaraHitCeiling(COLL_INFO* coll);
|
||||
void SetLaraHitCeiling(ITEM_INFO* item, COLL_INFO* coll);
|
||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -1,25 +1,30 @@
|
|||
#pragma once
|
||||
#include "lara_struct.h"
|
||||
|
||||
/*crouch/duck start*/
|
||||
void lara_as_duck(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_col_duck(ITEM_INFO* item, COLL_INFO* coll);
|
||||
// Auxiliary functions.
|
||||
bool TestLaraKeepCrouched(ITEM_INFO* player, COLL_INFO* coll);
|
||||
bool TestLaraCrawl(ITEM_INFO* player);
|
||||
bool TestLaraCrouchTurn(ITEM_INFO* player);
|
||||
bool TestLaraCrouchRoll(ITEM_INFO* player);
|
||||
void SetLaraCrawlWallDeflect(ITEM_INFO* item, COLL_INFO* coll);
|
||||
|
||||
// Crouching control & collision functions.
|
||||
void lara_as_crouch(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_col_crouch(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_as_crouch_roll(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_col_crouch_roll(ITEM_INFO* item, COLL_INFO* coll);
|
||||
/*crouch/duck end*/
|
||||
/*-*/
|
||||
/*crawl start*/
|
||||
void lara_as_all4s(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_col_all4s(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_as_crawl(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_col_crawl(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_as_all4turnl(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_as_all4turnr(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_col_all4turnlr(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_as_crawlb(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_col_crawlb(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_as_duckl(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_as_duckr(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_col_ducklr(ITEM_INFO* item, COLL_INFO* coll);
|
||||
/*crawl end*/
|
||||
void lara_col_crawl2hang(ITEM_INFO* item, COLL_INFO* coll);
|
||||
|
||||
// Crawling control & collision functions.
|
||||
void lara_as_crawl_stop(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_col_crawl_stop(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_as_crawl_forward(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_col_crawl_forward(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_as_crawl_turn_left(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_as_crawl_turn_right(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_col_crawl_turn(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_as_crawl_back(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_col_crawl_back(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_as_crouch_turn_left(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_as_crouch_turn_right(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_col_crouch_turn(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_col_crawl_to_hang(ITEM_INFO* item, COLL_INFO* coll);
|
||||
|
|
|
@ -227,7 +227,8 @@ short HoldStates[] = {
|
|||
LS_TURN_RIGHT_SLOW,
|
||||
LS_TURN_LEFT_SLOW,
|
||||
LS_WALK_BACK,
|
||||
LS_TURN_FAST,
|
||||
LS_TURN_RIGHT_FAST,
|
||||
LS_TURN_LEFT_FAST,
|
||||
LS_STEP_RIGHT,
|
||||
LS_STEP_LEFT,
|
||||
LS_PICKUP,
|
||||
|
@ -371,19 +372,19 @@ void LaraGun() // (F) (D)
|
|||
|| LaraItem->currentAnimState == LS_CROUCH_TURN_LEFT
|
||||
|| LaraItem->currentAnimState == LS_CROUCH_TURN_RIGHT)
|
||||
&& (Lara.requestGunType == WEAPON_HK
|
||||
|| Lara.requestGunType == WEAPON_CROSSBOW
|
||||
|| Lara.requestGunType == WEAPON_SHOTGUN
|
||||
|| Lara.requestGunType == WEAPON_HARPOON_GUN))
|
||||
|| Lara.requestGunType == WEAPON_CROSSBOW
|
||||
|| Lara.requestGunType == WEAPON_SHOTGUN
|
||||
|| Lara.requestGunType == WEAPON_HARPOON_GUN))
|
||||
{
|
||||
if (Lara.gunType == WEAPON_FLARE)
|
||||
Lara.requestGunType = WEAPON_FLARE;
|
||||
}
|
||||
else if (Lara.requestGunType == WEAPON_FLARE
|
||||
|| (Lara.Vehicle == NO_ITEM
|
||||
&& (Lara.requestGunType == WEAPON_HARPOON_GUN
|
||||
|| Lara.waterStatus == LW_ABOVE_WATER
|
||||
|| (Lara.waterStatus == LW_WADE
|
||||
&& Lara.waterSurfaceDist > -Weapons[Lara.gunType].gunHeight))))
|
||||
&& (Lara.requestGunType == WEAPON_HARPOON_GUN
|
||||
|| Lara.waterStatus == LW_ABOVE_WATER
|
||||
|| (Lara.waterStatus == LW_WADE
|
||||
&& Lara.waterSurfaceDist > -Weapons[Lara.gunType].gunHeight))))
|
||||
{
|
||||
if (Lara.gunType == WEAPON_FLARE)
|
||||
{
|
||||
|
@ -411,18 +412,18 @@ void LaraGun() // (F) (D)
|
|||
}
|
||||
else if (Lara.gunStatus == LG_READY)
|
||||
{
|
||||
if ((TrInput & IN_DRAW)
|
||||
if ((TrInput & IN_DRAW)
|
||||
|| Lara.requestGunType != Lara.gunType)
|
||||
Lara.gunStatus = LG_UNDRAW_GUNS;
|
||||
else if (Lara.gunType != WEAPON_HARPOON_GUN
|
||||
&& Lara.waterStatus != LW_ABOVE_WATER
|
||||
&& (Lara.waterStatus != LW_WADE
|
||||
|| Lara.waterSurfaceDist < -Weapons[Lara.gunType].gunHeight))
|
||||
else if (Lara.gunType != WEAPON_HARPOON_GUN
|
||||
&& Lara.waterStatus != LW_ABOVE_WATER
|
||||
&& (Lara.waterStatus != LW_WADE
|
||||
|| Lara.waterSurfaceDist < -Weapons[Lara.gunType].gunHeight))
|
||||
Lara.gunStatus = LG_UNDRAW_GUNS;
|
||||
}
|
||||
else if (Lara.gunStatus == LG_HANDS_BUSY
|
||||
&& (TrInput & IN_FLARE)
|
||||
&& LaraItem->currentAnimState == LS_CRAWL_IDLE
|
||||
else if (Lara.gunStatus == LG_HANDS_BUSY
|
||||
&& (TrInput & IN_FLARE)
|
||||
&& LaraItem->currentAnimState == LS_CRAWL_IDLE
|
||||
&& LaraItem->animNumber == LA_CRAWL_IDLE)
|
||||
{
|
||||
Lara.requestGunType = WEAPON_FLARE;
|
||||
|
@ -430,154 +431,154 @@ void LaraGun() // (F) (D)
|
|||
|
||||
switch (Lara.gunStatus)
|
||||
{
|
||||
case LG_DRAW_GUNS:
|
||||
if (Lara.gunType != WEAPON_FLARE && Lara.gunType != WEAPON_NONE)
|
||||
Lara.lastGunType = Lara.gunType;
|
||||
case LG_DRAW_GUNS:
|
||||
if (Lara.gunType != WEAPON_FLARE && Lara.gunType != WEAPON_NONE)
|
||||
Lara.lastGunType = Lara.gunType;
|
||||
|
||||
switch (Lara.gunType)
|
||||
{
|
||||
case WEAPON_PISTOLS:
|
||||
case WEAPON_REVOLVER:
|
||||
case WEAPON_UZI:
|
||||
if (Camera.type != CINEMATIC_CAMERA && Camera.type != LOOK_CAMERA && Camera.type != HEAVY_CAMERA)
|
||||
Camera.type = COMBAT_CAMERA;
|
||||
draw_pistols(Lara.gunType);
|
||||
break;
|
||||
case WEAPON_PISTOLS:
|
||||
case WEAPON_REVOLVER:
|
||||
case WEAPON_UZI:
|
||||
if (Camera.type != CINEMATIC_CAMERA && Camera.type != LOOK_CAMERA && Camera.type != HEAVY_CAMERA)
|
||||
Camera.type = COMBAT_CAMERA;
|
||||
draw_pistols(Lara.gunType);
|
||||
break;
|
||||
|
||||
case WEAPON_SHOTGUN:
|
||||
case WEAPON_CROSSBOW:
|
||||
case WEAPON_HK:
|
||||
case WEAPON_GRENADE_LAUNCHER:
|
||||
case WEAPON_ROCKET_LAUNCHER:
|
||||
case WEAPON_HARPOON_GUN:
|
||||
if (Camera.type != CINEMATIC_CAMERA && Camera.type != LOOK_CAMERA && Camera.type != HEAVY_CAMERA)
|
||||
Camera.type = COMBAT_CAMERA;
|
||||
draw_shotgun(Lara.gunType);
|
||||
break;
|
||||
case WEAPON_SHOTGUN:
|
||||
case WEAPON_CROSSBOW:
|
||||
case WEAPON_HK:
|
||||
case WEAPON_GRENADE_LAUNCHER:
|
||||
case WEAPON_ROCKET_LAUNCHER:
|
||||
case WEAPON_HARPOON_GUN:
|
||||
if (Camera.type != CINEMATIC_CAMERA && Camera.type != LOOK_CAMERA && Camera.type != HEAVY_CAMERA)
|
||||
Camera.type = COMBAT_CAMERA;
|
||||
draw_shotgun(Lara.gunType);
|
||||
break;
|
||||
|
||||
case WEAPON_FLARE:
|
||||
draw_flare();
|
||||
break;
|
||||
|
||||
default:
|
||||
Lara.gunStatus = LG_NO_ARMS;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
|
||||
case LG_SPECIAL:
|
||||
case WEAPON_FLARE:
|
||||
draw_flare();
|
||||
break;
|
||||
|
||||
case LG_UNDRAW_GUNS:
|
||||
default:
|
||||
Lara.gunStatus = LG_NO_ARMS;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
|
||||
case LG_SPECIAL:
|
||||
draw_flare();
|
||||
break;
|
||||
|
||||
case LG_UNDRAW_GUNS:
|
||||
Lara.meshPtrs[LM_HEAD] = Objects[ID_LARA_SKIN].meshIndex + LM_HEAD;
|
||||
|
||||
switch (Lara.gunType)
|
||||
{
|
||||
case WEAPON_PISTOLS:
|
||||
case WEAPON_REVOLVER:
|
||||
case WEAPON_UZI:
|
||||
undraw_pistols(Lara.gunType);
|
||||
break;
|
||||
|
||||
case WEAPON_SHOTGUN:
|
||||
case WEAPON_CROSSBOW:
|
||||
case WEAPON_HK:
|
||||
case WEAPON_GRENADE_LAUNCHER:
|
||||
case WEAPON_ROCKET_LAUNCHER:
|
||||
case WEAPON_HARPOON_GUN:
|
||||
undraw_shotgun(Lara.gunType);
|
||||
break;
|
||||
|
||||
case WEAPON_FLARE:
|
||||
undraw_flare();
|
||||
break;
|
||||
|
||||
default:
|
||||
return;
|
||||
}
|
||||
break;
|
||||
|
||||
case LG_READY:
|
||||
if (!(TrInput & IN_ACTION))
|
||||
Lara.meshPtrs[LM_HEAD] = Objects[ID_LARA_SKIN].meshIndex + LM_HEAD;
|
||||
else
|
||||
Lara.meshPtrs[LM_HEAD] = Objects[ID_LARA_SCREAM].meshIndex + LM_HEAD;
|
||||
|
||||
switch (Lara.gunType)
|
||||
if (Camera.type != CINEMATIC_CAMERA && Camera.type != LOOK_CAMERA && Camera.type != HEAVY_CAMERA)
|
||||
Camera.type = COMBAT_CAMERA;
|
||||
|
||||
if (TrInput & IN_ACTION)
|
||||
{
|
||||
if (!*GetAmmo(Lara.gunType))
|
||||
{
|
||||
case WEAPON_PISTOLS:
|
||||
case WEAPON_REVOLVER:
|
||||
case WEAPON_UZI:
|
||||
undraw_pistols(Lara.gunType);
|
||||
break;
|
||||
|
||||
case WEAPON_SHOTGUN:
|
||||
case WEAPON_CROSSBOW:
|
||||
case WEAPON_HK:
|
||||
case WEAPON_GRENADE_LAUNCHER:
|
||||
case WEAPON_ROCKET_LAUNCHER:
|
||||
case WEAPON_HARPOON_GUN:
|
||||
undraw_shotgun(Lara.gunType);
|
||||
break;
|
||||
|
||||
case WEAPON_FLARE:
|
||||
undraw_flare();
|
||||
break;
|
||||
|
||||
default:
|
||||
return;
|
||||
Lara.requestGunType = Objects[ID_PISTOLS_ITEM].loaded ? WEAPON_PISTOLS : WEAPON_NONE;
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
switch (Lara.gunType)
|
||||
{
|
||||
case WEAPON_PISTOLS:
|
||||
case WEAPON_UZI:
|
||||
PistolHandler(Lara.gunType);
|
||||
break;
|
||||
|
||||
case LG_READY:
|
||||
if (!(TrInput & IN_ACTION))
|
||||
Lara.meshPtrs[LM_HEAD] = Objects[ID_LARA_SKIN].meshIndex + LM_HEAD;
|
||||
else
|
||||
Lara.meshPtrs[LM_HEAD] = Objects[ID_LARA_SCREAM].meshIndex + LM_HEAD;
|
||||
|
||||
if (Camera.type != CINEMATIC_CAMERA && Camera.type != LOOK_CAMERA && Camera.type != HEAVY_CAMERA)
|
||||
Camera.type = COMBAT_CAMERA;
|
||||
|
||||
if (TrInput & IN_ACTION)
|
||||
{
|
||||
if (!*GetAmmo(Lara.gunType))
|
||||
{
|
||||
Lara.requestGunType = Objects[ID_PISTOLS_ITEM].loaded ? WEAPON_PISTOLS : WEAPON_NONE;
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
switch (Lara.gunType)
|
||||
{
|
||||
case WEAPON_PISTOLS:
|
||||
case WEAPON_UZI:
|
||||
PistolHandler(Lara.gunType);
|
||||
break;
|
||||
|
||||
case WEAPON_SHOTGUN:
|
||||
case WEAPON_CROSSBOW:
|
||||
case WEAPON_HK:
|
||||
case WEAPON_GRENADE_LAUNCHER:
|
||||
case WEAPON_ROCKET_LAUNCHER:
|
||||
case WEAPON_HARPOON_GUN:
|
||||
case WEAPON_REVOLVER:
|
||||
RifleHandler(Lara.gunType);
|
||||
break;
|
||||
|
||||
default:
|
||||
return;
|
||||
}
|
||||
case WEAPON_SHOTGUN:
|
||||
case WEAPON_CROSSBOW:
|
||||
case WEAPON_HK:
|
||||
case WEAPON_GRENADE_LAUNCHER:
|
||||
case WEAPON_ROCKET_LAUNCHER:
|
||||
case WEAPON_HARPOON_GUN:
|
||||
case WEAPON_REVOLVER:
|
||||
RifleHandler(Lara.gunType);
|
||||
break;
|
||||
|
||||
case LG_NO_ARMS:
|
||||
if (Lara.gunType == WEAPON_FLARE)
|
||||
default:
|
||||
return;
|
||||
}
|
||||
break;
|
||||
|
||||
case LG_NO_ARMS:
|
||||
if (Lara.gunType == WEAPON_FLARE)
|
||||
{
|
||||
if (Lara.Vehicle != NO_ITEM || CheckForHoldingState(LaraItem->currentAnimState))
|
||||
{
|
||||
if (Lara.Vehicle != NO_ITEM || CheckForHoldingState(LaraItem->currentAnimState))
|
||||
if (Lara.flareControlLeft)
|
||||
{
|
||||
if (Lara.flareControlLeft)
|
||||
if (Lara.leftArm.frameNumber)
|
||||
{
|
||||
if (Lara.leftArm.frameNumber)
|
||||
{
|
||||
if (++Lara.leftArm.frameNumber == 110)
|
||||
Lara.leftArm.frameNumber = 0;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
Lara.leftArm.frameNumber = 95;
|
||||
Lara.flareControlLeft = true;
|
||||
if (++Lara.leftArm.frameNumber == 110)
|
||||
Lara.leftArm.frameNumber = 0;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
Lara.flareControlLeft = false;
|
||||
Lara.leftArm.frameNumber = 95;
|
||||
Lara.flareControlLeft = true;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
Lara.flareControlLeft = false;
|
||||
}
|
||||
|
||||
DoFlareInHand(Lara.flareAge);
|
||||
set_flare_arm(Lara.leftArm.frameNumber);
|
||||
}
|
||||
break;
|
||||
|
||||
case LG_HANDS_BUSY:
|
||||
if (Lara.gunType == WEAPON_FLARE)
|
||||
{
|
||||
if (Lara.meshPtrs[LM_LHAND] == Objects[ID_LARA_FLARE_ANIM].meshIndex + LM_LHAND)
|
||||
{
|
||||
Lara.flareControlLeft = (Lara.Vehicle != NO_ITEM || CheckForHoldingState(LaraItem->currentAnimState));
|
||||
DoFlareInHand(Lara.flareAge);
|
||||
set_flare_arm(Lara.leftArm.frameNumber);
|
||||
}
|
||||
break;
|
||||
|
||||
case LG_HANDS_BUSY:
|
||||
if (Lara.gunType == WEAPON_FLARE)
|
||||
{
|
||||
if (Lara.meshPtrs[LM_LHAND] == Objects[ID_LARA_FLARE_ANIM].meshIndex + LM_LHAND)
|
||||
{
|
||||
Lara.flareControlLeft = (Lara.Vehicle != NO_ITEM || CheckForHoldingState(LaraItem->currentAnimState));
|
||||
DoFlareInHand(Lara.flareAge);
|
||||
set_flare_arm(Lara.leftArm.frameNumber);
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -656,7 +657,7 @@ int WeaponObjectMesh(int weaponType)
|
|||
|
||||
case WEAPON_CROSSBOW:
|
||||
return (Lara.Weapons[WEAPON_CROSSBOW].HasLasersight == true ? ID_LARA_CROSSBOW_LASER : ID_CROSSBOW_ANIM);
|
||||
|
||||
|
||||
case WEAPON_GRENADE_LAUNCHER:
|
||||
return ID_GRENADE_ANIM;
|
||||
|
||||
|
@ -676,7 +677,7 @@ void HitTarget(ITEM_INFO* item, GAME_VECTOR* hitPos, int damage, int flag)
|
|||
{
|
||||
CREATURE_INFO* creature = (CREATURE_INFO*)item->data;
|
||||
OBJECT_INFO* obj = &Objects[item->objectNumber];
|
||||
|
||||
|
||||
item->hitStatus = true;
|
||||
if (creature != nullptr && item != LaraItem)
|
||||
creature->hurtByLara = true;
|
||||
|
@ -687,16 +688,16 @@ void HitTarget(ITEM_INFO* item, GAME_VECTOR* hitPos, int damage, int flag)
|
|||
{
|
||||
switch (obj->hitEffect)
|
||||
{
|
||||
case 1:
|
||||
DoBloodSplat(hitPos->x, hitPos->y, hitPos->z, (GetRandomControl() & 3) + 3, item->pos.yRot, item->roomNumber);
|
||||
break;
|
||||
case 3:
|
||||
TriggerRicochetSpark(hitPos, LaraItem->pos.yRot, 3, 0);
|
||||
break;
|
||||
case 2:
|
||||
TriggerRicochetSpark(hitPos, LaraItem->pos.yRot, 3, -5);
|
||||
SoundEffect(SFX_SWORD_GOD_HITMET, &item->pos, 0);
|
||||
break;
|
||||
case 1:
|
||||
DoBloodSplat(hitPos->x, hitPos->y, hitPos->z, (GetRandomControl() & 3) + 3, item->pos.yRot, item->roomNumber);
|
||||
break;
|
||||
case 3:
|
||||
TriggerRicochetSpark(hitPos, LaraItem->pos.yRot, 3, 0);
|
||||
break;
|
||||
case 2:
|
||||
TriggerRicochetSpark(hitPos, LaraItem->pos.yRot, 3, -5);
|
||||
SoundEffect(SFX_SWORD_GOD_HITMET, &item->pos, 0);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -731,9 +732,9 @@ FireWeaponType FireWeapon(int weaponType, ITEM_INFO* target, ITEM_INFO* src, sho
|
|||
rotation.zRot = 0;
|
||||
|
||||
// Calculate ray from rotation angles
|
||||
float x = sin(TO_RAD(rotation.yRot)) * cos(TO_RAD(rotation.xRot));
|
||||
float x = sin(TO_RAD(rotation.yRot)) * cos(TO_RAD(rotation.xRot));
|
||||
float y = -sin(TO_RAD(rotation.xRot));
|
||||
float z = cos(TO_RAD(rotation.yRot)) * cos(TO_RAD(rotation.xRot));
|
||||
float z = cos(TO_RAD(rotation.yRot)) * cos(TO_RAD(rotation.xRot));
|
||||
Vector3 direction = Vector3(x, y, z);
|
||||
direction.Normalize();
|
||||
Vector3 source = Vector3(pos.x, pos.y, pos.z);
|
||||
|
@ -760,7 +761,7 @@ FireWeaponType FireWeapon(int weaponType, ITEM_INFO* target, ITEM_INFO* src, sho
|
|||
|
||||
Lara.hasFired = true;
|
||||
Lara.fired = true;
|
||||
|
||||
|
||||
GAME_VECTOR vSrc;
|
||||
vSrc.x = pos.x;
|
||||
vSrc.y = pos.y;
|
||||
|
@ -826,10 +827,10 @@ FireWeaponType FireWeapon(int weaponType, ITEM_INFO* target, ITEM_INFO* src, sho
|
|||
}
|
||||
else
|
||||
{*/
|
||||
if (!GetTargetOnLOS(&vSrc, &vDest, FALSE, TRUE))
|
||||
HitTarget(target, &vDest, weapon->damage, NULL);
|
||||
if (!GetTargetOnLOS(&vSrc, &vDest, FALSE, TRUE))
|
||||
HitTarget(target, &vDest, weapon->damage, NULL);
|
||||
//}
|
||||
|
||||
|
||||
return FW_MAYBEHIT;
|
||||
}
|
||||
}
|
||||
|
@ -841,7 +842,7 @@ void find_target_point(ITEM_INFO* item, GAME_VECTOR* target) // (F) (D)
|
|||
|
||||
bounds = (BOUNDING_BOX*)GetBestFrame(item);
|
||||
x = (int)(bounds->X1 + bounds->X2) / 2;
|
||||
y = (int) bounds->Y1 + (bounds->Y2 - bounds->Y1) / 3;
|
||||
y = (int)bounds->Y1 + (bounds->Y2 - bounds->Y1) / 3;
|
||||
z = (int)(bounds->Z1 + bounds->Z2) / 2;
|
||||
c = phd_cos(item->pos.yRot);
|
||||
s = phd_sin(item->pos.yRot);
|
||||
|
@ -881,9 +882,9 @@ void LaraTargetInfo(WEAPON_INFO* weapon) // (F) (D)
|
|||
if (LOS(&src, &targetPoint))
|
||||
{
|
||||
if (angles[0] >= weapon->lockAngles[0]
|
||||
&& angles[0] <= weapon->lockAngles[1]
|
||||
&& angles[1] >= weapon->lockAngles[2]
|
||||
&& angles[1] <= weapon->lockAngles[3])
|
||||
&& angles[0] <= weapon->lockAngles[1]
|
||||
&& angles[1] >= weapon->lockAngles[2]
|
||||
&& angles[1] <= weapon->lockAngles[3])
|
||||
{
|
||||
Lara.rightArm.lock = true;
|
||||
Lara.leftArm.lock = true;
|
||||
|
@ -893,18 +894,18 @@ void LaraTargetInfo(WEAPON_INFO* weapon) // (F) (D)
|
|||
if (Lara.leftArm.lock)
|
||||
{
|
||||
if ((angles[0] < weapon->leftAngles[0] ||
|
||||
angles[0] > weapon->leftAngles[1] ||
|
||||
angles[1] < weapon->leftAngles[2] ||
|
||||
angles[1] > weapon->leftAngles[3]))
|
||||
angles[0] > weapon->leftAngles[1] ||
|
||||
angles[1] < weapon->leftAngles[2] ||
|
||||
angles[1] > weapon->leftAngles[3]))
|
||||
Lara.leftArm.lock = false;
|
||||
}
|
||||
|
||||
if (Lara.rightArm.lock)
|
||||
{
|
||||
if ((angles[0] < weapon->rightAngles[0] ||
|
||||
angles[0] > weapon->rightAngles[1] ||
|
||||
angles[1] < weapon->rightAngles[2] ||
|
||||
angles[1] > weapon->rightAngles[3]))
|
||||
angles[0] > weapon->rightAngles[1] ||
|
||||
angles[1] < weapon->rightAngles[2] ||
|
||||
angles[1] > weapon->rightAngles[3]))
|
||||
Lara.rightArm.lock = false;
|
||||
}
|
||||
}
|
||||
|
@ -933,7 +934,7 @@ bool CheckForHoldingState(int state) // (F) (D)
|
|||
return true;
|
||||
holdState++;
|
||||
}
|
||||
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
|
@ -942,7 +943,7 @@ void LaraGetNewTarget(WEAPON_INFO* weapon) // (F) (D)
|
|||
GAME_VECTOR src, target;
|
||||
PHD_VECTOR muzzleOffset;
|
||||
int bestDistance, maxDistance, targets, slot, x, y, z, distance;
|
||||
ITEM_INFO* bestItem, *item;
|
||||
ITEM_INFO* bestItem, * item;
|
||||
short bestYrot, angle[2], match;
|
||||
bool flag, loop;
|
||||
|
||||
|
@ -1117,7 +1118,7 @@ void DoProperDetection(short itemNumber, int x, int y, int z, int xv, int yv, in
|
|||
|
||||
if (y > (height + 32) && bs == 0 &&
|
||||
(((x >> WALL_SHIFT) != (item->pos.xPos >> WALL_SHIFT)) ||
|
||||
((z >> WALL_SHIFT) != (item->pos.zPos >> WALL_SHIFT))))
|
||||
((z >> WALL_SHIFT) != (item->pos.zPos >> WALL_SHIFT))))
|
||||
{
|
||||
// Need to know which direction the wall is.
|
||||
|
||||
|
@ -1524,7 +1525,7 @@ void DoProperDetection(short itemNumber, int x, int y, int z, int xv, int yv, in
|
|||
{
|
||||
if (y < ceiling &&
|
||||
(((x >> WALL_SHIFT) != (item->pos.xPos >> WALL_SHIFT)) ||
|
||||
((z >> WALL_SHIFT) != (item->pos.zPos >> WALL_SHIFT))))
|
||||
((z >> WALL_SHIFT) != (item->pos.zPos >> WALL_SHIFT))))
|
||||
{
|
||||
// Need to know which direction the wall is.
|
||||
|
||||
|
@ -1567,26 +1568,26 @@ void DoProperDetection(short itemNumber, int x, int y, int z, int xv, int yv, in
|
|||
|
||||
HOLSTER_SLOT HolsterSlotForWeapon(LARA_WEAPON_TYPE weapon)
|
||||
{
|
||||
switch(weapon){
|
||||
case WEAPON_PISTOLS:
|
||||
return HOLSTER_SLOT::Pistols;
|
||||
case WEAPON_UZI:
|
||||
return HOLSTER_SLOT::Uzis;
|
||||
case WEAPON_REVOLVER:
|
||||
return HOLSTER_SLOT::Revolver;
|
||||
case WEAPON_SHOTGUN:
|
||||
return HOLSTER_SLOT::Shotgun;
|
||||
case WEAPON_HK:
|
||||
return HOLSTER_SLOT::HK;
|
||||
case WEAPON_HARPOON_GUN:
|
||||
return HOLSTER_SLOT::Harpoon;
|
||||
case WEAPON_CROSSBOW:
|
||||
return HOLSTER_SLOT::Crowssbow;
|
||||
case WEAPON_GRENADE_LAUNCHER:
|
||||
return HOLSTER_SLOT::GrenadeLauncher;
|
||||
case WEAPON_ROCKET_LAUNCHER:
|
||||
return HOLSTER_SLOT::RocketLauncher;
|
||||
default:
|
||||
return HOLSTER_SLOT::Empty;
|
||||
switch (weapon) {
|
||||
case WEAPON_PISTOLS:
|
||||
return HOLSTER_SLOT::Pistols;
|
||||
case WEAPON_UZI:
|
||||
return HOLSTER_SLOT::Uzis;
|
||||
case WEAPON_REVOLVER:
|
||||
return HOLSTER_SLOT::Revolver;
|
||||
case WEAPON_SHOTGUN:
|
||||
return HOLSTER_SLOT::Shotgun;
|
||||
case WEAPON_HK:
|
||||
return HOLSTER_SLOT::HK;
|
||||
case WEAPON_HARPOON_GUN:
|
||||
return HOLSTER_SLOT::Harpoon;
|
||||
case WEAPON_CROSSBOW:
|
||||
return HOLSTER_SLOT::Crowssbow;
|
||||
case WEAPON_GRENADE_LAUNCHER:
|
||||
return HOLSTER_SLOT::GrenadeLauncher;
|
||||
case WEAPON_ROCKET_LAUNCHER:
|
||||
return HOLSTER_SLOT::RocketLauncher;
|
||||
default:
|
||||
return HOLSTER_SLOT::Empty;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -12,27 +12,24 @@
|
|||
#include "effect2.h"
|
||||
#include "chaffFX.h"
|
||||
|
||||
|
||||
constexpr std::array<float, 28> FlareFlickerTable = { 0.7590,0.9880,0.8790,0.920,0.8020,0.7610,0.97878,0.8978,0.9983,0.934763,0.8485,0.762573,0.84642,0.7896,0.817634,0.923424,0.7589,0.81399,0.92834,0.9978,0.7610,0.97878,0.8978,0.9983,0.934763,0.8485,0.762573,0.74642 };
|
||||
constexpr DirectX::SimpleMath::Vector3 FlareMainColor = Vector3(1,0.52947, 0.3921);
|
||||
constexpr std::array<float, 28> FlareFlickerTableLow = { 0.7590,0.1880,0.0790,0.920,0.8020,0.07610,0.197878,0.38978,0.09983,0.00934763,0.8485,0.0762573,0.84642,0.7896,0.517634,0.0923424,0.7589,0.081399,0.92834,0.01978,0.17610,0.497878,0.8978,0.69983,0.934763,0.28485,0.1762573,0.374642 };
|
||||
|
||||
|
||||
|
||||
void FlareControl(short itemNumber) // (AF) (D)
|
||||
void FlareControl(short itemNum) // (AF) (D)
|
||||
{
|
||||
ITEM_INFO* item = &g_Level.Items[itemNumber];
|
||||
ITEM_INFO* item = &g_Level.Items[itemNum];
|
||||
|
||||
if (g_Level.Rooms[item->roomNumber].flags & ENV_FLAG_SWAMP)
|
||||
{
|
||||
KillItem(itemNumber);
|
||||
KillItem(itemNum);
|
||||
return;
|
||||
}
|
||||
|
||||
if (item->fallspeed)
|
||||
{
|
||||
item->pos.xRot += ANGLE(3);
|
||||
item->pos.zRot += ANGLE(5);
|
||||
item->pos.xRot += ANGLE(3.0f);
|
||||
item->pos.zRot += ANGLE(5.0f);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -50,25 +47,26 @@ void FlareControl(short itemNumber) // (AF) (D)
|
|||
item->pos.xPos += xv;
|
||||
item->pos.zPos += zv;
|
||||
|
||||
|
||||
if (g_Level.Rooms[item->roomNumber].flags & ENV_FLAG_WATER)
|
||||
{
|
||||
item->fallspeed += (5 - item->fallspeed) / 2;
|
||||
item->speed += (5 - item->speed) / 2;
|
||||
}
|
||||
else
|
||||
{
|
||||
item->fallspeed += 6;
|
||||
}
|
||||
|
||||
item->pos.yPos += item->fallspeed;
|
||||
|
||||
DoProperDetection(itemNumber, oldX, oldY, oldZ, xv, item->fallspeed, zv);
|
||||
DoProperDetection(itemNum, oldX, oldY, oldZ, xv, item->fallspeed, zv);
|
||||
|
||||
short age = (short)(item->data) & 0x7FFF;
|
||||
if (age >= 900)
|
||||
{
|
||||
if (!item->fallspeed && !item->speed)
|
||||
{
|
||||
KillItem(itemNumber);
|
||||
KillItem(itemNum);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
@ -327,7 +325,7 @@ void CreateFlare(short objectNum, int thrown) // (F) (D)
|
|||
if (collided || GetFloorHeight(floor, pos.x, pos.y, pos.z) < pos.y)
|
||||
{
|
||||
flag = true;
|
||||
item->pos.yRot = LaraItem->pos.yRot + ANGLE(180);
|
||||
item->pos.yRot = LaraItem->pos.yRot + ANGLE(180.0f);
|
||||
item->pos.xPos = LaraItem->pos.xPos + (320 * phd_sin(item->pos.yRot) >> W2V_SHIFT);
|
||||
item->pos.zPos = LaraItem->pos.zPos + (320 * phd_cos(item->pos.yRot) >> W2V_SHIFT);
|
||||
item->roomNumber = LaraItem->roomNumber;
|
||||
|
@ -335,9 +333,14 @@ void CreateFlare(short objectNum, int thrown) // (F) (D)
|
|||
else
|
||||
{
|
||||
if (thrown)
|
||||
{
|
||||
item->pos.yRot = LaraItem->pos.yRot;
|
||||
}
|
||||
else
|
||||
item->pos.yRot = LaraItem->pos.yRot - ANGLE(45);
|
||||
{
|
||||
item->pos.yRot = LaraItem->pos.yRot - ANGLE(45.0f);
|
||||
}
|
||||
|
||||
item->roomNumber = roomNumber;
|
||||
}
|
||||
|
||||
|
@ -359,14 +362,20 @@ void CreateFlare(short objectNum, int thrown) // (F) (D)
|
|||
}
|
||||
|
||||
if (flag)
|
||||
{
|
||||
item->speed >>= 1;
|
||||
}
|
||||
|
||||
if (objectNum == ID_FLARE_ITEM)
|
||||
{
|
||||
if (DoFlareLight((PHD_VECTOR*)&item->pos, Lara.flareAge))
|
||||
{
|
||||
item->data = (void*)(Lara.flareAge | 0x8000);
|
||||
}
|
||||
else
|
||||
{
|
||||
item->data = (void*)(Lara.flareAge & 0x7FFF);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -393,7 +402,9 @@ void DoFlareInHand(int flare_age) // (AF) (D)
|
|||
|
||||
GetLaraJointPosition(&pos, LM_LHAND);
|
||||
if (DoFlareLight(&pos, flare_age))
|
||||
{
|
||||
TriggerChaffEffects(flare_age);
|
||||
}
|
||||
|
||||
/* Hardcoded code */
|
||||
|
||||
|
@ -415,7 +426,10 @@ int DoFlareLight(PHD_VECTOR* pos, int age)//49708, 49B6C (F)
|
|||
float random;
|
||||
int falloff;
|
||||
if (age >= 900 || age == 0)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
random = frand();
|
||||
|
||||
x = pos->x + (random* 120);
|
||||
|
@ -431,6 +445,7 @@ int DoFlareLight(PHD_VECTOR* pos, int age)//49708, 49B6C (F)
|
|||
b = FlareMainColor.z * 255;
|
||||
|
||||
TriggerDynamicLight(x, y, z, falloff, r, g, b);
|
||||
|
||||
return (random < 0.9f);
|
||||
}
|
||||
else if (age < 810)
|
||||
|
@ -442,6 +457,7 @@ int DoFlareLight(PHD_VECTOR* pos, int age)//49708, 49B6C (F)
|
|||
g = FlareMainColor.y * 255 * multiplier;
|
||||
b = FlareMainColor.z * 255 * multiplier;
|
||||
TriggerDynamicLight(x, y, z, falloff, r, g, b);
|
||||
|
||||
return (random < 0.4f);
|
||||
}
|
||||
else
|
||||
|
@ -452,9 +468,8 @@ int DoFlareLight(PHD_VECTOR* pos, int age)//49708, 49B6C (F)
|
|||
r = FlareMainColor.x * 255 * multiplier;
|
||||
g = FlareMainColor.y * 255 * multiplier;
|
||||
b = FlareMainColor.z * 255 * multiplier;
|
||||
TriggerDynamicLight(x, y, z, falloff, r, g, b);
|
||||
return (random < .3f);
|
||||
|
||||
}
|
||||
TriggerDynamicLight(x, y, z, falloff, r, g, b);
|
||||
|
||||
return (random < .3f);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -3,15 +3,24 @@
|
|||
#include "input.h"
|
||||
#include "lara_tests.h"
|
||||
|
||||
/*this file has all the lara_as/lara_col functions related to hanging*/
|
||||
// HANGING
|
||||
|
||||
/*normal hanging and shimmying*/
|
||||
// ------------------------------
|
||||
// HANGING AND SHIMMYING
|
||||
// Control & Collision Functions
|
||||
// ------------------------------
|
||||
|
||||
// State: 10
|
||||
// Collision: lara_col_hang()
|
||||
void lara_as_hang(ITEM_INFO* item, COLL_INFO* coll)//19A28, 19B5C (F)
|
||||
{
|
||||
/*state 10*/
|
||||
/*collision: lara_col_hang*/
|
||||
Camera.targetAngle = 0;
|
||||
Camera.targetElevation = ANGLE(-45.0f);
|
||||
Lara.isClimbing = false;
|
||||
|
||||
coll->enableBaddiePush = false;
|
||||
coll->enableSpaz = false;
|
||||
|
||||
if (item->hitPoints <= 0)
|
||||
{
|
||||
item->goalAnimState = LS_STOP;
|
||||
|
@ -19,19 +28,15 @@ void lara_as_hang(ITEM_INFO* item, COLL_INFO* coll)//19A28, 19B5C (F)
|
|||
}
|
||||
|
||||
if (TrInput & IN_LOOK)
|
||||
{
|
||||
LookUpDown();
|
||||
|
||||
coll->enableBaddiePush = false;
|
||||
coll->enableSpaz = false;
|
||||
|
||||
Camera.targetAngle = 0;
|
||||
Camera.targetElevation = -ANGLE(45.0f);
|
||||
}
|
||||
}
|
||||
|
||||
// State: 10
|
||||
// State code: lara_as_hang()
|
||||
void lara_col_hang(ITEM_INFO* item, COLL_INFO* coll)//19AC8, 19BFC (F)
|
||||
{
|
||||
/*state 10*/
|
||||
/*state code: lara_as_hang*/
|
||||
item->fallspeed = 0;
|
||||
item->gravityStatus = false;
|
||||
|
||||
|
@ -41,10 +46,9 @@ void lara_col_hang(ITEM_INFO* item, COLL_INFO* coll)//19AC8, 19BFC (F)
|
|||
|
||||
if (TrInput & IN_LEFT || TrInput & IN_LSTEP)
|
||||
{
|
||||
if (CanLaraHangSideways(item, coll, -ANGLE(90.0f)))
|
||||
if (CanLaraHangSideways(item, coll, ANGLE(-90.0f)))
|
||||
{
|
||||
item->goalAnimState = LS_SHIMMY_LEFT;
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -52,9 +56,13 @@ void lara_col_hang(ITEM_INFO* item, COLL_INFO* coll)//19AC8, 19BFC (F)
|
|||
if (flag != 0)
|
||||
{
|
||||
if (flag <= 0)
|
||||
{
|
||||
item->goalAnimState = LS_SHIMMY_INNER_LEFT;
|
||||
}
|
||||
else
|
||||
{
|
||||
item->goalAnimState = LS_SHIMMY_OUTER_LEFT;
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
@ -65,7 +73,6 @@ void lara_col_hang(ITEM_INFO* item, COLL_INFO* coll)//19AC8, 19BFC (F)
|
|||
if (CanLaraHangSideways(item, coll, ANGLE(90.0f)))
|
||||
{
|
||||
item->goalAnimState = LS_SHIMMY_RIGHT;
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -73,9 +80,13 @@ void lara_col_hang(ITEM_INFO* item, COLL_INFO* coll)//19AC8, 19BFC (F)
|
|||
if (flag != 0)
|
||||
{
|
||||
if (flag <= 0)
|
||||
{
|
||||
item->goalAnimState = LS_SHIMMY_INNER_RIGHT;
|
||||
}
|
||||
else
|
||||
{
|
||||
item->goalAnimState = LS_SHIMMY_OUTER_RIGHT;
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
@ -174,127 +185,137 @@ void lara_col_hang(ITEM_INFO* item, COLL_INFO* coll)//19AC8, 19BFC (F)
|
|||
}
|
||||
}
|
||||
|
||||
void lara_as_hangleft(ITEM_INFO* item, COLL_INFO* coll) // (F) (D)
|
||||
// State: 30
|
||||
// Collision: lara_col_hang_left()
|
||||
void lara_as_shimmy_left(ITEM_INFO* item, COLL_INFO* coll) // (F) (D)
|
||||
{
|
||||
/*state 30*/
|
||||
/*collision: lara_col_hangleft*/
|
||||
Camera.targetAngle = 0;
|
||||
Camera.targetElevation = ANGLE(-45.0f);
|
||||
|
||||
coll->enableBaddiePush = false;
|
||||
coll->enableSpaz = false;
|
||||
Camera.targetAngle = 0;
|
||||
Camera.targetElevation = -ANGLE(45.0f);
|
||||
if (!(TrInput & (IN_LEFT | IN_LSTEP)))
|
||||
item->goalAnimState = LS_HANG;
|
||||
}
|
||||
|
||||
void lara_col_hangleft(ITEM_INFO* item, COLL_INFO* coll) // (F) (D)
|
||||
if (TrInput & IN_LEFT || TrInput & IN_LSTEP)
|
||||
{
|
||||
item->goalAnimState = LS_SHIMMY_LEFT;
|
||||
return;
|
||||
}
|
||||
|
||||
item->goalAnimState = LS_HANG;
|
||||
}
|
||||
// State: 30
|
||||
// State code: lara_as_hang_left()
|
||||
void lara_col_shimmy_left(ITEM_INFO* item, COLL_INFO* coll) // (F) (D)
|
||||
{
|
||||
/*state 30*/
|
||||
/*state code: lara_as_hangleft*/
|
||||
Lara.moveAngle = -ANGLE(90);
|
||||
coll->radius = 102; /* @ORIGINAL_BUG: this value (instead of LARA_RAD) can make Lara glitch if coll->frontType is DIAGONAL or SPLIT_TRI */
|
||||
Lara.moveAngle = ANGLE(-90.0f);
|
||||
coll->radius = LARA_RAD; /* @ORIGINAL_BUG: original value, 102, can make Lara glitch if coll->frontType is DIAGONAL or SPLIT_TRI */
|
||||
LaraHangTest(item, coll);
|
||||
Lara.moveAngle = -ANGLE(90);
|
||||
Lara.moveAngle = ANGLE(-90.0f);
|
||||
}
|
||||
|
||||
void lara_as_hangright(ITEM_INFO* item, COLL_INFO* coll) // (F) (D)
|
||||
// State: 31
|
||||
// Collision: lara_col_shimmy_right()
|
||||
void lara_as_shimmy_right(ITEM_INFO* item, COLL_INFO* coll) // (F) (D)
|
||||
{
|
||||
/*state 31*/
|
||||
/*collision: lara_col_hangright*/
|
||||
Camera.targetAngle = 0;
|
||||
Camera.targetElevation = ANGLE(-45.0f);
|
||||
|
||||
coll->enableBaddiePush = false;
|
||||
coll->enableSpaz = false;
|
||||
Camera.targetAngle = 0;
|
||||
Camera.targetElevation = -ANGLE(45.0f);
|
||||
if (!(TrInput & (IN_RIGHT | IN_RSTEP)))
|
||||
item->goalAnimState = LS_HANG;
|
||||
|
||||
if (TrInput & IN_RIGHT || TrInput & IN_RSTEP)
|
||||
{
|
||||
item->goalAnimState = LS_SHIMMY_RIGHT;
|
||||
return;
|
||||
}
|
||||
|
||||
item->goalAnimState = LS_HANG;
|
||||
}
|
||||
|
||||
void lara_col_hangright(ITEM_INFO* item, COLL_INFO* coll) // (F) (D)
|
||||
// State: 31
|
||||
// State code: lara_as_shimmy_right()
|
||||
void lara_col_shimmy_right(ITEM_INFO* item, COLL_INFO* coll) // (F) (D)
|
||||
{
|
||||
/*state 31*/
|
||||
/*state code: lara_as_hangright*/
|
||||
Lara.moveAngle = ANGLE(90);
|
||||
coll->radius = 102; /* @ORIGINAL_BUG: this value (instead of LARA_RAD) can make Lara glitch if coll->frontType is DIAGONAL or SPLIT_TRI */
|
||||
Lara.moveAngle = ANGLE(90.0f);
|
||||
coll->radius = LARA_RAD; /* @ORIGINAL_BUG: original value, 102, can make Lara glitch if coll->frontType is DIAGONAL or SPLIT_TRI */
|
||||
LaraHangTest(item, coll);
|
||||
Lara.moveAngle = ANGLE(90);
|
||||
Lara.moveAngle = ANGLE(90.0f);
|
||||
}
|
||||
|
||||
/*go around corners*/
|
||||
// ------------------------------
|
||||
// SHIMMYING AROUND CORNERS
|
||||
// Control & Collision Functions
|
||||
// ------------------------------
|
||||
|
||||
// State: 107
|
||||
// Collision: lara_default_col()
|
||||
void lara_as_extcornerl(ITEM_INFO* item, COLL_INFO* coll)//1A1F0(<), 1A324(<) (F)
|
||||
{
|
||||
/*state 107*/
|
||||
/*collision: lara_default_col*/
|
||||
Camera.laraNode = 8;
|
||||
Camera.targetElevation = ANGLE(33.0f);
|
||||
|
||||
SetCornerAnim(item, coll, ANGLE(90.0f),
|
||||
item->animNumber == LA_SHIMMY_LEFT_CORNER_OUTER_END ||
|
||||
item->animNumber == LA_LADDER_LEFT_CORNER_OUTER_END);
|
||||
}
|
||||
|
||||
// State: 108
|
||||
// Collision: lara_default_col()
|
||||
void lara_as_extcornerr(ITEM_INFO* item, COLL_INFO* coll)//1A244(<), 1A378(<) (F)
|
||||
{
|
||||
/*state 108*/
|
||||
/*collision: lara_default_col*/
|
||||
Camera.laraNode = 8;
|
||||
Camera.targetElevation = ANGLE(33.0f);
|
||||
|
||||
SetCornerAnim(item, coll, -ANGLE(90.0f),
|
||||
item->animNumber == LA_SHIMMY_RIGHT_CORNER_OUTER_END ||
|
||||
item->animNumber == LA_LADDER_RIGHT_CORNER_OUTER_END);
|
||||
}
|
||||
|
||||
// State: 109
|
||||
// Collision: lara_default_col()
|
||||
void lara_as_intcornerl(ITEM_INFO* item, COLL_INFO* coll)//1A298(<), 1A3CC(<) (F)
|
||||
{
|
||||
/*state 109*/
|
||||
/*collision: lara_default_col*/
|
||||
Camera.laraNode = 8;
|
||||
Camera.targetElevation = ANGLE(33.0f);
|
||||
|
||||
SetCornerAnim(item, coll, -ANGLE(90.0f),
|
||||
item->animNumber == LA_SHIMMY_LEFT_CORNER_INNER_END ||
|
||||
item->animNumber == LA_LADDER_LEFT_CORNER_INNER_END);
|
||||
}
|
||||
|
||||
// State: 110
|
||||
// Collision: lara_default_col()
|
||||
void lara_as_intcornerr(ITEM_INFO* item, COLL_INFO* coll)//1A2EC(<), 1A420(<) (F)
|
||||
{
|
||||
/*state 110*/
|
||||
/*collision: lara_default_col*/
|
||||
Camera.laraNode = 8;
|
||||
Camera.targetElevation = ANGLE(33.0f);
|
||||
|
||||
SetCornerAnim(item, coll, ANGLE(90.0f),
|
||||
item->animNumber == LA_SHIMMY_RIGHT_CORNER_INNER_END ||
|
||||
item->animNumber == LA_LADDER_RIGHT_CORNER_INNER_END);
|
||||
}
|
||||
|
||||
/*feet hanging and shimmying
|
||||
////obviously, not all animations were made yet, we still need:
|
||||
// ------------------------------
|
||||
// HANGING AND SHIMMYING BY FEET
|
||||
// Control & Collision Functions
|
||||
// ------------------------------
|
||||
|
||||
/*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 anims)
|
||||
-handstand(not tested)*/
|
||||
|
||||
// State: 139
|
||||
// Collision: lara_col_hang_feet()
|
||||
void lara_as_hang_feet(ITEM_INFO* item, COLL_INFO* coll)
|
||||
{
|
||||
/*state 139*/
|
||||
/*collision: lara_col_hang_feet*/
|
||||
Lara.isClimbing = false;
|
||||
|
||||
if (item->hitPoints <= 0)
|
||||
{
|
||||
item->goalAnimState = LS_STOP;
|
||||
return;
|
||||
}
|
||||
|
||||
if (TrInput & IN_LOOK)
|
||||
LookUpDown();
|
||||
|
||||
coll->enableBaddiePush = false;
|
||||
coll->enableSpaz = false;
|
||||
Camera.targetAngle = 0;
|
||||
Camera.targetElevation = -ANGLE(45.0f);
|
||||
lara_as_hang(item, coll);
|
||||
}
|
||||
|
||||
// State: 139
|
||||
// Collision: lara_as_hang_feet()
|
||||
void lara_col_hang_feet(ITEM_INFO* item, COLL_INFO* coll)
|
||||
{
|
||||
/*state 139*/
|
||||
/*state code: lara_as_hang_feet*/
|
||||
item->fallspeed = 0;
|
||||
item->gravityStatus = false;
|
||||
|
||||
|
@ -303,7 +324,9 @@ void lara_col_hang_feet(ITEM_INFO* item, COLL_INFO* coll)
|
|||
LaraHangTest(item, coll);
|
||||
|
||||
if (!(TrInput & IN_ACTION))
|
||||
{
|
||||
item->goalAnimState = LS_JUMP_UP;
|
||||
}
|
||||
|
||||
if (item->animNumber == LA_HANG_FEET_IDLE)
|
||||
{
|
||||
|
@ -316,6 +339,7 @@ void lara_col_hang_feet(ITEM_INFO* item, COLL_INFO* coll)
|
|||
item->goalAnimState = LS_SHIMMY_FEET_LEFT;
|
||||
return;
|
||||
}
|
||||
|
||||
flag = LaraHangLeftCornerTest(item, coll);
|
||||
if (flag != 0)
|
||||
{
|
||||
|
@ -328,7 +352,6 @@ void lara_col_hang_feet(ITEM_INFO* item, COLL_INFO* coll)
|
|||
|
||||
}
|
||||
|
||||
|
||||
if (TrInput & IN_RIGHT || TrInput & IN_RSTEP)
|
||||
{
|
||||
if (CanLaraHangSideways(item, coll, ANGLE(90.0f)))
|
||||
|
@ -337,6 +360,7 @@ void lara_col_hang_feet(ITEM_INFO* item, COLL_INFO* coll)
|
|||
|
||||
return;
|
||||
}
|
||||
|
||||
flag = LaraHangRightCornerTest(item, coll);
|
||||
if (flag != 0)
|
||||
{
|
||||
|
@ -348,7 +372,6 @@ void lara_col_hang_feet(ITEM_INFO* item, COLL_INFO* coll)
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
TestForObjectOnLedge(item, coll);
|
||||
if (TrInput & IN_FORWARD)
|
||||
{
|
||||
|
@ -378,6 +401,7 @@ void lara_col_hang_feet(ITEM_INFO* item, COLL_INFO* coll)
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (coll->frontFloor < -650 &&
|
||||
coll->frontFloor - coll->frontCeiling >= -256 &&
|
||||
coll->frontFloor - coll->leftCeiling2 >= -256 &&
|
||||
|
@ -387,6 +411,7 @@ void lara_col_hang_feet(ITEM_INFO* item, COLL_INFO* coll)
|
|||
{
|
||||
item->goalAnimState = LS_HANG_TO_CRAWL;
|
||||
item->requiredAnimState = LS_CROUCH_IDLE;
|
||||
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
@ -412,97 +437,120 @@ void lara_col_hang_feet(ITEM_INFO* item, COLL_INFO* coll)
|
|||
}*///commenting till daniel makes anims
|
||||
|
||||
Lara.moveAngle = 0;
|
||||
|
||||
LaraHangTest(item, coll);
|
||||
}
|
||||
}
|
||||
|
||||
void lara_as_hang_feet_shimmyr(ITEM_INFO* item, COLL_INFO* coll)
|
||||
// State: 140
|
||||
// Collision: lara_col_hang_feet_shimmy_right()
|
||||
void lara_as_shimmy_feet_right(ITEM_INFO* item, COLL_INFO* coll)
|
||||
{
|
||||
/*state 140*/
|
||||
/*collision: lara_col_hang_feet_shimmyr*/
|
||||
Camera.targetAngle = 0;
|
||||
Camera.targetElevation = ANGLE(-45.0f);
|
||||
|
||||
coll->enableBaddiePush = false;
|
||||
coll->enableSpaz = false;
|
||||
|
||||
if (TrInput & IN_RIGHT || TrInput & IN_RSTEP)
|
||||
{
|
||||
item->goalAnimState = LS_SHIMMY_FEET_RIGHT;
|
||||
return;
|
||||
}
|
||||
|
||||
item->goalAnimState = LS_HANG_FEET;
|
||||
}
|
||||
|
||||
// State: 140
|
||||
// State code: lara_as_hang_feet_shimmy_right()
|
||||
void lara_col_shimmy_feet_right(ITEM_INFO* item, COLL_INFO* coll)
|
||||
{
|
||||
lara_col_shimmy_right(item, coll);
|
||||
}
|
||||
|
||||
// State: 141
|
||||
// Collision: lara_as_hang_feet_shimmy_left()
|
||||
void lara_as_shimmy_feet_left(ITEM_INFO* item, COLL_INFO* coll)
|
||||
{
|
||||
Camera.targetAngle = 0;
|
||||
Camera.targetElevation = -ANGLE(45.0f);
|
||||
Camera.targetElevation = ANGLE(-45.0f);
|
||||
|
||||
if (!(TrInput & (IN_RIGHT | IN_RSTEP)))
|
||||
item->goalAnimState = LS_HANG_FEET;
|
||||
}
|
||||
|
||||
void lara_col_hang_feet_shimmyr(ITEM_INFO* item, COLL_INFO* coll)
|
||||
{
|
||||
/*state 140*/
|
||||
/*state code: lara_as_hang_feet_shimmyr*/
|
||||
Lara.moveAngle = ANGLE(90);
|
||||
coll->radius = LARA_RAD;
|
||||
LaraHangTest(item, coll);
|
||||
Lara.moveAngle = ANGLE(90);
|
||||
}
|
||||
|
||||
void lara_as_hang_feet_shimmyl(ITEM_INFO* item, COLL_INFO* coll)
|
||||
{
|
||||
/*state 141*/
|
||||
/*collision: lara_col_hang_feet_shimmyl*/
|
||||
coll->enableBaddiePush = false;
|
||||
coll->enableSpaz = false;
|
||||
Camera.targetAngle = 0;
|
||||
Camera.targetElevation = -ANGLE(45.0f);
|
||||
if (!(TrInput & (IN_LEFT | IN_LSTEP)))
|
||||
item->goalAnimState = LS_HANG_FEET;
|
||||
|
||||
if (TrInput & IN_LEFT || TrInput & IN_LSTEP)
|
||||
{
|
||||
item->goalAnimState = LS_SHIMMY_FEET_LEFT;
|
||||
return;
|
||||
}
|
||||
|
||||
item->goalAnimState = LS_HANG_FEET;
|
||||
}
|
||||
|
||||
void lara_col_hang_feet_shimmyl(ITEM_INFO* item, COLL_INFO* coll)
|
||||
// State: 141
|
||||
// State code: lara_as_hang_feet_shimmy_left()
|
||||
void lara_col_shimmy_feet_left(ITEM_INFO* item, COLL_INFO* coll)
|
||||
{
|
||||
/*state 141*/
|
||||
/*state code: lara_as_hang_feet_shimmyl*/
|
||||
Lara.moveAngle = -ANGLE(90);
|
||||
coll->radius = LARA_RAD;
|
||||
LaraHangTest(item, coll);
|
||||
Lara.moveAngle = -ANGLE(90);
|
||||
lara_col_shimmy_left(item, coll);
|
||||
}
|
||||
|
||||
/*go around corners feet*/
|
||||
// ------------------------------
|
||||
// SHIMMYING BY FEET AROUND CORNERS
|
||||
// Control & Collision Functions
|
||||
// ------------------------------
|
||||
|
||||
void lara_as_hang_feet_inRcorner(ITEM_INFO* item, COLL_INFO* coll)
|
||||
// State 142
|
||||
// Collision: lara_default_col()
|
||||
void lara_as_hang_feet_right_corner_inner(ITEM_INFO* item, COLL_INFO* coll)
|
||||
{
|
||||
/*state 142*/
|
||||
/*collision: lara_default_col*/
|
||||
Camera.laraNode = 8;
|
||||
Camera.targetElevation = ANGLE(33.0f);
|
||||
|
||||
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?
|
||||
{
|
||||
SetCornerAnimFeet(item, coll, ANGLE(90.0f),
|
||||
item->animNumber = LA_SHIMMY_FEET_RIGHT_CORNER_INNER);
|
||||
}
|
||||
}
|
||||
|
||||
void lara_as_hang_feet_inLcorner(ITEM_INFO* item, COLL_INFO* coll)
|
||||
// State 143
|
||||
// Collision: lara_default_col()
|
||||
void lara_as_hang_feet_left_corner_inner(ITEM_INFO* item, COLL_INFO* coll)
|
||||
{
|
||||
/*state 143*/
|
||||
/*collision: lara_default_col*/
|
||||
Camera.laraNode = 8;
|
||||
Camera.targetElevation = ANGLE(33.0f);
|
||||
|
||||
if (item->frameNumber == g_Level.Anims[LA_SHIMMY_FEET_LEFT_CORNER_INNER].frameEnd)
|
||||
{
|
||||
SetCornerAnimFeet(item, coll, -ANGLE(90.0f),
|
||||
item->animNumber = LA_SHIMMY_FEET_LEFT_CORNER_INNER);
|
||||
}
|
||||
}
|
||||
|
||||
void lara_as_hang_feet_outRcorner(ITEM_INFO* item, COLL_INFO* coll)
|
||||
// State 144
|
||||
// Collision: lara_default_col()
|
||||
void lara_as_hang_feet_right_corner_outer(ITEM_INFO* item, COLL_INFO* coll)
|
||||
{
|
||||
/*state 144*/
|
||||
/*collision: lara_default_col*/
|
||||
Camera.laraNode = 8;
|
||||
Camera.targetElevation = ANGLE(33.0f);
|
||||
|
||||
if (item->frameNumber == g_Level.Anims[LA_SHIMMY_FEET_RIGHT_CORNER_OUTER].frameEnd)
|
||||
{
|
||||
SetCornerAnimFeet(item, coll, -ANGLE(90.0f),
|
||||
item->animNumber = LA_SHIMMY_FEET_RIGHT_CORNER_OUTER);
|
||||
}
|
||||
}
|
||||
|
||||
void lara_as_hang_feet_outLcorner(ITEM_INFO* item, COLL_INFO* coll)
|
||||
// State 145
|
||||
// Collision: lara_default_col()
|
||||
void lara_as_hang_feet_left_corner_outer(ITEM_INFO* item, COLL_INFO* coll)
|
||||
{
|
||||
/*state 145*/
|
||||
/*collision: lara_default_col*/
|
||||
Camera.laraNode = 8;
|
||||
Camera.targetElevation = ANGLE(33.0f);
|
||||
|
||||
if (item->frameNumber == g_Level.Anims[LA_SHIMMY_FEET_LEFT_CORNER_OUTER].frameEnd)
|
||||
{
|
||||
SetCornerAnimFeet(item, coll, ANGLE(90.0f),
|
||||
item->animNumber = LA_SHIMMY_FEET_LEFT_CORNER_OUTER);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,27 +1,30 @@
|
|||
#pragma once
|
||||
#include "lara_struct.h"
|
||||
|
||||
/*normal hanging and shimmying*/
|
||||
// Hanging and shimmying control & collision functions.
|
||||
void lara_as_hang(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_col_hang(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_as_hangleft(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_col_hangleft(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_as_hangright(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_col_hangright(ITEM_INFO* item, COLL_INFO* coll);
|
||||
/*go around corners*/
|
||||
void lara_as_shimmy_left(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_col_shimmy_left(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_as_shimmy_right(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_col_shimmy_right(ITEM_INFO* item, COLL_INFO* coll);
|
||||
|
||||
// Shimmying around corners control & collision functions.
|
||||
void lara_as_extcornerl(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_as_extcornerr(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_as_intcornerl(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_as_intcornerr(ITEM_INFO* item, COLL_INFO* coll);
|
||||
/*feet hanging and shimmying*/
|
||||
|
||||
// Hanging and shimmying by feet control & collision functions.
|
||||
void lara_as_hang_feet(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_col_hang_feet(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_as_hang_feet_shimmyr(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_col_hang_feet_shimmyr(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_as_hang_feet_shimmyl(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_col_hang_feet_shimmyl(ITEM_INFO* item, COLL_INFO* coll);
|
||||
/*go around corners feet*/
|
||||
void lara_as_hang_feet_inRcorner(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_as_hang_feet_inLcorner(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_as_hang_feet_outRcorner(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_as_hang_feet_outLcorner(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_as_shimmy_feet_right(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_col_shimmy_feet_right(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_as_shimmy_feet_left(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_col_shimmy_feet_left(ITEM_INFO* item, COLL_INFO* coll);
|
||||
|
||||
// Shimmying by feet around corners control & collision functions.
|
||||
void lara_as_hang_feet_right_corner_inner(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_as_hang_feet_left_corner_inner(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_as_hang_feet_right_corner_outer(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_as_hang_feet_left_corner_outer(ITEM_INFO* item, COLL_INFO* coll);
|
||||
|
|
|
@ -149,7 +149,7 @@ void InitialiseLaraAnims(ITEM_INFO* item) // (F) (D)
|
|||
Lara.waterStatus = LW_ABOVE_WATER;
|
||||
item->goalAnimState = LS_STOP;
|
||||
item->currentAnimState = LS_STOP;
|
||||
item->animNumber = LA_STAND_SOLID;
|
||||
item->animNumber = LA_STAND_IDLE;
|
||||
item->frameNumber = g_Level.Anims[item->animNumber].frameBase;
|
||||
}
|
||||
}
|
||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -1,61 +1,50 @@
|
|||
#pragma once
|
||||
#include "lara_struct.h"
|
||||
|
||||
/*pickups*/
|
||||
// Pickup control functions.
|
||||
void lara_as_pickup(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_as_pickupflare(ITEM_INFO* item, COLL_INFO* coll);
|
||||
/*end pickups*/
|
||||
/*-*/
|
||||
/*switches*/
|
||||
void lara_as_switchon(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_as_switchoff(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_as_pickup_flare(ITEM_INFO* item, COLL_INFO* coll);
|
||||
|
||||
// Switch control & collision functions.
|
||||
void lara_as_switch(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_col_turnswitch(ITEM_INFO* item, COLL_INFO* coll);
|
||||
/*end switches*/
|
||||
/*-*/
|
||||
/*puzzles and keys*/
|
||||
void lara_as_usekey(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_as_usepuzzle(ITEM_INFO* item, COLL_INFO* coll);
|
||||
/*end puzzles and keys*/
|
||||
/*-*/
|
||||
/*pushables*/
|
||||
void lara_as_pushblock(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_as_pullblock(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_as_ppready(ITEM_INFO* item, COLL_INFO* coll);
|
||||
/*end pushables*/
|
||||
/*-*/
|
||||
/*pulley*/
|
||||
|
||||
// Puzzle & key control functions.
|
||||
void lara_as_use_key(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_as_use_puzzle(ITEM_INFO* item, COLL_INFO* coll);
|
||||
|
||||
// Pushable state functions.
|
||||
void lara_as_pushable_push(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_as_pushable_pull(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_as_pushable_ready(ITEM_INFO* item, COLL_INFO* coll);
|
||||
|
||||
// Pulley control function.
|
||||
void lara_as_pulley(ITEM_INFO* item, COLL_INFO* coll);
|
||||
/*end pulley*/
|
||||
/*-*/
|
||||
/*parallel bars*/
|
||||
void lara_as_parallelbars(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_as_pbleapoff(ITEM_INFO* item, COLL_INFO* coll);
|
||||
/*end parallel bars*/
|
||||
/*-*/
|
||||
/*tightropes*/
|
||||
void lara_as_trpose(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_as_trwalk(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_as_trfall(ITEM_INFO* item, COLL_INFO* coll);
|
||||
/*end tightropes*/
|
||||
/*-*/
|
||||
/*ropes*/
|
||||
void lara_as_ropel(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_as_roper(ITEM_INFO* item, COLL_INFO* coll);
|
||||
|
||||
// Swingbar control functions.
|
||||
void lara_as_swing_bar(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_as_swing_bar_leap(ITEM_INFO* item, COLL_INFO* coll);
|
||||
|
||||
// Tightrope control functions.
|
||||
void lara_as_tightrope_stop(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_as_tightrope_walk(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_as_tightrope_fall(ITEM_INFO* item, COLL_INFO* coll);
|
||||
|
||||
// Rope control & collision functions.
|
||||
void lara_as_rope_turn_clockwise(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_as_rope_turn_counter_clockwise(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_as_rope(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_col_rope(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_col_ropefwd(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_as_climbrope(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_as_climbroped(ITEM_INFO* item, COLL_INFO* coll);
|
||||
/*end ropes*/
|
||||
/*-*/
|
||||
/*poles*/
|
||||
void lara_col_polestat(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_col_poleup(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_col_poledown(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_as_poleleft(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_as_poleright(ITEM_INFO* item, COLL_INFO* coll);
|
||||
/*end poles*/
|
||||
/*-*/
|
||||
/*deathslide*/
|
||||
void lara_as_deathslide(ITEM_INFO* item, COLL_INFO* coll);
|
||||
/*end deathslide*/
|
||||
void lara_col_rope_swing(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_as_rope_up(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_as_rope_down(ITEM_INFO* item, COLL_INFO* coll);
|
||||
|
||||
// Pole control & collision functions.
|
||||
void lara_col_pole_stop(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_col_pole_up(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_col_pole_down(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_as_pole_turn_clockwise(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_as_pole_turn_counter_clockwise(ITEM_INFO* item, COLL_INFO* coll);
|
||||
|
||||
// Zipline control functions.
|
||||
void lara_as_zipline(ITEM_INFO* item, COLL_INFO* coll);
|
|
@ -1,15 +1,113 @@
|
|||
#include "framework.h"
|
||||
#include "lara.h"
|
||||
#include "lara_collide.h"
|
||||
#include "lara_tests.h"
|
||||
#include "input.h"
|
||||
#include "sound.h"
|
||||
//#include "lara_slide.h"
|
||||
|
||||
short OldAngle = 1;
|
||||
int OldAngle = 1; // Don't care. To be deleted.
|
||||
|
||||
/*this file has all the related functions to sliding*/
|
||||
// For later.
|
||||
bool EnableAugmentedSlide; // Adds steep sliding, slope hugging, 180 turn.
|
||||
bool EnableNonCardinalSlide; // Slides Lara in true slope direction.
|
||||
bool EnableSlideInterpolation; // Adapts Lara angles to slope.
|
||||
bool EnableSlideSteering; // Allows player influence on slide trajectory.
|
||||
|
||||
/*tests and others*/
|
||||
int TestLaraSlide(ITEM_INFO* item, COLL_INFO* coll) // (F) (D)
|
||||
// SLOPE SLIDING
|
||||
|
||||
// ------------------------------
|
||||
// Auxiliary functions
|
||||
// ------------------------------
|
||||
|
||||
bool TestLaraSlide(COLL_INFO* coll)
|
||||
{
|
||||
if (abs(coll->tiltX) <= 2 && abs(coll->tiltZ) <= 2)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
short GetLaraSlideDirection(COLL_INFO* coll)
|
||||
{
|
||||
short laraAngle = ANGLE(0.0f);
|
||||
|
||||
//if (EnableNonCardinalSlide)
|
||||
//{
|
||||
// // TODO: Get true slope direction.
|
||||
//}
|
||||
//else
|
||||
//{
|
||||
if (coll->tiltX > 2)
|
||||
{
|
||||
laraAngle = -ANGLE(90.0f);
|
||||
}
|
||||
else if (coll->tiltX < -2)
|
||||
{
|
||||
laraAngle = ANGLE(90.0f);
|
||||
}
|
||||
|
||||
if (coll->tiltZ > 2 && coll->tiltZ > abs(coll->tiltX))
|
||||
{
|
||||
laraAngle = ANGLE(180.0f);
|
||||
}
|
||||
else if (coll->tiltZ < -2 && -coll->tiltZ > abs(coll->tiltX))
|
||||
{
|
||||
laraAngle = ANGLE(0.0f);
|
||||
}
|
||||
//}
|
||||
|
||||
return laraAngle;
|
||||
}
|
||||
|
||||
int GetSlopeAngle(COLL_INFO* coll)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
|
||||
void SetLaraSlide(ITEM_INFO* item, COLL_INFO* coll)
|
||||
{
|
||||
short dir = GetLaraSlideDirection(coll);
|
||||
short polarity = dir - item->pos.yRot;
|
||||
|
||||
ShiftItem(item, coll);
|
||||
|
||||
// Slide back.
|
||||
if (polarity < ANGLE(-90.0f) || polarity > ANGLE(90.0f))
|
||||
{
|
||||
if (GetSlopeAngle(coll) < ANGLE(60.0f))//SLOPE_ANGLE_STEEP)
|
||||
{
|
||||
Lara.moveAngle = ANGLE(180);
|
||||
item->goalAnimState = LS_SLIDE_BACK;
|
||||
item->pos.yRot = dir + ANGLE(180.0f);
|
||||
}
|
||||
else
|
||||
{
|
||||
item->goalAnimState = LS_SLIDE_STEEP_BACK;
|
||||
item->pos.yRot = dir + ANGLE(180.0f);
|
||||
}
|
||||
}
|
||||
// Slide forward.
|
||||
else
|
||||
{
|
||||
if (GetSlopeAngle(coll) < ANGLE(60.0f))//SLOPE_ANGLE_STEEP)
|
||||
{
|
||||
Lara.moveAngle = 0;
|
||||
item->goalAnimState = LS_SLIDE_FORWARD;
|
||||
item->pos.yRot = dir;
|
||||
}
|
||||
else
|
||||
{
|
||||
item->goalAnimState = LS_SLIDE_STEEP_FORWARD;
|
||||
item->pos.yRot = dir;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// LEGACY. Staying until everything is done.
|
||||
int Old_TestLaraSlide(ITEM_INFO* item, COLL_INFO* coll) // (F) (D)
|
||||
{
|
||||
if (abs(coll->tiltX) <= 2 && abs(coll->tiltZ) <= 2)
|
||||
return 0;
|
||||
|
@ -59,64 +157,12 @@ int TestLaraSlide(ITEM_INFO* item, COLL_INFO* coll) // (F) (D)
|
|||
return 1;
|
||||
}
|
||||
|
||||
void lara_slide_slope(ITEM_INFO* item, COLL_INFO* coll)//127BC, 1286C (F)
|
||||
void PerformLaraSlide(ITEM_INFO* item, COLL_INFO* coll)//127BC, 1286C (F)
|
||||
{
|
||||
coll->badPos = NO_BAD_POS;
|
||||
coll->badNeg = -512;
|
||||
coll->badCeiling = 0;
|
||||
|
||||
coll->facing = Lara.moveAngle;
|
||||
GetCollisionInfo(coll, item->pos.xPos, item->pos.yPos, item->pos.zPos, item->roomNumber, LARA_HITE);
|
||||
|
||||
if (!LaraHitCeiling(item, coll))
|
||||
{
|
||||
LaraDeflectEdge(item, coll);
|
||||
|
||||
if (coll->midFloor <= 200)
|
||||
{
|
||||
TestLaraSlide(item, coll);
|
||||
|
||||
item->pos.yPos += coll->midFloor;
|
||||
|
||||
if (abs(coll->tiltX) <= 2 && abs(coll->tiltZ) <= 2)
|
||||
{
|
||||
if (TrInput & IN_FORWARD && item->currentAnimState != LS_SLIDE_BACK)
|
||||
{
|
||||
item->goalAnimState = LS_RUN_FORWARD;
|
||||
}
|
||||
else
|
||||
item->goalAnimState = LS_STOP;
|
||||
StopSoundEffect(SFX_LARA_SLIPPING);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (item->currentAnimState == LS_SLIDE_FORWARD)
|
||||
{
|
||||
item->animNumber = LA_FALL_START;
|
||||
item->frameNumber = g_Level.Anims[LA_FALL_START].frameBase;
|
||||
|
||||
item->currentAnimState = LS_JUMP_FORWARD;
|
||||
item->goalAnimState = LS_JUMP_FORWARD;
|
||||
}
|
||||
else
|
||||
{
|
||||
item->animNumber = LA_FALL_BACK;
|
||||
item->frameNumber = g_Level.Anims[LA_FALL_BACK].frameBase;
|
||||
|
||||
item->currentAnimState = LS_FALL_BACK;
|
||||
item->goalAnimState = LS_FALL_BACK;
|
||||
}
|
||||
|
||||
StopSoundEffect(SFX_LARA_SLIPPING);
|
||||
|
||||
item->gravityStatus = true;
|
||||
item->fallspeed = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void LaraSlideEdgeJump(ITEM_INFO* item, COLL_INFO* coll)//12B18, 12BC8 (F)
|
||||
void PerformLaraSlideEdgeJump(ITEM_INFO* item, COLL_INFO* coll)//12B18, 12BC8 (F)
|
||||
{
|
||||
ShiftItem(item, coll);
|
||||
|
||||
|
@ -150,41 +196,245 @@ void LaraSlideEdgeJump(ITEM_INFO* item, COLL_INFO* coll)//12B18, 12BC8 (F)
|
|||
break;
|
||||
}
|
||||
}
|
||||
/*end tests and others*/
|
||||
/*-*/
|
||||
/*Lara state code*/
|
||||
void lara_as_slide(ITEM_INFO* item, COLL_INFO* coll)//1A824(<), 1A958(<) (F)
|
||||
|
||||
// ------------------------------
|
||||
// SLOPE SLIDING
|
||||
// Control & Collision Functions
|
||||
// ------------------------------
|
||||
|
||||
// State: 24
|
||||
// Collision: lara_col_Slide()
|
||||
void lara_as_slide(ITEM_INFO* player, COLL_INFO* coll)//1A824(<), 1A958(<) (F)
|
||||
{
|
||||
/*state 24*/
|
||||
/*collision: lara_col_slide*/
|
||||
Camera.targetElevation = -ANGLE(45.0f); // FIXED
|
||||
if ((TrInput & IN_JUMP) && !(TrInput & IN_BACK))
|
||||
item->goalAnimState = LS_JUMP_FORWARD;
|
||||
Camera.targetElevation = player->pos.xRot - ANGLE(45.0f);
|
||||
|
||||
/*if (TrInput & IN_LEFT)
|
||||
{
|
||||
player->pos.yRot -= ANGLE(2.0f);
|
||||
|
||||
Lara.turnRate -= LARA_TURN_RATE;
|
||||
if (Lara.turnRate < -LARA_FAST_TURN)
|
||||
{
|
||||
Lara.turnRate = -LARA_FAST_TURN;
|
||||
}
|
||||
|
||||
if (TestLaraLean(coll) & EnableSlideSteering)
|
||||
{
|
||||
player->pos.zRot -= LARA_LEAN_RATE;
|
||||
if (player->pos.zRot < -LARA_LEAN_MAX)
|
||||
{
|
||||
player->pos.zRot = -LARA_LEAN_MAX;
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (TrInput & IN_RIGHT)
|
||||
{
|
||||
player->pos.yRot += ANGLE(2.0f);
|
||||
|
||||
Lara.turnRate += LARA_TURN_RATE;
|
||||
if (Lara.turnRate > LARA_FAST_TURN)
|
||||
{
|
||||
Lara.turnRate = LARA_FAST_TURN;
|
||||
}
|
||||
|
||||
if (TestLaraLean(coll) && EnableSlideSteering)
|
||||
{
|
||||
player->pos.zRot += LARA_LEAN_RATE;
|
||||
if (player->pos.zRot > LARA_LEAN_MAX)
|
||||
{
|
||||
player->pos.zRot = LARA_LEAN_MAX;
|
||||
}
|
||||
}
|
||||
}*/
|
||||
|
||||
if ((TrInput & IN_BACK) || (TrInput & IN_DUCK))
|
||||
{
|
||||
player->goalAnimState = LS_SLIDE_STEEP_FORWARD;
|
||||
}
|
||||
|
||||
if (TrInput & IN_JUMP)
|
||||
{
|
||||
player->goalAnimState = LS_JUMP_FORWARD;
|
||||
}
|
||||
|
||||
if (TrInput & IN_ROLL)
|
||||
{
|
||||
player->goalAnimState = LS_SLIDE_TURN_180;
|
||||
//SetLaraSlide(item, coll); // Temp: Lara slides up the slope otherwise.
|
||||
}
|
||||
}
|
||||
|
||||
void lara_col_slide(ITEM_INFO* item, COLL_INFO* coll)//1C108(<), 1C23C(<) (F)
|
||||
{
|
||||
/*state 24*/
|
||||
/*state code: lara_as_slide*/
|
||||
Lara.moveAngle = 0;
|
||||
lara_slide_slope(item, coll);
|
||||
Lara.moveAngle = ANGLE(0.0f);
|
||||
|
||||
coll->badPos = NO_BAD_POS;
|
||||
coll->badNeg = -512;
|
||||
coll->badCeiling = 0;
|
||||
coll->facing = Lara.moveAngle;
|
||||
|
||||
if (TestLaraHitCeiling(coll))
|
||||
{
|
||||
SetLaraHitCeiling(item, coll);
|
||||
return;
|
||||
}
|
||||
|
||||
GetCollisionInfo(coll, item->pos.xPos, item->pos.yPos, item->pos.zPos, item->roomNumber, LARA_HITE);
|
||||
|
||||
LaraDeflectEdge(item, coll);
|
||||
|
||||
if (coll->midFloor <= 200)
|
||||
{
|
||||
item->pos.yPos += coll->midFloor;
|
||||
|
||||
if (!TestLaraSlide(coll))
|
||||
{
|
||||
item->goalAnimState = (TrInput & IN_FORWARD) ? LS_RUN_FORWARD : LS_STOP;
|
||||
|
||||
StopSoundEffect(SFX_LARA_SLIPPING);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (TrInput & IN_ACTION && coll->midFloor >= 1024 && EnableSafetyDrop)
|
||||
{
|
||||
item->goalAnimState = LS_SAFE_DROP;
|
||||
}
|
||||
else
|
||||
{
|
||||
item->goalAnimState = LS_FALL;
|
||||
}
|
||||
|
||||
item->gravityStatus = true;
|
||||
item->fallspeed = 0;
|
||||
|
||||
StopSoundEffect(SFX_LARA_SLIPPING);
|
||||
}
|
||||
}
|
||||
|
||||
void lara_as_slideback(ITEM_INFO* item, COLL_INFO* coll)//1A9E0(<), 1AB14(<) (F)
|
||||
// State: 32
|
||||
// Collision: lara_col_SlideBack()
|
||||
void lara_as_slide_back(ITEM_INFO* item, COLL_INFO* coll)//1A9E0(<), 1AB14(<) (F)
|
||||
{
|
||||
/*state 32*/
|
||||
/*collision: lara_col_slideback*/
|
||||
if ((TrInput & IN_JUMP) && !(TrInput & IN_FORWARD))
|
||||
Camera.targetElevation = item->pos.xRot;
|
||||
|
||||
//if (TrInput & IN_FORWARD)
|
||||
// item->goalAnimState = LS_SLIDE_STEEP_BACK;
|
||||
|
||||
if (TrInput & IN_JUMP)
|
||||
{
|
||||
item->goalAnimState = LS_JUMP_BACK;
|
||||
}
|
||||
|
||||
/*if (TrInput & IN_ROLL)
|
||||
{
|
||||
item->pos.yRot += ANGLE(180.0f);
|
||||
item->goalAnimState = LS_SLIDE_FORWARD;
|
||||
SetLaraSlide(item, coll);
|
||||
}*/
|
||||
}
|
||||
|
||||
void lara_col_slide_back(ITEM_INFO* item, COLL_INFO* coll)//1C284(<), 1C3B8(<) (F)
|
||||
{
|
||||
Lara.moveAngle = ANGLE(180.0f);
|
||||
|
||||
coll->badPos = NO_BAD_POS;
|
||||
coll->badNeg = -512;
|
||||
coll->badCeiling = 0;
|
||||
coll->facing = Lara.moveAngle;
|
||||
|
||||
if (TestLaraHitCeiling(coll))
|
||||
{
|
||||
SetLaraHitCeiling(item, coll);
|
||||
return;
|
||||
}
|
||||
|
||||
GetCollisionInfo(coll, item->pos.xPos, item->pos.yPos, item->pos.zPos, item->roomNumber, LARA_HITE);
|
||||
|
||||
LaraDeflectEdge(item, coll);
|
||||
|
||||
if (coll->midFloor <= 200)
|
||||
{
|
||||
item->pos.yPos += coll->midFloor;
|
||||
|
||||
if (!TestLaraSlide(coll))
|
||||
{
|
||||
item->goalAnimState = LS_STOP;
|
||||
StopSoundEffect(SFX_LARA_SLIPPING);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (TrInput & IN_ACTION && coll->midFloor >= 1024 && EnableSafetyDrop)
|
||||
{
|
||||
item->goalAnimState = LS_SAFE_DROP;
|
||||
}
|
||||
else
|
||||
{
|
||||
item->goalAnimState = LS_FALL_BACK;
|
||||
}
|
||||
|
||||
item->gravityStatus = true;
|
||||
item->fallspeed = 0;
|
||||
|
||||
StopSoundEffect(SFX_LARA_SLIPPING);
|
||||
}
|
||||
}
|
||||
|
||||
// TODO: Unique handling for steep slopes. Anims on the way.
|
||||
void lara_as_steep_slide(ITEM_INFO* item, COLL_INFO* coll)
|
||||
{
|
||||
if (item->pos.xRot >= ANGLE(60))
|
||||
{
|
||||
Camera.targetElevation = ANGLE(-60.0f);
|
||||
}
|
||||
else
|
||||
{
|
||||
Camera.targetElevation = ANGLE(-45.0f);
|
||||
}
|
||||
|
||||
if (TrInput & IN_FORWARD)
|
||||
{
|
||||
item->goalAnimState = LS_SLIDE_FORWARD;
|
||||
}
|
||||
|
||||
if (TrInput & IN_JUMP)
|
||||
{
|
||||
item->goalAnimState = LS_JUMP_FORWARD;
|
||||
}
|
||||
}
|
||||
|
||||
void lara_col_steep_slide(ITEM_INFO* item, COLL_INFO* coll)
|
||||
{
|
||||
Lara.moveAngle = ANGLE(0.0f);
|
||||
PerformLaraSlide(item, coll);
|
||||
}
|
||||
|
||||
void lara_as_steep_slide_back(ITEM_INFO* item, COLL_INFO* coll)
|
||||
{
|
||||
Camera.targetElevation = ANGLE(-60.0f);
|
||||
|
||||
if (TrInput & IN_BACK)
|
||||
{
|
||||
item->goalAnimState = LS_SLIDE_BACK;
|
||||
}
|
||||
|
||||
if (TrInput & IN_JUMP)
|
||||
{
|
||||
item->goalAnimState = LS_JUMP_BACK;
|
||||
}
|
||||
}
|
||||
|
||||
void lara_col_slideback(ITEM_INFO* item, COLL_INFO* coll)//1C284(<), 1C3B8(<) (F)
|
||||
void lara_col_steep_slide_back(ITEM_INFO* item, COLL_INFO* coll)
|
||||
{
|
||||
/*state 32*/
|
||||
/*state code: lara_as_slideback*/
|
||||
Lara.moveAngle = ANGLE(180);
|
||||
lara_slide_slope(item, coll);
|
||||
Lara.moveAngle = ANGLE(180.0f);
|
||||
PerformLaraSlide(item, coll);
|
||||
}
|
||||
/*end Lara state code*/
|
||||
|
||||
void lara_as_slide_turn_180(ITEM_INFO* item, COLL_INFO* coll)
|
||||
{
|
||||
Lara.moveAngle = ANGLE(0.0f);
|
||||
}
|
||||
|
||||
// TODO: Straddling illegal slopes.
|
||||
// TODO: Grabbing edge of plateau leading to steep slope.
|
||||
|
|
|
@ -1,15 +1,25 @@
|
|||
#pragma once
|
||||
#include "lara_struct.h"
|
||||
|
||||
/*Tests and others*/
|
||||
int TestLaraSlide(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_slide_slope(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void LaraSlideEdgeJump(ITEM_INFO* item, COLL_INFO* coll);
|
||||
/*end tests and others*/
|
||||
/*-*/
|
||||
/*Lara state code*/
|
||||
#define SLOPE_ANGLE_NORMAL ANGLE(30.0f)
|
||||
#define SLOPE_ANGLE_STEEP ANGLE(60.0f)
|
||||
|
||||
// Auxiliary functions.
|
||||
bool TestLaraSlide(COLL_INFO* coll);
|
||||
float GetLaraSlideDirection(COLL_INFO* coll);
|
||||
void SetLaraSlide(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void PerformLaraSlide(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void PerformLaraSlideEdgeJump(ITEM_INFO* item, COLL_INFO* coll);
|
||||
|
||||
int Old_TestLaraSlide(ITEM_INFO* item, COLL_INFO* coll);
|
||||
|
||||
// Sliding control & collision functions.
|
||||
void lara_as_slide(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_col_slide(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_as_slideback(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_col_slideback(ITEM_INFO* item, COLL_INFO* coll);
|
||||
/*end Lara state code*/
|
||||
void lara_as_slide_back(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_col_slide_back(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_as_steep_slide(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_col_steep_slide(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_as_steep_slide_back(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_col_steep_slide_back(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_as_slide_turn_180(ITEM_INFO* item, COLL_INFO* coll);
|
||||
|
|
|
@ -35,7 +35,7 @@ enum LARA_STATE
|
|||
LS_UNDERWATER_FORWARD = 17,
|
||||
LS_UNDERWATER_INERTIA = 18,
|
||||
LS_GRABBING = 19,
|
||||
LS_TURN_FAST = 20,
|
||||
LS_TURN_RIGHT_FAST = 20,
|
||||
LS_STEP_RIGHT = 21,
|
||||
LS_STEP_LEFT = 22,
|
||||
LS_ROLL_BACK = 23,
|
||||
|
@ -177,6 +177,15 @@ enum LARA_STATE
|
|||
LS_STEP_BACK_DOWN = 149,
|
||||
LS_LADDER_DISMOUNT_LEFT = 150,
|
||||
LS_LADDER_DISMOUNT_RIGHT = 151,
|
||||
|
||||
LS_SLIDE_STEEP_FORWARD = 152,
|
||||
LS_SLIDE_STEEP_BACK = 153,
|
||||
LS_SLIDE_TURN_180 = 154,
|
||||
LS_FALL = 155, // This is needed if we are to have a fall anim dispatch from slide states, as LS_JUMP_FORWARD is already used to leap off.
|
||||
LS_TURN_LEFT_FAST = 156,
|
||||
LS_SAFE_DROP = 157,
|
||||
/*LS_POLE_UP = 158,
|
||||
LS_POLE_DOWN = 159,*/ // I broke poles, sorry. :/ I'll get to it later. -Sezz
|
||||
|
||||
NUM_LARA_STATES
|
||||
};
|
||||
|
@ -721,6 +730,34 @@ enum LARA_ANIM
|
|||
LA_LADDER_DISMOUNT_RIGHT_END = 500, // Ladder dismount right (2/2)
|
||||
LA_ONWATER_TO_LADDER = 501, // Tread water > climb to ladder idle
|
||||
|
||||
// RESERVED.
|
||||
LA_SLIDE_FORWARD_JUMP = 502, // Slide forward > jump forwad
|
||||
LA_SLIDE_FORWARD_TURN_180 = 503, // Slide forward > slide back
|
||||
LA_SLIDE_BACK_JUMP = 504, // Slide back > jump back
|
||||
LA_SLIDE_BACK_TURN_180 = 505, // Slide back > slide forward
|
||||
LA_SLIDE_FORWARD_TO_STEEP = 506, // Slide forward, normal > slide forward, steep
|
||||
LA_SLIDE_STEEP_FORWARD_TO_NORMAL = 507, // Slide forward, steep > slide forward, normal
|
||||
LA_SLIDE_STEEP_FORWARD_START = 508, // Land on slope > slide forward, steep
|
||||
LA_SLIDE_STEEP_FORWARD = 509, // Slide forward, steep (looped)
|
||||
LA_SLIDE_STEEP_FORWARD_END = 510, // Slide forward, steep > stand
|
||||
LA_SLIDE_STEEP_FORWARD_JUMP = 511, // Slide forward > jump forward
|
||||
LA_SLIDE_BACK_TO_STEEP = 512, // Slide back, normal > slide back, steep
|
||||
LA_SLIDE_STEEP_BACK_TO_NORMAL = 513, // Slide back, steep > slide back, normal
|
||||
LA_SLIDE_STEEP_BACK_START = 514, // Land on slope > slide forward, steep
|
||||
LA_SLIDE_STEEP_BACK = 515, // Slide back, steep (looped)
|
||||
LA_SLIDE_STEEP_BACK_END = 516, // Slide back, steep > stand
|
||||
LA_SLIDE_STEEP_BACK_JUMP = 517, // Slide back, steep > jump forward
|
||||
LA_SLIDE_FORWARD_LEDGE = 518, // Slide forward > grab ledge
|
||||
LA_SLIDE_BACK_LEDGE = 519, // Slide back > grab ledge
|
||||
LA_STAND_CROSS_ARMS_AFK_START = 520, // Stand idle > cross arms AFK
|
||||
LA_STAND_CROSS_ARMS_AFK = 521, // Cross arms AKF (looped)
|
||||
LA_STAND_CROSS_ARMS_AFK_END = 522, // Cross arms AFK > stand idle
|
||||
LA_ROLL_180_ALTERNATE = 523, // Standing mid-air roll 180
|
||||
LA_SPRINT_TO_SPRINT_DIVE_LEFT = 524, // Sprint > sprint dive, left foot first
|
||||
LA_SPRINT_TO_SPRINT_DIVE_RIGHT = 525, // Sprint > sprint dive, right foot first
|
||||
LA_SPRINT_DIVE_TO_RUN = 526, // Sprint dive > run
|
||||
LA_SPRINT_DIVE = 527, // Sprint dive, leading to swandive freefall
|
||||
|
||||
NUM_LARA_ANIMS
|
||||
};
|
||||
#pragma endregion
|
||||
|
|
|
@ -25,32 +25,34 @@ void lara_col_surftread(ITEM_INFO* item, COLL_INFO* coll)
|
|||
item->fallspeed = 80;
|
||||
Lara.waterStatus = LW_UNDERWATER;
|
||||
}
|
||||
|
||||
Lara.moveAngle = 0;
|
||||
LaraSurfaceCollision(item, coll);
|
||||
}
|
||||
|
||||
void lara_col_surfright(ITEM_INFO* item, COLL_INFO* coll)//4DD90(<), 4E1F4(<) (F)
|
||||
{
|
||||
Lara.moveAngle = ANGLE(90);
|
||||
Lara.moveAngle = ANGLE(90.0f);
|
||||
LaraSurfaceCollision(item, coll);
|
||||
}
|
||||
|
||||
void lara_col_surfleft(ITEM_INFO* item, COLL_INFO* coll)//4DD64(<), 4E1C8(<) (F)
|
||||
{
|
||||
Lara.moveAngle = -ANGLE(90);
|
||||
Lara.moveAngle = ANGLE(-90.0f);
|
||||
LaraSurfaceCollision(item, coll);
|
||||
}
|
||||
|
||||
void lara_col_surfback(ITEM_INFO* item, COLL_INFO* coll)//4DD38(<), 4E19C(<) (F)
|
||||
{
|
||||
Lara.moveAngle = ANGLE(180);
|
||||
Lara.moveAngle = ANGLE(180.0f);
|
||||
LaraSurfaceCollision(item, coll);
|
||||
}
|
||||
|
||||
void lara_col_surfswim(ITEM_INFO* item, COLL_INFO* coll)//4DCE8(<), 4E14C(<) (F)
|
||||
{
|
||||
coll->badNeg = -384;
|
||||
Lara.moveAngle = 0;
|
||||
coll->badNeg = -384;
|
||||
|
||||
LaraSurfaceCollision(item, coll);
|
||||
LaraTestWaterClimbOut(item, coll);
|
||||
LaraTestLadderClimbOut(item, coll);
|
||||
|
@ -60,7 +62,9 @@ void lara_as_surftread(ITEM_INFO* item, COLL_INFO* coll)//4DBA0, 4E004 (F)
|
|||
{
|
||||
item->fallspeed -= 4;
|
||||
if (item->fallspeed < 0)
|
||||
{
|
||||
item->fallspeed = 0;
|
||||
}
|
||||
|
||||
if (item->hitPoints <= 0)
|
||||
{
|
||||
|
@ -76,11 +80,11 @@ void lara_as_surftread(ITEM_INFO* item, COLL_INFO* coll)//4DBA0, 4E004 (F)
|
|||
|
||||
if (TrInput & IN_LEFT)
|
||||
{
|
||||
item->pos.yRot -= ANGLE(4);
|
||||
item->pos.yRot -= ANGLE(4.0f);
|
||||
}
|
||||
else if (TrInput & IN_RIGHT)
|
||||
{
|
||||
item->pos.yRot += ANGLE(4);
|
||||
item->pos.yRot += ANGLE(4.0f);
|
||||
}
|
||||
|
||||
if (TrInput & IN_FORWARD)
|
||||
|
@ -105,7 +109,9 @@ void lara_as_surftread(ITEM_INFO* item, COLL_INFO* coll)//4DBA0, 4E004 (F)
|
|||
{
|
||||
Lara.diveCount++;
|
||||
if (Lara.diveCount == 10)
|
||||
{
|
||||
item->goalAnimState = LS_UNDERWATER_FORWARD;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -125,11 +131,11 @@ void lara_as_surfright(ITEM_INFO* item, COLL_INFO* coll)//4DAF8, 4DF5C (F)
|
|||
|
||||
if (TrInput & IN_LEFT)
|
||||
{
|
||||
item->pos.yRot -= ANGLE(2);
|
||||
item->pos.yRot -= ANGLE(2.0f);
|
||||
}
|
||||
else if (TrInput & IN_RIGHT)
|
||||
{
|
||||
item->pos.yRot += ANGLE(2);
|
||||
item->pos.yRot += ANGLE(2.0f);
|
||||
}
|
||||
|
||||
if (!(TrInput & IN_RSTEP))
|
||||
|
@ -139,7 +145,9 @@ void lara_as_surfright(ITEM_INFO* item, COLL_INFO* coll)//4DAF8, 4DF5C (F)
|
|||
|
||||
item->fallspeed += 8;
|
||||
if (item->fallspeed > 60)
|
||||
{
|
||||
item->fallspeed = 60;
|
||||
}
|
||||
}
|
||||
|
||||
void lara_as_surfleft(ITEM_INFO* item, COLL_INFO* coll)//4DA50(<), 4DEB4(<) (F)
|
||||
|
@ -154,11 +162,11 @@ void lara_as_surfleft(ITEM_INFO* item, COLL_INFO* coll)//4DA50(<), 4DEB4(<) (F)
|
|||
|
||||
if (TrInput & IN_LEFT)
|
||||
{
|
||||
item->pos.yRot -= ANGLE(2);
|
||||
item->pos.yRot -= ANGLE(2.0f);
|
||||
}
|
||||
else if (TrInput & IN_RIGHT)
|
||||
{
|
||||
item->pos.yRot += ANGLE(2);
|
||||
item->pos.yRot += ANGLE(2.0f);
|
||||
}
|
||||
|
||||
if (!(TrInput & IN_LSTEP))
|
||||
|
@ -168,7 +176,9 @@ void lara_as_surfleft(ITEM_INFO* item, COLL_INFO* coll)//4DA50(<), 4DEB4(<) (F)
|
|||
|
||||
item->fallspeed += 8;
|
||||
if (item->fallspeed > 60)
|
||||
{
|
||||
item->fallspeed = 60;
|
||||
}
|
||||
}
|
||||
|
||||
void lara_as_surfback(ITEM_INFO* item, COLL_INFO* coll)//4D9A8(<), 4DE0C(<) (F)
|
||||
|
@ -183,11 +193,11 @@ void lara_as_surfback(ITEM_INFO* item, COLL_INFO* coll)//4D9A8(<), 4DE0C(<) (F)
|
|||
|
||||
if (TrInput & IN_LEFT)
|
||||
{
|
||||
item->pos.yRot -= ANGLE(2);
|
||||
item->pos.yRot -= ANGLE(2.0f);
|
||||
}
|
||||
else if (TrInput & IN_RIGHT)
|
||||
{
|
||||
item->pos.yRot += ANGLE(2);
|
||||
item->pos.yRot += ANGLE(2.0f);
|
||||
}
|
||||
|
||||
if (!(TrInput & IN_BACK))
|
||||
|
@ -197,7 +207,9 @@ void lara_as_surfback(ITEM_INFO* item, COLL_INFO* coll)//4D9A8(<), 4DE0C(<) (F)
|
|||
|
||||
item->fallspeed += 8;
|
||||
if (item->fallspeed > 60)
|
||||
{
|
||||
item->fallspeed = 60;
|
||||
}
|
||||
}
|
||||
|
||||
void lara_as_surfswim(ITEM_INFO* item, COLL_INFO* coll)//4D8E4(<), 4DD48(<) (F)
|
||||
|
@ -220,13 +232,19 @@ void lara_as_surfswim(ITEM_INFO* item, COLL_INFO* coll)//4D8E4(<), 4DD48(<) (F)
|
|||
}
|
||||
|
||||
if (!(TrInput & IN_FORWARD))
|
||||
{
|
||||
item->goalAnimState = LS_ONWATER_STOP;
|
||||
}
|
||||
if (TrInput & IN_JUMP)
|
||||
{
|
||||
item->goalAnimState = LS_ONWATER_STOP;
|
||||
}
|
||||
|
||||
item->fallspeed += 8;
|
||||
if (item->fallspeed > 60)
|
||||
{
|
||||
item->fallspeed = 60;
|
||||
}
|
||||
}
|
||||
|
||||
void LaraSurfaceCollision(ITEM_INFO* item, COLL_INFO* coll)//4D4F0(<), 4D954(<) (F)
|
||||
|
@ -246,11 +264,11 @@ void LaraSurfaceCollision(ITEM_INFO* item, COLL_INFO* coll)//4D4F0(<), 4D954(<)
|
|||
}
|
||||
else if (coll->collType == CT_LEFT)
|
||||
{
|
||||
item->pos.yRot += ANGLE(5);
|
||||
item->pos.yRot += ANGLE(5.0f);
|
||||
}
|
||||
else if (coll->collType == CT_RIGHT)
|
||||
{
|
||||
item->pos.yRot -= ANGLE(5);
|
||||
item->pos.yRot -= ANGLE(5.0f);
|
||||
}
|
||||
|
||||
if (GetWaterHeight(item->pos.xPos, item->pos.yPos, item->pos.zPos, item->roomNumber) - item->pos.yPos > -100)
|
||||
|
@ -272,7 +290,9 @@ void LaraSurfaceCollision(ITEM_INFO* item, COLL_INFO* coll)//4D4F0(<), 4D954(<)
|
|||
int LaraTestWaterClimbOut(ITEM_INFO* item, COLL_INFO* coll)//4D22C, 4D690
|
||||
{
|
||||
if (coll->collType != CT_FRONT || !(TrInput & IN_ACTION))
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
// FOR DEBUG PURPOSES UNTIL SCRIPTING IS READY-
|
||||
EnableCrawlFlexWaterPullUp = false;
|
||||
|
@ -280,18 +300,26 @@ int LaraTestWaterClimbOut(ITEM_INFO* item, COLL_INFO* coll)//4D22C, 4D690
|
|||
|
||||
|
||||
if (Lara.gunStatus && (Lara.gunStatus != LG_READY || Lara.gunType != WEAPON_FLARE))
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (coll->frontCeiling > 0)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (coll->midCeiling > -384)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
int frontFloor = coll->frontFloor + 700;
|
||||
int frontCeiling = coll->frontCeiling + 700;
|
||||
if (frontFloor <= -512 || frontFloor > 316)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
short rot = item->pos.yRot;
|
||||
int slope = 0;
|
||||
|
@ -304,13 +332,17 @@ int LaraTestWaterClimbOut(ITEM_INFO* item, COLL_INFO* coll)//4D22C, 4D690
|
|||
else
|
||||
{
|
||||
if (abs(coll->rightFloor2 - coll->leftFloor2) >= 60)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
result = SnapToQuadrant(rot, 35);
|
||||
}
|
||||
|
||||
if (!result)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
item->pos.yPos += frontFloor - 5;
|
||||
|
||||
|
@ -353,8 +385,10 @@ int LaraTestWaterClimbOut(ITEM_INFO* item, COLL_INFO* coll)//4D22C, 4D690
|
|||
item->goalAnimState = LA_CROUCH_IDLE;
|
||||
}
|
||||
else
|
||||
{
|
||||
item->animNumber = LA_ONWATER_TO_STAND_M1CLICK;
|
||||
item->frameNumber = g_Level.Anims[item->animNumber].frameBase;
|
||||
item->frameNumber = g_Level.Anims[item->animNumber].frameBase;
|
||||
}
|
||||
}
|
||||
|
||||
else
|
||||
|
@ -371,19 +405,17 @@ int LaraTestWaterClimbOut(ITEM_INFO* item, COLL_INFO* coll)//4D22C, 4D690
|
|||
item->frameNumber = g_Level.Anims[item->animNumber].frameBase;
|
||||
item->goalAnimState = LS_STOP;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
Lara.gunStatus = LG_HANDS_BUSY;
|
||||
Lara.waterStatus = LW_ABOVE_WATER;
|
||||
item->currentAnimState = LS_ONWATER_EXIT;
|
||||
item->pos.yRot = rot;
|
||||
Lara.gunStatus = LG_HANDS_BUSY;
|
||||
item->pos.zRot = 0;
|
||||
item->pos.xRot = 0;
|
||||
item->gravityStatus = false;
|
||||
item->speed = 0;
|
||||
item->fallspeed = 0;
|
||||
Lara.waterStatus = LW_ABOVE_WATER;
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
@ -442,27 +474,33 @@ int LaraTestWaterStepOut(ITEM_INFO* item, COLL_INFO* coll)//4D100, 4D564 (F)
|
|||
int LaraTestLadderClimbOut(ITEM_INFO* item, COLL_INFO* coll) // NEW function for water to ladder move
|
||||
{
|
||||
if (!Lara.climbStatus || coll->collType != CT_FRONT || !(TrInput & IN_ACTION))
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (Lara.gunStatus && (Lara.gunStatus != LG_READY || Lara.gunType != WEAPON_FLARE))
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (!LaraTestClimbStance(item, coll))
|
||||
return 0;
|
||||
|
||||
short rot = item->pos.yRot;
|
||||
|
||||
if (rot >= -ANGLE(35.0f) && rot <= ANGLE(35.0f))
|
||||
if (rot >= ANGLE(-35.0f) && rot <= ANGLE(35.0f))
|
||||
rot = 0;
|
||||
else if (rot >= ANGLE(55.0f) && rot <= ANGLE(125.0f))
|
||||
rot = ANGLE(90.0f);
|
||||
else if (rot >= ANGLE(145.0f) || rot <= -ANGLE(145.0f))
|
||||
else if (rot >= ANGLE(145.0f) || rot <= ANGLE(-145.0f))
|
||||
rot = ANGLE(180.0f);
|
||||
else if (rot >= -ANGLE(125.0f) && rot <= -ANGLE(55.0f))
|
||||
else if (rot >= ANGLE(-125.0f) && rot <= ANGLE(-55.0f))
|
||||
rot = -ANGLE(90.0f);
|
||||
|
||||
if (rot & 0x3FFF)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
switch ((unsigned short)rot / ANGLE(90.0f))
|
||||
{
|
||||
|
@ -489,22 +527,23 @@ int LaraTestLadderClimbOut(ITEM_INFO* item, COLL_INFO* coll) // NEW function for
|
|||
item->goalAnimState = LS_LADDER_IDLE;
|
||||
AnimateLara(item);
|
||||
|
||||
item->pos.yRot = rot;
|
||||
Lara.gunStatus = LG_HANDS_BUSY;
|
||||
Lara.waterStatus = LW_ABOVE_WATER;
|
||||
item->pos.yRot = rot;
|
||||
item->pos.zRot = 0;
|
||||
item->pos.xRot = 0;
|
||||
item->gravityStatus = false;
|
||||
item->speed = 0;
|
||||
item->fallspeed = 0;
|
||||
Lara.waterStatus = LW_ABOVE_WATER;
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
void lara_as_waterout(ITEM_INFO* item, COLL_INFO* coll)//1AEE4(<), 1B018(<) (F)
|
||||
{
|
||||
Camera.flags = CF_FOLLOW_CENTER;
|
||||
|
||||
coll->enableBaddiePush = false;
|
||||
coll->enableSpaz = false;
|
||||
Camera.flags = CF_FOLLOW_CENTER;
|
||||
}
|
||||
|
||||
|
|
|
@ -1,7 +1,5 @@
|
|||
#pragma once
|
||||
|
||||
|
||||
#include "Lara.h"
|
||||
#include "lara.h"
|
||||
|
||||
void _cdecl lara_col_surftread(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void _cdecl lara_col_surfright(ITEM_INFO* item, COLL_INFO* coll);
|
||||
|
|
|
@ -15,17 +15,15 @@
|
|||
#include "sound.h"
|
||||
#include "GameFlowScript.h"
|
||||
|
||||
typedef struct SUBSUIT_INFO
|
||||
{
|
||||
short XRot;
|
||||
short dXRot;
|
||||
short XRotVel;
|
||||
short Vel[2];
|
||||
short YVel;
|
||||
};
|
||||
SUBSUIT_INFO Subsuit;
|
||||
SubsuitInfo Subsuit;
|
||||
byte SubHitCount = 0;
|
||||
|
||||
// SWIMMING
|
||||
|
||||
// ------------------------------
|
||||
// Auxillary functions
|
||||
// ------------------------------
|
||||
|
||||
void LaraWaterCurrent(COLL_INFO* coll) // (F) (D)
|
||||
{
|
||||
if (Lara.currentActive)
|
||||
|
@ -43,25 +41,41 @@ void LaraWaterCurrent(COLL_INFO* coll) // (F) (D)
|
|||
int shift = 0;
|
||||
|
||||
if (abs(Lara.currentXvel) <= 16)
|
||||
{
|
||||
shift = (abs(Lara.currentXvel) > 8) + 2;
|
||||
}
|
||||
else
|
||||
{
|
||||
shift = 4;
|
||||
}
|
||||
|
||||
Lara.currentXvel -= Lara.currentXvel >> shift;
|
||||
|
||||
if (abs(Lara.currentXvel) < 4)
|
||||
{
|
||||
Lara.currentXvel = 0;
|
||||
}
|
||||
|
||||
if (abs(Lara.currentZvel) <= 16)
|
||||
{
|
||||
shift = (abs(Lara.currentZvel) > 8) + 2;
|
||||
}
|
||||
else
|
||||
{
|
||||
shift = 4;
|
||||
}
|
||||
|
||||
Lara.currentZvel -= Lara.currentZvel >> shift;
|
||||
|
||||
if (abs(Lara.currentZvel) < 4)
|
||||
{
|
||||
Lara.currentZvel = 0;
|
||||
}
|
||||
|
||||
if (!Lara.currentXvel && !Lara.currentZvel)
|
||||
{
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
LaraItem->pos.xPos += Lara.currentXvel >> 8;
|
||||
|
@ -75,11 +89,17 @@ void LaraWaterCurrent(COLL_INFO* coll) // (F) (D)
|
|||
if (coll->collType == CT_FRONT)
|
||||
{
|
||||
if (LaraItem->pos.xRot > ANGLE(35))
|
||||
{
|
||||
LaraItem->pos.xRot += ANGLE(1);
|
||||
}
|
||||
else if (LaraItem->pos.xRot < -ANGLE(35))
|
||||
{
|
||||
LaraItem->pos.xRot -= ANGLE(1);
|
||||
}
|
||||
else
|
||||
{
|
||||
LaraItem->fallspeed = 0;
|
||||
}
|
||||
}
|
||||
else if (coll->collType == CT_TOP)
|
||||
{
|
||||
|
@ -181,190 +201,6 @@ int GetWaterDepth(int x, int y, int z, short roomNumber)//4CA38, 4CE9C
|
|||
}
|
||||
}
|
||||
|
||||
void lara_col_waterroll(ITEM_INFO* item, COLL_INFO* coll)//4CA18(<), 4CE7C(<) (F)
|
||||
{
|
||||
LaraSwimCollision(item, coll);
|
||||
}
|
||||
|
||||
void lara_col_uwdeath(ITEM_INFO* item, COLL_INFO* coll)//4C980(<), 4CDE4(<) (F)
|
||||
{
|
||||
item->hitPoints = -1;
|
||||
Lara.air = -1;
|
||||
Lara.gunStatus = LG_HANDS_BUSY;
|
||||
int wh = GetWaterHeight(item->pos.xPos, item->pos.yPos, item->pos.zPos, item->roomNumber);
|
||||
if (wh != NO_HEIGHT)
|
||||
{
|
||||
if (wh < item->pos.yPos - 100)
|
||||
item->pos.yPos -= 5;
|
||||
}
|
||||
LaraSwimCollision(item, coll);
|
||||
}
|
||||
|
||||
void lara_col_dive(ITEM_INFO* item, COLL_INFO* coll)//4C960(<), 4CDC4(<) (F)
|
||||
{
|
||||
LaraSwimCollision(item, coll);
|
||||
}
|
||||
|
||||
void lara_col_tread(ITEM_INFO* item, COLL_INFO* coll)//4C940(<), 4CDA4(<) (F)
|
||||
{
|
||||
LaraSwimCollision(item, coll);
|
||||
}
|
||||
|
||||
void lara_col_glide(ITEM_INFO* item, COLL_INFO* coll)//4C920(<), 4CD84(<) (F)
|
||||
{
|
||||
LaraSwimCollision(item, coll);
|
||||
}
|
||||
|
||||
void lara_col_swim(ITEM_INFO* item, COLL_INFO* coll)//4C900(<), 4CD64(<) (F)
|
||||
{
|
||||
LaraSwimCollision(item, coll);
|
||||
}
|
||||
|
||||
void lara_as_waterroll(ITEM_INFO* item, COLL_INFO* coll)//4C8F8(<), 4CD5C(<) (F)
|
||||
{
|
||||
item->fallspeed = 0;
|
||||
}
|
||||
|
||||
void lara_as_uwdeath(ITEM_INFO* item, COLL_INFO* coll)//4C884(<), 4CCE8(<) (F)
|
||||
{
|
||||
Lara.look = 0;
|
||||
|
||||
item->fallspeed -= 8;
|
||||
if (item->fallspeed <= 0)
|
||||
item->fallspeed = 0;
|
||||
|
||||
if (item->pos.xRot < -ANGLE(2) || item->pos.xRot > ANGLE(2))
|
||||
{
|
||||
if (item->pos.xRot >= 0)
|
||||
item->pos.xRot -= ANGLE(2);
|
||||
else
|
||||
item->pos.xRot += ANGLE(2);
|
||||
}
|
||||
else
|
||||
{
|
||||
item->pos.xRot = 0;
|
||||
}
|
||||
}
|
||||
|
||||
void lara_as_dive(ITEM_INFO* item, COLL_INFO* coll)//4C854, 4CCB8 (F)
|
||||
{
|
||||
if (TrInput & IN_FORWARD)
|
||||
{
|
||||
item->pos.xRot -= ANGLE(1);
|
||||
}
|
||||
}
|
||||
|
||||
void lara_as_tread(ITEM_INFO* item, COLL_INFO* coll)//4C730, 4CB94 (F)
|
||||
{
|
||||
if (item->hitPoints <= 0)
|
||||
{
|
||||
item->goalAnimState = LS_WATER_DEATH;
|
||||
return;
|
||||
}
|
||||
|
||||
if (TrInput & IN_ROLL && LaraDrawType != LARA_DIVESUIT)
|
||||
{
|
||||
item->currentAnimState = LS_UNDERWATER_ROLL;
|
||||
item->animNumber = LA_UNDERWATER_ROLL_180_START;
|
||||
item->frameNumber = g_Level.Anims[item->animNumber].frameBase;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (TrInput & IN_LOOK)
|
||||
LookUpDown();
|
||||
|
||||
if (LaraDrawType == LARA_DIVESUIT)
|
||||
SwimTurnSubsuit(item);
|
||||
else
|
||||
SwimTurn(item);
|
||||
|
||||
if (TrInput & IN_JUMP)
|
||||
item->goalAnimState = LS_UNDERWATER_FORWARD;
|
||||
|
||||
item->fallspeed -= 6;
|
||||
|
||||
if (item->fallspeed < 0)
|
||||
item->fallspeed = 0;
|
||||
|
||||
if (Lara.gunStatus == LG_HANDS_BUSY)
|
||||
Lara.gunStatus = LG_NO_ARMS;
|
||||
}
|
||||
}
|
||||
|
||||
void lara_as_glide(ITEM_INFO* item, COLL_INFO* coll)//4C634(<), 4CA98(<) (F)
|
||||
{
|
||||
if (item->hitPoints <= 0)
|
||||
{
|
||||
item->goalAnimState = LS_WATER_DEATH;
|
||||
return;
|
||||
}
|
||||
|
||||
if (TrInput & IN_ROLL)
|
||||
{
|
||||
if (LaraDrawType != LARA_DIVESUIT)
|
||||
{
|
||||
item->currentAnimState = LS_UNDERWATER_ROLL;
|
||||
item->animNumber = LA_UNDERWATER_ROLL_180_START;
|
||||
item->frameNumber = g_Level.Anims[item->animNumber].frameBase;
|
||||
return;
|
||||
}
|
||||
}
|
||||
else if (LaraDrawType != LARA_DIVESUIT)
|
||||
{
|
||||
SwimTurn(item);
|
||||
}
|
||||
else
|
||||
{
|
||||
SwimTurnSubsuit(item);
|
||||
}
|
||||
|
||||
if (TrInput & IN_JUMP)
|
||||
item->goalAnimState = LS_UNDERWATER_FORWARD;
|
||||
|
||||
item->fallspeed -= 6;
|
||||
if (item->fallspeed < 0)
|
||||
item->fallspeed = 0;
|
||||
|
||||
if (item->fallspeed <= 133)
|
||||
item->goalAnimState = LS_UNDERWATER_STOP;
|
||||
}
|
||||
|
||||
void lara_as_swim(ITEM_INFO* item, COLL_INFO* coll)//4C548(<), 4C9AC(<) (F)
|
||||
{
|
||||
if (item->hitPoints <= 0)
|
||||
{
|
||||
item->goalAnimState = LS_WATER_DEATH;
|
||||
return;
|
||||
}
|
||||
|
||||
if (TrInput & IN_ROLL)
|
||||
{
|
||||
if (LaraDrawType != LARA_DIVESUIT)
|
||||
{
|
||||
item->currentAnimState = LS_UNDERWATER_ROLL;
|
||||
item->animNumber = LA_UNDERWATER_ROLL_180_START;
|
||||
item->frameNumber = g_Level.Anims[item->animNumber].frameBase;
|
||||
return;
|
||||
}
|
||||
}
|
||||
else if (LaraDrawType != LARA_DIVESUIT)
|
||||
{
|
||||
SwimTurn(item);
|
||||
}
|
||||
else
|
||||
{
|
||||
SwimTurnSubsuit(item);
|
||||
}
|
||||
|
||||
item->fallspeed += 8;
|
||||
|
||||
if (item->fallspeed > 200)
|
||||
item->fallspeed = 200;
|
||||
|
||||
if (!(TrInput & IN_JUMP))
|
||||
item->goalAnimState = LS_UNDERWATER_INERTIA;
|
||||
}
|
||||
|
||||
void UpdateSubsuitAngles()//4BD20, 4C184 (F)
|
||||
{
|
||||
if (Subsuit.YVel != 0)
|
||||
|
@ -437,7 +273,7 @@ void UpdateSubsuitAngles()//4BD20, 4C184 (F)
|
|||
}
|
||||
}
|
||||
|
||||
void SwimTurnSubsuit(ITEM_INFO* item)//4BBDC, 4C040 (F)
|
||||
void DoLaraSubsuitSwimTurn(ITEM_INFO* item)//4BBDC, 4C040 (F)
|
||||
{
|
||||
if (item->pos.yPos < 14080)
|
||||
Subsuit.YVel += (14080 - item->pos.yPos) >> 4;
|
||||
|
@ -475,30 +311,36 @@ void SwimTurnSubsuit(ITEM_INFO* item)//4BBDC, 4C040 (F)
|
|||
}
|
||||
}
|
||||
|
||||
void SwimTurn(ITEM_INFO* item)//4BAF4(<), 4BF58(<) (F)
|
||||
void DoLaraSwimTurn(ITEM_INFO* item)//4BAF4(<), 4BF58(<) (F)
|
||||
{
|
||||
if (TrInput & IN_FORWARD)
|
||||
{
|
||||
item->pos.xRot -= ANGLE(2);
|
||||
item->pos.xRot -= ANGLE(3.5f);
|
||||
}
|
||||
else if (TrInput & IN_BACK)
|
||||
{
|
||||
item->pos.xRot += ANGLE(2);
|
||||
item->pos.xRot += ANGLE(3.0f);
|
||||
}
|
||||
|
||||
if (TrInput & IN_LEFT)
|
||||
{
|
||||
Lara.turnRate -= 409;
|
||||
if (Lara.turnRate < -ANGLE(6))
|
||||
Lara.turnRate = -ANGLE(6);
|
||||
item->pos.zRot -= ANGLE(3);
|
||||
Lara.turnRate -= ANGLE(3.0f);
|
||||
if (Lara.turnRate < ANGLE(-6.0f))
|
||||
{
|
||||
Lara.turnRate = ANGLE(-6.0f);
|
||||
}
|
||||
|
||||
item->pos.zRot -= ANGLE(3.0f);
|
||||
}
|
||||
else if (TrInput & IN_RIGHT)
|
||||
{
|
||||
Lara.turnRate += 409;
|
||||
if (Lara.turnRate > ANGLE(6))
|
||||
Lara.turnRate = ANGLE(6);
|
||||
item->pos.zRot += ANGLE(3);
|
||||
Lara.turnRate += ANGLE(3.0f);
|
||||
if (Lara.turnRate > ANGLE(6.0f))
|
||||
{
|
||||
Lara.turnRate = ANGLE(6.0f);
|
||||
}
|
||||
|
||||
item->pos.zRot += ANGLE(3.0f);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -511,10 +353,10 @@ void LaraSwimCollision(ITEM_INFO* item, COLL_INFO* coll)//4B608, 4BA6C
|
|||
short oldYrot = item->pos.yRot;
|
||||
short oldZrot = item->pos.zRot;
|
||||
|
||||
if (item->pos.xRot < -ANGLE(90) || item->pos.xRot > ANGLE(90))
|
||||
if (item->pos.xRot < ANGLE(-90.0f) || item->pos.xRot > ANGLE(90.0f))
|
||||
{
|
||||
Lara.moveAngle = ANGLE(180);
|
||||
coll->facing = item->pos.yRot - ANGLE(180);
|
||||
Lara.moveAngle = ANGLE(180.0f);
|
||||
coll->facing = item->pos.yRot - ANGLE(180.0f);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -526,38 +368,40 @@ void LaraSwimCollision(ITEM_INFO* item, COLL_INFO* coll)//4B608, 4BA6C
|
|||
height = abs(height);
|
||||
|
||||
if (height < ((LaraDrawType == LARA_DIVESUIT) << 6) + 200)
|
||||
{
|
||||
height = ((LaraDrawType == LARA_DIVESUIT) << 6) + 200;
|
||||
|
||||
}
|
||||
|
||||
coll->badNeg = -64;
|
||||
|
||||
|
||||
COLL_INFO c1;
|
||||
COLL_INFO c2;
|
||||
memcpy(&c1, coll, sizeof(COLL_INFO));
|
||||
memcpy(&c2, coll, sizeof(COLL_INFO) - 2);
|
||||
|
||||
GetCollisionInfo(coll, item->pos.xPos, height / 2 + item->pos.yPos, item->pos.zPos, item->roomNumber, height);
|
||||
|
||||
c1.facing += ANGLE(45);
|
||||
|
||||
c1.facing += ANGLE(45.0f);
|
||||
GetCollisionInfo(&c1, item->pos.xPos, height / 2 + item->pos.yPos, item->pos.zPos, item->roomNumber, height);
|
||||
|
||||
c2.facing -= ANGLE(45);
|
||||
|
||||
c2.facing -= ANGLE(45.0f);
|
||||
GetCollisionInfo(&c2, item->pos.xPos, height / 2 + item->pos.yPos, item->pos.zPos, item->roomNumber, height);
|
||||
|
||||
|
||||
ShiftItem(item, coll);
|
||||
|
||||
|
||||
int flag = 0;
|
||||
|
||||
switch (coll->collType)
|
||||
{
|
||||
case CT_FRONT:
|
||||
if (item->pos.xRot <= ANGLE(25))
|
||||
if (item->pos.xRot <= ANGLE(25.0f))
|
||||
{
|
||||
if (item->pos.xRot >= -ANGLE(25))
|
||||
if (item->pos.xRot >= ANGLE(-25.0f))
|
||||
{
|
||||
if (item->pos.xRot > ANGLE(5))
|
||||
item->pos.xRot += ANGLE(0.5);
|
||||
else if (item->pos.xRot < -ANGLE(5))
|
||||
item->pos.xRot -= ANGLE(0.5);
|
||||
if (item->pos.xRot > ANGLE(5.0f))
|
||||
item->pos.xRot += ANGLE(0.5f);
|
||||
else if (item->pos.xRot < ANGLE(-5.0f))
|
||||
item->pos.xRot -= ANGLE(0.5f);
|
||||
else if (item->pos.xRot > 0)
|
||||
item->pos.xRot += 45;
|
||||
else if (item->pos.xRot < 0)
|
||||
|
@ -602,7 +446,7 @@ void LaraSwimCollision(ITEM_INFO* item, COLL_INFO* coll)//4B608, 4BA6C
|
|||
if (item->pos.xRot >= -8190)
|
||||
{
|
||||
flag = 1;
|
||||
item->pos.xRot -= ANGLE(1);
|
||||
item->pos.xRot -= ANGLE(1.0f);
|
||||
}
|
||||
break;
|
||||
|
||||
|
@ -612,12 +456,12 @@ void LaraSwimCollision(ITEM_INFO* item, COLL_INFO* coll)//4B608, 4BA6C
|
|||
break;
|
||||
|
||||
case CT_LEFT:
|
||||
item->pos.yRot += ANGLE(2);
|
||||
item->pos.yRot += ANGLE(2.0f);
|
||||
flag = 1;
|
||||
break;
|
||||
|
||||
case CT_RIGHT:
|
||||
item->pos.yRot -= ANGLE(2);
|
||||
item->pos.yRot -= ANGLE(2.0f);
|
||||
flag = 1;
|
||||
break;
|
||||
|
||||
|
@ -633,13 +477,13 @@ void LaraSwimCollision(ITEM_INFO* item, COLL_INFO* coll)//4B608, 4BA6C
|
|||
if (coll->midFloor < 0 && coll->midFloor != NO_HEIGHT)
|
||||
{
|
||||
flag = 1;
|
||||
item->pos.xRot += ANGLE(1);
|
||||
item->pos.xRot += ANGLE(1.0f);
|
||||
item->pos.yPos += coll->midFloor;
|
||||
}
|
||||
|
||||
if (oldX == item->pos.xPos
|
||||
&& oldY == item->pos.yPos
|
||||
&& oldZ == item->pos.zPos
|
||||
&& oldZ == item->pos.zPos
|
||||
&& oldXrot == item->pos.xRot
|
||||
&& oldYrot == item->pos.yRot
|
||||
|| flag != 1)
|
||||
|
@ -661,23 +505,26 @@ void LaraSwimCollision(ITEM_INFO* item, COLL_INFO* coll)//4B608, 4BA6C
|
|||
}
|
||||
|
||||
if (Lara.waterStatus != LW_FLYCHEAT && Lara.ExtraAnim == NO_ITEM)
|
||||
LaraTestWaterDepth(item, coll);
|
||||
{
|
||||
TestLaraWaterDepth(item, coll);
|
||||
}
|
||||
}
|
||||
|
||||
void LaraTestWaterDepth(ITEM_INFO* item, COLL_INFO* coll)//4B4F8(<), 4B95C(<) (F)
|
||||
// This is a setter.
|
||||
void TestLaraWaterDepth(ITEM_INFO* item, COLL_INFO* coll)//4B4F8(<), 4B95C(<) (F)
|
||||
{
|
||||
short roomNumber = item->roomNumber;
|
||||
FLOOR_INFO* floor = GetFloor(item->pos.xPos, item->pos.yPos, item->pos.zPos, &roomNumber);
|
||||
int wd = GetWaterDepth(item->pos.xPos, item->pos.yPos, item->pos.zPos, roomNumber);
|
||||
int depth = GetWaterDepth(item->pos.xPos, item->pos.yPos, item->pos.zPos, roomNumber);
|
||||
|
||||
if (wd == NO_HEIGHT)
|
||||
if (depth == NO_HEIGHT)
|
||||
{
|
||||
item->fallspeed = 0;
|
||||
item->pos.xPos = coll->old.x;
|
||||
item->pos.yPos = coll->old.y;
|
||||
item->pos.zPos = coll->old.z;
|
||||
}
|
||||
else if (wd <= 512)
|
||||
else if (depth <= 512)
|
||||
{
|
||||
item->animNumber = LA_UNDERWATER_TO_STAND;
|
||||
item->currentAnimState = LS_ONWATER_EXIT;
|
||||
|
@ -691,4 +538,187 @@ void LaraTestWaterDepth(ITEM_INFO* item, COLL_INFO* coll)//4B4F8(<), 4B95C(<) (F
|
|||
Lara.waterStatus = LW_WADE;
|
||||
item->pos.yPos = GetFloorHeight(floor, item->pos.xPos, item->pos.yPos, item->pos.zPos);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// ------------------------------
|
||||
// SWIMMING
|
||||
// State & Collision Functions
|
||||
// ------------------------------
|
||||
|
||||
void lara_as_underwater_stop(ITEM_INFO* item, COLL_INFO* coll)//4C730, 4CB94 (F)
|
||||
{
|
||||
if (item->hitPoints <= 0)
|
||||
{
|
||||
item->goalAnimState = LS_WATER_DEATH;
|
||||
return;
|
||||
}
|
||||
|
||||
if (TrInput & IN_ROLL && LaraDrawType != LARA_DIVESUIT)
|
||||
{
|
||||
//item->currentAnimState = LS_UNDERWATER_ROLL;
|
||||
//item->animNumber = LA_UNDERWATER_ROLL_180_START;
|
||||
//item->frameNumber = g_Level.Anims[item->animNumber].frameBase;
|
||||
|
||||
// BUG: Doesn't work when idle???
|
||||
item->goalAnimState = LS_UNDERWATER_ROLL;
|
||||
return;
|
||||
}
|
||||
|
||||
if (TrInput & IN_LOOK)
|
||||
{
|
||||
LookUpDown();
|
||||
}
|
||||
|
||||
if (LaraDrawType == LARA_DIVESUIT)
|
||||
{
|
||||
DoLaraSubsuitSwimTurn(item);
|
||||
}
|
||||
else
|
||||
{
|
||||
DoLaraSwimTurn(item);
|
||||
}
|
||||
|
||||
if (TrInput & IN_JUMP)
|
||||
{
|
||||
item->goalAnimState = LS_UNDERWATER_FORWARD;
|
||||
}
|
||||
|
||||
item->fallspeed -= 6;
|
||||
if (item->fallspeed < 0)
|
||||
{
|
||||
item->fallspeed = 0;
|
||||
}
|
||||
|
||||
if (Lara.gunStatus == LG_HANDS_BUSY)
|
||||
{
|
||||
Lara.gunStatus = LG_NO_ARMS;
|
||||
}
|
||||
}
|
||||
|
||||
void lara_col_underwater_stop(ITEM_INFO* item, COLL_INFO* coll)//4C940(<), 4CDA4(<) (F)
|
||||
{
|
||||
LaraSwimCollision(item, coll);
|
||||
}
|
||||
|
||||
void lara_as_underwater_swim(ITEM_INFO* item, COLL_INFO* coll)//4C548(<), 4C9AC(<) (F)
|
||||
{
|
||||
if (item->hitPoints <= 0)
|
||||
{
|
||||
item->goalAnimState = LS_WATER_DEATH;
|
||||
return;
|
||||
}
|
||||
|
||||
if (TrInput & IN_ROLL && LaraDrawType != LARA_DIVESUIT)
|
||||
{
|
||||
item->goalAnimState = LS_UNDERWATER_ROLL;
|
||||
return;
|
||||
}
|
||||
|
||||
if (LaraDrawType == LARA_DIVESUIT)
|
||||
{
|
||||
DoLaraSubsuitSwimTurn(item);
|
||||
}
|
||||
else
|
||||
{
|
||||
DoLaraSwimTurn(item);
|
||||
}
|
||||
|
||||
item->fallspeed += 8;
|
||||
if (item->fallspeed > 200)
|
||||
{
|
||||
item->fallspeed = 200;
|
||||
}
|
||||
|
||||
if (!(TrInput & IN_JUMP))
|
||||
{
|
||||
item->goalAnimState = LS_UNDERWATER_INERTIA;
|
||||
}
|
||||
}
|
||||
|
||||
void lara_col_underwater_swim(ITEM_INFO* item, COLL_INFO* coll)//4C900(<), 4CD64(<) (F)
|
||||
{
|
||||
LaraSwimCollision(item, coll);
|
||||
}
|
||||
|
||||
void lara_as_glide(ITEM_INFO* item, COLL_INFO* coll)//4C634(<), 4CA98(<) (F)
|
||||
{
|
||||
lara_as_underwater_stop(item, coll); // This one has the HANDS_BUSY check which wasn't in the current function.
|
||||
|
||||
if (item->fallspeed <= 133)
|
||||
{
|
||||
item->goalAnimState = LS_UNDERWATER_STOP;
|
||||
}
|
||||
}
|
||||
|
||||
void lara_col_glide(ITEM_INFO* item, COLL_INFO* coll)//4C920(<), 4CD84(<) (F)
|
||||
{
|
||||
LaraSwimCollision(item, coll);
|
||||
}
|
||||
|
||||
void lara_as_dive(ITEM_INFO* item, COLL_INFO* coll)//4C854, 4CCB8 (F)
|
||||
{
|
||||
if (TrInput & IN_FORWARD)
|
||||
{
|
||||
item->pos.xRot -= ANGLE(1.0f);
|
||||
}
|
||||
}
|
||||
|
||||
void lara_col_dive(ITEM_INFO* item, COLL_INFO* coll)//4C960(<), 4CDC4(<) (F)
|
||||
{
|
||||
LaraSwimCollision(item, coll);
|
||||
}
|
||||
|
||||
void lara_as_underwater_death(ITEM_INFO* item, COLL_INFO* coll)//4C884(<), 4CCE8(<) (F)
|
||||
{
|
||||
Lara.look = 0;
|
||||
|
||||
item->fallspeed -= 8;
|
||||
if (item->fallspeed <= 0)
|
||||
{
|
||||
item->fallspeed = 0;
|
||||
}
|
||||
|
||||
if (item->pos.xRot < -ANGLE(2.0f) || item->pos.xRot > ANGLE(2.0f))
|
||||
{
|
||||
if (item->pos.xRot >= 0)
|
||||
{
|
||||
item->pos.xRot -= ANGLE(2.0f);
|
||||
}
|
||||
else
|
||||
{
|
||||
item->pos.xRot += ANGLE(2.0f);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
item->pos.xRot = 0;
|
||||
}
|
||||
}
|
||||
|
||||
void lara_col_underwater_death(ITEM_INFO* item, COLL_INFO* coll)//4C980(<), 4CDE4(<) (F)
|
||||
{
|
||||
Lara.gunStatus = LG_HANDS_BUSY;
|
||||
Lara.air = -1;
|
||||
item->hitPoints = -1;
|
||||
|
||||
int wh = GetWaterHeight(item->pos.xPos, item->pos.yPos, item->pos.zPos, item->roomNumber);
|
||||
if (wh != NO_HEIGHT)
|
||||
{
|
||||
if (wh < item->pos.yPos - 100)
|
||||
{
|
||||
item->pos.yPos -= 5;
|
||||
}
|
||||
}
|
||||
|
||||
LaraSwimCollision(item, coll);
|
||||
}
|
||||
|
||||
void lara_as_underwater_roll_180(ITEM_INFO* item, COLL_INFO* coll)//4C8F8(<), 4CD5C(<) (F)
|
||||
{
|
||||
item->fallspeed = 0;
|
||||
}
|
||||
|
||||
void lara_col_underwater_roll_180(ITEM_INFO* item, COLL_INFO* coll)//4CA18(<), 4CE7C(<) (F)
|
||||
{
|
||||
LaraSwimCollision(item, coll);
|
||||
}
|
||||
|
|
|
@ -1,23 +1,34 @@
|
|||
#pragma once
|
||||
|
||||
#include "collide.h"
|
||||
|
||||
typedef struct SubsuitInfo
|
||||
{
|
||||
short XRot;
|
||||
short dXRot;
|
||||
short XRotVel;
|
||||
short Vel[2];
|
||||
short YVel;
|
||||
};
|
||||
|
||||
// Auxillary Functions
|
||||
void LaraWaterCurrent(COLL_INFO* coll);
|
||||
int GetWaterDepth(int x, int y, int z, short roomNumber);
|
||||
void lara_col_waterroll(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_col_uwdeath(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_col_dive(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_col_tread(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_col_glide(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_col_swim(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_as_waterroll(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_as_uwdeath(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_as_dive(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_as_tread(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_as_glide(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_as_swim(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void UpdateSubsuitAngles();
|
||||
void SwimTurnSubsuit(ITEM_INFO* item);
|
||||
void SwimTurn(ITEM_INFO* item);
|
||||
void DoLaraSubsuitSwimTurn(ITEM_INFO* item);
|
||||
void DoLaraSwimTurn(ITEM_INFO* item);
|
||||
void LaraSwimCollision(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void LaraTestWaterDepth(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void TestLaraWaterDepth(ITEM_INFO* item, COLL_INFO* coll);
|
||||
|
||||
// State & Collision Functions
|
||||
void lara_as_underwater_stop(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_col_underwater_stop(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_as_underwater_swim(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_col_underwater_swim(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_as_glide(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_col_glide(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_as_dive(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_col_dive(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_as_underwater_death(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_col_underwater_death(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_as_underwater_roll_180(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void lara_col_underwater_roll_180(ITEM_INFO* item, COLL_INFO* coll);
|
||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -17,7 +17,10 @@ void SetCornerAnim(ITEM_INFO* item, COLL_INFO* coll, short rot, short flip);
|
|||
void SetCornerAnimFeet(ITEM_INFO* item, COLL_INFO* coll, short rot, short flip);
|
||||
short LaraFloorFront(ITEM_INFO* item, short ang, int dist);
|
||||
short LaraCeilingFront(ITEM_INFO* item, short ang, int dist, int h);
|
||||
int LaraFallen(ITEM_INFO* item, COLL_INFO* coll);
|
||||
int LaraLandedBad(ITEM_INFO* l, COLL_INFO* coll);
|
||||
void GetTighRopeFallOff(int Regularity);
|
||||
bool TestLaraLean(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void GetTighropeFallOff(int Regularity);
|
||||
|
||||
bool TestLaraFall(COLL_INFO* coll);
|
||||
void SetLaraFall(ITEM_INFO* item);
|
||||
|
||||
bool TestLaraLean(COLL_INFO* coll);
|
||||
|
|
|
@ -11,6 +11,7 @@
|
|||
#include "input.h"
|
||||
#include "sound.h"
|
||||
#include "savegame.h"
|
||||
|
||||
struct PISTOL_DEF
|
||||
{
|
||||
short objectNum;
|
||||
|
@ -19,6 +20,7 @@ struct PISTOL_DEF
|
|||
char draw2Anim;
|
||||
char recoilAnim;
|
||||
};
|
||||
|
||||
PISTOL_DEF PistolsTable[4] =
|
||||
{
|
||||
{ ID_LARA, 0, 0, 0, 0 },
|
||||
|
|
|
@ -2924,7 +2924,7 @@ void AnimateItem(ITEM_INFO *item)
|
|||
|
||||
if (item->gravityStatus)
|
||||
{
|
||||
item->fallspeed += (item->fallspeed >= 128 ? 1 : 6);
|
||||
item->fallspeed += (item->fallspeed >= 128 ? 1 : 6) / 2;
|
||||
item->pos.yPos += item->fallspeed;
|
||||
}
|
||||
else
|
||||
|
|
|
@ -94,19 +94,29 @@ extern Inventory g_Inventory;
|
|||
|
||||
static bool SilencerIsEquiped()
|
||||
{
|
||||
return Lara.Weapons[WEAPON_UZI].HasSilencer
|
||||
|| Lara.Weapons[WEAPON_PISTOLS].HasSilencer
|
||||
|| Lara.Weapons[WEAPON_SHOTGUN].HasSilencer
|
||||
|| Lara.Weapons[WEAPON_REVOLVER].HasSilencer
|
||||
|| Lara.Weapons[WEAPON_CROSSBOW].HasSilencer
|
||||
|| Lara.Weapons[WEAPON_HK].HasSilencer;
|
||||
if (Lara.Weapons[WEAPON_UZI].HasSilencer ||
|
||||
Lara.Weapons[WEAPON_PISTOLS].HasSilencer ||
|
||||
Lara.Weapons[WEAPON_SHOTGUN].HasSilencer ||
|
||||
Lara.Weapons[WEAPON_REVOLVER].HasSilencer ||
|
||||
Lara.Weapons[WEAPON_CROSSBOW].HasSilencer ||
|
||||
Lara.Weapons[WEAPON_HK].HasSilencer)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
static bool LaserSightIsEquiped()
|
||||
{
|
||||
return Lara.Weapons[WEAPON_REVOLVER].HasLasersight
|
||||
|| Lara.Weapons[WEAPON_CROSSBOW].HasLasersight
|
||||
|| Lara.Weapons[WEAPON_HK].HasLasersight;
|
||||
if (Lara.Weapons[WEAPON_REVOLVER].HasLasersight ||
|
||||
Lara.Weapons[WEAPON_CROSSBOW].HasLasersight ||
|
||||
Lara.Weapons[WEAPON_HK].HasLasersight)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
void PickedUpObject(short objectNumber)
|
||||
|
@ -502,7 +512,9 @@ void do_pickup()
|
|||
for (int i = 0; i < g_Level.NumItems; i++)
|
||||
{
|
||||
if (g_Level.Items[i].objectNumber == item->objectNumber)
|
||||
KillItem(i);
|
||||
{
|
||||
KillItem(i);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (item->triggerFlags & 0xC0)
|
||||
|
@ -533,10 +545,14 @@ void PickupCollision(short itemNum, ITEM_INFO* l, COLL_INFO* coll)
|
|||
|
||||
short triggerFlags = item->triggerFlags & 0x3F;
|
||||
if (triggerFlags == 5 || triggerFlags == 10)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if (item->objectNumber == ID_FLARE_ITEM && Lara.gunType == WEAPON_FLARE)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
item->pos.yRot = l->pos.yRot;
|
||||
item->pos.zRot = 0;
|
||||
|
@ -835,7 +851,10 @@ void PickupCollision(short itemNum, ITEM_INFO* l, COLL_INFO* coll)
|
|||
if (l->currentAnimState == LS_CROUCH_IDLE)
|
||||
{
|
||||
if (item->objectNumber == ID_BURNING_TORCH_ITEM)
|
||||
break;
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
AlignLaraPosition(&PickUpPosition, item, l);
|
||||
if (item->objectNumber == ID_FLARE_ITEM)
|
||||
{
|
||||
|
@ -852,7 +871,10 @@ void PickupCollision(short itemNum, ITEM_INFO* l, COLL_INFO* coll)
|
|||
if (l->currentAnimState == LS_CRAWL_IDLE)
|
||||
{
|
||||
if (item->objectNumber == ID_BURNING_TORCH_ITEM)
|
||||
break;
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
l->goalAnimState = LS_CROUCH_IDLE;
|
||||
Lara.generalPtr = (void*)itemNum;
|
||||
break;
|
||||
|
@ -955,13 +977,20 @@ void PickupControl(short itemNum)
|
|||
{
|
||||
item->pos.yPos = item->itemFlags[0];
|
||||
if (item->fallspeed <= 64)
|
||||
{
|
||||
item->triggerFlags &= 0xC0;
|
||||
}
|
||||
else
|
||||
{
|
||||
item->fallspeed = -item->fallspeed >> 2;
|
||||
}
|
||||
}
|
||||
|
||||
if (item->roomNumber != roomNumber)
|
||||
{
|
||||
ItemNewRoom(itemNum, roomNumber);
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case 2:
|
||||
|
@ -1007,10 +1036,14 @@ BOUNDING_BOX* FindPlinth(ITEM_INFO* item)
|
|||
}
|
||||
|
||||
if (found != -1)
|
||||
{
|
||||
return &StaticObjects[found].collisionBox;
|
||||
}
|
||||
|
||||
if (room->itemNumber == NO_ITEM)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
short itemNumber = room->itemNumber;
|
||||
for (itemNumber = room->itemNumber; itemNumber != NO_ITEM; itemNumber = g_Level.Items[itemNumber].nextItem)
|
||||
|
@ -1029,9 +1062,13 @@ BOUNDING_BOX* FindPlinth(ITEM_INFO* item)
|
|||
}
|
||||
|
||||
if (itemNumber == NO_ITEM)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
else
|
||||
{
|
||||
return (BOUNDING_BOX*)GetBestFrame(&g_Level.Items[itemNumber]);
|
||||
}
|
||||
}
|
||||
|
||||
void InitialisePickup(short itemNumber)
|
||||
|
@ -1047,7 +1084,9 @@ void InitialisePickup(short itemNumber)
|
|||
else
|
||||
{
|
||||
if (triggerFlags == 0 || triggerFlags == 3 || triggerFlags == 4 || triggerFlags == 7 || triggerFlags == 8 || triggerFlags == 11)
|
||||
{
|
||||
item->pos.yPos -= bounds->Y2;
|
||||
}
|
||||
|
||||
if ((item->triggerFlags & 0x80) != 0)
|
||||
{
|
||||
|
@ -1056,10 +1095,14 @@ void InitialisePickup(short itemNumber)
|
|||
}
|
||||
|
||||
if (item->triggerFlags & 0x100)
|
||||
{
|
||||
item->meshBits = 0;
|
||||
}
|
||||
|
||||
if (item->status == ITEM_INVISIBLE)
|
||||
{
|
||||
item->flags |= 0x20;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1198,7 +1241,9 @@ void SearchObjectControl(short itemNumber)
|
|||
objNumber = (item->objectNumber - ID_SEARCH_OBJECT1) / 2;
|
||||
|
||||
if (item->objectNumber != ID_SEARCH_OBJECT4 || item->itemFlags[0] == 1)
|
||||
{
|
||||
AnimateItem(item);
|
||||
}
|
||||
|
||||
frameNumber = item->frameNumber - g_Level.Anims[item->animNumber].frameBase;
|
||||
if (item->objectNumber == ID_SEARCH_OBJECT1)
|
||||
|
@ -1217,16 +1262,22 @@ void SearchObjectControl(short itemNumber)
|
|||
else if (item->objectNumber == ID_SEARCH_OBJECT2)
|
||||
{
|
||||
if (frameNumber == 18)
|
||||
{
|
||||
item->meshBits = 1;
|
||||
}
|
||||
else if (frameNumber == 172)
|
||||
{
|
||||
item->meshBits = 2;
|
||||
}
|
||||
}
|
||||
else if (item->objectNumber == ID_SEARCH_OBJECT4)
|
||||
{
|
||||
item->meshBits = FlipStats[0] != 0 ? 48 : 9;
|
||||
|
||||
if (frameNumber >= 45 && frameNumber <= 131)
|
||||
{
|
||||
item->meshBits |= FlipStats[0] != 0 ? 4 : 2;
|
||||
}
|
||||
|
||||
if (item->itemFlags[1] != -1)
|
||||
{
|
||||
|
@ -1234,9 +1285,13 @@ void SearchObjectControl(short itemNumber)
|
|||
if (Objects[item2->objectNumber].isPickup)
|
||||
{
|
||||
if (FlipStats[0])
|
||||
{
|
||||
item2->status = ITEM_NOT_ACTIVE;
|
||||
}
|
||||
else
|
||||
{
|
||||
item2->status = ITEM_INVISIBLE;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1287,11 +1342,12 @@ void SearchObjectControl(short itemNumber)
|
|||
|
||||
int UseSpecialItem(ITEM_INFO* item) // to pickup.cpp?
|
||||
{
|
||||
|
||||
short selectedObject = g_Inventory.GetSelectedObject();
|
||||
|
||||
if (item->animNumber != LA_STAND_IDLE || Lara.gunStatus || selectedObject == NO_ITEM)
|
||||
return false;
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
if (selectedObject >= ID_WATERSKIN1_EMPTY && selectedObject <= ID_WATERSKIN2_5)
|
||||
{
|
||||
|
@ -1300,9 +1356,13 @@ int UseSpecialItem(ITEM_INFO* item) // to pickup.cpp?
|
|||
if (selectedObject != ID_WATERSKIN1_3 && selectedObject != ID_WATERSKIN2_5)
|
||||
{
|
||||
if (selectedObject >= ID_WATERSKIN2_EMPTY)
|
||||
Lara.Waterskin2.Quantity = 5;
|
||||
{
|
||||
Lara.Waterskin2.Quantity = 5;
|
||||
}
|
||||
else
|
||||
Lara.Waterskin1.Quantity = 3;
|
||||
{
|
||||
Lara.Waterskin1.Quantity = 3;
|
||||
}
|
||||
|
||||
item->animNumber = LA_WATERSKIN_FILL;
|
||||
}
|
||||
|
|
|
@ -1306,6 +1306,11 @@ unsigned short atanTab[] = {
|
|||
0x2000, 0x2000
|
||||
};
|
||||
|
||||
int GetSign(int num)
|
||||
{
|
||||
return (num >= 0) ? 1 : -1;
|
||||
}
|
||||
|
||||
// fix "improperly terminated macro invocation"
|
||||
// fix "expression must have integral or unscoped enum type"
|
||||
short ANGLE(float angle)
|
||||
|
|
|
@ -45,6 +45,9 @@ template<typename T>
|
|||
constexpr auto MESH_BITS(T x) {
|
||||
return (1 << x);
|
||||
}
|
||||
|
||||
int GetSign(int num);
|
||||
|
||||
short ANGLE(float angle);
|
||||
float TO_DEGREES(short angle);
|
||||
float TO_RAD(short angle);
|
||||
|
|
|
@ -24,7 +24,7 @@ bool shouldAnimateUpperBody(const LARA_WEAPON_TYPE& weapon) {
|
|||
case WEAPON_GRENADE_LAUNCHER:
|
||||
case WEAPON_CROSSBOW:
|
||||
case WEAPON_SHOTGUN:
|
||||
return (LaraItem->currentAnimState == LS_STOP || LaraItem->currentAnimState == LS_TURN_FAST || LaraItem->currentAnimState == LS_TURN_LEFT_SLOW || LaraItem->currentAnimState == LS_TURN_RIGHT_SLOW);
|
||||
return (LaraItem->currentAnimState == LS_STOP || LaraItem->currentAnimState == LS_TURN_LEFT_FAST || LaraItem->currentAnimState == LS_TURN_RIGHT_FAST || LaraItem->currentAnimState == LS_TURN_LEFT_SLOW || LaraItem->currentAnimState == LS_TURN_RIGHT_SLOW);
|
||||
break;
|
||||
case WEAPON_HK:
|
||||
{
|
||||
|
@ -33,7 +33,7 @@ bool shouldAnimateUpperBody(const LARA_WEAPON_TYPE& weapon) {
|
|||
if(laraInfo.rightArm.animNumber - baseAnim == 0 || laraInfo.rightArm.animNumber - baseAnim == 2 || laraInfo.rightArm.animNumber - baseAnim == 4){
|
||||
return true;
|
||||
} else
|
||||
return (LaraItem->currentAnimState == LS_STOP || LaraItem->currentAnimState == LS_TURN_FAST || LaraItem->currentAnimState == LS_TURN_LEFT_SLOW || LaraItem->currentAnimState == LS_TURN_RIGHT_SLOW);
|
||||
return (LaraItem->currentAnimState == LS_STOP || LaraItem->currentAnimState == LS_TURN_LEFT_FAST || LaraItem->currentAnimState == LS_TURN_RIGHT_FAST || LaraItem->currentAnimState == LS_TURN_LEFT_SLOW || LaraItem->currentAnimState == LS_TURN_RIGHT_SLOW);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue