<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.pokemonrevolution.net/index.php?action=history&amp;feed=atom&amp;title=Module%3AFossil</id>
	<title>Module:Fossil - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.pokemonrevolution.net/index.php?action=history&amp;feed=atom&amp;title=Module%3AFossil"/>
	<link rel="alternate" type="text/html" href="https://wiki.pokemonrevolution.net/index.php?title=Module:Fossil&amp;action=history"/>
	<updated>2026-11-05T03:41:20Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.46.0</generator>
	<entry>
		<id>https://wiki.pokemonrevolution.net/index.php?title=Module:Fossil&amp;diff=41012&amp;oldid=prev</id>
		<title>Cae: created page</title>
		<link rel="alternate" type="text/html" href="https://wiki.pokemonrevolution.net/index.php?title=Module:Fossil&amp;diff=41012&amp;oldid=prev"/>
		<updated>2026-08-02T14:24:52Z</updated>

		<summary type="html">&lt;p&gt;created page&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;local p = {}&lt;br /&gt;
&lt;br /&gt;
local DATA_FORMAT = &amp;#039;CSV with header&amp;#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 == &amp;#039;&amp;#039; then return nil end&lt;br /&gt;
	return s&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Bulk fetch of the whole raw list, shared by every {{Fossil}}/{{FossilCombo}}&lt;br /&gt;
