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:
Sezz 2020-09-26 03:28:30 +10:00
parent 856d11150a
commit 2ee7059470
33 changed files with 6256 additions and 4054 deletions

View file

@ -1,5 +1,5 @@
#include "framework.h" #include "framework.h"
#include "Lara.h" #include "lara.h"
#include "lara_basic.h" #include "lara_basic.h"
#include "lara_tests.h" #include "lara_tests.h"
#include "lara_monkey.h" #include "lara_monkey.h"
@ -49,52 +49,58 @@ ITEM_INFO* LaraItem;
COLL_INFO lara_coll; COLL_INFO lara_coll;
byte LaraNodeUnderwater[NUM_LARA_MESHES]; byte LaraNodeUnderwater[NUM_LARA_MESHES];
// For later.
bool EnableActionToggle;
bool EnableJumpUpAlign;
bool EnableClimbAssist;
bool EnableSafetyDrop;
function<LaraRoutineFunction> lara_control_routines[NUM_LARA_STATES + 1] = { function<LaraRoutineFunction> lara_control_routines[NUM_LARA_STATES + 1] = {
lara_as_walk, lara_as_walk_forward,//0
lara_as_run, lara_as_run,//1
lara_as_stop, lara_as_stop,//2
lara_as_forwardjump, lara_as_jump_forward,//3
lara_void_func,//4 lara_void_func,//4
lara_as_fastback,//5 lara_as_hop_back,//5
lara_as_turn_r,//6 lara_as_turn_right,//6
lara_as_turn_l,//7 lara_as_turn_left,//7
lara_as_death,//8 lara_as_death,//8
lara_as_fastfall, lara_as_freefall,//9
lara_as_hang, lara_as_hang,//10
lara_as_reach, lara_as_reach,//11
lara_as_splat, lara_as_splat,//12
lara_as_tread, lara_as_underwater_stop,//13
lara_void_func, lara_void_func,//14
lara_as_compress,//15 lara_as_jump_prepare,//15
lara_as_back,//16 lara_as_walk_back,//16
lara_as_swim,//17 lara_as_underwater_swim,//17
lara_as_glide,//18 lara_as_glide,//18
lara_as_null,//19 lara_as_null,//19
lara_as_fastturn,//20 lara_as_turn_right_fast,//20
lara_as_stepright,//21 lara_as_step_right,//21
lara_as_stepleft,//22 lara_as_step_left,//22
lara_void_func, lara_void_func,//23
lara_as_slide,//24 lara_as_slide,//24
lara_as_backjump,//25 lara_as_jump_back,//25
lara_as_rightjump,//26 lara_as_jump_right,//26
lara_as_leftjump,//27 lara_as_jump_left,//27
lara_as_upjump,//28 lara_as_jump_up,//28
lara_as_fallback,//29 lara_as_fall_back,//29
lara_as_hangleft,//30 lara_as_shimmy_left,//30
lara_as_hangright,//31 lara_as_shimmy_right,//31
lara_as_slideback,//32 lara_as_slide_back,//32
lara_as_surftread, lara_as_surftread,//33
lara_as_surfswim, lara_as_surfswim,//34
lara_as_dive, lara_as_dive,//35
lara_as_pushblock,//36 lara_as_pushable_push,//36
lara_as_pullblock,//37 lara_as_pushable_pull,//37
lara_as_ppready,//38 lara_as_pushable_ready,//38
lara_as_pickup,//39 lara_as_pickup,//39
lara_as_switchon,//40 lara_as_switch,//40
lara_as_switchoff,//41 lara_as_switch,//41 //
lara_as_usekey,//42 lara_as_use_key,//42
lara_as_usepuzzle,//43 lara_as_use_puzzle,//43
lara_as_uwdeath,//44 lara_as_underwater_death,//44
lara_void_func,//45 lara_void_func,//45
lara_as_special,//46 lara_as_special,//46
lara_as_surfback,//47 lara_as_surfback,//47
@ -102,8 +108,8 @@ function<LaraRoutineFunction> lara_control_routines[NUM_LARA_STATES + 1] = {
lara_as_surfright,//49 lara_as_surfright,//49
lara_void_func,//50 lara_void_func,//50
lara_void_func,//51 lara_void_func,//51
lara_as_swandive,//52 lara_as_swandive_start,//52
lara_as_fastdive,//53 lara_as_swandive_freefall,//53
lara_as_gymnast,//54 lara_as_gymnast,//54
lara_as_waterout, lara_as_waterout,
lara_as_climbstnc, lara_as_climbstnc,
@ -111,37 +117,37 @@ function<LaraRoutineFunction> lara_control_routines[NUM_LARA_STATES + 1] = {
lara_as_climbleft, lara_as_climbleft,
lara_as_climbend, lara_as_climbend,
lara_as_climbright, lara_as_climbright,
lara_as_climbdown,// lara_as_climbdown, //
lara_void_func, lara_void_func,
lara_void_func, lara_void_func,
lara_void_func, lara_void_func,
lara_as_wade,//65 lara_as_wade,//65
lara_as_waterroll,//66 lara_as_underwater_roll_180,//66
lara_as_pickupflare,//67 lara_as_pickup_flare,//67
lara_void_func,//68 lara_void_func,//68
lara_void_func,//69 lara_void_func,//69
lara_as_deathslide,//70 lara_as_zipline,//70
lara_as_duck,//71 lara_as_crouch,//71
lara_as_crouch_roll,//72 lara_as_crouch_roll,//72
lara_as_dash, lara_as_sprint,
lara_as_dashdive, lara_as_sprint_roll,
lara_as_hang2, lara_as_hang2,
lara_as_monkeyswing, lara_as_monkeyswing,
lara_as_monkeyl, lara_as_monkeyl,
lara_as_monkeyr, lara_as_monkeyr,
lara_as_monkey180, lara_as_monkey180,
lara_as_all4s,//80 lara_as_crawl_stop,//80
lara_as_crawl,//81 lara_as_crawl_forward,//81
lara_as_hangturnl, lara_as_hangturnl,//82
lara_as_hangturnr, lara_as_hangturnr,//83
lara_as_all4turnl,//84 lara_as_crawl_turn_left,//84
lara_as_all4turnr,//85 lara_as_crawl_turn_right,//85
lara_as_crawlb,//86 lara_as_crawl_back,//86
lara_as_null, lara_as_null,
lara_as_null, lara_as_null,
lara_as_controlled, lara_as_controlled,
lara_as_ropel, lara_as_rope_turn_clockwise,
lara_as_roper, lara_as_rope_turn_counter_clockwise,
lara_as_controlled, lara_as_controlled,
lara_as_controlled, 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,//99
lara_as_null,//100 lara_as_null,//100
lara_as_null,//101 lara_as_null,//101
lara_as_poleleft,//102 lara_as_pole_turn_clockwise,//102
lara_as_poleright,//103 lara_as_pole_turn_counter_clockwise,//103
lara_as_pulley,//104 lara_as_pulley,//104
lara_as_duckl,//105 lara_as_crouch_turn_left,//105
lara_as_duckr,//106 lara_as_crouch_turn_right,//106
lara_as_extcornerl,//107 lara_as_extcornerl,//107
lara_as_extcornerr,//108 lara_as_extcornerr,//108
lara_as_intcornerl,//109 lara_as_intcornerl,//109
lara_as_intcornerr,//110 lara_as_intcornerr,//110
lara_as_rope,//111 lara_as_rope,//111
lara_as_climbrope,//112 lara_as_rope_up,//112
lara_as_climbroped,//113 lara_as_rope_down,//113
lara_as_rope,//114 lara_as_rope,//114
lara_as_rope,//115 lara_as_rope,//115
lara_void_func, lara_void_func,//116
lara_as_controlled, lara_as_controlled,//117
lara_as_swimcheat, lara_as_swim_cheat,//118
lara_as_trpose,//119 lara_as_tightrope_stop,//119
lara_as_null,//120 lara_as_null,//120
lara_as_trwalk,//121 lara_as_tightrope_walk,//121
lara_as_trfall,//122 lara_as_tightrope_fall,//122
lara_as_trfall,//123 lara_as_tightrope_fall,//123
lara_as_null,//124 lara_as_null,//124
lara_as_null,//125 lara_as_null,//125
lara_as_switchon,//126 lara_as_switch,//126
lara_as_null,//127 lara_as_null,//127
lara_as_parallelbars,//128 lara_as_swing_bar,//128
lara_as_pbleapoff,//129 lara_as_swing_bar_leap,//129
lara_as_null,//130 lara_as_null,//130
lara_as_null,//131 lara_as_null,//131
lara_as_null,//132 lara_as_null,//132
@ -190,53 +196,60 @@ function<LaraRoutineFunction> lara_control_routines[NUM_LARA_STATES + 1] = {
lara_as_null,//137 lara_as_null,//137
lara_as_null,//138 lara_as_null,//138
lara_as_hang_feet,//139 lara_as_hang_feet,//139
lara_as_hang_feet_shimmyr,//140 lara_as_shimmy_feet_right,//140
lara_as_hang_feet_shimmyl,//141 lara_as_shimmy_feet_left,//141
lara_as_hang_feet_inRcorner,//142 lara_as_hang_feet_right_corner_inner,//142
lara_as_hang_feet_inLcorner,//143 lara_as_hang_feet_left_corner_inner,//143
lara_as_hang_feet_outRcorner,//144 lara_as_hang_feet_right_corner_outer,//144
lara_as_hang_feet_outLcorner,//145 lara_as_hang_feet_left_corner_outer,//145
lara_as_controlledl, lara_as_controlledl,
lara_as_null, lara_as_null,
lara_as_null, lara_as_null,
lara_as_null, lara_as_null,
lara_as_stepoff_left, lara_as_stepoff_left,//150
lara_as_stepoff_right 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] = { function<LaraRoutineFunction> lara_collision_routines[NUM_LARA_STATES + 1] = {
lara_col_walk, lara_col_walk_forward,
lara_col_run, lara_col_run,
lara_col_stop, lara_col_stop,
lara_col_forwardjump, lara_col_jump_forward,
lara_col_pose, lara_col_pose,
lara_col_fastback, lara_col_hop_back,
lara_col_turn_r, lara_col_turn_right,
lara_col_turn_l, lara_col_turn_left,
lara_col_death, lara_col_death,
lara_col_fastfall, lara_col_freefall,
lara_col_hang, lara_col_hang,
lara_col_reach, lara_col_reach,
lara_col_splat, lara_col_splat,
lara_col_tread, lara_col_underwater_stop,
lara_col_land, lara_col_stop,
lara_col_compress, lara_col_jump_prepare,
lara_col_back, lara_col_walk_back,
lara_col_swim, lara_col_underwater_swim,
lara_col_glide, lara_col_glide,
lara_default_col, lara_default_col,
lara_col_fastturn, lara_col_turn_right_fast,//20
lara_col_stepright, lara_col_step_right,
lara_col_stepleft, lara_col_step_left,
lara_col_roll2, lara_col_roll2,
lara_col_slide, lara_col_slide,
lara_col_backjump, lara_col_jump_back,
lara_col_rightjump, lara_col_jump_right,
lara_col_leftjump, lara_col_jump_left,
lara_col_upjump, lara_col_jump_up,
lara_col_fallback, lara_col_fall_back,
lara_col_hangleft, lara_col_shimmy_left,
lara_col_hangright, lara_col_shimmy_right,
lara_col_slideback, lara_col_slide_back,
lara_col_surftread, lara_col_surftread,
lara_col_surfswim, lara_col_surfswim,
lara_col_dive, 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_default_col,
lara_default_col, lara_default_col,
lara_col_uwdeath, lara_col_underwater_death,
lara_col_roll, lara_col_roll,
lara_void_func, lara_void_func,
lara_col_surfback, lara_col_surfback,
@ -256,8 +269,8 @@ function<LaraRoutineFunction> lara_collision_routines[NUM_LARA_STATES + 1] = {
lara_col_surfright, lara_col_surfright,
lara_void_func, lara_void_func,
lara_void_func, lara_void_func,
lara_col_swandive, lara_col_swandive_start,
lara_col_fastdive, lara_col_swandive_freefall,
lara_default_col, lara_default_col,
lara_default_col, lara_default_col,
lara_col_climbstnc, lara_col_climbstnc,
@ -270,29 +283,29 @@ function<LaraRoutineFunction> lara_collision_routines[NUM_LARA_STATES + 1] = {
lara_void_func, lara_void_func,
lara_void_func, lara_void_func,
lara_col_wade, lara_col_wade,
lara_col_waterroll, lara_col_underwater_roll_180,
lara_default_col, lara_default_col,
lara_void_func, lara_void_func,
lara_void_func, lara_void_func,
lara_void_func, lara_void_func,
lara_col_duck, lara_col_crouch,
lara_col_crouch_roll, lara_col_crouch_roll,
lara_col_dash, lara_col_sprint,
lara_col_dashdive, lara_col_sprint_roll,
lara_col_hang2, lara_col_hang2,
lara_col_monkeyswing, lara_col_monkeyswing,
lara_col_monkeyl, lara_col_monkeyl,
lara_col_monkeyr, lara_col_monkeyr,
lara_col_monkey180, lara_col_monkey180,
lara_col_all4s, lara_col_crawl_stop,
lara_col_crawl, lara_col_crawl_forward,
lara_col_hangturnlr, lara_col_hangturnlr,
lara_col_hangturnlr, lara_col_hangturnlr,
lara_col_all4turnlr, lara_col_crawl_turn,
lara_col_all4turnlr, lara_col_crawl_turn,
lara_col_crawlb, lara_col_crawl_back,
lara_void_func, lara_void_func,
lara_col_crawl2hang, lara_col_crawl_to_hang,
lara_default_col, lara_default_col,
lara_void_func, lara_void_func,
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_void_func, lara_void_func,
lara_default_col, lara_default_col,
lara_col_polestat, lara_col_pole_stop,
lara_col_poleup, lara_col_pole_up,
lara_col_poledown, lara_col_pole_down,
lara_void_func, lara_void_func,
lara_void_func, lara_void_func,
lara_default_col, lara_default_col,
lara_col_ducklr, lara_col_crouch_turn,
lara_col_ducklr, lara_col_crouch_turn,
lara_default_col, lara_default_col,
lara_default_col, 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_col_rope,
lara_void_func, lara_void_func,
lara_void_func, lara_void_func,
lara_col_ropefwd, lara_col_rope_swing,
lara_col_ropefwd, lara_col_rope_swing,
lara_void_func, lara_void_func,
lara_void_func, lara_void_func,
lara_col_swim, lara_col_underwater_swim,
lara_default_col, lara_default_col,
lara_default_col, 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_void_func, lara_void_func,
lara_col_hang_feet, lara_col_hang_feet,
lara_col_hang_feet_shimmyr, lara_col_shimmy_feet_right,
lara_col_hang_feet_shimmyl, lara_col_shimmy_feet_right,
lara_default_col, lara_default_col,
lara_default_col, 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_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_default_col,
lara_col_turn_left_fast,//156
lara_default_col,//157
}; };
void LaraControl(short itemNumber) // (AF) (D) void LaraControl(short itemNumber) // (AF) (D)
@ -375,7 +394,9 @@ void LaraControl(short itemNumber) // (AF) (D)
} }
if (!DisableLaraControl) if (!DisableLaraControl)
{
Lara.locationPad = 128; Lara.locationPad = 128;
}
int oldX = LaraItem->pos.xPos; int oldX = LaraItem->pos.xPos;
int oldY = LaraItem->pos.yPos; int oldY = LaraItem->pos.yPos;
@ -391,7 +412,9 @@ void LaraControl(short itemNumber) // (AF) (D)
} }
if (item->currentAnimState != LS_SPRINT && DashTimer < 120) if (item->currentAnimState != LS_SPRINT && DashTimer < 120)
{
DashTimer++; DashTimer++;
}
Lara.isDucked = false; Lara.isDucked = false;
@ -402,13 +425,19 @@ void LaraControl(short itemNumber) // (AF) (D)
int hfw; int hfw;
if (wh != NO_HEIGHT) if (wh != NO_HEIGHT)
{
hfw = item->pos.yPos - wh; hfw = item->pos.yPos - wh;
}
else else
{
hfw = NO_HEIGHT; hfw = NO_HEIGHT;
}
Lara.waterSurfaceDist = -hfw; Lara.waterSurfaceDist = -hfw;
if (Lara.Vehicle == NO_ITEM) if (Lara.Vehicle == NO_ITEM)
{
WadeSplash(item, wh, wd); WadeSplash(item, wh, wd);
}
short roomNumber; short roomNumber;
@ -430,8 +459,8 @@ void LaraControl(short itemNumber) // (AF) (D)
} }
else if (isWater & ENV_FLAG_SWAMP) else if (isWater & ENV_FLAG_SWAMP)
{ {
if (item->currentAnimState == LS_SWANDIVE_START if (item->currentAnimState == LS_SWANDIVE_START ||
|| item->currentAnimState == LS_SWANDIVE_END) // Is Lara swan-diving? item->currentAnimState == LS_SWANDIVE_END) // Is Lara swan-diving?
item->pos.yPos = wh + 1000; item->pos.yPos = wh + 1000;
item->goalAnimState = LS_WADE_FORWARD; item->goalAnimState = LS_WADE_FORWARD;
@ -453,21 +482,21 @@ void LaraControl(short itemNumber) // (AF) (D)
if (item->currentAnimState == LS_SWANDIVE_START) if (item->currentAnimState == LS_SWANDIVE_START)
{ {
item->pos.xRot = -ANGLE(45); item->pos.xRot = ANGLE(-45.0f);
item->goalAnimState = LS_DIVE; item->goalAnimState = LS_DIVE;
AnimateLara(item); AnimateLara(item);
item->fallspeed *= 2; item->fallspeed *= 2;
} }
else if (item->currentAnimState == LS_SWANDIVE_END) else if (item->currentAnimState == LS_SWANDIVE_END)
{ {
item->pos.xRot = -ANGLE(85); item->pos.xRot = ANGLE(-85.0f);
item->goalAnimState = LS_DIVE; item->goalAnimState = LS_DIVE;
AnimateLara(item); AnimateLara(item);
item->fallspeed *= 2; item->fallspeed *= 2;
} }
else else
{ {
item->pos.xRot = -ANGLE(45); item->pos.xRot = ANGLE(-45.0f);
item->animNumber = LA_FREEFALL_DIVE; item->animNumber = LA_FREEFALL_DIVE;
item->frameNumber = g_Level.Anims[item->animNumber].frameBase; item->frameNumber = g_Level.Anims[item->animNumber].frameBase;
item->currentAnimState = LS_DIVE; item->currentAnimState = LS_DIVE;
@ -483,7 +512,7 @@ void LaraControl(short itemNumber) // (AF) (D)
Splash(LaraItem); 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 >= 256) /* @ORIGINAL_BUG: checking hfw for equality with 256 results in the wade bug */
{ {
if (hfw > 730) if (hfw > 730)
@ -540,7 +569,9 @@ void LaraControl(short itemNumber) // (AF) (D)
LaraItem->roomNumber; LaraItem->roomNumber;
Lara.waterStatus = LW_ABOVE_WATER; Lara.waterStatus = LW_ABOVE_WATER;
if (item->currentAnimState == LS_WADE_FORWARD) if (item->currentAnimState == LS_WADE_FORWARD)
{
item->goalAnimState = LS_RUN_FORWARD; item->goalAnimState = LS_RUN_FORWARD;
}
} }
} }
@ -711,7 +742,9 @@ void LaraControl(short itemNumber) // (AF) (D)
{ {
Lara.waterStatus = LW_ABOVE_WATER; Lara.waterStatus = LW_ABOVE_WATER;
if (item->currentAnimState == LS_WADE_FORWARD) if (item->currentAnimState == LS_WADE_FORWARD)
{
item->goalAnimState = LS_RUN_FORWARD; item->goalAnimState = LS_RUN_FORWARD;
}
} }
break; break;
} }
@ -722,7 +755,9 @@ void LaraControl(short itemNumber) // (AF) (D)
item->hitPoints = -1; item->hitPoints = -1;
if (Lara.deathCount == 0) if (Lara.deathCount == 0)
{
S_CDStop(); S_CDStop();
}
Lara.deathCount++; Lara.deathCount++;
if ((LaraItem->flags & 0x100)) if ((LaraItem->flags & 0x100))
@ -736,7 +771,7 @@ void LaraControl(short itemNumber) // (AF) (D)
{ {
case LW_ABOVE_WATER: case LW_ABOVE_WATER:
case LW_WADE: 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) && Lara.waterSurfaceDist < -775)
{ {
if (item->hitPoints >= 0) if (item->hitPoints >= 0)
@ -764,7 +799,9 @@ void LaraControl(short itemNumber) // (AF) (D)
{ {
Lara.air += 10; Lara.air += 10;
if (Lara.air > 1800) if (Lara.air > 1800)
{
Lara.air = 1800; Lara.air = 1800;
}
} }
} }
LaraAboveWater(item, &lara_coll); LaraAboveWater(item, &lara_coll);
@ -784,7 +821,9 @@ void LaraControl(short itemNumber) // (AF) (D)
if (Lara.air < 0) if (Lara.air < 0)
{ {
if (LaraDrawType == LARA_DIVESUIT && Lara.anxiety < 251) if (LaraDrawType == LARA_DIVESUIT && Lara.anxiety < 251)
{
Lara.anxiety += 4; Lara.anxiety += 4;
}
Lara.air = -1; Lara.air = -1;
item->hitPoints -= 5; item->hitPoints -= 5;
} }
@ -797,7 +836,9 @@ void LaraControl(short itemNumber) // (AF) (D)
{ {
Lara.air += 10; Lara.air += 10;
if (Lara.air > 1800) if (Lara.air > 1800)
{
Lara.air = 1800; Lara.air = 1800;
}
} }
LaraSurface(item, &lara_coll); LaraSurface(item, &lara_coll);
break; break;
@ -830,9 +871,13 @@ void LaraAboveWater(ITEM_INFO* item, COLL_INFO* coll) //hmmmm
coll->trigger = NULL; coll->trigger = NULL;
if ((TrInput & IN_LOOK) && Lara.ExtraAnim == NO_ITEM && Lara.look) if ((TrInput & IN_LOOK) && Lara.ExtraAnim == NO_ITEM && Lara.look)
{
LookLeftRight(); LookLeftRight();
}
else else
{
ResetLook(); ResetLook();
}
Lara.look = true; Lara.look = true;
@ -891,23 +936,36 @@ void LaraAboveWater(ITEM_INFO* item, COLL_INFO* coll) //hmmmm
// Handle current Lara status // Handle current Lara status
lara_control_routines[item->currentAnimState](item, coll); 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; 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); item->pos.zRot += ANGLE(1.0f);
}
else else
{
item->pos.zRot -= ANGLE(1.0f); 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; Lara.turnRate = 0;
else if (Lara.turnRate < -ANGLE(2.0f)) }
else if (Lara.turnRate < ANGLE(-2.0f))
{
Lara.turnRate += ANGLE(2.0f); Lara.turnRate += ANGLE(2.0f);
}
else else
{
Lara.turnRate -= ANGLE(2.0f); Lara.turnRate -= ANGLE(2.0f);
}
item->pos.yRot += Lara.turnRate; item->pos.yRot += Lara.turnRate;
// OLD
// Animate Lara // Animate Lara
AnimateLara(item); //AnimateLara(item);
if (Lara.ExtraAnim == -1) if (Lara.ExtraAnim == -1)
{ {
@ -916,9 +974,14 @@ void LaraAboveWater(ITEM_INFO* item, COLL_INFO* coll) //hmmmm
// Handle Lara collision // Handle Lara collision
if (Lara.Vehicle == NO_ITEM) if (Lara.Vehicle == NO_ITEM)
{
lara_collision_routines[item->currentAnimState](item, coll); lara_collision_routines[item->currentAnimState](item, coll);
}
} }
// Animate Lara after collision.
AnimateLara(item);
UpdateLaraRoom(item, -LARA_HITE / 2); UpdateLaraRoom(item, -LARA_HITE / 2);
//if (Lara.gunType == WEAPON_CROSSBOW && !LaserSight) //if (Lara.gunType == WEAPON_CROSSBOW && !LaserSight)
@ -952,9 +1015,13 @@ void LaraUnderWater(ITEM_INFO* item, COLL_INFO* coll)//4BFB4, 4C418 (F)
coll->trigger = NULL; coll->trigger = NULL;
if (TrInput & IN_LOOK && Lara.look) if (TrInput & IN_LOOK && Lara.look)
{
LookLeftRight(); LookLeftRight();
}
else else
{
ResetLook(); ResetLook();
}
Lara.look = true; Lara.look = true;
@ -962,7 +1029,7 @@ void LaraUnderWater(ITEM_INFO* item, COLL_INFO* coll)//4BFB4, 4C418 (F)
if (LaraDrawType == LARA_DIVESUIT) if (LaraDrawType == LARA_DIVESUIT)
{ {
if (Lara.turnRate < -ANGLE(0.5)) if (Lara.turnRate < ANGLE(-0.5))
{ {
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; 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 else
{ {
@ -991,37 +1058,59 @@ void LaraUnderWater(ITEM_INFO* item, COLL_INFO* coll)//4BFB4, 4C418 (F)
item->pos.yRot += Lara.turnRate; item->pos.yRot += Lara.turnRate;
if (LaraDrawType == LARA_DIVESUIT) if (LaraDrawType == LARA_DIVESUIT)
{
UpdateSubsuitAngles(); UpdateSubsuitAngles();
}
if (item->pos.zRot < -ANGLE(2)) if (item->pos.zRot < ANGLE(-2.0f))
item->pos.zRot += ANGLE(2); {
else if (item->pos.zRot > ANGLE(2)) item->pos.zRot += ANGLE(2.0f);
item->pos.zRot -= ANGLE(2); }
else if (item->pos.zRot > ANGLE(2.0f))
{
item->pos.zRot -= ANGLE(2.0f);
}
else else
{
item->pos.zRot = 0; item->pos.zRot = 0;
}
if (item->pos.xRot < -ANGLE(85)) if (item->pos.xRot < ANGLE(-85.0f))
item->pos.xRot = -ANGLE(85); {
else if (item->pos.xRot > ANGLE(85)) item->pos.xRot = ANGLE(-85.0f);
item->pos.xRot = ANGLE(85); }
else if (item->pos.xRot > ANGLE(85.0f))
{
item->pos.xRot = ANGLE(85.0f);
}
if (LaraDrawType == LARA_DIVESUIT) if (LaraDrawType == LARA_DIVESUIT)
{ {
if (item->pos.zRot > ANGLE(44)) if (item->pos.zRot > ANGLE(44.0f))
item->pos.zRot = ANGLE(44); {
else if (item->pos.zRot < -ANGLE(44)) item->pos.zRot = ANGLE(44.0f);
item->pos.zRot = -ANGLE(44); }
else if (item->pos.zRot < ANGLE(44.0f))
{
item->pos.zRot = ANGLE(-44.0f);
}
} }
else else
{ {
if (item->pos.zRot > ANGLE(22)) if (item->pos.zRot > ANGLE(22.0f))
item->pos.zRot = ANGLE(22); {
else if (item->pos.zRot < -ANGLE(22)) item->pos.zRot = ANGLE(22.0f);
item->pos.zRot = -ANGLE(22); }
else if (item->pos.zRot < ANGLE(-22.0f))
{
item->pos.zRot = ANGLE(-22.0f);
}
} }
if (Lara.currentActive && Lara.waterStatus != LW_FLYCHEAT) if (Lara.currentActive && Lara.waterStatus != LW_FLYCHEAT)
{
LaraWaterCurrent(coll); LaraWaterCurrent(coll);
}
AnimateLara(item); AnimateLara(item);
@ -1032,7 +1121,9 @@ void LaraUnderWater(ITEM_INFO* item, COLL_INFO* coll)//4BFB4, 4C418 (F)
LaraBaddieCollision(item, coll); LaraBaddieCollision(item, coll);
if (/*Lara.ExtraAnim == -1 &&*/ Lara.Vehicle == NO_ITEM) if (/*Lara.ExtraAnim == -1 &&*/ Lara.Vehicle == NO_ITEM)
{
lara_collision_routines[item->currentAnimState](item, coll); lara_collision_routines[item->currentAnimState](item, coll);
}
UpdateLaraRoom(item, 0); 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) void LaraSurface(ITEM_INFO* item, COLL_INFO* coll)//4D684, 4DAE8 (F)
{ {
Camera.targetElevation = -ANGLE(22); Camera.targetElevation = ANGLE(-22.0f);
coll->badPos = 32512; coll->badPos = 32512;
coll->badNeg = -128; coll->badNeg = -128;
@ -1063,23 +1154,35 @@ void LaraSurface(ITEM_INFO* item, COLL_INFO* coll)//4D684, 4DAE8 (F)
coll->trigger = NULL; coll->trigger = NULL;
if (TrInput & IN_LOOK && Lara.look) if (TrInput & IN_LOOK && Lara.look)
{
LookLeftRight(); LookLeftRight();
}
else else
{
ResetLook(); ResetLook();
}
Lara.look = true; Lara.look = true;
lara_control_routines[item->currentAnimState](item, coll); 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; item->pos.zRot = 0;
}
else if (item->pos.zRot < 0) else if (item->pos.zRot < 0)
item->pos.zRot += ANGLE(2); {
item->pos.zRot += ANGLE(2.0f);
}
else else
item->pos.zRot -= ANGLE(2); {
item->pos.zRot -= ANGLE(2.0f);
}
if (Lara.currentActive && Lara.waterStatus != LW_FLYCHEAT) if (Lara.currentActive && Lara.waterStatus != LW_FLYCHEAT)
{
LaraWaterCurrent(coll); LaraWaterCurrent(coll);
}
AnimateLara(item); AnimateLara(item);
@ -1089,7 +1192,9 @@ void LaraSurface(ITEM_INFO* item, COLL_INFO* coll)//4D684, 4DAE8 (F)
LaraBaddieCollision(item, coll); LaraBaddieCollision(item, coll);
if (Lara.Vehicle == NO_ITEM) if (Lara.Vehicle == NO_ITEM)
{
lara_collision_routines[item->currentAnimState](item, coll); lara_collision_routines[item->currentAnimState](item, coll);
}
UpdateLaraRoom(item, 100); UpdateLaraRoom(item, 100);
@ -1232,7 +1337,6 @@ void AnimateLara(ITEM_INFO* item)
default: default:
break; break;
} }
} }
} }
@ -1253,10 +1357,14 @@ void AnimateLara(ITEM_INFO* item)
item->gravityStatus = false; item->gravityStatus = false;
} }
if (item->fallspeed > 128) if (item->fallspeed > 128)
{
item->fallspeed >>= 1; item->fallspeed >>= 1;
}
item->fallspeed -= item->fallspeed >> 2; item->fallspeed -= item->fallspeed >> 2;
if (item->fallspeed < 4) if (item->fallspeed < 4)
{
item->fallspeed = 4; item->fallspeed = 4;
}
item->pos.yPos += item->fallspeed; item->pos.yPos += item->fallspeed;
} }
else else
@ -1276,28 +1384,34 @@ void AnimateLara(ITEM_INFO* item)
{ {
velocity = (anim->velocity >> 1); velocity = (anim->velocity >> 1);
if (anim->acceleration) if (anim->acceleration)
{
velocity += (anim->acceleration * (item->frameNumber - anim->frameBase)) >> 2; velocity += (anim->acceleration * (item->frameNumber - anim->frameBase)) >> 2;
}
} }
else else
{ {
velocity = anim->velocity; velocity = anim->velocity;
if (anim->acceleration) if (anim->acceleration)
{
velocity += anim->acceleration * (item->frameNumber - anim->frameBase); velocity += anim->acceleration * (item->frameNumber - anim->frameBase);
}
} }
item->speed = velocity >> 16; item->speed = velocity >> 16;
} }
if (Lara.ropePtr != -1) if (Lara.ropePtr != -1)
{
DelAlignLaraToRope(item); 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 ! 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.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.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.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)) >> W2V_SHIFT; item->pos.zPos += lateral * phd_cos(item->pos.yRot + Lara.moveAngle + ANGLE(90.0f)) >> W2V_SHIFT;
} }
// Update matrices // Update matrices

