Back to Home

ESO Lua File v101044

ingame/tooltip/skilltooltips.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
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
--showRankNeededLine: adds a line with the skill line rank needed to unlock the specific progression
--showPointSpendLine: adds a line telling the user they can spend a skill point to purchase/upgrade/morph the ability
--showAdvisedLine: adds a line if the skill progression is advised
--showRespecToFixBadMorphLine: adds a line telling the player to respec if the player has chosen the incorrect (not-advised) morph
--showUpgradeInfoBlock: adds a block of text explaining what upgrading the skill does. For passives it adds the next rank description below the current. For morphs it adds text explaining what the morph changes.
--shouldOverrideRankForComparison: changes the tooltip to reference rank 1 instead of the rank the player has and removes the skill XP bar.
function ZO_Tooltip:LayoutSkillProgression(skillProgressionData, showRankNeededLine, showPointSpendLine, showAdvisedLine, showRespecToFixBadMorphLine, showUpgradeInfoBlock, shouldOverrideRankForComparison)
    local skillData = skillProgressionData:GetSkillData()
    local skillLineData = skillData:GetSkillLineData()
    local isPassive = skillData:IsPassive()
    local isActive = not isPassive
    local isCraftedAbility = skillData:IsCraftedAbility()
    if isCraftedAbility then
        -- We always want to show the actual skill, never an override
    end
    local isNonCraftedActive = isActive and not isCraftedAbility
    local skillPointAllocator = skillData:GetPointAllocator()
    local isPurchased = skillPointAllocator:IsPurchased()
    local headerSection = self:AcquireSection(self:GetStyle("abilityHeaderSection"))
    --Rank Needed Line
    local hadRankNeededLineToShow = false
    if showRankNeededLine then
        if not isPurchased then
            --Skill progression data is the skill progression data that would be isPurchased
            local isLocked = skillProgressionData:IsLocked()
            if isLocked then
                local skillLineName = skillLineData:GetName()
                local lineRankNeededToPurchase = skillData:GetLineRankNeededToPurchase()
                headerSection:AddLine(zo_strformat(SI_ABILITY_UNLOCKED_AT, skillLineName, lineRankNeededToPurchase), self:GetStyle("failed"), self:GetStyle("abilityHeader"))
                hadRankNeededLineToShow = true
            end
        else
            if isPassive then
                --Skill progression data is the skill progression data that is being upgraded from
                local nextSkillProgressionData = skillProgressionData:GetNextRankData()
                if nextSkillProgressionData then
                    local isLocked = nextSkillProgressionData:IsLocked()
                    if isLocked then
                        local skillLineName = skillLineData:GetName()
                        local lineRankNeededToUnlock = nextSkillProgressionData:GetLineRankNeededToUnlock()
                        headerSection:AddLine(zo_strformat(SI_SKILL_ABILITY_TOOLTIP_UPGRADE_UNLOCK_INFO, skillLineName, lineRankNeededToUnlock), self:GetStyle("failed"), self:GetStyle("abilityHeader"))
                        hadRankNeededLineToShow = true
                    end
                end
            end
        end
    end
    --Skill Point Spending Line
    if showPointSpendLine and not hadRankNeededLineToShow and skillPointAllocator:GetProgressionData() == skillProgressionData then
        local hasAvailableSkillPoint = SKILL_POINT_ALLOCATION_MANAGER:GetAvailableSkillPoints() > 0
        if not isPurchased then
            --Skill progression data is the skill progression data that would be isPurchased
            local isLocked = skillProgressionData:IsLocked()
            if not isLocked then
                if hasAvailableSkillPoint then
                    headerSection:AddLine(GetString(SI_ABILITY_PURCHASE), self:GetStyle("succeeded"), self:GetStyle("abilityHeader"))
                else
                    headerSection:AddLine(GetString(SI_ABILITY_PURCHASE), self:GetStyle("failed"), self:GetStyle("abilityHeader"))
                end
            end
        else
            if isNonCraftedActive then
                if skillProgressionData:IsBase() and skillData:IsAtMorph()  then
                    if hasAvailableSkillPoint then
                        headerSection:AddLine(GetString(SI_ABILITY_AT_MORPH_POINT), self:GetStyle("succeeded"), self:GetStyle("abilityHeader"))
                    else
                        headerSection:AddLine(GetString(SI_ABILITY_AT_MORPH_POINT), self:GetStyle("failed"), self:GetStyle("abilityHeader"))
                    end
                end
            elseif isPassive then
                --Skill progression data is the skill progression data that is being upgrade from
                local nextSkillProgressionData = skillProgressionData:GetNextRankData()
                if nextSkillProgressionData then
                    local isLocked = nextSkillProgressionData:IsLocked()
                    if not isLocked then
                        if hasAvailableSkillPoint then
                            headerSection:AddLine(GetString(SI_ABILITY_UPGRADE), self:GetStyle("succeeded"), self:GetStyle("abilityHeader"))
                        else
                            headerSection:AddLine(GetString(SI_ABILITY_UPGRADE), self:GetStyle("failed"), self:GetStyle("abilityHeader"))
                        end
                    end
                end
            end
        end
    end
    --Advised Line
    if showAdvisedLine then
        if isNonCraftedActive and skillProgressionData:IsMorph() then
            local morphSiblingProgressionData = skillProgressionData:GetSiblingMorphData()
            local morphSiblingInSelectedSkillBuild = morphSiblingProgressionData:IsAdvised()
            if skillProgressionData:IsAdvised() and not morphSiblingInSelectedSkillBuild then
                headerSection:AddLine(GetString(SI_SKILLS_ADVISOR_GAMEPAD_ADVISED_SKILL), self:GetStyle("succeeded"), self:GetStyle("abilityHeader"))
            end
        else
            if skillProgressionData:IsAdvised() then
                headerSection:AddLine(GetString(SI_SKILLS_ADVISOR_GAMEPAD_ADVISED_SKILL), self:GetStyle("succeeded"), self:GetStyle("abilityHeader"))
            end
        end
    end
    --Respec To Fix Bad Morph Line
    if showRespecToFixBadMorphLine then
        if isNonCraftedActive and skillProgressionData:IsBadMorph() then
            headerSection:AddLine(GetString(SI_ABILITY_TOOLTIP_NOT_ADVISED_SUGGESTION), self:GetStyle("bodyHeader"), self:GetStyle("abilityHeader"))
        end
    end
        
    --Passives and actives can both show a block of text that explains what upgrading or morphing them will change but they are done different ways.
    local passiveUpgradeSectionSkillProgressionData
    local addNewEffects = false
    if showUpgradeInfoBlock then
        if isPassive then
            if isPurchased then
                local passiveRank = skillProgressionData:GetRank()
                if passiveRank < skillData:GetNumRanks() then
                    passiveUpgradeSectionSkillProgressionData = skillData:GetRankData(passiveRank + 1)
                end
            end
        else
            addNewEffects = true
        end
    end
    --Morphed From Header
    if isNonCraftedActive and skillProgressionData:IsMorph() then
        local baseMorphProgressionData = skillData:GetMorphData(MORPH_SLOT_BASE)
        headerSection:AddLine(zo_strformat(SI_ABILITY_TOOLTIP_MORPHS_FROM, baseMorphProgressionData:GetName()), self:GetStyle("abilityHeader"))
    end
    self:AddSectionEvenIfEmpty(headerSection)
    --Ability Tooltip
    local nameRank
    local activeRank
    if not isCraftedAbility then
        if shouldOverrideRankForComparison then
            if isActive then
                activeRank = 1
            end
            nameRank = 1
        else
            if isActive then
                activeRank = skillProgressionData:GetCurrentRank()
                nameRank = activeRank
            else
                nameRank = skillProgressionData:GetRank()
            end
        end
    end
    --if you have never owned an active then the rank is nil and we show no rank in the title
    if nameRank == nil then
        self:AddLine(skillProgressionData:GetFormattedName(), self:GetStyle("title"))
    else
        local name = skillProgressionData:GetName()
        local formattedNameAndRank = ZO_CachedStrFormat(SI_ABILITY_NAME_AND_RANK, name, nameRank)
        self:AddLine(formattedNameAndRank, self:GetStyle("title"))
    end
    if isNonCraftedActive then
        --No point in showing the current XP if we overriding the rank anyway
        if not shouldOverrideRankForComparison then
            local currentRank = skillProgressionData:GetCurrentRank()
            --if you have never owned an active then the rank is nil and we don't show an XP bar
            if currentRank then
                local currentXP = skillProgressionData:GetCurrentXP()
                local lastRankXP, nextRankXP = skillProgressionData:GetRankXPExtents(currentRank)
                self:AddAbilityProgressBar(currentXP, lastRankXP, nextRankXP)
            end
        end
    end
    if isActive then
        self:AddAbilityStats(skillProgressionData:GetAbilityId(), activeRank)
    end
    if addNewEffects then
        self:AddAbilityNewEffects(GetAbilityNewEffectLines(skillProgressionData:GetAbilityId()))
    end
    local descriptionText = GetAbilityDescription(skillProgressionData:GetAbilityId(), activeRank)
    self:AddAbilityDescription(skillProgressionData:GetAbilityId(), descriptionText)
    --Passive Upgrade Section
    if passiveUpgradeSectionSkillProgressionData then
        local newEffectSection = self:AcquireSection(self:GetStyle("bodySection"))
        newEffectSection:AddLine(GetString(SI_ABILITY_TOOLTIP_NEXT_RANK), self:GetStyle("newEffectTitle"), self:GetStyle("bodyHeader"))      
        local description = GetAbilityDescription(passiveUpgradeSectionSkillProgressionData:GetAbilityId())
        newEffectSection:AddLine(description, self:GetStyle("newEffectBody"), self:GetStyle("bodyDescription"))
        self:AddSection(newEffectSection)
    end
