Module:PokemonSpawnData: Difference between revisions
Jump to navigation
Jump to search
No edit summary |
No edit summary |
||
| Line 31: | Line 31: | ||
local val = frame:callParserFunction('#external_value', { checkField }) | local val = frame:callParserFunction('#external_value', { checkField }) | ||
return val ~= nil and val ~= '' | return val ~= nil and val ~= '' | ||
end | |||
-- Read a colour from a type-colour template e.g. Template:Grass_color_dark. | |||
-- Returns the hex string WITHOUT the leading '#'. | |||
local function typeColor(frame, colorType, variant) | |||
if not colorType or colorType == '' then return nil end | |||
local title = colorType .. '_color' .. (variant ~= '' and ('_' .. variant) or '') | |||
local ok, val = pcall(function() | |||
return frame:expandTemplate{ title = title, args = {} } | |||
end) | |||
if ok and val and val ~= '' then return val end | |||
return nil | |||
end | end | ||
| Line 37: | Line 49: | ||
-- --------------------------------------------------------------------------- | -- --------------------------------------------------------------------------- | ||
local function renderLandTable(frame) | local function renderLandTable(frame, color) | ||
local rows = frame:callParserFunction('#display_external_table', { | local rows = frame:callParserFunction('#display_external_table', { | ||
[1] = 'template=PokemonLandDataRow', | [1] = 'template=PokemonLandDataRow', | ||
| Line 45: | Line 57: | ||
}) | }) | ||
local | local border = '#' .. (typeColor(frame, color, 'dark') or '4a7c3f') | ||
local background = '#' .. (typeColor(frame, color, '') or 'c4e3a8') | |||
local cell = '#' .. (typeColor(frame, color, 'light') or '8db96e') | |||
local | local header = | ||
<tr><td colspan="8" style="text-align: left; border-radius: 1px 1px 25px 25px; border: 1px solid | '<table align="left" style="width: 85%; max-width: 90%; text-align: center; margin: auto;' | ||
<li><span style="color:#FF00BF; font-weight: bold;">Pink-colored</span> areas denote that this spawn is [[membership]]-exclusive</li> | .. ' border-radius: 15px; border: 3px solid ' .. border .. ';' | ||
<li>'''Emboldened''' levels indicate they are isolatable with the [[Repel trick]]</li></ul></p></td></tr> | .. ' background-color: ' .. background .. '; padding: 7px;">\n' | ||
</table><br clear="all"> | .. '<tr style="background-color: ' .. cell .. '; color: ' .. border .. ';">' | ||
.. '<th scope="col" style="border-top-left-radius: 25px; width: 15%; border: 1px solid ' .. border .. ';">Location</th>' | |||
.. '<th scope="col" style="width: 7%; border: 1px solid ' .. border .. ';">Levels</th>' | |||
.. '<th colspan="3" scope="col" style="width: 17%; border: 1px solid ' .. border .. ';">[[Pokétime|<span style="color: ' .. border .. ';">Times</span>]]</th>' | |||
.. '<th style="width: 20%; border: 1px solid ' .. border .. ';">Held Item</th>' | |||
.. '<th style="border-top-right-radius: 25px; width: 10%; border: 1px solid ' .. border .. ';">[[List of Pokémon by Rarity Tier|<span style="color: ' .. border .. ';">Rarity Tier</span>]]</th></tr>' | |||
local footer = | |||
'<tr><td colspan="8" style="text-align: left; border-radius: 1px 1px 25px 25px;' | |||
.. ' border: 1px solid ' .. border .. '; background-color: ' .. cell .. ';">' | |||
.. '<p style="margin-top: 8px; margin-left: 10px;"><ul>\n' | |||
.. '<li><span style="color:#FF00BF; font-weight: bold;">Pink-colored</span> areas denote that this spawn is [[membership]]-exclusive</li>\n' | |||
.. "<li>'''Emboldened''' levels indicate they are isolatable with the [[Repel trick]]</li>" | |||
.. '</ul></p></td></tr>\n</table><br clear="all">' | |||
return header .. rows .. footer | return header .. rows .. footer | ||
| Line 62: | Line 87: | ||
-- --------------------------------------------------------------------------- | -- --------------------------------------------------------------------------- | ||
local function renderSurfTable(frame, color) | |||
local function renderSurfTable(frame) | |||
local rows = frame:callParserFunction('#display_external_table', { | local rows = frame:callParserFunction('#display_external_table', { | ||
[1] = 'template=PokemonSurfingDataRow', | [1] = 'template=PokemonSurfingDataRow', | ||
| Line 74: | Line 95: | ||
}) | }) | ||
local header = | local dark = typeColor(frame, color, 'dark') or '5b8dd9' | ||
<table align="left" style="width:88%;max-width:100%;text-align:center;margin:auto;border-radius:15px;border:4px solid # | local bg = typeColor(frame, color, '') or 'a8c8f8' | ||
<tr><td colspan="8"><div style="margin:auto;width:53px;height:53px;border:3px solid # | local light = typeColor(frame, color, 'light') or 'd0e8ff' | ||
<tr style="background-color:# | |||
<th scope="col" style="border-radius:15px 1px 1px 1px;width:15%;border:1px solid # | local header = | ||
<th scope="col" style="width:7%;border:1px solid # | '<table align="left" style="width:88%;max-width:100%;text-align:center;margin:auto;border-radius:15px;border:4px solid #' .. dark .. ';background-color:#' .. bg .. ';padding:7px;">\n' | ||
<th colspan="3" scope="col" style="width:6%;border:1px solid # | .. '<tr><td colspan="8"><div style="margin:auto;width:53px;height:53px;border:3px solid #' .. dark .. ';border-radius:40px;background-color:#' .. light .. ';padding:5px;">[[File:PikachuSurf.png]]</div></td></tr>\n' | ||
<th style="width:10%;border:1px solid # | .. '<tr style="background-color:#' .. light .. ';">' | ||
<th style="width:7%;border:1px solid # | .. '<th scope="col" style="border-radius:15px 1px 1px 1px;width:15%;border:1px solid #' .. dark .. ';color:#' .. dark .. ';">Location</th>' | ||
<th style="border-radius:1px 15px 1px 1px;width:10%;border:1px solid # | .. '<th scope="col" style="width:7%;border:1px solid #' .. dark .. ';color:#' .. dark .. ';">Levels</th>' | ||
</tr> | .. '<th colspan="3" scope="col" style="width:6%;border:1px solid #' .. dark .. ';">[[Pokétime|<span style="color:#' .. dark .. ';">Times</span>]]</th>' | ||
.. '<th style="width:10%;border:1px solid #' .. dark .. ';color:#' .. dark .. ';">Held Item</th>' | |||
.. '<th style="width:7%;border:1px solid #' .. dark .. ';color:#' .. dark .. ';">Rod</th>' | |||
.. '<th style="border-radius:1px 15px 1px 1px;width:10%;border:1px solid #' .. dark .. ';">[[List of Pokémon by Rarity Tier|<span style="color:#' .. dark .. ';">Rarity Tier</span>]]</th></tr>' | |||
local footer = | local footer = | ||
<tr><td colspan="9" style="text-align:left;border-radius:1px 1px 25px 25px;border:1px solid # | '<tr><td colspan="9" style="text-align:left;border-radius:1px 1px 25px 25px;border:1px solid #' .. dark .. ';background-color:#' .. light .. ';">' | ||
<li>All rows with a fishing rod indicate that its corresponding Pokémon can also be [[Fishing|fished]] with the rod tier shown</li> | .. '<ul style="margin-top:8px;margin-left:12px;padding:5px;">\n' | ||
<li><span style="color:#FF00BF;font-weight:bold;">Pink-colored</span> areas denote that this area or inhabiting spawn is strictly [[membership]]-exclusive</li> | .. '<li>All rows with a fishing rod indicate that its corresponding Pokémon can also be [[Fishing|fished]] with the rod tier shown</li>\n' | ||
<li>'''Emboldened''' levels indicate they are isolatable with the [[Repel trick]]</li> | .. '<li><span style="color:#FF00BF;font-weight:bold;">Pink-colored</span> areas denote that this area or inhabiting spawn is strictly [[membership]]-exclusive</li>\n' | ||
</ul></td></tr> | .. "<li>'''Emboldened''' levels indicate they are isolatable with the [[Repel trick]]</li>" | ||
</table><br clear="all"> | .. '</ul></td></tr>\n</table><br clear="all">' | ||
return header .. rows .. footer | return header .. rows .. footer | ||
| Line 105: | Line 129: | ||
local pokemonName = args[1] or args.Name | local pokemonName = args[1] or args.Name | ||
or frame:callParserFunction('PAGENAME', {}) or '' | or frame:callParserFunction('PAGENAME', {}) or '' | ||
local color = args.Color or args.color or '' | |||
local out = {} | local out = {} | ||
| Line 121: | Line 146: | ||
}, 'land_area') | }, 'land_area') | ||
if hasLand then | if hasLand then | ||
table.insert(out, renderLandTable(frame)) | table.insert(out, renderLandTable(frame, color)) | ||
end | end | ||
| Line 135: | Line 160: | ||
}, 'surf_area') | }, 'surf_area') | ||
if hasSurf then | if hasSurf then | ||
table.insert(out, renderSurfTable(frame)) | table.insert(out, renderSurfTable(frame, color)) | ||
end | end | ||
Revision as of 09:35, 8 March 2026
Documentation for this module may be created at Module:PokemonSpawnData/doc
local p = {}
local function getArgs(frame)
local args = {}
local parent = frame:getParent()
if parent then
for k, v in pairs(parent.args) do
if v ~= '' then args[k] = v end
end
end
for k, v in pairs(frame.args) do
if v ~= '' then args[k] = v end
end
return args
end
-- Read a parser variable set by {{Trichrome}} (border, background, cell, etc.)
local function getVar(frame, name)
return frame:callParserFunction('#var', { name }) or ''
end
-- Load an External Data source and return true if at least one row was found.
-- Land and surf use separate external variable names (land_area vs surf_area)
-- so they never share a slot; each can be checked independently via #external_value.
local function loadFileData(frame, params, checkField)
local callParams = { [1] = 'source=' .. (params.source or 'data') }
for k, v in pairs(params) do
if k ~= 'source' then callParams[k] = v end
end
frame:callParserFunction('#get_file_data', callParams)
local val = frame:callParserFunction('#external_value', { checkField })
return val ~= nil and val ~= ''
end
-- Read a colour from a type-colour template e.g. Template:Grass_color_dark.
-- Returns the hex string WITHOUT the leading '#'.
local function typeColor(frame, colorType, variant)
if not colorType or colorType == '' then return nil end
local title = colorType .. '_color' .. (variant ~= '' and ('_' .. variant) or '')
local ok, val = pcall(function()
return frame:expandTemplate{ title = title, args = {} }
end)
if ok and val and val ~= '' then return val end
return nil
end
-- ---------------------------------------------------------------------------
-- Land spawn table
-- ---------------------------------------------------------------------------
local function renderLandTable(frame, color)
local rows = frame:callParserFunction('#display_external_table', {
[1] = 'template=PokemonLandDataRow',
data = 'area=land_area,member=member,number=number,name=name,'
.. 'morning=morning,day=day,night=night,'
.. 'item=item,rarity=rarity,minlvl=minlvl,maxlvl=maxlvl',
})
local border = '#' .. (typeColor(frame, color, 'dark') or '4a7c3f')
local background = '#' .. (typeColor(frame, color, '') or 'c4e3a8')
local cell = '#' .. (typeColor(frame, color, 'light') or '8db96e')
local header =
'<table align="left" style="width: 85%; max-width: 90%; text-align: center; margin: auto;'
.. ' border-radius: 15px; border: 3px solid ' .. border .. ';'
.. ' background-color: ' .. background .. '; padding: 7px;">\n'
.. '<tr style="background-color: ' .. cell .. '; color: ' .. border .. ';">'
.. '<th scope="col" style="border-top-left-radius: 25px; width: 15%; border: 1px solid ' .. border .. ';">Location</th>'
.. '<th scope="col" style="width: 7%; border: 1px solid ' .. border .. ';">Levels</th>'
.. '<th colspan="3" scope="col" style="width: 17%; border: 1px solid ' .. border .. ';">[[Pokétime|<span style="color: ' .. border .. ';">Times</span>]]</th>'
.. '<th style="width: 20%; border: 1px solid ' .. border .. ';">Held Item</th>'
.. '<th style="border-top-right-radius: 25px; width: 10%; border: 1px solid ' .. border .. ';">[[List of Pokémon by Rarity Tier|<span style="color: ' .. border .. ';">Rarity Tier</span>]]</th></tr>'
local footer =
'<tr><td colspan="8" style="text-align: left; border-radius: 1px 1px 25px 25px;'
.. ' border: 1px solid ' .. border .. '; background-color: ' .. cell .. ';">'
.. '<p style="margin-top: 8px; margin-left: 10px;"><ul>\n'
.. '<li><span style="color:#FF00BF; font-weight: bold;">Pink-colored</span> areas denote that this spawn is [[membership]]-exclusive</li>\n'
.. "<li>'''Emboldened''' levels indicate they are isolatable with the [[Repel trick]]</li>"
.. '</ul></p></td></tr>\n</table><br clear="all">'
return header .. rows .. footer
end
-- ---------------------------------------------------------------------------
-- Surf/Fishing spawn table
-- ---------------------------------------------------------------------------
local function renderSurfTable(frame, color)
local rows = frame:callParserFunction('#display_external_table', {
[1] = 'template=PokemonSurfingDataRow',
data = 'area=surf_area,number=number,name=name,time=time,'
.. 'minlvl=minlvl,maxlvl=maxlvl,item=item,rarity=rarity,'
.. 'rod=rod,fishable=fishable,member=member',
})
local dark = typeColor(frame, color, 'dark') or '5b8dd9'
local bg = typeColor(frame, color, '') or 'a8c8f8'
local light = typeColor(frame, color, 'light') or 'd0e8ff'
local header =
'<table align="left" style="width:88%;max-width:100%;text-align:center;margin:auto;border-radius:15px;border:4px solid #' .. dark .. ';background-color:#' .. bg .. ';padding:7px;">\n'
.. '<tr><td colspan="8"><div style="margin:auto;width:53px;height:53px;border:3px solid #' .. dark .. ';border-radius:40px;background-color:#' .. light .. ';padding:5px;">[[File:PikachuSurf.png]]</div></td></tr>\n'
.. '<tr style="background-color:#' .. light .. ';">'
.. '<th scope="col" style="border-radius:15px 1px 1px 1px;width:15%;border:1px solid #' .. dark .. ';color:#' .. dark .. ';">Location</th>'
.. '<th scope="col" style="width:7%;border:1px solid #' .. dark .. ';color:#' .. dark .. ';">Levels</th>'
.. '<th colspan="3" scope="col" style="width:6%;border:1px solid #' .. dark .. ';">[[Pokétime|<span style="color:#' .. dark .. ';">Times</span>]]</th>'
.. '<th style="width:10%;border:1px solid #' .. dark .. ';color:#' .. dark .. ';">Held Item</th>'
.. '<th style="width:7%;border:1px solid #' .. dark .. ';color:#' .. dark .. ';">Rod</th>'
.. '<th style="border-radius:1px 15px 1px 1px;width:10%;border:1px solid #' .. dark .. ';">[[List of Pokémon by Rarity Tier|<span style="color:#' .. dark .. ';">Rarity Tier</span>]]</th></tr>'
local footer =
'<tr><td colspan="9" style="text-align:left;border-radius:1px 1px 25px 25px;border:1px solid #' .. dark .. ';background-color:#' .. light .. ';">'
.. '<ul style="margin-top:8px;margin-left:12px;padding:5px;">\n'
.. '<li>All rows with a fishing rod indicate that its corresponding Pokémon can also be [[Fishing|fished]] with the rod tier shown</li>\n'
.. '<li><span style="color:#FF00BF;font-weight:bold;">Pink-colored</span> areas denote that this area or inhabiting spawn is strictly [[membership]]-exclusive</li>\n'
.. "<li>'''Emboldened''' levels indicate they are isolatable with the [[Repel trick]]</li>"
.. '</ul></td></tr>\n</table><br clear="all">'
return header .. rows .. footer
end
-- ---------------------------------------------------------------------------
-- main()
-- ---------------------------------------------------------------------------
function p.main(frame)
local args = getArgs(frame)
local pokemonName = args[1] or args.Name
or frame:callParserFunction('PAGENAME', {}) or ''
local color = args.Color or args.color or ''
local out = {}
local hasLand = false
local hasSurf = false
-- ── Land spawns ──────────────────────────────────────────────────────────
hasLand = loadFileData(frame, {
source = 'spawns',
['file name'] = 'land_spawns.csv',
format = 'CSV with header',
filters = 'Pokemon=' .. pokemonName,
data = 'land_area=Map,member=Member,number=DexID,name=Pokemon,'
.. 'morning=Morning,day=Day,night=Night,'
.. 'item=Item,rarity=Tier,minlvl=MinLvl,maxlvl=MaxLvl',
}, 'land_area')
if hasLand then
table.insert(out, renderLandTable(frame, color))
end
-- ── Surf / Fishing spawns ─────────────────────────────────────────────────
hasSurf = loadFileData(frame, {
source = 'spawns',
['file name'] = 'surf_spawns.json',
format = 'JSON',
filters = 'Pokemon=' .. pokemonName .. ',FishingOnly=0',
data = 'surf_area=Map,member=MemberOnly,number=MonsterID,name=Pokemon,'
.. 'time=Daytime,item=Item,rarity=Tier,'
.. 'minlvl=MinLvl,maxlvl=MaxLvl,rod=RequiredRod,fishable=Fishing',
}, 'surf_area')
if hasSurf then
table.insert(out, renderSurfTable(frame, color))
end
-- ── No spawns ─────────────────────────────────────────────────────────────
if not hasLand and not hasSurf then
table.insert(out,
"<div style='padding:8px;font-style:italic;'>"
.. pokemonName
.. " has no wild spawn locations.</div>"
)
end
return table.concat(out, '\n')
end
return p