#pragma once #include #include namespace td { namespace game { class World; } namespace sim { class IWorldSystem { public: virtual void Tick(const game::World& a_World, WorldSnapshot& a_State, FpFloat a_Delta) = 0; virtual ~IWorldSystem() = default; }; class WorldTicker { private: std::vector> m_Systems; public: WorldTicker(); WorldSnapshot NextStep( const game::World& a_World, WorldSnapshot& a_PreviousState, const protocol::LockStep& a_LockStep, FpFloat a_Delta); private: void ApplySteps(const game::World& a_World, WorldSnapshot& a_State, const protocol::LockStep& a_LockStep); void Tick(const game::World& a_World, WorldSnapshot& a_State, FpFloat a_Delta); WorldSnapshot CreateNext(WorldSnapshot& a_PreviousState); template void AddSystem() { m_Systems.push_back(std::make_unique()); } }; } // namespace sim } // namespace td