end
-- In most cases, you should prefer LayoutSkillProgressionData(), which carries inside of it the abilityId associated with that progression.
-- This is for cases where we might want to show an ability that is indirectly associated with a progression, like for example a chain ability.
function ZO_Tooltip:LayoutAbilityWithSkillProgressionData(abilityId, skillProgressionData)
    local abilityName = GetAbilityName(abilityId)
    local currentRank = skillProgressionData:HasRankData() and skillProgressionData:GetCurrentRank()
    if currentRank then
        local headerSection = self:AcquireSection(self:GetStyle("abilityHeaderSection"))
        --Morphed From Header
        local skillData = skillProgressionData:GetSkillData()
        local isNonCraftedActive = not skillData:IsPassive() and not skillData:IsCraftedAbility()
        if isNonCraftedActive and skillProgressionData:IsMorph() then
            local baseMorphProgressionData = skillData:GetMorphData(MORPH_SLOT_BASE)
            headerSection:AddLine(zo_strformat(SI_ABILITY_TOOLTIP_MORPHS_FROM, baseMorphProgressionData:GetName()), self:GetStyle("abilityHeader"))
        end
        self:AddSectionEvenIfEmpty(headerSection)
        local formattedNameAndRank = ZO_CachedStrFormat(SI_ABILITY_NAME_AND_RANK, abilityName, currentRank)
        self:AddLine(formattedNameAndRank, self:GetStyle("title"))
        local currentXP = skillProgressionData:GetCurrentXP()
        local lastRankXP, nextRankXP = skillProgressionData:GetRankXPExtents(currentRank)
        self:AddAbilityProgressBar(currentXP, lastRankXP, nextRankXP)
        self:AddAbilityStats(abilityId, currentRank)
        local descriptionText = GetAbilityDescription(abilityId, currentRank)
        self:AddAbilityDescription(abilityId, descriptionText)
    else
        self:LayoutSimpleAbility(abilityId)
    end
