Module:Sandbox/MonkeysHK

-- local p = {}

local loader = require('Module:Loader') local ucfirst = string.ucfirst local getArgs = require('Module:Arguments').getArgs local data, aliases = loader.loadData('Pet/Data', 'Pet/Aliases') local string, table = loader.require('String', 'Table') local makeStat = require('Module:Statname')._getStatName local makeColor = require('Module:Color')._colorTemplates local tooltipColor = require('Module:Color').tooltipFormatting local makeCoins = require('Module:Currency')._coins local makeAbility = require('Module:Ability')._ability local makeRarity = require('Module:RarityTier')._link local getRarityData = require('Module:RarityTier')._getTier local rarityAliases = require('Module:RarityTier/Aliases') local checkType = require('Module:LibraryUtil').checkType local getRarityColor = require('Module:UIText').getRarityColor local getTooltipFormatting = require('Module:UIText').getTooltipFormatting

local curtitle = mw.title.getCurrentTitle local pagename = curtitle.prefixedText local fullpagename = curtitle.fullText

local rarityList = { nums = { common = 1, uncommon = 2, rare = 3, epic = 4, legendary = 5, mythic = 6, } }

function p._petTooltip(pet) local data = mw.loadData('Module:Pet/Data') local aliases = mw.loadData('Module:Pet/Aliases') pet = pet:lower:gsub(' pet', '') pet = aliases[mw.text.trim(pet)] or 'not found' data = data[pet] local id = string.ucfirst(pet.." pet") local name = id   local title = "&7[Lvl 100] &6"..string.ucfirst(pet) local text = {} --create various variables local rarities = (data.rarities):upper:gsub('[^%a]', '') local stats = data.stats local ab = { amounts = data.abilities.amounts and data.abilities.amounts:gsub('[^%d]', '') or '112234', names = data.abilities.name, descs = data.abilities.desc, bonus_descs = data.abilities.bonus_desc, variables = data.abilities.variables, }   if not stats then return error(string.format('Missing pet stats (Pet: %s)', pet), 2) end i = #rarities --================================   -- construct the table --================================   -- headers -   -- local ved_buttons = ' v • e • d' -- local wikitable = mw.html.create('table'):addClass('wikitable'):css({['width']='100%'}) -- wikitable:tag('tr') --    :tag('th'):wikitext('Base Stats ⓘ '):css({['width']='50%'}):done --    :tag('th'):wikitext('Level 100 '..ved_buttons):css({['width']='50%'}):done -- :done local rarity = { letter = rarities:sub(i,i) } rarity.name = getRarityData(rarity.letter).name rarity.full = rarityAliases[rarity.letter:lower] rarity.num = rarityList.nums[rarity.full] -- wikitable:tag('tr') -	   -- base stats -       -- :tag('td'):wikitext(table.concat{        --     p.constructStats(stats, 'base', rarity.full), --(stats, _type)        --     p.processAbilities(ab, 'base', rarity.full, ab.amounts:sub(rarity.num, rarity.num), pet) --(ab, type, rarity, amount, pet)        -- }):done -       -- level 100 stats - --       -- :tag('td'):wikitext(table.concat{        --     p.constructStats(stats, '100', rarity.full), --(stats, _type)        --     p.processAbilities(ab, '100', rarity.full, ab.amounts:sub(rarity.num, rarity.num), pet) --(ab, type, rarity, amount, pet)        -- }):done --	text = table.merge(text,		{ "&8"..(data.petType or "").." Pet" },		p.constructTooltipStats(stats, '100', rarity.full), --(stats, _type)		p.processTooltipAbilities(ab, '100', rarity.full, ab.amounts:sub(rarity.num, rarity.num), pet), --(ab, type, rarity, amount, pet)		{ "&cThis is a preview of maxed/rarity and level!/Pets can appear in different/rarities and levels!",			"&eRight-click to add this pet to/your pet menu!",			"&l&"..getRarityColor(rarity.full)..rarity.name:upper }	) text = table.concat(text, "//") -- :done -   -- bonus stats -   -- wikitable:tag('tr') --    :tag('th'):attr({ colspan=2 }):wikitext('Leveling Bonuses '):done -- :done -- wikitable:tag('tr') --    :tag('td'):attr({ colspan=2 }):wikitext(table.concat{    --         p.constructStats(stats, 'bonus', rarity.full), --(stats, _type)    --         p.processAbilities(ab, 'bonus', rarity.full, ab.amounts:sub(rarity.num, rarity.num), pet) --(ab, type, rarity, amount, pet)    --     }):done -- text = table.concat{ '|-|', rarity.name, '=', tostring(makeRarity(rarity.full)), ' stats:', tostring(wikitable) } return {name = name, title = title, text = text} end

function p.constructTooltipStats(stats, _type, rarity) checkType('constructStats', 1, stats, 'table') checkType('constructStats', 2, _type, {'string', 'nil'}) rarity = rarityAliases[rarity] or rarity local list = {} for key, value in pairs(stats) do   	reqRarity = value.req and rarityAliases[value.req:lower] or nil if not value.req or rarityList.nums[rarity] >= rarityList.nums[reqRarity] then local num if _type == '100' then num = (value[2] or 0) + 100 * value[1] elseif _type == 'bonus' then num = value[1] else num = (value[2] or 0) end table.push(list, string.wrapHtml({ tostring(makeStat(key)), (num < 0 and ': ' or ': +'), num, (_type == 'bonus' and ' per level' or '') }, 'li')) end end return table.concat{ _type == '100' and 'Stats:' or (           _type == 'bonus'             and 'Bonus stats:'            or 'Base stats:'        ), string.wrapHtml(list, 'ul') } end

