Compare commits
41 Commits
foundryvtt
...
foundryvtt
Author | SHA1 | Date | |
---|---|---|---|
f229537206 | |||
5c31c7bd7f | |||
4cf428f630 | |||
0c1b70f3f0 | |||
b7ea857bb4 | |||
0238976ce8 | |||
31fd91336a | |||
c70b6c9d5f | |||
07d0d92f57 | |||
a2968697f4 | |||
fb7dbe6ea0 | |||
59641bf5cf | |||
4ee4445836 | |||
1a346a21c3 | |||
c6c0dd43fd | |||
d69a07d4dd | |||
56379a9234 | |||
fbcc167272 | |||
703ab2579d | |||
6b7e881bf2 | |||
dc3ceb1732 | |||
7a0132cf8d | |||
ca1ea5a854 | |||
9bdde92d61 | |||
74313b7fd3 | |||
9a9399a581 | |||
95a7ac73d0 | |||
ab4c118d12 | |||
681358238d | |||
5511acc876 | |||
2e144851d4 | |||
9f24aee1f3 | |||
e605ab405a | |||
86f69566a6 | |||
2561a658f2 | |||
8a1d1fd253 | |||
e42f384d7f | |||
d381191692 | |||
53a7230f1d | |||
4d5651c2d3 | |||
61474172a7 |
@ -66,9 +66,9 @@ export class RdDActorSheet extends RdDBaseActorSheet {
|
||||
formData.calc.fatigue = RdDUtility.calculFatigueHtml(formData.system.sante.fatigue.value, formData.system.sante.endurance.max);
|
||||
|
||||
formData.competences.forEach(item => {
|
||||
item.system.isVisible = this.options.recherche
|
||||
? RdDItemCompetence.nomContientTexte(item, this.options.recherche.text)
|
||||
: (!this.options.showCompNiveauBase || !RdDItemCompetence.isNiveauBase(item));
|
||||
item.system.isHidden = this.options.recherche
|
||||
? !item.isNomLike(this.options.recherche.text)
|
||||
: (this.options.showCompNiveauBase && RdDItemCompetence.isNiveauBase(item));
|
||||
RdDItemCompetence.levelUp(item, formData.system.compteurs.experience.value);
|
||||
});
|
||||
|
||||
@ -354,29 +354,6 @@ export class RdDActorSheet extends RdDBaseActorSheet {
|
||||
this.render(true);
|
||||
});
|
||||
|
||||
this.html.find('.recherche')
|
||||
.each((index, field) => {
|
||||
if (this.options.recherche) {
|
||||
field.focus();
|
||||
field.setSelectionRange(this.options.recherche.start, this.options.recherche.end);
|
||||
}
|
||||
})
|
||||
.keyup(async event => {
|
||||
const nouvelleRecherche = this._optionRecherche(event.currentTarget);
|
||||
if (this.options.recherche?.text != nouvelleRecherche?.text) {
|
||||
this.options.recherche = nouvelleRecherche;
|
||||
if (this.timerRecherche) {
|
||||
clearTimeout(this.timerRecherche);
|
||||
}
|
||||
this.timerRecherche = setTimeout(() => {
|
||||
this.timerRecherche = undefined;
|
||||
this.render(true);
|
||||
}, 500);
|
||||
}
|
||||
})
|
||||
.change(async event =>
|
||||
this.options.recherche = this._optionRecherche(event.currentTarget)
|
||||
);
|
||||
this.html.find('.vue-detaillee').click(async event => {
|
||||
this.options.vueDetaillee = !this.options.vueDetaillee;
|
||||
this.render(true);
|
||||
@ -486,16 +463,6 @@ export class RdDActorSheet extends RdDBaseActorSheet {
|
||||
async createEmptyTache() {
|
||||
await this.actor.createItem('tache', 'Nouvelle tache');
|
||||
}
|
||||
_optionRecherche(target) {
|
||||
if (!target.value?.length) {
|
||||
return undefined;
|
||||
}
|
||||
return {
|
||||
text: target.value,
|
||||
start: target.selectionStart,
|
||||
end: target.selectionEnd,
|
||||
};
|
||||
}
|
||||
|
||||
_getEventArmeCombat(event) {
|
||||
const li = this.html.find(event.currentTarget)?.parents(".item");
|
||||
|
309
module/actor.js
309
module/actor.js
@ -32,7 +32,7 @@ import { RdDConfirm } from "./rdd-confirm.js";
|
||||
import { DialogValidationEncaissement } from "./dialog-validation-encaissement.js";
|
||||
import { RdDRencontre } from "./item/rencontre.js";
|
||||
import { Targets } from "./targets.js";
|
||||
import { DialogRepos } from "./dialog-repos.js";
|
||||
import { DialogRepos } from "./sommeil/dialog-repos.js";
|
||||
import { RdDBaseActor } from "./actor/base-actor.js";
|
||||
import { RdDTimestamp } from "./rdd-timestamp.js";
|
||||
import { RdDItemTache } from "./item-tache.js";
|
||||
@ -208,6 +208,7 @@ export class RdDActor extends RdDBaseActor {
|
||||
}
|
||||
return etatGeneral
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
getActivePoisons() {
|
||||
return duplicate(this.items.filter(item => item.type == 'poison' && item.system.active))
|
||||
@ -359,6 +360,21 @@ export class RdDActor extends RdDBaseActor {
|
||||
dialog.render(true);
|
||||
}
|
||||
|
||||
async prepareChateauDormant(consigne) {
|
||||
if (consigne.ignorer) {
|
||||
return;
|
||||
}
|
||||
if (consigne.stress.valeur > 0) {
|
||||
await this.distribuerStress('stress', consigne.stress.valeur, consigne.stress.motif);
|
||||
}
|
||||
await this.update({ 'system.sommeil': consigne.sommeil })
|
||||
}
|
||||
|
||||
async onTimeChanging(oldTimestamp, newTimestamp) {
|
||||
await super.onTimeChanging(oldTimestamp, newTimestamp);
|
||||
await this.setInfoSommeilInsomnie();
|
||||
}
|
||||
|
||||
async repos() {
|
||||
await DialogRepos.create(this);
|
||||
}
|
||||
@ -370,13 +386,8 @@ export class RdDActor extends RdDBaseActor {
|
||||
content: `${nGrisReve} jours de gris rêve sont passés. `
|
||||
};
|
||||
for (let i = 0; i < nGrisReve; i++) {
|
||||
await this.dormir(6, { grisReve: true });
|
||||
const blessures = duplicate(this.system.blessures);
|
||||
await this._recupererBlessures(message, "legere", blessures.legeres.liste.filter(b => b.active), []);
|
||||
await this._recupererBlessures(message, "grave", blessures.graves.liste.filter(b => b.active), blessures.legeres.liste);
|
||||
await this._recupererBlessures(message, "critique", blessures.critiques.liste.filter(b => b.active), blessures.graves.liste);
|
||||
await this.update({ "system.blessures": blessures });
|
||||
await this._recupererVie(message);
|
||||
await this.dormir(4, { grisReve: true });
|
||||
await this._recuperationSante(message);
|
||||
|
||||
const moralActuel = Misc.toInt(this.system.compteurs.moral.value);
|
||||
if (moralActuel != 0) {
|
||||
@ -386,35 +397,91 @@ export class RdDActor extends RdDBaseActor {
|
||||
await this.transformerStress();
|
||||
this.bonusRecuperationPotion = 0; // Reset potion
|
||||
}
|
||||
await this.resetInfoSommeil()
|
||||
ChatMessage.create(message);
|
||||
this.sheet.render(true);
|
||||
}
|
||||
|
||||
async _recuperationSante(message) {
|
||||
const maladiesPoisons = this._maladiePoisons(message);
|
||||
const isMaladeEmpoisonne = maladiesPoisons.length > 0;
|
||||
this._messageRecuperationMaladiePoisons(maladiesPoisons, message);
|
||||
const blessures = duplicate(this.system.blessures);
|
||||
await this._recupererBlessures(message, "legere", blessures.legeres.liste.filter(b => b.active), [], isMaladeEmpoisonne);
|
||||
await this._recupererBlessures(message, "grave", blessures.graves.liste.filter(b => b.active), blessures.legeres.liste, isMaladeEmpoisonne);
|
||||
await this._recupererBlessures(message, "critique", blessures.critiques.liste.filter(b => b.active), blessures.graves.liste, isMaladeEmpoisonne);
|
||||
await this.update({ "system.blessures": blessures });
|
||||
await this._recupererVie(message, isMaladeEmpoisonne);
|
||||
}
|
||||
|
||||
_maladiePoisons(message) {
|
||||
const actifs = this.items.filter(item => item.type == 'maladie' || (item.type == 'poison' && item.system.active));
|
||||
return actifs;
|
||||
}
|
||||
|
||||
_messageRecuperationMaladiePoisons(maladiesPoisons, message) {
|
||||
if (maladiesPoisons.length > 0) {
|
||||
const identifies = maladiesPoisons.filter(it => it.system.identifie);
|
||||
const nonIdentifies = maladiesPoisons.filter(it => !it.system.identifie);
|
||||
message.content += 'Vous souffrez';
|
||||
switch (nonIdentifies.length) {
|
||||
case 0: break;
|
||||
case 1: message.content += ` d'un mal inconnu`; break;
|
||||
default: message.content += ` de ${nonIdentifies.length} maux inconnus`; break;
|
||||
}
|
||||
if (identifies.length > 0) {
|
||||
if (nonIdentifies > 0) {
|
||||
message.content += ' et';
|
||||
} else {
|
||||
message.content += ' de ' + identifies.map(it => it.name).reduce(Misc.joining(', '));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
async dormirChateauDormant() {
|
||||
let message = {
|
||||
whisper: ChatUtility.getWhisperRecipientsAndGMs(this.name),
|
||||
content: ""
|
||||
};
|
||||
if (!ReglesOptionelles.isUsing("chateau-dormant-gardien") || !this.system.sommeil || this.system.sommeil.nouveaujour) {
|
||||
const message = {
|
||||
whisper: ChatUtility.getWhisperRecipientsAndGMs(this.name),
|
||||
content: ""
|
||||
};
|
||||
|
||||
const blessures = duplicate(this.system.blessures)
|
||||
await this._recupererBlessures(message, "legere", blessures.legeres.liste.filter(b => b.active), []);
|
||||
await this._recupererBlessures(message, "grave", blessures.graves.liste.filter(b => b.active), blessures.legeres.liste);
|
||||
await this._recupererBlessures(message, "critique", blessures.critiques.liste.filter(b => b.active), blessures.graves.liste);
|
||||
await this.update({ "system.blessures": blessures });
|
||||
await this._recupererVie(message);
|
||||
await this._jetDeMoralChateauDormant(message);
|
||||
await this._recupereChance();
|
||||
await this.transformerStress();
|
||||
await this.retourSeuilDeReve(message);
|
||||
this.bonusRecuperationPotion = 0; // Reset potion
|
||||
await this.retourSust(message);
|
||||
await this.verifierPotionsEnchantees();
|
||||
if (message.content != "") {
|
||||
message.content = `A la fin Chateau Dormant, ${message.content}<br>Un nouveau jour se lève`;
|
||||
ChatMessage.create(message);
|
||||
await this._recuperationSante(message)
|
||||
await this._jetDeMoralChateauDormant(message);
|
||||
await this._recupereChance();
|
||||
await this.transformerStress();
|
||||
await this.retourSeuilDeReve(message);
|
||||
this.bonusRecuperationPotion = 0; // Reset potion
|
||||
await this.retourSust(message);
|
||||
await this.verifierPotionsEnchantees();
|
||||
if (message.content != "") {
|
||||
message.content = `A la fin Chateau Dormant, ${message.content}<br>Un nouveau jour se lève`;
|
||||
ChatMessage.create(message);
|
||||
}
|
||||
await this.resetInfoSommeil();
|
||||
this.sheet.render(true);
|
||||
}
|
||||
this.sheet.render(true);
|
||||
}
|
||||
|
||||
async resetInfoSommeil() {
|
||||
await this.update({
|
||||
'system.sommeil': {
|
||||
nouveaujour: false,
|
||||
date: game.system.rdd.calendrier.getTimestamp(),
|
||||
moral: "neutre",
|
||||
heures: 0,
|
||||
insomnie: EffetsDraconiques.isSujetInsomnie(this)
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
async setInfoSommeilInsomnie() {
|
||||
await this.update({ 'system.sommeil.insomnie': EffetsDraconiques.isSujetInsomnie(this) });
|
||||
}
|
||||
|
||||
async setInfoSommeilMoral(situationMoral) {
|
||||
await this.update({ 'system.sommeil.moral': situationMoral });
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
@ -428,12 +495,27 @@ export class RdDActor extends RdDBaseActor {
|
||||
}
|
||||
|
||||
async _jetDeMoralChateauDormant(message) {
|
||||
const jetMoral = await this._jetDeMoral('neutre');
|
||||
message.content += jetMoral.ajustement == 0 ? ' -- le moral reste stable' : ' -- le moral retourne vers 0';
|
||||
const etatMoral = this.system.sommeil?.moral ?? 'neutre';
|
||||
const jetMoral = await this._jetDeMoral(etatMoral);
|
||||
message.content += ` -- le jet de moral est ${etatMoral}, le moral ` + this._messageAjustementMoral(jetMoral.ajustement);
|
||||
}
|
||||
|
||||
_messageAjustementMoral(ajustement) {
|
||||
switch (Math.sign(ajustement)) {
|
||||
case 1:
|
||||
return `remonte de ${ajustement}`;
|
||||
case -1:
|
||||
return `diminue de ${-ajustement}`;
|
||||
case 0:
|
||||
return 'reste stable';
|
||||
default:
|
||||
console.error(`Le signe de l'ajustement de moral ${ajustement} est ${Math.sign(ajustement)}, ce qui est innatendu`)
|
||||
return `est ajusté de ${ajustement} (bizarre)`;
|
||||
}
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
async _recupererBlessures(message, type, liste, moindres) {
|
||||
async _recupererBlessures(message, type, liste, moindres, isMaladeEmpoisonne) {
|
||||
if (!this.bonusRecuperationPotion) this.bonusRecuperationPotion = 0;
|
||||
let count = 0;
|
||||
const definitions = RdDUtility.getDefinitionsBlessures();
|
||||
@ -442,7 +524,7 @@ export class RdDActor extends RdDBaseActor {
|
||||
if (blessure.jours >= definition.facteur) {
|
||||
let rolled = await this._jetRecuperationConstitution(Misc.toInt(blessure.soins_complets) + this.bonusRecuperationPotion, message);
|
||||
blessure.soins_complets = 0;
|
||||
if (rolled.isSuccess && this._retrograderBlessure(type, blessure, moindres)) {
|
||||
if (!isMaladeEmpoisonne && rolled.isSuccess && this._retrograderBlessure(type, blessure, moindres)) {
|
||||
message.content += ` -- une blessure ${type} cicatrise`;
|
||||
count++;
|
||||
}
|
||||
@ -481,7 +563,7 @@ export class RdDActor extends RdDBaseActor {
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
async _recupererVie(message) {
|
||||
async _recupererVie(message, isMaladeEmpoisonne) {
|
||||
const tData = this.system
|
||||
let blessures = [].concat(tData.blessures.legeres.liste).concat(tData.blessures.graves.liste).concat(tData.blessures.critiques.liste);
|
||||
let nbBlessures = blessures.filter(b => b.active);
|
||||
@ -492,7 +574,7 @@ export class RdDActor extends RdDBaseActor {
|
||||
bonusSoins = Math.max(bonusSoins, Misc.toInt(b.soins_complets));
|
||||
}
|
||||
let rolled = await this._jetRecuperationConstitution(bonusSoins, message)
|
||||
if (rolled.isSuccess) {
|
||||
if (!isMaladeEmpoisonne && rolled.isSuccess) {
|
||||
const gain = Math.min(rolled.isPart ? 2 : 1, vieManquante);
|
||||
message.content += " -- récupération de vie: " + gain;
|
||||
await this.santeIncDec("vie", gain);
|
||||
@ -550,59 +632,89 @@ export class RdDActor extends RdDBaseActor {
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
async dormir(heures, options = { grisReve: false }) {
|
||||
let message = {
|
||||
async dormir(heures, options = { grisReve: false, chateauDormant: false }) {
|
||||
const message = {
|
||||
whisper: ChatUtility.getWhisperRecipientsAndGMs(this.name),
|
||||
content: ""
|
||||
content: this.name + ': '
|
||||
};
|
||||
await this.recupereEndurance(message);
|
||||
let sep = ""
|
||||
let recuperationReve = "";
|
||||
let i = 0;
|
||||
for (; i < heures; i++) {
|
||||
await this._recupererEthylisme(message);
|
||||
await this.recupererFatigue(message);
|
||||
if (!options.grisReve) {
|
||||
let r = await this.recuperationReve(message);
|
||||
if (r >= 0) {
|
||||
recuperationReve += sep + r;
|
||||
sep = "+";
|
||||
}
|
||||
if (this.system.sommeil?.insomnie || heures == 0) {
|
||||
message.content += 'Vous ne trouvez pas le sommeil';
|
||||
}
|
||||
else {
|
||||
let jetsReve = [];
|
||||
let dormi = await this.dormirDesHeures(jetsReve, message, heures, options);
|
||||
message.content += `Vous dormez ${dormi.heures <= 1 ? 'une heure' : (dormi.heures + ' heures')}. `;
|
||||
if (jetsReve.length > 0) {
|
||||
message.content += `Vous récupérez ${jetsReve.filter(it => it >= 0).reduce(Misc.joining("+"))} Points de rêve. `;
|
||||
}
|
||||
if (dormi.etat == 'eveil') {
|
||||
message.content += 'Vous êtes réveillé par un Rêve de Dragon.'
|
||||
}
|
||||
options.chateauDormant = options.chateauDormant && dormi.heures == heures;
|
||||
}
|
||||
|
||||
if (r >= 0 && EffetsDraconiques.isDonDoubleReve(this)) {
|
||||
r = await this.recuperationReve(message);
|
||||
if (r >= 0) {
|
||||
recuperationReve += sep + r;
|
||||
}
|
||||
}
|
||||
if (r < 0) {
|
||||
i++;// rêve de dragon pendant l'heure en cours
|
||||
break;
|
||||
if (!options.grisReve) {
|
||||
ChatMessage.create(message);
|
||||
}
|
||||
if (options.chateauDormant) {
|
||||
await this.dormirChateauDormant();
|
||||
}
|
||||
else {
|
||||
this.sheet.render(true);
|
||||
}
|
||||
}
|
||||
|
||||
async dormirDesHeures(jetsReve, message, heures, options) {
|
||||
const dormi = { heures: 1, etat: 'dort' };
|
||||
for (; dormi.heures <= heures && dormi.etat == 'dort'; dormi.heures++) {
|
||||
await this._recupererEthylisme(message);
|
||||
if (options.grisReve) {
|
||||
await this.recupererFatigue(message);
|
||||
}
|
||||
else if (!this.system.sommeil?.insomnie) {
|
||||
await this.recupererFatigue(message);
|
||||
dormi.etat = await this.jetRecuperationReve(jetsReve, message);
|
||||
if (dormi.etat == 'dort' && EffetsDraconiques.isDonDoubleReve(this)) {
|
||||
dormi.etat = await this.jetRecuperationReve(jetsReve, message);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (!options.grisReve) {
|
||||
message.content = `${this.name}: Vous dormez ${i == 0 ? 'une' : i} heure${i == 1 ? '' : 's'}. `
|
||||
+ (recuperationReve == "" ? "" : `Vous récupérez ${recuperationReve} Points de rêve. `)
|
||||
+ message.content;
|
||||
ChatMessage.create(message);
|
||||
return dormi;
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
async jetRecuperationReve(jetsReve, message) {
|
||||
if (this.getReveActuel() < this.system.reve.seuil.value) {
|
||||
let reve = await RdDDice.rollTotal("1dr");
|
||||
if (reve >= 7) {
|
||||
// Rêve de Dragon !
|
||||
message.content += `Vous faites un <strong>Rêve de Dragon</strong> de ${reve} Points de rêve qui vous réveille! `;
|
||||
await this.combattreReveDeDragon(reve);
|
||||
jetsReve.push(-1);
|
||||
return 'eveil';
|
||||
}
|
||||
else {
|
||||
await this.reveActuelIncDec(reve);
|
||||
jetsReve.push(reve);
|
||||
}
|
||||
}
|
||||
this.sheet.render(true);
|
||||
return i;
|
||||
return 'dort';
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
async _recupererEthylisme(message) {
|
||||
let ethylisme = duplicate(this.system.compteurs.ethylisme);
|
||||
ethylisme.nb_doses = 0;
|
||||
ethylisme.jet_moral = false;
|
||||
if (ethylisme.value < 1) {
|
||||
ethylisme.value = Math.min(ethylisme.value + 1, 1);
|
||||
if (ethylisme.value <= 0) {
|
||||
message.content += `Vous dégrisez un peu (${RdDUtility.getNomEthylisme(ethylisme.value)}). `;
|
||||
}
|
||||
let value = Math.min(Number.parseInt(this.system.compteurs.ethylisme.value) + 1, 1);
|
||||
if (value <= 0) {
|
||||
message.content += `Vous dégrisez un peu (${RdDUtility.getNomEthylisme(value)}). `;
|
||||
}
|
||||
await this.update({ "system.compteurs.ethylisme": ethylisme });
|
||||
await this.update({
|
||||
"system.compteurs.ethylisme": {
|
||||
nb_doses: 0,
|
||||
jet_moral: false,
|
||||
value: value
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
@ -610,7 +722,7 @@ export class RdDActor extends RdDBaseActor {
|
||||
const manquant = this._computeEnduranceMax() - this.system.sante.endurance.value;
|
||||
if (manquant > 0) {
|
||||
await this.santeIncDec("endurance", manquant);
|
||||
message.content += "Vous récuperez " + manquant + " points d'endurance. ";
|
||||
message.content += `Vous récuperez ${manquant} points d'endurance. `;
|
||||
}
|
||||
}
|
||||
|
||||
@ -650,27 +762,6 @@ export class RdDActor extends RdDBaseActor {
|
||||
return cumul;
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
async recuperationReve(message) {
|
||||
const seuil = this.system.reve.seuil.value;
|
||||
const reveActuel = this.getReveActuel();
|
||||
if (reveActuel < seuil) {
|
||||
let deRecuperation = await RdDDice.rollTotal("1dr");
|
||||
console.log("recuperationReve", deRecuperation);
|
||||
if (deRecuperation >= 7) {
|
||||
// Rêve de Dragon !
|
||||
message.content += `Vous faites un <strong>Rêve de Dragon</strong> de ${deRecuperation} Points de rêve qui vous réveille! `;
|
||||
await this.combattreReveDeDragon(deRecuperation);
|
||||
return -1;
|
||||
}
|
||||
else {
|
||||
await this.reveActuelIncDec(deRecuperation);
|
||||
return deRecuperation;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
async retourSeuilDeReve(message) {
|
||||
const seuil = this.system.reve.seuil.value;
|
||||
@ -971,12 +1062,12 @@ export class RdDActor extends RdDBaseActor {
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
distribuerStress(compteur, stress, motif) {
|
||||
async distribuerStress(compteur, stress, motif) {
|
||||
if (game.user.isGM && this.hasPlayerOwner && this.isPersonnage()) {
|
||||
switch (compteur) {
|
||||
case 'stress': case 'experience':
|
||||
await this.addCompteurValue(compteur, stress, motif);
|
||||
const message = `${this.name} a reçu ${stress} points ${compteur == 'stress' ? "de stress" : "d'expérience"} (raison : ${motif})`;
|
||||
this.addCompteurValue(compteur, stress, motif);
|
||||
ui.notifications.info(message);
|
||||
game.users.players.filter(player => player.active && player.character?.id == this.id)
|
||||
.forEach(player => ChatUtility.notifyUser(player.id, 'info', message));
|
||||
@ -1571,7 +1662,7 @@ export class RdDActor extends RdDBaseActor {
|
||||
case 'heureux': case 'heureuse': return succes ? 1 : 0;
|
||||
case 'malheureuse': case 'malheureux': return succes ? 0 : -1;
|
||||
case 'neutre':
|
||||
if (succes && moral <= 0) return 1;
|
||||
if (succes && moral < 0) return 1;
|
||||
if (!succes && moral > 0) return -1;
|
||||
}
|
||||
return 0;
|
||||
@ -1722,16 +1813,17 @@ export class RdDActor extends RdDBaseActor {
|
||||
async manger(item, doses, options = { diminuerQuantite: true }) {
|
||||
const sust = item.system.sust
|
||||
if (sust > 0) {
|
||||
await this.updateCompteurValue('sust', Misc.keepDecimals(this.system.compteurs.sust.value + sust * doses, 1));
|
||||
await this.updateCompteurValue('sust', RdDActor.$calculNewSust(this.system.compteurs.sust.value, sust, doses));
|
||||
}
|
||||
await item.diminuerQuantite(doses, options);
|
||||
}
|
||||
|
||||
|
||||
/* -------------------------------------------- */
|
||||
async boire(item, doses, options = { diminuerQuantite: true }) {
|
||||
const desaltere = item.system.desaltere;
|
||||
if (desaltere > 0) {
|
||||
await this.updateCompteurValue('eau', Misc.keepDecimals(this.system.compteurs.eau.value + desaltere * doses, 1));
|
||||
await this.updateCompteurValue('eau', RdDActor.$calculNewSust(this.system.compteurs.eau.value, desaltere, doses));
|
||||
}
|
||||
if (item.isAlcool()) {
|
||||
for (let i = 0; i < doses; i++) {
|
||||
@ -1741,6 +1833,10 @@ export class RdDActor extends RdDBaseActor {
|
||||
await item.diminuerQuantite(doses, options);
|
||||
}
|
||||
|
||||
static $calculNewSust(value, sust, doses) {
|
||||
return Misc.keepDecimals(Number(value) + Number(sust) * Number(doses), 1);
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
async saouler(forceAlcool, alcool = undefined) {
|
||||
let ethylisme = duplicate(this.system.compteurs.ethylisme);
|
||||
@ -1817,7 +1913,7 @@ export class RdDActor extends RdDBaseActor {
|
||||
/* -------------------------------------------- */
|
||||
async transformerStress() {
|
||||
const stress = Number(this.system.compteurs.stress.value);
|
||||
if (stress <= 0) {
|
||||
if (this.system.sommeil?.insomnie || stress <= 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
@ -3733,9 +3829,10 @@ export class RdDActor extends RdDBaseActor {
|
||||
if (Misc.isUniqueConnectedGM()) {
|
||||
let draconique = Draconique.all().find(it => it.match(item));
|
||||
if (draconique) {
|
||||
draconique.onActorCreateOwned(this, item)
|
||||
await draconique.onActorCreateOwned(this, item)
|
||||
this.notifyGestionTeteSouffleQueue(item, draconique.manualMessage());
|
||||
}
|
||||
await this.setInfoSommeilInsomnie();
|
||||
}
|
||||
}
|
||||
|
||||
@ -3744,7 +3841,7 @@ export class RdDActor extends RdDBaseActor {
|
||||
if (Misc.isUniqueConnectedGM()) {
|
||||
let draconique = Draconique.all().find(it => it.match(item));
|
||||
if (draconique) {
|
||||
draconique.onActorDeleteOwned(this, item)
|
||||
await draconique.onActorDeleteOwned(this, item)
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -3754,7 +3851,7 @@ export class RdDActor extends RdDBaseActor {
|
||||
if (Misc.isUniqueConnectedGM()) {
|
||||
let draconique = Draconique.all().find(it => it.isCase(item));
|
||||
if (draconique) {
|
||||
draconique.onActorDeleteCaseTmr(this, item)
|
||||
await draconique.onActorDeleteCaseTmr(this, item)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -31,48 +31,49 @@ export class RdDBaseActorSheet extends ActorSheet {
|
||||
Monnaie.validerMonnaies(this.actor.itemTypes['monnaie']);
|
||||
|
||||
this.actor.recompute();
|
||||
const userRightLevel = game.user.isGM ? CONST.DOCUMENT_OWNERSHIP_LEVELS.OWNER : this.actor.getUserLevel(game.user)
|
||||
const options = duplicate(this.options);
|
||||
mergeObject(options, {
|
||||
isGM: game.user.isGM,
|
||||
editable: this.isEditable,
|
||||
cssClass: this.isEditable ? "editable" : "locked",
|
||||
isLimited: userRightLevel >= CONST.DOCUMENT_OWNERSHIP_LEVELS.LIMITED,
|
||||
isObserver: userRightLevel >= CONST.DOCUMENT_OWNERSHIP_LEVELS.OBSERVER,
|
||||
isOwner: userRightLevel >= CONST.DOCUMENT_OWNERSHIP_LEVELS.OWNER,
|
||||
owner: this.actor.isOwner,
|
||||
});
|
||||
|
||||
let formData = {
|
||||
title: this.title,
|
||||
id: this.actor.id,
|
||||
type: this.actor.type,
|
||||
img: this.actor.img,
|
||||
name: this.actor.name,
|
||||
system: foundry.utils.deepClone(this.actor.system),
|
||||
system: this.actor.system,
|
||||
description: await TextEditor.enrichHTML(this.actor.system.description, { async: true }),
|
||||
notesmj: await TextEditor.enrichHTML(this.actor.system.notesmj, { async: true }),
|
||||
options: options,
|
||||
options: RdDSheetUtility.mergeDocumentRights(this.options, this.actor, this.isEditable)
|
||||
}
|
||||
|
||||
RdDBaseActorSheet.filterItemsPerTypeForSheet(formData, this.actor.itemTypes);
|
||||
formData.calc = {
|
||||
fortune: this.toSolsDeniers(this.actor.getFortune()),
|
||||
fortune: Monnaie.toSolsDeniers(this.actor.getFortune()),
|
||||
prixTotalEquipement: this.actor.computePrixTotalEquipement(),
|
||||
encTotal: await this.actor.computeEncTotal(),
|
||||
}
|
||||
|
||||
this.objetVersConteneur = RdDUtility.buildArbreDeConteneurs(formData.conteneurs, formData.objets);
|
||||
this._appliquerRechercheObjets(formData.objets, formData.conteneurs);
|
||||
formData.conteneurs = RdDUtility.conteneursRacine(formData.conteneurs);
|
||||
|
||||
|
||||
return formData;
|
||||
}
|
||||
|
||||
toSolsDeniers(fortune) {
|
||||
return {
|
||||
sols: Math.floor(fortune),
|
||||
deniers: Math.round(100 * (fortune - Math.floor(fortune)))
|
||||
};
|
||||
_appliquerRechercheObjets(objets, conteneurs) {
|
||||
if (this.options.recherche?.text) {
|
||||
const recherche = this.options.recherche;
|
||||
const allVisible = objets.filter(it => it.isNomTypeLike(recherche.text)).map(it => it.id);
|
||||
let addVisible = conteneurs.filter(it => it.isNomTypeLike(recherche.text)).map(it => it.id)
|
||||
do {
|
||||
allVisible.push(...addVisible)
|
||||
const parentsIds = conteneurs.filter(it => it.system.contenu.find(id => allVisible.includes(id))).map(it => it.id)
|
||||
addVisible = parentsIds.filter(id => !allVisible.includes(id))
|
||||
}
|
||||
while (addVisible.length > 0)
|
||||
objets.forEach(it => it.system.isHidden = !allVisible.includes(it.id))
|
||||
conteneurs.forEach(it => it.system.isHidden = !allVisible.includes(it.id))
|
||||
}
|
||||
else {
|
||||
objets.forEach(it => it.system.isHidden = false)
|
||||
conteneurs.forEach(it => it.system.isHidden = false)
|
||||
}
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
@ -159,6 +160,34 @@ export class RdDBaseActorSheet extends ActorSheet {
|
||||
this.html.find('.monnaie-moins').click(async event => {
|
||||
this.actor.monnaieIncDec(this.getItemId(event), -1);
|
||||
});
|
||||
this.html.find('.recherche')
|
||||
.each((index, field) => {
|
||||
this._rechercheSelectArea(field);
|
||||
})
|
||||
.keyup(async event => this._rechercherKeyup(event))
|
||||
.change(async event => this._rechercherKeyup(event));
|
||||
}
|
||||
|
||||
_rechercherKeyup(event) {
|
||||
const currentTarget = event.currentTarget;
|
||||
const nouvelleRecherche = this._optionRecherche(currentTarget);
|
||||
if (this.options.recherche?.text != nouvelleRecherche?.text) {
|
||||
this.options.recherche = nouvelleRecherche;
|
||||
if (this.timerRecherche) {
|
||||
clearTimeout(this.timerRecherche);
|
||||
}
|
||||
this.timerRecherche = setTimeout(() => {
|
||||
this.timerRecherche = undefined;
|
||||
this.render(true);
|
||||
}, 500);
|
||||
}
|
||||
}
|
||||
|
||||
_rechercheSelectArea(field) {
|
||||
if (this.options.recherche) {
|
||||
field.focus();
|
||||
field.setSelectionRange(this.options.recherche.start, this.options.recherche.end);
|
||||
}
|
||||
}
|
||||
|
||||
getItemId(event) {
|
||||
@ -169,6 +198,16 @@ export class RdDBaseActorSheet extends ActorSheet {
|
||||
return RdDSheetUtility.getItem(event, this.actor);
|
||||
}
|
||||
|
||||
_optionRecherche(target) {
|
||||
if (!target.value?.length) {
|
||||
return undefined;
|
||||
}
|
||||
return {
|
||||
text: target.value,
|
||||
start: target.selectionStart,
|
||||
end: target.selectionEnd,
|
||||
};
|
||||
}
|
||||
/* -------------------------------------------- */
|
||||
_getHeaderButtons() {
|
||||
let buttons = super._getHeaderButtons();
|
||||
|
@ -8,7 +8,7 @@ export class DialogItemVente extends Dialog {
|
||||
const venteData = {
|
||||
item: item,
|
||||
alias: item.actor?.name ?? game.user.name,
|
||||
vendeurId: item.actor?.id ,
|
||||
vendeurId: item.actor?.id,
|
||||
prixOrigine: item.calculerPrixCommercant(),
|
||||
prixUnitaire: item.calculerPrixCommercant(),
|
||||
prixLot: item.calculerPrixCommercant(),
|
||||
@ -40,51 +40,62 @@ export class DialogItemVente extends Dialog {
|
||||
|
||||
activateListeners(html) {
|
||||
super.activateListeners(html);
|
||||
|
||||
this.html = html;
|
||||
this.setQuantiteIllimite(this.venteData.quantiteIllimite);
|
||||
this.html.find(".tailleLot").change(event => this.setTailleLot(Number(event.currentTarget.value)));
|
||||
this.html.find(".quantiteNbLots").change(event => this.setNbLots(Number(event.currentTarget.value)));
|
||||
this.html.find(".quantiteIllimite").change(event => this.setQuantiteIllimite(event.currentTarget.checked));
|
||||
this.html.find(".prixLot").change(event => this.setPrixLot(Number(event.currentTarget.value)));
|
||||
|
||||
this.setQuantiteIllimite(this.venteData.quantiteIllimite);
|
||||
}
|
||||
|
||||
async onProposer(it) {
|
||||
await this.html.find(".tailleLot").change();
|
||||
await this.html.find(".quantiteNbLots").change();
|
||||
await this.html.find(".quantiteIllimite").change();
|
||||
await this.html.find(".prixLot").change();
|
||||
this.updateVente(this.getChoixVente());
|
||||
this.callback(this.venteData);
|
||||
}
|
||||
|
||||
updateVente(update) {
|
||||
mergeObject(this.venteData, update);
|
||||
}
|
||||
|
||||
getChoixVente() {
|
||||
return {
|
||||
quantiteNbLots: Number(this.html.find(".quantiteNbLots").val()),
|
||||
tailleLot: Number(this.html.find(".tailleLot").val()),
|
||||
quantiteIllimite: this.html.find(".quantiteIllimite").is(':checked'),
|
||||
prixLot: Number(this.html.find(".prixLot").val())
|
||||
};
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
setPrixLot(prixLot) {
|
||||
this.venteData.prixLot = prixLot;
|
||||
}
|
||||
|
||||
setTailleLot(tailleLot) {
|
||||
// recalculer le prix du lot
|
||||
if (tailleLot != this.venteData.tailleLot) {
|
||||
this.venteData.prixLot = (tailleLot * this.venteData.prixOrigine).toFixed(2);
|
||||
this.html.find(".prixLot").val(this.venteData.prixLot);
|
||||
}
|
||||
this.venteData.tailleLot = tailleLot;
|
||||
// recalculer le nombre de lots max
|
||||
this.venteData.quantiteMaxLots = Math.floor(this.venteData.quantiteMax / tailleLot);
|
||||
this.venteData.quantiteNbLots = Math.min(this.venteData.quantiteMaxLots, this.venteData.quantiteNbLots);
|
||||
const maxLots = Math.floor(this.venteData.quantiteMax / tailleLot);
|
||||
this.updateVente({
|
||||
tailleLot,
|
||||
quantiteNbLots: Math.min(maxLots, this.venteData.quantiteNbLots),
|
||||
quantiteMaxLots: maxLots,
|
||||
prixLot: (tailleLot * this.venteData.prixOrigine).toFixed(2)
|
||||
});
|
||||
|
||||
this.html.find(".prixLot").val(this.venteData.prixLot);
|
||||
this.html.find(".quantiteNbLots").val(this.venteData.quantiteNbLots);
|
||||
this.html.find(".quantiteNbLots").attr("max", this.venteData.quantiteMaxLots)
|
||||
}
|
||||
|
||||
setNbLots(nbLots) {
|
||||
if (this.venteData.isOwned) {
|
||||
nbLots = Math.max(0, Math.min(nbLots, this.venteData.quantiteMaxLots));
|
||||
}
|
||||
this.venteData.quantiteNbLots = nbLots;
|
||||
this.updateVente({
|
||||
quantiteNbLots: this.venteData.isOwned ? Math.max(0, Math.min(nbLots, this.venteData.quantiteMaxLots)) : nbLots
|
||||
})
|
||||
this.html.find(".quantiteNbLots").val(this.venteData.quantiteNbLots);
|
||||
}
|
||||
|
||||
setQuantiteIllimite(checked) {
|
||||
this.venteData.quantiteIllimite = checked;
|
||||
this.updateVente({ quantiteIllimite: checked })
|
||||
this.html.find(".label-quantiteIllimite").text(this.venteData.quantiteIllimite ? "Illimités" : "disponibles");
|
||||
HtmlUtility.showControlWhen(this.html.find(".quantiteNbLots"), !this.venteData.quantiteIllimite)
|
||||
}
|
||||
|
@ -1,57 +0,0 @@
|
||||
|
||||
export class DialogRepos extends Dialog {
|
||||
|
||||
static async create(actor) {
|
||||
const html = await renderTemplate("systems/foundryvtt-reve-de-dragon/templates/dialog-repos.html", actor);
|
||||
const dialog = new DialogRepos(html, actor);
|
||||
dialog.render(true);
|
||||
}
|
||||
|
||||
constructor(html, actor) {
|
||||
let options = { classes: ["DialogCreateSigneDraconiqueActorsActors"], width: 400, height: 'fit-content', 'z-index': 99999 };
|
||||
let conf = {
|
||||
title: "Se reposer",
|
||||
content: html,
|
||||
default: "repos",
|
||||
buttons: {
|
||||
"repos": { label: "Se reposer", callback: async it => { this.repos(); } }
|
||||
}
|
||||
};
|
||||
super(conf, options);
|
||||
this.actor = actor;
|
||||
}
|
||||
activateListeners(html) {
|
||||
super.activateListeners(html);
|
||||
this.html = html;
|
||||
}
|
||||
/* -------------------------------------------- */
|
||||
|
||||
async repos() {
|
||||
await this.html.find("[name='nb-heures']").change();
|
||||
await this.html.find("[name='nb-jours']").change();
|
||||
const selection = await this.html.find("[name='repos']:checked").val();
|
||||
const nbHeures = Number.parseInt(await this.html.find("[name='nb-heures']").val());
|
||||
const nbJours = Number.parseInt(await this.html.find("[name='nb-jours']").val());
|
||||
console.log("ACTOR", this.actor)
|
||||
switch (selection) {
|
||||
case "sieste": {
|
||||
await this.actor.dormir(nbHeures);
|
||||
return;
|
||||
}
|
||||
case "nuit": {
|
||||
let heuresDormies = await this.actor.dormir(nbHeures);
|
||||
if (heuresDormies == nbHeures) {
|
||||
await this.actor.dormirChateauDormant();
|
||||
}
|
||||
return;
|
||||
}
|
||||
case "chateau-dormant":
|
||||
await this.actor.dormirChateauDormant();
|
||||
return;
|
||||
case "gris-reve": {
|
||||
await this.actor.grisReve(nbJours);
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -190,15 +190,6 @@ export class RdDItemCompetence extends Item {
|
||||
}
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
static isVisible(item) {
|
||||
return Number(item.system.niveau) != RdDItemCompetence.getNiveauBase(item.system.categorie);
|
||||
}
|
||||
|
||||
static nomContientTexte(item, texte) {
|
||||
return Grammar.toLowerCaseNoAccent(item.name).includes(Grammar.toLowerCaseNoAccent(texte))
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
static isNiveauBase(item) {
|
||||
return Number(item.system.niveau) == RdDItemCompetence.getNiveauBase(item.system.categorie);
|
||||
@ -279,7 +270,7 @@ export class RdDItemCompetence extends Item {
|
||||
|
||||
/* -------------------------------------------- */
|
||||
static triVisible(competences) {
|
||||
return competences.filter(it => it.system.isVisible)
|
||||
return competences.filter(it => !it.system.isHidden)
|
||||
.sort((a, b) => RdDItemCompetence.compare(a, b))
|
||||
}
|
||||
|
||||
|
@ -62,6 +62,13 @@ export class Monnaie {
|
||||
return deniers;
|
||||
}
|
||||
|
||||
static toSolsDeniers(fortune) {
|
||||
return {
|
||||
sols: Math.floor(fortune),
|
||||
deniers: Math.round(100 * (fortune - Math.floor(fortune)))
|
||||
};
|
||||
}
|
||||
|
||||
static getFortune(monnaies) {
|
||||
return (monnaies??[])
|
||||
.map(m => Number(m.system.cout) * Number(m.system.quantite))
|
||||
|
@ -86,22 +86,17 @@ export class RdDItemSheet extends ItemSheet {
|
||||
/* -------------------------------------------- */
|
||||
async getData() {
|
||||
let formData = {
|
||||
id: this.item.id,
|
||||
title: this.item.name,
|
||||
id: this.item.id,
|
||||
type: this.item.type,
|
||||
img: this.item.img,
|
||||
name: this.item.name,
|
||||
system: this.item.system,
|
||||
isGM: game.user.isGM,
|
||||
actorId: this.actor?.id,
|
||||
isOwned: this.actor ? true : false,
|
||||
owner: this.item.isOwner,
|
||||
editable: this.isEditable,
|
||||
cssClass: this.isEditable ? "editable" : "locked",
|
||||
isSoins: false,
|
||||
description: await TextEditor.enrichHTML(this.item.system.description, { async: true }),
|
||||
descriptionmj: await TextEditor.enrichHTML(this.item.system.descriptionmj, { async: true }),
|
||||
isComestible: this.item.getUtilisationCuisine()
|
||||
isComestible: this.item.getUtilisationCuisine(),
|
||||
options: RdDSheetUtility.mergeDocumentRights(this.options, this.item, this.isEditable)
|
||||
}
|
||||
|
||||
const competences = await SystemCompendiums.getCompetences(this.actor?.type);
|
||||
@ -138,12 +133,12 @@ export class RdDItemSheet extends ItemSheet {
|
||||
if (this.item.type == 'potion') {
|
||||
await RdDHerbes.addPotionFormData(formData);
|
||||
}
|
||||
if (formData.isOwned && this.item.type == 'herbe' && (formData.system.categorie == 'Soin' || formData.system.categorie == 'Repos')) {
|
||||
if (formData.options.isOwned && this.item.type == 'herbe' && (formData.system.categorie == 'Soin' || formData.system.categorie == 'Repos')) {
|
||||
formData.isIngredientPotionBase = true;
|
||||
}
|
||||
if (this.item.type == 'sortreserve') {
|
||||
const sortId = this.item.system.sortid;
|
||||
formData.sort = formData.isOwned ? this.item.actor.items.get(sortId) : game.items.get(sortId);
|
||||
formData.sort = formData.options.isOwned ? this.item.actor.items.get(sortId) : game.items.get(sortId);
|
||||
}
|
||||
formData.bonusCaseList = RdDItemSort.getBonusCaseList(formData, true);
|
||||
|
||||
@ -156,7 +151,9 @@ export class RdDItemSheet extends ItemSheet {
|
||||
super.activateListeners(html);
|
||||
this.html = html;
|
||||
|
||||
HtmlUtility.showControlWhen(this.html.find(".item-cout"), ReglesOptionelles.isUsing('afficher-prix-joueurs') || game.user.isGM || !this.item.isOwned);
|
||||
HtmlUtility.showControlWhen(this.html.find(".item-cout"), ReglesOptionelles.isUsing('afficher-prix-joueurs')
|
||||
|| game.user.isGM
|
||||
|| !this.item.isOwned);
|
||||
HtmlUtility.showControlWhen(this.html.find(".item-magique"), this.item.isMagique());
|
||||
|
||||
// Everything below here is only needed if the sheet is editable
|
||||
|
@ -304,6 +304,13 @@ export class RdDItem extends Item {
|
||||
return this.parent?.type == 'commerce';
|
||||
}
|
||||
|
||||
isNomLike(texte) {
|
||||
return Grammar.includesLowerCaseNoAccent(this.name, texte)
|
||||
}
|
||||
isNomTypeLike(texte) {
|
||||
return this.isNomLike(texte) || Grammar.includesLowerCaseNoAccent(Misc.typeName(this.type, 'Item'), texte)
|
||||
}
|
||||
|
||||
getQuantite() {
|
||||
return this.isService() ? undefined : Math.round(this.system.quantite ?? 0)
|
||||
}
|
||||
|
@ -1,4 +1,4 @@
|
||||
import { EffetsRencontre } from "../effets-rencontres.js";
|
||||
import { EffetsRencontre } from "../tmr/effets-rencontres.js";
|
||||
import { RdDItem } from "../item.js";
|
||||
|
||||
const tableEffets = [
|
||||
|
@ -29,7 +29,6 @@ export class RdDConteneurItemSheet extends RdDItemInventaireSheet {
|
||||
/* -------------------------------------------- */
|
||||
prepareConteneurData(formData) {
|
||||
RdDBaseActorSheet.filterItemsPerTypeForSheet(formData, this.actor.itemTypes);
|
||||
|
||||
this.objetVersConteneur = RdDUtility.buildArbreDeConteneurs(formData.conteneurs, formData.objets);
|
||||
formData.subItems = formData.conteneurs.find(it => it._id == this.item.id)?.subItems;
|
||||
}
|
||||
@ -44,7 +43,8 @@ export class RdDConteneurItemSheet extends RdDItemInventaireSheet {
|
||||
const dragData = {
|
||||
actorId: this.actor.id,
|
||||
type: "Item",
|
||||
data: item.system
|
||||
data: item.system,
|
||||
uuid: item.uuid
|
||||
};
|
||||
|
||||
event.dataTransfer.setData("text/plain", JSON.stringify(dragData));
|
||||
@ -52,7 +52,8 @@ export class RdDConteneurItemSheet extends RdDItemInventaireSheet {
|
||||
|
||||
async _onDropItem(event, dragData) {
|
||||
if (this.actor) {
|
||||
const dropParams = await RdDSheetUtility.prepareItemDropParameters(this.item.id, this.actor, dragData, this.objetVersConteneur);
|
||||
const destItemId = this.html.find(event.target)?.closest('.item').attr('data-item-id') ?? this.item.id
|
||||
const dropParams = await RdDSheetUtility.prepareItemDropParameters(destItemId, this.actor, dragData, this.objetVersConteneur);
|
||||
await this.actor.processDropItem(dropParams);
|
||||
await this.render(true);
|
||||
}
|
||||
|
@ -6,7 +6,7 @@ export class RdDServiceItemSheet extends RdDItemSheet {
|
||||
|
||||
async getData() {
|
||||
const formData = await super.getData();
|
||||
formData.disabled = formData.isGM || formData.isOwned ? '' : 'disabled';
|
||||
formData.disabled = formData.options.isGM || formData.options.isOwned ? '' : 'disabled';
|
||||
return formData;
|
||||
}
|
||||
|
||||
|
@ -8,13 +8,11 @@ export class RdDAlchimie {
|
||||
|
||||
/* -------------------------------------------- */
|
||||
static processManipulation(recette, actorId = undefined) {
|
||||
//console.log("CALLED", recette, recette.isOwned, actorId );
|
||||
let manip = recette.system.manipulation;
|
||||
let matchArray = manip.match(matchOperations);
|
||||
if (matchArray) {
|
||||
for (let matchStr of matchArray) {
|
||||
let result = matchStr.match(matchOperationTerms);
|
||||
//console.log("RESULT ", result);
|
||||
if (result[1] && result[2]) {
|
||||
let commande = Misc.upperFirst(result[1]);
|
||||
let replacement = this[`_alchimie${commande}`](recette, result[2], actorId);
|
||||
@ -27,20 +25,19 @@ export class RdDAlchimie {
|
||||
|
||||
/* -------------------------------------------- */
|
||||
static _alchimieCouleur(recette, couleurs, actorId) {
|
||||
if (actorId) {
|
||||
return `<span class="alchimie-tache"><a data-recette-id="${recette._id}" data-actor-id="${actorId}" data-alchimie-tache="couleur" data-alchimie-data="${couleurs}">couleur ${couleurs}</a></span>`;
|
||||
} else {
|
||||
return `<span class="alchimie-tache">couleur ${couleurs} </span>`;
|
||||
}
|
||||
return RdDAlchimie._alchimieLink(recette, couleurs, actorId, 'couleur', 'Température');
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
static _alchimieConsistance(recette, consistances, actorId) {
|
||||
if (actorId) {
|
||||
return `<span class="alchimie-tache"><a data-recette-id="${recette._id}" data-actor-id="${actorId}" data-alchimie-tache="consistance" data-alchimie-data="${consistances}">consistance ${consistances}</a></span>`;
|
||||
} else {
|
||||
return `<span class="alchimie-tache">consistance ${consistances} </span>`;
|
||||
}
|
||||
return RdDAlchimie._alchimieLink(recette, consistances, actorId, 'consistance', 'Consistance');
|
||||
}
|
||||
|
||||
static _alchimieLink(recette, termes, actorId, tacheAlchimie, labelTache) {
|
||||
const difficulte = RdDAlchimie.getDifficulte(termes);
|
||||
const link = actorId ? ` <a data-recette-id="${recette._id}" data-actor-id="${actorId}" data-alchimie-tache="${tacheAlchimie}" data-alchimie-data="${termes}">` : '';
|
||||
const endLink = actorId ? '</a>' : '';
|
||||
return `<span class="alchimie-tache">${link}${labelTache} ${termes} (${difficulte})${endLink}</span>`;
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
|
@ -7,6 +7,8 @@ import { Misc } from "./misc.js";
|
||||
import { HIDE_DICE, SHOW_DICE, SYSTEM_RDD, SYSTEM_SOCKET_ID } from "./constants.js";
|
||||
import { DialogChronologie } from "./dialog-chronologie.js";
|
||||
import { RdDTimestamp, WORLD_TIMESTAMP_SETTING } from "./rdd-timestamp.js";
|
||||
import { DialogChateauDormant } from "./sommeil/dialog-chateau-dormant.js";
|
||||
import { ReglesOptionelles } from "./settings/regles-optionelles.js";
|
||||
|
||||
const RDD_JOUR_PAR_MOIS = 28;
|
||||
const RDD_HEURES_PAR_JOUR = 12;
|
||||
@ -67,17 +69,17 @@ export class RdDCalendrier extends Application {
|
||||
|
||||
this.html.find('.calendar-btn').click(ev => this.onCalendarButton(ev));
|
||||
|
||||
this.html.find('.calendar-btn-edit').click(ev => {
|
||||
this.html.find('.calendar-set-datetime').click(ev => {
|
||||
ev.preventDefault();
|
||||
this.showCalendarEditor();
|
||||
});
|
||||
|
||||
this.html.find('.astrologie-btn-edit').click(ev => {
|
||||
this.html.find('.calendar-astrologie').click(ev => {
|
||||
ev.preventDefault();
|
||||
this.showAstrologieEditor();
|
||||
});
|
||||
|
||||
this.html.find('#calendar-move-handle').mousedown(ev => {
|
||||
this.html.find('.calendar-title').mousedown(ev => {
|
||||
ev.preventDefault();
|
||||
ev = ev || window.event;
|
||||
let isRightMB = false;
|
||||
@ -168,8 +170,11 @@ export class RdDCalendrier extends Application {
|
||||
/* -------------------------------------------- */
|
||||
getCurrentMinute() { return this.timestamp.indexMinute; }
|
||||
|
||||
getTimestamp() {
|
||||
return this.timestamp;
|
||||
}
|
||||
getTimestampFinChateauDormant(nbJours = 0) {
|
||||
return this.timestamp.nouveauJour().addJour(nbJours);
|
||||
return this.timestamp.nouveauJour().addJours(nbJours);
|
||||
}
|
||||
|
||||
getTimestampFinHeure(nbHeures = 0) {
|
||||
@ -257,8 +262,12 @@ export class RdDCalendrier extends Application {
|
||||
|
||||
/* -------------------------------------------- */
|
||||
async setNewTimestamp(newTimestamp) {
|
||||
game.actors.forEach(actor => actor.onTimeChanging(this.timestamp, newTimestamp));
|
||||
const oldTimestamp = this.timestamp;
|
||||
await Promise.all(game.actors.map(async actor => await actor.onTimeChanging(oldTimestamp, newTimestamp)));
|
||||
RdDTimestamp.setWorldTime(newTimestamp);
|
||||
if (oldTimestamp.indexDate + 1 == newTimestamp.indexDate && ReglesOptionelles.isUsing("chateau-dormant-gardien")) {
|
||||
await DialogChateauDormant.create();
|
||||
}
|
||||
this.timestamp = newTimestamp;
|
||||
await this.rebuildListeNombreAstral();
|
||||
this.updateDisplay();
|
||||
@ -292,10 +301,8 @@ export class RdDCalendrier extends Application {
|
||||
async positionnerHeure(heure) {
|
||||
const indexDate = this.timestamp.indexDate;
|
||||
const addDay = this.timestamp.heure < heure ? 0 : 1;
|
||||
await this.setNewTimestamp(new RdDTimestamp({
|
||||
indexDate: indexDate + addDay, indexHeure: 0
|
||||
})
|
||||
.addHeures(heure))
|
||||
const newTimestamp = new RdDTimestamp({ indexDate: indexDate + addDay}).addHeures(heure);
|
||||
await this.setNewTimestamp(newTimestamp)
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
@ -428,13 +435,13 @@ export class RdDCalendrier extends Application {
|
||||
if (game.user.isGM) {
|
||||
dateHTML = dateHTML + "<br>Nombre Astral: " + (this.getNombreAstral() ?? "?");
|
||||
}
|
||||
for (let handle of document.getElementsByClassName("calendar-date-rdd")) {
|
||||
for (let handle of document.getElementsByClassName("calendar-title")) {
|
||||
handle.innerHTML = dateHTML;
|
||||
}
|
||||
for (let heure of document.getElementsByClassName("calendar-heure-texte")) {
|
||||
heure.innerHTML = calendrier.heure.label;
|
||||
}
|
||||
for (const minute of document.getElementsByClassName("calendar-time-disp")) {
|
||||
for (const minute of document.getElementsByClassName("calendar-minute-texte")) {
|
||||
minute.innerHTML = `${calendrier.minute} minutes`;
|
||||
}
|
||||
for (const heureImg of document.getElementsByClassName("calendar-heure-img")) {
|
||||
|
@ -2,7 +2,8 @@
|
||||
|
||||
import { DialogChronologie } from "./dialog-chronologie.js";
|
||||
import { DialogCreateSigneDraconique } from "./dialog-create-signedraconique.js";
|
||||
import { DialogStress } from "./dialog-stress.js";
|
||||
import { DialogChateauDormant } from "./sommeil/dialog-chateau-dormant.js";
|
||||
import { DialogStress } from "./sommeil/dialog-stress.js";
|
||||
import { RdDItemCompetence } from "./item-competence.js";
|
||||
import { Misc } from "./misc.js";
|
||||
import { RdDCarac } from "./rdd-carac.js";
|
||||
@ -13,7 +14,6 @@ import { RdDResolutionTable } from "./rdd-resolution-table.js";
|
||||
import { RdDRollResolutionTable } from "./rdd-roll-resolution-table.js";
|
||||
import { RdDRollTables } from "./rdd-rolltables.js";
|
||||
import { RdDUtility } from "./rdd-utility.js";
|
||||
import { CompendiumTableHelpers } from "./settings/system-compendiums.js";
|
||||
import { FenetreRechercheTirage } from "./tirage/fenetre-recherche-tirage.js";
|
||||
import { TMRUtility } from "./tmr-utility.js";
|
||||
|
||||
@ -77,6 +77,7 @@ export class RdDCommands {
|
||||
this.registerCommand({ path: ["/tirer", "rencontre"], func: (content, msg, params) => this.getRencontreTMR(params), descr: `Détermine une rencontre dans les TMR (synonyme de "/tmrr")` });
|
||||
this.registerCommand({ path: ["/tirage"], func: (content, msg, params) => this.tirage(), descr: "Ouvre la fenêtre de recherche et tirage" });
|
||||
|
||||
this.registerCommand({ path: ["/sommeil"], func: (content, msg, params) => this.sommeil(msg, params), descr: "Prépare le passage de journée pour chateau dormant" });
|
||||
this.registerCommand({ path: ["/meteo"], func: (content, msg, params) => this.getMeteo(msg, params), descr: "Propose une météo marine" });
|
||||
this.registerCommand({ path: ["/nom"], func: (content, msg, params) => RdDNameGen.getName(msg, params), descr: "Génère un nom aléatoire" });
|
||||
|
||||
@ -462,13 +463,14 @@ export class RdDCommands {
|
||||
let name = params[params.length - 1];
|
||||
if (name == undefined) {
|
||||
for (let actor of game.actors) {
|
||||
actor.distribuerStress('stress', stress, motif);
|
||||
// TODO: ne plus stresser les entités de cauchemar!
|
||||
await actor.distribuerStress('stress', stress, motif);
|
||||
}
|
||||
} else {
|
||||
//console.log(stressValue, nomJoueur);
|
||||
let actor = Misc.findActor(name, game.actors.filter(it => it.hasPlayerOwner)) ?? Misc.findPlayer(name)?.character
|
||||
if (actor) {
|
||||
actor.distribuerStress('stress', stress, motif);
|
||||
await actor.distribuerStress('stress', stress, motif);
|
||||
}
|
||||
else {
|
||||
ui.notifications.warn(`Pas de personnage ou de joueur correspondant à ${name}!`);
|
||||
@ -485,5 +487,8 @@ export class RdDCommands {
|
||||
async tirage() {
|
||||
FenetreRechercheTirage.create();
|
||||
}
|
||||
async sommeil() {
|
||||
DialogChateauDormant.create();
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1,9 +1,24 @@
|
||||
import { DialogSplitItem } from "./dialog-split-item.js";
|
||||
import { RdDItem } from "./item.js";
|
||||
import { SystemCompendiums } from "./settings/system-compendiums.js";
|
||||
|
||||
export class RdDSheetUtility {
|
||||
|
||||
static mergeDocumentRights(options, document, editable) {
|
||||
const userRightLevel = game.user.isGM
|
||||
? CONST.DOCUMENT_OWNERSHIP_LEVELS.OWNER
|
||||
: document.getUserLevel(game.user);
|
||||
mergeObject(options, {
|
||||
isGM: game.user.isGM,
|
||||
isOwned: document.parent,
|
||||
editable: editable,
|
||||
cssClass: editable ? "editable" : "locked",
|
||||
isLimited: userRightLevel >= CONST.DOCUMENT_OWNERSHIP_LEVELS.LIMITED,
|
||||
isObserver: userRightLevel >= CONST.DOCUMENT_OWNERSHIP_LEVELS.OBSERVER,
|
||||
isOwner: userRightLevel >= CONST.DOCUMENT_OWNERSHIP_LEVELS.OWNER
|
||||
});
|
||||
return options;
|
||||
}
|
||||
|
||||
static getItem(event, actor) {
|
||||
return actor.items.get(RdDSheetUtility.getItemId(event))
|
||||
}
|
||||
@ -23,7 +38,7 @@ export class RdDSheetUtility {
|
||||
|
||||
static async prepareItemDropParameters(destItemId, actor, dragData, objetVersConteneur) {
|
||||
let item = fromUuidSync(dragData.uuid);
|
||||
if (item.pack && !item.system){
|
||||
if (item.pack && !item.system) {
|
||||
item = await RdDItem.getCorrespondingItem(item);
|
||||
}
|
||||
if (actor.canReceive(item)) {
|
||||
|
@ -202,7 +202,7 @@ export class RdDUtility {
|
||||
'systems/foundryvtt-reve-de-dragon/templates/enum-periode.html',
|
||||
'systems/foundryvtt-reve-de-dragon/templates/enum-tmr-effet.html',
|
||||
// Partials
|
||||
'systems/foundryvtt-reve-de-dragon/templates/tirage/liste-resultats.hbs',
|
||||
'systems/foundryvtt-reve-de-dragon/templates/tirage/liste-resultats-recherche.hbs',
|
||||
'systems/foundryvtt-reve-de-dragon/templates/common/timestamp.hbs',
|
||||
'systems/foundryvtt-reve-de-dragon/templates/common/periodicite.hbs',
|
||||
'systems/foundryvtt-reve-de-dragon/templates/common/enum-duree.hbs',
|
||||
@ -235,6 +235,7 @@ export class RdDUtility {
|
||||
'systems/foundryvtt-reve-de-dragon/templates/dialog-tmr.html',
|
||||
'systems/foundryvtt-reve-de-dragon/templates/dialog-roll-alchimie.html',
|
||||
'systems/foundryvtt-reve-de-dragon/templates/dialog-astrologie-joueur.html',
|
||||
'systems/foundryvtt-reve-de-dragon/templates/sommeil/sommeil-actor-moral.hbs',
|
||||
// Calendrier
|
||||
'systems/foundryvtt-reve-de-dragon/templates/calendar-template.html',
|
||||
'systems/foundryvtt-reve-de-dragon/templates/calendar-editor-template.html',
|
||||
@ -278,8 +279,9 @@ export class RdDUtility {
|
||||
Handlebars.registerHelper('apostrophe', (article, str) => Grammar.apostrophe(article, str));
|
||||
Handlebars.registerHelper('un', str => Grammar.articleIndetermine(str));
|
||||
Handlebars.registerHelper('accord', (genre, ...args) => Grammar.accord(genre, args));
|
||||
Handlebars.registerHelper('buildConteneur', (objet, templateItem, options) => { return new Handlebars.SafeString(RdDUtility.buildConteneur(objet, 1, templateItem, options)); });
|
||||
Handlebars.registerHelper('buildContenu', (objet) => { return new Handlebars.SafeString(RdDUtility.buildContenu(objet, 1, true)); });
|
||||
Handlebars.registerHelper('buildLigneInventaire', (item, options) => { return new Handlebars.SafeString(RdDUtility.buildLigneInventaire(item, options)); });
|
||||
Handlebars.registerHelper('buildInventaireConteneur', (actorId, itemId, options) => { return new Handlebars.SafeString(RdDUtility.buildInventaireConteneur(actorId, itemId, options)); });
|
||||
Handlebars.registerHelper('buildContenuConteneur', (item, options) => { return new Handlebars.SafeString(RdDUtility.buildContenuConteneur(item, options)); });
|
||||
Handlebars.registerHelper('calculerPrixCommercant', item => item.calculerPrixCommercant());
|
||||
Handlebars.registerHelper('caseTmr-label', coord => TMRUtility.getTMRLabel(coord));
|
||||
Handlebars.registerHelper('caseTmr-type', coord => TMRUtility.getTMRType(coord));
|
||||
@ -394,38 +396,58 @@ export class RdDUtility {
|
||||
return conteneurs.filter((conteneur, index, arr) => !conteneur.estContenu);
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
/** Construit la structure récursive des conteneurs, avec imbrication potentielle
|
||||
*
|
||||
*/
|
||||
static buildConteneur(objet, profondeur, templateItem, options) {
|
||||
if (!profondeur) profondeur = 1;
|
||||
if (!templateItem) templateItem = 'actor/inventaire-item.html'
|
||||
objet.niveau = profondeur;
|
||||
|
||||
const isConteneur = objet.type == 'conteneur';
|
||||
const isOuvert = isConteneur && this.getAfficheContenu(objet._id);
|
||||
const isVide = isConteneur && objet.system.contenu.length == 0;
|
||||
const conteneur = Handlebars.partials[`systems/foundryvtt-reve-de-dragon/templates/${templateItem}`]({
|
||||
item: objet,
|
||||
vide: isVide,
|
||||
ouvert: isOuvert,
|
||||
options: options
|
||||
});
|
||||
const contenu = isConteneur ? RdDUtility.buildContenu(objet, profondeur, isOuvert, templateItem, options) : '';
|
||||
return conteneur + contenu;
|
||||
static prepareOptionsArbreInventaire(item, optionsArbre) {
|
||||
if (!optionsArbre.profondeur) {
|
||||
optionsArbre.profondeur = 1
|
||||
};
|
||||
if (!optionsArbre.templateItem) {
|
||||
optionsArbre.templateItem = item.parent?.type == 'commerce'
|
||||
? "systems/foundryvtt-reve-de-dragon/templates/actor/commerce-inventaire-item.html"
|
||||
: "systems/foundryvtt-reve-de-dragon/templates/actor/inventaire-item.html";
|
||||
}
|
||||
item.niveau = optionsArbre.profondeur;
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
static buildContenu(objet, profondeur, afficherContenu, templateItem, options) {
|
||||
if (!profondeur) profondeur = 1;
|
||||
if (!templateItem) templateItem = 'actor/inventaire-item.html'
|
||||
objet.niveau = profondeur;
|
||||
|
||||
const display = afficherContenu ? 'item-display-show' : 'item-display-hide';
|
||||
let strContenu = `<ul class='item-list alterne-list ${display} list-item-margin${Math.min(profondeur, 6)}'>`;
|
||||
for (let subItem of objet.subItems) {
|
||||
strContenu += this.buildConteneur(subItem, profondeur + 1, templateItem, options);
|
||||
/**
|
||||
* Construit la structure récursive des conteneurs, avec imbrication potentielle
|
||||
*/
|
||||
static buildLigneInventaire(item, options = {}, optionsArbre = { ouvert: false, profondeur: 1 }) {
|
||||
RdDUtility.prepareOptionsArbreInventaire(item, optionsArbre);
|
||||
|
||||
const isConteneur = item.type == 'conteneur';
|
||||
const inventaire = {
|
||||
item: item,
|
||||
vide: isConteneur && item.system.contenu.length == 0,
|
||||
ouvert: isConteneur && RdDUtility.getAfficheContenu(item._id),
|
||||
options: options
|
||||
};
|
||||
optionsArbre.ouvert = inventaire.ouvert
|
||||
const ligneObjet = Handlebars.partials[optionsArbre.templateItem](inventaire);
|
||||
if (isConteneur) {
|
||||
return ligneObjet + RdDUtility.buildContenuConteneur(item, options, optionsArbre);
|
||||
}
|
||||
return ligneObjet;
|
||||
}
|
||||
|
||||
static buildInventaireConteneur(actorId, itemId, options) {
|
||||
const actor = game.actors.get(actorId)
|
||||
const item = actor?.items.get(itemId)
|
||||
if (item) {
|
||||
return RdDUtility.buildContenuConteneur(item, options, { ouvert: true, profondeur: 1 });
|
||||
}
|
||||
return '';
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
static buildContenuConteneur(conteneur, options = {}, optionsArbre = {}) {
|
||||
RdDUtility.prepareOptionsArbreInventaire(conteneur, optionsArbre);
|
||||
const display = optionsArbre.ouvert ? 'item-display-show' : 'item-display-hide';
|
||||
let strContenu = `<ul class='item-list alterne-list ${display} list-item-margin${Math.min(optionsArbre.profondeur, 6)}'>`;
|
||||
optionsArbre.profondeur++;
|
||||
for (let contenu of conteneur.subItems) {
|
||||
strContenu += this.buildLigneInventaire(contenu, options, optionsArbre);
|
||||
}
|
||||
return strContenu + "</ul>";
|
||||
}
|
||||
|
@ -17,6 +17,7 @@ const listeReglesOptionelles = [
|
||||
{ group: 'Règles générales', name: 'afficher-prix-joueurs', descr: "Afficher le prix de l'équipement des joueurs", uniquementJoueur: true},
|
||||
{ group: 'Règles générales', name: 'appliquer-fatigue', descr: "Appliquer les règles de fatigue"},
|
||||
{ group: 'Règles générales', name: 'afficher-colonnes-reussite', descr: "Afficher le nombre de colonnes de réussite ou d'échec", default: false },
|
||||
{ group: 'Règles générales', name: 'chateau-dormant-gardien', descr: "Saisie des heures de sommeil/jets de moral par le gardien des rêves", default: true },
|
||||
|
||||
{ group: 'Confirmations', name: 'confirmer-combat-sans-cible', descr: "Confirmer avant une attaque sans cible", scope: "client"},
|
||||
{ group: 'Confirmations', name: 'confirmation-tmr', descr: "Confirmer pour monter dans les TMR", scope: "client"},
|
||||
|
103
module/sommeil/dialog-chateau-dormant.js
Normal file
103
module/sommeil/dialog-chateau-dormant.js
Normal file
@ -0,0 +1,103 @@
|
||||
import { EffetsDraconiques } from "../tmr/effets-draconiques.js";
|
||||
|
||||
export class DialogChateauDormant extends Dialog {
|
||||
|
||||
static async create() {
|
||||
const date = game.system.rdd.calendrier.dateCourante();
|
||||
const actors = game.actors.filter(actor => actor.hasPlayerOwner && actor.isPersonnage());
|
||||
|
||||
const dialogData = {
|
||||
actors: actors,
|
||||
date: date,
|
||||
motifStress: `Nuit du ${date}`,
|
||||
finChateauDormant: game.system.rdd.calendrier.getTimestampFinChateauDormant()
|
||||
};
|
||||
const html = await renderTemplate("systems/foundryvtt-reve-de-dragon/templates/sommeil/dialog-chateau-dormant.hbs",
|
||||
dialogData);
|
||||
|
||||
new DialogChateauDormant(dialogData, html)
|
||||
.render(true);
|
||||
}
|
||||
|
||||
constructor(dialogData, html) {
|
||||
const options = {
|
||||
classes: ["rdd-dialog-chateau-dormant"],
|
||||
width: 600,
|
||||
height: 'fit-content',
|
||||
'z-index': 99999
|
||||
};
|
||||
const conf = {
|
||||
title: "De Chateau dormant à Vaisseau",
|
||||
content: html,
|
||||
buttons: {
|
||||
chateauDormant: { label: "Passer à Vaisseau!", callback: it => { this.onChateauDormant(); } }
|
||||
}
|
||||
};
|
||||
super(conf, options);
|
||||
this.dialogData = dialogData;
|
||||
}
|
||||
|
||||
activateListeners(html) {
|
||||
super.activateListeners(html);
|
||||
this.html = html;
|
||||
this.html.find('input.sommeil-insomnie').change(event => this.onInsomnie(event));
|
||||
this._activateListenerOnActorMoral(this.html);
|
||||
}
|
||||
|
||||
_activateListenerOnActorMoral(html) {
|
||||
html.find(`span.sommeil-actor-moral a`).click(event => this.onActorMoral(event));
|
||||
}
|
||||
|
||||
onInsomnie(event) {
|
||||
const sommeilInsomnie = this.html.find(event.currentTarget);
|
||||
const isInsomnie = sommeilInsomnie.is(':checked');
|
||||
const sommeilHeures = sommeilInsomnie.parents('.set-sommeil-actor').find('input.sommeil-heures');
|
||||
sommeilHeures.prop('disabled', isInsomnie);
|
||||
if (isInsomnie) {
|
||||
sommeilHeures.val('0');
|
||||
}
|
||||
}
|
||||
|
||||
async onActorMoral(event) {
|
||||
const selected = this.html.find(event.currentTarget);
|
||||
const actorRow = selected.parents('.set-sommeil-actor');
|
||||
const actorId = actorRow.data('actor-id');
|
||||
const actor = this.getActor(actorId);
|
||||
actor.system.sommeil.moral = selected.data('moral');
|
||||
const htmlMoral = await renderTemplate('systems/foundryvtt-reve-de-dragon/templates/sommeil/sommeil-actor-moral.hbs', actor.system.sommeil)
|
||||
actorRow.find('.sommeil-actor-moral').html(htmlMoral);
|
||||
// re-attach listeners for actor row
|
||||
this._activateListenerOnActorMoral(actorRow);
|
||||
}
|
||||
|
||||
getActor(actorId) {
|
||||
return this.dialogData.actors.find(it => it.id == actorId);
|
||||
}
|
||||
|
||||
async onChateauDormant() {
|
||||
const motifStress = this.html.find("form input[name='motifStress']").val();
|
||||
const consignesChateauDormant = jQuery.map(this.html.find('li.set-sommeil-actor'), it => {
|
||||
const actorRow = this.html.find(it);
|
||||
const actorId = actorRow.data('actor-id');
|
||||
const actor = this.getActor(actorId);
|
||||
const insomnie = actorRow.find('input.sommeil-insomnie').is(':checked');
|
||||
return {
|
||||
actor,
|
||||
ignorer: actorRow.find('input.sommeil-ignorer').is(':checked'),
|
||||
stress: {
|
||||
motif: motifStress,
|
||||
valeur: Number.parseInt(actorRow.find('input.sommeil-stress').val()),
|
||||
},
|
||||
sommeil: {
|
||||
nouveaujour: true,
|
||||
date: this.dialogData.finChateauDormant,
|
||||
insomnie: insomnie,
|
||||
heures: insomnie ? 0 : Number.parseInt(actorRow.find('input.sommeil-heures').val()),
|
||||
moral: actor.moral,
|
||||
}
|
||||
}
|
||||
});
|
||||
consignesChateauDormant.forEach(async consigne => await consigne.actor.prepareChateauDormant(consigne))
|
||||
}
|
||||
|
||||
}
|
84
module/sommeil/dialog-repos.js
Normal file
84
module/sommeil/dialog-repos.js
Normal file
@ -0,0 +1,84 @@
|
||||
import { ReglesOptionelles } from "../settings/regles-optionelles.js";
|
||||
import { EffetsDraconiques } from "../tmr/effets-draconiques.js";
|
||||
|
||||
export class DialogRepos extends Dialog {
|
||||
|
||||
static async create(actor) {
|
||||
if (!ReglesOptionelles.isUsing("chateau-dormant-gardien")) {
|
||||
actor.system.sommeil = {
|
||||
"nouveaujour": true,
|
||||
"insomnie": EffetsDraconiques.isSujetInsomnie(actor),
|
||||
"moral": "neutre",
|
||||
"heures": 4
|
||||
}
|
||||
}
|
||||
const html = await renderTemplate("systems/foundryvtt-reve-de-dragon/templates/sommeil/dialog-repos.html", actor);
|
||||
const dialog = new DialogRepos(html, actor);
|
||||
dialog.render(true);
|
||||
}
|
||||
|
||||
constructor(html, actor) {
|
||||
let options = { classes: ["DialogCreateSigneDraconiqueActorsActors"], width: 400, height: 'fit-content', 'z-index': 99999 };
|
||||
let conf = {
|
||||
title: "Se reposer",
|
||||
content: html,
|
||||
default: "repos",
|
||||
buttons: {
|
||||
"repos": { label: "Se reposer", callback: async it => { this.repos(); } }
|
||||
}
|
||||
};
|
||||
super(conf, options);
|
||||
this.actor = actor;
|
||||
}
|
||||
activateListeners(html) {
|
||||
super.activateListeners(html);
|
||||
this.html = html;
|
||||
this.html.find(`.sommeil-actor-moral a`).click(event => this.onActorMoral(event));
|
||||
}
|
||||
/* -------------------------------------------- */
|
||||
|
||||
async repos() {
|
||||
const selection = await this.html.find("[name='repos']:checked").val();
|
||||
switch (selection) {
|
||||
case "sieste": return await this.sieste();
|
||||
case "nuit": return await this.nuit();
|
||||
case "chateau-dormant": return await this.chateauDormant();
|
||||
case "gris-reve": return await this.grisReve();
|
||||
}
|
||||
}
|
||||
|
||||
async grisReve() {
|
||||
await this.html.find("[name='nb-jours']").change();
|
||||
const nbJours = Number.parseInt(await this.html.find("[name='nb-jours']").val());
|
||||
await this.actor.grisReve(nbJours);
|
||||
}
|
||||
|
||||
async chateauDormant() {
|
||||
await this.actor.dormirChateauDormant();
|
||||
}
|
||||
|
||||
async nuit() {
|
||||
await this.html.find("[name='sommeil.heures']").change();
|
||||
const val = await this.html.find("[name='sommeil.heures']").val();
|
||||
const sommeilHeures = Number.parseInt(val ?? '0');
|
||||
await this.actor.dormir(sommeilHeures, { chateauDormant: true });
|
||||
}
|
||||
|
||||
async sieste() {
|
||||
await this.html.find("[name='sieste.heures']").change();
|
||||
const siesteHeures = Number.parseInt(await this.html.find("[name='sieste.heures']").val());
|
||||
await this.actor.dormir(siesteHeures);
|
||||
}
|
||||
|
||||
async onActorMoral(event) {
|
||||
const selected = this.html.find(event.currentTarget);
|
||||
const parentDiv = selected.parents().find('.sommeil-actor-moral');
|
||||
const situationMoral = selected.data('moral');
|
||||
await this.actor.setInfoSommeilMoral(situationMoral);
|
||||
const htmlMoral = await renderTemplate('systems/foundryvtt-reve-de-dragon/templates/sommeil/sommeil-actor-moral.hbs', {
|
||||
moral: situationMoral
|
||||
});
|
||||
parentDiv.html(htmlMoral);
|
||||
this.html.find(`.sommeil-actor-moral a`).click(event => this.onActorMoral(event));
|
||||
}
|
||||
}
|
@ -15,7 +15,7 @@ export class DialogStress extends Dialog {
|
||||
)
|
||||
};
|
||||
|
||||
const html = await renderTemplate("systems/foundryvtt-reve-de-dragon/templates/dialog-stress.html", dialogData);
|
||||
const html = await renderTemplate("systems/foundryvtt-reve-de-dragon/templates/sommeil/dialog-stress.html", dialogData);
|
||||
new DialogStress(dialogData, html)
|
||||
.render(true);
|
||||
}
|
||||
@ -50,7 +50,7 @@ export class DialogStress extends Dialog {
|
||||
|
||||
this.dialogData.actors.filter(it => it.selected)
|
||||
.map(it => game.actors.get(it.id))
|
||||
.forEach(actor => actor.distribuerStress(compteur, stress, motif));
|
||||
.forEach(async actor => await actor.distribuerStress(compteur, stress, motif));
|
||||
}
|
||||
|
||||
async onSelectActor(event) {
|
@ -3,6 +3,7 @@ import { HtmlUtility } from '../html-utility.js';
|
||||
import { Misc } from "../misc.js";
|
||||
import { CompendiumTableHelpers } from '../settings/system-compendiums.js';
|
||||
import { RdDRaretes } from '../item/raretes.js';
|
||||
import { Grammar } from '../grammar.js';
|
||||
|
||||
const FILTER_GROUPS = [
|
||||
{ group: 'type', label: "Type d'objet" },
|
||||
@ -200,14 +201,14 @@ export class FenetreRechercheTirage extends Application {
|
||||
|
||||
supprimerFiltres() {
|
||||
this.html.find('input:is(.activate-filter-group,.activate-filter-milieu)').prop("checked", false);
|
||||
this.html.find('div.liste-resultats').html('');
|
||||
this.changeListeFiltresActifs();
|
||||
this.html.find('div.liste-resultats-recherche').html('');
|
||||
this.html.find('.section-filters-text input.recherche').val('');
|
||||
}
|
||||
|
||||
async recherche() {
|
||||
const table = await this.buildTable();
|
||||
const htmlResultats = await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/tirage/liste-resultats.hbs`, { resultats: table });
|
||||
this.html.find('div.liste-resultats').html(htmlResultats);
|
||||
const htmlResultats = await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/tirage/liste-resultats-recherche.hbs`, { resultats: table });
|
||||
this.html.find('div.liste-resultats-recherche').html(htmlResultats);
|
||||
this._dragDrop.forEach(dragDropHandler => dragDropHandler.bind(this.element[0]))
|
||||
}
|
||||
|
||||
@ -225,13 +226,19 @@ export class FenetreRechercheTirage extends Application {
|
||||
}
|
||||
return (it, mi) => true;
|
||||
}
|
||||
buildFilterRechercheName() {
|
||||
const recherche = this.html.find('.section-filters-text input.recherche').val();
|
||||
if (recherche) {
|
||||
return (it, mi) => Grammar.includesLowerCaseNoAccent(it.name, recherche);
|
||||
}
|
||||
return (it, mi) => true;
|
||||
}
|
||||
|
||||
buildCheckedGroupFilter(milieux) {
|
||||
const filtersList = this.getGroupCheckedFilters()
|
||||
.map(gf => this.buildOrFilter(gf.filters.map(f => f.check)));
|
||||
if (milieux) {
|
||||
filtersList.push(this.buildMilieuxFilter(milieux));
|
||||
}
|
||||
filtersList.push(this.buildMilieuxFilter(milieux));
|
||||
filtersList.push(this.buildFilterRechercheName());
|
||||
return this.buildAndFilter(filtersList)
|
||||
}
|
||||
|
||||
|
@ -164,6 +164,10 @@ export class EffetsDraconiques {
|
||||
return actor.items.find(it => EffetsDraconiques.urgenceDraconique.match(it));
|
||||
}
|
||||
|
||||
static isSujetInsomnie(actor) {
|
||||
return actor.items.find(it => ['queue', 'ombre'].includes(it.type) && Grammar.includesLowerCaseNoAccent(it.name, 'Insomnie')) ? true : false;
|
||||
}
|
||||
|
||||
static isPeage(actor) {
|
||||
return EffetsDraconiques.filterItems(actor, Draconique.isSouffleDragon, 'péage').length > 0;
|
||||
}
|
||||
|
@ -1,7 +1,7 @@
|
||||
import { ChatUtility } from "./chat-utility.js";
|
||||
import { Poetique } from "./poetique.js";
|
||||
import { RdDDice } from "./rdd-dice.js";
|
||||
import { TMRUtility } from "./tmr-utility.js";
|
||||
import { ChatUtility } from "../chat-utility.js";
|
||||
import { Poetique } from "../poetique.js";
|
||||
import { RdDDice } from "../rdd-dice.js";
|
||||
import { TMRUtility } from "../tmr-utility.js";
|
||||
|
||||
export class EffetsRencontre {
|
||||
|
||||
@ -87,7 +87,7 @@ export class EffetsRencontre {
|
||||
await EffetsRencontre.$reinsertion(dialog, context.actor, it => true);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static deplacement_aleatoire = async (dialog, context) => {
|
||||
const oldCoord = context.actor.system.reve.tmrpos.coord;
|
||||
const newTmr = await TMRUtility.deplaceTMRAleatoire(context.actor, oldCoord);
|
||||
@ -113,13 +113,13 @@ export class EffetsRencontre {
|
||||
if (context.rolled.isETotal) {
|
||||
context.queues.push(await context.actor.ajouterQueue());
|
||||
}
|
||||
|
||||
|
||||
ChatMessage.create({
|
||||
whisper: ChatUtility.getWhisperRecipientsAndGMs(this.name),
|
||||
content: await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/chat-resultat-reve-de-dragon.html`, context)
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
static experience_particuliere = async (dialog, context) => {
|
||||
await context.actor.appliquerAjoutExperience(context)
|
||||
}
|
@ -20,6 +20,7 @@
|
||||
{"name":"Genèfle","type":"maladie","flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.maladies-et-poisons.jl0MvAcVRo63LWg3"}},"img":"systems/foundryvtt-reve-de-dragon/icons/maladies_venins/champifruit.webp","effects":[],"_id":"jl0MvAcVRo63LWg3","system":{"description":"<p>Intoxication suite à l'ingestion d'un fruit vénéneux.</p>","descriptionmj":"","temporel":{"debut":{"indexDate":0,"indexMinute":0},"fin":{"indexDate":0,"indexMinute":0}},"identifie":false,"malignite":1,"periodicite":"10 minutes","incubation":"","periode":{"unite":"minute","nombre":10},"remedesconnus":false,"remedes":"-3/ Teinture d’Érozonne +16, Topazoïne +12","dommages":"1 pt de Vie"},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"folder":null,"sort":0,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.4.9","coreVersion":"10.291","createdTime":1671050299820,"modifiedTime":1673135772493,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||
{"name":"Venin de vipère jaune","type":"maladie","flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.maladies-et-poisons.lUeNPc0ECKqHglbG"}},"img":"systems/foundryvtt-reve-de-dragon/icons/maladies_venins/venin.webp","effects":[],"_id":"lUeNPc0ECKqHglbG","system":{"description":"<p>Venin de la vipère jaune. Il provoque des spasmes musculaires.</p>","descriptionmj":"","temporel":{"debut":{"indexDate":0,"indexMinute":0},"fin":{"indexDate":0,"indexMinute":0}},"identifie":false,"malignite":2,"periodicite":"6 rounds","incubation":"","periode":{"unite":"round","nombre":6},"remedesconnus":false,"remedes":"-3\\ Liqueur de Bagdol +14, Topazoïne +10","dommages":"1 pt de Vie"},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"folder":null,"sort":0,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.4.9","coreVersion":"10.291","createdTime":1671050299820,"modifiedTime":1673135772494,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||
{"name":"Fièvre brune","type":"maladie","flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.maladies-et-poisons.nyruCPiWDd8Scv44"}},"img":"systems/foundryvtt-reve-de-dragon/icons/maladies_venins/maladie.webp","effects":[],"_id":"nyruCPiWDd8Scv44","system":{"description":"<p>La fièvre brune est une fièvre mortelle véhiculée par les moustiques de certains marais. Outre un affaiblissement général, elle provoque la cécité.</p>\n<p>Ses symptômes progressifs consistent en hallucinations de taches brunes, puis en saignement des yeux, jusqu’à la cécité complète qui précède la mort.</p>\n<p>La première période indiquée est celle de l’incubation, la seconde est la périodicité normale. Tant que le malade n’a subi aucun dommage, utiliser la période d’incubation (1 heure) ; puis dès qu’il a perdu un premier point de vie, utiliser la périodicité normale (6 heures).</p>\n<p>Les points de VUE perdus ne peuvent être regagnés que quand la maladie est entièrement guérie. À chaque point de vie regagné, jouer un jet de CONSTITUTION ajusté négativement par les points de vie toujours manquants. Puis selon le résultat:</p>\n<ul>\n<li><strong><em>Particulière </em></strong>Regain de 2 points de VUE</li>\n<li><strong><em>Normale et significative</em></strong> Regain de 1 point de VUE</li>\n<li><strong><em>Échec et Échec particulier</em></strong> Aucun regain</li>\n<li><strong><em>Échec total</em> </strong>Aggravation, re-perte d’un point de VUE</li>\n</ul>\n<p>Si tous les points de vie ont été regagnés et qu’il manque toujours un ou plusieurs points de VUE, jouer un jet de CONSTITUTION à zéro toutes les 12 heures, et appliquer les mêmes résultats que ci-dessus.</p>\n<p>Une potion d’herbes de soin enchantée peut faire regagner tous les points de vie une fois la maladie guérie, mais ne fait pas regagner les points de VUE perdus. Si le malade est devenu entièrement aveugle au cours de sa maladie, c’est-à-dire si sa VUE est tombée à zéro, il perd définitivement un point de VUE. Quand il regagnera ses points de VUE, il les regagnera tous moins un.</p>\n<h2>Bains de solimonce</h2>\n<p>Une décoction de feuilles de solimonce (voir Herbes, p336) utilisée en bains d’yeux donne un bonus de +4 au jet de CONSTITUTION pour le regain des points de VUE.</p>\n<p>La décoction se prépare comme une décoction d’herbes de soin. Pour baigner les deux yeux, il en faut 10 brins. Le bain doit durer 60 minutes (pour les deux yeux), puis les yeux doivent être tenus à l’abri de la lumière pendant un minimum de 3 heures. Le mieux est de les fermer et de dormir. Un bain d’yeux n’est valable que pour un seul jet de CONSTITUTION.</p>\n<p>Dans tous les cas, la fréquence des jets est toutes les 12 heures. La décoction de solimonce n’étant jamais bue, un enchantement ne lui confère rien de plus. La solimonce ne guérit pas la fièvre brune et ne peut avoir d’effet que quand la maladie est entièrement guérie.</p>","descriptionmj":"","temporel":{"debut":{"indexDate":0,"indexMinute":0},"fin":{"indexDate":0,"indexMinute":0}},"identifie":false,"malignite":6,"periodicite":"1 heure \\ 6 heures","incubation":"1 heure","periode":{"unite":"heure","nombre":6},"remedesconnus":false,"remedes":"-4 \\ Élixir des Gnomes +14, Bitume de Camphre +10","dommages":"1 pt de Vie et 1 pt de Vue"},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"folder":null,"sort":0,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.4.9","coreVersion":"10.291","createdTime":1671050299820,"modifiedTime":1673135772493,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||
{"name":"Griffe morbide de Thanatos","type":"poison","img":"systems/foundryvtt-reve-de-dragon/icons/maladies_venins/venin.webp","system":{"description":"<p>Ce \"poison\" est causé par une @UUID[Compendium.foundryvtt-reve-de-dragon.sorts-thanatos.qaCjZ5V874ZImf9l]{Griffe morbide de Thanatos}.</p><p>Il n'y a pas de jet de constitution mais un jet de vie. Cet effet de \"poison\" permet de bloquer la récupération, et de rappeler de faire le jet de vie journalier.</p><p>Tous les jours, à l'extrême fin du Château Dormant, la victime de la griffe morbide doit tenter un jet de Vie et en appliquer les résultats suivants : 20 = perte de 2 points de vie ; échec = perte de 1 point de vie ; réussite = pas de perte pour aujoud'hui ; 01 = prochain jet de Vie joué le surlendemain au lieu du lendemain.</p>","descriptionmj":"","temporel":{"debut":{"indexDate":-1,"indexMinute":0},"fin":{"indexDate":-1,"indexMinute":0}},"identifie":false,"malignite":0,"incubation":"0","periode":{"unite":"jour","nombre":1},"remedesconnus":false,"remedes":"Aucun remède connu","dommages":"0","active":true},"effects":[],"ownership":{"default":0,"Hp9ImM4o9YRTSdfu":3},"flags":{"core":{"sourceId":"Item.OODFRuxbeK0MQta1"}},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.9","coreVersion":"10.291","createdTime":1675386482054,"modifiedTime":1675387015734,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"},"folder":null,"sort":0,"_id":"pUN57Ma4SJv1kvor"}
|
||||
{"name":"Bousille","type":"maladie","flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.maladies-et-poisons.qE4IEazgBeRs4uE0"}},"img":"systems/foundryvtt-reve-de-dragon/icons/maladies_venins/champifruit.webp","effects":[],"_id":"qE4IEazgBeRs4uE0","system":{"description":"<p>Intoxication suite à l'ingestion d'un champignon vénéneux.</p>","descriptionmj":"","temporel":{"debut":{"indexDate":0,"indexMinute":0},"fin":{"indexDate":0,"indexMinute":0}},"identifie":false,"malignite":5,"periodicite":"6 rounds","incubation":"","periode":{"unite":"round","nombre":6},"remedesconnus":false,"remedes":"-4/ Teinture d’Érozonne +10, Topazoïne +6","dommages":"3 pts de Vie"},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"folder":null,"sort":0,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.4.9","coreVersion":"10.291","createdTime":1671050299820,"modifiedTime":1673135772493,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||
{"name":"Hécatombe","type":"maladie","flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.maladies-et-poisons.sSgu1FYK1s1vZinT"}},"img":"systems/foundryvtt-reve-de-dragon/icons/maladies_venins/champifruit.webp","effects":[],"_id":"sSgu1FYK1s1vZinT","system":{"description":"<p>Intoxication suite à l'ingestion d'un fruit vénéneux.</p>","descriptionmj":"","temporel":{"debut":{"indexDate":0,"indexMinute":0},"fin":{"indexDate":0,"indexMinute":0}},"identifie":false,"malignite":4,"periodicite":"1 minute","incubation":"","periode":{"unite":"minute","nombre":1},"remedesconnus":false,"remedes":"-5/ Bitume de Camphre +12, Mirobolant +6","dommages":"2 pts de Vie"},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"folder":null,"sort":0,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.4.9","coreVersion":"10.291","createdTime":1671050299821,"modifiedTime":1673135772493,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||
{"name":"Amanite thanataire","type":"maladie","flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.maladies-et-poisons.sriGtgt3FQkc642z"}},"img":"systems/foundryvtt-reve-de-dragon/icons/maladies_venins/champifruit.webp","effects":[],"_id":"sriGtgt3FQkc642z","system":{"description":"<p>Intoxication suite à l'ingestion d'un champignon vénéneux.</p>","descriptionmj":"","temporel":{"debut":{"indexDate":0,"indexMinute":0},"fin":{"indexDate":0,"indexMinute":0}},"identifie":false,"malignite":7,"periodicite":"3 rounds","incubation":"","periode":{"unite":"round","nombre":3},"remedesconnus":false,"remedes":"-3/ Tournegraisse +12, Perle de Bjwal +10","dommages":"4 pts de Vie"},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"folder":null,"sort":0,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.4.9","coreVersion":"10.291","createdTime":1671050299821,"modifiedTime":1673135772492,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||
|
@ -1,19 +1,19 @@
|
||||
{"name":"Potion de Dextérité","type":"recettealchimique","flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.recettes-alchimiques.47Wrb4HZnXprP43E"}},"img":"systems/foundryvtt-reve-de-dragon/icons/alchimie/recette_alchimique_potiondexterite.webp","effects":[],"_id":"47Wrb4HZnXprP43E","system":{"description":null,"descriptionmj":"","but":"Augmenter la précision des gestes du buveur.","utilisation":"<p>Boire l’intégralité de la potion sans respirer.</p>\n<p>L’effet a lieu au bout de 2 minutes (20 rounds) et dure 1 minute (10 rounds).</p>\n<p>Il confère un bonus de +5 à tous les jets de DEXTÉRITÉ, de Tir et de Lancer, et est suivi d’une perte de 1d6 points d’endurance.</p>","enchantement":"<p>Si la potion est enchantée, l’effet magique n’a lieu que si un jet de résistance standard est échoué.</p>\n<p>L’effet se produit alors dans le round consécutif au jet de résistance (au lieu de 2 minutes) et voit sa durée modifiée. </p>\n<p>L’effet dure un nombre de minutes égal aux points de rêve de la potion, sans perte d’endurance.</p>","sureffet":"<p>Il y a 3 % de chances par point de rêve de la potion qu’un sur-effet se produise : la perte totale du goût et de l’odorat (ODORAT-GOÛT tombe à zéro).</p>\n<p>Pour le regain, jouer tous les matins un jet d’ODORAT- GOÛT (originel) à zéro et regagner selon le barème des points de tâche.</p>","manipulation":"<ul>\n<li>Piler à froid <strong>2 doigts de graisse de carpe</strong> et <strong>4 pépins d’obyssum vert</strong>, le tout jusqu’à @consistance{lapin} (0).</li>\n<li>Ajouter <strong>une demi-pinte d’eau alchimiquement simple</strong> et chauffer jusqu’à @couleur{bleu-vert-glauque} (-3).</li>\n<li>Tirer hors du feu et ajouter <strong>1 pépin de boralm</strong>, puis couvrir immédiatement à l’abri de la lumière, et laisser reposer au moins une heure.</li>\n</ul>\n<p>Le résultat doit être un lait verdâtre parfaitement fluide.</p>\n<p>Si le produit a un aspect granulé, tout est à recommencer.</p>"},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"folder":null,"sort":0,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.3.13","coreVersion":"10.291","createdTime":1671050435147,"modifiedTime":1671050504076,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||
{"name":"Mirobolant","type":"recettealchimique","flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.recettes-alchimiques.8FChQdTQ8JpnLLzz"}},"img":"systems/foundryvtt-reve-de-dragon/icons/alchimie/recette_alchimique_mirobolant.webp","effects":[],"_id":"8FChQdTQ8JpnLLzz","system":{"description":"","descriptionmj":"","but":"Obtenir trois doses du remède alchimique.","utilisation":null,"enchantement":"","sureffet":"","manipulation":"<ul>\n<li>Amalgamer <strong>1 écaille de miel</strong>, <strong>10 brins de canople</strong> et <strong>10 brins de pif-paf</strong> jusqu’à @consistance{chevre-renard} (-2) et laisser reposer une heure.</li>\n<li>Introduire <strong>4 brins de névropenthe</strong> et travailler à nouveau jusqu’à @consistance{renard-chevre} (-2) ; laisser encore reposer une heure.</li>\n<li>Introduire la pâte obtenue dans <strong>1 mesure de brandevin</strong> et porter le tout à température @couleur{bleu} (0).</li>\n<li>Ajouter vivement <strong>2 pépins de chramaelium</strong> et remuer lentement, toujours sur le feu, jusqu’à percevoir clairement la température @couleur{pourpre} (0).</li>\n<li>Cesser de remuer, tirer hors du feu, couvrir et laisser entièrement refroidir (environ une heure).</li>\n</ul>\n<p>Réussite : le liquide est clair et sans dépôt, c’est le mirobolant.</p>\n<p>Échec : le liquide est trouble.</p>"},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"folder":null,"sort":0,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.3.13","coreVersion":"10.291","createdTime":1671050435147,"modifiedTime":1671050504076,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||
{"name":"Reliquéfaction d'Algagath le Vieil","type":"recettealchimique","flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.recettes-alchimiques.BsIh6klSBL6n5HEs"}},"img":"systems/foundryvtt-reve-de-dragon/icons/alchimie/recette_alchimique_reliquefaction.webp","effects":[],"_id":"BsIh6klSBL6n5HEs","system":{"description":"<p>Noter que l’eau obtenue par transmutation élémentale est également alchimiquement simple.</p>","descriptionmj":"","but":"Obtenir de l’eau alchimiquement simple.","utilisation":"","enchantement":"","sureffet":"","manipulation":"<ul>\n<li>Faire une décoction de <strong>5 brins de mercurion</strong>, de <strong>satum </strong>ou de <strong>névropenthe </strong>dans <strong>1 pinte d’eau filtrée</strong>.</li>\n<li>Pousser la chauffe jusqu’à la couleur indiquée selon l’herbe utilisée et tirer vivement hors du feu. Le contenu du chaudron doit alors gélifier progressivement.</li>\n<li>Tester la gélification, et quand elle a atteint la consistance indiquée, remettre sur un feu fort.\n<ul>\n<li>Si le travail se reliquéfie instantanément, la manipulation a réussi.</li>\n<li>Si la gelée durcit davantage, c’est perdu.</li>\n</ul>\n</li>\n<li>Filtrer l’eau obtenue avec un parchemin de veau, et l’utiliser dans toute manipulation requérant de l’eau alchimiquement simple.</li>\n</ul>\n<p>La quantité obtenue est d’une pinte et peut être fractionnée à volonté. Selon l’herbe utilisée, les couleurs et consistances à obtenir sont les suivantes, suivies entre parenthèses de leur diffculté.</p>\n<ul>\n<li><strong>Mercurion </strong>: @couleur{pourpre-pourpre-sangue} (-3) ; @consistance{serpent-serpent-chevre} (-3)</li>\n<li><strong>Satum </strong>: @couleur{pourpre-pourpre} (-1) ; @consistance{serpent-serpent} (-1)</li>\n<li><strong>Névropenthe </strong>: @couleur{pourpre} (0) ; @consistance{serpent} (0).</li>\n</ul>\n<p> </p>"},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"folder":null,"sort":0,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.3.13","coreVersion":"10.291","createdTime":1671050435147,"modifiedTime":1671050504076,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||
{"name":"Surpotion de Soin","type":"recettealchimique","flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.recettes-alchimiques.FlagyXHjYV2WaxEk"}},"img":"systems/foundryvtt-reve-de-dragon/icons/alchimie/recette_alchimique_potionsoin.webp","effects":[],"_id":"FlagyXHjYV2WaxEk","system":{"description":null,"descriptionmj":"","but":"Amplifier le pouvoir de guérison des herbes de soin.","utilisation":null,"enchantement":"<p>Une surpotion de soin peut être enchantée comme une simple potion, les points de rêve conférés étant multipliés au nouveau bonus pour obtenir la force de la potion en points de guérison.</p>","sureffet":"<p>Il y a 3 % de chances par point de rêve de la potion qu’un sur-effet se produise : un épuisement se traduisant par la prise immédiate de 16 cases de fatigue.</p>","manipulation":"<ul>\n<li>Pratiquer la décoction dans <strong>deux mesures d’eau alchimiquement simple</strong> (au lieu d’eau ordinaire).</li>\n<li>Laisser décocter jusqu’à @couleur{brun-sangue} (-2).</li>\n<li>Tirer alors du feu et jeter dans le liquide <strong>une poignée de sable de rivière</strong>.</li>\n<li>Laisser refroidir, puis filtrer pour éliminer le sable, avant d’utiliser ou d’enchanter.</li>\n</ul>\n<p>Si le filtrage laisse une trace rouge (teinte véritable) comme un dépôt de sang, la manipulation a échoué et la potion n’a plus aucune vertu.</p>\n<p>Dans le cas contraire, le bonus de la potion est doublé.</p>"},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"folder":null,"sort":0,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.3.13","coreVersion":"10.291","createdTime":1671050435147,"modifiedTime":1671050504076,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||
{"name":"Bitume de Camphre","type":"recettealchimique","flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.recettes-alchimiques.RXQcnXK88LjMICB5"}},"img":"systems/foundryvtt-reve-de-dragon/icons/alchimie/recette_alchimique_bitume.webp","effects":[],"_id":"RXQcnXK88LjMICB5","system":{"description":"<p><strong>L’huile de pierre</strong> (pétrole brut) se trouve naturellement à la surface de certains marais.</p>\n<p>VUE/Alchimie à zéro pour l’identifier.</p>\n<p> </p>\n<p>Le <strong>turlupestre </strong>est un grand conifère, connu de tout personnage ayant au moins zéro en Botanique.</p>","descriptionmj":"","but":"Obtenir trois doses du remède alchimique.","utilisation":null,"enchantement":"","sureffet":"","manipulation":"<ul>\n<li>Mélanger <strong>une demi-mesure d’huile de pierre*</strong>, <strong>une demi-mesure de sève de turlupestre*</strong> et <strong>1 écaille de miel</strong> jusqu’à @consistance{renard-serpent} (-2).</li>\n<li>Ajouter <strong>2 pépins de nartha</strong> et porter à température @couleur{gris-gris-bleu} (-3).</li>\n<li>Tirer hors du feu, couvrir et laisser reposer une heure.</li>\n</ul>\n<p>Réussite : on obtient une crème sirupeuse, c’est le bitume de Camphre.</p>\n<p>Échec : le produit se solidifie.</p>"},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"folder":null,"sort":0,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.3.13","coreVersion":"10.291","createdTime":1671050435147,"modifiedTime":1671050504076,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||
{"name":"Topazoïne","type":"recettealchimique","flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.recettes-alchimiques.T5E45pmhHBgjE1Bv"}},"img":"systems/foundryvtt-reve-de-dragon/icons/alchimie/recette_alchimique_topazoine.webp","effects":[],"_id":"T5E45pmhHBgjE1Bv","system":{"description":"","descriptionmj":"","but":"Obtenir trois doses du remède alchimique.","utilisation":null,"enchantement":"","sureffet":"","manipulation":"<ul>\n<li>Plonger <strong>3 écailles d’ongle d’aligate râpé</strong> et <strong>3 pépins de boralm</strong> dans <strong>une demi-pinte d’eau alchimiquement simple</strong> et porter à température @couleur{gris-pourpre} (-2).</li>\n<li>Couvrir et laisser reposer une heure.</li>\n<li>Ajouter <strong>6 brins de névropenthe</strong> et chauffer à nouveau jusqu’à température @couleur{brun-brun-bleu} (-3).</li>\n<li>Plonger alors <strong>un oeuf de cane</strong> dans le liquide, couvrir et laisser à nouveau reposer une heure.</li>\n</ul>\n<p>Réussite : la coquille de l’oeuf est intacte ; c’est elle qui, finement broyée, fournira 3 doses de topazoïne.</p>\n<p>Échec : la coquille est fendillée ; on peut toujours manger l’oeuf dur.</p>"},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"folder":null,"sort":0,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.3.13","coreVersion":"10.291","createdTime":1671050435148,"modifiedTime":1671050504076,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||
{"name":"Lait de Lune","type":"recettealchimique","flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.recettes-alchimiques.UyTsZjqVRq8SaRTm"}},"img":"systems/foundryvtt-reve-de-dragon/icons/alchimie/recette_alchimique_laitdelune.webp","effects":[],"_id":"UyTsZjqVRq8SaRTm","system":{"description":"","descriptionmj":"","but":"Obtenir trois doses du remède alchimique.","utilisation":null,"enchantement":"","sureffet":"","manipulation":"<ul>\n<li>Malaxer <strong>une demi-écaille de fiel de rat</strong> et <strong>2 brins d’ailes de libellules</strong> jusqu’à @consistance{cheval-renard-serpent} (-3).</li>\n<li>Incorporer <strong>1 mesure de lait de laie</strong> et chauffer jusqu’à température @couleur{gris-vert-glauque-glauque} (-4).</li>\n<li>Tirer prestement hors du feu et ajouter <strong>2 brins de candique</strong>.</li>\n<li>Couvrir, laisser reposer 1 heure, puis goûter.</li>\n</ul>\n<p>Réussite : le lait obtenu n’a strictement aucun goût, c’est le lait de lune.</p>\n<p>Échec : son amertume est insupportable.</p>"},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"folder":null,"sort":0,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.3.13","coreVersion":"10.291","createdTime":1671050435148,"modifiedTime":1671050504076,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||
{"name":"Teinture d'Erozonne","type":"recettealchimique","flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.recettes-alchimiques.WC5AXUApvI1GGxWp"}},"img":"systems/foundryvtt-reve-de-dragon/icons/alchimie/recette_alchimique_teinture.webp","effects":[],"_id":"WC5AXUApvI1GGxWp","system":{"description":"<p><strong>L’érozonne </strong>est une fleur des montagnes, poussant en belles grappes roses, voisine de la digitale (INTELLECT/Botanique à -2).</p>","descriptionmj":"","but":"Obtenir trois doses du remède alchimique.","utilisation":null,"enchantement":"","sureffet":"","manipulation":"<ul>\n<li>Introduire <strong>5 brins de pollen d’érozonne*</strong> dans <strong>une demi-mesure d’eau alchimiquement simple</strong> et chauffer jusqu’à température @couleur{sangue-pourpre} (-2).</li>\n<li>Ajouter <strong>2 pépins d’obbadion</strong>, tirer hors du feu et laisser refroidir jusqu’à température @couleur{pourpre-sangue} (-2).</li>\n<li>Jeter alors<strong> une petite gemme </strong>(taille de 1 pépin) dans le liquide et faire repartir le feu jusqu’à température @couleur{pourpre-pourpre} (-1).</li>\n<li>Ajouter <strong>un bâton de craie</strong>, tirer hors du feu, couvrir et laisser reposer une heure.</li>\n</ul>\n<p>Réussite : on retrouve la gemme intacte, mais pas le bâton de craie, au fond d’un liquide rosâtre, la teinture d’érozonne. La gemme peut être réutilisée.</p>\n<p>Échec : on ne retrouve ni l’un ni l’autre.</p>"},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"folder":null,"sort":0,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.3.13","coreVersion":"10.291","createdTime":1671050435148,"modifiedTime":1671050504076,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||
{"name":"Tournegraisse","type":"recettealchimique","flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.recettes-alchimiques.YkADt7cIrtgkjOtW"}},"img":"systems/foundryvtt-reve-de-dragon/icons/alchimie/recette_alchimique_tournegraisse.webp","effects":[],"_id":"YkADt7cIrtgkjOtW","system":{"description":"<p>La véritable tournegraisse s’obtient par simple macération dans l’huile d’une glande génitale de tournedent. Toutefois, devant la diffculté à se procurer cet ingrédient, les alchimistes ont mis au point un succédané.</p>","descriptionmj":"","but":"Obtenir trois doses du remède alchimique.","utilisation":null,"enchantement":"","sureffet":"","manipulation":"<ul>\n<li>Faire bouillir <strong>un oeil de cheval</strong> dans <strong>une demi-pinte d’eau alchimiquement simple</strong> jusqu’à obtenir un bouillon de @couleur{sangue} (0).</li>\n<li>Repêcher l’oeil, l’éponger avec un chiffon doux, puis l’écraser et mélanger dans <strong>2 écailles de beurre de jument</strong> jusqu’à @consistance{cheval-cheval} (-1).</li>\n<li>Réincorporer le tout dans le bouillon, porter à température @couleur{sangue-gris-sangue} (-3), ajouter<strong> 4 pépins d’obyssum gris</strong>, couvrir et laisser reposer une heure.</li>\n</ul>\n<p>Réussite : une graisse blanche et compacte doit flotter sur le liquide, c’est la tournegraisse.</p>\n<p>Échec : quelques yeux se sont juste formés sur le bouillon, au regard faussement consterné.</p>"},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"folder":null,"sort":0,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.3.13","coreVersion":"10.291","createdTime":1671050435148,"modifiedTime":1671050504076,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||
{"name":"Elixir des Gnomes","type":"recettealchimique","flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.recettes-alchimiques.dT3SLgKPgklp4ofr"}},"img":"systems/foundryvtt-reve-de-dragon/icons/alchimie/recette_alchimique_elixir.webp","effects":[],"_id":"dT3SLgKPgklp4ofr","system":{"description":"","descriptionmj":"","but":"Obtenir trois doses du remède alchimique.","utilisation":null,"enchantement":"","sureffet":"","manipulation":"<ul>\n<li>Écraser<strong> 2 écailles de cornes de rêve</strong> dans <strong>2 doigts de jus de lulube</strong> jusqu’à @consistance{hibou} (0).</li>\n<li>Mélanger<strong> 2 autres écailles de cornes de rêve</strong> dans <strong>2 écailles de pulpe de veloute</strong> jusqu’à @consistance{mouton} (0).</li>\n<li>Amalgamer les deux mixtures en les retravaillant jusqu’à @consistance{hibou-mouton} (-2).</li>\n<li>Incorporer dans <strong>1 mesure de brandevin</strong> et chauffer à température @couleur{bleu-glauque} (-2).</li>\n<li>Tirer prestement hors du feu et ajouter <strong>1 brin de candique</strong>.</li>\n</ul>\n<p>Réussite : l’ensemble se liquéfie instantanément pour donner une belle liqueur violette, l’élixir des Gnomes.</p>\n<p>Échec : le produit gélifie en confiture noire, comestible quoique de degré 7 d’exotisme.</p>"},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"folder":null,"sort":0,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.3.13","coreVersion":"10.291","createdTime":1671050435148,"modifiedTime":1671050504077,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||
{"name":"Pulvérisation Alchimique","type":"recettealchimique","flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.recettes-alchimiques.fzwQaQwjGD8eARcb"}},"img":"systems/foundryvtt-reve-de-dragon/icons/alchimie/recette_alchimique_pulverisation.webp","effects":[],"_id":"fzwQaQwjGD8eARcb","system":{"description":null,"descriptionmj":"","but":"Obtenir une gemme alchimiquement pulvérisée pour l’inclure à l’alliage d’un objet que l’on désire enchanter.","utilisation":"<p>Ne pas oublier que pour l’enchantement, l’intégralité de la gemme doit être utilisée. Bien veiller à recueillir chaque fragment de la poudre obtenue.</p>","enchantement":"","sureffet":"","manipulation":"<ul>\n<li>Plonger <strong>une gemme</strong> dans <strong>une mesure d’eau alchimiquement simple</strong> et chauffer le tout jusqu’à température @couleur{gris} (0).</li>\n<li>Ajouter alors une quantité de <strong>boralm</strong> <strong>équivalente, en pépins, à la taille de la gemme</strong>, et continuer la chauffe jusqu’à température @couleur{noir} (0).</li>\n<li>À ce moment précis, rajouter <strong>une même quantité de chramaelium</strong>, et continuer de chauffer jusqu’à @couleur{gris-noir} (-2).</li>\n<li>Tirer alors du feu, ajouter <strong>une mesure d’eau (alchimiquement simple) froide</strong>, et couvrir à l’abri de la lumière.</li>\n<li>Laisser reposer 7 heures.</li>\n<li>Au bout de ce temps, récupérer la gemme et l’éponger soigneusement avant de la placer au fond d’un mortier de marbre. Puis, au moyen d’un pilon également de marbre, la frapper d’un petit coup sec.</li>\n</ul>\n<p>Sous le choc, la gemme doit se pulvériser, littéralement tomber en poussière.</p>\n<p>Si elle reste intacte, c’est que l’opération a failli quelque part.</p>"},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"folder":null,"sort":0,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.3.13","coreVersion":"10.291","createdTime":1671050435148,"modifiedTime":1671050504077,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||
{"name":"Disruption Alchimique","type":"recettealchimique","flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.recettes-alchimiques.j9F7ToKzaGBo48m1"}},"img":"systems/foundryvtt-reve-de-dragon/icons/alchimie/recette_alchimique_disruption.webp","effects":[],"_id":"j9F7ToKzaGBo48m1","system":{"description":null,"descriptionmj":"","but":"Extraire un ingrédient d’un autre, par exemple un sel alchimique de son minerai.","utilisation":"","enchantement":"","sureffet":"","manipulation":"<ul>\n<li>Faire chauffer <strong>une livre de minerai</strong> à sec jusqu’à @couleur{brun-gris-sangue} (-3), et verser dessus <strong>une pinte d’eau alchimiquement simple</strong>.</li>\n<li>Reculer précipitamment pour éviter le jet de vapeur et mélanger vigoureusement jusqu’à @consistance{hibou-renard-mouton} (-3).</li>\n<li>Laisser reposer 12 heures à l’abri de la lumière, avant de filtrer le liquide obtenu dans du parchemin de veau.</li>\n</ul>\n<p>Après évaporation à l’air libre, on obtient 10 pépins de sel alchimique résiduel.</p>\n<p>Si une sorte de colle apparaît au lieu d’une poudre, c’est que la manipulation a foiré quelque part.</p>"},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"folder":null,"sort":0,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.3.13","coreVersion":"10.291","createdTime":1671050435148,"modifiedTime":1671050504077,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||
{"name":"Potion de Force","type":"recettealchimique","flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.recettes-alchimiques.lGGUyONSD7vJpxsb"}},"img":"systems/foundryvtt-reve-de-dragon/icons/alchimie/recette_alchimique_potionforce.webp","effects":[],"_id":"lGGUyONSD7vJpxsb","system":{"description":null,"descriptionmj":"","but":"Augmenter la force physique du buveur de la potion.","utilisation":"<p>Boire l’intégralité de la potion sans respirer.</p>\n<p>L’effet a lieu au bout de 2 minutes (20 rounds) et dure 1 minute (10 rounds).</p>\n<p>Il confère un bonus de +5 à tous les jets de FORCE pure (ni Mêlée ni Lancer ne sont affectés), un bonus de +2 au +dom personnel en Mêlée et de +1 en Lancer, et double le seuil d’encombrement.</p>\n<p>La fin de l’effet s’accompagne d’une perte de 2d6 points d’endurance.</p>","enchantement":"<p>Si la potion est enchantée, l’effet magique n’a lieu que si un jet de résistance standard est échoué.</p>\n<p>L’effet se produit alors dans le round consécutif au jet de résistance (au lieu de 2 minutes) et voit sa durée modifiée. Les bonus aux jets de FORCE et aux dommages durent autant de minutes que de points de rêve, le doublement du seuil d’encombrement dure autant d’heures que de points de rêve, et le tout sans perte d’endurance.</p>","sureffet":"<p>Il y a 3 % de chances par point de rêve de la potion qu’un sur-effet se produise : la perte totale du système pileux (sauf les ongles). La repousse aura lieu normalement avec le temps.</p>","manipulation":"<ul>\n<li>Mélanger à froid <strong>5 déhacoudres de cendre de bouleau </strong>dans <strong>1 mesure de lait de femme</strong> jusqu’à obtenir une crème de @consistance{cheval} (0).</li>\n<li>Ajouter alors <strong>une mesure d’eau alchimiquement simple</strong> et faire chauffer jusqu’à @couleur{vert-bleu} (-2).</li>\n<li>Ajouter à ce moment <strong>3 pépins de candique</strong>, tirer hors du feu et mélanger jusqu’à @consistance{mouton-cheval-serpent} (-3).</li>\n<li>Laisser reposer au moins une heure avant utilisation.</li>\n</ul>\n<p>Le produit obtenu doit être translucide, signe que la manipulation a réussi.</p>\n<p>S’il est opaque, tout est à recommencer.</p>"},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"folder":null,"sort":0,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.3.13","coreVersion":"10.291","createdTime":1671050435148,"modifiedTime":1671050504077,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||
{"name":"Huile de Sélikanthe","type":"recettealchimique","flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.recettes-alchimiques.lQL6PSB9k4Lczili"}},"img":"systems/foundryvtt-reve-de-dragon/icons/alchimie/recette_alchimique_huileselikanthe.webp","effects":[],"_id":"lQL6PSB9k4Lczili","system":{"description":"","descriptionmj":"","but":"Obtenir trois doses du remède alchimique.","utilisation":null,"enchantement":"","sureffet":"","manipulation":"<ul>\n<li>Faire courir un cheval rapide jusqu’à ce qu’il soit blanc <strong>d’écume </strong>et récupérer <strong>3 doigts de cette matière</strong>.</li>\n<li>Repérer <strong>un escargot lent</strong> et le tuer proprement.</li>\n<li>Broyer grossièrement sa coquille, ajouter l’écume de cheval et retravailler le tout jusqu’à @consistance{cheval-lapin-serpent} (-3).</li>\n<li>Introduire le produit dans <strong>1 mesure d’eau alchimiquement simple</strong>, ajouter le corps de l’escargot, et porter le tout à température @couleur{blanc-blanc-noir} (-3).</li>\n<li>Tirer hors du feu, ajouter <strong>10 brins de muscaline</strong>, couvrir et laisser reposer une heure.</li>\n</ul>\n<p>Réussite : le corps de l’escargot flotte à la surface d’un liquide légérement huileux, l’huile de Sélikanthe.</p>\n<p>Échec : il gît tout au fond.</p>\n<p>Dans les deux cas, on peut le consommer en rajoutant un peu de luciane et de béjaune.</p>"},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"folder":null,"sort":0,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.3.13","coreVersion":"10.291","createdTime":1671050435148,"modifiedTime":1671050504077,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||
{"name":"Potion de Dextérité","type":"recettealchimique","flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.recettes-alchimiques.47Wrb4HZnXprP43E"}},"img":"systems/foundryvtt-reve-de-dragon/icons/alchimie/recette_alchimique_potiondexterite.webp","effects":[],"_id":"47Wrb4HZnXprP43E","system":{"description":null,"descriptionmj":"","but":"Augmenter la précision des gestes du buveur.","utilisation":"<p>Boire l’intégralité de la potion sans respirer.</p>\n<p>L’effet a lieu au bout de 2 minutes (20 rounds) et dure 1 minute (10 rounds).</p>\n<p>Il confère un bonus de +5 à tous les jets de DEXTÉRITÉ, de Tir et de Lancer, et est suivi d’une perte de 1d6 points d’endurance.</p>","enchantement":"<p>Si la potion est enchantée, l’effet magique n’a lieu que si un jet de résistance standard est échoué.</p>\n<p>L’effet se produit alors dans le round consécutif au jet de résistance (au lieu de 2 minutes) et voit sa durée modifiée. </p>\n<p>L’effet dure un nombre de minutes égal aux points de rêve de la potion, sans perte d’endurance.</p>","sureffet":"<p>Il y a 3 % de chances par point de rêve de la potion qu’un sur-effet se produise : la perte totale du goût et de l’odorat (ODORAT-GOÛT tombe à zéro).</p>\n<p>Pour le regain, jouer tous les matins un jet d’ODORAT- GOÛT (originel) à zéro et regagner selon le barème des points de tâche.</p>","manipulation":"<ul><li>Piler à froid <strong>2 doigts de graisse de carpe</strong> et <strong>4 pépins d’obyssum vert</strong>, le tout jusqu’à @consistance{lapin}.</li><li>Ajouter <strong>une demi-pinte d’eau alchimiquement simple</strong> et chauffer jusqu’à @couleur{bleu-vert-glauque}.</li><li>Tirer hors du feu et ajouter <strong>1 pépin de boralm</strong>, puis couvrir immédiatement à l’abri de la lumière, et laisser reposer au moins une heure.</li></ul><p>Le résultat doit être un lait verdâtre parfaitement fluide.</p><p>Si le produit a un aspect granulé, tout est à recommencer.</p>"},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"folder":null,"sort":0,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.8","coreVersion":"10.291","createdTime":1671050435147,"modifiedTime":1675296911823,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||
{"name":"Mirobolant","type":"recettealchimique","flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.recettes-alchimiques.8FChQdTQ8JpnLLzz"}},"img":"systems/foundryvtt-reve-de-dragon/icons/alchimie/recette_alchimique_mirobolant.webp","effects":[],"_id":"8FChQdTQ8JpnLLzz","system":{"description":"","descriptionmj":"","but":"Obtenir trois doses du remède alchimique.","utilisation":null,"enchantement":"","sureffet":"","manipulation":"<ul><li>Amalgamer <strong>1 écaille de miel</strong>, <strong>10 brins de canople</strong> et <strong>10 brins de pif-paf</strong> jusqu’à @consistance{chevre-renard} et laisser reposer une heure.</li><li>Introduire <strong>4 brins de névropenthe</strong> et travailler à nouveau jusqu’à @consistance{renard-chevre}; laisser encore reposer une heure.</li><li>Introduire la pâte obtenue dans <strong>1 mesure de brandevin</strong> et porter le tout à température @couleur{bleu}.</li><li>Ajouter vivement <strong>2 pépins de chramaelium</strong> et remuer lentement, toujours sur le feu, jusqu’à percevoir clairement la température @couleur{pourpre}.</li><li>Cesser de remuer, tirer hors du feu, couvrir et laisser entièrement refroidir (environ une heure).</li></ul><p>Réussite : le liquide est clair et sans dépôt, c’est le mirobolant.</p><p>Échec : le liquide est trouble.</p>"},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"folder":null,"sort":0,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.8","coreVersion":"10.291","createdTime":1671050435147,"modifiedTime":1675296946706,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||
{"name":"Reliquéfaction d'Algagath le Vieil","type":"recettealchimique","flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.recettes-alchimiques.BsIh6klSBL6n5HEs"}},"img":"systems/foundryvtt-reve-de-dragon/icons/alchimie/recette_alchimique_reliquefaction.webp","effects":[],"_id":"BsIh6klSBL6n5HEs","system":{"description":"<p>Noter que l’eau obtenue par transmutation élémentale est également alchimiquement simple.</p>","descriptionmj":"","but":"Obtenir de l’eau alchimiquement simple.","utilisation":"","enchantement":"","sureffet":"","manipulation":"<ul><li>Faire une décoction de <strong>5 brins de mercurion</strong>, de <strong>satum </strong>ou de <strong>névropenthe </strong>dans <strong>1 pinte d’eau filtrée</strong>.</li><li>Pousser la chauffe jusqu’à la couleur indiquée selon l’herbe utilisée et tirer vivement hors du feu. Le contenu du chaudron doit alors gélifier progressivement.</li><li><p>Tester la gélification, et quand elle a atteint la consistance indiquée, remettre sur un feu fort.</p><ul><li>Si le travail se reliquéfie instantanément, la manipulation a réussi.</li><li>Si la gelée durcit davantage, c’est perdu.</li></ul></li><li>Filtrer l’eau obtenue avec un parchemin de veau, et l’utiliser dans toute manipulation requérant de l’eau alchimiquement simple.</li></ul><p>La quantité obtenue est d’une pinte et peut être fractionnée à volonté. Selon l’herbe utilisée, les couleurs et consistances à obtenir sont les suivantes, suivies entre parenthèses de leur diffculté.</p><ul><li><strong>Mercurion </strong>: @couleur{pourpre-pourpre-sangue}; @consistance{serpent-serpent-chevre}</li><li><strong>Satum </strong>: @couleur{pourpre-pourpre}; @consistance{serpent-serpent}</li><li><strong>Névropenthe </strong>: @couleur{pourpre}; @consistance{serpent}.</li></ul><p> </p>"},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"folder":null,"sort":0,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.8","coreVersion":"10.291","createdTime":1671050435147,"modifiedTime":1675296857257,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||
{"name":"Surpotion de Soin","type":"recettealchimique","flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.recettes-alchimiques.FlagyXHjYV2WaxEk"}},"img":"systems/foundryvtt-reve-de-dragon/icons/alchimie/recette_alchimique_potionsoin.webp","effects":[],"_id":"FlagyXHjYV2WaxEk","system":{"description":null,"descriptionmj":"","but":"Amplifier le pouvoir de guérison des herbes de soin.","utilisation":null,"enchantement":"<p>Une surpotion de soin peut être enchantée comme une simple potion, les points de rêve conférés étant multipliés au nouveau bonus pour obtenir la force de la potion en points de guérison.</p>","sureffet":"<p>Il y a 3 % de chances par point de rêve de la potion qu’un sur-effet se produise : un épuisement se traduisant par la prise immédiate de 16 cases de fatigue.</p>","manipulation":"<ul><li>Pratiquer la décoction dans <strong>deux mesures d’eau alchimiquement simple</strong> (au lieu d’eau ordinaire).</li><li>Laisser décocter jusqu’à @couleur{brun-sangue}.</li><li>Tirer alors du feu et jeter dans le liquide <strong>une poignée de sable de rivière</strong>.</li><li>Laisser refroidir, puis filtrer pour éliminer le sable, avant d’utiliser ou d’enchanter.</li></ul><p>Si le filtrage laisse une trace rouge (teinte véritable) comme un dépôt de sang, la manipulation a échoué et la potion n’a plus aucune vertu.</p><p>Dans le cas contraire, le bonus de la potion est doublé.</p>"},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"folder":null,"sort":0,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.8","coreVersion":"10.291","createdTime":1671050435147,"modifiedTime":1675296815420,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||
{"name":"Bitume de Camphre","type":"recettealchimique","flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.recettes-alchimiques.RXQcnXK88LjMICB5"}},"img":"systems/foundryvtt-reve-de-dragon/icons/alchimie/recette_alchimique_bitume.webp","effects":[],"_id":"RXQcnXK88LjMICB5","system":{"description":"<p><strong>L’huile de pierre</strong> (pétrole brut) se trouve naturellement à la surface de certains marais.</p>\n<p>VUE/Alchimie à zéro pour l’identifier.</p>\n<p> </p>\n<p>Le <strong>turlupestre </strong>est un grand conifère, connu de tout personnage ayant au moins zéro en Botanique.</p>","descriptionmj":"","but":"Obtenir trois doses du remède alchimique.","utilisation":null,"enchantement":"","sureffet":"","manipulation":"<ul><li>Mélanger <strong>une demi-mesure d’huile de pierre*</strong>, <strong>une demi-mesure de sève de turlupestre*</strong> et <strong>1 écaille de miel</strong> jusqu’à @consistance{renard-serpent}.</li><li>Ajouter <strong>2 pépins de nartha</strong> et porter à température @couleur{gris-gris-bleu}.</li><li>Tirer hors du feu, couvrir et laisser reposer une heure.</li></ul><p>Réussite : on obtient une crème sirupeuse, c’est le bitume de Camphre.</p><p>Échec : le produit se solidifie.</p>"},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"folder":null,"sort":0,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.8","coreVersion":"10.291","createdTime":1671050435147,"modifiedTime":1675296719531,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||
{"name":"Topazoïne","type":"recettealchimique","flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.recettes-alchimiques.T5E45pmhHBgjE1Bv"}},"img":"systems/foundryvtt-reve-de-dragon/icons/alchimie/recette_alchimique_topazoine.webp","effects":[],"_id":"T5E45pmhHBgjE1Bv","system":{"description":"","descriptionmj":"","but":"Obtenir trois doses du remède alchimique.","utilisation":null,"enchantement":"","sureffet":"","manipulation":"<ul><li>Plonger <strong>3 écailles d’ongle d’aligate râpé</strong> et <strong>3 pépins de boralm</strong> dans <strong>une demi-pinte d’eau alchimiquement simple</strong> et porter à température @couleur{gris-pourpre}.</li><li>Couvrir et laisser reposer une heure.</li><li>Ajouter <strong>6 brins de névropenthe</strong> et chauffer à nouveau jusqu’à température @couleur{brun-brun-bleu}.</li><li>Plonger alors <strong>un oeuf de cane</strong> dans le liquide, couvrir et laisser à nouveau reposer une heure.</li></ul><p>Réussite : la coquille de l’oeuf est intacte ; c’est elle qui, finement broyée, fournira 3 doses de topazoïne.</p><p>Échec : la coquille est fendillée ; on peut toujours manger l’oeuf dur.</p>"},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"folder":null,"sort":0,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.8","coreVersion":"10.291","createdTime":1671050435148,"modifiedTime":1675296783589,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||
{"name":"Lait de Lune","type":"recettealchimique","flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.recettes-alchimiques.UyTsZjqVRq8SaRTm"}},"img":"systems/foundryvtt-reve-de-dragon/icons/alchimie/recette_alchimique_laitdelune.webp","effects":[],"_id":"UyTsZjqVRq8SaRTm","system":{"description":"","descriptionmj":"","but":"Obtenir trois doses du remède alchimique.","utilisation":null,"enchantement":"","sureffet":"","manipulation":"<ul><li>Malaxer <strong>une demi-écaille de fiel de rat</strong> et <strong>2 brins d’ailes de libellules</strong> jusqu’à @consistance{cheval-renard-serpent}.</li><li>Incorporer <strong>1 mesure de lait de laie</strong> et chauffer jusqu’à température @couleur{gris-vert-glauque-glauque}.</li><li>Tirer prestement hors du feu et ajouter <strong>2 brins de candique</strong>.</li><li>Couvrir, laisser reposer 1 heure, puis goûter.</li></ul><p>Réussite : le lait obtenu n’a strictement aucun goût, c’est le lait de lune.</p><p>Échec : son amertume est insupportable.</p>"},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"folder":null,"sort":0,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.8","coreVersion":"10.291","createdTime":1671050435148,"modifiedTime":1675296987431,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||
{"name":"Teinture d'Erozonne","type":"recettealchimique","flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.recettes-alchimiques.WC5AXUApvI1GGxWp"}},"img":"systems/foundryvtt-reve-de-dragon/icons/alchimie/recette_alchimique_teinture.webp","effects":[],"_id":"WC5AXUApvI1GGxWp","system":{"description":"<p><strong>L’érozonne </strong>est une fleur des montagnes, poussant en belles grappes roses, voisine de la digitale (INTELLECT/Botanique à -2).</p>","descriptionmj":"","but":"Obtenir trois doses du remède alchimique.","utilisation":null,"enchantement":"","sureffet":"","manipulation":"<ul><li>Introduire <strong>5 brins de pollen d’érozonne*</strong> dans <strong>une demi-mesure d’eau alchimiquement simple</strong> et chauffer jusqu’à température @couleur{sangue-pourpre}.</li><li>Ajouter <strong>2 pépins d’obbadion</strong>, tirer hors du feu et laisser refroidir jusqu’à température @couleur{pourpre-sangue}.</li><li>Jeter alors<strong> une petite gemme </strong>(taille de 1 pépin) dans le liquide et faire repartir le feu jusqu’à température @couleur{pourpre-pourpre}.</li><li>Ajouter <strong>un bâton de craie</strong>, tirer hors du feu, couvrir et laisser reposer une heure.</li></ul><p>Réussite : on retrouve la gemme intacte, mais pas le bâton de craie, au fond d’un liquide rosâtre, la teinture d’érozonne. La gemme peut être réutilisée.</p><p>Échec : on ne retrouve ni l’un ni l’autre.</p>"},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"folder":null,"sort":0,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.8","coreVersion":"10.291","createdTime":1671050435148,"modifiedTime":1675296801635,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||
{"name":"Tournegraisse","type":"recettealchimique","flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.recettes-alchimiques.YkADt7cIrtgkjOtW"}},"img":"systems/foundryvtt-reve-de-dragon/icons/alchimie/recette_alchimique_tournegraisse.webp","effects":[],"_id":"YkADt7cIrtgkjOtW","system":{"description":"<p>La véritable tournegraisse s’obtient par simple macération dans l’huile d’une glande génitale de tournedent. Toutefois, devant la diffculté à se procurer cet ingrédient, les alchimistes ont mis au point un succédané.</p>","descriptionmj":"","but":"Obtenir trois doses du remède alchimique.","utilisation":null,"enchantement":"","sureffet":"","manipulation":"<ul><li>Faire bouillir <strong>un oeil de cheval</strong> dans <strong>une demi-pinte d’eau alchimiquement simple</strong> jusqu’à obtenir un bouillon de @couleur{sangue}.</li><li>Repêcher l’oeil, l’éponger avec un chiffon doux, puis l’écraser et mélanger dans <strong>2 écailles de beurre de jument</strong> jusqu’à @consistance{cheval-cheval}.</li><li>Réincorporer le tout dans le bouillon, porter à température @couleur{sangue-gris-sangue}, ajouter<strong> 4 pépins d’obyssum gris</strong>, couvrir et laisser reposer une heure.</li></ul><p>Réussite : une graisse blanche et compacte doit flotter sur le liquide, c’est la tournegraisse.</p><p>Échec : quelques yeux se sont juste formés sur le bouillon, au regard faussement consterné.</p>"},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"folder":null,"sort":0,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.8","coreVersion":"10.291","createdTime":1671050435148,"modifiedTime":1675296753548,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||
{"name":"Elixir des Gnomes","type":"recettealchimique","flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.recettes-alchimiques.dT3SLgKPgklp4ofr"}},"img":"systems/foundryvtt-reve-de-dragon/icons/alchimie/recette_alchimique_elixir.webp","effects":[],"_id":"dT3SLgKPgklp4ofr","system":{"description":"","descriptionmj":"","but":"Obtenir trois doses du remède alchimique.","utilisation":null,"enchantement":"","sureffet":"","manipulation":"<ul><li>Écraser<strong> 2 écailles de cornes de rêve</strong> dans <strong>2 doigts de jus de lulube</strong> jusqu’à @consistance{hibou}.</li><li>Mélanger<strong> 2 autres écailles de cornes de rêve</strong> dans <strong>2 écailles de pulpe de veloute</strong> jusqu’à @consistance{mouton}.</li><li>Amalgamer les deux mixtures en les retravaillant jusqu’à @consistance{hibou-mouton}.</li><li>Incorporer dans <strong>1 mesure de brandevin</strong> et chauffer à température @couleur{bleu-glauque}.</li><li>Tirer prestement hors du feu et ajouter <strong>1 brin de candique</strong>.</li></ul><p>Réussite : l’ensemble se liquéfie instantanément pour donner une belle liqueur violette, l’élixir des Gnomes.</p><p>Échec : le produit gélifie en confiture noire, comestible quoique de degré 7 d’exotisme.</p>"},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"folder":null,"sort":0,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.8","coreVersion":"10.291","createdTime":1671050435148,"modifiedTime":1675297023555,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||
{"name":"Pulvérisation Alchimique","type":"recettealchimique","flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.recettes-alchimiques.fzwQaQwjGD8eARcb"}},"img":"systems/foundryvtt-reve-de-dragon/icons/alchimie/recette_alchimique_pulverisation.webp","effects":[],"_id":"fzwQaQwjGD8eARcb","system":{"description":null,"descriptionmj":"","but":"Obtenir une gemme alchimiquement pulvérisée pour l’inclure à l’alliage d’un objet que l’on désire enchanter.","utilisation":"<p>Ne pas oublier que pour l’enchantement, l’intégralité de la gemme doit être utilisée. Bien veiller à recueillir chaque fragment de la poudre obtenue.</p>","enchantement":"","sureffet":"","manipulation":"<ul><li>Plonger <strong>une gemme</strong> dans <strong>une mesure d’eau alchimiquement simple</strong> et chauffer le tout jusqu’à température @couleur{gris}.</li><li>Ajouter alors une quantité de <strong>boralm</strong> <strong>équivalente, en pépins, à la taille de la gemme</strong>, et continuer la chauffe jusqu’à température @couleur{noir}.</li><li>À ce moment précis, rajouter <strong>une même quantité de chramaelium</strong>, et continuer de chauffer jusqu’à @couleur{gris-noir}.</li><li>Tirer alors du feu, ajouter <strong>une mesure d’eau (alchimiquement simple) froide</strong>, et couvrir à l’abri de la lumière.</li><li>Laisser reposer 7 heures.</li><li>Au bout de ce temps, récupérer la gemme et l’éponger soigneusement avant de la placer au fond d’un mortier de marbre. Puis, au moyen d’un pilon également de marbre, la frapper d’un petit coup sec.</li></ul><p>Sous le choc, la gemme doit se pulvériser, littéralement tomber en poussière.</p><p>Si elle reste intacte, c’est que l’opération a failli quelque part.</p>"},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"folder":null,"sort":0,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.8","coreVersion":"10.291","createdTime":1671050435148,"modifiedTime":1675296877739,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||
{"name":"Disruption Alchimique","type":"recettealchimique","flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.recettes-alchimiques.j9F7ToKzaGBo48m1"}},"img":"systems/foundryvtt-reve-de-dragon/icons/alchimie/recette_alchimique_disruption.webp","effects":[],"_id":"j9F7ToKzaGBo48m1","system":{"description":null,"descriptionmj":"","but":"Extraire un ingrédient d’un autre, par exemple un sel alchimique de son minerai.","utilisation":"","enchantement":"","sureffet":"","manipulation":"<ul><li>Faire chauffer <strong>une livre de minerai</strong> à sec jusqu’à @couleur{brun-gris-sangue}, et verser dessus <strong>une pinte d’eau alchimiquement simple</strong>.</li><li>Reculer précipitamment pour éviter le jet de vapeur et mélanger vigoureusement jusqu’à @consistance{hibou-renard-mouton}.</li><li>Laisser reposer 12 heures à l’abri de la lumière, avant de filtrer le liquide obtenu dans du parchemin de veau.</li></ul><p>Après évaporation à l’air libre, on obtient 10 pépins de sel alchimique résiduel.</p><p>Si une sorte de colle apparaît au lieu d’une poudre, c’est que la manipulation a foiré quelque part.</p>"},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"folder":null,"sort":0,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.8","coreVersion":"10.291","createdTime":1671050435148,"modifiedTime":1675297048149,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||
{"name":"Potion de Force","type":"recettealchimique","flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.recettes-alchimiques.lGGUyONSD7vJpxsb"}},"img":"systems/foundryvtt-reve-de-dragon/icons/alchimie/recette_alchimique_potionforce.webp","effects":[],"_id":"lGGUyONSD7vJpxsb","system":{"description":null,"descriptionmj":"","but":"Augmenter la force physique du buveur de la potion.","utilisation":"<p>Boire l’intégralité de la potion sans respirer.</p>\n<p>L’effet a lieu au bout de 2 minutes (20 rounds) et dure 1 minute (10 rounds).</p>\n<p>Il confère un bonus de +5 à tous les jets de FORCE pure (ni Mêlée ni Lancer ne sont affectés), un bonus de +2 au +dom personnel en Mêlée et de +1 en Lancer, et double le seuil d’encombrement.</p>\n<p>La fin de l’effet s’accompagne d’une perte de 2d6 points d’endurance.</p>","enchantement":"<p>Si la potion est enchantée, l’effet magique n’a lieu que si un jet de résistance standard est échoué.</p>\n<p>L’effet se produit alors dans le round consécutif au jet de résistance (au lieu de 2 minutes) et voit sa durée modifiée. Les bonus aux jets de FORCE et aux dommages durent autant de minutes que de points de rêve, le doublement du seuil d’encombrement dure autant d’heures que de points de rêve, et le tout sans perte d’endurance.</p>","sureffet":"<p>Il y a 3 % de chances par point de rêve de la potion qu’un sur-effet se produise : la perte totale du système pileux (sauf les ongles). La repousse aura lieu normalement avec le temps.</p>","manipulation":"<ul><li>Mélanger à froid <strong>5 déhacoudres de cendre de bouleau </strong>dans <strong>1 mesure de lait de femme</strong> jusqu’à obtenir une crème de @consistance{cheval}.</li><li>Ajouter alors <strong>une mesure d’eau alchimiquement simple</strong> et faire chauffer jusqu’à @couleur{vert-bleu}.</li><li>Ajouter à ce moment <strong>3 pépins de candique</strong>, tirer hors du feu et mélanger jusqu’à @consistance{mouton-cheval-serpent}.</li><li>Laisser reposer au moins une heure avant utilisation.</li></ul><p>Le produit obtenu doit être translucide, signe que la manipulation a réussi.</p><p>S’il est opaque, tout est à recommencer.</p>"},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"folder":null,"sort":0,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.8","coreVersion":"10.291","createdTime":1671050435148,"modifiedTime":1675296895069,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||
{"name":"Huile de Sélikanthe","type":"recettealchimique","flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.recettes-alchimiques.lQL6PSB9k4Lczili"}},"img":"systems/foundryvtt-reve-de-dragon/icons/alchimie/recette_alchimique_huileselikanthe.webp","effects":[],"_id":"lQL6PSB9k4Lczili","system":{"description":"","descriptionmj":"","but":"Obtenir trois doses du remède alchimique.","utilisation":null,"enchantement":"","sureffet":"","manipulation":"<ul><li>Faire courir un cheval rapide jusqu’à ce qu’il soit blanc <strong>d’écume </strong>et récupérer <strong>3 doigts de cette matière</strong>.</li><li>Repérer <strong>un escargot lent</strong> et le tuer proprement.</li><li>Broyer grossièrement sa coquille, ajouter l’écume de cheval et retravailler le tout jusqu’à @consistance{cheval-lapin-serpent}.</li><li>Introduire le produit dans <strong>1 mesure d’eau alchimiquement simple</strong>, ajouter le corps de l’escargot, et porter le tout à température @couleur{blanc-blanc-noir}.</li><li>Tirer hors du feu, ajouter <strong>10 brins de muscaline</strong>, couvrir et laisser reposer une heure.</li></ul><p>Réussite : le corps de l’escargot flotte à la surface d’un liquide légérement huileux, l’huile de Sélikanthe.</p><p>Échec : il gît tout au fond.</p><p>Dans les deux cas, on peut le consommer en rajoutant un peu de luciane et de béjaune.</p>"},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"folder":null,"sort":0,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.8","coreVersion":"10.291","createdTime":1671050435148,"modifiedTime":1675297000664,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||
{"name":"Gelée Royale","type":"recettealchimique","flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.recettes-alchimiques.re4yhGa5oqyrkYgV"}},"img":"systems/foundryvtt-reve-de-dragon/icons/alchimie/recette_alchimique_geleeroyale.webp","effects":[],"_id":"re4yhGa5oqyrkYgV","system":{"description":"","descriptionmj":"","but":"Obtenir trois doses du remède alchimique.","utilisation":null,"enchantement":"","sureffet":"","manipulation":"<p>Utiliser <strong>1 mesure de gelée royale</strong> sans modification, comme au sortir de la ruche.</p>"},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"folder":null,"sort":0,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.3.13","coreVersion":"10.291","createdTime":1671050435149,"modifiedTime":1671050504077,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||
{"name":"Liqueur de Bagdol","type":"recettealchimique","flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.recettes-alchimiques.smQZKZeh8ibDGTyq"}},"img":"systems/foundryvtt-reve-de-dragon/icons/alchimie/recette_alchimique_liqueur.webp","effects":[],"_id":"smQZKZeh8ibDGTyq","system":{"description":"<p>Le <strong>madzagra </strong>est un arbuste des régions chaudes, telle la légendaire Terre de Bagdol dont il est supposé originaire. Indépendamment de ses vertus médicinales, ses graines consommées en infusion donnent une boisson corsée et tonifiante.</p>","descriptionmj":"","but":"Obtenir trois doses du remède alchimique.","utilisation":null,"enchantement":"","sureffet":"","manipulation":"<ul>\n<li>Torréfier <strong>2 écailles de graines de madzagra*</strong> en les calcinant lentement à feu nu. Le degré de torréfaction n’a aucune incidence sur la recette.</li>\n<li>Quand ils sont bien noirs, moudre les grains jusqu’à @consistance{cheval-cheval} (-1) et mettre la mouture dans un filtre de parchemin au-dessus d’un récipient.</li>\n<li>Chauffer <strong>1 mesure d’eau alchimiquement simple</strong> jusqu’à température @couleur{noir-noir} (-1) et verser lentement sur la mouture. Il doit s’en écouler un liquide noir et odorant.</li>\n<li>Examiner alors le dépôt demeuré dans le filtre.</li>\n</ul>\n<p>Réussite : l’amalgame noirâtre dessine ça et là les lettres L et B, le liquide filtré est la liqueur de Bagdol.</p>\n<p>Échec : on ne lit rien dans le marc. La boisson obtenue est néanmoins tonifiante, à consommer nature ou avec un nuage de lait, avec ou sans sucre.</p>"},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"folder":null,"sort":0,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.3.13","coreVersion":"10.291","createdTime":1671050435149,"modifiedTime":1671050504077,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||
{"name":"Cristal Alchimique","type":"recettealchimique","flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.recettes-alchimiques.udsJTXgoccqkKxLt"}},"img":"systems/foundryvtt-reve-de-dragon/icons/alchimie/recette_alchimique_cristal.webp","effects":[],"_id":"udsJTXgoccqkKxLt","system":{"description":"","descriptionmj":"","but":"Obtenir un prisme de cristal alchimique.","utilisation":null,"enchantement":"","sureffet":"","manipulation":"<ul>\n<li>Écraser <strong>12 brins de névropenthe</strong> jusqu’à obtenir une bouillie de @consistance{serpent-cheval} (-2) et laisser reposer une heure.</li>\n<li>Saupoudrer la préparation de <strong>4 pépins d’obyssum gris</strong> et reprendre le malaxage jusqu’à @consistance{serpent-cheval-serpent} (-3).</li>\n<li>Laisser reposer encore une heure. Pendant ce temps, préparer un abri à proximité du lieu de travail, capable d’intercepter des projectiles violents, une pile de sacs de sable par exemple.</li>\n<li>Ceci fait, dans <strong>un chaudron bien propre</strong>, faire chauffer à sec <strong>une livre de sable de rivière</strong> dans lequel on aura introduit<strong> une bille de plomb d’un poids de 20 écailles</strong>, et remuer l’ensemble jusqu’à @consistance{mouton-mouton-mouton} (-3). </li>\n<li>Dès que la consistance est obtenue, jeter la préparation précédente dans le chaudron et gagner l’abri le plus vite possible. L’explosion consécutive doit être extrêmement violente.</li>\n</ul>\n<p>Dans les débris déchiquetés du chaudron (qui doit être sacrifié pour l’opération), on doit normalement retrouver un prisme de cristal alchimique aux proportions parfaites.</p>\n<p>S’il n’y a pas d’explosion ou si dans les débris du chaudron on ne retrouve qu’une boule de plomb fondue, c’est que l’opération a échoué.</p>"},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"folder":null,"sort":0,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.3.13","coreVersion":"10.291","createdTime":1671050435149,"modifiedTime":1671050504077,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||
{"name":"Sable-Poudre","type":"recettealchimique","flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.recettes-alchimiques.xIn71m6BJsbpIa17"}},"img":"systems/foundryvtt-reve-de-dragon/icons/alchimie/recette_alchimique_sable.webp","effects":[],"_id":"xIn71m6BJsbpIa17","system":{"description":"","descriptionmj":"","but":"Obtenir trois doses du remède alchimique.","utilisation":null,"enchantement":"","sureffet":"","manipulation":"<ul>\n<li>Mélanger <strong>3 écailles de suie de cheminée</strong>, <strong>2 pépins de nartha</strong>, <strong>2 pépins d’obbadion</strong> et <strong>2 pépins de chramaelium</strong> jusqu’à @consistance{mouton-lapin-serpent} (-3).</li>\n<li>Faire chauffer <strong>une demi-mesure d’eau alchimiquement simple</strong> et y jeter la mixture au moment où elle atteint la température @couleur{vert-vert-glauque} (-3).</li>\n<li>Laisser évaporer à l’air libre (environ 12 heures).</li>\n</ul>\n<p>Réussite : la poudre résiduelle obtenue est blanche, c’est le sable-poudre.</p>\n<p>Échec : elle est noire ; on peut toujours la diluer dans du vinaigre pour en faire de l’encre.</p>"},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"folder":null,"sort":0,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.3.13","coreVersion":"10.291","createdTime":1671050435149,"modifiedTime":1671050504077,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||
{"name":"Perle de Bjwal","type":"recettealchimique","flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.recettes-alchimiques.zptDgl2kOGlj9tHK"}},"img":"systems/foundryvtt-reve-de-dragon/icons/alchimie/recette_alchimique_perle.webp","effects":[],"_id":"zptDgl2kOGlj9tHK","system":{"description":"<p>On obtient la <strong>poudre de nacre </strong>par disruption alchimique pratiquée sur n’importe quel coquillage (vide).</p>\n<p>Une livre de coquilles donne 4 écailles de poudre de nacre.</p>","descriptionmj":"","but":"Obtenir trois doses du remède alchimique.","utilisation":null,"enchantement":"","sureffet":"","manipulation":"<ul>\n<li>Mélanger <strong>2 pépins d’obbadion</strong>, <strong>2 écailles de poudre de nacre*</strong> et <strong>1 écaille d’oeufs de grenouille</strong> jusqu’à @consistance{mouton-renard-serpent} (-3).</li>\n<li>Chauffer <strong>une demi-mesure d’eau alchimiquement simple</strong> jusqu’à température @couleur{vert-vert} (-1) et verser sur le produit.</li>\n</ul>\n<p>Réussite : une fois la vapeur dissipée, on découvre de petits granulés translucides, ce sont les perles de Bjwal.</p>\n<p>Échec : on n’obtient qu’une flaque gélatineuse.</p>"},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"folder":null,"sort":0,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.3.13","coreVersion":"10.291","createdTime":1671050435149,"modifiedTime":1671050504077,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||
{"name":"Liqueur de Bagdol","type":"recettealchimique","flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.recettes-alchimiques.smQZKZeh8ibDGTyq"}},"img":"systems/foundryvtt-reve-de-dragon/icons/alchimie/recette_alchimique_liqueur.webp","effects":[],"_id":"smQZKZeh8ibDGTyq","system":{"description":"<p>Le <strong>madzagra </strong>est un arbuste des régions chaudes, telle la légendaire Terre de Bagdol dont il est supposé originaire. Indépendamment de ses vertus médicinales, ses graines consommées en infusion donnent une boisson corsée et tonifiante.</p>","descriptionmj":"","but":"Obtenir trois doses du remède alchimique.","utilisation":null,"enchantement":"","sureffet":"","manipulation":"<ul><li>Torréfier <strong>2 écailles de graines de madzagra*</strong> en les calcinant lentement à feu nu. Le degré de torréfaction n’a aucune incidence sur la recette.</li><li>Quand ils sont bien noirs, moudre les grains jusqu’à @consistance{cheval-cheval} et mettre la mouture dans un filtre de parchemin au-dessus d’un récipient.</li><li>Chauffer <strong>1 mesure d’eau alchimiquement simple</strong> jusqu’à température @couleur{noir-noir} et verser lentement sur la mouture. Il doit s’en écouler un liquide noir et odorant.</li><li>Examiner alors le dépôt demeuré dans le filtre.</li></ul><p>Réussite : l’amalgame noirâtre dessine ça et là les lettres L et B, le liquide filtré est la liqueur de Bagdol.</p><p>Échec : on ne lit rien dans le marc. La boisson obtenue est néanmoins tonifiante, à consommer nature ou avec un nuage de lait, avec ou sans sucre.</p>"},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"folder":null,"sort":0,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.8","coreVersion":"10.291","createdTime":1671050435149,"modifiedTime":1675296973301,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||
{"name":"Cristal Alchimique","type":"recettealchimique","flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.recettes-alchimiques.udsJTXgoccqkKxLt"}},"img":"systems/foundryvtt-reve-de-dragon/icons/alchimie/recette_alchimique_cristal.webp","effects":[],"_id":"udsJTXgoccqkKxLt","system":{"description":"","descriptionmj":"","but":"Obtenir un prisme de cristal alchimique.","utilisation":null,"enchantement":"","sureffet":"","manipulation":"<ul><li>Écraser <strong>12 brins de névropenthe</strong> jusqu’à obtenir une bouillie de @consistance{serpent-cheval} et laisser reposer une heure.</li><li>Saupoudrer la préparation de <strong>4 pépins d’obyssum gris</strong> et reprendre le malaxage jusqu’à @consistance{serpent-cheval-serpent}.</li><li>Laisser reposer encore une heure. Pendant ce temps, préparer un abri à proximité du lieu de travail, capable d’intercepter des projectiles violents, une pile de sacs de sable par exemple.</li><li>Ceci fait, dans <strong>un chaudron bien propre</strong>, faire chauffer à sec <strong>une livre de sable de rivière</strong> dans lequel on aura introduit<strong> une bille de plomb d’un poids de 20 écailles</strong>, et remuer l’ensemble jusqu’à @consistance{mouton-mouton-mouton}.</li><li>Dès que la consistance est obtenue, jeter la préparation précédente dans le chaudron et gagner l’abri le plus vite possible. L’explosion consécutive doit être extrêmement violente.</li></ul><p>Dans les débris déchiquetés du chaudron (qui doit être sacrifié pour l’opération), on doit normalement retrouver un prisme de cristal alchimique aux proportions parfaites.</p><p>S’il n’y a pas d’explosion ou si dans les débris du chaudron on ne retrouve qu’une boule de plomb fondue, c’est que l’opération a échoué.</p>"},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"folder":null,"sort":0,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.8","coreVersion":"10.291","createdTime":1671050435149,"modifiedTime":1675297080400,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||
{"name":"Sable-Poudre","type":"recettealchimique","flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.recettes-alchimiques.xIn71m6BJsbpIa17"}},"img":"systems/foundryvtt-reve-de-dragon/icons/alchimie/recette_alchimique_sable.webp","effects":[],"_id":"xIn71m6BJsbpIa17","system":{"description":"","descriptionmj":"","but":"Obtenir trois doses du remède alchimique.","utilisation":null,"enchantement":"","sureffet":"","manipulation":"<ul><li>Mélanger <strong>3 écailles de suie de cheminée</strong>, <strong>2 pépins de nartha</strong>, <strong>2 pépins d’obbadion</strong> et <strong>2 pépins de chramaelium</strong> jusqu’à @consistance{mouton-lapin-serpent}.</li><li>Faire chauffer <strong>une demi-mesure d’eau alchimiquement simple</strong> et y jeter la mixture au moment où elle atteint la température @couleur{vert-vert-glauque}.</li><li>Laisser évaporer à l’air libre (environ 12 heures).</li></ul><p>Réussite : la poudre résiduelle obtenue est blanche, c’est le sable-poudre.</p><p>Échec : elle est noire ; on peut toujours la diluer dans du vinaigre pour en faire de l’encre.</p>"},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"folder":null,"sort":0,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.8","coreVersion":"10.291","createdTime":1671050435149,"modifiedTime":1675296828382,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||
{"name":"Perle de Bjwal","type":"recettealchimique","flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.recettes-alchimiques.zptDgl2kOGlj9tHK"}},"img":"systems/foundryvtt-reve-de-dragon/icons/alchimie/recette_alchimique_perle.webp","effects":[],"_id":"zptDgl2kOGlj9tHK","system":{"description":"<p>On obtient la <strong>poudre de nacre </strong>par disruption alchimique pratiquée sur n’importe quel coquillage (vide).</p>\n<p>Une livre de coquilles donne 4 écailles de poudre de nacre.</p>","descriptionmj":"","but":"Obtenir trois doses du remède alchimique.","utilisation":null,"enchantement":"","sureffet":"","manipulation":"<ul><li>Mélanger <strong>2 pépins d’obbadion</strong>, <strong>2 écailles de poudre de nacre*</strong> et <strong>1 écaille d’oeufs de grenouille</strong> jusqu’à @consistance{mouton-renard-serpent}.</li><li>Chauffer <strong>une demi-mesure d’eau alchimiquement simple</strong> jusqu’à température @couleur{vert-vert} et verser sur le produit.</li></ul><p>Réussite : une fois la vapeur dissipée, on découvre de petits granulés translucides, ce sont les perles de Bjwal.</p><p>Échec : on n’obtient qu’une flaque gélatineuse.</p>"},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"folder":null,"sort":0,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.8","coreVersion":"10.291","createdTime":1671050435149,"modifiedTime":1675296926695,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||
|
@ -16,7 +16,7 @@
|
||||
{"_id":"cM9eo2VuJSCkIZvd","name":"Cécité","type":"sort","flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.sorts-thanatos.cM9eo2VuJSCkIZvd"}},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_thanatos.webp","effects":[],"system":{"description":"<p>Quand la victime est entièrement possédée de corps, le haut-rêvant de Thanatos peut commencer l'envoûtement de Cécité. Chaque ensemble de 2 points de rêve dépensés (2r), fait perdre 1 point de caractéristique VUE à la victime. A zéro point de VUE, elle est aveugle. La cécité semble inexplicable, et aucune médecine ne peut la guérir. Annuler la possession brise en même temps l'envoûtement de Cécité, et la victime recouvre instantanément toute sa VUE.</p>","descriptionmj":"","draconic":"Voie de Thanatos","duree":"Illimitée","JR":"Aucun","cible":"Relique","difficulte":"-8","portée":"","caseTMR":"cite","caseTMRspeciale":"","ptreve":"2+","xp":0,"bonuscase":"","isrituel":false,"coutseuil":0,"portee":""},"ownership":{"default":0,"6ibmdmaeRSMTjU4c":3},"folder":null,"sort":0,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.0.32","coreVersion":"10.288","createdTime":1667259843441,"modifiedTime":1667260048926,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||
{"_id":"dK54iZkb7ypIuKwn","name":"Peur thanataire","type":"sort","flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.sorts-thanatos.dK54iZkb7ypIuKwn"}},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_thanatos.webp","effects":[],"system":{"description":"<p>Le sort de Peur Thanataire doit être ciblé sur un objet, lequel, et jusqu'à la fin de l'heure de naissance du haut-rêvant, distillera ensuite une peur intense. Toute personne apercevant l'objet en question et manquant un jet de résistance standard r-8, sera contrainte de s'en détourner, ne pouvant supporter de le regarder ni de s'en approcher ou le regarder le(s) round(s) suivant(s), il faudra réussir unjet de VOLONTÉ ajusté négativement aux points de rêve dépensés. Même chose pour le toucher, le prendre, le frapper. Ce jet de VOLONTÉ doit être renouvelé de round en round jusqu'à ce qui réussisse.</p>\n<p>Le haut-rêvant de Thanatos est lui-même immunisé contre les effets de sa peur thanataire. Par ailleurs, comme c'est la seule vue de l'objet qui déclenche la peur, il n'y a aucun effet tant que l'objet est dissimulé, dans une poche par exemple.</p>","descriptionmj":"","draconic":"Voie de Thanatos","duree":"HN","JR":"r-8","cible":"Un objet","difficulte":"-9","portée":"","caseTMR":"lac","caseTMRspeciale":"","ptreve":"1+","xp":0,"bonuscase":"","isrituel":false,"coutseuil":0,"portee":""},"ownership":{"default":0,"6ibmdmaeRSMTjU4c":3},"folder":null,"sort":0,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.0.32","coreVersion":"10.288","createdTime":1667259843442,"modifiedTime":1667260048928,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||
{"_id":"gZHrkEnR88mEv67I","name":"Griffe de Thanatos *","type":"sort","flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.sorts-thanatos.gZHrkEnR88mEv67I"}},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_thanatos.webp","effects":[],"system":{"description":"<p>Placée en guise d'écaille de pouvoir sur un objet enchanté, la griffe de Thanatos n'est qu'un piège. Son fonctionnement intervient au moment de la maîtrise. Cette dernière est automatique, comme avec les écailles de Narcos, mais au lieu de coûter des points de rêve, elle coûte un nombre de <em>points de vie</em> égal au nombre de griffes, chaque point de vie perdu s'accompagnant d'une perte d'1d6 points d'endurance. Il n'y a pas de jet de résistance. La maîtrise (et la perte de points de vie) a lieu au moment où l'objet contenant la griffe est utilisé selon sa fonction : arme frappant, bague au doigt, bracelet au poignet, etc. Si l'objet n'a pas de fonction évidente, statuette, bibelot, ou s'il n'est qu'une gemme seule, la maîtrise a lieu dès que l'objet est pris dasn la main nue.</p>\n<p>Un objet peut n'avoir qu'une gemme contenant une ou plusieurs griffes de Thanatos, ce n'est alors qu'un piège en soi ; il peut avoir avoir plusieurs gemmes, grâce à Individualité, certaines possédant des pouvoirs réels (écailles de Narcos), et l'une d'entre elles ne possédant que des griffes de Thanatos. La maîtrise de la grifef (perte de points de vie) accompagne alors la maîtrise de chacun des vrais pouvoirs. Le créateur de l'objet, le maîtrisant tacitement, n'a pas à subir de perte de points de vie, mais si l'objet est maîtrisé par quelqu'un d'autre et lui revient, il en subit les conséquences. Les points de vie perdus sont regagnés selon la règle normale.</p>","descriptionmj":"","draconic":"Voie de Thanatos","duree":"Permanente","JR":"Aucun","cible":"","difficulte":"-8","portée":"","caseTMR":"necropole","caseTMRspeciale":"","ptreve":"8","xp":0,"bonuscase":"","isrituel":true,"coutseuil":1,"portee":""},"ownership":{"default":0,"6ibmdmaeRSMTjU4c":3},"folder":null,"sort":0,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.0.32","coreVersion":"10.288","createdTime":1667259843442,"modifiedTime":1667260048926,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||
{"_id":"qaCjZ5V874ZImf9l","name":"Griffe morbide de Thanatos *","type":"sort","flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.sorts-thanatos.qaCjZ5V874ZImf9l"}},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_thanatos.webp","effects":[],"system":{"description":"<p>Le principe de fonctionnement de la griffe morbide de Thanatos est analogue à celui de la simple griffe. C'en est une variante plus mortelle. La maîtrise ayant lieu, la victime perd autant de points de vie qu'il y a de griffes morbides, ainsi que 1d6 points d'endurance par point de vie perdu, puis joue une JR standard r-8. JR réussi, l'effet s'arrête là ; JR échoué, le mal s'est implanté en elle. Tous les jours, à l'extrême fin du Château Dormant, la victime de la griffe morbide doit tenter un jet de Vie et en appliquer les résultats suivants : 20 = perte de 2 points de vie ; échec = perte de 1 point de vie ; réussite = pas de perte pour aujoud'hui ; 01 = prochain jet de Vie joué le surlendemain au lieu du lendemain. Il n'y a qu'un jet de Vie par jour quel que soit le nombre de griffes morbides.</p>\n<p>Tant que dure l'effet de la griffe morbide, la victime ne peut regagner ses points de vie par aucun moyen, pas même par une potion enchantée. Le seul moyen de la tirer d'affaire est d'annuler magiquement l'effet que les griffes morbides ont sur elle. Une Lecture d'Aura précise doit avoir lieu, ciblée surla victime pour déterminer à quel case de marais spécifique est lié son mal. Puis celui-ci peut-être annulé par un rituel d'Annulation de Magie R-11 r11, accompli une seule fois quel que soit le nombre de griffes morbides. Noter que seul l'effet sur la victime est annulé, pas l'existence des griffes morbides sur l'objet. Annuler l'effet sur la victime ne coûte pas de point de seuil.</p>","descriptionmj":"","draconic":"Voie de Thanatos","duree":"Permanente","JR":"Partiel","cible":"","difficulte":"-11","portée":"","caseTMR":"marais","caseTMRspeciale":"","ptreve":"11","xp":0,"bonuscase":"","isrituel":true,"coutseuil":1,"portee":""},"ownership":{"default":0,"6ibmdmaeRSMTjU4c":3},"folder":null,"sort":0,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.0.32","coreVersion":"10.288","createdTime":1667259843442,"modifiedTime":1667260048927,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||
{"_id":"qaCjZ5V874ZImf9l","name":"Griffe morbide de Thanatos *","type":"sort","flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.sorts-thanatos.qaCjZ5V874ZImf9l"}},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_thanatos.webp","effects":[],"system":{"description":"<p>Le principe de fonctionnement de la griffe morbide de Thanatos est analogue à celui de la simple griffe. C'en est une variante plus mortelle. La maîtrise ayant lieu, la victime perd autant de points de vie qu'il y a de griffes morbides, ainsi que 1d6 points d'endurance par point de vie perdu, puis joue une JR standard r-8. JR réussi, l'effet s'arrête là ; JR échoué, le mal s'est implanté en elle. Tous les jours, à l'extrême fin du Château Dormant, la victime de la griffe morbide doit tenter un jet de Vie et en appliquer les résultats suivants : 20 = perte de 2 points de vie ; échec = perte de 1 point de vie ; réussite = pas de perte pour aujourd'hui ; 01 = prochain jet de Vie joué le surlendemain au lieu du lendemain. Il n'y a qu'un jet de Vie par jour quel que soit le nombre de griffes morbides.</p><p>Tant que dure l'effet de la griffe morbide, la victime ne peut regagner ses points de vie par aucun moyen, pas même par une potion enchantée. Le seul moyen de la tirer d'affaire est d'annuler magiquement l'effet que les griffes morbides ont sur elle. Une Lecture d'Aura précise doit avoir lieu, ciblée surla victime pour déterminer à quel case de marais spécifique est lié son mal. Puis celui-ci peut-être annulé par un rituel d'Annulation de Magie R-11 r11, accompli une seule fois quel que soit le nombre de griffes morbides. Noter que seul l'effet sur la victime est annulé, pas l'existence des griffes morbides sur l'objet. Annuler l'effet sur la victime ne coûte pas de point de seuil.</p>","descriptionmj":"<p>Ajouter à la victime un effet de @UUID[Compendium.foundryvtt-reve-de-dragon.maladies-et-poisons.pUN57Ma4SJv1kvor]{Poison: Griffe morbide de Thanatos} pour bloquer la récupération naturelle</p>","draconic":"Voie de Thanatos","duree":"Permanente","JR":"Partiel","cible":"","difficulte":"-11","portée":"","caseTMR":"marais","caseTMRspeciale":"","ptreve":"11","xp":0,"bonuscase":"","isrituel":true,"coutseuil":1,"portee":""},"ownership":{"default":0,"6ibmdmaeRSMTjU4c":3},"folder":null,"sort":0,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.9","coreVersion":"10.291","createdTime":1667259843442,"modifiedTime":1675386797163,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||
{"_id":"tFNWrWlOzCmYPYdG","name":"Possession de Corps","type":"sort","flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.sorts-thanatos.tFNWrWlOzCmYPYdG"}},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_thanatos.webp","effects":[],"system":{"description":"<p>Pour posséder de corps une victime, le haut-rêvant de Thanatos doit prendre son entière contitution sous son contrôle. Le ciblage du rituel doit s'effectuer en touchant la relique. Pour chaque ensemble de 2 points de rêve dépensés (2r), le haut-rêvant contrôle 1 point de CONSTITUTION de sa victime. Dès qu'il la contrôle entièrement, elle est possédée de corps. Pour posséder une victime ayant une CONSTITUTION de 14, il faut ainsi dépenser 28 points de rêve. Le haut-rêvant peut s'y prendre en plusieurs fois, mais la victime a droit à un JR à chaque fois, et il suffit qu'un seul d'entre eux réussisse pour annuler toute la possessions précédemment accomplie ; simultanément, le haut-rêvant de Thanataos doit lui-même réussir un JR r0 (points de rêve à zéro) ou être frappé en retour par un souffle de Dragon. </p>\n<p><em>Note</em>. Le haut-râvant ne fait que <em>contrôler</em> la CONSTITUTION de sa victime, celle-ci n'en perd aucun point. Tant qu'aucun envoûtement n'est à l'oeuvre, il n'y a aucun effet physique, et la victime ne se rend même compte de rien.</p>","descriptionmj":"","draconic":"Voie de Thanatos","duree":"Illimitée","JR":"Avec HN r-9, sans HN r-8","cible":"Relique","difficulte":"-9","portée":"","caseTMR":"marais","caseTMRspeciale":"","ptreve":"2+","xp":0,"bonuscase":"","isrituel":true,"coutseuil":0,"portee":""},"ownership":{"default":0,"6ibmdmaeRSMTjU4c":3},"folder":null,"sort":0,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.0.32","coreVersion":"10.288","createdTime":1667259843442,"modifiedTime":1667260048928,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||
{"_id":"wGXeubRhLPScDkNF","name":"Possession d'Esprit","type":"sort","flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.sorts-thanatos.wGXeubRhLPScDkNF"}},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_thanatos.webp","effects":[],"system":{"description":"<p>Pour posséder d'esprit une victime, le haut-rêvant de Thanatos doit prendre son entière volonté sous son contrôle. Le ciblage du rituel doit s'effectuer en touchant la relique. Pour chaque ensemble de 2 points de rêve dépensés (2r), le haut-rêvant contrôle 1 point de VOLONTÉ de sa victime. Dès qu'il la contrôle entièrement, elle est possédée d'esprit. Pour posséder une victime ayant une VOLONTÉ de 14, il faut ainsi dépenser 28 points de rêve. Le haut-rêvant peut s'y prendre en plusieurs fois, mais la victime a droit à un JR à chaque fois, et il suffit qu'un seul d'entre eux réussisse pour annuler toute la possessions précédemment accomplie ; simultanément, le haut-rêvant de Thanataos doit lui-même réussir un JR r0 (points de rêve à zéro) ou être frappé en retour par un souffle de Dragon. </p>\n<p><em>Note</em>. Le haut-rêvant ne fait que <em>contrôler</em> la VOLONTÉ de sa victime, celle-ci n'en perd aucun point. Tant qu'aucun envoûtement n'est à l'oeuvre, il n'y a aucun effet mental, et la victime ne se rend même compte de rien.</p>","descriptionmj":"","draconic":"Voie de Thanatos","duree":"Illimitée","JR":"Avec HN r-9, sans HN r-8","cible":"Relique","difficulte":"-9","portée":"","caseTMR":"lac","caseTMRspeciale":"","ptreve":"2+","xp":0,"bonuscase":"","isrituel":true,"coutseuil":0,"portee":""},"ownership":{"default":0,"6ibmdmaeRSMTjU4c":3},"folder":null,"sort":0,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.0.32","coreVersion":"10.288","createdTime":1667259843442,"modifiedTime":1667260048928,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||
{"_id":"wuqqLld48IagimXp","name":"Poing de Thanatos","type":"sort","flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.sorts-thanatos.wuqqLld48IagimXp"}},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_thanatos.webp","effects":[],"system":{"description":"<p>Le Poing de Thanatos peut être dirigé contre toute créature, humanoïde ou animal. Son effet, instantané, est celui d'un violent coup de poing en pleine tête, ne causant toutefois ses dommages que sur la table des Coups non mortels. Le +dom de l'agression est égal au nombre de points de rêve dépensés. Sauf pour les animaux qui peuvent faire jouer entièrement leur protection naturelle ainsi que pour les humanoïdes de grande TAILLE qui en possèdent, la protection applicable peut être au maximum de 2 points. Si la victime réussit son JR standard r-8, le haut-rêvant de Thanatos doit jouer un JR r0 (points de rêve à zéro) ou subir l'effet de son sort en retour.</p>","descriptionmj":"","draconic":"Voie de Thanatos","duree":"Instantanée","JR":"r-8","cible":"Toutes créatures","difficulte":"-6","portée":"","caseTMR":"plaines","caseTMRspeciale":"","ptreve":"1+","xp":0,"bonuscase":"","isrituel":false,"coutseuil":0,"portee":""},"ownership":{"default":0,"6ibmdmaeRSMTjU4c":3},"folder":null,"sort":0,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.0.32","coreVersion":"10.288","createdTime":1667259843442,"modifiedTime":1667260048928,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||
|
@ -80,7 +80,8 @@
|
||||
|
||||
--background-custom-button: linear-gradient(to bottom, rgba(33, 55, 74, 0.988) 5%, rgba(21, 40, 51, 0.671) 100%);
|
||||
--background-custom-button-hover: linear-gradient(to bottom, rgb(128, 0, 0) 5%, rgb(62, 1, 1) 100%);
|
||||
--background-tooltip: rgba(220,220,210,0.95);
|
||||
--background-control-selected: linear-gradient(to bottom, hsla(0, 100%, 25%, 0.5) 5%, hsla(0, 100%, 12%, 0.5) 100%);
|
||||
--background-tooltip: hsla(60, 12%, 85%, 0.95);
|
||||
--background-error:hsla(16, 100%, 50%, 0.8);
|
||||
}
|
||||
|
||||
@ -250,7 +251,10 @@ nav.sheet-tabs .item:after {
|
||||
|
||||
/* =================== Autres ============ */
|
||||
|
||||
.tabs .item.active, .blessures-list li ul li:first-child:hover, a:hover {
|
||||
.tabs .item.active,
|
||||
.blessures-list li ul li:first-child:hover,
|
||||
i.moral-radio-checkmark-off:hover,
|
||||
a:hover {
|
||||
text-shadow: 1px 0px 0px #ff6600;
|
||||
}
|
||||
|
||||
@ -514,7 +518,7 @@ input:is(.blessure-premiers_soins, .blessure-soins_complets) {
|
||||
border: 0;
|
||||
vertical-align: bottom;
|
||||
}
|
||||
:is(.button-img,.button-effect-img:hover,.small-button-direction):hover {
|
||||
:is(.button-img,.button-effect-img,.small-button-direction):hover {
|
||||
color: var(--color-controls-hover);
|
||||
border: 1px solid var(--color-control-border-hover);
|
||||
text-shadow: 1px 0px 0px #ff6600;
|
||||
@ -602,13 +606,13 @@ input:is(.blessure-premiers_soins, .blessure-soins_complets) {
|
||||
margin-right: 0.2rem;
|
||||
margin-left: 0.2rem;
|
||||
}
|
||||
.rdd.sheet .window-content .sheet-body .carac-list .caracteristique .flex-grow-1 {
|
||||
.flex-grow-1 {
|
||||
flex-grow: 1;
|
||||
}
|
||||
.rdd.sheet .window-content .sheet-body .carac-list .caracteristique .flex-grow-2 {
|
||||
.flex-grow-2 {
|
||||
flex-grow: 2;
|
||||
}
|
||||
.rdd.sheet .window-content .sheet-body .carac-list .caracteristique .flex-grow-3 {
|
||||
.flex-grow-3 {
|
||||
flex-grow: 3;
|
||||
}
|
||||
|
||||
@ -633,6 +637,7 @@ input:is(.blessure-premiers_soins, .blessure-soins_complets) {
|
||||
border: 2;
|
||||
min-height: 8rem;
|
||||
padding: 0 3px;
|
||||
align-items: top;
|
||||
}
|
||||
|
||||
.small-editor {
|
||||
@ -641,6 +646,13 @@ input:is(.blessure-premiers_soins, .blessure-soins_complets) {
|
||||
padding: 0 3px;
|
||||
}
|
||||
|
||||
.foundryvtt-reve-de-dragon.sheet :is(.large-editor,.editor,.medium-editor,.small-editor){
|
||||
align-items: start;
|
||||
}
|
||||
.foundryvtt-reve-de-dragon.sheet :is(.large-editor,.editor,.medium-editor,.small-editor) .editor.prosemirror{
|
||||
align-items: normal;
|
||||
}
|
||||
|
||||
.foundryvtt-reve-de-dragon .tox .tox-editor-container {
|
||||
background: #fff;
|
||||
}
|
||||
@ -988,7 +1000,7 @@ ul, li {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
}
|
||||
.sheet input.recherche {
|
||||
:is(.sheet, div.fenetre-recherche div.section-filters-text) input.recherche {
|
||||
background-image: url("img/ui/icon-search.svg");
|
||||
background-position: 0.1rem 0.1rem;
|
||||
background-size: 1rem;
|
||||
@ -997,6 +1009,10 @@ ul, li {
|
||||
max-height: 1.2rem;
|
||||
}
|
||||
|
||||
span.embed-inline {
|
||||
display: inline-flex;
|
||||
}
|
||||
|
||||
.alterne-list > .list-item:hover {
|
||||
background: rgba(100, 100, 50, 0.25);
|
||||
}
|
||||
@ -1548,213 +1564,176 @@ table.table-nombres-astraux tr:hover {
|
||||
position: absolute;
|
||||
display: block;
|
||||
}
|
||||
.calendar{
|
||||
min-width: 150px;
|
||||
grid-row: 1;
|
||||
grid-column: 1;
|
||||
|
||||
.calendar {
|
||||
min-width: 250px;
|
||||
width: fit-content;
|
||||
height: 6rem;
|
||||
|
||||
display: grid;
|
||||
grid-row: 2;
|
||||
grid-column: 9;
|
||||
|
||||
min-height: 5rem;
|
||||
height: fit-content;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
border: 1px solid #000;
|
||||
border-radius: 3%;
|
||||
background: rgba(0, 0, 0, 0.5);
|
||||
border-radius: 0.3rem;
|
||||
background: hsla(0, 0%, 0%, 0.5);
|
||||
font-family: "GoudyAcc";
|
||||
z-index: 100;
|
||||
}
|
||||
.calendar-hdr{
|
||||
display: grid;
|
||||
font-size: 1rem;
|
||||
margin: 0.1rem;
|
||||
padding: 0.2rem;
|
||||
height: fit-content;
|
||||
width: fit-content;
|
||||
min-width: 200px;
|
||||
border-bottom: 1px solid #111;
|
||||
color: #CCC;
|
||||
float: left;
|
||||
}
|
||||
.calendar-date-rdd {
|
||||
font-family: "GoudyAcc";
|
||||
|
||||
.calendar-title {
|
||||
grid-column: 1 / span 7;
|
||||
grid-row: 1;
|
||||
|
||||
color: #CCC;
|
||||
opacity: 90;
|
||||
font-size: 0.9rem;
|
||||
text-align: center;
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
border: none;
|
||||
flex: 1;
|
||||
}
|
||||
.calendar-date{
|
||||
grid-row: 1;
|
||||
grid-column: 2;
|
||||
float: left;
|
||||
text-align: center;
|
||||
padding-top: 0px;
|
||||
padding-bottom: 0px;
|
||||
margin-bottom: 5px;
|
||||
color: #CCC;
|
||||
cursor: pointer;
|
||||
.calendar-options {
|
||||
grid-column: 8 / span 2;
|
||||
}
|
||||
.calendar-date,
|
||||
.calendar-date-num {
|
||||
transition: 0.2s;
|
||||
.calendar-title,.calendar-options{
|
||||
border-bottom: 1px solid hsla(0, 0%, 80%, 0.5);
|
||||
}
|
||||
.calendar-date-num {
|
||||
grid-row: 1;
|
||||
grid-column: 2;
|
||||
float: left;
|
||||
text-align: center;
|
||||
padding-top: 0px;
|
||||
padding-bottom: 0px;
|
||||
margin-bottom: 5px;
|
||||
color: #CCC;
|
||||
opacity: 0;
|
||||
cursor: pointer;
|
||||
|
||||
.calendar-avance-heure {
|
||||
grid-column: 1 / span 3;
|
||||
}
|
||||
.calendar-heure-img{
|
||||
width: 24px;
|
||||
height: 24px;
|
||||
flex-grow: 0;
|
||||
border-width: 0;
|
||||
opacity: 90;
|
||||
color: rgba(255, 255, 255, 0.5);
|
||||
|
||||
.calendar-change-heure {
|
||||
grid-column: 9 / span 1;
|
||||
}
|
||||
.calendar-hdr:hover .calendar-date {
|
||||
opacity: 0;
|
||||
|
||||
.calendar-change-heure .calendar-change-heure-grid {
|
||||
display: grid;
|
||||
grid-column: 1;
|
||||
grid-row: 2;
|
||||
|
||||
margin: 2px;
|
||||
grid-row-gap: 3px;
|
||||
color: hsla(0, 0%, 80%, 0.5);
|
||||
}
|
||||
.calendar-hdr:hover .calendar-date-num{
|
||||
opacity: 1;
|
||||
}
|
||||
.calendar-container{
|
||||
min-width: 250px;
|
||||
padding-top: 3px;
|
||||
padding-bottom: 20px;
|
||||
}
|
||||
.calendar-btn-container-left{
|
||||
width: 25%;
|
||||
|
||||
.calendar-avance-heure .calendar-avance-heure-grid {
|
||||
display: grid;
|
||||
float: left;
|
||||
grid-column: 3;
|
||||
grid-row: 2;
|
||||
|
||||
margin: 2px;
|
||||
grid-row-gap: 3px;
|
||||
color: rgba(0, 0, 0, 0.5);
|
||||
color: hsla(0, 0%, 80%, 0.5);
|
||||
}
|
||||
.calendar-btn-container-right{
|
||||
width: 15%;
|
||||
|
||||
.calendar-avance-heure .calendar-avance-heure-grid:hover {
|
||||
color: #FFF;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.calendar-affiche-heure {
|
||||
grid-column: 4 / span 4;
|
||||
grid-row: 2;
|
||||
}
|
||||
|
||||
.calendar-affiche-heure .calendar-horloge {
|
||||
display: grid;
|
||||
float: right;
|
||||
margin: 2px;
|
||||
grid-row-gap: 3px;
|
||||
max-width: 100px;
|
||||
float: left;
|
||||
padding-top: 0px;
|
||||
padding-bottom: 0px;
|
||||
margin: 0 0.3rem 0 0.3rem;
|
||||
color: #CCC;
|
||||
text-align: center;
|
||||
}
|
||||
.astrologie-btn-edit,
|
||||
.calendar-btn-edit{
|
||||
|
||||
.calendar-affiche-heure .calendar-horloge .calendar-heure-texte {
|
||||
font-size: 1.1rem;
|
||||
}
|
||||
.calendar-affiche-heure .calendar-horloge .calendar-minute-texte {
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
.calendar-affiche-heure .calendar-horloge .calendar-heure-img{
|
||||
width: 2rem;
|
||||
height: 2rem;
|
||||
float: left;
|
||||
flex-grow: 0;
|
||||
padding: 0.1rem;
|
||||
border: 0;
|
||||
opacity: 0.9;
|
||||
color: hsla(0, 0%, 100%, 0.5);
|
||||
}
|
||||
|
||||
.calendar :is(.calendar-astrologie,.calendar-set-datetime) {
|
||||
grid-row: 1;
|
||||
grid-column: 1;
|
||||
}
|
||||
:is(.astrologie-btn-edit,.calendar-btn-edit,.calendar-btn){
|
||||
margin: auto;
|
||||
.calendar :is(.calendar-astrologie,.calendar-set-datetime,.calendar-btn) {
|
||||
color: hsla(0, 0%, 100%, 0.5);
|
||||
border: 1px solid rgba(0, 0, 0, 0);
|
||||
color: rgba(255, 255, 255, 0.5);
|
||||
}
|
||||
:is(.astrologie-btn-edit,.calendar-btn-edit,.calendar-btn):hover {
|
||||
color: var(--color-controls-hover);
|
||||
.calendar :is(.calendar-astrologie,.calendar-set-datetime,.calendar-btn):hover {
|
||||
color: var(--color-controls-hover);
|
||||
border: 1px solid var(--color-control-border-hover);
|
||||
cursor: pointer;
|
||||
}
|
||||
.calendar .calendar-affiche-heure .calendar-horloge a {
|
||||
border: 1px solid rgba(0, 0, 0, 0);
|
||||
}
|
||||
.calendar .calendar-affiche-heure .calendar-horloge a:hover {
|
||||
color: var(--color-controls-hover);
|
||||
border: 1px solid var(--color-control-border-hover);
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.calendar-1min{
|
||||
.calendar-avance-heure .calendar-1min {
|
||||
grid-row: 1;
|
||||
grid-column: 1;
|
||||
margin-left: 0.2rem;
|
||||
}
|
||||
.calendar-5min{
|
||||
.calendar-avance-heure .calendar-5min {
|
||||
grid-row: 1;
|
||||
grid-column: 2;
|
||||
}
|
||||
.calendar-15min{
|
||||
.calendar-avance-heure .calendar-15min {
|
||||
grid-row: 1;
|
||||
grid-column: 3;
|
||||
margin-right: 0.2rem;
|
||||
}
|
||||
|
||||
.calendar-30min{
|
||||
.calendar-avance-heure .calendar-30min {
|
||||
grid-row: 2;
|
||||
grid-column: 1;
|
||||
margin-left: 0.2rem;
|
||||
}
|
||||
|
||||
.calendar-60min{
|
||||
.calendar-avance-heure .calendar-60min {
|
||||
grid-row: 2;
|
||||
grid-column: 2;
|
||||
}
|
||||
.calendar-1heure{
|
||||
.calendar-avance-heure .calendar-1heure {
|
||||
grid-row: 2;
|
||||
grid-column: 3;
|
||||
margin-right: 0.2rem;
|
||||
}
|
||||
|
||||
.calendar-lyre{
|
||||
grid-row: 1;
|
||||
grid-column: 1;
|
||||
margin-left: 0.2rem;
|
||||
margin-right: 0.2rem;
|
||||
}
|
||||
|
||||
.calendar-vaisseau{
|
||||
.calendar-vaisseau {
|
||||
grid-row: 2;
|
||||
grid-column: 1;
|
||||
margin-left: 0.2rem;
|
||||
margin-right: 0.2rem;
|
||||
}
|
||||
.img-calendar-forward{
|
||||
color: rgba(255, 255, 255, 0.5);
|
||||
|
||||
.calendar-change-heure .calendar-btn:is(.calendar-lyre,.calendar-vaisseau) img {
|
||||
color: hsla(0, 0%, 100%, 0.5);
|
||||
vertical-align: bottom;
|
||||
max-width: 1.2em;
|
||||
max-height: 1.2em;
|
||||
border-width: 0;
|
||||
}
|
||||
|
||||
.calendar-btn-container-left:hover{
|
||||
color: #FFF;
|
||||
border: 0px solid #000;
|
||||
cursor: pointer;
|
||||
}
|
||||
.calendar-weekday-time{
|
||||
display: grid;
|
||||
float: left;
|
||||
width: 55%;
|
||||
padding-top: 0px;
|
||||
padding-bottom: 0px;
|
||||
margin: auto;
|
||||
color: #CCC;
|
||||
}
|
||||
.calendar-weekday {
|
||||
grid-column: 1;
|
||||
grid-row: 1;
|
||||
text-align: center;
|
||||
font-size: 1.1rem;
|
||||
margin: auto;
|
||||
}
|
||||
.calendar-time{
|
||||
grid-column: 1;
|
||||
grid-row: 2;
|
||||
text-align: center;
|
||||
margin: auto;
|
||||
cursor: pointer;
|
||||
display: inline-flex;
|
||||
}
|
||||
.calendar-nombre-astral{
|
||||
grid-column: 2;
|
||||
grid-row: 2;
|
||||
font-size: 1.1rem;
|
||||
text-align: right;
|
||||
margin: auto;
|
||||
cursor: pointer;
|
||||
display: inline-flex;
|
||||
}
|
||||
.calendar-time-disp{
|
||||
position: relative;
|
||||
bottom: 6px;
|
||||
div.calendar-timestamp-edit select.calendar-signe-heure {
|
||||
width: max-content;
|
||||
}
|
||||
|
||||
/* Tooltip container */
|
||||
@ -1962,26 +1941,26 @@ div.vl {
|
||||
width: 1px;
|
||||
flex-grow: 0;
|
||||
}
|
||||
div.fenetre-recherche div.recherche {
|
||||
div.fenetre-recherche div.zone-recherche {
|
||||
display: flex;
|
||||
}
|
||||
div.fenetre-recherche div.recherche div.filtres {
|
||||
div.fenetre-recherche div.zone-recherche div.filtres {
|
||||
width: fit-content;
|
||||
min-width: 200px;
|
||||
float: left;
|
||||
}
|
||||
div.fenetre-recherche div.titre-fenetre-recherche {
|
||||
div.fenetre-recherche div.titre-resultats-recherche {
|
||||
flex-basis: 0;
|
||||
max-height: fit-content;
|
||||
}
|
||||
div.fenetre-recherche div.liste-resultats {
|
||||
div.fenetre-recherche div.liste-resultats-recherche {
|
||||
display: flex;
|
||||
flex: auto;
|
||||
flex-flow: row wrap;
|
||||
flex-direction: row;
|
||||
align-content: flex-start ;
|
||||
}
|
||||
div.fenetre-recherche div.liste-resultats div.resultat {
|
||||
div.fenetre-recherche div.liste-resultats-recherche div.resultat {
|
||||
width: fit-content;
|
||||
margin: 0.2rem 0.5rem;
|
||||
}
|
||||
|
@ -1,8 +1,8 @@
|
||||
{
|
||||
"id": "foundryvtt-reve-de-dragon",
|
||||
"title": "Rêve de Dragon",
|
||||
"version": "10.6.6",
|
||||
"download": "https://www.uberwald.me/gitea/public/foundryvtt-reve-de-dragon/archive/foundryvtt-reve-de-dragon-10.6.6.zip",
|
||||
"version": "10.6.15",
|
||||
"download": "https://www.uberwald.me/gitea/public/foundryvtt-reve-de-dragon/archive/foundryvtt-reve-de-dragon-10.6.15.zip",
|
||||
"manifest": "https://www.uberwald.me/gitea/public/foundryvtt-reve-de-dragon/raw/v10/system.json",
|
||||
"compatibility": {
|
||||
"minimum": "10",
|
||||
@ -379,4 +379,4 @@
|
||||
"flags": {}
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
|
@ -528,6 +528,16 @@
|
||||
"label": "Experience",
|
||||
"isInput": true
|
||||
}
|
||||
},
|
||||
"sommeil": {
|
||||
"nouveaujour": false,
|
||||
"date":{
|
||||
"indexDate": -1,
|
||||
"indexMinute": 0
|
||||
},
|
||||
"insomnie": false,
|
||||
"moral": "",
|
||||
"heures": 0
|
||||
}
|
||||
}
|
||||
},
|
||||
|
@ -67,7 +67,7 @@
|
||||
{{!-- Description Tab --}}
|
||||
<div class="tab description" data-group="primary" data-tab="description">
|
||||
<div class="form-group large-editor">
|
||||
{{editor description target="system.description" button=true owner=owner editable=editable engine="prosemirror"}}
|
||||
{{editor description target="system.description" button=true owner=options.isOwner editable=options.editable engine="prosemirror"}}
|
||||
</div>
|
||||
|
||||
{{>"systems/foundryvtt-reve-de-dragon/templates/actor/editor-notes-mj.html"}}
|
||||
|
@ -44,7 +44,7 @@
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group large-editor">
|
||||
{{editor description target="system.description" button=true owner=owner editable=editable engine="prosemirror"}}
|
||||
{{editor description target="system.description" button=true owner=options.isOwner editable=options.editable engine="prosemirror"}}
|
||||
</div>
|
||||
{{>"systems/foundryvtt-reve-de-dragon/templates/actor/editor-notes-mj.html"}}
|
||||
|
||||
|
@ -61,7 +61,7 @@
|
||||
<i class="fa-regular fa-filter"></i> Filtrer
|
||||
{{/if}}
|
||||
</a></span>
|
||||
<span>
|
||||
<span class="embed-inline">
|
||||
<input class="recherche flex-grow" type="text" value="{{options.recherche.text}}" name="recherche" size="8" data-dtype="String" placeholder=""/>
|
||||
</span>
|
||||
<span>
|
||||
@ -190,11 +190,11 @@
|
||||
<article class="flexcol">
|
||||
<h3>Biographie : </h3>
|
||||
<div class="form-group large-editor">
|
||||
{{editor biographie target="system.biographie" button=true owner=options.owner editable=true engine="prosemirror"}}
|
||||
{{editor biographie target="system.biographie" button=true owner=options.isOwner editable=options.editable engine="prosemirror"}}
|
||||
</div>
|
||||
<h3>Notes : </h3>
|
||||
<div class="form-group large-editor">
|
||||
{{editor notes target="system.notes" button=true owner=owner editable=true engine="prosemirror"}}
|
||||
{{editor notes target="system.notes" button=true owner=options.isOwner editable=options.editable engine="prosemirror"}}
|
||||
</div>
|
||||
{{> "systems/foundryvtt-reve-de-dragon/templates/actor/xp-journal.html"}}
|
||||
{{> "systems/foundryvtt-reve-de-dragon/templates/actor/editor-notes-mj.html"}}
|
||||
|
@ -84,7 +84,7 @@
|
||||
</div>
|
||||
|
||||
<div class="form-group large-editor">
|
||||
{{editor description target="system.description" button=true owner=owner editable=true engine="prosemirror"}}
|
||||
{{editor description target="system.description" button=true owner=options.isOwner editable=options.editable engine="prosemirror"}}
|
||||
</div>
|
||||
{{>"systems/foundryvtt-reve-de-dragon/templates/actor/editor-notes-mj.html"}}
|
||||
</div>
|
||||
|
@ -36,7 +36,7 @@
|
||||
{{!-- Sheet Body --}}
|
||||
<section class="sheet-body">
|
||||
<div class="flexcol form-group medium-editor">
|
||||
{{editor description target="system.description" button=true owner=options.owner editable=options.isOwner engine="prosemirror"}}
|
||||
{{editor description target="system.description" button=true owner=options.isOwner editable=options.isOwner engine="prosemirror"}}
|
||||
</div>
|
||||
<hr>
|
||||
{{> "systems/foundryvtt-reve-de-dragon/templates/actor/commerce-inventaire.html"}}
|
||||
|
@ -1,3 +1,4 @@
|
||||
{{#unless item.system.isHidden}}
|
||||
{{#if (ne item.type 'monnaie')}}
|
||||
<li class="item flexrow list-item" data-item-id="{{item._id}}" draggable="true">
|
||||
<span class="equipement-nom {{#if (eq item.type 'conteneur')}}conteneur-name{{/if}} ">
|
||||
@ -57,3 +58,4 @@
|
||||
</span>
|
||||
</li>
|
||||
{{/if}}
|
||||
{{/unless}}
|
@ -4,6 +4,9 @@
|
||||
<a class="chat-card-button creer-un-objet">Nouvel objet</a>
|
||||
<a class="chat-card-button nettoyer-conteneurs">Tout vider</a>
|
||||
{{/if}}
|
||||
<span class="embed-inline">
|
||||
<input class="recherche flex-grow" type="text" value="{{options.recherche.text}}" name="recherche" size="8" data-dtype="String" placeholder=""/>
|
||||
</span>
|
||||
|
||||
{{#unless system.illimite}}
|
||||
{{#if calc.surEncombrementMessage}}<b>{{calc.surEncombrementMessage}}</b> ‐{{/if}}
|
||||
@ -24,13 +27,12 @@
|
||||
</li>
|
||||
{{#each objets as |item id|}}
|
||||
{{#unless item.estContenu}}
|
||||
{{#if (ne item.type 'conteneur')}}
|
||||
{{> "systems/foundryvtt-reve-de-dragon/templates/actor/commerce-inventaire-item.html"
|
||||
item=item vide=true ouvert=true options=../options}}
|
||||
{{/if}}
|
||||
{{#if (ne item.type 'conteneur')}}
|
||||
{{buildLigneInventaire item ../options}}
|
||||
{{/if}}
|
||||
{{/unless}}
|
||||
{{/each}}
|
||||
{{#each conteneurs as |conteneur id|}}
|
||||
{{buildConteneur conteneur 'actor/commerce-inventaire-item.html' ../options}}
|
||||
{{buildLigneInventaire conteneur ../options}}
|
||||
{{/each}}
|
||||
</ul>
|
||||
|
@ -1,4 +1,4 @@
|
||||
{{#if system.isVisible}}
|
||||
{{#unless system.isHidden}}
|
||||
<li class="item flexrow list-item {{#if system.isLevelUp}}xp-level-up tooltip{{/if}}" data-item-id="{{_id}}">
|
||||
<a class="competence-label" name="{{name}}">
|
||||
<img class="sheet-competence-img" src="{{img}}"/>
|
||||
@ -49,4 +49,4 @@
|
||||
</div>
|
||||
{{/if}}
|
||||
</li>
|
||||
{{/if}}
|
||||
{{/unless}}
|
@ -1,6 +1,6 @@
|
||||
{{#if options.isGM}}
|
||||
<h3>Notes du MJ : </h3>
|
||||
<div class="form-group large-editor">
|
||||
{{editor notesmj target="system.notesmj" button=true owner=owner editable=true engine="prosemirror"}}
|
||||
{{editor notesmj target="system.notesmj" button=true owner=options.isOwner editable=options.editable engine="prosemirror"}}
|
||||
</div>
|
||||
{{/if}}
|
||||
|
@ -1,4 +1,5 @@
|
||||
{{#if (or @root.options.isObserver (ne item.type 'monnaie'))}}
|
||||
{{#unless item.system.isHidden}}
|
||||
{{#if (or options.isObserver (ne item.type 'monnaie'))}}
|
||||
<li class="item flexrow list-item" data-item-id="{{item._id}}" draggable="true">
|
||||
<span class="equipement-nom {{#if (eq item.type 'conteneur')}}conteneur-name{{/if}} ">
|
||||
{{#if (eq item.type 'conteneur')}}
|
||||
@ -21,25 +22,26 @@
|
||||
</span>
|
||||
<span class="equipement-detail">{{numberFormat item.system.encTotal decimals=2}}</span>
|
||||
<span class="equipement-actions item-controls">
|
||||
{{#if @root.options.isOwner}}
|
||||
{{#unless item.estContenu}}
|
||||
{{#if (or (eq item.type 'arme') (eq item.type 'armure') )}}
|
||||
<a class="item-equip" title="Equiper">{{#if item.system.equipe}}<i class="fas fa-hand-rock"></i>{{else}}<i class="far fa-hand-paper"></i>{{/if}}</a>
|
||||
{{/if}}
|
||||
{{/unless}}
|
||||
<a class="item-edit" title="Editer"><i class="fas fa-edit"></i></a>
|
||||
<a class="item-delete" title="Supprimer"><i class="fas fa-trash"></i></a>
|
||||
|
||||
{{#if (ne item.system.quantite 0)}}
|
||||
<a class="item-vendre" title="Vendre ou donner"><i class="fas fa-comments-dollar"></i></a>
|
||||
{{/if}}
|
||||
{{#if options.isOwner}}
|
||||
{{#unless item.estContenu}}
|
||||
{{#if (or (eq item.type 'arme') (eq item.type 'armure') )}}
|
||||
<a class="item-equip" title="Equiper">{{#if item.system.equipe}}<i class="fas fa-hand-rock"></i>{{else}}<i class="far fa-hand-paper"></i>{{/if}}</a>
|
||||
{{/if}}
|
||||
{{/unless}}
|
||||
<a class="item-edit" title="Editer"><i class="fas fa-edit"></i></a>
|
||||
<a class="item-delete" title="Supprimer"><i class="fas fa-trash"></i></a>
|
||||
|
||||
{{#if (ne item.system.quantite 0)}}
|
||||
<a class="item-vendre" title="Vendre ou donner"><i class="fas fa-comments-dollar"></i></a>
|
||||
{{/if}}
|
||||
{{/if}}
|
||||
<a class="item-montrer" title="Montrer"><i class="fas fa-comment"></i></a>
|
||||
{{#if @root.options.isOwner}}
|
||||
{{#if item.system.actionPrincipale}}
|
||||
<a class="item-action">{{item.system.actionPrincipale}}</a>
|
||||
{{/if}}
|
||||
{{#if options.isOwner}}
|
||||
{{#if item.system.actionPrincipale}}
|
||||
<a class="item-action">{{item.system.actionPrincipale}}</a>
|
||||
{{/if}}
|
||||
{{/if}}
|
||||
</span>
|
||||
</li>
|
||||
{{/if}}
|
||||
{{/unless}}
|
||||
|
@ -1,9 +1,14 @@
|
||||
<h4>Equipement</h4>
|
||||
<span class="item-name">
|
||||
{{#if options.isOwner}}
|
||||
<a class="chat-card-button creer-un-objet">Nouvel objet</a>
|
||||
{{/if}}
|
||||
{{#if options.isGM}}
|
||||
<a class="chat-card-button nettoyer-conteneurs">Tout vider</a>
|
||||
{{/if}}
|
||||
<span class="embed-inline">
|
||||
<input class="recherche flex-grow" type="text" value="{{options.recherche.text}}" name="recherche" size="8" data-dtype="String" placeholder=""/>
|
||||
</span>
|
||||
{{#if calc.surEncombrementMessage}}<b>{{calc.surEncombrementMessage}}</b> ‐{{/if}}
|
||||
Encombrement: {{numberFormat calc.encTotal decimals=2}} (max: {{system.attributs.encombrement.value}})
|
||||
{{#if (regle-optionnelle 'afficher-prix-joueurs')}}
|
||||
@ -20,11 +25,11 @@
|
||||
{{#each objets as |item id|}}
|
||||
{{#unless item.estContenu}}
|
||||
{{#if (ne item.type 'conteneur')}}
|
||||
{{> "systems/foundryvtt-reve-de-dragon/templates/actor/inventaire-item.html" item=item vide=true ouvert=true options=@root.options}}
|
||||
{{buildLigneInventaire item @root.options}}
|
||||
{{/if}}
|
||||
{{/unless}}
|
||||
{{/each}}
|
||||
{{#each conteneurs as |conteneur id|}}
|
||||
{{buildConteneur this 'actor/inventaire-item.html' @root.options}}
|
||||
{{buildLigneInventaire conteneur @root.options}}
|
||||
{{/each}}
|
||||
</ul>
|
||||
|
@ -1,47 +1,47 @@
|
||||
<div id="calendar-time-container">
|
||||
<div class="calendar">
|
||||
<div>
|
||||
<div class="calendar-hdr">
|
||||
<p id="calendar-move-handle" class="calendar-date-rdd" title="Deplacer">{{jourDuMois}} {{mois.label}} ({{mois.saison}})</p>
|
||||
</div>
|
||||
<div class="calendar-title" title="Deplacer">{{jourDuMois}} {{mois.label}} ({{mois.saison}})</div>
|
||||
<div class="calendar-options">
|
||||
{{#if isGM}}
|
||||
<i class="calendar-btn-edit fa-solid fa-calendar-pen" title="Editer"></i>
|
||||
<i class="astrologie-btn-edit fa-solid fa-moon-over-sun" title="Astrologie"></i>
|
||||
<i class="calendar-set-datetime fa-solid fa-calendar-pen" title="Editer"></i>
|
||||
<i class="calendar-astrologie fa-solid fa-moon-over-sun" title="Astrologie"></i>
|
||||
{{/if}}
|
||||
</div>
|
||||
<div class="calendar-container">
|
||||
{{#if isGM}}
|
||||
<div class="calendar-btn-container-left">
|
||||
<div class="calendar-avance-heure">
|
||||
<div class="calendar-avance-heure-grid">
|
||||
{{#if isGM}}
|
||||
<i class="calendar-btn calendar-1min" data-calendar-avance="1" title="Avancer de 1 minute">+1</i>
|
||||
<i class="calendar-btn calendar-5min" data-calendar-avance="5" title="Avancer de 5 minutes">+5</i>
|
||||
<i class="calendar-btn calendar-15min" data-calendar-avance="15" title="Avancer de 15 minutes">+15</i>
|
||||
<i class="calendar-btn calendar-30min" data-calendar-avance="30" title="Avancer de 30 minutes">+30</i>
|
||||
<i class="calendar-btn calendar-60min" data-calendar-avance="60" title="Avancer de 60 minutes" >+60</i>
|
||||
<i class="calendar-btn calendar-1heure" data-calendar-avance="120" title="Avancer d'1 heure" >+1h</i>
|
||||
{{else}}
|
||||
{{/if}}
|
||||
</div>
|
||||
{{else}}
|
||||
<div class="calendar-btn-container-left">
|
||||
</div>
|
||||
{{/if}}
|
||||
<div class="calendar-weekday-time">
|
||||
<a class="ajout-chronologie calendar-weekday">
|
||||
<img class="calendar-heure-img" src="{{heure.icon}}" alt="{{nomHeure}}"/>
|
||||
</div>
|
||||
<div class="calendar-affiche-heure">
|
||||
<div class="calendar-horloge">
|
||||
<a class="ajout-chronologie">
|
||||
<img class="calendar-heure-img" src="{{heure.icon}}" alt="{{nomHeure}}"/>
|
||||
<span class="calendar-heure-texte">{{heure.label}}</span>
|
||||
</a>
|
||||
{{#if isGM}}
|
||||
<p class="calendar-time-disp calendar-time isGM">{{minute}} minutes</p>
|
||||
<p class="calendar-minute-texte">{{minute}} minutes</p>
|
||||
{{/if}}
|
||||
</div>
|
||||
{{#if isGM}}
|
||||
<div class="calendar-btn-container-right">
|
||||
<i class="calendar-btn calendar-lyre fas fa-forward" data-calendar-set="6" title="Avancer à Lyre">
|
||||
<img class="img-calendar-forward" src="systems/foundryvtt-reve-de-dragon/icons/heures/hd07.svg" alt="Avancer à Lyre"/>
|
||||
</i>
|
||||
<i class="calendar-btn calendar-vaisseau fas fa-forward" data-calendar-set="0" title="Avancer au Vaisseau">
|
||||
<img class="img-calendar-forward" src="systems/foundryvtt-reve-de-dragon/icons/heures/hd01.svg" alt="Avancer au Vaisseau"/>
|
||||
</i>
|
||||
</div>
|
||||
<div class="calendar-change-heure">
|
||||
<div class="calendar-change-heure-grid">
|
||||
{{#if isGM}}
|
||||
<i class="calendar-btn calendar-lyre fas fa-forward" data-calendar-set="6" title="Avancer à Lyre">
|
||||
<img src="systems/foundryvtt-reve-de-dragon/icons/heures/hd07.svg" alt="Avancer à Lyre"/>
|
||||
</i>
|
||||
<i class="calendar-btn calendar-vaisseau fas fa-forward" data-calendar-set="0" title="Avancer au Vaisseau">
|
||||
<img src="systems/foundryvtt-reve-de-dragon/icons/heures/hd01.svg" alt="Avancer au Vaisseau"/>
|
||||
</i>
|
||||
{{/if}}
|
||||
</div>
|
||||
{{/if}}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -1,11 +1,11 @@
|
||||
<div class="flexcol">
|
||||
<div class="flexcol calendar-timestamp-edit">
|
||||
<div class="flexrow">
|
||||
<label>{{label}}</label>
|
||||
<input {{#if disabled}}{{disabled}}{{/if}}
|
||||
class="flex-shrink number-x2"
|
||||
type="number" data-dtype="Number" min="1" max="28"
|
||||
name="{{path}}.jourDuMois" value="{{jourDuMois}}" />
|
||||
<select {{#if disabled}}{{disabled}}{{/if}} name="{{path}}.mois" class="flex-shrink" data-dtype="String">
|
||||
<select {{#if disabled}}{{disabled}}{{/if}} name="{{path}}.mois" class="calendar-signe-heure" data-dtype="String">
|
||||
{{#select mois.key}}
|
||||
{{>"systems/foundryvtt-reve-de-dragon/templates/enum-heures.html"}}
|
||||
{{/select}}
|
||||
@ -16,7 +16,7 @@
|
||||
<div class="flexrow">
|
||||
<label></label>
|
||||
<label>heure</label>
|
||||
<select {{#if disabled}}{{disabled}}{{/if}} name="{{path}}.heure" class="flex-shrink" data-dtype="String">
|
||||
<select {{#if disabled}}{{disabled}}{{/if}} name="{{path}}.heure" class="calendar-signe-heure" data-dtype="String">
|
||||
{{#select heure.key}}
|
||||
{{>"systems/foundryvtt-reve-de-dragon/templates/enum-heures.html"}}
|
||||
{{/select}}
|
||||
|
@ -13,7 +13,7 @@
|
||||
<div class="flexrow flex-group-left">
|
||||
<label>Nombre de lots</label>
|
||||
<div class="flexrow">
|
||||
{{#unless isOwned}}
|
||||
{{#unless options.isOwned}}
|
||||
<input name="quantiteIllimite" class="quantiteIllimite flex-shrink" type="checkbox" {{#if
|
||||
quantiteIllimite}}checked{{/if}} />
|
||||
<label class="label-quantiteIllimite flex-shrink">disponibles</label>
|
||||
|
@ -3,7 +3,7 @@
|
||||
<img class="profile-img" src="{{img}}" data-edit="img" title="{{name}}"/>
|
||||
<div class="header-fields">
|
||||
<h1 class="charname">
|
||||
{{#if isGM}}
|
||||
{{#if options.isGM}}
|
||||
<input name="name" type="text" value="{{name}}" placeholder="Name"/>
|
||||
{{else}}
|
||||
{{item.name}}
|
||||
@ -32,7 +32,7 @@
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="system.base">Niveau de base </label>
|
||||
{{#if isGM}}
|
||||
{{#if options.isGM}}
|
||||
<select name="system.base" data-dtype="Number">
|
||||
{{#select system.base}}
|
||||
{{>"systems/foundryvtt-reve-de-dragon/templates/enum-base-competence.html"}}
|
||||
|
@ -13,10 +13,8 @@
|
||||
<input class="attribute-value" type="text" name="system.capacite" value="{{system.capacite}}" data-dtype="Number"/>
|
||||
</div>
|
||||
{{>"systems/foundryvtt-reve-de-dragon/templates/item/partial-inventaire.html"}}
|
||||
|
||||
{{#if isOwned}}
|
||||
{{#if options.isOwned}}
|
||||
<div class="flexcol">
|
||||
<span><label>Contenu : </label></span>
|
||||
<ul class="item-list alterne-list">
|
||||
<li class="competence-header flexrow">
|
||||
<span class="equipement-nom">Nom</span>
|
||||
@ -24,7 +22,7 @@
|
||||
<span class="equipement-detail">Enc.</span>
|
||||
<span class="equipement-actions">Actions</span>
|
||||
</li>
|
||||
{{buildContenu this}}
|
||||
{{buildInventaireConteneur actorId id options}}
|
||||
</ul>
|
||||
</div>
|
||||
{{/if}}
|
||||
|
@ -12,13 +12,13 @@
|
||||
<div class="flexcol">
|
||||
<label>Extrait</label>
|
||||
<div class="form-group large-editor">
|
||||
{{editor extrait target="system.extrait" button=true owner=owner editable=true engine="prosemirror"}}
|
||||
{{editor extrait target="system.extrait" button=true owner=options.isOwner editable=options.editable engine="prosemirror"}}
|
||||
</div>
|
||||
</div>
|
||||
<div class="flexcol">
|
||||
<label>Texte complet</label>
|
||||
<div class="form-group large-editor">
|
||||
{{editor texte target="system.texte" button=true owner=owner editable=true engine="prosemirror"}}
|
||||
{{editor texte target="system.texte" button=true owner=options.isOwner editable=options.editable engine="prosemirror"}}
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
@ -29,7 +29,7 @@
|
||||
<label>Créature correspondante</label>
|
||||
<div>
|
||||
{{#if system.actor.id}}
|
||||
{{#if isGM}}
|
||||
{{#if options.isGM}}
|
||||
<label>
|
||||
{{>'systems/foundryvtt-reve-de-dragon/templates/common/compendium-link.hbs'
|
||||
pack=system.actor.pack id=system.actor.id name=system.actor.name}}
|
||||
|
@ -3,7 +3,7 @@
|
||||
<img class="profile-img" src="{{img}}" data-edit="img" title="{{name}}"/>
|
||||
<div class="header-fields">
|
||||
<h1 class="charname"><input name="name" type="text" value="{{name}}" placeholder="Name"/></h1>
|
||||
{{#if isOwned}}
|
||||
{{#if options.isOwned}}
|
||||
<div class="form-group">
|
||||
<span for="xp"><a class="creer-tache-livre chat-card-button" data-actor-id="{{actorId}}">Créer une tâche de lecture</a></span>
|
||||
</div>
|
||||
|
@ -2,7 +2,7 @@
|
||||
<header class="sheet-header">
|
||||
<img class="profile-img" src="{{img}}" data-edit="img" title="{{name}}"/>
|
||||
<div class="header-fields">
|
||||
{{#if (or isGM system.identifie)}}
|
||||
{{#if (or options.isGM system.identifie)}}
|
||||
<h1 class="charname"><input name="name" type="text" value="{{name}}" placeholder="Name"/></h1>
|
||||
{{else}}
|
||||
<h1 class="charname">Inconnue</h1>
|
||||
@ -12,7 +12,7 @@
|
||||
|
||||
{{!-- Sheet Body --}}
|
||||
<section class="sheet-body">
|
||||
{{#if (or isGM system.identifie)}}
|
||||
{{#if (or options.isGM system.identifie)}}
|
||||
<div class="form-group">
|
||||
<label for="system.identifie">Identifiée ? </label>
|
||||
<input class="attribute-value" type="checkbox" name="system.identifie" {{#if system.identifie}}checked{{/if}}/>
|
||||
@ -36,14 +36,14 @@
|
||||
<label for="system.remedesconnus">Remedes Connus ? </label>
|
||||
<input class="attribute-value" type="checkbox" name="system.remedesconnus" {{#if system.remedesconnus}}checked{{/if}}/>
|
||||
</div>
|
||||
{{#if (or isGM system.remedesconnus)}}
|
||||
{{#if (or options.isGM system.remedesconnus)}}
|
||||
<div class="form-group">
|
||||
<label for="system.remedes">Remèdes </label>
|
||||
<input class="attribute-value" type="text" name="system.remedes" value="{{system.remedes}}" data-dtype="String"/>
|
||||
</div>
|
||||
{{/if}}
|
||||
{{/if}}
|
||||
{{#if (and isGM isOwned)}}
|
||||
{{#if (and options.isGM options.isOwned)}}
|
||||
{{>"systems/foundryvtt-reve-de-dragon/templates/item/temporel.hbs" this labeldebut="Contractée" labelfin="Prochain jet"}}
|
||||
{{/if}}
|
||||
|
||||
|
@ -48,7 +48,7 @@
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="xp">Malus</label>
|
||||
{{#if isGM}}
|
||||
{{#if options.isGM}}
|
||||
<select name="system.malus" id="malus" data-dtype="Number">
|
||||
{{#select system.malus}}
|
||||
<option value="0">0</option>
|
||||
|
@ -2,7 +2,7 @@
|
||||
<header class="sheet-header">
|
||||
<img class="profile-img" src="{{img}}" data-edit="img" title="{{name}}"/>
|
||||
<div class="header-fields">
|
||||
{{#if (or isGM system.identifie)}}
|
||||
{{#if (or options.isGM system.identifie)}}
|
||||
<h1 class="charname"><input name="name" type="text" value="{{name}}" placeholder="Name"/></h1>
|
||||
{{else}}
|
||||
<h1 class="charname">Inconnue</h1>
|
||||
@ -14,9 +14,9 @@
|
||||
<section class="sheet-body">
|
||||
<div class="form-group">
|
||||
<label for="system.active">Actif ? </label>
|
||||
<input class="attribute-value" type="checkbox" name="system.active" {{#if system.active}}checked{{/if}} {{#unless isGM}}disabled{{/unless}}/>
|
||||
<input class="attribute-value" type="checkbox" name="system.active" {{#if system.active}}checked{{/if}} {{#unless options.isGM}}disabled{{/unless}}/>
|
||||
</div>
|
||||
{{#if (or isGM system.identifie)}}
|
||||
{{#if (or options.isGM system.identifie)}}
|
||||
<div class="form-group">
|
||||
<label for="system.identifie">Identifiée ? </label>
|
||||
<input class="attribute-value" type="checkbox" name="system.identifie" {{#if system.identifie}}checked{{/if}}/>
|
||||
@ -40,14 +40,14 @@
|
||||
<label for="system.remedesconnus">Remedes Connus ? </label>
|
||||
<input class="attribute-value" type="checkbox" name="system.remedesconnus" {{#if system.remedesconnus}}checked{{/if}}/>
|
||||
</div>
|
||||
{{#if (or isGM system.remedesconnus)}}
|
||||
{{#if (or options.isGM system.remedesconnus)}}
|
||||
<div class="form-group">
|
||||
<label for="system.remedes">Remèdes </label>
|
||||
<input class="attribute-value" type="text" name="system.remedes" value="{{system.remedes}}" data-dtype="String"/>
|
||||
</div>
|
||||
{{/if}}
|
||||
{{/if}}
|
||||
{{#if (and isGM isOwned system.active)}}
|
||||
{{#if (and options.isGM options.isOwned system.active)}}
|
||||
{{>"systems/foundryvtt-reve-de-dragon/templates/item/temporel.hbs" this labeldebut="Contracté" labelfin="Prochain jet"}}
|
||||
{{/if}}
|
||||
|
||||
|
@ -3,7 +3,7 @@
|
||||
<img class="profile-img" src="{{img}}" data-edit="img" title="{{name}}" />
|
||||
<div class="header-fields">
|
||||
<h1 class="charname"><input name="name" type="text" value="{{name}}" placeholder="Name" /></h1>
|
||||
{{#if isOwned}}
|
||||
{{#if options.isOwned}}
|
||||
<div class="form-group">
|
||||
<span for="xp"><a class="consommer-potion chat-card-button" data-actor-id="{{actorId}}">Consommer cette potion et appliquer ses effets</a></span>
|
||||
</div>
|
||||
|
@ -33,7 +33,7 @@
|
||||
<input class="attribute-value" type="text" name="system.refoulement" value="{{system.refoulement}}" data-dtype="Number"/>
|
||||
</div>
|
||||
|
||||
{{#if isOwned}}
|
||||
{{#if options.isOwned}}
|
||||
{{>"systems/foundryvtt-reve-de-dragon/templates/item/temporel.hbs" this labeldebut="Depuis le" labelfin="Jusqu'au"}}
|
||||
{{/if}}
|
||||
|
||||
|
@ -9,25 +9,25 @@
|
||||
<div class="flexcol">
|
||||
<span><label class="alchimie-title">Manipulation : </label></span>
|
||||
<div class="form-group medium-editor">
|
||||
{{editor manipulation_update target="system.manipulation" button=true owner=owner editable=true engine="prosemirror"}}
|
||||
{{editor manipulation_update target="system.manipulation" button=true owner=options.isOwner editable=options.editable engine="prosemirror"}}
|
||||
</div>
|
||||
</div>
|
||||
<div class="flexcol">
|
||||
<span><label class="alchimie-title">Utilisation : </label></span>
|
||||
<div class="form-group small-editor">
|
||||
{{editor utilisation target="system.utilisation" button=true owner=owner editable=true engine="prosemirror"}}
|
||||
{{editor utilisation target="system.utilisation" button=true owner=options.isOwner editable=options.editable engine="prosemirror"}}
|
||||
</div>
|
||||
</div>
|
||||
<div class="flexcol">
|
||||
<span><label class="alchimie-title">Enchantement : </label></span>
|
||||
<div class="form-group small-editor">
|
||||
{{editor enchantement target="system.enchantement" button=true owner=owner editable=true engine="prosemirror"}}
|
||||
{{editor enchantement target="system.enchantement" button=true owner=options.isOwner editable=options.editable engine="prosemirror"}}
|
||||
</div>
|
||||
</div>
|
||||
<div class="flexcol">
|
||||
<span><label class="alchimie-title">Sur-effet : </label></span>
|
||||
<div class="form-group small-editor">
|
||||
{{editor sureffet target="system.sureffet" button=true owner=owner editable=true engine="prosemirror"}}
|
||||
{{editor sureffet target="system.sureffet" button=true owner=options.isOwner editable=options.editable engine="prosemirror"}}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
@ -25,7 +25,7 @@
|
||||
<div class="flexcol">
|
||||
<span><label>Ingrédients : </label></span>
|
||||
<div class="form-group large-editor">
|
||||
{{editor ingredients target="system.ingredients" button=true owner=owner editable=true engine="prosemirror"}}
|
||||
{{editor ingredients target="system.ingredients" button=true owner=options.isOwner editable=options.editable engine="prosemirror"}}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
@ -11,31 +11,31 @@
|
||||
</nav>
|
||||
<section class="sheet-body">
|
||||
<div class="tab items" data-group="primary" data-tab="rencontre">
|
||||
{{#if isOwned}}
|
||||
{{#if options.isOwned}}
|
||||
<div class="form-group">
|
||||
<label for="system.force">Rêve</label>
|
||||
<input type="text" name="system.force" value="{{system.force}}" data-dtype="Number"/>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="system.coord">Case TMR - {{caseTmr-label system.coord}}</label>
|
||||
<input class="attribute-value" type="text" name="system.coord" value="{{system.coord}}" data-dtype="String" {{#unless isGM}}disabled{{/unless}}/>
|
||||
<input class="attribute-value" type="text" name="system.coord" value="{{system.coord}}" data-dtype="String" {{#unless options.isGM}}disabled{{/unless}}/>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="system.date">Date/heure</label>
|
||||
<div class="flexrow">
|
||||
<input class="attribute-value" type="text" name="system.date" value="{{system.date}}" data-dtype="String" {{#unless isGM}}disabled{{/unless}}/>
|
||||
<input class="attribute-value" type="text" name="system.heure" value="{{system.heure}}" data-dtype="String" {{#unless isGM}}disabled{{/unless}}/>
|
||||
<input class="attribute-value" type="text" name="system.date" value="{{system.date}}" data-dtype="String" {{#unless options.isGM}}disabled{{/unless}}/>
|
||||
<input class="attribute-value" type="text" name="system.heure" value="{{system.heure}}" data-dtype="String" {{#unless options.isGM}}disabled{{/unless}}/>
|
||||
</div>
|
||||
</div>
|
||||
{{>"systems/foundryvtt-reve-de-dragon/templates/item/temporel.hbs" this labeldebut="Rencontrée le" labelfin="Disparaît le"}}
|
||||
{{else}}
|
||||
<div class="form-group">
|
||||
<label for="system.formule">Rêve</label>
|
||||
<input type="text" name="system.formule" value="{{system.formule}}" data-dtype="String" {{#unless isGM}}disabled{{/unless}}/>
|
||||
<input type="text" name="system.formule" value="{{system.formule}}" data-dtype="String" {{#unless options.isGM}}disabled{{/unless}}/>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="system.genre">Genre</label>
|
||||
<select type="text" name="system.genre" data-dtype="String" {{#unless isGM}}disabled{{/unless}}>
|
||||
<select type="text" name="system.genre" data-dtype="String" {{#unless options.isGM}}disabled{{/unless}}>
|
||||
{{#select system.genre}}
|
||||
<option value=""></option>
|
||||
<option value="f">Féminin</option>
|
||||
@ -45,26 +45,26 @@
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="system.ordreTri">Position dans la table</label>
|
||||
<input type="number" name="system.ordreTri" value="{{system.ordreTri}}" min="0" max="100" data-dtype="Number" {{#unless isGM}}disabled{{/unless}}/>
|
||||
<input type="number" name="system.ordreTri" value="{{system.ordreTri}}" min="0" max="100" data-dtype="Number" {{#unless options.isGM}}disabled{{/unless}}/>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="system.presentCite">Offert par les Présents des cités</label>
|
||||
<input type="checkbox" name="system.presentCite" data-dtype="Boolean" {{#if system.presentCite}}checked{{/if}} {{#unless isGM}}disabled{{/unless}}/>
|
||||
<input type="checkbox" name="system.presentCite" data-dtype="Boolean" {{#if system.presentCite}}checked{{/if}} {{#unless options.isGM}}disabled{{/unless}}/>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="system.refoulement">Refoulement</label>
|
||||
<input type="number" name="system.refoulement" value="{{system.refoulement}}" min="0" max="4" data-dtype="Number" {{#unless isGM}}disabled{{/unless}}/>
|
||||
<input type="number" name="system.refoulement" value="{{system.refoulement}}" min="0" max="4" data-dtype="Number" {{#unless options.isGM}}disabled{{/unless}}/>
|
||||
</div>
|
||||
{{/if}}
|
||||
<div class="form-group">
|
||||
<label for="system.mauvaiseRencontre">Mauvaise rencontre</label>
|
||||
<input type="checkbox" name="system.mauvaiseRencontre" data-dtype="Boolean" {{#if system.mauvaiseRencontre}}checked{{/if}} {{#unless isGM}}disabled{{/unless}}/>
|
||||
<input type="checkbox" name="system.mauvaiseRencontre" data-dtype="Boolean" {{#if system.mauvaiseRencontre}}checked{{/if}} {{#unless options.isGM}}disabled{{/unless}}/>
|
||||
</div>
|
||||
{{#unless isOwned}}
|
||||
{{#if system.mauvaiseRencontre}}
|
||||
<div class="form-group">
|
||||
<label for="system.frequence.mauvaise">Fréquence mauvaise rencontre</label>
|
||||
<input type="number" name="system.frequence.mauvaise" value="{{system.frequence.mauvaise}}" min="0" max="100" data-dtype="Number" {{#unless isGM}}disabled{{/unless}}/>
|
||||
<input type="number" name="system.frequence.mauvaise" value="{{system.frequence.mauvaise}}" min="0" max="100" data-dtype="Number" {{#unless options.isGM}}disabled{{/unless}}/>
|
||||
</div>
|
||||
{{/if}}
|
||||
{{/unless}}
|
||||
@ -74,11 +74,11 @@
|
||||
<div class="tab items" data-group="primary" data-tab="succes">
|
||||
<div class="form-group">
|
||||
<label for="system.succes.message">Message</label>
|
||||
<textarea autocomplete="off" title="Message en cas de succès" name="system.succes.message" {{#unless isGM}}disabled{{/unless}}/>{{system.succes.message}}</textarea>
|
||||
<textarea autocomplete="off" title="Message en cas de succès" name="system.succes.message" {{#unless options.isGM}}disabled{{/unless}}/>{{system.succes.message}}</textarea>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<div class="button-dropdown">
|
||||
{{#if isGM}}
|
||||
{{#if options.isGM}}
|
||||
<label class="button-dropbutton" title="Ajouter">Effets <i class="fas fa-plus-circle"></i></label>
|
||||
<div class="button-dropdown-content">
|
||||
{{#each effets.succes.liste as |effet|}}
|
||||
@ -106,12 +106,12 @@
|
||||
<hr>
|
||||
<div class="form-group">
|
||||
<label for="system.succes.reference">Réference</label>
|
||||
<input type="text" name="system.succes.reference" value="{{system.succes.reference}}" data-dtype="String" {{#unless isGM}}disabled{{/unless}}/>
|
||||
<input type="text" name="system.succes.reference" value="{{system.succes.reference}}" data-dtype="String" {{#unless options.isGM}}disabled{{/unless}}/>
|
||||
</div>
|
||||
<div class="flexcol">
|
||||
<label for="system.succes.poesie">Poésie</label>
|
||||
<div class="form-group large-editor">
|
||||
{{editor system.succes.poesie target="system.succes.poesie" button=true owner=owner editable=true engine="prosemirror"}}
|
||||
{{editor system.succes.poesie target="system.succes.poesie" button=true owner=options.isOwner editable=options.editable engine="prosemirror"}}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@ -119,11 +119,11 @@
|
||||
<div class="tab items" data-group="primary" data-tab="echec">
|
||||
<div class="form-group">
|
||||
<label for="system.echec.message">Message</label>
|
||||
<textarea autocomplete="off" title="Message en cas d'échec" name="system.echec.message" {{#unless isGM}}disabled{{/unless}}/>{{system.echec.message}}</textarea>
|
||||
<textarea autocomplete="off" title="Message en cas d'échec" name="system.echec.message" {{#unless options.isGM}}disabled{{/unless}}/>{{system.echec.message}}</textarea>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<div class="button-dropdown">
|
||||
{{#if isGM}}
|
||||
{{#if options.isGM}}
|
||||
<label class="button-dropbutton" title="Ajouter">Effets <i class="fas fa-plus-circle"></i></label>
|
||||
<div class="button-dropdown-content">
|
||||
{{#each effets.echec.liste as |effet|}}
|
||||
@ -151,12 +151,12 @@
|
||||
<hr>
|
||||
<div class="form-group">
|
||||
<label for="system.echec.reference">Réference</label>
|
||||
<input type="text" name="system.echec.reference" value="{{system.echec.reference}}" data-dtype="String" {{#unless isGM}}disabled{{/unless}}/>
|
||||
<input type="text" name="system.echec.reference" value="{{system.echec.reference}}" data-dtype="String" {{#unless options.isGM}}disabled{{/unless}}/>
|
||||
</div>
|
||||
<div class="flexcol">
|
||||
<label for="system.echec.poesie">Poésie</label>
|
||||
<div class="form-group large-editor">
|
||||
{{editor system.echec.poesie target="system.echec.poesie" button=true owner=owner editable=true engine="prosemirror"}}
|
||||
{{editor system.echec.poesie target="system.echec.poesie" button=true owner=options.isOwner editable=options.editable engine="prosemirror"}}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@ -166,59 +166,59 @@
|
||||
<hr>
|
||||
<div class="form-group">
|
||||
<label for="system.frequence.cite">Fréquence en Cité</label>
|
||||
<input type="number" name="system.frequence.cite" value="{{system.frequence.cite}}" min="0" max="100" data-dtype="Number" {{#unless isGM}}disabled{{/unless}}/>
|
||||
<input type="number" name="system.frequence.cite" value="{{system.frequence.cite}}" min="0" max="100" data-dtype="Number" {{#unless options.isGM}}disabled{{/unless}}/>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="system.frequence.sanctuaire">Fréquence en Sanctuaire</label>
|
||||
<input type="number" name="system.frequence.sanctuaire" value="{{system.frequence.sanctuaire}}" min="0" max="100" data-dtype="Number" {{#unless isGM}}disabled{{/unless}}/>
|
||||
<input type="number" name="system.frequence.sanctuaire" value="{{system.frequence.sanctuaire}}" min="0" max="100" data-dtype="Number" {{#unless options.isGM}}disabled{{/unless}}/>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="system.frequence.plaines">Fréquence en Plaines</label>
|
||||
<input type="number" name="system.frequence.plaines" value="{{system.frequence.plaines}}" min="0" max="100" data-dtype="Number" {{#unless isGM}}disabled{{/unless}}/>
|
||||
<input type="number" name="system.frequence.plaines" value="{{system.frequence.plaines}}" min="0" max="100" data-dtype="Number" {{#unless options.isGM}}disabled{{/unless}}/>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="system.frequence.pont">Fréquence en Pont</label>
|
||||
<input type="number" name="system.frequence.pont" value="{{system.frequence.pont}}" min="0" max="100" data-dtype="Number" {{#unless isGM}}disabled{{/unless}}/>
|
||||
<input type="number" name="system.frequence.pont" value="{{system.frequence.pont}}" min="0" max="100" data-dtype="Number" {{#unless options.isGM}}disabled{{/unless}}/>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="system.frequence.collines">Fréquence en Collines</label>
|
||||
<input type="number" name="system.frequence.collines" value="{{system.frequence.collines}}" min="0" max="100" data-dtype="Number" {{#unless isGM}}disabled{{/unless}}/>
|
||||
<input type="number" name="system.frequence.collines" value="{{system.frequence.collines}}" min="0" max="100" data-dtype="Number" {{#unless options.isGM}}disabled{{/unless}}/>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="system.frequence.foret">Fréquence en Forêt</label>
|
||||
<input type="number" name="system.frequence.foret" value="{{system.frequence.foret}}" min="0" max="100" data-dtype="Number" {{#unless isGM}}disabled{{/unless}}/>
|
||||
<input type="number" name="system.frequence.foret" value="{{system.frequence.foret}}" min="0" max="100" data-dtype="Number" {{#unless options.isGM}}disabled{{/unless}}/>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="system.frequence.monts">Fréquence en Monts</label>
|
||||
<input type="number" name="system.frequence.monts" value="{{system.frequence.monts}}" min="0" max="100" data-dtype="Number" {{#unless isGM}}disabled{{/unless}}/>
|
||||
<input type="number" name="system.frequence.monts" value="{{system.frequence.monts}}" min="0" max="100" data-dtype="Number" {{#unless options.isGM}}disabled{{/unless}}/>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="system.frequence.desert">Fréquence en Désert</label>
|
||||
<input type="number" name="system.frequence.desert" value="{{system.frequence.desert}}" min="0" max="100" data-dtype="Number" {{#unless isGM}}disabled{{/unless}}/>
|
||||
<input type="number" name="system.frequence.desert" value="{{system.frequence.desert}}" min="0" max="100" data-dtype="Number" {{#unless options.isGM}}disabled{{/unless}}/>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="system.frequence.fleuve">Fréquence en Fleuve</label>
|
||||
<input type="number" name="system.frequence.fleuve" value="{{system.frequence.fleuve}}" min="0" max="100" data-dtype="Number" {{#unless isGM}}disabled{{/unless}}/>
|
||||
<input type="number" name="system.frequence.fleuve" value="{{system.frequence.fleuve}}" min="0" max="100" data-dtype="Number" {{#unless options.isGM}}disabled{{/unless}}/>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="system.frequence.lac">Fréquence en Lac</label>
|
||||
<input type="number" name="system.frequence.lac" value="{{system.frequence.lac}}" min="0" max="100" data-dtype="Number" {{#unless isGM}}disabled{{/unless}}/>
|
||||
<input type="number" name="system.frequence.lac" value="{{system.frequence.lac}}" min="0" max="100" data-dtype="Number" {{#unless options.isGM}}disabled{{/unless}}/>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="system.frequence.marais">Fréquence en Marais</label>
|
||||
<input type="number" name="system.frequence.marais" value="{{system.frequence.marais}}" min="0" max="100" data-dtype="Number" {{#unless isGM}}disabled{{/unless}}/>
|
||||
<input type="number" name="system.frequence.marais" value="{{system.frequence.marais}}" min="0" max="100" data-dtype="Number" {{#unless options.isGM}}disabled{{/unless}}/>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="system.frequence.gouffre">Fréquence en Gouffre</label>
|
||||
<input type="number" name="system.frequence.gouffre" value="{{system.frequence.gouffre}}" min="0" max="100" data-dtype="Number" {{#unless isGM}}disabled{{/unless}}/>
|
||||
<input type="number" name="system.frequence.gouffre" value="{{system.frequence.gouffre}}" min="0" max="100" data-dtype="Number" {{#unless options.isGM}}disabled{{/unless}}/>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="system.frequence.necropole">Fréquence en Nécropole</label>
|
||||
<input type="number" name="system.frequence.necropole" value="{{system.frequence.necropole}}" min="0" max="100" data-dtype="Number" {{#unless isGM}}disabled{{/unless}}/>
|
||||
<input type="number" name="system.frequence.necropole" value="{{system.frequence.necropole}}" min="0" max="100" data-dtype="Number" {{#unless options.isGM}}disabled{{/unless}}/>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="system.frequence.desolation">Fréquence en Désolation</label>
|
||||
<input type="number" name="system.frequence.desolation" value="{{system.frequence.desolation}}" min="0" max="100" data-dtype="Number" {{#unless isGM}}disabled{{/unless}}/>
|
||||
<input type="number" name="system.frequence.desolation" value="{{system.frequence.desolation}}" min="0" max="100" data-dtype="Number" {{#unless options.isGM}}disabled{{/unless}}/>
|
||||
</div>
|
||||
</div>
|
||||
{{/unless}}
|
||||
|
@ -59,7 +59,7 @@
|
||||
<label for="system.xp">XP</label>
|
||||
<input class="attribute-value" type="text" name="system.xp" value="{{system.xp}}" data-dtype="Number"/>
|
||||
</div>
|
||||
{{#if owner}}
|
||||
{{#if options.isOwner}}
|
||||
{{#each bonusCaseList as |bcData key|}}
|
||||
<div class="form-group">
|
||||
<label for="caseValue">Case/Bonus :</label>
|
||||
|
@ -11,7 +11,7 @@
|
||||
</select>
|
||||
</div>
|
||||
|
||||
{{#if isOwned}}
|
||||
{{#if options.isOwned}}
|
||||
{{>"systems/foundryvtt-reve-de-dragon/templates/item/temporel.hbs" this labeldebut="Depuis le" labelfin="Jusqu'au"}}
|
||||
{{/if}}
|
||||
|
||||
|
@ -33,7 +33,7 @@
|
||||
<label for="xp">Fatigue</label>
|
||||
<input class="attribute-value" type="text" name="system.fatigue" value="{{system.fatigue}}" data-dtype="Number"/>
|
||||
</div>
|
||||
{{#if isGM}}
|
||||
{{#if options.isGM}}
|
||||
<div class="form-group">
|
||||
<label for="xp">Cacher les Points de Tâches nécessaires au joueur</label>
|
||||
<input class="attribute-value" type="checkbox" name="system.cacher_points_de_tache" value="{{system.cacher_points_de_tache}}" {{checked system.cacher_points_de_tache}}/>
|
||||
@ -59,11 +59,11 @@
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="xp">Nombre de Succès</label>
|
||||
<input class="attribute-value" type="text" name="system.nb_jet_succes" value="{{system.nb_jet_succes}}" data-dtype="Number" {{#if isGM}}{{else}}disabled{{/if}}/>
|
||||
<input class="attribute-value" type="text" name="system.nb_jet_succes" value="{{system.nb_jet_succes}}" data-dtype="Number" {{#if options.isGM}}{{else}}disabled{{/if}}/>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="xp">Nombre d'Echecs</label>
|
||||
<input class="attribute-value" type="text" name="system.nb_jet_echec" value="{{system.nb_jet_echec}}" data-dtype="Number" {{#if isGM}}{{else}}disabled{{/if}}/>
|
||||
<input class="attribute-value" type="text" name="system.nb_jet_echec" value="{{system.nb_jet_echec}}" data-dtype="Number" {{#if options.isGM}}{{else}}disabled{{/if}}/>
|
||||
</div>
|
||||
|
||||
{{>"systems/foundryvtt-reve-de-dragon/templates/partial-item-description.html"}}
|
||||
|
@ -1,4 +1,4 @@
|
||||
{{#if (and isOwned isComestible)}}
|
||||
{{#if (and options.isOwned isComestible)}}
|
||||
<div class="form-group">
|
||||
{{#if (eq isComestible 'brut')}}
|
||||
<span><a class="preparer-nourriture chat-card-button" data-actor-id="{{actorId}}">Cuisiner</a></span>
|
||||
|
@ -1,4 +1,4 @@
|
||||
{{#unless isOwned}}
|
||||
{{#unless options.isOwned}}
|
||||
{{>'systems/foundryvtt-reve-de-dragon/templates/scripts/autocomplete-script.hbs'}}
|
||||
<div class="tab items" data-group="primary" data-tab="environnement">
|
||||
<div class="form-group description-milieu">
|
||||
|
@ -1,3 +1,3 @@
|
||||
{{#unless isOwned}}
|
||||
{{#unless options.isOwned}}
|
||||
<a class="item" data-tab="environnement">Environnement</a>
|
||||
{{/unless}}
|
@ -1,14 +1,14 @@
|
||||
<div class="flexcol">
|
||||
<div>
|
||||
<span><label>Description : </label></span>
|
||||
<div class="form-group large-editor">
|
||||
{{editor description target="system.description" button=true owner=owner editable=true engine="prosemirror"}}
|
||||
{{editor description target="system.description" button=true owner=options.isOwner editable=options.editable engine="prosemirror"}}
|
||||
</div>
|
||||
</div>
|
||||
{{#if isGM}}
|
||||
<div class="flexcol">
|
||||
{{#if options.isGM}}
|
||||
<div>
|
||||
<span><label>Description (MJ seulement): </label></span>
|
||||
<div class="form-group large-editor">
|
||||
{{editor descriptionmj target="system.descriptionmj" button=true owner=owner editable=true engine="prosemirror"}}
|
||||
{{editor descriptionmj target="system.descriptionmj" button=true owner=options.isOwner editable=options.editable engine="prosemirror"}}
|
||||
</div>
|
||||
</div>
|
||||
{{/if}}
|
@ -1,4 +1,4 @@
|
||||
{{#if isGM}}
|
||||
{{#if options.isGM}}
|
||||
<div class="form-group">
|
||||
<label for="system.frequence">Fréquence</label>
|
||||
<input class="attribute-value" type="text" name="system.frequence" value="{{system.frequence}}" data-dtype="Number"/>
|
||||
|
@ -1,4 +1,4 @@
|
||||
{{#if isGM}}
|
||||
{{#if options.isGM}}
|
||||
<div class="form-group">
|
||||
<label for="system.hautrevant">Pour haut-rêvants</label>
|
||||
<input class="attribute-value" type="checkbox" name="system.hautrevant" {{#if system.hautrevant}}checked{{/if}}/>
|
||||
|
48
templates/sommeil/dialog-chateau-dormant.hbs
Normal file
48
templates/sommeil/dialog-chateau-dormant.hbs
Normal file
@ -0,0 +1,48 @@
|
||||
<form class="chateau-dormant">
|
||||
<div class="flexcol">
|
||||
<div class="form-group">
|
||||
<label for="motifStress">Motif de stress</label>
|
||||
<input type="text" name="motifStress" value="{{motifStress}}" data-dtype="String" />
|
||||
</div>
|
||||
<hr>
|
||||
<ul class="item-list alterne-list">
|
||||
<li class="competence-header flexrow">
|
||||
<span class="flex-grow-3">Personnage</span>
|
||||
<span class="flex-shrink">Insomnie</span>
|
||||
<span class="flex-grow-1">Sommeil</span>
|
||||
<span class="flex-shrink">Stress</span>
|
||||
<span class="flex-grow-1">Moral</span>
|
||||
<span class="flex-shrink">Ignorer</span>
|
||||
</li>
|
||||
{{#each actors as |actor|}}
|
||||
<li class="item flexrow list-item set-sommeil-actor" data-actor-id="{{actor.id}}">
|
||||
<span class="flex-grow-3">
|
||||
<label>
|
||||
<img class="chat-icon" src="{{actor.img}}" title="{{actor.name}}" />
|
||||
<span>{{actor.name}}</span>
|
||||
</label>
|
||||
</span>
|
||||
<span class="flex-shrink">
|
||||
<input type="checkbox" class="sommeil-insomnie" {{#if actor.system.sommeil.insomnie}}checked{{/if}}>
|
||||
</span>
|
||||
<span class="flex-grow-1">
|
||||
<input type="number" class="number-x sommeil-heures" data-dtype="Number"
|
||||
value="{{#if actor.system.sommeil.insomnie}}0{{else}}4{{/if}}"
|
||||
min="0" max="{{#if actor.system.sommeil.insomnie}}0{{else}}12{{/if}}"
|
||||
{{#if actor.system.sommeil.insomnie}}disabled{{/if}}/>
|
||||
h
|
||||
</span>
|
||||
<span class="flex-shrink">
|
||||
<input type="number" class="number-x2 sommeil-stress" value="0" data-dtype="Number" min="0" max="200"/>
|
||||
</span>
|
||||
<span class="flex-grow-1 flexrow sommeil-actor-moral">
|
||||
{{> "systems/foundryvtt-reve-de-dragon/templates/sommeil/sommeil-actor-moral.hbs" actor.system.sommeil}}
|
||||
</span>
|
||||
<span class="flex-shrink">
|
||||
<input type="checkbox" class="sommeil-ignorer">
|
||||
</span>
|
||||
</li>
|
||||
{{/each}}
|
||||
</ul>
|
||||
</div>
|
||||
</form>
|
@ -5,22 +5,39 @@
|
||||
<h2>{{name}} se repose</h2>
|
||||
</span></div>
|
||||
<div class="flexrow"><span>
|
||||
<input type="radio" name="repos" id="chateau-dormant" value="chateau-dormant">
|
||||
<label for="chateau-dormant">Château Dormant</label>
|
||||
<input class type="radio" name="repos" id="sieste" value="sieste">
|
||||
<label for="sieste">Sieste de
|
||||
<input type="number" name="sieste.heures" value="1" data-dtype="Number" />
|
||||
heures</label>
|
||||
</span></div>
|
||||
<div class="flexrow"><span><hr></span></div>
|
||||
{{#if system.sommeil.nouveaujour}}
|
||||
<div class="flexrow"><span>
|
||||
<input class type="radio" name="repos" id="sieste" value="sieste">
|
||||
<label for="sieste">Sieste de quelques heures</label>
|
||||
<input type="radio" name="repos" id="chateau-dormant" value="chateau-dormant">
|
||||
<label for="chateau-dormant">Juste château Dormant</label>
|
||||
</span></div>
|
||||
<div class="flexrow"><span>
|
||||
<input type="radio" name="repos" id="nuit" value="nuit" checked>
|
||||
<label for="nuit">Dormir la nuit</label>
|
||||
{{#if system.sommeil.insomnie}}
|
||||
<label>Insomnie cette nuit</label>
|
||||
{{else}}
|
||||
<label for="nuit">Dormir
|
||||
<input type="number" name="sommeil.heures" value="{{system.sommeil.heures}}" data-dtype="Number" />
|
||||
heures cette nuit
|
||||
</label>
|
||||
{{/if}}
|
||||
</span></div>
|
||||
<div class="flexrow">
|
||||
<label for="nb-heures">Nombre d'heures</label>
|
||||
<input type="number" name="nb-heures" value="4" data-dtype="Number" />
|
||||
<label for="moral">Moral</label>
|
||||
<div class="sommeil-actor-moral">
|
||||
{{> "systems/foundryvtt-reve-de-dragon/templates/sommeil/sommeil-actor-moral.hbs" system.sommeil}}
|
||||
</div>
|
||||
</div>
|
||||
{{else}}
|
||||
<div class="flexrow"><span>
|
||||
Le gardien des rêves doit faire passer Chateau Dormant
|
||||
</span></div>
|
||||
{{/if}}
|
||||
<div class="flexrow"><span><hr></span></div>
|
||||
<div class="flexrow"><span>
|
||||
<input type="radio" name="repos" id="gris-reve" value="gris-reve">
|
11
templates/sommeil/sommeil-actor-moral.hbs
Normal file
11
templates/sommeil/sommeil-actor-moral.hbs
Normal file
@ -0,0 +1,11 @@
|
||||
<span>
|
||||
<a data-moral="malheureux">
|
||||
<i class="{{#if (eq moral 'malheureux')}}fa-solid{{else}}fa-regular{{/if}} fa-face-sad-tear"></i>
|
||||
</a>
|
||||
<a data-moral="neutre">
|
||||
<i class="{{#if (eq moral 'neutre')}}fa-solid{{else}}fa-regular{{/if}} fa-face-meh"></i>
|
||||
</a>
|
||||
<a data-moral="heureux">
|
||||
<i class="{{#if (eq moral 'heureux')}}fa-solid{{else}}fa-regular{{/if}} fa-face-smile"></i>
|
||||
</a>
|
||||
</span>
|
@ -7,12 +7,16 @@
|
||||
<span class="liste-filtres-actifs"></span>
|
||||
</div>
|
||||
<hr>
|
||||
<div class="recherche">
|
||||
<div class="zone-recherche">
|
||||
<div class="filtres">
|
||||
<div class="titre-fenetre-recherche">
|
||||
<div class="titre-resultats-recherche">
|
||||
<h3>Filtres</h3>
|
||||
</div>
|
||||
|
||||
<div class="section-filters-text">
|
||||
<h4>
|
||||
<input class="recherche flex-grow" type="text" value="{{options.recherche.text}}" name="recherche" size="8" data-dtype="String" placeholder=""/>
|
||||
</h4>
|
||||
</div>
|
||||
<div class="section-filters-root">
|
||||
<h4>
|
||||
<a class="section-filters-toggle">Milieux
|
||||
@ -56,10 +60,10 @@
|
||||
</div>
|
||||
<div class="vl"></div>
|
||||
<div class="resultats">
|
||||
<div class="titre-fenetre-recherche">
|
||||
<h3>Résultat de recherche</h3>
|
||||
<div class="titre-resultats-recherche">
|
||||
<h3>Résultat de recherche</h3>
|
||||
</div>
|
||||
<div class="liste-resultats">
|
||||
<div class="liste-resultats-recherche">
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
Reference in New Issue
Block a user