Aller au contenu

Légendes Pokémon : Z-A est là !

Le contenu du jeu est déjà disponible sur le wiki, mais beaucoup de choses restent encore à ajouter. Vous pouvez rejoindre le Discord pour en discuter.
Attention aux spoils, et bonne navigation sur Poképédia !

Module:Tableau Objet

De Poképédia

Ce module propose différentes fonctions qui dressent des tableaux relatifs à des objets. Pour plus d'informations sur chacune, se référer aux sections respectives.

Fonction « donnees »

[modifier]

Cette fonction sert à générer un tableau qui liste les poches de rangement ainsi que les prix d'achat et de vente d'un objet dans différents jeux.

Elle s'insère dans la section Fonctionnement de l'objet en question, dans une sous-section nommée « Rangement et prix ».

Paramètres

[modifier]
  • (paramètre non nommé) : Le paramètre non nommé représente le contenu du tableau. Chaque ligne du tableau résultat est représentée par une ligne dans ce paramètre.
Une ligne est scindée par des slashs entourés d'espaces  / , et représente un jeu. Les cinq arguments sont donnés dans l'ordre :
  • L'abréviation du jeu en question, selon le Modèle:Jeu.
  • La poche de rangement dans le jeu en question. Une image est automatiquement ajoutée.
  • Le ou les prix d'achat dans le jeu en question. Indiquer P, Poké, Méga-Fragment ou Méga-Fragments formate automatiquement le rendu pour avoir la bonne unité monétaire. Plusieurs prix peuvent être indiqués, séparés à l'aide d'une virgule. Des précisions sur le prix affiché peuvent être indiquées, par exemple si le prix ne concerne qu'un PNJ particulier dans le jeu. On pourra ainsi indiquer 1000 P (collectionneur), 64 PCo pour un rendu sur deux lignes, avec 1 000 Poké Dollar (collectionneur) sur la première, et 64 PCo sur la deuxième.
  • Le ou les prix de vente dans le jeu en question. Le formatage est le même que pour les prix d'achat, avec les mêmes possibilités d'affichage.
  • D'éventuelles notes, par exemple pour indiquer l'emplacement des PNJ sus-nommés. Si aucune note n'est renseignée, la colonne n'apparaît pas.

Si, dans les trois dernières colonnes, plusieurs lignes sont identiques, elles sont fusionnées.

Exemples d'utilisation

[modifier]

Exemple général

[modifier]
{{#invoke:Tableau Objet|donnees|
XY / Objets
ROSA / Objets
SL / Objets / 64 PCo
USUL / Objets / 64 PCo
LPZA / Méga-Gemmes
}}

donne :

JeuRangementPrix
AchatVente
XY Objets
ROSA Objets
SL
Objets
64 PCo
USUL
Objets
LPZA Méga-Gemmes

Avec des notes

[modifier]
{{#invoke:Tableau Objet|donnees|
DP / Objets / - / 5000 P
NB / Objets / 50000 P / 5000 P, 10000 P (collectionneur) / Dans ''[[Pokémon Noir]]'' uniquement, un collectionneur est situé à [[Flocombe]].
LPA / Trésors / - / 10000 P
}}

donne :

JeuRangementPrixNotes
AchatVente
DP Objets5 000 Poké Dollar
NB Objets50 000 Poké Dollar5 000 Poké Dollar
10 000 Poké Dollar (collectionneur)
Dans Pokémon Noir uniquement, un collectionneur est situé à Flocombe.
LPZA Trésors10 000 Poké Dollar

Fonction « antre »

[modifier]

Cette fonction sert à générer un tableau qui liste les différents objets obtenus au cours d'un raid Dynamax. Elle s'insère sur les pages d'antres, dans une section « Récompenses » qui suit celle contenant le module Tableau Pokémon.

Paramètres

[modifier]
  • (paramètre non nommé) : Le paramètre non nommé représente le contenu du tableau. Chaque ligne du tableau résultat est représentée par une ligne dans ce paramètre. Il existe deux types de ligne.
