From 731c7423467a731d14261acface8109f02fbf677 Mon Sep 17 00:00:00 2001 From: Persson-dev Date: Sun, 3 Aug 2025 18:20:21 +0200 Subject: [PATCH] begin serversimulation --- include/td/protocol/command/CommandData.h | 4 +--- include/td/protocol/packet/PacketData.h | 10 +++++++++ ...ealTimeSimulation.h => ClientSimulation.h} | 11 +++++----- include/td/simulation/ServerSimulation.h | 22 +++++++++++++++++++ src/main.cpp | 14 ++++++------ ...imeSimulation.cpp => ClientSimulation.cpp} | 22 ++++++++++--------- 6 files changed, 58 insertions(+), 25 deletions(-) rename include/td/simulation/{RealTimeSimulation.h => ClientSimulation.h} (72%) create mode 100644 include/td/simulation/ServerSimulation.h rename src/td/simulation/{RealTimeSimulation.cpp => ClientSimulation.cpp} (73%) diff --git a/include/td/protocol/command/CommandData.h b/include/td/protocol/command/CommandData.h index 1b72583..bf01602 100644 --- a/include/td/protocol/command/CommandData.h +++ b/include/td/protocol/command/CommandData.h @@ -21,10 +21,8 @@ struct UpgradeTower { sp::BitField m_Upgrade; }; -using EntityTypeInt = std::uint8_t; - struct SpawnTroop { - sp::BitField m_Type; + sp::BitField m_Type; sp::BitField m_Level; EntityCoords m_Position; PlayerID m_Sender; diff --git a/include/td/protocol/packet/PacketData.h b/include/td/protocol/packet/PacketData.h index 656bb8d..8bdcc39 100644 --- a/include/td/protocol/packet/PacketData.h +++ b/include/td/protocol/packet/PacketData.h @@ -95,6 +95,16 @@ struct WorldData { game::ChunkList m_Chunks; }; +struct SpawnTroop { + sp::BitField m_Type; + sp::BitField m_Level; +}; + +struct PlaceTower { + TowerType m_Type; + TowerCoords m_Position; +}; + } // namespace pdata } // namespace protocol } // namespace td diff --git a/include/td/simulation/RealTimeSimulation.h b/include/td/simulation/ClientSimulation.h similarity index 72% rename from include/td/simulation/RealTimeSimulation.h rename to include/td/simulation/ClientSimulation.h index e77f42b..f58abde 100644 --- a/include/td/simulation/RealTimeSimulation.h +++ b/include/td/simulation/ClientSimulation.h @@ -9,7 +9,8 @@ namespace sim { using GameHistory = std::vector; using GameBuffer = std::vector>; -class RealTimeSimulation { +// TODO: OnEnd signal +class ClientSimulation : public protocol::PacketHandler { private: std::uint64_t m_StepTime; game::World& m_World; @@ -28,21 +29,21 @@ class RealTimeSimulation { * \brief Replay constructor * \param a_StepTime in ms */ - RealTimeSimulation(game::World& a_World, GameHistory&& a_History, std::uint64_t a_StepTime); + ClientSimulation(game::World& a_World, GameHistory&& a_History, std::uint64_t a_StepTime); /** * \brief Live update constructor (continuous game updates) * \param a_StepTime in ms */ - RealTimeSimulation(game::World& a_World, std::uint64_t a_StepTime); + ClientSimulation(game::World& a_World, std::uint64_t a_StepTime); /** * \return the progress [0-1] between two steps */ float Update(); - void HandlePacket(const protocol::packets::LockStepsPacket& a_LockSteps); - void HandlePacket(const protocol::packets::PredictCommandPacket& a_Predict); + void Handle(const protocol::packets::LockStepsPacket& a_LockSteps) override; + void Handle(const protocol::packets::PredictCommandPacket& a_Predict) override; private: void Step(); diff --git a/include/td/simulation/ServerSimulation.h b/include/td/simulation/ServerSimulation.h new file mode 100644 index 0000000..2114fd1 --- /dev/null +++ b/include/td/simulation/ServerSimulation.h @@ -0,0 +1,22 @@ +#pragma once + +#include + +namespace td { +namespace sim { + +// TODO: OnEnd signal +class ServerSimulation { + private: + game::World& m_World; + std::uint64_t m_StepTime; + std::uint64_t m_CurrentTime; + + public: + ServerSimulation(game::World& a_World, std::uint64_t a_StepTime); + + void Update(); +}; + +} // namespace sim +} // namespace td diff --git a/src/main.cpp b/src/main.cpp index 25ddce0..195f47f 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,14 +1,14 @@ #include +#include #include #include #include -#include #include #include #include #include -#include +#include #include #include @@ -59,8 +59,8 @@ td::game::World GetWorld() { WorldApply wa(w); td::protocol::PacketDispatcher d; - d.RegisterHandler(td::protocol::PacketID::WorldData, &wa); d.RegisterHandler(td::protocol::PacketID::WorldHeader, &wa); + d.RegisterHandler(td::protocol::PacketID::WorldData, &wa); d.Dispatch(*header); d.Dispatch(*data); @@ -83,7 +83,7 @@ td::sim::GameHistory GetCustomHistory() { td::sim::GameHistory gh(MAX_COUNT); auto spawn = td::protocol::CommandPtr( - std::make_shared(0, 0, td::Vec2fp{td::FpFloat(77), td::FpFloat(13)}, 0)); + std::make_shared(td::EntityType::Zombie, 0, td::Vec2fp{td::FpFloat(77), td::FpFloat(13)}, 0)); gh[0].push_back(spawn); auto tower = td::protocol::CommandPtr( @@ -114,17 +114,17 @@ int main(int argc, char** argv) { cam.SetCamPos({77, 7, 13}); cam.UpdatePerspective(display.GetAspectRatio()); - td::sim::RealTimeSimulation simulation(w, 50); + td::sim::ClientSimulation simulation(w, 50); display.OnKeyDown.Connect([&simulation](SDL_Keycode key) { static int counter = 0; if (key == SDLK_A) { auto spawn = td::protocol::CommandPtr( - std::make_shared(0, 0, td::Vec2fp{td::FpFloat(77), td::FpFloat(13)}, 0)); + std::make_shared(td::EntityType::Zombie, 0, td::Vec2fp{td::FpFloat(77), td::FpFloat(13)}, 0)); std::array steps{}; steps[0].push_back(spawn); td::protocol::packets::LockStepsPacket packet{counter * LOCKSTEP_BUFFER_SIZE * 3, steps}; - simulation.HandlePacket(packet); + simulation.Handle(packet); counter++; } }); diff --git a/src/td/simulation/RealTimeSimulation.cpp b/src/td/simulation/ClientSimulation.cpp similarity index 73% rename from src/td/simulation/RealTimeSimulation.cpp rename to src/td/simulation/ClientSimulation.cpp index 8696e38..7d43c36 100644 --- a/src/td/simulation/RealTimeSimulation.cpp +++ b/src/td/simulation/ClientSimulation.cpp @@ -1,18 +1,18 @@ -#include +#include #include namespace td { namespace sim { -const protocol::LockStep RealTimeSimulation::EMPTY_LOCKSTEP; +const protocol::LockStep ClientSimulation::EMPTY_LOCKSTEP; std::uint64_t GetTime() { return static_cast( std::chrono::duration_cast(std::chrono::system_clock().now().time_since_epoch()).count()); } -RealTimeSimulation::RealTimeSimulation(game::World& a_World, GameHistory&& a_History, std::uint64_t a_StepTime) : +ClientSimulation::ClientSimulation(game::World& a_World, GameHistory&& a_History, std::uint64_t a_StepTime) : m_StepTime(a_StepTime), m_World(a_World), m_CurrentTime(0), @@ -27,7 +27,7 @@ RealTimeSimulation::RealTimeSimulation(game::World& a_World, GameHistory&& a_His Step(); } -RealTimeSimulation::RealTimeSimulation(game::World& a_World, std::uint64_t a_StepTime) : +ClientSimulation::ClientSimulation(game::World& a_World, std::uint64_t a_StepTime) : m_StepTime(a_StepTime), m_World(a_World), m_History(std::numeric_limits::max()), @@ -39,7 +39,7 @@ RealTimeSimulation::RealTimeSimulation(game::World& a_World, std::uint64_t a_Ste Step(); } -float RealTimeSimulation::Update() { +float ClientSimulation::Update() { // TODO: handle freezes (m_CurrentTime > 2 * m_StepTime) m_CurrentTime += GetTime() - m_LastTime; m_LastTime = GetTime(); @@ -50,7 +50,7 @@ float RealTimeSimulation::Update() { return (float)m_CurrentTime / (float)m_StepTime; } -void RealTimeSimulation::Step() { +void ClientSimulation::Step() { const auto& step = m_History[m_CurrentStep]; if (step.has_value()) { m_LastSnapshot = m_World.Tick(step.value(), FpFloat(m_StepTime) / FpFloat(1000)); @@ -61,7 +61,7 @@ void RealTimeSimulation::Step() { m_CurrentStep++; } -void RealTimeSimulation::HandlePacket(const protocol::packets::LockStepsPacket& a_LockSteps) { +void ClientSimulation::Handle(const protocol::packets::LockStepsPacket& a_LockSteps) { const auto& steps = a_LockSteps->m_LockSteps; for (std::size_t i = 0; i < LOCKSTEP_BUFFER_SIZE; i++) { m_History[a_LockSteps->m_FirstFrameNumber + i] = steps[i]; @@ -69,15 +69,17 @@ void RealTimeSimulation::HandlePacket(const protocol::packets::LockStepsPacket& FastReplay(); } -void RealTimeSimulation::HandlePacket(const protocol::packets::PredictCommandPacket& a_Predict) {} +void ClientSimulation::Handle(const protocol::packets::PredictCommandPacket& a_Predict) { + +} -void RealTimeSimulation::FastForward(std::size_t a_Count) { +void ClientSimulation::FastForward(std::size_t a_Count) { for (std::size_t i = 0; i < a_Count; i++) { Step(); } } -void RealTimeSimulation::FastReplay() { +void ClientSimulation::FastReplay() { if (m_LastValidStep >= m_CurrentStep) return;