competence_saison3_full_v2
Différences
Ci-dessous, les différences entre deux révisions de la page.
| Prochaine révision | Révision précédente | ||
| competence_saison3_full_v2 [2026/10/21 13:20] – créée nanaki | competence_saison3_full_v2 [2026/10/23 21:12] (Version actuelle) – nanaki | ||
|---|---|---|---|
| Ligne 86: | Ligne 86: | ||
| Voici la liste complète des compétences : | Voici la liste complète des compétences : | ||
| - | |||
| - | |||
| - | |||
| < | < | ||
| Ligne 172: | Ligne 169: | ||
| th: | th: | ||
| th: | th: | ||
| + | th: | ||
| /* Texte multi-lignes */ | /* Texte multi-lignes */ | ||
| td: | td: | ||
| + | td: | ||
| td: | td: | ||
| - | td: | + | td: |
| white-space: | white-space: | ||
| word-break: break-word; | word-break: break-word; | ||
| + | } | ||
| + | |||
| + | td: | ||
| + | overflow-wrap: | ||
| + | text-overflow: | ||
| } | } | ||
| Ligne 398: | Ligne 402: | ||
| <th onclick=" | <th onclick=" | ||
| <th onclick=" | <th onclick=" | ||
| + | < | ||
| </tr> | </tr> | ||
| </ | </ | ||
| Ligne 460: | Ligne 465: | ||
| < | < | ||
| < | < | ||
| - | < | + | < |
| </tr> | </tr> | ||
| Ligne 1004: | Ligne 1009: | ||
| <tr class=" | <tr class=" | ||
| < | < | ||
| - | < | + | < |
| - | < | + | < |
| </tr> | </tr> | ||
| Ligne 1082: | Ligne 1087: | ||
| < | < | ||
| < | < | ||
| - | < | + | < |
| </tr> | </tr> | ||
| Ligne 1350: | Ligne 1355: | ||
| const table = document.getElementById(" | const table = document.getElementById(" | ||
| const tbody = table.querySelector(" | const tbody = table.querySelector(" | ||
| + | |||
| + | /* ========================================================= | ||
| + | | ||
| + | ========================================================= */ | ||
| + | |||
| + | function normaliserNom(nom) { | ||
| + | const valeur = String(nom || "" | ||
| + | .normalize(" | ||
| + | .replace(/ | ||
| + | .toLowerCase() | ||
| + | .replace(/ | ||
| + | .replace(/ | ||
| + | .replace(/ | ||
| + | .trim(); | ||
| + | |||
| + | return valeur; | ||
| + | } | ||
| + | |||
| + | // Tous les prérequis d'une ligne doivent être sélectionnés. | ||
| + | const PREREQUIS = { | ||
| + | "Oeil d' | ||
| + | "Oeil ultime": | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | }; | ||
| + | |||
| + | // Chaque incompatibilité est automatiquement réciproque. | ||
| + | const INCOMPATIBILITES = [ | ||
| + | [" | ||
| + | [" | ||
| + | [" | ||
| + | [" | ||
| + | [" | ||
| + | [" | ||
| + | [" | ||
| + | [" | ||
| + | [" | ||
| + | [" | ||
| + | ["Voie de l' | ||
| + | [" | ||
| + | [" | ||
| + | [" | ||
| + | [" | ||
| + | [" | ||
| + | [" | ||
| + | [" | ||
| + | [" | ||
| + | [" | ||
| + | ]; | ||
| + | |||
| + | function nomCompetence(row) { | ||
| + | return row && row.cells[3] ? row.cells[3].innerText.trim() : ""; | ||
| + | } | ||
| + | |||
| + | function trouverCompetence(nom) { | ||
| + | const cible = normaliserNom(nom); | ||
| + | return Array.from(tbody.querySelectorAll(" | ||
| + | normaliserNom(nomCompetence(row)) === cible | ||
| + | ) || null; | ||
| + | } | ||
| + | |||
| + | // Utilise l' | ||
| + | function nomOfficiel(nom) { | ||
| + | const ligne = trouverCompetence(nom); | ||
| + | return ligne ? nomCompetence(ligne) : nom; | ||
| + | } | ||
| + | |||
| + | function estSelectionnee(row) { | ||
| + | if (!row) return false; | ||
| + | if (row.dataset.repeatable === " | ||
| + | return getSkillCount(row) > 0; | ||
| + | } | ||
| + | const checkbox = row.querySelector(" | ||
| + | return !!checkbox && checkbox.checked; | ||
| + | } | ||
| + | |||
| + | function prerequisDe(row) { | ||
| + | const nom = nomCompetence(row); | ||
| + | const cle = Object.keys(PREREQUIS).find( | ||
| + | item => normaliserNom(item) === normaliserNom(nom) | ||
| + | ); | ||
| + | return cle ? PREREQUIS[cle] : []; | ||
| + | } | ||
| + | |||
| + | function incompatiblesDe(row) { | ||
| + | const nom = normaliserNom(nomCompetence(row)); | ||
| + | const resultat = []; | ||
| + | INCOMPATIBILITES.forEach(([a, | ||
| + | if (normaliserNom(a) === nom) resultat.push(b); | ||
| + | else if (normaliserNom(b) === nom) resultat.push(a); | ||
| + | }); | ||
| + | return resultat; | ||
| + | } | ||
| + | |||
| + | function prerequisManquants(row) { | ||
| + | return prerequisDe(row).filter(nom => | ||
| + | !estSelectionnee(trouverCompetence(nom)) | ||
| + | ); | ||
| + | } | ||
| + | |||
| + | function incompatibilitesActives(row) { | ||
| + | return incompatiblesDe(row).filter(nom => | ||
| + | estSelectionnee(trouverCompetence(nom)) | ||
| + | ); | ||
| + | } | ||
| + | |||
| + | function prerequisRespectes(row) { | ||
| + | return prerequisManquants(row).length === 0; | ||
| + | } | ||
| + | |||
| + | function incompatibilitePresente(row) { | ||
| + | return incompatibilitesActives(row).length > 0; | ||
| + | } | ||
| + | |||
| + | function raisonRegle(row) { | ||
| + | const manquants = prerequisManquants(row); | ||
| + | if (manquants.length) { | ||
| + | return " | ||
| + | } | ||
| + | |||
| + | const incompatibles = incompatibilitesActives(row); | ||
| + | if (incompatibles.length) { | ||
| + | return "Est incompatible avec " + incompatibles.join(" | ||
| + | } | ||
| + | |||
| + | return ""; | ||
| + | } | ||
| + | |||
| + | function initialiserCommentaires() { | ||
| + | const entete = table.querySelector(" | ||
| + | if (entete && entete.cells.length === 9) { | ||
| + | const th = document.createElement(" | ||
| + | th.innerText = " | ||
| + | entete.appendChild(th); | ||
| + | } | ||
| + | |||
| + | tbody.querySelectorAll(" | ||
| + | if (row.cells.length === 9) row.insertCell(-1); | ||
| + | const cellule = row.cells[9]; | ||
| + | if (!cellule) return; | ||
| + | |||
| + | const commentaires = []; | ||
| + | const prerequis = prerequisDe(row); | ||
| + | const incompatibles = incompatiblesDe(row); | ||
| + | |||
| + | if (prerequis.length) { | ||
| + | commentaires.push( | ||
| + | " | ||
| + | ); | ||
| + | } | ||
| + | if (incompatibles.length) { | ||
| + | commentaires.push( | ||
| + | "Est incompatible avec " + incompatibles.map(nomOfficiel).join(" | ||
| + | ); | ||
| + | } | ||
| + | |||
| + | cellule.innerText = commentaires.join(" | ||
| + | cellule.title = cellule.innerText; | ||
| + | }); | ||
| + | } | ||
| + | |||
| + | // Si un prérequis est retiré, retire aussi les compétences qui en dépendent. | ||
| + | function retirerSelectionsInvalides() { | ||
| + | let changement = true; | ||
| + | while (changement) { | ||
| + | changement = false; | ||
| + | tbody.querySelectorAll(" | ||
| + | if (!estSelectionnee(row)) return; | ||
| + | if (!prerequisRespectes(row) || incompatibilitePresente(row)) { | ||
| + | if (row.dataset.repeatable === " | ||
| + | const compteur = row.querySelector(" | ||
| + | if (compteur) compteur.innerText = " | ||
| + | } else { | ||
| + | const checkbox = row.querySelector(" | ||
| + | if (checkbox) checkbox.checked = false; | ||
| + | } | ||
| + | changement = true; | ||
| + | } | ||
| + | }); | ||
| + | } | ||
| + | } | ||
| function resetTable() { | function resetTable() { | ||
| Ligne 1602: | Ligne 1805: | ||
| const tree = row.dataset.cat; | const tree = row.dataset.cat; | ||
| const level = parseInt(row.dataset.niv, | const level = parseInt(row.dataset.niv, | ||
| + | |||
| + | if (!prerequisRespectes(row) || incompatibilitePresente(row)) { | ||
| + | return false; | ||
| + | } | ||
| if (tree === " | if (tree === " | ||
| Ligne 1624: | Ligne 1831: | ||
| function getLockReason(row) { | function getLockReason(row) { | ||
| + | |||
| + | const raison = raisonRegle(row); | ||
| + | if (raison) return raison; | ||
| const tree = row.dataset.cat; | const tree = row.dataset.cat; | ||
| Ligne 1719: | Ligne 1929: | ||
| return; | return; | ||
| } | } | ||
| + | } else { | ||
| + | retirerSelectionsInvalides(); | ||
| } | } | ||
| Ligne 1753: | Ligne 1965: | ||
| * prérequis de son niveau. | * prérequis de son niveau. | ||
| */ | */ | ||
| - | if (!skillRequirementMet(row)) { | + | if (!skillRequirementMet(row) || |
| + | !prerequisRespectes(row) || | ||
| + | incompatibilitePresente(row)) { | ||
| showWarning( | showWarning( | ||
| - | getLockReason(row) | + | getLockReason(row) |
| ); | ); | ||
| Ligne 1891: | Ligne 2105: | ||
| const level = parseInt(row.dataset.niv, | const level = parseInt(row.dataset.niv, | ||
| - | |||
| const capacity = getSpellCapacity(level); | const capacity = getSpellCapacity(level); | ||
| const selected = getSelectedSpells(level); | const selected = getSelectedSpells(level); | ||
| - | return selected <= capacity; | + | return |
| + | !incompatibilitePresente(row) && | ||
| + | | ||
| } | } | ||
| Ligne 1914: | Ligne 2129: | ||
| if (!this.checked) { | if (!this.checked) { | ||
| + | retirerSelectionsInvalides(); | ||
| updateAll(); | updateAll(); | ||
| return; | return; | ||
| Ligne 1927: | Ligne 2143: | ||
| const capacity = | const capacity = | ||
| getSpellCapacity(level); | getSpellCapacity(level); | ||
| + | const raison = raisonRegle(row); | ||
| - | if (capacity === 0) { | + | |
| + | showWarning(raison); | ||
| + | } else if (capacity === 0) { | ||
| showWarning( | showWarning( | ||
| Ligne 1999: | Ligne 2218: | ||
| let locked = false; | let locked = false; | ||
| - | if (!skillRequirementMet(row)) { | + | if (!skillRequirementMet(row) || |
| + | !prerequisRespectes(row) || | ||
| + | incompatibilitePresente(row)) { | ||
| locked = true; | locked = true; | ||
| } | } | ||
| Ligne 2023: | Ligne 2244: | ||
| const locked = | const locked = | ||
| !skillRequirementMet(row) || | !skillRequirementMet(row) || | ||
| + | !prerequisRespectes(row) || | ||
| + | incompatibilitePresente(row) || | ||
| ( | ( | ||
| level === 4 && | level === 4 && | ||
| Ligne 2087: | Ligne 2310: | ||
| } | } | ||
| - | if (!skillRequirementMet(row)) { | + | if (!skillRequirementMet(row) || |
| + | !prerequisRespectes(row) || | ||
| + | incompatibilitePresente(row)) { | ||
| canAdd = false; | canAdd = false; | ||
| } | } | ||
| Ligne 2126: | Ligne 2351: | ||
| const locked = | const locked = | ||
| capacity === 0 || | capacity === 0 || | ||
| + | !prerequisRespectes(row) || | ||
| + | incompatibilitePresente(row) || | ||
| ( | ( | ||
| !checkbox.checked && | !checkbox.checked && | ||
| Ligne 2304: | Ligne 2531: | ||
| | | ||
| ========================================================= */ | ========================================================= */ | ||
| + | |||
| + | initialiserCommentaires(); | ||
| setupNormalSkills(); | setupNormalSkills(); | ||
competence_saison3_full_v2.1792581639.txt.gz · Dernière modification : 2026/10/21 13:20 de nanaki
