Rework lancer de sort

This commit is contained in:
Vincent Vandemeulebrouck
2021-04-24 00:50:20 +02:00
parent 25c8c38722
commit 3be9be92ec
5 changed files with 143 additions and 117 deletions

View File

@ -324,12 +324,13 @@ export class RdDActor extends Actor {
/* -------------------------------------------- */
getDraconicList() {
return this.items.filter(it => Misc.data(it).type == 'competence' && Misc.templateData(it).categorie == 'draconic')
.sort(Misc.descending(it => Misc.templateData(it).niveau));
}
/* -------------------------------------------- */
getBestDraconic() {
const list = this.getDraconicList().sort(Misc.descending(it => Misc.templateData(it).niveau));
const list = this.getDraconicList();
if (list.length == 0) {
return { name: "Aucun", data: { name: "Aucun", data: { niveau: -11 } } };
return { name: "Aucun", data: { name: "Aucun", data: { niveau: 0 } } };
}
return duplicate(list[0]);
}
@ -1968,28 +1969,29 @@ export class RdDActor extends Actor {
}
/* -------------------------------------------- */
filterDraconicList(sortList) {
let draconicDone = {};
let newDraconicList = [];
let draconicList = this.getDraconicList();
let bestDraconic = this.getBestDraconic();
computeDraconicAndSortIndex(sortList) {
let draconicList = this.getDraconicList().map(d => duplicate(Misc.data(d)));
for (let sort of sortList) {
let voie = sort.data.draconic;
let draconic = RdDItemCompetence.getVoieDraconic(draconicList, voie);
//console.log(draconicList, bestDraconic, draconic, voie);
if (sort.name.toLowerCase().includes('aura')) {
draconic = bestDraconic;
let draconicsSort = this.getDraconicsSort(draconicList, sort).map(it => it.name);
for (let index = 0; index < draconicList.length && sort.data.listIndex==undefined; index++){
if (draconicsSort.includes(draconicList[index].name)){
sort.data.listIndex = index;
}
}
// TODO: duplicate sur Misc.data?
draconic = duplicate(Misc.data(draconic));
if (draconicDone[draconic.name] == undefined) {
draconic.data.defaut_carac = 'reve';
newDraconicList.push(draconic);
draconicDone[draconic.name] = newDraconicList.length - 1; // Patch local pour relier facilement voie/compétence
}
sort.data.listIndex = draconicDone[draconic.name] || 0;
}
return newDraconicList;
return draconicList;
}
getDraconicsSort(draconicList, sort) {
//console.log(draconicList, bestDraconic, draconic, voie);
switch (Grammar.toLowerCaseNoAccent(sort.name)) {
case "lecture d'aura":
case "detection d'aura":
return draconicList;
case "annulation de magie":
return draconicList.filter(it => !Grammar.toLowerCaseNoAccent(Misc.data(it).name).includes('thanatos'));
}
return [RdDItemCompetence.getVoieDraconic(draconicList, sort.data.draconic)];
}
/* -------------------------------------------- */
@ -2010,7 +2012,7 @@ export class RdDActor extends Actor {
}
if (this.currentTMR) this.currentTMR.minimize(); // Hide
let draconicList = this.filterDraconicList(sortList);
let draconicList = this.computeDraconicAndSortIndex(sortList);
const actorData = Misc.data(this);
let rollData = {
forceCarac: { 'reve': duplicate(actorData.data.carac.reve) },
@ -2029,6 +2031,7 @@ export class RdDActor extends Actor {
const dialog = await RdDRoll.create(this, rollData,
{
html: 'systems/foundryvtt-reve-de-dragon/templates/dialog-roll-sort.html',
options: { height: 600 },
close: html => { this.currentTMR.maximize() } // Re-display TMR
},
{
@ -2036,17 +2039,9 @@ export class RdDActor extends Actor {
label: 'Lancer un sort',
callbacks: [
this.createCallbackExperience(),
{ action: r => this._rollUnSortResult(r, false) }
{ action: r => this._rollUnSortResult(r) }
]
},
{
name: 'mettre-en-reserve',
label: 'Mettre un sort en réserve',
callbacks: [
this.createCallbackExperience(),
{ action: r => this._rollUnSortResult(r, true) }
]
},
}
);
dialog.render(true);
}
@ -2096,17 +2091,11 @@ export class RdDActor extends Actor {
}
/* -------------------------------------------- */
async _rollUnSortResult(rollData, isSortReserve = false) {
async _rollUnSortResult(rollData) {
let rolled = rollData.rolled;
let selectedSort = rollData.selectedSort;
let closeTMR = !isSortReserve;
if (selectedSort.data.isrituel && isSortReserve) {
ui.notifications.error("Impossible de mettre le rituel '" + selectedSort.name + "' en réserve");
this.currentTMR.close(); // Close TMR !
return;
}
rollData.isSortReserve = isSortReserve;
rollData.isSortReserve = rollData.mettreEnReserve && !selectedSort.data.isrituel;
rollData.show = {}
rollData.depenseReve = Number(selectedSort.data.ptreve_reel);
@ -2127,7 +2116,6 @@ export class RdDActor extends Actor {
if (rollData.isSortReserve) {
await this.sortMisEnReserve(rollData, selectedSort);
closeTMR = false;
}
}
else {
@ -2147,10 +2135,10 @@ export class RdDActor extends Actor {
reveActuel = Math.max(reveActuel - rollData.depenseReve, 0);
await this.update({ "data.reve.reve.value": reveActuel });
if (closeTMR) {
this.currentTMR.close(); // Close TMR !
} else {
if (rollData.isSortReserve) {
this.currentTMR.maximize(); // Re-display TMR
} else {
this.currentTMR.close(); // Close TMR !
}
// Final chat message
RdDResolutionTable.displayRollData(rollData, this, 'chat-resultat-sort.html');