View file

@ -20,6 +20,12 @@ extern ITEM_INFO* LaraItem;
extern COLL_INFO lara_coll; extern COLL_INFO lara_coll;
extern byte LaraNodeUnderwater[NUM_LARA_MESHES]; 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 LARA_MESHES(slot, mesh) Lara.meshPtrs[mesh] = MESHES(slot, mesh)
#define CHECK_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) #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

View file

@ -1,71 +1,76 @@
#pragma once #pragma once
#include "lara_struct.h" #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_void_func(ITEM_INFO* item, COLL_INFO* coll);
void lara_default_col(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_special(ITEM_INFO* item, COLL_INFO* coll);
void lara_as_null(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_controlled(ITEM_INFO* item, COLL_INFO* coll);
void lara_as_controlledl(ITEM_INFO* item, COLL_INFO* coll); void lara_as_controlledl(ITEM_INFO* item, COLL_INFO* coll);
/*end generic functions*/
/*-*/ // Basic movement control & collision functions.
/*basic movement*/ void lara_as_walk_forward(ITEM_INFO* item, COLL_INFO* coll);
void lara_as_walk(ITEM_INFO* item, COLL_INFO* coll); void lara_col_walk_forward(ITEM_INFO* item, COLL_INFO* coll);
void lara_col_walk(ITEM_INFO* item, COLL_INFO* coll);
void lara_as_run(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_col_run(ITEM_INFO* item, COLL_INFO* coll);
void lara_as_stop(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_col_stop(ITEM_INFO* item, COLL_INFO* coll);
void lara_as_forwardjump(ITEM_INFO* item, COLL_INFO* coll); void lara_as_jump_forward(ITEM_INFO* item, COLL_INFO* coll);
void lara_col_forwardjump(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_col_pose(ITEM_INFO* item, COLL_INFO* coll);
void lara_as_fastback(ITEM_INFO* item, COLL_INFO* coll); void lara_as_hop_back(ITEM_INFO* item, COLL_INFO* coll);
void lara_col_fastback(ITEM_INFO* item, COLL_INFO* coll); void lara_col_hop_back(ITEM_INFO* item, COLL_INFO* coll);
void lara_as_turn_r(ITEM_INFO* item, COLL_INFO* coll); void lara_as_turn_right(ITEM_INFO* item, COLL_INFO* coll);
void lara_col_turn_r(ITEM_INFO* item, COLL_INFO* coll); void lara_col_turn_right(ITEM_INFO* item, COLL_INFO* coll);
void lara_as_turn_l(ITEM_INFO* item, COLL_INFO* coll); void lara_as_turn_left(ITEM_INFO* item, COLL_INFO* coll);
void lara_col_turn_l(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_as_death(ITEM_INFO* item, COLL_INFO* coll);
void lara_col_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_as_freefall(ITEM_INFO* item, COLL_INFO* coll);
void lara_col_fastfall(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_as_reach(ITEM_INFO* item, COLL_INFO* coll);
void lara_col_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_as_splat(ITEM_INFO* item, COLL_INFO* coll);
void lara_col_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_jump_prepare(ITEM_INFO* item, COLL_INFO* coll);
void lara_as_compress(ITEM_INFO* item, COLL_INFO* coll); void lara_col_jump_prepare(ITEM_INFO* item, COLL_INFO* coll);
void lara_col_compress(ITEM_INFO* item, COLL_INFO* coll); void lara_as_walk_back(ITEM_INFO* item, COLL_INFO* coll);
void lara_as_back(ITEM_INFO* item, COLL_INFO* coll); void lara_col_walk_back(ITEM_INFO* item, COLL_INFO* coll);
void lara_col_back(ITEM_INFO* item, COLL_INFO* coll); void lara_as_turn_right_fast(ITEM_INFO* item, COLL_INFO* coll);
void lara_as_fastturn(ITEM_INFO* item, COLL_INFO* coll); void lara_col_turn_right_fast(ITEM_INFO* item, COLL_INFO* coll);
void lara_col_fastturn(ITEM_INFO* item, COLL_INFO* coll); void lara_as_turn_left_fast(ITEM_INFO* item, COLL_INFO* coll);
void lara_as_stepright(ITEM_INFO* item, COLL_INFO* coll); void lara_col_turn_left_fast(ITEM_INFO* item, COLL_INFO* coll);
void lara_col_stepright(ITEM_INFO* item, COLL_INFO* coll); void lara_as_step_right(ITEM_INFO* item, COLL_INFO* coll);
void lara_as_stepleft(ITEM_INFO* item, COLL_INFO* coll); void lara_col_step_right(ITEM_INFO* item, COLL_INFO* coll);
void lara_col_stepleft(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_col_roll2(ITEM_INFO* item, COLL_INFO* coll);
void lara_as_backjump(ITEM_INFO* item, COLL_INFO* coll); void lara_as_jump_back(ITEM_INFO* item, COLL_INFO* coll);
void lara_col_backjump(ITEM_INFO* item, COLL_INFO* coll); void lara_col_jump_back(ITEM_INFO* item, COLL_INFO* coll);
void lara_as_rightjump(ITEM_INFO* item, COLL_INFO* coll); void lara_as_jump_right(ITEM_INFO* item, COLL_INFO* coll);
void lara_col_rightjump(ITEM_INFO* item, COLL_INFO* coll); void lara_col_jump_right(ITEM_INFO* item, COLL_INFO* coll);
void lara_as_leftjump(ITEM_INFO* item, COLL_INFO* coll); void lara_as_jump_left(ITEM_INFO* item, COLL_INFO* coll);
void lara_col_leftjump(ITEM_INFO* item, COLL_INFO* coll); void lara_col_jump_left(ITEM_INFO* item, COLL_INFO* coll);
void lara_col_jumper(ITEM_INFO* item, COLL_INFO* coll); void lara_col_jump(ITEM_INFO* item, COLL_INFO* coll);
void lara_as_upjump(ITEM_INFO* item, COLL_INFO* coll); void lara_as_jump_up(ITEM_INFO* item, COLL_INFO* coll);
void lara_col_upjump(ITEM_INFO* item, COLL_INFO* coll); void lara_col_jump_up(ITEM_INFO* item, COLL_INFO* coll);
void lara_as_fallback(ITEM_INFO* item, COLL_INFO* coll); void lara_as_fall_back(ITEM_INFO* item, COLL_INFO* coll);
void lara_col_fallback(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_col_roll(ITEM_INFO* item, COLL_INFO* coll);
void lara_as_swandive(ITEM_INFO* item, COLL_INFO* coll); void lara_as_swandive_start(ITEM_INFO* item, COLL_INFO* coll);
void lara_col_swandive(ITEM_INFO* item, COLL_INFO* coll); void lara_col_swandive_start(ITEM_INFO* item, COLL_INFO* coll);
void lara_as_fastdive(ITEM_INFO* item, COLL_INFO* coll); void lara_as_swandive_freefall(ITEM_INFO* item, COLL_INFO* coll);
void lara_col_fastdive(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_gymnast(ITEM_INFO* item, COLL_INFO* coll);
void lara_as_wade(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_col_wade(ITEM_INFO* item, COLL_INFO* coll);
void lara_as_dash(ITEM_INFO* item, COLL_INFO* coll); void lara_as_sprint(ITEM_INFO* item, COLL_INFO* coll);
void lara_col_dash(ITEM_INFO* item, COLL_INFO* coll); void lara_col_sprint(ITEM_INFO* item, COLL_INFO* coll);
void lara_as_dashdive(ITEM_INFO* item, COLL_INFO* coll); void lara_as_sprint_roll(ITEM_INFO* item, COLL_INFO* coll);
void lara_col_dashdive(ITEM_INFO* item, COLL_INFO* coll); void lara_col_sprint_roll(ITEM_INFO* item, COLL_INFO* coll);

View file

@ -7,34 +7,37 @@
#include "effect2.h" #include "effect2.h"
#include "sound.h" #include "sound.h"
extern GameFlow* g_GameFlow; extern GameFlow* g_GameFlow;
int NoCheatCounter; 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) if (TrInput & IN_FORWARD)
{ {
item->pos.xRot -= ANGLE(3); item->pos.xRot -= ANGLE(3.0f);
} }
else if (TrInput & IN_BACK) else if (TrInput & IN_BACK)
{ {
item->pos.xRot += ANGLE(3); item->pos.xRot += ANGLE(3.0f);
} }
if (TrInput & IN_LEFT) if (TrInput & IN_LEFT)
{ {
Lara.turnRate -= 613; Lara.turnRate -= 613;
if (Lara.turnRate < -ANGLE(6)) if (Lara.turnRate < ANGLE(-6.0f))
Lara.turnRate = -ANGLE(6); {
Lara.turnRate = ANGLE(-6.0f);
}
} }
else if (TrInput & IN_RIGHT) else if (TrInput & IN_RIGHT)
{ {
Lara.turnRate += 613; Lara.turnRate += 613;
if (Lara.turnRate > ANGLE(6)) if (Lara.turnRate > ANGLE(6.0f))
Lara.turnRate = ANGLE(6); {
Lara.turnRate = ANGLE(6.0f);
}
} }
if (TrInput & IN_ACTION) 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) if (TrInput & IN_OPTION)
{ {
Lara.turnRate = -ANGLE(12); Lara.turnRate = ANGLE(-12.0f);
} }
if (TrInput & IN_JUMP) if (TrInput & IN_JUMP)
@ -52,14 +55,20 @@ void lara_as_swimcheat(ITEM_INFO* item, COLL_INFO* coll)//4C3A8, 4C80C (F)
item->fallspeed += 16; item->fallspeed += 16;
if (item->fallspeed > 400) if (item->fallspeed > 400)
{
item->fallspeed = 400; item->fallspeed = 400;
}
} }
else else
{ {
if (item->fallspeed >= 8) if (item->fallspeed >= 8)
{
item->fallspeed -= item->fallspeed >> 3; item->fallspeed -= item->fallspeed >> 3;
}
else else
{
item->fallspeed = 0; item->fallspeed = 0;
}
} }
} }
@ -71,10 +80,9 @@ void LaraCheatyBits() // (F) (D)
{ {
if (Lara.Vehicle == NO_ITEM) if (Lara.Vehicle == NO_ITEM)
{ {
LaraCheatGetStuff(); LaraCheatGetStuff();
DelsGiveLaraItemsCheat(); GiveLaraItemsCheat();
LaraItem->pos.yPos -= 128; LaraItem->pos.yPos -= 128;
@ -105,7 +113,9 @@ void LaraCheatyBits() // (F) (D)
} }
} }
if (NoCheatCounter) if (NoCheatCounter)
{
NoCheatCounter--; NoCheatCounter--;
}
} }
void LaraCheatGetStuff() // (F) (D) void LaraCheatGetStuff() // (F) (D)
@ -115,10 +125,14 @@ void LaraCheatGetStuff() // (F) (D)
Lara.NumLargeMedipacks = -1; Lara.NumLargeMedipacks = -1;
if (Objects[ID_CROWBAR_ITEM].loaded) if (Objects[ID_CROWBAR_ITEM].loaded)
{
Lara.Crowbar = true; Lara.Crowbar = true;
}
if (Objects[ID_LASERSIGHT_ITEM].loaded) if (Objects[ID_LASERSIGHT_ITEM].loaded)
{
Lara.Lasersight = true; Lara.Lasersight = true;
}
if (Objects[ID_REVOLVER_ITEM].loaded) if (Objects[ID_REVOLVER_ITEM].loaded)
{ {
@ -198,7 +212,7 @@ void LaraCheatGetStuff() // (F) (D)
g_Inventory.LoadObjects(false); g_Inventory.LoadObjects(false);
} }
void DelsGiveLaraItemsCheat() // (AF) (D) void GiveLaraItemsCheat() // (AF) (D)
{ {
int i; int i;

View file

@ -1,7 +1,6 @@
#pragma once #pragma once
void lara_as_swim_cheat(ITEM_INFO* item, COLL_INFO* coll);
void lara_as_swimcheat(ITEM_INFO* item, COLL_INFO* coll);
void LaraCheatyBits(); void LaraCheatyBits();
void LaraCheatGetStuff(); void LaraCheatGetStuff();
void DelsGiveLaraItemsCheat(); void GiveLaraItemsCheat();

View file

@ -8,6 +8,12 @@
#include "level.h" #include "level.h"
#include "input.h" #include "input.h"
// LADDER CLIMBING
// ------------------------------
// Auxiliary Functions
// ------------------------------
short LeftIntRightExtTab[4] = // offset 0xA0B7C short LeftIntRightExtTab[4] = // offset 0xA0B7C
{ {
0x0800, 0x0100, 0x0200, 0x0400 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; 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) void lara_as_climbend(ITEM_INFO* item, COLL_INFO* coll)//46DF8(<), 4725C(<) (F)
{ {
coll->enableBaddiePush = false; coll->enableBaddiePush = false;
coll->enableSpaz = false; coll->enableSpaz = false;
Camera.flags = CF_FOLLOW_CENTER; 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) void lara_col_climbdown(ITEM_INFO* item, COLL_INFO* coll)//46BD0, 47034 (F)
{ {
if (LaraCheckForLetGo(item, coll) if (TestLaraLetGo(item) || item->animNumber != LA_LADDER_DOWN)
|| item->animNumber != LA_LADDER_DOWN) {
SetLaraLetGo(item, coll);
return; return;
}
int frame = item->frameNumber - g_Level.Anims[LA_LADDER_DOWN].frameBase; int frame = item->frameNumber - g_Level.Anims[LA_LADDER_DOWN].frameBase;
int xShift; 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) void lara_as_climbing(ITEM_INFO* item, COLL_INFO* coll)//46984(<), 46DE8(<) (F)
{ {
Camera.targetElevation = ANGLE(30.0f);
coll->enableBaddiePush = false; coll->enableBaddiePush = false;
coll->enableSpaz = false; coll->enableSpaz = false;
Camera.targetElevation = ANGLE(30);
} }
void lara_col_climbright(ITEM_INFO* item, COLL_INFO* coll)//46908(<), 46D6C(<) (F) 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->enableBaddiePush = false;
coll->enableSpaz = false; coll->enableSpaz = false;
Camera.targetAngle = ANGLE(30); Camera.targetAngle = ANGLE(30.0f);
Camera.targetElevation = -ANGLE(15); Camera.targetElevation = ANGLE(-15.0f);
if (!(TrInput & (IN_RIGHT | IN_RSTEP))) if (!(TrInput & (IN_RIGHT | IN_RSTEP)))
item->goalAnimState = LS_LADDER_IDLE; 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)) if (!LaraCheckForLetGo(item, coll))
{ {
int shift = 0; 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); 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->enableBaddiePush = false;
coll->enableSpaz = false; coll->enableSpaz = false;
Camera.targetAngle = -ANGLE(30); Camera.targetAngle = ANGLE(30.0f);
Camera.targetElevation = -ANGLE(15); Camera.targetElevation = ANGLE(15.0f);
if (!(TrInput & (IN_LEFT | IN_LSTEP))) if (!(TrInput & (IN_LEFT | IN_LSTEP)))
item->goalAnimState = LS_LADDER_IDLE; 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_FORWARD))
{ {
if (!(TrInput & IN_BACK)) if (!(TrInput & IN_BACK))
{
return; return;
}
if (item->goalAnimState == LS_HANG) if (item->goalAnimState == LS_HANG)
{
return; return;
}
item->goalAnimState = LS_LADDER_IDLE; item->goalAnimState = LS_LADDER_IDLE;
item->pos.yPos += 256; item->pos.yPos += 256;
@ -291,16 +382,22 @@ void lara_col_climbstnc(ITEM_INFO* item, COLL_INFO* coll) // (F) (D)
item->pos.yPos -= 256; item->pos.yPos -= 256;
if (!resultRight || !resultLeft || resultLeft == -2 || resultRight == -2) if (!resultRight || !resultLeft || resultLeft == -2 || resultRight == -2)
{
return; return;
}
yShift = ledgeLeft; yShift = ledgeLeft;
if (ledgeRight && ledgeLeft) if (ledgeRight && ledgeLeft)
{ {
if (ledgeLeft < 0 != ledgeRight < 0) if (ledgeLeft < 0 != ledgeRight < 0)
{
return; return;
}
if (ledgeRight < 0 == ledgeRight < ledgeLeft) if (ledgeRight < 0 == ledgeRight < ledgeLeft)
{
yShift = ledgeRight; yShift = ledgeRight;
}
} }
if (resultRight == 1 && resultLeft == 1) 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); resultLeft = LaraTestClimbUpPos(item, coll->radius, -120 - coll->radius, &shiftLeft, &ledgeLeft);
if (!resultRight || !resultLeft) if (!resultRight || !resultLeft)
{
return; return;
}
if (resultRight >= 0 && resultLeft >= 0) 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->enableSpaz = false;
coll->enableBaddiePush = false; coll->enableBaddiePush = false;
Camera.targetElevation = -ANGLE(20); Camera.targetElevation = ANGLE(-20.0f);
if (item->animNumber == LA_LADDER_DISMOUNT_LEFT_START) 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) if (item->animNumber == LA_LADDER_DISMOUNT_RIGHT_START)
{
Camera.targetAngle = ANGLE(60.0f); Camera.targetAngle = ANGLE(60.0f);
}
if (TrInput & IN_LOOK) 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) if (TrInput & IN_LEFT || TrInput & IN_LSTEP)
{ {
item->goalAnimState = LS_LADDER_LEFT; item->goalAnimState = LS_LADDER_LEFT;
Lara.moveAngle = -ANGLE(90); Lara.moveAngle = ANGLE(-90.0f);
} }
else if (TrInput & IN_RIGHT || TrInput & IN_RSTEP) else if (TrInput & IN_RIGHT || TrInput & IN_RSTEP)
{ {
item->goalAnimState = LS_LADDER_RIGHT; item->goalAnimState = LS_LADDER_RIGHT;
Lara.moveAngle = ANGLE(90); Lara.moveAngle = ANGLE(90.0f);
} }
else if (TrInput & IN_JUMP) else if (TrInput & IN_JUMP)
{ {
@ -405,8 +508,8 @@ void lara_as_stepoff_left(ITEM_INFO* item, COLL_INFO* coll)
coll->enableBaddiePush = false; coll->enableBaddiePush = false;
coll->enableSpaz = false; coll->enableSpaz = false;
Camera.targetAngle = -ANGLE(60.0f); Camera.targetAngle = ANGLE(-60.0f);
Camera.targetElevation = -ANGLE(15.0f); Camera.targetElevation = ANGLE(-15.0f);
item->pos.yRot -= ANGLE(90.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; coll->enableSpaz = false;
Camera.targetAngle = ANGLE(60.0f); Camera.targetAngle = ANGLE(60.0f);
Camera.targetElevation = -ANGLE(15.0f); Camera.targetElevation = ANGLE(-15.0f);
item->pos.yRot += ANGLE(90.0f); item->pos.yRot += ANGLE(90.0f);
} }
@ -626,7 +729,7 @@ int LaraClimbRightCornerTest(ITEM_INFO* item, COLL_INFO* coll)//45DE4, 46248
Lara.cornerX = x; Lara.cornerX = x;
item->pos.zPos = z; item->pos.zPos = z;
Lara.cornerZ = z; Lara.cornerZ = z;
item->pos.yRot += ANGLE(90); item->pos.yRot += ANGLE(90.0f);
Lara.moveAngle = 0; Lara.moveAngle = 0;
result = LaraTestClimbPos(item, coll->radius, coll->radius + 120, -512, 512, &shift); 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; Lara.cornerX = newX;
item->pos.zPos = newZ; item->pos.zPos = newZ;
Lara.cornerZ = newZ; Lara.cornerZ = newZ;
item->pos.yRot -= ANGLE(90); item->pos.yRot -= ANGLE(90.0f);
Lara.moveAngle = 0; Lara.moveAngle = 0;
result = LaraTestClimbPos(item, coll->radius, coll->radius + 120, -512, 512, &shift) != 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; Lara.cornerX = x;
item->pos.zPos = z; item->pos.zPos = z;
Lara.cornerZ = z; Lara.cornerZ = z;
item->pos.yRot -= ANGLE(90); item->pos.yRot -= ANGLE(90.0f);
Lara.moveAngle = 0; Lara.moveAngle = 0;
result = LaraTestClimbPos(item, coll->radius, -coll->radius - 120, -512, 512, &shift); 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; Lara.cornerX = newX;
item->pos.zPos = newZ; item->pos.zPos = newZ;
Lara.cornerZ = newZ; Lara.cornerZ = newZ;
item->pos.yRot += ANGLE(90); item->pos.yRot += ANGLE(90.0f);
Lara.moveAngle = 0; Lara.moveAngle = 0;
item->itemFlags[3] = LaraTestClimbPos(item, coll->radius, -coll->radius - 120, -512, 512, &shift); item->itemFlags[3] = LaraTestClimbPos(item, coll->radius, -coll->radius - 120, -512, 512, &shift);
result = item->itemFlags[3] != 0; 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 int LaraTestClimb(int x, int y, int z, int xFront, int zFront, int itemHeight, int itemRoom, int* shift)//457F0, 45C54
{ {
*shift = 0; *shift = 0;
int hang = 1; int hang = 1;
if (!Lara.climbStatus) if (!Lara.climbStatus)
@ -986,38 +1088,3 @@ int LaraTestClimbUpPos(ITEM_INFO* item, int front, int right, int* shift, int* l
return -2; 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;
}

View file

@ -4,9 +4,53 @@
#include "draw.h" #include "draw.h"
#include "effect2.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) 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->speed = 0;
item->gravityStatus = false; item->gravityStatus = false;
return 1; return true;
} }
if (coll->collType == CT_LEFT) 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); item->pos.yRot -= ANGLE(5.0f);
} }
return 0; return false;
} }
void LaraDeflectEdgeJump(ITEM_INFO* item, COLL_INFO* coll)//12904, 129B4 (F) 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->goalAnimState = LS_GRAB_TO_FALL;
item->currentAnimState = LS_GRAB_TO_FALL; item->currentAnimState = LS_GRAB_TO_FALL;
item->animNumber = LA_JUMP_UP_LAND; item->animNumber = LA_JUMP_UP_LAND;
item->frameNumber = g_Level.Anims[LA_JUMP_UP_LAND].frameBase; 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->goalAnimState = LS_FREEFALL;
item->currentAnimState = LS_FREEFALL; item->currentAnimState = LS_FREEFALL;
item->animNumber = LA_JUMP_WALL_SMASH_START; item->animNumber = LA_JUMP_WALL_SMASH_START;
item->frameNumber = g_Level.Anims[LA_JUMP_WALL_SMASH_START].frameBase + 1; 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); Lara.moveAngle += ANGLE(180);
if (item->fallspeed <= 0) if (item->fallspeed <= 0)
{
item->fallspeed = 1; item->fallspeed = 1;
}
} }
break; 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); return true;
item->gravityStatus = false;
item->speed = 0;
return 1;
} }
if (coll->collType == CT_LEFT) return false;
{
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;
} }
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) 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->fallspeed = 0;
item->gravityStatus = false; item->gravityStatus = false;
return 1; return true;
} }
return 0; return false;
} }
void LaraCollideStop(ITEM_INFO* item, COLL_INFO* coll)//126F0(<), 127A0(<) (F) 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_STOP:
case LS_TURN_RIGHT_SLOW: case LS_TURN_RIGHT_SLOW:
case LS_TURN_LEFT_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->currentAnimState = coll->oldAnimState;
item->animNumber = coll->oldAnimNumber; item->animNumber = coll->oldAnimNumber;
item->frameNumber = coll->oldFrameNumber; item->frameNumber = coll->oldFrameNumber;

