Module:Skills/Gathering: Difference between revisions

Update for v1.0.2
(_getThievingNPCLootTables: Correct visibility of total row for common drops table)
(Update for v1.0.2)
Line 20: Line 20:
for i, const in ipairs(SkillData.Astrology.Constellations) do
for i, const in ipairs(SkillData.Astrology.Constellations) do
if const.name == constName then
if const.name == constName then
return const
return const
end
end
end
end
Line 172: Line 172:
result = result..'||style="min-width:25px" data-sort-value="'..logName..'"|'..Icons.Icon({logName, type='item', notext=true, size=50})
result = result..'||style="min-width:25px" data-sort-value="'..logName..'"|'..Icons.Icon({logName, type='item', notext=true, size=50})
result = result..'||'..Icons.Icon({logName, type='item', noicon=true})
result = result..'||'..Icons.Icon({logName, type='item', noicon=true})
result = result..'||style="text-align:right"|'..tree.level
result = result..'||style="text-align:right"|'..tree.levelRequired
result = result..'||style="text-align:right"|'..tree.xp
result = result..'||style="text-align:right"|'..tree.baseExperience
result = result..'||style="text-align:right" data-sort-value="'..tree.interval..'"|'..Shared.timeString(tree.interval/1000, true)
result = result..'||style="text-align:right" data-sort-value="'..tree.baseInterval..'"|'..Shared.timeString(tree.baseInterval/1000, true)
local XPs = tree.xp / (tree.interval / 1000)
local XPs = tree.baseExperience / (tree.baseInterval / 1000)
local Log = Items.getItemByID(i - 1)
local Log = Items.getItemByID(tree.logID)
local GPs = Log.sellsFor / (tree.interval / 1000)
local GPs = Log.sellsFor / (tree.baseInterval / 1000)
result = result..'||style="text-align:right"|'..Shared.round(XPs, 2, 2)
result = result..'||style="text-align:right"|'..Shared.round(XPs, 2, 2)
result = result..'||style="text-align:right" data-sort-value="'..GPs..'"|'..Icons.GP(Shared.round(GPs, 2, 2))
result = result..'||style="text-align:right" data-sort-value="'..GPs..'"|'..Icons.GP(Shared.round(GPs, 2, 2))
Line 220: Line 220:
result = result..'\r\n|- class="headerRow-0"'
result = result..'\r\n|- class="headerRow-0"'
result = result..'\r\n!colspan="2"|Item!!Value'
result = result..'\r\n!colspan="2"|Item!!Value'
 
local itemArray = Items.getItems(function(item) return item.type == "Junk" end)
local itemArray = Items.getItems(function(item) return item.type == "Junk" end)


Line 308: Line 308:


local cookStr = "N/A"
local cookStr = "N/A"
if fish.cookingLevel ~= nil then  
if fish.cookingLevel ~= nil then
cookStr = fish.cookingLevel
cookStr = fish.cookingLevel
end
end
Line 361: Line 361:
npc = p.getThievingNPC(npc)
npc = p.getThievingNPC(npc)
end
end
 
local result = nil
local result = nil
for i, area in Shared.skpairs(SkillData.Thieving.Areas) do
for i, area in Shared.skpairs(SkillData.Thieving.Areas) do
Line 376: Line 376:
function p._getThievingNPCStat(npc, statName)
function p._getThievingNPCStat(npc, statName)
local result = nil
local result = nil
 
if statName == 'level' then
if statName == 'level' then
result = Icons._SkillReq('Thieving', npc.level)
result = Icons._SkillReq('Thieving', npc.level)
Line 387: Line 387:
result = npc[statName]
result = npc[statName]
end
end
 
if result == nil then
if result == nil then
result = ''
result = ''
end
end
 
return result
return result
end
end
Line 402: Line 402:
return "ERROR: Invalid Thieving NPC "..npcName.."[[Category:Pages with script errors]]"
return "ERROR: Invalid Thieving NPC "..npcName.."[[Category:Pages with script errors]]"
end
end
 
return p._getThievingNPCStat(npc, statName)
return p._getThievingNPCStat(npc, statName)
end
end
Line 413: Line 413:
local thisItem = Items.getItemByID(drop.itemID)
local thisItem = Items.getItemByID(drop.itemID)
local odds = drop.chance
local odds = drop.chance
 
