From 54897aaa18b79f72c03e2e743975043884a72287 Mon Sep 17 00:00:00 2001 From: "Johnny C. Lam" Date: Thu, 15 May 2014 23:18:23 +0000 Subject: [PATCH] Rudimentary translation of SimulationCraft's rune conditions. git-svn-id: svn://svn.curseforge.net/wow/ovale/mainline/trunk@1448 d5049fe3-3747-40f7-a4b5-f36d6801af5f --- OvaleSimulationCraft.lua | 60 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) diff --git a/OvaleSimulationCraft.lua b/OvaleSimulationCraft.lua index 593fd85..43ceceb 100644 --- a/OvaleSimulationCraft.lua +++ b/OvaleSimulationCraft.lua @@ -1085,6 +1085,16 @@ do ["^time_to_bloodlust$"] = "TimeToBloodlust()", } + -- Runes + local RUNE_PATTERN = { + ["^(blood)$"] = true, + ["^(death)$"] = true, + ["^(frost)$"] = true, + ["^(unholy)$"] = true, + ["^rune%.([%w_]+)$"] = true, + -- ["^rune%.([%w_]+)%.([%w_]+)$"] = true, + } + local TRANSLATED_TOKEN = { ["^!$"] = "not", ["^!=$"] = "!=", @@ -1289,6 +1299,56 @@ do end end if not translated then + for pattern in pairs(RUNE_PATTERN) do + local rune = strmatch(token, pattern) + if rune then + -- Look ahead at the next token to see which rune condition is needed. + local _, comparatorToken = tokenIterator() + if comparatorToken == "=" then + local operandTokenType, operandToken = tokenIterator() + if operandTokenType == "number" then + local number = tonumber(operandToken) + local maxRunes = (rune == "death") and 6 or 2 + if number == 0 then + translated = format("Rune(%s) < 1", rune) + elseif number == maxRunes then + translated = format("Rune(%s) >= %d", rune, number) + else -- if 0 < number and number < maxRunes then + translated = format("{ Rune(%s) >= %d and Rune(%s) < %d }", rune, number, rune, number + 1) + end + else + translated = format("RuneCount(%s) == %s", rune, operandToken) + end + elseif comparatorToken == "!=" then + local operandTokenType, operandToken = tokenIterator() + if operandTokenType == "number" then + local number = tonumber(operandToken) + local maxRunes = (rune == "death") and 6 or 2 + if number == 0 then + translated = format("Rune(%s) >= 1", rune) + elseif number == maxRunes then + translated = format("Rune(%s) < %d", rune, maxRunes) + else -- if 0 < number and number < maxRunes then + translated = format("{ Rune(%s) < %d or Rune(%s) >= %d }", rune, number, rune, number + 1) + end + else + translated = format("not RuneCount(%s) == %s", rune, operandToken) + end + elseif comparatorToken == "<=" or comparatorToken == ">=" then + translated = format("Rune(%s) %s", rune, comparatorToken) + elseif comparatorToken == "<" or comparatorToken == ">" then + local operandTokenType, operandToken = tokenIterator() + if operandTokenType == "number" then + translated = format("Rune(%s) %s= %d", rune, comparatorToken, 1 + tonumber(operandToken)) + else + translated = format("Rune(%s) %s= 1 + %s", rune, comparatorToken, operandToken) + end + end + break + end + end + end + if not translated then translated = format("FIXME_%s", token) end if isTargetFound then -- 1.7.9.5