This commit is contained in:
sladecraven 2021-05-07 07:31:08 +02:00
commit b78d9dd31a
23 changed files with 166 additions and 148 deletions

View File

@ -37,7 +37,8 @@ export class RdDActorCreatureSheet extends RdDActorSheet {
formData.calc.surEncombrementMessage = (formData.data.compteurs.surenc.value < 0) ? "Sur-Encombrement!" : ""; formData.calc.surEncombrementMessage = (formData.data.compteurs.surenc.value < 0) ? "Sur-Encombrement!" : "";
RdDUtility.filterItemsPerTypeForSheet(formData); RdDUtility.filterItemsPerTypeForSheet(formData);
RdDUtility.buildArbreDeConteneur(this, formData); this.objetVersConteneur = RdDUtility.buildArbreDeConteneurs(formData.conteneurs, formData.objets);
formData.conteneurs = RdDUtility.conteneursRacine(formData.conteneurs);
console.log("Creature : ", this.objetVersConteneur, formData); console.log("Creature : ", this.objetVersConteneur, formData);

View File

@ -112,7 +112,9 @@ export class RdDActorSheet extends ActorSheet {
cacheTMR: this.actor.isTMRCache() cacheTMR: this.actor.isTMRCache()
} }
RdDUtility.buildArbreDeConteneur(this, formData); this.objetVersConteneur = RdDUtility.buildArbreDeConteneurs(formData.conteneurs, formData.objets);
formData.conteneurs = RdDUtility.conteneursRacine(formData.conteneurs);
formData.subacteurs = { formData.subacteurs = {
vehicules: this.actor.listeVehicules(), vehicules: this.actor.listeVehicules(),
montures: this.actor.listeMontures(), montures: this.actor.listeMontures(),
@ -130,10 +132,17 @@ export class RdDActorSheet extends ActorSheet {
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
async _onDrop(event) { async _onDropActor(event, dragData) {
let toSuper = await this.actor.processItemDropEvent(event, this.objetVersConteneur); console.log("DRAG", this.actor.id, dragData);
if (toSuper) { this.actor.addSubacteur(dragData.id || dragData.data._id);
super._onDrop(event); super._onDropActor(event, dragData);
}
/* -------------------------------------------- */
async _onDropItem(event, dragData) {
const callSuper = await this.actor.processDropItem(event, dragData, this.objetVersConteneur);
if (callSuper) {
await super._onDropItem(event, dragData)
} }
} }
@ -221,14 +230,11 @@ export class RdDActorSheet extends ActorSheet {
const item = this.actor.items.get(li.data("item-id")); const item = this.actor.items.get(li.data("item-id"));
item.sheet.render(true); item.sheet.render(true);
}); });
// Update Inventory Item
html.find('.rencontre-delete').click(ev => { html.find('.rencontre-delete').click(ev => {
const li = $(ev.currentTarget).parents(".item"); const li = $(ev.currentTarget).parents(".item");
const rencontreKey = li.data("item-id"); const rencontreKey = li.data("item-id");
this.actor.deleteTMRRencontre(rencontreKey); this.actor.deleteTMRRencontre(rencontreKey);
}); });
// Delete Inventory Item
html.find('.item-delete').click(ev => { html.find('.item-delete').click(ev => {
const li = $(ev.currentTarget).parents(".item"); const li = $(ev.currentTarget).parents(".item");
RdDUtility.confirmerSuppression(this, li); RdDUtility.confirmerSuppression(this, li);
@ -623,11 +629,10 @@ export class RdDActorSheet extends ActorSheet {
} }
async _onSplitItem(item, split) { async _onSplitItem(item, split) {
const itemData = Misc.data(item); if (split >= 1 && split < Misc.data(item).data.quantite) {
if (split >= 1 && split < itemData.data.quantite) {
await item.diminuerQuantite(split); await item.diminuerQuantite(split);
const itemData = duplicate( Misc.data(item));
itemData.data.quantite = split; itemData.data.quantite = split;
itemData.id = undefined;
await this.actor.createEmbeddedDocuments('Item', [itemData]) await this.actor.createEmbeddedDocuments('Item', [itemData])
} }
} }

View File

@ -52,7 +52,8 @@ export class RdDActorVehiculeSheet extends ActorSheet {
}; };
RdDUtility.filterItemsPerTypeForSheet(formData); RdDUtility.filterItemsPerTypeForSheet(formData);
RdDUtility.buildArbreDeConteneur(this, formData); this.objetVersConteneur = RdDUtility.buildArbreDeConteneurs(formData.conteneurs, formData.objets);
formData.conteneurs = RdDUtility.conteneursRacine(formData.conteneurs);
formData.options.isGM = game.user.isGM; formData.options.isGM = game.user.isGM;
@ -67,10 +68,10 @@ export class RdDActorVehiculeSheet extends ActorSheet {
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
async _onDrop(event) { async _onDropItem(event, dragData) {
let toSuper = await this.actor.processItemDropEvent(event, this.objetVersConteneur); const callSuper = await this.actor.processDropItem(event, dragData, this.objetVersConteneur);
if ( toSuper) { if (callSuper) {
super._onDrop(event); await super._onDropItem(event, dragData)
} }
} }

View File

@ -359,7 +359,7 @@ export class RdDActor extends Actor {
/* -------------------------------------------- */ /* -------------------------------------------- */
async verifierPotionsEnchantees() { async verifierPotionsEnchantees() {
let potionsEnchantees = this.filterItemsData(it => it.type == 'potion' && it.data.isEnchante); let potionsEnchantees = this.filterItemsData(it => it.type == 'potion' && it.data.magique);
for (let potion of potionsEnchantees) { for (let potion of potionsEnchantees) {
if (!potion.prpermanent) { if (!potion.prpermanent) {
console.log(potion); console.log(potion);
@ -931,28 +931,29 @@ export class RdDActor extends Actor {
/* -------------------------------------------- */ /* -------------------------------------------- */
/** Supprime un item d'un conteneur, sur la base /** Supprime un item d'un conteneur, sur la base
* de leurs ID */ * de leurs ID */
async enleverDeConteneur(itemId, conteneur) { async enleverDeConteneur(item, conteneur, objetVersConteneur) {
if (conteneur?.isConteneur()) { // Si présent if (conteneur?.isConteneur()) {
let data2use = duplicate(Misc.data(conteneur)); let data2use = duplicate(Misc.data(conteneur));
//console.log("Suppression du conteneur1", conteneurId, itemId, data2use.data.contenu);
let contenu = data2use.data.contenu; let contenu = data2use.data.contenu;
let index = contenu.indexOf(itemId); let index = contenu.indexOf(item.id);
while (index >= 0) { // Force cleanup, itemId is unique while (index >= 0) { // Force cleanup, itemId is unique
contenu.splice(index, 1); contenu.splice(index, 1);
index = contenu.indexOf(itemId); index = contenu.indexOf(item.id);
} }
await this.updateEmbeddedDocuments('Item', [data2use]); await this.updateEmbeddedDocuments('Item', [data2use]);
delete objetVersConteneur[item.id];
} }
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
/** Ajoute un item dans un conteneur, sur la base /** Ajoute un item dans un conteneur, sur la base
* de leurs ID */ * de leurs ID */
async ajouterDansConteneur(itemId, conteneur) { async ajouterDansConteneur(item, conteneur, objetVersConteneur) {
if (conteneur?.isConteneur()) { if (conteneur?.isConteneur()) {
let data2use = duplicate(Misc.data(conteneur)); let data2use = duplicate(Misc.data(conteneur));
data2use.data.contenu.push(itemId); data2use.data.contenu.push(item.id);
await this.updateEmbeddedDocuments('Item', [data2use]); await this.updateEmbeddedDocuments('Item', [data2use]);
objetVersConteneur[item.id] = conteneur.id;
} }
} }
@ -970,54 +971,52 @@ export class RdDActor extends Actor {
await this.updateEmbeddedDocuments('Item', conteneurFixedList); await this.updateEmbeddedDocuments('Item', conteneurFixedList);
} }
/* -------------------------------------------- */ async processDropItem(event, dragData, objetVersConteneur) {
async processItemDropEvent(event, objetVersConteneur) {
let dragData = JSON.parse(event.dataTransfer.getData("text/plain"));
console.log("DRAG", this.id, dragData); console.log("DRAG", this.id, dragData);
let itemId = dragData.id || dragData.data._id; const droppedItemId = dragData.id || dragData.data._id;
if (dragData.type == 'Item') {
if (dragData.actorId && dragData.actorId != this.id) { if (dragData.actorId && dragData.actorId != this.id) {
console.log("Moving objects", dragData); console.log("Moving objects", dragData);
this.moveItemsBetweenActors(itemId, dragData.actorId); this.moveItemsBetweenActors(droppedItemId, dragData.actorId);
return false; return false;
} }
if (dragData.actorId == this.id) {
// rangement
const destId = $(event.target).parents(".item").attr("data-item-id");
const srcId = objetVersConteneur[itemId];
if (srcId != destId && itemId != destId) { // déplacement de l'objet
const item = this.getObjet(itemId);
const dest = this.getObjet(destId);
const src = this.getObjet(srcId);
if (!dest) {
// on peut toujours vider son sac
await this.enleverDeConteneur(itemId, src);
}
else if (!dest.isConteneur()) {
// regrouper?
await this.regrouperEquipementsSimilaires(item, dest);
}
else if (this.conteneurPeutContenir(dest, item)) {
// déplacer?
await this.enleverDeConteneur(itemId, src);
await this.ajouterDansConteneur(itemId, dest);
}
}
}
this.computeEncombrementTotalEtMalusArmure();
}
if (dragData.type == "Actor") {
this.addSubacteur(itemId);
}
return true;
}
let result = true;
const destId = $(event.target).parents(".item").attr("data-item-id");
const itemId = dragData.id || dragData.data._id;
const item = this.getObjet(itemId);
if (item.isEquipement()) {
if (dragData.actorId == this.id) {
// rangement
const srcId = objetVersConteneur[itemId];
if (srcId != destId && itemId != destId) { // déplacement de l'objet
const dest = this.getObjet(destId);
const src = this.getObjet(srcId);
if (dest?.isConteneur()) {
if (this.conteneurPeutContenir(dest, item)) {
await this.enleverDeConteneur(item, src, objetVersConteneur);
await this.ajouterDansConteneur(item, dest, objetVersConteneur);
}
}
else {
if (src?.isConteneur() && !item?.isConteneur()) {
await this.enleverDeConteneur(item, src, objetVersConteneur);
// simuler la re-création
dragData.actorId = null;
await this.deleteEmbeddedDocuments('Item', [item.id]);
}
else if (dest?.isEquipementSimilaire(item)) {
await this.regrouperEquipementsSimilaires(item, dest);
}
}
}
}
await this.computeEncombrementTotalEtMalusArmure();
}
return result;
}
/* -------------------------------------------- */
conteneurPeutContenir(dest, item) { conteneurPeutContenir(dest, item) {
const destData = Misc.data(dest); const destData = Misc.data(dest);
if (destData?.type != 'conteneur') {
ui.notifications.warn(`Impossible de déplacer un objet (${item.name}) vers un ${destData.type} qui n'est pas un conteneur (${dest.name}) !`);
return false;
}
if (this._isConteneurContenu(item, dest)) { if (this._isConteneurContenu(item, dest)) {
ui.notifications.warn(`Impossible de déplacer un conteneur parent (${item.name}) dans un de ses contenus ${destData.name} !`); ui.notifications.warn(`Impossible de déplacer un conteneur parent (${item.name}) dans un de ses contenus ${destData.name} !`);
return false; // Loop detected ! return false; // Loop detected !
@ -1072,11 +1071,9 @@ export class RdDActor extends Actor {
} }
async regrouperEquipementsSimilaires(item, dest) { async regrouperEquipementsSimilaires(item, dest) {
if (item.isEquipementSimilaire(dest)) {
await dest.quantiteIncDec(Misc.templateData(item).quantite); await dest.quantiteIncDec(Misc.templateData(item).quantite);
await this.deleteEmbeddedDocuments('Item', [item.id]); await this.deleteEmbeddedDocuments('Item', [item.id]);
} }
}
/* -------------------------------------------- */ /* -------------------------------------------- */
detectSurEncombrement() { detectSurEncombrement() {
@ -1485,7 +1482,7 @@ export class RdDActor extends Actor {
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
async santeIncDec(name, inc, isCritique = false) { async santeIncDec(name, inc, options = {isCritique: false, ethylisme: false}) {
const sante = duplicate(Misc.templateData(this).sante); const sante = duplicate(Misc.templateData(this).sante);
let compteur = sante[name]; let compteur = sante[name];
@ -1502,7 +1499,7 @@ export class RdDActor extends Actor {
//console.log("New value ", inc, minValue, result.newValue); //console.log("New value ", inc, minValue, result.newValue);
let fatigue = 0; let fatigue = 0;
if (name == "endurance" && !this.isEntiteCauchemar()) { if (name == "endurance" && !this.isEntiteCauchemar()) {
if (result.newValue == 0 && inc < 0 && !isCritique) { // perte endurance et endurance devient 0 (sauf critique) -> -1 vie if (result.newValue == 0 && inc < 0 && !options.isCritique) { // perte endurance et endurance devient 0 (sauf critique) -> -1 vie
sante.vie.value--; sante.vie.value--;
} }
result.newValue = Math.max(0, result.newValue); result.newValue = Math.max(0, result.newValue);
@ -1510,7 +1507,7 @@ export class RdDActor extends Actor {
result.newValue = Math.min(result.newValue, this._computeEnduranceMax()) result.newValue = Math.min(result.newValue, this._computeEnduranceMax())
} }
const perte = compteur.value - result.newValue; const perte = compteur.value - result.newValue;
if (perte > 1) { if (perte > 1 && !options.ethylisme) {
// Peut-être sonné si 2 points d'endurance perdus d'un coup // Peut-être sonné si 2 points d'endurance perdus d'un coup
const testIsSonne = await this.testSiSonne(sante, result.newValue); const testIsSonne = await this.testSiSonne(sante, result.newValue);
result.sonne = testIsSonne.sonne; result.sonne = testIsSonne.sonne;
@ -1680,7 +1677,7 @@ export class RdDActor extends Actor {
let enduranceLost = new Roll("1d6").roll().total; let enduranceLost = new Roll("1d6").roll().total;
rollDataView.enduranceLost = enduranceLost; rollDataView.enduranceLost = enduranceLost;
await this.santeIncDec("endurance", -enduranceLost, false); await this.santeIncDec("endurance", -enduranceLost, {ethylisme:true});
// Qui a bu boira (p 164) // Qui a bu boira (p 164)
let rollVolonte = await RdDResolutionTable.roll(actorData.data.carac.volonte.value, Math.min(ethylisme.value, 0) + actorData.data.compteurs.moral.value); let rollVolonte = await RdDResolutionTable.roll(actorData.data.carac.volonte.value, Math.min(ethylisme.value, 0) + actorData.data.compteurs.moral.value);
rollDataView.rollVolonteIsSuccess = rollVolonte.isSuccess; rollDataView.rollVolonteIsSuccess = rollVolonte.isSuccess;
@ -2964,7 +2961,7 @@ export class RdDActor extends Actor {
const perteVie = this.isEntiteCauchemar() const perteVie = this.isEntiteCauchemar()
? { newValue: 0 } ? { newValue: 0 }
: await this.santeIncDec("vie", - encaissement.vie); : await this.santeIncDec("vie", - encaissement.vie);
const perteEndurance = await this.santeIncDec("endurance", -encaissement.endurance, (encaissement.critiques > 0)); const perteEndurance = await this.santeIncDec("endurance", -encaissement.endurance, {critiques: encaissement.critiques > 0});
this.computeEtatGeneral(); this.computeEtatGeneral();
this.sheet.render(false); this.sheet.render(false);
@ -3464,7 +3461,7 @@ export class RdDActor extends Actor {
potionData.alias = this.name; potionData.alias = this.name;
potionData.supprimer = true; potionData.supprimer = true;
if (potionData.data.isEnchante) { if (potionData.data.magique) {
ChatMessage.create({ ChatMessage.create({
whisper: ChatUtility.getWhisperRecipientsAndGMs(game.user.name), whisper: ChatUtility.getWhisperRecipientsAndGMs(game.user.name),
content: await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/chat-consommer-potion-soin.html`, potionData) content: await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/chat-consommer-potion-soin.html`, potionData)
@ -3496,7 +3493,7 @@ export class RdDActor extends Actor {
potionData.alias = this.name; potionData.alias = this.name;
potionData.supprimer = true; potionData.supprimer = true;
if (potionData.data.isEnchante) { if (potionData.data.magique) {
ChatMessage.create({ ChatMessage.create({
whisper: ChatUtility.getWhisperRecipientsAndGMs(game.user.name), whisper: ChatUtility.getWhisperRecipientsAndGMs(game.user.name),
content: await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/chat-consommer-potion-repos.html`, potionData) content: await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/chat-consommer-potion-repos.html`, potionData)

View File

@ -5,6 +5,8 @@ import { RdDAlchimie } from "./rdd-alchimie.js";
import { RdDItemCompetence } from "./item-competence.js"; import { RdDItemCompetence } from "./item-competence.js";
import { RdDHerbes } from "./rdd-herbes.js"; import { RdDHerbes } from "./rdd-herbes.js";
import { Misc } from "./misc.js"; import { Misc } from "./misc.js";
import { HtmlUtility } from "./html-utility.js";
import { ReglesOptionelles } from "./regles-optionelles.js";
/** /**
* Extend the basic ItemSheet with some very simple modifications * Extend the basic ItemSheet with some very simple modifications
@ -62,8 +64,7 @@ export class RdDItemSheet extends ItemSheet {
owner: this.document.isOwner, owner: this.document.isOwner,
editable: this.isEditable, editable: this.isEditable,
cssClass: this.isEditable ? "editable" : "locked", cssClass: this.isEditable ? "editable" : "locked",
isSoins: false, isSoins: false
isEnchante: false
} }
if ( this.actor ) { if ( this.actor ) {
formData.isOwned = true; formData.isOwned = true;
@ -102,12 +103,14 @@ export class RdDItemSheet extends ItemSheet {
activateListeners(html) { activateListeners(html) {
super.activateListeners(html); super.activateListeners(html);
HtmlUtility._showControlWhen($(".item-cout"), ReglesOptionelles.isUsing('afficher-prix-joueurs') || game.user.isGM || !this.object.isOwned);
// Everything below here is only needed if the sheet is editable // Everything below here is only needed if the sheet is editable
if (!this.options.editable) return; if (!this.options.editable) return;
// Select competence categorie // Select competence categorie
html.find(".categorie").on("click", this._onClickSelectCategorie.bind(this) ); html.find(".categorie").change(event => this._onSelectCategorie(event));
html.find(".categoriepotion").on("click", this.render(true) );
html.find('.sheet-competence-xp').change((event) => { html.find('.sheet-competence-xp').change((event) => {
if ( this.object.data.type == 'competence') { if ( this.object.data.type == 'competence') {
@ -153,13 +156,15 @@ export class RdDItemSheet extends ItemSheet {
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
async _onClickSelectCategorie(event) { async _onSelectCategorie(event) {
event.preventDefault(); event.preventDefault();
if (this.object.isCompetence()){
let level = RdDItemCompetence.getNiveauBase(event.currentTarget.value); let level = RdDItemCompetence.getNiveauBase(event.currentTarget.value);
Misc.templateData(this.object).base = level; Misc.templateData(this.object).base = level;
$("#base").val(level); $("#base").val(level);
} }
}
/* -------------------------------------------- */ /* -------------------------------------------- */
get template() get template()

View File

@ -17,6 +17,10 @@ export class RdDItem extends Item {
return typesObjetsOeuvres; return typesObjetsOeuvres;
} }
isCompetence() {
return Misc.data(this).type == 'competence';
}
isConteneur() { isConteneur() {
return Misc.data(this).type == 'conteneur'; return Misc.data(this).type == 'conteneur';
} }
@ -39,6 +43,9 @@ export class RdDItem extends Item {
return itemData.type == 'objet' && Grammar.toLowerCaseNoAccent(itemData.name) == 'cristal alchimique' && itemData.data.quantite > 0; return itemData.type == 'objet' && Grammar.toLowerCaseNoAccent(itemData.name) == 'cristal alchimique' && itemData.data.quantite > 0;
} }
isMagique(){
return Misc.templateData(this.object).magique;
}
getEnc() { getEnc() {
const itemData = Misc.data(this); const itemData = Misc.data(this);
@ -64,8 +71,8 @@ export class RdDItem extends Item {
prepareDataPotion() { prepareDataPotion() {
const tplData = Misc.templateData(this); const tplData = Misc.templateData(this);
const categorie = Grammar.toLowerCaseNoAccent(tplData.categorie); const categorie = Grammar.toLowerCaseNoAccent(tplData.categorie);
tplData.isEnchante = categorie.includes('enchante'); tplData.magique = categorie.includes('enchante');
if (tplData.isEnchante) { if (tplData.magique) {
if (categorie.includes('soin') || categorie.includes('repos')) { if (categorie.includes('soin') || categorie.includes('repos')) {
tplData.puissance = tplData.herbebonus * tplData.pr; tplData.puissance = tplData.herbebonus * tplData.pr;
} }
@ -144,7 +151,7 @@ export class RdDItem extends Item {
if (tplData.quantite == undefined) return false; if (tplData.quantite == undefined) return false;
for (const [key, value] of Object.entries(tplData)) { for (const [key, value] of Object.entries(tplData)) {
if (['quantite', 'encTotal', 'prixTotal'].includes(key)) continue; if (['quantite', 'encTotal', 'prixTotal', 'cout'].includes(key)) continue;
if (value != otherTplData[key]) return false; if (value != otherTplData[key]) return false;
} }
return true; return true;

View File

@ -63,9 +63,9 @@ export class Misc {
} }
} }
static classify(items, classifier = it => it.type, transform = it => it) { static classify(items, classifier = it => it.type) {
let itemsBy = {}; let itemsBy = {};
Misc.classifyInto(itemsBy, items, classifier, transform); Misc.classifyInto(itemsBy, items, classifier);
return itemsBy; return itemsBy;
} }
@ -80,7 +80,7 @@ export class Misc {
return itemsBy; return itemsBy;
} }
static classifyInto(itemsBy, items, classifier = it => it.type, transform = it => it) { static classifyInto(itemsBy, items, classifier = it => it.type) {
for (const item of items) { for (const item of items) {
const classification = classifier(item); const classification = classifier(item);
let list = itemsBy[classification]; let list = itemsBy[classification];
@ -88,11 +88,8 @@ export class Misc {
list = []; list = [];
itemsBy[classification] = list; itemsBy[classification] = list;
} }
list.push(transform(item)); list.push(item);
} }
for (const [key, list] of Object.entries(itemsBy)) {
list.sort();
};
} }
static rollOneOf(array) { static rollOneOf(array) {

View File

@ -257,7 +257,7 @@ export class RdDUtility {
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
static filterItemsPerTypeForSheet(formData, itemsByType) { static filterItemsPerTypeForSheet(formData) {
formData.materiel = this.checkNull(formData.itemsByType['objet']); formData.materiel = this.checkNull(formData.itemsByType['objet']);
formData.conteneurs = this.checkNull(formData.itemsByType['conteneur']); formData.conteneurs = this.checkNull(formData.itemsByType['conteneur']);
formData.armes = this.checkNull(formData.itemsByType['arme']); formData.armes = this.checkNull(formData.itemsByType['arme']);
@ -296,30 +296,34 @@ export class RdDUtility {
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
static buildArbreDeConteneur(actorSheet, formData) { static buildArbreDeConteneurs(conteneurs, objets) {
actorSheet.objetVersConteneur = {}; // Table de hash locale pour recupération rapide du conteneur parent (si existant) let objetVersConteneur = {};
// Attribution des objets aux conteneurs // Attribution des objets aux conteneurs
for (let conteneur of formData.conteneurs) { for (let conteneur of conteneurs) {
conteneur.subItems = []; conteneur.subItems = [];
if (!conteneur.data.encTotal) conteneur.data.encTotal = 0; if (!conteneur.data.encTotal)
conteneur.data.encTotal = 0;
//conteneur.data.encTotal = ; Deja calculé //conteneur.data.encTotal = ; Deja calculé
if (conteneur.data.contenu) { if (conteneur.data.contenu) {
for (let id of conteneur.data.contenu) { for (let id of conteneur.data.contenu) {
let objet = formData.objets.find(objet => (id == objet._id)); let objet = objets.find(objet => (id == objet._id));
if (objet) { if (objet) {
if (!objet.data.encombrement) objet.data.encombrement = 0; // Auto-fix if (!objet.data.encombrement)
objet.data.encombrement = 0; // Auto-fix
objet.estContenu = true; // Permet de filtrer ce qifui est porté dans le template objet.estContenu = true; // Permet de filtrer ce qifui est porté dans le template
actorSheet.objetVersConteneur[id] = conteneur._id; objetVersConteneur[id] = conteneur._id;
conteneur.data.encTotal += Number(objet.data.encombrement) * Number(((objet.data.quantite) ? objet.data.quantite : 1)); conteneur.data.encTotal += Number(objet.data.encombrement) * Number(((objet.data.quantite) ? objet.data.quantite : 1));
conteneur.subItems.push(objet); conteneur.subItems.push(objet);
} }
} }
} }
} }
return objetVersConteneur;
}
// Construit la liste des conteneurs de niveau 1 (c'est à dire non contenu eux-même dans un conteneur) // Construit la liste des conteneurs de niveau 1 (c'est à dire non contenu eux-même dans un conteneur)
let newConteneurs = formData.conteneurs.filter(function (conteneur, index, arr) { return !conteneur.estContenu }); static conteneursRacine(conteneurs) {
formData.conteneurs = newConteneurs; return conteneurs.filter( (conteneur, index, arr) => !conteneur.estContenu);
//console.log(newConteneurs);
} }
/* -------------------------------------------- */ /* -------------------------------------------- */

View File

@ -6,7 +6,8 @@ const listeReglesOptionelles = [
{ name: 'defenseurDesarme', group: 'combat', descr: "Le défenseur peut être désarmé en parant une particulière en force ou une charge avec une arme autre qu'un bouclier" }, { name: 'defenseurDesarme', group: 'combat', descr: "Le défenseur peut être désarmé en parant une particulière en force ou une charge avec une arme autre qu'un bouclier" },
{ name: 'categorieParade', group: 'combat', descr: "Le défenseur doit obtenir une significative en cas de parade avec des armes de catégories différentes" }, { name: 'categorieParade', group: 'combat', descr: "Le défenseur doit obtenir une significative en cas de parade avec des armes de catégories différentes" },
{ name: 'tripleSignificative', group: 'combat', descr: "En cas de demi-surprise, d'attaque particulière en finesse, et de catégories d'armes différentes, le défenseur doit obtenir 1/8 des chances de succès" }, { name: 'tripleSignificative', group: 'combat', descr: "En cas de demi-surprise, d'attaque particulière en finesse, et de catégories d'armes différentes, le défenseur doit obtenir 1/8 des chances de succès" },
{name:'astrologie', group:'generale', descr:"Appliquer les ajustements astrologiques aux jets de chance et aux rituels"} { name: 'astrologie', group: 'generale', descr: "Appliquer les ajustements astrologiques aux jets de chance et aux rituels", default: true },
{ name: 'afficher-prix-joueurs', group: 'generale', descr: "Afficher le prix de l'équipement des joueurs", default: true }
]; ];
export class ReglesOptionelles extends FormApplication { export class ReglesOptionelles extends FormApplication {
@ -14,7 +15,7 @@ export class ReglesOptionelles extends FormApplication {
for (const regle of listeReglesOptionelles) { for (const regle of listeReglesOptionelles) {
const name = regle.name; const name = regle.name;
const id = ReglesOptionelles._getIdRegle(name); const id = ReglesOptionelles._getIdRegle(name);
game.settings.register("foundryvtt-reve-de-dragon", id, { name: id, scope: "world", config: false, default: regle.default??true, type: Boolean }); game.settings.register("foundryvtt-reve-de-dragon", id, { name: id, scope: "world", config: false, default: regle.default == undefined ? true : regle.default, type: Boolean });
} }
game.settings.registerMenu("foundryvtt-reve-de-dragon", "rdd-options-regles", { game.settings.registerMenu("foundryvtt-reve-de-dragon", "rdd-options-regles", {

View File

@ -2,7 +2,7 @@
<div data-combatid="{{combatId}}" data-combatmessage="actor-turn-summary">{{blessuresStatus}}</div> <div data-combatid="{{combatId}}" data-combatmessage="actor-turn-summary">{{blessuresStatus}}</div>
<div>Son état général est de : {{etatGeneral}} {{#if isSonne}} et est <strong>sonné</strong>{{/if}}</div> <div>Son état général est de : {{etatGeneral}} {{#if isSonne}} et est <strong>sonné</strong>{{/if}}</div>
{{#if isGrave}} {{#if isGrave}}
<div>{{alias}} souffre de Blessure(s) Grave(s) : n'oubliez pas de faire un Je de Vie toutes les SC ({{SConst}}) minutes.</div> <div>{{alias}} souffre de Blessure(s) Grave(s) : n'oubliez pas de faire un Jet de Vie toutes les SC ({{SConst}}) minutes, et de retirer 1 point d'endurance par blessure grave.</div>
{{/if}} {{/if}}
{{#if isCritique}} {{#if isCritique}}
<div>{{alias}} souffre d'une <strong>Blessure Critique</strong> : faites un <a id="chat-jet-vie" data-actorId="{{actorId}}">Jet de Vie.<a></div> <div>{{alias}} souffre d'une <strong>Blessure Critique</strong> : faites un <a id="chat-jet-vie" data-actorId="{{actorId}}">Jet de Vie.<a></div>

View File

@ -1,9 +1,9 @@
<img class="chat-icon" src="systems/foundryvtt-reve-de-dragon/icons/competence_botanique.png" alt="potion de repos" /> <img class="chat-icon" src="systems/foundryvtt-reve-de-dragon/icons/competence_botanique.png" alt="potion de repos" />
<h4> <h4>
{{alias}} consomme sa <b>Potion {{#if data.isEnchante}}enchantée{{/if}}</b> de {{name}}. {{alias}} consomme sa <b>Potion {{#if data.magique}}enchantée{{/if}}</b> de {{name}}.
</h4> </h4>
<hr> <hr>
<div> <div>
Les effets de la potions sont à gérer manuellement, en fonction de sa nature{{#if data.isEnchante}} et de son enchantement ({{data.pr}} Points de Rêve){{/if}}. Les effets de la potions sont à gérer manuellement, en fonction de sa nature{{#if data.magique}} et de son enchantement ({{data.pr}} Points de Rêve){{/if}}.
<br>La potion a été supprimée de l'équipement. <br>La potion a été supprimée de l'équipement.
</div> </div>

View File

@ -1,10 +1,10 @@
<img class="chat-icon" src="systems/foundryvtt-reve-de-dragon/icons/competence_botanique.png" alt="potion de repos" /> <img class="chat-icon" src="systems/foundryvtt-reve-de-dragon/icons/competence_botanique.png" alt="potion de repos" />
<h4> <h4>
{{alias}} consomme sa <b>Potion de Repos {{#if data.isEnchante}}enchantée{{/if}}</b> de {{name}} ({{data.herbe}}, {{data.herbebrins}} brins). {{alias}} consomme sa <b>Potion de Repos {{#if data.magique}}enchantée{{/if}}</b> de {{name}} ({{data.herbe}}, {{data.herbebrins}} brins).
</h4> </h4>
<hr> <hr>
<div> <div>
{{#if data.isEnchante}} {{#if data.magique}}
Elle permet de récupérer jusqu'à {{data.puissance}} cases de repos. Elle permet de récupérer jusqu'à {{data.puissance}} cases de repos.
{{else}} {{else}}
Une fois consommée vers fin Lyre, elle vous octroie un bonus de {{data.herbebonus}} segments de fatigue récupérés en plus à la fin de Chateau Dormant (à gérer manuellement). Une fois consommée vers fin Lyre, elle vous octroie un bonus de {{data.herbebonus}} segments de fatigue récupérés en plus à la fin de Chateau Dormant (à gérer manuellement).

View File

@ -1,10 +1,10 @@
<img class="chat-icon" src="systems/foundryvtt-reve-de-dragon/icons/competence_botanique.png" alt="potion de soin" /> <img class="chat-icon" src="systems/foundryvtt-reve-de-dragon/icons/competence_botanique.png" alt="potion de soin" />
<h4> <h4>
{{alias}} consomme sa <b>Potion de soins {{#if data.isEnchante}}enchantée{{/if}}</b> de {{name}} ({{data.herbe}}, {{data.herbebrins}} brins). {{alias}} consomme sa <b>Potion de soins {{#if data.magique}}enchantée{{/if}}</b> de {{name}} ({{data.herbe}}, {{data.herbebrins}} brins).
</h4> </h4>
<hr> <hr>
<div> <div>
{{#if data.isEnchante}} {{#if data.magique}}
Elle permet de guérir {{data.puissance}} Points de Guérison. Elle permet de guérir {{data.puissance}} Points de Guérison.
{{else}} {{else}}
Lors de votre prochain jet de récupération à Chateau Dormant, vous bénéficierez d'un bonus de {{data.herbebonus}} (appliqué automatiquement). Lors de votre prochain jet de récupération à Chateau Dormant, vous bénéficierez d'un bonus de {{data.herbebonus}} (appliqué automatiquement).

View File

@ -9,7 +9,7 @@
{{!-- Sheet Body --}} {{!-- Sheet Body --}}
<section class="sheet-body"> <section class="sheet-body">
<div class="form-group"> <div class="form-group">
<label>Compétence associée</label> <label for="data.competence">Compétence associée</label>
<select name="data.competence" id="competence" data-dtype="String"> <select name="data.competence" id="competence" data-dtype="String">
{{#select data.competence}} {{#select data.competence}}
{{>"systems/foundryvtt-reve-de-dragon/templates/enum-competence.html"}} {{>"systems/foundryvtt-reve-de-dragon/templates/enum-competence.html"}}
@ -17,15 +17,15 @@
</select> </select>
</div> </div>
<div class="form-group"> <div class="form-group">
<label for="niveau">Dommmages </label> <label for="data.dommages">Dommages </label>
<input class="attribute-value" type="text" name="data.dommages" value="{{data.dommages}}" data-dtype="String"/> <input class="attribute-value" type="text" name="data.dommages" value="{{data.dommages}}" data-dtype="String"/>
</div> </div>
<div class="form-group"> <div class="form-group">
<label for="xp">Résistance </label> <label for="data.resistance">Résistance </label>
<input class="attribute-value" type="text" name="data.resistance" value="{{data.resistance}}" data-dtype="Number"/> <input class="attribute-value" type="text" name="data.resistance" value="{{data.resistance}}" data-dtype="Number"/>
</div> </div>
<div class="form-group"> <div class="form-group">
<label>Catégorie parade </label> <label for="data.categorie_parade">Catégorie parade </label>
<select name="data.categorie_parade" id="categorie_parade" data-dtype="String"> <select name="data.categorie_parade" id="categorie_parade" data-dtype="String">
{{#select data.categorie_parade}} {{#select data.categorie_parade}}
{{>"systems/foundryvtt-reve-de-dragon/templates/enum-categorie-parade.html"}} {{>"systems/foundryvtt-reve-de-dragon/templates/enum-categorie-parade.html"}}
@ -33,59 +33,59 @@
</select> </select>
</div> </div>
<div class="form-group"> <div class="form-group">
<label for="xp">Encombrement </label> <label for="data.encombrement">Encombrement </label>
<input class="attribute-value" type="text" name="data.encombrement" value="{{data.encombrement}}" data-dtype="Number"/> <input class="attribute-value" type="text" name="data.encombrement" value="{{data.encombrement}}" data-dtype="Number"/>
</div> </div>
<div class="form-group"> <div class="form-group">
<label for="xp">Force min. </label> <label for="data.force">Force min. </label>
<input class="attribute-value" type="text" name="data.force" value="{{data.force}}" data-dtype="String"/> <input class="attribute-value" type="text" name="data.force" value="{{data.force}}" data-dtype="String"/>
</div> </div>
<div class="form-group"> <div class="form-group">
<label for="xp">Arme rapide ? </label> <label for="data.rapide">Arme rapide ? </label>
<input class="attribute-value" type="checkbox" name="data.rapide" {{#if data.rapide}}checked{{/if}}/> <input class="attribute-value" type="checkbox" name="data.rapide" {{#if data.rapide}}checked{{/if}}/>
</div> </div>
<div class="form-group"> <div class="form-group">
<label for="xp">A Une main ? </label> <label for="data.unemain">A Une main ? </label>
<input class="attribute-value" type="checkbox" name="data.unemain" {{#if data.unemain}}checked{{/if}}/> <input class="attribute-value" type="checkbox" name="data.unemain" {{#if data.unemain}}checked{{/if}}/>
</div> </div>
<div class="form-group"> <div class="form-group">
<label for="xp">A Deux mains ? </label> <label for="data.deuxmains">A Deux mains ? </label>
<input class="attribute-value" type="checkbox" name="data.deuxmains" {{#if data.deuxmains}}checked{{/if}}/> <input class="attribute-value" type="checkbox" name="data.deuxmains" {{#if data.deuxmains}}checked{{/if}}/>
</div> </div>
<div class="form-group"> <div class="form-group">
<label for="xp">Portée courte </label> <label for="data.portee_courte">Portée courte </label>
<input class="attribute-value" type="text" name="data.portee_courte" value="{{data.portee_courte}}" data-dtype="Number"/> <input class="attribute-value" type="text" name="data.portee_courte" value="{{data.portee_courte}}" data-dtype="Number"/>
</div> </div>
<div class="form-group"> <div class="form-group">
<label for="xp">Portée moyenne </label> <label for="data.portee_moyenne">Portée moyenne </label>
<input class="attribute-value" type="text" name="data.portee_moyenne" value="{{data.portee_moyenne}}" data-dtype="Number"/> <input class="attribute-value" type="text" name="data.portee_moyenne" value="{{data.portee_moyenne}}" data-dtype="Number"/>
</div> </div>
<div class="form-group"> <div class="form-group">
<label for="xp">Portée extrême </label> <label for="data.portee_extreme">Portée extrême </label>
<input class="attribute-value" type="text" name="data.portee_extreme" value="{{data.portee_extreme}}" data-dtype="Number"/> <input class="attribute-value" type="text" name="data.portee_extreme" value="{{data.portee_extreme}}" data-dtype="Number"/>
</div> </div>
<div class="form-group"> <div class="form-group">
<label for="penetration">Pénétration </label> <label for="data.penetration">Pénétration </label>
<input class="attribute-value" type="text" name="data.penetration" value="{{data.penetration}}" data-dtype="Number"/> <input class="attribute-value" type="text" name="data.penetration" value="{{data.penetration}}" data-dtype="Number"/>
</div> </div>
<div class="form-group"> <div class="form-group item-cout">
<label for="xp">Prix (sols) </label> <label for="data.cout">Prix (sols) </label>
<input class="attribute-value" type="text" name="data.cout" value="{{data.cout}}" data-dtype="Number"/> <input class="attribute-value" type="text" name="data.cout" value="{{data.cout}}" data-dtype="Number"/>
</div> </div>
<div class="form-group"> <div class="form-group">
<label for="xp">Magique ? </label> <label for="data.magique">Magique ? </label>
<input class="attribute-value" type="checkbox" name="data.magique" {{#if data.magique}}checked{{/if}}/> <input class="attribute-value" type="checkbox" name="data.magique" {{#if data.magique}}checked{{/if}}/>
</div> </div>
<div class="form-group"> <div class="form-group item-magique">
<label for="penetration">Résistance magique </label> <label for="data.resistance_magique">Résistance magique </label>
<input class="attribute-value" type="text" name="data.resistance_magique" value="{{data.resistance_magique}}" data-dtype="Number"/> <input class="attribute-value" type="text" name="data.resistance_magique" value="{{data.resistance_magique}}" data-dtype="Number"/>
</div> </div>
<div class="form-group"> <div class="form-group item-magique">
<label for="penetration">Nombre d'Ecailles d'Efficacité </label> <label for="data.ecaille_efficacite">Nombre d'Ecailles d'Efficacité </label>
<input class="attribute-value" type="text" name="data.ecaille_efficacite" value="{{data.ecaille_efficacite}}" data-dtype="Number"/> <input class="attribute-value" type="text" name="data.ecaille_efficacite" value="{{data.ecaille_efficacite}}" data-dtype="Number"/>
</div> </div>
<div class="form-group"> <div class="form-group">
<label for="penetration">Classe d'initiative au premier round (mêlée seulement) </label> <label for="data.initpremierround">Classe d'initiative au premier round (mêlée seulement) </label>
<select name="data.initpremierround" id="initpremierround" data-dtype="String"> <select name="data.initpremierround" id="initpremierround" data-dtype="String">
{{#select data.initpremierround}} {{#select data.initpremierround}}
{{>"systems/foundryvtt-reve-de-dragon/templates/enum-initpremierround.html"}} {{>"systems/foundryvtt-reve-de-dragon/templates/enum-initpremierround.html"}}

View File

@ -24,7 +24,7 @@
<label for="xp">Malus Armure </label> <label for="xp">Malus Armure </label>
<input class="attribute-value" type="text" name="data.malus" value="{{data.malus}}" data-dtype="Number"/> <input class="attribute-value" type="text" name="data.malus" value="{{data.malus}}" data-dtype="Number"/>
</div> </div>
<div class="form-group"> <div class="form-group item-cout">
<label for="xp">Prix (sols) </label> <label for="xp">Prix (sols) </label>
<input class="attribute-value" type="text" name="data.cout" value="{{data.cout}}" data-dtype="Number"/> <input class="attribute-value" type="text" name="data.cout" value="{{data.cout}}" data-dtype="Number"/>
</div> </div>

View File

@ -20,7 +20,7 @@
<label for="xp">Qualité</label> <label for="xp">Qualité</label>
<input class="attribute-value" type="text" name="data.qualite" value="{{data.qualite}}" data-dtype="Number"/> <input class="attribute-value" type="text" name="data.qualite" value="{{data.qualite}}" data-dtype="Number"/>
</div> </div>
<div class="form-group"> <div class="form-group item-cout">
<label for="xp">Prix (sols) </label> <label for="xp">Prix (sols) </label>
<input class="attribute-value" type="text" name="data.cout" value="{{data.cout}}" data-dtype="Number"/> <input class="attribute-value" type="text" name="data.cout" value="{{data.cout}}" data-dtype="Number"/>
</div> </div>

View File

@ -22,7 +22,7 @@
<label>Quantité (Pépins ou Brins)</label> <label>Quantité (Pépins ou Brins)</label>
<input class="attribute-value" type="text" name="data.quantite" value="{{data.quantite}}" data-dtype="Number" /> <input class="attribute-value" type="text" name="data.quantite" value="{{data.quantite}}" data-dtype="Number" />
</div> </div>
<div class="form-group"> <div class="form-group item-cout">
<label>Prix (sols)</label> <label>Prix (sols)</label>
<input class="attribute-value" type="text" name="data.cout" value="{{data.cout}}" data-dtype="Number" /> <input class="attribute-value" type="text" name="data.cout" value="{{data.cout}}" data-dtype="Number" />
</div> </div>

View File

@ -21,7 +21,7 @@
<label>Encombrement</label> <label>Encombrement</label>
<input class="attribute-value" type="text" name="data.encombrement" value="{{data.encombrement}}" data-dtype="Number" /> <input class="attribute-value" type="text" name="data.encombrement" value="{{data.encombrement}}" data-dtype="Number" />
</div> </div>
<div class="form-group"> <div class="form-group item-cout">
<label>Prix (sols)</label> <label>Prix (sols)</label>
<input class="attribute-value" type="text" name="data.cout" value="{{data.cout}}" data-dtype="Number" /> <input class="attribute-value" type="text" name="data.cout" value="{{data.cout}}" data-dtype="Number" />
</div> </div>

View File

@ -55,7 +55,7 @@
<label>Quantité </label> <label>Quantité </label>
<input class="attribute-value" type="text" name="data.quantite" value="{{data.quantite}}" data-dtype="Number" /> <input class="attribute-value" type="text" name="data.quantite" value="{{data.quantite}}" data-dtype="Number" />
</div> </div>
<div class="form-group"> <div class="form-group item-cout">
<label for="xp">Prix (sols) </label> <label for="xp">Prix (sols) </label>
<input class="attribute-value" type="text" name="data.cout" value="{{data.cout}}" data-dtype="Number"/> <input class="attribute-value" type="text" name="data.cout" value="{{data.cout}}" data-dtype="Number"/>
</div> </div>

View File

@ -20,7 +20,7 @@
<label for="xp">Qualité</label> <label for="xp">Qualité</label>
<input class="attribute-value" type="text" name="data.qualite" value="{{data.qualite}}" data-dtype="Number"/> <input class="attribute-value" type="text" name="data.qualite" value="{{data.qualite}}" data-dtype="Number"/>
</div> </div>
<div class="form-group"> <div class="form-group item-cout">
<label for="xp">Prix (sols) </label> <label for="xp">Prix (sols) </label>
<input class="attribute-value" type="text" name="data.cout" value="{{data.cout}}" data-dtype="Number"/> <input class="attribute-value" type="text" name="data.cout" value="{{data.cout}}" data-dtype="Number"/>
</div> </div>

View File

@ -49,7 +49,7 @@
<label>Quantité </label> <label>Quantité </label>
<input class="attribute-value" type="text" name="data.quantite" value="{{data.quantite}}" data-dtype="Number" /> <input class="attribute-value" type="text" name="data.quantite" value="{{data.quantite}}" data-dtype="Number" />
</div> </div>
<div class="form-group"> <div class="form-group item-cout">
<label>Prix (sols) </label> <label>Prix (sols) </label>
<input class="attribute-value" type="text" name="data.cout" value="{{data.cout}}" data-dtype="Number" /> <input class="attribute-value" type="text" name="data.cout" value="{{data.cout}}" data-dtype="Number" />
</div> </div>

View File

@ -24,7 +24,7 @@
<label for="xp">Qualité</label> <label for="xp">Qualité</label>
<input class="attribute-value" type="text" name="data.qualite" value="{{data.qualite}}" data-dtype="Number"/> <input class="attribute-value" type="text" name="data.qualite" value="{{data.qualite}}" data-dtype="Number"/>
</div> </div>
<div class="form-group"> <div class="form-group item-cout">
<label for="xp">Prix (sols) </label> <label for="xp">Prix (sols) </label>
<input class="attribute-value" type="text" name="data.cout" value="{{data.cout}}" data-dtype="Number"/> <input class="attribute-value" type="text" name="data.cout" value="{{data.cout}}" data-dtype="Number"/>
</div> </div>

View File

@ -21,7 +21,7 @@
<label>Quantité </label> <label>Quantité </label>
<input class="attribute-value" type="text" name="data.quantite" value="{{data.quantite}}" data-dtype="Number" /> <input class="attribute-value" type="text" name="data.quantite" value="{{data.quantite}}" data-dtype="Number" />
</div> </div>
<div class="form-group"> <div class="form-group item-cout">
<label>Prix (sols)</label> <label>Prix (sols)</label>
<input class="attribute-value" type="text" name="data.cout" value="{{data.cout}}" data-dtype="Number" /> <input class="attribute-value" type="text" name="data.cout" value="{{data.cout}}" data-dtype="Number" />
</div> </div>
@ -77,7 +77,7 @@
<input class="attribute-value" type="checkbox" name="data.reposalchimique" {{#if data.reposalchimique}}checked{{/if}}/> <input class="attribute-value" type="checkbox" name="data.reposalchimique" {{#if data.reposalchimique}}checked{{/if}}/>
</div> </div>
{{/if}} {{/if}}
{{#if data.isEnchante}} {{#if data.magique}}
<div class="form-group"> <div class="form-group">
<label>Points de rêve</label> <label>Points de rêve</label>
<input class="attribute-value" type="text" name="data.pr" value="{{data.pr}}" data-dtype="Number" /> <input class="attribute-value" type="text" name="data.pr" value="{{data.pr}}" data-dtype="Number" />