View file

@ -1,11 +1,15 @@
#pragma once #pragma once
#include "lara_struct.h" #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); void LaraDeflectEdgeJump(ITEM_INFO* item, COLL_INFO* coll);
int LaraDeflectEdgeDuck(ITEM_INFO* item, COLL_INFO* coll); bool LaraHitCeiling(ITEM_INFO* item, COLL_INFO* coll);
int LaraHitCeiling(ITEM_INFO* item, COLL_INFO* coll);
void LaraCollideStop(ITEM_INFO* item, COLL_INFO* coll); void LaraCollideStop(ITEM_INFO* item, COLL_INFO* coll);
void SnapLaraToEdgeOfBlock(ITEM_INFO* item, COLL_INFO* coll, short angle); void SnapLaraToEdgeOfBlock(ITEM_INFO* item, COLL_INFO* coll, short angle);
short GetDirOctant(int rot); short GetDirOctant(int rot);
void GetLaraDeadlyBounds(); 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

View file

@ -1,25 +1,30 @@
#pragma once #pragma once
#include "lara_struct.h" #include "lara_struct.h"
/*crouch/duck start*/ // Auxiliary functions.
void lara_as_duck(ITEM_INFO* item, COLL_INFO* coll); bool TestLaraKeepCrouched(ITEM_INFO* player, COLL_INFO* coll);
void lara_col_duck(ITEM_INFO* item, 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_as_crouch_roll(ITEM_INFO* item, COLL_INFO* coll);
void lara_col_crouch_roll(ITEM_INFO* item, COLL_INFO* coll); void lara_col_crouch_roll(ITEM_INFO* item, COLL_INFO* coll);
/*crouch/duck end*/
/*-*/ // Crawling control & collision functions.
/*crawl start*/ void lara_as_crawl_stop(ITEM_INFO* item, COLL_INFO* coll);
void lara_as_all4s(ITEM_INFO* item, COLL_INFO* coll); void lara_col_crawl_stop(ITEM_INFO* item, COLL_INFO* coll);
void lara_col_all4s(ITEM_INFO* item, COLL_INFO* coll); void lara_as_crawl_forward(ITEM_INFO* item, COLL_INFO* coll);
void lara_as_crawl(ITEM_INFO* item, COLL_INFO* coll); void lara_col_crawl_forward(ITEM_INFO* item, COLL_INFO* coll);
void lara_col_crawl(ITEM_INFO* item, COLL_INFO* coll); void lara_as_crawl_turn_left(ITEM_INFO* item, COLL_INFO* coll);
void lara_as_all4turnl(ITEM_INFO* item, COLL_INFO* coll); void lara_as_crawl_turn_right(ITEM_INFO* item, COLL_INFO* coll);
void lara_as_all4turnr(ITEM_INFO* item, COLL_INFO* coll); void lara_col_crawl_turn(ITEM_INFO* item, COLL_INFO* coll);
void lara_col_all4turnlr(ITEM_INFO* item, COLL_INFO* coll); void lara_as_crawl_back(ITEM_INFO* item, COLL_INFO* coll);
void lara_as_crawlb(ITEM_INFO* item, COLL_INFO* coll); void lara_col_crawl_back(ITEM_INFO* item, COLL_INFO* coll);
void lara_col_crawlb(ITEM_INFO* item, COLL_INFO* coll); void lara_as_crouch_turn_left(ITEM_INFO* item, COLL_INFO* coll);
void lara_as_duckl(ITEM_INFO* item, COLL_INFO* coll); void lara_as_crouch_turn_right(ITEM_INFO* item, COLL_INFO* coll);
void lara_as_duckr(ITEM_INFO* item, COLL_INFO* coll); void lara_col_crouch_turn(ITEM_INFO* item, COLL_INFO* coll);
void lara_col_ducklr(ITEM_INFO* item, COLL_INFO* coll); void lara_col_crawl_to_hang(ITEM_INFO* item, COLL_INFO* coll);
/*crawl end*/
void lara_col_crawl2hang(ITEM_INFO* item, COLL_INFO* coll);

View file

@ -227,7 +227,8 @@ short HoldStates[] = {
LS_TURN_RIGHT_SLOW, LS_TURN_RIGHT_SLOW,
LS_TURN_LEFT_SLOW, LS_TURN_LEFT_SLOW,
LS_WALK_BACK, LS_WALK_BACK,
LS_TURN_FAST, LS_TURN_RIGHT_FAST,
LS_TURN_LEFT_FAST,
LS_STEP_RIGHT, LS_STEP_RIGHT,
LS_STEP_LEFT, LS_STEP_LEFT,
LS_PICKUP, LS_PICKUP,
@ -371,19 +372,19 @@ void LaraGun() // (F) (D)
|| LaraItem->currentAnimState == LS_CROUCH_TURN_LEFT || LaraItem->currentAnimState == LS_CROUCH_TURN_LEFT
|| LaraItem->currentAnimState == LS_CROUCH_TURN_RIGHT) || LaraItem->currentAnimState == LS_CROUCH_TURN_RIGHT)
&& (Lara.requestGunType == WEAPON_HK && (Lara.requestGunType == WEAPON_HK
|| Lara.requestGunType == WEAPON_CROSSBOW || Lara.requestGunType == WEAPON_CROSSBOW
|| Lara.requestGunType == WEAPON_SHOTGUN || Lara.requestGunType == WEAPON_SHOTGUN
|| Lara.requestGunType == WEAPON_HARPOON_GUN)) || Lara.requestGunType == WEAPON_HARPOON_GUN))
{ {
if (Lara.gunType == WEAPON_FLARE) if (Lara.gunType == WEAPON_FLARE)
Lara.requestGunType = WEAPON_FLARE; Lara.requestGunType = WEAPON_FLARE;
} }
else if (Lara.requestGunType == WEAPON_FLARE else if (Lara.requestGunType == WEAPON_FLARE
|| (Lara.Vehicle == NO_ITEM || (Lara.Vehicle == NO_ITEM
&& (Lara.requestGunType == WEAPON_HARPOON_GUN && (Lara.requestGunType == WEAPON_HARPOON_GUN
|| Lara.waterStatus == LW_ABOVE_WATER || Lara.waterStatus == LW_ABOVE_WATER
|| (Lara.waterStatus == LW_WADE || (Lara.waterStatus == LW_WADE
&& Lara.waterSurfaceDist > -Weapons[Lara.gunType].gunHeight)))) && Lara.waterSurfaceDist > -Weapons[Lara.gunType].gunHeight))))
{ {
if (Lara.gunType == WEAPON_FLARE) if (Lara.gunType == WEAPON_FLARE)
{ {
@ -411,18 +412,18 @@ void LaraGun() // (F) (D)
} }
else if (Lara.gunStatus == LG_READY) else if (Lara.gunStatus == LG_READY)
{ {
if ((TrInput & IN_DRAW) if ((TrInput & IN_DRAW)
|| Lara.requestGunType != Lara.gunType) || Lara.requestGunType != Lara.gunType)
Lara.gunStatus = LG_UNDRAW_GUNS; Lara.gunStatus = LG_UNDRAW_GUNS;
else if (Lara.gunType != WEAPON_HARPOON_GUN else if (Lara.gunType != WEAPON_HARPOON_GUN
&& Lara.waterStatus != LW_ABOVE_WATER && Lara.waterStatus != LW_ABOVE_WATER
&& (Lara.waterStatus != LW_WADE && (Lara.waterStatus != LW_WADE
|| Lara.waterSurfaceDist < -Weapons[Lara.gunType].gunHeight)) || Lara.waterSurfaceDist < -Weapons[Lara.gunType].gunHeight))
Lara.gunStatus = LG_UNDRAW_GUNS; Lara.gunStatus = LG_UNDRAW_GUNS;
} }
else if (Lara.gunStatus == LG_HANDS_BUSY else if (Lara.gunStatus == LG_HANDS_BUSY
&& (TrInput & IN_FLARE) && (TrInput & IN_FLARE)
&& LaraItem->currentAnimState == LS_CRAWL_IDLE && LaraItem->currentAnimState == LS_CRAWL_IDLE
&& LaraItem->animNumber == LA_CRAWL_IDLE) && LaraItem->animNumber == LA_CRAWL_IDLE)
{ {
Lara.requestGunType = WEAPON_FLARE; Lara.requestGunType = WEAPON_FLARE;
@ -430,154 +431,154 @@ void LaraGun() // (F) (D)
switch (Lara.gunStatus) switch (Lara.gunStatus)
{ {
case LG_DRAW_GUNS: case LG_DRAW_GUNS:
if (Lara.gunType != WEAPON_FLARE && Lara.gunType != WEAPON_NONE) if (Lara.gunType != WEAPON_FLARE && Lara.gunType != WEAPON_NONE)
Lara.lastGunType = Lara.gunType; Lara.lastGunType = Lara.gunType;
switch (Lara.gunType) switch (Lara.gunType)
{ {
case WEAPON_PISTOLS: case WEAPON_PISTOLS:
case WEAPON_REVOLVER: case WEAPON_REVOLVER:
case WEAPON_UZI: case WEAPON_UZI:
if (Camera.type != CINEMATIC_CAMERA && Camera.type != LOOK_CAMERA && Camera.type != HEAVY_CAMERA) if (Camera.type != CINEMATIC_CAMERA && Camera.type != LOOK_CAMERA && Camera.type != HEAVY_CAMERA)
Camera.type = COMBAT_CAMERA; Camera.type = COMBAT_CAMERA;
draw_pistols(Lara.gunType); draw_pistols(Lara.gunType);
break; break;
case WEAPON_SHOTGUN: case WEAPON_SHOTGUN:
case WEAPON_CROSSBOW: case WEAPON_CROSSBOW:
case WEAPON_HK: case WEAPON_HK:
case WEAPON_GRENADE_LAUNCHER: case WEAPON_GRENADE_LAUNCHER:
case WEAPON_ROCKET_LAUNCHER: case WEAPON_ROCKET_LAUNCHER:
case WEAPON_HARPOON_GUN: case WEAPON_HARPOON_GUN:
if (Camera.type != CINEMATIC_CAMERA && Camera.type != LOOK_CAMERA && Camera.type != HEAVY_CAMERA) if (Camera.type != CINEMATIC_CAMERA && Camera.type != LOOK_CAMERA && Camera.type != HEAVY_CAMERA)
Camera.type = COMBAT_CAMERA; Camera.type = COMBAT_CAMERA;
draw_shotgun(Lara.gunType); draw_shotgun(Lara.gunType);
break; break;
case WEAPON_FLARE: case WEAPON_FLARE:
draw_flare();
break;
default:
Lara.gunStatus = LG_NO_ARMS;
break;
}
break;
case LG_SPECIAL:
draw_flare(); draw_flare();
break; 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; 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: Lara.requestGunType = Objects[ID_PISTOLS_ITEM].loaded ? WEAPON_PISTOLS : WEAPON_NONE;
case WEAPON_REVOLVER: return;
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;
} }
}
switch (Lara.gunType)
{
case WEAPON_PISTOLS:
case WEAPON_UZI:
PistolHandler(Lara.gunType);
break; break;
case LG_READY: case WEAPON_SHOTGUN:
if (!(TrInput & IN_ACTION)) case WEAPON_CROSSBOW:
Lara.meshPtrs[LM_HEAD] = Objects[ID_LARA_SKIN].meshIndex + LM_HEAD; case WEAPON_HK:
else case WEAPON_GRENADE_LAUNCHER:
Lara.meshPtrs[LM_HEAD] = Objects[ID_LARA_SCREAM].meshIndex + LM_HEAD; case WEAPON_ROCKET_LAUNCHER:
case WEAPON_HARPOON_GUN:
if (Camera.type != CINEMATIC_CAMERA && Camera.type != LOOK_CAMERA && Camera.type != HEAVY_CAMERA) case WEAPON_REVOLVER:
Camera.type = COMBAT_CAMERA; RifleHandler(Lara.gunType);
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;
}
break; break;
case LG_NO_ARMS: default:
if (Lara.gunType == WEAPON_FLARE) 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;
if (++Lara.leftArm.frameNumber == 110)
Lara.leftArm.frameNumber = 0;
}
}
else
{
Lara.leftArm.frameNumber = 95;
Lara.flareControlLeft = true;
} }
} }
else 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); DoFlareInHand(Lara.flareAge);
set_flare_arm(Lara.leftArm.frameNumber); set_flare_arm(Lara.leftArm.frameNumber);
} }
break; }
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;
} }
} }
@ -656,7 +657,7 @@ int WeaponObjectMesh(int weaponType)
case WEAPON_CROSSBOW: case WEAPON_CROSSBOW:
return (Lara.Weapons[WEAPON_CROSSBOW].HasLasersight == true ? ID_LARA_CROSSBOW_LASER : ID_CROSSBOW_ANIM); return (Lara.Weapons[WEAPON_CROSSBOW].HasLasersight == true ? ID_LARA_CROSSBOW_LASER : ID_CROSSBOW_ANIM);
case WEAPON_GRENADE_LAUNCHER: case WEAPON_GRENADE_LAUNCHER:
return ID_GRENADE_ANIM; 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; CREATURE_INFO* creature = (CREATURE_INFO*)item->data;
OBJECT_INFO* obj = &Objects[item->objectNumber]; OBJECT_INFO* obj = &Objects[item->objectNumber];
item->hitStatus = true; item->hitStatus = true;
if (creature != nullptr && item != LaraItem) if (creature != nullptr && item != LaraItem)
creature->hurtByLara = true; creature->hurtByLara = true;
@ -687,16 +688,16 @@ void HitTarget(ITEM_INFO* item, GAME_VECTOR* hitPos, int damage, int flag)
{ {
switch (obj->hitEffect) switch (obj->hitEffect)
{ {
case 1: case 1:
DoBloodSplat(hitPos->x, hitPos->y, hitPos->z, (GetRandomControl() & 3) + 3, item->pos.yRot, item->roomNumber); DoBloodSplat(hitPos->x, hitPos->y, hitPos->z, (GetRandomControl() & 3) + 3, item->pos.yRot, item->roomNumber);
break; break;
case 3: case 3:
TriggerRicochetSpark(hitPos, LaraItem->pos.yRot, 3, 0); TriggerRicochetSpark(hitPos, LaraItem->pos.yRot, 3, 0);
break; break;
case 2: case 2:
TriggerRicochetSpark(hitPos, LaraItem->pos.yRot, 3, -5); TriggerRicochetSpark(hitPos, LaraItem->pos.yRot, 3, -5);
SoundEffect(SFX_SWORD_GOD_HITMET, &item->pos, 0); SoundEffect(SFX_SWORD_GOD_HITMET, &item->pos, 0);
break; break;
} }
} }
} }
@ -731,9 +732,9 @@ FireWeaponType FireWeapon(int weaponType, ITEM_INFO* target, ITEM_INFO* src, sho
rotation.zRot = 0; rotation.zRot = 0;
// Calculate ray from rotation angles // 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 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); Vector3 direction = Vector3(x, y, z);
direction.Normalize(); direction.Normalize();
Vector3 source = Vector3(pos.x, pos.y, pos.z); 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.hasFired = true;
Lara.fired = true; Lara.fired = true;
GAME_VECTOR vSrc; GAME_VECTOR vSrc;
vSrc.x = pos.x; vSrc.x = pos.x;
vSrc.y = pos.y; vSrc.y = pos.y;
@ -826,10 +827,10 @@ FireWeaponType FireWeapon(int weaponType, ITEM_INFO* target, ITEM_INFO* src, sho
} }
else else
{*/ {*/
if (!GetTargetOnLOS(&vSrc, &vDest, FALSE, TRUE)) if (!GetTargetOnLOS(&vSrc, &vDest, FALSE, TRUE))
HitTarget(target, &vDest, weapon->damage, NULL); HitTarget(target, &vDest, weapon->damage, NULL);
//} //}
return FW_MAYBEHIT; return FW_MAYBEHIT;
} }
} }
@ -841,7 +842,7 @@ void find_target_point(ITEM_INFO* item, GAME_VECTOR* target) // (F) (D)
bounds = (BOUNDING_BOX*)GetBestFrame(item); bounds = (BOUNDING_BOX*)GetBestFrame(item);
x = (int)(bounds->X1 + bounds->X2) / 2; 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; z = (int)(bounds->Z1 + bounds->Z2) / 2;
c = phd_cos(item->pos.yRot); c = phd_cos(item->pos.yRot);
s = phd_sin(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 (LOS(&src, &targetPoint))
{ {
if (angles[0] >= weapon->lockAngles[0] if (angles[0] >= weapon->lockAngles[0]
&& angles[0] <= weapon->lockAngles[1] && angles[0] <= weapon->lockAngles[1]
&& angles[1] >= weapon->lockAngles[2] && angles[1] >= weapon->lockAngles[2]
&& angles[1] <= weapon->lockAngles[3]) && angles[1] <= weapon->lockAngles[3])
{ {
Lara.rightArm.lock = true; Lara.rightArm.lock = true;
Lara.leftArm.lock = true; Lara.leftArm.lock = true;
@ -893,18 +894,18 @@ void LaraTargetInfo(WEAPON_INFO* weapon) // (F) (D)
if (Lara.leftArm.lock) if (Lara.leftArm.lock)
{ {
if ((angles[0] < weapon->leftAngles[0] || if ((angles[0] < weapon->leftAngles[0] ||
angles[0] > weapon->leftAngles[1] || angles[0] > weapon->leftAngles[1] ||
angles[1] < weapon->leftAngles[2] || angles[1] < weapon->leftAngles[2] ||
angles[1] > weapon->leftAngles[3])) angles[1] > weapon->leftAngles[3]))
Lara.leftArm.lock = false; Lara.leftArm.lock = false;
} }
if (Lara.rightArm.lock) if (Lara.rightArm.lock)
{ {
if ((angles[0] < weapon->rightAngles[0] || if ((angles[0] < weapon->rightAngles[0] ||
angles[0] > weapon->rightAngles[1] || angles[0] > weapon->rightAngles[1] ||
angles[1] < weapon->rightAngles[2] || angles[1] < weapon->rightAngles[2] ||
angles[1] > weapon->rightAngles[3])) angles[1] > weapon->rightAngles[3]))
Lara.rightArm.lock = false; Lara.rightArm.lock = false;
} }
} }
@ -933,7 +934,7 @@ bool CheckForHoldingState(int state) // (F) (D)
return true; return true;
holdState++; holdState++;
} }
return false; return false;
} }
@ -942,7 +943,7 @@ void LaraGetNewTarget(WEAPON_INFO* weapon) // (F) (D)
GAME_VECTOR src, target; GAME_VECTOR src, target;
PHD_VECTOR muzzleOffset; PHD_VECTOR muzzleOffset;
int bestDistance, maxDistance, targets, slot, x, y, z, distance; int bestDistance, maxDistance, targets, slot, x, y, z, distance;
ITEM_INFO* bestItem, *item; ITEM_INFO* bestItem, * item;
short bestYrot, angle[2], match; short bestYrot, angle[2], match;
bool flag, loop; 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 && if (y > (height + 32) && bs == 0 &&
(((x >> WALL_SHIFT) != (item->pos.xPos >> WALL_SHIFT)) || (((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. // 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 && if (y < ceiling &&
(((x >> WALL_SHIFT) != (item->pos.xPos >> WALL_SHIFT)) || (((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. // 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) HOLSTER_SLOT HolsterSlotForWeapon(LARA_WEAPON_TYPE weapon)
{ {
switch(weapon){ switch (weapon) {
case WEAPON_PISTOLS: case WEAPON_PISTOLS:
return HOLSTER_SLOT::Pistols; return HOLSTER_SLOT::Pistols;
case WEAPON_UZI: case WEAPON_UZI:
return HOLSTER_SLOT::Uzis; return HOLSTER_SLOT::Uzis;
case WEAPON_REVOLVER: case WEAPON_REVOLVER:
return HOLSTER_SLOT::Revolver; return HOLSTER_SLOT::Revolver;
case WEAPON_SHOTGUN: case WEAPON_SHOTGUN:
return HOLSTER_SLOT::Shotgun; return HOLSTER_SLOT::Shotgun;
case WEAPON_HK: case WEAPON_HK:
return HOLSTER_SLOT::HK; return HOLSTER_SLOT::HK;
case WEAPON_HARPOON_GUN: case WEAPON_HARPOON_GUN:
return HOLSTER_SLOT::Harpoon; return HOLSTER_SLOT::Harpoon;
case WEAPON_CROSSBOW: case WEAPON_CROSSBOW:
return HOLSTER_SLOT::Crowssbow; return HOLSTER_SLOT::Crowssbow;
case WEAPON_GRENADE_LAUNCHER: case WEAPON_GRENADE_LAUNCHER:
return HOLSTER_SLOT::GrenadeLauncher; return HOLSTER_SLOT::GrenadeLauncher;
case WEAPON_ROCKET_LAUNCHER: case WEAPON_ROCKET_LAUNCHER:
return HOLSTER_SLOT::RocketLauncher; return HOLSTER_SLOT::RocketLauncher;
default: default:
return HOLSTER_SLOT::Empty; return HOLSTER_SLOT::Empty;
} }
} }

View file

@ -12,27 +12,24 @@
#include "effect2.h" #include "effect2.h"
#include "chaffFX.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 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 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 }; 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 itemNum) // (AF) (D)
void FlareControl(short itemNumber) // (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) if (g_Level.Rooms[item->roomNumber].flags & ENV_FLAG_SWAMP)
{ {
KillItem(itemNumber); KillItem(itemNum);
return; return;
} }
if (item->fallspeed) if (item->fallspeed)
{ {
item->pos.xRot += ANGLE(3); item->pos.xRot += ANGLE(3.0f);
item->pos.zRot += ANGLE(5); item->pos.zRot += ANGLE(5.0f);
} }
else else
{ {
@ -50,25 +47,26 @@ void FlareControl(short itemNumber) // (AF) (D)
item->pos.xPos += xv; item->pos.xPos += xv;
item->pos.zPos += zv; item->pos.zPos += zv;
if (g_Level.Rooms[item->roomNumber].flags & ENV_FLAG_WATER) if (g_Level.Rooms[item->roomNumber].flags & ENV_FLAG_WATER)
{ {
item->fallspeed += (5 - item->fallspeed) / 2; item->fallspeed += (5 - item->fallspeed) / 2;
item->speed += (5 - item->speed) / 2; item->speed += (5 - item->speed) / 2;
} }
else else
{
item->fallspeed += 6; item->fallspeed += 6;
}
item->pos.yPos += item->fallspeed; 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; short age = (short)(item->data) & 0x7FFF;
if (age >= 900) if (age >= 900)
{ {
if (!item->fallspeed && !item->speed) if (!item->fallspeed && !item->speed)
{ {
KillItem(itemNumber); KillItem(itemNum);
return; 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) if (collided || GetFloorHeight(floor, pos.x, pos.y, pos.z) < pos.y)
{ {
flag = true; 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.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->pos.zPos = LaraItem->pos.zPos + (320 * phd_cos(item->pos.yRot) >> W2V_SHIFT);
item->roomNumber = LaraItem->roomNumber; item->roomNumber = LaraItem->roomNumber;
@ -335,9 +333,14 @@ void CreateFlare(short objectNum, int thrown) // (F) (D)
else else
{ {
if (thrown) if (thrown)
{
item->pos.yRot = LaraItem->pos.yRot; item->pos.yRot = LaraItem->pos.yRot;
}
else else
item->pos.yRot = LaraItem->pos.yRot - ANGLE(45); {
item->pos.yRot = LaraItem->pos.yRot - ANGLE(45.0f);
}
item->roomNumber = roomNumber; item->roomNumber = roomNumber;
} }
@ -359,14 +362,20 @@ void CreateFlare(short objectNum, int thrown) // (F) (D)
} }
if (flag) if (flag)
{
item->speed >>= 1; item->speed >>= 1;
}
if (objectNum == ID_FLARE_ITEM) if (objectNum == ID_FLARE_ITEM)
{ {
if (DoFlareLight((PHD_VECTOR*)&item->pos, Lara.flareAge)) if (DoFlareLight((PHD_VECTOR*)&item->pos, Lara.flareAge))
{
item->data = (void*)(Lara.flareAge | 0x8000); item->data = (void*)(Lara.flareAge | 0x8000);
}
else else
{
item->data = (void*)(Lara.flareAge & 0x7FFF); item->data = (void*)(Lara.flareAge & 0x7FFF);
}
} }
else else
{ {
@ -393,7 +402,9 @@ void DoFlareInHand(int flare_age) // (AF) (D)
GetLaraJointPosition(&pos, LM_LHAND); GetLaraJointPosition(&pos, LM_LHAND);
if (DoFlareLight(&pos, flare_age)) if (DoFlareLight(&pos, flare_age))
{
TriggerChaffEffects(flare_age); TriggerChaffEffects(flare_age);
}
/* Hardcoded code */ /* Hardcoded code */
@ -415,7 +426,10 @@ int DoFlareLight(PHD_VECTOR* pos, int age)//49708, 49B6C (F)
float random; float random;
int falloff; int falloff;
if (age >= 900 || age == 0) if (age >= 900 || age == 0)
{
return 0; return 0;
}
random = frand(); random = frand();
x = pos->x + (random* 120); x = pos->x + (random* 120);
@ -431,6 +445,7 @@ int DoFlareLight(PHD_VECTOR* pos, int age)//49708, 49B6C (F)
b = FlareMainColor.z * 255; b = FlareMainColor.z * 255;
TriggerDynamicLight(x, y, z, falloff, r, g, b); TriggerDynamicLight(x, y, z, falloff, r, g, b);
return (random < 0.9f); return (random < 0.9f);
} }
else if (age < 810) else if (age < 810)
@ -442,6 +457,7 @@ int DoFlareLight(PHD_VECTOR* pos, int age)//49708, 49B6C (F)
g = FlareMainColor.y * 255 * multiplier; g = FlareMainColor.y * 255 * multiplier;
b = FlareMainColor.z * 255 * multiplier; b = FlareMainColor.z * 255 * multiplier;
TriggerDynamicLight(x, y, z, falloff, r, g, b); TriggerDynamicLight(x, y, z, falloff, r, g, b);
return (random < 0.4f); return (random < 0.4f);
} }
else else
@ -452,9 +468,8 @@ int DoFlareLight(PHD_VECTOR* pos, int age)//49708, 49B6C (F)
r = FlareMainColor.x * 255 * multiplier; r = FlareMainColor.x * 255 * multiplier;
g = FlareMainColor.y * 255 * multiplier; g = FlareMainColor.y * 255 * multiplier;
b = FlareMainColor.z * 255 * multiplier; b = FlareMainColor.z * 255 * multiplier;
TriggerDynamicLight(x, y, z, falloff, r, g, b); TriggerDynamicLight(x, y, z, falloff, r, g, b);
return (random < .3f);
}
return (random < .3f);
}
} }

View file

@ -3,15 +3,24 @@
#include "input.h" #include "input.h"
#include "lara_tests.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) void lara_as_hang(ITEM_INFO* item, COLL_INFO* coll)//19A28, 19B5C (F)
{ {
/*state 10*/ Camera.targetAngle = 0;
/*collision: lara_col_hang*/ Camera.targetElevation = ANGLE(-45.0f);
Lara.isClimbing = false; Lara.isClimbing = false;
coll->enableBaddiePush = false;
coll->enableSpaz = false;
if (item->hitPoints <= 0) if (item->hitPoints <= 0)
{ {
item->goalAnimState = LS_STOP; 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) if (TrInput & IN_LOOK)
{
LookUpDown(); 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) void lara_col_hang(ITEM_INFO* item, COLL_INFO* coll)//19AC8, 19BFC (F)
{ {
/*state 10*/
/*state code: lara_as_hang*/
item->fallspeed = 0; item->fallspeed = 0;
item->gravityStatus = false; 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 (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; item->goalAnimState = LS_SHIMMY_LEFT;
return; return;
} }
@ -52,9 +56,13 @@ void lara_col_hang(ITEM_INFO* item, COLL_INFO* coll)//19AC8, 19BFC (F)
if (flag != 0) if (flag != 0)
{ {
if (flag <= 0) if (flag <= 0)
{
item->goalAnimState = LS_SHIMMY_INNER_LEFT; item->goalAnimState = LS_SHIMMY_INNER_LEFT;
}
else else
{
item->goalAnimState = LS_SHIMMY_OUTER_LEFT; item->goalAnimState = LS_SHIMMY_OUTER_LEFT;
}
return; 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))) if (CanLaraHangSideways(item, coll, ANGLE(90.0f)))
{ {
item->goalAnimState = LS_SHIMMY_RIGHT; item->goalAnimState = LS_SHIMMY_RIGHT;
return; return;
} }
@ -73,9 +80,13 @@ void lara_col_hang(ITEM_INFO* item, COLL_INFO* coll)//19AC8, 19BFC (F)
if (flag != 0) if (flag != 0)
{ {
if (flag <= 0) if (flag <= 0)
{
item->goalAnimState = LS_SHIMMY_INNER_RIGHT; item->goalAnimState = LS_SHIMMY_INNER_RIGHT;
}
else else
{
item->goalAnimState = LS_SHIMMY_OUTER_RIGHT; item->goalAnimState = LS_SHIMMY_OUTER_RIGHT;
}
return; 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*/ Camera.targetAngle = 0;
/*collision: lara_col_hangleft*/ Camera.targetElevation = ANGLE(-45.0f);
coll->enableBaddiePush = false; coll->enableBaddiePush = false;
coll->enableSpaz = 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*/ Lara.moveAngle = ANGLE(-90.0f);
/*state code: lara_as_hangleft*/ coll->radius = LARA_RAD; /* @ORIGINAL_BUG: original value, 102, can make Lara glitch if coll->frontType is DIAGONAL or SPLIT_TRI */
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 */
LaraHangTest(item, coll); 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*/ Camera.targetAngle = 0;
/*collision: lara_col_hangright*/ Camera.targetElevation = ANGLE(-45.0f);
coll->enableBaddiePush = false; coll->enableBaddiePush = false;
coll->enableSpaz = false; coll->enableSpaz = false;
Camera.targetAngle = 0;
Camera.targetElevation = -ANGLE(45.0f); if (TrInput & IN_RIGHT || TrInput & IN_RSTEP)
if (!(TrInput & (IN_RIGHT | IN_RSTEP))) {
item->goalAnimState = LS_HANG; 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*/ Lara.moveAngle = ANGLE(90.0f);
/*state code: lara_as_hangright*/ coll->radius = LARA_RAD; /* @ORIGINAL_BUG: original value, 102, can make Lara glitch if coll->frontType is DIAGONAL or SPLIT_TRI */
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 */
LaraHangTest(item, coll); 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) void lara_as_extcornerl(ITEM_INFO* item, COLL_INFO* coll)//1A1F0(<), 1A324(<) (F)
{ {
/*state 107*/
/*collision: lara_default_col*/
Camera.laraNode = 8; Camera.laraNode = 8;
Camera.targetElevation = ANGLE(33.0f); Camera.targetElevation = ANGLE(33.0f);
SetCornerAnim(item, coll, ANGLE(90.0f), SetCornerAnim(item, coll, ANGLE(90.0f),
item->animNumber == LA_SHIMMY_LEFT_CORNER_OUTER_END || item->animNumber == LA_SHIMMY_LEFT_CORNER_OUTER_END ||
item->animNumber == LA_LADDER_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) void lara_as_extcornerr(ITEM_INFO* item, COLL_INFO* coll)//1A244(<), 1A378(<) (F)
{ {
/*state 108*/
/*collision: lara_default_col*/
Camera.laraNode = 8; Camera.laraNode = 8;
Camera.targetElevation = ANGLE(33.0f); Camera.targetElevation = ANGLE(33.0f);
SetCornerAnim(item, coll, -ANGLE(90.0f), SetCornerAnim(item, coll, -ANGLE(90.0f),
item->animNumber == LA_SHIMMY_RIGHT_CORNER_OUTER_END || item->animNumber == LA_SHIMMY_RIGHT_CORNER_OUTER_END ||
item->animNumber == LA_LADDER_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) void lara_as_intcornerl(ITEM_INFO* item, COLL_INFO* coll)//1A298(<), 1A3CC(<) (F)
{ {
/*state 109*/
/*collision: lara_default_col*/
Camera.laraNode = 8; Camera.laraNode = 8;
Camera.targetElevation = ANGLE(33.0f); Camera.targetElevation = ANGLE(33.0f);
SetCornerAnim(item, coll, -ANGLE(90.0f), SetCornerAnim(item, coll, -ANGLE(90.0f),
item->animNumber == LA_SHIMMY_LEFT_CORNER_INNER_END || item->animNumber == LA_SHIMMY_LEFT_CORNER_INNER_END ||
item->animNumber == LA_LADDER_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) void lara_as_intcornerr(ITEM_INFO* item, COLL_INFO* coll)//1A2EC(<), 1A420(<) (F)
{ {
/*state 110*/
/*collision: lara_default_col*/
Camera.laraNode = 8; Camera.laraNode = 8;
Camera.targetElevation = ANGLE(33.0f); Camera.targetElevation = ANGLE(33.0f);
SetCornerAnim(item, coll, ANGLE(90.0f), SetCornerAnim(item, coll, ANGLE(90.0f),
item->animNumber == LA_SHIMMY_RIGHT_CORNER_INNER_END || item->animNumber == LA_SHIMMY_RIGHT_CORNER_INNER_END ||
item->animNumber == LA_LADDER_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) -crouch pull up(works well, tested with placeholder anim)
-corner anims(works well, tested with placeholder anims) -corner anims(works well, tested with placeholder anims)
-handstand(not tested)*/ -handstand(not tested)*/
// State: 139
// Collision: lara_col_hang_feet()
void lara_as_hang_feet(ITEM_INFO* item, COLL_INFO* coll) void lara_as_hang_feet(ITEM_INFO* item, COLL_INFO* coll)
{ {
/*state 139*/ lara_as_hang(item, coll);
/*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);
} }
// State: 139
// Collision: lara_as_hang_feet()
void lara_col_hang_feet(ITEM_INFO* item, COLL_INFO* coll) void lara_col_hang_feet(ITEM_INFO* item, COLL_INFO* coll)
{ {
/*state 139*/
/*state code: lara_as_hang_feet*/
item->fallspeed = 0; item->fallspeed = 0;
item->gravityStatus = false; item->gravityStatus = false;
@ -303,7 +324,9 @@ void lara_col_hang_feet(ITEM_INFO* item, COLL_INFO* coll)
LaraHangTest(item, coll); LaraHangTest(item, coll);
if (!(TrInput & IN_ACTION)) if (!(TrInput & IN_ACTION))
{
item->goalAnimState = LS_JUMP_UP; item->goalAnimState = LS_JUMP_UP;
}
if (item->animNumber == LA_HANG_FEET_IDLE) 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; item->goalAnimState = LS_SHIMMY_FEET_LEFT;
return; return;
} }
flag = LaraHangLeftCornerTest(item, coll); flag = LaraHangLeftCornerTest(item, coll);
if (flag != 0) 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 (TrInput & IN_RIGHT || TrInput & IN_RSTEP)
{ {
if (CanLaraHangSideways(item, coll, ANGLE(90.0f))) if (CanLaraHangSideways(item, coll, ANGLE(90.0f)))
@ -337,6 +360,7 @@ void lara_col_hang_feet(ITEM_INFO* item, COLL_INFO* coll)
return; return;
} }
flag = LaraHangRightCornerTest(item, coll); flag = LaraHangRightCornerTest(item, coll);
if (flag != 0) if (flag != 0)
{ {
@ -348,7 +372,6 @@ void lara_col_hang_feet(ITEM_INFO* item, COLL_INFO* coll)
} }
} }
TestForObjectOnLedge(item, coll); TestForObjectOnLedge(item, coll);
if (TrInput & IN_FORWARD) if (TrInput & IN_FORWARD)
{ {
@ -378,6 +401,7 @@ void lara_col_hang_feet(ITEM_INFO* item, COLL_INFO* coll)
} }
} }
} }
if (coll->frontFloor < -650 && if (coll->frontFloor < -650 &&
coll->frontFloor - coll->frontCeiling >= -256 && coll->frontFloor - coll->frontCeiling >= -256 &&
coll->frontFloor - coll->leftCeiling2 >= -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->goalAnimState = LS_HANG_TO_CRAWL;
item->requiredAnimState = LS_CROUCH_IDLE; item->requiredAnimState = LS_CROUCH_IDLE;
return; return;
} }
} }
@ -412,97 +437,120 @@ void lara_col_hang_feet(ITEM_INFO* item, COLL_INFO* coll)
}*///commenting till daniel makes anims }*///commenting till daniel makes anims
Lara.moveAngle = 0; Lara.moveAngle = 0;
LaraHangTest(item, coll); 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*/ Camera.targetAngle = 0;
/*collision: lara_col_hang_feet_shimmyr*/ Camera.targetElevation = ANGLE(-45.0f);
coll->enableBaddiePush = false; coll->enableBaddiePush = false;
coll->enableSpaz = 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.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->enableBaddiePush = false;
coll->enableSpaz = false; coll->enableSpaz = false;
Camera.targetAngle = 0;
Camera.targetElevation = -ANGLE(45.0f); if (TrInput & IN_LEFT || TrInput & IN_LSTEP)
if (!(TrInput & (IN_LEFT | IN_LSTEP))) {
item->goalAnimState = LS_HANG_FEET; 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*/ lara_col_shimmy_left(item, coll);
/*state code: lara_as_hang_feet_shimmyl*/
Lara.moveAngle = -ANGLE(90);
coll->radius = LARA_RAD;
LaraHangTest(item, coll);
Lara.moveAngle = -ANGLE(90);
} }
/*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.laraNode = 8;
Camera.targetElevation = ANGLE(33.0f); 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? 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), SetCornerAnimFeet(item, coll, ANGLE(90.0f),
item->animNumber = LA_SHIMMY_FEET_RIGHT_CORNER_INNER); 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.laraNode = 8;
Camera.targetElevation = ANGLE(33.0f); Camera.targetElevation = ANGLE(33.0f);
if (item->frameNumber == g_Level.Anims[LA_SHIMMY_FEET_LEFT_CORNER_INNER].frameEnd) if (item->frameNumber == g_Level.Anims[LA_SHIMMY_FEET_LEFT_CORNER_INNER].frameEnd)
{
SetCornerAnimFeet(item, coll, -ANGLE(90.0f), SetCornerAnimFeet(item, coll, -ANGLE(90.0f),
item->animNumber = LA_SHIMMY_FEET_LEFT_CORNER_INNER); 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.laraNode = 8;
Camera.targetElevation = ANGLE(33.0f); Camera.targetElevation = ANGLE(33.0f);
if (item->frameNumber == g_Level.Anims[LA_SHIMMY_FEET_RIGHT_CORNER_OUTER].frameEnd) if (item->frameNumber == g_Level.Anims[LA_SHIMMY_FEET_RIGHT_CORNER_OUTER].frameEnd)
{
SetCornerAnimFeet(item, coll, -ANGLE(90.0f), SetCornerAnimFeet(item, coll, -ANGLE(90.0f),
item->animNumber = LA_SHIMMY_FEET_RIGHT_CORNER_OUTER); 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.laraNode = 8;
Camera.targetElevation = ANGLE(33.0f); Camera.targetElevation = ANGLE(33.0f);
if (item->frameNumber == g_Level.Anims[LA_SHIMMY_FEET_LEFT_CORNER_OUTER].frameEnd) if (item->frameNumber == g_Level.Anims[LA_SHIMMY_FEET_LEFT_CORNER_OUTER].frameEnd)
{
SetCornerAnimFeet(item, coll, ANGLE(90.0f), SetCornerAnimFeet(item, coll, ANGLE(90.0f),
item->animNumber = LA_SHIMMY_FEET_LEFT_CORNER_OUTER); item->animNumber = LA_SHIMMY_FEET_LEFT_CORNER_OUTER);
}
} }

View file

@ -1,27 +1,30 @@
#pragma once #pragma once
#include "lara_struct.h" #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_as_hang(ITEM_INFO* item, COLL_INFO* coll);
void lara_col_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_as_shimmy_left(ITEM_INFO* item, COLL_INFO* coll);
void lara_col_hangleft(ITEM_INFO* item, COLL_INFO* coll); void lara_col_shimmy_left(ITEM_INFO* item, COLL_INFO* coll);
void lara_as_hangright(ITEM_INFO* item, COLL_INFO* coll); void lara_as_shimmy_right(ITEM_INFO* item, COLL_INFO* coll);
void lara_col_hangright(ITEM_INFO* item, COLL_INFO* coll); void lara_col_shimmy_right(ITEM_INFO* item, COLL_INFO* coll);
/*go around corners*/
// Shimmying around corners control & collision functions.
void lara_as_extcornerl(ITEM_INFO* item, COLL_INFO* coll); void lara_as_extcornerl(ITEM_INFO* item, COLL_INFO* coll);
void lara_as_extcornerr(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_intcornerl(ITEM_INFO* item, COLL_INFO* coll);
void lara_as_intcornerr(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_as_hang_feet(ITEM_INFO* item, COLL_INFO* coll);
void lara_col_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_as_shimmy_feet_right(ITEM_INFO* item, COLL_INFO* coll);
void lara_col_hang_feet_shimmyr(ITEM_INFO* item, COLL_INFO* coll); void lara_col_shimmy_feet_right(ITEM_INFO* item, COLL_INFO* coll);
void lara_as_hang_feet_shimmyl(ITEM_INFO* item, COLL_INFO* coll); void lara_as_shimmy_feet_left(ITEM_INFO* item, COLL_INFO* coll);
void lara_col_hang_feet_shimmyl(ITEM_INFO* item, COLL_INFO* coll); void lara_col_shimmy_feet_left(ITEM_INFO* item, COLL_INFO* coll);
/*go around corners feet*/
void lara_as_hang_feet_inRcorner(ITEM_INFO* item, COLL_INFO* coll); // Shimmying by feet around corners control & collision functions.
void lara_as_hang_feet_inLcorner(ITEM_INFO* item, COLL_INFO* coll); void lara_as_hang_feet_right_corner_inner(ITEM_INFO* item, COLL_INFO* coll);
void lara_as_hang_feet_outRcorner(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_outLcorner(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);

View file

@ -149,7 +149,7 @@ void InitialiseLaraAnims(ITEM_INFO* item) // (F) (D)
Lara.waterStatus = LW_ABOVE_WATER; Lara.waterStatus = LW_ABOVE_WATER;
item->goalAnimState = LS_STOP; item->goalAnimState = LS_STOP;
item->currentAnimState = LS_STOP; item->currentAnimState = LS_STOP;
item->animNumber = LA_STAND_SOLID; item->animNumber = LA_STAND_IDLE;
item->frameNumber = g_Level.Anims[item->animNumber].frameBase; item->frameNumber = g_Level.Anims[item->animNumber].frameBase;
} }
} }

File diff suppressed because it is too large Load diff

View file

@ -1,61 +1,50 @@
#pragma once #pragma once
#include "lara_struct.h" #include "lara_struct.h"
/*pickups*/ // Pickup control functions.
void lara_as_pickup(ITEM_INFO* item, COLL_INFO* coll); void lara_as_pickup(ITEM_INFO* item, COLL_INFO* coll);
void lara_as_pickupflare(ITEM_INFO* item, COLL_INFO* coll); void lara_as_pickup_flare(ITEM_INFO* item, COLL_INFO* coll);
/*end pickups*/
/*-*/ // Switch control & collision functions.
/*switches*/ void lara_as_switch(ITEM_INFO* item, COLL_INFO* coll);
void lara_as_switchon(ITEM_INFO* item, COLL_INFO* coll);
void lara_as_switchoff(ITEM_INFO* item, COLL_INFO* coll);
void lara_col_turnswitch(ITEM_INFO* item, COLL_INFO* coll); void lara_col_turnswitch(ITEM_INFO* item, COLL_INFO* coll);
/*end switches*/
/*-*/ // Puzzle & key control functions.
/*puzzles and keys*/ void lara_as_use_key(ITEM_INFO* item, COLL_INFO* coll);
void lara_as_usekey(ITEM_INFO* item, COLL_INFO* coll); void lara_as_use_puzzle(ITEM_INFO* item, COLL_INFO* coll);
void lara_as_usepuzzle(ITEM_INFO* item, COLL_INFO* coll);
/*end puzzles and keys*/ // Pushable state functions.
/*-*/ void lara_as_pushable_push(ITEM_INFO* item, COLL_INFO* coll);
/*pushables*/ void lara_as_pushable_pull(ITEM_INFO* item, COLL_INFO* coll);
void lara_as_pushblock(ITEM_INFO* item, COLL_INFO* coll); void lara_as_pushable_ready(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); // Pulley control function.
/*end pushables*/
/*-*/
/*pulley*/
void lara_as_pulley(ITEM_INFO* item, COLL_INFO* coll); void lara_as_pulley(ITEM_INFO* item, COLL_INFO* coll);
/*end pulley*/
/*-*/ // Swingbar control functions.
/*parallel bars*/ void lara_as_swing_bar(ITEM_INFO* item, COLL_INFO* coll);
void lara_as_parallelbars(ITEM_INFO* item, COLL_INFO* coll); void lara_as_swing_bar_leap(ITEM_INFO* item, COLL_INFO* coll);
void lara_as_pbleapoff(ITEM_INFO* item, COLL_INFO* coll);
/*end parallel bars*/ // Tightrope control functions.
/*-*/ void lara_as_tightrope_stop(ITEM_INFO* item, COLL_INFO* coll);
/*tightropes*/ void lara_as_tightrope_walk(ITEM_INFO* item, COLL_INFO* coll);
void lara_as_trpose(ITEM_INFO* item, COLL_INFO* coll); void lara_as_tightrope_fall(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); // Rope control & collision functions.
/*end tightropes*/ 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);
/*ropes*/
void lara_as_ropel(ITEM_INFO* item, COLL_INFO* coll);
void lara_as_roper(ITEM_INFO* item, COLL_INFO* coll);
void lara_as_rope(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_rope(ITEM_INFO* item, COLL_INFO* coll);
void lara_col_ropefwd(ITEM_INFO* item, COLL_INFO* coll); void lara_col_rope_swing(ITEM_INFO* item, COLL_INFO* coll);
void lara_as_climbrope(ITEM_INFO* item, COLL_INFO* coll); void lara_as_rope_up(ITEM_INFO* item, COLL_INFO* coll);
void lara_as_climbroped(ITEM_INFO* item, COLL_INFO* coll); void lara_as_rope_down(ITEM_INFO* item, COLL_INFO* coll);
/*end ropes*/
/*-*/ // Pole control & collision functions.
/*poles*/ void lara_col_pole_stop(ITEM_INFO* item, COLL_INFO* coll);
void lara_col_polestat(ITEM_INFO* item, COLL_INFO* coll); void lara_col_pole_up(ITEM_INFO* item, COLL_INFO* coll);
void lara_col_poleup(ITEM_INFO* item, COLL_INFO* coll); void lara_col_pole_down(ITEM_INFO* item, COLL_INFO* coll);
void lara_col_poledown(ITEM_INFO* item, COLL_INFO* coll); void lara_as_pole_turn_clockwise(ITEM_INFO* item, COLL_INFO* coll);
void lara_as_poleleft(ITEM_INFO* item, COLL_INFO* coll); void lara_as_pole_turn_counter_clockwise(ITEM_INFO* item, COLL_INFO* coll);
void lara_as_poleright(ITEM_INFO* item, COLL_INFO* coll);
/*end poles*/ // Zipline control functions.
/*-*/ void lara_as_zipline(ITEM_INFO* item, COLL_INFO* coll);
/*deathslide*/
void lara_as_deathslide(ITEM_INFO* item, COLL_INFO* coll);
/*end deathslide*/

View file

@ -1,15 +1,113 @@
#include "framework.h" #include "framework.h"
#include "lara.h" #include "lara.h"
#include "lara_collide.h" #include "lara_collide.h"
#include "lara_tests.h"
#include "input.h" #include "input.h"
#include "sound.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*/ // SLOPE SLIDING
int TestLaraSlide(ITEM_INFO* item, COLL_INFO* coll) // (F) (D)
// ------------------------------
// 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) if (abs(coll->tiltX) <= 2 && abs(coll->tiltZ) <= 2)
return 0; return 0;
@ -59,64 +157,12 @@ int TestLaraSlide(ITEM_INFO* item, COLL_INFO* coll) // (F) (D)
return 1; 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); ShiftItem(item, coll);
@ -150,41 +196,245 @@ void LaraSlideEdgeJump(ITEM_INFO* item, COLL_INFO* coll)//12B18, 12BC8 (F)
break; break;
} }
} }
/*end tests and others*/
/*-*/ // ------------------------------
/*Lara state code*/ // SLOPE SLIDING
void lara_as_slide(ITEM_INFO* item, COLL_INFO* coll)//1A824(<), 1A958(<) (F) // Control & Collision Functions
// ------------------------------
// State: 24
// Collision: lara_col_Slide()
void lara_as_slide(ITEM_INFO* player, COLL_INFO* coll)//1A824(<), 1A958(<) (F)
{ {
/*state 24*/ Camera.targetElevation = player->pos.xRot - ANGLE(45.0f);
/*collision: lara_col_slide*/
Camera.targetElevation = -ANGLE(45.0f); // FIXED /*if (TrInput & IN_LEFT)
if ((TrInput & IN_JUMP) && !(TrInput & IN_BACK)) {
item->goalAnimState = LS_JUMP_FORWARD; 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) void lara_col_slide(ITEM_INFO* item, COLL_INFO* coll)//1C108(<), 1C23C(<) (F)
{ {
/*state 24*/ Lara.moveAngle = ANGLE(0.0f);
/*state code: lara_as_slide*/
Lara.moveAngle = 0; coll->badPos = NO_BAD_POS;
lara_slide_slope(item, coll); 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*/ Camera.targetElevation = item->pos.xRot;
/*collision: lara_col_slideback*/
if ((TrInput & IN_JUMP) && !(TrInput & IN_FORWARD)) //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; 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*/ Lara.moveAngle = ANGLE(180.0f);
/*state code: lara_as_slideback*/ PerformLaraSlide(item, coll);
Lara.moveAngle = ANGLE(180);
lara_slide_slope(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.

View file

@ -1,15 +1,25 @@
#pragma once #pragma once
#include "lara_struct.h" #include "lara_struct.h"
/*Tests and others*/ #define SLOPE_ANGLE_NORMAL ANGLE(30.0f)
int TestLaraSlide(ITEM_INFO* item, COLL_INFO* coll); #define SLOPE_ANGLE_STEEP ANGLE(60.0f)
void lara_slide_slope(ITEM_INFO* item, COLL_INFO* coll);
void LaraSlideEdgeJump(ITEM_INFO* item, COLL_INFO* coll); // Auxiliary functions.
/*end tests and others*/ bool TestLaraSlide(COLL_INFO* coll);
/*-*/ float GetLaraSlideDirection(COLL_INFO* coll);
/*Lara state code*/ 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_as_slide(ITEM_INFO* item, COLL_INFO* coll);
void lara_col_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_as_slide_back(ITEM_INFO* item, COLL_INFO* coll);
void lara_col_slideback(ITEM_INFO* item, COLL_INFO* coll); void lara_col_slide_back(ITEM_INFO* item, COLL_INFO* coll);
/*end Lara state code*/ 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);

View file

@ -35,7 +35,7 @@ enum LARA_STATE
LS_UNDERWATER_FORWARD = 17, LS_UNDERWATER_FORWARD = 17,
LS_UNDERWATER_INERTIA = 18, LS_UNDERWATER_INERTIA = 18,
LS_GRABBING = 19, LS_GRABBING = 19,
LS_TURN_FAST = 20, LS_TURN_RIGHT_FAST = 20,
LS_STEP_RIGHT = 21, LS_STEP_RIGHT = 21,
LS_STEP_LEFT = 22, LS_STEP_LEFT = 22,
LS_ROLL_BACK = 23, LS_ROLL_BACK = 23,
@ -177,6 +177,15 @@ enum LARA_STATE
LS_STEP_BACK_DOWN = 149, LS_STEP_BACK_DOWN = 149,
LS_LADDER_DISMOUNT_LEFT = 150, LS_LADDER_DISMOUNT_LEFT = 150,
LS_LADDER_DISMOUNT_RIGHT = 151, 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 NUM_LARA_STATES
}; };
@ -721,6 +730,34 @@ enum LARA_ANIM
LA_LADDER_DISMOUNT_RIGHT_END = 500, // Ladder dismount right (2/2) LA_LADDER_DISMOUNT_RIGHT_END = 500, // Ladder dismount right (2/2)
LA_ONWATER_TO_LADDER = 501, // Tread water > climb to ladder idle 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 NUM_LARA_ANIMS
}; };
#pragma endregion #pragma endregion

View file

@ -25,32 +25,34 @@ void lara_col_surftread(ITEM_INFO* item, COLL_INFO* coll)
item->fallspeed = 80; item->fallspeed = 80;
Lara.waterStatus = LW_UNDERWATER; Lara.waterStatus = LW_UNDERWATER;
} }
Lara.moveAngle = 0; Lara.moveAngle = 0;
LaraSurfaceCollision(item, coll); LaraSurfaceCollision(item, coll);
} }
void lara_col_surfright(ITEM_INFO* item, COLL_INFO* coll)//4DD90(<), 4E1F4(<) (F) 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); LaraSurfaceCollision(item, coll);
} }
void lara_col_surfleft(ITEM_INFO* item, COLL_INFO* coll)//4DD64(<), 4E1C8(<) (F) 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); LaraSurfaceCollision(item, coll);
} }
void lara_col_surfback(ITEM_INFO* item, COLL_INFO* coll)//4DD38(<), 4E19C(<) (F) 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); LaraSurfaceCollision(item, coll);
} }
void lara_col_surfswim(ITEM_INFO* item, COLL_INFO* coll)//4DCE8(<), 4E14C(<) (F) void lara_col_surfswim(ITEM_INFO* item, COLL_INFO* coll)//4DCE8(<), 4E14C(<) (F)
{ {
coll->badNeg = -384;
Lara.moveAngle = 0; Lara.moveAngle = 0;
coll->badNeg = -384;
LaraSurfaceCollision(item, coll); LaraSurfaceCollision(item, coll);
LaraTestWaterClimbOut(item, coll); LaraTestWaterClimbOut(item, coll);
LaraTestLadderClimbOut(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; item->fallspeed -= 4;
if (item->fallspeed < 0) if (item->fallspeed < 0)
{
item->fallspeed = 0; item->fallspeed = 0;
}
if (item->hitPoints <= 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) if (TrInput & IN_LEFT)
{ {
item->pos.yRot -= ANGLE(4); item->pos.yRot -= ANGLE(4.0f);
} }
else if (TrInput & IN_RIGHT) else if (TrInput & IN_RIGHT)
{ {
item->pos.yRot += ANGLE(4); item->pos.yRot += ANGLE(4.0f);
} }
if (TrInput & IN_FORWARD) if (TrInput & IN_FORWARD)
@ -105,7 +109,9 @@ void lara_as_surftread(ITEM_INFO* item, COLL_INFO* coll)//4DBA0, 4E004 (F)
{ {
Lara.diveCount++; Lara.diveCount++;
if (Lara.diveCount == 10) if (Lara.diveCount == 10)
{
item->goalAnimState = LS_UNDERWATER_FORWARD; item->goalAnimState = LS_UNDERWATER_FORWARD;
}
} }
else else
{ {
@ -125,11 +131,11 @@ void lara_as_surfright(ITEM_INFO* item, COLL_INFO* coll)//4DAF8, 4DF5C (F)
if (TrInput & IN_LEFT) if (TrInput & IN_LEFT)
{ {
item->pos.yRot -= ANGLE(2); item->pos.yRot -= ANGLE(2.0f);
} }
else if (TrInput & IN_RIGHT) else if (TrInput & IN_RIGHT)
{ {
item->pos.yRot += ANGLE(2); item->pos.yRot += ANGLE(2.0f);
} }
if (!(TrInput & IN_RSTEP)) if (!(TrInput & IN_RSTEP))
@ -139,7 +145,9 @@ void lara_as_surfright(ITEM_INFO* item, COLL_INFO* coll)//4DAF8, 4DF5C (F)
item->fallspeed += 8; item->fallspeed += 8;
if (item->fallspeed > 60) if (item->fallspeed > 60)
{
item->fallspeed = 60; item->fallspeed = 60;
}
} }
void lara_as_surfleft(ITEM_INFO* item, COLL_INFO* coll)//4DA50(<), 4DEB4(<) (F) 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) if (TrInput & IN_LEFT)
{ {
item->pos.yRot -= ANGLE(2); item->pos.yRot -= ANGLE(2.0f);
} }
else if (TrInput & IN_RIGHT) else if (TrInput & IN_RIGHT)
{ {
item->pos.yRot += ANGLE(2); item->pos.yRot += ANGLE(2.0f);
} }
if (!(TrInput & IN_LSTEP)) if (!(TrInput & IN_LSTEP))
@ -168,7 +176,9 @@ void lara_as_surfleft(ITEM_INFO* item, COLL_INFO* coll)//4DA50(<), 4DEB4(<) (F)
item->fallspeed += 8; item->fallspeed += 8;
if (item->fallspeed > 60) if (item->fallspeed > 60)
{
item->fallspeed = 60; item->fallspeed = 60;
}
} }
void lara_as_surfback(ITEM_INFO* item, COLL_INFO* coll)//4D9A8(<), 4DE0C(<) (F) 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) if (TrInput & IN_LEFT)
{ {
item->pos.yRot -= ANGLE(2); item->pos.yRot -= ANGLE(2.0f);
} }
else if (TrInput & IN_RIGHT) else if (TrInput & IN_RIGHT)
{ {
item->pos.yRot += ANGLE(2); item->pos.yRot += ANGLE(2.0f);
} }
if (!(TrInput & IN_BACK)) if (!(TrInput & IN_BACK))
@ -197,7 +207,9 @@ void lara_as_surfback(ITEM_INFO* item, COLL_INFO* coll)//4D9A8(<), 4DE0C(<) (F)
item->fallspeed += 8; item->fallspeed += 8;
if (item->fallspeed > 60) if (item->fallspeed > 60)
{
item->fallspeed = 60; item->fallspeed = 60;
}
} }
void lara_as_surfswim(ITEM_INFO* item, COLL_INFO* coll)//4D8E4(<), 4DD48(<) (F) 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)) if (!(TrInput & IN_FORWARD))
{
item->goalAnimState = LS_ONWATER_STOP; item->goalAnimState = LS_ONWATER_STOP;
}
if (TrInput & IN_JUMP) if (TrInput & IN_JUMP)
{
item->goalAnimState = LS_ONWATER_STOP; item->goalAnimState = LS_ONWATER_STOP;
}
item->fallspeed += 8; item->fallspeed += 8;
if (item->fallspeed > 60) if (item->fallspeed > 60)
{
item->fallspeed = 60; item->fallspeed = 60;
}
} }
void LaraSurfaceCollision(ITEM_INFO* item, COLL_INFO* coll)//4D4F0(<), 4D954(<) (F) 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) else if (coll->collType == CT_LEFT)
{ {
item->pos.yRot += ANGLE(5); item->pos.yRot += ANGLE(5.0f);
} }
else if (coll->collType == CT_RIGHT) 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) 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 int LaraTestWaterClimbOut(ITEM_INFO* item, COLL_INFO* coll)//4D22C, 4D690
{ {
if (coll->collType != CT_FRONT || !(TrInput & IN_ACTION)) if (coll->collType != CT_FRONT || !(TrInput & IN_ACTION))
{
return 0; return 0;
}
// FOR DEBUG PURPOSES UNTIL SCRIPTING IS READY- // FOR DEBUG PURPOSES UNTIL SCRIPTING IS READY-
EnableCrawlFlexWaterPullUp = false; 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)) if (Lara.gunStatus && (Lara.gunStatus != LG_READY || Lara.gunType != WEAPON_FLARE))
{
return 0; return 0;
}
if (coll->frontCeiling > 0) if (coll->frontCeiling > 0)
{
return 0; return 0;
}
if (coll->midCeiling > -384) if (coll->midCeiling > -384)
{
return 0; return 0;
}
int frontFloor = coll->frontFloor + 700; int frontFloor = coll->frontFloor + 700;
int frontCeiling = coll->frontCeiling + 700; int frontCeiling = coll->frontCeiling + 700;
if (frontFloor <= -512 || frontFloor > 316) if (frontFloor <= -512 || frontFloor > 316)
{
return 0; return 0;
}
short rot = item->pos.yRot; short rot = item->pos.yRot;
int slope = 0; int slope = 0;
@ -304,13 +332,17 @@ int LaraTestWaterClimbOut(ITEM_INFO* item, COLL_INFO* coll)//4D22C, 4D690
else else
{ {
if (abs(coll->rightFloor2 - coll->leftFloor2) >= 60) if (abs(coll->rightFloor2 - coll->leftFloor2) >= 60)
{
return 0; return 0;
}
result = SnapToQuadrant(rot, 35); result = SnapToQuadrant(rot, 35);
} }
if (!result) if (!result)
{
return 0; return 0;
}
item->pos.yPos += frontFloor - 5; item->pos.yPos += frontFloor - 5;
@ -353,8 +385,10 @@ int LaraTestWaterClimbOut(ITEM_INFO* item, COLL_INFO* coll)//4D22C, 4D690
item->goalAnimState = LA_CROUCH_IDLE; item->goalAnimState = LA_CROUCH_IDLE;
} }
else else
{
item->animNumber = LA_ONWATER_TO_STAND_M1CLICK; item->animNumber = LA_ONWATER_TO_STAND_M1CLICK;
item->frameNumber = g_Level.Anims[item->animNumber].frameBase; item->frameNumber = g_Level.Anims[item->animNumber].frameBase;
}
} }
else else
@ -371,19 +405,17 @@ int LaraTestWaterClimbOut(ITEM_INFO* item, COLL_INFO* coll)//4D22C, 4D690
item->frameNumber = g_Level.Anims[item->animNumber].frameBase; item->frameNumber = g_Level.Anims[item->animNumber].frameBase;
item->goalAnimState = LS_STOP; item->goalAnimState = LS_STOP;
} }
} }
Lara.gunStatus = LG_HANDS_BUSY;
Lara.waterStatus = LW_ABOVE_WATER;
item->currentAnimState = LS_ONWATER_EXIT; item->currentAnimState = LS_ONWATER_EXIT;
item->pos.yRot = rot; item->pos.yRot = rot;
Lara.gunStatus = LG_HANDS_BUSY;
item->pos.zRot = 0; item->pos.zRot = 0;
item->pos.xRot = 0; item->pos.xRot = 0;
item->gravityStatus = false; item->gravityStatus = false;
item->speed = 0; item->speed = 0;
item->fallspeed = 0; item->fallspeed = 0;
Lara.waterStatus = LW_ABOVE_WATER;
return 1; 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 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)) if (!Lara.climbStatus || coll->collType != CT_FRONT || !(TrInput & IN_ACTION))
{
return 0; return 0;
}
if (Lara.gunStatus && (Lara.gunStatus != LG_READY || Lara.gunType != WEAPON_FLARE)) if (Lara.gunStatus && (Lara.gunStatus != LG_READY || Lara.gunType != WEAPON_FLARE))
{
return 0; return 0;
}
if (!LaraTestClimbStance(item, coll)) if (!LaraTestClimbStance(item, coll))
return 0; return 0;
short rot = item->pos.yRot; 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; rot = 0;
else if (rot >= ANGLE(55.0f) && rot <= ANGLE(125.0f)) else if (rot >= ANGLE(55.0f) && rot <= ANGLE(125.0f))
rot = ANGLE(90.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); 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); rot = -ANGLE(90.0f);
if (rot & 0x3FFF) if (rot & 0x3FFF)
{
return 0; return 0;
}
switch ((unsigned short)rot / ANGLE(90.0f)) 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; item->goalAnimState = LS_LADDER_IDLE;
AnimateLara(item); AnimateLara(item);
item->pos.yRot = rot;
Lara.gunStatus = LG_HANDS_BUSY; Lara.gunStatus = LG_HANDS_BUSY;
Lara.waterStatus = LW_ABOVE_WATER;
item->pos.yRot = rot;
item->pos.zRot = 0; item->pos.zRot = 0;
item->pos.xRot = 0; item->pos.xRot = 0;
item->gravityStatus = false; item->gravityStatus = false;
item->speed = 0; item->speed = 0;
item->fallspeed = 0; item->fallspeed = 0;
Lara.waterStatus = LW_ABOVE_WATER;
return 1; return 1;
} }
void lara_as_waterout(ITEM_INFO* item, COLL_INFO* coll)//1AEE4(<), 1B018(<) (F) void lara_as_waterout(ITEM_INFO* item, COLL_INFO* coll)//1AEE4(<), 1B018(<) (F)
{ {
Camera.flags = CF_FOLLOW_CENTER;
coll->enableBaddiePush = false; coll->enableBaddiePush = false;
coll->enableSpaz = false; coll->enableSpaz = false;
Camera.flags = CF_FOLLOW_CENTER;
} }

