mirror of
https://github.com/TombEngine/TombEngine.git
synced 2025-05-06 19:01:06 +03:00
Refactor biggun.cpp and quad.cpp
This commit is contained in:
parent
2ed0dbeddc
commit
f68b5334e0
5 changed files with 199 additions and 219 deletions
|
@ -833,7 +833,7 @@ void LaraAboveWater(ITEM_INFO* item, COLL_INFO* coll)
|
|||
break;
|
||||
|
||||
case ID_BIGGUN:
|
||||
if (BigGunControl(coll))
|
||||
if (BigGunControl(item, coll))
|
||||
return;
|
||||
break;
|
||||
|
||||
|
|
|
@ -15,202 +15,182 @@
|
|||
#include "camera.h"
|
||||
#include "biggun_info.h"
|
||||
|
||||
static long GunRotYAdd = 0;
|
||||
bool barrelRotating;
|
||||
|
||||
#define RECOIL_TIME 26
|
||||
#define RECOIL_Z 25
|
||||
|
||||
//flags
|
||||
#define FLAG_UPDOWN 1
|
||||
#define FLAG_AUTOROT 2
|
||||
#define FLAG_GETOFF 4
|
||||
#define FLAG_FIRE 8
|
||||
//frames
|
||||
#define BGUN_UPDOWN_FRAMES 59
|
||||
#define GETOFF_FRAME 30//the frame where Lara isn't looking either up or down in her "main" animation, aka when she can get off
|
||||
// Frames
|
||||
#define BGUN_STATE_UP_DOWN_FRAMES 59
|
||||
#define BGUN_DISMOUNT_FRAME 30
|
||||
|
||||
enum {//states
|
||||
BGUN_GETON,
|
||||
BGUN_GETOFF,
|
||||
BGUN_UPDOWN,
|
||||
BGUN_RECOIL
|
||||
};
|
||||
enum {//anims
|
||||
BGUN_GETON_A,
|
||||
BGUN_GETOFF_A,
|
||||
BGUN_UPDOWN_A,
|
||||
BGUN_RECOIL_A
|
||||
#define BGUN_IN_FIRE IN_ACTION
|
||||
#define BGUN_IN_DISMOUNT (IN_ROLL | IN_JUMP)
|
||||
#define BGUN_IN_UP IN_FORWARD
|
||||
#define BGUN_IN_DOWN IN_BACK
|
||||
#define BGUN_IN_LEFT IN_LEFT
|
||||
#define BGUN_IN_RIGHT IN_RIGHT
|
||||
|
||||
enum BigGunState {
|
||||
BGUN_STATE_MOUNT = 0,
|
||||
BGUN_STATE_DISMOUNT = 1,
|
||||
BGUN_STATE_UP_DOWN = 2,
|
||||
BGUN_STATE_RECOIL = 3
|
||||
};
|
||||
|
||||
void FireBigGun(ITEM_INFO *obj)
|
||||
enum BigGunAnim {
|
||||
BGUN_ANIM_MOUNT = 0,
|
||||
BGUN_ANIM_DISMOUNT = 1,
|
||||
BGUN_ANIM_UP_DOWN = 2,
|
||||
BGUN_ANIM_RECOIL = 3
|
||||
};
|
||||
|
||||
enum BigGunFlags {
|
||||
BGUN_FLAG_UP_DOWN = 1,
|
||||
BGUN_FLAG_AUTO_ROT = 2,
|
||||
BGUN_FLAG_DISMOUNT = 4,
|
||||
BGUN_FLAG_FIRE = 8
|
||||
};
|
||||
|
||||
static long GunRotYAdd = 0;
|
||||
bool barrelRotating;
|
||||
|
||||
void FireBigGun(ITEM_INFO* bigGun)
|
||||
{
|
||||
short itemNumber = CreateItem();
|
||||
if (itemNumber != NO_ITEM)
|
||||
{
|
||||
auto bigGunInfo = (BIGGUNINFO*)bigGun->data;
|
||||
auto itemNumber = CreateItem();
|
||||
ITEM_INFO* projectile = &g_Level.Items[itemNumber];
|
||||
|
||||
BIGGUNINFO *gun = (BIGGUNINFO*)obj->data;
|
||||
|
||||
ITEM_INFO* item = &g_Level.Items[itemNumber];
|
||||
item->objectNumber = ID_ROCKET;
|
||||
item->roomNumber = LaraItem->roomNumber;
|
||||
|
||||
|
||||
PHD_VECTOR pos;
|
||||
pos.x = 0;
|
||||
pos.y = 0;
|
||||
pos.z = 256;//520;
|
||||
|
||||
GetJointAbsPosition(obj, &pos, 2);
|
||||
if (itemNumber != NO_ITEM)
|
||||
{
|
||||
projectile->objectNumber = ID_ROCKET;
|
||||
projectile->roomNumber = LaraItem->roomNumber;
|
||||
|
||||
PHD_VECTOR pos = { 0, 0, 256 }; // 256 or 520?
|
||||
GetJointAbsPosition(bigGun, &pos, 2);
|
||||
|
||||
item->pos.xPos = pos.x;
|
||||
item->pos.yPos = pos.y;
|
||||
item->pos.zPos = pos.z;
|
||||
projectile->pos.xPos = pos.x;
|
||||
projectile->pos.yPos = pos.y;
|
||||
projectile->pos.zPos = pos.z;
|
||||
|
||||
InitialiseItem(itemNumber);
|
||||
InitialiseItem(itemNumber);
|
||||
|
||||
projectile->pos.xRot = -((bigGunInfo->xRot - 32) * ANGLE(1.0f));
|
||||
projectile->pos.yRot = bigGun->pos.yRot;
|
||||
projectile->pos.zRot = 0;
|
||||
projectile->speed = 16;
|
||||
projectile->itemFlags[0] = 1;
|
||||
|
||||
item->pos.xRot = -((gun->xRot - 32) * (ANGLE(1)));
|
||||
item->pos.yRot = obj->pos.yRot;
|
||||
item->pos.zRot = 0;
|
||||
item->speed = 16;
|
||||
item->itemFlags[0] = 1;
|
||||
AddActiveItem(itemNumber);
|
||||
|
||||
AddActiveItem(itemNumber);
|
||||
SmokeCountL = 32;
|
||||
SmokeWeapon = WEAPON_ROCKET_LAUNCHER;
|
||||
|
||||
SmokeCountL = 32;
|
||||
SmokeWeapon = WEAPON_ROCKET_LAUNCHER;
|
||||
|
||||
for (int i = 0; i < 5; i++)
|
||||
TriggerGunSmoke(pos.x, pos.y, pos.z, 0, 0, 0, 1, WEAPON_ROCKET_LAUNCHER, 32);
|
||||
|
||||
SoundEffect(SFX_TR4_EXPLOSION1, 0, 0);
|
||||
}
|
||||
for (int i = 0; i < 5; i++)
|
||||
TriggerGunSmoke(pos.x, pos.y, pos.z, 0, 0, 0, 1, WEAPON_ROCKET_LAUNCHER, 32);
|
||||
|
||||
SoundEffect(SFX_TR4_EXPLOSION1, 0, 0);
|
||||
}
|
||||
}
|
||||
|
||||
static int CanUseGun(ITEM_INFO *obj, ITEM_INFO *lara)
|
||||
static bool CanUseGun(ITEM_INFO* lara, ITEM_INFO* bigGun)
|
||||
{
|
||||
int dist;
|
||||
long long x, z;
|
||||
//LaraInfo*& laraInfo = lara->data; // This function is presumably called before Lara is initialised, so global must be used. @Sezz 2021.11.16
|
||||
|
||||
if ((!(TrInput & IN_ACTION))
|
||||
|| (Lara.gunStatus != LG_NO_ARMS)
|
||||
|| (lara->gravityStatus))
|
||||
return 0;
|
||||
|
||||
x = lara->pos.xPos - obj->pos.xPos;
|
||||
z = lara->pos.zPos - obj->pos.zPos;
|
||||
|
||||
dist = SQUARE(x) + SQUARE(z);
|
||||
if (!(TrInput & IN_ACTION) ||
|
||||
Lara.gunStatus != LG_NO_ARMS ||
|
||||
lara->gravityStatus) // BUG: Lara can still mount when jumping up. @Sezz 2021.11.16
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
auto dist = pow(lara->pos.xPos - bigGun->pos.xPos, 2) + pow(lara->pos.zPos - bigGun->pos.zPos, 2);
|
||||
if (dist > 30000)
|
||||
return 0;
|
||||
return false;
|
||||
|
||||
short ang = abs(lara->pos.yRot - obj->pos.yRot);
|
||||
if (ang > ANGLE(35.0f) || ang < -ANGLE(35.0f))
|
||||
return 0;
|
||||
short angle = abs(lara->pos.yRot - bigGun->pos.yRot);
|
||||
if (angle > ANGLE(35.0f) || angle < -ANGLE(35.0f))
|
||||
return false;
|
||||
|
||||
return 1;
|
||||
return true;
|
||||
}
|
||||
|
||||
void BigGunInitialise(short itemNum)
|
||||
{
|
||||
ITEM_INFO *obj;
|
||||
BIGGUNINFO *gun;
|
||||
ITEM_INFO* bigGun = &g_Level.Items[itemNum];
|
||||
bigGun->data = BIGGUNINFO();
|
||||
auto bigGunInfo = (BIGGUNINFO*)bigGun->data;
|
||||
|
||||
obj = &g_Level.Items[itemNum];
|
||||
obj->data = BIGGUNINFO();
|
||||
|
||||
gun = obj->data;
|
||||
gun->flags = 0;
|
||||
gun->fireCount = 0;
|
||||
gun->xRot = GETOFF_FRAME;
|
||||
gun->yRot = 0;
|
||||
gun->startYRot = obj->pos.yRot;
|
||||
bigGunInfo->flags = 0;
|
||||
bigGunInfo->fireCount = 0;
|
||||
bigGunInfo->xRot = BGUN_DISMOUNT_FRAME;
|
||||
bigGunInfo->yRot = 0;
|
||||
bigGunInfo->startYRot = bigGun->pos.yRot;
|
||||
}
|
||||
|
||||
void BigGunCollision(short itemNum, ITEM_INFO* lara, COLL_INFO* coll)
|
||||
{
|
||||
ITEM_INFO* obj;
|
||||
LaraInfo*& laraInfo = lara->data;
|
||||
ITEM_INFO* bigGun = &g_Level.Items[itemNum];
|
||||
auto bigGunInfo = (BIGGUNINFO*)bigGun->data;
|
||||
|
||||
if (lara->hitPoints <= 0 || Lara.Vehicle != NO_ITEM)
|
||||
if (lara->hitPoints <= 0 || laraInfo->Vehicle != NO_ITEM)
|
||||
return;
|
||||
|
||||
obj = &g_Level.Items[itemNum];
|
||||
|
||||
if (CanUseGun(obj, lara))
|
||||
if (CanUseGun(bigGun, lara))
|
||||
{
|
||||
BIGGUNINFO *gun;
|
||||
Lara.Vehicle = itemNum;
|
||||
laraInfo->Vehicle = itemNum;
|
||||
|
||||
if (Lara.gunType == WEAPON_FLARE)
|
||||
if (laraInfo->gunType == WEAPON_FLARE)
|
||||
{
|
||||
CreateFlare(LaraItem, ID_FLARE_ITEM, 0);
|
||||
undraw_flare_meshes();
|
||||
Lara.flareControlLeft = false;
|
||||
Lara.requestGunType = WEAPON_NONE;
|
||||
Lara.gunType = WEAPON_NONE;
|
||||
|
||||
laraInfo->flareControlLeft = false;
|
||||
laraInfo->requestGunType = WEAPON_NONE;
|
||||
laraInfo->gunType = WEAPON_NONE;
|
||||
}
|
||||
|
||||
Lara.gunStatus = LG_HANDS_BUSY;
|
||||
|
||||
obj->hitPoints = 1;
|
||||
lara->pos.xPos = obj->pos.xPos;
|
||||
lara->pos.xRot = obj->pos.xRot;
|
||||
lara->pos.yPos = obj->pos.yPos;
|
||||
lara->pos.yRot = obj->pos.yRot;
|
||||
lara->pos.zPos = obj->pos.zPos;
|
||||
lara->pos.zRot = obj->pos.zRot;
|
||||
|
||||
lara->animNumber = Objects[ID_BIGGUN_ANIMS].animIndex + BGUN_GETON_A;
|
||||
lara->frameNumber = g_Level.Anims[Objects[ID_BIGGUN_ANIMS].animIndex + BGUN_GETON_A].frameBase;
|
||||
lara->currentAnimState = BGUN_GETON;
|
||||
lara->goalAnimState = BGUN_GETON;
|
||||
|
||||
gun = (BIGGUNINFO*)obj->data;
|
||||
gun->flags = 0;
|
||||
gun->xRot = GETOFF_FRAME;
|
||||
lara->animNumber = Objects[ID_BIGGUN_ANIMS].animIndex + BGUN_ANIM_MOUNT;
|
||||
lara->frameNumber = g_Level.Anims[Objects[ID_BIGGUN_ANIMS].animIndex + BGUN_ANIM_MOUNT].frameBase;
|
||||
lara->currentAnimState = BGUN_STATE_MOUNT;
|
||||
lara->goalAnimState = BGUN_STATE_MOUNT;
|
||||
lara->pos = bigGun->pos;
|
||||
laraInfo->gunStatus = LG_HANDS_BUSY;
|
||||
bigGun->hitPoints = 1;
|
||||
bigGunInfo->flags = 0;
|
||||
bigGunInfo->xRot = BGUN_DISMOUNT_FRAME;
|
||||
|
||||
}
|
||||
else
|
||||
ObjectCollision(itemNum, lara, coll);
|
||||
}
|
||||
|
||||
int BigGunControl(COLL_INFO *coll)
|
||||
bool BigGunControl(ITEM_INFO* lara, COLL_INFO* coll)
|
||||
{
|
||||
BIGGUNINFO *gun;
|
||||
ITEM_INFO *obj;
|
||||
ITEM_INFO *lara;
|
||||
LaraInfo*& laraInfo = lara->data;
|
||||
ITEM_INFO* bigGun = &g_Level.Items[laraInfo->Vehicle];
|
||||
auto bigGunInfo = (BIGGUNINFO*)bigGun->data;
|
||||
|
||||
lara = LaraItem;
|
||||
obj = &g_Level.Items[Lara.Vehicle];
|
||||
gun = (BIGGUNINFO *)obj->data;
|
||||
|
||||
if (gun->flags & FLAG_UPDOWN)
|
||||
if (bigGunInfo->flags & BGUN_FLAG_UP_DOWN)
|
||||
{
|
||||
if (barrelRotating)
|
||||
gun->barrelZ--;
|
||||
bigGunInfo->barrelZ--;
|
||||
|
||||
if (!gun->barrelZ)
|
||||
if (!bigGunInfo->barrelZ)
|
||||
barrelRotating = false;
|
||||
|
||||
if ((lara->hitPoints <= 0) || (TrInput & IN_ROLL))
|
||||
{
|
||||
gun->flags = FLAG_AUTOROT;
|
||||
}
|
||||
if (TrInput & BGUN_IN_DISMOUNT || lara->hitPoints <= 0)
|
||||
bigGunInfo->flags = BGUN_FLAG_AUTO_ROT;
|
||||
else
|
||||
{
|
||||
if ((TrInput & IN_ACTION) && gun->fireCount == 0)
|
||||
if (TrInput & BGUN_IN_FIRE && bigGunInfo->fireCount == 0)
|
||||
{
|
||||
FireBigGun(obj);
|
||||
gun->fireCount = RECOIL_TIME;
|
||||
gun->barrelZ = RECOIL_Z;
|
||||
FireBigGun(bigGun);
|
||||
bigGunInfo->fireCount = RECOIL_TIME;
|
||||
bigGunInfo->barrelZ = RECOIL_Z;
|
||||
barrelRotating = true;
|
||||
}
|
||||
|
||||
if (TrInput & IN_LEFT)
|
||||
if (TrInput & BGUN_IN_LEFT)
|
||||
{
|
||||
if (GunRotYAdd > 0)
|
||||
GunRotYAdd /= 2;
|
||||
|
@ -221,7 +201,7 @@ int BigGunControl(COLL_INFO *coll)
|
|||
GunRotYAdd = -64;
|
||||
}
|
||||
else
|
||||
if (TrInput & IN_RIGHT)
|
||||
if (TrInput & BGUN_IN_RIGHT)
|
||||
{
|
||||
if (GunRotYAdd < 0)
|
||||
GunRotYAdd /= 2;
|
||||
|
@ -238,73 +218,71 @@ int BigGunControl(COLL_INFO *coll)
|
|||
GunRotYAdd = 0;
|
||||
}
|
||||
|
||||
gun->yRot += GunRotYAdd / 4;
|
||||
bigGunInfo->yRot += GunRotYAdd / 4;
|
||||
|
||||
if ((TrInput & IN_FORWARD) && (gun->xRot < BGUN_UPDOWN_FRAMES))
|
||||
gun->xRot++;
|
||||
else
|
||||
if ((TrInput & IN_BACK) && (gun->xRot))
|
||||
gun->xRot--;
|
||||
if (TrInput & BGUN_IN_UP && bigGunInfo->xRot < BGUN_STATE_UP_DOWN_FRAMES)
|
||||
bigGunInfo->xRot++;
|
||||
else if (TrInput & BGUN_IN_DOWN && bigGunInfo->xRot)
|
||||
bigGunInfo->xRot--;
|
||||
}
|
||||
}
|
||||
|
||||
if (gun->flags & FLAG_AUTOROT)
|
||||
if (bigGunInfo->flags & BGUN_FLAG_AUTO_ROT)
|
||||
{
|
||||
if (gun->xRot == GETOFF_FRAME)
|
||||
if (bigGunInfo->xRot == BGUN_DISMOUNT_FRAME)
|
||||
{
|
||||
lara->animNumber = Objects[ID_BIGGUN_ANIMS].animIndex + BGUN_GETOFF_A;
|
||||
lara->frameNumber = g_Level.Anims[Objects[ID_BIGGUN].animIndex + BGUN_GETOFF_A].frameBase;
|
||||
lara->currentAnimState = BGUN_GETOFF;
|
||||
lara->goalAnimState = BGUN_GETOFF;
|
||||
gun->flags = FLAG_GETOFF;
|
||||
lara->animNumber = Objects[ID_BIGGUN_ANIMS].animIndex + BGUN_ANIM_DISMOUNT;
|
||||
lara->frameNumber = g_Level.Anims[Objects[ID_BIGGUN].animIndex + BGUN_ANIM_DISMOUNT].frameBase;
|
||||
lara->currentAnimState = BGUN_STATE_DISMOUNT;
|
||||
lara->goalAnimState = BGUN_STATE_DISMOUNT;
|
||||
bigGunInfo->flags = BGUN_FLAG_DISMOUNT;
|
||||
}
|
||||
else if (gun->xRot > GETOFF_FRAME)
|
||||
gun->xRot--;
|
||||
else if (gun->xRot < GETOFF_FRAME)
|
||||
gun->xRot++;
|
||||
else if (bigGunInfo->xRot > BGUN_DISMOUNT_FRAME)
|
||||
bigGunInfo->xRot--;
|
||||
else if (bigGunInfo->xRot < BGUN_DISMOUNT_FRAME)
|
||||
bigGunInfo->xRot++;
|
||||
}
|
||||
|
||||
switch (lara->currentAnimState)
|
||||
{
|
||||
case BGUN_GETON:
|
||||
case BGUN_GETOFF:
|
||||
case BGUN_STATE_MOUNT:
|
||||
case BGUN_STATE_DISMOUNT:
|
||||
AnimateItem(lara);
|
||||
obj->animNumber = Objects[ID_BIGGUN].animIndex + (lara->animNumber - Objects[ID_BIGGUN_ANIMS].animIndex);
|
||||
obj->frameNumber = g_Level.Anims[obj->animNumber].frameBase + (lara->frameNumber - g_Level.Anims[lara->animNumber].frameBase);
|
||||
bigGun->animNumber = Objects[ID_BIGGUN].animIndex + (lara->animNumber - Objects[ID_BIGGUN_ANIMS].animIndex);
|
||||
bigGun->frameNumber = g_Level.Anims[bigGun->animNumber].frameBase + (lara->frameNumber - g_Level.Anims[lara->animNumber].frameBase);
|
||||
|
||||
if ((gun->flags & FLAG_GETOFF) && lara->frameNumber == g_Level.Anims[lara->animNumber].frameEnd)
|
||||
if (bigGunInfo->flags & BGUN_FLAG_DISMOUNT && TestLastFrame(lara, lara->animNumber))
|
||||
{
|
||||
lara->animNumber = LA_STAND_SOLID;
|
||||
lara->frameNumber = g_Level.Anims[lara->animNumber].frameBase;
|
||||
lara->currentAnimState = LS_STOP;
|
||||
lara->goalAnimState = LS_STOP;
|
||||
Lara.Vehicle = NO_ITEM;
|
||||
Lara.gunStatus = LG_NO_ARMS;
|
||||
obj->hitPoints = 0;
|
||||
SetAnimation(lara, LA_STAND_IDLE);
|
||||
laraInfo->Vehicle = NO_ITEM;
|
||||
laraInfo->gunStatus = LG_NO_ARMS;
|
||||
bigGun->hitPoints = 0;
|
||||
}
|
||||
|
||||
break;
|
||||
case BGUN_UPDOWN:
|
||||
lara->animNumber = Objects[ID_BIGGUN_ANIMS].animIndex + BGUN_UPDOWN_A;
|
||||
lara->frameNumber = g_Level.Anims[Objects[ID_BIGGUN].animIndex + BGUN_UPDOWN_A].frameBase + gun->xRot;
|
||||
|
||||
obj->animNumber = Objects[ID_BIGGUN].animIndex + (lara->animNumber - Objects[ID_BIGGUN_ANIMS].animIndex);
|
||||
obj->frameNumber = g_Level.Anims[obj->animNumber].frameBase + (lara->frameNumber - g_Level.Anims[lara->animNumber].frameBase);
|
||||
case BGUN_STATE_UP_DOWN:
|
||||
lara->animNumber = Objects[ID_BIGGUN_ANIMS].animIndex + BGUN_ANIM_UP_DOWN;
|
||||
lara->frameNumber = g_Level.Anims[Objects[ID_BIGGUN].animIndex + BGUN_ANIM_UP_DOWN].frameBase + bigGunInfo->xRot;
|
||||
bigGun->animNumber = Objects[ID_BIGGUN].animIndex + (lara->animNumber - Objects[ID_BIGGUN_ANIMS].animIndex);
|
||||
bigGun->frameNumber = g_Level.Anims[bigGun->animNumber].frameBase + (lara->frameNumber - g_Level.Anims[lara->animNumber].frameBase);
|
||||
|
||||
if (gun->fireCount > 0)
|
||||
gun->fireCount--;
|
||||
else if (gun->fireCount <= 0)
|
||||
gun->fireCount = 0;
|
||||
if (bigGunInfo->fireCount > 0)
|
||||
bigGunInfo->fireCount--;
|
||||
else if (bigGunInfo->fireCount <= 0)
|
||||
bigGunInfo->fireCount = 0;
|
||||
|
||||
bigGunInfo->flags = BGUN_FLAG_UP_DOWN;
|
||||
|
||||
gun->flags = FLAG_UPDOWN;
|
||||
break;
|
||||
}
|
||||
|
||||
lara->pos.yRot = obj->pos.yRot = gun->startYRot + (gun->yRot * (ANGLE(1) / 4));
|
||||
|
||||
Camera.targetElevation = -ANGLE(15.0f);
|
||||
lara->pos.yRot = bigGunInfo->startYRot + bigGunInfo->yRot * (ANGLE(1.0f) / 4);
|
||||
coll->Setup.EnableSpaz = false;
|
||||
coll->Setup.EnableObjectPush = false;
|
||||
bigGun->pos.yRot = bigGunInfo->startYRot + bigGunInfo->yRot * (ANGLE(1.0f) / 4);
|
||||
DoObjectCollision(lara, coll);
|
||||
|
||||
Camera.targetElevation = -ANGLE(15);
|
||||
return 1;
|
||||
return true;
|
||||
}
|
||||
|
|
|
@ -1,10 +1,11 @@
|
|||
#pragma once
|
||||
|
||||
struct COLL_INFO;
|
||||
struct ITEM_INFO;
|
||||
|
||||
void FireBigGun(ITEM_INFO *obj);
|
||||
void FireBigGun(ITEM_INFO* obj);
|
||||
void BigGunInitialise(short itemNum);
|
||||
static int CanUseGun(ITEM_INFO *obj, ITEM_INFO *lara);
|
||||
static bool CanUseGun (ITEM_INFO* lara, ITEM_INFO* bigGun);
|
||||
void BigGunInitialise(short itemNum);
|
||||
void BigGunCollision(short itemNum, ITEM_INFO* lara, COLL_INFO* coll);
|
||||
int BigGunControl(COLL_INFO *coll);
|
||||
bool BigGunControl(ITEM_INFO* lara, COLL_INFO* coll);
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
#pragma once
|
||||
|
||||
struct BIGGUNINFO {
|
||||
short xRot;
|
||||
short yRot;
|
||||
|
@ -6,4 +7,4 @@ struct BIGGUNINFO {
|
|||
char flags;
|
||||
int fireCount;
|
||||
short barrelZ;
|
||||
};
|
||||
};
|
||||
|
|
|
@ -90,7 +90,7 @@ using namespace TEN::Math::Random;
|
|||
#define QUAD_IN_ACCELERATE IN_ACTION
|
||||
#define QUAD_IN_BRAKE IN_JUMP
|
||||
#define QUAD_IN_DRIFT (IN_DUCK | IN_SPRINT)
|
||||
#define QUAD_IN_UNMOUNT IN_ROLL
|
||||
#define QUAD_IN_DISMOUNT IN_ROLL
|
||||
#define QUAD_IN_LEFT IN_LEFT
|
||||
#define QUAD_IN_RIGHT IN_RIGHT
|
||||
|
||||
|
@ -101,8 +101,8 @@ enum QuadState {
|
|||
QUAD_STATE_BRAKE = 6,
|
||||
QUAD_STATE_BIKE_DEATH = 7,
|
||||
QUAD_STATE_FALL = 8,
|
||||
QUAD_STATE_GET_ON_RIGHT = 9,
|
||||
QUAD_STATE_GET_OFF_RIGHT = 10,
|
||||
QUAD_STATE_MOUNT_RIGHT = 9,
|
||||
QUAD_STATE_DISMOUNT_RIGHT = 10,
|
||||
QUAD_STATE_HIT_BACK = 11,
|
||||
QUAD_STATE_HIT_FRONT = 12,
|
||||
QUAD_STATE_HIT_LEFT = 13,
|
||||
|
@ -114,22 +114,26 @@ enum QuadState {
|
|||
QUAD_STATE_FALL_OFF = 20,
|
||||
QUAD_STATE_WHEELIE = 21, // Unused.
|
||||
QUAD_STATE_TURN_RIGHT = 22,
|
||||
QUAD_STATE_GET_ON_LEFT = 23,
|
||||
QUAD_STATE_GET_OFF_LEFT = 24,
|
||||
QUAD_STATE_MOUNT_LEFT = 23,
|
||||
QUAD_STATE_DISMOUNT_LEFT = 24,
|
||||
};
|
||||
|
||||
enum QuadAnim {
|
||||
|
||||
};
|
||||
|
||||
enum QuadFlags {
|
||||
QUAD_FLAGS_DEAD = 0x80,
|
||||
QUAD_FLAGS_IS_FALLING = 0x40
|
||||
QUAD_FLAG_DEAD = 0x80,
|
||||
QUAD_FLAG_IS_FALLING = 0x40
|
||||
};
|
||||
|
||||
enum QuadEffectPosition {
|
||||
EXHAUST_LEFT = 0,
|
||||
EXHAUST_RIGHT,
|
||||
BACKLEFT_TYRE,
|
||||
BACKRIGHT_TYRE,
|
||||
FRONTRIGHT_TYRE,
|
||||
FRONTLEFT_TYRE
|
||||
FRONT_LEFT_TYRE,
|
||||
FRONT_RIGHT_TYRE,
|
||||
BACK_LEFT_TYRE,
|
||||
BACK_RIGHT_TYRE
|
||||
};
|
||||
|
||||
BITE_INFO quadEffectsPositions[6] = {
|
||||
|
@ -228,10 +232,10 @@ static bool QuadCheckGetOff(ITEM_INFO* lara, ITEM_INFO* quad)
|
|||
if (laraInfo->Vehicle == NO_ITEM)
|
||||
return true;
|
||||
|
||||
if ((lara->currentAnimState == QUAD_STATE_GET_OFF_RIGHT || lara->currentAnimState == QUAD_STATE_GET_OFF_LEFT) &&
|
||||
if ((lara->currentAnimState == QUAD_STATE_DISMOUNT_RIGHT || lara->currentAnimState == QUAD_STATE_DISMOUNT_LEFT) &&
|
||||
TestLastFrame(lara, lara->animNumber))
|
||||
{
|
||||
if (lara->currentAnimState == QUAD_STATE_GET_OFF_LEFT)
|
||||
if (lara->currentAnimState == QUAD_STATE_DISMOUNT_LEFT)
|
||||
lara->pos.yRot += ANGLE(90.0f);
|
||||
else
|
||||
lara->pos.yRot -= ANGLE(90.0f);
|
||||
|
@ -266,7 +270,7 @@ static bool QuadCheckGetOff(ITEM_INFO* lara, ITEM_INFO* quad)
|
|||
}
|
||||
else if (lara->currentAnimState == QUAD_STATE_FALL_DEATH)
|
||||
{
|
||||
quadInfo->flags |= QUAD_FLAGS_DEAD;
|
||||
quadInfo->flags |= QUAD_FLAG_DEAD;
|
||||
lara->goalAnimState = LS_DEATH;
|
||||
lara->fallspeed = DAMAGE_START + DAMAGE_LENGTH;
|
||||
lara->speed = 0;
|
||||
|
@ -293,12 +297,8 @@ static int GetOnQuadBike(ITEM_INFO* lara, ITEM_INFO* quad, COLL_INFO* coll)
|
|||
return false;
|
||||
}
|
||||
|
||||
auto dx = lara->pos.xPos - quad->pos.xPos;
|
||||
auto dz = lara->pos.zPos - quad->pos.zPos;
|
||||
|
||||
int distance = dx * dx + dz * dz;
|
||||
|
||||
if (distance > 170000)
|
||||
auto dist = pow(lara->pos.xPos - quad->pos.xPos, 2) + pow(lara->pos.zPos - quad->pos.zPos, 2);
|
||||
if (dist > 170000)
|
||||
return false;
|
||||
|
||||
auto probe = GetCollisionResult(quad);
|
||||
|
@ -841,14 +841,14 @@ static void AnimateQuadBike(ITEM_INFO* lara, ITEM_INFO* quad, int collide, int d
|
|||
case QUAD_STATE_IDLE:
|
||||
if (dead)
|
||||
lara->goalAnimState = QUAD_STATE_BIKE_DEATH;
|
||||
else if (TrInput & QUAD_IN_UNMOUNT &&
|
||||
else if (TrInput & QUAD_IN_DISMOUNT &&
|
||||
quadInfo->velocity == 0 &&
|
||||
!QuadNoGetOff)
|
||||
{
|
||||
if (TrInput & QUAD_IN_LEFT && CanQuadbikeGetOff(-1))
|
||||
lara->goalAnimState = QUAD_STATE_GET_OFF_LEFT;
|
||||
lara->goalAnimState = QUAD_STATE_DISMOUNT_LEFT;
|
||||
else if (TrInput & QUAD_IN_RIGHT && CanQuadbikeGetOff(1))
|
||||
lara->goalAnimState = QUAD_STATE_GET_OFF_RIGHT;
|
||||
lara->goalAnimState = QUAD_STATE_DISMOUNT_RIGHT;
|
||||
}
|
||||
else if (TrInput & (QUAD_IN_ACCELERATE | QUAD_IN_BRAKE))
|
||||
lara->goalAnimState = QUAD_STATE_DRIVE;
|
||||
|
@ -934,7 +934,7 @@ static void AnimateQuadBike(ITEM_INFO* lara, ITEM_INFO* quad, int collide, int d
|
|||
if (quad->pos.yPos == quad->floor)
|
||||
lara->goalAnimState = QUAD_STATE_LAND;
|
||||
else if (quad->fallspeed > TERMINAL_FALLSPEED)
|
||||
quadInfo->flags |= QUAD_FLAGS_IS_FALLING;
|
||||
quadInfo->flags |= QUAD_FLAG_IS_FALLING;
|
||||
|
||||
break;
|
||||
|
||||
|
@ -1190,12 +1190,12 @@ void QuadBikeCollision(short itemNumber, ITEM_INFO* lara, COLL_INFO* coll)
|
|||
if (ang > -ANGLE(45.0f) && ang < ANGLE(135.0f))
|
||||
{
|
||||
lara->animNumber = Objects[ID_QUAD_LARA_ANIMS].animIndex + QUADBIKE_GETONL_A;
|
||||
lara->currentAnimState = lara->goalAnimState = QUAD_STATE_GET_ON_LEFT;
|
||||
lara->currentAnimState = lara->goalAnimState = QUAD_STATE_MOUNT_LEFT;
|
||||
}
|
||||
else
|
||||
{
|
||||
lara->animNumber = Objects[ID_QUAD_LARA_ANIMS].animIndex + QUADBIKE_GETONR_A;
|
||||
lara->currentAnimState = lara->goalAnimState = QUAD_STATE_GET_ON_RIGHT;
|
||||
lara->currentAnimState = lara->goalAnimState = QUAD_STATE_MOUNT_RIGHT;
|
||||
}
|
||||
|
||||
lara->frameNumber = g_Level.Anims[lara->animNumber].frameBase;
|
||||
|
@ -1320,10 +1320,10 @@ int QuadBikeControl(void)
|
|||
{
|
||||
switch (lara->currentAnimState)
|
||||
{
|
||||
case QUAD_STATE_GET_ON_LEFT:
|
||||
case QUAD_STATE_GET_ON_RIGHT:
|
||||
case QUAD_STATE_GET_OFF_LEFT:
|
||||
case QUAD_STATE_GET_OFF_RIGHT:
|
||||
case QUAD_STATE_MOUNT_LEFT:
|
||||
case QUAD_STATE_MOUNT_RIGHT:
|
||||
case QUAD_STATE_DISMOUNT_LEFT:
|
||||
case QUAD_STATE_DISMOUNT_RIGHT:
|
||||
drive = -1;
|
||||
collide = false;
|
||||
|
||||
|
@ -1373,7 +1373,7 @@ int QuadBikeControl(void)
|
|||
quad->pos.xRot += ((xRot - quad->pos.xRot) / 2);
|
||||
quad->pos.zRot += ((zRot - quad->pos.zRot) / 2);
|
||||
|
||||
if (!(quadInfo->flags & QUAD_FLAGS_DEAD))
|
||||
if (!(quadInfo->flags & QUAD_FLAG_DEAD))
|
||||
{
|
||||
if (roomNumber != quad->roomNumber)
|
||||
{
|
||||
|
@ -1396,7 +1396,7 @@ int QuadBikeControl(void)
|
|||
|
||||
Camera.targetElevation = -ANGLE(30.0f);
|
||||
|
||||
if (quadInfo->flags & QUAD_FLAGS_IS_FALLING)
|
||||
if (quadInfo->flags & QUAD_FLAG_IS_FALLING)
|
||||
{
|
||||
if (quad->pos.yPos == quad->floor)
|
||||
{
|
||||
|
@ -1410,10 +1410,10 @@ int QuadBikeControl(void)
|
|||
}
|
||||
}
|
||||
|
||||
if (lara->currentAnimState != QUAD_STATE_GET_ON_RIGHT &&
|
||||
lara->currentAnimState != QUAD_STATE_GET_ON_LEFT &&
|
||||
lara->currentAnimState != QUAD_STATE_GET_OFF_RIGHT &&
|
||||
lara->currentAnimState != QUAD_STATE_GET_OFF_LEFT)
|
||||
if (lara->currentAnimState != QUAD_STATE_MOUNT_RIGHT &&
|
||||
lara->currentAnimState != QUAD_STATE_MOUNT_LEFT &&
|
||||
lara->currentAnimState != QUAD_STATE_DISMOUNT_RIGHT &&
|
||||
lara->currentAnimState != QUAD_STATE_DISMOUNT_LEFT)
|
||||
{
|
||||
PHD_VECTOR pos;
|
||||
int speed = 0;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue