forked from public/foundryvtt-reve-de-dragon
Utilisation de system dans les Item/Actor Sheet
Utilisation de system dans les data de formulaire pour tous les Item/Actor (à la base, ou les sous-éléments) Corrections sur les sorts en réserve (ce ne sont pas des Item) Petites améliorations: * `actor.itemTypes[type]` revient à faire (sans besoin de filtrer) `actor.items.filter(it => it.type == type)` * dans les ItemSheet, this.object et this.document remplacés par this.item * dans les ActorSheet, this.object et this.document remplacés par this.actor Quelques corrections en plus: * parade ne marchait pas * problèmes sur le commerce
This commit is contained in:
219
module/actor.js
219
module/actor.js
@ -35,6 +35,14 @@ import { RdDItem } from "./item.js";
|
||||
import { RdDPossession } from "./rdd-possession.js";
|
||||
import { ENTITE_BLURETTE, ENTITE_INCARNE, ENTITE_NONINCARNE, SYSTEM_RDD, SYSTEM_SOCKET_ID } from "./constants.js";
|
||||
|
||||
const POSSESSION_SANS_DRACONIC = {
|
||||
img: 'systems/foundryvtt-reve-de-dragon/icons/entites/possession.webp',
|
||||
name: 'Sans draconic',
|
||||
system: {
|
||||
niveau: 0,
|
||||
defaut_carac: "reve",
|
||||
}
|
||||
};
|
||||
|
||||
/* -------------------------------------------- */
|
||||
/**
|
||||
@ -63,23 +71,23 @@ export class RdDActor extends Actor {
|
||||
}
|
||||
}
|
||||
|
||||
static remoteActorCall(data, canExecuteLocally = () => Misc.isUniqueConnectedGM()) {
|
||||
static remoteActorCall(callData, canExecuteLocally = () => Misc.isUniqueConnectedGM()) {
|
||||
if (canExecuteLocally()) {
|
||||
RdDActor.onRemoteActorCall(data);
|
||||
RdDActor.onRemoteActorCall(callData);
|
||||
return false;
|
||||
}
|
||||
else {
|
||||
game.socket.emit(SYSTEM_SOCKET_ID, { msg: "msg_remote_actor_call", data: data });
|
||||
game.socket.emit(SYSTEM_SOCKET_ID, { msg: "msg_remote_actor_call", data: callData });
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
static onRemoteActorCall(data) {
|
||||
const actor = game.actors.get(data?.actorId);
|
||||
static onRemoteActorCall(callData) {
|
||||
const actor = game.actors.get(callData?.actorId);
|
||||
if (Misc.isOwnerPlayerOrUniqueConnectedGM(actor)) { // Seul le joueur choisi effectue l'appel: le joueur courant si propriétaire de l'actor, ou le MJ sinon
|
||||
const args = data.args;
|
||||
console.info(`RdDActor.onRemoteActorCall: pour l'Actor ${data.actorId}, appel de RdDActor.${data.method}(`, ...args, ')');
|
||||
actor[data.method](...args);
|
||||
const args = callData.args;
|
||||
console.info(`RdDActor.onRemoteActorCall: pour l'Actor ${callData.actorId}, appel de RdDActor.${callData.method}(`, ...args, ')');
|
||||
actor[callData.method](...args);
|
||||
}
|
||||
}
|
||||
|
||||
@ -95,8 +103,8 @@ export class RdDActor extends Actor {
|
||||
* This overrided create() function adds initial items
|
||||
* Namely: Basic skills, money,
|
||||
*
|
||||
* @param {Object} actorData Barebones actor data which this function adds onto.
|
||||
* @param {Object} options (Unused) Additional options which customize the creation workflow.
|
||||
* @param {Object} actorData Barebones actor template data which this function adds onto.
|
||||
* @param {Object} options Additional options which customize the creation workflow.
|
||||
*
|
||||
*/
|
||||
static async create(actorData, options) {
|
||||
@ -110,7 +118,7 @@ export class RdDActor extends Actor {
|
||||
if (actorData.items) {
|
||||
let actor = await super.create(actorData, options);
|
||||
if (isPersonnage) {
|
||||
await actor.checkMonnaiePresence(actorData.items);
|
||||
await actor.checkMonnaiePresence();
|
||||
}
|
||||
return actor;
|
||||
}
|
||||
@ -175,7 +183,7 @@ export class RdDActor extends Actor {
|
||||
this.computePrixTotalEquipement();
|
||||
this.computeEtatGeneral();
|
||||
// Sanity check
|
||||
await this.checkMonnaiePresence(actorData.items);
|
||||
await this.checkMonnaiePresence();
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
@ -189,9 +197,9 @@ export class RdDActor extends Actor {
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
async checkMonnaiePresence(items) { // Ajout opportuniste si les pièces n'existent pas.
|
||||
if (!items) return; // Sanity check during import
|
||||
let manquantes = Monnaie.monnaiesManquantes(items);
|
||||
async checkMonnaiePresence() { // Ajout opportuniste si les pièces n'existent pas.
|
||||
if (!this.items) return; // Sanity check during import
|
||||
let manquantes = Monnaie.monnaiesManquantes(this.itemTypes['monnaie']);
|
||||
//console.log("Manque : ", manquantes);
|
||||
if (manquantes.length > 0) {
|
||||
await this.createEmbeddedDocuments('Item', manquantes, { renderSheet: false });
|
||||
@ -313,13 +321,11 @@ export class RdDActor extends Actor {
|
||||
}
|
||||
|
||||
listItemsData(type) {
|
||||
return this.filterItemsData(it => it.type == type);
|
||||
}
|
||||
filterItemsData(filter) {
|
||||
return this.items.map(it => it).filter(filter)
|
||||
return this.itemTypes[type];
|
||||
}
|
||||
|
||||
filterItems(filter) {
|
||||
return this.items.filter(it => filter(it))
|
||||
return this.items.filter(filter);
|
||||
}
|
||||
|
||||
getItemOfType(idOrName, type) {
|
||||
@ -358,32 +364,26 @@ export class RdDActor extends Actor {
|
||||
/* -------------------------------------------- */
|
||||
getDraconicList() {
|
||||
return this.items.filter(it => it.type == 'competence' && it.system.categorie == 'draconic')
|
||||
.sort(Misc.descending(it => it.system.niveau))
|
||||
}
|
||||
/* -------------------------------------------- */
|
||||
getBestDraconic() {
|
||||
const list = this.getDraconicList()
|
||||
.sort(Misc.descending(it => it.system.niveau))
|
||||
return duplicate(list[0])
|
||||
}
|
||||
|
||||
getDraconicOuPossession() {
|
||||
const possessions = this.items.filter(it => it.type == 'competencecreature' && it.system.ispossession)
|
||||
.sort(Misc.descending(it => it.system.niveau));
|
||||
if (possessions.length > 0) {
|
||||
return duplicate(possessions[0]);
|
||||
}
|
||||
const draconics = this.getDraconicList().filter(it => it.system.niveau >= 0);
|
||||
if (draconics.length > 0) {
|
||||
return duplicate(draconics[0]);
|
||||
}
|
||||
return {
|
||||
img: 'systems/foundryvtt-reve-de-dragon/icons/entites/possession.webp',
|
||||
name: 'Sans draconic',
|
||||
data: {
|
||||
niveau: 0,
|
||||
defaut_carac: "reve",
|
||||
}
|
||||
};
|
||||
const draconics = [...this.getDraconicList().filter(it => it.system.niveau >= 0),
|
||||
POSSESSION_SANS_DRACONIC]
|
||||
.sort(Misc.descending(it => it.system.niveau));
|
||||
return duplicate(draconics[0]);
|
||||
}
|
||||
|
||||
getPossession(possessionId) {
|
||||
return this.items.find(it => it.type == 'possession' && it.system.possessionid == possessionId);
|
||||
}
|
||||
@ -397,7 +397,7 @@ export class RdDActor extends Actor {
|
||||
|
||||
/* -------------------------------------------- */
|
||||
async verifierPotionsEnchantees() {
|
||||
let potionsEnchantees = this.filterItemsData(it => it.type == 'potion' && it.system.categorie.toLowerCase().includes('enchant'));
|
||||
let potionsEnchantees = this.filterItems(it => it.type == 'potion' && it.system.categorie.toLowerCase().includes('enchant'));
|
||||
for (let potion of potionsEnchantees) {
|
||||
if (!potion.system.prpermanent) {
|
||||
console.log(potion);
|
||||
@ -882,8 +882,6 @@ export class RdDActor extends Actor {
|
||||
if (caracName == 'Taille') {
|
||||
return;
|
||||
}
|
||||
// if ( isNaN(caracXP) || typeof(caracXP) != 'number') caracXP = 0;
|
||||
//await this.update({ [`data.carac.${caracName}.xp`]: caracXP });
|
||||
this.checkCaracXP(caracName);
|
||||
}
|
||||
|
||||
@ -1181,7 +1179,7 @@ export class RdDActor extends Actor {
|
||||
item.estContenu = undefined;
|
||||
}
|
||||
if (item.type == 'conteneur' && item.system.contenu.length > 0) {
|
||||
corrections.push({ _id: itemData._id, 'system.contenu': [] });
|
||||
corrections.push({ _id: item.id, 'system.contenu': [] });
|
||||
}
|
||||
}
|
||||
if (corrections.length > 0) {
|
||||
@ -1352,7 +1350,7 @@ export class RdDActor extends Actor {
|
||||
|
||||
/* -------------------------------------------- */
|
||||
async computeMalusArmure() {
|
||||
const newMalusArmure = this.filterItemsData(it => it.type == 'armure' && it.system.equipe)
|
||||
const newMalusArmure = this.filterItems(it => it.type == 'armure' && it.system.equipe)
|
||||
.map(it => it.system.malus ?? 0)
|
||||
.reduce(Misc.sum(), 0);
|
||||
// Mise à jour éventuelle du malus armure
|
||||
@ -1364,7 +1362,7 @@ export class RdDActor extends Actor {
|
||||
|
||||
/* -------------------------------------------- */
|
||||
computePrixTotalEquipement() {
|
||||
this.prixTotalEquipement = this.filterItemsData(it => it.system.prixTotal)
|
||||
this.prixTotalEquipement = this.filterItems(it => it.system.prixTotal)
|
||||
.map(it => it.system.prixTotal ?? 0)
|
||||
.reduce(Misc.sum(), 0);
|
||||
// Mise à jour valeur totale de l'équipement
|
||||
@ -1374,6 +1372,9 @@ export class RdDActor extends Actor {
|
||||
/* -------------------------------------------- */
|
||||
computeResumeBlessure(blessures = undefined) {
|
||||
blessures = blessures ?? this.system.blessures;
|
||||
if (!blessures) {
|
||||
return "Pas de blessures possibles";
|
||||
}
|
||||
let nbLegeres = this.countBlessures(blessures.legeres.liste);
|
||||
let nbGraves = this.countBlessures(blessures.graves.liste);
|
||||
let nbCritiques = this.countBlessures(blessures.critiques.liste);
|
||||
@ -1393,11 +1394,11 @@ export class RdDActor extends Actor {
|
||||
resume += ",";
|
||||
resume += " une CRITIQUE !";
|
||||
}
|
||||
return resume;
|
||||
}
|
||||
else {
|
||||
resume = "Aucune blessure";
|
||||
return "Aucune blessure";
|
||||
}
|
||||
return resume;
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
@ -1515,7 +1516,7 @@ export class RdDActor extends Actor {
|
||||
|
||||
/* -------------------------------------------- */
|
||||
buildTMRInnaccessible() {
|
||||
const tmrInnaccessibles = this.filterItemsData(it => Draconique.isCaseTMR(it) &&
|
||||
const tmrInnaccessibles = this.filterItems(it => Draconique.isCaseTMR(it) &&
|
||||
EffetsDraconiques.isInnaccessible(it));
|
||||
return tmrInnaccessibles.map(it => it.system.coord);
|
||||
}
|
||||
@ -1648,8 +1649,11 @@ export class RdDActor extends Actor {
|
||||
}
|
||||
|
||||
countBlessuresNonSoigneeByName(name) {
|
||||
let blessures = this.system.blessures[name].liste;
|
||||
return blessures.filter(b => b.active && !b.psdone).length;
|
||||
if (this.system.blessures) {
|
||||
let blessures = this.system.blessures[name].liste;
|
||||
return blessures.filter(b => b.active && !b.psdone).length;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
@ -1766,7 +1770,6 @@ export class RdDActor extends Actor {
|
||||
}
|
||||
}
|
||||
compteur.value = result.newValue;
|
||||
//console.log(name, inc, data.value, result.newValue, minValue, data.max);
|
||||
// If endurance lost, then the same amount of fatigue cannot be recovered
|
||||
if (ReglesOptionelles.isUsing("appliquer-fatigue") && sante.fatigue && fatigue > 0) {
|
||||
sante.fatigue.value = Math.max(sante.fatigue.value + fatigue, this._computeFatigueMin());
|
||||
@ -1948,15 +1951,16 @@ export class RdDActor extends Actor {
|
||||
|
||||
/* -------------------------------------------- */
|
||||
async consommerNourritureboisson(item, choix = { doses: 1, seForcer: false, supprimerSiZero: false }) {
|
||||
if (itemData.type != 'nourritureboisson') {
|
||||
|
||||
if (item.type != 'nourritureboisson') {
|
||||
return;
|
||||
}
|
||||
if (choix.doses > itemData.system.quantite) {
|
||||
ui.notifications.warn(`Il n'y a pas assez de ${itemData.name} pour manger ${choix.doses}`)
|
||||
if (choix.doses > item.system.quantite) {
|
||||
ui.notifications.warn(`Il n'y a pas assez de ${item.name} pour manger ${choix.doses}`)
|
||||
return;
|
||||
}
|
||||
if (!this._apprecierCuisine(itemData, choix.seForcer)) {
|
||||
ui.notifications.info(`${this.name} ne n'arrive pas à manger de ${itemData.name}`)
|
||||
if (!this._apprecierCuisine(item, choix.seForcer)) {
|
||||
ui.notifications.info(`${this.name} ne n'arrive pas à manger de ${item.name}`)
|
||||
return;
|
||||
}
|
||||
await this.manger(item, choix.doses, { diminuerQuantite: false });
|
||||
@ -1964,10 +1968,10 @@ export class RdDActor extends Actor {
|
||||
await item.diminuerQuantite(choix.doses, choix);
|
||||
}
|
||||
|
||||
async _apprecierCuisine(itemData, seForcer) {
|
||||
const surmonteExotisme = await this._surmonterExotisme(itemData, seForcer);
|
||||
async _apprecierCuisine(item, seForcer) {
|
||||
const surmonteExotisme = await this._surmonterExotisme(item, seForcer);
|
||||
if (surmonteExotisme) {
|
||||
await this.apprecier('gout', 'cuisine', itemData.system.qualite, itemData.system.boisson ? "apprécie la boisson" : "apprécie le plat");
|
||||
await this.apprecier('gout', 'cuisine', item.system.qualite, item.system.boisson ? "apprécie la boisson" : "apprécie le plat");
|
||||
}
|
||||
else if (seForcer) {
|
||||
await this.jetDeMoral('malheureux');
|
||||
@ -1979,10 +1983,10 @@ export class RdDActor extends Actor {
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
async _surmonterExotisme(itemData) {
|
||||
const exotisme = Math.min(itemData.system.exotisme, itemData.system.qualite, 0);
|
||||
async _surmonterExotisme(item) {
|
||||
const exotisme = Math.min(item.system.exotisme, item.system.qualite, 0);
|
||||
if (exotisme < 0) {
|
||||
const rolled = await this.rollCaracCompetence('volonte', 'cuisine', exotisme, { title: `tente de surmonter l'exotisme de ${itemData.name}` });
|
||||
const rolled = await this.rollCaracCompetence('volonte', 'cuisine', exotisme, { title: `tente de surmonter l'exotisme de ${item.name}` });
|
||||
return rolled.isSuccess;
|
||||
}
|
||||
return true;
|
||||
@ -2007,14 +2011,13 @@ export class RdDActor extends Actor {
|
||||
|
||||
/* -------------------------------------------- */
|
||||
async boire(item, doses, options = { diminuerQuantite: true }) {
|
||||
const itemData = item;
|
||||
const desaltere = itemData.system.desaltere;
|
||||
const desaltere = item.system.desaltere;
|
||||
if (desaltere > 0) {
|
||||
await this.updateCompteurValue('eau', Misc.keepDecimals(this.system.compteurs.eau.value + desaltere * doses, 1));
|
||||
}
|
||||
if (item.isAlcool()) {
|
||||
for (let i = 0; i < doses; i++) {
|
||||
await this.saouler(itemData.system.force, item);
|
||||
await this.saouler(item.system.force, item);
|
||||
}
|
||||
}
|
||||
await item.diminuerQuantite(doses, options);
|
||||
@ -2268,7 +2271,6 @@ export class RdDActor extends Actor {
|
||||
let tmr = TMRUtility.getTMR(coord);
|
||||
let letfilteredList = []
|
||||
for (let sort of sortList) {
|
||||
//console.log(sort.name, sort.data.caseTMR.toLowerCase(), sort.data.caseTMRspeciale.toLowerCase(), coord.toLowerCase() );
|
||||
if (sort.system.caseTMR.toLowerCase().includes('variable')) {
|
||||
letfilteredList.push(sort);
|
||||
} else if (sort.system.caseTMRspeciale.toLowerCase().includes('variable')) {
|
||||
@ -2575,8 +2577,7 @@ export class RdDActor extends Actor {
|
||||
|
||||
/* -------------------------------------------- */
|
||||
async creerTacheDepuisLivre(item, options = { renderSheet: true }) {
|
||||
const itemData = item
|
||||
const nomTache = "Lire " + itemData.name;
|
||||
const nomTache = "Lire " + item.name;
|
||||
const filterTacheLecture = it => it.type == 'tache' && it.name == nomTache;
|
||||
let tachesExistantes = this.filterItems(filterTacheLecture);
|
||||
if (tachesExistantes.length == 0) {
|
||||
@ -2585,12 +2586,12 @@ export class RdDActor extends Actor {
|
||||
system: {
|
||||
carac: 'intellect',
|
||||
competence: 'Ecriture',
|
||||
difficulte: itemData.system.difficulte,
|
||||
difficulte: item.system.difficulte,
|
||||
periodicite: "60 minutes",
|
||||
fatigue: 2,
|
||||
points_de_tache: itemData.system.points_de_tache,
|
||||
points_de_tache: item.system.points_de_tache,
|
||||
points_de_tache_courant: 0,
|
||||
description: "Lecture du livre " + item.name + " - XP : " + itemData.system.xp + " - Compétences : " + itemData.system.competence
|
||||
description: "Lecture du livre " + item.name + " - XP : " + item.system.xp + " - Compétences : " + item.system.competence
|
||||
}
|
||||
}
|
||||
await this.createEmbeddedDocuments('Item', [tache], options);
|
||||
@ -2870,8 +2871,11 @@ export class RdDActor extends Actor {
|
||||
if (this.currentTMR) this.currentTMR.minimize(); // Hide
|
||||
|
||||
let draconicList = this.getDraconicList()
|
||||
.map(draconic => duplicate(draconic))
|
||||
.map(draconic => { draconic.system.defaut_carac = "intellect"; return draconic; });
|
||||
.map(draconic => {
|
||||
let draconicLecture = duplicate(draconic);
|
||||
draconicLecture.system.defaut_carac = "intellect";
|
||||
return draconicLecture;
|
||||
});
|
||||
|
||||
const intellect = this.system.carac.intellect;
|
||||
let rollData = {
|
||||
@ -2989,7 +2993,7 @@ export class RdDActor extends Actor {
|
||||
}
|
||||
/* -------------------------------------------- */
|
||||
checkDesirLancinant() {
|
||||
let queue = this.filterItemsData(it => it.type == 'queue' || it.type == 'ombre')
|
||||
let queue = this.filterItems(it => it.type == 'queue' || it.type == 'ombre')
|
||||
.filter(it => Grammar.toLowerCaseNoAccent(it.name).includes('desir lancinant'));
|
||||
return (queue.length > 0);
|
||||
}
|
||||
@ -3056,23 +3060,23 @@ export class RdDActor extends Actor {
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
async resetNombreAstral(data) {
|
||||
async resetNombreAstral() {
|
||||
let toDelete = this.listItemsData('nombreastral');
|
||||
const deletions = toDelete.map(it => it._id);
|
||||
await this.deleteEmbeddedDocuments("Item", deletions);
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
async ajouteNombreAstral(data) {
|
||||
async ajouteNombreAstral(callData) {
|
||||
// Gestion expérience (si existante)
|
||||
data.competence = this.getCompetence("astrologie")
|
||||
data.selectedCarac = this.system.carac["vue"];
|
||||
this.appliquerAjoutExperience(data, 'hide');
|
||||
callData.competence = this.getCompetence("astrologie")
|
||||
callData.selectedCarac = this.system.carac["vue"];
|
||||
this.appliquerAjoutExperience(callData, 'hide');
|
||||
|
||||
// Ajout du nombre astral
|
||||
const item = {
|
||||
name: "Nombre Astral", type: "nombreastral", data:
|
||||
{ value: data.nbAstral, istrue: data.isvalid, jourindex: Number(data.date), jourlabel: game.system.rdd.calendrier.getDateFromIndex(Number(data.date)) }
|
||||
name: "Nombre Astral", type: "nombreastral", system:
|
||||
{ value: callData.nbAstral, istrue: callData.isvalid, jourindex: Number(callData.date), jourlabel: game.system.rdd.calendrier.getDateFromIndex(Number(callData.date)) }
|
||||
};
|
||||
await this.createEmbeddedDocuments("Item", [item]);
|
||||
|
||||
@ -3218,15 +3222,15 @@ export class RdDActor extends Actor {
|
||||
/* -------------------------------------------- */
|
||||
getArmeParade(armeParadeId) {
|
||||
const item = armeParadeId ? this.getEmbeddedDocument('Item', armeParadeId) : undefined;
|
||||
return RdDItemArme.getArmeData(item);
|
||||
return RdDItemArme.getArme(item);
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
verifierForceMin(itemData) {
|
||||
if (itemData.type == 'arme' && itemData.system.force > this.system.carac.force.value) {
|
||||
verifierForceMin(item) {
|
||||
if (item.type == 'arme' && item.system.force > this.system.carac.force.value) {
|
||||
ChatMessage.create({
|
||||
content: `<strong>${this.name} s'est équipé(e) de l'arme ${itemData.name}, mais n'a pas une force suffisante pour l'utiliser normalement </strong>
|
||||
(${itemData.system.force} nécessaire pour une Force de ${this.system.carac.force.value})`
|
||||
content: `<strong>${this.name} s'est équipé(e) de l'arme ${item.name}, mais n'a pas une force suffisante pour l'utiliser normalement </strong>
|
||||
(${item.system.force} nécessaire pour une Force de ${this.system.carac.force.value})`
|
||||
});
|
||||
}
|
||||
}
|
||||
@ -3251,10 +3255,10 @@ export class RdDActor extends Actor {
|
||||
let armeData = attackerRoll.arme;
|
||||
let protection = 0;
|
||||
const armures = this.items.filter(it => it.type == "armure" && it.system.equipe);
|
||||
for (const itemData of armures) {
|
||||
protection += await RdDDice.rollTotal(itemData.system.protection.toString());
|
||||
for (const armure of armures) {
|
||||
protection += await RdDDice.rollTotal(armure.system.protection.toString());
|
||||
if (dmg > 0) {
|
||||
this._deteriorerArmure(itemData, dmg);
|
||||
this._deteriorerArmure(armure, dmg);
|
||||
dmg = 0;
|
||||
}
|
||||
}
|
||||
@ -3273,39 +3277,39 @@ export class RdDActor extends Actor {
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
_deteriorerArmure(item, dmg) {
|
||||
let itemData = duplicate(item);
|
||||
if (!ReglesOptionelles.isUsing('deteriorationArmure') || itemData.system.protection == '0') {
|
||||
_deteriorerArmure(armure, dmg) {
|
||||
armure = duplicate(armure);
|
||||
if (!ReglesOptionelles.isUsing('deteriorationArmure') || armure.system.protection == '0') {
|
||||
return;
|
||||
}
|
||||
itemData.system.deterioration = (itemData.system.deterioration ?? 0) + dmg;
|
||||
if (itemData.system.deterioration >= 10) {
|
||||
itemData.system.deterioration -= 10;
|
||||
let res = /(\d+)?d(\d+)(\-\d+)?/.exec(itemData.system.protection);
|
||||
armure.system.deterioration = (armure.system.deterioration ?? 0) + dmg;
|
||||
if (armure.system.deterioration >= 10) {
|
||||
armure.system.deterioration -= 10;
|
||||
let res = /(\d+)?d(\d+)(\-\d+)?/.exec(armure.system.protection);
|
||||
if (res) {
|
||||
let malus = Misc.toInt(res[3]) - 1;
|
||||
let armure = Misc.toInt(res[2]);
|
||||
if (armure + malus <= 0) {
|
||||
itemData.system.protection = 0;
|
||||
armure.system.protection = 0;
|
||||
} else {
|
||||
itemData.system.protection = '' + (res[1] ?? '1') + 'd' + armure + malus;
|
||||
armure.system.protection = '' + (res[1] ?? '1') + 'd' + armure + malus;
|
||||
}
|
||||
}
|
||||
else if (/\d+/.exec(itemData.system.protection)) {
|
||||
itemData.system.protection = "1d" + itemData.system.protection;
|
||||
else if (/\d+/.exec(armure.system.protection)) {
|
||||
armure.system.protection = "1d" + armure.system.protection;
|
||||
}
|
||||
else {
|
||||
ui.notifications.warn(`La valeur d'armure de votre ${item.name} est incorrecte`);
|
||||
ui.notifications.warn(`La valeur d'armure de votre ${armure.name} est incorrecte`);
|
||||
}
|
||||
ChatMessage.create({ content: "Votre armure s'est détériorée, elle protège maintenant de " + itemData.system.protection });
|
||||
ChatMessage.create({ content: "Votre armure s'est détériorée, elle protège maintenant de " + armure.system.protection });
|
||||
}
|
||||
this.updateEmbeddedDocuments('Item', [itemData]);
|
||||
this.updateEmbeddedDocuments('Item', [armure]);
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
async encaisser() {
|
||||
let data = { ajustementsEncaissement: RdDUtility.getAjustementsEncaissement() };
|
||||
let html = await renderTemplate('systems/foundryvtt-reve-de-dragon/templates/dialog-roll-encaisser.html', data);
|
||||
let dialogData = { ajustementsEncaissement: RdDUtility.getAjustementsEncaissement() };
|
||||
let html = await renderTemplate('systems/foundryvtt-reve-de-dragon/templates/dialog-roll-encaisser.html', dialogData);
|
||||
new RdDEncaisser(html, this).render(true);
|
||||
}
|
||||
|
||||
@ -3486,8 +3490,8 @@ export class RdDActor extends Actor {
|
||||
/* -------------------------------------------- */
|
||||
/** @override */
|
||||
getRollData() {
|
||||
const data = super.getRollData();
|
||||
return data;
|
||||
const rollData = super.getRollData();
|
||||
return rollData;
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
@ -3578,20 +3582,19 @@ export class RdDActor extends Actor {
|
||||
|
||||
/* -------------------------------------------- */
|
||||
getFortune() {
|
||||
let monnaies = Monnaie.filtrerMonnaies(this.items);
|
||||
let monnaies = this.itemTypes['monnaie'];
|
||||
if (monnaies.length < 4) {
|
||||
ui.notifications.error("Problème de monnaies manquantes, impossible de payer correctement!")
|
||||
throw "Problème de monnaies manquantes, impossible de payer correctement!";
|
||||
}
|
||||
return monnaies.map(m => this.system)
|
||||
.map(tpl => tpl.valeur_deniers * Number(tpl.quantite))
|
||||
return monnaies.map(m => Number(m.system.valeur_deniers) * Number(m.system.quantite))
|
||||
.reduce(Misc.sum(), 0);
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
async optimizeArgent(fortuneTotale) {
|
||||
let monnaies = Monnaie.filtrerMonnaies(this.items);
|
||||
let parValeur = Misc.classifyFirst(monnaies, it => this.system.valeur_deniers);
|
||||
let monnaies = this.itemTypes['monnaie'];
|
||||
let parValeur = Misc.classifyFirst(monnaies, it => it.system.valeur_deniers);
|
||||
let nouvelleFortune = {
|
||||
1000: Math.floor(fortuneTotale / 1000), // or
|
||||
100: Math.floor(fortuneTotale / 100) % 10, // argent
|
||||
@ -3716,7 +3719,7 @@ export class RdDActor extends Actor {
|
||||
const buttonAcheter = html.find(".button-acheter")[0];
|
||||
const vente = DialogItemAchat.prepareVenteData(buttonAcheter, achat.vendeurId, vendeur, acheteur);
|
||||
const itemId = vente.item._id;
|
||||
const isItemEmpilable = "quantite" in vente.item.data;
|
||||
const isItemEmpilable = "quantite" in vente.item.system;
|
||||
|
||||
const coutDeniers = Math.floor((achat.prixTotal ?? 0) * 100);
|
||||
achat.quantiteTotal = (achat.choix.nombreLots ?? 1) * (vente.tailleLot);
|
||||
@ -3748,7 +3751,7 @@ export class RdDActor extends Actor {
|
||||
type: vente.item.type,
|
||||
img: vente.item.img,
|
||||
name: vente.item.name,
|
||||
data: mergeObject(vente.item.system, { quantite: isItemEmpilable ? achat.quantiteTotal : undefined }),
|
||||
system: mergeObject(vente.item.system, { quantite: isItemEmpilable ? achat.quantiteTotal : undefined }),
|
||||
}
|
||||
let listeAchat = isItemEmpilable ? [achatData] : Array.from({ length: achat.quantiteTotal }, (_, i) => achatData)
|
||||
let items = await acheteur.createEmbeddedDocuments("Item", listeAchat)
|
||||
|
Reference in New Issue
Block a user