Use references in zip line code; call IsHeld()

This commit is contained in:
Sezz 2023-05-25 15:06:39 +10:00
parent 366ead88f2
commit 2078d0d0b2

View file

@ -43,15 +43,15 @@ void InitializeZipLine(short itemNumber)
void ZipLineCollision(short itemNumber, ItemInfo* laraItem, CollisionInfo* coll)
{
auto& zipLineItem = g_Level.Items[itemNumber];
auto& lara = *GetLaraInfo(laraItem);
auto& player = GetLaraInfo(*laraItem);
if (zipLineItem.Status != ITEM_NOT_ACTIVE)
return;
if (!(TrInput & IN_ACTION) ||
if (!IsHeld(In::Action) ||
laraItem->Animation.ActiveState != LS_IDLE ||
laraItem->Animation.IsAirborne ||
lara.Control.HandStatus != HandStatus::Free)
player.Control.HandStatus != HandStatus::Free)
{
return;
}
@ -59,7 +59,7 @@ void ZipLineCollision(short itemNumber, ItemInfo* laraItem, CollisionInfo* coll)
if (TestLaraPosition(ZipLineMountBasis, &zipLineItem, laraItem))
{
AlignLaraPosition(ZipLineMountedOffset, &zipLineItem, laraItem);
lara.Control.HandStatus = HandStatus::Busy;
player.Control.HandStatus = HandStatus::Busy;
laraItem->Animation.TargetState = LS_ZIP_LINE;
do
@ -72,82 +72,82 @@ void ZipLineCollision(short itemNumber, ItemInfo* laraItem, CollisionInfo* coll)
zipLineItem.Status = ITEM_ACTIVE;
zipLineItem.Flags |= IFLAG_INVISIBLE;
lara.Control.IsMoving = false;
lara.Control.HandStatus = HandStatus::Busy;
player.Control.IsMoving = false;
player.Control.HandStatus = HandStatus::Busy;
}
}
void ControlZipLine(short itemNumber)
{
auto* zipLineItem = &g_Level.Items[itemNumber];
auto* laraItem = LaraItem;
auto& zipLineItem = g_Level.Items[itemNumber];
auto& laraItem = *LaraItem;
if (zipLineItem->Status != ITEM_ACTIVE)
if (zipLineItem.Status != ITEM_ACTIVE)
return;
if (!(zipLineItem->Flags & IFLAG_INVISIBLE))
if (!(zipLineItem.Flags & IFLAG_INVISIBLE))
{
auto* prevPos = (GameVector*)zipLineItem->Data;
auto& prevPos = *(GameVector*)zipLineItem.Data;
zipLineItem->Pose.Position = prevPos->ToVector3i();
zipLineItem.Pose.Position = prevPos.ToVector3i();
if (prevPos->RoomNumber != zipLineItem->RoomNumber)
ItemNewRoom(itemNumber, prevPos->RoomNumber);
if (prevPos.RoomNumber != zipLineItem.RoomNumber)
ItemNewRoom(itemNumber, prevPos.RoomNumber);
zipLineItem->Status = ITEM_NOT_ACTIVE;
zipLineItem.Status = ITEM_NOT_ACTIVE;
SetAnimation(zipLineItem, 0);
RemoveActiveItem(itemNumber);
return;
}
if (zipLineItem->Animation.ActiveState == 1)
if (zipLineItem.Animation.ActiveState == 1)
{
AnimateItem(zipLineItem);
AnimateItem(&zipLineItem);
return;
}
AnimateItem(zipLineItem);
AnimateItem(&zipLineItem);
// Accelerate.
if (zipLineItem->Animation.Velocity.y < ZIP_LINE_VELOCITY_MAX)
zipLineItem->Animation.Velocity.y += ZIP_LINE_VELOCITY_ACCEL;
if (zipLineItem.Animation.Velocity.y < ZIP_LINE_VELOCITY_MAX)
zipLineItem.Animation.Velocity.y += ZIP_LINE_VELOCITY_ACCEL;
// Translate.
auto headingOrient = EulerAngles(ZIP_LINE_STEEPNESS_ANGLE, zipLineItem->Pose.Orientation.y, 0);
TranslateItem(zipLineItem, headingOrient, zipLineItem->Animation.Velocity.y);
auto headingOrient = EulerAngles(ZIP_LINE_STEEPNESS_ANGLE, zipLineItem.Pose.Orientation.y, 0);
TranslateItem(&zipLineItem, headingOrient, zipLineItem.Animation.Velocity.y);
int vPos = zipLineItem->Pose.Position.y + CLICK(0.25f);
auto pointColl = GetCollision(zipLineItem, zipLineItem->Pose.Orientation.y, zipLineItem->Animation.Velocity.y);
int vPos = zipLineItem.Pose.Position.y + CLICK(0.25f);
auto pointColl = GetCollision(&zipLineItem, zipLineItem.Pose.Orientation.y, zipLineItem.Animation.Velocity.y);
// Update zip line room number.
if (pointColl.RoomNumber != zipLineItem->RoomNumber)
if (pointColl.RoomNumber != zipLineItem.RoomNumber)
ItemNewRoom(itemNumber, pointColl.RoomNumber);
if (pointColl.Position.Floor <= (vPos + CLICK(1)) || pointColl.Position.Ceiling >= (vPos - CLICK(1)))
{
// Dismount.
if (laraItem->Animation.ActiveState == LS_ZIP_LINE)
if (laraItem.Animation.ActiveState == LS_ZIP_LINE)
{
laraItem->Animation.TargetState = LS_JUMP_FORWARD;
AnimateItem(laraItem);
laraItem->Animation.IsAirborne = true;
laraItem->Animation.Velocity.y = zipLineItem->Animation.Velocity.y / 4;
laraItem->Animation.Velocity.z = zipLineItem->Animation.Velocity.y;
laraItem.Animation.TargetState = LS_JUMP_FORWARD;
AnimateItem(&laraItem);
laraItem.Animation.IsAirborne = true;
laraItem.Animation.Velocity.y = zipLineItem.Animation.Velocity.y / 4;
laraItem.Animation.Velocity.z = zipLineItem.Animation.Velocity.y;
}
SoundEffect(SFX_TR4_VONCROY_KNIFE_SWISH, &zipLineItem->Pose);
SoundEffect(SFX_TR4_VONCROY_KNIFE_SWISH, &zipLineItem.Pose);
RemoveActiveItem(itemNumber);
zipLineItem->Status = ITEM_NOT_ACTIVE;
zipLineItem->Flags -= IFLAG_INVISIBLE;
zipLineItem.Status = ITEM_NOT_ACTIVE;
zipLineItem.Flags -= IFLAG_INVISIBLE;
}
else
{
// "Parent" player to zip line.
if (laraItem->Animation.ActiveState == LS_ZIP_LINE)
laraItem->Pose.Position = zipLineItem->Pose.Position;
if (laraItem.Animation.ActiveState == LS_ZIP_LINE)
laraItem.Pose.Position = zipLineItem.Pose.Position;
// Whizz sound.
SoundEffect(SFX_TR4_TRAIN_DOOR_CLOSE, &zipLineItem->Pose);
SoundEffect(SFX_TR4_TRAIN_DOOR_CLOSE, &zipLineItem.Pose);
}
}