diff --git a/changelog.txt b/changelog.txt index 438bc8b..2ae15d4 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,3 +1,8 @@ +Rend 0.11.0 changelog: + +Gameplay: +* AI can be used in online multiplayer + Rend 0.10.0 changelog: Gameplay: diff --git a/src/lib-app/src/app/AppStateIngame.cpp b/src/lib-app/src/app/AppStateIngame.cpp index d867066..b6e9685 100644 --- a/src/lib-app/src/app/AppStateIngame.cpp +++ b/src/lib-app/src/app/AppStateIngame.cpp @@ -311,7 +311,23 @@ void AppStateIngame::simulateFrameFromState( const FrameState& state, bool skipAudio) { restoreState(state); - gameLoop->update(FRAME_TIME, app.time.getDeltaTime(), skipAudio); + gameLoop->update( + FRAME_TIME, + app.time.getDeltaTime(), + skipAudio, + [&] + { + // This gets executed after aiEngine.update + // propagate AI inputs to playerStates::input + // so NPCs do their thing + for (auto&& i : std::views::iota(firstNpcIdx, state.inputs.size())) + { + scene.playerStates[i].input.deserializeFrom( + scene.playerStates[i] + .blackboard.value() + .input->getSnapshot()); + } + }); ++scene.tick; } @@ -327,11 +343,6 @@ void AppStateIngame::restoreState(const FrameState& state) scene.playerStates[i].input.deserializeFrom(state.inputs[i]); } - for (auto&& i : std::views::iota(firstNpcIdx, state.inputs.size())) - { - scene.playerStates[i].input.deserializeFrom(inputs[i]->getSnapshot()); - } - scene.camera.anchorIdx = state.cameraAnchorIdx; // rebuild spatial index diff --git a/src/lib-game/include/GameLoop.hpp b/src/lib-game/include/GameLoop.hpp index 00d7b07..f43a4cd 100644 --- a/src/lib-game/include/GameLoop.hpp +++ b/src/lib-game/include/GameLoop.hpp @@ -52,7 +52,18 @@ class [[nodiscard]] GameLoop final } public: - void update(const float dt, const float realDt, bool skipAudio); + void update( + const float dt, + const float realDt, + bool skipAudio, + auto&& afterAiEngineUpdateCallback) + { + aiEngine.update(dt); + afterAiEngineUpdateCallback(); + updateEngines(dt, realDt); + processEvents(skipAudio); + gameRulesEngine.deleteMarkedObjects(); + } void renderTo(dgm::Window& window); diff --git a/src/lib-game/src/GameLoop.cpp b/src/lib-game/src/GameLoop.cpp index 7909e36..7ca7cc2 100644 --- a/src/lib-game/src/GameLoop.cpp +++ b/src/lib-game/src/GameLoop.cpp @@ -1,13 +1,5 @@ #include "GameLoop.hpp" -void GameLoop::update(const float dt, const float realDt, bool skipAudio) -{ - updateEngines(dt, realDt); - processEvents(skipAudio); - gameRulesEngine.deleteMarkedObjects(); - aiEngine.update(dt); // must happen after everything else -} - void GameLoop::renderTo(dgm::Window& window) { renderingEngine.renderTo(window);