From 80c03b90df4eb4b77c30223c333f8d9ce369b287 Mon Sep 17 00:00:00 2001 From: Vlyan Date: Tue, 22 Dec 2020 11:26:55 +0100 Subject: [PATCH] working on 20Q --- system/lang/en-en.json | 3 +- system/lang/es-es.json | 3 +- system/lang/fr-fr.json | 3 +- .../scripts/actors/twenty-questions-dialog.js | 71 ++++++++----------- system/scripts/actors/twenty-questions.js | 68 ++++++++++-------- .../actors/twenty-questions-dialog.html | 18 +++-- 6 files changed, 83 insertions(+), 83 deletions(-) diff --git a/system/lang/en-en.json b/system/lang/en-en.json index 7aa681d..317811c 100644 --- a/system/lang/en-en.json +++ b/system/lang/en-en.json @@ -272,7 +272,8 @@ "object": "Item (Rarity 7 or lower)", "d10r1": "D10 Result (1/2)", "d10r2": "D10 Result (2/2)", - "generchar": "Generate a new character", + "generchar": "Generate the character", + "generchar_disclaimer": "Warning, this will erase character's current datas !", "part1": { "title": "Part I: Core Identity (Clan and Family)", "q1": "1. What clan does your character belong to ? (p. 41)", diff --git a/system/lang/es-es.json b/system/lang/es-es.json index b8caca4..06597c0 100644 --- a/system/lang/es-es.json +++ b/system/lang/es-es.json @@ -272,7 +272,8 @@ "object": "Item (Rarity 7 or lower)", "d10r1": "D10 Result (1/2)", "d10r2": "D10 Result (2/2)", - "generchar": "Generate a new character", + "generchar": "Generate the character", + "generchar_disclaimer": "Warning, this will erase character's current datas !", "part1": { "title": "Part I: Core Identity (Clan and Family)", "q1": "1. What clan does your character belong to ? (p. 41)", diff --git a/system/lang/fr-fr.json b/system/lang/fr-fr.json index be029ff..d5146f0 100644 --- a/system/lang/fr-fr.json +++ b/system/lang/fr-fr.json @@ -276,7 +276,8 @@ "object": "Objet (Rareté inférieur ou égale à 7)", "d10r1": "Résultat du 1er D10", "d10r2": "Résultat du 2eme D10", - "generchar": "Générer un nouveau personnage", + "generchar": "Générer le personnage", + "generchar_disclaimer": "Attention cela écrasera les données de votre personnage actuel !", "part1": { "title": "Partie I: Identité (clan et famille)", "q1": "1. A quel clan appartient votre personnage ? (p. 41)", diff --git a/system/scripts/actors/twenty-questions-dialog.js b/system/scripts/actors/twenty-questions-dialog.js index 6ec5a9a..9607092 100644 --- a/system/scripts/actors/twenty-questions-dialog.js +++ b/system/scripts/actors/twenty-questions-dialog.js @@ -11,7 +11,10 @@ export class TwentyQuestionsDialog extends FormApplication { */ actor = null; - errors = []; + /** + * Errors object + */ + errors = {}; /** * Assign the default options @@ -26,6 +29,9 @@ export class TwentyQuestionsDialog extends FormApplication { width: 600, height: 600, resizable: true, + closeOnSubmit: false, + submitOnClose: true, + submitOnChange: true, }); } @@ -36,6 +42,7 @@ export class TwentyQuestionsDialog extends FormApplication { super(options); this.actor = actor; this.object = new TwentyQuestions(actor); + this.errors = this.object.validateForm(); } /** @@ -78,8 +85,11 @@ export class TwentyQuestionsDialog extends FormApplication { ...super.getData(options), ringsList: game.l5r5e.HelpersL5r5e.getRingsList(), skillsList: game.l5r5e.HelpersL5r5e.getSkillsList(true), + noHonorSkillsList: ["commerce", "skulduggery", "medicine", "seafaring", "survival", "labor"], techniquesList: CONFIG.l5r5e.techniques, data: this.object.data, + errors: this.errors, + hasErrors: Object.keys(this.errors).length > 0, }; } @@ -113,22 +123,10 @@ export class TwentyQuestionsDialog extends FormApplication { return; } - // Check rings total - html.find(".ring-select").on("change", async (event) => { - const sum = this._summarySelects(html, ".ring-select"); - // sum = Map(4) {"void" => 2, "water" => 1, "fire" => 1, "earth" => 1} - console.log(sum); - }); - - // Check skills total - html.find(".skill-select").on("change", async (event) => { - const sum = this._summarySelects(html, ".skill-select"); - console.log(sum); - }); - // Submit button html.find("#generate").on("click", async (event) => { - this.submit(); + this.object.toActor(this.actor); + await this.close({ submit: true, force: true }); }); } @@ -164,11 +162,6 @@ export class TwentyQuestionsDialog extends FormApplication { return false; } - // _canDragDrop(event) { - // console.log("*** _canDragDrop event", event); - // return false; - // } - /** * This method is called upon form submission after form data is validated * @param event The initial triggering submission event @@ -177,30 +170,22 @@ export class TwentyQuestionsDialog extends FormApplication { * @override */ async _updateObject(event, formData) { + // Update 20Q object data this.object.updateFromForm(formData); - this.object.toActor(this.actor); - return this.close(); - } - /** - * Return a map of skill/ring with count - * @private - */ - _summarySelects(html, selector) { - return html - .find(selector) - .get() - .reduce((acc, curr) => { - curr = curr.value; - if (curr === "none") { - return acc; - } - let val = acc.get(curr); - if (!val) { - val = 0; - } - acc.set(curr, val + 1); - return acc; - }, new Map()); + // Get errors if any + this.errors = this.object.validateForm(); + + // Only on close/submit + if (event.type === "submit") { + // Store this form datas in actor + this.actor.data.data.twenty_questions = this.object.data; + this.actor.update({ + data: { + twenty_questions: this.object.data, + }, + }); + } + this.render(false); } } diff --git a/system/scripts/actors/twenty-questions.js b/system/scripts/actors/twenty-questions.js index beab9e5..da1ef99 100644 --- a/system/scripts/actors/twenty-questions.js +++ b/system/scripts/actors/twenty-questions.js @@ -198,10 +198,6 @@ export class TwentyQuestions { const actorDatas = actor.data.data; const formData = this.data; - // Store this form datas - // TODO maybe elsewhere than in the actor ? - actorDatas.twenty_questions = this.data; - // Update the actor real datas actorDatas.zeni = formData.step2.wealth; actorDatas.identity = { @@ -236,7 +232,9 @@ export class TwentyQuestions { CONFIG.l5r5e.stances.forEach((ring) => (actorDatas.rings[ring] = 1)); TwentyQuestions.ringList.forEach((formName) => { const ring = getProperty(this.data, formName); - actorDatas.rings[ring] = actorDatas.rings[ring] + 1; + if (ring !== "none") { + actorDatas.rings[ring] = actorDatas.rings[ring] + 1; + } }); // Skills - Reset to 0, and apply modifiers @@ -246,7 +244,9 @@ export class TwentyQuestions { TwentyQuestions.skillList.forEach((formName) => { const skillId = getProperty(this.data, formName); const skillCat = CONFIG.l5r5e.skills.get(skillId); - actorDatas.skills[skillCat][skillId] = actorDatas.skills[skillCat][skillId] + 1; + if (skillId !== "none") { + actorDatas.skills[skillCat][skillId] = actorDatas.skills[skillCat][skillId] + 1; + } }); // TODO Items references @@ -261,29 +261,35 @@ export class TwentyQuestions { console.log(actor); } - // checkRings() { - // const rings = {}; - // const exceed = {}; - // CONFIG.l5r5e.stances.forEach(ring => rings[ring] = 1); - // TwentyQuestions.ringList.forEach((formName) => { - // const ring = getProperty(this.data, formName); - // rings[ring] = rings[ring] + 1; - // - // console.log(rings); - // - // if (rings[ring] > 3) { - // exceed[ring] = ring; - // } - // }); - // return exceed; - // } - // - // checkSkills() { - // const skills = {}; - // TwentyQuestions.skillList.forEach((formName) => { - // const skillId = getProperty(this.data, formName); - // const skillCat = CONFIG.l5r5e.skills.get(skillId); - // actorDatas.skills[skillCat][skillId] = actorDatas.skills[skillCat][skillId] + 1; - // }); - // } + /** + * Return a array of errors, empty array if no errors founds + */ + validateForm() { + // Rings & Skills + const rings = this._checkRingsOrSkills("ringList", 2); // ring start at 1 + const skills = this._checkRingsOrSkills("skillList", 3); // skill start at 0 + + // TODO Techniques / peculiarities + + return { ...rings, ...skills }; + } + + /** + * Return a list of exceeded ring/skill + */ + _checkRingsOrSkills(listName, max) { + const store = {}; + const exceed = {}; + TwentyQuestions[listName].forEach((formName) => { + const id = getProperty(this.data, formName); + if (!store[id]) { + store[id] = 0; + } + store[id] = store[id] + 1; + if (store[id] > max) { + exceed[id] = store[id]; + } + }); + return exceed; + } } diff --git a/system/templates/actors/twenty-questions-dialog.html b/system/templates/actors/twenty-questions-dialog.html index a930833..0bded43 100644 --- a/system/templates/actors/twenty-questions-dialog.html +++ b/system/templates/actors/twenty-questions-dialog.html @@ -1,4 +1,5 @@
+
{{json errors}}

{{localize 'l5r5e.twenty_questions.title'}}

@@ -354,12 +355,8 @@ @@ -561,9 +558,18 @@
+
+ {{#if hasErrors}} + corriger les erreurs pour poursuivre ! + {{else}} + {{/if}}
\ No newline at end of file