Compare commits

..

26 Commits
12.0.27 ... v11

Author SHA1 Message Date
af4404aab1 Merge pull request 'Fix: automatisations de combat' (#734) from VincentVk/foundryvtt-reve-de-dragon:v11 into v11
All checks were successful
Release Creation / build (release) Successful in 1m28s
Reviewed-on: #734
2024-12-20 10:52:54 +01:00
85804bc838 Fix: automatisations de combat 2024-12-20 01:30:00 +01:00
ad4baecdf2 Merge pull request 'v11 Niveau des entités; compendiums venins' (#733) from VincentVk/foundryvtt-reve-de-dragon:v11 into v11
All checks were successful
Release Creation / build (release) Successful in 1m28s
Reviewed-on: #733
2024-12-18 23:48:32 +01:00
8dc5616d7c Fix: probleme de sauvegarde messages combat
Il était impossible de sauvegarde à cause d'une exception lors
de la création du flag car on accédait au Token.
2024-12-18 22:15:00 +01:00
db6b025e8f Liens vers les venins 2024-12-18 17:59:08 +01:00
7f53757f26 Pas de valeurs par défaut dans descriptions
Elles n'apportent pas grand chose
2024-12-18 17:38:23 +01:00
879d2d10e5 Mineur - ordre des attributs dérivés 2024-12-18 17:37:35 +01:00
016e4463bd Support d'apostrophe dans les noms
v2: simple escape seulement
2024-12-18 17:36:47 +01:00
1dfab01c4b Support espace insécable
Dans le poids, on a généralement un espace insécable
2024-12-18 17:36:15 +01:00
a9cb211dba Ne pas afficher l'âge si 0
Dans la feuille simplifiée, ne pas afficher l'âge si 0 (correspondant
en général à des acteurs non liés)
2024-12-18 17:28:50 +01:00
4dce510c91 Calcul automatique du niveau des entités 2024-12-18 17:27:50 +01:00
14abfa8e7d Merge pull request '12.0.29 - L'indexation d'Astrobazzarh' (#732) from VincentVk/foundryvtt-reve-de-dragon:v11 into v11
All checks were successful
Release Creation / build (release) Successful in 1m36s
Reviewed-on: #732
2024-12-17 07:11:59 +01:00
1f564e0d89 Meilleure extraction du nom
- cas des entités non incarnées
2024-12-17 01:51:23 +01:00
ab61d5991d Correction des liens vers les compendiums
Afin de permettre de naviguer, les liens référencent maintenant les
compendiums dans les sorts.

Le venin des charasmes est référencé depuis les chrasmes.
2024-12-17 01:39:41 +01:00
e3a858a9ef Meilleure détection type d'acteur
- entités: pas de force (cas des entités non incarnées)
- créatures: pas de vue / avec perception
sinon: personnages
2024-12-17 01:35:47 +01:00
4cacf46ed8 Import "protection naturelle" 2024-12-17 01:32:56 +01:00
5a5b5cdbb3 Ajustement dommages créatures
Les bonus aux dommages des créatures et entitées sont intégrés
dans les données importées, il faut donc retirer le plusdom de
l'acteur après création
2024-12-17 01:32:29 +01:00
f90dddfbf8 Le nom peut contenir une apostrophe 2024-12-14 23:21:50 +01:00
d04da56c22 Merge pull request 'Corrections imports et ajouts sorts en réserve' (#731) from VincentVk/foundryvtt-reve-de-dragon:v11 into v11
All checks were successful
Release Creation / build (release) Successful in 1m35s
Reviewed-on: #731
2024-12-14 16:48:39 +01:00
a87a4d371e Import de Nom avec tiret de séparation 2024-12-14 01:02:19 +01:00
c577fa5f29 Correction import niveau 0
Correction d'import pour armes au niveau 0 (ou négatif)
2024-12-14 00:51:32 +01:00
30303330d7 Correction import armes à deux mains
pluriel!
2024-12-14 00:50:51 +01:00
ded92ddf2d Déplacement update competences
Placé sur les feuilles d'acteurs qui ont des compétences
2024-12-14 00:38:39 +01:00
2d2b75e33f Chance actuelle sur feuille simplifiée
- Affichages boutons +/-

- Jet de chance actuelle

- Correction de la détermination de chance actuelle
parfois vide/undefined
2024-12-14 00:33:31 +01:00
a9b7dff83a Affichage du coût de seuil sur les sorts 2024-12-11 23:29:01 +01:00
75d6f78b40 Mettre en réserve depuis un sort
Ajout d'une icône pour mettre les sorts en réserve depuis la
liste de sorts
2024-12-11 23:22:20 +01:00
67 changed files with 394 additions and 500 deletions

View File

@ -1,4 +1,19 @@
# 12.0 # 12.0
## 12.0.31 - le mausolée d'Astrobazzarh
- Correction: les automatisation de combat jouer-MJ fonctionnentde nouveau
## 12.0.30 - le cauchemar d'Astrobazzarh
- calcul automatique du niveau des entités selon leur rêve
- la description des créatures venimeuses contient un lien vers leur venin
- Correction: les messages de combats ne marchaient plus (Changement combiné Foundry + rêve de Dragon)
## 12.0.29 - L'indexation d'Astrobazzarh
- les liens dans la descriptions des sorts pointent vers les sorts du compendium
- la description du chrasme contient le lien vers son venin plutôt qu'un tableau
## 12.0.28 - Les réserves d'Astrobazzarh
- possibilité de mettre en réserve depuis un sort connu
## 12.0.27 - Les vêtements d'Astrobazzarh ## 12.0.27 - Les vêtements d'Astrobazzarh
- Ajout de la liste des armures dans l'onglet caractéristiques - Ajout de la liste des armures dans l'onglet caractéristiques
- Ajout d'une option pour choisir une carte des TMR alternatives - Ajout d'une option pour choisir une carte des TMR alternatives
@ -115,11 +130,9 @@
- encodage de l'export en windows-1252 - encodage de l'export en windows-1252
- export de l'esquive avec armure et sans armure - export de l'esquive avec armure et sans armure
## 12.0.10 - Le scriptorium d'Astrobazzarh ## 12.0.9 - 12.0.10 - Le scriptorium d'Astrobazzarh
- corrections de l'export scriptarium - corrections de l'export scriptarium
- ajout d'une fonction avancée pour un exporter "scriptarium" des personnages
## 12.0.9 - Le scriptorium d'Astrobazzarh
- ajout d'une fonction avancée pour exporter les personnages dans un format csv
## 12.0.8 - La quincaillerie d'Astrobazzarh ## 12.0.8 - La quincaillerie d'Astrobazzarh
- le propriétaire est indiqué dans les feuilles d'équipements/compétences/... - le propriétaire est indiqué dans les feuilles d'équipements/compétences/...

View File

@ -183,7 +183,7 @@ export class RdDActorSheet extends RdDBaseActorSangSheet {
// Equip Inventory Item // Equip Inventory Item
this.html.find('.item-equip').click(async event => this.actor.equiperObjet(RdDSheetUtility.getItemId(event))) this.html.find('.item-equip').click(async event => this.actor.equiperObjet(RdDSheetUtility.getItemId(event)))
this.html.find('.chance-actuelle').click(async event => this.actor.rollCarac('chance-actuelle')) this.html.find('.roll-chance-actuelle').click(async event => this.actor.rollCarac('chance-actuelle'))
this.html.find('.button-appel-chance').click(async event => this.actor.rollAppelChance()) this.html.find('.button-appel-chance').click(async event => this.actor.rollAppelChance())
@ -214,7 +214,7 @@ export class RdDActorSheet extends RdDBaseActorSangSheet {
// Boutons spéciaux MJs // Boutons spéciaux MJs
this.html.find('.forcer-tmr-aleatoire').click(async event => this.actor.reinsertionAleatoire("Action MJ")) this.html.find('.forcer-tmr-aleatoire').click(async event => this.actor.reinsertionAleatoire("Action MJ"))
this.html.find('.don-de-haut-reve').click(async event => this.actor.addDonDeHautReve()) this.html.find('.don-de-haut-reve').click(async event => this.actor.addDonDeHautReve())
this.html.find('.nouveau-sort-reserve').click(async event => this.actor.addSortReserve()) this.html.find('.sortreserve-add').click(async event => this.actor.addSortReserve(RdDSheetUtility.getItemId(event)))
this.html.find('.afficher-tmr').click(async event => this.actor.changeTMRVisible()) this.html.find('.afficher-tmr').click(async event => this.actor.changeTMRVisible())
} }
@ -284,6 +284,8 @@ export class RdDActorSheet extends RdDBaseActorSangSheet {
this.html.find('.ptreve-actuel-plus').click(async event => this.actor.reveActuelIncDec(1)) this.html.find('.ptreve-actuel-plus').click(async event => this.actor.reveActuelIncDec(1))
this.html.find('.ptreve-actuel-moins').click(async event => this.actor.reveActuelIncDec(-1)) this.html.find('.ptreve-actuel-moins').click(async event => this.actor.reveActuelIncDec(-1))
this.html.find('.chance-actuelle-plus').click(async event => this.actor.chanceActuelleIncDec(1))
this.html.find('.chance-actuelle-moins').click(async event => this.actor.chanceActuelleIncDec(-1))
this.html.find('.fatigue-plus').click(async event => this.actor.santeIncDec("fatigue", 1)) this.html.find('.fatigue-plus').click(async event => this.actor.santeIncDec("fatigue", 1))
this.html.find('.fatigue-moins').click(async event => this.actor.santeIncDec("fatigue", -1)) this.html.find('.fatigue-moins').click(async event => this.actor.santeIncDec("fatigue", -1))
} }

View File

@ -95,11 +95,14 @@ export class RdDActor extends RdDBaseActorSang {
isHautRevant() { return this.system.attributs.hautrevant.value != "" } isHautRevant() { return this.system.attributs.hautrevant.value != "" }
/* -------------------------------------------- */ /* -------------------------------------------- */
getAgilite() { return this.system.carac.agilite?.value ?? 0 } getAgilite() { return Misc.toInt(this.system.carac.agilite?.value ?? 0) }
getChance() { return this.system.carac.chance?.value ?? 0 } getChance() { return Misc.toInt(this.system.carac.chance?.value ?? 0) }
getReveActuel() { return this.system.reve?.reve?.value ?? this.carac.reve.value ?? 0 } getReveActuel() { return Misc.toInt(this.system.reve?.reve?.value) ?? this.carac.reve.value ?? 0 }
getChanceActuel() { return this.system.compteurs.chance?.value ?? 10 } getChanceActuel() {
return Number.isNumeric(this.system.compteurs.chance.value) ?
Misc.toInt(this.system.compteurs.chance.value) : this.getChance()
}
getMoralTotal() { return this.system.compteurs.moral?.value ?? 0 } getMoralTotal() { return this.system.compteurs.moral?.value ?? 0 }
getEnduranceMax() { return Math.max(1, Math.max(this.getTaille() + this.getConstitution(), this.getVieMax() + this.getVolonte())) } getEnduranceMax() { return Math.max(1, Math.max(this.getTaille() + this.getConstitution(), this.getVieMax() + this.getVolonte())) }
@ -991,13 +994,23 @@ export class RdDActor extends RdDBaseActorSang {
} }
} }
async addSortReserve() { async addSortReserve(itemId) {
if (itemId) {
const item = this.items.get(itemId)
if (item.type == ITEM_TYPES.sort && !item.system.isrituel) {
this.$createSortReserve(item)
return
}
}
const selectSortReserve = { const selectSortReserve = {
title: "Créer un sort en réserve", title: "Créer un sort en réserve",
label: "Choisir un sort", label: "Choisir un sort",
list: this.itemTypes[ITEM_TYPES.sort].filter(it => !it.system.isrituel) list: this.itemTypes[ITEM_TYPES.sort].filter(it => !it.system.isrituel)
} }
DialogSelect.select(selectSortReserve, sort => DialogSelect.select(selectSortReserve, sort => this.$createSortReserve(sort))
}
$createSortReserve(sort) {
this.createEmbeddedDocuments("Item", this.createEmbeddedDocuments("Item",
[{ [{
type: ITEM_TYPES.sortreserve, type: ITEM_TYPES.sortreserve,
@ -1005,7 +1018,7 @@ export class RdDActor extends RdDBaseActorSang {
img: sort.img, img: sort.img,
system: { sortid: sort.id, draconic: sort.system.draconic, ptreve: Number(sort.system.ptreve.match(/\d+/)), coord: 'A1', heurecible: 'Vaisseau' } system: { sortid: sort.id, draconic: sort.system.draconic, ptreve: Number(sort.system.ptreve.match(/\d+/)), coord: 'A1', heurecible: 'Vaisseau' }
}], }],
{ renderSheet: true })) { renderSheet: true })
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
async reinsertionAleatoire(raison, accessible = tmr => true) { async reinsertionAleatoire(raison, accessible = tmr => true) {
@ -1070,6 +1083,11 @@ export class RdDActor extends RdDBaseActorSang {
await this.update({ "system.reve.reve.value": reve }); await this.update({ "system.reve.reve.value": reve });
} }
async chanceActuelleIncDec(value) {
const chance = Math.min(this.getChance(), Math.max(this.getChanceActuel() + value, 0));
await this.update({ "system.compteurs.chance.value": chance });
}
/* -------------------------------------------- */ /* -------------------------------------------- */
async regainPointDeSeuil() { async regainPointDeSeuil() {
const seuil = Misc.toInt(this.system.reve.seuil.value); const seuil = Misc.toInt(this.system.reve.seuil.value);
@ -2254,12 +2272,6 @@ export class RdDActor extends RdDBaseActorSang {
} }
} }
/* -------------------------------------------- */
async chanceActuelleIncDec(value) {
const chance = Math.min(this.getChance(), Math.max(this.getChanceActuel() + value, 0));
await this.updateCompteurValue("chance", chance);
}
/* -------------------------------------------- */ /* -------------------------------------------- */
async appelDestinee(onSuccess = () => { }, onEchec = () => { }) { async appelDestinee(onSuccess = () => { }, onEchec = () => { }) {
let destinee = this.system.compteurs.destinee?.value ?? 0; let destinee = this.system.compteurs.destinee?.value ?? 0;

View File

@ -48,6 +48,19 @@ export class RdDBaseActorReveSheet extends RdDBaseActorSheet {
}], { renderSheet: true }) }], { renderSheet: true })
) )
if (this.options.vueDetaillee) {
// On carac change
this.html.find('.carac-value').change(async event => {
let caracName = event.currentTarget.name.replace(".value", "").replace("system.carac.", "");
this.actor.updateCarac(caracName, parseInt(event.target.value));
});
// On competence change
this.html.find('.competence-value').change(async event => {
let compName = event.currentTarget.attributes.compname.value;
//console.log("Competence changed :", compName);
this.actor.updateCompetence(compName, parseInt(event.target.value));
});
}
} }
} }

View File

