From 84150dc6254b4a9c7c297be6df053705de20498d Mon Sep 17 00:00:00 2001 From: Lwmte <3331699+Lwmte@users.noreply.github.com> Date: Tue, 9 May 2023 21:59:34 +0200 Subject: [PATCH 1/9] Add refactors from switch state ambiguity fixes branch --- TombEngine/Game/control/trigger.cpp | 8 +++---- .../Generic/Switches/fullblock_switch.cpp | 2 +- .../Generic/Switches/generic_switch.cpp | 24 +++++++++---------- .../Objects/Generic/Switches/jump_switch.cpp | 2 +- 4 files changed, 18 insertions(+), 18 deletions(-) diff --git a/TombEngine/Game/control/trigger.cpp b/TombEngine/Game/control/trigger.cpp index ae9b6ba72..aad5e9df5 100644 --- a/TombEngine/Game/control/trigger.cpp +++ b/TombEngine/Game/control/trigger.cpp @@ -182,8 +182,8 @@ int SwitchTrigger(short itemNumber, short timer) // Handle switches. if (item.Status == ITEM_DEACTIVATED) { - if (((item.Animation.ActiveState == 0 && item.ObjectNumber != ID_JUMP_SWITCH) || - (item.Animation.ActiveState == 1 && item.ObjectNumber == ID_JUMP_SWITCH)) && + if (((item.Animation.ActiveState == SWITCH_OFF && item.ObjectNumber != ID_JUMP_SWITCH) || + (item.Animation.ActiveState == SWITCH_ON && item.ObjectNumber == ID_JUMP_SWITCH)) && timer > 0) { item.Timer = timer; @@ -195,7 +195,7 @@ int SwitchTrigger(short itemNumber, short timer) return 1; } - if (item.TriggerFlags >= 0 || item.Animation.ActiveState != 0) + if (item.TriggerFlags >= 0 || item.Animation.ActiveState != SWITCH_OFF) { RemoveActiveItem(itemNumber); @@ -211,7 +211,7 @@ int SwitchTrigger(short itemNumber, short timer) return 1; } } - else if (item.Status != 0) + else if (item.Status != ITEM_NOT_ACTIVE) { if (item.ObjectNumber == ID_AIRLOCK_SWITCH && item.Animation.AnimNumber == GetAnimIndex(item, 2) && diff --git a/TombEngine/Objects/Generic/Switches/fullblock_switch.cpp b/TombEngine/Objects/Generic/Switches/fullblock_switch.cpp index f90f297a2..7e376b94f 100644 --- a/TombEngine/Objects/Generic/Switches/fullblock_switch.cpp +++ b/TombEngine/Objects/Generic/Switches/fullblock_switch.cpp @@ -44,7 +44,7 @@ namespace TEN::Entities::Switches laraItem->Animation.AnimNumber != LA_STAND_IDLE || laraInfo->Control.HandStatus != HandStatus::Free || switchItem->Status || - switchItem->Flags & 0x100 || + switchItem->Flags & ONESHOT || CurrentSequence >= 3) && (!laraInfo->Control.IsMoving || laraInfo->Context.InteractedItem !=itemNumber)) { diff --git a/TombEngine/Objects/Generic/Switches/generic_switch.cpp b/TombEngine/Objects/Generic/Switches/generic_switch.cpp index 7a33cb91c..0d2e6479d 100644 --- a/TombEngine/Objects/Generic/Switches/generic_switch.cpp +++ b/TombEngine/Objects/Generic/Switches/generic_switch.cpp @@ -70,7 +70,7 @@ namespace TEN::Entities::Switches laraItem->Animation.AnimNumber == LA_STAND_IDLE && laraInfo->Control.HandStatus == HandStatus::Free && switchItem->Status == ITEM_NOT_ACTIVE && - !(switchItem->Flags & 0x100) && + !(switchItem->Flags & ONESHOT) && switchItem->TriggerFlags >= 0 || laraInfo->Control.IsMoving && laraInfo->Context.InteractedItem == itemNumber) { @@ -79,62 +79,62 @@ namespace TEN::Entities::Switches if ((switchItem->TriggerFlags == 3 || switchItem->TriggerFlags == 4) && switchItem->Animation.ActiveState == SWITCH_OFF) return; - SwitchBounds.BoundingBox.X1 = bounds.X1 - BLOCK(0.25); - SwitchBounds.BoundingBox.X2 = bounds.X2 + BLOCK(0.25); + SwitchBounds.BoundingBox.X1 = bounds.X1 - BLOCK(0.25f); + SwitchBounds.BoundingBox.X2 = bounds.X2 + BLOCK(0.25f); switch (switchItem->TriggerFlags) { default: SwitchPos.z = bounds.Z1 - 128; - SwitchBounds.BoundingBox.Z1 = bounds.Z1 - BLOCK(0.2); + SwitchBounds.BoundingBox.Z1 = bounds.Z1 - BLOCK(0.2f); SwitchBounds.BoundingBox.Z2 = bounds.Z2; break; case SWT_BIG_LEVER: SwitchPos.z = bounds.Z1 - 64; - SwitchBounds.BoundingBox.Z1 = bounds.Z1 - BLOCK(0.2); + SwitchBounds.BoundingBox.Z1 = bounds.Z1 - BLOCK(0.2f); SwitchBounds.BoundingBox.Z2 = bounds.Z2; break; case SWT_SMALL_LEVER: SwitchPos.z = bounds.Z1 - 112; - SwitchBounds.BoundingBox.Z1 = bounds.Z1 - BLOCK(0.25); + SwitchBounds.BoundingBox.Z1 = bounds.Z1 - BLOCK(0.25f); SwitchBounds.BoundingBox.Z2 = bounds.Z2; break; case SWT_SMALL_BUTTON: SwitchPos.z = bounds.Z1 - 156; - SwitchBounds.BoundingBox.Z1 = bounds.Z1 - BLOCK(0.2); + SwitchBounds.BoundingBox.Z1 = bounds.Z1 - BLOCK(0.2f); SwitchBounds.BoundingBox.Z2 = bounds.Z2; break; case SWT_BIG_BUTTON: SwitchPos.z = bounds.Z1 - 256; - SwitchBounds.BoundingBox.Z1 = bounds.Z1 - BLOCK(0.5); + SwitchBounds.BoundingBox.Z1 = bounds.Z1 - BLOCK(0.5f); SwitchBounds.BoundingBox.Z2 = bounds.Z2; break; case SWT_GIANT_BUTTON: SwitchPos.z = bounds.Z1 - 384; - SwitchBounds.BoundingBox.Z1 = bounds.Z1 - BLOCK(0.5); + SwitchBounds.BoundingBox.Z1 = bounds.Z1 - BLOCK(0.5f); SwitchBounds.BoundingBox.Z2 = bounds.Z2; break; case SWT_VALVE: SwitchPos.z = bounds.Z1 - 112; - SwitchBounds.BoundingBox.Z1 = bounds.Z1 - BLOCK(0.25); + SwitchBounds.BoundingBox.Z1 = bounds.Z1 - BLOCK(0.25f); SwitchBounds.BoundingBox.Z2 = bounds.Z2; break; case SWT_WALL_HOLE: SwitchPos.z = bounds.Z1 - 196; - SwitchBounds.BoundingBox.Z1 = bounds.Z1 - BLOCK(0.2); + SwitchBounds.BoundingBox.Z1 = bounds.Z1 - BLOCK(0.2f); SwitchBounds.BoundingBox.Z2 = bounds.Z2; break; case SWT_CUSTOM: SwitchPos.z = bounds.Z1 - switchItem->ItemFlags[6]; - SwitchBounds.BoundingBox.Z1 = bounds.Z1 - BLOCK(0.5); + SwitchBounds.BoundingBox.Z1 = bounds.Z1 - BLOCK(0.5f); SwitchBounds.BoundingBox.Z2 = bounds.Z2; break; } diff --git a/TombEngine/Objects/Generic/Switches/jump_switch.cpp b/TombEngine/Objects/Generic/Switches/jump_switch.cpp index 23eeefcef..b3b9563ba 100644 --- a/TombEngine/Objects/Generic/Switches/jump_switch.cpp +++ b/TombEngine/Objects/Generic/Switches/jump_switch.cpp @@ -37,7 +37,7 @@ namespace TEN::Entities::Switches (laraItem->Status || laraItem->Animation.IsAirborne) && laraItem->Animation.Velocity.y > 0 && laraInfo->Control.HandStatus == HandStatus::Free && - !switchItem->Animation.ActiveState) + switchItem->Animation.ActiveState == SWITCH_OFF) { if (TestLaraPosition(JumpSwitchBounds, switchItem, laraItem)) { From f0dd6b06a0f4eb5679e95c2092919d64d78655e4 Mon Sep 17 00:00:00 2001 From: Sezz Date: Thu, 11 May 2023 16:11:16 +1000 Subject: [PATCH 2/9] Move weapon target lists to player object --- TombEngine/Game/Lara/lara_fire.cpp | 29 ++++++++++++----------------- TombEngine/Game/Lara/lara_struct.h | 13 +++++++++---- 2 files changed, 21 insertions(+), 21 deletions(-) diff --git a/TombEngine/Game/Lara/lara_fire.cpp b/TombEngine/Game/Lara/lara_fire.cpp index d14c9a114..ba6e9911b 100644 --- a/TombEngine/Game/Lara/lara_fire.cpp +++ b/TombEngine/Game/Lara/lara_fire.cpp @@ -34,11 +34,6 @@ using namespace TEN::Entities::Generic; using namespace TEN::Input; using namespace TEN::Math; -constexpr auto TARGET_COUNT_MAX = 8; - -std::array LastTargets = {}; -std::array TargetList = {}; - int FlashGrenadeAftershockTimer = 0; // States in which Lara will hold an active flare out in front. @@ -910,7 +905,7 @@ void FindNewTarget(ItemInfo& laraItem, const WeaponInfo& weaponInfo) orient.x <= weaponInfo.LockOrientConstraint.second.x && orient.y <= weaponInfo.LockOrientConstraint.second.y) { - TargetList[targetCount] = &item; + player.TargetList[targetCount] = &item; ++targetCount; if (distance < closestDistance && @@ -923,14 +918,14 @@ void FindNewTarget(ItemInfo& laraItem, const WeaponInfo& weaponInfo) } } - TargetList[targetCount] = nullptr; - if (TargetList[0] == nullptr) + player.TargetList[targetCount] = nullptr; + if (player.TargetList[0] == nullptr) { player.TargetEntity = nullptr; } else { - for (const auto* targetPtr : TargetList) + for (const auto* targetPtr : player.TargetList) { if (targetPtr == nullptr) player.TargetEntity = nullptr; @@ -944,17 +939,17 @@ void FindNewTarget(ItemInfo& laraItem, const WeaponInfo& weaponInfo) if (player.TargetEntity == nullptr) { player.TargetEntity = closestEntityPtr; - LastTargets[0] = nullptr; + player.LastTargets[0] = nullptr; } else if (IsClicked(In::SwitchTarget)) { player.TargetEntity = nullptr; bool flag = true; - for (const auto& targetPtr : TargetList) + for (const auto& targetPtr : player.TargetList) { bool doLoop = false; - for (const auto* lastTargetPtr : LastTargets) + for (const auto* lastTargetPtr : player.LastTargets) { if (lastTargetPtr == targetPtr) { @@ -976,18 +971,18 @@ void FindNewTarget(ItemInfo& laraItem, const WeaponInfo& weaponInfo) if (flag) { player.TargetEntity = closestEntityPtr; - LastTargets[0] = nullptr; + player.LastTargets[0] = nullptr; } } } } - if (player.TargetEntity != LastTargets[0]) + if (player.TargetEntity != player.LastTargets[0]) { - for (int slot = TARGET_COUNT_MAX - 1; slot > 0; --slot) - LastTargets[slot] = LastTargets[slot - 1]; + for (int slot = LaraInfo::TARGET_COUNT_MAX - 1; slot > 0; --slot) + player.LastTargets[slot] = player.LastTargets[slot - 1]; - LastTargets[0] = player.TargetEntity; + player.LastTargets[0] = player.TargetEntity; } LaraTargetInfo(laraItem, weaponInfo); diff --git a/TombEngine/Game/Lara/lara_struct.h b/TombEngine/Game/Lara/lara_struct.h index 9f321db72..fd50232df 100644 --- a/TombEngine/Game/Lara/lara_struct.h +++ b/TombEngine/Game/Lara/lara_struct.h @@ -1307,6 +1307,8 @@ struct PlayerEffectData struct LaraInfo { + static constexpr auto TARGET_COUNT_MAX = 8; + int ItemNumber = 0; // TODO: Remove. No longer necessary since ItemInfo already has it. -- Sezz 2023.04.09 LaraControlData Control = {}; @@ -1319,12 +1321,15 @@ struct LaraInfo TorchData Torch = {}; CarriedWeaponInfo Weapons[(int)LaraWeaponType::NumWeapons] = {}; - EulerAngles ExtraHeadRot = {}; - EulerAngles ExtraTorsoRot = {}; + EulerAngles ExtraHeadRot = EulerAngles::Zero; + EulerAngles ExtraTorsoRot = EulerAngles::Zero; + EulerAngles TargetArmOrient = EulerAngles::Zero; ArmInfo LeftArm = {}; ArmInfo RightArm = {}; - EulerAngles TargetArmOrient = EulerAngles::Zero; - ItemInfo* TargetEntity = nullptr; // TargetEntityPtr. Should use item number instead? + + ItemInfo* TargetEntity = nullptr; // TargetEntityPtr. Should use item number instead? + std::array TargetList = {}; + std::array LastTargets = {}; // TODO: Rewrite and restore spasm effect. Also move to PlayerEffectData? int HitFrame = 0; // Frame index. From 9764f128fe62c7150ab7058e922fa547f47141f0 Mon Sep 17 00:00:00 2001 From: Sezz Date: Thu, 11 May 2023 17:44:21 +1000 Subject: [PATCH 3/9] Remove old broken tightrope code --- TombEngine/Game/Lara/lara.cpp | 4 - TombEngine/Game/Lara/lara_objects.cpp | 135 ------------------ TombEngine/Game/Lara/lara_objects.h | 2 - TombEngine/Game/Lara/lara_struct.h | 7 - TombEngine/Game/Lara/lara_tests.cpp | 13 -- TombEngine/Game/Lara/lara_tests.h | 4 - TombEngine/Objects/Generic/Object/objects.cpp | 22 +-- 7 files changed, 2 insertions(+), 185 deletions(-) diff --git a/TombEngine/Game/Lara/lara.cpp b/TombEngine/Game/Lara/lara.cpp index f26d17979..4a7edad13 100644 --- a/TombEngine/Game/Lara/lara.cpp +++ b/TombEngine/Game/Lara/lara.cpp @@ -179,11 +179,7 @@ std::function lara_control_routines[NUM_LARA_STATES + 1] = lara_as_tightrope_fall,//122 lara_as_tightrope_fall,//123 lara_as_null,//124 -#ifdef NEW_TIGHTROPE lara_as_tightrope_dismount,//125 -#else // !NEW_TIGHTROPE - lara_as_null,//125 -#endif lara_as_switch_on,//126 lara_as_null,//127 lara_as_horizontal_bar_swing,//128 diff --git a/TombEngine/Game/Lara/lara_objects.cpp b/TombEngine/Game/Lara/lara_objects.cpp index 693ecef3d..92e26e2f0 100644 --- a/TombEngine/Game/Lara/lara_objects.cpp +++ b/TombEngine/Game/Lara/lara_objects.cpp @@ -312,7 +312,6 @@ void lara_as_horizontal_bar_leap(ItemInfo* item, CollisionInfo* coll) // TIGHTROPE // --------- -#ifdef NEW_TIGHTROPE // State: LS_TIGHTROPE_IDLE (119) // Collision: lara_default_col() void lara_as_tightrope_idle(ItemInfo* item, CollisionInfo* coll) @@ -414,140 +413,6 @@ void lara_as_tightrope_fall(ItemInfo* item, CollisionInfo* coll) } } -#else -// State: LS_TIGHTROPE_IDLE (119) -// Collision: lara_default_col() -void lara_as_tightrope_idle(ItemInfo* item, CollisionInfo* coll) -{ - GetTightropeFallOff(item, 127); - - if (TrInput & IN_LOOK) - LookUpDown(item); - - if (item->Animation.ActiveState != LS_TIGHTROPE_UNBALANCE_LEFT) - { - if (lara->Control.TightropeControl.Fall) - { - if (GetRandomControl() & 1) - item->Animation.TargetState = LS_TIGHTROPE_UNBALANCE_RIGHT; - else - item->Animation.TargetState = LS_TIGHTROPE_UNBALANCE_LEFT; - } - else - { - if (TrInput & IN_FORWARD) - item->Animation.TargetState = LS_TIGHTROPE_WALK; - else if (TrInput & (IN_ROLL | IN_BACK)) - { - item->Animation.TargetState = LS_TIGHTROPE_TURN_180; - GetTightropeFallOff(item, 1); - } - } - } -} - -// State: LS_TIGHTROPE_WALK (121) -// Collision: lara_default_col() -void lara_as_tightrope_walk(ItemInfo* item, CollisionInfo* coll) -{ - if (lara->Control.TightropeControl.OnCount) - lara->Control.TightropeControl.OnCount--; - else if (lara->Control.TightropeControl.Off) - { - short roomNumber = item->RoomNumber; - - if (GetFloorHeight(GetFloor(item->Pose.Position.x, item->Pose.Position.y, item->Pose.Position.z, &roomNumber), - item->Pose.Position.x, item->Pose.Position.y, item->Pose.Position.z) == item->Pose.Position.y) - { - item->Animation.TargetState = LS_TIGHTROPE_DISMOUNT; - lara->Control.TightropeControl.Off = 0; - } - } - else - GetTightropeFallOff(item, 127); - - if (item->Animation.ActiveState != LS_TIGHTROPE_UNBALANCE_LEFT) - { - if (TrInput & IN_LOOK) - LookUpDown(item); - - if (((TrInput & (IN_BACK | IN_ROLL) || !(TrInput & IN_FORWARD) || lara->Control.TightropeControl.Fall) && - !lara->Control.TightropeControl.OnCount && - !lara->Control.TightropeControl.Off) && - item->Animation.TargetState != LS_TIGHTROPE_DISMOUNT) - { - item->Animation.TargetState = LS_TIGHTROPE_IDLE; - } - } -} - -// State: TIGHTROPE_UNBALANCE_LEFT (122), TIGHTROPE_UNBALANCE_RIGHT (123) -// Collision: lara_default_col() -void lara_as_tightrope_fall(ItemInfo* item, CollisionInfo* coll) -{ - if (item->Animation.AnimNumber == LA_TIGHTROPE_FALL_LEFT || item->Animation.AnimNumber == LA_TIGHTROPE_FALL_RIGHT) - { - if (TestLastFrame(item, item->Animation.AnimNumber)) - { - auto pos = GetJointPosition(item, LM_RFOOT); - item->Pose.Position.x = pos.x; - item->Pose.Position.y = pos.y + 75; - item->Pose.Position.z = pos.z; - - item->Animation.TargetState = LS_FREEFALL; - item->Animation.ActiveState = LS_FREEFALL; - item->Animation.AnimNumber = LA_FREEFALL; - item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; - - item->Animation.Velocity.y = 81; - Camera.targetspeed = 16; - } - } - else - { - int undoInput, wrongInput; - int undoAnim, undoFrame; - - if (lara->Control.TightropeControl.OnCount > 0) - lara->Control.TightropeControl.OnCount--; - - if (item->Animation.AnimNumber == LA_TIGHTROPE_UNBALANCE_LEFT) - { - undoInput = IN_RIGHT; - wrongInput = IN_LEFT; - undoAnim = LA_TIGHTROPE_RECOVER_LEFT; - } - else if (item->Animation.AnimNumber == LA_TIGHTROPE_UNBALANCE_RIGHT) - { - undoInput = IN_LEFT; - wrongInput = IN_RIGHT; - undoAnim = LA_TIGHTROPE_RECOVER_RIGHT; - } - else - return; - - undoFrame = g_Level.Anims[item->Animation.AnimNumber].frameEnd + g_Level.Anims[undoAnim].frameBase - item->Animation.FrameNumber; - - if (TrInput & undoInput && lara->Control.TightropeControl.OnCount == 0) - { - item->Animation.ActiveState = LS_TIGHTROPE_RECOVER_BALANCE; - item->Animation.TargetState = LS_TIGHTROPE_IDLE; - item->Animation.AnimNumber = undoAnim; - item->Animation.FrameNumber = undoFrame; - lara->Control.TightropeControl.Fall--; - } - else - { - if (TrInput & wrongInput) - { - if (lara->Control.TightropeControl.OnCount < 10) - lara->Control.TightropeControl.OnCount += (GetRandomControl() & 3) + 2; - } - } - } -} -#endif - // ---- // ROPE // ---- diff --git a/TombEngine/Game/Lara/lara_objects.h b/TombEngine/Game/Lara/lara_objects.h index f56595d79..1a7be972c 100644 --- a/TombEngine/Game/Lara/lara_objects.h +++ b/TombEngine/Game/Lara/lara_objects.h @@ -55,9 +55,7 @@ void lara_as_horizontal_bar_leap(ItemInfo* item, CollisionInfo* coll); // TIGHTROPE // --------- -#ifdef NEW_TIGHTROPE void lara_as_tightrope_dismount(ItemInfo* item, CollisionInfo* coll); -#endif void lara_as_tightrope_idle(ItemInfo* item, CollisionInfo* coll); void lara_as_tightrope_walk(ItemInfo* item, CollisionInfo* coll); void lara_as_tightrope_fall(ItemInfo* item, CollisionInfo* coll); diff --git a/TombEngine/Game/Lara/lara_struct.h b/TombEngine/Game/Lara/lara_struct.h index fd50232df..219b236c4 100644 --- a/TombEngine/Game/Lara/lara_struct.h +++ b/TombEngine/Game/Lara/lara_struct.h @@ -1220,19 +1220,12 @@ struct RopeControlData }; // TODO: Give tightrope a property for difficulty? -// TODO: Remove old tightrope functionality. struct TightropeControlData { -#if NEW_TIGHTROPE short TightropeItem = 0; bool CanDismount = false; float Balance = 0.0f; unsigned int TimeOnTightrope = 0; -#else // !NEW_TIGHTROPE - unsigned int OnCount; - byte Off; - byte Fall; -#endif }; struct SubsuitControlData diff --git a/TombEngine/Game/Lara/lara_tests.cpp b/TombEngine/Game/Lara/lara_tests.cpp index 11bdb52b4..3b5d5a1d4 100644 --- a/TombEngine/Game/Lara/lara_tests.cpp +++ b/TombEngine/Game/Lara/lara_tests.cpp @@ -1099,19 +1099,6 @@ void TestLaraWaterDepth(ItemInfo* item, CollisionInfo* coll) } } -#ifndef NEW_TIGHTROPE -void GetTightropeFallOff(ItemInfo* item, int regularity) -{ - auto* lara = GetLaraInfo(item); - - if (item->HitPoints <= 0 || item->HitStatus) - SetAnimation(item, LA_TIGHTROPE_FALL_LEFT); - - if (!lara->Control.Tightrope.Fall && !(GetRandomControl() & regularity)) - lara->Control.Tightrope.Fall = 2 - ((GetRandomControl() & 0xF) != 0); -} -#endif - bool TestLaraWeaponType(LaraWeaponType refWeaponType, const vector& weaponTypeList) { for (const auto& weaponType : weaponTypeList) diff --git a/TombEngine/Game/Lara/lara_tests.h b/TombEngine/Game/Lara/lara_tests.h index 192eb69cd..e6f83ba30 100644 --- a/TombEngine/Game/Lara/lara_tests.h +++ b/TombEngine/Game/Lara/lara_tests.h @@ -42,10 +42,6 @@ bool TestLaraWaterClimbOut(ItemInfo* item, CollisionInfo* coll); bool TestLaraLadderClimbOut(ItemInfo* item, CollisionInfo* coll); void TestLaraWaterDepth(ItemInfo* item, CollisionInfo* coll); -#ifndef NEW_TIGHTROPE -void GetTightropeFallOff(ItemInfo* item, int regularity); -#endif - bool TestLaraWeaponType(LaraWeaponType refWeaponType, const std::vector& weaponTypeList); bool IsStandingWeapon(ItemInfo* item, LaraWeaponType weaponType); bool IsVaultState(int state); diff --git a/TombEngine/Objects/Generic/Object/objects.cpp b/TombEngine/Objects/Generic/Object/objects.cpp index 16a4995a2..ef9a3d365 100644 --- a/TombEngine/Objects/Generic/Object/objects.cpp +++ b/TombEngine/Objects/Generic/Object/objects.cpp @@ -78,7 +78,6 @@ void TightropeCollision(short itemNumber, ItemInfo* laraItem, CollisionInfo* col laraInfo->Control.HandStatus != HandStatus::Free) && (!laraInfo->Control.IsMoving || laraInfo->Context.InteractedItem !=itemNumber)) { -#ifdef NEW_TIGHTROPE if (laraItem->Animation.ActiveState == LS_TIGHTROPE_WALK && laraItem->Animation.TargetState != LS_TIGHTROPE_DISMOUNT && !laraInfo->Control.Tightrope.CanDismount) @@ -89,19 +88,6 @@ void TightropeCollision(short itemNumber, ItemInfo* laraItem, CollisionInfo* col laraInfo->Control.Tightrope.CanDismount = true; } } - -#else // !NEW_TIGHTROPE - if (laraItem->Animation.ActiveState == LS_TIGHTROPE_WALK && - laraItem->Animation.TargetState != LS_TIGHTROPE_DISMOUNT && - !laraInfo->Control.Tightrope.Off) - { - if (item->Pose.Orientation.y == laraItem->Pose.Orientation.y) - { - if (abs(item->Pose.Position.x - laraItem->Pose.Position.x) + abs(item->Pose.Position.z - laraItem->Pose.Position.z) < 640) - laraInfo->tightRopeOff = true; - } - } -#endif } else { @@ -116,19 +102,15 @@ void TightropeCollision(short itemNumber, ItemInfo* laraItem, CollisionInfo* col laraItem->Animation.FrameNumber = g_Level.Anims[laraItem->Animation.AnimNumber].frameBase; laraInfo->Control.IsMoving = false; ResetPlayerFlex(laraItem); -#ifdef NEW_TIGHTROPE laraInfo->Control.Tightrope.Balance = 0; laraInfo->Control.Tightrope.CanDismount = false; laraInfo->Control.Tightrope.TightropeItem = itemNumber; laraInfo->Control.Tightrope.TimeOnTightrope = 0; -#else // !NEW_TIGHTROPE - laraInfo->Control.Tightrope.OnCount = 60; - laraInfo->Control.Tightrope.Off = 0; - laraInfo->Control.Tightrope.Fall = 0; -#endif } else + { laraInfo->Context.InteractedItem = itemNumber; + } tightropeItem->Pose.Orientation.y += -ANGLE(180.0f); } From 1caa6f499468ef9a536cd2e35ded74a5bd6750a3 Mon Sep 17 00:00:00 2001 From: Sezz Date: Thu, 11 May 2023 22:30:41 +1000 Subject: [PATCH 4/9] Animation refactors tier 3 (#1092) * Remove most direct accesses to g_Level.Anims * Make all anim and frame data access read-only * Simplify * Simplify * Use GetAnimData() * g_Level.Anims to GetAnimData() conversions * Use SetAnimation() in wraith trap init * Minor formatting fixes --- TombEngine/Game/Lara/lara_fire.cpp | 4 +- TombEngine/Game/Lara/lara_flare.cpp | 22 +++--- TombEngine/Game/Lara/lara_objects.cpp | 2 +- TombEngine/Game/Lara/lara_one_gun.cpp | 22 +++--- TombEngine/Game/Lara/lara_overhang.cpp | 4 +- TombEngine/Game/Lara/lara_two_guns.cpp | 2 +- TombEngine/Game/animation.cpp | 67 +++++++++---------- TombEngine/Game/animation.h | 29 ++++---- TombEngine/Game/collision/collide_item.cpp | 8 +-- TombEngine/Game/pickup/pickup.cpp | 35 +++++----- TombEngine/Game/pickup/pickup.h | 2 +- TombEngine/Objects/Effects/flame_emitters.cpp | 4 +- .../Objects/Generic/Object/burning_torch.cpp | 8 +-- .../Generic/Object/generic_trapdoor.cpp | 24 +++++-- TombEngine/Objects/Generic/Object/objects.cpp | 6 +- TombEngine/Objects/Generic/Object/rope.cpp | 24 +++---- .../Generic/Switches/AirlockSwitch.cpp | 2 +- .../Objects/Generic/Switches/cog_switch.cpp | 6 +- .../Generic/Switches/crowbar_switch.cpp | 44 ++++++------ .../Generic/Switches/fullblock_switch.cpp | 2 +- .../Generic/Switches/generic_switch.cpp | 2 +- .../Objects/Generic/Switches/jump_switch.cpp | 2 +- .../Generic/Switches/pulley_switch.cpp | 2 +- .../Objects/Generic/Switches/rail_switch.cpp | 4 +- .../Objects/Generic/Switches/turn_switch.cpp | 60 +++++++++-------- TombEngine/Objects/Generic/puzzles_keys.cpp | 13 ++-- TombEngine/Objects/TR1/Entity/tr1_wolf.cpp | 2 +- .../Objects/TR2/Entity/tr2_barracuda.cpp | 2 +- TombEngine/Objects/TR2/Entity/tr2_dragon.cpp | 4 +- .../Objects/TR2/Entity/tr2_eagle_or_crow.cpp | 6 +- .../Objects/TR2/Entity/tr2_mercenary.cpp | 2 +- TombEngine/Objects/TR2/Entity/tr2_monk.cpp | 2 +- TombEngine/Objects/TR2/Entity/tr2_skidman.cpp | 2 +- TombEngine/Objects/TR2/Entity/tr2_spider.cpp | 2 +- TombEngine/Objects/TR2/Entity/tr2_yeti.cpp | 10 +-- .../Objects/TR2/Trap/tr2_killerstatue.cpp | 2 +- TombEngine/Objects/TR2/Vehicles/speedboat.cpp | 2 +- TombEngine/Objects/TR3/Entity/PunaBoss.cpp | 2 +- TombEngine/Objects/TR3/Entity/Shiva.cpp | 2 +- TombEngine/Objects/TR3/Entity/SophiaLeigh.cpp | 2 +- TombEngine/Objects/TR3/Entity/tr3_monkey.cpp | 4 +- TombEngine/Objects/TR3/Entity/tr3_mp_gun.cpp | 20 +++--- .../Objects/TR3/Entity/tr3_mp_stick.cpp | 4 +- TombEngine/Objects/TR3/Entity/tr3_tony.cpp | 2 +- .../Objects/TR3/Entity/tr3_tribesman.cpp | 4 +- TombEngine/Objects/TR3/Vehicles/kayak.cpp | 2 +- TombEngine/Objects/TR3/Vehicles/minecart.cpp | 4 +- TombEngine/Objects/TR3/Vehicles/upv.cpp | 2 +- TombEngine/Objects/TR4/Entity/Wraith.cpp | 2 +- TombEngine/Objects/TR4/Entity/tr4_ahmet.cpp | 16 ++--- TombEngine/Objects/TR4/Entity/tr4_baboon.cpp | 4 +- TombEngine/Objects/TR4/Entity/tr4_baddy.cpp | 46 ++++++------- .../Objects/TR4/Entity/tr4_big_scorpion.cpp | 2 +- .../Objects/TR4/Entity/tr4_crocodile.cpp | 4 +- TombEngine/Objects/TR4/Entity/tr4_demigod.cpp | 12 ++-- TombEngine/Objects/TR4/Entity/tr4_dog.cpp | 2 +- .../Objects/TR4/Entity/tr4_enemy_jeep.cpp | 4 +- TombEngine/Objects/TR4/Entity/tr4_guide.cpp | 30 ++++----- .../Objects/TR4/Entity/tr4_horseman.cpp | 14 ++-- .../Objects/TR4/Entity/tr4_jean_yves.cpp | 4 +- .../Objects/TR4/Entity/tr4_knight_templar.cpp | 2 +- TombEngine/Objects/TR4/Entity/tr4_mummy.cpp | 8 +-- TombEngine/Objects/TR4/Entity/tr4_mutant.cpp | 8 +-- TombEngine/Objects/TR4/Entity/tr4_sas.cpp | 4 +- TombEngine/Objects/TR4/Entity/tr4_setha.cpp | 8 +-- .../Objects/TR4/Entity/tr4_skeleton.cpp | 16 ++--- .../Objects/TR4/Entity/tr4_small_scorpion.cpp | 4 +- TombEngine/Objects/TR4/Entity/tr4_sphinx.cpp | 2 +- TombEngine/Objects/TR4/Entity/tr4_troops.cpp | 10 +-- .../Objects/TR4/Entity/tr4_von_croy.cpp | 46 ++++++------- TombEngine/Objects/TR4/Object/WraithTrap.cpp | 3 +- .../TR4/Object/tr4_clockwork_beetle.cpp | 2 +- .../Objects/TR4/Object/tr4_element_puzzle.cpp | 8 +-- TombEngine/Objects/TR4/Object/tr4_mapper.cpp | 2 +- TombEngine/Objects/TR4/Object/tr4_obelisk.cpp | 10 +-- .../Objects/TR4/Object/tr4_sarcophagus.cpp | 4 +- TombEngine/Objects/TR4/Object/tr4_scales.cpp | 16 ++--- TombEngine/Objects/TR4/Object/tr4_senet.cpp | 2 +- TombEngine/Objects/TR4/Trap/tr4_birdblade.cpp | 4 +- .../Objects/TR4/Trap/tr4_catwalkblade.cpp | 6 +- TombEngine/Objects/TR4/Trap/tr4_cog.cpp | 2 +- .../Objects/TR4/Trap/tr4_fourblades.cpp | 4 +- TombEngine/Objects/TR4/Trap/tr4_hammer.cpp | 4 +- TombEngine/Objects/TR4/Trap/tr4_mine.cpp | 4 +- .../Objects/TR4/Trap/tr4_moving_blade.cpp | 2 +- .../Objects/TR4/Trap/tr4_plinthblade.cpp | 6 +- TombEngine/Objects/TR4/Trap/tr4_sethblade.cpp | 2 +- TombEngine/Objects/TR4/Trap/tr4_spikeball.cpp | 4 +- TombEngine/Objects/TR4/Trap/tr4_stargate.cpp | 4 +- TombEngine/Objects/TR4/Vehicles/motorbike.cpp | 2 +- TombEngine/Objects/TR5/Entity/HeavyGuard.cpp | 4 +- TombEngine/Objects/TR5/Entity/tr5_chef.cpp | 4 +- TombEngine/Objects/TR5/Entity/tr5_cyborg.cpp | 6 +- .../Objects/TR5/Entity/tr5_doberman.cpp | 4 +- TombEngine/Objects/TR5/Entity/tr5_dog.cpp | 6 +- TombEngine/Objects/TR5/Entity/tr5_ghost.cpp | 2 +- .../Objects/TR5/Entity/tr5_gladiator.cpp | 2 +- TombEngine/Objects/TR5/Entity/tr5_guard.cpp | 62 ++++++++--------- TombEngine/Objects/TR5/Entity/tr5_hydra.cpp | 8 +-- .../Objects/TR5/Entity/tr5_lagoon_witch.cpp | 4 +- TombEngine/Objects/TR5/Entity/tr5_larson.cpp | 6 +- .../Objects/TR5/Entity/tr5_roman_statue.cpp | 14 ++-- TombEngine/Objects/TR5/Object/tr5_genslot.cpp | 2 +- .../Objects/TR5/Object/tr5_pushableblock.cpp | 8 +-- .../Objects/TR5/Object/tr5_rollingball.cpp | 6 +- .../Objects/TR5/Object/tr5_teleporter.cpp | 5 +- .../TR5/Switch/tr5_crowdove_switch.cpp | 2 +- .../Objects/TR5/Trap/tr5_ventilator.cpp | 4 +- .../Objects/TR5/Trap/tr5_wreckingball.cpp | 2 +- TombEngine/Renderer/Renderer11DrawMenu.cpp | 4 +- TombEngine/Renderer/Renderer11Lara.cpp | 16 ++--- .../TEN/Objects/Moveable/MoveableObject.cpp | 21 +++--- 112 files changed, 517 insertions(+), 498 deletions(-) diff --git a/TombEngine/Game/Lara/lara_fire.cpp b/TombEngine/Game/Lara/lara_fire.cpp index ba6e9911b..018a03702 100644 --- a/TombEngine/Game/Lara/lara_fire.cpp +++ b/TombEngine/Game/Lara/lara_fire.cpp @@ -332,8 +332,8 @@ void InitializeNewWeapon(ItemInfo& laraItem) break; default: - player.RightArm.FrameBase = g_Level.Anims[laraItem.Animation.AnimNumber].FramePtr; - player.LeftArm.FrameBase = g_Level.Anims[laraItem.Animation.AnimNumber].FramePtr; + player.RightArm.FrameBase = GetAnimData(laraItem).FramePtr; + player.LeftArm.FrameBase = GetAnimData(laraItem).FramePtr; break; } } diff --git a/TombEngine/Game/Lara/lara_flare.cpp b/TombEngine/Game/Lara/lara_flare.cpp index 63a970e71..84315bf16 100644 --- a/TombEngine/Game/Lara/lara_flare.cpp +++ b/TombEngine/Game/Lara/lara_flare.cpp @@ -126,7 +126,7 @@ void UndrawFlare(ItemInfo& laraItem) if (laraItem.Animation.AnimNumber == LA_STAND_IDLE) { laraItem.Animation.AnimNumber = LA_DISCARD_FLARE; - flareFrame = armFrame + g_Level.Anims[laraItem.Animation.AnimNumber].frameBase; + flareFrame = armFrame + GetAnimData(laraItem).frameBase; laraItem.Animation.FrameNumber = flareFrame; player.Flare.Frame = flareFrame; } @@ -135,7 +135,7 @@ void UndrawFlare(ItemInfo& laraItem) { player.Flare.ControlLeft = false; - if (flareFrame >= (g_Level.Anims[laraItem.Animation.AnimNumber].frameBase + 31)) // 31 = Last frame. + if (flareFrame >= (GetAnimData(laraItem).frameBase + 31)) // 31 = Last frame. { player.Control.Weapon.RequestGunType = player.Control.Weapon.LastGunType; player.Control.Weapon.GunType = player.Control.Weapon.LastGunType; @@ -146,8 +146,8 @@ void UndrawFlare(ItemInfo& laraItem) player.TargetEntity = nullptr; player.LeftArm.Locked = player.RightArm.Locked = false; - SetAnimation(&laraItem, LA_STAND_IDLE); - player.Flare.Frame = g_Level.Anims[laraItem.Animation.AnimNumber].frameBase; + SetAnimation(laraItem, LA_STAND_IDLE); + player.Flare.Frame = GetAnimData(laraItem).frameBase; return; } @@ -281,27 +281,27 @@ void DrawFlare(ItemInfo& laraItem) void SetFlareArm(ItemInfo& laraItem, int armFrame) { auto& player = *GetLaraInfo(&laraItem); - int flareAnimNum = Objects[ID_FLARE_ANIM].animIndex; + int flareAnimNumber = Objects[ID_FLARE_ANIM].animIndex; if (armFrame >= 95) { - flareAnimNum += 4; + flareAnimNumber += 4; } else if (armFrame >= 72) { - flareAnimNum += 3; + flareAnimNumber += 3; } else if (armFrame >= 33) { - flareAnimNum += 2; + flareAnimNumber += 2; } else if (armFrame >= 1) { - flareAnimNum += 1; + flareAnimNumber += 1; } - player.LeftArm.AnimNumber = flareAnimNum; - player.LeftArm.FrameBase = g_Level.Anims[flareAnimNum].FramePtr; + player.LeftArm.AnimNumber = flareAnimNumber; + player.LeftArm.FrameBase = GetAnimData(flareAnimNumber).FramePtr; } void CreateFlare(ItemInfo& laraItem, GAME_OBJECT_ID objectID, bool isThrown) diff --git a/TombEngine/Game/Lara/lara_objects.cpp b/TombEngine/Game/Lara/lara_objects.cpp index 92e26e2f0..e1fc79b76 100644 --- a/TombEngine/Game/Lara/lara_objects.cpp +++ b/TombEngine/Game/Lara/lara_objects.cpp @@ -547,7 +547,7 @@ void lara_col_rope_swing(ItemInfo* item, CollisionInfo* coll) item->Animation.TargetState = LS_ROPE_IDLE; item->Animation.ActiveState = LS_ROPE_IDLE; item->Animation.AnimNumber = LA_JUMP_UP_TO_ROPE_END; - item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.FrameNumber = GetAnimData(item).frameBase; } if (TrInput & IN_JUMP) diff --git a/TombEngine/Game/Lara/lara_one_gun.cpp b/TombEngine/Game/Lara/lara_one_gun.cpp index 8d1bb55b3..f90ce2f5f 100644 --- a/TombEngine/Game/Lara/lara_one_gun.cpp +++ b/TombEngine/Game/Lara/lara_one_gun.cpp @@ -475,7 +475,7 @@ void DrawShotgun(ItemInfo& laraItem, LaraWeaponType weaponType) if (weaponItemPtr->Animation.ActiveState != WEAPON_STATE_AIM && weaponItemPtr->Animation.ActiveState != WEAPON_STATE_UNDERWATER_AIM) { - if ((weaponItemPtr->Animation.FrameNumber - g_Level.Anims[weaponItemPtr->Animation.AnimNumber].frameBase) == Weapons[(int)weaponType].DrawFrame) + if ((weaponItemPtr->Animation.FrameNumber - GetAnimData(weaponItemPtr).frameBase) == Weapons[(int)weaponType].DrawFrame) { DrawShotgunMeshes(laraItem, weaponType); } @@ -489,8 +489,8 @@ void DrawShotgun(ItemInfo& laraItem, LaraWeaponType weaponType) ReadyShotgun(laraItem, weaponType); } - player.LeftArm.FrameBase = player.RightArm.FrameBase = g_Level.Anims[weaponItemPtr->Animation.AnimNumber].FramePtr; - player.LeftArm.FrameNumber = player.RightArm.FrameNumber = weaponItemPtr->Animation.FrameNumber - g_Level.Anims[weaponItemPtr->Animation.AnimNumber].frameBase; + player.LeftArm.FrameBase = player.RightArm.FrameBase = GetAnimData(weaponItemPtr).FramePtr; + player.LeftArm.FrameNumber = player.RightArm.FrameNumber = weaponItemPtr->Animation.FrameNumber - GetAnimData(weaponItemPtr).frameBase; player.LeftArm.AnimNumber = player.RightArm.AnimNumber = weaponItemPtr->Animation.AnimNumber; } @@ -517,19 +517,19 @@ void UndrawShotgun(ItemInfo& laraItem, LaraWeaponType weaponType) } else if (item.Animation.ActiveState == WEAPON_STATE_UNDRAW) { - if ((item.Animation.FrameNumber - g_Level.Anims[item.Animation.AnimNumber].frameBase) == 21 || - (weaponType == LaraWeaponType::GrenadeLauncher && (item.Animation.FrameNumber - g_Level.Anims[item.Animation.AnimNumber].frameBase) == 15)) + if (item.Animation.FrameNumber - GetAnimData(item).frameBase == 21 || + (weaponType == LaraWeaponType::GrenadeLauncher && item.Animation.FrameNumber - GetAnimData(item).frameBase == 15)) { UndrawShotgunMeshes(laraItem, weaponType); } } - player.LeftArm.FrameBase = - player.RightArm.FrameBase = g_Level.Anims[item.Animation.AnimNumber].FramePtr; - player.LeftArm.FrameNumber = - player.RightArm.FrameNumber = item.Animation.FrameNumber - g_Level.Anims[item.Animation.AnimNumber].frameBase; - player.LeftArm.AnimNumber = - player.RightArm.AnimNumber = item.Animation.AnimNumber; + player.RightArm.FrameBase = + player.LeftArm.FrameBase = GetAnimData(item).FramePtr; + player.RightArm.FrameNumber = + player.LeftArm.FrameNumber = item.Animation.FrameNumber - GetAnimData(item).frameBase; + player.RightArm.AnimNumber = + player.LeftArm.AnimNumber = player.RightArm.AnimNumber; } void DrawShotgunMeshes(ItemInfo& laraItem, LaraWeaponType weaponType) diff --git a/TombEngine/Game/Lara/lara_overhang.cpp b/TombEngine/Game/Lara/lara_overhang.cpp index 0a1be8b01..e62d84b4e 100644 --- a/TombEngine/Game/Lara/lara_overhang.cpp +++ b/TombEngine/Game/Lara/lara_overhang.cpp @@ -699,7 +699,7 @@ void lara_as_sclimbstart(ItemInfo* item, CollisionInfo* coll) int distance = TestLaraWall(item, 0, SECTOR(1.5f), 0) ? SECTOR(1) : CLICK(6.5f); - if (item->Animation.FrameNumber < g_Level.Anims[item->Animation.AnimNumber].frameEnd) + if (item->Animation.FrameNumber < GetAnimData(item).frameEnd) { Camera.targetDistance = distance; Camera.targetElevation = int(SECTOR(3) * frac); @@ -753,7 +753,7 @@ void lara_as_sclimbstop(ItemInfo* item, CollisionInfo* coll) Camera.flags = CF_FOLLOW_CENTER; - if (item->Animation.FrameNumber < g_Level.Anims[item->Animation.AnimNumber].frameEnd) + if (item->Animation.FrameNumber < GetAnimData(item).frameEnd) { Camera.targetAngle = (short)(-ANGLE(90.0f) * frac); diff --git a/TombEngine/Game/Lara/lara_two_guns.cpp b/TombEngine/Game/Lara/lara_two_guns.cpp index 5aee8c317..90932744d 100644 --- a/TombEngine/Game/Lara/lara_two_guns.cpp +++ b/TombEngine/Game/Lara/lara_two_guns.cpp @@ -89,7 +89,7 @@ static void SetArmInfo(const ItemInfo& laraItem, ArmInfo& arm, int frame) } arm.FrameNumber = frame; - arm.FrameBase = g_Level.Anims[arm.AnimNumber].FramePtr; + arm.FrameBase = GetAnimData(arm.AnimNumber).FramePtr; } static void ReadyPistols(ItemInfo& laraItem, LaraWeaponType weaponType) diff --git a/TombEngine/Game/animation.cpp b/TombEngine/Game/animation.cpp index 2db126bdb..3b211ec2b 100644 --- a/TombEngine/Game/animation.cpp +++ b/TombEngine/Game/animation.cpp @@ -406,9 +406,9 @@ void SetAnimation(ItemInfo& item, GAME_OBJECT_ID animObjectID, int animNumber, i if (animIndex < 0 || animIndex >= g_Level.Anims.size()) { TENLog( - std::string("Attempted to set missing animation ") + std::to_string(animNumber) + - (animObjectID == item.ObjectNumber ? std::string() : std::string(" from object ") + GetObjectName(animObjectID)) + - std::string(" for object ") + GetObjectName(item.ObjectNumber), + "Attempted to set missing animation " + std::to_string(animNumber) + + ((animObjectID == item.ObjectNumber) ? "" : (" from object " + GetObjectName(animObjectID))) + + " for object " + GetObjectName(item.ObjectNumber), LogLevel::Warning); return; @@ -442,23 +442,23 @@ void SetAnimation(ItemInfo* item, int animNumber, int frameNumber) SetAnimation(*item, item->ObjectNumber, animNumber, frameNumber); } -AnimData& GetAnimData(int animIndex) +const AnimData& GetAnimData(int animIndex) { return g_Level.Anims[animIndex]; } -AnimData& GetAnimData(GAME_OBJECT_ID objectID, int animNumber) +const AnimData& GetAnimData(GAME_OBJECT_ID objectID, int animNumber) { const auto& object = Objects[objectID]; return GetAnimData(object, animNumber); } -AnimData& GetAnimData(const ObjectInfo& object, int animNumber) +const AnimData& GetAnimData(const ObjectInfo& object, int animNumber) { return g_Level.Anims[object.animIndex + animNumber]; } -AnimData& GetAnimData(const ItemInfo& item, int animNumber) +const AnimData& GetAnimData(const ItemInfo& item, int animNumber) { if (animNumber == NO_ANIM) return GetAnimData(item.Animation.AnimNumber); @@ -467,6 +467,11 @@ AnimData& GetAnimData(const ItemInfo& item, int animNumber) return GetAnimData(object, animNumber); } +const AnimData& GetAnimData(const ItemInfo* item, int animNumber) +{ + return (GetAnimData(*item, animNumber)); +} + AnimFrameInterpData GetFrameInterpData(const ItemInfo& item) { const auto& anim = GetAnimData(item); @@ -478,8 +483,8 @@ AnimFrameInterpData GetFrameInterpData(const ItemInfo& item) // Calculate keyframe numbers defining interpolated frame and get pointers to them. int frame0 = (int)floor(frameNumberNorm); int frame1 = (int)ceil(frameNumberNorm); - auto* framePtr0 = &g_Level.Frames[anim.FramePtr + frame0]; - auto* framePtr1 = &g_Level.Frames[anim.FramePtr + frame1]; + const auto* framePtr0 = &g_Level.Frames[anim.FramePtr + frame0]; + const auto* framePtr1 = &g_Level.Frames[anim.FramePtr + frame1]; // Calculate interpolation alpha between keyframes. float alpha = (1.0f / anim.Interpolation) * (frameNumber % anim.Interpolation); @@ -488,12 +493,12 @@ AnimFrameInterpData GetFrameInterpData(const ItemInfo& item) return AnimFrameInterpData{ framePtr0, framePtr1, alpha }; } -AnimFrame& GetAnimFrame(const ItemInfo& item, int animNumber, int frameNumber) +const AnimFrame& GetAnimFrame(const ItemInfo& item, int animNumber, int frameNumber) { return *GetFrame(item.ObjectNumber, animNumber, frameNumber); } -AnimFrame* GetFrame(GAME_OBJECT_ID objectID, int animNumber, int frameNumber) +const AnimFrame* GetFrame(GAME_OBJECT_ID objectID, int animNumber, int frameNumber) { const auto& object = Objects[objectID]; @@ -508,39 +513,25 @@ AnimFrame* GetFrame(GAME_OBJECT_ID objectID, int animNumber, int frameNumber) frameNumber = frameCount; // Interpolate and return frame pointer. - auto* framePtr = &g_Level.Frames[anim.FramePtr]; + const auto* framePtr = &g_Level.Frames[anim.FramePtr]; framePtr += frameNumber / anim.Interpolation; return framePtr; } -AnimFrame* GetFirstFrame(GAME_OBJECT_ID objectID, int animNumber) +const AnimFrame* GetFirstFrame(GAME_OBJECT_ID objectID, int animNumber) { return GetFrame(objectID, animNumber, 0); } -AnimFrame* GetLastFrame(GAME_OBJECT_ID objectID, int animNumber) +const AnimFrame* GetLastFrame(GAME_OBJECT_ID objectID, int animNumber) { return GetFrame(objectID, animNumber, INT_MAX); } -AnimFrame& GetBestFrame(const ItemInfo& item) +const AnimFrame& GetBestFrame(const ItemInfo& item) { auto frameData = GetFrameInterpData(item); - if (frameData.Alpha <= 0.5f) - return *frameData.FramePtr0; - else - return *frameData.FramePtr1; -} - -int GetFrameNumber(const ItemInfo& item) -{ - const auto& anim = GetAnimData(item); - return (item.Animation.FrameNumber - anim.frameBase); -} - -int GetFrameNumber(ItemInfo* item) -{ - return GetFrameNumber(*item); + return ((frameData.Alpha <= 0.5f) ? *frameData.FramePtr0 : *frameData.FramePtr1); } int GetAnimNumber(const ItemInfo& item) @@ -555,6 +546,17 @@ int GetAnimIndex(const ItemInfo& item, int animNumber) return (object.animIndex + animNumber); } +int GetFrameNumber(const ItemInfo& item) +{ + const auto& anim = GetAnimData(item); + return (item.Animation.FrameNumber - anim.frameBase); +} + +int GetFrameNumber(ItemInfo* item) +{ + return GetFrameNumber(*item); +} + int GetFrameIndex(ItemInfo* item, int frameNumber) { int animNumber = item->Animation.AnimNumber - Objects[item->Animation.AnimObjectID].animIndex; @@ -575,10 +577,7 @@ int GetFrameCount(int animIndex) return 0; const auto& anim = GetAnimData(animIndex); - - int end = anim.frameEnd; - int base = anim.frameBase; - return (end - base); + return (anim.frameEnd - anim.frameBase); } int GetNextAnimState(ItemInfo* item) diff --git a/TombEngine/Game/animation.h b/TombEngine/Game/animation.h index 42266a676..d8cdf5469 100644 --- a/TombEngine/Game/animation.h +++ b/TombEngine/Game/animation.h @@ -75,9 +75,9 @@ struct AnimData struct AnimFrameInterpData { - AnimFrame* FramePtr0 = nullptr; - AnimFrame* FramePtr1 = nullptr; - float Alpha = 0.0f; + const AnimFrame* FramePtr0 = nullptr; + const AnimFrame* FramePtr1 = nullptr; + float Alpha = 0.0f; }; struct BoneMutator @@ -115,10 +115,18 @@ void SetAnimation(ItemInfo& item, int animNumber, int frameNumber = 0); void SetAnimation(ItemInfo* item, int animNumber, int frameNumber = 0); // Deprecated. // Getters -AnimData& GetAnimData(int animIndex); // Deprecated. -AnimData& GetAnimData(GAME_OBJECT_ID objectID, int animNumber); -AnimData& GetAnimData(const ObjectInfo& object, int animNumber); -AnimData& GetAnimData(const ItemInfo& item, int animNumber = NO_ANIM); +const AnimData& GetAnimData(int animIndex); // Deprecated. +const AnimData& GetAnimData(GAME_OBJECT_ID objectID, int animNumber); +const AnimData& GetAnimData(const ObjectInfo& object, int animNumber); +const AnimData& GetAnimData(const ItemInfo& item, int animNumber = NO_ANIM); +const AnimData& GetAnimData(const ItemInfo* item, int animNumber = NO_ANIM); // Deprecated. + +AnimFrameInterpData GetFrameInterpData(const ItemInfo& item); +const AnimFrame& GetAnimFrame(const ItemInfo& item, int animNumber, int frameNumber); +const AnimFrame* GetFrame(GAME_OBJECT_ID objectID, int animNumber, int frameNumber); +const AnimFrame* GetFirstFrame(GAME_OBJECT_ID objectID, int animNumber); +const AnimFrame* GetLastFrame(GAME_OBJECT_ID objectID, int animNumber); +const AnimFrame& GetBestFrame(const ItemInfo& item); int GetAnimNumber(const ItemInfo& item); int GetAnimIndex(const ItemInfo& item, int animNumber); @@ -134,13 +142,6 @@ int GetNextAnimState(ItemInfo* item); int GetNextAnimState(int objectID, int animNumber); bool GetStateDispatch(ItemInfo* item, const AnimData& anim); -AnimFrameInterpData GetFrameInterpData(const ItemInfo& item); -AnimFrame& GetAnimFrame(const ItemInfo& item, int animNumber, int frameNumber); -AnimFrame* GetFrame(GAME_OBJECT_ID objectID, int animNumber, int frameNumber); -AnimFrame* GetFirstFrame(GAME_OBJECT_ID objectID, int animNumber); -AnimFrame* GetLastFrame(GAME_OBJECT_ID objectID, int animNumber); -AnimFrame& GetBestFrame(const ItemInfo& item); - void ClampRotation(Pose& outPose, short angle, short rotation); void DrawAnimatingItem(ItemInfo* item); diff --git a/TombEngine/Game/collision/collide_item.cpp b/TombEngine/Game/collision/collide_item.cpp index 831061b46..e409e7a74 100644 --- a/TombEngine/Game/collision/collide_item.cpp +++ b/TombEngine/Game/collision/collide_item.cpp @@ -171,7 +171,7 @@ bool GetCollidedObjects(ItemInfo* collidingItem, int radius, bool onlyVisible, I continue; } - /*this is awful*/ + // TODO: This is awful and we need a better system. if (item->ObjectNumber == ID_UPV && item->HitPoints == 1) { itemNumber = item->NextItem; @@ -182,14 +182,12 @@ bool GetCollidedObjects(ItemInfo* collidingItem, int radius, bool onlyVisible, I itemNumber = item->NextItem; continue; } - /*we need a better system*/ int dx = collidingItem->Pose.Position.x - item->Pose.Position.x; int dy = collidingItem->Pose.Position.y - item->Pose.Position.y; int dz = collidingItem->Pose.Position.z - item->Pose.Position.z; - // TODO: Don't modify object animation data!!! - auto& bounds = GetBestFrame(*item).BoundingBox; + auto bounds = GetBestFrame(*item).BoundingBox; if (dx >= -BLOCK(2) && dx <= BLOCK(2) && dy >= -BLOCK(2) && dy <= BLOCK(2) && @@ -203,6 +201,7 @@ bool GetCollidedObjects(ItemInfo* collidingItem, int radius, bool onlyVisible, I int rx = (dx * cosY) - (dz * sinY); int rz = (dz * cosY) + (dx * sinY); + // TODO: Modify asset to avoid hardcoded bounds change. -- Sezz 2023.04.30 if (item->ObjectNumber == ID_TURN_SWITCH) { bounds.X1 = -CLICK(1); @@ -231,6 +230,7 @@ bool GetCollidedObjects(ItemInfo* collidingItem, int radius, bool onlyVisible, I int rx = (dx * cosY) - (dz * sinY); int rz = (dz * cosY) + (dx * sinY); + // TODO: Modify asset to avoid hardcoded bounds change. -- Sezz 2023.04.30 if (item->ObjectNumber == ID_TURN_SWITCH) { bounds.X1 = -CLICK(1); diff --git a/TombEngine/Game/pickup/pickup.cpp b/TombEngine/Game/pickup/pickup.cpp index 76864fcfa..eec59946a 100644 --- a/TombEngine/Game/pickup/pickup.cpp +++ b/TombEngine/Game/pickup/pickup.cpp @@ -449,7 +449,7 @@ void PickupCollision(short itemNumber, ItemInfo* laraItem, CollisionInfo* coll) } laraItem->Animation.TargetState = LS_UNDERWATER_IDLE; - laraItem->Animation.FrameNumber = g_Level.Anims[laraItem->Animation.AnimNumber].frameBase; + laraItem->Animation.FrameNumber = GetAnimData(laraItem).frameBase; lara->Control.IsMoving = false; lara->Control.HandStatus = HandStatus::Busy; } @@ -507,10 +507,11 @@ void PickupCollision(short itemNumber, ItemInfo* laraItem, CollisionInfo* coll) return; } } - - bool flag = false; - GameBoundingBox* plinth = nullptr; + item->Pose.Orientation.x = 0; + const GameBoundingBox* plinthBounds = nullptr; + bool flag = false; + switch (triggerFlags) { // Pick up from hole in wall. @@ -598,19 +599,19 @@ void PickupCollision(short itemNumber, ItemInfo* laraItem, CollisionInfo* coll) case 4: case 7: case 8: - plinth = FindPlinth(item); + plinthBounds = FindPlinth(item); - if (!plinth) + if (plinthBounds == nullptr) { item->Pose.Orientation = prevOrient; return; } - PlinthPickUpBounds.BoundingBox.X1 = plinth->X1; - PlinthPickUpBounds.BoundingBox.X2 = plinth->X2; + PlinthPickUpBounds.BoundingBox.X1 = plinthBounds->X1; + PlinthPickUpBounds.BoundingBox.X2 = plinthBounds->X2; PlinthPickUpBounds.BoundingBox.Y2 = laraItem->Pose.Position.y - item->Pose.Position.y + 100; - PlinthPickUpBounds.BoundingBox.Z2 = plinth->Z2 + 320; - PlinthPickUpPosition.z = -200 - plinth->Z2; + PlinthPickUpBounds.BoundingBox.Z2 = plinthBounds->Z2 + 320; + PlinthPickUpPosition.z = -200 - plinthBounds->Z2; // HACK: Until we refactor a way plinth collision is detected, this must be here // to prevent false positives with two stacked plinths -- Lwmte, 16.06.22 @@ -775,7 +776,7 @@ void PickupCollision(short itemNumber, ItemInfo* laraItem, CollisionInfo* coll) if (flag) { - laraItem->Animation.FrameNumber = g_Level.Anims[laraItem->Animation.AnimNumber].frameBase; + laraItem->Animation.FrameNumber = GetAnimData(laraItem).frameBase; ResetPlayerFlex(laraItem); lara->Control.IsMoving = false; lara->Control.HandStatus = HandStatus::Busy; @@ -1021,7 +1022,7 @@ void PickupControl(short itemNumber) } } -GameBoundingBox* FindPlinth(ItemInfo* item) +const GameBoundingBox* FindPlinth(ItemInfo* item) { auto* room = &g_Level.Rooms[item->RoomNumber]; @@ -1066,9 +1067,13 @@ GameBoundingBox* FindPlinth(ItemInfo* item) } if (itemNumber == NO_ITEM) + { return nullptr; + } else + { return &GetBestFrame(g_Level.Items[itemNumber]).BoundingBox; + } } void InitializePickup(short itemNumber) @@ -1207,7 +1212,7 @@ void SearchObjectCollision(short itemNumber, ItemInfo* laraItem, CollisionInfo* { ResetPlayerFlex(laraItem); laraItem->Animation.AnimNumber = SearchAnims[objectNumber]; - laraItem->Animation.FrameNumber = g_Level.Anims[laraItem->Animation.AnimNumber].frameBase; + laraItem->Animation.FrameNumber = GetAnimData(laraItem).frameBase; laraItem->Animation.ActiveState = LS_MISC_CONTROL; lara->Control.IsMoving = false; lara->Control.HandStatus = HandStatus::Busy; @@ -1221,7 +1226,7 @@ void SearchObjectCollision(short itemNumber, ItemInfo* laraItem, CollisionInfo* } item->Animation.AnimNumber = Objects[item->ObjectNumber].animIndex + 1; - item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.FrameNumber = GetAnimData(item).frameBase; AnimateItem(item); } else @@ -1246,7 +1251,7 @@ void SearchObjectControl(short itemNumber) if (item->ObjectNumber != ID_SEARCH_OBJECT4 || item->ItemFlags[0] == 1) AnimateItem(item); - int frameNumber = item->Animation.FrameNumber - g_Level.Anims[item->Animation.AnimNumber].frameBase; + int frameNumber = item->Animation.FrameNumber - GetAnimData(item).frameBase; if (item->ObjectNumber == ID_SEARCH_OBJECT1) { if (frameNumber > 0) diff --git a/TombEngine/Game/pickup/pickup.h b/TombEngine/Game/pickup/pickup.h index d21345951..99ce4c71c 100644 --- a/TombEngine/Game/pickup/pickup.h +++ b/TombEngine/Game/pickup/pickup.h @@ -20,7 +20,7 @@ void PickupCollision(short itemNumber, ItemInfo* laraItem, CollisionInfo* coll); void RegeneratePickups(); void DropPickups(ItemInfo* item); void CollectMultiplePickups(int itemNumber); -GameBoundingBox* FindPlinth(ItemInfo* item); +const GameBoundingBox* FindPlinth(ItemInfo* item); void PickupControl(short itemNumber); diff --git a/TombEngine/Objects/Effects/flame_emitters.cpp b/TombEngine/Objects/Effects/flame_emitters.cpp index 698b36d1a..1aa401746 100644 --- a/TombEngine/Objects/Effects/flame_emitters.cpp +++ b/TombEngine/Objects/Effects/flame_emitters.cpp @@ -576,7 +576,7 @@ namespace TEN::Entities::Effects } laraItem->Animation.ActiveState = LS_MISC_CONTROL; - laraItem->Animation.FrameNumber = g_Level.Anims[laraItem->Animation.AnimNumber].frameBase; + laraItem->Animation.FrameNumber = GetAnimData(laraItem).frameBase; Lara.Flare.ControlLeft = false; Lara.LeftArm.Locked = true; Lara.Context.InteractedItem = itemNumber; @@ -591,7 +591,7 @@ namespace TEN::Entities::Effects { if (laraItem->Animation.AnimNumber >= LA_TORCH_LIGHT_1 && laraItem->Animation.AnimNumber <= LA_TORCH_LIGHT_5) { - if (laraItem->Animation.FrameNumber - g_Level.Anims[laraItem->Animation.AnimNumber].frameBase == 40) + if (laraItem->Animation.FrameNumber - GetAnimData(laraItem).frameBase == 40) { TestTriggers(item, true, item->Flags & IFLAG_ACTIVATION_MASK); diff --git a/TombEngine/Objects/Generic/Object/burning_torch.cpp b/TombEngine/Objects/Generic/Object/burning_torch.cpp index b7558f9c9..d0180af7b 100644 --- a/TombEngine/Objects/Generic/Object/burning_torch.cpp +++ b/TombEngine/Objects/Generic/Object/burning_torch.cpp @@ -170,7 +170,7 @@ namespace TEN::Entities::Generic if (lara->Flare.ControlLeft) lara->Control.HandStatus = HandStatus::WeaponReady; - lara->LeftArm.FrameBase = g_Level.Anims[lara->LeftArm.AnimNumber].FramePtr; + lara->LeftArm.FrameBase = GetAnimData(lara->LeftArm.AnimNumber).FramePtr; if (lara->Torch.IsLit) { @@ -199,7 +199,7 @@ namespace TEN::Entities::Generic lara->LeftArm.AnimNumber = Objects[ID_LARA_TORCH_ANIM].animIndex; lara->LeftArm.Locked = false; lara->LeftArm.FrameNumber = 0; - lara->LeftArm.FrameBase = g_Level.Anims[lara->LeftArm.AnimNumber].FramePtr; + lara->LeftArm.FrameBase = GetAnimData(lara->LeftArm.AnimNumber).FramePtr; laraItem->Model.MeshIndex[LM_LHAND] = Objects[ID_LARA_TORCH_ANIM].meshIndex + LM_LHAND; } @@ -357,7 +357,7 @@ namespace TEN::Entities::Generic } laraItem->Animation.ActiveState = LS_MISC_CONTROL; - laraItem->Animation.FrameNumber = g_Level.Anims[laraItem->Animation.AnimNumber].frameBase; + laraItem->Animation.FrameNumber = GetAnimData(laraItem).frameBase; lara->Flare.ControlLeft = false; lara->LeftArm.Locked = true; lara->Context.InteractedItem = itemNumber; @@ -372,7 +372,7 @@ namespace TEN::Entities::Generic if (laraItem->Animation.AnimNumber >= LA_TORCH_LIGHT_1 && laraItem->Animation.AnimNumber <= LA_TORCH_LIGHT_5) { - if ((laraItem->Animation.FrameNumber - g_Level.Anims[laraItem->Animation.AnimNumber].frameBase) == 40) + if ((laraItem->Animation.FrameNumber - GetAnimData(laraItem).frameBase) == 40) { TestTriggers(torchItem, true, torchItem->Flags & IFLAG_ACTIVATION_MASK); torchItem->Flags |= CODE_BITS; diff --git a/TombEngine/Objects/Generic/Object/generic_trapdoor.cpp b/TombEngine/Objects/Generic/Object/generic_trapdoor.cpp index b056f2c2c..73f836321 100644 --- a/TombEngine/Objects/Generic/Object/generic_trapdoor.cpp +++ b/TombEngine/Objects/Generic/Object/generic_trapdoor.cpp @@ -56,7 +56,7 @@ void TrapDoorCollision(short itemNumber, ItemInfo* laraItem, CollisionInfo* coll auto* trapDoorItem = &g_Level.Items[itemNumber]; if (trapDoorItem->Animation.ActiveState == 1 && - trapDoorItem->Animation.FrameNumber == g_Level.Anims[trapDoorItem->Animation.AnimNumber].frameEnd) + trapDoorItem->Animation.FrameNumber == GetAnimData(trapDoorItem).frameEnd) { ObjectCollision(itemNumber, laraItem, coll); } @@ -90,7 +90,7 @@ void CeilingTrapDoorCollision(short itemNumber, ItemInfo* laraItem, CollisionInf laraItem->Animation.Velocity.y = 0; laraItem->Animation.IsAirborne = false; laraItem->Animation.AnimNumber = LA_TRAPDOOR_CEILING_OPEN; - laraItem->Animation.FrameNumber = g_Level.Anims[laraItem->Animation.AnimNumber].frameBase; + laraItem->Animation.FrameNumber = GetAnimData(laraItem).frameBase; laraItem->Animation.ActiveState = LS_FREEFALL_BIS; laraInfo->Control.HandStatus = HandStatus::Busy; AddActiveItem(itemNumber); @@ -110,7 +110,7 @@ void CeilingTrapDoorCollision(short itemNumber, ItemInfo* laraItem, CollisionInf } if (trapDoorItem->Animation.ActiveState == 1 && - trapDoorItem->Animation.FrameNumber == g_Level.Anims[trapDoorItem->Animation.AnimNumber].frameEnd) + trapDoorItem->Animation.FrameNumber == GetAnimData(trapDoorItem).frameEnd) { ObjectCollision(itemNumber, laraItem, coll); } @@ -134,7 +134,7 @@ void FloorTrapDoorCollision(short itemNumber, ItemInfo* laraItem, CollisionInfo* { ResetPlayerFlex(laraItem); laraItem->Animation.AnimNumber = LA_TRAPDOOR_FLOOR_OPEN; - laraItem->Animation.FrameNumber = g_Level.Anims[laraItem->Animation.AnimNumber].frameBase; + laraItem->Animation.FrameNumber = GetAnimData(laraItem).frameBase; laraItem->Animation.ActiveState = LS_TRAPDOOR_FLOOR_OPEN; laraInfo->Control.IsMoving = false; laraInfo->Control.HandStatus = HandStatus::Busy; @@ -153,7 +153,9 @@ void FloorTrapDoorCollision(short itemNumber, ItemInfo* laraItem, CollisionInfo* ForcedFixedCamera.RoomNumber = trapDoorItem->RoomNumber; } else - laraInfo->Context.InteractedItem =itemNumber; + { + laraInfo->Context.InteractedItem = itemNumber; + } } } else @@ -162,7 +164,7 @@ void FloorTrapDoorCollision(short itemNumber, ItemInfo* laraItem, CollisionInfo* UseForcedFixedCamera = 0; } - if (trapDoorItem->Animation.ActiveState == 1 && trapDoorItem->Animation.FrameNumber == g_Level.Anims[trapDoorItem->Animation.AnimNumber].frameEnd) + if (trapDoorItem->Animation.ActiveState == 1 && trapDoorItem->Animation.FrameNumber == GetAnimData(trapDoorItem).frameEnd) ObjectCollision(itemNumber, laraItem, coll); } @@ -173,9 +175,13 @@ void TrapDoorControl(short itemNumber) if (TriggerActive(trapDoorItem)) { if (!trapDoorItem->Animation.ActiveState && trapDoorItem->TriggerFlags >= 0) + { trapDoorItem->Animation.TargetState = 1; - else if (trapDoorItem->Animation.FrameNumber == g_Level.Anims[trapDoorItem->Animation.AnimNumber].frameEnd && CurrentLevel == 14 && trapDoorItem->ObjectNumber == ID_TRAPDOOR1) + } + else if (trapDoorItem->Animation.FrameNumber == GetAnimData(trapDoorItem).frameEnd && CurrentLevel == 14 && trapDoorItem->ObjectNumber == ID_TRAPDOOR1) + { trapDoorItem->Status = ITEM_INVISIBLE; + } } else { @@ -188,9 +194,13 @@ void TrapDoorControl(short itemNumber) AnimateItem(trapDoorItem); if (trapDoorItem->Animation.ActiveState == 1 && (trapDoorItem->ItemFlags[2] || JustLoaded)) + { OpenTrapDoor(itemNumber); + } else if (!trapDoorItem->Animation.ActiveState && !trapDoorItem->ItemFlags[2]) + { CloseTrapDoor(itemNumber); + } } void CloseTrapDoor(short itemNumber) diff --git a/TombEngine/Objects/Generic/Object/objects.cpp b/TombEngine/Objects/Generic/Object/objects.cpp index ef9a3d365..e74396a06 100644 --- a/TombEngine/Objects/Generic/Object/objects.cpp +++ b/TombEngine/Objects/Generic/Object/objects.cpp @@ -99,7 +99,7 @@ void TightropeCollision(short itemNumber, ItemInfo* laraItem, CollisionInfo* col { laraItem->Animation.ActiveState = LS_TIGHTROPE_ENTER; laraItem->Animation.AnimNumber = LA_TIGHTROPE_START; - laraItem->Animation.FrameNumber = g_Level.Anims[laraItem->Animation.AnimNumber].frameBase; + laraItem->Animation.FrameNumber = GetAnimData(laraItem).frameBase; laraInfo->Control.IsMoving = false; ResetPlayerFlex(laraItem); laraInfo->Control.Tightrope.Balance = 0; @@ -147,7 +147,7 @@ void HorizontalBarCollision(short itemNumber, ItemInfo* laraItem, CollisionInfo* { laraItem->Animation.ActiveState = LS_MISC_CONTROL; laraItem->Animation.AnimNumber = LA_SWINGBAR_GRAB; - laraItem->Animation.FrameNumber = g_Level.Anims[laraItem->Animation.AnimNumber].frameBase; + laraItem->Animation.FrameNumber = GetAnimData(laraItem).frameBase; laraItem->Animation.Velocity.y = false; laraItem->Animation.IsAirborne = false; @@ -244,7 +244,7 @@ void AnimatingControl(short itemNumber) item->Status = ITEM_ACTIVE; AnimateItem(item); - // TODO: ID_SHOOT_SWITCH2 probably the bell in Trajan Markets, use LUA for that + // TODO: ID_SHOOT_SWITCH2 is probably the bell in Trajan Markets, use Lua for that. /*if (item->frameNumber >= g_Level.Anims[item->animNumber].frameEnd) { item->frameNumber = g_Level.Anims[item->animNumber].frameBase; diff --git a/TombEngine/Objects/Generic/Object/rope.cpp b/TombEngine/Objects/Generic/Object/rope.cpp index 6718ff3e0..29d9b90ee 100644 --- a/TombEngine/Objects/Generic/Object/rope.cpp +++ b/TombEngine/Objects/Generic/Object/rope.cpp @@ -189,8 +189,8 @@ namespace TEN::Entities::Generic { laraItem->Animation.AnimNumber = LA_REACH_TO_ROPE_SWING; laraItem->Animation.ActiveState = LS_ROPE_SWING; - laraInfo->Control.Rope.Frame = g_Level.Anims[LA_ROPE_SWING].frameBase + 32 << 8; - laraInfo->Control.Rope.DFrame = g_Level.Anims[LA_ROPE_SWING].frameBase + 60 << 8; + laraInfo->Control.Rope.Frame = GetAnimData(*laraItem, LA_ROPE_SWING).frameBase + 32 << 8; + laraInfo->Control.Rope.DFrame = GetAnimData(*laraItem, LA_ROPE_SWING).frameBase + 60 << 8; } else { @@ -198,7 +198,7 @@ namespace TEN::Entities::Generic laraItem->Animation.ActiveState = LS_ROPE_IDLE; } - laraItem->Animation.FrameNumber = g_Level.Anims[laraItem->Animation.AnimNumber].frameBase; + laraItem->Animation.FrameNumber = GetAnimData(laraItem).frameBase; laraItem->Animation.Velocity.y = 0; laraItem->Animation.IsAirborne = false; @@ -526,7 +526,7 @@ namespace TEN::Entities::Generic Lara.Control.Rope.ArcFront = Lara.Control.Rope.LastX; Lara.Control.Rope.Direction = 0; Lara.Control.Rope.MaxXBackward = 0; - int frame = 15 * Lara.Control.Rope.MaxXForward / 18000 + g_Level.Anims[LA_ROPE_SWING].frameBase + 47 << 8; + int frame = 15 * Lara.Control.Rope.MaxXForward / 18000 + GetAnimData(*item, LA_ROPE_SWING).frameBase + 47 << 8; if (frame > Lara.Control.Rope.DFrame) { @@ -541,7 +541,7 @@ namespace TEN::Entities::Generic else if (Lara.Control.Rope.LastX < 0 && Lara.Control.Rope.Frame == Lara.Control.Rope.DFrame) { RopeSwing = 0; - Lara.Control.Rope.DFrame = 15 * Lara.Control.Rope.MaxXBackward / 18000 + g_Level.Anims[LA_ROPE_SWING].frameBase + 47 << 8; + Lara.Control.Rope.DFrame = 15 * Lara.Control.Rope.MaxXBackward / 18000 + GetAnimData(*item, LA_ROPE_SWING).frameBase + 47 << 8; Lara.Control.Rope.FrameRate = 15 * Lara.Control.Rope.MaxXBackward / 9000 + 1; } else if (Lara.Control.Rope.FrameRate < 512) @@ -558,7 +558,7 @@ namespace TEN::Entities::Generic Lara.Control.Rope.Direction = 1; Lara.Control.Rope.MaxXForward = 0; - int frame = g_Level.Anims[LA_ROPE_SWING].frameBase - 15 * Lara.Control.Rope.MaxXBackward / 18000 + 17 << 8; + int frame = GetAnimData(*item, LA_ROPE_SWING).frameBase - 15 * Lara.Control.Rope.MaxXBackward / 18000 + 17 << 8; if (frame < Lara.Control.Rope.DFrame) { Lara.Control.Rope.DFrame = frame; @@ -572,7 +572,7 @@ namespace TEN::Entities::Generic else if (Lara.Control.Rope.LastX > 0 && Lara.Control.Rope.Frame == Lara.Control.Rope.DFrame) { RopeSwing = 0; - Lara.Control.Rope.DFrame = g_Level.Anims[LA_ROPE_SWING].frameBase - 15 * Lara.Control.Rope.MaxXForward / 18000 + 17 << 8; + Lara.Control.Rope.DFrame = GetAnimData(*item, LA_ROPE_SWING).frameBase - 15 * Lara.Control.Rope.MaxXForward / 18000 + 17 << 8; Lara.Control.Rope.FrameRate = 15 * Lara.Control.Rope.MaxXForward / 9000 + 1; } else if (Lara.Control.Rope.FrameRate < 512) @@ -641,14 +641,14 @@ namespace TEN::Entities::Generic Lara.Control.HandStatus = HandStatus::Free; - if (item->Animation.FrameNumber - g_Level.Anims[LA_ROPE_SWING].frameBase > 42) + if (item->Animation.FrameNumber - GetAnimData(*item, LA_ROPE_SWING).frameBase > 42) item->Animation.AnimNumber = LA_ROPE_SWING_TO_REACH_1; - else if (item->Animation.FrameNumber - g_Level.Anims[LA_ROPE_SWING].frameBase > 21) + else if (item->Animation.FrameNumber - GetAnimData(*item, LA_ROPE_SWING).frameBase > 21) item->Animation.AnimNumber = LA_ROPE_SWING_TO_REACH_2; else item->Animation.AnimNumber = LA_ROPE_SWING_TO_REACH_3; - item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.FrameNumber = GetAnimData(item).frameBase; item->Animation.ActiveState = LS_REACH; item->Animation.TargetState = LS_REACH; Lara.Control.Rope.Ptr = -1; @@ -712,10 +712,10 @@ namespace TEN::Entities::Generic } } - if (item->Animation.AnimNumber == LA_ROPE_DOWN && item->Animation.FrameNumber == g_Level.Anims[item->Animation.AnimNumber].frameEnd) + if (item->Animation.AnimNumber == LA_ROPE_DOWN && item->Animation.FrameNumber == GetAnimData(item).frameEnd) { SoundEffect(SFX_TR4_LARA_POLE_SLIDE_LOOP, &LaraItem->Pose); - item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.FrameNumber = GetAnimData(item).frameBase; Lara.Control.Rope.Flag = 0; ++Lara.Control.Rope.Segment; Lara.Control.Rope.Offset = 0; diff --git a/TombEngine/Objects/Generic/Switches/AirlockSwitch.cpp b/TombEngine/Objects/Generic/Switches/AirlockSwitch.cpp index 655059553..31b642181 100644 --- a/TombEngine/Objects/Generic/Switches/AirlockSwitch.cpp +++ b/TombEngine/Objects/Generic/Switches/AirlockSwitch.cpp @@ -57,7 +57,7 @@ namespace TEN::Entities::Switches } ResetPlayerFlex(laraItem); - laraItem->Animation.FrameNumber = g_Level.Anims[laraItem->Animation.AnimNumber].frameBase; + laraItem->Animation.FrameNumber = GetAnimData(laraItem).frameBase; player.Control.IsMoving = false; player.Control.HandStatus = HandStatus::Busy; diff --git a/TombEngine/Objects/Generic/Switches/cog_switch.cpp b/TombEngine/Objects/Generic/Switches/cog_switch.cpp index 521c59275..338b4fb0a 100644 --- a/TombEngine/Objects/Generic/Switches/cog_switch.cpp +++ b/TombEngine/Objects/Generic/Switches/cog_switch.cpp @@ -87,7 +87,7 @@ namespace TEN::Entities::Switches laraItem->Animation.AnimNumber = LA_COGWHEEL_GRAB; laraItem->Animation.TargetState = LS_COGWHEEL; laraItem->Animation.ActiveState = LS_COGWHEEL; - laraItem->Animation.FrameNumber = g_Level.Anims[laraItem->Animation.AnimNumber].frameBase; + laraItem->Animation.FrameNumber = GetAnimData(laraItem).frameBase; lara->Control.IsMoving = false; lara->Control.HandStatus = HandStatus::Busy; lara->Context.InteractedItem = targetItemNum; @@ -137,7 +137,7 @@ namespace TEN::Entities::Switches if (LaraItem->Animation.AnimNumber == LA_COGWHEEL_PULL) { - if (LaraItem->Animation.FrameNumber == g_Level.Anims[LaraItem->Animation.AnimNumber].frameBase + 10) + if (LaraItem->Animation.FrameNumber == GetAnimData(LaraItem).frameBase + 10) { if (!switchItem->TriggerFlags) { @@ -149,7 +149,7 @@ namespace TEN::Entities::Switches } else { - if ((switchItem->Animation.FrameNumber == g_Level.Anims[switchItem->Animation.AnimNumber].frameEnd) + if ((switchItem->Animation.FrameNumber == GetAnimData(switchItem).frameEnd) && (LaraItem->Animation.AnimNumber == LA_COGWHEEL_RELEASE)) { switchItem->Animation.ActiveState = SWITCH_OFF; diff --git a/TombEngine/Objects/Generic/Switches/crowbar_switch.cpp b/TombEngine/Objects/Generic/Switches/crowbar_switch.cpp index c3c6028ef..8ff901961 100644 --- a/TombEngine/Objects/Generic/Switches/crowbar_switch.cpp +++ b/TombEngine/Objects/Generic/Switches/crowbar_switch.cpp @@ -45,33 +45,33 @@ namespace TEN::Entities::Switches ) }; - void CrowbarSwitchCollision(short itemNumber, ItemInfo* laraitem, CollisionInfo* coll) + void CrowbarSwitchCollision(short itemNumber, ItemInfo* laraItem, CollisionInfo* coll) { - auto* laraInfo = GetLaraInfo(laraitem); + auto* laraInfo = GetLaraInfo(laraItem); ItemInfo* switchItem = &g_Level.Items[itemNumber]; int doSwitch = 0; if (((TrInput & IN_ACTION || g_Gui.GetInventoryItemChosen() == ID_CROWBAR_ITEM) && - laraitem->Animation.ActiveState == LS_IDLE && - laraitem->Animation.AnimNumber == LA_STAND_IDLE && + laraItem->Animation.ActiveState == LS_IDLE && + laraItem->Animation.AnimNumber == LA_STAND_IDLE && laraInfo->Control.HandStatus == HandStatus::Free && switchItem->ItemFlags[0] == 0) || (laraInfo->Control.IsMoving && laraInfo->Context.InteractedItem == itemNumber)) { if (switchItem->Animation.ActiveState == SWITCH_ON) { - laraitem->Pose.Orientation.y ^= (short)ANGLE(180.0f); + laraItem->Pose.Orientation.y ^= (short)ANGLE(180.0f); - if (TestLaraPosition(CrowbarBounds2, switchItem, laraitem)) + if (TestLaraPosition(CrowbarBounds2, switchItem, laraItem)) { if (laraInfo->Control.IsMoving || g_Gui.GetInventoryItemChosen() == ID_CROWBAR_ITEM) { - if (MoveLaraPosition(CrowbarPos2, switchItem, laraitem)) + if (MoveLaraPosition(CrowbarPos2, switchItem, laraItem)) { doSwitch = 1; - laraitem->Animation.AnimNumber = LA_CROWBAR_USE_ON_FLOOR; - laraitem->Animation.FrameNumber = g_Level.Anims[laraitem->Animation.AnimNumber].frameBase; + laraItem->Animation.AnimNumber = LA_CROWBAR_USE_ON_FLOOR; + laraItem->Animation.FrameNumber = GetAnimData(laraItem).frameBase; switchItem->Animation.TargetState = SWITCH_OFF; } else @@ -88,19 +88,19 @@ namespace TEN::Entities::Switches laraInfo->Control.HandStatus = HandStatus::Free; } - laraitem->Pose.Orientation.y ^= (short)ANGLE(180.0f); + laraItem->Pose.Orientation.y ^= (short)ANGLE(180.0f); } else { - if (TestLaraPosition(CrowbarBounds, switchItem, laraitem)) + if (TestLaraPosition(CrowbarBounds, switchItem, laraItem)) { if (laraInfo->Control.IsMoving || g_Gui.GetInventoryItemChosen() == ID_CROWBAR_ITEM) { - if (MoveLaraPosition(CrowbarPos, switchItem, laraitem)) + if (MoveLaraPosition(CrowbarPos, switchItem, laraItem)) { doSwitch = 1; - laraitem->Animation.AnimNumber = LA_CROWBAR_USE_ON_FLOOR; - laraitem->Animation.FrameNumber = g_Level.Anims[laraitem->Animation.AnimNumber].frameBase; + laraItem->Animation.AnimNumber = LA_CROWBAR_USE_ON_FLOOR; + laraItem->Animation.FrameNumber = GetAnimData(laraItem).frameBase; switchItem->Animation.TargetState = SWITCH_ON; } else @@ -127,20 +127,20 @@ namespace TEN::Entities::Switches g_Gui.SetEnterInventory(ID_CROWBAR_ITEM); else { - if (OldPickupPos.x != laraitem->Pose.Position.x || OldPickupPos.y != laraitem->Pose.Position.y || OldPickupPos.z != laraitem->Pose.Position.z) + if (OldPickupPos.x != laraItem->Pose.Position.x || OldPickupPos.y != laraItem->Pose.Position.y || OldPickupPos.z != laraItem->Pose.Position.z) { - OldPickupPos.x = laraitem->Pose.Position.x; - OldPickupPos.y = laraitem->Pose.Position.y; - OldPickupPos.z = laraitem->Pose.Position.z; + OldPickupPos.x = laraItem->Pose.Position.x; + OldPickupPos.y = laraItem->Pose.Position.y; + OldPickupPos.z = laraItem->Pose.Position.z; SayNo(); } } } else { - ResetPlayerFlex(laraitem); - laraitem->Animation.TargetState = LS_SWITCH_DOWN; - laraitem->Animation.ActiveState = LS_SWITCH_DOWN; + ResetPlayerFlex(laraItem); + laraItem->Animation.TargetState = LS_SWITCH_DOWN; + laraItem->Animation.ActiveState = LS_SWITCH_DOWN; laraInfo->Control.IsMoving = false; laraInfo->Control.HandStatus = HandStatus::Busy; switchItem->Status = ITEM_ACTIVE; @@ -150,6 +150,6 @@ namespace TEN::Entities::Switches } } else - ObjectCollision(itemNumber, laraitem, coll); + ObjectCollision(itemNumber, laraItem, coll); } } diff --git a/TombEngine/Objects/Generic/Switches/fullblock_switch.cpp b/TombEngine/Objects/Generic/Switches/fullblock_switch.cpp index 7e376b94f..89adc9631 100644 --- a/TombEngine/Objects/Generic/Switches/fullblock_switch.cpp +++ b/TombEngine/Objects/Generic/Switches/fullblock_switch.cpp @@ -64,7 +64,7 @@ namespace TEN::Entities::Switches } laraItem->Animation.TargetState = LS_IDLE; - laraItem->Animation.FrameNumber = g_Level.Anims[laraItem->Animation.AnimNumber].frameBase; + laraItem->Animation.FrameNumber = GetAnimData(laraItem).frameBase; switchItem->Status = ITEM_ACTIVE; AddActiveItem(itemNumber); diff --git a/TombEngine/Objects/Generic/Switches/generic_switch.cpp b/TombEngine/Objects/Generic/Switches/generic_switch.cpp index 0d2e6479d..5e496cf13 100644 --- a/TombEngine/Objects/Generic/Switches/generic_switch.cpp +++ b/TombEngine/Objects/Generic/Switches/generic_switch.cpp @@ -206,7 +206,7 @@ namespace TEN::Entities::Switches } ResetPlayerFlex(laraItem); - laraItem->Animation.FrameNumber = g_Level.Anims[laraItem->Animation.AnimNumber].frameBase; + laraItem->Animation.FrameNumber = GetAnimData(laraItem).frameBase; laraInfo->Control.IsMoving = false; laraInfo->Control.HandStatus = HandStatus::Busy; diff --git a/TombEngine/Objects/Generic/Switches/jump_switch.cpp b/TombEngine/Objects/Generic/Switches/jump_switch.cpp index b3b9563ba..8c385760c 100644 --- a/TombEngine/Objects/Generic/Switches/jump_switch.cpp +++ b/TombEngine/Objects/Generic/Switches/jump_switch.cpp @@ -46,7 +46,7 @@ namespace TEN::Entities::Switches laraItem->Animation.ActiveState = LS_SWITCH_DOWN; laraItem->Animation.AnimNumber = LA_JUMPSWITCH_PULL; laraItem->Animation.Velocity.y = 0; - laraItem->Animation.FrameNumber = g_Level.Anims[laraItem->Animation.AnimNumber].frameBase; + laraItem->Animation.FrameNumber = GetAnimData(laraItem).frameBase; laraItem->Animation.IsAirborne = false; laraInfo->Control.HandStatus = HandStatus::Busy; switchItem->Animation.TargetState = SWITCH_ON; diff --git a/TombEngine/Objects/Generic/Switches/pulley_switch.cpp b/TombEngine/Objects/Generic/Switches/pulley_switch.cpp index 69b73c57f..0acab5169 100644 --- a/TombEngine/Objects/Generic/Switches/pulley_switch.cpp +++ b/TombEngine/Objects/Generic/Switches/pulley_switch.cpp @@ -73,7 +73,7 @@ namespace TEN::Entities::Switches { laraItem->Animation.AnimNumber = LA_PULLEY_GRAB; laraItem->Animation.ActiveState = LS_PULLEY; - laraItem->Animation.FrameNumber = g_Level.Anims[laraItem->Animation.AnimNumber].frameBase; + laraItem->Animation.FrameNumber = GetAnimData(laraItem).frameBase; AddActiveItem(itemNumber); diff --git a/TombEngine/Objects/Generic/Switches/rail_switch.cpp b/TombEngine/Objects/Generic/Switches/rail_switch.cpp index 5e715009d..e06afa5ce 100644 --- a/TombEngine/Objects/Generic/Switches/rail_switch.cpp +++ b/TombEngine/Objects/Generic/Switches/rail_switch.cpp @@ -85,7 +85,7 @@ namespace TEN::Entities::Switches { ResetPlayerFlex(laraItem); laraItem->Animation.AnimNumber = LA_LEVER_PUSH; - laraItem->Animation.FrameNumber = g_Level.Anims[laraItem->Animation.AnimNumber].frameBase; + laraItem->Animation.FrameNumber = GetAnimData(laraItem).frameBase; laraItem->Animation.TargetState = LS_LEVERSWITCH_PUSH; laraItem->Animation.ActiveState = LS_LEVERSWITCH_PUSH; lara->Control.IsMoving = false; @@ -108,7 +108,7 @@ namespace TEN::Entities::Switches { ResetPlayerFlex(laraItem); laraItem->Animation.AnimNumber = LA_LEVER_PUSH; - laraItem->Animation.FrameNumber = g_Level.Anims[laraItem->Animation.AnimNumber].frameBase; + laraItem->Animation.FrameNumber = GetAnimData(laraItem).frameBase; laraItem->Animation.TargetState = LS_LEVERSWITCH_PUSH; laraItem->Animation.ActiveState = LS_LEVERSWITCH_PUSH; lara->Control.IsMoving = false; diff --git a/TombEngine/Objects/Generic/Switches/turn_switch.cpp b/TombEngine/Objects/Generic/Switches/turn_switch.cpp index b953e7911..66be48526 100644 --- a/TombEngine/Objects/Generic/Switches/turn_switch.cpp +++ b/TombEngine/Objects/Generic/Switches/turn_switch.cpp @@ -71,18 +71,19 @@ namespace TEN::Entities::Switches { if (MoveLaraPosition(TurnSwitchPosA, switchItem, laraItem)) { - laraItem->Animation.AnimNumber = LA_TURNSWITCH_GRAB_COUNTER_CLOCKWISE; - laraItem->Animation.FrameNumber = g_Level.Anims[LA_TURNSWITCH_GRAB_COUNTER_CLOCKWISE].frameBase; - switchItem->Animation.AnimNumber = Objects[switchItem->ObjectNumber].animIndex + 4; - switchItem->Animation.FrameNumber = g_Level.Anims[switchItem->Animation.AnimNumber].frameBase; + SetAnimation(*laraItem, LA_TURNSWITCH_GRAB_COUNTER_CLOCKWISE); + SetAnimation(*switchItem, 4); switchItem->ItemFlags[0] = TURN_SWITCH_ANTICLOCKWISE; - ForcedFixedCamera.x = switchItem->Pose.Position.x - 1024 * phd_sin(switchItem->Pose.Orientation.y); - ForcedFixedCamera.z = switchItem->Pose.Position.z - 1024 * phd_cos(switchItem->Pose.Orientation.y); + + ForcedFixedCamera.x = switchItem->Pose.Position.x - BLOCK(1) * phd_sin(switchItem->Pose.Orientation.y); + ForcedFixedCamera.z = switchItem->Pose.Position.z - BLOCK(1) * phd_cos(switchItem->Pose.Orientation.y); doSwitch = -1; } else + { laraInfo->Context.InteractedItem = itemNumber; + } } else { @@ -91,15 +92,19 @@ namespace TEN::Entities::Switches { if (MoveLaraPosition(TurnSwitchPos, switchItem, laraItem)) { - laraItem->Animation.AnimNumber = LA_TURNSWITCH_GRAB_CLOCKWISE; - laraItem->Animation.FrameNumber = g_Level.Anims[laraItem->Animation.AnimNumber].frameBase; + SetAnimation(*laraItem, LA_TURNSWITCH_GRAB_CLOCKWISE); + switchItem->ItemFlags[0] = TURN_SWITCH_CLOCKWISE; + ForcedFixedCamera.x = switchItem->Pose.Position.x + 1024 * phd_sin(switchItem->Pose.Orientation.y); ForcedFixedCamera.z = switchItem->Pose.Position.z + 1024 * phd_cos(switchItem->Pose.Orientation.y); + doSwitch = 1; } else + { laraInfo->Context.InteractedItem = itemNumber; + } } else if (laraInfo->Control.IsMoving && laraInfo->Context.InteractedItem == itemNumber) { @@ -134,7 +139,7 @@ namespace TEN::Entities::Switches if (!TriggerActive(&g_Level.Items[ItemNos[0]])) { g_Level.Items[ItemNos[0]].Animation.AnimNumber = Objects[g_Level.Items[ItemNos[0]].ObjectNumber].animIndex; - g_Level.Items[ItemNos[0]].Animation.FrameNumber = g_Level.Anims[g_Level.Items[ItemNos[0]].Animation.AnimNumber].frameBase; + g_Level.Items[ItemNos[0]].Animation.FrameNumber = GetAnimData(g_Level.Items[ItemNos[0]].Animation.AnimNumber).frameBase; } } } @@ -174,22 +179,22 @@ namespace TEN::Entities::Switches if (TrInput & IN_ACTION) { laraItem->Animation.AnimNumber = LA_TURNSWITCH_PUSH_CLOCKWISE_START; - laraItem->Animation.FrameNumber = g_Level.Anims[laraItem->Animation.AnimNumber].frameBase; + laraItem->Animation.FrameNumber = GetAnimData(laraItem).frameBase; switchItem->Animation.AnimNumber = Objects[switchItem->ObjectNumber].animIndex + 1; - switchItem->Animation.FrameNumber = g_Level.Anims[switchItem->Animation.AnimNumber].frameBase; + switchItem->Animation.FrameNumber = GetAnimData(switchItem).frameBase; } } if (laraItem->Animation.AnimNumber == LA_TURNSWITCH_PUSH_CLOCKWISE_END && - laraItem->Animation.FrameNumber == g_Level.Anims[laraItem->Animation.AnimNumber].frameEnd && + laraItem->Animation.FrameNumber == GetAnimData(laraItem).frameEnd && !switchItem->ItemFlags[1]) switchItem->ItemFlags[1] = 1; - if (laraItem->Animation.FrameNumber >= g_Level.Anims[LA_TURNSWITCH_PUSH_CLOCKWISE_START].frameBase && - laraItem->Animation.FrameNumber <= g_Level.Anims[LA_TURNSWITCH_PUSH_CLOCKWISE_START].frameBase + 43 || - laraItem->Animation.FrameNumber >= g_Level.Anims[LA_TURNSWITCH_PUSH_CLOCKWISE_START].frameBase + 58 && - laraItem->Animation.FrameNumber <= g_Level.Anims[LA_TURNSWITCH_PUSH_CLOCKWISE_START].frameBase + 115) + if ((laraItem->Animation.FrameNumber >= GetAnimData(*laraItem, LA_TURNSWITCH_PUSH_CLOCKWISE_START).frameBase && + laraItem->Animation.FrameNumber <= GetAnimData(*laraItem, LA_TURNSWITCH_PUSH_CLOCKWISE_START).frameBase + 43) || + (laraItem->Animation.FrameNumber >= GetAnimData(*laraItem, LA_TURNSWITCH_PUSH_CLOCKWISE_START).frameBase + 58 && + laraItem->Animation.FrameNumber <= GetAnimData(*laraItem, LA_TURNSWITCH_PUSH_CLOCKWISE_START).frameBase + 115)) { SoundEffect(SFX_TR4_PUSHABLE_SOUND, &switchItem->Pose, SoundEnvironment::Always); } @@ -201,21 +206,22 @@ namespace TEN::Entities::Switches switchItem->Pose.Orientation.y -= ANGLE(90.0f); if (TrInput & IN_ACTION) { - laraItem->Animation.AnimNumber = LA_TURNSWITCH_PUSH_COUNTER_CLOCKWISE_START; - laraItem->Animation.FrameNumber = g_Level.Anims[laraItem->Animation.AnimNumber].frameBase; - switchItem->Animation.AnimNumber = Objects[switchItem->ObjectNumber].animIndex + 5; - switchItem->Animation.FrameNumber = g_Level.Anims[switchItem->Animation.AnimNumber].frameBase; + SetAnimation(*laraItem, LA_TURNSWITCH_PUSH_COUNTER_CLOCKWISE_START); + SetAnimation(*switchItem, 5); } } - if (laraItem->Animation.AnimNumber == LA_TURNSWITCH_PUSH_COUNTER_CLOCKWISE_END && laraItem->Animation.FrameNumber == g_Level.Anims[LA_TURNSWITCH_PUSH_COUNTER_CLOCKWISE_END].frameEnd && + if (laraItem->Animation.AnimNumber == LA_TURNSWITCH_PUSH_COUNTER_CLOCKWISE_END && + laraItem->Animation.FrameNumber == GetAnimData(*laraItem, LA_TURNSWITCH_PUSH_COUNTER_CLOCKWISE_END).frameEnd && !switchItem->ItemFlags[1]) + { switchItem->ItemFlags[1] = 1; + } - if (laraItem->Animation.FrameNumber >= g_Level.Anims[LA_TURNSWITCH_PUSH_COUNTER_CLOCKWISE_START].frameBase && - laraItem->Animation.FrameNumber <= g_Level.Anims[LA_TURNSWITCH_PUSH_COUNTER_CLOCKWISE_START].frameBase + 43 || - laraItem->Animation.FrameNumber >= g_Level.Anims[LA_TURNSWITCH_PUSH_COUNTER_CLOCKWISE_START].frameBase + 58 && - laraItem->Animation.FrameNumber <= g_Level.Anims[LA_TURNSWITCH_PUSH_COUNTER_CLOCKWISE_START].frameBase + 115) + if ((laraItem->Animation.FrameNumber >= GetAnimData(*laraItem, LA_TURNSWITCH_PUSH_COUNTER_CLOCKWISE_START).frameBase && + laraItem->Animation.FrameNumber <= GetAnimData(*laraItem, LA_TURNSWITCH_PUSH_COUNTER_CLOCKWISE_START).frameBase + 43) || + (laraItem->Animation.FrameNumber >= GetAnimData(*laraItem, LA_TURNSWITCH_PUSH_COUNTER_CLOCKWISE_START).frameBase + 58 && + laraItem->Animation.FrameNumber <= GetAnimData(*laraItem, LA_TURNSWITCH_PUSH_COUNTER_CLOCKWISE_START).frameBase + 115)) { SoundEffect(SFX_TR4_PUSHABLE_SOUND, &switchItem->Pose, SoundEnvironment::Always); } @@ -227,9 +233,9 @@ namespace TEN::Entities::Switches { laraItem->Animation.AnimNumber = LA_STAND_IDLE; laraItem->Animation.ActiveState = LS_IDLE; - laraItem->Animation.FrameNumber = g_Level.Anims[laraItem->Animation.AnimNumber].frameBase; + laraItem->Animation.FrameNumber = GetAnimData(laraItem).frameBase; switchItem->Animation.AnimNumber = Objects[switchItem->ObjectNumber].animIndex; - switchItem->Animation.FrameNumber = g_Level.Anims[switchItem->Animation.AnimNumber].frameBase; + switchItem->Animation.FrameNumber = GetAnimData(switchItem).frameBase; switchItem->Status = ITEM_NOT_ACTIVE; RemoveActiveItem(itemNumber); diff --git a/TombEngine/Objects/Generic/puzzles_keys.cpp b/TombEngine/Objects/Generic/puzzles_keys.cpp index 47c12cb43..51fa0699d 100644 --- a/TombEngine/Objects/Generic/puzzles_keys.cpp +++ b/TombEngine/Objects/Generic/puzzles_keys.cpp @@ -65,9 +65,10 @@ void InitializePuzzleHole(short itemNumber) void InitializePuzzleDone(short itemNumber) { auto& receptacleItem = g_Level.Items[itemNumber]; + const auto& anim = GetAnimData(receptacleItem); receptacleItem.Animation.RequiredState = NO_STATE; - receptacleItem.Animation.FrameNumber = g_Level.Anims[receptacleItem.Animation.AnimNumber].frameBase + g_Level.Anims[receptacleItem.Animation.AnimNumber].frameEnd; + receptacleItem.Animation.FrameNumber = anim.frameBase + anim.frameEnd; } void PuzzleHoleCollision(short itemNumber, ItemInfo* laraItem, CollisionInfo* coll) @@ -174,7 +175,7 @@ void PuzzleHoleCollision(short itemNumber, ItemInfo* laraItem, CollisionInfo* co g_Gui.SetInventoryItemChosen(NO_ITEM); ResetPlayerFlex(laraItem); - laraItem->Animation.FrameNumber = GetAnimData(*laraItem, laraItem->Animation.AnimNumber).frameBase; + laraItem->Animation.FrameNumber = GetAnimData(laraItem).frameBase; player.Control.IsMoving = false; player.Control.HandStatus = HandStatus::Busy; player.Context.InteractedItem = itemNumber; @@ -349,9 +350,9 @@ void PuzzleDone(ItemInfo* item, short itemNumber) { item->ObjectNumber += GAME_OBJECT_ID{ ID_PUZZLE_DONE1 - ID_PUZZLE_HOLE1 }; item->Animation.AnimNumber = Objects[item->ObjectNumber].animIndex; - item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; - item->Animation.ActiveState = g_Level.Anims[item->Animation.AnimNumber].ActiveState; - item->Animation.TargetState = g_Level.Anims[item->Animation.AnimNumber].ActiveState; + item->Animation.FrameNumber = GetAnimData(item).frameBase; + item->Animation.ActiveState = GetAnimData(item).ActiveState; + item->Animation.TargetState = GetAnimData(item).ActiveState; item->Animation.RequiredState = NO_STATE; item->ResetModelToDefault(); @@ -506,7 +507,7 @@ void KeyHoleCollision(short itemNumber, ItemInfo* laraItem, CollisionInfo* coll) } laraItem->Animation.ActiveState = LS_INSERT_KEY; - laraItem->Animation.FrameNumber = g_Level.Anims[laraItem->Animation.AnimNumber].frameBase; + laraItem->Animation.FrameNumber = GetAnimData(laraItem).frameBase; player->Control.IsMoving = false; ResetPlayerFlex(laraItem); player->Control.HandStatus = HandStatus::Busy; diff --git a/TombEngine/Objects/TR1/Entity/tr1_wolf.cpp b/TombEngine/Objects/TR1/Entity/tr1_wolf.cpp index 9bd469a1b..1452a99d0 100644 --- a/TombEngine/Objects/TR1/Entity/tr1_wolf.cpp +++ b/TombEngine/Objects/TR1/Entity/tr1_wolf.cpp @@ -83,7 +83,7 @@ namespace TEN::Entities::Creatures::TR1 if (item->Animation.ActiveState != WOLF_STATE_DEATH) { item->Animation.AnimNumber = Objects[ID_WOLF].animIndex + WOLF_ANIM_DEATH + (short)(GetRandomControl() / 11000); - item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.FrameNumber = GetAnimData(item).frameBase; item->Animation.ActiveState = WOLF_STATE_DEATH; } } diff --git a/TombEngine/Objects/TR2/Entity/tr2_barracuda.cpp b/TombEngine/Objects/TR2/Entity/tr2_barracuda.cpp index 39e505ca4..788471499 100644 --- a/TombEngine/Objects/TR2/Entity/tr2_barracuda.cpp +++ b/TombEngine/Objects/TR2/Entity/tr2_barracuda.cpp @@ -70,7 +70,7 @@ namespace TEN::Entities::Creatures::TR2 if (item->Animation.ActiveState != BARRACUDA_STATE_DEATH) { item->Animation.AnimNumber = Objects[ID_BARRACUDA].animIndex + BARRACUDA_ANIM_DEATH_START; - item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.FrameNumber = GetAnimData(item).frameBase; item->Animation.ActiveState = BARRACUDA_STATE_DEATH; } diff --git a/TombEngine/Objects/TR2/Entity/tr2_dragon.cpp b/TombEngine/Objects/TR2/Entity/tr2_dragon.cpp index fa14fecce..0dcd284ee 100644 --- a/TombEngine/Objects/TR2/Entity/tr2_dragon.cpp +++ b/TombEngine/Objects/TR2/Entity/tr2_dragon.cpp @@ -180,7 +180,7 @@ namespace TEN::Entities::Creatures::TR2 int angle = laraItem->Pose.Orientation.y - item->Pose.Orientation.y; int anim = item->Animation.AnimNumber - Objects[ID_DRAGON_BACK].animIndex; - int frame = item->Animation.FrameNumber - g_Level.Anims[item->Animation.AnimNumber].frameBase; + int frame = item->Animation.FrameNumber - GetAnimData(item).frameBase; if ((anim == DRAGON_ANIM_DEAD || (anim == DRAGON_ANIM_DEAD + 1 && frame <= DRAGON_ALMOST_LIVE)) && TrInput & IN_ACTION && @@ -438,7 +438,7 @@ namespace TEN::Entities::Creatures::TR2 back->Animation.ActiveState = item->Animation.ActiveState; back->Animation.AnimNumber = Objects[ID_DRAGON_BACK].animIndex + (item->Animation.AnimNumber - Objects[ID_DRAGON_FRONT].animIndex); - back->Animation.FrameNumber = g_Level.Anims[back->Animation.AnimNumber].frameBase + (item->Animation.FrameNumber - g_Level.Anims[item->Animation.AnimNumber].frameBase); + back->Animation.FrameNumber = GetAnimData(back).frameBase + (item->Animation.FrameNumber - GetAnimData(item).frameBase); back->Pose = item->Pose; if (back->RoomNumber != item->RoomNumber) diff --git a/TombEngine/Objects/TR2/Entity/tr2_eagle_or_crow.cpp b/TombEngine/Objects/TR2/Entity/tr2_eagle_or_crow.cpp index 480d363d5..067b718d3 100644 --- a/TombEngine/Objects/TR2/Entity/tr2_eagle_or_crow.cpp +++ b/TombEngine/Objects/TR2/Entity/tr2_eagle_or_crow.cpp @@ -41,13 +41,13 @@ namespace TEN::Entities::Creatures::TR2 if (item->ObjectNumber == ID_CROW) { item->Animation.AnimNumber = Objects[ID_CROW].animIndex + 14; - item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.FrameNumber = GetAnimData(item).frameBase; item->Animation.ActiveState = item->Animation.TargetState = 7; } else { item->Animation.AnimNumber = Objects[ID_EAGLE].animIndex + 5; - item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.FrameNumber = GetAnimData(item).frameBase; item->Animation.ActiveState = item->Animation.TargetState = 2; } } @@ -88,7 +88,7 @@ namespace TEN::Entities::Creatures::TR2 else item->Animation.AnimNumber = Objects[ID_EAGLE].animIndex + 8; - item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.FrameNumber = GetAnimData(item).frameBase; item->Animation.ActiveState = 4; item->Animation.Velocity.z = 0; item->Animation.IsAirborne = true; diff --git a/TombEngine/Objects/TR2/Entity/tr2_mercenary.cpp b/TombEngine/Objects/TR2/Entity/tr2_mercenary.cpp index 4d8a0efaa..061c9e942 100644 --- a/TombEngine/Objects/TR2/Entity/tr2_mercenary.cpp +++ b/TombEngine/Objects/TR2/Entity/tr2_mercenary.cpp @@ -49,7 +49,7 @@ namespace TEN::Entities::Creatures::TR2 if (item->Animation.ActiveState != 13) { item->Animation.AnimNumber = Objects[item->ObjectNumber].animIndex + 14; - item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.FrameNumber = GetAnimData(item).frameBase; item->Animation.ActiveState = 13; } } diff --git a/TombEngine/Objects/TR2/Entity/tr2_monk.cpp b/TombEngine/Objects/TR2/Entity/tr2_monk.cpp index 3d627269f..ac586f50f 100644 --- a/TombEngine/Objects/TR2/Entity/tr2_monk.cpp +++ b/TombEngine/Objects/TR2/Entity/tr2_monk.cpp @@ -46,7 +46,7 @@ namespace TEN::Entities::Creatures::TR2 if (item->Animation.ActiveState != 9) { item->Animation.AnimNumber = Objects[item->ObjectNumber].animIndex + 20 + (GetRandomControl() / 0x4000); - item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.FrameNumber = GetAnimData(item).frameBase; item->Animation.ActiveState = 9; } } diff --git a/TombEngine/Objects/TR2/Entity/tr2_skidman.cpp b/TombEngine/Objects/TR2/Entity/tr2_skidman.cpp index 4a9e5035f..a0e547216 100644 --- a/TombEngine/Objects/TR2/Entity/tr2_skidman.cpp +++ b/TombEngine/Objects/TR2/Entity/tr2_skidman.cpp @@ -307,7 +307,7 @@ namespace TEN::Entities::Creatures::TR2 ItemNewRoom(riderItemNumber, skidooItem->RoomNumber); riderItem.Animation.AnimNumber = skidooItem->Animation.AnimNumber + (Objects[ID_SNOWMOBILE_DRIVER].animIndex - Objects[ID_SNOWMOBILE_GUN].animIndex); - riderItem.Animation.FrameNumber = skidooItem->Animation.FrameNumber + (g_Level.Anims[riderItem.Animation.AnimNumber].frameBase - g_Level.Anims[skidooItem->Animation.AnimNumber].frameBase); + riderItem.Animation.FrameNumber = skidooItem->Animation.FrameNumber + (GetAnimData(riderItem).frameBase - GetAnimData(skidooItem).frameBase); } else if (riderItem.Status == ITEM_DEACTIVATED && skidooItem->Animation.Velocity.z == 0 && diff --git a/TombEngine/Objects/TR2/Entity/tr2_spider.cpp b/TombEngine/Objects/TR2/Entity/tr2_spider.cpp index 0a1dc1412..39552d5ab 100644 --- a/TombEngine/Objects/TR2/Entity/tr2_spider.cpp +++ b/TombEngine/Objects/TR2/Entity/tr2_spider.cpp @@ -222,7 +222,7 @@ namespace TEN::Entities::Creatures::TR2 if (item->Animation.ActiveState != 7) { item->Animation.AnimNumber = Objects[item->ObjectNumber].animIndex + 2; - item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.FrameNumber = GetAnimData(item).frameBase; item->Animation.ActiveState = 7; } } diff --git a/TombEngine/Objects/TR2/Entity/tr2_yeti.cpp b/TombEngine/Objects/TR2/Entity/tr2_yeti.cpp index 0ad6282a4..0e236f325 100644 --- a/TombEngine/Objects/TR2/Entity/tr2_yeti.cpp +++ b/TombEngine/Objects/TR2/Entity/tr2_yeti.cpp @@ -61,7 +61,7 @@ namespace TEN::Entities::Creatures::TR2 if (item->Animation.ActiveState != 8) { item->Animation.AnimNumber = Objects[item->ObjectNumber].animIndex + 31; - item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.FrameNumber = GetAnimData(item).frameBase; item->Animation.ActiveState = 8; } } @@ -290,25 +290,25 @@ namespace TEN::Entities::Creatures::TR2 { case 2: item->Animation.AnimNumber = Objects[item->ObjectNumber].animIndex + 34; - item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.FrameNumber = GetAnimData(item).frameBase; item->Animation.ActiveState = 10; break; case 3: item->Animation.AnimNumber = Objects[item->ObjectNumber].animIndex + 33; - item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.FrameNumber = GetAnimData(item).frameBase; item->Animation.ActiveState = 11; break; case 4: item->Animation.AnimNumber = Objects[item->ObjectNumber].animIndex + 32; - item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.FrameNumber = GetAnimData(item).frameBase; item->Animation.ActiveState = 12; break; case -4: item->Animation.AnimNumber = Objects[item->ObjectNumber].animIndex + 35; - item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.FrameNumber = GetAnimData(item).frameBase; item->Animation.ActiveState = 13; break; } diff --git a/TombEngine/Objects/TR2/Trap/tr2_killerstatue.cpp b/TombEngine/Objects/TR2/Trap/tr2_killerstatue.cpp index 7927b73a8..89936dd9b 100644 --- a/TombEngine/Objects/TR2/Trap/tr2_killerstatue.cpp +++ b/TombEngine/Objects/TR2/Trap/tr2_killerstatue.cpp @@ -14,7 +14,7 @@ void InitializeKillerStatue(short itemNumber) auto* item = &g_Level.Items[itemNumber]; item->Animation.AnimNumber = Objects[item->ObjectNumber].animIndex + 3; - item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.FrameNumber = GetAnimData(item).frameBase; item->Animation.ActiveState = 1; } diff --git a/TombEngine/Objects/TR2/Vehicles/speedboat.cpp b/TombEngine/Objects/TR2/Vehicles/speedboat.cpp index 9800106b1..8bddf2ba7 100644 --- a/TombEngine/Objects/TR2/Vehicles/speedboat.cpp +++ b/TombEngine/Objects/TR2/Vehicles/speedboat.cpp @@ -210,7 +210,7 @@ namespace TEN::Entities::Vehicles SetAnimation(*laraItem, ID_SPEEDBOAT_LARA_ANIMS, SPEEDBOAT_ANIM_MOUNT_JUMP); break; } - laraItem->Animation.FrameNumber = g_Level.Anims[laraItem->Animation.AnimNumber].frameBase; + laraItem->Animation.FrameNumber = GetAnimData(laraItem).frameBase; if (laraItem->RoomNumber != speedboatItem->RoomNumber) ItemNewRoom(lara->ItemNumber, speedboatItem->RoomNumber); diff --git a/TombEngine/Objects/TR3/Entity/PunaBoss.cpp b/TombEngine/Objects/TR3/Entity/PunaBoss.cpp index bbd6ea0fe..43e8d0c73 100644 --- a/TombEngine/Objects/TR3/Entity/PunaBoss.cpp +++ b/TombEngine/Objects/TR3/Entity/PunaBoss.cpp @@ -326,7 +326,7 @@ namespace TEN::Entities::Creatures::TR3 creature.MaxTurn = 0; } - int frameEnd = g_Level.Anims[object.animIndex + PUNA_ANIM_DEATH].frameEnd; + int frameEnd = GetAnimData(object, PUNA_ANIM_DEATH).frameEnd; if (item.Animation.FrameNumber >= frameEnd) { // Avoid having the object stop working. diff --git a/TombEngine/Objects/TR3/Entity/Shiva.cpp b/TombEngine/Objects/TR3/Entity/Shiva.cpp index 63ccb27fc..ffdadd3a7 100644 --- a/TombEngine/Objects/TR3/Entity/Shiva.cpp +++ b/TombEngine/Objects/TR3/Entity/Shiva.cpp @@ -290,7 +290,7 @@ namespace TEN::Entities::Creatures::TR3 item->ItemFlags[3] = 1; } - int frameEnd = g_Level.Anims[object.animIndex + SHIVA_ANIM_DEATH].frameEnd - 1; + int frameEnd = GetAnimData(object, SHIVA_ANIM_DEATH).frameEnd - 1; if (item->Animation.FrameNumber >= frameEnd) { // Block frame until mesh is swapped. diff --git a/TombEngine/Objects/TR3/Entity/SophiaLeigh.cpp b/TombEngine/Objects/TR3/Entity/SophiaLeigh.cpp index 55feee1d9..778574110 100644 --- a/TombEngine/Objects/TR3/Entity/SophiaLeigh.cpp +++ b/TombEngine/Objects/TR3/Entity/SophiaLeigh.cpp @@ -721,7 +721,7 @@ namespace TEN::Entities::Creatures::TR3 if (item.Animation.ActiveState != SOPHIALEIGH_STATE_DEATH) SetAnimation(&item, SOPHIALEIGH_ANIM_DEATH); - int frameEnd = g_Level.Anims[object.animIndex + SOPHIALEIGH_ANIM_DEATH].frameEnd; + int frameEnd = GetAnimData(object, SOPHIALEIGH_ANIM_DEATH).frameEnd; if (item.Animation.FrameNumber >= frameEnd) { // Avoid having the object stop working. diff --git a/TombEngine/Objects/TR3/Entity/tr3_monkey.cpp b/TombEngine/Objects/TR3/Entity/tr3_monkey.cpp index 12d9af2fa..a1b19057e 100644 --- a/TombEngine/Objects/TR3/Entity/tr3_monkey.cpp +++ b/TombEngine/Objects/TR3/Entity/tr3_monkey.cpp @@ -347,7 +347,7 @@ namespace TEN::Entities::Creatures::TR3 break; else if ((creature->Enemy->ObjectNumber == ID_SMALLMEDI_ITEM || creature->Enemy->ObjectNumber == ID_KEY_ITEM4) && - item->Animation.FrameNumber == (g_Level.Anims[item->Animation.AnimNumber].frameBase + 12)) + item->Animation.FrameNumber == (GetAnimData(item).frameBase + 12)) { if (creature->Enemy->RoomNumber == NO_ROOM || creature->Enemy->Status == ITEM_INVISIBLE || @@ -382,7 +382,7 @@ namespace TEN::Entities::Creatures::TR3 } } else if (creature->Enemy->ObjectNumber == ID_AI_AMBUSH && - item->Animation.FrameNumber == (g_Level.Anims[item->Animation.AnimNumber].frameBase + 12)) + item->Animation.FrameNumber == (GetAnimData(item).frameBase + 12)) { item->AIBits = 0; diff --git a/TombEngine/Objects/TR3/Entity/tr3_mp_gun.cpp b/TombEngine/Objects/TR3/Entity/tr3_mp_gun.cpp index 970b9f0b2..227f8cf94 100644 --- a/TombEngine/Objects/TR3/Entity/tr3_mp_gun.cpp +++ b/TombEngine/Objects/TR3/Entity/tr3_mp_gun.cpp @@ -84,10 +84,10 @@ namespace TEN::Entities::Creatures::TR3 if (item->Animation.ActiveState != 13) { item->Animation.AnimNumber = Objects[ID_MP_WITH_GUN].animIndex + 14; - item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.FrameNumber = GetAnimData(item).frameBase; item->Animation.ActiveState = 13; } - else if (Random::TestProbability(0.25f) && item->Animation.FrameNumber == g_Level.Anims[item->Animation.AnimNumber].frameBase + 1) + else if (Random::TestProbability(0.25f) && item->Animation.FrameNumber == GetAnimData(item).frameBase + 1) { CreatureAIInfo(item, &AI); @@ -348,7 +348,7 @@ namespace TEN::Entities::Creatures::TR3 if (item->Animation.AnimNumber == Objects[ID_MP_WITH_GUN].animIndex + 12 || (item->Animation.AnimNumber == Objects[ID_MP_WITH_GUN].animIndex + 1 && - item->Animation.FrameNumber == g_Level.Anims[item->Animation.AnimNumber].frameBase + 10)) + item->Animation.FrameNumber == GetAnimData(item).frameBase + 10)) { if (!ShotLara(item, &AI, MPGunBite, extraTorsoRot.y, 32)) item->Animation.RequiredState = MPGUN_STATE_WAIT; @@ -386,7 +386,7 @@ namespace TEN::Entities::Creatures::TR3 extraTorsoRot.y = AI.angle; } - if (item->Animation.FrameNumber == g_Level.Anims[item->Animation.AnimNumber].frameBase) + if (item->Animation.FrameNumber == GetAnimData(item).frameBase) { if (!ShotLara(item, &AI, MPGunBite, extraTorsoRot.y, 32)) item->Animation.TargetState = MPGUN_STATE_WAIT; @@ -410,8 +410,8 @@ namespace TEN::Entities::Creatures::TR3 extraTorsoRot.y = AI.angle; } - if (item->Animation.FrameNumber == g_Level.Anims[item->Animation.AnimNumber].frameBase || - item->Animation.FrameNumber == g_Level.Anims[item->Animation.AnimNumber].frameBase + 11) + if (item->Animation.FrameNumber == GetAnimData(item).frameBase || + item->Animation.FrameNumber == GetAnimData(item).frameBase + 11) { if (!ShotLara(item, &AI, MPGunBite, extraTorsoRot.y, 32)) item->Animation.TargetState = MPGUN_STATE_WAIT; @@ -435,9 +435,9 @@ namespace TEN::Entities::Creatures::TR3 } if ((item->Animation.AnimNumber == Objects[ID_MP_WITH_GUN].animIndex + 18 && - item->Animation.FrameNumber == g_Level.Anims[item->Animation.AnimNumber].frameBase + 17) || + item->Animation.FrameNumber == GetAnimData(item).frameBase + 17) || (item->Animation.AnimNumber == Objects[ID_MP_WITH_GUN].animIndex + 19 && - item->Animation.FrameNumber == g_Level.Anims[item->Animation.AnimNumber].frameBase + 6)) + item->Animation.FrameNumber == GetAnimData(item).frameBase + 6)) { if (!ShotLara(item, &AI, MPGunBite, extraTorsoRot.y, 32)) item->Animation.RequiredState = MPGUN_STATE_WALK; @@ -467,7 +467,7 @@ namespace TEN::Entities::Creatures::TR3 if (item->Animation.RequiredState == MPGUN_STATE_WALK) item->Animation.TargetState = MPGUN_STATE_WALK; - if (item->Animation.FrameNumber == g_Level.Anims[item->Animation.AnimNumber].frameBase + 16) + if (item->Animation.FrameNumber == GetAnimData(item).frameBase + 16) { if (!ShotLara(item, &AI, MPGunBite, extraTorsoRot.y, 32)) item->Animation.TargetState = MPGUN_STATE_WALK; @@ -523,7 +523,7 @@ namespace TEN::Entities::Creatures::TR3 if (AI.ahead) extraTorsoRot.y = AI.angle; - if (item->Animation.FrameNumber == g_Level.Anims[item->Animation.AnimNumber].frameBase) + if (item->Animation.FrameNumber == GetAnimData(item).frameBase) { if (!ShotLara(item, &AI, MPGunBite, extraTorsoRot.y, 32) || Random::TestProbability(1 / 8.0f)) item->Animation.TargetState = MPGUN_STATE_CROUCHED; diff --git a/TombEngine/Objects/TR3/Entity/tr3_mp_stick.cpp b/TombEngine/Objects/TR3/Entity/tr3_mp_stick.cpp index a42c2c784..ddaa5d22b 100644 --- a/TombEngine/Objects/TR3/Entity/tr3_mp_stick.cpp +++ b/TombEngine/Objects/TR3/Entity/tr3_mp_stick.cpp @@ -449,7 +449,7 @@ namespace TEN::Entities::Creatures::TR3 if (creature->Enemy->IsLara()) { if (creature->Flags != 1 && item->TouchBits.Test(MPStickKickAttackJoints) && - item->Animation.FrameNumber > g_Level.Anims[item->Animation.AnimNumber].frameBase + 8) + item->Animation.FrameNumber > GetAnimData(item).frameBase + 8) { DoDamage(creature->Enemy, 150); CreatureEffect(item, MPStickBite2, DoBloodSplat); @@ -460,7 +460,7 @@ namespace TEN::Entities::Creatures::TR3 else { if (!creature->Flags != 1 && creature->Enemy && - item->Animation.FrameNumber > g_Level.Anims[item->Animation.AnimNumber].frameBase + 8) + item->Animation.FrameNumber > GetAnimData(item).frameBase + 8) { if (Vector3i::Distance(item->Pose.Position, creature->Enemy->Pose.Position) <= SECTOR(0.25f)) { diff --git a/TombEngine/Objects/TR3/Entity/tr3_tony.cpp b/TombEngine/Objects/TR3/Entity/tr3_tony.cpp index 3aecd2dc2..d66f12ac5 100644 --- a/TombEngine/Objects/TR3/Entity/tr3_tony.cpp +++ b/TombEngine/Objects/TR3/Entity/tr3_tony.cpp @@ -502,7 +502,7 @@ namespace TEN::Entities::Creatures::TR3 if (item->Animation.ActiveState != TONY_STATE_DEATH) SetAnimation(item, TONY_ANIM_DEATH); - int frameEnd = g_Level.Anims[object->animIndex + TONY_ANIM_DEATH].frameEnd; + int frameEnd = GetAnimData(*object, TONY_ANIM_DEATH).frameEnd; if (item->Animation.FrameNumber >= frameEnd) { // Avoid having the object stop working. diff --git a/TombEngine/Objects/TR3/Entity/tr3_tribesman.cpp b/TombEngine/Objects/TR3/Entity/tr3_tribesman.cpp index 17d7fc48e..c8fcd8f31 100644 --- a/TombEngine/Objects/TR3/Entity/tr3_tribesman.cpp +++ b/TombEngine/Objects/TR3/Entity/tr3_tribesman.cpp @@ -319,7 +319,7 @@ namespace TEN::Entities::Creatures::TR3 case TRIBESMAN_STATE_RUN_AXE_ATTACK_HIGH: item->ItemFlags[0] = 1; creature->MaxTurn = ANGLE(4.0f); - creature->Flags = item->Animation.FrameNumber - g_Level.Anims[item->Animation.AnimNumber].frameBase; + creature->Flags = item->Animation.FrameNumber - GetAnimData(item).frameBase; if (creature->Enemy->IsLara()) { @@ -655,7 +655,7 @@ namespace TEN::Entities::Creatures::TR3 item->Pose.Orientation.y += ANGLE(2.0f); } - if (item->Animation.FrameNumber == g_Level.Anims[item->Animation.AnimNumber].frameBase + 15) + if (item->Animation.FrameNumber == GetAnimData(item).frameBase + 15) { item->Animation.TargetState = TRIBESMAN_STATE_CROUCH_IDLE; TribesmanShotDart(item); diff --git a/TombEngine/Objects/TR3/Vehicles/kayak.cpp b/TombEngine/Objects/TR3/Vehicles/kayak.cpp index 4aeb03f51..6e75e802e 100644 --- a/TombEngine/Objects/TR3/Vehicles/kayak.cpp +++ b/TombEngine/Objects/TR3/Vehicles/kayak.cpp @@ -618,7 +618,7 @@ namespace TEN::Entities::Vehicles SetAnimation(*laraItem, ID_KAYAK_LARA_ANIMS, KAYAK_ANIM_IDLE_DEATH); } - int frame = laraItem->Animation.FrameNumber - g_Level.Anims[laraItem->Animation.AnimNumber].frameBase; + int frame = laraItem->Animation.FrameNumber - GetAnimData(laraItem).frameBase; switch (laraItem->Animation.ActiveState) { diff --git a/TombEngine/Objects/TR3/Vehicles/minecart.cpp b/TombEngine/Objects/TR3/Vehicles/minecart.cpp index cf9a2253d..3467041fd 100644 --- a/TombEngine/Objects/TR3/Vehicles/minecart.cpp +++ b/TombEngine/Objects/TR3/Vehicles/minecart.cpp @@ -310,11 +310,11 @@ namespace TEN::Entities::Vehicles { if (item->ObjectNumber == ID_MINECART_SWITCH) { - if (item->Animation.FrameNumber == g_Level.Anims[item->Animation.AnimNumber].frameBase && + if (item->Animation.FrameNumber == GetAnimData(item).frameBase && (laraItem->Animation.ActiveState == MINECART_STATE_SWIPE && TestAnimNumber(*laraItem, MINECART_ANIM_SWIPE_WRENCH))) { - int frame = laraItem->Animation.FrameNumber - g_Level.Anims[laraItem->Animation.AnimNumber].frameBase; + int frame = laraItem->Animation.FrameNumber - GetAnimData(laraItem).frameBase; if (frame >= 12 && frame <= 22) { SoundEffect(SFX_TR3_VEHICLE_MINECART_WRENCH, &item->Pose, SoundEnvironment::Always); diff --git a/TombEngine/Objects/TR3/Vehicles/upv.cpp b/TombEngine/Objects/TR3/Vehicles/upv.cpp index b5e3a4bba..5bb754891 100644 --- a/TombEngine/Objects/TR3/Vehicles/upv.cpp +++ b/TombEngine/Objects/TR3/Vehicles/upv.cpp @@ -527,7 +527,7 @@ namespace TEN::Entities::Vehicles TestUPVDismount(UPVItem, laraItem); - int frame = laraItem->Animation.FrameNumber - g_Level.Anims[laraItem->Animation.AnimNumber].frameBase; + int frame = laraItem->Animation.FrameNumber - GetAnimData(laraItem).frameBase; switch (laraItem->Animation.ActiveState) { diff --git a/TombEngine/Objects/TR4/Entity/Wraith.cpp b/TombEngine/Objects/TR4/Entity/Wraith.cpp index 5089ed39a..d050651b4 100644 --- a/TombEngine/Objects/TR4/Entity/Wraith.cpp +++ b/TombEngine/Objects/TR4/Entity/Wraith.cpp @@ -503,7 +503,7 @@ namespace TEN::Entities::TR4 SpawnWraithExplosion(item, Vector3(48.0f), 48.0f); if (target->TriggerFlags > 0) - target->Animation.FrameNumber = g_Level.Anims[target->Animation.AnimNumber].frameBase; + target->Animation.FrameNumber = GetAnimData(target).frameBase; target->ItemFlags[6] = 0; DoDamage(target, INT_MAX); diff --git a/TombEngine/Objects/TR4/Entity/tr4_ahmet.cpp b/TombEngine/Objects/TR4/Entity/tr4_ahmet.cpp index 9fb5b745a..f06adc089 100644 --- a/TombEngine/Objects/TR4/Entity/tr4_ahmet.cpp +++ b/TombEngine/Objects/TR4/Entity/tr4_ahmet.cpp @@ -137,9 +137,9 @@ namespace TEN::Entities::TR4 if (item->Animation.ActiveState == AHMET_STATE_DEATH) { // Don't clear. - if (item->Animation.FrameNumber == g_Level.Anims[item->Animation.AnimNumber].frameEnd) + if (item->Animation.FrameNumber == GetAnimData(item).frameEnd) { - item->Animation.FrameNumber = (g_Level.Anims[item->Animation.AnimNumber].frameEnd - 1); + item->Animation.FrameNumber = (GetAnimData(item).frameEnd - 1); item->Collidable = false; } } @@ -284,7 +284,7 @@ namespace TEN::Entities::TR4 item->Pose.Orientation.y += AI.angle; if (!(creature->Flags & 1) && - item->Animation.FrameNumber > (g_Level.Anims[item->Animation.AnimNumber].frameBase + 7) && + item->Animation.FrameNumber > (GetAnimData(item).frameBase + 7) && item->TouchBits.Test(AhmetSwipeAttackLeftJoints)) { DoDamage(creature->Enemy, AHMET_SWIPE_ATTACK_DAMAGE); @@ -292,7 +292,7 @@ namespace TEN::Entities::TR4 creature->Flags |= 1; } else if (!(creature->Flags & 2) && - item->Animation.FrameNumber > (g_Level.Anims[item->Animation.AnimNumber].frameBase + 32) && + item->Animation.FrameNumber > (GetAnimData(item).frameBase + 32) && item->TouchBits.Test(AhmetSwipeAttackRightJoints)) { DoDamage(creature->Enemy, AHMET_SWIPE_ATTACK_DAMAGE); @@ -322,7 +322,7 @@ namespace TEN::Entities::TR4 if (!(creature->Flags & 1) && item->Animation.AnimNumber == (Objects[item->ObjectNumber].animIndex + AHMET_ANIM_JUMP_BITE_ATTACK_CONTINUE)) { - if (item->Animation.FrameNumber > (g_Level.Anims[item->Animation.AnimNumber].frameBase + 11) && + if (item->Animation.FrameNumber > (GetAnimData(item).frameBase + 11) && item->TouchBits.Test(AhmetSwipeAttackLeftJoints)) { DoDamage(creature->Enemy, AHMET_BITE_ATTACK_DAMAGE); @@ -352,7 +352,7 @@ namespace TEN::Entities::TR4 else { if (!(creature->Flags & 1) && - item->Animation.FrameNumber > (g_Level.Anims[item->Animation.AnimNumber].frameBase + 14) && + item->Animation.FrameNumber > (GetAnimData(item).frameBase + 14) && item->TouchBits.Test(AhmetSwipeAttackLeftJoints)) { DoDamage(creature->Enemy, AHMET_SWIPE_ATTACK_DAMAGE); @@ -360,7 +360,7 @@ namespace TEN::Entities::TR4 creature->Flags |= 1; } else if (!(creature->Flags & 2) && - item->Animation.FrameNumber > (g_Level.Anims[item->Animation.AnimNumber].frameBase + 22) && + item->Animation.FrameNumber > (GetAnimData(item).frameBase + 22) && item->TouchBits.Test(AhmetSwipeAttackRightJoints)) { DoDamage(creature->Enemy, AHMET_SWIPE_ATTACK_DAMAGE); @@ -384,7 +384,7 @@ namespace TEN::Entities::TR4 auto* item = &g_Level.Items[itemNumber]; if (item->Animation.ActiveState != AHMET_STATE_DEATH || - item->Animation.FrameNumber != g_Level.Anims[item->Animation.AnimNumber].frameEnd) + item->Animation.FrameNumber != GetAnimData(item).frameEnd) { return false; } diff --git a/TombEngine/Objects/TR4/Entity/tr4_baboon.cpp b/TombEngine/Objects/TR4/Entity/tr4_baboon.cpp index a09b542d7..004b8a1c7 100644 --- a/TombEngine/Objects/TR4/Entity/tr4_baboon.cpp +++ b/TombEngine/Objects/TR4/Entity/tr4_baboon.cpp @@ -263,7 +263,7 @@ namespace TEN::Entities::TR4 { if (item->Animation.ActiveState == BABOON_STATE_WALK) { - if (item->Animation.FrameNumber == g_Level.Anims[item->Animation.AnimNumber].frameEnd) + if (item->Animation.FrameNumber == GetAnimData(item).frameEnd) BaboonRespawnFunction(itemNumber); } else if (item->Animation.ActiveState != BABOON_ACTIVATE_SWITCH) @@ -486,7 +486,7 @@ namespace TEN::Entities::TR4 creature->MaxTurn = 0; item->HitPoints = NOT_TARGETABLE; - if (item->Animation.FrameNumber == g_Level.Anims[item->Animation.AnimNumber].frameBase + 212) + if (item->Animation.FrameNumber == GetAnimData(item).frameBase + 212) { auto pos = Vector3i::Zero; if (item->Pose.Orientation.y == ANGLE(270.0f)) diff --git a/TombEngine/Objects/TR4/Entity/tr4_baddy.cpp b/TombEngine/Objects/TR4/Entity/tr4_baddy.cpp index 68cb490ed..2e3f9e3a5 100644 --- a/TombEngine/Objects/TR4/Entity/tr4_baddy.cpp +++ b/TombEngine/Objects/TR4/Entity/tr4_baddy.cpp @@ -242,7 +242,7 @@ namespace TEN::Entities::TR4 if (!ocb || ocb > 4 && ocb < 7) { item->Animation.AnimNumber = Objects[objectNumber].animIndex + BADDY_ANIM_STAND_IDLE; - item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.FrameNumber = GetAnimData(item).frameBase; item->Animation.TargetState = BADDY_STATE_IDLE; item->Animation.ActiveState = BADDY_STATE_IDLE; return; @@ -252,7 +252,7 @@ namespace TEN::Entities::TR4 if (ocb == 1) { item->Animation.AnimNumber = Objects[objectNumber].animIndex + BADDY_ANIM_STAND_TO_JUMP_RIGHT; - item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.FrameNumber = GetAnimData(item).frameBase; item->Animation.TargetState = BADDY_STATE_JUMP_RIGHT; item->Animation.ActiveState = BADDY_STATE_JUMP_RIGHT; return; @@ -262,7 +262,7 @@ namespace TEN::Entities::TR4 if (ocb == 2) { item->Animation.AnimNumber = Objects[objectNumber].animIndex + BADDY_ANIM_STAND_TO_ROLL_LEFT; - item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.FrameNumber = GetAnimData(item).frameBase; item->Animation.TargetState = BADDY_STATE_ROLL_LEFT; item->Animation.ActiveState = BADDY_STATE_ROLL_LEFT; return; @@ -272,7 +272,7 @@ namespace TEN::Entities::TR4 if (ocb == 3) { item->Animation.AnimNumber = Objects[objectNumber].animIndex + BADDY_ANIM_CROUCH; - item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.FrameNumber = GetAnimData(item).frameBase; item->Animation.TargetState = BADDY_STATE_CROUCH; item->Animation.ActiveState = BADDY_STATE_CROUCH; return; @@ -282,7 +282,7 @@ namespace TEN::Entities::TR4 if (ocb == 4) { item->Animation.AnimNumber = Objects[objectNumber].animIndex + BADDY_ANIM_CLIMB_4_STEPS; - item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.FrameNumber = GetAnimData(item).frameBase; item->Animation.TargetState = BADDY_STATE_CLIMB_4_STEPS; item->Animation.ActiveState = BADDY_STATE_CLIMB_4_STEPS; item->Pose.Position.x += phd_sin(item->Pose.Orientation.y) * CLICK(4); @@ -294,7 +294,7 @@ namespace TEN::Entities::TR4 if (ocb > 100) { item->Animation.AnimNumber = Objects[objectNumber].animIndex + BADDY_ANIM_CROUCH; - item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.FrameNumber = GetAnimData(item).frameBase; item->Animation.TargetState = BADDY_STATE_CROUCH; item->Animation.ActiveState = BADDY_STATE_CROUCH; item->Pose.Position.x += phd_sin(item->Pose.Orientation.y) * CLICK(4); @@ -303,7 +303,7 @@ namespace TEN::Entities::TR4 return; } - item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.FrameNumber = GetAnimData(item).frameBase; } void BaddyControl(short itemNumber) @@ -470,14 +470,14 @@ namespace TEN::Entities::TR4 case BADDY_STATE_MONKEY_IDLE: case BADDY_STATE_MONKEY_FORWARD: item->Animation.AnimNumber = Objects[objectNumber].animIndex + BADDY_ANIM_MONKEY_TO_FREEFALL; - item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.FrameNumber = GetAnimData(item).frameBase; item->Animation.ActiveState = BADDY_STATE_MONKEY_TO_FREEFALL; item->Animation.Velocity.z = 0; break; default: item->Animation.AnimNumber = Objects[objectNumber].animIndex + BADDY_ANIM_STAND_DEATH; - item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.FrameNumber = GetAnimData(item).frameBase; item->Animation.ActiveState = BADDY_STATE_DEATH; currentCreature->LOT.IsJumping = true; @@ -685,7 +685,7 @@ namespace TEN::Entities::TR4 currentCreature->LOT.IsJumping = true; item->Animation.AnimNumber = Objects[objectNumber].animIndex + BADDY_ANIM_STAND_TO_JUMP_FORWARD; - item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.FrameNumber = GetAnimData(item).frameBase; item->Animation.ActiveState = BADDY_STATE_JUMP_FORWARD_1_BLOCK; if (!canJump2Sectors) @@ -863,7 +863,7 @@ namespace TEN::Entities::TR4 if (Random::GenerateInt(0, 30) > 20 && objectNumber == ID_BADDY2 && - item->Animation.FrameNumber == g_Level.Anims[item->Animation.AnimNumber].frameBase + FRAME_BADDY_RUN_TO_SOMERSAULT && + item->Animation.FrameNumber == GetAnimData(item).frameBase + FRAME_BADDY_RUN_TO_SOMERSAULT && height3 == height1 && abs(height1 - item->Pose.Position.y) < CLICK(1.5f) && (AI.angle > -ANGLE(22.5f) && AI.angle < ANGLE(22.5f) && AI.distance < pow(SECTOR(3), 2) || height2 >= (height1 + CLICK(2)))) @@ -913,7 +913,7 @@ namespace TEN::Entities::TR4 } if (item->Animation.ActiveState != BADDY_STATE_SWORD_HIT_FRONT || - item->Animation.FrameNumber < g_Level.Anims[item->Animation.AnimNumber].frameBase + FRAME_BADDY_SWORD_HIT_NO_DAMAGE_MAX) + item->Animation.FrameNumber < GetAnimData(item).frameBase + FRAME_BADDY_SWORD_HIT_NO_DAMAGE_MAX) { if (abs(AI.angle) >= ANGLE(7.0f)) { @@ -930,8 +930,8 @@ namespace TEN::Entities::TR4 { if (item->TouchBits.Test(BaddySwordAttackJoints)) { - if (item->Animation.FrameNumber > g_Level.Anims[item->Animation.AnimNumber].frameBase + FRAME_BADDY_SWORD_HIT_DAMAGE_MIN && - item->Animation.FrameNumber < g_Level.Anims[item->Animation.AnimNumber].frameBase + FRAME_BADDY_SWORD_HIT_DAMAGE_MAX) + if (item->Animation.FrameNumber > GetAnimData(item).frameBase + FRAME_BADDY_SWORD_HIT_DAMAGE_MIN && + item->Animation.FrameNumber < GetAnimData(item).frameBase + FRAME_BADDY_SWORD_HIT_DAMAGE_MAX) { DoDamage(creature->Enemy, 120); CreatureEffect2(item, BaddySwordBite, 10, item->Pose.Orientation.y, DoBloodSplat); @@ -940,7 +940,7 @@ namespace TEN::Entities::TR4 } } - if (item->Animation.FrameNumber == g_Level.Anims[item->Animation.AnimNumber].frameEnd - 1) + if (item->Animation.FrameNumber == GetAnimData(item).frameEnd - 1) currentCreature->Flags = 0; break; @@ -1073,7 +1073,7 @@ namespace TEN::Entities::TR4 case BADDY_STATE_CROUCH_PICKUP: ClampRotation(item->Pose, AI.angle, ANGLE(11.0f)); - if (item->Animation.FrameNumber != g_Level.Anims[item->Animation.AnimNumber].frameBase + FRAME_BADDY_CROUCH_PICKUP) + if (item->Animation.FrameNumber != GetAnimData(item).frameBase + FRAME_BADDY_CROUCH_PICKUP) break; if (!currentCreature->Enemy) @@ -1147,8 +1147,8 @@ namespace TEN::Entities::TR4 } ClampRotation(item->Pose, AI.angle, ANGLE(7.0f)); - if (item->Animation.FrameNumber >= g_Level.Anims[item->Animation.AnimNumber].frameBase + FRAME_BADDY_FIRE_MAX || - item->Animation.FrameNumber == g_Level.Anims[item->Animation.AnimNumber].frameBase + FRAME_BADDY_FIRE_MIN) + if (item->Animation.FrameNumber >= GetAnimData(item).frameBase + FRAME_BADDY_FIRE_MAX || + item->Animation.FrameNumber == GetAnimData(item).frameBase + FRAME_BADDY_FIRE_MIN) { break; } @@ -1167,25 +1167,25 @@ namespace TEN::Entities::TR4 break; case BADDY_STATE_HOLSTER_GUN: - if (item->Animation.FrameNumber == g_Level.Anims[item->Animation.AnimNumber].frameBase + FRAME_BADDY_HOLSTER_GUN) + if (item->Animation.FrameNumber == GetAnimData(item).frameBase + FRAME_BADDY_HOLSTER_GUN) item->SetMeshSwapFlags(MESHSWAPFLAGS_BADDY_EMPTY); break; case BADDY_STATE_DRAW_GUN: - if (item->Animation.FrameNumber == g_Level.Anims[item->Animation.AnimNumber].frameBase + FRAME_BADDY_DRAW_GUN) + if (item->Animation.FrameNumber == GetAnimData(item).frameBase + FRAME_BADDY_DRAW_GUN) item->SetMeshSwapFlags(MESHSWAPFLAGS_BADDY_GUN); break; case BADDY_STATE_HOLSTER_SWORD: - if (item->Animation.FrameNumber == g_Level.Anims[item->Animation.AnimNumber].frameBase + FRAME_BADDY_HOLSTER_SWORD) + if (item->Animation.FrameNumber == GetAnimData(item).frameBase + FRAME_BADDY_HOLSTER_SWORD) item->SetMeshSwapFlags(MESHSWAPFLAGS_BADDY_EMPTY); break; case BADDY_STATE_DRAW_SWORD: - if (item->Animation.FrameNumber != g_Level.Anims[item->Animation.AnimNumber].frameBase + FRAME_BADDY_DRAW_SWORD) + if (item->Animation.FrameNumber != GetAnimData(item).frameBase + FRAME_BADDY_DRAW_SWORD) break; if (item->ObjectNumber == ID_BADDY1) @@ -1224,7 +1224,7 @@ namespace TEN::Entities::TR4 break; } - if (item->Animation.FrameNumber != (g_Level.Anims[item->Animation.AnimNumber].frameBase + FRAME_BADDY_SOMERSAULT_START_TAKE_OFF)) + if (item->Animation.FrameNumber != (GetAnimData(item).frameBase + FRAME_BADDY_SOMERSAULT_START_TAKE_OFF)) break; currentCreature->LOT.IsJumping = true; diff --git a/TombEngine/Objects/TR4/Entity/tr4_big_scorpion.cpp b/TombEngine/Objects/TR4/Entity/tr4_big_scorpion.cpp index 663cc76de..01738e4bb 100644 --- a/TombEngine/Objects/TR4/Entity/tr4_big_scorpion.cpp +++ b/TombEngine/Objects/TR4/Entity/tr4_big_scorpion.cpp @@ -262,7 +262,7 @@ namespace TEN::Entities::TR4 case BSCORPION_STATE_KILL_TROOP: creature->MaxTurn = 0; - if (item->Animation.FrameNumber == g_Level.Anims[item->Animation.AnimNumber].frameEnd) + if (item->Animation.FrameNumber == GetAnimData(item).frameEnd) item->TriggerFlags++; if ((creature->Enemy != nullptr && creature->Enemy->HitPoints <= 0) || diff --git a/TombEngine/Objects/TR4/Entity/tr4_crocodile.cpp b/TombEngine/Objects/TR4/Entity/tr4_crocodile.cpp index 4da3df8a5..b44e6cf2f 100644 --- a/TombEngine/Objects/TR4/Entity/tr4_crocodile.cpp +++ b/TombEngine/Objects/TR4/Entity/tr4_crocodile.cpp @@ -240,7 +240,7 @@ namespace TEN::Entities::TR4 break; case CROC_STATE_BITE_ATTACK: - if (item->Animation.FrameNumber == g_Level.Anims[item->Animation.AnimNumber].frameBase) + if (item->Animation.FrameNumber == GetAnimData(item).frameBase) item->Animation.RequiredState = NO_STATE; if (AI.bite && @@ -279,7 +279,7 @@ namespace TEN::Entities::TR4 break; case CROC_STATE_WATER_BITE_ATTACK: - if (item->Animation.FrameNumber == g_Level.Anims[item->Animation.AnimNumber].frameBase) + if (item->Animation.FrameNumber == GetAnimData(item).frameBase) item->Animation.RequiredState = NO_STATE; if (AI.bite && item->TouchBits.Test(CrocodileBiteAttackJoints)) diff --git a/TombEngine/Objects/TR4/Entity/tr4_demigod.cpp b/TombEngine/Objects/TR4/Entity/tr4_demigod.cpp index 1f3f52ee4..a9c3254d9 100644 --- a/TombEngine/Objects/TR4/Entity/tr4_demigod.cpp +++ b/TombEngine/Objects/TR4/Entity/tr4_demigod.cpp @@ -217,7 +217,7 @@ namespace TEN::Entities::TR4 if (animIndex == DEMIGOD2_ANIM_SINGLE_PROJECTILE_ATTACK) { - if (item->Animation.FrameNumber == g_Level.Anims[item->Animation.AnimNumber].frameBase) + if (item->Animation.FrameNumber == GetAnimData(item).frameBase) { auto origin = GetJointPosition(item, 16, Vector3i(-544, 96, 0)); auto target = GetJointPosition(item, 16, Vector3i(-900, 96, 0)); @@ -232,7 +232,7 @@ namespace TEN::Entities::TR4 } else if (animIndex == DEMIGOD3_ANIM_SINGLE_PROJECTILE_ATTACK) { - if (item->Animation.FrameNumber == g_Level.Anims[item->Animation.AnimNumber].frameBase) + if (item->Animation.FrameNumber == GetAnimData(item).frameBase) { auto pos1 = GetJointPosition(item, 16, Vector3i(-544, 96, 0)); auto pos2 = GetJointPosition(item, 16, Vector3i(-900, 96, 0)); @@ -247,7 +247,7 @@ namespace TEN::Entities::TR4 } else if (animIndex == DEMIGOD3_ANIM_RADIAL_PROJECTILE_ATTACK) { - int frameNumber = item->Animation.FrameNumber - g_Level.Anims[item->Animation.AnimNumber].frameBase; + int frameNumber = item->Animation.FrameNumber - GetAnimData(item).frameBase; if (frameNumber >= 8 && frameNumber <= 64) { @@ -360,13 +360,13 @@ namespace TEN::Entities::TR4 item->Animation.ActiveState == DEMIGOD_STATE_RUN_FORWARD) { item->Animation.AnimNumber = Objects[item->ObjectNumber].animIndex + DEMIGOD_ANIM_RUN_OVER_DEATH; - item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.FrameNumber = GetAnimData(item).frameBase; item->Animation.ActiveState = DEMIGOD_STATE_RUN_OVER_DEATH; } else { item->Animation.AnimNumber = Objects[item->ObjectNumber].animIndex + DEMIGOD_ANIM_DEATH; - item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.FrameNumber = GetAnimData(item).frameBase; item->Animation.ActiveState = DEMIGOD_STATE_DEATH; } } @@ -694,7 +694,7 @@ namespace TEN::Entities::TR4 break; case DEMIGOD1_STATE_HAMMER_ATTACK: - if ((item->Animation.FrameNumber - g_Level.Anims[item->Animation.AnimNumber].frameBase) == DEMIGOD_ANIM_RUN_TO_IDLE) + if ((item->Animation.FrameNumber - GetAnimData(item).frameBase) == DEMIGOD_ANIM_RUN_TO_IDLE) { auto pos = GetJointPosition(item, 17, Vector3i(80, -8, -40)); diff --git a/TombEngine/Objects/TR4/Entity/tr4_dog.cpp b/TombEngine/Objects/TR4/Entity/tr4_dog.cpp index 0fb380422..be1852962 100644 --- a/TombEngine/Objects/TR4/Entity/tr4_dog.cpp +++ b/TombEngine/Objects/TR4/Entity/tr4_dog.cpp @@ -152,7 +152,7 @@ namespace TEN::Entities::TR4 item->AIBits &= ~MODIFY; } - int frame = item->Animation.FrameNumber - g_Level.Anims[item->Animation.AnimNumber].frameBase; + int frame = item->Animation.FrameNumber - GetAnimData(item).frameBase; switch (item->Animation.ActiveState) { diff --git a/TombEngine/Objects/TR4/Entity/tr4_enemy_jeep.cpp b/TombEngine/Objects/TR4/Entity/tr4_enemy_jeep.cpp index 20717fbd2..7fe04601c 100644 --- a/TombEngine/Objects/TR4/Entity/tr4_enemy_jeep.cpp +++ b/TombEngine/Objects/TR4/Entity/tr4_enemy_jeep.cpp @@ -212,7 +212,7 @@ namespace TEN::Entities::TR4 if (height4 > (item->Floor + CLICK(2)) && item->Animation.ActiveState != 5) { item->Animation.AnimNumber = Objects[item->ObjectNumber].animIndex + 8; - item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.FrameNumber = GetAnimData(item).frameBase; item->Animation.ActiveState = 5; item->Animation.TargetState = 1; item->ItemFlags[1] = 0; @@ -253,7 +253,7 @@ namespace TEN::Entities::TR4 if (Lara.Location < item->ItemFlags[3] && item->Animation.ActiveState != 2 && item->Animation.TargetState != 2) { item->Animation.AnimNumber = Objects[item->ObjectNumber].animIndex + 1; - item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.FrameNumber = GetAnimData(item).frameBase; item->Animation.TargetState = 2; item->Animation.ActiveState = 2; diff --git a/TombEngine/Objects/TR4/Entity/tr4_guide.cpp b/TombEngine/Objects/TR4/Entity/tr4_guide.cpp index a206ec3d2..9e61b9c20 100644 --- a/TombEngine/Objects/TR4/Entity/tr4_guide.cpp +++ b/TombEngine/Objects/TR4/Entity/tr4_guide.cpp @@ -133,8 +133,8 @@ namespace TEN::Entities::TR4 if (item->Animation.AnimNumber == (object->animIndex + GUIDE_ANIM_LIGHTING_TORCH)) { - if (item->Animation.FrameNumber > g_Level.Anims[item->Animation.AnimNumber].frameBase + 32 && - item->Animation.FrameNumber < g_Level.Anims[item->Animation.AnimNumber].frameBase + 42) + if (item->Animation.FrameNumber > GetAnimData(item).frameBase + 32 && + item->Animation.FrameNumber < GetAnimData(item).frameBase + 42) { TriggerFireFlame( (random & 0x3F) + pos.x - 32, @@ -480,7 +480,7 @@ namespace TEN::Entities::TR4 case GUIDE_STATE_IGNITE_TORCH: pos1 = GetJointPosition(item, GuideBite2); - frameNumber = item->Animation.FrameNumber - g_Level.Anims[item->Animation.AnimNumber].frameBase; + frameNumber = item->Animation.FrameNumber - GetAnimData(item).frameBase; random = GetRandomControl(); if (frameNumber == 32) @@ -588,8 +588,8 @@ namespace TEN::Entities::TR4 { if (enemy) { - if (item->Animation.FrameNumber > g_Level.Anims[item->Animation.AnimNumber].frameBase + 15 && - item->Animation.FrameNumber < g_Level.Anims[item->Animation.AnimNumber].frameBase + 26) + if (item->Animation.FrameNumber > GetAnimData(item).frameBase + 15 && + item->Animation.FrameNumber < GetAnimData(item).frameBase + 26) { float distance = Vector3i::Distance(item->Pose.Position, enemy->Pose.Position); if (distance <= CLICK(2)) @@ -631,7 +631,7 @@ namespace TEN::Entities::TR4 else { if (item->Animation.AnimNumber != (object->animIndex + GUIDE_ANIM_IDLE_CROUCH) && - item->Animation.FrameNumber == (g_Level.Anims[item->Animation.AnimNumber].frameEnd - 20)) + item->Animation.FrameNumber == (GetAnimData(item).frameEnd - 20)) { TestTriggers(item, true); @@ -647,12 +647,12 @@ namespace TEN::Entities::TR4 break; case GUIDE_STATE_PICK_UP_TORCH: - if (item->Animation.FrameNumber == g_Level.Anims[item->Animation.AnimNumber].frameBase) + if (item->Animation.FrameNumber == GetAnimData(item).frameBase) { someFlag = true; item->Pose = enemy->Pose; } - else if (item->Animation.FrameNumber == (g_Level.Anims[item->Animation.AnimNumber].frameBase + 35)) + else if (item->Animation.FrameNumber == (GetAnimData(item).frameBase + 35)) { item->SetMeshSwapFlags(GuideRightHandSwapJoints, true); @@ -692,11 +692,11 @@ namespace TEN::Entities::TR4 break; case GUIDE_STATE_LIGHT_TORCHES: - if (item->Animation.FrameNumber == g_Level.Anims[item->Animation.AnimNumber].frameBase) + if (item->Animation.FrameNumber == GetAnimData(item).frameBase) item->Pose.Position = enemy->Pose.Position; else { - if (item->Animation.FrameNumber == (g_Level.Anims[item->Animation.AnimNumber].frameBase + 42)) + if (item->Animation.FrameNumber == (GetAnimData(item).frameBase + 42)) { TestTriggers(item, true); @@ -707,7 +707,7 @@ namespace TEN::Entities::TR4 creature->Enemy = nullptr; break; } - else if (item->Animation.FrameNumber < (g_Level.Anims[item->Animation.AnimNumber].frameBase + 42)) + else if (item->Animation.FrameNumber < (GetAnimData(item).frameBase + 42)) { if ((enemy->Pose.Orientation.y - item->Pose.Orientation.y) <= ANGLE(2.0f)) { @@ -722,9 +722,9 @@ namespace TEN::Entities::TR4 break; case GUIDE_STATE_READ_INSCRIPTION: - if (item->Animation.FrameNumber >= g_Level.Anims[item->Animation.AnimNumber].frameBase + 20) + if (item->Animation.FrameNumber >= GetAnimData(item).frameBase + 20) { - if (item->Animation.FrameNumber == (g_Level.Anims[item->Animation.AnimNumber].frameBase + 20)) + if (item->Animation.FrameNumber == (GetAnimData(item).frameBase + 20)) { item->Animation.TargetState = GUIDE_STATE_IDLE; @@ -737,14 +737,14 @@ namespace TEN::Entities::TR4 break; } - if (item->Animation.FrameNumber == (g_Level.Anims[item->Animation.AnimNumber].frameBase + 70) && + if (item->Animation.FrameNumber == (GetAnimData(item).frameBase + 70) && flagScaryInscription) { item->Animation.RequiredState = GUIDE_STATE_RUN_FORWARD; item->SetMeshSwapFlags(GuideHeadSwapJoints); SoundEffect(SFX_TR4_GUIDE_SCARE, &item->Pose); } - if (item->Animation.FrameNumber == (g_Level.Anims[item->Animation.AnimNumber].frameBase + 185) && + if (item->Animation.FrameNumber == (GetAnimData(item).frameBase + 185) && flagScaryInscription) { item->ItemFlags[2] &= ~(1 << 4); // Turn off 4th bit for flagScaryInscription. diff --git a/TombEngine/Objects/TR4/Entity/tr4_horseman.cpp b/TombEngine/Objects/TR4/Entity/tr4_horseman.cpp index f3741bbc7..5c0944e5b 100644 --- a/TombEngine/Objects/TR4/Entity/tr4_horseman.cpp +++ b/TombEngine/Objects/TR4/Entity/tr4_horseman.cpp @@ -273,7 +273,7 @@ namespace TEN::Entities::TR4 { item->Animation.AnimNumber = Objects[ID_HORSEMAN].animIndex + HORSEMAN_ANIM_DEATH; item->Animation.ActiveState = HORSEMAN_STATE_DEATH; - item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.FrameNumber = GetAnimData(item).frameBase; if (item->ItemFlags[0]) { @@ -288,7 +288,7 @@ namespace TEN::Entities::TR4 item->AIBits = 0; item->ItemFlags[1] = 0; item->Animation.AnimNumber = Objects[ID_HORSEMAN].animIndex + HORSEMAN_ANIM_FALL_OFF_HORSE_START; - item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.FrameNumber = GetAnimData(item).frameBase; item->Animation.ActiveState = HORSEMAN_STATE_FALL_OFF_HORSE; creature->Enemy = nullptr; @@ -522,10 +522,10 @@ namespace TEN::Entities::TR4 case HORSEMAN_STATE_MOUNTED_REAR: creature->MaxTurn = 0; - if (item->Animation.FrameNumber == g_Level.Anims[item->Animation.AnimNumber].frameBase) + if (item->Animation.FrameNumber == GetAnimData(item).frameBase) { horseItem->Animation.AnimNumber = Objects[ID_HORSE].animIndex + HORSE_ANIM_REAR; - horseItem->Animation.FrameNumber = g_Level.Anims[horseItem->Animation.AnimNumber].frameBase; + horseItem->Animation.FrameNumber = GetAnimData(horseItem).frameBase; horseItem->Animation.ActiveState = HORSE_STATE_REAR; } @@ -608,7 +608,7 @@ namespace TEN::Entities::TR4 creature->Enemy = nullptr; item->Animation.AnimNumber = Objects[ID_HORSEMAN].animIndex + HORSEMAN_ANIM_MOUNT_HORSE; - item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.FrameNumber = GetAnimData(item).frameBase; item->Animation.ActiveState = HORSEMAN_STATE_MOUNT_HORSE; creature->MaxTurn = 0; @@ -715,10 +715,10 @@ namespace TEN::Entities::TR4 } if (item->Animation.AnimNumber == Objects[ID_HORSEMAN].animIndex + HORSEMAN_ANIM_MOUNTED_SPRINT && - item->Animation.FrameNumber == g_Level.Anims[item->Animation.AnimNumber].frameBase) + item->Animation.FrameNumber == GetAnimData(item).frameBase) { horseItem->Animation.AnimNumber = Objects[ID_HORSE].animIndex + HORSE_ANIM_SPRINT; - horseItem->Animation.FrameNumber = g_Level.Anims[horseItem->Animation.AnimNumber].frameBase; + horseItem->Animation.FrameNumber = GetAnimData(horseItem).frameBase; } if (laraAI.distance > pow(SECTOR(4), 2) || creature->ReachedGoal) diff --git a/TombEngine/Objects/TR4/Entity/tr4_jean_yves.cpp b/TombEngine/Objects/TR4/Entity/tr4_jean_yves.cpp index a5b26fb17..bd7e01c14 100644 --- a/TombEngine/Objects/TR4/Entity/tr4_jean_yves.cpp +++ b/TombEngine/Objects/TR4/Entity/tr4_jean_yves.cpp @@ -39,7 +39,7 @@ namespace TEN::Entities::TR4 item->Animation.TargetState = JEAN_YVES_STATE_HANDS_BEHIND_HEAD; item->Animation.ActiveState = JEAN_YVES_STATE_HANDS_BEHIND_HEAD; item->Animation.AnimNumber = objectInfo->animIndex; - item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.FrameNumber = GetAnimData(item).frameBase; } void JeanYvesControl(short itemNumber) @@ -68,7 +68,7 @@ namespace TEN::Entities::TR4 state++; item->Animation.AnimNumber = animNumber; - item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.FrameNumber = GetAnimData(item).frameBase; item->Animation.ActiveState = state; item->Animation.TargetState = state; item->TriggerFlags = Lara.HighestLocation; diff --git a/TombEngine/Objects/TR4/Entity/tr4_knight_templar.cpp b/TombEngine/Objects/TR4/Entity/tr4_knight_templar.cpp index b358a32c5..68688389a 100644 --- a/TombEngine/Objects/TR4/Entity/tr4_knight_templar.cpp +++ b/TombEngine/Objects/TR4/Entity/tr4_knight_templar.cpp @@ -179,7 +179,7 @@ namespace TEN::Entities::TR4 } frameNumber = item->Animation.FrameNumber; - frameBase = g_Level.Anims[item->Animation.AnimNumber].frameBase; + frameBase = GetAnimData(item).frameBase; if (frameNumber > (frameBase + 42) && frameNumber < (frameBase + 51)) { diff --git a/TombEngine/Objects/TR4/Entity/tr4_mummy.cpp b/TombEngine/Objects/TR4/Entity/tr4_mummy.cpp index a2949189e..464e47ee0 100644 --- a/TombEngine/Objects/TR4/Entity/tr4_mummy.cpp +++ b/TombEngine/Objects/TR4/Entity/tr4_mummy.cpp @@ -141,7 +141,7 @@ namespace TEN::Entities::TR4 item->Animation.AnimNumber = Objects[item->ObjectNumber].animIndex + MUMMY_ANIM_RECOIL; } - item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.FrameNumber = GetAnimData(item).frameBase; item->Pose.Orientation.y += AI.angle; } } @@ -200,7 +200,7 @@ namespace TEN::Entities::TR4 { creature->MaxTurn = 0; - if (item->Animation.FrameNumber == g_Level.Anims[item->Animation.AnimNumber].frameEnd) + if (item->Animation.FrameNumber == GetAnimData(item).frameEnd) item->TriggerFlags = 0; } else @@ -282,8 +282,8 @@ namespace TEN::Entities::TR4 { if (item->TouchBits.Test(MummySwipeAttackJoints)) { - if (item->Animation.FrameNumber > g_Level.Anims[item->Animation.AnimNumber].frameBase && - item->Animation.FrameNumber < g_Level.Anims[item->Animation.AnimNumber].frameEnd) + if (item->Animation.FrameNumber > GetAnimData(item).frameBase && + item->Animation.FrameNumber < GetAnimData(item).frameEnd) { DoDamage(creature->Enemy, MUMMY_SWIPE_ATTACK_DAMAGE); diff --git a/TombEngine/Objects/TR4/Entity/tr4_mutant.cpp b/TombEngine/Objects/TR4/Entity/tr4_mutant.cpp index f35f66966..6e992041f 100644 --- a/TombEngine/Objects/TR4/Entity/tr4_mutant.cpp +++ b/TombEngine/Objects/TR4/Entity/tr4_mutant.cpp @@ -156,7 +156,7 @@ namespace TEN::Entities::TR4 bool ShootFrame(ItemInfo* item) { - int frameNumber = (item->Animation.FrameNumber - g_Level.Anims[item->Animation.AnimNumber].frameBase); + int frameNumber = (item->Animation.FrameNumber - GetAnimData(item).frameBase); if (frameNumber == 45 || /*frameNumber == 50 || frameNumber == 55 ||*/ @@ -258,7 +258,7 @@ namespace TEN::Entities::TR4 auto* item = &g_Level.Items[itemNumber]; item->Animation.AnimNumber = Objects[item->ObjectNumber].animIndex + MUTANT_ANIM_APPEAR; - item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.FrameNumber = GetAnimData(item).frameBase; item->Animation.ActiveState = MUTANT_STATE_APPEAR; item->Animation.TargetState = MUTANT_STATE_APPEAR; } @@ -309,7 +309,7 @@ namespace TEN::Entities::TR4 break; case MUTANT_STATE_PROJECTILE_ATTACK: - frameNumber = item->Animation.FrameNumber - g_Level.Anims[item->Animation.AnimNumber].frameBase; + frameNumber = item->Animation.FrameNumber - GetAnimData(item).frameBase; if (frameNumber >= 94 && frameNumber <= 96) { Pose src; @@ -332,7 +332,7 @@ namespace TEN::Entities::TR4 break; case MUTANT_STATE_LOCUST_ATTACK_1: - frameNumber = (item->Animation.FrameNumber - g_Level.Anims[item->Animation.AnimNumber].frameBase); + frameNumber = (item->Animation.FrameNumber - GetAnimData(item).frameBase); if (frameNumber >= 60 && frameNumber <= 120) SpawnLocust(item); diff --git a/TombEngine/Objects/TR4/Entity/tr4_sas.cpp b/TombEngine/Objects/TR4/Entity/tr4_sas.cpp index 25d447de5..a724125e4 100644 --- a/TombEngine/Objects/TR4/Entity/tr4_sas.cpp +++ b/TombEngine/Objects/TR4/Entity/tr4_sas.cpp @@ -127,7 +127,7 @@ namespace TEN::Entities::TR4 item.Animation.TargetState = item.Animation.ActiveState = 4; } - item.Animation.FrameNumber = g_Level.Anims[item.Animation.AnimNumber].frameBase; + item.Animation.FrameNumber = GetAnimData(item).frameBase; } void SasControl(short itemNumber) @@ -474,7 +474,7 @@ namespace TEN::Entities::TR4 angle2 = 0; } - if (item.Animation.FrameNumber == (g_Level.Anims[item.Animation.AnimNumber].frameBase + 20)) + if (item.Animation.FrameNumber == (GetAnimData(item).frameBase + 20)) { if (!creature.Enemy->Animation.Velocity.z) { diff --git a/TombEngine/Objects/TR4/Entity/tr4_setha.cpp b/TombEngine/Objects/TR4/Entity/tr4_setha.cpp index 7db795150..c178942ee 100644 --- a/TombEngine/Objects/TR4/Entity/tr4_setha.cpp +++ b/TombEngine/Objects/TR4/Entity/tr4_setha.cpp @@ -300,7 +300,7 @@ namespace TEN::Entities::TR4 if (canJump) { if (item->Animation.AnimNumber == (Objects[item->ObjectNumber].animIndex + SETH_ANIM_POUNCE_ATTACK_START) && - item->Animation.FrameNumber == g_Level.Anims[item->Animation.AnimNumber].frameBase) + item->Animation.FrameNumber == GetAnimData(item).frameBase) { creature.MaxTurn = 0; creature.ReachedGoal = true; @@ -340,7 +340,7 @@ namespace TEN::Entities::TR4 case SETH_STATE_HARD_RECOIL: if (item->Animation.AnimNumber == (Objects[item->Animation.AnimNumber].animIndex + SETH_ANIM_HARD_RECOIL_START) && - item->Animation.FrameNumber == g_Level.Anims[item->Animation.AnimNumber].frameEnd) + item->Animation.FrameNumber == GetAnimData(item).frameEnd) { if (Random::TestProbability(SETH_HARD_RECOIL_RECOVER_CHANCE)) item->Animation.RequiredState = SETH_STATE_HARD_RECOIL_RECOVER; @@ -367,8 +367,8 @@ namespace TEN::Entities::TR4 { if (item->TouchBits.TestAny()) { - if (item->Animation.FrameNumber > (g_Level.Anims[item->Animation.AnimNumber].frameBase + SETH_ANIM_POUNCE_ATTACK_START) && - item->Animation.FrameNumber < (g_Level.Anims[item->Animation.AnimNumber].frameBase + SETH_ANIM_IDLE_TO_HOVER)) + if (item->Animation.FrameNumber > (GetAnimData(item).frameBase + SETH_ANIM_POUNCE_ATTACK_START) && + item->Animation.FrameNumber < (GetAnimData(item).frameBase + SETH_ANIM_IDLE_TO_HOVER)) { DoDamage(creature.Enemy, SETH_KILL_ATTACK_DAMAGE); CreatureEffect2(item, SethBite1, 25, -1, DoBloodSplat); diff --git a/TombEngine/Objects/TR4/Entity/tr4_skeleton.cpp b/TombEngine/Objects/TR4/Entity/tr4_skeleton.cpp index c50d6bdef..265858122 100644 --- a/TombEngine/Objects/TR4/Entity/tr4_skeleton.cpp +++ b/TombEngine/Objects/TR4/Entity/tr4_skeleton.cpp @@ -284,7 +284,7 @@ namespace TEN::Entities::TR4 item->Pose.Orientation.y += AI.angle; } - item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.FrameNumber = GetAnimData(item).frameBase; creature->LOT.IsJumping = true; } else @@ -413,7 +413,7 @@ namespace TEN::Entities::TR4 else if (canJump1Block || canJump2Blocks) { item->Animation.AnimNumber = Objects[ID_SKELETON].animIndex + 40; - item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.FrameNumber = GetAnimData(item).frameBase; item->Animation.ActiveState = SKELETON_STATE_JUMP_LEFT; creature->MaxTurn = 0; @@ -560,7 +560,7 @@ namespace TEN::Entities::TR4 if (GetCollision(item).Position.Floor > item->Pose.Position.y + BLOCK(1)) { item->Animation.AnimNumber = Objects[ID_SKELETON].animIndex + 44; - item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.FrameNumber = GetAnimData(item).frameBase; item->Animation.ActiveState = 23; item->Animation.IsAirborne = true; creature->MaxTurn = 0; @@ -635,7 +635,7 @@ namespace TEN::Entities::TR4 item->Pose.Orientation.y += AI.angle; } - if (item->Animation.FrameNumber > (g_Level.Anims[item->Animation.AnimNumber].frameBase + 15)) + if (item->Animation.FrameNumber > (GetAnimData(item).frameBase + 15)) { auto* room = &g_Level.Rooms[item->RoomNumber]; @@ -705,7 +705,7 @@ namespace TEN::Entities::TR4 if (GetCollision(item).Position.Floor > (item->Pose.Position.y + CLICK(5))) { item->Animation.AnimNumber = Objects[item->ObjectNumber].animIndex + 44; - item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.FrameNumber = GetAnimData(item).frameBase; item->Animation.ActiveState = 23; item->Animation.IsAirborne = true; creature->MaxTurn = 0; @@ -736,7 +736,7 @@ namespace TEN::Entities::TR4 case SKELETON_STATE_RECOIL_BACK: if ((item->Animation.ActiveState == SKELETON_STATE_RECOIL_FRONT || item->Animation.ActiveState == SKELETON_STATE_RECOIL_BACK) && - item->Animation.FrameNumber < g_Level.Anims[item->Animation.AnimNumber].frameBase + 20) + item->Animation.FrameNumber < GetAnimData(item).frameBase + 20) { creature->MaxTurn = 0; break; @@ -758,7 +758,7 @@ namespace TEN::Entities::TR4 else { item->Animation.AnimNumber = Objects[item->ObjectNumber].animIndex + 47; - item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.FrameNumber = GetAnimData(item).frameBase; item->Animation.ActiveState = 24; item->Animation.IsAirborne = true; creature->MaxTurn = 0; @@ -775,7 +775,7 @@ namespace TEN::Entities::TR4 break; case SKELETON_STATE_SUBTERRANEAN: - if (item->Animation.FrameNumber - g_Level.Anims[item->Animation.AnimNumber].frameBase < 32) + if (item->Animation.FrameNumber - GetAnimData(item).frameBase < 32) TriggerRiseEffect(item); break; diff --git a/TombEngine/Objects/TR4/Entity/tr4_small_scorpion.cpp b/TombEngine/Objects/TR4/Entity/tr4_small_scorpion.cpp index ed92f58f5..2223ac832 100644 --- a/TombEngine/Objects/TR4/Entity/tr4_small_scorpion.cpp +++ b/TombEngine/Objects/TR4/Entity/tr4_small_scorpion.cpp @@ -159,8 +159,8 @@ namespace TEN::Entities::TR4 { if (item->TouchBits.Test(SmallScorpionAttackJoints)) { - if (item->Animation.FrameNumber > g_Level.Anims[item->Animation.AnimNumber].frameBase + 20 && - item->Animation.FrameNumber < g_Level.Anims[item->Animation.AnimNumber].frameBase + 32) + if (item->Animation.FrameNumber > GetAnimData(item).frameBase + 20 && + item->Animation.FrameNumber < GetAnimData(item).frameBase + 32) { short rotation; CreatureBiteInfo biteInfo; diff --git a/TombEngine/Objects/TR4/Entity/tr4_sphinx.cpp b/TombEngine/Objects/TR4/Entity/tr4_sphinx.cpp index 6db80dba5..23be38791 100644 --- a/TombEngine/Objects/TR4/Entity/tr4_sphinx.cpp +++ b/TombEngine/Objects/TR4/Entity/tr4_sphinx.cpp @@ -220,7 +220,7 @@ namespace TEN::Entities::TR4 break; case SPHINX_STATE_COLLIDE: - if (item->Animation.FrameNumber == g_Level.Anims[item->Animation.AnimNumber].frameBase) + if (item->Animation.FrameNumber == GetAnimData(item).frameBase) { TestTriggers(item, true); diff --git a/TombEngine/Objects/TR4/Entity/tr4_troops.cpp b/TombEngine/Objects/TR4/Entity/tr4_troops.cpp index ab0513b12..5933f4b3e 100644 --- a/TombEngine/Objects/TR4/Entity/tr4_troops.cpp +++ b/TombEngine/Objects/TR4/Entity/tr4_troops.cpp @@ -64,7 +64,7 @@ namespace TEN::Entities::TR4 item->Animation.AnimNumber = Objects[item->ObjectNumber].animIndex + 12; } - item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.FrameNumber = GetAnimData(item).frameBase; } void TroopsControl(short itemNumber) @@ -104,9 +104,9 @@ namespace TEN::Entities::TR4 item->Animation.AnimNumber = Objects[item->ObjectNumber].animIndex + 23; if (item->Animation.ActiveState == TROOP_STATE_ATTACKED_BY_SCORPION) - item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase + 37; + item->Animation.FrameNumber = GetAnimData(item).frameBase + 37; else - item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.FrameNumber = GetAnimData(item).frameBase; item->Animation.ActiveState = TROOP_STATE_KILLED_BY_SCORPION; item->Animation.TargetState = TROOP_STATE_KILLED_BY_SCORPION; @@ -128,7 +128,7 @@ namespace TEN::Entities::TR4 { item->Animation.AnimNumber = Objects[item->ObjectNumber].animIndex + 19; item->Animation.ActiveState = TROOP_STATE_DEATH; - item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.FrameNumber = GetAnimData(item).frameBase; } } } @@ -460,7 +460,7 @@ namespace TEN::Entities::TR4 { item->Animation.AnimNumber = Objects[item->ObjectNumber].animIndex + 28; item->Animation.ActiveState = TROOP_STATE_FLASHED; - item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase + (GetRandomControl() & 7); + item->Animation.FrameNumber = GetAnimData(item).frameBase + (GetRandomControl() & 7); creature->MaxTurn = 0; } } diff --git a/TombEngine/Objects/TR4/Entity/tr4_von_croy.cpp b/TombEngine/Objects/TR4/Entity/tr4_von_croy.cpp index f48b11648..1ce10b5dc 100644 --- a/TombEngine/Objects/TR4/Entity/tr4_von_croy.cpp +++ b/TombEngine/Objects/TR4/Entity/tr4_von_croy.cpp @@ -278,7 +278,7 @@ namespace TEN::Entities::TR4 GetFloor(item->Pose.Position.x, item->Pose.Position.y, item->Pose.Position.z, &item->RoomNumber); - if (item->Animation.FrameNumber == g_Level.Anims[item->Animation.AnimNumber].frameBase + VON_CROY_ANIM_RUN_FORWARD) + if (item->Animation.FrameNumber == GetAnimData(item).frameBase + VON_CROY_ANIM_RUN_FORWARD) CreateZone(item); CreatureAIInfo(item, &AI); @@ -405,7 +405,7 @@ namespace TEN::Entities::TR4 else if (canJump1block || canJump2blocks) { item->Animation.AnimNumber = Objects[item->ObjectNumber].animIndex + VON_CROY_ANIM_IDLE_TO_JUMP; - item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.FrameNumber = GetAnimData(item).frameBase; item->Animation.ActiveState = VON_CROY_STATE_JUMP; creature->MaxTurn = 0; creature->LOT.IsJumping = true; @@ -621,7 +621,7 @@ namespace TEN::Entities::TR4 break; case VON_CROY_STATE_TOGGLE_KNIFE: - if (item->Animation.FrameNumber == g_Level.Anims[item->Animation.AnimNumber].frameBase) + if (item->Animation.FrameNumber == GetAnimData(item).frameBase) { item->SetMeshSwapFlags(VonCroyKnifeSwapJoints, item->TestMeshSwapFlags(VonCroyKnifeSwapJoints)); } @@ -629,7 +629,7 @@ namespace TEN::Entities::TR4 break; case VON_CROY_STATE_LOOK_BEFORE_JUMP: - if (item->Animation.FrameNumber == g_Level.Anims[item->Animation.AnimNumber].frameBase) + if (item->Animation.FrameNumber == GetAnimData(item).frameBase) { item->Pose = enemy->Pose; @@ -639,7 +639,7 @@ namespace TEN::Entities::TR4 item->Animation.ActiveState = VON_CROY_STATE_JUMP; item->Animation.TargetState = VON_CROY_STATE_JUMP_2_BLOCKS; item->Animation.AnimNumber = Objects[item->ObjectNumber].animIndex + VON_CROY_ANIM_IDLE_TO_JUMP; - item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.FrameNumber = GetAnimData(item).frameBase; creature->LOT.IsJumping = true; } @@ -653,7 +653,7 @@ namespace TEN::Entities::TR4 case VON_CROY_STATE_JUMP_2_BLOCKS: if (item->Animation.AnimNumber == Objects[item->ObjectNumber].animIndex + VON_CROY_ANIM_JUMP_2_BLOCKS || - item->Animation.FrameNumber > (g_Level.Anims[item->Animation.AnimNumber].frameBase + 5)) + item->Animation.FrameNumber > (GetAnimData(item).frameBase + 5)) { creature->LOT.IsJumping = true; //if (canJump3blocks) @@ -668,9 +668,9 @@ namespace TEN::Entities::TR4 break; case VON_CROY_STATE_ENABLE_TRAP: - if (item->Animation.FrameNumber == g_Level.Anims[item->Animation.AnimNumber].frameBase) + if (item->Animation.FrameNumber == GetAnimData(item).frameBase) item->Pose = enemy->Pose; - else if (item->Animation.FrameNumber == g_Level.Anims[item->Animation.AnimNumber].frameBase + 120) + else if (item->Animation.FrameNumber == GetAnimData(item).frameBase + 120) { TestTriggers(creature->AITarget, true); @@ -695,8 +695,8 @@ namespace TEN::Entities::TR4 if (!creature->Flags && enemy != nullptr) { - if (item->Animation.FrameNumber > g_Level.Anims[item->Animation.AnimNumber].frameBase + 20 && - item->Animation.FrameNumber > g_Level.Anims[item->Animation.AnimNumber].frameBase + 45) + if (item->Animation.FrameNumber > GetAnimData(item).frameBase + 20 && + item->Animation.FrameNumber > GetAnimData(item).frameBase + 45) { if (abs(item->Pose.Position.x - enemy->Pose.Position.x) < CLICK(2) && abs(item->Pose.Position.y - enemy->Pose.Position.y) < CLICK(2) && @@ -759,12 +759,12 @@ namespace TEN::Entities::TR4 ClampRotation(item->Pose, AI.angle, ANGLE(6.0f)); if ((enemy == nullptr || enemy->Flags != 0) || - item->Animation.FrameNumber <= g_Level.Anims[item->Animation.AnimNumber].frameBase + 21) + item->Animation.FrameNumber <= GetAnimData(item).frameBase + 21) { if (creature->Flags == 0 && enemy != nullptr) { - if (item->Animation.FrameNumber > g_Level.Anims[item->Animation.AnimNumber].frameBase + 15 && - item->Animation.FrameNumber < g_Level.Anims[item->Animation.AnimNumber].frameBase + 26) + if (item->Animation.FrameNumber > GetAnimData(item).frameBase + 15 && + item->Animation.FrameNumber < GetAnimData(item).frameBase + 26) { if (abs(item->Pose.Position.x - enemy->Pose.Position.x) < CLICK(2) && abs(item->Pose.Position.y - enemy->Pose.Position.y) < CLICK(2) && @@ -805,7 +805,7 @@ namespace TEN::Entities::TR4 if (item->Animation.AnimNumber == Objects[item->ObjectNumber].animIndex + VON_CROY_ANIM_START_POINT) { - if (item->Animation.FrameNumber != g_Level.Anims[item->Animation.AnimNumber].frameBase) + if (item->Animation.FrameNumber != GetAnimData(item).frameBase) break; } else @@ -825,7 +825,7 @@ namespace TEN::Entities::TR4 case VON_CROY_STATE_STANDING_JUMP_GRAB: flags = true; if (item->Animation.AnimNumber != Objects[item->ObjectNumber].animIndex + VON_CROY_ANIM_CLIMB_UP_AFTER_JUMP || - item->Animation.FrameNumber != g_Level.Anims[item->Animation.AnimNumber].frameBase) + item->Animation.FrameNumber != GetAnimData(item).frameBase) { flags = false; } @@ -868,55 +868,55 @@ namespace TEN::Entities::TR4 { case 2: item->Animation.AnimNumber = Objects[item->ObjectNumber].animIndex + VON_CROY_ANIM_CLIMB_2_BLOCKS; - item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.FrameNumber = GetAnimData(item).frameBase; item->Animation.ActiveState = VON_CROY_STATE_CLIMB_2_BLOCKS; creature->MaxTurn = 0; break; case 3: item->Animation.AnimNumber = Objects[item->ObjectNumber].animIndex + VON_CROY_ANIM_CLIMB_3_BLOCKS; - item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.FrameNumber = GetAnimData(item).frameBase; item->Animation.ActiveState = VON_CROY_STATE_CLIMB_3_BLOCKS; creature->MaxTurn = 0; break; case 4: item->Animation.AnimNumber = Objects[item->ObjectNumber].animIndex + VON_CROY_ANIM_CLIMB_4_BLOCKS; - item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.FrameNumber = GetAnimData(item).frameBase; item->Animation.ActiveState = VON_CROY_STATE_CLIMB_4_BLOCKS; creature->MaxTurn = 0; break; case 7: item->Animation.AnimNumber = Objects[item->ObjectNumber].animIndex + VON_CROY_ANIM_JUMP_TO_HANG; - item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.FrameNumber = GetAnimData(item).frameBase; item->Animation.ActiveState = VON_CROY_STATE_GRAB_LADDER; creature->MaxTurn = 0; break; case -7: item->Animation.AnimNumber = Objects[item->ObjectNumber].animIndex + VON_CROY_ANIM_CLIMB_DOWN_2_SECTORS; - item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.FrameNumber = GetAnimData(item).frameBase; item->Animation.ActiveState = VON_CROY_STATE_STEP_DOWN_HIGH; creature->MaxTurn = 0; break; case -4: item->Animation.AnimNumber = Objects[item->ObjectNumber].animIndex + VON_CROY_ANIM_CLIMB_DOWN_1_SECTOR; - item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.FrameNumber = GetAnimData(item).frameBase; item->Animation.ActiveState = VON_CROY_STATE_JUMP_DOWN_4_CLICKS; creature->MaxTurn = 0; break; case -3: item->Animation.AnimNumber = Objects[item->ObjectNumber].animIndex + VON_CROY_ANIM_CLIMB_OFF_3_CLICKS; - item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.FrameNumber = GetAnimData(item).frameBase; item->Animation.ActiveState = VON_CROY_STATE_JUMP_DOWN_3_CLICKS; creature->MaxTurn = 0; break; case -2: item->Animation.AnimNumber = Objects[item->ObjectNumber].animIndex + VON_CROY_ANIM_CLIMB_OFF_2_CLICKS; - item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.FrameNumber = GetAnimData(item).frameBase; item->Animation.ActiveState = VON_CROY_STATE_JUMP_DOWN_2_CLICKS; creature->MaxTurn = 0; break; diff --git a/TombEngine/Objects/TR4/Object/WraithTrap.cpp b/TombEngine/Objects/TR4/Object/WraithTrap.cpp index 94df86252..0d58d61fa 100644 --- a/TombEngine/Objects/TR4/Object/WraithTrap.cpp +++ b/TombEngine/Objects/TR4/Object/WraithTrap.cpp @@ -22,8 +22,7 @@ namespace TEN::Entities::TR4 { auto& item = g_Level.Items[itemNumber]; - item.Animation.AnimNumber = Objects[item.ObjectNumber].animIndex; - item.Animation.FrameNumber = g_Level.Anims[item.Animation.AnimNumber].frameBase; + SetAnimation(item, 0); item.ItemFlags[6] = 0; } diff --git a/TombEngine/Objects/TR4/Object/tr4_clockwork_beetle.cpp b/TombEngine/Objects/TR4/Object/tr4_clockwork_beetle.cpp index ea2d9d4b1..d4419b2f8 100644 --- a/TombEngine/Objects/TR4/Object/tr4_clockwork_beetle.cpp +++ b/TombEngine/Objects/TR4/Object/tr4_clockwork_beetle.cpp @@ -16,7 +16,7 @@ void ClockworkBeetleControl(short itemNumber) if (LaraItem->Animation.AnimNumber == LA_MECHANICAL_BEETLE_USE) { - short fb = g_Level.Anims[LA_MECHANICAL_BEETLE_USE].frameBase; + short fb = GetAnimData(ID_LARA, LA_MECHANICAL_BEETLE_USE).frameBase; if (LaraItem->Animation.FrameNumber < fb + 14) { diff --git a/TombEngine/Objects/TR4/Object/tr4_element_puzzle.cpp b/TombEngine/Objects/TR4/Object/tr4_element_puzzle.cpp index 4e9935de9..5c0750b24 100644 --- a/TombEngine/Objects/TR4/Object/tr4_element_puzzle.cpp +++ b/TombEngine/Objects/TR4/Object/tr4_element_puzzle.cpp @@ -198,10 +198,10 @@ namespace TEN::Entities::TR4 if (laraItem->Animation.AnimNumber == LA_WATERSKIN_POUR_LOW && LaraItem->ItemFlags[2] == flags) { laraItem->Animation.AnimNumber = LA_WATERSKIN_POUR_HIGH; - laraItem->Animation.FrameNumber = g_Level.Anims[laraItem->Animation.AnimNumber].frameBase; + laraItem->Animation.FrameNumber = GetAnimData(laraItem).frameBase; } - if (laraItem->Animation.FrameNumber == g_Level.Anims[LA_WATERSKIN_POUR_HIGH].frameBase + 74 && + if (laraItem->Animation.FrameNumber == GetAnimData(*laraItem, LA_WATERSKIN_POUR_HIGH).frameBase + 74 && LaraItem->ItemFlags[2] == flags) { if (!puzzleItem->TriggerFlags) @@ -245,7 +245,7 @@ namespace TEN::Entities::TR4 laraItem->Animation.IsAirborne) { if (laraItem->Animation.AnimNumber != LA_TORCH_LIGHT_3 || - g_Level.Anims[LA_TORCH_LIGHT_3].frameBase + 16 || + GetAnimData(*laraItem, LA_TORCH_LIGHT_3).frameBase + 16 || puzzleItem->ItemFlags[0] != 2) { ElementPuzzleDoCollision(itemNumber, laraItem, coll); @@ -274,7 +274,7 @@ namespace TEN::Entities::TR4 if (TestLaraPosition(ElementPuzzleBounds, puzzleItem, laraItem)) { laraItem->Animation.AnimNumber = (abs(puzzleItem->Pose.Position.y- laraItem->Pose.Position.y) >> 8) + LA_TORCH_LIGHT_3; - laraItem->Animation.FrameNumber = g_Level.Anims[puzzleItem->Animation.AnimNumber].frameBase; + laraItem->Animation.FrameNumber = GetAnimData(puzzleItem).frameBase; laraItem->Animation.ActiveState = LS_MISC_CONTROL; laraInfo->Flare.ControlLeft = false; laraInfo->LeftArm.Locked = true; diff --git a/TombEngine/Objects/TR4/Object/tr4_mapper.cpp b/TombEngine/Objects/TR4/Object/tr4_mapper.cpp index babbe54e6..9cf32edf6 100644 --- a/TombEngine/Objects/TR4/Object/tr4_mapper.cpp +++ b/TombEngine/Objects/TR4/Object/tr4_mapper.cpp @@ -25,7 +25,7 @@ namespace TEN::Entities::TR4 if (!TriggerActive(item)) return; - if (item->Animation.FrameNumber - g_Level.Anims[item->Animation.AnimNumber].frameBase >= 200) + if (item->Animation.FrameNumber - GetAnimData(item).frameBase >= 200) { SoundEffect(SFX_TR4_MAPPER_LASER, &item->Pose); diff --git a/TombEngine/Objects/TR4/Object/tr4_obelisk.cpp b/TombEngine/Objects/TR4/Object/tr4_obelisk.cpp index f0bd88108..1cd775576 100644 --- a/TombEngine/Objects/TR4/Object/tr4_obelisk.cpp +++ b/TombEngine/Objects/TR4/Object/tr4_obelisk.cpp @@ -21,7 +21,7 @@ void InitializeObelisk(short itemNumber) auto* item = &g_Level.Items[itemNumber]; item->Animation.AnimNumber = Objects[item->ObjectNumber].animIndex + 3; - item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.FrameNumber = GetAnimData(item).frameBase; AddActiveItem(itemNumber); item->Status = ITEM_ACTIVE; @@ -162,7 +162,7 @@ void ObeliskControl(short itemNumber) if (TrInput & IN_ACTION) { item->Animation.AnimNumber = obj->animIndex + 1; - item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.FrameNumber = GetAnimData(item).frameBase; } else flag = true; @@ -175,20 +175,20 @@ void ObeliskControl(short itemNumber) if (!(TrInput & IN_ACTION)) { item->Animation.AnimNumber = obj->animIndex + 3; - item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.FrameNumber = GetAnimData(item).frameBase; flag = false; } else { item->Animation.AnimNumber = obj->animIndex + 5; - item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.FrameNumber = GetAnimData(item).frameBase; } } if (flag) { item->Animation.AnimNumber = obj->animIndex + 3; - item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.FrameNumber = GetAnimData(item).frameBase; } if (item->TriggerFlags == 2) diff --git a/TombEngine/Objects/TR4/Object/tr4_sarcophagus.cpp b/TombEngine/Objects/TR4/Object/tr4_sarcophagus.cpp index 50edb99b8..4684c331c 100644 --- a/TombEngine/Objects/TR4/Object/tr4_sarcophagus.cpp +++ b/TombEngine/Objects/TR4/Object/tr4_sarcophagus.cpp @@ -44,7 +44,7 @@ void SarcophagusCollision(short itemNumber, ItemInfo* laraItem, CollisionInfo* c { laraItem->Animation.AnimNumber = LA_PICKUP_SARCOPHAGUS; laraItem->Animation.ActiveState = LS_MISC_CONTROL; - laraItem->Animation.FrameNumber = g_Level.Anims[laraItem->Animation.AnimNumber].frameBase; + laraItem->Animation.FrameNumber = GetAnimData(laraItem).frameBase; sarcItem->Flags |= IFLAG_ACTIVATION_MASK; AddActiveItem(itemNumber); @@ -67,7 +67,7 @@ void SarcophagusCollision(short itemNumber, ItemInfo* laraItem, CollisionInfo* c } } else if (laraItem->Animation.AnimNumber != LA_PICKUP_SARCOPHAGUS || - laraItem->Animation.FrameNumber != g_Level.Anims[LA_PICKUP_SARCOPHAGUS].frameBase + 113) + laraItem->Animation.FrameNumber != GetAnimData(*laraItem, LA_PICKUP_SARCOPHAGUS).frameBase + 113) { ObjectCollision(itemNumber, laraItem, coll); } diff --git a/TombEngine/Objects/TR4/Object/tr4_scales.cpp b/TombEngine/Objects/TR4/Object/tr4_scales.cpp index 45e024fac..e14cbcc0c 100644 --- a/TombEngine/Objects/TR4/Object/tr4_scales.cpp +++ b/TombEngine/Objects/TR4/Object/tr4_scales.cpp @@ -33,7 +33,7 @@ void ScalesControl(short itemNumber) { auto* item = &g_Level.Items[itemNumber]; - if (item->Animation.FrameNumber != g_Level.Anims[item->Animation.AnimNumber].frameEnd) + if (item->Animation.FrameNumber != GetAnimData(item).frameEnd) { AnimateItem(item); return; @@ -131,15 +131,15 @@ void ScalesCollision(short itemNumber, ItemInfo* laraItem, CollisionInfo* coll) if (TestLaraPosition(ScalesBounds, item, laraItem)) { laraItem->Animation.AnimNumber = LA_WATERSKIN_POUR_HIGH; - laraItem->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + laraItem->Animation.FrameNumber = GetAnimData(item).frameBase; item->Pose.Orientation.y = rotY; } - else if (laraItem->Animation.FrameNumber == g_Level.Anims[LA_WATERSKIN_POUR_HIGH].frameBase + 51) + else if (laraItem->Animation.FrameNumber == GetAnimData(*laraItem, LA_WATERSKIN_POUR_HIGH).frameBase + 51) { SoundEffect(SFX_TR4_POUR_WATER, &laraItem->Pose); item->Pose.Orientation.y = rotY; } - else if (laraItem->Animation.FrameNumber == g_Level.Anims[LA_WATERSKIN_POUR_HIGH].frameBase + 74) + else if (laraItem->Animation.FrameNumber == GetAnimData(*laraItem, LA_WATERSKIN_POUR_HIGH).frameBase + 74) { AddActiveItem(itemNumber); item->Status = ITEM_ACTIVE; @@ -162,10 +162,10 @@ void ScalesCollision(short itemNumber, ItemInfo* laraItem, CollisionInfo* coll) } } - if (laraItem->Animation.FrameNumber >= g_Level.Anims[LA_WATERSKIN_POUR_LOW].frameBase + 44 && - laraItem->Animation.FrameNumber <= g_Level.Anims[LA_WATERSKIN_POUR_LOW].frameBase + 72 || - laraItem->Animation.FrameNumber >= g_Level.Anims[LA_WATERSKIN_POUR_HIGH].frameBase + 51 && - laraItem->Animation.FrameNumber <= g_Level.Anims[LA_WATERSKIN_POUR_HIGH].frameBase + 74) + if ((laraItem->Animation.FrameNumber >= GetAnimData(*laraItem, LA_WATERSKIN_POUR_LOW).frameBase + 44 && + laraItem->Animation.FrameNumber <= GetAnimData(*laraItem, LA_WATERSKIN_POUR_LOW).frameBase + 72) || + (laraItem->Animation.FrameNumber >= GetAnimData(*laraItem, LA_WATERSKIN_POUR_HIGH).frameBase + 51 && + laraItem->Animation.FrameNumber <= GetAnimData(*laraItem, LA_WATERSKIN_POUR_HIGH).frameBase + 74)) { auto pos = GetJointPosition(laraItem, LM_LHAND).ToVector3(); auto velocity = Vector3(0.0f, Random::GenerateFloat(32.0f, 64.0f), 0.0f); diff --git a/TombEngine/Objects/TR4/Object/tr4_senet.cpp b/TombEngine/Objects/TR4/Object/tr4_senet.cpp index 96bbd1a0d..ea7011ff9 100644 --- a/TombEngine/Objects/TR4/Object/tr4_senet.cpp +++ b/TombEngine/Objects/TR4/Object/tr4_senet.cpp @@ -443,7 +443,7 @@ void GameSticksCollision(short itemNumber, ItemInfo* laraItem, CollisionInfo* co if (MoveLaraPosition(GameStixPosition, item, laraItem)) { laraItem->Animation.AnimNumber = LA_SENET_ROLL; - laraItem->Animation.FrameNumber = g_Level.Anims[LA_SENET_ROLL].frameBase; + laraItem->Animation.FrameNumber = GetAnimData(*laraItem, LA_SENET_ROLL).frameBase; laraItem->Animation.ActiveState = LS_MISC_CONTROL; Lara.Control.IsMoving = false; Lara.ExtraTorsoRot = { 0, 0, 0 }; diff --git a/TombEngine/Objects/TR4/Trap/tr4_birdblade.cpp b/TombEngine/Objects/TR4/Trap/tr4_birdblade.cpp index c09f226f1..cf9626f90 100644 --- a/TombEngine/Objects/TR4/Trap/tr4_birdblade.cpp +++ b/TombEngine/Objects/TR4/Trap/tr4_birdblade.cpp @@ -15,12 +15,12 @@ namespace TEN::Entities::TR4 if (!TriggerActive(item)) { - item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.FrameNumber = GetAnimData(item).frameBase; *((int*)&item->ItemFlags[0]) = 0; } else { - int frameNumber = item->Animation.FrameNumber - g_Level.Anims[item->Animation.AnimNumber].frameBase; + int frameNumber = item->Animation.FrameNumber - GetAnimData(item).frameBase; if (frameNumber <= 14 || frameNumber >= 31) *((int*)&item->ItemFlags[0]) = 0; diff --git a/TombEngine/Objects/TR4/Trap/tr4_catwalkblade.cpp b/TombEngine/Objects/TR4/Trap/tr4_catwalkblade.cpp index 97ae3b85c..887ccb796 100644 --- a/TombEngine/Objects/TR4/Trap/tr4_catwalkblade.cpp +++ b/TombEngine/Objects/TR4/Trap/tr4_catwalkblade.cpp @@ -12,12 +12,12 @@ namespace TEN::Entities::TR4 auto* item = &g_Level.Items[itemNumber]; if (!TriggerActive(item)) - item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.FrameNumber = GetAnimData(item).frameBase; else { - int frameNumber = item->Animation.FrameNumber - g_Level.Anims[item->Animation.AnimNumber].frameBase; + int frameNumber = item->Animation.FrameNumber - GetAnimData(item).frameBase; - if (item->Animation.FrameNumber == g_Level.Anims[item->Animation.AnimNumber].frameEnd || frameNumber < 38) + if (item->Animation.FrameNumber == GetAnimData(item).frameEnd || frameNumber < 38) item->ItemFlags[3] = 0; else item->ItemFlags[3] = 100; diff --git a/TombEngine/Objects/TR4/Trap/tr4_cog.cpp b/TombEngine/Objects/TR4/Trap/tr4_cog.cpp index ac0904c07..66b6101a7 100644 --- a/TombEngine/Objects/TR4/Trap/tr4_cog.cpp +++ b/TombEngine/Objects/TR4/Trap/tr4_cog.cpp @@ -28,7 +28,7 @@ namespace TEN::Entities::TR4 //Shouldnt this be TR4_LIBRARY_COG_LOOP? Changed. Rollback if incorrect. Stranger1992 06/06/22 - if (item->Animation.FrameNumber == g_Level.Anims[item->Animation.AnimNumber].frameEnd) + if (item->Animation.FrameNumber == GetAnimData(item).frameEnd) item->Flags &= 0xC1; } } diff --git a/TombEngine/Objects/TR4/Trap/tr4_fourblades.cpp b/TombEngine/Objects/TR4/Trap/tr4_fourblades.cpp index 28d8a671e..bae0f4d45 100644 --- a/TombEngine/Objects/TR4/Trap/tr4_fourblades.cpp +++ b/TombEngine/Objects/TR4/Trap/tr4_fourblades.cpp @@ -13,12 +13,12 @@ namespace TEN::Entities::TR4 if (!TriggerActive(item)) { - item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.FrameNumber = GetAnimData(item).frameBase; *((int*)&item->ItemFlags[0]) = 0; } else { - int frameNumber = item->Animation.FrameNumber - g_Level.Anims[item->Animation.AnimNumber].frameBase; + int frameNumber = item->Animation.FrameNumber - GetAnimData(item).frameBase; if (frameNumber <= 5 || frameNumber >= 58 || frameNumber >= 8 && frameNumber <= 54) diff --git a/TombEngine/Objects/TR4/Trap/tr4_hammer.cpp b/TombEngine/Objects/TR4/Trap/tr4_hammer.cpp index 06a1e3b54..60335e481 100644 --- a/TombEngine/Objects/TR4/Trap/tr4_hammer.cpp +++ b/TombEngine/Objects/TR4/Trap/tr4_hammer.cpp @@ -44,7 +44,7 @@ namespace TEN::Entities::TR4 void HammerControl(short itemNumber) { auto* item = &g_Level.Items[itemNumber]; - int frameNumber = item->Animation.FrameNumber - g_Level.Anims[item->Animation.AnimNumber].frameBase; + int frameNumber = item->Animation.FrameNumber - GetAnimData(item).frameBase; item->ItemFlags[3] = HAMMER_HIT_DAMAGE; if (!TriggerActive(item)) @@ -79,7 +79,7 @@ namespace TEN::Entities::TR4 else { item->Animation.AnimNumber = Objects[item->ObjectNumber].animIndex + HAMMER_ANIM_ACTIVATED; - item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.FrameNumber = GetAnimData(item).frameBase; item->Animation.ActiveState = HAMMER_STATE_ACTIVE; item->Animation.TargetState = HAMMER_STATE_ACTIVE; item->ItemFlags[2] = HAMMER_OCB4_INTERVAL; diff --git a/TombEngine/Objects/TR4/Trap/tr4_mine.cpp b/TombEngine/Objects/TR4/Trap/tr4_mine.cpp index 423a9821e..e68d4ba8c 100644 --- a/TombEngine/Objects/TR4/Trap/tr4_mine.cpp +++ b/TombEngine/Objects/TR4/Trap/tr4_mine.cpp @@ -97,7 +97,7 @@ namespace TEN::Entities::TR4 if (mineItem->TriggerFlags && !mineItem->ItemFlags[3]) { if (laraItem->Animation.AnimNumber != LA_DETONATOR_USE || - laraItem->Animation.FrameNumber < g_Level.Anims[laraItem->Animation.AnimNumber].frameBase + 57) + laraItem->Animation.FrameNumber < GetAnimData(laraItem).frameBase + 57) { if (TestBoundsCollide(mineItem, laraItem, 512)) { @@ -111,7 +111,7 @@ namespace TEN::Entities::TR4 KillItem(itemNumber); laraItem->Animation.AnimNumber = LA_MINE_DEATH; - laraItem->Animation.FrameNumber = g_Level.Anims[mineItem->Animation.AnimNumber].frameBase; + laraItem->Animation.FrameNumber = GetAnimData(*mineItem).frameBase; laraItem->Animation.ActiveState = LS_DEATH; laraItem->Animation.Velocity.z = 0; diff --git a/TombEngine/Objects/TR4/Trap/tr4_moving_blade.cpp b/TombEngine/Objects/TR4/Trap/tr4_moving_blade.cpp index 495056ee7..e54965255 100644 --- a/TombEngine/Objects/TR4/Trap/tr4_moving_blade.cpp +++ b/TombEngine/Objects/TR4/Trap/tr4_moving_blade.cpp @@ -21,6 +21,6 @@ namespace TEN::Entities::TR4 AnimateItem(item); } else - item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.FrameNumber = GetAnimData(item).frameBase; } } diff --git a/TombEngine/Objects/TR4/Trap/tr4_plinthblade.cpp b/TombEngine/Objects/TR4/Trap/tr4_plinthblade.cpp index 98030d51e..e9727ca2b 100644 --- a/TombEngine/Objects/TR4/Trap/tr4_plinthblade.cpp +++ b/TombEngine/Objects/TR4/Trap/tr4_plinthblade.cpp @@ -12,12 +12,12 @@ namespace TEN::Entities::TR4 auto* item = &g_Level.Items[itemNumber]; if (!TriggerActive(item)) - item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.FrameNumber = GetAnimData(item).frameBase; else { - int frameNumber = item->Animation.FrameNumber - g_Level.Anims[item->Animation.AnimNumber].frameBase; + int frameNumber = item->Animation.FrameNumber - GetAnimData(item).frameBase; - if (item->Animation.FrameNumber == g_Level.Anims[item->Animation.AnimNumber].frameEnd) + if (item->Animation.FrameNumber == GetAnimData(item).frameEnd) item->ItemFlags[3] = 0; else item->ItemFlags[3] = 200; diff --git a/TombEngine/Objects/TR4/Trap/tr4_sethblade.cpp b/TombEngine/Objects/TR4/Trap/tr4_sethblade.cpp index fc0f049ea..b690d616d 100644 --- a/TombEngine/Objects/TR4/Trap/tr4_sethblade.cpp +++ b/TombEngine/Objects/TR4/Trap/tr4_sethblade.cpp @@ -61,7 +61,7 @@ namespace TEN::Entities::TR4 } else if (item.Animation.ActiveState == SETHBLADE_STATE_ACTIVE) { - int frame = item.Animation.FrameNumber - g_Level.Anims[item.Animation.AnimNumber].frameBase; + int frame = item.Animation.FrameNumber - GetAnimData(item).frameBase; if (frame >= 0 && frame <= 6) { diff --git a/TombEngine/Objects/TR4/Trap/tr4_spikeball.cpp b/TombEngine/Objects/TR4/Trap/tr4_spikeball.cpp index 266cf3447..79d353557 100644 --- a/TombEngine/Objects/TR4/Trap/tr4_spikeball.cpp +++ b/TombEngine/Objects/TR4/Trap/tr4_spikeball.cpp @@ -13,7 +13,7 @@ namespace TEN::Entities::TR4 if (TriggerActive(item)) { - int frameNumber = item->Animation.FrameNumber - g_Level.Anims[item->Animation.AnimNumber].frameBase; + int frameNumber = item->Animation.FrameNumber - GetAnimData(item).frameBase; if ((frameNumber <= 14 || frameNumber >= 24) && (frameNumber < 138 || frameNumber > 140)) @@ -36,7 +36,7 @@ namespace TEN::Entities::TR4 } else { - item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.FrameNumber = GetAnimData(item).frameBase; *((int*)&item->ItemFlags[0]) = 0; } } diff --git a/TombEngine/Objects/TR4/Trap/tr4_stargate.cpp b/TombEngine/Objects/TR4/Trap/tr4_stargate.cpp index 2f3e47985..d7a43f79f 100644 --- a/TombEngine/Objects/TR4/Trap/tr4_stargate.cpp +++ b/TombEngine/Objects/TR4/Trap/tr4_stargate.cpp @@ -65,8 +65,8 @@ namespace TEN::Entities::Traps if (TestCollision(item, laraItem) && TriggerActive(item) && - item->Animation.FrameNumber > g_Level.Anims[item->Animation.AnimNumber].frameBase + 20 && // Hardcoded frame range. - item->Animation.FrameNumber < g_Level.Anims[item->Animation.AnimNumber].frameBase + 60) + item->Animation.FrameNumber > GetAnimData(item).frameBase + 20 && // Hardcoded frame range. + item->Animation.FrameNumber < GetAnimData(item).frameBase + 60) { // Blades deal damage cumulatively. for (int i = 0; i < StargateHarmJoints.size(); i++) diff --git a/TombEngine/Objects/TR4/Vehicles/motorbike.cpp b/TombEngine/Objects/TR4/Vehicles/motorbike.cpp index 08838a596..dc5e30b3c 100644 --- a/TombEngine/Objects/TR4/Vehicles/motorbike.cpp +++ b/TombEngine/Objects/TR4/Vehicles/motorbike.cpp @@ -1096,7 +1096,7 @@ namespace TEN::Entities::Vehicles if (laraItem->Animation.ActiveState == MOTORBIKE_STATE_MOVING_BACK) { int currentFrame = laraItem->Animation.FrameNumber; - int frameBase = g_Level.Anims[laraItem->Animation.AnimNumber].frameBase; + int frameBase = GetAnimData(laraItem).frameBase; if (currentFrame >= frameBase + 24 && currentFrame <= frameBase + 29) diff --git a/TombEngine/Objects/TR5/Entity/HeavyGuard.cpp b/TombEngine/Objects/TR5/Entity/HeavyGuard.cpp index 78940b045..09fc728fd 100644 --- a/TombEngine/Objects/TR5/Entity/HeavyGuard.cpp +++ b/TombEngine/Objects/TR5/Entity/HeavyGuard.cpp @@ -246,7 +246,7 @@ namespace TEN::Entities::Creatures::TR5 case HEAVY_GUARD_STATE_FALL_START: { int frame = item.Animation.FrameNumber; - int frameStart = g_Level.Anims[item.Animation.AnimNumber].frameBase; + int frameStart = GetAnimData(item).frameBase; if (frame == GetFrameIndex(&item, 48) || frame == GetFrameIndex(&item, 15)) { @@ -406,7 +406,7 @@ namespace TEN::Entities::Creatures::TR5 case HEAVY_GUARD_STATE_WALK_RAYGUN_ATTACK_LEFT: headOrient.y = laraAI.angle; - if (item.Animation.FrameNumber == g_Level.Anims[item.Animation.AnimNumber].frameBase) + if (item.Animation.FrameNumber == GetAnimData(item).frameBase) { if (item.Animation.ActiveState == HEAVY_GUARD_STATE_WALK_RAYGUN_ATTACK_LEFT) FireHeavyGuardRaygun(item, false, false); diff --git a/TombEngine/Objects/TR5/Entity/tr5_chef.cpp b/TombEngine/Objects/TR5/Entity/tr5_chef.cpp index 0bb936ed0..c72929358 100644 --- a/TombEngine/Objects/TR5/Entity/tr5_chef.cpp +++ b/TombEngine/Objects/TR5/Entity/tr5_chef.cpp @@ -136,7 +136,7 @@ namespace TEN::Entities::Creatures::TR5 item->Pose.Orientation.y -= ANGLE(2.0f); else item->Pose.Orientation.y += ANGLE(2.0f); - if (item->Animation.FrameNumber == g_Level.Anims[item->Animation.AnimNumber].frameEnd) + if (item->Animation.FrameNumber == GetAnimData(item).frameEnd) item->Pose.Orientation.y += -ANGLE(180.0f); break; @@ -158,7 +158,7 @@ namespace TEN::Entities::Creatures::TR5 { if (item->TouchBits & 0x2000) { - if (item->Animation.FrameNumber > g_Level.Anims[item->Animation.AnimNumber].frameBase + 10) + if (item->Animation.FrameNumber > GetAnimData(item).frameBase + 10) { DoDamage(creature->Enemy, 80); CreatureEffect2(item, ChefBite, 20, item->Pose.Orientation.y, DoBloodSplat); diff --git a/TombEngine/Objects/TR5/Entity/tr5_cyborg.cpp b/TombEngine/Objects/TR5/Entity/tr5_cyborg.cpp index f17aca516..179a63de3 100644 --- a/TombEngine/Objects/TR5/Entity/tr5_cyborg.cpp +++ b/TombEngine/Objects/TR5/Entity/tr5_cyborg.cpp @@ -568,9 +568,9 @@ namespace TEN::Entities::Creatures::TR5 item.Pose.Orientation.y += AI.angle; } - if (item.Animation.FrameNumber > g_Level.Anims[item.Animation.AnimNumber].frameBase + 6 && - item.Animation.FrameNumber < g_Level.Anims[item.Animation.AnimNumber].frameBase + 16 && - ((byte)item.Animation.FrameNumber - (byte)g_Level.Anims[item.Animation.AnimNumber].frameBase) & 1) + if (item.Animation.FrameNumber > GetAnimData(item).frameBase + 6 && + item.Animation.FrameNumber < GetAnimData(item).frameBase + 16 && + ((byte)item.Animation.FrameNumber - (byte)GetAnimData(item).frameBase) & 1) { ShotLara(&item, &AI, CyborgGunBite, joint0, CYBORG_GUN_ATTACK_DAMAGE); creature.MuzzleFlash[0].Bite = CyborgGunBite; diff --git a/TombEngine/Objects/TR5/Entity/tr5_doberman.cpp b/TombEngine/Objects/TR5/Entity/tr5_doberman.cpp index 5cd2c025d..7b225dfcd 100644 --- a/TombEngine/Objects/TR5/Entity/tr5_doberman.cpp +++ b/TombEngine/Objects/TR5/Entity/tr5_doberman.cpp @@ -74,7 +74,7 @@ namespace TEN::Entities::Creatures::TR5 item->Animation.ActiveState = DOBERMAN_STATE_STAND_IDLE; } - item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.FrameNumber = GetAnimData(item).frameBase; } void DobermanControl(short itemNumber) @@ -263,7 +263,7 @@ namespace TEN::Entities::Creatures::TR5 else if (item->Animation.ActiveState != DOBERMAN_STATE_DEATH) { item->Animation.AnimNumber = Objects[ID_DOBERMAN].animIndex + DOBERMAN_ANIM_DEATH; - item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.FrameNumber = GetAnimData(item).frameBase; item->Animation.ActiveState = DOBERMAN_STATE_DEATH; } diff --git a/TombEngine/Objects/TR5/Entity/tr5_dog.cpp b/TombEngine/Objects/TR5/Entity/tr5_dog.cpp index e0a7168dc..584eafff5 100644 --- a/TombEngine/Objects/TR5/Entity/tr5_dog.cpp +++ b/TombEngine/Objects/TR5/Entity/tr5_dog.cpp @@ -30,7 +30,7 @@ namespace TEN::Entities::Creatures::TR5 // TODO: item->flags2 ^= (item->flags2 ^ ((item->flags2 & 0xFE) + 2)) & 6; } - item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.FrameNumber = GetAnimData(item).frameBase; } void Tr5DogControl(short itemNumber) @@ -54,7 +54,7 @@ namespace TEN::Entities::Creatures::TR5 else if (item->Animation.ActiveState != 11) { item->Animation.AnimNumber = object->animIndex + DogAnims[GetRandomControl() & 3]; - item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.FrameNumber = GetAnimData(item).frameBase; item->Animation.ActiveState = 11; } } @@ -101,7 +101,7 @@ namespace TEN::Entities::Creatures::TR5 } short random = GetRandomControl(); - int frame = item->Animation.FrameNumber - g_Level.Anims[item->Animation.AnimNumber].frameBase; + int frame = item->Animation.FrameNumber - GetAnimData(item).frameBase; switch (item->Animation.ActiveState) { diff --git a/TombEngine/Objects/TR5/Entity/tr5_ghost.cpp b/TombEngine/Objects/TR5/Entity/tr5_ghost.cpp index 30d2b8d21..d6534ea91 100644 --- a/TombEngine/Objects/TR5/Entity/tr5_ghost.cpp +++ b/TombEngine/Objects/TR5/Entity/tr5_ghost.cpp @@ -81,7 +81,7 @@ namespace TEN::Entities::Creatures::TR5 item->Animation.ActiveState <= 3 && !creature->Flags && item->TouchBits & 0x9470 && - item->Animation.FrameNumber > g_Level.Anims[item->Animation.AnimNumber].frameBase + 18) + item->Animation.FrameNumber > GetAnimData(item).frameBase + 18) { DoDamage(creature->Enemy, 400); CreatureEffect2(item, InvisibleGhostBite, 10, item->Pose.Orientation.y, DoBloodSplat); diff --git a/TombEngine/Objects/TR5/Entity/tr5_gladiator.cpp b/TombEngine/Objects/TR5/Entity/tr5_gladiator.cpp index 0eaffcd09..3ee994104 100644 --- a/TombEngine/Objects/TR5/Entity/tr5_gladiator.cpp +++ b/TombEngine/Objects/TR5/Entity/tr5_gladiator.cpp @@ -330,7 +330,7 @@ namespace TEN::Entities::Creatures::TR5 else item->Pose.Orientation.y += AI.angle; - if (item->Animation.FrameNumber > g_Level.Anims[item->Animation.AnimNumber].frameBase + 10) + if (item->Animation.FrameNumber > GetAnimData(item).frameBase + 10) { auto* room = &g_Level.Rooms[item->RoomNumber]; diff --git a/TombEngine/Objects/TR5/Entity/tr5_guard.cpp b/TombEngine/Objects/TR5/Entity/tr5_guard.cpp index e79ce245a..a837c27b4 100644 --- a/TombEngine/Objects/TR5/Entity/tr5_guard.cpp +++ b/TombEngine/Objects/TR5/Entity/tr5_guard.cpp @@ -242,7 +242,7 @@ namespace TEN::Entities::Creatures::TR5 roomItemNumber = item2->NextItem; if (roomItemNumber == NO_ITEM) { - item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.FrameNumber = GetAnimData(item).frameBase; item->Animation.ActiveState = item->Animation.TargetState; break; } @@ -366,7 +366,7 @@ namespace TEN::Entities::Creatures::TR5 item->Pose.Orientation.y += laraAI.angle; } - item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.FrameNumber = GetAnimData(item).frameBase; } } else @@ -536,7 +536,7 @@ namespace TEN::Entities::Creatures::TR5 else item->Pose.Orientation.y += ANGLE(2.0f); - if (item->Animation.FrameNumber == g_Level.Anims[item->Animation.AnimNumber].frameEnd) + if (item->Animation.FrameNumber == GetAnimData(item).frameEnd) item->Pose.Orientation.y += -ANGLE(180.0f); break; @@ -564,8 +564,8 @@ namespace TEN::Entities::Creatures::TR5 { if (creature->Flags) { - if (item->Animation.FrameNumber < g_Level.Anims[item->Animation.AnimNumber].frameBase + 10 && - (item->Animation.FrameNumber - g_Level.Anims[item->Animation.AnimNumber].frameBase) & 1) + if (item->Animation.FrameNumber < GetAnimData(item).frameBase + 10 && + (item->Animation.FrameNumber - GetAnimData(item).frameBase) & 1) { creature->Flags = 0; } @@ -740,13 +740,13 @@ namespace TEN::Entities::Creatures::TR5 case GUARD_STATE_STAND_UP: case GUARD_STATE_AWAKE_FROM_SLEEP: creature->MaxTurn = 0; - if (item->Animation.FrameNumber == g_Level.Anims[item->Animation.AnimNumber].frameBase) + if (item->Animation.FrameNumber == GetAnimData(item).frameBase) { TestTriggers(item, true); break; } - if (item->Animation.FrameNumber == g_Level.Anims[item->Animation.AnimNumber].frameBase + 44) + if (item->Animation.FrameNumber == GetAnimData(item).frameBase + 44) { item->SetMeshSwapFlags(NO_JOINT_BITS); @@ -776,7 +776,7 @@ namespace TEN::Entities::Creatures::TR5 currentItem->MeshBits = -3; } - else if (item->Animation.FrameNumber == g_Level.Anims[item->Animation.AnimNumber].frameEnd) + else if (item->Animation.FrameNumber == GetAnimData(item).frameEnd) item->Pose.Orientation.y -= ANGLE(90.0f); break; @@ -824,7 +824,7 @@ namespace TEN::Entities::Creatures::TR5 case GUARD_STATE_INSERT_CODE: creature->MaxTurn = 0; - if (item->Animation.FrameNumber == g_Level.Anims[item->Animation.AnimNumber].frameBase + 39) + if (item->Animation.FrameNumber == GetAnimData(item).frameBase + 39) TestTriggers(item, true); break; @@ -840,7 +840,7 @@ namespace TEN::Entities::Creatures::TR5 break; } - if (item->Animation.FrameNumber == g_Level.Anims[item->Animation.AnimNumber].frameBase) + if (item->Animation.FrameNumber == GetAnimData(item).frameBase) { currentItem->MeshBits = 0x1FFF; item->Pose.Position.x = currentItem->Pose.Position.x - CLICK(1); @@ -850,17 +850,17 @@ namespace TEN::Entities::Creatures::TR5 } else { - if (item->Animation.FrameNumber == g_Level.Anims[item->Animation.AnimNumber].frameBase + 32) + if (item->Animation.FrameNumber == GetAnimData(item).frameBase + 32) currentItem->MeshBits = 16381; - else if (item->Animation.FrameNumber == g_Level.Anims[item->Animation.AnimNumber].frameBase + 74) + else if (item->Animation.FrameNumber == GetAnimData(item).frameBase + 74) currentItem->MeshBits = 278461; - else if (item->Animation.FrameNumber == g_Level.Anims[item->Animation.AnimNumber].frameBase + 120) + else if (item->Animation.FrameNumber == GetAnimData(item).frameBase + 120) currentItem->MeshBits = 802621; - else if (item->Animation.FrameNumber == g_Level.Anims[item->Animation.AnimNumber].frameBase + 157) + else if (item->Animation.FrameNumber == GetAnimData(item).frameBase + 157) currentItem->MeshBits = 819001; - else if (item->Animation.FrameNumber == g_Level.Anims[item->Animation.AnimNumber].frameBase + 190) + else if (item->Animation.FrameNumber == GetAnimData(item).frameBase + 190) currentItem->MeshBits = 17592121; - else if (item->Animation.FrameNumber == g_Level.Anims[item->Animation.AnimNumber].frameBase + g_Level.Anims[item->Animation.AnimNumber].frameEnd) + else if (item->Animation.FrameNumber == GetAnimData(item).frameBase + GetAnimData(item).frameEnd) { currentItem->MeshBits = 0x1FFF; TestTriggers(item, true); @@ -905,7 +905,7 @@ namespace TEN::Entities::Creatures::TR5 item->Animation.TargetState = GUARD_STATE_IDLE; } - if (item->Animation.FrameNumber == g_Level.Anims[item->Animation.AnimNumber].frameBase + 39) + if (item->Animation.FrameNumber == GetAnimData(item).frameBase + 39) TestTriggers(item->Pose.Position.x, item->Pose.Position.y, item->Pose.Position.z, enemy->RoomNumber, true); break; @@ -1089,7 +1089,7 @@ namespace TEN::Entities::Creatures::TR5 if (item->Animation.ActiveState != SNIPER_STATE_DEATH) { item->Animation.AnimNumber = Objects[ID_SNIPER].animIndex + 5; - item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.FrameNumber = GetAnimData(item).frameBase; item->Animation.ActiveState = SNIPER_STATE_DEATH; } } @@ -1255,7 +1255,7 @@ namespace TEN::Entities::Creatures::TR5 if (canJump1Sector || canJump2Sectors) { item->Animation.AnimNumber = Objects[item->ObjectNumber].animIndex + 41; - item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.FrameNumber = GetAnimData(item).frameBase; item->Animation.ActiveState = MAFIA2_STATE_IDLE_START_JUMP; creature->MaxTurn = 0; @@ -1289,10 +1289,10 @@ namespace TEN::Entities::Creatures::TR5 else item->Pose.Orientation.y += ANGLE(2.0f); - if (item->Animation.FrameNumber != g_Level.Anims[item->Animation.AnimNumber].frameBase + 16 || + if (item->Animation.FrameNumber != GetAnimData(item).frameBase + 16 || !item->TestMeshSwapFlags(9216)) { - if (item->Animation.FrameNumber == g_Level.Anims[item->Animation.AnimNumber].frameEnd) + if (item->Animation.FrameNumber == GetAnimData(item).frameEnd) item->Pose.Orientation.y += -ANGLE(180.0f); } else @@ -1377,7 +1377,7 @@ namespace TEN::Entities::Creatures::TR5 if (canJump1Sector || canJump2Sectors) { item->Animation.AnimNumber = Objects[item->ObjectNumber].animIndex + 41; - item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.FrameNumber = GetAnimData(item).frameBase; item->Animation.ActiveState = MAFIA2_STATE_IDLE_START_JUMP; creature->MaxTurn = 0; @@ -1413,7 +1413,7 @@ namespace TEN::Entities::Creatures::TR5 else if (canJump1Sector || canJump2Sectors) { item->Animation.AnimNumber = Objects[item->ObjectNumber].animIndex + 50; - item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.FrameNumber = GetAnimData(item).frameBase; item->Animation.ActiveState = MAFIA2_STATE_IDLE_START_JUMP; creature->MaxTurn = 0; @@ -1437,7 +1437,7 @@ namespace TEN::Entities::Creatures::TR5 else item->Pose.Orientation.y -= ANGLE(2.0f); - if (item->Animation.FrameNumber == g_Level.Anims[item->Animation.AnimNumber].frameBase + 16 && + if (item->Animation.FrameNumber == GetAnimData(item).frameBase + 16 && item->TestMeshSwapFlags(9216)) { item->SetMeshSwapFlags(128); @@ -1467,7 +1467,7 @@ namespace TEN::Entities::Creatures::TR5 item->Pose.Orientation.y += AI.angle; } - item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.FrameNumber = GetAnimData(item).frameBase; } } @@ -1487,41 +1487,41 @@ namespace TEN::Entities::Creatures::TR5 { case 0: item->Animation.AnimNumber = Objects[item->ObjectNumber].animIndex + 38; - item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.FrameNumber = GetAnimData(item).frameBase; item->Animation.ActiveState = 23; break; case 1: item->Animation.AnimNumber = Objects[item->ObjectNumber].animIndex + 39; - item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.FrameNumber = GetAnimData(item).frameBase; item->Animation.ActiveState = 24; creature->MaxTurn = 0; break; case 2: item->Animation.AnimNumber = Objects[item->ObjectNumber].animIndex + 40; - item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.FrameNumber = GetAnimData(item).frameBase; item->Animation.ActiveState = 25; creature->MaxTurn = 0; break; case 6: item->Animation.AnimNumber = Objects[item->ObjectNumber].animIndex + 35; - item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.FrameNumber = GetAnimData(item).frameBase; item->Animation.ActiveState = 20; creature->MaxTurn = 0; break; case 7: item->Animation.AnimNumber = Objects[item->ObjectNumber].animIndex + 36; - item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.FrameNumber = GetAnimData(item).frameBase; item->Animation.ActiveState = 21; creature->MaxTurn = 0; break; case 8: item->Animation.AnimNumber = Objects[item->ObjectNumber].animIndex + 37; - item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.FrameNumber = GetAnimData(item).frameBase; item->Animation.ActiveState = 22; creature->MaxTurn = 0; break; diff --git a/TombEngine/Objects/TR5/Entity/tr5_hydra.cpp b/TombEngine/Objects/TR5/Entity/tr5_hydra.cpp index 5b8989adb..eb74f1689 100644 --- a/TombEngine/Objects/TR5/Entity/tr5_hydra.cpp +++ b/TombEngine/Objects/TR5/Entity/tr5_hydra.cpp @@ -309,7 +309,7 @@ namespace TEN::Entities::Creatures::TR5 if (!(GlobalCounter & 3)) { - frame = ((g_Level.Anims[item->Animation.AnimNumber].frameBase - item->Animation.FrameNumber) / 8) + 1; + frame = ((GetAnimData(item).frameBase - item->Animation.FrameNumber) / 8) + 1; if (frame > 16) frame = 16; @@ -319,7 +319,7 @@ namespace TEN::Entities::Creatures::TR5 break; case 3: - if (item->Animation.FrameNumber == g_Level.Anims[item->Animation.AnimNumber].frameBase) + if (item->Animation.FrameNumber == GetAnimData(item).frameBase) { auto pos1 = GetJointPosition(item, 10, Vector3i(0, 1024, 40)); auto pos2 = GetJointPosition(item, 10, Vector3i(0, 144, 40)); @@ -373,10 +373,10 @@ namespace TEN::Entities::Creatures::TR5 { item->Animation.AnimNumber = Objects[item->ObjectNumber].animIndex + 15; item->Animation.ActiveState = HYDRA_STATE_DEATH; - item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.FrameNumber = GetAnimData(item).frameBase; } - if (!((item->Animation.FrameNumber - g_Level.Anims[item->Animation.AnimNumber].frameBase) & 7)) + if (!((item->Animation.FrameNumber - GetAnimData(item).frameBase) & 7)) { if (item->ItemFlags[3] < 12) { diff --git a/TombEngine/Objects/TR5/Entity/tr5_lagoon_witch.cpp b/TombEngine/Objects/TR5/Entity/tr5_lagoon_witch.cpp index a7dc590b5..706335287 100644 --- a/TombEngine/Objects/TR5/Entity/tr5_lagoon_witch.cpp +++ b/TombEngine/Objects/TR5/Entity/tr5_lagoon_witch.cpp @@ -64,7 +64,7 @@ namespace TEN::Entities::Creatures::TR5 { item->Animation.ActiveState = WITCH_STATE_DEATH; item->Animation.AnimNumber = object->animIndex + WITCH_ANIM_DEATH; - item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.FrameNumber = GetAnimData(item).frameBase; item->HitPoints = 0; } } @@ -129,7 +129,7 @@ namespace TEN::Entities::Creatures::TR5 if (!creature->Flags && item->TouchBits.Test(LagoonWitchAttackJoints) && - item->Animation.FrameNumber > g_Level.Anims[item->Animation.AnimNumber].frameBase + 29) + item->Animation.FrameNumber > GetAnimData(item).frameBase + 29) { DoDamage(creature->Enemy, LAGOON_WITCH_ATTACK_DAMAGE); CreatureEffect2(item, LagoonWitchBite, 10, item->Pose.Orientation.y, DoBloodSplat); diff --git a/TombEngine/Objects/TR5/Entity/tr5_larson.cpp b/TombEngine/Objects/TR5/Entity/tr5_larson.cpp index 1a97511d6..78eab228b 100644 --- a/TombEngine/Objects/TR5/Entity/tr5_larson.cpp +++ b/TombEngine/Objects/TR5/Entity/tr5_larson.cpp @@ -320,7 +320,7 @@ namespace TEN::Entities::Creatures::TR5 else item->Pose.Orientation.y += AI.angle; - if (item->Animation.FrameNumber == GetFrameIndex(item, 0)) + if (item->Animation.FrameNumber == GetAnimData(item).frameBase) { if (item->ObjectNumber == ID_PIERRE) { @@ -352,7 +352,7 @@ namespace TEN::Entities::Creatures::TR5 { // When Larson dies, it activates trigger at start position if (item->ObjectNumber == ID_LARSON && - item->Animation.FrameNumber == g_Level.Anims[item->Animation.AnimNumber].frameEnd) + item->Animation.FrameNumber == GetAnimData(item).frameEnd) { short roomNumber = item->ItemFlags[2] & 0xFF; short floorHeight = item->ItemFlags[2] & 0xFF00; @@ -376,7 +376,7 @@ namespace TEN::Entities::Creatures::TR5 else item->Animation.AnimNumber = Objects[ID_LARSON].animIndex + ANIMATION_TR5_LARSON_DIE; - item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.FrameNumber = GetAnimData(item).frameBase; item->Animation.ActiveState = STATE_TR5_LARSON_DIE; } diff --git a/TombEngine/Objects/TR5/Entity/tr5_roman_statue.cpp b/TombEngine/Objects/TR5/Entity/tr5_roman_statue.cpp index 61c1be125..b34c98517 100644 --- a/TombEngine/Objects/TR5/Entity/tr5_roman_statue.cpp +++ b/TombEngine/Objects/TR5/Entity/tr5_roman_statue.cpp @@ -417,7 +417,7 @@ namespace TEN::Entities::Creatures::TR5 pos = Vector3i((pos1.x + pos2.x) / 2, (pos1.y + pos2.y) / 2, (pos1.z + pos2.z) / 2); - deltaFrame = item->Animation.FrameNumber - g_Level.Anims[item->Animation.AnimNumber].frameBase; + deltaFrame = item->Animation.FrameNumber - GetAnimData(item).frameBase; if (deltaFrame > 68 && deltaFrame < 130) { @@ -537,7 +537,7 @@ namespace TEN::Entities::Creatures::TR5 item->Pose.Orientation.y += ai.angle; } - if (item->Animation.FrameNumber > g_Level.Anims[item->Animation.AnimNumber].frameBase + 10) + if (item->Animation.FrameNumber > GetAnimData(item).frameBase + 10) { pos = GetJointPosition(item, 16); @@ -582,7 +582,7 @@ namespace TEN::Entities::Creatures::TR5 pos1 = GetJointPosition(item, 14, Vector3i(-40, 64, 360)); pos1.y = item->Pose.Position.y - 64; - if (item->Animation.FrameNumber == g_Level.Anims[item->Animation.AnimNumber].frameBase + 34 && item->Animation.ActiveState == 3) + if (item->Animation.FrameNumber == GetAnimData(item).frameBase + 34 && item->Animation.ActiveState == 3) { if (item->ItemFlags[0]) item->ItemFlags[0]--; @@ -593,8 +593,8 @@ namespace TEN::Entities::Creatures::TR5 TriggerShockwave((Pose*)&pos1, 16, 160, 64, 0, 64, 128, 48, EulerAngles::Zero, 1, true, false, (int)ShockwaveStyle::Normal); } - deltaFrame = item->Animation.FrameNumber - g_Level.Anims[item->Animation.AnimNumber].frameBase; - int deltaFrame2 = g_Level.Anims[item->Animation.AnimNumber].frameEnd - item->Animation.FrameNumber; + deltaFrame = item->Animation.FrameNumber - GetAnimData(item).frameBase; + int deltaFrame2 = GetAnimData(item).frameEnd - item->Animation.FrameNumber; if (deltaFrame2 >= 16) { @@ -672,7 +672,7 @@ namespace TEN::Entities::Creatures::TR5 else item->Pose.Orientation.y += ANGLE(2.0f); - if (item->Animation.FrameNumber == g_Level.Anims[item->Animation.AnimNumber].frameEnd) + if (item->Animation.FrameNumber == GetAnimData(item).frameEnd) item->Pose.Orientation.y += -ANGLE(180.0f); break; @@ -688,7 +688,7 @@ namespace TEN::Entities::Creatures::TR5 TriggerDynamicLight(RomanStatueData.Position.x, RomanStatueData.Position.y, RomanStatueData.Position.z, 16, 0, color, color / 2); } - deltaFrame = item->Animation.FrameNumber - g_Level.Anims[item->Animation.AnimNumber].frameBase; + deltaFrame = item->Animation.FrameNumber - GetAnimData(item).frameBase; if (deltaFrame == 34) { diff --git a/TombEngine/Objects/TR5/Object/tr5_genslot.cpp b/TombEngine/Objects/TR5/Object/tr5_genslot.cpp index 86fc97535..8ab99e4c7 100644 --- a/TombEngine/Objects/TR5/Object/tr5_genslot.cpp +++ b/TombEngine/Objects/TR5/Object/tr5_genslot.cpp @@ -14,7 +14,7 @@ void GenSlot1Control(short itemNumber) if (TriggerActive(item) && !item->TriggerFlags) { - int df = item->Animation.FrameNumber - g_Level.Anims[item->Animation.AnimNumber].frameBase; + int df = item->Animation.FrameNumber - GetAnimData(item).frameBase; if (df == 10 || df == 11) { diff --git a/TombEngine/Objects/TR5/Object/tr5_pushableblock.cpp b/TombEngine/Objects/TR5/Object/tr5_pushableblock.cpp index 10bc7bc3b..8d863b55f 100644 --- a/TombEngine/Objects/TR5/Object/tr5_pushableblock.cpp +++ b/TombEngine/Objects/TR5/Object/tr5_pushableblock.cpp @@ -210,7 +210,7 @@ namespace TEN::Entities::Generic displaceDepth = GetLastFrame(GAME_OBJECT_ID::ID_LARA, LaraItem->Animation.AnimNumber)->BoundingBox.Z2; displaceBox -= displaceDepth - BLOCK(1); - if (LaraItem->Animation.FrameNumber == g_Level.Anims[LaraItem->Animation.AnimNumber].frameBase) + if (LaraItem->Animation.FrameNumber == GetAnimData(*LaraItem).frameBase) { RemoveFromStack(itemNumber); RemoveBridgeStack(itemNumber); @@ -256,7 +256,7 @@ namespace TEN::Entities::Generic MoveStackXZ(itemNumber); - if (LaraItem->Animation.FrameNumber == g_Level.Anims[LaraItem->Animation.AnimNumber].frameEnd - 1) + if (LaraItem->Animation.FrameNumber == GetAnimData(*LaraItem).frameEnd - 1) { // Check if pushable is about to fall. if (pushable->canFall) @@ -301,7 +301,7 @@ namespace TEN::Entities::Generic displaceDepth = GetLastFrame(GAME_OBJECT_ID::ID_LARA, LaraItem->Animation.AnimNumber)->BoundingBox.Z2; displaceBox -= BLOCK(1) + displaceDepth; - if (LaraItem->Animation.FrameNumber == g_Level.Anims[LaraItem->Animation.AnimNumber].frameBase) + if (LaraItem->Animation.FrameNumber == GetAnimData(*LaraItem).frameBase) { RemoveFromStack(itemNumber); RemoveBridgeStack(itemNumber); @@ -343,7 +343,7 @@ namespace TEN::Entities::Generic MoveStackXZ(itemNumber); - if (LaraItem->Animation.FrameNumber == g_Level.Anims[LaraItem->Animation.AnimNumber].frameEnd - 1) + if (LaraItem->Animation.FrameNumber == GetAnimData(*LaraItem).frameEnd - 1) { if (IsHeld(In::Action)) { diff --git a/TombEngine/Objects/TR5/Object/tr5_rollingball.cpp b/TombEngine/Objects/TR5/Object/tr5_rollingball.cpp index 8088cac6f..39d98c280 100644 --- a/TombEngine/Objects/TR5/Object/tr5_rollingball.cpp +++ b/TombEngine/Objects/TR5/Object/tr5_rollingball.cpp @@ -485,9 +485,9 @@ void ClassicRollingBallControl(short itemNum) item->Animation.ActiveState = 0; item->Animation.TargetState = 0; item->Animation.AnimNumber = Objects[item->ObjectNumber].animIndex; - item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; - item->Animation.ActiveState = g_Level.Anims[item->Animation.AnimNumber].ActiveState; - item->Animation.TargetState = g_Level.Anims[item->Animation.AnimNumber].ActiveState; + item->Animation.FrameNumber = GetAnimData(item).frameBase; + item->Animation.ActiveState = GetAnimData(item).ActiveState; + item->Animation.TargetState = GetAnimData(item).ActiveState; item->Animation.RequiredState = NO_STATE; RemoveActiveItem(itemNum); } diff --git a/TombEngine/Objects/TR5/Object/tr5_teleporter.cpp b/TombEngine/Objects/TR5/Object/tr5_teleporter.cpp index 4fbbe6c5b..d427b9078 100644 --- a/TombEngine/Objects/TR5/Object/tr5_teleporter.cpp +++ b/TombEngine/Objects/TR5/Object/tr5_teleporter.cpp @@ -183,10 +183,7 @@ void ControlTeleporter(short itemNumber) SoundEffect(SFX_TR5_LIFT_HIT_FLOOR2, nullptr); } - LaraItem->Animation.AnimNumber = LA_ELEVATOR_RECOVER; - LaraItem->Animation.FrameNumber = g_Level.Anims[LaraItem->Animation.AnimNumber].frameBase; - LaraItem->Animation.TargetState = LS_MISC_CONTROL; - LaraItem->Animation.ActiveState = LS_MISC_CONTROL; + SetAnimation(*LaraItem, LA_ELEVATOR_RECOVER); item->ItemFlags[0]++; if (item->ItemFlags[0] >= 150) diff --git a/TombEngine/Objects/TR5/Switch/tr5_crowdove_switch.cpp b/TombEngine/Objects/TR5/Switch/tr5_crowdove_switch.cpp index 831dc12eb..ab4f89d9e 100644 --- a/TombEngine/Objects/TR5/Switch/tr5_crowdove_switch.cpp +++ b/TombEngine/Objects/TR5/Switch/tr5_crowdove_switch.cpp @@ -63,7 +63,7 @@ namespace TEN::Entities::Switches { laraItem->Animation.AnimNumber = LA_DOVESWITCH_TURN; laraItem->Animation.ActiveState = LS_DOVE_SWITCH; - laraItem->Animation.FrameNumber = g_Level.Anims[laraItem->Animation.AnimNumber].frameBase; + laraItem->Animation.FrameNumber = GetAnimData(laraItem).frameBase; AddActiveItem(itemNumber); diff --git a/TombEngine/Objects/TR5/Trap/tr5_ventilator.cpp b/TombEngine/Objects/TR5/Trap/tr5_ventilator.cpp index 38a8ec418..0c4d4a450 100644 --- a/TombEngine/Objects/TR5/Trap/tr5_ventilator.cpp +++ b/TombEngine/Objects/TR5/Trap/tr5_ventilator.cpp @@ -153,7 +153,7 @@ void VentilatorControl(short itemNumber) if (item->Animation.ActiveState == 1) { //result = 5 * item->animNumber; - if (item->Animation.FrameNumber == g_Level.Anims[item->Animation.AnimNumber].frameEnd) + if (item->Animation.FrameNumber == GetAnimData(item).frameEnd) return; } else @@ -162,7 +162,7 @@ void VentilatorControl(short itemNumber) int speed = 0; if (item->Animation.ActiveState == 1) - speed = g_Level.Anims[item->Animation.AnimNumber].frameEnd - item->Animation.FrameNumber; + speed = GetAnimData(item).frameEnd - item->Animation.FrameNumber; else speed = 128; diff --git a/TombEngine/Objects/TR5/Trap/tr5_wreckingball.cpp b/TombEngine/Objects/TR5/Trap/tr5_wreckingball.cpp index 498372e00..15ac69cf2 100644 --- a/TombEngine/Objects/TR5/Trap/tr5_wreckingball.cpp +++ b/TombEngine/Objects/TR5/Trap/tr5_wreckingball.cpp @@ -233,7 +233,7 @@ void WreckingBallControl(short itemNumber) --item->TriggerFlags; else if (!item->Animation.ActiveState) item->Animation.TargetState = 1; - else if (item->Animation.FrameNumber == g_Level.Anims[item->Animation.AnimNumber].frameEnd) + else if (item->Animation.FrameNumber == GetAnimData(item).frameEnd) { SoundEffect(SFX_TR5_BASE_CLAW_DROP, &item->Pose); ++item->ItemFlags[1]; diff --git a/TombEngine/Renderer/Renderer11DrawMenu.cpp b/TombEngine/Renderer/Renderer11DrawMenu.cpp index 3ad88046f..b90185f4b 100644 --- a/TombEngine/Renderer/Renderer11DrawMenu.cpp +++ b/TombEngine/Renderer/Renderer11DrawMenu.cpp @@ -571,8 +571,8 @@ namespace TEN::Renderer { auto frameData = AnimFrameInterpData { - &g_Level.Frames[g_Level.Anims[object.animIndex].FramePtr], - &g_Level.Frames[g_Level.Anims[object.animIndex].FramePtr], + &g_Level.Frames[GetAnimData(object.animIndex).FramePtr], + &g_Level.Frames[GetAnimData(object.animIndex).FramePtr], 0.0f }; UpdateAnimation(nullptr, *moveableObject, frameData, 0xFFFFFFFF); diff --git a/TombEngine/Renderer/Renderer11Lara.cpp b/TombEngine/Renderer/Renderer11Lara.cpp index 15aefb60a..1be85ccd5 100644 --- a/TombEngine/Renderer/Renderer11Lara.cpp +++ b/TombEngine/Renderer/Renderer11Lara.cpp @@ -184,8 +184,8 @@ void Renderer11::UpdateLaraAnimations(bool force) mask = MESH_BITS(LM_LINARM) | MESH_BITS(LM_LOUTARM) | MESH_BITS(LM_LHAND); auto revolverFrameData = AnimFrameInterpData { - &g_Level.Frames[Lara.LeftArm.FrameBase + Lara.LeftArm.FrameNumber - g_Level.Anims[Lara.LeftArm.AnimNumber].frameBase], - &g_Level.Frames[Lara.LeftArm.FrameBase + Lara.LeftArm.FrameNumber - g_Level.Anims[Lara.LeftArm.AnimNumber].frameBase], + &g_Level.Frames[Lara.LeftArm.FrameBase + Lara.LeftArm.FrameNumber - GetAnimData(Lara.LeftArm.AnimNumber).frameBase], + &g_Level.Frames[Lara.LeftArm.FrameBase + Lara.LeftArm.FrameNumber - GetAnimData(Lara.LeftArm.AnimNumber).frameBase], 0.0f }; @@ -195,8 +195,8 @@ void Renderer11::UpdateLaraAnimations(bool force) mask = MESH_BITS(LM_RINARM) | MESH_BITS(LM_ROUTARM) | MESH_BITS(LM_RHAND); revolverFrameData = AnimFrameInterpData { - &g_Level.Frames[Lara.RightArm.FrameBase + Lara.RightArm.FrameNumber - g_Level.Anims[Lara.RightArm.AnimNumber].frameBase], - &g_Level.Frames[Lara.RightArm.FrameBase + Lara.RightArm.FrameNumber - g_Level.Anims[Lara.RightArm.AnimNumber].frameBase], + &g_Level.Frames[Lara.RightArm.FrameBase + Lara.RightArm.FrameNumber - GetAnimData(Lara.RightArm.AnimNumber).frameBase], + &g_Level.Frames[Lara.RightArm.FrameBase + Lara.RightArm.FrameNumber - GetAnimData(Lara.RightArm.AnimNumber).frameBase], 0.0f }; @@ -214,8 +214,8 @@ void Renderer11::UpdateLaraAnimations(bool force) mask = MESH_BITS(LM_LOUTARM) | MESH_BITS(LM_LHAND); auto pistolFrameData = AnimFrameInterpData { - &g_Level.Frames[Lara.LeftArm.FrameBase + Lara.LeftArm.FrameNumber - g_Level.Anims[Lara.LeftArm.AnimNumber].frameBase], - &g_Level.Frames[Lara.LeftArm.FrameBase + Lara.LeftArm.FrameNumber - g_Level.Anims[Lara.LeftArm.AnimNumber].frameBase], + &g_Level.Frames[Lara.LeftArm.FrameBase + Lara.LeftArm.FrameNumber - GetAnimData(Lara.LeftArm.AnimNumber).frameBase], + &g_Level.Frames[Lara.LeftArm.FrameBase + Lara.LeftArm.FrameNumber - GetAnimData(Lara.LeftArm.AnimNumber).frameBase], 0.0f }; @@ -227,8 +227,8 @@ void Renderer11::UpdateLaraAnimations(bool force) mask = MESH_BITS(LM_ROUTARM) | MESH_BITS(LM_RHAND); pistolFrameData = AnimFrameInterpData { - &g_Level.Frames[Lara.RightArm.FrameBase + Lara.RightArm.FrameNumber - g_Level.Anims[Lara.RightArm.AnimNumber].frameBase], - &g_Level.Frames[Lara.RightArm.FrameBase + Lara.RightArm.FrameNumber - g_Level.Anims[Lara.RightArm.AnimNumber].frameBase], + &g_Level.Frames[Lara.RightArm.FrameBase + Lara.RightArm.FrameNumber - GetAnimData(Lara.RightArm.AnimNumber).frameBase], + &g_Level.Frames[Lara.RightArm.FrameBase + Lara.RightArm.FrameNumber - GetAnimData(Lara.RightArm.AnimNumber).frameBase], 0.0f }; diff --git a/TombEngine/Scripting/Internal/TEN/Objects/Moveable/MoveableObject.cpp b/TombEngine/Scripting/Internal/TEN/Objects/Moveable/MoveableObject.cpp index 8d5c2a375..ead9f6c8d 100644 --- a/TombEngine/Scripting/Internal/TEN/Objects/Moveable/MoveableObject.cpp +++ b/TombEngine/Scripting/Internal/TEN/Objects/Moveable/MoveableObject.cpp @@ -814,7 +814,7 @@ void Moveable::SetAnimNumber(int animNumber) int Moveable::GetFrameNumber() const { - return m_item->Animation.FrameNumber - g_Level.Anims[m_item->Animation.AnimNumber].frameBase; + return (m_item->Animation.FrameNumber - GetAnimData(*m_item).frameBase); } Vec3 Moveable::GetVelocity() const @@ -835,15 +835,15 @@ void Moveable::SetVelocity(Vec3 velocity) void Moveable::SetFrameNumber(int frameNumber) { - auto const fBase = g_Level.Anims[m_item->Animation.AnimNumber].frameBase; - auto const fEnd = g_Level.Anims[m_item->Animation.AnimNumber].frameEnd; - auto frameCount = fEnd - fBase; + const auto& anim = GetAnimData(*m_item); + + unsigned int frameCount = anim.frameEnd - anim.frameBase; bool cond = frameNumber < frameCount; const char* err = "Invalid frame number {}; max frame number for anim {} is {}."; if (ScriptAssertF(cond, err, frameNumber, m_item->Animation.AnimNumber, frameCount-1)) { - m_item->Animation.FrameNumber = frameNumber + fBase; + m_item->Animation.FrameNumber = frameNumber + anim.frameBase; } else { @@ -1168,18 +1168,19 @@ bool Moveable::MeshExists(int index) const return true; } -//Attach camera and camera target to a mesh of an object. +// Attach camera and camera target to object mesh. void Moveable::AttachObjCamera(short camMeshId, Moveable& mov, short targetMeshId) { if ((m_item->Active || m_item->IsLara()) && (mov.m_item->Active || mov.m_item->IsLara())) ObjCamera(m_item, camMeshId, mov.m_item, targetMeshId, true); } -//Borrow an animtaion and state id from an object. -void Moveable::AnimFromObject(GAME_OBJECT_ID object, int animNumber, int stateID) +// Borrow animtaion and state ID from object. +void Moveable::AnimFromObject(GAME_OBJECT_ID objectID, int animNumber, int stateID) { - m_item->Animation.AnimNumber = Objects[object].animIndex + animNumber; + m_item->Animation.AnimObjectID = objectID; + m_item->Animation.AnimNumber = Objects[objectID].animIndex + animNumber; m_item->Animation.ActiveState = stateID; - m_item->Animation.FrameNumber = g_Level.Anims[m_item->Animation.AnimNumber].frameBase; + m_item->Animation.FrameNumber = GetAnimData(*m_item).frameBase; AnimateItem(m_item); } From e4d4a61ed7a268884184223fbf1d777acf292ef0 Mon Sep 17 00:00:00 2001 From: Nemoel-Tomo Date: Thu, 18 May 2023 17:26:55 +0200 Subject: [PATCH 5/9] Fix tr5 laser barriers (#1093) * finished lights * Fix formatting * Formatting * Update itemdata.h * test * import light branch * fixed error * finished laser initialising effects are missing * hide nullmesh * import Laser visuals fro richardtrle, import develop * fix lasers. still a lot of work to do * update * Lasers use model color now * Formatting * Revert "Formatting" This reverts commit cdf44035b0ca9e90d84eaa58c298ea21f162723c. * Revert "Revert "Formatting"" This reverts commit 0e4e56709b8bfa624f6e2ba18fa1f568e90d595c. * Fix global * Names * Simplify vertex position storage * fixed lasers * Update shaders * bugfix * Laser fade in, light distortion * finished lasers, sound * updating shaders for upper and lower fading * Capitalize variable * Update control.cpp * Update control.cpp * Rename laser barrier object ID * Rename variables; use references; fix formatting * Fix shader code formatting * Update laser barriers * Newline * Remove unnecessary global, rename cbuffer field * Add bool member variables; demagic numbers * Edit comments * - * removed 3 latest commits from sezz bc laser was not working correctly anymore laser should flicker if lLara collides. else it should slowly change between 0.8 and 1.0. collision was not working anymore, please do not change anything anymore :) :) * calculate laser barrier vertex every loop * Bring back reverted changes * Use references as per conventions; make function static; rename function * Rename file * Remove deeply archaic TR5 garbage; maybe fix drift * Organise * Rotate barriers correctly; make variable names clearer * Initialize barrier height only once; don't snap to floor upon init * Update vertex generation; add methods * Move bounding box update code * Make beam counts adapt to ceiling height; use floats * Small formatting fixes * removed barrier.IsActive from renderer * Remove global variable --------- Co-authored-by: Sezz Co-authored-by: Lwmte <3331699+Lwmte@users.noreply.github.com> --- TombEngine/Game/control/control.cpp | 3 + TombEngine/Objects/TR1/Entity/Cowboy.cpp | 2 +- TombEngine/Objects/TR1/Entity/Cowboy.h | 2 +- TombEngine/Objects/TR1/tr1_objects.cpp | 2 +- TombEngine/Objects/TR5/Trap/LaserBarrier.cpp | 188 ++++++++++++ TombEngine/Objects/TR5/Trap/LaserBarrier.h | 40 +++ TombEngine/Objects/TR5/tr5_objects.cpp | 20 +- TombEngine/Objects/game_object_ids.h | 2 +- .../Renderer/ConstantBuffers/SpriteBuffer.h | 1 + TombEngine/Renderer/Renderer11.h | 15 +- TombEngine/Renderer/Renderer11Draw.cpp | 1 + TombEngine/Renderer/Renderer11DrawEffect.cpp | 50 +++- TombEngine/Renderer/RendererSprites.cpp | 19 +- TombEngine/Renderer/RendererSprites.h | 7 + TombEngine/Resources.aps | Bin 78820 -> 79008 bytes .../Internal/TEN/Objects/ObjectIDs.h | 2 +- TombEngine/Shaders/AnimatedTextures.hlsli | 18 +- TombEngine/Shaders/Blending.hlsli | 156 ++++++++-- TombEngine/Shaders/DX11_Sprites.fx | 12 +- TombEngine/Shaders/Math.hlsli | 271 +++++++++++++----- TombEngine/TombEngine.vcxproj | 2 + 21 files changed, 681 insertions(+), 132 deletions(-) create mode 100644 TombEngine/Objects/TR5/Trap/LaserBarrier.cpp create mode 100644 TombEngine/Objects/TR5/Trap/LaserBarrier.h diff --git a/TombEngine/Game/control/control.cpp b/TombEngine/Game/control/control.cpp index 5de1cd08b..b971c8149 100644 --- a/TombEngine/Game/control/control.cpp +++ b/TombEngine/Game/control/control.cpp @@ -47,6 +47,7 @@ #include "Objects/TR5/Emitter/tr5_bats_emitter.h" #include "Objects/TR5/Emitter/tr5_rats_emitter.h" #include "Objects/TR5/Emitter/tr5_spider_emitter.h" +#include "Objects/TR5/Trap/LaserBarrier.h" #include "Scripting/Include/Flow/ScriptInterfaceFlowHandler.h" #include "Scripting/Include/Objects/ScriptInterfaceObjectsHandler.h" #include "Scripting/Include/ScriptInterfaceGame.h" @@ -79,6 +80,7 @@ using namespace TEN::Hud; using namespace TEN::Input; using namespace TEN::Math; using namespace TEN::Renderer; +using namespace TEN::Traps::TR5; int GameTimer = 0; int GlobalCounter = 0; @@ -417,6 +419,7 @@ void CleanUp() ClearFootprints(); ClearDrips(); ClearRipples(); + ClearLaserBarrierEffects(); DisableSmokeParticles(); DisableSparkParticles(); DisableDebris(); diff --git a/TombEngine/Objects/TR1/Entity/Cowboy.cpp b/TombEngine/Objects/TR1/Entity/Cowboy.cpp index 8cf2af407..7af04ac2f 100644 --- a/TombEngine/Objects/TR1/Entity/Cowboy.cpp +++ b/TombEngine/Objects/TR1/Entity/Cowboy.cpp @@ -51,7 +51,7 @@ namespace TEN::Entities::Creatures::TR1 COWBOY_ANIM_IDLE }; - void InitialiseCowboy(short itemNumber) + void InitializeCowboy(short itemNumber) { auto& item = g_Level.Items[itemNumber]; diff --git a/TombEngine/Objects/TR1/Entity/Cowboy.h b/TombEngine/Objects/TR1/Entity/Cowboy.h index 1bdc361ea..056e7d8e6 100644 --- a/TombEngine/Objects/TR1/Entity/Cowboy.h +++ b/TombEngine/Objects/TR1/Entity/Cowboy.h @@ -2,6 +2,6 @@ namespace TEN::Entities::Creatures::TR1 { - void InitialiseCowboy(short itemNumber); + void InitializeCowboy(short itemNumber); void CowboyControl(short itemNumber); } diff --git a/TombEngine/Objects/TR1/tr1_objects.cpp b/TombEngine/Objects/TR1/tr1_objects.cpp index 1a7dfcf14..8ed09310f 100644 --- a/TombEngine/Objects/TR1/tr1_objects.cpp +++ b/TombEngine/Objects/TR1/tr1_objects.cpp @@ -170,7 +170,7 @@ static void StartEntity(ObjectInfo* obj) obj = &Objects[ID_COWBOY]; if (obj->loaded) { - obj->Initialize = InitialiseCowboy; + obj->Initialize = InitializeCowboy; obj->control = CowboyControl; obj->collision = CreatureCollision; obj->shadowType = ShadowMode::All; diff --git a/TombEngine/Objects/TR5/Trap/LaserBarrier.cpp b/TombEngine/Objects/TR5/Trap/LaserBarrier.cpp new file mode 100644 index 000000000..ad6020acf --- /dev/null +++ b/TombEngine/Objects/TR5/Trap/LaserBarrier.cpp @@ -0,0 +1,188 @@ +#include "framework.h" +#include "Objects/TR5/Trap/LaserBarrier.h" + +#include "Game/collision/collide_room.h" +#include "Game/collision/floordata.h" +#include "Game/effects/effects.h" +#include "Game/effects/item_fx.h" +#include "Game/items.h" +#include "Game/Lara/lara.h" +#include "Specific/level.h" + +using namespace TEN::Effects::Items; + +namespace TEN::Traps::TR5 +{ + // NOTES: + // item.ItemFlags[0] = barrier height. + + // TODO: + // - Randomize opacity pulses for each barrier. + // - Make SpawnLaserBarrierLight() spawn a line of light once engine allows it. + // - Make beam counts an attribute once attributes are implemented. + + extern std::unordered_map LaserBarriers = {}; + + void LaserBarrier::Initialize(const ItemInfo& item) + { + float barrierHeight = item.ItemFlags[0]; + int beamCount = std::max((int)floor((barrierHeight / 2) / LaserBarrierBeam::HEIGHT), 1); + + Color = item.Model.Color; + Color.w = 0.0f; + Beams.resize(beamCount); + IsLethal = (item.TriggerFlags > 0); + IsHeavyActivator = (item.TriggerFlags <= 0); + Update(item); + } + + void LaserBarrier::Update(const ItemInfo& item) + { + // Calculate dimension values. + float barrierHalfWidth = (abs(item.TriggerFlags) * BLOCK(1)) / 2; + float barrierHeight = item.ItemFlags[0]; + float beamStepHeight = barrierHeight / Beams.size(); + + // Determine beam vertex base. + auto basePos = item.Pose.Position.ToVector3(); + auto rotMatrix = EulerAngles(0, item.Pose.Orientation.y + ANGLE(90.0f), 0).ToRotationMatrix(); + auto baseVertices = std::array + { + basePos + Vector3::Transform(Vector3(barrierHalfWidth, -LaserBarrierBeam::HEIGHT / 2, 0.0f), rotMatrix), + basePos + Vector3::Transform(Vector3(-barrierHalfWidth, -LaserBarrierBeam::HEIGHT / 2, 0.0f), rotMatrix), + basePos + Vector3::Transform(Vector3(-barrierHalfWidth, LaserBarrierBeam::HEIGHT / 2, 0.0f), rotMatrix), + basePos + Vector3::Transform(Vector3(barrierHalfWidth, LaserBarrierBeam::HEIGHT / 2, 0.0f), rotMatrix) + }; + + // Set vertex positions. + auto beamOffset = Vector3(0.0f, -LaserBarrierBeam::HEIGHT, 0.0f); + for (auto& beam : Beams) + { + assertion(beam.VertexPoints.size() == baseVertices.size(), "Laser barrier beam vertex count out of sync."); + + for (int i = 0; i < beam.VertexPoints.size(); i++) + beam.VertexPoints[i] = baseVertices[i] + beamOffset; + + beamOffset.y -= beamStepHeight; + } + + // Determine bounding box reference points. + auto point0 = Beams.back().VertexPoints[0]; + auto point1 = Beams.back().VertexPoints[1]; + auto point2 = Beams.front().VertexPoints[2]; + auto point3 = Beams.front().VertexPoints[3]; + + // Update bounding box. + BoundingBox.Center = (point0 + point1 + point2 + point3) / 4; + BoundingBox.Extents = Vector3( + std::abs(point0.x - point1.x) / 2, + std::abs(point0.y - point2.y) / 2, + std::abs(point0.z - point2.z) / 2); + } + + void InitializeLaserBarrier(short itemNumber) + { + auto& item = g_Level.Items[itemNumber]; + + // Initialize barrier height. + auto pointColl = GetCollision(&item); + float barrierHeight = item.Pose.Position.y - pointColl.Position.Ceiling; + item.ItemFlags[0] = barrierHeight; + + // Initialize barrier effect. + auto barrier = LaserBarrier{}; + barrier.Initialize(item); + LaserBarriers.insert({ itemNumber, barrier }); + } + + static void SpawnLaserBarrierLight(const ItemInfo& item, float intensity, float amplitude) + { + float intensityNorm = intensity - Random::GenerateFloat(0.0f, amplitude); + TriggerDynamicLight( + item.Pose.Position.x, item.Pose.Position.y, item.Pose.Position.z, + 8, + intensityNorm * (item.Model.Color.x / 2), + intensityNorm * (item.Model.Color.y / 2), + intensityNorm * (item.Model.Color.z / 2)); + } + + void ControlLaserBarrier(short itemNumber) + { + constexpr auto LIGHT_INTENSITY = 150.0f; + constexpr auto LIGHT_AMPLITUDE = 31.0f; + + if (!LaserBarriers.count(itemNumber)) + return; + + auto& item = g_Level.Items[itemNumber]; + auto& barrier = LaserBarriers.at(itemNumber); + + if (!TriggerActive(&item)) + { + barrier.IsActive = false; + barrier.Color.w = 0.0f; + item.Model.Color.w = 0.0f; + return; + } + + // Brightness fade-in and distortion. + if (item.Model.Color.w < 1.0f) + item.Model.Color.w += 0.02f; + + if (barrier.Color.w < 1.0f) + barrier.Color.w += 0.02f; + + // TODO: Weird. + if (item.Model.Color.w > 8.0f) + { + barrier.Color.w = 0.8f; + item.Model.Color.w = 0.8f; + } + + barrier.IsActive = true; + barrier.Update(item); + + if (item.Model.Color.w >= 0.8f) + SpawnLaserBarrierLight(item, LIGHT_INTENSITY, LIGHT_AMPLITUDE); + + SoundEffect(SFX_TR5_DOOR_BEAM, &item.Pose); + } + + void CollideLaserBarrier(short itemNumber, ItemInfo* playerItem, CollisionInfo* coll) + { + constexpr auto LIGHT_INTENSITY = 255.0f; + constexpr auto LIGHT_AMPLITUDE = 100.0f; + + if (!LaserBarriers.count(itemNumber)) + return; + + auto& item = g_Level.Items[itemNumber]; + auto& barrier = LaserBarriers.at(itemNumber); + + if (!barrier.IsActive) + return; + + auto playerBox = GameBoundingBox(playerItem).ToBoundingOrientedBox(playerItem->Pose); + if (barrier.BoundingBox.Intersects(playerBox)) + { + if (barrier.IsLethal && + playerItem->HitPoints > 0 && playerItem->Effect.Type != EffectType::Smoke) + { + ItemRedLaserBurn(playerItem, 2.0f * FPS); + DoDamage(playerItem, MAXINT); + } + else if (barrier.IsHeavyActivator) + { + TestTriggers(&item, true, item.Flags & IFLAG_ACTIVATION_MASK); + } + + barrier.Color.w = Random::GenerateFloat(0.6f, 1.0f); + SpawnLaserBarrierLight(item, LIGHT_INTENSITY, LIGHT_AMPLITUDE); + } + } + + void ClearLaserBarrierEffects() + { + LaserBarriers.clear(); + } +} diff --git a/TombEngine/Objects/TR5/Trap/LaserBarrier.h b/TombEngine/Objects/TR5/Trap/LaserBarrier.h new file mode 100644 index 000000000..4f0f6bfa2 --- /dev/null +++ b/TombEngine/Objects/TR5/Trap/LaserBarrier.h @@ -0,0 +1,40 @@ +#pragma once +#include "Math/Math.h" + +using namespace TEN::Math; + +struct CollisionInfo; +struct ItemInfo; + +namespace TEN::Traps::TR5 +{ + struct LaserBarrierBeam + { + static constexpr auto VERTEX_COUNT = 4; + static constexpr auto HEIGHT = BLOCK(0.4f); + + std::array VertexPoints = {}; + }; + + struct LaserBarrier + { + Vector4 Color = Vector4::Zero; + BoundingOrientedBox BoundingBox = {}; + std::vector Beams = {}; + + bool IsActive = false; + bool IsLethal = false; + bool IsHeavyActivator = false; + + void Initialize(const ItemInfo& item); + void Update(const ItemInfo& item); + }; + + extern std::unordered_map LaserBarriers; + + void InitializeLaserBarrier(short itemNumber); + void ControlLaserBarrier(short itemNumber); + void CollideLaserBarrier(short itemNumber, ItemInfo* playerItem, CollisionInfo* coll); + + void ClearLaserBarrierEffects(); +} diff --git a/TombEngine/Objects/TR5/tr5_objects.cpp b/TombEngine/Objects/TR5/tr5_objects.cpp index 9c7e0aa3d..51d4e3445 100644 --- a/TombEngine/Objects/TR5/tr5_objects.cpp +++ b/TombEngine/Objects/TR5/tr5_objects.cpp @@ -57,13 +57,14 @@ // Traps #include "Objects/Effects/tr5_electricity.h" +#include "Objects/TR5/Trap/LaserBarrier.h" #include "Objects/TR5/Object/tr5_rollingball.h" -#include "Objects/TR5/Trap/tr5_explosion.h" -#include "Objects/TR5/Trap/tr5_fallingceiling.h" -#include "Objects/TR5/Trap/tr5_romehammer.h" #include "Objects/TR5/Trap/tr5_ventilator.h" -#include "Objects/TR5/Trap/tr5_wreckingball.h" #include "Objects/TR5/Trap/tr5_zip_line.h" +#include "Objects/TR5/Trap/tr5_romehammer.h" +#include "Objects/TR5/Trap/tr5_fallingceiling.h" +#include "Objects/TR5/Trap/tr5_explosion.h" +#include "Objects/TR5/Trap/tr5_wreckingball.h" // Switches #include "Objects/TR5/Switch/tr5_crowdove_switch.h" @@ -73,6 +74,7 @@ using namespace TEN::Entities::Creatures::TR5; using namespace TEN::Entities::Switches; +using namespace TEN::Traps::TR5; static void StartEntity(ObjectInfo *obj) { @@ -951,6 +953,16 @@ static void StartTrap(ObjectInfo *obj) obj->drawRoutine = nullptr; obj->usingDrawAnimatingItem = false; } + + obj = &Objects[ID_LASER_BARRIER]; + if (obj->loaded) + { + obj->Initialize = InitializeLaserBarrier; + obj->control = ControlLaserBarrier; + obj->collision = CollideLaserBarrier; + obj->drawRoutine = nullptr; + obj->usingDrawAnimatingItem = false; + } } static void StartSwitch(ObjectInfo *obj) diff --git a/TombEngine/Objects/game_object_ids.h b/TombEngine/Objects/game_object_ids.h index 0c3b61793..d1f65aefb 100644 --- a/TombEngine/Objects/game_object_ids.h +++ b/TombEngine/Objects/game_object_ids.h @@ -767,7 +767,7 @@ enum GAME_OBJECT_ID : short ID_LARA_START_POS, ID_TELEPORTER, ID_LIFT_TELEPORTER, - ID_LASERS, + ID_LASER_BARRIER, ID_STEAM_LASERS, ID_FLOOR_LASERS, ID_KILL_ALL_TRIGGERS, diff --git a/TombEngine/Renderer/ConstantBuffers/SpriteBuffer.h b/TombEngine/Renderer/ConstantBuffers/SpriteBuffer.h index 3e996bc49..f0446bf9b 100644 --- a/TombEngine/Renderer/ConstantBuffers/SpriteBuffer.h +++ b/TombEngine/Renderer/ConstantBuffers/SpriteBuffer.h @@ -8,4 +8,5 @@ using DirectX::SimpleMath::Vector4; struct alignas(16) CSpriteBuffer { float IsSoftParticle; + int RenderType; }; diff --git a/TombEngine/Renderer/Renderer11.h b/TombEngine/Renderer/Renderer11.h index f86aa0df2..45e1da9e1 100644 --- a/TombEngine/Renderer/Renderer11.h +++ b/TombEngine/Renderer/Renderer11.h @@ -518,6 +518,7 @@ namespace TEN::Renderer void InitializeMenuBars(int y); void DrawAllStrings(); + void DrawLaserBarriers(RenderView& view); void DrawHorizonAndSky(RenderView& renderView, ID3D11DepthStencilView* depthTarget); void DrawRooms(RenderView& view, bool transparent); void DrawRoomsSorted(RendererTransparentFaceInfo* info, bool resetPipeline, RenderView& view); @@ -602,24 +603,24 @@ namespace TEN::Renderer float CalculateFrameRate(); void AddSpriteBillboard(RendererSprite* sprite, const Vector3& pos, const Vector4& color, float orient2D, float scale, - Vector2 size, BLEND_MODES blendMode, bool isSoftParticle, RenderView& view); + Vector2 size, BLEND_MODES blendMode, bool isSoftParticle, RenderView& view, SpriteRenderType renderType = SpriteRenderType::Default); void AddSpriteBillboardConstrained(RendererSprite* sprite, const Vector3& pos, const Vector4& color, float orient2D, - float scale, Vector2 size, BLEND_MODES blendMode, const Vector3& constrainAxis, - bool isSoftParticle, RenderView& view); + float scale, Vector2 size, BLEND_MODES blendMode, const Vector3& constrainAxis, + bool isSoftParticle, RenderView& view, SpriteRenderType renderType = SpriteRenderType::Default); void AddSpriteBillboardConstrainedLookAt(RendererSprite* sprite, const Vector3& pos, const Vector4& color, float orient2D, - float scale, Vector2 size, BLEND_MODES blendMode, const Vector3& lookAtAxis, - bool isSoftParticle, RenderView& view); + float scale, Vector2 size, BLEND_MODES blendMode, const Vector3& lookAtAxis, + bool isSoftParticle, RenderView& view, SpriteRenderType renderType = SpriteRenderType::Default); void AddQuad(RendererSprite* sprite, const Vector3& vertex0, const Vector3& vertex1, const Vector3& vertex2, const Vector3& vertex3, const Vector4 color, float orient2D, float scale, Vector2 size, BLEND_MODES blendMode, bool softParticles, RenderView& view); void AddQuad(RendererSprite* sprite, const Vector3& vertex0, const Vector3& vertex1, const Vector3& vertex2, const Vector3& vertex3, const Vector4& color0, const Vector4& color1, const Vector4& color2, const Vector4& color3, float orient2D, - float scale, Vector2 size, BLEND_MODES blendMode, bool isSoftParticle, RenderView& view); + float scale, Vector2 size, BLEND_MODES blendMode, bool isSoftParticle, RenderView& view, SpriteRenderType renderType = SpriteRenderType::Default); void AddColoredQuad(const Vector3& vertex0, const Vector3& vertex1, const Vector3& vertex2, const Vector3& vertex3, const Vector4& color, BLEND_MODES blendMode, RenderView& view); void AddColoredQuad(const Vector3& vertex0, const Vector3& vertex1, const Vector3& vertex2, const Vector3& vertex3, const Vector4& color0, const Vector4& color1, const Vector4& color2, const Vector4& color3, - BLEND_MODES blendMode, RenderView& view); + BLEND_MODES blendMode, RenderView& view, SpriteRenderType renderType = SpriteRenderType::Default); Matrix GetWorldMatrixForSprite(RendererSpriteToDraw* spr, RenderView& view); RendererObject& GetRendererObject(GAME_OBJECT_ID id); diff --git a/TombEngine/Renderer/Renderer11Draw.cpp b/TombEngine/Renderer/Renderer11Draw.cpp index 58f7d34e4..7cd43e3c8 100644 --- a/TombEngine/Renderer/Renderer11Draw.cpp +++ b/TombEngine/Renderer/Renderer11Draw.cpp @@ -1513,6 +1513,7 @@ namespace TEN::Renderer DrawHelicalLasers(view); DrawRopes(view); DrawStreamers(view); + DrawLaserBarriers(view); // Here is where we actually output sprites DrawSprites(view); diff --git a/TombEngine/Renderer/Renderer11DrawEffect.cpp b/TombEngine/Renderer/Renderer11DrawEffect.cpp index ec392970b..48f562c68 100644 --- a/TombEngine/Renderer/Renderer11DrawEffect.cpp +++ b/TombEngine/Renderer/Renderer11DrawEffect.cpp @@ -26,9 +26,10 @@ #include "Game/misc.h" #include "Game/Setup.h" #include "Math/Math.h" +#include "Objects/TR5/Trap/LaserBarrier.h" #include "Objects/Utils/object_helper.h" -#include "Renderer/Quad/RenderQuad.h" #include "Renderer/RendererSprites.h" +#include "Renderer/Quad/RenderQuad.h" #include "Specific/level.h" using namespace TEN::Effects::Blood; @@ -41,13 +42,14 @@ using namespace TEN::Effects::Ripple; using namespace TEN::Effects::Streamer; using namespace TEN::Entities::Creatures::TR5; using namespace TEN::Math; +using namespace TEN::Traps::TR5; extern BLOOD_STRUCT Blood[MAX_SPARKS_BLOOD]; extern FIRE_SPARKS FireSparks[MAX_SPARKS_FIRE]; extern SMOKE_SPARKS SmokeSparks[MAX_SPARKS_SMOKE]; extern SHOCKWAVE_STRUCT ShockWaves[MAX_SHOCKWAVE]; extern FIRE_LIST Fires[MAX_FIRE_LIST]; -extern GUNFLASH_STRUCT Gunflashes[MAX_GUNFLASH]; // offset 0xA31D8 +extern GUNFLASH_STRUCT Gunflashes[MAX_GUNFLASH]; extern Particle Particles[MAX_PARTICLES]; extern SPLASH_STRUCT Splashes[MAX_SPLASHES]; @@ -60,9 +62,31 @@ namespace TEN::Renderer RendererSprite* Sprite; BLEND_MODES BlendMode; std::vector SpritesToDraw; - bool IsBillboard; - bool IsSoftParticle; + + bool IsBillboard = false; + bool IsSoftParticle = false; + + SpriteRenderType RenderType; }; + + void Renderer11::DrawLaserBarriers(RenderView& view) + { + if (LaserBarriers.empty()) + return; + + for (const auto& [entityID, barrier] : LaserBarriers) + { + for (const auto& beam : barrier.Beams) + { + AddColoredQuad( + beam.VertexPoints[0], beam.VertexPoints[1], + beam.VertexPoints[2], beam.VertexPoints[3], + barrier.Color, barrier.Color, + barrier.Color, barrier.Color, + BLENDMODE_ADDITIVE, view, SpriteRenderType::LaserBarrier); + } + } + } void Renderer11::DrawStreamers(RenderView& view) { @@ -1117,6 +1141,7 @@ namespace TEN::Renderer currentSpriteBucket.BlendMode = view.spritesToDraw[0].BlendMode; currentSpriteBucket.IsBillboard = view.spritesToDraw[0].Type != RENDERER_SPRITE_TYPE::SPRITE_TYPE_3D; currentSpriteBucket.IsSoftParticle = view.spritesToDraw[0].SoftParticle; + currentSpriteBucket.RenderType = view.spritesToDraw[0].renderType; for (auto& rDrawSprite : view.spritesToDraw) { @@ -1125,6 +1150,7 @@ namespace TEN::Renderer if (rDrawSprite.Sprite != currentSpriteBucket.Sprite || rDrawSprite.BlendMode != currentSpriteBucket.BlendMode || rDrawSprite.SoftParticle != currentSpriteBucket.IsSoftParticle || + rDrawSprite.renderType != currentSpriteBucket.RenderType || currentSpriteBucket.SpritesToDraw.size() == INSTANCED_SPRITES_BUCKET_SIZE || isBillboard != currentSpriteBucket.IsBillboard) { @@ -1134,10 +1160,12 @@ namespace TEN::Renderer currentSpriteBucket.BlendMode = rDrawSprite.BlendMode; currentSpriteBucket.IsBillboard = isBillboard; currentSpriteBucket.IsSoftParticle = rDrawSprite.SoftParticle; + currentSpriteBucket.RenderType = rDrawSprite.renderType; currentSpriteBucket.SpritesToDraw.clear(); } - if (DoesBlendModeRequireSorting(rDrawSprite.BlendMode)) + //HACK: prevent sprites like Explosionsmoke which have blendmode_subtractive from having laser effects + if (DoesBlendModeRequireSorting(rDrawSprite.BlendMode) && currentSpriteBucket.RenderType) { // If blend mode requires sorting, save sprite for later. int distance = (rDrawSprite.pos - Vector3(Camera.pos.x, Camera.pos.y, Camera.pos.z)).Length(); @@ -1212,9 +1240,13 @@ namespace TEN::Renderer BindTexture(TEXTURE_COLOR_MAP, spriteBucket.Sprite->Texture, SAMPLER_LINEAR_CLAMP); if (spriteBucket.BlendMode == BLEND_MODES::BLENDMODE_ALPHATEST) + { SetAlphaTest(ALPHA_TEST_GREATER_THAN, ALPHA_TEST_THRESHOLD, true); + } else + { SetAlphaTest(ALPHA_TEST_NONE, 0); + } m_cbInstancedSpriteBuffer.updateData(m_stInstancedSpriteBuffer, m_context.Get()); BindConstantBufferVS(CB_INSTANCED_SPRITES, m_cbInstancedSpriteBuffer.get()); @@ -1245,6 +1277,8 @@ namespace TEN::Renderer continue; m_stSprite.IsSoftParticle = spriteBucket.IsSoftParticle ? 1 : 0; + m_stSprite.RenderType = spriteBucket.RenderType; + m_cbSprite.updateData(m_stSprite, m_context.Get()); BindConstantBufferVS(CB_SPRITE, m_cbSprite.get()); BindConstantBufferPS(CB_SPRITE, m_cbSprite.get()); @@ -1253,9 +1287,13 @@ namespace TEN::Renderer BindTexture(TEXTURE_COLOR_MAP, spriteBucket.Sprite->Texture, SAMPLER_LINEAR_CLAMP); if (spriteBucket.BlendMode == BLEND_MODES::BLENDMODE_ALPHATEST) + { SetAlphaTest(ALPHA_TEST_GREATER_THAN, ALPHA_TEST_THRESHOLD, true); + } else + { SetAlphaTest(ALPHA_TEST_NONE, 0); + } m_primitiveBatch->Begin(); @@ -1309,6 +1347,8 @@ namespace TEN::Renderer if (resetPipeline) { m_stSprite.IsSoftParticle = info->sprite->SoftParticle ? 1 : 0; + m_stSprite.RenderType = SpriteRenderType::Default; + m_cbSprite.updateData(m_stSprite, m_context.Get()); BindConstantBufferVS(CB_SPRITE, m_cbSprite.get()); BindConstantBufferPS(CB_SPRITE, m_cbSprite.get()); diff --git a/TombEngine/Renderer/RendererSprites.cpp b/TombEngine/Renderer/RendererSprites.cpp index 5bae9b072..fc6181329 100644 --- a/TombEngine/Renderer/RendererSprites.cpp +++ b/TombEngine/Renderer/RendererSprites.cpp @@ -5,7 +5,7 @@ namespace TEN::Renderer { void Renderer11::AddSpriteBillboard(RendererSprite* sprite, const Vector3& pos, const Vector4& color, float orient2D, float scale, - Vector2 size, BLEND_MODES blendMode, bool isSoftParticle, RenderView& view) + Vector2 size, BLEND_MODES blendMode, bool isSoftParticle, RenderView& view, SpriteRenderType renderType) { if (m_Locked) return; @@ -32,13 +32,14 @@ namespace TEN::Renderer spr.c3 = color; spr.c4 = color; spr.color = color; + spr.renderType = renderType; view.spritesToDraw.push_back(spr); } void Renderer11::AddSpriteBillboardConstrained(RendererSprite* sprite, const Vector3& pos, const Vector4 &color, float orient2D, float scale, Vector2 size, BLEND_MODES blendMode, const Vector3& constrainAxis, - bool softParticles, RenderView& view) + bool softParticles, RenderView& view, SpriteRenderType renderType) { if (m_Locked) return; @@ -66,13 +67,14 @@ namespace TEN::Renderer spr.c3 = color; spr.c4 = color; spr.color = color; + spr.renderType = renderType; view.spritesToDraw.push_back(spr); } void Renderer11::AddSpriteBillboardConstrainedLookAt(RendererSprite* sprite, const Vector3& pos, const Vector4& color, float orient2D, float scale, Vector2 size, BLEND_MODES blendMode, const Vector3& lookAtAxis, - bool isSoftParticle, RenderView& view) + bool isSoftParticle, RenderView& view, SpriteRenderType renderType) { if (m_Locked) return; @@ -100,6 +102,7 @@ namespace TEN::Renderer spr.c3 = color; spr.c4 = color; spr.color = color; + spr.renderType = renderType; view.spritesToDraw.push_back(spr); } @@ -108,12 +111,12 @@ namespace TEN::Renderer const Vector4 color, float orient2D, float scale, Vector2 size, BLEND_MODES blendMode, bool softParticles, RenderView& view) { - AddQuad(sprite, vertex0, vertex1, vertex2, vertex3, color, color, color, color, orient2D, scale, size, blendMode, softParticles, view); + AddQuad(sprite, vertex0, vertex1, vertex2, vertex3, color, color, color, color, orient2D, scale, size, blendMode, softParticles, view, SpriteRenderType::Default); } void Renderer11::AddQuad(RendererSprite* sprite, const Vector3& vertex0, const Vector3& vertex1, const Vector3& vertex2, const Vector3& vertex3, const Vector4& color0, const Vector4& color1, const Vector4& color2, const Vector4& color3, float orient2D, - float scale, Vector2 size, BLEND_MODES blendMode, bool isSoftParticle, RenderView& view) + float scale, Vector2 size, BLEND_MODES blendMode, bool isSoftParticle, RenderView& view, SpriteRenderType renderType) { if (m_Locked) return; @@ -143,6 +146,7 @@ namespace TEN::Renderer spr.BlendMode = blendMode; spr.pos = (vertex0 + vertex1 + vertex2 + vertex3) / 4.0f; spr.SoftParticle = isSoftParticle; + spr.renderType = renderType; view.spritesToDraw.push_back(spr); } @@ -150,12 +154,12 @@ namespace TEN::Renderer void Renderer11::AddColoredQuad(const Vector3& vertex0, const Vector3& vertex1, const Vector3& vertex2, const Vector3& vertex3, const Vector4& color, BLEND_MODES blendMode, RenderView& view) { - AddColoredQuad(vertex0, vertex1, vertex2, vertex3, color, color, color, color, blendMode, view); + AddColoredQuad(vertex0, vertex1, vertex2, vertex3, color, color, color, color, blendMode, view, SpriteRenderType::Default); } void Renderer11::AddColoredQuad(const Vector3& vertex0, const Vector3& vertex1, const Vector3& vertex2, const Vector3& vertex3, const Vector4& color0, const Vector4& color1, const Vector4& color2, const Vector4& color3, - BLEND_MODES blendMode, RenderView& view) + BLEND_MODES blendMode, RenderView& view, SpriteRenderType renderType) { if (m_Locked) return; @@ -175,6 +179,7 @@ namespace TEN::Renderer sprite.BlendMode = blendMode; sprite.pos = (vertex0 + vertex1 + vertex2 + vertex3) / 4.0f; sprite.SoftParticle = false; + sprite.renderType = renderType; view.spritesToDraw.push_back(sprite); } diff --git a/TombEngine/Renderer/RendererSprites.h b/TombEngine/Renderer/RendererSprites.h index c8a34f8e5..6cab69039 100644 --- a/TombEngine/Renderer/RendererSprites.h +++ b/TombEngine/Renderer/RendererSprites.h @@ -6,6 +6,12 @@ namespace TEN::Renderer struct RenderView; struct RendererSprite; + enum SpriteRenderType + { + Default, + LaserBarrier + }; + struct RendererSpriteToDraw { RENDERER_SPRITE_TYPE Type; @@ -28,5 +34,6 @@ namespace TEN::Renderer Vector3 ConstrainAxis; Vector3 LookAtAxis; bool SoftParticle; + SpriteRenderType renderType = SpriteRenderType::Default; }; } diff --git a/TombEngine/Resources.aps b/TombEngine/Resources.aps index 82126b3c4aa052f304cd91102a4418487148ace5..9f242a9896c2ac2c3fa90abc58cb0db0ab154c2a 100644 GIT binary patch delta 889 zcmaFzoMpjFmI(@s?h_Ryb=g@MpdiDLk-^z2CbT%Us5r(iH8(#s#w9)p z!L<1<)AqYejPn&4BevJ7FqSilI)V+$WJqMlVE~cE44Djh+j-R(Uo%NRXJ%kfVPIhJ zUXHU82lJg8FCr&8B!Ty7+e_g8Il=F;a&#GyMw*z z!BEPOG~H2`(U*~ZdcQ7XCc6=X5rY|n(e(eijMj{+r`zf=N;0xf57%RqlP4H`D%0od zF^UtT?tvbo7%}P;^ch2t17~`pKI0c+G|o3*k1AAhAGo4K_W5ollkPOSX;vw z7@kbu2@>h4o@`ew#kxY3f#J&ZpCFMrk0<**mSS5Wz`&sLZ@QHcqa5=aKE~T)~1WRi$PXDjYXv+qQXcf)r lcE*fWte`~XGriWBQJxi)HX^1k1Tj}LF)-|ze$<#z9so}m-*W%} delta 733 zcmZ4RlI6*BmI(@sdJ`2TMI>1mpkR#wBZG@oj7w_S^bdNBD$EQFQzrJxGftVf)|8Wh zft7)gfq{W>;%ix^FN~A97?l_=Ox9%-XLe%{p6t#j&l|+x!{ExGz~I7=%1}0WBBS`^ zWsF*k29qx`Hu5?%Xfh};7%>=4j%QlSYRaI;VAw3kyj_r)alRsB%=V2cjOC1y zVGQ{UISi!?xeTccB@9IjnGDGc3Jh)x`P*&P7+*6Je}j+{I}oMVvJ<6W?9Kl@){YDeo=oV5o&pJ*wf!H-qX*`A1RQn*^mN!dY(R`7>dAgeZ~+}A5B*?VElrjCf1OVTb+SH z1S4c1{z7()-t=BWMoE4|j89<##qmVx=@$$cSr|R0Uo~WuX9{4OoW&+JUBHNug>lAo zQ6olqrUbFcRbo=p13*F=(?dZ*8&oErQjwZI0VEVLeJV(3!QRQc_DW5^020cWeibD2 z;qPRwe^S#0j2T%NcT5*GW|U`6kYJo%Ex{-`Jpd$VF+CI{ctDwP`fX)KN!A!<28KD) zr-H<6G#IDrYcSffgFNy@gK_$64Ms~=PzsQlZfU|O&kBlEo$0Y4CMYTrrZ<`}$^!s+ C0;&xF diff --git a/TombEngine/Scripting/Internal/TEN/Objects/ObjectIDs.h b/TombEngine/Scripting/Internal/TEN/Objects/ObjectIDs.h index b3d03bf4e..db7024bd9 100644 --- a/TombEngine/Scripting/Internal/TEN/Objects/ObjectIDs.h +++ b/TombEngine/Scripting/Internal/TEN/Objects/ObjectIDs.h @@ -1938,7 +1938,7 @@ static const std::unordered_map kObjIDs { { "LARA_START_POS", ID_LARA_START_POS }, { "TELEPORTER", ID_TELEPORTER }, { "LIFT_TELEPORTER", ID_LIFT_TELEPORTER }, - { "LASERS", ID_LASERS }, + { "LASER_BARRIER", ID_LASER_BARRIER }, { "STEAM_LASERS", ID_STEAM_LASERS }, { "FLOOR_LASERS", ID_FLOOR_LASERS }, { "KILL_ALL_TRIGGERS", ID_KILL_ALL_TRIGGERS }, diff --git a/TombEngine/Shaders/AnimatedTextures.hlsli b/TombEngine/Shaders/AnimatedTextures.hlsli index 98ab626b0..de62dbe1a 100644 --- a/TombEngine/Shaders/AnimatedTextures.hlsli +++ b/TombEngine/Shaders/AnimatedTextures.hlsli @@ -18,15 +18,18 @@ cbuffer AnimatedBuffer : register(b6) float2 CalculateUVRotate(float2 uv, unsigned int frame) { if (FPS == 0) + { return uv; + } else { float step = uv.y - AnimFrames[frame].TopLeft.y; - float vert = AnimFrames[frame].TopLeft.y + step / 2.0f; - float height = (AnimFrames[frame].BottomLeft.y - AnimFrames[frame].TopLeft.y) / 2.0f; - float relPos = 1.0f - (Frame % FPS) / float(FPS); - float newUV = vert + height * relPos; + float vert = AnimFrames[frame].TopLeft.y + (step / 2); + float height = (AnimFrames[frame].BottomLeft.y - AnimFrames[frame].TopLeft.y) / 2; + float relPos = 1.0f - (Frame % FPS) / (float)FPS; + + float newUV = vert + height * relPos; return float2(uv.x, newUV); } } @@ -34,7 +37,7 @@ float2 CalculateUVRotate(float2 uv, unsigned int frame) float2 GetFrame(unsigned int index, unsigned int offset) { float speed = FPS / 30.0f; - int frame = (int)(Frame * speed + offset) % NumAnimFrames; + int frame = int(Frame * speed + offset) % NumAnimFrames; float2 result = 0; @@ -43,16 +46,19 @@ float2 GetFrame(unsigned int index, unsigned int offset) case 0: result = AnimFrames[frame].TopLeft; break; + case 1: result = AnimFrames[frame].TopRight; break; + case 2: result = AnimFrames[frame].BottomRight; break; + case 3: result = AnimFrames[frame].BottomLeft; break; } return result; -} \ No newline at end of file +} diff --git a/TombEngine/Shaders/Blending.hlsli b/TombEngine/Shaders/Blending.hlsli index b286561cf..9f31f806b 100644 --- a/TombEngine/Shaders/Blending.hlsli +++ b/TombEngine/Shaders/Blending.hlsli @@ -3,25 +3,29 @@ #include "./Math.hlsli" -#define ALPHA_TEST_NONE 0 +#define ALPHA_TEST_NONE 0 #define ALPHA_TEST_GREATER_THAN 1 -#define ALPHA_TEST_LESS_THAN 2 +#define ALPHA_TEST_LESS_THAN 2 -#define BLENDMODE_OPAQUE 0, -#define BLENDMODE_ALPHATEST 1 -#define BLENDMODE_ADDITIVE 2 -#define BLENDMODE_NOZTEST 4 +#define BLENDMODE_OPAQUE 0, +#define BLENDMODE_ALPHATEST 1 +#define BLENDMODE_ADDITIVE 2 +#define BLENDMODE_NOZTEST 4 #define BLENDMODE_SUBTRACTIVE 5 -#define BLENDMODE_WIREFRAME 6 -#define BLENDMODE_EXCLUDE 8 -#define BLENDMODE_SCREEN 9 -#define BLENDMODE_LIGHTEN 10 -#define BLENDMODE_ALPHABLEND 11 +#define BLENDMODE_WIREFRAME 6 +#define BLENDMODE_EXCLUDE 8 +#define BLENDMODE_SCREEN 9 +#define BLENDMODE_LIGHTEN 10 +#define BLENDMODE_ALPHABLEND 11 + +#define ZERO float3(0.0f, 0.0f, 0.0f) +#define EIGHT_FIVE float3( 0.85f, 0.85f, 0.85f) +#define BLENDING 0.707f cbuffer BlendingBuffer : register(b12) { - uint BlendMode; - int AlphaTest; + uint BlendMode; + int AlphaTest; float AlphaThreshold; }; @@ -48,30 +52,124 @@ float4 DoFog(float4 sourceColor, float4 fogColor, float value) switch (BlendMode) { - case BLENDMODE_ADDITIVE: - case BLENDMODE_SCREEN: - case BLENDMODE_LIGHTEN: - fogColor.xyz *= Luma(sourceColor.xyz); - break; + case BLENDMODE_ADDITIVE: + case BLENDMODE_SCREEN: + case BLENDMODE_LIGHTEN: + fogColor.xyz *= Luma(sourceColor.xyz); + break; - case BLENDMODE_SUBTRACTIVE: - case BLENDMODE_EXCLUDE: - fogColor.xyz *= 1.0f - Luma(sourceColor.xyz); - break; + case BLENDMODE_SUBTRACTIVE: + case BLENDMODE_EXCLUDE: + fogColor.xyz *= 1.0f - Luma(sourceColor.xyz); + break; - case BLENDMODE_ALPHABLEND: - fogColor.w = sourceColor.w; - break; + case BLENDMODE_ALPHABLEND: + fogColor.w = sourceColor.w; + break; - default: - break; + default: + break; } if (fogColor.w > sourceColor.w) fogColor.w = sourceColor.w; - + float4 result = lerp(sourceColor, fogColor, value); return result; } -#endif // BLENDINGSHADER \ No newline at end of file +float4 DoLaserBarrierEffect(float3 input, float4 output, float2 uv, float faceFactor, float timeUniform) +{ + float2 noiseTexture = input.xy / uv; + noiseTexture *= uv.x / uv.y; + float noiseValue = FractalNoise(noiseTexture * 8.0f - timeUniform); + + float4 color = output; + float gradL = smoothstep(0.0, 1.0, uv.x); + float gradR = smoothstep(1.0, 0.0, uv.x); + float gradT = smoothstep(0.0, 0.25, uv.y); + float gradB = 1.0 - smoothstep(0.75, 1.0, uv.y); + + float distortion = timeUniform / 1024; + + float3 noisix = SimplexNoise + ( + SimplexNoise(float3(input.r * distortion, input.g, input.b)) + ); + float3 shadowx = SimplexNoise + ( + cos(SimplexNoise(sin(timeUniform + input.rgb * 400))) + ); + + noisix.x = noisix.x > 0.9 ? 0.7 : noisix.x; + noisix.y = noisix.y > 0.9 ? 0.7 : noisix.y; + noisix.z = noisix.z > 0.9 ? 0.7 : noisix.z; + color.rgb *= noisix + 1.3f; + color.rgb -= noisix + 0.2f; + + float frequency = 0.1; + float amplitude = 0.8; + float persistence = 0.5; + float noiseValue2 = 0; + float noiseValue3 = 0; + + float2 uv84 = (uv * 2.4); + uv84.y = (uv84.y - 1.3); + uv84.x = (uv84.x / 1.3); + float2 uv85 = (uv / 2.4); + + noiseValue2 = AnimatedNebula(uv84, timeUniform * 0.1f); + + frequency = 2.5; + amplitude = 0.2; + persistence = 4.7; + + float2 uv83 = uv * 8; + uv83.y = (uv.y + (timeUniform * 0.02)); + noiseValue3 = NebularNoise(uv83, frequency, amplitude, persistence); + + noiseValue2 += AnimatedNebula(uv/2, timeUniform * 0.05f); + + color.rgb -= noiseValue - 0.7f; + color.rgb *= noiseValue2 + 1.0f; + color.rgb += noiseValue3; + color.a *= noiseValue + 0.01f; + + color.rgb -= shadowx + 0.1f; + + color.a *= noiseValue2 + 0.9f; + color.a *= noiseValue3 + 2.0f; + + float fade0 = faceFactor * max(0.0, 1.0 - dot(float2(BLENDING, BLENDING), float2(gradL, gradT))); + float fade1 = faceFactor * max(0.0, 1.0 - dot(float2(BLENDING, BLENDING), float2(gradL, gradB))); + float fade2 = faceFactor * max(0.0, 1.0 - dot(float2(BLENDING, BLENDING), float2(gradR, gradB))); + float fade3 = faceFactor * max(0.0, 1.0 - dot(float2(BLENDING, BLENDING), float2(gradR, gradT))); + + float fadeL = 1.40f * faceFactor * faceFactor * (1.0 - gradL); + float fadeB = 2.75f * faceFactor * faceFactor * (1.0 - gradB); + float fadeR = 1.40f * faceFactor * faceFactor * (1.0 - gradR); + float fadeT = 2.75f * faceFactor * faceFactor * (1.0 - gradT); + + float fade = max( + max(max(fade0, fade1), max(fade2, fade3)), + max(max(fadeL, fadeR), max(fadeB, fadeT))); + + float scale = 1.0 - fade; + + color *= scale; + float decayFactor = 1.0f; + if (uv.y > 0.5f && uv.y < 1.0f) + { + decayFactor = uv.y / 2; + } + if (uv.y < 0.5f && uv.y > 0.0f) + { + decayFactor = (1.0f - uv.y) / 2; + } + color *= decayFactor; + + color.rgb = smoothstep(ZERO, EIGHT_FIVE, color.rgb); + return color; +} + +#endif // BLENDINGSHADER diff --git a/TombEngine/Shaders/DX11_Sprites.fx b/TombEngine/Shaders/DX11_Sprites.fx index f207fda34..34a66a1a1 100644 --- a/TombEngine/Shaders/DX11_Sprites.fx +++ b/TombEngine/Shaders/DX11_Sprites.fx @@ -6,9 +6,12 @@ // NOTE: This shader is used for all 3D and alpha blended sprites, because we send aleady transformed vertices to the GPU // instead of instances +#define FADE_FACTOR .789f + cbuffer SpriteBuffer : register(b9) { float IsSoftParticle; + int RenderType; }; struct PixelShaderInput @@ -34,7 +37,7 @@ PixelShaderInput VS(VertexShaderInput input) float4 worldPosition = float4(input.Position, 1.0f); output.Position = mul(worldPosition, ViewProjection); - output.PositionCopy = output.Position; + output.PositionCopy = output.Position; output.Normal = input.Normal; output.Color = input.Color; output.UV = input.UV; @@ -71,7 +74,12 @@ float4 PS(PixelShaderInput input) : SV_TARGET output.w = min(output.w, fade); } + if (RenderType == 1) + { + output = DoLaserBarrierEffect(input.Position, output, input.UV, FADE_FACTOR, Frame); + } + output = DoFog(output, float4(0.0f, 0.0f, 0.0f, 0.0f), input.Fog); return output; -} \ No newline at end of file +} diff --git a/TombEngine/Shaders/Math.hlsli b/TombEngine/Shaders/Math.hlsli index b9ef16545..95daf2bbc 100644 --- a/TombEngine/Shaders/Math.hlsli +++ b/TombEngine/Shaders/Math.hlsli @@ -1,12 +1,13 @@ #ifndef MATH #define MATH -#define PI 3.1415926535897932384626433832795028841971693993751058209749445923 -#define PI2 6.2831853071795864769252867665590057683943387987502116419498891846 +#define PI 3.1415926535897932384626433832795028841971693993751058209749445923 +#define PI2 6.2831853071795864769252867665590057683943387987502116419498891846 +#define OCTAVES 6 float Luma(float3 color) { - // Use Rec.709 trichromat formula to get perceptive luma value + // Use Rec.709 trichromat formula to get perceptive luma value. return float((color.x * 0.2126f) + (color.y * 0.7152f) + (color.z * 0.0722f)); } @@ -26,121 +27,257 @@ float3 Screen(float3 ambient, float3 tint) float LinearizeDepth(float depth, float nearPlane, float farPlane) { - return (2.0f * nearPlane) / (farPlane + nearPlane - depth * (farPlane - nearPlane)); + return ((nearPlane * 2) / (farPlane + nearPlane - (depth * (farPlane - nearPlane)))); } -float3 Mod289(float3 x) { - return x - floor(x * (1.0 / 289.0)) * 289.0; +float3 Mod289(float3 x) +{ + return (x - floor(x * (1 / 289.0f)) * 289.0f); } -float4 Mod289(float4 x) { - return x - floor(x * (1.0 / 289.0)) * 289.0; +float4 Mod289(float4 x) +{ + return (x - floor(x * (1 / 289.0f)) * 289.0f); } -float4 Permute(float4 x) { - return Mod289(((x*34.0)+10.0)*x); +float4 Permute(float4 x) +{ + return Mod289(((x * 34.0f) + 10.0f) * x); } float4 TaylorInvSqrt(float4 r) { - return 1.79284291400159 - 0.85373472095314 * r; + return (1.79284291400159f - 0.85373472095314f * r); } float SimplexNoise(float3 v) { - const float2 C = float2(1.0/6.0, 1.0/3.0) ; - const float4 D = float4(0.0, 0.5, 1.0, 2.0); + const float2 C = float2(1 / 6.0f, 1 / 3.0f) ; + const float4 D = float4(0.0f, 0.5f, 1.0f, 2.0f); -// First corner - float3 i = floor(v + dot(v, C.yyy) ); - float3 x0 = v - i + dot(i, C.xxx) ; + // First corner. + float3 i = floor(v + dot(v, C.yyy)); + float3 x0 = v - i + dot(i, C.xxx); -// Other corners + // Other corners. float3 g = step(x0.yzx, x0.xyz); - float3 l = 1.0 - g; - float3 i1 = min( g.xyz, l.zxy ); - float3 i2 = max( g.xyz, l.zxy ); + float3 l = 1.0f - g; + float3 i1 = min(g.xyz, l.zxy); + float3 i2 = max(g.xyz, l.zxy); -// x0 = x0 - 0.0 + 0.0 * C.xxx; -// x1 = x0 - i1 + 1.0 * C.xxx; -// x2 = x0 - i2 + 2.0 * C.xxx; -// x3 = x0 - 1.0 + 3.0 * C.xxx; + // x0 = x0 - 0.0 + 0.0 * C.xxx; + // x1 = x0 - i1 + 1.0 * C.xxx; + // x2 = x0 - i2 + 2.0 * C.xxx; + // x3 = x0 - 1.0 + 3.0 * C.xxx; float3 x1 = x0 - i1 + C.xxx; - float3 x2 = x0 - i2 + C.yyy;// 2.0*C.x = 1/3 = C.y - float3 x3 = x0 - D.yyy; // -1.0+3.0*C.x = -0.5 = -D.y + float3 x2 = x0 - i2 + C.yyy;// 2.0 * C.x = 1 / 3 = C.y + float3 x3 = x0 - D.yyy; // -1.0 + 3.0 * C.x = -0.5 = -D.y -// Permutations + // Permutations. i = Mod289(i); - float4 p = Permute( Permute( Permute( - i.z + float4(0.0, i1.z, i2.z, 1.0 )) + - i.y + float4(0.0, i1.y, i2.y, 1.0 )) + - i.x + float4(0.0, i1.x, i2.x, 1.0 )); + float4 p = Permute( + Permute( + Permute( + i.z + float4(0.0f, i1.z, i2.z, 1.0f)) + + i.y + float4(0.0f, i1.y, i2.y, 1.0f)) + + i.x + float4(0.0f, i1.x, i2.x, 1.0f)); -// Gradients: 7x7 points over a square, mapped onto an octahedron. -// The ring size 17*17 = 289 is close to a multiple of 49 (49*6 = 294) - float n_ = 0.142857142857; // 1.0/7.0 + // Gradients: 7x7 points over square, mapped onto octahedron. + // Ring size 17*17 = 289 is close to multiple of 49 (49 * 6 = 294). + float n_ = 0.142857142857f; // 1.0/7.0 float3 ns = n_ * D.wyz - D.xzx; - float4 j = p - 49.0 * floor(p * ns.z * ns.z);// mod(p,7*7) + float4 j = p - 49.0f * floor(p * ns.z * ns.z);// mod(p, 7 * 7) float4 x_ = floor(j * ns.z); - float4 y_ = floor(j - 7.0 * x_ );// mod(j,N) + float4 y_ = floor(j - 7.0f * x_);// mod(j, N) - float4 x = x_ *ns.x + ns.yyyy; - float4 y = y_ *ns.x + ns.yyyy; - float4 h = 1.0 - abs(x) - abs(y); + float4 x = x_ * ns.x + ns.yyyy; + float4 y = y_ * ns.x + ns.yyyy; + float4 h = 1.0f - abs(x) - abs(y); - float4 b0 = float4( x.x, x.y, y.x, y.y ); - float4 b1 = float4( x.z, x.w, y.z, y.w ); + float4 b0 = float4(x.x, x.y, y.x, y.y); + float4 b1 = float4(x.z, x.w, y.z, y.w); //float4 s0 = float4(lessThan(b0,0.0))*2.0 - 1.0; //float4 s1 = float4(lessThan(b1,0.0))*2.0 - 1.0; - float4 s0 = floor(b0)*2.0 + 1.0; - float4 s1 = floor(b1)*2.0 + 1.0; - float4 sh = -step(h, float4(0.0f,0.0f,0.0f,0.0f)); + float4 s0 = floor(b0) * 2.0 + 1.0; + float4 s1 = floor(b1) * 2.0 + 1.0; + float4 sh = -step(h, float4(0.0f, 0.0f, 0.0f, 0.0f)); - float4 a0 = b0.xzyw + s0.xzyw*sh.xxyy; - float4 a1 = b1.xzyw + s1.xzyw*sh.zzww; + float4 a0 = b0.xzyw + s0.xzyw * sh.xxyy; + float4 a1 = b1.xzyw + s1.xzyw * sh.zzww; - float3 p0 = float3(a0.xy,h.x); - float3 p1 = float3(a0.zw,h.y); - float3 p2 = float3(a1.xy,h.z); - float3 p3 = float3(a1.zw,h.w); + float3 p0 = float3(a0.xy, h.x); + float3 p1 = float3(a0.zw, h.y); + float3 p2 = float3(a1.xy, h.z); + float3 p3 = float3(a1.zw, h.w); -//Normalise gradients - float4 norm = TaylorInvSqrt(float4(dot(p0,p0), dot(p1,p1), dot(p2, p2), dot(p3,p3))); + // Normalize gradients. + float4 norm = TaylorInvSqrt(float4(dot(p0, p0), dot(p1, p1), dot(p2, p2), dot(p3, p3))); p0 *= norm.x; p1 *= norm.y; p2 *= norm.z; p3 *= norm.w; -// Mix final noise value - float4 m = max(0.5 - float4(dot(x0,x0), dot(x1,x1), dot(x2,x2), dot(x3,x3)), 0.0); + // Mix final noise value. + float4 m = max(0.5 - float4(dot(x0, x0), dot(x1, x1), dot(x2, x2), dot(x3, x3)), 0.0); m = m * m; - return 105.0 * dot( m*m, float4( dot(p0,x0), dot(p1,x1), - dot(p2,x2), dot(p3,x3) ) ); + + return 105.0 * dot(m*m, float4(dot(p0, x0), dot(p1, x1), dot(p2, x2), dot(p3, x3))); +} + +float2 Gradient2D(float2 p) +{ + float angle = 2 * 3.14159265359f * frac(sin(dot(p, float2(12.9898f, 78.233f))) * 43758.5453f); + return normalize(float2(cos(angle), sin(angle))); +} + +float NebularNoise(float2 uv, float frequency, float amplitude, float persistence) +{ + float noiseValue = 0.0f; + float scale = 1.0f; + float range = 1.0f; + float2 p = uv * frequency; + + float2 floorP = floor(p); + float2 fracP = frac(p); + float4 v = float4(0.0f, 1.0f, 0.0f, 1.0f); + + float2 bl = floorP; + float2 br = bl + float2(1.0f, 0.0f); + float2 tl = bl + float2(0.0f, 1.0f); + float2 tr = bl + float2(1.0f, 1.0f); + + float2 v1 = fracP; + float2 v2 = v1 - float2(1.0f, 0.0f); + float2 v3 = v1 - float2(0.0f, 1.0f); + float2 v4 = v1 - float2(1.0f, 1.0f); + + float dot1 = dot(Gradient2D(bl), v1); + float dot2 = dot(Gradient2D(br), v2); + float dot3 = dot(Gradient2D(tl), v3); + float dot4 = dot(Gradient2D(tr), v4); + + float u = smoothstep(0.0f, 1.0f, v1.x); + float2 a = lerp(float2(dot1, dot3), float2(dot2, dot4), u); + + float k = smoothstep(0.0f, 1.0f, v1.y); + float b = lerp(a.x, a.y, k); + + noiseValue += b * scale / range; + + range += amplitude; + scale *= persistence; + p *= 2.0f; + + return noiseValue; +} + +float Noise(float2 p) +{ + return frac(sin(dot(p, float2(12.9898f, 78.233f))) * 43758.5453f); +} + +float PerlinNoise(float2 p) +{ + float2 i = floor(p); + float2 f = frac(p); + + float a = Noise(i); + float b = Noise(i + float2(1.0f, 0.0f)); + float c = Noise(i + float2(0.0f, 1.0f)); + float d = Noise(i + float2(1.0, 1.0f)); + + float2 u = f * f * (3.0f - 2.0f * f); + + return lerp(lerp(a, b, u.x), lerp(c, d, u.x), u.y); +} + +float4 AnimatedNebula(float2 uv, float time) +{ + // Scale UV coordinates. + float2 scaledUV = uv; + + // Apply horizontal mirroring. + scaledUV.y = abs(scaledUV.y); + + // Generate noise value using Perlin noise. + float noiseValue = PerlinNoise(scaledUV.xy + time); + + // Apply turbulence to noise value. + float turbulence = noiseValue * 0.9; + float2 distortedUV = scaledUV + turbulence; + + // Interpolate between two main colors based on distorted UV coordinates. + float4 color1 = float4(0.2f, 0.4f, 0.8f, 0.0f); + float4 color2 = float4(0.6f, 0.1f, 0.5f, 0.0f); + float4 interpolatedColor = lerp(color1, color2, saturate(distortedUV.y)); + + // Add some brightness flickering based on noise value. + interpolatedColor *= 1.0f + noiseValue * 1.3f; + return interpolatedColor; +} + +float RandomValue(float2 input) +{ + return frac(sin(dot(input, float2(12.9898, 78.233))) * 43758.5453123); +} + +float Noise2D(float2 input) +{ + float2 i = floor(input); + float2 f = frac(input); + + // Four corners in 2D of a tile + float a = RandomValue(i); + float b = RandomValue(i + float2(1.0, 0.0)); + float c = RandomValue(i + float2(0.0, 1.0)); + float d = RandomValue(i + float2(1.0, 1.0)); + + float2 u = f * f * (3.0 - 2.0 * f); + + return lerp(a, b, u.x) + + (c - a) * u.y * (1.0 - u.x) + + (d - b) * u.x * u.y; +} + +float FractalNoise(float2 input) +{ + float value = 0.0; + float amplitude = .5; + float frequency = 0.; + + // Octave loop. + for (int i = 0; i < OCTAVES; i++) + { + value += amplitude * Noise2D(input); + input *= 2.0; + amplitude *= 0.5; + } + + return value; } float3 NormalNoise(float3 v, float3 i, float3 n) { -//the resulting vector + // Resulting vector. float3 r = float3(.0f,.0f,.0f); -//interpolates lerp(v,i,dot(n,i)) -//v, which is the reference of the pixel and -//i, a vector perturbed with SimpleNoise -//the threshold dot(n,i) is based on a dot product between -//n, the normal and each tuple from it (xy, xz and yz) -//and the same for the vector from the noise + // Interpolates lerp(v,i,dot(n,i)) + //v, which is the reference of the pixel and + //i, a vector perturbed with SimpleNoise + //the threshold dot(n,i) is based on a dot product between + //n, the normal and each tuple from it (xy, xz and yz) + //and the same for the vector from the noise r.x = lerp(v.x, i.x, dot(n.xy,i.xy))*.9f; r.y = lerp(v.y, i.y, dot(n.xz,i.xz))*.75f; r.z = lerp(v.z, i.z, dot(n.yz,i.yz))*.8f; -//c, is a threshold based on the tuples of the reference pixel + // c = threshold based on tuples of reference pixel. float c = dot(v.xy,v.yz); -//returns the perturbed pixel based on the reference pixel -//and the resulting vector, with a threshold c attenuated by 2/5 times - return lerp(v,r,c*.3f); + // Return perturbed pixel based on reference pixel and resulting vector with threshold c attenuated by 2/5 times. + return lerp(v, r, c * 0.3f); } #endif // MATH diff --git a/TombEngine/TombEngine.vcxproj b/TombEngine/TombEngine.vcxproj index 548dafce0..4fc6a54e6 100644 --- a/TombEngine/TombEngine.vcxproj +++ b/TombEngine/TombEngine.vcxproj @@ -462,6 +462,7 @@ CALL gen.bat + @@ -889,6 +890,7 @@ CALL gen.bat + From 77fd785e1041190a4668dfa285abddd017252c1a Mon Sep 17 00:00:00 2001 From: Kubsy Date: Thu, 18 May 2023 16:57:15 +0100 Subject: [PATCH 6/9] Update Changes.txt --- Documentation/Changes.txt | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Documentation/Changes.txt b/Documentation/Changes.txt index b8274309c..910b2cc45 100644 --- a/Documentation/Changes.txt +++ b/Documentation/Changes.txt @@ -14,6 +14,11 @@ Version 1.0.9 * Add TR1 cowboy. * Add TR3 wall mounted blade. * Add TR3 claw mutant. +* Add TR5 lasers + - Choose colour for the lasers via tint menu. + - Laser OCB means width of the laser. + - Negative OCB laser will trigger heavy trigger. + - Positive OCB kills lara. * Add removable puzzles from puzzle holes and puzzle dones. - Employed by setting the trigger type as "Switch" for either puzzle hole or puzzle done. - Can be mixed with puzzle done and puzzle holes of the same or different type. From cdd0abbc3cd86bc6087d701d047332b3c3105d49 Mon Sep 17 00:00:00 2001 From: Kubsy Date: Thu, 18 May 2023 22:17:41 +0100 Subject: [PATCH 7/9] Update Changes.txt --- Documentation/Changes.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Documentation/Changes.txt b/Documentation/Changes.txt index 910b2cc45..402a76a3f 100644 --- a/Documentation/Changes.txt +++ b/Documentation/Changes.txt @@ -16,7 +16,7 @@ Version 1.0.9 * Add TR3 claw mutant. * Add TR5 lasers - Choose colour for the lasers via tint menu. - - Laser OCB means width of the laser. + - Laser OCB means width of the laser in sectors. - Negative OCB laser will trigger heavy trigger. - Positive OCB kills lara. * Add removable puzzles from puzzle holes and puzzle dones. From d4257891637db39cd5b90372c99518e092c21832 Mon Sep 17 00:00:00 2001 From: Lwmte <3331699+Lwmte@users.noreply.github.com> Date: Fri, 19 May 2023 03:06:47 +0200 Subject: [PATCH 8/9] Turn on thumbstick camera and vibration when defaulting to XInput device --- TombEngine/Specific/Input/Input.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/TombEngine/Specific/Input/Input.cpp b/TombEngine/Specific/Input/Input.cpp index 0ab8b2dd0..33a24c7b6 100644 --- a/TombEngine/Specific/Input/Input.cpp +++ b/TombEngine/Specific/Input/Input.cpp @@ -784,6 +784,9 @@ namespace TEN::Input for (int i = 0; i < KEY_COUNT; i++) g_Configuration.KeyboardLayout[i] = KeyboardLayout[1][i]; + // Additionally turn on thumbstick camera and vibration. + g_Configuration.EnableRumble = g_Configuration.EnableThumbstickCameraControl = true; + return true; } else From f20424579993999ae71f401b3b39cc0fc75990b5 Mon Sep 17 00:00:00 2001 From: Lwmte <3331699+Lwmte@users.noreply.github.com> Date: Fri, 19 May 2023 03:10:29 +0200 Subject: [PATCH 9/9] Update Changes.txt --- Documentation/Changes.txt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Documentation/Changes.txt b/Documentation/Changes.txt index 402a76a3f..c0a96b175 100644 --- a/Documentation/Changes.txt +++ b/Documentation/Changes.txt @@ -18,7 +18,7 @@ Version 1.0.9 - Choose colour for the lasers via tint menu. - Laser OCB means width of the laser in sectors. - Negative OCB laser will trigger heavy trigger. - - Positive OCB kills lara. + - Positive OCB kills Lara. * Add removable puzzles from puzzle holes and puzzle dones. - Employed by setting the trigger type as "Switch" for either puzzle hole or puzzle done. - Can be mixed with puzzle done and puzzle holes of the same or different type. @@ -33,8 +33,8 @@ Version 1.0.9 * Add "Reset to defaults" entry to controls menu and automatically bind XBOX gamepad profile if connected. Lua API changes: -* Add class Vec2 -* Add function String::SetTranslated() +* Add Vec2 class. +* Add function String::SetTranslated() * Add function Misc::IsStringDisplaying() * Add the following for use in AddCallback and RemoveCallback: - PRESTART, POSTSTART