Anonymous

Module:Skills: Difference between revisions

From Melvor Idle
Use printError function
(Move Farming functions to Module:Skills/Gathering)
(Use printError function)
(15 intermediate revisions by 2 users not shown)
Line 15: Line 15:


local p = {}
local p = {}
local ItemData = mw.loadData('Module:Items/data')
local SkillData = mw.loadData('Module:Skills/data')


local Shared = require('Module:Shared')
local Shared = require('Module:Shared')
local Constants = require('Module:Constants')
local Constants = require('Module:Constants')
local GameData = require('Module:GameData')
local SkillData = GameData.skillData
local Items = require('Module:Items')
local Items = require('Module:Items')
local Icons = require('Module:Icons')
local Icons = require('Module:Icons')


local MasteryCheckpoints = {.1, .25, .5, .95}
-- Thieving
function p.getThievingNPCByID(npcID)
return GameData.getEntityByID(SkillData.Thieving.npcs, npcID)
end


-- Thieving
function p.getThievingNPC(npcName)
function p.getThievingNPC(npcName)
local result = nil
return GameData.getEntityByName(SkillData.Thieving.npcs, npcName)
for i, npc in Shared.skpairs(SkillData.Thieving.NPCs) do
if npc.name == npcName then
result = Shared.clone(npc)
break
end
end
return result
end
end


function p.getThievingNPCArea(npc)
function p.getThievingNPCArea(npc)
if type(npc) == 'string' then
for i, area in ipairs(SkillData.Thieving.areas) do
npc = p.getThievingNPC(npc)
for j, npcID in ipairs(area.npcIDs) do
end
 
local result = nil
for i, area in Shared.skpairs(SkillData.Thieving.Areas) do
for j, npcID in pairs(area.npcs) do
if npcID == npc.id then
if npcID == npc.id then
result = area
return area
break
end
end
end
end
end
end
return result
end
end


Line 81: Line 68:
local npc = p.getThievingNPC(npcName)
local npc = p.getThievingNPC(npcName)
if npc == nil then
if npc == nil then
return "ERROR: Invalid Thieving NPC "..npcName.."[[Category:Pages with script errors]]"
return Shared.printError('Invalid Thieving NPC ' .. npcName)
end
end


Line 89: Line 76:
function p.getThievingSourcesForItem(itemID)
function p.getThievingSourcesForItem(itemID)
local resultArray = {}
local resultArray = {}
local areaNPCs = {}
local areaNPCs = {}


--First check area unique drops
--First check area unique drops
--If an area drops the item, add all the NPC ids to the list so we can add them later
--If an area drops the item, add all the NPC ids to the list so we can add them later
if not result then
for i, area in pairs(SkillData.Thieving.areas) do
for i, area in pairs(SkillData.Thieving.Areas) do
for j, drop in pairs(area.uniqueDrops) do
for j, drop in pairs(area.uniqueDrops) do
if drop.id == itemID then
if drop.itemID == itemID then
for k, npcID in ipairs(area.npcIDs) do
for k, npcID in pairs(area.npcs) do
areaNPCs[npcID] = drop.quantity
areaNPCs[npcID] = drop.qty
end
break
end
end
break
end
end
end
end
Line 108: Line 92:


--Now go through and get drop chances on each NPC if needed
--Now go through and get drop chances on each NPC if needed
for i, npc in pairs(SkillData.Thieving.NPCs) do
for i, npc in pairs(SkillData.Thieving.npcs) do
local totalWt = 0
local totalWt = 0
local dropWt = 0
local dropWt = 0
local dropQty = 0
local dropQty = { min = 0, max = 0 }
for j, drop in pairs(npc.lootTable) do
for j, drop in ipairs(npc.lootTable) do
totalWt = totalWt + drop[2]
totalWt = totalWt + drop.weight
if drop[1] == itemID then
if drop.itemID == itemID then
dropWt = drop[2]
dropWt = drop.weight
dropQty = drop[3]
dropQty = { min = drop.minQuantity, max = drop.maxQuantity }
end
end
end
end
if dropWt > 0 then
if dropWt > 0 then
table.insert(resultArray, {npc = npc.name, minQty = 1, maxQty = dropQty, wt = dropWt * SkillData.Thieving.ItemChance, totalWt = totalWt * 100, level = npc.level})
table.insert(resultArray, {npc = npc.name, minQty = dropQty.min, maxQty = dropQty.max, wt = dropWt * SkillData.Thieving.itemChance, totalWt = totalWt * 100, level = npc.level, npcID = npc.id})
end
end