rareTxt = rareTxt..'\r\n|-\r\n|'..Icons.Icon({thisItem.name, type='item'})
rareTxt = rareTxt..'\r\n|-\r\n|'..Icons.Icon({thisItem.name, type='item'})
rareTxt = rareTxt..'||1||data-sort-value="'..thisItem.sellsFor..'"|'..Icons.GP(thisItem.sellsFor)
rareTxt = rareTxt..'||1||data-sort-value="'..thisItem.sellsFor..'"|'..Icons.GP(thisItem.sellsFor)
Line 426: Line 426:
local result = ''
local result = ''
local sectionTxt = {}
local sectionTxt = {}
 
--Five sections here: GP, normal loot, area loot, rare loot, and unique item
--Five sections here: GP, normal loot, area loot, rare loot, and unique item
--First up, GP:
--First up, GP:
local gpTxt = 'Successfully pickpocketing the '..npc.name..' will always give '..Icons.GP(1, npc.maxGP)
local gpTxt = 'Successfully pickpocketing the '..npc.name..' will always give '..Icons.GP(1, npc.maxGP)
table.insert(sectionTxt, gpTxt)
table.insert(sectionTxt, gpTxt)
 
--Next up, normal loot:
--Next up, normal loot:
--(Skip if no loot)
--(Skip if no loot)
Line 439: Line 439:
local lootChance = thievingNormalLootChance
local lootChance = thievingNormalLootChance
local lootValue = 0
local lootValue = 0
 
--First loop through to get the total weight so we have it for later
--First loop through to get the total weight so we have it for later
for i, loot in pairs(npc.lootTable) do
for i, loot in pairs(npc.lootTable) do
totalWt = totalWt + loot[2]
totalWt = totalWt + loot[2]
end
end
 
normalTxt = normalTxt..'\r\n{|class="wikitable sortable"'
normalTxt = normalTxt..'\r\n{|class="wikitable sortable"'
normalTxt = normalTxt..'\r\n!Item!!Qty'
normalTxt = normalTxt..'\r\n!Item!!Qty'
normalTxt = normalTxt..'!!Price!!colspan="2"|Chance'
normalTxt = normalTxt..'!!Price!!colspan="2"|Chance'
 
--Then sort the loot table by weight
--Then sort the loot table by weight
table.sort(npc.lootTable, function(a, b) return a[2] > b[2] end)
table.sort(npc.lootTable, function(a, b) return a[2] > b[2] end)
Line 460: Line 460:
end
end
normalTxt = normalTxt..'||style="text-align:right" data-sort-value="'..maxQty..'"|'
normalTxt = normalTxt..'||style="text-align:right" data-sort-value="'..maxQty..'"|'
 
if maxQty > 1 then
if maxQty > 1 then
normalTxt = normalTxt.. '1 - '
normalTxt = normalTxt.. '1 - '
end
end
normalTxt = normalTxt..Shared.formatnum(row[3])
normalTxt = normalTxt..Shared.formatnum(row[3])
 
--Adding price columns
--Adding price columns
local itemPrice = 0
local itemPrice = 0
Line 478: Line 478:
end
end
end
end
 
--Getting the drop chance
--Getting the drop chance
local dropChance = (row[2] / totalWt * lootChance)
local dropChance = (row[2] / totalWt * lootChance)
Line 490: Line 490:
end
end
normalTxt = normalTxt..'style="text-align:right"|'..Shared.round(dropChance, 2, 2)..'%'
normalTxt = normalTxt..'style="text-align:right"|'..Shared.round(dropChance, 2, 2)..'%'
 
--Adding to the average loot value based on price & dropchance
--Adding to the average loot value based on price & dropchance
lootValue = lootValue + (dropChance * 0.01 * itemPrice * ((1 + maxQty) / 2))
lootValue = lootValue + (dropChance * 0.01 * itemPrice * ((1 + maxQty) / 2))
Line 506: Line 506:
table.insert(sectionTxt, normalTxt)
table.insert(sectionTxt, normalTxt)
end
end
 
--After normal drops, add in rare drops
--After normal drops, add in rare drops
local rareTxt = '===Possible Rare Drops:===\r\nAny of these can be received after a successful pickpocket'
local rareTxt = '===Possible Rare Drops:===\r\nAny of these can be received after a successful pickpocket'
rareTxt = rareTxt..'\r\n'..p.getThievingGeneralRareTable()
rareTxt = rareTxt..'\r\n'..p.getThievingGeneralRareTable()
table.insert(sectionTxt, rareTxt)
table.insert(sectionTxt, rareTxt)
 
