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"
|
2019-12-22 00:20:10 +01:00
|
|
|
#include "effect2.h"
|
2020-01-04 13:26:22 +01:00
|
|
|
#include "healt.h"
|
2019-12-29 19:10:53 +01:00
|
|
|
#include "misc.h"
|
2019-12-01 08:13:19 +01:00
|
|
|
|
|
|
|
extern LaraExtraInfo g_LaraExtra;
|
|
|
|
extern GameFlow* g_GameFlow;
|
2020-01-05 18:48:16 +01:00
|
|
|
extern void(*effect_routines[59])(ITEM_INFO* item);
|
2020-01-08 13:25:42 +01:00
|
|
|
extern short FXType;
|
|
|
|
|
|
|
|
COLL_INFO coll;
|
2019-12-01 08:13:19 +01:00
|
|
|
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-26 07:44:01 +01:00
|
|
|
void LaraCheatyBits()
|
|
|
|
{
|
|
|
|
if (TrInput & IN_D)
|
|
|
|
{
|
|
|
|
//LaraCheatGetStuff();
|
|
|
|
//LaraItem->hitPoints = 1000;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (TrInput & IN_PAUSE)
|
|
|
|
{
|
|
|
|
LaraItem->pos.yPos -= 128;
|
|
|
|
if (Lara.waterStatus != LW_FLYCHEAT)
|
|
|
|
{
|
|
|
|
LaraItem->hitPoints = 1000;
|
|
|
|
Lara.waterStatus = LW_FLYCHEAT;
|
|
|
|
LaraItem->animNumber = ANIMATION_LARA_UNDERWATER_SWIM_SOLID;
|
|
|
|
LaraItem->frameNumber = Anims[LaraItem->animNumber].frameBase;
|
|
|
|
LaraItem->currentAnimState = STATE_LARA_UNDERWATER_FORWARD;
|
|
|
|
LaraItem->goalAnimState = STATE_LARA_UNDERWATER_FORWARD;
|
|
|
|
LaraItem->gravityStatus = 0;
|
|
|
|
LaraItem->pos.xRot = ANGLE(30);
|
|
|
|
LaraItem->fallspeed = 30;
|
|
|
|
Lara.air = 1800;
|
|
|
|
Lara.deathCount = 0;
|
|
|
|
Lara.torsoXrot = Lara.torsoYrot = 0;
|
|
|
|
Lara.headXrot = Lara.headYrot = 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
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;
|
|
|
|
|
2019-12-26 07:44:01 +01:00
|
|
|
LaraCheatyBits();
|
|
|
|
|
2019-12-01 08:13:19 +01:00
|
|
|
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-29 19:10:53 +01:00
|
|
|
bool isWater = Rooms[item->roomNumber].flags & (ENV_FLAG_WATER|ENV_FLAG_SWAMP);
|
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))
|
2019-12-29 19:10:53 +01:00
|
|
|
{
|
2019-12-01 08:13:19 +01:00
|
|
|
item->goalAnimState = STATE_LARA_STOP;
|
2019-12-29 19:10:53 +01:00
|
|
|
}
|
|
|
|
else if (isWater & ENV_FLAG_SWAMP)
|
|
|
|
{
|
|
|
|
if (item->currentAnimState == STATE_LARA_SWANDIVE_BEGIN || item->currentAnimState == STATE_LARA_SWANDIVE_END) // Is Lara swan-diving?
|
|
|
|
item->pos.yPos = wh + 1000;
|
|
|
|
|
|
|
|
item->goalAnimState = STATE_LARA_WADE_FORWARD;
|
|
|
|
item->currentAnimState = STATE_LARA_WADE_FORWARD;
|
|
|
|
item->animNumber = ANIMATION_LARA_WADE;
|
|
|
|
item->frameNumber = GF(ANIMATION_LARA_WADE, 0);
|
|
|
|
}
|
2019-12-01 08:13:19 +01:00
|
|
|
}
|
|
|
|
}
|
2019-12-29 19:10:53 +01:00
|
|
|
else if (!(isWater & ENV_FLAG_SWAMP))
|
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)
|
|
|
|
{
|
2019-12-12 22:06:57 +01:00
|
|
|
height = -hfw;
|
2019-12-01 08:13:19 +01:00
|
|
|
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-12 22:06:57 +01:00
|
|
|
if (wd == NO_HEIGHT || abs(hfw) >= 256)
|
2019-12-01 08:13:19 +01:00
|
|
|
{
|
|
|
|
Lara.waterStatus = LW_ABOVE_WATER;
|
|
|
|
item->animNumber = ANIMATION_LARA_FREE_FALL_FORWARD;
|
2019-12-12 22:06:57 +01:00
|
|
|
item->frameNumber = Anims[item->animNumber].frameBase;
|
2019-12-01 08:13:19 +01:00
|
|
|
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;
|
|
|
|
}
|
2019-12-12 22:06:57 +01:00
|
|
|
else
|
2019-11-21 07:43:34 +01:00
|
|
|
{
|
2019-12-12 22:06:57 +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;
|
2019-12-01 08:13:19 +01:00
|
|
|
LaraItem->pos.zRot = 0;
|
2019-12-12 22:06:57 +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;
|
|
|
|
|
2019-12-12 22:06:57 +01:00
|
|
|
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
|
|
|
}
|
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;
|
2019-12-12 22:06:57 +01:00
|
|
|
item->frameNumber = Anims[item->animNumber].frameBase;
|
2019-12-01 08:13:19 +01:00
|
|
|
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;
|
2019-12-12 22:06:57 +01:00
|
|
|
item->frameNumber = Anims[item->animNumber].frameBase;
|
2019-12-01 08:13:19 +01:00
|
|
|
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)
|
|
|
|
{
|
2019-12-29 19:10:53 +01:00
|
|
|
if (hfw > 730 && !(isWater & ENV_FLAG_SWAMP))
|
2019-12-01 08:13:19 +01:00
|
|
|
{
|
|
|
|
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-26 07:44:01 +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
|
|
|
//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:
|
2019-12-29 19:10:53 +01:00
|
|
|
if (Rooms[item->roomNumber].flags & ENV_FLAG_SWAMP && Lara.waterSurfaceDist < -775)
|
|
|
|
{
|
|
|
|
if (item->hitPoints >= 0)
|
|
|
|
{
|
|
|
|
Lara.air -= 6;
|
|
|
|
|
|
|
|
if (Lara.air < 0)
|
|
|
|
{
|
|
|
|
Lara.air = -1;
|
|
|
|
item->hitPoints -= 10;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else 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)
|
|
|
|
{
|
2019-12-29 19:10:53 +01:00
|
|
|
/* lara is not equipped with any vehicle */
|
|
|
|
if (g_LaraExtra.Vehicle == NO_ITEM) // only for the upv !!
|
|
|
|
{
|
|
|
|
Lara.air += 10;
|
|
|
|
if (Lara.air > 1800)
|
|
|
|
Lara.air = 1800;
|
|
|
|
}
|
|
|
|
}
|
2019-12-01 08:13:19 +01:00
|
|
|
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-26 07:44:01 +01:00
|
|
|
if (TrInput & IN_WALK && !(TrInput & IN_LOOK))
|
2019-11-21 07:43:34 +01:00
|
|
|
{
|
2019-12-26 07:44:01 +01:00
|
|
|
Lara.waterStatus = LW_ABOVE_WATER;
|
|
|
|
item->animNumber = ANIMATION_LARA_STAY_SOLID;
|
|
|
|
item->frameNumber = Anims[item->animNumber].frameBase;
|
|
|
|
item->pos.zRot = 0;
|
|
|
|
item->pos.xRot = 0;
|
|
|
|
Lara.torsoYrot = 0;
|
|
|
|
Lara.torsoXrot = 0;
|
|
|
|
Lara.headYrot = 0;
|
|
|
|
Lara.headXrot = 0;
|
|
|
|
Lara.gunStatus = LG_NO_ARMS;
|
|
|
|
LaraInitialiseMeshes();
|
|
|
|
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-04 13:20:21 +01:00
|
|
|
INIT_LARA_MESHES(i, ID_LARA, ID_LARA_SKIN);
|
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));
|
2020-01-10 08:02:16 +01:00
|
|
|
memcpy(&Lara.Legacy_pistolsTypeCarried, &backup.Legacy_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));
|
2020-01-12 08:02:48 +01:00
|
|
|
ZeroMemory(&g_LaraExtra, sizeof(LaraExtraInfo));
|
|
|
|
|
2019-12-01 08:13:19 +01:00
|
|
|
g_LaraExtra.ExtraAnim = -1;
|
|
|
|
g_LaraExtra.Vehicle = NO_ITEM;
|
2019-11-21 07:43:34 +01:00
|
|
|
}
|
|
|
|
|
2020-01-12 08:02:48 +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;
|
|
|
|
Lara.gunStatus = LG_NO_ARMS;
|
2020-01-12 08:02:48 +01:00
|
|
|
Lara.skelebob = 0;
|
2019-11-21 07:43:34 +01:00
|
|
|
|
2019-12-02 09:11:21 +01:00
|
|
|
short gun = WEAPON_NONE;
|
2020-01-12 10:59:23 +01:00
|
|
|
|
|
|
|
if (Objects[ID_PISTOLS_ITEM].loaded)
|
|
|
|
gun = WEAPON_PISTOLS;
|
|
|
|
else if (Objects[ID_HK_ITEM].loaded)
|
|
|
|
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();
|
|
|
|
|
2020-01-12 08:02:48 +01:00
|
|
|
if (gun == WEAPON_PISTOLS)
|
2019-12-01 08:13:19 +01:00
|
|
|
{
|
|
|
|
g_LaraExtra.Weapons[WEAPON_PISTOLS].Present = true;
|
|
|
|
g_LaraExtra.Weapons[WEAPON_PISTOLS].Ammo[WEAPON_AMMO1] = -1;
|
|
|
|
}
|
2020-01-12 08:02:48 +01:00
|
|
|
else if (gun == WEAPON_HK)
|
|
|
|
{
|
|
|
|
g_LaraExtra.Weapons[WEAPON_HK].Present = true;
|
|
|
|
g_LaraExtra.Weapons[WEAPON_HK].Ammo[WEAPON_AMMO1] = 100;
|
|
|
|
}
|
2019-12-04 18:51:23 +01:00
|
|
|
|
2020-01-10 08:02:16 +01:00
|
|
|
g_LaraExtra.Binoculars = true;
|
2019-11-21 07:43:34 +01:00
|
|
|
|
|
|
|
if (!restore)
|
|
|
|
{
|
2019-12-01 08:13:19 +01:00
|
|
|
if (Objects[ID_FLARE_INV_ITEM].loaded)
|
2020-01-10 08:02:16 +01:00
|
|
|
g_LaraExtra.NumFlares = 3;
|
2019-11-21 07:43:34 +01:00
|
|
|
|
2020-01-10 08:02:16 +01:00
|
|
|
g_LaraExtra.NumSmallMedipacks = 3;
|
|
|
|
g_LaraExtra.NumLargeMedipacks = 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;
|
|
|
|
|
|
|
|
Lara.bottle = 0;
|
|
|
|
Lara.wetcloth = CLOTH_MISSING;
|
2019-12-02 09:11:21 +01:00
|
|
|
}
|
2019-12-04 18:51:23 +01:00
|
|
|
|
|
|
|
void AnimateLara(ITEM_INFO* item)
|
|
|
|
{
|
|
|
|
item->frameNumber++;
|
|
|
|
|
|
|
|
ANIM_STRUCT* anim = &Anims[item->animNumber];
|
|
|
|
if (anim->numberChanges > 0 && GetChange(item, anim))
|
|
|
|
{
|
|
|
|
anim = &Anims[item->animNumber];
|
|
|
|
item->currentAnimState = anim->currentAnimState;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (item->frameNumber > anim->frameEnd)
|
|
|
|
{
|
|
|
|
if (anim->numberCommands > 0)
|
|
|
|
{
|
|
|
|
short* cmd = &Commands[anim->commandIndex];
|
|
|
|
for (int i = anim->numberCommands; i > 0; i--)
|
|
|
|
{
|
|
|
|
switch (*(cmd++))
|
|
|
|
{
|
|
|
|
case COMMAND_MOVE_ORIGIN:
|
|
|
|
TranslateItem(item, cmd[0], cmd[1], cmd[2]);
|
|
|
|
UpdateLaraRoom(item, -381);
|
|
|
|
cmd += 3;
|
|
|
|
break;
|
|
|
|
|
|
|
|
case COMMAND_JUMP_VELOCITY:
|
|
|
|
item->fallspeed = *(cmd++);
|
|
|
|
item->speed = *(cmd++);
|
|
|
|
item->gravityStatus = true;
|
|
|
|
if (Lara.calcFallSpeed)
|
|
|
|
{
|
|
|
|
item->fallspeed = Lara.calcFallSpeed;
|
|
|
|
Lara.calcFallSpeed = 0;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
|
|
|
case COMMAND_ATTACK_READY:
|
|
|
|
if (Lara.gunStatus != LG_SPECIAL)
|
|
|
|
Lara.gunStatus = LG_NO_ARMS;
|
|
|
|
break;
|
|
|
|
|
|
|
|
case COMMAND_SOUND_FX:
|
|
|
|
case COMMAND_EFFECT:
|
|
|
|
cmd += 2;
|
|
|
|
break;
|
|
|
|
|
|
|
|
default:
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
item->animNumber = anim->jumpAnimNum;
|
|
|
|
item->frameNumber = anim->jumpFrameNum;
|
|
|
|
|
|
|
|
anim = &Anims[item->animNumber];
|
|
|
|
item->currentAnimState = anim->currentAnimState;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (anim->numberCommands > 0)
|
|
|
|
{
|
|
|
|
short* cmd = &Commands[anim->commandIndex];
|
|
|
|
int flags;
|
|
|
|
|
|
|
|
for (int i = anim->numberCommands; i > 0; i--)
|
|
|
|
{
|
|
|
|
switch (*(cmd++))
|
|
|
|
{
|
|
|
|
case COMMAND_MOVE_ORIGIN:
|
|
|
|
cmd += 3;
|
|
|
|
break;
|
|
|
|
|
|
|
|
case COMMAND_JUMP_VELOCITY:
|
|
|
|
cmd += 2;
|
|
|
|
break;
|
|
|
|
|
|
|
|
case COMMAND_SOUND_FX:
|
|
|
|
if (item->frameNumber != *cmd)
|
|
|
|
{
|
|
|
|
cmd += 2;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
flags = cmd[1] & 0xC000;
|
|
|
|
if (flags == SFX_LANDANDWATER ||
|
2019-12-29 19:10:53 +01:00
|
|
|
(flags == SFX_LANDONLY && (Lara.waterSurfaceDist >= 0 || Lara.waterSurfaceDist == NO_HEIGHT)) ||
|
|
|
|
(flags == SFX_WATERONLY && Lara.waterSurfaceDist < 0 && Lara.waterSurfaceDist != NO_HEIGHT && !(Rooms[LaraItem->roomNumber].flags & ENV_FLAG_SWAMP)))
|
2019-12-04 18:51:23 +01:00
|
|
|
{
|
|
|
|
SoundEffect(cmd[1] & 0x3FFF, &item->pos, 2);
|
|
|
|
}
|
|
|
|
|
|
|
|
cmd += 2;
|
|
|
|
break;
|
|
|
|
|
|
|
|
case COMMAND_EFFECT:
|
|
|
|
if (item->frameNumber != *cmd)
|
|
|
|
{
|
|
|
|
cmd += 2;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
FXType = cmd[1] & 0xC000;
|
2020-01-05 18:48:16 +01:00
|
|
|
(*effect_routines[(int)(cmd[1] & 0x3fff)])(item);
|
2019-12-04 18:51:23 +01:00
|
|
|
|
|
|
|
cmd += 2;
|
|
|
|
break;
|
|
|
|
|
|
|
|
default:
|
|
|
|
break;
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
int lateral = anim->Xvelocity;
|
|
|
|
if (anim->Xacceleration)
|
|
|
|
lateral += anim->Xacceleration * (item->frameNumber - anim->frameBase);
|
|
|
|
lateral >>= 16;
|
|
|
|
|
2019-12-29 19:10:53 +01:00
|
|
|
if (item->gravityStatus) // If gravity ON (Do Up/Down movement)
|
2019-12-04 18:51:23 +01:00
|
|
|
{
|
2019-12-29 19:10:53 +01:00
|
|
|
if (Rooms[item->roomNumber].flags & ENV_FLAG_SWAMP)
|
2019-12-04 18:51:23 +01:00
|
|
|
{
|
2019-12-29 19:10:53 +01:00
|
|
|
item->speed -= item->speed >> 3;
|
|
|
|
if (abs(item->speed) < 8)
|
2019-12-04 18:51:23 +01:00
|
|
|
{
|
|
|
|
item->speed = 0;
|
2019-12-29 19:10:53 +01:00
|
|
|
item->gravityStatus = false;
|
2019-12-04 18:51:23 +01:00
|
|
|
}
|
|
|
|
if (item->fallspeed > 128)
|
|
|
|
item->fallspeed >>= 1;
|
2019-12-29 19:10:53 +01:00
|
|
|
item->fallspeed -= item->fallspeed >> 2;
|
2019-12-04 18:51:23 +01:00
|
|
|
if (item->fallspeed < 4)
|
|
|
|
item->fallspeed = 4;
|
2019-12-29 19:10:53 +01:00
|
|
|
item->pos.yPos += item->fallspeed;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
int velocity = (anim->velocity + anim->acceleration * (item->frameNumber - anim->frameBase - 1));
|
|
|
|
item->speed -= velocity >> 16;
|
|
|
|
item->speed += (velocity + anim->acceleration) >> 16;
|
|
|
|
item->fallspeed += (item->fallspeed >= 128 ? 1 : GRAVITY);
|
|
|
|
item->pos.yPos += item->fallspeed;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else // if on the Ground...
|
|
|
|
{
|
|
|
|
int velocity;
|
|
|
|
|
|
|
|
if (Lara.waterStatus == LW_WADE && Rooms[item->roomNumber].flags & ENV_FLAG_SWAMP)
|
|
|
|
{
|
|
|
|
velocity = anim->velocity >> 1;
|
|
|
|
if (anim->acceleration)
|
|
|
|
velocity += anim->acceleration * (item->frameNumber - anim->frameBase) >> 2;
|
2019-12-04 18:51:23 +01:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2019-12-29 19:10:53 +01:00
|
|
|
velocity = anim->velocity;
|
|
|
|
if (anim->acceleration)
|
|
|
|
velocity += anim->acceleration * (item->frameNumber - anim->frameBase);
|
2019-12-04 18:51:23 +01:00
|
|
|
}
|
2019-12-29 19:10:53 +01:00
|
|
|
|
|
|
|
item->speed = velocity >> 16;
|
2019-12-04 18:51:23 +01:00
|
|
|
}
|
2019-12-29 19:10:53 +01:00
|
|
|
|
|
|
|
/*if (lara.RopePtr != -1)
|
|
|
|
result = j_SomeRopeCollisionFunc(item);*/
|
2019-12-04 18:51:23 +01:00
|
|
|
|
|
|
|
if (!Lara.isMoving)
|
|
|
|
{
|
|
|
|
item->pos.xPos += item->speed * SIN(Lara.moveAngle) >> W2V_SHIFT;
|
|
|
|
item->pos.zPos += item->speed * COS(Lara.moveAngle) >> W2V_SHIFT;
|
|
|
|
|
|
|
|
item->pos.xPos += lateral * SIN(Lara.moveAngle + ANGLE(90)) >> W2V_SHIFT;
|
|
|
|
item->pos.zPos += lateral * COS(Lara.moveAngle + ANGLE(90)) >> W2V_SHIFT;
|
|
|
|
}
|
|
|
|
}
|