diff --git a/data/Sword & Shield/Celebrations/23.ts b/data/Sword & Shield/Celebrations/23.ts index b265e3b8d3..eb4afd2f0b 100644 --- a/data/Sword & Shield/Celebrations/23.ts +++ b/data/Sword & Shield/Celebrations/23.ts @@ -12,12 +12,21 @@ const card: Card = { }, name: { + en: "Professor's Research", + fr: "Recherches Professorales", + es: "Investigación de Profesores", + it: "Ricerca Accademica", + pt: "Pesquisa de Professores", + de: "Forschung des Professors" + }, + + description: { en: "Professor's Research (Professor Oak)", fr: "Recherches Professorales (Professeur Chen)", es: "Investigación de Profesores (Profesor Oak)", it: "Ricerca Accademica (Professor Oak)", - pt: "Pesquisa de Professores", - de: "Forschung des Professors (Prof. Eich)" + pt: "Pesquisa de Professores (Professor Oak)", + de: "Forschung des Professors (Professor Eich)" }, rarity: "Holo Rare", diff --git a/data/Sword & Shield/Celebrations/24.ts b/data/Sword & Shield/Celebrations/24.ts index e8c232324e..892769e283 100644 --- a/data/Sword & Shield/Celebrations/24.ts +++ b/data/Sword & Shield/Celebrations/24.ts @@ -12,12 +12,21 @@ const card: Card = { }, name: { + en: "Professor's Research", + fr: "Recherches Professorales", + es: "Investigación de Profesores", + it: "Ricerca Accademica", + pt: "Pesquisa de Professores", + de: "Forschung des Professors" + }, + + description: { en: "Professor's Research (Professor Oak)", fr: "Recherches Professorales (Professeur Chen)", es: "Investigación de Profesores (Profesor Oak)", it: "Ricerca Accademica (Professor Oak)", - pt: "Pesquisa de Professores", - de: "Forschung des Professors (Prof. Eich)" + pt: "Pesquisa de Professores (Professor Oak)", + de: "Forschung des Professors (Professor Eich)" }, rarity: "Ultra Rare", diff --git a/data/Sword & Shield/Rebel Clash/154.ts b/data/Sword & Shield/Rebel Clash/154.ts index 672b889566..4a780ee8fa 100644 --- a/data/Sword & Shield/Rebel Clash/154.ts +++ b/data/Sword & Shield/Rebel Clash/154.ts @@ -3,8 +3,8 @@ import Set from '../Rebel Clash' const card: Card = { name: { - en: "Boss's Orders (Giovanni)", - fr: "Ordres du Boss (Giovanni)", + en: "Boss's Orders", + fr: "Ordres du Boss", es: "Órdenes de Jefes", it: "Ordini del Capo", pt: "Ordem da Chefia", @@ -28,6 +28,15 @@ const card: Card = { trainerType: "Supporter", regulationMark: "D", + description: { + en: "Boss's Orders (Giovanni)", + fr: "Ordres du Boss (Giovanni)", + es: "Órdenes de Jefes (Giovanni)", + it: "Ordini del Capo (Giovanni)", + pt: "Ordem da Chefia (Giovanni)", + de: "Befehl vom Boss (Giovanni)" + }, + variants: { normal: false, reverse: true, diff --git a/data/Sword & Shield/Rebel Clash/189.ts b/data/Sword & Shield/Rebel Clash/189.ts index ecdc3fe906..253fd42e20 100644 --- a/data/Sword & Shield/Rebel Clash/189.ts +++ b/data/Sword & Shield/Rebel Clash/189.ts @@ -3,14 +3,23 @@ import Set from '../Rebel Clash' const card: Card = { name: { - en: "Boss's Orders (Giovanni)", - fr: "Ordres du Boss (Giovanni)", + en: "Boss's Orders", + fr: "Ordres du Boss", es: "Órdenes de Jefes", it: "Ordini del Capo", pt: "Ordem da Chefia", de: "Befehl vom Boss" }, + description: { + en: "Boss's Orders (Giovanni)", + fr: "Ordres du Boss (Giovanni)", + es: "Órdenes de Jefes (Giovanni)", + it: "Ordini del Capo (Giovanni)", + pt: "Ordem da Chefia (Giovanni)", + de: "Befehl vom Boss (Giovanni)" + }, + illustrator: "nagimiso", rarity: "Ultra Rare", category: "Trainer", diff --git a/data/Sword & Shield/Rebel Clash/200.ts b/data/Sword & Shield/Rebel Clash/200.ts index 3a37a87d89..c45b576931 100644 --- a/data/Sword & Shield/Rebel Clash/200.ts +++ b/data/Sword & Shield/Rebel Clash/200.ts @@ -5,8 +5,8 @@ const card: Card = { set: Set, name: { - en: "Boss's Orders (Giovanni)", - fr: "Ordres du Boss (Giovanni)", + en: "Boss's Orders", + fr: "Ordres du Boss", es: "Órdenes de Jefes", it: "Ordini del Capo", pt: "Ordem da Chefia", @@ -29,6 +29,15 @@ const card: Card = { trainerType: "Supporter", regulationMark: "D", + description: { + en: "Boss's Orders (Giovanni)", + fr: "Ordres du Boss (Giovanni)", + es: "Órdenes de Jefes (Giovanni)", + it: "Ordini del Capo (Giovanni)", + pt: "Ordem da Chefia (Giovanni)", + de: "Befehl vom Boss (Giovanni)" + }, + variants: { normal: false, reverse: false, diff --git a/data/Sword & Shield/Shining Fates/58.ts b/data/Sword & Shield/Shining Fates/58.ts index 3fc6fbc3aa..9c7cf9fd38 100644 --- a/data/Sword & Shield/Shining Fates/58.ts +++ b/data/Sword & Shield/Shining Fates/58.ts @@ -5,14 +5,25 @@ const card: Card = { set: Set, name: { - fr: "Ordres du Boss (Lysandre)", - en: "Boss's Orders (Lysandre)", + en: "Boss's Orders", + fr: "Ordres du Boss", es: "Órdenes de Jefes", it: "Ordini del Capo", pt: "Ordem da Chefia", de: "Befehl vom Boss" }, + description: { + en: "Boss's Orders (Lysandre)", + fr: "Ordres du Boss (Lysandre)", + es: "Órdenes de Jefes (Lysson)", + 'es-mx': "Órdenes de Jefes (Lysandre)", + it: "Ordini del Capo (Elisio)", + pt: "Ordem da Chefia (Lysandre)", + 'pt-br': "Ordem da Chefia (Lysandre)", + de: "Befehl vom Boss (Flordelis)" + }, + illustrator: "Ryuta Fuse", rarity: "Rare", category: "Trainer", diff --git a/data/Sword & Shield/Shining Fates/60.ts b/data/Sword & Shield/Shining Fates/60.ts index 60bba5755c..487430e2ab 100644 --- a/data/Sword & Shield/Shining Fates/60.ts +++ b/data/Sword & Shield/Shining Fates/60.ts @@ -5,8 +5,8 @@ const card: Card = { set: Set, name: { - fr: "Recherches Professorales (Professeure Keteleeria)", - en: "Professor's Research (Professor Juniper)", + fr: "Recherches Professorales", + en: "Professor's Research", es: "Investigación de Profesores", it: "Ricerca Accademica", pt: "Pesquisa de Professores", @@ -29,6 +29,15 @@ const card: Card = { trainerType: "Supporter", regulationMark: "D", + description: { + en: "Professor's Research (Professor Juniper)", + de: "Forschung des Professors (Professor Esche)", + es: "Investigación de Profesores (Profesora Encina)", + fr: "Recherches Professorales (Professeure Keteleeria)", + it: "Ricerca Accademica (Professoressa Aralia)", + pt: "Pesquisa de Professores (Professor Juniper)" + }, + variants: { normal: true, reverse: true, diff --git a/data/Sword & Shield/Sword & Shield/178.ts b/data/Sword & Shield/Sword & Shield/178.ts index c7e4ad1a2d..62c07602cd 100644 --- a/data/Sword & Shield/Sword & Shield/178.ts +++ b/data/Sword & Shield/Sword & Shield/178.ts @@ -3,8 +3,8 @@ import Set from '../Sword & Shield' const card: Card = { name: { - en: "Professor's Research (Professor Magnolia)", - fr: "Recherches Professorales (Professeure Magnolia)", + en: "Professor's Research", + fr: "Recherches Professorales", es: "Investigación de Profesores", it: "Ricerca Accademica", pt: "Pesquisa de Professores", @@ -28,6 +28,15 @@ const card: Card = { trainerType: "Supporter", regulationMark: "D", + description: { + en: "Professor's Research (Professor Magnolia)", + de: "Forschung des Professors (Professor Magnolica)", + es: "Investigación de Profesores (Profesora Magnolia)", + fr: "Recherches Professorales (Professeure Magnolia)", + it: "Ricerca Accademica (Professoressa Flora)", + pt: "Pesquisa de Professores (Professor Juniper)" + }, + variants: { normal: false, reverse: true, diff --git a/data/Sword & Shield/Sword & Shield/201.ts b/data/Sword & Shield/Sword & Shield/201.ts index c3799fc512..61116441df 100644 --- a/data/Sword & Shield/Sword & Shield/201.ts +++ b/data/Sword & Shield/Sword & Shield/201.ts @@ -3,8 +3,8 @@ import Set from '../Sword & Shield' const card: Card = { name: { - en: "Professor's Research (Professor Magnolia)", - fr: "Recherches Professorales (Professeure Magnolia)", + en: "Professor's Research", + fr: "Recherches Professorales", es: "Investigación de Profesores", it: "Ricerca Accademica", pt: "Pesquisa de Professores", @@ -28,6 +28,15 @@ const card: Card = { trainerType: "Supporter", regulationMark: "D", + description: { + en: "Professor's Research (Professor Magnolia)", + de: "Forschung des Professors (Professor Magnolica)", + es: "Investigación de Profesores (Profesora Magnolia)", + fr: "Recherches Professorales (Professeure Magnolia)", + it: "Ricerca Accademica (Professoressa Flora)", + pt: "Pesquisa de Professores (Professor Juniper)" + }, + variants: { normal: false, reverse: false, diff --git a/data/Sword & Shield/Sword & Shield/209.ts b/data/Sword & Shield/Sword & Shield/209.ts index 8f687e17e0..afc454d5c5 100644 --- a/data/Sword & Shield/Sword & Shield/209.ts +++ b/data/Sword & Shield/Sword & Shield/209.ts @@ -3,8 +3,8 @@ import Set from '../Sword & Shield' const card: Card = { name: { - en: "Professor's Research (Professor Magnolia)", - fr: "Recherches Professorales (Professeure Magnolia)", + en: "Professor's Research", + fr: "Recherches Professorales", es: "Investigación de Profesores", it: "Ricerca Accademica", pt: "Pesquisa de Professores", @@ -28,6 +28,15 @@ const card: Card = { trainerType: "Supporter", regulationMark: "D", + description: { + en: "Professor's Research (Professor Magnolia)", + de: "Forschung des Professors (Professor Magnolica)", + es: "Investigación de Profesores (Profesora Magnolia)", + fr: "Recherches Professorales (Professeure Magnolia)", + it: "Ricerca Accademica (Professoressa Flora)", + pt: "Pesquisa de Professores (Professor Juniper)" + }, + variants: { normal: false, reverse: false, diff --git a/server/compiler/index.ts b/server/compiler/index.ts index 582d190542..b7e6bf8508 100644 --- a/server/compiler/index.ts +++ b/server/compiler/index.ts @@ -1,8 +1,10 @@ /* eslint-disable max-statements */ -import { existsSync, promises as fs } from 'fs' +import { promises as fs } from 'fs' import { SupportedLanguages } from '../../interfaces' import { FileFunction } from './compilerInterfaces' import { fetchRemoteFile, loadLastEdits } from './utils/util' +import { enhanceTrainerLegality, getCards } from './utils/cardUtil' +import { Card as CardSingle } from '../../meta/definitions/api' const LANGS: Array = [ 'en', 'fr', 'es', 'es-mx', 'it', 'pt', 'pt-br', 'pt-pt', 'de', 'nl', 'pl', 'ru', @@ -54,7 +56,14 @@ const DIST_FOLDER = './generated' // Run the function console.log(' ', 'Compiling', lang, file) - const item = await fn(lang) + let item = await fn(lang) + + // Post-process Trainer legality after compilation but before writing JSON + if (file === 'cards.ts' && Array.isArray(item)) { + console.log(' ', 'Post-processing Trainer legality', lang) + const originalCards = await getCards(lang) + item = enhanceTrainerLegality(item as Array, originalCards) + } // Write to file await fs.writeFile(`${folder}/${file.replace('.ts', '')}.json`, JSON.stringify( diff --git a/server/compiler/utils/cardUtil.ts b/server/compiler/utils/cardUtil.ts index 26f7f0c11a..e10dac56ed 100644 --- a/server/compiler/utils/cardUtil.ts +++ b/server/compiler/utils/cardUtil.ts @@ -8,6 +8,66 @@ import { DB_PATH, cardIsLegal, fetchRemoteFile, getDataFolder, getLastEdit, reso import { objectMap, objectPick } from '@dzeio/object-util' import { variant_detailed } from "../../public/v2/api"; +/** + * Post-processes compiled cards to enhance Trainer legality based on reprints. + * If any reprint of a Trainer card is legal, all cards with the same English name are marked as legal. + */ +export function enhanceTrainerLegality( + compiledCards: Array, + originalCards: Array<[string, Card]> +): Array { + const originalCardMap = new Map() + for (const [localId, card] of originalCards) { + const cardId = `${card.set.id}-${localId}` + originalCardMap.set(cardId, card) + } + + const trainerCardsByName = new Map>() + + for (const compiledCard of compiledCards) { + const originalCard = originalCardMap.get(compiledCard.id) + if (!originalCard || originalCard.category !== 'Trainer') { + continue + } + + const cardNameEn = originalCard.name.en + if (!cardNameEn) { + continue + } + + if (!trainerCardsByName.has(cardNameEn)) { + trainerCardsByName.set(cardNameEn, []) + } + + trainerCardsByName.get(cardNameEn)!.push({ + compiled: compiledCard, + original: originalCard, + localId: compiledCard.localId + }) + } + + for (const [cardNameEn, cardsWithName] of trainerCardsByName) { + let hasLegalStandard = false + let hasLegalExpanded = false + + for (const { compiled } of cardsWithName) { + if (compiled.legal.standard) { + hasLegalStandard = true + } + if (compiled.legal.expanded) { + hasLegalExpanded = true + } + } + + for (const { compiled } of cardsWithName) { + compiled.legal.standard = hasLegalStandard || compiled.legal.standard + compiled.legal.expanded = hasLegalExpanded || compiled.legal.expanded + } + } + + return compiledCards +} + export async function getCardPictures(cardId: string, card: Card, lang: SupportedLanguages): Promise { try { const file = await fetchRemoteFile('https://assets.tcgdex.net/datas.json')