-
-
Notifications
You must be signed in to change notification settings - Fork 23
/
Copy pathTooltipParsing.lua
418 lines (405 loc) · 28.3 KB
/
TooltipParsing.lua
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
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
-- Pawn by Vger-Azjol-Nerub
-- www.vgermods.com
-- © 2006-2025 Travis Spomer. This mod is released under the Creative Commons Attribution-NonCommercial-NoDerivs 3.0 license.
-- See Readme.htm for more information.
--
-- Tooltip parsing strings
------------------------------------------------------------
-- For conciseness
local L = PawnLocal.TooltipParsing
if PawnLocal.ThousandsSeparator == "NBSP" then PawnLocal.ThousandsSeparator = "\194\160" end
local Key, Value
local NumberExpandedPattern = "(-?[%%d%%., ]+)"
if LARGE_NUMBER_SEPERATOR == "-" then
-- French Cataclysm Classic uses a hyphen as the thousands separator, which is insane. We only include that as a valid component
-- of a number in this specific case to limit the risk to other versions.
NumberExpandedPattern = "(-?[%%d%%., %-]+)"
end
for Key, Value in pairs(L) do
L[Key] = gsub(Value, "#", NumberExpandedPattern)
end
------------------------------------------------------------
-- Tooltip parsing expressions
------------------------------------------------------------
-- These strings indicate that a given line might contain multiple stats, such as complex enchantments
-- (ZG, AQ) and gems. These are sorted in priority order. If a string earlier in the table is present, any
-- string later in the table can be ignored.
PawnSeparators =
{
", ",
"/",
" & ",
" " .. L.MultiStatSeparator1 .. " ", -- and
}
-- Lines that match any of the following patterns will cause all further tooltip parsing to stop.
PawnKillLines =
{
"^ \n$", -- The blank line before set items before WoW 2.3
" %(%d+/%d+%)$", -- The (1/8) on set items for all versions of WoW
}
-- MobInfo-2 compatibility
if MI_LightBlue and MI_TXT_DROPPED_BY then
tinsert(PawnKillLines, "^" .. MI_LightBlue .. MI_TXT_DROPPED_BY)
end
-- Lines that begin with any of the following strings will not be searched for separator strings.
PawnSeparatorIgnorePrefixes =
{
'"', -- double quote
L.Equip,
L.Use,
L.ChanceOnHit,
}
-- This is a list of regular expression substitutions that Pawn performs to normalize stat names before running
-- them through the normal gauntlet of expressions.
PawnNormalizationRegexes =
{
{"^|c........(.+)$", "%1"}, -- "|cFF 0FF 0Heroic" --> "Heroic"
{"^([%w%s%.]+) %+(%d+)%%?$", "+%2 %1"}, -- "Stamina +5" --> "+5 Stamina"
{L.NormalizationEnchant, "%1"}, -- "Enchanted: +50 Strength" --> "+50 Strength" (ENCHANTED_TOOLTIP_LINE)
}
-- These regular expressions are used to parse item tooltips.
-- The first string is the regular expression to match. Stat values should be denoted with "(%d+)".
-- Subsequent strings follow this pattern: Stat, Number, Source
-- Stat is the name of a statistic.
-- Number is either the amount of that stat to include, or the 1-based index into the matches array produced by the regex.
-- If it's an index, it can also be negative to mean that the stat should be subtracted instead of added. If nil, defaults to 1.
-- Source is either PawnMultipleStatsFixed if Number is the amount of the stat, or PawnSingleStatMultiplier if Number is an
-- amount of the stat to multiply by the extracted number, or PawnMultipleStatsExtract or nil if Number is the matches array index.
-- Note that certain strings don't need to be translated: for example, the game defines
-- ITEM_BIND_ON_PICKUP to be "Binds when picked up" in English, and the correct string
-- in other languages automatically.
PawnRegexes =
{
-- ========================================
-- Common strings that are ignored (rare ones are at the bottom of the file)
-- ========================================
{L.HaventCollectedAppearance}, -- You haven't collected this appearance.
{PawnGameConstant(ITEM_QUALITY0_DESC)}, -- Poor
{PawnGameConstant(ITEM_QUALITY1_DESC)}, -- Common
{PawnGameConstant(ITEM_QUALITY2_DESC)}, -- Uncommon
{PawnGameConstant(ITEM_QUALITY3_DESC)}, -- Rare
{PawnGameConstant(ITEM_QUALITY4_DESC)}, -- Epic
{PawnGameConstant(ITEM_QUALITY5_DESC)}, -- Legendary
{PawnGameConstant(ITEM_QUALITY7_DESC)}, -- Heirloom
{L.RaidFinder}, -- Raid Finder
{L.Flexible}, -- Flexible raids
{L.Heroic}, -- Items from heroic dungeons
{L.Elite}, -- one version of Regail's Band of the Endless (http://www.wowhead.com/item=90517)
{L.HeroicElite}, -- one version of Regail's Band of the Endless (http://www.wowhead.com/item=90503)
{L.Thunderforged}, -- one version of Shoulders of the Crackling Protector (http://ptr.wowhead.com/item=96329)
{L.HeroicThunderforged}, -- one version of Shoulders of the Crackling Protector (http://ptr.wowhead.com/item=97073)
{L.Timeless}, -- level 535 version of Ordon Legend-Keeper Spaulders (http://ptr.wowhead.com/item=101925)
{L.Titanforged}, -- Legion items upgraded 15 item levels or more
{L.Warforged}, -- level 559 Black Blood of Y'Shaarj (http://www.wowhead.com/item=105399)
{L.HeroicWarforged}, -- level 572 Black Blood of Y'Shaarj (http://www.wowhead.com/item=105648)
{"^" .. ITEM_LEVEL}, -- Item Level 200
{L.UpgradeLevel}, -- Upgrade Level 0/2 (ITEM_UPGRADE_TOOLTIP_FORMAT)
{PawnGameConstantIgnoredPlaceholder(EQUIPMENT_SETS)}, -- String is from the Blizzard UI, but only used by Outfitter
{PawnGameConstant(ITEM_UNSELLABLE)}, -- No sell price
{PawnGameConstant(ITEM_SOULBOUND)}, -- Soulbound
{PawnGameConstant(ITEM_BIND_ON_EQUIP)}, -- Binds when equipped
{PawnGameConstant(ITEM_BIND_ON_PICKUP)}, -- Binds when picked up
{PawnGameConstant(ITEM_BIND_ON_USE)}, -- Binds when used
{PawnGameConstant(ITEM_BIND_TO_ACCOUNT)}, -- Binds to account
{PawnGameConstant(ITEM_ACCOUNTBOUND)}, -- Account Bound
{PawnGameConstant(ITEM_BIND_TO_BNETACCOUNT)}, -- Binds to Battle.net account (Polished Spaulders of Valor)
{PawnGameConstant(ITEM_BNETACCOUNTBOUND)}, -- Battle.net Account Bound (Polished Spaulders of Valor)
{"^" .. PawnGameConstantUnwrapped(ITEM_UNIQUE)}, -- Unique; leave off the $ for Unique (20)
{"^" .. PawnGameConstantUnwrapped(ITEM_UNIQUE_EQUIPPABLE)}, -- Unique-Equipped; leave off the $ for Unique-Equipped: Curios of the Shado-Pan Assault (1)
{"^" .. PawnGameConstantUnwrapped(ITEM_BIND_QUEST)}, -- Leave off the $ for MonkeyQuest mod compatibility
{PawnGameConstant(ITEM_STARTS_QUEST)}, -- This Item Begins a Quest
{L.MultiStatHeading}, -- Multiple stats (Zen Wild Jade)
{PawnGameConstant(PROFESSIONS_USED_IN_COOKING)}, -- Crafting Reagent
{PawnGameConstant(ITEM_CONJURED)}, -- Conjured Item
{PawnGameConstant(ITEM_PROSPECTABLE)}, -- Prospectable
{PawnGameConstant(ITEM_MILLABLE)}, -- Millable
{PawnGameConstant(ITEM_DISENCHANT_ANY_SKILL)}, -- Enchantable
{PawnGameConstant(ITEM_DISENCHANT_NOT_DISENCHANTABLE)}, -- Cannot be disenchanted
{PawnGameConstantIgnoredPlaceholder(ITEM_PROPOSED_ENCHANT)}, -- Appears in the trade window when an item is about to be enchanted ("Will receive +8 Stamina")
{L.DisenchantingRequires}, -- Appears on item tooltips when the Disenchant ability is specified ("Disenchanting requires Enchanting (25)")
{PawnGameConstant(ITEM_ENCHANT_DISCLAIMER)}, -- Item will not be traded!
{L.Charges}, -- Brilliant Mana Oil
{PawnGameConstant(LOCKED)}, -- Locked
{PawnGameConstant(ENCRYPTED)}, -- Encrypted (does not seem to exist in the game yet)
{PawnGameConstant(ITEM_SPELL_KNOWN)}, -- Already Known
{PawnGameConstant(INVTYPE_HEAD)}, -- Head
{PawnGameConstant(INVTYPE_NECK)}, -- Neck
{PawnGameConstant(INVTYPE_SHOULDER)}, -- Shoulder
{PawnGameConstant(INVTYPE_CLOAK)}, -- Back
{PawnGameConstant(INVTYPE_ROBE)}, -- Chest
{PawnGameConstant(INVTYPE_BODY)}, -- Shirt
{PawnGameConstant(INVTYPE_TABARD)}, -- Tabard
{PawnGameConstant(INVTYPE_WRIST)}, -- Wrist
{PawnGameConstant(INVTYPE_HAND)}, -- Hands
{PawnGameConstant(INVTYPE_WAIST)}, -- Waist
{PawnGameConstant(INVTYPE_FEET)}, -- Feet
{PawnGameConstant(INVTYPE_LEGS)}, -- Legs
{PawnGameConstant(INVTYPE_FINGER)}, -- Finger
{PawnGameConstant(INVTYPE_TRINKET)}, -- Trinket
{PawnGameConstant(INVTYPE_RELIC or "UNUSED")}, -- Relic
{PawnGameConstant(MAJOR_GLYPH)}, -- Major Glyph
{PawnGameConstant(MINOR_GLYPH)}, -- Minor Glyph
{PawnGameConstant(PRIME_GLYPH)}, -- Prime Glyph
{PawnGameConstant(REFORGED or "UNUSED")}, -- Reforged
{PawnGameConstant(MOUNT)}, -- Cenarion War Hippogryph
{PawnGameConstantIgnoredPlaceholder(ITEM_CLASSES_ALLOWED)}, -- Classes:
{PawnGameConstantIgnoredPlaceholder(ITEM_RACES_ALLOWED)}, -- Races:
{PawnGameConstantIgnoredNumberPlaceholder(DURABILITY_TEMPLATE)}, -- Durability X / Y
{L.Duration},
{L.CooldownRemaining},
{"<.+>"}, -- Made by, Right-click to read, etc. (No ^$; can be prefixed by a color)
{PawnGameConstantIgnoredPlaceholder(ITEM_WRITTEN_BY)}, -- Written by
{L.BagSlots}, -- Bags of all kinds
{L.TemporaryBuffSeconds}, -- Temporary item buff
{L.TemporaryBuffMinutes}, -- Temporary item buff
{PawnGameConstantIgnoredPlaceholder(ENCHANT_ITEM_REQ_SKILL)}, -- Seen on the enchanter-only ring enchantments when you're not an enchanter, and socketed jewelcrafter-only BoP gems
{L.Corruption}, -- /pawn compare item:172198::::::::120:262::3:1:3524
-- ========================================
-- Strings that represent statistics that Pawn cares about
-- ========================================
{L.HeirloomLevelRange, "MaxScalingLevel"}, -- Scaling heirloom items
{L.HeirloomXpBoost, "XpBoost", 1, PawnMultipleStatsFixed}, -- Experience-granting heirloom items
{L.HeirloomXpBoost2, "XpBoost", 1, PawnMultipleStatsFixed}, -- unused in English
{PawnGameConstant(INVTYPE_RANGED), "IsRanged", 1, PawnMultipleStatsFixed}, -- Ranged
{PawnGameConstant(INVTYPE_RANGEDRIGHT), "IsRanged", 1, PawnMultipleStatsFixed}, -- Ranged (but the translation is different in Russian)
{PawnGameConstant(INVTYPE_WEAPON), "IsOneHand", 1, PawnMultipleStatsFixed}, -- One-Hand
{PawnGameConstant(INVTYPE_2HWEAPON), "IsTwoHand", 1, PawnMultipleStatsFixed}, -- Two-Hand
{PawnGameConstant(INVTYPE_WEAPONMAINHAND), "IsMainHand", 1, PawnMultipleStatsFixed}, -- Main Hand
{PawnGameConstant(INVTYPE_WEAPONOFFHAND), "IsOffHand", 1, PawnMultipleStatsFixed}, -- Off Hand
{PawnGameConstant(INVTYPE_HOLDABLE), "IsFrill", 1, PawnMultipleStatsFixed}, -- Held In Off-Hand
{L.WeaponDamage, "MinDamage", 1, PawnMultipleStatsExtract, "MaxDamage", 2, PawnMultipleStatsExtract}, -- Standard weapon (heirlooms can have decimal points in their damage values)
{L.WeaponDamageExact, "MinDamage", 1, PawnMultipleStatsExtract, "MaxDamage", 1, PawnMultipleStatsExtract}, -- Weapons with no damage range: Crossbow of the Albatross or Fine Light Crossbow, /pawn compare 15808
{L.WeaponDamageFire, "MinDamage", 1, PawnMultipleStatsExtract, "MaxDamage", 2, PawnMultipleStatsExtract}, -- /pawn compare 19367
{L.WeaponDamageFireExact, "MinDamage", 1, PawnMultipleStatsExtract, "MaxDamage", 1, PawnMultipleStatsExtract}, -- Wand
{L.WeaponDamageShadow, "MinDamage", 1, PawnMultipleStatsExtract, "MaxDamage", 2, PawnMultipleStatsExtract}, -- /pawn compare 18301
{L.WeaponDamageShadowExact, "MinDamage", 1, PawnMultipleStatsExtract, "MaxDamage", 1, PawnMultipleStatsExtract}, -- Battle Medic's Wand
{L.WeaponDamageNature, "MinDamage", 1, PawnMultipleStatsExtract, "MaxDamage", 2, PawnMultipleStatsExtract}, -- /pawn compare 16997
{L.WeaponDamageNatureExact, "MinDamage", 1, PawnMultipleStatsExtract, "MaxDamage", 1, PawnMultipleStatsExtract}, -- Wand
{L.WeaponDamageArcane, "MinDamage", 1, PawnMultipleStatsExtract, "MaxDamage", 2, PawnMultipleStatsExtract}, -- /pawn compare 13938
{L.WeaponDamageArcaneExact, "MinDamage", 1, PawnMultipleStatsExtract, "MaxDamage", 1, PawnMultipleStatsExtract}, -- Wand
{L.WeaponDamageFrost, "MinDamage", 1, PawnMultipleStatsExtract, "MaxDamage", 2, PawnMultipleStatsExtract}, -- /pawn compare 19108
{L.WeaponDamageFrostExact, "MinDamage", 1, PawnMultipleStatsExtract, "MaxDamage", 1, PawnMultipleStatsExtract}, -- Wand
{L.WeaponDamageHoly, "MinDamage", 1, PawnMultipleStatsExtract, "MaxDamage", 2, PawnMultipleStatsExtract}, -- /pawn compare 22254
{L.WeaponDamageHolyExact, "MinDamage", 1, PawnMultipleStatsExtract, "MaxDamage", 1, PawnMultipleStatsExtract}, -- Wand
{L.WeaponDamageEnchantment, "MinDamage", 1, PawnMultipleStatsExtract, "MaxDamage", 1, PawnMultipleStatsExtract}, -- Weapon enchantments
{L.WeaponDamageEquip, "MinDamage", 1, PawnMultipleStatsExtract, "MaxDamage", 1, PawnMultipleStatsExtract}, -- Braided Eternium Chain (it's an item, not an enchantment)
{L.Scope, "MinDamage", 1, PawnMultipleStatsExtract, "MaxDamage", 1, PawnMultipleStatsExtract}, -- Ranged weapon scopes
{L.AllStats, "Strength", 1, PawnMultipleStatsExtract, "Agility", 1, PawnMultipleStatsExtract, "Stamina", 1, PawnMultipleStatsExtract, "Intellect", 1, PawnMultipleStatsExtract, "Spirit", 1, PawnMultipleStatsExtract}, -- Enchanted Pearl, Enchanted Tear, chest enchantments
{L.Strength, "Strength"},
{L.Agility, "Agility"},
{L.Stamina, "Stamina"},
{L.Intellect, "Intellect"}, -- negative Intellect: Kreeg's Mug
{L.Spirit, "Spirit"},
{L.EnchantmentTitaniumWeaponChain, "HasteRating", 28, PawnMultipleStatsFixed}, -- Weapon enchantment; also reduces disarm duration (may be obsolete?)
{L.EnchantmentPyriumWeaponChain, "HasteRating", 8, PawnMultipleStatsFixed}, -- Weapon enchantment; also reduces disarm duration
{L.EnchantmentLivingSteelWeaponChain, "CritRating", 13, PawnMultipleStatsFixed}, -- Weapon enchantment; also reduces disarm duration
{L.Dodge, "DodgeRating"}, -- /pawn compare item:789::::::1754, or Classic arcanum and enchantment: /pawn compare item:19386:2622 /pawn compare item:21693:2545
{L.Dodge2, "DodgeRating"}, -- unused in English
{L.Dodge3, "DodgeRating"}, -- unused in English
{L.DodgePercent, "DodgeRating"}, -- Classic, /pawn compare 11755
{L.DodgeRating, "DodgeRating"}, -- Burning Crusade Classic, /pawn compare 11755
{L.DodgeRating2, "DodgeRating"}, -- Burning Crusade Classic, /pawn compare 29323
{L.DodgeRatingShort, "DodgeRating"}, -- Burning Crusade Classic, /pawn compare item:789::::::1754
{L.Parry, "ParryRating"},
{L.Parry2, "ParryRating"}, -- unused in English
{L.ParryPercent, "ParryRating"}, -- Classic, /pawn compare 19351
{L.ParryRating, "ParryRating"}, -- Burning Crusade Classic, /pawn compare 19351
{L.ParryRatingShort, "ParryRating"}, -- Burning Crusade Classic, /pawn compare 24036
{L.DefenseRating, "DefenseRating"}, -- Burning Crusade, /pawn compare 19867
{L.DefenseRating2, "DefenseRating"}, -- Burning Crusade esMX or deDE, /pawn compare 29171
{L.DefenseRatingSimple, "DefenseRating"}, -- Burning Crusade, /pawn compare item:789::::::89
{L.DefenseSkill, "DefenseRating"}, -- Classic, /pawn compare 19867
{L.DefenseSkillSimple, "DefenseRating"}, -- Classic, /pawn compare item:789::::::89
{L.BlockPercent, "BlockRating"}, -- Classic, /pawn compare 18499
{L.BlockRating, "BlockRating"}, -- Burning Crusade, /pawn compare 18499
{L.BlockRating2, "BlockRating"}, -- Burning Crusade, /pawn compare 29323
{L.Block, "BlockValue"}, -- Classic, /pawn compare 18499
{L.BlockValue, "BlockValue"}, -- Classic, /pawn compare 18499
{L.Dps}, -- Ignore this; DPS is calculated manually
{L.DpsAdd, "Dps"},
{L.EnchantmentFieryWeapon, "Dps", 4, PawnMultipleStatsFixed}, -- weapon enchantment
{L.Crit, "CritRating"},
{L.Crit2, "CritRating"},
{L.CritPercent, "CritRating"}, -- Classic, /pawn compare 15062
{L.CritPercentCombined, "CritRating", 1, PawnMultipleStatsExtract, "SpellCritRating", 1, PawnMultipleStatsExtract}, -- Classic Season of Discovery, /pawn compare 216621
{L.CritRating, "CritRating"}, -- Burning Crusade, /pawn compare 15062
{L.CritRating2, "CritRating"}, -- Burning Crusade, /pawn compare 30710
{L.CritRating3, "CritRating"}, -- Burning Crusade, /pawn compare 28796
{L.CritRatingShort, "CritRating"}, -- Burning Crusade, /pawn compare item:789::::::78
{L.ScopeCrit, "CritRating"},
{L.ScopeRangedCrit, "CritRating"}, -- Heartseeker Scope
{L.SpellCrit, "SpellCritRating"}, -- Classic, /pawn compare 16947
{L.SpellCritRating, "SpellCritRating"}, -- Burning Crusade, /pawn compare 16947
{L.SpellCritRating2, "SpellCritRating"}, -- Burning Crusade, /pawn compare 24256
{L.SpellCritRatingShort, "SpellCritRating"}, -- Burning Crusade, https://tbc.wowhead.com/item=24050/gleaming-dawnstone
{L.SpellCritRatingShort2, "SpellCritRating"}, -- Burning Crusade, /pawn compare 29317 (socket bonus)
{L.Hit, "HitRating"}, -- Classic, /pawn compare 16947
{L.Hit2, "HitRating"}, -- unused in English
{L.HitPercentCombined, "HitRating", 1, PawnMultipleStatsExtract, "SpellHitRating", 1, PawnMultipleStatsExtract}, -- Classic Season of Discovery, /pawn compare 213312
{L.HitRating, "HitRating"}, -- Burning Crusade, /pawn compare 28182
{L.HitRating2, "HitRating"}, -- Burning Crusade, /pawn compare 18500
{L.HitRating3, "HitRating"}, -- Burning Crusade in Spanish, /pawn compare 32570
{L.HitRatingShort, "HitRating"}, -- Burning Crusade, https://tbc.wowhead.com/item=24051/rigid-dawnstone
{L.SpellHit, "SpellHitRating"}, -- /pawn compare 16795
{L.SpellHitRating, "SpellHitRating"}, -- Burning Crusade, /pawn compare 16795
{L.SpellHitRating2, "SpellHitRating"}, -- Burning Crusade, /pawn compare 24266
{L.SpellHitRatingShort, "SpellHitRating"}, -- Burning Crusade, https://tbc.wowhead.com/item=31861/great-dawnstone
{L.ExpertiseRating, "ExpertiseRating"}, -- Burning Crusade, /pawn compare 19351
{L.ExpertiseRatingShort, "ExpertiseRating"}, -- Wrath, Precise Bloodstone
{L.ArmorPenetration, "ArmorPenetration"},
{L.ArmorPenetrationRating, "ArmorPenetration"}, -- Burning Crusade, /pawn compare 34703
{L.ArmorPenetrationRating2, "ArmorPenetration"}, -- Burning Crusade, /pawn compare 41592 or 42642 or 44303 depending on locale
{L.ArmorPenetrationShort, "ArmorPenetration"}, -- Wrath, Fractured Scarlet Ruby
{L.Resilience, "ResilienceRating"}, -- Mystic Dawnstone
{L.Resilience2, "ResilienceRating"}, -- unused in English
{L.ResilienceRating, "ResilienceRating"}, -- /pawn compare 29181
{L.ResilienceRatingShort, "ResilienceRating"}, -- Burning Crusade, https://tbc.wowhead.com/item=24053/mystic-dawnstone
{L.PvPPower, "Stamina"}, -- Stormy Chalcedony
{L.EnchantmentCounterweight, "HasteRating"}, -- won't work on classic since the live string includes the word "haste" and it's worded differently in classic
{L.Haste, "HasteRating"}, -- Leggings of the Betrayed
{L.Haste2, "HasteRating"}, -- unused in English
{L.HasteRating, "HasteRating"}, -- Burning Crusade, /pawn compare 32570
{L.HasteRating2, "HasteRating"}, -- Burning Crusade esES, /pawn compare 32570
{L.HasteRatingShort, "HasteRating"}, -- Wrath, Quick Sun Crystal / Burning Crusade, random-stat items only
{L.SpellHasteRating, "SpellHasteRating"}, -- /pawn compare 34360
{L.SpellHasteRatingShort, "SpellHasteRating"}, -- https://tbc.wowhead.com/item=35315/quick-dawnstone
{L.SpellPenetration, "SpellPenetration"}, -- Burning Crusade, /pawn compare 21563
{L.SpellPenetrationClassic, "SpellPenetration"}, -- Classic (pre-TBC), /pawn compare 21338
{L.SpellPenetrationShort, "SpellPenetration"}, -- Burning Crusade, https://tbc.wowhead.com/item=24039/stormy-star-of-elune
{L.Mastery, "MasteryRating"}, -- Zen Dream Emerald
{L.Mastery2, "MasteryRating"}, -- unused in English
{L.Versatility, "Versatility"}, -- http://wod.wowhead.com/item=100945
{L.Leech, "Leech"}, -- http://wod.wowhead.com/item=100945
{L.Avoidance, "Avoidance"}, -- http://wod.wowhead.com/item=100945
{PawnGameConstant(STAT_STURDINESS), "Indestructible", 1, PawnMultipleStatsFixed}, -- http://wod.wowhead.com/item=100945
{L.MovementSpeed, "MovementSpeed"}, -- http://wod.wowhead.com/item=100945
{L.Ap, "Ap"}, -- /pawn compare item:789::::::1547
{L.Ap2, "Ap"}, -- /pawn compare 15062
{L.Ap3, "Ap"}, -- /pawn compare 18821
{L.Rap, "Rap"}, -- Classic, /pawn compare 18473
{L.Rap2, "Rap"}, -- Burning Crusade and Wrath Classic, /pawn compare 18713
{L.FeralAp, "FeralAp"}, -- Classic, /pawn compare 22988
{L.FeralApMoonkin, "FeralAp"}, -- Burning Crusade, /pawn compare 22988
{L.FeralApWrath}, -- Wrath, /pawn compare 22988 (in Wrath it only appears on druid items and is not a real stat, but it shouldn't get an orange diamond)
{L.Mp5, "Mp5"}, -- /pawn compare 22988
{L.Mp52, "Mp5"}, -- /pawn compare item:789::::::2074
{L.Mp53, "Mp5"}, -- Burning Crusade, socket bonus on /pawn compare 34360
{L.Mp54, "Mp5"}, -- Burning Crusade, /script PawnUIGetAllTextForItem("item:24057") and /pawn compare 28522
{L.Mp55, "Mp5"}, -- Burning Crusade, /pawn compare 28304
{L.Hp5, "Hp5"}, -- (on live, we used to count 1 HP5 = 3 Stamina)
{L.Hp52, "Hp5"}, -- Demon's Blood
{L.Hp53, "Hp5"}, -- Aquamarine Signet of Regeneration or /pawn compare item:789::::::2110
{L.Hp54, "Hp5"}, -- Lifestone
{L.Hp55, "Hp5"}, -- /pawn compare item:789::::::-28
{L.EnchantmentHealth, "Stamina", 1/12.5, PawnSingleStatMultiplier}, -- +100 health head/leg enchantment (counting 1 HP = 1/12.5 Stamina)
{L.EnchantmentHealth2, "Stamina", 1/12.5, PawnSingleStatMultiplier}, -- +150 health enchantment (counting 1 HP = 1/12.5 Stamina)
{L.Armor, "Armor"}, -- normal armor and cloak armor enchantments
{L.Armor2, "Armor"}, -- unused in English
{L.EnchantmentArmorKit, "Armor"}, -- armor kits
{L.FireResist, "FireResist"}, -- /pawn compare 12609
{L.NatureResist, "NatureResist"}, -- /pawn compare 12609
{L.FrostResist, "FrostResist"}, -- /pawn compare 12609
{L.ShadowResist, "ShadowResist"}, -- /pawn compare 12609
{L.ArcaneResist, "ArcaneResist"}, -- /pawn compare 12609
{L.SpellDamage, "SpellDamage", 1, PawnMultipleStatsExtract, "Healing", 1, PawnMultipleStatsExtract}, -- /pawn compare item:20686::::::2159 ("of Sorcery" on Classic)
{L.SpellDamage2, "SpellDamage", 1, PawnMultipleStatsExtract, "Healing", 1, PawnMultipleStatsExtract}, -- /pawn compare 16947
{L.SpellDamage3, "SpellDamage", 1, PawnMultipleStatsExtract, "Healing", 1, PawnMultipleStatsExtract}, -- French on Classic uses two different wordings: /pawn compare 20641 vs. /pawn compare 10041
{L.SpellDamage4, "SpellDamage", 1, PawnMultipleStatsExtract, "Healing", 1, PawnMultipleStatsExtract}, -- Simplified Chinese on Classic uses many different wordings: /pawn compare 16923 vs. /pawn compare 18608
{L.SpellDamage5, "SpellDamage", 1, PawnMultipleStatsExtract, "Healing", 1, PawnMultipleStatsExtract}, -- Burning Crusade, /pawn compare item:789::::::-36
{L.SpellDamage6, "SpellDamage", 1, PawnMultipleStatsExtract, "Healing", 1, PawnMultipleStatsExtract}, -- Burning Crusade, /pawn compare 33467
{L.SpellDamageAndHealing, "Healing", 1, PawnMultipleStatsExtract, "SpellDamage", 2, PawnMultipleStatsExtract}, -- Burning Crusade, /pawn compare 34360
{L.SpellDamageAndHealing2, "Healing", 1, PawnMultipleStatsExtract, "SpellDamage", 2, PawnMultipleStatsExtract}, -- Burning Crusade, /pawn compare 28304
{L.SpellDamageAndHealingEnchant, "Healing", 1, PawnMultipleStatsExtract, "SpellDamage", 2, PawnMultipleStatsExtract}, -- Burning Crusade, /script PawnUIGetAllTextForItem("item:16943:2566") (matches Short in some locales; don't double-dip)
{L.SpellDamageAndHealingShort, "Healing", 1, PawnMultipleStatsExtract, "SpellDamage", 2, PawnMultipleStatsExtract}, -- Burning Crusade, /pawn compare item:789::::::2041
{L.SpellDamageAndHealingShort2, "Healing", 1, PawnMultipleStatsExtract, "SpellDamage", 2, PawnMultipleStatsExtract}, -- Burning Crusade, /script PawnUIGetAllTextForItem("item:24060")
{L.FireSpellDamage, "FireSpellDamage"}, -- /pawn compare item:789::::::1878
{L.FireSpellDamage2, "FireSpellDamage"}, -- /pawn compare 944
{L.FireSpellDamage3, "FireSpellDamage"}, -- /pawn compare item:789::::::-22
{L.ShadowSpellDamage, "ShadowSpellDamage"}, -- /pawn compare item:789::::::1841
{L.ShadowSpellDamage2, "ShadowSpellDamage"}, -- /pawn compare 1980
{L.ShadowSpellDamage3, "ShadowSpellDamage"}, -- /pawn compare 19133, zhCN Classic only
{L.ShadowSpellDamage4, "ShadowSpellDamage"}, -- /pawn compare item:789::::::-25
{L.NatureSpellDamage, "NatureSpellDamage"}, -- /pawn compare item:789::::::1997
{L.NatureSpellDamage2, "NatureSpellDamage"}, -- /pawn compare 18829
{L.NatureSpellDamage3, "NatureSpellDamage"}, -- /pawn compare item:789::::::-24
{L.ArcaneSpellDamage, "ArcaneSpellDamage"}, -- /pawn compare item:789::::::1801
{L.ArcaneSpellDamage2, "ArcaneSpellDamage"}, -- /pawn compare 19308
{L.ArcaneSpellDamage3, "ArcaneSpellDamage"}, -- /pawn compare item:789::::::-21
{L.FrostSpellDamage, "FrostSpellDamage"}, -- /pawn compare item:789::::::1954
{L.FrostSpellDamage2, "FrostSpellDamage"}, -- /pawn compare 944
{L.FrostSpellDamage3, "FrostSpellDamage"}, -- /pawn compare item:789::::::-23
{L.HolySpellDamage, "HolySpellDamage"},
{L.HolySpellDamage2, "HolySpellDamage"}, -- /pawn compare 20504
{L.HolySpellDamage3, "HolySpellDamage"}, -- /pawn compare 30642
{L.Healing, "Healing"}, -- /pawn compare item:789::::::2028
{L.Healing2, "Healing"}, -- /pawn compare 16947
{L.Healing3, "Healing"}, -- Burning Crusade, /pawn compare item:789::::::-38
{L.SpellPower, "SpellPower"}, -- /pawn tooltip 39998
{L.SpellPower2, "SpellPower"}, -- /pawn compare 40585
{L.SpellPower3, "SpellPower"}, -- /pawn compare item:20686::::::2159
{PawnGameConstant(EMPTY_SOCKET_RED), "RedSocket", 1, PawnMultipleStatsFixed},
{PawnGameConstant(EMPTY_SOCKET_YELLOW), "YellowSocket", 1, PawnMultipleStatsFixed},
{PawnGameConstant(EMPTY_SOCKET_BLUE), "BlueSocket", 1, PawnMultipleStatsFixed},
{PawnGameConstant(EMPTY_SOCKET_META), "MetaSocket", 1, PawnMultipleStatsFixed},
{PawnGameConstant(EMPTY_SOCKET_COGWHEEL), "CogwheelSocket", 1, PawnMultipleStatsFixed},
{PawnGameConstant(EMPTY_SOCKET_PRISMATIC), "PrismaticSocket", 1, PawnMultipleStatsFixed},
{PawnGameConstant(EMPTY_SOCKET_DOMINATION or "UNUSED")}, -- domination sockets are now ignored
-- In WoW Classic, crossbows, guns, and wands don't show "Ranged" and instead show the weapon type on the left.
{L.Bow, "IsBow", 1, PawnMultipleStatsFixed, "IsRanged", 1, PawnMultipleStatsFixed},
{L.Crossbow, "IsCrossbow", 1, PawnMultipleStatsFixed, "IsRanged", 1, PawnMultipleStatsFixed},
{L.Gun, "IsGun", 1, PawnMultipleStatsFixed, "IsRanged", 1, PawnMultipleStatsFixed},
{L.Wand, "IsWand", 1, PawnMultipleStatsFixed, "IsRanged", 1, PawnMultipleStatsFixed},
{L.Thrown, "IsThrown", 1, PawnMultipleStatsFixed, "IsRanged", 1, PawnMultipleStatsFixed},
-- ========================================
-- Rare strings that are ignored (common ones are at the top of the file)
-- ========================================
{'^"'}, -- Flavor text
{PawnGameConstantIgnoredPlaceholder(ITEM_MIN_LEVEL)}, -- "Requires Level XX"... but "Requires level XX to YY" we DO care about.
{PawnGameConstantIgnoredPlaceholder(ITEM_REQ_SKILL)}, -- "Requires SKILL (XX)"
{PROFESSIONS_CRAFTING_QUALITY and PawnGameConstantIgnoredPlaceholder(PROFESSIONS_CRAFTING_QUALITY) or "^UNUSED$"}, -- "Quality: <icon>"
{L.Requires2}, -- unused in English
}
-- These regexes work exactly the same as PawnRegexes, but they're used to parse the right side of tooltips.
-- Unrecognized stats on the right side are always ignored.
-- Two-handed Axes, Maces, and Swords will have their stats converted to the 2H version later.
PawnRightHandRegexes =
{
{L.Speed, "Speed"},
{L.Speed2, "Speed"}, -- unused in English
{L.Axe, "IsAxe", 1, PawnMultipleStatsFixed},
{L.Bow, "IsBow", 1, PawnMultipleStatsFixed},
{L.Crossbow, "IsCrossbow", 1, PawnMultipleStatsFixed},
{L.Dagger, "IsDagger", 1, PawnMultipleStatsFixed},
{L.FistWeapon, "IsFist", 1, PawnMultipleStatsFixed},
{L.Gun, "IsGun", 1, PawnMultipleStatsFixed},
{L.Mace, "IsMace", 1, PawnMultipleStatsFixed},
{L.Polearm, "IsPolearm", 1, PawnMultipleStatsFixed},
{INVTYPE_RELIC, "IsRelic", 1, PawnMultipleStatsFixed},
{L.Staff, "IsStaff", 1, PawnMultipleStatsFixed},
{L.Sword, "IsSword", 1, PawnMultipleStatsFixed},
{L.Warglaives, "IsWarglaive", 1, PawnMultipleStatsFixed},
{L.Wand, "IsWand", 1, PawnMultipleStatsFixed},
{L.Cloth, "IsCloth", 1, PawnMultipleStatsFixed},
{L.Leather, "IsLeather", 1, PawnMultipleStatsFixed},
{L.Mail, "IsMail", 1, PawnMultipleStatsFixed},
{L.Plate, "IsPlate", 1, PawnMultipleStatsFixed},
{L.Shield, "IsShield", 1, PawnMultipleStatsFixed},
}
-- Each language has some regexes that aren't necessary for that particular language. For performance, let's remove those from the table right now.
-- TODO: For even more of a performance boost, filter out every regex that produces a stat that doesn't exist on the current version of the game.
local FilteredRegexes = {}
local _, Regex, LastRegex
local KeptCount, RemovedCount = 0, 0
for _, Regex in pairs(PawnRegexes) do
if Regex[1] == "" or Regex[1] == "^UNUSED$" then
RemovedCount = RemovedCount + 1
elseif Regex[1] == nil then
VgerCore.Fail("Localization error in regex table for " .. tostring(Regex[2]) .. " AFTER \"" .. VgerCore.Color.Blue .. PawnEscapeString(tostring(LastRegex)) .. "|r\".")
else
tinsert(FilteredRegexes, Regex)
KeptCount = KeptCount + 1
LastRegex = Regex[1]
end
end
PawnRegexes = FilteredRegexes
--VgerCore.Message("Performance boost: removed " .. RemovedCount .. " regexes (" .. floor(100 * RemovedCount / (RemovedCount + KeptCount)) .. "%)")