Fix doppelganger formatting

This commit is contained in:
Sezz 2023-06-22 16:11:54 +10:00
parent 29a136b3e5
commit 68b51a1554

View file

@ -13,22 +13,21 @@
namespace TEN::Entities::Creatures::TR1
{
ItemInfo* FindReference(ItemInfo* item, short objectNumber)
std::optional<ItemInfo&> FindDoppelgangerReference(const ItemInfo& item, int objectNumber)
{
for (int i = 0; i < g_Level.NumItems; i++)
{
auto* currentItem = &g_Level.Items[i];
if (currentItem->ObjectNumber == objectNumber && item->TriggerFlags == currentItem->TriggerFlags)
{
auto& currentItem = g_Level.Items[i];
if (currentItem.ObjectNumber == objectNumber && item.TriggerFlags == currentItem.TriggerFlags)
return currentItem;
}
}
return nullptr;
return std::nullopt;
}
short GetWeaponDamage(LaraWeaponType weaponType)
int GetWeaponDamage(LaraWeaponType weaponType)
{
return short(Weapons[(int)weaponType].Damage) * 10;
return (Weapons[(int)weaponType].Damage * 10);
}
void DoppelgangerControl(short itemNumber)
@ -43,10 +42,10 @@ namespace TEN::Entities::Creatures::TR1
DoDamage(LaraItem, GetWeaponDamage(Lara.Control.Weapon.GunType));
}
auto* reference = FindReference(item, ID_BACON_REFERENCE);
if (reference == nullptr)
auto reference = FindDoppelgangerReference(*item, ID_BACON_REFERENCE);
if (!reference.has_value())
{
TENLog("Doppelganger require ID_BACON_REFERENCE to be placed on the center (on floor) of the room to be used !", LogLevel::Warning);
TENLog("Doppelganger requires ID_DOPPELGANGER_REFERENCE to be placed in room center.", LogLevel::Warning);
return;
}
@ -57,10 +56,13 @@ namespace TEN::Entities::Creatures::TR1
int laraFloorHeight = GetCollision(LaraItem).Position.Floor;
// Get floor heights for comparison.
Vector3i pos(2 * reference->Pose.Position.x - LaraItem->Pose.Position.x, LaraItem->Pose.Position.y, 2 * reference->Pose.Position.z - LaraItem->Pose.Position.z);
auto pos = Vector3i(
(reference->Pose.Position.x * 2) - LaraItem->Pose.Position.x,
LaraItem->Pose.Position.y,
(reference->Pose.Position.z * 2) - LaraItem->Pose.Position.z);
item->Floor = GetCollision(pos.x, pos.y, pos.z, item->RoomNumber).Position.Floor;
// Animate bacon Lara, mirroring Lara's position.
// Animate doppelganger, mirroring player's position.
item->Animation.AnimNumber = LaraItem->Animation.AnimNumber;
item->Animation.FrameNumber = LaraItem->Animation.FrameNumber;
item->Pose.Position = pos;
@ -77,40 +79,58 @@ namespace TEN::Entities::Creatures::TR1
item->Pose.Position.y += 64;
item->ItemFlags[7] = 1;
}
break;
}
case 1:
if (item->Animation.Velocity.x > 0.0f)
{
item->Animation.Velocity.x -= 2;
}
else if (item->Animation.Velocity.x < 0.0f)
{
item->Animation.Velocity.x += 2;
}
else
{
item->Animation.Velocity.x = 0.0f;
}
if (item->Animation.Velocity.z > 0.0f)
{
item->Animation.Velocity.z -= 2;
}
else if (item->Animation.Velocity.z < 0.0f)
{
item->Animation.Velocity.z += 2;
}
else
{
item->Animation.Velocity.z = 0.0f;
}
TestTriggers(item, true);
item->Floor = GetCollision(item).Position.Floor;
if (item->Pose.Position.y >= item->Floor)
{
item->Pose.Position.y = item->Floor;
TestTriggers(item, true);
SetAnimation(item, LA_FREEFALL_DEATH);
item->Animation.IsAirborne = false;
item->Animation.Velocity.y = 0.0f;
if (item->Animation.FrameNumber >= GetFrameCount(LA_FREEFALL_DEATH) - 1)
item->ItemFlags[7] = 2;
}
break;
case 2:
DisableEntityAI(itemNumber);
RemoveActiveItem(itemNumber);
item->Collidable = FALSE;
item->Collidable = false;
break;
}