local areaTxt = '===Possible Area Unique Drops==='
local areaTxt = '===Possible Area Unique Drops==='
areaTxt = areaTxt..'\r\nAny Area Unique Drop is equally likely to be obtained after a successful pickpocket. '
areaTxt = areaTxt..'\r\nAny Area Unique Drop is equally likely to be obtained after a successful pickpocket. '
areaTxt = areaTxt..'\r\nEach Area Unique Drop is rolled for separately, so it is possible to receive multiple Area Unique Drops from a single action. '
areaTxt = areaTxt..'\r\nEach Area Unique Drop is rolled for separately, so it is possible to receive multiple Area Unique Drops from a single action. '
areaTxt = areaTxt..'The chance of receiving an Area Unique drop is tripled if the 95% Thieving Mastery Pool checkpoint is active.'
areaTxt = areaTxt..'The chance of receiving an Area Unique drop is tripled if the 95% Thieving Mastery Pool checkpoint is active.'
 
local area = p.getThievingNPCArea(npc)
local area = p.getThievingNPCArea(npc)
areaTxt = areaTxt..'\r\n{|class="wikitable sortable"'
areaTxt = areaTxt..'\r\n{|class="wikitable sortable"'
Line 540: Line 540:
areaTxt = areaTxt..'\r\n|}'
areaTxt = areaTxt..'\r\n|}'
table.insert(sectionTxt, areaTxt)
table.insert(sectionTxt, areaTxt)
 
if npc.uniqueDrop ~= nil and npc.uniqueDrop.itemID > -1 then
if npc.uniqueDrop ~= nil and npc.uniqueDrop.itemID > -1 then
local uniqueTxt = '===Possible NPC Unique Drop==='
local uniqueTxt = '===Possible NPC Unique Drop==='
Line 552: Line 552:
uniqueTxt = uniqueTxt..Icons.Icon({thisItem.name, type='item'})
uniqueTxt = uniqueTxt..Icons.Icon({thisItem.name, type='item'})
end
end
 
table.insert(sectionTxt, uniqueTxt)
table.insert(sectionTxt, uniqueTxt)
end
end
 
return table.concat(sectionTxt, '\r\n')
return table.concat(sectionTxt, '\r\n')
end
end
Line 565: Line 565:
return "ERROR: Invalid Thieving NPC "..npcName.."[[Category:Pages with script errors]]"
return "ERROR: Invalid Thieving NPC "..npcName.."[[Category:Pages with script errors]]"
end
end
 
return p._getThievingNPCLootTables(npc)
return p._getThievingNPCLootTables(npc)
end
end
Line 599: Line 599:
end
end
result = result..'\r\n|}'
result = result..'\r\n|}'
 
return result
return result
end
end
Line 608: Line 608:
table.insert(resultPart, '\r\n|- class="headerRow-0"')
table.insert(resultPart, '\r\n|- class="headerRow-0"')
table.insert(resultPart, '\r\n!Area!!'..Icons.Icon({'Thieving', type='skill', notext=true})..' Level!!NPCs!!Unique Drops')
table.insert(resultPart, '\r\n!Area!!'..Icons.Icon({'Thieving', type='skill', notext=true})..' Level!!NPCs!!Unique Drops')
 
local areaArray = Shared.clone(SkillData.Thieving.Areas)
local areaArray = Shared.clone(SkillData.Thieving.Areas)
table.sort(areaArray, function(a, b) return a.id < b.id end)
table.sort(areaArray, function(a, b) return a.id < b.id end)
Line 627: Line 627:
table.insert(npcList, '')
table.insert(npcList, '')
end
end
 
-- Build area unique item list
-- Build area unique item list
if area.uniqueDrops ~= nil and Shared.tableCount(area.uniqueDrops) > 0 then
if area.uniqueDrops ~= nil and Shared.tableCount(area.uniqueDrops) > 0 then
Line 645: Line 645:
table.insert(areaItemList, '')
table.insert(areaItemList, '')
end
end
 
-- Generate table row
-- Generate table row
table.insert(resultPart, '\r\n|-')
table.insert(resultPart, '\r\n|-')
Line 654: Line 654:
end
end
table.insert(resultPart, '\r\n|}')
table.insert(resultPart, '\r\n|}')
 
return table.concat(resultPart)
return table.concat(resultPart)
end
end
Line 660: Line 660:
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
Line 677: Line 677:
end
end
end
end
 
