Merge branch 'v1.4-equipement' into 'v1.4'

Petites corrections

See merge request LeRatierBretonnien/foundryvtt-reve-de-dragon!228
This commit is contained in:
Leratier Bretonnien 2021-05-07 05:30:58 +00:00
commit 28abc35a21
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!" : "";
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);

View File

@ -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])
}
}

View File

@ -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)
}
}

View File

@ -349,7 +349,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);
@ -920,28 +920,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;
}
}
@ -959,54 +960,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') {
const droppedItemId = dragData.id || dragData.data._id;
if (dragData.actorId && dragData.actorId != this.id) {
console.log("Moving objects", dragData);
this.moveItemsBetweenActors(itemId, dragData.actorId);
this.moveItemsBetweenActors(droppedItemId, dragData.actorId);
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) {
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 !
@ -1061,11 +1060,9 @@ 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]);
}
}
/* -------------------------------------------- */
detectSurEncombrement() {
@ -1474,7 +1471,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];
@ -1491,7 +1488,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);
@ -1499,7 +1496,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;
@ -1669,7 +1666,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;
@ -2348,7 +2345,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]);
@ -2948,7 +2945,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);
@ -3444,7 +3441,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)
@ -3476,7 +3473,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)

View File

@ -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();
if (this.object.isCompetence()){
let level = RdDItemCompetence.getNiveauBase(event.currentTarget.value);
Misc.templateData(this.object).base = level;
$("#base").val( level );
$("#base").val(level);
}
}
/* -------------------------------------------- */

View File

@ -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;

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 = {};
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) {

View File

@ -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);
}
}
}
}
return objetVersConteneur;
}
// 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);
static conteneursRacine(conteneurs) {
return conteneurs.filter( (conteneur, index, arr) => !conteneur.estContenu);
}
/* -------------------------------------------- */

View File

@ -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", {

View File

@ -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>

View File

@ -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>

View File

@ -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).

View File

@ -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).

View File

@ -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"}}

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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" />