TombEngine/TR5Main/Objects/Generic/Switches/rail_switch.cpp

131 lines
3.6 KiB
C++

#include "framework.h"
#include "Objects/Generic/Switches/rail_switch.h"
#include "Specific/input.h"
#include "Game/Lara/lara.h"
#include "Game/Lara/lara_helpers.h"
#include "Objects/Generic/Switches/generic_switch.h"
#include "Specific/level.h"
#include "Game/collision/collide_item.h"
#include "Game/animation.h"
#include "Game/items.h"
namespace TEN::Entities::Switches
{
PHD_VECTOR RailSwitchPos = { 0, 0, -550 };
OBJECT_COLLISION_BOUNDS RailSwitchBounds =
{
-256, 256,
0, 0,
-768, -512,
-ANGLE(10.0f), ANGLE(10.0f),
-ANGLE(30.0f), ANGLE(30.0f),
-ANGLE(10.0f), ANGLE(10.0f)
};
PHD_VECTOR RailSwitchPos2 = { 0, 0, 550 };
OBJECT_COLLISION_BOUNDS RailSwitchBounds2 =
{
-256, 256,
0, 0,
512, 768,
-ANGLE(10.0f), ANGLE(10.0f),
-ANGLE(30.0f), ANGLE(30.0f),
-ANGLE(10.0f), ANGLE(10.0f)
};
void RailSwitchCollision(short itemNumber, ITEM_INFO* laraItem, CollisionInfo* coll)
{
auto* laraInfo = GetLaraInfo(laraItem);
auto* switchItem = &g_Level.Items[itemNumber];
int flag = 0;
if ((!(TrInput & IN_ACTION) ||
laraItem->Animation.ActiveState != LS_IDLE ||
laraItem->Animation.AnimNumber != LA_STAND_IDLE ||
laraInfo->Control.HandStatus != HandStatus::Free) &&
(!laraInfo->Control.IsMoving ||
laraInfo->InteractedItem != itemNumber))
{
ObjectCollision(itemNumber, laraItem, coll);
}
else if (switchItem->Animation.ActiveState)
{
if (switchItem->Animation.ActiveState == SWITCH_ON)
{
laraItem->Position.yRot ^= (short)ANGLE(180.0f);
if (TestLaraPosition(&RailSwitchBounds2, switchItem, laraItem))
{
if (MoveLaraPosition(&RailSwitchPos2, switchItem, laraItem))
{
switchItem->Animation.TargetState = SWITCH_OFF;
flag = 1;
}
else
laraInfo->InteractedItem = itemNumber;
}
else if (laraInfo->Control.IsMoving && laraInfo->InteractedItem == itemNumber)
{
laraInfo->Control.IsMoving = false;
laraInfo->Control.HandStatus = HandStatus::Free;
}
laraItem->Position.yRot ^= (short)ANGLE(180.0f);
if (flag)
{
ResetLaraFlex(laraItem);
laraItem->Animation.AnimNumber = LA_LEVER_PUSH;
laraItem->Animation.FrameNumber = g_Level.Anims[laraItem->Animation.AnimNumber].frameBase;
laraItem->Animation.TargetState = LS_LEVERSWITCH_PUSH;
laraItem->Animation.ActiveState = LS_LEVERSWITCH_PUSH;
laraInfo->Control.IsMoving = false;
laraInfo->Control.HandStatus = HandStatus::Busy;
switchItem->Status = ITEM_ACTIVE;
AddActiveItem(itemNumber);
AnimateItem(switchItem);
return;
}
}
ObjectCollision(itemNumber, laraItem, coll);
}
else
{
if (TestLaraPosition(&RailSwitchBounds, switchItem, laraItem))
{
if (MoveLaraPosition(&RailSwitchPos, switchItem, laraItem))
{
ResetLaraFlex(laraItem);
laraItem->Animation.AnimNumber = LA_LEVER_PUSH;
laraItem->Animation.FrameNumber = g_Level.Anims[laraItem->Animation.AnimNumber].frameBase;
laraItem->Animation.TargetState = LS_LEVERSWITCH_PUSH;
laraItem->Animation.ActiveState = LS_LEVERSWITCH_PUSH;
laraInfo->Control.IsMoving = false;
laraInfo->Control.HandStatus = HandStatus::Busy;
switchItem->Animation.TargetState = SWITCH_ON;
switchItem->Status = ITEM_ACTIVE;
AddActiveItem(itemNumber);
AnimateItem(switchItem);
}
else
laraInfo->InteractedItem = itemNumber;
}
else if (laraInfo->Control.IsMoving)
{
if (laraInfo->InteractedItem == itemNumber)
{
laraInfo->Control.IsMoving = false;
laraInfo->Control.HandStatus = HandStatus::Free;
}
}
ObjectCollision(itemNumber, laraItem, coll);
}
}
}