mirror of
https://github.com/TombEngine/TombEngine.git
synced 2025-05-03 10:17:59 +03:00
More fixes to SAS
This commit is contained in:
parent
9cfb3bf166
commit
06ca306645
2 changed files with 116 additions and 25 deletions
|
@ -9,6 +9,7 @@
|
||||||
#include "setup.h"
|
#include "setup.h"
|
||||||
#include "level.h"
|
#include "level.h"
|
||||||
#include <Specific\input.h>
|
#include <Specific\input.h>
|
||||||
|
#include <Game/tomb4fx.h>
|
||||||
|
|
||||||
enum SAS_STATES
|
enum SAS_STATES
|
||||||
{
|
{
|
||||||
|
@ -360,20 +361,24 @@ void SasControl(short itemNumber)
|
||||||
creature->maximumTurn = ANGLE(10);
|
creature->maximumTurn = ANGLE(10);
|
||||||
tilt = angle / 2;
|
tilt = angle / 2;
|
||||||
|
|
||||||
/*if (Lara_Bike)
|
if (Lara.Vehicle != NO_ITEM)
|
||||||
{
|
{
|
||||||
v22 = (item->MainFlags >> 9) & 0x1F;
|
if (item->aiBits & MODIFY || !item->aiBits)
|
||||||
if (v22 == 8 || !v22)
|
|
||||||
{
|
{
|
||||||
goto LABEL_99;
|
item->goalAnimState = STATE_SAS_WAIT;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}*/
|
}
|
||||||
|
|
||||||
if (item->aiBits & GUARD || item->aiBits & FOLLOW && (creature->reachedGoal || distance > 0x400000))
|
if (item->aiBits & GUARD
|
||||||
|
|| item->aiBits & FOLLOW
|
||||||
|
&& (creature->reachedGoal
|
||||||
|
|| distance > SQUARE(2048)))
|
||||||
{
|
{
|
||||||
item->goalAnimState = STATE_SAS_WALK;
|
item->goalAnimState = STATE_SAS_WALK;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (creature->mood != ESCAPE_MOOD)
|
if (creature->mood != ESCAPE_MOOD)
|
||||||
{
|
{
|
||||||
if (Targetable(item, &info))
|
if (Targetable(item, &info))
|
||||||
|
@ -382,8 +387,10 @@ void SasControl(short itemNumber)
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (creature->mood != BORED_MOOD || creature->mood == STALK_MOOD &&
|
if (creature->mood != BORED_MOOD
|
||||||
item->aiBits & FOLLOW && info.distance < 0x400000)
|
|| creature->mood == STALK_MOOD
|
||||||
|
&& item->aiBits & FOLLOW
|
||||||
|
&& info.distance < SQUARE(2048))
|
||||||
{
|
{
|
||||||
item->goalAnimState = STATE_SAS_WALK;
|
item->goalAnimState = STATE_SAS_WALK;
|
||||||
}
|
}
|
||||||
|
@ -409,14 +416,13 @@ void SasControl(short itemNumber)
|
||||||
{
|
{
|
||||||
item->goalAnimState = STATE_SAS_KNEEL_SHOOT;
|
item->goalAnimState = STATE_SAS_KNEEL_SHOOT;
|
||||||
}
|
}
|
||||||
|
else if (GetRandomControl() & 1)
|
||||||
|
{
|
||||||
|
item->goalAnimState = STATE_SAS_HOLD_SHOOT;
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (!(GetRandomControl() & 1))
|
item->goalAnimState = STATE_SAS_HOLD_PREPARE_GRENADE;
|
||||||
{
|
|
||||||
item->goalAnimState = STATE_SAS_HOLD_PREPARE_GRENADE;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
item->goalAnimState = STATE_SAS_HOLD_SHOOT;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -459,11 +465,17 @@ void SasControl(short itemNumber)
|
||||||
joint1 = info.xAngle;
|
joint1 = info.xAngle;
|
||||||
joint0 = info.angle;
|
joint0 = info.angle;
|
||||||
|
|
||||||
if (info.distance > 9437184)
|
if (info.distance > SQUARE(3072))
|
||||||
{
|
{
|
||||||
joint1 = sqrt(info.distance) + info.xAngle - 1024;
|
angle2 = sqrt(info.distance) + info.xAngle - 1024;
|
||||||
|
joint1 = angle2;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
angle1 = 0;
|
||||||
|
angle2 = 0;
|
||||||
|
}
|
||||||
|
|
||||||
if (item->frameNumber == g_Level.Anims[item->animNumber].frameBase + 20)
|
if (item->frameNumber == g_Level.Anims[item->animNumber].frameBase + 20)
|
||||||
{
|
{
|
||||||
|
@ -474,7 +486,9 @@ void SasControl(short itemNumber)
|
||||||
angle1 += (GetRandomControl() & 0x1FF) - 256;
|
angle1 += (GetRandomControl() & 0x1FF) - 256;
|
||||||
joint0 = angle1;
|
joint0 = angle1;
|
||||||
}
|
}
|
||||||
//ShotGreanade((int)item, v28, v27);
|
|
||||||
|
SasFireGrenade(item, angle2, angle1);
|
||||||
|
|
||||||
if (Targetable(item, &info))
|
if (Targetable(item, &info))
|
||||||
item->goalAnimState = STATE_SAS_HOLD_PREPARE_GRENADE;
|
item->goalAnimState = STATE_SAS_HOLD_PREPARE_GRENADE;
|
||||||
}
|
}
|
||||||
|
@ -484,9 +498,13 @@ void SasControl(short itemNumber)
|
||||||
case STATE_SAS_KNEEL_SHOOT:
|
case STATE_SAS_KNEEL_SHOOT:
|
||||||
case STATE_SAS_SIGHT_SHOOT:
|
case STATE_SAS_SIGHT_SHOOT:
|
||||||
case STATE_SAS_WALK_SHOOT:
|
case STATE_SAS_WALK_SHOOT:
|
||||||
if (item->currentAnimState == STATE_SAS_HOLD_SHOOT || item->currentAnimState == STATE_SAS_KNEEL_SHOOT)
|
if (item->currentAnimState == STATE_SAS_HOLD_SHOOT
|
||||||
|
|| item->currentAnimState == STATE_SAS_KNEEL_SHOOT)
|
||||||
{
|
{
|
||||||
if (item->goalAnimState != STATE_SAS_STOP && item->goalAnimState != STATE_SAS_KNEEL_STOP && (creature->mood == ESCAPE_MOOD || !Targetable(item, &info)))
|
if (item->goalAnimState != STATE_SAS_STOP
|
||||||
|
&& item->goalAnimState != STATE_SAS_KNEEL_STOP
|
||||||
|
&& (creature->mood == ESCAPE_MOOD
|
||||||
|
|| !Targetable(item, &info)))
|
||||||
{
|
{
|
||||||
if(item->currentAnimState == STATE_SAS_HOLD_SHOOT)
|
if(item->currentAnimState == STATE_SAS_HOLD_SHOOT)
|
||||||
item->goalAnimState = STATE_SAS_STOP;
|
item->goalAnimState = STATE_SAS_STOP;
|
||||||
|
@ -520,7 +538,8 @@ void SasControl(short itemNumber)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (WeaponEnemyTimer > 100 && item->currentAnimState != STATE_SAS_BLIND)
|
if (WeaponEnemyTimer > 100
|
||||||
|
&& item->currentAnimState != STATE_SAS_BLIND)
|
||||||
{
|
{
|
||||||
creature->maximumTurn = 0;
|
creature->maximumTurn = 0;
|
||||||
item->animNumber = Objects[item->objectNumber].animIndex + ANIMATION_SAS_BLIND;
|
item->animNumber = Objects[item->objectNumber].animIndex + ANIMATION_SAS_BLIND;
|
||||||
|
@ -529,11 +548,14 @@ void SasControl(short itemNumber)
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
else if (item->currentAnimState != STATE_SAS_DEATH)
|
else
|
||||||
{
|
{
|
||||||
item->animNumber = Objects[item->objectNumber].animIndex + ANIMATION_SAS_DEATH;
|
if (item->currentAnimState != STATE_SAS_DEATH)
|
||||||
item->frameNumber = g_Level.Anims[item->animNumber].frameBase;
|
{
|
||||||
item->currentAnimState = STATE_SAS_DEATH;
|
item->animNumber = Objects[item->objectNumber].animIndex + ANIMATION_SAS_DEATH;
|
||||||
|
item->frameNumber = g_Level.Anims[item->animNumber].frameBase;
|
||||||
|
item->currentAnimState = STATE_SAS_DEATH;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
CreatureTilt(item, tilt);
|
CreatureTilt(item, tilt);
|
||||||
|
@ -544,6 +566,74 @@ void SasControl(short itemNumber)
|
||||||
CreatureAnimation(itemNumber, angle, 0);
|
CreatureAnimation(itemNumber, angle, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void SasFireGrenade(ITEM_INFO* item, short angle1, short angle2)
|
||||||
|
{
|
||||||
|
short itemNumber = CreateItem();
|
||||||
|
if (itemNumber != NO_ITEM)
|
||||||
|
{
|
||||||
|
ITEM_INFO* grenadeItem = &g_Level.Items[itemNumber];
|
||||||
|
|
||||||
|
grenadeItem->shade = -15856;
|
||||||
|
grenadeItem->objectNumber = ID_GRENADE;
|
||||||
|
grenadeItem->roomNumber = item->roomNumber;
|
||||||
|
|
||||||
|
PHD_VECTOR pos;
|
||||||
|
pos.x = sasGun.x;
|
||||||
|
pos.y = sasGun.y;
|
||||||
|
pos.z = sasGun.z;
|
||||||
|
|
||||||
|
GetJointAbsPosition(item, &pos, sasGun.meshNum);
|
||||||
|
|
||||||
|
grenadeItem->pos.xPos = pos.x;
|
||||||
|
grenadeItem->pos.yPos = pos.y;
|
||||||
|
grenadeItem->pos.zPos = pos.z;
|
||||||
|
|
||||||
|
FLOOR_INFO* floor = GetFloor(pos.x, pos.y, pos.z, &grenadeItem->roomNumber);
|
||||||
|
int height = GetFloorHeight(floor, pos.x, pos.y, pos.z);
|
||||||
|
|
||||||
|
if (height < grenadeItem->pos.yPos)
|
||||||
|
{
|
||||||
|
grenadeItem->pos.xPos = item->pos.xPos;
|
||||||
|
grenadeItem->pos.yPos = height;
|
||||||
|
grenadeItem->pos.zPos = item->pos.zPos;
|
||||||
|
grenadeItem->roomNumber = item->roomNumber;
|
||||||
|
}
|
||||||
|
|
||||||
|
SmokeCountL = 32;
|
||||||
|
SmokeWeapon = 5;
|
||||||
|
|
||||||
|
for (int i=0;i<5;i++)
|
||||||
|
{
|
||||||
|
TriggerGunSmoke(pos.x, pos.y, pos.z, 0, 0, 0, 1, 5, 32);
|
||||||
|
}
|
||||||
|
|
||||||
|
InitialiseItem(itemNumber);
|
||||||
|
|
||||||
|
grenadeItem->pos.xRot = angle1 + item->pos.xRot;
|
||||||
|
grenadeItem->pos.yRot = angle2 + item->pos.yRot;
|
||||||
|
grenadeItem->pos.zRot = 0;
|
||||||
|
|
||||||
|
if (GetRandomControl() & 3)
|
||||||
|
{
|
||||||
|
grenadeItem->itemFlags[0] = 1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
grenadeItem->itemFlags[0] = 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
grenadeItem->itemFlags[2] = 1;
|
||||||
|
grenadeItem->speed = 128;
|
||||||
|
grenadeItem->currentAnimState = grenadeItem->pos.xRot;
|
||||||
|
grenadeItem->fallspeed = -128 * phd_sin(grenadeItem->pos.xRot);
|
||||||
|
grenadeItem->goalAnimState = grenadeItem->pos.yRot;
|
||||||
|
grenadeItem->requiredAnimState = 0;
|
||||||
|
grenadeItem->hitPoints = 120;
|
||||||
|
|
||||||
|
AddActiveItem(itemNumber);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void InitialiseSasDying(short itemNumber)
|
void InitialiseSasDying(short itemNumber)
|
||||||
{
|
{
|
||||||
ITEM_INFO* item = &g_Level.Items[itemNumber];
|
ITEM_INFO* item = &g_Level.Items[itemNumber];
|
||||||
|
|
|
@ -5,4 +5,5 @@ void InitialiseSas(short itemNumber);
|
||||||
void SasControl(short itemNumber);
|
void SasControl(short itemNumber);
|
||||||
void InitialiseSasDying(short itemNumber);
|
void InitialiseSasDying(short itemNumber);
|
||||||
void SasDyingControl(short itemNumber);
|
void SasDyingControl(short itemNumber);
|
||||||
void SasDragBlokeCollision(short itemNumber, ITEM_INFO* l, COLL_INFO* c);
|
void SasDragBlokeCollision(short itemNumber, ITEM_INFO* l, COLL_INFO* c);
|
||||||
|
void SasFireGrenade(ITEM_INFO* item, short angle1, short angle2);
|
Loading…
Add table
Add a link
Reference in a new issue