Ligne ne présentant pas de slash /
Une ligne ne présentant pas de slash sera considérée comme étant un changement de section. Pour capturer tous les cas possibles, on distingue toutefois quatre types de changement de section :
  • Normal : on indique simplement le texte qui prendra toute la ligne. Ceci gère la plupart des cas, autant pour la section « Récompenses bonus » que pour indiquer « Exclusifs à tel Pokémon », ou « Tous » pour indiquer les objets communs à tous les Pokémon présents dans l'antre.
  • Exclusifs à Épée/Bouclier : on indique simplement « Épée » ou « Bouclier ». La ligne aura un style spécial qui indique cette particularité. On précède en général la section « Épée » d'une section supplémentaire « Exclusifs à une version ». Exemple : Antre 83.
  • Spécifiques à certains Pokémon selon la version : on indique les Pokémon concernés dans Épée en premier, selon la nomenclature du Module:Ressources/infosPokemon, et après un double slash //, on indique les Pokémon concernés dans Bouclier. Exemple : Antre 40.
  • Sur-sections : dans L'île solitaire de l'Armure et Les terres enneigées de la Couronne, les récompenses bonus peuvent également changer selon le Pokémon. En entourant la section de balises <big></big>, celle-ci est plus grande et prend une autre couleur, afin d'indiquer qu'elle englobe les autres. Exemple : Antre 99.
Ligne présentant un slash /
Une ligne présentant un slash sera considérée comme étant un objet. Elle se présente sous la forme NomObjet / nom-attribut1(attribut1) nom-attribut2(attribut2) ....
  • La partie de gauche représente le nom de l'objet.
  • Dans le cas d'une homonymie, on indique le nom de la page, puis {{!}}, puis le nom de l'objet affiché. Par exemple, Perle (objet){{!}}Perle.
  • Dans le cas d'un DT, on indique d'abord le numéro du DT, puis une virgule ,, puis le nom de la capacité qu'il contient. Si celle-ci est une homonymie, on utilisera la même technique qu'au-dessus. Par exemple, on a DT13, Puissance (capacité){{!}}Puissance.
  • La partie de droite représente les attributs de l'objet dans le contexte de récompense de fin de raid. Plusieurs fonctionnalités sont disponibles, et sauf indication contraire, s'indiquent avec des parenthèses (), sous la forme nom-attribut(attribut). Les différents attributs possibles sont les suivants :
  • image : si l'image affichée ne correspond pas à celle de l'objet renseigné, notamment pour les DT, on indique le bon nom d'objet à afficher. Par exemple, image(DT Normal).
  • taux, 1, 2, 3, 4, 5 : on utilise taux lorsque la difficulté du raid n'influe pas sur le taux d'obtention de l'objet, et les autres paramètres sinon. Ils sont à renseigner avec le pourcentage de chances d'obtention de l'objet à l'issue du raid, ou bien au nombre d'objets obtenus pour les récompenses bonus.
  • Pour les pourcentages, il n'est pas nécessaire d'ajouter une espace avant le symbole « % ».
  • Dans le cas où certains taux par difficulté ne sont pas renseignés, le module complète en ajoutant des « — ».
  • On peut renseigner une différence entre versions avec, par exemple, 2(50%, Ep, 80%, Bo).

Exemple d'utilisation

[modifier]
{{#invoke:Tableau Objet|antre|
Tous
Capsule d'Argent / 3(1%) 4(2%) 5(3%)
Super Bonbon / taux(25%)
Pépite / taux(50%, Ep, 80%, Bo)
Perle (objet){{!}}Perle / taux(80%, Ep, 50%, Bo)

Exclusifs à une version
Épée
Baie Alga / taux(100%)
DT19, Triplattaque / image(DT Normal) taux(100%)
DT26, Ténacité / image(DT Normal) 3(100%) 4(100%) 5(100%)
DT29, Relais / image(DT Normal) 4(100%) 5(100%)

Bouclier
Baie Papaya / taux(100%)
DT87, Tunnelier / image(DT Sol) 1(100%) 2(100%) 4(100%) 5(100%)
DT94, Cavalerie Lourde / image(DT Sol) 2(100%) 3(100%) 5(100%)
DT76, Piège de Roc / image(DT Roche) 3(100%) 4(100%) 5(100%)
DT10, Séisme / image(DT Sol) 4(100%) 5(100%)

Récompenses bonus
Bonbon Exp. XS / 1(5)
Bonbon Exp. S / 1(1) 2(5)
Bonbon Exp. M / 2(1) 3(5) 4(2)
Bonbon Exp. L / 3(1) 4(3) 5(2)
Bonbon Exp. XL / 5(1)
Bonbon Dynamax / 1(1) 2(1) 3(1) 4(1) 5(2)
}}

