<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://nwrx.wiki.longjump.dev/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=LongJump+bot</id>
	<title>The Ninja Warriors Again RX Wiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://nwrx.wiki.longjump.dev/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=LongJump+bot"/>
	<link rel="alternate" type="text/html" href="https://nwrx.wiki.longjump.dev/wiki/Special:Contributions/LongJump_bot"/>
	<updated>2026-11-04T00:34:06Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.43.11</generator>
	<entry>
		<id>https://nwrx.wiki.longjump.dev/index.php?title=Module:GameData&amp;diff=658</id>
		<title>Module:GameData</title>
		<link rel="alternate" type="text/html" href="https://nwrx.wiki.longjump.dev/index.php?title=Module:GameData&amp;diff=658"/>
		<updated>2026-11-04T00:29:27Z</updated>

		<summary type="html">&lt;p&gt;LongJump bot: Game data from 645555d&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;-- Renders LongJump game data stored in Cargo: infoboxes, stat lines, lists of&lt;br /&gt;
-- related objects, and the record table shown on Data: pages. Which fields each&lt;br /&gt;
-- type has, and how they display, comes from Module:GameData/schema, which the&lt;br /&gt;
-- generator writes from the game&#039;s types file.&lt;br /&gt;
&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
local schema = mw.loadData( &#039;Module:GameData/schema&#039; )&lt;br /&gt;
&lt;br /&gt;
-- The game&#039;s keyword colors, loaded on first use.&lt;br /&gt;
local keywordIndex&lt;br /&gt;
&lt;br /&gt;
local function isWordChar( c )&lt;br /&gt;
	return c ~= &#039;&#039; and c:match( &#039;[%w_]&#039; ) ~= nil&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Colors keywords the way the game does (TextService.ColorizeText): one pass, longest&lt;br /&gt;
-- keyword first, whole words only where the keyword starts or ends with a word&lt;br /&gt;
-- character, written with the keyword&#039;s own capitalisation.&lt;br /&gt;
local function colorize( text )&lt;br /&gt;
	if not keywordIndex then&lt;br /&gt;
		keywordIndex = {}&lt;br /&gt;
		for _, entry in ipairs( mw.loadData( &#039;Module:GameData/keywords&#039; ) ) do&lt;br /&gt;
			local first = entry[1]:sub( 1, 1 )&lt;br /&gt;
			keywordIndex[first] = keywordIndex[first] or {}&lt;br /&gt;
			table.insert( keywordIndex[first], entry )&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	-- Byte-wise lower case keeps positions aligned with the original text.&lt;br /&gt;
	local lower = text:lower()&lt;br /&gt;
	local out, i = {}, 1&lt;br /&gt;
	while i &amp;lt;= #text do&lt;br /&gt;
		local matched&lt;br /&gt;
		for _, entry in ipairs( keywordIndex[lower:sub( i, i )] or {} ) do&lt;br /&gt;
			local key = entry[1]&lt;br /&gt;
			if lower:sub( i, i + #key - 1 ) == key&lt;br /&gt;
				and not ( isWordChar( key:sub( 1, 1 ) ) and isWordChar( text:sub( i - 1, i - 1 ) ) )&lt;br /&gt;
				and not ( isWordChar( key:sub( -1 ) ) and isWordChar( text:sub( i + #key, i + #key ) ) ) then&lt;br /&gt;
				matched = entry&lt;br /&gt;
				break&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		if matched then&lt;br /&gt;
			out[#out + 1] = &#039;&amp;lt;span class=&amp;quot;kw&amp;quot; style=&amp;quot;--kw:#&#039; .. matched[3] .. &#039;&amp;quot;&amp;gt;&#039; .. matched[2] .. &#039;&amp;lt;/span&amp;gt;&#039;&lt;br /&gt;
			i = i + #matched[1]&lt;br /&gt;
		else&lt;br /&gt;
			out[#out + 1] = text:sub( i, i )&lt;br /&gt;
			i = i + 1&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return table.concat( out )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- A name as text. Page names can hold wiki markup: two apostrophes in a row&lt;br /&gt;
-- (&amp;quot;Kunoichi&#039;&#039;&amp;quot;) would start italics, so they are written as character references.&lt;br /&gt;
-- Names without them come back unchanged.&lt;br /&gt;
local function nameText( name )&lt;br /&gt;
	return ( tostring( name ):gsub( &amp;quot;&#039;&#039;&amp;quot;, &#039;&amp;amp;#39;&amp;amp;#39;&#039; ) )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- A name inside an infobox tag. PortableInfobox decodes character references before&lt;br /&gt;
-- parsing its content, so the apostrophes are kept in nowiki instead.&lt;br /&gt;
local function infoboxText( name )&lt;br /&gt;
	return ( tostring( name ):gsub( &amp;quot;&#039;&#039;&amp;quot;, &amp;quot;&amp;lt;nowiki&amp;gt;&#039;&#039;&amp;lt;/nowiki&amp;gt;&amp;quot; ) )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- The in-game name of each page whose title differs from it (&amp;quot;Arrowstorm (skill)&amp;quot; is&lt;br /&gt;
-- named &amp;quot;Arrowstorm&amp;quot;), written by the generator. Links show the name, not the title.&lt;br /&gt;
local namesLoaded, names = pcall( mw.loadData, &#039;Module:GameData/names&#039; )&lt;br /&gt;
if not namesLoaded then&lt;br /&gt;
	names = {}&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- A link to a page, labelled with its in-game name shown literally.&lt;br /&gt;
local function pageLink( title )&lt;br /&gt;
	local label = names[title] or title&lt;br /&gt;
	if label ~= title or tostring( label ):find( &amp;quot;&#039;&#039;&amp;quot;, 1, true ) then&lt;br /&gt;
		return &#039;[[&#039; .. title .. &#039;|&#039; .. nameText( label ) .. &#039;]]&#039;&lt;br /&gt;
	end&lt;br /&gt;
	return &#039;[[&#039; .. title .. &#039;]]&#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function quote( value )&lt;br /&gt;
	return &amp;quot;&#039;&amp;quot; .. ( tostring( value ):gsub( &amp;quot;&#039;&amp;quot;, &amp;quot;&#039;&#039;&amp;quot; ) ) .. &amp;quot;&#039;&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function trim( s )&lt;br /&gt;
	return ( s:gsub( &#039;^%s+&#039;, &#039;&#039; ):gsub( &#039;%s+$&#039;, &#039;&#039; ) )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function split( value )&lt;br /&gt;
	local items = {}&lt;br /&gt;
	for item in tostring( value ):gmatch( &#039;[^,]+&#039; ) do&lt;br /&gt;
		item = trim( item )&lt;br /&gt;
		if item ~= &#039;&#039; then&lt;br /&gt;
			items[#items + 1] = item&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return items&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function fieldNames( t )&lt;br /&gt;
	local names = {}&lt;br /&gt;
	for _, f in ipairs( t.fields ) do&lt;br /&gt;
		names[#names + 1] = f.name&lt;br /&gt;
	end&lt;br /&gt;
	return table.concat( names, &#039;,&#039; )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function currentPage( frame )&lt;br /&gt;
	local page = frame.args.page&lt;br /&gt;
	if page and page ~= &#039;&#039; then&lt;br /&gt;
		return page&lt;br /&gt;
	end&lt;br /&gt;
	return mw.title.getCurrentTitle().text&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Formats one stored value for display, or returns nil when there is nothing to show.&lt;br /&gt;
local function formatValue( f, value, row )&lt;br /&gt;
	if value == nil or value == &#039;&#039; then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
	if f.type == &#039;Boolean&#039; then&lt;br /&gt;
		-- Yes/no fields only show when true.&lt;br /&gt;
		return ( value == &#039;1&#039; or value == 1 or value == true ) and &#039;Yes&#039; or nil&lt;br /&gt;
	end&lt;br /&gt;
	-- Wording with a slot for the value (&amp;quot;+{0}% to All Resistances&amp;quot;) shows &amp;quot;#&amp;quot; there.&lt;br /&gt;
	value = ( tostring( value ):gsub( &#039;{0}&#039;, &#039;#&#039; ) )&lt;br /&gt;
	local items = f.list and split( value ) or { tostring( value ) }&lt;br /&gt;
	local levels = f.levels and row and row[f.levels] and split( row[f.levels] ) or {}&lt;br /&gt;
	for i, item in ipairs( items ) do&lt;br /&gt;
		-- References to things that have no page in the wiki stay plain text.&lt;br /&gt;
		if f.link and mw.title.new( item ) and mw.title.new( item ).exists then&lt;br /&gt;
			item = pageLink( item )&lt;br /&gt;
		end&lt;br /&gt;
		if levels[i] then&lt;br /&gt;
			item = item .. &#039; (level &#039; .. levels[i] .. &#039;)&#039;&lt;br /&gt;
		end&lt;br /&gt;
		items[i] = item .. ( f.suffix or &#039;&#039; )&lt;br /&gt;
	end&lt;br /&gt;
	return table.concat( items, &#039;, &#039; )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Every query passes orderBy: Cargo 3.7&#039;s default order names list fields with the&lt;br /&gt;
-- full table name while the query uses a short alias, which MariaDB rejects.&lt;br /&gt;
local function fetchRow( t, page )&lt;br /&gt;
	local rows = mw.ext.cargo.query( t.table, fieldNames( t ), {&lt;br /&gt;
		where = &#039;wiki_page=&#039; .. quote( page ),&lt;br /&gt;
		orderBy = &#039;wiki_page&#039;,&lt;br /&gt;
		limit = 1,&lt;br /&gt;
	} )&lt;br /&gt;
	return rows[1]&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Reads the object&#039;s Data: page so MediaWiki records it as embedded in the current&lt;br /&gt;
-- page: when the export rewrites the Data: page, MediaWiki re-renders this page.&lt;br /&gt;
-- (Cargo records that dependency only for #cargo_query, not for Lua queries.)&lt;br /&gt;
local function dependOnData( t, page )&lt;br /&gt;
	local title = mw.title.new( &#039;Data:&#039; .. t.label .. &#039;/&#039; .. page )&lt;br /&gt;
	if title then&lt;br /&gt;
		title:getContent()&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- {{#invoke:GameData|infobox|type=Skill}} on an article.&lt;br /&gt;
function p.infobox( frame )&lt;br /&gt;
	local t = schema.types[frame.args.type]&lt;br /&gt;
	if not t then&lt;br /&gt;
		return &#039;&#039;&lt;br /&gt;
	end&lt;br /&gt;
	local page = currentPage( frame )&lt;br /&gt;
	dependOnData( t, page )&lt;br /&gt;
	local row = fetchRow( t, page )&lt;br /&gt;
	if not row then&lt;br /&gt;
		return &#039;&#039;&lt;br /&gt;
	end&lt;br /&gt;
	local out = { &#039;&amp;lt;infobox&amp;gt;&#039;, &#039;&amp;lt;title&amp;gt;&amp;lt;default&amp;gt;&#039; .. infoboxText( row.name or page ) .. &#039;&amp;lt;/default&amp;gt;&amp;lt;/title&amp;gt;&#039; }&lt;br /&gt;
	if row.icon and row.icon ~= &#039;&#039; then&lt;br /&gt;
		out[#out + 1] = &#039;&amp;lt;image&amp;gt;&amp;lt;default&amp;gt;&#039; .. row.icon .. &#039;&amp;lt;/default&amp;gt;&amp;lt;/image&amp;gt;&#039;&lt;br /&gt;
	end&lt;br /&gt;
	for _, f in ipairs( t.fields ) do&lt;br /&gt;
		if f.label then&lt;br /&gt;
			local value = formatValue( f, row[f.name], row )&lt;br /&gt;
			-- Plain words start with a capital, as the game shows them (&amp;quot;Monster&amp;quot;).&lt;br /&gt;
			if value and f.type == &#039;String&#039; and not f.link and not f.list then&lt;br /&gt;
				value = mw.ustring.upper( mw.ustring.sub( value, 1, 1 ) ) .. mw.ustring.sub( value, 2 )&lt;br /&gt;
			end&lt;br /&gt;
			if value then&lt;br /&gt;
				out[#out + 1] = &#039;&amp;lt;data&amp;gt;&amp;lt;label&amp;gt;&#039; .. f.label .. &#039;&amp;lt;/label&amp;gt;&amp;lt;default&amp;gt;&#039; .. value .. &#039;&amp;lt;/default&amp;gt;&amp;lt;/data&amp;gt;&#039;&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	out[#out + 1] = &#039;&amp;lt;/infobox&amp;gt;&#039;&lt;br /&gt;
	return frame:preprocess( table.concat( out ) ) .. &#039;[[Category:&#039; .. t.category .. &#039;]]&#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- {{#invoke:GameData|statlines|type=Skill}}: the game&#039;s own effect lines for this page,&lt;br /&gt;
-- each linking to every other source of the same stat, under an &amp;quot;Effects&amp;quot; heading.&lt;br /&gt;
function p.statlines( frame )&lt;br /&gt;
	local t = schema.types[frame.args.type]&lt;br /&gt;
	if not t then&lt;br /&gt;
		return &#039;&#039;&lt;br /&gt;
	end&lt;br /&gt;
	local page = currentPage( frame )&lt;br /&gt;
	dependOnData( t, page )&lt;br /&gt;
	local rows = mw.ext.cargo.query( &#039;StatLine&#039;, &#039;stat,text,value,scaling,ordinal&#039;, {&lt;br /&gt;
		where = &#039;wiki_page=&#039; .. quote( page ),&lt;br /&gt;
		orderBy = &#039;ordinal&#039;,&lt;br /&gt;
	} )&lt;br /&gt;
	if #rows == 0 then&lt;br /&gt;
		return &#039;&#039;&lt;br /&gt;
	end&lt;br /&gt;
	local groups, order = {}, {}&lt;br /&gt;
	local shown = {}&lt;br /&gt;
	for _, row in ipairs( rows ) do&lt;br /&gt;
		-- A line with a slot for its value and a value of 0 does nothing: left out.&lt;br /&gt;
		if not ( row.text:find( &#039;{0}&#039;, 1, true ) and tonumber( row.value ) == 0 ) then&lt;br /&gt;
			shown[#shown + 1] = row&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if #shown == 0 then&lt;br /&gt;
		return &#039;&#039;&lt;br /&gt;
	end&lt;br /&gt;
	rows = shown&lt;br /&gt;
	for _, row in ipairs( rows ) do&lt;br /&gt;
		local scaling = row.scaling or &#039;&#039;&lt;br /&gt;
		if not groups[scaling] then&lt;br /&gt;
			groups[scaling] = {}&lt;br /&gt;
			order[#order + 1] = scaling&lt;br /&gt;
		end&lt;br /&gt;
		local value = tostring( tonumber( row.value ) or row.value ):gsub( &#039;%.0$&#039;, &#039;&#039; )&lt;br /&gt;
		local line = colorize( ( row.text:gsub( &#039;{0}&#039;, ( value:gsub( &#039;%%&#039;, &#039;%%%%&#039; ) ) ) ) )&lt;br /&gt;
		-- Some of the game&#039;s lines are fixed text with no slot for the value. Show the&lt;br /&gt;
		-- text as players see it, and the data&#039;s own value beside it unless it&#039;s a switch.&lt;br /&gt;
		if not row.text:find( &#039;{0}&#039;, 1, true ) and value ~= &#039;1&#039; then&lt;br /&gt;
			line = line .. &amp;quot; &amp;lt;small&amp;gt;(game data value: &amp;quot; .. value .. &amp;quot;)&amp;lt;/small&amp;gt;&amp;quot;&lt;br /&gt;
		end&lt;br /&gt;
		local url = mw.title.new( &#039;Special:Drilldown/StatLine&#039; ):fullUrl( { stat = row.stat } )&lt;br /&gt;
		table.insert( groups[scaling], &#039;* &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[&#039; .. url .. &#039; &#039; .. line .. &#039;]&amp;lt;/span&amp;gt;&#039; )&lt;br /&gt;
	end&lt;br /&gt;
	-- Like the game&#039;s own skill tooltips: one-time effects first, then the per-point ones.&lt;br /&gt;
	table.sort( order, function ( a, b )&lt;br /&gt;
		return ( a == &#039;per point&#039; and 1 or 0 ) &amp;lt; ( b == &#039;per point&#039; and 1 or 0 )&lt;br /&gt;
	end )&lt;br /&gt;
	local out = { &#039;== Effects ==&#039; }&lt;br /&gt;
	for _, scaling in ipairs( order ) do&lt;br /&gt;
		if scaling ~= &#039;flat&#039; and scaling ~= &#039;&#039; then&lt;br /&gt;
			-- &amp;quot;Per point invested:&amp;quot; as in the game&#039;s skill tooltips; &amp;quot;Per pick:&amp;quot;, &amp;quot;Per stack:&amp;quot;.&lt;br /&gt;
			local header = scaling:gsub( &#039;^%l&#039;, string.upper ) .. ( scaling:find( &#039;point&#039; ) and &#039; invested&#039; or &#039;&#039; )&lt;br /&gt;
			out[#out + 1] = &amp;quot;&#039;&#039;&amp;quot; .. header .. &amp;quot;:&#039;&#039;&amp;quot;&lt;br /&gt;
		end&lt;br /&gt;
		out[#out + 1] = table.concat( groups[scaling], &#039;\n&#039; )&lt;br /&gt;
	end&lt;br /&gt;
	return frame:preprocess( table.concat( out, &#039;\n&#039; ) )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- {{#invoke:GameData|related|type=SkillTree}}: lists of other objects that refer&lt;br /&gt;
-- to this one, as declared in the schema (&amp;quot;Skills&amp;quot; on a skill tree page).&lt;br /&gt;
function p.related( frame )&lt;br /&gt;
	local t = schema.types[frame.args.type]&lt;br /&gt;
	if not t then&lt;br /&gt;
		return &#039;&#039;&lt;br /&gt;
	end&lt;br /&gt;
	local page = currentPage( frame )&lt;br /&gt;
	local out = {}&lt;br /&gt;
	for _, rel in ipairs( t.related or {} ) do&lt;br /&gt;
		local other = schema.types[rel.type]&lt;br /&gt;
		local field&lt;br /&gt;
		for _, f in ipairs( other.fields ) do&lt;br /&gt;
			if f.name == rel.field then&lt;br /&gt;
				field = f&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		local rows&lt;br /&gt;
		if field.list then&lt;br /&gt;
			-- List values live in a helper table (&amp;lt;table&amp;gt;__&amp;lt;field&amp;gt;); HOLDS has the same&lt;br /&gt;
			-- alias problem as the default order, so join the helper table directly.&lt;br /&gt;
			local helper = other.table .. &#039;__&#039; .. rel.field&lt;br /&gt;
			rows = mw.ext.cargo.query( other.table .. &#039;,&#039; .. helper, other.table .. &#039;.wiki_page=wiki_page&#039;, {&lt;br /&gt;
				join = other.table .. &#039;._ID=&#039; .. helper .. &#039;._rowID&#039;,&lt;br /&gt;
				where = helper .. &#039;._value=&#039; .. quote( page ),&lt;br /&gt;
				orderBy = other.table .. &#039;.wiki_page&#039;,&lt;br /&gt;
				limit = 500,&lt;br /&gt;
			} )&lt;br /&gt;
		else&lt;br /&gt;
			rows = mw.ext.cargo.query( other.table, &#039;wiki_page&#039;, {&lt;br /&gt;
				where = rel.field .. &#039;=&#039; .. quote( page ),&lt;br /&gt;
				orderBy = &#039;wiki_page&#039;,&lt;br /&gt;
				limit = 500,&lt;br /&gt;
			} )&lt;br /&gt;
		end&lt;br /&gt;
		if #rows &amp;gt; 0 then&lt;br /&gt;
			out[#out + 1] = &#039;== &#039; .. rel.label .. &#039; ==&#039;&lt;br /&gt;
			for _, row in ipairs( rows ) do&lt;br /&gt;
				out[#out + 1] = &#039;* &#039; .. pageLink( row.wiki_page )&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	-- List fields shown as their own section rather than in the infobox.&lt;br /&gt;
	local own&lt;br /&gt;
	for _, f in ipairs( t.fields ) do&lt;br /&gt;
		if f.section then&lt;br /&gt;
			own = own or fetchRow( t, page )&lt;br /&gt;
			local items = own and own[f.name] and own[f.name] ~= &#039;&#039; and split( own[f.name] ) or {}&lt;br /&gt;
			if #items &amp;gt; 0 then&lt;br /&gt;
				out[#out + 1] = &#039;== &#039; .. f.section .. &#039; ==&#039;&lt;br /&gt;
				for _, item in ipairs( items ) do&lt;br /&gt;
					out[#out + 1] = &#039;* &#039; .. ( f.link and pageLink( item ) or item )&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return frame:preprocess( table.concat( out, &#039;\n&#039; ) )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- {{#invoke:GameData|text|type=Ability|field=description}}: text written in the&lt;br /&gt;
-- game itself, quoted as players see it.&lt;br /&gt;
function p.text( frame )&lt;br /&gt;
	local t = schema.types[frame.args.type]&lt;br /&gt;
	if not t then&lt;br /&gt;
		return &#039;&#039;&lt;br /&gt;
	end&lt;br /&gt;
	local page = currentPage( frame )&lt;br /&gt;
	dependOnData( t, page )&lt;br /&gt;
	local row = fetchRow( t, page )&lt;br /&gt;
	local value = row and row[frame.args.field or &#039;description&#039;]&lt;br /&gt;
	if not value or value == &#039;&#039; then&lt;br /&gt;
		return &#039;&#039;&lt;br /&gt;
	end&lt;br /&gt;
	local label = frame.args.label or t.text_label or &#039;In-game text&#039;&lt;br /&gt;
	return frame:preprocess( &#039;&amp;lt;blockquote class=&amp;quot;game-text&amp;quot;&amp;gt;&#039; .. colorize( value ) .. &amp;quot;&amp;lt;br&amp;gt;&amp;lt;small&amp;gt;&#039;&#039;&amp;quot; .. label .. &amp;quot;&#039;&#039;&amp;lt;/small&amp;gt;&amp;lt;/blockquote&amp;gt;&amp;quot; )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- {{#invoke:GameData|intro|type=Skill}}: the type&#039;s intro sentence from the schema,&lt;br /&gt;
-- with {field} placeholders filled from the current data.&lt;br /&gt;
function p.intro( frame )&lt;br /&gt;
	local t = schema.types[frame.args.type]&lt;br /&gt;
	if not t then&lt;br /&gt;
		return &#039;&#039;&lt;br /&gt;
	end&lt;br /&gt;
	local page = currentPage( frame )&lt;br /&gt;
	dependOnData( t, page )&lt;br /&gt;
	local row = fetchRow( t, page )&lt;br /&gt;
	if not row or not t.intro then&lt;br /&gt;
		return &#039;&#039;&lt;br /&gt;
	end&lt;br /&gt;
	local fields = {}&lt;br /&gt;
	for _, f in ipairs( t.fields ) do&lt;br /&gt;
		fields[f.name] = f&lt;br /&gt;
	end&lt;br /&gt;
	local text = t.intro:gsub( &#039;{([%w_]+)}&#039;, function ( name )&lt;br /&gt;
		local value = fields[name] and formatValue( fields[name], row[name], row )&lt;br /&gt;
		if value and name == &#039;name&#039; then&lt;br /&gt;
			value = nameText( value )&lt;br /&gt;
		end&lt;br /&gt;
		return value and ( value:gsub( &#039;%%&#039;, &#039;%%%%&#039; ) ) or &#039;&#039;&lt;br /&gt;
	end )&lt;br /&gt;
	return frame:preprocess( text )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Gallery images fit a square box of this many pixels, scaled by a whole number (up by&lt;br /&gt;
-- the largest factor that fits, or down by the smallest divisor that fits), so pixel art&lt;br /&gt;
-- keeps square pixels.&lt;br /&gt;
local GALLERY_BOX = 96&lt;br /&gt;
&lt;br /&gt;
local function galleryImage( file, page )&lt;br /&gt;
	local title = mw.title.new( &#039;File:&#039; .. file )&lt;br /&gt;
	-- Reading a file&#039;s size is an &amp;quot;expensive&amp;quot; call, limited per page; past the limit the&lt;br /&gt;
	-- image is fitted to the box by the browser instead.&lt;br /&gt;
	local ok, info = pcall( function () return title and title.file end )&lt;br /&gt;
	local width, height = ok and info and info.width, ok and info and info.height&lt;br /&gt;
	if not width or width == 0 or height == 0 then&lt;br /&gt;
		return &#039;[[File:&#039; .. file .. &#039;|&#039; .. GALLERY_BOX .. &#039;x&#039; .. GALLERY_BOX .. &#039;px|link=&#039; .. page .. &#039;]]&#039;&lt;br /&gt;
	end&lt;br /&gt;
	local side = math.max( width, height )&lt;br /&gt;
	if side &amp;lt;= GALLERY_BOX then&lt;br /&gt;
		local factor = math.floor( GALLERY_BOX / side )&lt;br /&gt;
		width, height = width * factor, height * factor&lt;br /&gt;
	else&lt;br /&gt;
		local divisor = math.ceil( side / GALLERY_BOX )&lt;br /&gt;
		width, height = math.floor( width / divisor ), math.floor( height / divisor )&lt;br /&gt;
	end&lt;br /&gt;
	return &#039;&amp;lt;span class=&amp;quot;gd-gallery-fit&amp;quot; style=&amp;quot;width:&#039; .. width .. &#039;px;height:&#039; .. height .. &#039;px&amp;quot;&amp;gt;[[File:&#039;&lt;br /&gt;
		.. file .. &#039;|link=&#039; .. page .. &#039;]]&amp;lt;/span&amp;gt;&#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- {{#invoke:GameData|gallery|type=Class}}: every object of a type as a grid of icons.&lt;br /&gt;
function p.gallery( frame )&lt;br /&gt;
	local t = schema.types[frame.args.type]&lt;br /&gt;
	if not t then&lt;br /&gt;
		return &#039;&#039;&lt;br /&gt;
	end&lt;br /&gt;
	local rows = mw.ext.cargo.query( t.table, &#039;wiki_page,icon&#039;, { orderBy = &#039;wiki_page&#039;, limit = 500 } )&lt;br /&gt;
	local out = { &#039;&amp;lt;div class=&amp;quot;gd-gallery&amp;quot;&amp;gt;&#039; }&lt;br /&gt;
	for _, row in ipairs( rows ) do&lt;br /&gt;
		local image = &#039;&#039;&lt;br /&gt;
		if row.icon and row.icon ~= &#039;&#039; then&lt;br /&gt;
			image = &#039;&amp;lt;div class=&amp;quot;gd-gallery-image&amp;quot;&amp;gt;&#039; .. galleryImage( row.icon, row.wiki_page ) .. &#039;&amp;lt;/div&amp;gt;&#039;&lt;br /&gt;
		end&lt;br /&gt;
		out[#out + 1] = &#039;&amp;lt;div class=&amp;quot;gd-gallery-item&amp;quot;&amp;gt;&#039; .. image .. pageLink( row.wiki_page ) .. &#039;&amp;lt;/div&amp;gt;&#039;&lt;br /&gt;
	end&lt;br /&gt;
	out[#out + 1] = &#039;&amp;lt;/div&amp;gt;&#039;&lt;br /&gt;
	return frame:preprocess( table.concat( out, &#039;\n&#039; ) )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function rowsFor( tableName, fields, page )&lt;br /&gt;
	return mw.ext.cargo.query( tableName, fields, {&lt;br /&gt;
		where = &#039;wiki_page=&#039; .. quote( page ),&lt;br /&gt;
		orderBy = &#039;ordinal&#039;,&lt;br /&gt;
		limit = 500,&lt;br /&gt;
	} )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Puts a value range into a modifier&#039;s wording: &amp;quot;+{0}% to All Resistances&amp;quot; with &amp;quot;4-6&amp;quot;&lt;br /&gt;
-- gives &amp;quot;+(4-6)% to All Resistances&amp;quot;.&lt;br /&gt;
local function withValue( text, value )&lt;br /&gt;
	value = tostring( value or &#039;&#039; )&lt;br /&gt;
	local shown = value:find( &#039;-&#039;, 2, true ) and ( &#039;(&#039; .. value .. &#039;)&#039; ) or value&lt;br /&gt;
	return ( text:gsub( &#039;{0}&#039;, ( shown:gsub( &#039;%%&#039;, &#039;%%%%&#039; ) ) ) )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- {{Modifier tiers|type=Modifier}}: the modifier&#039;s tiers for each slot or crystal color,&lt;br /&gt;
-- as the in-game Mod Dictionary shows them (T1 is the best).&lt;br /&gt;
function p.tiers( frame )&lt;br /&gt;
	local t = schema.types[frame.args.type]&lt;br /&gt;
	if not t then&lt;br /&gt;
		return &#039;&#039;&lt;br /&gt;
	end&lt;br /&gt;
	local page = currentPage( frame )&lt;br /&gt;
	dependOnData( t, page )&lt;br /&gt;
	local row = fetchRow( t, page )&lt;br /&gt;
	local tiers = rowsFor( &#039;ModifierTier&#039;, &#039;applies_to,tier,value,level,weight&#039;, page )&lt;br /&gt;
	if not row or #tiers == 0 then&lt;br /&gt;
		return &#039;&#039;&lt;br /&gt;
	end&lt;br /&gt;
	local out = { &#039;== Tiers ==&#039;, &#039;{| class=&amp;quot;wikitable gd-tiers&amp;quot;&#039;, &#039;! Tier !! Effect !! Required item level&#039; }&lt;br /&gt;
	local current&lt;br /&gt;
	for _, tier in ipairs( tiers ) do&lt;br /&gt;
		if tier.applies_to ~= current then&lt;br /&gt;
			current = tier.applies_to&lt;br /&gt;
			out[#out + 1] = &#039;|-\n! colspan=&amp;quot;3&amp;quot; | &#039; .. current .. &#039; (weight &#039; .. ( tier.weight or &#039;&#039; ) .. &#039;)&#039;&lt;br /&gt;
		end&lt;br /&gt;
		out[#out + 1] = &#039;|-\n| T&#039; .. tier.tier .. &#039; || &#039; .. colorize( withValue( row.text or &#039;&#039;, tier.value ) ) .. &#039; || &#039; .. ( tier.level or &#039;&#039; )&lt;br /&gt;
	end&lt;br /&gt;
	out[#out + 1] = &#039;|}&#039;&lt;br /&gt;
	return frame:preprocess( table.concat( out, &#039;\n&#039; ) )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- {{Unique modifiers|type=UniqueItem}}: a unique&#039;s fixed modifiers, with their value&lt;br /&gt;
-- range on each difficulty.&lt;br /&gt;
function p.uniquemods( frame )&lt;br /&gt;
	local t = schema.types[frame.args.type]&lt;br /&gt;
	if not t then&lt;br /&gt;
		return &#039;&#039;&lt;br /&gt;
	end&lt;br /&gt;
	local page = currentPage( frame )&lt;br /&gt;
	dependOnData( t, page )&lt;br /&gt;
	local mods = rowsFor( &#039;UniqueModifier&#039;, &#039;text,implicit,mild,spicy,inferno,nightmare&#039;, page )&lt;br /&gt;
	if #mods == 0 then&lt;br /&gt;
		return &#039;&#039;&lt;br /&gt;
	end&lt;br /&gt;
	local out = { &#039;== Modifiers ==&#039;, &#039;{| class=&amp;quot;wikitable gd-unique-mods&amp;quot;&#039;, &#039;! Modifier !! Mild !! Spicy !! Inferno !! Nightmare&#039; }&lt;br /&gt;
	for _, mod in ipairs( mods ) do&lt;br /&gt;
		-- The wording&#039;s slot shows the whole range across the difficulty columns.&lt;br /&gt;
		local low, high&lt;br /&gt;
		for _, value in ipairs( { mod.mild, mod.spicy, mod.inferno, mod.nightmare } ) do&lt;br /&gt;
			for number in tostring( value or &#039;&#039; ):gmatch( &#039;%-?%d+%.?%d*&#039; ) do&lt;br /&gt;
				number = tonumber( number )&lt;br /&gt;
				if number then&lt;br /&gt;
					low = low and math.min( low, number ) or number&lt;br /&gt;
					high = high and math.max( high, number ) or number&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		local range = low and ( low == high and tostring( low ) or ( low .. &#039;-&#039; .. high ) ) or &#039;#&#039;&lt;br /&gt;
		local text = colorize( withValue( mod.text or &#039;&#039;, range ) )&lt;br /&gt;
		if mod.implicit == &#039;1&#039; then&lt;br /&gt;
			text = text .. &amp;quot; &amp;lt;small&amp;gt;&#039;&#039;(implicit)&#039;&#039;&amp;lt;/small&amp;gt;&amp;quot;&lt;br /&gt;
		end&lt;br /&gt;
		out[#out + 1] = &#039;|-\n| &#039; .. text .. &#039; || &#039; .. ( mod.mild or &#039;&#039; ) .. &#039; || &#039; .. ( mod.spicy or &#039;&#039; )&lt;br /&gt;
			.. &#039; || &#039; .. ( mod.inferno or &#039;&#039; ) .. &#039; || &#039; .. ( mod.nightmare or &#039;&#039; )&lt;br /&gt;
	end&lt;br /&gt;
	out[#out + 1] = &#039;|}&#039;&lt;br /&gt;
	return frame:preprocess( table.concat( out, &#039;\n&#039; ) )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- {{Skill item modifiers|type=Skill}}: the item modifiers that add levels to this skill.&lt;br /&gt;
function p.skillmods( frame )&lt;br /&gt;
	local t = schema.types[frame.args.type]&lt;br /&gt;
	if not t then&lt;br /&gt;
		return &#039;&#039;&lt;br /&gt;
	end&lt;br /&gt;
	local page = currentPage( frame )&lt;br /&gt;
	dependOnData( t, page )&lt;br /&gt;
	local mods = rowsFor( &#039;SkillItemModifier&#039;, &#039;slot,affix,tiers,weight&#039;, page )&lt;br /&gt;
	if #mods == 0 then&lt;br /&gt;
		return &#039;&#039;&lt;br /&gt;
	end&lt;br /&gt;
	local out = { &#039;== Rolls on items ==&#039;, &#039;{| class=&amp;quot;wikitable&amp;quot;&#039;, &#039;! Slot !! Affix !! Skill levels by tier !! Weight&#039; }&lt;br /&gt;
	for _, mod in ipairs( mods ) do&lt;br /&gt;
		out[#out + 1] = &#039;|-\n| &#039; .. ( mod.slot or &#039;&#039; ) .. &#039; || &#039; .. ( mod.affix or &#039;&#039; ) .. &#039; || &#039; .. ( mod.tiers or &#039;&#039; ) .. &#039; || &#039; .. ( mod.weight or &#039;&#039; )&lt;br /&gt;
	end&lt;br /&gt;
	out[#out + 1] = &#039;|}&#039;&lt;br /&gt;
	return frame:preprocess( table.concat( out, &#039;\n&#039; ) )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- {{Craft offers|type=Craft}}: every place that offers a craft, with its base costs.&lt;br /&gt;
function p.craftoffers( frame )&lt;br /&gt;
	local t = schema.types[frame.args.type]&lt;br /&gt;
	if not t then&lt;br /&gt;
		return &#039;&#039;&lt;br /&gt;
	end&lt;br /&gt;
	local page = currentPage( frame )&lt;br /&gt;
	dependOnData( t, page )&lt;br /&gt;
	local offers = rowsFor( &#039;CraftOffer&#039;,&lt;br /&gt;
		&#039;offered_by,location,description,gold,essence,crafting_tokens,ultimate_tokens,chaos_added,success_rate,rare_offer&#039;, page )&lt;br /&gt;
	if #offers == 0 then&lt;br /&gt;
		return &#039;&#039;&lt;br /&gt;
	end&lt;br /&gt;
	local out = { &#039;== Where to craft it ==&#039;,&lt;br /&gt;
		&amp;quot;&#039;&#039;Base costs: the game raises them with the item&#039;s Chaos and level.&#039;&#039;&amp;quot;,&lt;br /&gt;
		&#039;{| class=&amp;quot;wikitable&amp;quot;&#039;, &#039;! Offered by !! Where !! Cost !! Chaos added !! Success rate !! Effect&#039; }&lt;br /&gt;
	for _, offer in ipairs( offers ) do&lt;br /&gt;
		local cost = {}&lt;br /&gt;
		for _, part in ipairs( { { &#039;gold&#039;, &#039;Gold&#039; }, { &#039;essence&#039;, &#039;Nightmare Essence&#039; },&lt;br /&gt;
			{ &#039;crafting_tokens&#039;, &#039;Crafting Tokens&#039; }, { &#039;ultimate_tokens&#039;, &#039;Ultimate Tokens&#039; } } ) do&lt;br /&gt;
			if offer[part[1]] and offer[part[1]] ~= &#039;&#039; and offer[part[1]] ~= &#039;0&#039; then&lt;br /&gt;
				cost[#cost + 1] = offer[part[1]] .. &#039; &#039; .. part[2]&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		local who = offer.offered_by .. ( offer.rare_offer == &#039;1&#039; and &amp;quot; &amp;lt;small&amp;gt;&#039;&#039;(rare offer)&#039;&#039;&amp;lt;/small&amp;gt;&amp;quot; or &#039;&#039; )&lt;br /&gt;
		out[#out + 1] = &#039;|-\n| &#039; .. who .. &#039; || &#039; .. ( offer.location or &#039;&#039; ) .. &#039; || &#039; .. ( #cost &amp;gt; 0 and table.concat( cost, &#039;, &#039; ) or &#039;Free&#039; )&lt;br /&gt;
			.. &#039; || &#039; .. ( offer.chaos_added or &#039;0&#039; ) .. &#039; || &#039; .. ( offer.success_rate or &#039;&#039; ) .. &#039;% || &#039; .. colorize( offer.description or &#039;&#039; )&lt;br /&gt;
	end&lt;br /&gt;
	out[#out + 1] = &#039;|}&#039;&lt;br /&gt;
	return frame:preprocess( table.concat( out, &#039;\n&#039; ) )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- One cell of a table view: links to pages that exist, game keyword colors on request.&lt;br /&gt;
local function cell( column, def, value )&lt;br /&gt;
	if value == nil or value == &#039;&#039; then&lt;br /&gt;
		return &#039;&#039;&lt;br /&gt;
	end&lt;br /&gt;
	if def and def.type == &#039;Boolean&#039; then&lt;br /&gt;
		return ( value == &#039;1&#039; or value == 1 ) and &#039;Yes&#039; or &#039;&#039;&lt;br /&gt;
	end&lt;br /&gt;
	value = tostring( value )&lt;br /&gt;
	if column.colorize then&lt;br /&gt;
		value = colorize( value )&lt;br /&gt;
	end&lt;br /&gt;
	local link = column.link or ( def and def.link )&lt;br /&gt;
	if ( link or column.field == &#039;wiki_page&#039; ) and mw.title.new( value ) and mw.title.new( value ).exists then&lt;br /&gt;
		value = pageLink( value )&lt;br /&gt;
	end&lt;br /&gt;
	return value .. ( column.suffix or &#039;&#039; )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- {{Data table|type=Monster|view=MonsterSpawn}}: a row table as declared in the type&#039;s&lt;br /&gt;
-- blocks. A view shows the page&#039;s own rows, or with &amp;quot;match&amp;quot; the rows of other pages&lt;br /&gt;
-- whose given field names this page. &amp;quot;group&amp;quot; starts a header row whenever its value changes.&lt;br /&gt;
function p.datatable( frame )&lt;br /&gt;
	local t = schema.types[frame.args.type]&lt;br /&gt;
	local v = t and t.views and t.views[frame.args.view]&lt;br /&gt;
	if not v then&lt;br /&gt;
		return &#039;&#039;&lt;br /&gt;
	end&lt;br /&gt;
	local page = currentPage( frame )&lt;br /&gt;
	dependOnData( t, page )&lt;br /&gt;
	local defs = {}&lt;br /&gt;
	for _, f in ipairs( schema.tables[v.table] or {} ) do&lt;br /&gt;
		defs[f.name] = f&lt;br /&gt;
	end&lt;br /&gt;
	local names, seen = {}, {}&lt;br /&gt;
	local function want( name )&lt;br /&gt;
		if name and not seen[name] then&lt;br /&gt;
			seen[name] = true&lt;br /&gt;
			names[#names + 1] = name&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	for _, c in ipairs( v.columns ) do&lt;br /&gt;
		want( c.field )&lt;br /&gt;
	end&lt;br /&gt;
	want( v.group )&lt;br /&gt;
	if v.gallery then&lt;br /&gt;
		want( v.gallery.image )&lt;br /&gt;
		want( v.gallery.caption )&lt;br /&gt;
	end&lt;br /&gt;
	local match = v.match or &#039;wiki_page&#039;&lt;br /&gt;
	local rows = mw.ext.cargo.query( v.table, table.concat( names, &#039;,&#039; ), {&lt;br /&gt;
		where = match .. &#039;=&#039; .. quote( page ),&lt;br /&gt;
		orderBy = v.order or ( match == &#039;wiki_page&#039; and &#039;ordinal&#039; or &#039;wiki_page,ordinal&#039; ),&lt;br /&gt;
		limit = 5000,&lt;br /&gt;
	} )&lt;br /&gt;
	if #rows == 0 then&lt;br /&gt;
		return &#039;&#039;&lt;br /&gt;
	end&lt;br /&gt;
	local out = { &#039;== &#039; .. v.heading .. &#039; ==&#039; }&lt;br /&gt;
	if v.note then&lt;br /&gt;
		out[#out + 1] = &amp;quot;&#039;&#039;&amp;quot; .. v.note .. &amp;quot;&#039;&#039;&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
	-- A view with &amp;quot;gallery&amp;quot; shows its rows as an image gallery: the file and caption fields.&lt;br /&gt;
	if v.gallery then&lt;br /&gt;
		local lines = {}&lt;br /&gt;
		for _, row in ipairs( rows ) do&lt;br /&gt;
			lines[#lines + 1] = &#039;File:&#039; .. row[v.gallery.image] .. &#039;|&#039; .. ( v.gallery.caption_prefix or &#039;&#039; ) .. ( row[v.gallery.caption] or &#039;&#039; )&lt;br /&gt;
		end&lt;br /&gt;
		out[#out + 1] = frame:extensionTag( &#039;gallery&#039;, table.concat( lines, &#039;\n&#039; ),&lt;br /&gt;
			{ mode = &#039;traditional&#039;, widths = v.gallery.width, heights = v.gallery.height } )&lt;br /&gt;
		return frame:preprocess( table.concat( out, &#039;\n&#039; ) )&lt;br /&gt;
	end&lt;br /&gt;
	local header = {}&lt;br /&gt;
	for _, c in ipairs( v.columns ) do&lt;br /&gt;
		header[#header + 1] = c.label&lt;br /&gt;
	end&lt;br /&gt;
	-- Tables with many columns start below the infobox, so they get the page&#039;s full width.&lt;br /&gt;
	-- (Counted from header: &amp;quot;#&amp;quot; doesn&#039;t work on tables from mw.loadData.)&lt;br /&gt;
	local wide = #header &amp;gt;= 7&lt;br /&gt;
	if wide then&lt;br /&gt;
		table.insert( out, 1, &#039;&amp;lt;div class=&amp;quot;gd-wide&amp;quot;&amp;gt;&#039; )&lt;br /&gt;
	end&lt;br /&gt;
	out[#out + 1] = &#039;{| class=&amp;quot;wikitable&#039; .. ( v.group and &#039;&#039; or &#039; sortable&#039; ) .. &#039;&amp;quot;&#039;&lt;br /&gt;
	out[#out + 1] = &#039;! &#039; .. table.concat( header, &#039; !! &#039; )&lt;br /&gt;
	local current&lt;br /&gt;
	for _, row in ipairs( rows ) do&lt;br /&gt;
		if v.group and row[v.group] ~= current then&lt;br /&gt;
			current = row[v.group]&lt;br /&gt;
			out[#out + 1] = &#039;|-\n! colspan=&amp;quot;&#039; .. #header .. &#039;&amp;quot; | &#039; .. cell( { field = v.group }, defs[v.group], current )&lt;br /&gt;
		end&lt;br /&gt;
		local cells = {}&lt;br /&gt;
		for _, c in ipairs( v.columns ) do&lt;br /&gt;
			cells[#cells + 1] = cell( c, defs[c.field], row[c.field] )&lt;br /&gt;
		end&lt;br /&gt;
		out[#out + 1] = &#039;|-\n| &#039; .. table.concat( cells, &#039; || &#039; )&lt;br /&gt;
	end&lt;br /&gt;
	out[#out + 1] = &#039;|}&#039;&lt;br /&gt;
	if wide then&lt;br /&gt;
		out[#out + 1] = &#039;&amp;lt;/div&amp;gt;&#039;&lt;br /&gt;
	end&lt;br /&gt;
	return frame:preprocess( table.concat( out, &#039;\n&#039; ) )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- {{#invoke:GameData|skillmods_all}}: every &amp;quot;+N to &amp;lt;skill&amp;gt;&amp;quot; item modifier, by slot.&lt;br /&gt;
function p.skillmods_all( frame )&lt;br /&gt;
	local mods = mw.ext.cargo.query( &#039;SkillItemModifier&#039;, &#039;wiki_page,slot,affix,tiers&#039;, {&lt;br /&gt;
		orderBy = &#039;slot,wiki_page&#039;,&lt;br /&gt;
		limit = 5000,&lt;br /&gt;
	} )&lt;br /&gt;
	local out, current = {}, nil&lt;br /&gt;
	for _, mod in ipairs( mods ) do&lt;br /&gt;
		if mod.slot ~= current then&lt;br /&gt;
			if current then&lt;br /&gt;
				out[#out + 1] = &#039;|}&#039;&lt;br /&gt;
			end&lt;br /&gt;
			current = mod.slot&lt;br /&gt;
			out[#out + 1] = &#039;== &#039; .. current .. &#039; ==&#039;&lt;br /&gt;
			out[#out + 1] = &#039;{| class=&amp;quot;wikitable sortable&amp;quot;\n! Skill !! Affix !! Skill levels by tier&#039;&lt;br /&gt;
		end&lt;br /&gt;
		out[#out + 1] = &#039;|-\n| &#039; .. pageLink( mod.wiki_page ) .. &#039; || &#039; .. ( mod.affix or &#039;&#039; ) .. &#039; || &#039; .. ( mod.tiers or &#039;&#039; )&lt;br /&gt;
	end&lt;br /&gt;
	if current then&lt;br /&gt;
		out[#out + 1] = &#039;|}&#039;&lt;br /&gt;
	end&lt;br /&gt;
	return frame:preprocess( table.concat( out, &#039;\n&#039; ) )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Used by the &amp;quot;&amp;lt;Label&amp;gt; data&amp;quot; templates: shows the stored record on its Data: page.&lt;br /&gt;
function p.record( frame )&lt;br /&gt;
	local t = schema.types[frame.args.type]&lt;br /&gt;
	if not t then&lt;br /&gt;
		return &#039;&#039;&lt;br /&gt;
	end&lt;br /&gt;
	local args = frame:getParent().args&lt;br /&gt;
	local out = { &#039;{| class=&amp;quot;wikitable&amp;quot;&#039; }&lt;br /&gt;
	for _, f in ipairs( t.fields ) do&lt;br /&gt;
		local value = args[f.name]&lt;br /&gt;
		if value and value ~= &#039;&#039; then&lt;br /&gt;
			out[#out + 1] = &#039;|-\n! &#039; .. f.name .. &#039;\n| &#039; .. ( formatValue( f, value, args ) or &#039;&#039; )&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	out[#out + 1] = &#039;|}&#039;&lt;br /&gt;
	if args.wiki_page and args.wiki_page ~= &#039;&#039; then&lt;br /&gt;
		out[#out + 1] = &#039;Article: &#039; .. pageLink( args.wiki_page )&lt;br /&gt;
	end&lt;br /&gt;
	return frame:preprocess( table.concat( out, &#039;\n&#039; ) )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>LongJump bot</name></author>
	</entry>
	<entry>
		<id>https://nwrx.wiki.longjump.dev/index.php?title=Module:GameData&amp;diff=657</id>
		<title>Module:GameData</title>
		<link rel="alternate" type="text/html" href="https://nwrx.wiki.longjump.dev/index.php?title=Module:GameData&amp;diff=657"/>
		<updated>2026-11-04T00:28:17Z</updated>

		<summary type="html">&lt;p&gt;LongJump bot: Game data from 645555d&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;-- Renders LongJump game data stored in Cargo: infoboxes, stat lines, lists of&lt;br /&gt;
-- related objects, and the record table shown on Data: pages. Which fields each&lt;br /&gt;
-- type has, and how they display, comes from Module:GameData/schema, which the&lt;br /&gt;
-- generator writes from the game&#039;s types file.&lt;br /&gt;
&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
local schema = mw.loadData( &#039;Module:GameData/schema&#039; )&lt;br /&gt;
&lt;br /&gt;
-- The game&#039;s keyword colors, loaded on first use.&lt;br /&gt;
local keywordIndex&lt;br /&gt;
&lt;br /&gt;
local function isWordChar( c )&lt;br /&gt;
	return c ~= &#039;&#039; and c:match( &#039;[%w_]&#039; ) ~= nil&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Colors keywords the way the game does (TextService.ColorizeText): one pass, longest&lt;br /&gt;
-- keyword first, whole words only where the keyword starts or ends with a word&lt;br /&gt;
-- character, written with the keyword&#039;s own capitalisation.&lt;br /&gt;
local function colorize( text )&lt;br /&gt;
	if not keywordIndex then&lt;br /&gt;
		keywordIndex = {}&lt;br /&gt;
		for _, entry in ipairs( mw.loadData( &#039;Module:GameData/keywords&#039; ) ) do&lt;br /&gt;
			local first = entry[1]:sub( 1, 1 )&lt;br /&gt;
			keywordIndex[first] = keywordIndex[first] or {}&lt;br /&gt;
			table.insert( keywordIndex[first], entry )&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	-- Byte-wise lower case keeps positions aligned with the original text.&lt;br /&gt;
	local lower = text:lower()&lt;br /&gt;
	local out, i = {}, 1&lt;br /&gt;
	while i &amp;lt;= #text do&lt;br /&gt;
		local matched&lt;br /&gt;
		for _, entry in ipairs( keywordIndex[lower:sub( i, i )] or {} ) do&lt;br /&gt;
			local key = entry[1]&lt;br /&gt;
			if lower:sub( i, i + #key - 1 ) == key&lt;br /&gt;
				and not ( isWordChar( key:sub( 1, 1 ) ) and isWordChar( text:sub( i - 1, i - 1 ) ) )&lt;br /&gt;
				and not ( isWordChar( key:sub( -1 ) ) and isWordChar( text:sub( i + #key, i + #key ) ) ) then&lt;br /&gt;
				matched = entry&lt;br /&gt;
				break&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		if matched then&lt;br /&gt;
			out[#out + 1] = &#039;&amp;lt;span class=&amp;quot;kw&amp;quot; style=&amp;quot;--kw:#&#039; .. matched[3] .. &#039;&amp;quot;&amp;gt;&#039; .. matched[2] .. &#039;&amp;lt;/span&amp;gt;&#039;&lt;br /&gt;
			i = i + #matched[1]&lt;br /&gt;
		else&lt;br /&gt;
			out[#out + 1] = text:sub( i, i )&lt;br /&gt;
			i = i + 1&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return table.concat( out )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- A name as text. Page names can hold wiki markup: two apostrophes in a row&lt;br /&gt;
-- (&amp;quot;Kunoichi&#039;&#039;&amp;quot;) would start italics, so they are written as character references.&lt;br /&gt;
-- Names without them come back unchanged.&lt;br /&gt;
local function nameText( name )&lt;br /&gt;
	return ( tostring( name ):gsub( &amp;quot;&#039;&#039;&amp;quot;, &#039;&amp;amp;#39;&amp;amp;#39;&#039; ) )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- A name inside an infobox tag. PortableInfobox decodes character references before&lt;br /&gt;
-- parsing its content, so the apostrophes are kept in nowiki instead.&lt;br /&gt;
local function infoboxText( name )&lt;br /&gt;
	return ( tostring( name ):gsub( &amp;quot;&#039;&#039;&amp;quot;, &amp;quot;&amp;lt;nowiki&amp;gt;&#039;&#039;&amp;lt;/nowiki&amp;gt;&amp;quot; ) )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- The in-game name of each page whose title differs from it (&amp;quot;Arrowstorm (skill)&amp;quot; is&lt;br /&gt;
-- named &amp;quot;Arrowstorm&amp;quot;), written by the generator. Links show the name, not the title.&lt;br /&gt;
local namesLoaded, names = pcall( mw.loadData, &#039;Module:GameData/names&#039; )&lt;br /&gt;
if not namesLoaded then&lt;br /&gt;
	names = {}&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- A link to a page, labelled with its in-game name shown literally.&lt;br /&gt;
local function pageLink( title )&lt;br /&gt;
	local label = names[title] or title&lt;br /&gt;
	if label ~= title or tostring( label ):find( &amp;quot;&#039;&#039;&amp;quot;, 1, true ) then&lt;br /&gt;
		return &#039;[[&#039; .. title .. &#039;|&#039; .. nameText( label ) .. &#039;]]&#039;&lt;br /&gt;
	end&lt;br /&gt;
	return &#039;[[&#039; .. title .. &#039;]]&#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function quote( value )&lt;br /&gt;
	return &amp;quot;&#039;&amp;quot; .. ( tostring( value ):gsub( &amp;quot;&#039;&amp;quot;, &amp;quot;&#039;&#039;&amp;quot; ) ) .. &amp;quot;&#039;&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function trim( s )&lt;br /&gt;
	return ( s:gsub( &#039;^%s+&#039;, &#039;&#039; ):gsub( &#039;%s+$&#039;, &#039;&#039; ) )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function split( value )&lt;br /&gt;
	local items = {}&lt;br /&gt;
	for item in tostring( value ):gmatch( &#039;[^,]+&#039; ) do&lt;br /&gt;
		item = trim( item )&lt;br /&gt;
		if item ~= &#039;&#039; then&lt;br /&gt;
			items[#items + 1] = item&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return items&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function fieldNames( t )&lt;br /&gt;
	local names = {}&lt;br /&gt;
	for _, f in ipairs( t.fields ) do&lt;br /&gt;
		names[#names + 1] = f.name&lt;br /&gt;
	end&lt;br /&gt;
	return table.concat( names, &#039;,&#039; )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function currentPage( frame )&lt;br /&gt;
	local page = frame.args.page&lt;br /&gt;
	if page and page ~= &#039;&#039; then&lt;br /&gt;
		return page&lt;br /&gt;
	end&lt;br /&gt;
	return mw.title.getCurrentTitle().text&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Formats one stored value for display, or returns nil when there is nothing to show.&lt;br /&gt;
local function formatValue( f, value, row )&lt;br /&gt;
	if value == nil or value == &#039;&#039; then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
	if f.type == &#039;Boolean&#039; then&lt;br /&gt;
		-- Yes/no fields only show when true.&lt;br /&gt;
		return ( value == &#039;1&#039; or value == 1 or value == true ) and &#039;Yes&#039; or nil&lt;br /&gt;
	end&lt;br /&gt;
	-- Wording with a slot for the value (&amp;quot;+{0}% to All Resistances&amp;quot;) shows &amp;quot;#&amp;quot; there.&lt;br /&gt;
	value = ( tostring( value ):gsub( &#039;{0}&#039;, &#039;#&#039; ) )&lt;br /&gt;
	local items = f.list and split( value ) or { tostring( value ) }&lt;br /&gt;
	local levels = f.levels and row and row[f.levels] and split( row[f.levels] ) or {}&lt;br /&gt;
	for i, item in ipairs( items ) do&lt;br /&gt;
		-- References to things that have no page in the wiki stay plain text.&lt;br /&gt;
		if f.link and mw.title.new( item ) and mw.title.new( item ).exists then&lt;br /&gt;
			item = pageLink( item )&lt;br /&gt;
		end&lt;br /&gt;
		if levels[i] then&lt;br /&gt;
			item = item .. &#039; (level &#039; .. levels[i] .. &#039;)&#039;&lt;br /&gt;
		end&lt;br /&gt;
		items[i] = item .. ( f.suffix or &#039;&#039; )&lt;br /&gt;
	end&lt;br /&gt;
	return table.concat( items, &#039;, &#039; )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Every query passes orderBy: Cargo 3.7&#039;s default order names list fields with the&lt;br /&gt;
-- full table name while the query uses a short alias, which MariaDB rejects.&lt;br /&gt;
local function fetchRow( t, page )&lt;br /&gt;
	local rows = mw.ext.cargo.query( t.table, fieldNames( t ), {&lt;br /&gt;
		where = &#039;wiki_page=&#039; .. quote( page ),&lt;br /&gt;
		orderBy = &#039;wiki_page&#039;,&lt;br /&gt;
		limit = 1,&lt;br /&gt;
	} )&lt;br /&gt;
	return rows[1]&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Reads the object&#039;s Data: page so MediaWiki records it as embedded in the current&lt;br /&gt;
-- page: when the export rewrites the Data: page, MediaWiki re-renders this page.&lt;br /&gt;
-- (Cargo records that dependency only for #cargo_query, not for Lua queries.)&lt;br /&gt;
local function dependOnData( t, page )&lt;br /&gt;
	local title = mw.title.new( &#039;Data:&#039; .. t.label .. &#039;/&#039; .. page )&lt;br /&gt;
	if title then&lt;br /&gt;
		title:getContent()&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- {{#invoke:GameData|infobox|type=Skill}} on an article.&lt;br /&gt;
function p.infobox( frame )&lt;br /&gt;
	local t = schema.types[frame.args.type]&lt;br /&gt;
	if not t then&lt;br /&gt;
		return &#039;&#039;&lt;br /&gt;
	end&lt;br /&gt;
	local page = currentPage( frame )&lt;br /&gt;
	dependOnData( t, page )&lt;br /&gt;
	local row = fetchRow( t, page )&lt;br /&gt;
	if not row then&lt;br /&gt;
		return &#039;&#039;&lt;br /&gt;
	end&lt;br /&gt;
	local out = { &#039;&amp;lt;infobox&amp;gt;&#039;, &#039;&amp;lt;title&amp;gt;&amp;lt;default&amp;gt;&#039; .. infoboxText( row.name or page ) .. &#039;&amp;lt;/default&amp;gt;&amp;lt;/title&amp;gt;&#039; }&lt;br /&gt;
	if row.icon and row.icon ~= &#039;&#039; then&lt;br /&gt;
		out[#out + 1] = &#039;&amp;lt;image&amp;gt;&amp;lt;default&amp;gt;&#039; .. row.icon .. &#039;&amp;lt;/default&amp;gt;&amp;lt;/image&amp;gt;&#039;&lt;br /&gt;
	end&lt;br /&gt;
	for _, f in ipairs( t.fields ) do&lt;br /&gt;
		if f.label then&lt;br /&gt;
			local value = formatValue( f, row[f.name], row )&lt;br /&gt;
			-- Plain words start with a capital, as the game shows them (&amp;quot;Monster&amp;quot;).&lt;br /&gt;
			if value and f.type == &#039;String&#039; and not f.link and not f.list then&lt;br /&gt;
				value = mw.ustring.upper( mw.ustring.sub( value, 1, 1 ) ) .. mw.ustring.sub( value, 2 )&lt;br /&gt;
			end&lt;br /&gt;
			if value then&lt;br /&gt;
				out[#out + 1] = &#039;&amp;lt;data&amp;gt;&amp;lt;label&amp;gt;&#039; .. f.label .. &#039;&amp;lt;/label&amp;gt;&amp;lt;default&amp;gt;&#039; .. value .. &#039;&amp;lt;/default&amp;gt;&amp;lt;/data&amp;gt;&#039;&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	out[#out + 1] = &#039;&amp;lt;/infobox&amp;gt;&#039;&lt;br /&gt;
	return frame:preprocess( table.concat( out ) ) .. &#039;[[Category:&#039; .. t.category .. &#039;]]&#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- {{#invoke:GameData|statlines|type=Skill}}: the game&#039;s own effect lines for this page,&lt;br /&gt;
-- each linking to every other source of the same stat, under an &amp;quot;Effects&amp;quot; heading.&lt;br /&gt;
function p.statlines( frame )&lt;br /&gt;
	local t = schema.types[frame.args.type]&lt;br /&gt;
	if not t then&lt;br /&gt;
		return &#039;&#039;&lt;br /&gt;
	end&lt;br /&gt;
	local page = currentPage( frame )&lt;br /&gt;
	dependOnData( t, page )&lt;br /&gt;
	local rows = mw.ext.cargo.query( &#039;StatLine&#039;, &#039;stat,text,value,scaling,ordinal&#039;, {&lt;br /&gt;
		where = &#039;wiki_page=&#039; .. quote( page ),&lt;br /&gt;
		orderBy = &#039;ordinal&#039;,&lt;br /&gt;
	} )&lt;br /&gt;
	if #rows == 0 then&lt;br /&gt;
		return &#039;&#039;&lt;br /&gt;
	end&lt;br /&gt;
	local groups, order = {}, {}&lt;br /&gt;
	local shown = {}&lt;br /&gt;
	for _, row in ipairs( rows ) do&lt;br /&gt;
		-- A line with a slot for its value and a value of 0 does nothing: left out.&lt;br /&gt;
		if not ( row.text:find( &#039;{0}&#039;, 1, true ) and tonumber( row.value ) == 0 ) then&lt;br /&gt;
			shown[#shown + 1] = row&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if #shown == 0 then&lt;br /&gt;
		return &#039;&#039;&lt;br /&gt;
	end&lt;br /&gt;
	rows = shown&lt;br /&gt;
	for _, row in ipairs( rows ) do&lt;br /&gt;
		local scaling = row.scaling or &#039;&#039;&lt;br /&gt;
		if not groups[scaling] then&lt;br /&gt;
			groups[scaling] = {}&lt;br /&gt;
			order[#order + 1] = scaling&lt;br /&gt;
		end&lt;br /&gt;
		local value = tostring( tonumber( row.value ) or row.value ):gsub( &#039;%.0$&#039;, &#039;&#039; )&lt;br /&gt;
		local line = colorize( ( row.text:gsub( &#039;{0}&#039;, ( value:gsub( &#039;%%&#039;, &#039;%%%%&#039; ) ) ) ) )&lt;br /&gt;
		-- Some of the game&#039;s lines are fixed text with no slot for the value. Show the&lt;br /&gt;
		-- text as players see it, and the data&#039;s own value beside it unless it&#039;s a switch.&lt;br /&gt;
		if not row.text:find( &#039;{0}&#039;, 1, true ) and value ~= &#039;1&#039; then&lt;br /&gt;
			line = line .. &amp;quot; &amp;lt;small&amp;gt;(game data value: &amp;quot; .. value .. &amp;quot;)&amp;lt;/small&amp;gt;&amp;quot;&lt;br /&gt;
		end&lt;br /&gt;
		local url = mw.title.new( &#039;Special:Drilldown/StatLine&#039; ):fullUrl( { stat = row.stat } )&lt;br /&gt;
		table.insert( groups[scaling], &#039;* &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[&#039; .. url .. &#039; &#039; .. line .. &#039;]&amp;lt;/span&amp;gt;&#039; )&lt;br /&gt;
	end&lt;br /&gt;
	-- Like the game&#039;s own skill tooltips: one-time effects first, then the per-point ones.&lt;br /&gt;
	table.sort( order, function ( a, b )&lt;br /&gt;
		return ( a == &#039;per point&#039; and 1 or 0 ) &amp;lt; ( b == &#039;per point&#039; and 1 or 0 )&lt;br /&gt;
	end )&lt;br /&gt;
	local out = { &#039;== Effects ==&#039; }&lt;br /&gt;
	for _, scaling in ipairs( order ) do&lt;br /&gt;
		if scaling ~= &#039;flat&#039; and scaling ~= &#039;&#039; then&lt;br /&gt;
			-- &amp;quot;Per point invested:&amp;quot; as in the game&#039;s skill tooltips; &amp;quot;Per pick:&amp;quot;, &amp;quot;Per stack:&amp;quot;.&lt;br /&gt;
			local header = scaling:gsub( &#039;^%l&#039;, string.upper ) .. ( scaling:find( &#039;point&#039; ) and &#039; invested&#039; or &#039;&#039; )&lt;br /&gt;
			out[#out + 1] = &amp;quot;&#039;&#039;&amp;quot; .. header .. &amp;quot;:&#039;&#039;&amp;quot;&lt;br /&gt;
		end&lt;br /&gt;
		out[#out + 1] = table.concat( groups[scaling], &#039;\n&#039; )&lt;br /&gt;
	end&lt;br /&gt;
	return frame:preprocess( table.concat( out, &#039;\n&#039; ) )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- {{#invoke:GameData|related|type=SkillTree}}: lists of other objects that refer&lt;br /&gt;
-- to this one, as declared in the schema (&amp;quot;Skills&amp;quot; on a skill tree page).&lt;br /&gt;
function p.related( frame )&lt;br /&gt;
	local t = schema.types[frame.args.type]&lt;br /&gt;
	if not t then&lt;br /&gt;
		return &#039;&#039;&lt;br /&gt;
	end&lt;br /&gt;
	local page = currentPage( frame )&lt;br /&gt;
	local out = {}&lt;br /&gt;
	for _, rel in ipairs( t.related or {} ) do&lt;br /&gt;
		local other = schema.types[rel.type]&lt;br /&gt;
		local field&lt;br /&gt;
		for _, f in ipairs( other.fields ) do&lt;br /&gt;
			if f.name == rel.field then&lt;br /&gt;
				field = f&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		local rows&lt;br /&gt;
		if field.list then&lt;br /&gt;
			-- List values live in a helper table (&amp;lt;table&amp;gt;__&amp;lt;field&amp;gt;); HOLDS has the same&lt;br /&gt;
			-- alias problem as the default order, so join the helper table directly.&lt;br /&gt;
			local helper = other.table .. &#039;__&#039; .. rel.field&lt;br /&gt;
			rows = mw.ext.cargo.query( other.table .. &#039;,&#039; .. helper, other.table .. &#039;.wiki_page=wiki_page&#039;, {&lt;br /&gt;
				join = other.table .. &#039;._ID=&#039; .. helper .. &#039;._rowID&#039;,&lt;br /&gt;
				where = helper .. &#039;._value=&#039; .. quote( page ),&lt;br /&gt;
				orderBy = other.table .. &#039;.wiki_page&#039;,&lt;br /&gt;
				limit = 500,&lt;br /&gt;
			} )&lt;br /&gt;
		else&lt;br /&gt;
			rows = mw.ext.cargo.query( other.table, &#039;wiki_page&#039;, {&lt;br /&gt;
				where = rel.field .. &#039;=&#039; .. quote( page ),&lt;br /&gt;
				orderBy = &#039;wiki_page&#039;,&lt;br /&gt;
				limit = 500,&lt;br /&gt;
			} )&lt;br /&gt;
		end&lt;br /&gt;
		if #rows &amp;gt; 0 then&lt;br /&gt;
			out[#out + 1] = &#039;== &#039; .. rel.label .. &#039; ==&#039;&lt;br /&gt;
			for _, row in ipairs( rows ) do&lt;br /&gt;
				out[#out + 1] = &#039;* &#039; .. pageLink( row.wiki_page )&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	-- List fields shown as their own section rather than in the infobox.&lt;br /&gt;
	local own&lt;br /&gt;
	for _, f in ipairs( t.fields ) do&lt;br /&gt;
		if f.section then&lt;br /&gt;
			own = own or fetchRow( t, page )&lt;br /&gt;
			local items = own and own[f.name] and own[f.name] ~= &#039;&#039; and split( own[f.name] ) or {}&lt;br /&gt;
			if #items &amp;gt; 0 then&lt;br /&gt;
				out[#out + 1] = &#039;== &#039; .. f.section .. &#039; ==&#039;&lt;br /&gt;
				for _, item in ipairs( items ) do&lt;br /&gt;
					out[#out + 1] = &#039;* &#039; .. ( f.link and pageLink( item ) or item )&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return frame:preprocess( table.concat( out, &#039;\n&#039; ) )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- {{#invoke:GameData|text|type=Ability|field=description}}: text written in the&lt;br /&gt;
-- game itself, quoted as players see it.&lt;br /&gt;
function p.text( frame )&lt;br /&gt;
	local t = schema.types[frame.args.type]&lt;br /&gt;
	if not t then&lt;br /&gt;
		return &#039;&#039;&lt;br /&gt;
	end&lt;br /&gt;
	local page = currentPage( frame )&lt;br /&gt;
	dependOnData( t, page )&lt;br /&gt;
	local row = fetchRow( t, page )&lt;br /&gt;
	local value = row and row[frame.args.field or &#039;description&#039;]&lt;br /&gt;
	if not value or value == &#039;&#039; then&lt;br /&gt;
		return &#039;&#039;&lt;br /&gt;
	end&lt;br /&gt;
	local label = frame.args.label or t.text_label or &#039;In-game text&#039;&lt;br /&gt;
	return frame:preprocess( &#039;&amp;lt;blockquote class=&amp;quot;game-text&amp;quot;&amp;gt;&#039; .. colorize( value ) .. &amp;quot;&amp;lt;br&amp;gt;&amp;lt;small&amp;gt;&#039;&#039;&amp;quot; .. label .. &amp;quot;&#039;&#039;&amp;lt;/small&amp;gt;&amp;lt;/blockquote&amp;gt;&amp;quot; )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- {{#invoke:GameData|intro|type=Skill}}: the type&#039;s intro sentence from the schema,&lt;br /&gt;
-- with {field} placeholders filled from the current data.&lt;br /&gt;
function p.intro( frame )&lt;br /&gt;
	local t = schema.types[frame.args.type]&lt;br /&gt;
	if not t then&lt;br /&gt;
		return &#039;&#039;&lt;br /&gt;
	end&lt;br /&gt;
	local page = currentPage( frame )&lt;br /&gt;
	dependOnData( t, page )&lt;br /&gt;
	local row = fetchRow( t, page )&lt;br /&gt;
	if not row or not t.intro then&lt;br /&gt;
		return &#039;&#039;&lt;br /&gt;
	end&lt;br /&gt;
	local fields = {}&lt;br /&gt;
	for _, f in ipairs( t.fields ) do&lt;br /&gt;
		fields[f.name] = f&lt;br /&gt;
	end&lt;br /&gt;
	local text = t.intro:gsub( &#039;{([%w_]+)}&#039;, function ( name )&lt;br /&gt;
		local value = fields[name] and formatValue( fields[name], row[name], row )&lt;br /&gt;
		if value and name == &#039;name&#039; then&lt;br /&gt;
			value = nameText( value )&lt;br /&gt;
		end&lt;br /&gt;
		return value and ( value:gsub( &#039;%%&#039;, &#039;%%%%&#039; ) ) or &#039;&#039;&lt;br /&gt;
	end )&lt;br /&gt;
	return frame:preprocess( text )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Gallery images fit a square box of this many pixels, scaled by a whole number (up by&lt;br /&gt;
-- the largest factor that fits, or down by the smallest divisor that fits), so pixel art&lt;br /&gt;
-- keeps square pixels.&lt;br /&gt;
local GALLERY_BOX = 96&lt;br /&gt;
&lt;br /&gt;
local function galleryImage( file, page )&lt;br /&gt;
	local title = mw.title.new( &#039;File:&#039; .. file )&lt;br /&gt;
	-- Reading a file&#039;s size is an &amp;quot;expensive&amp;quot; call, limited per page; past the limit the&lt;br /&gt;
	-- image is fitted to the box by the browser instead.&lt;br /&gt;
	local ok, info = pcall( function () return title and title.file end )&lt;br /&gt;
	local width, height = ok and info and info.width, ok and info and info.height&lt;br /&gt;
	if not width or width == 0 or height == 0 then&lt;br /&gt;
		return &#039;[[File:&#039; .. file .. &#039;|&#039; .. GALLERY_BOX .. &#039;x&#039; .. GALLERY_BOX .. &#039;px|link=&#039; .. page .. &#039;]]&#039;&lt;br /&gt;
	end&lt;br /&gt;
	local side = math.max( width, height )&lt;br /&gt;
	if side &amp;lt;= GALLERY_BOX then&lt;br /&gt;
		local factor = math.floor( GALLERY_BOX / side )&lt;br /&gt;
		width, height = width * factor, height * factor&lt;br /&gt;
	else&lt;br /&gt;
		local divisor = math.ceil( side / GALLERY_BOX )&lt;br /&gt;
		width, height = math.floor( width / divisor ), math.floor( height / divisor )&lt;br /&gt;
	end&lt;br /&gt;
	return &#039;&amp;lt;span class=&amp;quot;gd-gallery-fit&amp;quot; style=&amp;quot;width:&#039; .. width .. &#039;px;height:&#039; .. height .. &#039;px&amp;quot;&amp;gt;[[File:&#039;&lt;br /&gt;
		.. file .. &#039;|link=&#039; .. page .. &#039;]]&amp;lt;/span&amp;gt;&#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- {{#invoke:GameData|gallery|type=Class}}: every object of a type as a grid of icons.&lt;br /&gt;
function p.gallery( frame )&lt;br /&gt;
	local t = schema.types[frame.args.type]&lt;br /&gt;
	if not t then&lt;br /&gt;
		return &#039;&#039;&lt;br /&gt;
	end&lt;br /&gt;
	local rows = mw.ext.cargo.query( t.table, &#039;wiki_page,icon&#039;, { orderBy = &#039;wiki_page&#039;, limit = 500 } )&lt;br /&gt;
	local out = { &#039;&amp;lt;div class=&amp;quot;gd-gallery&amp;quot;&amp;gt;&#039; }&lt;br /&gt;
	for _, row in ipairs( rows ) do&lt;br /&gt;
		local image = &#039;&#039;&lt;br /&gt;
		if row.icon and row.icon ~= &#039;&#039; then&lt;br /&gt;
			image = &#039;&amp;lt;div class=&amp;quot;gd-gallery-image&amp;quot;&amp;gt;&#039; .. galleryImage( row.icon, row.wiki_page ) .. &#039;&amp;lt;/div&amp;gt;&#039;&lt;br /&gt;
		end&lt;br /&gt;
		out[#out + 1] = &#039;&amp;lt;div class=&amp;quot;gd-gallery-item&amp;quot;&amp;gt;&#039; .. image .. pageLink( row.wiki_page ) .. &#039;&amp;lt;/div&amp;gt;&#039;&lt;br /&gt;
	end&lt;br /&gt;
	out[#out + 1] = &#039;&amp;lt;/div&amp;gt;&#039;&lt;br /&gt;
	return frame:preprocess( table.concat( out, &#039;\n&#039; ) )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function rowsFor( tableName, fields, page )&lt;br /&gt;
	return mw.ext.cargo.query( tableName, fields, {&lt;br /&gt;
		where = &#039;wiki_page=&#039; .. quote( page ),&lt;br /&gt;
		orderBy = &#039;ordinal&#039;,&lt;br /&gt;
		limit = 500,&lt;br /&gt;
	} )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Puts a value range into a modifier&#039;s wording: &amp;quot;+{0}% to All Resistances&amp;quot; with &amp;quot;4-6&amp;quot;&lt;br /&gt;
-- gives &amp;quot;+(4-6)% to All Resistances&amp;quot;.&lt;br /&gt;
local function withValue( text, value )&lt;br /&gt;
	value = tostring( value or &#039;&#039; )&lt;br /&gt;
	local shown = value:find( &#039;-&#039;, 2, true ) and ( &#039;(&#039; .. value .. &#039;)&#039; ) or value&lt;br /&gt;
	return ( text:gsub( &#039;{0}&#039;, ( shown:gsub( &#039;%%&#039;, &#039;%%%%&#039; ) ) ) )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- {{Modifier tiers|type=Modifier}}: the modifier&#039;s tiers for each slot or crystal color,&lt;br /&gt;
-- as the in-game Mod Dictionary shows them (T1 is the best).&lt;br /&gt;
function p.tiers( frame )&lt;br /&gt;
	local t = schema.types[frame.args.type]&lt;br /&gt;
	if not t then&lt;br /&gt;
		return &#039;&#039;&lt;br /&gt;
	end&lt;br /&gt;
	local page = currentPage( frame )&lt;br /&gt;
	dependOnData( t, page )&lt;br /&gt;
	local row = fetchRow( t, page )&lt;br /&gt;
	local tiers = rowsFor( &#039;ModifierTier&#039;, &#039;applies_to,tier,value,level,weight&#039;, page )&lt;br /&gt;
	if not row or #tiers == 0 then&lt;br /&gt;
		return &#039;&#039;&lt;br /&gt;
	end&lt;br /&gt;
	local out = { &#039;== Tiers ==&#039;, &#039;{| class=&amp;quot;wikitable gd-tiers&amp;quot;&#039;, &#039;! Tier !! Effect !! Required item level&#039; }&lt;br /&gt;
	local current&lt;br /&gt;
	for _, tier in ipairs( tiers ) do&lt;br /&gt;
		if tier.applies_to ~= current then&lt;br /&gt;
			current = tier.applies_to&lt;br /&gt;
			out[#out + 1] = &#039;|-\n! colspan=&amp;quot;3&amp;quot; | &#039; .. current .. &#039; (weight &#039; .. ( tier.weight or &#039;&#039; ) .. &#039;)&#039;&lt;br /&gt;
		end&lt;br /&gt;
		out[#out + 1] = &#039;|-\n| T&#039; .. tier.tier .. &#039; || &#039; .. colorize( withValue( row.text or &#039;&#039;, tier.value ) ) .. &#039; || &#039; .. ( tier.level or &#039;&#039; )&lt;br /&gt;
	end&lt;br /&gt;
	out[#out + 1] = &#039;|}&#039;&lt;br /&gt;
	return frame:preprocess( table.concat( out, &#039;\n&#039; ) )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- {{Unique modifiers|type=UniqueItem}}: a unique&#039;s fixed modifiers, with their value&lt;br /&gt;
-- range on each difficulty.&lt;br /&gt;
function p.uniquemods( frame )&lt;br /&gt;
	local t = schema.types[frame.args.type]&lt;br /&gt;
	if not t then&lt;br /&gt;
		return &#039;&#039;&lt;br /&gt;
	end&lt;br /&gt;
	local page = currentPage( frame )&lt;br /&gt;
	dependOnData( t, page )&lt;br /&gt;
	local mods = rowsFor( &#039;UniqueModifier&#039;, &#039;text,implicit,mild,spicy,inferno,nightmare&#039;, page )&lt;br /&gt;
	if #mods == 0 then&lt;br /&gt;
		return &#039;&#039;&lt;br /&gt;
	end&lt;br /&gt;
	local out = { &#039;== Modifiers ==&#039;, &#039;{| class=&amp;quot;wikitable gd-unique-mods&amp;quot;&#039;, &#039;! Modifier !! Mild !! Spicy !! Inferno !! Nightmare&#039; }&lt;br /&gt;
	for _, mod in ipairs( mods ) do&lt;br /&gt;
		-- The wording&#039;s slot shows the whole range across the difficulty columns.&lt;br /&gt;
		local low, high&lt;br /&gt;
		for _, value in ipairs( { mod.mild, mod.spicy, mod.inferno, mod.nightmare } ) do&lt;br /&gt;
			for number in tostring( value or &#039;&#039; ):gmatch( &#039;%-?%d+%.?%d*&#039; ) do&lt;br /&gt;
				number = tonumber( number )&lt;br /&gt;
				if number then&lt;br /&gt;
					low = low and math.min( low, number ) or number&lt;br /&gt;
					high = high and math.max( high, number ) or number&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		local range = low and ( low == high and tostring( low ) or ( low .. &#039;-&#039; .. high ) ) or &#039;#&#039;&lt;br /&gt;
		local text = colorize( withValue( mod.text or &#039;&#039;, range ) )&lt;br /&gt;
		if mod.implicit == &#039;1&#039; then&lt;br /&gt;
			text = text .. &amp;quot; &amp;lt;small&amp;gt;&#039;&#039;(implicit)&#039;&#039;&amp;lt;/small&amp;gt;&amp;quot;&lt;br /&gt;
		end&lt;br /&gt;
		out[#out + 1] = &#039;|-\n| &#039; .. text .. &#039; || &#039; .. ( mod.mild or &#039;&#039; ) .. &#039; || &#039; .. ( mod.spicy or &#039;&#039; )&lt;br /&gt;
			.. &#039; || &#039; .. ( mod.inferno or &#039;&#039; ) .. &#039; || &#039; .. ( mod.nightmare or &#039;&#039; )&lt;br /&gt;
	end&lt;br /&gt;
	out[#out + 1] = &#039;|}&#039;&lt;br /&gt;
	return frame:preprocess( table.concat( out, &#039;\n&#039; ) )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- {{Skill item modifiers|type=Skill}}: the item modifiers that add levels to this skill.&lt;br /&gt;
function p.skillmods( frame )&lt;br /&gt;
	local t = schema.types[frame.args.type]&lt;br /&gt;
	if not t then&lt;br /&gt;
		return &#039;&#039;&lt;br /&gt;
	end&lt;br /&gt;
	local page = currentPage( frame )&lt;br /&gt;
	dependOnData( t, page )&lt;br /&gt;
	local mods = rowsFor( &#039;SkillItemModifier&#039;, &#039;slot,affix,tiers,weight&#039;, page )&lt;br /&gt;
	if #mods == 0 then&lt;br /&gt;
		return &#039;&#039;&lt;br /&gt;
	end&lt;br /&gt;
	local out = { &#039;== Rolls on items ==&#039;, &#039;{| class=&amp;quot;wikitable&amp;quot;&#039;, &#039;! Slot !! Affix !! Skill levels by tier !! Weight&#039; }&lt;br /&gt;
	for _, mod in ipairs( mods ) do&lt;br /&gt;
		out[#out + 1] = &#039;|-\n| &#039; .. ( mod.slot or &#039;&#039; ) .. &#039; || &#039; .. ( mod.affix or &#039;&#039; ) .. &#039; || &#039; .. ( mod.tiers or &#039;&#039; ) .. &#039; || &#039; .. ( mod.weight or &#039;&#039; )&lt;br /&gt;
	end&lt;br /&gt;
	out[#out + 1] = &#039;|}&#039;&lt;br /&gt;
	return frame:preprocess( table.concat( out, &#039;\n&#039; ) )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- {{Craft offers|type=Craft}}: every place that offers a craft, with its base costs.&lt;br /&gt;
function p.craftoffers( frame )&lt;br /&gt;
	local t = schema.types[frame.args.type]&lt;br /&gt;
	if not t then&lt;br /&gt;
		return &#039;&#039;&lt;br /&gt;
	end&lt;br /&gt;
	local page = currentPage( frame )&lt;br /&gt;
	dependOnData( t, page )&lt;br /&gt;
	local offers = rowsFor( &#039;CraftOffer&#039;,&lt;br /&gt;
		&#039;offered_by,location,description,gold,essence,crafting_tokens,ultimate_tokens,chaos_added,success_rate,rare_offer&#039;, page )&lt;br /&gt;
	if #offers == 0 then&lt;br /&gt;
		return &#039;&#039;&lt;br /&gt;
	end&lt;br /&gt;
	local out = { &#039;== Where to craft it ==&#039;,&lt;br /&gt;
		&amp;quot;&#039;&#039;Base costs: the game raises them with the item&#039;s Chaos and level.&#039;&#039;&amp;quot;,&lt;br /&gt;
		&#039;{| class=&amp;quot;wikitable&amp;quot;&#039;, &#039;! Offered by !! Where !! Cost !! Chaos added !! Success rate !! Effect&#039; }&lt;br /&gt;
	for _, offer in ipairs( offers ) do&lt;br /&gt;
		local cost = {}&lt;br /&gt;
		for _, part in ipairs( { { &#039;gold&#039;, &#039;Gold&#039; }, { &#039;essence&#039;, &#039;Nightmare Essence&#039; },&lt;br /&gt;
			{ &#039;crafting_tokens&#039;, &#039;Crafting Tokens&#039; }, { &#039;ultimate_tokens&#039;, &#039;Ultimate Tokens&#039; } } ) do&lt;br /&gt;
			if offer[part[1]] and offer[part[1]] ~= &#039;&#039; and offer[part[1]] ~= &#039;0&#039; then&lt;br /&gt;
				cost[#cost + 1] = offer[part[1]] .. &#039; &#039; .. part[2]&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		local who = offer.offered_by .. ( offer.rare_offer == &#039;1&#039; and &amp;quot; &amp;lt;small&amp;gt;&#039;&#039;(rare offer)&#039;&#039;&amp;lt;/small&amp;gt;&amp;quot; or &#039;&#039; )&lt;br /&gt;
		out[#out + 1] = &#039;|-\n| &#039; .. who .. &#039; || &#039; .. ( offer.location or &#039;&#039; ) .. &#039; || &#039; .. ( #cost &amp;gt; 0 and table.concat( cost, &#039;, &#039; ) or &#039;Free&#039; )&lt;br /&gt;
			.. &#039; || &#039; .. ( offer.chaos_added or &#039;0&#039; ) .. &#039; || &#039; .. ( offer.success_rate or &#039;&#039; ) .. &#039;% || &#039; .. colorize( offer.description or &#039;&#039; )&lt;br /&gt;
	end&lt;br /&gt;
	out[#out + 1] = &#039;|}&#039;&lt;br /&gt;
	return frame:preprocess( table.concat( out, &#039;\n&#039; ) )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- One cell of a table view: links to pages that exist, game keyword colors on request.&lt;br /&gt;
local function cell( column, def, value )&lt;br /&gt;
	if value == nil or value == &#039;&#039; then&lt;br /&gt;
		return &#039;&#039;&lt;br /&gt;
	end&lt;br /&gt;
	if def and def.type == &#039;Boolean&#039; then&lt;br /&gt;
		return ( value == &#039;1&#039; or value == 1 ) and &#039;Yes&#039; or &#039;&#039;&lt;br /&gt;
	end&lt;br /&gt;
	value = tostring( value )&lt;br /&gt;
	if column.colorize then&lt;br /&gt;
		value = colorize( value )&lt;br /&gt;
	end&lt;br /&gt;
	local link = column.link or ( def and def.link )&lt;br /&gt;
	if ( link or column.field == &#039;wiki_page&#039; ) and mw.title.new( value ) and mw.title.new( value ).exists then&lt;br /&gt;
		value = pageLink( value )&lt;br /&gt;
	end&lt;br /&gt;
	return value .. ( column.suffix or &#039;&#039; )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- {{Data table|type=Monster|view=MonsterSpawn}}: a row table as declared in the type&#039;s&lt;br /&gt;
-- blocks. A view shows the page&#039;s own rows, or with &amp;quot;match&amp;quot; the rows of other pages&lt;br /&gt;
-- whose given field names this page. &amp;quot;group&amp;quot; starts a header row whenever its value changes.&lt;br /&gt;
function p.datatable( frame )&lt;br /&gt;
	local t = schema.types[frame.args.type]&lt;br /&gt;
	local v = t and t.views and t.views[frame.args.view]&lt;br /&gt;
	if not v then&lt;br /&gt;
		return &#039;&#039;&lt;br /&gt;
	end&lt;br /&gt;
	local page = currentPage( frame )&lt;br /&gt;
	dependOnData( t, page )&lt;br /&gt;
	local defs = {}&lt;br /&gt;
	for _, f in ipairs( schema.tables[v.table] or {} ) do&lt;br /&gt;
		defs[f.name] = f&lt;br /&gt;
	end&lt;br /&gt;
	local names, seen = {}, {}&lt;br /&gt;
	local function want( name )&lt;br /&gt;
		if name and not seen[name] then&lt;br /&gt;
			seen[name] = true&lt;br /&gt;
			names[#names + 1] = name&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	for _, c in ipairs( v.columns ) do&lt;br /&gt;
		want( c.field )&lt;br /&gt;
	end&lt;br /&gt;
	want( v.group )&lt;br /&gt;
	if v.gallery then&lt;br /&gt;
		want( v.gallery.image )&lt;br /&gt;
		want( v.gallery.caption )&lt;br /&gt;
	end&lt;br /&gt;
	local match = v.match or &#039;wiki_page&#039;&lt;br /&gt;
	local rows = mw.ext.cargo.query( v.table, table.concat( names, &#039;,&#039; ), {&lt;br /&gt;
		where = match .. &#039;=&#039; .. quote( page ),&lt;br /&gt;
		orderBy = v.order or ( match == &#039;wiki_page&#039; and &#039;ordinal&#039; or &#039;wiki_page,ordinal&#039; ),&lt;br /&gt;
		limit = 5000,&lt;br /&gt;
	} )&lt;br /&gt;
	if #rows == 0 then&lt;br /&gt;
		return &#039;&#039;&lt;br /&gt;
	end&lt;br /&gt;
	local out = { &#039;== &#039; .. v.heading .. &#039; ==&#039; }&lt;br /&gt;
	if v.note then&lt;br /&gt;
		out[#out + 1] = &amp;quot;&#039;&#039;&amp;quot; .. v.note .. &amp;quot;&#039;&#039;&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
	-- A view with &amp;quot;gallery&amp;quot; shows its rows as an image gallery: the file and caption fields.&lt;br /&gt;
	if v.gallery then&lt;br /&gt;
		local lines = {}&lt;br /&gt;
		for _, row in ipairs( rows ) do&lt;br /&gt;
			lines[#lines + 1] = &#039;File:&#039; .. row[v.gallery.image] .. &#039;|&#039; .. ( v.gallery.caption_prefix or &#039;&#039; ) .. ( row[v.gallery.caption] or &#039;&#039; )&lt;br /&gt;
		end&lt;br /&gt;
		out[#out + 1] = frame:extensionTag( &#039;gallery&#039;, table.concat( lines, &#039;\n&#039; ),&lt;br /&gt;
			{ mode = &#039;traditional&#039;, widths = v.gallery.width, heights = v.gallery.height } )&lt;br /&gt;
		return frame:preprocess( table.concat( out, &#039;\n&#039; ) )&lt;br /&gt;
	end&lt;br /&gt;
	-- Tables with many columns start below the infobox, so they get the page&#039;s full width.&lt;br /&gt;
	local wide = #v.columns &amp;gt;= 7&lt;br /&gt;
	if wide then&lt;br /&gt;
		table.insert( out, 1, &#039;&amp;lt;div class=&amp;quot;gd-wide&amp;quot;&amp;gt;&#039; )&lt;br /&gt;
	end&lt;br /&gt;
	local header = {}&lt;br /&gt;
	for _, c in ipairs( v.columns ) do&lt;br /&gt;
		header[#header + 1] = c.label&lt;br /&gt;
	end&lt;br /&gt;
	out[#out + 1] = &#039;{| class=&amp;quot;wikitable&#039; .. ( v.group and &#039;&#039; or &#039; sortable&#039; ) .. &#039;&amp;quot;&#039;&lt;br /&gt;
	out[#out + 1] = &#039;! &#039; .. table.concat( header, &#039; !! &#039; )&lt;br /&gt;
	local current&lt;br /&gt;
	for _, row in ipairs( rows ) do&lt;br /&gt;
		if v.group and row[v.group] ~= current then&lt;br /&gt;
			current = row[v.group]&lt;br /&gt;
			out[#out + 1] = &#039;|-\n! colspan=&amp;quot;&#039; .. #v.columns .. &#039;&amp;quot; | &#039; .. cell( { field = v.group }, defs[v.group], current )&lt;br /&gt;
		end&lt;br /&gt;
		local cells = {}&lt;br /&gt;
		for _, c in ipairs( v.columns ) do&lt;br /&gt;
			cells[#cells + 1] = cell( c, defs[c.field], row[c.field] )&lt;br /&gt;
		end&lt;br /&gt;
		out[#out + 1] = &#039;|-\n| &#039; .. table.concat( cells, &#039; || &#039; )&lt;br /&gt;
	end&lt;br /&gt;
	out[#out + 1] = &#039;|}&#039;&lt;br /&gt;
	if wide then&lt;br /&gt;
		out[#out + 1] = &#039;&amp;lt;/div&amp;gt;&#039;&lt;br /&gt;
	end&lt;br /&gt;
	return frame:preprocess( table.concat( out, &#039;\n&#039; ) )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- {{#invoke:GameData|skillmods_all}}: every &amp;quot;+N to &amp;lt;skill&amp;gt;&amp;quot; item modifier, by slot.&lt;br /&gt;
function p.skillmods_all( frame )&lt;br /&gt;
	local mods = mw.ext.cargo.query( &#039;SkillItemModifier&#039;, &#039;wiki_page,slot,affix,tiers&#039;, {&lt;br /&gt;
		orderBy = &#039;slot,wiki_page&#039;,&lt;br /&gt;
		limit = 5000,&lt;br /&gt;
	} )&lt;br /&gt;
	local out, current = {}, nil&lt;br /&gt;
	for _, mod in ipairs( mods ) do&lt;br /&gt;
		if mod.slot ~= current then&lt;br /&gt;
			if current then&lt;br /&gt;
				out[#out + 1] = &#039;|}&#039;&lt;br /&gt;
			end&lt;br /&gt;
			current = mod.slot&lt;br /&gt;
			out[#out + 1] = &#039;== &#039; .. current .. &#039; ==&#039;&lt;br /&gt;
			out[#out + 1] = &#039;{| class=&amp;quot;wikitable sortable&amp;quot;\n! Skill !! Affix !! Skill levels by tier&#039;&lt;br /&gt;
		end&lt;br /&gt;
		out[#out + 1] = &#039;|-\n| &#039; .. pageLink( mod.wiki_page ) .. &#039; || &#039; .. ( mod.affix or &#039;&#039; ) .. &#039; || &#039; .. ( mod.tiers or &#039;&#039; )&lt;br /&gt;
	end&lt;br /&gt;
	if current then&lt;br /&gt;
		out[#out + 1] = &#039;|}&#039;&lt;br /&gt;
	end&lt;br /&gt;
	return frame:preprocess( table.concat( out, &#039;\n&#039; ) )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Used by the &amp;quot;&amp;lt;Label&amp;gt; data&amp;quot; templates: shows the stored record on its Data: page.&lt;br /&gt;
function p.record( frame )&lt;br /&gt;
	local t = schema.types[frame.args.type]&lt;br /&gt;
	if not t then&lt;br /&gt;
		return &#039;&#039;&lt;br /&gt;
	end&lt;br /&gt;
	local args = frame:getParent().args&lt;br /&gt;
	local out = { &#039;{| class=&amp;quot;wikitable&amp;quot;&#039; }&lt;br /&gt;
	for _, f in ipairs( t.fields ) do&lt;br /&gt;
		local value = args[f.name]&lt;br /&gt;
		if value and value ~= &#039;&#039; then&lt;br /&gt;
			out[#out + 1] = &#039;|-\n! &#039; .. f.name .. &#039;\n| &#039; .. ( formatValue( f, value, args ) or &#039;&#039; )&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	out[#out + 1] = &#039;|}&#039;&lt;br /&gt;
	if args.wiki_page and args.wiki_page ~= &#039;&#039; then&lt;br /&gt;
		out[#out + 1] = &#039;Article: &#039; .. pageLink( args.wiki_page )&lt;br /&gt;
	end&lt;br /&gt;
	return frame:preprocess( table.concat( out, &#039;\n&#039; ) )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>LongJump bot</name></author>
	</entry>
	<entry>
		<id>https://nwrx.wiki.longjump.dev/index.php?title=Module:GameData&amp;diff=656</id>
		<title>Module:GameData</title>
		<link rel="alternate" type="text/html" href="https://nwrx.wiki.longjump.dev/index.php?title=Module:GameData&amp;diff=656"/>
		<updated>2026-11-04T00:21:15Z</updated>

		<summary type="html">&lt;p&gt;LongJump bot: Game data from 645555d&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;-- Renders LongJump game data stored in Cargo: infoboxes, stat lines, lists of&lt;br /&gt;
-- related objects, and the record table shown on Data: pages. Which fields each&lt;br /&gt;
-- type has, and how they display, comes from Module:GameData/schema, which the&lt;br /&gt;
-- generator writes from the game&#039;s types file.&lt;br /&gt;
&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
local schema = mw.loadData( &#039;Module:GameData/schema&#039; )&lt;br /&gt;
&lt;br /&gt;
-- The game&#039;s keyword colors, loaded on first use.&lt;br /&gt;
local keywordIndex&lt;br /&gt;
&lt;br /&gt;
local function isWordChar( c )&lt;br /&gt;
	return c ~= &#039;&#039; and c:match( &#039;[%w_]&#039; ) ~= nil&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Colors keywords the way the game does (TextService.ColorizeText): one pass, longest&lt;br /&gt;
-- keyword first, whole words only where the keyword starts or ends with a word&lt;br /&gt;
-- character, written with the keyword&#039;s own capitalisation.&lt;br /&gt;
local function colorize( text )&lt;br /&gt;
	if not keywordIndex then&lt;br /&gt;
		keywordIndex = {}&lt;br /&gt;
		for _, entry in ipairs( mw.loadData( &#039;Module:GameData/keywords&#039; ) ) do&lt;br /&gt;
			local first = entry[1]:sub( 1, 1 )&lt;br /&gt;
			keywordIndex[first] = keywordIndex[first] or {}&lt;br /&gt;
			table.insert( keywordIndex[first], entry )&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	-- Byte-wise lower case keeps positions aligned with the original text.&lt;br /&gt;
	local lower = text:lower()&lt;br /&gt;
	local out, i = {}, 1&lt;br /&gt;
	while i &amp;lt;= #text do&lt;br /&gt;
		local matched&lt;br /&gt;
		for _, entry in ipairs( keywordIndex[lower:sub( i, i )] or {} ) do&lt;br /&gt;
			local key = entry[1]&lt;br /&gt;
			if lower:sub( i, i + #key - 1 ) == key&lt;br /&gt;
				and not ( isWordChar( key:sub( 1, 1 ) ) and isWordChar( text:sub( i - 1, i - 1 ) ) )&lt;br /&gt;
				and not ( isWordChar( key:sub( -1 ) ) and isWordChar( text:sub( i + #key, i + #key ) ) ) then&lt;br /&gt;
				matched = entry&lt;br /&gt;
				break&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		if matched then&lt;br /&gt;
			out[#out + 1] = &#039;&amp;lt;span class=&amp;quot;kw&amp;quot; style=&amp;quot;--kw:#&#039; .. matched[3] .. &#039;&amp;quot;&amp;gt;&#039; .. matched[2] .. &#039;&amp;lt;/span&amp;gt;&#039;&lt;br /&gt;
			i = i + #matched[1]&lt;br /&gt;
		else&lt;br /&gt;
			out[#out + 1] = text:sub( i, i )&lt;br /&gt;
			i = i + 1&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return table.concat( out )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- A name as text. Page names can hold wiki markup: two apostrophes in a row&lt;br /&gt;
-- (&amp;quot;Kunoichi&#039;&#039;&amp;quot;) would start italics, so they are written as character references.&lt;br /&gt;
-- Names without them come back unchanged.&lt;br /&gt;
local function nameText( name )&lt;br /&gt;
	return ( tostring( name ):gsub( &amp;quot;&#039;&#039;&amp;quot;, &#039;&amp;amp;#39;&amp;amp;#39;&#039; ) )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- A name inside an infobox tag. PortableInfobox decodes character references before&lt;br /&gt;
-- parsing its content, so the apostrophes are kept in nowiki instead.&lt;br /&gt;
local function infoboxText( name )&lt;br /&gt;
	return ( tostring( name ):gsub( &amp;quot;&#039;&#039;&amp;quot;, &amp;quot;&amp;lt;nowiki&amp;gt;&#039;&#039;&amp;lt;/nowiki&amp;gt;&amp;quot; ) )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- The in-game name of each page whose title differs from it (&amp;quot;Arrowstorm (skill)&amp;quot; is&lt;br /&gt;
-- named &amp;quot;Arrowstorm&amp;quot;), written by the generator. Links show the name, not the title.&lt;br /&gt;
local namesLoaded, names = pcall( mw.loadData, &#039;Module:GameData/names&#039; )&lt;br /&gt;
if not namesLoaded then&lt;br /&gt;
	names = {}&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- A link to a page, labelled with its in-game name shown literally.&lt;br /&gt;
local function pageLink( title )&lt;br /&gt;
	local label = names[title] or title&lt;br /&gt;
	if label ~= title or tostring( label ):find( &amp;quot;&#039;&#039;&amp;quot;, 1, true ) then&lt;br /&gt;
		return &#039;[[&#039; .. title .. &#039;|&#039; .. nameText( label ) .. &#039;]]&#039;&lt;br /&gt;
	end&lt;br /&gt;
	return &#039;[[&#039; .. title .. &#039;]]&#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function quote( value )&lt;br /&gt;
	return &amp;quot;&#039;&amp;quot; .. ( tostring( value ):gsub( &amp;quot;&#039;&amp;quot;, &amp;quot;&#039;&#039;&amp;quot; ) ) .. &amp;quot;&#039;&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function trim( s )&lt;br /&gt;
	return ( s:gsub( &#039;^%s+&#039;, &#039;&#039; ):gsub( &#039;%s+$&#039;, &#039;&#039; ) )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function split( value )&lt;br /&gt;
	local items = {}&lt;br /&gt;
	for item in tostring( value ):gmatch( &#039;[^,]+&#039; ) do&lt;br /&gt;
		item = trim( item )&lt;br /&gt;
		if item ~= &#039;&#039; then&lt;br /&gt;
			items[#items + 1] = item&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return items&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function fieldNames( t )&lt;br /&gt;
	local names = {}&lt;br /&gt;
	for _, f in ipairs( t.fields ) do&lt;br /&gt;
		names[#names + 1] = f.name&lt;br /&gt;
	end&lt;br /&gt;
	return table.concat( names, &#039;,&#039; )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function currentPage( frame )&lt;br /&gt;
	local page = frame.args.page&lt;br /&gt;
	if page and page ~= &#039;&#039; then&lt;br /&gt;
		return page&lt;br /&gt;
	end&lt;br /&gt;
	return mw.title.getCurrentTitle().text&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Formats one stored value for display, or returns nil when there is nothing to show.&lt;br /&gt;
local function formatValue( f, value, row )&lt;br /&gt;
	if value == nil or value == &#039;&#039; then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
	if f.type == &#039;Boolean&#039; then&lt;br /&gt;
		-- Yes/no fields only show when true.&lt;br /&gt;
		return ( value == &#039;1&#039; or value == 1 or value == true ) and &#039;Yes&#039; or nil&lt;br /&gt;
	end&lt;br /&gt;
	-- Wording with a slot for the value (&amp;quot;+{0}% to All Resistances&amp;quot;) shows &amp;quot;#&amp;quot; there.&lt;br /&gt;
	value = ( tostring( value ):gsub( &#039;{0}&#039;, &#039;#&#039; ) )&lt;br /&gt;
	local items = f.list and split( value ) or { tostring( value ) }&lt;br /&gt;
	local levels = f.levels and row and row[f.levels] and split( row[f.levels] ) or {}&lt;br /&gt;
	for i, item in ipairs( items ) do&lt;br /&gt;
		-- References to things that have no page in the wiki stay plain text.&lt;br /&gt;
		if f.link and mw.title.new( item ) and mw.title.new( item ).exists then&lt;br /&gt;
			item = pageLink( item )&lt;br /&gt;
		end&lt;br /&gt;
		if levels[i] then&lt;br /&gt;
			item = item .. &#039; (level &#039; .. levels[i] .. &#039;)&#039;&lt;br /&gt;
		end&lt;br /&gt;
		items[i] = item .. ( f.suffix or &#039;&#039; )&lt;br /&gt;
	end&lt;br /&gt;
	return table.concat( items, &#039;, &#039; )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Every query passes orderBy: Cargo 3.7&#039;s default order names list fields with the&lt;br /&gt;
-- full table name while the query uses a short alias, which MariaDB rejects.&lt;br /&gt;
local function fetchRow( t, page )&lt;br /&gt;
	local rows = mw.ext.cargo.query( t.table, fieldNames( t ), {&lt;br /&gt;
		where = &#039;wiki_page=&#039; .. quote( page ),&lt;br /&gt;
		orderBy = &#039;wiki_page&#039;,&lt;br /&gt;
		limit = 1,&lt;br /&gt;
	} )&lt;br /&gt;
	return rows[1]&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Reads the object&#039;s Data: page so MediaWiki records it as embedded in the current&lt;br /&gt;
-- page: when the export rewrites the Data: page, MediaWiki re-renders this page.&lt;br /&gt;
-- (Cargo records that dependency only for #cargo_query, not for Lua queries.)&lt;br /&gt;
local function dependOnData( t, page )&lt;br /&gt;
	local title = mw.title.new( &#039;Data:&#039; .. t.label .. &#039;/&#039; .. page )&lt;br /&gt;
	if title then&lt;br /&gt;
		title:getContent()&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- {{#invoke:GameData|infobox|type=Skill}} on an article.&lt;br /&gt;
function p.infobox( frame )&lt;br /&gt;
	local t = schema.types[frame.args.type]&lt;br /&gt;
	if not t then&lt;br /&gt;
		return &#039;&#039;&lt;br /&gt;
	end&lt;br /&gt;
	local page = currentPage( frame )&lt;br /&gt;
	dependOnData( t, page )&lt;br /&gt;
	local row = fetchRow( t, page )&lt;br /&gt;
	if not row then&lt;br /&gt;
		return &#039;&#039;&lt;br /&gt;
	end&lt;br /&gt;
	local out = { &#039;&amp;lt;infobox&amp;gt;&#039;, &#039;&amp;lt;title&amp;gt;&amp;lt;default&amp;gt;&#039; .. infoboxText( row.name or page ) .. &#039;&amp;lt;/default&amp;gt;&amp;lt;/title&amp;gt;&#039; }&lt;br /&gt;
	if row.icon and row.icon ~= &#039;&#039; then&lt;br /&gt;
		out[#out + 1] = &#039;&amp;lt;image&amp;gt;&amp;lt;default&amp;gt;&#039; .. row.icon .. &#039;&amp;lt;/default&amp;gt;&amp;lt;/image&amp;gt;&#039;&lt;br /&gt;
	end&lt;br /&gt;
	for _, f in ipairs( t.fields ) do&lt;br /&gt;
		if f.label then&lt;br /&gt;
			local value = formatValue( f, row[f.name], row )&lt;br /&gt;
			-- Plain words start with a capital, as the game shows them (&amp;quot;Monster&amp;quot;).&lt;br /&gt;
			if value and f.type == &#039;String&#039; and not f.link and not f.list then&lt;br /&gt;
				value = mw.ustring.upper( mw.ustring.sub( value, 1, 1 ) ) .. mw.ustring.sub( value, 2 )&lt;br /&gt;
			end&lt;br /&gt;
			if value then&lt;br /&gt;
				out[#out + 1] = &#039;&amp;lt;data&amp;gt;&amp;lt;label&amp;gt;&#039; .. f.label .. &#039;&amp;lt;/label&amp;gt;&amp;lt;default&amp;gt;&#039; .. value .. &#039;&amp;lt;/default&amp;gt;&amp;lt;/data&amp;gt;&#039;&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	out[#out + 1] = &#039;&amp;lt;/infobox&amp;gt;&#039;&lt;br /&gt;
	return frame:preprocess( table.concat( out ) ) .. &#039;[[Category:&#039; .. t.category .. &#039;]]&#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- {{#invoke:GameData|statlines|type=Skill}}: the game&#039;s own effect lines for this page,&lt;br /&gt;
-- each linking to every other source of the same stat, under an &amp;quot;Effects&amp;quot; heading.&lt;br /&gt;
function p.statlines( frame )&lt;br /&gt;
	local t = schema.types[frame.args.type]&lt;br /&gt;
	if not t then&lt;br /&gt;
		return &#039;&#039;&lt;br /&gt;
	end&lt;br /&gt;
	local page = currentPage( frame )&lt;br /&gt;
	dependOnData( t, page )&lt;br /&gt;
	local rows = mw.ext.cargo.query( &#039;StatLine&#039;, &#039;stat,text,value,scaling,ordinal&#039;, {&lt;br /&gt;
		where = &#039;wiki_page=&#039; .. quote( page ),&lt;br /&gt;
		orderBy = &#039;ordinal&#039;,&lt;br /&gt;
	} )&lt;br /&gt;
	if #rows == 0 then&lt;br /&gt;
		return &#039;&#039;&lt;br /&gt;
	end&lt;br /&gt;
	local groups, order = {}, {}&lt;br /&gt;
	local shown = {}&lt;br /&gt;
	for _, row in ipairs( rows ) do&lt;br /&gt;
		-- A line with a slot for its value and a value of 0 does nothing: left out.&lt;br /&gt;
		if not ( row.text:find( &#039;{0}&#039;, 1, true ) and tonumber( row.value ) == 0 ) then&lt;br /&gt;
			shown[#shown + 1] = row&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if #shown == 0 then&lt;br /&gt;
		return &#039;&#039;&lt;br /&gt;
	end&lt;br /&gt;
	rows = shown&lt;br /&gt;
	for _, row in ipairs( rows ) do&lt;br /&gt;
		local scaling = row.scaling or &#039;&#039;&lt;br /&gt;
		if not groups[scaling] then&lt;br /&gt;
			groups[scaling] = {}&lt;br /&gt;
			order[#order + 1] = scaling&lt;br /&gt;
		end&lt;br /&gt;
		local value = tostring( tonumber( row.value ) or row.value ):gsub( &#039;%.0$&#039;, &#039;&#039; )&lt;br /&gt;
		local line = colorize( ( row.text:gsub( &#039;{0}&#039;, ( value:gsub( &#039;%%&#039;, &#039;%%%%&#039; ) ) ) ) )&lt;br /&gt;
		-- Some of the game&#039;s lines are fixed text with no slot for the value. Show the&lt;br /&gt;
		-- text as players see it, and the data&#039;s own value beside it unless it&#039;s a switch.&lt;br /&gt;
		if not row.text:find( &#039;{0}&#039;, 1, true ) and value ~= &#039;1&#039; then&lt;br /&gt;
			line = line .. &amp;quot; &amp;lt;small&amp;gt;(game data value: &amp;quot; .. value .. &amp;quot;)&amp;lt;/small&amp;gt;&amp;quot;&lt;br /&gt;
		end&lt;br /&gt;
		local url = mw.title.new( &#039;Special:Drilldown/StatLine&#039; ):fullUrl( { stat = row.stat } )&lt;br /&gt;
		table.insert( groups[scaling], &#039;* &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[&#039; .. url .. &#039; &#039; .. line .. &#039;]&amp;lt;/span&amp;gt;&#039; )&lt;br /&gt;
	end&lt;br /&gt;
	-- Like the game&#039;s own skill tooltips: one-time effects first, then the per-point ones.&lt;br /&gt;
	table.sort( order, function ( a, b )&lt;br /&gt;
		return ( a == &#039;per point&#039; and 1 or 0 ) &amp;lt; ( b == &#039;per point&#039; and 1 or 0 )&lt;br /&gt;
	end )&lt;br /&gt;
	local out = { &#039;== Effects ==&#039; }&lt;br /&gt;
	for _, scaling in ipairs( order ) do&lt;br /&gt;
		if scaling ~= &#039;flat&#039; and scaling ~= &#039;&#039; then&lt;br /&gt;
			-- &amp;quot;Per point invested:&amp;quot; as in the game&#039;s skill tooltips; &amp;quot;Per pick:&amp;quot;, &amp;quot;Per stack:&amp;quot;.&lt;br /&gt;
			local header = scaling:gsub( &#039;^%l&#039;, string.upper ) .. ( scaling:find( &#039;point&#039; ) and &#039; invested&#039; or &#039;&#039; )&lt;br /&gt;
			out[#out + 1] = &amp;quot;&#039;&#039;&amp;quot; .. header .. &amp;quot;:&#039;&#039;&amp;quot;&lt;br /&gt;
		end&lt;br /&gt;
		out[#out + 1] = table.concat( groups[scaling], &#039;\n&#039; )&lt;br /&gt;
	end&lt;br /&gt;
	return frame:preprocess( table.concat( out, &#039;\n&#039; ) )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- {{#invoke:GameData|related|type=SkillTree}}: lists of other objects that refer&lt;br /&gt;
-- to this one, as declared in the schema (&amp;quot;Skills&amp;quot; on a skill tree page).&lt;br /&gt;
function p.related( frame )&lt;br /&gt;
	local t = schema.types[frame.args.type]&lt;br /&gt;
	if not t then&lt;br /&gt;
		return &#039;&#039;&lt;br /&gt;
	end&lt;br /&gt;
	local page = currentPage( frame )&lt;br /&gt;
	local out = {}&lt;br /&gt;
	for _, rel in ipairs( t.related or {} ) do&lt;br /&gt;
		local other = schema.types[rel.type]&lt;br /&gt;
		local field&lt;br /&gt;
		for _, f in ipairs( other.fields ) do&lt;br /&gt;
			if f.name == rel.field then&lt;br /&gt;
				field = f&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		local rows&lt;br /&gt;
		if field.list then&lt;br /&gt;
			-- List values live in a helper table (&amp;lt;table&amp;gt;__&amp;lt;field&amp;gt;); HOLDS has the same&lt;br /&gt;
			-- alias problem as the default order, so join the helper table directly.&lt;br /&gt;
			local helper = other.table .. &#039;__&#039; .. rel.field&lt;br /&gt;
			rows = mw.ext.cargo.query( other.table .. &#039;,&#039; .. helper, other.table .. &#039;.wiki_page=wiki_page&#039;, {&lt;br /&gt;
				join = other.table .. &#039;._ID=&#039; .. helper .. &#039;._rowID&#039;,&lt;br /&gt;
				where = helper .. &#039;._value=&#039; .. quote( page ),&lt;br /&gt;
				orderBy = other.table .. &#039;.wiki_page&#039;,&lt;br /&gt;
				limit = 500,&lt;br /&gt;
			} )&lt;br /&gt;
		else&lt;br /&gt;
			rows = mw.ext.cargo.query( other.table, &#039;wiki_page&#039;, {&lt;br /&gt;
				where = rel.field .. &#039;=&#039; .. quote( page ),&lt;br /&gt;
				orderBy = &#039;wiki_page&#039;,&lt;br /&gt;
				limit = 500,&lt;br /&gt;
			} )&lt;br /&gt;
		end&lt;br /&gt;
		if #rows &amp;gt; 0 then&lt;br /&gt;
			out[#out + 1] = &#039;== &#039; .. rel.label .. &#039; ==&#039;&lt;br /&gt;
			for _, row in ipairs( rows ) do&lt;br /&gt;
				out[#out + 1] = &#039;* &#039; .. pageLink( row.wiki_page )&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	-- List fields shown as their own section rather than in the infobox.&lt;br /&gt;
	local own&lt;br /&gt;
	for _, f in ipairs( t.fields ) do&lt;br /&gt;
		if f.section then&lt;br /&gt;
			own = own or fetchRow( t, page )&lt;br /&gt;
			local items = own and own[f.name] and own[f.name] ~= &#039;&#039; and split( own[f.name] ) or {}&lt;br /&gt;
			if #items &amp;gt; 0 then&lt;br /&gt;
				out[#out + 1] = &#039;== &#039; .. f.section .. &#039; ==&#039;&lt;br /&gt;
				for _, item in ipairs( items ) do&lt;br /&gt;
					out[#out + 1] = &#039;* &#039; .. ( f.link and pageLink( item ) or item )&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return frame:preprocess( table.concat( out, &#039;\n&#039; ) )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- {{#invoke:GameData|text|type=Ability|field=description}}: text written in the&lt;br /&gt;
-- game itself, quoted as players see it.&lt;br /&gt;
function p.text( frame )&lt;br /&gt;
	local t = schema.types[frame.args.type]&lt;br /&gt;
	if not t then&lt;br /&gt;
		return &#039;&#039;&lt;br /&gt;
	end&lt;br /&gt;
	local page = currentPage( frame )&lt;br /&gt;
	dependOnData( t, page )&lt;br /&gt;
	local row = fetchRow( t, page )&lt;br /&gt;
	local value = row and row[frame.args.field or &#039;description&#039;]&lt;br /&gt;
	if not value or value == &#039;&#039; then&lt;br /&gt;
		return &#039;&#039;&lt;br /&gt;
	end&lt;br /&gt;
	local label = frame.args.label or t.text_label or &#039;In-game text&#039;&lt;br /&gt;
	return frame:preprocess( &#039;&amp;lt;blockquote class=&amp;quot;game-text&amp;quot;&amp;gt;&#039; .. colorize( value ) .. &amp;quot;&amp;lt;br&amp;gt;&amp;lt;small&amp;gt;&#039;&#039;&amp;quot; .. label .. &amp;quot;&#039;&#039;&amp;lt;/small&amp;gt;&amp;lt;/blockquote&amp;gt;&amp;quot; )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- {{#invoke:GameData|intro|type=Skill}}: the type&#039;s intro sentence from the schema,&lt;br /&gt;
-- with {field} placeholders filled from the current data.&lt;br /&gt;
function p.intro( frame )&lt;br /&gt;
	local t = schema.types[frame.args.type]&lt;br /&gt;
	if not t then&lt;br /&gt;
		return &#039;&#039;&lt;br /&gt;
	end&lt;br /&gt;
	local page = currentPage( frame )&lt;br /&gt;
	dependOnData( t, page )&lt;br /&gt;
	local row = fetchRow( t, page )&lt;br /&gt;
	if not row or not t.intro then&lt;br /&gt;
		return &#039;&#039;&lt;br /&gt;
	end&lt;br /&gt;
	local fields = {}&lt;br /&gt;
	for _, f in ipairs( t.fields ) do&lt;br /&gt;
		fields[f.name] = f&lt;br /&gt;
	end&lt;br /&gt;
	local text = t.intro:gsub( &#039;{([%w_]+)}&#039;, function ( name )&lt;br /&gt;
		local value = fields[name] and formatValue( fields[name], row[name], row )&lt;br /&gt;
		if value and name == &#039;name&#039; then&lt;br /&gt;
			value = nameText( value )&lt;br /&gt;
		end&lt;br /&gt;
		return value and ( value:gsub( &#039;%%&#039;, &#039;%%%%&#039; ) ) or &#039;&#039;&lt;br /&gt;
	end )&lt;br /&gt;
	return frame:preprocess( text )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Gallery images fit a square box of this many pixels, scaled by a whole number (up by&lt;br /&gt;
-- the largest factor that fits, or down by the smallest divisor that fits), so pixel art&lt;br /&gt;
-- keeps square pixels.&lt;br /&gt;
local GALLERY_BOX = 96&lt;br /&gt;
&lt;br /&gt;
local function galleryImage( file, page )&lt;br /&gt;
	local title = mw.title.new( &#039;File:&#039; .. file )&lt;br /&gt;
	local info = title and title.file&lt;br /&gt;
	local width, height = info and info.width, info and info.height&lt;br /&gt;
	if not width or width == 0 or height == 0 then&lt;br /&gt;
		return &#039;[[File:&#039; .. file .. &#039;|link=&#039; .. page .. &#039;]]&#039;&lt;br /&gt;
	end&lt;br /&gt;
	local side = math.max( width, height )&lt;br /&gt;
	if side &amp;lt;= GALLERY_BOX then&lt;br /&gt;
		local factor = math.floor( GALLERY_BOX / side )&lt;br /&gt;
		width, height = width * factor, height * factor&lt;br /&gt;
	else&lt;br /&gt;
		local divisor = math.ceil( side / GALLERY_BOX )&lt;br /&gt;
		width, height = math.floor( width / divisor ), math.floor( height / divisor )&lt;br /&gt;
	end&lt;br /&gt;
	return &#039;&amp;lt;span class=&amp;quot;gd-gallery-fit&amp;quot; style=&amp;quot;width:&#039; .. width .. &#039;px;height:&#039; .. height .. &#039;px&amp;quot;&amp;gt;[[File:&#039;&lt;br /&gt;
		.. file .. &#039;|link=&#039; .. page .. &#039;]]&amp;lt;/span&amp;gt;&#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- {{#invoke:GameData|gallery|type=Class}}: every object of a type as a grid of icons.&lt;br /&gt;
function p.gallery( frame )&lt;br /&gt;
	local t = schema.types[frame.args.type]&lt;br /&gt;
	if not t then&lt;br /&gt;
		return &#039;&#039;&lt;br /&gt;
	end&lt;br /&gt;
	local rows = mw.ext.cargo.query( t.table, &#039;wiki_page,icon&#039;, { orderBy = &#039;wiki_page&#039;, limit = 500 } )&lt;br /&gt;
	local out = { &#039;&amp;lt;div class=&amp;quot;gd-gallery&amp;quot;&amp;gt;&#039; }&lt;br /&gt;
	for _, row in ipairs( rows ) do&lt;br /&gt;
		local image = &#039;&#039;&lt;br /&gt;
		if row.icon and row.icon ~= &#039;&#039; then&lt;br /&gt;
			image = &#039;&amp;lt;div class=&amp;quot;gd-gallery-image&amp;quot;&amp;gt;&#039; .. galleryImage( row.icon, row.wiki_page ) .. &#039;&amp;lt;/div&amp;gt;&#039;&lt;br /&gt;
		end&lt;br /&gt;
		out[#out + 1] = &#039;&amp;lt;div class=&amp;quot;gd-gallery-item&amp;quot;&amp;gt;&#039; .. image .. pageLink( row.wiki_page ) .. &#039;&amp;lt;/div&amp;gt;&#039;&lt;br /&gt;
	end&lt;br /&gt;
	out[#out + 1] = &#039;&amp;lt;/div&amp;gt;&#039;&lt;br /&gt;
	return frame:preprocess( table.concat( out, &#039;\n&#039; ) )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function rowsFor( tableName, fields, page )&lt;br /&gt;
	return mw.ext.cargo.query( tableName, fields, {&lt;br /&gt;
		where = &#039;wiki_page=&#039; .. quote( page ),&lt;br /&gt;
		orderBy = &#039;ordinal&#039;,&lt;br /&gt;
		limit = 500,&lt;br /&gt;
	} )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Puts a value range into a modifier&#039;s wording: &amp;quot;+{0}% to All Resistances&amp;quot; with &amp;quot;4-6&amp;quot;&lt;br /&gt;
-- gives &amp;quot;+(4-6)% to All Resistances&amp;quot;.&lt;br /&gt;
local function withValue( text, value )&lt;br /&gt;
	value = tostring( value or &#039;&#039; )&lt;br /&gt;
	local shown = value:find( &#039;-&#039;, 2, true ) and ( &#039;(&#039; .. value .. &#039;)&#039; ) or value&lt;br /&gt;
	return ( text:gsub( &#039;{0}&#039;, ( shown:gsub( &#039;%%&#039;, &#039;%%%%&#039; ) ) ) )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- {{Modifier tiers|type=Modifier}}: the modifier&#039;s tiers for each slot or crystal color,&lt;br /&gt;
-- as the in-game Mod Dictionary shows them (T1 is the best).&lt;br /&gt;
function p.tiers( frame )&lt;br /&gt;
	local t = schema.types[frame.args.type]&lt;br /&gt;
	if not t then&lt;br /&gt;
		return &#039;&#039;&lt;br /&gt;
	end&lt;br /&gt;
	local page = currentPage( frame )&lt;br /&gt;
	dependOnData( t, page )&lt;br /&gt;
	local row = fetchRow( t, page )&lt;br /&gt;
	local tiers = rowsFor( &#039;ModifierTier&#039;, &#039;applies_to,tier,value,level,weight&#039;, page )&lt;br /&gt;
	if not row or #tiers == 0 then&lt;br /&gt;
		return &#039;&#039;&lt;br /&gt;
	end&lt;br /&gt;
	local out = { &#039;== Tiers ==&#039;, &#039;{| class=&amp;quot;wikitable gd-tiers&amp;quot;&#039;, &#039;! Tier !! Effect !! Required item level&#039; }&lt;br /&gt;
	local current&lt;br /&gt;
	for _, tier in ipairs( tiers ) do&lt;br /&gt;
		if tier.applies_to ~= current then&lt;br /&gt;
			current = tier.applies_to&lt;br /&gt;
			out[#out + 1] = &#039;|-\n! colspan=&amp;quot;3&amp;quot; | &#039; .. current .. &#039; (weight &#039; .. ( tier.weight or &#039;&#039; ) .. &#039;)&#039;&lt;br /&gt;
		end&lt;br /&gt;
		out[#out + 1] = &#039;|-\n| T&#039; .. tier.tier .. &#039; || &#039; .. colorize( withValue( row.text or &#039;&#039;, tier.value ) ) .. &#039; || &#039; .. ( tier.level or &#039;&#039; )&lt;br /&gt;
	end&lt;br /&gt;
	out[#out + 1] = &#039;|}&#039;&lt;br /&gt;
	return frame:preprocess( table.concat( out, &#039;\n&#039; ) )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- {{Unique modifiers|type=UniqueItem}}: a unique&#039;s fixed modifiers, with their value&lt;br /&gt;
-- range on each difficulty.&lt;br /&gt;
function p.uniquemods( frame )&lt;br /&gt;
	local t = schema.types[frame.args.type]&lt;br /&gt;
	if not t then&lt;br /&gt;
		return &#039;&#039;&lt;br /&gt;
	end&lt;br /&gt;
	local page = currentPage( frame )&lt;br /&gt;
	dependOnData( t, page )&lt;br /&gt;
	local mods = rowsFor( &#039;UniqueModifier&#039;, &#039;text,implicit,mild,spicy,inferno,nightmare&#039;, page )&lt;br /&gt;
	if #mods == 0 then&lt;br /&gt;
		return &#039;&#039;&lt;br /&gt;
	end&lt;br /&gt;
	local out = { &#039;== Modifiers ==&#039;, &#039;{| class=&amp;quot;wikitable gd-unique-mods&amp;quot;&#039;, &#039;! Modifier !! Mild !! Spicy !! Inferno !! Nightmare&#039; }&lt;br /&gt;
	for _, mod in ipairs( mods ) do&lt;br /&gt;
		-- The wording&#039;s slot shows the whole range across the difficulty columns.&lt;br /&gt;
		local low, high&lt;br /&gt;
		for _, value in ipairs( { mod.mild, mod.spicy, mod.inferno, mod.nightmare } ) do&lt;br /&gt;
			for number in tostring( value or &#039;&#039; ):gmatch( &#039;%-?%d+%.?%d*&#039; ) do&lt;br /&gt;
				number = tonumber( number )&lt;br /&gt;
				if number then&lt;br /&gt;
					low = low and math.min( low, number ) or number&lt;br /&gt;
					high = high and math.max( high, number ) or number&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		local range = low and ( low == high and tostring( low ) or ( low .. &#039;-&#039; .. high ) ) or &#039;#&#039;&lt;br /&gt;
		local text = colorize( withValue( mod.text or &#039;&#039;, range ) )&lt;br /&gt;
		if mod.implicit == &#039;1&#039; then&lt;br /&gt;
			text = text .. &amp;quot; &amp;lt;small&amp;gt;&#039;&#039;(implicit)&#039;&#039;&amp;lt;/small&amp;gt;&amp;quot;&lt;br /&gt;
		end&lt;br /&gt;
		out[#out + 1] = &#039;|-\n| &#039; .. text .. &#039; || &#039; .. ( mod.mild or &#039;&#039; ) .. &#039; || &#039; .. ( mod.spicy or &#039;&#039; )&lt;br /&gt;
			.. &#039; || &#039; .. ( mod.inferno or &#039;&#039; ) .. &#039; || &#039; .. ( mod.nightmare or &#039;&#039; )&lt;br /&gt;
	end&lt;br /&gt;
	out[#out + 1] = &#039;|}&#039;&lt;br /&gt;
	return frame:preprocess( table.concat( out, &#039;\n&#039; ) )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- {{Skill item modifiers|type=Skill}}: the item modifiers that add levels to this skill.&lt;br /&gt;
function p.skillmods( frame )&lt;br /&gt;
	local t = schema.types[frame.args.type]&lt;br /&gt;
	if not t then&lt;br /&gt;
		return &#039;&#039;&lt;br /&gt;
	end&lt;br /&gt;
	local page = currentPage( frame )&lt;br /&gt;
	dependOnData( t, page )&lt;br /&gt;
	local mods = rowsFor( &#039;SkillItemModifier&#039;, &#039;slot,affix,tiers,weight&#039;, page )&lt;br /&gt;
	if #mods == 0 then&lt;br /&gt;
		return &#039;&#039;&lt;br /&gt;
	end&lt;br /&gt;
	local out = { &#039;== Rolls on items ==&#039;, &#039;{| class=&amp;quot;wikitable&amp;quot;&#039;, &#039;! Slot !! Affix !! Skill levels by tier !! Weight&#039; }&lt;br /&gt;
	for _, mod in ipairs( mods ) do&lt;br /&gt;
		out[#out + 1] = &#039;|-\n| &#039; .. ( mod.slot or &#039;&#039; ) .. &#039; || &#039; .. ( mod.affix or &#039;&#039; ) .. &#039; || &#039; .. ( mod.tiers or &#039;&#039; ) .. &#039; || &#039; .. ( mod.weight or &#039;&#039; )&lt;br /&gt;
	end&lt;br /&gt;
	out[#out + 1] = &#039;|}&#039;&lt;br /&gt;
	return frame:preprocess( table.concat( out, &#039;\n&#039; ) )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- {{Craft offers|type=Craft}}: every place that offers a craft, with its base costs.&lt;br /&gt;
function p.craftoffers( frame )&lt;br /&gt;
	local t = schema.types[frame.args.type]&lt;br /&gt;
	if not t then&lt;br /&gt;
		return &#039;&#039;&lt;br /&gt;
	end&lt;br /&gt;
	local page = currentPage( frame )&lt;br /&gt;
	dependOnData( t, page )&lt;br /&gt;
	local offers = rowsFor( &#039;CraftOffer&#039;,&lt;br /&gt;
		&#039;offered_by,location,description,gold,essence,crafting_tokens,ultimate_tokens,chaos_added,success_rate,rare_offer&#039;, page )&lt;br /&gt;
	if #offers == 0 then&lt;br /&gt;
		return &#039;&#039;&lt;br /&gt;
	end&lt;br /&gt;
	local out = { &#039;== Where to craft it ==&#039;,&lt;br /&gt;
		&amp;quot;&#039;&#039;Base costs: the game raises them with the item&#039;s Chaos and level.&#039;&#039;&amp;quot;,&lt;br /&gt;
		&#039;{| class=&amp;quot;wikitable&amp;quot;&#039;, &#039;! Offered by !! Where !! Cost !! Chaos added !! Success rate !! Effect&#039; }&lt;br /&gt;
	for _, offer in ipairs( offers ) do&lt;br /&gt;
		local cost = {}&lt;br /&gt;
		for _, part in ipairs( { { &#039;gold&#039;, &#039;Gold&#039; }, { &#039;essence&#039;, &#039;Nightmare Essence&#039; },&lt;br /&gt;
			{ &#039;crafting_tokens&#039;, &#039;Crafting Tokens&#039; }, { &#039;ultimate_tokens&#039;, &#039;Ultimate Tokens&#039; } } ) do&lt;br /&gt;
			if offer[part[1]] and offer[part[1]] ~= &#039;&#039; and offer[part[1]] ~= &#039;0&#039; then&lt;br /&gt;
				cost[#cost + 1] = offer[part[1]] .. &#039; &#039; .. part[2]&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		local who = offer.offered_by .. ( offer.rare_offer == &#039;1&#039; and &amp;quot; &amp;lt;small&amp;gt;&#039;&#039;(rare offer)&#039;&#039;&amp;lt;/small&amp;gt;&amp;quot; or &#039;&#039; )&lt;br /&gt;
		out[#out + 1] = &#039;|-\n| &#039; .. who .. &#039; || &#039; .. ( offer.location or &#039;&#039; ) .. &#039; || &#039; .. ( #cost &amp;gt; 0 and table.concat( cost, &#039;, &#039; ) or &#039;Free&#039; )&lt;br /&gt;
			.. &#039; || &#039; .. ( offer.chaos_added or &#039;0&#039; ) .. &#039; || &#039; .. ( offer.success_rate or &#039;&#039; ) .. &#039;% || &#039; .. colorize( offer.description or &#039;&#039; )&lt;br /&gt;
	end&lt;br /&gt;
	out[#out + 1] = &#039;|}&#039;&lt;br /&gt;
	return frame:preprocess( table.concat( out, &#039;\n&#039; ) )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- One cell of a table view: links to pages that exist, game keyword colors on request.&lt;br /&gt;
local function cell( column, def, value )&lt;br /&gt;
	if value == nil or value == &#039;&#039; then&lt;br /&gt;
		return &#039;&#039;&lt;br /&gt;
	end&lt;br /&gt;
	if def and def.type == &#039;Boolean&#039; then&lt;br /&gt;
		return ( value == &#039;1&#039; or value == 1 ) and &#039;Yes&#039; or &#039;&#039;&lt;br /&gt;
	end&lt;br /&gt;
	value = tostring( value )&lt;br /&gt;
	if column.colorize then&lt;br /&gt;
		value = colorize( value )&lt;br /&gt;
	end&lt;br /&gt;
	local link = column.link or ( def and def.link )&lt;br /&gt;
	if ( link or column.field == &#039;wiki_page&#039; ) and mw.title.new( value ) and mw.title.new( value ).exists then&lt;br /&gt;
		value = pageLink( value )&lt;br /&gt;
	end&lt;br /&gt;
	return value .. ( column.suffix or &#039;&#039; )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- {{Data table|type=Monster|view=MonsterSpawn}}: a row table as declared in the type&#039;s&lt;br /&gt;
-- blocks. A view shows the page&#039;s own rows, or with &amp;quot;match&amp;quot; the rows of other pages&lt;br /&gt;
-- whose given field names this page. &amp;quot;group&amp;quot; starts a header row whenever its value changes.&lt;br /&gt;
function p.datatable( frame )&lt;br /&gt;
	local t = schema.types[frame.args.type]&lt;br /&gt;
	local v = t and t.views and t.views[frame.args.view]&lt;br /&gt;
	if not v then&lt;br /&gt;
		return &#039;&#039;&lt;br /&gt;
	end&lt;br /&gt;
	local page = currentPage( frame )&lt;br /&gt;
	dependOnData( t, page )&lt;br /&gt;
	local defs = {}&lt;br /&gt;
	for _, f in ipairs( schema.tables[v.table] or {} ) do&lt;br /&gt;
		defs[f.name] = f&lt;br /&gt;
	end&lt;br /&gt;
	local names, seen = {}, {}&lt;br /&gt;
	local function want( name )&lt;br /&gt;
		if name and not seen[name] then&lt;br /&gt;
			seen[name] = true&lt;br /&gt;
			names[#names + 1] = name&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	for _, c in ipairs( v.columns ) do&lt;br /&gt;
		want( c.field )&lt;br /&gt;
	end&lt;br /&gt;
	want( v.group )&lt;br /&gt;
	if v.gallery then&lt;br /&gt;
		want( v.gallery.image )&lt;br /&gt;
		want( v.gallery.caption )&lt;br /&gt;
	end&lt;br /&gt;
	local match = v.match or &#039;wiki_page&#039;&lt;br /&gt;
	local rows = mw.ext.cargo.query( v.table, table.concat( names, &#039;,&#039; ), {&lt;br /&gt;
		where = match .. &#039;=&#039; .. quote( page ),&lt;br /&gt;
		orderBy = v.order or ( match == &#039;wiki_page&#039; and &#039;ordinal&#039; or &#039;wiki_page,ordinal&#039; ),&lt;br /&gt;
		limit = 5000,&lt;br /&gt;
	} )&lt;br /&gt;
	if #rows == 0 then&lt;br /&gt;
		return &#039;&#039;&lt;br /&gt;
	end&lt;br /&gt;
	local out = { &#039;== &#039; .. v.heading .. &#039; ==&#039; }&lt;br /&gt;
	if v.note then&lt;br /&gt;
		out[#out + 1] = &amp;quot;&#039;&#039;&amp;quot; .. v.note .. &amp;quot;&#039;&#039;&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
	-- A view with &amp;quot;gallery&amp;quot; shows its rows as an image gallery: the file and caption fields.&lt;br /&gt;
	if v.gallery then&lt;br /&gt;
		local lines = {}&lt;br /&gt;
		for _, row in ipairs( rows ) do&lt;br /&gt;
			lines[#lines + 1] = &#039;File:&#039; .. row[v.gallery.image] .. &#039;|&#039; .. ( v.gallery.caption_prefix or &#039;&#039; ) .. ( row[v.gallery.caption] or &#039;&#039; )&lt;br /&gt;
		end&lt;br /&gt;
		out[#out + 1] = frame:extensionTag( &#039;gallery&#039;, table.concat( lines, &#039;\n&#039; ),&lt;br /&gt;
			{ mode = &#039;traditional&#039;, widths = v.gallery.width, heights = v.gallery.height } )&lt;br /&gt;
		return frame:preprocess( table.concat( out, &#039;\n&#039; ) )&lt;br /&gt;
	end&lt;br /&gt;
	-- Tables with many columns start below the infobox, so they get the page&#039;s full width.&lt;br /&gt;
	local wide = #v.columns &amp;gt;= 7&lt;br /&gt;
	if wide then&lt;br /&gt;
		table.insert( out, 1, &#039;&amp;lt;div class=&amp;quot;gd-wide&amp;quot;&amp;gt;&#039; )&lt;br /&gt;
	end&lt;br /&gt;
	local header = {}&lt;br /&gt;
	for _, c in ipairs( v.columns ) do&lt;br /&gt;
		header[#header + 1] = c.label&lt;br /&gt;
	end&lt;br /&gt;
	out[#out + 1] = &#039;{| class=&amp;quot;wikitable&#039; .. ( v.group and &#039;&#039; or &#039; sortable&#039; ) .. &#039;&amp;quot;&#039;&lt;br /&gt;
	out[#out + 1] = &#039;! &#039; .. table.concat( header, &#039; !! &#039; )&lt;br /&gt;
	local current&lt;br /&gt;
	for _, row in ipairs( rows ) do&lt;br /&gt;
		if v.group and row[v.group] ~= current then&lt;br /&gt;
			current = row[v.group]&lt;br /&gt;
			out[#out + 1] = &#039;|-\n! colspan=&amp;quot;&#039; .. #v.columns .. &#039;&amp;quot; | &#039; .. cell( { field = v.group }, defs[v.group], current )&lt;br /&gt;
		end&lt;br /&gt;
		local cells = {}&lt;br /&gt;
		for _, c in ipairs( v.columns ) do&lt;br /&gt;
			cells[#cells + 1] = cell( c, defs[c.field], row[c.field] )&lt;br /&gt;
		end&lt;br /&gt;
		out[#out + 1] = &#039;|-\n| &#039; .. table.concat( cells, &#039; || &#039; )&lt;br /&gt;
	end&lt;br /&gt;
	out[#out + 1] = &#039;|}&#039;&lt;br /&gt;
	if wide then&lt;br /&gt;
		out[#out + 1] = &#039;&amp;lt;/div&amp;gt;&#039;&lt;br /&gt;
	end&lt;br /&gt;
	return frame:preprocess( table.concat( out, &#039;\n&#039; ) )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- {{#invoke:GameData|skillmods_all}}: every &amp;quot;+N to &amp;lt;skill&amp;gt;&amp;quot; item modifier, by slot.&lt;br /&gt;
function p.skillmods_all( frame )&lt;br /&gt;
	local mods = mw.ext.cargo.query( &#039;SkillItemModifier&#039;, &#039;wiki_page,slot,affix,tiers&#039;, {&lt;br /&gt;
		orderBy = &#039;slot,wiki_page&#039;,&lt;br /&gt;
		limit = 5000,&lt;br /&gt;
	} )&lt;br /&gt;
	local out, current = {}, nil&lt;br /&gt;
	for _, mod in ipairs( mods ) do&lt;br /&gt;
		if mod.slot ~= current then&lt;br /&gt;
			if current then&lt;br /&gt;
				out[#out + 1] = &#039;|}&#039;&lt;br /&gt;
			end&lt;br /&gt;
			current = mod.slot&lt;br /&gt;
			out[#out + 1] = &#039;== &#039; .. current .. &#039; ==&#039;&lt;br /&gt;
			out[#out + 1] = &#039;{| class=&amp;quot;wikitable sortable&amp;quot;\n! Skill !! Affix !! Skill levels by tier&#039;&lt;br /&gt;
		end&lt;br /&gt;
		out[#out + 1] = &#039;|-\n| &#039; .. pageLink( mod.wiki_page ) .. &#039; || &#039; .. ( mod.affix or &#039;&#039; ) .. &#039; || &#039; .. ( mod.tiers or &#039;&#039; )&lt;br /&gt;
	end&lt;br /&gt;
	if current then&lt;br /&gt;
		out[#out + 1] = &#039;|}&#039;&lt;br /&gt;
	end&lt;br /&gt;
	return frame:preprocess( table.concat( out, &#039;\n&#039; ) )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Used by the &amp;quot;&amp;lt;Label&amp;gt; data&amp;quot; templates: shows the stored record on its Data: page.&lt;br /&gt;
function p.record( frame )&lt;br /&gt;
	local t = schema.types[frame.args.type]&lt;br /&gt;
	if not t then&lt;br /&gt;
		return &#039;&#039;&lt;br /&gt;
	end&lt;br /&gt;
	local args = frame:getParent().args&lt;br /&gt;
	local out = { &#039;{| class=&amp;quot;wikitable&amp;quot;&#039; }&lt;br /&gt;
	for _, f in ipairs( t.fields ) do&lt;br /&gt;
		local value = args[f.name]&lt;br /&gt;
		if value and value ~= &#039;&#039; then&lt;br /&gt;
			out[#out + 1] = &#039;|-\n! &#039; .. f.name .. &#039;\n| &#039; .. ( formatValue( f, value, args ) or &#039;&#039; )&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	out[#out + 1] = &#039;|}&#039;&lt;br /&gt;
	if args.wiki_page and args.wiki_page ~= &#039;&#039; then&lt;br /&gt;
		out[#out + 1] = &#039;Article: &#039; .. pageLink( args.wiki_page )&lt;br /&gt;
	end&lt;br /&gt;
	return frame:preprocess( table.concat( out, &#039;\n&#039; ) )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>LongJump bot</name></author>
	</entry>
	<entry>
		<id>https://nwrx.wiki.longjump.dev/index.php?title=Category:Modes&amp;diff=655</id>
		<title>Category:Modes</title>
		<link rel="alternate" type="text/html" href="https://nwrx.wiki.longjump.dev/index.php?title=Category:Modes&amp;diff=655"/>
		<updated>2026-11-04T00:20:02Z</updated>

		<summary type="html">&lt;p&gt;LongJump bot: Game data from 645555d&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;All Modes.&lt;/div&gt;</summary>
		<author><name>LongJump bot</name></author>
	</entry>
	<entry>
		<id>https://nwrx.wiki.longjump.dev/index.php?title=Category:Stages&amp;diff=654</id>
		<title>Category:Stages</title>
		<link rel="alternate" type="text/html" href="https://nwrx.wiki.longjump.dev/index.php?title=Category:Stages&amp;diff=654"/>
		<updated>2026-11-04T00:20:02Z</updated>

		<summary type="html">&lt;p&gt;LongJump bot: Game data from 645555d&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;All Stages.&lt;/div&gt;</summary>
		<author><name>LongJump bot</name></author>
	</entry>
	<entry>
		<id>https://nwrx.wiki.longjump.dev/index.php?title=Category:Bosses&amp;diff=653</id>
		<title>Category:Bosses</title>
		<link rel="alternate" type="text/html" href="https://nwrx.wiki.longjump.dev/index.php?title=Category:Bosses&amp;diff=653"/>
		<updated>2026-11-04T00:20:02Z</updated>

		<summary type="html">&lt;p&gt;LongJump bot: Game data from 645555d&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;All Bosses.&lt;/div&gt;</summary>
		<author><name>LongJump bot</name></author>
	</entry>
	<entry>
		<id>https://nwrx.wiki.longjump.dev/index.php?title=Category:Enemies&amp;diff=652</id>
		<title>Category:Enemies</title>
		<link rel="alternate" type="text/html" href="https://nwrx.wiki.longjump.dev/index.php?title=Category:Enemies&amp;diff=652"/>
		<updated>2026-11-04T00:20:02Z</updated>

		<summary type="html">&lt;p&gt;LongJump bot: Game data from 645555d&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;All Enemies.&lt;/div&gt;</summary>
		<author><name>LongJump bot</name></author>
	</entry>
	<entry>
		<id>https://nwrx.wiki.longjump.dev/index.php?title=Category:Characters&amp;diff=651</id>
		<title>Category:Characters</title>
		<link rel="alternate" type="text/html" href="https://nwrx.wiki.longjump.dev/index.php?title=Category:Characters&amp;diff=651"/>
		<updated>2026-11-04T00:20:02Z</updated>

		<summary type="html">&lt;p&gt;LongJump bot: Game data from 645555d&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;All Characters.&lt;/div&gt;</summary>
		<author><name>LongJump bot</name></author>
	</entry>
	<entry>
		<id>https://nwrx.wiki.longjump.dev/index.php?title=Data:Boss/Zeros&amp;diff=650</id>
		<title>Data:Boss/Zeros</title>
		<link rel="alternate" type="text/html" href="https://nwrx.wiki.longjump.dev/index.php?title=Data:Boss/Zeros&amp;diff=650"/>
		<updated>2026-11-04T00:20:02Z</updated>

		<summary type="html">&lt;p&gt;LongJump bot: Game data from 645555d&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Boss data&lt;br /&gt;
|wiki_page=Zeros&lt;br /&gt;
|name=Zeros&lt;br /&gt;
|icon=Boss Zeros.png&lt;br /&gt;
|modes=Normal, Hard&lt;br /&gt;
|shown_names=Zeros&lt;br /&gt;
|game_version=645555d (demo build of v2.2)&lt;br /&gt;
|source_id=data/chars/zeros/&lt;br /&gt;
}}&lt;br /&gt;
{{Variant row|wiki_page=Zeros|ordinal=1|mode=Normal|shown_name=Zeros|health=370|damage_taken=120%|boss=1|spawns=1}}&lt;br /&gt;
{{Variant row|wiki_page=Zeros|ordinal=2|mode=Hard|shown_name=Zeros|health=370|damage_taken=100%|boss=1|spawns=1}}&lt;br /&gt;
{{Playable row|wiki_page=Zeros|ordinal=1|health=160|mp=120|speed=14.0|jump_height=2.5}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Zeros|ordinal=1|input=Attack, 1st or 2nd press in a row|cancels_from=|damage=8|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Zeros|ordinal=2|input=Attack, 3rd press in a row|cancels_from=|damage=12|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Zeros|ordinal=3|input=Up + Attack while lying down|cancels_from=|damage=12, 12|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Zeros|ordinal=4|input=Jump|cancels_from=|damage=13|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Zeros|ordinal=5|input=Crouch Attack|cancels_from=|damage=12, 12|mp_cost=10|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Zeros|ordinal=6|input=Charge Sweep|cancels_from=|damage=No damage|mp_cost=10|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Zeros|ordinal=7|input=Block|cancels_from=|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Zeros|ordinal=8|input=Block|cancels_from=Attack, 1st or 2nd press in a row|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Zeros|ordinal=9|input=Block|cancels_from=Attack, 3rd press in a row|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Zeros|ordinal=10|input=Block|cancels_from=Jump|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Zeros|ordinal=11|input=Block|cancels_from=Crouch Attack|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Zeros|ordinal=12|input=Block|cancels_from=Charge Sweep|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Zeros|ordinal=13|input=When it hits|cancels_from=Charge Sweep|damage=18 (throw)|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Zeros|ordinal=14|input=Block|cancels_from=Follow-up on a hit|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Zeros|ordinal=15|input=Block|cancels_from=Block|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Zeros|ordinal=16|input=Jump|cancels_from=Block|damage=13|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Zeros|ordinal=17|input=Crouch Attack|cancels_from=Block|damage=12, 12|mp_cost=10|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Zeros|ordinal=18|input=Block|cancels_from=Getting hit|damage=12, 12|mp_cost=10|only_when=}}&lt;/div&gt;</summary>
		<author><name>LongJump bot</name></author>
	</entry>
	<entry>
		<id>https://nwrx.wiki.longjump.dev/index.php?title=Data:Enemy/Snake&amp;diff=649</id>
		<title>Data:Enemy/Snake</title>
		<link rel="alternate" type="text/html" href="https://nwrx.wiki.longjump.dev/index.php?title=Data:Enemy/Snake&amp;diff=649"/>
		<updated>2026-11-04T00:20:01Z</updated>

		<summary type="html">&lt;p&gt;LongJump bot: Game data from 645555d&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Enemy data&lt;br /&gt;
|wiki_page=Snake&lt;br /&gt;
|name=Snake&lt;br /&gt;
|icon=Enemy Snake.png&lt;br /&gt;
|modes=Normal, Hard, Extra&lt;br /&gt;
|shown_names=Snake, Snake Captain&lt;br /&gt;
|game_version=645555d (demo build of v2.2)&lt;br /&gt;
|source_id=data/chars/snake/&lt;br /&gt;
}}&lt;br /&gt;
{{Variant row|wiki_page=Snake|ordinal=1|mode=Normal|shown_name=Snake|health=20|damage_taken=150%|boss=0|spawns=149}}&lt;br /&gt;
{{Variant row|wiki_page=Snake|ordinal=2|mode=Normal|shown_name=Snake|health=20|damage_taken=100%|boss=0|spawns=1}}&lt;br /&gt;
{{Variant row|wiki_page=Snake|ordinal=3|mode=Hard|shown_name=Snake|health=20|damage_taken=100%|boss=0|spawns=90}}&lt;br /&gt;
{{Variant row|wiki_page=Snake|ordinal=4|mode=Hard|shown_name=Snake Captain|health=26|damage_taken=100%|boss=0|spawns=64}}&lt;br /&gt;
{{Variant row|wiki_page=Snake|ordinal=5|mode=Extra|shown_name=Snake Captain|health=26|damage_taken=100%|boss=0|spawns=38}}&lt;br /&gt;
{{Playable row|wiki_page=Snake|ordinal=1|health=160|mp=120|speed=12.0|jump_height=2.5}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Snake|ordinal=1|input=Attack, 1st or 2nd press in a row|cancels_from=|damage=5|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Snake|ordinal=2|input=Attack, 3rd press in a row|cancels_from=|damage=8|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Snake|ordinal=3|input=Jump, Attack|cancels_from=|damage=10|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Snake|ordinal=4|input=Crouch Attack|cancels_from=|damage=8|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Snake|ordinal=5|input=Charge Sweep|cancels_from=|damage=8|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Snake|ordinal=6|input=Block|cancels_from=|damage=8, 8|mp_cost=20|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Snake|ordinal=7|input=Block|cancels_from=Getting hit|damage=8, 8|mp_cost=10|only_when=}}&lt;/div&gt;</summary>
		<author><name>LongJump bot</name></author>
	</entry>
	<entry>
		<id>https://nwrx.wiki.longjump.dev/index.php?title=Data:Boss/Silverman&amp;diff=648</id>
		<title>Data:Boss/Silverman</title>
		<link rel="alternate" type="text/html" href="https://nwrx.wiki.longjump.dev/index.php?title=Data:Boss/Silverman&amp;diff=648"/>
		<updated>2026-11-04T00:20:01Z</updated>

		<summary type="html">&lt;p&gt;LongJump bot: Game data from 645555d&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Boss data&lt;br /&gt;
|wiki_page=Silverman&lt;br /&gt;
|name=Silverman&lt;br /&gt;
|icon=Boss Silverman.png&lt;br /&gt;
|modes=Normal, Hard&lt;br /&gt;
|shown_names=Silverman&lt;br /&gt;
|game_version=645555d (demo build of v2.2)&lt;br /&gt;
|source_id=data/chars/silverman/&lt;br /&gt;
}}&lt;br /&gt;
{{Variant row|wiki_page=Silverman|ordinal=1|mode=Normal|shown_name=Silverman|health=330|damage_taken=120%|boss=1|spawns=1}}&lt;br /&gt;
{{Variant row|wiki_page=Silverman|ordinal=2|mode=Hard|shown_name=Silverman|health=330|damage_taken=100%|boss=1|spawns=1}}&lt;br /&gt;
{{Playable row|wiki_page=Silverman|ordinal=1|health=160|mp=120|speed=14.0|jump_height=2.2}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Silverman|ordinal=1|input=Attack, 1st or 2nd press in a row|cancels_from=|damage=6|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Silverman|ordinal=2|input=Attack, 3rd press in a row|cancels_from=|damage=11|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Silverman|ordinal=3|input=Crouch Attack|cancels_from=|damage=No damage|mp_cost=5|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Silverman|ordinal=4|input=Charge Sweep|cancels_from=|damage=12 (Fire2)|mp_cost=10|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Silverman|ordinal=5|input=Charge Bomb|cancels_from=|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Silverman|ordinal=6|input=Block|cancels_from=|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Silverman|ordinal=7|input=Block|cancels_from=Attack, 1st or 2nd press in a row|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Silverman|ordinal=8|input=Crouch Attack|cancels_from=Attack, 3rd press in a row|damage=No damage|mp_cost=5|only_when=After 1 hit}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Silverman|ordinal=9|input=Charge Sweep|cancels_from=Attack, 3rd press in a row|damage=12 (Fire2)|mp_cost=10|only_when=After 1 hit}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Silverman|ordinal=10|input=Block|cancels_from=Attack, 3rd press in a row|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Silverman|ordinal=11|input=Block|cancels_from=Crouch Attack|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Silverman|ordinal=12|input=Block|cancels_from=Charge Sweep|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Silverman|ordinal=13|input=Block|cancels_from=Charge Bomb|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Silverman|ordinal=14|input=Block|cancels_from=Attack|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Silverman|ordinal=15|input=Block|cancels_from=Block|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Silverman|ordinal=16|input=Charge Sweep|cancels_from=Block|damage=No damage|mp_cost=10|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Silverman|ordinal=17|input=Crouch Attack|cancels_from=Block|damage=No damage|mp_cost=15|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Silverman|ordinal=18|input=Attack|cancels_from=Block|damage=11|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Silverman|ordinal=19|input=Block|cancels_from=Getting hit|damage=11, 11|mp_cost=10|only_when=}}&lt;/div&gt;</summary>
		<author><name>LongJump bot</name></author>
	</entry>
	<entry>
		<id>https://nwrx.wiki.longjump.dev/index.php?title=Data:Enemy/Shadow_Man&amp;diff=647</id>
		<title>Data:Enemy/Shadow Man</title>
		<link rel="alternate" type="text/html" href="https://nwrx.wiki.longjump.dev/index.php?title=Data:Enemy/Shadow_Man&amp;diff=647"/>
		<updated>2026-11-04T00:20:00Z</updated>

		<summary type="html">&lt;p&gt;LongJump bot: Game data from 645555d&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Enemy data&lt;br /&gt;
|wiki_page=Shadow Man&lt;br /&gt;
|name=Shadow Man&lt;br /&gt;
|icon=Enemy Shadow Man.png&lt;br /&gt;
|modes=Normal, Hard, Extra&lt;br /&gt;
|shown_names=Shadow Man, Shadow Man Blue, Shadow Man Green, Shadow Man White&lt;br /&gt;
|game_version=645555d (demo build of v2.2)&lt;br /&gt;
|source_id=data/chars/shadow/&lt;br /&gt;
}}&lt;br /&gt;
{{Variant row|wiki_page=Shadow Man|ordinal=1|mode=Normal|shown_name=Shadow Man|health=48|damage_taken=150%|boss=0|spawns=71}}&lt;br /&gt;
{{Variant row|wiki_page=Shadow Man|ordinal=2|mode=Normal|shown_name=Shadow Man|health=48|damage_taken=100%|boss=0|spawns=1}}&lt;br /&gt;
{{Variant row|wiki_page=Shadow Man|ordinal=3|mode=Hard|shown_name=Shadow Man Blue|health=40|damage_taken=100%|boss=0|spawns=22}}&lt;br /&gt;
{{Variant row|wiki_page=Shadow Man|ordinal=4|mode=Hard|shown_name=Shadow Man Green|health=48|damage_taken=100%|boss=0|spawns=22}}&lt;br /&gt;
{{Variant row|wiki_page=Shadow Man|ordinal=5|mode=Hard|shown_name=Shadow Man White|health=60|damage_taken=100%|boss=0|spawns=18}}&lt;br /&gt;
{{Variant row|wiki_page=Shadow Man|ordinal=6|mode=Extra|shown_name=Shadow Man Blue|health=40|damage_taken=100%|boss=0|spawns=13}}&lt;br /&gt;
{{Variant row|wiki_page=Shadow Man|ordinal=7|mode=Extra|shown_name=Shadow Man White|health=60|damage_taken=100%|boss=0|spawns=9}}&lt;br /&gt;
{{Playable row|wiki_page=Shadow Man|ordinal=1|health=160|mp=120|speed=14.0|jump_height=2.5}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Shadow Man|ordinal=1|input=Attack, 1st or 2nd press in a row|cancels_from=|damage=6|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Shadow Man|ordinal=2|input=Attack, 3rd press in a row|cancels_from=|damage=6|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Shadow Man|ordinal=3|input=Jump, Attack|cancels_from=|damage=6|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Shadow Man|ordinal=4|input=Crouch Attack|cancels_from=|damage=6|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Shadow Man|ordinal=5|input=Charge Sweep|cancels_from=|damage=7 (Shuriken)|mp_cost=10|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Shadow Man|ordinal=6|input=Charge Bomb|cancels_from=|damage=7 (Shuriken)|mp_cost=10|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Shadow Man|ordinal=7|input=Block|cancels_from=|damage=6, 6|mp_cost=20|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Shadow Man|ordinal=8|input=Block|cancels_from=Getting hit|damage=6, 6|mp_cost=10|only_when=}}&lt;/div&gt;</summary>
		<author><name>LongJump bot</name></author>
	</entry>
	<entry>
		<id>https://nwrx.wiki.longjump.dev/index.php?title=Data:Enemy/Puma&amp;diff=646</id>
		<title>Data:Enemy/Puma</title>
		<link rel="alternate" type="text/html" href="https://nwrx.wiki.longjump.dev/index.php?title=Data:Enemy/Puma&amp;diff=646"/>
		<updated>2026-11-04T00:20:00Z</updated>

		<summary type="html">&lt;p&gt;LongJump bot: Game data from 645555d&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Enemy data&lt;br /&gt;
|wiki_page=Puma&lt;br /&gt;
|name=Puma&lt;br /&gt;
|icon=Enemy Puma.png&lt;br /&gt;
|modes=Normal, Hard, Extra&lt;br /&gt;
|shown_names=Puma, Puma Type II&lt;br /&gt;
|game_version=645555d (demo build of v2.2)&lt;br /&gt;
|source_id=data/chars/puma/&lt;br /&gt;
}}&lt;br /&gt;
{{Variant row|wiki_page=Puma|ordinal=1|mode=Normal|shown_name=Puma|health=70|damage_taken=150%|boss=0|spawns=41}}&lt;br /&gt;
{{Variant row|wiki_page=Puma|ordinal=2|mode=Hard|shown_name=Puma|health=70|damage_taken=100%|boss=0|spawns=17}}&lt;br /&gt;
{{Variant row|wiki_page=Puma|ordinal=3|mode=Hard|shown_name=Puma Type II|health=70|damage_taken=100%|boss=0|spawns=19}}&lt;br /&gt;
{{Variant row|wiki_page=Puma|ordinal=4|mode=Extra|shown_name=Puma|health=70|damage_taken=100%|boss=0|spawns=7}}&lt;br /&gt;
{{Variant row|wiki_page=Puma|ordinal=5|mode=Extra|shown_name=Puma Type II|health=70|damage_taken=100%|boss=0|spawns=7}}&lt;br /&gt;
{{Playable row|wiki_page=Puma|ordinal=1|health=160|mp=120|speed=15.0|jump_height=2.5}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Puma|ordinal=1|input=Attack, 1st or 2nd press in a row|cancels_from=|damage=7|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Puma|ordinal=2|input=Attack, 3rd press in a row|cancels_from=|damage=7|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Puma|ordinal=3|input=Jump|cancels_from=|damage=8|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Puma|ordinal=4|input=Crouch Attack|cancels_from=|damage=8|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Puma|ordinal=5|input=Charge Sweep|cancels_from=|damage=9|mp_cost=10|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Puma|ordinal=6|input=Block|cancels_from=|damage=8, 8|mp_cost=20|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Puma|ordinal=7|input=Block|cancels_from=Getting hit|damage=8, 8|mp_cost=10|only_when=}}&lt;/div&gt;</summary>
		<author><name>LongJump bot</name></author>
	</entry>
	<entry>
		<id>https://nwrx.wiki.longjump.dev/index.php?title=Data:Boss/Phobos&amp;diff=645</id>
		<title>Data:Boss/Phobos</title>
		<link rel="alternate" type="text/html" href="https://nwrx.wiki.longjump.dev/index.php?title=Data:Boss/Phobos&amp;diff=645"/>
		<updated>2026-11-04T00:19:59Z</updated>

		<summary type="html">&lt;p&gt;LongJump bot: Game data from 645555d&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Boss data&lt;br /&gt;
|wiki_page=Phobos&lt;br /&gt;
|name=Phobos&lt;br /&gt;
|icon=Boss Phobos.png&lt;br /&gt;
|modes=Normal, Hard&lt;br /&gt;
|shown_names=Phobos&lt;br /&gt;
|game_version=645555d (demo build of v2.2)&lt;br /&gt;
|source_id=data/chars/phobos/&lt;br /&gt;
}}&lt;br /&gt;
{{Variant row|wiki_page=Phobos|ordinal=1|mode=Normal|shown_name=Phobos|health=390|damage_taken=120%|boss=1|spawns=1}}&lt;br /&gt;
{{Variant row|wiki_page=Phobos|ordinal=2|mode=Hard|shown_name=Phobos|health=390|damage_taken=100%|boss=1|spawns=1}}&lt;br /&gt;
{{Playable row|wiki_page=Phobos|ordinal=1|health=160|mp=120|speed=11.0|jump_height=2.5}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Phobos|ordinal=1|input=Attack, 1st or 2nd press in a row|cancels_from=|damage=10|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Phobos|ordinal=2|input=Attack, 3rd press in a row|cancels_from=|damage=14|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Phobos|ordinal=3|input=Jump, Attack|cancels_from=|damage=14|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Phobos|ordinal=4|input=Attack while holding an enemy (1st and 2nd press)|cancels_from=|damage=20 (throw)|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Phobos|ordinal=5|input=Attack while holding an enemy (3rd press), or Jump|cancels_from=|damage=20 (throw)|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Phobos|ordinal=6|input=Back + Attack while holding an enemy|cancels_from=|damage=20 (throw)|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Phobos|ordinal=7|input=Up + Attack while lying down|cancels_from=|damage=14|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Phobos|ordinal=8|input=Crouch Attack|cancels_from=|damage=No damage|mp_cost=10|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Phobos|ordinal=9|input=Charge Sweep|cancels_from=|damage=14|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Phobos|ordinal=10|input=Charge Bomb|cancels_from=|damage=17|mp_cost=20|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Phobos|ordinal=11|input=Block|cancels_from=|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Phobos|ordinal=12|input=Block|cancels_from=Landing|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Phobos|ordinal=13|input=Block|cancels_from=Attack while holding an enemy (1st and 2nd press)|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Phobos|ordinal=14|input=Block|cancels_from=Attack while holding an enemy (3rd press), or Jump|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Phobos|ordinal=15|input=Block|cancels_from=Back + Attack while holding an enemy|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Phobos|ordinal=16|input=Block|cancels_from=Attack, 1st or 2nd press in a row|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Phobos|ordinal=17|input=Block|cancels_from=Attack, 3rd press in a row|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Phobos|ordinal=18|input=Block|cancels_from=Attack|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Phobos|ordinal=19|input=Block|cancels_from=Crouch Attack|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Phobos|ordinal=20|input=When it hits|cancels_from=Crouch Attack|damage=20 (throw)|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Phobos|ordinal=21|input=Block|cancels_from=Follow-up on a hit|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Phobos|ordinal=22|input=Block|cancels_from=Charge Sweep|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Phobos|ordinal=23|input=Block|cancels_from=Charge Bomb|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Phobos|ordinal=24|input=Block|cancels_from=Jump|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Phobos|ordinal=25|input=Block|cancels_from=Block|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Phobos|ordinal=26|input=Attack|cancels_from=Block|damage=13|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Phobos|ordinal=27|input=Jump|cancels_from=Block|damage=No damage|mp_cost=10|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Phobos|ordinal=28|input=Block|cancels_from=Up + Attack while lying down|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Phobos|ordinal=29|input=Block|cancels_from=Getting hit|damage=14, 14|mp_cost=10|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Phobos|ordinal=30|input=Block|cancels_from=Getting up|damage=No damage|only_when=}}&lt;/div&gt;</summary>
		<author><name>LongJump bot</name></author>
	</entry>
	<entry>
		<id>https://nwrx.wiki.longjump.dev/index.php?title=Data:Boss/Phantom_Gecko&amp;diff=644</id>
		<title>Data:Boss/Phantom Gecko</title>
		<link rel="alternate" type="text/html" href="https://nwrx.wiki.longjump.dev/index.php?title=Data:Boss/Phantom_Gecko&amp;diff=644"/>
		<updated>2026-11-04T00:19:59Z</updated>

		<summary type="html">&lt;p&gt;LongJump bot: Game data from 645555d&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Boss data&lt;br /&gt;
|wiki_page=Phantom Gecko&lt;br /&gt;
|name=Phantom Gecko&lt;br /&gt;
|icon=Boss Phantom Gecko.png&lt;br /&gt;
|modes=Normal, Hard&lt;br /&gt;
|shown_names=Phantom Gecko&lt;br /&gt;
|game_version=645555d (demo build of v2.2)&lt;br /&gt;
|source_id=data/chars/yamori/&lt;br /&gt;
}}&lt;br /&gt;
{{Variant row|wiki_page=Phantom Gecko|ordinal=1|mode=Normal|shown_name=Phantom Gecko|health=320|damage_taken=120%|boss=1|spawns=1}}&lt;br /&gt;
{{Variant row|wiki_page=Phantom Gecko|ordinal=2|mode=Hard|shown_name=Phantom Gecko|health=320|damage_taken=100%|boss=1|spawns=1}}&lt;br /&gt;
{{Playable row|wiki_page=Phantom Gecko|ordinal=1|health=160|mp=120|speed=15.0|jump_height=2.5}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Phantom Gecko|ordinal=1|input=Attack, 1st press in a row|cancels_from=|damage=5|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Phantom Gecko|ordinal=2|input=Attack, 2nd or 3rd or 4th press in a row|cancels_from=|damage=6|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Phantom Gecko|ordinal=3|input=Attack, 5th press in a row|cancels_from=|damage=7|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Phantom Gecko|ordinal=4|input=Jump while moving, Attack|cancels_from=|damage=9|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Phantom Gecko|ordinal=5|input=Up + Attack while lying down|cancels_from=|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Phantom Gecko|ordinal=6|input=Crouch Attack|cancels_from=|damage=No damage|mp_cost=5|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Phantom Gecko|ordinal=7|input=Charge Sweep|cancels_from=|damage=No damage|mp_cost=10|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Phantom Gecko|ordinal=8|input=Charge Bomb|cancels_from=|damage=No damage|mp_cost=15|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Phantom Gecko|ordinal=9|input=Block|cancels_from=|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Phantom Gecko|ordinal=10|input=Attack|cancels_from=Jump while moving, Attack|damage=9|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Phantom Gecko|ordinal=11|input=Block|cancels_from=Jump while moving, Attack|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Phantom Gecko|ordinal=12|input=Attack|cancels_from=Attack|damage=9|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Phantom Gecko|ordinal=13|input=Block|cancels_from=Attack|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Phantom Gecko|ordinal=14|input=Block|cancels_from=Crouch Attack|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Phantom Gecko|ordinal=15|input=Block|cancels_from=Charge Sweep|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Phantom Gecko|ordinal=16|input=Block|cancels_from=Charge Bomb|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Phantom Gecko|ordinal=17|input=Block|cancels_from=Block|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Phantom Gecko|ordinal=18|input=Forward, Forward|cancels_from=Block|damage=No damage|mp_cost=10|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Phantom Gecko|ordinal=19|input=Charge Bomb|cancels_from=Block|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Phantom Gecko|ordinal=20|input=Block|cancels_from=Up + Attack while lying down|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Phantom Gecko|ordinal=21|input=Block|cancels_from=Getting hit|damage=5, 5|mp_cost=10|only_when=}}&lt;/div&gt;</summary>
		<author><name>LongJump bot</name></author>
	</entry>
	<entry>
		<id>https://nwrx.wiki.longjump.dev/index.php?title=Data:Enemy/Panther&amp;diff=643</id>
		<title>Data:Enemy/Panther</title>
		<link rel="alternate" type="text/html" href="https://nwrx.wiki.longjump.dev/index.php?title=Data:Enemy/Panther&amp;diff=643"/>
		<updated>2026-11-04T00:19:58Z</updated>

		<summary type="html">&lt;p&gt;LongJump bot: Game data from 645555d&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Enemy data&lt;br /&gt;
|wiki_page=Panther&lt;br /&gt;
|name=Panther&lt;br /&gt;
|icon=Enemy Panther.png&lt;br /&gt;
|modes=Normal, Hard, Extra&lt;br /&gt;
|shown_names=Panther, Panther Leader&lt;br /&gt;
|game_version=645555d (demo build of v2.2)&lt;br /&gt;
|source_id=data/chars/panther/&lt;br /&gt;
}}&lt;br /&gt;
{{Variant row|wiki_page=Panther|ordinal=1|mode=Normal|shown_name=Panther|health=34|damage_taken=150%|boss=0|spawns=154}}&lt;br /&gt;
{{Variant row|wiki_page=Panther|ordinal=2|mode=Normal|shown_name=Panther Leader|health=34|damage_taken=150%|boss=0|spawns=2}}&lt;br /&gt;
{{Variant row|wiki_page=Panther|ordinal=3|mode=Hard|shown_name=Panther|health=34|damage_taken=100%|boss=0|spawns=85}}&lt;br /&gt;
{{Variant row|wiki_page=Panther|ordinal=4|mode=Hard|shown_name=Panther Leader|health=40|damage_taken=100%|boss=0|spawns=73}}&lt;br /&gt;
{{Variant row|wiki_page=Panther|ordinal=5|mode=Extra|shown_name=Panther|health=34|damage_taken=100%|boss=0|spawns=4}}&lt;br /&gt;
{{Variant row|wiki_page=Panther|ordinal=6|mode=Extra|shown_name=Panther Leader|health=40|damage_taken=100%|boss=0|spawns=28}}&lt;br /&gt;
{{Playable row|wiki_page=Panther|ordinal=1|health=160|mp=120|speed=12.0|jump_height=2.5}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Panther|ordinal=1|input=Attack, 1st or 2nd press in a row|cancels_from=|damage=5|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Panther|ordinal=2|input=Attack, 3rd press in a row|cancels_from=|damage=8|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Panther|ordinal=3|input=Jump, Attack|cancels_from=|damage=10|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Panther|ordinal=4|input=Crouch Attack|cancels_from=|damage=8|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Panther|ordinal=5|input=Charge Sweep|cancels_from=|damage=8|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Panther|ordinal=6|input=Block|cancels_from=|damage=8, 8|mp_cost=20|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Panther|ordinal=7|input=Block|cancels_from=Getting hit|damage=8, 8|mp_cost=10|only_when=}}&lt;/div&gt;</summary>
		<author><name>LongJump bot</name></author>
	</entry>
	<entry>
		<id>https://nwrx.wiki.longjump.dev/index.php?title=Data:Enemy/Over_Shinobu&amp;diff=642</id>
		<title>Data:Enemy/Over Shinobu</title>
		<link rel="alternate" type="text/html" href="https://nwrx.wiki.longjump.dev/index.php?title=Data:Enemy/Over_Shinobu&amp;diff=642"/>
		<updated>2026-11-04T00:19:58Z</updated>

		<summary type="html">&lt;p&gt;LongJump bot: Game data from 645555d&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Enemy data&lt;br /&gt;
|wiki_page=Over Shinobu&lt;br /&gt;
|name=Over Shinobu&lt;br /&gt;
|icon=Enemy Over Shinobu.png&lt;br /&gt;
|modes=Normal, Hard, Extra&lt;br /&gt;
|shown_names=Over Shinobu, Over Shinobu Max&lt;br /&gt;
|game_version=645555d (demo build of v2.2)&lt;br /&gt;
|source_id=data/chars/shinobu/&lt;br /&gt;
}}&lt;br /&gt;
{{Variant row|wiki_page=Over Shinobu|ordinal=1|mode=Normal|shown_name=Over Shinobu|health=80|damage_taken=150%|boss=0|spawns=31}}&lt;br /&gt;
{{Variant row|wiki_page=Over Shinobu|ordinal=2|mode=Hard|shown_name=Over Shinobu|health=80|damage_taken=100%|boss=0|spawns=25}}&lt;br /&gt;
{{Variant row|wiki_page=Over Shinobu|ordinal=3|mode=Hard|shown_name=Over Shinobu Max|health=120|damage_taken=100%|boss=0|spawns=7}}&lt;br /&gt;
{{Variant row|wiki_page=Over Shinobu|ordinal=4|mode=Extra|shown_name=Over Shinobu Max|health=120|damage_taken=100%|boss=0|spawns=4}}&lt;br /&gt;
{{Playable row|wiki_page=Over Shinobu|ordinal=1|health=160|mp=120|speed=10.0|jump_height=2.5}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Over Shinobu|ordinal=1|input=Attack, 1st or 2nd press in a row|cancels_from=|damage=7|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Over Shinobu|ordinal=2|input=Attack, 3rd press in a row|cancels_from=|damage=13|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Over Shinobu|ordinal=3|input=Jump, Attack|cancels_from=|damage=12|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Over Shinobu|ordinal=4|input=Attack while holding an enemy (1st and 2nd press)|cancels_from=|damage=15 (finish)|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Over Shinobu|ordinal=5|input=Attack while holding an enemy (3rd press), or Jump|cancels_from=|damage=15 (finish)|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Over Shinobu|ordinal=6|input=Back + Attack while holding an enemy|cancels_from=|damage=15 (finish)|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Over Shinobu|ordinal=7|input=Up + Attack while lying down|cancels_from=|damage=12|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Over Shinobu|ordinal=8|input=Crouch Attack|cancels_from=|damage=13|mp_cost=10|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Over Shinobu|ordinal=9|input=Charge Sweep|cancels_from=|damage=No damage|mp_cost=10|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Over Shinobu|ordinal=10|input=Block|cancels_from=|damage=7, 7|mp_cost=20|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Over Shinobu|ordinal=11|input=When it hits|cancels_from=Charge Sweep|damage=15 (finish)|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Over Shinobu|ordinal=12|input=Block|cancels_from=Getting hit|damage=7, 7|mp_cost=10|only_when=}}&lt;/div&gt;</summary>
		<author><name>LongJump bot</name></author>
	</entry>
	<entry>
		<id>https://nwrx.wiki.longjump.dev/index.php?title=Data:Enemy/Monkey&amp;diff=641</id>
		<title>Data:Enemy/Monkey</title>
		<link rel="alternate" type="text/html" href="https://nwrx.wiki.longjump.dev/index.php?title=Data:Enemy/Monkey&amp;diff=641"/>
		<updated>2026-11-04T00:19:58Z</updated>

		<summary type="html">&lt;p&gt;LongJump bot: Game data from 645555d&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Enemy data&lt;br /&gt;
|wiki_page=Monkey&lt;br /&gt;
|name=Monkey&lt;br /&gt;
|icon=Enemy Monkey.png&lt;br /&gt;
|modes=Normal, Hard, Extra&lt;br /&gt;
|shown_names=Monkey&lt;br /&gt;
|game_version=645555d (demo build of v2.2)&lt;br /&gt;
|source_id=data/chars/monkey/&lt;br /&gt;
}}&lt;br /&gt;
{{Variant row|wiki_page=Monkey|ordinal=1|mode=Normal|shown_name=Monkey|health=40|damage_taken=150%|boss=0|spawns=38}}&lt;br /&gt;
{{Variant row|wiki_page=Monkey|ordinal=2|mode=Hard|shown_name=Monkey|health=40|damage_taken=100%|boss=0|spawns=35}}&lt;br /&gt;
{{Variant row|wiki_page=Monkey|ordinal=3|mode=Extra|shown_name=Monkey|health=40|damage_taken=100%|boss=0|spawns=15}}&lt;br /&gt;
{{Playable row|wiki_page=Monkey|ordinal=1|health=160|mp=120|speed=13.0|jump_height=2.5}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Monkey|ordinal=1|input=Attack, 1st or 2nd press in a row|cancels_from=|damage=6|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Monkey|ordinal=2|input=Attack, 3rd press in a row|cancels_from=|damage=6|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Monkey|ordinal=3|input=Jump, Attack|cancels_from=|damage=10|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Monkey|ordinal=4|input=Crouch Attack|cancels_from=|damage=10|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Monkey|ordinal=5|input=Charge Sweep|cancels_from=|damage=10|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Monkey|ordinal=6|input=Block|cancels_from=|damage=6, 6|mp_cost=20|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Monkey|ordinal=7|input=Block|cancels_from=Getting hit|damage=6, 6|mp_cost=10|only_when=}}&lt;/div&gt;</summary>
		<author><name>LongJump bot</name></author>
	</entry>
	<entry>
		<id>https://nwrx.wiki.longjump.dev/index.php?title=Data:Enemy/MissileB&amp;diff=640</id>
		<title>Data:Enemy/MissileB</title>
		<link rel="alternate" type="text/html" href="https://nwrx.wiki.longjump.dev/index.php?title=Data:Enemy/MissileB&amp;diff=640"/>
		<updated>2026-11-04T00:19:57Z</updated>

		<summary type="html">&lt;p&gt;LongJump bot: Game data from 645555d&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Enemy data&lt;br /&gt;
|wiki_page=MissileB&lt;br /&gt;
|name=MissileB&lt;br /&gt;
|icon=Enemy MissileB.png&lt;br /&gt;
|modes=Normal, Hard&lt;br /&gt;
|shown_names=MissileA, MissileB&lt;br /&gt;
|game_version=645555d (demo build of v2.2)&lt;br /&gt;
|source_id=data/chars/misc/missile/&lt;br /&gt;
}}&lt;br /&gt;
{{Variant row|wiki_page=MissileB|ordinal=1|mode=Normal|shown_name=MissileA|health=0|damage_taken=100%|boss=0|spawns=1}}&lt;br /&gt;
{{Variant row|wiki_page=MissileB|ordinal=2|mode=Normal|shown_name=MissileB|health=0|damage_taken=100%|boss=0|spawns=3}}&lt;br /&gt;
{{Variant row|wiki_page=MissileB|ordinal=3|mode=Hard|shown_name=MissileA|health=0|damage_taken=100%|boss=0|spawns=1}}&lt;br /&gt;
{{Variant row|wiki_page=MissileB|ordinal=4|mode=Hard|shown_name=MissileB|health=0|damage_taken=100%|boss=0|spawns=3}}&lt;/div&gt;</summary>
		<author><name>LongJump bot</name></author>
	</entry>
	<entry>
		<id>https://nwrx.wiki.longjump.dev/index.php?title=Data:Enemy/Machine_Gun_Army&amp;diff=639</id>
		<title>Data:Enemy/Machine Gun Army</title>
		<link rel="alternate" type="text/html" href="https://nwrx.wiki.longjump.dev/index.php?title=Data:Enemy/Machine_Gun_Army&amp;diff=639"/>
		<updated>2026-11-04T00:19:57Z</updated>

		<summary type="html">&lt;p&gt;LongJump bot: Game data from 645555d&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Enemy data&lt;br /&gt;
|wiki_page=Machine Gun Army&lt;br /&gt;
|name=Machine Gun Army&lt;br /&gt;
|icon=Enemy Machine Gun Army.png&lt;br /&gt;
|modes=Normal, Hard, Extra&lt;br /&gt;
|shown_names=Machine Gun Army, Machine Gun Army A, Machine Gun Army B, Machine Gun Army C&lt;br /&gt;
|game_version=645555d (demo build of v2.2)&lt;br /&gt;
|source_id=data/chars/machine/&lt;br /&gt;
}}&lt;br /&gt;
{{Variant row|wiki_page=Machine Gun Army|ordinal=1|mode=Normal|shown_name=Machine Gun Army|health=28|damage_taken=150%|boss=0|spawns=116}}&lt;br /&gt;
{{Variant row|wiki_page=Machine Gun Army|ordinal=2|mode=Hard|shown_name=Machine Gun Army A|health=28|damage_taken=100%|boss=0|spawns=59}}&lt;br /&gt;
{{Variant row|wiki_page=Machine Gun Army|ordinal=3|mode=Hard|shown_name=Machine Gun Army B|health=34|damage_taken=100%|boss=0|spawns=38}}&lt;br /&gt;
{{Variant row|wiki_page=Machine Gun Army|ordinal=4|mode=Hard|shown_name=Machine Gun Army C|health=34|damage_taken=100%|boss=0|spawns=24}}&lt;br /&gt;
{{Variant row|wiki_page=Machine Gun Army|ordinal=5|mode=Extra|shown_name=Machine Gun Army B|health=34|damage_taken=100%|boss=0|spawns=27}}&lt;br /&gt;
{{Variant row|wiki_page=Machine Gun Army|ordinal=6|mode=Extra|shown_name=Machine Gun Army C|health=34|damage_taken=100%|boss=0|spawns=12}}&lt;br /&gt;
{{Playable row|wiki_page=Machine Gun Army|ordinal=1|health=160|mp=120|speed=13.0|jump_height=2.5}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Machine Gun Army|ordinal=1|input=Attack, 1st or 2nd press in a row|cancels_from=|damage=8|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Machine Gun Army|ordinal=2|input=Crouch Attack|cancels_from=|damage=No damage|mp_cost=10|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Machine Gun Army|ordinal=3|input=Charge Sweep|cancels_from=|damage=No damage|mp_cost=10|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Machine Gun Army|ordinal=4|input=Charge Bomb|cancels_from=|damage=No damage|mp_cost=10|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Machine Gun Army|ordinal=5|input=Block|cancels_from=|damage=8, 8|mp_cost=20|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Machine Gun Army|ordinal=6|input=Crouch Attack|cancels_from=Crouch Attack|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Machine Gun Army|ordinal=7|input=Charge Sweep|cancels_from=Charge Sweep|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Machine Gun Army|ordinal=8|input=Charge Bomb|cancels_from=Charge Bomb|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Machine Gun Army|ordinal=9|input=Charge Bomb|cancels_from=Charge Bomb|damage=No damage|mp_cost=10|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Machine Gun Army|ordinal=10|input=Block|cancels_from=Getting hit|damage=8, 8|mp_cost=10|only_when=}}&lt;/div&gt;</summary>
		<author><name>LongJump bot</name></author>
	</entry>
	<entry>
		<id>https://nwrx.wiki.longjump.dev/index.php?title=Data:Enemy/Kunoichi_(enemy)&amp;diff=638</id>
		<title>Data:Enemy/Kunoichi (enemy)</title>
		<link rel="alternate" type="text/html" href="https://nwrx.wiki.longjump.dev/index.php?title=Data:Enemy/Kunoichi_(enemy)&amp;diff=638"/>
		<updated>2026-11-04T00:19:56Z</updated>

		<summary type="html">&lt;p&gt;LongJump bot: Game data from 645555d&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Enemy data&lt;br /&gt;
|wiki_page=Kunoichi (enemy)&lt;br /&gt;
|name=Kunoichi&lt;br /&gt;
|icon=Enemy Kunoichi (enemy).png&lt;br /&gt;
|modes=Normal, Hard, Extra&lt;br /&gt;
|shown_names=Kunoichi, Kunoichi Master, Kunoichi Normal&lt;br /&gt;
|game_version=645555d (demo build of v2.2)&lt;br /&gt;
|source_id=data/chars/kunoi/&lt;br /&gt;
}}&lt;br /&gt;
{{Variant row|wiki_page=Kunoichi (enemy)|ordinal=1|mode=Normal|shown_name=Kunoichi|health=48|damage_taken=150%|boss=0|spawns=44}}&lt;br /&gt;
{{Variant row|wiki_page=Kunoichi (enemy)|ordinal=2|mode=Normal|shown_name=Kunoichi|health=48|damage_taken=100%|boss=0|spawns=7}}&lt;br /&gt;
{{Variant row|wiki_page=Kunoichi (enemy)|ordinal=3|mode=Hard|shown_name=Kunoichi Master|health=60|damage_taken=100%|boss=0|spawns=16}}&lt;br /&gt;
{{Variant row|wiki_page=Kunoichi (enemy)|ordinal=4|mode=Hard|shown_name=Kunoichi Normal|health=48|damage_taken=100%|boss=0|spawns=38}}&lt;br /&gt;
{{Variant row|wiki_page=Kunoichi (enemy)|ordinal=5|mode=Extra|shown_name=Kunoichi Master|health=60|damage_taken=100%|boss=0|spawns=26}}&lt;br /&gt;
{{Playable row|wiki_page=Kunoichi (enemy)|ordinal=1|health=160|mp=120|speed=13.0|jump_height=2.5}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kunoichi (enemy)|ordinal=1|input=Attack, 1st or 2nd press in a row|cancels_from=|damage=8|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kunoichi (enemy)|ordinal=2|input=Attack, 3rd press in a row|cancels_from=|damage=10|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kunoichi (enemy)|ordinal=3|input=Jump, Attack|cancels_from=|damage=10|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kunoichi (enemy)|ordinal=4|input=Crouch Attack|cancels_from=|damage=10|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kunoichi (enemy)|ordinal=5|input=Charge Sweep|cancels_from=|damage=No damage|mp_cost=10|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kunoichi (enemy)|ordinal=6|input=Block|cancels_from=|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kunoichi (enemy)|ordinal=7|input=Block|cancels_from=Jump, Attack|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kunoichi (enemy)|ordinal=8|input=Block|cancels_from=Landing|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kunoichi (enemy)|ordinal=9|input=Block|cancels_from=Attack, 1st or 2nd press in a row|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kunoichi (enemy)|ordinal=10|input=Block|cancels_from=Attack, 3rd press in a row|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kunoichi (enemy)|ordinal=11|input=Block|cancels_from=Crouch Attack|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kunoichi (enemy)|ordinal=12|input=Block|cancels_from=Jump|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kunoichi (enemy)|ordinal=13|input=Block|cancels_from=Block|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kunoichi (enemy)|ordinal=14|input=Crouch Attack|cancels_from=Block|damage=10|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kunoichi (enemy)|ordinal=15|input=Jump|cancels_from=Block|damage=No damage|mp_cost=5|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kunoichi (enemy)|ordinal=16|input=Block|cancels_from=Getting hit|damage=8, 8|mp_cost=10|only_when=}}&lt;/div&gt;</summary>
		<author><name>LongJump bot</name></author>
	</entry>
	<entry>
		<id>https://nwrx.wiki.longjump.dev/index.php?title=Data:Enemy/Knife_Army&amp;diff=637</id>
		<title>Data:Enemy/Knife Army</title>
		<link rel="alternate" type="text/html" href="https://nwrx.wiki.longjump.dev/index.php?title=Data:Enemy/Knife_Army&amp;diff=637"/>
		<updated>2026-11-04T00:19:56Z</updated>

		<summary type="html">&lt;p&gt;LongJump bot: Game data from 645555d&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Enemy data&lt;br /&gt;
|wiki_page=Knife Army&lt;br /&gt;
|name=Knife Army&lt;br /&gt;
|icon=Enemy Knife Army.png&lt;br /&gt;
|modes=Normal, Hard, Extra&lt;br /&gt;
|shown_names=Knife Army, Knife Army A, Knife Army B, Knife Army C, Knife Army D&lt;br /&gt;
|game_version=645555d (demo build of v2.2)&lt;br /&gt;
|source_id=data/chars/knife/&lt;br /&gt;
}}&lt;br /&gt;
{{Variant row|wiki_page=Knife Army|ordinal=1|mode=Normal|shown_name=Knife Army|health=12|damage_taken=150%|boss=0|spawns=603}}&lt;br /&gt;
{{Variant row|wiki_page=Knife Army|ordinal=2|mode=Normal|shown_name=Knife Army|health=12|damage_taken=100%|boss=0|spawns=3}}&lt;br /&gt;
{{Variant row|wiki_page=Knife Army|ordinal=3|mode=Normal|shown_name=Knife Army A|health=12|damage_taken=150%|boss=0|spawns=1}}&lt;br /&gt;
{{Variant row|wiki_page=Knife Army|ordinal=4|mode=Hard|shown_name=Knife Army A|health=12|damage_taken=100%|boss=0|spawns=283}}&lt;br /&gt;
{{Variant row|wiki_page=Knife Army|ordinal=5|mode=Hard|shown_name=Knife Army B|health=16|damage_taken=100%|boss=0|spawns=241}}&lt;br /&gt;
{{Variant row|wiki_page=Knife Army|ordinal=6|mode=Hard|shown_name=Knife Army C|health=16|damage_taken=100%|boss=0|spawns=44}}&lt;br /&gt;
{{Variant row|wiki_page=Knife Army|ordinal=7|mode=Hard|shown_name=Knife Army D|health=20|damage_taken=100%|boss=0|spawns=54}}&lt;br /&gt;
{{Variant row|wiki_page=Knife Army|ordinal=8|mode=Extra|shown_name=Knife Army B|health=16|damage_taken=100%|boss=0|spawns=66}}&lt;br /&gt;
{{Variant row|wiki_page=Knife Army|ordinal=9|mode=Extra|shown_name=Knife Army C|health=16|damage_taken=100%|boss=0|spawns=50}}&lt;br /&gt;
{{Variant row|wiki_page=Knife Army|ordinal=10|mode=Extra|shown_name=Knife Army D|health=20|damage_taken=100%|boss=0|spawns=29}}&lt;br /&gt;
{{Playable row|wiki_page=Knife Army|ordinal=1|health=160|mp=120|speed=11.0|jump_height=2.5}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Knife Army|ordinal=1|input=Attack, 1st press in a row|cancels_from=|damage=4|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Knife Army|ordinal=2|input=Attack, 2nd press in a row|cancels_from=|damage=4|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Knife Army|ordinal=3|input=Attack, 3rd press in a row|cancels_from=|damage=4|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Knife Army|ordinal=4|input=Crouch Attack|cancels_from=|damage=4|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Knife Army|ordinal=5|input=Charge Sweep|cancels_from=|damage=12 (Knife)|mp_cost=10|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Knife Army|ordinal=6|input=Block|cancels_from=|damage=4, 4|mp_cost=20|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Knife Army|ordinal=7|input=Block|cancels_from=Getting hit|damage=4, 4|mp_cost=10|only_when=}}&lt;/div&gt;</summary>
		<author><name>LongJump bot</name></author>
	</entry>
	<entry>
		<id>https://nwrx.wiki.longjump.dev/index.php?title=Data:Boss/Jubei&amp;diff=636</id>
		<title>Data:Boss/Jubei</title>
		<link rel="alternate" type="text/html" href="https://nwrx.wiki.longjump.dev/index.php?title=Data:Boss/Jubei&amp;diff=636"/>
		<updated>2026-11-04T00:19:55Z</updated>

		<summary type="html">&lt;p&gt;LongJump bot: Game data from 645555d&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Boss data&lt;br /&gt;
|wiki_page=Jubei&lt;br /&gt;
|name=Jubei&lt;br /&gt;
|icon=Boss Jubei.png&lt;br /&gt;
|modes=Normal, Hard&lt;br /&gt;
|shown_names=Jubei&lt;br /&gt;
|game_version=645555d (demo build of v2.2)&lt;br /&gt;
|source_id=data/chars/jubei/&lt;br /&gt;
}}&lt;br /&gt;
{{Variant row|wiki_page=Jubei|ordinal=1|mode=Normal|shown_name=Jubei|health=350|damage_taken=120%|boss=1|spawns=1}}&lt;br /&gt;
{{Variant row|wiki_page=Jubei|ordinal=2|mode=Hard|shown_name=Jubei|health=350|damage_taken=100%|boss=1|spawns=1}}&lt;br /&gt;
{{Playable row|wiki_page=Jubei|ordinal=1|health=160|mp=120|speed=15.0|jump_height=2.5}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Jubei|ordinal=1|input=Attack, 1st or 2nd press in a row|cancels_from=|damage=8|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Jubei|ordinal=2|input=Attack, 3rd press in a row|cancels_from=|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Jubei|ordinal=3|input=Jump, Attack|cancels_from=|damage=12|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Jubei|ordinal=4|input=Attack while holding an enemy (1st and 2nd press)|cancels_from=|damage=18 (throw)|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Jubei|ordinal=5|input=Attack while holding an enemy (3rd press), or Jump|cancels_from=|damage=18 (throw)|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Jubei|ordinal=6|input=Back + Attack while holding an enemy|cancels_from=|damage=18 (throw)|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Jubei|ordinal=7|input=Up + Attack while lying down|cancels_from=|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Jubei|ordinal=8|input=Crouch Attack|cancels_from=|damage=No damage|mp_cost=5|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Jubei|ordinal=9|input=Charge Sweep|cancels_from=|damage=No damage|mp_cost=20|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Jubei|ordinal=10|input=Charge Bomb|cancels_from=|damage=No damage|mp_cost=20|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Jubei|ordinal=11|input=Block|cancels_from=|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Jubei|ordinal=12|input=Block|cancels_from=Landing|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Jubei|ordinal=13|input=Block|cancels_from=Attack while holding an enemy (1st and 2nd press)|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Jubei|ordinal=14|input=Block|cancels_from=Attack while holding an enemy (3rd press), or Jump|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Jubei|ordinal=15|input=Block|cancels_from=Back + Attack while holding an enemy|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Jubei|ordinal=16|input=Block|cancels_from=Jump, Attack|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Jubei|ordinal=17|input=Block|cancels_from=Attack, 1st or 2nd press in a row|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Jubei|ordinal=18|input=Block|cancels_from=Attack, 3rd press in a row|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Jubei|ordinal=19|input=When it hits|cancels_from=Attack, 3rd press in a row|damage=18 (throw)|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Jubei|ordinal=20|input=Block|cancels_from=Follow-up on a hit|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Jubei|ordinal=21|input=Block|cancels_from=Attack|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Jubei|ordinal=22|input=When it hits|cancels_from=Attack|damage=18 (throw)|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Jubei|ordinal=23|input=Block|cancels_from=Forward, Forward|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Jubei|ordinal=24|input=Block|cancels_from=Crouch Attack|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Jubei|ordinal=25|input=Block|cancels_from=Charge Sweep|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Jubei|ordinal=26|input=Block|cancels_from=Charge Bomb|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Jubei|ordinal=27|input=Block|cancels_from=Jump|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Jubei|ordinal=28|input=Block|cancels_from=Block|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Jubei|ordinal=29|input=Attack|cancels_from=Block|damage=No damage|mp_cost=10|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Jubei|ordinal=30|input=Forward, Forward|cancels_from=Block|damage=12|mp_cost=10|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Jubei|ordinal=31|input=Crouch Attack|cancels_from=Block|damage=No damage|mp_cost=5|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Jubei|ordinal=32|input=Jump|cancels_from=Block|damage=12|mp_cost=10|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Jubei|ordinal=33|input=Charge Bomb|cancels_from=Block|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Jubei|ordinal=34|input=Block|cancels_from=Up + Attack while lying down|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Jubei|ordinal=35|input=Block|cancels_from=Getting hit|damage=8, 8|mp_cost=10|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Jubei|ordinal=36|input=Block|cancels_from=Getting up|damage=No damage|only_when=}}&lt;/div&gt;</summary>
		<author><name>LongJump bot</name></author>
	</entry>
	<entry>
		<id>https://nwrx.wiki.longjump.dev/index.php?title=Data:Enemy/Golem&amp;diff=635</id>
		<title>Data:Enemy/Golem</title>
		<link rel="alternate" type="text/html" href="https://nwrx.wiki.longjump.dev/index.php?title=Data:Enemy/Golem&amp;diff=635"/>
		<updated>2026-11-04T00:19:55Z</updated>

		<summary type="html">&lt;p&gt;LongJump bot: Game data from 645555d&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Enemy data&lt;br /&gt;
|wiki_page=Golem&lt;br /&gt;
|name=Golem&lt;br /&gt;
|icon=Enemy Golem.png&lt;br /&gt;
|modes=Normal, Hard, Extra&lt;br /&gt;
|shown_names=Golem, Golem Mk I&lt;br /&gt;
|game_version=645555d (demo build of v2.2)&lt;br /&gt;
|source_id=data/chars/golem/&lt;br /&gt;
}}&lt;br /&gt;
{{Variant row|wiki_page=Golem|ordinal=1|mode=Normal|shown_name=Golem|health=80|damage_taken=150%|boss=0|spawns=53}}&lt;br /&gt;
{{Variant row|wiki_page=Golem|ordinal=2|mode=Normal|shown_name=Golem Mk I|health=80|damage_taken=150%|boss=0|spawns=2}}&lt;br /&gt;
{{Variant row|wiki_page=Golem|ordinal=3|mode=Hard|shown_name=Golem|health=80|damage_taken=100%|boss=0|spawns=52}}&lt;br /&gt;
{{Variant row|wiki_page=Golem|ordinal=4|mode=Hard|shown_name=Golem Mk I|health=80|damage_taken=100%|boss=0|spawns=3}}&lt;br /&gt;
{{Variant row|wiki_page=Golem|ordinal=5|mode=Extra|shown_name=Golem|health=80|damage_taken=100%|boss=0|spawns=11}}&lt;br /&gt;
{{Variant row|wiki_page=Golem|ordinal=6|mode=Extra|shown_name=Golem Mk I|health=80|damage_taken=100%|boss=0|spawns=7}}&lt;br /&gt;
{{Playable row|wiki_page=Golem|ordinal=1|health=160|mp=120|speed=9.0}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Golem|ordinal=1|input=Attack, 1st press in a row|cancels_from=|damage=8|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Golem|ordinal=2|input=Jump|cancels_from=|damage=10|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Golem|ordinal=3|input=Crouch Attack|cancels_from=|damage=No damage|mp_cost=10|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Golem|ordinal=4|input=Charge Sweep|cancels_from=|damage=No damage|mp_cost=10|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Golem|ordinal=5|input=Charge Bomb|cancels_from=|damage=No damage|mp_cost=20|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Golem|ordinal=6|input=Block|cancels_from=|damage=8, 8|mp_cost=20|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Golem|ordinal=7|input=When it hits|cancels_from=Crouch Attack|damage=15 (finish)|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Golem|ordinal=8|input=When it hits|cancels_from=Charge Sweep|damage=18 (throw)|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Golem|ordinal=9|input=Block|cancels_from=Getting hit|damage=8, 8|mp_cost=10|only_when=}}&lt;/div&gt;</summary>
		<author><name>LongJump bot</name></author>
	</entry>
	<entry>
		<id>https://nwrx.wiki.longjump.dev/index.php?title=Data:Boss/Giganto&amp;diff=634</id>
		<title>Data:Boss/Giganto</title>
		<link rel="alternate" type="text/html" href="https://nwrx.wiki.longjump.dev/index.php?title=Data:Boss/Giganto&amp;diff=634"/>
		<updated>2026-11-04T00:19:54Z</updated>

		<summary type="html">&lt;p&gt;LongJump bot: Game data from 645555d&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Boss data&lt;br /&gt;
|wiki_page=Giganto&lt;br /&gt;
|name=Giganto&lt;br /&gt;
|icon=Boss Giganto.png&lt;br /&gt;
|modes=Normal, Hard, Practice, Extra&lt;br /&gt;
|shown_names=Giganto, Giganto Mk I, Giganto Mk II, Giganto Mk III, Giganto Mk IV, Giganto Mk R, Giganto Mk V, Giganto Mk VI, Giganto Mk VII, Giganto Mk VIII&lt;br /&gt;
|game_version=645555d (demo build of v2.2)&lt;br /&gt;
|source_id=data/chars/gigant/&lt;br /&gt;
}}&lt;br /&gt;
{{Variant row|wiki_page=Giganto|ordinal=1|mode=Normal|shown_name=Giganto|health=360|damage_taken=120%|boss=1|spawns=1}}&lt;br /&gt;
{{Variant row|wiki_page=Giganto|ordinal=2|mode=Normal|shown_name=Giganto Mk I|health=160|damage_taken=150%|boss=0|spawns=10}}&lt;br /&gt;
{{Variant row|wiki_page=Giganto|ordinal=3|mode=Hard|shown_name=Giganto|health=360|damage_taken=100%|boss=1|spawns=1}}&lt;br /&gt;
{{Variant row|wiki_page=Giganto|ordinal=4|mode=Hard|shown_name=Giganto Mk I|health=160|damage_taken=100%|boss=0|spawns=3}}&lt;br /&gt;
{{Variant row|wiki_page=Giganto|ordinal=5|mode=Hard|shown_name=Giganto Mk II|health=160|damage_taken=100%|boss=0|spawns=2}}&lt;br /&gt;
{{Variant row|wiki_page=Giganto|ordinal=6|mode=Hard|shown_name=Giganto Mk III|health=160|damage_taken=100%|boss=0|spawns=2}}&lt;br /&gt;
{{Variant row|wiki_page=Giganto|ordinal=7|mode=Hard|shown_name=Giganto Mk IV|health=160|damage_taken=100%|boss=0|spawns=2}}&lt;br /&gt;
{{Variant row|wiki_page=Giganto|ordinal=8|mode=Hard|shown_name=Giganto Mk V|health=160|damage_taken=100%|boss=0|spawns=1}}&lt;br /&gt;
{{Variant row|wiki_page=Giganto|ordinal=9|mode=Practice|shown_name=Giganto Mk R|health=160|damage_taken=100%|boss=0|spawns=20}}&lt;br /&gt;
{{Variant row|wiki_page=Giganto|ordinal=10|mode=Extra|shown_name=Giganto Mk I|health=160|damage_taken=100%|boss=0|spawns=3}}&lt;br /&gt;
{{Variant row|wiki_page=Giganto|ordinal=11|mode=Extra|shown_name=Giganto Mk II|health=160|damage_taken=100%|boss=0|spawns=3}}&lt;br /&gt;
{{Variant row|wiki_page=Giganto|ordinal=12|mode=Extra|shown_name=Giganto Mk VI|health=400|damage_taken=100%|boss=1|spawns=1}}&lt;br /&gt;
{{Variant row|wiki_page=Giganto|ordinal=13|mode=Extra|shown_name=Giganto Mk VII|health=400|damage_taken=100%|boss=1|spawns=1}}&lt;br /&gt;
{{Variant row|wiki_page=Giganto|ordinal=14|mode=Extra|shown_name=Giganto Mk VIII|health=400|damage_taken=100%|boss=1|spawns=1}}&lt;br /&gt;
{{Playable row|wiki_page=Giganto|ordinal=1|health=160|mp=120|speed=9.0|jump_height=2.7}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Giganto|ordinal=1|input=Attack, 1st or 2nd press in a row|cancels_from=|damage=10|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Giganto|ordinal=2|input=Attack, 3rd press in a row|cancels_from=|damage=14|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Giganto|ordinal=3|input=Jump, Attack|cancels_from=|damage=14|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Giganto|ordinal=4|input=Attack while holding an enemy (1st and 2nd press)|cancels_from=|damage=20 (throw)|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Giganto|ordinal=5|input=Attack while holding an enemy (3rd press), or Jump|cancels_from=|damage=20 (throw)|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Giganto|ordinal=6|input=Back + Attack while holding an enemy|cancels_from=|damage=20 (throw)|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Giganto|ordinal=7|input=Up + Attack while lying down|cancels_from=|damage=14|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Giganto|ordinal=8|input=Crouch Attack|cancels_from=|damage=No damage|mp_cost=10|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Giganto|ordinal=9|input=Charge Sweep|cancels_from=|damage=No damage|mp_cost=10|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Giganto|ordinal=10|input=Charge Bomb|cancels_from=|damage=No damage|mp_cost=10|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Giganto|ordinal=11|input=Block|cancels_from=|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Giganto|ordinal=12|input=Block|cancels_from=Landing|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Giganto|ordinal=13|input=Block|cancels_from=Attack while holding an enemy (1st and 2nd press)|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Giganto|ordinal=14|input=Block|cancels_from=Attack while holding an enemy (3rd press), or Jump|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Giganto|ordinal=15|input=Block|cancels_from=Back + Attack while holding an enemy|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Giganto|ordinal=16|input=Block|cancels_from=Attack, 1st or 2nd press in a row|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Giganto|ordinal=17|input=Block|cancels_from=Attack, 3rd press in a row|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Giganto|ordinal=18|input=Block|cancels_from=Attack|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Giganto|ordinal=19|input=Block|cancels_from=Crouch Attack|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Giganto|ordinal=20|input=When it hits|cancels_from=Crouch Attack|damage=20 (throw)|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Giganto|ordinal=21|input=Block|cancels_from=Follow-up on a hit|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Giganto|ordinal=22|input=When it hits|cancels_from=Crouch Attack|damage=15 (finish)|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Giganto|ordinal=23|input=Block|cancels_from=Charge Sweep|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Giganto|ordinal=24|input=Block|cancels_from=Charge Bomb|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Giganto|ordinal=25|input=Block|cancels_from=Jump|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Giganto|ordinal=26|input=Block|cancels_from=Block|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Giganto|ordinal=27|input=Block|cancels_from=Up + Attack while lying down|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Giganto|ordinal=28|input=Attack|cancels_from=Block|damage=13|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Giganto|ordinal=29|input=Crouch Attack|cancels_from=Block|damage=No damage|mp_cost=10|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Giganto|ordinal=30|input=Charge Sweep|cancels_from=Block|damage=No damage|mp_cost=15|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Giganto|ordinal=31|input=Charge Bomb|cancels_from=Block|damage=No damage|mp_cost=20|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Giganto|ordinal=32|input=Jump|cancels_from=Block|damage=No damage|mp_cost=10|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Giganto|ordinal=33|input=Block|cancels_from=Getting hit|damage=14, 14|mp_cost=10|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Giganto|ordinal=34|input=Block|cancels_from=Getting up|damage=No damage|only_when=}}&lt;/div&gt;</summary>
		<author><name>LongJump bot</name></author>
	</entry>
	<entry>
		<id>https://nwrx.wiki.longjump.dev/index.php?title=Data:Enemy/Fox&amp;diff=633</id>
		<title>Data:Enemy/Fox</title>
		<link rel="alternate" type="text/html" href="https://nwrx.wiki.longjump.dev/index.php?title=Data:Enemy/Fox&amp;diff=633"/>
		<updated>2026-11-04T00:19:54Z</updated>

		<summary type="html">&lt;p&gt;LongJump bot: Game data from 645555d&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Enemy data&lt;br /&gt;
|wiki_page=Fox&lt;br /&gt;
|name=Fox&lt;br /&gt;
|icon=Enemy Fox.png&lt;br /&gt;
|modes=Normal, Hard, Extra&lt;br /&gt;
|shown_names=Fox, Fox Mix, Fox Zero&lt;br /&gt;
|game_version=645555d (demo build of v2.2)&lt;br /&gt;
|source_id=data/chars/fox/&lt;br /&gt;
}}&lt;br /&gt;
{{Variant row|wiki_page=Fox|ordinal=1|mode=Normal|shown_name=Fox|health=48|damage_taken=150%|boss=0|spawns=40}}&lt;br /&gt;
{{Variant row|wiki_page=Fox|ordinal=2|mode=Hard|shown_name=Fox|health=48|damage_taken=100%|boss=0|spawns=11}}&lt;br /&gt;
{{Variant row|wiki_page=Fox|ordinal=3|mode=Hard|shown_name=Fox Mix|health=60|damage_taken=100%|boss=0|spawns=19}}&lt;br /&gt;
{{Variant row|wiki_page=Fox|ordinal=4|mode=Hard|shown_name=Fox Zero|health=60|damage_taken=100%|boss=0|spawns=14}}&lt;br /&gt;
{{Variant row|wiki_page=Fox|ordinal=5|mode=Extra|shown_name=Fox Mix|health=60|damage_taken=100%|boss=0|spawns=10}}&lt;br /&gt;
{{Variant row|wiki_page=Fox|ordinal=6|mode=Extra|shown_name=Fox Zero|health=60|damage_taken=100%|boss=0|spawns=8}}&lt;br /&gt;
{{Playable row|wiki_page=Fox|ordinal=1|health=160|mp=120|speed=12.0|jump_height=2.5}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Fox|ordinal=1|input=Attack, 1st or 2nd press in a row|cancels_from=|damage=6|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Fox|ordinal=2|input=Attack, 3rd press in a row|cancels_from=|damage=8|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Fox|ordinal=3|input=Jump, Attack|cancels_from=|damage=12|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Fox|ordinal=4|input=Attack while holding an enemy (1st and 2nd press)|cancels_from=|damage=18 (throw)|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Fox|ordinal=5|input=Attack while holding an enemy (3rd press), or Jump|cancels_from=|damage=18 (throw)|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Fox|ordinal=6|input=Back + Attack while holding an enemy|cancels_from=|damage=18 (throw)|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Fox|ordinal=7|input=Up + Attack while lying down|cancels_from=|damage=10|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Fox|ordinal=8|input=Crouch Attack|cancels_from=|damage=8|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Fox|ordinal=9|input=Charge Sweep|cancels_from=|damage=10|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Fox|ordinal=10|input=Charge Bomb|cancels_from=|damage=No damage|mp_cost=10|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Fox|ordinal=11|input=Block|cancels_from=|damage=10, 10|mp_cost=20|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Fox|ordinal=12|input=When it hits|cancels_from=Charge Bomb|damage=18 (throw)|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Fox|ordinal=13|input=Block|cancels_from=Getting hit|damage=10, 10|mp_cost=10|only_when=}}&lt;/div&gt;</summary>
		<author><name>LongJump bot</name></author>
	</entry>
	<entry>
		<id>https://nwrx.wiki.longjump.dev/index.php?title=Data:Enemy/Flame_Ninja&amp;diff=632</id>
		<title>Data:Enemy/Flame Ninja</title>
		<link rel="alternate" type="text/html" href="https://nwrx.wiki.longjump.dev/index.php?title=Data:Enemy/Flame_Ninja&amp;diff=632"/>
		<updated>2026-11-04T00:19:53Z</updated>

		<summary type="html">&lt;p&gt;LongJump bot: Game data from 645555d&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Enemy data&lt;br /&gt;
|wiki_page=Flame Ninja&lt;br /&gt;
|name=Flame Ninja&lt;br /&gt;
|icon=Enemy Flame Ninja.png&lt;br /&gt;
|modes=Normal, Hard, Extra&lt;br /&gt;
|shown_names=Flame Ninja&lt;br /&gt;
|game_version=645555d (demo build of v2.2)&lt;br /&gt;
|source_id=data/chars/flame/&lt;br /&gt;
}}&lt;br /&gt;
{{Variant row|wiki_page=Flame Ninja|ordinal=1|mode=Normal|shown_name=Flame Ninja|health=44|damage_taken=150%|boss=0|spawns=40}}&lt;br /&gt;
{{Variant row|wiki_page=Flame Ninja|ordinal=2|mode=Hard|shown_name=Flame Ninja|health=44|damage_taken=100%|boss=0|spawns=34}}&lt;br /&gt;
{{Variant row|wiki_page=Flame Ninja|ordinal=3|mode=Extra|shown_name=Flame Ninja|health=44|damage_taken=100%|boss=0|spawns=18}}&lt;br /&gt;
{{Playable row|wiki_page=Flame Ninja|ordinal=1|health=160|mp=120|speed=11.0|jump_height=2.5}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Flame Ninja|ordinal=1|input=Attack, 1st or 2nd press in a row|cancels_from=|damage=5|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Flame Ninja|ordinal=2|input=Attack, 3rd press in a row|cancels_from=|damage=12 (Fire2)|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Flame Ninja|ordinal=3|input=Crouch Attack|cancels_from=|damage=12 (Fire2)|mp_cost=10|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Flame Ninja|ordinal=4|input=Charge Sweep|cancels_from=|damage=12 (Fire2)|mp_cost=10|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Flame Ninja|ordinal=5|input=Block|cancels_from=|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Flame Ninja|ordinal=6|input=Block|cancels_from=Attack, 3rd press in a row|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Flame Ninja|ordinal=7|input=Block|cancels_from=Crouch Attack|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Flame Ninja|ordinal=8|input=Block|cancels_from=Charge Sweep|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Flame Ninja|ordinal=9|input=Block|cancels_from=Forward|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Flame Ninja|ordinal=10|input=Block|cancels_from=Back|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Flame Ninja|ordinal=11|input=Block|cancels_from=Up|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Flame Ninja|ordinal=12|input=Block|cancels_from=Down|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Flame Ninja|ordinal=13|input=Block|cancels_from=Block|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Flame Ninja|ordinal=14|input=Forward|cancels_from=Block|damage=No damage|mp_cost=5|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Flame Ninja|ordinal=15|input=Back|cancels_from=Block|damage=No damage|mp_cost=5|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Flame Ninja|ordinal=16|input=Up|cancels_from=Block|damage=No damage|mp_cost=5|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Flame Ninja|ordinal=17|input=Down|cancels_from=Block|damage=No damage|mp_cost=5|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Flame Ninja|ordinal=18|input=Crouch Attack|cancels_from=Block|damage=12 (Fire2)|mp_cost=10|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Flame Ninja|ordinal=19|input=Charge Sweep|cancels_from=Block|damage=12 (Fire2)|mp_cost=10|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Flame Ninja|ordinal=20|input=Block|cancels_from=Getting hit|damage=12 (Fire2)|mp_cost=10|only_when=}}&lt;/div&gt;</summary>
		<author><name>LongJump bot</name></author>
	</entry>
	<entry>
		<id>https://nwrx.wiki.longjump.dev/index.php?title=Data:Enemy/Deimos&amp;diff=631</id>
		<title>Data:Enemy/Deimos</title>
		<link rel="alternate" type="text/html" href="https://nwrx.wiki.longjump.dev/index.php?title=Data:Enemy/Deimos&amp;diff=631"/>
		<updated>2026-11-04T00:19:53Z</updated>

		<summary type="html">&lt;p&gt;LongJump bot: Game data from 645555d&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Enemy data&lt;br /&gt;
|wiki_page=Deimos&lt;br /&gt;
|name=Deimos&lt;br /&gt;
|icon=Enemy Deimos.png&lt;br /&gt;
|modes=Normal, Hard&lt;br /&gt;
|shown_names=Deimos&lt;br /&gt;
|game_version=645555d (demo build of v2.2)&lt;br /&gt;
|source_id=data/chars/deimos/&lt;br /&gt;
}}&lt;br /&gt;
{{Variant row|wiki_page=Deimos|ordinal=1|mode=Normal|shown_name=Deimos|health=390|damage_taken=120%|boss=0|spawns=1}}&lt;br /&gt;
{{Variant row|wiki_page=Deimos|ordinal=2|mode=Hard|shown_name=Deimos|health=390|damage_taken=100%|boss=0|spawns=1}}&lt;br /&gt;
{{Playable row|wiki_page=Deimos|ordinal=1|health=160|mp=120|speed=11.0|jump_height=2.5}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Deimos|ordinal=1|input=Attack, 1st or 2nd press in a row|cancels_from=|damage=10|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Deimos|ordinal=2|input=Attack, 3rd press in a row|cancels_from=|damage=14|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Deimos|ordinal=3|input=Jump, Attack|cancels_from=|damage=14|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Deimos|ordinal=4|input=Attack while holding an enemy (1st and 2nd press)|cancels_from=|damage=20 (throw)|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Deimos|ordinal=5|input=Attack while holding an enemy (3rd press), or Jump|cancels_from=|damage=20 (throw)|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Deimos|ordinal=6|input=Back + Attack while holding an enemy|cancels_from=|damage=20 (throw)|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Deimos|ordinal=7|input=Up + Attack while lying down|cancels_from=|damage=14|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Deimos|ordinal=8|input=Crouch Attack|cancels_from=|damage=No damage|mp_cost=10|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Deimos|ordinal=9|input=Charge Sweep|cancels_from=|damage=14|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Deimos|ordinal=10|input=Charge Bomb|cancels_from=|damage=17|mp_cost=20|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Deimos|ordinal=11|input=Block|cancels_from=|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Deimos|ordinal=12|input=Block|cancels_from=Landing|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Deimos|ordinal=13|input=Block|cancels_from=Attack while holding an enemy (1st and 2nd press)|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Deimos|ordinal=14|input=Block|cancels_from=Attack while holding an enemy (3rd press), or Jump|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Deimos|ordinal=15|input=Block|cancels_from=Back + Attack while holding an enemy|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Deimos|ordinal=16|input=Block|cancels_from=Attack, 1st or 2nd press in a row|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Deimos|ordinal=17|input=Block|cancels_from=Attack, 3rd press in a row|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Deimos|ordinal=18|input=Block|cancels_from=Attack|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Deimos|ordinal=19|input=Block|cancels_from=Crouch Attack|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Deimos|ordinal=20|input=When it hits|cancels_from=Crouch Attack|damage=20 (throw)|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Deimos|ordinal=21|input=Block|cancels_from=Follow-up on a hit|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Deimos|ordinal=22|input=Block|cancels_from=Charge Sweep|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Deimos|ordinal=23|input=Block|cancels_from=Charge Bomb|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Deimos|ordinal=24|input=Block|cancels_from=Jump|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Deimos|ordinal=25|input=Block|cancels_from=Block|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Deimos|ordinal=26|input=Attack|cancels_from=Block|damage=13|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Deimos|ordinal=27|input=Jump|cancels_from=Block|damage=No damage|mp_cost=10|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Deimos|ordinal=28|input=Block|cancels_from=Up + Attack while lying down|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Deimos|ordinal=29|input=Block|cancels_from=Getting hit|damage=14, 14|mp_cost=10|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Deimos|ordinal=30|input=Block|cancels_from=Getting up|damage=No damage|only_when=}}&lt;/div&gt;</summary>
		<author><name>LongJump bot</name></author>
	</entry>
	<entry>
		<id>https://nwrx.wiki.longjump.dev/index.php?title=Data:Boss/Chainsaw_Bull&amp;diff=630</id>
		<title>Data:Boss/Chainsaw Bull</title>
		<link rel="alternate" type="text/html" href="https://nwrx.wiki.longjump.dev/index.php?title=Data:Boss/Chainsaw_Bull&amp;diff=630"/>
		<updated>2026-11-04T00:19:52Z</updated>

		<summary type="html">&lt;p&gt;LongJump bot: Game data from 645555d&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Boss data&lt;br /&gt;
|wiki_page=Chainsaw Bull&lt;br /&gt;
|name=Chainsaw Bull&lt;br /&gt;
|icon=Boss Chainsaw Bull.png&lt;br /&gt;
|modes=Normal, Hard&lt;br /&gt;
|shown_names=Chainsaw Bull&lt;br /&gt;
|game_version=645555d (demo build of v2.2)&lt;br /&gt;
|source_id=data/chars/bull/&lt;br /&gt;
}}&lt;br /&gt;
{{Variant row|wiki_page=Chainsaw Bull|ordinal=1|mode=Normal|shown_name=Chainsaw Bull|health=340|damage_taken=120%|boss=1|spawns=1}}&lt;br /&gt;
{{Variant row|wiki_page=Chainsaw Bull|ordinal=2|mode=Hard|shown_name=Chainsaw Bull|health=340|damage_taken=100%|boss=1|spawns=1}}&lt;br /&gt;
{{Playable row|wiki_page=Chainsaw Bull|ordinal=1|health=160|mp=120|speed=11.0|jump_height=2.5}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Chainsaw Bull|ordinal=1|input=Attack, 1st press in a row|cancels_from=|damage=18|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Chainsaw Bull|ordinal=2|input=Attack while holding an enemy (1st and 2nd press)|cancels_from=|damage=18 (throw)|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Chainsaw Bull|ordinal=3|input=Attack while holding an enemy (3rd press), or Jump|cancels_from=|damage=18 (throw)|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Chainsaw Bull|ordinal=4|input=Back + Attack while holding an enemy|cancels_from=|damage=18 (throw)|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Chainsaw Bull|ordinal=5|input=Jump|cancels_from=|damage=6, 6, 6, 6|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Chainsaw Bull|ordinal=6|input=Crouch Attack|cancels_from=|damage=No damage|mp_cost=10|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Chainsaw Bull|ordinal=7|input=Charge Sweep|cancels_from=|damage=12, 12, 12, 12, 12, 12, 12, 12|mp_cost=20|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Chainsaw Bull|ordinal=8|input=Charge Bomb|cancels_from=|damage=10, 10|mp_cost=15|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Chainsaw Bull|ordinal=9|input=Block|cancels_from=|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Chainsaw Bull|ordinal=10|input=Block|cancels_from=Attack while holding an enemy (1st and 2nd press)|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Chainsaw Bull|ordinal=11|input=Block|cancels_from=Attack while holding an enemy (3rd press), or Jump|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Chainsaw Bull|ordinal=12|input=Block|cancels_from=Back + Attack while holding an enemy|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Chainsaw Bull|ordinal=13|input=Block|cancels_from=Attack, 1st press in a row|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Chainsaw Bull|ordinal=14|input=Block|cancels_from=Jump|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Chainsaw Bull|ordinal=15|input=Block|cancels_from=Crouch Attack|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Chainsaw Bull|ordinal=16|input=When it hits|cancels_from=Crouch Attack|damage=18 (throw)|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Chainsaw Bull|ordinal=17|input=Block|cancels_from=Follow-up on a hit|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Chainsaw Bull|ordinal=18|input=Block|cancels_from=Charge Sweep|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Chainsaw Bull|ordinal=19|input=When it hits|cancels_from=Crouch Attack|damage=4 (hurt), 4 (hurt), 4 (hurt), 12 (throw)|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Chainsaw Bull|ordinal=20|input=Crouch Attack|cancels_from=Block|damage=No damage|mp_cost=15|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Chainsaw Bull|ordinal=21|input=Charge Bomb|cancels_from=Charge Bomb|damage=10|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Chainsaw Bull|ordinal=22|input=Forward|cancels_from=Charge Bomb|damage=10, 10, 10, 10|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Chainsaw Bull|ordinal=23|input=Back|cancels_from=Charge Bomb|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Chainsaw Bull|ordinal=24|input=Up|cancels_from=Charge Bomb|damage=10, 10, 10, 10|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Chainsaw Bull|ordinal=25|input=Down|cancels_from=Charge Bomb|damage=10, 10, 10, 10|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Chainsaw Bull|ordinal=26|input=Block|cancels_from=Getting hit|damage=18, 18, 18, 18, 18|mp_cost=10|only_when=}}&lt;/div&gt;</summary>
		<author><name>LongJump bot</name></author>
	</entry>
	<entry>
		<id>https://nwrx.wiki.longjump.dev/index.php?title=Data:Boss/Banglar&amp;diff=629</id>
		<title>Data:Boss/Banglar</title>
		<link rel="alternate" type="text/html" href="https://nwrx.wiki.longjump.dev/index.php?title=Data:Boss/Banglar&amp;diff=629"/>
		<updated>2026-11-04T00:19:52Z</updated>

		<summary type="html">&lt;p&gt;LongJump bot: Game data from 645555d&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Boss data&lt;br /&gt;
|wiki_page=Banglar&lt;br /&gt;
|name=Banglar&lt;br /&gt;
|icon=Boss Banglar.png&lt;br /&gt;
|modes=Normal, Hard&lt;br /&gt;
|shown_names=Banglar&lt;br /&gt;
|game_version=645555d (demo build of v2.2)&lt;br /&gt;
|source_id=data/chars/banglar/&lt;br /&gt;
}}&lt;br /&gt;
{{Variant row|wiki_page=Banglar|ordinal=1|mode=Normal|shown_name=Banglar|health=350|damage_taken=40%|boss=1|spawns=1}}&lt;br /&gt;
{{Variant row|wiki_page=Banglar|ordinal=2|mode=Hard|shown_name=Banglar|health=350|damage_taken=40%|boss=1|spawns=1}}&lt;/div&gt;</summary>
		<author><name>LongJump bot</name></author>
	</entry>
	<entry>
		<id>https://nwrx.wiki.longjump.dev/index.php?title=Data:Character/Ninja&amp;diff=628</id>
		<title>Data:Character/Ninja</title>
		<link rel="alternate" type="text/html" href="https://nwrx.wiki.longjump.dev/index.php?title=Data:Character/Ninja&amp;diff=628"/>
		<updated>2026-11-04T00:19:49Z</updated>

		<summary type="html">&lt;p&gt;LongJump bot: Game data from 645555d&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Character data&lt;br /&gt;
|wiki_page=Ninja&lt;br /&gt;
|name=Ninja&lt;br /&gt;
|icon=Character Ninja.png&lt;br /&gt;
|modes=Normal, Hard, Practice&lt;br /&gt;
|health=160&lt;br /&gt;
|mp=120&lt;br /&gt;
|speed=9.0&lt;br /&gt;
|jump_height=0.0&lt;br /&gt;
|game_version=645555d (demo build of v2.2)&lt;br /&gt;
|source_id=data/chars/ninja/ninja.txt&lt;br /&gt;
}}&lt;br /&gt;
{{Move row|wiki_page=Ninja|ordinal=1|input=Attack, 1st or 2nd press in a row|cancels_from=|damage=7|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Ninja|ordinal=2|input=Attack, 3rd press in a row|cancels_from=|damage=3, 3, 6, 3, 6, 6|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Ninja|ordinal=3|input=Attack while holding an enemy (1st and 2nd press)|cancels_from=|damage=5, 15 (throw)|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Ninja|ordinal=4|input=Attack while holding an enemy (3rd press), or Jump|cancels_from=|damage=5, 5, 5, 12 (throw)|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Ninja|ordinal=5|input=Back + Attack while holding an enemy|cancels_from=|damage=5, 15 (throw)|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Ninja|ordinal=6|input=Up + Attack while holding an enemy|cancels_from=|damage=5, 5, 5, 12 (throw)|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Ninja|ordinal=7|input=Down + Attack while holding an enemy|cancels_from=|damage=20 (finish)|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Ninja|ordinal=8|input=Forward, Jump|cancels_from=|damage=5|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Ninja|ordinal=9|input=Crouch Attack|cancels_from=|damage=7|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Ninja|ordinal=10|input=Charge Sweep|cancels_from=|damage=7 (Strafe)|mp_cost=35|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Ninja|ordinal=11|input=Charge Bomb|cancels_from=|damage=30 (Explosion), 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30 (ExplosionXE), 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30 (ExplosionXF), 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30 (ExplosionXD), 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30 (ExplosionXC), 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30 (ExplosionXA), 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30 (ExplosionXB)|mp_cost=120|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Ninja|ordinal=12|input=Block|cancels_from=|damage=No damage|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Ninja|ordinal=13|input=Jump|cancels_from=Standing|damage=No damage|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Ninja|ordinal=14|input=Jump|cancels_from=Turning|damage=5|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Ninja|ordinal=15|input=Jump|cancels_from=Walking|damage=5|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Ninja|ordinal=16|input=Crouch Attack|cancels_from=Walking|damage=7|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Ninja|ordinal=17|input=Charge Sweep|cancels_from=Walking|damage=7 (Strafe)|mp_cost=35|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Ninja|ordinal=18|input=Charge Bomb|cancels_from=Walking|damage=30 (Explosion), 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30 (ExplosionXE), 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30 (ExplosionXF), 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30 (ExplosionXD), 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30 (ExplosionXC), 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30 (ExplosionXA), 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30 (ExplosionXB)|mp_cost=120|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Ninja|ordinal=19|input=Block|cancels_from=Walking|damage=No damage|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Ninja|ordinal=20|input=Crouch Attack|cancels_from=Holding an enemy|damage=7|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Ninja|ordinal=21|input=Charge Sweep|cancels_from=Holding an enemy|damage=7 (Strafe)|mp_cost=35|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Ninja|ordinal=22|input=Charge Bomb|cancels_from=Holding an enemy|damage=30 (Explosion), 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30 (ExplosionXE), 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30 (ExplosionXF), 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30 (ExplosionXD), 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30 (ExplosionXC), 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30 (ExplosionXA), 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30 (ExplosionXB)|mp_cost=120|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Ninja|ordinal=23|input=Block|cancels_from=Attack while holding an enemy (1st and 2nd press)|damage=No damage|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Ninja|ordinal=24|input=Block|cancels_from=Attack while holding an enemy (3rd press), or Jump|damage=No damage|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Ninja|ordinal=25|input=Block|cancels_from=Back + Attack while holding an enemy|damage=No damage|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Ninja|ordinal=26|input=Block|cancels_from=Up + Attack while holding an enemy|damage=No damage|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Ninja|ordinal=27|input=Block|cancels_from=Follow-up on a hit|damage=No damage|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Ninja|ordinal=28|input=Block|cancels_from=Down + Attack while holding an enemy|damage=No damage|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Ninja|ordinal=29|input=Jump|cancels_from=Attack, 1st or 2nd press in a row|damage=5|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Ninja|ordinal=30|input=Charge Sweep|cancels_from=Attack, 1st or 2nd press in a row|damage=7 (Strafe)|mp_cost=35|only_when=After 1 hit}}&lt;br /&gt;
{{Move row|wiki_page=Ninja|ordinal=31|input=Charge Bomb|cancels_from=Attack, 1st or 2nd press in a row|damage=30 (Explosion), 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30 (ExplosionXE), 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30 (ExplosionXF), 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30 (ExplosionXD), 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30 (ExplosionXC), 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30 (ExplosionXA), 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30 (ExplosionXB)|mp_cost=120|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Ninja|ordinal=32|input=Crouch Attack|cancels_from=Attack, 1st or 2nd press in a row|damage=10|only_when=After 1 hit}}&lt;br /&gt;
{{Move row|wiki_page=Ninja|ordinal=33|input=Jump|cancels_from=Attack, 3rd press in a row|damage=5|only_when=After 1 hit}}&lt;br /&gt;
{{Move row|wiki_page=Ninja|ordinal=34|input=Block|cancels_from=Attack, 3rd press in a row|damage=No damage|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Ninja|ordinal=35|input=Attack|cancels_from=Jump|damage=10, 10, 10, 10, 10, 10, 10, 10, 10|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Ninja|ordinal=36|input=Up, Attack|cancels_from=Jump|damage=10, 10, 10, 10, 10, 10, 10|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Ninja|ordinal=37|input=Block|cancels_from=Jump|damage=No damage|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Ninja|ordinal=38|input=Block|cancels_from=Attack|damage=No damage|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Ninja|ordinal=39|input=Block|cancels_from=Up, Attack|damage=No damage|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Ninja|ordinal=40|input=Attack|cancels_from=Forward, Jump or Jump|damage=10|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Ninja|ordinal=41|input=Block|cancels_from=Forward, Jump or Jump|damage=No damage|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Ninja|ordinal=42|input=When it hits|cancels_from=Forward, Jump or Jump|damage=5|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Ninja|ordinal=43|input=Jump|cancels_from=Follow-up on a hit|damage=5|only_when=After 1 hit}}&lt;br /&gt;
{{Move row|wiki_page=Ninja|ordinal=44|input=Jump|cancels_from=Attack|damage=5|only_when=After 1 hit}}&lt;br /&gt;
{{Move row|wiki_page=Ninja|ordinal=45|input=Attack|cancels_from=Jump or Forward, Forward|damage=10|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Ninja|ordinal=46|input=Block|cancels_from=Jump or Forward, Forward|damage=No damage|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Ninja|ordinal=47|input=When it hits|cancels_from=Jump or Forward, Forward|damage=5|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Ninja|ordinal=48|input=Jump|cancels_from=Forward, Forward|damage=5|only_when=After 1 hit}}&lt;br /&gt;
{{Move row|wiki_page=Ninja|ordinal=49|input=Block|cancels_from=Forward, Forward|damage=No damage|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Ninja|ordinal=50|input=Attack|cancels_from=Crouch Attack|damage=7|only_when=After 1 hit}}&lt;br /&gt;
{{Move row|wiki_page=Ninja|ordinal=51|input=Crouch Attack|cancels_from=Crouch Attack|damage=7|only_when=After 1 hit}}&lt;br /&gt;
{{Move row|wiki_page=Ninja|ordinal=52|input=Attack|cancels_from=Attack or Crouch Attack|damage=10|only_when=After 1 hit}}&lt;br /&gt;
{{Move row|wiki_page=Ninja|ordinal=53|input=Crouch Attack|cancels_from=Attack or Crouch Attack|damage=10|only_when=After 1 hit}}&lt;br /&gt;
{{Move row|wiki_page=Ninja|ordinal=54|input=Jump|cancels_from=Crouch Attack or Attack|damage=5|only_when=After 1 hit}}&lt;br /&gt;
{{Move row|wiki_page=Ninja|ordinal=55|input=Block|cancels_from=Crouch Attack or Attack|damage=No damage|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Ninja|ordinal=56|input=Block|cancels_from=Charge Sweep|damage=No damage|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Ninja|ordinal=57|input=Block|cancels_from=Charge Bomb|damage=No damage|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Ninja|ordinal=58|input=Forward, Forward|cancels_from=Jump|damage=5|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Ninja|ordinal=59|input=Crouch Attack|cancels_from=Crouch Attack|damage=3, 3, 6, 3, 3, 6, 3, 6, 6|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Ninja|ordinal=60|input=Block|cancels_from=Crouch Attack|damage=No damage|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Ninja|ordinal=61|input=When it hits|cancels_from=Crouch Attack|damage=No damage|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Ninja|ordinal=62|input=Attack|cancels_from=Follow-up on a hit|damage=10|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Ninja|ordinal=63|input=Jump|cancels_from=Follow-up on a hit|damage=No damage|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Ninja|ordinal=64|input=Crouch Attack|cancels_from=Follow-up on a hit|damage=3, 3, 6, 3, 3, 6, 3, 6, 6|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Ninja|ordinal=65|input=When it hits|cancels_from=Jump|damage=5, 5, 5, 12 (throw)|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Ninja|ordinal=66|input=Jump|cancels_from=Crouch Attack|damage=5|only_when=After 1 hit}}&lt;br /&gt;
{{Move row|wiki_page=Ninja|ordinal=67|input=Block|cancels_from=Crouch Attack|damage=8, 8, 8, 8, 8, 8, 8|mp_cost=15|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Ninja|ordinal=68|input=Block|cancels_from=Block or Crouch Attack|damage=No damage|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Ninja|ordinal=69|input=Forward, Forward|cancels_from=Up, Up|damage=5|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Ninja|ordinal=70|input=Block|cancels_from=Up, Up|damage=No damage|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Ninja|ordinal=71|input=Forward, Forward|cancels_from=Down, Down|damage=5|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Ninja|ordinal=72|input=Block|cancels_from=Down, Down|damage=No damage|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Ninja|ordinal=73|input=Jump|cancels_from=Block|damage=No damage|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Ninja|ordinal=74|input=Up, Up|cancels_from=Block|damage=No damage|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Ninja|ordinal=75|input=Down, Down|cancels_from=Block|damage=No damage|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Ninja|ordinal=76|input=Attack|cancels_from=Block|damage=8, 8, 8, 8, 8, 8, 8|mp_cost=30|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Ninja|ordinal=77|input=Crouch Attack|cancels_from=Block|damage=No damage|mp_cost=20|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Ninja|ordinal=78|input=Forward, Forward|cancels_from=Block|damage=5|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Ninja|ordinal=79|input=Charge Sweep|cancels_from=Block|damage=7 (Strafe)|mp_cost=35|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Ninja|ordinal=80|input=Forward|cancels_from=Block|damage=No damage|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Ninja|ordinal=81|input=Back|cancels_from=Block|damage=No damage|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Ninja|ordinal=82|input=Up|cancels_from=Block|damage=No damage|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Ninja|ordinal=83|input=Down|cancels_from=Block|damage=No damage|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Ninja|ordinal=84|input=Jump|cancels_from=Forward|damage=No damage|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Ninja|ordinal=85|input=Up, Up|cancels_from=Forward|damage=No damage|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Ninja|ordinal=86|input=Down, Down|cancels_from=Forward|damage=No damage|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Ninja|ordinal=87|input=Crouch Attack|cancels_from=Forward|damage=No damage|mp_cost=20|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Ninja|ordinal=88|input=Charge Sweep|cancels_from=Forward|damage=7 (Strafe)|mp_cost=35|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Ninja|ordinal=89|input=Jump|cancels_from=Back|damage=No damage|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Ninja|ordinal=90|input=Up, Up|cancels_from=Back|damage=No damage|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Ninja|ordinal=91|input=Down, Down|cancels_from=Back|damage=No damage|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Ninja|ordinal=92|input=Crouch Attack|cancels_from=Back|damage=No damage|mp_cost=20|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Ninja|ordinal=93|input=Charge Sweep|cancels_from=Back|damage=7 (Strafe)|mp_cost=35|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Ninja|ordinal=94|input=Jump|cancels_from=Up|damage=No damage|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Ninja|ordinal=95|input=Up, Up|cancels_from=Up|damage=No damage|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Ninja|ordinal=96|input=Down, Down|cancels_from=Up|damage=No damage|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Ninja|ordinal=97|input=Crouch Attack|cancels_from=Up|damage=No damage|mp_cost=20|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Ninja|ordinal=98|input=Charge Sweep|cancels_from=Up|damage=7 (Strafe)|mp_cost=35|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Ninja|ordinal=99|input=Jump|cancels_from=Down|damage=No damage|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Ninja|ordinal=100|input=Up, Up|cancels_from=Down|damage=No damage|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Ninja|ordinal=101|input=Down, Down|cancels_from=Down|damage=No damage|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Ninja|ordinal=102|input=Crouch Attack|cancels_from=Down|damage=No damage|mp_cost=20|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Ninja|ordinal=103|input=Charge Sweep|cancels_from=Down|damage=7 (Strafe)|mp_cost=35|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Ninja|ordinal=104|input=Charge Bomb|cancels_from=Getting hit|damage=30 (Explosion), 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30 (ExplosionXE), 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30 (ExplosionXF), 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30 (ExplosionXD), 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30 (ExplosionXC), 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30 (ExplosionXA), 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30 (ExplosionXB)|mp_cost=120|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Ninja|ordinal=105|input=Crouch Attack|cancels_from=Getting hit|damage=8, 8, 8, 8, 8, 8, 8|mp_cost=15|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Ninja|ordinal=106|input=Block|cancels_from=Getting hit|damage=8, 8, 8, 8, 8, 8, 8|mp_cost=15|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Ninja|ordinal=107|input=Block|cancels_from=Getting up|damage=No damage|only_when=}}&lt;br /&gt;
{{Playable row|wiki_page=Ninja|ordinal=1|health=160|mp=120|speed=9.0|jump_height=0.0}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Ninja|ordinal=1|input=Attack, 1st or 2nd press in a row|cancels_from=|damage=7|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Ninja|ordinal=2|input=Attack, 3rd press in a row|cancels_from=|damage=3, 3, 6, 3, 6, 6|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Ninja|ordinal=3|input=Attack while holding an enemy (1st and 2nd press)|cancels_from=|damage=5, 15 (throw)|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Ninja|ordinal=4|input=Attack while holding an enemy (3rd press), or Jump|cancels_from=|damage=5, 5, 5, 12 (throw)|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Ninja|ordinal=5|input=Back + Attack while holding an enemy|cancels_from=|damage=5, 15 (throw)|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Ninja|ordinal=6|input=Up + Attack while holding an enemy|cancels_from=|damage=5, 5, 5, 12 (throw)|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Ninja|ordinal=7|input=Down + Attack while holding an enemy|cancels_from=|damage=20 (finish)|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Ninja|ordinal=8|input=Forward, Jump|cancels_from=|damage=5|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Ninja|ordinal=9|input=Crouch Attack|cancels_from=|damage=7|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Ninja|ordinal=10|input=Charge Sweep|cancels_from=|damage=7 (Strafe)|mp_cost=35|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Ninja|ordinal=11|input=Charge Bomb|cancels_from=|damage=30 (Explosion), 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30 (ExplosionXE), 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30 (ExplosionXF), 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30 (ExplosionXD), 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30 (ExplosionXC), 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30 (ExplosionXA), 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30 (ExplosionXB)|mp_cost=120|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Ninja|ordinal=12|input=Block|cancels_from=|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Ninja|ordinal=13|input=Jump|cancels_from=Standing|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Ninja|ordinal=14|input=Jump|cancels_from=Turning|damage=5|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Ninja|ordinal=15|input=Jump|cancels_from=Walking|damage=5|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Ninja|ordinal=16|input=Crouch Attack|cancels_from=Walking|damage=7|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Ninja|ordinal=17|input=Charge Sweep|cancels_from=Walking|damage=7 (Strafe)|mp_cost=35|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Ninja|ordinal=18|input=Charge Bomb|cancels_from=Walking|damage=30 (Explosion), 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30 (ExplosionXE), 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30 (ExplosionXF), 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30 (ExplosionXD), 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30 (ExplosionXC), 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30 (ExplosionXA), 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30 (ExplosionXB)|mp_cost=120|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Ninja|ordinal=19|input=Block|cancels_from=Walking|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Ninja|ordinal=20|input=Crouch Attack|cancels_from=Holding an enemy|damage=7|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Ninja|ordinal=21|input=Charge Sweep|cancels_from=Holding an enemy|damage=7 (Strafe)|mp_cost=35|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Ninja|ordinal=22|input=Charge Bomb|cancels_from=Holding an enemy|damage=30 (Explosion), 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30 (ExplosionXE), 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30 (ExplosionXF), 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30 (ExplosionXD), 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30 (ExplosionXC), 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30 (ExplosionXA), 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30 (ExplosionXB)|mp_cost=120|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Ninja|ordinal=23|input=Block|cancels_from=Attack while holding an enemy (1st and 2nd press)|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Ninja|ordinal=24|input=Block|cancels_from=Attack while holding an enemy (3rd press), or Jump|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Ninja|ordinal=25|input=Block|cancels_from=Back + Attack while holding an enemy|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Ninja|ordinal=26|input=Block|cancels_from=Up + Attack while holding an enemy|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Ninja|ordinal=27|input=Block|cancels_from=Follow-up on a hit|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Ninja|ordinal=28|input=Block|cancels_from=Down + Attack while holding an enemy|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Ninja|ordinal=29|input=Jump|cancels_from=Attack, 1st or 2nd press in a row|damage=5|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Ninja|ordinal=30|input=Charge Sweep|cancels_from=Attack, 1st or 2nd press in a row|damage=7 (Strafe)|mp_cost=35|only_when=After 1 hit}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Ninja|ordinal=31|input=Charge Bomb|cancels_from=Attack, 1st or 2nd press in a row|damage=30 (Explosion), 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30 (ExplosionXE), 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30 (ExplosionXF), 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30 (ExplosionXD), 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30 (ExplosionXC), 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30 (ExplosionXA), 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30 (ExplosionXB)|mp_cost=120|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Ninja|ordinal=32|input=Crouch Attack|cancels_from=Attack, 1st or 2nd press in a row|damage=10|only_when=After 1 hit}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Ninja|ordinal=33|input=Jump|cancels_from=Attack, 3rd press in a row|damage=5|only_when=After 1 hit}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Ninja|ordinal=34|input=Block|cancels_from=Attack, 3rd press in a row|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Ninja|ordinal=35|input=Attack|cancels_from=Jump|damage=10, 10, 10, 10, 10, 10, 10, 10, 10|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Ninja|ordinal=36|input=Up, Attack|cancels_from=Jump|damage=10, 10, 10, 10, 10, 10, 10|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Ninja|ordinal=37|input=Block|cancels_from=Jump|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Ninja|ordinal=38|input=Block|cancels_from=Attack|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Ninja|ordinal=39|input=Block|cancels_from=Up, Attack|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Ninja|ordinal=40|input=Attack|cancels_from=Forward, Jump or Jump|damage=10|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Ninja|ordinal=41|input=Block|cancels_from=Forward, Jump or Jump|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Ninja|ordinal=42|input=When it hits|cancels_from=Forward, Jump or Jump|damage=5|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Ninja|ordinal=43|input=Jump|cancels_from=Follow-up on a hit|damage=5|only_when=After 1 hit}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Ninja|ordinal=44|input=Jump|cancels_from=Attack|damage=5|only_when=After 1 hit}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Ninja|ordinal=45|input=Attack|cancels_from=Jump or Forward, Forward|damage=10|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Ninja|ordinal=46|input=Block|cancels_from=Jump or Forward, Forward|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Ninja|ordinal=47|input=When it hits|cancels_from=Jump or Forward, Forward|damage=5|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Ninja|ordinal=48|input=Jump|cancels_from=Forward, Forward|damage=5|only_when=After 1 hit}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Ninja|ordinal=49|input=Block|cancels_from=Forward, Forward|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Ninja|ordinal=50|input=Attack|cancels_from=Crouch Attack|damage=7|only_when=After 1 hit}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Ninja|ordinal=51|input=Crouch Attack|cancels_from=Crouch Attack|damage=7|only_when=After 1 hit}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Ninja|ordinal=52|input=Attack|cancels_from=Attack or Crouch Attack|damage=10|only_when=After 1 hit}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Ninja|ordinal=53|input=Crouch Attack|cancels_from=Attack or Crouch Attack|damage=10|only_when=After 1 hit}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Ninja|ordinal=54|input=Jump|cancels_from=Crouch Attack or Attack|damage=5|only_when=After 1 hit}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Ninja|ordinal=55|input=Block|cancels_from=Crouch Attack or Attack|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Ninja|ordinal=56|input=Block|cancels_from=Charge Sweep|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Ninja|ordinal=57|input=Block|cancels_from=Charge Bomb|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Ninja|ordinal=58|input=Forward, Forward|cancels_from=Jump|damage=5|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Ninja|ordinal=59|input=Crouch Attack|cancels_from=Crouch Attack|damage=3, 3, 6, 3, 3, 6, 3, 6, 6|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Ninja|ordinal=60|input=Block|cancels_from=Crouch Attack|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Ninja|ordinal=61|input=When it hits|cancels_from=Crouch Attack|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Ninja|ordinal=62|input=Attack|cancels_from=Follow-up on a hit|damage=10|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Ninja|ordinal=63|input=Jump|cancels_from=Follow-up on a hit|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Ninja|ordinal=64|input=Crouch Attack|cancels_from=Follow-up on a hit|damage=3, 3, 6, 3, 3, 6, 3, 6, 6|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Ninja|ordinal=65|input=When it hits|cancels_from=Jump|damage=5, 5, 5, 12 (throw)|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Ninja|ordinal=66|input=Jump|cancels_from=Crouch Attack|damage=5|only_when=After 1 hit}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Ninja|ordinal=67|input=Block|cancels_from=Crouch Attack|damage=8, 8, 8, 8, 8, 8, 8|mp_cost=15|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Ninja|ordinal=68|input=Block|cancels_from=Block or Crouch Attack|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Ninja|ordinal=69|input=Forward, Forward|cancels_from=Up, Up|damage=5|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Ninja|ordinal=70|input=Block|cancels_from=Up, Up|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Ninja|ordinal=71|input=Forward, Forward|cancels_from=Down, Down|damage=5|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Ninja|ordinal=72|input=Block|cancels_from=Down, Down|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Ninja|ordinal=73|input=Jump|cancels_from=Block|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Ninja|ordinal=74|input=Up, Up|cancels_from=Block|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Ninja|ordinal=75|input=Down, Down|cancels_from=Block|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Ninja|ordinal=76|input=Attack|cancels_from=Block|damage=8, 8, 8, 8, 8, 8, 8|mp_cost=30|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Ninja|ordinal=77|input=Crouch Attack|cancels_from=Block|damage=No damage|mp_cost=20|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Ninja|ordinal=78|input=Forward, Forward|cancels_from=Block|damage=5|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Ninja|ordinal=79|input=Charge Sweep|cancels_from=Block|damage=7 (Strafe)|mp_cost=35|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Ninja|ordinal=80|input=Forward|cancels_from=Block|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Ninja|ordinal=81|input=Back|cancels_from=Block|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Ninja|ordinal=82|input=Up|cancels_from=Block|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Ninja|ordinal=83|input=Down|cancels_from=Block|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Ninja|ordinal=84|input=Jump|cancels_from=Forward|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Ninja|ordinal=85|input=Up, Up|cancels_from=Forward|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Ninja|ordinal=86|input=Down, Down|cancels_from=Forward|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Ninja|ordinal=87|input=Crouch Attack|cancels_from=Forward|damage=No damage|mp_cost=20|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Ninja|ordinal=88|input=Charge Sweep|cancels_from=Forward|damage=7 (Strafe)|mp_cost=35|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Ninja|ordinal=89|input=Jump|cancels_from=Back|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Ninja|ordinal=90|input=Up, Up|cancels_from=Back|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Ninja|ordinal=91|input=Down, Down|cancels_from=Back|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Ninja|ordinal=92|input=Crouch Attack|cancels_from=Back|damage=No damage|mp_cost=20|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Ninja|ordinal=93|input=Charge Sweep|cancels_from=Back|damage=7 (Strafe)|mp_cost=35|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Ninja|ordinal=94|input=Jump|cancels_from=Up|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Ninja|ordinal=95|input=Up, Up|cancels_from=Up|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Ninja|ordinal=96|input=Down, Down|cancels_from=Up|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Ninja|ordinal=97|input=Crouch Attack|cancels_from=Up|damage=No damage|mp_cost=20|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Ninja|ordinal=98|input=Charge Sweep|cancels_from=Up|damage=7 (Strafe)|mp_cost=35|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Ninja|ordinal=99|input=Jump|cancels_from=Down|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Ninja|ordinal=100|input=Up, Up|cancels_from=Down|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Ninja|ordinal=101|input=Down, Down|cancels_from=Down|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Ninja|ordinal=102|input=Crouch Attack|cancels_from=Down|damage=No damage|mp_cost=20|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Ninja|ordinal=103|input=Charge Sweep|cancels_from=Down|damage=7 (Strafe)|mp_cost=35|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Ninja|ordinal=104|input=Charge Bomb|cancels_from=Getting hit|damage=30 (Explosion), 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30 (ExplosionXE), 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30 (ExplosionXF), 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30 (ExplosionXD), 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30 (ExplosionXC), 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30 (ExplosionXA), 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30 (ExplosionXB)|mp_cost=120|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Ninja|ordinal=105|input=Crouch Attack|cancels_from=Getting hit|damage=8, 8, 8, 8, 8, 8, 8|mp_cost=15|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Ninja|ordinal=106|input=Block|cancels_from=Getting hit|damage=8, 8, 8, 8, 8, 8, 8|mp_cost=15|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Ninja|ordinal=107|input=Block|cancels_from=Getting up|damage=No damage|only_when=}}&lt;br /&gt;
{{HowToPage row|wiki_page=Ninja|ordinal=1|page=16|image=How To Play page 16.png}}&lt;br /&gt;
{{HowToPage row|wiki_page=Ninja|ordinal=2|page=17|image=How To Play page 17.png}}&lt;br /&gt;
{{HowToPage row|wiki_page=Ninja|ordinal=3|page=18|image=How To Play page 18.png}}&lt;br /&gt;
{{HowToPage row|wiki_page=Ninja|ordinal=4|page=19|image=How To Play page 19.png}}&lt;br /&gt;
{{HowToPage row|wiki_page=Ninja|ordinal=5|page=20|image=How To Play page 20.png}}&lt;br /&gt;
{{HowToPage row|wiki_page=Ninja|ordinal=6|page=21|image=How To Play page 21.png}}&lt;br /&gt;
{{HowToPage row|wiki_page=Ninja|ordinal=7|page=22|image=How To Play page 22.png}}&lt;br /&gt;
{{HowToPage row|wiki_page=Ninja|ordinal=8|page=23|image=How To Play page 23.png}}&lt;br /&gt;
{{HowToPage row|wiki_page=Ninja|ordinal=9|page=24|image=How To Play page 24.png}}&lt;br /&gt;
{{HowToPage row|wiki_page=Ninja|ordinal=10|page=25|image=How To Play page 25.png}}&lt;br /&gt;
{{HowToPage row|wiki_page=Ninja|ordinal=11|page=26|image=How To Play page 26.png}}&lt;br /&gt;
{{HowToPage row|wiki_page=Ninja|ordinal=12|page=27|image=How To Play page 27.png}}&lt;br /&gt;
{{HowToPage row|wiki_page=Ninja|ordinal=13|page=28|image=How To Play page 28.png}}&lt;br /&gt;
{{HowToPage row|wiki_page=Ninja|ordinal=14|page=29|image=How To Play page 29.png}}&lt;br /&gt;
{{HowToPage row|wiki_page=Ninja|ordinal=15|page=30|image=How To Play page 30.png}}&lt;br /&gt;
{{HowToPage row|wiki_page=Ninja|ordinal=16|page=31|image=How To Play page 31.png}}&lt;br /&gt;
{{HowToPage row|wiki_page=Ninja|ordinal=17|page=32|image=How To Play page 32.png}}&lt;/div&gt;</summary>
		<author><name>LongJump bot</name></author>
	</entry>
	<entry>
		<id>https://nwrx.wiki.longjump.dev/index.php?title=Data:Character/Kamaitachi&amp;diff=627</id>
		<title>Data:Character/Kamaitachi</title>
		<link rel="alternate" type="text/html" href="https://nwrx.wiki.longjump.dev/index.php?title=Data:Character/Kamaitachi&amp;diff=627"/>
		<updated>2026-11-04T00:19:45Z</updated>

		<summary type="html">&lt;p&gt;LongJump bot: Game data from 645555d&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Character data&lt;br /&gt;
|wiki_page=Kamaitachi&lt;br /&gt;
|name=Kamaitachi&lt;br /&gt;
|icon=Character Kamaitachi.png&lt;br /&gt;
|modes=Normal, Hard, Practice&lt;br /&gt;
|health=160&lt;br /&gt;
|mp=120&lt;br /&gt;
|speed=13.0&lt;br /&gt;
|jump_height=3.0&lt;br /&gt;
|game_version=645555d (demo build of v2.2)&lt;br /&gt;
|source_id=data/chars/kama/kama.txt&lt;br /&gt;
}}&lt;br /&gt;
{{Move row|wiki_page=Kamaitachi|ordinal=1|input=Attack, 1st or 3rd press in a row|cancels_from=|damage=3|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Kamaitachi|ordinal=2|input=Attack, 2nd press in a row|cancels_from=|damage=3|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Kamaitachi|ordinal=3|input=Attack, 4th press in a row|cancels_from=|damage=3|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Kamaitachi|ordinal=4|input=Attack, 5th press in a row|cancels_from=|damage=2, 2, 2, 8|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Kamaitachi|ordinal=5|input=Jump, Attack|cancels_from=|damage=8|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Kamaitachi|ordinal=6|input=Jump, Up + Attack|cancels_from=|damage=6|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Kamaitachi|ordinal=7|input=Jump while moving, Attack|cancels_from=|damage=7|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Kamaitachi|ordinal=8|input=Attack while holding an enemy (1st and 2nd press)|cancels_from=|damage=10 (finish)|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Kamaitachi|ordinal=9|input=Attack while holding an enemy (3rd press), or Jump|cancels_from=|damage=15 (throw)|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Kamaitachi|ordinal=10|input=Back + Attack while holding an enemy|cancels_from=|damage=10 (finish)|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Kamaitachi|ordinal=11|input=Up + Attack while holding an enemy|cancels_from=|damage=15 (throw)|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Kamaitachi|ordinal=12|input=Crouch Attack|cancels_from=|damage=3, 3|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Kamaitachi|ordinal=13|input=Charge Sweep|cancels_from=|damage=14|mp_cost=25|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Kamaitachi|ordinal=14|input=Charge Bomb|cancels_from=|damage=30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30 (ExplosionH), 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30 (ExplosionHA), 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30 (ExplosionHB)|mp_cost=120|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Kamaitachi|ordinal=15|input=Block|cancels_from=|damage=No damage|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Kamaitachi|ordinal=16|input=Crouch Attack|cancels_from=Holding an enemy|damage=3, 3|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Kamaitachi|ordinal=17|input=Charge Sweep|cancels_from=Holding an enemy|damage=14|mp_cost=25|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Kamaitachi|ordinal=18|input=Charge Bomb|cancels_from=Holding an enemy|damage=30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30 (ExplosionH), 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30 (ExplosionHA), 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30 (ExplosionHB)|mp_cost=120|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Kamaitachi|ordinal=19|input=Block|cancels_from=Attack while holding an enemy (1st and 2nd press)|damage=No damage|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Kamaitachi|ordinal=20|input=Block|cancels_from=Attack while holding an enemy (3rd press), or Jump|damage=No damage|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Kamaitachi|ordinal=21|input=Block|cancels_from=Back + Attack while holding an enemy|damage=No damage|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Kamaitachi|ordinal=22|input=Block|cancels_from=Up + Attack while holding an enemy|damage=No damage|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Kamaitachi|ordinal=23|input=Crouch Attack|cancels_from=Jumping|damage=8|mp_cost=5|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Kamaitachi|ordinal=24|input=Back, Crouch Attack|cancels_from=Jumping|damage=8|mp_cost=5|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Kamaitachi|ordinal=25|input=Back|cancels_from=Jump, Up + Attack|damage=No damage|only_when=After 1 hit}}&lt;br /&gt;
{{Move row|wiki_page=Kamaitachi|ordinal=26|input=Jump|cancels_from=Jump, Up + Attack|damage=No damage|only_when=After 1 hit}}&lt;br /&gt;
{{Move row|wiki_page=Kamaitachi|ordinal=27|input=Crouch Attack|cancels_from=Jump, Up + Attack|damage=8|mp_cost=5|only_when=After 1 hit}}&lt;br /&gt;
{{Move row|wiki_page=Kamaitachi|ordinal=28|input=Block|cancels_from=Landing|damage=No damage|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Kamaitachi|ordinal=29|input=Crouch Attack|cancels_from=Attack, 2nd press in a row|damage=12|only_when=After 1 hit}}&lt;br /&gt;
{{Move row|wiki_page=Kamaitachi|ordinal=30|input=Crouch Attack|cancels_from=Attack, 4th press in a row|damage=12|only_when=After 1 hit}}&lt;br /&gt;
{{Move row|wiki_page=Kamaitachi|ordinal=31|input=Forward, Jump|cancels_from=Attack, 5th press in a row|damage=6|only_when=After 1 hit}}&lt;br /&gt;
{{Move row|wiki_page=Kamaitachi|ordinal=32|input=Charge Sweep|cancels_from=Attack, 5th press in a row|damage=14|mp_cost=25|only_when=After 1 hit}}&lt;br /&gt;
{{Move row|wiki_page=Kamaitachi|ordinal=33|input=Block|cancels_from=Attack, 5th press in a row|damage=No damage|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Kamaitachi|ordinal=34|input=Forward, Jump|cancels_from=Forward, Forward|damage=6|only_when=After 1 hit}}&lt;br /&gt;
{{Move row|wiki_page=Kamaitachi|ordinal=35|input=Charge Sweep|cancels_from=Forward, Forward|damage=14|mp_cost=25|only_when=After 1 hit}}&lt;br /&gt;
{{Move row|wiki_page=Kamaitachi|ordinal=36|input=Block|cancels_from=Forward, Forward|damage=No damage|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Kamaitachi|ordinal=37|input=Attack|cancels_from=Crouch Attack|damage=3, 3|only_when=After 1 hit}}&lt;br /&gt;
{{Move row|wiki_page=Kamaitachi|ordinal=38|input=Crouch Attack|cancels_from=Crouch Attack|damage=3, 3|only_when=After 1 hit}}&lt;br /&gt;
{{Move row|wiki_page=Kamaitachi|ordinal=39|input=Block|cancels_from=Crouch Attack|damage=No damage|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Kamaitachi|ordinal=40|input=Attack|cancels_from=Attack or Crouch Attack|damage=12|only_when=After 1 hit}}&lt;br /&gt;
{{Move row|wiki_page=Kamaitachi|ordinal=41|input=Crouch Attack|cancels_from=Attack or Crouch Attack|damage=12|only_when=After 1 hit}}&lt;br /&gt;
{{Move row|wiki_page=Kamaitachi|ordinal=42|input=Block|cancels_from=Attack or Crouch Attack|damage=No damage|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Kamaitachi|ordinal=43|input=Forward, Jump|cancels_from=Crouch Attack or Attack|damage=6|only_when=After 1 hit}}&lt;br /&gt;
{{Move row|wiki_page=Kamaitachi|ordinal=44|input=Charge Sweep|cancels_from=Crouch Attack or Attack|damage=14|mp_cost=25|only_when=After 1 hit}}&lt;br /&gt;
{{Move row|wiki_page=Kamaitachi|ordinal=45|input=Block|cancels_from=Crouch Attack or Attack|damage=No damage|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Kamaitachi|ordinal=46|input=Forward, Jump|cancels_from=Forward, Jump|damage=6|only_when=After 1 hit}}&lt;br /&gt;
{{Move row|wiki_page=Kamaitachi|ordinal=47|input=Charge Sweep|cancels_from=Forward, Jump|damage=14|mp_cost=25|only_when=After 1 hit}}&lt;br /&gt;
{{Move row|wiki_page=Kamaitachi|ordinal=48|input=Block|cancels_from=Forward, Jump|damage=No damage|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Kamaitachi|ordinal=49|input=Forward, Jump|cancels_from=Charge Sweep|damage=8|only_when=After 1 hit}}&lt;br /&gt;
{{Move row|wiki_page=Kamaitachi|ordinal=50|input=Block|cancels_from=Charge Sweep|damage=No damage|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Kamaitachi|ordinal=51|input=Back|cancels_from=Crouch Attack|damage=No damage|only_when=After 1 hit}}&lt;br /&gt;
{{Move row|wiki_page=Kamaitachi|ordinal=52|input=Back|cancels_from=Back, Crouch Attack|damage=No damage|only_when=After 1 hit}}&lt;br /&gt;
{{Move row|wiki_page=Kamaitachi|ordinal=53|input=Block|cancels_from=Back, Crouch Attack|damage=No damage|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Kamaitachi|ordinal=54|input=Crouch Attack|cancels_from=Crouch Attack|damage=5|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Kamaitachi|ordinal=55|input=Crouch Attack|cancels_from=Crouch Attack|damage=7|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Kamaitachi|ordinal=56|input=Forward, Jump|cancels_from=Crouch Attack|damage=8|only_when=After 1 hit}}&lt;br /&gt;
{{Move row|wiki_page=Kamaitachi|ordinal=57|input=Attack|cancels_from=Jump or Forward, Jump|damage=6|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Kamaitachi|ordinal=58|input=Crouch Attack|cancels_from=Jump or Forward, Jump|damage=8|mp_cost=5|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Kamaitachi|ordinal=59|input=Back, Crouch Attack|cancels_from=Jump or Forward, Jump|damage=8|mp_cost=5|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Kamaitachi|ordinal=60|input=Block|cancels_from=Jump or Forward, Jump|damage=No damage|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Kamaitachi|ordinal=61|input=Back|cancels_from=Attack|damage=No damage|only_when=After 1 hit}}&lt;br /&gt;
{{Move row|wiki_page=Kamaitachi|ordinal=62|input=Jump|cancels_from=Attack|damage=No damage|only_when=After 1 hit}}&lt;br /&gt;
{{Move row|wiki_page=Kamaitachi|ordinal=63|input=Crouch Attack|cancels_from=Attack|damage=8|mp_cost=5|only_when=After 1 hit}}&lt;br /&gt;
{{Move row|wiki_page=Kamaitachi|ordinal=64|input=Block|cancels_from=Attack|damage=No damage|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Kamaitachi|ordinal=65|input=Attack|cancels_from=Back|damage=8|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Kamaitachi|ordinal=66|input=Crouch Attack|cancels_from=Back|damage=8|mp_cost=5|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Kamaitachi|ordinal=67|input=Back, Crouch Attack|cancels_from=Back|damage=8|mp_cost=5|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Kamaitachi|ordinal=68|input=Block|cancels_from=Back|damage=No damage|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Kamaitachi|ordinal=69|input=Attack|cancels_from=Jump|damage=6|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Kamaitachi|ordinal=70|input=Crouch Attack|cancels_from=Jump|damage=No damage|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Kamaitachi|ordinal=71|input=Back, Crouch Attack|cancels_from=Jump|damage=No damage|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Kamaitachi|ordinal=72|input=Block|cancels_from=Jump|damage=No damage|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Kamaitachi|ordinal=73|input=Back|cancels_from=Forward, Jump|damage=No damage|only_when=After 1 hit}}&lt;br /&gt;
{{Move row|wiki_page=Kamaitachi|ordinal=74|input=Jump|cancels_from=Forward, Jump|damage=No damage|only_when=After 1 hit}}&lt;br /&gt;
{{Move row|wiki_page=Kamaitachi|ordinal=75|input=Crouch Attack|cancels_from=Forward, Jump|damage=8|mp_cost=5|only_when=After 1 hit}}&lt;br /&gt;
{{Move row|wiki_page=Kamaitachi|ordinal=76|input=Attack|cancels_from=Up, Jump|damage=8|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Kamaitachi|ordinal=77|input=Block|cancels_from=Up, Jump|damage=No damage|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Kamaitachi|ordinal=78|input=When it hits|cancels_from=Crouch Attack|damage=10 (finish)|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Kamaitachi|ordinal=79|input=Attack|cancels_from=Follow-up on a hit|damage=8|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Kamaitachi|ordinal=80|input=Block|cancels_from=Follow-up on a hit|damage=No damage|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Kamaitachi|ordinal=81|input=When it hits|cancels_from=Back, Crouch Attack|damage=10 (finish)|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Kamaitachi|ordinal=82|input=Attack|cancels_from=Back, Jump or Jump|damage=8|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Kamaitachi|ordinal=83|input=Crouch Attack|cancels_from=Back, Jump or Jump|damage=8|mp_cost=5|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Kamaitachi|ordinal=84|input=Back, Crouch Attack|cancels_from=Back, Jump or Jump|damage=8|mp_cost=5|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Kamaitachi|ordinal=85|input=Block|cancels_from=Back, Jump or Jump|damage=No damage|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Kamaitachi|ordinal=86|input=Back, Crouch Attack|cancels_from=Forward, Jump|damage=8|mp_cost=5|only_when=After 1 hit}}&lt;br /&gt;
{{Move row|wiki_page=Kamaitachi|ordinal=87|input=Block|cancels_from=Crouch Attack or Block|damage=No damage|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Kamaitachi|ordinal=88|input=Block|cancels_from=Charge Bomb|damage=No damage|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Kamaitachi|ordinal=89|input=Block|cancels_from=Up, Up|damage=No damage|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Kamaitachi|ordinal=90|input=Block|cancels_from=Down, Down|damage=No damage|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Kamaitachi|ordinal=91|input=Jump|cancels_from=Block|damage=No damage|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Kamaitachi|ordinal=92|input=Back, Jump|cancels_from=Block|damage=No damage|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Kamaitachi|ordinal=93|input=Up, Up|cancels_from=Block|damage=No damage|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Kamaitachi|ordinal=94|input=Down, Down|cancels_from=Block|damage=No damage|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Kamaitachi|ordinal=95|input=Forward, Forward|cancels_from=Block|damage=8|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Kamaitachi|ordinal=96|input=Attack|cancels_from=Block|damage=8, 8|mp_cost=30|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Kamaitachi|ordinal=97|input=Crouch Attack|cancels_from=Block|damage=5|mp_cost=15|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Kamaitachi|ordinal=98|input=Charge Sweep|cancels_from=Block|damage=14|mp_cost=25|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Kamaitachi|ordinal=99|input=Forward|cancels_from=Block|damage=No damage|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Kamaitachi|ordinal=100|input=Back|cancels_from=Block|damage=No damage|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Kamaitachi|ordinal=101|input=Up|cancels_from=Block|damage=No damage|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Kamaitachi|ordinal=102|input=Down|cancels_from=Block|damage=No damage|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Kamaitachi|ordinal=103|input=Jump|cancels_from=Forward|damage=No damage|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Kamaitachi|ordinal=104|input=Back, Jump|cancels_from=Forward|damage=No damage|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Kamaitachi|ordinal=105|input=Up, Up|cancels_from=Forward|damage=No damage|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Kamaitachi|ordinal=106|input=Down, Down|cancels_from=Forward|damage=No damage|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Kamaitachi|ordinal=107|input=Crouch Attack|cancels_from=Forward|damage=5|mp_cost=15|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Kamaitachi|ordinal=108|input=Charge Sweep|cancels_from=Forward|damage=14|mp_cost=25|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Kamaitachi|ordinal=109|input=Jump|cancels_from=Back|damage=No damage|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Kamaitachi|ordinal=110|input=Forward, Jump|cancels_from=Back|damage=No damage|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Kamaitachi|ordinal=111|input=Up, Up|cancels_from=Back|damage=No damage|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Kamaitachi|ordinal=112|input=Down, Down|cancels_from=Back|damage=No damage|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Kamaitachi|ordinal=113|input=Crouch Attack|cancels_from=Back|damage=5|mp_cost=15|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Kamaitachi|ordinal=114|input=Charge Sweep|cancels_from=Back|damage=14|mp_cost=25|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Kamaitachi|ordinal=115|input=Jump|cancels_from=Up|damage=No damage|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Kamaitachi|ordinal=116|input=Back, Jump|cancels_from=Up|damage=No damage|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Kamaitachi|ordinal=117|input=Up, Up|cancels_from=Up|damage=No damage|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Kamaitachi|ordinal=118|input=Down, Down|cancels_from=Up|damage=No damage|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Kamaitachi|ordinal=119|input=Crouch Attack|cancels_from=Up|damage=5|mp_cost=15|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Kamaitachi|ordinal=120|input=Charge Sweep|cancels_from=Up|damage=14|mp_cost=25|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Kamaitachi|ordinal=121|input=Jump|cancels_from=Down|damage=No damage|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Kamaitachi|ordinal=122|input=Back, Jump|cancels_from=Down|damage=No damage|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Kamaitachi|ordinal=123|input=Up, Up|cancels_from=Down|damage=No damage|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Kamaitachi|ordinal=124|input=Down, Down|cancels_from=Down|damage=No damage|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Kamaitachi|ordinal=125|input=Crouch Attack|cancels_from=Down|damage=5|mp_cost=15|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Kamaitachi|ordinal=126|input=Charge Sweep|cancels_from=Down|damage=14|mp_cost=25|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Kamaitachi|ordinal=127|input=Crouch Attack|cancels_from=Getting hit|damage=8, 8|mp_cost=15|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Kamaitachi|ordinal=128|input=Block|cancels_from=Getting hit|damage=8, 8|mp_cost=15|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Kamaitachi|ordinal=129|input=Charge Bomb|cancels_from=Getting hit|damage=30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30 (ExplosionH), 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30 (ExplosionHA), 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30 (ExplosionHB)|mp_cost=120|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Kamaitachi|ordinal=130|input=Up, Jump|cancels_from=Knocked down|damage=No damage|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Kamaitachi|ordinal=131|input=Block|cancels_from=Getting up|damage=No damage|only_when=}}&lt;br /&gt;
{{Playable row|wiki_page=Kamaitachi|ordinal=1|health=160|mp=120|speed=13.0|jump_height=3.0}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kamaitachi|ordinal=1|input=Attack, 1st or 3rd press in a row|cancels_from=|damage=3|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kamaitachi|ordinal=2|input=Attack, 2nd press in a row|cancels_from=|damage=3|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kamaitachi|ordinal=3|input=Attack, 4th press in a row|cancels_from=|damage=3|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kamaitachi|ordinal=4|input=Attack, 5th press in a row|cancels_from=|damage=2, 2, 2, 8|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kamaitachi|ordinal=5|input=Jump, Attack|cancels_from=|damage=8|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kamaitachi|ordinal=6|input=Jump, Up + Attack|cancels_from=|damage=6|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kamaitachi|ordinal=7|input=Jump while moving, Attack|cancels_from=|damage=7|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kamaitachi|ordinal=8|input=Attack while holding an enemy (1st and 2nd press)|cancels_from=|damage=10 (finish)|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kamaitachi|ordinal=9|input=Attack while holding an enemy (3rd press), or Jump|cancels_from=|damage=15 (throw)|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kamaitachi|ordinal=10|input=Back + Attack while holding an enemy|cancels_from=|damage=10 (finish)|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kamaitachi|ordinal=11|input=Up + Attack while holding an enemy|cancels_from=|damage=15 (throw)|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kamaitachi|ordinal=12|input=Crouch Attack|cancels_from=|damage=3, 3|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kamaitachi|ordinal=13|input=Charge Sweep|cancels_from=|damage=14|mp_cost=25|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kamaitachi|ordinal=14|input=Charge Bomb|cancels_from=|damage=30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30 (ExplosionH), 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30 (ExplosionHA), 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30 (ExplosionHB)|mp_cost=120|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kamaitachi|ordinal=15|input=Block|cancels_from=|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kamaitachi|ordinal=16|input=Crouch Attack|cancels_from=Holding an enemy|damage=3, 3|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kamaitachi|ordinal=17|input=Charge Sweep|cancels_from=Holding an enemy|damage=14|mp_cost=25|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kamaitachi|ordinal=18|input=Charge Bomb|cancels_from=Holding an enemy|damage=30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30 (ExplosionH), 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30 (ExplosionHA), 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30 (ExplosionHB)|mp_cost=120|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kamaitachi|ordinal=19|input=Block|cancels_from=Attack while holding an enemy (1st and 2nd press)|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kamaitachi|ordinal=20|input=Block|cancels_from=Attack while holding an enemy (3rd press), or Jump|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kamaitachi|ordinal=21|input=Block|cancels_from=Back + Attack while holding an enemy|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kamaitachi|ordinal=22|input=Block|cancels_from=Up + Attack while holding an enemy|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kamaitachi|ordinal=23|input=Crouch Attack|cancels_from=Jumping|damage=8|mp_cost=5|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kamaitachi|ordinal=24|input=Back, Crouch Attack|cancels_from=Jumping|damage=8|mp_cost=5|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kamaitachi|ordinal=25|input=Back|cancels_from=Jump, Up + Attack|damage=No damage|only_when=After 1 hit}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kamaitachi|ordinal=26|input=Jump|cancels_from=Jump, Up + Attack|damage=No damage|only_when=After 1 hit}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kamaitachi|ordinal=27|input=Crouch Attack|cancels_from=Jump, Up + Attack|damage=8|mp_cost=5|only_when=After 1 hit}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kamaitachi|ordinal=28|input=Block|cancels_from=Landing|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kamaitachi|ordinal=29|input=Crouch Attack|cancels_from=Attack, 2nd press in a row|damage=12|only_when=After 1 hit}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kamaitachi|ordinal=30|input=Crouch Attack|cancels_from=Attack, 4th press in a row|damage=12|only_when=After 1 hit}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kamaitachi|ordinal=31|input=Forward, Jump|cancels_from=Attack, 5th press in a row|damage=6|only_when=After 1 hit}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kamaitachi|ordinal=32|input=Charge Sweep|cancels_from=Attack, 5th press in a row|damage=14|mp_cost=25|only_when=After 1 hit}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kamaitachi|ordinal=33|input=Block|cancels_from=Attack, 5th press in a row|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kamaitachi|ordinal=34|input=Forward, Jump|cancels_from=Forward, Forward|damage=6|only_when=After 1 hit}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kamaitachi|ordinal=35|input=Charge Sweep|cancels_from=Forward, Forward|damage=14|mp_cost=25|only_when=After 1 hit}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kamaitachi|ordinal=36|input=Block|cancels_from=Forward, Forward|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kamaitachi|ordinal=37|input=Attack|cancels_from=Crouch Attack|damage=3, 3|only_when=After 1 hit}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kamaitachi|ordinal=38|input=Crouch Attack|cancels_from=Crouch Attack|damage=3, 3|only_when=After 1 hit}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kamaitachi|ordinal=39|input=Block|cancels_from=Crouch Attack|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kamaitachi|ordinal=40|input=Attack|cancels_from=Attack or Crouch Attack|damage=12|only_when=After 1 hit}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kamaitachi|ordinal=41|input=Crouch Attack|cancels_from=Attack or Crouch Attack|damage=12|only_when=After 1 hit}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kamaitachi|ordinal=42|input=Block|cancels_from=Attack or Crouch Attack|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kamaitachi|ordinal=43|input=Forward, Jump|cancels_from=Crouch Attack or Attack|damage=6|only_when=After 1 hit}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kamaitachi|ordinal=44|input=Charge Sweep|cancels_from=Crouch Attack or Attack|damage=14|mp_cost=25|only_when=After 1 hit}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kamaitachi|ordinal=45|input=Block|cancels_from=Crouch Attack or Attack|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kamaitachi|ordinal=46|input=Forward, Jump|cancels_from=Forward, Jump|damage=6|only_when=After 1 hit}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kamaitachi|ordinal=47|input=Charge Sweep|cancels_from=Forward, Jump|damage=14|mp_cost=25|only_when=After 1 hit}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kamaitachi|ordinal=48|input=Block|cancels_from=Forward, Jump|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kamaitachi|ordinal=49|input=Forward, Jump|cancels_from=Charge Sweep|damage=8|only_when=After 1 hit}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kamaitachi|ordinal=50|input=Block|cancels_from=Charge Sweep|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kamaitachi|ordinal=51|input=Back|cancels_from=Crouch Attack|damage=No damage|only_when=After 1 hit}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kamaitachi|ordinal=52|input=Back|cancels_from=Back, Crouch Attack|damage=No damage|only_when=After 1 hit}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kamaitachi|ordinal=53|input=Block|cancels_from=Back, Crouch Attack|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kamaitachi|ordinal=54|input=Crouch Attack|cancels_from=Crouch Attack|damage=5|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kamaitachi|ordinal=55|input=Crouch Attack|cancels_from=Crouch Attack|damage=7|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kamaitachi|ordinal=56|input=Forward, Jump|cancels_from=Crouch Attack|damage=8|only_when=After 1 hit}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kamaitachi|ordinal=57|input=Attack|cancels_from=Jump or Forward, Jump|damage=6|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kamaitachi|ordinal=58|input=Crouch Attack|cancels_from=Jump or Forward, Jump|damage=8|mp_cost=5|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kamaitachi|ordinal=59|input=Back, Crouch Attack|cancels_from=Jump or Forward, Jump|damage=8|mp_cost=5|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kamaitachi|ordinal=60|input=Block|cancels_from=Jump or Forward, Jump|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kamaitachi|ordinal=61|input=Back|cancels_from=Attack|damage=No damage|only_when=After 1 hit}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kamaitachi|ordinal=62|input=Jump|cancels_from=Attack|damage=No damage|only_when=After 1 hit}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kamaitachi|ordinal=63|input=Crouch Attack|cancels_from=Attack|damage=8|mp_cost=5|only_when=After 1 hit}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kamaitachi|ordinal=64|input=Block|cancels_from=Attack|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kamaitachi|ordinal=65|input=Attack|cancels_from=Back|damage=8|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kamaitachi|ordinal=66|input=Crouch Attack|cancels_from=Back|damage=8|mp_cost=5|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kamaitachi|ordinal=67|input=Back, Crouch Attack|cancels_from=Back|damage=8|mp_cost=5|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kamaitachi|ordinal=68|input=Block|cancels_from=Back|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kamaitachi|ordinal=69|input=Attack|cancels_from=Jump|damage=6|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kamaitachi|ordinal=70|input=Crouch Attack|cancels_from=Jump|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kamaitachi|ordinal=71|input=Back, Crouch Attack|cancels_from=Jump|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kamaitachi|ordinal=72|input=Block|cancels_from=Jump|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kamaitachi|ordinal=73|input=Back|cancels_from=Forward, Jump|damage=No damage|only_when=After 1 hit}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kamaitachi|ordinal=74|input=Jump|cancels_from=Forward, Jump|damage=No damage|only_when=After 1 hit}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kamaitachi|ordinal=75|input=Crouch Attack|cancels_from=Forward, Jump|damage=8|mp_cost=5|only_when=After 1 hit}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kamaitachi|ordinal=76|input=Attack|cancels_from=Up, Jump|damage=8|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kamaitachi|ordinal=77|input=Block|cancels_from=Up, Jump|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kamaitachi|ordinal=78|input=When it hits|cancels_from=Crouch Attack|damage=10 (finish)|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kamaitachi|ordinal=79|input=Attack|cancels_from=Follow-up on a hit|damage=8|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kamaitachi|ordinal=80|input=Block|cancels_from=Follow-up on a hit|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kamaitachi|ordinal=81|input=When it hits|cancels_from=Back, Crouch Attack|damage=10 (finish)|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kamaitachi|ordinal=82|input=Attack|cancels_from=Back, Jump or Jump|damage=8|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kamaitachi|ordinal=83|input=Crouch Attack|cancels_from=Back, Jump or Jump|damage=8|mp_cost=5|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kamaitachi|ordinal=84|input=Back, Crouch Attack|cancels_from=Back, Jump or Jump|damage=8|mp_cost=5|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kamaitachi|ordinal=85|input=Block|cancels_from=Back, Jump or Jump|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kamaitachi|ordinal=86|input=Back, Crouch Attack|cancels_from=Forward, Jump|damage=8|mp_cost=5|only_when=After 1 hit}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kamaitachi|ordinal=87|input=Block|cancels_from=Crouch Attack or Block|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kamaitachi|ordinal=88|input=Block|cancels_from=Charge Bomb|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kamaitachi|ordinal=89|input=Block|cancels_from=Up, Up|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kamaitachi|ordinal=90|input=Block|cancels_from=Down, Down|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kamaitachi|ordinal=91|input=Jump|cancels_from=Block|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kamaitachi|ordinal=92|input=Back, Jump|cancels_from=Block|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kamaitachi|ordinal=93|input=Up, Up|cancels_from=Block|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kamaitachi|ordinal=94|input=Down, Down|cancels_from=Block|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kamaitachi|ordinal=95|input=Forward, Forward|cancels_from=Block|damage=8|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kamaitachi|ordinal=96|input=Attack|cancels_from=Block|damage=8, 8|mp_cost=30|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kamaitachi|ordinal=97|input=Crouch Attack|cancels_from=Block|damage=5|mp_cost=15|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kamaitachi|ordinal=98|input=Charge Sweep|cancels_from=Block|damage=14|mp_cost=25|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kamaitachi|ordinal=99|input=Forward|cancels_from=Block|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kamaitachi|ordinal=100|input=Back|cancels_from=Block|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kamaitachi|ordinal=101|input=Up|cancels_from=Block|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kamaitachi|ordinal=102|input=Down|cancels_from=Block|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kamaitachi|ordinal=103|input=Jump|cancels_from=Forward|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kamaitachi|ordinal=104|input=Back, Jump|cancels_from=Forward|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kamaitachi|ordinal=105|input=Up, Up|cancels_from=Forward|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kamaitachi|ordinal=106|input=Down, Down|cancels_from=Forward|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kamaitachi|ordinal=107|input=Crouch Attack|cancels_from=Forward|damage=5|mp_cost=15|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kamaitachi|ordinal=108|input=Charge Sweep|cancels_from=Forward|damage=14|mp_cost=25|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kamaitachi|ordinal=109|input=Jump|cancels_from=Back|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kamaitachi|ordinal=110|input=Forward, Jump|cancels_from=Back|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kamaitachi|ordinal=111|input=Up, Up|cancels_from=Back|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kamaitachi|ordinal=112|input=Down, Down|cancels_from=Back|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kamaitachi|ordinal=113|input=Crouch Attack|cancels_from=Back|damage=5|mp_cost=15|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kamaitachi|ordinal=114|input=Charge Sweep|cancels_from=Back|damage=14|mp_cost=25|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kamaitachi|ordinal=115|input=Jump|cancels_from=Up|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kamaitachi|ordinal=116|input=Back, Jump|cancels_from=Up|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kamaitachi|ordinal=117|input=Up, Up|cancels_from=Up|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kamaitachi|ordinal=118|input=Down, Down|cancels_from=Up|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kamaitachi|ordinal=119|input=Crouch Attack|cancels_from=Up|damage=5|mp_cost=15|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kamaitachi|ordinal=120|input=Charge Sweep|cancels_from=Up|damage=14|mp_cost=25|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kamaitachi|ordinal=121|input=Jump|cancels_from=Down|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kamaitachi|ordinal=122|input=Back, Jump|cancels_from=Down|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kamaitachi|ordinal=123|input=Up, Up|cancels_from=Down|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kamaitachi|ordinal=124|input=Down, Down|cancels_from=Down|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kamaitachi|ordinal=125|input=Crouch Attack|cancels_from=Down|damage=5|mp_cost=15|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kamaitachi|ordinal=126|input=Charge Sweep|cancels_from=Down|damage=14|mp_cost=25|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kamaitachi|ordinal=127|input=Crouch Attack|cancels_from=Getting hit|damage=8, 8|mp_cost=15|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kamaitachi|ordinal=128|input=Block|cancels_from=Getting hit|damage=8, 8|mp_cost=15|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kamaitachi|ordinal=129|input=Charge Bomb|cancels_from=Getting hit|damage=30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30 (ExplosionH), 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30 (ExplosionHA), 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30 (ExplosionHB)|mp_cost=120|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kamaitachi|ordinal=130|input=Up, Jump|cancels_from=Knocked down|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kamaitachi|ordinal=131|input=Block|cancels_from=Getting up|damage=No damage|only_when=}}&lt;br /&gt;
{{HowToPage row|wiki_page=Kamaitachi|ordinal=1|page=33|image=How To Play page 33.png}}&lt;br /&gt;
{{HowToPage row|wiki_page=Kamaitachi|ordinal=2|page=34|image=How To Play page 34.png}}&lt;br /&gt;
{{HowToPage row|wiki_page=Kamaitachi|ordinal=3|page=35|image=How To Play page 35.png}}&lt;br /&gt;
{{HowToPage row|wiki_page=Kamaitachi|ordinal=4|page=36|image=How To Play page 36.png}}&lt;br /&gt;
{{HowToPage row|wiki_page=Kamaitachi|ordinal=5|page=37|image=How To Play page 37.png}}&lt;br /&gt;
{{HowToPage row|wiki_page=Kamaitachi|ordinal=6|page=38|image=How To Play page 38.png}}&lt;br /&gt;
{{HowToPage row|wiki_page=Kamaitachi|ordinal=7|page=39|image=How To Play page 39.png}}&lt;br /&gt;
{{HowToPage row|wiki_page=Kamaitachi|ordinal=8|page=40|image=How To Play page 40.png}}&lt;br /&gt;
{{HowToPage row|wiki_page=Kamaitachi|ordinal=9|page=41|image=How To Play page 41.png}}&lt;br /&gt;
{{HowToPage row|wiki_page=Kamaitachi|ordinal=10|page=42|image=How To Play page 42.png}}&lt;br /&gt;
{{HowToPage row|wiki_page=Kamaitachi|ordinal=11|page=43|image=How To Play page 43.png}}&lt;/div&gt;</summary>
		<author><name>LongJump bot</name></author>
	</entry>
	<entry>
		<id>https://nwrx.wiki.longjump.dev/index.php?title=Data:Character/Kunoichi&amp;diff=626</id>
		<title>Data:Character/Kunoichi</title>
		<link rel="alternate" type="text/html" href="https://nwrx.wiki.longjump.dev/index.php?title=Data:Character/Kunoichi&amp;diff=626"/>
		<updated>2026-11-04T00:19:41Z</updated>

		<summary type="html">&lt;p&gt;LongJump bot: Game data from 645555d&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Character data&lt;br /&gt;
|wiki_page=Kunoichi&lt;br /&gt;
|name=Kunoichi&lt;br /&gt;
|icon=Character Kunoichi.png&lt;br /&gt;
|modes=Normal, Hard, Practice&lt;br /&gt;
|health=160&lt;br /&gt;
|mp=120&lt;br /&gt;
|speed=12.0&lt;br /&gt;
|jump_height=3.0&lt;br /&gt;
|game_version=645555d (demo build of v2.2)&lt;br /&gt;
|source_id=data/chars/kuno/kuno.txt&lt;br /&gt;
}}&lt;br /&gt;
{{Move row|wiki_page=Kunoichi|ordinal=1|input=Attack, 1st or 3rd press in a row|cancels_from=|damage=4|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Kunoichi|ordinal=2|input=Attack, 2nd or 4th press in a row|cancels_from=|damage=4|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Kunoichi|ordinal=3|input=Attack, 5th press in a row|cancels_from=|damage=9|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Kunoichi|ordinal=4|input=Jump, Attack|cancels_from=|damage=7|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Kunoichi|ordinal=5|input=Jump while moving, Attack|cancels_from=|damage=6|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Kunoichi|ordinal=6|input=Attack while holding an enemy (1st and 2nd press)|cancels_from=|damage=5, 10 (throw)|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Kunoichi|ordinal=7|input=Attack while holding an enemy (3rd press), or Jump|cancels_from=|damage=16 (throw)|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Kunoichi|ordinal=8|input=Back + Attack while holding an enemy|cancels_from=|damage=5, 10 (throw)|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Kunoichi|ordinal=9|input=Up + Attack while holding an enemy|cancels_from=|damage=16 (throw)|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Kunoichi|ordinal=10|input=Down + Attack while holding an enemy|cancels_from=|damage=2 (hurt), 2 (hurt), 2 (hurt), 2 (hurt), 2 (hurt), 12 (finish)|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Kunoichi|ordinal=11|input=Crouch Attack|cancels_from=|damage=4, 4|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Kunoichi|ordinal=12|input=Charge Sweep|cancels_from=|damage=10/13/14/15|mp_cost=20|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Kunoichi|ordinal=13|input=Charge Bomb|cancels_from=|damage=30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30 (ExplosionH), 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30 (ExplosionHB), 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30 (ExplosionHA)|mp_cost=120|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Kunoichi|ordinal=14|input=Block|cancels_from=|damage=No damage|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Kunoichi|ordinal=15|input=Crouch Attack|cancels_from=Holding an enemy|damage=4, 4|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Kunoichi|ordinal=16|input=Charge Sweep|cancels_from=Holding an enemy|damage=10/13/14/15|mp_cost=20|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Kunoichi|ordinal=17|input=Charge Bomb|cancels_from=Holding an enemy|damage=30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30 (ExplosionH), 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30 (ExplosionHB), 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30 (ExplosionHA)|mp_cost=120|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Kunoichi|ordinal=18|input=Block|cancels_from=Attack while holding an enemy (1st and 2nd press)|damage=No damage|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Kunoichi|ordinal=19|input=Block|cancels_from=Attack while holding an enemy (3rd press), or Jump|damage=No damage|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Kunoichi|ordinal=20|input=Block|cancels_from=Back + Attack while holding an enemy|damage=No damage|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Kunoichi|ordinal=21|input=Block|cancels_from=Up + Attack while holding an enemy|damage=No damage|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Kunoichi|ordinal=22|input=Block|cancels_from=Down + Attack while holding an enemy|damage=No damage|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Kunoichi|ordinal=23|input=Crouch Attack|cancels_from=Jumping|damage=No damage|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Kunoichi|ordinal=24|input=Back, Crouch Attack|cancels_from=Jumping|damage=No damage|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Kunoichi|ordinal=25|input=Up, Attack|cancels_from=Jumping|damage=7 (Shuriken), 7 (Shuriken3)|mp_cost=10|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Kunoichi|ordinal=26|input=Back|cancels_from=Jump while moving, Attack|damage=No damage|only_when=After 1 hit}}&lt;br /&gt;
{{Move row|wiki_page=Kunoichi|ordinal=27|input=Up, Attack|cancels_from=Jump while moving, Attack|damage=7 (Shuriken), 7 (Shuriken3)|mp_cost=10|only_when=After 1 hit}}&lt;br /&gt;
{{Move row|wiki_page=Kunoichi|ordinal=28|input=Block|cancels_from=Landing|damage=No damage|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Kunoichi|ordinal=29|input=Crouch Attack|cancels_from=Attack, 2nd or 4th press in a row|damage=9|only_when=After 1 hit}}&lt;br /&gt;
{{Move row|wiki_page=Kunoichi|ordinal=30|input=Forward, Jump|cancels_from=Attack, 5th press in a row|damage=6|only_when=After 1 hit}}&lt;br /&gt;
{{Move row|wiki_page=Kunoichi|ordinal=31|input=Charge Sweep|cancels_from=Attack, 5th press in a row|damage=10/13/14/15|mp_cost=20|only_when=After 1 hit}}&lt;br /&gt;
{{Move row|wiki_page=Kunoichi|ordinal=32|input=Attack|cancels_from=Attack, 5th press in a row|damage=7 (Shuriken)|mp_cost=10|only_when=After 1 hit}}&lt;br /&gt;
{{Move row|wiki_page=Kunoichi|ordinal=33|input=Block|cancels_from=Attack, 5th press in a row|damage=No damage|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Kunoichi|ordinal=34|input=Forward, Jump|cancels_from=Forward, Forward|damage=6|only_when=After 1 hit}}&lt;br /&gt;
{{Move row|wiki_page=Kunoichi|ordinal=35|input=Charge Sweep|cancels_from=Forward, Forward|damage=10/13/14/15|mp_cost=20|only_when=After 1 hit}}&lt;br /&gt;
{{Move row|wiki_page=Kunoichi|ordinal=36|input=Block|cancels_from=Forward, Forward|damage=No damage|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Kunoichi|ordinal=37|input=Attack|cancels_from=Crouch Attack|damage=4, 4|only_when=After 1 hit}}&lt;br /&gt;
{{Move row|wiki_page=Kunoichi|ordinal=38|input=Crouch Attack|cancels_from=Crouch Attack|damage=4, 4|only_when=After 1 hit}}&lt;br /&gt;
{{Move row|wiki_page=Kunoichi|ordinal=39|input=Attack|cancels_from=Attack or Crouch Attack|damage=9|only_when=After 1 hit}}&lt;br /&gt;
{{Move row|wiki_page=Kunoichi|ordinal=40|input=Crouch Attack|cancels_from=Attack or Crouch Attack|damage=9|only_when=After 1 hit}}&lt;br /&gt;
{{Move row|wiki_page=Kunoichi|ordinal=41|input=Forward, Jump|cancels_from=Crouch Attack or Attack|damage=6|only_when=After 1 hit}}&lt;br /&gt;
{{Move row|wiki_page=Kunoichi|ordinal=42|input=Charge Sweep|cancels_from=Crouch Attack or Attack|damage=10/13/14/15|mp_cost=20|only_when=After 1 hit}}&lt;br /&gt;
{{Move row|wiki_page=Kunoichi|ordinal=43|input=Attack|cancels_from=Crouch Attack or Attack|damage=7 (Shuriken)|mp_cost=10|only_when=After 1 hit}}&lt;br /&gt;
{{Move row|wiki_page=Kunoichi|ordinal=44|input=Block|cancels_from=Crouch Attack or Attack|damage=No damage|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Kunoichi|ordinal=45|input=Forward, Jump|cancels_from=Charge Sweep|damage=6|only_when=After 1 hit}}&lt;br /&gt;
{{Move row|wiki_page=Kunoichi|ordinal=46|input=Up, Jump|cancels_from=Charge Sweep|damage=No damage|only_when=After 1 hit}}&lt;br /&gt;
{{Move row|wiki_page=Kunoichi|ordinal=47|input=Block|cancels_from=Charge Sweep|damage=No damage|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Kunoichi|ordinal=48|input=Block|cancels_from=Crouch Attack|damage=No damage|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Kunoichi|ordinal=49|input=Block|cancels_from=Attack|damage=No damage|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Kunoichi|ordinal=50|input=When it hits|cancels_from=Crouch Attack|damage=10 (finish)|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Kunoichi|ordinal=51|input=Back|cancels_from=Follow-up on a hit|damage=No damage|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Kunoichi|ordinal=52|input=Up, Attack|cancels_from=Follow-up on a hit|damage=7 (Shuriken), 7 (Shuriken3)|mp_cost=10|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Kunoichi|ordinal=53|input=Block|cancels_from=Follow-up on a hit|damage=No damage|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Kunoichi|ordinal=54|input=Block|cancels_from=Back, Crouch Attack|damage=No damage|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Kunoichi|ordinal=55|input=When it hits|cancels_from=Back, Crouch Attack|damage=10 (finish)|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Kunoichi|ordinal=56|input=Back|cancels_from=Up, Attack or Attack|damage=No damage|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Kunoichi|ordinal=57|input=Attack|cancels_from=Up, Attack or Attack|damage=7 (Shuriken), 7 (Shuriken3)|mp_cost=5|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Kunoichi|ordinal=58|input=Block|cancels_from=Up, Attack or Attack|damage=No damage|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Kunoichi|ordinal=59|input=Back|cancels_from=Attack|damage=No damage|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Kunoichi|ordinal=60|input=Attack|cancels_from=Attack|damage=7 (Shuriken), 7 (Shuriken3)|mp_cost=10|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Kunoichi|ordinal=61|input=Attack|cancels_from=Up, Jump or Jump or Forward, Jump|damage=6|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Kunoichi|ordinal=62|input=Crouch Attack|cancels_from=Up, Jump or Jump or Forward, Jump|damage=No damage|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Kunoichi|ordinal=63|input=Back, Crouch Attack|cancels_from=Up, Jump or Jump or Forward, Jump|damage=No damage|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Kunoichi|ordinal=64|input=Up, Attack|cancels_from=Up, Jump or Jump or Forward, Jump|damage=7 (Shuriken), 7 (Shuriken3)|mp_cost=10|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Kunoichi|ordinal=65|input=Block|cancels_from=Up, Jump or Jump or Forward, Jump|damage=No damage|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Kunoichi|ordinal=66|input=Back|cancels_from=Attack|damage=No damage|only_when=After 1 hit}}&lt;br /&gt;
{{Move row|wiki_page=Kunoichi|ordinal=67|input=Up, Attack|cancels_from=Attack|damage=7 (Shuriken), 7 (Shuriken3)|mp_cost=10|only_when=After 1 hit}}&lt;br /&gt;
{{Move row|wiki_page=Kunoichi|ordinal=68|input=Attack|cancels_from=Back|damage=6|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Kunoichi|ordinal=69|input=Up, Attack|cancels_from=Back|damage=7 (Shuriken), 7 (Shuriken3)|mp_cost=10|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Kunoichi|ordinal=70|input=Block|cancels_from=Back|damage=No damage|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Kunoichi|ordinal=71|input=Back|cancels_from=Forward, Jump|damage=No damage|only_when=After 1 hit}}&lt;br /&gt;
{{Move row|wiki_page=Kunoichi|ordinal=72|input=Up, Attack|cancels_from=Forward, Jump|damage=7 (Shuriken), 7 (Shuriken3)|mp_cost=10|only_when=After 1 hit}}&lt;br /&gt;
{{Move row|wiki_page=Kunoichi|ordinal=73|input=Block|cancels_from=Forward, Jump|damage=No damage|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Kunoichi|ordinal=74|input=Attack|cancels_from=Up, Jump|damage=6|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Kunoichi|ordinal=75|input=Back, Attack|cancels_from=Up, Jump|damage=6|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Kunoichi|ordinal=76|input=Block|cancels_from=Up, Jump|damage=No damage|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Kunoichi|ordinal=77|input=Up, Attack|cancels_from=Up, Jump|damage=7 (Shuriken), 7 (Shuriken3)|mp_cost=10|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Kunoichi|ordinal=78|input=Crouch Attack|cancels_from=Up, Jump|damage=No damage|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Kunoichi|ordinal=79|input=Back, Crouch Attack|cancels_from=Up, Jump|damage=No damage|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Kunoichi|ordinal=80|input=Attack|cancels_from=Back, Jump or Jump|damage=6|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Kunoichi|ordinal=81|input=Block|cancels_from=Back, Jump or Jump|damage=No damage|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Kunoichi|ordinal=82|input=Back|cancels_from=Back, Attack|damage=No damage|only_when=After 1 hit}}&lt;br /&gt;
{{Move row|wiki_page=Kunoichi|ordinal=83|input=Block|cancels_from=Back, Attack|damage=No damage|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Kunoichi|ordinal=84|input=Block|cancels_from=Crouch Attack or Block|damage=No damage|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Kunoichi|ordinal=85|input=Block|cancels_from=Charge Bomb|damage=No damage|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Kunoichi|ordinal=86|input=Attack|cancels_from=Up, Up|damage=6|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Kunoichi|ordinal=87|input=Block|cancels_from=Up, Up|damage=No damage|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Kunoichi|ordinal=88|input=Attack|cancels_from=Down, Down|damage=6|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Kunoichi|ordinal=89|input=Block|cancels_from=Down, Down|damage=No damage|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Kunoichi|ordinal=90|input=Jump|cancels_from=Block|damage=No damage|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Kunoichi|ordinal=91|input=Back, Jump|cancels_from=Block|damage=No damage|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Kunoichi|ordinal=92|input=Up, Up|cancels_from=Block|damage=No damage|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Kunoichi|ordinal=93|input=Down, Down|cancels_from=Block|damage=No damage|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Kunoichi|ordinal=94|input=Attack|cancels_from=Block|damage=9, 9|mp_cost=30|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Kunoichi|ordinal=95|input=Crouch Attack|cancels_from=Block|damage=7 (Shuriken)|mp_cost=10|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Kunoichi|ordinal=96|input=Charge Sweep|cancels_from=Block|damage=10/13/14/15|mp_cost=20|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Kunoichi|ordinal=97|input=Forward, Forward|cancels_from=Block|damage=5|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Kunoichi|ordinal=98|input=Forward|cancels_from=Block|damage=No damage|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Kunoichi|ordinal=99|input=Back|cancels_from=Block|damage=No damage|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Kunoichi|ordinal=100|input=Up|cancels_from=Block|damage=No damage|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Kunoichi|ordinal=101|input=Down|cancels_from=Block|damage=No damage|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Kunoichi|ordinal=102|input=Jump|cancels_from=Forward|damage=No damage|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Kunoichi|ordinal=103|input=Back, Jump|cancels_from=Forward|damage=No damage|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Kunoichi|ordinal=104|input=Up, Up|cancels_from=Forward|damage=No damage|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Kunoichi|ordinal=105|input=Down, Down|cancels_from=Forward|damage=No damage|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Kunoichi|ordinal=106|input=Crouch Attack|cancels_from=Forward|damage=7 (Shuriken)|mp_cost=10|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Kunoichi|ordinal=107|input=Charge Sweep|cancels_from=Forward|damage=10/13/14/15|mp_cost=20|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Kunoichi|ordinal=108|input=Jump|cancels_from=Back|damage=No damage|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Kunoichi|ordinal=109|input=Forward, Jump|cancels_from=Back|damage=No damage|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Kunoichi|ordinal=110|input=Up, Up|cancels_from=Back|damage=No damage|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Kunoichi|ordinal=111|input=Down, Down|cancels_from=Back|damage=No damage|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Kunoichi|ordinal=112|input=Crouch Attack|cancels_from=Back|damage=7 (Shuriken)|mp_cost=10|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Kunoichi|ordinal=113|input=Charge Sweep|cancels_from=Back|damage=10/13/14/15|mp_cost=20|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Kunoichi|ordinal=114|input=Jump|cancels_from=Up|damage=No damage|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Kunoichi|ordinal=115|input=Back, Jump|cancels_from=Up|damage=No damage|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Kunoichi|ordinal=116|input=Up, Up|cancels_from=Up|damage=No damage|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Kunoichi|ordinal=117|input=Down, Down|cancels_from=Up|damage=No damage|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Kunoichi|ordinal=118|input=Crouch Attack|cancels_from=Up|damage=7 (Shuriken)|mp_cost=10|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Kunoichi|ordinal=119|input=Charge Sweep|cancels_from=Up|damage=10/13/14/15|mp_cost=20|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Kunoichi|ordinal=120|input=Jump|cancels_from=Down|damage=No damage|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Kunoichi|ordinal=121|input=Back, Jump|cancels_from=Down|damage=No damage|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Kunoichi|ordinal=122|input=Up, Up|cancels_from=Down|damage=No damage|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Kunoichi|ordinal=123|input=Down, Down|cancels_from=Down|damage=No damage|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Kunoichi|ordinal=124|input=Crouch Attack|cancels_from=Down|damage=7 (Shuriken)|mp_cost=10|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Kunoichi|ordinal=125|input=Charge Sweep|cancels_from=Down|damage=10/13/14/15|mp_cost=20|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Kunoichi|ordinal=126|input=Crouch Attack|cancels_from=Getting hit|damage=9, 9|mp_cost=15|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Kunoichi|ordinal=127|input=Block|cancels_from=Getting hit|damage=9, 9|mp_cost=15|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Kunoichi|ordinal=128|input=Charge Bomb|cancels_from=Getting hit|damage=30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30 (ExplosionH), 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30 (ExplosionHB), 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30 (ExplosionHA)|mp_cost=120|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Kunoichi|ordinal=129|input=Up, Jump|cancels_from=Knocked down|damage=No damage|only_when=}}&lt;br /&gt;
{{Move row|wiki_page=Kunoichi|ordinal=130|input=Block|cancels_from=Getting up|damage=No damage|only_when=}}&lt;br /&gt;
{{Playable row|wiki_page=Kunoichi|ordinal=1|health=160|mp=120|speed=12.0|jump_height=3.0}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kunoichi|ordinal=1|input=Attack, 1st or 3rd press in a row|cancels_from=|damage=4|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kunoichi|ordinal=2|input=Attack, 2nd or 4th press in a row|cancels_from=|damage=4|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kunoichi|ordinal=3|input=Attack, 5th press in a row|cancels_from=|damage=9|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kunoichi|ordinal=4|input=Jump, Attack|cancels_from=|damage=7|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kunoichi|ordinal=5|input=Jump while moving, Attack|cancels_from=|damage=6|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kunoichi|ordinal=6|input=Attack while holding an enemy (1st and 2nd press)|cancels_from=|damage=5, 10 (throw)|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kunoichi|ordinal=7|input=Attack while holding an enemy (3rd press), or Jump|cancels_from=|damage=16 (throw)|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kunoichi|ordinal=8|input=Back + Attack while holding an enemy|cancels_from=|damage=5, 10 (throw)|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kunoichi|ordinal=9|input=Up + Attack while holding an enemy|cancels_from=|damage=16 (throw)|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kunoichi|ordinal=10|input=Down + Attack while holding an enemy|cancels_from=|damage=2 (hurt), 2 (hurt), 2 (hurt), 2 (hurt), 2 (hurt), 12 (finish)|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kunoichi|ordinal=11|input=Crouch Attack|cancels_from=|damage=4, 4|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kunoichi|ordinal=12|input=Charge Sweep|cancels_from=|damage=10/13/14/15|mp_cost=20|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kunoichi|ordinal=13|input=Charge Bomb|cancels_from=|damage=30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30 (ExplosionH), 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30 (ExplosionHB), 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30 (ExplosionHA)|mp_cost=120|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kunoichi|ordinal=14|input=Block|cancels_from=|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kunoichi|ordinal=15|input=Crouch Attack|cancels_from=Holding an enemy|damage=4, 4|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kunoichi|ordinal=16|input=Charge Sweep|cancels_from=Holding an enemy|damage=10/13/14/15|mp_cost=20|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kunoichi|ordinal=17|input=Charge Bomb|cancels_from=Holding an enemy|damage=30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30 (ExplosionH), 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30 (ExplosionHB), 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30 (ExplosionHA)|mp_cost=120|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kunoichi|ordinal=18|input=Block|cancels_from=Attack while holding an enemy (1st and 2nd press)|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kunoichi|ordinal=19|input=Block|cancels_from=Attack while holding an enemy (3rd press), or Jump|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kunoichi|ordinal=20|input=Block|cancels_from=Back + Attack while holding an enemy|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kunoichi|ordinal=21|input=Block|cancels_from=Up + Attack while holding an enemy|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kunoichi|ordinal=22|input=Block|cancels_from=Down + Attack while holding an enemy|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kunoichi|ordinal=23|input=Crouch Attack|cancels_from=Jumping|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kunoichi|ordinal=24|input=Back, Crouch Attack|cancels_from=Jumping|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kunoichi|ordinal=25|input=Up, Attack|cancels_from=Jumping|damage=7 (Shuriken), 7 (Shuriken3)|mp_cost=10|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kunoichi|ordinal=26|input=Back|cancels_from=Jump while moving, Attack|damage=No damage|only_when=After 1 hit}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kunoichi|ordinal=27|input=Up, Attack|cancels_from=Jump while moving, Attack|damage=7 (Shuriken), 7 (Shuriken3)|mp_cost=10|only_when=After 1 hit}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kunoichi|ordinal=28|input=Block|cancels_from=Landing|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kunoichi|ordinal=29|input=Crouch Attack|cancels_from=Attack, 2nd or 4th press in a row|damage=9|only_when=After 1 hit}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kunoichi|ordinal=30|input=Forward, Jump|cancels_from=Attack, 5th press in a row|damage=6|only_when=After 1 hit}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kunoichi|ordinal=31|input=Charge Sweep|cancels_from=Attack, 5th press in a row|damage=10/13/14/15|mp_cost=20|only_when=After 1 hit}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kunoichi|ordinal=32|input=Attack|cancels_from=Attack, 5th press in a row|damage=7 (Shuriken)|mp_cost=10|only_when=After 1 hit}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kunoichi|ordinal=33|input=Block|cancels_from=Attack, 5th press in a row|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kunoichi|ordinal=34|input=Forward, Jump|cancels_from=Forward, Forward|damage=6|only_when=After 1 hit}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kunoichi|ordinal=35|input=Charge Sweep|cancels_from=Forward, Forward|damage=10/13/14/15|mp_cost=20|only_when=After 1 hit}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kunoichi|ordinal=36|input=Block|cancels_from=Forward, Forward|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kunoichi|ordinal=37|input=Attack|cancels_from=Crouch Attack|damage=4, 4|only_when=After 1 hit}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kunoichi|ordinal=38|input=Crouch Attack|cancels_from=Crouch Attack|damage=4, 4|only_when=After 1 hit}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kunoichi|ordinal=39|input=Attack|cancels_from=Attack or Crouch Attack|damage=9|only_when=After 1 hit}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kunoichi|ordinal=40|input=Crouch Attack|cancels_from=Attack or Crouch Attack|damage=9|only_when=After 1 hit}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kunoichi|ordinal=41|input=Forward, Jump|cancels_from=Crouch Attack or Attack|damage=6|only_when=After 1 hit}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kunoichi|ordinal=42|input=Charge Sweep|cancels_from=Crouch Attack or Attack|damage=10/13/14/15|mp_cost=20|only_when=After 1 hit}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kunoichi|ordinal=43|input=Attack|cancels_from=Crouch Attack or Attack|damage=7 (Shuriken)|mp_cost=10|only_when=After 1 hit}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kunoichi|ordinal=44|input=Block|cancels_from=Crouch Attack or Attack|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kunoichi|ordinal=45|input=Forward, Jump|cancels_from=Charge Sweep|damage=6|only_when=After 1 hit}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kunoichi|ordinal=46|input=Up, Jump|cancels_from=Charge Sweep|damage=No damage|only_when=After 1 hit}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kunoichi|ordinal=47|input=Block|cancels_from=Charge Sweep|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kunoichi|ordinal=48|input=Block|cancels_from=Crouch Attack|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kunoichi|ordinal=49|input=Block|cancels_from=Attack|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kunoichi|ordinal=50|input=When it hits|cancels_from=Crouch Attack|damage=10 (finish)|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kunoichi|ordinal=51|input=Back|cancels_from=Follow-up on a hit|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kunoichi|ordinal=52|input=Block|cancels_from=Follow-up on a hit|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kunoichi|ordinal=53|input=Block|cancels_from=Back, Crouch Attack|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kunoichi|ordinal=54|input=When it hits|cancels_from=Back, Crouch Attack|damage=10 (finish)|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kunoichi|ordinal=55|input=Back|cancels_from=Up, Attack or Attack|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kunoichi|ordinal=56|input=Attack|cancels_from=Up, Attack or Attack|damage=7 (Shuriken), 7 (Shuriken3)|mp_cost=5|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kunoichi|ordinal=57|input=Block|cancels_from=Up, Attack or Attack|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kunoichi|ordinal=58|input=Back|cancels_from=Attack|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kunoichi|ordinal=59|input=Attack|cancels_from=Attack|damage=7 (Shuriken), 7 (Shuriken3)|mp_cost=10|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kunoichi|ordinal=60|input=Attack|cancels_from=Up, Jump or Jump or Forward, Jump|damage=6|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kunoichi|ordinal=61|input=Crouch Attack|cancels_from=Up, Jump or Jump or Forward, Jump|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kunoichi|ordinal=62|input=Back, Crouch Attack|cancels_from=Up, Jump or Jump or Forward, Jump|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kunoichi|ordinal=63|input=Up, Attack|cancels_from=Up, Jump or Jump or Forward, Jump|damage=7 (Shuriken), 7 (Shuriken3)|mp_cost=10|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kunoichi|ordinal=64|input=Block|cancels_from=Up, Jump or Jump or Forward, Jump|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kunoichi|ordinal=65|input=Back|cancels_from=Attack|damage=No damage|only_when=After 1 hit}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kunoichi|ordinal=66|input=Up, Attack|cancels_from=Attack|damage=7 (Shuriken), 7 (Shuriken3)|mp_cost=10|only_when=After 1 hit}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kunoichi|ordinal=67|input=Attack|cancels_from=Back|damage=6|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kunoichi|ordinal=68|input=Up, Attack|cancels_from=Back|damage=7 (Shuriken), 7 (Shuriken3)|mp_cost=10|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kunoichi|ordinal=69|input=Block|cancels_from=Back|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kunoichi|ordinal=70|input=Back|cancels_from=Forward, Jump|damage=No damage|only_when=After 1 hit}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kunoichi|ordinal=71|input=Up, Attack|cancels_from=Forward, Jump|damage=7 (Shuriken), 7 (Shuriken3)|mp_cost=10|only_when=After 1 hit}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kunoichi|ordinal=72|input=Block|cancels_from=Forward, Jump|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kunoichi|ordinal=73|input=Attack|cancels_from=Up, Jump|damage=6|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kunoichi|ordinal=74|input=Back, Attack|cancels_from=Up, Jump|damage=6|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kunoichi|ordinal=75|input=Block|cancels_from=Up, Jump|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kunoichi|ordinal=76|input=Up, Attack|cancels_from=Up, Jump|damage=7 (Shuriken), 7 (Shuriken3)|mp_cost=10|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kunoichi|ordinal=77|input=Crouch Attack|cancels_from=Up, Jump|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kunoichi|ordinal=78|input=Back, Crouch Attack|cancels_from=Up, Jump|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kunoichi|ordinal=79|input=Attack|cancels_from=Back, Jump or Jump|damage=6|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kunoichi|ordinal=80|input=Block|cancels_from=Back, Jump or Jump|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kunoichi|ordinal=81|input=Back|cancels_from=Back, Attack|damage=No damage|only_when=After 1 hit}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kunoichi|ordinal=82|input=Block|cancels_from=Back, Attack|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kunoichi|ordinal=83|input=Block|cancels_from=Crouch Attack or Block|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kunoichi|ordinal=84|input=Block|cancels_from=Charge Bomb|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kunoichi|ordinal=85|input=Attack|cancels_from=Up, Up|damage=6|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kunoichi|ordinal=86|input=Block|cancels_from=Up, Up|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kunoichi|ordinal=87|input=Attack|cancels_from=Down, Down|damage=6|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kunoichi|ordinal=88|input=Block|cancels_from=Down, Down|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kunoichi|ordinal=89|input=Jump|cancels_from=Block|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kunoichi|ordinal=90|input=Back, Jump|cancels_from=Block|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kunoichi|ordinal=91|input=Up, Up|cancels_from=Block|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kunoichi|ordinal=92|input=Down, Down|cancels_from=Block|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kunoichi|ordinal=93|input=Attack|cancels_from=Block|damage=9, 9|mp_cost=30|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kunoichi|ordinal=94|input=Crouch Attack|cancels_from=Block|damage=7 (Shuriken)|mp_cost=10|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kunoichi|ordinal=95|input=Charge Sweep|cancels_from=Block|damage=10/13/14/15|mp_cost=20|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kunoichi|ordinal=96|input=Forward, Forward|cancels_from=Block|damage=5|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kunoichi|ordinal=97|input=Forward|cancels_from=Block|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kunoichi|ordinal=98|input=Back|cancels_from=Block|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kunoichi|ordinal=99|input=Up|cancels_from=Block|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kunoichi|ordinal=100|input=Down|cancels_from=Block|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kunoichi|ordinal=101|input=Jump|cancels_from=Forward|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kunoichi|ordinal=102|input=Back, Jump|cancels_from=Forward|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kunoichi|ordinal=103|input=Up, Up|cancels_from=Forward|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kunoichi|ordinal=104|input=Down, Down|cancels_from=Forward|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kunoichi|ordinal=105|input=Crouch Attack|cancels_from=Forward|damage=7 (Shuriken)|mp_cost=10|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kunoichi|ordinal=106|input=Charge Sweep|cancels_from=Forward|damage=10/13/14/15|mp_cost=20|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kunoichi|ordinal=107|input=Jump|cancels_from=Back|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kunoichi|ordinal=108|input=Forward, Jump|cancels_from=Back|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kunoichi|ordinal=109|input=Up, Up|cancels_from=Back|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kunoichi|ordinal=110|input=Down, Down|cancels_from=Back|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kunoichi|ordinal=111|input=Crouch Attack|cancels_from=Back|damage=7 (Shuriken)|mp_cost=10|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kunoichi|ordinal=112|input=Charge Sweep|cancels_from=Back|damage=10/13/14/15|mp_cost=20|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kunoichi|ordinal=113|input=Jump|cancels_from=Up|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kunoichi|ordinal=114|input=Back, Jump|cancels_from=Up|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kunoichi|ordinal=115|input=Up, Up|cancels_from=Up|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kunoichi|ordinal=116|input=Down, Down|cancels_from=Up|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kunoichi|ordinal=117|input=Crouch Attack|cancels_from=Up|damage=7 (Shuriken)|mp_cost=10|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kunoichi|ordinal=118|input=Charge Sweep|cancels_from=Up|damage=10/13/14/15|mp_cost=20|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kunoichi|ordinal=119|input=Jump|cancels_from=Down|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kunoichi|ordinal=120|input=Back, Jump|cancels_from=Down|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kunoichi|ordinal=121|input=Up, Up|cancels_from=Down|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kunoichi|ordinal=122|input=Down, Down|cancels_from=Down|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kunoichi|ordinal=123|input=Crouch Attack|cancels_from=Down|damage=7 (Shuriken)|mp_cost=10|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kunoichi|ordinal=124|input=Charge Sweep|cancels_from=Down|damage=10/13/14/15|mp_cost=20|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kunoichi|ordinal=125|input=Crouch Attack|cancels_from=Getting hit|damage=9, 9|mp_cost=15|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kunoichi|ordinal=126|input=Block|cancels_from=Getting hit|damage=9, 9|mp_cost=15|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kunoichi|ordinal=127|input=Charge Bomb|cancels_from=Getting hit|damage=30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30 (ExplosionH), 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30 (ExplosionHB), 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30 (ExplosionHA)|mp_cost=120|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kunoichi|ordinal=128|input=Up, Jump|cancels_from=Knocked down|damage=No damage|only_when=}}&lt;br /&gt;
{{ExtraMove row|wiki_page=Kunoichi|ordinal=129|input=Block|cancels_from=Getting up|damage=No damage|only_when=}}&lt;br /&gt;
{{HowToPage row|wiki_page=Kunoichi|ordinal=1|page=2|image=How To Play page 2.png}}&lt;br /&gt;
{{HowToPage row|wiki_page=Kunoichi|ordinal=2|page=3|image=How To Play page 3.png}}&lt;br /&gt;
{{HowToPage row|wiki_page=Kunoichi|ordinal=3|page=4|image=How To Play page 4.png}}&lt;br /&gt;
{{HowToPage row|wiki_page=Kunoichi|ordinal=4|page=5|image=How To Play page 5.png}}&lt;br /&gt;
{{HowToPage row|wiki_page=Kunoichi|ordinal=5|page=6|image=How To Play page 6.png}}&lt;br /&gt;
{{HowToPage row|wiki_page=Kunoichi|ordinal=6|page=7|image=How To Play page 7.png}}&lt;br /&gt;
{{HowToPage row|wiki_page=Kunoichi|ordinal=7|page=8|image=How To Play page 8.png}}&lt;br /&gt;
{{HowToPage row|wiki_page=Kunoichi|ordinal=8|page=9|image=How To Play page 9.png}}&lt;br /&gt;
{{HowToPage row|wiki_page=Kunoichi|ordinal=9|page=10|image=How To Play page 10.png}}&lt;br /&gt;
{{HowToPage row|wiki_page=Kunoichi|ordinal=10|page=11|image=How To Play page 11.png}}&lt;br /&gt;
{{HowToPage row|wiki_page=Kunoichi|ordinal=11|page=12|image=How To Play page 12.png}}&lt;br /&gt;
{{HowToPage row|wiki_page=Kunoichi|ordinal=12|page=13|image=How To Play page 13.png}}&lt;br /&gt;
{{HowToPage row|wiki_page=Kunoichi|ordinal=13|page=14|image=How To Play page 14.png}}&lt;br /&gt;
{{HowToPage row|wiki_page=Kunoichi|ordinal=14|page=15|image=How To Play page 15.png}}&lt;/div&gt;</summary>
		<author><name>LongJump bot</name></author>
	</entry>
	<entry>
		<id>https://nwrx.wiki.longjump.dev/index.php?title=Data:Stage/Stage_8-5&amp;diff=625</id>
		<title>Data:Stage/Stage 8-5</title>
		<link rel="alternate" type="text/html" href="https://nwrx.wiki.longjump.dev/index.php?title=Data:Stage/Stage_8-5&amp;diff=625"/>
		<updated>2026-11-04T00:19:40Z</updated>

		<summary type="html">&lt;p&gt;LongJump bot: Game data from 645555d&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Stage data&lt;br /&gt;
|wiki_page=Stage 8-5&lt;br /&gt;
|name=Stage 8-5&lt;br /&gt;
|icon=Stage 8-5.png&lt;br /&gt;
|modes=Normal, Hard&lt;br /&gt;
|bosses=Banglar&lt;br /&gt;
|game_version=645555d (demo build of v2.2)&lt;br /&gt;
|source_id=data/levels.txt#Stage 8-5&lt;br /&gt;
}}&lt;br /&gt;
{{Spawn row|wiki_page=Stage 8-5|ordinal=1|mode=Normal|level=Stage 8-5|enemy=Banglar|shown_name=Banglar|health=350|boss=1|spawns=1}}&lt;br /&gt;
{{Spawn row|wiki_page=Stage 8-5|ordinal=2|mode=Normal|level=Stage 8-5|enemy=Flame Ninja|shown_name=Flame Ninja|health=44|boss=0|spawns=7}}&lt;br /&gt;
{{Spawn row|wiki_page=Stage 8-5|ordinal=3|mode=Normal|level=Stage 8-5|enemy=Fox|shown_name=Fox|health=48|boss=0|spawns=1}}&lt;br /&gt;
{{Spawn row|wiki_page=Stage 8-5|ordinal=4|mode=Normal|level=Stage 8-5|enemy=Golem|shown_name=Golem|health=80|boss=0|spawns=1}}&lt;br /&gt;
{{Spawn row|wiki_page=Stage 8-5|ordinal=5|mode=Normal|level=Stage 8-5|enemy=Knife Army|shown_name=Knife Army|health=12|boss=0|spawns=1}}&lt;br /&gt;
{{Spawn row|wiki_page=Stage 8-5|ordinal=6|mode=Normal|level=Stage 8-5|enemy=Kunoichi (enemy)|shown_name=Kunoichi|health=48|boss=0|spawns=1}}&lt;br /&gt;
{{Spawn row|wiki_page=Stage 8-5|ordinal=7|mode=Normal|level=Stage 8-5|enemy=Machine Gun Army|shown_name=Machine Gun Army|health=28|boss=0|spawns=1}}&lt;br /&gt;
{{Spawn row|wiki_page=Stage 8-5|ordinal=8|mode=Normal|level=Stage 8-5|enemy=Monkey|shown_name=Monkey|health=40|boss=0|spawns=6}}&lt;br /&gt;
{{Spawn row|wiki_page=Stage 8-5|ordinal=9|mode=Normal|level=Stage 8-5|enemy=Over Shinobu|shown_name=Over Shinobu|health=80|boss=0|spawns=1}}&lt;br /&gt;
{{Spawn row|wiki_page=Stage 8-5|ordinal=10|mode=Normal|level=Stage 8-5|enemy=Panther|shown_name=Panther|health=34|boss=0|spawns=1}}&lt;br /&gt;
{{Spawn row|wiki_page=Stage 8-5|ordinal=11|mode=Normal|level=Stage 8-5|enemy=Puma|shown_name=Puma|health=70|boss=0|spawns=10}}&lt;br /&gt;
{{Spawn row|wiki_page=Stage 8-5|ordinal=12|mode=Normal|level=Stage 8-5|enemy=Shadow Man|shown_name=Shadow Man|health=48|boss=0|spawns=16}}&lt;br /&gt;
{{Spawn row|wiki_page=Stage 8-5|ordinal=13|mode=Normal|level=Stage 8-5|enemy=Snake|shown_name=Snake|health=20|boss=0|spawns=1}}&lt;br /&gt;
{{Spawn row|wiki_page=Stage 8-5|ordinal=14|mode=Hard|level=Stage 8-5|enemy=Banglar|shown_name=Banglar|health=350|boss=1|spawns=1}}&lt;br /&gt;
{{Spawn row|wiki_page=Stage 8-5|ordinal=15|mode=Hard|level=Stage 8-5|enemy=Flame Ninja|shown_name=Flame Ninja|health=44|boss=0|spawns=1}}&lt;br /&gt;
{{Spawn row|wiki_page=Stage 8-5|ordinal=16|mode=Hard|level=Stage 8-5|enemy=Fox|shown_name=Fox|health=48|boss=0|spawns=1}}&lt;br /&gt;
{{Spawn row|wiki_page=Stage 8-5|ordinal=17|mode=Hard|level=Stage 8-5|enemy=Fox|shown_name=Fox Mix|health=60|boss=0|spawns=2}}&lt;br /&gt;
{{Spawn row|wiki_page=Stage 8-5|ordinal=18|mode=Hard|level=Stage 8-5|enemy=Fox|shown_name=Fox Zero|health=60|boss=0|spawns=2}}&lt;br /&gt;
{{Spawn row|wiki_page=Stage 8-5|ordinal=19|mode=Hard|level=Stage 8-5|enemy=Golem|shown_name=Golem|health=80|boss=0|spawns=1}}&lt;br /&gt;
{{Spawn row|wiki_page=Stage 8-5|ordinal=20|mode=Hard|level=Stage 8-5|enemy=Knife Army|shown_name=Knife Army A|health=12|boss=0|spawns=1}}&lt;br /&gt;
{{Spawn row|wiki_page=Stage 8-5|ordinal=21|mode=Hard|level=Stage 8-5|enemy=Knife Army|shown_name=Knife Army B|health=16|boss=0|spawns=4}}&lt;br /&gt;
{{Spawn row|wiki_page=Stage 8-5|ordinal=22|mode=Hard|level=Stage 8-5|enemy=Knife Army|shown_name=Knife Army C|health=16|boss=0|spawns=3}}&lt;br /&gt;
{{Spawn row|wiki_page=Stage 8-5|ordinal=23|mode=Hard|level=Stage 8-5|enemy=Knife Army|shown_name=Knife Army D|health=20|boss=0|spawns=6}}&lt;br /&gt;
{{Spawn row|wiki_page=Stage 8-5|ordinal=24|mode=Hard|level=Stage 8-5|enemy=Kunoichi (enemy)|shown_name=Kunoichi Master|health=60|boss=0|spawns=3}}&lt;br /&gt;
{{Spawn row|wiki_page=Stage 8-5|ordinal=25|mode=Hard|level=Stage 8-5|enemy=Kunoichi (enemy)|shown_name=Kunoichi Normal|health=48|boss=0|spawns=1}}&lt;br /&gt;
{{Spawn row|wiki_page=Stage 8-5|ordinal=26|mode=Hard|level=Stage 8-5|enemy=Machine Gun Army|shown_name=Machine Gun Army A|health=28|boss=0|spawns=1}}&lt;br /&gt;
{{Spawn row|wiki_page=Stage 8-5|ordinal=27|mode=Hard|level=Stage 8-5|enemy=Machine Gun Army|shown_name=Machine Gun Army B|health=34|boss=0|spawns=2}}&lt;br /&gt;
{{Spawn row|wiki_page=Stage 8-5|ordinal=28|mode=Hard|level=Stage 8-5|enemy=Machine Gun Army|shown_name=Machine Gun Army C|health=34|boss=0|spawns=3}}&lt;br /&gt;
{{Spawn row|wiki_page=Stage 8-5|ordinal=29|mode=Hard|level=Stage 8-5|enemy=Monkey|shown_name=Monkey|health=40|boss=0|spawns=3}}&lt;br /&gt;
{{Spawn row|wiki_page=Stage 8-5|ordinal=30|mode=Hard|level=Stage 8-5|enemy=Over Shinobu|shown_name=Over Shinobu|health=80|boss=0|spawns=1}}&lt;br /&gt;
{{Spawn row|wiki_page=Stage 8-5|ordinal=31|mode=Hard|level=Stage 8-5|enemy=Over Shinobu|shown_name=Over Shinobu Max|health=120|boss=0|spawns=1}}&lt;br /&gt;
{{Spawn row|wiki_page=Stage 8-5|ordinal=32|mode=Hard|level=Stage 8-5|enemy=Panther|shown_name=Panther|health=34|boss=0|spawns=1}}&lt;br /&gt;
{{Spawn row|wiki_page=Stage 8-5|ordinal=33|mode=Hard|level=Stage 8-5|enemy=Panther|shown_name=Panther Leader|health=40|boss=0|spawns=2}}&lt;br /&gt;
{{Spawn row|wiki_page=Stage 8-5|ordinal=34|mode=Hard|level=Stage 8-5|enemy=Puma|shown_name=Puma|health=70|boss=0|spawns=2}}&lt;br /&gt;
{{Spawn row|wiki_page=Stage 8-5|ordinal=35|mode=Hard|level=Stage 8-5|enemy=Puma|shown_name=Puma Type II|health=70|boss=0|spawns=3}}&lt;br /&gt;
{{Spawn row|wiki_page=Stage 8-5|ordinal=36|mode=Hard|level=Stage 8-5|enemy=Shadow Man|shown_name=Shadow Man Blue|health=40|boss=0|spawns=3}}&lt;br /&gt;
{{Spawn row|wiki_page=Stage 8-5|ordinal=37|mode=Hard|level=Stage 8-5|enemy=Shadow Man|shown_name=Shadow Man Green|health=48|boss=0|spawns=1}}&lt;br /&gt;
{{Spawn row|wiki_page=Stage 8-5|ordinal=38|mode=Hard|level=Stage 8-5|enemy=Shadow Man|shown_name=Shadow Man White|health=60|boss=0|spawns=2}}&lt;br /&gt;
{{Spawn row|wiki_page=Stage 8-5|ordinal=39|mode=Hard|level=Stage 8-5|enemy=Snake|shown_name=Snake|health=20|boss=0|spawns=1}}&lt;br /&gt;
{{Spawn row|wiki_page=Stage 8-5|ordinal=40|mode=Hard|level=Stage 8-5|enemy=Snake|shown_name=Snake Captain|health=26|boss=0|spawns=4}}&lt;/div&gt;</summary>
		<author><name>LongJump bot</name></author>
	</entry>
	<entry>
		<id>https://nwrx.wiki.longjump.dev/index.php?title=Data:Mode/Extra&amp;diff=624</id>
		<title>Data:Mode/Extra</title>
		<link rel="alternate" type="text/html" href="https://nwrx.wiki.longjump.dev/index.php?title=Data:Mode/Extra&amp;diff=624"/>
		<updated>2026-11-04T00:19:38Z</updated>

		<summary type="html">&lt;p&gt;LongJump bot: Game data from 645555d&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Mode data&lt;br /&gt;
|wiki_page=Extra&lt;br /&gt;
|name=Extra&lt;br /&gt;
|icon=Mode Extra.png&lt;br /&gt;
|lives=1&lt;br /&gt;
|credits=10&lt;br /&gt;
|unlocked_by=Finish the Game to Unlock&lt;br /&gt;
|characters=Kunoichi, Kamaitachi, Ninja, Phantom Gecko, Silverman, Jubei, Giganto, Zeros, Chainsaw Bull, Phobos, Deimos, Fox, Over Shinobu, Golem, Puma, Flame Ninja, Kunoichi (enemy), Knife Army, Snake, Panther, Machine Gun Army, Monkey, Shadow Man&lt;br /&gt;
|game_version=645555d (demo build of v2.2)&lt;br /&gt;
|source_id=data/levels.txt#Extra&lt;br /&gt;
}}&lt;br /&gt;
{{Spawn row|wiki_page=Extra|ordinal=1|mode=Extra|level=First challenge|enemy=3SVO II|shown_name=3SVO II|health=20|boss=0|spawns=9}}&lt;br /&gt;
{{Spawn row|wiki_page=Extra|ordinal=2|mode=Extra|level=First challenge|enemy=Flame Ninja|shown_name=Flame Ninja|health=44|boss=0|spawns=7}}&lt;br /&gt;
{{Spawn row|wiki_page=Extra|ordinal=3|mode=Extra|level=First challenge|enemy=Fox|shown_name=Fox Mix|health=60|boss=0|spawns=6}}&lt;br /&gt;
{{Spawn row|wiki_page=Extra|ordinal=4|mode=Extra|level=First challenge|enemy=Fox|shown_name=Fox Zero|health=60|boss=0|spawns=4}}&lt;br /&gt;
{{Spawn row|wiki_page=Extra|ordinal=5|mode=Extra|level=First challenge|enemy=Giganto|shown_name=Giganto Mk VI|health=400|boss=1|spawns=1}}&lt;br /&gt;
{{Spawn row|wiki_page=Extra|ordinal=6|mode=Extra|level=First challenge|enemy=Golem|shown_name=Golem|health=80|boss=0|spawns=4}}&lt;br /&gt;
{{Spawn row|wiki_page=Extra|ordinal=7|mode=Extra|level=First challenge|enemy=Golem|shown_name=Golem Mk I|health=80|boss=0|spawns=2}}&lt;br /&gt;
{{Spawn row|wiki_page=Extra|ordinal=8|mode=Extra|level=First challenge|enemy=Knife Army|shown_name=Knife Army B|health=16|boss=0|spawns=23}}&lt;br /&gt;
{{Spawn row|wiki_page=Extra|ordinal=9|mode=Extra|level=First challenge|enemy=Knife Army|shown_name=Knife Army C|health=16|boss=0|spawns=18}}&lt;br /&gt;
{{Spawn row|wiki_page=Extra|ordinal=10|mode=Extra|level=First challenge|enemy=Knife Army|shown_name=Knife Army D|health=20|boss=0|spawns=9}}&lt;br /&gt;
{{Spawn row|wiki_page=Extra|ordinal=11|mode=Extra|level=First challenge|enemy=Kunoichi (enemy)|shown_name=Kunoichi Master|health=60|boss=0|spawns=8}}&lt;br /&gt;
{{Spawn row|wiki_page=Extra|ordinal=12|mode=Extra|level=First challenge|enemy=Machine Gun Army|shown_name=Machine Gun Army B|health=34|boss=0|spawns=9}}&lt;br /&gt;
{{Spawn row|wiki_page=Extra|ordinal=13|mode=Extra|level=First challenge|enemy=Machine Gun Army|shown_name=Machine Gun Army C|health=34|boss=0|spawns=4}}&lt;br /&gt;
{{Spawn row|wiki_page=Extra|ordinal=14|mode=Extra|level=First challenge|enemy=Monkey|shown_name=Monkey|health=40|boss=0|spawns=4}}&lt;br /&gt;
{{Spawn row|wiki_page=Extra|ordinal=15|mode=Extra|level=First challenge|enemy=Over Shinobu|shown_name=Over Shinobu Max|health=120|boss=0|spawns=1}}&lt;br /&gt;
{{Spawn row|wiki_page=Extra|ordinal=16|mode=Extra|level=First challenge|enemy=Panther|shown_name=Panther Leader|health=40|boss=0|spawns=12}}&lt;br /&gt;
{{Spawn row|wiki_page=Extra|ordinal=17|mode=Extra|level=First challenge|enemy=Shadow Man|shown_name=Shadow Man Blue|health=40|boss=0|spawns=6}}&lt;br /&gt;
{{Spawn row|wiki_page=Extra|ordinal=18|mode=Extra|level=First challenge|enemy=Shadow Man|shown_name=Shadow Man White|health=60|boss=0|spawns=2}}&lt;br /&gt;
{{Spawn row|wiki_page=Extra|ordinal=19|mode=Extra|level=First challenge|enemy=Snake|shown_name=Snake Captain|health=26|boss=0|spawns=13}}&lt;br /&gt;
{{Spawn row|wiki_page=Extra|ordinal=20|mode=Extra|level=Second challenge|enemy=3SVO II|shown_name=3SVO II|health=20|boss=0|spawns=10}}&lt;br /&gt;
{{Spawn row|wiki_page=Extra|ordinal=21|mode=Extra|level=Second challenge|enemy=Flame Ninja|shown_name=Flame Ninja|health=44|boss=0|spawns=5}}&lt;br /&gt;
{{Spawn row|wiki_page=Extra|ordinal=22|mode=Extra|level=Second challenge|enemy=Fox|shown_name=Fox Mix|health=60|boss=0|spawns=1}}&lt;br /&gt;
{{Spawn row|wiki_page=Extra|ordinal=23|mode=Extra|level=Second challenge|enemy=Fox|shown_name=Fox Zero|health=60|boss=0|spawns=2}}&lt;br /&gt;
{{Spawn row|wiki_page=Extra|ordinal=24|mode=Extra|level=Second challenge|enemy=Giganto|shown_name=Giganto Mk VII|health=400|boss=1|spawns=1}}&lt;br /&gt;
{{Spawn row|wiki_page=Extra|ordinal=25|mode=Extra|level=Second challenge|enemy=Golem|shown_name=Golem|health=80|boss=0|spawns=3}}&lt;br /&gt;
{{Spawn row|wiki_page=Extra|ordinal=26|mode=Extra|level=Second challenge|enemy=Golem|shown_name=Golem Mk I|health=80|boss=0|spawns=3}}&lt;br /&gt;
{{Spawn row|wiki_page=Extra|ordinal=27|mode=Extra|level=Second challenge|enemy=Knife Army|shown_name=Knife Army B|health=16|boss=0|spawns=23}}&lt;br /&gt;
{{Spawn row|wiki_page=Extra|ordinal=28|mode=Extra|level=Second challenge|enemy=Knife Army|shown_name=Knife Army C|health=16|boss=0|spawns=17}}&lt;br /&gt;
{{Spawn row|wiki_page=Extra|ordinal=29|mode=Extra|level=Second challenge|enemy=Knife Army|shown_name=Knife Army D|health=20|boss=0|spawns=11}}&lt;br /&gt;
{{Spawn row|wiki_page=Extra|ordinal=30|mode=Extra|level=Second challenge|enemy=Kunoichi (enemy)|shown_name=Kunoichi Master|health=60|boss=0|spawns=7}}&lt;br /&gt;
{{Spawn row|wiki_page=Extra|ordinal=31|mode=Extra|level=Second challenge|enemy=Machine Gun Army|shown_name=Machine Gun Army B|health=34|boss=0|spawns=10}}&lt;br /&gt;
{{Spawn row|wiki_page=Extra|ordinal=32|mode=Extra|level=Second challenge|enemy=Machine Gun Army|shown_name=Machine Gun Army C|health=34|boss=0|spawns=4}}&lt;br /&gt;
{{Spawn row|wiki_page=Extra|ordinal=33|mode=Extra|level=Second challenge|enemy=Monkey|shown_name=Monkey|health=40|boss=0|spawns=7}}&lt;br /&gt;
{{Spawn row|wiki_page=Extra|ordinal=34|mode=Extra|level=Second challenge|enemy=Over Shinobu|shown_name=Over Shinobu Max|health=120|boss=0|spawns=2}}&lt;br /&gt;
{{Spawn row|wiki_page=Extra|ordinal=35|mode=Extra|level=Second challenge|enemy=Panther|shown_name=Panther|health=34|boss=0|spawns=4}}&lt;br /&gt;
{{Spawn row|wiki_page=Extra|ordinal=36|mode=Extra|level=Second challenge|enemy=Panther|shown_name=Panther Leader|health=40|boss=0|spawns=6}}&lt;br /&gt;
{{Spawn row|wiki_page=Extra|ordinal=37|mode=Extra|level=Second challenge|enemy=Puma|shown_name=Puma|health=70|boss=0|spawns=3}}&lt;br /&gt;
{{Spawn row|wiki_page=Extra|ordinal=38|mode=Extra|level=Second challenge|enemy=Puma|shown_name=Puma Type II|health=70|boss=0|spawns=5}}&lt;br /&gt;
{{Spawn row|wiki_page=Extra|ordinal=39|mode=Extra|level=Second challenge|enemy=Shadow Man|shown_name=Shadow Man Blue|health=40|boss=0|spawns=4}}&lt;br /&gt;
{{Spawn row|wiki_page=Extra|ordinal=40|mode=Extra|level=Second challenge|enemy=Shadow Man|shown_name=Shadow Man White|health=60|boss=0|spawns=4}}&lt;br /&gt;
{{Spawn row|wiki_page=Extra|ordinal=41|mode=Extra|level=Second challenge|enemy=Snake|shown_name=Snake Captain|health=26|boss=0|spawns=13}}&lt;br /&gt;
{{Spawn row|wiki_page=Extra|ordinal=42|mode=Extra|level=Third challenge|enemy=3SVO II|shown_name=3SVO II|health=20|boss=0|spawns=12}}&lt;br /&gt;
{{Spawn row|wiki_page=Extra|ordinal=43|mode=Extra|level=Third challenge|enemy=Flame Ninja|shown_name=Flame Ninja|health=44|boss=0|spawns=6}}&lt;br /&gt;
{{Spawn row|wiki_page=Extra|ordinal=44|mode=Extra|level=Third challenge|enemy=Fox|shown_name=Fox Mix|health=60|boss=0|spawns=3}}&lt;br /&gt;
{{Spawn row|wiki_page=Extra|ordinal=45|mode=Extra|level=Third challenge|enemy=Fox|shown_name=Fox Zero|health=60|boss=0|spawns=2}}&lt;br /&gt;
{{Spawn row|wiki_page=Extra|ordinal=46|mode=Extra|level=Third challenge|enemy=Giganto|shown_name=Giganto Mk I|health=160|boss=0|spawns=3}}&lt;br /&gt;
{{Spawn row|wiki_page=Extra|ordinal=47|mode=Extra|level=Third challenge|enemy=Giganto|shown_name=Giganto Mk II|health=160|boss=0|spawns=3}}&lt;br /&gt;
{{Spawn row|wiki_page=Extra|ordinal=48|mode=Extra|level=Third challenge|enemy=Giganto|shown_name=Giganto Mk VIII|health=400|boss=1|spawns=1}}&lt;br /&gt;
{{Spawn row|wiki_page=Extra|ordinal=49|mode=Extra|level=Third challenge|enemy=Golem|shown_name=Golem|health=80|boss=0|spawns=4}}&lt;br /&gt;
{{Spawn row|wiki_page=Extra|ordinal=50|mode=Extra|level=Third challenge|enemy=Golem|shown_name=Golem Mk I|health=80|boss=0|spawns=2}}&lt;br /&gt;
{{Spawn row|wiki_page=Extra|ordinal=51|mode=Extra|level=Third challenge|enemy=Knife Army|shown_name=Knife Army B|health=16|boss=0|spawns=20}}&lt;br /&gt;
{{Spawn row|wiki_page=Extra|ordinal=52|mode=Extra|level=Third challenge|enemy=Knife Army|shown_name=Knife Army C|health=16|boss=0|spawns=15}}&lt;br /&gt;
{{Spawn row|wiki_page=Extra|ordinal=53|mode=Extra|level=Third challenge|enemy=Knife Army|shown_name=Knife Army D|health=20|boss=0|spawns=9}}&lt;br /&gt;
{{Spawn row|wiki_page=Extra|ordinal=54|mode=Extra|level=Third challenge|enemy=Kunoichi (enemy)|shown_name=Kunoichi Master|health=60|boss=0|spawns=11}}&lt;br /&gt;
{{Spawn row|wiki_page=Extra|ordinal=55|mode=Extra|level=Third challenge|enemy=Machine Gun Army|shown_name=Machine Gun Army B|health=34|boss=0|spawns=8}}&lt;br /&gt;
{{Spawn row|wiki_page=Extra|ordinal=56|mode=Extra|level=Third challenge|enemy=Machine Gun Army|shown_name=Machine Gun Army C|health=34|boss=0|spawns=4}}&lt;br /&gt;
{{Spawn row|wiki_page=Extra|ordinal=57|mode=Extra|level=Third challenge|enemy=Monkey|shown_name=Monkey|health=40|boss=0|spawns=4}}&lt;br /&gt;
{{Spawn row|wiki_page=Extra|ordinal=58|mode=Extra|level=Third challenge|enemy=Over Shinobu|shown_name=Over Shinobu Max|health=120|boss=0|spawns=1}}&lt;br /&gt;
{{Spawn row|wiki_page=Extra|ordinal=59|mode=Extra|level=Third challenge|enemy=Panther|shown_name=Panther Leader|health=40|boss=0|spawns=10}}&lt;br /&gt;
{{Spawn row|wiki_page=Extra|ordinal=60|mode=Extra|level=Third challenge|enemy=Puma|shown_name=Puma|health=70|boss=0|spawns=4}}&lt;br /&gt;
{{Spawn row|wiki_page=Extra|ordinal=61|mode=Extra|level=Third challenge|enemy=Puma|shown_name=Puma Type II|health=70|boss=0|spawns=2}}&lt;br /&gt;
{{Spawn row|wiki_page=Extra|ordinal=62|mode=Extra|level=Third challenge|enemy=Shadow Man|shown_name=Shadow Man Blue|health=40|boss=0|spawns=3}}&lt;br /&gt;
{{Spawn row|wiki_page=Extra|ordinal=63|mode=Extra|level=Third challenge|enemy=Shadow Man|shown_name=Shadow Man White|health=60|boss=0|spawns=3}}&lt;br /&gt;
{{Spawn row|wiki_page=Extra|ordinal=64|mode=Extra|level=Third challenge|enemy=Snake|shown_name=Snake Captain|health=26|boss=0|spawns=12}}&lt;/div&gt;</summary>
		<author><name>LongJump bot</name></author>
	</entry>
	<entry>
		<id>https://nwrx.wiki.longjump.dev/index.php?title=Module:GameData/names&amp;diff=623</id>
		<title>Module:GameData/names</title>
		<link rel="alternate" type="text/html" href="https://nwrx.wiki.longjump.dev/index.php?title=Module:GameData/names&amp;diff=623"/>
		<updated>2026-11-04T00:19:32Z</updated>

		<summary type="html">&lt;p&gt;LongJump bot: Game data from 645555d&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;-- In-game names of pages whose titles differ from them. Generated by wiki/tools/gen_wiki.py.&lt;br /&gt;
return {&lt;br /&gt;
	[&amp;quot;Kunoichi (enemy)&amp;quot;] = &amp;quot;Kunoichi&amp;quot;,&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>LongJump bot</name></author>
	</entry>
	<entry>
		<id>https://nwrx.wiki.longjump.dev/index.php?title=Template:HowToPage_row&amp;diff=622</id>
		<title>Template:HowToPage row</title>
		<link rel="alternate" type="text/html" href="https://nwrx.wiki.longjump.dev/index.php?title=Template:HowToPage_row&amp;diff=622"/>
		<updated>2026-11-04T00:19:32Z</updated>

		<summary type="html">&lt;p&gt;LongJump bot: Game data from 645555d&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;noinclude&amp;gt;{{#cargo_declare:_table=HowToPage&lt;br /&gt;
|wiki_page=Page&lt;br /&gt;
|ordinal=Integer&lt;br /&gt;
|page=Integer&lt;br /&gt;
|image=String&lt;br /&gt;
}}&lt;br /&gt;
Stores one HowToPage row. Used only on Data: pages, which the LongJump export writes.&amp;lt;/noinclude&amp;gt;&amp;lt;includeonly&amp;gt;{{#cargo_store:_table=HowToPage&lt;br /&gt;
|wiki_page={{{wiki_page|}}}&lt;br /&gt;
|ordinal={{{ordinal|}}}&lt;br /&gt;
|page={{{page|}}}&lt;br /&gt;
|image={{{image|}}}&lt;br /&gt;
}}* page {{{page|}}}, image {{{image|}}}&lt;br /&gt;
&amp;lt;/includeonly&amp;gt;&lt;/div&gt;</summary>
		<author><name>LongJump bot</name></author>
	</entry>
	<entry>
		<id>https://nwrx.wiki.longjump.dev/index.php?title=Module:GameData/schema&amp;diff=621</id>
		<title>Module:GameData/schema</title>
		<link rel="alternate" type="text/html" href="https://nwrx.wiki.longjump.dev/index.php?title=Module:GameData/schema&amp;diff=621"/>
		<updated>2026-11-04T00:19:32Z</updated>

		<summary type="html">&lt;p&gt;LongJump bot: Game data from 645555d&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;-- Generated from the game&#039;s types file by wiki/tools/gen_wiki.py. Do not edit by hand.&lt;br /&gt;
return {&lt;br /&gt;
	[&amp;quot;types&amp;quot;] = {&lt;br /&gt;
		[&amp;quot;PlayerCharacter&amp;quot;] = {&lt;br /&gt;
			[&amp;quot;table&amp;quot;] = &amp;quot;PlayerCharacter&amp;quot;,&lt;br /&gt;
			[&amp;quot;label&amp;quot;] = &amp;quot;Character&amp;quot;,&lt;br /&gt;
			[&amp;quot;category&amp;quot;] = &amp;quot;Characters&amp;quot;,&lt;br /&gt;
			[&amp;quot;fields&amp;quot;] = {&lt;br /&gt;
				{&lt;br /&gt;
					[&amp;quot;name&amp;quot;] = &amp;quot;name&amp;quot;,&lt;br /&gt;
					[&amp;quot;type&amp;quot;] = &amp;quot;String&amp;quot;,&lt;br /&gt;
				},&lt;br /&gt;
				{&lt;br /&gt;
					[&amp;quot;name&amp;quot;] = &amp;quot;icon&amp;quot;,&lt;br /&gt;
					[&amp;quot;type&amp;quot;] = &amp;quot;String&amp;quot;,&lt;br /&gt;
				},&lt;br /&gt;
				{&lt;br /&gt;
					[&amp;quot;name&amp;quot;] = &amp;quot;modes&amp;quot;,&lt;br /&gt;
					[&amp;quot;type&amp;quot;] = &amp;quot;Page&amp;quot;,&lt;br /&gt;
					[&amp;quot;list&amp;quot;] = true,&lt;br /&gt;
					[&amp;quot;link&amp;quot;] = &amp;quot;Mode&amp;quot;,&lt;br /&gt;
					[&amp;quot;label&amp;quot;] = &amp;quot;Modes&amp;quot;,&lt;br /&gt;
				},&lt;br /&gt;
				{&lt;br /&gt;
					[&amp;quot;name&amp;quot;] = &amp;quot;health&amp;quot;,&lt;br /&gt;
					[&amp;quot;type&amp;quot;] = &amp;quot;Integer&amp;quot;,&lt;br /&gt;
					[&amp;quot;label&amp;quot;] = &amp;quot;Health&amp;quot;,&lt;br /&gt;
				},&lt;br /&gt;
				{&lt;br /&gt;
					[&amp;quot;name&amp;quot;] = &amp;quot;mp&amp;quot;,&lt;br /&gt;
					[&amp;quot;type&amp;quot;] = &amp;quot;Integer&amp;quot;,&lt;br /&gt;
					[&amp;quot;label&amp;quot;] = &amp;quot;MP&amp;quot;,&lt;br /&gt;
				},&lt;br /&gt;
				{&lt;br /&gt;
					[&amp;quot;name&amp;quot;] = &amp;quot;speed&amp;quot;,&lt;br /&gt;
					[&amp;quot;type&amp;quot;] = &amp;quot;Float&amp;quot;,&lt;br /&gt;
					[&amp;quot;label&amp;quot;] = &amp;quot;Walk speed&amp;quot;,&lt;br /&gt;
				},&lt;br /&gt;
				{&lt;br /&gt;
					[&amp;quot;name&amp;quot;] = &amp;quot;jump_height&amp;quot;,&lt;br /&gt;
					[&amp;quot;type&amp;quot;] = &amp;quot;Float&amp;quot;,&lt;br /&gt;
					[&amp;quot;label&amp;quot;] = &amp;quot;Jump height&amp;quot;,&lt;br /&gt;
				},&lt;br /&gt;
				{&lt;br /&gt;
					[&amp;quot;name&amp;quot;] = &amp;quot;wiki_page&amp;quot;,&lt;br /&gt;
					[&amp;quot;type&amp;quot;] = &amp;quot;Page&amp;quot;,&lt;br /&gt;
				},&lt;br /&gt;
				{&lt;br /&gt;
					[&amp;quot;name&amp;quot;] = &amp;quot;game_version&amp;quot;,&lt;br /&gt;
					[&amp;quot;type&amp;quot;] = &amp;quot;String&amp;quot;,&lt;br /&gt;
				},&lt;br /&gt;
				{&lt;br /&gt;
					[&amp;quot;name&amp;quot;] = &amp;quot;source_id&amp;quot;,&lt;br /&gt;
					[&amp;quot;type&amp;quot;] = &amp;quot;String&amp;quot;,&lt;br /&gt;
				},&lt;br /&gt;
			},&lt;br /&gt;
			[&amp;quot;related&amp;quot;] = {&lt;br /&gt;
&lt;br /&gt;
			},&lt;br /&gt;
			[&amp;quot;intro&amp;quot;] = &amp;quot;&#039;&#039;&#039;{name}&#039;&#039;&#039; is a playable character in {modes}.&amp;quot;,&lt;br /&gt;
			[&amp;quot;views&amp;quot;] = {&lt;br /&gt;
				[&amp;quot;Move&amp;quot;] = {&lt;br /&gt;
					[&amp;quot;id&amp;quot;] = &amp;quot;Move&amp;quot;,&lt;br /&gt;
					[&amp;quot;table&amp;quot;] = &amp;quot;Move&amp;quot;,&lt;br /&gt;
					[&amp;quot;heading&amp;quot;] = &amp;quot;Moves&amp;quot;,&lt;br /&gt;
					[&amp;quot;note&amp;quot;] = &amp;quot;Damage is per hit. Moves the game starts from its scripts are not listed.&amp;quot;,&lt;br /&gt;
					[&amp;quot;columns&amp;quot;] = {&lt;br /&gt;
						{&lt;br /&gt;
							[&amp;quot;field&amp;quot;] = &amp;quot;input&amp;quot;,&lt;br /&gt;
							[&amp;quot;label&amp;quot;] = &amp;quot;Input&amp;quot;,&lt;br /&gt;
						},&lt;br /&gt;
						{&lt;br /&gt;
							[&amp;quot;field&amp;quot;] = &amp;quot;cancels_from&amp;quot;,&lt;br /&gt;
							[&amp;quot;label&amp;quot;] = &amp;quot;From&amp;quot;,&lt;br /&gt;
						},&lt;br /&gt;
						{&lt;br /&gt;
							[&amp;quot;field&amp;quot;] = &amp;quot;damage&amp;quot;,&lt;br /&gt;
							[&amp;quot;label&amp;quot;] = &amp;quot;Damage per hit&amp;quot;,&lt;br /&gt;
						},&lt;br /&gt;
						{&lt;br /&gt;
							[&amp;quot;field&amp;quot;] = &amp;quot;mp_cost&amp;quot;,&lt;br /&gt;
							[&amp;quot;label&amp;quot;] = &amp;quot;MP cost&amp;quot;,&lt;br /&gt;
						},&lt;br /&gt;
						{&lt;br /&gt;
							[&amp;quot;field&amp;quot;] = &amp;quot;only_when&amp;quot;,&lt;br /&gt;
							[&amp;quot;label&amp;quot;] = &amp;quot;Only when&amp;quot;,&lt;br /&gt;
						},&lt;br /&gt;
					},&lt;br /&gt;
				},&lt;br /&gt;
				[&amp;quot;Playable&amp;quot;] = {&lt;br /&gt;
					[&amp;quot;id&amp;quot;] = &amp;quot;Playable&amp;quot;,&lt;br /&gt;
					[&amp;quot;table&amp;quot;] = &amp;quot;Playable&amp;quot;,&lt;br /&gt;
					[&amp;quot;only&amp;quot;] = true,&lt;br /&gt;
					[&amp;quot;heading&amp;quot;] = &amp;quot;In Extra mode&amp;quot;,&lt;br /&gt;
					[&amp;quot;note&amp;quot;] = &amp;quot;Extra mode has its own version of this character.&amp;quot;,&lt;br /&gt;
					[&amp;quot;columns&amp;quot;] = {&lt;br /&gt;
						{&lt;br /&gt;
							[&amp;quot;field&amp;quot;] = &amp;quot;health&amp;quot;,&lt;br /&gt;
							[&amp;quot;label&amp;quot;] = &amp;quot;Health&amp;quot;,&lt;br /&gt;
						},&lt;br /&gt;
						{&lt;br /&gt;
							[&amp;quot;field&amp;quot;] = &amp;quot;mp&amp;quot;,&lt;br /&gt;
							[&amp;quot;label&amp;quot;] = &amp;quot;MP&amp;quot;,&lt;br /&gt;
						},&lt;br /&gt;
						{&lt;br /&gt;
							[&amp;quot;field&amp;quot;] = &amp;quot;speed&amp;quot;,&lt;br /&gt;
							[&amp;quot;label&amp;quot;] = &amp;quot;Walk speed&amp;quot;,&lt;br /&gt;
						},&lt;br /&gt;
						{&lt;br /&gt;
							[&amp;quot;field&amp;quot;] = &amp;quot;jump_height&amp;quot;,&lt;br /&gt;
							[&amp;quot;label&amp;quot;] = &amp;quot;Jump height&amp;quot;,&lt;br /&gt;
						},&lt;br /&gt;
					},&lt;br /&gt;
				},&lt;br /&gt;
				[&amp;quot;ExtraMove&amp;quot;] = {&lt;br /&gt;
					[&amp;quot;id&amp;quot;] = &amp;quot;ExtraMove&amp;quot;,&lt;br /&gt;
					[&amp;quot;table&amp;quot;] = &amp;quot;ExtraMove&amp;quot;,&lt;br /&gt;
					[&amp;quot;only&amp;quot;] = true,&lt;br /&gt;
					[&amp;quot;heading&amp;quot;] = &amp;quot;Moves in Extra mode&amp;quot;,&lt;br /&gt;
					[&amp;quot;note&amp;quot;] = &amp;quot;Damage is per hit. Moves the game starts from its scripts are not listed.&amp;quot;,&lt;br /&gt;
					[&amp;quot;columns&amp;quot;] = {&lt;br /&gt;
						{&lt;br /&gt;
							[&amp;quot;field&amp;quot;] = &amp;quot;input&amp;quot;,&lt;br /&gt;
							[&amp;quot;label&amp;quot;] = &amp;quot;Input&amp;quot;,&lt;br /&gt;
						},&lt;br /&gt;
						{&lt;br /&gt;
							[&amp;quot;field&amp;quot;] = &amp;quot;cancels_from&amp;quot;,&lt;br /&gt;
							[&amp;quot;label&amp;quot;] = &amp;quot;From&amp;quot;,&lt;br /&gt;
						},&lt;br /&gt;
						{&lt;br /&gt;
							[&amp;quot;field&amp;quot;] = &amp;quot;damage&amp;quot;,&lt;br /&gt;
							[&amp;quot;label&amp;quot;] = &amp;quot;Damage per hit&amp;quot;,&lt;br /&gt;
						},&lt;br /&gt;
						{&lt;br /&gt;
							[&amp;quot;field&amp;quot;] = &amp;quot;mp_cost&amp;quot;,&lt;br /&gt;
							[&amp;quot;label&amp;quot;] = &amp;quot;MP cost&amp;quot;,&lt;br /&gt;
						},&lt;br /&gt;
						{&lt;br /&gt;
							[&amp;quot;field&amp;quot;] = &amp;quot;only_when&amp;quot;,&lt;br /&gt;
							[&amp;quot;label&amp;quot;] = &amp;quot;Only when&amp;quot;,&lt;br /&gt;
						},&lt;br /&gt;
					},&lt;br /&gt;
				},&lt;br /&gt;
				[&amp;quot;HowToPage&amp;quot;] = {&lt;br /&gt;
					[&amp;quot;id&amp;quot;] = &amp;quot;HowToPage&amp;quot;,&lt;br /&gt;
					[&amp;quot;table&amp;quot;] = &amp;quot;HowToPage&amp;quot;,&lt;br /&gt;
					[&amp;quot;only&amp;quot;] = true,&lt;br /&gt;
					[&amp;quot;heading&amp;quot;] = &amp;quot;How To Play pages&amp;quot;,&lt;br /&gt;
					[&amp;quot;gallery&amp;quot;] = {&lt;br /&gt;
						[&amp;quot;image&amp;quot;] = &amp;quot;image&amp;quot;,&lt;br /&gt;
						[&amp;quot;caption&amp;quot;] = &amp;quot;page&amp;quot;,&lt;br /&gt;
						[&amp;quot;caption_prefix&amp;quot;] = &amp;quot;Page &amp;quot;,&lt;br /&gt;
						[&amp;quot;width&amp;quot;] = &amp;quot;480px&amp;quot;,&lt;br /&gt;
						[&amp;quot;height&amp;quot;] = &amp;quot;272px&amp;quot;,&lt;br /&gt;
					},&lt;br /&gt;
					[&amp;quot;columns&amp;quot;] = {&lt;br /&gt;
						{&lt;br /&gt;
							[&amp;quot;field&amp;quot;] = &amp;quot;image&amp;quot;,&lt;br /&gt;
							[&amp;quot;label&amp;quot;] = &amp;quot;Page&amp;quot;,&lt;br /&gt;
						},&lt;br /&gt;
					},&lt;br /&gt;
				},&lt;br /&gt;
			},&lt;br /&gt;
			[&amp;quot;text_label&amp;quot;] = &amp;quot;In-game text&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		[&amp;quot;Enemy&amp;quot;] = {&lt;br /&gt;
			[&amp;quot;table&amp;quot;] = &amp;quot;Enemy&amp;quot;,&lt;br /&gt;
			[&amp;quot;label&amp;quot;] = &amp;quot;Enemy&amp;quot;,&lt;br /&gt;
			[&amp;quot;category&amp;quot;] = &amp;quot;Enemies&amp;quot;,&lt;br /&gt;
			[&amp;quot;fields&amp;quot;] = {&lt;br /&gt;
				{&lt;br /&gt;
					[&amp;quot;name&amp;quot;] = &amp;quot;name&amp;quot;,&lt;br /&gt;
					[&amp;quot;type&amp;quot;] = &amp;quot;String&amp;quot;,&lt;br /&gt;
				},&lt;br /&gt;
				{&lt;br /&gt;
					[&amp;quot;name&amp;quot;] = &amp;quot;icon&amp;quot;,&lt;br /&gt;
					[&amp;quot;type&amp;quot;] = &amp;quot;String&amp;quot;,&lt;br /&gt;
				},&lt;br /&gt;
				{&lt;br /&gt;
					[&amp;quot;name&amp;quot;] = &amp;quot;modes&amp;quot;,&lt;br /&gt;
					[&amp;quot;type&amp;quot;] = &amp;quot;Page&amp;quot;,&lt;br /&gt;
					[&amp;quot;list&amp;quot;] = true,&lt;br /&gt;
					[&amp;quot;link&amp;quot;] = &amp;quot;Mode&amp;quot;,&lt;br /&gt;
					[&amp;quot;label&amp;quot;] = &amp;quot;Modes&amp;quot;,&lt;br /&gt;
				},&lt;br /&gt;
				{&lt;br /&gt;
					[&amp;quot;name&amp;quot;] = &amp;quot;shown_names&amp;quot;,&lt;br /&gt;
					[&amp;quot;type&amp;quot;] = &amp;quot;String&amp;quot;,&lt;br /&gt;
					[&amp;quot;list&amp;quot;] = true,&lt;br /&gt;
					[&amp;quot;label&amp;quot;] = &amp;quot;Names shown in game&amp;quot;,&lt;br /&gt;
				},&lt;br /&gt;
				{&lt;br /&gt;
					[&amp;quot;name&amp;quot;] = &amp;quot;wiki_page&amp;quot;,&lt;br /&gt;
					[&amp;quot;type&amp;quot;] = &amp;quot;Page&amp;quot;,&lt;br /&gt;
				},&lt;br /&gt;
				{&lt;br /&gt;
					[&amp;quot;name&amp;quot;] = &amp;quot;game_version&amp;quot;,&lt;br /&gt;
					[&amp;quot;type&amp;quot;] = &amp;quot;String&amp;quot;,&lt;br /&gt;
				},&lt;br /&gt;
				{&lt;br /&gt;
					[&amp;quot;name&amp;quot;] = &amp;quot;source_id&amp;quot;,&lt;br /&gt;
					[&amp;quot;type&amp;quot;] = &amp;quot;String&amp;quot;,&lt;br /&gt;
				},&lt;br /&gt;
			},&lt;br /&gt;
			[&amp;quot;related&amp;quot;] = {&lt;br /&gt;
&lt;br /&gt;
			},&lt;br /&gt;
			[&amp;quot;intro&amp;quot;] = &amp;quot;&#039;&#039;&#039;{name}&#039;&#039;&#039; is an enemy in {modes}.&amp;quot;,&lt;br /&gt;
			[&amp;quot;views&amp;quot;] = {&lt;br /&gt;
				[&amp;quot;Variant&amp;quot;] = {&lt;br /&gt;
					[&amp;quot;id&amp;quot;] = &amp;quot;Variant&amp;quot;,&lt;br /&gt;
					[&amp;quot;table&amp;quot;] = &amp;quot;Variant&amp;quot;,&lt;br /&gt;
					[&amp;quot;heading&amp;quot;] = &amp;quot;Variants&amp;quot;,&lt;br /&gt;
					[&amp;quot;columns&amp;quot;] = {&lt;br /&gt;
						{&lt;br /&gt;
							[&amp;quot;field&amp;quot;] = &amp;quot;mode&amp;quot;,&lt;br /&gt;
							[&amp;quot;label&amp;quot;] = &amp;quot;Mode&amp;quot;,&lt;br /&gt;
						},&lt;br /&gt;
						{&lt;br /&gt;
							[&amp;quot;field&amp;quot;] = &amp;quot;shown_name&amp;quot;,&lt;br /&gt;
							[&amp;quot;label&amp;quot;] = &amp;quot;Name shown&amp;quot;,&lt;br /&gt;
						},&lt;br /&gt;
						{&lt;br /&gt;
							[&amp;quot;field&amp;quot;] = &amp;quot;health&amp;quot;,&lt;br /&gt;
							[&amp;quot;label&amp;quot;] = &amp;quot;Health&amp;quot;,&lt;br /&gt;
						},&lt;br /&gt;
						{&lt;br /&gt;
							[&amp;quot;field&amp;quot;] = &amp;quot;damage_taken&amp;quot;,&lt;br /&gt;
							[&amp;quot;label&amp;quot;] = &amp;quot;Damage taken&amp;quot;,&lt;br /&gt;
						},&lt;br /&gt;
						{&lt;br /&gt;
							[&amp;quot;field&amp;quot;] = &amp;quot;boss&amp;quot;,&lt;br /&gt;
							[&amp;quot;label&amp;quot;] = &amp;quot;Boss&amp;quot;,&lt;br /&gt;
						},&lt;br /&gt;
						{&lt;br /&gt;
							[&amp;quot;field&amp;quot;] = &amp;quot;spawns&amp;quot;,&lt;br /&gt;
							[&amp;quot;label&amp;quot;] = &amp;quot;Appearances&amp;quot;,&lt;br /&gt;
						},&lt;br /&gt;
					},&lt;br /&gt;
				},&lt;br /&gt;
				[&amp;quot;Appears&amp;quot;] = {&lt;br /&gt;
					[&amp;quot;id&amp;quot;] = &amp;quot;Appears&amp;quot;,&lt;br /&gt;
					[&amp;quot;table&amp;quot;] = &amp;quot;Spawn&amp;quot;,&lt;br /&gt;
					[&amp;quot;match&amp;quot;] = &amp;quot;enemy&amp;quot;,&lt;br /&gt;
					[&amp;quot;heading&amp;quot;] = &amp;quot;Where it appears&amp;quot;,&lt;br /&gt;
					[&amp;quot;columns&amp;quot;] = {&lt;br /&gt;
						{&lt;br /&gt;
							[&amp;quot;field&amp;quot;] = &amp;quot;wiki_page&amp;quot;,&lt;br /&gt;
							[&amp;quot;label&amp;quot;] = &amp;quot;Where&amp;quot;,&lt;br /&gt;
						},&lt;br /&gt;
						{&lt;br /&gt;
							[&amp;quot;field&amp;quot;] = &amp;quot;level&amp;quot;,&lt;br /&gt;
							[&amp;quot;label&amp;quot;] = &amp;quot;Level&amp;quot;,&lt;br /&gt;
						},&lt;br /&gt;
						{&lt;br /&gt;
							[&amp;quot;field&amp;quot;] = &amp;quot;mode&amp;quot;,&lt;br /&gt;
							[&amp;quot;label&amp;quot;] = &amp;quot;Mode&amp;quot;,&lt;br /&gt;
						},&lt;br /&gt;
						{&lt;br /&gt;
							[&amp;quot;field&amp;quot;] = &amp;quot;shown_name&amp;quot;,&lt;br /&gt;
							[&amp;quot;label&amp;quot;] = &amp;quot;Name shown&amp;quot;,&lt;br /&gt;
						},&lt;br /&gt;
						{&lt;br /&gt;
							[&amp;quot;field&amp;quot;] = &amp;quot;health&amp;quot;,&lt;br /&gt;
							[&amp;quot;label&amp;quot;] = &amp;quot;Health&amp;quot;,&lt;br /&gt;
						},&lt;br /&gt;
						{&lt;br /&gt;
							[&amp;quot;field&amp;quot;] = &amp;quot;spawns&amp;quot;,&lt;br /&gt;
							[&amp;quot;label&amp;quot;] = &amp;quot;Appearances&amp;quot;,&lt;br /&gt;
						},&lt;br /&gt;
					},&lt;br /&gt;
				},&lt;br /&gt;
				[&amp;quot;Playable&amp;quot;] = {&lt;br /&gt;
					[&amp;quot;id&amp;quot;] = &amp;quot;Playable&amp;quot;,&lt;br /&gt;
					[&amp;quot;table&amp;quot;] = &amp;quot;Playable&amp;quot;,&lt;br /&gt;
					[&amp;quot;only&amp;quot;] = true,&lt;br /&gt;
					[&amp;quot;heading&amp;quot;] = &amp;quot;Playable in Extra&amp;quot;,&lt;br /&gt;
					[&amp;quot;note&amp;quot;] = &amp;quot;Extra mode lets you play as this character.&amp;quot;,&lt;br /&gt;
					[&amp;quot;columns&amp;quot;] = {&lt;br /&gt;
						{&lt;br /&gt;
							[&amp;quot;field&amp;quot;] = &amp;quot;health&amp;quot;,&lt;br /&gt;
							[&amp;quot;label&amp;quot;] = &amp;quot;Health&amp;quot;,&lt;br /&gt;
						},&lt;br /&gt;
						{&lt;br /&gt;
							[&amp;quot;field&amp;quot;] = &amp;quot;mp&amp;quot;,&lt;br /&gt;
							[&amp;quot;label&amp;quot;] = &amp;quot;MP&amp;quot;,&lt;br /&gt;
						},&lt;br /&gt;
						{&lt;br /&gt;
							[&amp;quot;field&amp;quot;] = &amp;quot;speed&amp;quot;,&lt;br /&gt;
							[&amp;quot;label&amp;quot;] = &amp;quot;Walk speed&amp;quot;,&lt;br /&gt;
						},&lt;br /&gt;
						{&lt;br /&gt;
							[&amp;quot;field&amp;quot;] = &amp;quot;jump_height&amp;quot;,&lt;br /&gt;
							[&amp;quot;label&amp;quot;] = &amp;quot;Jump height&amp;quot;,&lt;br /&gt;
						},&lt;br /&gt;
					},&lt;br /&gt;
				},&lt;br /&gt;
				[&amp;quot;ExtraMove&amp;quot;] = {&lt;br /&gt;
					[&amp;quot;id&amp;quot;] = &amp;quot;ExtraMove&amp;quot;,&lt;br /&gt;
					[&amp;quot;table&amp;quot;] = &amp;quot;ExtraMove&amp;quot;,&lt;br /&gt;
					[&amp;quot;only&amp;quot;] = true,&lt;br /&gt;
					[&amp;quot;heading&amp;quot;] = &amp;quot;Moves in Extra mode&amp;quot;,&lt;br /&gt;
					[&amp;quot;note&amp;quot;] = &amp;quot;Damage is per hit. Moves the game starts from its scripts are not listed.&amp;quot;,&lt;br /&gt;
					[&amp;quot;columns&amp;quot;] = {&lt;br /&gt;
						{&lt;br /&gt;
							[&amp;quot;field&amp;quot;] = &amp;quot;input&amp;quot;,&lt;br /&gt;
							[&amp;quot;label&amp;quot;] = &amp;quot;Input&amp;quot;,&lt;br /&gt;
						},&lt;br /&gt;
						{&lt;br /&gt;
							[&amp;quot;field&amp;quot;] = &amp;quot;cancels_from&amp;quot;,&lt;br /&gt;
							[&amp;quot;label&amp;quot;] = &amp;quot;From&amp;quot;,&lt;br /&gt;
						},&lt;br /&gt;
						{&lt;br /&gt;
							[&amp;quot;field&amp;quot;] = &amp;quot;damage&amp;quot;,&lt;br /&gt;
							[&amp;quot;label&amp;quot;] = &amp;quot;Damage per hit&amp;quot;,&lt;br /&gt;
						},&lt;br /&gt;
						{&lt;br /&gt;
							[&amp;quot;field&amp;quot;] = &amp;quot;mp_cost&amp;quot;,&lt;br /&gt;
							[&amp;quot;label&amp;quot;] = &amp;quot;MP cost&amp;quot;,&lt;br /&gt;
						},&lt;br /&gt;
						{&lt;br /&gt;
							[&amp;quot;field&amp;quot;] = &amp;quot;only_when&amp;quot;,&lt;br /&gt;
							[&amp;quot;label&amp;quot;] = &amp;quot;Only when&amp;quot;,&lt;br /&gt;
						},&lt;br /&gt;
					},&lt;br /&gt;
				},&lt;br /&gt;
			},&lt;br /&gt;
			[&amp;quot;text_label&amp;quot;] = &amp;quot;In-game text&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		[&amp;quot;Boss&amp;quot;] = {&lt;br /&gt;
			[&amp;quot;table&amp;quot;] = &amp;quot;Boss&amp;quot;,&lt;br /&gt;
			[&amp;quot;label&amp;quot;] = &amp;quot;Boss&amp;quot;,&lt;br /&gt;
			[&amp;quot;category&amp;quot;] = &amp;quot;Bosses&amp;quot;,&lt;br /&gt;
			[&amp;quot;fields&amp;quot;] = {&lt;br /&gt;
				{&lt;br /&gt;
					[&amp;quot;name&amp;quot;] = &amp;quot;name&amp;quot;,&lt;br /&gt;
					[&amp;quot;type&amp;quot;] = &amp;quot;String&amp;quot;,&lt;br /&gt;
				},&lt;br /&gt;
				{&lt;br /&gt;
					[&amp;quot;name&amp;quot;] = &amp;quot;icon&amp;quot;,&lt;br /&gt;
					[&amp;quot;type&amp;quot;] = &amp;quot;String&amp;quot;,&lt;br /&gt;
				},&lt;br /&gt;
				{&lt;br /&gt;
					[&amp;quot;name&amp;quot;] = &amp;quot;modes&amp;quot;,&lt;br /&gt;
					[&amp;quot;type&amp;quot;] = &amp;quot;Page&amp;quot;,&lt;br /&gt;
					[&amp;quot;list&amp;quot;] = true,&lt;br /&gt;
					[&amp;quot;link&amp;quot;] = &amp;quot;Mode&amp;quot;,&lt;br /&gt;
					[&amp;quot;label&amp;quot;] = &amp;quot;Modes&amp;quot;,&lt;br /&gt;
				},&lt;br /&gt;
				{&lt;br /&gt;
					[&amp;quot;name&amp;quot;] = &amp;quot;shown_names&amp;quot;,&lt;br /&gt;
					[&amp;quot;type&amp;quot;] = &amp;quot;String&amp;quot;,&lt;br /&gt;
					[&amp;quot;list&amp;quot;] = true,&lt;br /&gt;
					[&amp;quot;label&amp;quot;] = &amp;quot;Names shown in game&amp;quot;,&lt;br /&gt;
				},&lt;br /&gt;
				{&lt;br /&gt;
					[&amp;quot;name&amp;quot;] = &amp;quot;wiki_page&amp;quot;,&lt;br /&gt;
					[&amp;quot;type&amp;quot;] = &amp;quot;Page&amp;quot;,&lt;br /&gt;
				},&lt;br /&gt;
				{&lt;br /&gt;
					[&amp;quot;name&amp;quot;] = &amp;quot;game_version&amp;quot;,&lt;br /&gt;
					[&amp;quot;type&amp;quot;] = &amp;quot;String&amp;quot;,&lt;br /&gt;
				},&lt;br /&gt;
				{&lt;br /&gt;
					[&amp;quot;name&amp;quot;] = &amp;quot;source_id&amp;quot;,&lt;br /&gt;
					[&amp;quot;type&amp;quot;] = &amp;quot;String&amp;quot;,&lt;br /&gt;
				},&lt;br /&gt;
			},&lt;br /&gt;
			[&amp;quot;related&amp;quot;] = {&lt;br /&gt;
				{&lt;br /&gt;
					[&amp;quot;label&amp;quot;] = &amp;quot;Fought in&amp;quot;,&lt;br /&gt;
					[&amp;quot;type&amp;quot;] = &amp;quot;Stage&amp;quot;,&lt;br /&gt;
					[&amp;quot;field&amp;quot;] = &amp;quot;bosses&amp;quot;,&lt;br /&gt;
				},&lt;br /&gt;
			},&lt;br /&gt;
			[&amp;quot;intro&amp;quot;] = &amp;quot;&#039;&#039;&#039;{name}&#039;&#039;&#039; is a boss in {modes}.&amp;quot;,&lt;br /&gt;
			[&amp;quot;views&amp;quot;] = {&lt;br /&gt;
				[&amp;quot;Variant&amp;quot;] = {&lt;br /&gt;
					[&amp;quot;id&amp;quot;] = &amp;quot;Variant&amp;quot;,&lt;br /&gt;
					[&amp;quot;table&amp;quot;] = &amp;quot;Variant&amp;quot;,&lt;br /&gt;
					[&amp;quot;heading&amp;quot;] = &amp;quot;Variants&amp;quot;,&lt;br /&gt;
					[&amp;quot;columns&amp;quot;] = {&lt;br /&gt;
						{&lt;br /&gt;
							[&amp;quot;field&amp;quot;] = &amp;quot;mode&amp;quot;,&lt;br /&gt;
							[&amp;quot;label&amp;quot;] = &amp;quot;Mode&amp;quot;,&lt;br /&gt;
						},&lt;br /&gt;
						{&lt;br /&gt;
							[&amp;quot;field&amp;quot;] = &amp;quot;shown_name&amp;quot;,&lt;br /&gt;
							[&amp;quot;label&amp;quot;] = &amp;quot;Name shown&amp;quot;,&lt;br /&gt;
						},&lt;br /&gt;
						{&lt;br /&gt;
							[&amp;quot;field&amp;quot;] = &amp;quot;health&amp;quot;,&lt;br /&gt;
							[&amp;quot;label&amp;quot;] = &amp;quot;Health&amp;quot;,&lt;br /&gt;
						},&lt;br /&gt;
						{&lt;br /&gt;
							[&amp;quot;field&amp;quot;] = &amp;quot;damage_taken&amp;quot;,&lt;br /&gt;
							[&amp;quot;label&amp;quot;] = &amp;quot;Damage taken&amp;quot;,&lt;br /&gt;
						},&lt;br /&gt;
						{&lt;br /&gt;
							[&amp;quot;field&amp;quot;] = &amp;quot;boss&amp;quot;,&lt;br /&gt;
							[&amp;quot;label&amp;quot;] = &amp;quot;Boss&amp;quot;,&lt;br /&gt;
						},&lt;br /&gt;
						{&lt;br /&gt;
							[&amp;quot;field&amp;quot;] = &amp;quot;spawns&amp;quot;,&lt;br /&gt;
							[&amp;quot;label&amp;quot;] = &amp;quot;Appearances&amp;quot;,&lt;br /&gt;
						},&lt;br /&gt;
					},&lt;br /&gt;
				},&lt;br /&gt;
				[&amp;quot;Appears&amp;quot;] = {&lt;br /&gt;
					[&amp;quot;id&amp;quot;] = &amp;quot;Appears&amp;quot;,&lt;br /&gt;
					[&amp;quot;table&amp;quot;] = &amp;quot;Spawn&amp;quot;,&lt;br /&gt;
					[&amp;quot;match&amp;quot;] = &amp;quot;enemy&amp;quot;,&lt;br /&gt;
					[&amp;quot;heading&amp;quot;] = &amp;quot;Where it appears&amp;quot;,&lt;br /&gt;
					[&amp;quot;columns&amp;quot;] = {&lt;br /&gt;
						{&lt;br /&gt;
							[&amp;quot;field&amp;quot;] = &amp;quot;wiki_page&amp;quot;,&lt;br /&gt;
							[&amp;quot;label&amp;quot;] = &amp;quot;Where&amp;quot;,&lt;br /&gt;
						},&lt;br /&gt;
						{&lt;br /&gt;
							[&amp;quot;field&amp;quot;] = &amp;quot;level&amp;quot;,&lt;br /&gt;
							[&amp;quot;label&amp;quot;] = &amp;quot;Level&amp;quot;,&lt;br /&gt;
						},&lt;br /&gt;
						{&lt;br /&gt;
							[&amp;quot;field&amp;quot;] = &amp;quot;mode&amp;quot;,&lt;br /&gt;
							[&amp;quot;label&amp;quot;] = &amp;quot;Mode&amp;quot;,&lt;br /&gt;
						},&lt;br /&gt;
						{&lt;br /&gt;
							[&amp;quot;field&amp;quot;] = &amp;quot;shown_name&amp;quot;,&lt;br /&gt;
							[&amp;quot;label&amp;quot;] = &amp;quot;Name shown&amp;quot;,&lt;br /&gt;
						},&lt;br /&gt;
						{&lt;br /&gt;
							[&amp;quot;field&amp;quot;] = &amp;quot;health&amp;quot;,&lt;br /&gt;
							[&amp;quot;label&amp;quot;] = &amp;quot;Health&amp;quot;,&lt;br /&gt;
						},&lt;br /&gt;
						{&lt;br /&gt;
							[&amp;quot;field&amp;quot;] = &amp;quot;spawns&amp;quot;,&lt;br /&gt;
							[&amp;quot;label&amp;quot;] = &amp;quot;Appearances&amp;quot;,&lt;br /&gt;
						},&lt;br /&gt;
					},&lt;br /&gt;
				},&lt;br /&gt;
				[&amp;quot;Playable&amp;quot;] = {&lt;br /&gt;
					[&amp;quot;id&amp;quot;] = &amp;quot;Playable&amp;quot;,&lt;br /&gt;
					[&amp;quot;table&amp;quot;] = &amp;quot;Playable&amp;quot;,&lt;br /&gt;
					[&amp;quot;only&amp;quot;] = true,&lt;br /&gt;
					[&amp;quot;heading&amp;quot;] = &amp;quot;Playable in Extra&amp;quot;,&lt;br /&gt;
					[&amp;quot;note&amp;quot;] = &amp;quot;Extra mode lets you play as this character.&amp;quot;,&lt;br /&gt;
					[&amp;quot;columns&amp;quot;] = {&lt;br /&gt;
						{&lt;br /&gt;
							[&amp;quot;field&amp;quot;] = &amp;quot;health&amp;quot;,&lt;br /&gt;
							[&amp;quot;label&amp;quot;] = &amp;quot;Health&amp;quot;,&lt;br /&gt;
						},&lt;br /&gt;
						{&lt;br /&gt;
							[&amp;quot;field&amp;quot;] = &amp;quot;mp&amp;quot;,&lt;br /&gt;
							[&amp;quot;label&amp;quot;] = &amp;quot;MP&amp;quot;,&lt;br /&gt;
						},&lt;br /&gt;
						{&lt;br /&gt;
							[&amp;quot;field&amp;quot;] = &amp;quot;speed&amp;quot;,&lt;br /&gt;
							[&amp;quot;label&amp;quot;] = &amp;quot;Walk speed&amp;quot;,&lt;br /&gt;
						},&lt;br /&gt;
						{&lt;br /&gt;
							[&amp;quot;field&amp;quot;] = &amp;quot;jump_height&amp;quot;,&lt;br /&gt;
							[&amp;quot;label&amp;quot;] = &amp;quot;Jump height&amp;quot;,&lt;br /&gt;
						},&lt;br /&gt;
					},&lt;br /&gt;
				},&lt;br /&gt;
				[&amp;quot;ExtraMove&amp;quot;] = {&lt;br /&gt;
					[&amp;quot;id&amp;quot;] = &amp;quot;ExtraMove&amp;quot;,&lt;br /&gt;
					[&amp;quot;table&amp;quot;] = &amp;quot;ExtraMove&amp;quot;,&lt;br /&gt;
					[&amp;quot;only&amp;quot;] = true,&lt;br /&gt;
					[&amp;quot;heading&amp;quot;] = &amp;quot;Moves in Extra mode&amp;quot;,&lt;br /&gt;
					[&amp;quot;note&amp;quot;] = &amp;quot;Damage is per hit. Moves the game starts from its scripts are not listed.&amp;quot;,&lt;br /&gt;
					[&amp;quot;columns&amp;quot;] = {&lt;br /&gt;
						{&lt;br /&gt;
							[&amp;quot;field&amp;quot;] = &amp;quot;input&amp;quot;,&lt;br /&gt;
							[&amp;quot;label&amp;quot;] = &amp;quot;Input&amp;quot;,&lt;br /&gt;
						},&lt;br /&gt;
						{&lt;br /&gt;
							[&amp;quot;field&amp;quot;] = &amp;quot;cancels_from&amp;quot;,&lt;br /&gt;
							[&amp;quot;label&amp;quot;] = &amp;quot;From&amp;quot;,&lt;br /&gt;
						},&lt;br /&gt;
						{&lt;br /&gt;
							[&amp;quot;field&amp;quot;] = &amp;quot;damage&amp;quot;,&lt;br /&gt;
							[&amp;quot;label&amp;quot;] = &amp;quot;Damage per hit&amp;quot;,&lt;br /&gt;
						},&lt;br /&gt;
						{&lt;br /&gt;
							[&amp;quot;field&amp;quot;] = &amp;quot;mp_cost&amp;quot;,&lt;br /&gt;
							[&amp;quot;label&amp;quot;] = &amp;quot;MP cost&amp;quot;,&lt;br /&gt;
						},&lt;br /&gt;
						{&lt;br /&gt;
							[&amp;quot;field&amp;quot;] = &amp;quot;only_when&amp;quot;,&lt;br /&gt;
							[&amp;quot;label&amp;quot;] = &amp;quot;Only when&amp;quot;,&lt;br /&gt;
						},&lt;br /&gt;
					},&lt;br /&gt;
				},&lt;br /&gt;
			},&lt;br /&gt;
			[&amp;quot;text_label&amp;quot;] = &amp;quot;In-game text&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		[&amp;quot;Stage&amp;quot;] = {&lt;br /&gt;
			[&amp;quot;table&amp;quot;] = &amp;quot;Stage&amp;quot;,&lt;br /&gt;
			[&amp;quot;label&amp;quot;] = &amp;quot;Stage&amp;quot;,&lt;br /&gt;
			[&amp;quot;category&amp;quot;] = &amp;quot;Stages&amp;quot;,&lt;br /&gt;
			[&amp;quot;fields&amp;quot;] = {&lt;br /&gt;
				{&lt;br /&gt;
					[&amp;quot;name&amp;quot;] = &amp;quot;name&amp;quot;,&lt;br /&gt;
					[&amp;quot;type&amp;quot;] = &amp;quot;String&amp;quot;,&lt;br /&gt;
				},&lt;br /&gt;
				{&lt;br /&gt;
					[&amp;quot;name&amp;quot;] = &amp;quot;icon&amp;quot;,&lt;br /&gt;
					[&amp;quot;type&amp;quot;] = &amp;quot;String&amp;quot;,&lt;br /&gt;
				},&lt;br /&gt;
				{&lt;br /&gt;
					[&amp;quot;name&amp;quot;] = &amp;quot;modes&amp;quot;,&lt;br /&gt;
					[&amp;quot;type&amp;quot;] = &amp;quot;Page&amp;quot;,&lt;br /&gt;
					[&amp;quot;list&amp;quot;] = true,&lt;br /&gt;
					[&amp;quot;link&amp;quot;] = &amp;quot;Mode&amp;quot;,&lt;br /&gt;
					[&amp;quot;label&amp;quot;] = &amp;quot;Modes&amp;quot;,&lt;br /&gt;
				},&lt;br /&gt;
				{&lt;br /&gt;
					[&amp;quot;name&amp;quot;] = &amp;quot;bosses&amp;quot;,&lt;br /&gt;
					[&amp;quot;type&amp;quot;] = &amp;quot;Page&amp;quot;,&lt;br /&gt;
					[&amp;quot;list&amp;quot;] = true,&lt;br /&gt;
					[&amp;quot;link&amp;quot;] = &amp;quot;Boss&amp;quot;,&lt;br /&gt;
					[&amp;quot;label&amp;quot;] = &amp;quot;Bosses&amp;quot;,&lt;br /&gt;
				},&lt;br /&gt;
				{&lt;br /&gt;
					[&amp;quot;name&amp;quot;] = &amp;quot;wiki_page&amp;quot;,&lt;br /&gt;
					[&amp;quot;type&amp;quot;] = &amp;quot;Page&amp;quot;,&lt;br /&gt;
				},&lt;br /&gt;
				{&lt;br /&gt;
					[&amp;quot;name&amp;quot;] = &amp;quot;game_version&amp;quot;,&lt;br /&gt;
					[&amp;quot;type&amp;quot;] = &amp;quot;String&amp;quot;,&lt;br /&gt;
				},&lt;br /&gt;
				{&lt;br /&gt;
					[&amp;quot;name&amp;quot;] = &amp;quot;source_id&amp;quot;,&lt;br /&gt;
					[&amp;quot;type&amp;quot;] = &amp;quot;String&amp;quot;,&lt;br /&gt;
				},&lt;br /&gt;
			},&lt;br /&gt;
			[&amp;quot;related&amp;quot;] = {&lt;br /&gt;
&lt;br /&gt;
			},&lt;br /&gt;
			[&amp;quot;intro&amp;quot;] = &amp;quot;&#039;&#039;&#039;{name}&#039;&#039;&#039; is a stage in {modes}.&amp;quot;,&lt;br /&gt;
			[&amp;quot;views&amp;quot;] = {&lt;br /&gt;
				[&amp;quot;Spawns&amp;quot;] = {&lt;br /&gt;
					[&amp;quot;id&amp;quot;] = &amp;quot;Spawns&amp;quot;,&lt;br /&gt;
					[&amp;quot;table&amp;quot;] = &amp;quot;Spawn&amp;quot;,&lt;br /&gt;
					[&amp;quot;heading&amp;quot;] = &amp;quot;Enemies&amp;quot;,&lt;br /&gt;
					[&amp;quot;group&amp;quot;] = &amp;quot;mode&amp;quot;,&lt;br /&gt;
					[&amp;quot;columns&amp;quot;] = {&lt;br /&gt;
						{&lt;br /&gt;
							[&amp;quot;field&amp;quot;] = &amp;quot;enemy&amp;quot;,&lt;br /&gt;
							[&amp;quot;label&amp;quot;] = &amp;quot;Enemy&amp;quot;,&lt;br /&gt;
						},&lt;br /&gt;
						{&lt;br /&gt;
							[&amp;quot;field&amp;quot;] = &amp;quot;shown_name&amp;quot;,&lt;br /&gt;
							[&amp;quot;label&amp;quot;] = &amp;quot;Name shown&amp;quot;,&lt;br /&gt;
						},&lt;br /&gt;
						{&lt;br /&gt;
							[&amp;quot;field&amp;quot;] = &amp;quot;health&amp;quot;,&lt;br /&gt;
							[&amp;quot;label&amp;quot;] = &amp;quot;Health&amp;quot;,&lt;br /&gt;
						},&lt;br /&gt;
						{&lt;br /&gt;
							[&amp;quot;field&amp;quot;] = &amp;quot;boss&amp;quot;,&lt;br /&gt;
							[&amp;quot;label&amp;quot;] = &amp;quot;Boss&amp;quot;,&lt;br /&gt;
						},&lt;br /&gt;
						{&lt;br /&gt;
							[&amp;quot;field&amp;quot;] = &amp;quot;spawns&amp;quot;,&lt;br /&gt;
							[&amp;quot;label&amp;quot;] = &amp;quot;Appearances&amp;quot;,&lt;br /&gt;
						},&lt;br /&gt;
					},&lt;br /&gt;
				},&lt;br /&gt;
			},&lt;br /&gt;
			[&amp;quot;text_label&amp;quot;] = &amp;quot;In-game text&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		[&amp;quot;Mode&amp;quot;] = {&lt;br /&gt;
			[&amp;quot;table&amp;quot;] = &amp;quot;Mode&amp;quot;,&lt;br /&gt;
			[&amp;quot;label&amp;quot;] = &amp;quot;Mode&amp;quot;,&lt;br /&gt;
			[&amp;quot;category&amp;quot;] = &amp;quot;Modes&amp;quot;,&lt;br /&gt;
			[&amp;quot;fields&amp;quot;] = {&lt;br /&gt;
				{&lt;br /&gt;
					[&amp;quot;name&amp;quot;] = &amp;quot;name&amp;quot;,&lt;br /&gt;
					[&amp;quot;type&amp;quot;] = &amp;quot;String&amp;quot;,&lt;br /&gt;
				},&lt;br /&gt;
				{&lt;br /&gt;
					[&amp;quot;name&amp;quot;] = &amp;quot;icon&amp;quot;,&lt;br /&gt;
					[&amp;quot;type&amp;quot;] = &amp;quot;String&amp;quot;,&lt;br /&gt;
				},&lt;br /&gt;
				{&lt;br /&gt;
					[&amp;quot;name&amp;quot;] = &amp;quot;lives&amp;quot;,&lt;br /&gt;
					[&amp;quot;type&amp;quot;] = &amp;quot;Integer&amp;quot;,&lt;br /&gt;
					[&amp;quot;label&amp;quot;] = &amp;quot;Lives&amp;quot;,&lt;br /&gt;
				},&lt;br /&gt;
				{&lt;br /&gt;
					[&amp;quot;name&amp;quot;] = &amp;quot;credits&amp;quot;,&lt;br /&gt;
					[&amp;quot;type&amp;quot;] = &amp;quot;Integer&amp;quot;,&lt;br /&gt;
					[&amp;quot;label&amp;quot;] = &amp;quot;Credits&amp;quot;,&lt;br /&gt;
				},&lt;br /&gt;
				{&lt;br /&gt;
					[&amp;quot;name&amp;quot;] = &amp;quot;unlocked_by&amp;quot;,&lt;br /&gt;
					[&amp;quot;type&amp;quot;] = &amp;quot;String&amp;quot;,&lt;br /&gt;
					[&amp;quot;label&amp;quot;] = &amp;quot;Locked until&amp;quot;,&lt;br /&gt;
				},&lt;br /&gt;
				{&lt;br /&gt;
					[&amp;quot;name&amp;quot;] = &amp;quot;characters&amp;quot;,&lt;br /&gt;
					[&amp;quot;type&amp;quot;] = &amp;quot;Page&amp;quot;,&lt;br /&gt;
					[&amp;quot;list&amp;quot;] = true,&lt;br /&gt;
					[&amp;quot;link&amp;quot;] = &amp;quot;PlayerCharacter&amp;quot;,&lt;br /&gt;
					[&amp;quot;section&amp;quot;] = &amp;quot;Characters&amp;quot;,&lt;br /&gt;
				},&lt;br /&gt;
				{&lt;br /&gt;
					[&amp;quot;name&amp;quot;] = &amp;quot;stages&amp;quot;,&lt;br /&gt;
					[&amp;quot;type&amp;quot;] = &amp;quot;Page&amp;quot;,&lt;br /&gt;
					[&amp;quot;list&amp;quot;] = true,&lt;br /&gt;
					[&amp;quot;link&amp;quot;] = &amp;quot;Stage&amp;quot;,&lt;br /&gt;
				},&lt;br /&gt;
				{&lt;br /&gt;
					[&amp;quot;name&amp;quot;] = &amp;quot;wiki_page&amp;quot;,&lt;br /&gt;
					[&amp;quot;type&amp;quot;] = &amp;quot;Page&amp;quot;,&lt;br /&gt;
				},&lt;br /&gt;
				{&lt;br /&gt;
					[&amp;quot;name&amp;quot;] = &amp;quot;game_version&amp;quot;,&lt;br /&gt;
					[&amp;quot;type&amp;quot;] = &amp;quot;String&amp;quot;,&lt;br /&gt;
				},&lt;br /&gt;
				{&lt;br /&gt;
					[&amp;quot;name&amp;quot;] = &amp;quot;source_id&amp;quot;,&lt;br /&gt;
					[&amp;quot;type&amp;quot;] = &amp;quot;String&amp;quot;,&lt;br /&gt;
				},&lt;br /&gt;
			},&lt;br /&gt;
			[&amp;quot;related&amp;quot;] = {&lt;br /&gt;
				{&lt;br /&gt;
					[&amp;quot;label&amp;quot;] = &amp;quot;Stages&amp;quot;,&lt;br /&gt;
					[&amp;quot;type&amp;quot;] = &amp;quot;Stage&amp;quot;,&lt;br /&gt;
					[&amp;quot;field&amp;quot;] = &amp;quot;modes&amp;quot;,&lt;br /&gt;
				},&lt;br /&gt;
			},&lt;br /&gt;
			[&amp;quot;intro&amp;quot;] = &amp;quot;&#039;&#039;&#039;{name}&#039;&#039;&#039; is a game mode.&amp;quot;,&lt;br /&gt;
			[&amp;quot;views&amp;quot;] = {&lt;br /&gt;
				[&amp;quot;ModeSpawns&amp;quot;] = {&lt;br /&gt;
					[&amp;quot;id&amp;quot;] = &amp;quot;ModeSpawns&amp;quot;,&lt;br /&gt;
					[&amp;quot;table&amp;quot;] = &amp;quot;Spawn&amp;quot;,&lt;br /&gt;
					[&amp;quot;heading&amp;quot;] = &amp;quot;Enemies&amp;quot;,&lt;br /&gt;
					[&amp;quot;group&amp;quot;] = &amp;quot;level&amp;quot;,&lt;br /&gt;
					[&amp;quot;columns&amp;quot;] = {&lt;br /&gt;
						{&lt;br /&gt;
							[&amp;quot;field&amp;quot;] = &amp;quot;enemy&amp;quot;,&lt;br /&gt;
							[&amp;quot;label&amp;quot;] = &amp;quot;Enemy&amp;quot;,&lt;br /&gt;
						},&lt;br /&gt;
						{&lt;br /&gt;
							[&amp;quot;field&amp;quot;] = &amp;quot;shown_name&amp;quot;,&lt;br /&gt;
							[&amp;quot;label&amp;quot;] = &amp;quot;Name shown&amp;quot;,&lt;br /&gt;
						},&lt;br /&gt;
						{&lt;br /&gt;
							[&amp;quot;field&amp;quot;] = &amp;quot;health&amp;quot;,&lt;br /&gt;
							[&amp;quot;label&amp;quot;] = &amp;quot;Health&amp;quot;,&lt;br /&gt;
						},&lt;br /&gt;
						{&lt;br /&gt;
							[&amp;quot;field&amp;quot;] = &amp;quot;boss&amp;quot;,&lt;br /&gt;
							[&amp;quot;label&amp;quot;] = &amp;quot;Boss&amp;quot;,&lt;br /&gt;
						},&lt;br /&gt;
						{&lt;br /&gt;
							[&amp;quot;field&amp;quot;] = &amp;quot;spawns&amp;quot;,&lt;br /&gt;
							[&amp;quot;label&amp;quot;] = &amp;quot;Appearances&amp;quot;,&lt;br /&gt;
						},&lt;br /&gt;
					},&lt;br /&gt;
				},&lt;br /&gt;
			},&lt;br /&gt;
			[&amp;quot;text_label&amp;quot;] = &amp;quot;In-game text&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
	},&lt;br /&gt;
	[&amp;quot;tables&amp;quot;] = {&lt;br /&gt;
		[&amp;quot;Move&amp;quot;] = {&lt;br /&gt;
			{&lt;br /&gt;
				[&amp;quot;name&amp;quot;] = &amp;quot;input&amp;quot;,&lt;br /&gt;
				[&amp;quot;type&amp;quot;] = &amp;quot;String&amp;quot;,&lt;br /&gt;
			},&lt;br /&gt;
			{&lt;br /&gt;
				[&amp;quot;name&amp;quot;] = &amp;quot;cancels_from&amp;quot;,&lt;br /&gt;
				[&amp;quot;type&amp;quot;] = &amp;quot;String&amp;quot;,&lt;br /&gt;
			},&lt;br /&gt;
			{&lt;br /&gt;
				[&amp;quot;name&amp;quot;] = &amp;quot;damage&amp;quot;,&lt;br /&gt;
				[&amp;quot;type&amp;quot;] = &amp;quot;String&amp;quot;,&lt;br /&gt;
			},&lt;br /&gt;
			{&lt;br /&gt;
				[&amp;quot;name&amp;quot;] = &amp;quot;mp_cost&amp;quot;,&lt;br /&gt;
				[&amp;quot;type&amp;quot;] = &amp;quot;Integer&amp;quot;,&lt;br /&gt;
			},&lt;br /&gt;
			{&lt;br /&gt;
				[&amp;quot;name&amp;quot;] = &amp;quot;only_when&amp;quot;,&lt;br /&gt;
				[&amp;quot;type&amp;quot;] = &amp;quot;String&amp;quot;,&lt;br /&gt;
			},&lt;br /&gt;
		},&lt;br /&gt;
		[&amp;quot;ExtraMove&amp;quot;] = {&lt;br /&gt;
			{&lt;br /&gt;
				[&amp;quot;name&amp;quot;] = &amp;quot;input&amp;quot;,&lt;br /&gt;
				[&amp;quot;type&amp;quot;] = &amp;quot;String&amp;quot;,&lt;br /&gt;
			},&lt;br /&gt;
			{&lt;br /&gt;
				[&amp;quot;name&amp;quot;] = &amp;quot;cancels_from&amp;quot;,&lt;br /&gt;
				[&amp;quot;type&amp;quot;] = &amp;quot;String&amp;quot;,&lt;br /&gt;
			},&lt;br /&gt;
			{&lt;br /&gt;
				[&amp;quot;name&amp;quot;] = &amp;quot;damage&amp;quot;,&lt;br /&gt;
				[&amp;quot;type&amp;quot;] = &amp;quot;String&amp;quot;,&lt;br /&gt;
			},&lt;br /&gt;
			{&lt;br /&gt;
				[&amp;quot;name&amp;quot;] = &amp;quot;mp_cost&amp;quot;,&lt;br /&gt;
				[&amp;quot;type&amp;quot;] = &amp;quot;Integer&amp;quot;,&lt;br /&gt;
			},&lt;br /&gt;
			{&lt;br /&gt;
				[&amp;quot;name&amp;quot;] = &amp;quot;only_when&amp;quot;,&lt;br /&gt;
				[&amp;quot;type&amp;quot;] = &amp;quot;String&amp;quot;,&lt;br /&gt;
			},&lt;br /&gt;
		},&lt;br /&gt;
		[&amp;quot;Playable&amp;quot;] = {&lt;br /&gt;
			{&lt;br /&gt;
				[&amp;quot;name&amp;quot;] = &amp;quot;health&amp;quot;,&lt;br /&gt;
				[&amp;quot;type&amp;quot;] = &amp;quot;Integer&amp;quot;,&lt;br /&gt;
			},&lt;br /&gt;
			{&lt;br /&gt;
				[&amp;quot;name&amp;quot;] = &amp;quot;mp&amp;quot;,&lt;br /&gt;
				[&amp;quot;type&amp;quot;] = &amp;quot;Integer&amp;quot;,&lt;br /&gt;
			},&lt;br /&gt;
			{&lt;br /&gt;
				[&amp;quot;name&amp;quot;] = &amp;quot;speed&amp;quot;,&lt;br /&gt;
				[&amp;quot;type&amp;quot;] = &amp;quot;Float&amp;quot;,&lt;br /&gt;
			},&lt;br /&gt;
			{&lt;br /&gt;
				[&amp;quot;name&amp;quot;] = &amp;quot;jump_height&amp;quot;,&lt;br /&gt;
				[&amp;quot;type&amp;quot;] = &amp;quot;Float&amp;quot;,&lt;br /&gt;
			},&lt;br /&gt;
		},&lt;br /&gt;
		[&amp;quot;HowToPage&amp;quot;] = {&lt;br /&gt;
			{&lt;br /&gt;
				[&amp;quot;name&amp;quot;] = &amp;quot;page&amp;quot;,&lt;br /&gt;
				[&amp;quot;type&amp;quot;] = &amp;quot;Integer&amp;quot;,&lt;br /&gt;
			},&lt;br /&gt;
			{&lt;br /&gt;
				[&amp;quot;name&amp;quot;] = &amp;quot;image&amp;quot;,&lt;br /&gt;
				[&amp;quot;type&amp;quot;] = &amp;quot;String&amp;quot;,&lt;br /&gt;
			},&lt;br /&gt;
		},&lt;br /&gt;
		[&amp;quot;Variant&amp;quot;] = {&lt;br /&gt;
			{&lt;br /&gt;
				[&amp;quot;name&amp;quot;] = &amp;quot;mode&amp;quot;,&lt;br /&gt;
				[&amp;quot;type&amp;quot;] = &amp;quot;Page&amp;quot;,&lt;br /&gt;
				[&amp;quot;link&amp;quot;] = &amp;quot;Mode&amp;quot;,&lt;br /&gt;
			},&lt;br /&gt;
			{&lt;br /&gt;
				[&amp;quot;name&amp;quot;] = &amp;quot;shown_name&amp;quot;,&lt;br /&gt;
				[&amp;quot;type&amp;quot;] = &amp;quot;String&amp;quot;,&lt;br /&gt;
			},&lt;br /&gt;
			{&lt;br /&gt;
				[&amp;quot;name&amp;quot;] = &amp;quot;health&amp;quot;,&lt;br /&gt;
				[&amp;quot;type&amp;quot;] = &amp;quot;Integer&amp;quot;,&lt;br /&gt;
			},&lt;br /&gt;
			{&lt;br /&gt;
				[&amp;quot;name&amp;quot;] = &amp;quot;damage_taken&amp;quot;,&lt;br /&gt;
				[&amp;quot;type&amp;quot;] = &amp;quot;String&amp;quot;,&lt;br /&gt;
			},&lt;br /&gt;
			{&lt;br /&gt;
				[&amp;quot;name&amp;quot;] = &amp;quot;boss&amp;quot;,&lt;br /&gt;
				[&amp;quot;type&amp;quot;] = &amp;quot;Boolean&amp;quot;,&lt;br /&gt;
			},&lt;br /&gt;
			{&lt;br /&gt;
				[&amp;quot;name&amp;quot;] = &amp;quot;spawns&amp;quot;,&lt;br /&gt;
				[&amp;quot;type&amp;quot;] = &amp;quot;Integer&amp;quot;,&lt;br /&gt;
			},&lt;br /&gt;
		},&lt;br /&gt;
		[&amp;quot;Spawn&amp;quot;] = {&lt;br /&gt;
			{&lt;br /&gt;
				[&amp;quot;name&amp;quot;] = &amp;quot;mode&amp;quot;,&lt;br /&gt;
				[&amp;quot;type&amp;quot;] = &amp;quot;Page&amp;quot;,&lt;br /&gt;
				[&amp;quot;link&amp;quot;] = &amp;quot;Mode&amp;quot;,&lt;br /&gt;
			},&lt;br /&gt;
			{&lt;br /&gt;
				[&amp;quot;name&amp;quot;] = &amp;quot;level&amp;quot;,&lt;br /&gt;
				[&amp;quot;type&amp;quot;] = &amp;quot;String&amp;quot;,&lt;br /&gt;
			},&lt;br /&gt;
			{&lt;br /&gt;
				[&amp;quot;name&amp;quot;] = &amp;quot;enemy&amp;quot;,&lt;br /&gt;
				[&amp;quot;type&amp;quot;] = &amp;quot;Page&amp;quot;,&lt;br /&gt;
				[&amp;quot;link&amp;quot;] = &amp;quot;Enemy&amp;quot;,&lt;br /&gt;
			},&lt;br /&gt;
			{&lt;br /&gt;
				[&amp;quot;name&amp;quot;] = &amp;quot;shown_name&amp;quot;,&lt;br /&gt;
				[&amp;quot;type&amp;quot;] = &amp;quot;String&amp;quot;,&lt;br /&gt;
			},&lt;br /&gt;
			{&lt;br /&gt;
				[&amp;quot;name&amp;quot;] = &amp;quot;health&amp;quot;,&lt;br /&gt;
				[&amp;quot;type&amp;quot;] = &amp;quot;Integer&amp;quot;,&lt;br /&gt;
			},&lt;br /&gt;
			{&lt;br /&gt;
				[&amp;quot;name&amp;quot;] = &amp;quot;boss&amp;quot;,&lt;br /&gt;
				[&amp;quot;type&amp;quot;] = &amp;quot;Boolean&amp;quot;,&lt;br /&gt;
			},&lt;br /&gt;
			{&lt;br /&gt;
				[&amp;quot;name&amp;quot;] = &amp;quot;spawns&amp;quot;,&lt;br /&gt;
				[&amp;quot;type&amp;quot;] = &amp;quot;Integer&amp;quot;,&lt;br /&gt;
			},&lt;br /&gt;
		},&lt;br /&gt;
	},&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>LongJump bot</name></author>
	</entry>
	<entry>
		<id>https://nwrx.wiki.longjump.dev/index.php?title=Module:GameData&amp;diff=620</id>
		<title>Module:GameData</title>
		<link rel="alternate" type="text/html" href="https://nwrx.wiki.longjump.dev/index.php?title=Module:GameData&amp;diff=620"/>
		<updated>2026-11-04T00:19:32Z</updated>

		<summary type="html">&lt;p&gt;LongJump bot: Game data from 645555d&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;-- Renders LongJump game data stored in Cargo: infoboxes, stat lines, lists of&lt;br /&gt;
-- related objects, and the record table shown on Data: pages. Which fields each&lt;br /&gt;
-- type has, and how they display, comes from Module:GameData/schema, which the&lt;br /&gt;
-- generator writes from the game&#039;s types file.&lt;br /&gt;
&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
local schema = mw.loadData( &#039;Module:GameData/schema&#039; )&lt;br /&gt;
&lt;br /&gt;
-- The game&#039;s keyword colors, loaded on first use.&lt;br /&gt;
local keywordIndex&lt;br /&gt;
&lt;br /&gt;
local function isWordChar( c )&lt;br /&gt;
	return c ~= &#039;&#039; and c:match( &#039;[%w_]&#039; ) ~= nil&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Colors keywords the way the game does (TextService.ColorizeText): one pass, longest&lt;br /&gt;
-- keyword first, whole words only where the keyword starts or ends with a word&lt;br /&gt;
-- character, written with the keyword&#039;s own capitalisation.&lt;br /&gt;
local function colorize( text )&lt;br /&gt;
	if not keywordIndex then&lt;br /&gt;
		keywordIndex = {}&lt;br /&gt;
		for _, entry in ipairs( mw.loadData( &#039;Module:GameData/keywords&#039; ) ) do&lt;br /&gt;
			local first = entry[1]:sub( 1, 1 )&lt;br /&gt;
			keywordIndex[first] = keywordIndex[first] or {}&lt;br /&gt;
			table.insert( keywordIndex[first], entry )&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	-- Byte-wise lower case keeps positions aligned with the original text.&lt;br /&gt;
	local lower = text:lower()&lt;br /&gt;
	local out, i = {}, 1&lt;br /&gt;
	while i &amp;lt;= #text do&lt;br /&gt;
		local matched&lt;br /&gt;
		for _, entry in ipairs( keywordIndex[lower:sub( i, i )] or {} ) do&lt;br /&gt;
			local key = entry[1]&lt;br /&gt;
			if lower:sub( i, i + #key - 1 ) == key&lt;br /&gt;
				and not ( isWordChar( key:sub( 1, 1 ) ) and isWordChar( text:sub( i - 1, i - 1 ) ) )&lt;br /&gt;
				and not ( isWordChar( key:sub( -1 ) ) and isWordChar( text:sub( i + #key, i + #key ) ) ) then&lt;br /&gt;
				matched = entry&lt;br /&gt;
				break&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		if matched then&lt;br /&gt;
			out[#out + 1] = &#039;&amp;lt;span class=&amp;quot;kw&amp;quot; style=&amp;quot;--kw:#&#039; .. matched[3] .. &#039;&amp;quot;&amp;gt;&#039; .. matched[2] .. &#039;&amp;lt;/span&amp;gt;&#039;&lt;br /&gt;
			i = i + #matched[1]&lt;br /&gt;
		else&lt;br /&gt;
			out[#out + 1] = text:sub( i, i )&lt;br /&gt;
			i = i + 1&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return table.concat( out )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- A name as text. Page names can hold wiki markup: two apostrophes in a row&lt;br /&gt;
-- (&amp;quot;Kunoichi&#039;&#039;&amp;quot;) would start italics, so they are written as character references.&lt;br /&gt;
-- Names without them come back unchanged.&lt;br /&gt;
local function nameText( name )&lt;br /&gt;
	return ( tostring( name ):gsub( &amp;quot;&#039;&#039;&amp;quot;, &#039;&amp;amp;#39;&amp;amp;#39;&#039; ) )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- A name inside an infobox tag. PortableInfobox decodes character references before&lt;br /&gt;
-- parsing its content, so the apostrophes are kept in nowiki instead.&lt;br /&gt;
local function infoboxText( name )&lt;br /&gt;
	return ( tostring( name ):gsub( &amp;quot;&#039;&#039;&amp;quot;, &amp;quot;&amp;lt;nowiki&amp;gt;&#039;&#039;&amp;lt;/nowiki&amp;gt;&amp;quot; ) )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- The in-game name of each page whose title differs from it (&amp;quot;Arrowstorm (skill)&amp;quot; is&lt;br /&gt;
-- named &amp;quot;Arrowstorm&amp;quot;), written by the generator. Links show the name, not the title.&lt;br /&gt;
local namesLoaded, names = pcall( mw.loadData, &#039;Module:GameData/names&#039; )&lt;br /&gt;
if not namesLoaded then&lt;br /&gt;
	names = {}&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- A link to a page, labelled with its in-game name shown literally.&lt;br /&gt;
local function pageLink( title )&lt;br /&gt;
	local label = names[title] or title&lt;br /&gt;
	if label ~= title or tostring( label ):find( &amp;quot;&#039;&#039;&amp;quot;, 1, true ) then&lt;br /&gt;
		return &#039;[[&#039; .. title .. &#039;|&#039; .. nameText( label ) .. &#039;]]&#039;&lt;br /&gt;
	end&lt;br /&gt;
	return &#039;[[&#039; .. title .. &#039;]]&#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function quote( value )&lt;br /&gt;
	return &amp;quot;&#039;&amp;quot; .. ( tostring( value ):gsub( &amp;quot;&#039;&amp;quot;, &amp;quot;&#039;&#039;&amp;quot; ) ) .. &amp;quot;&#039;&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function trim( s )&lt;br /&gt;
	return ( s:gsub( &#039;^%s+&#039;, &#039;&#039; ):gsub( &#039;%s+$&#039;, &#039;&#039; ) )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function split( value )&lt;br /&gt;
	local items = {}&lt;br /&gt;
	for item in tostring( value ):gmatch( &#039;[^,]+&#039; ) do&lt;br /&gt;
		item = trim( item )&lt;br /&gt;
		if item ~= &#039;&#039; then&lt;br /&gt;
			items[#items + 1] = item&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return items&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function fieldNames( t )&lt;br /&gt;
	local names = {}&lt;br /&gt;
	for _, f in ipairs( t.fields ) do&lt;br /&gt;
		names[#names + 1] = f.name&lt;br /&gt;
	end&lt;br /&gt;
	return table.concat( names, &#039;,&#039; )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function currentPage( frame )&lt;br /&gt;
	local page = frame.args.page&lt;br /&gt;
	if page and page ~= &#039;&#039; then&lt;br /&gt;
		return page&lt;br /&gt;
	end&lt;br /&gt;
	return mw.title.getCurrentTitle().text&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Formats one stored value for display, or returns nil when there is nothing to show.&lt;br /&gt;
local function formatValue( f, value, row )&lt;br /&gt;
	if value == nil or value == &#039;&#039; then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
	if f.type == &#039;Boolean&#039; then&lt;br /&gt;
		-- Yes/no fields only show when true.&lt;br /&gt;
		return ( value == &#039;1&#039; or value == 1 or value == true ) and &#039;Yes&#039; or nil&lt;br /&gt;
	end&lt;br /&gt;
	-- Wording with a slot for the value (&amp;quot;+{0}% to All Resistances&amp;quot;) shows &amp;quot;#&amp;quot; there.&lt;br /&gt;
	value = ( tostring( value ):gsub( &#039;{0}&#039;, &#039;#&#039; ) )&lt;br /&gt;
	local items = f.list and split( value ) or { tostring( value ) }&lt;br /&gt;
	local levels = f.levels and row and row[f.levels] and split( row[f.levels] ) or {}&lt;br /&gt;
	for i, item in ipairs( items ) do&lt;br /&gt;
		-- References to things that have no page in the wiki stay plain text.&lt;br /&gt;
		if f.link and mw.title.new( item ) and mw.title.new( item ).exists then&lt;br /&gt;
			item = pageLink( item )&lt;br /&gt;
		end&lt;br /&gt;
		if levels[i] then&lt;br /&gt;
			item = item .. &#039; (level &#039; .. levels[i] .. &#039;)&#039;&lt;br /&gt;
		end&lt;br /&gt;
		items[i] = item .. ( f.suffix or &#039;&#039; )&lt;br /&gt;
	end&lt;br /&gt;
	return table.concat( items, &#039;, &#039; )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Every query passes orderBy: Cargo 3.7&#039;s default order names list fields with the&lt;br /&gt;
-- full table name while the query uses a short alias, which MariaDB rejects.&lt;br /&gt;
local function fetchRow( t, page )&lt;br /&gt;
	local rows = mw.ext.cargo.query( t.table, fieldNames( t ), {&lt;br /&gt;
		where = &#039;wiki_page=&#039; .. quote( page ),&lt;br /&gt;
		orderBy = &#039;wiki_page&#039;,&lt;br /&gt;
		limit = 1,&lt;br /&gt;
	} )&lt;br /&gt;
	return rows[1]&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Reads the object&#039;s Data: page so MediaWiki records it as embedded in the current&lt;br /&gt;
-- page: when the export rewrites the Data: page, MediaWiki re-renders this page.&lt;br /&gt;
-- (Cargo records that dependency only for #cargo_query, not for Lua queries.)&lt;br /&gt;
local function dependOnData( t, page )&lt;br /&gt;
	local title = mw.title.new( &#039;Data:&#039; .. t.label .. &#039;/&#039; .. page )&lt;br /&gt;
	if title then&lt;br /&gt;
		title:getContent()&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- {{#invoke:GameData|infobox|type=Skill}} on an article.&lt;br /&gt;
function p.infobox( frame )&lt;br /&gt;
	local t = schema.types[frame.args.type]&lt;br /&gt;
	if not t then&lt;br /&gt;
		return &#039;&#039;&lt;br /&gt;
	end&lt;br /&gt;
	local page = currentPage( frame )&lt;br /&gt;
	dependOnData( t, page )&lt;br /&gt;
	local row = fetchRow( t, page )&lt;br /&gt;
	if not row then&lt;br /&gt;
		return &#039;&#039;&lt;br /&gt;
	end&lt;br /&gt;
	local out = { &#039;&amp;lt;infobox&amp;gt;&#039;, &#039;&amp;lt;title&amp;gt;&amp;lt;default&amp;gt;&#039; .. infoboxText( row.name or page ) .. &#039;&amp;lt;/default&amp;gt;&amp;lt;/title&amp;gt;&#039; }&lt;br /&gt;
	if row.icon and row.icon ~= &#039;&#039; then&lt;br /&gt;
		out[#out + 1] = &#039;&amp;lt;image&amp;gt;&amp;lt;default&amp;gt;&#039; .. row.icon .. &#039;&amp;lt;/default&amp;gt;&amp;lt;/image&amp;gt;&#039;&lt;br /&gt;
	end&lt;br /&gt;
	for _, f in ipairs( t.fields ) do&lt;br /&gt;
		if f.label then&lt;br /&gt;
			local value = formatValue( f, row[f.name], row )&lt;br /&gt;
			-- Plain words start with a capital, as the game shows them (&amp;quot;Monster&amp;quot;).&lt;br /&gt;
			if value and f.type == &#039;String&#039; and not f.link and not f.list then&lt;br /&gt;
				value = mw.ustring.upper( mw.ustring.sub( value, 1, 1 ) ) .. mw.ustring.sub( value, 2 )&lt;br /&gt;
			end&lt;br /&gt;
			if value then&lt;br /&gt;
				out[#out + 1] = &#039;&amp;lt;data&amp;gt;&amp;lt;label&amp;gt;&#039; .. f.label .. &#039;&amp;lt;/label&amp;gt;&amp;lt;default&amp;gt;&#039; .. value .. &#039;&amp;lt;/default&amp;gt;&amp;lt;/data&amp;gt;&#039;&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	out[#out + 1] = &#039;&amp;lt;/infobox&amp;gt;&#039;&lt;br /&gt;
	return frame:preprocess( table.concat( out ) ) .. &#039;[[Category:&#039; .. t.category .. &#039;]]&#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- {{#invoke:GameData|statlines|type=Skill}}: the game&#039;s own effect lines for this page,&lt;br /&gt;
-- each linking to every other source of the same stat, under an &amp;quot;Effects&amp;quot; heading.&lt;br /&gt;
function p.statlines( frame )&lt;br /&gt;
	local t = schema.types[frame.args.type]&lt;br /&gt;
	if not t then&lt;br /&gt;
		return &#039;&#039;&lt;br /&gt;
	end&lt;br /&gt;
	local page = currentPage( frame )&lt;br /&gt;
	dependOnData( t, page )&lt;br /&gt;
	local rows = mw.ext.cargo.query( &#039;StatLine&#039;, &#039;stat,text,value,scaling,ordinal&#039;, {&lt;br /&gt;
		where = &#039;wiki_page=&#039; .. quote( page ),&lt;br /&gt;
		orderBy = &#039;ordinal&#039;,&lt;br /&gt;
	} )&lt;br /&gt;
	if #rows == 0 then&lt;br /&gt;
		return &#039;&#039;&lt;br /&gt;
	end&lt;br /&gt;
	local groups, order = {}, {}&lt;br /&gt;
	local shown = {}&lt;br /&gt;
	for _, row in ipairs( rows ) do&lt;br /&gt;
		-- A line with a slot for its value and a value of 0 does nothing: left out.&lt;br /&gt;
		if not ( row.text:find( &#039;{0}&#039;, 1, true ) and tonumber( row.value ) == 0 ) then&lt;br /&gt;
			shown[#shown + 1] = row&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if #shown == 0 then&lt;br /&gt;
		return &#039;&#039;&lt;br /&gt;
	end&lt;br /&gt;
	rows = shown&lt;br /&gt;
	for _, row in ipairs( rows ) do&lt;br /&gt;
		local scaling = row.scaling or &#039;&#039;&lt;br /&gt;
		if not groups[scaling] then&lt;br /&gt;
			groups[scaling] = {}&lt;br /&gt;
			order[#order + 1] = scaling&lt;br /&gt;
		end&lt;br /&gt;
		local value = tostring( tonumber( row.value ) or row.value ):gsub( &#039;%.0$&#039;, &#039;&#039; )&lt;br /&gt;
		local line = colorize( ( row.text:gsub( &#039;{0}&#039;, ( value:gsub( &#039;%%&#039;, &#039;%%%%&#039; ) ) ) ) )&lt;br /&gt;
		-- Some of the game&#039;s lines are fixed text with no slot for the value. Show the&lt;br /&gt;
		-- text as players see it, and the data&#039;s own value beside it unless it&#039;s a switch.&lt;br /&gt;
		if not row.text:find( &#039;{0}&#039;, 1, true ) and value ~= &#039;1&#039; then&lt;br /&gt;
			line = line .. &amp;quot; &amp;lt;small&amp;gt;(game data value: &amp;quot; .. value .. &amp;quot;)&amp;lt;/small&amp;gt;&amp;quot;&lt;br /&gt;
		end&lt;br /&gt;
		local url = mw.title.new( &#039;Special:Drilldown/StatLine&#039; ):fullUrl( { stat = row.stat } )&lt;br /&gt;
		table.insert( groups[scaling], &#039;* &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[&#039; .. url .. &#039; &#039; .. line .. &#039;]&amp;lt;/span&amp;gt;&#039; )&lt;br /&gt;
	end&lt;br /&gt;
	-- Like the game&#039;s own skill tooltips: one-time effects first, then the per-point ones.&lt;br /&gt;
	table.sort( order, function ( a, b )&lt;br /&gt;
		return ( a == &#039;per point&#039; and 1 or 0 ) &amp;lt; ( b == &#039;per point&#039; and 1 or 0 )&lt;br /&gt;
	end )&lt;br /&gt;
	local out = { &#039;== Effects ==&#039; }&lt;br /&gt;
	for _, scaling in ipairs( order ) do&lt;br /&gt;
		if scaling ~= &#039;flat&#039; and scaling ~= &#039;&#039; then&lt;br /&gt;
			-- &amp;quot;Per point invested:&amp;quot; as in the game&#039;s skill tooltips; &amp;quot;Per pick:&amp;quot;, &amp;quot;Per stack:&amp;quot;.&lt;br /&gt;
			local header = scaling:gsub( &#039;^%l&#039;, string.upper ) .. ( scaling:find( &#039;point&#039; ) and &#039; invested&#039; or &#039;&#039; )&lt;br /&gt;
			out[#out + 1] = &amp;quot;&#039;&#039;&amp;quot; .. header .. &amp;quot;:&#039;&#039;&amp;quot;&lt;br /&gt;
		end&lt;br /&gt;
		out[#out + 1] = table.concat( groups[scaling], &#039;\n&#039; )&lt;br /&gt;
	end&lt;br /&gt;
	return frame:preprocess( table.concat( out, &#039;\n&#039; ) )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- {{#invoke:GameData|related|type=SkillTree}}: lists of other objects that refer&lt;br /&gt;
-- to this one, as declared in the schema (&amp;quot;Skills&amp;quot; on a skill tree page).&lt;br /&gt;
function p.related( frame )&lt;br /&gt;
	local t = schema.types[frame.args.type]&lt;br /&gt;
	if not t then&lt;br /&gt;
		return &#039;&#039;&lt;br /&gt;
	end&lt;br /&gt;
	local page = currentPage( frame )&lt;br /&gt;
	local out = {}&lt;br /&gt;
	for _, rel in ipairs( t.related or {} ) do&lt;br /&gt;
		local other = schema.types[rel.type]&lt;br /&gt;
		local field&lt;br /&gt;
		for _, f in ipairs( other.fields ) do&lt;br /&gt;
			if f.name == rel.field then&lt;br /&gt;
				field = f&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		local rows&lt;br /&gt;
		if field.list then&lt;br /&gt;
			-- List values live in a helper table (&amp;lt;table&amp;gt;__&amp;lt;field&amp;gt;); HOLDS has the same&lt;br /&gt;
			-- alias problem as the default order, so join the helper table directly.&lt;br /&gt;
			local helper = other.table .. &#039;__&#039; .. rel.field&lt;br /&gt;
			rows = mw.ext.cargo.query( other.table .. &#039;,&#039; .. helper, other.table .. &#039;.wiki_page=wiki_page&#039;, {&lt;br /&gt;
				join = other.table .. &#039;._ID=&#039; .. helper .. &#039;._rowID&#039;,&lt;br /&gt;
				where = helper .. &#039;._value=&#039; .. quote( page ),&lt;br /&gt;
				orderBy = other.table .. &#039;.wiki_page&#039;,&lt;br /&gt;
				limit = 500,&lt;br /&gt;
			} )&lt;br /&gt;
		else&lt;br /&gt;
			rows = mw.ext.cargo.query( other.table, &#039;wiki_page&#039;, {&lt;br /&gt;
				where = rel.field .. &#039;=&#039; .. quote( page ),&lt;br /&gt;
				orderBy = &#039;wiki_page&#039;,&lt;br /&gt;
				limit = 500,&lt;br /&gt;
			} )&lt;br /&gt;
		end&lt;br /&gt;
		if #rows &amp;gt; 0 then&lt;br /&gt;
			out[#out + 1] = &#039;== &#039; .. rel.label .. &#039; ==&#039;&lt;br /&gt;
			for _, row in ipairs( rows ) do&lt;br /&gt;
				out[#out + 1] = &#039;* &#039; .. pageLink( row.wiki_page )&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	-- List fields shown as their own section rather than in the infobox.&lt;br /&gt;
	local own&lt;br /&gt;
	for _, f in ipairs( t.fields ) do&lt;br /&gt;
		if f.section then&lt;br /&gt;
			own = own or fetchRow( t, page )&lt;br /&gt;
			local items = own and own[f.name] and own[f.name] ~= &#039;&#039; and split( own[f.name] ) or {}&lt;br /&gt;
			if #items &amp;gt; 0 then&lt;br /&gt;
				out[#out + 1] = &#039;== &#039; .. f.section .. &#039; ==&#039;&lt;br /&gt;
				for _, item in ipairs( items ) do&lt;br /&gt;
					out[#out + 1] = &#039;* &#039; .. ( f.link and pageLink( item ) or item )&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return frame:preprocess( table.concat( out, &#039;\n&#039; ) )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- {{#invoke:GameData|text|type=Ability|field=description}}: text written in the&lt;br /&gt;
-- game itself, quoted as players see it.&lt;br /&gt;
function p.text( frame )&lt;br /&gt;
	local t = schema.types[frame.args.type]&lt;br /&gt;
	if not t then&lt;br /&gt;
		return &#039;&#039;&lt;br /&gt;
	end&lt;br /&gt;
	local page = currentPage( frame )&lt;br /&gt;
	dependOnData( t, page )&lt;br /&gt;
	local row = fetchRow( t, page )&lt;br /&gt;
	local value = row and row[frame.args.field or &#039;description&#039;]&lt;br /&gt;
	if not value or value == &#039;&#039; then&lt;br /&gt;
		return &#039;&#039;&lt;br /&gt;
	end&lt;br /&gt;
	local label = frame.args.label or t.text_label or &#039;In-game text&#039;&lt;br /&gt;
	return frame:preprocess( &#039;&amp;lt;blockquote class=&amp;quot;game-text&amp;quot;&amp;gt;&#039; .. colorize( value ) .. &amp;quot;&amp;lt;br&amp;gt;&amp;lt;small&amp;gt;&#039;&#039;&amp;quot; .. label .. &amp;quot;&#039;&#039;&amp;lt;/small&amp;gt;&amp;lt;/blockquote&amp;gt;&amp;quot; )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- {{#invoke:GameData|intro|type=Skill}}: the type&#039;s intro sentence from the schema,&lt;br /&gt;
-- with {field} placeholders filled from the current data.&lt;br /&gt;
function p.intro( frame )&lt;br /&gt;
	local t = schema.types[frame.args.type]&lt;br /&gt;
	if not t then&lt;br /&gt;
		return &#039;&#039;&lt;br /&gt;
	end&lt;br /&gt;
	local page = currentPage( frame )&lt;br /&gt;
	dependOnData( t, page )&lt;br /&gt;
	local row = fetchRow( t, page )&lt;br /&gt;
	if not row or not t.intro then&lt;br /&gt;
		return &#039;&#039;&lt;br /&gt;
	end&lt;br /&gt;
	local fields = {}&lt;br /&gt;
	for _, f in ipairs( t.fields ) do&lt;br /&gt;
		fields[f.name] = f&lt;br /&gt;
	end&lt;br /&gt;
	local text = t.intro:gsub( &#039;{([%w_]+)}&#039;, function ( name )&lt;br /&gt;
		local value = fields[name] and formatValue( fields[name], row[name], row )&lt;br /&gt;
		if value and name == &#039;name&#039; then&lt;br /&gt;
			value = nameText( value )&lt;br /&gt;
		end&lt;br /&gt;
		return value and ( value:gsub( &#039;%%&#039;, &#039;%%%%&#039; ) ) or &#039;&#039;&lt;br /&gt;
	end )&lt;br /&gt;
	return frame:preprocess( text )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Gallery images fit a square box of this many pixels, scaled by a whole number (up by&lt;br /&gt;
-- the largest factor that fits, or down by the smallest divisor that fits), so pixel art&lt;br /&gt;
-- keeps square pixels.&lt;br /&gt;
local GALLERY_BOX = 96&lt;br /&gt;
&lt;br /&gt;
local function galleryImage( file, page )&lt;br /&gt;
	local title = mw.title.new( &#039;File:&#039; .. file )&lt;br /&gt;
	local info = title and title.file&lt;br /&gt;
	local width, height = info and info.width, info and info.height&lt;br /&gt;
	if not width or width == 0 or height == 0 then&lt;br /&gt;
		return &#039;[[File:&#039; .. file .. &#039;|link=&#039; .. page .. &#039;]]&#039;&lt;br /&gt;
	end&lt;br /&gt;
	local side = math.max( width, height )&lt;br /&gt;
	if side &amp;lt;= GALLERY_BOX then&lt;br /&gt;
		local factor = math.floor( GALLERY_BOX / side )&lt;br /&gt;
		width, height = width * factor, height * factor&lt;br /&gt;
	else&lt;br /&gt;
		local divisor = math.ceil( side / GALLERY_BOX )&lt;br /&gt;
		width, height = math.floor( width / divisor ), math.floor( height / divisor )&lt;br /&gt;
	end&lt;br /&gt;
	return &#039;&amp;lt;span class=&amp;quot;gd-gallery-fit&amp;quot; style=&amp;quot;width:&#039; .. width .. &#039;px;height:&#039; .. height .. &#039;px&amp;quot;&amp;gt;[[File:&#039;&lt;br /&gt;
		.. file .. &#039;|link=&#039; .. page .. &#039;]]&amp;lt;/span&amp;gt;&#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- {{#invoke:GameData|gallery|type=Class}}: every object of a type as a grid of icons.&lt;br /&gt;
function p.gallery( frame )&lt;br /&gt;
	local t = schema.types[frame.args.type]&lt;br /&gt;
	if not t then&lt;br /&gt;
		return &#039;&#039;&lt;br /&gt;
	end&lt;br /&gt;
	local rows = mw.ext.cargo.query( t.table, &#039;wiki_page,icon&#039;, { orderBy = &#039;wiki_page&#039;, limit = 500 } )&lt;br /&gt;
	local out = { &#039;&amp;lt;div class=&amp;quot;gd-gallery&amp;quot;&amp;gt;&#039; }&lt;br /&gt;
	for _, row in ipairs( rows ) do&lt;br /&gt;
		local image = &#039;&#039;&lt;br /&gt;
		if row.icon and row.icon ~= &#039;&#039; then&lt;br /&gt;
			image = &#039;&amp;lt;div class=&amp;quot;gd-gallery-image&amp;quot;&amp;gt;&#039; .. galleryImage( row.icon, row.wiki_page ) .. &#039;&amp;lt;/div&amp;gt;&#039;&lt;br /&gt;
		end&lt;br /&gt;
		out[#out + 1] = &#039;&amp;lt;div class=&amp;quot;gd-gallery-item&amp;quot;&amp;gt;&#039; .. image .. pageLink( row.wiki_page ) .. &#039;&amp;lt;/div&amp;gt;&#039;&lt;br /&gt;
	end&lt;br /&gt;
	out[#out + 1] = &#039;&amp;lt;/div&amp;gt;&#039;&lt;br /&gt;
	return frame:preprocess( table.concat( out, &#039;\n&#039; ) )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function rowsFor( tableName, fields, page )&lt;br /&gt;
	return mw.ext.cargo.query( tableName, fields, {&lt;br /&gt;
		where = &#039;wiki_page=&#039; .. quote( page ),&lt;br /&gt;
		orderBy = &#039;ordinal&#039;,&lt;br /&gt;
		limit = 500,&lt;br /&gt;
	} )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Puts a value range into a modifier&#039;s wording: &amp;quot;+{0}% to All Resistances&amp;quot; with &amp;quot;4-6&amp;quot;&lt;br /&gt;
-- gives &amp;quot;+(4-6)% to All Resistances&amp;quot;.&lt;br /&gt;
local function withValue( text, value )&lt;br /&gt;
	value = tostring( value or &#039;&#039; )&lt;br /&gt;
	local shown = value:find( &#039;-&#039;, 2, true ) and ( &#039;(&#039; .. value .. &#039;)&#039; ) or value&lt;br /&gt;
	return ( text:gsub( &#039;{0}&#039;, ( shown:gsub( &#039;%%&#039;, &#039;%%%%&#039; ) ) ) )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- {{Modifier tiers|type=Modifier}}: the modifier&#039;s tiers for each slot or crystal color,&lt;br /&gt;
-- as the in-game Mod Dictionary shows them (T1 is the best).&lt;br /&gt;
function p.tiers( frame )&lt;br /&gt;
	local t = schema.types[frame.args.type]&lt;br /&gt;
	if not t then&lt;br /&gt;
		return &#039;&#039;&lt;br /&gt;
	end&lt;br /&gt;
	local page = currentPage( frame )&lt;br /&gt;
	dependOnData( t, page )&lt;br /&gt;
	local row = fetchRow( t, page )&lt;br /&gt;
	local tiers = rowsFor( &#039;ModifierTier&#039;, &#039;applies_to,tier,value,level,weight&#039;, page )&lt;br /&gt;
	if not row or #tiers == 0 then&lt;br /&gt;
		return &#039;&#039;&lt;br /&gt;
	end&lt;br /&gt;
	local out = { &#039;== Tiers ==&#039;, &#039;{| class=&amp;quot;wikitable gd-tiers&amp;quot;&#039;, &#039;! Tier !! Effect !! Required item level&#039; }&lt;br /&gt;
	local current&lt;br /&gt;
	for _, tier in ipairs( tiers ) do&lt;br /&gt;
		if tier.applies_to ~= current then&lt;br /&gt;
			current = tier.applies_to&lt;br /&gt;
			out[#out + 1] = &#039;|-\n! colspan=&amp;quot;3&amp;quot; | &#039; .. current .. &#039; (weight &#039; .. ( tier.weight or &#039;&#039; ) .. &#039;)&#039;&lt;br /&gt;
		end&lt;br /&gt;
		out[#out + 1] = &#039;|-\n| T&#039; .. tier.tier .. &#039; || &#039; .. colorize( withValue( row.text or &#039;&#039;, tier.value ) ) .. &#039; || &#039; .. ( tier.level or &#039;&#039; )&lt;br /&gt;
	end&lt;br /&gt;
	out[#out + 1] = &#039;|}&#039;&lt;br /&gt;
	return frame:preprocess( table.concat( out, &#039;\n&#039; ) )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- {{Unique modifiers|type=UniqueItem}}: a unique&#039;s fixed modifiers, with their value&lt;br /&gt;
-- range on each difficulty.&lt;br /&gt;
function p.uniquemods( frame )&lt;br /&gt;
	local t = schema.types[frame.args.type]&lt;br /&gt;
	if not t then&lt;br /&gt;
		return &#039;&#039;&lt;br /&gt;
	end&lt;br /&gt;
	local page = currentPage( frame )&lt;br /&gt;
	dependOnData( t, page )&lt;br /&gt;
	local mods = rowsFor( &#039;UniqueModifier&#039;, &#039;text,implicit,mild,spicy,inferno,nightmare&#039;, page )&lt;br /&gt;
	if #mods == 0 then&lt;br /&gt;
		return &#039;&#039;&lt;br /&gt;
	end&lt;br /&gt;
	local out = { &#039;== Modifiers ==&#039;, &#039;{| class=&amp;quot;wikitable gd-unique-mods&amp;quot;&#039;, &#039;! Modifier !! Mild !! Spicy !! Inferno !! Nightmare&#039; }&lt;br /&gt;
	for _, mod in ipairs( mods ) do&lt;br /&gt;
		-- The wording&#039;s slot shows the whole range across the difficulty columns.&lt;br /&gt;
		local low, high&lt;br /&gt;
		for _, value in ipairs( { mod.mild, mod.spicy, mod.inferno, mod.nightmare } ) do&lt;br /&gt;
			for number in tostring( value or &#039;&#039; ):gmatch( &#039;%-?%d+%.?%d*&#039; ) do&lt;br /&gt;
				number = tonumber( number )&lt;br /&gt;
				if number then&lt;br /&gt;
					low = low and math.min( low, number ) or number&lt;br /&gt;
					high = high and math.max( high, number ) or number&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		local range = low and ( low == high and tostring( low ) or ( low .. &#039;-&#039; .. high ) ) or &#039;#&#039;&lt;br /&gt;
		local text = colorize( withValue( mod.text or &#039;&#039;, range ) )&lt;br /&gt;
		if mod.implicit == &#039;1&#039; then&lt;br /&gt;
			text = text .. &amp;quot; &amp;lt;small&amp;gt;&#039;&#039;(implicit)&#039;&#039;&amp;lt;/small&amp;gt;&amp;quot;&lt;br /&gt;
		end&lt;br /&gt;
		out[#out + 1] = &#039;|-\n| &#039; .. text .. &#039; || &#039; .. ( mod.mild or &#039;&#039; ) .. &#039; || &#039; .. ( mod.spicy or &#039;&#039; )&lt;br /&gt;
			.. &#039; || &#039; .. ( mod.inferno or &#039;&#039; ) .. &#039; || &#039; .. ( mod.nightmare or &#039;&#039; )&lt;br /&gt;
	end&lt;br /&gt;
	out[#out + 1] = &#039;|}&#039;&lt;br /&gt;
	return frame:preprocess( table.concat( out, &#039;\n&#039; ) )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- {{Skill item modifiers|type=Skill}}: the item modifiers that add levels to this skill.&lt;br /&gt;
function p.skillmods( frame )&lt;br /&gt;
	local t = schema.types[frame.args.type]&lt;br /&gt;
	if not t then&lt;br /&gt;
		return &#039;&#039;&lt;br /&gt;
	end&lt;br /&gt;
	local page = currentPage( frame )&lt;br /&gt;
	dependOnData( t, page )&lt;br /&gt;
	local mods = rowsFor( &#039;SkillItemModifier&#039;, &#039;slot,affix,tiers,weight&#039;, page )&lt;br /&gt;
	if #mods == 0 then&lt;br /&gt;
		return &#039;&#039;&lt;br /&gt;
	end&lt;br /&gt;
	local out = { &#039;== Rolls on items ==&#039;, &#039;{| class=&amp;quot;wikitable&amp;quot;&#039;, &#039;! Slot !! Affix !! Skill levels by tier !! Weight&#039; }&lt;br /&gt;
	for _, mod in ipairs( mods ) do&lt;br /&gt;
		out[#out + 1] = &#039;|-\n| &#039; .. ( mod.slot or &#039;&#039; ) .. &#039; || &#039; .. ( mod.affix or &#039;&#039; ) .. &#039; || &#039; .. ( mod.tiers or &#039;&#039; ) .. &#039; || &#039; .. ( mod.weight or &#039;&#039; )&lt;br /&gt;
	end&lt;br /&gt;
	out[#out + 1] = &#039;|}&#039;&lt;br /&gt;
	return frame:preprocess( table.concat( out, &#039;\n&#039; ) )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- {{Craft offers|type=Craft}}: every place that offers a craft, with its base costs.&lt;br /&gt;
function p.craftoffers( frame )&lt;br /&gt;
	local t = schema.types[frame.args.type]&lt;br /&gt;
	if not t then&lt;br /&gt;
		return &#039;&#039;&lt;br /&gt;
	end&lt;br /&gt;
	local page = currentPage( frame )&lt;br /&gt;
	dependOnData( t, page )&lt;br /&gt;
	local offers = rowsFor( &#039;CraftOffer&#039;,&lt;br /&gt;
		&#039;offered_by,location,description,gold,essence,crafting_tokens,ultimate_tokens,chaos_added,success_rate,rare_offer&#039;, page )&lt;br /&gt;
	if #offers == 0 then&lt;br /&gt;
		return &#039;&#039;&lt;br /&gt;
	end&lt;br /&gt;
	local out = { &#039;== Where to craft it ==&#039;,&lt;br /&gt;
		&amp;quot;&#039;&#039;Base costs: the game raises them with the item&#039;s Chaos and level.&#039;&#039;&amp;quot;,&lt;br /&gt;
		&#039;{| class=&amp;quot;wikitable&amp;quot;&#039;, &#039;! Offered by !! Where !! Cost !! Chaos added !! Success rate !! Effect&#039; }&lt;br /&gt;
	for _, offer in ipairs( offers ) do&lt;br /&gt;
		local cost = {}&lt;br /&gt;
		for _, part in ipairs( { { &#039;gold&#039;, &#039;Gold&#039; }, { &#039;essence&#039;, &#039;Nightmare Essence&#039; },&lt;br /&gt;
			{ &#039;crafting_tokens&#039;, &#039;Crafting Tokens&#039; }, { &#039;ultimate_tokens&#039;, &#039;Ultimate Tokens&#039; } } ) do&lt;br /&gt;
			if offer[part[1]] and offer[part[1]] ~= &#039;&#039; and offer[part[1]] ~= &#039;0&#039; then&lt;br /&gt;
				cost[#cost + 1] = offer[part[1]] .. &#039; &#039; .. part[2]&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		local who = offer.offered_by .. ( offer.rare_offer == &#039;1&#039; and &amp;quot; &amp;lt;small&amp;gt;&#039;&#039;(rare offer)&#039;&#039;&amp;lt;/small&amp;gt;&amp;quot; or &#039;&#039; )&lt;br /&gt;
		out[#out + 1] = &#039;|-\n| &#039; .. who .. &#039; || &#039; .. ( offer.location or &#039;&#039; ) .. &#039; || &#039; .. ( #cost &amp;gt; 0 and table.concat( cost, &#039;, &#039; ) or &#039;Free&#039; )&lt;br /&gt;
			.. &#039; || &#039; .. ( offer.chaos_added or &#039;0&#039; ) .. &#039; || &#039; .. ( offer.success_rate or &#039;&#039; ) .. &#039;% || &#039; .. colorize( offer.description or &#039;&#039; )&lt;br /&gt;
	end&lt;br /&gt;
	out[#out + 1] = &#039;|}&#039;&lt;br /&gt;
	return frame:preprocess( table.concat( out, &#039;\n&#039; ) )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- One cell of a table view: links to pages that exist, game keyword colors on request.&lt;br /&gt;
local function cell( column, def, value )&lt;br /&gt;
	if value == nil or value == &#039;&#039; then&lt;br /&gt;
		return &#039;&#039;&lt;br /&gt;
	end&lt;br /&gt;
	if def and def.type == &#039;Boolean&#039; then&lt;br /&gt;
		return ( value == &#039;1&#039; or value == 1 ) and &#039;Yes&#039; or &#039;&#039;&lt;br /&gt;
	end&lt;br /&gt;
	value = tostring( value )&lt;br /&gt;
	if column.colorize then&lt;br /&gt;
		value = colorize( value )&lt;br /&gt;
	end&lt;br /&gt;
	local link = column.link or ( def and def.link )&lt;br /&gt;
	if ( link or column.field == &#039;wiki_page&#039; ) and mw.title.new( value ) and mw.title.new( value ).exists then&lt;br /&gt;
		value = pageLink( value )&lt;br /&gt;
	end&lt;br /&gt;
	return value .. ( column.suffix or &#039;&#039; )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- {{Data table|type=Monster|view=MonsterSpawn}}: a row table as declared in the type&#039;s&lt;br /&gt;
-- blocks. A view shows the page&#039;s own rows, or with &amp;quot;match&amp;quot; the rows of other pages&lt;br /&gt;
-- whose given field names this page. &amp;quot;group&amp;quot; starts a header row whenever its value changes.&lt;br /&gt;
function p.datatable( frame )&lt;br /&gt;
	local t = schema.types[frame.args.type]&lt;br /&gt;
	local v = t and t.views and t.views[frame.args.view]&lt;br /&gt;
	if not v then&lt;br /&gt;
		return &#039;&#039;&lt;br /&gt;
	end&lt;br /&gt;
	local page = currentPage( frame )&lt;br /&gt;
	dependOnData( t, page )&lt;br /&gt;
	local defs = {}&lt;br /&gt;
	for _, f in ipairs( schema.tables[v.table] or {} ) do&lt;br /&gt;
		defs[f.name] = f&lt;br /&gt;
	end&lt;br /&gt;
	local names, seen = {}, {}&lt;br /&gt;
	local function want( name )&lt;br /&gt;
		if name and not seen[name] then&lt;br /&gt;
			seen[name] = true&lt;br /&gt;
			names[#names + 1] = name&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	for _, c in ipairs( v.columns ) do&lt;br /&gt;
		want( c.field )&lt;br /&gt;
	end&lt;br /&gt;
	want( v.group )&lt;br /&gt;
	local match = v.match or &#039;wiki_page&#039;&lt;br /&gt;
	local rows = mw.ext.cargo.query( v.table, table.concat( names, &#039;,&#039; ), {&lt;br /&gt;
		where = match .. &#039;=&#039; .. quote( page ),&lt;br /&gt;
		orderBy = v.order or ( match == &#039;wiki_page&#039; and &#039;ordinal&#039; or &#039;wiki_page,ordinal&#039; ),&lt;br /&gt;
		limit = 5000,&lt;br /&gt;
	} )&lt;br /&gt;
	if #rows == 0 then&lt;br /&gt;
		return &#039;&#039;&lt;br /&gt;
	end&lt;br /&gt;
	local out = { &#039;== &#039; .. v.heading .. &#039; ==&#039; }&lt;br /&gt;
	if v.note then&lt;br /&gt;
		out[#out + 1] = &amp;quot;&#039;&#039;&amp;quot; .. v.note .. &amp;quot;&#039;&#039;&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
	-- A view with &amp;quot;gallery&amp;quot; shows its rows as an image gallery: the file and caption fields.&lt;br /&gt;
	if v.gallery then&lt;br /&gt;
		local lines = {}&lt;br /&gt;
		for _, row in ipairs( rows ) do&lt;br /&gt;
			lines[#lines + 1] = &#039;File:&#039; .. row[v.gallery.image] .. &#039;|&#039; .. ( v.gallery.caption_prefix or &#039;&#039; ) .. ( row[v.gallery.caption] or &#039;&#039; )&lt;br /&gt;
		end&lt;br /&gt;
		out[#out + 1] = frame:extensionTag( &#039;gallery&#039;, table.concat( lines, &#039;\n&#039; ),&lt;br /&gt;
			{ mode = &#039;traditional&#039;, widths = v.gallery.width, heights = v.gallery.height } )&lt;br /&gt;
		return frame:preprocess( table.concat( out, &#039;\n&#039; ) )&lt;br /&gt;
	end&lt;br /&gt;
	-- Tables with many columns start below the infobox, so they get the page&#039;s full width.&lt;br /&gt;
	local wide = #v.columns &amp;gt;= 7&lt;br /&gt;
	if wide then&lt;br /&gt;
		table.insert( out, 1, &#039;&amp;lt;div class=&amp;quot;gd-wide&amp;quot;&amp;gt;&#039; )&lt;br /&gt;
	end&lt;br /&gt;
	local header = {}&lt;br /&gt;
	for _, c in ipairs( v.columns ) do&lt;br /&gt;
		header[#header + 1] = c.label&lt;br /&gt;
	end&lt;br /&gt;
	out[#out + 1] = &#039;{| class=&amp;quot;wikitable&#039; .. ( v.group and &#039;&#039; or &#039; sortable&#039; ) .. &#039;&amp;quot;&#039;&lt;br /&gt;
	out[#out + 1] = &#039;! &#039; .. table.concat( header, &#039; !! &#039; )&lt;br /&gt;
	local current&lt;br /&gt;
	for _, row in ipairs( rows ) do&lt;br /&gt;
		if v.group and row[v.group] ~= current then&lt;br /&gt;
			current = row[v.group]&lt;br /&gt;
			out[#out + 1] = &#039;|-\n! colspan=&amp;quot;&#039; .. #v.columns .. &#039;&amp;quot; | &#039; .. cell( { field = v.group }, defs[v.group], current )&lt;br /&gt;
		end&lt;br /&gt;
		local cells = {}&lt;br /&gt;
		for _, c in ipairs( v.columns ) do&lt;br /&gt;
			cells[#cells + 1] = cell( c, defs[c.field], row[c.field] )&lt;br /&gt;
		end&lt;br /&gt;
		out[#out + 1] = &#039;|-\n| &#039; .. table.concat( cells, &#039; || &#039; )&lt;br /&gt;
	end&lt;br /&gt;
	out[#out + 1] = &#039;|}&#039;&lt;br /&gt;
	if wide then&lt;br /&gt;
		out[#out + 1] = &#039;&amp;lt;/div&amp;gt;&#039;&lt;br /&gt;
	end&lt;br /&gt;
	return frame:preprocess( table.concat( out, &#039;\n&#039; ) )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- {{#invoke:GameData|skillmods_all}}: every &amp;quot;+N to &amp;lt;skill&amp;gt;&amp;quot; item modifier, by slot.&lt;br /&gt;
function p.skillmods_all( frame )&lt;br /&gt;
	local mods = mw.ext.cargo.query( &#039;SkillItemModifier&#039;, &#039;wiki_page,slot,affix,tiers&#039;, {&lt;br /&gt;
		orderBy = &#039;slot,wiki_page&#039;,&lt;br /&gt;
		limit = 5000,&lt;br /&gt;
	} )&lt;br /&gt;
	local out, current = {}, nil&lt;br /&gt;
	for _, mod in ipairs( mods ) do&lt;br /&gt;
		if mod.slot ~= current then&lt;br /&gt;
			if current then&lt;br /&gt;
				out[#out + 1] = &#039;|}&#039;&lt;br /&gt;
			end&lt;br /&gt;
			current = mod.slot&lt;br /&gt;
			out[#out + 1] = &#039;== &#039; .. current .. &#039; ==&#039;&lt;br /&gt;
			out[#out + 1] = &#039;{| class=&amp;quot;wikitable sortable&amp;quot;\n! Skill !! Affix !! Skill levels by tier&#039;&lt;br /&gt;
		end&lt;br /&gt;
		out[#out + 1] = &#039;|-\n| &#039; .. pageLink( mod.wiki_page ) .. &#039; || &#039; .. ( mod.affix or &#039;&#039; ) .. &#039; || &#039; .. ( mod.tiers or &#039;&#039; )&lt;br /&gt;
	end&lt;br /&gt;
	if current then&lt;br /&gt;
		out[#out + 1] = &#039;|}&#039;&lt;br /&gt;
	end&lt;br /&gt;
	return frame:preprocess( table.concat( out, &#039;\n&#039; ) )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Used by the &amp;quot;&amp;lt;Label&amp;gt; data&amp;quot; templates: shows the stored record on its Data: page.&lt;br /&gt;
function p.record( frame )&lt;br /&gt;
	local t = schema.types[frame.args.type]&lt;br /&gt;
	if not t then&lt;br /&gt;
		return &#039;&#039;&lt;br /&gt;
	end&lt;br /&gt;
	local args = frame:getParent().args&lt;br /&gt;
	local out = { &#039;{| class=&amp;quot;wikitable&amp;quot;&#039; }&lt;br /&gt;
	for _, f in ipairs( t.fields ) do&lt;br /&gt;
		local value = args[f.name]&lt;br /&gt;
		if value and value ~= &#039;&#039; then&lt;br /&gt;
			out[#out + 1] = &#039;|-\n! &#039; .. f.name .. &#039;\n| &#039; .. ( formatValue( f, value, args ) or &#039;&#039; )&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	out[#out + 1] = &#039;|}&#039;&lt;br /&gt;
	if args.wiki_page and args.wiki_page ~= &#039;&#039; then&lt;br /&gt;
		out[#out + 1] = &#039;Article: &#039; .. pageLink( args.wiki_page )&lt;br /&gt;
	end&lt;br /&gt;
	return frame:preprocess( table.concat( out, &#039;\n&#039; ) )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>LongJump bot</name></author>
	</entry>
	<entry>
		<id>https://nwrx.wiki.longjump.dev/index.php?title=File:Stage_8-5.png&amp;diff=619</id>
		<title>File:Stage 8-5.png</title>
		<link rel="alternate" type="text/html" href="https://nwrx.wiki.longjump.dev/index.php?title=File:Stage_8-5.png&amp;diff=619"/>
		<updated>2026-11-04T00:19:32Z</updated>

		<summary type="html">&lt;p&gt;LongJump bot: LongJump bot uploaded a new version of File:Stage 8-5.png&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;An icon from the game&#039;s files, uploaded by the LongJump export.&lt;br /&gt;
&lt;br /&gt;
[[Category:Game icons]]&lt;/div&gt;</summary>
		<author><name>LongJump bot</name></author>
	</entry>
	<entry>
		<id>https://nwrx.wiki.longjump.dev/index.php?title=File:Stage_8-4.png&amp;diff=618</id>
		<title>File:Stage 8-4.png</title>
		<link rel="alternate" type="text/html" href="https://nwrx.wiki.longjump.dev/index.php?title=File:Stage_8-4.png&amp;diff=618"/>
		<updated>2026-11-04T00:19:32Z</updated>

		<summary type="html">&lt;p&gt;LongJump bot: LongJump bot uploaded a new version of File:Stage 8-4.png&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;An icon from the game&#039;s files, uploaded by the LongJump export.&lt;br /&gt;
&lt;br /&gt;
[[Category:Game icons]]&lt;/div&gt;</summary>
		<author><name>LongJump bot</name></author>
	</entry>
	<entry>
		<id>https://nwrx.wiki.longjump.dev/index.php?title=File:Stage_8-3.png&amp;diff=617</id>
		<title>File:Stage 8-3.png</title>
		<link rel="alternate" type="text/html" href="https://nwrx.wiki.longjump.dev/index.php?title=File:Stage_8-3.png&amp;diff=617"/>
		<updated>2026-11-04T00:19:32Z</updated>

		<summary type="html">&lt;p&gt;LongJump bot: LongJump bot uploaded a new version of File:Stage 8-3.png&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;An icon from the game&#039;s files, uploaded by the LongJump export.&lt;br /&gt;
&lt;br /&gt;
[[Category:Game icons]]&lt;/div&gt;</summary>
		<author><name>LongJump bot</name></author>
	</entry>
	<entry>
		<id>https://nwrx.wiki.longjump.dev/index.php?title=File:Stage_8-2.png&amp;diff=616</id>
		<title>File:Stage 8-2.png</title>
		<link rel="alternate" type="text/html" href="https://nwrx.wiki.longjump.dev/index.php?title=File:Stage_8-2.png&amp;diff=616"/>
		<updated>2026-11-04T00:19:32Z</updated>

		<summary type="html">&lt;p&gt;LongJump bot: LongJump bot uploaded a new version of File:Stage 8-2.png&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;An icon from the game&#039;s files, uploaded by the LongJump export.&lt;br /&gt;
&lt;br /&gt;
[[Category:Game icons]]&lt;/div&gt;</summary>
		<author><name>LongJump bot</name></author>
	</entry>
	<entry>
		<id>https://nwrx.wiki.longjump.dev/index.php?title=File:Stage_8-1.png&amp;diff=615</id>
		<title>File:Stage 8-1.png</title>
		<link rel="alternate" type="text/html" href="https://nwrx.wiki.longjump.dev/index.php?title=File:Stage_8-1.png&amp;diff=615"/>
		<updated>2026-11-04T00:19:31Z</updated>

		<summary type="html">&lt;p&gt;LongJump bot: LongJump bot uploaded a new version of File:Stage 8-1.png&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;An icon from the game&#039;s files, uploaded by the LongJump export.&lt;br /&gt;
&lt;br /&gt;
[[Category:Game icons]]&lt;/div&gt;</summary>
		<author><name>LongJump bot</name></author>
	</entry>
	<entry>
		<id>https://nwrx.wiki.longjump.dev/index.php?title=File:Stage_7-2.png&amp;diff=614</id>
		<title>File:Stage 7-2.png</title>
		<link rel="alternate" type="text/html" href="https://nwrx.wiki.longjump.dev/index.php?title=File:Stage_7-2.png&amp;diff=614"/>
		<updated>2026-11-04T00:19:31Z</updated>

		<summary type="html">&lt;p&gt;LongJump bot: LongJump bot uploaded a new version of File:Stage 7-2.png&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;An icon from the game&#039;s files, uploaded by the LongJump export.&lt;br /&gt;
&lt;br /&gt;
[[Category:Game icons]]&lt;/div&gt;</summary>
		<author><name>LongJump bot</name></author>
	</entry>
	<entry>
		<id>https://nwrx.wiki.longjump.dev/index.php?title=File:Stage_7-1.png&amp;diff=613</id>
		<title>File:Stage 7-1.png</title>
		<link rel="alternate" type="text/html" href="https://nwrx.wiki.longjump.dev/index.php?title=File:Stage_7-1.png&amp;diff=613"/>
		<updated>2026-11-04T00:19:31Z</updated>

		<summary type="html">&lt;p&gt;LongJump bot: LongJump bot uploaded a new version of File:Stage 7-1.png&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;An icon from the game&#039;s files, uploaded by the LongJump export.&lt;br /&gt;
&lt;br /&gt;
[[Category:Game icons]]&lt;/div&gt;</summary>
		<author><name>LongJump bot</name></author>
	</entry>
	<entry>
		<id>https://nwrx.wiki.longjump.dev/index.php?title=File:Stage_6-2.png&amp;diff=612</id>
		<title>File:Stage 6-2.png</title>
		<link rel="alternate" type="text/html" href="https://nwrx.wiki.longjump.dev/index.php?title=File:Stage_6-2.png&amp;diff=612"/>
		<updated>2026-11-04T00:19:31Z</updated>

		<summary type="html">&lt;p&gt;LongJump bot: LongJump bot uploaded a new version of File:Stage 6-2.png&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;An icon from the game&#039;s files, uploaded by the LongJump export.&lt;br /&gt;
&lt;br /&gt;
[[Category:Game icons]]&lt;/div&gt;</summary>
		<author><name>LongJump bot</name></author>
	</entry>
	<entry>
		<id>https://nwrx.wiki.longjump.dev/index.php?title=File:Stage_6-1.png&amp;diff=611</id>
		<title>File:Stage 6-1.png</title>
		<link rel="alternate" type="text/html" href="https://nwrx.wiki.longjump.dev/index.php?title=File:Stage_6-1.png&amp;diff=611"/>
		<updated>2026-11-04T00:19:31Z</updated>

		<summary type="html">&lt;p&gt;LongJump bot: LongJump bot uploaded a new version of File:Stage 6-1.png&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;An icon from the game&#039;s files, uploaded by the LongJump export.&lt;br /&gt;
&lt;br /&gt;
[[Category:Game icons]]&lt;/div&gt;</summary>
		<author><name>LongJump bot</name></author>
	</entry>
	<entry>
		<id>https://nwrx.wiki.longjump.dev/index.php?title=File:Stage_5-3.png&amp;diff=610</id>
		<title>File:Stage 5-3.png</title>
		<link rel="alternate" type="text/html" href="https://nwrx.wiki.longjump.dev/index.php?title=File:Stage_5-3.png&amp;diff=610"/>
		<updated>2026-11-04T00:19:31Z</updated>

		<summary type="html">&lt;p&gt;LongJump bot: LongJump bot uploaded a new version of File:Stage 5-3.png&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;An icon from the game&#039;s files, uploaded by the LongJump export.&lt;br /&gt;
&lt;br /&gt;
[[Category:Game icons]]&lt;/div&gt;</summary>
		<author><name>LongJump bot</name></author>
	</entry>
	<entry>
		<id>https://nwrx.wiki.longjump.dev/index.php?title=File:Stage_5-2.png&amp;diff=609</id>
		<title>File:Stage 5-2.png</title>
		<link rel="alternate" type="text/html" href="https://nwrx.wiki.longjump.dev/index.php?title=File:Stage_5-2.png&amp;diff=609"/>
		<updated>2026-11-04T00:19:31Z</updated>

		<summary type="html">&lt;p&gt;LongJump bot: LongJump bot uploaded a new version of File:Stage 5-2.png&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;An icon from the game&#039;s files, uploaded by the LongJump export.&lt;br /&gt;
&lt;br /&gt;
[[Category:Game icons]]&lt;/div&gt;</summary>
		<author><name>LongJump bot</name></author>
	</entry>
</feed>