Module:EncounterTableSandbox: Difference between revisions
Jump to navigation
Jump to search
mNo edit summary |
mNo edit summary |
||
Line 80: | Line 80: | ||
end | end | ||
end | end | ||
footer = {} | local footer = {} | ||
if pick == 'each' then | if pick == 'each' then | ||
-- If roll each, add row that calculates chance of getting nothing | -- If roll each, add row that calculates chance of getting nothing |
Latest revision as of 18:48, 6 May 2021
Documentation for this module may be created at Module:EncounterTableSandbox/doc
local EncounterTable = {}
--# Requires
local ProcessArgs = require'Module:ProcessArgs'
local TextUtility = require'Module:Text Utility'
--# Interface
function EncounterTable.splitEncounterTableArgs(row)
local TABLE_ARGS = {'table', 'item', 'quantity', 'weight'}
return TextUtility.splitArgs(row, TABLE_ARGS)
end
function EncounterTable.start(frame)
local args = ProcessArgs.merge(true)
local tblName = args.name or ''
local pick = args.roll or 'once'
local result = {}
local totalWeight = 0
local nothingChance = 1
for i, row in ipairs(args) do
local newrow = EncounterTable.splitEncounterTableArgs(row)
result[i] = newrow
totalWeight = totalWeight + tonumber(newrow.weight)
if pick == 'each' and totalWeight < 100 then
nothingChance = nothingChance * ((100 - totalWeight) / 100)
else
nothingChance = 0
end
end
-- format table.
local finalTable = {}
local str = ''
for i, row in ipairs(result) do
finalTable[i] = {}
if row.table == 'none' then
if row.item == 'none' then
error'A table or item must be specified!'
else
finalTable[i].item = '[[' .. row.item .. ']]'
end
elseif row.item == 'none' then
local linkstr = ''
maintable = row.table:match'^(.+)%s+%w*$'
if maintable ~= nil and maintable ~= '' then
linkstr = maintable .. '#' .. row.table
else
linkstr = row.table
end
finalTable[i].item = 'Item from [[Data:' .. linkstr .. '|' .. row.table .. ']]'
else
error'A table and item cannot be specified at the same time!'
end
-- dice tooltip quantity
finalTable[i].quantity = frame:expandTemplate{
title = 'Dice tooltip',
args = {row.quantity},
}
--finalTable[i].quantity = row.quantity
finalTable[i].weight = row.weight
-- calculate final chance
if pick == 'once' then
finalTable[i].chance = ('%.2f%%'):format(row.weight * 100 / totalWeight)
elseif pick == 'each' then
finalTable[i].chance = ('%.2f%%'):format(row.weight)
else
error'"roll" parameter takes only "once" or "each"!'
end
end
local footer = {}
if pick == 'each' then
-- If roll each, add row that calculates chance of getting nothing
footer.item = "Nothing"
footer.chance = nothingChance
end
return EncounterTable.formatTable(finalTable, footer)
end
function EncounterTable.formatTable(final, tablefooter)
local TABLE_HEADER = '<tr><th>Item</th><th>Quantity</th><th>Weight</th><th>Chance</th></tr>'
local tableRows = {}
local footer = tablefooter or {}
for _, entry in ipairs(final) do
table.insert(tableRows, ('<tr><td>%s</td><td>%s</td><td>%s</td><td>%s</td></tr>'):format(entry.item, entry.quantity, entry.weight, entry.chance))
end
if #footer > 0 then
table.insert(tableRows, ('<tr><td colspan="3">%s</td><td>%s</td></tr>'):format(footer.item, footer.chance))
end
return ('<table class="wikitable sortable">%s%s</table>'):format(TABLE_HEADER, table.concat(tableRows, ''))
end
return EncounterTable