From ef751cf236b98fdf4d890690f8150431c441ae08 Mon Sep 17 00:00:00 2001 From: Lwmte <3331699+Lwmte@users.noreply.github.com> Date: Sat, 28 Sep 2024 17:29:27 +0200 Subject: [PATCH 1/9] Fixed #1405 --- CHANGELOG.md | 1 + TombEngine/Objects/TR4/Object/tr4_sarcophagus.cpp | 2 +- TombEngine/Specific/level.cpp | 3 ++- 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3c3edef1f..3c5063fc0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,7 @@ TombEngine releases are located in this repository (alongside with Tomb Editor): ### Bug fixes * Fixed original issue with classic switch off trigger incorrectly activating some trigger actions. * Fixed leveljump vehicle transfer. +* Fixed sarcophagus pick-ups. * Fixed incorrect diving animation when swandiving from a high place. * Fixed camera rotating with the player's hips when climbing out of water. * Fixed AI for TR2 skidoo driver and worker with shotgun. diff --git a/TombEngine/Objects/TR4/Object/tr4_sarcophagus.cpp b/TombEngine/Objects/TR4/Object/tr4_sarcophagus.cpp index ba8071532..d9553cfe5 100644 --- a/TombEngine/Objects/TR4/Object/tr4_sarcophagus.cpp +++ b/TombEngine/Objects/TR4/Object/tr4_sarcophagus.cpp @@ -73,6 +73,6 @@ void SarcophagusCollision(short itemNumber, ItemInfo* laraItem, CollisionInfo* c } else { - CollectMultiplePickups(sarcItem->Index); + CollectCarriedItems(sarcItem); } } diff --git a/TombEngine/Specific/level.cpp b/TombEngine/Specific/level.cpp index a48f820e2..2d7388c6e 100644 --- a/TombEngine/Specific/level.cpp +++ b/TombEngine/Specific/level.cpp @@ -1471,7 +1471,8 @@ void GetCarriedItems() const auto& object = Objects[item.ObjectNumber]; if (object.intelligent || - (item.ObjectNumber >= ID_SEARCH_OBJECT1 && item.ObjectNumber <= ID_SEARCH_OBJECT3)) + (item.ObjectNumber >= ID_SEARCH_OBJECT1 && item.ObjectNumber <= ID_SEARCH_OBJECT3) || + (item.ObjectNumber == ID_SARCOPHAGUS)) { for (short linkNumber = g_Level.Rooms[item.RoomNumber].itemNumber; linkNumber != NO_VALUE; linkNumber = g_Level.Items[linkNumber].NextItem) { From 3a0e703d1d9811d2f103691195f9a0fd5630f8e5 Mon Sep 17 00:00:00 2001 From: Lwmte <3331699+Lwmte@users.noreply.github.com> Date: Sat, 28 Sep 2024 18:45:34 +0200 Subject: [PATCH 2/9] Fix Lara meshswaps after kayak dismount after leveljump --- TombEngine/Game/Lara/lara_initialise.cpp | 2 +- TombEngine/Objects/TR3/Vehicles/kayak.cpp | 20 +++++++------------- TombEngine/Objects/TR3/Vehicles/kayak.h | 5 +++-- 3 files changed, 11 insertions(+), 16 deletions(-) diff --git a/TombEngine/Game/Lara/lara_initialise.cpp b/TombEngine/Game/Lara/lara_initialise.cpp index 89e8451bc..937b31fa4 100644 --- a/TombEngine/Game/Lara/lara_initialise.cpp +++ b/TombEngine/Game/Lara/lara_initialise.cpp @@ -200,7 +200,7 @@ static void InitializePlayerVehicle(ItemInfo& playerItem) { case GAME_OBJECT_ID::ID_KAYAK: InitializeKayak(vehicle->Index); - KayakPaddleTake(&playerItem); + KayakPaddleTake(GetKayakInfo(&g_Level.Items[vehicle->Index]), &playerItem); break; case GAME_OBJECT_ID::ID_MOTORBIKE: diff --git a/TombEngine/Objects/TR3/Vehicles/kayak.cpp b/TombEngine/Objects/TR3/Vehicles/kayak.cpp index 4fd265d16..e66e1c11d 100644 --- a/TombEngine/Objects/TR3/Vehicles/kayak.cpp +++ b/TombEngine/Objects/TR3/Vehicles/kayak.cpp @@ -221,14 +221,16 @@ namespace TEN::Entities::Vehicles // SetupRipple(x, kayakItem->Pose.Position.y, z, -2 - (GetRandomControl() & 1), 0, Objects[ID_KAYAK_PADDLE_TRAIL_SPRITE].meshIndex,TO_RAD(kayakItem->Pose.Orientation.y)); } - void KayakPaddleTake(ItemInfo* laraItem) + void KayakPaddleTake(KayakInfo* kayak, ItemInfo* laraItem) { + kayak->Flags |= KAYAK_FLAG_PADDLE_MESH; laraItem->Model.MeshIndex[LM_RHAND] = Objects[ID_KAYAK_LARA_ANIMS].meshIndex + LM_RHAND; laraItem->MeshBits.Clear(KayakLaraLegJoints); } - void KayakPaddlePut(ItemInfo* laraItem) + void KayakPaddlePut(KayakInfo* kayak, ItemInfo* laraItem) { + kayak->Flags &= ~KAYAK_FLAG_PADDLE_MESH; laraItem->Model.MeshIndex[LM_RHAND] = laraItem->Model.BaseMesh + LM_RHAND; laraItem->MeshBits.Set(KayakLaraLegJoints); } @@ -910,21 +912,13 @@ namespace TEN::Entities::Vehicles case KAYAK_STATE_MOUNT_LEFT: if (TestAnimNumber(*laraItem, KAYAK_ANIM_GET_PADDLE) && frame == 24 && !(kayak->Flags & KAYAK_FLAG_PADDLE_MESH)) - { - kayak->Flags |= KAYAK_FLAG_PADDLE_MESH; - KayakPaddleTake(laraItem); - } - + KayakPaddleTake(kayak, laraItem); break; case KAYAK_STATE_DISMOUNT: - if (TestAnimNumber(*laraItem, KAYAK_ANIM_DISMOUNT_START) && frame == 27 && kayak->Flags & KAYAK_FLAG_PADDLE_MESH) - { - kayak->Flags &= ~KAYAK_FLAG_PADDLE_MESH; - KayakPaddlePut(laraItem); - } - laraItem->Animation.TargetState = laraItem->Animation.RequiredState; + if (TestAnimNumber(*laraItem, KAYAK_ANIM_DISMOUNT_START) && frame == 27 && kayak->Flags & KAYAK_FLAG_PADDLE_MESH) + KayakPaddlePut(kayak, laraItem); break; case KAYAK_STATE_DISMOUNT_LEFT: diff --git a/TombEngine/Objects/TR3/Vehicles/kayak.h b/TombEngine/Objects/TR3/Vehicles/kayak.h index 2d00aa1c4..db7aec2b6 100644 --- a/TombEngine/Objects/TR3/Vehicles/kayak.h +++ b/TombEngine/Objects/TR3/Vehicles/kayak.h @@ -6,13 +6,14 @@ struct ItemInfo; namespace TEN::Entities::Vehicles { + KayakInfo* GetKayakInfo(ItemInfo* kayakItem); void InitializeKayak(short itemNumber); void KayakPlayerCollision(short itemNumber, ItemInfo* laraItem, CollisionInfo* coll); void DoKayakMount(ItemInfo* kayakItem, ItemInfo* laraItem, VehicleMountType mountType); - void KayakPaddleTake(ItemInfo* laraItem); - void KayakPaddlePut(ItemInfo* laraItem); + void KayakPaddleTake(KayakInfo* kayak, ItemInfo* laraItem); + void KayakPaddlePut(KayakInfo* kayak, ItemInfo* laraItem); void KayakDraw(ItemInfo* kayakItem); From ca87efa4fd14c8b4ff1f8292ee33de35034f372d Mon Sep 17 00:00:00 2001 From: Lwmte <3331699+Lwmte@users.noreply.github.com> Date: Sat, 28 Sep 2024 18:59:09 +0200 Subject: [PATCH 3/9] Possibly fix minecart wrench --- TombEngine/Game/Lara/lara_initialise.cpp | 3 ++- TombEngine/Objects/TR3/Vehicles/minecart.cpp | 18 ++++++++++++++---- TombEngine/Objects/TR3/Vehicles/minecart.h | 4 ++++ 3 files changed, 20 insertions(+), 5 deletions(-) diff --git a/TombEngine/Game/Lara/lara_initialise.cpp b/TombEngine/Game/Lara/lara_initialise.cpp index 937b31fa4..e2da15df7 100644 --- a/TombEngine/Game/Lara/lara_initialise.cpp +++ b/TombEngine/Game/Lara/lara_initialise.cpp @@ -14,6 +14,7 @@ #include "Game/Setup.h" #include "Objects/TR2/Vehicles/skidoo.h" #include "Objects/TR3/Vehicles/kayak.h" +#include "Objects/TR3/Vehicles/minecart.h" #include "Objects/TR3/Vehicles/quad_bike.h" #include "Objects/TR4/Vehicles/jeep.h" #include "Objects/TR4/Vehicles/motorbike.h" @@ -220,7 +221,7 @@ static void InitializePlayerVehicle(ItemInfo& playerItem) break; case GAME_OBJECT_ID::ID_MINECART: - playerItem.Model.MeshIndex[LM_RHAND] = Objects[ID_MINECART_LARA_ANIMS].meshIndex + LM_RHAND; + MinecartWrenchTake(GetMinecartInfo(&g_Level.Items[vehicle->Index]), &playerItem); break; default: diff --git a/TombEngine/Objects/TR3/Vehicles/minecart.cpp b/TombEngine/Objects/TR3/Vehicles/minecart.cpp index c0d4e8e88..5fc83591b 100644 --- a/TombEngine/Objects/TR3/Vehicles/minecart.cpp +++ b/TombEngine/Objects/TR3/Vehicles/minecart.cpp @@ -241,6 +241,18 @@ namespace TEN::Entities::Vehicles } } + void MinecartWrenchTake(MinecartInfo* minecart, ItemInfo* laraItem) + { + laraItem->Model.MeshIndex[LM_RHAND] = Objects[ID_MINECART_LARA_ANIMS].meshIndex + LM_RHAND; + minecart->Flags |= MINECART_FLAG_WRENCH_MESH; + } + + void MinecartWrenchPut(MinecartInfo* minecart, ItemInfo* laraItem) + { + laraItem->Model.MeshIndex[LM_RHAND] = laraItem->Model.BaseMesh + LM_RHAND; + minecart->Flags &= ~MINECART_FLAG_WRENCH_MESH; + } + static int GetMinecartCollision(ItemInfo* minecartItem, short angle, int distance) { auto probe = GetPointCollision(*minecartItem, angle, distance, -LARA_HEIGHT); @@ -755,8 +767,7 @@ namespace TEN::Entities::Vehicles if (laraItem->Animation.FrameNumber == GetFrameIndex(minecartItem, MINECART_WRENCH_MESH_TOGGLE_FRAME) && minecart->Flags & MINECART_FLAG_WRENCH_MESH) { - laraItem->Model.MeshIndex[LM_RHAND] = laraItem->Model.BaseMesh + LM_RHAND; - minecart->Flags &= ~MINECART_FLAG_WRENCH_MESH; + MinecartWrenchPut(minecart, laraItem); } if (minecart->Flags & MINECART_FLAG_DISMOUNT_RIGHT) @@ -804,8 +815,7 @@ namespace TEN::Entities::Vehicles if (!(minecart->Flags & MINECART_FLAG_WRENCH_MESH) && laraItem->Animation.FrameNumber == GetFrameIndex(minecartItem, MINECART_WRENCH_MESH_TOGGLE_FRAME)) { - laraItem->Model.MeshIndex[LM_RHAND] = Objects[ID_MINECART_LARA_ANIMS].meshIndex + LM_RHAND; - minecart->Flags |= MINECART_FLAG_WRENCH_MESH; + MinecartWrenchTake(minecart, laraItem); } } diff --git a/TombEngine/Objects/TR3/Vehicles/minecart.h b/TombEngine/Objects/TR3/Vehicles/minecart.h index e5677b172..4fcfea6f6 100644 --- a/TombEngine/Objects/TR3/Vehicles/minecart.h +++ b/TombEngine/Objects/TR3/Vehicles/minecart.h @@ -7,9 +7,13 @@ struct ItemInfo; namespace TEN::Entities::Vehicles { void InitializeMinecart(short itemNumber); + MinecartInfo* GetMinecartInfo(ItemInfo* minecartItem); void MinecartPlayerCollision(short itemNumber, ItemInfo* laraItem, CollisionInfo* coll); void DoMinecartMount(ItemInfo* minecartItem, ItemInfo* laraItem, VehicleMountType mountType); bool MinecartControl(ItemInfo* laraItem); + + void MinecartWrenchTake(MinecartInfo* minecart, ItemInfo* laraItem); + void MinecartWrenchPut(MinecartInfo* minecart, ItemInfo* laraItem); } From 5f7ac065d140886db5415549b0d479f9292a1e7f Mon Sep 17 00:00:00 2001 From: Lwmte <3331699+Lwmte@users.noreply.github.com> Date: Mon, 30 Sep 2024 11:42:50 +0200 Subject: [PATCH 4/9] Show relative anim number in stats --- TombEngine/Renderer/RendererDrawMenu.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/TombEngine/Renderer/RendererDrawMenu.cpp b/TombEngine/Renderer/RendererDrawMenu.cpp index 5cf475445..c84adc37b 100644 --- a/TombEngine/Renderer/RendererDrawMenu.cpp +++ b/TombEngine/Renderer/RendererDrawMenu.cpp @@ -1260,7 +1260,7 @@ namespace TEN::Renderer case RendererDebugPage::PlayerStats: PrintDebugMessage("PLAYER STATS"); PrintDebugMessage("AnimObjectID: %d", LaraItem->Animation.AnimObjectID); - PrintDebugMessage("AnimNumber: %d", LaraItem->Animation.AnimNumber); + PrintDebugMessage("AnimNumber: %d", LaraItem->Animation.AnimNumber - Objects[LaraItem->Animation.AnimObjectID].animIndex); PrintDebugMessage("FrameNumber: %d", LaraItem->Animation.FrameNumber); PrintDebugMessage("ActiveState: %d", LaraItem->Animation.ActiveState); PrintDebugMessage("TargetState: %d", LaraItem->Animation.TargetState); From bc6bf2c5a4b0dfab70a75c22317367e6763ab6cd Mon Sep 17 00:00:00 2001 From: Lwmte <3331699+Lwmte@users.noreply.github.com> Date: Mon, 30 Sep 2024 11:44:09 +0200 Subject: [PATCH 5/9] Fix speedboat / rubber boat on leveljumps --- TombEngine/Game/Lara/lara_initialise.cpp | 22 ++++++++++++++++++++++ TombEngine/Renderer/RendererLara.cpp | 3 +++ 2 files changed, 25 insertions(+) diff --git a/TombEngine/Game/Lara/lara_initialise.cpp b/TombEngine/Game/Lara/lara_initialise.cpp index e2da15df7..2dc6cdc7d 100644 --- a/TombEngine/Game/Lara/lara_initialise.cpp +++ b/TombEngine/Game/Lara/lara_initialise.cpp @@ -13,9 +13,11 @@ #include "Game/Lara/PlayerStateMachine.h" #include "Game/Setup.h" #include "Objects/TR2/Vehicles/skidoo.h" +#include "Objects/TR2/Vehicles/speedboat.h" #include "Objects/TR3/Vehicles/kayak.h" #include "Objects/TR3/Vehicles/minecart.h" #include "Objects/TR3/Vehicles/quad_bike.h" +#include "Objects/TR3/Vehicles/rubber_boat.h" #include "Objects/TR4/Vehicles/jeep.h" #include "Objects/TR4/Vehicles/motorbike.h" #include "Specific/level.h" @@ -224,9 +226,29 @@ static void InitializePlayerVehicle(ItemInfo& playerItem) MinecartWrenchTake(GetMinecartInfo(&g_Level.Items[vehicle->Index]), &playerItem); break; + case GAME_OBJECT_ID::ID_SPEEDBOAT: + InitializeSpeedboat(vehicle->Index); + DoSpeedboatMount(&g_Level.Items[vehicle->Index], &playerItem, VehicleMountType::LevelStart); + break; + + case GAME_OBJECT_ID::ID_RUBBER_BOAT: + InitializeRubberBoat(vehicle->Index); + DoRubberBoatMount(&g_Level.Items[vehicle->Index], &playerItem, VehicleMountType::LevelStart); + break; + default: break; } + + // HACK: Reset activity status because boats need to be on active item linked list. + + if (vehicle->ObjectNumber == GAME_OBJECT_ID::ID_RUBBER_BOAT || + vehicle->ObjectNumber == GAME_OBJECT_ID::ID_SPEEDBOAT) + { + g_Level.Items[vehicle->Index].Active = false; + AddActiveItem(vehicle->Index); + g_Level.Items[vehicle->Index].Status = ITEM_ACTIVE; + } } void InitializeLaraLevelJump(ItemInfo* item, LaraInfo* playerBackup) diff --git a/TombEngine/Renderer/RendererLara.cpp b/TombEngine/Renderer/RendererLara.cpp index e72079083..33acdbcfa 100644 --- a/TombEngine/Renderer/RendererLara.cpp +++ b/TombEngine/Renderer/RendererLara.cpp @@ -85,6 +85,9 @@ void Renderer::UpdateLaraAnimations(bool force) if (!force && rItem.DoneAnimations) return; + if (_moveableObjects.empty()) + return; + auto& playerObject = *_moveableObjects[ID_LARA]; // Clear extra rotations. From 78485fd3ec4bb514ecf28b958257f80621b85d33 Mon Sep 17 00:00:00 2001 From: Lwmte <3331699+Lwmte@users.noreply.github.com> Date: Mon, 30 Sep 2024 17:11:59 +0200 Subject: [PATCH 6/9] Fixed UPV transfer on leveljump --- TombEngine/Game/Lara/lara_initialise.cpp | 6 ++++++ TombEngine/Objects/TR3/Vehicles/upv.cpp | 10 +--------- TombEngine/Objects/TR3/Vehicles/upv.h | 11 ++++++++++- TombEngine/Objects/TR3/tr3_objects.cpp | 2 +- 4 files changed, 18 insertions(+), 11 deletions(-) diff --git a/TombEngine/Game/Lara/lara_initialise.cpp b/TombEngine/Game/Lara/lara_initialise.cpp index 2dc6cdc7d..736a07eec 100644 --- a/TombEngine/Game/Lara/lara_initialise.cpp +++ b/TombEngine/Game/Lara/lara_initialise.cpp @@ -18,6 +18,7 @@ #include "Objects/TR3/Vehicles/minecart.h" #include "Objects/TR3/Vehicles/quad_bike.h" #include "Objects/TR3/Vehicles/rubber_boat.h" +#include "Objects/TR3/Vehicles/upv.h" #include "Objects/TR4/Vehicles/jeep.h" #include "Objects/TR4/Vehicles/motorbike.h" #include "Specific/level.h" @@ -236,6 +237,11 @@ static void InitializePlayerVehicle(ItemInfo& playerItem) DoRubberBoatMount(&g_Level.Items[vehicle->Index], &playerItem, VehicleMountType::LevelStart); break; + case GAME_OBJECT_ID::ID_UPV: + DoUPVMount(&g_Level.Items[vehicle->Index], &playerItem, VehicleMountType::LevelStart); + GetUPVInfo(&g_Level.Items[vehicle->Index])->Flags = UPVFlags::UPV_FLAG_CONTROL; + break; + default: break; } diff --git a/TombEngine/Objects/TR3/Vehicles/upv.cpp b/TombEngine/Objects/TR3/Vehicles/upv.cpp index d80b3c98b..60ea75f8a 100644 --- a/TombEngine/Objects/TR3/Vehicles/upv.cpp +++ b/TombEngine/Objects/TR3/Vehicles/upv.cpp @@ -151,21 +151,13 @@ namespace TEN::Entities::Vehicles UPV_BITE_RIGHT_RUDDER_RIGHT = 4, UPV_BITE_RIGHT_RUDDER_LEFT = 5 // Unused. }; - enum UPVFlags - { - UPV_FLAG_CONTROL = (1 << 0), - UPV_FLAG_SURFACE = (1 << 1), - UPV_FLAG_DIVE = (1 << 2), - UPV_FLAG_DEAD = (1 << 3) - }; - UPVInfo* GetUPVInfo(ItemInfo* UPVItem) { return (UPVInfo*)UPVItem->Data; } - void UPVInitialize(short itemNumber) + void InitializeUPV(short itemNumber) { auto* UPVItem = &g_Level.Items[itemNumber]; UPVItem->Data = UPVInfo(); diff --git a/TombEngine/Objects/TR3/Vehicles/upv.h b/TombEngine/Objects/TR3/Vehicles/upv.h index dec8f642a..897acd302 100644 --- a/TombEngine/Objects/TR3/Vehicles/upv.h +++ b/TombEngine/Objects/TR3/Vehicles/upv.h @@ -6,7 +6,16 @@ struct ItemInfo; namespace TEN::Entities::Vehicles { - void UPVInitialize(short itemNumber); + enum UPVFlags + { + UPV_FLAG_CONTROL = (1 << 0), + UPV_FLAG_SURFACE = (1 << 1), + UPV_FLAG_DIVE = (1 << 2), + UPV_FLAG_DEAD = (1 << 3) + }; + + void InitializeUPV(short itemNumber); + UPVInfo* GetUPVInfo(ItemInfo* UPVItem); void UPVPlayerCollision(short itemNumber, ItemInfo* laraItem, CollisionInfo* coll); void DoUPVMount(ItemInfo* UPVItem, ItemInfo* laraItem, VehicleMountType mountType); diff --git a/TombEngine/Objects/TR3/tr3_objects.cpp b/TombEngine/Objects/TR3/tr3_objects.cpp index f5909af7d..950c4fb7d 100644 --- a/TombEngine/Objects/TR3/tr3_objects.cpp +++ b/TombEngine/Objects/TR3/tr3_objects.cpp @@ -583,7 +583,7 @@ static void StartVehicles(ObjectInfo* obj) obj = &Objects[ID_UPV]; if (obj->loaded) { - obj->Initialize = UPVInitialize; + obj->Initialize = InitializeUPV; obj->control = UPVEffects; obj->collision = UPVPlayerCollision; obj->shadowType = ShadowMode::Lara; From 1e6c2158eaabfd5f26c72883b2a2d3b13517f415 Mon Sep 17 00:00:00 2001 From: Lwmte <3331699+Lwmte@users.noreply.github.com> Date: Wed, 2 Oct 2024 00:16:26 +0200 Subject: [PATCH 7/9] Add IsStringPresent script function for further usage in nodes --- CHANGELOG.md | 14 +++++++------- .../Scripting/Internal/ReservedScriptNames.h | 1 + .../Scripting/Internal/TEN/Flow/FlowHandler.cpp | 11 +++++++++++ .../Scripting/Internal/TEN/Flow/FlowHandler.h | 1 + 4 files changed, 20 insertions(+), 7 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3c5063fc0..dd12efb5d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,6 @@ # Changelog -Here you will find the full changelog of TEN's releases from Version 1.0 and up +Here you will find the full changelog of TEN's releases from Version 1.0 and up The dates are in European standard format where date is presented as **YYYY-MM-DD** @@ -57,14 +57,14 @@ TombEngine releases are located in this repository (alongside with Tomb Editor): ### Lua API changes -* Added Flow.EnableHomeLevel() -* Added Flow.LensFlare() -* Added Flow.Starfield() +* Added Flow.EnableHomeLevel() function. +* Added Flow.IsStringPresent() function. * Added Inventory.GetUsedItem(), Inventory.SetUsedItem() and Inventory.ClearUsedItem() functions. -* Added Input.KeyClearAll() -* Added Room:GetRoomNumber() +* Added Flow.LensFlare() and Flow.Starfield() classes. +* Added Input.KeyClearAll() function. +* Added Room:GetRoomNumber() function. * Removed anims.monkeyAutoJump. It is now a player menu configuration. -* Fixed Volume:GetActive() method +* Fixed Volume:GetActive() method. ## [Version 1.4](https://github.com/TombEngine/TombEditorReleases/releases/tag/v1.7.1) - 2024-04-21 diff --git a/TombEngine/Scripting/Internal/ReservedScriptNames.h b/TombEngine/Scripting/Internal/ReservedScriptNames.h index 7aa0f4afa..4ad0effd9 100644 --- a/TombEngine/Scripting/Internal/ReservedScriptNames.h +++ b/TombEngine/Scripting/Internal/ReservedScriptNames.h @@ -227,6 +227,7 @@ static constexpr char ScriptReserved_EnablePointFilter[] = "EnablePointFilter"; // Flow Functions static constexpr char ScriptReserved_SetStrings[] = "SetStrings"; static constexpr char ScriptReserved_GetString[] = "GetString"; +static constexpr char ScriptReserved_IsStringPresent[] = "IsStringPresent"; static constexpr char ScriptReserved_SetLanguageNames[] = "SetLanguageNames"; // Flow Tables diff --git a/TombEngine/Scripting/Internal/TEN/Flow/FlowHandler.cpp b/TombEngine/Scripting/Internal/TEN/Flow/FlowHandler.cpp index 5aebe1328..1f1c439d2 100644 --- a/TombEngine/Scripting/Internal/TEN/Flow/FlowHandler.cpp +++ b/TombEngine/Scripting/Internal/TEN/Flow/FlowHandler.cpp @@ -248,6 +248,12 @@ You will not need to call them manually. */ tableFlow.set_function(ScriptReserved_GetString, &FlowHandler::GetString, this); +/*** Check if translated string is present. +@function IsStringPresent +@tparam key string key for translated string +*/ + tableFlow.set_function(ScriptReserved_IsStringPresent, &FlowHandler::IsStringPresent, this); + /*** Set language names for translations. Specify which translations in the strings table correspond to which languages. @function SetLanguageNames @@ -371,6 +377,11 @@ char const * FlowHandler::GetString(const char* id) const } } +bool FlowHandler::IsStringPresent(const char* id) const +{ + return _translationMap.find(id) != _translationMap.end(); +} + Settings* FlowHandler::GetSettings() { return &_settings; diff --git a/TombEngine/Scripting/Internal/TEN/Flow/FlowHandler.h b/TombEngine/Scripting/Internal/TEN/Flow/FlowHandler.h index d9bd1ac84..55092b97d 100644 --- a/TombEngine/Scripting/Internal/TEN/Flow/FlowHandler.h +++ b/TombEngine/Scripting/Internal/TEN/Flow/FlowHandler.h @@ -51,6 +51,7 @@ public: void AddLevel(Level const& level); void LoadFlowScript(); char const* GetString(const char* id) const; + bool IsStringPresent(const char* id) const; void SetStrings(sol::nested>>&& src); void SetLanguageNames(sol::as_table_t>&& src); void SetAnimations(const Animations& src); From 9a6dfef47534697a88a1e42d08fa3fadd08fed25 Mon Sep 17 00:00:00 2001 From: Lwmte <3331699+Lwmte@users.noreply.github.com> Date: Thu, 3 Oct 2024 09:14:06 +0200 Subject: [PATCH 8/9] Also show relative frame number in debug --- TombEngine/Renderer/RendererDrawMenu.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/TombEngine/Renderer/RendererDrawMenu.cpp b/TombEngine/Renderer/RendererDrawMenu.cpp index c84adc37b..5ca92cddb 100644 --- a/TombEngine/Renderer/RendererDrawMenu.cpp +++ b/TombEngine/Renderer/RendererDrawMenu.cpp @@ -1261,7 +1261,7 @@ namespace TEN::Renderer PrintDebugMessage("PLAYER STATS"); PrintDebugMessage("AnimObjectID: %d", LaraItem->Animation.AnimObjectID); PrintDebugMessage("AnimNumber: %d", LaraItem->Animation.AnimNumber - Objects[LaraItem->Animation.AnimObjectID].animIndex); - PrintDebugMessage("FrameNumber: %d", LaraItem->Animation.FrameNumber); + PrintDebugMessage("FrameNumber: %d", LaraItem->Animation.FrameNumber - GetAnimData(LaraItem).frameBase); PrintDebugMessage("ActiveState: %d", LaraItem->Animation.ActiveState); PrintDebugMessage("TargetState: %d", LaraItem->Animation.TargetState); PrintDebugMessage("Velocity: %.3f, %.3f, %.3f", LaraItem->Animation.Velocity.z, LaraItem->Animation.Velocity.y, LaraItem->Animation.Velocity.x); From a77d64b69bcf057936d2877a4fec6ae31065a82b Mon Sep 17 00:00:00 2001 From: Lwmte <3331699+Lwmte@users.noreply.github.com> Date: Sat, 5 Oct 2024 00:25:36 +0200 Subject: [PATCH 9/9] Fix binocular bugs --- CHANGELOG.md | 1 + TombEngine/Game/camera.cpp | 18 ++++++++++++++++++ TombEngine/Game/camera.h | 6 ++++-- TombEngine/Game/control/control.cpp | 18 ++---------------- TombEngine/Game/control/control.h | 4 ---- TombEngine/Game/effects/effects.cpp | 12 ++++++++++++ TombEngine/Game/effects/effects.h | 3 +++ .../Objects/TR4/Entity/tr4_beetle_swarm.cpp | 1 + 8 files changed, 41 insertions(+), 22 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index dd12efb5d..87e0f8a6e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,7 @@ TombEngine releases are located in this repository (alongside with Tomb Editor): * Fixed original issue with classic switch off trigger incorrectly activating some trigger actions. * Fixed leveljump vehicle transfer. * Fixed sarcophagus pick-ups. +* Fixed several binocular bugs. * Fixed incorrect diving animation when swandiving from a high place. * Fixed camera rotating with the player's hips when climbing out of water. * Fixed AI for TR2 skidoo driver and worker with shotgun. diff --git a/TombEngine/Game/camera.cpp b/TombEngine/Game/camera.cpp index aaa81edcb..1808a04dc 100644 --- a/TombEngine/Game/camera.cpp +++ b/TombEngine/Game/camera.cpp @@ -952,6 +952,7 @@ void BinocularCamera(ItemInfo* item) player.Inventory.IsBusy = false; Camera.type = BinocularOldCamera; + Camera.target = LastTarget; AlterFOV(LastFOV); return; } @@ -1025,6 +1026,8 @@ void BinocularCamera(ItemInfo* item) if (IsHeld(In::Action)) { + ClearAction(In::Action); + auto origin = Camera.pos.ToVector3i(); auto target = Camera.target.ToVector3i(); LaraTorch(&origin, &target, player.ExtraHeadRot.y, 192); @@ -1518,6 +1521,21 @@ void ItemsCollideCamera() staticList.clear(); } +void UpdateCamera() +{ + if (UseSpotCam) + { + // Draw flyby cameras. + CalculateSpotCameras(); + } + else + { + // Do the standard camera. + TrackCameraInit = false; + CalculateCamera(LaraCollision); + } +} + void UpdateMikePos(const ItemInfo& item) { if (Camera.mikeAtLara) diff --git a/TombEngine/Game/camera.h b/TombEngine/Game/camera.h index 504a59ed4..9a3c02af5 100644 --- a/TombEngine/Game/camera.h +++ b/TombEngine/Game/camera.h @@ -103,16 +103,18 @@ void RumbleScreen(); bool TestBoundsCollideCamera(const GameBoundingBox& bounds, const Pose& pose, short radius); void ItemPushCamera(GameBoundingBox* bounds, Pose* pos, short radius); void ItemsCollideCamera(); +void RefreshFixedCamera(short camNumber); + void ObjCamera(ItemInfo* camSlotId, int camMeshID, ItemInfo* targetItem, int targetMeshID, bool cond); void MoveObjCamera(GameVector* ideal, ItemInfo* camSlotId, int camMeshID, ItemInfo* targetItem, int targetMeshID); -void RefreshFixedCamera(short camNumber); +void ClearObjCamera(); void SetScreenFadeOut(float speed, bool force = false); void SetScreenFadeIn(float speed, bool force = false); void SetCinematicBars(float height, float speed); void ClearCinematicBars(); +void UpdateCamera(); void UpdateFadeScreenAndCinematicBars(); void UpdateMikePos(const ItemInfo& item); -void ClearObjCamera(); float GetParticleDistanceFade(const Vector3i& pos); diff --git a/TombEngine/Game/control/control.cpp b/TombEngine/Game/control/control.cpp index 75e8648d2..e5b63c261 100644 --- a/TombEngine/Game/control/control.cpp +++ b/TombEngine/Game/control/control.cpp @@ -89,7 +89,6 @@ using namespace TEN::Renderer; int GameTimer = 0; int GlobalCounter = 0; -int Wibble = 0; bool InitializeGame; bool DoTheGame; @@ -185,27 +184,13 @@ GameStatus ControlPhase(int numFrames) ApplyActionQueue(); ClearActionQueue(); + UpdateCamera(); UpdateAllItems(); UpdateAllEffects(); UpdateLara(LaraItem, isTitle); g_GameScriptEntities->TestCollidingObjects(); - if (UseSpotCam) - { - // Draw flyby cameras. - CalculateSpotCameras(); - } - else - { - // Do the standard camera. - TrackCameraInit = false; - CalculateCamera(LaraCollision); - } - - // Update oscillator seed. - Wibble = (Wibble + WIBBLE_SPEED) & WIBBLE_MAX; - // Smash shatters and clear stopper flags under them. UpdateShatters(); @@ -213,6 +198,7 @@ GameStatus ControlPhase(int numFrames) Weather.Update(); // Update effects. + UpdateWibble(); StreamerEffect.Update(); UpdateSparks(); UpdateFireSparks(); diff --git a/TombEngine/Game/control/control.h b/TombEngine/Game/control/control.h index 168fd06d7..36778258b 100644 --- a/TombEngine/Game/control/control.h +++ b/TombEngine/Game/control/control.h @@ -50,15 +50,11 @@ enum FadeStatus constexpr int MAX_ROOMS = 1024; -constexpr int WIBBLE_SPEED = 4; -constexpr int WIBBLE_MAX = UCHAR_MAX - WIBBLE_SPEED + 1; - constexpr int LOOP_FRAME_COUNT = 2; extern int GameTimer; extern int RumbleTimer; extern int GlobalCounter; -extern int Wibble; extern bool InitializeGame; extern bool DoTheGame; diff --git a/TombEngine/Game/effects/effects.cpp b/TombEngine/Game/effects/effects.cpp index a2b52a526..b303fadb7 100644 --- a/TombEngine/Game/effects/effects.cpp +++ b/TombEngine/Game/effects/effects.cpp @@ -40,6 +40,9 @@ using namespace TEN::Math::Random; using TEN::Renderer::g_Renderer; +constexpr int WIBBLE_SPEED = 4; +constexpr int WIBBLE_MAX = UCHAR_MAX - WIBBLE_SPEED + 1; + // New particle class Particle Particles[MAX_PARTICLES]; ParticleDynamic ParticleDynamics[MAX_PARTICLE_DYNAMICS]; @@ -49,7 +52,9 @@ FX_INFO EffectList[NUM_EFFECTS]; GameBoundingBox DeadlyBounds; SPLASH_SETUP SplashSetup; SPLASH_STRUCT Splashes[MAX_SPLASHES]; + int SplashCount = 0; +int Wibble = 0; Vector3i NodeVectors[ParticleNodeOffsetIDs::NodeMax]; NODEOFFSET_INFO NodeOffsets[ParticleNodeOffsetIDs::NodeMax] = @@ -180,6 +185,13 @@ void SetSpriteSequence(Particle& particle, GAME_OBJECT_ID objectID) particle.spriteIndex = Objects[objectID].meshIndex + (int)round(Lerp(0.0f, numSprites, normalizedAge)); } +void UpdateWibble() +{ + // Update oscillator seed. + Wibble = (Wibble + WIBBLE_SPEED) & WIBBLE_MAX; + +} + void UpdateSparks() { auto bounds = GameBoundingBox(LaraItem); diff --git a/TombEngine/Game/effects/effects.h b/TombEngine/Game/effects/effects.h index 0613feaf1..a4e19139e 100644 --- a/TombEngine/Game/effects/effects.h +++ b/TombEngine/Game/effects/effects.h @@ -18,6 +18,8 @@ constexpr auto NUM_EFFECTS = 256; constexpr auto MAX_PARTICLES = 1024; constexpr auto MAX_PARTICLE_DYNAMICS = 8; +extern int Wibble; + enum SpriteEnumFlag { SP_NONE = 0, @@ -279,5 +281,6 @@ void TriggerRocketFire(int x, int y, int z); void TriggerExplosionBubbles(int x, int y, int z, short roomNumber); void Ricochet(Pose& pos); void ProcessEffects(ItemInfo* item); +void UpdateWibble(); void TriggerDynamicLight(const Vector3& pos, const Color& color, float falloff); diff --git a/TombEngine/Objects/TR4/Entity/tr4_beetle_swarm.cpp b/TombEngine/Objects/TR4/Entity/tr4_beetle_swarm.cpp index 2923a4f34..6bd700d00 100644 --- a/TombEngine/Objects/TR4/Entity/tr4_beetle_swarm.cpp +++ b/TombEngine/Objects/TR4/Entity/tr4_beetle_swarm.cpp @@ -3,6 +3,7 @@ #include "Game/collision/collide_room.h" #include "Game/control/flipeffect.h" +#include "Game/effects/effects.h" #include "Game/items.h" #include "Game/Lara/lara.h" #include "Game/Setup.h"