140 lines
		
	
	
		
			4.8 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			140 lines
		
	
	
		
			4.8 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| import { renderTemplate } from "./constants.js";
 | |
| import { Misc } from "./misc.js";
 | |
| import { RdDResolutionTable } from "./rdd-resolution-table.js";
 | |
| import { RdDRollResult } from "./rdd-roll-result.js";
 | |
| 
 | |
| const titleTableDeResolution = 'Table de résolution';
 | |
| /**
 | |
|  * Extend the base Dialog entity to select roll parameters
 | |
|  * @extends {Dialog}
 | |
|  */
 | |
| /* -------------------------------------------- */
 | |
| export class RdDRollResolutionTable extends Dialog {
 | |
| 
 | |
|   static resolutionTable = undefined;
 | |
|   /* -------------------------------------------- */
 | |
|   static async open() {
 | |
|     if (RdDRollResolutionTable.resolutionTable == undefined) {
 | |
|       const rollData = {}
 | |
|       RdDRollResolutionTable._setDefaultOptions(rollData);
 | |
|       let html = await renderTemplate('systems/foundryvtt-reve-de-dragon/templates/dialog-roll-resolution.hbs', rollData);
 | |
|       RdDRollResolutionTable.resolutionTable = new RdDRollResolutionTable(rollData, html);
 | |
|       RdDRollResolutionTable.resolutionTable.render(true);
 | |
|     }
 | |
|     else{
 | |
|       RdDRollResolutionTable.resolutionTable.bringToTop();
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   /* -------------------------------------------- */
 | |
|   static _setDefaultOptions(rollData) {
 | |
|     let defRollData = {
 | |
|       show: { title: titleTableDeResolution },
 | |
|       ajustementsConditions: CONFIG.RDD.ajustementsConditions,
 | |
|       difficultesLibres: CONFIG.RDD.ajustementsConditions,
 | |
|       etat: 0,
 | |
|       moral: 0,
 | |
|       carac: {},
 | |
|       finalLevel: 0,
 | |
|       diffConditions: 0,
 | |
|       diffLibre: 0,
 | |
|       use: { conditions:true, libre:true }
 | |
|     }
 | |
|     foundry.utils.mergeObject(rollData, defRollData, { overwrite: false });
 | |
|     for (let i = 1; i < 21; i++) {
 | |
|       const key = `${i}`;
 | |
|       rollData.carac[key] = { type: "number", value: i, label: key }
 | |
|     }
 | |
|     let selected = (rollData.selectedCarac && rollData.selectedCarac.label)
 | |
|       ? rollData.selectedCarac.label
 | |
|       : (Number.isInteger(rollData.selectedCarac))
 | |
|         ? rollData.selectedCarac
 | |
|         : 10;
 | |
|     rollData.selectedCarac = rollData.carac[selected];
 | |
|   }
 | |
| 
 | |
|   /* -------------------------------------------- */
 | |
|   constructor(rollData, html) {
 | |
|     let conf = {
 | |
|       title: titleTableDeResolution,
 | |
|       content: html,
 | |
|       buttons: {
 | |
|         'lancer-fermer': { label: 'Lancer les dés et fermer', callback: html => this.onLancerFermer() }
 | |
|       }
 | |
|     };
 | |
|     super(conf, { classes: ["rdd-roll-dialog"], top: 50, width: 'fit-content', height: 'fit-content', 'z-index': 99999 });
 | |
| 
 | |
|     this.rollData = rollData;
 | |
|   }
 | |
| 
 | |
|   activateListeners(html) {
 | |
|     super.activateListeners(html);
 | |
|     this.html = html;
 | |
|     this.bringToTop();
 | |
| 
 | |
| 
 | |
|     this.html.find("[name='diffLibre']").val(Misc.toInt(this.rollData.diffLibre));
 | |
|     this.html.find("[name='diffConditions']").val(Misc.toInt(this.rollData.diffConditions));
 | |
|     this.updateRollResult();
 | |
| 
 | |
|     this.html.find('.lancer-table-resolution').click((event) => {
 | |
|       this.onLancer();
 | |
|     });
 | |
|     // Update !
 | |
|     this.html.find("[name='diffLibre']").change((event) => {
 | |
|       this.rollData.diffLibre = Misc.toInt(event.currentTarget.value);
 | |
|       this.updateRollResult();
 | |
|     });
 | |
|     this.html.find("[name='diffConditions']").change((event) => {
 | |
|       this.rollData.diffConditions = Misc.toInt(event.currentTarget.value);
 | |
|       this.updateRollResult();
 | |
|     });
 | |
|     this.html.find("[name='carac']").change((event) => {
 | |
|       let caracKey = event.currentTarget.value;
 | |
|       this.rollData.selectedCarac = this.rollData.carac[caracKey];
 | |
|       this.updateRollResult();
 | |
|     });
 | |
|   }
 | |
| 
 | |
|   /* -------------------------------------------- */
 | |
|   async onLancer() {
 | |
|     await RdDResolutionTable.rollData(this.rollData);
 | |
|     console.log("RdDRollResolutionTable -=>", this.rollData, this.rollData.rolled);
 | |
|     await RdDRollResult.displayRollData(this.rollData);
 | |
|   }
 | |
| 
 | |
|   /* -------------------------------------------- */
 | |
|   async onLancerFermer() {
 | |
|     await RdDResolutionTable.rollData(this.rollData);
 | |
|     console.log("RdDRollResolutionTable -=>", this.rollData, this.rollData.rolled);
 | |
|     await RdDRollResult.displayRollData(this.rollData);
 | |
|   }
 | |
| 
 | |
|   /* -------------------------------------------- */
 | |
|   async updateRollResult() {
 | |
|     let rollData = this.rollData;
 | |
|     rollData.caracValue = parseInt(rollData.selectedCarac.value)
 | |
|     rollData.finalLevel = Misc.toInt(rollData.diffConditions) + Misc.toInt(rollData.diffLibre);
 | |
| 
 | |
|     const htmlTable = await RdDResolutionTable.buildHTMLTable({
 | |
|       carac: rollData.caracValue,
 | |
|       level: rollData.finalLevel,
 | |
|       maxCarac: 20,
 | |
|       maxLevel: 10
 | |
|     });
 | |
| 
 | |
|     // Mise à jour valeurs
 | |
|     this.html.find("[name='carac']").val(rollData.caracValue);
 | |
|     this.html.find(".roll-part-resolution").text(rollData.selectedCarac.value + " / " + Misc.toSignedString(rollData.finalLevel));
 | |
|     this.html.find("div.placeholder-resolution").empty().append(htmlTable)
 | |
| 
 | |
|   }
 | |
| 
 | |
|   /* -------------------------------------------- */
 | |
| 
 | |
|   async close() {
 | |
|     await super.close();
 | |
|     RdDRollResolutionTable.resolutionTable = undefined;
 | |
|   }
 | |
| }
 |