// ══════════════════════════════════════════ // Race Value Object — extracted from index.html // ══════════════════════════════════════════ export interface RaceData { name: string; stats: string[]; parents: string; icon: string; } // Generation → color export const GEN_COLORS: Record = { 1: '#c8622a', 2: '#e8b820', 3: '#6040b0', 4: '#2a8acc', 5: '#c03050', 6: '#d040a0', 7: '#c8c0a0', 8: '#20a8b0', 9: '#28a058', 10: '#8050a0', }; // Base race → primary color export const RACE_BASE_COLORS: Record = { 'Rousse': '#c8622a', 'Amande': '#d4b48a', 'Dorée': '#e8b820', 'Ebène': '#2a2a2a', 'Indigo': '#6040b0', 'Pourpre': '#c03050', 'Orchidée': '#d040a0', 'Ivoire': '#c8c0a0', 'Turquoise': '#20a8b0', 'Emeraude': '#28a058', 'Prune': '#8050a0', }; // All race definitions by generation export const RACES_DATA: Record = { 2: [ { name: 'Amande et Rousse', stats: ['400 Vitalité', '60 Soins', '1200 Initiative'], parents: 'Amande + Rousse', icon: '🐦' }, { name: 'Dorée et Rousse', stats: ['400 Vitalité', '1 Invocation', '45 Soins'], parents: 'Dorée + Rousse', icon: '🐦' }, { name: 'Amande et Dorée', stats: ['400 Vitalité', '1 Invocation', '1200 Initiative'], parents: 'Amande + Dorée', icon: '🐦' }, ], 3: [ { name: 'Ebène', stats: ['400 Vitalité', '120 Agilité'], parents: 'Amande et Dorée + Dorée et Rousse', icon: '🐦' }, { name: 'Indigo', stats: ['400 Vitalité', '120 Chance'], parents: 'Amande et Dorée + Amande et Rousse', icon: '🐦' }, ], 4: [ { name: 'Indigo et Rousse', stats: ['400 Vitalité', '90 Chance', '45 Soins'], parents: 'Indigo + Rousse', icon: '🐦' }, { name: 'Ebène et Rousse', stats: ['400 Vitalité', '90 Agilité', '45 Soins'], parents: 'Ebène + Rousse', icon: '🐦' }, { name: 'Amande et Indigo', stats: ['400 Vitalité', '90 Chance', '1200 Initiative'], parents: 'Amande + Indigo', icon: '🐦' }, { name: 'Amande et Ebène', stats: ['400 Vitalité', '120 Agilité', '1200 Initiative'], parents: 'Amande + Ebène', icon: '🐦' }, { name: 'Dorée et Indigo', stats: ['400 Vitalité', '90 Chance', '1 Invocation'], parents: 'Dorée + Indigo', icon: '🐦' }, { name: 'Dorée et Ebène', stats: ['400 Vitalité', '90 Agilité', '1 Invocation'], parents: 'Dorée + Ebène', icon: '🐦' }, { name: 'Ebène et Indigo', stats: ['400 Vitalité', '90 Chance', '90 Agilité'], parents: 'Ebène + Indigo', icon: '🐦' }, ], 5: [ { name: 'Pourpre', stats: ['400 Vitalité', '120 Force'], parents: 'Ebène et Indigo + Amande et Rousse', icon: '🐦' }, { name: 'Orchidée', stats: ['400 Vitalité', '120 Intelligence'], parents: 'Ebène et Indigo + Dorée et Rousse', icon: '🐦' }, ], 6: [ { name: 'Pourpre et Rousse', stats: ['400 Vitalité', '90 Force', '45 Soins'], parents: 'Pourpre + Rousse', icon: '🐦' }, { name: 'Orchidée et Rousse', stats: ['400 Vitalité', '90 Intelligence', '45 Soins'], parents: 'Orchidée + Rousse', icon: '🐦' }, { name: 'Amande et Pourpre', stats: ['400 Vitalité', '90 Force', '1200 Initiative'], parents: 'Amande + Pourpre', icon: '🐦' }, { name: 'Amande et Orchidée', stats: ['400 Vitalité', '90 Intelligence', '1200 Initiative'], parents: 'Amande + Orchidée', icon: '🐦' }, { name: 'Dorée et Pourpre', stats: ['400 Vitalité', '90 Force', '1 Invocation'], parents: 'Dorée + Pourpre', icon: '🐦' }, { name: 'Dorée et Orchidée', stats: ['400 Vitalité', '90 Intelligence', '1 Invocation'], parents: 'Dorée + Orchidée', icon: '🐦' }, { name: 'Indigo et Pourpre', stats: ['400 Vitalité', '90 Force', '90 Chance'], parents: 'Indigo + Pourpre', icon: '🐦' }, { name: 'Indigo et Orchidée', stats: ['400 Vitalité', '90 Intelligence', '90 Chance'], parents: 'Indigo + Orchidée', icon: '🐦' }, { name: 'Ebène et Pourpre', stats: ['400 Vitalité', '90 Force', '90 Agilité'], parents: 'Ebène + Pourpre', icon: '🐦' }, { name: 'Ebène et Orchidée', stats: ['400 Vitalité', '90 Intelligence', '90 Agilité'], parents: 'Ebène + Orchidée', icon: '🐦' }, { name: 'Orchidée et Pourpre', stats: ['400 Vitalité', '90 Force', '90 Intelligence'], parents: 'Orchidée + Pourpre', icon: '🐦' }, ], 7: [ { name: 'Ivoire', stats: ['400 Vitalité', '90 Puissance'], parents: 'Orchidée et Pourpre + Indigo et Pourpre', icon: '🐦' }, { name: 'Turquoise', stats: ['400 Vitalité', '90 Prospection'], parents: 'Orchidée et Pourpre + Ebène et Orchidée', icon: '🐦' }, ], 8: [ { name: 'Ivoire et Rousse', stats: ['400 Vitalité', '70 Puissance', '45 Soins'], parents: 'Ivoire + Rousse', icon: '🐦' }, { name: 'Turquoise et Rousse', stats: ['400 Vitalité', '45 Soins', '70 Prospection'], parents: 'Turquoise + Rousse', icon: '🐦' }, { name: 'Amande et Ivoire', stats: ['400 Vitalité', '70 Puissance', '1200 Initiative'], parents: 'Amande + Ivoire', icon: '🐦' }, { name: 'Amande et Turquoise', stats: ['400 Vitalité', '70 Prospection', '1200 Initiative'], parents: 'Amande + Turquoise', icon: '🐦' }, { name: 'Dorée et Ivoire', stats: ['400 Vitalité', '70 Puissance', '1 Invocation'], parents: 'Dorée + Ivoire', icon: '🐦' }, { name: 'Dorée et Turquoise', stats: ['400 Vitalité', '1 Invocation', '70 Prospection'], parents: 'Dorée + Turquoise', icon: '🐦' }, { name: 'Indigo et Ivoire', stats: ['400 Vitalité', '90 Chance', '70 Puissance'], parents: 'Indigo + Ivoire', icon: '🐦' }, { name: 'Indigo et Turquoise', stats: ['400 Vitalité', '90 Chance', '70 Prospection'], parents: 'Indigo + Turquoise', icon: '🐦' }, { name: 'Ebène et Ivoire', stats: ['400 Vitalité', '90 Agilité', '70 Puissance'], parents: 'Ebène + Ivoire', icon: '🐦' }, { name: 'Ebène et Turquoise', stats: ['400 Vitalité', '90 Agilité', '70 Prospection'], parents: 'Ebène + Turquoise', icon: '🐦' }, { name: 'Ivoire et Pourpre', stats: ['400 Vitalité', '90 Force', '70 Puissance'], parents: 'Ivoire + Pourpre', icon: '🐦' }, { name: 'Turquoise et Pourpre', stats: ['400 Vitalité', '90 Force', '70 Prospection'], parents: 'Turquoise + Pourpre', icon: '🐦' }, { name: 'Ivoire et Orchidée', stats: ['400 Vitalité', '90 Intelligence', '70 Puissance'], parents: 'Ivoire + Orchidée', icon: '🐦' }, { name: 'Turquoise et Orchidée', stats: ['400 Vitalité', '90 Intelligence', '70 Prospection'], parents: 'Turquoise + Orchidée', icon: '🐦' }, { name: 'Ivoire et Turquoise', stats: ['400 Vitalité', '70 Puissance', '70 Prospection'], parents: 'Ivoire + Turquoise', icon: '🐦' }, ], 9: [ { name: 'Emeraude', stats: ['400 Vitalité', '14% Critique'], parents: 'Ivoire et Turquoise + Ivoire et Pourpre', icon: '🐦' }, { name: 'Prune', stats: ['400 Vitalité', '2 Portée'], parents: 'Ivoire et Turquoise + Turquoise et Orchidée', icon: '🐦' }, ], 10: [ { name: 'Emeraude et Rousse', stats: ['400 Vitalité', '10% Critique', '45 Soins'], parents: 'Emeraude + Rousse', icon: '🐦' }, { name: 'Prune et Rousse', stats: ['400 Vitalité', '1 Portée', '45 Soins'], parents: 'Prune + Rousse', icon: '🐦' }, { name: 'Amande et Emeraude', stats: ['400 Vitalité', '10% Critique', '1200 Initiative'], parents: 'Amande + Emeraude', icon: '🐦' }, { name: 'Prune et Amande', stats: ['400 Vitalité', '1 Portée', '1200 Initiative'], parents: 'Prune + Amande', icon: '🐦' }, { name: 'Dorée et Emeraude', stats: ['400 Vitalité', '10% Critique', '1 Invocation'], parents: 'Dorée + Emeraude', icon: '🐦' }, { name: 'Prune et Dorée', stats: ['400 Vitalité', '1 Portée', '1 Invocation'], parents: 'Prune + Dorée', icon: '🐦' }, { name: 'Emeraude et Indigo', stats: ['400 Vitalité', '90 Chance', '10% Critique'], parents: 'Emeraude + Indigo', icon: '🐦' }, { name: 'Prune et Indigo', stats: ['400 Vitalité', '90 Chance', '1 Portée'], parents: 'Prune + Indigo', icon: '🐦' }, { name: 'Ebène et Emeraude', stats: ['400 Vitalité', '90 Agilité', '10% Critique'], parents: 'Ebène + Emeraude', icon: '🐦' }, { name: 'Prune et Ebène', stats: ['400 Vitalité', '90 Agilité', '1 Portée'], parents: 'Prune + Ebène', icon: '🐦' }, { name: 'Emeraude et Pourpre', stats: ['400 Vitalité', '90 Force', '10% Critique'], parents: 'Emeraude + Pourpre', icon: '🐦' }, { name: 'Prune et Pourpre', stats: ['400 Vitalité', '90 Force', '1 Portée'], parents: 'Prune + Pourpre', icon: '🐦' }, { name: 'Emeraude et Orchidée', stats: ['400 Vitalité', '90 Intelligence', '10% Critique'], parents: 'Emeraude + Orchidée', icon: '🐦' }, { name: 'Prune et Orchidée', stats: ['400 Vitalité', '90 Intelligence', '1 Portée'], parents: 'Prune + Orchidée', icon: '🐦' }, { name: 'Emeraude et Ivoire', stats: ['400 Vitalité', '70 Puissance', '10% Critique'], parents: 'Emeraude + Ivoire', icon: '🐦' }, { name: 'Prune et Ivoire', stats: ['400 Vitalité', '70 Puissance', '1 Portée'], parents: 'Prune + Ivoire', icon: '🐦' }, { name: 'Emeraude et Turquoise', stats: ['400 Vitalité', '10% Critique', '70 Prospection'], parents: 'Emeraude + Turquoise', icon: '🐦' }, { name: 'Prune et Turquoise', stats: ['400 Vitalité', '1 Portée', '70 Prospection'], parents: 'Prune + Turquoise', icon: '🐦' }, { name: 'Prune et Emeraude', stats: ['400 Vitalité', '10% Critique', '1 Portée'], parents: 'Prune + Emeraude', icon: '🐦' }, ], }; // Breeding recipes: baby race → [parentA, parentB] export const BREEDING_RECIPES: Record = { 'Dorée et Rousse': ['Rousse', 'Dorée'], 'Amande et Dorée': ['Amande', 'Dorée'], 'Amande et Rousse': ['Amande', 'Rousse'], 'Ebène': ['Amande et Dorée', 'Dorée et Rousse'], 'Indigo': ['Amande et Dorée', 'Amande et Rousse'], 'Indigo et Rousse': ['Indigo', 'Rousse'], 'Ebène et Rousse': ['Ebène', 'Rousse'], 'Amande et Indigo': ['Amande', 'Indigo'], 'Amande et Ebène': ['Amande', 'Ebène'], 'Dorée et Indigo': ['Dorée', 'Indigo'], 'Dorée et Ebène': ['Dorée', 'Ebène'], 'Ebène et Indigo': ['Ebène', 'Indigo'], 'Pourpre': ['Ebène et Indigo', 'Amande et Rousse'], 'Orchidée': ['Ebène et Indigo', 'Dorée et Rousse'], 'Pourpre et Rousse': ['Pourpre', 'Rousse'], 'Orchidée et Rousse': ['Orchidée', 'Rousse'], 'Amande et Pourpre': ['Amande', 'Pourpre'], 'Amande et Orchidée': ['Amande', 'Orchidée'], 'Dorée et Pourpre': ['Dorée', 'Pourpre'], 'Dorée et Orchidée': ['Dorée', 'Orchidée'], 'Indigo et Pourpre': ['Indigo', 'Pourpre'], 'Indigo et Orchidée': ['Indigo', 'Orchidée'], 'Ebène et Pourpre': ['Ebène', 'Pourpre'], 'Ebène et Orchidée': ['Ebène', 'Orchidée'], 'Orchidée et Pourpre': ['Orchidée', 'Pourpre'], 'Ivoire': ['Orchidée et Pourpre', 'Indigo et Pourpre'], 'Turquoise': ['Orchidée et Pourpre', 'Ebène et Orchidée'], 'Ivoire et Rousse': ['Ivoire', 'Rousse'], 'Turquoise et Rousse': ['Turquoise', 'Rousse'], 'Amande et Ivoire': ['Amande', 'Ivoire'], 'Amande et Turquoise': ['Amande', 'Turquoise'], 'Dorée et Ivoire': ['Dorée', 'Ivoire'], 'Dorée et Turquoise': ['Dorée', 'Turquoise'], 'Indigo et Ivoire': ['Indigo', 'Ivoire'], 'Indigo et Turquoise': ['Indigo', 'Turquoise'], 'Ebène et Ivoire': ['Ebène', 'Ivoire'], 'Ebène et Turquoise': ['Ebène', 'Turquoise'], 'Ivoire et Pourpre': ['Ivoire', 'Pourpre'], 'Turquoise et Pourpre': ['Turquoise', 'Pourpre'], 'Ivoire et Orchidée': ['Ivoire', 'Orchidée'], 'Turquoise et Orchidée': ['Turquoise', 'Orchidée'], 'Ivoire et Turquoise': ['Ivoire', 'Turquoise'], 'Emeraude': ['Ivoire et Turquoise', 'Ivoire et Pourpre'], 'Prune': ['Ivoire et Turquoise', 'Turquoise et Orchidée'], 'Emeraude et Rousse': ['Emeraude', 'Rousse'], 'Prune et Rousse': ['Prune', 'Rousse'], 'Amande et Emeraude': ['Amande', 'Emeraude'], 'Prune et Amande': ['Prune', 'Amande'], 'Dorée et Emeraude': ['Dorée', 'Emeraude'], 'Prune et Dorée': ['Prune', 'Dorée'], 'Emeraude et Indigo': ['Emeraude', 'Indigo'], 'Prune et Indigo': ['Prune', 'Indigo'], 'Ebène et Emeraude': ['Ebène', 'Emeraude'], 'Prune et Ebène': ['Prune', 'Ebène'], 'Emeraude et Pourpre': ['Emeraude', 'Pourpre'], 'Prune et Pourpre': ['Prune', 'Pourpre'], 'Emeraude et Orchidée': ['Emeraude', 'Orchidée'], 'Prune et Orchidée': ['Prune', 'Orchidée'], 'Emeraude et Ivoire': ['Emeraude', 'Ivoire'], 'Prune et Ivoire': ['Prune', 'Ivoire'], 'Emeraude et Turquoise': ['Emeraude', 'Turquoise'], 'Prune et Turquoise': ['Prune', 'Turquoise'], 'Prune et Emeraude': ['Prune', 'Emeraude'], }; // Race name → generation number (computed) export const RACE_GEN: Record = {}; ['Rousse', 'Dorée', 'Amande'].forEach((n) => (RACE_GEN[n] = 1)); Object.entries(RACES_DATA).forEach(([g, rs]) => rs.forEach((r) => (RACE_GEN[r.name] = parseInt(g))), ); // Reverse lookup: "ParentA|ParentB" → baby race export const BREEDING_BY_PARENTS: Record = {}; Object.entries(BREEDING_RECIPES).forEach(([baby, [a, b]]) => { BREEDING_BY_PARENTS[a + '|' + b] = baby; if (a !== b) BREEDING_BY_PARENTS[b + '|' + a] = baby; }); // For a given parent, which partners are possible? export const COMPATIBLE_PARTNERS: Record< string, { partner: string; baby: string; gen: number }[] > = {}; Object.entries(BREEDING_RECIPES).forEach(([baby, [a, b]]) => { if (!COMPATIBLE_PARTNERS[a]) COMPATIBLE_PARTNERS[a] = []; COMPATIBLE_PARTNERS[a].push({ partner: b, baby, gen: RACE_GEN[baby] }); if (a !== b) { if (!COMPATIBLE_PARTNERS[b]) COMPATIBLE_PARTNERS[b] = []; COMPATIBLE_PARTNERS[b].push({ partner: a, baby, gen: RACE_GEN[baby] }); } }); // ── Helper functions ── const COLOR_ORDER = [ 'Emeraude', 'Prune', 'Ivoire', 'Turquoise', 'Orchidée', 'Pourpre', 'Indigo', 'Ebène', 'Dorée', 'Amande', 'Rousse', ]; /** Returns the generation number for a race name. */ export function generationOf(name: string): number { return RACE_GEN[name] ?? 0; } /** Returns true if the race is a base (gen 1) race. */ export function isBaseRace(name: string): boolean { return RACE_GEN[name] === 1; } /** Returns the primary color for a race name. */ export function raceColor(name: string): string { for (const k of COLOR_ORDER) { if (name.includes(k)) return RACE_BASE_COLORS[k]; } return '#888'; } /** Returns the secondary color for gradient, or null if none. */ export function raceColor2(name: string): string | null { let found = false; for (const k of COLOR_ORDER) { if (name.includes(k)) { if (found) return RACE_BASE_COLORS[k]; found = true; } } return null; }