ICT290 / src / scene / AIController / EntityBrain / DecisionRegulator.cpp
DecisionRegulator.cpp
Raw
//
// Created by Micha on 29/09/2021.
//

#include "DecisionRegulator.h"

DecisionRegulator::DecisionRegulator(float NumUpdatesPerSecondRqd) {
    std::random_device rdevice{};
    std::default_random_engine num{rdevice()};
    std::uniform_real_distribution<float> random{0.0f, 1000.0f};

    m_NextUpdateTime = SDL_GetTicks() + static_cast<Uint32>(random(num));

    if (NumUpdatesPerSecondRqd > 0) {
        m_UpdatePeriod = 1000.0f / NumUpdatesPerSecondRqd;
    }
    // check if 0.0(remember floats never quite 0.0
    else if ((NumUpdatesPerSecondRqd * NumUpdatesPerSecondRqd) < 0.0000001) {
        m_UpdatePeriod = 0.0f;
    }

    else if (NumUpdatesPerSecondRqd < 0) {
        m_UpdatePeriod = -1;
    }
}

// returns true if the current time exceeds m_dwNextUpdateTime
bool DecisionRegulator::isReady() {
    // if a regulator is instantiated with a zero freq then it goes into
    // stealth mode (doesn't regulate)
    if ((m_UpdatePeriod * m_UpdatePeriod) < 0.0000001)
        return true;

    // if the regulator is instantiated with a negative freq then it will
    // never allow the code to flow
    if (m_UpdatePeriod < 0)
        return false;

    Uint32 CurrentTime = SDL_GetTicks();

    // the number of milliseconds the update period can vary per required
    // update-step. This is here to make sure any multiple clients of this class
    // have their updates spread evenly
    static const float UpdatePeriodVariator = 10.0;

    if (CurrentTime >= m_NextUpdateTime) {
        std::random_device rdevice{};
        std::default_random_engine num{rdevice()};
        std::uniform_real_distribution<float> random{-UpdatePeriodVariator,
                                                     UpdatePeriodVariator};

        m_NextUpdateTime = CurrentTime + (Uint32)m_UpdatePeriod
                           + static_cast<Uint32>(random(num));

        return true;
    }

    return false;
}