Módulo:Equipo

De WikiDex
Ir a la navegaciónIr a la búsqueda

La documentación para este módulo puede ser creada en Módulo:Equipo/doc. También existe una plantilla con el mismo nombre; puedes obtener más información sobre la plantilla en Plantilla:Equipo

--[[
Copyright (c) 2021-2022 Ciencia Al Poder / wikidex.net

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO nTHE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
]]--
local p = {}    -- variable que tendrá todas las funciones accesibles externamente

local _pokemon_con_sprite_hembra = {
	['Abomasnow'] = true, ['Aipom'] = true, ['Alakazam'] = true, ['Ambipom'] = true, ['Basculegion'] = true, ['Beautifly'] = true, ['Bibarel'] = true, ['Bidoof'] = true, ['Blaziken'] = true, ['Buizel'] = true, ['Butterfree'] = true, ['Cacturne'] = true, ['Camerupt'] = true, ['Combee'] = true, ['Combusken'] = true, ['Croagunk'] = true, ['Dodrio'] = true, ['Doduo'] = true, ['Donphan'] = true, ['Dustox'] = true, ['Finneon'] = true, ['Floatzel'] = true, ['Frillish'] = true, ['Gabite'] = true, ['Garchomp'] = true, ['Gible'] = true, ['Girafarig'] = true, ['Gligar'] = true, ['Gloom'] = true, ['Golbat'] = true, ['Goldeen'] = true, ['Gulpin'] = true, ['Gyarados'] = true, ['Heracross'] = true, ['Hippopotas'] = true, ['Hippowdon'] = true, ['Houndoom'] = true, ['Hypno'] = true, ['Indeedee'] = true, ['Jellicent'] = true, ['Kadabra'] = true, ['Kricketot'] = true, ['Kricketune'] = true, ['Ledian'] = true, ['Ledyba'] = true, ['Ludicolo'] = true, ['Lumineon'] = true, ['Luxio'] = true, ['Luxray'] = true, ['Magikarp'] = true, ['Mamoswine'] = true, ['Medicham'] = true, ['Meditite'] = true, ['Meganium'] = true, ['Meowstic'] = true, ['Milotic'] = true, ['Murkrow'] = true, ['Numel'] = true, ['Nuzleaf'] = true, ['Oinkologne'] = true, ['Octillery'] = true, ['Pachirisu'] = true, ['Pikachu'] = true, ['Piloswine'] = true, ['Politoed'] = true, ['Pyroar'] = true, ['Quagsire'] = true, ['Raichu'] = true, ['Raticate'] = true, ['Rattata'] = true, ['Relicanth'] = true, ['Rhydon'] = true, ['Rhyhorn'] = true, ['Rhyperior'] = true, ['Roselia'] = true, ['Roserade'] = true, ['Scizor'] = true, ['Scyther'] = true, ['Seaking'] = true, ['Shiftry'] = true, ['Shinx'] = true, ['Sneasel'] = true, ['Snover'] = true, ['Staraptor'] = true, ['Staravia'] = true, ['Starly'] = true, ['Steelix'] = true, ['Sudowoodo'] = true, ['Swalot'] = true, ['Tangrowth'] = true, ['Torchic'] = true, ['Toxicroak'] = true, ['Unfezant'] = true, ['Ursaring'] = true, ['Venusaur'] = true, ['Vileplume'] = true, ['Weavile'] = true, ['Wobbuffet'] = true, ['Wooper'] = true, ['Xatu'] = true, ['Zubat'] = true
}

-- Sufijo del sprite del Pokémon en cada generación
local _sufijo_sprite_gen = {
	[9] = '_EP',
	[8] = '_EpEc',
	[7] = '_SL',
	[6] = '_XY',
	[5] = '_NB',
	[4] = '_HGSS',
	[3] = 'RFVH',
	[2] = '_oro',
	[1] = '_A'
}

