Module:EncounterTable: Difference between revisions

From Caves of Qud Wiki
Jump to navigation Jump to search
mNo edit summary
(change data namespace to Population)
 
(2 intermediate revisions by one other user not shown)
Line 69: Line 69:
             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!'

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