View file

@ -1,7 +1,5 @@
#pragma once #pragma once
#include "lara.h"
#include "Lara.h"
void _cdecl lara_col_surftread(ITEM_INFO* item, COLL_INFO* coll); void _cdecl lara_col_surftread(ITEM_INFO* item, COLL_INFO* coll);
void _cdecl lara_col_surfright(ITEM_INFO* item, COLL_INFO* coll); void _cdecl lara_col_surfright(ITEM_INFO* item, COLL_INFO* coll);

View file

@ -15,17 +15,15 @@
#include "sound.h" #include "sound.h"
#include "GameFlowScript.h" #include "GameFlowScript.h"
typedef struct SUBSUIT_INFO SubsuitInfo Subsuit;
{
short XRot;
short dXRot;
short XRotVel;
short Vel[2];
short YVel;
};
SUBSUIT_INFO Subsuit;
byte SubHitCount = 0; byte SubHitCount = 0;
// SWIMMING
// ------------------------------
// Auxillary functions
// ------------------------------
void LaraWaterCurrent(COLL_INFO* coll) // (F) (D) void LaraWaterCurrent(COLL_INFO* coll) // (F) (D)
{ {
if (Lara.currentActive) if (Lara.currentActive)
@ -43,25 +41,41 @@ void LaraWaterCurrent(COLL_INFO* coll) // (F) (D)
int shift = 0; int shift = 0;
if (abs(Lara.currentXvel) <= 16) if (abs(Lara.currentXvel) <= 16)
{
shift = (abs(Lara.currentXvel) > 8) + 2; shift = (abs(Lara.currentXvel) > 8) + 2;
}
else else
{
shift = 4; shift = 4;
}
Lara.currentXvel -= Lara.currentXvel >> shift; Lara.currentXvel -= Lara.currentXvel >> shift;
if (abs(Lara.currentXvel) < 4) if (abs(Lara.currentXvel) < 4)
{
Lara.currentXvel = 0; Lara.currentXvel = 0;
}
if (abs(Lara.currentZvel) <= 16) if (abs(Lara.currentZvel) <= 16)
{
shift = (abs(Lara.currentZvel) > 8) + 2; shift = (abs(Lara.currentZvel) > 8) + 2;
}
else else
{
shift = 4; shift = 4;
}
Lara.currentZvel -= Lara.currentZvel >> shift; Lara.currentZvel -= Lara.currentZvel >> shift;
if (abs(Lara.currentZvel) < 4) if (abs(Lara.currentZvel) < 4)
{
Lara.currentZvel = 0; Lara.currentZvel = 0;
}
if (!Lara.currentXvel && !Lara.currentZvel) if (!Lara.currentXvel && !Lara.currentZvel)
{
return; return;
}
} }
LaraItem->pos.xPos += Lara.currentXvel >> 8; LaraItem->pos.xPos += Lara.currentXvel >> 8;
@ -75,11 +89,17 @@ void LaraWaterCurrent(COLL_INFO* coll) // (F) (D)
if (coll->collType == CT_FRONT) if (coll->collType == CT_FRONT)
{ {
if (LaraItem->pos.xRot > ANGLE(35)) if (LaraItem->pos.xRot > ANGLE(35))
{
LaraItem->pos.xRot += ANGLE(1); LaraItem->pos.xRot += ANGLE(1);
}
else if (LaraItem->pos.xRot < -ANGLE(35)) else if (LaraItem->pos.xRot < -ANGLE(35))
{
LaraItem->pos.xRot -= ANGLE(1); LaraItem->pos.xRot -= ANGLE(1);
}
else else
{
LaraItem->fallspeed = 0; LaraItem->fallspeed = 0;
}
} }
else if (coll->collType == CT_TOP) 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) void UpdateSubsuitAngles()//4BD20, 4C184 (F)
{ {
if (Subsuit.YVel != 0) 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) if (item->pos.yPos < 14080)
Subsuit.YVel += (14080 - item->pos.yPos) >> 4; 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) if (TrInput & IN_FORWARD)
{ {
item->pos.xRot -= ANGLE(2); item->pos.xRot -= ANGLE(3.5f);
} }
else if (TrInput & IN_BACK) else if (TrInput & IN_BACK)
{ {
item->pos.xRot += ANGLE(2); item->pos.xRot += ANGLE(3.0f);
} }
if (TrInput & IN_LEFT) if (TrInput & IN_LEFT)
{ {
Lara.turnRate -= 409; Lara.turnRate -= ANGLE(3.0f);
if (Lara.turnRate < -ANGLE(6)) if (Lara.turnRate < ANGLE(-6.0f))
Lara.turnRate = -ANGLE(6); {
item->pos.zRot -= ANGLE(3); Lara.turnRate = ANGLE(-6.0f);
}
item->pos.zRot -= ANGLE(3.0f);
} }
else if (TrInput & IN_RIGHT) else if (TrInput & IN_RIGHT)
{ {
Lara.turnRate += 409; Lara.turnRate += ANGLE(3.0f);
if (Lara.turnRate > ANGLE(6)) if (Lara.turnRate > ANGLE(6.0f))
Lara.turnRate = ANGLE(6); {
item->pos.zRot += ANGLE(3); 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 oldYrot = item->pos.yRot;
short oldZrot = item->pos.zRot; 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); Lara.moveAngle = ANGLE(180.0f);
coll->facing = item->pos.yRot - ANGLE(180); coll->facing = item->pos.yRot - ANGLE(180.0f);
} }
else else
{ {
@ -526,38 +368,40 @@ void LaraSwimCollision(ITEM_INFO* item, COLL_INFO* coll)//4B608, 4BA6C
height = abs(height); height = abs(height);
if (height < ((LaraDrawType == LARA_DIVESUIT) << 6) + 200) if (height < ((LaraDrawType == LARA_DIVESUIT) << 6) + 200)
{
height = ((LaraDrawType == LARA_DIVESUIT) << 6) + 200; height = ((LaraDrawType == LARA_DIVESUIT) << 6) + 200;
}
coll->badNeg = -64; coll->badNeg = -64;
COLL_INFO c1; COLL_INFO c1;
COLL_INFO c2; COLL_INFO c2;
memcpy(&c1, coll, sizeof(COLL_INFO)); memcpy(&c1, coll, sizeof(COLL_INFO));
memcpy(&c2, coll, sizeof(COLL_INFO) - 2); memcpy(&c2, coll, sizeof(COLL_INFO) - 2);
GetCollisionInfo(coll, item->pos.xPos, height / 2 + item->pos.yPos, item->pos.zPos, item->roomNumber, height); 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); 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); GetCollisionInfo(&c2, item->pos.xPos, height / 2 + item->pos.yPos, item->pos.zPos, item->roomNumber, height);
ShiftItem(item, coll); ShiftItem(item, coll);
int flag = 0; int flag = 0;
switch (coll->collType) switch (coll->collType)
{ {
case CT_FRONT: 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)) if (item->pos.xRot > ANGLE(5.0f))
item->pos.xRot += ANGLE(0.5); item->pos.xRot += ANGLE(0.5f);
else if (item->pos.xRot < -ANGLE(5)) else if (item->pos.xRot < ANGLE(-5.0f))
item->pos.xRot -= ANGLE(0.5); item->pos.xRot -= ANGLE(0.5f);
else if (item->pos.xRot > 0) else if (item->pos.xRot > 0)
item->pos.xRot += 45; item->pos.xRot += 45;
else if (item->pos.xRot < 0) 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) if (item->pos.xRot >= -8190)
{ {
flag = 1; flag = 1;
item->pos.xRot -= ANGLE(1); item->pos.xRot -= ANGLE(1.0f);
} }
break; break;
@ -612,12 +456,12 @@ void LaraSwimCollision(ITEM_INFO* item, COLL_INFO* coll)//4B608, 4BA6C
break; break;
case CT_LEFT: case CT_LEFT:
item->pos.yRot += ANGLE(2); item->pos.yRot += ANGLE(2.0f);
flag = 1; flag = 1;
break; break;
case CT_RIGHT: case CT_RIGHT:
item->pos.yRot -= ANGLE(2); item->pos.yRot -= ANGLE(2.0f);
flag = 1; flag = 1;
break; break;
@ -633,13 +477,13 @@ void LaraSwimCollision(ITEM_INFO* item, COLL_INFO* coll)//4B608, 4BA6C
if (coll->midFloor < 0 && coll->midFloor != NO_HEIGHT) if (coll->midFloor < 0 && coll->midFloor != NO_HEIGHT)
{ {
flag = 1; flag = 1;
item->pos.xRot += ANGLE(1); item->pos.xRot += ANGLE(1.0f);
item->pos.yPos += coll->midFloor; item->pos.yPos += coll->midFloor;
} }
if (oldX == item->pos.xPos if (oldX == item->pos.xPos
&& oldY == item->pos.yPos && oldY == item->pos.yPos
&& oldZ == item->pos.zPos && oldZ == item->pos.zPos
&& oldXrot == item->pos.xRot && oldXrot == item->pos.xRot
&& oldYrot == item->pos.yRot && oldYrot == item->pos.yRot
|| flag != 1) || 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) 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; short roomNumber = item->roomNumber;
FLOOR_INFO* floor = GetFloor(item->pos.xPos, item->pos.yPos, item->pos.zPos, &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->fallspeed = 0;
item->pos.xPos = coll->old.x; item->pos.xPos = coll->old.x;
item->pos.yPos = coll->old.y; item->pos.yPos = coll->old.y;
item->pos.zPos = coll->old.z; item->pos.zPos = coll->old.z;
} }
else if (wd <= 512) else if (depth <= 512)
{ {
item->animNumber = LA_UNDERWATER_TO_STAND; item->animNumber = LA_UNDERWATER_TO_STAND;
item->currentAnimState = LS_ONWATER_EXIT; item->currentAnimState = LS_ONWATER_EXIT;
@ -691,4 +538,187 @@ void LaraTestWaterDepth(ITEM_INFO* item, COLL_INFO* coll)//4B4F8(<), 4B95C(<) (F
Lara.waterStatus = LW_WADE; Lara.waterStatus = LW_WADE;
item->pos.yPos = GetFloorHeight(floor, item->pos.xPos, item->pos.yPos, item->pos.zPos); 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);
}

