diff --git a/Documentation/Changes.txt b/Documentation/Changes.txt index b8274309c..c0a96b175 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 in sectors. + - 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. @@ -28,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 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_fire.cpp b/TombEngine/Game/Lara/lara_fire.cpp index d14c9a114..018a03702 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. @@ -337,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; } } @@ -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_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 693ecef3d..e1fc79b76 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 // ---- @@ -682,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_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_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_struct.h b/TombEngine/Game/Lara/lara_struct.h index 306ef53c2..dda0b72c2 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 @@ -1307,6 +1300,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 +1314,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. 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/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/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/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/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 16a4995a2..e74396a06 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 { @@ -113,22 +99,18 @@ 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); -#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); } @@ -165,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; @@ -262,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 f90f297a2..89adc9631 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)) { @@ -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 7a33cb91c..5e496cf13 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; } @@ -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 23eeefcef..8c385760c 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)) { @@ -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/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/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/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/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 edf16cd82..e4eca8867 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 26d155bd2..e41bc524c 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/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/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/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 d04617f43..4a4873ea0 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 e6960d412..e027998b9 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/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/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 82126b3c4..9f242a989 100644 Binary files a/TombEngine/Resources.aps and b/TombEngine/Resources.aps differ 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); } 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/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 diff --git a/TombEngine/TombEngine.vcxproj b/TombEngine/TombEngine.vcxproj index a741272ae..ffafe180a 100644 --- a/TombEngine/TombEngine.vcxproj +++ b/TombEngine/TombEngine.vcxproj @@ -593,6 +593,7 @@ CALL gen.bat + @@ -1022,6 +1023,7 @@ CALL gen.bat +