enderalse/source/scripts/_00e_weathercontrolscriptsc.psc

271 lines
7.1 KiB
Plaintext

Scriptname _00E_WeatherControlScriptSC extends ReferenceAlias
Int iScriptVersion = 0
Int Property LATEST_SCRIPT_VERSION = 1 AutoReadOnly
Event OnInit()
iScriptVersion = LATEST_SCRIPT_VERSION
iCurrentWeather = WEATHER_NONE
EndEvent
Event OnPlayerLoadGame()
If iScriptVersion < LATEST_SCRIPT_VERSION
iScriptVersion = LATEST_SCRIPT_VERSION
; Release weather overrides from the previous version
If AreSpecialWeathersEnabled()
If LocationIsSuntemple(GetPlayerLocation())
If IsSuntempleSpecialWeatherActive()
Weather.ReleaseOverride()
EndIf
ElseIf LocationIsArk(GetPlayerLocation())
If IsArkSpecialWeatherActive()
Weather.ReleaseOverride()
EndIf
EndIf
EndIf
iCurrentWeather = WEATHER_NONE
UpdateWeathers(True)
EndIf
EndEvent
Event OnLocationChange(Location akOldLoc, Location akNewLoc)
If AreSpecialWeathersEnabled() == False
Return
EndIf
Bool bSuntempleSpecialWeather = IsSuntempleSpecialWeatherActive()
Bool bArkSpecialWeather = IsArkSpecialWeatherActive()
If bSuntempleSpecialWeather == False && bArkSpecialWeather == False
iCurrentWeather = WEATHER_NONE
Return
EndIf
Int iNewWeather = WEATHER_NONE
Bool bDoGameTimeUpdates = False
Bool bGradualTransition = False
If bSuntempleSpecialWeather && LocationIsSuntemple(akNewLoc)
bDoGameTimeUpdates = True
If ((iCurrentArkWeather == WEATHER_OVERCAST) || (iCurrentArkWeather == WEATHER_RAIN)) && LocationIsArk(akOldLoc)
iCurrentSuntempleWeather = iCurrentArkWeather ; Keep the weather from Ark if it suits
ElseIf (iCurrentSuntempleWeather != WEATHER_OVERCAST) && (iCurrentSuntempleWeather != WEATHER_RAIN)
iCurrentSuntempleWeather = RollSuntempleWeather()
EndIf
iNewWeather = iCurrentSuntempleWeather
If GetActorReference().GetWorldSpace() == CapitalCityCastleWorld
bGradualTransition = True
EndIf
ElseIf bArkSpecialWeather && LocationIsArk(akNewLoc)
bDoGameTimeUpdates = True
If (iCurrentSuntempleWeather != WEATHER_REROLL) && LocationIsSuntemple(akOldLoc)
iCurrentArkWeather = iCurrentSuntempleWeather ; Keep the weather from Suntemple if it suits
ElseIf iCurrentArkWeather == WEATHER_REROLL
iCurrentArkWeather = RollArkWeather()
EndIf
iNewWeather = iCurrentArkWeather
WorldSpace curWorld = GetActorReference().GetWorldSpace()
If curWorld == Vyn || curWorld == CapitalCityCastleWorld
bGradualTransition = True
EndIf
ElseIf bArkSpecialWeather && akNewLoc == ArkSiegeWeatherEdge
; If we're leaving Ark's outskirts, keep the current Ark weather for a bit longer.
; This prevents frequent weather switches if we're wondering at the edge of the siege weather zone and regularly crossing that edge.
If (akOldLoc == CapitalCityLocation || akOldLoc == ArkSiegeWeather) && (iCurrentArkWeather == WEATHER_OVERCAST || iCurrentArkWeather == WEATHER_RAIN)
iNewWeather = iCurrentArkWeather
bGradualTransition = True
EndIf
EndIf
SetNewWeather(iNewWeather, bGradualTransition)
If bDoGameTimeUpdates
; If the timer is not running or we just entered Ark, (re)start the timer
If (bGameTimeUpdatesActive == False) || (LocationIsArk(akOldLoc) == False && LocationIsSuntemple(akOldLoc) == False)
bGameTimeUpdatesActive = True
RegisterForSingleUpdateGameTime(WEATHER_UPDATE_PERIOD)
EndIf
EndIf
EndEvent
Event OnUpdateGametime()
UpdateWeathers(False)
EndEvent
Function UpdateWeathers(Bool bForceUpdate)
bGameTimeUpdatesActive = False
If AreSpecialWeathersEnabled() == False
Return
EndIf
If bForceUpdate || (RollChance() > 50) ; Time to reroll weather?
If IsSuntempleSpecialWeatherActive() && LocationIsSuntemple(GetPlayerLocation())
bGameTimeUpdatesActive = True
iCurrentSuntempleWeather = RollSuntempleWeather()
SetNewWeather(iCurrentSuntempleWeather, True)
EndIf
If IsArkSpecialWeatherActive() && LocationIsArk(GetPlayerLocation())
bGameTimeUpdatesActive = True
iCurrentArkWeather = RollArkWeather()
SetNewWeather(iCurrentArkWeather, True)
EndIf
If bGameTimeUpdatesActive == False ; Not in Ark and not in Suntemple
iCurrentSuntempleWeather = WEATHER_REROLL
iCurrentArkWeather = WEATHER_REROLL
EndIf
Else
bGameTimeUpdatesActive = True
EndIf
If bGameTimeUpdatesActive
RegisterForSingleUpdateGameTime(WEATHER_UPDATE_PERIOD)
EndIf
EndFunction
Bool Function AreSpecialWeathersEnabled()
If MQ17.GetStage() >= 5
Return False
EndIf
Int mq12bStage = MQ12b.GetStage()
If mq12bStage >= 5 && mq12bStage < 135
Return False
EndIf
Return True
EndFunction
Bool Function IsSuntempleSpecialWeatherActive()
Return MQ09.IsCompleted()
EndFunction
Bool Function IsArkSpecialWeatherActive()
Return MQ12b.IsCompleted()
EndFunction
Bool Function LocationIsSuntemple(Location lc)
If lc
Return _00E_SuntempleLocations.HasForm(lc)
EndIf
Return False
EndFunction
Bool Function LocationIsArk(Location lc)
If lc
If (lc == CapitalCityLocation) || (lc == ArkSiegeWeather) || lc.isChild(CapitalCityLocation)
Return True
EndIf
EndIf
Return False
EndFunction
Int Function RollChance()
Return Utility.RandomInt(0, 100)
EndFunction
Int Function RollSuntempleWeather()
If RollChance() >= 50
Return WEATHER_OVERCAST
Else
Return WEATHER_RAIN
EndIf
EndFunction
Int Function RollArkWeather()
Int iChance = RollChance()
If iCurrentArkWeather == WEATHER_RAIN
If iChance >= 50
Return WEATHER_OVERCAST
Else
Return WEATHER_RAIN
EndIf
Else
If iChance > 80
Return WEATHER_NONE
ElseIf iChance < 40
Return WEATHER_RAIN
Else
Return WEATHER_OVERCAST
EndIf
EndIf
EndFunction
Function SetNewWeather(Int iNewWeather, Bool bGradualTransition)
If iNewWeather == iCurrentWeather
Return
EndIf
iCurrentWeather = iNewWeather
If iCurrentWeather == WEATHER_NONE
If _00E_MQ11c_SilberhainDeadWeather.GetValueInt() == 0
Weather.ReleaseOverride()
EndIf
ElseIf iCurrentWeather == WEATHER_OVERCAST
If bGradualTransition
_00E_EnderalOvercast.SetActive(True)
Else
_00E_EnderalOvercast.ForceActive(True)
EndIf
ElseIf iCurrentWeather == WEATHER_RAIN
If bGradualTransition
SkyrimOvercastRain.SetActive(True)
Else
SkyrimOvercastRain.ForceActive(True)
EndIf
Else
Debug.Trace(self + ", SetNewWeather: unsupported iNewWeather " + iNewWeather)
EndIf
EndFunction
Location Function GetPlayerLocation()
Return GetActorReference().GetCurrentLocation()
EndFunction
;Properties and Variables
Float Property WEATHER_UPDATE_PERIOD = 3.0 AutoReadOnly ; In hours
Int Property WEATHER_REROLL = 0 AutoReadOnly
Int Property WEATHER_OVERCAST = 1 AutoReadOnly
Int Property WEATHER_RAIN = 2 AutoReadOnly
Int Property WEATHER_NONE = 3 AutoReadOnly
Int iCurrentWeather = 0
Int iCurrentSuntempleWeather = 0
Int iCurrentArkWeather = 0
Bool bGameTimeUpdatesActive = False
Location Property CapitalCityLocation Auto
Location Property ArkSiegeWeather Auto
Location Property ArkSiegeWeatherEdge Auto
FormList Property _00E_SuntempleLocations Auto
Weather Property _00E_EnderalOvercast Auto
Weather Property SkyrimOvercastRain Auto
GlobalVariable Property _00E_MQ11c_SilberhainDeadWeather Auto
Quest Property MQ09 Auto
Quest Property MQ12b Auto
Quest Property MQ17 Auto
WorldSpace Property Vyn Auto
WorldSpace Property CapitalCityCastleWorld Auto