Add per-spec stat scoring and top upgrades computation
This commit is contained in:
@@ -16,6 +16,50 @@ local DEFAULT_AMIBIS_CHAR_DB = {
|
|||||||
overrideSpec = nil,
|
overrideSpec = nil,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
local TOP_UPGRADES_COUNT = 3
|
||||||
|
|
||||||
|
local UPGRADE_STAT_KEYS = {
|
||||||
|
["PRIEST"] = {
|
||||||
|
["Discipline"] = { "healing", "spellDamage", "spellPower", "intellect", "spirit", "mp5", "haste", "crit" },
|
||||||
|
["Holy"] = { "healing", "spellPower", "intellect", "spirit", "mp5", "haste", "crit" },
|
||||||
|
["Shadow"] = { "spellDamage", "spellPower", "intellect", "spirit", "mp5", "haste", "crit" },
|
||||||
|
},
|
||||||
|
["DRUID"] = {
|
||||||
|
["Balance"] = { "spellDamage", "spellPower", "intellect", "spirit", "mp5", "haste", "crit" },
|
||||||
|
["Restoration"] = { "healing", "spellPower", "intellect", "spirit", "mp5", "haste", "crit" },
|
||||||
|
},
|
||||||
|
["PALADIN"] = {
|
||||||
|
["Holy"] = { "healing", "spellPower", "intellect", "spirit", "mp5", "haste", "crit" },
|
||||||
|
},
|
||||||
|
["SHAMAN"] = {
|
||||||
|
["Elemental"] = { "spellDamage", "spellPower", "intellect", "spirit", "mp5", "haste", "crit" },
|
||||||
|
["Restoration"] = { "healing", "spellPower", "intellect", "spirit", "mp5", "haste", "crit" },
|
||||||
|
},
|
||||||
|
["MAGE"] = {
|
||||||
|
["Arcane"] = { "spellDamage", "spellPower", "intellect", "spirit", "mp5", "haste", "crit" },
|
||||||
|
["Fire"] = { "spellDamage", "spellPower", "intellect", "spirit", "mp5", "haste", "crit" },
|
||||||
|
["Frost"] = { "spellDamage", "spellPower", "intellect", "spirit", "mp5", "haste", "crit" },
|
||||||
|
},
|
||||||
|
["WARLOCK"] = {
|
||||||
|
["Affliction"] = { "spellDamage", "spellPower", "intellect", "spirit", "mp5", "haste", "crit" },
|
||||||
|
["Demonology"] = { "spellDamage", "spellPower", "intellect", "spirit", "mp5", "haste", "crit" },
|
||||||
|
["Destruction"] = { "spellDamage", "spellPower", "intellect", "spirit", "mp5", "haste", "crit" },
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
local DEFAULT_UPGRADE_STAT_KEYS = { "spellPower", "intellect", "spirit", "mp5", "haste", "crit" }
|
||||||
|
|
||||||
|
local function GetUpgradeStatKeys(class, spec)
|
||||||
|
if class and UPGRADE_STAT_KEYS[class] and UPGRADE_STAT_KEYS[class][spec] then
|
||||||
|
return UPGRADE_STAT_KEYS[class][spec]
|
||||||
|
end
|
||||||
|
return DEFAULT_UPGRADE_STAT_KEYS
|
||||||
|
end
|
||||||
|
|
||||||
|
function Amibis:GetStatKeysForSpec(class, spec)
|
||||||
|
return GetUpgradeStatKeys(class, spec)
|
||||||
|
end
|
||||||
|
|
||||||
local function InitializeDB()
|
local function InitializeDB()
|
||||||
if not AmibisDB then
|
if not AmibisDB then
|
||||||
AmibisDB = CopyTable(DEFAULT_AMIBIS_DB)
|
AmibisDB = CopyTable(DEFAULT_AMIBIS_DB)
|
||||||
@@ -139,6 +183,11 @@ local STAT_MAP = {
|
|||||||
["ITEM_MOD_HEALING_SHORT"] = "healing",
|
["ITEM_MOD_HEALING_SHORT"] = "healing",
|
||||||
}
|
}
|
||||||
|
|
||||||
|
local MAX_AGGREGATE_STATS = {
|
||||||
|
healing = true,
|
||||||
|
spellDamage = true,
|
||||||
|
}
|
||||||
|
|
||||||
function Amibis:ScanItemStats(itemID)
|
function Amibis:ScanItemStats(itemID)
|
||||||
if not itemID then return nil end
|
if not itemID then return nil end
|
||||||
|
|
||||||
@@ -152,8 +201,16 @@ function Amibis:ScanItemStats(itemID)
|
|||||||
|
|
||||||
local result = {}
|
local result = {}
|
||||||
for wowKey, ourKey in pairs(STAT_MAP) do
|
for wowKey, ourKey in pairs(STAT_MAP) do
|
||||||
if stats[wowKey] then
|
local value = stats[wowKey]
|
||||||
result[ourKey] = (result[ourKey] or 0) + stats[wowKey]
|
if value then
|
||||||
|
if MAX_AGGREGATE_STATS[ourKey] then
|
||||||
|
local current = result[ourKey]
|
||||||
|
if not current or value > current then
|
||||||
|
result[ourKey] = value
|
||||||
|
end
|
||||||
|
else
|
||||||
|
result[ourKey] = (result[ourKey] or 0) + value
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -202,7 +259,7 @@ function Amibis:CompareGear()
|
|||||||
slots = {},
|
slots = {},
|
||||||
bisCount = 0,
|
bisCount = 0,
|
||||||
totalSlots = 0,
|
totalSlots = 0,
|
||||||
biggestUpgrade = nil,
|
topUpgrades = {},
|
||||||
}
|
}
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -210,7 +267,7 @@ function Amibis:CompareGear()
|
|||||||
local slots = {}
|
local slots = {}
|
||||||
local bisCount = 0
|
local bisCount = 0
|
||||||
local totalSlots = 0
|
local totalSlots = 0
|
||||||
local biggestUpgrade = nil
|
local allUpgrades = {}
|
||||||
|
|
||||||
for slotName, bisItem in pairs(bisList) do
|
for slotName, bisItem in pairs(bisList) do
|
||||||
totalSlots = totalSlots + 1
|
totalSlots = totalSlots + 1
|
||||||
@@ -222,47 +279,48 @@ function Amibis:CompareGear()
|
|||||||
bisCount = bisCount + 1
|
bisCount = bisCount + 1
|
||||||
end
|
end
|
||||||
|
|
||||||
local itemLevelDiff = nil
|
|
||||||
if equippedItem and not isBIS then
|
|
||||||
local equippedILvl = GetItemInfo(equippedItem.itemID) and select(4, GetItemInfo(equippedItem.itemID))
|
|
||||||
local bisILvl = GetItemInfo(bisItem.itemID) and select(4, GetItemInfo(bisItem.itemID))
|
|
||||||
if equippedILvl and bisILvl then
|
|
||||||
itemLevelDiff = bisILvl - equippedILvl
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
if not isBIS and equippedItem then
|
|
||||||
if not biggestUpgrade or (itemLevelDiff and biggestUpgrade.itemLevelDiff and itemLevelDiff > biggestUpgrade.itemLevelDiff) then
|
|
||||||
biggestUpgrade = {
|
|
||||||
slot = slotName,
|
|
||||||
equipped = equippedItem,
|
|
||||||
bis = bisItem,
|
|
||||||
itemLevelDiff = itemLevelDiff,
|
|
||||||
}
|
|
||||||
elseif not biggestUpgrade then
|
|
||||||
biggestUpgrade = {
|
|
||||||
slot = slotName,
|
|
||||||
equipped = equippedItem,
|
|
||||||
bis = bisItem,
|
|
||||||
itemLevelDiff = itemLevelDiff,
|
|
||||||
}
|
|
||||||
end
|
|
||||||
elseif not isBIS and not biggestUpgrade then
|
|
||||||
biggestUpgrade = {
|
|
||||||
slot = slotName,
|
|
||||||
equipped = nil,
|
|
||||||
bis = bisItem,
|
|
||||||
itemLevelDiff = nil,
|
|
||||||
}
|
|
||||||
end
|
|
||||||
|
|
||||||
table.insert(slots, {
|
table.insert(slots, {
|
||||||
slotName = slotName,
|
slotName = slotName,
|
||||||
equipped = equippedItem,
|
equipped = equippedItem,
|
||||||
bis = bisItem,
|
bis = bisItem,
|
||||||
isBIS = isBIS,
|
isBIS = isBIS,
|
||||||
itemLevelDiff = itemLevelDiff,
|
|
||||||
})
|
})
|
||||||
|
|
||||||
|
if not isBIS then
|
||||||
|
local statDiffs = {}
|
||||||
|
local score = 0
|
||||||
|
local equippedStats = (equippedItem and self:ScanItemStats(equippedItem.itemID)) or {}
|
||||||
|
local bisStats = self:ScanItemStats(bisItem.itemID) or {}
|
||||||
|
local upgradeStatKeys = GetUpgradeStatKeys(class, spec)
|
||||||
|
|
||||||
|
for _, statKey in ipairs(upgradeStatKeys) do
|
||||||
|
local diff = (bisStats[statKey] or 0) - (equippedStats[statKey] or 0)
|
||||||
|
if diff > 0 then
|
||||||
|
statDiffs[statKey] = diff
|
||||||
|
score = score + diff
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
table.insert(allUpgrades, {
|
||||||
|
slot = slotName,
|
||||||
|
equipped = equippedItem,
|
||||||
|
bis = bisItem,
|
||||||
|
statDiffs = statDiffs,
|
||||||
|
score = score,
|
||||||
|
})
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
table.sort(allUpgrades, function(a, b)
|
||||||
|
if a.score ~= b.score then
|
||||||
|
return a.score > b.score
|
||||||
|
end
|
||||||
|
return a.slot < b.slot
|
||||||
|
end)
|
||||||
|
|
||||||
|
local topUpgrades = {}
|
||||||
|
for i = 1, math.min(TOP_UPGRADES_COUNT, #allUpgrades) do
|
||||||
|
table.insert(topUpgrades, allUpgrades[i])
|
||||||
end
|
end
|
||||||
|
|
||||||
table.sort(slots, function(a, b)
|
table.sort(slots, function(a, b)
|
||||||
@@ -307,7 +365,7 @@ function Amibis:CompareGear()
|
|||||||
slots = slots,
|
slots = slots,
|
||||||
bisCount = bisCount,
|
bisCount = bisCount,
|
||||||
totalSlots = totalSlots,
|
totalSlots = totalSlots,
|
||||||
biggestUpgrade = biggestUpgrade,
|
topUpgrades = topUpgrades,
|
||||||
equippedStats = equippedStats,
|
equippedStats = equippedStats,
|
||||||
bisStats = bisStats,
|
bisStats = bisStats,
|
||||||
statsComplete = statsComplete,
|
statsComplete = statsComplete,
|
||||||
|
|||||||
Reference in New Issue
Block a user