@ -37,6 +37,15 @@ export class RdDBaseActorReve extends RdDBaseActor {
this.system.sante.endurance.value = Math.min(this.system.sante.endurance.value, this.system.sante.endurance.max) this.system.sante.endurance.value = Math.min(this.system.sante.endurance.value, this.system.sante.endurance.max)
} }
getCarac() {
return foundry.utils.mergeObject(this.system.carac,
{
'reve-actuel': this.getCaracReveActuel(),
'chance-actuelle': this.getCaracChanceActuelle()
},
{ inplace: false })
}
getCaracChanceActuelle() { getCaracChanceActuelle() {
return { return {
label: 'Chance actuelle', label: 'Chance actuelle',
@ -53,7 +62,6 @@ export class RdDBaseActorReve extends RdDBaseActor {
}; };
} }
getTaille() { return Misc.toInt(this.system.carac.taille?.value) } getTaille() { return Misc.toInt(this.system.carac.taille?.value) }
getConstitution() { return this.getReve() } getConstitution() { return this.getReve() }
getForce() { return this.getReve() } getForce() { return this.getReve() }
@ -306,16 +314,6 @@ export class RdDBaseActorReve extends RdDBaseActor {
}); });
} }
getCarac() {
// TODO: le niveau d'une entité de cauchemar devrait être exclu...
return foundry.utils.mergeObject(this.system.carac,
{
'reve-actuel': this.getCaracReveActuel(),
'chance-actuelle': this.getCaracChanceActuelle()
},
{ inplace: false })
}
/* -------------------------------------------- */ /* -------------------------------------------- */
async rollCarac(caracName, jetResistance = undefined) { async rollCarac(caracName, jetResistance = undefined) {
if (Grammar.equalsInsensitive(caracName, 'taille')) { if (Grammar.equalsInsensitive(caracName, 'taille')) {
@ -499,7 +497,7 @@ export class RdDBaseActorReve extends RdDBaseActor {
|| entite.isEntiteAccordee(this)) { || entite.isEntiteAccordee(this)) {
return true; return true;
} }
const rolled = await RdDResolutionTable.roll(this.getReveActuel(), - Number(entite.system.carac.niveau.value)); const rolled = await RdDResolutionTable.roll(this.getReveActuel(), - Number(entite.getNiveau()));
const rollData = { const rollData = {
alias: this.getAlias(), alias: this.getAlias(),
rolled: rolled, rolled: rolled,

View File

@ -177,21 +177,6 @@ export class RdDBaseActorSheet extends ActorSheet {
this.options.vueDetaillee = !this.options.vueDetaillee; this.options.vueDetaillee = !this.options.vueDetaillee;
this.render(true); this.render(true);
}); });
if (this.options.vueDetaillee) {
// On carac change
this.html.find('.carac-value').change(async event => {
let caracName = event.currentTarget.name.replace(".value", "").replace("system.carac.", "");
this.actor.updateCarac(caracName, parseInt(event.target.value));
});
// On competence change
this.html.find('.competence-value').change(async event => {
let compName = event.currentTarget.attributes.compname.value;
//console.log("Competence changed :", compName);
this.actor.updateCompetence(compName, parseInt(event.target.value));
});
}
} }
_rechercherKeyup(event) { _rechercherKeyup(event) {

View File

@ -15,6 +15,8 @@ export class RdDActorEntiteSheet extends RdDBaseActorReveSheet {
async getData() { async getData() {
let formData = await super.getData(); let formData = await super.getData();
formData.niveau = this.actor.getNiveau()
delete formData.system.carac.niveau
formData.resonances = this.actor.system.sante.resonnance.actors.map(actorId => game.actors.get(actorId)) formData.resonances = this.actor.system.sante.resonnance.actors.map(actorId => game.actors.get(actorId))
.map(actor => { return { id: actor.id, name: actor.name, img: actor.img } }) .map(actor => { return { id: actor.id, name: actor.name, img: actor.img } })
return formData return formData
@ -33,10 +35,6 @@ export class RdDActorEntiteSheet extends RdDBaseActorReveSheet {
let compName = event.currentTarget.attributes.compname.value; let compName = event.currentTarget.attributes.compname.value;
this.actor.updateCreatureCompetence(compName, "carac_value", parseInt(event.target.value)); this.actor.updateCreatureCompetence(compName, "carac_value", parseInt(event.target.value));
}); });
this.html.find('.creature-niveau').change(async event => {
let compName = event.currentTarget.attributes.compname.value;
this.actor.updateCreatureCompetence(compName, "niveau", parseInt(event.target.value));
})
this.html.find('.creature-dommages').change(async event => { this.html.find('.creature-dommages').change(async event => {
let compName = event.currentTarget.attributes.compname.value; let compName = event.currentTarget.attributes.compname.value;
this.actor.updateCreatureCompetence(compName, "dommages", parseInt(event.target.value)); this.actor.updateCreatureCompetence(compName, "dommages", parseInt(event.target.value));

View File

@ -1,6 +1,7 @@
import { ENTITE_INCARNE, ENTITE_NONINCARNE } from "../constants.js"; import { ENTITE_INCARNE, ENTITE_NONINCARNE } from "../constants.js";
import { ITEM_TYPES } from "../item.js"; import { ITEM_TYPES } from "../item.js";
import { Misc } from "../misc.js"; import { Misc } from "../misc.js";
import { RdDCarac } from "../rdd-carac.js";
import { RdDEncaisser } from "../rdd-roll-encaisser.js"; import { RdDEncaisser } from "../rdd-roll-encaisser.js";
import { STATUSES } from "../settings/status-effects.js"; import { STATUSES } from "../settings/status-effects.js";
import { RdDBaseActorReve } from "./base-actor-reve.js"; import { RdDBaseActorReve } from "./base-actor-reve.js";
@ -18,12 +19,23 @@ export class RdDEntite extends RdDBaseActorReve {
isEntite(typeentite = []) { isEntite(typeentite = []) {
return (typeentite.length == 0 || typeentite.includes(this.system.definition.typeentite)); return (typeentite.length == 0 || typeentite.includes(this.system.definition.typeentite));
} }
isNonIncarnee() { return this.isEntite([ENTITE_NONINCARNE]) } isNonIncarnee() { return this.isEntite([ENTITE_NONINCARNE]) }
getReveActuel() { getReveActuel() {
return Misc.toInt(this.system.carac.reve?.value) return Misc.toInt(this.system.carac.reve?.value)
} }
getCarac() {
const carac = super.getCarac()
delete carac.niveau
return carac
}
getNiveau() {
const reve = this.getReve()
return RdDCarac.getCaracDerivee(reve).niveau
}
getForce() { return this.getReve() } getForce() { return this.getReve() }
getAgilite() { return this.getReve() } getAgilite() { return this.getReve() }
getChance() { return this.getReve() } getChance() { return this.getReve() }
@ -64,6 +76,7 @@ export class RdDEntite extends RdDBaseActorReve {
} }
return {} return {}
} }
async encaisser() { async encaisser() {
if (this.isNonIncarnee()) { if (this.isNonIncarnee()) {
return return

View File

@ -83,6 +83,7 @@ const MAPPING_BASE = [
{ column: "protectionarmure", colName: 'Protection', getter: (actor, context) => Mapping.getProtectionArmure(actor, context) }, { column: "protectionarmure", colName: 'Protection', getter: (actor, context) => Mapping.getProtectionArmure(actor, context) },
{ column: "malus_armure", getter: (actor, context) => Mapping.getMalusArmure(actor, context) }, { column: "malus_armure", getter: (actor, context) => Mapping.getMalusArmure(actor, context) },
{ column: "reve_actuel", rollClass: 'roll-reve-actuel', colName: 'Rêve actuel', getter: (actor, context) => actor.system.reve.reve.value }, { column: "reve_actuel", rollClass: 'roll-reve-actuel', colName: 'Rêve actuel', getter: (actor, context) => actor.system.reve.reve.value },
{ column: "chance_actuel", rollClass: 'roll-chance-actuelle', colName: 'Chance actuelle', getter: (actor, context) => actor.system.compteurs.chance.value },
{ column: "vie_actuel", rollClass: 'jet-vie', getter: (actor, context) => actor.system.sante.vie.value }, { column: "vie_actuel", rollClass: 'jet-vie', getter: (actor, context) => actor.system.sante.vie.value },
{ column: "endurance_actuel", rollClass: 'jet-endurance', getter: (actor, context) => actor.system.sante.endurance.value }, { column: "endurance_actuel", rollClass: 'jet-endurance', getter: (actor, context) => actor.system.sante.endurance.value },
{ column: "esquive", getter: (actor, context) => Mapping.getEsquive(context) }, { column: "esquive", getter: (actor, context) => Mapping.getEsquive(context) },
@ -278,7 +279,7 @@ export class Mapping {
const race = ['', 'humain'].includes(Grammar.toLowerCaseNoAccent(actor.system.race)) ? '' : (actor.system.race + ' ') const race = ['', 'humain'].includes(Grammar.toLowerCaseNoAccent(actor.system.race)) ? '' : (actor.system.race + ' ')
const heure = actor.system.heure const heure = actor.system.heure
const hn = `${sexeFeminin} à l'heure ${RdDTimestamp.definition(heure).avecArticle}` const hn = `${sexeFeminin} à l'heure ${RdDTimestamp.definition(heure).avecArticle}`
const age = actor.system.age ? `${actor.system.age} ans` : undefined const age = (actor.system.age && actor.system.age >0) ? `${actor.system.age} ans` : undefined
const taille = actor.system.taille const taille = actor.system.taille
const poids = actor.system.poids const poids = actor.system.poids
const cheveux = actor.system.cheveux ? `cheveux ${actor.system.cheveux}` : undefined const cheveux = actor.system.cheveux ? `cheveux ${actor.system.cheveux}` : undefined

View File

@ -6,6 +6,7 @@ import { Grammar } from "../grammar.js";
import { Misc } from "../misc.js"; import { Misc } from "../misc.js";
import { ENTITE_INCARNE, ENTITE_NONINCARNE } from "../constants.js"; import { ENTITE_INCARNE, ENTITE_NONINCARNE } from "../constants.js";
import { RdDItemTete } from "../item/tete.js"; import { RdDItemTete } from "../item/tete.js";
import { ITEM_TYPES } from "../item.js";
const WHITESPACES = "\\s+" const WHITESPACES = "\\s+"
const NUMERIC = "[\\+\\-]?\\d+" const NUMERIC = "[\\+\\-]?\\d+"
@ -26,7 +27,7 @@ const MANIEMENTS = {
'de lancer': (weapon) => { return { name: weapon.system.lancer, categorie: 'lancer' } }, 'de lancer': (weapon) => { return { name: weapon.system.lancer, categorie: 'lancer' } },
'de jet': (weapon) => { return { name: weapon.system.lancer, categorie: 'lancer' } }, 'de jet': (weapon) => { return { name: weapon.system.lancer, categorie: 'lancer' } },
'à une main': (weapon) => { return { name: weapon.system.competence, categorie: 'melee' } }, 'à une main': (weapon) => { return { name: weapon.system.competence, categorie: 'melee' } },
'à deux main': (weapon) => { return { name: weapon.system.competence.replace("à 1 main", "à 2 main"), categorie: 'melee' } }, 'à deux mains': (weapon) => { return { name: weapon.system.competence.replace("à 1 main", "à 2 mains"), categorie: 'melee' } },
'mêlée': (weapon) => { return { name: weapon.system.competence, categorie: 'melee' } }, 'mêlée': (weapon) => { return { name: weapon.system.competence, categorie: 'melee' } },
} }
const XREGEXP_WEAPON_MANIEMENT = "(?<maniement>(" + Misc.join(Object.keys(MANIEMENTS), '|') + "))" const XREGEXP_WEAPON_MANIEMENT = "(?<maniement>(" + Misc.join(Object.keys(MANIEMENTS), '|') + "))"
@ -193,6 +194,7 @@ export class RdDStatBlockParser {
let newActor = await RdDBaseActorReve.create({ name, type, system: actorData, items }); let newActor = await RdDBaseActorReve.create({ name, type, system: actorData, items });
await newActor.remiseANeuf() await newActor.remiseANeuf()
await RdDStatBlockParser.adjustAttacks(newActor)
await RdDStatBlockParser.setValeursActuelles(newActor, statString) await RdDStatBlockParser.setValeursActuelles(newActor, statString)
await newActor?.sheet.render(true) await newActor?.sheet.render(true)
} }
@ -267,7 +269,7 @@ export class RdDStatBlockParser {
} }
let weapMatch = XRegExp.exec(statString, XRegExp(weapon.name let weapMatch = XRegExp.exec(statString, XRegExp(weapon.name
+ "(\\s*" + XREGEXP_WEAPON_MANIEMENT + ")?" + "(\\s*" + XREGEXP_WEAPON_MANIEMENT + ")?"
+ "\\s+(?<value>\\+\\d+)", 'giu')); + "\\s+(?<value>[\\+\\-]?\\d+)", 'giu'));
if (weapMatch) { if (weapMatch) {
weapon = weapon.toObject(); weapon = weapon.toObject();
weapon.system.equipe = 'true'; weapon.system.equipe = 'true';
@ -296,6 +298,21 @@ export class RdDStatBlockParser {
} }
} }
static async adjustAttacks(newActor) {
if (["creature", "entite"].includes(newActor.type)) {
const bonusDommages = newActor.getBonusDegat()
const ajustementAttaques = newActor.itemTypes[ITEM_TYPES.competencecreature].filter(it => it.system.iscombat)
.map(it => {
return {
_id: it.id,
'system.categorie': 'melee',
'system.dommages': it.system.dommages - bonusDommages
}
})
await newActor.updateEmbeddedDocuments('Item', ajustementAttaques)
}
}
static async setValeursActuelles(newActor, statString) { static async setValeursActuelles(newActor, statString) {
const updates = { const updates = {
} }
@ -412,9 +429,9 @@ export class RdDStatBlockParser {
actorData.taille = taille.value; actorData.taille = taille.value;
} }
// Get weight // Get weight
const poids = XRegExp.exec(statString, XRegExp("(?<value>\\d+ kg)", 'giu')); const poids = XRegExp.exec(statString, XRegExp(",\\s+(?<value>\\d+)\\s+kg", 'giu'));
if (poids?.value) { if (poids?.value) {
actorData.poids = poids.value; actorData.poids = poids.value + ' kg';
} }
// Get cheveux // Get cheveux
const cheveux = XRegExp.exec(statString, XRegExp("kg,\\s+(?<value>[A-Za-zÀ-ÖØ-öø-ÿ\\s\\-]+),\\s+yeux", 'giu')); const cheveux = XRegExp.exec(statString, XRegExp("kg,\\s+(?<value>[A-Za-zÀ-ÖØ-öø-ÿ\\s\\-]+),\\s+yeux", 'giu'));
@ -435,7 +452,7 @@ export class RdDStatBlockParser {
} }
static parseCreature(statString, actorData) { static parseCreature(statString, actorData) {
let protection = XRegExp.exec(statString, XRegExp("protection\\s+(?<value>[\\-]?\\d+)", 'giu')); let protection = XRegExp.exec(statString, XRegExp("protection(\\s+naturelle)?\\s+(?<value>[\\-]?\\d+)", 'giu'));
if (protection?.value) { if (protection?.value) {
actorData.attributs.protection.value = Number(protection.value); actorData.attributs.protection.value = Number(protection.value);
} }
@ -461,33 +478,40 @@ export class RdDStatBlockParser {
} }
static parseActorType(statString) { static parseActorType(statString) {
let niveau = XRegExp.exec(statString, XRegExp("Niveau\\s+(?<value>[\\+\\-]?\\d+)", 'giu')) let force = XRegExp.exec(statString, XRegExp("Force\\s+(?<value>[\\+\\-]?\\d+)", 'giu'))
let vue = XRegExp.exec(statString, XRegExp("Vue\\s+(?<value>[\\+\\-]?\\d+)", 'giu'))
let perception = XRegExp.exec(statString, XRegExp("perception\\s+(?<value>\\d+)", 'giu')) let perception = XRegExp.exec(statString, XRegExp("perception\\s+(?<value>\\d+)", 'giu'))
if (perception?.value) { if (!force) {
return "creature"
}
if (niveau?.value) {
return "entite" return "entite"
} }
if (!vue || perception) {
return "creature"
}
return "personnage" return "personnage"
} }
static extractName(actorType, statString) { static extractName(actorType, statString) {
switch (actorType) { if (actorType == "personnage") {
case "personnage":
// Check if ',né le' is present // Check if ',né le' is present
let namePersonnage = "Importé" let namePersonnage = "Importé"
if (statString.includes(", né")) { if (statString.includes(", né")) {
// Name is all string before first comma ',' // Name is all string before first comma ','
namePersonnage = XRegExp.exec(statString, XRegExp("(?<value>[\\p{Letter}\\s\\d]+),", 'giu')); namePersonnage = XRegExp.exec(statString, XRegExp("(?<value>[\\p{Letter}\'\\-\\s\\d]+),", 'giu'));
} else { } else {
namePersonnage = XRegExp.exec(statString, XRegExp("(?<value>[\\p{Letter}\\s\\d]+)\\s+TAILLE", 'giu')); namePersonnage = XRegExp.exec(statString, XRegExp("(?<value>[\\p{Letter}\'\\-\\s\\d]+)\\s+TAILLE", 'giu'));
} }
if (namePersonnage?.value) { if (namePersonnage?.value) {
return Misc.upperFirst(namePersonnage?.value); return Misc.upperFirst(namePersonnage?.value.toLowerCase());
} }
} }
const name = XRegExp.exec(statString, XRegExp("(?<value>.+)\\s+taille", 'giu')); const name = XRegExp.exec(statString, XRegExp("(?<value>.+)\\s+taille", 'giu'));
if (actorType == "entite") {
if (!(name?.value)) {
const nameEntiteReve = XRegExp.exec(statString, XRegExp("(?<value>.+)\\s+rêve", 'giu'));
return Misc.upperFirst(nameEntiteReve?.value || "Importé");
}
}
return Misc.upperFirst(name?.value || "Importé"); return Misc.upperFirst(name?.value || "Importé");
} }

View File

@ -3,38 +3,38 @@ import { Misc } from "./misc.js";
const TABLE_CARACTERISTIQUES_DERIVEES = { const TABLE_CARACTERISTIQUES_DERIVEES = {
// xp: coût pour passer du niveau inférieur à ce niveau // xp: coût pour passer du niveau inférieur à ce niveau
1: { xp: 3, poids: "moins de 1kg", poidsMin: 0, poidsMax: 1, plusdom: -5, sconst: 0.5, sust: 0.1 }, 1: { xp: 3, niveau: -5, poids: "moins de 1kg", poidsMin: 0, poidsMax: 1, plusdom: -5, sconst: 0.5, sust: 0.1 },
2: { xp: 3, poids: "1-5", poidsMin: 1, poidsMax: 5, plusdom: -4, sconst: 0.5, sust: 0.3 }, 2: { xp: 3, niveau: -4, poids: "1-5", poidsMin: 1, poidsMax: 5, plusdom: -4, sconst: 0.5, sust: 0.3 },
3: { xp: 4, poids: "6-10", poidsMin: 6, poidsMax: 10, plusdom: -3, sconst: 1, sust: 0.5, beaute: 'hideux' }, 3: { xp: 4, niveau: -3, poids: "6-10", poidsMin: 6, poidsMax: 10, plusdom: -3, sconst: 1, sust: 0.5, beaute: 'hideux' },
4: { xp: 4, poids: "11-20", poidsMin: 11, poidsMax: 20, plusdom: -3, sconst: 1, sust: 1, beaute: 'repoussant' }, 4: { xp: 4, niveau: -2, poids: "11-20", poidsMin: 11, poidsMax: 20, plusdom: -3, sconst: 1, sust: 1, beaute: 'repoussant' },
5: { xp: 5, poids: "21-30", poidsMin: 21, poidsMax: 30, plusdom: -2, sconst: 1, sust: 1, beaute: 'franchement très laid' }, 5: { xp: 5, niveau: -1, poids: "21-30", poidsMin: 21, poidsMax: 30, plusdom: -2, sconst: 1, sust: 1, beaute: 'franchement très laid' },
6: { xp: 5, poids: "31-40", poidsMin: 31, poidsMax: 40, plusdom: -1, sconst: 2, sust: 2, beaute: 'laid' }, 6: { xp: 5, niveau: 0, poids: "31-40", poidsMin: 31, poidsMax: 40, plusdom: -1, sconst: 2, sust: 2, beaute: 'laid' },
7: { xp: 6, poids: "41-50", poidsMin: 41, poidsMax: 50, plusdom: -1, sconst: 2, sust: 2, beaute: 'très désavantagé' }, 7: { xp: 6, niveau: 0, poids: "41-50", poidsMin: 41, poidsMax: 50, plusdom: -1, sconst: 2, sust: 2, beaute: 'très désavantagé' },
8: { xp: 6, poids: "51-60", poidsMin: 51, poidsMax: 60, plusdom: 0, sconst: 2, sust: 2, beaute: 'désavantagé' }, 8: { xp: 6, niveau: 0, poids: "51-60", poidsMin: 51, poidsMax: 60, plusdom: 0, sconst: 2, sust: 2, beaute: 'désavantagé' },
9: { xp: 7, poids: "61-65", poidsMin: 61, poidsMax: 65, plusdom: 0, sconst: 3, sust: 2, beaute: 'pas terrible' }, 9: { xp: 7, niveau: 0, poids: "61-65", poidsMin: 61, poidsMax: 65, plusdom: 0, sconst: 3, sust: 2, beaute: 'pas terrible' },
10: { xp: 7, poids: "66-70", poidsMin: 66, poidsMax: 70, plusdom: 0, sconst: 3, sust: 3, beaute: 'commun' }, 10: { xp: 7, niveau: 0, poids: "66-70", poidsMin: 66, poidsMax: 70, plusdom: 0, sconst: 3, sust: 3, beaute: 'commun' },
11: { xp: 8, poids: "71-75", poidsMin: 71, poidsMax: 75, plusdom: 0, sconst: 3, sust: 3, beaute: 'pas mal' }, 11: { xp: 8, niveau: 1, poids: "71-75", poidsMin: 71, poidsMax: 75, plusdom: 0, sconst: 3, sust: 3, beaute: 'pas mal' },
12: { xp: 8, poids: "76-80", poidsMin: 76, poidsMax: 80, plusdom: +1, sconst: 4, sust: 3, beaute: 'avantagé' }, 12: { xp: 8, niveau: 1, poids: "76-80", poidsMin: 76, poidsMax: 80, plusdom: +1, sconst: 4, sust: 3, beaute: 'avantagé' },
13: { xp: 9, poids: "81-90", poidsMin: 81, poidsMax: 90, plusdom: +1, sconst: 4, sust: 3, beaute: 'mignon' }, 13: { xp: 9, niveau: 2, poids: "81-90", poidsMin: 81, poidsMax: 90, plusdom: +1, sconst: 4, sust: 3, beaute: 'mignon' },
14: { xp: 9, poids: "91-100", poidsMin: 91, poidsMax: 100, plusdom: +2, sconst: 4, sust: 4, beaute: 'beau' }, 14: { xp: 9, niveau: 2, poids: "91-100", poidsMin: 91, poidsMax: 100, plusdom: +2, sconst: 4, sust: 4, beaute: 'beau' },
15: { xp: 10, poids: "101-110", poidsMin: 101, poidsMax: 110, plusdom: +2, sconst: 5, sust: 4, beaute: 'très beau' }, 15: { xp: 10, niveau: 3, poids: "101-110", poidsMin: 101, poidsMax: 110, plusdom: +2, sconst: 5, sust: 4, beaute: 'très beau' },
16: { xp: 20, poids: "111-120", poidsMin: 111, poidsMax: 120, plusdom: +3, sconst: 5, sust: 4, beaute: 'éblouissant' }, 16: { xp: 20, niveau: 3, poids: "111-120", poidsMin: 111, poidsMax: 120, plusdom: +3, sconst: 5, sust: 4, beaute: 'éblouissant' },
17: { xp: 30, poids: "121-131", poidsMin: 121, poidsMax: 131, plusdom: +3, sconst: 5, sust: 5 }, 17: { xp: 30, niveau: 4, poids: "121-131", poidsMin: 121, poidsMax: 131, plusdom: +3, sconst: 5, sust: 5 },
18: { xp: 40, poids: "131-141", poidsMin: 131, poidsMax: 141, plusdom: +4, sconst: 6, sust: 5 }, 18: { xp: 40, niveau: 4, poids: "131-141", poidsMin: 131, poidsMax: 141, plusdom: +4, sconst: 6, sust: 5 },
19: { xp: 50, poids: "141-150", poidsMin: 141, poidsMax: 150, plusdom: +4, sconst: 6, sust: 5 }, 19: { xp: 50, niveau: 5, poids: "141-150", poidsMin: 141, poidsMax: 150, plusdom: +4, sconst: 6, sust: 5 },
20: { xp: 60, poids: "151-160", poidsMin: 151, poidsMax: 160, plusdom: +4, sconst: 6, sust: 6 }, 20: { xp: 60, niveau: 5, poids: "151-160", poidsMin: 151, poidsMax: 160, plusdom: +4, sconst: 6, sust: 6 },
21: { xp: 70, poids: "161-180", poidsMin: 161, poidsMax: 180, plusdom: +5, sconst: 7, sust: 6 }, 21: { xp: 70, niveau: 6, poids: "161-180", poidsMin: 161, poidsMax: 180, plusdom: +5, sconst: 7, sust: 6 },
22: { xp: 80, poids: "181-200", poidsMin: 181, poidsMax: 200, plusdom: +5, sconst: 7, sust: 7 }, 22: { xp: 80, niveau: 6, poids: "181-200", poidsMin: 181, poidsMax: 200, plusdom: +5, sconst: 7, sust: 7 },
23: { xp: 90, poids: "201-300", poidsMin: 201, poidsMax: 300, plusdom: +6, sconst: 7, sust: 8 }, 23: { xp: 90, niveau: 7, poids: "201-300", poidsMin: 201, poidsMax: 300, plusdom: +6, sconst: 7, sust: 8 },
24: { xp: 100, poids: "301-400", poidsMin: 301, poidsMax: 400, plusdom: +6, sconst: 8, sust: 9 }, 24: { xp: 100, niveau: 7, poids: "301-400", poidsMin: 301, poidsMax: 400, plusdom: +6, sconst: 8, sust: 9 },
25: { xp: 110, poids: "401-500", poidsMin: 401, poidsMax: 500, plusdom: +7, sconst: 8, sust: 10 }, 25: { xp: 110, niveau: 8, poids: "401-500", poidsMin: 401, poidsMax: 500, plusdom: +7, sconst: 8, sust: 10 },
26: { xp: 120, poids: "501-600", poidsMin: 501, poidsMax: 600, plusdom: +7, sconst: 8, sust: 11 }, 26: { xp: 120, niveau: 8, poids: "501-600", poidsMin: 501, poidsMax: 600, plusdom: +7, sconst: 8, sust: 11 },
27: { xp: 130, poids: "601-700", poidsMin: 601, poidsMax: 700, plusdom: +8, sconst: 9, sust: 12 }, 27: { xp: 130, niveau: 9, poids: "601-700", poidsMin: 601, poidsMax: 700, plusdom: +8, sconst: 9, sust: 12 },
28: { xp: 140, poids: "701-800", poidsMin: 701, poidsMax: 800, plusdom: +8, sconst: 9, sust: 13 }, 28: { xp: 140, niveau: 9, poids: "701-800", poidsMin: 701, poidsMax: 800, plusdom: +8, sconst: 9, sust: 13 },
29: { xp: 150, poids: "801-900", poidsMin: 801, poidsMax: 900, plusdom: +9, sconst: 9, sust: 14 }, 29: { xp: 150, niveau: 10, poids: "801-900", poidsMin: 801, poidsMax: 900, plusdom: +9, sconst: 9, sust: 14 },
30: { xp: 160, poids: "901-1000", poidsMin: 901, poidsMax: 1000, plusdom: +9, sconst: 10, sust: 15 }, 30: { xp: 160, niveau: 10, poids: "901-1000", poidsMin: 901, poidsMax: 1000, plusdom: +9, sconst: 10, sust: 15 },
31: { xp: 170, poids: "1001-1500", poidsMin: 1001, poidsMax: 1500, plusdom: +10, sconst: 10, sust: 16 }, 31: { xp: 170, niveau: 11, poids: "1001-1500", poidsMin: 1001, poidsMax: 1500, plusdom: +10, sconst: 10, sust: 16 },
32: { xp: 180, poids: "1501-2000", poidsMin: 1501, poidsMax: 2000, plusdom: +11, sconst: 10, sust: 17 } 32: { xp: 180, niveau: 11, poids: "1501-2000", poidsMin: 1501, poidsMax: 2000, plusdom: +11, sconst: 10, sust: 17 }
}; };
export class RdDCarac { export class RdDCarac {

View File

@ -752,7 +752,6 @@ export class RdDCombat {
dialog.render(true); dialog.render(true);
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
_prepareAttaque(competence, arme) { _prepareAttaque(competence, arme) {
let rollData = { let rollData = {

View File

@ -262,7 +262,24 @@ export class RdDUtility {
'systems/foundryvtt-reve-de-dragon/templates/chat-signe-draconique-actor.html' 'systems/foundryvtt-reve-de-dragon/templates/chat-signe-draconique-actor.html'
]; ];
// foundry et options
Handlebars.registerHelper('RDD_CONFIG', path => RDD_CONFIG[path])
Handlebars.registerHelper('linkCompendium', (pack, id, name) => RdDUtility.linkCompendium(pack, id, name));
Handlebars.registerHelper('regle-optionnelle', (option) => ReglesOptionnelles.isUsing(option));
Handlebars.registerHelper('plusMoins', diff => (diff > 0 ? '+' : '') + Math.round(diff))
// Handle v12 removal of this helper
Handlebars.registerHelper('select', function (selected, options) {
const escapedValue = RegExp.escape(Handlebars.escapeExpression(selected));
const rgx = new RegExp(' value=[\"\']' + escapedValue + '[\"\']');
const html = options.fn(this);
return html.replace(rgx, "$& selected");
})
// logic
Handlebars.registerHelper('either', (a, b) => a ?? b); Handlebars.registerHelper('either', (a, b) => a ?? b);
// string manipulation
Handlebars.registerHelper('upperFirst', str => Misc.upperFirst(str ?? 'Null')); Handlebars.registerHelper('upperFirst', str => Misc.upperFirst(str ?? 'Null'));
Handlebars.registerHelper('lowerFirst', str => Misc.lowerFirst(str ?? 'Null')); Handlebars.registerHelper('lowerFirst', str => Misc.lowerFirst(str ?? 'Null'));
Handlebars.registerHelper('uppercase', str => str?.toUpperCase() ?? ''); Handlebars.registerHelper('uppercase', str => str?.toUpperCase() ?? '');
@ -272,47 +289,52 @@ export class RdDUtility {
Handlebars.registerHelper('grammar-un', str => Grammar.articleIndetermine(str)); Handlebars.registerHelper('grammar-un', str => Grammar.articleIndetermine(str));
Handlebars.registerHelper('grammar-accord', (genre, ...args) => Grammar.accord(genre, args)); Handlebars.registerHelper('grammar-accord', (genre, ...args) => Grammar.accord(genre, args));
Handlebars.registerHelper('RDD_CONFIG', path => RDD_CONFIG[path]) // math
Handlebars.registerHelper('min', (...args) => Math.min(...args.slice(0, -1)));
Handlebars.registerHelper('repeat', function(n, block) {
let accum = '';
for(let i = 0; i < n; ++i){
accum += block.fn(i)
}
return accum
})
// tableaux, listes
Handlebars.registerHelper('array-includes', (array, value) => array.includes(value));
Handlebars.registerHelper('isLastIndex', (index, list) => index + 1 >= list.length);
Handlebars.registerHelper('trier', list => list.sort((a, b) => a.name.localeCompare(b.name)));
// table de résolution
Handlebars.registerHelper('computeResolutionScore', (row, col) => RdDResolutionTable.computePercentage(row, col)); Handlebars.registerHelper('computeResolutionScore', (row, col) => RdDResolutionTable.computePercentage(row, col));
Handlebars.registerHelper('computeResolutionChances', (row, col) => RdDResolutionTable.computeChances(row, col)); Handlebars.registerHelper('computeResolutionChances', (row, col) => RdDResolutionTable.computeChances(row, col));
Handlebars.registerHelper('buildLigneInventaire', (item, options) => { return new Handlebars.SafeString(RdDUtility.buildLigneInventaire(item, options)); });
Handlebars.registerHelper('buildInventaireConteneur', (actorId, itemId, options) => { return new Handlebars.SafeString(RdDUtility.buildInventaireConteneur(actorId, itemId, options)); });
Handlebars.registerHelper('buildContenuConteneur', (item, options) => { return new Handlebars.SafeString(RdDUtility.buildContenuConteneur(item, options)); });
Handlebars.registerHelper('calculerPrixCommercant', item => item.calculerPrixCommercant());
Handlebars.registerHelper('caseTmr-label', coord => TMRUtility.getTMRLabel(coord));
Handlebars.registerHelper('caseTmr-type', coord => TMRUtility.getTMRType(coord));
Handlebars.registerHelper('typeTmr-name', type => TMRUtility.typeTmrName(type));
Handlebars.registerHelper('effetRencontre-name', coord => TMRUtility.typeTmrName(coord));
// gestion des dates et heures
Handlebars.registerHelper('timestamp-imgSigneHeure', (heure) => { return new Handlebars.SafeString(RdDTimestamp.imgSigneHeure(heure)) }); Handlebars.registerHelper('timestamp-imgSigneHeure', (heure) => { return new Handlebars.SafeString(RdDTimestamp.imgSigneHeure(heure)) });
Handlebars.registerHelper('timestamp-imgSigne', (heure) => { return new Handlebars.SafeString(RdDTimestamp.imgSigne(heure)) }); Handlebars.registerHelper('timestamp-imgSigne', (heure) => { return new Handlebars.SafeString(RdDTimestamp.imgSigne(heure)) });
Handlebars.registerHelper('timestamp-extract', timestamp => new RdDTimestamp(timestamp).toCalendrier()); Handlebars.registerHelper('timestamp-extract', timestamp => new RdDTimestamp(timestamp).toCalendrier());
Handlebars.registerHelper('timestamp-formulesDuree', () => RdDTimestamp.formulesDuree()); Handlebars.registerHelper('timestamp-formulesDuree', () => RdDTimestamp.formulesDuree());
Handlebars.registerHelper('timestamp-formulesPeriode', () => RdDTimestamp.formulesPeriode()); Handlebars.registerHelper('timestamp-formulesPeriode', () => RdDTimestamp.formulesPeriode());
// informations sur les acteurs
Handlebars.registerHelper('actor-default', (actorType, ...path) => RdDBaseActor.getDefaultValue(actorType, path.slice(0, -1))); Handlebars.registerHelper('actor-default', (actorType, ...path) => RdDBaseActor.getDefaultValue(actorType, path.slice(0, -1)));
Handlebars.registerHelper('array-includes', (array, value) => array.includes(value));
Handlebars.registerHelper('min', (...args) => Math.min(...args.slice(0, -1)));
Handlebars.registerHelper('isLastIndex', (index, list) => index + 1 >= list.length);
Handlebars.registerHelper('regle-optionnelle', (option) => ReglesOptionnelles.isUsing(option));
Handlebars.registerHelper('trier', list => list.sort((a, b) => a.name.localeCompare(b.name)));
Handlebars.registerHelper('filtreTriCompetences', competences => RdDItemCompetence.triVisible(competences)); Handlebars.registerHelper('filtreTriCompetences', competences => RdDItemCompetence.triVisible(competences));
Handlebars.registerHelper('linkCompendium', (pack, id, name) => RdDUtility.linkCompendium(pack, id, name));
Handlebars.registerHelper('uniteQuantite', (itemId, actorId) => RdDUtility.getItem(itemId, actorId)?.getUniteQuantite());
Handlebars.registerHelper('isFieldInventaireModifiable', (type, field) => RdDItem.isFieldInventaireModifiable(type, field));
Handlebars.registerHelper('rarete-getChamp', (rarete, field) => RdDRaretes.getChamp(rarete, field));
Handlebars.registerHelper('plusMoins', diff => (diff > 0 ? '+' : '') + Math.round(diff))
Handlebars.registerHelper('experienceLog-topic', topic => ExperienceLog.labelTopic(topic)); Handlebars.registerHelper('experienceLog-topic', topic => ExperienceLog.labelTopic(topic));
// Handle v12 removal of this helper // inventaire et marchands
Handlebars.registerHelper('select', function (selected, options) { Handlebars.registerHelper('buildLigneInventaire', (item, options) => { return new Handlebars.SafeString(RdDUtility.buildLigneInventaire(item, options)); });
const escapedValue = RegExp.escape(Handlebars.escapeExpression(selected)); Handlebars.registerHelper('buildInventaireConteneur', (actorId, itemId, options) => { return new Handlebars.SafeString(RdDUtility.buildInventaireConteneur(actorId, itemId, options)); });
const rgx = new RegExp(' value=[\"\']' + escapedValue + '[\"\']'); Handlebars.registerHelper('buildContenuConteneur', (item, options) => { return new Handlebars.SafeString(RdDUtility.buildContenuConteneur(item, options)); });
const html = options.fn(this); Handlebars.registerHelper('calculerPrixCommercant', item => item.calculerPrixCommercant());
return html.replace(rgx, "$& selected"); Handlebars.registerHelper('uniteQuantite', (itemId, actorId) => RdDUtility.getItem(itemId, actorId)?.getUniteQuantite());
}); Handlebars.registerHelper('isFieldInventaireModifiable', (type, field) => RdDItem.isFieldInventaireModifiable(type, field));
// Items
Handlebars.registerHelper('rarete-getChamp', (rarete, field) => RdDRaretes.getChamp(rarete, field));
// TMRs
Handlebars.registerHelper('caseTmr-label', coord => TMRUtility.getTMRLabel(coord));
Handlebars.registerHelper('caseTmr-type', coord => TMRUtility.getTMRType(coord));
Handlebars.registerHelper('typeTmr-name', type => TMRUtility.typeTmrName(type));
Handlebars.registerHelper('effetRencontre-name', coord => TMRUtility.typeTmrName(coord));
return loadTemplates(templatePaths); return loadTemplates(templatePaths);
} }

View File

@ -14,13 +14,14 @@ export class Targets {
return { return {
id: target?.id, id: target?.id,
name: target?.document.name, name: target?.document.name,
img: target?.document.texture.src ?? target?.actor.img ?? 'icons/svg/mystery-man.svg', img: target?.document.texture.src ?? target?.actor.img ?? 'icons/svg/mystery-man.svg'
target
};
} }
}
static buildActorTokenData(tokenId, actor) { static buildActorTokenData(tokenId, actor) {
return { id: tokenId, name: actor.name, img: actor.img ?? 'icons/svg/mystery-man.svg' }; return { id: tokenId, name: actor.name, img: actor.img ?? 'icons/svg/mystery-man.svg' };
} }
static isTargetEntite(target) { static isTargetEntite(target) {
return target?.actor.type == 'entite' && target?.actor.system.definition.typeentite == ENTITE_NONINCARNE; return target?.actor.type == 'entite' && target?.actor.system.definition.typeentite == ENTITE_NONINCARNE;
} }

View File

@ -257,47 +257,8 @@ system:
d&eacute;vore.</p> d&eacute;vore.</p>
<h1>Venin</h1> <h1>Venin</h1>
<p>@UUID[Compendium.foundryvtt-reve-de-dragon.maladies-et-poisons.Item.v7yZidE9mObKO566]{Venin d'Araflate}</p>
<table style="width: 65.039%; height: 65px;" border="1"> <p></p>
<tbody>
<tr style="height: 16px;">
<td style="width: 30.8567%; height: 16px;">Malignit&eacute;</td>
<td style="width: 68.3263%; height: 16px;">6</td>
</tr>
<tr style="height: 16px;">
<td style="width: 30.8567%; height: 16px;">P&eacute;riodicit&eacute;</td>
<td style="width: 68.3263%; height: 16px;">1 round</td>
</tr>
<tr style="height: 16px;">
<td style="width: 30.8567%; height: 16px;">Dommages</td>
<td style="width: 68.3263%; height: 16px;">-1d6 points d'endurance</td>
</tr>
<tr style="height: 17px;">
<td style="width: 30.8567%; height: 17px;">Antidotes</td>
<td style="width: 68.3263%; height: 17px;">-3 \ Liqueur de Bagdol +12, Lait
de lune +6</td>
</tr>
</tbody>
</table>
race: '' race: ''
notesmj: '' notesmj: ''
ownership: ownership:

View File

@ -227,47 +227,8 @@ system:
que vous nous faites un peu peur ?</p> que vous nous faites un peu peur ?</p>
<h1>Venin</h1> <h1>Venin</h1>
<p>@UUID[Compendium.foundryvtt-reve-de-dragon.maladies-et-poisons.Item.cFMUtU6LZG0mKeDl]{Venin de chrasme}</p>
<table style="width: 399px; height: 65px;" border="1"> <p></p>
<tbody>
<tr style="height: 16px;">
<td style="width: 121px; height: 16px;">Malignit&eacute;</td>
<td style="width: 274px; height: 16px;">3</td>
</tr>
<tr style="height: 16px;">
<td style="width: 121px; height: 16px;">P&eacute;riodicit&eacute;</td>
<td style="width: 274px; height: 16px;">1 miute</td>
</tr>
<tr style="height: 16px;">
<td style="width: 121px; height: 16px;">Dommages</td>
<td style="width: 274px; height: 16px;">-1 point de vie</td>
</tr>
<tr style="height: 17px;">
<td style="width: 121px; height: 17px;">Antidotes</td>
<td style="width: 274px; height: 17px;">-2 \ Liqueur de Bagdol +16, Teinture
d'Erozonne +10</td>
</tr>
</tbody>
</table>
race: '' race: ''
notesmj: '' notesmj: ''
ownership: ownership:

View File

@ -257,56 +257,7 @@ system:
<h1 style="box-sizing: border-box; user-select: text; color: #191813; <h1 style="box-sizing: border-box; user-select: text; color: #191813;
font-family: GoudyAcc, sans-serif;">Venin</h1> font-family: GoudyAcc, sans-serif;">Venin</h1>
<p>@UUID[Compendium.foundryvtt-reve-de-dragon.maladies-et-poisons.Item.IF19EUvrY1HL87lr]{Venin paralysant de goule}</p>
<table style="box-sizing: border-box; user-select: text; width: 395px;
color: #191813; font-family: GoudyAcc, sans-serif; height: 65px;"
border="1">
<tbody style="box-sizing: border-box; user-select: text;">
<tr style="box-sizing: border-box; user-select: text; height: 16px;">
<td style="box-sizing: border-box; user-select: text; width: 122px; height:
16px;">Malignit&eacute;</td>
<td style="box-sizing: border-box; user-select: text; width: 272px; height:
16px;">6</td>
</tr>
<tr style="box-sizing: border-box; user-select: text; height: 16px;">
<td style="box-sizing: border-box; user-select: text; width: 122px; height:
16px;">P&eacute;riodicit&eacute;</td>
<td style="box-sizing: border-box; user-select: text; width: 272px; height:
16px;">1 round</td>
</tr>
<tr style="box-sizing: border-box; user-select: text; height: 16px;">
<td style="box-sizing: border-box; user-select: text; width: 122px; height:
16px;">Dommages</td>
<td style="box-sizing: border-box; user-select: text; width: 272px; height:
16px;">1 ligne de fatigue</td>
</tr>
<tr style="box-sizing: border-box; user-select: text; height: 17px;">
<td style="box-sizing: border-box; user-select: text; width: 122px; height:
17px;">Antidotes</td>
<td style="box-sizing: border-box; user-select: text; width: 272px; height:
17px;">-4 \ Floume-dhu +16</td>
</tr>
</tbody>
</table>
<p>La paralysie intervient quand toutes les lignes de fatigue sont pleines <p>La paralysie intervient quand toutes les lignes de fatigue sont pleines
et dure 6 heures.</p> et dure 6 heures.</p>

View File

@ -219,50 +219,8 @@ system:
attaque d&egrave;s qu&rsquo;il est surpris ou se croit en danger.</p> attaque d&egrave;s qu&rsquo;il est surpris ou se croit en danger.</p>
<h1>Venin</h1> <h1>Venin</h1>
<p>@UUID[Compendium.foundryvtt-reve-de-dragon.maladies-et-poisons.Item.iwlN0bNJ5XNNfjgj]{Venin de scologriffe}</p>
<p>Sensation aigu&euml; de d&eacute;s&eacute;quilibre. Jouer VOLONT&Eacute; <p></p>
&agrave; -3. En cas d&rsquo;&eacute;chec, on chute sans parvenir &agrave; se
relever.</p>
<table style="width: 59.506%;" border="1">
<tbody>
<tr>
<td style="width: 21.6667%;">Malignit&eacute;</td>
<td style="width: 77.5%;">3</td>
</tr>
<tr>
<td style="width: 21.6667%;">P&eacute;riodicit&eacute;</td>
<td style="width: 77.5%;">1 minute</td>
</tr>
<tr>
<td style="width: 21.6667%;">Dommages</td>
<td style="width: 77.5%;">-1 point de vie</td>
</tr>
<tr>
<td style="width: 21.6667%;">Antidotes</td>
<td style="width: 77.5%;">-3 \ Liqueur de Bagdol +16, Topazo&iuml;ne +8</td>
</tr>
</tbody>
</table>
race: '' race: ''
notesmj: '' notesmj: ''
ownership: ownership:

View File

@ -215,47 +215,8 @@ system:
est mortel.</p> est mortel.</p>
<h1>Venin</h1> <h1>Venin</h1>
<p>@UUID[Compendium.foundryvtt-reve-de-dragon.maladies-et-poisons.Item.lUeNPc0ECKqHglbG]{Venin de vipère jaune}</p>
<table style="width: 61.5572%;" border="1"> <p></p>
<tbody>
<tr>
<td style="width: 21.1221%;">Malignit&eacute;</td>
<td style="width: 78.0528%;">2</td>
</tr>
<tr>
<td style="width: 21.1221%;">P&eacute;riodicit&eacute;</td>
<td style="width: 78.0528%;">6 rounds</td>
</tr>
<tr>
<td style="width: 21.1221%;">Dommages</td>
<td style="width: 78.0528%;">-1 point de vie</td>
</tr>
<tr>
<td style="width: 21.1221%;">Antidotes</td>
<td style="width: 78.0528%;">-3 \ Liqueur de Bagdol +14, Topazo&iuml;ne
+10</td>
</tr>
</tbody>
</table>
race: '' race: ''
notesmj: '' notesmj: ''
ownership: ownership:

View File

@ -6,7 +6,7 @@ _id: v7yZidE9mObKO566
system: system:
description: >- description: >-
<p>Venin de l'araflate. Sa morsure inflige un venin anesth&eacute;siant, <p>Venin de l'araflate. Sa morsure inflige un venin anesth&eacute;siant,
inocul&eacute; sur toute blessure sauf contusion\ &eacute;raflure.</p> inocul&eacute; sur toute blessure sauf contusion/&eacute;raflure.</p>
<p>Chaque perte d&rsquo;endurance s&rsquo;accompagne de la fatigue <p>Chaque perte d&rsquo;endurance s&rsquo;accompagne de la fatigue
&eacute;quivalente. &Agrave; z&eacute;ro d&rsquo;endurance, la victime est &eacute;quivalente. &Agrave; z&eacute;ro d&rsquo;endurance, la victime est

View File

@ -4,7 +4,7 @@ img: systems/foundryvtt-reve-de-dragon/icons/maladies_venins/venin.webp
effects: [] effects: []
_id: cFMUtU6LZG0mKeDl _id: cFMUtU6LZG0mKeDl
system: system:
description: <p>Venin du chrasme.&nbsp;</p> description: ''
descriptionmj: '' descriptionmj: ''
temporel: temporel:
debut: debut:

View File

@ -5,10 +5,8 @@ effects: []
_id: iwlN0bNJ5XNNfjgj _id: iwlN0bNJ5XNNfjgj
system: system:
description: >- description: >-
<p>Venin du scologriffe. Il provoque une sensation aigu&euml; de <p>Sensation aigu&euml; de d&eacute;s&eacute;quilibre.
d&eacute;s&eacute;quilibre.</p> Jouer VOLONT&Eacute; &agrave; -3. En cas d&rsquo;&eacute;chec, on chute
<p>Jouer VOLONT&Eacute; &agrave; -3. En cas d&rsquo;&eacute;chec, on chute
sans parvenir &agrave; se relever.</p> sans parvenir &agrave; se relever.</p>
descriptionmj: '' descriptionmj: ''
temporel: temporel:
@ -26,7 +24,7 @@ system:
nombre: 1 nombre: 1
remedesconnus: false remedesconnus: false
remedes: '-3 \ Liqueur de Bagdol +16 Topazoïne +8' remedes: '-3 \ Liqueur de Bagdol +16 Topazoïne +8'
dommages: 1 pt de Vie dommages: 1 pt de Vie, sensation de déséquilibre
periodicite: 1 minute periodicite: 1 minute
ownership: ownership:
default: 0 default: 0

View File

@ -4,7 +4,7 @@ img: systems/foundryvtt-reve-de-dragon/icons/maladies_venins/venin.webp
effects: [] effects: []
_id: lUeNPc0ECKqHglbG _id: lUeNPc0ECKqHglbG
system: system:
description: <p>Venin de la vip&egrave;re jaune. Il provoque des spasmes musculaires.</p> description: ''
descriptionmj: '' descriptionmj: ''
temporel: temporel:
debut: debut:
@ -21,7 +21,7 @@ system:
nombre: 6 nombre: 6
remedesconnus: false remedesconnus: false
remedes: '-3\ Liqueur de Bagdol +14, Topazoïne +10' remedes: '-3\ Liqueur de Bagdol +14, Topazoïne +10'
dommages: 1 pt de Vie dommages: 1 pt de Vie, spasmes musculaires
periodicite: 6 rounds periodicite: 6 rounds
ownership: ownership:
default: 0 default: 0

View File

@ -6,9 +6,8 @@ effects: []
system: system:
description: >- description: >-
<p>Ce sort ne peut être recherché/synthétisé quen ayant compris le <p>Ce sort ne peut être recherché/synthétisé quen ayant compris le
@Item[u2izNaMF2bnwHAwj]{Le Paradoxe de lImmobilité Rapide} tel quénoncé @UUID[Compendium.foundryvtt-reve-de-dragon.meditations-et-ecrits.Item.aFTL3ynBabEUHdP3]{Le Paradoxe de lImmobilité Rapide}
par Wanister de Bravo.</p> tel quénoncé par Wanister de Bravo.</p>
<p>Ce sort permet de monter en TMR et dy demeurer tout en nétant quà demi <p>Ce sort permet de monter en TMR et dy demeurer tout en nétant quà demi
libre de ses mouvements : à cheval, secoué dans une voiture, en bateau, etc. libre de ses mouvements : à cheval, secoué dans une voiture, en bateau, etc.
Il est également possible, sous leffet de Concentration, de monter en TMR Il est également possible, sous leffet de Concentration, de monter en TMR

View File

@ -6,7 +6,7 @@ effects: []
system: system:
description: >- description: >-
<p>Ce sort ne peut être recherché/synthétisé quen ayant compris le sens <p>Ce sort ne peut être recherché/synthétisé quen ayant compris le sens
caché du @Item[qdyYSktETI8mKY6Z]{Premier Chant Dérisoire} de Yester caché du @UUID[Compendium.foundryvtt-reve-de-dragon.meditations-et-ecrits.Item.3ya2og0wNFKHZs3Q]{Premier Chant Dérisoire} de Yester
lAncien</p> lAncien</p>
<p>Cette illusion visuelle donne à la cible un air comique, drôle, <p>Cette illusion visuelle donne à la cible un air comique, drôle,

View File

@ -18,7 +18,7 @@ system:
<p>Ce rituel permet dentendre à distance. Il doit être ciblé sur un <p>Ce rituel permet dentendre à distance. Il doit être ciblé sur un
instrument sonore (harpe, luth, gong, cloche, etc.) faute de quoi lon instrument sonore (harpe, luth, gong, cloche, etc.) faute de quoi lon
aboutit à un cas de @JournalEntry[eANDHKJXMPmPNJ2F]{Magie impossible}. Lors aboutit à un cas de @UUID[Compendium.foundryvtt-reve-de-dragon.rappel-des-regles.JournalEntry.erO7AICiN1LtRyFg]{Magie impossible}. Lors
du lancer, le rituel doit être paramétré sur une personne précise du lancer, le rituel doit être paramétré sur une personne précise
(humanoïde) ou un lieu architectural précis (salle, couloir, perron, (humanoïde) ou un lieu architectural précis (salle, couloir, perron,
escalier, balcon, etc.). Les éléments naturels du paysage (rochers, arbres, escalier, balcon, etc.). Les éléments naturels du paysage (rochers, arbres,

View File

@ -13,7 +13,7 @@ system:
linformation nest plus transmise au cerveau. Toutefois, dès quun conflit linformation nest plus transmise au cerveau. Toutefois, dès quun conflit
survient avec lun des quatre autres sens, une brume limbaire apparaît à la survient avec lun des quatre autres sens, une brume limbaire apparaît à la
place de la cible, affectant grossièrement la forme de cette dernière (voir place de la cible, affectant grossièrement la forme de cette dernière (voir
@JournalEntry[9bvrfDaudPqvQZPY]{Conflit de sens}). Le sort naffecte @UUID[Compendium.foundryvtt-reve-de-dragon.rappel-des-regles.JournalEntry.ZmMoOtUdgjMd4cNs]{Conflit de sens}). Le sort naffecte
rigoureusement que la cible dans sa catégorie. Lancé sur un humanoïde, il rigoureusement que la cible dans sa catégorie. Lancé sur un humanoïde, il
rend son corps invisible, mais pas son équipement. Pour bénéficier dune rend son corps invisible, mais pas son équipement. Pour bénéficier dune
réelle invisibilité, un humanoïde doit être intégralement nu, ou bien réelle invisibilité, un humanoïde doit être intégralement nu, ou bien

View File

@ -17,9 +17,11 @@ system:
points de rêve sont tout de même dépensés.</p> points de rêve sont tout de même dépensés.</p>
<p>La perfection de ce rituel opère la synthèse de <p>La perfection de ce rituel opère la synthèse de
@Item[Ew5JzQ2lzcpGoF11]{Miroir d'Hypnos}, @Item[M99MFM5GalPJxIdW]{Harpe @UUID[Compendium.foundryvtt-reve-de-dragon.sorts-hypnos.Item.8qdOVBr3S7AhRsJw]{Miroir d'Hypnos},
d'Hypnos}, @Item[phT9NLxLGFQp5CSI]{Invoquer sa voix} @UUID[Compendium.foundryvtt-reve-de-dragon.sorts-hypnos.Item.DvP1kqAtGpr5Kux2]{Harpe d'Hypnos},
et@Item[vygR045EwEOsNqJl]{Invoquer son image}. Paramétrage et ciblage @UUID[phT9Compendium.foundryvtt-reve-de-dragon.sorts-hypnos.Item.1PskCeKgFa9XiKoS]{Invoquer sa voix} et
@UUID[Compendium.foundryvtt-reve-de-dragon.sorts-hypnos.Item.cghxHRstw7cXLEm4]{Invoquer son image}.
Paramétrage et ciblage
obéissent aux mêmes conditions et restrictions que Miroir dHypnos, avec obéissent aux mêmes conditions et restrictions que Miroir dHypnos, avec
magie impossible en cas de ciblage ailleurs que sur un miroir. Dès que les magie impossible en cas de ciblage ailleurs que sur un miroir. Dès que les
formes y bougent et que létat hypnotique commence, le haut-rêvant voit la formes y bougent et que létat hypnotique commence, le haut-rêvant voit la

View File

@ -16,8 +16,9 @@ system:
celle-ci est morte ou a changé de rêve, aucun effet ne se produit, mais les 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.</p> points de rêve sont tout de même dépensés.</p>
<p>Ce rituel est comme le négatif de @Item[Ew5JzQ2lzcpGoF11]{Miroir <p>Ce rituel est comme le négatif de
d'Hypnos}. Les conditions de ciblage et de paramétrage en sont exactement @UUID[Compendium.foundryvtt-reve-de-dragon.sorts-hypnos.Item.8qdOVBr3S7AhRsJw]{Miroir d'Hypnos}.
Les conditions de ciblage et de paramétrage en sont exactement
les mêmes. Lorsquun mouvement apparaît au centre du miroir, provoquant les mêmes. Lorsquun mouvement apparaît au centre du miroir, provoquant
létat hypnotique, le haut-rêvant peut commencer à effectuer des gestes, des létat hypnotique, le haut-rêvant peut commencer à effectuer des gestes, des
mimiques, ou montrer ostensiblement un objet quil tient sur lui, mais sans mimiques, ou montrer ostensiblement un objet quil tient sur lui, mais sans

View File

@ -10,8 +10,9 @@ system:
aliments et aux boissons. Par définition, la catégorie est toujours la même aliments et aux boissons. Par définition, la catégorie est toujours la même
: objet en objet. Lintensité de la saveur est celle de la cible. Comme pour : objet en objet. Lintensité de la saveur est celle de la cible. Comme pour
tous les sorts dillusions sensorielles, la saveur illusoire ne peut être tous les sorts dillusions sensorielles, la saveur illusoire ne peut être
quune saveur connue du haut-rêvant. Couplé à @Item[dEs7qg5UsqpQxok6]{Narine quune saveur connue du haut-rêvant. Couplé à @UUID[Compendium.foundryvtt-reve-de-dragon.sorts-hypnos.Item.nNh8N9nF8m6zLtrt]{Narine
d'Hypnos} et à @Item[skPIvFb5tRRPHDGU]{Transfiguration}, ce sort peut d'Hypnos} et à @UUID[Compendium.foundryvtt-reve-de-dragon.sorts-hypnos.Item.ktFI49xqZ0mGfTzt]{Transfiguration},
ce sort peut
permettre des ignominies gastronomiques : que pensez- vous de ce vin à la permettre des ignominies gastronomiques : que pensez- vous de ce vin à la
robe de rubis, au savoureux bouquet de framboise, et qui vous roule sur la robe de rubis, au savoureux bouquet de framboise, et qui vous roule sur la
langue comme du velours ?... Illusion de bout en bout, ce nest que de leau langue comme du velours ?... Illusion de bout en bout, ce nest que de leau

View File

@ -18,7 +18,7 @@ system:
<p>Ce rituel permet de voir à distance. Il doit être ciblé sur un miroir ou <p>Ce rituel permet de voir à distance. Il doit être ciblé sur un miroir ou
une surface réfléchissante, comme de leau parfaitement calme, faute de quoi une surface réfléchissante, comme de leau parfaitement calme, faute de quoi
lon aboutit à un cas de @JournalEntry[eANDHKJXMPmPNJ2F]{Magie impossible}. lon aboutit à un cas de @UUID[Compendium.foundryvtt-reve-de-dragon.rappel-des-regles.JournalEntry.erO7AICiN1LtRyFg]{Magie impossible}.
Lors du lancer, le rituel doit être paramétré sur une personne ou un lieu Lors du lancer, le rituel doit être paramétré sur une personne ou un lieu
architectural précis, mêmes restrictions que pour Harpe dHypnos. Puis le architectural précis, mêmes restrictions que pour Harpe dHypnos. Puis le
sort étant ciblé sur le miroir, le haut-rêvant croit voir y évoluer des sort étant ciblé sur le miroir, le haut-rêvant croit voir y évoluer des

View File

@ -6,7 +6,7 @@ effects: []
system: system:
description: >- description: >-
<p>Narine dHypnos est une illusion purement <em>olfactive</em>. Son <p>Narine dHypnos est une illusion purement <em>olfactive</em>. Son
fonctionnement est identique à @Item[QdtcV9WVi9BdL153]{Tympan d'Hypnos}, fonctionnement est identique à @UUID[Compendium.foundryvtt-reve-de-dragon.sorts-hypnos.Item.D9eSbTGp3i5gdbc5]{Tympan d'Hypnos},
sappliquant aux odeurs à la place des sons. Lillusion doit pareillement sappliquant aux odeurs à la place des sons. Lillusion doit pareillement
rester dans la même catégorie que la cible. Peu utilisé sur les humanoïdes rester dans la même catégorie que la cible. Peu utilisé sur les humanoïdes
et les animaux, à moins davoir une raison très précise de vouloir quun et les animaux, à moins davoir une raison très précise de vouloir quun

View File

@ -5,7 +5,7 @@ img: systems/foundryvtt-reve-de-dragon/icons/competence_hypnos.webp
effects: [] effects: []
system: system:
description: >- description: >-
<p>Comme @Item[viSBXe0CnbRI1O2J]{Robe d'Hypnos}, cette illusion visuelle <p>Comme @UUID[Compendium.foundryvtt-reve-de-dragon.sorts-hypnos.Item.7eeKT1BbsGdyY1GL]{Robe d'Hypnos}, cette illusion visuelle
sapplique à tout ce qui est porté par la cible au moment du ciblage. sapplique à tout ce qui est porté par la cible au moment du ciblage.
Vêtements et équipement deviennent invisibles : le résultat est que la cible Vêtements et équipement deviennent invisibles : le résultat est que la cible
semble nue.</p> semble nue.</p>
@ -17,7 +17,7 @@ system:
<p>La nudité résultante nest elle-même quune illusion. Un corps nu <p>La nudité résultante nest elle-même quune illusion. Un corps nu
apparaît, vraisemblable, mais sans pour autant que ce soit exactement celui apparaît, vraisemblable, mais sans pour autant que ce soit exactement celui
de la cible. Toucher ce corps nu entraîne évidemment un de la cible. Toucher ce corps nu entraîne évidemment un
@JournalEntry[9bvrfDaudPqvQZPY]{Conflit de sens} et une brume limbaire.</p> @UUID[Compendium.foundryvtt-reve-de-dragon.rappel-des-regles.JournalEntry.ZmMoOtUdgjMd4cNs]{Conflit de sens} et une brume limbaire.</p>
<p>Tout vêtement retiré, cessant dêtre en contact avec la cible, redevient <p>Tout vêtement retiré, cessant dêtre en contact avec la cible, redevient
visible quant à lui, mais naltère pas lillusion de nudité. (On ne saurait visible quant à lui, mais naltère pas lillusion de nudité. (On ne saurait

View File

@ -47,7 +47,7 @@ system:
<li>Si lon prévoit quune pièce déquipement va cesser à un moment dêtre <li>Si lon prévoit quune pièce déquipement va cesser à un moment dêtre
en contact avec la cible et que lon désire que son illusion perdure, en contact avec la cible et que lon désire que son illusion perdure,
utiliser conjointement à son sujet le sort standard de utiliser conjointement à son sujet le sort standard de
@Item[skPIvFb5tRRPHDGU]{Transfiguration}.</li> @UUID[Compendium.foundryvtt-reve-de-dragon.sorts-hypnos.Item.ktFI49xqZ0mGfTzt]{Transfiguration}.</li>
</ul> </ul>
descriptionmj: '' descriptionmj: ''

View File

@ -6,7 +6,7 @@ effects: []
system: system:
description: >- description: >-
<p>Cette illusion visuelle ne peut être lancée que sur un humanoïde nu ou <p>Cette illusion visuelle ne peut être lancée que sur un humanoïde nu ou
étant préalablement sous leffet de @Item[m2pwvCCImJnbKVcW]{Nudité étant préalablement sous leffet de @UUID[Compendium.foundryvtt-reve-de-dragon.sorts-hypnos.Item.o99y8VPp7x2mGbaU]{Nudité
d'Hypnos}. Il est alors possible de lui inventer tous les vêtements d'Hypnos}. Il est alors possible de lui inventer tous les vêtements
imaginables, couvrant plus ou moins totalement son corps, y compris une imaginables, couvrant plus ou moins totalement son corps, y compris une
armure. Des pièces déquipement illusoires sont également possibles, armes, armure. Des pièces déquipement illusoires sont également possibles, armes,
@ -16,12 +16,13 @@ system:
sort na aucun effet mais les points de rêve sont dépensés quand même.</p> sort na aucun effet mais les points de rêve sont dépensés quand même.</p>
<p>Si la cible est réellement nue, seul le fait de la toucher peut générer <p>Si la cible est réellement nue, seul le fait de la toucher peut générer
un @JournalEntry[9bvrfDaudPqvQZPY]{Conflit de sens} et une brume limbaire, un @UUID[Compendium.foundryvtt-reve-de-dragon.rappel-des-regles.JournalEntry.ZmMoOtUdgjMd4cNs]{Conflit de sens} et une brume limbaire,
pas son comportement. En revanche, si sa nudité est illusoire, son pas son comportement. En revanche, si sa nudité est illusoire, son
comportement peut générer un conflit de sens sil y a contradiction entre comportement peut générer un conflit de sens sil y a contradiction entre
lutilisation de son équipement réel (rendu invisible par lutilisation de son équipement réel (rendu invisible par
@Item[m2pwvCCImJnbKVcW]{Nudité d'Hypnos}) et son équipement illusoire (celui @UUID[Compendium.foundryvtt-reve-de-dragon.sorts-hypnos.Item.o99y8VPp7x2mGbaU]{Nudité
inventé par Robe Fantasmagorique).</p> d'Hypnos}) et son équipement illusoire (celui inventé par Robe
Fantasmagorique).</p>
descriptionmj: '' descriptionmj: ''
draconic: Voie d'Hypnos draconic: Voie d'Hypnos
duree: HN duree: HN

View File

@ -6,7 +6,7 @@ effects: []
system: system:
description: >- description: >-
<p>Lillusion purement visuelle de Transfiguration fonctionne de la même <p>Lillusion purement visuelle de Transfiguration fonctionne de la même
façon que @Item[Z2U35toRL5nSBr1k]{Métamorphose}, sauf que lillusion doit façon que @UUID[Compendium.foundryvtt-reve-de-dragon.sorts-hypnos.Item.OTtXNS1SnVfWWGKi]{Métamorphose}, sauf que lillusion doit
rester dans la même catégorie que la cible : humanoïde en humanoïde, animal rester dans la même catégorie que la cible : humanoïde en humanoïde, animal
en animal, végétal en végétal, ou objet en objet, exclusivement. Toute en animal, végétal en végétal, ou objet en objet, exclusivement. Toute
disparité de catégorie entre la cible et lillusion entraîne la dissipation disparité de catégorie entre la cible et lillusion entraîne la dissipation

View File

@ -7,7 +7,7 @@ system:
description: >- description: >-
<p>Tympan dHypnos est une illusion purement <em>auditive </em>pouvant <p>Tympan dHypnos est une illusion purement <em>auditive </em>pouvant
sappliquer indifféremment à un humanoïde, un animal ou un objet. Comme pour sappliquer indifféremment à un humanoïde, un animal ou un objet. Comme pour
@Item[skPIvFb5tRRPHDGU]{Transfiguration}, lillusion doit toujours @UUID[Compendium.foundryvtt-reve-de-dragon.sorts-hypnos.Item.ktFI49xqZ0mGfTzt]{Transfiguration}, lillusion doit toujours
appartenir à la même catégorie que la cible. Toute disparité entraîne les appartenir à la même catégorie que la cible. Toute disparité entraîne les
mêmes conséquences. On peut ainsi changer la voix dun humanoïde en une mêmes conséquences. On peut ainsi changer la voix dun humanoïde en une
autre <em>voix </em>dhumanoïde, le cri dun animal en <em>cri </em>dun autre <em>voix </em>dhumanoïde, le cri dun animal en <em>cri </em>dun
@ -15,7 +15,7 @@ system:
Tympan dHypnos sur un objet non sonore naboutit à aucun effet. Ce sort Tympan dHypnos sur un objet non sonore naboutit à aucun effet. Ce sort
permet entre autres denrichir une illusion visuelle en lui apportant son permet entre autres denrichir une illusion visuelle en lui apportant son
complément sonore, diminuant ainsi les risques de complément sonore, diminuant ainsi les risques de
@JournalEntry[9bvrfDaudPqvQZPY]{Conflit de sens}. Le cri illusoire dun @UUID[Compendium.foundryvtt-reve-de-dragon.rappel-des-regles.JournalEntry.ZmMoOtUdgjMd4cNs]{Conflit de sens}. Le cri illusoire dun
animal doit être le cri dun animal connu, et vouloir donner à un humanoïde animal doit être le cri dun animal connu, et vouloir donner à un humanoïde
la même voix que quelquun dautre demande un jet dOUÏE à -8, avec les la même voix que quelquun dautre demande un jet dOUÏE à -8, avec les
mêmes remarques que pour Transfiguration. Noter que seule la voix est mêmes remarques que pour Transfiguration. Noter que seule la voix est

View File

@ -5,7 +5,7 @@ img: systems/foundryvtt-reve-de-dragon/icons/competence_narcos.webp
effects: [] effects: []
system: system:
description: >- description: >-
<p>M&ecirc;me principe que la @Item[r9onPANmiK5E5Jnw]{Fl&egrave;che de Feu}. <p>M&ecirc;me principe que la @UUID[Compendium.foundryvtt-reve-de-dragon.sorts-narcos.Item.lq3jQDJsAflJ2PEy]{Fl&egrave;che de Feu}.
Une dague ainsi modifi&eacute;e a un +dom de +4.</p> Une dague ainsi modifi&eacute;e a un +dom de +4.</p>
<p>La dague de force a une r&eacute;sistance absolue tant que dure <p>La dague de force a une r&eacute;sistance absolue tant que dure

View File

@ -5,8 +5,8 @@ img: systems/foundryvtt-reve-de-dragon/icons/competence_narcos.webp
effects: [] effects: []
system: system:
description: >- description: >-
<p>M&ecirc;me principe que la@Item[r9onPANmiK5E5Jnw]{Fl&egrave;che de Feu} <p>M&ecirc;me principe que la @UUID[Compendium.foundryvtt-reve-de-dragon.sorts-narcos.Item.lq3jQDJsAflJ2PEy]{Fl&egrave;che de Feu}
et la @Item[8BJ9kn3AWLFDwvez]{Dague de Force}, y compris la et la @UUID[Compendium.foundryvtt-reve-de-dragon.sorts-narcos.Item.0N6ILL5RMgmShyM8]{Dague de Force}, y compris la
d&eacute;t&eacute;rioration automatique de 1 point de r&eacute;sistance. Une d&eacute;t&eacute;rioration automatique de 1 point de r&eacute;sistance. Une
&eacute;p&eacute;e dragonne ainsi modifi&eacute;e a un +dom de +6.</p> &eacute;p&eacute;e dragonne ainsi modifi&eacute;e a un +dom de +6.</p>
descriptionmj: '' descriptionmj: ''

View File

@ -9,7 +9,7 @@ system:
description: >- description: >-
<p>Les sorts d&rsquo;Invuln&eacute;rabilit&eacute; Chromatique ne peuvent <p>Les sorts d&rsquo;Invuln&eacute;rabilit&eacute; Chromatique ne peuvent
&ecirc;tre recherch&eacute;s/synth&eacute;tis&eacute;s qu&rsquo;en ayant &ecirc;tre recherch&eacute;s/synth&eacute;tis&eacute;s qu&rsquo;en ayant
compris le @Item[5YK6q2KuKArkvDWy]{Le Principe Drachromatique} (voir Les compris le @UUID[Compendium.foundryvtt-reve-de-dragon.meditations-et-ecrits.Item.UoEHSr7Mcz4crdSF]{Le Principe Drachromatique} (voir Les
grimoires, p218).</p> grimoires, p218).</p>
<p>Cette zone mobile personnelle, ob&eacute;issant &agrave; toutes les <p>Cette zone mobile personnelle, ob&eacute;issant &agrave; toutes les
@ -27,8 +27,8 @@ system:
protection chromatique au rouge r2 conf&egrave;re une protection de +2 ; protection chromatique au rouge r2 conf&egrave;re une protection de +2 ;
celle au bleu r6 une protection de +6.</p> celle au bleu r6 une protection de +6.</p>
<p>Ce sort est incompatible avec le rituel @Item[qW1vAyoqrvxG0tDn]{Haubert <p>Ce sort est incompatible avec le rituel @UUID[Compendium.foundryvtt-reve-de-dragon.sorts-oniros.Item.K9lspVNJAJmCAQHB]{Haubert
d'Oniros (rituel)}.</p> d'Oniros}.</p>
<p>V&ecirc;tements et &eacute;quipement peuvent avoir &eacute;t&eacute; <p>V&ecirc;tements et &eacute;quipement peuvent avoir &eacute;t&eacute;
color&eacute;s dans la teinte voulue par une <em>Transmutation color&eacute;s dans la teinte voulue par une <em>Transmutation

View File

@ -7,7 +7,7 @@ system:
description: >- description: >-
<p>Les sorts d&rsquo;Invuln&eacute;rabilit&eacute; Chromatique ne peuvent <p>Les sorts d&rsquo;Invuln&eacute;rabilit&eacute; Chromatique ne peuvent
&ecirc;tre recherch&eacute;s/synth&eacute;tis&eacute;s qu&rsquo;en ayant &ecirc;tre recherch&eacute;s/synth&eacute;tis&eacute;s qu&rsquo;en ayant
compris le @Item[5YK6q2KuKArkvDWy]{Le Principe Drachromatique} (voir Les compris le @UUID[Compendium.foundryvtt-reve-de-dragon.meditations-et-ecrits.Item.UoEHSr7Mcz4crdSF]{Le Principe Drachromatique} (voir Les
grimoires, p218).</p> grimoires, p218).</p>
<p>Cette zone mobile personnelle, ob&eacute;issant &agrave; toutes les <p>Cette zone mobile personnelle, ob&eacute;issant &agrave; toutes les
@ -25,8 +25,8 @@ system:
protection chromatique au rouge r2 conf&egrave;re une protection de +2 ; protection chromatique au rouge r2 conf&egrave;re une protection de +2 ;
celle au bleu r6 une protection de +6.</p> celle au bleu r6 une protection de +6.</p>
<p>Ce sort est incompatible avec le rituel @Item[qW1vAyoqrvxG0tDn]{Haubert <p>Ce sort est incompatible avec le rituel @UUID[Compendium.foundryvtt-reve-de-dragon.sorts-oniros.Item.K9lspVNJAJmCAQHB]{Haubert
d'Oniros (rituel)}.</p> d'Oniros}.</p>
<p>V&ecirc;tements et &eacute;quipement peuvent avoir &eacute;t&eacute; <p>V&ecirc;tements et &eacute;quipement peuvent avoir &eacute;t&eacute;
color&eacute;s dans la teinte voulue par une <em>Transmutation color&eacute;s dans la teinte voulue par une <em>Transmutation

View File

@ -7,7 +7,7 @@ system:
description: >- description: >-
<p>Les sorts d&rsquo;Invuln&eacute;rabilit&eacute; Chromatique ne peuvent <p>Les sorts d&rsquo;Invuln&eacute;rabilit&eacute; Chromatique ne peuvent
&ecirc;tre recherch&eacute;s/synth&eacute;tis&eacute;s qu&rsquo;en ayant &ecirc;tre recherch&eacute;s/synth&eacute;tis&eacute;s qu&rsquo;en ayant
compris le @Item[5YK6q2KuKArkvDWy]{Le Principe Drachromatique} (voir Les compris le @UUID[Compendium.foundryvtt-reve-de-dragon.meditations-et-ecrits.Item.UoEHSr7Mcz4crdSF]{Le Principe Drachromatique} (voir Les
grimoires, p218).</p> grimoires, p218).</p>
<p>Cette zone mobile personnelle, ob&eacute;issant &agrave; toutes les <p>Cette zone mobile personnelle, ob&eacute;issant &agrave; toutes les
@ -25,8 +25,8 @@ system:
protection chromatique au rouge r2 conf&egrave;re une protection de +2 ; protection chromatique au rouge r2 conf&egrave;re une protection de +2 ;
celle au bleu r6 une protection de +6.</p> celle au bleu r6 une protection de +6.</p>
<p>Ce sort est incompatible avec le rituel @Item[qW1vAyoqrvxG0tDn]{Haubert <p>Ce sort est incompatible avec le rituel @UUID[Compendium.foundryvtt-reve-de-dragon.sorts-oniros.Item.K9lspVNJAJmCAQHB]{Haubert
d'Oniros (rituel)}.</p> d'Oniros}.</p>
<p>V&ecirc;tements et &eacute;quipement peuvent avoir &eacute;t&eacute; <p>V&ecirc;tements et &eacute;quipement peuvent avoir &eacute;t&eacute;
color&eacute;s dans la teinte voulue par une&nbsp;<em>Transmutation color&eacute;s dans la teinte voulue par une&nbsp;<em>Transmutation

View File

@ -7,7 +7,7 @@ system:
description: >- description: >-
<p>Les sorts d&rsquo;Invuln&eacute;rabilit&eacute; Chromatique ne peuvent <p>Les sorts d&rsquo;Invuln&eacute;rabilit&eacute; Chromatique ne peuvent
&ecirc;tre recherch&eacute;s/synth&eacute;tis&eacute;s qu&rsquo;en ayant &ecirc;tre recherch&eacute;s/synth&eacute;tis&eacute;s qu&rsquo;en ayant
compris le @Item[5YK6q2KuKArkvDWy]{Le Principe Drachromatique} (voir Les compris le @UUID[Compendium.foundryvtt-reve-de-dragon.meditations-et-ecrits.Item.UoEHSr7Mcz4crdSF]{Le Principe Drachromatique} (voir Les
grimoires, p218).</p> grimoires, p218).</p>
<p>Cette zone mobile personnelle, ob&eacute;issant &agrave; toutes les <p>Cette zone mobile personnelle, ob&eacute;issant &agrave; toutes les
@ -25,8 +25,8 @@ system:
protection chromatique au rouge r2 conf&egrave;re une protection de +2 ; protection chromatique au rouge r2 conf&egrave;re une protection de +2 ;
celle au bleu r6 une protection de +6.</p> celle au bleu r6 une protection de +6.</p>
<p>Ce sort est incompatible avec le rituel @Item[qW1vAyoqrvxG0tDn]{Haubert <p>Ce sort est incompatible avec le rituel @UUID[Compendium.foundryvtt-reve-de-dragon.sorts-oniros.Item.K9lspVNJAJmCAQHB]{Haubert
d'Oniros (rituel)}.</p> d'Oniros}.</p>
<p>V&ecirc;tements et &eacute;quipement peuvent avoir &eacute;t&eacute; <p>V&ecirc;tements et &eacute;quipement peuvent avoir &eacute;t&eacute;
color&eacute;s dans la teinte voulue par une&nbsp;<em>Transmutation color&eacute;s dans la teinte voulue par une&nbsp;<em>Transmutation

View File

@ -7,7 +7,7 @@ system:
description: >- description: >-
<p>Les sorts d&rsquo;Invuln&eacute;rabilit&eacute; Chromatique ne peuvent <p>Les sorts d&rsquo;Invuln&eacute;rabilit&eacute; Chromatique ne peuvent
&ecirc;tre recherch&eacute;s/synth&eacute;tis&eacute;s qu&rsquo;en ayant &ecirc;tre recherch&eacute;s/synth&eacute;tis&eacute;s qu&rsquo;en ayant
compris le @Item[5YK6q2KuKArkvDWy]{Le Principe Drachromatique} (voir Les compris le @UUID[Compendium.foundryvtt-reve-de-dragon.meditations-et-ecrits.Item.UoEHSr7Mcz4crdSF]{Le Principe Drachromatique} (voir Les
grimoires, p218).</p> grimoires, p218).</p>
<p>Cette zone mobile personnelle, ob&eacute;issant &agrave; toutes les <p>Cette zone mobile personnelle, ob&eacute;issant &agrave; toutes les
@ -25,8 +25,8 @@ system:
protection chromatique au rouge r2 conf&egrave;re une protection de +2 ; protection chromatique au rouge r2 conf&egrave;re une protection de +2 ;
celle au bleu r6 une protection de +6.</p> celle au bleu r6 une protection de +6.</p>
<p>Ce sort est incompatible avec le rituel @Item[qW1vAyoqrvxG0tDn]{Haubert <p>Ce sort est incompatible avec le rituel @UUID[Compendium.foundryvtt-reve-de-dragon.sorts-oniros.Item.K9lspVNJAJmCAQHB]{Haubert
d'Oniros (rituel)}.</p> d'Oniros}.</p>
<p>V&ecirc;tements et &eacute;quipement peuvent avoir &eacute;t&eacute; <p>V&ecirc;tements et &eacute;quipement peuvent avoir &eacute;t&eacute;
color&eacute;s dans la teinte voulue par une <em>Transmutation color&eacute;s dans la teinte voulue par une <em>Transmutation

View File

@ -22,7 +22,7 @@ system:
<li>Visage et torse (+ &eacute;paules/bras/mains) : 4 m</li> <li>Visage et torse (+ &eacute;paules/bras/mains) : 4 m</li>
<li>Nudit&eacute; quasi totale : 8 m, comme une lanterne ou le sort de <li>Nudit&eacute; quasi totale : 8 m, comme une lanterne ou le sort de
@Item[frNisNWwVXP8N5mn]{Lanterne}.</li> @UUID[Compendium.foundryvtt-reve-de-dragon.sorts-oniros.Item.tuVJbePw7bmVs2pO]{Lanterne}.</li>
</ul> </ul>
descriptionmj: '' descriptionmj: ''

View File

@ -6,7 +6,7 @@ effects: []
system: system:
description: >- description: >-
<p>La recherche des zones de Transmutation Chromatique requiert la <p>La recherche des zones de Transmutation Chromatique requiert la
connaissance du @Item[5YK6q2KuKArkvDWy]{Le Principe Drachromatique} (voir connaissance du @UUID[Compendium.foundryvtt-reve-de-dragon.meditations-et-ecrits.Item.UoEHSr7Mcz4crdSF]{Le Principe Drachromatique} (voir
Les grimoires, p218).</p> Les grimoires, p218).</p>
<p>Les zones de Transmutation Chromatique modifient la couleur des objets <p>Les zones de Transmutation Chromatique modifient la couleur des objets

View File

@ -6,7 +6,7 @@ effects: []
system: system:
description: >- description: >-
<p>La recherche des zones de Transmutation Chromatique requiert la <p>La recherche des zones de Transmutation Chromatique requiert la
connaissance du @Item[5YK6q2KuKArkvDWy]{Le Principe Drachromatique} (voir connaissance du @UUID[Compendium.foundryvtt-reve-de-dragon.meditations-et-ecrits.Item.UoEHSr7Mcz4crdSF]{Le Principe Drachromatique} (voir
Les grimoires, p218).</p> Les grimoires, p218).</p>
<p>Les zones de Transmutation Chromatique modifient la couleur des objets <p>Les zones de Transmutation Chromatique modifient la couleur des objets

View File

@ -6,7 +6,7 @@ effects: []
system: system:
description: >- description: >-
<p>La recherche des zones de Transmutation Chromatique requiert la <p>La recherche des zones de Transmutation Chromatique requiert la
connaissance du @Item[5YK6q2KuKArkvDWy]{Le Principe Drachromatique} (voir connaissance du @UUID[Compendium.foundryvtt-reve-de-dragon.meditations-et-ecrits.Item.UoEHSr7Mcz4crdSF]{Le Principe Drachromatique} (voir
Les grimoires, p218).</p> Les grimoires, p218).</p>
<p>Les zones de Transmutation Chromatique modifient la couleur des objets <p>Les zones de Transmutation Chromatique modifient la couleur des objets

View File

@ -6,7 +6,7 @@ effects: []
system: system:
description: >- description: >-
<p>La recherche des zones de Transmutation Chromatique requiert la <p>La recherche des zones de Transmutation Chromatique requiert la
connaissance du @Item[5YK6q2KuKArkvDWy]{Le Principe Drachromatique} (voir connaissance du @UUID[Compendium.foundryvtt-reve-de-dragon.meditations-et-ecrits.Item.UoEHSr7Mcz4crdSF]{Le Principe Drachromatique} (voir
Les grimoires, p218).</p> Les grimoires, p218).</p>
<p>Les zones de Transmutation Chromatique modifient la couleur des objets <p>Les zones de Transmutation Chromatique modifient la couleur des objets

View File

@ -6,7 +6,7 @@ effects: []
system: system:
description: >- description: >-
<p>La recherche des zones de Transmutation Chromatique requiert la <p>La recherche des zones de Transmutation Chromatique requiert la
connaissance du @Item[5YK6q2KuKArkvDWy]{Le Principe Drachromatique} (voir connaissance du @UUID[Compendium.foundryvtt-reve-de-dragon.meditations-et-ecrits.Item.UoEHSr7Mcz4crdSF]{Le Principe Drachromatique} (voir
Les grimoires, p218).</p> Les grimoires, p218).</p>
<p>Les zones de Transmutation Chromatique modifient la couleur des objets <p>Les zones de Transmutation Chromatique modifient la couleur des objets

View File

@ -6,7 +6,7 @@ effects: []
system: system:
description: >- description: >-
<p>La recherche des zones de Transmutation Chromatique requiert la <p>La recherche des zones de Transmutation Chromatique requiert la
connaissance du @Item[5YK6q2KuKArkvDWy]{Le Principe Drachromatique} (voir connaissance du @UUID[Compendium.foundryvtt-reve-de-dragon.meditations-et-ecrits.Item.UoEHSr7Mcz4crdSF]{Le Principe Drachromatique} (voir
Les grimoires, p218).</p> Les grimoires, p218).</p>
<p>Les zones de Transmutation Chromatique modifient la couleur des objets <p>Les zones de Transmutation Chromatique modifient la couleur des objets

View File

@ -2146,8 +2146,8 @@ items:
la même : objet en objet. Lintensité de la saveur est celle de la la même : objet en objet. Lintensité de la saveur est celle de la
cible. Comme pour tous les sorts dillusions sensorielles, la saveur cible. Comme pour tous les sorts dillusions sensorielles, la saveur
illusoire ne peut être quune saveur connue du haut-rêvant. Couplé à illusoire ne peut être quune saveur connue du haut-rêvant. Couplé à
@Item[dEs7qg5UsqpQxok6]{Narine d'Hypnos} et à @UUID[Compendium.foundryvtt-reve-de-dragon.sorts-hypnos.Item.nNh8N9nF8m6zLtrt]{Narine d'Hypnos} et à
@Item[skPIvFb5tRRPHDGU]{Transfiguration}, ce sort peut permettre des @UUID[Compendium.foundryvtt-reve-de-dragon.sorts-hypnos.Item.ktFI49xqZ0mGfTzt]{Transfiguration}, ce sort peut permettre des
ignominies gastronomiques : que pensez- vous de ce vin à la robe de ignominies gastronomiques : que pensez- vous de ce vin à la robe de
rubis, au savoureux bouquet de framboise, et qui vous roule sur la rubis, au savoureux bouquet de framboise, et qui vous roule sur la
langue comme du velours ?... Illusion de bout en bout, ce nest que de langue comme du velours ?... Illusion de bout en bout, ce nest que de
@ -2183,7 +2183,7 @@ items:
system: system:
description: >- description: >-
<p>Narine dHypnos est une illusion purement <em>olfactive</em>. Son <p>Narine dHypnos est une illusion purement <em>olfactive</em>. Son
fonctionnement est identique à @Item[QdtcV9WVi9BdL153]{Tympan d'Hypnos}, fonctionnement est identique à @UUID[Compendium.foundryvtt-reve-de-dragon.sorts-hypnos.Item.D9eSbTGp3i5gdbc5]{Tympan d'Hypnos},
sappliquant aux odeurs à la place des sons. Lillusion doit sappliquant aux odeurs à la place des sons. Lillusion doit
pareillement rester dans la même catégorie que la cible. Peu utilisé sur pareillement rester dans la même catégorie que la cible. Peu utilisé sur
les humanoïdes et les animaux, à moins davoir une raison très précise les humanoïdes et les animaux, à moins davoir une raison très précise

View File

@ -2246,7 +2246,7 @@ items:
description: >- description: >-
<p>Tympan dHypnos est une illusion purement <em>auditive </em>pouvant <p>Tympan dHypnos est une illusion purement <em>auditive </em>pouvant
sappliquer indifféremment à un humanoïde, un animal ou un objet. Comme sappliquer indifféremment à un humanoïde, un animal ou un objet. Comme
pour @Item[skPIvFb5tRRPHDGU]{Transfiguration}, lillusion doit toujours pour @UUID[Compendium.foundryvtt-reve-de-dragon.sorts-hypnos.Item.ktFI49xqZ0mGfTzt]{Transfiguration}, lillusion doit toujours
appartenir à la même catégorie que la cible. Toute disparité entraîne appartenir à la même catégorie que la cible. Toute disparité entraîne
les mêmes conséquences. On peut ainsi changer la voix dun humanoïde en les mêmes conséquences. On peut ainsi changer la voix dun humanoïde en
une autre <em>voix </em>dhumanoïde, le cri dun animal en <em>cri une autre <em>voix </em>dhumanoïde, le cri dun animal en <em>cri
@ -2254,7 +2254,7 @@ items:
objet. Lancer Tympan dHypnos sur un objet non sonore naboutit à aucun objet. Lancer Tympan dHypnos sur un objet non sonore naboutit à aucun
effet. Ce sort permet entre autres denrichir une illusion visuelle en effet. Ce sort permet entre autres denrichir une illusion visuelle en
lui apportant son complément sonore, diminuant ainsi les risques de lui apportant son complément sonore, diminuant ainsi les risques de
@JournalEntry[9bvrfDaudPqvQZPY]{Conflit de sens}. Le cri illusoire dun @UUID[Compendium.foundryvtt-reve-de-dragon.rappel-des-regles.JournalEntry.ZmMoOtUdgjMd4cNs]{Conflit de sens}. Le cri illusoire dun
animal doit être le cri dun animal connu, et vouloir donner à un animal doit être le cri dun animal connu, et vouloir donner à un
humanoïde la même voix que quelquun dautre demande un jet dOUÏE à -8, humanoïde la même voix que quelquun dautre demande un jet dOUÏE à -8,
avec les mêmes remarques que pour Transfiguration. Noter que seule la avec les mêmes remarques que pour Transfiguration. Noter que seule la

View File

@ -2112,7 +2112,7 @@ items:
<p>Ce rituel permet dentendre à distance. Il doit être ciblé sur un <p>Ce rituel permet dentendre à distance. Il doit être ciblé sur un
instrument sonore (harpe, luth, gong, cloche, etc.) faute de quoi lon instrument sonore (harpe, luth, gong, cloche, etc.) faute de quoi lon
aboutit à un cas de @JournalEntry[eANDHKJXMPmPNJ2F]{Magie impossible}. aboutit à un cas de @UUID[Compendium.foundryvtt-reve-de-dragon.rappel-des-regles.JournalEntry.erO7AICiN1LtRyFg]{Magie impossible}.
Lors du lancer, le rituel doit être paramétré sur une personne précise Lors du lancer, le rituel doit être paramétré sur une personne précise
(humanoïde) ou un lieu architectural précis (salle, couloir, perron, (humanoïde) ou un lieu architectural précis (salle, couloir, perron,
escalier, balcon, etc.). Les éléments naturels du paysage (rochers, escalier, balcon, etc.). Les éléments naturels du paysage (rochers,
@ -2168,8 +2168,7 @@ items:
<p>Ce rituel permet de voir à distance. Il doit être ciblé sur un miroir <p>Ce rituel permet de voir à distance. Il doit être ciblé sur un miroir
ou une surface réfléchissante, comme de leau parfaitement calme, faute ou une surface réfléchissante, comme de leau parfaitement calme, faute
de quoi lon aboutit à un cas de @JournalEntry[eANDHKJXMPmPNJ2F]{Magie de quoi lon aboutit à un cas de @UUID[Compendium.foundryvtt-reve-de-dragon.rappel-des-regles.JournalEntry.erO7AICiN1LtRyFg]{Magie impossible}. Lors du lancer, le rituel doit être paramétré sur une
impossible}. Lors du lancer, le rituel doit être paramétré sur une
personne ou un lieu architectural précis, mêmes restrictions que pour personne ou un lieu architectural précis, mêmes restrictions que pour
Harpe dHypnos. Puis le sort étant ciblé sur le miroir, le haut-rêvant Harpe dHypnos. Puis le sort étant ciblé sur le miroir, le haut-rêvant
croit voir y évoluer des formes, qui le plongent aussitôt dans un état croit voir y évoluer des formes, qui le plongent aussitôt dans un état

View File

@ -797,6 +797,9 @@ input:is(.blessure-premiers_soins, .blessure-soins_complets) {
padding: 0; padding: 0;
overflow-y: auto; overflow-y: auto;
} }
.item-list-title{
flex: 0;
}
.foundryvtt-reve-de-dragon .item-list .item-header { .foundryvtt-reve-de-dragon .item-list .item-header {
font-weight: bold; font-weight: bold;
@ -816,12 +819,12 @@ input:is(.blessure-premiers_soins, .blessure-soins_complets) {
.competence-list .item-controls.hidden-controls { .competence-list .item-controls.hidden-controls {
display: none !important; display: none !important;
} }
.item-controls i:is(.fas, .fa, .fa-solid) { .item-controls i:is(.fas, .fa, .fa-solid, .fa-regular) {
font-size: 0.8em; font-size: 0.8em;
color: var(--color-controls); color: var(--color-controls);
} }
.item-controls i:is(.fas, .far, .fa-solid):hover { .item-controls i:is(.fas, .far, .fa-solid, .fa-regular):hover {
opacity: 0.7 ; opacity: 0.6;
} }
.rdd-roll-dialog .description-sort { .rdd-roll-dialog .description-sort {

View File

@ -16,9 +16,9 @@
}, },
"background": { "background": {
"metier": "", "metier": "",
"biographie": "Histoire personnelle...", "biographie": "",
"notes": "Notes", "notes": "",
"notesmj": "Notes du MJ", "notesmj": "",
"race": "Humain", "race": "Humain",
"yeux": "", "yeux": "",
"cheveux": "", "cheveux": "",
@ -191,18 +191,18 @@
"label": "+dom", "label": "+dom",
"derivee": true "derivee": true
}, },
"vitesse": {
"type": "string",
"value": 0,
"label": "Vitesse",
"derivee": false
},
"encombrement": { "encombrement": {
"type": "number", "type": "number",
"value": 0, "value": 0,
"label": "Encombrement", "label": "Encombrement",
"derivee": true "derivee": true
}, },
"vitesse": {
"type": "string",
"value": 0,
"label": "Vitesse",
"derivee": false
},
"protection": { "protection": {
"type": "number", "type": "number",
"value": 0, "value": 0,

View File

@ -47,8 +47,10 @@
</div> </div>
<div class="grid grid-2col"> <div class="grid grid-2col">
<div class="flex-group-left flexcol"> <div class="flex-group-left flexcol">
<ul class="carac-list alterne-list">
{{>"systems/foundryvtt-reve-de-dragon/templates/actor/carac-main.html"}} {{>"systems/foundryvtt-reve-de-dragon/templates/actor/carac-main.html"}}
{{>"systems/foundryvtt-reve-de-dragon/templates/actor/carac-creature.html"}} {{>"systems/foundryvtt-reve-de-dragon/templates/actor/carac-creature.html"}}
</ul>
</div> </div>
<div class="flex-group-left flexcol competence-column"> <div class="flex-group-left flexcol competence-column">
{{>"systems/foundryvtt-reve-de-dragon/templates/actor/comp-creature.html"}} {{>"systems/foundryvtt-reve-de-dragon/templates/actor/comp-creature.html"}}

View File

@ -33,8 +33,10 @@
</div> </div>
<div class="grid grid-2col"> <div class="grid grid-2col">
<div class="flex-group-left flexcol"> <div class="flex-group-left flexcol">
<ul class="carac-list alterne-list">
{{>"systems/foundryvtt-reve-de-dragon/templates/actor/carac-main.html"}} {{>"systems/foundryvtt-reve-de-dragon/templates/actor/carac-main.html"}}
{{>"systems/foundryvtt-reve-de-dragon/templates/actor/carac-entitee.html"}} {{>"systems/foundryvtt-reve-de-dragon/templates/actor/carac-entitee.html"}}
</ul>
</div> </div>
<div class="flex-group-left flexcol"> <div class="flex-group-left flexcol">
<div class="flex-group-left flexcol competence-column"> <div class="flex-group-left flexcol competence-column">

View File

@ -41,8 +41,10 @@
</div> </div>
<div class="grid grid-2col"> <div class="grid grid-2col">
<div class="flex-group-left flexcol"> <div class="flex-group-left flexcol">
<ul class="carac-list alterne-list">
{{>"systems/foundryvtt-reve-de-dragon/templates/actor/carac-main.html"}} {{>"systems/foundryvtt-reve-de-dragon/templates/actor/carac-main.html"}}
{{>"systems/foundryvtt-reve-de-dragon/templates/actor/carac-total.html"}} {{>"systems/foundryvtt-reve-de-dragon/templates/actor/carac-total.html"}}
</ul>
</div> </div>
<div class="flex-group-left flexcol" > <div class="flex-group-left flexcol" >
{{>"systems/foundryvtt-reve-de-dragon/templates/actor/carac-derivee.html"}} {{>"systems/foundryvtt-reve-de-dragon/templates/actor/carac-derivee.html"}}

View File

@ -1,11 +1,10 @@
<ol class="carac-list alterne-list">
{{#each system.attributs as |attr key|}} {{#each system.attributs as |attr key|}}
{{#if (and (eq key 'plusdom') (eq @root.system.definition.typeentite 'nonincarne'))}} {{#if (and (eq key 'plusdom') (eq @root.system.definition.typeentite 'nonincarne'))}}
{{else}} {{else}}
<li class="caracteristique flexrow list-item" data-attribute="{{key}}"> <li class="caracteristique flexrow list-item" data-attribute="{{key}}">
<span class="carac-label" name="system.attributs.{{key}}.label">{{attr.label}}</span> <span class="carac-label" name="system.attributs.{{key}}.label">{{attr.label}}</span>
{{#if (actor-default @root.type 'attributs' key 'derivee')}} {{#if (actor-default @root.type 'attributs' key 'derivee')}}
<input class="caracteristique streched" type="text" name="system.attributs.{{key}}.value" <input class="carac-value" type="text" name="system.attributs.{{key}}.value"
{{#if (eq key 'plusdom')}} {{#if (eq key 'plusdom')}}
value="{{numberFormat attr.value decimals=0 sign=true}}" value="{{numberFormat attr.value decimals=0 sign=true}}"
{{else}} {{else}}
@ -15,7 +14,7 @@
{{else}} {{else}}
<input class="caracteristique streched" type="text" name="system.attributs.{{key}}.value" value="{{attr.value}}" data-dtype="{{attr.type}}" {{#unless @root.options.vueDetaillee}}disabled{{/unless}}/> <input class="caracteristique streched" type="text" name="system.attributs.{{key}}.value" value="{{attr.value}}" data-dtype="{{attr.type}}" {{#unless @root.options.vueDetaillee}}disabled{{/unless}}/>
{{/if}} {{/if}}
<label class="carac-xp"/>
</li> </li>
{{/if}} {{/if}}
{{/each}} {{/each}}
</ol>

View File

@ -37,7 +37,7 @@
<input class="derivee-value" type="number" name="system.compteurs.dissolution.value" value="{{system.compteurs.dissolution.value}}" data-dtype="number"/> <input class="derivee-value" type="number" name="system.compteurs.dissolution.value" value="{{system.compteurs.dissolution.value}}" data-dtype="number"/>
</li> </li>
<li class="caracteristique flexrow list-item"> <li class="caracteristique flexrow list-item">
<label class="derivee-label chance-actuelle" data-tooltip="Jet de chance actuelle"><a>Chance actuelle</a></label> <label class="derivee-label chance-actuelle" data-tooltip="Jet de chance actuelle"><a class="roll-chance-actuelle">Chance actuelle</a></label>
<input class="derivee-value" type="number" name="system.compteurs.chance.value" value="{{system.compteurs.chance.value}}" data-dtype="number"/> <input class="derivee-value" type="number" name="system.compteurs.chance.value" value="{{system.compteurs.chance.value}}" data-dtype="number"/>
</li> </li>
<li class="caracteristique flexrow list-item"> <li class="caracteristique flexrow list-item">

View File

@ -1,16 +1,21 @@
<ol class="carac-list alterne-list">
<li class="caracteristique flexrow list-item"> <li class="caracteristique flexrow list-item">
<span class="carac-label" name="catEntite">Catégorie : </span> <span class="carac-label">Niveau</span>
<label class="carac-value">{{numberFormat niveau decimals=0 sign=true}}
</label>
<label class="carac-xp"/>
</li>
{{>"systems/foundryvtt-reve-de-dragon/templates/actor/carac-creature.html"}}
<li class="caracteristique flexrow list-item">
<span class="carac-label" name="catEntite">Catégorie</span>
<select name="system.definition.categorieentite" value="{{system.definition.categorieentite}}" data-dtype="String" {{#unless @root.options.vueDetaillee}}disabled{{/unless}}> <select name="system.definition.categorieentite" value="{{system.definition.categorieentite}}" data-dtype="String" {{#unless @root.options.vueDetaillee}}disabled{{/unless}}>
{{selectOptions (RDD_CONFIG 'categorieEntite') selected=system.definition.categorieentite}} {{selectOptions (RDD_CONFIG 'categorieEntite') selected=system.definition.categorieentite}}
</select> </select>
<label class="carac-xp"/>
</li> </li>
<li class="caracteristique flexrow list-item"> <li class="caracteristique flexrow list-item">
<span class="carac-label" name="typeEntite">Type d'entité : </span> <span class="carac-label" name="typeEntite">Type d'entité</span>
<select name="system.definition.typeentite" value="{{system.definition.typeentite}}" data-dtype="String" {{#unless @root.options.vueDetaillee}}disabled{{/unless}}> <select name="system.definition.typeentite" value="{{system.definition.typeentite}}" data-dtype="String" {{#unless @root.options.vueDetaillee}}disabled{{/unless}}>
{{selectOptions (RDD_CONFIG 'typeEntite') selected=system.definition.typeentite}} {{selectOptions (RDD_CONFIG 'typeEntite') selected=system.definition.typeentite}}
</select> </select>
<label class="carac-xp"/>
</li> </li>
</ol>
{{> "systems/foundryvtt-reve-de-dragon/templates/actor/carac-creature.html"}}

View File

@ -1,4 +1,3 @@
<ul class="carac-list alterne-list">
{{#each system.carac as |carac key|}} {{#each system.carac as |carac key|}}
{{#if (and (eq key 'taille') (eq @root.system.definition.typeentite 'nonincarne'))}} {{#if (and (eq key 'taille') (eq @root.system.definition.typeentite 'nonincarne'))}}
{{else}} {{else}}
@ -10,7 +9,7 @@
{{else}} {{else}}
{{#if (actor-default @root.type 'carac' key 'derivee')}} {{#if (actor-default @root.type 'carac' key 'derivee')}}
<span class="carac-label" name="system.carac.{{key}}.label"><a class="roll-carac" data-carac-name={{key}}>{{carac.label}}</a></span> <span class="carac-label" name="system.carac.{{key}}.label"><a class="roll-carac" data-carac-name={{key}}>{{carac.label}}</a></span>
<label class="competence-value">{{carac.value}}</label> <label class="carac-value">{{carac.value}}</label>
<label class="carac-xp"/> <label class="carac-xp"/>
{{else}} {{else}}
{{#if carac.isLevelUp}} {{#if carac.isLevelUp}}
@ -36,4 +35,3 @@
</li> </li>
{{/if}} {{/if}}
{{/each}} {{/each}}
</ul>

View File

@ -1,14 +1,13 @@
<h4>Compétences{{#if @root.options.vueDetaillee}} <a class="competence-add" data-tooltip="Ajouter une compétence"> <h4 class="item-list-title">Compétences{{#if @root.options.vueDetaillee}} <a class="competence-add" data-tooltip="Ajouter une compétence">
<i class="fa-solid fa-books-medical"></i> <i class="fa-solid fa-books-medical"></i>
</a>{{/if}}</h4> </a>{{/if}}</h4>
<ol class="item-list alterne-list"> <ul class="item-list alterne-list">
{{#each (trier competences) as |comp key|}} {{#each (trier competences) as |comp key|}}
<li class="item flexrow list-item" data-item-id="{{comp._id}}"> <li class="item flexrow list-item" data-item-id="{{comp._id}}">
<a class="competence-label roll-competence"> <a class="competence-label roll-competence">
<img class="sheet-competence-img" src="{{comp.img}}" data-tooltip="{{comp.name}}"/> <img class="sheet-competence-img" src="{{comp.img}}" data-tooltip="{{comp.name}}"/>
<span>{{comp.name}}</span> <span>{{comp.name}}</span>
</a> </a>
<input class="competence-carac creature-carac" type="text" compname="{{comp.name}}" name="{{comp._id}}.carac" <input class="competence-carac creature-carac" type="text" compname="{{comp.name}}" name="{{comp._id}}.carac"
value="{{comp.system.carac_value}}" data-dtype="number" value="{{comp.system.carac_value}}" data-dtype="number"
{{#unless @root.options.vueDetaillee}}disabled{{/unless}}/> {{#unless @root.options.vueDetaillee}}disabled{{/unless}}/>
@ -32,4 +31,4 @@
{{/if}} {{/if}}
</li> </li>
{{/each}} {{/each}}
</ol> </ul>

View File

@ -54,7 +54,7 @@
{{>"systems/foundryvtt-reve-de-dragon/templates/actor/export-scriptarium/carac.hbs" carac=export.empathie}} {{>"systems/foundryvtt-reve-de-dragon/templates/actor/export-scriptarium/carac.hbs" carac=export.empathie}}
{{>"systems/foundryvtt-reve-de-dragon/templates/actor/export-scriptarium/carac.hbs" carac=export.intellect}} {{>"systems/foundryvtt-reve-de-dragon/templates/actor/export-scriptarium/carac.hbs" carac=export.intellect}}
{{>"systems/foundryvtt-reve-de-dragon/templates/actor/export-scriptarium/carac-compteur.hbs" carac=export.reve actuel=export.reve_actuel button-name='ptreve-actuel'}} {{>"systems/foundryvtt-reve-de-dragon/templates/actor/export-scriptarium/carac-compteur.hbs" carac=export.reve actuel=export.reve_actuel button-name='ptreve-actuel'}}
{{>"systems/foundryvtt-reve-de-dragon/templates/actor/export-scriptarium/carac.hbs" carac=export.chance}} {{>"systems/foundryvtt-reve-de-dragon/templates/actor/export-scriptarium/carac-compteur.hbs" carac=export.chance actuel=export.chance_actuel button-name='chance-actuelle'}}
</div> </div>
<div class="flexcol flex-group-top"> <div class="flexcol flex-group-top">
{{>"systems/foundryvtt-reve-de-dragon/templates/actor/export-scriptarium/carac-derivee.hbs" carac=export.melee}} {{>"systems/foundryvtt-reve-de-dragon/templates/actor/export-scriptarium/carac-derivee.hbs" carac=export.melee}}

View File

@ -1,5 +1,6 @@
{{#if sortsReserve.length}} {{#if sortsReserve.length}}
<h3>Sorts en Réserve{{#if options.isGM}} <a class="nouveau-sort-reserve"><i class="fa-solid fa-sparkles"></i> <h3>Sorts en Réserve{{#if options.isGM}} <a class="sortreserve-add">
<i class="fa-solid fa-sparkles"></i>
</a>{{/if}} </a>{{/if}}
</h3> </h3>
<ul class="item-list alterne-list"> <ul class="item-list alterne-list">

View File

@ -5,8 +5,12 @@
<li class="item list-item flexrow" data-item-id="{{sort._id}}" data-attribute="{{key}}" data-tooltip="{{#if sort.system.isrituel}}Rituel{{else}}Sort{{/if}}: {{sort.name}}"> <li class="item list-item flexrow" data-item-id="{{sort._id}}" data-attribute="{{key}}" data-tooltip="{{#if sort.system.isrituel}}Rituel{{else}}Sort{{/if}}: {{sort.name}}">
<img class="sheet-competence-img" src="{{sort.img}}"/> <img class="sheet-competence-img" src="{{sort.img}}"/>
<span class="flex-shrink">{{itemSort-shortDraconic sort.system.draconic}}</span> <span class="flex-shrink">{{itemSort-shortDraconic sort.system.draconic}}</span>
<span class="item-edit flex-grow-3">{{sort.name}}{{#if sort.system.isrituel}} <span class="item-edit flex-grow-3">{{sort.name}}
<i class="fa-regular fa-book-sparkles"></i>{{/if}}</span> {{#if sort.system.isrituel}}<i class="fa-solid fa-book-sparkles"></i>{{/if}}
{{#if sort.system.coutseuil}}
{{#repeat sort.system.coutseuil}}<i class="fa-solid fa-star-sharp" data-tooltip="coût de seuil: {{sort.system.coutseuil}}"></i>{{/repeat}}
{{/if}}
</span>
<span class="flex-grow-2"> <span class="flex-grow-2">
{{#if sort.system.caseTMRspeciale}}{{sort.system.caseTMRspeciale}}{{else}}{{upperFirst sort.system.caseTMR}}{{/if}} {{#if sort.system.caseTMRspeciale}}{{sort.system.caseTMRspeciale}}{{else}}{{upperFirst sort.system.caseTMR}}{{/if}}
</span> </span>
@ -15,6 +19,11 @@
<a class="item-edit" data-tooltip="Modifier"><i class="fas fa-edit"></i></a> <a class="item-edit" data-tooltip="Modifier"><i class="fas fa-edit"></i></a>
<a class="item-delete" data-tooltip="Supprimer"><i class="fas fa-trash"></i></a> <a class="item-delete" data-tooltip="Supprimer"><i class="fas fa-trash"></i></a>
<a class="item-montrer" data-tooltip="Montrer"><i class="fas fa-comment"></i></a> <a class="item-montrer" data-tooltip="Montrer"><i class="fas fa-comment"></i></a>
{{#if (and @root.options.isGM (not sort.system.isrituel))}}
<a class="sortreserve-add" data-tooltip="Ajouter ce sort en réserve">
<i class="fa-solid fa-sparkles"></i>
</a>
{{/if}}
</div> </div>
</li> </li>
{{/each}} {{/each}}