From c059a9c949585aa572b4bd596bb7b245c7722584 Mon Sep 17 00:00:00 2001 From: Kevin Lyles Date: Tue, 9 Mar 2010 18:05:37 -0600 Subject: [PATCH] Added an enchant handler --- Regexps.lua | 272 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 270 insertions(+), 2 deletions(-) diff --git a/Regexps.lua b/Regexps.lua index 9acf9c2..45ef224 100644 --- a/Regexps.lua +++ b/Regexps.lua @@ -148,6 +148,107 @@ local EquipStatsAffixes = { "%.$", } +local EnchantMatchLines = { + "^use: permanently ", + "^use: teaches you how to permanently enchant ", + "^use: attach", + "^use: enchants? ", +} + +local EnchantUnweightedLines = { + " sometimes ", + " chance ", + " often ", + " damage to ", + " occasionally ", +} + +local EnchantPreprocessLines = { + {" socket ", " prismatic socket "}, + {" and increase?i?n?g? ", " and "}, + {" and your ", " and "}, + {" melee weapon to do (%d+) additional points? of damage", " %1 melee damage"}, + {" armor value ", " armor "}, + {" a slight movement speed increase", " a minor movement speed increase"}, + {"^use: attaches a permanent scope to a bow or gun that increases its damage by ", "increases ranged damage by "}, + {" resistance to (%a+) by ", " %1 resistance by "}, + {" resistance to all schools of magic by ", " all resistances by "}, + {" to all ", " all "}, +} + +local EnchantAffixes = { + "^use: +", + "^teaches you how to +", + "^permanently +", + "^enchants? +", + "^attache?s? +", + "^an? +", + "^chain to your weapon, +", + "^counterweight to a two%-handed sword, mace, axe or polearm increasing the wielder's +", + "^permanent scope to a bow or gun +", + "weapon to increase its +", + "^spurs to your +", + + "^boots +", + "^bracers? +", + "^cloak +", + "^gloves +", + "^shield +", + "^piece of +", + "^chest armor +", + "^two%-handed +", + "^melee weapon +", + "^weapon +", + "^staff +", + "^ring +", + + "^%a+ l?e?g? ?armor onto pants +", + "^embroiders spellthread into pants, +", + "lightweight titanium plating to a shield, +", + + "^increasing +", + + "^[st]o +", + "^that +", + "^they +", + "^it +", + + "^increases? +", + "^provides? +", + "^adds? +", + "^gives? +", + "^grants? +", + "^regenerates? +", + "^restores? +", + + "^your +", + "^the +", + "^[bw]earer's +", + " of the [bw]earer", + "^both +", + "^its +", + + " +%(1 sec cooldown%)$", + " +only use?able on items level %d+ and above%.$", + " +requires a level %d+ or higher l?e?v?e?l? ?item%.$", + " +must be level %d+ or lower to gain this benefit%.$", + " +wearer must be level %d+ or higher%.$", + "[\r\n]+%a+ing [%a ]+ causes [%a ]+ to become soulbound%.$", + "[\r\n]+can only be attached to [%a ]+ in your inventory%.$", + " +only the enchanter's rings can be enchanted,? and enchanting a ring will cause it to become soulbound%.$", + -- TODO: flag this somehow and handle it in scoring + " +does not stack with other similar effects%.", + + "^eternal belt buckle onto a belt, adding a +", + " +to the belt%.$", + " +t?of? an item worn on the %a[%a ,]+ or %a+", + " +on a pair of gloves", + "additional points? of +", + "^mana regeneration by +", + + "%.$", +} + local FishingMatchLines = { "^use: replace", "^use: when applied to your fishing pole", @@ -220,6 +321,7 @@ local UseEffectAffixes = { EffectHandlers = { {EquipStatsMatchLines, {}, EquipStatsUnweightedLines, EquipStatsPreprocessLines, EquipStatsAffixes, "equipStats"}, {FoodMatchLines, FoodIgnoreLines, FoodUnweightedLines, FoodPreprocessLines, FoodAffixes, "food"}, + {EnchantMatchLines, {}, EnchantUnweightedLines, EnchantPreprocessLines, EnchantAffixes, "enchant"}, {FishingMatchLines, {}, {}, {}, FishingAffixes, "fishing"}, {UseEffectMatchLines, UseEffectIgnoreLines, UseEffectUnweightedLines, UseEffectPreprocessLines, UseEffectAffixes, "useEffects"}, } @@ -440,6 +542,82 @@ MultipleStatLines = { end end end}, + -- used by some enchants + {"^(%a[%a ]+ rating )and (%a[%a ]+ rating )by( %d+)$", + function(text, pattern) + local start, _, stat1, stat2, value = string.find(text, pattern) + if start then + stat1 = WeightsWatcher.singleStat(stat1 .. "by" .. value) + stat2 = WeightsWatcher.singleStat(stat2 .. "by" .. value) + if stat1 and stat2 then + return stat1 + stat2 + else + ww_unparsed_lines[text][pattern].parsedTo = {stat1, stat2} + end + end + end}, + {"^(%a[%a ]+ )and (%a[%a ]+ )rating by( %d+)$", + function(text, pattern) + local start, _, stat1, stat2, value = string.find(text, pattern) + if start then + stat1 = WeightsWatcher.singleStat(stat1 .. "rating by" .. value) + stat2 = WeightsWatcher.singleStat(stat2 .. "rating by" .. value) + if stat1 and stat2 then + return stat1 + stat2 + else + ww_unparsed_lines[text][pattern].parsedTo = {stat1, stat2} + end + end + end}, + {"^(%a[%a ]+ )and (%a[%a ]+ )rating by( %d+)$", + function(text, pattern) + local start, _, stat1, stat2, value = string.find(text, pattern) + if start then + stat1 = WeightsWatcher.singleStat(stat1 .. "rating by" .. value) + stat2 = WeightsWatcher.singleStat(stat2 .. "rating by" .. value) + if stat1 and stat2 then + return stat1 + stat2 + else + ww_unparsed_lines[text][pattern].parsedTo = {stat1, stat2} + end + end + end}, + {"^(%a+ )and (%a+ )spell power by( %d+)$", + function(text, pattern) + local start, _, stat1, stat2, value = string.find(text, pattern) + if start then + stat1 = WeightsWatcher.singleStat(stat1 .. "spell damage by" .. value) + stat2 = WeightsWatcher.singleStat(stat2 .. "spell damage by" .. value) + if stat1 and stat2 then + return stat1 + stat2 + else + ww_unparsed_lines[text][pattern].parsedTo = {stat1, stat2} + end + end + end}, + {"^([+-]?%d+) mana and health every 5 seco?n?d?s?$", + function(text, pattern) + local start, _, value = string.find(text, pattern) + if start then + value = tonumber(value) + local stats = WeightsWatcher.newStatTable() + stats["mp5"] = value + stats["hp5"] = value + return stats + end + end}, + {"^([+-]?%d+) health and mana every 5 seco?n?d?s?$", + function(text, pattern) + local start, _, value = string.find(text, pattern) + if start then + value = tonumber(value) + local stats = WeightsWatcher.newStatTable() + stats["mp5"] = value + stats["hp5"] = value + return stats + end + end}, + -- Convert this and following to re-use the parser? -- item 10779 {"(%a[%a ]+) by (%d+), (%a[%a ]+) by (%d+),? and your normal health regeneration by (%d+)", function(text, pattern) @@ -452,6 +630,18 @@ MultipleStatLines = { return stats end end}, + {"^(%a+), (%a+), and (%a+) by (%d+)$", + function(text, pattern) + local start, _, stat1, stat2, stat3, value = string.find(text, pattern) + if start then + value = tonumber(value) + local stats = WeightsWatcher.newStatTable() + stats[stat1] = value + stats[stat2] = value + stats[stat3] = value + return stats + end + end}, -- currently used only by items 31864 and 31872 {"^([^,]+) & ([^,]+)$", WeightsWatcher.twoStats}, -- currently only used by item 28363 @@ -489,13 +679,90 @@ SingleStatLines = { return WeightsWatcher.newStatTable({[name] = -tonumber(value)}) end end}, + {"^resistance to all schools of magic by ([+-]?%d+)$", + function(text, pattern) + return WeightsWatcher.singleStatValueOnly(text, pattern, "all resistances") + end}, + {"^(%a+ spell )power by ([+-]?%d+)$", + function(text, pattern) + local start, _, name, value = string.find(text, pattern) + if start then + return WeightsWatcher.newStatTable({[name .. "damage"] = tonumber(value)}) + end + end}, + {"^resilience by ([+-]?%d+)$", + function(text, pattern) + return WeightsWatcher.singleStatValueOnly(text, pattern, "resilience rating") + end}, + {"^mounted movement speed by ([+-]?%d+)%%$", + function(text, pattern) + return WeightsWatcher.singleStatValueOnly(text, pattern, "mount speed (percent)") + end}, + {"^mount speed by ([+-]?%d+)%%$", + function(text, pattern) + return WeightsWatcher.singleStatValueOnly(text, pattern, "mount speed (percent)") + end}, + {"^([+-]?%d+) additional (armor)$", WeightsWatcher.statNumFirst}, + {"^stealth$", + function(text, pattern) + return WeightsWatcher.newStatTable({["increased stealth"] = 1}) + end}, + {"^stealth slightly$", + function(text, pattern) + return WeightsWatcher.newStatTable({["increased stealth"] = 1}) + end}, {"^effective stealth level by (%d+)$", function(text, pattern) return WeightsWatcher.singleStatValueOnly(text, pattern, "increased stealth") end}, + {"^threat from all attacks and spells by (%d+)%%$", + function(text, pattern) + local start, _, value = string.find(text, pattern) + if start then + return WeightsWatcher.newStatTable({["threat (percent)"] = value}) + end + end}, + {"^threat caused by (%d+)%%$", + function(text, pattern) + local start, _, value = string.find(text, pattern) + if start then + return WeightsWatcher.newStatTable({["threat (percent)"] = value}) + end + end}, + {"^decrease threat from all attacks and spells by (%d+)%%$", + function(text, pattern) + local start, _, value = string.find(text, pattern) + if start then + return WeightsWatcher.newStatTable({["threat reduction (percent)"] = value}) + end + end}, + {"^([+-]?%d+) additional (block value)$", WeightsWatcher.statNumFirst}, + {"^reducing the duration of disarm effects by ([+-]?%d+)%%$", + function(text, pattern) + return WeightsWatcher.singleStatValueOnly(text, pattern, "disarm duration reduction (percent)") + end}, + {"^prismatic socket$", + function(text, pattern) + return WeightsWatcher.newStatTable({[text] = 1}) + end}, + + -- profession skills + {"^(fishing) skill by ([+-]?%d+)$", WeightsWatcher.statNameFirst}, + {"^(herbalism) skill by ([+-]?%d+)$", WeightsWatcher.statNameFirst}, + {"^(mining) skill by ([+-]?%d+)$", WeightsWatcher.statNameFirst}, + {"^(skinning) skill by (%d+)$", WeightsWatcher.statNameFirst}, + -- Tends to eat other stats if not last - {"^(%a[%a ]+) by (%d+)$", WeightsWatcher.statNameFirst}, + {"^(%a+ ?%a+ ?%a+ ?%a+) by (%d+)$", WeightsWatcher.statNameFirst}, + {"^a minor movement speed increase$", + function(text, pattern) + return WeightsWatcher.newStatTable({["minor run speed"] = 1}) + end}, + {"^reduce threat slightly$", + function(text, pattern) + return WeightsWatcher.newStatTable({["threat reduction (percent)"] = 2}) + end}, {"^%((%d+%.?%d*) damage per second%)$", function(text, pattern) @@ -535,6 +802,7 @@ SingleStatLines = { {"^([+-]?%d+) (ranged attack power)$", WeightsWatcher.statNumFirst}, {"^([+-]?%d+) (all stats)$", WeightsWatcher.statNumFirst}, {"^([+-]?%d+) to (all stats)$", WeightsWatcher.statNumFirst}, + {"^([+-]?%d+) (ranged damage)$", WeightsWatcher.statNumFirst}, {"^chance to resist (%a+) effects by (%d+)%%$", function(text, pattern) @@ -612,7 +880,7 @@ SingleStatLines = { function(text, pattern) return WeightsWatcher.singleStatValueOnly(text, pattern, "mana (percent)") end}, - {"^([+-]?%d+) (melee damage)$", WeightsWatcher.statNumFirst}, + {"^([+-]?%d+) (%a+ damage)$", WeightsWatcher.statNumFirst}, {"^minor run speed increase$", function(text, pattern) return WeightsWatcher.newStatTable({["minor run speed"] = 1}) -- 1.7.9.5