forked from teamnwah/openmw-tes3coop
Issue #256: added TimeStamp class
This commit is contained in:
parent
124ea77612
commit
a4343bfa18
3 changed files with 153 additions and 0 deletions
|
@ -48,6 +48,7 @@ add_openmw_dir (mwworld
|
||||||
refdata world physicssystem scene globals class action nullaction actionteleport
|
refdata world physicssystem scene globals class action nullaction actionteleport
|
||||||
containerstore actiontalk actiontake manualref player cellfunctors
|
containerstore actiontalk actiontake manualref player cellfunctors
|
||||||
cells localscripts customdata weather inventorystore ptr actionread
|
cells localscripts customdata weather inventorystore ptr actionread
|
||||||
|
timestamp
|
||||||
)
|
)
|
||||||
|
|
||||||
add_openmw_dir (mwclass
|
add_openmw_dir (mwclass
|
||||||
|
|
108
apps/openmw/mwworld/timestamp.cpp
Normal file
108
apps/openmw/mwworld/timestamp.cpp
Normal file
|
@ -0,0 +1,108 @@
|
||||||
|
|
||||||
|
#include "timestamp.hpp"
|
||||||
|
|
||||||
|
#include <cmath>
|
||||||
|
|
||||||
|
#include <stdexcept>
|
||||||
|
|
||||||
|
namespace MWWorld
|
||||||
|
{
|
||||||
|
TimeStamp::TimeStamp (float hour, int day)
|
||||||
|
: mHour (hour), mDay (day)
|
||||||
|
{
|
||||||
|
if (hour<0 || hour>=24 || day<0)
|
||||||
|
throw std::runtime_error ("invalid time stamp");
|
||||||
|
}
|
||||||
|
|
||||||
|
float TimeStamp::getHour() const
|
||||||
|
{
|
||||||
|
return mHour;
|
||||||
|
}
|
||||||
|
|
||||||
|
int TimeStamp::getDay() const
|
||||||
|
{
|
||||||
|
return mDay;
|
||||||
|
}
|
||||||
|
|
||||||
|
TimeStamp& TimeStamp::operator+= (double hours)
|
||||||
|
{
|
||||||
|
if (hours<0)
|
||||||
|
throw std::runtime_error ("can't move time stamp backwards in time");
|
||||||
|
|
||||||
|
hours += mHour;
|
||||||
|
|
||||||
|
mHour = static_cast<float> (std::fmod (hours, 24));
|
||||||
|
|
||||||
|
mDay += hours / 24;
|
||||||
|
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool operator== (const TimeStamp& left, const TimeStamp& right)
|
||||||
|
{
|
||||||
|
return left.getHour()==right.getHour() && left.getDay()==right.getDay();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool operator!= (const TimeStamp& left, const TimeStamp& right)
|
||||||
|
{
|
||||||
|
return !(left==right);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool operator< (const TimeStamp& left, const TimeStamp& right)
|
||||||
|
{
|
||||||
|
if (left.getDay()<right.getDay())
|
||||||
|
return true;
|
||||||
|
|
||||||
|
if (left.getDay()>right.getDay())
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return left.getHour()<right.getHour();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool operator<= (const TimeStamp& left, const TimeStamp& right)
|
||||||
|
{
|
||||||
|
return left<right || left==right;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool operator> (const TimeStamp& left, const TimeStamp& right)
|
||||||
|
{
|
||||||
|
return !(left<=right);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool operator>= (const TimeStamp& left, const TimeStamp& right)
|
||||||
|
{
|
||||||
|
return !(left<right);
|
||||||
|
}
|
||||||
|
|
||||||
|
TimeStamp operator+ (const TimeStamp& stamp, double hours)
|
||||||
|
{
|
||||||
|
return TimeStamp (stamp) + hours;
|
||||||
|
}
|
||||||
|
|
||||||
|
TimeStamp operator+ (double hours, const TimeStamp& stamp)
|
||||||
|
{
|
||||||
|
return TimeStamp (stamp) + hours;
|
||||||
|
}
|
||||||
|
|
||||||
|
double operator- (const TimeStamp& left, const TimeStamp& right)
|
||||||
|
{
|
||||||
|
if (left<right)
|
||||||
|
return -(right-left);
|
||||||
|
|
||||||
|
int days = left.getDay() - right.getDay();
|
||||||
|
|
||||||
|
double hours = 0;
|
||||||
|
|
||||||
|
if (left.getHour()<right.getHour())
|
||||||
|
{
|
||||||
|
hours = 24-right.getHour()+left.getHour();
|
||||||
|
++days;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
hours = left.getHour()-right.getHour();
|
||||||
|
}
|
||||||
|
|
||||||
|
return hours + 24*days;
|
||||||
|
}
|
||||||
|
}
|
44
apps/openmw/mwworld/timestamp.hpp
Normal file
44
apps/openmw/mwworld/timestamp.hpp
Normal file
|
@ -0,0 +1,44 @@
|
||||||
|
#ifndef GAME_MWWORLD_TIMESTAMP_H
|
||||||
|
#define GAME_MWWORLD_TIMESTAMP_H
|
||||||
|
|
||||||
|
namespace MWWorld
|
||||||
|
{
|
||||||
|
/// \brief In-game time stamp
|
||||||
|
///
|
||||||
|
/// This class is based on the global variables GameHour and DaysPassed.
|
||||||
|
class TimeStamp
|
||||||
|
{
|
||||||
|
float mHour;
|
||||||
|
int mDay;
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
explicit TimeStamp (float hour = 0, int day = 0);
|
||||||
|
///< \oaram hour [0, 23)
|
||||||
|
/// \param day >=0
|
||||||
|
|
||||||
|
float getHour() const;
|
||||||
|
|
||||||
|
int getDay() const;
|
||||||
|
|
||||||
|
TimeStamp& operator+= (double hours);
|
||||||
|
///< \param hours >=0
|
||||||
|
};
|
||||||
|
|
||||||
|
bool operator== (const TimeStamp& left, const TimeStamp& right);
|
||||||
|
bool operator!= (const TimeStamp& left, const TimeStamp& right);
|
||||||
|
|
||||||
|
bool operator< (const TimeStamp& left, const TimeStamp& right);
|
||||||
|
bool operator<= (const TimeStamp& left, const TimeStamp& right);
|
||||||
|
|
||||||
|
bool operator> (const TimeStamp& left, const TimeStamp& right);
|
||||||
|
bool operator>= (const TimeStamp& left, const TimeStamp& right);
|
||||||
|
|
||||||
|
TimeStamp operator+ (const TimeStamp& stamp, double hours);
|
||||||
|
TimeStamp operator+ (double hours, const TimeStamp& stamp);
|
||||||
|
|
||||||
|
double operator- (const TimeStamp& left, const TimeStamp& right);
|
||||||
|
///< Returns the difference between \a left and \a right in in-game hours.
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
Loading…
Reference in a new issue