--Chance of -1 on unique drops is to indicate variable chance
--Chance of -1 on unique drops is to indicate variable chance
if npc.uniqueDrop ~= nil and npc.uniqueDrop.itemID == itemID then
if npc.uniqueDrop ~= nil and npc.uniqueDrop.id == itemID then
table.insert(resultArray, {npc = npc.name, minQty = npc.uniqueDrop.qty, maxQty = npc.uniqueDrop.qty, wt = -1, totalWt = -1, level = npc.level})
table.insert(resultArray, {npc = npc.name, minQty = npc.uniqueDrop.quantity, maxQty = npc.uniqueDrop.quantity, wt = -1, totalWt = -1, level = npc.level, npcID = npc.id})
end
end


if areaNPCs[npc.id] ~= nil then
if areaNPCs[npc.id] ~= nil then
table.insert(resultArray, {npc = npc.name, minQty = areaNPCs[npc.id], maxQty = areaNPCs[npc.id], wt = SkillData.Thieving.AreaUniqueChance, totalWt = 100, level = npc.level})
table.insert(resultArray, {npc = npc.name, minQty = areaNPCs[npc.id], maxQty = areaNPCs[npc.id], wt = SkillData.Thieving.baseAreaUniqueChance, totalWt = 100, level = npc.level, npcID = npc.id})
end
end
end
end


for i, drop in pairs(SkillData.Thieving.RareItems) do
for i, drop in ipairs(SkillData.Thieving.generalRareItems) do
if drop.itemID == itemID then
if drop.itemID == itemID then
table.insert(resultArray, {npc = 'all', minQty = 1, maxQty = 1, wt = 1, totalWt = Shared.round2(1/(drop.chance/100), 0), level = 1})
if drop.npcs == nil then
table.insert(resultArray, {npc = 'all', minQty = 1, maxQty = 1, wt = 1, totalWt = Shared.round2(1/(drop.chance/100), 0), level = 1, npcID = itemID})
else
for j, npcID in ipairs(drop.npcs) do
local npc = p.getThievingNPCByID(npcID)
if npc ~= nil then
table.insert(resultArray, {npc = npc.name, minQty = 1, maxQty = 1, wt = 1, totalWt = Shared.round2(1/(drop.chance/100), 0), level = npc.level, npcID = npc.id})
end
end
end
end
end
end
end
Line 144: Line 137:
-- Astrology
-- Astrology
function p.getConstellationByID(constID)
function p.getConstellationByID(constID)
return SkillData.Astrology.Constellations[constID]
return GameData.getEntityByID(SkillData.Astrology.recipes, constID)
end
end


function p.getConstellation(constName)
function p.getConstellation(constName)
for i, const in ipairs(SkillData.Astrology.Constellations) do
return GameData.getEntityByName(SkillData.Astrology.recipes, constName)
if const.name == constName then
return const
end
end
return nil
end
end


function p.getConstellations(checkFunc)
function p.getConstellations(checkFunc)
local result = {}
return GameData.getEntities(SkillData.Astrology.recipes, checkFunc)
for i, const in ipairs(SkillData.Astrology.Constellations) do
if checkFunc(const) then
table.insert(result, const)
end
end
return result
end
end


