Gestion des signes draconiques #455
@ -37,7 +37,8 @@ export class RdDActorCreatureSheet extends RdDActorSheet {
|
||||
formData.calc.surEncombrementMessage = (formData.data.compteurs.surenc.value < 0) ? "Sur-Encombrement!" : "";
|
||||
|
||||
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);
|
||||
|
||||
|
@ -112,7 +112,9 @@ export class RdDActorSheet extends ActorSheet {
|
||||
cacheTMR: this.actor.isTMRCache()
|
||||
}
|
||||
|
||||
RdDUtility.buildArbreDeConteneur(this, formData);
|
||||
this.objetVersConteneur = RdDUtility.buildArbreDeConteneurs(formData.conteneurs, formData.objets);
|
||||
formData.conteneurs = RdDUtility.conteneursRacine(formData.conteneurs);
|
||||
|
||||
formData.subacteurs = {
|
||||
vehicules: this.actor.listeVehicules(),
|
||||
montures: this.actor.listeMontures(),
|
||||
@ -130,10 +132,17 @@ export class RdDActorSheet extends ActorSheet {
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
async _onDrop(event) {
|
||||
let toSuper = await this.actor.processItemDropEvent(event, this.objetVersConteneur);
|
||||
if (toSuper) {
|
||||
super._onDrop(event);
|
||||
async _onDropActor(event, dragData) {
|
||||
console.log("DRAG", this.actor.id, dragData);
|
||||
this.actor.addSubacteur(dragData.id || dragData.data._id);
|
||||
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"));
|
||||
item.sheet.render(true);
|
||||
});
|
||||
// Update Inventory Item
|
||||
html.find('.rencontre-delete').click(ev => {
|
||||
const li = $(ev.currentTarget).parents(".item");
|
||||
const rencontreKey = li.data("item-id");
|
||||
this.actor.deleteTMRRencontre(rencontreKey);
|
||||
});
|
||||
|
||||
// Delete Inventory Item
|
||||
html.find('.item-delete').click(ev => {
|
||||
const li = $(ev.currentTarget).parents(".item");
|
||||
RdDUtility.confirmerSuppression(this, li);
|
||||
@ -623,11 +629,10 @@ export class RdDActorSheet extends ActorSheet {
|
||||
}
|
||||
|
||||
async _onSplitItem(item, split) {
|
||||
const itemData = Misc.data(item);
|
||||
if (split >= 1 && split < itemData.data.quantite) {
|
||||
if (split >= 1 && split < Misc.data(item).data.quantite) {
|
||||
await item.diminuerQuantite(split);
|
||||
const itemData = duplicate( Misc.data(item));
|
||||
itemData.data.quantite = split;
|
||||
itemData.id = undefined;
|
||||
await this.actor.createEmbeddedDocuments('Item', [itemData])
|
||||
}
|
||||
}
|
||||
|
@ -52,7 +52,8 @@ export class RdDActorVehiculeSheet extends ActorSheet {
|
||||
};
|
||||
|
||||
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;
|
||||
|
||||
@ -67,10 +68,10 @@ export class RdDActorVehiculeSheet extends ActorSheet {
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
async _onDrop(event) {
|
||||
let toSuper = await this.actor.processItemDropEvent(event, this.objetVersConteneur);
|
||||
if ( toSuper) {
|
||||
super._onDrop(event);
|
||||
async _onDropItem(event, dragData) {
|
||||
const callSuper = await this.actor.processDropItem(event, dragData, this.objetVersConteneur);
|
||||
if (callSuper) {
|
||||
await super._onDropItem(event, dragData)
|
||||
}
|
||||
}
|
||||
|
||||
|
103
module/actor.js
103
module/actor.js
@ -359,7 +359,7 @@ export class RdDActor extends Actor {
|
||||
|
||||
/* -------------------------------------------- */
|
||||
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) {
|
||||
if (!potion.prpermanent) {
|
||||
console.log(potion);
|
||||
@ -931,28 +931,29 @@ export class RdDActor extends Actor {
|
||||
/* -------------------------------------------- */
|
||||
/** Supprime un item d'un conteneur, sur la base
|
||||
* de leurs ID */
|
||||
async enleverDeConteneur(itemId, conteneur) {
|
||||
if (conteneur?.isConteneur()) { // Si présent
|
||||
async enleverDeConteneur(item, conteneur, objetVersConteneur) {
|
||||
if (conteneur?.isConteneur()) {
|
||||
let data2use = duplicate(Misc.data(conteneur));
|
||||
//console.log("Suppression du conteneur1", conteneurId, itemId, 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
|
||||
contenu.splice(index, 1);
|
||||
index = contenu.indexOf(itemId);
|
||||
index = contenu.indexOf(item.id);
|
||||
}
|
||||
await this.updateEmbeddedDocuments('Item', [data2use]);
|
||||
delete objetVersConteneur[item.id];
|
||||
}
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
/** Ajoute un item dans un conteneur, sur la base
|
||||
* de leurs ID */
|
||||
async ajouterDansConteneur(itemId, conteneur) {
|
||||
async ajouterDansConteneur(item, conteneur, objetVersConteneur) {
|
||||
if (conteneur?.isConteneur()) {
|
||||
let data2use = duplicate(Misc.data(conteneur));
|
||||
data2use.data.contenu.push(itemId);
|
||||
data2use.data.contenu.push(item.id);
|
||||
await this.updateEmbeddedDocuments('Item', [data2use]);
|
||||
objetVersConteneur[item.id] = conteneur.id;
|
||||
}
|
||||
}
|
||||
|
||||
@ -970,54 +971,52 @@ export class RdDActor extends Actor {
|
||||
await this.updateEmbeddedDocuments('Item', conteneurFixedList);
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
async processItemDropEvent(event, objetVersConteneur) {
|
||||
let dragData = JSON.parse(event.dataTransfer.getData("text/plain"));
|
||||
async processDropItem(event, dragData, objetVersConteneur) {
|
||||
console.log("DRAG", this.id, dragData);
|
||||
let itemId = dragData.id || dragData.data._id;
|
||||
if (dragData.type == 'Item') {
|
||||
if (dragData.actorId && dragData.actorId != this.id) {
|
||||
console.log("Moving objects", dragData);
|
||||
this.moveItemsBetweenActors(itemId, dragData.actorId);
|
||||
return false;
|
||||
}
|
||||
const droppedItemId = dragData.id || dragData.data._id;
|
||||
if (dragData.actorId && dragData.actorId != this.id) {
|
||||
console.log("Moving objects", dragData);
|
||||
this.moveItemsBetweenActors(droppedItemId, dragData.actorId);
|
||||
return false;
|
||||
}
|
||||
|
||||
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 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);
|
||||
if (dest?.isConteneur()) {
|
||||
if (this.conteneurPeutContenir(dest, item)) {
|
||||
await this.enleverDeConteneur(item, src, objetVersConteneur);
|
||||
await this.ajouterDansConteneur(item, dest, objetVersConteneur);
|
||||
}
|
||||
}
|
||||
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);
|
||||
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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
this.computeEncombrementTotalEtMalusArmure();
|
||||
await this.computeEncombrementTotalEtMalusArmure();
|
||||
}
|
||||
if (dragData.type == "Actor") {
|
||||
this.addSubacteur(itemId);
|
||||
}
|
||||
return true;
|
||||
return result;
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
conteneurPeutContenir(dest, item) {
|
||||
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)) {
|
||||
ui.notifications.warn(`Impossible de déplacer un conteneur parent (${item.name}) dans un de ses contenus ${destData.name} !`);
|
||||
return false; // Loop detected !
|
||||
@ -1072,10 +1071,8 @@ export class RdDActor extends Actor {
|
||||
}
|
||||
|
||||
async regrouperEquipementsSimilaires(item, dest) {
|
||||
if (item.isEquipementSimilaire(dest)) {
|
||||
await dest.quantiteIncDec(Misc.templateData(item).quantite);
|
||||
await this.deleteEmbeddedDocuments('Item', [item.id]);
|
||||
}
|
||||
await dest.quantiteIncDec(Misc.templateData(item).quantite);
|
||||
await this.deleteEmbeddedDocuments('Item', [item.id]);
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
@ -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);
|
||||
let compteur = sante[name];
|
||||
@ -1502,7 +1499,7 @@ export class RdDActor extends Actor {
|
||||
//console.log("New value ", inc, minValue, result.newValue);
|
||||
let fatigue = 0;
|
||||
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--;
|
||||
}
|
||||
result.newValue = Math.max(0, result.newValue);
|
||||
@ -1510,7 +1507,7 @@ export class RdDActor extends Actor {
|
||||
result.newValue = Math.min(result.newValue, this._computeEnduranceMax())
|
||||
}
|
||||
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
|
||||
const testIsSonne = await this.testSiSonne(sante, result.newValue);
|
||||
result.sonne = testIsSonne.sonne;
|
||||
@ -1680,7 +1677,7 @@ export class RdDActor extends Actor {
|
||||
|
||||
let enduranceLost = new Roll("1d6").roll().total;
|
||||
rollDataView.enduranceLost = enduranceLost;
|
||||
await this.santeIncDec("endurance", -enduranceLost, false);
|
||||
await this.santeIncDec("endurance", -enduranceLost, {ethylisme:true});
|
||||
// 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);
|
||||
rollDataView.rollVolonteIsSuccess = rollVolonte.isSuccess;
|
||||
@ -2365,7 +2362,7 @@ export class RdDActor extends Actor {
|
||||
// Mise à jour de la tache
|
||||
rollData.tache = duplicate(rollData.tache);
|
||||
rollData.tache.data.points_de_tache_courant += rollData.rolled.ptTache;
|
||||
if (rollData.rolled.isETotal){
|
||||
if (rollData.rolled.isETotal) {
|
||||
rollData.tache.data.difficulte--;
|
||||
}
|
||||
this.updateEmbeddedDocuments('Item', [rollData.tache]);
|
||||
@ -2964,7 +2961,7 @@ export class RdDActor extends Actor {
|
||||
const perteVie = this.isEntiteCauchemar()
|
||||
? { newValue: 0 }
|
||||
: 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.sheet.render(false);
|
||||
@ -3464,7 +3461,7 @@ export class RdDActor extends Actor {
|
||||
potionData.alias = this.name;
|
||||
potionData.supprimer = true;
|
||||
|
||||
if (potionData.data.isEnchante) {
|
||||
if (potionData.data.magique) {
|
||||
ChatMessage.create({
|
||||
whisper: ChatUtility.getWhisperRecipientsAndGMs(game.user.name),
|
||||
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.supprimer = true;
|
||||
|
||||
if (potionData.data.isEnchante) {
|
||||
if (potionData.data.magique) {
|
||||
ChatMessage.create({
|
||||
whisper: ChatUtility.getWhisperRecipientsAndGMs(game.user.name),
|
||||
content: await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/chat-consommer-potion-repos.html`, potionData)
|
||||
|
@ -5,6 +5,8 @@ import { RdDAlchimie } from "./rdd-alchimie.js";
|
||||
import { RdDItemCompetence } from "./item-competence.js";
|
||||
import { RdDHerbes } from "./rdd-herbes.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
|
||||
@ -62,8 +64,7 @@ export class RdDItemSheet extends ItemSheet {
|
||||
owner: this.document.isOwner,
|
||||
editable: this.isEditable,
|
||||
cssClass: this.isEditable ? "editable" : "locked",
|
||||
isSoins: false,
|
||||
isEnchante: false
|
||||
isSoins: false
|
||||
}
|
||||
if ( this.actor ) {
|
||||
formData.isOwned = true;
|
||||
@ -102,12 +103,14 @@ export class RdDItemSheet extends ItemSheet {
|
||||
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
|
||||
if (!this.options.editable) return;
|
||||
|
||||
|
||||
// Select competence categorie
|
||||
html.find(".categorie").on("click", this._onClickSelectCategorie.bind(this) );
|
||||
html.find(".categoriepotion").on("click", this.render(true) );
|
||||
html.find(".categorie").change(event => this._onSelectCategorie(event));
|
||||
|
||||
html.find('.sheet-competence-xp').change((event) => {
|
||||
if ( this.object.data.type == 'competence') {
|
||||
@ -153,12 +156,14 @@ export class RdDItemSheet extends ItemSheet {
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
async _onClickSelectCategorie(event) {
|
||||
async _onSelectCategorie(event) {
|
||||
event.preventDefault();
|
||||
|
||||
let level = RdDItemCompetence.getNiveauBase(event.currentTarget.value);
|
||||
Misc.templateData(this.object).base = level;
|
||||
$("#base").val( level );
|
||||
|
||||
if (this.object.isCompetence()){
|
||||
let level = RdDItemCompetence.getNiveauBase(event.currentTarget.value);
|
||||
Misc.templateData(this.object).base = level;
|
||||
$("#base").val(level);
|
||||
}
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
|
@ -17,6 +17,10 @@ export class RdDItem extends Item {
|
||||
return typesObjetsOeuvres;
|
||||
}
|
||||
|
||||
isCompetence() {
|
||||
return Misc.data(this).type == 'competence';
|
||||
}
|
||||
|
||||
isConteneur() {
|
||||
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;
|
||||
}
|
||||
|
||||
isMagique(){
|
||||
return Misc.templateData(this.object).magique;
|
||||
}
|
||||
|
||||
getEnc() {
|
||||
const itemData = Misc.data(this);
|
||||
@ -64,8 +71,8 @@ export class RdDItem extends Item {
|
||||
prepareDataPotion() {
|
||||
const tplData = Misc.templateData(this);
|
||||
const categorie = Grammar.toLowerCaseNoAccent(tplData.categorie);
|
||||
tplData.isEnchante = categorie.includes('enchante');
|
||||
if (tplData.isEnchante) {
|
||||
tplData.magique = categorie.includes('enchante');
|
||||
if (tplData.magique) {
|
||||
if (categorie.includes('soin') || categorie.includes('repos')) {
|
||||
tplData.puissance = tplData.herbebonus * tplData.pr;
|
||||
}
|
||||
@ -144,7 +151,7 @@ export class RdDItem extends Item {
|
||||
if (tplData.quantite == undefined) return false;
|
||||
|
||||
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;
|
||||
}
|
||||
return true;
|
||||
|
@ -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 = {};
|
||||
Misc.classifyInto(itemsBy, items, classifier, transform);
|
||||
Misc.classifyInto(itemsBy, items, classifier);
|
||||
return itemsBy;
|
||||
}
|
||||
|
||||
@ -80,7 +80,7 @@ export class Misc {
|
||||
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) {
|
||||
const classification = classifier(item);
|
||||
let list = itemsBy[classification];
|
||||
@ -88,11 +88,8 @@ export class Misc {
|
||||
list = [];
|
||||
itemsBy[classification] = list;
|
||||
}
|
||||
list.push(transform(item));
|
||||
list.push(item);
|
||||
}
|
||||
for (const [key, list] of Object.entries(itemsBy)) {
|
||||
list.sort();
|
||||
};
|
||||
}
|
||||
|
||||
static rollOneOf(array) {
|
||||
|
@ -257,7 +257,7 @@ export class RdDUtility {
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
static filterItemsPerTypeForSheet(formData, itemsByType) {
|
||||
static filterItemsPerTypeForSheet(formData) {
|
||||
formData.materiel = this.checkNull(formData.itemsByType['objet']);
|
||||
formData.conteneurs = this.checkNull(formData.itemsByType['conteneur']);
|
||||
formData.armes = this.checkNull(formData.itemsByType['arme']);
|
||||
@ -296,30 +296,34 @@ export class RdDUtility {
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
static buildArbreDeConteneur(actorSheet, formData) {
|
||||
actorSheet.objetVersConteneur = {}; // Table de hash locale pour recupération rapide du conteneur parent (si existant)
|
||||
static buildArbreDeConteneurs(conteneurs, objets) {
|
||||
let objetVersConteneur = {};
|
||||
// Attribution des objets aux conteneurs
|
||||
for (let conteneur of formData.conteneurs) {
|
||||
for (let conteneur of conteneurs) {
|
||||
conteneur.subItems = [];
|
||||
if (!conteneur.data.encTotal) conteneur.data.encTotal = 0;
|
||||
if (!conteneur.data.encTotal)
|
||||
conteneur.data.encTotal = 0;
|
||||
//conteneur.data.encTotal = ; Deja calculé
|
||||
if (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.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
|
||||
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.subItems.push(objet);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
// 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 });
|
||||
formData.conteneurs = newConteneurs;
|
||||
//console.log(newConteneurs);
|
||||
return objetVersConteneur;
|
||||
}
|
||||
|
||||
// Construit la liste des conteneurs de niveau 1 (c'est à dire non contenu eux-même dans un conteneur)
|
||||
static conteneursRacine(conteneurs) {
|
||||
return conteneurs.filter( (conteneur, index, arr) => !conteneur.estContenu);
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
|
@ -1,12 +1,13 @@
|
||||
|
||||
const listeReglesOptionelles = [
|
||||
{name:'recul', group:'combat', descr:"Appliquer le recul en cas de particulière en force ou de charge"},
|
||||
{name:'resistanceArmeParade', group:'combat', descr:"Faire le jet de résistance des armes lors de parades pouvant les endommager"},
|
||||
{name:'deteriorationArmure', group:'combat', descr:"Tenir compte de la détérioration des armures"},
|
||||
{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:'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: 'recul', group: 'combat', descr: "Appliquer le recul en cas de particulière en force ou de charge" },
|
||||
{ name: 'resistanceArmeParade', group: 'combat', descr: "Faire le jet de résistance des armes lors de parades pouvant les endommager" },
|
||||
{ name: 'deteriorationArmure', group: 'combat', descr: "Tenir compte de la détérioration des armures" },
|
||||
{ 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: '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", default: true },
|
||||
{ name: 'afficher-prix-joueurs', group: 'generale', descr: "Afficher le prix de l'équipement des joueurs", default: true }
|
||||
];
|
||||
|
||||
export class ReglesOptionelles extends FormApplication {
|
||||
@ -14,7 +15,7 @@ export class ReglesOptionelles extends FormApplication {
|
||||
for (const regle of listeReglesOptionelles) {
|
||||
const name = regle.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", {
|
||||
@ -54,7 +55,7 @@ export class ReglesOptionelles extends FormApplication {
|
||||
formData.regles = listeReglesOptionelles.map(it => {
|
||||
let r = duplicate(it);
|
||||
r.id = ReglesOptionelles._getIdRegle(r.name);
|
||||
r.active = ReglesOptionelles.isUsing(r.name);
|
||||
r.active = ReglesOptionelles.isUsing(r.name);
|
||||
return r;
|
||||
})
|
||||
return formData;
|
||||
|
@ -2,7 +2,7 @@
|
||||
<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>
|
||||
{{#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 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>
|
||||
|
@ -1,9 +1,9 @@
|
||||
<img class="chat-icon" src="systems/foundryvtt-reve-de-dragon/icons/competence_botanique.png" alt="potion de repos" />
|
||||
<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>
|
||||
<hr>
|
||||
<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.
|
||||
</div>
|
||||
|
@ -1,10 +1,10 @@
|
||||
<img class="chat-icon" src="systems/foundryvtt-reve-de-dragon/icons/competence_botanique.png" alt="potion de repos" />
|
||||
<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>
|
||||
<hr>
|
||||
<div>
|
||||
{{#if data.isEnchante}}
|
||||
{{#if data.magique}}
|
||||
Elle permet de récupérer jusqu'à {{data.puissance}} cases de repos.
|
||||
{{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).
|
||||
|
@ -1,10 +1,10 @@
|
||||
<img class="chat-icon" src="systems/foundryvtt-reve-de-dragon/icons/competence_botanique.png" alt="potion de soin" />
|
||||
<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>
|
||||
<hr>
|
||||
<div>
|
||||
{{#if data.isEnchante}}
|
||||
{{#if data.magique}}
|
||||
Elle permet de guérir {{data.puissance}} Points de Guérison.
|
||||
{{else}}
|
||||
Lors de votre prochain jet de récupération à Chateau Dormant, vous bénéficierez d'un bonus de {{data.herbebonus}} (appliqué automatiquement).
|
||||
|
@ -9,7 +9,7 @@
|
||||
{{!-- Sheet Body --}}
|
||||
<section class="sheet-body">
|
||||
<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 data.competence}}
|
||||
{{>"systems/foundryvtt-reve-de-dragon/templates/enum-competence.html"}}
|
||||
@ -17,15 +17,15 @@
|
||||
</select>
|
||||
</div>
|
||||
<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"/>
|
||||
</div>
|
||||
<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"/>
|
||||
</div>
|
||||
<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 data.categorie_parade}}
|
||||
{{>"systems/foundryvtt-reve-de-dragon/templates/enum-categorie-parade.html"}}
|
||||
@ -33,59 +33,59 @@
|
||||
</select>
|
||||
</div>
|
||||
<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"/>
|
||||
</div>
|
||||
<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"/>
|
||||
</div>
|
||||
<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}}/>
|
||||
</div>
|
||||
<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}}/>
|
||||
</div>
|
||||
<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}}/>
|
||||
</div>
|
||||
<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"/>
|
||||
</div>
|
||||
<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"/>
|
||||
</div>
|
||||
<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"/>
|
||||
</div>
|
||||
<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"/>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="xp">Prix (sols) </label>
|
||||
<div class="form-group item-cout">
|
||||
<label for="data.cout">Prix (sols) </label>
|
||||
<input class="attribute-value" type="text" name="data.cout" value="{{data.cout}}" data-dtype="Number"/>
|
||||
</div>
|
||||
<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}}/>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="penetration">Résistance magique </label>
|
||||
<div class="form-group item-magique">
|
||||
<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"/>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="penetration">Nombre d'Ecailles d'Efficacité </label>
|
||||
<div class="form-group item-magique">
|
||||
<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"/>
|
||||
</div>
|
||||
<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 data.initpremierround}}
|
||||
{{>"systems/foundryvtt-reve-de-dragon/templates/enum-initpremierround.html"}}
|
||||
|
@ -24,7 +24,7 @@
|
||||
<label for="xp">Malus Armure </label>
|
||||
<input class="attribute-value" type="text" name="data.malus" value="{{data.malus}}" data-dtype="Number"/>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<div class="form-group item-cout">
|
||||
<label for="xp">Prix (sols) </label>
|
||||
<input class="attribute-value" type="text" name="data.cout" value="{{data.cout}}" data-dtype="Number"/>
|
||||
</div>
|
||||
|
@ -20,7 +20,7 @@
|
||||
<label for="xp">Qualité</label>
|
||||
<input class="attribute-value" type="text" name="data.qualite" value="{{data.qualite}}" data-dtype="Number"/>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<div class="form-group item-cout">
|
||||
<label for="xp">Prix (sols) </label>
|
||||
<input class="attribute-value" type="text" name="data.cout" value="{{data.cout}}" data-dtype="Number"/>
|
||||
</div>
|
||||
|
@ -22,7 +22,7 @@
|
||||
<label>Quantité (Pépins ou Brins)</label>
|
||||
<input class="attribute-value" type="text" name="data.quantite" value="{{data.quantite}}" data-dtype="Number" />
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<div class="form-group item-cout">
|
||||
<label>Prix (sols)</label>
|
||||
<input class="attribute-value" type="text" name="data.cout" value="{{data.cout}}" data-dtype="Number" />
|
||||
</div>
|
||||
|
@ -21,7 +21,7 @@
|
||||
<label>Encombrement</label>
|
||||
<input class="attribute-value" type="text" name="data.encombrement" value="{{data.encombrement}}" data-dtype="Number" />
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<div class="form-group item-cout">
|
||||
<label>Prix (sols)</label>
|
||||
<input class="attribute-value" type="text" name="data.cout" value="{{data.cout}}" data-dtype="Number" />
|
||||
</div>
|
||||
|
@ -55,7 +55,7 @@
|
||||
<label>Quantité </label>
|
||||
<input class="attribute-value" type="text" name="data.quantite" value="{{data.quantite}}" data-dtype="Number" />
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<div class="form-group item-cout">
|
||||
<label for="xp">Prix (sols) </label>
|
||||
<input class="attribute-value" type="text" name="data.cout" value="{{data.cout}}" data-dtype="Number"/>
|
||||
</div>
|
||||
|
@ -20,7 +20,7 @@
|
||||
<label for="xp">Qualité</label>
|
||||
<input class="attribute-value" type="text" name="data.qualite" value="{{data.qualite}}" data-dtype="Number"/>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<div class="form-group item-cout">
|
||||
<label for="xp">Prix (sols) </label>
|
||||
<input class="attribute-value" type="text" name="data.cout" value="{{data.cout}}" data-dtype="Number"/>
|
||||
</div>
|
||||
|
@ -49,7 +49,7 @@
|
||||
<label>Quantité </label>
|
||||
<input class="attribute-value" type="text" name="data.quantite" value="{{data.quantite}}" data-dtype="Number" />
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<div class="form-group item-cout">
|
||||
<label>Prix (sols) </label>
|
||||
<input class="attribute-value" type="text" name="data.cout" value="{{data.cout}}" data-dtype="Number" />
|
||||
</div>
|
||||
|
@ -24,7 +24,7 @@
|
||||
<label for="xp">Qualité</label>
|
||||
<input class="attribute-value" type="text" name="data.qualite" value="{{data.qualite}}" data-dtype="Number"/>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<div class="form-group item-cout">
|
||||
<label for="xp">Prix (sols) </label>
|
||||
<input class="attribute-value" type="text" name="data.cout" value="{{data.cout}}" data-dtype="Number"/>
|
||||
</div>
|
||||
|
@ -21,7 +21,7 @@
|
||||
<label>Quantité </label>
|
||||
<input class="attribute-value" type="text" name="data.quantite" value="{{data.quantite}}" data-dtype="Number" />
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<div class="form-group item-cout">
|
||||
<label>Prix (sols)</label>
|
||||
<input class="attribute-value" type="text" name="data.cout" value="{{data.cout}}" data-dtype="Number" />
|
||||
</div>
|
||||
@ -77,7 +77,7 @@
|
||||
<input class="attribute-value" type="checkbox" name="data.reposalchimique" {{#if data.reposalchimique}}checked{{/if}}/>
|
||||
</div>
|
||||
{{/if}}
|
||||
{{#if data.isEnchante}}
|
||||
{{#if data.magique}}
|
||||
<div class="form-group">
|
||||
<label>Points de rêve</label>
|
||||
<input class="attribute-value" type="text" name="data.pr" value="{{data.pr}}" data-dtype="Number" />
|
||||
|
Loading…
Reference in New Issue
Block a user