forked from Shardstone/trail-into-darkness
71 lines
2.0 KiB
C#
71 lines
2.0 KiB
C#
using Jovian.Calendar;
|
|
using UnityEngine;
|
|
|
|
namespace Nox.Game {
|
|
public enum DayPhase {
|
|
Midnight,
|
|
Dawn,
|
|
Morning,
|
|
Afternoon,
|
|
Dusk,
|
|
Night
|
|
}
|
|
|
|
public class TimeHandler {
|
|
private readonly AdventureSettings adventureSettings;
|
|
private readonly AdventureData adventureData;
|
|
private readonly WorldClock worldClock;
|
|
|
|
private float localTime;
|
|
|
|
private static readonly (float start, DayPhase phase)[] PhaseThresholds = {
|
|
(0.00f, DayPhase.Midnight),
|
|
(0.05f, DayPhase.Night),
|
|
(0.17f, DayPhase.Dawn),
|
|
(0.25f, DayPhase.Morning),
|
|
(0.50f, DayPhase.Afternoon),
|
|
(0.75f, DayPhase.Dusk),
|
|
(0.90f, DayPhase.Night)
|
|
};
|
|
|
|
public TimeHandler(AdventureSettings adventureSettings, AdventureData adventureData, WorldClock worldClock) {
|
|
this.adventureSettings = adventureSettings;
|
|
this.adventureData = adventureData;
|
|
this.worldClock = worldClock;
|
|
localTime = adventureData.currentTime * adventureSettings.dayLength;
|
|
}
|
|
|
|
public void Tick() {
|
|
if(!adventureData.isPartyMoving) {
|
|
return;
|
|
}
|
|
|
|
localTime += Time.deltaTime;
|
|
|
|
if(localTime >= adventureSettings.dayLength) {
|
|
localTime -= adventureSettings.dayLength;
|
|
}
|
|
|
|
var normalized = localTime / adventureSettings.dayLength;
|
|
|
|
worldClock.Tick(normalized);
|
|
|
|
adventureData.currentTime = normalized;
|
|
adventureData.currentDayPhase = GetPhase(normalized);
|
|
}
|
|
|
|
private static DayPhase GetPhase(float t) {
|
|
var phase = DayPhase.Midnight;
|
|
foreach(var (start, p) in PhaseThresholds) {
|
|
if(t >= start) {
|
|
phase = p;
|
|
}
|
|
else {
|
|
break;
|
|
}
|
|
}
|
|
return phase;
|
|
}
|
|
}
|
|
}
|