View file

@ -1,23 +1,34 @@
#pragma once #pragma once
#include "collide.h" #include "collide.h"
typedef struct SubsuitInfo
{
short XRot;
short dXRot;
short XRotVel;
short Vel[2];
short YVel;
};
// Auxillary Functions
void LaraWaterCurrent(COLL_INFO* coll); void LaraWaterCurrent(COLL_INFO* coll);
int GetWaterDepth(int x, int y, int z, short roomNumber); 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 UpdateSubsuitAngles();
void SwimTurnSubsuit(ITEM_INFO* item); void DoLaraSubsuitSwimTurn(ITEM_INFO* item);
void SwimTurn(ITEM_INFO* item); void DoLaraSwimTurn(ITEM_INFO* item);
void LaraSwimCollision(ITEM_INFO* item, COLL_INFO* coll); 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

View file

@ -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); void SetCornerAnimFeet(ITEM_INFO* item, COLL_INFO* coll, short rot, short flip);
short LaraFloorFront(ITEM_INFO* item, short ang, int dist); short LaraFloorFront(ITEM_INFO* item, short ang, int dist);
short LaraCeilingFront(ITEM_INFO* item, short ang, int dist, int h); 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); int LaraLandedBad(ITEM_INFO* l, COLL_INFO* coll);
void GetTighRopeFallOff(int Regularity); void GetTighropeFallOff(int Regularity);
bool TestLaraLean(ITEM_INFO* item, COLL_INFO* coll);
bool TestLaraFall(COLL_INFO* coll);
void SetLaraFall(ITEM_INFO* item);
bool TestLaraLean(COLL_INFO* coll);

