2020-05-27 09:21:20 +02:00
|
|
|
#include "framework.h"
|
2020-08-09 22:09:14 -03:00
|
|
|
#include "lara_surface.h"
|
2020-08-08 15:15:15 -05:00
|
|
|
#include "lara_tests.h"
|
2019-11-21 07:43:34 +01:00
|
|
|
#include "control.h"
|
|
|
|
#include "camera.h"
|
|
|
|
#include "collide.h"
|
|
|
|
#include "items.h"
|
|
|
|
#include "box.h"
|
|
|
|
#include "Lara.h"
|
2020-08-09 22:09:14 -03:00
|
|
|
#include "lara_swim.h"
|
|
|
|
#include "lara_fire.h"
|
2020-05-27 09:21:20 +02:00
|
|
|
#include "level.h"
|
|
|
|
#include "input.h"
|
2019-11-21 07:43:34 +01:00
|
|
|
|
2020-05-26 07:36:09 -05:00
|
|
|
bool EnableCrawlFlexWaterPullUp, EnableCrawlFlexSubmerged;
|
2019-11-21 07:43:34 +01:00
|
|
|
|
2019-12-02 14:49:19 +01:00
|
|
|
void lara_col_surftread(ITEM_INFO* item, COLL_INFO* coll)
|
2019-11-21 07:43:34 +01:00
|
|
|
{
|
2020-08-04 20:32:07 +10:00
|
|
|
if (item->goalAnimState == LS_UNDERWATER_FORWARD)
|
2019-11-21 07:43:34 +01:00
|
|
|
{
|
2020-08-04 20:32:07 +10:00
|
|
|
item->currentAnimState = LS_DIVE;
|
|
|
|
item->animNumber = LA_ONWATER_DIVE;
|
2019-12-13 07:34:44 +01:00
|
|
|
item->pos.xRot = -8190;
|
2020-07-21 09:56:47 +02:00
|
|
|
item->frameNumber = g_Level.Anims[item->animNumber].frameBase;
|
2019-11-21 07:43:34 +01:00
|
|
|
item->fallspeed = 80;
|
|
|
|
Lara.waterStatus = LW_UNDERWATER;
|
|
|
|
}
|
2020-12-19 23:34:52 -03:00
|
|
|
Lara.moveAngle = item->pos.yRot;
|
2019-11-21 07:43:34 +01:00
|
|
|
LaraSurfaceCollision(item, coll);
|
|
|
|
}
|
|
|
|
|
2021-02-03 01:50:59 -03:00
|
|
|
void lara_col_surfright(ITEM_INFO* item, COLL_INFO* coll)
|
2019-11-21 07:43:34 +01:00
|
|
|
{
|
2020-12-19 23:34:52 -03:00
|
|
|
Lara.moveAngle = item->pos.yRot + ANGLE(90);
|
2019-11-21 07:43:34 +01:00
|
|
|
LaraSurfaceCollision(item, coll);
|
|
|
|
}
|
|
|
|
|
2021-02-03 01:50:59 -03:00
|
|
|
void lara_col_surfleft(ITEM_INFO* item, COLL_INFO* coll)
|
2019-11-21 07:43:34 +01:00
|
|
|
{
|
2020-12-19 23:34:52 -03:00
|
|
|
Lara.moveAngle = item->pos.yRot - ANGLE(90);
|
2019-11-21 07:43:34 +01:00
|
|
|
LaraSurfaceCollision(item, coll);
|
|
|
|
}
|
|
|
|
|
2021-02-03 01:50:59 -03:00
|
|
|
void lara_col_surfback(ITEM_INFO* item, COLL_INFO* coll)
|
2019-11-21 07:43:34 +01:00
|
|
|
{
|
2020-12-19 23:34:52 -03:00
|
|
|
Lara.moveAngle = item->pos.yRot + ANGLE(180);
|
2019-11-21 07:43:34 +01:00
|
|
|
LaraSurfaceCollision(item, coll);
|
|
|
|
}
|
|
|
|
|
2021-02-03 01:50:59 -03:00
|
|
|
void lara_col_surfswim(ITEM_INFO* item, COLL_INFO* coll)
|
2019-11-21 07:43:34 +01:00
|
|
|
{
|
2021-09-10 00:20:59 +03:00
|
|
|
coll->Setup.BadHeightDown = -STEPUP_HEIGHT;
|
2020-12-19 23:34:52 -03:00
|
|
|
Lara.moveAngle = item->pos.yRot;
|
2019-11-21 07:43:34 +01:00
|
|
|
LaraSurfaceCollision(item, coll);
|
|
|
|
LaraTestWaterClimbOut(item, coll);
|
2020-07-23 23:26:19 +02:00
|
|
|
LaraTestLadderClimbOut(item, coll);
|
2019-11-21 07:43:34 +01:00
|
|
|
}
|
|
|
|
|
2021-02-03 01:50:59 -03:00
|
|
|
void lara_as_surftread(ITEM_INFO* item, COLL_INFO* coll)
|
2019-11-21 07:43:34 +01:00
|
|
|
{
|
|
|
|
item->fallspeed -= 4;
|
|
|
|
if (item->fallspeed < 0)
|
|
|
|
item->fallspeed = 0;
|
|
|
|
|
|
|
|
if (item->hitPoints <= 0)
|
|
|
|
{
|
2020-08-04 20:32:07 +10:00
|
|
|
item->goalAnimState = LS_WATER_DEATH;
|
2019-11-21 07:43:34 +01:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (TrInput & IN_LOOK)
|
|
|
|
{
|
|
|
|
LookUpDown();
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (TrInput & IN_LEFT)
|
|
|
|
{
|
2020-09-26 05:06:08 +10:00
|
|
|
item->pos.yRot -= ANGLE(4);
|
2019-11-21 07:43:34 +01:00
|
|
|
}
|
|
|
|
else if (TrInput & IN_RIGHT)
|
|
|
|
{
|
2020-09-26 05:06:08 +10:00
|
|
|
item->pos.yRot += ANGLE(4);
|
2019-11-21 07:43:34 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
if (TrInput & IN_FORWARD)
|
|
|
|
{
|
2020-08-04 20:32:07 +10:00
|
|
|
item->goalAnimState = LS_ONWATER_FORWARD;
|
2019-11-21 07:43:34 +01:00
|
|
|
}
|
|
|
|
else if (TrInput & IN_BACK)
|
|
|
|
{
|
2020-08-04 20:32:07 +10:00
|
|
|
item->goalAnimState = LS_ONWATER_BACK;
|
2019-11-21 07:43:34 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
if (TrInput & IN_LSTEP)
|
|
|
|
{
|
2020-08-04 20:32:07 +10:00
|
|
|
item->goalAnimState = LS_ONWATER_LEFT;
|
2019-11-21 07:43:34 +01:00
|
|
|
}
|
|
|
|
else if (TrInput & IN_RSTEP)
|
|
|
|
{
|
2020-08-04 20:32:07 +10:00
|
|
|
item->goalAnimState = LS_ONWATER_RIGHT;
|
2019-11-21 07:43:34 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
if (TrInput & IN_JUMP)
|
|
|
|
{
|
2019-12-05 07:23:30 +01:00
|
|
|
Lara.diveCount++;
|
|
|
|
if (Lara.diveCount == 10)
|
2020-08-04 20:32:07 +10:00
|
|
|
item->goalAnimState = LS_UNDERWATER_FORWARD;
|
2019-11-21 07:43:34 +01:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
Lara.diveCount = 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-02-03 01:50:59 -03:00
|
|
|
void lara_as_surfright(ITEM_INFO* item, COLL_INFO* coll)
|
2019-11-21 07:43:34 +01:00
|
|
|
{
|
|
|
|
if (item->hitPoints <= 0)
|
|
|
|
{
|
2020-08-04 20:32:07 +10:00
|
|
|
item->goalAnimState = LS_WATER_DEATH;
|
2019-11-21 07:43:34 +01:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
Lara.diveCount = 0;
|
|
|
|
|
|
|
|
if (TrInput & IN_LEFT)
|
|
|
|
{
|
2020-09-26 05:06:08 +10:00
|
|
|
item->pos.yRot -= ANGLE(2);
|
2019-11-21 07:43:34 +01:00
|
|
|
}
|
|
|
|
else if (TrInput & IN_RIGHT)
|
|
|
|
{
|
2020-09-26 05:06:08 +10:00
|
|
|
item->pos.yRot += ANGLE(2);
|
2019-11-21 07:43:34 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
if (!(TrInput & IN_RSTEP))
|
|
|
|
{
|
2020-08-04 20:32:07 +10:00
|
|
|
item->goalAnimState = LS_ONWATER_STOP;
|
2019-11-21 07:43:34 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
item->fallspeed += 8;
|
|
|
|
if (item->fallspeed > 60)
|
|
|
|
item->fallspeed = 60;
|
|
|
|
}
|
|
|
|
|
2021-02-03 01:50:59 -03:00
|
|
|
void lara_as_surfleft(ITEM_INFO* item, COLL_INFO* coll)
|
2019-11-21 07:43:34 +01:00
|
|
|
{
|
|
|
|
if (item->hitPoints <= 0)
|
|
|
|
{
|
2020-08-04 20:32:07 +10:00
|
|
|
item->goalAnimState = LS_WATER_DEATH;
|
2019-11-21 07:43:34 +01:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
Lara.diveCount = 0;
|
|
|
|
|
|
|
|
if (TrInput & IN_LEFT)
|
|
|
|
{
|
2020-09-26 05:06:08 +10:00
|
|
|
item->pos.yRot -= ANGLE(2);
|
2019-11-21 07:43:34 +01:00
|
|
|
}
|
|
|
|
else if (TrInput & IN_RIGHT)
|
|
|
|
{
|
2020-09-26 05:06:08 +10:00
|
|
|
item->pos.yRot += ANGLE(2);
|
2019-11-21 07:43:34 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
if (!(TrInput & IN_LSTEP))
|
|
|
|
{
|
2020-08-04 20:32:07 +10:00
|
|
|
item->goalAnimState = LS_ONWATER_STOP;
|
2019-11-21 07:43:34 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
item->fallspeed += 8;
|
|
|
|
if (item->fallspeed > 60)
|
|
|
|
item->fallspeed = 60;
|
|
|
|
}
|
|
|
|
|
2021-02-03 01:50:59 -03:00
|
|
|
void lara_as_surfback(ITEM_INFO* item, COLL_INFO* coll)
|
2019-11-21 07:43:34 +01:00
|
|
|
{
|
|
|
|
if (item->hitPoints <= 0)
|
|
|
|
{
|
2020-08-04 20:32:07 +10:00
|
|
|
item->goalAnimState = LS_WATER_DEATH;
|
2019-11-21 07:43:34 +01:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
Lara.diveCount = 0;
|
|
|
|
|
|
|
|
if (TrInput & IN_LEFT)
|
|
|
|
{
|
2020-09-26 05:06:08 +10:00
|
|
|
item->pos.yRot -= ANGLE(2);
|
2019-11-21 07:43:34 +01:00
|
|
|
}
|
|
|
|
else if (TrInput & IN_RIGHT)
|
|
|
|
{
|
2020-09-26 05:06:08 +10:00
|
|
|
item->pos.yRot += ANGLE(2);
|
2019-11-21 07:43:34 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
if (!(TrInput & IN_BACK))
|
|
|
|
{
|
2020-08-04 20:32:07 +10:00
|
|
|
item->goalAnimState = LS_ONWATER_STOP;
|
2019-11-21 07:43:34 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
item->fallspeed += 8;
|
|
|
|
if (item->fallspeed > 60)
|
|
|
|
item->fallspeed = 60;
|
|
|
|
}
|
|
|
|
|
2021-02-03 01:50:59 -03:00
|
|
|
void lara_as_surfswim(ITEM_INFO* item, COLL_INFO* coll)
|
2019-11-21 07:43:34 +01:00
|
|
|
{
|
|
|
|
if (item->hitPoints <= 0)
|
|
|
|
{
|
2020-08-04 20:32:07 +10:00
|
|
|
item->goalAnimState = LS_WATER_DEATH;
|
2019-11-21 07:43:34 +01:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
Lara.diveCount = 0;
|
|
|
|
|
|
|
|
if (TrInput & IN_LEFT)
|
|
|
|
{
|
|
|
|
item->pos.yRot -= ANGLE(4);
|
|
|
|
}
|
|
|
|
else if (TrInput & IN_RIGHT)
|
|
|
|
{
|
|
|
|
item->pos.yRot += ANGLE(4);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!(TrInput & IN_FORWARD))
|
2020-08-04 20:32:07 +10:00
|
|
|
item->goalAnimState = LS_ONWATER_STOP;
|
2019-11-21 07:43:34 +01:00
|
|
|
if (TrInput & IN_JUMP)
|
2020-08-04 20:32:07 +10:00
|
|
|
item->goalAnimState = LS_ONWATER_STOP;
|
2019-11-21 07:43:34 +01:00
|
|
|
|
|
|
|
item->fallspeed += 8;
|
|
|
|
if (item->fallspeed > 60)
|
|
|
|
item->fallspeed = 60;
|
|
|
|
}
|
|
|
|
|
2021-02-03 01:50:59 -03:00
|
|
|
void LaraSurfaceCollision(ITEM_INFO* item, COLL_INFO* coll)
|
2019-11-21 07:43:34 +01:00
|
|
|
{
|
2021-09-10 00:20:59 +03:00
|
|
|
coll->Setup.ForwardAngle = Lara.moveAngle;
|
2019-11-21 07:43:34 +01:00
|
|
|
|
2021-09-10 12:14:28 +03:00
|
|
|
GetCollisionInfo(coll, item, PHD_VECTOR(0, 700, 0), 800);
|
2019-11-21 07:43:34 +01:00
|
|
|
ShiftItem(item, coll);
|
|
|
|
|
2021-09-10 00:18:47 +03:00
|
|
|
if (coll->CollisionType & (CT_FRONT | CT_TOP | CT_TOP_FRONT | CT_CLAMP) ||
|
|
|
|
coll->Middle.Floor < 0 && (coll->Middle.Type == BIG_SLOPE || coll->Middle.Type == DIAGONAL))
|
2019-11-21 07:43:34 +01:00
|
|
|
{
|
|
|
|
item->fallspeed = 0;
|
2021-09-10 00:20:59 +03:00
|
|
|
item->pos.xPos = coll->Setup.OldPosition.x;
|
|
|
|
item->pos.yPos = coll->Setup.OldPosition.y;
|
|
|
|
item->pos.zPos = coll->Setup.OldPosition.z;
|
2019-11-21 07:43:34 +01:00
|
|
|
}
|
2021-09-10 00:18:47 +03:00
|
|
|
else if (coll->CollisionType == CT_LEFT)
|
2019-11-21 07:43:34 +01:00
|
|
|
{
|
2020-09-26 05:06:08 +10:00
|
|
|
item->pos.yRot += ANGLE(5);
|
2019-11-21 07:43:34 +01:00
|
|
|
}
|
2021-09-10 00:18:47 +03:00
|
|
|
else if (coll->CollisionType == CT_RIGHT)
|
2019-11-21 07:43:34 +01:00
|
|
|
{
|
2020-09-26 05:06:08 +10:00
|
|
|
item->pos.yRot -= ANGLE(5);
|
2019-11-21 07:43:34 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
if (GetWaterHeight(item->pos.xPos, item->pos.yPos, item->pos.zPos, item->roomNumber) - item->pos.yPos > -100)
|
|
|
|
{
|
|
|
|
LaraTestWaterStepOut(item, coll);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2020-08-04 20:32:07 +10:00
|
|
|
item->goalAnimState = LS_UNDERWATER_FORWARD;
|
|
|
|
item->currentAnimState = LS_DIVE;
|
|
|
|
item->animNumber = LA_ONWATER_DIVE;
|
2019-12-13 07:34:44 +01:00
|
|
|
item->pos.xRot = -8190;
|
2020-07-21 09:56:47 +02:00
|
|
|
item->frameNumber = g_Level.Anims[item->animNumber].frameBase;
|
2019-11-21 07:43:34 +01:00
|
|
|
item->fallspeed = 80;
|
|
|
|
Lara.waterStatus = LW_UNDERWATER;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-02-03 01:50:59 -03:00
|
|
|
int LaraTestWaterClimbOut(ITEM_INFO* item, COLL_INFO* coll)
|
2019-11-21 07:43:34 +01:00
|
|
|
{
|
2021-09-10 00:18:47 +03:00
|
|
|
if (coll->CollisionType != CT_FRONT || !(TrInput & IN_ACTION))
|
2019-12-13 07:34:44 +01:00
|
|
|
return 0;
|
2019-11-21 07:43:34 +01:00
|
|
|
|
2020-05-26 07:36:09 -05:00
|
|
|
// FOR DEBUG PURPOSES UNTIL SCRIPTING IS READY-
|
2020-06-05 17:08:18 +02:00
|
|
|
EnableCrawlFlexWaterPullUp = false;
|
|
|
|
EnableCrawlFlexSubmerged = false;
|
2020-05-26 07:36:09 -05:00
|
|
|
|
|
|
|
|
2020-06-05 17:08:18 +02:00
|
|
|
if (Lara.gunStatus && (Lara.gunStatus != LG_READY || Lara.gunType != WEAPON_FLARE))
|
2019-12-13 07:34:44 +01:00
|
|
|
return 0;
|
2019-11-21 07:43:34 +01:00
|
|
|
|
2021-09-10 00:18:47 +03:00
|
|
|
if (coll->Front.Ceiling > 0)
|
2019-12-13 07:34:44 +01:00
|
|
|
return 0;
|
2019-11-21 07:43:34 +01:00
|
|
|
|
2021-09-10 00:18:47 +03:00
|
|
|
if (coll->Middle.Ceiling > -384)
|
2019-12-13 07:34:44 +01:00
|
|
|
return 0;
|
2019-11-21 07:43:34 +01:00
|
|
|
|
2021-09-10 00:18:47 +03:00
|
|
|
int frontFloor = coll->Front.Floor + 700;
|
|
|
|
int frontCeiling = coll->Front.Ceiling + 700;
|
2019-11-21 07:43:34 +01:00
|
|
|
if (frontFloor <= -512 || frontFloor > 316)
|
2019-12-13 07:34:44 +01:00
|
|
|
return 0;
|
2019-11-21 07:43:34 +01:00
|
|
|
|
2019-12-02 09:11:21 +01:00
|
|
|
short rot = item->pos.yRot;
|
2020-06-05 17:08:18 +02:00
|
|
|
int slope = 0;
|
|
|
|
|
2021-09-13 20:19:33 +02:00
|
|
|
if (abs(coll->FrontRight.Floor - coll->FrontLeft.Floor) >= 60)
|
|
|
|
return 0;
|
2020-06-05 17:08:18 +02:00
|
|
|
|
2021-09-13 20:19:33 +02:00
|
|
|
bool result = SnapToQuadrant(rot, 35);
|
2020-06-06 16:00:44 -03:00
|
|
|
if (!result)
|
2019-12-13 07:34:44 +01:00
|
|
|
return 0;
|
2019-11-21 07:43:34 +01:00
|
|
|
|
2020-06-05 17:08:18 +02:00
|
|
|
item->pos.yPos += frontFloor - 5;
|
2019-11-21 07:43:34 +01:00
|
|
|
|
2021-08-29 23:53:58 +03:00
|
|
|
UpdateLaraRoom(item, -LARA_HEIGHT / 2);
|
2019-11-21 07:43:34 +01:00
|
|
|
|
2021-09-13 20:19:33 +02:00
|
|
|
|
|
|
|
Vector2 v = GetOrthogonalIntersect(item->pos.xPos, item->pos.zPos, -LARA_RAD, item->pos.yRot);
|
|
|
|
item->pos.xPos = v.x;
|
|
|
|
item->pos.zPos = v.y;
|
2020-05-20 22:07:27 -05:00
|
|
|
|
|
|
|
if (frontFloor <= -256)
|
|
|
|
{
|
2020-06-05 17:08:18 +02:00
|
|
|
if ((LaraCeilingFront(item, item->pos.yRot, 384, 512) >= -512) && EnableCrawlFlexWaterPullUp == true)
|
2020-05-20 22:07:27 -05:00
|
|
|
{
|
2020-08-04 20:32:07 +10:00
|
|
|
item->animNumber = LA_ONWATER_TO_CROUCH_1CLICK;
|
2020-07-21 09:56:47 +02:00
|
|
|
item->frameNumber = g_Level.Anims[item->animNumber].frameBase;
|
2020-08-04 20:32:07 +10:00
|
|
|
item->goalAnimState = LA_CROUCH_IDLE;
|
2020-05-20 22:07:27 -05:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2020-08-04 20:32:07 +10:00
|
|
|
item->animNumber = LA_ONWATER_TO_STAND_1CLICK;
|
2020-07-21 09:56:47 +02:00
|
|
|
item->frameNumber = g_Level.Anims[item->animNumber].frameBase;
|
2020-08-04 20:32:07 +10:00
|
|
|
item->goalAnimState = LS_STOP;
|
2020-05-20 22:07:27 -05:00
|
|
|
}
|
|
|
|
}
|
2020-05-21 02:42:10 -05:00
|
|
|
else if (frontFloor > 128)
|
2020-05-20 22:07:27 -05:00
|
|
|
{
|
2020-06-05 17:08:18 +02:00
|
|
|
if ((LaraCeilingFront(item, item->pos.yRot, 384, 512) >= -512) && EnableCrawlFlexSubmerged == true)
|
2020-05-20 22:07:27 -05:00
|
|
|
{
|
2020-08-04 20:32:07 +10:00
|
|
|
item->animNumber = LA_ONWATER_TO_CROUCH_M1CLICK;
|
2020-07-21 09:56:47 +02:00
|
|
|
item->frameNumber = g_Level.Anims[item->animNumber].frameBase;
|
2020-08-04 20:32:07 +10:00
|
|
|
item->goalAnimState = LA_CROUCH_IDLE;
|
2020-05-20 22:07:27 -05:00
|
|
|
}
|
|
|
|
else
|
2020-08-04 20:32:07 +10:00
|
|
|
item->animNumber = LA_ONWATER_TO_STAND_M1CLICK;
|
2020-09-26 05:06:08 +10:00
|
|
|
item->frameNumber = g_Level.Anims[item->animNumber].frameBase;
|
2020-05-20 22:07:27 -05:00
|
|
|
}
|
|
|
|
|
2020-05-21 02:42:10 -05:00
|
|
|
else
|
2019-11-21 07:43:34 +01:00
|
|
|
{
|
2020-06-05 17:08:18 +02:00
|
|
|
if ((LaraCeilingFront(item, item->pos.yRot, 384, 512) >= -512) && EnableCrawlFlexWaterPullUp == true)
|
2019-11-21 07:43:34 +01:00
|
|
|
{
|
2020-08-04 20:32:07 +10:00
|
|
|
item->animNumber = LA_ONWATER_TO_CROUCH_0CLICK;
|
2020-07-21 09:56:47 +02:00
|
|
|
item->frameNumber = g_Level.Anims[item->animNumber].frameBase;
|
2020-08-04 20:32:07 +10:00
|
|
|
item->goalAnimState = LA_CROUCH_IDLE;
|
2019-11-21 07:43:34 +01:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2020-08-04 20:32:07 +10:00
|
|
|
item->animNumber = LA_ONWATER_TO_STAND_0CLICK;
|
2020-07-21 09:56:47 +02:00
|
|
|
item->frameNumber = g_Level.Anims[item->animNumber].frameBase;
|
2020-08-04 20:32:07 +10:00
|
|
|
item->goalAnimState = LS_STOP;
|
2019-11-21 07:43:34 +01:00
|
|
|
}
|
2020-09-26 05:06:08 +10:00
|
|
|
|
|
|
|
|
2019-11-21 07:43:34 +01:00
|
|
|
}
|
|
|
|
|
2020-08-04 20:32:07 +10:00
|
|
|
item->currentAnimState = LS_ONWATER_EXIT;
|
2019-11-21 07:43:34 +01:00
|
|
|
item->pos.yRot = rot;
|
2020-09-26 05:06:08 +10:00
|
|
|
Lara.gunStatus = LG_HANDS_BUSY;
|
2019-11-21 07:43:34 +01:00
|
|
|
item->pos.zRot = 0;
|
|
|
|
item->pos.xRot = 0;
|
|
|
|
item->gravityStatus = false;
|
|
|
|
item->speed = 0;
|
|
|
|
item->fallspeed = 0;
|
2020-09-26 05:06:08 +10:00
|
|
|
Lara.waterStatus = LW_ABOVE_WATER;
|
2019-11-21 07:43:34 +01:00
|
|
|
|
2019-12-13 07:34:44 +01:00
|
|
|
return 1;
|
2019-11-21 07:43:34 +01:00
|
|
|
}
|
|
|
|
|
2021-02-03 01:50:59 -03:00
|
|
|
int LaraTestWaterStepOut(ITEM_INFO* item, COLL_INFO* coll)
|
2019-11-21 07:43:34 +01:00
|
|
|
{
|
2021-09-10 00:18:47 +03:00
|
|
|
if (coll->CollisionType == CT_FRONT
|
|
|
|
|| coll->Middle.Type == BIG_SLOPE
|
|
|
|
|| coll->Middle.Type == DIAGONAL
|
|
|
|
|| coll->Middle.Floor >= 0)
|
2019-11-21 07:43:34 +01:00
|
|
|
{
|
2019-12-13 07:34:44 +01:00
|
|
|
return 0;
|
2019-11-21 07:43:34 +01:00
|
|
|
}
|
|
|
|
|
2021-09-10 00:18:47 +03:00
|
|
|
if (coll->Middle.Floor >= -128)
|
2019-11-21 07:43:34 +01:00
|
|
|
{
|
2020-08-04 20:32:07 +10:00
|
|
|
if (item->goalAnimState == LS_ONWATER_LEFT)
|
2019-11-21 07:43:34 +01:00
|
|
|
{
|
2020-08-04 20:32:07 +10:00
|
|
|
item->goalAnimState = LS_STEP_LEFT;
|
2019-11-21 07:43:34 +01:00
|
|
|
}
|
2020-08-04 20:32:07 +10:00
|
|
|
else if (item->goalAnimState == LS_ONWATER_RIGHT)
|
2019-11-21 07:43:34 +01:00
|
|
|
{
|
2020-08-04 20:32:07 +10:00
|
|
|
item->goalAnimState = LS_STEP_RIGHT;
|
2019-11-21 07:43:34 +01:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2020-08-04 20:32:07 +10:00
|
|
|
item->animNumber = LA_WADE;
|
2020-07-21 09:56:47 +02:00
|
|
|
item->frameNumber = g_Level.Anims[item->animNumber].frameBase;
|
2020-08-04 20:32:07 +10:00
|
|
|
item->goalAnimState = LS_WADE_FORWARD;
|
|
|
|
item->currentAnimState = LS_WADE_FORWARD;
|
2019-11-21 07:43:34 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2020-08-04 20:32:07 +10:00
|
|
|
item->animNumber = LA_ONWATER_TO_WADE_1CLICK;
|
2020-07-21 09:56:47 +02:00
|
|
|
item->frameNumber = g_Level.Anims[item->animNumber].frameBase;
|
2020-08-04 20:32:07 +10:00
|
|
|
item->currentAnimState = LS_ONWATER_EXIT;
|
|
|
|
item->goalAnimState = LS_STOP;
|
2019-11-21 07:43:34 +01:00
|
|
|
}
|
|
|
|
|
2021-09-10 00:18:47 +03:00
|
|
|
item->pos.yPos += coll->Front.Floor + 695;
|
2019-11-21 07:43:34 +01:00
|
|
|
|
|
|
|
UpdateLaraRoom(item, -381);
|
|
|
|
|
|
|
|
item->pos.zRot = 0;
|
|
|
|
item->pos.xRot = 0;
|
2019-12-13 07:34:44 +01:00
|
|
|
item->gravityStatus = false;
|
2019-11-21 07:43:34 +01:00
|
|
|
item->speed = 0;
|
|
|
|
item->fallspeed = 0;
|
|
|
|
|
|
|
|
Lara.waterStatus = LW_WADE;
|
|
|
|
|
2020-05-28 15:17:34 +02:00
|
|
|
return 1;
|
2019-12-02 09:11:21 +01:00
|
|
|
}
|
2020-07-23 23:26:19 +02:00
|
|
|
|
|
|
|
int LaraTestLadderClimbOut(ITEM_INFO* item, COLL_INFO* coll) // NEW function for water to ladder move
|
|
|
|
{
|
2021-09-10 00:18:47 +03:00
|
|
|
if (!Lara.climbStatus || coll->CollisionType != CT_FRONT || !(TrInput & IN_ACTION))
|
2020-07-23 23:26:19 +02:00
|
|
|
return 0;
|
|
|
|
|
|
|
|
if (Lara.gunStatus && (Lara.gunStatus != LG_READY || Lara.gunType != WEAPON_FLARE))
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
if (!LaraTestClimbStance(item, coll))
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
short rot = item->pos.yRot;
|
|
|
|
|
2020-09-26 05:06:08 +10:00
|
|
|
if (rot >= -ANGLE(35.0f) && rot <= ANGLE(35.0f))
|
2020-07-23 23:26:19 +02:00
|
|
|
rot = 0;
|
|
|
|
else if (rot >= ANGLE(55.0f) && rot <= ANGLE(125.0f))
|
|
|
|
rot = ANGLE(90.0f);
|
2020-09-26 05:06:08 +10:00
|
|
|
else if (rot >= ANGLE(145.0f) || rot <= -ANGLE(145.0f))
|
2020-07-23 23:26:19 +02:00
|
|
|
rot = ANGLE(180.0f);
|
2020-09-26 05:06:08 +10:00
|
|
|
else if (rot >= -ANGLE(125.0f) && rot <= -ANGLE(55.0f))
|
2020-07-23 23:26:19 +02:00
|
|
|
rot = -ANGLE(90.0f);
|
|
|
|
|
|
|
|
if (rot & 0x3FFF)
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
switch ((unsigned short)rot / ANGLE(90.0f))
|
|
|
|
{
|
|
|
|
case NORTH:
|
|
|
|
item->pos.zPos = (item->pos.zPos | (WALL_SIZE - 1)) - LARA_RAD - 1;
|
|
|
|
break;
|
|
|
|
|
|
|
|
case EAST:
|
|
|
|
item->pos.xPos = (item->pos.xPos | (WALL_SIZE - 1)) - LARA_RAD - 1;
|
|
|
|
break;
|
|
|
|
|
|
|
|
case SOUTH:
|
|
|
|
item->pos.zPos = (item->pos.zPos & -WALL_SIZE) + LARA_RAD + 1;
|
|
|
|
break;
|
|
|
|
|
|
|
|
case WEST:
|
|
|
|
item->pos.xPos = (item->pos.xPos & -WALL_SIZE) + LARA_RAD + 1;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
2020-08-04 20:32:07 +10:00
|
|
|
item->animNumber = LA_ONWATER_IDLE;
|
2020-07-23 23:26:19 +02:00
|
|
|
item->frameNumber = g_Level.Anims[item->animNumber].frameBase;
|
2020-08-04 20:32:07 +10:00
|
|
|
item->currentAnimState = LS_ONWATER_STOP;
|
|
|
|
item->goalAnimState = LS_LADDER_IDLE;
|
2020-07-23 23:26:19 +02:00
|
|
|
AnimateLara(item);
|
|
|
|
|
2020-09-26 03:28:30 +10:00
|
|
|
item->pos.yRot = rot;
|
2021-02-05 16:38:00 -06:00
|
|
|
item->pos.yPos -= 10;//otherwise she falls back into the water
|
2020-09-26 05:06:08 +10:00
|
|
|
Lara.gunStatus = LG_HANDS_BUSY;
|
2020-07-23 23:26:19 +02:00
|
|
|
item->pos.zRot = 0;
|
|
|
|
item->pos.xRot = 0;
|
|
|
|
item->gravityStatus = false;
|
|
|
|
item->speed = 0;
|
|
|
|
item->fallspeed = 0;
|
2020-09-26 05:06:08 +10:00
|
|
|
Lara.waterStatus = LW_ABOVE_WATER;
|
2020-07-23 23:26:19 +02:00
|
|
|
|
|
|
|
return 1;
|
|
|
|
}
|
2020-08-14 17:54:25 -05:00
|
|
|
|
2021-02-03 01:50:59 -03:00
|
|
|
void lara_as_waterout(ITEM_INFO* item, COLL_INFO* coll)
|
2020-08-14 17:54:25 -05:00
|
|
|
{
|
2021-09-10 00:20:59 +03:00
|
|
|
coll->Setup.EnableObjectPush = false;
|
|
|
|
coll->Setup.EnableSpaz = false;
|
2020-09-26 05:06:08 +10:00
|
|
|
Camera.flags = CF_FOLLOW_CENTER;
|
2021-08-16 18:05:38 -05:00
|
|
|
Camera.laraNode = LM_HIPS; //forces the camera to follow Lara instead of snapping
|
2020-08-14 17:54:25 -05:00
|
|
|
}
|
|
|
|
|