17,097
edits
(Undo revision 44208 - Resulted in script errors) Tag: Undo |
(_getItemLootSourceTable: Add fraction alongside percentage for chance stat (Attempt 2)) |
||
Line 543: | Line 543: | ||
local result = '{| class="wikitable sortable stickyHeader"' | local result = '{| class="wikitable sortable stickyHeader"' | ||
result = result..'\r\n|- class="headerRow-0"' | result = result..'\r\n|- class="headerRow-0"' | ||
result = result..'\r\n!Source!!Source Type!!Quantity!!Chance' | result = result..'\r\n!Source!!Source Type!!Quantity!!colspan="2"|Chance' | ||
--Set up function for adding rows | --Set up function for adding rows | ||
local buildRow = function(source, type, minqty, qty, | local buildRow = function(source, type, minqty, qty, weight, totalWeight) | ||
if minqty == nil then minqty = 1 end | if minqty == nil then minqty = 1 end | ||
local rowTxt = '\r\n|-' | local rowTxt = '\r\n|-' | ||
rowTxt = rowTxt..'\r\n|style ="text-align: left;"|'..source | rowTxt = rowTxt..'\r\n|style="text-align: left;"|'..source | ||
rowTxt = rowTxt..'\r\n|style ="text-align: left;"|'..type | rowTxt = rowTxt..'\r\n|style="text-align: left;"|'..type | ||
rowTxt = rowTxt..'\r\n|style ="text-align: right;" data-sort-value | rowTxt = rowTxt..'\r\n|style="text-align: right;" data-sort-value="'..qty..'"|'..minqty | ||
if qty ~= minqty then rowTxt = rowTxt..' - '..qty end | if qty ~= minqty then rowTxt = rowTxt..' - '..qty end | ||
rowTxt = rowTxt..'\r\n|style ="text-align: right;"|'..Shared. | local chance = Shared.round(weight / totalWeight * 100, 2, 2) | ||
if weight >= totalWeight then | |||
-- Fraction would be 1/1, so only show the percentage | |||
chance = 100 | |||
rowTxt = rowTxt .. '\r\n|colspan="2" ' | |||
else | |||
rowTxt = rowTxt .. '\r\n|style="text-align: right;" data-sort-value="' .. chance .. '"| ' .. Shared.fraction(weight, totalWeight) .. '\r\n|' | |||
end | |||
rowTxt = rowTxt..'style="text-align: right;" data-sort-value="'.. chance .. '"|'..chance..'%' | |||
return rowTxt | return rowTxt | ||
end | end | ||
local dropRows = {} | local dropRows = {} | ||
--Alright, time to go through a few ways to get the item | --Alright, time to go through a few ways to get the item | ||
--First up: Can we kill somebody and take theirs? | --First up: Can we kill somebody and take theirs? | ||
Line 580: | Line 588: | ||
qty = loot[3] | qty = loot[3] | ||
end | end | ||
end | end | ||
end | end | ||
if | local lootChance = monster.lootChance ~= nil and monster.lootChance or 100 | ||
if wt > 0 and lootChance > 0 then | |||
local sourceTxt = nil | |||
local typeTxt = nil | |||
--If we're dealing with a boss, this is a Dungeon row instead | --If we're dealing with a boss, this is a Dungeon row instead | ||
if monster.isBoss and not Shared.contains(item.name, 'Shard') then | if monster.isBoss and not Shared.contains(item.name, 'Shard') then | ||
local dung = Areas.getMonsterAreas(i - 1)[1] | local dung = Areas.getMonsterAreas(i - 1)[1] | ||
sourceTxt = Icons.Icon({dung.name, type='dungeon', notext=true}) | |||
typeTxt = '[[Dungeon]]' | |||
else | else | ||
sourceTxt = Icons.Icon({monster.name, type='monster'}) | |||
typeTxt = '[[Monster]]' | |||
end | end | ||
table.insert(dropRows, {source = sourceTxt, type = typeTxt, minqty = minqty, qty = qty, weight = wt * lootChance, totalWeight = totalWt * 100}) | |||
end | end | ||
end | end | ||
Line 601: | Line 609: | ||
--Special exception for the Fire/Infernal Cape and first two lore books as bonus dungeon drops | --Special exception for the Fire/Infernal Cape and first two lore books as bonus dungeon drops | ||
if sourceOverrides['Dungeon'][item.id] ~= nil then | if sourceOverrides['Dungeon'][item.id] ~= nil then | ||
local sourceTxt = Icons.Icon({sourceOverrides['Dungeon'][item.id], type= | local sourceTxt = Icons.Icon({sourceOverrides['Dungeon'][item.id], type='dungeon', notext=true}) | ||
table.insert(dropRows, {source=sourceTxt, type='[[Dungeon]]', minqty=1, qty=1, | table.insert(dropRows, {source=sourceTxt, type='[[Dungeon]]', minqty=1, qty=1, weight = 1, totalWeight = 1}) | ||
end | end | ||
Line 621: | Line 629: | ||
if wt > 0 then | if wt > 0 then | ||
local sourceTxt = Icons.Icon({item2.name, type='item'}) | local sourceTxt = Icons.Icon({item2.name, type='item'}) | ||
table.insert(dropRows, {source = sourceTxt, type = '[[Chest]]', minqty = 1, qty = qty, | table.insert(dropRows, {source = sourceTxt, type = '[[Chest]]', minqty = 1, qty = qty, weight = wt, totalWeight = totalWt}) | ||
end | end | ||
end | end | ||
Line 643: | Line 650: | ||
end | end | ||
if wt > 0 then | if wt > 0 then | ||
chance | -- There is a constant 75% chance of gaining an item per successful steal attempt | ||
local sourceTxt = Icons.Icon({npc.name, type='thieving'}) | local sourceTxt = Icons.Icon({npc.name, type='thieving'}) | ||
table.insert(dropRows, {source = sourceTxt, type = thiefType, minqty = 1, qty = qty, | table.insert(dropRows, {source = sourceTxt, type = thiefType, minqty = 1, qty = qty, weight = wt * 75, totalWeight = totalWt * 100}) | ||
end | end | ||
end | end | ||
Line 653: | Line 660: | ||
if item.type == 'Gem' then | if item.type == 'Gem' then | ||
local mineType = Icons.Icon({'Mining', type='skill'}) | local mineType = Icons.Icon({'Mining', type='skill'}) | ||
local thisGemChance = Items.GemTable[item.name].chance | local thisGemChance = Items.GemTable[item.name].chance | ||
table.insert(dropRows, {source = '[[Mining#Gems|Gem]]', type = mineType, minqty = 1, qty = 1, | local totalGemChance = 0 | ||
for i, gem in pairs(Items.GemTable) do | |||
totalGemChance = totalGemChance + gem.chance | |||
end | |||
table.insert(dropRows, {source = '[[Mining#Gems|Gem]]', type = mineType, minqty = 1, qty = 1, weight = thisGemChance, totalWeight = totalGemChance}) | |||
local magicType = Icons.Icon({'Magic', type = 'skill'}) | local magicType = Icons.Icon({'Magic', type = 'skill'}) | ||
table.insert(dropRows, {source = Icons.Icon({"Rags to Riches I", type="spell"}), type = magicType, minqty = 1, qty = 1, | table.insert(dropRows, {source = Icons.Icon({"Rags to Riches I", type="spell"}), type = magicType, minqty = 1, qty = 1, weight = thisGemChance, totalWeight = totalGemChance}) | ||
table.insert(dropRows, {source = Icons.Icon({"Rags to Riches II", type="spell"}), type = magicType, minqty = 1, qty = 1, | table.insert(dropRows, {source = Icons.Icon({"Rags to Riches II", type="spell"}), type = magicType, minqty = 1, qty = 1, weight = thisGemChance, totalWeight = totalGemChance}) | ||
end | end | ||
Line 663: | Line 674: | ||
local fishSource = '[[Fishing#Special|Special]]' | local fishSource = '[[Fishing#Special|Special]]' | ||
local fishType = Icons.Icon({'Fishing', type='skill'}) | local fishType = Icons.Icon({'Fishing', type='skill'}) | ||
table.insert(dropRows, {source = fishSource, type = fishType, minqty = 1, qty = 1, weight = item.fishingCatchWeight, totalWeight = Items.specialFishWt}) | |||
table.insert(dropRows, {source = fishSource, type = fishType, minqty = 1, qty = 1, | |||
end | end | ||
Line 670: | Line 680: | ||
local fishSource = '[[Fishing#Junk|Junk]]' | local fishSource = '[[Fishing#Junk|Junk]]' | ||
local fishType = Icons.Icon({'Fishing', type='skill'}) | local fishType = Icons.Icon({'Fishing', type='skill'}) | ||
table.insert(dropRows, {source = fishSource, type = fishType, minqty = 1, qty = 1, weight = 1, totalWeight = Items.junkCount}) | |||
table.insert(dropRows, {source = fishSource, type = fishType, minqty = 1, qty = 1, | |||
end | end | ||
--Make sure to return nothing if there are no drop sources | --Make sure to return nothing if there are no drop sources | ||
if Shared.tableCount(dropRows) == 0 then return '' end | if Shared.tableCount(dropRows) == 0 then return '' end | ||
table.sort(dropRows, function(a, b) return a. | table.sort(dropRows, function(a, b) return a.weight / a.totalWeight > b.weight / b.totalWeight end) | ||
for i, data in pairs(dropRows) do | for i, data in pairs(dropRows) do | ||
result = result..buildRow(data.source, data.type, data.minqty, data.qty, data. | result = result..buildRow(data.source, data.type, data.minqty, data.qty, data.weight, data.totalWeight) | ||
end | end | ||