end
do
    local ATTRIBUTE_DESCRIPTIONS =
    {
        [ATTRIBUTE_HEALTH] = SI_ATTRIBUTE_TOOLTIP_HEALTH,
        [ATTRIBUTE_MAGICKA] = SI_ATTRIBUTE_TOOLTIP_MAGICKA,
        [ATTRIBUTE_STAMINA] = SI_ATTRIBUTE_TOOLTIP_STAMINA,
    }
    function ZO_Tooltip:LayoutAttributeInfo(attributeType, pendingBonus)
        -- We don't show any attribute stat increases while in battle leveled zones because
        -- it doesn't make any sense based on how battle leveling now works
        if not (IsUnitChampionBattleLeveled("player") or IsUnitBattleLeveled("player")) then
            local statType = STAT_TYPES[attributeType]
            local statsSection = self:AcquireSection(self:GetStyle("attributeStatsSection"))
            local attributePair = statsSection:AcquireStatValuePair(self:GetStyle("statValuePair"))
        
            attributePair:SetStat(zo_strformat(SI_STAT_NAME_FORMAT, GetString("SI_DERIVEDSTATS", statType)), self:GetStyle("statValuePairStat"))
            attributePair:SetValue(GetPlayerStat(statType) + pendingBonus, self:GetStyle("statValuePairValue"))
            statsSection:AddStatValuePair(attributePair)
            if pendingBonus > 0 then
                local upgradePair = statsSection:AcquireStatValuePair(self:GetStyle("attributeUpgradePair"))
                upgradePair:SetStat(zo_strformat(SI_GAMEPAD_LEVELUP_PENDING_BONUS_LABEL, GetString("SI_ATTRIBUTES", attributeType)), self:GetStyle("statValuePairStat"))
                upgradePair:SetValue(zo_strformat(SI_STAT_PENDING_BONUS_FORMAT, pendingBonus), self:GetStyle("succeeded"), self:GetStyle("statValuePairValue"))
                statsSection:AddStatValuePair(upgradePair)
            end
            self:AddSection(statsSection)
        end
        local descriptionSection = self:AcquireSection(self:GetStyle("bodySection"))
        descriptionSection:AddLine(GetString(ATTRIBUTE_DESCRIPTIONS[attributeType]), self:GetStyle("bodyDescription"))
        self:AddSection(descriptionSection)
    end
