Mobius Final Fantasy Wiki
Register
Advertisement

Documentation for this module may be created at Module:Weapon/doc

local getArgs = require("Module:Arguments").getArgs
local title = mw.title.getCurrentTitle()
local lang = mw.getContentLanguage()
local p = {}

-- TODO: Load auto-abilities data.
local data = {
	["ability chain"] = {"green", "Ability Chain+%d%%", "Using abilities in succession raises damage by %d%%."},
	["ability salvo"] = {"blue", "Ability Salvo+%d%%", "The more times you use abilities in a row, the greater the attack power, Magic, and Break power of your next attack."},
	["armor break"] = {"blue", "Armor Break+%d%%", "Ability to turn Break gauge red increased by %d%%."},
	["attack up"] = {"yellow", "Attack Up+%d%%", "Increases Attack by %d%%."},
	["attuned chain"] = {"green", "Attuned Chain+%d%%", "Using abilities of the same element in succession raises damage by %d%%."},
	["auto-charge ultimate"] = {"blue", "Auto-Charge Ultimate+%d", "Charges the Ultimate gauge by %d every turn."},
	["boost ultimate"] = {"blue", "Boost Ultimate+%d", "Increases Ultimate level by %d."},
	["break power up"] = {"yellow", "Break Power Up+%d%%", "Increases Break Power by %d%%"},
	["cross-counter"] = {"blue", "Cross-Counter(Up to %d%%)", "Increases damage and Break power the more enemies have previously acted immediately before your action."},
	["crystal seeker"] = {"blue", "Crystal Seeker+%d", "Increases the drop rate of crystals from battle"},
	["dark draw"] = {"blue", "Dark Draw+%d", "Increases chance of drawing dark orbs."},
	["earth draw"] = {"blue", "Earth Draw+%d", "Increases chance of drawing earth orbs."},
	["element generator"] = {"blue", "Element Generator+%d", "Start turn with %d orbs drawn."},
	["elemental third strike"] = {"blue", "Elemental Third Strike+%d", "Increases number of orbs drawn by the third normal attack by %d."},
	["enhance light"] = {"green", "Enhance Light+%d%%", "Enhances light abilities by %d%%."},
	["enhance water"] = {"green", "Enhance Water+%d%%", "Enhances water abilities by %d%%."},
	["enhanced heal drive"] = {"blue", "Enhanced Heal Drive+%d%%", "Element Drives using life orbs restore %d%% more HP."},
	["exp up"] = {"blue", "EXP Up+%d%%", "Increases EXP gained after battle by %d%%."},
	["exploit weakness"] = {"green", "Exploit Weakness+%d%%", "Increases damage by %d%% when using weakness element."},
	["extended break"] = {"blue", "Extended Break+%d", "Increases number of actions during Break by %d."},
	["fire draw"] = {"blue", "Fire Draw+%d", "Increases chance of drawing fire orbs."},
	["flash break"] = {"blue", "Flash Break+%d%%", "Break power increased by %d%% against enemies with full Break gauges."},
	["gil up"] = {"blue", "Gil Up+%d%%", "Increases Gil gained after battle by %d%%."},
	["healing victory"] = {"blue", "Healing Victory+%d%%", "Restores %d%% HP after winning a battle."},
	["hp up"] = {"yellow", "HP Up+%d%%", "Increases HP by %d%%."},
	["improved criticals"] = {"green", "Improved Criticals+%d%%", "Increases critical strike damage by %d%%."},
	["improved extra skill unlock"] = {"blue", "Improved Extra Skill Unlock+%d", "Slightly improves the chance to unlock extra skills."},
	["job change recast"] = {"blue", "Job Change Recast", "Lowers your Job Change recast by a turn."},
	["kill & draw"] = {"blue", "Kill & Draw+%d", "Defeating an enemy draws %d element orb(s)."},
	["life draw"] = {"blue", "Life Draw+%d", "Increases chance of drawing life orbs."},
	["light draw"] = {"blue", "Light Draw+%d", "Increases chance of drawing light orbs."},
	["medic"] = {"blue", "Medic+%d%%", "Regenerates %d%% of HP with every action."},
	["overpower"] = {"yellow", "Overpower(Up to %d%%)", "Attack, Magic and Break power increased up to %d%% based on your job level."},
	["painful break"] = {"green", "Painful Break+%d%%", "Increases damage dealt during Break by %d%%."},
	["piercing break"] = {"yellow", "Piercing Break+%d%%", "Increases damage to red Break Gauges by %d%%."},
	["prismatic draw"] = {"blue", "Prismatic Draw+%d%%", "Normal attacks have a %d%% chance to draw prismatic orbs."},
	["prismatic element generator"] = {"blue", "Prismatic Element Generator+%d", "Start turn with %d prismatic orb drawn."},
	["prismatic element starter"] = {"blue", "Prismatic Element Starter+%d", "Start battle with %d prismatic orbs drawn."},
	["prismatic return"] = {"blue", "Prismatic Return+%d%%", "Has a %d%% chance to restore spent orbs as prismatic orbs."},
	["ravage"] = {"blue", "Ravage+%d%%", "Increases damage of cone and area attacks by %d%%."},
	["reunion"] = {"blue", "Reunion+%d%%", "Restores a used orb as a prismatic orb %d%% of the time."},
	["skillseed up"] = {"blue", "Skillseed Up+%d%%", "Increases skillseeds gained after battle by %d%%."},
	["skilled duelist"] = {"blue", "Skilled Duelist+%d%%", "Increases all attributes (HP, Attack, Magic, Break Power) by %d%% when facing an enemy one-on-one."},
	["steelguard"] = {"blue", "Steelguard+%d%%", "Increases Defense by %d%% until end of turn every time you receive damage."},
	["ultimate charger"] = {"blue", "Ultimate Charger+%d", "Normal attacks increase the Ultimate ability gauge."},
	["ultimate charge: abilities"] = {"blue", "Ultimate Charge: Abilities+%d", "Increases the amount of Ultimate gauge charged when using abilities."},
	["water draw"] = {"blue", "Water Draw+%d", "Increases chance of drawing water orbs."},
	["wind draw"] = {"blue", "Wind Draw+%d", "Increases chance of drawing wind orbs."},
}