function p.processTooltipAbilities(ab, type, rarity, amount, pet) checkType('processAbilities', 1, ab, 'table') checkType('processAbilities', 2, type, 'string') checkType('processAbilities', 3, rarity, 'string') local function processVars(desc, index) desc = p.xmlColorConvert(desc) desc = p.processSTAT(desc) desc = p.processRARITY(desc) desc = p.replaceCoins(desc) desc = p.formatFakeAbility(desc) local MAX = 10 -- process double digits first for j = 10, MAX, 1 do			if desc:find('VAR'..tostring(j)) then desc = desc:gsub('VAR'..tostring(j), p.processVariables(ab.variables[rarity][index][j], type, pet)) end end -- process single digit for j = 1, 9, 1 do			if desc:find('VAR'..tostring(j)) then desc = desc:gsub('VAR'..tostring(j), p.processVariables(ab.variables[rarity][index][j], type, pet)) end end -- add fullstop if there isn't       if desc:sub(#desc,#desc) ~= '.' then desc = desc..'.' end return desc end local rarity_num = rarityList.nums[rarity] --if not ab.names[amount] then error(string.format('Missing ability name #%s', amount), 2) end --if not ab.descs[amount] then error(string.format('Missing ability description #%s', amount), 2) end local list = {} for i=1, amount, 1 do       if type == '100' then desc = processVars(ab.descs[i], i)	       if desc:sub(#desc,#desc) ~= '.' then desc = desc..'.' end table.push(list,                    string.wrapHtml({ makeAbility(ab.names[i]), ' - ', desc }, 'li')           ) elseif type == 'bonus' then desc = processVars(ab.bonus_descs[i] or 'no leveling bonus', i)           table.push(list,                string.wrapHtml({ makeAbility(ab.names[i]), ': ', desc }, 'li')           ) else desc = processVars(ab.descs[i], i)           table.push(list,                 string.wrapHtml({ makeAbility(ab.names[i]), ' - ', desc }, 'li')           ) end end return table.concat{ makeAbility('Abilities:'), string.wrapHtml{ list, '', { ["list-style-type"]="circle"; ["line-height"]="inherit"; }       }    } end

function p.processVariables(variable, type, pet) -- check for errors if not variable.color then error(string.format('Variable argument missing (color) (Pet: %s)', pet), 2) end if variable.is_roman then if variable.per_lvl then return makeColor(variable.color, variable.per_lvl) else return makeColor(variable.color, variable.base) end end -- check for errors again if not variable.per_lvl and variable.per_lvl ~= 0 then return error(string.format('Variable argument missing (per_lvl) (Pet: %s)', pet), 2) end --perform calculations local num if type and type == '100' or type == 100 then num = (variable.base or 0) + 100 * variable.per_lvl elseif type and type == 'bonus' then num = variable.per_lvl else num = (variable.base or 0) end if variable.round_to_full then num = math.floor(num) end --add suffix num = tostring(num)..(variable.suffix or '') --colorize num = makeColor(variable.color, num) return num end

function p.processSTAT(str) if str:find('STAT_[%u-]+') then str = str:gsub('STAT_([%u-]+)', function(s) return makeStat(s) end) end if str:find('STATs_([%u-]+)') then str = str:gsub('STATs_([%u-]+)', function(s) return makeStat(s, nil, true) end) end return str end

function p.processRARITY(str) if str:find('RARITY_%u+') then str = str:gsub('RARITY_(%u+)', function(s) return makeRarity(s) end) end return str end

function p.replaceCoins(str) return str:gsub('COINS', tostring(makeCoins)) end

function p.recursiveGsub(val, t)   for i = 1,#t,1 do        val = val:gsub(t[i][1], t[i][2]) end return val end

function p.formatFakeAbility(s) checkType('formatFakeAbility', 1, s, 'string') return s:gsub('%{ABILITY%}(.+)%{/ABILITY%}', function(s) return makeAbility(s) end) end

function p.xmlColorConvert(s) checkType('xmlColorConvert', 1, s, 'string') local colors = { ['green']='green', ['black']='black', ['blue']='blue', ['aqua']='aqua', ['bronze']='bronze', ['orange']='orange', ['darkgray']='darkgray', ['darkgreen']='darkgreen', ['darkpurple']='darkpurple', ['darkred']='darkred', ['gold']='gold', ['red']='red', ['lightpurple']='lightpurple', ['silver']='silver', ['turquoise']='turquoise', ['white']='white', ['yellow']='yellow', ['pink']='pink', }   return s:gsub(        '(.-)',        function(tag, str, endTag)             tag = tag:lower:gsub('_', )            endTag = endTag:lower:gsub('_', )            if tag and (not endTag or endTag == "")                    then error(string.format('XML color tags syntax error: No closing tag found for tag ', tag), 4)                elseif tag:lower ~= endTag:lower                    then error( string.format(                           'XML color tags syntax error: Expected closing tag for \'\' is \'\', got ',                            tag,                            tag,                            endTag                        ), 4)           end            return colors[tag] and makeColor((colors[tag] or color):lower, str) or table.concat{'<', tag, '>', str, ''}        end    ) end

return p