<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.pokemonrevolution.net/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=149.88.0.0%2F16</id>
	<title>Pokémon Revolution Online Wiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.pokemonrevolution.net/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=149.88.0.0%2F16"/>
	<link rel="alternate" type="text/html" href="https://wiki.pokemonrevolution.net/Special:Contributions/149.88.0.0/16"/>
	<updated>2026-09-30T06:07:07Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.46.0</generator>
	<entry>
		<id>https://wiki.pokemonrevolution.net/index.php?title=Module:NPCTrainer&amp;diff=41133</id>
		<title>Module:NPCTrainer</title>
		<link rel="alternate" type="text/html" href="https://wiki.pokemonrevolution.net/index.php?title=Module:NPCTrainer&amp;diff=41133"/>
		<updated>2026-09-29T07:44:07Z</updated>

		<summary type="html">&lt;p&gt;149.88.27.84: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local p = {}&lt;br /&gt;
&lt;br /&gt;
local DATA_FORMAT = &#039;CSV with header&#039;&lt;br /&gt;
&lt;br /&gt;
local function nonEmpty(s)&lt;br /&gt;
	if s == nil then return nil end&lt;br /&gt;
	s = mw.text.trim(tostring(s))&lt;br /&gt;
	if s == &#039;&#039; then return nil end&lt;br /&gt;
	return s&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function lcfirst(s)&lt;br /&gt;
	local first = mw.ustring.sub(s, 1, 1)&lt;br /&gt;
	local rest = mw.ustring.sub(s, 2)&lt;br /&gt;
	return mw.ustring.lower(first) .. rest&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function splitList(s, count)&lt;br /&gt;
	local out = {}&lt;br /&gt;
	if nonEmpty(s) then&lt;br /&gt;
		for _, part in ipairs(mw.text.split(s, &#039;,&#039;)) do&lt;br /&gt;
			out[#out + 1] = mw.text.trim(part)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	for i = 1, count do&lt;br /&gt;
		out[i] = out[i] or &#039;&#039;&lt;br /&gt;
	end&lt;br /&gt;
	return out&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local pokemonRowsCache = nil&lt;br /&gt;
local function pokemonRows()&lt;br /&gt;
	if pokemonRowsCache then return pokemonRowsCache end&lt;br /&gt;
local csvData = mw.ext.externalData.getExternalData{&lt;br /&gt;
    source = &#039;data&#039;,&lt;br /&gt;
    [&#039;file name&#039;] = &#039;PokemonRawList.csv&#039;,&lt;br /&gt;
    format = DATA_FORMAT,&lt;br /&gt;
    data = { name = &#039;Name&#039;, number = &#039;Pokedex Number&#039; },&lt;br /&gt;
}&lt;br /&gt;
	pokemonRowsCache = {}&lt;br /&gt;
	if csvData then&lt;br /&gt;
		for _, row in ipairs(csvData) do&lt;br /&gt;
			if nonEmpty(row.name) then&lt;br /&gt;
				pokemonRowsCache[row.name] = row&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return pokemonRowsCache&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local megaCache = {}&lt;br /&gt;
local function megaByName(name)&lt;br /&gt;
	if megaCache[name] == nil then&lt;br /&gt;
		local ok, values = pcall(function()&lt;br /&gt;
			return mw.ext.externalData.getFileData{&lt;br /&gt;
				source = &#039;data&#039;,&lt;br /&gt;
				[&#039;file name&#039;] = &#039;RawMegaPokemonList.csv&#039;,&lt;br /&gt;
				format = DATA_FORMAT,&lt;br /&gt;
				filters = &#039;Name=&#039; .. name,&lt;br /&gt;
				data = &#039;name=Name,number=Pokedex Number&#039;,&lt;br /&gt;
			}&lt;br /&gt;
		end)&lt;br /&gt;
		megaCache[name] = (ok and values and values.name ~= nil) and values or false&lt;br /&gt;
	end&lt;br /&gt;
	return megaCache[name] or nil&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local typeColorCache = {}&lt;br /&gt;
local function typeColor(frame, pokeType)&lt;br /&gt;
	pokeType = nonEmpty(pokeType) or &#039;Normal&#039;&lt;br /&gt;
	if not typeColorCache[pokeType] then&lt;br /&gt;
		typeColorCache[pokeType] = {&lt;br /&gt;
			base = frame:expandTemplate{ title = pokeType .. &#039; color&#039; },&lt;br /&gt;
			light = frame:expandTemplate{ title = pokeType .. &#039; color light&#039; },&lt;br /&gt;
			dark = frame:expandTemplate{ title = pokeType .. &#039; color dark&#039; },&lt;br /&gt;
		}&lt;br /&gt;
	end&lt;br /&gt;
	return typeColorCache[pokeType]&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local PokemonForms = require(&#039;Module:PokemonForms&#039;)&lt;br /&gt;
local FORM_SUFFIXES = PokemonForms.FORM_SUFFIXES&lt;br /&gt;
local MEGA_VARIANTS = PokemonForms.MEGA_VARIANTS or { &#039;&#039;, &#039; X&#039;, &#039; Y&#039; }&lt;br /&gt;
&lt;br /&gt;
local function rawListFormName(form, stem)&lt;br /&gt;
	if form.rawList == &#039;suffix&#039; then&lt;br /&gt;
		return stem .. &#039;-&#039; .. form.suffix&lt;br /&gt;
	elseif form.rawList == &#039;prefix-hyphen&#039; then&lt;br /&gt;
		return form.label .. &#039;-&#039; .. stem&lt;br /&gt;
	elseif form.rawList == &#039;suffix-label&#039; then&lt;br /&gt;
		return stem .. &#039;-&#039; .. form.label&lt;br /&gt;
	elseif form.rawList == &#039;suffix-space&#039; then&lt;br /&gt;
		return stem .. &#039; &#039; .. form.label&lt;br /&gt;
	end&lt;br /&gt;
	return form.label .. &#039; &#039; .. stem&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function resolveFormRow(rows, baseName, formsText)&lt;br /&gt;
	local lower = mw.ustring.lower(formsText)&lt;br /&gt;
	if mw.ustring.sub(lower, 1, 4) == &#039;mega&#039; then&lt;br /&gt;
		for _, variant in ipairs(MEGA_VARIANTS) do&lt;br /&gt;
			if lower == mw.ustring.lower(&#039;Mega&#039; .. variant) then&lt;br /&gt;
				return megaByName(baseName .. variant)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	for _, form in ipairs(FORM_SUFFIXES) do&lt;br /&gt;
		if mw.ustring.lower(form.label) == lower or mw.ustring.lower(form.suffix) == lower then&lt;br /&gt;
			local candidate = rawListFormName(form, baseName)&lt;br /&gt;
			if rows[candidate] then&lt;br /&gt;
				return rows[candidate]&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return nil&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function slotHtml(rows, pokeName, level, formsText, cell, border)&lt;br /&gt;
	if not nonEmpty(pokeName) then&lt;br /&gt;
		return &#039;&amp;lt;td width=&amp;quot;16%&amp;quot;&amp;gt;&amp;lt;table style=&amp;quot;width: 100%; height: 55px; border: 1px solid &#039; .. border ..&lt;br /&gt;
			&#039;; background-color: &#039; .. border .. &#039;; border-radius: 15px;&amp;quot;&amp;gt;&amp;lt;/table&amp;gt;&amp;lt;/td&amp;gt;&#039;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local row = rows[pokeName]&lt;br /&gt;
	local formNote = &#039;&#039;&lt;br /&gt;
	if nonEmpty(formsText) and not tonumber(formsText) then&lt;br /&gt;
		formNote = &#039; (&#039; .. formsText .. &#039;)&#039;&lt;br /&gt;
		local formRow = resolveFormRow(rows, pokeName, formsText)&lt;br /&gt;
		if formRow then&lt;br /&gt;
			row = formRow&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local number = (row and nonEmpty(row.number)) or &#039;&#039;&lt;br /&gt;
	local displayName = (row and nonEmpty(row.name)) or pokeName&lt;br /&gt;
&lt;br /&gt;
	return &#039;&amp;lt;td width=&amp;quot;16%&amp;quot;&amp;gt;&amp;lt;table style=&amp;quot;width: 100%; height: 55px; border: 1px solid &#039; .. border ..&lt;br /&gt;
		&#039;; background-color: &#039; .. cell .. &#039;; border-radius: 15px;&amp;quot;&amp;gt;&#039; ..&lt;br /&gt;
		&#039;&amp;lt;tr&amp;gt;&amp;lt;td rowspan=&amp;quot;2&amp;quot; style=&amp;quot;text-align: right;&amp;quot;&amp;gt;[[File:&#039; .. number .. &#039;Icon.png]]&amp;lt;/td&amp;gt;&#039; ..&lt;br /&gt;
		&#039;&amp;lt;td&amp;gt;[[&#039; .. displayName .. &#039;]]&#039; .. formNote .. &#039;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&#039; ..&lt;br /&gt;
		&#039;&amp;lt;tr&amp;gt;&amp;lt;td colspan=&amp;quot;2&amp;quot; style=&amp;quot;font-weight: bold; color: &#039; .. border .. &#039;;&amp;quot;&amp;gt; Lv. &#039; ..&lt;br /&gt;
		(nonEmpty(level) or &#039;???&#039;) .. &#039;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&#039; ..&lt;br /&gt;
		&#039;&amp;lt;/table&amp;gt;&amp;lt;/td&amp;gt;&#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.lineup(frame)&lt;br /&gt;
	local parent = frame:getParent()&lt;br /&gt;
	local pargs = (parent and parent.args) or frame.args&lt;br /&gt;
	local iargs = frame.args&lt;br /&gt;
&lt;br /&gt;
	local border = nonEmpty(iargs.Border)&lt;br /&gt;
	local cell = nonEmpty(iargs.Cell)&lt;br /&gt;
	if not border or not cell then&lt;br /&gt;
		local normal = typeColor(frame, &#039;Normal&#039;)&lt;br /&gt;
		border = border or (&#039;#&#039; .. normal.dark)&lt;br /&gt;
		cell = cell or (&#039;#&#039; .. normal.light)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local rows = pokemonRows()&lt;br /&gt;
	local pokeList = splitList(pargs.Pokemon, 6)&lt;br /&gt;
	local levels = splitList(pargs.Levels, 6)&lt;br /&gt;
	local forms = splitList(pargs.Forms, 6)&lt;br /&gt;
&lt;br /&gt;
	local cells = {}&lt;br /&gt;
	for i = 1, 6 do&lt;br /&gt;
		cells[#cells + 1] = slotHtml(rows, pokeList[i], levels[i], forms[i], cell, border)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local out = &#039;&amp;lt;tr&amp;gt;&#039; .. table.concat(cells) .. &#039;&amp;lt;/tr&amp;gt;&#039;&lt;br /&gt;
&lt;br /&gt;
	local bonus = nonEmpty(pargs.BonusPayout)&lt;br /&gt;
	if bonus then&lt;br /&gt;
		out = out .. &#039;&amp;lt;tr&amp;gt;&amp;lt;td colspan=&amp;quot;6&amp;quot; style=&amp;quot;background-color: &#039; .. cell ..&lt;br /&gt;
			&#039;; padding: 3px; text-align: left; border-radius: 15px; border: 1px solid &#039; .. border .. &#039;;&amp;quot;&amp;gt;&#039; ..&lt;br /&gt;
			&#039;&amp;lt;span style=&amp;quot;margin-left: 15px; font-weight: bold; color: &#039; .. border .. &#039;;&amp;quot;&amp;gt;Bonus payout:&amp;lt;/span&amp;gt; &#039; ..&lt;br /&gt;
			bonus .. &#039;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&#039;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return out&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.trainer(frame)&lt;br /&gt;
	local parent = frame:getParent()&lt;br /&gt;
	local pargs = (parent and parent.args) or frame.args&lt;br /&gt;
	local iargs = frame.args&lt;br /&gt;
&lt;br /&gt;
	local border = nonEmpty(iargs.Border)&lt;br /&gt;
	local cell = nonEmpty(iargs.Cell)&lt;br /&gt;
	local background = nonEmpty(iargs.Background)&lt;br /&gt;
	if not border or not cell or not background then&lt;br /&gt;
		local normal = typeColor(frame, &#039;Normal&#039;)&lt;br /&gt;
		border = border or (&#039;#&#039; .. normal.dark)&lt;br /&gt;
		cell = cell or (&#039;#&#039; .. normal.light)&lt;br /&gt;
		background = background or (&#039;#&#039; .. normal.base)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local class = nonEmpty(pargs.Class)&lt;br /&gt;
	local gender = nonEmpty(pargs.Gender)&lt;br /&gt;
	local name = nonEmpty(pargs.Name)&lt;br /&gt;
&lt;br /&gt;
	local showClassRaw = pargs.ShowClass&lt;br /&gt;
	if showClassRaw == nil then showClassRaw = &#039;yes&#039; end&lt;br /&gt;
	local showClass = nonEmpty(showClassRaw) ~= nil&lt;br /&gt;
&lt;br /&gt;
	local portrait&lt;br /&gt;
	if class then&lt;br /&gt;
		local genderSuffix = gender and (&#039;_(&#039; .. lcfirst(gender) .. &#039;)&#039;) or &#039;&#039;&lt;br /&gt;
		portrait = &#039;[[File:&#039; .. class .. genderSuffix .. &#039;.png]]&#039;&lt;br /&gt;
	elseif name then&lt;br /&gt;
		portrait = &#039;[[File:&#039; .. name .. &#039;.png]]&#039;&lt;br /&gt;
	else&lt;br /&gt;
		portrait = &#039;&#039;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local classPart = (class and showClass) and class or &#039;&#039;&lt;br /&gt;
	local namePart = name or &#039;&#039;&lt;br /&gt;
	local label = mw.text.trim(classPart .. &#039; &#039; .. namePart)&lt;br /&gt;
&lt;br /&gt;
	local buf = {}&lt;br /&gt;
	buf[#buf + 1] = &#039;&amp;lt;table style=&amp;quot;width: 100%; padding: 5px; border-spacing: 7px; border: 4px solid &#039; .. border ..&lt;br /&gt;
		&#039;; background-color: &#039; .. background .. &#039;; border-radius: 15px;&amp;quot;&amp;gt;&#039;&lt;br /&gt;
	buf[#buf + 1] = &#039;&amp;lt;tr&amp;gt;&amp;lt;td colspan=&amp;quot;6&amp;quot;&amp;gt;&amp;lt;div style=&amp;quot;border-radius: 15px; font-weight: bold; color: &#039; .. border ..&lt;br /&gt;
		&#039;; background-color: &#039; .. cell .. &#039;; padding: 8px; margin: auto auto; width: 50%; border: 1px solid &#039; ..&lt;br /&gt;
		border .. &#039;;&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;middle-align&amp;quot; style=&amp;quot;margin-top: 5px;&amp;quot;&amp;gt;&#039; .. portrait .. &#039;&amp;lt;/div&amp;gt;&#039; ..&lt;br /&gt;
		label .. &#039;&amp;lt;/div&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&#039;&lt;br /&gt;
&lt;br /&gt;
	buf[#buf + 1] = mw.text.trim(pargs.Lineup or &#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
	local notes = nonEmpty(pargs.Notes)&lt;br /&gt;
	if notes then&lt;br /&gt;
		buf[#buf + 1] = &#039;&amp;lt;tr&amp;gt;&amp;lt;td colspan=&amp;quot;6&amp;quot; style=&amp;quot;text-align:left; background-color:&#039; .. cell ..&lt;br /&gt;
			&#039;; padding: 3px; border-radius: 15px; border: 1px solid &#039; .. border .. &#039;;&amp;quot;&amp;gt;&#039; ..&lt;br /&gt;
			&#039;&amp;lt;p style=&amp;quot;margin-left: 15px;&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Notes:&amp;lt;/b&amp;gt; &#039; .. notes .. &#039;.&amp;lt;/p&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&#039;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local cooldown = nonEmpty(pargs.Cooldown)&lt;br /&gt;
	if cooldown then&lt;br /&gt;
		local cdText = (cooldown == &#039;none&#039;) and &#039;None, this is a one-time battle.&#039; or cooldown&lt;br /&gt;
		buf[#buf + 1] = &#039;&amp;lt;tr&amp;gt;&amp;lt;td colspan=&amp;quot;6&amp;quot; style=&amp;quot;text-align: left; background-color: &#039; .. cell ..&lt;br /&gt;
			&#039;; padding: 3px; border-radius: 15px; border: 1px solid &#039; .. border .. &#039;;&amp;quot;&amp;gt;&#039; ..&lt;br /&gt;
			&#039;&amp;lt;p style=&amp;quot;margin-left: 15px;&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Cooldown:&amp;lt;/b&amp;gt; &#039; .. cdText .. &#039;&amp;lt;/p&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&#039;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	buf[#buf + 1] = &#039;&amp;lt;/table&amp;gt;&#039;&lt;br /&gt;
&lt;br /&gt;
	return &#039;&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;&#039; .. table.concat(buf) .. &#039;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.table(frame)&lt;br /&gt;
	local parent = frame:getParent()&lt;br /&gt;
	local pargs = (parent and parent.args) or frame.args&lt;br /&gt;
	local iargs = frame.args&lt;br /&gt;
&lt;br /&gt;
	local border = nonEmpty(iargs.Border)&lt;br /&gt;
	local cell = nonEmpty(iargs.Cell)&lt;br /&gt;
	local background = nonEmpty(iargs.Background)&lt;br /&gt;
	if not border or not cell or not background then&lt;br /&gt;
		local normal = typeColor(frame, &#039;Normal&#039;)&lt;br /&gt;
		border = border or (&#039;#&#039; .. normal.dark)&lt;br /&gt;
		cell = cell or (&#039;#&#039; .. normal.light)&lt;br /&gt;
		background = background or (&#039;#&#039; .. normal.base)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local location = nonEmpty(pargs.Location) or mw.title.getCurrentTitle().text&lt;br /&gt;
&lt;br /&gt;
	local buf = {}&lt;br /&gt;
	buf[#buf + 1] = &#039;&amp;lt;table align=&amp;quot;center&amp;quot; style=&amp;quot;width: 97%; border-spacing: 5px; padding: 5px; &#039; ..&lt;br /&gt;
		&#039;text-align: center; border: 4px solid &#039; .. border .. &#039;; border-radius: 15px; background-color: &#039; ..&lt;br /&gt;
		cell .. &#039;;&amp;quot;&amp;gt;&#039;&lt;br /&gt;
	buf[#buf + 1] = &#039;&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;&amp;lt;div style=&amp;quot;margin: auto auto; border-radius: 15px; font-weight: bold; &#039; ..&lt;br /&gt;
		&#039;width: 45%; padding: 3px; background-color: &#039; .. border .. &#039;; color: &#039; .. cell .. &#039;;&amp;quot;&amp;gt;&#039; ..&lt;br /&gt;
		location .. &#039; Trainers&amp;lt;/div&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&#039;&lt;br /&gt;
		&lt;br /&gt;
	buf[#buf + 1] = mw.ustring.gsub(mw.text.trim(pargs.Contents or &#039;&#039;), &#039;\n&#039;, &#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
	buf[#buf + 1] = &#039;&amp;lt;tr&amp;gt;&amp;lt;td style=&amp;quot;text-align: left; background-color: #FFFFFF; padding: 3px; &#039; ..&lt;br /&gt;
		&#039;border-radius: 15px; border: 1px solid &#039; .. border .. &#039;; color:#000000;&amp;quot;&amp;gt;&#039; ..&lt;br /&gt;
		&#039;&amp;lt;p style=&amp;quot;margin-left: 15px;&amp;quot;&amp;gt;All NPCs cool down after 7 days unless noted contrariwise.&amp;lt;br&amp;gt;&#039; ..&lt;br /&gt;
		&#039;All NPCs may have new Pokémons, or higher level Pokémons upon rematch unless noted contrariwise.&amp;lt;/p&amp;gt;&#039; ..&lt;br /&gt;
		&#039;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&#039;&lt;br /&gt;
	buf[#buf + 1] = &#039;&amp;lt;/table&amp;gt;&#039;&lt;br /&gt;
&lt;br /&gt;
	return table.concat(buf)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function gymSlotHtml(rows, pokeName, cell, border)&lt;br /&gt;
	if not nonEmpty(pokeName) then&lt;br /&gt;
		return &#039;&amp;lt;td width=&amp;quot;16%&amp;quot;&amp;gt;&amp;lt;table style=&amp;quot;width: 100%; padding: 5px; border: 1px solid &#039; .. border ..&lt;br /&gt;
			&#039;; background-color: &#039; .. border .. &#039;; border-radius: 15px;&amp;quot;&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td style=&amp;quot;border-radius: 20px; &#039; ..&lt;br /&gt;
			&#039;border: 1px solid &#039; .. border .. &#039;; width: 40px; height: 40px; background-color: &#039; .. border ..&lt;br /&gt;
			&#039;; padding: 2px;&amp;quot;&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&amp;lt;/td&amp;gt;&#039;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local row = rows[pokeName]&lt;br /&gt;
	local number = (row and nonEmpty(row.number)) or &#039;&#039;&lt;br /&gt;
	local displayName = (row and nonEmpty(row.name)) or pokeName&lt;br /&gt;
&lt;br /&gt;
	return &#039;&amp;lt;td width=&amp;quot;16%&amp;quot;&amp;gt;&amp;lt;table style=&amp;quot;width: 100%; padding: 5px; border: 1px solid &#039; .. border ..&lt;br /&gt;
		&#039;; background-color: &#039; .. cell .. &#039;; border-radius: 15px;&amp;quot;&amp;gt;&#039; ..&lt;br /&gt;
		&#039;&amp;lt;tr&amp;gt;&amp;lt;td style=&amp;quot;border-radius: 20px; border: 1px solid &#039; .. border .. &#039;; width: 40px; height: 40px; &#039; ..&lt;br /&gt;
		&#039;background-color: #FFFFFF; padding: 2px;&amp;quot;&amp;gt;[[File:&#039; .. number .. &#039;Icon.png]]&amp;lt;/td&amp;gt;&#039; ..&lt;br /&gt;
		&#039;&amp;lt;td&amp;gt;[[&#039; .. displayName .. &#039;]]&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&amp;lt;/td&amp;gt;&#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.gymLineup(frame)&lt;br /&gt;
	local parent = frame:getParent()&lt;br /&gt;
	local pargs = (parent and parent.args) or frame.args&lt;br /&gt;
	local iargs = frame.args&lt;br /&gt;
&lt;br /&gt;
	local border = nonEmpty(iargs.Border)&lt;br /&gt;
	local cell = nonEmpty(iargs.Cell)&lt;br /&gt;
	if not border or not cell then&lt;br /&gt;
		local normal = typeColor(frame, &#039;Normal&#039;)&lt;br /&gt;
		border = border or (&#039;#&#039; .. normal.dark)&lt;br /&gt;
		cell = cell or (&#039;#&#039; .. normal.light)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local rows = pokemonRows()&lt;br /&gt;
	local pokeList = splitList(pargs.Pokemon, 6)&lt;br /&gt;
&lt;br /&gt;
	local cells = {}&lt;br /&gt;
	for i = 1, 6 do&lt;br /&gt;
		cells[#cells + 1] = gymSlotHtml(rows, pokeList[i], cell, border)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local out = &#039;&amp;lt;tr class=&amp;quot;responsive-npclineup&amp;quot;&amp;gt;&#039; .. table.concat(cells) .. &#039;&amp;lt;/tr&amp;gt;&#039;&lt;br /&gt;
&lt;br /&gt;
	local bonus = nonEmpty(pargs.BonusPayout)&lt;br /&gt;
	if bonus then&lt;br /&gt;
		out = out .. &#039;&amp;lt;tr&amp;gt;&amp;lt;td colspan=&amp;quot;6&amp;quot; style=&amp;quot;background-color: &#039; .. cell ..&lt;br /&gt;
			&#039;; padding: 3px; text-align: left; border-radius: 15px; border: 1px solid &#039; .. border .. &#039;;&amp;quot;&amp;gt;&#039; ..&lt;br /&gt;
			&#039;&amp;lt;span style=&amp;quot;margin-left: 15px; font-weight: bold; color: &#039; .. border .. &#039;;&amp;quot;&amp;gt;Bonus payout:&amp;lt;/span&amp;gt; &#039; ..&lt;br /&gt;
			bonus .. &#039;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&#039;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return out&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.gymTable(frame)&lt;br /&gt;
	local parent = frame:getParent()&lt;br /&gt;
	local pargs = (parent and parent.args) or frame.args&lt;br /&gt;
	local iargs = frame.args&lt;br /&gt;
&lt;br /&gt;
	local border = nonEmpty(iargs.Border)&lt;br /&gt;
	local cell = nonEmpty(iargs.Cell)&lt;br /&gt;
	local background = nonEmpty(iargs.Background)&lt;br /&gt;
	if not border or not cell or not background then&lt;br /&gt;
		local normal = typeColor(frame, &#039;Normal&#039;)&lt;br /&gt;
		border = border or (&#039;#&#039; .. normal.dark)&lt;br /&gt;
		cell = cell or (&#039;#&#039; .. normal.light)&lt;br /&gt;
		background = background or (&#039;#&#039; .. normal.base)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local buf = {}&lt;br /&gt;
	buf[#buf + 1] = &#039;&amp;lt;table align=&amp;quot;center&amp;quot; style=&amp;quot;width: 95%; border-spacing: 5px; padding: 5px; &#039; ..&lt;br /&gt;
		&#039;text-align: center; border: 4px solid &#039; .. border .. &#039;; border-radius: 15px; background-color: &#039; ..&lt;br /&gt;
		cell .. &#039;;&amp;quot;&amp;gt;&#039;&lt;br /&gt;
	buf[#buf + 1] = &#039;&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;&amp;lt;div style=&amp;quot;margin: auto auto; border-radius: 15px; font-weight: bold; &#039; ..&lt;br /&gt;
		&#039;width: 45%; padding: 3px; background-color: &#039; .. border .. &#039;; color: &#039; .. cell .. &#039;;&amp;quot;&amp;gt;&#039; ..&lt;br /&gt;
		mw.title.getCurrentTitle().text .. &#039; Gym Trainers&amp;lt;/div&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&#039;&lt;br /&gt;
&lt;br /&gt;
	buf[#buf + 1] = mw.ustring.gsub(mw.text.trim(pargs.Contents or &#039;&#039;), &#039;\n&#039;, &#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
	buf[#buf + 1] = &#039;&amp;lt;tr&amp;gt;&amp;lt;td style=&amp;quot;text-align: left; background-color: &#039; .. background ..&lt;br /&gt;
		&#039;; padding: 3px; border-radius: 15px; border: 1px solid &#039; .. border .. &#039;;&amp;quot;&amp;gt;&#039; ..&lt;br /&gt;
		&#039;&amp;lt;ul style=&amp;quot;margin-left: 15px;&amp;quot;&amp;gt;&#039; ..&lt;br /&gt;
		&#039;&amp;lt;li&amp;gt;All NPCs cool down after 7 days unless noted contrariwise.&amp;lt;/li&amp;gt;&#039; ..&lt;br /&gt;
		&#039;&amp;lt;li&amp;gt;Gym-NPC levels are not known; as such, no level data is displayed hereon.&amp;lt;/li&amp;gt;&#039; ..&lt;br /&gt;
		&#039;&amp;lt;/ul&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&#039;&lt;br /&gt;
	buf[#buf + 1] = &#039;&amp;lt;/table&amp;gt;&#039;&lt;br /&gt;
&lt;br /&gt;
	return table.concat(buf)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>149.88.27.84</name></author>
	</entry>
</feed>