From d91013cf6b9dd356efd886f3350f2a248d362ccf Mon Sep 17 00:00:00 2001 From: Mako88 Date: Sun, 25 Oct 2020 21:45:40 -0500 Subject: [PATCH 1/7] Count as a miss if action score is less than or equal to the challenge dice (fixes #32) --- js/state.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/js/state.js b/js/state.js index bea188e..90c7704 100644 --- a/js/state.js +++ b/js/state.js @@ -767,7 +767,7 @@ class RollAction extends Action { let result = "> Weak Hit"; let totalAction = actionValue + statAddValue + this.genericAdd; - if (totalAction < this.challenge[0] && totalAction < this.challenge[1]) { + if (totalAction <= this.challenge[0] && totalAction <= this.challenge[1]) { result = "> Miss" } else if (totalAction > this.challenge[0] && totalAction > this.challenge[1]) { result = "> Strong Hit" From 5ba26a96e2e1b29c31cf3c37aa7521ee5d92456d Mon Sep 17 00:00:00 2001 From: Alex Larioza <950984+SHiLLySiT@users.noreply.github.com> Date: Thu, 30 Nov 2023 09:12:54 -0800 Subject: [PATCH 2/7] Update readme.md --- readme.md | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/readme.md b/readme.md index f39cc36..a3aa341 100644 --- a/readme.md +++ b/readme.md @@ -1,7 +1,7 @@ # Overview IronWriter is an open-source writing tool for solo playthroughs of the free tabletop RPG [Ironsworn](https://www.ironswornrpg.com/). Focus on writing your story and let IronWriter automatically manage your character sheet. -__IMPORTANT NOTE__: IronWriter is currently in active development and should be considered unstable until the v1.0 milestone is reached, so please export and backup any data important to you. Backward compatibility is not guaranteed. +⚠ __IMPORTANT NOTE__: IronWriter is on an indefinte development hiatus. It also has not yet reached v1.0 and should be considered unstable, so please export and backup any data important to you. Backward compatibility is not guaranteed. ## Current Features * Use simple markup embedded in your story to automatically update your character sheet @@ -217,6 +217,12 @@ asset {modifier} removeAsset ``` +You must add an asset before adding perks or properties, e.g. +``` +[asset Ritualist] // add asset first +[asset Ritualist 1] // add first perk point +``` + ### Parameters * `` The name of the asset. * `` Unlocks the perk in the specified slot. From 944b5cf0de0cb62ff8750c4971cae777ef1769cf Mon Sep 17 00:00:00 2001 From: MLD-Rennes Date: Thu, 24 Apr 2025 22:00:33 +0200 Subject: [PATCH 3/7] Squashed commit of the following: commit 33cfd504881ae492cd3dbb39446d2d8caf4c1a36 Author: MLD-Rennes Date: Thu Apr 24 21:56:04 2025 +0200 translate Roll section Tranlate the Roll section and the Roll event in the history. commit 92da153bba7b6f2ccab38fe7cb464810b26acd9c Author: MLD-Rennes Date: Thu Apr 24 21:02:04 2025 +0200 translate Oracle (end) Finish the translation of the oracles. commit a9ff6dcbc0b97a26a8bfd134b9268054951e546f Author: MLD-Rennes Date: Mon Apr 21 20:33:25 2025 +0200 translate Oracle (beginning) The oracle file is duplicated for each language. The script is loaded dynamically in the ironwriter.js file. commit 96c765174ee782998c0c4fe66c5affa71357ed12 Author: MLD-Rennes Date: Mon Apr 21 16:44:49 2025 +0200 Translate header Translate the header and the related dialogs. commit ff8267ea9b7992515cc4b9a3191f239d1a6b3c09 Author: MLD-Rennes Date: Mon Apr 21 16:01:11 2025 +0200 Can choose the language. Add a variable to choose the language in the js file. commit b31b2e3543f01b688af77383f744e8746ece0a53 Author: MLD-Rennes Date: Mon Apr 21 15:52:31 2025 +0200 Translate Inventory Menu Translate name of the inventory menu and name of the Quantity property. commit 1ca5027dd448f456b8f33f94fbe2e9ca2e680efd Author: MLD-Rennes Date: Mon Apr 21 15:29:18 2025 +0200 Translate Assets Menu Translate the name of the assets menu. commit ca9a3e7806ca561d7eeb66d88e9d76d6b61bed15 Author: MLD-Rennes Date: Mon Apr 21 15:24:22 2025 +0200 Translate bonds menu Translate the name of the bonds menu. commit 55155d138eef6712c749297918f5935ce6927b77 Author: MLD-Rennes Date: Mon Apr 21 14:07:02 2025 +0200 Translate progress Translation of progress options and progress menu on the page. commit 9ac89e482f0ace5371feaa1cff8b1b2cad8960f2 Author: MLD-Rennes Date: Mon Apr 21 13:45:06 2025 +0200 Translate character menu Translate the character menu and the default name character for a new session. commit 9a12117b5f4e0447b19b1c5d53e4001b9b9934a2 Author: MLD-Rennes Date: Mon Apr 21 13:26:55 2025 +0200 Translate debilities Translate the debility name tags and the debility name shown on the page. commit cc8551c021c2cba058cadd114fef1fccdd8765f2 Author: MLD-Rennes Date: Mon Apr 21 13:05:26 2025 +0200 Correct Momentum Reset The momentum reset value is between 0 and 2. commit 9f5dcf6f3cad3b6b8ed2fb0e7932ba737f32bdd6 Author: MLD-Rennes Date: Mon Apr 21 13:00:59 2025 +0200 Translate Every Tags Translation of every tags in french. commit 83cbb7362d666c7de60f18ba86148c4da013ca1a Author: MLD-Rennes Date: Mon Apr 21 12:52:06 2025 +0200 Correction of the spent experience The experience spent was not visible because the variable used capitalized word but the tag is in lower case. commit 4fb407341d2eec59733f7ef8e74d0231e71793c0 Author: MLD-Rennes Date: Mon Apr 21 12:49:17 2025 +0200 Translate tag Translation of tag in french. The tag is given in french and converted in english to be processed. commit d867aa798076d969fad6af0cf86cdc1cd1c0ca9c Author: MLD-Rennes Date: Mon Apr 21 12:34:05 2025 +0200 Translate Stat Menu Translation of the stat menu on the index page. --- index.html | 2 +- js/ironwriter.js | 76 +- js/{oracles.js => oracles_EN.js} | 4 +- js/oracles_FR.js | 1267 ++++++++++++++++++++++++++++++ js/state.js | 36 +- js/translation.js | 375 +++++++++ 6 files changed, 1735 insertions(+), 25 deletions(-) rename js/{oracles.js => oracles_EN.js} (99%) create mode 100644 js/oracles_FR.js create mode 100644 js/translation.js diff --git a/index.html b/index.html index 27d9300..38df1c2 100644 --- a/index.html +++ b/index.html @@ -40,9 +40,9 @@ - + diff --git a/js/ironwriter.js b/js/ironwriter.js index 98c0859..04bddf4 100644 --- a/js/ironwriter.js +++ b/js/ironwriter.js @@ -17,11 +17,29 @@ You should have received a copy of the GNU General Public License along with this program. If not, see https://github.com/SHiLLySiT/IronWriter/blob/master/LICENSE.txt. */ - const VERSION = "0.3.2"; +const LANG = "FR"; const MAX_EXPERIENCE = 30; const MAX_PROGRESS = 10; +function loadOracles(lang){ + const oldScript = document.querySelector('script[data-dynamic="true"]'); + if (oldScript) { + oldScript.remove(); + } + + const newScript = document.createElement('script'); + newScript.type = 'text/javascript'; + newScript.src = `js/oracles_${lang}.js`; // ex: oracles_en.js + newScript.setAttribute("data-dynamic", "true"); + + newScript.onload = function () { + }; + + document.head.appendChild(newScript); +} + + const CHALLENGE_RANKS = { troublesome: 12, dangerous: 8, @@ -43,7 +61,7 @@ const STATS = { momentumMax: 0, momentumReset: 0, experience: 0, - experienceSpent: 0, + experiencespent: 0, bonds: 0, }; @@ -83,7 +101,14 @@ const BookmarkFilterTypeMapping = { 1: ['bond', 'unbond'], 2: ['fiction', 'meta'], 3: ['progress_add', 'progress_progress', 'progress_complete'] -}; +} + +const DefaultCharacterName = { + 'EN': "New character", + 'FR': "Nouveau personnage" +} + +let OracleIndication = "Ask the Oracle" let statElements = {}; for (let p in STATS) { @@ -134,6 +159,8 @@ let oldMode = false; let scrolledIndex = null; +loadOracles(LANG); + let session = new Session(); window.addEventListener("load", handleInit); @@ -203,6 +230,7 @@ function handleInit() { }; confirmDialog.root.addEventListener("MDCDialog:closed", handler); confirmDialog.content_.textContent = "Are you sure you want to import a session? Your current session will be lost."; + translateImportDialog(); confirmDialog.open(); }); @@ -219,7 +247,8 @@ function handleInit() { }; confirmDialog.root.addEventListener("MDCDialog:closed", handler); confirmDialog.content_.textContent = "Are you sure you want to start a new session? Your current session will be deleted."; - confirmDialog.open(); + translateNewDialog(); + confirmDialog.open(); }); document.getElementById("help").addEventListener("click", () => { @@ -251,6 +280,20 @@ function handleInit() { initAssets(); initInventory(); initBookmarks(); + + translateHeader(); + translateEntryTabs(); + translateStory(); + translateCharacterMenu(); + translateStatMenu(); + translateDebilityMenu(); + translateBondsMenu(); + translateProgressMenu(); + translateAssetsMenu(); + translateInventoryMenu(); + translateRollMenu(); + translateDoOracle(); + translateDoRoll(); window.requestAnimationFrame(() => { let str = localStorage.getItem("session"); @@ -275,7 +318,8 @@ function newSession() { session = new Session(); let initialMoment = new Moment("", EventType.None); - initialMoment.addAction(new CharacterNameAction("New Character")); + + initialMoment.addAction(new CharacterNameAction(DefaultCharacterName[LANG])); initialMoment.addAction(new StatAction("momentum", "=", 2)); initialMoment.addAction(new StatAction("momentumReset", "=", 2)); initialMoment.addAction(new StatAction("momentumMax", "=", 10)); @@ -361,7 +405,7 @@ function initRoll() { let rollSource = document.getElementById("roll-source"); let rollStats = document.getElementById("roll-stats"); let rollAdd = document.getElementById("roll-add"); - + let rollButton = document.getElementById("roll"); rollButton.addEventListener("click", () => { doRoll(rollStats.MDCSelect.value, rollAdd.value, rollSource.MDCSelect.value); @@ -380,7 +424,7 @@ function initOracle() { let container = template.parentElement; template.remove(); - for (let type in ORACLE) { + for (let type in window.ORACLE) { let item = template.cloneNode(true); item.querySelector(".js-value").textContent = type; item.addEventListener("click", () => handleSelectOracle(type)); @@ -465,6 +509,8 @@ function initBookmarks() { // While you can pass an object to the `close` call, the docs indicate it should be a string, so... bookmarksDialog.close("bookmarkSelected:" + eventIndex); }); + + translateBookmarksDialog(); document.getElementById("bookmarks").addEventListener("click", () => { bookmarksDialog.open(); @@ -513,9 +559,12 @@ function createResource(resource, template) { if (resource.properties[p] === undefined) { continue; } + + let name = resource.properties[p].name; + name = translateQuantityProperty(name); let e = document.createElement("div"); - e.textContent = resource.properties[p].name + ": " + resource.properties[p].value; + e.textContent = name + ": " + resource.properties[p].value; properties.appendChild(e); } @@ -556,6 +605,7 @@ function createProgressTrack(name, rank, roll) { if (name == null && rank == null) { newTrack.querySelector(".meta").remove(); } else { + rank = translateProgressRank(rank); newTrack.querySelector(".name").textContent = name + " (" + rank + ")"; } return newTrack; @@ -607,7 +657,7 @@ function handleSelectOracle(type) { } function doOracleRoll(type) { let result = getOracleValue(ORACLE[type]); - return "Ask the Oracle (" + type + "): " + result; + return OracleIndication + " (" + type + "): " + result; } function getOracleValue(value) { if (typeof (value) == "string") { @@ -817,7 +867,7 @@ function refresh() { available.style.display = "none"; if (i < session.state.stats.experience) { - if (i < session.state.stats.experienceSpent) { + if (i < session.state.stats.experiencespent) { available.style.display = "block"; } else { spent.style.display = "block"; @@ -984,6 +1034,8 @@ function createMoment(input, type, index) { // Ignore case for tags args[0] = args[0].toLowerCase(); + // Translate the tag + args[0] = translateTag(args[0]); if (args[0] == "bond") { action = addBond(args); @@ -1149,6 +1201,7 @@ function removeDebility(args) { } let debilityName = args[1].toLowerCase(); + debilityName = translateDebility(debilityName); if (DEBILITIES[debilityName] === undefined) { return; } @@ -1162,6 +1215,7 @@ function addDebility(args) { } let debilityName = args[1].toLowerCase(); + debilityName = translateDebility(debilityName); if (DEBILITIES[debilityName] === undefined) { return; } @@ -1178,6 +1232,8 @@ function progress(args) { let option = (args[2] === undefined) ? undefined : args[2].toLowerCase(); let progress = new ProgressAction(id); progress.progressName = args[1]; + + option = translateProgressOption(option); if (option === undefined) { // mark progress diff --git a/js/oracles.js b/js/oracles_EN.js similarity index 99% rename from js/oracles.js rename to js/oracles_EN.js index 4bbf82a..91cab94 100644 --- a/js/oracles.js +++ b/js/oracles_EN.js @@ -16,8 +16,8 @@ along with this program. If not, see https://github.com/SHiLLySiT/IronWriter/blob/master/LICENSE.txt. */ -const ORACLE = { - "Generic Roll": { +window.ORACLE = { + "Generic roll": { 1: "1", 2: "2", 3: "3", diff --git a/js/oracles_FR.js b/js/oracles_FR.js new file mode 100644 index 0000000..bf5d95b --- /dev/null +++ b/js/oracles_FR.js @@ -0,0 +1,1267 @@ +/* + IronWriter is an open-source writing tool for solo playthroughs of the free tabletop RPG Ironsworn. + Copyright (C) 2019 Alex Larioza + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see https://github.com/SHiLLySiT/IronWriter/blob/master/LICENSE.txt. + */ +window.ORACLE = { + "Presque Certain": { + 10: "Non", + 100: "Oui" + }, + + "Probable": { + 25: "Non", + 100: "Oui" + }, + + "50/50": { + 50: "Non", + 100: "Oui" + }, + + "Improbable": { + 75: "Non", + 100: "Oui" + }, + + "Chance Infime": { + 90: "Non", + 100: "Oui" + }, + + "Actions": { + 1: "comploter", + 2: "fracasser", + 3: "affaiblir", + 4: "initier", + 5: "créer", + 6: "jurer", + 7: "venger", + 8: "garder", + 9: "vaincre", + 10: "contrôler", + 11: "briser", + 12: "risquer", + 13: "capituler", + 14: "inspecter", + 15: "piller", + 16: "esquiver", + 17: "agresser", + 18: "dévier", + 19: "menacer", + 20: "attaquer", + 21: "quitter", + 22: "préserver", + 23: "manipuler", + 24: "retirer", + 25: "éliminer", + 26: "priver", + 27: "reddition", + 28: "investiguer", + 29: "retenir", + 30: "concentrer", + 31: "découvrir", + 32: "rompre", + 33: "aider", + 34: "maintenir", + 35: "faiblir", + 36: "supprimer", + 37: "chasser", + 38: "partager", + 39: "détruire", + 40: "éviter", + 41: "rejeter", + 42: "demander", + 43: "explorer", + 44: "soutenir", + 45: "saisir", + 46: "déplorer", + 47: "révéler", + 48: "récolter", + 49: "défier", + 50: "transformer", + 51: "persévérer", + 52: "servir", + 53: "commencer", + 54: "déplacer", + 55: "coordonner", + 56: "résister", + 57: "attendre", + 58: "impressionner", + 59: "prendre", + 60: "opposer", + 61: "capturer", + 62: "envahir", + 63: "défier", + 64: "acquérir", + 65: "protéger", + 66: "finir", + 67: "renforcer", + 68: "restaurer", + 69: "avancer", + 70: "commander", + 71: "refuser", + 72: "trouver", + 73: "livrer", + 74: "cacher", + 75: "fortifier", + 76: "trahir", + 77: "sécuriser", + 78: "arriver", + 79: "affecter", + 80: "changer", + 81: "défendre", + 82: "débattre", + 83: "supporter", + 84: "suivre", + 85: "construire", + 86: "localiser", + 87: "endurer", + 88: "relâcher", + 89: "perdre", + 90: "réduire", + 91: "aggraver", + 92: "distraire", + 93: "voyager", + 94: "escorter", + 95: "apprendre", + 96: "communiquer", + 97: "partir", + 98: "fouiller", + 99: "charger", + 100: "invoquer" + }, + + "Thèmes": { + 1: "risque", + 2: "capacité", + 3: "prix", + 4: "allié", + 5: "bataille", + 6: "sécurité", + 7: "survie", + 8: "arme", + 9: "blessure", + 10: "abri", + 11: "meneur", + 12: "peur", + 13: "temps", + 14: "devoir", + 15: "secret", + 16: "innocence", + 17: "renommée", + 18: "direction", + 19: "mort", + 20: "honneur", + 21: "labeur", + 22: "solution", + 23: "outil", + 24: "équilibre", + 25: "amour", + 26: "barrière", + 27: "création", + 28: "déclin", + 29: "commerce", + 30: "lien", + 31: "espoir", + 32: "superstition", + 33: "paix", + 34: "tromperie", + 35: "histoire", + 36: "monde", + 37: "voeu", + 38: "protection", + 39: "nature", + 40: "opinion", + 41: "fardeau", + 42: "vengeance", + 43: "opportunité", + 44: "faction", + 45: "danger", + 46: "corruption", + 47: "liberté", + 48: "dette", + 49: "haine", + 50: "possession", + 51: "étranger", + 52: "passage", + 53: "territoire", + 54: "créature", + 55: "maladie", + 56: "avantage", + 57: "sang", + 58: "langage", + 59: "rumeur", + 60: "faiblesse", + 61: "cupidité", + 62: "famille", + 63: "ressource", + 64: "structure", + 65: "rêve", + 66: "communauté", + 67: "guerre", + 68: "présage", + 69: "récompense", + 70: "destin", + 71: "élan", + 72: "pouvoir", + 73: "mémoire", + 74: "ruine", + 75: "mysticisme", + 76: "rival", + 77: "problème", + 78: "idée", + 79: "représailles", + 80: "santé", + 81: "communauté", + 82: "ennemi", + 83: "religion", + 84: "esprit", + 85: "gloire", + 86: "désolation", + 87: "force", + 88: "connaissance", + 89: "vérité", + 90: "quête", + 91: "fierté", + 92: "perte", + 93: "loi", + 94: "voie", + 95: "avertissement", + 96: "relation", + 97: "richesse", + 98: "maison", + 99: "stratégie", + 100: "provisions" + }, + + "Régions": { + 10: "Les Îles-Barrières", + 20: "La Côte Déchirée", + 30: "Les Sylves Profondes", + 40: "Les Terres Inondées", + 50: "Les Havres", + 60: "L'Arrière-Pays", + 70: "Les Collines des Tempêtes", + 80: "Les Montagnes Voilées", + 90: "Le Désert Brisé", + 100: "Ailleurs" + }, + + "Lieux": { + 1: "Repaire", + 2: "Ruine", + 3: "Mine", + 4: "Désert", + 5: "Site Mystique", + 6: "Chemin", + 7: "Avant-poste", + 8: "Mur", + 9: "Champ de Bataille", + 10: "Taudis", + 11: "Source d'eau", + 12: "Antre", + 13: "Fort", + 14: "Pont", + 15: "Camp", + 16: "Cairn/Tombe", + 18: "Caravane", + 20: "Chute d'eau", + 22: "Caverne", + 24: "Marais", + 26: "Fange", + 28: "Ravin", + 30: "Route", + 32: "Arbre", + 34: "Étang", + 36: "Champs", + 38: "Marécage", + 40: "Ferme", + 42: "Rapides", + 44: "Col", + 46: "Piste", + 48: "Clairière", + 50: "Plaine", + 52: "Crête", + 54: "Falaise", + 56: "Bosquet", + 58: "Village", + 60: "Tourbière", + 62: "Broussailles", + 64: "Passage à gué", + 66: "Vallée", + 68: "Baie/Fjord", + 70: "Contreforts", + 72: "Lac", + 75: "Rivière", + 79: "Forêt", + 83: "Côte", + 88: "Colline", + 93: "Montagne", + 99: "Bois", + 100: "Anomalie" + }, + + "Eaux côtières": { + 1: "Flotte", + 2: "Banc d'algues sargasses", + 3: "Débris flottants", + 4: "Site Mystique", + 5: "Antre", + 10: "Épave", + 15: "Port", + 22: "Navire", + 30: "Récifs", + 38: "Fjord", + 46: "Estuaire", + 54: "Crique", + 62: "Baie", + 70: "Glace", + 85: "Île", + 99: "Eaux libres", + 100: "Anomalie" + }, + + "Descriptions de lieux": { + 2: "haut(e)", + 4: "isolé(e)", + 6: "exposé(e)", + 8: "petit(e)", + 10: "brisé(e)", + 12: "varié(e)", + 14: "grossier(e)", + 16: "sombre", + 18: "ténébreux(se)", + 20: "contesté(e)", + 22: "sinistre", + 24: "sauvage", + 26: "fertile", + 28: "bloqué(e)", + 30: "antique", + 32: "périlleux(se)", + 34: "caché(e)", + 36: "occupé(e)", + 38: "riche", + 40: "massif(ve)", + 42: "sauvage", + 44: "défendu(e)", + 46: "flêtri(e)", + 48: "mystique", + 50: "inaccessible", + 52: "protégé(e)", + 54: "abandonné(e)", + 56: "large", + 58: "répugnant(e)", + 60: "mort(e)", + 62: "dévasté(e)", + 64: "stérile", + 66: "froid(e)", + 68: "infesté(e)", + 70: "bas(se)", + 72: "magnifique", + 74: "abondant(e)", + 76: "verdoyant(e)", + 78: "inondé(e)", + 80: "vide", + 82: "étrange", + 84: "corrompu(e)", + 86: "paisible", + 88: "oublié(e)", + 90: "vaste", + 92: "colonisé(e)", + 94: "dense", + 96: "civilisé(e)", + 98: "désolé(e)", + 100: "enclavé(e)" + }, + + "Noms de villages": { + 15: { + 10: "Haut-mont", + 20: "Eau-saumâtre", + 30: "Bois-gelé", + 40: "Crête-rouge", + 50: "Arbre-mont", + 60: "Pierre-gué", + 70: "Eau-profonde", + 80: "Blanche-cascade", + 90: "Grise-falaise", + 100: "Trois-rivières" + }, + 30: { + 10: "Pont-blanc", + 20: "Fort-solitude", + 30: "Haut-cairn", + 40: "Hall-rouge", + 50: "Sombre-puits", + 60: "Bois-muraille", + 70: "Pierre-tour", + 80: "Hall-épine", + 90: "Blaise-foyer", + 100: "Friche-champ" + }, + 45: { + 10: "Falaise-corneille", + 20: "Ours-marque", + 30: "Roc-loup", + 40: "Aigle-pic", + 50: "Nid-wyverne", + 60: "Bois-sanglier", + 70: "Val-renard", + 80: "Primal-vigie", + 90: "Champ-d'élan", + 100: "Ombre-dragon" + }, + 60: { + 10: "Brise-épée", + 20: "Tombe-idiot", + 30: "Première-rencontre", + 40: "Brise-heaume", + 50: "Deuil-hantise", + 60: "La Résistance d'Olgar", + 70: "Eaux-perdues", + 80: "Les Lamentations de Rojirra", + 90: "Dernière-marche", + 100: "Chute-roc" + }, + 75: { + 10: "Abon", + 20: "Daveza", + 30: "Damula", + 40: "Essus", + 50: "Sina", + 60: "Kazeera", + 70: "Khazu", + 80: "Sova", + 90: "Nabuma", + 100: "Tiza" + }, + 90: { + 10: "Hiver-foyer", + 20: "Vent-refuge", + 30: "Halte-tempête", + 40: "Triste-givre", + 50: "Printemps-marée", + 60: "Tourbe-crépuscule", + 70: "Givre-roc", + 80: "Printemps-ruisseau", + 90: "Fend-la-glace", + 100: "Chant-d'été" + }, + 100: { + 10: "Une ressource commerciale (Fer-maison)", + 20: "Une ville du Vieux Monde (Nouvelle-Arkesh)", + 30: "Un fondateur ou un colon célèbre (Le Hall de Kei)", + 40: "Une déesse (Elisora)", + 50: "Un artefact historique (Noir-heaume)", + 60: "L'un des peuples premiers-nés (Elfe-ruisseau)", + 70: "Un nom ou un mot elfique (Nessana)", + 80: "Une croyance ou un lieu mythique (Marche-fantôme)", + 90: "Un terme positif (Espoir)", + 100: "Un terme négatif (Abandon)" + } + }, + + "Noms de villages (générateur rapide)": [ + { + 4: "Triste", + 8: "Vert(e)", + 12: "Loup", + 16: "Corneille", + 20: "Gris(e)", + 24: "Rouge", + 28: "Hache", + 32: "Grand(e)", + 36: "Bois", + 40: "Bas(se)", + 44: "Blanc(he)", + 48: "Tempête", + 52: "Noir(e)", + 56: "Deuil", + 60: "Neuf(ve)", + 64: "Pierre", + 68: "Sinistre", + 72: "Perdu(e)", + 76: "Haut(e)", + 80: "Roche", + 84: "Bouclier", + 88: "Épée", + 92: "Givre", + 96: "Épine", + 100: "Long(ue)" + }, + { + 4: "-tourbière", + 8: "-gué", + 12: "-roc", + 16: "-garde", + 20: "-espoir", + 24: "-bois", + 28: "-crête", + 32: "-pierre", + 36: "-havre", + 40: "-chute(s)", + 44: "-rivière", + 48: "-champ", + 52: "-colline", + 56: "-pont", + 60: "-marque", + 64: "-cairn", + 68: "-terre", + 72: "-hall", + 76: "-mont", + 80: "-roche", + 84: "-ruisseau", + 88: "-tumulus", + 92: "-ferme", + 96: "-maison", + 100: "-mèche" + } + ], + + "Troubles de villages": { + 2: "Les étrangers sont rejetés", + 4: "Dangereuse découverte", + 6: "Terrible présage", + 8: "Catastrophe naturelle", + 10: "De vieilles blessures sont rouvertes", + 12: "Un objet important est perdu", + 14: "Une personne est capturée", + 16: "Phénomène mystérieux", + 18: "Révolte contre une autorité", + 20: "Paria vengeur", + 22: "Village rival", + 24: "La nature riposte", + 26: "Quelqu’un a disparu", + 28: "Une production s’interrompt", + 30: "Série de meurtres mystérieux", + 32: "Une dette arrive à échéance", + 34: "Gouvernance injuste", + 36: "Accident désastreux", + 38: "De mèche avec l’ennemi", + 40: "Pillards s’attaquant aux plus faibles", + 42: "Passé maudit", + 44: "Un innocent est accusé", + 46: "Corrompu par la magie noire", + 48: "Isolé par le mauvais temps", + 50: "Les provisions sont rationnées", + 52: "Épidémie", + 54: "Des alliés deviennent des ennemis", + 56: "L’attaque est imminente", + 58: "Caravane égarée", + 60: "Un sombre secret est révélé", + 62: "Expédition urgente", + 64: "Un meneur tombe", + 66: "Conflit inter-familial", + 68: "Gouvernance incompétente", + 70: "Va-t-en-guerre irréfléchi", + 72: "Bête en chasse", + 74: "Trahi par les siens", + 76: "Violation de trêve", + 78: "Hantise déchaînée", + 80: "Conflit avec les premiers-nés", + 82: "Route commerciale bloquée", + 84: "Pris dans les tirs croisés", + 86: "Un étranger provoque une discorde", + 88: "Un événement important est menacé", + 90: "Dangereuse tradition", + 100: "Relancer les dés" + }, + + "Rôles de personnage": { + 2: "Criminel", + 4: "Guérisseur", + 6: "Bandit", + 9: "Guide", + 12: "Saltimbanque", + 15: "Mineur", + 18: "Mercenaire", + 21: "Paria", + 24: "Vagabond", + 27: "Bûcheron", + 30: "Voyageur", + 33: "Mystique", + 36: "Prêtre", + 39: "Marin", + 42: "Pèlerin", + 45: "Voleur", + 48: "Aventurier", + 51: "Glaneur", + 54: "Meneur", + 58: "Garde", + 62: "Artisan", + 66: "Éclaireur", + 70: "Berger", + 74: "Pécheur", + 79: "Guerrier", + 84: "Chasseur", + 89: "Pillard", + 94: "Marchand", + 99: "Fermier", + 100: "Rôle inhabituel" + }, + + "Objectifs de personnage": { + 3: "Obtenir un objet", + 6: "Passer un accord", + 9: "Construire une relation", + 12: "Détruire une relation", + 15: "Chercher la vérité", + 18: "Régler une dette", + 21: "Réfuter un mensonge", + 24: "Nuire à un rival", + 27: "Guérir un malade", + 30: "Trouver une personne", + 33: "Trouver un foyer", + 36: "S'emparer du pouvoir", + 39: "Restaurer une relation", + 42: "Créer un objet", + 45: "Voyager vers un lieu", + 48: "S'emparer de provisions", + 51: "Se rebeller contre l'autorité", + 54: "Collecter une dette", + 57: "Protéger un secret", + 60: "Partager sa foi", + 63: "S'enrichir", + 66: "Protéger une personne", + 69: "Protéger lestatus quo", + 72: "Gagner en prestige", + 75: "Défendre un lieu", + 78: "Redresser un tort", + 81: "Assurer un devoir", + 84: "Acquérir un savoir", + 87: "Prouver sa valeur", + 90: "Trouver la rédemption", + 92: "Échapper à quelque chose", + 95: "Résoudre un différent", + 100: "Relancer les dés." + }, + + "Descriptions de personnage": { + 1: "Stoïque", + 2: "Attirant(e)", + 3: "Passif(ve)", + 4: "Hautain(e)", + 5: "Affectueux(se)", + 6: "Généreux(se)", + 7: "Arrogant(e)", + 8: "Armé(e)", + 9: "Malin(gne)", + 10: "Brave", + 11: "Laid(e)", + 12: "Sociable", + 13: "Condamné(e)", + 14: "Bien entouré(e)", + 15: "Audacieux(se)", + 16: "Jaloux(se)", + 17: "Colérique", + 18: "Actif(ve)", + 19: "Suspicieux(se)", + 20: "Hostile", + 21: "Cœur de pierre", + 22: "Prospère", + 23: "Talentueux(se)", + 24: "Expérimenté(e)", + 25: "Trompeur(se)", + 26: "Ambitieux(se)", + 27: "Agressif(ve)", + 28: "Vaniteux(se)", + 29: "Fier(e)", + 30: "Sévère", + 31: "Dépendant(e)", + 32: "Méfiant(e)", + 33: "Fort(e)", + 34: "Sagace", + 35: "Dangereux(se)", + 36: "Décalé(e)", + 37: "Joyeux(se)", + 38: "Défiguré(e)", + 39: "Intolérant(e)", + 40: "Compétent(e)", + 41: "Pingre", + 42: "Timide", + 43: "Impassible", + 44: "Sauvage", + 45: "Amer(e)", + 46: "Rusé(e)", + 47: "Repentant(e)", + 48: "Chaleureux(se)", + 49: "Charmant(e)", + 50: "Insouciant(e)", + 51: "Critique", + 52: "Prudent(e)", + 53: "Débrouillard(e)", + 54: "Fatigué(e)", + 55: "Blessé(e)", + 56: "Anxieux(se)", + 57: "Puissant(e)", + 58: "Athlétique", + 59: "Motivé(e)", + 60: "Cruel(le)", + 61: "Calme", + 62: "Honnête", + 63: "Infâme", + 64: "Mourant(e)", + 65: "Reclus(e)", + 66: "Artiste", + 67: "Invalide", + 68: "Confus(e)", + 69: "Manipulateur(trice)", + 70: "Relaxé(e)", + 71: "Discret(e)", + 72: "Confident(e)", + 73: "Faible", + 74: "Amical(e)", + 75: "Sage", + 76: "Influent(e)", + 77: "Jeune", + 78: "Aventureux(se)", + 79: "Opprimé(e)", + 80: "Vengeur(esse)", + 81: "Coopératif(ve)", + 82: "Armuré(e)", + 83: "Apathique", + 84: "Déterminé(e)", + 85: "Loyal(e)", + 86: "Malade", + 87: "Religieux(se)", + 88: "Égoïste", + 89: "Vieux(Vieille)", + 90: "Fervent(e)", + 91: "Violent(e)", + 92: "Agréable", + 93: "Impétueux(se)", + 94: "Obstiné(e)", + 95: "Incompétent(e)", + 96: "Cupide", + 97: "Couard(e)", + 98: "Obsédé(e)", + 99: "Imprudent(e)", + 100: "Fer-juré" + }, + + "Noms des Peuples du Fer": { + 1: "Solana", + 2: "Keelan", + 3: "Cadigan", + 4: "Sola", + 5: "Kodroth", + 6: "Kione", + 7: "Katja", + 8: "Tio", + 9: "Artiga", + 10: "Eos", + 11: "Bastien", + 12: "Elli", + 13: "Maura", + 14: "Haleema", + 15: "Abella", + 16: "Morter", + 17: "Wulan", + 18: "Mai", + 19: "Farina", + 20: "Pearce", + 21: "Wynne", + 22: "Haf", + 23: "Aeddon", + 24: "Khinara", + 25: "Milla", + 26: "Nakata", + 27: "Kynan", + 28: "Kiah", + 29: "Jaggar", + 30: "Beca", + 31: "Ikram", + 32: "Melia", + 33: "Sidan", + 34: "Deshi", + 35: "Tessa", + 36: "Sibila", + 37: "Morien", + 38: "Mona", + 39: "Padma", + 40: "Avella", + 41: "Naila", + 42: "Lio", + 43: "Cera", + 44: "Ithela", + 45: "Zhan", + 46: "Kaivan", + 47: "Valeri", + 48: "Hirsham", + 49: "Pemba", + 50: "Edda", + 51: "Lestara", + 52: "Lago", + 53: "Elstan", + 54: "Saskia", + 55: "Kabeera", + 56: "Caldas", + 57: "Nisus", + 58: "Serene", + 59: "Chenda", + 60: "Themon", + 61: "Erin", + 62: "Alban", + 63: "Parcell", + 64: "Jelma", + 65: "Willa", + 66: "Nadira", + 67: "Gwen", + 68: "Amara", + 69: "Masias", + 70: "Kanno", + 71: "Razeena", + 72: "Mira", + 73: "Perella", + 74: "Myrick", + 75: "Qamar", + 76: "Kormak", + 77: "Zura", + 78: "Zanita", + 79: "Brynn", + 80: "Tegan", + 81: "Pendry", + 82: "Quinn", + 83: "Fanir", + 84: "Glain", + 85: "Emelyn", + 86: "Kendi", + 87: "Althus", + 88: "Leela", + 89: "Ishana", + 90: "Flint", + 91: "Delkash", + 92: "Nia", + 93: "Nan", + 94: "Keeara", + 95: "Katania", + 96: "Morell", + 97: "Temir", + 98: "Bas", + 99: "Sabine", + 100: "Tallus", + 101: "Segura", + 102: "Gethin", + 103: "Bataar", + 104: "Basira", + 105: "Joa", + 106: "Glynn", + 107: "Toran", + 108: "Arasen", + 109: "Kuron", + 110: "Griff", + 111: "Owena", + 112: "Adda", + 113: "Euros", + 114: "Kova", + 115: "Kara", + 116: "Morgan", + 117: "Nanda", + 118: "Tamara", + 119: "Asha", + 120: "Delos", + 121: "Torgan", + 122: "Makari", + 123: "Selva", + 124: "Kimura", + 125: "Rhian", + 126: "Tristan", + 127: "Siorra", + 128: "Sayer", + 129: "Cortina", + 130: "Vesna", + 131: "Kataka", + 132: "Keyshia", + 133: "Mila", + 134: "Lili", + 135: "Vigo", + 136: "Sadia", + 137: "Malik", + 138: "Dag", + 139: "Kuno", + 140: "Reva", + 141: "Kai", + 142: "Kalina", + 143: "Jihan", + 144: "Hennion", + 145: "Abram", + 146: "Aida", + 147: "Myrtle", + 148: "Nekun", + 149: "Menna", + 150: "Tahir", + 151: "Sarria", + 152: "Nakura", + 153: "Akiya", + 154: "Talan", + 155: "Mattick", + 156: "Okoth", + 157: "Khulan", + 158: "Verena", + 159: "Beltran", + 160: "Del", + 161: "Ranna", + 162: "Alina", + 163: "Muna", + 164: "Mura", + 165: "Torrens", + 166: "Yuda", + 167: "Nazmi", + 168: "Ghalen", + 169: "Sarda", + 170: "Shona", + 171: "Kalidas", + 172: "Wena", + 173: "Sendra", + 174: "Kori", + 175: "Setara", + 176: "Lucia", + 177: "Maya", + 178: "Reema", + 179: "Yorath", + 180: "Rhoddri", + 181: "Shekhar", + 182: "Servan", + 183: "Reese", + 184: "Kenrick", + 185: "Indirra", + 186: "Giliana", + 187: "Jebran", + 188: "Kotama", + 189: "Fara", + 190: "Katrin", + 191: "Namba", + 192: "Lona", + 193: "Taylah", + 194: "Kato", + 195: "Esra", + 196: "Eleri", + 197: "Irsia", + 198: "Kayu", + 199: "Bevan", + 200: "Chandra" + }, + + "Noms elfiques": { + 2: "Arsula", + 4: "Naidita", + 6: "Belesunna", + 8: "Vidarna", + 10: "Ninsunu", + 12: "Balathu", + 14: "Dorosi", + 16: "Gezera", + 18: "Zursan", + 20: "Seleeku", + 22: "Utamara", + 24: "Nebakay", + 26: "Dismashk", + 28: "Mitunu", + 30: "Atani", + 32: "Kinzura", + 34: "Sumula", + 36: "Ukames", + 38: "Ahmeshki", + 40: "Ilsit", + 42: "Mayatanay", + 44: "Etana", + 46: "Gamanna", + 48: "Nessana", + 50: "Uralar", + 52: "Tishetu", + 54: "Leucia", + 56: "Sutahe", + 58: "Dotani", + 60: "Uktannu", + 62: "Retenay", + 64: "Kendalanu", + 66: "Tahuta", + 68: "Mattissa", + 70: "Anatu", + 72: "Aralu", + 74: "Arakhi", + 76: "Ibrahem", + 78: "Sinosu", + 80: "Jemshida", + 82: "Visapni", + 84: "Hullata", + 86: "Sidura", + 88: "Kerihu", + 90: "Ereshki", + 92: "Cybela", + 94: "Anunna", + 96: "Otani", + 98: "Ditani", + 100: "Faraza" + }, + + "Noms de Géants": { + 4: "Chony", + 8: "Banda", + 12: "Jochu", + 16: "Kira", + 20: "Khatir", + 24: "Chaidu", + 28: "Atan", + 32: "Buandu", + 36: "Javyn", + 40: "Khashin", + 44: "Bayara", + 48: "Temura", + 52: "Kidha", + 56: "Kathos", + 60: "Tanua", + 64: "Bashtu", + 68: "Jaran", + 72: "Othos", + 76: "Khutan", + 80: "Otaan", + 84: "Martu", + 88: "Baku", + 92: "Tuban", + 96: "Qudan", + 100: "Denua" + }, + + "Noms de Varous": { + 4: "Vata", + 8: "Zora", + 12: "Jasna", + 16: "Charna", + 20: "Tana", + 24: "Soveen", + 28: "Radka", + 32: "Zlata", + 36: "Leesla", + 40: "Byna", + 44: "Meeka", + 48: "Iskra", + 52: "Jarek", + 56: "Darva", + 60: "Neda", + 64: "Keha", + 68: "Zhivka", + 72: "Kvata", + 76: "Staysa", + 80: "Evka", + 84: "Vuksha", + 88: "Muko", + 92: "Dreko", + 96: "Aleko", + 100: "Vojan" + }, + + "Noms de Trolls": { + 4: "Rattle", + 8: "Scratch", + 12: "Wallow", + 16: "Groak", + 20: "Gimble", + 24: "Scar", + 28: "Cratch", + 32: "Creech", + 36: "Shush", + 40: "Glush", + 44: "Slar", + 48: "Gnash", + 52: "Stoad", + 56: "Grig", + 60: "Bleat", + 64: "Chortle", + 68: "Cluck", + 72: "Slith", + 76: "Mongo", + 80: "Creak", + 84: "Burble", + 88: "Vrusk", + 92: "Snuffle", + 96: "Leech", + 100: "Herk" + }, + + "Actions de combat": { + 3: "Contraindre à une reddition", + 6: "Se coordonner avec ses alliés", + 9: "Rameuter des renforts", + 13: "S’emparer de quelque chose ou de quelqu’un", + 17: "Provoquer une riposte imprudente", + 21: "Intimider ou effrayer", + 25: "Révéler une vérité surprenante", + 29: "Détourner l’attention sur quelqu’un ou quelque chose d’autre", + 33: "Détruire quelque chose ou le rendre inutile", + 39: "Agir de façon décisive", + 45: "Renforcer les défenses", + 52: "Préparer une action", + 60: "Utiliser le terrain pour gagner l’avantage", + 68: "Tirer avantage d’une arme ou d’une capacité", + 78: "Créer une opportunité", + 89: "Attaquer avec précision", + 99: "Attaquer avec force", + 100: "Agissez de façon totalement inattendue" + }, + + "Contrecoups Mystique": { + 4: "Votre rituel a un effet inverse à celui prévu.", + 8: "Vos forces sont sapées.", + 12: "Votre ami, votre allié ou votre compagnon est affecté négativement.", + 16: "Vous détruisez un objet important.", + 20: "Vous invoquez malgré vous une horreur.", + 24: "Vous perdez connaissance, pour sombrer dans un sommeil troublé.", + 28: "Un tourment physique laisse sa marque sur vous.", + 32: "Des voix fantomatiques vous murmurent de sombres présages.", + 36: "Vous êtes perdu dans les ténèbres, pour réapparaître dans un autre lieu sans aucun souvenir de la façon dont vous êtes arrivé là.", + 40: "Vous alertez quelqu’un ou quelque chose de votre présence.", + 44: "Vous n’êtes plus vous-même, ce qui vous pousse à agir contre un ami, un allié ou un compagnon.", + 48: "Vous affectez ou endommagez votre environnement, en provoquant une perturbation ou des dégâts potentiels.", + 52: "Vous gaspillez des ressources.", + 56: "Vous souffrez de la perte de l’un de vos sens pendant plusieurs heures.", + 60: "Vous perdez votre connexion à la magie pour une journée environ, ce qui vous interdit tout rituel.", + 64: "Votre rituel affecte sa cible d’une façon inattendue et problématique.", + 68: "Votre rituel révèle une vérité surprenante et troublante.", + 72: "Vous êtes tenté par des forces obscures.", + 76: "Vous avez une troublante vision de votre avenir.", + 80: "Vous ne pouvez plus répéter ce rituel jusqu’à ce que vous mettiez la main sur un ingrédient important.", + 84: "Vous développez une étrange peur ou pulsion.", + 88: "Votre rituel provoque un comportement agressif ou étrange chez certaines créatures.", + 92: "Vous êtes tourmenté par une apparition appartenant à votre passé.", + 96: "Vous êtes soudain affligé par la maladie.", + 100: "Relancez deux fois les dés dans ce tableau. Les deux résultats obtenus se produisent. S’ils sont identiques, faites empirer les choses." + }, + + "Rebondissements majeurs": { + 5: "Tout cela n’était qu’une diversion.", + 10: "Un sombre secret est révélé.", + 15: "Un piège est déclenché.", + 20: "Une supposition se révèle fausse.", + 25: "Une alliance secrète est révélée.", + 30: "Vos actions bénéficient à un ennemi.", + 35: "Quelqu’un revient de façon inopinée.", + 40: "Un ennemi plus dangereux est révélé.", + 45: "L’un de vos ennemis et vous partagez un objectif commun.", + 50: "Une véritable identité est révélée.", + 55: "Vous êtes trahi par une personne de confiance.", + 60: "Vous arrivez trop tard.", + 65: "Le véritable ennemi est révélé.", + 70: "L’ennemi gagne de nouveaux alliés.", + 75: "Un nouveau danger apparaît.", + 80: "Quelqu’un ou quelque-chose disparaît.", + 85: "La vérité d’une relation est révélée.", + 90: "Deux situations qui semblent sans rapport se révèlent être connectées.", + 95: "Des pouvoirs ou des capacités inattendues sont révélées.", + 100: "Relancez deux fois les dés dans ce tableau. Les deux résultats obtenus se produisent. S’ils sont identiques, faites empirer les choses." + }, + + "Rangs de défi": { + 20: "Pénible", + 55: "Dangereux", + 80: "Redoutable", + 93: "Extrême", + 100: "Épique" + }, + + "Subir un Stress": { + 10: "Le désespoir vous submerge.Faites Face à la Désolation.", + 25: "Vous renoncez : Abandonnez votre Vœu(si possible, celui en lien avec votre crise actuelle).", + 50: "Vous cédez à la peur ou à vos pulsions et agissez à l’encontre de vos propres intérêts.", + 100: "Vous persévérez." + }, + + "Subir des Dégâts": { + 10: "Les dégâts sont mortels.Faites Face à la Mort.", + 20: "Vous êtes mourant.Vous devrez parvenir àGuérirdans les deux heures qui suivent, pour ne pasFaire Face à la Mort.", + 35: "Vous tombez inconscient et êtes hors-jeu.Si l’on vous laisse tranquille, vous retrouverez vos esprits dans une heure ou deux. Si vous êtes à la merci d’un ennemi impitoyable, alorsFaites Face à la Mort.", + 50: "Vous êtes sous le choc et vous luttez pour garder conscience.Si vous persistez à agir vigoureusement (en courant ou en vous battant) avant d’avoir eu quelques minutes de répit, alors refaites un jet dans ce tableau (avant de résoudre l’action suivante) et appliquez le résultat obtenu.", + 100: "Vous êtes tuméfié mais toujours debout." + }, + + "Payer le Prix": { + 1: "Refaites un jet et appliquez son résultat mais en pire.Si vous obtenez deux fois le même résultat, visualisez quelque-chose de terrible qui change le cours de votre quête (en cas de doute,Consultez l’Oracle) et faites-le se produire.", + 2: "Refaites un jet et appliquez son résultat mais en pire.Si vous obtenez deux fois le même résultat, visualisez quelque-chose de terrible qui change le cours de votre quête (en cas de doute,Consultez l’Oracle) et faites-le se produire.", + 3: "Une personne ou une communauté en laquelle vous aviez confiance perd sa foi en vous ou œuvre contre vous.", + 4: "Une personne ou une communauté en laquelle vous aviez confiance perd sa foi en vous ou œuvre contre vous.", + 5: "Une personne ou une communauté en laquelle vous aviez confiance perd sa foi en vous ou œuvre contre vous.", + 6: "Une personne ou une communauté qui vous tient à cœur est exposée au danger.", + 7: "Une personne ou une communauté qui vous tient à cœur est exposée au danger.", + 8: "Une personne ou une communauté qui vous tient à cœur est exposée au danger.", + 9: "Une personne ou une communauté qui vous tient à cœur est exposée au danger.", + 10: "Quelque-chose de valeur est perdu ou détruit.", + 11: "Quelque-chose de valeur est perdu ou détruit.", + 12: "Quelque-chose de valeur est perdu ou détruit.", + 13: "Quelque-chose de valeur est perdu ou détruit.", + 14: "Quelque-chose de valeur est perdu ou détruit.", + 15: "Quelque-chose de valeur est perdu ou détruit.", + 16: "Quelque-chose de valeur est perdu ou détruit.", + 17: "Vous êtes séparé de quelque-chose ou de quelqu’un.", + 18: "Vous êtes séparé de quelque-chose ou de quelqu’un.", + 19: "Vous êtes séparé de quelque-chose ou de quelqu’un.", + 20: "Vous êtes séparé de quelque-chose ou de quelqu’un.", + 21: "Vous êtes séparé de quelque-chose ou de quelqu’un.", + 22: "Vous êtes séparé de quelque-chose ou de quelqu’un.", + 23: "Vous êtes séparé de quelque-chose ou de quelqu’un.", + 24: "Vous êtes séparé de quelque-chose ou de quelqu’un.", + 25: "Quelque-chose de valeur est perdu ou détruit.", + 26: "Quelque-chose de valeur est perdu ou détruit.", + 27: "Quelque-chose de valeur est perdu ou détruit.", + 28: "Quelque-chose de valeur est perdu ou détruit.", + 29: "Quelque-chose de valeur est perdu ou détruit.", + 30: "Quelque-chose de valeur est perdu ou détruit.", + 31: "Quelque-chose de valeur est perdu ou détruit.", + 32: "Quelque-chose de valeur est perdu ou détruit.", + 33: "La situation actuelle se met à empirer.", + 34: "La situation actuelle se met à empirer.", + 35: "La situation actuelle se met à empirer.", + 36: "La situation actuelle se met à empirer.", + 37: "La situation actuelle se met à empirer.", + 38: "La situation actuelle se met à empirer.", + 39: "La situation actuelle se met à empirer.", + 40: "La situation actuelle se met à empirer.", + 41: "La situation actuelle se met à empirer.", + 42: "Un nouveau danger ou un nouvel ennemi se révèle.", + 43: "Un nouveau danger ou un nouvel ennemi se révèle.", + 44: "Un nouveau danger ou un nouvel ennemi se révèle.", + 45: "Un nouveau danger ou un nouvel ennemi se révèle.", + 46: "Un nouveau danger ou un nouvel ennemi se révèle.", + 47: "Un nouveau danger ou un nouvel ennemi se révèle.", + 48: "Un nouveau danger ou un nouvel ennemi se révèle.", + 49: "Un nouveau danger ou un nouvel ennemi se révèle.", + 50: "Un nouveau danger ou un nouvel ennemi se révèle.", + 51: "Cela vous demande un délai ou vous impose un désavantage.", + 52: "Cela vous demande un délai ou vous impose un désavantage.", + 53: "Cela vous demande un délai ou vous impose un désavantage.", + 54: "Cela vous demande un délai ou vous impose un désavantage.", + 55: "Cela vous demande un délai ou vous impose un désavantage.", + 56: "Cela vous demande un délai ou vous impose un désavantage.", + 57: "Cela vous demande un délai ou vous impose un désavantage.", + 58: "Cela vous demande un délai ou vous impose un désavantage.", + 59: "Cela vous demande un délai ou vous impose un désavantage.", + 60: "C’est nocif.", + 61: "C’est nocif.", + 62: "C’est nocif.", + 63: "C’est nocif.", + 64: "C’est nocif.", + 65: "C’est nocif.", + 66: "C’est nocif.", + 67: "C’est nocif.", + 68: "C’est nocif.", + 77: "C’est stressant.", + 85: "Un développement surprenant complique votre quête.C’est troublant ou cela vous demande d’agir contre vos instincts: Vous subissez une pénalité d’esprit.", + 90: "C’est un gaspillage de ressources.", + 94: "Cela vous force a agir à l’encontre de vos intérêt.Un rebondissement ou une nouvelle menace complique votre quête actuelle.", + 98: "Un ami, un compagnon ou un allié est mis en danger(ou vous-même, si vous êtes seul).", + 100: "Refaites un jet dans ce tableau.Les deux résultats s’appliquent. Si vous obtenez deux fois le même, alors faites-le empirer." + }, + +}; \ No newline at end of file diff --git a/js/state.js b/js/state.js index 90c7704..9f34e9c 100644 --- a/js/state.js +++ b/js/state.js @@ -17,6 +17,14 @@ You should have received a copy of the GNU General Public License along with this program. If not, see https://github.com/SHiLLySiT/IronWriter/blob/master/LICENSE.txt. */ +let str_weakHit = "Weak Hit"; +let str_strongHit = "Strong Hit"; +let str_miss = "Miss"; +let str_match = "Match"; +let str_challenge = "Challenge"; +let str_action = "Action"; + + class Session { constructor() { this.version = VERSION; @@ -450,6 +458,9 @@ class StatAction extends Action { if (gameState.stats.momentumReset < 0) { gameState.stats.momentumReset = 0; + } + if (gameState.stats.momentumReset > 2) { + gameState.stats.momentumReset = 2; } } @@ -740,7 +751,8 @@ class RollAction extends Action { super(); this.type = "RollAction"; - this.statAddName = statAdd; + this.statAdd = statAdd; + this.statAddName = translateStatAdd(statAdd); this.genericAdd = Number(genericAdd); this.challenge = [0, 0]; this.action = 0; @@ -755,8 +767,8 @@ class RollAction extends Action { */ applyAction(gameState, moment) { let statAddValue = 0; - if (this.statAddName.length > 0) { - statAddValue = gameState.stats[this.statAddName]; + if (this.statAdd.length > 0) { + statAddValue = gameState.stats[this.statAdd]; } let actionValue = this.action; @@ -765,33 +777,33 @@ class RollAction extends Action { actionValue = Math.floor(ticks / 4); } - let result = "> Weak Hit"; + let result = "> " + str_weakHit; let totalAction = actionValue + statAddValue + this.genericAdd; if (totalAction <= this.challenge[0] && totalAction <= this.challenge[1]) { - result = "> Miss" + result = "> "+ str_miss } else if (totalAction > this.challenge[0] && totalAction > this.challenge[1]) { - result = "> Strong Hit" + result = "> " + str_strongHit } if (this.challenge[0] == this.challenge[1]) { - result += " (Match)"; + result += " (" + str_match + ")"; } - let challengeOutput = "Challenge: [" + this.challenge[0] + ", " + this.challenge[1] + "]"; + let challengeOutput = str_challenge + " : [" + this.challenge[0] + ", " + this.challenge[1] + "]"; let actionOutput = undefined; if (this.source != "actionDie" && moment.state.progress[this.source] !== undefined) { - actionOutput = "Action: " + actionValue + " (" + moment.state.progress[this.source].name + ")"; + actionOutput = str_action + " : " + actionValue + " (" + moment.state.progress[this.source].name + ")"; } else { - actionOutput = "Action: [" + actionValue + "]"; + actionOutput = str_action + " : [" + actionValue + "]"; } - if (this.statAddName.length > 0) { + if (this.statAdd.length > 0) { actionOutput += " + " + statAddValue + " (" + this.statAddName + ")"; } if (this.genericAdd > 0) { actionOutput += " + " + this.genericAdd; } - if (this.statAddName.length > 0 || this.genericAdd > 0) { + if (this.statAdd.length > 0 || this.genericAdd > 0) { actionOutput += " = " + totalAction; } diff --git a/js/translation.js b/js/translation.js new file mode 100644 index 0000000..b5c8800 --- /dev/null +++ b/js/translation.js @@ -0,0 +1,375 @@ +"use strict"; + +/* + IronWriter is an open-source writing tool for solo playthroughs of the free tabletop RPG Ironsworn. + Copyright (C) 2019 Alex Larioza + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see https://github.com/SHiLLySiT/IronWriter/blob/master/LICENSE.txt. +*/ + +const StatsMenu = [ + 'Caractéristiques', 'Statut', 'Élan' +] + +const BookmarksTabs = [ + 'Tout', 'Liens', 'Fiction & Meta', 'Progrès' +] + +const EntryTabs = [ + 'Histoire', 'Lancer' , 'Oracle' +] + +const StatNameMenu = { + 'edge': 'Vivacité', + 'heart': 'Coeur', + 'iron': 'Fer', + 'shadow': 'Ombre', + 'wits': 'Astuce', + 'health': 'Santé', + 'spirit': 'Esprit', + 'supply': 'Provision', + 'momentum': 'Élan', + 'momentumMax': "Max", + 'momentumReset': 'Reset' +} + +const DebilityNameMenu = { + 'none': 'Aucun', + 'wounded': 'Blessé', + 'unprepared': 'Mal préparé', + 'shaken': 'Secoué', + 'encumbered': 'Encombré', + 'maimed': 'Mutilé', + 'corrupted': 'Corrompu', + 'cursed': 'Maudit', + 'tormented': 'Tourmenté' +} + +const ProgressRankNameMenu = { + 'troublesome': 'pénible', + 'dangerous': 'dangereux', + 'formidable': 'redoutable', + 'extreme': 'extrème', + 'epic': 'épique' +} + + +const TagMapping = { + 'vivacité': 'edge', + 'coeur': 'heart', + 'fer': 'iron', + 'ombre': 'shadow', + 'astuce': 'wits', + 'élan': 'momentum', + 'expérience': 'experience', + 'expériencedépensée': 'experiencespent', + 'santé': 'health', + 'provision': 'supply', + 'esprit': 'spirit', + 'renommer': 'rename', + 'est': 'is', + 'pas': 'not', + 'progrès': 'progress', + 'lien': 'bond', + 'supprimerlien': 'unbond', + 'atout': 'asset', + 'supprimeratout': 'removeasset', + 'objet': 'item', + 'supprimerobjet': 'removeitem', + 'étiquette': 'bookmark' +} + +const DebilityMapping = { + 'blessé': 'wounded', + 'malpréparé': 'unprepared', + 'secoué': 'shaken', + 'encombré': 'encumbered', + 'mutilé': 'maimed', + 'corrompu': 'corrupted', + 'maudit': 'cursed', + 'tourmenté': 'tormented' +} + +const ProgressOptionMapping = { + 'complet': 'complete', + 'pénible': 'troublesome', + 'dangereux': 'dangerous', + 'redoutable': 'formidable', + 'extrème': 'extreme', + 'épique': 'epic' +} + +const StatAddNames = { + 'edge': 'vivacité', + 'heart': 'coeur', + 'iron': 'fer', + 'shadow': 'ombre', + 'wits': 'astuce', + 'health': 'santé', + 'supply': 'provision', + 'spirit': 'esprit' +} + +// Translate menu +function translateHeader() { + if (LANG === "FR") { + document.getElementById('new').title = "Nouvelle session"; + document.getElementById('import').title = "Importer session"; + document.getElementById('export').title = "Exporter session"; + document.getElementById('bookmarks').title = "Étiquette"; + document.getElementById('help').title = "Aide"; + } +} + +function translateConfirmDialog() { + if (LANG === "FR") { + let container = document.getElementById('confirm-dialog'); + + container.querySelector('#my-dialog-title').textContent = "Confirmation"; + container.querySelector("button[data-mdc-dialog-action='close']").textContent = "Annuler"; + } +} + +function translateNewDialog() { + translateConfirmDialog(); + + if (LANG === "FR") { + let confirmDialog = document.getElementById("confirm-dialog").MDCDialog; + confirmDialog.content_.textContent = "Êtes vous sûr de vouloir créer une nouvelle session ? Votre session actuelle sera supprimée."; + } +} + +function translateImportDialog() { + translateConfirmDialog(); + + if (LANG === "FR") { + let confirmDialog = document.getElementById("confirm-dialog").MDCDialog; + confirmDialog.content_.textContent = "Êtes vous sûr de vouloir importer une session ? Votre session actuelle sera perdue."; + } +} + +function translateBookmarksDialog() { + if (LANG === "FR") { + let container = document.getElementById('bookmarks-dialog'); + + container.querySelector('h2').textContent = "Étiquette"; + + let buttons = container.querySelectorAll('button .mdc-tab__text-label'); + for (let p of buttons.keys()) { + buttons[p].textContent = BookmarksTabs[p]; + } + } +} + +function translateEntryTabs(){ + if (LANG == "FR") { + let container = document.getElementById('entry-tabs'); + + let buttons = container.querySelectorAll('button .mdc-tab__text-label'); + for (let p of buttons.keys()){ + buttons[p].textContent = EntryTabs[p]; + } + } +} + +function translateStory(){ + if (LANG === "FR") { + let button = document.getElementById('submit-event') + button.querySelector('.mdc-button__label').textContent = "Valider"; + button.title = "Valider l'évènement (CTRL+Enter)"; + + button = document.getElementById('mode-switch'); + button.title = "Activer Fiction/Meta (CTRL+M)"; + } +} + + +function translateCharacterMenu () { + if (LANG === "FR") { + let container = document.getElementById('character-pane'); + let element = container.querySelector('h3'); + element.textContent = "Personnage"; + + element = container.querySelector('.status-group'); + element.firstElementChild.textContent = "Nom"; + } +} + +function translateStatMenu () { + if (LANG === "FR") { + for (let p in StatNameMenu) { + let container = document.getElementById('stat-' + p); + container.querySelector('.stat-name').textContent = StatNameMenu[p]; + } + + let containers = document.querySelectorAll('.stat-container > div:nth-child(1)'); + for (let p of containers.keys()) { + containers[p].textContent = StatsMenu[p]; + } + + let container = document.querySelector('.experience-container > div:nth-child(1)'); + container.textContent = "Expérience"; + } +} + +function translateDebilityMenu () { + if (LANG === "FR") { + for (let p in DebilityNameMenu) { + let container = document.getElementById('debility-' + p); + container.firstElementChild.textContent = DebilityNameMenu[p]; + } + + let container = document.querySelector('.debility-container > div:nth-child(1)'); + container.textContent = "Handicaps"; + } +} + +function translateBondsMenu() { + if (LANG === "FR") { + container = document.getElementById('bond-card'); + container.querySelector('h3').textContent = "Liens"; + } +} + +function translateProgressMenu () { + if (LANG === "FR") { + container = document.getElementById('progress-card'); + container.querySelector('h3').textContent = "Jauge de progrès"; + } +} + +function translateAssetsMenu() { + if (LANG === "FR") { + container = document.getElementById('asset-card'); + container.querySelector('h3').textContent = "Atouts"; + } +} + +function translateInventoryMenu(){ + if (LANG === "FR") { + container = document.getElementById('inventory-card'); + container.querySelector('h3').textContent = "Inventaire"; + } +} + +function translateRollMenu() { + if (LANG == "FR") { + // Progress track section + container = document.getElementById('roll-source'); + container.querySelector('#outlined-label').textContent = "Jauge de progrès (Facultatif)"; + + // Stat add section + container = document.getElementById('roll-stats'); + container.querySelector('#outlined-label').textContent = "Bonus de caractéristique"; + container.querySelector('li[data-value="edge"]').textContent = "+Vivacité"; + container.querySelector('li[data-value="heart"]').textContent = "+Coeur"; + container.querySelector('li[data-value="iron"]').textContent = "+Fer"; + container.querySelector('li[data-value="shadow"]').textContent = "+Ombre"; + container.querySelector('li[data-value="wits"]').textContent = "+Astuce"; + container.querySelector('li[data-value="health"]').textContent = "+Santé"; + container.querySelector('li[data-value="spirit"]').textContent = "+Esprit"; + container.querySelector('li[data-value="supply"]').textContent = "+Provision"; + + // Additional Add section + container = document.getElementById('roll-add').nextElementSibling; + console.log(container); + container.querySelector('.mdc-floating-label').textContent = "Autre bonus"; + + // Buttons + container = document.getElementById('roll'); + container.querySelector('.mdc-button__label').textContent = "Lancer"; + container = document.getElementById('roll-reset'); + container.title = "Valeurs par défaut"; + + } +} + +function translateProgressRank (input) { + if (LANG === "FR") { + return ProgressRankNameMenu[input]; + } + + return input; +} + +function translateQuantityProperty(input) { + if (LANG === "FR") { + if (input !== "Quantity"){ + return input; + } + return "Quantité"; + } + + return input; +} + + +// Translate Keywords +function translateTag(input) { + if (LANG === "FR") { + return TagMapping[input]; + } + + return input; +} + +function translateDebility(input) { + if (LANG === "FR") { + return DebilityMapping[input]; + } + + return input; +} + +function translateProgressOption(input) { + if (LANG === "FR") { + if (input === undefined) { + return undefined; + } + else if (!isNaN(input)) { + return input; + } + else { + return ProgressOptionMapping[input]; + } + } + + return input; +} + +function translateDoOracle() { + if (LANG === "FR") { + OracleIndication = "Consulter l'Oracle"; + } +} + +function translateDoRoll(){ + if (LANG == "FR") { + str_weakHit = "Coup Faible"; + str_strongHit = "Coup Fort"; + str_miss = "Échec"; + str_challenge = "Défi"; + } +} + + +function translateStatAdd(input){ + if (LANG === "FR"){ + if (input in StatAddNames){ + return StatAddNames[input]; + } + } + return input +} + \ No newline at end of file From a7e77b701b85db36cd4aff655f663fef0b548f76 Mon Sep 17 00:00:00 2001 From: MLD-Rennes Date: Thu, 24 Apr 2025 22:24:42 +0200 Subject: [PATCH 4/7] Undo spent experience correction Undo correction that is invalid. --- js/ironwriter.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/js/ironwriter.js b/js/ironwriter.js index 04bddf4..75ded88 100644 --- a/js/ironwriter.js +++ b/js/ironwriter.js @@ -61,7 +61,7 @@ const STATS = { momentumMax: 0, momentumReset: 0, experience: 0, - experiencespent: 0, + experienceSpent: 0, bonds: 0, }; @@ -867,7 +867,7 @@ function refresh() { available.style.display = "none"; if (i < session.state.stats.experience) { - if (i < session.state.stats.experiencespent) { + if (i < session.state.stats.experienceSpent) { available.style.display = "block"; } else { spent.style.display = "block"; From bb595f3e6ba6c290a8aa31d6de8718351e5188cc Mon Sep 17 00:00:00 2001 From: MLD-Rennes Date: Thu, 24 Apr 2025 22:49:35 +0200 Subject: [PATCH 5/7] Fixed momentum effect when add debility. Fixed the change of momentum stats for any string used as debility --- js/ironwriter.js | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/js/ironwriter.js b/js/ironwriter.js index 75ded88..14f1931 100644 --- a/js/ironwriter.js +++ b/js/ironwriter.js @@ -1057,13 +1057,19 @@ function createMoment(input, type, index) { } else if (args[0] == "rename") { moment.addAction(renameCharacter(args)); } else if (args[0] == "is") { - moment.addAction(addDebility(args)); - moment.addAction(new StatAction("momentumMax", "-", 1)); - moment.addAction(new StatAction("momentumReset", "-", 1)); + let debilityAction = addDebility(args); + if (debilityAction !== undefined) { + moment.addAction(debilityAction); + moment.addAction(new StatAction("momentumMax", "-", 1)); + moment.addAction(new StatAction("momentumReset", "-", 1)); + } } else if (args[0] == "not") { - moment.addAction(removeDebility(args)); - moment.addAction(new StatAction("momentumMax", "+", 1)); - moment.addAction(new StatAction("momentumReset", "+", 1)); + let debilityAction = removeDebility(args); + if (debilityAction !== undefined) { + moment.addAction(debilityAction); + moment.addAction(new StatAction("momentumMax", "+", 1)); + moment.addAction(new StatAction("momentumReset", "+", 1)); + } } else if (args[0] == "bookmark") { args[2] = type; moment.addAction(addBookmark(args, index)); From 94c8337f304f1b277b07d0a03ecaff01494418ad Mon Sep 17 00:00:00 2001 From: MLD-Rennes Date: Fri, 25 Apr 2025 10:17:37 +0200 Subject: [PATCH 6/7] added language property to translation arrays. Added a property to select language in each translations objets to simplify the translation of a word. Added a translation for EN from a lowercase keyword to a camelCase name. --- js/ironwriter.js | 6 +- js/translation.js | 281 +++++++++++++++++++++++----------------------- 2 files changed, 146 insertions(+), 141 deletions(-) diff --git a/js/ironwriter.js b/js/ironwriter.js index 14f1931..86c1631 100644 --- a/js/ironwriter.js +++ b/js/ironwriter.js @@ -18,7 +18,7 @@ along with this program. If not, see https://github.com/SHiLLySiT/IronWriter/blob/master/LICENSE.txt. */ const VERSION = "0.3.2"; -const LANG = "FR"; +const LANG = "EN"; const MAX_EXPERIENCE = 30; const MAX_PROGRESS = 10; @@ -1045,11 +1045,11 @@ function createMoment(input, type, index) { moment.addAction(action); } else if (args[0] == "asset") { moment.addAction(updateAsset(args)); - } else if (args[0] == "removeasset") { + } else if (args[0] == "removeAsset") { moment.addAction(removeAsset(args)); } else if (args[0] == "item") { moment.addAction(updateInventory(args)); - } else if (args[0] == "removeitem") { + } else if (args[0] == "removeItem") { moment.addAction(removeInventory(args)); } else if (args[0] == "progress") { action = progress(args); diff --git a/js/translation.js b/js/translation.js index b5c8800..8eff3a5 100644 --- a/js/translation.js +++ b/js/translation.js @@ -17,108 +17,131 @@ You should have received a copy of the GNU General Public License along with this program. If not, see https://github.com/SHiLLySiT/IronWriter/blob/master/LICENSE.txt. */ +const StatsMenu = { + 'FR': [ + 'Caractéristiques', 'Statut', 'Élan' + ] +} -const StatsMenu = [ - 'Caractéristiques', 'Statut', 'Élan' -] - -const BookmarksTabs = [ - 'Tout', 'Liens', 'Fiction & Meta', 'Progrès' -] +const BookmarksTabs = { + 'FR': [ + 'Tout', 'Liens', 'Fiction & Meta', 'Progrès' + ] +} -const EntryTabs = [ - 'Histoire', 'Lancer' , 'Oracle' -] +const EntryTabs = { + 'FR': [ + 'Histoire', 'Lancer' , 'Oracle' + ] +} const StatNameMenu = { - 'edge': 'Vivacité', - 'heart': 'Coeur', - 'iron': 'Fer', - 'shadow': 'Ombre', - 'wits': 'Astuce', - 'health': 'Santé', - 'spirit': 'Esprit', - 'supply': 'Provision', - 'momentum': 'Élan', - 'momentumMax': "Max", - 'momentumReset': 'Reset' + 'FR': { + 'edge': 'Vivacité', + 'heart': 'Coeur', + 'iron': 'Fer', + 'shadow': 'Ombre', + 'wits': 'Astuce', + 'health': 'Santé', + 'spirit': 'Esprit', + 'supply': 'Provision', + 'momentum': 'Élan', + 'momentumMax': "Max", + 'momentumReset': 'Reset' + } } const DebilityNameMenu = { - 'none': 'Aucun', - 'wounded': 'Blessé', - 'unprepared': 'Mal préparé', - 'shaken': 'Secoué', - 'encumbered': 'Encombré', - 'maimed': 'Mutilé', - 'corrupted': 'Corrompu', - 'cursed': 'Maudit', - 'tormented': 'Tourmenté' + 'FR': { + 'none': 'Aucun', + 'wounded': 'Blessé', + 'unprepared': 'Mal préparé', + 'shaken': 'Secoué', + 'encumbered': 'Encombré', + 'maimed': 'Mutilé', + 'corrupted': 'Corrompu', + 'cursed': 'Maudit', + 'tormented': 'Tourmenté' + } } const ProgressRankNameMenu = { - 'troublesome': 'pénible', - 'dangerous': 'dangereux', - 'formidable': 'redoutable', - 'extreme': 'extrème', - 'epic': 'épique' + 'FR': { + 'troublesome': 'pénible', + 'dangerous': 'dangereux', + 'formidable': 'redoutable', + 'extreme': 'extrème', + 'epic': 'épique' + } } - const TagMapping = { - 'vivacité': 'edge', - 'coeur': 'heart', - 'fer': 'iron', - 'ombre': 'shadow', - 'astuce': 'wits', - 'élan': 'momentum', - 'expérience': 'experience', - 'expériencedépensée': 'experiencespent', - 'santé': 'health', - 'provision': 'supply', - 'esprit': 'spirit', - 'renommer': 'rename', - 'est': 'is', - 'pas': 'not', - 'progrès': 'progress', - 'lien': 'bond', - 'supprimerlien': 'unbond', - 'atout': 'asset', - 'supprimeratout': 'removeasset', - 'objet': 'item', - 'supprimerobjet': 'removeitem', - 'étiquette': 'bookmark' + 'EN': { + 'experiencespent': 'experienceSpent', + 'removeasset': 'removeAsset', + 'removeitem': 'removeItem', + }, + 'FR': { + 'vivacité': 'edge', + 'coeur': 'heart', + 'fer': 'iron', + 'ombre': 'shadow', + 'astuce': 'wits', + 'élan': 'momentum', + 'expérience': 'experience', + 'expériencedépensée': 'experienceSpent', + 'santé': 'health', + 'provision': 'supply', + 'esprit': 'spirit', + 'renommer': 'rename', + 'est': 'is', + 'pas': 'not', + 'progrès': 'progress', + 'lien': 'bond', + 'supprimerlien': 'unbond', + 'atout': 'asset', + 'supprimeratout': 'removeAsset', + 'objet': 'item', + 'supprimerobjet': 'removeItem', + 'étiquette': 'bookmark' + } } const DebilityMapping = { - 'blessé': 'wounded', - 'malpréparé': 'unprepared', - 'secoué': 'shaken', - 'encombré': 'encumbered', - 'mutilé': 'maimed', - 'corrompu': 'corrupted', - 'maudit': 'cursed', - 'tourmenté': 'tormented' + 'FR': { + 'blessé': 'wounded', + 'malpréparé': 'unprepared', + 'secoué': 'shaken', + 'encombré': 'encumbered', + 'mutilé': 'maimed', + 'corrompu': 'corrupted', + 'maudit': 'cursed', + 'tourmenté': 'tormented' + } } const ProgressOptionMapping = { - 'complet': 'complete', - 'pénible': 'troublesome', - 'dangereux': 'dangerous', - 'redoutable': 'formidable', - 'extrème': 'extreme', - 'épique': 'epic' -} + 'FR': { + 'complet': 'complete', + 'pénible': 'troublesome', + 'dangereux': 'dangerous', + 'redoutable': 'formidable', + 'extrème': 'extreme', + 'épique': 'epic' + } +} const StatAddNames = { - 'edge': 'vivacité', - 'heart': 'coeur', - 'iron': 'fer', - 'shadow': 'ombre', - 'wits': 'astuce', - 'health': 'santé', - 'supply': 'provision', - 'spirit': 'esprit' + 'FR': { + 'edge': 'vivacité', + 'heart': 'coeur', + 'iron': 'fer', + 'shadow': 'ombre', + 'wits': 'astuce', + 'health': 'santé', + 'supply': 'provision', + 'spirit': 'esprit' + } } // Translate menu @@ -160,26 +183,24 @@ function translateImportDialog() { } function translateBookmarksDialog() { - if (LANG === "FR") { - let container = document.getElementById('bookmarks-dialog'); - + let container = document.getElementById('bookmarks-dialog'); + + let buttons = container.querySelectorAll('button .mdc-tab__text-label'); + for (let p of buttons.keys()) { + buttons[p].textContent = (BookmarksTabs[LANG] !== undefined) ? BookmarksTabs[LANG][p] : buttons[p].textContent; + } + + if (LANG === 'FR') { container.querySelector('h2').textContent = "Étiquette"; - - let buttons = container.querySelectorAll('button .mdc-tab__text-label'); - for (let p of buttons.keys()) { - buttons[p].textContent = BookmarksTabs[p]; - } } } function translateEntryTabs(){ - if (LANG == "FR") { - let container = document.getElementById('entry-tabs'); + let container = document.getElementById('entry-tabs'); - let buttons = container.querySelectorAll('button .mdc-tab__text-label'); - for (let p of buttons.keys()){ - buttons[p].textContent = EntryTabs[p]; - } + let buttons = container.querySelectorAll('button .mdc-tab__text-label'); + for (let p of buttons.keys()){ + buttons[p].textContent = (EntryTabs[LANG] !== undefined) ? EntryTabs[LANG][p] : buttons[p].textContent; } } @@ -207,15 +228,16 @@ function translateCharacterMenu () { } function translateStatMenu () { - if (LANG === "FR") { - for (let p in StatNameMenu) { + if (StatNameMenu[LANG] !== undefined) { + for (let p in StatNameMenu[LANG]) { let container = document.getElementById('stat-' + p); - container.querySelector('.stat-name').textContent = StatNameMenu[p]; + container.querySelector('.stat-name').textContent = StatNameMenu[LANG][p]; } - + } + if (LANG === "FR") { let containers = document.querySelectorAll('.stat-container > div:nth-child(1)'); for (let p of containers.keys()) { - containers[p].textContent = StatsMenu[p]; + containers[p].textContent = StatsMenu[LANG][p]; } let container = document.querySelector('.experience-container > div:nth-child(1)'); @@ -224,12 +246,14 @@ function translateStatMenu () { } function translateDebilityMenu () { - if (LANG === "FR") { - for (let p in DebilityNameMenu) { - let container = document.getElementById('debility-' + p); - container.firstElementChild.textContent = DebilityNameMenu[p]; - } + if (DebilityNameMenu[LANG] !== undefined) { + for (let p in DebilityNameMenu[LANG]) { + let container = document.getElementById('debility-' + p); + container.firstElementChild.textContent = DebilityNameMenu[LANG][p]; + } + } + if (LANG === "FR") { let container = document.querySelector('.debility-container > div:nth-child(1)'); container.textContent = "Handicaps"; } @@ -283,7 +307,6 @@ function translateRollMenu() { // Additional Add section container = document.getElementById('roll-add').nextElementSibling; - console.log(container); container.querySelector('.mdc-floating-label').textContent = "Autre bonus"; // Buttons @@ -296,11 +319,7 @@ function translateRollMenu() { } function translateProgressRank (input) { - if (LANG === "FR") { - return ProgressRankNameMenu[input]; - } - - return input; + return (ProgressRankNameMenu[LANG] != undefined) ? ProgressRankNameMenu[LANG][input] : input; } function translateQuantityProperty(input) { @@ -317,35 +336,23 @@ function translateQuantityProperty(input) { // Translate Keywords function translateTag(input) { - if (LANG === "FR") { - return TagMapping[input]; - } - - return input; + return (TagMapping[LANG] !== undefined & TagMapping[LANG][input] !== undefined) ? TagMapping[LANG][input] : input; } function translateDebility(input) { - if (LANG === "FR") { - return DebilityMapping[input]; - } - - return input; + return (DebilityMapping[LANG] != undefined) ? DebilityMapping[LANG][input] : input; } function translateProgressOption(input) { - if (LANG === "FR") { - if (input === undefined) { - return undefined; - } - else if (!isNaN(input)) { - return input; - } - else { - return ProgressOptionMapping[input]; - } + if (input === undefined) { + return undefined; + } + else if (!isNaN(input)) { + return input; + } + else { + return (ProgressOptionMapping[LANG] !== undefined) ? ProgressOptionMapping[LANG][input] : input; } - - return input; } function translateDoOracle() { @@ -365,11 +372,9 @@ function translateDoRoll(){ function translateStatAdd(input){ - if (LANG === "FR"){ - if (input in StatAddNames){ - return StatAddNames[input]; - } + if (input in StatAddNames){ + return (StatAddNames[LANG] !== undefined) ? StatAddNames[LANG][input] : input; } - return input + } \ No newline at end of file From 5934b3a52067403a3145255c9d0cfcd58ba6bdbc Mon Sep 17 00:00:00 2001 From: MLD-Rennes Date: Thu, 8 May 2025 17:35:48 +0200 Subject: [PATCH 7/7] Change langage property to French --- js/ironwriter.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/js/ironwriter.js b/js/ironwriter.js index 86c1631..57fead9 100644 --- a/js/ironwriter.js +++ b/js/ironwriter.js @@ -18,7 +18,7 @@ along with this program. If not, see https://github.com/SHiLLySiT/IronWriter/blob/master/LICENSE.txt. */ const VERSION = "0.3.2"; -const LANG = "EN"; +const LANG = "FR"; const MAX_EXPERIENCE = 30; const MAX_PROGRESS = 10;