Mobius Final Fantasy Wiki
(For the jobtype of cards with Meia Synchro, display File:Meia Icon.png and "Mage" text.)
m (+lang)
Line 7: Line 7:
 
COLS = "2"
 
COLS = "2"
 
skills = {}
 
skills = {}
  +
local lang = mw.getContentLanguage()
   
 
function p.main( frame )
 
function p.main( frame )

Revision as of 00:34, 29 October 2017


local  p = {}

util = require( 'Module:Utils' )
box = require( 'Module:Infobox' )
style = require( 'Module:Infobox/CSS' )
auto = require( 'Module:AutoAbilities' )
COLS = "2"
skills = {}
local lang = mw.getContentLanguage()

function p.main( frame )
	t = p.parseArgs( frame.args )
	boxes = {}
	-- Remove margin of the table
	style['table'].margin = "0"

	for i, v in ipairs(t) do
		html = {}
		-- Set box colors
		p.color( v.element:lower() )
		html = {
			[1] = {
				['bbottom'] = false,
				{ p.image( v.image ), attr = { colspan = COLS } }
			},
			[2] = {
				{ "Job Type", css = style.th },
				{ p.formatJobtype(v['type']), css = style.td }
			},
			[3] = {
				{ "Element", css = style.th },
				{ p.element( v.element ), css = style.td }
			},
			[4] = {
				{ "Skillseeds", css = style.th },
				{ p.formatSeed( v.seeds ), css = style.td }
			},
			[5] = {
				['type'] = "section",
				{ "Ability", css = style.section, attr = {colspan='2'} }
			},
			[6] = {
				{ "Name", css = style.th },
				{ p.abilityLink( v.ability ), css = style.td }
			},
			[7] = {
				['type'] = "group", n = 3, ['bbottom'] = true,
				{ "<div style='font-size:15px;'>'''Orbs'''</div>" .. p.orbs( v.orbs ) },
				{ "<div style='font-size:15px;'>'''Range'''</div>" .. v.range },
				{ "<div style='font-size:15px;'>'''Max Lv.'''</div>" .. v.maxlv },
			},
			[8] = {
				['type'] = "group", n = 3,
				{ "<div style='font-size:15px;'>'''Attack'''</div>" .. v.attack },
				{ "<div style='font-size:15px;'>'''Break Power'''</div>" .. v.breakpower },
				{ "<div style='font-size:15px;'>'''Crit Chance'''</div>" .. v.crit },
			}
		}

		if ( (v.extraskills ~= "" and v.extraskills ~= nil) or next(skills) ~= nil ) then
			html[#html+1] = {
				['type'] = "section",
				{ "Extra Skills", css = style.section, attr = { colspan = COLS } }
			}
			html[#html+1] = {
				{ p.extraSkills( v.extraskills ), attr = { colspan = COLS } }
			}
		end
		if ( v.auto ~= "" and v.auto ~= nil ) then
			html[#html+1] = {
				['type'] = "section",
				{ "Auto-Abilities", css = style.section, attr = { colspan = COLS } }
			}
			html[#html+1] = {
				{ p.autoAbilities( v.auto ), attr = { colspan = COLS } }
			}
		end
		if( v.augment ~= "" and v.augment ~= nil ) then
			-- TODO: Utilize the plus (+) symbolizing Fast Learner cards.
			local star, plus = string.match(v.star, '(-?%d+)(%+?)')
			star = tonumber( star ) + 1
			html[#html+1] = {
				['type'] = "section",
				{ "Augment to " .. util.stars( star ), css = style.section, attr = { colspan = COLS } }
			}
			html[#html+1] = {
				{ p.augment( v.augment ), attr = { colspan = COLS } }
			}
		end

		boxes[i] = box.build ( util.sortTable(html), style, COLS )
	end

	local tabs = mw.html.create( 'div' )
	tabs	:css( 'margin', "10px 10px 20px 20px" )
			:attr( 'class', 'cardtabs' )
			:wikitext( p.tabber( frame ) )
	return tostring( tabs )