donne :

ObjetTaux
★★★★★★★★★★★★★★
Tous
Capsule d'Argent1 %2 %3 %
Super Bonbon25 %
Pépite50 %E
80 %B
Perle Perle80 %E
50 %B
Exclusifs à une version
Pokémon Épée
Baie Alga100 %
DT19 (Triplattaque)100 %
DT26 (Ténacité)100 %100 %100 %
DT29 (Relais)100 %100 %
Pokémon Bouclier
Baie Papaya100 %
DT87 (Tunnelier)100 %100 %100 %100 %
DT94 (Cavalerie Lourde)100 %100 %100 %
DT76 (Piège de Roc)100 %100 %100 %
DT10 (Séisme)100 %100 %
Récompenses bonus
Bonbon Exp. XS5
Bonbon Exp. S15
Bonbon Exp. M152
Bonbon Exp. L132
Bonbon Exp. XL1
Bonbon Dynamax11112

Fonction « teracristal »

[modifier]

Cette fonction sert à générer un tableau qui liste les différents objets obtenus au cours d'un raid Téracristal. Elle s'insère sur les pages d'antres, dans une section « Récompenses » qui suit celle contenant le module Tableau Pokémon.

Paramètres

[modifier]
  • (paramètre non nommé) : Le paramètre non nommé représente le contenu du tableau. Chaque objet ou section du tableau résultat est représenté par une ligne dans ce paramètre. Il existe deux types de ligne.
Ligne ne présentant pas de slash /
Une ligne ne présentant pas de slash sera considérée comme étant un changement de section. Pour qu'elle soit reliée correctement au module Tableau Pokémon, elle doit avoir la forme Pokémon_Difficulté, où :
  • Pokémon est le nom du Pokémon comme défini dans le tableau Pokémon sans aucun attribut (pour Tauros de Paldea, défini en Tauros forme(Paldea), on indiquera simplement Tauros) :
  • Difficulté est un nombre qui représente la difficulté du raid en question, en nombre d'étoiles ;
  • optionnellement, si plusieurs instances d'un même Pokémon à une même difficulté existent, on peut rajouter _2, _3, etc. à la fin de ce code de changement de section.
Ligne présentant un slash /
Une ligne présentant un slash sera considérée comme étant un objet. Elle se présente sous la forme NomObjet / Nombre / Précision.
  • La partie de gauche représente le nom de l'objet.
  • Dans le cas d'une homonymie, on indique le nom de la page, puis {{!}}, puis le nom de l'objet affiché. Par exemple, Perle (objet){{!}}Perle.
  • Dans le cas d'une CT, on indique d'abord le nom de l'image à afficher, puis le numéro de la CT, puis le nom de la capacité qu'elle contient, le tout séparé par des virgules ,. Si celle-ci est une homonymie, on utilisera la même technique qu'au-dessus. Par exemple, on a CT Normal, CT202, Balance (capacité){{!}}Balance..
  • La partie au centre représente le nombre d'objets obtenus à la fois. Il n'est pas nécessaire de préciser autre chose que ce nombre.
  • La troisième partie, facultative, permet d'ajouter une précision entre parenthèses. On distingue quatre cas :
  • dans le cas où la récompense est unique, c'est-à-dire qu'elle ne peut pas être obtenue en triomphant du raid une nouvelle fois, renseigner « unique » ;
  • dans le cas où la récompense est réservée à l'hôte du raid, renseigner « hôte » ;
  • dans le cas où la récompense est réservée aux personnes invitées au raid, renseigner « invités » ;
  • dans le cas où la récompense n'est obtenue qu'avec une certaine probabilité, renseigner un pourcentage, par exemple « 22,73% ».

