2020-05-30 15:55:23 +02:00
|
|
|
#include "framework.h"
|
|
|
|
#include "tr4_scales.h"
|
|
|
|
#include "level.h"
|
|
|
|
#include "control.h"
|
|
|
|
#include "setup.h"
|
|
|
|
#include "items.h"
|
|
|
|
#include "lara.h"
|
|
|
|
#include "switch.h"
|
2021-09-08 18:19:06 +03:00
|
|
|
#include "Sound\sound.h"
|
2020-05-30 15:55:23 +02:00
|
|
|
#include "draw.h"
|
2021-09-08 18:07:48 +03:00
|
|
|
#include "effects\tomb4fx.h"
|
2020-05-30 15:55:23 +02:00
|
|
|
#include "tr4_ahmet.h"
|
2021-08-28 06:37:22 +02:00
|
|
|
#include "generic_switch.h"
|
|
|
|
|
|
|
|
using namespace TEN::Entities::Switches;
|
2021-08-29 08:10:29 +02:00
|
|
|
using namespace TEN::Entities::TR4;
|
2020-05-30 15:55:23 +02:00
|
|
|
|
2020-07-25 18:02:35 +02:00
|
|
|
OBJECT_COLLISION_BOUNDS ScalesBounds =
|
2020-05-30 15:55:23 +02:00
|
|
|
{
|
|
|
|
0xFA80, 0xFA80, 0x0000, 0x0000, 0xFE00, 0x0200,
|
|
|
|
0xF8E4, 0x071C, 0xEAAC, 0x1554, 0xF8E4, 0x071C
|
|
|
|
};
|
|
|
|
|
|
|
|
void ScalesControl(short itemNum)
|
|
|
|
{
|
2020-07-21 09:56:47 +02:00
|
|
|
ITEM_INFO* item = &g_Level.Items[itemNum];
|
2020-05-30 15:55:23 +02:00
|
|
|
|
2020-07-21 09:56:47 +02:00
|
|
|
if (item->frameNumber != g_Level.Anims[item->animNumber].frameEnd)
|
2020-05-30 15:55:23 +02:00
|
|
|
{
|
|
|
|
AnimateItem(item);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (item->currentAnimState == 1 || item->itemFlags[1])
|
|
|
|
{
|
|
|
|
if (Objects[item->objectNumber].animIndex)
|
|
|
|
{
|
|
|
|
RemoveActiveItem(itemNum);
|
|
|
|
item->status = ITEM_NOT_ACTIVE;
|
|
|
|
item->itemFlags[1] = 0;
|
|
|
|
|
|
|
|
AnimateItem(item);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2021-09-05 11:18:37 +02:00
|
|
|
if (RespawnAhmet(Lara.interactedItem))
|
2020-05-30 15:55:23 +02:00
|
|
|
{
|
|
|
|
short itemNos[8];
|
|
|
|
int sw = GetSwitchTrigger(item, itemNos, 0);
|
|
|
|
|
|
|
|
if (sw > 0)
|
|
|
|
{
|
2020-07-21 09:56:47 +02:00
|
|
|
while (g_Level.Items[itemNos[sw]].objectNumber == ID_FLAME_EMITTER2)
|
2020-05-30 15:55:23 +02:00
|
|
|
{
|
|
|
|
if (--sw <= 0)
|
|
|
|
break;
|
|
|
|
}
|
2020-07-21 09:56:47 +02:00
|
|
|
g_Level.Items[itemNos[sw]].flags = 1024;
|
2020-05-30 15:55:23 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
item->goalAnimState = 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
AnimateItem(item);
|
|
|
|
}
|
|
|
|
|
|
|
|
int flags = 0;
|
|
|
|
|
|
|
|
if (item->currentAnimState == 2)
|
|
|
|
{
|
|
|
|
flags = -512;
|
|
|
|
RemoveActiveItem(itemNum);
|
|
|
|
item->status = ITEM_NOT_ACTIVE;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
flags = -1024;
|
|
|
|
item->itemFlags[1] = 1;
|
|
|
|
}
|
|
|
|
|
2021-08-26 12:12:05 +03:00
|
|
|
TestTriggers(item, true, flags);
|
2020-05-30 15:55:23 +02:00
|
|
|
AnimateItem(item);
|
|
|
|
}
|
|
|
|
|
|
|
|
void ScalesCollision(short itemNum, ITEM_INFO* l, COLL_INFO* coll)
|
|
|
|
{
|
2020-07-21 09:56:47 +02:00
|
|
|
ITEM_INFO* item = &g_Level.Items[itemNum];
|
2020-05-30 15:55:23 +02:00
|
|
|
|
|
|
|
if (TestBoundsCollide(item, l, LARA_RAD))
|
|
|
|
{
|
2020-08-04 20:32:07 +10:00
|
|
|
if (l->animNumber != LA_WATERSKIN_POUR_LOW && l->animNumber != LA_WATERSKIN_POUR_HIGH || item->currentAnimState != 1)
|
2020-05-30 15:55:23 +02:00
|
|
|
{
|
|
|
|
GlobalCollisionBounds.X1 = 640;
|
|
|
|
GlobalCollisionBounds.X2 = 1280;
|
|
|
|
GlobalCollisionBounds.Y1 = -1280;
|
|
|
|
GlobalCollisionBounds.Y2 = 0;
|
|
|
|
GlobalCollisionBounds.Z1 = -256;
|
|
|
|
GlobalCollisionBounds.Z2 = 384;
|
|
|
|
|
2021-09-02 11:32:08 +03:00
|
|
|
ItemPushItem(item, l, coll, 0, 2);
|
2020-05-30 15:55:23 +02:00
|
|
|
|
|
|
|
GlobalCollisionBounds.X1 = -256;
|
|
|
|
GlobalCollisionBounds.X2 = 256;
|
|
|
|
|
2021-09-02 11:32:08 +03:00
|
|
|
ItemPushItem(item, l, coll, 0, 2);
|
2020-05-30 15:55:23 +02:00
|
|
|
|
|
|
|
GlobalCollisionBounds.X1 = -1280;
|
|
|
|
GlobalCollisionBounds.X2 = -640;
|
|
|
|
|
2021-09-02 11:32:08 +03:00
|
|
|
ItemPushItem(item, l, coll, 0, 2);
|
2020-05-30 15:55:23 +02:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
short rotY = item->pos.yRot;
|
|
|
|
item->pos.yRot = (short)(l->pos.yRot + ANGLE(45)) & 0xC000;
|
|
|
|
|
2020-07-25 18:02:35 +02:00
|
|
|
ScalesBounds.boundingBox.X1 = -1408;
|
|
|
|
ScalesBounds.boundingBox.X2 = -640;
|
|
|
|
ScalesBounds.boundingBox.Z1 = -512;
|
|
|
|
ScalesBounds.boundingBox.Z2 = 0;
|
2020-05-30 15:55:23 +02:00
|
|
|
|
2020-07-25 18:02:35 +02:00
|
|
|
if (TestLaraPosition(&ScalesBounds, item, l))
|
2020-05-30 15:55:23 +02:00
|
|
|
{
|
2020-08-04 20:32:07 +10:00
|
|
|
l->animNumber = LA_WATERSKIN_POUR_HIGH;
|
2020-07-21 09:56:47 +02:00
|
|
|
l->frameNumber = g_Level.Anims[item->animNumber].frameBase;
|
2020-05-30 15:55:23 +02:00
|
|
|
item->pos.yRot = rotY;
|
|
|
|
}
|
2020-08-04 20:32:07 +10:00
|
|
|
else if (l->frameNumber == g_Level.Anims[LA_WATERSKIN_POUR_HIGH].frameBase + 51)
|
2020-05-30 15:55:23 +02:00
|
|
|
{
|
|
|
|
SoundEffect(SFX_TR4_POUR, &l->pos, 0);
|
|
|
|
item->pos.yRot = rotY;
|
|
|
|
}
|
2020-08-04 20:32:07 +10:00
|
|
|
else if (l->frameNumber == g_Level.Anims[LA_WATERSKIN_POUR_HIGH].frameBase + 74)
|
2020-05-30 15:55:23 +02:00
|
|
|
{
|
|
|
|
AddActiveItem(itemNum);
|
|
|
|
item->status = ITEM_ACTIVE;
|
|
|
|
|
|
|
|
if (l->itemFlags[3] < item->triggerFlags)
|
|
|
|
{
|
|
|
|
item->goalAnimState = 4;
|
|
|
|
item->pos.yRot = rotY;
|
|
|
|
}
|
|
|
|
else if (l->itemFlags[3] == item->triggerFlags)
|
|
|
|
{
|
|
|
|
item->goalAnimState = 2;
|
|
|
|
item->pos.yRot = rotY;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
item->goalAnimState = 3;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
item->pos.yRot = rotY;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-08-04 20:32:07 +10:00
|
|
|
if (l->frameNumber >= g_Level.Anims[LA_WATERSKIN_POUR_LOW].frameBase + 44 &&
|
|
|
|
l->frameNumber <= g_Level.Anims[LA_WATERSKIN_POUR_LOW].frameBase + 72 ||
|
|
|
|
l->frameNumber >= g_Level.Anims[LA_WATERSKIN_POUR_HIGH].frameBase + 51 &&
|
|
|
|
l->frameNumber <= g_Level.Anims[LA_WATERSKIN_POUR_HIGH].frameBase + 74)
|
2020-05-30 15:55:23 +02:00
|
|
|
{
|
|
|
|
PHD_VECTOR pos;
|
|
|
|
pos.x = 0;
|
|
|
|
pos.y = 0;
|
|
|
|
pos.z = 0;
|
|
|
|
|
|
|
|
GetLaraJointPosition(&pos, LM_LHAND);
|
|
|
|
|
|
|
|
DRIP_STRUCT* drip = &Drips[GetFreeDrip()];
|
|
|
|
drip->x = pos.x;
|
|
|
|
drip->y = pos.y;
|
|
|
|
drip->z = pos.z;
|
|
|
|
drip->on = 1;
|
|
|
|
drip->r = (GetRandomControl() & 0xF) + 24;
|
|
|
|
drip->g = (GetRandomControl() & 0xF) + 44;
|
|
|
|
drip->b = (GetRandomControl() & 0xF) + 56;
|
|
|
|
drip->yVel = (GetRandomControl() & 0x1F) + 32;
|
|
|
|
drip->gravity = (GetRandomControl() & 0x1F) + 32;
|
|
|
|
drip->life = (GetRandomControl() & 0x1F) + 16;
|
|
|
|
drip->roomNumber = l->roomNumber;
|
|
|
|
}
|
|
|
|
}
|