summaryrefslogtreecommitdiffhomepage
path: root/StarsEx/Stardate.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'StarsEx/Stardate.cpp')
-rw-r--r--StarsEx/Stardate.cpp137
1 files changed, 137 insertions, 0 deletions
diff --git a/StarsEx/Stardate.cpp b/StarsEx/Stardate.cpp
new file mode 100644
index 0000000..f57205a
--- /dev/null
+++ b/StarsEx/Stardate.cpp
@@ -0,0 +1,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