#77 Gestion alchimie

This commit is contained in:
2021-01-07 20:04:10 +01:00
parent ec86c81fc8
commit f4dc42743a
11 changed files with 266 additions and 3 deletions

View File

@ -17,6 +17,7 @@ import { DeDraconique } from "./de-draconique.js";
import { RdDAudio } from "./rdd-audio.js";
import { RdDItemCompetence } from "./item-competence.js";
import { RdDItemArme } from "./item-arme.js";
import { RdDAlchimie } from "./rdd-alchimie.js";
/* -------------------------------------------- */
/**
@ -2369,6 +2370,46 @@ export class RdDActor extends Actor {
}
}
/* -------------------------------------------- */
async effectuerTacheAlchimie( recetteId, alchimieName, alchimieData) {
let recette = this.data.items.find( item => item.type =='recettealchimique' && item._id == recetteId );
if ( recette) {
let competence = this.data.items.find( item => item.type =='competence' && item.name.toLowerCase() == "alchimie" );
let diffAlchimie = RdDAlchimie.getDifficulte(alchimieData);
let rollData = {
recetteName: recette.name,
competence: competence,
diffLibre: diffAlchimie // Per default at startup
}
if ( alchimieName == "couleur") {
rollData.selectedCarac = this.data.data.carac.vue,
rollData.alchimieTexte = `Couleurs ${alchimieData} (${diffAlchimie}) (Malus de -4 si vous ne possédez pas de Cristal Alchimique)`;
} else {
rollData.selectedCarac = this.data.data.carac.dexterite,
rollData.alchimieTexte = `Consistances ${alchimieData} (${diffAlchimie})`;
}
const dialog = await RdDRoll.create(this, rollData,
{ html: 'systems/foundryvtt-reve-de-dragon/templates/dialog-roll-alchimie.html',
},
{
name: 'tache-alchimique',
label: 'Tache Alchimique',
callbacks: [
this.createCallbackExperience(),
{ action: r => this._alchimieResult(r, false) }
]
}
);
dialog.render(true);
}
}
/* -------------------------------------------- */
_alchimieResult( rollData ) {
RdDResolutionTable.displayRollData(rollData, this, 'chat-resultat-alchimie.html');
}
}

View File

@ -1,6 +1,7 @@
import { RdDItemSort } from "./item-sort.js";
import { RdDUtility } from "./rdd-utility.js";
import { RdDItem } from "./item-rdd.js";
import { RdDAlchimie } from "./rdd-alchimie.js";
/**
* Extend the basic ItemSheet with some very simple modifications
@ -51,6 +52,9 @@ export class RdDItemSheet extends ItemSheet {
data.caracList = duplicate(game.system.model.Actor.personnage.carac);
data.competenceList = await RdDUtility.getCompetenceList( 'foundryvtt-reve-de-dragon.competences' );
}
if ( data.item.type == 'recettealchimique' ) {
RdDAlchimie.processManipulation(data.item, this.actor && this.actor._id );
}
if ( this.actor ) {
data.isOwned = true;
data.actorId = this.actor._id;
@ -77,6 +81,20 @@ export class RdDItemSheet extends ItemSheet {
let actor = game.actors.get( actorId );
actor.creerTacheDepuisLivre( this.item );
});
html.find('.alchimie-tache a').click((event) => {
let actorId = event.currentTarget.attributes['data-actor-id'].value;
let recetteId = event.currentTarget.attributes['data-recette-id'].value;
let tacheName = event.currentTarget.attributes['data-alchimie-tache'].value;
let tacheData = event.currentTarget.attributes['data-alchimie-data'].value;
let actor = game.actors.get( actorId );
if ( actor ) {
actor.effectuerTacheAlchimie(recetteId, tacheName, tacheData);
} else {
ui.notifications.info("Impossible trouver un actur pour réaliser cette tache Alchimique.");
}
});
}
/* -------------------------------------------- */

66
module/rdd-alchimie.js Normal file
View File