end

function p.tabber( frame )
	local param = ""
	for i, box in ipairs( boxes ) do
		param = param .. t[i].star .. "=" .. box
		if i == #boxes then break end
		param = param .. "|-|"
	end
	return frame:extensionTag( 'tabber', param )
end

--[[ frame.args are named parameters with several values separated
by a // separator. This function creates tables of key, values.
Example : star = "1 // 2 // 3"; job = "Mage"; attack = "10 // 20 // 30"
gives {
		{ star = 1, job = "Mage", attack = "10" }
		{ star = 2, job = "Mage", attack = "20" }
		{ star = 3, job = "Mage", attack = "30" }
	}
]]
function p.parseArgs( args )
	local t = {}
	local n = 1
	for k, v in pairs( args ) do
		params = util.explode( '//', v )
		if #params > n then n = #params end
		for i=1, #params do
			if not t[i] then t[i] = {} end
			t[i][k] = mw.text.trim( params[i] )
		end
	end
	--[[ if a value is lacking, get the previous one
	except for image, extraskills, upgrade mats ]]
	for k, v in pairs( args ) do
		if ( k ~= 'extraskills' and k ~= 'image' and k ~= 'augment' ) then
			for i=1, n do
				if not t[i][k] then t[i][k] = t[i-1][k] end
			end
		end
	end
	return t
end

-- Change box colors based on the element 
function p.color( element )
	if element == "fire" then
		style.th['background-color'] = "#f44336"
		style.section['background-color'] = "#b71c1c"
		style.color.color = "#f44336"
	elseif element == "water" then
		style.th['background-color'] = "#448aff"
		style.section['background-color'] = "#0d47a1"
		style.color.color = "#2196f3"
	elseif element == "earth" then
		style.th['background-color'] = "#795548"
		style.section['background-color'] = "#3e2723"
		style.color.color = "#795548"
	elseif element == "wind" then
		style.th['background-color'] = "#8bc34a"
		style.th.color = "#212121"
		style.section['background-color'] = "#33691e"
		style.color.color = "#8bc34a"
	elseif element == "dark" then
		style.th['background-color'] = "#673ab7"
		style.section['background-color'] = "#311b92"
		style.color.color = "#673ab7"
	elseif element == "light" then
		style.th['background-color'] = "#ffff8d"
		style.th.color = "#212121"
		style.section['background-color'] = "#f57f17"
		style.color.color = "#ffc107"
	elseif element == "life" then
		style.th['background-color'] = "#f48fb1"
		style.th.color = "#212121"
		style.section['background-color'] = "#d81b60"
		style.color.color = "#f06292"
	elseif element == "prismatic" then
		style.th['background-color'] = "#cddc39"
		style.section['background-color'] = "#0d47a1"
	end
end

-- Format image, displays title if no image
function p.image( img )
	if ( img ~= nil and img ~= "" ) then
		return "[[File:" .. img .. "|350px]]"
	else
		local div = mw.html.create( 'div' )
		div	:wikitext( util.cleanTitle( mw.title.getCurrentTitle().text ) )
			:css( { ['font-size'] = "20px", ['background-color'] = "#212121", 
			color = "white", ['text-align'] = "center" } )
			:css( style.td )
		return tostring( div )
	end
end

-- Format skillseeds display
function p.formatSeed( data )
	if not data then data = "" end
	local t = util.explode( ',', data )
	local elmnt = {}
	for k, v in pairs(t) do
		elmnt[k] = util.explode( 'x', mw.text.trim(v) )
	end
	local seeds = ''
	for k, v in pairs(elmnt) do
		seeds = seeds .. p.seed( mw.text.trim( v[1] ) ) .." x " .. mw.text.trim( v[2] ) .. "  "
	end
	return seeds
end

