TombEngine/TR5Main/Objects/TR2/tr2_silencer.cpp

231 lines
4.6 KiB
C++
Raw Normal View History

#include "../newobjects.h"
#include "../../Game/Box.h"
#include "../../Game/people.h"
BITE_INFO silencerGun = { 3, 331, 56, 10 };
void SilencerControl(short itemNum)
{
if (!CreatureActive(itemNum))
return;
ITEM_INFO* item = &Items[itemNum];
CREATURE_INFO* silencer = (CREATURE_INFO*)item->data;
AI_INFO info;
short angle = 0, torso_y = 0, torso_x = 0, head_y = 0, tilt = 0;
if (item->hitPoints <= 0)
{
if (item->currentAnimState != 12 && item->currentAnimState != 13)
{
item->animNumber = Objects[item->objectNumber].animIndex + 20; // die 21 is for heavy weapon.
item->frameNumber = Anims[item->animNumber].frameBase;
item->currentAnimState = 13;
}
}
else
{
CreatureAIInfo(item, &info);
GetCreatureMood(item, &info, VIOLENT);
CreatureMood(item, &info, VIOLENT);
angle = CreatureTurn(item, silencer->maximumTurn);
switch (item->currentAnimState)
{
case 3:
if (info.ahead)
head_y = info.angle;
silencer->maximumTurn = 0;
if (item->requiredAnimState)
item->goalAnimState = item->requiredAnimState;
break;
case 4:
if (info.ahead)
head_y = info.angle;
silencer->maximumTurn = 0;
if (silencer->mood == ESCAPE_MOOD)
{
item->requiredAnimState = 2;
item->goalAnimState = 3;
}
else
{
if (Targetable(item, &info))
{
item->requiredAnimState = (GetRandomControl() >= 0x4000 ? 10 : 6);
item->goalAnimState = 3;
}
if (silencer->mood == ATTACK_MOOD || !info.ahead)
{
if (info.distance >= 0x400000)
{
item->requiredAnimState = 2;
item->goalAnimState = 3;
}
else
{
item->requiredAnimState = 1;
item->goalAnimState = 3;
}
}
else
{
if (GetRandomControl() >= 1280)
{
if (GetRandomControl() < 2560)
{
item->requiredAnimState = 1;
item->goalAnimState = 3;
}
}
else
{
item->requiredAnimState = 5;
item->goalAnimState = 3;
}
}
}
break;
case 1:
if (info.ahead)
head_y = info.angle;
silencer->maximumTurn = 910;
if (silencer->mood == ESCAPE_MOOD)
{
item->goalAnimState = 2;
}
else if (Targetable(item, &info))
{
item->requiredAnimState = (GetRandomControl() >= 0x4000 ? 10 : 6);
item->goalAnimState = 3;
}
else
{
if (info.distance > 0x400000 || !info.ahead)
item->goalAnimState = 2;
if (silencer->mood == BORED_MOOD && GetRandomControl() < 0x300)
item->goalAnimState = 3;
}
break;
case 2:
if (info.ahead)
head_y = info.angle;
silencer->maximumTurn = 910;
silencer->flags = 0;
tilt = (angle / 4);
if (silencer->mood == ESCAPE_MOOD)
{
if (Targetable(item, &info))
item->goalAnimState = 9;
break;
}
if (Targetable(item, &info))
{
if (info.distance >= 0x400000 && info.zoneNumber == info.enemyZone)
item->goalAnimState = 9;
break;
}
else if (silencer->mood == ATTACK_MOOD)
item->goalAnimState = (GetRandomControl() >= 0x4000) ? 3 : 2;
else
item->goalAnimState = 3;
break;
case 5:
if (info.ahead)
head_y = info.angle;
silencer->maximumTurn = 0;
if (Targetable(item, &info))
{
item->requiredAnimState = 6;
item->goalAnimState = 3;
}
else
{
if (silencer->mood == ATTACK_MOOD || GetRandomControl() < 0x100)
item->goalAnimState = 3;
if (!info.ahead)
item->goalAnimState = 3;
}
break;
case 6:
case 10:
silencer->maximumTurn = 0;
silencer->flags = 0;
if (info.ahead)
{
torso_y = info.angle;
torso_x = info.xAngle;
}
else
{
head_y = info.angle;
}
if (silencer->mood == ESCAPE_MOOD)
item->goalAnimState = 3;
else if (Targetable(item, &info))
item->goalAnimState = item->currentAnimState != 6 ? 11 : 7;
else
item->goalAnimState = 3;
break;
case 7:
case 11:
silencer->maximumTurn = 0;
if (info.ahead)
{
torso_y = info.angle;
torso_x = info.xAngle;
}
else
{
head_y = info.angle;
}
if (!silencer->flags)
{
ShotLara(item, &info, &silencerGun, torso_y, 50);
silencer->flags = 1;
}
break;
case 9:
silencer->maximumTurn = 910;
if (info.ahead)
{
torso_y = info.angle;
torso_x = info.xAngle;
}
else
{
head_y = info.angle;
}
if (!item->requiredAnimState)
{
if (!ShotLara(item, &info, &silencerGun, torso_y, 50))
item->goalAnimState = 2;
item->requiredAnimState = 9;
}
break;
}
}
CreatureTilt(item, tilt);
CreatureJoint(item, 0, torso_y);
CreatureJoint(item, 1, torso_x);
CreatureJoint(item, 2, head_y);
CreatureAnimation(itemNum, angle, tilt);
}