Scriptname _00E_TimeControl Hidden

Function SkipTimeToHour(Float fNewHourOfDay, Float fMinHoursToSkip = 0.0) Global
{Progresses the current in-game time to the desired hour (and optionally, by no less than fMinHoursToSkip hours), moving to the next day if needed}

	GlobalVariable GameHourVar = Game.GetForm(0x38) as GlobalVariable

	Float fCurHour = GameHourVar.GetValue()
	If fNewHourOfDay <= fCurHour
		fNewHourOfDay += 24.0 ; Go to the next day
	EndIf
	If (fNewHourOfDay - fCurHour) < fMinHoursToSkip
		fNewHourOfDay += 24.0 ; Go to the next day
	EndIf
	GameHourVar.SetValue(fNewHourOfDay)
	GameHourVar.SendModEvent("TimeSkip")

EndFunction

;/ Unused
Function SkipHours(Float fHoursToSkip) Global
{Progresses the current in-game time by fHoursToSkip hours}

	GlobalVariable GameHourVar = Game.GetForm(0x38) as GlobalVariable
	
	GameHourVar.SetValue(GameHourVar.GetValue() + fHoursToSkip)
	GameHourVar.SendModEvent("TimeSkip")

EndFunction
/;

Float Function NormalizeHour(Float fHour) Global

	If fHour >= 24.0
		Return (fHour - 24.0)
	ElseIf fHour < 0.0
		Return (fHour + 24.0)
	Else
		Return fHour
	EndIf

EndFunction

Bool Function HourIsInRange(Float fHour, Float fHourStart, Float fHourEnd) Global

	; "Smart" test for fHour being withing a range.
	; Works both with "day" ranges (e.g., 06:00- 20:00) and with "night" ranges (e.g., 21:00-06:00)

	fHour      = NormalizeHour(fHour)
	fHourStart = NormalizeHour(fHourStart)
	fHourEnd   = NormalizeHour(fHourEnd)

	If fHourStart <= fHourEnd ; Something like 06:00 - 20:00
		Return (fHour >= fHourStart && fHour < fHourEnd)
	Else ; Something like 20:00 - 06:00
		Return (fHour >= fHourStart || fHour < fHourEnd)
	EndIf

EndFunction

Float Function AdjustTimePeriodByEngineTimerError(Float fUnadjustedPeriod) Global

	; In SE, the game time runs slower than the real time by about 2.5/60 second
	Return fUnadjustedPeriod - (2.5 * Math.Floor(fUnadjustedPeriod) / 60.0)

EndFunction