Exemple d'utilisation

[modifier]
{{#invoke:Tableau Objet|teracristal|

Axoloto_1
Bonbon Exp. XS / 1
Bonbon Exp. S / 2
Mucus d'Axoloto / 1
Jolie Plume / 1
Bonbon Exp. XS / 1 / 20%
Bonbon Exp. S / 1 / 8,5%
Plume Santé / 1 / hôte
Plume Force / 1 / invités
Plume Sprint / 5 / 10%
Patch Talent / 1 / unique

Axoloto_1_2
Bonbon Exp. XS / 1
Bonbon Exp. S / 2
Mucus d'Axoloto / 1
Jolie Plume / 1
Bonbon Exp. XS / 1 / 20%
Bonbon Exp. S / 1 / 8,5%
Plume Armure / 1 / hôte
Plume Esprit / 1 / invités
Plume Sprint / 5 / 10%
Pilule Talent / 1 / unique
}}

donne :

ObjetNombreObjetNombre
Récompenses d'Axoloto 1★ (voir)
Bonbon Exp. XS×1 Bonbon Exp. S×2
Mucus d'Axoloto×1 Jolie Plume×1
Bonbon Exp. XS×1
(20 %)
Bonbon Exp. S×1
(8,5 %)
Plume Santé×1
(hôte)
Plume Force×1
(invités)
Plume Sprint×5
(10 %)
Patch Talent×1
(unique)
Récompenses d'Axoloto 1★ (voir)
Bonbon Exp. XS×1 Bonbon Exp. S×2
Mucus d'Axoloto×1 Jolie Plume×1
Bonbon Exp. XS×1
(20 %)
Bonbon Exp. S×1
(8,5 %)
Plume Armure×1
(hôte)
Plume Esprit×1
(invités)
Plume Sprint×5
(10 %)
Pilule Talent×1
(unique)

local p = {}
local ressources = {
	["infosPokemon"] = require("Module:Ressources/infosPokemon")
}

-- Extrait le contenu d'une fonction de la forme "fun_name(argument)" dans une expression.
function extract_argument(fun_name, expression, default)
	-- le tiret est un caractère utilisé pour les noms de fonctions, mais aussi spécial pour les expressions rationnelles
	fun_name_rat = string.gsub(fun_name, "%-", "%%-")
	if (string.match(expression, fun_name_rat .. "%([^)]*%)"))
	then return string.sub(string.match(expression, fun_name_rat .. "%([^)]*%)"), string.len(fun_name) + 2, -2)
	else return default
	end
end

function separate_thousands(amount)
	local formatted = amount
	while true do
		formatted, k = string.gsub(formatted, "^(-?%d+)(%d%d%d)", '%1 %2')
		if (k==0) then
			break
		end
	end
	return formatted
end