end
function ZO_Tooltip:LayoutCompanionSkillProgression(skillProgressionData)
    local abilityId = skillProgressionData:GetAbilityId()
    local headerSection = self:AcquireSection(self:GetStyle("abilityHeaderSection"))
    --Unlocks at rank X
    if not skillProgressionData:IsUnlocked() then
        local skillData = skillProgressionData:GetSkillData()
        local skillLineData = skillData:GetSkillLineData()
        local skillLineName = skillLineData:GetName()
        local lineRankNeededToUnlock = skillData:GetSkillLineRankRequired()
        headerSection:AddLine(zo_strformat(SI_ABILITY_UNLOCKED_AT, skillLineName, lineRankNeededToUnlock), self:GetStyle("failed"), self:GetStyle("abilityHeader"))
    end
    self:AddSectionEvenIfEmpty(headerSection)
    local formattedAbilityName = ZO_CachedStrFormat(SI_ABILITY_NAME, GetAbilityName(abilityId))
    self:AddLine(formattedAbilityName, self:GetStyle("title"))
    local NO_OVERRIDE_RANK = nil
    if not IsAbilityPassive(abilityId) then
        self:AddAbilityStats(abilityId, NO_OVERRIDE_RANK, "companion")
    end
    local NO_OVERRIDE_DESCRIPTION = nil
    self:AddAbilityDescription(abilityId, NO_OVERRIDE_DESCRIPTION, "companion")
end
function ZO_Tooltip:LayoutSkillLinePreview(skillLineData)
    if skillLineData:IsAvailable() then
        local skillsSection = self:AcquireSection(self:GetStyle("skillLinePreviewBodySection"))
        local lastHeader = nil
        local function IsSkillVisible(skillData)
            return not skillData:IsHidden()
        end
        for _, skillData in skillLineData:SkillIterator({ IsSkillVisible }) do
            local currentHeader = skillData:GetHeaderText()
            if lastHeader ~= currentHeader then
                local headerSection = self:AcquireSection(self:GetStyle("skillLineEntryHeaderSection"))
                headerSection:AddLine(currentHeader, self:GetStyle("skillLineEntryHeader"))
                skillsSection:AddSection(headerSection)
                lastHeader = currentHeader
            end
            local rowControl = self:AcquireCustomControl(self:GetStyle("skillLineEntryRow"))
            ZO_GamepadSkillEntryPreviewRow_Setup(rowControl, skillData)
            local narrations = self:GetSkillLineNarrationText(skillData)
            skillsSection:AddCustomControl(rowControl, narrations)
        end
        self:AddSection(skillsSection)
    elseif skillLineData:IsAdvised() then
        self:LayoutTitleAndMultiSectionDescriptionTooltip(skillLineData:GetFormattedName(), skillLineData:GetUnlockText())
    end