--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
Line 693: Line 693:
table.insert(resultArray, {npc = npc.name, minQty = 1, maxQty = dropQty, wt = dropWt * thievingNormalLootChance, totalWt = totalWt * 100, level = npc.level})
table.insert(resultArray, {npc = npc.name, minQty = 1, maxQty = dropQty, wt = dropWt * thievingNormalLootChance, totalWt = totalWt * 100, level = npc.level})
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.itemID == 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.qty, maxQty = npc.uniqueDrop.qty, wt = -1, totalWt = -1, level = npc.level})
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 = thievingAreaLootChance, totalWt = 100, level = npc.level})
table.insert(resultArray, {npc = npc.name, minQty = areaNPCs[npc.id], maxQty = areaNPCs[npc.id], wt = thievingAreaLootChance, totalWt = 100, level = npc.level})
end
end
end
end
 
for i, drop in pairs(SkillData.Thieving.RareItems) do
for i, drop in pairs(SkillData.Thieving.RareItems) do
if drop.itemID == itemID then
if drop.itemID == itemID then
Line 709: Line 709:
end
end
end
end
 
return resultArray
return resultArray
end
end
Line 736: Line 736:
return false
return false
end
end
 
local addToArray = function(modArray, modNew)
local addToArray = function(modArray, modNew)
if not isDistinct or (isDistinct and not containsMod(modArray, modNew)) then
if not isDistinct or (isDistinct and not containsMod(modArray, modNew)) then
Line 742: Line 742:
end
end
end
end
 
local modArray = {}
local modArray = {}
local isSkillMod = {}
local isSkillMod = {}
Line 769: Line 769:
table.insert(skillArray, SkillData.Skills[skillID + 1])
table.insert(skillArray, SkillData.Skills[skillID + 1])
end
end
 
for i, modName in ipairs(cons.uniqueModifiers) do
for i, modName in ipairs(cons.uniqueModifiers) do
-- The most important thing we're getting here is the modText and modBase
-- The most important thing we're getting here is the modText and modBase
Line 788: Line 788:
end
end
end
end
 
if asKeyValue then
if asKeyValue then
local modArrayKV = {}
local modArrayKV = {}
Line 814: Line 814:
result = result..'\r\n!colspan="2"|Constellation!!'..Icons.Icon({"Astrology", type='skill', notext='true'})..' Level'
result = result..'\r\n!colspan="2"|Constellation!!'..Icons.Icon({"Astrology", type='skill', notext='true'})..' Level'
result = result..'!!XP!!Skills!!Standard Modifiers!!Unique Modifiers'
result = result..'!!XP!!Skills!!Standard Modifiers!!Unique Modifiers'
 
for i, cons in Shared.skpairs(SkillData.Astrology.Constellations) do
for i, cons in Shared.skpairs(SkillData.Astrology.Constellations) do
local name = cons.name
local name = cons.name
Line 820: Line 820:
result = result..'\r\n|data-sort-value="'..name..'"|'..Icons.Icon({name, type='constellation', size='50', notext=true})..'||'..name
result = result..'\r\n|data-sort-value="'..name..'"|'..Icons.Icon({name, type='constellation', size='50', notext=true})..'||'..name
result = result..'||'..cons.level..'||'..cons.provides.xp
result = result..'||'..cons.level..'||'..cons.provides.xp
 
local skillIconArray = {}
local skillIconArray = {}
for j, skillID in ipairs(cons.skills) do
for j, skillID in ipairs(cons.skills) do
Line 826: Line 826:
end
end
result = result..'||'..table.concat(skillIconArray, '<br/>')
result = result..'||'..table.concat(skillIconArray, '<br/>')
 
local standModsRaw = p._buildAstrologyModifierArray(cons, maxModifier, true, false, false, false)
local standModsRaw = p._buildAstrologyModifierArray(cons, maxModifier, true, false, false, false)
local standMods = {}
local standMods = {}
Line 834: Line 834:
end
end
result = result..'|| '..table.concat(standMods, '<br/>')
result = result..'|| '..table.concat(standMods, '<br/>')
 
--Building the list of all Unique Modifiers
--Building the list of all Unique Modifiers
local uModsRaw = p._buildAstrologyModifierArray(cons, maxModifier, false, true, false, false)
local uModsRaw = p._buildAstrologyModifierArray(cons, maxModifier, false, true, false, false)
Line 844: Line 844:
end
end
result = result..'\r\n|}'
result = result..'\r\n|}'
 
return result
return result
end
end