automation
m sigh
 
(3 intermediate revisions by the same user not shown)
Line 2: Line 2:


local reskins = {
local reskins = {
{ name = 'Bramble Bow', theme = 'Halloween', obtained = 'Halloween Event', desc = 'Woven from cursed brambles that thirst for wandering souls.', types = { 'Bow' } },
-- Cherub
{ name = "Blade of False Eden", theme = 'Cherub', obtained = "Season 4 Crate", desc = "Forged for those permitted to witness judgement", types = { 'Sword' } },
{ name = "Echo of Eden", theme = 'Cherub', obtained = "Season 4 Crate", desc = "Every strike sounds like distant piano keys", types = { 'Katana' } },
{ name = "Witness Fang", theme = 'Cherub', obtained = "Season 4 Crate", desc = "Small enough to conceal. Sharp enough to remember", types = { 'Dagger' } },
{ name = "Choirbow", theme = 'Cherub', obtained = "Season 4 Crate", desc = "The string vibrates without being touched", types = { 'Bow' } },
{ name = "Halo Spire", theme = 'Cherub', obtained = "Season 4 Crate", desc = "Used during the earliest Neo-Eden rituals", types = { 'Staff' } },
{ name = "Cherub's Authority", theme = 'Cherub', obtained = "Season 4 Crate", desc = "Its glow resembles a watching eye", types = { 'Sceptre' } },
{ name = "Sanctum Hood", theme = 'Cherub', obtained = "Season 4 Crate", desc = "Its glow resembles a watching eye", types = { 'Magical Helmet' } },
{ name = "OXBlood Mask", theme = 'Cherub', obtained = "Season 4 Crate", desc = "The abyss stares back at you", types = { 'Heavy Helmet' } },
{ name = "Sanctified Crownlet", theme = 'Cherub', obtained = "Season 4 Crate", desc = "It remains perfectly clean despite age", types = { 'Light Helmet' } },
{ name = "Judgement Carapace", theme = 'Cherub', obtained = "Season 4 Crate", desc = "A defensive relic of the Third Choir", types = { 'Light Chestplate', 'Magical Chestplate', 'Heavy Chestplate' } },
{ name = "Garden Striders", theme = 'Cherub', obtained = "Season 4 Crate", desc = "Each stitch follows sacred geometry", types = { 'Light Leggings', 'Magical Leggings', 'Heavy Leggings' } },
{ name = "Eden Treads", theme = 'Cherub', obtained = "Season 4 Crate", desc = "The soles never fully touch the ground", types = { 'Light Boots', 'Magical Boots', 'Heavy Boots' } },
{ name = "Verdict Hands", theme = 'Cherub', obtained = "Season 4 Crate", desc = "Used during the earliest Neo-Eden rituals", types = { 'Shield', 'Poison', 'Skull', 'Kunai', 'Trap', 'Jewel' } },
{ name = "Neo Eden Binding", theme = 'Cherub', obtained = "Season 4 Crate", desc = "The bracelet vibrates with distant music, especially if it's OXBLOODXIX.", types = { 'Emblem', 'Cloak', 'Scripture', 'Star', 'Bomb', 'Orb' } },
 
-- Halloween
{ name = "Bramble Bow", theme = 'Halloween', obtained = "Halloween Event", desc = "Woven from cursed brambles that thirst for wandering souls.", types = { 'Bow' } },
{ name = "Dirk of Horrors", theme = 'Halloween', obtained = "Halloween Event", desc = "A jagged blade reflecting your deepest, darkest fears.", types = { 'Dagger' } },
{ name = "Sceptre of Soulbound Terror", theme = 'Halloween', obtained = "Halloween Event", desc = "A cursed sceptre bound to restless souls.", types = { 'Sceptre' } },
{ name = "Kunai of Cursed Souls", theme = 'Halloween', obtained = "Halloween Event", desc = "Throwing knives guided by the wails of the damned.", types = { 'Kunai' } },
{ name = "Eye of Confliction", theme = 'Halloween', obtained = "Halloween Event", desc = "A twitching, bloodshot eye that sees all timelines at once.", types = { 'Orb' } },
{ name = "Hollow's Harvest", theme = 'Halloween', obtained = "Halloween Event", desc = "An ancient tome bound in necrotic, autumn vines.", types = { 'Scripture' } },
{ name = "Solar Eclipse Staff", theme = 'Halloween', obtained = "Halloween Event", desc = "Channels the cosmic dread of a sun blotted from the sky.", types = { 'Staff' } },
 
-- Valentine's
{ name = "Dagger of Eternal Love", theme = 'Valentines', obtained = "Valentine's Event", desc = "Struck by this blade, one's heart is bound forever.", types = { 'Dagger' } },
{ name = "Lovebound Emblem", theme = 'Valentines', obtained = "Valentine's Event", desc = "A shimmering seal representing an unbreakable vow.", types = { 'Emblem' } },
{ name = "Cupid's Cap", theme = 'Valentines', obtained = "Valentine's Event", desc = "A feathery cap blessed by the deity of love.", types = { 'Light Helmet' } },
{ name = "Valentine's Chocolate Box", theme = 'Valentines', obtained = "Valentine's Event", desc = "Sweets to die for. Quite literally.", types = { 'Skull' } },
 
-- Christmas
{ name = "Evergreen Bow", theme = 'Christmas', obtained = "Christmas Event", desc = "Carved from the undying pines of the frozen north.", types = { 'Bow' } },
{ name = "Ice Encased Katana", theme = 'Christmas', obtained = "Christmas Event", desc = "A lethal edge preserved perfectly within glacial ice.", types = { 'Katana' } },
{ name = "Yuletide Wyrmskin", theme = 'Christmas', obtained = "Christmas Event", desc = "Warm, festive garments woven from the hide of a frost wyrm.", types = { 'Magical Chestplate' } },
{ name = "Giftwrap Venom", theme = 'Christmas', obtained = "Christmas Event", desc = "A volatile concoction wrapped neatly with a bow.", types = { 'Poison' } },
{ name = "Scripture of Snow", theme = 'Christmas', obtained = "Christmas Event", desc = "Contains incantations that summon the fiercest blizzards.", types = { 'Scripture' } },
{ name = "Star of Christmas", theme = 'Christmas', obtained = "Christmas Event", desc = "A brilliant ornament ripped straight from the top of the tree.", types = { 'Star' } },
{ name = "Sharpened Candy Cane", theme = 'Christmas', obtained = "Christmas Event", desc = "Sugary, minty, and ruthlessly sharp.", types = { 'Sword' } },
{ name = "Gingerbread Shield", theme = 'Christmas', obtained = "Christmas Event", desc = "Holiday spirit, same solid protection.", types = { 'Shield' } },
 
-- Custom
{ name = "Moongazer", theme = 'Custom', obtained = "Aphrow (100 TikToks Reward)", desc = "The signature headpiece of a social media wizard, bestowed for grand contributions to the realm.", types = { 'Heavy Helmet', 'Magical Helmet', 'Light Helmet' } },
{ name = "Miku's Wig", theme = 'Custom', obtained = "MikuPerino (2nd Place - Boss Rush)", desc = "The most desired synthetic headpiece for any true Hatsune Miku cosplayer.", types = { 'Heavy Helmet', 'Magical Helmet', 'Light Helmet' } },
{ name = "Crown of Ethereal Melons", theme = 'Custom', obtained = "xMelonGaming (1st Place - Boss Rush)", desc = "Forged from the auctioneer's produce section, this juicy crown acts as a refreshing snack in a pinch.", types = { 'Heavy Helmet', 'Magical Helmet', 'Light Helmet' } },
{ name = "Haori of the Water Hashira", theme = 'Custom', obtained = "yinlin_enjoyer (3rd Place - Boss Rush)", desc = "A haori woven in tribute to a beloved sister. It is a relic of remembrance not to be squandered.", types = { 'Heavy Chestplate', 'Magical Chestplate', 'Light Chestplate' } },
{ name = "Seraphic Bloom", theme = 'Custom', obtained = "qtRotem (First to reach Level 1000)", desc = "For a flower born of light will always rise from ash.", types = { 'Heavy Helmet', 'Magical Helmet', 'Light Helmet' } },
}
}