function p.formatJobtype( jobtype )
	local t = lang:lc( jobtype )
	local icon, name
	if t == 'warrior' then
		icon = 'File:Warrior_Icon.png'
		name = 'Warrior'
	elseif t == 'mage' then
		icon = 'File:Mage_Icon.png'
		name = 'Mage'
	elseif t == 'ranger' then
		icon = 'File:Ranger_Icon.png'
		name = 'Ranger'
	elseif t == 'monk' then
		icon = 'File:Monk_Icon.png'
		name = 'Monk'
	elseif t == 'support' or t == 'healer' then
		icon = 'File:All_Icon.png'
		name = 'Support'
	elseif t == 'material' then
		icon = 'File:Material_Icon.png'
		name = 'Material'
	elseif t == 'meia' then
		icon = 'File:Meia_Icon.png'
		name = 'Mage'
	else
		return jobtype
	end
	return '[[' .. icon .. '|link=|x20px]]&nbsp;' .. name
end

function p.seed(elmt)
	return "[[File:Seed_" .. elmt .. ".png|link=|x20px]]"
end

-- Format orbs
function p.orbs( orb )
	local data = util.explode( 'x', orb )
	return "{{Orb|" .. data[1] .. "}} x" .. mw.text.trim( data[2] )
end

-- Format element
function p.element( element )
	local elmt = "{{Orb|" .. element .. "}} "
	elmt = elmt .. util.colorText( util.startMaj( element ), element )
	return elmt
end

-- Add element color to ability name
function p.abilityLink( name )
	local span = mw.html.create( 'span' )
	span:css( style.color ):wikitext( name )
	return "[[" .. name .. "|" .. tostring(span) .. "]]"
end

-- Format extra skills display
function p.extraSkills( data )
	local es = mw.html.create( 'div' )
	es:css( style.td )
	if ( data ~= nil and data ~= "" ) then
		for i, v in ipairs( util.explode( ';', data ) ) do
			table.insert( skills, v )
		end
	end
	for i, v in ipairs( skills ) do
		local skill = util.explode( ' ', mw.text.trim(v), 2 )
		local span = mw.html.create( 'span' )
		span:css( { position = "absolute", right = "0", ["padding-left"] = "15px" } )
		span:wikitext( "A.Lv. " .. skill[1] )
		local div = mw.html.create( 'div' )
		local text = skill[2]
		if text:sub( 1, 1 ) == "*" then
			text = text:sub( 2 )
			skills[i] = ""
		end
		div:css( "position", "relative" ):wikitext( "{{link|" .. text .. "}}" ):node( span )
		es:node (div )
	end
	-- Clean skills table by removing empty string
	local n, skillsNew = 1, {}
	for i, v in ipairs( skills ) do
		if v ~= "" then
			skillsNew[n] = v
			n = n + 1
		end
	end
	skills = skillsNew
	return tostring(es)
end

-- Format auto abilities
function p.autoAbilities( data )
	local data = data or ""
	local div = mw.html.create( 'div' )
	local text = ""
	local abilities = util.explode( ',', data )
	for i, v in ipairs( abilities ) do
		text = text .. "<div>" .. auto.formatString( v ) .. "</div>"
	end
	div:css( style.td ):wikitext( text )
	return tostring( div )
end

-- Format upgrade mats
function p.augment( data )
	local data = data or ""
	local div = mw.html.create( 'div' )
	local text = ""
	local mats = util.explode( ',', data )
	for i, v in ipairs( mats ) do
		local mat = util.explode( 'x', v )
		local title = "{{MaterialLink|" .. util.cleanTitle( util.trim(mat[1]) ) .. "}}"
		if mat[2] then
			text = text .. "<div>" .. title .. " x" .. mat[2] .. "</div>"
		else
			text = text .. "<div>" .. title .. "</div>"
		end
	end
	div:css( style.td ):wikitext( text )
	return tostring( div )
end

return p