#include #include namespace td { namespace sim { 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) : m_StepTime(a_StepTime), m_World(a_World), m_History(std::move(a_History)), m_CurrentTime(0), m_LastTime(GetTime()), m_CurrentStep(0) { Step(); } float RealTimeSimulation::Update() { // TODO: handle freezes (m_CurrentTime > 2 * m_StepTime) m_CurrentTime += GetTime() - m_LastTime; m_LastTime = GetTime(); if (m_CurrentTime > m_StepTime) { Step(); m_CurrentTime -= m_StepTime; } return (float) m_CurrentTime / (float) m_StepTime; } void RealTimeSimulation::Step() { m_World.Tick(m_History[m_CurrentStep], FpFloat(m_StepTime) / FpFloat(1000)); m_CurrentStep++; } } // namespace sim } // namespace td