Back to Home

ESO Lua File v100033

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
TUTORIAL_SYSTEM = nil
local function AreTutorialsEnabled()
    return GetSetting_Bool(SETTING_TYPE_TUTORIAL, TUTORIAL_ENABLED_SETTING_ID)
end
ZO_Tutorials = ZO_Object:Subclass()
function ZO_Tutorials:New(...)
    local tutorial = ZO_Object.New(self)
    tutorial:Initialize(...)
    return tutorial
end
function ZO_Tutorials:Initialize(control)
    self.control = control
    self.tutorialHandlers = {}
    self.tutorialQueue = {}
    -- Events that have no TutorialTriggerHandler
    control:RegisterForEvent(EVENT_DISPLAY_TUTORIAL, function(eventCode, ...) self:DisplayOrQueueTutorial(...) end)
    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
            -- I use a while loop just in case the list changes while I'm calling the tutorial function
            while #self.tutorialQueue > 0 do 
                self.tutorialQueue[1]()
                table.remove(self.tutorialQueue, 1)
            end
        end)
        for event in pairs(triggerHandlers) do
            if event ~= EVENT_PLAYER_ACTIVATED then --avoid ones we've already registered
                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, priority)
    local currentScene = SCENE_MANAGER:GetCurrentScene()
    if currentScene == nil then
       -- Queue Tutorial
       self.tutorialQueue[#self.tutorialQueue + 1] = function() self:OnDisplayTutorial(tutorialIndex, priority) end
    else
        self:OnDisplayTutorial(tutorialIndex, priority)
    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
        if handler:GetCurrentlyDisplayedTutorialIndex() then
        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