function p.donnees(frame)
	local donnees = frame.args[1]
	local lignes = {}
	if donnees ~= nil then lignes = mw.text.split(donnees, "\n") end
	
	images_rangement = {
		["RB"] = "[[Fichier:Vide.png|32px]]",
		["J"] = "[[Fichier:Vide.png|32px]]",
		["OA"] = "[[Fichier:Sprite XXX OA.png|32px]]",
		["C"] = "[[Fichier:Sprite XXX OA.png|32px]]",
		["RS"] = "[[Fichier:Sprite Sac (XXX) ♂ RS.png|32px]]",
		["RFVF"] = "[[Fichier:Sprite Sac (XXX) ♂ RFVF.png|32px]]",
		["E"] = "[[Fichier:Sprite Sac (XXX) ♂ E.png|32px]]",
		["DP"] = "[[Fichier:Miniature Poche XXX (sélectionnée) DP.png|32px]]",
		["Pt"] = "[[Fichier:Miniature Poche XXX (sélectionnée) Pt.png|32px]]",
		["HGSS"] = "[[Fichier:Miniature Poche XXX (sélectionnée) HGSS.png]]",
		["NB"] = "[[Fichier:Sprite Sac (XXX, transition) ♂ NB.png|32px]]",
		["N2B2"] = "[[Fichier:Sprite Sac (XXX, transition) ♂ N2B2.png|32px]]",
		["XY"] = "[[Fichier:Miniature Poche XXX (sélectionnée) XY.png]]",
		["ROSA"] = "[[Fichier:Miniature Poche XXX (sélectionnée) ROSA.png]]",
		["SL"] = '<div style="width:32px; text-align:center; display:inline-block">[[Fichier:Miniature Poche XXX SL.png]]</div>',
		["USUL"] = '<div style="width:32px; text-align:center; display:inline-block">[[Fichier:Miniature Poche XXX USUL.png]]</div>',
		["LGPE"] = "[[Fichier:Miniature XXX LGPE.png]]",
		["EB"] = "[[Fichier:Miniature Poche XXX (sélectionnée) EB.png|class=imagenoire|32px]]",
		["DEPS"] = "[[Fichier:Miniature Poche XXX (sélectionnée) DEPS.png|32px]]",
		["LPA"] = "[[Fichier:Miniature Sacoche LPA.png|32px]]",
		["EV"] = "[[Fichier:Miniature Poche XXX (sélectionnée) EV.png|32px]]",
		["LPZA"] = "[[Fichier:Miniature Poche XXX LPZA.png|class=imagenoire|32px]]",
	}
	
	function afficher_monnaie(monnaie, jeu)
		local d = {
			["P"] = frame:expandTemplate({ title = 'P'}),
			["Poké"] = frame:expandTemplate({ title = 'Monnaie PDM', args = { ["jeu"] = jeu }}),
			["Méga-Fragment"] = frame:expandTemplate({ title = "Objet", args = { "Méga-Fragment", ["jeu"] = jeu, ["nom"] = "non" }}),
			["Méga-Fragments"] = frame:expandTemplate({ title = "Objet", args = { "Méga-Fragment", ["jeu"] = jeu, ["nom"] = "non" }})
		}
		if d[monnaie]
		then return d[monnaie]
		else return monnaie
		end
	end
	
	local corps_result = {}
	local has_notes = false
	local donnees_dict = {}

	local i = 1
	while lignes[i] ~= nil do
		local ligne = lignes[i]
		local ligne_split = mw.text.split(ligne, " / ")
		
		for j = 3, 5 do
			if ligne_split[j] == nil or ligne_split[j] == "-"
			then ligne_split[j] = "—"
			end
		end
		
		donnees_dict[i] = {
			["jeu"] = ligne_split[1],
			["rangement"] = ligne_split[2],
			["achat"] = ligne_split[3],
			["vente"] = ligne_split[4],
			["note"] = ligne_split[5]
		}
		
		i = i + 1
	end
	
	i = 1
	while lignes[i] ~= nil do
		local jeu = donnees_dict[i].jeu
		local rangement = donnees_dict[i].rangement
		local achat = donnees_dict[i].achat
		local vente = donnees_dict[i].vente
		local note = donnees_dict[i].note
		
		if jeu ~= ""
		then
			precedent_exists = donnees_dict[i-1] ~= nil and donnees_dict[i-1].jeu ~= ""
			
			table.insert(corps_result, "<tr><td>" .. frame:expandTemplate({ title = 'Abréviation', args = { jeu } }) .. "</td>")
			
			if not rangement
			then rangement = "—"
			else
				if jeu == "OA" or jeu == "C"
				then rangement = "Poche " .. rangement
				end
				
				if images_rangement[jeu]
				then rangement = images_rangement[jeu]:gsub("XXX", rangement) .. " " .. rangement
				end
			end
			table.insert(corps_result, '<td style="white-space:nowrap; text-align:left">' .. rangement .. '</td>')
			
			local achatvente_strings = {"achat", "vente"}
			
			for av = 1, 2 do
				local achatvente_string = achatvente_strings[av]
				local achatvente = donnees_dict[i][achatvente_string]
				local achatvente_texte = "—"
				
				local rowspan = 1
				if not(precedent_exists and achatvente == donnees_dict[i-1][achatvente_string])
				then
					while donnees_dict[i + rowspan] and achatvente == donnees_dict[i + rowspan][achatvente_string] do
						rowspan = rowspan + 1
					end
					
					if achatvente
					then
						achatventes = mw.text.split(achatvente, ", ")
						achatvente_texte = ""
						local j = 1
						while achatventes[j] do
							achatvente_j = achatventes[j]
							local precision_achatvente = ""
							local parenthese_pos = achatvente_j:find(" %(")
							if parenthese_pos
							then precision_achatvente = achatvente_j:sub(parenthese_pos):gsub(" %(", " <small>(") .. "</small>"
								achatvente_j = achatvente_j:sub(0, parenthese_pos - 1)
							end
							
							espace_pos = achatvente_j:find(" ")
							local unite_achatvente = ""
							if espace_pos
							then unite_achatvente = achatvente_j:sub(espace_pos + 1) -- + 1 pour enlever l'espace
								unite_achatvente = " " .. afficher_monnaie(unite_achatvente, jeu)
								achatvente_j = achatvente_j:sub(0, espace_pos - 1)
							end
							
							if achatvente_j == "-"
							then achatvente_j = "—"
							else achatvente_j = separate_thousands(achatvente_j)
							end
							
							if achatvente_texte ~= "" then achatvente_texte = achatvente_texte .. "<br>" end
							achatvente_texte = achatvente_texte .. achatvente_j .. unite_achatvente .. precision_achatvente
							
							j = j + 1
						end
					end
					table.insert(corps_result, '<td rowspan="' .. rowspan .. '" style="white-space:nowrap">' .. achatvente_texte .. "</td>")
				end
			end
			
			local rowspan = 1
			if not(precedent_exists and note == donnees_dict[i-1].note)
			then
				while donnees_dict[i + rowspan] and note == donnees_dict[i + rowspan].note do
					rowspan = rowspan + 1
				end
				
				if note ~= nil and note ~= "—"
				then has_notes = true
				else note = "—"
				end
				
				table.insert(corps_result, '<td rowspan="' .. rowspan .. '">' .. note .. "</td>")
			end
			table.insert(corps_result, "</tr>")
		end
		
		i = i + 1
	end

	local result = {}
	local corps = table.concat(corps_result, "")
	
	table.insert(result, '<table class="tableaustandard centre">')
	table.insert(result, '<tr><th rowspan="2" style="min-width:55px">Jeu</th><th rowspan="2">Rangement</th><th colspan="2">Prix</th>')
	
	if has_notes
	then table.insert(result, '<th rowspan="2">Notes</th>')
	else corps = corps:gsub('<td rowspan="%d+">—</td></tr>', '</tr>') -- on enlève la colonne Notes
	end
	
	table.insert(result, '</tr><tr><th style="min-width:70px">Achat</th><th style="min-width:70px">Vente</th></tr>')

	table.insert(result, corps)
	table.insert(result, "</table>")
	
	return table.concat(result, "")
