17,101
edits
Falterfire (talk | contribs) (Added link for barrier column on dungeon table) |
(getChestDrops: Extend to include healing value for containers whose contents are entirely food) |
||
Line 1,172: | Line 1,172: | ||
return Shared.printError(chestName .. ' does not have a drop table') | return Shared.printError(chestName .. ' does not have a drop table') | ||
else | else | ||
local lootValue = 0 | |||
local function formatNumRange(minValue, maxValue) | |||
if maxValue ~= nil and maxValue > minValue then | |||
return Shared.formatnum(minValue) .. ' - ' .. Shared.formatnum(maxValue) | |||
else | |||
return Shared.formatnum(minValue) | |||
end | |||
end | |||
local lootValue, foodValue = 0, 0 | |||
local totalWt = 0 | local totalWt = 0 | ||
for i, row in | local isAllFood = true | ||
for i, row in ipairs(chest.dropTable) do | |||
totalWt = totalWt + row.weight | totalWt = totalWt + row.weight | ||
if isAllFood then | |||
-- If the container's contents are entirely food then we add additional | |||
-- information to the output, so we determine this here | |||
local item = Items.getItemByID(row.itemID) | |||
if item ~= nil and item.healsFor == nil then | |||
isAllFood = false | |||
end | |||
end | |||
end | end | ||
result = result..'\r\n{|class="wikitable sortable"' | result = result..'\r\n{|class="wikitable sortable"' | ||
result = result..'\r\n!Item!!Qty' | result = result..'\r\n!Item!!Qty' | ||
result = result..'!!colspan="2"|Chance!!Price' | result = result..'!!colspan="2"|Chance!!Price' .. (isAllFood and '!!Healing' or '') | ||
--Sort the loot table by weight in descending order | --Sort the loot table by weight in descending order | ||
local chestDrops = | local chestDrops = Shared.shallowClone(chest.dropTable) | ||
table.sort(chestDrops, function(a, b) return a.weight > b.weight end) | table.sort(chestDrops, function(a, b) return a.weight > b.weight end) | ||
for i, row in ipairs(chestDrops) do | for i, row in ipairs(chestDrops) do | ||
local thisItem = Items.getItemByID(row.itemID) | local thisItem = Items.getItemByID(row.itemID) | ||
result = result..'\r\n|-\r\n|'..Icons.Icon({thisItem.name, type='item'}) | result = result..'\r\n|-\r\n|'..Icons.Icon({thisItem.name, type='item'}) | ||
result = result..'||style="text-align:right" data-sort-value="'..(row.minQuantity + row.maxQuantity)..'"|' | result = result..'||style="text-align:right" data-sort-value="'..(row.minQuantity + row.maxQuantity)..'"| ' .. formatNumRange(row.minQuantity, row.maxQuantity) | ||
local dropChance = (row.weight / totalWt) * 100 | local dropChance = (row.weight / totalWt) * 100 | ||
Line 1,211: | Line 1,220: | ||
end | end | ||
lootValue = lootValue + (dropChance * 0.01 * thisItem.sellsFor * ((row.minQuantity + row.maxQuantity)/ 2)) | lootValue = lootValue + (dropChance * 0.01 * thisItem.sellsFor * ((row.minQuantity + row.maxQuantity)/ 2)) | ||
if isAllFood then | |||
local hp = thisItem.healsFor * 10 | |||
local minHeal, maxHeal = hp * row.minQuantity, hp * row.maxQuantity | |||
foodValue = foodValue + (dropChance * 0.01 * (minHeal + maxHeal) / 2) | |||
result = result .. '||data-sort-value="' .. thisItem.healsFor .. '"' | |||
result = result .. '|' .. Icons.Icon({'Hitpoints', type='skill', notext=true, nolink=true}) .. ' ' .. formatNumRange(minHeal, maxHeal) | |||
end | |||
end | end | ||
result = result..'\r\n|}' | result = result..'\r\n|}' | ||
result = result..'\r\nThe average value of the contents of one chest is '..Icons.GP(Shared.round(lootValue, 2, 0))..'.' | result = result..'\r\nThe average value of the contents of one chest is '..Icons.GP(Shared.round(lootValue, 2, 0))..'.' | ||
if isAllFood then | |||
result = result..'\r\nThe average healing of the contents of one chest is ' .. Icons.Icon({'Hitpoints', type='skill', notext=true, nolink=true}) .. ' ' .. Shared.round(foodValue, 2, 0) .. '.' | |||
end | |||
end | end | ||