-- call on a page instead of each one running its own filtered&lt;br /&gt;
-- {{#get_file_data:}} query.&lt;br /&gt;
local pokemonRowsCache = nil&lt;br /&gt;
local function pokemonByName()&lt;br /&gt;
	if pokemonRowsCache then return pokemonRowsCache end&lt;br /&gt;
	local csvData = mw.ext.externalData.getExternalData{&lt;br /&gt;
		url = &amp;#039;https://wiki.pokemonrevolution.net/index.php?title=Special:GetData/PokemonRawList&amp;#039;,&lt;br /&gt;
		format = DATA_FORMAT,&lt;br /&gt;
		data = { number = &amp;#039;Pokedex Number&amp;#039;, name = &amp;#039;Name&amp;#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;
-- Every fossil entry uses the same Ground color theme, computed once and&lt;br /&gt;
-- reused instead of re-expanding the color templates on every call.&lt;br /&gt;
local groundColors = nil&lt;br /&gt;
local function colors(frame)&lt;br /&gt;
	if not groundColors then&lt;br /&gt;
		groundColors = {&lt;br /&gt;
			light = frame:expandTemplate{ title = &amp;#039;Ground color light&amp;#039; },&lt;br /&gt;
			base = frame:expandTemplate{ title = &amp;#039;Ground color&amp;#039; },&lt;br /&gt;
			dark = frame:expandTemplate{ title = &amp;#039;Ground color dark&amp;#039; },&lt;br /&gt;
		}&lt;br /&gt;
	end&lt;br /&gt;
	return groundColors&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function obtainabilityList(locationsText)&lt;br /&gt;
	local items = {}&lt;br /&gt;
	for _, part in ipairs(mw.text.split(locationsText or &amp;#039;&amp;#039;, &amp;#039;\\&amp;#039;, true)) do&lt;br /&gt;
		local trimmed = mw.text.trim(part)&lt;br /&gt;
		if trimmed ~= &amp;#039;&amp;#039; then&lt;br /&gt;
			items[#items + 1] = &amp;#039;&amp;lt;li style=&amp;quot;margin-left: 50px;&amp;quot;&amp;gt;&amp;#039; .. trimmed .. &amp;#039;&amp;lt;/li&amp;gt;&amp;#039;&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return table.concat(items)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function iconPill(fileName, label, dark)&lt;br /&gt;
	return &amp;#039;&amp;lt;table align=&amp;quot;center&amp;quot;&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td style=&amp;quot;background-color:#FFFFFF; border-radius: 25px; padding: 3px;&amp;quot;&amp;gt;&amp;#039; ..&lt;br /&gt;
		&amp;#039;[[File:&amp;#039; .. fileName .. &amp;#039;]]&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;#039; .. label .. &amp;#039;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&amp;#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function pokemonCell(frame, pokemonName, dark)&lt;br /&gt;
	local row = pokemonByName()[pokemonName]&lt;br /&gt;
	local number = row and row.number or &amp;#039;&amp;#039;&lt;br /&gt;
	local link = &amp;#039;[[&amp;#039; .. pokemonName .. &amp;#039;|&amp;lt;span style=&amp;quot;color:#&amp;#039; .. dark .. &amp;#039;;&amp;quot;&amp;gt;&amp;#039; .. pokemonName .. &amp;#039;&amp;lt;/span&amp;gt;]]&amp;#039;&lt;br /&gt;
	return &amp;#039;&amp;lt;table align=&amp;quot;center&amp;quot;&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td style=&amp;quot;background-color:#FFFFFF; border-radius: 25px; padding: 4px;&amp;quot;&amp;gt;&amp;#039; ..&lt;br /&gt;
		&amp;#039;[[File:&amp;#039; .. number .. &amp;#039;Icon.png]]&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;#039; .. link .. &amp;#039;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&amp;#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function wrap(frame, fromCellHtml, resultCellHtml, locationsText)&lt;br /&gt;
	local c = colors(frame)&lt;br /&gt;
	local buf = {}&lt;br /&gt;
	buf[#buf + 1] = &amp;#039;&amp;lt;table style=&amp;quot;width:50%; background-color:#&amp;#039; .. c.base .. &amp;#039;; border: 5px solid #&amp;#039; .. c.dark ..&lt;br /&gt;
		&amp;#039;; font-weight: bold; color: #&amp;#039; .. c.dark .. &amp;#039;; border-radius: 25px; padding: 4px; text-align: center;&amp;quot;&amp;gt;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
	buf[#buf + 1] = &amp;#039;&amp;lt;tr style=&amp;quot;background-color:#&amp;#039; .. c.light .. &amp;#039;;&amp;quot;&amp;gt;&amp;#039; ..&lt;br /&gt;
		&amp;#039;&amp;lt;td style=&amp;quot;border-radius: 25px 1px 1px 25px; padding: 3px; border: 3px solid #&amp;#039; .. c.dark ..&lt;br /&gt;
		&amp;#039;; width: 33%;&amp;quot;&amp;gt;&amp;#039; .. fromCellHtml .. &amp;#039;&amp;lt;/td&amp;gt;&amp;#039; ..&lt;br /&gt;
		&amp;#039;&amp;lt;td style=&amp;quot;border: 3px solid #&amp;#039; .. c.dark .. &amp;#039;; width: 33%;&amp;quot;&amp;gt;Reanimates into &amp;#039; ..&lt;br /&gt;
		&amp;#039;&amp;lt;span style=&amp;quot;font-weight: bold; font-size: 25px;&amp;quot;&amp;gt;&amp;amp;#8594;&amp;lt;/span&amp;gt;&amp;lt;/td&amp;gt;&amp;#039; ..&lt;br /&gt;
		&amp;#039;&amp;lt;td style=&amp;quot;border-radius: 1px 25px 25px 1px; border: 3px solid #&amp;#039; .. c.dark .. &amp;#039;; width: 33%;&amp;quot;&amp;gt;&amp;#039; ..&lt;br /&gt;
		resultCellHtml .. &amp;#039;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
	buf[#buf + 1] = &amp;#039;&amp;lt;tr&amp;gt;&amp;lt;td colspan=&amp;quot;3&amp;quot; style=&amp;quot;border-radius: 25px; border: 3px solid #&amp;#039; .. c.dark ..&lt;br /&gt;
		&amp;#039;; background-color:#&amp;#039; .. c.light .. &amp;#039;; padding: 3px;&amp;quot;&amp;gt;&amp;#039; ..&lt;br /&gt;
		&amp;#039;&amp;lt;table class=&amp;quot;collapsible collapsed&amp;quot; width=&amp;quot;100%&amp;quot;&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;Obtainability&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&amp;#039; ..&lt;br /&gt;
		&amp;#039;&amp;lt;tr&amp;gt;&amp;lt;td style=&amp;quot;padding: 10px;&amp;quot;&amp;gt;&amp;lt;ul style=&amp;quot;background-color:#FFFFFF; border-radius: 20px; border: 1px solid #&amp;#039; ..&lt;br /&gt;
		c.dark .. &amp;#039;; text-align: left; font-weight: normal; color:#000000;&amp;quot;&amp;gt;&amp;#039; ..&lt;br /&gt;
		obtainabilityList(locationsText) .. &amp;#039;&amp;lt;/ul&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
	buf[#buf + 1] = &amp;#039;&amp;lt;/table&amp;gt;&amp;#039;&lt;br /&gt;
	return table.concat(buf)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.single(frame)&lt;br /&gt;
	local parent = frame:getParent()&lt;br /&gt;
	local args = (parent and parent.args) or frame.args&lt;br /&gt;
&lt;br /&gt;
	local fossil = nonEmpty(args.Fossil)&lt;br /&gt;
	local pokemonName = nonEmpty(args.Pokemon)&lt;br /&gt;
	if not fossil or not pokemonName then&lt;br /&gt;
		return &amp;quot;&amp;lt;span style=&amp;#039;color:red&amp;#039;&amp;gt;Usage: {{Fossil|Fossil=FossilName|Pokemon=PokemonName|Locations=...}}&amp;lt;/span&amp;gt;&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local c = colors(frame)&lt;br /&gt;
	local fromCell = iconPill(fossil .. &amp;#039;.png&amp;#039;, fossil, c.dark)&lt;br /&gt;
	local resultCell = pokemonCell(frame, pokemonName, c.dark)&lt;br /&gt;
	return wrap(frame, fromCell, resultCell, args.Locations)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.combo(frame)&lt;br /&gt;
	local parent = frame:getParent()&lt;br /&gt;
	local args = (parent and parent.args) or frame.args&lt;br /&gt;
&lt;br /&gt;
	local fossil1 = nonEmpty(args.Fossil1)&lt;br /&gt;
	local fossil2 = nonEmpty(args.Fossil2)&lt;br /&gt;
	local pokemonName = nonEmpty(args.Pokemon)&lt;br /&gt;
	if not fossil1 or not fossil2 or not pokemonName then&lt;br /&gt;
		return &amp;quot;&amp;lt;span style=&amp;#039;color:red&amp;#039;&amp;gt;Usage: {{FossilCombo|Fossil1=FossilName|Fossil2=FossilName|&amp;quot; ..&lt;br /&gt;
			&amp;quot;Pokemon=PokemonName|Locations=...}}&amp;lt;/span&amp;gt;&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local c = colors(frame)&lt;br /&gt;
	local fromCell = &amp;#039;&amp;lt;table align=&amp;quot;center&amp;quot;&amp;gt;&amp;lt;tr&amp;gt;&amp;#039; ..&lt;br /&gt;
		&amp;#039;&amp;lt;td style=&amp;quot;background-color:#FFFFFF; border-radius: 25px; padding: 3px;&amp;quot;&amp;gt;[[File:&amp;#039; .. fossil1 ..&lt;br /&gt;
		&amp;#039;.png]]&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;#039; .. fossil1 .. &amp;#039;&amp;lt;/td&amp;gt;&amp;#039; ..&lt;br /&gt;
		&amp;#039;&amp;lt;td style=&amp;quot;font-weight: bold; font-size: 18px; padding: 0 6px;&amp;quot;&amp;gt;+&amp;lt;/td&amp;gt;&amp;#039; ..&lt;br /&gt;
		&amp;#039;&amp;lt;td style=&amp;quot;background-color:#FFFFFF; border-radius: 25px; padding: 3px;&amp;quot;&amp;gt;[[File:&amp;#039; .. fossil2 ..&lt;br /&gt;
		&amp;#039;.png]]&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;#039; .. fossil2 .. &amp;#039;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&amp;#039;&lt;br /&gt;
	local resultCell = pokemonCell(frame, pokemonName, c.dark)&lt;br /&gt;
	return wrap(frame, fromCell, resultCell, args.Locations)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Cae</name></author>
	</entry>
</feed>