diff --git a/foundryvtt-reve-de-dragon b/foundryvtt-reve-de-dragon deleted file mode 120000 index 190ba7e4..00000000 --- a/foundryvtt-reve-de-dragon +++ /dev/null @@ -1 +0,0 @@ -foundryvtt-reve-de-dragon \ No newline at end of file diff --git a/module/actor-entite-sheet.js b/module/actor-entite-sheet.js index 26905d35..50827f7e 100644 --- a/module/actor-entite-sheet.js +++ b/module/actor-entite-sheet.js @@ -25,7 +25,7 @@ export class RdDActorEntiteSheet extends ActorSheet { /* -------------------------------------------- */ async getData() { - const objectData = Misc.data(this.object); + const objectData = this.object; let formData = { title: this.title, id: objectData.id, diff --git a/module/actor-sheet.js b/module/actor-sheet.js index 6b05672b..51886a37 100644 --- a/module/actor-sheet.js +++ b/module/actor-sheet.js @@ -94,7 +94,7 @@ export class RdDActorSheet extends ActorSheet { RdDItemArme.ajoutCorpsACorps(formData.combat, formData.competences, formData.data.carac); formData.esquives = this.actor.getCompetences("Esquive").map(i => foundry.utils.deepClone(i.system)) formData.combat = RdDCombatManager.finalizeArmeList(formData.combat, formData.competences, formData.data.carac); - + console.log("COMBAT STUFF", formData.combat, formData.armes) this.armesList = formData.combat; // Common data @@ -137,9 +137,9 @@ export class RdDActorSheet extends ActorSheet { /* -------------------------------------------- */ async _onDropItem(event, dragData) { - const destItemId = $(event.target)?.closest('.item').attr('data-item-id'); - const dropParams = RdDSheetUtility.prepareItemDropParameters(destItemId, this.actor.id, dragData, this.objetVersConteneur); - const callSuper = await this.actor.processDropItem(dropParams); + const destItemId = $(event.target)?.closest('.item').attr('data-item-id') + const dropParams = RdDSheetUtility.prepareItemDropParameters(destItemId, this.actor.id, dragData, this.objetVersConteneur) + const callSuper = await this.actor.processDropItem(dropParams) if (callSuper) { await super._onDropItem(event, dragData) } @@ -518,9 +518,9 @@ export class RdDActorSheet extends ActorSheet { const li = $(event.currentTarget)?.parents(".item"); let armeName = li.data("arme-name"); let compName = li.data('competence-name'); - const arme = this.armesList.find(a => a.name == armeName && a.data.competence == compName); + const arme = this.armesList.find(a => a.name == armeName && a.system.competence == compName); if (!arme) { - return { name: armeName, data: { competence: compName } }; + return { name: armeName, system: { competence: compName } }; } return arme; } diff --git a/module/actor-vehicule-sheet.js b/module/actor-vehicule-sheet.js index e6cf1fbc..9d05abba 100644 --- a/module/actor-vehicule-sheet.js +++ b/module/actor-vehicule-sheet.js @@ -27,7 +27,7 @@ export class RdDActorVehiculeSheet extends ActorSheet { /* -------------------------------------------- */ async getData() { - const objectData = Misc.data(this.object); + const objectData = this.object let formData = { title: this.title, id: objectData.id, @@ -36,7 +36,7 @@ export class RdDActorVehiculeSheet extends ActorSheet { name: objectData.name, editable: this.isEditable, cssClass: this.isEditable ? "editable" : "locked", - data: foundry.utils.deepClone(Misc.templateData(this.object)), + data: foundry.utils.deepClone(this.object.system), effects: this.object.effects.map(e => foundry.utils.deepClone(e.data)), limited: this.object.limited, options: this.options, @@ -82,7 +82,7 @@ export class RdDActorVehiculeSheet extends ActorSheet { async monnaieIncDec(id, value) { let monnaie = this.getMonnaie(id); if (monnaie) { - const quantite = Math.max(0, Misc.templateData(monnaie).quantite + value); + const quantite = Math.max(0, monnaie.system.quantite + value); await this.updateEmbeddedDocuments('Item', [{ _id: monnaie.id, 'data.quantite': quantite }]); } } diff --git a/module/actor.js b/module/actor.js index 487b9be3..96bc8fa8 100644 --- a/module/actor.js +++ b/module/actor.js @@ -553,7 +553,7 @@ export class RdDActor extends Actor { /* -------------------------------------------- */ async _recupererVie(message) { - const tData = Misc.templateData(this); + 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); let vieManquante = tData.sante.vie.max - tData.sante.vie.value; @@ -580,7 +580,7 @@ export class RdDActor extends Actor { /* -------------------------------------------- */ async _jetRecuperationConstitution(bonusSoins, message = undefined) { - const tData = Misc.templateData(this); + const tData = this.system; let difficulte = Misc.toInt(bonusSoins) + Math.min(0, tData.sante.vie.value - tData.sante.vie.max); let rolled = await RdDResolutionTable.roll(tData.carac.constitution.value, difficulte); if (message) { @@ -595,14 +595,13 @@ export class RdDActor extends Actor { whisper: ChatUtility.getWhisperRecipientsAndGMs(this.name), content: "Remise à neuf de " + this.name }; - const actorData = Misc.data(this); if (this.isEntiteCauchemar()) { - await this.santeIncDec("endurance", actorData.data.sante.endurance.max - actorData.data.sante.endurance.value); + await this.santeIncDec("endurance", this.system.sante.endurance.max - this.system.sante.endurance.value); } else { - if (actorData.data.blessures) { - const blessures = duplicate(actorData.data.blessures); + if (this.system.blessures) { + const blessures = duplicate(this.system.blessures); for (let listeBlessures of [blessures.legeres.liste, blessures.graves.liste, blessures.critiques.liste]) { for (let blessure of listeBlessures) { this._supprimerBlessure(blessure); @@ -614,10 +613,10 @@ export class RdDActor extends Actor { await this.setEthylisme(1); } - await this.santeIncDec("vie", actorData.data.sante.vie.max - actorData.data.sante.vie.value); - await this.santeIncDec("endurance", actorData.data.sante.endurance.max - actorData.data.sante.endurance.value); - if (ReglesOptionelles.isUsing("appliquer-fatigue") && actorData.data.sante.fatigue) { - await this.update({ "data.sante.fatigue.value": 0 }); + await this.santeIncDec("vie", this.system.sante.vie.max - this.system.sante.vie.value); + await this.santeIncDec("endurance", this.system.sante.endurance.max - this.system.sante.endurance.value); + if (ReglesOptionelles.isUsing("appliquer-fatigue") && this.system.sante.fatigue) { + await this.update({ "system.sante.fatigue.value": 0 }); } } ChatMessage.create(message); @@ -668,7 +667,7 @@ export class RdDActor extends Actor { /* -------------------------------------------- */ async _recupererEthylisme(message) { - let ethylisme = duplicate(Misc.templateData(this).compteurs.ethylisme); + let ethylisme = duplicate(this.system.compteurs.ethylisme); ethylisme.nb_doses = 0; ethylisme.jet_moral = false; if (ethylisme.value < 1) { @@ -682,7 +681,7 @@ export class RdDActor extends Actor { /* -------------------------------------------- */ async recupereEndurance(message) { - const manquant = this._computeEnduranceMax() - Misc.templateData(this).sante.endurance.value; + 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. "; @@ -692,7 +691,7 @@ export class RdDActor extends Actor { /* -------------------------------------------- */ async recupererFatigue(message) { if (ReglesOptionelles.isUsing("appliquer-fatigue")) { - let fatigue = Misc.templateData(this).sante.fatigue.value; + let fatigue = this.system.sante.fatigue.value; const fatigueMin = this._computeFatigueMin(); if (fatigue <= fatigueMin) { return; @@ -707,7 +706,7 @@ export class RdDActor extends Actor { /* -------------------------------------------- */ _calculRecuperationSegment(actuel) { - const segments = RdDUtility.getSegmentsFatigue(Misc.templateData(this).sante.endurance.max); + const segments = RdDUtility.getSegmentsFatigue(this.system.sante.endurance.max); let cumul = 0; let i; for (i = 0; i < 11; i++) { @@ -727,7 +726,7 @@ export class RdDActor extends Actor { /* -------------------------------------------- */ async recuperationReve(message) { - const seuil = Misc.templateData(this).reve.seuil.value; + const seuil = this.system.reve.seuil.value; const reveActuel = this.getReveActuel(); if (reveActuel < seuil) { let deRecuperation = await RdDDice.rollTotal("1dr"); @@ -748,7 +747,7 @@ export class RdDActor extends Actor { /* -------------------------------------------- */ async retourSeuilDeReve(message) { - const seuil = Misc.templateData(this).reve.seuil.value; + const seuil = this.system.reve.seuil.value; const reveActuel = this.getReveActuel(); if (reveActuel > seuil) { message.content += `
Votre rêve redescend vers son seuil naturel (${seuil}, nouveau rêve actuel ${(reveActuel - 1)})`; @@ -757,7 +756,7 @@ export class RdDActor extends Actor { } async retourSust(message) { - const tplData = Misc.templateData(this); + const tplData = this.system; const sustNeeded = tplData.attributs.sust.value; const sustConsomme = tplData.compteurs.sust.value; const eauConsomme = tplData.compteurs.eau.value; @@ -811,10 +810,10 @@ export class RdDActor extends Actor { async resultCombatReveDeDragon(rollData) { rollData.queues = []; if (rollData.rolled.isEchec) { - rollData.queues.push(Misc.data(await this.ajouterQueue())); + rollData.queues.push( await this.ajouterQueue()); } if (rollData.rolled.isETotal) { - rollData.queues.push(Misc.data(await this.ajouterQueue())); + rollData.queues.push(await this.ajouterQueue()); } if (rollData.rolled.isSuccess) { await this.updatePointDeSeuil(); @@ -834,7 +833,7 @@ export class RdDActor extends Actor { /* -------------------------------------------- */ async sortMisEnReserve(rollData, sort) { - let reserve = duplicate(Misc.templateData(this).reve.reserve.list); + let reserve = duplicate(this.system.reve.reserve.list); reserve.push({ coord: rollData.tmr.coord, sort: sort, draconic: duplicate(rollData.competence) }); await this.update({ "data.reve.reserve.list": reserve }); this.currentTMR.updateTokens(); @@ -876,7 +875,7 @@ export class RdDActor extends Actor { if (caracName == 'Taille') { return; } - let carac = RdDActor._findCaracByName(Misc.templateData(this).carac, caracName); + let carac = RdDActor._findCaracByName(this.system.carac, caracName); if (carac) { carac = duplicate(carac); let xp = Number(carac.xp); @@ -896,9 +895,8 @@ export class RdDActor extends Actor { async updateCompetenceXPAuto(idOrName) { let competence = this.getCompetence(idOrName); if (competence) { - let compData = Misc.data(competence); - let xp = Number(compData.data.xp); - let niveau = Number(compData.data.niveau); + let xp = Number(competence.system.xp); + let niveau = Number(competence.system.niveau); while (xp >= RdDItemCompetence.getCompetenceNextXp(niveau) && xp > 0) { xp -= RdDItemCompetence.getCompetenceNextXp(niveau); niveau++; @@ -916,28 +914,27 @@ export class RdDActor extends Actor { if (!competence) { return; } - const compData = Misc.data(competence); - const niveau = Number(compData.data.niveau); - const stressTransforme = Misc.data(this).data.compteurs.experience.value; - const xpRequis = RdDItemCompetence.getCompetenceNextXp(niveau) - compData.data.xp; - if (stressTransforme <= 0 || niveau >= compData.data.niveau_archetype || xpRequis <= 0) { + const niveau = Number(competence.system.niveau); + const stressTransforme = this.system.compteurs.experience.value; + const xpRequis = RdDItemCompetence.getCompetenceNextXp(niveau) - competence.system.xp; + if (stressTransforme <= 0 || niveau >= competence.system.niveau_archetype || xpRequis <= 0) { ui.notifications.info(`La compétence ne peut pas augmenter! stress disponible: ${stressTransforme} expérience requise: ${xpRequis} niveau : ${niveau} - archétype : ${compData.data.niveau_archetype}`); + archétype : ${competence.system.niveau_archetype}`); return; } const xpUtilise = Math.min(stressTransforme, xpRequis); const gainNiveau = xpUtilise >= xpRequis ? 1 : 0; const nouveauNiveau = niveau + gainNiveau; - const nouveauXp = gainNiveau > 0 ? Math.max(compData.data.xp - xpRequis, 0) : (compData.data.xp + xpUtilise); + const nouveauXp = gainNiveau > 0 ? Math.max(competence.system.xp - xpRequis, 0) : (competence.system.xp + xpUtilise); await competence.update({ - "data.xp": nouveauXp, - "data.niveau": nouveauNiveau, + "system.xp": nouveauXp, + "system.niveau": nouveauNiveau, }); const stressTransformeRestant = Math.max(0, stressTransforme - xpUtilise); - await this.update({ "data.compteurs.experience.value": stressTransformeRestant }); + await this.update({ "system.compteurs.experience.value": stressTransformeRestant }); this.updateExperienceLog('Dépense stress', xpUtilise, `Stress en ${competence.name} ${gainNiveau ? "pour passer à " + nouveauNiveau : ""}`); } @@ -960,10 +957,10 @@ export class RdDActor extends Actor { async updateCompetence(idOrName, compValue) { let competence = this.getCompetence(idOrName); if (competence) { - let nouveauNiveau = compValue ?? RdDItemCompetence.getNiveauBase(Misc.data(competence).data.categorie); + let nouveauNiveau = compValue ?? RdDItemCompetence.getNiveauBase(competence.system.categorie); const tronc = RdDItemCompetence.getListTronc(competence.name).filter(it => { const comp = this.getCompetence(it); - const niveauTr = comp? Misc.data(comp).data.niveau : 0; + const niveauTr = competence? competence.system.niveau : 0; return niveauTr < 0 && niveauTr < nouveauNiveau; }); if (tronc.length > 0) { @@ -1027,7 +1024,7 @@ export class RdDActor extends Actor { async updateExperienceLog(modeXP, valeurXP, raisonXP = 'Inconnue') { let d = new Date(); console.log(modeXP, valeurXP, raisonXP); - let expLog = duplicate((Misc.templateData(this)).experiencelog); + let expLog = duplicate(this.system.experiencelog); expLog.push({ mode: Misc.upperFirst(modeXP), valeur: valeurXP, raison: Misc.upperFirst(raisonXP), daterdd: game.system.rdd.calendrier.getDateFromIndex(), datereel: `${d.getDate()}/${d.getMonth() + 1}/${d.getFullYear()}` @@ -1044,7 +1041,7 @@ export class RdDActor extends Actor { /* -------------------------------------------- */ async addCompteurValue(fieldName, fieldValue, raison = 'Inconnue') { - let oldValue = (Misc.templateData(this)).compteurs[fieldName].value; + let oldValue = this.system.compteurs[fieldName].value; await this.update({ [`data.compteurs.${fieldName}.value`]: Number(oldValue) + Number(fieldValue) }); await this.addStressExperienceLog(fieldName, fieldValue, raison); } @@ -1078,7 +1075,7 @@ export class RdDActor extends Actor { /* -------------------------------------------- */ _isConteneurContenu(item, conteneur) { if (item?.isConteneur()) { // Si c'est un conteneur, il faut vérifier qu'on ne le déplace pas vers un sous-conteneur lui appartenant - for (let id of Misc.templateData(item).contenu) { + for (let id of this.system.contenu) { let subObjet = this.getObjet(id); if (subObjet?.id == conteneur.id) { return true; // Loop detected ! @@ -1096,7 +1093,7 @@ export class RdDActor extends Actor { if (!objet) { return 0; } - const tplData = Misc.templateData(objet); + const tplData = objet.system; if (objet.type != 'conteneur') { return Number(tplData.encombrement) * Number(tplData.quantite); } @@ -1109,7 +1106,7 @@ export class RdDActor extends Actor { buildSubConteneurObjetList(conteneurId, deleteList) { let conteneur = this.getObjet(conteneurId); if (conteneur?.type == 'conteneur') { // Si c'est un conteneur - for (let subId of Misc.templateData(conteneur).contenu) { + for (let subId of this.system.contenu) { let subObj = this.getObjet(subId); if (subObj) { if (subObj.type == 'conteneur') { @@ -1134,14 +1131,14 @@ export class RdDActor extends Actor { * de leurs ID */ async enleverDeConteneur(item, conteneur, onEnleverDeConteneur) { if (conteneur?.isConteneur()) { - let data2use = duplicate(Misc.data(conteneur)); - let contenu = data2use.data.contenu; + let data2use = duplicate(conteneur); + let contenu = data2use.system.contenu; let index = contenu.indexOf(item.id); while (index >= 0) { // Force cleanup, itemId is unique contenu.splice(index, 1); index = contenu.indexOf(item.id); } - item.data.estContenu = false; + item.system.estContenu = false; await this.updateEmbeddedDocuments('Item', [data2use]); onEnleverDeConteneur(); } @@ -1152,7 +1149,7 @@ export class RdDActor extends Actor { * de leurs ID */ async ajouterDansConteneur(item, conteneur, onAjouterDansConteneur) { if (conteneur?.isConteneur()) { - let data2use = duplicate(Misc.data(conteneur)); + let data2use = duplicate(conteneur); data2use.data.contenu.push(item.id); item.data.estContenu = true; await this.updateEmbeddedDocuments('Item', [data2use]); @@ -1165,12 +1162,11 @@ export class RdDActor extends Actor { async nettoyerConteneurs() { const corrections = []; for (let item of this.items) { - let itemData = Misc.data(item); - if (itemData.estContenu) { - itemData.estContenu = undefined; + if (item.estContenu) { + item.estContenu = undefined; } - if (itemData.type == 'conteneur' && itemData.data.contenu.length > 0) { - corrections.push({ _id: itemData._id, 'data.contenu': [] }); + if (item.type == 'conteneur' && item.system.contenu.length > 0) { + corrections.push({ _id: itemData._id, 'system.contenu': [] }); } } if (corrections.length > 0) { @@ -1219,20 +1215,20 @@ export class RdDActor extends Actor { if (!dest.isConteneur()) { return false; } - const destData = Misc.data(dest); + const destData = dest if (this._isConteneurContenu(item, dest)) { ui.notifications.warn(`Impossible de déplacer un conteneur parent (${item.name}) dans un de ses contenus ${destData.name} !`); return false; // Loop detected ! } // Calculer le total actuel des contenus - let encContenu = this.getRecursiveEnc(dest) - Number(destData.data.encombrement); + let encContenu = this.getRecursiveEnc(dest) - Number(destData.system.encombrement); let newEnc = this.getRecursiveEnc(item); // Calculer le total actuel du nouvel objet // Teste si le conteneur de destination a suffisament de capacité pour recevoir le nouvel objet - if (Number(destData.data.capacite) < encContenu + newEnc) { + if (Number(destData.system.capacite) < encContenu + newEnc) { ui.notifications.warn( - `Le conteneur ${dest.name} a une capacité de ${destData.data.capacite}, et contient déjà ${encContenu}. + `Le conteneur ${dest.name} a une capacité de ${destData.system.capacite}, et contient déjà ${encContenu}. Impossible d'y ranger: ${item.name} d'encombrement ${newEnc}!`); return false; } @@ -1248,8 +1244,8 @@ export class RdDActor extends Actor { sourceActor.buildSubConteneurObjetList(itemId, itemsList); // Get itemId list const itemsDataToCreate = itemsList.map(it => sourceActor.getObjet(it.id)) - .map(it => duplicate(Misc.data(it))) - .map(it => { it.data.contenu = []; return it; }); + .map(it => duplicate(it)) + .map(it => { it.system.contenu = []; return it; }); let newItems = await this.createEmbeddedDocuments('Item', itemsDataToCreate); let itemMap = this._buildMapOldNewId(itemsList, newItems); @@ -1263,7 +1259,7 @@ export class RdDActor extends Actor { let newItemId = itemMap[item.id]; // Get newItem console.log('New conteneur filling!', newConteneur, newItemId, item); - let contenu = duplicate(Misc.templateData(newConteneur).contenu); + let contenu = duplicate(this.system.contenu); contenu.push(newItemId); await this.updateEmbeddedDocuments('Item', [{ _id: newConteneurId, 'data.contenu': contenu }]); } @@ -1282,7 +1278,7 @@ export class RdDActor extends Actor { } async regrouperEquipementsSimilaires(item, dest) { - await dest.quantiteIncDec(Misc.templateData(item).quantite); + await dest.quantiteIncDec(item.system.quantite); await item.delete(); } @@ -1362,7 +1358,7 @@ export class RdDActor extends Actor { /* -------------------------------------------- */ computeResumeBlessure(blessures = undefined) { - blessures = blessures ?? Misc.templateData(this).blessures; + blessures = blessures ?? this.system.blessures; let nbLegeres = this.countBlessures(blessures.legeres.liste); let nbGraves = this.countBlessures(blessures.graves.liste); let nbCritiques = this.countBlessures(blessures.critiques.liste); @@ -1414,7 +1410,7 @@ export class RdDActor extends Actor { /* -------------------------------------------- */ async ajouterRefoulement(value = 1) { - let refoulement = Misc.templateData(this).reve.refoulement.value + value; + let refoulement = this.system.reve.refoulement.value + value; let total = await RdDDice.rollTotal("1d20"); if (total <= refoulement) { refoulement = 0; @@ -1426,7 +1422,7 @@ export class RdDActor extends Actor { /* -------------------------------------------- */ async ajouterSouffle(options = { chat: false }) { - let souffle = Misc.data(await RdDRollTables.getSouffle()); + let souffle = await RdDRollTables.getSouffle(); souffle._id = undefined; //TBC await this.createEmbeddedDocuments('Item', [souffle]); if (options.chat) { @@ -1441,12 +1437,12 @@ export class RdDActor extends Actor { /* -------------------------------------------- */ async ajouterQueue(options = { chat: false }) { let queue; - if (Misc.data(this).data.reve.reve.thanatosused) { - queue = Misc.data(await RdDRollTables.getOmbre()); + if (this.system.reve.reve.thanatosused) { + queue = await RdDRollTables.getOmbre(); await this.update({ "data.reve.reve.thanatosused": false }); } else { - queue = Misc.data(await RdDRollTables.getQueue()); + queue = await RdDRollTables.getQueue(); } await this.createEmbeddedDocuments('Item', [queue]); if (options.chat) { @@ -1513,7 +1509,7 @@ export class RdDActor extends Actor { /* -------------------------------------------- */ getTMRRencontres() { - return Misc.templateData(this).reve.rencontre.list; + return this.system.reve.rencontre.list; } /* -------------------------------------------- */ @@ -1998,14 +1994,14 @@ export class RdDActor extends Actor { /* -------------------------------------------- */ async boire(item, doses, options = { diminuerQuantite: true }) { - const itemData = Misc.data(item); - const desaltere = itemData.data.desaltere; + const itemData = item; + const desaltere = itemData.system.desaltere; if (desaltere > 0) { await this.updateCompteurValue('eau', Misc.keepDecimals(this.system.compteurs.eau.value + desaltere * doses, 1)); } if (item.isAlcool()) { for (let i = 0; i < doses; i++) { - await this.saouler(itemData.data.force, item); + await this.saouler(itemData.system.force, item); } } await item.diminuerQuantite(doses, options); @@ -2021,7 +2017,7 @@ export class RdDActor extends Actor { alias: this.name, actor: this, vie: this.system.sante.vie.max, - alcool: Misc.data(alcool), + alcool: alcool, jetVie: { forceAlcool: forceAlcool, nbDoses: nbDoses, @@ -2173,7 +2169,7 @@ export class RdDActor extends Actor { /* -------------------------------------------- */ async checkCaracXP(caracName, display = true) { - let carac = RdDActor._findCaracByName(Misc.templateData(this).carac, caracName); + let carac = RdDActor._findCaracByName(this.system.carac, caracName); if (carac && carac.xp > 0) { const niveauSuivant = Number(carac.value) + 1; let xpNeeded = RdDCarac.getCaracNextXp(niveauSuivant); @@ -2200,24 +2196,24 @@ export class RdDActor extends Actor { /* -------------------------------------------- */ async checkCompetenceXP(compName, newXP, display = true) { - let compData = Misc.data(this.getCompetence(compName)); - if (compData && newXP && newXP == compData.data.xp) { // Si édition, mais sans changement XP + let compData = this.getCompetence(compName); + if (compData && newXP && newXP == compData.system.xp) { // Si édition, mais sans changement XP return; } - newXP = (newXP) ? newXP : compData.data.xp; + newXP = (newXP) ? newXP : compData.system.xp; if (compData && newXP > 0) { - let xpNeeded = RdDItemCompetence.getCompetenceNextXp(compData.data.niveau + 1); + let xpNeeded = RdDItemCompetence.getCompetenceNextXp(compData.system.niveau + 1); if (newXP >= xpNeeded) { let newCompData = duplicate(compData); - newCompData.data.niveau += 1; - newCompData.data.xp = newXP; + newCompData.system.niveau += 1; + newCompData.system.xp = newXP; let checkXp = { alias: this.name, competence: newCompData.name, - niveau: newCompData.data.niveau, - xp: newCompData.data.xp, - archetype: newCompData.data.niveau_archetype, - archetypeWarning: newCompData.data.niveau > compData.data.niveau_archetype + niveau: newCompData.system.niveau, + xp: newCompData.system.xp, + archetype: newCompData.system.niveau_archetype, + archetypeWarning: newCompData.system.niveau > compData.system.niveau_archetype } if (display) { ChatMessage.create({ @@ -2277,15 +2273,15 @@ export class RdDActor extends Actor { computeDraconicAndSortIndex(sortList) { let draconicList = this.getDraconicList() .map(it => { - it = duplicate(Misc.data(it)) + it = duplicate(it) it.data.defaut_carac = "reve"; return it; }); for (let sort of sortList) { let draconicsSort = this.getDraconicsSort(draconicList, sort).map(it => it.name); - for (let index = 0; index < draconicList.length && sort.data.listIndex == undefined; index++) { + for (let index = 0; index < draconicList.length && sort.system.listIndex == undefined; index++) { if (draconicsSort.includes(draconicList[index].name)) { - sort.data.listIndex = index; + sort.system.listIndex = index; } } } @@ -2300,7 +2296,7 @@ export class RdDActor extends Actor { case "detection d'aura": return draconicList; case "annulation de magie": - return draconicList.filter(it => !Grammar.toLowerCaseNoAccent(Misc.data(it).name).includes('thanatos')); + return draconicList.filter(it => !Grammar.toLowerCaseNoAccent(it.name).includes('thanatos')); } return [RdDItemCompetence.getVoieDraconic(draconicList, sort.data.draconic)]; } @@ -2324,8 +2320,7 @@ export class RdDActor extends Actor { if (this.currentTMR) this.currentTMR.minimize(); // Hide let draconicList = this.computeDraconicAndSortIndex(sortList); - const actorData = Misc.data(this); - const reve = duplicate(actorData.data.carac.reve); + const reve = duplicate(this.system.carac.reve); let rollData = { carac: { 'reve': reve }, forceCarac: { 'reve': reve }, @@ -2411,7 +2406,7 @@ export class RdDActor extends Actor { if (rollData.competence.name.includes('Thanatos')) { // Si Thanatos await this.update({ "data.reve.reve.thanatosused": true }); } - let reveActuel = Misc.templateData(this).reve.reve.value; + let reveActuel = this.system.reve.reve.value; if (rolled.isSuccess) { // Réussite du sort ! if (rolled.isPart) { rollData.depenseReve = Math.max(Math.floor(rollData.depenseReve / 2), 1); @@ -2489,11 +2484,11 @@ export class RdDActor extends Actor { ui.notifications.warn(`${this.name} n'a pas de caractéristique correspondant à ${caracName}`) return; } - const competence = Misc.data(this.getCompetence(compName)); + const competence = this.getCompetence(compName); if (options.apprecier && competence) { - const minQualite = Math.max(0, competence.data.niveau); + const minQualite = Math.max(0, competence.system.niveau); if (diff <= minQualite) { - ui.notifications.info(`${this.name} a un niveau ${competence.data.niveau} en ${competence.name}, trop élevé pour apprécier la qualité de ${diff}`) + ui.notifications.info(`${this.name} a un niveau ${competence.system.niveau} en ${competence.name}, trop élevé pour apprécier la qualité de ${diff}`) return; } } @@ -2522,11 +2517,11 @@ export class RdDActor extends Actor { /* -------------------------------------------- */ async rollCompetence(idOrName) { - let rollData = { competence: Misc.data(this.getCompetence(idOrName)) } + let rollData = { competence: this.getCompetence(idOrName) } if (rollData.competence.type == 'competencecreature') { - if (rollData.competence.data.iscombat) { - if (rollData.competence.data.ispossession) { + if (rollData.competence.system.iscombat) { + if (rollData.competence.system.ispossession) { RdDPossession.managePossession(this, rollData.competence) } else { const arme = RdDItemCompetenceCreature.toArme(rollData.competence) @@ -2566,7 +2561,7 @@ export class RdDActor extends Actor { /* -------------------------------------------- */ async creerTacheDepuisLivre(item, options = { renderSheet: true }) { - const itemData = Misc.data(item); + const itemData = item const nomTache = "Lire " + itemData.name; const filterTacheLecture = it => it.type == 'tache' && it.name == nomTache; let tachesExistantes = this.filterItems(filterTacheLecture); @@ -2576,12 +2571,12 @@ export class RdDActor extends Actor { data: { carac: 'intellect', competence: 'Ecriture', - difficulte: itemData.data.difficulte, + difficulte: itemData.system.difficulte, periodicite: "60 minutes", fatigue: 2, - points_de_tache: itemData.data.points_de_tache, + points_de_tache: itemData.system.points_de_tache, points_de_tache_courant: 0, - description: "Lecture du livre " + item.name + " - XP : " + itemData.data.xp + " - Compétences : " + itemData.data.competence + description: "Lecture du livre " + item.name + " - XP : " + itemData.system.xp + " - Compétences : " + itemData.system.competence } } await this.createEmbeddedDocuments('Item', [tache], options); @@ -2592,20 +2587,19 @@ export class RdDActor extends Actor { /* -------------------------------------------- */ async rollTache(id) { - const actorData = Misc.data(this); - const tacheData = Misc.data(this.getTache(id)) - const compData = Misc.data(this.getCompetence(tacheData.data.competence)) - compData.data.defaut_carac = tacheData.data.carac; // Patch ! + const tacheData = this.getTache(id) + const compData = this.getCompetence(tacheData.system.competence) + compData.system.defaut_carac = tacheData.system.carac; // Patch ! let rollData = { competence: compData, tache: tacheData, - diffLibre: tacheData.data.difficulte, + diffLibre: tacheData.system.difficulte, diffConditions: 0, use: { libre: false, conditions: true }, carac: {} }; - rollData.carac[tacheData.data.carac] = duplicate(actorData.data.carac[tacheData.data.carac]); // Single carac + rollData.carac[tacheData.system.carac] = duplicate(this.system.carac[tacheData.system.carac]); // Single carac console.log("rollTache !!!", rollData); @@ -2626,19 +2620,19 @@ export class RdDActor extends Actor { // Mise à jour de la tache rollData.appliquerFatigue = ReglesOptionelles.isUsing("appliquer-fatigue"); rollData.tache = duplicate(rollData.tache); - rollData.tache.data.points_de_tache_courant += rollData.rolled.ptTache; + rollData.tache.system.points_de_tache_courant += rollData.rolled.ptTache; if (rollData.rolled.isETotal) { - rollData.tache.data.difficulte--; + rollData.tache.system.difficulte--; } if (rollData.rolled.isSuccess) { - rollData.tache.data.nb_jet_succes++; + rollData.tache.system.nb_jet_succes++; } else { - rollData.tache.data.nb_jet_echec++; + rollData.tache.system.nb_jet_echec++; } - rollData.tache.data.tentatives = rollData.tache.data.nb_jet_succes + rollData.tache.data.nb_jet_echec; + rollData.tache.system.tentatives = rollData.tache.system.nb_jet_succes + rollData.tache.system.nb_jet_echec; this.updateEmbeddedDocuments('Item', [rollData.tache]); - this.santeIncDec("fatigue", rollData.tache.data.fatigue); + this.santeIncDec("fatigue", rollData.tache.system.fatigue); await RdDResolutionTable.displayRollData(rollData, this, 'chat-resultat-tache.html'); } @@ -2862,7 +2856,7 @@ export class RdDActor extends Actor { if (this.currentTMR) this.currentTMR.minimize(); // Hide let draconicList = this.getDraconicList() - .map(draconic => duplicate(Misc.data(draconic))) + .map(draconic => duplicate(draconic)) .map(draconic => { draconic.system.defaut_carac = "intellect"; return draconic; }); const intellect = this.system.carac.intellect; @@ -3185,9 +3179,9 @@ export class RdDActor extends Actor { /* -------------------------------------------- */ rollArme(arme) { - let competence = this.getCompetence(arme.data.competence) + let competence = this.getCompetence(arme.system.competence) if (arme || (competence.type == 'competencecreature' && competence.system.iscombat)) { - if (competence.data.ispossession) { + if (competence.system.ispossession) { RdDPossession.managePossession(this, competence); } else { RdDCombat.createUsingTarget(this)?.attaque(competence, arme); @@ -3226,15 +3220,14 @@ export class RdDActor extends Actor { /* -------------------------------------------- */ async equiperObjet(itemID) { let item = this.getEmbeddedDocument('Item', itemID); - let itemData = Misc.data(item); - if (itemData?.data) { - const isEquipe = !itemData.data.equipe; - let update = { _id: item.id, "data.equipe": isEquipe }; + if (item?.system) { + const isEquipe = !item.system.equipe; + let update = { _id: item.id, "system.equipe": isEquipe }; await this.updateEmbeddedDocuments('Item', [update]); this.computeEncombrementTotalEtMalusArmure(); // Mise à jour encombrement this.computePrixTotalEquipement(); // Mis à jour du prix total de l'équipement if (isEquipe) - this.verifierForceMin(itemData); + this.verifierForceMin(item); } } @@ -3243,16 +3236,15 @@ export class RdDActor extends Actor { let dmg = (attackerRoll.dmg.dmgArme ?? 0) + (attackerRoll.dmg.dmgActor ?? 0); let armeData = attackerRoll.arme; let protection = 0; - const armures = this.items.map(it => Misc.data(it)) - .filter(it => it.type == "armure" && it.data.equipe); + const armures = this.items.filter(it => it.type == "armure" && it.system.equipe); for (const itemData of armures) { - protection += await RdDDice.rollTotal(itemData.data.protection.toString()); + protection += await RdDDice.rollTotal(itemData.system.protection.toString()); if (dmg > 0) { this._deteriorerArmure(itemData, dmg); dmg = 0; } } - const penetration = Misc.toInt(armeData?.data.penetration ?? 0); + const penetration = Misc.toInt(armeData?.system.penetration ?? 0); protection = Math.max(protection - penetration, 0); protection += this.getProtectionNaturelle(); // Gestion des cas particuliers sur la fenêtre d'encaissement @@ -3268,30 +3260,30 @@ export class RdDActor extends Actor { /* -------------------------------------------- */ _deteriorerArmure(item, dmg) { - let itemData = duplicate(Misc.data(item)); - if (!ReglesOptionelles.isUsing('deteriorationArmure') || itemData.data.protection == '0') { + let itemData = duplicate(item); + if (!ReglesOptionelles.isUsing('deteriorationArmure') || itemData.system.protection == '0') { return; } - itemData.data.deterioration = (itemData.data.deterioration ?? 0) + dmg; - if (itemData.data.deterioration >= 10) { - itemData.data.deterioration -= 10; - let res = /(\d+)?d(\d+)(\-\d+)?/.exec(itemData.data.protection); + itemData.data.deterioration = (itemData.system.deterioration ?? 0) + dmg; + if (itemData.system.deterioration >= 10) { + itemData.system.deterioration -= 10; + let res = /(\d+)?d(\d+)(\-\d+)?/.exec(itemData.system.protection); if (res) { let malus = Misc.toInt(res[3]) - 1; let armure = Misc.toInt(res[2]); if (armure+malus <= 0){ - itemData.data.protection = 0; + itemData.system.protection = 0; } else { - itemData.data.protection = '' + (res[1]??'1') + 'd' + armure + malus; + itemData.system.protection = '' + (res[1]??'1') + 'd' + armure + malus; } } - else if (/\d+/.exec(itemData.data.protection)) { - itemData.data.protection = "1d" + itemData.data.protection; + else if (/\d+/.exec(itemData.system.protection)) { + itemData.system.protection = "1d" + itemData.system.protection; } else { ui.notifications.warn(`La valeur d'armure de votre ${item.name} est incorrecte`); } - ChatMessage.create({ content: "Votre armure s'est détériorée, elle protège maintenant de " + itemData.data.protection }); + ChatMessage.create({ content: "Votre armure s'est détériorée, elle protège maintenant de " + itemData.system.protection }); } this.updateEmbeddedDocuments('Item', [itemData]); } @@ -3311,7 +3303,7 @@ export class RdDActor extends Actor { console.log("encaisserDommages", rollData) - let santeOrig = duplicate(Misc.templateData(this).sante); + let santeOrig = duplicate(this.system.sante); let encaissement = await this.jetEncaissement(rollData); this.ajouterBlessure(encaissement); // Will upate the result table @@ -3322,11 +3314,10 @@ export class RdDActor extends Actor { this.computeEtatGeneral(); - const actorData = Misc.data(this); mergeObject(encaissement, { alias: this.name, hasPlayerOwner: this.hasPlayerOwner, - resteEndurance: actorData.data.sante.endurance.value, + resteEndurance: this.system.sante.endurance.value, sonne: perteEndurance.sonne, jetEndurance: perteEndurance.jetEndurance, endurance: santeOrig.endurance.value - perteEndurance.newValue, @@ -3410,12 +3401,11 @@ export class RdDActor extends Actor { /* -------------------------------------------- */ ajouterBlessure(encaissement) { - const actorData = Misc.data(this); - if (actorData.type == 'entite') return; // Une entité n'a pas de blessures + if (this.type == 'entite') return; // Une entité n'a pas de blessures if (encaissement.legeres + encaissement.graves + encaissement.critiques == 0) return; - const endActuelle = Number(actorData.data.sante.endurance.value); - let blessures = duplicate(actorData.data.blessures); + const endActuelle = Number(this.system.sante.endurance.value); + let blessures = duplicate(this.system.blessures); let count = encaissement.legeres; // Manage blessures @@ -3524,8 +3514,8 @@ export class RdDActor extends Actor { || entite.isEntiteCauchemarAccordee(this)) { return true; } - const tplData = Misc.templateData(this); - let rolled = await RdDResolutionTable.roll(this.getReveActuel(), - Number(Misc.templateData(entite).carac.niveau.value)); + const tplData = this.system; + let rolled = await RdDResolutionTable.roll(this.getReveActuel(), - Number(entite.system.carac.niveau.value)); const rollData = { alias: this.name, rolled: rolled, @@ -3562,7 +3552,7 @@ export class RdDActor extends Actor { ui.notifications.error("Impossible de s'accorder à " + this.name + ": ce n'est pas une entite de cauchemer/rêve"); return; } - let resonnance = duplicate(Misc.templateData(this).sante.resonnance); + let resonnance = duplicate(this.system.sante.resonnance); if (resonnance.actors.find(it => it == attaquant._id)) { // déjà accordé return; @@ -3579,7 +3569,7 @@ export class RdDActor extends Actor { ui.notifications.error("Problème de monnaies manquantes, impossible de payer correctement!") throw "Problème de monnaies manquantes, impossible de payer correctement!"; } - return monnaies.map(m => Misc.templateData(m)) + return monnaies.map(m => this.system) .map(tpl => tpl.valeur_deniers * Number(tpl.quantite)) .reduce(Misc.sum(), 0); } @@ -3587,7 +3577,7 @@ export class RdDActor extends Actor { /* -------------------------------------------- */ async optimizeArgent(fortuneTotale) { let monnaies = Monnaie.filtrerMonnaies(this.data.items); - let parValeur = Misc.classifyFirst(monnaies, it => Misc.templateData(it).valeur_deniers); + let parValeur = Misc.classifyFirst(monnaies, it => this.system.valeur_deniers); let nouvelleFortune = { 1000: Math.floor(fortuneTotale / 1000), // or 100: Math.floor(fortuneTotale / 100) % 10, // argent @@ -3683,7 +3673,7 @@ export class RdDActor extends Actor { async monnaieIncDec(id, value) { let monnaie = this.getMonnaie(id); if (monnaie) { - const quantite = Math.max(0, Misc.templateData(monnaie).quantite + value); + const quantite = Math.max(0, monnaie.system.quantite + value); await this.updateEmbeddedDocuments('Item', [{ _id: monnaie.id, 'data.quantite': quantite }]); } } @@ -3721,15 +3711,15 @@ export class RdDActor extends Actor { return; } } - const itemVendu = Misc.data(vendeur?.getObjet(itemId)); + const itemVendu = vendeur?.getObjet(itemId); if (itemVendu) { - if (isItemEmpilable ? (itemVendu.data.quantite < achat.quantiteTotal) : (achat.choix.nombreLots != 1)) { + if (isItemEmpilable ? (itemVendu.system.quantite < achat.quantiteTotal) : (achat.choix.nombreLots != 1)) { await acheteur?.ajouterDeniers(coutDeniers); ChatUtility.notifyUser(achat.userId, 'warn', `Le vendeur n'a plus assez de ${vente.item.name} !`); return; } vendeur.ajouterDeniers(coutDeniers); - let resteQuantite = (itemVendu.data.quantite ?? 1) - achat.quantiteTotal; + let resteQuantite = (itemVendu.system.quantite ?? 1) - achat.quantiteTotal; if (resteQuantite == 0) { vendeur.deleteEmbeddedDocuments("Item", [itemId]) } @@ -3742,7 +3732,7 @@ export class RdDActor extends Actor { type: vente.item.type, img: vente.item.img, name: vente.item.name, - data: mergeObject(vente.item.data, { quantite: isItemEmpilable ? achat.quantiteTotal : undefined }), + data: mergeObject(vente.item.system, { quantite: isItemEmpilable ? achat.quantiteTotal : undefined }), } let listeAchat = isItemEmpilable ? [achatData] : Array.from({ length: achat.quantiteTotal }, (_, i) => achatData) let items = await acheteur.createEmbeddedDocuments("Item", listeAchat) @@ -3779,22 +3769,21 @@ export class RdDActor extends Actor { /* -------------------------------------------- */ async effectuerTacheAlchimie(recetteId, tacheAlchimie, texteTache) { - let recetteData = Misc.data(this.getItemOfType(recetteId, 'recettealchimique')); - const actorData = Misc.data(this); + let recetteData = this.getItemOfType(recetteId, 'recettealchimique'); if (recetteData) { if (tacheAlchimie != "couleur" && tacheAlchimie != "consistance") { ui.notifications.warn(`L'étape alchimique ${tacheAlchimie} - ${texteTache} est inconnue`); return; } - const sansCristal = tacheAlchimie == "couleur" && this.data.items.filter(it => it.isCristalAlchimique()).length == 0; + const sansCristal = tacheAlchimie == "couleur" && this.items.filter(it => it.isCristalAlchimique()).length == 0; const caracTache = RdDAlchimie.getCaracTache(tacheAlchimie); - const alchimieData = Misc.data(this.getCompetence("alchimie")); + const alchimieData = this.getCompetence("alchimie"); let rollData = { recette: recetteData, - carac: { [caracTache]: actorData.data.carac[caracTache] }, - selectedCarac: actorData.data.carac[caracTache], + carac: { [caracTache]: this.system.carac[caracTache] }, + selectedCarac: this.system.carac[caracTache], competence: alchimieData, diffLibre: RdDAlchimie.getDifficulte(texteTache), diffConditions: sansCristal ? -4 : 0, @@ -3804,7 +3793,7 @@ export class RdDActor extends Actor { sansCristal: sansCristal } } - rollData.competence.data.defaut_carac = caracTache; + rollData.competence.system.defaut_carac = caracTache; const dialog = await RdDRoll.create(this, rollData, { @@ -3914,7 +3903,7 @@ export class RdDActor extends Actor { /* -------------------------------------------- */ async buildPotionGuerisonList(pointsGuerison) { let pointsGuerisonInitial = pointsGuerison; - let myData = Misc.templateData(this); + let myData = this.system; const blessures = duplicate(myData.blessures); let guerisonData = { list: [], pointsConsommes: 0 } @@ -4072,11 +4061,11 @@ export class RdDActor extends Actor { /* -------------------------------------------- */ async consommerPotion(potion, onActionItem = async () => {}) { - const potionData = Misc.data(potion); + const potionData = potion if (potionData.data.categorie.includes('Soin')) { this.consommerPotionSoin(potionData); - } else if (potionData.data.categorie.includes('Repos')) { + } else if (potionData.system.categorie.includes('Repos')) { this.consommerPotionRepos(potionData); } else { this.consommerPotionGenerique(potionData); @@ -4206,7 +4195,7 @@ export class RdDActor extends Actor { if (Misc.isUniqueConnectedGM()) { let draconique = Draconique.all().find(it => it.isCase(item)); if (draconique) { - draconique.onActorDeleteCaseTmr(this, Misc.data(item)) + draconique.onActorDeleteCaseTmr(this, item) } } } diff --git a/module/dialog-create-signedraconique.js b/module/dialog-create-signedraconique.js index 57d17d3a..2800d53b 100644 --- a/module/dialog-create-signedraconique.js +++ b/module/dialog-create-signedraconique.js @@ -12,7 +12,7 @@ export class DialogCreateSigneDraconique extends Dialog { signe: signe, tmrs: TMRUtility.listSelectedTMR(signe.data.typesTMR ?? []), actors: game.actors.filter(actor => actor.isHautRevant()).map(actor => { - let actorData = duplicate(Misc.data(actor)); + let actorData = duplicate(actor); actorData.selected = actor.hasPlayerOwner; return actorData; }) @@ -48,10 +48,10 @@ export class DialogCreateSigneDraconique extends Dialog { async _createSigneForActor(actor, signe) { actor.createEmbeddedDocuments("Item", [signe]); ChatMessage.create({ - whisper: ChatUtility.getWhisperRecipientsAndGMs(Misc.data(actor).name), + whisper: ChatUtility.getWhisperRecipientsAndGMs(actor.name), content: await renderTemplate("systems/foundryvtt-reve-de-dragon/templates/chat-signe-draconique-actor.html", { signe: signe, - alias: Misc.data(actor).name + alias: actor.name }) }); } diff --git a/module/dialog-fabriquer-potion.js b/module/dialog-fabriquer-potion.js index c23287aa..9cdcd339 100644 --- a/module/dialog-fabriquer-potion.js +++ b/module/dialog-fabriquer-potion.js @@ -24,7 +24,7 @@ export class DialogFabriquerPotion extends Dialog { /* -------------------------------------------- */ static prepareData(actor, item) { - let potionData = duplicate(Misc.data(item)); + let potionData = duplicate(item) potionData.nbBrinsSelect = RdDUtility.buildListOptions(1, potionData.data.quantite); potionData.nbBrins = Math.min(potionData.data.quantite, DialogFabriquerPotion.getNombreBrinOptimal(potionData)); potionData.buttonName = "Fabriquer"; diff --git a/module/dialog-item-achat.js b/module/dialog-item-achat.js index b6b3f6ba..9541bd49 100644 --- a/module/dialog-item-achat.js +++ b/module/dialog-item-achat.js @@ -59,8 +59,8 @@ export class DialogItemAchat extends Dialog { let venteData = { item: JSON.parse(jsondata), vendeurId: vendeurId, - vendeur: Misc.data(vendeur), - acheteur: Misc.data(acheteur), + vendeur: vendeur, + acheteur:acheteur, tailleLot: parseInt(buttonAcheter.attributes['data-tailleLot']?.value ?? 1), quantiteIllimite: buttonAcheter.attributes['data-quantiteIllimite']?.value == 'true', quantiteNbLots: parseInt(buttonAcheter.attributes['data-quantiteNbLots']?.value), diff --git a/module/dialog-item-consommer.js b/module/dialog-item-consommer.js index 54295f6d..9c2b8359 100644 --- a/module/dialog-item-consommer.js +++ b/module/dialog-item-consommer.js @@ -38,10 +38,10 @@ export class DialogConsommer extends Dialog { /* -------------------------------------------- */ static prepareData(actor, item) { - const itemData = duplicate(Misc.data(item)); + const itemData = duplicate(item); let consommerData = { item: itemData, - cuisine: Misc.data(actor.getCompetence('cuisine')), + cuisine: actor.getCompetence('cuisine'), choix: { doses: 1, seForcer: false, diff --git a/module/dialog-item-vente.js b/module/dialog-item-vente.js index b0802171..c8f7bd34 100644 --- a/module/dialog-item-vente.js +++ b/module/dialog-item-vente.js @@ -4,7 +4,7 @@ import { Misc } from "./misc.js"; export class DialogItemVente extends Dialog { static async create(item, callback) { - const itemData = Misc.data(item); + const itemData = item const quantite = item.isConteneur() ? 1 : itemData.data.quantite; const venteData = { item: itemData, diff --git a/module/dialog-repos.js b/module/dialog-repos.js index e63ee31c..f3030899 100644 --- a/module/dialog-repos.js +++ b/module/dialog-repos.js @@ -3,7 +3,7 @@ import { Misc } from "./misc.js"; export class DialogRepos extends Dialog { static async create(actor) { - let actorData = Misc.data(actor) + let actorData = actor const html = await renderTemplate("systems/foundryvtt-reve-de-dragon/templates/dialog-repos.html", actorData); new DialogRepos(html, actor).render(true); } diff --git a/module/dialog-split-item.js b/module/dialog-split-item.js index 1f3fe253..f6e73ffd 100644 --- a/module/dialog-split-item.js +++ b/module/dialog-split-item.js @@ -3,7 +3,7 @@ import { Misc } from "./misc.js"; export class DialogSplitItem extends Dialog { static async create(item, callback) { - const itemData = Misc.data(item); + const itemData = item const splitData = { item: itemData, choix: { quantite: 1, max: itemData.data.quantite - 1 } diff --git a/module/dialog-stress.js b/module/dialog-stress.js index cc136977..1decf82e 100644 --- a/module/dialog-stress.js +++ b/module/dialog-stress.js @@ -9,7 +9,7 @@ export class DialogStress extends Dialog { immediat: false, actors: game.actors.filter(actor => actor.hasPlayerOwner && actor.isPersonnage()) .map(actor => { - let actorData = duplicate(Misc.data(actor)); + let actorData = duplicate(actor); actorData.selected = actor.hasPlayerOwner; return actorData; }) diff --git a/module/item-arme.js b/module/item-arme.js index 929f112b..9ab4aa30 100644 --- a/module/item-arme.js +++ b/module/item-arme.js @@ -20,13 +20,13 @@ const nomCategorieParade = { export class RdDItemArme extends Item { static isArme(itemData) { - itemData = Misc.data(itemData); + itemData = itemData return (itemData.type == 'competencecreature' && itemData.system.iscombat) || itemData.type == 'arme'; } /* -------------------------------------------- */ static getArmeData(armeData) { - armeData = Misc.data(armeData); + armeData = armeData switch (armeData ? armeData.type : '') { case 'arme': return armeData; case 'competencecreature': diff --git a/module/item-competence.js b/module/item-competence.js index 1b8a0405..d9d2a080 100644 --- a/module/item-competence.js +++ b/module/item-competence.js @@ -76,10 +76,10 @@ export class RdDItemCompetence extends Item { /* -------------------------------------------- */ static getCategorie(competence) { - return Misc.data(competence)?.data.categorie; + return competence?.system.categorie; } static isDraconic(competence) { - return Misc.data(competence)?.data.categorie == 'draconic'; + return competence?.system.categorie == 'draconic'; } /* -------------------------------------------- */ @@ -173,7 +173,7 @@ export class RdDItemCompetence extends Item { let economie = 0; for (let troncList of competenceTroncs) { let list = troncList.map(name => RdDItemCompetence.findCompetence(competences, name)) - .sort(Misc.descending(c => Misc.templateData(c).niveau)); // tri du plus haut au plus bas + .sort(Misc.descending(c => this.system.niveau)); // tri du plus haut au plus bas list.splice(0, 1); // ignorer la plus élevée list.map(c => c).forEach(c => { economie += RdDItemCompetence.getDeltaXp(c.system.base, Math.min(c.system.niveau, 0)) diff --git a/module/item-competencecreature.js b/module/item-competencecreature.js index 760b7f1e..2e2cc420 100644 --- a/module/item-competencecreature.js +++ b/module/item-competencecreature.js @@ -5,7 +5,7 @@ export class RdDItemCompetenceCreature extends Item { /* -------------------------------------------- */ static setRollDataCreature(rollData) { - rollData.competence = Misc.data(rollData.competence); + rollData.competence = rollData.competence rollData.carac = { "carac_creature": { label: rollData.competence.name, value: rollData.competence.data.carac_value } }; rollData.competence.data.defaut_carac = "carac_creature" rollData.competence.data.categorie = "creature" @@ -19,13 +19,13 @@ export class RdDItemCompetenceCreature extends Item { static toArme(item) { if (RdDItemCompetenceCreature.isCompetenceAttaque(item)) { // si c'est un Item compétence: cloner pour ne pas modifier lma compétence - let arme = Misc.data( (item instanceof Item) ? item.clone(): item); - mergeObject(arme.data, + let arme = (item instanceof Item) ? item.clone(): item; + mergeObject(arme.system, { competence: arme.name, resistance: 100, equipe: true, - dommagesReels: arme.data.dommages, + dommagesReels: arme.system.dommages, penetration: 0, force: 0, rapide: true @@ -38,13 +38,13 @@ export class RdDItemCompetenceCreature extends Item { /* -------------------------------------------- */ static isCompetenceAttaque(itemData) { - itemData = Misc.data(itemData); + itemData = itemData return itemData.type == 'competencecreature' && itemData.data.iscombat; } /* -------------------------------------------- */ static isCompetenceParade(itemData) { - itemData = Misc.data(itemData); + itemData = itemData return itemData.type == 'competencecreature' && itemData.data.isparade; } } diff --git a/module/item-monnaie.js b/module/item-monnaie.js index 99a4ab4c..2395eee0 100644 --- a/module/item-monnaie.js +++ b/module/item-monnaie.js @@ -35,15 +35,13 @@ export class Monnaie { } static filtrerMonnaies(items) { - return items.filter(it => Misc.data(it).type == 'monnaie'); + return items.filter(it => it.type == 'monnaie'); } static monnaiesManquantes(items) { const valeurs = Monnaie.filtrerMonnaies(items) .map(it => it.system.valeur_deniers); const manquantes = monnaiesData.filter(monnaie => !valeurs.find(v => v != monnaie.system?.valeur_deniers)) - //const manquantes = monnaiesData.filter(monnaie => !valeurs.find(v => v != Misc.templateData(monnaie).valeur_deniers) ); - //console.log("Valeurs : ", valeurs, manquantes); return []; //manquantes; } diff --git a/module/item-sheet.js b/module/item-sheet.js index 5ce5b8b2..672f9549 100644 --- a/module/item-sheet.js +++ b/module/item-sheet.js @@ -115,8 +115,8 @@ export class RdDItemSheet extends ItemSheet { /* -------------------------------------------- */ prepareConteneurData(formData) { - formData.itemsByType = Misc.classify(this.actor.items.map(i => foundry.utils.deepClone(i.data))); - RdDUtility.filterEquipementParType(formData); + formData.itemsByType = Misc.classify(this.actor.items.map(i => foundry.utils.deepClone(i))) + RdDUtility.filterEquipementParType(formData) this.objetVersConteneur = RdDUtility.buildArbreDeConteneurs(formData.conteneurs, formData.objets); formData.subItems = formData.conteneurs.find(it => it._id == this.object.id)?.subItems; @@ -221,7 +221,7 @@ export class RdDItemSheet extends ItemSheet { if (this.object.isCompetence()) { let level = RdDItemCompetence.getNiveauBase(event.currentTarget.value); - Misc.templateData(this.object).base = level; + this.object.system.base = level; $("#base").val(level); } } diff --git a/module/item-signedraconique-sheet.js b/module/item-signedraconique-sheet.js index f2217fdd..8d9d59a4 100644 --- a/module/item-signedraconique-sheet.js +++ b/module/item-signedraconique-sheet.js @@ -40,7 +40,7 @@ export class RdDSigneDraconiqueItemSheet extends ItemSheet { /* -------------------------------------------- */ async getData() { - const formData = duplicate(Misc.data(this.object)); + const formData = duplicate(this.object); mergeObject(formData, { title: formData.name, isGM: game.user.isGM, @@ -80,7 +80,7 @@ export class RdDSigneDraconiqueItemSheet extends ItemSheet { async onValeurXpSort(event) { const codeReussite = event.currentTarget.attributes['data-typereussite']?.value ?? 0; const xp = Number(event.currentTarget.value); - const oldValeur = Misc.templateData(this.object).valeur; + const oldValeur = this.object.system.valeur; const newValeur = RdDItemSigneDraconique.calculValeursXpSort(codeReussite, xp, oldValeur); await this.object.update({ 'data.valeur': newValeur }); } diff --git a/module/item-signedraconique.js b/module/item-signedraconique.js index b540a9aa..af2b6697 100644 --- a/module/item-signedraconique.js +++ b/module/item-signedraconique.js @@ -18,7 +18,7 @@ const DIFFICULTE_LECTURE_SIGNE_MANQUE = +11; export class RdDItemSigneDraconique { static prepareSigneDraconiqueMeditation(meditation, rolled) { - meditation = Misc.data(meditation); + meditation = meditation return { name: "de la " + meditation.name, type: "signedraconique", @@ -43,7 +43,7 @@ export class RdDItemSigneDraconique { } static getXpSortSigneDraconique(code, signe) { - return Misc.toInt(Misc.data(signe).data.valeur[code] ?? 0); + return Misc.toInt(signe.system.valeur[code] ?? 0); } static calculValeursXpSort(qualite, valeur, avant) { diff --git a/module/item.js b/module/item.js index c8c55488..81b543ae 100644 --- a/module/item.js +++ b/module/item.js @@ -83,7 +83,7 @@ export class RdDItem extends Item { return this.type == 'herbe' && (this.system.categorie == 'Soin' || this.system.categorie == 'Repos'); } isPotion() { - return Misc.data(this).type == 'potion'; + return this.type == 'potion'; } isEquipement() { @@ -192,10 +192,10 @@ export class RdDItem extends Item { /* -------------------------------------------- */ // détermine si deux équipements sont similaires: de même type, et avec les même champs hormis la quantité isEquipementSimilaire(other) { - const itemData = Misc.data(this) - const otherData = Misc.data(other) - const tplData = Misc.templateData(this) - const otherTplData = Misc.templateData(other) + const itemData = this + const otherData = other + const tplData = this + const otherTplData = other if (!this.isEquipement()) return false; if (itemData.type != otherData.type) return false; if (itemData.name != otherData.name) return false; @@ -241,13 +241,13 @@ export class RdDItem extends Item { /* -------------------------------------------- */ getProprietes() { - return this[`_${Misc.data(this).type}ChatData`](); + return this[`_${this.type}ChatData`](); } /* -------------------------------------------- */ async postItem(modeOverride) { console.log(this); - let chatData = duplicate(Misc.data(this)); + let chatData = duplicate(this); const properties = this.getProprietes(); chatData["properties"] = properties if (this.actor) { @@ -272,7 +272,7 @@ export class RdDItem extends Item { /* -------------------------------------------- */ _objetChatData() { - const tplData = Misc.templateData(this); + const tplData = this.system let properties = [].concat( RdDItem.propertyIfDefined('Résistance', tplData.resistance, tplData.resistance), RdDItem.propertyIfDefined('Qualité', tplData.qualite, tplData.qualite), @@ -283,7 +283,7 @@ export class RdDItem extends Item { /* -------------------------------------------- */ _nourritureboissonChatData() { - const tplData = Misc.templateData(this); + const tplData = this.system let properties = [].concat( RdDItem.propertyIfDefined('Sustentation', tplData.sust, tplData.sust > 0), RdDItem.propertyIfDefined('Désaltère', tplData.desaltere, tplData.boisson), @@ -296,7 +296,7 @@ export class RdDItem extends Item { } /* -------------------------------------------- */ _armeChatData() { - const tplData = Misc.templateData(this); + const tplData = this.system let properties = [ `Compétence: ${tplData.competence}`, `Dommages: ${tplData.dommages}`, @@ -308,7 +308,7 @@ export class RdDItem extends Item { } /* -------------------------------------------- */ _conteneurChatData() { - const tplData = Misc.templateData(this); + const tplData = this.system let properties = [ `Capacité: ${tplData.capacite} Enc.`, `Encombrement: ${tplData.encombrement}` @@ -317,7 +317,7 @@ export class RdDItem extends Item { } /* -------------------------------------------- */ _munitionChatData() { - const tplData = Misc.templateData(this); + const tplData = this.system let properties = [ `Encombrement: ${tplData.encombrement}` ] @@ -325,7 +325,7 @@ export class RdDItem extends Item { } /* -------------------------------------------- */ _armureChatData() { - const tplData = Misc.templateData(this); + const tplData = this.system let properties = [ `Protection: ${tplData.protection}`, `Détérioration: ${tplData.deterioration}`, @@ -336,7 +336,7 @@ export class RdDItem extends Item { } /* -------------------------------------------- */ _competenceChatData() { - const tplData = Misc.templateData(this); + const tplData = this.system let properties = [ `Catégorie: ${tplData.categorie}`, `Niveau: ${tplData.niveau}`, @@ -347,7 +347,7 @@ export class RdDItem extends Item { } /* -------------------------------------------- */ _competencecreatureChatData() { - const tplData = Misc.templateData(this); + const tplData = this.system let properties = [ `Catégorie: ${tplData.categorie}`, `Niveau: ${tplData.niveau}`, @@ -358,7 +358,7 @@ export class RdDItem extends Item { } /* -------------------------------------------- */ _sortChatData() { - const tplData = Misc.templateData(this); + const tplData = this.system let properties = [ `Draconic: ${tplData.draconic}`, `Difficulté: ${tplData.difficulte}`, @@ -369,7 +369,7 @@ export class RdDItem extends Item { } /* -------------------------------------------- */ _herbeChatData() { - const tplData = Misc.templateData(this); + const tplData = this.system let properties = [ `Milieu: ${tplData.milieu}`, `Rareté: ${tplData.rarete}`, @@ -379,7 +379,7 @@ export class RdDItem extends Item { } /* -------------------------------------------- */ _ingredientChatData() { - const tplData = Misc.templateData(this); + const tplData = this.system let properties = [ `Milieu: ${tplData.milieu}`, `Rareté: ${tplData.rarete}`, @@ -389,7 +389,7 @@ export class RdDItem extends Item { } /* -------------------------------------------- */ _tacheChatData() { - const tplData = Misc.templateData(this); + const tplData = this.system let properties = [ `Caractéristique: ${tplData.carac}`, `Compétence: ${tplData.competence}`, @@ -405,7 +405,7 @@ export class RdDItem extends Item { } /* -------------------------------------------- */ _livreChatData() { - const tplData = Misc.templateData(this); + const tplData = this.system let properties = [ `Compétence: ${tplData.competence}`, `Auteur: ${tplData.auteur}`, @@ -417,7 +417,7 @@ export class RdDItem extends Item { } /* -------------------------------------------- */ _potionChatData() { - const tplData = Misc.templateData(this); + const tplData = this.system let properties = [ `Rareté: ${tplData.rarete}`, `Catégorie: ${tplData.categorie}`, @@ -427,7 +427,7 @@ export class RdDItem extends Item { } /* -------------------------------------------- */ _queueChatData() { - const tplData = Misc.templateData(this); + const tplData = this.system let properties = [ `Refoulement: ${tplData.refoulement}` ] @@ -435,7 +435,7 @@ export class RdDItem extends Item { } /* -------------------------------------------- */ _ombreChatData() { - const tplData = Misc.templateData(this); + const tplData = this.system let properties = [ `Refoulement: ${tplData.refoulement}` ] @@ -443,19 +443,19 @@ export class RdDItem extends Item { } /* -------------------------------------------- */ _souffleChatData() { - const tplData = Misc.templateData(this); + const tplData = this.system let properties = []; return properties; } /* -------------------------------------------- */ _teteChatData() { - const tplData = Misc.templateData(this); + const tplData = this.system let properties = []; return properties; } /* -------------------------------------------- */ _tarotChatData() { - const tplData = Misc.templateData(this); + const tplData = this.system let properties = [ `Concept: ${tplData.concept}`, `Aspect: ${tplData.aspect}`, @@ -464,7 +464,7 @@ export class RdDItem extends Item { } /* -------------------------------------------- */ _nombreastralChatData() { - const tplData = Misc.templateData(this); + const tplData = this.system let properties = [ `Valeur: ${tplData.value}`, `Jour: ${tplData.jourlabel}`, @@ -473,7 +473,7 @@ export class RdDItem extends Item { } /* -------------------------------------------- */ _monnaieChatData() { - const tplData = Misc.templateData(this); + const tplData = this.system let properties = [ `Valeur en Deniers: ${tplData.valeur_deniers}`, `Encombrement: ${tplData.encombrement}` @@ -482,7 +482,7 @@ export class RdDItem extends Item { } /* -------------------------------------------- */ _meditationChatData() { - const tplData = Misc.templateData(this); + const tplData = this.system let properties = [ `Thème: ${tplData.theme}`, `Compétence: ${tplData.competence}`, @@ -497,7 +497,7 @@ export class RdDItem extends Item { } /* -------------------------------------------- */ _casetmrChatData() { - const tplData = Misc.templateData(this); + const tplData = this.system let properties = [ `Coordonnée: ${tplData.coord}`, `Spécificité: ${tplData.specific}` @@ -506,7 +506,7 @@ export class RdDItem extends Item { } /* -------------------------------------------- */ _maladieChatData() { - const tplData = Misc.templateData(this); + const tplData = this.system let properties if (tplData.identifie) { properties = [ @@ -531,7 +531,7 @@ export class RdDItem extends Item { /* -------------------------------------------- */ _gemmeChatData() { - const tplData = Misc.templateData(this); + const tplData = this.system let properties = [ `Pureté: ${tplData.purete}`, `Taille: ${tplData.taille}`, diff --git a/module/misc.js b/module/misc.js index c2a2aefe..7ef94dd6 100644 --- a/module/misc.js +++ b/module/misc.js @@ -106,17 +106,6 @@ export class Misc { } - static data(it) { - /*if (it instanceof Actor || it instanceof Item || it instanceof Combatant) { - return it.data; - }*/ - return it; - } - - static templateData(it) { - return Misc.data(it)?.data ?? {} - } - static getEntityTypeLabel(entity) { const documentName = entity?.documentName const type = entity?.type diff --git a/module/rdd-combat.js b/module/rdd-combat.js index fd958570..a64a9f1c 100644 --- a/module/rdd-combat.js +++ b/module/rdd-combat.js @@ -89,23 +89,23 @@ export class RdDCombatManager extends Combat { let rollFormula = formula; // Init per default if (!rollFormula) { let armeCombat, competence; - if (combatant.actor.data.type == 'creature' || combatant.actor.data.type == 'entite') { - for (const competenceItemData of combatant.actor.data.items) { - if (competenceItemData.data.data.iscombat) { + if (combatant.actor.system.type == 'creature' || combatant.actor.system.type == 'entite') { + for (const competenceItemData of combatant.actor.items) { + if (competenceItemData.system.iscombat) { competence = duplicate(competenceItemData); } } - rollFormula = "2+( (" + RdDCombatManager.calculInitiative(competence.data.niveau, competence.data.carac_value) + ")/100)"; + rollFormula = "2+( (" + RdDCombatManager.calculInitiative(competence.system.niveau, competence.system.carac_value) + ")/100)"; } else { for (const itemData of combatant.actor.data.items) { if (itemData.type == "arme" && itemData.data.equipe) { armeCombat = duplicate(itemData); } } - let compName = (armeCombat == undefined) ? "Corps à corps" : armeCombat.data.competence; - competence = RdDItemCompetence.findCompetence(combatant.actor.data.items, compName); - let bonusEcaille = (armeCombat && armeCombat.data.magique) ? armeCombat.data.ecaille_efficacite : 0; - rollFormula = "2+( (" + RdDCombatManager.calculInitiative(competence.data.niveau, Misc.data(combatant.actor).data.carac[competence.data.defaut_carac].value, bonusEcaille) + ")/100)"; + let compName = (armeCombat == undefined) ? "Corps à corps" : armeCombat.system.competence; + competence = RdDItemCompetence.findCompetence(combatant.actor.items, compName); + let bonusEcaille = (armeCombat && armeCombat.data.magique) ? armeCombat.system.ecaille_efficacite : 0; + rollFormula = "2+( (" + RdDCombatManager.calculInitiative(competence.system.niveau, combatant.actor.system.carac[competence.system.defaut_carac].value, bonusEcaille) + ")/100)"; } } //console.log("Combatat", c); @@ -155,37 +155,37 @@ export class RdDCombatManager extends Combat { // Gestion des armes 1/2 mains let armesEquipe = []; for (const arme of armes) { - let armeData = duplicate(arme.system) - if (armeData.equipe) { - let compData = competences.find(c => c.name.toLowerCase() == armeData.competence.toLowerCase()) - console.log("ARME", arme, compData, armeData.competence, competences) + let armeData = duplicate(arme) + if (armeData.system.equipe) { + let compData = competences.find(c => c.name.toLowerCase() == armeData.system.competence.toLowerCase()) + console.log("ARME", arme, compData, armeData.system.competence, competences) armesEquipe.push(armeData) - armeData.dommagesReels = Number(armeData.dommages) - armeData.niveau = compData.system.niveau - armeData.initiative = RdDCombatManager.calculInitiative(compData.system.niveau, carac[compData.system.defaut_carac].value); + armeData.system.dommagesReels = Number(armeData.system.dommages) + armeData.system.niveau = compData.system.niveau + armeData.system.initiative = RdDCombatManager.calculInitiative(compData.system.niveau, carac[compData.system.defaut_carac].value); // Dupliquer les armes pouvant être à 1 main et 2 mains en patchant la compétence - if (armeData.unemain && !armeData.deuxmains) { - armeData.mainInfo = "(1m)"; - } else if (!armeData.unemain && armeData.deuxmains) { - armeData.mainInfo = "(2m)"; - } else if (armeData.unemain && armeData.deuxmains) { - armeData.mainInfo = "(1m)"; + if (armeData.system.unemain && !armeData.system.deuxmains) { + armeData.system.mainInfo = "(1m)"; + } else if (!armeData.system.unemain && armeData.system.deuxmains) { + armeData.system.mainInfo = "(2m)"; + } else if (armeData.system.unemain && armeData.system.deuxmains) { + armeData.system.mainInfo = "(1m)"; - const comp2m = armeData.competence.replace(" 1 main", " 2 mains"); // Replace ! + const comp2m = armeData.system.competence.replace(" 1 main", " 2 mains"); // Replace ! const comp = competences.find(c => c.name == comp2m) const arme2main = duplicate(armeData) - arme2main.mainInfo = "(2m)"; - arme2main.niveau = comp.data.niveau; - arme2main.competence = comp2m; - arme2main.initiative = RdDCombatManager.calculInitiative(arme2main.niveau, carac[comp.system.defaut_carac].value) + arme2main.system.mainInfo = "(2m)"; + arme2main.system.niveau = comp.system.niveau; + arme2main.system.competence = comp2m; + arme2main.system.initiative = RdDCombatManager.calculInitiative(arme2main.niveau, carac[comp.system.defaut_carac].value) armesEquipe.push(arme2main); - const containsSlash = armeData.dommages.includes("/"); + const containsSlash = armeData.system.dommages.includes("/"); if (containsSlash) { - const tableauDegats = armeData.dommages.split("/"); - armeData.dommagesReels = Number(tableauDegats[0]); - arme2main.dommagesReels = Number(tableauDegats[1]); + const tableauDegats = armeData.system.dommages.split("/"); + armeData.system.dommagesReels = Number(tableauDegats[0]); + arme2main.system.dommagesReels = Number(tableauDegats[1]); } else{ ui.notifications.info("Les dommages de l'arme à 1/2 mains " + armeData.name + " ne sont pas corrects (ie sous la forme X/Y)"); @@ -193,7 +193,7 @@ export class RdDCombatManager extends Combat { } } } - return armesEquipe.sort(Misc.ascending(armeData => armeData.name + (armeData.mainInfo ?? ''))) + return armesEquipe.sort(Misc.ascending(armeData => armeData.name + (armeData.system.mainInfo ?? ''))) } /* -------------------------------------------- */ @@ -202,7 +202,7 @@ export class RdDCombatManager extends Combat { ui.notifications.warn(`Le combatant ${combatant.name} n'est pas associé à un acteur, impossible de déterminer ses actions de combat!`) return []; } - const actorData = Misc.data(combatant.actor); + const actorData = combatant.actor let items = combatant.actor.items let actions = [] if (combatant.actor.isCreature()) { @@ -307,20 +307,20 @@ export class RdDCombatManager extends Combat { initOffset = 9; initInfo = "Draconic" } else { - compData = Misc.data(RdDItemCompetence.findCompetence(combatant.actor.data.items, arme.data.competence)); - compNiveau = compData.data.niveau; + compData = RdDItemCompetence.findCompetence(combatant.actor.items, arme.system.competence); + compNiveau = compData.system.niveau; initInfo = arme.name + " / " + arme.data.competence; - if (combatant.actor.data.type == 'creature' || combatant.actor.data.type == 'entite') { - caracForInit = compData.data.carac_value; - if (compData.data.categorie == "lancer") { + if (combatant.actor.type == 'creature' || combatant.actor.type == 'entite') { + caracForInit = compData.system.carac_value; + if (compData.system.categorie == "lancer") { initOffset = 7; } else { initOffset = 5; } } else { - caracForInit = Misc.data(combatant.actor).data.carac[compData.data.defaut_carac].value; - initOffset = RdDCombatManager._baseInitOffset(compData.data.categorie, arme); + caracForInit = combatant.actor.system.carac[compData.system.defaut_carac].value; + initOffset = RdDCombatManager._baseInitOffset(compData.system.categorie, arme); } } let malus = combatant.actor.getEtatGeneral(); // Prise en compte état général @@ -725,7 +725,7 @@ export class RdDCombat { else { // sans armes: à mains nues const niveau = competence.data.niveau; - const init = RdDCombatManager.calculInitiative(niveau, Misc.templateData(this.attacker).carac['melee'].value); + const init = RdDCombatManager.calculInitiative(niveau, this.attacker.system.carac['melee'].value); rollData.arme = RdDItemArme.mainsNues({ niveau: niveau, initiative: init }); } return rollData; @@ -804,16 +804,16 @@ export class RdDCombat { } // # utilisation esquive - const corpsACorps = Misc.data(this.defender.getCompetence("Corps à corps", { onMessage: it => console.info(it, this.defender) })); - const esquives = duplicate(this.defender.getCompetences("esquive", { onMessage: it => console.info(it, this.defender) }).map(c => Misc.data(c))); + const corpsACorps = this.defender.getCompetence("Corps à corps", { onMessage: it => console.info(it, this.defender) }); + const esquives = duplicate(this.defender.getCompetences("esquive", { onMessage: it => console.info(it, this.defender) })) esquives.forEach(e => e.usages = e?.id ? this.defender.getItemUse(e.id) : 0); const paramChatDefense = { passeArme: attackerRoll.passeArme, essais: attackerRoll.essais, isPossession: this.isPossession(attackerRoll), - defender: Misc.data(this.defender), - attacker: Misc.data(this.attacker), + defender: this.defender, + attacker: this.attacker, attackerId: this.attackerId, esquives: esquives, defenderTokenId: this.defenderTokenId, @@ -867,7 +867,6 @@ export class RdDCombat { _filterArmesParade(defender, competence) { let items = defender.data.items; items = items.filter(it => RdDItemArme.isArmeUtilisable(it) || RdDItemCompetenceCreature.isCompetenceParade(it)) - .map(Misc.data); for (let item of items) { item.data.nbUsage = defender.getItemUse(item._id); // Ajout du # d'utilisation ce round } @@ -890,7 +889,7 @@ export class RdDCombat { whisper: ChatUtility.getWhisperRecipientsAndGMs(this.attacker.name), content: await renderTemplate('systems/foundryvtt-reve-de-dragon/templates/chat-demande-attaque-etotal.html', { attackerId: this.attackerId, - attacker: Misc.data(this.attacker), + attacker: this.attacker, defenderTokenId: this.defenderTokenId, essais: attackerRoll.essais }) @@ -934,7 +933,7 @@ export class RdDCombat { async parade(attackerRoll, armeParadeId) { const arme = this.defender.getArmeParade(armeParadeId); console.log("RdDCombat.parade >>>", attackerRoll, armeParadeId, arme); - const competence = Misc.templateData(arme)?.competence; + const competence = this.system?.competence; if (competence == undefined) { console.error("Pas de compétence de parade associée à ", arme) ; @@ -969,12 +968,12 @@ export class RdDCombat { passeArme: attackerRoll.passeArme, diffLibre: attackerRoll.diffLibre, attackerRoll: attackerRoll, - competence: Misc.data(this.defender.getCompetence(competenceParade)), + competence: this.defender.getCompetence(competenceParade), arme: armeParade, surprise: this.defender.getSurprise(true), needParadeSignificative: ReglesOptionelles.isUsing('categorieParade') && RdDItemArme.needParadeSignificative(attackerRoll.arme, armeParade), needResist: RdDItemArme.needArmeResist(attackerRoll.arme, armeParade), - carac: Misc.templateData(this.defender).carac, + carac: this.defender.system.carac, show: {} }; @@ -1018,7 +1017,7 @@ export class RdDCombat { /* -------------------------------------------- */ async esquive(attackerRoll, compId, compName) { - const esquive = Misc.data(this.defender.getCompetence(compId) ?? this.defender.getCompetence(compName)); + const esquive = this.defender.getCompetence(compId) ?? this.defender.getCompetence(compName) if (esquive == undefined) { ui.notifications.error(this.defender.name + " n'a pas de compétence " + compName); return; @@ -1052,7 +1051,7 @@ export class RdDCombat { competence: competence, surprise: this.defender.getSurprise(true), surpriseDefenseur: this.defender.getSurprise(true), - carac: Misc.templateData(this.defender).carac, + carac: this.defender.system.carac, show: {} }; @@ -1227,7 +1226,7 @@ export class RdDCombat { return true; } - let rolled = await RdDResolutionTable.roll(this.attacker.getReveActuel(), - Number(Misc.templateData(this.defender).carac.niveau.value)); + let rolled = await RdDResolutionTable.roll(this.attacker.getReveActuel(), - Number(this.defender.system.carac.niveau.value)); let message = { content: "Jet de points actuels de rêve à " + rolled.finalLevel + RdDResolutionTable.explain(rolled) + "
", diff --git a/module/rdd-commands.js b/module/rdd-commands.js index 8793f306..a76a73bb 100644 --- a/module/rdd-commands.js +++ b/module/rdd-commands.js @@ -354,7 +354,7 @@ export class RdDCommands { async supprimerSignesDraconiquesEphemeres() { game.actors.forEach(actor => { - const ephemeres = actor.filterItems(item => Misc.data(item).type = 'signedraconique' && Misc.data(item).data.ephemere) + const ephemeres = actor.filterItems(item => item.type = 'signedraconique' && item.system.ephemere) .map(item => item.id); if (ephemeres.length > 0) { actor.deleteEmbeddedDocuments("Item", ephemeres); diff --git a/module/rdd-herbes.js b/module/rdd-herbes.js index 4736f90b..38c490d3 100644 --- a/module/rdd-herbes.js +++ b/module/rdd-herbes.js @@ -25,7 +25,7 @@ export class RdDHerbes extends Item { static buildHerbesList(listHerbes, max) { let list = {} for ( let herbe of listHerbes) { - let herbeData = Misc.templateData(herbe); + let herbeData = herbe.system let brins = max - herbeData.niveau; list[herbe.data.name] = `${herbe.data.name} (Bonus: ${herbeData.niveau}, Brins: ${brins})`; } @@ -65,7 +65,7 @@ export class RdDHerbes extends Item { if ( Number(formData.data.herbebrins) ) { let herbe = herbesList.find(item => item.name.toLowerCase() == formData.data.herbe.toLowerCase() ); if( herbe ) { - let herbeData = Misc.templateData(herbe); + let herbeData = herbe.system; let brinsBase = max - herbeData.niveau; //console.log(herbeData, brinsBase, formData.data.herbebrins); formData.data.herbebonus = Math.max(herbeData.niveau - Math.max(brinsBase - formData.data.herbebrins, 0), 0); diff --git a/module/rdd-sheet-utility.js b/module/rdd-sheet-utility.js index 22555a7f..13b2b166 100644 --- a/module/rdd-sheet-utility.js +++ b/module/rdd-sheet-utility.js @@ -21,7 +21,10 @@ export class RdDSheetUtility { } static prepareItemDropParameters(destItemId, actorId, dragData, objetVersConteneur) { - const itemId = dragData.id || dragData.data._id + console.log("ID", dragData) + const item = fromUuidSync(dragData.uuid) + let itemId = item.id + //const itemId = dragData.id || dragData.data._id return { destId: destItemId, targetActorId: actorId, @@ -42,11 +45,11 @@ export class RdDSheetUtility { } static async _onSplitItem(item, split, actor) { - if (split >= 1 && split < Misc.data(item).data.quantite) { + if (split >= 1 && split < item.system.quantite) { await item.diminuerQuantite(split); - const itemData = duplicate(Misc.data(item)); + const itemData = duplicate(item); // todo: ajouter dans le même conteneur? - itemData.data.quantite = split; + itemData.system.quantite = split; await actor.createEmbeddedDocuments('Item', [itemData]) } } diff --git a/module/rdd-token-hud.js b/module/rdd-token-hud.js index a754512f..ea5e616a 100644 --- a/module/rdd-token-hud.js +++ b/module/rdd-token-hud.js @@ -22,7 +22,7 @@ export class RdDTokenHud { let token = canvas.tokens.get(tokenId); let actor = token.actor; - let combatant = game.combat.combatants.find(c => Misc.data(c).tokenId == tokenId); + let combatant = game.combat.combatants.find(c => c.tokenId == tokenId); app.hasExtension = true; let armesList = RdDCombatManager.buildListeActionsCombat(combatant); diff --git a/module/rdd-utility.js b/module/rdd-utility.js index 8309d9f8..8e321ad6 100644 --- a/module/rdd-utility.js +++ b/module/rdd-utility.js @@ -437,7 +437,7 @@ export class RdDUtility { /* -------------------------------------------- */ static calculEncContenu(conteneur, objets) { const contenuDatas = (conteneur.system.contenu ?? []).filter(id => id != undefined) - .map(id => Misc.data(objets.find(it => (id == it._id)))) + .map(id => objets.find(it => (id == it._id))) .filter(it => it); let enc = Number(conteneur.system.encombrement ?? 0) * Number(conteneur.system.quantite ?? 1); for (let itemData of contenuDatas) { @@ -873,7 +873,7 @@ export class RdDUtility { label: "Annuler" } } - const docData = Misc.data(objet); + const docData = objet if (docData.type == 'conteneur' && docData.data.contenu.length > 0) { msgTxt += "
Ce conteneur n'est pas vide. Choisissez l'option de suppression"; buttons['deleteall'] = { diff --git a/module/rolldata-ajustements.js b/module/rolldata-ajustements.js index 783d9424..1743a47a 100644 --- a/module/rolldata-ajustements.js +++ b/module/rolldata-ajustements.js @@ -19,9 +19,9 @@ import { ReglesOptionelles } from "./regles-optionelles.js"; */ export const referenceAjustements = { competence: { - isUsed: (rollData, actor) => Misc.data(rollData.competence), - getLabel: (rollData, actor) => Misc.data(rollData.competence)?.name, - getValue: (rollData, actor) => Misc.data(rollData.competence)?.system?.niveau, + isUsed: (rollData, actor) => rollData.competence, + getLabel: (rollData, actor) => rollData.competence?.name, + getValue: (rollData, actor) => rollData.competence?.system?.niveau, }, meditation: { isUsed: (rollData, actor) => rollData.meditation, @@ -33,7 +33,7 @@ export const referenceAjustements = { getLabel: (rollData, actor) => rollData.selectedSort?.name ?? rollData.attackerRoll ? 'Imposée' : 'Libre', getValue: (rollData, actor) => rollData.selectedSort ? RdDItemSort.getDifficulte(rollData.selectedSort, rollData.diffLibre) - : rollData.diffLibre ?? Misc.data(rollData.competence)?.data.default_diffLibre ?? 0 + : rollData.diffLibre ?? rollData.competence?.data.default_diffLibre ?? 0 }, diffConditions: { isUsed: (rollData, actor) => rollData.diffConditions != undefined, @@ -95,10 +95,10 @@ export const referenceAjustements = { getDescr: (rollData, actor) => rollData.diviseurSignificative > 1 ? `Facteur significative ×${Misc.getFractionHtml(rollData.diviseurSignificative)}` : '' }, isEcaille: { - isVisible: (rollData, actor) => Misc.data(rollData.arme)?.system.magique && Number(Misc.data(rollData.arme)?.system.ecaille_efficacite) > 0, - isUsed: (rollData, actor) => Misc.data(rollData.arme)?.system.magique && Number(Misc.data(rollData.arme)?.system.ecaille_efficacite) > 0, + isVisible: (rollData, actor) => rollData.arme?.system.magique && Number(rollData.arme?.system.ecaille_efficacite) > 0, + isUsed: (rollData, actor) => rollData.arme?.system.magique && Number(rollData.arme?.system.ecaille_efficacite) > 0, getLabel: (rollData, actor) => "Ecaille d'Efficacité: ", - getValue: (rollData, actor) => Math.max(Number(Misc.data(rollData.arme)?.system.ecaille_efficacite), 0), + getValue: (rollData, actor) => Math.max(Number(rollData.arme?.system.ecaille_efficacite), 0), }, finesse: { isUsed: (rollData, actor) => RdDBonus.isDefenseAttaqueFinesse(rollData), diff --git a/module/tmr-rencontres.js b/module/tmr-rencontres.js index af2621ed..53a954d5 100644 --- a/module/tmr-rencontres.js +++ b/module/tmr-rencontres.js @@ -422,7 +422,7 @@ export class TMRRencontres { /* -------------------------------------------- */ static async msgEchecPasseurFou(tmrData) { - tmrData.sortReserve = Misc.templateData(tmrData.actor).reve.reserve.list[0]; + tmrData.sortReserve = tmrData.actor.system.reve.reserve.list[0]; if (tmrData.sortReserve) { // Passeur fou positionne sur la case d'un ort en réserve // TODO : Choisir le sort le plus loin ou au hasard tmrData.newTMR = TMRUtility.getTMR(tmrData.sortReserve.coord); @@ -465,7 +465,7 @@ export class TMRRencontres { /* -------------------------------------------- */ static async _toubillonner(tmrDialog, actor, cases) { - let coord = Misc.templateData(actor).reve.tmrpos.coord; + let coord = actor.system.reve.tmrpos.coord; for (let i = 0; i < cases; i++) { coord = await TMRUtility.deplaceTMRAleatoire(actor, coord).coord; } diff --git a/module/tmr/urgence-draconique.js b/module/tmr/urgence-draconique.js index 8972ff36..a7aa8080 100644 --- a/module/tmr/urgence-draconique.js +++ b/module/tmr/urgence-draconique.js @@ -16,7 +16,7 @@ export class UrgenceDraconique extends Draconique { match(item) { return Draconique.isQueueDragon(item) && Grammar.toLowerCaseNoAccent(item.name).includes('urgence draconique'); } manualMessage() { return false } async onActorCreateOwned(actor, queue) { - const coordSortsReserve = (Misc.templateData(actor).reve.reserve?.list.map(it => it.coord)) ?? []; + const coordSortsReserve = (actor.system.reve.reserve?.list.map(it => it.coord)) ?? []; if (coordSortsReserve.length == 0) { // La queue se transforme en idée fixe const ideeFixe = await RdDRollTables.getIdeeFixe(); diff --git a/packs/sorts-hypnos.db b/packs/sorts-hypnos.db index 4d9b6764..8134dc52 100644 --- a/packs/sorts-hypnos.db +++ b/packs/sorts-hypnos.db @@ -23,7 +23,7 @@ {"_id":"UQYy9WjsKqqrjLc7","name":"Guerrier Sorde","permission":{"default":0,"jOzRscDxoXZWpGS6":3},"type":"sort","data":{"description":"

@JournalEntry[vid6uJc66QFgHSUr]{Note sur les invocations de créatures}

\n

Le Guerrier Sorde a l’apparence d’un humanoïde entièrement revêtu d’une armure de plaques, visière du heaume toujours baissée, dissimulant son visage. Il est armé d’une épée sorde, d’un bouclier moyen et d’une dague. La seule tâche que l’on puisse lui demander est de faire usage de ses armes. Une fois invoqué, il attaque toute créature que le haut-rêvant lui désigne expressément, et se bat contre elle jusqu’à ce qu’il l’extermine ou reçoive un contre-ordre. On peut alors lui ordonner de commencer un autre combat, à condition que le délai entre deux combats n’excède pas 10 rounds, faute de quoi il considère sa tâche accomplie et se dématérialise. S’il est invoqué alors qu’il n’y a pas de créature à combattre immédiatement, il ne patiente que jusqu’à la fin de l’heure en cours, après quoi il s’estime dérangé pour rien et se dématérialise. Durant le délai, il peut accompagner le haut-rêvant où qu’il aille, mais sans pouvoir s’éloigner de lui de plus de E1 mètres. Sa vitesse est limitée à 12 m/round, il ne court, n’escalade ni ne nage jamais. Il n’obéit qu’au haut-rêvant qui l’a invoqué. Le rituel peut être répété pour invoquer plusieurs Guerriers Sordes dans un même combat. Tous ont les mêmes caractéristiques. La PERCEPTION indiquée tient compte des malus dus au heaume. Les Guerriers Sordes sont normalement affectés par les suggestions et illusions d’Hypnos, avec un JR standard r-8, ainsi que par les sorts individuels de Thananatos.

\n

@JournalEntry[R3q4vUTEfyxYgmGr]{Communication avec les créatures invoquées}

","draconic":"hypnos","duree":"Tâche","JR":"Aucun","cible":"","difficulte":"-8","portée":"","caseTMR":"special","caseTMRspeciale":"Cité Sordide D13","ptreve":"7","isrituel":true},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_hypnos.webp","effects":[]} {"_id":"VG89vfk7KsO01eJv","name":"Secouriste blanc","permission":{"default":0,"jOzRscDxoXZWpGS6":3},"type":"sort","data":{"description":"

@JournalEntry[vid6uJc66QFgHSUr]{Note sur les invocations de créatures}

\n

Le Secouriste blanc ne peut être invoqué que pendant un combat ou au terme de celui-ci. Sa tâche consiste à prendre les blessés en charge, premiers soins et soins complets, ce qu’il fait spontanément. En plein combat, il peut même s’approcher de la mêlée pour tirer en arrière d’éventuels tombés à terre. Quand il a plusieurs blessés à soigner, il commence par le plus proche de lui. Mais l’invocateur peut lui désigner un blessé à soigner en priorité.

\n

Le Secouriste possède son propre matériel de chirurgie, mais il n’a aucun consommable (eau, chiffons) qu’il faut lui fournir.

\n

Pour la résolution des soins, le Secouriste ne joue pas de jet de Chirurgie. À la place, c’est le blessé qui joue des jets de CHANCE, pour déterminer les points de tâche obtenus :

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
Particulière :4 points
Significative :3 points
Normale :2 points
Échec :1 pt
Échec particulier :0 pt
Échec total :0 pt (et sans malus)
\n

Le Secouriste disparaît dès que le combat est terminé ET que tous les blessés ont été soignés.

\n

@JournalEntry[R3q4vUTEfyxYgmGr]{Communication avec les créatures invoquées}

","draconic":"hypnos","duree":"Tâche ou fin HN","JR":"Aucun","cible":"","difficulte":"-8","portée":"","caseTMR":"special","caseTMRspeciale":"Sanctuaire Blanc G4","ptreve":"7","isrituel":true},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_hypnos.webp","effects":[]} {"_id":"WvTkEYb216X0XiJc","name":"Voix d'Hypnos","permission":{"default":0,"jOzRscDxoXZWpGS6":3},"type":"sort","data":{"description":"

Les rituels de lecture d’Hypnos sont d’étonnantes démonstrations d’auto-suggestion. Aidé par un support, le haut-rêvant se persuade qu’il peut voir ou entendre à distance, et il le fait. Couplé à l’ultime forme d’illusion que sont les invocations, il peut pareillement projeter son image ou sa voix à distance. Tous obéissent aux règles usuelles d’application des rituels. Si un rituel de lecture est paramétré sur une personne et que celle-ci est morte ou a changé de rêve, aucun effet ne se produit, mais les points de rêve sont tout de même dépensés.

\n

Le rituel de Voix d’Hypnos permet de détecter le mensonge. Il n’y a pas de véritable ciblage, le rituel opère sur le haut-rêvant directement sans passer par un support. Lors du paramétrage, le haut-rêvant se reporte à une certaine conversation de son choix, datant au maximum de 12 heures. La conversation peut avoir eu plusieurs interlocuteurs, mais Voix d’Hypnos ne fonctionne que sur un seul d’entre eux à la fois.

\n

Pour les détecter tous, il faut recommencer autant de fois le rituel. Puis, le sort étant ciblé sur lui-même, le haut-rêvant se plonge dans un état hypnotique dans lequel il réentend toute la conversation, comme si on repassait la bande. La durée de réécoute est d’un round, quelle qu’ait été la conversation, le temps mental du haut-rêvant devenant élastique. Tant que son interlocuteur dit la vérité, sa voix est mélodieuse ; dès qu’il ment volontairement, elle devient horrible et grinçante. On ne peut ainsi détecter que les mensonges volontaires, pas les mensonges inconscients ou par omission.

","draconic":"hypnos","duree":"1 round","JR":"Aucun","cible":"Soi-même","difficulte":"-4","portée":"","caseTMR":"desert","caseTMRspeciale":"","ptreve":"4","isrituel":true},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_hypnos.webp","effects":[]} -{"_id":"Y4r9kTN2brWC2N0n","name":"Lecture d'aura","type":"sort","img":"systems/foundryvtt-reve-de-dragon/icons/competence_vigilance.webp","data":{"description":"

Les rituels de Lecture d’Aura peuvent indifféremment être accomplis par n’importe laquelle des quatre voies.

\n

Ce rituel permet d’approfondir les informations fournies par Détection d’Aura. Pratiquer Lecture d’Aura quand il n’y a pas d’aura revient à demander une magie impossible et crée immédiatement une déchirure du rêve.

\n

Lecture d’Aura est effectuée en plusieurs étapes, toutes étant de difficulté R-3 et coûtant 3 points de rêve. La première a toujours lieu dans un sanctuaire et ne fait que révéler dans quel(s) autre(s) genre(s) de case(s) le haut-rêvant doit se rendre pour continuer sa lecture. Là, il apprend quel genre de magie a été produit ou à quel type de rêve il a affaire, de même que les cases spécifiques concernées. Enfin dans les cases spécifiques, le haut-rêvant peut apprendre la force du rêve ou de la magie en cours, c’est-à-dire pratiquement la difficulté et le nombre de points de rêve impliqués, information indispensable dans l’optique d’une annulation de magie.

\n

Lecture d’Aura révèle également la couleur de l’aura (fixe ou pulsative) comme Détection d’Aura. Pour les créatures vivantes, on peut donc sauter l’étape de Détection d’Aura et commencer directement par la lecture, puisqu’on est sûr de trouver une aura. Dans les autres cas, il est plus prudent de commencer par la détection si, en l’absence finale d’une aura, on ne veut pas créer de magie impossible. Effectuée sur une créature non soumise à un effet magique ni sous l’emprise d’une entité, Lecture d’Aura indique toujours le Fleuve. Là, dans n’importe quelle case du Fleuve, le haut-rêvant se contente d’apprendre qu’il a affaire à une créature vivante et douée de rêve.

","descriptionmj":"","draconic":"oniros","duree":"Instantanée","JR":"Aucun","cible":"","difficulte":"-3","portée":"","caseTMR":"special","caseTMRspeciale":"Sanctuaire / variable","ptreve":"3","xp":0,"bonuscase":"","isrituel":true,"coutseuil":0,"portee":""},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"Q2G6GTdrotKzYGUC":3},"flags":{}} +{"_id":"Y4r9kTN2brWC2N0n","name":"Lecture d'aura","permission":{"default":0,"Q2G6GTdrotKzYGUC":3},"type":"sort","data":{"description":"

Les rituels de Lecture d’Aura peuvent indifféremment être accomplis par n’importe laquelle des quatre voies.

\n

Ce rituel permet d’approfondir les informations fournies par Détection d’Aura. Pratiquer Lecture d’Aura quand il n’y a pas d’aura revient à demander une magie impossible et crée immédiatement une déchirure du rêve.

\n

Lecture d’Aura est effectuée en plusieurs étapes, toutes étant de difficulté R-3 et coûtant 3 points de rêve. La première a toujours lieu dans un sanctuaire et ne fait que révéler dans quel(s) autre(s) genre(s) de case(s) le haut-rêvant doit se rendre pour continuer sa lecture. Là, il apprend quel genre de magie a été produit ou à quel type de rêve il a affaire, de même que les cases spécifiques concernées. Enfin dans les cases spécifiques, le haut-rêvant peut apprendre la force du rêve ou de la magie en cours, c’est-à-dire pratiquement la difficulté et le nombre de points de rêve impliqués, information indispensable dans l’optique d’une annulation de magie.

\n

Lecture d’Aura révèle également la couleur de l’aura (fixe ou pulsative) comme Détection d’Aura. Pour les créatures vivantes, on peut donc sauter l’étape de Détection d’Aura et commencer directement par la lecture, puisqu’on est sûr de trouver une aura. Dans les autres cas, il est plus prudent de commencer par la détection si, en l’absence finale d’une aura, on ne veut pas créer de magie impossible. Effectuée sur une créature non soumise à un effet magique ni sous l’emprise d’une entité, Lecture d’Aura indique toujours le Fleuve. Là, dans n’importe quelle case du Fleuve, le haut-rêvant se contente d’apprendre qu’il a affaire à une créature vivante et douée de rêve.

","draconic":"oniros","duree":"Instantanée","JR":"Aucun","cible":"","difficulte":"-3","portée":"","caseTMR":"special","caseTMRspeciale":"Sanctuaire / variable","ptreve":"3","xp":0},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_vigilance.webp","effects":[]} {"_id":"YOJsOLpHTQYreZ6i","name":"Soufflet","type":"sort","img":"systems/foundryvtt-reve-de-dragon/icons/competence_hypnos.webp","data":{"description":"

Le Soufflet peut être dirigé contre toute créature, humanoïde ou animale. Son effet, instantané, est celui d’une gifle magistrale, causant ses dommages 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, la protection applicable peut être au maximum de 2 points.

","descriptionmj":"","draconic":"hypnos","duree":"Instantanée","JR":"Humanoïde selon HN, animal r-8","cible":"Toutes créatures","difficulte":"-6","portée":"","caseTMR":"gouffre","caseTMRspeciale":"","ptreve":"1+","xp":0,"bonuscase":"","isrituel":false,"coutseuil":0,"portee":""},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"jOzRscDxoXZWpGS6":3},"flags":{}} {"_id":"aYOfXEuDp6xGDO4N","name":"Égarement","permission":{"default":0,"jOzRscDxoXZWpGS6":3},"type":"sort","data":{"description":"

L’effet d’Égarement ne s’applique qu’aux humanoïdes. L’apport massif de pseudo-souvenirs, informulés et insaisissables, empêche l’humanoïde visé de se concentrer sur son activité intellectuelle, manuelle ou verbale. Il ne fait plus ou ne dit plus que des bêtises, en termes de jeu des échecs totaux. Un intellectuel devient incapable de lire ou d’écrire, un artisan se tape sur les doigts, un musicien rate tous ses accords, un orateur bafouille, etc. L’état d’égarement dure jusqu’à la fin de l’heure en cours + une heure complète, ou se dissipe de lui-même dès qu’il y a stress, par exemple une agression. Ce sort est donc totalement inutile et inefficace en combat.

","draconic":"hypnos","duree":"Une heure","JR":"Selon HN","cible":"Humanoïde","difficulte":"-4","portée":"","caseTMR":"desolation","caseTMRspeciale":"","ptreve":"4"},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_hypnos.webp","effects":[]} {"_id":"cghxHRstw7cXLEm4","name":"Invoquer son image","type":"sort","img":"systems/foundryvtt-reve-de-dragon/icons/competence_hypnos.webp","data":{"description":"

Les rituels de lecture d’Hypnos sont d’étonnantes démonstrations d’auto-suggestion. Aidé par un support, le haut-rêvant se persuade qu’il peut voir ou entendre à distance, et il le fait. Couplé à l’ultime forme d’illusion que sont les invocations, il peut pareillement projeter son image ou sa voix à distance. Tous obéissent aux règles usuelles d’application des rituels. Si un rituel de lecture est paramétré sur une personne et que celle-ci est morte ou a changé de rêve, aucun effet ne se produit, mais les points de rêve sont tout de même dépensés.

\n

Ce rituel est comme le négatif de @Item[Ew5JzQ2lzcpGoF11]{Miroir d'Hypnos}. Les conditions de ciblage et de paramétrage en sont exactement les mêmes. Lorsqu’un mouvement apparaît au centre du miroir, provoquant l’état hypnotique, le haut-rêvant peut commencer à effectuer des gestes, des mimiques, ou montrer ostensiblement un objet qu’il tient sur lui, mais sans pouvoir se déplacer. Dans l’instant même, un hologramme de lui-même, grandeur nature et fidèle jusqu’au moindre geste, prend naissance près de la personne ou au centre du lieu choisi.

\n

Les spectateurs peuvent se déplacer à travers l’hologramme, ce n’est qu’une illusion sans substance. Par ce rituel, le haut-rêvant ne peut communiquer aucun son, et lui-même n’entend ni ne voit rien. Il ne peut pas savoir comment est accueillie sa \"visite\". La communication est de 1 round par point de rêve dépensé.

","descriptionmj":"","draconic":"hypnos","duree":"Selon r dépensé","JR":"Aucun","cible":"Un miroir","difficulte":"-6","portée":"","caseTMR":"sanctuaire","caseTMRspeciale":"","ptreve":"1+","xp":0,"bonuscase":"","isrituel":true,"coutseuil":0,"portee":""},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"jOzRscDxoXZWpGS6":3},"flags":{}} @@ -39,7 +39,7 @@ {"_id":"qqcLydulFkL25Ipc","name":"Conjurer l'oubli","permission":{"default":0,"jOzRscDxoXZWpGS6":3},"type":"sort","data":{"description":"

Ce rituel permet de faire renaître chez la cible un souvenir oublié, la cause de l’oubli pouvant être magique ou naturelle. Le souvenir oublié peut appartenir à une précédente incarnation si le gardien des rêves l’estime possible ou pertinent. Dans tous les cas, le souvenir ne peut revenir que sous la forme d’une réponse à une question précise. Et l’accomplissement du rituel ne permet qu’une seule question-réponse.

","draconic":"hypnos","duree":"Une question","JR":"Aucun","cible":"Humanoïde","difficulte":"-4","portée":"","caseTMR":"lac","caseTMRspeciale":"","ptreve":"4","isrituel":true},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_hypnos.webp","effects":[]} {"_id":"rrSE9c7KKsqcKueo","name":"Nonechalepasse","permission":{"default":0,"jOzRscDxoXZWpGS6":3},"type":"sort","data":{"description":"

@JournalEntry[vid6uJc66QFgHSUr]{Note sur les invocations de créatures}

\n

Le Nonechalepasse a la même apparence physique et le même armement que le Guerrier Sorde. C’est en fait une variante de ce dernier. Il est invoqué pour garder ou veiller sur quelque chose : une porte, un coffre, un pont, etc. L’ayant invoqué, le haut-rêvant doit lui indiquer expressément sur quoi il doit veiller, et le Nonechalepasse ne laissera personne d’autre que l’invocateur franchir la limite indiquée, c’est-à-dire pas même ses compagnons. La garde peut avoir lieu en la présence du haut-rêvant, ou en son absence s’il désire vaquer à d’autres affaires, et dure jusqu’à la fin de son heure de naissance. Dès qu’une créature est en voie d’enfreindre la consigne donnée, le Nonechalepasse l’en prévient en clamant son propre nom à plusieurs reprises ; et si la créature insiste, il la combat jusqu’à ce qu’il l’extermine ou qu’elle recule et s’enfuie. Les Nonechalepasses ont tous les mêmes caractéristiques que les Guerriers Sordes et sont comme eux affectés par les sorts.

\n

@JournalEntry[R3q4vUTEfyxYgmGr]{Communication avec les créatures invoquées}

","draconic":"hypnos","duree":"Tâche","JR":"Aucun","cible":"","difficulte":"-8","portée":"","caseTMR":"special","caseTMRspeciale":"Cité Jalouse M1","ptreve":"7","isrituel":true},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_hypnos.webp","effects":[]} {"_id":"sVA94h9Reimmfw5B","name":"Suggestion","type":"sort","img":"systems/foundryvtt-reve-de-dragon/icons/competence_hypnos.webp","data":{"description":"

L’effet de Suggestion ne s’applique qu’aux humanoïdes. Comme l’indique le titre, c’est la suggestion à l’état pur. Il permet de donner un ordre bref à la victime, et cette dernière ne pourra pas s’empêcher d’y obéir machinalement. Il est impératif que la victime puisse obéir à l’ordre de façon immédiate, dans la seconde qui suit l’ordre, et que l’action soit uniquement physique, ni mentale ni réfléchie. Si la Suggestion est telle qu’elle oblige la victime à une autre action préalable ou si l’action demandée ne peut être qu’une action réfléchie, pensée, la Suggestion avorte automatiquement.

\n

Un passant a sa bourse accrochée à la ceinture. On lui donne l’ordre de suggestion : \"donne ta bourse !\" L’effet avorte automatiquement. En effet, le passant doit d’abord en dénouer les cordons, action préalable, et qui plus est réfléchie. Si le passant avait déjà sa bourse à la main, l’ordre : \"donne ta bourse !\" ou \"donne\"! tout court, pouvant être obéi de façon immédiate, aurait été accepté.

\n

Des ordres tels que \"réponds à la question \" ou \" dis la vérité\" sont pareillement inacceptables (actions mentales). Si la victime est au bord d’un gouffre, et qu’on lui suggère : \" saute dans le gouffre !\", elle saute. Si elle est à trois mètres du gouffre, la suggestion avorte. Il faut d’abord qu’elle y coure. Des ordres tels que : \"Fuis, saute, plonge, assieds-toi, agenouille-toi, lève les bras, ferme les yeux, hurle, donne (ce que la victime a déjà en main), mange ou bois (ce que la victime a déjà à portée de ses lèvres), lâche (ce qu’elle tient en main), etc.\" sont possibles. Des ordres tels que : \"endors-toi, suicide-toi, va faire ceci, déshabille-toi (actions multiples), écris ceci, avoue, lance tel sort, etc.\" sont impossibles.

\n

L’ordre donné dans la suggestion doit être unique, c’est-à-dire pratiquement ne comporter qu’un seul verbe. \"Cours et saute !\" est impossible. Quand l’action implique une durée, elle est obéie pendant un round. Si par exemple l’ordre donné est \"cours !\" ou \"fuis !\", la victime courra, fuira, pendant un round. À ce moment, toutefois, l’ordre pourra être donné une seconde fois, et la victime obéira pour la durée d’un nouveau round.

\n

L’ordre contenu dans la suggestion doit être paramétré lors du lancer. Mais le ciblage de la victime ne le déclenche pas aussitôt. La victime étant maintenant sous l’effet du sort, il faut que l’ordre soit donné réellement, verbalement. La victime doit pouvoir l’entendre et le comprendre (parler la même langue). Peu importe qui donne l’ordre verbal, le haut-rêvant ou quelqu’un d’autre. Chaque 3r dépensés permet verbalement de réitérer l’ordre une fois. Si par exemple 9 points de rêve ont été dépensés, l’ordre \"cours !\" pourra être donné trois fois. Il n’y a aucune limite de temps entre le ciblage et le moment où le premier ordre est donné verbalement, ni non plus entre chaque ordre. Tant que le dernier ordre n’a pas été donné, la victime est sous l’influence du sort, influence qui peut être détectée et lue par Lecture d’Aura. Le libellé de l’ordre est également révélé dans la case spécifique par Lecture d’Aura, et le sort peut être annulé dans cette même case. Dès que le dernier ordre est donné, l’effet se dissipe totalement.

","descriptionmj":"","draconic":"hypnos","duree":"Spéciale","JR":"Selon HN","cible":"Humanoïde","difficulte":"-9","portée":"","caseTMR":"desert","caseTMRspeciale":"","ptreve":"3+","xp":0,"bonuscase":"","isrituel":false,"coutseuil":0,"portee":""},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"jOzRscDxoXZWpGS6":3},"flags":{}} -{"_id":"xOicgRMCUxJNmVzF","name":"Détection d'aura","type":"sort","img":"systems/foundryvtt-reve-de-dragon/icons/competence_vigilance.webp","data":{"description":"

Les rituels de Détection d’Aura peuvent indifféremment être accomplis par n’importe laquelle des quatre voies.

\n

Toutes les créatures vivantes animées (humains, humanoïdes, animaux) ont une caractéristique RÊVE. Les objets enchantés possèdent des points de rêve, de même que les produits de magie naturelle, comme certaines pierres de chance. Les entités de cauchemar, incarnées ou non, en ont également. Quelle qu’elle soit, la présence de rêve émet une aura, laquelle est détectable par Détection d’Aura. Parallèlement, toute cible d’un sort ou d’un rituel, émet une aura propre, quand bien même ladite cible ne possède pas de points de rêve (centre de zone, objet ou plante soumis à une illusion d’Hypnos). Cette aura est également détectable par Détection d’Aura.

\n

L’aura de présence de rêve se traduit par un halo bleuté constant ; l’aura résultant d’un effet magique par un halo parcouru de pulsations. Quand les deux auras sont présentes conjointement, le halo est pulsatif et d’un bleu plus foncé. On peut toujours effectuer Détection d’Aura sans aucun risque, il y a toujours une réponse. Soit une aura est perçue, constante ou pulsative, et l’on peut tenter une Lecture d’Aura pour en savoir plus ; soit aucune aura n’est perçue et il s’agit de matière inerte, sans rêve, non soumise à un sort.

","descriptionmj":"","draconic":"oniros","duree":"Instantanée","JR":"Aucun","cible":"","difficulte":"-3","portée":"","caseTMR":"sanctuaire","caseTMRspeciale":"","ptreve":"1","xp":0,"bonuscase":"","isrituel":true,"coutseuil":0,"portee":""},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"Q2G6GTdrotKzYGUC":3},"flags":{}} +{"_id":"xOicgRMCUxJNmVzF","name":"Détection d'aura","permission":{"default":0,"Q2G6GTdrotKzYGUC":3},"type":"sort","data":{"description":"

Les rituels de Détection d’Aura peuvent indifféremment être accomplis par n’importe laquelle des quatre voies.

\n

Toutes les créatures vivantes animées (humains, humanoïdes, animaux) ont une caractéristique RÊVE. Les objets enchantés possèdent des points de rêve, de même que les produits de magie naturelle, comme certaines pierres de chance. Les entités de cauchemar, incarnées ou non, en ont également. Quelle qu’elle soit, la présence de rêve émet une aura, laquelle est détectable par Détection d’Aura. Parallèlement, toute cible d’un sort ou d’un rituel, émet une aura propre, quand bien même ladite cible ne possède pas de points de rêve (centre de zone, objet ou plante soumis à une illusion d’Hypnos). Cette aura est également détectable par Détection d’Aura.

\n

L’aura de présence de rêve se traduit par un halo bleuté constant ; l’aura résultant d’un effet magique par un halo parcouru de pulsations. Quand les deux auras sont présentes conjointement, le halo est pulsatif et d’un bleu plus foncé. On peut toujours effectuer Détection d’Aura sans aucun risque, il y a toujours une réponse. Soit une aura est perçue, constante ou pulsative, et l’on peut tenter une Lecture d’Aura pour en savoir plus ; soit aucune aura n’est perçue et il s’agit de matière inerte, sans rêve, non soumise à un sort.

","draconic":"oniros","duree":"Instantanée","JR":"Aucun","cible":"","difficulte":"-3","portée":"","caseTMR":"sanctuaire","caseTMRspeciale":"","ptreve":"1","xp":0},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_vigilance.webp","effects":[]} {"_id":"yNMa8DlBaZyTGFSr","name":"Oubli","type":"sort","img":"systems/foundryvtt-reve-de-dragon/icons/competence_hypnos.webp","data":{"description":"

L’effet d’Oubli ne s’applique qu’aux humanoïdes. C’est une des plus puissantes suggestions hypnotiques. L’effet d’amnésie ne survient pas aussitôt le sort ciblé, mais intervient à la fin de l’heure en cours. À ce moment la victime perd tout souvenir de ce qu’elle a vécu, de ce qu’elle a pu dire ou faire, entre le moment présent et celui où le sort a été ciblé. Pratiquement, cette période est comme un grand trou noir dans sa tête, et aucun moyen normal ne peut lui restituer ses souvenirs. Chaque point de rêve dépensé en plus des 6 de base augmente la durée d’une heure. Soit un haut-rêvant lançant ce sort au cours de l’heure du Dragon et dépensant 8 points : à la fin de l’heure de la Lyre, la victime se retrouve brusquement amnésique de ce qu’elle a pu faire depuis la mi-Dragon jusqu’à maintenant, sans comprendre comment elle est arrivée dans le lieu où elle se trouve actuellement, comme si elle venait de se réveiller d’une période de sommeil noir, encore plus opaque que le gris rêve. Une Lecture d’Aura révèle la présence d’un sort d’Oubli en train d’œuvrer, et Annulation de Magie peut l’annuler selon les règles normales. À défaut, le rituel de Conjurer l’Oubli peut être utilisé, mais ne restitue les souvenirs que sélectivement, en réponse à une question précise. Quand c’est un personnage de joueur qui lance ce sort sur un PNJ, sa mise en œuvre est sans problème. L’inverse est plus délicat. Le mieux est alors de faire sortir de la salle le joueur du personnage victime, et de le faire rentrer au moment où l’amnésie opère. De cette façon, il ne se souvient effectivement de rien. Entre temps, si besoin est par rapport aux autres joueurs, jouer ce personnage comme un PNJ.

","descriptionmj":"","draconic":"hypnos","duree":"Selo n r dépensé","JR":"Selon HN","cible":"Humanoïde","difficulte":"-8","portée":"","caseTMR":"fleuve","caseTMRspeciale":"","ptreve":"6+","xp":0,"bonuscase":"","isrituel":false,"coutseuil":0,"portee":""},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"jOzRscDxoXZWpGS6":3},"flags":{}} {"_id":"yhw8f7HKrmfzAxmj","name":"Sérénité","type":"sort","img":"systems/foundryvtt-reve-de-dragon/icons/competence_hypnos.webp","data":{"description":"

L’effet de sérénité ne s’applique qu’aux humanoïdes. La suggestion d’une intense satisfaction est source d’une sérénité réelle. Pour chaque 3r dépensés, le personnage visé regagne 1 point de moral jusqu’à concurrence de zéro. Neuf points de rêve permettent ainsi de remonter un moral de -3 à zéro. Si trop de points sont dépensés, l’excédent est perdu, le moral ne pouvant dépasser zéro par l’influence de ce sort.

","descriptionmj":"","draconic":"hypnos","duree":"Instantanée","JR":"Selon HN","cible":"Humanoïde","difficulte":"-3","portée":"","caseTMR":"collines","caseTMRspeciale":"","ptreve":"3+","xp":0,"bonuscase":"","isrituel":false,"coutseuil":0,"portee":""},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"jOzRscDxoXZWpGS6":3},"flags":{}} {"_id":"ze53LdwhuqUFMvqw","name":"Fou-rire","permission":{"default":0,"jOzRscDxoXZWpGS6":3},"type":"sort","data":{"description":"

L’effet de Fou-Rire ne s’applique qu’aux humanoïdes. La suggestion d’une idée drolatique plonge la cible dans un irrépressible fou-rire, automatique le premier round. Puis pour les rounds suivants, la cible doit réussir un jet de VOLONTÉ/ moins moral à -5, ou continuer à rire. Tant que la cible rit, elle est considérée en demi-surprise.

","draconic":"hypnos","duree":"Instantanée","JR":"Selon HN","cible":"Humanoïde","difficulte":"-5","portée":"","caseTMR":"cite","caseTMRspeciale":"","ptreve":"5"},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_hypnos.webp","effects":[]} diff --git a/packs/sorts-narcos.db b/packs/sorts-narcos.db index 8a7fd4e0..9bf5b2c5 100644 --- a/packs/sorts-narcos.db +++ b/packs/sorts-narcos.db @@ -4,7 +4,7 @@ {"_id":"5NZnTt0mvfPorSHG","name":"Écailles de Protection contre le venin *","permission":{"default":0,"6ibmdmaeRSMTjU4c":3},"type":"sort","data":{"description":"

Chaque écaille de protection confère un bons de +1 au jet de CONSTITUTION contre toutes les sortes de venin et de poison, augmentant ainsi les chances de leur résister.

\n

Une amulette peut avoir n'importe quelle forme, mais ne fonctionne que si elle est en contact avec la peau nue de son possesseur. Si c'est le cas, elle fonctionne spontanément en face du danger pour lequel elle est conçue, même si le possesseur n'a aucune idée de son pouvoir. Pour fonctionner, l'amulette a besoin de points de rêve actifs. Ces points doivent être des points de rêve conférés par le rituel d'Enchantement en plus des points inertes. Autrement dit, voulant fabriquer une amulette, le haut-rêvant ne s'arrête pas d'enchanter quand il atteint un nombre de points de rêve égal à l'inertie totale de l'objet, mais continue à en rajouter. Le nombre maximum de points actifs qu'une amulette puisse posséder est égal à 7 fois l'enchantabilité de sa gemme ; et, comme pour les écailles d'efficacité, le nombre d'écailles de protection qu'elle puisse posséder est égal à l'enchantabilité de celle-ci avec un maximum de 7. Des amulettes plus puissantes ne pourraient être obtenues que par de spécifiques Grandes Écailles de Narcos.

\n

Soit une gemme de taille 6 et de pureté 5, ayant donc une inertie de 2 et une enchantabilité de 4. Elle peut posséder jusqu'à 4 écailles de protection (=enchantabilité) et un maximum de 28 points de rêve actifs (7   x 4 = 28).

\n

Chaque fois qu'une amulette de protection fonctionne, elle dépense un de ses points de rêve actifs quel que soit le nombre d'écailles. Le possesseur, lui, n'en dépense qu'un par heure, quel que soit le nombre de fonctionnements de l'amulette au cours de cette heure. Quand une amulette n'a plus de points actifs, elle cesse de fonctionner. On ne peut lui en redonner que par le rituel de Restauration. Les écailles de protection peuvent être posées progressivement, comme celles d'efficacité, même si l'amulette fonctionne entre temps. Mêmes règles d'application. Une gemme donnée ne peut recevoir que des écailles de protection d'un même type, mais grâce à Individualité, plusieurs gemmes d'une même amulette peuvent offrir des protections différentes. La pose de chaque écaille de protection coûte un point de seuil.

\n

 

","draconic":"narcos","duree":"Instantanée","JR":"Aucun","cible":"","difficulte":"-6","portée":"","caseTMR":"foret","caseTMRspeciale":"","ptreve":"4","portee":"","isrituel":true,"coutseuil":1,"xp":0,"bonuscase":""},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_narcos.webp","effects":[]} {"_id":"74XSU8DqNBXGFn3R","name":"Dragonne Lame","permission":{"default":0,"Q2G6GTdrotKzYGUC":3},"type":"sort","data":{"description":"

Même principe que la@Item[r9onPANmiK5E5Jnw]{Flèche de Feu} et la @Item[8BJ9kn3AWLFDwvez]{Dague de Force}, y compris la détérioration automatique de 1 point de résistance. Une épée dragonne ainsi modifiée a un +dom de +6.

","draconic":"narcos","duree":"HN","JR":"Il n’y a aucun JR pour les objets ordinaires. Les objets magiques (enchantés) résistent automatiquement, le sort se dissipant sans effet, les points de rêve étant néanmoins dépensés","cible":"Une épée Dragonne (exclusivement)","difficulte":"6","portée":"","caseTMR":"desolation","caseTMRspeciale":"","ptreve":"4","xp":0,"isrituel":false,"portee":"","bonuscase":"","coutseuil":0},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_narcos.webp","effects":[]} {"_id":"AIBLH8EduhfUQscn","name":"Écaille d'Efficacité *","permission":{"default":0,"6ibmdmaeRSMTjU4c":3},"type":"sort","data":{"description":"

Les écailles d'efficacité servent à rendre un objet plus efficace, mais uniquement dans sa fonction normale. Une arme magiquement efficace permettra de toucher plus facilement un adversaire ; un bouclier de mieux parer ; un instrument de musique de jouer mieux à moindre effort ; mais un balai magique permettre de mieux balayer et non de voler. Les écailles d'efficacité n'ont de pertinence que sur les objets pouvant être utilisés activement, armes, instruments, outils. Les objets passifs, meubles, contenants, vêtements, armures, ne peuvent pas être rendus plus efficaces.

\n

En terme de jeu, chaque écaille d'efficacité possédée par l'objet confère un bonus de +1 sur la table de Résolution lors de son utilisation. S'il s'agit d'une arme, chaque écaille d'efficacité augmente également de 1 le facteur d'initiative, ainsi que le +dom de l'arme, mais jusqu'au maximum du double normal de ce dernier. Soit une épée dragonne (+dom +3) possédant 5 écailles d'efficacité. Son utilisateur bénéficie d'un bonus de +5 à l'initiative, de +5 à l'attaque et à la parade, mais d'un +dom de +6 seulement (le double du +dom normal) et non pas de +8. Ne pas oublier néanmoins de rajouter le +dom personnel dû à la taille et à la force. Cette règle s'applique également aux armes de jet (dague, javelot, fouet). En ce qui concerne les armes de tir (arbalète, arc et fronde), l'efficacité ne s'applique qu'aux dommages  (toujours pour un maximum du double du +dom normal) et non au toucher. Pour qu'un archer bénéficie d'un bonus d'efficacité au toucher et aux dommages, il doit avoir à la fois un arc magique et une flèche magique.

\n

Le nombre maximum d'écailles d'efficacité pouvant être posées sur un objet est égal à l'enchantabilité de sa gemme, mais avec un maximum de 7 quelle que soit cette dernière. Pour obtenir des armes magiques d'un bonus supérieur à +7, il faut avoir recours à une éventuelle Grande Écaille de Narcos spécifique.

\n

La pose de chaque écaille d'efficacité coûte un point de seuil. Mais il n'y a aucune limite de temps entre la pose de chacune, l'objet pouvant être utilisé dans l'intervalle. Par exemple, on peut se contenter provisoirement d'une épée +1 (une écaille), s'en servir plusieurs fois en combat, et plus tard, rajouter une se conde écaille pour obtenir une épée +2. Toutefois, si entretemps l'objet a été maîtrisé par quelqu'un d'autre, il faut effectuer une Lecture d'Aura complète avant de pouvoir reposer une écaille. Si cette précaution est négligée, on aboutit à un cas de magie impossible. L'utilisation d'un objet magiquement efficace coûte un point de rêve par heure quel que soit le nombre d'écailles.

\n

Si plusieurs gemmes sont alliées à un même objet grâce à Individualité et reçoivent toutes des écailles d'efficacité, leurs bonus ne s'ajoutent pas, on ne considère que le meilleur. Des gemmes différentes sont faites pour des pouvoirs entièrement différents.

","draconic":"narcos","duree":"Instantanée","JR":"Aucun","cible":"","difficulte":"-8","portée":"","caseTMR":"monts","caseTMRspeciale":"","ptreve":"7","portee":"","isrituel":true,"coutseuil":1,"xp":0,"bonuscase":""},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_narcos.webp","effects":[]} -{"_id":"BibuJdKmaQJm3kFw","name":"Annulation de magie","type":"sort","img":"systems/foundryvtt-reve-de-dragon/icons/competence_vigilance.webp","data":{"description":"

Ce rituel permet d’annuler un effet magique, que celui-ci ait été accompli par soi-même ou par un autre haut-rêvant. On peut annuler l’effet d’un sort, de zone ou individuel, d’un rituel d’enchantement, d’une invocation, etc.

\n

Le haut-rêvant doit se trouver dans la case spécifique des TMR d’où la magie a été accomplie. Le jet de RÊVE qu’il doit réussir a alors la même difficulté que celui ayant permis la magie, avec une dépense de points de rêve pareillement identique.

\n

Pour annuler une invocation, le rituel d’Annulation doit être ciblé sur la créature invoquée. Quand la magie est le résultat conjoint de plusieurs rituels, ce qui est notamment le cas des objets magiques, chacun doit être annulé tour à tour, en commençant toujours par le dernier à avoir été accompli chronologiquement. D’une manière générale, ce sont les mêmes opérations qui doivent être répétées à l’envers. Quand un rituel coûte des points de seuil, son annulation en coûte également (le même nombre). Annulation de Magie sert également à exorciser les entités de cauchemar non incarnées. La difficulté d’un exorcisme est toujours R-7, et le coût en points de rêve égal au RÊVE de l’entité. Le ciblage doit être fait sur la créature possédée.

\n

Avant d’accomplir une Annulation de Magie, les paramètres de la magie à annuler (case des TMR, R-, r) peuvent être découverts au moyen du rituel Lecture d’Aura.

\n

Pour la synthèse d’Annulation de Magie, considérer que ce rituel est de difficulté R-7. Il peut être utilisé indifféremment par Oniros, Hypnos ou Narcos (mais jamais Thanatos), quelle que soit la voie ayant servi à accomplir la magie à annuler.

","descriptionmj":"","draconic":"oniros","duree":"Instantanée","JR":"Aucun","cible":"Effet magique","difficulte":"variable","portée":"","caseTMR":"special","caseTMRspeciale":"variable","ptreve":"variable","xp":0,"bonuscase":"","isrituel":true,"coutseuil":0,"portee":""},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"Q2G6GTdrotKzYGUC":3},"flags":{}} +{"_id":"BibuJdKmaQJm3kFw","name":"Annulation de magie","permission":{"default":0,"Q2G6GTdrotKzYGUC":3},"type":"sort","data":{"description":"

Ce rituel permet d’annuler un effet magique, que celui-ci ait été accompli par soi-même ou par un autre haut-rêvant. On peut annuler l’effet d’un sort, de zone ou individuel, d’un rituel d’enchantement, d’une invocation, etc.

\n

Le haut-rêvant doit se trouver dans la case spécifique des TMR d’où la magie a été accomplie. Le jet de RÊVE qu’il doit réussir a alors la même difficulté que celui ayant permis la magie, avec une dépense de points de rêve pareillement identique.

\n

Pour annuler une invocation, le rituel d’Annulation doit être ciblé sur la créature invoquée. Quand la magie est le résultat conjoint de plusieurs rituels, ce qui est notamment le cas des objets magiques, chacun doit être annulé tour à tour, en commençant toujours par le dernier à avoir été accompli chronologiquement. D’une manière générale, ce sont les mêmes opérations qui doivent être répétées à l’envers. Quand un rituel coûte des points de seuil, son annulation en coûte également (le même nombre). Annulation de Magie sert également à exorciser les entités de cauchemar non incarnées. La difficulté d’un exorcisme est toujours R-7, et le coût en points de rêve égal au RÊVE de l’entité. Le ciblage doit être fait sur la créature possédée.

\n

Avant d’accomplir une Annulation de Magie, les paramètres de la magie à annuler (case des TMR, R-, r) peuvent être découverts au moyen du rituel Lecture d’Aura.

\n

Pour la synthèse d’Annulation de Magie, considérer que ce rituel est de difficulté R-7. Il peut être utilisé indifféremment par Oniros, Hypnos ou Narcos (mais jamais Thanatos), quelle que soit la voie ayant servi à accomplir la magie à annuler.

","draconic":"oniros","duree":"Instantanée","JR":"Aucun","cible":"Effet magique","difficulte":"variable","portée":"","caseTMR":"special","caseTMRspeciale":"variable","ptreve":"variable","xp":0,"isrituel":true,"bonuscase":"","coutseuil":0},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_vigilance.webp","effects":[]} {"_id":"FpwaK1qJxKGs9HgS","name":"Permanence *","permission":{"default":0,"6ibmdmaeRSMTjU4c":3},"type":"sort","data":{"description":"

C'est par ce rituel que le haut-rêvant stabilise les points de rêve d'une potion ou d'un objet, afin d'en prévenir l'évaporation quotidienne. Facultatif pour les potions, le rituel de Permanence est obligatoire pour tous les autres objets magiques.  Son accomplissement diminue de 1 point le seuil de rêve du haut-rêvant.

","draconic":"narcos","duree":"Instantanée","JR":"","cible":"","difficulte":"-5","portée":"","caseTMR":"sanctuaire","caseTMRspeciale":"","ptreve":"5","portee":"","isrituel":true,"coutseuil":1,"xp":0,"bonuscase":""},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_narcos.webp","effects":[]} {"_id":"KW2VZhuEGJGglGcW","name":"Restauration *","permission":{"default":0,"6ibmdmaeRSMTjU4c":3},"type":"sort","data":{"description":"

Restauration est un rituel secondaire nullement obligatoire. Son seul usage est de redonner des points de rêve actifs à une amulette de protection. Il est en effet impossible d'utiliser le simple Enchantement une fois le rituel de Permanence accompli. Restauration fonctionne de façon semblable à un Enchantement, sauf que son accomplissement coûte chaque fois un point de seuil. On peut  restaurer les points de rêve d'une amulette en plusieurs fois en intercalant un rituel de Purifcation entre chaque rituel de Restauration (qui coûte chaque fois un point de seuil). Il est possible de redonner plus de points de rêve actifs à l'objet qu'il n'en avait au départ, jusqu'à concurrence du maximum possible. Le nombre maximum de points de rêve actifs qu'un objet puisse posséder est égal à 7 fois l'enchantabilité de sa gemme.

","draconic":"narcos","duree":"Instantanée","JR":"Aucun","cible":"","difficulte":"-6","portée":"","caseTMR":"cite","caseTMRspeciale":"","ptreve":"1+","portee":"","isrituel":true,"coutseuil":1,"xp":0,"bonuscase":""},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_narcos.webp","effects":[]} {"_id":"P9jMT8pl4pgKEoEW","name":"Écailles de Protection contre le feu *","permission":{"default":0,"6ibmdmaeRSMTjU4c":3},"type":"sort","data":{"description":"

Chaque écaille de protection diminue de 1 point le jet d'encaissement de tout dommage dû au feu, jouant le rôle d'une \"armure ignifugée\". Soit un personnage possédant une telle amulette dotée de 5 écailles, et se retrouvant dans une zone d'Air en Feu. Au lieu de jouer un jet d'encaissement à +10, il ne la joue qu'à +5. La protection de l'amulette est en plus de la protection physique qu'il peut avoir, laquelle ne peut être - rappelons-le - que d'un maximum de 2 points.

\n

Une amulette peut avoir n'importe quelle forme, mais ne fonctionne que si elle est en contact avec la peau nue de son possesseur. Si c'est le cas, elle fonctionne spontanément en face du danger pour lequel elle est conçue, même si le possesseur n'a aucune idée de son pouvoir. Pour fonctionner, l'amulette a besoin de points de rêve actifs. Ces points doivent être des points de rêve conférés par le rituel d'Enchantement en plus des points inertes. Autrement dit, voulant fabriquer une amulette, le haut-rêvant ne s'arrête pas d'enchanter quand il atteint un nombre de points de rêve égal à l'inertie totale de l'objet, mais continue à en rajouter. Le nombre maximum de points actifs qu'une amulette puisse posséder est égal à 7 fois l'enchantabilité de sa gemme ; et, comme pour les écailles d'efficacité, le nombre d'écailles de protection qu'elle puisse posséder est égal à l'enchantabilité de celle-ci avec un maximum de 7. Des amulettes plus puissantes ne pourraient être obtenues que par de spécifiques Grandes Écailles de Narcos.

\n

Soit une gemme de taille 6 et de pureté 5, ayant donc une inertie de 2 et une enchantabilité de 4. Elle peut posséder jusqu'à 4 écailles de protection (=enchantabilité) et un maximum de 28 points de rêve actifs (7   x 4 = 28).

\n

Chaque fois qu'une amulette de protection fonctionne, elle dépense un de ses points de rêve actifs quel que soit le nombre d'écailles. Le possesseur, lui, n'en dépense qu'un par heure, quel que soit le nombre de fonctionnements de l'amulette au cours de cette heure. Quand une amulette n'a plus de points actifs, elle cesse de fonctionner. On ne peut lui en redonner que par le rituel de Restauration. Les écailles de protection peuvent être posées progressivement, comme celles d'efficacité, même si l'amulette fonctionne entre temps. Mêmes règles d'application. Une gemme donnée ne peut recevoir que des écailles de protection d'un même type, mais grâce à Individualité, plusieurs gemmes d'une même amulette peuvent offrir des protections différentes. La pose de chaque écaille de protection coûte un point de seuil.

\n

 

","draconic":"narcos","duree":"Instantanée","JR":"Aucun","cible":"","difficulte":"-6","portée":"","caseTMR":"desert","caseTMRspeciale":"","ptreve":"4","portee":"","isrituel":true,"coutseuil":1,"xp":0,"bonuscase":""},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_narcos.webp","effects":[]} @@ -13,7 +13,7 @@ {"_id":"TjhnUMh6UL04k0k8","name":"Purification","permission":{"default":0,"6ibmdmaeRSMTjU4c":3},"type":"sort","data":{"description":"

Purification est un rituel secondaire, mais néanmoins obligatoire. A moins de disposer d'une énorme quantité de points de rêve, il est vain d'espérer enchanter l'objet en une seule fois. Purifcation doit toujours s'intercaler entre deux rituels identiques : entre deux Enchantements, mais également entre deux écailles, d'activité ou de protection. Sauter cette étape aboutit à un cas de magie impossible.

","draconic":"narcos","duree":"Instantanée","JR":"Aucun","cible":"","difficulte":"-4","portée":"","caseTMR":"necropole","caseTMRspeciale":"","ptreve":"4","portee":"","isrituel":true,"xp":0,"bonuscase":"","coutseuil":0},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_narcos.webp","effects":[]} {"_id":"WUYaL4yvr0wFRLjk","name":"Enchantement","permission":{"default":0,"6ibmdmaeRSMTjU4c":3},"type":"sort","data":{"description":"

C'est le rituel de base de tout enchantement, c'est par lui que le haut-rêvant confère des points de rêve à la gemme ou à la potion. Le nombre de points conférés, paramétré au lancer du sort, est à son entière discrétion. Entre deux Enchantements de la même potion ou de la même gemme doit être accompli un rituel de Purificiation.

","draconic":"narcos","duree":"Instantanée","JR":"Aucun","cible":"","difficulte":"-4","portée":"","caseTMR":"cite","caseTMRspeciale":"","ptreve":"1+","portee":"","isrituel":true,"xp":0,"bonuscase":"","coutseuil":0},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_narcos.webp","effects":[]} {"_id":"X8yMNrnbFIwTB6oL","name":"Écailles de Protection contre griffes et crocs *","permission":{"default":0,"6ibmdmaeRSMTjU4c":3},"type":"sort","data":{"description":"

Chaque écaille de protection diminue de 1 point le jet d'encaissement de tout dommage dû aux armes naturelles des animaux, griffes, crocs, mais également piétinement, cornes, tentacules, etc. Elle protège également des dommages au corps à corps de pugilat, coups de poing, coups de pied, mais ne s'applique pas à l'empoignade. La protection est en plus de l'armure véritable du personnage. 

\n

Une amulette peut avoir n'importe quelle forme, mais ne fonctionne que si elle est en contact avec la peau nue de son possesseur. Si c'est le cas, elle fonctionne spontanément en face du danger pour lequel elle est conçue, même si le possesseur n'a aucune idée de son pouvoir. Pour fonctionner, l'amulette a besoin de points de rêve actifs. Ces points doivent être des points de rêve conférés par le rituel d'Enchantement en plus des points inertes. Autrement dit, voulant fabriquer une amulette, le haut-rêvant ne s'arrête pas d'enchanter quand il atteint un nombre de points de rêve égal à l'inertie totale de l'objet, mais continue à en rajouter. Le nombre maximum de points actifs qu'une amulette puisse posséder est égal à 7 fois l'enchantabilité de sa gemme ; et, comme pour les écailles d'efficacité, le nombre d'écailles de protection qu'elle puisse posséder est égal à l'enchantabilité de celle-ci avec un maximum de 7. Des amulettes plus puissantes ne pourraient être obtenues que par de spécifiques Grandes Écailles de Narcos.

\n

Soit une gemme de taille 6 et de pureté 5, ayant donc une inertie de 2 et une enchantabilité de 4. Elle peut posséder jusqu'à 4 écailles de protection (=enchantabilité) et un maximum de 28 points de rêve actifs (7   x 4 = 28).

\n

Chaque fois qu'une amulette de protection fonctionne, elle dépense un de ses points de rêve actifs quel que soit le nombre d'écailles. Le possesseur, lui, n'en dépense qu'un par heure, quel que soit le nombre de fonctionnements de l'amulette au cours de cette heure. Quand une amulette n'a plus de points actifs, elle cesse de fonctionner. On ne peut lui en redonner que par le rituel de Restauration. Les écailles de protection peuvent être posées progressivement, comme celles d'efficacité, même si l'amulette fonctionne entre temps. Mêmes règles d'application. Une gemme donnée ne peut recevoir que des écailles de protection d'un même type, mais grâce à Individualité, plusieurs gemmes d'une même amulette peuvent offrir des protections différentes. La pose de chaque écaille de protection coûte un point de seuil.

\n

 

","draconic":"narcos","duree":"Instantanée","JR":"Aucun","cible":"","difficulte":"-10","portée":"","caseTMR":"marais","caseTMRspeciale":"","ptreve":"8","portee":"","isrituel":true,"coutseuil":1,"xp":0,"bonuscase":""},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_narcos.webp","effects":[]} -{"_id":"Y4r9kTN2brWC2N0n","name":"Lecture d'aura","type":"sort","img":"systems/foundryvtt-reve-de-dragon/icons/competence_vigilance.webp","data":{"description":"

Les rituels de Lecture d’Aura peuvent indifféremment être accomplis par n’importe laquelle des quatre voies.

\n

Ce rituel permet d’approfondir les informations fournies par Détection d’Aura. Pratiquer Lecture d’Aura quand il n’y a pas d’aura revient à demander une magie impossible et crée immédiatement une déchirure du rêve.

\n

Lecture d’Aura est effectuée en plusieurs étapes, toutes étant de difficulté R-3 et coûtant 3 points de rêve. La première a toujours lieu dans un sanctuaire et ne fait que révéler dans quel(s) autre(s) genre(s) de case(s) le haut-rêvant doit se rendre pour continuer sa lecture. Là, il apprend quel genre de magie a été produit ou à quel type de rêve il a affaire, de même que les cases spécifiques concernées. Enfin dans les cases spécifiques, le haut-rêvant peut apprendre la force du rêve ou de la magie en cours, c’est-à-dire pratiquement la difficulté et le nombre de points de rêve impliqués, information indispensable dans l’optique d’une annulation de magie.

\n

Lecture d’Aura révèle également la couleur de l’aura (fixe ou pulsative) comme Détection d’Aura. Pour les créatures vivantes, on peut donc sauter l’étape de Détection d’Aura et commencer directement par la lecture, puisqu’on est sûr de trouver une aura. Dans les autres cas, il est plus prudent de commencer par la détection si, en l’absence finale d’une aura, on ne veut pas créer de magie impossible. Effectuée sur une créature non soumise à un effet magique ni sous l’emprise d’une entité, Lecture d’Aura indique toujours le Fleuve. Là, dans n’importe quelle case du Fleuve, le haut-rêvant se contente d’apprendre qu’il a affaire à une créature vivante et douée de rêve.

","descriptionmj":"","draconic":"oniros","duree":"Instantanée","JR":"Aucun","cible":"","difficulte":"-3","portée":"","caseTMR":"special","caseTMRspeciale":"Sanctuaire / variable","ptreve":"3","xp":0,"bonuscase":"","isrituel":true,"coutseuil":0,"portee":""},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"Q2G6GTdrotKzYGUC":3},"flags":{}} +{"_id":"Y4r9kTN2brWC2N0n","name":"Lecture d'aura","permission":{"default":0,"Q2G6GTdrotKzYGUC":3},"type":"sort","data":{"description":"

Les rituels de Lecture d’Aura peuvent indifféremment être accomplis par n’importe laquelle des quatre voies.

\n

Ce rituel permet d’approfondir les informations fournies par Détection d’Aura. Pratiquer Lecture d’Aura quand il n’y a pas d’aura revient à demander une magie impossible et crée immédiatement une déchirure du rêve.

\n

Lecture d’Aura est effectuée en plusieurs étapes, toutes étant de difficulté R-3 et coûtant 3 points de rêve. La première a toujours lieu dans un sanctuaire et ne fait que révéler dans quel(s) autre(s) genre(s) de case(s) le haut-rêvant doit se rendre pour continuer sa lecture. Là, il apprend quel genre de magie a été produit ou à quel type de rêve il a affaire, de même que les cases spécifiques concernées. Enfin dans les cases spécifiques, le haut-rêvant peut apprendre la force du rêve ou de la magie en cours, c’est-à-dire pratiquement la difficulté et le nombre de points de rêve impliqués, information indispensable dans l’optique d’une annulation de magie.

\n

Lecture d’Aura révèle également la couleur de l’aura (fixe ou pulsative) comme Détection d’Aura. Pour les créatures vivantes, on peut donc sauter l’étape de Détection d’Aura et commencer directement par la lecture, puisqu’on est sûr de trouver une aura. Dans les autres cas, il est plus prudent de commencer par la détection si, en l’absence finale d’une aura, on ne veut pas créer de magie impossible. Effectuée sur une créature non soumise à un effet magique ni sous l’emprise d’une entité, Lecture d’Aura indique toujours le Fleuve. Là, dans n’importe quelle case du Fleuve, le haut-rêvant se contente d’apprendre qu’il a affaire à une créature vivante et douée de rêve.

","draconic":"oniros","duree":"Instantanée","JR":"Aucun","cible":"","difficulte":"-3","portée":"","caseTMR":"special","caseTMRspeciale":"Sanctuaire / variable","ptreve":"3","xp":0,"bonuscase":"","isrituel":false,"coutseuil":0},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_vigilance.webp","effects":[]} {"_id":"asVUMvyZ0OocReY6","name":"Individualité","permission":{"default":0,"Q2G6GTdrotKzYGUC":3},"type":"sort","data":{"description":"

Rituel secondaire, Individualité est néanmoins obligatoire pour les objets possédant plusieurs pouvoirs distincts. Il doit être accompli sur toute nouvelle gemme, enchantée d’au moins un point de rêve actif, avant le rituel d’Alliance. Lors, c’est uniquement à cette nouvelle gemme que s’adresseront les points de rêve et les écailles. Vis à vis d’une nouvelle gemme, le matériau re-possède toute son inertie et doit à nouveau être saturé. Quand un objet a plusieurs gemmes, toutes ont dû recevoir Individualité sauf la première. Les pouvoirs d’un objet doivent être élaborés l’un après l’autre. Dès que l’on a commencé une nouvelle gemme, on ne peut plus revenir sur les précédentes.

","draconic":"narcos","duree":"Instantanée","JR":"Aucun","cible":"","difficulte":"-4","portée":"","caseTMR":"desert","caseTMRspeciale":"","ptreve":"4","xp":0,"isrituel":true,"portee":"","bonuscase":"","coutseuil":0},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_narcos.webp","effects":[]} {"_id":"ckH9xONcfsffpRVr","name":"Écailles de Protection contre la magie *","permission":{"default":0,"6ibmdmaeRSMTjU4c":3},"type":"sort","data":{"description":"

Chaque écaille de protection rajoute un +1 à tous les jets de résistance contre les sorts d'illusion-suggestion d'Hypnos ainsi que les rituels de Possession et les sorts et griffes de Thanatos. L'amulette n'est pas spécifique à un sort, elle protège de tous. Soit un personnage possédant une amulette de 4 écailles et devant jouer une JR r-8, il ne joue en réalité qu'un JR r-4, augmentant considérablement ses chances de résister à la magie. La protection ne s'applique qu'à la magie autorisant un JR.

\n

Une amulette peut avoir n'importe quelle forme, mais ne fonctionne que si elle est en contact avec la peau nue de son possesseur. Si c'est le cas, elle fonctionne spontanément en face du danger pour lequel elle est conçue, même si le possesseur n'a aucune idée de son pouvoir. Pour fonctionner, l'amulette a besoin de points de rêve actifs. Ces points doivent être des points de rêve conférés par le rituel d'Enchantement en plus des points inertes. Autrement dit, voulant fabriquer une amulette, le haut-rêvant ne s'arrête pas d'enchanter quand il atteint un nombre de points de rêve égal à l'inertie totale de l'objet, mais continue à en rajouter. Le nombre maximum de points actifs qu'une amulette puisse posséder est égal à 7 fois l'enchantabilité de sa gemme ; et, comme pour les écailles d'efficacité, le nombre d'écailles de protection qu'elle puisse posséder est égal à l'enchantabilité de celle-ci avec un maximum de 7. Des amulettes plus puissantes ne pourraient être obtenues que par de spécifiques Grandes Écailles de Narcos.

\n

Soit une gemme de taille 6 et de pureté 5, ayant donc une inertie de 2 et une enchantabilité de 4. Elle peut posséder jusqu'à 4 écailles de protection (=enchantabilité) et un maximum de 28 points de rêve actifs (7   x 4 = 28).

\n

Chaque fois qu'une amulette de protection fonctionne, elle dépense un de ses points de rêve actifs quel que soit le nombre d'écailles. Le possesseur, lui, n'en dépense qu'un par heure, quel que soit le nombre de fonctionnements de l'amulette au cours de cette heure. Quand une amulette n'a plus de points actifs, elle cesse de fonctionner. On ne peut lui en redonner que par le rituel de Restauration. Les écailles de protection peuvent être posées progressivement, comme celles d'efficacité, même si l'amulette fonctionne entre temps. Mêmes règles d'application. Une gemme donnée ne peut recevoir que des écailles de protection d'un même type, mais grâce à Individualité, plusieurs gemmes d'une même amulette peuvent offrir des protections différentes. La pose de chaque écaille de protection coûte un point de seuil.

\n

 

","draconic":"narcos","duree":"Instantanée","JR":"Aucun","cible":"","difficulte":"-8","portée":"","caseTMR":"sanctuaire","caseTMRspeciale":"","ptreve":"6","portee":"","isrituel":true,"coutseuil":1,"xp":0,"bonuscase":""},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_narcos.webp","effects":[]} {"_id":"hWAoVheMfyLIMKZy","name":"Alliance","permission":{"default":0,"Q4cUvqxCxMoTJXDL":3},"type":"sort","data":{"description":"

Ce rituel unit magiquement la gemme, seul véritable réceptacle du rêve,au reste de l’objet, en sorte que son pouvoir puisse s’étendre à lui. Ce qui s’applique à la gemme s’applique désormais à l’objet, et inversement. La forme de l’objet participe maintenant à la magie. C’est pourquoi il doit être utilisé comme l’exige sa fonction normale (bague au doigt, etc.) et pourquoi sa forme doit être en analogie avec le ciblage. Pratiquement, une gemme seule ne peut être utilisée que pour une écaille d’activité lançant un sort sur l’utilisateur lui-même (la gemme ne lui permettant pas d’autre ciblage). Une gemme seule pourrait être une amulette de protection, mais il faudrait la tenir sans cesse dans le creux de la main (seule façon d’utiliser une gemme seule). En revanche, on peut s’en contenter pour la Grande Écaille de Narcos Puits de rêve.

\n

 

","draconic":"narcos","duree":"Instantanée","JR":"Aucun","cible":"","difficulte":"-4","portée":"","caseTMR":"pont","caseTMRspeciale":"","ptreve":"4","portee":"","isrituel":true,"xp":0,"bonuscase":"","coutseuil":0},"flags":{"core":{"sourceId":"Item.5UQMurs8lNa8eBr0"}},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_narcos.webp","effects":[]} @@ -22,5 +22,5 @@ {"_id":"mh9JjaKckzz1eAoe","name":"Écailles de Protection contre la maladie* ","permission":{"default":0,"6ibmdmaeRSMTjU4c":3},"type":"sort","data":{"description":"

Chaque écaille de protection confère un bons de +1 au jet de CONSTITUTION contre toutes les maladies, augmentant ainsi les chances de leur résister.

\n

Une amulette peut avoir n'importe quelle forme, mais ne fonctionne que si elle est en contact avec la peau nue de son possesseur. Si c'est le cas, elle fonctionne spontanément en face du danger pour lequel elle est conçue, même si le possesseur n'a aucune idée de son pouvoir. Pour fonctionner, l'amulette a besoin de points de rêve actifs. Ces points doivent être des points de rêve conférés par le rituel d'Enchantement en plus des points inertes. Autrement dit, voulant fabriquer une amulette, le haut-rêvant ne s'arrête pas d'enchanter quand il atteint un nombre de points de rêve égal à l'inertie totale de l'objet, mais continue à en rajouter. Le nombre maximum de points actifs qu'une amulette puisse posséder est égal à 7 fois l'enchantabilité de sa gemme ; et, comme pour les écailles d'efficacité, le nombre d'écailles de protection qu'elle puisse posséder est égal à l'enchantabilité de celle-ci avec un maximum de 7. Des amulettes plus puissantes ne pourraient être obtenues que par de spécifiques Grandes Écailles de Narcos.

\n

Soit une gemme de taille 6 et de pureté 5, ayant donc une inertie de 2 et une enchantabilité de 4. Elle peut posséder jusqu'à 4 écailles de protection (=enchantabilité) et un maximum de 28 points de rêve actifs (7   x 4 = 28).

\n

Chaque fois qu'une amulette de protection fonctionne, elle dépense un de ses points de rêve actifs quel que soit le nombre d'écailles. Le possesseur, lui, n'en dépense qu'un par heure, quel que soit le nombre de fonctionnements de l'amulette au cours de cette heure. Quand une amulette n'a plus de points actifs, elle cesse de fonctionner. On ne peut lui en redonner que par le rituel de Restauration. Les écailles de protection peuvent être posées progressivement, comme celles d'efficacité, même si l'amulette fonctionne entre temps. Mêmes règles d'application. Une gemme donnée ne peut recevoir que des écailles de protection d'un même type, mais grâce à Individualité, plusieurs gemmes d'une même amulette peuvent offrir des protections différentes. La pose de chaque écaille de protection coûte un point de seuil.

\n

 

","draconic":"narcos","duree":"Instantanée","JR":"Aucun","cible":"","difficulte":"-6","portée":"","caseTMR":"cite","caseTMRspeciale":"","ptreve":"4","portee":"","isrituel":true,"coutseuil":1,"xp":0,"bonuscase":""},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_narcos.webp","effects":[]} {"_id":"mzAV6EdQlGkVkWEN","name":"Écailles de Protection contre les lames *","permission":{"default":0,"6ibmdmaeRSMTjU4c":3},"type":"sort","data":{"description":"

Chaque écaille de protection diminue de 1 point le jet d'encaissement de tout dommage dû à une arme de mêlée (dague, épée, hache, lance, masse, fléeau, arme d'hast), mais ni les projectiles ni les dommages au corps à corps. La protection est en plus de l'armure véritable du personnage. 

\n

Une amulette peut avoir n'importe quelle forme, mais ne fonctionne que si elle est en contact avec la peau nue de son possesseur. Si c'est le cas, elle fonctionne spontanément en face du danger pour lequel elle est conçue, même si le possesseur n'a aucune idée de son pouvoir. Pour fonctionner, l'amulette a besoin de points de rêve actifs. Ces points doivent être des points de rêve conférés par le rituel d'Enchantement en plus des points inertes. Autrement dit, voulant fabriquer une amulette, le haut-rêvant ne s'arrête pas d'enchanter quand il atteint un nombre de points de rêve égal à l'inertie totale de l'objet, mais continue à en rajouter. Le nombre maximum de points actifs qu'une amulette puisse posséder est égal à 7 fois l'enchantabilité de sa gemme ; et, comme pour les écailles d'efficacité, le nombre d'écailles de protection qu'elle puisse posséder est égal à l'enchantabilité de celle-ci avec un maximum de 7. Des amulettes plus puissantes ne pourraient être obtenues que par de spécifiques Grandes Écailles de Narcos.

\n

Soit une gemme de taille 6 et de pureté 5, ayant donc une inertie de 2 et une enchantabilité de 4. Elle peut posséder jusqu'à 4 écailles de protection (=enchantabilité) et un maximum de 28 points de rêve actifs (7   x 4 = 28).

\n

Chaque fois qu'une amulette de protection fonctionne, elle dépense un de ses points de rêve actifs quel que soit le nombre d'écailles. Le possesseur, lui, n'en dépense qu'un par heure, quel que soit le nombre de fonctionnements de l'amulette au cours de cette heure. Quand une amulette n'a plus de points actifs, elle cesse de fonctionner. On ne peut lui en redonner que par le rituel de Restauration. Les écailles de protection peuvent être posées progressivement, comme celles d'efficacité, même si l'amulette fonctionne entre temps. Mêmes règles d'application. Une gemme donnée ne peut recevoir que des écailles de protection d'un même type, mais grâce à Individualité, plusieurs gemmes d'une même amulette peuvent offrir des protections différentes. La pose de chaque écaille de protection coûte un point de seuil.

\n

 

","draconic":"narcos","duree":"Instantanée","JR":"Aucun","cible":"","difficulte":"-10","portée":"","caseTMR":"lac","caseTMRspeciale":"","ptreve":"8","portee":"","isrituel":true,"coutseuil":1,"xp":0,"bonuscase":""},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_narcos.webp","effects":[]} {"_id":"sEBhR48HagKNbkob","name":"Écaille d'activité *","permission":{"default":0,"6ibmdmaeRSMTjU4c":3},"type":"sort","data":{"description":"

Le rituel d'Écaille d'Activité confère à l'objet magique le pouvoir de lancer un sort. Ce peut être un sort de zone d'Oniros, un sort d'illusion-suggestion ou d'illusion sensorielle d'Hypnos, ou un sort de Thanatos, mais ne peut en aucun cas être un rituel d'aucune des quatre voies. Ayant posé l'écaille d'activité sur l'objet (\"poser\" est le terme consacré à l'accomplissement des rituels d'Écaille), le Haut-Rêvant y lance le sort de son choix et l'objet devient capable de le lancer à son tour. Pratiquement, le haut-rêvant effectue toutes les opérations nécessaires au lancer d'un sort, y compris son paramétrage précis, puis le lance normalement en dépensant les points de rêve du coût. Toutefois, au lieu de cibler comme l'exige le ciblage normal du sort, il touche l'objet possédant l'écaille d'activité. En résultat, aucun effet ne se produit, mais le sort est maintenant enregistré dans la \"mémoire\" de la gemme. Il suffit ensuite à l'utilisateur de se concentrer mentalement sur l'effet voulu (dont il doit avoir une idée) pour que l'objet lance le sort. Il pourra le lancer indéfiniment.

\n

A la fin du round de concentration, l'utilisateur doit être capable de dépenser les points de rêve exigés par le coût du sort tel qu'il est paramétéré. S'il n'en a pas assez, il ne dépense rien, mais l'objet ne fonctionne pas. Puis cela étant fait, le sort opère au tout début du round suivant, selon le ciblage voulu par l'utilisateur, fonction de la forme de l'objet et de la façon dont il est utilisé. Pour que le sort puisse être ciblé ailleurs que sur l'utilisateur lui-même, l'objet doit avoir une forme oblongue, analogue au doigt pointé d'un haut-rêvant. Le sort enregistré dans la gemme est paramétré une fois pour toutes. Un objet lançant un sort de Sommeil de 5 rounds lancera toujours un sort de Sommeil de 5 rounds, ni plus ni moins. Un objet lançant une illusion visuelle ne lancera toujours que la même illusion au moindre détail près. La portée est celle de l'EMPATHIE du 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 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 la cible. S'il réussit, le sort se dissipe aussitôt sans revenir vers l'utilisateur.

\n

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 soi-même, mais évite la montée en TMR, les rencontres, et confère la certitude que le sort partira à coup sûr. L'effet d'un sort lancé par un objet peut être annulé par Annulatrion de Magie, mais pas par Annulation de ses Propres Zones ni Annulation de ses Propres Illusions.

\n

Chaque gemme d'un objet ne peut recevoir qu'une seule écaille d'activité, et la pose de cette dernière coûte un point de seuil. Une écaille d'activité ne peut enregistrer et lancer q'un seul sort. Mais un même objet peut avoir plusieurs gemmes, grâce à Individualité, chacune possédant une écaille d'activité pour lancer un sort différent.

","draconic":"narcos","duree":"Instantanée","JR":"Aucun","cible":"","difficulte":"-9","portée":"","caseTMR":"desolation","caseTMRspeciale":"","ptreve":"7","portee":"","isrituel":true,"coutseuil":1,"xp":0,"bonuscase":""},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_narcos.webp","effects":[]} -{"_id":"xOicgRMCUxJNmVzF","name":"Détection d'aura","type":"sort","img":"systems/foundryvtt-reve-de-dragon/icons/competence_vigilance.webp","data":{"description":"

Les rituels de Détection d’Aura peuvent indifféremment être accomplis par n’importe laquelle des quatre voies.

\n

Toutes les créatures vivantes animées (humains, humanoïdes, animaux) ont une caractéristique RÊVE. Les objets enchantés possèdent des points de rêve, de même que les produits de magie naturelle, comme certaines pierres de chance. Les entités de cauchemar, incarnées ou non, en ont également. Quelle qu’elle soit, la présence de rêve émet une aura, laquelle est détectable par Détection d’Aura. Parallèlement, toute cible d’un sort ou d’un rituel, émet une aura propre, quand bien même ladite cible ne possède pas de points de rêve (centre de zone, objet ou plante soumis à une illusion d’Hypnos). Cette aura est également détectable par Détection d’Aura.

\n

L’aura de présence de rêve se traduit par un halo bleuté constant ; l’aura résultant d’un effet magique par un halo parcouru de pulsations. Quand les deux auras sont présentes conjointement, le halo est pulsatif et d’un bleu plus foncé. On peut toujours effectuer Détection d’Aura sans aucun risque, il y a toujours une réponse. Soit une aura est perçue, constante ou pulsative, et l’on peut tenter une Lecture d’Aura pour en savoir plus ; soit aucune aura n’est perçue et il s’agit de matière inerte, sans rêve, non soumise à un sort.

","descriptionmj":"","draconic":"oniros","duree":"Instantanée","JR":"Aucun","cible":"","difficulte":"-3","portée":"","caseTMR":"sanctuaire","caseTMRspeciale":"","ptreve":"1","xp":0,"bonuscase":"","isrituel":true,"coutseuil":0,"portee":""},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"Q2G6GTdrotKzYGUC":3},"flags":{}} +{"_id":"xOicgRMCUxJNmVzF","name":"Détection d'aura","permission":{"default":0,"Q2G6GTdrotKzYGUC":3},"type":"sort","data":{"description":"

Les rituels de Détection d’Aura peuvent indifféremment être accomplis par n’importe laquelle des quatre voies.

\n

Toutes les créatures vivantes animées (humains, humanoïdes, animaux) ont une caractéristique RÊVE. Les objets enchantés possèdent des points de rêve, de même que les produits de magie naturelle, comme certaines pierres de chance. Les entités de cauchemar, incarnées ou non, en ont également. Quelle qu’elle soit, la présence de rêve émet une aura, laquelle est détectable par Détection d’Aura. Parallèlement, toute cible d’un sort ou d’un rituel, émet une aura propre, quand bien même ladite cible ne possède pas de points de rêve (centre de zone, objet ou plante soumis à une illusion d’Hypnos). Cette aura est également détectable par Détection d’Aura.

\n

L’aura de présence de rêve se traduit par un halo bleuté constant ; l’aura résultant d’un effet magique par un halo parcouru de pulsations. Quand les deux auras sont présentes conjointement, le halo est pulsatif et d’un bleu plus foncé. On peut toujours effectuer Détection d’Aura sans aucun risque, il y a toujours une réponse. Soit une aura est perçue, constante ou pulsative, et l’on peut tenter une Lecture d’Aura pour en savoir plus ; soit aucune aura n’est perçue et il s’agit de matière inerte, sans rêve, non soumise à un sort.

","draconic":"oniros","duree":"Instantanée","JR":"Aucun","cible":"","difficulte":"-3","portée":"","caseTMR":"sanctuaire","caseTMRspeciale":"","ptreve":"1","xp":0,"bonuscase":"","isrituel":false,"coutseuil":0},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_vigilance.webp","effects":[]} {"_id":"zT72qy3Xb8ye9YKb","name":"Bouilloire de Mélimnod *","permission":{"default":0,"6ibmdmaeRSMTjU4c":3},"type":"sort","data":{"description":"

La Grande Écaille Bouilloire de Mélimnod, du nom d'un célèbre haut-rêvant du Second Âge, est un exemple abordable d'objet autonome. Elle doit être posée sur une bouilloire ou un petit chaudron intégralement fait d'argent, de cuivre ou d'étain, à l'exclusion de tout autre métal, d'une capacité de 2 mesures (40 centilitres). La gemme peut être incrustée dans le fond du récipient ou participer à son alliage. A la fin de l'enchantement, avant l'accomplissement de Permanence, elle doit posséder au minimum 1 point de rêve actif. (Le maximum étant comme toujours 7 fois son enchantabilité.) Puis, à la place de Maîtrise, il est obligatoire d'accomplir le rituel d'Autonomie (qui coûte 2 points de seuil). La Grande Écaille peut alors être posée. Il n'en est besoin que d'une seule.

\n

Dès que la bouilloire se retrouve pleine d'eau (2 mesures), ou d'un liquide appartenant à l'élément Eau, elle se met à chauffer spontanément et porte le liquide à ébullition ern l'espace d'un seul round. Au bout d'un second round, le liquide est réduit de moitié (une mesure). Puis la bouilloire le fait refroidir, et il se retrouve tout juste tiède au bout d'un troisième round. Il peut alors demeurer indéfiniment dans la bouilloire ou être transvasé, mais dès que la bouilloire se retrouve intégralement pleine, le processus recommence. Chaque chauffe lui coûte un de ses points de rêve actifs. Le rituel d'Autonomie les lui fait récupérer à raison de 3 par heure de complète non-utilisation.

\n

Il est bien entendu possible de mettre des herbes de soin dans la bouilloire avant d'y verser l'eau, de façon à obtenir une décoction en un temps record. Etant autonome, la Bouilloire de Mélimnod n'a pas être maîtrisée. La pose de la Grande Écaille coûte 1 point de seuil.

","draconic":"narcos","duree":"Instantanée","JR":"Aucun","cible":"","difficulte":"-9","portée":"","caseTMR":"special","caseTMRspeciale":"Monts Brûlants E5","ptreve":"9","portee":"","isrituel":true,"coutseuil":1,"xp":0,"bonuscase":""},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_narcos.webp","effects":[]} diff --git a/packs/sorts-oniros.db b/packs/sorts-oniros.db index 74736ff0..cced0c38 100644 --- a/packs/sorts-oniros.db +++ b/packs/sorts-oniros.db @@ -42,7 +42,7 @@ {"_id":"WAXn5Jvqxv9N04aY","name":"Feu en air","permission":{"default":0,"jOzRscDxoXZWpGS6":3},"type":"sort","data":{"description":"

Le principe de la Transmutation Élémentale est de transformer un élément en un autre, par exemple le métal en bois, l’air en feu. Il n’existe de transmutation que pour les six premiers éléments. La matière dont sont composées les créatures, mortes ou vivantes, n’est jamais transmuée, y compris l’air contenu dans les poumons. Il existe 26 transmutations élémentales ; chacune est un sort à part entière, obéissant en tout point aux règles des sorts de zone.

\n

La transmutation a lieu dans la zone paramétrée et ciblée par le haut-rêvant. Tout ce qui appartient à l’élément impliqué est transmué instantanément sans discrimination. On ne peut pas faire de choix. Tant que dure la zone, tout nouvel objet appartenant à l’élément impliqué qui pénètre dans la zone, est immédiatement transmué à son tour. La zone peut fort bien être lancée sur un lieu où l’élément impliqué n’existe pas, par exemple Terre en Eau à 5 m du sol. Rien ne se produira au premier abord, mais toute pierre lancée dans la zone sera instantanément liquéfiée pour retomber sous forme de pluie.

\n

Tout objet transmué, situé ou entrant dans la zone, adopte aussitôt la forme que lui permet le nouvel élément. On peut obtenir de gracieuses torsades avec du feu transmué en bois ou en métal. La transmutation est définitive, même si l’objet sort de la zone. À la fin de la zone (HN), l’effet cesse d’opérer, mais la matière transmuée le demeure définitivement sans recouvrer non plus son élément d’origine.

\n

Quand une créature vivante se retrouve dans une zone de Transmutation Élémentale, bien que la matière dont elle est composée ne soit pas affectée en elle-même, elle subit l’effet naturel et normal du nouvel élément qui l’entoure, sans jet de résistance. Une créature prise dans une zone d’Air en Feu se retrouve dans un brasier qui la brûle, une créature nageant prise dans une zone d’Eau en Bois se retrouve enkystée dans un bloc de bois, etc.

\n

L’élément Eau correspondant à tous les liquides d’origine non animale, réellement aqueux ou non, c’est tout le liquide qui est transmué et non pas uniquement ses molécules de H2O, y compris tout ce qui peut y être dissout (sels, cristaux). L’eau d’un végétal (sève, jus d’un fruit) appartient à l’élément Bois, qui est celui du végétal, tant qu’il est contenu dans ce dernier. L’humus appartient intégralement à l’élément Terre, même s’il est composé en grande partie de matière végétale (Bois) non encore décomposée.

\n

Éléments d'arrivée

\n

X élément en Air : Pratiquement, l’ancien élément disparaît dans un courant d’air. L’air d’arrivée est toujours frais et pur.

\n

X élément en Terre : L’élément d’arrivée est une roche friable et fragile comme de la craie.

\n

X élément en Eau : L’eau nouvellement créée se comporte naturellement, attirée par la pesanteur : elle pleut, coule, cherche à s’infiltrer. Elle a la pureté de l’eau distillée.

\n

X élément en Feu : L’ancien élément devenu Feu n’est plus que flammes. Toutefois, pour que ces nouvelles flammes continuent à brûler, il leur faut un combustible, faute de quoi elles s’éteignent. Quand c’est l’Air qui est transmué en Feu, celui-ci demeure même sans combustible, car l’Air entourant la zone la comble immédiatement, devenant Feu à son tour. Le résultat est une sphère en permanente ignition. Il en va de même pour l’eau au centre d’une rivière par exemple.

\n

X élément en Bois : Le bois d’arrivée est un bois de qualité médiocre, du genre sapin, mais sec, sans aucune sève ni résine, combustible ou façonnable.

\n

X élément en Métal : Il ne s’agit toujours que des deux métaux les plus inertes : fer ou plomb (tirer à pile ou face). Le fer de transmutation n’est ni de l’acier ni du fer forgé, c’est du fer natif, mou et sans dureté. Un forgeron peut néanmoins le travailler.

\n

Objets magiques

\n

À mi-chemin entre les créatures et la matière inerte, les objets magiques ont droit à un jet de résistance pour ne pas être impliqués dans une transmutation. C’est un JR spécial, r0, où la protection magique du matériau est prise en guise de points de rêve (voir Résistance).

","draconic":"oniros","duree":"HN","JR":"Aucun","cible":"","difficulte":"-4","portée":"","caseTMR":"desolation","caseTMRspeciale":"","ptreve":"2"},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_oniros.webp","effects":[]} {"_id":"WXtSySQMfSW2ve6Y","name":"Bouclier élémental contre le bois","permission":{"default":0,"jOzRscDxoXZWpGS6":3},"type":"sort","data":{"description":"

Le principe de la zone de Bouclier Élémental est d'empêcher l'élément concerné (eau, feu, métal, bois, terre) d'y pénétrer, comme s'il s'agissait d'une barrière sélective. La zone est fixe et totalement invisible.

\n

Les objets appartenant, tout ou partie, à l'élément bois, ne peuvent entrer dans la zone et s'arrêtent à sa frontière. L'objet retombe alors sur le sol. Si l'objet est tenu ou porté, son porteur sent une résistance venant de lui, un blocage, et il ne peut pénétrer dans la zone tant qu'il ne s'en est pas séparé.

\n

Noter enfin que le seul effet de la zone est d'empêcher l'élément concerné d'y pénétrer. Il n'y a pas d'effet sur l'élément déjà présent dans la zone au moment où celle-ci est lancée. Par exemple, lancer un Bouclier Élémental contre le Feu sur une bougie ne l'éteint pas. Toutefois, si la bougie est sortie de la zone, sa flamme ne pourra pas y repénétrer.

","draconic":"oniros","duree":"HN","JR":"Aucun","cible":"","difficulte":"-8","portée":"","caseTMR":"desert","caseTMRspeciale":"","ptreve":"6"},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_oniros.webp","effects":[]} {"_id":"XP7yrZs6wZV0SO5p","name":"Transmutation chromatique violet","permission":{"default":0,"jOzRscDxoXZWpGS6":3},"type":"sort","data":{"description":"

La recherche des zones de Transmutation Chromatique requiert la connaissance du @Item[5YK6q2KuKArkvDWy]{Le Principe Drachromatique} (voir Les grimoires, p218).

\n

Les zones de Transmutation Chromatique modifient la couleur des objets constitués de l’élément bois (c’est à dire les matières végétales) et/ou du septième élément. Les autres éléments (terre, métal, feu, air et eau) ne sont pas affectés. En ce qui concerne le septième élément, il s’agit de la matière inerte : cuir, ivoire, laine, parchemin, etc. La matière animée n’est pas affectée. Quand un objet est composite, seule la partie bois/septième est concernée ; par exemple un ceinturon transmuté en vert : seul le cuir sera recoloré, la boucle de métal demeurant inchangée.

\n

Il existe six Transmutations Chromatiques, correspondant à la couleur d’arrivée (quelle que soit la couleur de départ). Chacune est un sort distinct. Au moment du lancer, le haut-rêvant peut paramétrer une nuance. Par exemple, pour une transmutation rouge, choisir vermillon, carmin, écarlate, etc. Cela dit, la nuance s’appliquera à toute la zone et tous les objets acquerront cette même nuance. Un livre écrit sera comme effacé, encre et parchemin acquérant exactement la même teinte.

\n

Comme pour les transmutations élémentales, le résultat est définitif. L’objet recoloré n’est pas magique et n’émet aucune aura particulière. Une fois sorti de la zone, on peut toujours le remettre dans une autre pour lui modifier à nouveau sa couleur.

\n

Les zones de Transmutation Chromatique obéissent à toutes les règles concernant les zones fixes, diamètre, élargissement, mise en réserve, etc.

","draconic":"oniros","duree":"HN","JR":"Aucun","cible":"","difficulte":"-10","portée":"","caseTMR":"gouffre","caseTMRspeciale":"","ptreve":"5"},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_oniros.webp","effects":[]} -{"_id":"Y4r9kTN2brWC2N0n","name":"Lecture d'aura","type":"sort","img":"systems/foundryvtt-reve-de-dragon/icons/competence_vigilance.webp","data":{"description":"

Les rituels de Lecture d’Aura peuvent indifféremment être accomplis par n’importe laquelle des quatre voies.

\n

Ce rituel permet d’approfondir les informations fournies par Détection d’Aura. Pratiquer Lecture d’Aura quand il n’y a pas d’aura revient à demander une magie impossible et crée immédiatement une déchirure du rêve.

\n

Lecture d’Aura est effectuée en plusieurs étapes, toutes étant de difficulté R-3 et coûtant 3 points de rêve. La première a toujours lieu dans un sanctuaire et ne fait que révéler dans quel(s) autre(s) genre(s) de case(s) le haut-rêvant doit se rendre pour continuer sa lecture. Là, il apprend quel genre de magie a été produit ou à quel type de rêve il a affaire, de même que les cases spécifiques concernées. Enfin dans les cases spécifiques, le haut-rêvant peut apprendre la force du rêve ou de la magie en cours, c’est-à-dire pratiquement la difficulté et le nombre de points de rêve impliqués, information indispensable dans l’optique d’une annulation de magie.

\n

Lecture d’Aura révèle également la couleur de l’aura (fixe ou pulsative) comme Détection d’Aura. Pour les créatures vivantes, on peut donc sauter l’étape de Détection d’Aura et commencer directement par la lecture, puisqu’on est sûr de trouver une aura. Dans les autres cas, il est plus prudent de commencer par la détection si, en l’absence finale d’une aura, on ne veut pas créer de magie impossible. Effectuée sur une créature non soumise à un effet magique ni sous l’emprise d’une entité, Lecture d’Aura indique toujours le Fleuve. Là, dans n’importe quelle case du Fleuve, le haut-rêvant se contente d’apprendre qu’il a affaire à une créature vivante et douée de rêve.

","descriptionmj":"","draconic":"oniros","duree":"Instantanée","JR":"Aucun","cible":"","difficulte":"-3","portée":"","caseTMR":"special","caseTMRspeciale":"Sanctuaire / variable","ptreve":"3","xp":0,"bonuscase":"","isrituel":true,"coutseuil":0,"portee":""},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"Q2G6GTdrotKzYGUC":3},"flags":{}} +{"_id":"Y4r9kTN2brWC2N0n","name":"Lecture d'aura","permission":{"default":0,"Q2G6GTdrotKzYGUC":3},"type":"sort","data":{"description":"

Les rituels de Lecture d’Aura peuvent indifféremment être accomplis par n’importe laquelle des quatre voies.

\n

Ce rituel permet d’approfondir les informations fournies par Détection d’Aura. Pratiquer Lecture d’Aura quand il n’y a pas d’aura revient à demander une magie impossible et crée immédiatement une déchirure du rêve.

\n

Lecture d’Aura est effectuée en plusieurs étapes, toutes étant de difficulté R-3 et coûtant 3 points de rêve. La première a toujours lieu dans un sanctuaire et ne fait que révéler dans quel(s) autre(s) genre(s) de case(s) le haut-rêvant doit se rendre pour continuer sa lecture. Là, il apprend quel genre de magie a été produit ou à quel type de rêve il a affaire, de même que les cases spécifiques concernées. Enfin dans les cases spécifiques, le haut-rêvant peut apprendre la force du rêve ou de la magie en cours, c’est-à-dire pratiquement la difficulté et le nombre de points de rêve impliqués, information indispensable dans l’optique d’une annulation de magie.

\n

Lecture d’Aura révèle également la couleur de l’aura (fixe ou pulsative) comme Détection d’Aura. Pour les créatures vivantes, on peut donc sauter l’étape de Détection d’Aura et commencer directement par la lecture, puisqu’on est sûr de trouver une aura. Dans les autres cas, il est plus prudent de commencer par la détection si, en l’absence finale d’une aura, on ne veut pas créer de magie impossible. Effectuée sur une créature non soumise à un effet magique ni sous l’emprise d’une entité, Lecture d’Aura indique toujours le Fleuve. Là, dans n’importe quelle case du Fleuve, le haut-rêvant se contente d’apprendre qu’il a affaire à une créature vivante et douée de rêve.

","draconic":"oniros","duree":"Instantanée","JR":"Aucun","cible":"","difficulte":"-3","portée":"","caseTMR":"special","caseTMRspeciale":"Sanctuaire / variable","ptreve":"3","xp":0},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_vigilance.webp","effects":[]} {"_id":"ZODdXw50qqLEvh3Q","name":"Bois transparent","permission":{"default":0,"jOzRscDxoXZWpGS6":3},"type":"sort","data":{"description":"

Les zones de Transparence Élémentale obéissent à toutes les règles des sorts de zone. Elles ont pour effet de rendre transparent l’élément impliqué. Comme pour les Transmutations Élémentales, aucune discrimination n’est possible\" : est affectée toute substance concernée se trouvant dans la zone. La transparence permet de laisser passer la lumière et donc de voir au travers. Les autres qualités des éléments ne sont pas altérées\" : le métal reste aussi dur et tranchant, le bois aussi combustible, etc. Noter que, quoique voisin, transparent ne veut pas dire invisible. Contrairement à la transmutation, l’effet n’est pas définitif. L’élément retrouve son opacité dès qu’il sort de la zone ou à la fin de la durée de cette dernière.

","draconic":"oniros","duree":"HN","JR":"Aucun","cible":"","difficulte":"-4","portée":"","caseTMR":"cite","caseTMRspeciale":"","ptreve":"4"},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_oniros.webp","effects":[]} {"_id":"afk1fBfvb4mkjlTK","name":"Bouclier élémental contre l'eau","permission":{"default":0,"jOzRscDxoXZWpGS6":3},"type":"sort","data":{"description":"

Le principe de la zone de Bouclier Élémental est d'empêcher l'élément concerné (eau, feu, métal, bois, terre) d'y pénétrer, comme s'il s'agissait d'une barrière sélective. La zone est fixe et totalement invisible.

\n

Noter enfin que le seul effet de la zone est d'empêcher l'élément concerné d'y pénétrer. Il n'y a pas d'effet sur l'élément déjà présent dans la zone au moment où celle-ci est lancée. Par exemple, lancer un Bouclier Élémental contre le Feu sur une bougie ne l'éteint pas. Toutefois, si la bougie est sortie de la zone, sa flamme ne pourra pas y repénétrer.

","draconic":"oniros","duree":"HN","JR":"Aucun","cible":"","difficulte":"-6","portée":"","caseTMR":"pont","caseTMRspeciale":"","ptreve":"4"},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_oniros.webp","effects":[]} {"_id":"bKXqrWTMEdMYEqjJ","name":"Téléportation","permission":{"default":0,"jOzRscDxoXZWpGS6":3},"type":"sort","data":{"description":"

Téléportation est un sort de double zone. Il ne fonctionne en effet que lorsque deux zones distinctes ont été mises en place : la zone de départ et la zone d’arrivée. Les deux doivent être lancées depuis la même case de collines. Le haut-rêvant commence par créer la zone d’arrivée, puis il a jusqu’à sa prochaine heure de naissance pour créer la zone de départ. Peu importe la distance séparant les deux zones tant que le délai n’est pas dépassé. Si cela se produit, la première zone disparaît purement et simplement comme n’importe quelle zone parvenue au bout de sa durée. Dès que la zone de départ est créée, la durée des deux zones est repoussée jusqu’à la fin de la seconde heure de naissance du haut-rêvant, c’est-à-dire son heure de naissance + 12 heures. Au bout de cette nouvelle durée, les deux zones s’annihilent.

\n

 

\n

Quand le couple de zones est prêt à fonctionner, toute créature qui entre dans la zone de départ, ou tout objet qu’on y fait pénétrer, se retrouve instantanément dans la zone d’arrivée. Si la zone d’arrivée reste occupée par quoi que ce soit d’assez volumineux pour empêcher la rematérialisation d’un personnage ou d’un objet téléporté, la téléportation cesse de fonctionner jusqu’à ce que la zone d’arrivée ait été suffisamment déblayée (au gardien des rêves de juger des cas litigieux).

","draconic":"oniros","duree":"HN, puis HN+12 heures","JR":"Aucun","cible":"","difficulte":"-11","portée":"","caseTMR":"collines","caseTMRspeciale":"","ptreve":"9"},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_oniros.webp","effects":[]} @@ -71,6 +71,6 @@ {"_id":"uwmEQo49H40Fwx10","name":"Métal en eau","permission":{"default":0,"jOzRscDxoXZWpGS6":3},"type":"sort","data":{"description":"

Le principe de la Transmutation Élémentale est de transformer un élément en un autre, par exemple le métal en bois, l’air en feu. Il n’existe de transmutation que pour les six premiers éléments. La matière dont sont composées les créatures, mortes ou vivantes, n’est jamais transmuée, y compris l’air contenu dans les poumons. Il existe 26 transmutations élémentales ; chacune est un sort à part entière, obéissant en tout point aux règles des sorts de zone.

\n

La transmutation a lieu dans la zone paramétrée et ciblée par le haut-rêvant. Tout ce qui appartient à l’élément impliqué est transmué instantanément sans discrimination. On ne peut pas faire de choix. Tant que dure la zone, tout nouvel objet appartenant à l’élément impliqué qui pénètre dans la zone, est immédiatement transmué à son tour. La zone peut fort bien être lancée sur un lieu où l’élément impliqué n’existe pas, par exemple Terre en Eau à 5 m du sol. Rien ne se produira au premier abord, mais toute pierre lancée dans la zone sera instantanément liquéfiée pour retomber sous forme de pluie.

\n

Tout objet transmué, situé ou entrant dans la zone, adopte aussitôt la forme que lui permet le nouvel élément. On peut obtenir de gracieuses torsades avec du feu transmué en bois ou en métal. La transmutation est définitive, même si l’objet sort de la zone. À la fin de la zone (HN), l’effet cesse d’opérer, mais la matière transmuée le demeure définitivement sans recouvrer non plus son élément d’origine.

\n

Quand une créature vivante se retrouve dans une zone de Transmutation Élémentale, bien que la matière dont elle est composée ne soit pas affectée en elle-même, elle subit l’effet naturel et normal du nouvel élément qui l’entoure, sans jet de résistance. Une créature prise dans une zone d’Air en Feu se retrouve dans un brasier qui la brûle, une créature nageant prise dans une zone d’Eau en Bois se retrouve enkystée dans un bloc de bois, etc.

\n

L’élément Eau correspondant à tous les liquides d’origine non animale, réellement aqueux ou non, c’est tout le liquide qui est transmué et non pas uniquement ses molécules de H2O, y compris tout ce qui peut y être dissout (sels, cristaux). L’eau d’un végétal (sève, jus d’un fruit) appartient à l’élément Bois, qui est celui du végétal, tant qu’il est contenu dans ce dernier. L’humus appartient intégralement à l’élément Terre, même s’il est composé en grande partie de matière végétale (Bois) non encore décomposée.

\n

Éléments d'arrivée

\n

X élément en Air : Pratiquement, l’ancien élément disparaît dans un courant d’air. L’air d’arrivée est toujours frais et pur.

\n

X élément en Terre : L’élément d’arrivée est une roche friable et fragile comme de la craie.

\n

X élément en Eau : L’eau nouvellement créée se comporte naturellement, attirée par la pesanteur : elle pleut, coule, cherche à s’infiltrer. Elle a la pureté de l’eau distillée.

\n

X élément en Feu : L’ancien élément devenu Feu n’est plus que flammes. Toutefois, pour que ces nouvelles flammes continuent à brûler, il leur faut un combustible, faute de quoi elles s’éteignent. Quand c’est l’Air qui est transmué en Feu, celui-ci demeure même sans combustible, car l’Air entourant la zone la comble immédiatement, devenant Feu à son tour. Le résultat est une sphère en permanente ignition. Il en va de même pour l’eau au centre d’une rivière par exemple.

\n

X élément en Bois : Le bois d’arrivée est un bois de qualité médiocre, du genre sapin, mais sec, sans aucune sève ni résine, combustible ou façonnable.

\n

X élément en Métal : Il ne s’agit toujours que des deux métaux les plus inertes : fer ou plomb (tirer à pile ou face). Le fer de transmutation n’est ni de l’acier ni du fer forgé, c’est du fer natif, mou et sans dureté. Un forgeron peut néanmoins le travailler.

\n

Objets magiques

\n

À mi-chemin entre les créatures et la matière inerte, les objets magiques ont droit à un jet de résistance pour ne pas être impliqués dans une transmutation. C’est un JR spécial, r0, où la protection magique du matériau est prise en guise de points de rêve (voir Résistance).

","draconic":"oniros","duree":"HN","JR":"Aucun","cible":"","difficulte":"-8","portée":"","caseTMR":"fleuve","caseTMRspeciale":"","ptreve":"6"},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_oniros.webp","effects":[]} {"_id":"vCXyW9EhhZrzNf8d","name":"Air en Eau","permission":{"default":0,"jOzRscDxoXZWpGS6":3},"type":"sort","data":{"description":"

Le principe de la Transmutation Élémentale est de transformer un élément en un autre, par exemple le métal en bois, l’air en feu. Il n’existe de transmutation que pour les six premiers éléments. La matière dont sont composées les créatures, mortes ou vivantes, n’est jamais transmuée, y compris l’air contenu dans les poumons. Il existe 26 transmutations élémentales ; chacune est un sort à part entière, obéissant en tout point aux règles des sorts de zone.

\n

La transmutation a lieu dans la zone paramétrée et ciblée par le haut-rêvant. Tout ce qui appartient à l’élément impliqué est transmué instantanément sans discrimination. On ne peut pas faire de choix. Tant que dure la zone, tout nouvel objet appartenant à l’élément impliqué qui pénètre dans la zone, est immédiatement transmué à son tour. La zone peut fort bien être lancée sur un lieu où l’élément impliqué n’existe pas, par exemple Terre en Eau à 5 m du sol. Rien ne se produira au premier abord, mais toute pierre lancée dans la zone sera instantanément liquéfiée pour retomber sous forme de pluie.

\n

Tout objet transmué, situé ou entrant dans la zone, adopte aussitôt la forme que lui permet le nouvel élément. On peut obtenir de gracieuses torsades avec du feu transmué en bois ou en métal. La transmutation est définitive, même si l’objet sort de la zone. À la fin de la zone (HN), l’effet cesse d’opérer, mais la matière transmuée le demeure définitivement sans recouvrer non plus son élément d’origine.

\n

Quand une créature vivante se retrouve dans une zone de Transmutation Élémentale, bien que la matière dont elle est composée ne soit pas affectée en elle-même, elle subit l’effet naturel et normal du nouvel élément qui l’entoure, sans jet de résistance. Une créature prise dans une zone d’Air en Feu se retrouve dans un brasier qui la brûle, une créature nageant prise dans une zone d’Eau en Bois se retrouve enkystée dans un bloc de bois, etc.

\n

L’élément Eau correspondant à tous les liquides d’origine non animale, réellement aqueux ou non, c’est tout le liquide qui est transmué et non pas uniquement ses molécules de H2O, y compris tout ce qui peut y être dissout (sels, cristaux). L’eau d’un végétal (sève, jus d’un fruit) appartient à l’élément Bois, qui est celui du végétal, tant qu’il est contenu dans ce dernier. L’humus appartient intégralement à l’élément Terre, même s’il est composé en grande partie de matière végétale (Bois) non encore décomposée.

\n

Éléments d'arrivée

\n

X élément en Air : Pratiquement, l’ancien élément disparaît dans un courant d’air. L’air d’arrivée est toujours frais et pur.

\n

X élément en Terre : L’élément d’arrivée est une roche friable et fragile comme de la craie.

\n

X élément en Eau : L’eau nouvellement créée se comporte naturellement, attirée par la pesanteur : elle pleut, coule, cherche à s’infiltrer. Elle a la pureté de l’eau distillée.

\n

X élément en Feu : L’ancien élément devenu Feu n’est plus que flammes. Toutefois, pour que ces nouvelles flammes continuent à brûler, il leur faut un combustible, faute de quoi elles s’éteignent. Quand c’est l’Air qui est transmué en Feu, celui-ci demeure même sans combustible, car l’Air entourant la zone la comble immédiatement, devenant Feu à son tour. Le résultat est une sphère en permanente ignition. Il en va de même pour l’eau au centre d’une rivière par exemple.

\n

X élément en Bois : Le bois d’arrivée est un bois de qualité médiocre, du genre sapin, mais sec, sans aucune sève ni résine, combustible ou façonnable.

\n

X élément en Métal : Il ne s’agit toujours que des deux métaux les plus inertes : fer ou plomb (tirer à pile ou face). Le fer de transmutation n’est ni de l’acier ni du fer forgé, c’est du fer natif, mou et sans dureté. Un forgeron peut néanmoins le travailler.

\n

Objets magiques

\n

À mi-chemin entre les créatures et la matière inerte, les objets magiques ont droit à un jet de résistance pour ne pas être impliqués dans une transmutation. C’est un JR spécial, r0, où la protection magique du matériau est prise en guise de points de rêve (voir Résistance).

","draconic":"oniros","duree":"HN","JR":"Aucun","cible":"","difficulte":"-8","portée":"","caseTMR":"cite","caseTMRspeciale":"","ptreve":"6"},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_oniros.webp","effects":[]} {"_id":"w9b03ooTpGRJPpWv","name":"Haubert d'Oniros (rituel)","permission":{"default":0,"jOzRscDxoXZWpGS6":3},"type":"sort","data":{"description":"

Le rituel de Haubert d’Oniros confère à la cible une protection de 5 points comme un haubert de mailles. Il ne s’ajoute pas toutefois à la protection préexistante, et si cette dernière est déjà de 5 ou plus, il n’a aucun effet. En cas de combat, la présence du Haubert d’Oniros n’empêche pas que l’amure véritable soit endommagée par les coups. Le Haubert d’Oniros n’a ni encombrement ni malus armure. Sa protection de 5 n’est pas diminuée face aux flèches ou aux carreaux.

\n

Le Haubert d’Oniros est la seule zone mobile personnelle qui est un rituel, et ne peut donc être mis en réserve ni attribué à une écaille d’activité. Il obéit par ailleurs à toutes les règles des ZMP (sauf la durée).

","draconic":"oniros","duree":"HN","JR":"r-8 et coût 1r","cible":"","difficulte":"-8","portée":"","caseTMR":"fleuve","caseTMRspeciale":"","ptreve":"7"},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_oniros.webp","effects":[]} -{"_id":"xOicgRMCUxJNmVzF","name":"Détection d'aura","type":"sort","img":"systems/foundryvtt-reve-de-dragon/icons/competence_vigilance.webp","data":{"description":"

Les rituels de Détection d’Aura peuvent indifféremment être accomplis par n’importe laquelle des quatre voies.

\n

Toutes les créatures vivantes animées (humains, humanoïdes, animaux) ont une caractéristique RÊVE. Les objets enchantés possèdent des points de rêve, de même que les produits de magie naturelle, comme certaines pierres de chance. Les entités de cauchemar, incarnées ou non, en ont également. Quelle qu’elle soit, la présence de rêve émet une aura, laquelle est détectable par Détection d’Aura. Parallèlement, toute cible d’un sort ou d’un rituel, émet une aura propre, quand bien même ladite cible ne possède pas de points de rêve (centre de zone, objet ou plante soumis à une illusion d’Hypnos). Cette aura est également détectable par Détection d’Aura.

\n

L’aura de présence de rêve se traduit par un halo bleuté constant ; l’aura résultant d’un effet magique par un halo parcouru de pulsations. Quand les deux auras sont présentes conjointement, le halo est pulsatif et d’un bleu plus foncé. On peut toujours effectuer Détection d’Aura sans aucun risque, il y a toujours une réponse. Soit une aura est perçue, constante ou pulsative, et l’on peut tenter une Lecture d’Aura pour en savoir plus ; soit aucune aura n’est perçue et il s’agit de matière inerte, sans rêve, non soumise à un sort.

","descriptionmj":"","draconic":"oniros","duree":"Instantanée","JR":"Aucun","cible":"","difficulte":"-3","portée":"","caseTMR":"sanctuaire","caseTMRspeciale":"","ptreve":"1","xp":0,"bonuscase":"","isrituel":true,"coutseuil":0,"portee":""},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"Q2G6GTdrotKzYGUC":3},"flags":{}} +{"_id":"xOicgRMCUxJNmVzF","name":"Détection d'aura","permission":{"default":0,"Q2G6GTdrotKzYGUC":3},"type":"sort","data":{"description":"

Les rituels de Détection d’Aura peuvent indifféremment être accomplis par n’importe laquelle des quatre voies.

\n

Toutes les créatures vivantes animées (humains, humanoïdes, animaux) ont une caractéristique RÊVE. Les objets enchantés possèdent des points de rêve, de même que les produits de magie naturelle, comme certaines pierres de chance. Les entités de cauchemar, incarnées ou non, en ont également. Quelle qu’elle soit, la présence de rêve émet une aura, laquelle est détectable par Détection d’Aura. Parallèlement, toute cible d’un sort ou d’un rituel, émet une aura propre, quand bien même ladite cible ne possède pas de points de rêve (centre de zone, objet ou plante soumis à une illusion d’Hypnos). Cette aura est également détectable par Détection d’Aura.

\n

L’aura de présence de rêve se traduit par un halo bleuté constant ; l’aura résultant d’un effet magique par un halo parcouru de pulsations. Quand les deux auras sont présentes conjointement, le halo est pulsatif et d’un bleu plus foncé. On peut toujours effectuer Détection d’Aura sans aucun risque, il y a toujours une réponse. Soit une aura est perçue, constante ou pulsative, et l’on peut tenter une Lecture d’Aura pour en savoir plus ; soit aucune aura n’est perçue et il s’agit de matière inerte, sans rêve, non soumise à un sort.

","draconic":"oniros","duree":"Instantanée","JR":"Aucun","cible":"","difficulte":"-3","portée":"","caseTMR":"sanctuaire","caseTMRspeciale":"","ptreve":"1","xp":0},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_vigilance.webp","effects":[]} {"_id":"yjT0VAB59BRdIw4U","name":"Eau en métal","permission":{"default":0,"jOzRscDxoXZWpGS6":3},"type":"sort","data":{"description":"

Le principe de la Transmutation Élémentale est de transformer un élément en un autre, par exemple le métal en bois, l’air en feu. Il n’existe de transmutation que pour les six premiers éléments. La matière dont sont composées les créatures, mortes ou vivantes, n’est jamais transmuée, y compris l’air contenu dans les poumons. Il existe 26 transmutations élémentales ; chacune est un sort à part entière, obéissant en tout point aux règles des sorts de zone.

\n

La transmutation a lieu dans la zone paramétrée et ciblée par le haut-rêvant. Tout ce qui appartient à l’élément impliqué est transmué instantanément sans discrimination. On ne peut pas faire de choix. Tant que dure la zone, tout nouvel objet appartenant à l’élément impliqué qui pénètre dans la zone, est immédiatement transmué à son tour. La zone peut fort bien être lancée sur un lieu où l’élément impliqué n’existe pas, par exemple Terre en Eau à 5 m du sol. Rien ne se produira au premier abord, mais toute pierre lancée dans la zone sera instantanément liquéfiée pour retomber sous forme de pluie.

\n

Tout objet transmué, situé ou entrant dans la zone, adopte aussitôt la forme que lui permet le nouvel élément. On peut obtenir de gracieuses torsades avec du feu transmué en bois ou en métal. La transmutation est définitive, même si l’objet sort de la zone. À la fin de la zone (HN), l’effet cesse d’opérer, mais la matière transmuée le demeure définitivement sans recouvrer non plus son élément d’origine.

\n

Quand une créature vivante se retrouve dans une zone de Transmutation Élémentale, bien que la matière dont elle est composée ne soit pas affectée en elle-même, elle subit l’effet naturel et normal du nouvel élément qui l’entoure, sans jet de résistance. Une créature prise dans une zone d’Air en Feu se retrouve dans un brasier qui la brûle, une créature nageant prise dans une zone d’Eau en Bois se retrouve enkystée dans un bloc de bois, etc.

\n

L’élément Eau correspondant à tous les liquides d’origine non animale, réellement aqueux ou non, c’est tout le liquide qui est transmué et non pas uniquement ses molécules de H2O, y compris tout ce qui peut y être dissout (sels, cristaux). L’eau d’un végétal (sève, jus d’un fruit) appartient à l’élément Bois, qui est celui du végétal, tant qu’il est contenu dans ce dernier. L’humus appartient intégralement à l’élément Terre, même s’il est composé en grande partie de matière végétale (Bois) non encore décomposée.

\n

Éléments d'arrivée

\n

X élément en Air : Pratiquement, l’ancien élément disparaît dans un courant d’air. L’air d’arrivée est toujours frais et pur.

\n

X élément en Terre : L’élément d’arrivée est une roche friable et fragile comme de la craie.

\n

X élément en Eau : L’eau nouvellement créée se comporte naturellement, attirée par la pesanteur : elle pleut, coule, cherche à s’infiltrer. Elle a la pureté de l’eau distillée.

\n

X élément en Feu : L’ancien élément devenu Feu n’est plus que flammes. Toutefois, pour que ces nouvelles flammes continuent à brûler, il leur faut un combustible, faute de quoi elles s’éteignent. Quand c’est l’Air qui est transmué en Feu, celui-ci demeure même sans combustible, car l’Air entourant la zone la comble immédiatement, devenant Feu à son tour. Le résultat est une sphère en permanente ignition. Il en va de même pour l’eau au centre d’une rivière par exemple.

\n

X élément en Bois : Le bois d’arrivée est un bois de qualité médiocre, du genre sapin, mais sec, sans aucune sève ni résine, combustible ou façonnable.

\n

X élément en Métal : Il ne s’agit toujours que des deux métaux les plus inertes : fer ou plomb (tirer à pile ou face). Le fer de transmutation n’est ni de l’acier ni du fer forgé, c’est du fer natif, mou et sans dureté. Un forgeron peut néanmoins le travailler.

\n

Objets magiques

\n

À mi-chemin entre les créatures et la matière inerte, les objets magiques ont droit à un jet de résistance pour ne pas être impliqués dans une transmutation. C’est un JR spécial, r0, où la protection magique du matériau est prise en guise de points de rêve (voir Résistance).

","draconic":"oniros","duree":"HN","JR":"Aucun","cible":"","difficulte":"-6","portée":"","caseTMR":"gouffre","caseTMRspeciale":"","ptreve":"4"},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_oniros.webp","effects":[]} {"_id":"zybBfwq3EkMHQ0pF","name":"Invulnérabilité chromatique au rouge","permission":{"default":0,"jOzRscDxoXZWpGS6":3},"type":"sort","data":{"description":"

Les sorts d’Invulnérabilité Chromatique ne peuvent être recherchés/synthétisés qu’en ayant compris le @Item[5YK6q2KuKArkvDWy]{Le Principe Drachromatique} (voir Les grimoires, p218).

\n

Cette zone mobile personnelle, obéissant à toutes les règles des ZMP (sauf la durée), confère une protection supplémentaire (c’est-à-dire en plus de l’armure réellement portée), sous réserve que la cible soit à 75 % ou plus d’une même couleur, rouge, orange, etc. Plusieurs nuances d’une même couleur sont possibles, comme par exemple le tigre vert, nuancé de deux tons de verts, ou un Cyan, considéré bleu à 90 %. Les vêtements peuvent servir dans ce but, tous teintés d’un même coloris.

\n

La protection varie de +2 à +8, selon la couleur : elle est égale aux points de rêve nécessaires. Par exemple, la protection chromatique au rouge r2 confère une protection de +2 ; celle au bleu r6 une protection de +6.

\n

Ce sort est incompatible avec le rituel @Item[qW1vAyoqrvxG0tDn]{Haubert d'Oniros (rituel)}.

\n

Vêtements et équipement peuvent avoir été colorés dans la teinte voulue par une Transmutation Chromatique (voir page suivante) mais pas par une illusion d’Hypnos. Ces illusions ne s’appliquent en effet qu’aux yeux des spectateurs, et la magie d’Oniros, quant à elle, n’en est pas dupe.

\n

Aucune zone d’Invulnérabilité Chromatique n’a jamais pu être envisagée pour le blanc, le gris, le noir, non plus que pour les bruns, beiges, ocres, fauves, etc.

\n

Il existe six types d’Invulnérabilité Chromatique, chacun étant un sort distinct.

","draconic":"oniros","duree":"HN","JR":"r-8 et coût 1r","cible":"","difficulte":"-6","portée":"","caseTMR":"collines","caseTMRspeciale":"","ptreve":"2"},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_oniros.webp","effects":[]} diff --git a/packs/sorts-thanatos.db b/packs/sorts-thanatos.db index 69adbee7..eb1dedff 100644 --- a/packs/sorts-thanatos.db +++ b/packs/sorts-thanatos.db @@ -11,7 +11,7 @@ {"_id":"O1QllxIvIkWxntmO","name":"Animer un squelette","permission":{"default":0,"6ibmdmaeRSMTjU4c":3},"type":"sort","data":{"description":"

En invoquant les forces du cauchemar à venir hanter un corps mort, le haut-rêvant de Thanatos crée un hideux simulacre de vie. Sous l'effet du rituel, le cadavre se décompose à vue d'oeil, se dépouillant de toute chair, jusqu'à ce qu'il n'en reste plus que les os, magiquement liés. Le squelette se redresse alors en position verticale, capable de se déplacer sur ses jambes en une parodie de vie réelle, utilisant se smains griffues pour attaquer. Ainsi créé, le squelette est en tout point semblable à l'entité de cauchemar incarnée du même nom, tant au niveau de ses caractéristiques que de ses compétences (voir livre III, page 225). Sa caractéristique TAILLE est celle du cadavre utilisé, sa caractéristique RÊVE est égale au nombre de points de rêve dépensés par le haut-rêvant, sachant que comme pour les 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 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 demi-surprise jusqu'à la fin du round suivant.

\n

Un squelette invoqué est aux ordres de son invocateur et n'agit qu'aux ordres reçus. Pour donner un nouvel ordre à son squelette, le haut-rêvant de Thanatos doit s'en trouver à une portée maximale égale à E1. A la mort de son invocateur, le squelette n'est pas détruit, mais devient une entité sauvage, se comportant librement comme l'entitéde cauchemar incarnée du même nom.

","draconic":"thanatos","duree":"Permanente","JR":"Aucun","cible":"Un cadavre","difficulte":"-9","portée":"","caseTMR":"necropole","caseTMRspeciale":"","ptreve":"1+","portee":"","isrituel":true},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_thanatos.webp","effects":[]} {"_id":"W0JXIoChz3IXuaCc","name":"Putrescence","permission":{"default":0,"6ibmdmaeRSMTjU4c":3},"type":"sort","data":{"description":"

L'effet de Putrescence ne peut être ciblé que sur un objet. L'effet est un vieilllissement instantané de plusieurs années, supposé s'être accompli dans les pires concditions, avec pour résultat un délabrement, une putrescence de l'objet. Le vieillissement est de 10 ans par point de rêve dépensé.

\n

Dans tous les cas, c'est au gardien des rêves de juger de l'état final de l'objet en se souvenant que les conditions de vieillissement sont censées avoir été très mauvaises : humidité, moisissure, chaud et froid, etc. Ainsi dix ans seront suffisants pour venir à bout du tissu et du papier, vingt ans pour du parchemin ou du cuir souple, trente pour du cuir épais et du bois léger. Quarante ans et plus auront presque entièrement dévoré de rouille le métal ferreux et corrompu le bois épais, tout dépendant de leur qualité initiale. Noter par contre que verre et céramique sont pratiquement imprutescibles. La putrescence étant instantanée et définitive, l'objet altéré ne dispense aucune aura. 

","draconic":"thanatos","duree":"Permanente","JR":"Aucun","cible":"Un objet","difficulte":"-8","portée":"","caseTMR":"marais","caseTMRspeciale":"","ptreve":"1+","portee":""},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_thanatos.webp","effects":[]} {"_id":"XldJiyXL4gSrfx4t","name":"Surdité","permission":{"default":0,"6ibmdmaeRSMTjU4c":3},"type":"sort","data":{"description":"

Quand la victime est entièrement possédée de corps, le haut-rêvant de Thanatos peut commencer l'envoûtement de Surdité. Chaque ensemble de 2 points de rêve dépensés (2r), fait perdre 1 point de caractéristique OUÏE à la victime. A zéro point d'OUÏE, elle est totalement sourde. La surdité 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 son OUÏE.

","draconic":"thanatos","duree":"Illimitée","JR":"Aucun","cible":"Relique","difficulte":"-6","portée":"","caseTMR":"gouffre","caseTMRspeciale":"","ptreve":"2+","portee":""},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_thanatos.webp","effects":[]} -{"_id":"Y4r9kTN2brWC2N0n","name":"Lecture d'aura","type":"sort","img":"systems/foundryvtt-reve-de-dragon/icons/competence_vigilance.webp","data":{"description":"

Les rituels de Lecture d’Aura peuvent indifféremment être accomplis par n’importe laquelle des quatre voies.

\n

Ce rituel permet d’approfondir les informations fournies par Détection d’Aura. Pratiquer Lecture d’Aura quand il n’y a pas d’aura revient à demander une magie impossible et crée immédiatement une déchirure du rêve.

\n

Lecture d’Aura est effectuée en plusieurs étapes, toutes étant de difficulté R-3 et coûtant 3 points de rêve. La première a toujours lieu dans un sanctuaire et ne fait que révéler dans quel(s) autre(s) genre(s) de case(s) le haut-rêvant doit se rendre pour continuer sa lecture. Là, il apprend quel genre de magie a été produit ou à quel type de rêve il a affaire, de même que les cases spécifiques concernées. Enfin dans les cases spécifiques, le haut-rêvant peut apprendre la force du rêve ou de la magie en cours, c’est-à-dire pratiquement la difficulté et le nombre de points de rêve impliqués, information indispensable dans l’optique d’une annulation de magie.

\n

Lecture d’Aura révèle également la couleur de l’aura (fixe ou pulsative) comme Détection d’Aura. Pour les créatures vivantes, on peut donc sauter l’étape de Détection d’Aura et commencer directement par la lecture, puisqu’on est sûr de trouver une aura. Dans les autres cas, il est plus prudent de commencer par la détection si, en l’absence finale d’une aura, on ne veut pas créer de magie impossible. Effectuée sur une créature non soumise à un effet magique ni sous l’emprise d’une entité, Lecture d’Aura indique toujours le Fleuve. Là, dans n’importe quelle case du Fleuve, le haut-rêvant se contente d’apprendre qu’il a affaire à une créature vivante et douée de rêve.

","descriptionmj":"","draconic":"oniros","duree":"Instantanée","JR":"Aucun","cible":"","difficulte":"-3","portée":"","caseTMR":"special","caseTMRspeciale":"Sanctuaire / variable","ptreve":"3","xp":0,"bonuscase":"","isrituel":true,"coutseuil":0,"portee":""},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"Q2G6GTdrotKzYGUC":3},"flags":{}} +{"_id":"Y4r9kTN2brWC2N0n","name":"Lecture d'aura","permission":{"default":0,"Q2G6GTdrotKzYGUC":3},"type":"sort","data":{"description":"

Les rituels de Lecture d’Aura peuvent indifféremment être accomplis par n’importe laquelle des quatre voies.

\n

Ce rituel permet d’approfondir les informations fournies par Détection d’Aura. Pratiquer Lecture d’Aura quand il n’y a pas d’aura revient à demander une magie impossible et crée immédiatement une déchirure du rêve.

\n

Lecture d’Aura est effectuée en plusieurs étapes, toutes étant de difficulté R-3 et coûtant 3 points de rêve. La première a toujours lieu dans un sanctuaire et ne fait que révéler dans quel(s) autre(s) genre(s) de case(s) le haut-rêvant doit se rendre pour continuer sa lecture. Là, il apprend quel genre de magie a été produit ou à quel type de rêve il a affaire, de même que les cases spécifiques concernées. Enfin dans les cases spécifiques, le haut-rêvant peut apprendre la force du rêve ou de la magie en cours, c’est-à-dire pratiquement la difficulté et le nombre de points de rêve impliqués, information indispensable dans l’optique d’une annulation de magie.

\n

Lecture d’Aura révèle également la couleur de l’aura (fixe ou pulsative) comme Détection d’Aura. Pour les créatures vivantes, on peut donc sauter l’étape de Détection d’Aura et commencer directement par la lecture, puisqu’on est sûr de trouver une aura. Dans les autres cas, il est plus prudent de commencer par la détection si, en l’absence finale d’une aura, on ne veut pas créer de magie impossible. Effectuée sur une créature non soumise à un effet magique ni sous l’emprise d’une entité, Lecture d’Aura indique toujours le Fleuve. Là, dans n’importe quelle case du Fleuve, le haut-rêvant se contente d’apprendre qu’il a affaire à une créature vivante et douée de rêve.

","draconic":"oniros","duree":"Instantanée","JR":"Aucun","cible":"","difficulte":"-3","portée":"","caseTMR":"special","caseTMRspeciale":"Sanctuaire / variable","ptreve":"3","xp":0},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_vigilance.webp","effects":[]} {"_id":"cM9eo2VuJSCkIZvd","name":"Cécité","permission":{"default":0,"6ibmdmaeRSMTjU4c":3},"type":"sort","data":{"description":"

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.

","draconic":"thanatos","duree":"Illimitée","JR":"Aucun","cible":"Relique","difficulte":"-8","portée":"","caseTMR":"cite","caseTMRspeciale":"","ptreve":"2+","portee":""},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_thanatos.webp","effects":[]} {"_id":"dK54iZkb7ypIuKwn","name":"Peur thanataire","permission":{"default":0,"6ibmdmaeRSMTjU4c":3},"type":"sort","data":{"description":"

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.

\n

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.

","draconic":"thanatos","duree":"HN","JR":"r-8","cible":"Un objet","difficulte":"-9","portée":"","caseTMR":"lac","caseTMRspeciale":"","ptreve":"1+","portee":""},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_thanatos.webp","effects":[]} {"_id":"gZHrkEnR88mEv67I","name":"Griffe de Thanatos *","permission":{"default":0,"6ibmdmaeRSMTjU4c":3},"type":"sort","data":{"description":"

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 points de vie é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.

\n

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.

","draconic":"thanatos","duree":"Permanente","JR":"Aucun","cible":"","difficulte":"-8","portée":"","caseTMR":"necropole","caseTMRspeciale":"","ptreve":"8","portee":"","isrituel":true,"coutseuil":1},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_thanatos.webp","effects":[]} @@ -20,6 +20,6 @@ {"_id":"wGXeubRhLPScDkNF","name":"Possession d'Esprit","permission":{"default":0,"6ibmdmaeRSMTjU4c":3},"type":"sort","data":{"description":"

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. 

\n

Note. Le haut-rêvant ne fait que contrôler 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.

","draconic":"thanatos","duree":"Illimitée","JR":"Avec HN r-9, sans HN r-8","cible":"Relique","difficulte":"-9","portée":"","caseTMR":"lac","caseTMRspeciale":"","ptreve":"2+","portee":"","isrituel":true},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_thanatos.webp","effects":[]} {"_id":"wuqqLld48IagimXp","name":"Poing de Thanatos","permission":{"default":0,"6ibmdmaeRSMTjU4c":3},"type":"sort","data":{"description":"

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.

","draconic":"thanatos","duree":"Instantanée","JR":"r-8","cible":"Toutes créatures","difficulte":"-6","portée":"","caseTMR":"plaines","caseTMRspeciale":"","ptreve":"1+","portee":""},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_thanatos.webp","effects":[]} {"_id":"xFkdsI0FnhCCszDR","name":"Métamorphose en bête","permission":{"default":0,"6ibmdmaeRSMTjU4c":3},"type":"sort","data":{"description":"

L'envoûtement de Métamorphose en bête peut être accompli sur une possession de corps ou d'esprit. Il s'agit de deux métamorphoses différentes devant faire l'objet d'envoûtements séparés.

\n

L'accomplissant sur une victime possédée d'esprit, le haut-rêvant de Thanatos transforme le mental de cette dernière en celui d'un animal de son choix. Le corps physique de la victime reste inchangé, mais son esprit, son comportement, ses instincts deviennent ceux de l'animal. La victime perd le sens de la parole et de la compréhension du langage pour ne plus s'exprimer que par des cris : aboiements, miaulements, sifflements, caquètements, etc. Le tout dans un corps normal.

\n

Sur une victime possédée de corps, le haut-rêvant transforme réellement son corps en celui d'un animal de son choix, dont la TAILLE finale ne peut être supérieure à celle de la victime et doit être au minimum de 1 (souris). Il ne s'agit pas d'une illusion : la transformation est réelle. Le nouveau gosier de la victime l'empêche de parler, mais elle continue à comprendre le langage. Son intelligence et son mental restent inchangés, mais dans un corps d'animal. Un haut-rêvant métamorphosé peut continuer à monter en TMR mais doit posséder l'équivalent d'un doigt pour cibler des sorts ailleurs que sur lui-même.

\n

Si les deux métamorphoses, d'esprit ou de corps, sont effectuées conjointement, la victime devient en tout point un animal réel.

\n

Annuler l'une ou l'autre possession brise en même temps l'envoûtement de Métamorphose correspondant, et la victime recouvre une part de son identité.

","draconic":"thanatos","duree":"Illimitée","JR":"Aucun","cible":"Relique","difficulte":"-10","portée":"","caseTMR":"fleuve","caseTMRspeciale":"","ptreve":"10","portee":""},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_thanatos.webp","effects":[]} -{"_id":"xOicgRMCUxJNmVzF","name":"Détection d'aura","type":"sort","img":"systems/foundryvtt-reve-de-dragon/icons/competence_vigilance.webp","data":{"description":"

Les rituels de Détection d’Aura peuvent indifféremment être accomplis par n’importe laquelle des quatre voies.

\n

Toutes les créatures vivantes animées (humains, humanoïdes, animaux) ont une caractéristique RÊVE. Les objets enchantés possèdent des points de rêve, de même que les produits de magie naturelle, comme certaines pierres de chance. Les entités de cauchemar, incarnées ou non, en ont également. Quelle qu’elle soit, la présence de rêve émet une aura, laquelle est détectable par Détection d’Aura. Parallèlement, toute cible d’un sort ou d’un rituel, émet une aura propre, quand bien même ladite cible ne possède pas de points de rêve (centre de zone, objet ou plante soumis à une illusion d’Hypnos). Cette aura est également détectable par Détection d’Aura.

\n

L’aura de présence de rêve se traduit par un halo bleuté constant ; l’aura résultant d’un effet magique par un halo parcouru de pulsations. Quand les deux auras sont présentes conjointement, le halo est pulsatif et d’un bleu plus foncé. On peut toujours effectuer Détection d’Aura sans aucun risque, il y a toujours une réponse. Soit une aura est perçue, constante ou pulsative, et l’on peut tenter une Lecture d’Aura pour en savoir plus ; soit aucune aura n’est perçue et il s’agit de matière inerte, sans rêve, non soumise à un sort.

","descriptionmj":"","draconic":"oniros","duree":"Instantanée","JR":"Aucun","cible":"","difficulte":"-3","portée":"","caseTMR":"sanctuaire","caseTMRspeciale":"","ptreve":"1","xp":0,"bonuscase":"","isrituel":true,"coutseuil":0,"portee":""},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"Q2G6GTdrotKzYGUC":3},"flags":{}} +{"_id":"xOicgRMCUxJNmVzF","name":"Détection d'aura","permission":{"default":0,"Q2G6GTdrotKzYGUC":3},"type":"sort","data":{"description":"

Les rituels de Détection d’Aura peuvent indifféremment être accomplis par n’importe laquelle des quatre voies.

\n

Toutes les créatures vivantes animées (humains, humanoïdes, animaux) ont une caractéristique RÊVE. Les objets enchantés possèdent des points de rêve, de même que les produits de magie naturelle, comme certaines pierres de chance. Les entités de cauchemar, incarnées ou non, en ont également. Quelle qu’elle soit, la présence de rêve émet une aura, laquelle est détectable par Détection d’Aura. Parallèlement, toute cible d’un sort ou d’un rituel, émet une aura propre, quand bien même ladite cible ne possède pas de points de rêve (centre de zone, objet ou plante soumis à une illusion d’Hypnos). Cette aura est également détectable par Détection d’Aura.

\n

L’aura de présence de rêve se traduit par un halo bleuté constant ; l’aura résultant d’un effet magique par un halo parcouru de pulsations. Quand les deux auras sont présentes conjointement, le halo est pulsatif et d’un bleu plus foncé. On peut toujours effectuer Détection d’Aura sans aucun risque, il y a toujours une réponse. Soit une aura est perçue, constante ou pulsative, et l’on peut tenter une Lecture d’Aura pour en savoir plus ; soit aucune aura n’est perçue et il s’agit de matière inerte, sans rêve, non soumise à un sort.

","draconic":"oniros","duree":"Instantanée","JR":"Aucun","cible":"","difficulte":"-3","portée":"","caseTMR":"sanctuaire","caseTMRspeciale":"","ptreve":"1","xp":0},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_vigilance.webp","effects":[]} {"_id":"xdWVcaPvSH8tNZIZ","name":"Tâche","permission":{"default":0,"6ibmdmaeRSMTjU4c":3},"type":"sort","data":{"description":"

Quand la victime est entièrement possédée d'esprit, le haut-rêvant de Thanatos peut l'obliger à accomplir une certaine tâche ou quête. Comem avec Interdiction, la tâche doit être possible par la VOLONTÉ normale de la victime : dors ! ou meurs ! sont impossibles. L'ordre doit être formulé de façon très précise, comme pour Interdiction, sauf que cette fois le seul verbe possible doit être à l'impératif affirmatif. C'est pareillement au gardien des rêves de juger des interprétations litigieuses. Exemples : monte en haut de la tour ; brûle le livre noir, mets le feu au château, assassine le roi, etc. La victime s'efforcera d'accomplir la tâche par les moyens les plus rapides et les plus efficaces. L'effet du sort prend fin dès que la tâche est accomplie ou que survient la fin de l'heure de la naissance de la victime. Le haut-rêvant peut renouveler la tâche de jour en jour ou en apporter une nouvelle, mais ne peut pas en faire coexister deux simultanément. Annuler la possession brise en même temps l'envoûtement de Tâche, et la victime recouvre instantanément toute sa liberté.

","draconic":"thanatos","duree":"HN de la victime","JR":"Aucun","cible":"Relique","difficulte":"-8","portée":"","caseTMR":"foret","caseTMRspeciale":"","ptreve":"8","portee":""},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_thanatos.webp","effects":[]} {"_id":"yCrVicu7rLWmMwxe","name":"Animer un zombi","permission":{"default":0,"6ibmdmaeRSMTjU4c":3},"type":"sort","data":{"description":"

Le principe d'animation du zombi est semblable à celui du squelette. Comme ce dernier, sa TAILLE est celle du cadavre utilisé, son RÊVE est égal aux points de rêve dépensés, avec un maximum égal à la TAILLE (voir le Livre III, page 225). Comme le squelette, le zombi n'obéit qu'aux ordres reçus, mêmes règles d'application.

\n

La différence esssentielle est que le rituel d'Animation de Zombi interrompt totalement le processus de putréfaction au lieu de l'accélérer. Une fois animé, un zombi reste dans l'état physique qui était le seien lors de l'accomplissement du rituel, sans plus jamais subir la moindre trace de décomposition. La conséquence est qu'un cadavre frais, dont la mort ne remonte qu'à quelques minutes ou quelques heures, une fois animé, ne se distingue des vivants que par une pâleur inhabituelle, un regard un peu fixe, et des lèvres un peu exsangues, mais pour peu qu'il ne fasse pas très clair ou que son maître l'ait bien emmitouflé, capable de passer pour un vivant. Pour cette raison, les zombis sont souvent préférés aux squelettes par les haut-rêvants de Thanatos plus circonspects et moins enclins au tape-à-l'oeil.

","draconic":"thanatos","duree":"Permanente","JR":"Aucun","cible":"Un cadavre","difficulte":"-7","portée":"","caseTMR":"necropole","caseTMRspeciale":"","ptreve":"1+","portee":"","isrituel":true},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_thanatos.webp","effects":[]} diff --git a/templates/actor-sheet.html b/templates/actor-sheet.html index e848e5bc..456cc734 100644 --- a/templates/actor-sheet.html +++ b/templates/actor-sheet.html @@ -286,7 +286,7 @@ {{#each combat as |arme key|}}
  • + data-arme-name="{{arme.name}}" data-competence-name="{{arme.system.competence}}" > {{#if arme.img}} @@ -295,10 +295,10 @@ {{arme.name}} - {{arme.data.initiative}} - {{arme.data.competence}} - {{numberFormat arme.data.niveau decimals=0 sign=true}} - {{numberFormat arme.data.dommagesReels decimals=0 sign=true}} + {{arme.system.initiative}} + {{arme.system.competence}} + {{numberFormat arme.system.niveau decimals=0 sign=true}} + {{numberFormat arme.system.dommagesReels decimals=0 sign=true}}
  • {{/each}} {{#each esquives as |esq key|}} diff --git a/templates/item-monnaie-sheet.html b/templates/item-monnaie-sheet.html index 1ec65299..83f80417 100644 --- a/templates/item-monnaie-sheet.html +++ b/templates/item-monnaie-sheet.html @@ -10,19 +10,19 @@
    - +
    {{#if isGM}} - + {{else}} {{/if}}
    - +
    {{>"systems/foundryvtt-reve-de-dragon/templates/partial-item-description.html"}} diff --git a/templates/item-munition-sheet.html b/templates/item-munition-sheet.html index f4587019..754c2fa5 100644 --- a/templates/item-munition-sheet.html +++ b/templates/item-munition-sheet.html @@ -10,19 +10,19 @@
    - +
    - +
    - +
    - +
    {{>"systems/foundryvtt-reve-de-dragon/templates/partial-item-description.html"}} diff --git a/templates/item-musique-sheet.html b/templates/item-musique-sheet.html index 0e6ab9d7..444bb1c0 100644 --- a/templates/item-musique-sheet.html +++ b/templates/item-musique-sheet.html @@ -10,11 +10,11 @@
    - +
    - +
    {{>"systems/foundryvtt-reve-de-dragon/templates/partial-item-description.html"}} diff --git a/templates/item-nombreastral-sheet.html b/templates/item-nombreastral-sheet.html index 3e343898..7bd827d6 100644 --- a/templates/item-nombreastral-sheet.html +++ b/templates/item-nombreastral-sheet.html @@ -10,19 +10,19 @@
    - +
    - +
    - +
    - +
    diff --git a/templates/item-nourritureboisson-sheet.html b/templates/item-nourritureboisson-sheet.html index fe8dc057..f0951c62 100644 --- a/templates/item-nourritureboisson-sheet.html +++ b/templates/item-nourritureboisson-sheet.html @@ -10,48 +10,48 @@
    - +
    - +
    {{#if data.boisson}}
    - +
    - +
    {{#if data.alcoolise}}
    - +
    {{/if}} {{/if}}
    - +
    - +
    -
    - +
    - +
    {{>"systems/foundryvtt-reve-de-dragon/templates/partial-item-description.html"}} diff --git a/templates/item-objet-sheet.html b/templates/item-objet-sheet.html index 0fde4701..f86683f5 100644 --- a/templates/item-objet-sheet.html +++ b/templates/item-objet-sheet.html @@ -10,23 +10,23 @@
    - +
    - +
    - +
    - +
    - +
    {{>"systems/foundryvtt-reve-de-dragon/templates/partial-item-description.html"}} diff --git a/templates/item-oeuvre-sheet.html b/templates/item-oeuvre-sheet.html index c14c009f..e0079929 100644 --- a/templates/item-oeuvre-sheet.html +++ b/templates/item-oeuvre-sheet.html @@ -10,7 +10,7 @@
    - {{#select data.default_carac}} {{>"systems/foundryvtt-reve-de-dragon/templates/competence-carac-defaut.html"}} {{/select}} @@ -18,7 +18,7 @@
    - {{#select data.competence}} {{#each competences as |competence key|}} @@ -28,11 +28,11 @@
    - +
    - +
    {{>"systems/foundryvtt-reve-de-dragon/templates/partial-item-description.html"}} diff --git a/templates/item-ombre-sheet.html b/templates/item-ombre-sheet.html index f87a937f..f79c3130 100644 --- a/templates/item-ombre-sheet.html +++ b/templates/item-ombre-sheet.html @@ -10,7 +10,7 @@
    - +
    {{>"systems/foundryvtt-reve-de-dragon/templates/partial-item-description.html"}} diff --git a/templates/item-poison-sheet.html b/templates/item-poison-sheet.html index f9a1e56d..7411aa60 100644 --- a/templates/item-poison-sheet.html +++ b/templates/item-poison-sheet.html @@ -14,33 +14,33 @@
    - +
    {{#if (or isGM data.identifie)}}
    - +
    - +
    - +
    - +
    - +
    {{#if (or isGM data.remedesconnus)}}
    - +
    {{/if}} {{/if}} diff --git a/templates/item-possession-sheet.html b/templates/item-possession-sheet.html index 011a1e0f..4a13aa17 100644 --- a/templates/item-possession-sheet.html +++ b/templates/item-possession-sheet.html @@ -10,15 +10,15 @@
    - +
    - +
    - +
    diff --git a/templates/item-potion-sheet.html b/templates/item-potion-sheet.html index 3fadb898..62feb46d 100644 --- a/templates/item-potion-sheet.html +++ b/templates/item-potion-sheet.html @@ -15,19 +15,19 @@
    - +
    - +
    - +
    - {{#select data.rarete}} {{>"systems/foundryvtt-reve-de-dragon/templates/enum-rarete.html"}} {{/select}} @@ -35,7 +35,7 @@
    - {{#select data.categorie}} {{>"systems/foundryvtt-reve-de-dragon/templates/enum-categorie-potion.html"}} {{/select}} @@ -44,47 +44,47 @@ {{#if isHerbe}}
    - {{selectOptions herbesSoins selected=data.herbe localize=false}}
    - +
    - +
    {{/if}} {{#if isRepos}}
    - {{selectOptions herbesRepos selected=data.herbe localize=false}}
    - +
    - +
    - +
    {{/if}} {{#if data.magique}}
    - +
    - +
    {{#if isHerbe}}
    diff --git a/templates/item-queue-sheet.html b/templates/item-queue-sheet.html index f87a937f..f79c3130 100644 --- a/templates/item-queue-sheet.html +++ b/templates/item-queue-sheet.html @@ -10,7 +10,7 @@
    - +
    {{>"systems/foundryvtt-reve-de-dragon/templates/partial-item-description.html"}} diff --git a/templates/item-recettealchimique-sheet.html b/templates/item-recettealchimique-sheet.html index d894d3f8..d0f46e85 100644 --- a/templates/item-recettealchimique-sheet.html +++ b/templates/item-recettealchimique-sheet.html @@ -10,30 +10,30 @@
    - +
    - {{editor content=data.manipulation_update target="data.manipulation" button=true owner=owner editable=editable}} + {{editor data.manipulation_update target="system.manipulation" button=true owner=owner editable=editable}}
    - {{editor content=data.utilisation target="data.utilisation" button=true owner=owner editable=editable}} + {{editor data.utilisation target="system.utilisation" button=true owner=owner editable=editable}}
    - {{editor content=data.enchantement target="data.enchantement" button=true owner=owner editable=editable}} + {{editor data.enchantement target="system.enchantement" button=true owner=owner editable=editable}}
    - {{editor content=data.sureffet target="data.sureffet" button=true owner=owner editable=editable}} + {{editor data.sureffet target="system.sureffet" button=true owner=owner editable=editable}}
    diff --git a/templates/item-recettecuisine-sheet.html b/templates/item-recettecuisine-sheet.html index 21189788..944580a0 100644 --- a/templates/item-recettecuisine-sheet.html +++ b/templates/item-recettecuisine-sheet.html @@ -10,28 +10,28 @@
    - +
    - -
    + +
    system
    - +
    - +
    - +
    - {{editor content=data.ingredients target="data.ingredients" button=true owner=owner editable=editable}} + {{editor data.ingredients target="system.ingredients" button=true owner=owner editable=editable}}
    diff --git a/templates/item-sheet.html b/templates/item-sheet.html index ee410077..76b83b11 100644 --- a/templates/item-sheet.html +++ b/templates/item-sheet.html @@ -5,11 +5,11 @@

    - +
    - +
    @@ -25,7 +25,7 @@ {{!-- Description Tab --}}
    - {{editor content=data.description target="data.description" button=true owner=owner editable=editable}} + {{editor data.description target="system.description" button=true owner=owner editable=editable}}
    {{!-- Attributes Tab --}} @@ -41,14 +41,14 @@
      {{#each data.attributes as |attr key|}}
    1. - + {{#if attr.isCheckbox}} - + {{else}} - + {{/if}} - - +
      - Sign. - Part. -
      - +
      {{#if data.ephemere}}
      - +
      {{/if}}
      diff --git a/templates/item-sort-sheet.html b/templates/item-sort-sheet.html index 3be2682e..878ddf93 100644 --- a/templates/item-sort-sheet.html +++ b/templates/item-sort-sheet.html @@ -10,7 +10,7 @@
      - {{#select data.draconic}} {{>"systems/foundryvtt-reve-de-dragon/templates/sort-draconic.html"}} {{/select}} @@ -27,43 +27,43 @@
      - +
      - +
      - +
      - +
      - +
      - +
      - +
      - +
      - +
      - +
      {{#if owner}} {{#each bonusCaseList as |bcData key|}} diff --git a/templates/item-tache-sheet.html b/templates/item-tache-sheet.html index fac2fe3d..0bf36919 100644 --- a/templates/item-tache-sheet.html +++ b/templates/item-tache-sheet.html @@ -10,8 +10,8 @@
      - + {{#select data.carac}} {{#each caracList as |carac key|}} {{/each}} @@ -20,8 +20,8 @@
      - + {{#select data.competence}} {{#each competences as |competence key|}} {{/each}} @@ -52,7 +52,7 @@ {{else}}
      - {{#if data.cacher_points_de_tache}} + {{#if system.cacher_points_de_tache}} {{else}} diff --git a/templates/item-tarot-sheet.html b/templates/item-tarot-sheet.html index 7f652f4f..ad0aa08b 100644 --- a/templates/item-tarot-sheet.html +++ b/templates/item-tarot-sheet.html @@ -11,11 +11,11 @@
      - +
      - {{#select data.aspect}} {{>"systems/foundryvtt-reve-de-dragon/templates/enum-aspect-tarot.html"}} {{/select}}