Line 206: Line 188:
local modArray = {}
local modArray = {}
local isSkillMod = {}
local isSkillMod = {}
--Adding a Group Number to hold together different bonuses from the same modifier [Falterfire 22/10/27]
local groupNum = 0
for _, modType in ipairs(modTypes) do
for _, modType in ipairs(modTypes) do
for i, skillMods in ipairs(cons[modType]) do
for i, modTypeData in ipairs(cons[modType]) do
local skillID = cons.skills[i]
groupNum = groupNum + 1
if skillID ~= nil then
local modVal = nil
for j, modName in ipairs(skillMods) do
if modValue ~= nil then
local modBaseName, modText, sign, isNegative, unsign, modBase = Constants.getModifierDetails(modName)
modVal = modValue
-- Check if modifier varies by skill, and amend the modifier value accordingly
else
local modVal = modValue
modVal = modTypeData.incrementValue * modTypeData.maxCount
if Shared.contains(modText, '{SV0}') then
end
isSkillMod[modName] = true
for j, modifier in ipairs(modTypeData.modifiers) do
modVal = {skillID, modValue}
local modEntry = (modifier.skill ~= nil and { skillID = modifier.skill, value = modVal }) or modVal
end
addToArray(modArray, {modifier.key, modEntry, group = groupNum})
addToArray(modArray, {modName, modVal})
end
end
end
end
end
Line 228: Line 211:
for i, modDefn in ipairs(modArray) do
for i, modDefn in ipairs(modArray) do
local modName, modVal = modDefn[1], modDefn[2]
local modName, modVal = modDefn[1], modDefn[2]
local isSkill = isSkillMod[modName]
local isSkill = type(modVal) == 'table' and modVal.skillID ~= nil
if modArrayKV[modName] == nil then
if modArrayKV[modName] == nil then
modArrayKV[modName] = (isSkill and { modVal } or modVal)
modArrayKV[modName] = (isSkill and { modVal } or modVal)
Line 248: Line 231:
local skillID = Constants.getSkillID(skillName)
local skillID = Constants.getSkillID(skillName)
if skillID == nil then
if skillID == nil then
return "ERROR: Failed to find a skill ID for "..skillName
return Shared.printError('Failed to find a skill ID for ' .. skillName)
end
end


local unlockTable = SkillData.MasteryUnlocks[skillID]
local _, localSkillID = GameData.getLocalID(skillID)
-- Clone so that we can sort by level
local unlockTable = Shared.clone(SkillData[localSkillID].masteryLevelUnlocks)
if unlockTable == nil then
if unlockTable == nil then
return 'ERROR: Failed to find Mastery Unlock data for '..skillName
return Shared.printError('Failed to find Mastery Unlock data for ' .. skillName)
end
end
table.sort(unlockTable, function(a, b) return (a.level == b.level and a.descriptionID < b.descriptionID) or a.level < b.level end)


local result = '{|class="wikitable"\r\n!Level!!Unlock'
local result = '{|class="wikitable"\r\n!Level!!Unlock'
for i, unlock in Shared.skpairs(unlockTable) do
for i, unlock in ipairs(unlockTable) do
result = result..'\r\n|-'
result = result..'\r\n|-'
result = result..'\r\n|'..unlock.level..'||'..unlock.unlock
result = result..'\r\n|'..unlock.level..'||'..unlock.description
end
end
result = result..'\r\n|}'
result = result..'\r\n|}'
Line 269: Line 255:
local skillID = Constants.getSkillID(skillName)
local skillID = Constants.getSkillID(skillName)
if skillID == nil then
if skillID == nil then
return "ERROR: Failed to find a skill ID for "..skillName
return Shared.printError('Failed to find a skill ID for ' .. skillName)
end
end


if SkillData.MasteryCheckpoints[skillID] == nil then
local _, localSkillID = GameData.getLocalID(skillID)
return 'ERROR: Failed to find Mastery Unlock data for '..skillName
local checkpoints = SkillData[localSkillID].masteryCheckpoints
if checkpoints == nil then
return Shared.printError('Failed to find Mastery Unlock data for ' .. skillName)
end
end


local bonuses = SkillData.MasteryCheckpoints[skillID].bonuses
local totalPoolXP = SkillData[localSkillID].baseMasteryPoolCap
local totalPoolXP = SkillData.MasteryPoolXP[skillID + 1]
local checkpointPct = GameData.rawData.masteryCheckpoints
 
