Liens jets de dés #737

Merged
uberwald merged 9 commits from VincentVk/foundryvtt-reve-de-dragon:v11 into v11 2025-01-12 16:15:34 +01:00
66 changed files with 716 additions and 261 deletions

View File

@ -1,4 +1,19 @@
# 12.0 # 12.0
## 12.0.34 - la tête d'Astrobazzarh
- on peut ajouter des liens "jet de dés" dans les journaux texte
- on peut ajouter des liens "jet de dés" dans les descriptions, notes, ...
- les liens "jet de dés" peuvent être utilisés pour un acteur, ou les items de l'acteurs
- les liens "jet avec caractéristiques" s'appliquent:
- à tous les tokens sélectionnés
- sinon, à l'acteur propriétaire d'un Item
- sinon, au personnage du joueur
- gestion des blocs secrets dans les descriptions
- on peut ajouter des liens "jet de dés" pour appeler une formule dés de foundry
- les liens "manipulation alchimiques" peuvent être dans les descriptions, notes, ...
- les "manipulation alchimiques" fonctionnent comme tous les autres jets
## 12.0.33 - la vieillesse d'Astrobazzarh ## 12.0.33 - la vieillesse d'Astrobazzarh
- retour de l'expérience pour les joueurs - retour de l'expérience pour les joueurs
- suppression du message "Pas de caractéristique" sur les jets d'odorat-goût - suppression du message "Pas de caractéristique" sur les jets d'odorat-goût

View File

@ -19,6 +19,7 @@ import { RdDBaseActorSangSheet } from "./actor/base-actor-sang-sheet.js";
import { RdDCoeur } from "./coeur/rdd-coeur.js"; import { RdDCoeur } from "./coeur/rdd-coeur.js";
import { AppPersonnageAleatoire } from "./actor/random/app-personnage-aleatoire.js"; import { AppPersonnageAleatoire } from "./actor/random/app-personnage-aleatoire.js";
import { RdDItemRace } from "./item/race.js"; import { RdDItemRace } from "./item/race.js";
import { RdDTextEditor } from "./apps/rdd-text-roll.js";
/* -------------------------------------------- */ /* -------------------------------------------- */
/** /**
@ -44,8 +45,8 @@ export class RdDActorSheet extends RdDBaseActorSangSheet {
cssClass: this.isEditable ? "editable" : "locked", cssClass: this.isEditable ? "editable" : "locked",
limited: this.actor.limited, limited: this.actor.limited,
owner: this.actor.isOwner, owner: this.actor.isOwner,
biographie: await TextEditor.enrichHTML(this.actor.system.biographie, { async: true }), biographie: await RdDTextEditor.enrichHTML(this.actor.system.biographie, this.actor),
notes: await TextEditor.enrichHTML(this.actor.system.notes, { async: true }), notes: await RdDTextEditor.enrichHTML(this.actor.system.notes, this.actor),
}); });
foundry.utils.mergeObject(formData.calc, { foundry.utils.mergeObject(formData.calc, {
surenc: this.actor.computeMalusSurEncombrement(), surenc: this.actor.computeMalusSurEncombrement(),
@ -221,7 +222,7 @@ export class RdDActorSheet extends RdDBaseActorSangSheet {
} }
// Points de reve actuel // Points de reve actuel
this.html.find('.roll-reve-actuel').click(async event => this.actor.rollCarac('reve-actuel', true)) this.html.find('.roll-reve-actuel').click(async event => this.actor.rollCarac('reve-actuel', {resistance:true}))
this.html.find('.empoignade-label a').click(async event => RdDEmpoignade.onAttaqueEmpoignadeFromItem(RdDSheetUtility.getItem(event, this.actor))) this.html.find('.empoignade-label a').click(async event => RdDEmpoignade.onAttaqueEmpoignadeFromItem(RdDSheetUtility.getItem(event, this.actor)))
this.html.find('.roll-arme').click(async event => this.actor.rollArme(foundry.utils.duplicate(this._getEventArmeCombat(event)), 'competence')) this.html.find('.roll-arme').click(async event => this.actor.rollArme(foundry.utils.duplicate(this._getEventArmeCombat(event)), 'competence'))

View File

@ -17,7 +17,7 @@ import { RdDItemSigneDraconique } from "./item/signedraconique.js";
import { ReglesOptionnelles } from "./settings/regles-optionnelles.js"; import { ReglesOptionnelles } from "./settings/regles-optionnelles.js";
import { EffetsDraconiques } from "./tmr/effets-draconiques.js"; import { EffetsDraconiques } from "./tmr/effets-draconiques.js";
import { Draconique } from "./tmr/draconique.js"; import { Draconique } from "./tmr/draconique.js";
import { LIST_CARAC, RdDCarac } from "./rdd-carac.js"; import { LIST_CARAC_PERSONNAGE, RdDCarac } from "./rdd-carac.js";
import { DialogConsommer } from "./dialog-item-consommer.js"; import { DialogConsommer } from "./dialog-item-consommer.js";
import { DialogFabriquerPotion } from "./dialog-fabriquer-potion.js"; import { DialogFabriquerPotion } from "./dialog-fabriquer-potion.js";
import { RollDataAjustements } from "./rolldata-ajustements.js"; import { RollDataAjustements } from "./rolldata-ajustements.js";
@ -662,15 +662,15 @@ export class RdDActor extends RdDBaseActorSang {
/* -------------------------------------------- */ /* -------------------------------------------- */
async updateCarac(caracName, to) { async updateCarac(caracName, to) {
to = Number(to) to = Number(to)
if (!RdDItemRace.checkRacialMax(this, caracName, to)){ if (!RdDItemRace.checkRacialMax(this, caracName, to)) {
return return
} }
if (caracName == LIST_CARAC.reve.code) { if (caracName == LIST_CARAC_PERSONNAGE.reve.code) {
if (to > Misc.toInt(this.system.reve.seuil.value)) { if (to > Misc.toInt(this.system.reve.seuil.value)) {
this.setPointsDeSeuil(to); this.setPointsDeSeuil(to);
} }
} }
if (caracName == LIST_CARAC.chance.code) { if (caracName == LIST_CARAC_PERSONNAGE.chance.code) {
if (to > Misc.toInt(this.system.compteurs.chance.value)) { if (to > Misc.toInt(this.system.compteurs.chance.value)) {
this.setPointsDeChance(to); this.setPointsDeChance(to);
} }
@ -1387,7 +1387,7 @@ export class RdDActor extends RdDBaseActorSang {
} }
await RdDResolutionTable.rollData(ethylismeData.jetVie); await RdDResolutionTable.rollData(ethylismeData.jetVie);
this._gererExperience(ethylismeData.jetVie); this.gererExperience(ethylismeData.jetVie);
RollDataAjustements.calcul(ethylismeData.jetVie, this); RollDataAjustements.calcul(ethylismeData.jetVie, this);
if (ethylismeData.jetVie.rolled.isSuccess) { if (ethylismeData.jetVie.rolled.isSuccess) {
ethylisme.nb_doses++; ethylisme.nb_doses++;
@ -1419,7 +1419,7 @@ export class RdDActor extends RdDBaseActorSang {
finalLevel: Number(ethylisme.value) + Number(this.system.compteurs.moral.value) finalLevel: Number(ethylisme.value) + Number(this.system.compteurs.moral.value)
} }
await RdDResolutionTable.rollData(ethylismeData.jetVolonte); await RdDResolutionTable.rollData(ethylismeData.jetVolonte);
this._gererExperience(ethylismeData.jetVolonte); this.gererExperience(ethylismeData.jetVolonte);
RollDataAjustements.calcul(ethylismeData.jetVolonte, this); RollDataAjustements.calcul(ethylismeData.jetVolonte, this);
} }
} }
@ -1799,38 +1799,8 @@ export class RdDActor extends RdDBaseActorSang {
} }
} }
/**
* Méthode pour faire un jet prédéterminer sans ouvrir la fenêtre de dialogue
* @param {*} caracName
* @param {*} compName
* @param {*} diff
* @param {*} options
* @returns
*/
async doRollCaracCompetence(caracName, compName, diff, options = { title: "" }) {
const carac = this.getCaracByName(caracName);
if (!carac) {
ui.notifications.warn(`${this.name} n'a pas de caractéristique correspondant à ${caracName}`)
return;
}
const competence = this.getCompetence(compName);
let rollData = {
alias: this.getAlias(),
caracValue: Number(carac.value),
selectedCarac: carac,
competence: competence,
diffLibre: diff,
show: { title: options?.title ?? '' }
};
RollDataAjustements.calcul(rollData, this);
await RdDResolutionTable.rollData(rollData);
this._gererExperience(rollData);
await RdDResolutionTable.displayRollData(rollData, this)
return rollData.rolled;
}
/* -------------------------------------------- */ /* -------------------------------------------- */
_gererExperience(rollData) { gererExperience(rollData) {
const callback = this.createCallbackExperience(); const callback = this.createCallbackExperience();
if (callback.condition(rollData)) { if (callback.condition(rollData)) {
callback.action(rollData); callback.action(rollData);

View File

@ -1,3 +1,4 @@
import { RdDTextEditor } from "../apps/rdd-text-roll.js";
import { Grammar } from "../grammar.js"; import { Grammar } from "../grammar.js";
import { ITEM_TYPES } from "../item.js"; import { ITEM_TYPES } from "../item.js";
import { RdDSheetUtility } from "../rdd-sheet-utility.js"; import { RdDSheetUtility } from "../rdd-sheet-utility.js";
@ -27,7 +28,7 @@ export class RdDBaseActorReveSheet extends RdDBaseActorSheet {
this.html.find('.button-encaissement').click(async event => this.actor.encaisser()) this.html.find('.button-encaissement').click(async event => this.actor.encaisser())
this.html.find('.roll-carac').click(async event => { this.html.find('.roll-carac').click(async event => {
this.actor.rollCarac(Grammar.toLowerCaseNoAccent(event.currentTarget.attributes['data-carac-name'].value))}); this.actor.rollCarac(Grammar.toLowerCaseNoAccent(event.currentTarget.attributes['data-carac-name'].value))})
this.html.find('.roll-competence').click(async event => this.actor.rollCompetence(RdDSheetUtility.getItemId(event))); this.html.find('.roll-competence').click(async event => this.actor.rollCompetence(RdDSheetUtility.getItemId(event)));
this.html.find('.endurance-plus').click(async event => this.actor.santeIncDec("endurance", 1)); this.html.find('.endurance-plus').click(async event => this.actor.santeIncDec("endurance", 1));
this.html.find('.endurance-moins').click(async event => this.actor.santeIncDec("endurance", -1)); this.html.find('.endurance-moins').click(async event => this.actor.santeIncDec("endurance", -1));
@ -47,6 +48,7 @@ export class RdDBaseActorReveSheet extends RdDBaseActorSheet {
} }
}], { renderSheet: true }) }], { renderSheet: true })
) )
this.html.find('.roll-text').click(async event => await RdDTextEditor.rollText(event, this.actor))
if (this.options.vueDetaillee) { if (this.options.vueDetaillee) {
// On carac change // On carac change

View File

@ -22,6 +22,7 @@ import { RdDCombat } from "../rdd-combat.js";
import { RdDEmpoignade } from "../rdd-empoignade.js"; import { RdDEmpoignade } from "../rdd-empoignade.js";
import { RdDPossession } from "../rdd-possession.js"; import { RdDPossession } from "../rdd-possession.js";
import { BASE_CORPS_A_CORPS, BASE_ESQUIVE, POSSESSION_SANS_DRACONIC } from "../item/base-items.js"; import { BASE_CORPS_A_CORPS, BASE_ESQUIVE, POSSESSION_SANS_DRACONIC } from "../item/base-items.js";
import { RollDataAjustements } from "../rolldata-ajustements.js";
/** /**
* Classe de base pour les acteurs disposant de rêve (donc, pas des objets) * Classe de base pour les acteurs disposant de rêve (donc, pas des objets)
@ -293,6 +294,38 @@ export class RdDBaseActorReve extends RdDBaseActor {
createCallbackAppelAuMoral() { return this.createEmptyCallback(); } createCallbackAppelAuMoral() { return this.createEmptyCallback(); }
async _onCloseRollDialog(html) { } async _onCloseRollDialog(html) { }
/**
* Méthode pour faire un jet prédéterminer sans ouvrir la fenêtre de dialogue
* @param {*} caracName code ou label de la caractéristique. On peut utiliser 'intel' pour Intellect.
* @param {*} compName nom de compétence ou nom abrégé.
* @param {*} diff difficulté (0 si undefined)
* @param {*} options
* @returns le jet effectué
*/
async doRollCaracCompetence(caracName, compName, diff, options = { title: "" }) {
const carac = this.getCaracByName(caracName);
if (!carac) {
ui.notifications.warn(`${this.name} n'a pas de caractéristique correspondant à ${caracName}`)
return
}
const competence = this.getCompetence(compName);
let rollData = {
alias: this.getAlias(),
caracValue: Number(carac.value),
selectedCarac: carac,
competence: competence,
diffLibre: diff ?? 0,
show: { title: options?.title ?? '' }
}
RollDataAjustements.calcul(rollData, this);
await RdDResolutionTable.rollData(rollData);
this.gererExperience(rollData);
await RdDResolutionTable.displayRollData(rollData, this)
return rollData.rolled;
}
gererExperience(rollData) { }
/* -------------------------------------------- */ /* -------------------------------------------- */
async roll() { async roll() {
RdDEmpoignade.checkEmpoignadeEnCours(this) RdDEmpoignade.checkEmpoignadeEnCours(this)
@ -311,14 +344,14 @@ export class RdDBaseActorReve extends RdDBaseActor {
competences: this.itemTypes['competence'] competences: this.itemTypes['competence']
}, },
callbackAction: r => this.$onRollCaracResult(r) callbackAction: r => this.$onRollCaracResult(r)
}); })
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
async rollCarac(caracName, jetResistance = undefined) { async rollCarac(caracName, options = {}) {
if (Grammar.equalsInsensitive(caracName, 'taille')) { if (Grammar.equalsInsensitive(caracName, 'taille')) {
return return
} }
foundry.utils.mergeObject(options, { resistance: false, diff: 0 }, { overwrite: false })
RdDEmpoignade.checkEmpoignadeEnCours(this) RdDEmpoignade.checkEmpoignadeEnCours(this)
let selectedCarac = this.getCaracByName(caracName) let selectedCarac = this.getCaracByName(caracName)
console.log("selectedCarac", selectedCarac) console.log("selectedCarac", selectedCarac)
@ -329,7 +362,8 @@ export class RdDBaseActorReve extends RdDBaseActor {
rollData: { rollData: {
selectedCarac: selectedCarac, selectedCarac: selectedCarac,
competences: this.itemTypes['competence'], competences: this.itemTypes['competence'],
jetResistance: jetResistance ? caracName : undefined diffLibre: options.diff ?? 0,
jetResistance: options.resistance ? caracName : undefined
}, },
callbackAction: r => this.$onRollCaracResult(r) callbackAction: r => this.$onRollCaracResult(r)
}); });

