<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.dragonminez.com/index.php?action=history&amp;feed=atom&amp;title=Module%3AForms</id>
	<title>Module:Forms - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.dragonminez.com/index.php?action=history&amp;feed=atom&amp;title=Module%3AForms"/>
	<link rel="alternate" type="text/html" href="https://wiki.dragonminez.com/index.php?title=Module:Forms&amp;action=history"/>
	<updated>2026-10-25T14:29:37Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.43.11</generator>
	<entry>
		<id>https://wiki.dragonminez.com/index.php?title=Module:Forms&amp;diff=13267&amp;oldid=prev</id>
		<title>Shokkoh: Sync from dragonminez-wiki repository</title>
		<link rel="alternate" type="text/html" href="https://wiki.dragonminez.com/index.php?title=Module:Forms&amp;diff=13267&amp;oldid=prev"/>
		<updated>2026-10-13T22:10:42Z</updated>

		<summary type="html">&lt;p&gt;Sync from dragonminez-wiki repository&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;local p = {}&lt;br /&gt;
&lt;br /&gt;
local data = mw.loadData( &amp;#039;Module:Forms/data&amp;#039; )&lt;br /&gt;
local LANGUAGES = { en = true, es = true, pt = true }&lt;br /&gt;
local EMPTY = { [ &amp;#039;&amp;#039; ] = true, [ &amp;#039;—&amp;#039; ] = true, [ &amp;#039;-&amp;#039; ] = true }&lt;br /&gt;
&lt;br /&gt;
local function pageLanguage( frame )&lt;br /&gt;
	local lang = frame:preprocess( &amp;#039;{{PAGELANGUAGE}}&amp;#039; )&lt;br /&gt;
	return LANGUAGES[ lang ] and lang or &amp;#039;en&amp;#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function label( name, lang )&lt;br /&gt;
	local row = mw.loadData( &amp;#039;Module:Labels/data&amp;#039; )[ name ]&lt;br /&gt;
	return row and ( row[ lang ] or row.en ) or name&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function arg( args, key )&lt;br /&gt;
	local value = mw.text.trim( args[ key ] or &amp;#039;&amp;#039; )&lt;br /&gt;
	if EMPTY[ value ] then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
	return value&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function fileExists( name )&lt;br /&gt;
	local title = mw.title.new( name, &amp;#039;File&amp;#039; )&lt;br /&gt;
	return title ~= nil and title.file ~= nil and title.file.exists&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function findGroup( race, key )&lt;br /&gt;
	for _, group in ipairs( data[ race ] or {} ) do&lt;br /&gt;
		if group.key == key then&lt;br /&gt;
			return group&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function findForm( race, groupKey, formKey )&lt;br /&gt;
	local index = 0&lt;br /&gt;
	for _, group in ipairs( data[ race ] or {} ) do&lt;br /&gt;
		for _, form in ipairs( group.forms ) do&lt;br /&gt;
			index = index + 1&lt;br /&gt;
			if group.key == groupKey and form.key == formKey then&lt;br /&gt;
				return form, index&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function number( value, lang )&lt;br /&gt;
	return mw.getLanguage( lang ):formatNum( value )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function multiplier( value )&lt;br /&gt;
	if value:match( &amp;#039;^[%d%.]+$&amp;#039; ) then&lt;br /&gt;
		return &amp;#039;×&amp;#039; .. value&lt;br /&gt;
	end&lt;br /&gt;
	if value:match( &amp;#039;^[%d%.]+%s*/%s*[%d%.]+%s*/%s*[%d%.]+$&amp;#039; ) then&lt;br /&gt;
		return ( value:gsub( &amp;#039;([%d%.]+)&amp;#039;, &amp;#039;×%1&amp;#039; ) )&lt;br /&gt;
	end&lt;br /&gt;
	return value&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function stat( name, value, lang )&lt;br /&gt;
	return string.format(&lt;br /&gt;
		&amp;#039;&amp;lt;span class=&amp;quot;dmz-formstat&amp;quot;&amp;gt;&amp;lt;span class=&amp;quot;dmz-formstat__label&amp;quot;&amp;gt;%s&amp;lt;/span&amp;gt; &amp;lt;span class=&amp;quot;dmz-formstat__value&amp;quot;&amp;gt;%s&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;&amp;#039;,&lt;br /&gt;
		label( name, lang ), value&lt;br /&gt;
	)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.group( frame )&lt;br /&gt;
	local args = frame:getParent().args&lt;br /&gt;
	local race = mw.text.trim( args[ 1 ] or &amp;#039;&amp;#039; )&lt;br /&gt;
	local group = findGroup( race, mw.text.trim( args[ 2 ] or &amp;#039;&amp;#039; ) )&lt;br /&gt;
	if not group then&lt;br /&gt;
		return &amp;#039;&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
	local lang = pageLanguage( frame )&lt;br /&gt;
	local classes = &amp;#039;dmz-formgroup mw-collapsible&amp;#039;&lt;br /&gt;
	if data[ race ][ 1 ].key ~= group.key then&lt;br /&gt;
		classes = classes .. &amp;#039; mw-collapsed&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
	local count = 0&lt;br /&gt;
	for _ in ipairs( group.forms ) do&lt;br /&gt;
		count = count + 1&lt;br /&gt;
	end&lt;br /&gt;
	local intro = arg( args, &amp;#039;text&amp;#039; )&lt;br /&gt;
	return string.format(&lt;br /&gt;
		&amp;#039;&amp;lt;div class=&amp;quot;%s&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;dmz-formgroup__title mw-collapsible-toggle&amp;quot; role=&amp;quot;button&amp;quot; data-count=&amp;quot;%d&amp;quot;&amp;gt;\n=== %s ===\n&amp;lt;/div&amp;gt;&amp;lt;div class=&amp;quot;mw-collapsible-content dmz-formgroup__body&amp;quot;&amp;gt;%s&amp;#039;,&lt;br /&gt;
		classes, count, group.name[ lang ] or group.name.en,&lt;br /&gt;
		intro and ( &amp;#039;&amp;lt;div class=&amp;quot;dmz-formgroup__intro&amp;quot;&amp;gt;\n&amp;#039; .. intro .. &amp;#039;\n&amp;lt;/div&amp;gt;&amp;#039; ) or &amp;#039;&amp;#039;&lt;br /&gt;
	)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.groupEnd()&lt;br /&gt;
	return &amp;#039;&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&amp;#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.entry( frame )&lt;br /&gt;
	local args = frame:getParent().args&lt;br /&gt;
	local race = mw.text.trim( args[ 1 ] or &amp;#039;&amp;#039; )&lt;br /&gt;
	local form, index = findForm( race, mw.text.trim( args[ 2 ] or &amp;#039;&amp;#039; ), mw.text.trim( args[ 3 ] or &amp;#039;&amp;#039; ) )&lt;br /&gt;
	if not form then&lt;br /&gt;
		return &amp;#039;&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
	local lang = pageLanguage( frame )&lt;br /&gt;
	local name = form.name[ lang ] or form.name.en&lt;br /&gt;
	local file = fileExists( form.file ) and form.file or &amp;#039;Placeholder.png&amp;#039;&lt;br /&gt;
&lt;br /&gt;
	local stats = {}&lt;br /&gt;
	local level = arg( args, &amp;#039;level&amp;#039; )&lt;br /&gt;
	if level then&lt;br /&gt;
		stats[ #stats + 1 ] = stat( &amp;#039;Level&amp;#039;, level, lang )&lt;br /&gt;
	end&lt;br /&gt;
	local cost = arg( args, &amp;#039;cost&amp;#039; )&lt;br /&gt;
	if cost then&lt;br /&gt;
		if cost:match( &amp;#039;^[%d,]+$&amp;#039; ) then&lt;br /&gt;
			cost = number( tonumber( ( cost:gsub( &amp;#039;,&amp;#039;, &amp;#039;&amp;#039; ) ) ), lang )&lt;br /&gt;
		end&lt;br /&gt;
		stats[ #stats + 1 ] = stat( &amp;#039;TP cost&amp;#039;, cost, lang )&lt;br /&gt;
	end&lt;br /&gt;
	local story = arg( args, &amp;#039;story&amp;#039; )&lt;br /&gt;
	if story then&lt;br /&gt;
		stats[ #stats + 1 ] = stat( &amp;#039;Story requisite&amp;#039;, story, lang )&lt;br /&gt;
	end&lt;br /&gt;
	local power = arg( args, &amp;#039;power&amp;#039; )&lt;br /&gt;
	if power then&lt;br /&gt;
		stats[ #stats + 1 ] = stat( &amp;#039;STR / SKP / PWR&amp;#039;, multiplier( power ), lang )&lt;br /&gt;
	end&lt;br /&gt;
	local def = arg( args, &amp;#039;def&amp;#039; )&lt;br /&gt;
	if def then&lt;br /&gt;
		stats[ #stats + 1 ] = stat( &amp;#039;DEF&amp;#039;, multiplier( def ), lang )&lt;br /&gt;
	end&lt;br /&gt;
	local drain = arg( args, &amp;#039;drain&amp;#039; )&lt;br /&gt;
	if drain then&lt;br /&gt;
		stats[ #stats + 1 ] = stat( &amp;#039;Ki drain&amp;#039;, drain, lang )&lt;br /&gt;
	else&lt;br /&gt;
		stats[ #stats + 1 ] = string.format( &amp;#039;&amp;lt;span class=&amp;quot;dmz-formstat dmz-formstat--note&amp;quot;&amp;gt;%s&amp;lt;/span&amp;gt;&amp;#039;, label( &amp;#039;No Ki upkeep&amp;#039;, lang ) )&lt;br /&gt;
	end&lt;br /&gt;
	for _, extra in ipairs( { { &amp;#039;speed&amp;#039;, &amp;#039;Movement speed&amp;#039; }, { &amp;#039;stamina&amp;#039;, &amp;#039;Stamina per attack&amp;#039; }, { &amp;#039;attack&amp;#039;, &amp;#039;Attack speed&amp;#039; }, { &amp;#039;size&amp;#039;, &amp;#039;Size&amp;#039; } } ) do&lt;br /&gt;
		if form[ extra[ 1 ] ] then&lt;br /&gt;
			stats[ #stats + 1 ] = stat( extra[ 2 ], &amp;#039;×&amp;#039; .. tostring( form[ extra[ 1 ] ] ), lang )&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local text = arg( args, &amp;#039;text&amp;#039; ) or &amp;#039;&amp;#039;&lt;br /&gt;
	return string.format(&lt;br /&gt;
		&amp;#039;&amp;lt;div class=&amp;quot;dmz-form dmz-form--%s&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;dmz-form__media&amp;quot;&amp;gt;[[File:%s|x280px|link=|alt=%s]]&amp;lt;/div&amp;gt;&amp;lt;div class=&amp;quot;dmz-form__body&amp;quot;&amp;gt;\n==== %s ====\n&amp;lt;div class=&amp;quot;dmz-form__stats&amp;quot;&amp;gt;%s&amp;lt;/div&amp;gt;\n%s\n&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&amp;#039;,&lt;br /&gt;
		index % 2 == 1 and &amp;#039;left&amp;#039; or &amp;#039;right&amp;#039;, file, name, name, table.concat( stats ), text&lt;br /&gt;
	)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Shokkoh</name></author>
	</entry>
</feed>