Module:Augmenting Uses
Jump to navigation
Jump to search
local p = {}
local findId = require("Module:FindId")
local img = require("Module:Img")
local craftingAugmentingData = mw.loadData("Module:CraftingAugmenting/data")
local itemsData = mw.loadData("Module:Items/data")
local pageName = mw.title.getCurrentTitle().fullText
local scrappingBaseXp = 20
local scrappingXpPower = 2
local augmentationBonusNames ={
["toolBoost.mining"] = "[[mining]]",
["toolBoost.foraging"] = "[[foraging]]",
["offensiveAccuracyAffinityRating.Ice"] = "[[Combat#Offensive Stats|Ice Accuracy]]",
["offensiveAccuracyAffinityRating.Nature"] = "[[Combat#Offensive Stats|Nature Accuracy]]",
["offensiveAccuracyAffinityRating.Fire"] = "[[Combat#Offensive Stats|Fire Accuracy]]",
["offensiveAccuracyAffinityRating.Lightning"] = "[[Combat#Offensive Stats|Lightning Accuracy]]",
["offensiveAccuracyAffinityRating.Magic"] = "[[Combat#Offensive Stats|Magic Accuracy]]",
["toolBoost.farming"] = "[[Farming]]",
["toolBoost.smithing"] = "[[Smithing]]",
["toolBoost.runecrafting"] = "[[Runecrafting]]",
["toolBoost.cooking"] = "[[cooking]]",
["toolBoost.enchanting"] = "[[enchanting]]",
["toolBoost.fishing"] = "[[fishing]]",
["toolBoost.fishingBaitPower"] = "Bait",
["toolBoost.fishingRarityPower"] = "Bonus Rarity",
["toolBoost.fishingReelPower"] = "Reel",
["offensiveAccuracyAffinityRating.Chaos"] = [[Combat#Offensive Stats|Choas Accuracy]],
["weaponBonus.strength"] = "[[Combat#Offensive Stats|strength]]",
["weaponBonus.intellect"] = "[[Combat#Offensive Stats|intellect]]",
["weaponBonus.dexterity"] = "[[Combat#Offensive Stats|dexterity]]",
["offensiveAccuracyAffinityRating.Melee"] = "[[Combat#Offensive Stats|Melee Accuracy]]",
["offensiveCritical.chance"] = "[[Combat#Offensive Stats|Crit Chance]]",
["offensiveCritical.damageMultiplier"] = "[[Combat#Offensive Stats|Crit Mult]]",
["armorBonus.agility"] = "[[Combat#Defensive Stats|Agility]]",
["armorBonus.protection"] = "[[Combat#Defensive Stats|Protectino]]",
["armorBonus.stamina"] = "[[Combat#Defensive Stats|Stamina]]",
["armorBonus.resistance"] = "[[Combat#Defensive Stats|Resistance]]",
["offensiveAccuracyAffinityRating.Range"] = "[[Combat#Offensive Stats|Range Accuracy]]",
["offensiveAccuracyAffinityRating.Blunt"] = "[[Combat#Offensive Stats|Blunt Accuracy]]",
}
local function pairsByKeys(t, f)
local a = {}
local orgi_key_type
local orgi_key_numbered
for n in pairs(t) do
if tonumber(n) == nil then
table.insert(a, n)
orgi_key_type = "word"
elseif type(n) == "number" then
table.insert(a, n)
orgi_key_type = "int"
elseif type(n) == "string" and type(tonumber(n) == "number") then
orgi_key_type = "number"
table.insert(a, tonumber(n))
end
end
table.sort(a, f)
local key
local value
local i = 0 -- iterator variable
local iter = function() -- iterator function
i = i + 1
if a[i] == nil then
return nil
elseif orgi_key_type == "word" or orgi_key_type == "int" then
key = a[i]
value = t[a[i]]
elseif orgi_key_type == "number" then
key = tostring(a[i])
value = t[tostring(a[i])]
end
return key, value
end
return iter
end
local function tablelength(T)
local count = 0
for _ in pairs(T) do count = count + 1 end
return count
end
local function getItemTier(itemData)
local highestRequiredLevel
if itemData.requiredLevel then
-- Highest level of the required skills
highestRequiredLevel = 0
for _, level in pairs(itemData.requiredLevel) do
if level > highestRequiredLevel then
highestRequiredLevel = level
end
end
highestRequiredLevel = tonumber(string.format("%.1f", highestRequiredLevel / 10))
end
local itemTier = itemData.overrideItemTier or highestRequiredLevel or itemData.enchantmentTier or 1
return itemTier
end
local function getScrapExperience(itemData)
local item_tier = getItemTier(itemData)
local xp = scrappingBaseXp * (item_tier ^ scrappingXpPower)
return math.floor(xp)
end
---fetches an item object
---@param itemId integer|string or string
---@return table|string
local function getItem(itemId)
local item = itemsData[tostring(itemId)]
if item then
return item
else
return "Module:Items/data out of date"
end
end
local function genTable(name, collapse)
local itemI = getItem(findId._findId({name, "item"}))
local collapseS = ""
if collapse == 1 then
collapseS = " mw-made-collapsible mw-collapsible"
elseif collapse == 2 then
collapseS = " mw-made-collapsible mw-collapsible mw-collapsed"
end
local matchedAugs = {}
for itemId, itemData in pairs(craftingAugmentingData) do
if itemData.scrapping then
for costId, _ in pairsByKeys(itemData.scrapping) do
if tonumber(costId) == itemI.id then
matchedAugs[itemId] = itemData.scrapping
end
end
end
end
local t = mw.html.create("table")
t:addClass("wikitable sortable jquery-tablesorter" .. collapseS)
:tag('tr')
:tag('th')
:attr("colspan", "2")
:wikitext("Item")
:done()
:tag('th')
:wikitext("XP")
:done()
:tag("th")
:wikitext("Aug. Bonus.")
:done()
:tag("th")
:wikitext("Materials")
:done()
:done()
for itemId, itemData in pairs(matchedAugs) do
local item = getItem(itemId)
local dTr = t:tag('tr')
:tag('td')
:wikitext(img._img({item.name, '40'}))
:done()
:tag('td')
:wikitext("[[" .. item.name .. "]]")
:done()
:tag('td')
:css('text-align', 'center')
:wikitext(tostring(getScrapExperience(item)))
:done()
local augBonusS = ""
if item.equipmentStats.augmentationBonus then
local augBonusC = tablelength(item.equipmentStats.augmentationBonus)
for _, augBonus in ipairs(item.equipmentStats.augmentationBonus) do
augBonusS = augBonusS .. augmentationBonusNames[augBonus.stat] .. " +" .. augBonus.value
augBonusC = augBonusC - 1
if augBonusC > 0 then
augBonusS = augBonusS .. "<br>"
end
end
elseif not item.equipmentStats.augmentationBonus then
augBonusS = "-"
end
dTr:tag('td')
:css('text-align', 'center')
:wikitext(augBonusS)
:done()
local costCell = dTr:tag('td')
local augCostC = tablelength(itemData)
for costId, costQuantity in pairs(itemData) do
local costItem = getItem(costId)
if tonumber(costId) == itemI.id then
costCell:tag('span'):css('display', 'inline-block')
:wikitext(tostring(costQuantity) .. " " .. img._img({costItem.name, '20'}))
:tag('span'):css('font-weight', 'bold')
:wikitext(costItem.name)
:done()
:done()
augCostC = augCostC - 1
if augCostC > 0 then
costCell:tag('br')
end
else
costCell:tag('span'):css('display', 'inline-block')
:wikitext(tostring(costQuantity) .. " " .. img._img({costItem.name, '20', word = 1}))
:done()
augCostC = augCostC - 1
if augCostC > 0 then
costCell:tag('br')
end
end
end
dTr:done()
end
return t
end
function p.augmentingUses(frame)
return p._augmentingUses(frame:getParent().args)
end
function p._augmentingUses(_args)
local name = ""
if tablelength(_args) == 0 then
name = pageName
else
name = _args[1]
end
local collapse = 0
if _args["collapse"] == "collapseable" then
collapse = 1
elseif _args["collapse"] == "collapsed" then
collapse =2
end
local t = genTable(name, collapse)
return t
end
return p