View file

@ -11,6 +11,7 @@
#include "input.h" #include "input.h"
#include "sound.h" #include "sound.h"
#include "savegame.h" #include "savegame.h"
struct PISTOL_DEF struct PISTOL_DEF
{ {
short objectNum; short objectNum;
@ -19,6 +20,7 @@ struct PISTOL_DEF
char draw2Anim; char draw2Anim;
char recoilAnim; char recoilAnim;
}; };
PISTOL_DEF PistolsTable[4] = PISTOL_DEF PistolsTable[4] =
{ {
{ ID_LARA, 0, 0, 0, 0 }, { ID_LARA, 0, 0, 0, 0 },

View file

@ -2924,7 +2924,7 @@ void AnimateItem(ITEM_INFO *item)
if (item->gravityStatus) if (item->gravityStatus)
{ {
item->fallspeed += (item->fallspeed >= 128 ? 1 : 6); item->fallspeed += (item->fallspeed >= 128 ? 1 : 6) / 2;
item->pos.yPos += item->fallspeed; item->pos.yPos += item->fallspeed;
} }
else else

View file

@ -94,19 +94,29 @@ extern Inventory g_Inventory;
static bool SilencerIsEquiped() static bool SilencerIsEquiped()
{ {
return Lara.Weapons[WEAPON_UZI].HasSilencer if (Lara.Weapons[WEAPON_UZI].HasSilencer ||
|| Lara.Weapons[WEAPON_PISTOLS].HasSilencer Lara.Weapons[WEAPON_PISTOLS].HasSilencer ||
|| Lara.Weapons[WEAPON_SHOTGUN].HasSilencer Lara.Weapons[WEAPON_SHOTGUN].HasSilencer ||
|| Lara.Weapons[WEAPON_REVOLVER].HasSilencer Lara.Weapons[WEAPON_REVOLVER].HasSilencer ||
|| Lara.Weapons[WEAPON_CROSSBOW].HasSilencer Lara.Weapons[WEAPON_CROSSBOW].HasSilencer ||
|| Lara.Weapons[WEAPON_HK].HasSilencer; Lara.Weapons[WEAPON_HK].HasSilencer)
{
return true;
}
return false;
} }
static bool LaserSightIsEquiped() static bool LaserSightIsEquiped()
{ {
return Lara.Weapons[WEAPON_REVOLVER].HasLasersight if (Lara.Weapons[WEAPON_REVOLVER].HasLasersight ||
|| Lara.Weapons[WEAPON_CROSSBOW].HasLasersight Lara.Weapons[WEAPON_CROSSBOW].HasLasersight ||
|| Lara.Weapons[WEAPON_HK].HasLasersight; Lara.Weapons[WEAPON_HK].HasLasersight)
{
return true;
}
return false;
} }
void PickedUpObject(short objectNumber) void PickedUpObject(short objectNumber)
@ -502,7 +512,9 @@ void do_pickup()
for (int i = 0; i < g_Level.NumItems; i++) for (int i = 0; i < g_Level.NumItems; i++)
{ {
if (g_Level.Items[i].objectNumber == item->objectNumber) if (g_Level.Items[i].objectNumber == item->objectNumber)
KillItem(i); {
KillItem(i);
}
} }
} }
if (item->triggerFlags & 0xC0) if (item->triggerFlags & 0xC0)
@ -533,10 +545,14 @@ void PickupCollision(short itemNum, ITEM_INFO* l, COLL_INFO* coll)
short triggerFlags = item->triggerFlags & 0x3F; short triggerFlags = item->triggerFlags & 0x3F;
if (triggerFlags == 5 || triggerFlags == 10) if (triggerFlags == 5 || triggerFlags == 10)
{
return; return;
}
if (item->objectNumber == ID_FLARE_ITEM && Lara.gunType == WEAPON_FLARE) if (item->objectNumber == ID_FLARE_ITEM && Lara.gunType == WEAPON_FLARE)
{
return; return;
}
item->pos.yRot = l->pos.yRot; item->pos.yRot = l->pos.yRot;
item->pos.zRot = 0; 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 (l->currentAnimState == LS_CROUCH_IDLE)
{ {
if (item->objectNumber == ID_BURNING_TORCH_ITEM) if (item->objectNumber == ID_BURNING_TORCH_ITEM)
break; {
break;
}
AlignLaraPosition(&PickUpPosition, item, l); AlignLaraPosition(&PickUpPosition, item, l);
if (item->objectNumber == ID_FLARE_ITEM) 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 (l->currentAnimState == LS_CRAWL_IDLE)
{ {
if (item->objectNumber == ID_BURNING_TORCH_ITEM) if (item->objectNumber == ID_BURNING_TORCH_ITEM)
break; {
break;
}
l->goalAnimState = LS_CROUCH_IDLE; l->goalAnimState = LS_CROUCH_IDLE;
Lara.generalPtr = (void*)itemNum; Lara.generalPtr = (void*)itemNum;
break; break;
@ -955,13 +977,20 @@ void PickupControl(short itemNum)
{ {
item->pos.yPos = item->itemFlags[0]; item->pos.yPos = item->itemFlags[0];
if (item->fallspeed <= 64) if (item->fallspeed <= 64)
{
item->triggerFlags &= 0xC0; item->triggerFlags &= 0xC0;
}
else else
{
item->fallspeed = -item->fallspeed >> 2; item->fallspeed = -item->fallspeed >> 2;
}
} }
if (item->roomNumber != roomNumber) if (item->roomNumber != roomNumber)
{
ItemNewRoom(itemNum, roomNumber); ItemNewRoom(itemNum, roomNumber);
}
break; break;
case 2: case 2:
@ -1007,10 +1036,14 @@ BOUNDING_BOX* FindPlinth(ITEM_INFO* item)
} }
if (found != -1) if (found != -1)
{
return &StaticObjects[found].collisionBox; return &StaticObjects[found].collisionBox;
}
if (room->itemNumber == NO_ITEM) if (room->itemNumber == NO_ITEM)
{
return NULL; return NULL;
}
short itemNumber = room->itemNumber; short itemNumber = room->itemNumber;
for (itemNumber = room->itemNumber; itemNumber != NO_ITEM; itemNumber = g_Level.Items[itemNumber].nextItem) 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) if (itemNumber == NO_ITEM)
{
return NULL; return NULL;
}
else else
{
return (BOUNDING_BOX*)GetBestFrame(&g_Level.Items[itemNumber]); return (BOUNDING_BOX*)GetBestFrame(&g_Level.Items[itemNumber]);
}
} }
void InitialisePickup(short itemNumber) void InitialisePickup(short itemNumber)
@ -1047,7 +1084,9 @@ void InitialisePickup(short itemNumber)
else else
{ {
if (triggerFlags == 0 || triggerFlags == 3 || triggerFlags == 4 || triggerFlags == 7 || triggerFlags == 8 || triggerFlags == 11) if (triggerFlags == 0 || triggerFlags == 3 || triggerFlags == 4 || triggerFlags == 7 || triggerFlags == 8 || triggerFlags == 11)
{
item->pos.yPos -= bounds->Y2; item->pos.yPos -= bounds->Y2;
}
if ((item->triggerFlags & 0x80) != 0) if ((item->triggerFlags & 0x80) != 0)
{ {
@ -1056,10 +1095,14 @@ void InitialisePickup(short itemNumber)
} }
if (item->triggerFlags & 0x100) if (item->triggerFlags & 0x100)
{
item->meshBits = 0; item->meshBits = 0;
}
if (item->status == ITEM_INVISIBLE) if (item->status == ITEM_INVISIBLE)
{
item->flags |= 0x20; item->flags |= 0x20;
}
} }
} }
@ -1198,7 +1241,9 @@ void SearchObjectControl(short itemNumber)
objNumber = (item->objectNumber - ID_SEARCH_OBJECT1) / 2; objNumber = (item->objectNumber - ID_SEARCH_OBJECT1) / 2;
if (item->objectNumber != ID_SEARCH_OBJECT4 || item->itemFlags[0] == 1) if (item->objectNumber != ID_SEARCH_OBJECT4 || item->itemFlags[0] == 1)
{
AnimateItem(item); AnimateItem(item);
}
frameNumber = item->frameNumber - g_Level.Anims[item->animNumber].frameBase; frameNumber = item->frameNumber - g_Level.Anims[item->animNumber].frameBase;
if (item->objectNumber == ID_SEARCH_OBJECT1) if (item->objectNumber == ID_SEARCH_OBJECT1)
@ -1217,16 +1262,22 @@ void SearchObjectControl(short itemNumber)
else if (item->objectNumber == ID_SEARCH_OBJECT2) else if (item->objectNumber == ID_SEARCH_OBJECT2)
{ {
if (frameNumber == 18) if (frameNumber == 18)
{
item->meshBits = 1; item->meshBits = 1;
}
else if (frameNumber == 172) else if (frameNumber == 172)
{
item->meshBits = 2; item->meshBits = 2;
}
} }
else if (item->objectNumber == ID_SEARCH_OBJECT4) else if (item->objectNumber == ID_SEARCH_OBJECT4)
{ {
item->meshBits = FlipStats[0] != 0 ? 48 : 9; item->meshBits = FlipStats[0] != 0 ? 48 : 9;
if (frameNumber >= 45 && frameNumber <= 131) if (frameNumber >= 45 && frameNumber <= 131)
{
item->meshBits |= FlipStats[0] != 0 ? 4 : 2; item->meshBits |= FlipStats[0] != 0 ? 4 : 2;
}
if (item->itemFlags[1] != -1) if (item->itemFlags[1] != -1)
{ {
@ -1234,9 +1285,13 @@ void SearchObjectControl(short itemNumber)
if (Objects[item2->objectNumber].isPickup) if (Objects[item2->objectNumber].isPickup)
{ {
if (FlipStats[0]) if (FlipStats[0])
{
item2->status = ITEM_NOT_ACTIVE; item2->status = ITEM_NOT_ACTIVE;
}
else else
{
item2->status = ITEM_INVISIBLE; item2->status = ITEM_INVISIBLE;
}
} }
} }
} }
@ -1287,11 +1342,12 @@ void SearchObjectControl(short itemNumber)
int UseSpecialItem(ITEM_INFO* item) // to pickup.cpp? int UseSpecialItem(ITEM_INFO* item) // to pickup.cpp?
{ {
short selectedObject = g_Inventory.GetSelectedObject(); short selectedObject = g_Inventory.GetSelectedObject();
if (item->animNumber != LA_STAND_IDLE || Lara.gunStatus || selectedObject == NO_ITEM) if (item->animNumber != LA_STAND_IDLE || Lara.gunStatus || selectedObject == NO_ITEM)
return false; {
return false;
}
if (selectedObject >= ID_WATERSKIN1_EMPTY && selectedObject <= ID_WATERSKIN2_5) 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_WATERSKIN1_3 && selectedObject != ID_WATERSKIN2_5)
{ {
if (selectedObject >= ID_WATERSKIN2_EMPTY) if (selectedObject >= ID_WATERSKIN2_EMPTY)
Lara.Waterskin2.Quantity = 5; {
Lara.Waterskin2.Quantity = 5;
}
else else
Lara.Waterskin1.Quantity = 3; {
Lara.Waterskin1.Quantity = 3;
}
item->animNumber = LA_WATERSKIN_FILL; item->animNumber = LA_WATERSKIN_FILL;
} }

View file

@ -1306,6 +1306,11 @@ unsigned short atanTab[] = {
0x2000, 0x2000 0x2000, 0x2000
}; };
int GetSign(int num)
{
return (num >= 0) ? 1 : -1;
}
// fix "improperly terminated macro invocation" // fix "improperly terminated macro invocation"
// fix "expression must have integral or unscoped enum type" // fix "expression must have integral or unscoped enum type"
short ANGLE(float angle) short ANGLE(float angle)

View file

@ -45,6 +45,9 @@ template<typename T>
constexpr auto MESH_BITS(T x) { constexpr auto MESH_BITS(T x) {
return (1 << x); return (1 << x);
} }
int GetSign(int num);
short ANGLE(float angle); short ANGLE(float angle);
float TO_DEGREES(short angle); float TO_DEGREES(short angle);
float TO_RAD(short angle); float TO_RAD(short angle);

View file

@ -24,7 +24,7 @@ bool shouldAnimateUpperBody(const LARA_WEAPON_TYPE& weapon) {
case WEAPON_GRENADE_LAUNCHER: case WEAPON_GRENADE_LAUNCHER:
case WEAPON_CROSSBOW: case WEAPON_CROSSBOW:
case WEAPON_SHOTGUN: 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; break;
case WEAPON_HK: 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){ if(laraInfo.rightArm.animNumber - baseAnim == 0 || laraInfo.rightArm.animNumber - baseAnim == 2 || laraInfo.rightArm.animNumber - baseAnim == 4){
return true; return true;
} else } 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; break;
default: default: