Module:Role Advancement Table

From Drifter's Wiki TEST
Revision as of 17:59, 9 November 2022 by Archer (talk | contribs)
Jump to navigation Jump to search

Documentation for this module may be created at Module:Role Advancement Table/doc

p = {} -- p stands for package

local headers = '!Level\
![[Health]]</br>Total (increment)\
![[Armor Weight|A.W.]]</br>Total (increment)\
![[Skills]]\
'

local tableBegin = '{| class="wikitable" style="text-align: center;"\
'

local tableCaption = '|+ {{ROOTPAGENAME}} Level Advancement\
'

local tableEnd = '|}\
'

function p.makeHeaders( frame )
    return "Not Implemented Yet!!"
end

function p.makeHealthOrWeight( value, multiplier )
   if value == nil then return "" end
   local result, increment
   if multiplier == 0 then
      result = 0
      increment = "0"
   else
      result = value['inc'] * multiplier
      increment = tostring( value['inc'] )
   end

   return tostring( math.floor( result )) .. " (+" .. increment .. ")"
end

function p.makeIncrement( incremental, multiplier)
end

function p.makeRows( text, start, hp, aw )
	local buffer, count, row, skills
   local health = { values }
   local weight = {}

	skills = p.splitTextWithNulls( text )

   if start == nil then
      if #skills > 6 then
         row = 6
      else
         row = 1
      end
   else
	   row = start
   end

   if hp == nil then
      health = nil
   else
      for min, max in hp:gmatch "(%d+)-%s*(%d+)" do
         health['min'] = tonumber( min )
         health['max'] = tonumber( max )
         --print("min: " .. min .. ", max: " .. max)
      end

      if health['min'] > 0 then
         health['max'] = health['max'] - health['min']
         health['min'] = 0
      end
      health['inc'] = health['max'] / (#skills - 1)
   end

   if aw == nil then
      weight = nil
   else
      for min, max in aw:gmatch "(%d+)-%s*(%d+)" do
         weight['min'] = tonumber( min )
         weight['max'] = tonumber( max )
         --print("min: " .. min .. ", max: " .. max)
      end

      if weight['min'] > 0 then
         weight['max'] = weight['max'] - weight['min']
         weight['min'] = 0
      end
      weight['inc'] = weight['max'] / (#skills - 1)
    end

   buffer = ""
   count = 0
   for _, v in ipairs(skills) do
         buffer = buffer .. '|-' .. "\n" .. '| style="text-align:right;" |' .. tostring(row) .. "\n"
         buffer = buffer .. '|' .. p.makeHealthOrWeight( health, count ) .. "\n"
         buffer = buffer .. '|' .. p.makeHealthOrWeight( weight, count ) .. "\n"
         buffer = buffer .. '| style="text-align:left;" |' .. p.makeSkills(v) .. "\n"

         count = count + 1
         row = row + 1
	end

	return buffer
end

function p.makeSkills( text )
   local buffer = ""
   local skills = p.splitTextWithNulls( text, "," )

   for _, v in ipairs(skills) do
      buffer = buffer .. "[[" .. v .. "]]</br>\n"
   end

   return string.sub(buffer, 1, -7)
end

function p.makeTable( frame )
   local buffer
   local start

   start = p.processStart( frame )

   return tableBegin .. p.processCaption( frame ) .. p.processHeaders( frame ) .. p.makeRows( frame.args['skills'], start, frame.args['health'], frame.args['weight'] ) .. tableEnd
end

function p.processCaption( frame )
   local buffer
   if frame.args['name'] == nil then
      buffer = tableCaption
   else
      buffer = '|+ ' .. frame.args['name'] .. "'s Level Advancement\
"

   end

   return buffer
end

function p.processHeaders( frame )
   local buffer
   if frame['args']['headers'] == nil then
         buffer = headers
      else
         buffer = makeHeaders( frame['args']['headers'] )
   end

   return buffer
end

function p.processStart( frame )
   local start = nil
   if frame.args['start'] == nil then
      if ( frame.args['type'] ~= nil ) and ( frame.args['type'] ~= '' ) then
         if string.lower(frame.args['type']) == 'base' then
            start = 1
         elseif string.lower(frame.args['type']) == 'spec' then
            start = 6
         end
      end
   else
      start = tonumber( frame.args['start'] )
   end

   return start
end

function p.splitTextWithNulls( text, seperator )
   local buffer = ''
   local length = string.len(text)
   local pos = 1
   local results = {}

   if length > 0 then
      if seperator == nil then
         seperator = "|"
      end

      while pos <= length do
         local char = string.sub(text, pos, pos)

         if (char ~= seperator) then
            buffer = buffer .. char
         else
            table.insert(results, buffer)
            buffer = ""
         end

         if (pos == length) then
            table.insert(results, buffer)
         end

         pos = pos + 1
      end
   end

   return results
end

return p