local result = '{|class="wikitable"\r\n!Pool %!!style="width:100px"|Pool XP!!Bonus'
local result = '{|class="wikitable"\r\n!Pool %!!style="width:100px"|Pool XP!!Bonus'
for i, bonus in Shared.skpairs(bonuses) do
for i, checkpointDesc in ipairs(checkpoints) do
result = result..'\r\n|-'
result = result..'\r\n|-'
result = result..'\r\n|'..(MasteryCheckpoints[i] * 100)..'%||'
result = result..'\r\n|'..checkpointPct[i]..'%||'
result = result..Shared.formatnum(totalPoolXP * MasteryCheckpoints[i])..' xp||'..bonus
result = result..Shared.formatnum(math.floor(totalPoolXP * checkpointPct[i] / 100))..' xp||'..checkpointDesc
end
end
result = result..'\r\n|-\r\n!colspan="2"|Total Mastery Pool XP'
result = result..'\r\n|-\r\n!colspan="2"|Total Mastery Pool XP'
Line 294: Line 281:
local baseTokenChance = 18500
local baseTokenChance = 18500
local masterySkills = {}
local masterySkills = {}
local CCI = Items.getItemByID('melvorD:Clue_Chasers_Insignia')
if CCI == nil then return '' end


-- Find all mastery tokens
-- Build table of mastery skills
local masteryTokens = Items.getItems(function(item) return item.isToken ~= nil and item.skill ~= nil and item.isToken end)
for skillLocalID, skill in pairs(SkillData) do
for i, item in pairs(masteryTokens) do
if skill.masteryTokenID ~= nil then
local milestones = SkillData.Milestones[item.skill + 1]
table.insert(masterySkills, skill)
if milestones ~= nil then
table.insert(masterySkills, {tokenRef = i, skillID = item.skill, milestoneCount = milestones})
end
end
end
end
table.sort(masterySkills, function(a, b)
table.sort(masterySkills,
if a['milestoneCount'] == b['milestoneCount'] then
function(a, b)
return a['skillID'] < b['skillID']
if a.milestoneCount == b.milestoneCount then
else
return a.name < b.name
return a['milestoneCount'] > b['milestoneCount']
else
end
return a.milestoneCount > b.milestoneCount
end)
end
end)


-- Generate output table
-- Generate output table
local resultPart = {}
local resultPart = {}
local CCI = Items.getItem('Clue Chasers Insignia')
local CCIIcon = Icons.Icon({CCI.name, type='item', notext=true})
local CCIIcon = Icons.Icon({'Clue Chasers Insignia', type='item', notext=true})
if CCI == nil then return '' end


table.insert(resultPart, '{| class="wikitable sortable"')
table.insert(resultPart, '{| class="wikitable sortable"')
Line 321: Line 307:
table.insert(resultPart, '\r\n|-\r\n!Without ' .. CCIIcon .. '!!With ' .. CCIIcon)
table.insert(resultPart, '\r\n|-\r\n!Without ' .. CCIIcon .. '!!With ' .. CCIIcon)


for i, m in ipairs(masterySkills) do
for i, skill in ipairs(masterySkills) do
local token = masteryTokens[m.tokenRef]
local token = Items.getItemByID(skill.masteryTokenID)
local denom = math.floor(baseTokenChance / m['milestoneCount'])
local denom = math.floor(baseTokenChance / skill.milestoneCount)
local denomCCI = Shared.round(baseTokenChance / (m['milestoneCount'] * (1 + CCI.increasedItemChance / 100)), 0, 0)
local denomCCI = Shared.round(baseTokenChance / (skill.milestoneCount * (1 + CCI.modifiers.increasedOffItemChance / 100)), 0, 0)


