mirror of
https://github.com/TombEngine/TombEngine.git
synced 2025-04-30 16:57:57 +03:00

- Lara Evil (Atlantis Version) - Natla and Evil Natla. - Larson and Pierre (TR1) - Raptor (TR1)
150 lines
No EOL
3.7 KiB
C++
150 lines
No EOL
3.7 KiB
C++
#include "../newobjects.h"
|
|
#include "../../Game/Box.h"
|
|
#include "../../Game/people.h"
|
|
|
|
enum LARSON_STATE {
|
|
PEOPLE_EMPTY, PEOPLE_STOP, PEOPLE_WALK, PEOPLE_RUN, PEOPLE_AIM,
|
|
PEOPLE_DEATH, PEOPLE_POSE, PEOPLE_SHOOT
|
|
};
|
|
|
|
#define PEOPLE_WALK_TURN ANGLE(3)
|
|
#define PEOPLE_RUN_TURN ANGLE(6)
|
|
#define PEOPLE_POSE_CHANCE 0x60
|
|
#define PEOPLE_WALK_RANGE SQUARE(WALL_SIZE*3)
|
|
#define PEOPLE_SHOT_DAMAGE 50
|
|
#define LARSON_DIE_ANIM 15
|
|
|
|
BITE_INFO larson_gun = { -60, 170, 0, 14 };
|
|
|
|
void Tr1LarsonControl(short itemNum)
|
|
{
|
|
if (!CreatureActive(itemNum))
|
|
return;
|
|
|
|
ITEM_INFO* item;
|
|
CREATURE_INFO* people;
|
|
AI_INFO info;
|
|
short angle, head, tilt;
|
|
|
|
item = &Items[itemNum];
|
|
people = (CREATURE_INFO*)item->data;
|
|
head = angle = tilt = 0;
|
|
|
|
/* Has person been killed? */
|
|
if (item->hitPoints <= 0)
|
|
{
|
|
if (item->currentAnimState != PEOPLE_DEATH)
|
|
{
|
|
item->animNumber = Objects[item->objectNumber].animIndex + LARSON_DIE_ANIM;
|
|
item->frameNumber = Anims[item->animNumber].frameBase;
|
|
item->currentAnimState = PEOPLE_DEATH;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
CreatureAIInfo(item, &info);
|
|
|
|
if (info.ahead)
|
|
head = info.angle;
|
|
|
|
GetCreatureMood(item, &info, TIMID);
|
|
CreatureMood(item, &info, TIMID);
|
|
|
|
angle = CreatureTurn(item, people->maximumTurn);
|
|
|
|
switch (item->currentAnimState)
|
|
{
|
|
case PEOPLE_STOP:
|
|
if (item->requiredAnimState)
|
|
item->goalAnimState = item->requiredAnimState;
|
|
else if (people->mood == BORED_MOOD)
|
|
item->goalAnimState = (GetRandomControl() < PEOPLE_POSE_CHANCE) ? PEOPLE_POSE : PEOPLE_WALK;
|
|
else if (people->mood == ESCAPE_MOOD)
|
|
item->goalAnimState = PEOPLE_RUN;
|
|
else
|
|
item->goalAnimState = PEOPLE_WALK;
|
|
break;
|
|
|
|
case PEOPLE_POSE:
|
|
if (people->mood != BORED_MOOD)
|
|
item->goalAnimState = PEOPLE_STOP;
|
|
else if (GetRandomControl() < PEOPLE_POSE_CHANCE)
|
|
{
|
|
item->requiredAnimState = PEOPLE_WALK;
|
|
item->goalAnimState = PEOPLE_STOP;
|
|
}
|
|
break;
|
|
|
|
case PEOPLE_WALK:
|
|
people->maximumTurn = PEOPLE_WALK_TURN;
|
|
|
|
if (people->mood == BORED_MOOD && GetRandomControl() < PEOPLE_POSE_CHANCE)
|
|
{
|
|
item->requiredAnimState = PEOPLE_POSE;
|
|
item->goalAnimState = PEOPLE_STOP;
|
|
}
|
|
else if (people->mood == ESCAPE_MOOD)
|
|
{
|
|
item->requiredAnimState = PEOPLE_RUN;
|
|
item->goalAnimState = PEOPLE_STOP;
|
|
}
|
|
else if (Targetable(item, &info))
|
|
{
|
|
item->requiredAnimState = PEOPLE_AIM;
|
|
item->goalAnimState = PEOPLE_STOP;
|
|
}
|
|
else if (!info.ahead || info.distance > PEOPLE_WALK_RANGE)
|
|
{
|
|
item->requiredAnimState = PEOPLE_RUN;
|
|
item->goalAnimState = PEOPLE_STOP;
|
|
}
|
|
break;
|
|
|
|
case PEOPLE_RUN:
|
|
people->maximumTurn = PEOPLE_RUN_TURN;
|
|
tilt = angle / 2;
|
|
|
|
if (people->mood == BORED_MOOD && GetRandomControl() < PEOPLE_POSE_CHANCE)
|
|
{
|
|
item->requiredAnimState = PEOPLE_POSE;
|
|
item->goalAnimState = PEOPLE_STOP;
|
|
}
|
|
else if (Targetable(item, &info))
|
|
{
|
|
item->requiredAnimState = PEOPLE_AIM;
|
|
item->goalAnimState = PEOPLE_STOP;
|
|
}
|
|
else if (info.ahead && info.distance < PEOPLE_WALK_RANGE)
|
|
{
|
|
item->requiredAnimState = PEOPLE_WALK;
|
|
item->goalAnimState = PEOPLE_STOP;
|
|
}
|
|
break;
|
|
|
|
case PEOPLE_AIM:
|
|
if (item->requiredAnimState)
|
|
item->goalAnimState = item->requiredAnimState;
|
|
else if (Targetable(item, &info))
|
|
item->goalAnimState = PEOPLE_SHOOT;
|
|
else
|
|
item->goalAnimState = PEOPLE_STOP;
|
|
break;
|
|
|
|
case PEOPLE_SHOOT:
|
|
/* Required state is set after this so only one shot is fired */
|
|
if (!item->requiredAnimState)
|
|
{
|
|
ShotLara(item, &info, &larson_gun, head, PEOPLE_SHOT_DAMAGE);
|
|
item->requiredAnimState = PEOPLE_AIM;
|
|
}
|
|
|
|
if (people->mood == ESCAPE_MOOD)
|
|
item->requiredAnimState = PEOPLE_STOP;
|
|
break;
|
|
}
|
|
}
|
|
|
|
CreatureTilt(item, tilt);
|
|
CreatureJoint(item, 0, head);
|
|
CreatureAnimation(itemNum, angle, tilt);
|
|
} |