feat(core): add day/night tick clock

This commit is contained in:
dualfroz committed 2026-08-25 22:30:36 +02:00
1 parent 3b1bbbc02c
commit 125ee956b2
2 files changed
+232

No files matched your search

+73
View File
@@ -0,0 +1,73 @@
#pragma once
#include <cstdint>
namespace vf {
using WorldTick = long long;
enum class DayPhase : uint8_t {
Dawn = 0,
Day = 1,
Dusk = 2,
Night = 3,
};
const char* dayPhaseName(DayPhase phase);
struct TimeOfDayConfig {
WorldTick ticksPerDay = 24000;
double dawnStart = 0.20;
double dawnEnd = 0.30;
double duskStart = 0.70;
double duskEnd = 0.80;
double sunriseFraction = 0.25;
double sunsetFraction = 0.75;
int nightSkyLight = 4;
int daySkyLight = 15;
int moonPhaseCount = 8;
};
// Deterministic world clock. Maps an absolute tick counter onto a day cycle:
// within-day fraction, four named phases, a sky-light curve peaking at noon and
// bottoming at midnight, a moon phase advancing once per day, and sunrise/sunset
// crossing detection for the interval covered by the most recent advance.
class TimeOfDay {
public:
explicit TimeOfDay(WorldTick startTick = 0, const TimeOfDayConfig& config = {});
void advance(WorldTick ticks = 1);
void setTick(WorldTick absoluteTick);
void reset(WorldTick absoluteTick = 0);
WorldTick absoluteTick() const { return tickCounter; }
WorldTick timeOfDayTicks() const;
double dayFraction() const;
WorldTick dayCount() const;
DayPhase phase() const;
bool isDaylight() const;
bool isNight() const;
int skyLightLevel() const;
double skyBrightness() const;
double sunHeight() const;
int moonPhase() const;
double moonBrightness() const;
bool crossedSunrise() const { return sunriseCrossed; }
bool crossedSunset() const { return sunsetCrossed; }
const TimeOfDayConfig& settings() const { return config; }
private:
void recomputeCrossings(WorldTick previous, WorldTick current);
TimeOfDayConfig config;
WorldTick tickCounter;
bool sunriseCrossed = false;
bool sunsetCrossed = false;
};
} // namespace vf