end
-- Returns narration text for a skill, formatted with upgrade status and bindings.
-- returns: (string) "<detailed skill name>[ Upgradable/Purchasable/Morphed/Locked][, bound to <key or button input>]"
-- ex: "Scorch IV, Purchasable, bound to 3"
function ZO_Tooltip:GetSkillLineNarrationText(skillData)
    local narration = ""
    
    local skillProgressionData = skillData:GetPointAllocatorProgressionData()
    local skillPointAllocator = skillData:GetPointAllocator()
    local isActive = skillData:IsActive()
    local isNonCraftedActive = isActive and not skillData:IsCraftedAbility()
    local isMorph = isNonCraftedActive and skillProgressionData:IsMorph()
    local increaseAction = skillPointAllocator:GetIncreaseSkillAction()
    
    -- Annotate the skill name with available actions.
    local skillName = skillProgressionData:GetDetailedGamepadName()
    if increaseAction == ZO_SKILL_POINT_ACTION.PURCHASE then
        narration = zo_strformat(SI_TOOLTIP_SKILLS_SKILL_PURCHASABLE_NARRATION, skillName)
    elseif increaseAction == ZO_SKILL_POINT_ACTION.INCREASE_RANK then
        narration = zo_strformat(SI_TOOLTIP_SKILLS_SKILL_UPGRADABLE_NARRATION, skillName)
    elseif increaseAction == ZO_SKILL_POINT_ACTION.MORPH then
        narration = zo_strformat(SI_TOOLTIP_SKILLS_SKILL_MORPHED_NARRATION, skillName)
    elseif not skillProgressionData:IsUnlocked() then
        narration = zo_strformat(SI_TOOLTIP_SKILLS_SKILL_LOCKED_NARRATION, skillName)
    else
        narration = skillName
    end
    -- Append ", bound to [key]" if applicable.
    local actionSlotIndex = skillData:GetSlotOnCurrentHotbar()
    if actionSlotIndex then
        local hotbarCategory = overrideHotbar or ACTION_BAR_ASSIGNMENT_MANAGER:GetCurrentHotbarCategory()
        local keyboardActionName, gamepadActionName = ACTION_BAR_ASSIGNMENT_MANAGER:GetKeyboardAndGamepadActionNameForSlot(actionSlotIndex, hotbarCategory)
        local inputBindingText = ZO_Keybindings_GetPreferredHighestPriorityNarrationStringFromActions(keyboardActionName, gamepadActionName, DEFAULT_SHOW_AS_HOLD) or GetString(SI_ACTION_IS_NOT_BOUND)
        
        narration = zo_strformat(SI_TOOLTIP_SKILLS_SKILL_BOUND_TO_NARRATION, narration, inputBindingText)
    end
    return narration
end
function ZO_Tooltip:LayoutCompanionSkillLinePreview(skillLineData)
    if skillLineData:IsAvailable() then
        local skillsSection = self:AcquireSection(self:GetStyle("skillLinePreviewBodySection"))
        local lastHeader = nil
        for _, skillData in skillLineData:SkillIterator() do
            local currentHeader = skillData:GetHeaderText()
            if lastHeader ~= currentHeader then
                local headerSection = self:AcquireSection(self:GetStyle("companionSkillLineEntryHeaderSection"))
                headerSection:AddLine(currentHeader, self:GetStyle("skillLineEntryHeader"))
                skillsSection:AddSection(headerSection)
                lastHeader = currentHeader
            end
            local rowControl = self:AcquireCustomControl(self:GetStyle("companionSkillLineEntryRow"))
            ZO_GamepadSkillEntryPreviewRow_Setup(rowControl, skillData)
            skillsSection:AddCustomControl(rowControl)
        end
        self:AddSection(skillsSection)
    elseif skillLineData:IsAdvised() then
        self:LayoutTitleAndMultiSectionDescriptionTooltip(skillLineData:GetFormattedName(), skillLineData:GetUnlockText())
    end
end
do
    local COMPANION_SKILLS_FILTER =
    {
        function(actionSlotData)
            return actionSlotData:GetSlottableActionType() == ZO_SLOTTABLE_ACTION_TYPE_COMPANION_SKILL
        end,
    }
    function ZO_Tooltip:LayoutEquippedCompanionSkillsPreview()
        local skillSection = self:AcquireSection(self:GetStyle("bodySection"))
        local hotbar = ACTION_BAR_ASSIGNMENT_MANAGER:GetHotbar(HOTBAR_CATEGORY_COMPANION)
        for slotIndex, slotData in hotbar:SlotIterator(COMPANION_SKILLS_FILTER) do
            local rowControl = self:AcquireCustomControl(self:GetStyle("companionSkillLineEntryRow"))
            ZO_GamepadSkillEntryPreviewRow_Setup(rowControl, slotData:GetCompanionSkillData())
            skillSection:AddCustomControl(rowControl)
        end
        self:AddSection(skillSection)
    end
end