125 lines
3.8 KiB
Plaintext
125 lines
3.8 KiB
Plaintext
|
Scriptname _00E_RandomConv_DebugTrackingSC extends Quest Conditional
|
||
|
|
||
|
|
||
|
;=====================================================================================
|
||
|
; EVENTS
|
||
|
;=====================================================================================
|
||
|
|
||
|
Event OnStoryDialogue(Location akLocation, ObjectReference akActor1, ObjectReference akActor2)
|
||
|
SpamCount += 1
|
||
|
|
||
|
RegisterForModEvent("IdleChatterOff", "OnIdleChatterOff")
|
||
|
If NextQuestGlobal
|
||
|
RegisterForModEvent("NextRandomConversationGlobalChanged", "OnNextRandomConversationGlobalChanged")
|
||
|
EndIf
|
||
|
RegisterForSingleUpdate(3 * 60)
|
||
|
EndEvent
|
||
|
|
||
|
Event OnUpdate()
|
||
|
; Force-stop no matter what (probably the quest got stuck)
|
||
|
OnSceneEnd()
|
||
|
EndEvent
|
||
|
|
||
|
Event OnIdleChatterOff(String eventName, String strArg, Float numArg, Form sender)
|
||
|
; Abandon waiting and force-stop if idle chatter just became disabled
|
||
|
OnSceneEnd()
|
||
|
EndEvent
|
||
|
|
||
|
Event OnNextRandomConversationGlobalChanged(String eventName, String strArg, Float numArg, Form sender)
|
||
|
; Abandon waiting and force-stop if some other conversation just updated the same NextQuestGlobal
|
||
|
If NextQuestGlobal.GetValue() > GameDaysPassed.GetValue()
|
||
|
OnSceneEnd()
|
||
|
EndIf
|
||
|
EndEvent
|
||
|
|
||
|
|
||
|
;=====================================================================================
|
||
|
; FUNCTIONS
|
||
|
;=====================================================================================
|
||
|
|
||
|
Function UpdateNextTimes()
|
||
|
Float dayPassed = GameDaysPassed.GetValue()
|
||
|
|
||
|
If NextQuestGlobal
|
||
|
NextQuestGlobal.SetValue(dayPassed + BRANCH_PERIOD)
|
||
|
EndIf
|
||
|
|
||
|
If NextPackageGlobal
|
||
|
NextPackageGlobal.SetValue(dayPassed + PACKAGE_PERIOD)
|
||
|
EndIf
|
||
|
|
||
|
RunCount += 1
|
||
|
If IsRareConversation
|
||
|
NextRunTime = dayPassed + QUEST_PERIOD_RARE * (RunCount as Float)
|
||
|
Else
|
||
|
; The formula: p * (r + 1) / 2, which means:
|
||
|
; QUEST_PERIOD cooldown between the 1st and 2nd run of the conversasion
|
||
|
; then it adds half of QUEST_PERIOD to the cooldown for each next run
|
||
|
NextRunTime = dayPassed + QUEST_PERIOD * ((RunCount as Float) + 1.0) / 2.0
|
||
|
EndIf
|
||
|
|
||
|
If NextQuestGlobal
|
||
|
; Notify other running quests from the same branch that we just started this one
|
||
|
SendModEvent("NextRandomConversationGlobalChanged")
|
||
|
EndIf
|
||
|
EndFunction
|
||
|
|
||
|
Float Function CalcCooldownPeriod(Float fWaitPeriod, Float fPenaltyPerRun)
|
||
|
Return fWaitPeriod + (RunCount as Float) * fPenaltyPerRun
|
||
|
EndFunction
|
||
|
|
||
|
Function OnSceneStart()
|
||
|
SpamCount = 0 ; Reset spam counter on successful start of the scene
|
||
|
|
||
|
UnregisterForAllModEvents()
|
||
|
RegisterForSingleUpdate(3 * 60)
|
||
|
UpdateNextTimes()
|
||
|
EndFunction
|
||
|
|
||
|
Function OnSceneEnd()
|
||
|
If SpamCount > MAX_SPAM_COUNT
|
||
|
Float nextTime = GameDaysPassed.GetValue() + 0.25
|
||
|
|
||
|
If NextQuestGlobal && NextQuestGlobal.GetValue() < nextTime
|
||
|
NextQuestGlobal.SetValue(nextTime)
|
||
|
EndIf
|
||
|
|
||
|
If NextPackageGlobal && NextPackageGlobal.GetValue() < nextTime
|
||
|
NextPackageGlobal.SetValue(nextTime)
|
||
|
EndIf
|
||
|
|
||
|
If NextRunTime < nextTime
|
||
|
NextRunTime = nextTime
|
||
|
EndIf
|
||
|
|
||
|
SpamCount = 0
|
||
|
EndIf
|
||
|
|
||
|
UnregisterForAllModEvents()
|
||
|
UnregisterForUpdate()
|
||
|
UnregisterForUpdateGameTime()
|
||
|
Stop()
|
||
|
EndFunction
|
||
|
|
||
|
|
||
|
;=====================================================================================
|
||
|
; PROPERTIES
|
||
|
;=====================================================================================
|
||
|
|
||
|
Float Property BRANCH_PERIOD = 1.0 AutoReadOnly ; In days
|
||
|
Float Property QUEST_PERIOD = 7.0 AutoReadOnly ; In days
|
||
|
Float Property QUEST_PERIOD_RARE = 15.0 AutoReadOnly ; In days
|
||
|
Float Property PACKAGE_PERIOD = 3.0 AutoReadOnly ; In days
|
||
|
|
||
|
GlobalVariable Property NextQuestGlobal Auto
|
||
|
GlobalVariable Property NextPackageGlobal Auto
|
||
|
GlobalVariable Property GameDaysPassed Auto
|
||
|
|
||
|
Bool Property IsRareConversation = False Auto
|
||
|
|
||
|
Float Property NextRunTime Auto Conditional Hidden
|
||
|
|
||
|
Int Property RunCount Auto Hidden
|
||
|
Int Property SpamCount Auto Hidden
|
||
|
Int Property MAX_SPAM_COUNT = 10 AutoReadOnly
|