Module:Sandbox/TheTrueShaman

local p = {} local getArgs = require('Module:Arguments').getArgs local loader = require('Module:Loader')

local string, table, yesno = loader.require('String', 'Table', 'Yesno')

local armorData = loader.require('Module:Armor/Data') local reforges = loader.require('Module:Reforge/Data') local getArgs = require('Module:Arguments').getArgs local statName = require('Module:Statname').getStatName local statData = mw.loadData('Module:Statname/Data')

function p.makeHtmlStatsList(item, noStatsValue) local t = {} local statFormat1 = '%s: %s' local statFormat2 = '%s: %s&#32;(%s)' local function parseStat(val, stat, percent) if not val or val == '' then return end percent = percent and '%' or '' if type(val) == 'number' and val > 0 then t[#t+1] = string.format('%s: +%s', statName{stat}, val..percent) elseif type(val) ~= "table" and string.match(val, '^([^%D]+)$') and not val[2] then t[#t+1] = string.format('%s: %s', statName{stat}, val..percent) elseif type(val) == 'table' and string.match(val[1] or '', '^([^%D]+)$') then t[#t+1] = string.format('%s: +%s&#32;(%s)', statName{stat}, val[1]..percent, val[2]) elseif type(val) == "table" and val.lower then t[#t+1] = string.format('%s: %s-%s', statName{stat}, (val.lower > 0 and '+' or '')..val.lower..percent, val.upper..percent) elseif type(val) == "table" and type(val[2]) ~= "string" then t[#t+1] = string.format('%s: %s&#32;(%s)', statName{stat}, val[1]..percent, val[2]) elseif tostring(val):match('([%+%-]?)(%d+)%-(%d+)') then t[#t+1] = string.format('%s: %s%s', statName{stat}, not val:match('^[%-%+]') and '+' or , val:gsub('%%$', )..percent) else t[#t+1] = string.format('%s: %s</li>', statName{stat}, val..percent) end end for k,v in pairs(statData) do		parseStat(item[v.shortcode], v.shortcode, v.percent) end if #t == 0 then return noStatsValue end return string.wrapHtml{ t, '<ul>', { style="list-style-type:square;"; }	} end

function p.getArmorData(frame) local args = getArgs(frame) local armor = (args[1] or args['armor']):lower local growth = args['growth'] or 5 local protection = args['protection'] or 5 local hpb = args[2] or args['hpb'] local fpb = args[3] or args['fpb'] local reforge = args[4] or args['reforge'] or nil return p._getArmorData(armor, growth, protection, hpb + fpb, reforge) end

function p._getArmorData(armorname, growth, protection, hpb, reforge) local armor = armorData[armorname] armor['kind'] = 'Iron' -- O for Ordered, because this is the order in which the stats show up in-game (too many stats variables I know) local statsO = {'str', 'cc', 'cd', 'bas', 'hp', 'def', 'spd', 'int', 'fer', 'mf', 'tdef', 'mns', 'mnf', 'scc'} -- D for Data because these abbreviations come from the Armor/Data module local piecesD = {'head', 'chest', 'legs', 'boots', 'total'} -- It's a thingy... 	local thingy = {'base', 'enchants', 'hpb', 'reforge'} local armorstats = {helmet = {}, chestplate = {}, leggings = {}, boots = {}, total = {}} for i = 1,4,1 do 		local piece = piecesD[i] local piecestats = {hp={}, def={}, cc={}, cd={}, str={}, int={}, spd={}, scc={}, td={}} for a = 1,#statsO,1 do			if armor['stats'][piece][statsO[a]] then piecestats[statsO[a]]['base'] = armor['stats'][piece][statsO[a]] end end if growth ~= 0 then piecestats['hp']['enchants'] = 15*growth end if protection ~= 0 then piecestats['def']['enchants'] = 3*protection end if hpb ~= 0 then piecestats['hp']['hpb'] = 4*hpb piecestats['def']['hpb'] = 2*hpb end if reforge and reforges['Armor'][reforge] then for a = 1,#statsO,1 do 				if reforges['Armor'][reforge]['stats'][armor['rarity']][statsO[a]] then piecestats[statsO[a]]['reforge'] = reforges['Armor'][reforge]['stats'][armor['rarity']][statsO[a]] end end end for a = 1,#statsO,1 do			if piecestats[statsO[a]] then piecestats[statsO[a]]['total'] = 0 for b = 1,#thingy,1 do					if piecestats[statsO[a]][thingy[b]] then piecestats[statsO[a]]['total'] = piecestats[statsO[a]]['total'] + piecestats[statsO[a]][thingy[b]] end end end end if armor['kind'] then if armor['kind'] == 'varied' then piecestats['kind'] = armor['piece']['kind'] else piecestats['kind'] = armor['kind'] end end armorstats[i] = piecestats end local armornames = {'helmet', 'chestplate', 'leggings', 'boots', 'total'} local helmetData = armorstats[1] local chestData = armorstats[2] local legsData = armorstats[3] local bootsData = armorstats[4] local totalData = {} -- I shouldn't do this over and over, but I do... Eyo later me, fix this. for i,tData in ipairs({ helmetData, chestData, legsData, bootsData}) do		for i = 1,#statsO,1 do			if tData[statsO[i]] then if not totalData[statsO[i]] then totalData[statsO[i]] = {} end for a = 1,#thingy,1 do					if tData[statsO[i]][thingy[a]] then totalData[statsO[i]][thingy[a]] = tData[statsO[i]][thingy[a]] end end end end tData["statslist"] = p.makeHtmlStatsList({}) end local function getDefaultImage(pType, pIsLink) local link = table.concat{"File:", title:gsub("Armor", pType), ".png"} if pIsLink then link = table.concat{"40px|center"} end return link end local function makeImageCell(pRow, pData, pType) local td = pRow:tag("td"):attr("id", pType) if next(pData) then if pData["kind"] then td:addClass("as2x2-icon"):wikitext(table.concat{""}) elseif pData["color"] then td:addClass("as2x2-icon"):wikitext(table.concat{""}) elseif defaultImages then td:wikitext(getDefaultImage(pType, true)) else td:wikitext(" ") end else td:attr("colspan", 2):css{ ["border-right-width"]="2px" }:wikitext("") end return td	end local function makeCellCollapsible(pCell, pCollapsed) pCell :addClass("mw-collapsible") :attr("id", "mw-customcollapsible-pcb-toggle-button") if pCollapsed then pCell:addClass("mw-collapsed") end end local function makeDataCell(pRow, pData) if next(pData) then local td = row:tag("td"):wikitext(pData["statslist"]) :css({ ["border-right-width"]="2px" }) makeCellCollapsible(td) -- add a second collapsed cell to allow user to toggle between both cells local td2 = row:tag("td"):css({ ["border-right-width"]="2px" }) makeCellCollapsible(td2, true) if pData["pcb"] or pData["pcb_desc"] then if pData["pcb"] then td2:tag("div"):wikitext(pieceBonus{ pData["pcb"] }) end td2:wikitext(pData["pcb_desc"]) else td2:wikitext("") end end end local t = {} t[#t+1] = " Armor Stats \n" t[#t+1] = " Note: You Can Click on the Orange Button below to Show/Hide the Piece Bonuses \n" local wikitable = mw.html.create("table"):addClass("wikitable armorstats2x2"):css{ ["border-width"]="2px", ["border-color"]="#aaa" }; wikitable:tag("tr"):tag("th"):attr("colspan", 4) :tag("div") :addClass("mw-customtoggle-pcb-toggle-button wikia-menu-button hidden"):css{ padding="3px" } :wikitext(pcbToggleButtonName or "Click Here to Show Piece Bonuses") wikitable:tag("tr") :tag("th"):attr("colspan", 2):css{ ["border-right-width"]="2px" } :wikitext(helmetData["special_name"] or "Helmet"):done :tag("th"):attr("colspan", 2) :wikitext(chestData["special_name"] or "Chestplate"):done row = wikitable:tag("tr") makeImageCell(row, helmetData, "Helmet") makeDataCell(row, helmetData) makeImageCell(row, chestData, "Chestplate") makeDataCell(row, chestData) wikitable:tag("tr") :tag("th"):attr("colspan", 2):css{ ["border-right-width"]="2px", ["border-top-width"]="2px" } :wikitext(legsData["special_name"] or "Leggings"):done :tag("th"):attr("colspan", 2):css{ ["border-top-width"]="2px" } :wikitext(bootsData["special_name"] or "Boots"):done -- Legs / Boots image and data row row = wikitable:tag("tr") makeImageCell(row, legsData, "Leggings") makeDataCell(row, legsData) makeImageCell(row, bootsData, "Boots") makeDataCell(row, bootsData) row = wikitable:tag("tr") td = row:tag("th"):attr("colspan", 4):wikitext("Total"):css{ ["border-right-width"]="2px", ["border-top-width"]="2px" } makeCellCollapsible(td) row = wikitable:tag("tr") td = row:tag("td"):attr("colspan", 4):wikitext(totalData["statslist"]):css{ ["border-right-width"]="2px" } makeCellCollapsible(td) t[#t+1] = tostring(wikitable) if additionalEffects then t[#t+1] = additionalEffects.."

"	end	return table.concat(t); end

return p