public SeasonalTime GetSeasonOfNextTick(SeasonalTime currentSeason) => currentSeason.CurrentTime >= currentSeason.Length ? _seasonChanger[currentSeason.Id] : new SeasonalTime(currentSeason) { CurrentTime = currentSeason.CurrentTime + 1 };
// these calculations have been chosen more or less deliberately to kind of simulate a shift in seasons regarding temperature // they are not meant to represent realistic values public double CalculateTemperature(SeasonalTime season) => Match <SeasonalTime, double> .MatchFirst(season, (s => s.Id == Season.Spring, s => (s.CurrentTime * 3) - s.Length), // linear ascending (s => s.Id == Season.Summer, s => (-0.6 * s.CurrentTime * s.CurrentTime) + (s.Length / 2 * s.CurrentTime) + (s.Length * 2)), // parabola facing down
private (double, double, double) GetEarlyMediumAndLateTemperature(SeasonalTime initial, ICalculateSeason calculator) => (calculator.CalculateTemperature(initial),
public double CalculateTemperature(SeasonalTime season) => 0;
public SeasonalTime GetSeasonOfNextTick(SeasonalTime currentSeason) => SeasonalTime.None;
public SeasonalTime(SeasonalTime other) { Id = other.Id; Length = other.Length; CurrentTime = other.CurrentTime; }