Back to Home

ESO Lua File v101044

ingame/tutorial/tutorial.lua

[◄ back to folders ]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
TUTORIAL_SYSTEM = nil
local function AreTutorialsEnabled()
    return GetSetting_Bool(SETTING_TYPE_TUTORIAL, TUTORIAL_ENABLED_SETTING_ID)
end
ZO_Tutorials = ZO_InitializingObject:Subclass()
function ZO_Tutorials:Initialize(control)
    self.control = control
    self.tutorialHandlers = {}
    self.tutorialQueue = {}
    -- Events that have no TutorialTriggerHandler
    local function OnDisplayTutorial(eventCode, ...)
        self:DisplayOrQueueTutorial(...)
    end
    control:RegisterForEvent(EVENT_DISPLAY_TUTORIAL, OnDisplayTutorial)
    control:RegisterForEvent(EVENT_DISPLAY_TUTORIAL_WITH_ANCHOR, OnDisplayTutorial)
    control:RegisterForEvent(EVENT_REMOVE_TUTORIAL, function(eventCode, ...) self:OnRemoveTutorial(...) end)
    control:RegisterForEvent(EVENT_TUTORIAL_SYSTEM_ENABLED_STATE_CHANGED, function(eventCode, enabled) self:OnTutorialEnabledStateChanged(enabled) end)
    do
        local triggerHandlers = ZO_Tutorial_GetTriggerHandlers()
        local function OnTriggeredEvent(eventCode, ...)
            local tutorialTypeToTrigger = triggerHandlers[eventCode](...)
            if tutorialTypeToTrigger then
                TriggerTutorial(tutorialTypeToTrigger)
            end
        end
        -- Unfortunate events that overlap with tutorial triggers
        local hasPlayerActivatedEvent = triggerHandlers[EVENT_PLAYER_ACTIVATED] ~= nil
        control:RegisterForEvent(EVENT_PLAYER_ACTIVATED, function(...)
            if hasPlayerActivatedEvent then
                OnTriggeredEvent(...)
            end
            -- Dequeue tutorial display events
            local nextTutorialCallback = table.remove(self.tutorialQueue, 1)
            while nextTutorialCallback do
                nextTutorialCallback()
                nextTutorialCallback = table.remove(self.tutorialQueue, 1)
            end
        end)
        for event in pairs(triggerHandlers) do
            if event ~= EVENT_PLAYER_ACTIVATED then -- Handled above
                control:RegisterForEvent(event, OnTriggeredEvent)
            end
        end
    end
    self:AddTutorialHandler(ZO_BriefHudTutorial:New(control))
    self:AddTutorialHandler(ZO_HudInfoTutorial:New(control))
    self:AddTutorialHandler(ZO_UiInfoBoxTutorial:New(control))
    if IsKeyboardUISupported() then
        self:AddTutorialHandler(ZO_PointerBoxTutorial:New(control))
    end
end
function ZO_Tutorials:DisplayOrQueueTutorial(tutorialIndex, ...)
    local currentScene = SCENE_MANAGER:GetCurrentScene()
    if currentScene == nil then
        -- Queue Tutorial
        local optionalParameters = {...}
        table.insert(self.tutorialQueue, function() self:OnDisplayTutorial(tutorialIndex, unpack(optionalParameters)) end)
    else
        self:OnDisplayTutorial(tutorialIndex, ...)
    end
end
function ZO_Tutorials:AddTutorialHandler(handler)
    self.tutorialHandlers[handler:GetTutorialType()] = handler
end
function ZO_Tutorials:SuppressTutorialType(tutorialType, suppress, reason)
    if self.tutorialHandlers[tutorialType] then
        self.tutorialHandlers[tutorialType]:SuppressTutorials(suppress, reason)
    end
end
function ZO_Tutorials:RegisterTriggerLayoutInfo(tutorialType, ...)
    if self.tutorialHandlers[tutorialType] then
        self.tutorialHandlers[tutorialType]:RegisterTriggerLayoutInfo(...)
    end
end
function ZO_Tutorials:RemoveTutorialByTrigger(tutorialType, tutorialTrigger)
    if self.tutorialHandlers[tutorialType] then
        self.tutorialHandlers[tutorialType]:RemoveTutorialByTrigger(tutorialTrigger)
    end
end
function ZO_Tutorials:OnTutorialEnabledStateChanged(enabled)
    if not enabled then
        for type, handler in pairs(self.tutorialHandlers) do
            handler:ClearAll()
        end
    end
end
function ZO_Tutorials:ForceRemoveAll()
    for type, handler in pairs(self.tutorialHandlers) do
        local tutorialIndex = handler:GetCurrentlyDisplayedTutorialIndex()
        if tutorialIndex then
            handler:OnRemoveTutorial(tutorialIndex)
        end
    end
end
function ZO_Tutorials:OnDisplayTutorial(tutorialIndex, ...)
    local tutorialType = GetTutorialType(tutorialIndex)
    if self.tutorialHandlers[tutorialType] then
        local priority = GetTutorialDisplayPriority(tutorialIndex)
        self.tutorialHandlers[tutorialType]:OnDisplayTutorial(tutorialIndex, priority, ...)
    end
end
function ZO_Tutorials:OnRemoveTutorial(tutorialIndex)
    local tutorialType = GetTutorialType(tutorialIndex)
    if self.tutorialHandlers[tutorialType] then
        self.tutorialHandlers[tutorialType]:OnRemoveTutorial(tutorialIndex)
    end
end
function ZO_Tutorials:ShowHelp()
    for type, handler in pairs(self.tutorialHandlers) do
        if handler:ShowHelp() then
            return true
        end
    end
    return false
end
function ZO_Tutorials:TriggerTutorialWithDeferredAction(triggerType, tutorialCompletedCallback)
    local triggerEventTag = "ZO_TutorialTrigger"..triggerType
    
    local function OnTutorialTriggerCompleted(eventCode, completedTriggerType)
        if completedTriggerType == triggerType then
            EVENT_MANAGER:UnregisterForEvent(triggerEventTag, EVENT_TUTORIAL_TRIGGER_COMPLETED)
            tutorialCompletedCallback()
        end
    end
    EVENT_MANAGER:RegisterForEvent(triggerEventTag, EVENT_TUTORIAL_TRIGGER_COMPLETED, OnTutorialTriggerCompleted)
    TriggerTutorial(triggerType)
end
    TUTORIAL_SYSTEM = ZO_Tutorials:New(control)
end