Module:EncounterTable: Difference between revisions

From Caves of Qud Wiki
Jump to navigation Jump to search
(reformatted chance to be a percent)
(changing format of table parameter)
Line 86: Line 86:
       end
       end
     elseif row["item"] == 'none' then  
     elseif row["item"] == 'none' then  
       finalTable[i]['item'] = 'Item from [[EncounterTable:' .. row['table'] .. '|' .. row['table'] .. ']]'
     
       finalTable[i]['item'] = 'Item from [[EncounterTable:' .. row['table'].match('^(%w*)%s+%w*') .. '#' .. row['table'] .. '|' .. 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!')

Revision as of 19:40, 12 November 2019


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

--a lot taken from lol gamepedia
function p.gsplit( text, pattern, plain )
	if not pattern then pattern = '%s*,%s*' end
	local s, l = 1, text:len()
	return function ()
		if s then
			local e, n = text:find( pattern, s, plain )
			local ret
			if not e then
				ret = text:sub( s )
				s = nil
			elseif n < e then
				-- Empty separator!
				ret = text:sub( s, e )
				if e < l then
					s = e + 1
				else
					s = nil
				end
			else
				ret = e > s and text:sub( s, e - 1 ) or ''
				s = n + 1
			end
			return ret
		end
	end, nil, nil
end

function p.split(text, pattern, plain)
	if not text then
		return {}
	end
	local ret = {}
	for m in p.gsplit(text, pattern, plain) do
		ret[#ret+1] = m
	end
	return ret
end

function p.splitArgs(input, fieldlist, sep)
    if not input or input == '' then return end
    sep = sep or '%s*;;;%s*'
    local result = {}
    local inputTbl = p.split(input,sep)
    for i, v in ipairs(fieldlist) do
        if not inputTbl[i] then
            error(('Missing parameter %s - maybe wrong child template?'):format(v))
        end
        if inputTbl[i] ~= '' then 
            result[v] = inputTbl[i]
        end
    end
    return result
end

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


function p.start(frame)
 args = process_args.merge(true)
 local tblName = args['name'] or ''
 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 
       
       finalTable[i]['item'] = 'Item from [[EncounterTable:' .. row['table'].match('^(%w*)%s+%w*') .. '#' .. row['table'] .. '|' .. 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
    finalTable[i]['chance'] = string.format("%.2f%%",row['weight']*100/totalWeight)
  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">' .. tblheader  .. tr .. '</table>'
end

return p