-- Si el valor es nulo o vacío, retorna el siguiente
local function _coalesce( valor, def )
	if ( valor or '' ) == '' then
		return def or ''
	end
	return valor
end

local function _claseTipos( tipo1, tipo2 )
	tipo1 = mw.ustring.lower( tipo1 or '' )
	tipo2 = mw.ustring.lower( tipo2 or '' )
	-- Si tiene tipo 2 y el tipo 1 es normal, usar tipo 2
	if tipo2 ~= '' and tipo1 == 'normal' then
		return string.format( 'tipo-%s', tipo2 )
	end
	return string.format( 'tipo-%s', tipo1 )
end

local function _iconos( teratipo, dinamax, mega, oscuro )
	nodo = nil
	if _coalesce( teratipo, '' ) ~= '' then
		teratipo = mw.ustring.lower( teratipo )
		nodo = mw.html.create( 'span' )
			:attr( 'class', 'iconos' )
			:wikitext( string.format( '[[Archivo:Teratipo %s icono EP.png|30px|link=Teratipo|alt=Teratipo %s|Teratipo %s]]', teratipo, teratipo, teratipo ) )
	elseif dinamax == 'Sí' or mega == 'Sí' or oscuro == 'Sí' then
		nodo = mw.html.create( 'span' )
			:attr( 'class', 'iconos' )
		if dinamax == 'Sí' then
			nodo:wikitext( '[[Archivo:Botón Dinamax.svg|26px|link=Dinamax|alt=Dinamax|Dinamax]]' )
		elseif mega == 'Sí' then
			nodo:wikitext( '[[Archivo:Icono megaevolución.png|15px|link=Megaevolución|alt=Megaevolución|Megaevolución]]' )
		elseif oscuro == 'Sí' then
			nodo:wikitext( '[[Archivo:Símbolo oscuro GO.png|20px|link=Pokémon oscuro|alt=Pokémon oscuro|Pokémon oscuro]]' )
		end
	end
	return nodo
end

local function _sprite( nombre, generacion, edPok, sexo, imagen )
	local sufed, tamano, link, sufsexo, ext
	if _coalesce( nombre, '' ) == '' then
		return '[[Archivo:Desconocido_G4.png|link=]]'
	end
	tamano = ''
	if generacion >= 6 then
		tamano = '|96px'
	elseif edPok == 'St' or edPok == 'St2' then
		tamano = '|80px'
	end
	link = nombre
	if imagen ~= nil then
		return string.format( '[[Archivo:%s%s|%s|link=%s]]', imagen, tamano, nombre, link )
	end
	if nombre == 'Nidoran♂' then
		nombre = 'Nidoran macho'
	elseif nombre == 'Nidoran♀' then
		nombre = 'Nidoran hembra'
	end
	if ( edPok or '' ) ~= '' then
		if edPok == 'RFVH' then
			sufed = edPok
		else
			sufed = '_' .. edPok
		end
	else
		sufed = _sufijo_sprite_gen[generacion]
	end
	sufsexo = ''
	if sexo == '♀' then
		if sufed == '_icono_HD' then
			if mw.language.getContentLanguage():ucfirst( nombre ) == 'Oinkologne' then
				-- Los icono_HD no tienen diferencia de sexo, excepto casos muy contados
				sufsexo = '_hembra'
			end
		elseif generacion >= 4 and sexo == '♀' and _pokemon_con_sprite_hembra[ mw.language.getContentLanguage():ucfirst( nombre ) ] then
			sufsexo = '_hembra'
		end
	end
	ext = 'png'
	if generacion == 1 and (edPok == '' or edPok == 'A') then
		ext = 'gif'
	elseif edPok == 'cristal' then
		ext = 'gif'
	end
	return string.format( '[[Archivo:%s%s%s.%s%s|link=%s|%s]]', nombre, sufed, sufsexo, ext, tamano, link, link )
end