table.insert(resultPart, '\r\n|-')
table.insert(resultPart, '\r\n|-')
table.insert(resultPart, '\r\n|style="text-align:center"|' .. Icons.Icon({token.name, type='item', size=50, notext=true}))
table.insert(resultPart, '\r\n|style="text-align:center"|' .. Icons.Icon({token.name, type='item', size=50, notext=true}))
table.insert(resultPart, '\r\n|' .. Icons.Icon({Constants.getSkillName(m['skillID']), type='skill'}))
table.insert(resultPart, '\r\n|' .. Icons.Icon({skill.name, type='skill'}))
table.insert(resultPart, '\r\n|style="text-align:right" data-sort-value="' .. denom .. '"|1/' .. Shared.formatnum(denom))
table.insert(resultPart, '\r\n|style="text-align:right" data-sort-value="' .. denom .. '"|1/' .. Shared.formatnum(denom))
table.insert(resultPart, '\r\n|style="text-align:right" data-sort-value="' .. denomCCI .. '"|1/' .. Shared.formatnum(denomCCI))
table.insert(resultPart, '\r\n|style="text-align:right" data-sort-value="' .. denomCCI .. '"|1/' .. Shared.formatnum(denomCCI))
Line 339: Line 325:
-- Skill unlock costs for Adventure game mode
-- Skill unlock costs for Adventure game mode
function p.getSkillUnlockCostTable()
function p.getSkillUnlockCostTable()
local returnPart = {}
local advMode = GameData.getEntityByID('gamemodes', 'melvorF:Adventure')
table.insert(returnPart, '{| class="wikitable stickyHeader"\r\n|- class="headerRow-0"\r\n!Unlock!!Cost!!Cumulative Cost')
if advMode ~= nil then
local unlockCount = Shared.tableCount(GameData.skillData) - Shared.tableCount(advMode.startingSkills)
local costLength = Shared.tableCount(advMode.skillUnlockCost)
local returnPart = {}
table.insert(returnPart, '{| class="wikitable stickyHeader"\r\n|- class="headerRow-0"\r\n!Unlock!!Cost!!Cumulative Cost')


local accCost = 0
local accCost = 0
for i, cost in ipairs(SkillData.SkillUnlockCosts) do
for i = 1, unlockCount, 1 do
accCost = accCost + cost
local cost = advMode.skillUnlockCost[math.min(i, costLength)]
table.insert(returnPart, '|-')
accCost = accCost + cost
table.insert(returnPart, '|' .. i .. '||' .. Icons.GP(cost) .. '||' .. Icons.GP(accCost))
table.insert(returnPart, '|-')
table.insert(returnPart, '|' .. i .. '||' .. Icons.GP(cost) .. '||' .. Icons.GP(accCost))
end
table.insert(returnPart, '|}')
 
return table.concat(returnPart, '\r\n')
end
end
table.insert(returnPart, '|}')
return table.concat(returnPart, '\r\n')
end
end


-- Accepts 1 parameter, being either:
-- Accepts 1 parameter, being either:
--  'Smelting', for which a table of all bars is generated, or
--  'Bars', for which a table of all bars is generated, or
--  A bar or tier name, which if valid generates a table of all smithing recipes using that bar/tier
--  A bar or tier name, which if valid generates a table of all smithing recipes using that bar/tier
function p.getSmithingTable(frame)
function p.getSmithingTable(frame)
local tableType = frame.args ~= nil and frame.args[1] or frame
local tableType = frame.args ~= nil and frame.args[1] or frame
tableType = Shared.splitString(tableType, ' ')[1]
 
-- Translates Smithing category names to Smithing recipe data categories
-- Has a valid category been passed (by name)?
local categoryMap = {
local category = GameData.getEntityByName(SkillData.Smithing.categories, tableType)
['Smelting'] = 0,
if category == nil then
['Bronze'] = 1,
return Shared.printError('Invalid Smithing category: "' .. tableType .. '"')
['Iron'] = 2,
['Steel'] = 3,
['Mithril'] = 4,
['Adamant'] = 5,
['Adamantite'] = 5,
['Rune'] = 6,
['Runite'] = 6,
['Dragon'] = 7,
['Dragonite'] = 7
}
local categoryID = categoryMap[tableType]
if categoryID == nil then
return 'ERROR: Invalid Smithing category: "' .. tableType .. '"[[Category:Pages with script errors]]'
end
end


