diff options
| -rw-r--r-- | game/environment.cpp | 12 | ||||
| -rw-r--r-- | game/environment.h | 8 | ||||
| -rw-r--r-- | lib/chronology.cpp | 6 | ||||
| -rw-r--r-- | lib/chronology.h | 1 | ||||
| -rw-r--r-- | ui/gameMainWindow.cpp | 1 |
5 files changed, 21 insertions, 7 deletions
diff --git a/game/environment.cpp b/game/environment.cpp index f8da316..58a5b53 100644 --- a/game/environment.cpp +++ b/game/environment.cpp @@ -5,15 +5,17 @@ constexpr Direction2D DONCASTER = {-1.1_degrees, 53.5_degrees}; -Environment::Environment() : worldTime {"2026-06-01T12:00:00"_time_t}, earthPos {DONCASTER} { } +Environment::Environment() : worldTime {"2026-06-01T12:00:00"_seconds}, gameTimeScaleFactor {1440}, earthPos {DONCASTER} +{ +} void -Environment::tick(TickDuration) +Environment::tick(TickDuration elapsed) { - worldTime += 50; + worldTime += std::chrono::duration_cast<WorldTime::duration>(elapsed * gameTimeScaleFactor); } -time_t +Environment::WorldTime Environment::getWorldTime() const { return worldTime; @@ -22,7 +24,7 @@ Environment::getWorldTime() const Direction2D Environment::getSunPos() const { - return getSunPos(earthPos, worldTime); + return getSunPos(earthPos, worldTime.time_since_epoch().count()); } void diff --git a/game/environment.h b/game/environment.h index 271792f..94211bc 100644 --- a/game/environment.h +++ b/game/environment.h @@ -2,20 +2,24 @@ #include "config/types.h" #include "worldobject.h" +#include <chrono> class SceneRenderer; class SceneProvider; class Environment : public WorldObject { public: + using WorldTime = std::chrono::utc_time<std::chrono::seconds>; + Environment(); void tick(TickDuration elapsed) override; void render(const SceneRenderer &, const SceneProvider &) const; [[nodiscard]] Direction2D getSunPos() const; - [[nodiscard]] time_t getWorldTime() const; + [[nodiscard]] WorldTime getWorldTime() const; [[nodiscard]] static Direction2D getSunPos(Direction2D position, time_t time); private: - time_t worldTime; + WorldTime worldTime; + uint16_t gameTimeScaleFactor; glm::vec<2, Angle> earthPos; }; diff --git a/lib/chronology.cpp b/lib/chronology.cpp index 8707bba..49f6df2 100644 --- a/lib/chronology.cpp +++ b/lib/chronology.cpp @@ -10,3 +10,9 @@ operator""_time_t(const char * iso, size_t) } return mktime(&tm); } + +std::chrono::seconds +operator""_seconds(const char * iso, size_t) +{ + return std::chrono::seconds(operator""_time_t(iso, 0)); +} diff --git a/lib/chronology.h b/lib/chronology.h index 688a1f7..886424d 100644 --- a/lib/chronology.h +++ b/lib/chronology.h @@ -5,3 +5,4 @@ using TickDuration = std::chrono::duration<float, std::chrono::seconds::period>; time_t operator""_time_t(const char * iso, size_t); +std::chrono::seconds operator""_seconds(const char * iso, size_t); diff --git a/ui/gameMainWindow.cpp b/ui/gameMainWindow.cpp index 056dac3..cc81a9b 100644 --- a/ui/gameMainWindow.cpp +++ b/ui/gameMainWindow.cpp @@ -28,6 +28,7 @@ public: render() override { if (IltGui::BeginToolbar("bottomBar", ImGuiDir_Down, TOOLBAR_HEIGHT)) { + IltGui::Text(std::format("{:%a, %H:%M\n%d %m %Y}", gameState->environment->getWorldTime())); if (ImGui::ImageButton("Build rails", *buildRailsIcon, TOOLBAR_ICON_SIZE<ImVec2>)) { gms->target = std::make_unique<EditNetworkOf<RailLinks>>(); } |