local function _tipo_pokemon( tipo )
	if _coalesce( tipo ) == '' then
		return ''
	end
	tipo = mw.ustring.lower( tipo )
	return string.format( '[[Archivo:Tipo %s.png|80px|link=Tipo %s]]', tipo, tipo )
end

-- Dato movimiento
local function _movimiento_pokemon( movimiento )
	local tag
	tag = mw.html.create( 'div' )
		:attr( 'class', 'mov' )
		:wikitext( _coalesce( movimiento, '-' ) )
	return tag
end

-- Se llamará para cada uno de los Pokémon
local function _elemento_pokemon( args, numPoke, generacion )
	local container, pokemon, imagen, sexo, nivel, tipo1, tipo2, objeto, habilidad, m1, m2, m3, m4, nombre, nodosexo, dinamax, mega, oscuro, nodoiconos, pos, edPok, teratipo
	edPok = args[ 'EdPok' ] or ''
	pokemon = args[ string.format( 'P%d', numPoke ) ]
	imagen = args[ string.format( 'ImagenP%d', numPoke ) ]
	sexo = _coalesce( args[ string.format( 'SP%d', numPoke ) ], args[ string.format( 'GP%d', numPoke ) ] )
	nivel = args[ string.format( 'NvP%d', numPoke ) ]
	tipo1 = args[ string.format( 'T1P%d', numPoke ) ]
	tipo2 = args[ string.format( 'T2P%d', numPoke ) ]
	dinamax = args[ string.format( 'DinamaxP%d', numPoke ) ]
	mega = args[ string.format( 'MegaevoluciónP%d', numPoke ) ]
	teratipo = args[ string.format( 'TeratipoP%d', numPoke ) ]
	oscuro = args[ string.format( 'OscuroP%d', numPoke ) ]
	objeto = args[ string.format( 'ObjP%d', numPoke ) ]
	habilidad = args[ string.format( 'HabP%d', numPoke ) ]
	m1 = args[ string.format( 'M1P%d', numPoke ) ]
	m2 = args[ string.format( 'M2P%d', numPoke ) ]
	m3 = args[ string.format( 'M3P%d', numPoke ) ]
	m4 = args[ string.format( 'M4P%d', numPoke ) ]

	-- El parámetro Pokémon puede tener un mote con {{!}}
	pos = mw.ustring.find( pokemon, '|', 1, false )
	if pos ~= nil then
		nombre = mw.ustring.sub( pokemon, pos - mw.ustring.len( pokemon ) )
		pokemon = mw.ustring.sub( pokemon, 1, pos - 1 )
	else
		nombre = pokemon
	end

	nodosexo = nil
	if generacion > 1 then
		if sexo == 'Macho' or sexo == 'macho' or sexo == '♂' then
			nodosexo = '<span class="sexo macho">[[Sexo|♂]]</span>'
		elseif sexo == 'Hembra' or sexo == 'hembra' or sexo == '♀' then
			nodosexo = '<span class="sexo hembra">[[Sexo|♀]]</span>'
		elseif sexo == 'Aleatorio' or sexo == 'aleatorio' or sexo == '♂/♀' then
			nodosexo = '<span class="sexo"><span class="macho">[[Sexo|♂]]</span>/<span class="hembra">[[Sexo|♀]]</span></span>'
		end
		if mw.ustring.find( pokemon, 'Nidoran', 1, true ) == 1 and nombre == pokemon then
			nombre = 'Nidoran'
		end
	end

	if generacion < 3 or edPok == 'LGPE' then
		habilidad = "''Ninguna''"
	end
	if generacion == 1 then
		objeto = "''Ninguno''"
	end

	nodoiconos = _iconos( teratipo, dinamax, mega, oscuro )

	container = mw.html.create( 'div' )
		:attr( 'class', string.format( 'e-pokemon %s', _claseTipos( tipo1, tipo2 ) ) )
		:tag( 'div' )
		:attr( 'class', 'pri float-app' )
		:tag( 'div' )
		:attr( 'class', 'pri-nombre' )
		:tag( 'span' )
		:attr( 'class', 'nombre' )
		:wikitext( string.format( '[[%s|%s]]', pokemon, nombre ) )
		:done()
		:node( nodosexo )
		:tag( 'span' )
		:attr( 'class', 'nivel' )
		:wikitext( string.format( '[[Nivel|Nv.]] %s', _coalesce( nivel, '?' ) ) )
		:done()
		:node( nodoiconos )
		:done()
		:tag( 'div' )
		:attr( 'class', 'pri-tipo' )
		:tag( 'div' )
		:attr( 'class', 'e-d-tipo' )
		:attr( 'class', 'val' )
		:wikitext(
			_tipo_pokemon( tipo1 ),
			_tipo_pokemon( tipo2 ) )
		:done()
		:done()
		:done()
		:tag( 'div' )
		:attr( 'class', 'col e-d-col1 float-app' )
		:tag( 'div' )
		:attr( 'class', 'e-d-sprite' )
		:wikitext( _sprite( pokemon, generacion, edPok, sexo, imagen ) )
		:done()
		:done()
		:tag( 'div' )
		:attr( 'class', 'col e-d-col2 float-app' )
		:tag( 'div' )
		:attr( 'class', 'e-d-movs fcont' )
		:tag( 'div' )
		:attr( 'class', 'lbl' )
		:wikitext( "[[Movimiento|Movimientos]]" )
		:done()
		:tag( 'div' )
		:attr( 'class', 'val' )
		:node( _movimiento_pokemon( m1 ) )
		:node( _movimiento_pokemon( m2 ) )
		:node( _movimiento_pokemon( m3 ) )
		:node( _movimiento_pokemon( m4 ) )
		:done()
		:done()
		:done()
		:tag( 'div' )
		:attr( 'class', 'col e-d-col3 float-app' )
		:tag( 'div' )
		:attr( 'class', 'e-d-hab fcont' )
		:tag( 'div' )
		:attr( 'class', 'lbl' )
		:wikitext( "[[Habilidad]]" )
		:done()
		:tag( 'div' )
		:attr( 'class', 'val' )
		:wikitext( _coalesce( habilidad, "''Desconocida''" ) )
		:done()
		:done()
		:tag( 'div' )
		:attr( 'class', 'e-d-obj fcont' )
		:tag( 'div' )
		:attr( 'class', 'lbl' )
		:wikitext( "[[Objeto]]" )
		:done()
		:tag( 'div' )
		:attr( 'class', 'val' )
		:wikitext( _coalesce( objeto, "''Ninguno''" ) )
		:done()
		:done()
		:done()

	return container
end

-- Función principal
function p.main( frame )
	local parts, containerDiv, numPoke, generacion
	if frame.args['local'] == '1' then
		sourceargs = frame.args
		--function frame:extensionTag()
		--	return ''
		--end
	else
		sourceargs = frame:getParent().args
	end

	parts = {}
	table.insert( parts, frame:extensionTag( 'templatestyles', '', { src = 'Estilos de plantilla:Equipo/estilos.css' } ) )
	
	containerDiv = mw.html.create( 'div' )

	generacion = _coalesce( tonumber( sourceargs['generación'], 10 ), 8 )
	numPoke = 1
	while sourceargs[string.format('P%d', numPoke)] ~= nil
	do
		containerDiv:node( _elemento_pokemon( sourceargs, numPoke, generacion ) )
		numPoke = numPoke + 1
	end
	containerDiv:attr( 'class', string.format( 'equipo2 np-%s', numPoke - 1 ) )
	containerDiv:allDone()
	
	table.insert( parts, tostring( containerDiv ) )

	return table.concat( parts, '' )
end

return p     -- Todos los módulos terminan retornando la variable que contiene las funciones
-- Prueba: =p.main( { ['args'] = { ['local'] = '1' } } )