function p.parse_auto(text)
	text = mw.text.trim(text)
	local abi, val = string.match(text, '^%s*(.-)%s*%+%s*(%d+)%%?%s*$')
	if not abi then
		abi = text
	end
	val = tonumber(val) or 0
	local key = lang:lc(abi)
	local entry = data[key]
	if not entry then
		return nil
	end
	local color, namefmt, infofmt = unpack(entry)
	namefmt = mw.text.split(namefmt, '+')
	if #namefmt==1 then
		namefmt = mw.text.split(namefmt[1], '%(')
		namefmt[1] = '[['..namefmt[1]..']]'
		namefmt = table.concat(namefmt, '(')
	else
		namefmt[1] = '[['..namefmt[1]..']]'
		namefmt = table.concat(namefmt, '+')
	end
	local name = string.format(namefmt, val)
	local info = string.format(infofmt, val)
	-- (Element) Draw has a threshold for the text.
	if (abi == "Fire Draw" or
		abi == "Water Draw" or
		abi == "Wind Draw" or
		abi == "Earth Draw" or
		abi == "Light Draw" or
		abi == "Dark Draw" or
		abi == "Life Draw") then
		if val <= 0 then
			info = ""
		elseif val <= 10 then
			info = "Slightly " .. lang:lcfirst(info)
		elseif val <= 60 then
			info = "Moderately " .. lang:lcfirst(info)
		else
			info = lang:ucfirst(info)
		end
	end
	color = lang:lc(color or "")
	return color, name, info
end
local function jobtype_icon(jobtype, size)
	jobtype = lang:lc(jobtype)
	size = size or 20
	local filename
	if (jobtype == 'warrior' or
		jobtype == 'mage' or
		jobtype == 'ranger' or 
		jobtype == 'monk' or 
		jobtype == 'meia' or
		jobtype == 'sarah' or 
		jobtype == 'sophie' or 
		jobtype == 'graff') then
		filename = jobtype .. ' Icon.png'
	end
	if filename then
		return '[[File:'..filename..'|link=|'..size..'px]]'
	else
		return ''
	end
end
local function formatabi(abi)
	local color, name, info = p.parse_auto(abi)
	if color == nil or color == "" then
		return nil
	end
	local icon = '[[File:Icon Auto-Abilities ' .. lang:ucfirst(color) .. '.png|18px|link=]]'
	local node = mw.html.create()
		:tag('dt')
			:wikitext(icon)
			:wikitext(name)
			:done()
		:tag('dd')
			:wikitext(info)
			:done()
	return node
