2019-12-01 08:13:19 +01:00
|
|
|
#include "laramisc.h"
|
|
|
|
#include "..\Global\global.h"
|
|
|
|
#include "..\Scripting\GameFlowScript.h"
|
|
|
|
#include "effects.h"
|
|
|
|
#include "collide.h"
|
|
|
|
#include "Lara.h"
|
|
|
|
#include "laraswim.h"
|
|
|
|
#include "larasurf.h"
|
|
|
|
|
|
|
|
extern LaraExtraInfo g_LaraExtra;
|
|
|
|
extern GameFlow* g_GameFlow;
|
|
|
|
|
|
|
|
COLL_INFO coll;
|
|
|
|
short SubsuitAir = 0;
|
|
|
|
|
|
|
|
/*void GetLaraDeadlyBounds()//4B408(<), 4B86C (F)
|
2019-11-21 07:43:34 +01:00
|
|
|
{
|
|
|
|
#if PSX_VERSION || PSXPC_VERSION///@TODO PC subs not there yet.
|
|
|
|
short* bounds;
|
|
|
|
short tbounds[6];
|
|
|
|
|
2019-12-01 08:13:19 +01:00
|
|
|
bounds = GetBoundsAccurate(LaraItem);
|
2019-11-21 07:43:34 +01:00
|
|
|
mPushUnitMatrix();
|
2019-12-01 08:13:19 +01:00
|
|
|
mRotYXZ(LaraItem->pos.yRot, LaraItem->pos.xRot, LaraItem->pos.zRot);
|
2019-11-21 07:43:34 +01:00
|
|
|
mSetTrans(0, 0, 0);
|
|
|
|
mRotBoundingBoxNoPersp(bounds, &tbounds[0]);
|
|
|
|
mPopMatrix();
|
|
|
|
|
2019-12-01 08:13:19 +01:00
|
|
|
DeadlyBounds[0] = LaraItem->pos.xPos + tbounds[0];
|
|
|
|
DeadlyBounds[1] = LaraItem->pos.xPos + tbounds[1];
|
|
|
|
DeadlyBounds[2] = LaraItem->pos.yPos + tbounds[2];
|
|
|
|
DeadlyBounds[3] = LaraItem->pos.yPos + tbounds[3];
|
|
|
|
DeadlyBounds[4] = LaraItem->pos.zPos + tbounds[4];
|
|
|
|
DeadlyBounds[5] = LaraItem->pos.zPos + tbounds[5];
|
2019-11-21 07:43:34 +01:00
|
|
|
#else
|
|
|
|
UNIMPLEMENTED();
|
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
2019-12-01 08:13:19 +01:00
|
|
|
void DelAlignLaraToRope(ITEM_INFO* item)//4B3D8, 4B83C
|
2019-11-21 07:43:34 +01:00
|
|
|
{
|
|
|
|
UNIMPLEMENTED();
|
2019-12-01 08:13:19 +01:00
|
|
|
}*/
|
2019-11-21 07:43:34 +01:00
|
|
|
|
2019-12-02 14:49:19 +01:00
|
|
|
void InitialiseLaraAnims(ITEM_INFO* item)//4B340(<), 4B7A4 (F)
|
2019-11-21 07:43:34 +01:00
|
|
|
{
|
2019-12-01 08:13:19 +01:00
|
|
|
if (Rooms[item->roomNumber].flags & ENV_FLAG_WATER)
|
2019-11-21 07:43:34 +01:00
|
|
|
{
|
|
|
|
Lara.waterStatus = LW_UNDERWATER;
|
|
|
|
item->goalAnimState = STATE_LARA_UNDERWATER_STOP;
|
|
|
|
item->currentAnimState = STATE_LARA_UNDERWATER_STOP;
|
|
|
|
item->fallspeed = 0;
|
|
|
|
item->animNumber = ANIMATION_LARA_UNDERWATER_IDLE;
|
2019-12-01 08:13:19 +01:00
|
|
|
item->frameNumber = Anims[item->animNumber].frameBase;
|
2019-11-21 07:43:34 +01:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
Lara.waterStatus = LW_ABOVE_WATER;
|
|
|
|
item->goalAnimState = STATE_LARA_STOP;
|
|
|
|
item->currentAnimState = STATE_LARA_STOP;
|
|
|
|
item->animNumber = ANIMATION_LARA_STAY_SOLID;
|
2019-12-01 08:13:19 +01:00
|
|
|
item->frameNumber = Anims[item->animNumber].frameBase;
|
2019-11-21 07:43:34 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-12-02 14:49:19 +01:00
|
|
|
void InitialiseLaraLoad(short itemNum)//4B308, 4B76C (F)
|
2019-11-21 07:43:34 +01:00
|
|
|
{
|
2019-12-01 08:13:19 +01:00
|
|
|
Lara.itemNumber = itemNum;
|
|
|
|
LaraItem = &Items[itemNum];
|
2019-11-21 07:43:34 +01:00
|
|
|
}
|
|
|
|
|
2019-12-02 14:49:19 +01:00
|
|
|
void LaraControl(short itemNumber)//4A838, 4AC9C
|
2019-11-21 07:43:34 +01:00
|
|
|
{
|
2019-12-01 08:13:19 +01:00
|
|
|
ITEM_INFO* item = LaraItem;
|
|
|
|
|
|
|
|
if (Lara.isMoving)
|
2019-11-21 07:43:34 +01:00
|
|
|
{
|
2019-12-01 08:13:19 +01:00
|
|
|
if (++Lara.moveCount > 90)
|
2019-11-21 07:43:34 +01:00
|
|
|
{
|
2019-12-01 08:13:19 +01:00
|
|
|
Lara.isMoving = 0;
|
|
|
|
Lara.gunStatus = LG_NO_ARMS;
|
|
|
|
}
|
|
|
|
}
|
2019-11-21 07:43:34 +01:00
|
|
|
|
2019-12-01 08:13:19 +01:00
|
|
|
if (!DisableLaraControl)
|
2019-11-21 07:43:34 +01:00
|
|
|
Lara.locationPad = -128;
|
|
|
|
|
2019-12-02 09:11:21 +01:00
|
|
|
int oldX = LaraItem->pos.xPos;
|
|
|
|
int oldY = LaraItem->pos.yPos;
|
|
|
|
int oldZ = LaraItem->pos.zPos;
|
2019-11-21 07:43:34 +01:00
|
|
|
|
2019-12-01 08:13:19 +01:00
|
|
|
if (Lara.gunStatus == LG_HANDS_BUSY &&
|
|
|
|
LaraItem->currentAnimState == STATE_LARA_STOP &&
|
|
|
|
LaraItem->goalAnimState == STATE_LARA_STOP &&
|
|
|
|
LaraItem->animNumber == ANIMATION_LARA_STAY_IDLE &&
|
|
|
|
!LaraItem->gravityStatus)
|
2019-11-21 07:43:34 +01:00
|
|
|
{
|
2019-12-01 08:13:19 +01:00
|
|
|
Lara.gunStatus = LG_NO_ARMS;
|
|
|
|
}
|
2019-11-21 07:43:34 +01:00
|
|
|
|
2019-12-01 08:13:19 +01:00
|
|
|
if (item->currentAnimState != STATE_LARA_SPRINT && DashTimer < 120)
|
2019-11-21 07:43:34 +01:00
|
|
|
DashTimer++;
|
|
|
|
|
2019-12-01 08:13:19 +01:00
|
|
|
Lara.isDucked = 0;
|
2019-11-21 07:43:34 +01:00
|
|
|
|
2019-12-01 08:13:19 +01:00
|
|
|
bool isWater = Rooms[item->roomNumber].flags & ENV_FLAG_WATER;
|
2019-12-02 09:11:21 +01:00
|
|
|
int wd = GetWaterDepth(item->pos.xPos, item->pos.yPos, item->pos.zPos, item->roomNumber);
|
|
|
|
int wh = GetWaterHeight(item->pos.xPos, item->pos.yPos, item->pos.zPos, item->roomNumber);
|
2019-12-01 08:13:19 +01:00
|
|
|
|
2019-12-02 09:11:21 +01:00
|
|
|
int hfw = NO_HEIGHT;
|
2019-12-01 08:13:19 +01:00
|
|
|
if (wh != NO_HEIGHT)
|
2019-11-21 07:43:34 +01:00
|
|
|
hfw = item->pos.yPos - wh;
|
2019-12-01 08:13:19 +01:00
|
|
|
|
|
|
|
Lara.waterSurfaceDist = -hfw;
|
2019-11-21 07:43:34 +01:00
|
|
|
WadeSplash(item, wh, wd);
|
2019-12-01 08:13:19 +01:00
|
|
|
|
2019-12-02 09:11:21 +01:00
|
|
|
short roomNumber;
|
|
|
|
short height = 0;
|
2019-11-21 07:43:34 +01:00
|
|
|
|
|
|
|
switch (Lara.waterStatus)
|
|
|
|
{
|
2019-12-01 08:13:19 +01:00
|
|
|
case LW_ABOVE_WATER:
|
|
|
|
if (hfw != NO_HEIGHT && hfw >= 256)
|
2019-11-21 07:43:34 +01:00
|
|
|
{
|
2019-12-01 08:13:19 +01:00
|
|
|
if (wd <= 474)
|
|
|
|
{
|
|
|
|
if (hfw > 256)
|
|
|
|
{
|
|
|
|
Lara.waterStatus = LW_WADE;
|
|
|
|
if (!(item->gravityStatus))
|
|
|
|
item->goalAnimState = STATE_LARA_STOP;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else if (isWater)
|
2019-11-21 07:43:34 +01:00
|
|
|
{
|
|
|
|
Lara.air = 1800;
|
2019-12-01 08:13:19 +01:00
|
|
|
Lara.waterStatus = LW_UNDERWATER;
|
|
|
|
item->gravityStatus = false;
|
|
|
|
item->pos.yPos += 100;
|
2019-11-21 07:43:34 +01:00
|
|
|
|
2019-12-01 08:13:19 +01:00
|
|
|
UpdateLaraRoom(LaraItem, 0);
|
2019-11-21 07:43:34 +01:00
|
|
|
StopSoundEffect(SFX_LARA_FALL);
|
|
|
|
|
2019-12-01 08:13:19 +01:00
|
|
|
if (item->currentAnimState == STATE_LARA_SWANDIVE_BEGIN)
|
2019-11-21 07:43:34 +01:00
|
|
|
{
|
2019-12-01 08:13:19 +01:00
|
|
|
item->pos.xRot = -ANGLE(45);
|
|
|
|
item->goalAnimState = STATE_LARA_UNDERWATER_DIVING;
|
2019-11-21 07:43:34 +01:00
|
|
|
AnimateLara(item);
|
2019-12-01 08:13:19 +01:00
|
|
|
item->fallspeed *= 2;
|
|
|
|
}
|
|
|
|
else if (item->currentAnimState == STATE_LARA_SWANDIVE_END)
|
2019-11-21 07:43:34 +01:00
|
|
|
{
|
2019-12-01 08:13:19 +01:00
|
|
|
item->pos.xRot = -ANGLE(85);
|
|
|
|
item->goalAnimState = STATE_LARA_UNDERWATER_DIVING;
|
2019-11-21 07:43:34 +01:00
|
|
|
AnimateLara(item);
|
2019-12-01 08:13:19 +01:00
|
|
|
item->fallspeed *= 2;
|
2019-11-21 07:43:34 +01:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2019-12-01 08:13:19 +01:00
|
|
|
item->pos.xRot = -ANGLE(45);
|
|
|
|
item->animNumber = ANIMATION_LARA_FREE_FALL_TO_UNDERWATER;
|
|
|
|
item->frameNumber = Anims[item->animNumber].frameBase;
|
|
|
|
item->currentAnimState = STATE_LARA_UNDERWATER_DIVING;
|
|
|
|
item->goalAnimState = STATE_LARA_UNDERWATER_FORWARD;
|
|
|
|
item->fallspeed = 3 * item->fallspeed / 2;
|
2019-11-21 07:43:34 +01:00
|
|
|
}
|
|
|
|
|
2019-12-01 08:13:19 +01:00
|
|
|
Lara.torsoYrot = 0;
|
|
|
|
Lara.torsoXrot = 0;
|
|
|
|
Lara.headYrot = 0;
|
|
|
|
Lara.headXrot = 0;
|
|
|
|
|
|
|
|
Splash(LaraItem);
|
|
|
|
}
|
|
|
|
|
|
|
|
Camera.targetElevation = -ANGLE(22);
|
|
|
|
if (hfw >= 256)
|
|
|
|
{
|
|
|
|
if (hfw > 730)
|
2019-11-21 07:43:34 +01:00
|
|
|
{
|
2019-12-01 08:13:19 +01:00
|
|
|
Lara.waterStatus = LW_SURFACE;
|
|
|
|
item->pos.yPos += 1 - hfw;
|
2019-11-21 07:43:34 +01:00
|
|
|
|
2019-12-01 08:13:19 +01:00
|
|
|
switch (item->currentAnimState)
|
|
|
|
{
|
|
|
|
case STATE_LARA_WALK_BACK:
|
|
|
|
item->animNumber = ANIMATION_LARA_ONWATER_IDLE_TO_SWIM_BACK;
|
|
|
|
item->frameNumber = Anims[item->animNumber].frameBase;
|
|
|
|
item->goalAnimState = STATE_LARA_ONWATER_BACK;
|
|
|
|
item->currentAnimState = STATE_LARA_ONWATER_BACK;
|
|
|
|
break;
|
|
|
|
|
|
|
|
case STATE_LARA_WALK_RIGHT:
|
|
|
|
item->animNumber = ANIMATION_LARA_ONWATER_SWIM_RIGHT;
|
|
|
|
item->frameNumber = Anims[item->animNumber].frameBase;
|
|
|
|
item->goalAnimState = STATE_LARA_ONWATER_RIGHT;
|
|
|
|
item->currentAnimState = STATE_LARA_ONWATER_RIGHT;
|
|
|
|
break;
|
|
|
|
|
|
|
|
case STATE_LARA_WALK_LEFT:
|
|
|
|
item->animNumber = ANIMATION_LARA_ONWATER_SWIM_LEFT;
|
|
|
|
item->frameNumber = Anims[item->animNumber].frameBase;
|
|
|
|
item->goalAnimState = STATE_LARA_ONWATER_LEFT;
|
|
|
|
item->currentAnimState = STATE_LARA_ONWATER_LEFT;
|
|
|
|
break;
|
|
|
|
|
|
|
|
default:
|
|
|
|
item->animNumber = ANIMATION_LARA_ONWATER_SWIM_FORWARD;
|
|
|
|
item->frameNumber = Anims[item->animNumber].frameBase;
|
|
|
|
item->goalAnimState = STATE_LARA_ONWATER_FORWARD;
|
|
|
|
item->currentAnimState = STATE_LARA_ONWATER_FORWARD;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
item->gravityStatus = false;
|
|
|
|
item->fallspeed = 0;
|
|
|
|
Lara.diveCount = 0;
|
|
|
|
LaraItem->pos.zRot = 0;
|
|
|
|
LaraItem->pos.xRot = 0;
|
|
|
|
Lara.torsoYrot = 0;
|
|
|
|
Lara.torsoXrot = 0;
|
|
|
|
Lara.headYrot = 0;
|
|
|
|
Lara.headXrot = 0;
|
|
|
|
|
|
|
|
UpdateLaraRoom(item, 0);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
Lara.waterStatus = LW_ABOVE_WATER;
|
|
|
|
if (item->currentAnimState == STATE_LARA_WADE_FORWARD)
|
|
|
|
item->goalAnimState = STATE_LARA_RUN_FORWARD;
|
|
|
|
}
|
|
|
|
}
|
2019-11-21 07:43:34 +01:00
|
|
|
|
2019-12-01 08:13:19 +01:00
|
|
|
break;
|
|
|
|
|
|
|
|
case LW_UNDERWATER:
|
|
|
|
roomNumber = item->roomNumber;
|
|
|
|
GetFloor(item->pos.xPos, item->pos.yPos - 256, item->pos.zPos, &roomNumber);
|
|
|
|
|
|
|
|
height = 0;
|
|
|
|
if (wd != NO_HEIGHT)
|
|
|
|
{
|
|
|
|
height = Lara.waterSurfaceDist;
|
|
|
|
if (hfw >= 0)
|
|
|
|
height = hfw;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (height >= 256
|
|
|
|
|| wd == NO_HEIGHT
|
|
|
|
|| Rooms[roomNumber].flags & ENV_FLAG_WATER
|
|
|
|
|| item->animNumber == ANIMATION_LARA_UNDERWATER_TO_ONWATER
|
|
|
|
|| item->animNumber == ANIMATION_LARA_FREE_FALL_TO_UNDERWATER_ALTERNATE)
|
|
|
|
{
|
|
|
|
if (!isWater)
|
2019-11-21 07:43:34 +01:00
|
|
|
{
|
2019-12-01 08:13:19 +01:00
|
|
|
if (wd == NO_HEIGHT)
|
|
|
|
{
|
|
|
|
Lara.waterStatus = LW_ABOVE_WATER;
|
|
|
|
item->animNumber = ANIMATION_LARA_FREE_FALL_FORWARD;
|
|
|
|
item->frameNumber = Anims[item->frameNumber].frameBase;
|
|
|
|
item->goalAnimState = STATE_LARA_JUMP_FORWARD;
|
|
|
|
item->currentAnimState = STATE_LARA_JUMP_FORWARD;
|
|
|
|
item->speed = item->fallspeed / 4;
|
|
|
|
item->gravityStatus = true;
|
|
|
|
|
|
|
|
LaraItem->pos.zRot = 0;
|
|
|
|
LaraItem->pos.xRot = 0;
|
|
|
|
Lara.torsoYrot = 0;
|
|
|
|
Lara.torsoXrot = 0;
|
|
|
|
Lara.headYrot = 0;
|
|
|
|
Lara.headXrot = 0;
|
|
|
|
|
|
|
|
break;
|
|
|
|
}
|
2019-11-21 07:43:34 +01:00
|
|
|
|
2019-12-01 08:13:19 +01:00
|
|
|
if (hfw < 0)
|
|
|
|
hfw = Lara.waterSurfaceDist;
|
|
|
|
|
|
|
|
if (hfw >= 256)
|
2019-11-21 07:43:34 +01:00
|
|
|
{
|
2019-12-01 08:13:19 +01:00
|
|
|
Lara.waterStatus = LW_ABOVE_WATER;
|
|
|
|
item->animNumber = ANIMATION_LARA_FREE_FALL_FORWARD;
|
|
|
|
item->frameNumber = Anims[item->frameNumber].frameBase;
|
|
|
|
item->goalAnimState = STATE_LARA_JUMP_FORWARD;
|
|
|
|
item->currentAnimState = STATE_LARA_JUMP_FORWARD;
|
|
|
|
item->speed = item->fallspeed / 4;
|
|
|
|
item->gravityStatus = true;
|
|
|
|
|
|
|
|
LaraItem->pos.zRot = 0;
|
|
|
|
LaraItem->pos.xRot = 0;
|
|
|
|
Lara.torsoYrot = 0;
|
|
|
|
Lara.torsoXrot = 0;
|
|
|
|
Lara.headYrot = 0;
|
|
|
|
Lara.headXrot = 0;
|
|
|
|
|
|
|
|
break;
|
2019-11-21 07:43:34 +01:00
|
|
|
}
|
|
|
|
|
2019-12-01 08:13:19 +01:00
|
|
|
Lara.waterStatus = LW_SURFACE;
|
|
|
|
item->pos.yPos = wh;
|
|
|
|
item->animNumber = ANIMATION_LARA_UNDERWATER_TO_ONWATER;
|
|
|
|
item->frameNumber = Anims[item->animNumber].frameBase;
|
|
|
|
item->goalAnimState = STATE_LARA_ONWATER_STOP;
|
|
|
|
item->currentAnimState = STATE_LARA_ONWATER_STOP;
|
|
|
|
item->fallspeed = 0;
|
|
|
|
Lara.diveCount = 11;
|
|
|
|
LaraItem->pos.zRot = 0;
|
|
|
|
item->pos.xRot = 0;
|
|
|
|
Lara.torsoYrot = 0;
|
|
|
|
Lara.torsoXrot = 0;
|
|
|
|
Lara.headYrot = 0;
|
|
|
|
Lara.headXrot = 0;
|
|
|
|
|
|
|
|
UpdateLaraRoom(item, -381);
|
|
|
|
SoundEffect(SFX_LARA_BREATH, &LaraItem->pos, 2);
|
|
|
|
}
|
2019-11-21 07:43:34 +01:00
|
|
|
}
|
2019-12-01 08:13:19 +01:00
|
|
|
else
|
2019-11-21 07:43:34 +01:00
|
|
|
{
|
2019-12-01 08:13:19 +01:00
|
|
|
Lara.waterStatus = LW_SURFACE;
|
2019-11-21 07:43:34 +01:00
|
|
|
item->pos.yPos = wh + 1;
|
2019-12-01 08:13:19 +01:00
|
|
|
item->animNumber = ANIMATION_LARA_UNDERWATER_TO_ONWATER;
|
|
|
|
item->frameNumber = Anims[item->animNumber].frameBase;
|
|
|
|
item->goalAnimState = STATE_LARA_ONWATER_STOP;
|
|
|
|
item->currentAnimState = STATE_LARA_ONWATER_STOP;
|
2019-11-21 07:43:34 +01:00
|
|
|
item->fallspeed = 0;
|
2019-12-01 08:13:19 +01:00
|
|
|
Lara.diveCount = 11;
|
|
|
|
LaraItem->pos.zRot = 0;
|
|
|
|
LaraItem->pos.xRot = 0;
|
|
|
|
Lara.torsoYrot = 0;
|
|
|
|
Lara.torsoXrot = 0;
|
|
|
|
Lara.headYrot = 0;
|
|
|
|
Lara.headXrot = 0;
|
|
|
|
|
|
|
|
UpdateLaraRoom(item, 0);
|
|
|
|
SoundEffect(SFX_LARA_BREATH, &LaraItem->pos, 2);
|
2019-11-21 07:43:34 +01:00
|
|
|
}
|
2019-12-01 08:13:19 +01:00
|
|
|
break;
|
|
|
|
|
|
|
|
case LW_SURFACE:
|
|
|
|
if (!isWater)
|
2019-11-21 07:43:34 +01:00
|
|
|
{
|
2019-12-01 08:13:19 +01:00
|
|
|
if (hfw <= 256)
|
2019-11-21 07:43:34 +01:00
|
|
|
{
|
2019-12-01 08:13:19 +01:00
|
|
|
Lara.waterStatus = LW_ABOVE_WATER;
|
|
|
|
item->animNumber = ANIMATION_LARA_FREE_FALL_FORWARD;
|
|
|
|
item->frameNumber = Anims[item->frameNumber].frameBase;
|
|
|
|
item->goalAnimState = STATE_LARA_JUMP_FORWARD;
|
|
|
|
item->currentAnimState = STATE_LARA_JUMP_FORWARD;
|
|
|
|
item->speed = item->fallspeed / 4;
|
|
|
|
item->gravityStatus = true;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
Lara.waterStatus = LW_WADE;
|
|
|
|
item->animNumber = ANIMATION_LARA_STAY_IDLE;
|
|
|
|
item->frameNumber = Anims[item->frameNumber].frameBase;
|
|
|
|
item->goalAnimState = STATE_LARA_STOP;
|
|
|
|
item->currentAnimState = STATE_LARA_WADE_FORWARD;
|
|
|
|
|
|
|
|
AnimateItem(item);
|
|
|
|
}
|
|
|
|
|
|
|
|
item->fallspeed = 0;
|
|
|
|
LaraItem->pos.zRot = 0;
|
|
|
|
LaraItem->pos.xRot = 0;
|
|
|
|
Lara.torsoYrot = 0;
|
|
|
|
Lara.torsoXrot = 0;
|
|
|
|
Lara.headYrot = 0;
|
|
|
|
Lara.headXrot = 0;
|
2019-11-21 07:43:34 +01:00
|
|
|
}
|
|
|
|
break;
|
2019-12-01 08:13:19 +01:00
|
|
|
|
|
|
|
case LW_WADE:
|
|
|
|
Camera.targetElevation = -ANGLE(22);
|
|
|
|
if (hfw >= 256)
|
|
|
|
{
|
|
|
|
if (hfw > 730)
|
|
|
|
{
|
|
|
|
Lara.waterStatus = LW_SURFACE;
|
|
|
|
item->pos.yPos += 1 - hfw;
|
|
|
|
|
|
|
|
switch (item->currentAnimState)
|
|
|
|
{
|
|
|
|
case STATE_LARA_WALK_BACK:
|
|
|
|
item->animNumber = ANIMATION_LARA_ONWATER_IDLE_TO_SWIM_BACK;
|
|
|
|
item->frameNumber = Anims[item->animNumber].frameBase;
|
|
|
|
item->goalAnimState = STATE_LARA_ONWATER_BACK;
|
|
|
|
item->currentAnimState = STATE_LARA_ONWATER_BACK;
|
|
|
|
break;
|
|
|
|
|
|
|
|
case STATE_LARA_WALK_RIGHT:
|
|
|
|
item->animNumber = ANIMATION_LARA_ONWATER_SWIM_RIGHT;
|
|
|
|
item->frameNumber = Anims[item->animNumber].frameBase;
|
|
|
|
item->goalAnimState = STATE_LARA_ONWATER_RIGHT;
|
|
|
|
item->currentAnimState = STATE_LARA_ONWATER_RIGHT;
|
|
|
|
break;
|
|
|
|
|
|
|
|
case STATE_LARA_WALK_LEFT:
|
|
|
|
item->animNumber = ANIMATION_LARA_ONWATER_SWIM_LEFT;
|
|
|
|
item->frameNumber = Anims[item->animNumber].frameBase;
|
|
|
|
item->goalAnimState = STATE_LARA_ONWATER_LEFT;
|
|
|
|
item->currentAnimState = STATE_LARA_ONWATER_LEFT;
|
|
|
|
break;
|
|
|
|
|
|
|
|
default:
|
|
|
|
item->animNumber = ANIMATION_LARA_ONWATER_SWIM_FORWARD;
|
|
|
|
item->frameNumber = Anims[item->animNumber].frameBase;
|
|
|
|
item->goalAnimState = STATE_LARA_ONWATER_FORWARD;
|
|
|
|
item->currentAnimState = STATE_LARA_ONWATER_FORWARD;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
item->gravityStatus = false;
|
|
|
|
item->fallspeed = 0;
|
|
|
|
Lara.diveCount = 0;
|
|
|
|
LaraItem->pos.zRot = 0;
|
|
|
|
LaraItem->pos.xRot = 0;
|
|
|
|
Lara.torsoYrot = 0;
|
|
|
|
Lara.torsoXrot = 0;
|
|
|
|
Lara.headYrot = 0;
|
|
|
|
Lara.headXrot = 0;
|
|
|
|
|
|
|
|
UpdateLaraRoom(item, 0);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
Lara.waterStatus = LW_ABOVE_WATER;
|
|
|
|
if (item->currentAnimState == STATE_LARA_WADE_FORWARD)
|
|
|
|
item->goalAnimState = STATE_LARA_RUN_FORWARD;
|
|
|
|
}
|
2019-11-21 07:43:34 +01:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
2019-12-01 08:13:19 +01:00
|
|
|
//S_SetReverbType(room[item->roomNumber].ReverbType);
|
2019-11-21 07:43:34 +01:00
|
|
|
|
|
|
|
if (item->hitPoints <= 0)
|
|
|
|
{
|
|
|
|
item->hitPoints = -1;
|
|
|
|
|
2019-12-01 08:13:19 +01:00
|
|
|
if (Lara.deathCount == 0)
|
2019-11-21 07:43:34 +01:00
|
|
|
S_CDStop();
|
|
|
|
|
2019-12-01 08:13:19 +01:00
|
|
|
Lara.deathCount++;
|
|
|
|
if ((LaraItem->flags & 0x100))
|
2019-11-21 07:43:34 +01:00
|
|
|
{
|
2019-12-01 08:13:19 +01:00
|
|
|
Lara.deathCount++;
|
2019-11-21 07:43:34 +01:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
switch (Lara.waterStatus)
|
|
|
|
{
|
2019-12-01 08:13:19 +01:00
|
|
|
case LW_ABOVE_WATER:
|
|
|
|
case LW_WADE:
|
|
|
|
if (Lara.gassed)
|
2019-11-21 07:43:34 +01:00
|
|
|
{
|
2019-12-01 08:13:19 +01:00
|
|
|
if (item->hitPoints >= 0 && --Lara.air < 0)
|
2019-11-21 07:43:34 +01:00
|
|
|
{
|
2019-12-01 08:13:19 +01:00
|
|
|
Lara.air = -1;
|
|
|
|
item->hitPoints -= 5;
|
|
|
|
LaraAboveWater(item, &coll);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else if (Lara.air < 1800 && item->hitPoints >= 0)
|
|
|
|
{
|
|
|
|
Lara.air += 10;
|
|
|
|
if (Lara.air > 1800)
|
|
|
|
Lara.air = 1800;
|
|
|
|
}
|
|
|
|
LaraAboveWater(item, &coll);
|
|
|
|
break;
|
2019-11-21 07:43:34 +01:00
|
|
|
|
2019-12-01 08:13:19 +01:00
|
|
|
case LW_UNDERWATER:
|
|
|
|
if (item->hitPoints >= 0)
|
|
|
|
{
|
|
|
|
/*if (LaraDrawType == LARA_DIVESUIT)
|
|
|
|
{
|
|
|
|
if (CheckCutPlayed(40))
|
2019-11-21 07:43:34 +01:00
|
|
|
{
|
2019-12-01 08:13:19 +01:00
|
|
|
v32 = Lara.Anxiety + 8;
|
|
|
|
v33 = v32 + word_51CEE0;
|
|
|
|
word_51CEE0 += v32;
|
|
|
|
if (word_51CEE0 > 80)
|
|
|
|
{
|
|
|
|
v34 = (v33 - 1) / 0x50u;
|
|
|
|
word_51CEE0 = -80 * v34 + v33;
|
|
|
|
do
|
|
|
|
{
|
|
|
|
--Lara.air;
|
|
|
|
--v34;
|
|
|
|
} while (v34);
|
|
|
|
}
|
2019-11-21 07:43:34 +01:00
|
|
|
}
|
|
|
|
}
|
2019-12-01 08:13:19 +01:00
|
|
|
else
|
|
|
|
{*/
|
|
|
|
Lara.air--;
|
|
|
|
//}
|
|
|
|
if (Lara.air < 0)
|
2019-11-21 07:43:34 +01:00
|
|
|
{
|
2019-12-01 08:13:19 +01:00
|
|
|
if (LaraDrawType == LARA_DIVESUIT && Lara.anxiety < 251)
|
|
|
|
Lara.anxiety += 4;
|
|
|
|
Lara.air = -1;
|
|
|
|
item->hitPoints -= 5;
|
2019-11-21 07:43:34 +01:00
|
|
|
}
|
2019-12-01 08:13:19 +01:00
|
|
|
}
|
|
|
|
LaraUnderWater(item, &coll);
|
|
|
|
break;
|
2019-11-21 07:43:34 +01:00
|
|
|
|
2019-12-01 08:13:19 +01:00
|
|
|
case LW_SURFACE:
|
|
|
|
if (item->hitPoints >= 0)
|
|
|
|
{
|
|
|
|
Lara.air += 10;
|
|
|
|
if (Lara.air > 1790)
|
2019-11-21 07:43:34 +01:00
|
|
|
Lara.air = 1800;
|
|
|
|
}
|
2019-12-01 08:13:19 +01:00
|
|
|
LaraSurface(item, &coll);
|
2019-11-21 07:43:34 +01:00
|
|
|
break;
|
|
|
|
|
2019-12-01 08:13:19 +01:00
|
|
|
case LW_FLYCHEAT:
|
|
|
|
LaraCheat(item, &coll);
|
|
|
|
break;
|
2019-11-21 07:43:34 +01:00
|
|
|
}
|
|
|
|
|
2019-12-01 08:13:19 +01:00
|
|
|
Savegame.Game.Distance += SQRT_ASM(
|
|
|
|
SQUARE(item->pos.xPos - oldX) +
|
|
|
|
SQUARE(item->pos.yPos - oldY) +
|
|
|
|
SQUARE(item->pos.zPos - oldZ));
|
2019-11-21 07:43:34 +01:00
|
|
|
}
|
|
|
|
|
2019-12-02 14:49:19 +01:00
|
|
|
void LaraCheat(ITEM_INFO* item, COLL_INFO* coll)//4A790(<), 4ABF4(<) (F)
|
2019-11-21 07:43:34 +01:00
|
|
|
{
|
2019-12-01 08:13:19 +01:00
|
|
|
LaraItem->hitPoints = 1000;
|
2019-11-21 07:43:34 +01:00
|
|
|
LaraUnderWater(item, coll);
|
2019-12-01 08:13:19 +01:00
|
|
|
if (TrInput & IN_WALK)
|
2019-11-21 07:43:34 +01:00
|
|
|
{
|
2019-12-01 08:13:19 +01:00
|
|
|
if (!(TrInput & IN_LOOK))
|
2019-11-21 07:43:34 +01:00
|
|
|
{
|
|
|
|
Lara.waterStatus = LW_ABOVE_WATER;
|
|
|
|
item->animNumber = ANIMATION_LARA_STAY_SOLID;
|
2019-12-01 08:13:19 +01:00
|
|
|
item->frameNumber = Anims[item->animNumber].frameBase;
|
|
|
|
item->pos.zRot = 0;
|
2019-11-21 07:43:34 +01:00
|
|
|
item->pos.xRot = 0;
|
2019-12-01 08:13:19 +01:00
|
|
|
Lara.torsoYrot = 0;
|
|
|
|
Lara.torsoXrot = 0;
|
|
|
|
Lara.headYrot = 0;
|
|
|
|
Lara.headXrot = 0;
|
|
|
|
Lara.gunStatus = LG_NO_ARMS;
|
2019-11-21 07:43:34 +01:00
|
|
|
LaraInitialiseMeshes();
|
2019-12-01 08:13:19 +01:00
|
|
|
Lara.meshEffects = 0;
|
2019-11-21 07:43:34 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-12-02 14:49:19 +01:00
|
|
|
void LaraInitialiseMeshes()//4A684, 4AAE8 (F)
|
2019-11-21 07:43:34 +01:00
|
|
|
{
|
2019-12-02 09:11:21 +01:00
|
|
|
for (int i = 0; i < 15; i++)
|
2019-11-21 07:43:34 +01:00
|
|
|
{
|
2019-12-01 08:13:19 +01:00
|
|
|
Lara.meshPtrs[i] = Meshes[Objects[ID_LARA].meshIndex + 2 * i] = Meshes[Objects[ID_LARA_SKIN].meshIndex + 2 * i];
|
2019-11-21 07:43:34 +01:00
|
|
|
}
|
|
|
|
|
2019-12-01 08:13:19 +01:00
|
|
|
/*if (gfCurrentLevel >= LVL5_GALLOWS_TREE && gfCurrentLevel <= LVL5_OLD_MILL)
|
2019-11-21 07:43:34 +01:00
|
|
|
{
|
2019-12-01 08:13:19 +01:00
|
|
|
Lara.mesh_ptrs[LM_TORSO] = meshes[Objects[ANIMATING6_MIP].mesh_index + 2 * LM_TORSO];
|
|
|
|
}*/
|
2019-11-21 07:43:34 +01:00
|
|
|
|
2019-12-01 08:13:19 +01:00
|
|
|
if (Lara.gunType == WEAPON_HK)
|
2019-11-21 07:43:34 +01:00
|
|
|
{
|
2019-12-01 08:13:19 +01:00
|
|
|
Lara.backGun = WEAPON_HK;
|
2019-11-21 07:43:34 +01:00
|
|
|
}
|
2019-12-01 08:13:19 +01:00
|
|
|
else if (!g_LaraExtra.Weapons[WEAPON_SHOTGUN].Present)
|
2019-11-21 07:43:34 +01:00
|
|
|
{
|
2019-12-01 08:13:19 +01:00
|
|
|
if (g_LaraExtra.Weapons[WEAPON_HK].Present)
|
2019-11-21 07:43:34 +01:00
|
|
|
{
|
2019-12-01 08:13:19 +01:00
|
|
|
Lara.backGun = WEAPON_HK;
|
2019-11-21 07:43:34 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2019-12-01 08:13:19 +01:00
|
|
|
Lara.backGun = WEAPON_UZI;
|
2019-11-21 07:43:34 +01:00
|
|
|
}
|
|
|
|
|
2019-12-01 08:13:19 +01:00
|
|
|
Lara.gunStatus = LG_NO_ARMS;
|
|
|
|
Lara.leftArm.frameNumber = 0;
|
|
|
|
Lara.rightArm.frameNumber = 0;
|
2019-11-21 07:43:34 +01:00
|
|
|
Lara.target = 0;
|
2019-12-01 08:13:19 +01:00
|
|
|
Lara.rightArm.lock = 0;
|
|
|
|
Lara.leftArm.lock = 0;
|
2019-11-21 07:43:34 +01:00
|
|
|
}
|
|
|
|
|
2019-12-02 14:49:19 +01:00
|
|
|
void InitialiseLara(int restore)
|
2019-11-21 07:43:34 +01:00
|
|
|
{
|
2019-12-01 08:13:19 +01:00
|
|
|
if (Lara.itemNumber == NO_ITEM)
|
2019-11-21 07:43:34 +01:00
|
|
|
return;
|
|
|
|
|
2019-12-02 09:11:21 +01:00
|
|
|
short itemNumber = Lara.itemNumber;
|
2019-11-21 07:43:34 +01:00
|
|
|
|
2019-12-01 08:13:19 +01:00
|
|
|
LaraItem->data = &Lara;
|
|
|
|
LaraItem->collidable = false;
|
2019-11-21 07:43:34 +01:00
|
|
|
|
|
|
|
if (restore)
|
|
|
|
{
|
2019-12-01 08:13:19 +01:00
|
|
|
LARA_INFO backup;
|
|
|
|
memcpy(&backup, &Lara, sizeof(LARA_INFO));
|
|
|
|
memset(&Lara, 0, sizeof(LARA_INFO));
|
|
|
|
memcpy(&Lara.pistolsTypeCarried, &backup.pistolsTypeCarried, 59);
|
2019-11-21 07:43:34 +01:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2019-12-01 08:13:19 +01:00
|
|
|
memset(&Lara, 0, sizeof(LARA_INFO));
|
|
|
|
g_LaraExtra.ExtraAnim = -1;
|
|
|
|
g_LaraExtra.Vehicle = NO_ITEM;
|
|
|
|
g_LaraExtra.Weapons[WEAPON_PISTOLS].Present = true;
|
2019-11-21 07:43:34 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
Lara.look = TRUE;
|
2019-12-01 08:13:19 +01:00
|
|
|
Lara.itemNumber = itemNumber;
|
|
|
|
Lara.hitDirection = -1;
|
2019-11-21 07:43:34 +01:00
|
|
|
Lara.air = 1800;
|
2019-12-01 08:13:19 +01:00
|
|
|
Lara.weaponItem = -1;
|
2019-11-21 07:43:34 +01:00
|
|
|
PoisonFlag = 0;
|
|
|
|
Lara.dpoisoned = 0;
|
|
|
|
Lara.poisoned = 0;
|
2019-12-01 08:13:19 +01:00
|
|
|
Lara.waterSurfaceDist = 100;
|
2019-11-21 07:43:34 +01:00
|
|
|
Lara.holster = 14;
|
|
|
|
Lara.location = -1;
|
2019-12-01 08:13:19 +01:00
|
|
|
Lara.highestLocation = -1;
|
|
|
|
Lara.ropePtr = -1;
|
|
|
|
LaraItem->hitPoints = 1000;
|
2019-11-21 07:43:34 +01:00
|
|
|
|
2019-12-01 08:13:19 +01:00
|
|
|
/*
|
|
|
|
TODO: scripting
|
2019-11-21 07:43:34 +01:00
|
|
|
for (i = 0; i < gfNumPickups; i++)
|
|
|
|
{
|
2019-12-01 08:13:19 +01:00
|
|
|
DEL_picked_up_object(convert_invobto_obj(gfPickups[i]));
|
2019-11-21 07:43:34 +01:00
|
|
|
}
|
|
|
|
|
2019-12-01 08:13:19 +01:00
|
|
|
gfNumPickups = 0;*/
|
2019-11-21 07:43:34 +01:00
|
|
|
|
2019-12-01 08:13:19 +01:00
|
|
|
Lara.gunStatus = LG_NO_ARMS;
|
2019-11-21 07:43:34 +01:00
|
|
|
|
2019-12-02 09:11:21 +01:00
|
|
|
short gun = WEAPON_NONE;
|
2019-11-21 07:43:34 +01:00
|
|
|
|
2019-12-01 08:13:19 +01:00
|
|
|
if (LaraDrawType != LARA_YOUNG && Objects[ID_PISTOLS_ITEM].loaded)
|
2019-11-21 07:43:34 +01:00
|
|
|
gun = WEAPON_PISTOLS;
|
|
|
|
|
2019-12-01 08:13:19 +01:00
|
|
|
//if ((gfLevelFlags & GF_LVOP_TRAIN) && Objects[HK_ITEM].loaded && (Lara.hk_type_carried & WTYPE_PRESENT))
|
|
|
|
// gun = WEAPON_HK;
|
2019-11-21 07:43:34 +01:00
|
|
|
|
2019-12-01 08:13:19 +01:00
|
|
|
Lara.lastGunType = Lara.gunType = Lara.requestGunType = gun;
|
2019-11-21 07:43:34 +01:00
|
|
|
|
|
|
|
LaraInitialiseMeshes();
|
|
|
|
|
|
|
|
Lara.skelebob = 0;
|
|
|
|
|
2019-12-01 08:13:19 +01:00
|
|
|
if (Objects[ID_PISTOLS_ITEM].loaded)
|
|
|
|
{
|
|
|
|
g_LaraExtra.Weapons[WEAPON_PISTOLS].Present = true;
|
|
|
|
g_LaraExtra.Weapons[WEAPON_PISTOLS].Ammo[WEAPON_AMMO1] = -1;
|
|
|
|
}
|
2019-11-21 07:43:34 +01:00
|
|
|
|
|
|
|
Lara.binoculars = WTYPE_PRESENT;
|
|
|
|
|
|
|
|
if (!restore)
|
|
|
|
{
|
2019-12-01 08:13:19 +01:00
|
|
|
if (Objects[ID_FLARE_INV_ITEM].loaded)
|
|
|
|
Lara.numFlares = 3;
|
2019-11-21 07:43:34 +01:00
|
|
|
|
2019-12-01 08:13:19 +01:00
|
|
|
Lara.numSmallMedipack = 3;
|
|
|
|
Lara.numLargeMedipack = 1;
|
2019-11-21 07:43:34 +01:00
|
|
|
}
|
|
|
|
|
2019-12-01 08:13:19 +01:00
|
|
|
InitialiseLaraAnims(LaraItem);
|
2019-11-21 07:43:34 +01:00
|
|
|
|
|
|
|
DashTimer = 120;
|
|
|
|
|
2019-12-01 08:13:19 +01:00
|
|
|
/*for (i = 0; i < gfNumTakeaways; i++)
|
2019-11-21 07:43:34 +01:00
|
|
|
{
|
2019-12-01 08:13:19 +01:00
|
|
|
NailInvItem(convert_invobto_obj(gfTakeaways[i]));
|
2019-11-21 07:43:34 +01:00
|
|
|
}
|
|
|
|
|
2019-12-01 08:13:19 +01:00
|
|
|
gfNumTakeaways = 0;*/
|
2019-11-21 07:43:34 +01:00
|
|
|
|
2019-12-01 08:13:19 +01:00
|
|
|
//weapons[WEAPON_REVOLVER].damage = gfCurrentLevel >= LVL5_BASE ? 15 : 6;
|
2019-11-21 07:43:34 +01:00
|
|
|
|
2019-12-01 08:13:19 +01:00
|
|
|
/*switch (gfCurrentLevel)
|
2019-11-21 07:43:34 +01:00
|
|
|
{
|
|
|
|
case 6u:
|
|
|
|
Lara.pickupitems &= 0xFFF7u;
|
|
|
|
|
|
|
|
Lara.puzzleitems[0] = 10;
|
|
|
|
return;
|
|
|
|
case 5u:
|
|
|
|
Lara.pickupitems = 0;
|
|
|
|
Lara.pickupitemscombo = 0;
|
|
|
|
Lara.keyitems = 0;
|
|
|
|
Lara.keyitemscombo = 0;
|
|
|
|
Lara.puzzleitemscombo = 0;
|
|
|
|
|
|
|
|
memset(Lara.puzzleitems, 0, 12);
|
|
|
|
return;
|
|
|
|
case 7u:
|
|
|
|
Lara.pickupitems = 0;
|
|
|
|
|
|
|
|
Lara.puzzleitems[0] = 0;
|
|
|
|
return;
|
|
|
|
case 0xCu:
|
|
|
|
Lara.pickupitems &= 0xFFFEu;
|
|
|
|
|
|
|
|
Lara.puzzleitems[2] = 0;
|
|
|
|
Lara.puzzleitems[3] = 0;
|
|
|
|
break;
|
|
|
|
case 0xEu:
|
|
|
|
Lara.pickupitems &= 0xFFFDu;
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
if (gfCurrentLevel < LVL5_THIRTEENTH_FLOOR || gfCurrentLevel > LVL5_RED_ALERT)
|
|
|
|
Lara.pickupitems &= 0xFFF7u;
|
|
|
|
return;
|
2019-12-01 08:13:19 +01:00
|
|
|
}*/
|
2019-11-21 07:43:34 +01:00
|
|
|
|
|
|
|
Lara.bottle = 0;
|
|
|
|
Lara.wetcloth = CLOTH_MISSING;
|
2019-12-02 09:11:21 +01:00
|
|
|
}
|