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