Jump to content
Main menu
Main menu
move to sidebar
hide
Navigation
Main page
Recent changes
Random page
MediaWiki help
Creopedia
Search
Search
Appearance
Log in
Personal tools
Log in
View source for Module:Creo
Module
Discussion
English
Read
View source
View history
Tools
Tools
move to sidebar
hide
Actions
Read
View source
View history
General
What links here
Related changes
Special pages
Page information
Appearance
move to sidebar
hide
←
Module:Creo
require( 'strict' ) --- @class ComponentConfig --- @field moduleName string The name of the Lua module to render. --- @field useData? boolean If true, fetches Creo data and adds it to the context. --- @field dataSelectors? table<string, string|nil> The key to access specific data within the Creo data object. --- @field useArgs? boolean If true, adds the wikitext arguments to the context. --- --- @class ComponentContext --- @field data? table The data for the component. --- @field args? table The wikitext arguments for the component. local p = {} local gameData = require( 'Module:GameData' ) local creoData = {} local templateArgs = {} --- Wikitext entry point for the module --- --- @param frame mw.frame --- @return string function p.main( frame ) local getArgs = require( 'Module:Arguments' ).getArgs return p._main( getArgs( frame ) ) end --- Lua entry point for the module --- --- @param args table --- @return string function p._main( args ) args = args or {} local creoName = args.name or mw.title.getCurrentTitle().fullText --- TODO: Load the shared data of Creo here creoData = p.getData( creoName ) --- TODO: Set the shared data with the wikitext args if needed templateArgs = args local wikitext = { p.renderPrevnext(), p.renderInfobox(), p.renderCategories( p.getCategories() ) } if not creoData.evocreo2 then table.insert( wikitext, 1, p.renderUnavailable() ) end return table.concat( wikitext ) end --- Get the data for the Creo --- --- @param name string --- @param game string|nil --- @return table function p.getData( name, game ) return gameData.getCreo( name, game ) end --- Return the wikitext for the prevnext --- --- @return string function p.renderPrevnext() if not creoData.evocreo2 then return '' end return require( 'Module:Creo/Components/Prevnext' ).render( { data = { id = creoData.evocreo2.id } } ) end --- Return the wikitext for the infobox --- --- @return string function p.renderInfobox() local data = creoData.evocreo2 or p.getData( mw.title.getCurrentTitle().fullText ).evocreo2 if not data then return '' end return require( 'Module:Creo/Components/Infobox' ).render( { data = data, args = templateArgs } ) end --- Return a visible error box shown when EvoCreo 2 Creo data is unavailable --- (API failure, or the Creo is absent from the API). --- --- @return string function p.renderUnavailable() return tostring( mw.html.create( 'div' ) :addClass( 'error' ) :wikitext( 'Creo data is currently unavailable.' ) ) end --- Get the page categories for the Creo --- --- @return table function p.getCategories() local categories = { 'Creo' } if creoData.evocreo2 then table.insert( categories, 'Creo in EvoCreo 2' ) end if creoData.evocreo then table.insert( categories, 'Creo in EvoCreo' ) end return categories end --- Return the wikitext for the category --- --- @param categories table --- @return string function p.renderCategories( categories ) local wikitext = {} for _, category in ipairs( categories ) do table.insert( wikitext, string.format( '[[Category:%s]]', category ) ) end return table.concat( wikitext, '' ) end --- Get the thumbnail for a Creo --- --- The first frame of the front-facing battle idle. --- --- @param name string --- @return string function p.getThumbnail( name ) return string.format( '%s_bf_idle0000 - evocreo2.png', string.lower( name ) ) end --- Get the display image for a Creo --- --- The same front-facing battle idle as getThumbnail, but cropped to the Creo --- and re-centred on one canvas shared by every Creo. The game's own battle --- sprites have no canvas in common -- their content runs from 21x22 up to --- 118x114, each sitting inside its own asymmetric transparent padding -- so --- the infobox's width-only 240px spec rendered a box whose height swung about --- 80px from page to page and put the Creo somewhere different in it every --- time. One canvas makes 240px mean one box, and because nothing is scaled a --- big Creo still reads as bigger than a small one. --- --- Built by .claude/tools/creodisplay.py in the wiki's content repository. --- --- @param name string --- @return string function p.getDisplayImage( name ) return string.format( '%s_display - evocreo2.png', string.lower( name ) ) end --- Get the overworld thumbnail for a Creo --- --- The Creo as it is met in the field rather than as it is seen across a --- battle, taken from the down-facing walk frame and cropped to the Creo. The --- game's own sprite carries an 80x80 canvas that the Creo occupies a median of --- 22x27 of, which is far too much empty space for a listing, so these are --- separate files trimmed to the Creo's own bounding box. --- --- @param name string --- @return string function p.getOverworldThumbnail( name ) return string.format( '%s_icon - evocreo2.png', string.lower( name ) ) end --- Get the index data for a Creo --- --- @param name string --- @return table|nil function p.getIndexData( name ) local creoIndex = mw.loadJsonData( 'Module:Creo/Index.json' ) for _, creo in ipairs( creoIndex ) do if creo.name == name then return creo end end return nil end --- Get the index data for a Creo by ID --- --- @param id number --- @return table|nil function p.getIndexDataById( id ) local creoIndex = mw.loadJsonData( 'Module:Creo/Index.json' ) for _, creo in ipairs( creoIndex ) do if creo.id == id then return creo end end return nil end ------------------------------------------------------------------- --- Wikitext templates --- Public methods that are only accessed by the wikitext templates ------------------------------------------------------------------- --- Get the data for the component from the data selectors --- --- @param dataSelectors table<string, string|nil> --- @param creoName string --- @return table|nil local function getContextData( dataSelectors, creoName ) local game if dataSelectors then local keys = {} for k in pairs( dataSelectors ) do table.insert( keys, k ) end if #keys == 1 then game = keys[1] end end local creoData = p.getData( creoName, game ) if creoData == nil then return nil end if not dataSelectors then return creoData end if game then -- A single game was specified via dataSelectors local dataKey = dataSelectors[game] return dataKey and creoData[dataKey] or creoData end -- Multiple games in dataSelectors, or dataSelectors is an empty table local data = {} for gameName, dataKey in pairs( dataSelectors ) do local gameDataForGame = creoData[gameName] if gameDataForGame then data[gameName] = dataKey and gameDataForGame[dataKey] or gameDataForGame end end return data end --- Factory function to render a component. --- --- @param frame mw.frame --- @param config ComponentConfig --- @return string local function renderComponent( frame, config ) local context = {} local wikitextArgs = require( 'Module:Arguments' ).getArgs( frame ) if config.useData then local creoName = wikitextArgs[1] or mw.title.getCurrentTitle().fullText context.data = getContextData( config.dataSelectors, creoName ) if context.data == nil then return '' end end if config.useArgs then context.args = wikitextArgs end return require( config.moduleName ).render( context ) end --- Implements {{Creo/Stats}} --- --- @param frame mw.frame --- @return string function p.renderStats( frame ) return renderComponent( frame, { moduleName = 'Module:Creo/Components/Stats', useData = true, dataSelectors = { evocreo2 = 'creo', evocreo = 'a' } } ) end --- Implements {{Creo/LevelMoves}} --- --- @param frame mw.frame --- @return string function p.renderLevelMoves( frame ) return renderComponent( frame, { moduleName = 'Module:Creo/Components/LevelMoves', useData = true, dataSelectors = { evocreo2 = 'creoMoveMaps', evocreo = 'move' } } ) end --- Implements {{Creo/ItemMoves}} --- --- @param frame mw.frame --- @return string function p.renderItemMoves( frame ) return renderComponent( frame, { moduleName = 'Module:Creo/Components/ItemMoves', useData = true, dataSelectors = { evocreo2 = 'creoMoveMaps', evocreo = 'movecompatible' } } ) end --- Implements {{Creo/Traits}} --- --- @param frame mw.frame --- @return string function p.renderTraits( frame ) return renderComponent( frame, { moduleName = 'Module:Creo/Components/Traits', useData = true, useArgs = true, dataSelectors = { evocreo2 = 'creoTraitMaps', evocreo = 'trait' } } ) end --- Implements {{Creo/Abilities}} --- --- @param frame mw.frame --- @return string function p.renderAbilities( frame ) return renderComponent( frame, { moduleName = 'Module:Creo/Components/Abilities', useData = true, useArgs = true, dataSelectors = { evocreo2 = 'creoTypes', evocreo = 'ability' } } ) end --- Implements {{Creo/Evolution}} --- --- @param frame mw.frame --- @return string function p.renderEvolution( frame ) return renderComponent( frame, { moduleName = 'Module:Creo/Components/Evolution', useArgs = true } ) end --- Implements {{Creo/Sprites}} --- --- @param frame mw.frame --- @return string function p.renderSprites( frame ) return renderComponent( frame, { moduleName = 'Module:Creo/Components/Sprites', useArgs = true } ) end return p
Templates used on this page:
Template:Documentation
(
view source
)
Module:Creo/doc
(
view source
)
Return to
Module:Creo
.