From 209b7fd5c6ca583b75d38e41c7816c9d40f12f2b Mon Sep 17 00:00:00 2001 From: Dave Corley Date: Tue, 7 Oct 2025 11:24:13 -0500 Subject: [PATCH] FEAT: Add a binding for passing time in `world` --- apps/openmw/mwbase/mechanicsmanager.hpp | 1 + apps/openmw/mwbase/world.hpp | 2 ++ apps/openmw/mwlua/worldbindings.cpp | 11 ++++++++++- apps/openmw/mwmechanics/mechanicsmanagerimp.cpp | 5 +++++ apps/openmw/mwmechanics/mechanicsmanagerimp.hpp | 1 + apps/openmw/mwworld/worldimp.cpp | 5 +++++ apps/openmw/mwworld/worldimp.hpp | 2 ++ files/lua_api/openmw/world.lua | 4 ++++ 8 files changed, 30 insertions(+), 1 deletion(-) diff --git a/apps/openmw/mwbase/mechanicsmanager.hpp b/apps/openmw/mwbase/mechanicsmanager.hpp index 59cf81f71d..22eaad8dc1 100644 --- a/apps/openmw/mwbase/mechanicsmanager.hpp +++ b/apps/openmw/mwbase/mechanicsmanager.hpp @@ -309,6 +309,7 @@ namespace MWBase virtual float getAngleToPlayer(const MWWorld::Ptr& ptr) const = 0; virtual MWMechanics::GreetingState getGreetingState(const MWWorld::Ptr& ptr) const = 0; virtual bool isTurningToPlayer(const MWWorld::Ptr& ptr) const = 0; + virtual void fastForwardAi() const = 0; }; } diff --git a/apps/openmw/mwbase/world.hpp b/apps/openmw/mwbase/world.hpp index fe2803a28c..02618d92a2 100644 --- a/apps/openmw/mwbase/world.hpp +++ b/apps/openmw/mwbase/world.hpp @@ -210,6 +210,8 @@ namespace MWBase virtual void advanceTime(double hours, bool incremental = false) = 0; ///< Advance in-game time. + virtual void fastForwardAi() const = 0; + virtual MWWorld::TimeStamp getTimeStamp() const = 0; ///< Return current in-game time and number of day since new game start. diff --git a/apps/openmw/mwlua/worldbindings.cpp b/apps/openmw/mwlua/worldbindings.cpp index d80631c273..204599bdf0 100644 --- a/apps/openmw/mwlua/worldbindings.cpp +++ b/apps/openmw/mwlua/worldbindings.cpp @@ -60,7 +60,16 @@ namespace MWLua { using Misc::FiniteFloat; - MWWorld::DateTimeManager* timeManager = MWBase::Environment::get().getWorld()->getTimeManager(); + Misc::NotNullPtr world = MWBase::Environment::get().getWorld(); + MWWorld::DateTimeManager* timeManager = world->getTimeManager(); + + api["advanceTime"] = [context, world](const FiniteFloat hours) { + if (hours <= 0.0f) + throw std::runtime_error("Time may only be advanced forward"); + + world->advanceTime(hours); + world->fastForwardAi(); + }; api["setGameTimeScale"] = [timeManager](const FiniteFloat scale) { timeManager->setGameTimeScale(scale); }; api["setSimulationTimeScale"] = [context, timeManager](const FiniteFloat scale) { diff --git a/apps/openmw/mwmechanics/mechanicsmanagerimp.cpp b/apps/openmw/mwmechanics/mechanicsmanagerimp.cpp index 2d2f5057b0..a494153543 100644 --- a/apps/openmw/mwmechanics/mechanicsmanagerimp.cpp +++ b/apps/openmw/mwmechanics/mechanicsmanagerimp.cpp @@ -2071,4 +2071,9 @@ namespace MWMechanics { return mActors.isTurningToPlayer(ptr); } + + void MechanicsManager::fastForwardAi() const + { + mActors.fastForwardAi(); + } } diff --git a/apps/openmw/mwmechanics/mechanicsmanagerimp.hpp b/apps/openmw/mwmechanics/mechanicsmanagerimp.hpp index 4e310e451e..53eee5ed83 100644 --- a/apps/openmw/mwmechanics/mechanicsmanagerimp.hpp +++ b/apps/openmw/mwmechanics/mechanicsmanagerimp.hpp @@ -242,6 +242,7 @@ namespace MWMechanics float getAngleToPlayer(const MWWorld::Ptr& ptr) const override; GreetingState getGreetingState(const MWWorld::Ptr& ptr) const override; bool isTurningToPlayer(const MWWorld::Ptr& ptr) const override; + void fastForwardAi() const override; private: bool canCommitCrimeAgainst(const MWWorld::Ptr& victim, const MWWorld::Ptr& attacker); diff --git a/apps/openmw/mwworld/worldimp.cpp b/apps/openmw/mwworld/worldimp.cpp index e542873713..a0f73b2374 100644 --- a/apps/openmw/mwworld/worldimp.cpp +++ b/apps/openmw/mwworld/worldimp.cpp @@ -919,6 +919,11 @@ namespace MWWorld } } + void World::fastForwardAi() const + { + MWBase::Environment::get().getMechanicsManager()->fastForwardAi(); + } + TimeStamp World::getTimeStamp() const { return mTimeManager->getTimeStamp(); diff --git a/apps/openmw/mwworld/worldimp.hpp b/apps/openmw/mwworld/worldimp.hpp index 54ad5ab636..8bbac22b85 100644 --- a/apps/openmw/mwworld/worldimp.hpp +++ b/apps/openmw/mwworld/worldimp.hpp @@ -309,6 +309,8 @@ namespace MWWorld void advanceTime(double hours, bool incremental = false) override; ///< Advance in-game time. + void fastForwardAi() const override; + TimeStamp getTimeStamp() const override; ///< Return current in-game time and number of day since new game start. diff --git a/files/lua_api/openmw/world.lua b/files/lua_api/openmw/world.lua index b72054298f..4c3a1fb690 100644 --- a/files/lua_api/openmw/world.lua +++ b/files/lua_api/openmw/world.lua @@ -205,4 +205,8 @@ -- core.sendGlobalEvent('SpawnVfx', {model = model, position = pos}) -- +--- +-- Advance the world time by a certain number of hours. This advances time, weather, and AI, but does not perform other functions associated with the passage of time, eg regeneration. +-- @function [parent=#world] advanceTime + return nil