View File

@ -5,6 +5,7 @@ import { RdDSheetUtility } from "../rdd-sheet-utility.js";
import { Monnaie } from "../item-monnaie.js"; import { Monnaie } from "../item-monnaie.js";
import { RdDItem, ITEM_TYPES } from "../item.js"; import { RdDItem, ITEM_TYPES } from "../item.js";
import { RdDItemCompetenceCreature } from "../item-competencecreature.js"; import { RdDItemCompetenceCreature } from "../item-competencecreature.js";
import { RdDTextEditor } from "../apps/rdd-text-roll.js";
/* -------------------------------------------- */ /* -------------------------------------------- */
/** /**
@ -35,8 +36,8 @@ export class RdDBaseActorSheet extends ActorSheet {
img: this.actor.img, img: this.actor.img,
name: this.actor.name, name: this.actor.name,
system: this.actor.system, system: this.actor.system,
description: await TextEditor.enrichHTML(this.actor.system.description, { async: true }), description: await RdDTextEditor.enrichHTML(this.actor.system.description, this.actor),
notesmj: await TextEditor.enrichHTML(this.actor.system.notesmj, { async: true }), notesmj: await RdDTextEditor.enrichHTML(this.actor.system.notesmj, this.actor),
options: RdDSheetUtility.mergeDocumentRights(this.options, this.actor, this.isEditable), options: RdDSheetUtility.mergeDocumentRights(this.options, this.actor, this.isEditable),
effects: this.actor.effects effects: this.actor.effects
} }

View File

@ -81,7 +81,6 @@ export class RdDBaseActor extends Actor {
} }
} }
static getRealActor(actorId, tokenId) { static getRealActor(actorId, tokenId) {
if (tokenId) { if (tokenId) {
let token = canvas.tokens.get(tokenId) let token = canvas.tokens.get(tokenId)
@ -161,8 +160,11 @@ export class RdDBaseActor extends Actor {
return RdDBaseActor.$findCaracByName(carac, name); return RdDBaseActor.$findCaracByName(carac, name);
} }
mapCarac(caracCode) { return caracCode }
getCaracByName(name) { getCaracByName(name) {
switch (Grammar.toLowerCaseNoAccent(name)) { name = this.mapCarac(Grammar.toLowerCaseNoAccent(name))
switch (name) {
case 'reve-actuel': case 'reve actuel': case 'reve-actuel': case 'reve actuel':
return this.getCaracReveActuel(); return this.getCaracReveActuel();
case 'chance-actuelle': case 'chance-actuelle': case 'chance-actuelle': case 'chance-actuelle':

View File

@ -1,4 +1,6 @@
import { Grammar } from "../grammar.js";
import { ITEM_TYPES } from "../item.js"; import { ITEM_TYPES } from "../item.js";
import { LIST_CARAC_AUTRES } from "../rdd-carac.js";
import { RdDBaseActorSang } from "./base-actor-sang.js"; import { RdDBaseActorSang } from "./base-actor-sang.js";
export class RdDCreature extends RdDBaseActorSang { export class RdDCreature extends RdDBaseActorSang {
@ -32,4 +34,14 @@ export class RdDCreature extends RdDBaseActorSang {
} }
} }
mapCarac(caracCode) {
switch (caracCode) {
case 'vue': case 'ouie':
case 'odoratgout':
case 'empathie':
return 'perception'
}
return caracCode
}
} }

View File

@ -117,4 +117,13 @@ export class RdDEntite extends RdDBaseActorReve {
super.setEntiteReveAccordee(actor) super.setEntiteReveAccordee(actor)
} }
} }
mapCarac(caracCode) {
switch (caracCode) {
case 'taille':
return caracCode
}
return 'reve'
}
} }

View File

@ -34,7 +34,6 @@ const XREGEXP_WEAPON_MANIEMENT = "(?<maniement>(" + Misc.join(Object.keys(MANIEM
const XREGEXP_SORT_VOIE = "(?<voies>[OHNT](\\/[OHNT])*)" const XREGEXP_SORT_VOIE = "(?<voies>[OHNT](\\/[OHNT])*)"
const XREGEXP_SORT_NAME = "(?<name>[^\\(]+)" const XREGEXP_SORT_NAME = "(?<name>[^\\(]+)"
// const XREGEXP_SORT_CASE = "(?<coord>([A-Za-zÀ-ÖØ-öø-ÿ\\s\\-]+|[A-M]\\d{1,2})+)"
const XREGEXP_SORT_CASE = "(?<coord>([A-Za-zÀ-ÖØ-öø-ÿ\\s\\-]+|[A-M]\\d{1,2}))" const XREGEXP_SORT_CASE = "(?<coord>([A-Za-zÀ-ÖØ-öø-ÿ\\s\\-]+|[A-M]\\d{1,2}))"
const XREGEXP_SORT = "(" + XREGEXP_SORT_VOIE const XREGEXP_SORT = "(" + XREGEXP_SORT_VOIE

View File

@ -0,0 +1,224 @@
import "./xregexp-all.js";
import { RdDCarac } from "../rdd-carac.js";
import { SystemCompendiums } from "../settings/system-compendiums.js";
import { RdDItemCompetence } from "../item-competence.js";
import { ACTOR_TYPES, ITEM_TYPES } from "../item.js";
import { RdDUtility } from "../rdd-utility.js";
import { Misc } from "../misc.js";
import { RdDAlchimie } from "../rdd-alchimie.js";
const REGEX_ALCHIMIE_TERMES = "(?<termes>(\\w|-)+)"
const REGEX_ALCHIMIE_MANIP = "(?<manip>(couleur|consistance))"
const XREGEXP_ROLL_ALCHIMIE = XRegExp("@roll\\[" + REGEX_ALCHIMIE_MANIP + "\\s+" + REGEX_ALCHIMIE_TERMES + "\\]", 'giu')
const XREGEXP_ROLL_ALCHIMIE_MANIP = XRegExp("@" + REGEX_ALCHIMIE_MANIP + "\\{" + REGEX_ALCHIMIE_TERMES + "\\}", 'giu')
const REGEXP_ROLL_CARAC_COMP = "(?<carac>[A-Za-zÀ-ÖØ-öø-ÿ\\s\\-]+)(\\/(?<competence>[A-Za-zÀ-ÖØ-öø-ÿ\\s\\-]+))?(/(?<diff>[\\+\\-]?\\d+))?"
const XREGEXP_ROLL_CARAC_COMP = XRegExp("@roll\\[" + REGEXP_ROLL_CARAC_COMP + "\\]", 'giu')
const REGEXP_ROLL_FORMULA = "(?<formula>[^\\[\\]]+)"
const XREGEXP_ROLL_FORMULA = XRegExp("@roll\\[" + REGEXP_ROLL_FORMULA + "\\]", 'giu')
/**
* classe pour gérer les jets d'alchimie
*/
class TextRollAlchimie {
static async onRollText(event, actor) {
actor = TextRollAlchimie.getSelectedActor(actor)
if (actor) {
const recetteId = event.currentTarget.attributes['data-recette-id']?.value
const manip = event.currentTarget.attributes['data-manip'].value
const termes = event.currentTarget.attributes['data-termes'].value
if (recetteId) {
await actor.effectuerTacheAlchimie(recetteId, manip, termes)
}
else {
const carac = RdDCarac.caracDetails(RdDAlchimie.getCaracTache(manip))
const diff = RdDAlchimie.getDifficulte(termes)
await actor.rollCaracCompetence(carac.code, 'Alchimie', diff)
}
}
}
static getSelectedActor(actor) {
actor = actor ?? RdDUtility.getSelectedActor()
if (actor && actor.type == ACTOR_TYPES.personnage) {
return actor
}
return undefined
}
static async onReplaceRoll(context) {
const handler = new TextRollAlchimie(context)
context.text = await handler.replaceManipulationAlchimie()
}
constructor(context) {
this.context = context
}
async replaceManipulationAlchimie() {
await XRegExp.forEach(this.context.text, XREGEXP_ROLL_ALCHIMIE, async (rollMatch, i) => await this._replaceOneAlchimie(rollMatch, i))
await XRegExp.forEach(this.context.text, XREGEXP_ROLL_ALCHIMIE_MANIP, async (rollMatch, i) => await this._replaceOneAlchimie(rollMatch, i))
return this.context.text
}
async _replaceOneAlchimie(rollMatch, i) {
if (rollMatch.termes && rollMatch.manip) {
const manip = rollMatch.manip
await this._replaceManip(manip, rollMatch, i)
}
}
async _replaceManip(manip, rollMatch, i) {
const termes = rollMatch.termes
const carac = RdDCarac.caracDetails(RdDAlchimie.getCaracTache(manip))
const diff = RdDAlchimie.getDifficulte(termes)
const recette = (this.context.object instanceof Item && this.context.object.type == ITEM_TYPES.recettealchimique) ? this.context.object : undefined
const replacement = await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/apps/link-text-roll-alchimie.hbs`, {
manip,
termes,
recette,
carac,
diff
})
this.context.text = this.context.text.replace(rollMatch[0], replacement);
}
}
/**
* classe pour gérer les jets de caractéristique/compétence depuis
* les journaux/descriptions
*/
class TextRollCaracCompetence {
static async onRollText(event, actor) {
const caracCode = event.currentTarget.attributes['data-carac-code']?.value
if (caracCode) {
const competence = event.currentTarget.attributes['data-competence']?.value
const diff = event.currentTarget.attributes['data-diff']?.value
const actors = TextRollCaracCompetence.getSelectedActors(actor)
actors.forEach(async it => await TextRollCaracCompetence.doRoll(it, caracCode, competence, diff))
}
}
static async doRoll(actor, caracCode, competence, diff) {
caracCode = actor.mapCarac(caracCode)
if (competence) {
if (actor.type == ACTOR_TYPES.personnage) {
await actor.rollCaracCompetence(caracCode, competence, diff)
}
else {
await actor.doRollCaracCompetence(caracCode, competence, diff)
}
}
else {
await actor.rollCarac(caracCode, { diff })
}
}
static async onReplaceRoll(context) {
const handler = new TextRollCaracCompetence(context)
context.text = await handler.replaceRollCaracCompetence()
}
static getSelectedActors(actor) {
const selected = canvas.tokens.controlled.map(it => it.actor).filter(it => it)
if (selected.length > 0) {
return selected
}
actor = actor ?? RdDUtility.getSelectedActor()
if (actor) {
return [actor]
}
return []
}
constructor(context) {
this.context = context
}
async replaceRollCaracCompetence() {
await XRegExp.forEach(this.context.text, XREGEXP_ROLL_CARAC_COMP, async (rollMatch, i) => await this._replaceOne(rollMatch, i))
return this.context.text
}
async _replaceOne(rollMatch, i) {
const carac = RdDCarac.caracDetails(rollMatch.carac)
if (carac) {
const competence = rollMatch.competence ? RdDItemCompetence.findCompetence(this.context.competences, rollMatch.competence) : undefined
const replacement = await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/apps/link-text-roll-carac-competence.hbs`, {
carac: carac,
competence: competence?.name,
diff: rollMatch.diff
})
this.context.text = this.context.text.replace(rollMatch[0], replacement)
}
}
}
/**
* classe pour gérer les jets de dés (formules Foundry)
*/
class TextRollFoundry {
static async onReplaceRoll(context) {
const handler = new TextRollFoundry(context.text)
context.text = await handler.replaceRolls()
}
static async onRollText(event, actor) {
const rollFoundry = event.currentTarget.attributes['data-roll-foundry']?.value
if (rollFoundry) {
const roll = new Roll(rollFoundry)
await roll.evaluate()
await roll.toMessage()
}
}
constructor(text) {
this.text = text
}
async replaceRolls() {
await XRegExp.forEach(this.text, XREGEXP_ROLL_FORMULA, async (rollMatch, i) => await this._replaceOne(rollMatch, i))
return this.text
}
async _replaceOne(rollMatch, i) {
if (rollMatch.formula) {
const replacement = await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/apps/link-text-roll-foundry.hbs`, {
formula: rollMatch.formula,
})
this.text = this.text.replace(rollMatch[0], replacement)
}
}
}
export class RdDTextEditor {
static async enrichHTML(text, object) {
const competences = await SystemCompendiums.getCompetences(ACTOR_TYPES.personnage);
const context = { text, competences, object }
await TextRollAlchimie.onReplaceRoll(context)
await TextRollCaracCompetence.onReplaceRoll(context)
await TextRollFoundry.onReplaceRoll(context)
return await TextEditor.enrichHTML(context.text, {
relativeTo: object,
secrets: object?.isOwner,
async: true
})
}
static async rollText(event, actor) {
const rollMode = event.currentTarget.attributes['data-roll-mode']?.value;
switch (rollMode) {
case 'foundry':
return await TextRollFoundry.onRollText(event, actor)
case 'carac':
return await TextRollCaracCompetence.onRollText(event, actor)
case 'alchimie':
return await TextRollAlchimie.onRollText(event, actor)
}
}
}

View File

@ -2002,7 +2002,7 @@ XRegExp.exec = function (str, regex, pos, sticky) {
*/ */
XRegExp.forEach = function (str, regex, callback) { XRegExp.forEach = async function (str, regex, callback) {
var pos = 0; var pos = 0;
var i = -1; var i = -1;
var match; var match;
@ -2014,7 +2014,7 @@ XRegExp.forEach = function (str, regex, callback) {
// at least. Actually, because of the way `XRegExp.exec` caches globalized versions of // at least. Actually, because of the way `XRegExp.exec` caches globalized versions of
// regexes, mutating the regex will not have any effect on the iteration or matched strings, // regexes, mutating the regex will not have any effect on the iteration or matched strings,
// which is a nice side effect that brings extra safety. // which is a nice side effect that brings extra safety.
callback(match, ++i, str, regex); await callback(match, ++i, str, regex);
pos = match.index + (match[0].length || 1); pos = match.index + (match[0].length || 1);
} }
}; };

View File

@ -1,13 +1,13 @@
export const SYSTEM_RDD = 'foundryvtt-reve-de-dragon'; export const SYSTEM_RDD = 'foundryvtt-reve-de-dragon'
export const SYSTEM_SOCKET_ID = 'system.foundryvtt-reve-de-dragon'; export const SYSTEM_SOCKET_ID = 'system.foundryvtt-reve-de-dragon'
export const LOG_HEAD = 'RdD | '; export const LOG_HEAD = 'RdD | '
export const HIDE_DICE = 'hide'; export const HIDE_DICE = 'hide'
export const SHOW_DICE = 'show'; export const SHOW_DICE = 'show'
export const ENTITE_INCARNE = 'incarne'; export const ENTITE_INCARNE = 'incarne'
export const ENTITE_NONINCARNE = 'nonincarne'; export const ENTITE_NONINCARNE = 'nonincarne'
export const ENTITE_BLURETTE = 'blurette'; export const ENTITE_BLURETTE = 'blurette'
export const RDD_CONFIG = { export const RDD_CONFIG = {
niveauEthylisme : [ niveauEthylisme : [

View File

@ -1,6 +1,5 @@
import { RdDItemSort } from "./item-sort.js"; import { RdDItemSort } from "./item-sort.js";
import { RdDUtility } from "./rdd-utility.js"; import { RdDUtility } from "./rdd-utility.js";
import { RdDAlchimie } from "./rdd-alchimie.js";
import { RdDItemCompetence } from "./item-competence.js"; import { RdDItemCompetence } from "./item-competence.js";
import { RdDHerbes } from "./rdd-herbes.js"; import { RdDHerbes } from "./rdd-herbes.js";
import { RdDGemme } from "./rdd-gemme.js"; import { RdDGemme } from "./rdd-gemme.js";
@ -12,8 +11,9 @@ import { SystemCompendiums } from "./settings/system-compendiums.js";
import { Misc } from "./misc.js"; import { Misc } from "./misc.js";
import { RdDTimestamp } from "./time/rdd-timestamp.js"; import { RdDTimestamp } from "./time/rdd-timestamp.js";
import { RdDItemCompetenceCreature } from "./item-competencecreature.js"; import { RdDItemCompetenceCreature } from "./item-competencecreature.js";
import { ITEM_TYPES, RdDItem } from "./item.js"; import { ACTOR_TYPES, ITEM_TYPES, RdDItem } from "./item.js";
import { FLEUVE_COORD, TMRUtility } from "./tmr-utility.js"; import { FLEUVE_COORD, TMRUtility } from "./tmr-utility.js";
import { RdDTextEditor } from "./apps/rdd-text-roll.js";
/** /**
* Extend the basic ItemSheet for RdD specific items * Extend the basic ItemSheet for RdD specific items
@ -97,11 +97,11 @@ export class RdDItemSheet extends ItemSheet {
name: this.item.name, name: this.item.name,
system: this.item.system, system: this.item.system,
actorId: this.actor?.id, actorId: this.actor?.id,
description: await TextEditor.enrichHTML(this.item.system.description, { async: true }), description: await RdDTextEditor.enrichHTML(this.item.system.description, this.item),
descriptionmj: await TextEditor.enrichHTML(this.item.system.descriptionmj, { async: true }), descriptionmj: await RdDTextEditor.enrichHTML(this.item.system.descriptionmj, this.item),
isComestible: this.item.getUtilisationCuisine(), isComestible: this.item.getUtilisationCuisine(),
options: RdDSheetUtility.mergeDocumentRights(this.options, this.item, this.isEditable), options: RdDSheetUtility.mergeDocumentRights(this.options, this.item, this.isEditable),
competences: await SystemCompendiums.getCompetences('personnage'), competences: await SystemCompendiums.getCompetences(ACTOR_TYPES.personnage),
categories: RdDItem.getCategories(this.item.type), categories: RdDItem.getCategories(this.item.type),
} }
@ -120,18 +120,17 @@ export class RdDItemSheet extends ItemSheet {
formData.competences = formData.competences.filter(it => it.isCompetenceArme()) formData.competences = formData.competences.filter(it => it.isCompetenceArme())
} }
if (this.item.type == ITEM_TYPES.recettecuisine) { if (this.item.type == ITEM_TYPES.recettecuisine) {
formData.ingredients = await TextEditor.enrichHTML(this.object.system.ingredients, { async: true }) formData.ingredients = await RdDTextEditor.enrichHTML(this.item.system.ingredients, this.item)
} }
if (this.item.type == ITEM_TYPES.extraitpoetique) { if (this.item.type == ITEM_TYPES.extraitpoetique) {
formData.extrait = await TextEditor.enrichHTML(this.object.system.extrait, { async: true }) formData.extrait = await RdDTextEditor.enrichHTML(this.item.system.extrait, this.item)
formData.texte = await TextEditor.enrichHTML(this.object.system.texte, { async: true }) formData.texte = await RdDTextEditor.enrichHTML(this.item.system.texte, this.item)
} }
if (this.item.type == ITEM_TYPES.recettealchimique) { if (this.item.type == ITEM_TYPES.recettealchimique) {
RdDAlchimie.processManipulation(this.item, this.actor?.id); formData.manipulation = await RdDTextEditor.enrichHTML(this.item.system.manipulation, this.item)
formData.manipulation_update = await TextEditor.enrichHTML(this.object.system.manipulation_update, { async: true }) formData.utilisation = await RdDTextEditor.enrichHTML(this.item.system.utilisation, this.item)
formData.utilisation = await TextEditor.enrichHTML(this.object.system.utilisation, { async: true }) formData.enchantement = await RdDTextEditor.enrichHTML(this.item.system.enchantement, this.item)
formData.enchantement = await TextEditor.enrichHTML(this.object.system.enchantement, { async: true }) formData.sureffet = await RdDTextEditor.enrichHTML(this.item.system.sureffet, this.item)
formData.sureffet = await TextEditor.enrichHTML(this.object.system.sureffet, { async: true })
} }
if (this.item.type == ITEM_TYPES.gemme) { if (this.item.type == ITEM_TYPES.gemme) {
formData.gemmeTypeList = RdDGemme.getGemmeTypeOptionList(); formData.gemmeTypeList = RdDGemme.getGemmeTypeOptionList();
@ -207,17 +206,7 @@ export class RdDItemSheet extends ItemSheet {
this.html.find('.creer-potion-base').click((event) => this._getEventActor(event).actionHerbe(this.item)); this.html.find('.creer-potion-base').click((event) => this._getEventActor(event).actionHerbe(this.item));
this.html.find('input[name="system.cacher_points_de_tache"]').change(async event => await this.item.update({ 'system.cacher_points_de_tache': event.currentTarget.checked })); this.html.find('input[name="system.cacher_points_de_tache"]').change(async event => await this.item.update({ 'system.cacher_points_de_tache': event.currentTarget.checked }));
this.html.find('.alchimie-tache a').click((event) => { this.html.find('.roll-text').click(async event => await RdDTextEditor.rollText(event, this.actor))
let actor = this._getEventActor(event);
if (actor) {
let recetteId = event.currentTarget.attributes['data-recette-id'].value;
let tacheName = event.currentTarget.attributes['data-alchimie-tache'].value;
let tacheData = event.currentTarget.attributes['data-alchimie-data'].value;
actor.effectuerTacheAlchimie(recetteId, tacheName, tacheData);
} else {
ui.notifications.info("Impossible trouver un acteur pour réaliser cette tache Alchimique.");
}
});
if (this.actor) { if (this.actor) {
this.html.find('.item-split').click(async event => RdDSheetUtility.splitItem(RdDSheetUtility.getItem(event, this.actor), this.actor, this.getActionRenderItem())); this.html.find('.item-split').click(async event => RdDSheetUtility.splitItem(RdDSheetUtility.getItem(event, this.actor), this.actor, this.getActionRenderItem()));
@ -272,7 +261,7 @@ export class RdDItemSheet extends ItemSheet {
} }
} }
async supprimerBonusCase(deleteCoord){ async supprimerBonusCase(deleteCoord) {
if (this.item.type == ITEM_TYPES.sort) { if (this.item.type == ITEM_TYPES.sort) {
const oldList = RdDItemSort.getBonusCaseList(this.item) const oldList = RdDItemSort.getBonusCaseList(this.item)
const newList = oldList.filter(it => it.case != deleteCoord); const newList = oldList.filter(it => it.case != deleteCoord);

View File

@ -1,6 +1,6 @@
import { ITEM_TYPES, RdDItem } from "../item.js"; import { ITEM_TYPES, RdDItem } from "../item.js";
import { Misc } from "../misc.js"; import { Misc } from "../misc.js";
import { LIST_CARAC, RdDCarac } from "../rdd-carac.js"; import { LIST_CARAC_PERSONNAGE, RdDCarac } from "../rdd-carac.js";
export class RdDItemRace extends RdDItem { export class RdDItemRace extends RdDItem {
@ -12,7 +12,7 @@ export class RdDItemRace extends RdDItem {
static checkRacialMax(actor, code, value) { static checkRacialMax(actor, code, value) {
const race = RdDItemRace.getRace(actor) const race = RdDItemRace.getRace(actor)
if (code == LIST_CARAC.force.code) { if (code == LIST_CARAC_PERSONNAGE.force.code) {
if (!race.isForceValid(actor, value)) { if (!race.isForceValid(actor, value)) {
ui.notifications.warn(race.system.carac.force.limitmessage) ui.notifications.warn(race.system.carac.force.limitmessage)
return false return false
@ -55,7 +55,7 @@ export class RdDItemRace extends RdDItem {
if (value == undefined) { if (value == undefined) {
value = path ? foundry.utils.getProperty(actor, path) : 0 value = path ? foundry.utils.getProperty(actor, path) : 0
} }
if (code == LIST_CARAC.force.code) { if (code == LIST_CARAC_PERSONNAGE.force.code) {
return value >= this.getForceMax(actor) return value >= this.getForceMax(actor)
} }
const max = foundry.utils.getProperty(this, path) ?? -1 const max = foundry.utils.getProperty(this, path) ?? -1

View File

@ -0,0 +1,28 @@
import { RdDTextEditor } from "../apps/rdd-text-roll.js";
import { SYSTEM_RDD } from "../constants.js";
import { Misc } from "../misc.js";
export class RdDJournalSheet extends JournalTextPageSheet {
static register() {
DocumentSheetConfig.unregisterSheet(JournalEntryPage, "core", JournalTextPageSheet)
DocumentSheetConfig.registerSheet(JournalEntryPage,
SYSTEM_RDD,
RdDJournalSheet, {
types: ["text"],
makeDefault: true,
});
}
async getData(options) {
const journalData = await super.getData(options);
journalData.editor.content = await RdDTextEditor.enrichHTML(journalData.document.text.content, this.object)
return journalData
}
activateListeners(html) {
super.activateListeners(html);
html.find('.roll-text').click(async event => await RdDTextEditor.rollText(event, this.actor))
}
}

View File

@ -1,48 +1,8 @@
/* -------------------------------------------- */
import { Misc } from "./misc.js"; import { Misc } from "./misc.js";
const matchOperations = new RegExp(/@(\w*){([\w\-]+)}/ig);
const matchOperationTerms = new RegExp(/@(\w*){([\w\-]+)}/i);
/* -------------------------------------------- */
export class RdDAlchimie { export class RdDAlchimie {
static getDifficulte(termes) {
/* -------------------------------------------- */ let elements = termes.split('-');
static processManipulation(recette, actorId = undefined) {
let manip = recette.system.manipulation;
let matchArray = manip.match(matchOperations);
if (matchArray) {
for (let matchStr of matchArray) {
let result = matchStr.match(matchOperationTerms);
if (result[1] && result[2]) {
let commande = Misc.upperFirst(result[1]);
let replacement = this[`_alchimie${commande}`](recette, result[2], actorId);
manip = manip.replace(result[0], replacement);
}
}
}
recette.system.manipulation_update = manip;
}
/* -------------------------------------------- */
static _alchimieCouleur(recette, couleurs, actorId) {
return RdDAlchimie._alchimieLink(recette, couleurs, actorId, 'couleur', 'Température');
}
/* -------------------------------------------- */
static _alchimieConsistance(recette, consistances, actorId) {
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>`;
}
/* -------------------------------------------- */
static getDifficulte(aspects) {
let elements = aspects.split('-');
let composantes = elements.length; let composantes = elements.length;
let distincts = Object.keys(Misc.classifyFirst(elements, it => it)).length; let distincts = Object.keys(Misc.classifyFirst(elements, it => it)).length;
if (distincts == 1) { if (distincts == 1) {
@ -58,5 +18,4 @@ export class RdDAlchimie {
} }
return 'intellect'; return 'intellect';
} }
} }

