00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030 #include "util/base/exception.h"
00031 #include "util/time/timemanager.h"
00032
00033 #include "timeprovider.h"
00034
00035 namespace FIFE {
00036 TimeProvider::TimeProvider(TimeProvider* master):
00037 m_master(master),
00038 m_multiplier(1.0) {
00039 m_time_static = m_time_scaled = master ? master->getGameTime() : TimeManager::instance()->getTime();
00040 }
00041
00042 TimeProvider::~TimeProvider() {}
00043
00044 void TimeProvider::setMultiplier(float multiplier) {
00045 if (multiplier < 0.0) {
00046 throw NotSupported("Negative time multiplier are not supported");
00047 }
00048 m_time_static = getPreciseGameTime();
00049 m_time_scaled = m_master ? m_master->getPreciseGameTime() : static_cast<float>(TimeManager::instance()->getTime());
00050 m_multiplier = multiplier;
00051 }
00052
00053 float TimeProvider::getMultiplier() const {
00054 return m_multiplier;
00055 }
00056
00057 float TimeProvider::getTotalMultiplier() const {
00058 if (m_master) {
00059 return m_master->getTotalMultiplier() * m_multiplier;
00060 } else {
00061 return m_multiplier;
00062 }
00063 }
00064
00065 unsigned int TimeProvider::getGameTime() const {
00066 return static_cast<unsigned int>(getPreciseGameTime());
00067 }
00068
00069 double TimeProvider::getPreciseGameTime() const {
00070 return m_time_static + m_multiplier * ((m_master ? m_master->getPreciseGameTime() : static_cast<float>(TimeManager::instance()->getTime())) - m_time_scaled);
00071 }
00072
00073 unsigned int scaleTime(float multiplier, unsigned int ticks) {
00074 return static_cast<unsigned int>(static_cast<float>(ticks) * multiplier);
00075 }
00076 }