Line 50: Line 96:
local info = TYPES[t]
local info = TYPES[t]
if not info then return t end
if not info then return t end
return string.format('[[File:%s{{!}}16x16px{{!}}link=%s]] [[%s{{!}}%s]]', info.t1, info.link, info.link, t)
return string.format('[[File:%s|16x16px|link=%s]] [[%s|%s]]', info.t1, info.link, info.link, t)
end
end


Line 80: Line 126:
applies[#applies + 1] = typeLink(t)
applies[#applies + 1] = typeLink(t)
end
end
out[#out + 1] = table.concat({
out[#out + 1] = frame:expandTemplate{ title = 'ItemInfobox', args = {
'{{ItemInfobox',
title = r.name,
'| title = ' .. r.name .. ' Skin',
images = spriteFile(r),
'| images = ' .. spriteFile(r),
Desc = r.desc,
'| Desc = ' .. r.desc,
Ability = "'''Applies to:'''<br>" .. table.concat(applies, '<br>'),
"| Ability = '''Applies to:'''<br>" .. table.concat(applies, '<br>'),
Drop = r.obtained,
'| Drop = ' .. r.obtained,
} }
'}}',
}, '\n')
end
end
end
end

Latest revision as of 12:45, 16 June 2026

Module:Reskins holds the master list of cosmetic reskin items (Cherub, Halloween, Valentine's, Christmas, Custom) and renders them either as a gallery for a theme page or as an "Applicable Reskins" list inside an item's infobox.

Overview

A "reskin" is a cosmetic skin that can be applied to one or more item types (e.g. the Christmas "Sharpened Candy Cane" reskins any Sword). All of the reskins the wiki knows about are stored as a single Lua table inside this module — each entry records the skin's name, its theme, where it's obtained, a flavour desc, and the list of item types it applies to.

The module is used two ways:

  1. On theme pages (e.g. the Cherub reskins template) — it renders a full infobox gallery of every reskin in that theme.
  2. Inside {{ItemInfobox}} — for a given item type it lists the named reskins that can be applied to that type, in the infobox's "Applicable Reskins" section.

Because the data lives in this module, adding or editing a reskin means editing the reskins table here — there is no separate per-reskin page to maintain.

Functions / entry points

Function (#invoke) What it does Called by
p.forType Given an item type name (e.g. Sword), returns a
-separated list of clickable reskin entries (sprite icon + "<Name> Skin" linking to the Reskins page) for every reskin whose types include that type. Skips themes flagged NO_APPLY (currently Custom). Used to fill the Reskins section of an item infobox.
{{ItemInfobox}} (via )
p.theme Given a theme key (e.g. Cherub), renders a full {{ItemInfobox}} for every reskin in that theme — using the skin's sprite, description, "Applies to:" type list, and "obtained" text. Returns No reskins in this category yet. if the theme has none. Theme listing templates, e.g. {{Cherub/Reskins}}, {{Christmas/Reskins}}, {{Custom/Reskins}}

How it's used

Inside the item infobox (already wired into {{ItemInfobox}} — editors don't add this themselves). The infobox only requests reskins for untiered items (when none of T1–T8 are set):

|ReskinList={{#if:{{{T1|}}}...{{{T8|}}}||{{#invoke:Reskins|forType|{{{type|{{#var:itemtype}}}}}}}}}

On a theme page (e.g. the Cherub reskins listing template):

<div class="display-items">
{{#invoke:Reskins|theme|Cherub}}
</div>

To add a new reskin, edit the reskins table in the module and give it a name, theme, obtained, desc and types. To list a new theme on its own page, create a template that calls No reskins in this category yet..

Notes

  • Sprite file naming. Reskin sprite files are built automatically as <ThemePrefix>Reskin-<NameWithoutSpaces>.png. The theme prefixes are: Cherub → CH, Halloween → H, Valentines → V, Christmas → C, Custom → Custom. Example: the Cherub "Blade of False Eden" expects File:CHReskin-BladeOfFalseEden.png. The name is title-cased and stripped of spaces before the prefix is added, so the uploaded file must match that exact form.
  • Type → sprite/link table. The module's TYPES table maps each item type to a T1 icon (e.g. T1Sword.png) and a section link (e.g. Weapons#Swords, Abilities#Bombs, or just Armours). This is used by p.theme to render the clickable "Applies to:" list.
  • Custom theme is excluded from item infoboxes. NO_APPLY = { Custom = true } means custom/community reskins are shown only on their own theme page via p.theme, not in the per-item "Applicable Reskins" list.
  • The CLAUDE/project convention notes that reskins live on a separate page rather than on the base item's page; this module is the mechanism behind that separation.
  • Related: {{Infobox}}m (renders each infobox), {{Equipment}}m and {{Shinies}}m (sibling display modules), {{ItemInfobox}}.

local p = {}

local reskins = {
	-- Cherub
	{ name = "Blade of False Eden", theme = 'Cherub', obtained = "Season 4 Crate", desc = "Forged for those permitted to witness judgement", types = { 'Sword' } },
	{ name = "Echo of Eden", theme = 'Cherub', obtained = "Season 4 Crate", desc = "Every strike sounds like distant piano keys", types = { 'Katana' } },
	{ name = "Witness Fang", theme = 'Cherub', obtained = "Season 4 Crate", desc = "Small enough to conceal. Sharp enough to remember", types = { 'Dagger' } },
	{ name = "Choirbow", theme = 'Cherub', obtained = "Season 4 Crate", desc = "The string vibrates without being touched", types = { 'Bow' } },
	{ name = "Halo Spire", theme = 'Cherub', obtained = "Season 4 Crate", desc = "Used during the earliest Neo-Eden rituals", types = { 'Staff' } },
	{ name = "Cherub's Authority", theme = 'Cherub', obtained = "Season 4 Crate", desc = "Its glow resembles a watching eye", types = { 'Sceptre' } },
	{ name = "Sanctum Hood", theme = 'Cherub', obtained = "Season 4 Crate", desc = "Its glow resembles a watching eye", types = { 'Magical Helmet' } },
	{ name = "OXBlood Mask", theme = 'Cherub', obtained = "Season 4 Crate", desc = "The abyss stares back at you", types = { 'Heavy Helmet' } },
	{ name = "Sanctified Crownlet", theme = 'Cherub', obtained = "Season 4 Crate", desc = "It remains perfectly clean despite age", types = { 'Light Helmet' } },
	{ name = "Judgement Carapace", theme = 'Cherub', obtained = "Season 4 Crate", desc = "A defensive relic of the Third Choir", types = { 'Light Chestplate', 'Magical Chestplate', 'Heavy Chestplate' } },
	{ name = "Garden Striders", theme = 'Cherub', obtained = "Season 4 Crate", desc = "Each stitch follows sacred geometry", types = { 'Light Leggings', 'Magical Leggings', 'Heavy Leggings' } },
	{ name = "Eden Treads", theme = 'Cherub', obtained = "Season 4 Crate", desc = "The soles never fully touch the ground", types = { 'Light Boots', 'Magical Boots', 'Heavy Boots' } },
	{ name = "Verdict Hands", theme = 'Cherub', obtained = "Season 4 Crate", desc = "Used during the earliest Neo-Eden rituals", types = { 'Shield', 'Poison', 'Skull', 'Kunai', 'Trap', 'Jewel' } },
	{ name = "Neo Eden Binding", theme = 'Cherub', obtained = "Season 4 Crate", desc = "The bracelet vibrates with distant music, especially if it's OXBLOODXIX.", types = { 'Emblem', 'Cloak', 'Scripture', 'Star', 'Bomb', 'Orb' } },

	-- Halloween
	{ name = "Bramble Bow", theme = 'Halloween', obtained = "Halloween Event", desc = "Woven from cursed brambles that thirst for wandering souls.", types = { 'Bow' } },
	{ name = "Dirk of Horrors", theme = 'Halloween', obtained = "Halloween Event", desc = "A jagged blade reflecting your deepest, darkest fears.", types = { 'Dagger' } },
	{ name = "Sceptre of Soulbound Terror", theme = 'Halloween', obtained = "Halloween Event", desc = "A cursed sceptre bound to restless souls.", types = { 'Sceptre' } },
	{ name = "Kunai of Cursed Souls", theme = 'Halloween', obtained = "Halloween Event", desc = "Throwing knives guided by the wails of the damned.", types = { 'Kunai' } },
	{ name = "Eye of Confliction", theme = 'Halloween', obtained = "Halloween Event", desc = "A twitching, bloodshot eye that sees all timelines at once.", types = { 'Orb' } },
	{ name = "Hollow's Harvest", theme = 'Halloween', obtained = "Halloween Event", desc = "An ancient tome bound in necrotic, autumn vines.", types = { 'Scripture' } },
	{ name = "Solar Eclipse Staff", theme = 'Halloween', obtained = "Halloween Event", desc = "Channels the cosmic dread of a sun blotted from the sky.", types = { 'Staff' } },

	-- Valentine's
	{ name = "Dagger of Eternal Love", theme = 'Valentines', obtained = "Valentine's Event", desc = "Struck by this blade, one's heart is bound forever.", types = { 'Dagger' } },
	{ name = "Lovebound Emblem", theme = 'Valentines', obtained = "Valentine's Event", desc = "A shimmering seal representing an unbreakable vow.", types = { 'Emblem' } },
	{ name = "Cupid's Cap", theme = 'Valentines', obtained = "Valentine's Event", desc = "A feathery cap blessed by the deity of love.", types = { 'Light Helmet' } },
	{ name = "Valentine's Chocolate Box", theme = 'Valentines', obtained = "Valentine's Event", desc = "Sweets to die for. Quite literally.", types = { 'Skull' } },

	-- Christmas
	{ name = "Evergreen Bow", theme = 'Christmas', obtained = "Christmas Event", desc = "Carved from the undying pines of the frozen north.", types = { 'Bow' } },
	{ name = "Ice Encased Katana", theme = 'Christmas', obtained = "Christmas Event", desc = "A lethal edge preserved perfectly within glacial ice.", types = { 'Katana' } },
	{ name = "Yuletide Wyrmskin", theme = 'Christmas', obtained = "Christmas Event", desc = "Warm, festive garments woven from the hide of a frost wyrm.", types = { 'Magical Chestplate' } },
	{ name = "Giftwrap Venom", theme = 'Christmas', obtained = "Christmas Event", desc = "A volatile concoction wrapped neatly with a bow.", types = { 'Poison' } },
	{ name = "Scripture of Snow", theme = 'Christmas', obtained = "Christmas Event", desc = "Contains incantations that summon the fiercest blizzards.", types = { 'Scripture' } },
	{ name = "Star of Christmas", theme = 'Christmas', obtained = "Christmas Event", desc = "A brilliant ornament ripped straight from the top of the tree.", types = { 'Star' } },
	{ name = "Sharpened Candy Cane", theme = 'Christmas', obtained = "Christmas Event", desc = "Sugary, minty, and ruthlessly sharp.", types = { 'Sword' } },
	{ name = "Gingerbread Shield", theme = 'Christmas', obtained = "Christmas Event", desc = "Holiday spirit, same solid protection.", types = { 'Shield' } },

	-- Custom
	{ name = "Moongazer", theme = 'Custom', obtained = "Aphrow (100 TikToks Reward)", desc = "The signature headpiece of a social media wizard, bestowed for grand contributions to the realm.", types = { 'Heavy Helmet', 'Magical Helmet', 'Light Helmet' } },
	{ name = "Miku's Wig", theme = 'Custom', obtained = "MikuPerino (2nd Place - Boss Rush)", desc = "The most desired synthetic headpiece for any true Hatsune Miku cosplayer.", types = { 'Heavy Helmet', 'Magical Helmet', 'Light Helmet' } },
	{ name = "Crown of Ethereal Melons", theme = 'Custom', obtained = "xMelonGaming (1st Place - Boss Rush)", desc = "Forged from the auctioneer's produce section, this juicy crown acts as a refreshing snack in a pinch.", types = { 'Heavy Helmet', 'Magical Helmet', 'Light Helmet' } },
	{ name = "Haori of the Water Hashira", theme = 'Custom', obtained = "yinlin_enjoyer (3rd Place - Boss Rush)", desc = "A haori woven in tribute to a beloved sister. It is a relic of remembrance not to be squandered.", types = { 'Heavy Chestplate', 'Magical Chestplate', 'Light Chestplate' } },
	{ name = "Seraphic Bloom", theme = 'Custom', obtained = "qtRotem (First to reach Level 1000)", desc = "For a flower born of light will always rise from ash.", types = { 'Heavy Helmet', 'Magical Helmet', 'Light Helmet' } },
}

local THEME_PREFIX = { Cherub = 'CH', Halloween = 'H', Valentines = 'V', Christmas = 'C', Custom = 'Custom' }
local NO_APPLY = { Custom = true }

local TYPES = {
	['Sword']     = { t1 = 'T1Sword.png',     link = 'Weapons#Swords' },
	['Katana']    = { t1 = 'T1Katana.png',    link = 'Weapons#Katanas' },
	['Bow']       = { t1 = 'T1Bow.png',       link = 'Weapons#Bows' },
	['Dagger']    = { t1 = 'T1Dagger.png',    link = 'Weapons#Daggers' },
	['Staff']     = { t1 = 'T1Staff.png',     link = 'Weapons#Staves' },
	['Sceptre']   = { t1 = 'T1Sceptre.png',   link = 'Weapons#Sceptres' },
	['Bomb']      = { t1 = 'T1Bomb.png',      link = 'Abilities#Bombs' },
	['Jewel']     = { t1 = 'T1Jewel.png',     link = 'Abilities#Jewels' },
	['Poison']    = { t1 = 'T1Poison.png',    link = 'Abilities#Poisons' },
	['Emblem']    = { t1 = 'T1Emblem.png',    link = 'Abilities#Emblems' },
	['Scripture'] = { t1 = 'T1Scripture.png', link = 'Abilities#Scriptures' },
	['Orb']       = { t1 = 'T1Orb.png',       link = 'Abilities#Orbs' },
	['Star']      = { t1 = 'T1Star.png',      link = 'Abilities#Stars' },
	['Kunai']     = { t1 = 'T1Kunai.png',     link = 'Abilities#Kunais' },
	['Shield']    = { t1 = 'T1Shield.png',    link = 'Abilities#Shields' },
	['Cloak']     = { t1 = 'T1Cloak.png',     link = 'Abilities#Cloaks' },
	['Skull']     = { t1 = 'T1Skull.png',     link = 'Abilities#Skulls' },
	['Trap']      = { t1 = 'T1Trap.png',      link = 'Abilities#Traps' },
	['Heavy Helmet']       = { t1 = 'T1HeavyH.png', link = 'Armours' },
	['Heavy Chestplate']   = { t1 = 'T1HeavyC.png', link = 'Armours' },
	['Heavy Leggings']     = { t1 = 'T1HeavyL.png', link = 'Armours' },
	['Heavy Boots']        = { t1 = 'T1HeavyB.png', link = 'Armours' },
	['Light Helmet']       = { t1 = 'T1LightH.png', link = 'Armours' },
	['Light Chestplate']   = { t1 = 'T1LightC.png', link = 'Armours' },
	['Light Leggings']     = { t1 = 'T1LightL.png', link = 'Armours' },
	['Light Boots']        = { t1 = 'T1LightB.png', link = 'Armours' },
	['Magical Helmet']     = { t1 = 'T1MagicH.png', link = 'Armours' },
	['Magical Chestplate'] = { t1 = 'T1MagicC.png', link = 'Armours' },
	['Magical Leggings']   = { t1 = 'T1MagicL.png', link = 'Armours' },
	['Magical Boots']      = { t1 = 'T1MagicB.png', link = 'Armours' },
}

local function spriteFile(r)
	local s = r.name:gsub("(%a)([%w']*)", function(a, b) return a:upper() .. b end)
	s = s:gsub("%s+", "")
	return (THEME_PREFIX[r.theme] or '') .. 'Reskin-' .. s .. '.png'
end

local function typeLink(t)
	local info = TYPES[t]
	if not info then return t end
	return string.format('[[File:%s|16x16px|link=%s]] [[%s|%s]]', info.t1, info.link, info.link, t)
end

function p.forType(frame)
	local t = mw.text.trim(frame.args[1] or '')
	if t == '' then return '' end
	local out = {}
	for _, r in ipairs(reskins) do
		if not NO_APPLY[r.theme] then
			for _, rt in ipairs(r.types) do
				if rt == t then
					out[#out + 1] = string.format(
						'[[File:%s|16x16px|link=Reskins]] [[Reskins|%s]]', spriteFile(r), r.name .. ' Skin')
					break
				end
			end
		end
	end
	return table.concat(out, '<br>')
end

function p.theme(frame)
	local key = mw.text.trim(frame.args[1] or '')
	local out = {}
	for _, r in ipairs(reskins) do
		if r.theme == key then
			local applies = {}
			for _, t in ipairs(r.types) do
				applies[#applies + 1] = typeLink(t)
			end
			out[#out + 1] = frame:expandTemplate{ title = 'ItemInfobox', args = {
				title = r.name,
				images = spriteFile(r),
				Desc = r.desc,
				Ability = "'''Applies to:'''<br>" .. table.concat(applies, '<br>'),
				Drop = r.obtained,
			} }
		end
	end
	if #out == 0 then return "''No reskins in this category yet.''" end
	return table.concat(out, '\n')
end

return p