View File

@ -37,7 +37,7 @@ const TABLE_CARACTERISTIQUES_DERIVEES = {
32: { xp: 180, niveau: 11, poids: "1501-2000", poidsMin: 1501, poidsMax: 2000, plusdom: +11, sconst: 10, sust: 17 } 32: { xp: 180, niveau: 11, poids: "1501-2000", poidsMin: 1501, poidsMax: 2000, plusdom: +11, sconst: 10, sust: 17 }
}; };
export const LIST_CARAC = { export const LIST_CARAC_PERSONNAGE = {
'taille': { code: 'taille', label: 'Taille', isCarac: true, path: 'system.carac.taille.value' }, 'taille': { code: 'taille', label: 'Taille', isCarac: true, path: 'system.carac.taille.value' },
'apparence': { code: 'apparence', label: 'Apparence', isCarac: true, path: 'system.carac.apparence.value' }, 'apparence': { code: 'apparence', label: 'Apparence', isCarac: true, path: 'system.carac.apparence.value' },
'constitution': { code: 'constitution', label: 'Constitution', isCarac: true, path: 'system.carac.constitution.value' }, 'constitution': { code: 'constitution', label: 'Constitution', isCarac: true, path: 'system.carac.constitution.value' },
@ -56,18 +56,43 @@ export const LIST_CARAC = {
'beaute': { code: 'beaute', label: 'Beauté', isCarac: false, path: 'system.background.beaute.value' } 'beaute': { code: 'beaute', label: 'Beauté', isCarac: false, path: 'system.background.beaute.value' }
} }
export const LIST_CARAC_AUTRES = {
'perception': { code: 'perception', label: 'Perception', path: 'system.carac.perception.value' },
}
const LIST_CARAC_DERIVEE = {
'melee': { code: "melee", label: 'Mêlée', path: 'system.carac.melee.value' },
'tir': { code: "tir", label: 'Tir', path: 'system.carac.tir.value' },
'lancer': { code: "lancer", label: 'Lancer', path: 'system.carac.lancer.value' },
'derobee': { code: "derobee", label: 'Dérobée', path: 'system.carac.derobee.value' },
'chance-actuelle': { code: "chance-actuelle", label: 'Chance actuelle', path: 'system.carac.lancer.value' },
'reve-actuel': { code: "reve-actuel", label: 'Rêve actuel', path: 'system.reve.reve.value' },
}
const LIST_CARAC_ROLL = Object.values(LIST_CARAC_PERSONNAGE).filter(it => it.isCarac && it.code != 'taille')
.concat(Object.values(LIST_CARAC_AUTRES))
.concat(Object.values(LIST_CARAC_DERIVEE))
export class RdDCarac { export class RdDCarac {
static caracDetails(name) {
let entry = Misc.findFirstLike(name, LIST_CARAC_ROLL, { mapper: it => it.code, description: 'caractéristique', onMessage: m => { } })
if (entry) {
return entry
}
return Misc.findFirstLike(name, LIST_CARAC_ROLL, { mapper: it => it.label, description: 'caractéristique' })
}
static carac(code) { static carac(code) {
return LIST_CARAC[code] return LIST_CARAC_PERSONNAGE[code]
} }
static label(code) { static label(code) {
return RdDCarac.carac(code)?.label ?? '---' return RdDCarac.carac(code)?.label ?? '---'
} }
static caracs(filter = it => it.isCarac) { static caracs(filter = it => it.isCarac) {
return Object.values(LIST_CARAC).filter(filter) return Object.values(LIST_CARAC_PERSONNAGE).filter(filter)
} }
static isAgiliteOuDerobee(selectedCarac) { static isAgiliteOuDerobee(selectedCarac) {

View File

@ -75,6 +75,8 @@ import { ExportScriptarium } from "./actor/export-scriptarium/export-scriptarium
import { AppPersonnageAleatoire } from "./actor/random/app-personnage-aleatoire.js" import { AppPersonnageAleatoire } from "./actor/random/app-personnage-aleatoire.js"
import { RdDActorExportSheet } from "./actor/export-scriptarium/actor-encart-sheet.js" import { RdDActorExportSheet } from "./actor/export-scriptarium/actor-encart-sheet.js"
import { RdDStatBlockParser } from "./apps/rdd-import-stats.js" import { RdDStatBlockParser } from "./apps/rdd-import-stats.js"
import { RdDJournalSheet } from "./journal/journal-sheet.js"
import { RdDTextEditor } from "./apps/rdd-text-roll.js"
/** /**
* RdD system * RdD system
@ -128,7 +130,7 @@ export class SystemReveDeDragon {
console.log(`Initializing Reve de Dragon System Settings`) console.log(`Initializing Reve de Dragon System Settings`)
// preload handlebars templates // preload handlebars templates
RdDUtility.preloadHandlebarsTemplates() await RdDUtility.preloadHandlebarsTemplates()
AppPersonnageAleatoire.preloadHandlebars() AppPersonnageAleatoire.preloadHandlebars()
RdDItemSort.preloadHandlebars() RdDItemSort.preloadHandlebars()
@ -196,6 +198,7 @@ export class SystemReveDeDragon {
RdDItemSheet.register(RdDIngredientItemSheet) RdDItemSheet.register(RdDIngredientItemSheet)
RdDItemSheet.register(RdDServiceItemSheet) RdDItemSheet.register(RdDServiceItemSheet)
RdDItemSheet.register(RdDBlessureItemSheet) RdDItemSheet.register(RdDBlessureItemSheet)
RdDJournalSheet.register()
Items.registerSheet(SYSTEM_RDD, RdDItemInventaireSheet, { Items.registerSheet(SYSTEM_RDD, RdDItemInventaireSheet, {
types: [ types: [

View File

@ -173,7 +173,7 @@ export class RdDRoll extends Dialog {
this.updateRollResult(html); this.updateRollResult(html);
this.html.find("[name='diffLibre']").val(this.rollData.diffLibre); this.html.find("[name='diffLibre']").val(this.rollData.diffLibre);
}); });
this.html.find('.roll-carac-competence').change((event) => { this.html.find('.roll-text').change((event) => {
const competence = event.currentTarget.value const competence = event.currentTarget.value
this.rollData.competence = this.rollData.competences.find(it => Grammar.equalsInsensitive(it.name, competence)) this.rollData.competence = this.rollData.competences.find(it => Grammar.equalsInsensitive(it.name, competence))
this.updateRollResult(html); this.updateRollResult(html);

View File

@ -339,7 +339,7 @@ export class RdDUtility {
Handlebars.registerHelper('typeTmr-name', type => TMRUtility.typeTmrName(type)); Handlebars.registerHelper('typeTmr-name', type => TMRUtility.typeTmrName(type));
Handlebars.registerHelper('effetRencontre-name', coord => TMRUtility.typeTmrName(coord)); Handlebars.registerHelper('effetRencontre-name', coord => TMRUtility.typeTmrName(coord));
return loadTemplates(templatePaths); await loadTemplates(templatePaths);
} }
static getItem(itemId, actorId = undefined) { static getItem(itemId, actorId = undefined) {

View File

@ -184,16 +184,16 @@ system:
value: '+0' value: '+0'
label: +dom label: +dom
derivee: true derivee: true
vitesse:
type: string
value: 12/28
label: Vitesse
derivee: true
encombrement: encombrement:
type: number type: number
value: 0 value: 0
label: Encombrement label: Encombrement
derivee: false derivee: false
vitesse:
type: string
value: 12/28
label: Vitesse
derivee: true
protection: protection:
type: number type: number
value: 4 value: 4
@ -207,28 +207,19 @@ system:
value: 0 value: 0
label: Sur-encombrement label: Sur-encombrement
description: >- description: >-
<h1>Description</h1> <h1>Description</h1><p>Description Le chrasme (prononcer krasme) est une
sorte de cafard géant à carapace de crabe aux jointures poilues. Il mesure
<p>Description Le chrasme (prononcer krasme) est une sorte de cafard en moyenne 1 m de haut sur 1m50 de long, et peut peser jusquà 50 kg. Doté
g&eacute;ant &agrave; carapace de crabe aux jointures poilues. Il mesure en de mandibules acérées et puissantes, il est redouté pour son venin
moyenne 1 m de haut sur 1m50 de long, et peut peser jusqu&rsquo;&agrave; 50 mortel.</p><h1>Mœurs</h1><p>Le chrasme vit dans les lieux sombres, cavernes
kg. Dot&eacute; de mandibules ac&eacute;r&eacute;es et puissantes, il est et souterrains, où il se nourrit de tout. Paranos le Moindre affirme quà
redout&eacute; pour son venin mortel.</p> défaut dune meilleure chère, il peut même se sustenter de cailloux. Il
déteste la lumière comme son cousin de petite taille, mais a toutefois un
<h1>M&oelig;urs</h1> comportement différent: au lieu de fuir, il entre dans une rage féroce et se
rue sur le porteur de lumière pour le réduire en charpie. Savez-vous, cher
<p>Le chrasme vit dans les lieux sombres, cavernes et souterrains, o&ugrave; Paranos, que vous nous faites un peu peur
il se nourrit de tout. Paranos le Moindre affirme qu&rsquo;&agrave; ?</p><h1>Venin</h1><p>@UUID[Compendium.foundryvtt-reve-de-dragon.maladies-et-poisons.Item.cFMUtU6LZG0mKeDl]{Venin
d&eacute;faut d&rsquo;une meilleure ch&egrave;re, il peut m&ecirc;me se de chrasme}</p><p></p>
sustenter de cailloux. Il d&eacute;teste la lumi&egrave;re comme son cousin
de petite taille, mais a toutefois un comportement diff&eacute;rent: au lieu
de fuir, il entre dans une rage f&eacute;roce et se rue sur le porteur de
lumi&egrave;re pour le r&eacute;duire en charpie. Savez-vous, cher Paranos,
que vous nous faites un peu peur ?</p>
<h1>Venin</h1>
<p>@UUID[Compendium.foundryvtt-reve-de-dragon.maladies-et-poisons.Item.cFMUtU6LZG0mKeDl]{Venin
de chrasme}</p> <p></p>
race: '' race: ''
notesmj: '' notesmj: ''
ownership: ownership:
@ -311,7 +302,13 @@ prototypeToken:
texture: null texture: null
_stats: _stats:
systemId: foundryvtt-reve-de-dragon systemId: foundryvtt-reve-de-dragon
systemVersion: 12.0.22 systemVersion: 12.0.32
coreVersion: '12.331' coreVersion: '12.331'
createdTime: null
modifiedTime: 1736537299708
lastModifiedBy: Hp9ImM4o9YRTSdfu
compendiumSource: null
duplicateSource: null
flags: {}
_key: '!actors!yL1XStIKWxGnhKvR' _key: '!actors!yL1XStIKWxGnhKvR'

View File

@ -203,10 +203,10 @@ system:
<p>En combat, quand un drakkule r&eacute;ussit une particuli&egrave;re et <p>En combat, quand un drakkule r&eacute;ussit une particuli&egrave;re et
cause au moins une blessure l&eacute;g&egrave;re, il reste accroch&eacute; cause au moins une blessure l&eacute;g&egrave;re, il reste accroch&eacute;
&agrave; sa victime qui perd alors automatiquement 1d6 points &agrave; sa victime qui perd alors automatiquement @roll[1d6] points
d&rsquo;endurance par round sous l&rsquo;effet de la saign&eacute;e. Quand d&rsquo;endurance par round sous l&rsquo;effet de la saign&eacute;e. Quand
l&rsquo;endurance tombe &agrave; z&eacute;ro, le drakkule continue &agrave; l&rsquo;endurance tombe &agrave; z&eacute;ro, le drakkule continue &agrave;
la vider de son sang &agrave; raison de 1d6 points de vie par round. Le la vider de son sang &agrave; raison de @roll[1d6] points de vie par round. Le
drakkule ne se d&eacute;tache que <em>bless&eacute; gravement </em>ou drakkule ne se d&eacute;tache que <em>bless&eacute; gravement </em>ou
<em>sonn&eacute;</em>. Pour se d&eacute;gager, la victime ne peut utiliser <em>sonn&eacute;</em>. Pour se d&eacute;gager, la victime ne peut utiliser
que Corps &agrave; corps (totaliser 2 points d&rsquo;empoignade) ou une que Corps &agrave; corps (totaliser 2 points d&rsquo;empoignade) ou une

View File

@ -137,7 +137,7 @@ system:
elles-m&ecirc;mes, leur grincement involontaire est une torture. Toute elles-m&ecirc;mes, leur grincement involontaire est une torture. Toute
personne se trouvant dans un rayon de 10m doit manquer un jet personne se trouvant dans un rayon de 10m doit manquer un jet
d&rsquo;OU&Iuml;E &agrave; +5. Si le jet r&eacute;ussit, perte de 1 point d&rsquo;OU&Iuml;E &agrave; +5. Si le jet r&eacute;ussit, perte de 1 point
d&rsquo;endurance, puis jet de VOLONT&Eacute; &agrave; -5. Si le jet de d&rsquo;endurance, puis jet de @roll[volonté/-5]. Si le jet de
VOLONT&Eacute; &eacute;choue, le personnage est sonn&eacute; VOLONT&Eacute; &eacute;choue, le personnage est sonn&eacute;
jusqu&rsquo;&agrave; la fin du round suivant.</p> jusqu&rsquo;&agrave; la fin du round suivant.</p>

View File

@ -174,8 +174,8 @@ system:
agressivit&eacute; s&rsquo;appliquant aux humano&iuml;des. S&rsquo;agissant agressivit&eacute; s&rsquo;appliquant aux humano&iuml;des. S&rsquo;agissant
d&rsquo;un pouvoir inn&eacute;, elles n&rsquo;ont ni &agrave; monter dans d&rsquo;un pouvoir inn&eacute;, elles n&rsquo;ont ni &agrave; monter dans
les TMR, ni &agrave; d&eacute;penser de points de r&ecirc;ve. La victime les TMR, ni &agrave; d&eacute;penser de points de r&ecirc;ve. La victime
doit jouer un jet de r&eacute;sistance standard, r-8, et en cas doit jouer un jet de r&eacute;sistance standard, @roll[reve-actuel/-8], et en cas
d&rsquo;&eacute;chec, r&eacute;ussir un jet de VOLONT&Eacute; &agrave; -3 d&rsquo;&eacute;chec, r&eacute;ussir un jet de @roll[Volonté/-3]
pour pouvoir attaquer la harpie. Le JR n&rsquo;est &agrave; jouer pour pouvoir attaquer la harpie. Le JR n&rsquo;est &agrave; jouer
qu&rsquo;une seule fois, tandis qu&rsquo;en cas d&rsquo;&eacute;chec, le jet qu&rsquo;une seule fois, tandis qu&rsquo;en cas d&rsquo;&eacute;chec, le jet
de VOLONT&Eacute; est &agrave; jouer tous les rounds. La non de VOLONT&Eacute; est &agrave; jouer tous les rounds. La non

View File

@ -201,7 +201,7 @@ system:
<p>La sir&egrave;ne a un chant attractif pouvant porter jusqu&rsquo;&agrave; <p>La sir&egrave;ne a un chant attractif pouvant porter jusqu&rsquo;&agrave;
50 m. Toute personne, homme ou femme, percevant ce chant, m&ecirc;me faible 50 m. Toute personne, homme ou femme, percevant ce chant, m&ecirc;me faible
et lointain, doit tenter un jet de VOLONT&Eacute; &agrave; -3. Sur toute et lointain, doit tenter un jet de @roll[Volonté/-3]. Sur toute
r&eacute;ussite, le personnage est libre de sa d&eacute;cision"; sur tout r&eacute;ussite, le personnage est libre de sa d&eacute;cision"; sur tout
&eacute;chec, il est irr&eacute;sistiblement attir&eacute; vers la source du &eacute;chec, il est irr&eacute;sistiblement attir&eacute; vers la source du
chant. Quand plusieurs sir&egrave;nes chantent simultan&eacute;ment, le jet chant. Quand plusieurs sir&egrave;nes chantent simultan&eacute;ment, le jet
@ -220,7 +220,7 @@ system:
corps, m&ecirc;me visage. Certaines sir&egrave;nes, plus rarement, donnent corps, m&ecirc;me visage. Certaines sir&egrave;nes, plus rarement, donnent
des illusions d&rsquo;hommes. Contrairement aux illusions des Yeux des illusions d&rsquo;hommes. Contrairement aux illusions des Yeux
d&rsquo;Hypnos, l&rsquo;illusion des sir&egrave;nes donne lieu &agrave; un d&rsquo;Hypnos, l&rsquo;illusion des sir&egrave;nes donne lieu &agrave; un
jet de r&eacute;sistance (standard, r-8). Comme pour les chants, ce JR est jet de r&eacute;sistance (standard, @roll[reve-actuel/-8]). Comme pour les chants, ce JR est
global : s&rsquo;il r&eacute;ussit, toutes les sir&egrave;nes apparaissent global : s&rsquo;il r&eacute;ussit, toutes les sir&egrave;nes apparaissent
sous leur v&eacute;ritable apparence; s&rsquo;il &eacute;choue, toutes sont sous leur v&eacute;ritable apparence; s&rsquo;il &eacute;choue, toutes sont
per&ccedil;ues sous leur apparence illusoire.</p> per&ccedil;ues sous leur apparence illusoire.</p>

View File

@ -228,8 +228,8 @@ system:
d&eacute;solations et autres lieux o&ugrave; Thanatos a laiss&eacute; son d&eacute;solations et autres lieux o&ugrave; Thanatos a laiss&eacute; son
empreinte. Ils poss&egrave;dent le m&ecirc;me pouvoir de non empreinte. Ils poss&egrave;dent le m&ecirc;me pouvoir de non
agressivit&eacute; s&rsquo;appliquant aux humano&iuml;des que la harpie. La agressivit&eacute; s&rsquo;appliquant aux humano&iuml;des que la harpie. La
victime doit jouer un jet de r&eacute;sistance standard, r-8, et en cas victime doit jouer un jet de r&eacute;sistance standard, @roll[reve-actuel/-8], et en cas
d&rsquo;&eacute;chec, r&eacute;ussir un jet de VOLONT&Eacute; &agrave; -3 d&rsquo;&eacute;chec, r&eacute;ussir un jet de @roll[Volonté/-3]
pour pouvoir attaquer le tournedent. Le JR n&rsquo;est &agrave; jouer pour pouvoir attaquer le tournedent. Le JR n&rsquo;est &agrave; jouer
qu&rsquo;une seule fois, et en cas d&rsquo;&eacute;chec, le jet de qu&rsquo;une seule fois, et en cas d&rsquo;&eacute;chec, le jet de
VOLONT&Eacute; est &agrave; jouer tous les rounds. La non agressivit&eacute; VOLONT&Eacute; est &agrave; jouer tous les rounds. La non agressivit&eacute;

View File

@ -17,9 +17,8 @@ system:
&agrave; long terme, mais tout autant de l&rsquo;empathie pour bluffer lors &agrave; long terme, mais tout autant de l&rsquo;empathie pour bluffer lors
des surench&egrave;res.</p> des surench&egrave;res.</p>
<p>Pour simuler une partie, jouer un jet de CHANCE &agrave; z&eacute;ro <p>Pour simuler une partie, jouer un jet de @roll[chance/0]
(ajust&eacute; astrologiquement), suivi d&rsquo;un jet d&rsquo;EMPATHIE/Jeu (ajust&eacute; astrologiquement), suivi d&rsquo;un jet d&rsquo;@roll[EMPATHIE/Jeu/0], et additionner les points de t&acirc;che obtenus par
&agrave; z&eacute;ro, et additionner les points de t&acirc;che obtenus par
les deux jets. Le vainqueur est celui qui en totalise le plus.</p> les deux jets. Le vainqueur est celui qui en totalise le plus.</p>
descriptionmj: '' descriptionmj: ''
type: carte type: carte

View File

@ -104,7 +104,7 @@ system:
D&egrave;s qu&rsquo;il se sent l&eacute;s&eacute;, offens&eacute;, victime D&egrave;s qu&rsquo;il se sent l&eacute;s&eacute;, offens&eacute;, victime
d&rsquo;un tort m&ecirc;me insignifiant, il&nbsp;faut qu&rsquo;il se venge d&rsquo;un tort m&ecirc;me insignifiant, il&nbsp;faut qu&rsquo;il se venge
et que sa vengeance soit&nbsp;mortelle. Il peut jouer un jet de et que sa vengeance soit&nbsp;mortelle. Il peut jouer un jet de
VOLONT&Eacute;/ moral &agrave; z&eacute;ro. Si le jet r&eacute;ussit, il @roll[Volonté/0] (avec moral). Si le jet r&eacute;ussit, il
peut encore laisser couver sa haine ; s&rsquo;il &eacute;choue, il doit agir peut encore laisser couver sa haine ; s&rsquo;il &eacute;choue, il doit agir
imm&eacute;diatement. Il est conseill&eacute; que le gardien des r&ecirc;ves imm&eacute;diatement. Il est conseill&eacute; que le gardien des r&ecirc;ves
prenne alors le contr&ocirc;le du personnage s&rsquo;il s&rsquo;agit prenne alors le contr&ocirc;le du personnage s&rsquo;il s&rsquo;agit

View File

@ -104,7 +104,7 @@ system:
pareille. Son moral tombe directement &agrave; -3 et ne pourra pas remonter pareille. Son moral tombe directement &agrave; -3 et ne pourra pas remonter
tant que durera la possession. Chaque fois qu&rsquo;une action dangereuse se tant que durera la possession. Chaque fois qu&rsquo;une action dangereuse se
pr&eacute;sente, incluant toute action de combat y compris l&rsquo;esquive, pr&eacute;sente, incluant toute action de combat y compris l&rsquo;esquive,
la victime doit jouer un jet de VOLONT&Eacute;/moral &agrave; z&eacute;ro. la victime doit jouer un jet de @roll[Volonté/0] avec moral.
Si ce jet &eacute;choue, la victime ne fait rien que trembler et claquer des Si ce jet &eacute;choue, la victime ne fait rien que trembler et claquer des
dents.</p> dents.</p>
race: '' race: ''

View File

@ -132,8 +132,8 @@ system:
les d&eacute;solations et les ruines. Il combat avec son bec les d&eacute;solations et les ruines. Il combat avec son bec
ac&eacute;r&eacute;. Outre les dommages qu&rsquo;il cause (+dom +1), chaque ac&eacute;r&eacute;. Outre les dommages qu&rsquo;il cause (+dom +1), chaque
fois qu&rsquo;il porte un coup, m&ecirc;me une simple fois qu&rsquo;il porte un coup, m&ecirc;me une simple
contusion-&eacute;raflure, sa victime doit r&eacute;ussir un jet de points contusion-&eacute;raflure, sa victime doit r&eacute;ussir un jet de @roll[reve-actuel]
de r&ecirc;ve actuels ajust&eacute; n&eacute;gativement au niveau de ajust&eacute; n&eacute;gativement au niveau de
l&rsquo;entit&eacute;, ou perdre 1 point de chance. Les points de chance l&rsquo;entit&eacute;, ou perdre 1 point de chance. Les points de chance
ainsi perdus peuvent &ecirc;tre regagn&eacute;s selon la r&egrave;gle ainsi perdus peuvent &ecirc;tre regagn&eacute;s selon la r&egrave;gle
normale. D&eacute;truite, l&rsquo;entit&eacute; ne laisse pour tout vestige normale. D&eacute;truite, l&rsquo;entit&eacute; ne laisse pour tout vestige

View File

@ -158,8 +158,8 @@ system:
<p>Les quauquemaires hantent les endroits lugubres et d&eacute;sol&eacute;s, <p>Les quauquemaires hantent les endroits lugubres et d&eacute;sol&eacute;s,
les ruines principalement. Ils chantent au coucher du soleil, et leur chant les ruines principalement. Ils chantent au coucher du soleil, et leur chant
est si lugubre, prometteur d&rsquo;angoisse et de cauchemar, que quiconque est si lugubre, prometteur d&rsquo;angoisse et de cauchemar, que quiconque
l&rsquo;entend et manque un jet de points de r&ecirc;ve actuels l&rsquo;entend et manque un jet de points de @roll[reve-actuel] ajust&eacute;
ajust&eacute; n&eacute;gativement au niveau de l&rsquo;entit&eacute;, ne n&eacute;gativement au niveau de l&rsquo;entit&eacute;, ne
fait que des cauchemars hideux au cours de sa prochaine nuit de sommeil. En fait que des cauchemars hideux au cours de sa prochaine nuit de sommeil. En
termes de r&egrave;gles, cela signifie : pas de souvenir de termes de r&egrave;gles, cela signifie : pas de souvenir de
l&rsquo;arch&eacute;type et donc pas de jet de stress au matin ; pas de l&rsquo;arch&eacute;type et donc pas de jet de stress au matin ; pas de

View File

@ -134,8 +134,8 @@ system:
n&eacute;cropoles, catacombes et autres lieux de s&eacute;pulture. Comme les n&eacute;cropoles, catacombes et autres lieux de s&eacute;pulture. Comme les
autres entit&eacute;s, leur raison d&rsquo;&ecirc;tre est de autres entit&eacute;s, leur raison d&rsquo;&ecirc;tre est de
d&eacute;truire. Le spectacle d&rsquo;un squelette est d&rsquo;une horreur d&eacute;truire. Le spectacle d&rsquo;un squelette est d&rsquo;une horreur
tellement contre nature qu&rsquo;il demande un jet de VOLONT&Eacute; tellement contre nature qu&rsquo;il demande un jet de @roll[Volonté/-3].
&agrave; -3. En cas d&rsquo;&eacute;chec, le personnage est frapp&eacute; En cas d&rsquo;&eacute;chec, le personnage est frapp&eacute;
d&rsquo;effroi. En termes de r&egrave;gles, il est en demi- surprise d&rsquo;effroi. En termes de r&egrave;gles, il est en demi- surprise
jusqu&rsquo;&agrave; la fin du round suivant. Une fois d&eacute;truit, les jusqu&rsquo;&agrave; la fin du round suivant. Une fois d&eacute;truit, les
ossements constitutifs du squelette s&rsquo;&eacute;parpillent sur le sol, ossements constitutifs du squelette s&rsquo;&eacute;parpillent sur le sol,

View File

@ -19,8 +19,8 @@ system:
dans une pipe ou pr&eacute;par&eacute;e en d&eacute;coction. Dans les deux dans une pipe ou pr&eacute;par&eacute;e en d&eacute;coction. Dans les deux
cas, une dose doit &ecirc;tre compos&eacute;e de 7 brins. D&egrave;s la dose cas, une dose doit &ecirc;tre compos&eacute;e de 7 brins. D&egrave;s la dose
absorb&eacute;e (bue ou fum&eacute;e), le consommateur doit jouer un JR absorb&eacute;e (bue ou fum&eacute;e), le consommateur doit jouer un JR
r-force, c&rsquo;est-&agrave;-dire un jet de points de r&ecirc;ve r-force, c&rsquo;est-&agrave;-dire un jet de @roll[reve-actuel] ajust&eacute;
ajust&eacute; n&eacute;gativement &agrave; la force de l&rsquo;herbe. Si le n&eacute;gativement &agrave; la force de l&rsquo;herbe. Si le
JR r&eacute;ussit, aucun effet ne se produit"; s&rsquo;il &eacute;choue, le JR r&eacute;ussit, aucun effet ne se produit"; s&rsquo;il &eacute;choue, le
consommateur gagne imm&eacute;diatement un nombre de points de r&ecirc;ve consommateur gagne imm&eacute;diatement un nombre de points de r&ecirc;ve
&eacute;gal &agrave; la force de l&rsquo;herbe, puis en &eacute;change, &eacute;gal &agrave; la force de l&rsquo;herbe, puis en &eacute;change,

View File

@ -506,8 +506,8 @@ system:
<p style="box-sizing: border-box; user-select: text; color: #191813; <p style="box-sizing: border-box; user-select: text; color: #191813;
font-family: CaslonAntique; font-size: 16px; letter-spacing: 1px; font-family: CaslonAntique; font-size: 16px; letter-spacing: 1px;
text-align: justify; background-color: #f5f5f0;"><strong style="box-sizing: text-align: justify; background-color: #f5f5f0;"><strong style="box-sizing:
border-box; user-select: text;">VOLONT&Eacute;/moral &agrave; - border-box; user-select: text;">@roll[Volonté/Cuisibe] (avec moral) &agrave; -
(degr&eacute; d&rsquo;exotisme) + (Cuisine)</strong></p> (degr&eacute; d&rsquo;exotisme) </strong></p>
<p style="box-sizing: border-box; user-select: text; color: #191813; <p style="box-sizing: border-box; user-select: text; color: #191813;
font-family: CaslonAntique; font-size: 16px; letter-spacing: 1px; font-family: CaslonAntique; font-size: 16px; letter-spacing: 1px;

View File

@ -23,31 +23,29 @@ system:
<p>Les points de VUE perdus ne peuvent &ecirc;tre regagn&eacute;s que quand <p>Les points de VUE perdus ne peuvent &ecirc;tre regagn&eacute;s que quand
la maladie est enti&egrave;rement gu&eacute;rie. &Agrave; chaque point de la maladie est enti&egrave;rement gu&eacute;rie. &Agrave; chaque point de
vie regagn&eacute;, jouer un jet de CONSTITUTION ajust&eacute; vie regagn&eacute;, jouer un jet de @roll[Constitution] ajust&eacute;
n&eacute;gativement par les points de vie toujours manquants. Puis selon le n&eacute;gativement par les points de vie toujours manquants. Puis selon le
r&eacute;sultat:</p> r&eacute;sultat:</p>
<ul> <ul>
<li><strong><em>Particuli&egrave;re&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <li><strong><em>Particuli&egrave;re</em></strong>&nbsp; Regain de 2 points
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; de VUE</li>
</em></strong>Regain de 2 points de VUE</li>
<li><strong><em>Normale et significative</em></strong>&nbsp; &nbsp; &nbsp; <li><strong><em>Normale et significative</em></strong>&nbsp; Regain de 1
Regain de 1 point de VUE</li> point de VUE</li>
<li><strong><em>&Eacute;chec et &Eacute;chec particulier</em></strong>&nbsp; <li><strong><em>&Eacute;chec et &Eacute;chec particulier</em></strong>&nbsp;
Aucun regain</li> Aucun regain</li>
<li><strong><em>&Eacute;chec total</em>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <li><strong><em>&Eacute;chec total</em></strong>&nbsp; Aggravation,
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; re-perte d&rsquo;un point de VUE</li>
</strong>Aggravation, re-perte d&rsquo;un point de VUE</li>
</ul> </ul>
<p>Si tous les points de vie ont &eacute;t&eacute; regagn&eacute;s et <p>Si tous les points de vie ont &eacute;t&eacute; regagn&eacute;s et
qu&rsquo;il manque toujours un ou plusieurs points de VUE, jouer un jet de qu&rsquo;il manque toujours un ou plusieurs points de VUE, jouer un jet de
CONSTITUTION &agrave; z&eacute;ro toutes les 12 heures, et appliquer les @roll[Constitution/0] toutes les 12 heures, et appliquer les
m&ecirc;mes r&eacute;sultats que ci-dessus.</p> m&ecirc;mes r&eacute;sultats que ci-dessus.</p>
<p>Une potion d&rsquo;herbes de soin enchant&eacute;e peut faire regagner <p>Une potion d&rsquo;herbes de soin enchant&eacute;e peut faire regagner

File diff suppressed because one or more lines are too long

View File

@ -16,10 +16,10 @@ system:
<p>Il conf&egrave;re un bonus de +5 &agrave; tous les jets de <p>Il conf&egrave;re un bonus de +5 &agrave; tous les jets de
DEXT&Eacute;RIT&Eacute;, de Tir et de Lancer, et est suivi d&rsquo;une perte DEXT&Eacute;RIT&Eacute;, de Tir et de Lancer, et est suivi d&rsquo;une perte
de 1d6 points d&rsquo;endurance.</p> de @roll[1d6] points d&rsquo;endurance.</p>
enchantement: >- enchantement: >-
<p>Si la potion est enchant&eacute;e, l&rsquo;effet magique n&rsquo;a lieu <p>Si la potion est enchant&eacute;e, l&rsquo;effet magique n&rsquo;a lieu
que si un jet de r&eacute;sistance standard est &eacute;chou&eacute;.</p> que si un jet de r&eacute;sistance standard @roll[reve-actuel] est &eacute;chou&eacute;.</p>
<p>L&rsquo;effet se produit alors dans le round cons&eacute;cutif au jet de <p>L&rsquo;effet se produit alors dans le round cons&eacute;cutif au jet de
r&eacute;sistance (au lieu de 2 minutes) et voit sa dur&eacute;e r&eacute;sistance (au lieu de 2 minutes) et voit sa dur&eacute;e
@ -32,8 +32,8 @@ system:
sur-effet se produise &nbsp;: la perte totale du go&ucirc;t et de sur-effet se produise &nbsp;: la perte totale du go&ucirc;t et de
l&rsquo;odorat (ODORAT-GO&Ucirc;T tombe &agrave; z&eacute;ro).</p> l&rsquo;odorat (ODORAT-GO&Ucirc;T tombe &agrave; z&eacute;ro).</p>
<p>Pour le regain, jouer tous les matins un jet d&rsquo;ODORAT- GO&Ucirc;T <p>Pour le regain, jouer tous les matins un jet
(originel) &agrave; z&eacute;ro et regagner selon le bar&egrave;me des @roll[odorat-gout] (originel)et regagner selon le bar&egrave;me des
points de t&acirc;che.</p> points de t&acirc;che.</p>
manipulation: >- manipulation: >-
<ul><li>Piler à froid <strong>2 doigts de graisse de carpe</strong> et <ul><li>Piler à froid <strong>2 doigts de graisse de carpe</strong> et

View File

@ -23,7 +23,8 @@ system:
points d&rsquo;endurance.</p> points d&rsquo;endurance.</p>
enchantement: >- enchantement: >-
<p>Si la potion est enchant&eacute;e, l&rsquo;effet magique n&rsquo;a lieu <p>Si la potion est enchant&eacute;e, l&rsquo;effet magique n&rsquo;a lieu
que si un jet de r&eacute;sistance standard est &eacute;chou&eacute;.</p> que si un jet de r&eacute;sistance standard @roll[reve-actuel] est
&eacute;chou&eacute;.</p>
<p>L&rsquo;effet se produit alors dans le round cons&eacute;cutif au jet de <p>L&rsquo;effet se produit alors dans le round cons&eacute;cutif au jet de
r&eacute;sistance (au lieu de 2 minutes) et voit sa dur&eacute;e r&eacute;sistance (au lieu de 2 minutes) et voit sa dur&eacute;e

View File

@ -18,8 +18,8 @@ system:
<p>Si un personnage ainsi rendu dérisoire participe à un combat, il peut <p>Si un personnage ainsi rendu dérisoire participe à un combat, il peut
tenter une fois par round de lancer une plaisanterie en guise dattaque tenter une fois par round de lancer une plaisanterie en guise dattaque
(tout en esquivant/parant normalement). Il joue pour cela APPARENCE/ Comédie (tout en esquivant/parant normalement). Il joue pour cela @roll[APPARENCE/Comédie]
à -1d4 (ce d4 résume les conditions ponctuelles plus ou moins propices, et à -@roll[1d4] (ce d4 résume les conditions ponctuelles plus ou moins propices, et
il est en fait soustrait du bonus de +4 conféré par le sort). Puis selon la il est en fait soustrait du bonus de +4 conféré par le sort). Puis selon la
réussite, on obtient un ajustement :</p> réussite, on obtient un ajustement :</p>
@ -56,10 +56,10 @@ system:
</table> </table>
<p>Tous les autres engagés dans la mêlée capables de comprendre la blague, y <p>Tous les autres engagés dans la mêlée capables de comprendre la blague, y
compris les compagnons du plaisantin, jouent alors VOLONTÉ/<em>moins compris les compagnons du plaisantin, jouent alors @roll[Volonté] <em>moins
</em>moral à + (ajustement) + (Comédie facultativement). Tout échec provoque </em>moral à + (ajustement) + (Comédie facultativement). Tout échec provoque
un état de demi-surprise pour la fin du round et tout le round suivant. En un état de demi-surprise pour la fin du round et tout le round suivant. En
cas déchec total à son jet dAPPARENCE/Comédie, le plaisantin est le seul à cas déchec total à son jet d@roll[Apparence/Comédie], le plaisantin est le seul à
rire de sa blague, et entre automatiquement en demi-surprise jusquà la fin rire de sa blague, et entre automatiquement en demi-surprise jusquà la fin
du round suivant.</p> du round suivant.</p>
descriptionmj: '' descriptionmj: ''

View File

@ -7,7 +7,7 @@ system:
description: >- description: >-
<p>Ce sort provoque lillusion dune grande fatigue, qui est interprétée <p>Ce sort provoque lillusion dune grande fatigue, qui est interprétée
comme une fatigue réelle. La victime marque instantanément 6 cases de comme une fatigue réelle. La victime marque instantanément 6 cases de
fatigue, puis joue un jet de VOLONTÉ à -5 avec un éventuel bonus de +1 par fatigue, puis joue un jet de @roll[Volonté/-5] avec un éventuel bonus de +1 par
point de CONSTITUTION au-dessus de 15. Si le jet de VOLONTÉ réussit, il ny point de CONSTITUTION au-dessus de 15. Si le jet de VOLONTÉ réussit, il ny
a pas dautre conséquence que les cases de fatigue. Si le jet échoue, tout a pas dautre conséquence que les cases de fatigue. Si le jet échoue, tout
dépend alors de lactivité actuelle de la cible. Si elle est en condition de dépend alors de lactivité actuelle de la cible. Si elle est en condition de

View File

@ -9,7 +9,7 @@ system:
humano&iuml;des. La suggestion d&rsquo;une id&eacute;e drolatique plonge la humano&iuml;des. La suggestion d&rsquo;une id&eacute;e drolatique plonge la
cible dans un irr&eacute;pressible fou-rire, automatique le premier round. cible dans un irr&eacute;pressible fou-rire, automatique le premier round.
Puis pour les rounds suivants, la cible doit r&eacute;ussir un jet de Puis pour les rounds suivants, la cible doit r&eacute;ussir un jet de
VOLONT&Eacute;/ <em>moins </em>moral &agrave; -5, ou continuer &agrave; @roll[Volonté/-5] <em>moins </em>moral, ou continuer &agrave;
rire. Tant que la cible rit, elle est consid&eacute;r&eacute;e en rire. Tant que la cible rit, elle est consid&eacute;r&eacute;e en
<em>demi-surprise</em>.</p> <em>demi-surprise</em>.</p>
descriptionmj: '' descriptionmj: ''

View File

@ -25,7 +25,7 @@ system:
pouvant aller de 0 à 7 (1d8-1). Pour en supporter le goût "étrange et venu pouvant aller de 0 à 7 (1d8-1). Pour en supporter le goût "étrange et venu
dailleurs", les convives doivent réussir un jet de :</p> dailleurs", les convives doivent réussir un jet de :</p>
<p><strong>VOLONTÉ/moral à - (degré dexotisme) + (Cuisine)</strong></p> <p><strong>@roll[Volonté/Cuisine] (avec moral) à - (degré dexotisme)</strong></p>
<p>Si le jet est réussi, le personnage nest pas choqué par lexotisme et <p>Si le jet est réussi, le personnage nest pas choqué par lexotisme et
peut même en apprécier la gastronomie. Pour tout échec, le personnage est peut même en apprécier la gastronomie. Pour tout échec, le personnage est

View File

@ -7,7 +7,7 @@ system:
description: >- description: >-
<p>Leffet de Peur ne sapplique quaux humanoïdes. La suggestion dune <p>Leffet de Peur ne sapplique quaux humanoïdes. La suggestion dune
horreur intense cause une peur réelle. La victime doit réussir un jet de horreur intense cause une peur réelle. La victime doit réussir un jet de
VOLONTÉ à -5 ou être sonnée en cas déchec. Le jet de VOLONTÉ doit être @roll[Volonté/-5] ou être sonnée en cas déchec. Le jet de VOLONTÉ doit être
renouvelé de round en round jusquà ce quil réussisse. Tant quil échoue, renouvelé de round en round jusquà ce quil réussisse. Tant quil échoue,
la victime reste en <em>demi-surprise</em>.</p> la victime reste en <em>demi-surprise</em>.</p>
descriptionmj: '' descriptionmj: ''

View File

@ -18,7 +18,7 @@ system:
impossible dobtenir le sosie parfait de quelquun, tout comme il est impossible dobtenir le sosie parfait de quelquun, tout comme il est
difficile à un peintre dobtenir un portrait parfaitement ressemblant. Si un difficile à un peintre dobtenir un portrait parfaitement ressemblant. Si un
haut-rêvant désire donner à sa cible la même apparence que quelquun haut-rêvant désire donner à sa cible la même apparence que quelquun
dautre, il doit jouer un jet de VUE à -8, et obtiendra une ressemblance dautre, il doit jouer un jet de @roll[Vue/-8], et obtiendra une ressemblance
plus ou moins approchante selon son genre de résultat. Inventer un humanoïde plus ou moins approchante selon son genre de résultat. Inventer un humanoïde
anonyme quoique doté de traits spécifiques (blond, gros nez, une verrue au anonyme quoique doté de traits spécifiques (blond, gros nez, une verrue au
menton, etc.) sobtient sans problème. Comme toujours en ce qui concerne menton, etc.) sobtient sans problème. Comme toujours en ce qui concerne

View File

@ -18,7 +18,7 @@ system:
@UUID[Compendium.foundryvtt-reve-de-dragon.rappel-des-regles.JournalEntry.ZmMoOtUdgjMd4cNs]{Conflit @UUID[Compendium.foundryvtt-reve-de-dragon.rappel-des-regles.JournalEntry.ZmMoOtUdgjMd4cNs]{Conflit
de sens}. Le cri illusoire dun animal doit être le cri dun animal connu, de sens}. Le cri illusoire dun animal doit être le cri dun animal connu,
et vouloir donner à un humanoïde la même voix que quelquun dautre demande et vouloir donner à un humanoïde la même voix que quelquun dautre demande
un jet dOUÏE à -8, avec les mêmes remarques que pour Transfiguration. Noter un jet d@roll[Ouie/-8], avec les mêmes remarques que pour Transfiguration. Noter
que seule la voix est changée, sans affecter en rien le contenu du discours. que seule la voix est changée, sans affecter en rien le contenu du discours.
Enfin, de même que la taille reste la même pour les illusions visuelles, le Enfin, de même que la taille reste la même pour les illusions visuelles, le
volume sonore de lillusion auditive est celui de la cible. Une souris ne volume sonore de lillusion auditive est celui de la cible. Une souris ne

View File

@ -37,9 +37,9 @@ system:
créateur de l'objet et non de l'utilisateur, et quand le sort a une durée créateur de l'objet et non de l'utilisateur, et quand le sort a une durée
HN, c'est également l'heure de naissance du créateur. Le seul paramétrage HN, c'est également l'heure de naissance du créateur. Le seul paramétrage
inutile est l'heure de naissance de la cible en prévision du jet de inutile est l'heure de naissance de la cible en prévision du jet de
résistance. Quand un JR est possible, il est toujours r-8, quelle que soit résistance. Quand un JR est possible, il est toujours @roll[reve-actuel/-8],
la cible. S'il réussit, le sort se dissipe aussitôt sans revenir vers quelle que soit la cible. S'il réussit, le sort se dissipe aussitôt sans
l'utilisateur.</p> revenir vers l'utilisateur.</p>
<p>L'objet réussit son lancer, sans jet de dés. Lancer un sort via un objet <p>L'objet réussit son lancer, sans jet de dés. Lancer un sort via un objet
magique n'est pas plus économique en points de rêve que de la lancer magique n'est pas plus économique en points de rêve que de la lancer

View File

@ -12,9 +12,9 @@ system:
arr&ecirc;tant totalement la vue. De l&rsquo;int&eacute;rieur, il est arr&ecirc;tant totalement la vue. De l&rsquo;int&eacute;rieur, il est
pareillement impossible de voir ce qui se passe &agrave; pareillement impossible de voir ce qui se passe &agrave;
l&rsquo;ext&eacute;rieur"; on peut seulement tenter de voir ce qui se passe l&rsquo;ext&eacute;rieur"; on peut seulement tenter de voir ce qui se passe
&agrave; l&rsquo;int&eacute;rieur en r&eacute;ussissant un jet de VUE &agrave; l&rsquo;int&eacute;rieur en r&eacute;ussissant un jet de
ajust&eacute; n&eacute;gativement par le nombre de points de r&ecirc;ve @roll[Vue] ajust&eacute; n&eacute;gativement par le nombre de points de
d&eacute;pens&eacute;s.</p> r&ecirc;ve d&eacute;pens&eacute;s.</p>
descriptionmj: '' descriptionmj: ''
draconic: Oniros draconic: Oniros
duree: HN duree: HN

View File

@ -19,7 +19,7 @@ system:
zombis, et contrairement aux entités de cauchemar incarnées qui peuvent zombis, et contrairement aux entités de cauchemar incarnées qui peuvent
dépasser cette limite, la caractéristique RÊVE d'un squelette invoqué ne dépasser cette limite, la caractéristique RÊVE d'un squelette invoqué ne
peut jamais dépasser sa caractéristique TAILLE. Sa hideur est telle que peut jamais dépasser sa caractéristique TAILLE. Sa hideur est telle que
quiconque l'aperçoit doit réussir un jet de VOLONTÉ à -3 ou être en quiconque l'aperçoit doit réussir un jet de @roll[VOLONTÉ/-3] ou être en
demi-surprise jusqu'à la fin du round suivant.</p> demi-surprise jusqu'à la fin du round suivant.</p>
<p>Un squelette invoqué est aux ordres de son invocateur et n'agit qu'aux <p>Un squelette invoqué est aux ordres de son invocateur et n'agit qu'aux

View File

@ -13,7 +13,7 @@ system:
à zéro) ou subir en retour l'effet de son sort.</p> à zéro) ou subir en retour l'effet de son sort.</p>
<p>Le flétrissement n'est pas définitif. Chaque jour, à lextrême fin du <p>Le flétrissement n'est pas définitif. Chaque jour, à lextrême fin du
Château Dormant, la victime peur jouer un jet d'APPARENCE à zéro en prenant Château Dormant, la victime peur jouer un jet d'@roll[APPARENCE/0] en prenant
non pas son APPARENCE actuelle, mais son APPARENCE initiale. Toute réussite non pas son APPARENCE actuelle, mais son APPARENCE initiale. Toute réussite
: regain de 1 point en APPARENCE et de 2 points de Beauté. Tout échec : pas : regain de 1 point en APPARENCE et de 2 points de Beauté. Tout échec : pas
de regain pour aujourd'hui. Dans tous les cas, ni l'APPARENCE ni la Beauté de regain pour aujourd'hui. Dans tous les cas, ni l'APPARENCE ni la Beauté

View File

@ -10,7 +10,7 @@ system:
maîtrise. Cette dernière est automatique, comme avec les écailles de Narcos, 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 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 <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 s'accompagnant d'une perte d'@roll[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ù 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, 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 bague au doigt, bracelet au poignet, etc. Si l'objet n'a pas de fonction

View File

@ -8,7 +8,7 @@ system:
<p>Le principe de fonctionnement de la griffe morbide de Thanatos est <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. 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 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, griffes morbides, ainsi que @roll[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é, 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 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 Dormant, la victime de la griffe morbide doit tenter un jet de Vie et en

View File

@ -4,7 +4,7 @@ type: souffle
img: systems/foundryvtt-reve-de-dragon/icons/souffle_dragon.webp img: systems/foundryvtt-reve-de-dragon/icons/souffle_dragon.webp
system: system:
description: >- description: >-
<p>Le vieillissement est de 1d7 ans. Jouer un jet de Constitution ajusté <p>Le vieillissement est de 1d7 ans. Jouer un jet de @roll[Constitution] ajusté
négativement au nombre dannées perdues. En cas déchec, perte définitive négativement au nombre dannées perdues. En cas déchec, perte définitive
dun point en Constitution.</p> dun point en Constitution.</p>
descriptionmj: '' descriptionmj: ''

View File

@ -10,7 +10,8 @@ system:
rêves, soit un Passeur, soit un Messager, dès quelle est visitée par le rêves, soit un Passeur, soit un Messager, dès quelle est visitée par le
demi-rêve du haut-rêvant. Il ny a pas de d7 à tirer, le haut-rêvant choisit demi-rêve du haut-rêvant. Il ny a pas de d7 à tirer, le haut-rêvant choisit
librement ce quil préfère, et la rencontre est considérée automatiquement librement ce quil préfère, et la rencontre est considérée automatiquement
maîtrisée, Fleurs, Messagers et Passeurs ayant une force de 2d6 points. Dès maîtrisée, Fleurs, Messagers et Passeurs ayant une force de @roll[2d6]
points. Dès
quelle a offert son présent, la cité redevient normale en ce qui concerne quelle a offert son présent, la cité redevient normale en ce qui concerne
le tirage des rencontres; il ny a quun seul présent par cité. La tête de le tirage des rencontres; il ny a quun seul présent par cité. La tête de
Dragon prend fin dès que toutes les cités (22) ont été visitées; entretemps, Dragon prend fin dès que toutes les cités (22) ont été visitées; entretemps,

View File

@ -5,13 +5,13 @@ flags: {}
img: systems/foundryvtt-reve-de-dragon/icons/tete_dragon.webp img: systems/foundryvtt-reve-de-dragon/icons/tete_dragon.webp
system: system:
description: >- description: >-
<p>Un jet dEmpathie à zéro permet de rendre amical un animal non agressif <p>Un jet d@roll[empathie/0] permet de rendre amical un animal non agressif
ou de rendre neutre un animal agressif. Les animaux restent neutres\amicaux ou de rendre neutre un animal agressif. Les animaux restent neutres/amicaux
jusquà ce quun événement significatif, agression ou autre, vienne tout jusquà ce quun événement significatif, agression ou autre, vienne tout
remettre en question. Ce nest pas un lien magique. Un seul jet par animal. remettre en question. Ce nest pas un lien magique. Un seul jet par animal.
Un animal rendu neutre par ce don ne peut pas ensuite être rendu amical par Un animal rendu neutre par ce don ne peut pas ensuite être rendu amical par
un second jet. Enfin létendue de la neutralité\ amitié de lanimal dépend un second jet. Enfin létendue de la neutralité/amitié de lanimal dépend de
de chaque espèce et est à décider dans chaque cas particulier par le gardien chaque espèce et est à décider dans chaque cas particulier par le gardien
des rêves. Cumulable.</p> des rêves. Cumulable.</p>
descriptionmj: '' descriptionmj: ''
frequence: 6 frequence: 6
@ -24,7 +24,12 @@ folder: null
sort: 0 sort: 0
_stats: _stats:
systemId: foundryvtt-reve-de-dragon systemId: foundryvtt-reve-de-dragon
systemVersion: 12.0.22 systemVersion: 12.0.33
coreVersion: '12.331' coreVersion: '12.331'
createdTime: null
modifiedTime: 1736617623199
lastModifiedBy: Hp9ImM4o9YRTSdfu
compendiumSource: null
duplicateSource: null
_key: '!items!wlbbh75GZWks3Ehb' _key: '!items!wlbbh75GZWks3Ehb'

View File

@ -5,9 +5,9 @@ flags: {}
img: systems/foundryvtt-reve-de-dragon/icons/tete_dragon.webp img: systems/foundryvtt-reve-de-dragon/icons/tete_dragon.webp
system: system:
description: >- description: >-
<p>Un jet dEmpathie à zéro permet de deviner la direction du nord, et dune <p>Un jet d@roll[empathie/0] permet de deviner la direction du nord, et
manière générale de retrouver une certaine direction quand on est perdu ou dune manière générale de retrouver une certaine direction quand on est
par manque de visibilité (nuit, brouillard, souterrain, etc.). perdu ou par manque de visibilité (nuit, brouillard, souterrain, etc.).
Cumulable.</p> Cumulable.</p>
descriptionmj: '' descriptionmj: ''
frequence: 6 frequence: 6
@ -20,7 +20,12 @@ folder: null
sort: 0 sort: 0
_stats: _stats:
systemId: foundryvtt-reve-de-dragon systemId: foundryvtt-reve-de-dragon
systemVersion: 12.0.22 systemVersion: 12.0.33
coreVersion: '12.331' coreVersion: '12.331'
createdTime: null
modifiedTime: 1736617654367
lastModifiedBy: Hp9ImM4o9YRTSdfu
compendiumSource: null
duplicateSource: null
_key: '!items!slnKVCfHbLwbXi4Z' _key: '!items!slnKVCfHbLwbXi4Z'

View File

@ -5,10 +5,10 @@ flags: {}
img: systems/foundryvtt-reve-de-dragon/icons/tete_dragon.webp img: systems/foundryvtt-reve-de-dragon/icons/tete_dragon.webp
system: system:
description: >- description: >-
<p>Un jet de Volonté à zéro permet de sendormir instantanément et de dormir <p>Un jet de @roll[Volonté/0] permet de sendormir instantanément et de
au moins jusquà la fin de la prochaine heure, même sans aucun point de dormir au moins jusquà la fin de la prochaine heure, même sans aucun point
fatigue. Permet également de se réveiller au bout dun laps de temps donné, de fatigue. Permet également de se réveiller au bout dun laps de temps
"programmé" au moment de sendormir. Cumulable.</p> donné, "programmé" au moment de sendormir. Cumulable.</p>
descriptionmj: '' descriptionmj: ''
frequence: 6 frequence: 6
hautrevant: false hautrevant: false
@ -20,7 +20,12 @@ folder: null
sort: 0 sort: 0
_stats: _stats:
systemId: foundryvtt-reve-de-dragon systemId: foundryvtt-reve-de-dragon
systemVersion: 12.0.22 systemVersion: 12.0.33
coreVersion: '12.331' coreVersion: '12.331'
createdTime: null
modifiedTime: 1736617674311
lastModifiedBy: Hp9ImM4o9YRTSdfu
compendiumSource: null
duplicateSource: null
_key: '!items!N6guZDGzzZjt9GrR' _key: '!items!N6guZDGzzZjt9GrR'

View File

@ -5,8 +5,8 @@ flags: {}
img: systems/foundryvtt-reve-de-dragon/icons/tete_dragon.webp img: systems/foundryvtt-reve-de-dragon/icons/tete_dragon.webp
system: system:
description: >- description: >-
<p>Un jet dEmpathie à zéro permet de deviner que lon vous ment, sans pour <p>Un jet d@roll[empathie/0] permet de deviner que lon vous ment, sans
autant connaître la teneur du mensonge. Ne sapplique quau mensonge pour autant connaître la teneur du mensonge. Ne sapplique quau mensonge
volontaire, pas au mensonge par omission ni par ignorance. Cumulable.</p> volontaire, pas au mensonge par omission ni par ignorance. Cumulable.</p>
descriptionmj: '' descriptionmj: ''
frequence: 6 frequence: 6
@ -19,7 +19,12 @@ folder: null
sort: 0 sort: 0
_stats: _stats:
systemId: foundryvtt-reve-de-dragon systemId: foundryvtt-reve-de-dragon
systemVersion: 12.0.22 systemVersion: 12.0.33
coreVersion: '12.331' coreVersion: '12.331'
createdTime: null
modifiedTime: 1736617720094
lastModifiedBy: Hp9ImM4o9YRTSdfu
compendiumSource: null
duplicateSource: null
_key: '!items!OZZbiBiLlM6Y8lEY' _key: '!items!OZZbiBiLlM6Y8lEY'

View File

@ -5,10 +5,10 @@ flags: {}
img: systems/foundryvtt-reve-de-dragon/icons/tete_dragon.webp img: systems/foundryvtt-reve-de-dragon/icons/tete_dragon.webp
system: system:
description: >- description: >-
<p>Un jet de VUE à zéro permet de distinguer une aura bleutée délimitant les <p>Un jet de @roll[vue/0] permet de distinguer une aura bleutée délimitant
zones magiques dOniros ou entourant les objets enchantés ou les créatures les zones magiques dOniros ou entourant les objets enchantés ou les
soumises à leffet dun sort ou dun rituel. Un seul essai par zone, objet créatures soumises à leffet dun sort ou dun rituel. Un seul essai par
ou personnage. Cumulable.</p> zone, objet ou personnage. Cumulable.</p>
descriptionmj: '' descriptionmj: ''
frequence: 6 frequence: 6
hautrevant: false hautrevant: false
@ -20,7 +20,12 @@ folder: null
sort: 0 sort: 0
_stats: _stats:
systemId: foundryvtt-reve-de-dragon systemId: foundryvtt-reve-de-dragon
systemVersion: 12.0.22 systemVersion: 12.0.33
coreVersion: '12.331' coreVersion: '12.331'
createdTime: null
modifiedTime: 1736617743760
lastModifiedBy: Hp9ImM4o9YRTSdfu
compendiumSource: null
duplicateSource: null
_key: '!items!QWouooLkM7pE2yG1' _key: '!items!QWouooLkM7pE2yG1'

View File

@ -1067,12 +1067,13 @@ li label.compteur {
max-width: 90%; max-width: 90%;
} }
.alchimie-tache { a.roll-text.content-link {
color: hsla(300, 70%, 40%, 0.5);
font-weight: bold; font-weight: bold;
background: rgb(182, 180, 179); border: 1px solid var(--color-border-dark-tertiary);
border: 1px solid rgba(72, 46, 28, 1);
border-radius: 0.25rem; border-radius: 0.25rem;
color: rgba(212, 27, 27, 0.5); white-space: nowrap;
word-break: break-all;
} }
.window-app.sheet .window-content .tooltip:hover .tooltiptext { .window-app.sheet .window-content .tooltip:hover .tooltiptext {

View File

@ -3,9 +3,9 @@
"types": ["personnage", "creature", "entite", "commerce", "vehicule"], "types": ["personnage", "creature", "entite", "commerce", "vehicule"],
"templates": { "templates": {
"description": { "description": {
"description": "Description ...", "description": "",
"race": "", "race": "",
"notesmj": "Notes du MJ" "notesmj": ""
}, },
"subacteurs": { "subacteurs": {
"subacteurs": { "subacteurs": {

View File

@ -0,0 +1,8 @@
<span><a class="roll-text content-link"
data-roll-mode="alchimie"
{{#if recette}}data-recette-id="{{recette.id}}"{{/if}}
data-manip="{{manip}}"
data-termes="{{termes}}"
data-tooltip="{{upperFirst carac.label}}/Alchimie à {{diff}}">
{{~manip}} {{termes~}}
</a></span>

View File

@ -0,0 +1,9 @@
<span><a class="roll-text content-link"
data-roll-mode="carac"
{{#if competence}}data-competence="{{competence}}"{{/if~}}
{{#if diff}}data-diff="{{diff}}"{{/if~}}
data-carac-code="{{carac.code}}">
{{~uppercase carac.label~}}
{{#if competence}} / {{upperFirst competence}}{{/if~}}
{{#if diff}} à {{diff}}{{/if~}}
</a></span>

View File

@ -0,0 +1,5 @@
<span><a class="roll-text content-link"
data-roll-mode="foundry"
data-roll-foundry="{{formula}}">
{{~formula~}}
</a></span>

View File

@ -9,7 +9,7 @@
<div class="flexcol"> <div class="flexcol">
<span><label class="item-label">Manipulation : </label></span> <span><label class="item-label">Manipulation : </label></span>
<div class="form-group medium-editor"> <div class="form-group medium-editor">
{{editor manipulation_update target="system.manipulation" button=true owner=options.isOwner editable=options.editable engine="prosemirror"}} {{editor manipulation target="system.manipulation" button=true owner=options.isOwner editable=options.editable engine="prosemirror"}}
</div> </div>
</div> </div>
<div class="flexcol"> <div class="flexcol">

View File

@ -1,7 +1,7 @@
{{#if @root.competences}} {{#if @root.competences}}
<div class="form-group"> <div class="form-group">
<label for="roll-carac-competence">Compétence</label> <label for="roll-text">Compétence</label>
<select name="roll-carac-competence" class="roll-carac-competence" data-dtype="String"> <select name="roll-text" class="roll-text" data-dtype="String">
{{#select ''}}<option value="">Sans compétence</option> {{#select ''}}<option value="">Sans compétence</option>
{{>"systems/foundryvtt-reve-de-dragon/templates/enum-competence.html"}} {{>"systems/foundryvtt-reve-de-dragon/templates/enum-competence.html"}}
{{/select}} {{/select}}