end



function p.antre(frame)
	local resultat = {"<table class='tableaustandard centre' style='max-width: 100%;'><tr><th rowspan='2'>Objet</th><th colspan='5'>Taux</th></tr>"
		.. "<tr><td class='raid1' width='80px'>★</td><td class='raid2' width='80px'>★★</td><td class='raid3' width='80px'>★★★</td>"
		.. "<td class='raid4' width='80px'>★★★★</td><td class='raid5' width='80px'>★★★★★</td></tr>"}
	
	local objets = frame.args[1]
	if objets ~= nil then objets = mw.text.split(objets, "\n") else objets = {} end
	
	local i = 1
	while objets[i] do
		infos = mw.text.split(objets[i], " / ")
		if infos[1] and infos[2] then
			local nom = infos[1]
			nom = mw.text.split(nom, ", ")
			nom[1] = nom[1]:gsub("{{!}}", "|")
			
			local image = extract_argument("image", infos[2], nil)
			if image == nil
			then if nom[1]:find("|") == nil
				then image = nom[1]
				else image = nom[1]:sub(nom[1]:find("|")+1, nom[1]:len())
				end
			end
			image = "Miniature " .. image .. " EB.png"
			
			table.insert(resultat, "<tr><td style='text-align:left'>[[Fichier:" .. image .. "|class=miniature_objet_EB|link=" .. nom[1] .. "]] [[" .. nom[1] .. "]]")
			if nom[2]
			then table.insert(resultat, " ([[" .. nom[2]:gsub("{{!}}", "|") .. "]])")
			end
			table.insert(resultat, "</td>")
			
			local taux = extract_argument("taux", infos[2], "—")
			local union_taux = (taux ~= "—")
			if taux == "—"
			then
				local j = 1
				while j <= 5 do
					local taux_j = extract_argument(j, infos[2], "—")
					if taux_j ~= "—"
					then union_taux = false	break
					end
					j = j + 1
				end
			end
			
			if union_taux
			then taux = mw.text.split(taux, ", ")
				local taux_text = taux[1]:gsub("%%", "&nbsp;%%")
				k = 2
				while taux[k] do
					taux_k_number = taux[k]:gsub("%%", "")
					if tonumber(taux_k_number)
					then taux_text = taux_text .. "<br>" .. taux[k]:gsub("%%", "&nbsp;%%")
					else taux_text = taux_text .. frame:expandTemplate{title='Sup', args={taux[k]}}
					end
					k = k + 1
				end
				table.insert(resultat, "<td colspan='5'>" .. taux_text .. "</td>")
			else
				local j = 1
				while j <= 5 do
					local taux_j = extract_argument(j, infos[2], "—")
					taux_j = mw.text.split(taux_j, ", ")
					local taux_j_text = taux_j[1]:gsub("%%", "&nbsp;%%")
					k = 2
					while taux_j[k] do
						taux_jk_number = taux_j[k]:gsub("%%", "")
						if tonumber(taux_jk_number)
						then taux_j_text = taux_j_text .. "<br>" .. taux_j[k]:gsub("%%", "&nbsp;%%")
						else taux_j_text = taux_j_text .. frame:expandTemplate{title='Sup', args={taux_j[k]}}
						end
						k = k + 1
					end
					table.insert(resultat, "<td class='raid" .. j .. "'>" .. taux_j_text .. "</td>")
					j = j + 1
				end
			end
			table.insert(resultat, "</tr>")
			
		elseif infos[1] ~= "" then
			local ligne = mw.text.split(infos[1], " // ")
			if ligne[2]
			then
				l1 = mw.text.split(ligne[1], ", ")
				l2 = mw.text.split(ligne[2], ", ")
				table.insert(resultat, '<tr><td colspan="6" style="padding:0px;">'
					.. '<table style="width:100%;text-align:center;background-color:white;border-radius:3px;">'
					.. '<tr><td class="épée" width="50%"><small><i>Épée</i></small><br>')
				
				local j = 1
				while l1[j] do
					if l1[j]:find("★")
					then table.insert(resultat, "<sup>" .. l1[j] .. "</sup>")
					else table.insert(resultat, ressources.infosPokemon(l1[j] .. " jeu(EB)", "miniature"))
					end
					j = j + 1
				end
				table.insert(resultat, '</td><td class="bouclier" width="50%"><small><i>Bouclier</i></small><br>')
				local j = 1
				while l2[j] do
					if l2[j]:find("★")
					then table.insert(resultat, "<sup>" .. l2[j] .. "</sup>")
					else table.insert(resultat, ressources.infosPokemon(l2[j] .. " jeu(EB)", "miniature"))
					end
					j = j + 1
				end
				table.insert(resultat, "</td></tr></table></th></tr>")
				
			else
				if infos[1]:sub(1,5) == "<big>"
					then table.insert(resultat, "<tr><th colspan='6' class='transition'>" .. infos[1] .. "</td></tr>")
				elseif infos[1] == "Épée"
					then table.insert(resultat, "<tr><td colspan='6' class='épée'>"
						.. frame:expandTemplate{title='Jeu', args={"Ep"}} .. "</td></tr>")
				elseif infos[1] == "Bouclier"
					then table.insert(resultat, "<tr><td colspan='6' class='bouclier'>"
						.. frame:expandTemplate{title='Jeu', args={"Bo"}} .. "</td></tr>")
				else table.insert(resultat, "<tr><th colspan='6'>" .. infos[1] .. "</th></tr>")
				end
			end
		end
		
		i = i + 1
	end
	
	table.insert(resultat, "</table>")
	return table.concat(resultat, "")
