|
|
Line 35: |
Line 35: |
| end | | end |
| return nil | | return nil |
| end
| |
|
| |
| function p.getThievingNPCByID(ID)
| |
| local result = Shared.clone(SkillData.Thieving[ID + 1])
| |
| if result ~= nil then
| |
| result.id = ID
| |
| end
| |
| return result
| |
| end
| |
|
| |
| function p.getThievingNPC(name)
| |
| local result = nil
| |
| for i, npc in pairs(SkillData.Thieving) do
| |
| if name == npc.name then
| |
| result = Shared.clone(npc)
| |
| result.id = i - 1
| |
| break
| |
| end
| |
| end
| |
| return result
| |
| end
| |
|
| |
| function p.getThievingNPCStat(frame)
| |
| local args = frame.args ~= nil and frame.args or frame
| |
| local npcName = args[1]
| |
| local statName = args[2]
| |
| local npc = p.getThievingNPC(npcName)
| |
| if npc == nil then
| |
| return 'ERROR: Failed to find Thieving NPC with name ' .. name .. '[[Category:Pages with script errors]]'
| |
| end
| |
|
| |
| return p._getThievingNPCStat(npc, statName)
| |
| end
| |
|
| |
| function p._getThievingNPCStat(npc, stat)
| |
| local itemDropChance = 0.75
| |
| local result = npc[stat]
| |
| -- Overrides below
| |
| if stat == 'maxHit' then
| |
| result = result * 10
| |
| elseif stat == 'lootList' then
| |
| return p._formatLootTable(npc['lootTable'], itemDropChance, true)
| |
| elseif stat == 'lootTable' then
| |
| return p._formatLootTable(npc['lootTable'], itemDropChance, false)
| |
| elseif stat == 'requirements' then
| |
| if npc['level'] ~= nil then
| |
| result = Icons._SkillReq('Thieving', npc['level'], true)
| |
| else
| |
| result = 'None'
| |
| end
| |
| elseif (stat == 'lootValue' or stat == 'pickpocketValue') then
| |
| if stat == 'pickpocketValue' then
| |
| local itemBP = Items.getItem("Bobby's Pocket")
| |
| result = (1 + npc['maxCoins']) / 2 + itemBP.sellsFor * (1 / 120)
| |
| else
| |
| result = 0
| |
| end
| |
| result = Shared.round(result + p._getLootTableValue(npc['lootTable']) * itemDropChance, 2, 2)
| |
| elseif stat == 'pageName' then
| |
| local linkOverrides = { ['Golbin'] = 'Golbin (thieving)' }
| |
| result = (linkOverrides[npc['name']] ~= nil and linkOverrides[npc['name']]) or npc['name']
| |
| end
| |
|
| |
| return result
| |
| end
| |
|
| |
| function p._getLootTableValue(lootTable)
| |
| -- Calculates the average GP value of a given loot table
| |
| -- Expects lootTableIn to be in format {{itemID_1, itemWeight_1}, ..., {itemID_n, itemWeight_n}}
| |
| if Shared.tableCount(lootTable) == 0 then
| |
| return 0
| |
| end
| |
|
| |
| local totalWeight = 0
| |
| for i, drop in pairs(lootTable) do
| |
| totalWeight = totalWeight + drop[2]
| |
| end
| |
| if totalWeight == 0 then
| |
| return 0
| |
| end
| |
|
| |
| local avgValue = 0
| |
| for i, drop in pairs(lootTable) do
| |
| local item = Items.getItemByID(drop[1])
| |
| if item ~= nil then
| |
| avgValue = avgValue + item.sellsFor * (drop[2] / totalWeight)
| |
| end
| |
| end
| |
|
| |
| return avgValue
| |
| end
| |
|
| |
| function p._formatLootTable(lootTableIn, chanceMultIn, asList)
| |
| -- Expects lootTableIn to be in format {{itemID_1, itemWeight_1}, ..., {itemID_n, itemWeight_n}}
| |
| if Shared.tableCount(lootTableIn) == 0 then
| |
| return ''
| |
| end
| |
|
| |
| local chanceMult = (chanceMultIn or 1) * 100
| |
| local lootTable = Shared.clone(lootTableIn)
| |
| -- Sort table from most to least common drop
| |
| table.sort(lootTable, function(a, b)
| |
| if a[2] == b[2] then
| |
| return a[1] < b[1]
| |
| else
| |
| return a[2] > b[2]
| |
| end
| |
| end)
| |
|
| |
| local totalWeight = 0
| |
| for i, drop in pairs(lootTable) do
| |
| totalWeight = totalWeight + drop[2]
| |
| end
| |
| if totalWeight == 0 then
| |
| return ''
| |
| end
| |
|
| |
| -- Get the length (in characters) of the largest drop chance so that they can be right aligned
| |
| -- [4/16/21]: Adding info for no drop
| |
| local maxDropLen = math.max(string.len(Shared.round(100 - chanceMult, 2, 2)), string.len(Shared.round(lootTable[1][2] / totalWeight * chanceMult, 2, 2)))
| |
|
| |
| local returnPart = {}
| |
| -- Generate header
| |
| if asList then
| |
| if chanceMult < 100 then
| |
| table.insert(returnPart, '* ' .. string.rep(' ', math.max(0, (maxDropLen - string.len(Shared.round(100 - chanceMult, 2, 2))) * 2)) .. Shared.round(100 - chanceMult, 2, 2) .. '% No Item')
| |
| end
| |
| else
| |
| table.insert(returnPart, '{|class="wikitable sortable"\r\n!Item!!Price!!colspan="2"|Chance')
| |
| end
| |
| -- Generate row for each item
| |
| for i, drop in pairs(lootTable) do
| |
| local item, itemText, sellsFor, dropChance = Items.getItemByID(drop[1]), 'Unknown', 0, Shared.round(drop[2] / totalWeight * chanceMult, 2, 2)
| |
| if item ~= nil then
| |
| itemText, sellsFor = Icons.Icon({item.name, type='item'}), item.sellsFor
| |
| end
| |
| if asList then
| |
| table.insert(returnPart, '* ' .. string.rep(' ', math.max(0, (maxDropLen - string.len(dropChance)) * 2)) .. dropChance .. '% ' .. itemText)
| |
| else
| |
| table.insert(returnPart, '|-\r\n|' .. itemText)
| |
| table.insert(returnPart, '|style="text-align:right;" data-sort-value="' .. sellsFor .. '"|' .. Icons.GP(sellsFor))
| |
| table.insert(returnPart, '|style="text-align:right;" data-sort-value="' .. dropChance .. '"|' .. Shared.fraction(drop[2] * chanceMult, totalWeight * 100))
| |
| table.insert(returnPart, '|style="text-align:right;"|' .. dropChance .. '%')
| |
| end
| |
| end
| |
| if not asList then
| |
| table.insert(returnPart, '|-class="sortbottom" \r\n!colspan="2"|Total:')
| |
| local textTotChance = ''
| |
| if chanceMult < 100 then
| |
| textTotChance = '|style="text-align:right"|' .. Shared.fraction(chanceMult, 100) .. '\r\n|'
| |
| else
| |
| textTotChance = '|colspan="2" '
| |
| end
| |
| textTotChance = textTotChance .. 'style="text-align:right;"|' .. Shared.round(chanceMult, 2, 2) .. '%' .. '\r\n|}'
| |
| table.insert(returnPart, textTotChance)
| |
| end
| |
|
| |
| return table.concat(returnPart, '\r\n')
| |
| end
| |
|
| |
| function p.getThievingNPCTable()
| |
| local returnPart = {}
| |
|
| |
| -- Create table header
| |
| table.insert(returnPart, '{| class="wikitable sortable stickyHeader"')
| |
| table.insert(returnPart, '|- class="headerRow-0"\r\n!Target!!Name!!' .. Icons.Icon({'Thieving', type='skill', notext=true}).. ' Level!!Experience!!Max Hit!!Max Coins!!<abbr title="Assumes all loot is sold, and no GP boosts apply (such as those from Mastery & Gloves of Silence)">GP/Theft</abbr>')
| |
|
| |
| -- Create row for each NPC
| |
| for i, npc in Shared.skpairs(SkillData.Thieving) do
| |
| local linkText = (npc.name ~= p._getThievingNPCStat(npc, 'pageName') and p._getThievingNPCStat(npc, 'pageName') .. '|' .. npc.name) or npc.name
| |
| table.insert(returnPart, '|-\r\n|style="text-align: left;" |' .. Icons.Icon({npc.name, type='thieving', size=50, notext=true}))
| |
| table.insert(returnPart, '|style="text-align: left;" |[[' .. linkText .. ']]')
| |
| table.insert(returnPart, '|style="text-align: right;" |' .. p._getThievingNPCStat(npc, 'level'))
| |
| table.insert(returnPart, '|style="text-align: right;" |' .. p._getThievingNPCStat(npc, 'xp'))
| |
| table.insert(returnPart, '|style="text-align: right;" |' .. p._getThievingNPCStat(npc, 'maxHit'))
| |
| table.insert(returnPart, '|style="text-align: right;" data-sort-value="' .. p._getThievingNPCStat(npc, 'maxCoins') .. '" |' .. Icons.GP(p._getThievingNPCStat(npc, 'maxCoins')))
| |
| table.insert(returnPart, '|style="text-align: right;" data-sort-value="' .. p._getThievingNPCStat(npc, 'pickpocketValue') .. '" |' .. Icons.GP(p._getThievingNPCStat(npc, 'pickpocketValue')))
| |
| end
| |
| table.insert(returnPart, '|}')
| |
|
| |
| return table.concat(returnPart, '\r\n')
| |
| end | | end |
|
| |
|
Line 228: |
Line 47: |
| local npcList = {} | | local npcList = {} |
| -- Create row for each NPC | | -- Create row for each NPC |
| for i, npc in Shared.skpairs(SkillData.Thieving) do | | for i, npc in Shared.skpairs(SkillData.Thieving.NPCs) do |
| local linkText = (npc.name ~= p._getThievingNPCStat(npc, 'pageName') and p._getThievingNPCStat(npc, 'pageName') .. '|' .. npc.name) or npc.name | | --local linkText = (npc.name ~= p._getThievingNPCStat(npc, 'pageName') and p._getThievingNPCStat(npc, 'pageName') .. '|' .. npc.name) or npc.name |
| table.insert(npcList, Icons.Icon({npc.name, type='thieving', notext=true}) .. ' [[' .. linkText .. ']]') | | table.insert(npcList, Icons.Icon({npc.name, type='thieving'})) |
| end | | end |
| table.insert(returnPart, table.concat(npcList, ' • ')) | | table.insert(returnPart, table.concat(npcList, ' • ')) |