summaryrefslogtreecommitdiffhomepage
path: root/StarsEx/Stardate.cpp
blob: f57205a210199624b8276e9e18455eac0293831f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
/*  Starshatter: The Open Source Project
    Copyright (c) 2021-2024, Starshatter: The Open Source Project Contributors
    Copyright (c) 2011-2012, Starshatter OpenSource Distribution Contributors
    Copyright (c) 1997-2006, Destroyer Studios LLC.
*/

#include "Stardate.h"

#include <cstdint>

#include <Text.h>

#include "Clock.h"


namespace starshatter
{
namespace engine
{


static constexpr long double EPOCH {0.5e9l};
static constexpr long double MINUTE {60};
static constexpr long double HOUR {60 * MINUTE};
static constexpr long double DAY {24 * HOUR};
static long double operation_start {};
static long double mission_start {};


Stardate::Stardate() :
	value {0}
{
}


Stardate::Stardate(long double value_) :
	value {value_}
{
}


Stardate::operator long double() const
{
	return value;
}


Text
Stardate::Format(bool short_format) const
{
	auto time = value;
	std::int_fast32_t day = 1, hours = 0, minutes = 0, seconds = 0;
	while (time >= DAY) {
		time -= DAY;
		++day;
	}
	while (time >= HOUR) {
		time -= HOUR;
		++hours;
	}
	while (time >= MINUTE) {
		time -= MINUTE;
		++minutes;
	}
	seconds = time;
	return Text::format(
		short_format ? "%02d/%02d:%02d:%02d" : "Day %d, %02d:%02d:%02d",
		day, hours, minutes, seconds);
}


Stardate
CurrentTime()
{
	return Epoch() + OperationStart() + OperationTime();
}


Stardate
OperationTime()
{
	return MissionStart() + MissionTime();
}


Stardate
MissionTime()
{
	if (const auto* clock = Clock::GetInstance())
		return clock->GameTime<long double>() / 1000.0l;
	throw "game clock not initialized";
}


long double
Epoch()
{
	return EPOCH;
}


long double
OperationStart()
{
	return operation_start;
}


long double
MissionStart()
{
	return mission_start;
}


void
SetOperationStart(long double value, bool relative)
{
	if (relative)
		operation_start += value;
	else
		operation_start = value;
}


void
SetMissionStart(long double value, bool relative)
{
	if (relative)
		mission_start += value;
	else
		mission_start = value;
}


}  // namespace engine
}  // namespace starshatter