Line 381: Line 360:
-- The bar list will be used later for value/bar calculations
-- The bar list will be used later for value/bar calculations
local recipeList, barIDList = {}, {}
local recipeList, barIDList = {}, {}
for i, recipe in ipairs(SkillData.Smithing.Recipes) do
for i, recipe in ipairs(SkillData.Smithing.recipes) do
if recipe.category == categoryID then
if recipe.categoryID == category.id then
local recipeItem = Items.getItemByID(recipe.itemID)
local recipeItem = Items.getItemByID(recipe.productID)
if recipeItem ~= nil then
if recipeItem ~= nil then
table.insert(recipeList, { id = i, level = recipe.level, itemName = recipeItem.name, itemValue = recipeItem.sellsFor })
table.insert(recipeList, { id = i, level = recipe.level, itemName = recipeItem.name, itemValue = recipeItem.sellsFor, expIcon = Icons.getExpansionIcon(recipeItem.id) })
end
end
elseif recipe.category == 0 then
elseif recipe.categoryID == 'melvorD:Bars' then
barIDList[recipe.itemID] = true
barIDList[recipe.productID] = true
end
end
end
end
Line 398: Line 377:
table.insert(resultPart, '\r\n!Item!!Name!!'..Icons.Icon({'Smithing', type='skill', notext=true})..' Level!!XP!!Value!!Ingredients')
table.insert(resultPart, '\r\n!Item!!Name!!'..Icons.Icon({'Smithing', type='skill', notext=true})..' Level!!XP!!Value!!Ingredients')
--Adding value/bar for things other than smelting
--Adding value/bar for things other than smelting
if categoryID > 0 then
if category.id ~= 'melvorD:Bars' then
table.insert(resultPart, '!!Value/Bar')
table.insert(resultPart, '!!Value/Bar')
end
end
Line 411: Line 390:


for i, recipeDef in ipairs(recipeList) do
for i, recipeDef in ipairs(recipeList) do
local recipe = SkillData.Smithing.Recipes[recipeDef.id]
local recipe = SkillData.Smithing.recipes[recipeDef.id]
local totalValue = recipe.baseQuantity * recipeDef.itemValue
local totalValue = recipe.baseQuantity * recipeDef.itemValue
-- Determine the bar quantity & build the recipe cost string
-- Determine the bar quantity & build the recipe cost string
Line 418: Line 397:
local costItem = Items.getItemByID(itemCost.id)
local costItem = Items.getItemByID(itemCost.id)
if costItem ~= nil then
if costItem ~= nil then
table.insert(costString, Icons.Icon({costItem.name, type='item', qty=itemCost.qty, notext=true}))
table.insert(costString, Icons.Icon({costItem.name, type='item', qty=itemCost.quantity, notext=true}))
end
end
if barIDList[itemCost.id] then
if barIDList[itemCost.id] then
barQty = barQty + itemCost.qty
barQty = barQty + itemCost.quantity
end
end
end
end
Line 428: Line 407:
table.insert(resultPart, '\r\n| ' .. Icons.Icon({recipeDef.itemName, type='item', size=50, notext=true}))
table.insert(resultPart, '\r\n| ' .. Icons.Icon({recipeDef.itemName, type='item', size=50, notext=true}))
table.insert(resultPart, '\r\n| ')
table.insert(resultPart, '\r\n| ')
table.insert(resultPart, recipeDef.expIcon)
if recipe.baseQuantity > 1 then
if recipe.baseQuantity > 1 then
table.insert(resultPart, recipe.baseQuantity .. 'x ')
table.insert(resultPart, recipe.baseQuantity .. 'x ')
Line 433: Line 413:
table.insert(resultPart, Icons.Icon({recipeDef.itemName, type='item', noicon=true}))
table.insert(resultPart, Icons.Icon({recipeDef.itemName, type='item', noicon=true}))
table.insert(resultPart, '\r\n|data-sort-value="' .. recipe.level .. '"| ' .. Icons._SkillReq('Smithing', recipe.level))
table.insert(resultPart, '\r\n|data-sort-value="' .. recipe.level .. '"| ' .. Icons._SkillReq('Smithing', recipe.level))
table.insert(resultPart, '\r\n|data-sort-value="' .. recipe.baseXP .. '"| ' .. Shared.formatnum(recipe.baseXP))
table.insert(resultPart, '\r\n|data-sort-value="' .. recipe.baseExperience .. '"| ' .. Shared.formatnum(recipe.baseExperience))
table.insert(resultPart, '\r\n|data-sort-value="' .. totalValue .. '"| ' .. Icons.GP(recipeDef.itemValue))
table.insert(resultPart, '\r\n|data-sort-value="' .. totalValue .. '"| ' .. Icons.GP(recipeDef.itemValue))
if recipe.baseQuantity > 1 then
if recipe.baseQuantity > 1 then
Line 439: Line 419:
end
end
table.insert(resultPart, '\r\n| ' .. table.concat(costString, ', '))
table.insert(resultPart, '\r\n| ' .. table.concat(costString, ', '))
if categoryID > 0 then
if category.id ~= 'melvorD:Bars' then
local barVal, barValTxt = 0, 'N/A'
local barVal, barValTxt = 0, 'N/A'
if barQty > 0 then
if barQty > 0 then
barVal = totalValue / barQty
barVal = totalValue / barQty
barTxt = Icons.GP(Shared.round(barVal, 1, 1))
barValTxt = Icons.GP(Shared.round(barVal, 1, 1))
end
end
table.insert(resultPart, '\r\n|data-sort-value="' .. barVal .. '"| ' .. barTxt)
table.insert(resultPart, '\r\n|data-sort-value="' .. barVal .. '"| ' .. barValTxt)
end
end
end
end
Line 462: Line 442:
table.insert(resultPart, '\r\n!XP!!XP/s!!XP!!XP/s')
table.insert(resultPart, '\r\n!XP!!XP/s!!XP!!XP/s')