end






function p.teracristal(frame)
	local ressources = {
		["de"] = require("Module:Ressources/de")
	}
	local id_separator = "_"
	
	local resultat = {"<table class='tableaustandard centre'><tr><th>Objet</th><th width='80px'>Nombre</th><th>Objet</th><th width='80px'>Nombre</th></tr>"}
	
	local objets = frame.args[1]
	if objets ~= nil then objets = mw.text.split(objets, "\n") else objets = {} end
	
	local item_on_the_left = true
	local i = 1
	while objets[i] do
		infos = mw.text.split(objets[i], " / ")
		if infos[1] and infos[2] then
			local name_list = mw.text.split(infos[1], ", ")
			local name = name_list[1]
			name = name:gsub("{{!}}", "|")
			
			local image = name
			
			if name_list[2]
			then name = name_list[2] -- image stays the same
			end
			
			if image:find("|") ~= nil
			then image = image:sub(image:find("|")+1, image:len())
			end
			image = "Miniature " .. image .. " EV.png"
			
			if item_on_the_left then table.insert(resultat, "<tr>") end
			table.insert(resultat, "<td style='text-align:left; white-space:nowrap'>[[Fichier:" .. image .. "|class=miniature_objet_EV|link=" .. name .. "]] [[" .. name .. "]]")
			if name_list[3]
			then table.insert(resultat, " ([[" .. name_list[3]:gsub("{{!}}", "|") .. "]])")
			end
			table.insert(resultat, "</td>")
			
			local amount = infos[2]
			if amount == "" or amount == "-" then amount = "—"
			elseif tonumber(amount) then amount = "×" .. amount
			end
			
			if infos[3]
			then infos[3] = infos[3]:gsub("%%", "&nbsp;%%")
				if infos[3] == "hôte" or infos[3] == "h"
					then amount = amount .. "<br>(hôte)"
				elseif infos[3] == "invités" or infos[3] == "i"
					then amount = amount .. "<br>(invités)"
				else amount = amount .. "<br>(" .. infos[3] .. ")"
				end
			end
			table.insert(resultat, "<td>" .. amount .. "</td>")
			if not item_on_the_left then table.insert(resultat, "</tr>") end
			
			item_on_the_left = not item_on_the_left
			
		elseif infos[1] ~= "" then
			local id = infos[1]
			local id_split = mw.text.split(id, id_separator)
			local pokemon = id_split[1]
			local difficulty = id_split[2]
			
			local difficulty_stars = ""
			if tonumber(difficulty) ~= nil
			then difficulty_stars = " " .. difficulty .. "★"
			end
			
			table.insert(resultat, "<tr><th colspan='4' id='Objet" .. id_separator .. id .. "'>Récompenses " .. ressources.de(pokemon) .. pokemon .. difficulty_stars .. " ([[#Pokémon" .. id_separator .. id .. "|voir]])</th></tr>")
			
			item_on_the_left = true
		end
		
		i = i + 1
	end
	
	table.insert(resultat, "</table>")
	return table.concat(resultat, "")
end

return p