8,756
edits
mNo edit summary |
(change data namespace to Population) |
||
(14 intermediate revisions by 3 users not shown) | |||
Line 1: | Line 1: | ||
local | local EncounterTable = {} | ||
function | --# Requires | ||
local TABLE_ARGS = { 'table', 'item', 'quantity', 'weight' } | |||
return | local ProcessArgs = require'Module:ProcessArgs' | ||
local TextUtility = require'Module:Text Utility' | |||
--# Interface | |||
function EncounterTable.splitEncounterTableArgs(row, hideQuantity) | |||
local TABLE_ARGS = {} | |||
if hideQuantity then | |||
TABLE_ARGS = {'table', 'item', 'weight'} | |||
else | |||
TABLE_ARGS = {'table', 'item', 'quantity', 'weight'} | |||
end | |||
return TextUtility.splitArgs(row, TABLE_ARGS) | |||
end | end | ||
function | function EncounterTable.start(frame) | ||
local favilink = require 'Module:Favilink' | |||
local | |||
local args = ProcessArgs.merge(true) | |||
local tblName = args.name or '' | |||
local pick = args.roll or 'once' | |||
local bFavilinkId = false | |||
local bHideQuantity = (args.hidequantity ~= nil) | |||
if args.favilinkid == 'yes' then bFavilinkId = true end | |||
local bSamePageLink = false | |||
if args.samepage == 'yes' then bSamePageLink = true end | |||
local result = {} | local result = {} | ||
local totalWeight = 0 | local totalWeight = 0 | ||
for i, row in ipairs(args) do | for i, row in ipairs(args) do | ||
local newrow = | local newrow = EncounterTable.splitEncounterTableArgs(row) | ||
result[i] = newrow | result[i] = newrow | ||
totalWeight = totalWeight + tonumber(newrow | totalWeight = totalWeight + tonumber(newrow.weight) | ||
end | end | ||
--format table. | -- format table. | ||
local finalTable = {} | local finalTable = {} | ||
local str = '' | local str = '' | ||
for i, row in ipairs(result) do | for i, row in ipairs(result) do | ||
finalTable[i]={} | finalTable[i] = {} | ||
if row | |||
if row | if row.table == 'none' then | ||
error | if row.item == 'none' then | ||
error'A table or item must be specified!' | |||
else | else | ||
finalTable[i] | if bFavilinkId then | ||
finalTable[i].item = favilink.modulefavilink(row.item, 'ObjectID') | |||
else | |||
finalTable[i].item = '[[' .. row.item .. ']]' | |||
end | |||
end | end | ||
elseif row | elseif row.item == 'none' then | ||
linkstr = | local linkstr = '' | ||
maintable = row | maintable = row.table:match'^(.+)%s+%w*$' | ||
if bSamePageLink then | |||
linkstr = maintable .. '#' .. row | maintable = mw.title.getCurrentTitle().text | ||
linkstr = maintable .. '#' .. row.table | |||
elseif maintable ~= nil and maintable ~= '' then | |||
linkstr = maintable .. '#' .. row.table | |||
else | else | ||
linkstr = row | linkstr = row.table | ||
end | end | ||
finalTable[i] | |||
finalTable[i].item = 'Item from [[Population:' .. linkstr .. '|' .. row.table .. ']]' | |||
else | else | ||
error | error'A table and item cannot be specified at the same time!' | ||
end | |||
-- dice tooltip quantity | |||
if not bHideQuantity then | |||
finalTable[i].quantity = frame:expandTemplate{ | |||
title = 'Dice tooltip', | |||
args = {row.quantity}, | |||
} | |||
end | end | ||
--finalTable[i].quantity = row.quantity | |||
finalTable[i].weight = row.weight | |||
finalTable[i] | -- calculate final chance | ||
if pick == 'once' then | if pick == 'once' then | ||
finalTable[i] | finalTable[i].chance = ('%.2f%%'):format(row.weight * 100 / totalWeight) | ||
elseif pick == 'each' then | elseif pick == 'each' then | ||
finalTable[i] | finalTable[i].chance = ('%.2f%%'):format(row.weight) | ||
else | else | ||
error | error'"roll" parameter takes only "once" or "each"!' | ||
end | end | ||
end | end | ||
return | |||
return EncounterTable.formatTable(finalTable, bHideQuantity) | |||
end | end | ||
function | function EncounterTable.formatTable(final, bHideQuantity) | ||
local | local TABLE_HEADER = bHideQuantity and | ||
local | '<tr><th>Item</th><th>Weight</th><th>Chance</th></tr>' or | ||
for _, | '<tr><th>Item</th><th>Quantity</th><th>Weight</th><th>Chance</th></tr>' | ||
local tableRows = '' | |||
local headerhtml = '' | |||
for _, entry in ipairs(final) do | |||
if bHideQuantity then | |||
tableRows = tableRows .. ('<tr><td>%s</td><td>%s</td><td>%s</td></tr>'):format(entry.item, entry.weight, entry.chance) | |||
else | |||
tableRows = 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 | |||
end | end | ||
return '<table class="wikitable sortable"> | |||
return ('<table class="wikitable sortable">%s%s</table>'):format(TABLE_HEADER, tableRows) | |||
end | end | ||
return | return EncounterTable |