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"
|
2021-09-19 23:41:26 +03:00
|
|
|
#include "control/control.h"
|
2019-11-21 07:43:34 +01:00
|
|
|
#include "camera.h"
|
|
|
|
#include "collide.h"
|
|
|
|
#include "items.h"
|
|
|
|
#include "Lara.h"
|
2020-05-27 09:21:20 +02:00
|
|
|
#include "level.h"
|
|
|
|
#include "input.h"
|
2021-11-10 01:32:54 +11:00
|
|
|
#include "lara_collide.h"
|
2021-11-10 11:59:54 +03:00
|
|
|
#include "lara_swim.h"
|
2021-09-25 11:27:47 +02: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-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-19 17:48:32 +03:00
|
|
|
coll->Setup.BadHeightUp = -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);
|
2021-11-09 20:34:39 +11:00
|
|
|
TestLaraWaterClimbOut(item, coll);
|
|
|
|
TestLaraLadderClimbOut(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)
|
2021-11-10 11:59:54 +03:00
|
|
|
SwimDive(item);
|
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 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
|
|
|
}
|
|
|
|
|