@ -0,0 +1,66 @@
/* -------------------------------------------- */
import { Misc } from "./misc.js";
/* -------------------------------------------- */
export class RdDAlchimie {
/* -------------------------------------------- */
static processManipulation( recette, actorId = undefined ) {
//console.log("CALLED", recette, recette.isOwned, actorId );
let manip = duplicate(recette.data.manipulation);
let reg1 = new RegExp(/@(\w*){([\w\-]+)}/ig);
let matchArray = manip.match( reg1 );
for( let matchStr of matchArray) {
let reg2 = new RegExp(/@(\w*){([\w\-]+)}/i);
let result = matchStr.match(reg2);
//console.log("RESULT ", result);
if ( result[1] && result[2]) {
let commande = Misc.upperFirst( result[1] );
let replacement = this[`_alchimie${commande}`](recette, result[2], actorId);
manip = manip.replace( result[0], replacement);
}
}
recette.data.manipulation_update = manip;
}
/* -------------------------------------------- */
static _alchimieCouleur( recette, couleurs, actorId ) {
let replacement
if ( actorId ) {
replacement = `<span class="alchimie-tache"><a data-recette-id="${recette._id}" data-actor-id="${actorId}" data-alchimie-tache="couleur" data-alchimie-data="${couleurs}">couleur ${couleurs}</a></span>`;
} else {
replacement = `<span class="alchimie-tache">couleur ${couleurs} </span>`;
}
return replacement;
}
/* -------------------------------------------- */
static _alchimieConsistance( recette, consistances, actorId ) {
let replacement
if ( actorId ) {
replacement = `<span class="alchimie-tache"><a data-recette-id="${recette._id}" data-actor-id="${actorId}" data-alchimie-tache="consistance" data-alchimie-data="${consistances}">consistance ${consistances}</a></span>`;
} else {
replacement = `<span class="alchimie-tache">consistance ${consistances} </span>`;
}
return replacement;
}
/* -------------------------------------------- */
static getDifficulte( aspects ) {
let aspectsArray = aspects.split('-');
let diff = 0;
let nbDifferent = 0;
let aspectsHash = {}
for (let colconst of aspectsArray) {
if ( aspectsHash[colconst] ){ // Deja present, augmente difficulté de 1
diff -= 1;
} else {
nbDifferent++;
aspectsHash[colconst] = colconst; // Keep track
}
}
diff = diff - ((nbDifferent>1) ? nbDifferent : 0); // Ca doit marcher ....
return Math.min(0, diff); // Pour être sur
}
}

View File

@ -191,6 +191,7 @@ export class RdDUtility {
'systems/foundryvtt-reve-de-dragon/templates/dialog-tmr.html',
'systems/foundryvtt-reve-de-dragon/templates/dialog-roll-surenc.html',
'systems/foundryvtt-reve-de-dragon/templates/dialog-roll-enctotal.html',
'systems/foundryvtt-reve-de-dragon/templates/dialog-roll-alchimie.html',
'systems/foundryvtt-reve-de-dragon/templates/dialog-astrologie-joueur.html',
// Calendrier
'systems/foundryvtt-reve-de-dragon/templates/calendar-template.html',
@ -215,6 +216,7 @@ export class RdDUtility {
'systems/foundryvtt-reve-de-dragon/templates/chat-resultat-general.html',
'systems/foundryvtt-reve-de-dragon/templates/chat-resultat-tache.html',
'systems/foundryvtt-reve-de-dragon/templates/chat-resultat-sort.html',
'systems/foundryvtt-reve-de-dragon/templates/chat-resultat-alchimie.html',
'systems/foundryvtt-reve-de-dragon/templates/chat-actor-turn-summary.html',
'systems/foundryvtt-reve-de-dragon/templates/chat-actor-competence-xp.html',
'systems/foundryvtt-reve-de-dragon/templates/chat-actor-carac-xp.html'
@ -270,6 +272,7 @@ export class RdDUtility {
data.data.taches = this.checkNull(data.itemsByType['tache']);
data.data.monnaie = this.checkNull(data.itemsByType['monnaie']);
data.data.meditations = this.checkNull(data.itemsByType['meditation']);
data.data.recettesAlchimiques = this.checkNull(data.itemsByType['recettealchimique']);
data.data.objets = data.data.conteneurs.concat(data.data.materiel).concat(data.data.armes).concat(data.data.armures).concat(data.data.munitions).concat(data.data.livres).concat(data.data.potions).concat(data.data.herbes).concat(data.data.ingredients);
}