for i, logData in Shared.skpairs(SkillData.Firemaking) do
for i, logData in ipairs(SkillData.Firemaking.logs) do
local logs = Items.getItemByID(logData.logID)
local logs = Items.getItemByID(logData.logID)
local name = logs.name
local name = logs.name
local burnTime = logData.baseInterval / 1000
local burnTime = logData.baseInterval / 1000
local bonfireTime = logData.baseBonfireInterval / 1000
local bonfireTime = logData.baseBonfireInterval / 1000
local XPS = logData.baseXP / burnTime
local XPS = logData.baseExperience / burnTime
local XP_BF = logData.baseXP * (1 + logData.bonfireXPBonus / 100)
local XP_BF = logData.baseExperience * (1 + logData.bonfireXPBonus / 100)
local XPS_BF = XP_BF / burnTime
local XPS_BF = XP_BF / burnTime


table.insert(resultPart, '\r\n|-')
table.insert(resultPart, '\r\n|-')
table.insert(resultPart, '\r\n|data-sort-value="'..name..'"|'..Icons.Icon({name, type='item', size='50', notext=true}))
table.insert(resultPart, '\r\n|data-sort-value="'..name..'"|'..Icons.Icon({name, type='item', size='50', notext=true}))
table.insert(resultPart, '||[['..name..']]')
table.insert(resultPart, '||'..Icons.getExpansionIcon(logs.id)..Icons.Icon({name, type='item', noicon=true}))
table.insert(resultPart, '||style ="text-align: right;"|'..logData.level)
table.insert(resultPart, '||style ="text-align: right;"|'..logData.level)
table.insert(resultPart, '||style ="text-align: right;" data-sort-value="'..burnTime..'"|'..Shared.timeString(burnTime, true))
table.insert(resultPart, '||style ="text-align: right;" data-sort-value="'..burnTime..'"|'..Shared.timeString(burnTime, true))
table.insert(resultPart, '||style ="text-align: right;"|'..logData.baseXP)
table.insert(resultPart, '||style ="text-align: right;"|'..logData.baseExperience)
table.insert(resultPart, '||style ="text-align: right;" data-sort-value="'..XPS..'"|'..Shared.round(XPS, 2, 2))
table.insert(resultPart, '||style ="text-align: right;" data-sort-value="'..XPS..'"|'..Shared.round(XPS, 2, 2))
table.insert(resultPart, '||style ="text-align: right;"|'..Shared.round(XP_BF, 2, 0))
table.insert(resultPart, '||style ="text-align: right;"|'..Shared.round(XP_BF, 2, 0))