Module:EncounterTable: Difference between revisions

From Caves of Qud Wiki
Jump to navigation Jump to search
(tables are sortable now)
(new option: roll which can be "once" (default, calculates weights against all) or "each" (weight/100))
Line 10: Line 10:


function p.start(frame)
function p.start(frame)
args = process_args.merge(true)
    args = process_args.merge(true)
local tblName = args['name'] or ''
    local tblName = args['name'] or ''
local result = {}
    local pick = args['roll'] or 'each'
local totalWeight = 0
 
for i, row in ipairs(args) do
    local result = {}
  local newrow = p.splitEncounterTableArgs(row)
    local totalWeight = 0
  result[i] = newrow
    for i, row in ipairs(args) do
  totalWeight = totalWeight + tonumber(newrow['weight'])
        local newrow = p.splitEncounterTableArgs(row)
end
        result[i] = newrow
        totalWeight = totalWeight + tonumber(newrow['weight'])
    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["table"] == 'none' then
        if row["table"] == 'none' then
      if row["item"] == 'none' then
            if row["item"] == 'none' then
        error('A table or item must be specified!')
                error('A table or item must be specified!')
      else
            else
        finalTable[i]['item'] = '[[' .. row['item'] .. ']]'
                finalTable[i]['item'] = '[[' .. row['item'] .. ']]'
      end
            end
    elseif row["item"] == 'none' then  
        elseif row["item"] == 'none' then  
      linkstr = ""
            linkstr = ""
      maintable = row['table']:match('^(.+)%s+%w*$')
            maintable = row['table']:match('^(.+)%s+%w*$')
      if maintable ~= nil and maintable ~= '' then
            if maintable ~= nil and maintable ~= '' then
        linkstr = maintable .. '#' .. row['table']
                linkstr = maintable .. '#' .. row['table']
      else
            else
        linkstr = row['table']
                linkstr = row['table']
      end
            end
      finalTable[i]['item'] = 'Item from [[Data:' .. linkstr  .. '|' .. row['table'] .. ']]'
            finalTable[i]['item'] = 'Item from [[Data:' .. linkstr  .. '|' .. row['table'] .. ']]'
    else
        else
      error('A table and item cannot be specified at the same time!')
            error('A table and item cannot be specified at the same time!')
    end
        end
     -- dice tooltip quantity
     -- dice tooltip quantity
    finalTable[i]['quantity'] = frame:expandTemplate{title='Dice tooltip', args={row['quantity']}}
        finalTable[i]['quantity'] = frame:expandTemplate{title='Dice tooltip', args={row['quantity']}}
     --finalTable[i]['quantity'] = row['quantity']
     --finalTable[i]['quantity'] = row['quantity']
    finalTable[i]['weight'] = row['weight']
        finalTable[i]['weight'] = row['weight']
   -- calculate final chance
   -- calculate final chance
    finalTable[i]['chance'] = string.format("%.2f%%",row['weight']*100/totalWeight)
        if pick == 'once' then
  end
            finalTable[i]['chance'] = string.format("%.2f%%",row['weight']*100/totalWeight)
  return (p.formatTable(finalTable))
        elseif pick == 'each' then
            finalTable[i]['chance'] = string.format("%.2f%%",row['weight']/100)
        else
            error('"roll" parameter takes only "once" or "each"!')
        end
    end
    return (p.formatTable(finalTable))
end
end


function p.formatTable(final)
function p.formatTable(final)
  local tblheader = '<tr><th>Item</th><th>Quantity</th><th>Weight</th><th>Chance</th></tr>'
    local tblheader = '<tr><th>Item</th><th>Quantity</th><th>Weight</th><th>Chance</th></tr>'
  local tr = ''
    local tr = ''
  for _, v in ipairs(final) do
    for _, v in ipairs(final) do
         tr = tr ..  ' <tr><td>' .. v['item'] .. '</td><td>' .. v['quantity'] .. '</td><td>' .. v['weight'] .. '</td><td>' .. v['chance'] .. '</td></tr>'
         tr = tr ..  ' <tr><td>' .. v['item'] .. '</td><td>' .. v['quantity'] .. '</td><td>' .. v['weight'] .. '</td><td>' .. v['chance'] .. '</td></tr>'
  end
    end
     return '<table class="wikitable sortable">' .. tblheader  .. tr .. '</table>'
     return '<table class="wikitable sortable">' .. tblheader  .. tr .. '</table>'
end
end


return p
return p

Revision as of 01:43, 26 April 2020


local p = {}
local process_args = require('Module:ProcessArgs')
local text_util = require('Module:Text Utility')

function p.splitEncounterTableArgs(row)
    local TABLE_ARGS = { 'table', 'item', 'quantity', 'weight' }
    return text_util.splitArgs(row, TABLE_ARGS)
end


function p.start(frame)
    args = process_args.merge(true)
    local tblName = args['name'] or ''
    local pick = args['roll'] or 'each'

    local result = {}
    local totalWeight = 0
    for i, row in ipairs(args) do
        local newrow = p.splitEncounterTableArgs(row)
        result[i] = newrow
        totalWeight = totalWeight + tonumber(newrow['weight'])
    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 
            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'] = string.format("%.2f%%",row['weight']*100/totalWeight)
        elseif pick == 'each' then
            finalTable[i]['chance'] = string.format("%.2f%%",row['weight']/100)
        else
            error('"roll" parameter takes only "once" or "each"!')
        end
    end
    return (p.formatTable(finalTable))
end

function p.formatTable(final)
    local tblheader = '<tr><th>Item</th><th>Quantity</th><th>Weight</th><th>Chance</th></tr>'
    local tr = ''
    for _, v in ipairs(final) do
        tr = tr ..  ' <tr><td>' .. v['item'] .. '</td><td>' .. v['quantity'] .. '</td><td>' .. v['weight'] .. '</td><td>' .. v['chance'] .. '</td></tr>'
    end
    return '<table class="wikitable sortable">' .. tblheader  .. tr .. '</table>'
end

return p