end
function p.infobox(frame)
	local args = getArgs(frame, {
		wrappers = "Template:Infobox weapon"
	})
	return p._infobox(args)
end
function p._infobox(args)
	local name = args.name or title.text
	local icon = args.icon or (name .. '_(weapon_icon).png')
	if not mw.title.makeTitle('file', icon).exists then
		icon = 'Icon question.png'
	end
	local info = args.description or args.info or ''
	local jobtype = lang:lc(args.jobtype or args['type'] or '')
	local abilityname = string.gsub(args.abilityname or '', '<br/?>', '/')
	abilityname = mw.text.split(abilityname, '[/,;]+')

	local abi1 = args.ability1 or abilityname[1] or ''
	local abi2 = args.ability2 or abilityname[2] or ''
	local abi3 = args.ability3 or abilityname[3] or ''
	local abi4 = args.ability4 or abilityname[4] or ''
	
	-- Storage
	if title.namespace == 0 or args.demospace == 'main' then
		local frame = mw.getCurrentFrame()
		frame:callParserFunction('#cargo_store:', {
			_table = "weapons",
			name = name,
			thumbnail = icon,
			job_type = lang:ucfirst(jobtype),
			description = info,
		})
	end
	
	-- Display
	local div = mw.html.create('div')
	div :addClass('infobox weapon')
		:css('width', '320px')
		:css('float', 'right')
		:css('margin', '0 5px 5px')
		:css('font-family', 'Tahoma, sans-serif')
		:css('color', 'white')
		:newline()
	local tbl = div:tag('table')
	tbl	:css('background-color', '#2fa3bc')
		:css('box-shadow', '0 1px 3px rgba(0, 0, 0, 0.12), 0 1px 2px rgba(0, 0, 0, 0.24)')
		:css('border-radius', '4px')
		:css('width', '100%')
		:newline()
	tbl
		:tag('tr')
			:tag('td')
				:css('padding', '5px')
				:css('width','64px')
				:css('border','0')
				:css('vertical-align','top')
				:wikitext('[[File:'..icon..'|64px]]')
				:done()
			:tag('td')
				:css('padding', '5px 5px 5px 0')
				:css('border','0')
				:css('vertical-align','top')
				:tag('div')
					:css('font-size','1.3em'):css('border-bottom','1px solid white')
					:wikitext(jobtype_icon(jobtype))
					:wikitext(name)
					:done()
				:tag('div')
					:wikitext(info)
					:done()
				:done()
			:done()
			:newline()
	local abi_div = tbl
		:tag('tr')
			:tag('td')
				:attr('colspan', 2)
				:css('padding','5px')
				:css('border','0')
				:newline()
		:tag('div')
			:css('font-size','95%')
			:css('border-bottom','1px solid white')
			:wikitext('Auto-Abilities')
			:done()
	local a1 = formatabi(abi1)
	local a2 = formatabi(abi2)
	local a3 = formatabi(abi3)
	local a4 = formatabi(abi4)
	
	if a1 or a2 or a3 or a4 then
		local abi_list = abi_div
			:tag('dl')
			:newline()
		if a1 then
			abi_list:node(a1)
		end
		if a2 then
			abi_list:node(a2)
		end
		if a3 then
			abi_list:node(a3)
		end
		if a4 then
			abi_list:node(a4)
		end
	end
	-- Categories
	if title.namespace == 0 or args.demospace == 'main' then
		div:wikitext('[[Category:Weapons]]')
		if (jobtype == 'warrior' or
			jobtype == 'mage' or
			jobtype == 'ranger' or
			jobtype == 'monk' or
			jobtype == 'meia' or
			jobtype == 'sarah' or 
			jobtype == 'sophie' or 
			jobtype == 'graff') then
			div:wikitext('[[Category:'..lang:ucfirst(jobtype)..' Weapons]]')
		end
		if ((abi1 ~="" and not a1) or
			(abi2 ~= "" and not a2) or
			(abi3 ~= "" and not a3) or
			(abi4 ~= "" and not a4)) then
			div:wikitext('[[Category:Weapons with unknown auto-abilities]]')
		end
	end
	return tostring(div)
end

function p.test()
	return p._infobox{
		name = "Femme Fatale",
		jobtype = "Meia",
		description = "If you must dance to fate's fickle drum, dance well.",
		ability1 = "HP Up+10%",
		ability2 = "Elemental Third Strike+2",
		ability3 = "Prismatic Draw+15%",
	}
end
return p
Advertisement