Module:EncounterTable: Difference between revisions

From Caves of Qud Wiki
Jump to navigation Jump to search
(new option: roll which can be "once" (default, calculates weights against all) or "each" (weight/100))
(change data namespace to Population)
 
(15 intermediate revisions by 3 users not shown)
Line 1: Line 1:
local p = {}
local EncounterTable = {}
local process_args = require('Module:ProcessArgs')
local text_util = require('Module:Text Utility')


function p.splitEncounterTableArgs(row)
--# Requires
     local TABLE_ARGS = { 'table', 'item', 'quantity', 'weight' }
 
     return text_util.splitArgs(row, TABLE_ARGS)
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 p.start(frame)
function EncounterTable.start(frame)
    args = process_args.merge(true)
     local favilink = require 'Module:Favilink'
    local tblName = args['name'] or ''
     local pick = args['roll'] or 'each'


    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 = p.splitEncounterTableArgs(row)
         local newrow = EncounterTable.splitEncounterTableArgs(row)
         result[i] = newrow
         result[i] = newrow
         totalWeight = totalWeight + tonumber(newrow['weight'])
         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["table"] == 'none' then
 
             if row["item"] == 'none' then
         if row.table == 'none' then
                 error('A table or item must be specified!')
             if row.item == 'none' then
                 error'A table or item must be specified!'
             else
             else
                 finalTable[i]['item'] = '[[' .. row['item'] .. ']]'
                 if bFavilinkId then
                    finalTable[i].item = favilink.modulefavilink(row.item, 'ObjectID')
                else
                    finalTable[i].item = '[[' .. row.item .. ']]'
                end
             end
             end
         elseif row["item"] == 'none' then  
         elseif row.item == 'none' then  
             linkstr = ""
             local linkstr = ''
             maintable = row['table']:match('^(.+)%s+%w*$')
             maintable = row.table:match'^(.+)%s+%w*$'
             if maintable ~= nil and maintable ~= '' then
            if bSamePageLink then
                 linkstr = maintable .. '#' .. row['table']
                maintable = mw.title.getCurrentTitle().text
                linkstr = maintable .. '#' .. row.table
             elseif maintable ~= nil and maintable ~= '' then
                 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 [[Population:' .. 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
 
        -- dice tooltip quantity
        if not bHideQuantity then
            finalTable[i].quantity = frame:expandTemplate{
                title = 'Dice tooltip',
                args = {row.quantity},
            }
         end
         end
    -- dice tooltip quantity
         --finalTable[i].quantity = row.quantity
         finalTable[i]['quantity'] = frame:expandTemplate{title='Dice tooltip', args={row['quantity']}}
         finalTable[i].weight = row.weight
    --finalTable[i]['quantity'] = row['quantity']
 
         finalTable[i]['weight'] = row['weight']
        -- calculate final chance
  -- calculate final chance
 
         if pick == 'once' then
         if pick == 'once' then
             finalTable[i]['chance'] = string.format("%.2f%%",row['weight']*100/totalWeight)
             finalTable[i].chance = ('%.2f%%'):format(row.weight * 100 / totalWeight)
         elseif pick == 'each' then
         elseif pick == 'each' then
             finalTable[i]['chance'] = string.format("%.2f%%",row['weight']/100)
             finalTable[i].chance = ('%.2f%%'):format(row.weight)
         else
         else
             error('"roll" parameter takes only "once" or "each"!')
             error'"roll" parameter takes only "once" or "each"!'
         end
         end
     end
     end
     return (p.formatTable(finalTable))
 
     return EncounterTable.formatTable(finalTable, bHideQuantity)
end
end


function p.formatTable(final)
function EncounterTable.formatTable(final, bHideQuantity)
     local tblheader = '<tr><th>Item</th><th>Quantity</th><th>Weight</th><th>Chance</th></tr>'
     local TABLE_HEADER = bHideQuantity and
     local tr = ''
'<tr><th>Item</th><th>Weight</th><th>Chance</th></tr>' or
     for _, v in ipairs(final) do
'<tr><th>Item</th><th>Quantity</th><th>Weight</th><th>Chance</th></tr>'
        tr = tr .. ' <tr><td>' .. v['item'] .. '</td><td>' .. v['quantity'] .. '</td><td>' .. v['weight'] .. '</td><td>' .. v['chance'] .. '</td></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">' .. tblheader  .. tr .. '</table>'
 
     return ('<table class="wikitable sortable">%s%s</table>'):format(TABLE_HEADER, tableRows)
end
end


return p
return EncounterTable

Latest revision as of 13:42, 20 January 2023


local EncounterTable = {}

--# Requires

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


function EncounterTable.start(frame)
    local favilink = require 'Module:Favilink'

    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 totalWeight = 0

    for i, row in ipairs(args) do
        local newrow = EncounterTable.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
                if bFavilinkId then
                    finalTable[i].item = favilink.modulefavilink(row.item, 'ObjectID')
                else
                    finalTable[i].item = '[[' .. row.item .. ']]'
                end
            end
        elseif row.item == 'none' then 
            local linkstr = ''
            maintable = row.table:match'^(.+)%s+%w*$'
            if bSamePageLink then
                maintable = mw.title.getCurrentTitle().text
                linkstr = maintable .. '#' .. row.table
            elseif maintable ~= nil and maintable ~= '' then
                linkstr = maintable .. '#' .. row.table
            else
                linkstr = row.table
            end

            finalTable[i].item = 'Item from [[Population:' .. linkstr  .. '|' .. row.table .. ']]'
        else
            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
        --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

    return EncounterTable.formatTable(finalTable, bHideQuantity)
end

function EncounterTable.formatTable(final, bHideQuantity)
    local TABLE_HEADER = bHideQuantity and 
'<tr><th>Item</th><th>Weight</th><th>Chance</th></tr>' or 
'<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

    return ('<table class="wikitable sortable">%s%s</table>'):format(TABLE_HEADER, tableRows)
end

return EncounterTable