forked from public/foundryvtt-reve-de-dragon
Compare commits
21 Commits
4dd6e1c3ff
...
12.0.29
Author | SHA1 | Date | |
---|---|---|---|
14abfa8e7d | |||
1f564e0d89 | |||
ab61d5991d | |||
e3a858a9ef | |||
4cacf46ed8 | |||
5a5b5cdbb3 | |||
f90dddfbf8 | |||
d04da56c22 | |||
a87a4d371e | |||
c577fa5f29 | |||
30303330d7 | |||
ded92ddf2d | |||
2d2b75e33f | |||
a9b7dff83a | |||
75d6f78b40 | |||
979d49f96e | |||
22cab26908 | |||
23b3be246b | |||
b160ce78bc | |||
60921cfef1 | |||
12e5c94aba |
20
changelog.md
20
changelog.md
@ -1,8 +1,17 @@
|
||||
# 12.0
|
||||
## 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
|
||||
- Ajout de la liste des armures dans l'onglet caractéristiques
|
||||
- Ajout d'une option pour choisir une carte des TMR alternatives
|
||||
- Le Gardien peut créer des sorts en réserve parmi les sorts d'un personnage
|
||||
- Bouton pour ajouter des compétences aux créatures/entités
|
||||
- Bouton pour ajouter un personnage accordé aux entités de cauchemar
|
||||
- Correction du choix d'une cible parmi toutes les cibles pour les combats
|
||||
- Correction des ajouts de blessures (prise en compte de l'endurance et des contusions)
|
||||
- Correction des rituels de Détection et Lecture d'Aura des personnages prétirés
|
||||
@ -11,6 +20,11 @@
|
||||
- ajout de lien entre le sort et la créature
|
||||
- correction des liens vers les journaux
|
||||
- limitation aux compétences listées
|
||||
- acteur non lié par défaut
|
||||
- Correction des compendiums
|
||||
- l'import de personnages depuis un compendium respecte les acteurs liés/non-liés
|
||||
- les modèles de voyageurs sont liés par défaut
|
||||
- les modèles de personnages non joueurs sont non-liés par défaut
|
||||
|
||||
## 12.0.26 - Astrobazzarh le Haut-rêvant
|
||||
- bouton pour le don de haut-rêve en un clic
|
||||
@ -108,11 +122,9 @@
|
||||
- encodage de l'export en windows-1252
|
||||
- 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
|
||||
|
||||
## 12.0.9 - Le scriptorium d'Astrobazzarh
|
||||
- ajout d'une fonction avancée pour exporter les personnages dans un format csv
|
||||
- ajout d'une fonction avancée pour un exporter "scriptarium" des personnages
|
||||
|
||||
## 12.0.8 - La quincaillerie d'Astrobazzarh
|
||||
- le propriétaire est indiqué dans les feuilles d'équipements/compétences/...
|
||||
|
@ -183,7 +183,7 @@ export class RdDActorSheet extends RdDBaseActorSangSheet {
|
||||
|
||||
// Equip Inventory Item
|
||||
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())
|
||||
|
||||
@ -214,7 +214,7 @@ export class RdDActorSheet extends RdDBaseActorSangSheet {
|
||||
// Boutons spéciaux MJs
|
||||
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('.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())
|
||||
}
|
||||
|
||||
@ -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-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-moins').click(async event => this.actor.santeIncDec("fatigue", -1))
|
||||
}
|
||||
|
@ -95,11 +95,14 @@ export class RdDActor extends RdDBaseActorSang {
|
||||
isHautRevant() { return this.system.attributs.hautrevant.value != "" }
|
||||
|
||||
/* -------------------------------------------- */
|
||||
getAgilite() { return this.system.carac.agilite?.value ?? 0 }
|
||||
getChance() { return this.system.carac.chance?.value ?? 0 }
|
||||
getAgilite() { return Misc.toInt(this.system.carac.agilite?.value ?? 0) }
|
||||
getChance() { return Misc.toInt(this.system.carac.chance?.value ?? 0) }
|
||||
|
||||
getReveActuel() { return this.system.reve?.reve?.value ?? this.carac.reve.value ?? 0 }
|
||||
getChanceActuel() { return this.system.compteurs.chance?.value ?? 10 }
|
||||
getReveActuel() { return Misc.toInt(this.system.reve?.reve?.value) ?? this.carac.reve.value ?? 0 }
|
||||
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 }
|
||||
|
||||
getEnduranceMax() { return Math.max(1, Math.max(this.getTaille() + this.getConstitution(), this.getVieMax() + this.getVolonte())) }
|
||||
@ -991,21 +994,31 @@ 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 = {
|
||||
title: "Créer un sort en réserve",
|
||||
label: "Choisir un sort",
|
||||
list: this.itemTypes[ITEM_TYPES.sort].filter(it => !it.system.isrituel)
|
||||
}
|
||||
DialogSelect.select(selectSortReserve, sort =>
|
||||
this.createEmbeddedDocuments("Item",
|
||||
[{
|
||||
type: ITEM_TYPES.sortreserve,
|
||||
name: sort.name,
|
||||
img: sort.img,
|
||||
system: { sortid: sort.id, draconic: sort.system.draconic, ptreve: Number(sort.system.ptreve.match(/\d+/)), coord: 'A1', heurecible: 'Vaisseau' }
|
||||
}],
|
||||
{ renderSheet: true }))
|
||||
DialogSelect.select(selectSortReserve, sort => this.$createSortReserve(sort))
|
||||
}
|
||||
|
||||
$createSortReserve(sort) {
|
||||
this.createEmbeddedDocuments("Item",
|
||||
[{
|
||||
type: ITEM_TYPES.sortreserve,
|
||||
name: sort.name,
|
||||
img: sort.img,
|
||||
system: { sortid: sort.id, draconic: sort.system.draconic, ptreve: Number(sort.system.ptreve.match(/\d+/)), coord: 'A1', heurecible: 'Vaisseau' }
|
||||
}],
|
||||
{ renderSheet: true })
|
||||
}
|
||||
/* -------------------------------------------- */
|
||||
async reinsertionAleatoire(raison, accessible = tmr => true) {
|
||||
@ -1070,6 +1083,11 @@ export class RdDActor extends RdDBaseActorSang {
|
||||
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() {
|
||||
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 = () => { }) {
|
||||
let destinee = this.system.compteurs.destinee?.value ?? 0;
|
||||
|
@ -1,4 +1,5 @@
|
||||
import { Grammar } from "../grammar.js";
|
||||
import { ITEM_TYPES } from "../item.js";
|
||||
import { RdDSheetUtility } from "../rdd-sheet-utility.js";
|
||||
import { RdDBaseActorSheet } from "./base-actor-sheet.js";
|
||||
|
||||
@ -36,7 +37,30 @@ export class RdDBaseActorReveSheet extends RdDBaseActorSheet {
|
||||
this.html.find('.delete-active-effect').click(async event => this.actor.removeEffect(this.html.find(event.currentTarget).parents(".active-effect").data('effect')));
|
||||
this.html.find('.enlever-tous-effets').click(async event => await this.actor.removeEffects());
|
||||
}
|
||||
this.html.find('.competence-add').click(async event =>
|
||||
await this.actor.createEmbeddedDocuments("Item", [{
|
||||
type: ITEM_TYPES.competencecreature,
|
||||
name: 'Nouvelle competence',
|
||||
img: 'systems/foundryvtt-reve-de-dragon/icons/compcreature-serres.webp',
|
||||
system: {
|
||||
carac_value: this.actor.getForce(),
|
||||
}
|
||||
}], { 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));
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -177,21 +177,6 @@ export class RdDBaseActorSheet extends ActorSheet {
|
||||
this.options.vueDetaillee = !this.options.vueDetaillee;
|
||||
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) {
|
||||
|
@ -176,11 +176,19 @@ export class RdDBaseActor extends Actor {
|
||||
await super._preCreate(data, options, user);
|
||||
|
||||
// Configure prototype token settings
|
||||
const prototypeToken = {};
|
||||
if (this.type === "personnage") Object.assign(prototypeToken, {
|
||||
sight: { enabled: true }, actorLink: true, disposition: CONST.TOKEN_DISPOSITIONS.FRIENDLY
|
||||
});
|
||||
this.updateSource({ prototypeToken });
|
||||
if (this.type === "personnage") {
|
||||
this.updateSource({
|
||||
sight: { enabled: true },
|
||||
actorLink: options.fromCompendium ? data.prototypeToken.actorLink : true,
|
||||
disposition: CONST.TOKEN_DISPOSITIONS.FRIENDLY
|
||||
})
|
||||
} else {
|
||||
const prototypeToken = {
|
||||
sight: { enabled: true },
|
||||
disposition: CONST.TOKEN_DISPOSITIONS.NEUTRAL
|
||||
}
|
||||
this.updateSource({ prototypeToken });
|
||||
}
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
|
@ -1,6 +1,7 @@
|
||||
import { RdDBaseActorReveSheet } from "./base-actor-reve-sheet.js";
|
||||
import { RdDSheetUtility } from "../rdd-sheet-utility.js";
|
||||
import { RdDUtility } from "../rdd-utility.js";
|
||||
import { DialogSelect } from "../dialog-select.js";
|
||||
|
||||
export class RdDActorEntiteSheet extends RdDBaseActorReveSheet {
|
||||
|
||||
@ -35,23 +36,31 @@ export class RdDActorEntiteSheet extends RdDBaseActorReveSheet {
|
||||
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 => {
|
||||
let compName = event.currentTarget.attributes.compname.value;
|
||||
this.actor.updateCreatureCompetence(compName, "dommages", parseInt(event.target.value));
|
||||
});
|
||||
})
|
||||
|
||||
this.html.find('.resonance-add').click(async event =>
|
||||
DialogSelect.select({
|
||||
label: "Choisir un acteur à accorder",
|
||||
list: game.actors.filter(it => it.isPersonnage() && it.prototypeToken.actorLink)
|
||||
},
|
||||
it => this.resonanceAdd(it.id))
|
||||
)
|
||||
|
||||
this.html.find('.resonance-delete').click(async event => {
|
||||
const li = RdDSheetUtility.getEventElement(event);
|
||||
const actorId = li.data("actor-id");
|
||||
if (actorId) {
|
||||
const actorResonance = game.actors.get(actorId);
|
||||
RdDUtility.confirmSubActeurDelete(this, actorResonance, li, () => {
|
||||
console.log('Delete : ', actorId);
|
||||
this.deleteSubActeur(actorId);
|
||||
this.resonanceDelete(actorId);
|
||||
RdDUtility.slideOnDelete(this, li);
|
||||
});
|
||||
})
|
||||
}
|
||||
});
|
||||
})
|
||||
}
|
||||
|
||||
async _onDropActor(event, dragData) {
|
||||
@ -60,7 +69,13 @@ export class RdDActorEntiteSheet extends RdDBaseActorReveSheet {
|
||||
super._onDropActor(event, dragData)
|
||||
}
|
||||
|
||||
async deleteSubActeur(actorId) {
|
||||
async resonanceAdd(actorId) {
|
||||
let newResonances = [...this.actor.system.sante.resonnance.actors, actorId]
|
||||
await this.actor.update({ 'system.sante.resonnance.actors': newResonances });
|
||||
}
|
||||
|
||||
async resonanceDelete(actorId) {
|
||||
console.log('Delete : ', actorId);
|
||||
let newResonances = this.actor.system.sante.resonnance.actors.filter(id => id != actorId);
|
||||
await this.actor.update({ 'system.sante.resonnance.actors': newResonances }, { renderSheet: false });
|
||||
}
|
||||
|
@ -83,6 +83,7 @@ const MAPPING_BASE = [
|
||||
{ column: "protectionarmure", colName: 'Protection', getter: (actor, context) => Mapping.getProtectionArmure(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: "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: "endurance_actuel", rollClass: 'jet-endurance', getter: (actor, context) => actor.system.sante.endurance.value },
|
||||
{ column: "esquive", getter: (actor, context) => Mapping.getEsquive(context) },
|
||||
|
@ -6,6 +6,7 @@ import { Grammar } from "../grammar.js";
|
||||
import { Misc } from "../misc.js";
|
||||
import { ENTITE_INCARNE, ENTITE_NONINCARNE } from "../constants.js";
|
||||
import { RdDItemTete } from "../item/tete.js";
|
||||
import { ITEM_TYPES } from "../item.js";
|
||||
|
||||
const WHITESPACES = "\\s+"
|
||||
const NUMERIC = "[\\+\\-]?\\d+"
|
||||
@ -26,7 +27,7 @@ const MANIEMENTS = {
|
||||
'de lancer': (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' } },
|
||||
'à 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' } },
|
||||
}
|
||||
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 });
|
||||
await newActor.remiseANeuf()
|
||||
await RdDStatBlockParser.adjustAttacks(newActor)
|
||||
await RdDStatBlockParser.setValeursActuelles(newActor, statString)
|
||||
await newActor?.sheet.render(true)
|
||||
}
|
||||
@ -267,7 +269,7 @@ export class RdDStatBlockParser {
|
||||
}
|
||||
let weapMatch = XRegExp.exec(statString, XRegExp(weapon.name
|
||||
+ "(\\s*" + XREGEXP_WEAPON_MANIEMENT + ")?"
|
||||
+ "\\s+(?<value>\\+\\d+)", 'giu'));
|
||||
+ "\\s+(?<value>[\\+\\-]?\\d+)", 'giu'));
|
||||
if (weapMatch) {
|
||||
weapon = weapon.toObject();
|
||||
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) {
|
||||
const updates = {
|
||||
}
|
||||
@ -435,7 +452,7 @@ export class RdDStatBlockParser {
|
||||
}
|
||||
|
||||
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) {
|
||||
actorData.attributs.protection.value = Number(protection.value);
|
||||
}
|
||||
@ -461,33 +478,40 @@ export class RdDStatBlockParser {
|
||||
}
|
||||
|
||||
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'))
|
||||
if (perception?.value) {
|
||||
return "creature"
|
||||
}
|
||||
if (niveau?.value) {
|
||||
if (!force) {
|
||||
return "entite"
|
||||
}
|
||||
if (!vue || perception) {
|
||||
return "creature"
|
||||
}
|
||||
return "personnage"
|
||||
}
|
||||
|
||||
static extractName(actorType, statString) {
|
||||
switch (actorType) {
|
||||
case "personnage":
|
||||
// Check if ',né le' is present
|
||||
let namePersonnage = "Importé"
|
||||
if (statString.includes(", né")) {
|
||||
// Name is all string before first comma ','
|
||||
namePersonnage = XRegExp.exec(statString, XRegExp("(?<value>[\\p{Letter}\\s\\d]+),", 'giu'));
|
||||
} else {
|
||||
namePersonnage = XRegExp.exec(statString, XRegExp("(?<value>[\\p{Letter}\\s\\d]+)\\s+TAILLE", 'giu'));
|
||||
}
|
||||
if (namePersonnage?.value) {
|
||||
return Misc.upperFirst(namePersonnage?.value);
|
||||
}
|
||||
if (actorType == "personnage") {
|
||||
// Check if ',né le' is present
|
||||
let namePersonnage = "Importé"
|
||||
if (statString.includes(", né")) {
|
||||
// Name is all string before first comma ','
|
||||
namePersonnage = XRegExp.exec(statString, XRegExp("(?<value>[\\p{Letter}\\'\\-\\s\\d]+),", 'giu'));
|
||||
} else {
|
||||
namePersonnage = XRegExp.exec(statString, XRegExp("(?<value>[\\p{Letter}\\'\\-\\s\\d]+)\\s+TAILLE", 'giu'));
|
||||
}
|
||||
if (namePersonnage?.value) {
|
||||
return Misc.upperFirst(namePersonnage?.value.toLowerCase());
|
||||
}
|
||||
}
|
||||
|
||||
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é");
|
||||
}
|
||||
|
||||
|
@ -176,7 +176,7 @@ export class RdDTMRDialog extends Dialog {
|
||||
}
|
||||
|
||||
bringSubDialogToTop() {
|
||||
if (this.subdialog?.bringToTop && this.subdialog?.element[0]) {
|
||||
if (this.subdialog?.bringToTop && this.subdialog?.element && this.subdialog?.element[0]) {
|
||||
this.subdialog.bringToTop();
|
||||
}
|
||||
}
|
||||
@ -245,6 +245,7 @@ export class RdDTMRDialog extends Dialog {
|
||||
/* -------------------------------------------- */
|
||||
updateTokens() {
|
||||
this._removeTokens(t => true);
|
||||
this.allTokens = []
|
||||
this.loadRencontres();
|
||||
this.loadCasesSpeciales();
|
||||
this._createTokens();
|
||||
@ -1133,6 +1134,14 @@ export class RdDTMRDialog extends Dialog {
|
||||
return tmr;
|
||||
}
|
||||
|
||||
getTokensDetails(coordTMR) {
|
||||
const tmrTooltip = `${coordTMR}: ${TMRUtility.getTMRLabel(coordTMR)}`
|
||||
const tokenTooltips = this.allTokens
|
||||
.filter(token => token.coordTMR() == coordTMR)
|
||||
.map(token => token.tooltip);
|
||||
return [tmrTooltip, ...tokenTooltips].reduce(Misc.joining('\n'))
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
_removeTokens(filter = it => true) {
|
||||
this.allTokens.filter(filter).forEach(token => this.pixiTMR.removeToken(token))
|
||||
@ -1144,7 +1153,7 @@ export class RdDTMRDialog extends Dialog {
|
||||
return
|
||||
}
|
||||
if (this.demiReve === token && this.isDemiReveCache()) {
|
||||
return;
|
||||
return
|
||||
}
|
||||
this.pixiTMR.positionToken(token);
|
||||
if (!this.allTokens.includes(token)) {
|
||||
|
@ -262,7 +262,24 @@ export class RdDUtility {
|
||||
'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);
|
||||
// string manipulation
|
||||
Handlebars.registerHelper('upperFirst', str => Misc.upperFirst(str ?? 'Null'));
|
||||
Handlebars.registerHelper('lowerFirst', str => Misc.lowerFirst(str ?? 'Null'));
|
||||
Handlebars.registerHelper('uppercase', str => str?.toUpperCase() ?? '');
|
||||
@ -272,47 +289,52 @@ export class RdDUtility {
|
||||
Handlebars.registerHelper('grammar-un', str => Grammar.articleIndetermine(str));
|
||||
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('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-imgSigne', (heure) => { return new Handlebars.SafeString(RdDTimestamp.imgSigne(heure)) });
|
||||
Handlebars.registerHelper('timestamp-extract', timestamp => new RdDTimestamp(timestamp).toCalendrier());
|
||||
Handlebars.registerHelper('timestamp-formulesDuree', () => RdDTimestamp.formulesDuree());
|
||||
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('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('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));
|
||||
|
||||
// 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");
|
||||
});
|
||||
// inventaire et marchands
|
||||
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('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);
|
||||
}
|
||||
|
@ -15,6 +15,7 @@ export class CarteTmr extends Draconique {
|
||||
name: 'Carte des TMR',
|
||||
hint: "Choix de l'image de la carte des TMR",
|
||||
scope: "client",
|
||||
requiresReload: true,
|
||||
config: true,
|
||||
choices: {
|
||||
[TMR_V3_COULEUR]: "TMR Scriptarium v3 couleur",
|
||||
|
@ -184,12 +184,9 @@ export class PixiTMR {
|
||||
const coordTMR = TMRUtility.oddqToCoordTMR(oddq);
|
||||
const tmr = TMRUtility.getTMR(coordTMR)
|
||||
if (tmr) {
|
||||
const tmrTooltip = `${coordTMR}: ${TMRUtility.getTMRLabel(coordTMR)}`;
|
||||
const tokenTooltips = this.tmrDialog.allTokens
|
||||
.filter(token => token.coordTMR() == coordTMR)
|
||||
.map(token => token.tooltip);
|
||||
return [tmrTooltip, ...tokenTooltips].reduce(Misc.joining('\n'))
|
||||
return this.tmrDialog.getTokensDetails(coordTMR)
|
||||
}
|
||||
return undefined
|
||||
}
|
||||
|
||||
computeEventOddq(event) {
|
||||
|
@ -227,47 +227,8 @@ system:
|
||||
que vous nous faites un peu peur ?</p>
|
||||
|
||||
<h1>Venin</h1>
|
||||
<p>@UUID[Compendium.foundryvtt-reve-de-dragon.maladies-et-poisons.Item.cFMUtU6LZG0mKeDl]{Venin de chrasme}</p>
|
||||
|
||||
<table style="width: 399px; height: 65px;" border="1">
|
||||
|
||||
<tbody>
|
||||
|
||||
<tr style="height: 16px;">
|
||||
|
||||
<td style="width: 121px; height: 16px;">Malignité</td>
|
||||
|
||||
<td style="width: 274px; height: 16px;">3</td>
|
||||
|
||||
</tr>
|
||||
|
||||
<tr style="height: 16px;">
|
||||
|
||||
<td style="width: 121px; height: 16px;">Périodicité</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: ''
|
||||
notesmj: ''
|
||||
ownership:
|
||||
|
@ -6,9 +6,8 @@ effects: []
|
||||
system:
|
||||
description: >-
|
||||
<p>Ce sort ne peut être recherché/synthétisé qu’en ayant compris le
|
||||
@Item[u2izNaMF2bnwHAwj]{Le Paradoxe de l’Immobilité Rapide} tel qu’énoncé
|
||||
par Wanister de Bravo.</p>
|
||||
|
||||
@UUID[Compendium.foundryvtt-reve-de-dragon.meditations-et-ecrits.Item.aFTL3ynBabEUHdP3]{Le Paradoxe de l’Immobilité Rapide}
|
||||
tel qu’énoncé par Wanister de Bravo.</p>
|
||||
<p>Ce sort permet de monter en TMR et d’y demeurer tout en n’étant qu’à demi
|
||||
libre de ses mouvements : à cheval, secoué dans une voiture, en bateau, etc.
|
||||
Il est également possible, sous l’effet de Concentration, de monter en TMR
|
||||
|
@ -6,7 +6,7 @@ effects: []
|
||||
system:
|
||||
description: >-
|
||||
<p>Ce sort ne peut être recherché/synthétisé qu’en 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
|
||||
l’Ancien</p>
|
||||
|
||||
<p>Cette illusion visuelle donne à la cible un air comique, drôle,
|
||||
|
@ -18,7 +18,7 @@ system:
|
||||
|
||||
<p>Ce rituel permet d’entendre à distance. Il doit être ciblé sur un
|
||||
instrument sonore (harpe, luth, gong, cloche, etc.) faute de quoi l’on
|
||||
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
|
||||
(humanoïde) ou un lieu architectural précis (salle, couloir, perron,
|
||||
escalier, balcon, etc.). Les éléments naturels du paysage (rochers, arbres,
|
||||
|
@ -13,7 +13,7 @@ system:
|
||||
l’information n’est plus transmise au cerveau. Toutefois, dès qu’un conflit
|
||||
survient avec l’un des quatre autres sens, une brume limbaire apparaît à la
|
||||
place de la cible, affectant grossièrement la forme de cette dernière (voir
|
||||
@JournalEntry[9bvrfDaudPqvQZPY]{Conflit de sens}). Le sort n’affecte
|
||||
@UUID[Compendium.foundryvtt-reve-de-dragon.rappel-des-regles.JournalEntry.ZmMoOtUdgjMd4cNs]{Conflit de sens}). Le sort n’affecte
|
||||
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 d’une
|
||||
réelle invisibilité, un humanoïde doit être intégralement nu, ou bien
|
||||
|
@ -17,9 +17,11 @@ system:
|
||||
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
|
||||
@Item[Ew5JzQ2lzcpGoF11]{Miroir d'Hypnos}, @Item[M99MFM5GalPJxIdW]{Harpe
|
||||
d'Hypnos}, @Item[phT9NLxLGFQp5CSI]{Invoquer sa voix}
|
||||
et@Item[vygR045EwEOsNqJl]{Invoquer son image}. Paramétrage et ciblage
|
||||
@UUID[Compendium.foundryvtt-reve-de-dragon.sorts-hypnos.Item.8qdOVBr3S7AhRsJw]{Miroir d'Hypnos},
|
||||
@UUID[Compendium.foundryvtt-reve-de-dragon.sorts-hypnos.Item.DvP1kqAtGpr5Kux2]{Harpe d'Hypnos},
|
||||
@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 d’Hypnos, avec
|
||||
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
|
||||
|
@ -16,8 +16,9 @@ system:
|
||||
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>
|
||||
|
||||
<p>Ce rituel est comme le négatif de @Item[Ew5JzQ2lzcpGoF11]{Miroir
|
||||
d'Hypnos}. Les conditions de ciblage et de paramétrage en sont exactement
|
||||
<p>Ce rituel est comme le négatif de
|
||||
@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. Lorsqu’un mouvement apparaît au centre du miroir, provoquant
|
||||
l’état hypnotique, le haut-rêvant peut commencer à effectuer des gestes, des
|
||||
mimiques, ou montrer ostensiblement un objet qu’il tient sur lui, mais sans
|
||||
|
@ -10,8 +10,9 @@ system:
|
||||
aliments et aux boissons. Par définition, la catégorie est toujours la même
|
||||
: objet en objet. L’intensité de la saveur est celle de la cible. Comme pour
|
||||
tous les sorts d’illusions sensorielles, la saveur illusoire ne peut être
|
||||
qu’une saveur connue du haut-rêvant. Couplé à @Item[dEs7qg5UsqpQxok6]{Narine
|
||||
d'Hypnos} et à @Item[skPIvFb5tRRPHDGU]{Transfiguration}, ce sort peut
|
||||
qu’une saveur connue du haut-rêvant. Couplé à @UUID[Compendium.foundryvtt-reve-de-dragon.sorts-hypnos.Item.nNh8N9nF8m6zLtrt]{Narine
|
||||
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
|
||||
robe de rubis, au savoureux bouquet de framboise, et qui vous roule sur la
|
||||
langue comme du velours ?... Illusion de bout en bout, ce n’est que de l’eau
|
||||
|
@ -18,7 +18,7 @@ system:
|
||||
|
||||
<p>Ce rituel permet de voir à distance. Il doit être ciblé sur un miroir ou
|
||||
une surface réfléchissante, comme de l’eau parfaitement calme, faute de quoi
|
||||
l’on aboutit à un cas de @JournalEntry[eANDHKJXMPmPNJ2F]{Magie impossible}.
|
||||
l’on 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
|
||||
architectural précis, mêmes restrictions que pour Harpe d’Hypnos. Puis le
|
||||
sort étant ciblé sur le miroir, le haut-rêvant croit voir y évoluer des
|
||||
|
@ -6,7 +6,7 @@ effects: []
|
||||
system:
|
||||
description: >-
|
||||
<p>Narine d’Hypnos 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},
|
||||
s’appliquant aux odeurs à la place des sons. L’illusion doit pareillement
|
||||
rester dans la même catégorie que la cible. Peu utilisé sur les humanoïdes
|
||||
et les animaux, à moins d’avoir une raison très précise de vouloir qu’un
|
||||
|
@ -5,7 +5,7 @@ img: systems/foundryvtt-reve-de-dragon/icons/competence_hypnos.webp
|
||||
effects: []
|
||||
system:
|
||||
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
|
||||
s’applique à 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
|
||||
semble nue.</p>
|
||||
@ -17,7 +17,7 @@ system:
|
||||
<p>La nudité résultante n’est elle-même qu’une illusion. Un corps nu
|
||||
apparaît, vraisemblable, mais sans pour autant que ce soit exactement celui
|
||||
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
|
||||
visible quant à lui, mais n’altère pas l’illusion de nudité. (On ne saurait
|
||||
|
@ -47,7 +47,7 @@ system:
|
||||
<li>Si l’on prévoit qu’une pièce d’équipement va cesser à un moment d’être
|
||||
en contact avec la cible et que l’on désire que son illusion perdure,
|
||||
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>
|
||||
descriptionmj: ''
|
||||
|
@ -6,7 +6,7 @@ effects: []
|
||||
system:
|
||||
description: >-
|
||||
<p>Cette illusion visuelle ne peut être lancée que sur un humanoïde nu ou
|
||||
étant préalablement sous l’effet de @Item[m2pwvCCImJnbKVcW]{Nudité
|
||||
étant préalablement sous l’effet 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
|
||||
imaginables, couvrant plus ou moins totalement son corps, y compris une
|
||||
armure. Des pièces d’équipement illusoires sont également possibles, armes,
|
||||
@ -16,12 +16,13 @@ system:
|
||||
sort n’a 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
|
||||
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
|
||||
comportement peut générer un conflit de sens s’il y a contradiction entre
|
||||
l’utilisation de son équipement réel (rendu invisible par
|
||||
@Item[m2pwvCCImJnbKVcW]{Nudité d'Hypnos}) et son équipement illusoire (celui
|
||||
inventé par Robe Fantasmagorique).</p>
|
||||
@UUID[Compendium.foundryvtt-reve-de-dragon.sorts-hypnos.Item.o99y8VPp7x2mGbaU]{Nudité
|
||||
d'Hypnos}) et son équipement illusoire (celui inventé par Robe
|
||||
Fantasmagorique).</p>
|
||||
descriptionmj: ''
|
||||
draconic: Voie d'Hypnos
|
||||
duree: HN
|
||||
|
@ -6,7 +6,7 @@ effects: []
|
||||
system:
|
||||
description: >-
|
||||
<p>L’illusion purement visuelle de Transfiguration fonctionne de la même
|
||||
façon que @Item[Z2U35toRL5nSBr1k]{Métamorphose}, sauf que l’illusion doit
|
||||
façon que @UUID[Compendium.foundryvtt-reve-de-dragon.sorts-hypnos.Item.OTtXNS1SnVfWWGKi]{Métamorphose}, sauf que l’illusion doit
|
||||
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
|
||||
disparité de catégorie entre la cible et l’illusion entraîne la dissipation
|
||||
|
@ -7,7 +7,7 @@ system:
|
||||
description: >-
|
||||
<p>Tympan d’Hypnos est une illusion purement <em>auditive </em>pouvant
|
||||
s’appliquer indifféremment à un humanoïde, un animal ou un objet. Comme pour
|
||||
@Item[skPIvFb5tRRPHDGU]{Transfiguration}, l’illusion doit toujours
|
||||
@UUID[Compendium.foundryvtt-reve-de-dragon.sorts-hypnos.Item.ktFI49xqZ0mGfTzt]{Transfiguration}, l’illusion doit toujours
|
||||
appartenir à la même catégorie que la cible. Toute disparité entraîne les
|
||||
mêmes conséquences. On peut ainsi changer la voix d’un humanoïde en une
|
||||
autre <em>voix </em>d’humanoïde, le cri d’un animal en <em>cri </em>d’un
|
||||
@ -15,7 +15,7 @@ system:
|
||||
Tympan d’Hypnos sur un objet non sonore n’aboutit à aucun effet. Ce sort
|
||||
permet entre autres d’enrichir une illusion visuelle en lui apportant son
|
||||
complément sonore, diminuant ainsi les risques de
|
||||
@JournalEntry[9bvrfDaudPqvQZPY]{Conflit de sens}. Le cri illusoire d’un
|
||||
@UUID[Compendium.foundryvtt-reve-de-dragon.rappel-des-regles.JournalEntry.ZmMoOtUdgjMd4cNs]{Conflit de sens}. Le cri illusoire d’un
|
||||
animal doit être le cri d’un animal connu, et vouloir donner à un humanoïde
|
||||
la même voix que quelqu’un d’autre demande un jet d’OUÏE à -8, avec les
|
||||
mêmes remarques que pour Transfiguration. Noter que seule la voix est
|
||||
|
@ -5,7 +5,7 @@ img: systems/foundryvtt-reve-de-dragon/icons/competence_narcos.webp
|
||||
effects: []
|
||||
system:
|
||||
description: >-
|
||||
<p>Même principe que la @Item[r9onPANmiK5E5Jnw]{Flèche de Feu}.
|
||||
<p>Même principe que la @UUID[Compendium.foundryvtt-reve-de-dragon.sorts-narcos.Item.lq3jQDJsAflJ2PEy]{Flèche de Feu}.
|
||||
Une dague ainsi modifiée a un +dom de +4.</p>
|
||||
|
||||
<p>La dague de force a une résistance absolue tant que dure
|
||||
|
@ -5,8 +5,8 @@ img: systems/foundryvtt-reve-de-dragon/icons/competence_narcos.webp
|
||||
effects: []
|
||||
system:
|
||||
description: >-
|
||||
<p>Même principe que la@Item[r9onPANmiK5E5Jnw]{Flèche de Feu}
|
||||
et la @Item[8BJ9kn3AWLFDwvez]{Dague de Force}, y compris la
|
||||
<p>Même principe que la @UUID[Compendium.foundryvtt-reve-de-dragon.sorts-narcos.Item.lq3jQDJsAflJ2PEy]{Flèche de Feu}
|
||||
et la @UUID[Compendium.foundryvtt-reve-de-dragon.sorts-narcos.Item.0N6ILL5RMgmShyM8]{Dague de Force}, y compris la
|
||||
détérioration automatique de 1 point de résistance. Une
|
||||
épée dragonne ainsi modifiée a un +dom de +6.</p>
|
||||
descriptionmj: ''
|
||||
|
@ -9,7 +9,7 @@ system:
|
||||
description: >-
|
||||
<p>Les sorts d’Invulnérabilité Chromatique ne peuvent
|
||||
être recherchés/synthétisés qu’en ayant
|
||||
compris le @Item[5YK6q2KuKArkvDWy]{Le Principe Drachromatique} (voir Les
|
||||
compris le @UUID[Compendium.foundryvtt-reve-de-dragon.meditations-et-ecrits.Item.UoEHSr7Mcz4crdSF]{Le Principe Drachromatique} (voir Les
|
||||
grimoires, p218).</p>
|
||||
|
||||
<p>Cette zone mobile personnelle, obéissant à toutes les
|
||||
@ -27,8 +27,8 @@ system:
|
||||
protection chromatique au rouge r2 confère une protection de +2 ;
|
||||
celle au bleu r6 une protection de +6.</p>
|
||||
|
||||
<p>Ce sort est incompatible avec le rituel @Item[qW1vAyoqrvxG0tDn]{Haubert
|
||||
d'Oniros (rituel)}.</p>
|
||||
<p>Ce sort est incompatible avec le rituel @UUID[Compendium.foundryvtt-reve-de-dragon.sorts-oniros.Item.K9lspVNJAJmCAQHB]{Haubert
|
||||
d'Oniros}.</p>
|
||||
|
||||
<p>Vêtements et équipement peuvent avoir été
|
||||
colorés dans la teinte voulue par une <em>Transmutation
|
||||
|
@ -7,7 +7,7 @@ system:
|
||||
description: >-
|
||||
<p>Les sorts d’Invulnérabilité Chromatique ne peuvent
|
||||
être recherchés/synthétisés qu’en ayant
|
||||
compris le @Item[5YK6q2KuKArkvDWy]{Le Principe Drachromatique} (voir Les
|
||||
compris le @UUID[Compendium.foundryvtt-reve-de-dragon.meditations-et-ecrits.Item.UoEHSr7Mcz4crdSF]{Le Principe Drachromatique} (voir Les
|
||||
grimoires, p218).</p>
|
||||
|
||||
<p>Cette zone mobile personnelle, obéissant à toutes les
|
||||
@ -25,8 +25,8 @@ system:
|
||||
protection chromatique au rouge r2 confère une protection de +2 ;
|
||||
celle au bleu r6 une protection de +6.</p>
|
||||
|
||||
<p>Ce sort est incompatible avec le rituel @Item[qW1vAyoqrvxG0tDn]{Haubert
|
||||
d'Oniros (rituel)}.</p>
|
||||
<p>Ce sort est incompatible avec le rituel @UUID[Compendium.foundryvtt-reve-de-dragon.sorts-oniros.Item.K9lspVNJAJmCAQHB]{Haubert
|
||||
d'Oniros}.</p>
|
||||
|
||||
<p>Vêtements et équipement peuvent avoir été
|
||||
colorés dans la teinte voulue par une <em>Transmutation
|
||||
|
@ -7,7 +7,7 @@ system:
|
||||
description: >-
|
||||
<p>Les sorts d’Invulnérabilité Chromatique ne peuvent
|
||||
être recherchés/synthétisés qu’en ayant
|
||||
compris le @Item[5YK6q2KuKArkvDWy]{Le Principe Drachromatique} (voir Les
|
||||
compris le @UUID[Compendium.foundryvtt-reve-de-dragon.meditations-et-ecrits.Item.UoEHSr7Mcz4crdSF]{Le Principe Drachromatique} (voir Les
|
||||
grimoires, p218).</p>
|
||||
|
||||
<p>Cette zone mobile personnelle, obéissant à toutes les
|
||||
@ -25,8 +25,8 @@ system:
|
||||
protection chromatique au rouge r2 confère une protection de +2 ;
|
||||
celle au bleu r6 une protection de +6.</p>
|
||||
|
||||
<p>Ce sort est incompatible avec le rituel @Item[qW1vAyoqrvxG0tDn]{Haubert
|
||||
d'Oniros (rituel)}.</p>
|
||||
<p>Ce sort est incompatible avec le rituel @UUID[Compendium.foundryvtt-reve-de-dragon.sorts-oniros.Item.K9lspVNJAJmCAQHB]{Haubert
|
||||
d'Oniros}.</p>
|
||||
|
||||
<p>Vêtements et équipement peuvent avoir été
|
||||
colorés dans la teinte voulue par une <em>Transmutation
|
||||
|
@ -7,7 +7,7 @@ system:
|
||||
description: >-
|
||||
<p>Les sorts d’Invulnérabilité Chromatique ne peuvent
|
||||
être recherchés/synthétisés qu’en ayant
|
||||
compris le @Item[5YK6q2KuKArkvDWy]{Le Principe Drachromatique} (voir Les
|
||||
compris le @UUID[Compendium.foundryvtt-reve-de-dragon.meditations-et-ecrits.Item.UoEHSr7Mcz4crdSF]{Le Principe Drachromatique} (voir Les
|
||||
grimoires, p218).</p>
|
||||
|
||||
<p>Cette zone mobile personnelle, obéissant à toutes les
|
||||
@ -25,8 +25,8 @@ system:
|
||||
protection chromatique au rouge r2 confère une protection de +2 ;
|
||||
celle au bleu r6 une protection de +6.</p>
|
||||
|
||||
<p>Ce sort est incompatible avec le rituel @Item[qW1vAyoqrvxG0tDn]{Haubert
|
||||
d'Oniros (rituel)}.</p>
|
||||
<p>Ce sort est incompatible avec le rituel @UUID[Compendium.foundryvtt-reve-de-dragon.sorts-oniros.Item.K9lspVNJAJmCAQHB]{Haubert
|
||||
d'Oniros}.</p>
|
||||
|
||||
<p>Vêtements et équipement peuvent avoir été
|
||||
colorés dans la teinte voulue par une <em>Transmutation
|
||||
|
@ -7,7 +7,7 @@ system:
|
||||
description: >-
|
||||
<p>Les sorts d’Invulnérabilité Chromatique ne peuvent
|
||||
être recherchés/synthétisés qu’en ayant
|
||||
compris le @Item[5YK6q2KuKArkvDWy]{Le Principe Drachromatique} (voir Les
|
||||
compris le @UUID[Compendium.foundryvtt-reve-de-dragon.meditations-et-ecrits.Item.UoEHSr7Mcz4crdSF]{Le Principe Drachromatique} (voir Les
|
||||
grimoires, p218).</p>
|
||||
|
||||
<p>Cette zone mobile personnelle, obéissant à toutes les
|
||||
@ -25,8 +25,8 @@ system:
|
||||
protection chromatique au rouge r2 confère une protection de +2 ;
|
||||
celle au bleu r6 une protection de +6.</p>
|
||||
|
||||
<p>Ce sort est incompatible avec le rituel @Item[qW1vAyoqrvxG0tDn]{Haubert
|
||||
d'Oniros (rituel)}.</p>
|
||||
<p>Ce sort est incompatible avec le rituel @UUID[Compendium.foundryvtt-reve-de-dragon.sorts-oniros.Item.K9lspVNJAJmCAQHB]{Haubert
|
||||
d'Oniros}.</p>
|
||||
|
||||
<p>Vêtements et équipement peuvent avoir été
|
||||
colorés dans la teinte voulue par une <em>Transmutation
|
||||
|
@ -22,7 +22,7 @@ system:
|
||||
<li>Visage et torse (+ épaules/bras/mains) : 4 m</li>
|
||||
|
||||
<li>Nudité 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>
|
||||
descriptionmj: ''
|
||||
|
@ -6,7 +6,7 @@ effects: []
|
||||
system:
|
||||
description: >-
|
||||
<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>
|
||||
|
||||
<p>Les zones de Transmutation Chromatique modifient la couleur des objets
|
||||
|
@ -6,7 +6,7 @@ effects: []
|
||||
system:
|
||||
description: >-
|
||||
<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>
|
||||
|
||||
<p>Les zones de Transmutation Chromatique modifient la couleur des objets
|
||||
|
@ -6,7 +6,7 @@ effects: []
|
||||
system:
|
||||
description: >-
|
||||
<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>
|
||||
|
||||
<p>Les zones de Transmutation Chromatique modifient la couleur des objets
|
||||
|
@ -6,7 +6,7 @@ effects: []
|
||||
system:
|
||||
description: >-
|
||||
<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>
|
||||
|
||||
<p>Les zones de Transmutation Chromatique modifient la couleur des objets
|
||||
|
@ -6,7 +6,7 @@ effects: []
|
||||
system:
|
||||
description: >-
|
||||
<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>
|
||||
|
||||
<p>Les zones de Transmutation Chromatique modifient la couleur des objets
|
||||
|
@ -6,7 +6,7 @@ effects: []
|
||||
system:
|
||||
description: >-
|
||||
<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>
|
||||
|
||||
<p>Les zones de Transmutation Chromatique modifient la couleur des objets
|
||||
|
@ -3315,7 +3315,7 @@ prototypeToken:
|
||||
height: 1
|
||||
lockRotation: false
|
||||
rotation: 0
|
||||
actorLink: false
|
||||
actorLink: true
|
||||
disposition: 0
|
||||
displayBars: 0
|
||||
bar1:
|
||||
|
@ -3021,7 +3021,7 @@ prototypeToken:
|
||||
height: 1
|
||||
lockRotation: false
|
||||
rotation: 0
|
||||
actorLink: false
|
||||
actorLink: true
|
||||
disposition: 0
|
||||
displayBars: 0
|
||||
bar1:
|
||||
|
@ -2954,7 +2954,7 @@ prototypeToken:
|
||||
height: 1
|
||||
lockRotation: false
|
||||
rotation: 0
|
||||
actorLink: false
|
||||
actorLink: true
|
||||
disposition: 0
|
||||
displayBars: 0
|
||||
bar1:
|
||||
|
@ -3039,7 +3039,7 @@ prototypeToken:
|
||||
height: 1
|
||||
lockRotation: false
|
||||
rotation: 0
|
||||
actorLink: false
|
||||
actorLink: true
|
||||
disposition: 0
|
||||
displayBars: 0
|
||||
bar1:
|
||||
|
@ -3113,7 +3113,7 @@ prototypeToken:
|
||||
height: 1
|
||||
lockRotation: false
|
||||
rotation: 0
|
||||
actorLink: false
|
||||
actorLink: true
|
||||
disposition: 0
|
||||
displayBars: 0
|
||||
bar1:
|
||||
|
@ -2975,7 +2975,7 @@ ownership:
|
||||
prototypeToken:
|
||||
name: le Coureur des Rues
|
||||
displayName: 0
|
||||
actorLink: false
|
||||
actorLink: true
|
||||
width: 1
|
||||
height: 1
|
||||
lockRotation: false
|
||||
|
@ -2146,8 +2146,8 @@ items:
|
||||
la même : objet en objet. L’intensité de la saveur est celle de la
|
||||
cible. Comme pour tous les sorts d’illusions sensorielles, la saveur
|
||||
illusoire ne peut être qu’une saveur connue du haut-rêvant. Couplé à
|
||||
@Item[dEs7qg5UsqpQxok6]{Narine d'Hypnos} et à
|
||||
@Item[skPIvFb5tRRPHDGU]{Transfiguration}, ce sort peut permettre des
|
||||
@UUID[Compendium.foundryvtt-reve-de-dragon.sorts-hypnos.Item.nNh8N9nF8m6zLtrt]{Narine 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 robe de
|
||||
rubis, au savoureux bouquet de framboise, et qui vous roule sur la
|
||||
langue comme du velours ?... Illusion de bout en bout, ce n’est que de
|
||||
@ -2183,7 +2183,7 @@ items:
|
||||
system:
|
||||
description: >-
|
||||
<p>Narine d’Hypnos 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},
|
||||
s’appliquant aux odeurs à la place des sons. L’illusion doit
|
||||
pareillement rester dans la même catégorie que la cible. Peu utilisé sur
|
||||
les humanoïdes et les animaux, à moins d’avoir une raison très précise
|
||||
@ -3502,7 +3502,7 @@ ownership:
|
||||
prototypeToken:
|
||||
name: le Cuisinier Haut-Rêvant
|
||||
displayName: 0
|
||||
actorLink: false
|
||||
actorLink: true
|
||||
width: 1
|
||||
height: 1
|
||||
lockRotation: false
|
||||
|
@ -3262,7 +3262,7 @@ prototypeToken:
|
||||
height: 1
|
||||
lockRotation: false
|
||||
rotation: 0
|
||||
actorLink: false
|
||||
actorLink: true
|
||||
disposition: 0
|
||||
displayBars: 0
|
||||
bar1:
|
||||
|
@ -2246,7 +2246,7 @@ items:
|
||||
description: >-
|
||||
<p>Tympan d’Hypnos est une illusion purement <em>auditive </em>pouvant
|
||||
s’appliquer indifféremment à un humanoïde, un animal ou un objet. Comme
|
||||
pour @Item[skPIvFb5tRRPHDGU]{Transfiguration}, l’illusion doit toujours
|
||||
pour @UUID[Compendium.foundryvtt-reve-de-dragon.sorts-hypnos.Item.ktFI49xqZ0mGfTzt]{Transfiguration}, l’illusion doit toujours
|
||||
appartenir à la même catégorie que la cible. Toute disparité entraîne
|
||||
les mêmes conséquences. On peut ainsi changer la voix d’un humanoïde en
|
||||
une autre <em>voix </em>d’humanoïde, le cri d’un animal en <em>cri
|
||||
@ -2254,7 +2254,7 @@ items:
|
||||
objet. Lancer Tympan d’Hypnos sur un objet non sonore n’aboutit à aucun
|
||||
effet. Ce sort permet entre autres d’enrichir une illusion visuelle en
|
||||
lui apportant son complément sonore, diminuant ainsi les risques de
|
||||
@JournalEntry[9bvrfDaudPqvQZPY]{Conflit de sens}. Le cri illusoire d’un
|
||||
@UUID[Compendium.foundryvtt-reve-de-dragon.rappel-des-regles.JournalEntry.ZmMoOtUdgjMd4cNs]{Conflit de sens}. Le cri illusoire d’un
|
||||
animal doit être le cri d’un animal connu, et vouloir donner à un
|
||||
humanoïde la même voix que quelqu’un d’autre demande un jet d’OUÏE à -8,
|
||||
avec les mêmes remarques que pour Transfiguration. Noter que seule la
|
||||
@ -3585,7 +3585,7 @@ prototypeToken:
|
||||
height: 1
|
||||
lockRotation: false
|
||||
rotation: 0
|
||||
actorLink: false
|
||||
actorLink: true
|
||||
disposition: 0
|
||||
displayBars: 0
|
||||
bar1:
|
||||
|
@ -2112,7 +2112,7 @@ items:
|
||||
|
||||
<p>Ce rituel permet d’entendre à distance. Il doit être ciblé sur un
|
||||
instrument sonore (harpe, luth, gong, cloche, etc.) faute de quoi l’on
|
||||
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
|
||||
(humanoïde) ou un lieu architectural précis (salle, couloir, perron,
|
||||
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
|
||||
ou une surface réfléchissante, comme de l’eau parfaitement calme, faute
|
||||
de quoi l’on aboutit à un cas de @JournalEntry[eANDHKJXMPmPNJ2F]{Magie
|
||||
impossible}. Lors du lancer, le rituel doit être paramétré sur une
|
||||
de quoi l’on 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 architectural précis, mêmes restrictions que pour
|
||||
Harpe d’Hypnos. 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
|
||||
@ -3752,7 +3751,7 @@ prototypeToken:
|
||||
height: 1
|
||||
lockRotation: false
|
||||
rotation: 0
|
||||
actorLink: false
|
||||
actorLink: true
|
||||
disposition: 0
|
||||
displayBars: 0
|
||||
bar1:
|
||||
|
@ -3661,7 +3661,7 @@ prototypeToken:
|
||||
height: 1
|
||||
lockRotation: false
|
||||
rotation: 0
|
||||
actorLink: false
|
||||
actorLink: true
|
||||
disposition: 0
|
||||
displayBars: 0
|
||||
bar1:
|
||||
|
@ -3025,7 +3025,7 @@ prototypeToken:
|
||||
height: 1
|
||||
lockRotation: false
|
||||
rotation: 0
|
||||
actorLink: false
|
||||
actorLink: true
|
||||
disposition: 0
|
||||
displayBars: 0
|
||||
bar1:
|
||||
|
78
styles/img/ui/ajout-competence.svg
Normal file
78
styles/img/ui/ajout-competence.svg
Normal file
@ -0,0 +1,78 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
viewBox="0 0 512 512"
|
||||
style="height: 256px; width: 256px;"
|
||||
version="1.1"
|
||||
id="svg8"
|
||||
sodipodi:docname="add-skill.svg"
|
||||
inkscape:version="1.0.1 (3bc2e813f5, 2020-09-07)">
|
||||
<metadata
|
||||
id="metadata14">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<defs
|
||||
id="defs12" />
|
||||
<sodipodi:namedview
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1"
|
||||
objecttolerance="10"
|
||||
gridtolerance="10"
|
||||
guidetolerance="10"
|
||||
inkscape:pageopacity="0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:window-width="2138"
|
||||
inkscape:window-height="1465"
|
||||
id="namedview10"
|
||||
showgrid="false"
|
||||
inkscape:zoom="1.0150849"
|
||||
inkscape:cx="466.02267"
|
||||
inkscape:cy="44.586362"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="0"
|
||||
inkscape:window-maximized="0"
|
||||
inkscape:current-layer="svg8" />
|
||||
<path
|
||||
d="M0 0h512v512H0z"
|
||||
fill="url(#pattern)"
|
||||
fill-opacity="0.5"
|
||||
id="path2" />
|
||||
<g
|
||||
class=""
|
||||
transform="translate(-81.40366,-2.6174234)"
|
||||
id="g6">
|
||||
<path
|
||||
d="m 119.1,25 v 0.1 c -25,3.2 -47.1,32 -47.1,68.8 0,20.4 7.1,38.4 17.5,50.9 L 99.7,157 84,159.9 c -13.7,2.6 -23.8,9.9 -32.2,21.5 -8.5,11.5 -14.9,27.5 -19.4,45.8 -8.2,33.6 -9.9,74.7 -10.1,110.5 h 44 l 11.9,158.4 h 96.3 L 185,337.7 h 41.9 c 0,-36.2 -0.3,-77.8 -7.8,-111.7 -4,-18.5 -10.2,-34.4 -18.7,-45.9 -8.6,-11.4 -19.2,-18.7 -34.5,-21 l -16,-2.5 L 160,144 c 10,-12.5 16.7,-30.2 16.7,-50.1 0,-39.2 -24.8,-68.8 -52.4,-68.8 -2.9,0 -4.7,-0.1 -5.2,-0.1 z M 311,55 v 48 H 208 v 18 h 103 v 158 h -55 v 18 h 55 V 407 H 208 v 18 h 103 v 32 h 80.8 c -0.5,-2.9 -0.8,-5.9 -0.8,-9 0,-3.1 0.3,-6.1 0.8,-9 H 329 V 297 h 62.8 c -0.5,-2.9 -0.8,-5.9 -0.8,-9 0,-3.1 0.3,-6.1 0.8,-9 H 329 V 73 h 62.8 c -0.5,-2.92 -0.8,-5.93 -0.8,-9 0,-3.07 0.3,-6.08 0.8,-9 z m 129,202 c -17.2,0 -31,13.8 -31,31 0,17.2 13.8,31 31,31 17.2,0 31,-13.8 31,-31 0,-17.2 -13.8,-31 -31,-31 z m 0,160 c -17.2,0 -31,13.8 -31,31 0,17.2 13.8,31 31,31 17.2,0 31,-13.8 31,-31 0,-17.2 -13.8,-31 -31,-31 z"
|
||||
fill="#000000"
|
||||
fill-opacity="0.8"
|
||||
transform="matrix(0.6,0,0,0.6,102.4,102.4)"
|
||||
id="path4"
|
||||
sodipodi:nodetypes="ccsccccccccccccccccssccccccccccccccccsccccsccccsccssssssssss" />
|
||||
</g>
|
||||
<g
|
||||
class=""
|
||||
transform="translate(124.63542,-119.78046)"
|
||||
id="g6-1">
|
||||
<path
|
||||
d="m 158.81777,136.77499 c -9.48,32.22 -28.656,28.8 -47.61,26.04 21.39,6.12 29.61,22.38 25.998,47.64 7.596,-27.6 25.572,-31.56 47.652,-26.04 -22.56,-7.26 -34.14,-21.24 -26.04,-47.64 z m -41.76,76.08 c 5.496,10.02 4.578,18.06 -3.366,24 7.476,-4.14 14.91,-8.58 23.946,3.36 -7.542,-9.72 -4.92,-17.4 3.366,-24 -8.352,5.82 -16.482,6.96 -23.946,-3.36 z m 82.32,0.18 c 6.84,16.08 -0.3,24.78 -13.02,30.54 13.62,-5.1 24.48,-2.7 30.54,13.02 -7.62,-19.08 2.88,-24.72 13.02,-30.54 -12.6,5.1 -22.68,0.54 -30.54,-13.02 z m -52.776,31.2 c 9.396,34.68 0.516,58.86 -28.392,71.1 26.076,-7.08 52.428,-15.12 71.208,28.44 -15.84,-35.58 -2.04,-57.24 28.38,-71.28 -30,11.52 -55.86,9 -71.196,-28.26 z"
|
||||
fill="#000000"
|
||||
fill-opacity="0.8"
|
||||
id="path4-2"
|
||||
sodipodi:nodetypes="cccccccccccccccccccc"
|
||||
style="stroke-width:0.6" />
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 3.7 KiB |
@ -816,12 +816,12 @@ input:is(.blessure-premiers_soins, .blessure-soins_complets) {
|
||||
.competence-list .item-controls.hidden-controls {
|
||||
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;
|
||||
color: var(--color-controls);
|
||||
}
|
||||
.item-controls i:is(.fas, .far, .fa-solid):hover {
|
||||
opacity: 0.7 ;
|
||||
.item-controls i:is(.fas, .far, .fa-solid, .fa-regular):hover {
|
||||
opacity: 0.6;
|
||||
}
|
||||
|
||||
.rdd-roll-dialog .description-sort {
|
||||
|
@ -37,7 +37,7 @@
|
||||
<input class="derivee-value" type="number" name="system.compteurs.dissolution.value" value="{{system.compteurs.dissolution.value}}" data-dtype="number"/>
|
||||
</li>
|
||||
<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"/>
|
||||
</li>
|
||||
<li class="caracteristique flexrow list-item">
|
||||
|
@ -1,3 +1,6 @@
|
||||
<h4>Compétences{{#if @root.options.vueDetaillee}} <a class="competence-add" data-tooltip="Ajouter une compétence">
|
||||
<i class="fa-solid fa-books-medical"></i>
|
||||
</a>{{/if}}</h4>
|
||||
<ol class="item-list alterne-list">
|
||||
{{#each (trier competences) as |comp key|}}
|
||||
<li class="item flexrow list-item" data-item-id="{{comp._id}}">
|
||||
|
@ -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.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.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 class="flexcol flex-group-top">
|
||||
{{>"systems/foundryvtt-reve-de-dragon/templates/actor/export-scriptarium/carac-derivee.hbs" carac=export.melee}}
|
||||
|
@ -1,6 +1,7 @@
|
||||
{{#if sortsReserve.length}}
|
||||
<h3>Sorts en Réserve{{#if options.isGM}} <a class="nouveau-sort-reserve"><i class="fa-solid fa-sparkles"></i>
|
||||
</a>{{/if}}
|
||||
<h3>Sorts en Réserve{{#if options.isGM}} <a class="sortreserve-add">
|
||||
<i class="fa-solid fa-sparkles"></i>
|
||||
</a>{{/if}}
|
||||
</h3>
|
||||
<ul class="item-list alterne-list">
|
||||
{{#each (trier sortsReserve) as |sort key|}}
|
||||
|
@ -2,19 +2,28 @@
|
||||
<h3>Sorts</h3>
|
||||
<ul class="item-list alterne-list">
|
||||
{{#each (trier sorts) as |sort key|}}
|
||||
<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}}"/>
|
||||
<span class="flex-shrink">{{itemSort-shortDraconic sort.system.draconic}}</span>
|
||||
<span class="item-edit flex-grow-3">{{sort.name}}{{#if sort.system.isrituel}}
|
||||
<i class="fa-regular fa-book-sparkles"></i>{{/if}}</span>
|
||||
<span class="item-edit flex-grow-3">{{sort.name}}
|
||||
{{#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">
|
||||
{{#if sort.system.caseTMRspeciale}}{{sort.system.caseTMRspeciale}}{{else}}{{upperFirst sort.system.caseTMR}}{{/if}}
|
||||
</span>
|
||||
</span>
|
||||
<span class="flex-grow-1">R{{itemSort-spaceIfText sort.system.difficulte}} r{{itemSort-spaceIfText sort.system.ptreve}}</span>
|
||||
<div class="item-controls flex-shrink">
|
||||
<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-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>
|
||||
</li>
|
||||
{{/each}}
|
||||
|
@ -1,12 +1,14 @@
|
||||
<span class="item-name"><h4>Personnages accordés</h4></span>
|
||||
<ul class="item-list alterne-list">
|
||||
<h4>Personnages accordés <a class="resonance-add" data-tooltip="Ajouter un pesonnage accordé">
|
||||
<i class="fa-solid fa-person-circle-plus"></i>
|
||||
</a></h4>
|
||||
<ol class="item-list alterne-list">
|
||||
{{#each resonances as |actor|}}
|
||||
<li class="item flexrow list-item" data-actor-id="{{actor.id}}">
|
||||
<img class="sheet-competence-img subacteur-open" src="{{actor.img}}" data-tooltip="{{actor.name}}"/>
|
||||
<span class="subacteur-label subacteur-open"><a>{{actor.name}}</a></span>
|
||||
<div class="flex-shrink">
|
||||
<a class="resonance-delete" data-tooltip="Supprimer"><i class="fas fa-trash"></i></a>
|
||||
</div>
|
||||
</div>
|
||||
</li>
|
||||
{{/each}}
|
||||
</ul>
|
||||
</ol>
|
||||
|
Reference in New Issue
Block a user