2021-08-28 06:37:22 +02:00
|
|
|
#include "framework.h"
|
|
|
|
#include "turn_switch.h"
|
2021-09-19 23:41:26 +03:00
|
|
|
#include "control/control.h"
|
2021-08-28 06:37:22 +02:00
|
|
|
#include "input.h"
|
|
|
|
#include "lara.h"
|
|
|
|
#include "sound.h"
|
2021-08-28 13:27:58 +02:00
|
|
|
#include "setup.h"
|
|
|
|
#include "camera.h"
|
2021-08-31 17:37:15 +02:00
|
|
|
#include "level.h"
|
2021-09-11 05:38:26 +02:00
|
|
|
#include "collide.h"
|
2021-09-16 05:06:03 +03:00
|
|
|
#include "animation.h"
|
2021-09-24 07:53:42 +02:00
|
|
|
#include "item.h"
|
2021-08-28 06:37:22 +02:00
|
|
|
|
|
|
|
namespace TEN::Entities::Switches
|
|
|
|
{
|
|
|
|
enum TurnSwitchDirection
|
|
|
|
{
|
|
|
|
TURN_SWITCH_STOP,
|
|
|
|
TURN_SWITCH_ANTICLOCKWISE,
|
|
|
|
TURN_SWITCH_CLOCKWISE
|
|
|
|
};
|
|
|
|
|
|
|
|
OBJECT_COLLISION_BOUNDS TurnSwitchBoundsA =
|
|
|
|
{
|
|
|
|
512, 896,
|
|
|
|
0, 0,
|
|
|
|
-512, 0,
|
|
|
|
-ANGLE(10), ANGLE(10),
|
|
|
|
-ANGLE(30), ANGLE(30),
|
|
|
|
-ANGLE(10), ANGLE(10)
|
|
|
|
};
|
|
|
|
|
|
|
|
PHD_VECTOR TurnSwitchPos = { 650, 0, 138 };
|
|
|
|
|
|
|
|
OBJECT_COLLISION_BOUNDS TurnSwitchBoundsC =
|
|
|
|
{
|
|
|
|
512, 896,
|
|
|
|
0, 0,
|
|
|
|
0, 512,
|
|
|
|
-ANGLE(10), ANGLE(10),
|
|
|
|
-ANGLE(30), ANGLE(30),
|
|
|
|
-ANGLE(10), ANGLE(10)
|
|
|
|
};
|
|
|
|
|
|
|
|
PHD_VECTOR TurnSwitchPosA = { 650, 0, -138 };
|
|
|
|
|
|
|
|
void TurnSwitchCollision(short itemNum, ITEM_INFO* l, COLL_INFO* coll)
|
|
|
|
{
|
|
|
|
ITEM_INFO* item = &g_Level.Items[itemNum];
|
2021-09-09 05:29:59 +02:00
|
|
|
int doSwitch = 0;
|
2021-08-28 06:37:22 +02:00
|
|
|
|
2021-09-09 05:29:59 +02:00
|
|
|
if (item->currentAnimState == TURN_SWITCH_STOP
|
2021-08-28 06:37:22 +02:00
|
|
|
&& TrInput & IN_ACTION
|
|
|
|
&& l->currentAnimState == LS_STOP
|
|
|
|
&& l->animNumber == LA_STAND_IDLE
|
2021-09-09 05:29:59 +02:00
|
|
|
&& l->gravityStatus == false
|
2021-08-28 06:37:22 +02:00
|
|
|
&& Lara.gunStatus == LG_NO_ARMS
|
2021-09-05 11:18:37 +02:00
|
|
|
|| Lara.isMoving && Lara.interactedItem == itemNum)
|
2021-08-28 06:37:22 +02:00
|
|
|
{
|
|
|
|
if (TestLaraPosition(&TurnSwitchBoundsA, item, l))
|
|
|
|
{
|
|
|
|
if (MoveLaraPosition(&TurnSwitchPosA, item, l))
|
|
|
|
{
|
|
|
|
l->animNumber = LA_TURNSWITCH_GRAB_COUNTER_CLOCKWISE;
|
|
|
|
l->frameNumber = g_Level.Anims[LA_TURNSWITCH_GRAB_COUNTER_CLOCKWISE].frameBase;
|
|
|
|
item->animNumber = Objects[item->objectNumber].animIndex + 4;
|
|
|
|
item->frameNumber = g_Level.Anims[item->animNumber].frameBase;
|
2021-09-09 05:29:59 +02:00
|
|
|
item->itemFlags[0] = TURN_SWITCH_ANTICLOCKWISE;
|
2021-08-28 06:37:22 +02:00
|
|
|
ForcedFixedCamera.x = item->pos.xPos - 1024 * phd_sin(item->pos.yRot);
|
|
|
|
ForcedFixedCamera.z = item->pos.zPos - 1024 * phd_cos(item->pos.yRot);
|
|
|
|
|
2021-09-09 05:29:59 +02:00
|
|
|
doSwitch = -1;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2021-09-11 05:38:26 +02:00
|
|
|
Lara.interactedItem = itemNum;
|
2021-08-28 06:37:22 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
l->pos.yRot ^= (short)ANGLE(180);
|
|
|
|
if (TestLaraPosition(&TurnSwitchBoundsC, item, l))
|
|
|
|
{
|
|
|
|
if (MoveLaraPosition(&TurnSwitchPos, item, l))
|
|
|
|
{
|
2021-09-09 05:29:59 +02:00
|
|
|
l->animNumber = LA_TURNSWITCH_GRAB_CLOCKWISE;
|
|
|
|
l->frameNumber = g_Level.Anims[l->animNumber].frameBase;
|
|
|
|
item->itemFlags[0] = TURN_SWITCH_CLOCKWISE;
|
2021-08-28 06:37:22 +02:00
|
|
|
ForcedFixedCamera.x = item->pos.xPos + 1024 * phd_sin(item->pos.yRot);
|
|
|
|
ForcedFixedCamera.z = item->pos.zPos + 1024 * phd_cos(item->pos.yRot);
|
2021-09-09 05:29:59 +02:00
|
|
|
doSwitch = 1;
|
2021-08-28 06:37:22 +02:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2021-09-05 11:18:37 +02:00
|
|
|
Lara.interactedItem = itemNum;
|
2021-08-28 06:37:22 +02:00
|
|
|
}
|
|
|
|
}
|
2021-09-05 11:18:37 +02:00
|
|
|
else if (Lara.isMoving && Lara.interactedItem == itemNum)
|
2021-08-28 06:37:22 +02:00
|
|
|
{
|
|
|
|
Lara.isMoving = false;
|
|
|
|
Lara.gunStatus = LG_NO_ARMS;
|
|
|
|
}
|
|
|
|
l->pos.yRot ^= (short)ANGLE(180);
|
2021-09-09 05:29:59 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (doSwitch)
|
|
|
|
{
|
|
|
|
short ItemNos[8];
|
|
|
|
|
|
|
|
Lara.isMoving = false;
|
|
|
|
Lara.headYrot = 0;
|
|
|
|
Lara.headXrot = 0;
|
|
|
|
Lara.torsoYrot = 0;
|
|
|
|
Lara.torsoXrot = 0;
|
|
|
|
Lara.gunStatus = LG_HANDS_BUSY;
|
|
|
|
l->currentAnimState = LA_REACH;
|
|
|
|
|
|
|
|
UseForcedFixedCamera = true;
|
|
|
|
ForcedFixedCamera.y = item->pos.yPos - 2048;
|
|
|
|
ForcedFixedCamera.roomNumber = item->roomNumber;
|
|
|
|
|
|
|
|
AddActiveItem(itemNum);
|
|
|
|
|
|
|
|
item->status = ITEM_ACTIVE;
|
|
|
|
item->itemFlags[1] = 0;
|
|
|
|
|
|
|
|
if (GetSwitchTrigger(item, ItemNos, 0))
|
|
|
|
{
|
|
|
|
if (!TriggerActive(&g_Level.Items[ItemNos[0]]))
|
2021-08-28 06:37:22 +02:00
|
|
|
{
|
2021-09-09 05:29:59 +02:00
|
|
|
g_Level.Items[ItemNos[0]].animNumber = Objects[g_Level.Items[ItemNos[0]].objectNumber].animIndex;
|
|
|
|
g_Level.Items[ItemNos[0]].frameNumber = g_Level.Anims[g_Level.Items[ItemNos[0]].animNumber].frameBase;
|
2021-08-28 06:37:22 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2021-09-09 05:29:59 +02:00
|
|
|
else
|
2021-08-28 06:37:22 +02:00
|
|
|
{
|
2021-09-13 09:50:25 +03:00
|
|
|
if (coll->Setup.EnableObjectPush && TestBoundsCollide(item, l, coll->Setup.Radius))
|
2021-09-09 05:29:59 +02:00
|
|
|
{
|
|
|
|
GlobalCollisionBounds.X1 = -512;
|
|
|
|
GlobalCollisionBounds.X2 = 512;
|
|
|
|
GlobalCollisionBounds.Y1 = -512;
|
|
|
|
GlobalCollisionBounds.Y2 = 0;
|
|
|
|
GlobalCollisionBounds.Z1 = -512;
|
|
|
|
GlobalCollisionBounds.Z2 = 512;
|
2021-08-28 06:37:22 +02:00
|
|
|
|
2021-09-09 05:29:59 +02:00
|
|
|
ItemPushItem(item, l, coll, 0, 2);
|
2021-08-28 06:37:22 +02:00
|
|
|
|
2021-09-09 05:29:59 +02:00
|
|
|
GlobalCollisionBounds.X1 = 256;
|
|
|
|
GlobalCollisionBounds.X2 = 1024;
|
|
|
|
GlobalCollisionBounds.Z1 = -128;
|
|
|
|
GlobalCollisionBounds.Z2 = 128;
|
2021-08-28 06:37:22 +02:00
|
|
|
|
2021-09-09 05:29:59 +02:00
|
|
|
ItemPushItem(item, l, coll, 0, 2);
|
|
|
|
}
|
2021-08-28 06:37:22 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void TurnSwitchControl(short itemNum)
|
|
|
|
{
|
|
|
|
ITEM_INFO* l = LaraItem;
|
|
|
|
ITEM_INFO* item = &g_Level.Items[itemNum];
|
|
|
|
|
|
|
|
if (g_Level.Items[itemNum].itemFlags[0] == TURN_SWITCH_CLOCKWISE)
|
|
|
|
{
|
|
|
|
if (item->animNumber == Objects[item->objectNumber].animIndex + 2)
|
|
|
|
{
|
|
|
|
item->pos.yRot += ANGLE(90);
|
|
|
|
if (TrInput & IN_ACTION)
|
|
|
|
{
|
|
|
|
l->animNumber = LA_TURNSWITCH_PUSH_CLOCKWISE_START;
|
|
|
|
l->frameNumber = g_Level.Anims[l->animNumber].frameBase;
|
|
|
|
|
|
|
|
item->animNumber = Objects[item->objectNumber].animIndex + 1;
|
|
|
|
item->frameNumber = g_Level.Anims[item->animNumber].frameBase;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (l->animNumber == LA_TURNSWITCH_PUSH_CLOCKWISE_END
|
|
|
|
&& l->frameNumber == g_Level.Anims[l->animNumber].frameEnd &&
|
|
|
|
!item->itemFlags[1])
|
|
|
|
item->itemFlags[1] = 1;
|
|
|
|
|
|
|
|
if (l->frameNumber >= g_Level.Anims[LA_TURNSWITCH_PUSH_CLOCKWISE_START].frameBase &&
|
|
|
|
l->frameNumber <= g_Level.Anims[LA_TURNSWITCH_PUSH_CLOCKWISE_START].frameBase + 43
|
|
|
|
||
|
|
|
|
l->frameNumber >= g_Level.Anims[LA_TURNSWITCH_PUSH_CLOCKWISE_START].frameBase + 58 &&
|
|
|
|
l->frameNumber <= g_Level.Anims[LA_TURNSWITCH_PUSH_CLOCKWISE_START].frameBase + 115)
|
|
|
|
{
|
|
|
|
SoundEffect(SFX_TR4_PUSHABLE_SOUND, &item->pos, 2);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
if (item->animNumber == Objects[ID_TURN_SWITCH].animIndex + 6)
|
|
|
|
{
|
|
|
|
item->pos.yRot -= ANGLE(90);
|
|
|
|
if (TrInput & IN_ACTION)
|
|
|
|
{
|
|
|
|
l->animNumber = LA_TURNSWITCH_PUSH_COUNTER_CLOCKWISE_START;
|
|
|
|
l->frameNumber = g_Level.Anims[l->animNumber].frameBase;
|
|
|
|
item->animNumber = Objects[item->objectNumber].animIndex + 5;
|
|
|
|
item->frameNumber = g_Level.Anims[item->animNumber].frameBase;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (l->animNumber == LA_TURNSWITCH_PUSH_COUNTER_CLOCKWISE_END && l->frameNumber == g_Level.Anims[LA_TURNSWITCH_PUSH_COUNTER_CLOCKWISE_END].frameEnd &&
|
|
|
|
!item->itemFlags[1])
|
|
|
|
item->itemFlags[1] = 1;
|
|
|
|
|
|
|
|
if (l->frameNumber >= g_Level.Anims[LA_TURNSWITCH_PUSH_COUNTER_CLOCKWISE_START].frameBase &&
|
|
|
|
l->frameNumber <= g_Level.Anims[LA_TURNSWITCH_PUSH_COUNTER_CLOCKWISE_START].frameBase + 43
|
|
|
|
||
|
|
|
|
l->frameNumber >= g_Level.Anims[LA_TURNSWITCH_PUSH_COUNTER_CLOCKWISE_START].frameBase + 58 &&
|
|
|
|
l->frameNumber <= g_Level.Anims[LA_TURNSWITCH_PUSH_COUNTER_CLOCKWISE_START].frameBase + 115)
|
|
|
|
{
|
|
|
|
SoundEffect(SFX_TR4_PUSHABLE_SOUND, &item->pos, 2);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
AnimateItem(item);
|
|
|
|
|
|
|
|
if (item->itemFlags[1] == 1)
|
|
|
|
{
|
|
|
|
l->animNumber = LA_STAND_IDLE;
|
|
|
|
l->currentAnimState = LS_STOP;
|
|
|
|
l->frameNumber = g_Level.Anims[l->animNumber].frameBase;
|
|
|
|
item->animNumber = Objects[item->objectNumber].animIndex;
|
|
|
|
item->frameNumber = g_Level.Anims[item->animNumber].frameBase;
|
|
|
|
item->status = ITEM_NOT_ACTIVE;
|
|
|
|
|
|
|
|
RemoveActiveItem(itemNum);
|
|
|
|
|
|
|
|
Lara.gunStatus = LG_NO_ARMS;
|
|
|
|
UseForcedFixedCamera = 0;
|
|
|
|
item->itemFlags[1] = 2;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|