Compare commits

...

8 Commits

Author SHA1 Message Date
979d49f96e Force reload on TMR change
All checks were successful
Release Creation / build (release) Successful in 2m22s
2024-12-09 23:12:22 +01:00
22cab26908 Merge pull request '12.0.27 - Les vêtements d'Astrobazzarh' (#730) from VincentVk/foundryvtt-reve-de-dragon:v11 into v11
Reviewed-on: #730
2024-12-09 23:02:09 +01:00
23b3be246b Correction tooltips TMR multiples 2024-12-09 23:00:43 +01:00
b160ce78bc Correction imports du compendium
- les personnages conservent la valeur de token lié/non-lié
- les voyageirs sont liés
- les PNJs sont non-liés
- les invocations sont non liées
2024-12-09 22:24:22 +01:00
60921cfef1 Bouton ajout de personnage accordé 2024-12-09 22:07:03 +01:00
12e5c94aba Bouton Ajout de compétence créature 2024-12-09 22:05:46 +01:00
4dd6e1c3ff Corrections des invocations
- ajout de lien entre le sort et la créature
- correction des liens vers les journaux
- limitation aux compétences listées
2024-12-09 00:12:14 +01:00
c7dfc8682d Support de personnages sans compétences
Un personnage peut maintenant n'avoir aucune compétence

Exemple: les entités invoquées (Kanaillous, ..) n'ont pas besoin
d'une liste de compétences sans aucune valeur.

Ceci permettrait de supprimer des compétences prohibées.

# Conflicts:
#	module/actor.js
#	module/actor/base-actor-reve.js
2024-12-09 00:09:31 +01:00
45 changed files with 313 additions and 8191 deletions

View File

@ -3,9 +3,21 @@
- 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
- Le Gardien peut créer des sorts en réserve parmi les sorts d'un personnage - 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 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 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 - Correction des rituels de Détection et Lecture d'Aura des personnages prétirés
- Correction des invocations
- support de "personnages" n'ayant pas toutes les compétences
- 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 ## 12.0.26 - Astrobazzarh le Haut-rêvant
- bouton pour le don de haut-rêve en un clic - bouton pour le don de haut-rêve en un clic

View File

@ -22,7 +22,6 @@ import { AppPersonnageAleatoire } from "./actor/random/app-personnage-aleatoire.
/* -------------------------------------------- */ /* -------------------------------------------- */
/** /**
* Extend the basic ActorSheet with some very simple modifications * Extend the basic ActorSheet with some very simple modifications
* @extends {ActorSheet}
*/ */
export class RdDActorSheet extends RdDBaseActorSangSheet { export class RdDActorSheet extends RdDBaseActorSangSheet {
@ -83,7 +82,7 @@ export class RdDActorSheet extends RdDBaseActorSangSheet {
formData.combat.push(RdDItemArme.corpsACorps(actor)); formData.combat.push(RdDItemArme.corpsACorps(actor));
formData.combat.push(RdDItemArme.empoignade(actor)); formData.combat.push(RdDItemArme.empoignade(actor));
formData.esquives = this.actor.getCompetences("Esquive"); formData.esquives = this.actor.getCompetencesEsquive()
formData.combat = RdDCombatManager.listActionsArmes(formData.combat, formData.competences, formData.system.carac); formData.combat = RdDCombatManager.listActionsArmes(formData.combat, formData.competences, formData.system.carac);
formData.empoignades = this.actor.getEmpoignades(); formData.empoignades = this.actor.getEmpoignades();

View File

@ -39,11 +39,12 @@ import { DialogChoixXpCarac } from "./dialog-choix-xp-carac.js";
import { RdDItemArme } from "./item-arme.js"; import { RdDItemArme } from "./item-arme.js";
import { RdDCombatManager } from "./rdd-combat.js"; import { RdDCombatManager } from "./rdd-combat.js";
import { RdDItemTete } from "./item/tete.js"; import { RdDItemTete } from "./item/tete.js";
import { SystemCompendiums } from "./settings/system-compendiums.js";
import { DialogSelect } from "./dialog-select.js"; import { DialogSelect } from "./dialog-select.js";
import { PAS_DE_DRACONIC, POSSESSION_SANS_DRACONIC } from "./item/base-items.js";
export const MAINS_DIRECTRICES = ['Droitier', 'Gaucher', 'Ambidextre'] export const MAINS_DIRECTRICES = ['Droitier', 'Gaucher', 'Ambidextre']
/* -------------------------------------------- */ /* -------------------------------------------- */
/** /**
* Extend the base Actor entity by defining a custom roll data structure which is ideal for the Simple system. * Extend the base Actor entity by defining a custom roll data structure which is ideal for the Simple system.
@ -153,10 +154,9 @@ export class RdDActor extends RdDBaseActorSang {
/* -------------------------------------------- */ /* -------------------------------------------- */
getDemiReve() { return this.system.reve.tmrpos.coord } getDemiReve() { return this.system.reve.tmrpos.coord }
getDraconicList() { return this.itemTypes[ITEM_TYPES.competence].filter(it => it.system.categorie == 'draconic') } getDraconicList() { return this.itemTypes[ITEM_TYPES.competence].filter(it => it.system.categorie == 'draconic') }
getBestDraconic() { return foundry.utils.duplicate(this.getDraconicList().sort(Misc.descending(it => it.system.niveau)).find(it => true)) } getBestDraconic() { return foundry.utils.duplicate([...this.getDraconicList(), PAS_DE_DRACONIC].sort(Misc.descending(it => it.system.niveau)).find(it => true)) }
getDraconicOuPossession() { getDraconicOuPossession() {
return [...this.getDraconicList().filter(it => it.system.niveau >= 0), return [...this.getDraconicList().filter(it => it.system.niveau >= 0), POSSESSION_SANS_DRACONIC]
super.getDraconicOuPossession()]
.sort(Misc.descending(it => it.system.niveau)) .sort(Misc.descending(it => it.system.niveau))
.find(it => true) .find(it => true)
} }

View File

@ -1,4 +1,5 @@
import { Grammar } from "../grammar.js"; import { Grammar } from "../grammar.js";
import { ITEM_TYPES } from "../item.js";
import { RdDSheetUtility } from "../rdd-sheet-utility.js"; import { RdDSheetUtility } from "../rdd-sheet-utility.js";
import { RdDBaseActorSheet } from "./base-actor-sheet.js"; import { RdDBaseActorSheet } from "./base-actor-sheet.js";
@ -36,6 +37,16 @@ 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('.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('.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 })
)
} }

View File

@ -1,34 +1,27 @@
import { ChatUtility } from "../chat-utility.js"; import { ENTITE_INCARNE, SHOW_DICE, SYSTEM_RDD } from "../constants.js";
import { DialogValidationEncaissement } from "../dialog-validation-encaissement.js";
import { Grammar } from "../grammar.js"; import { Grammar } from "../grammar.js";
import { RdDItemCompetence } from "../item-competence.js";
import { Misc } from "../misc.js"; import { Misc } from "../misc.js";
import { RdDEmpoignade } from "../rdd-empoignade.js";
import { RdDResolutionTable } from "../rdd-resolution-table.js"; import { RdDResolutionTable } from "../rdd-resolution-table.js";
import { RdDEncaisser } from "../rdd-roll-encaisser.js"; import { RdDEncaisser } from "../rdd-roll-encaisser.js";
import { RdDRoll } from "../rdd-roll.js"; import { RdDRoll } from "../rdd-roll.js";
import { RdDUtility } from "../rdd-utility.js"; import { RdDUtility } from "../rdd-utility.js";
import { ReglesOptionnelles } from "../settings/regles-optionnelles.js"; import { ReglesOptionnelles } from "../settings/regles-optionnelles.js";
import { RdDBaseActor } from "./base-actor.js"; import { RdDBaseActor } from "./base-actor.js";
import { RdDItemCompetenceCreature } from "../item-competencecreature.js";
import { StatusEffects } from "../settings/status-effects.js";
import { ITEM_TYPES } from "../item.js"; import { ITEM_TYPES } from "../item.js";
import { Targets } from "../targets.js"; import { RdDItemCompetence } from "../item-competence.js";
import { RdDPossession } from "../rdd-possession.js"; import { RdDItemCompetenceCreature } from "../item-competencecreature.js";
import { RdDCombat, RdDCombatManager } from "../rdd-combat.js";
import { RdDConfirm } from "../rdd-confirm.js";
import { ENTITE_INCARNE, SHOW_DICE, SYSTEM_RDD } from "../constants.js";
import { RdDItemArme } from "../item-arme.js"; import { RdDItemArme } from "../item-arme.js";
import { StatusEffects } from "../settings/status-effects.js";
import { Targets } from "../targets.js";
import { RdDConfirm } from "../rdd-confirm.js";
import { RdDCarac } from "../rdd-carac.js"; import { RdDCarac } from "../rdd-carac.js";
const POSSESSION_SANS_DRACONIC = { import { ChatUtility } from "../chat-utility.js";
img: 'systems/foundryvtt-reve-de-dragon/icons/entites/possession.webp', import { DialogValidationEncaissement } from "../dialog-validation-encaissement.js";
name: 'Sans draconic', import { RdDCombat } from "../rdd-combat.js";
system: { import { RdDEmpoignade } from "../rdd-empoignade.js";
niveau: 0, import { RdDPossession } from "../rdd-possession.js";
defaut_carac: "reve-actuel", import { BASE_CORPS_A_CORPS, BASE_ESQUIVE, POSSESSION_SANS_DRACONIC } from "../item/base-items.js";
}
};
/** /**
* Classe de base pour les acteurs disposant de rêve (donc, pas des objets) * Classe de base pour les acteurs disposant de rêve (donc, pas des objets)
@ -163,24 +156,24 @@ export class RdDBaseActorReve extends RdDBaseActor {
} }
return RdDItemCompetence.findCompetence(this.items, idOrName, options) return RdDItemCompetence.findCompetence(this.items, idOrName, options)
} }
getCompetences(name) {
return RdDItemCompetence.findCompetences(this.items, name) getCompetences(name, options = { onMessage: message => { } }) {
return RdDItemCompetence.findCompetences(this.items, name, options)
} }
getCompetenceCorpsACorps(options = {}) {
return this.getCompetence("Corps à corps", options) getCompetenceCorpsACorps(options = { onMessage: message => { } }) {
return this.getCompetence(BASE_CORPS_A_CORPS.name, options) ?? BASE_CORPS_A_CORPS
} }
getCompetencesEsquive() {
return this.getCompetences("esquive") getCompetencesEsquive(options = { onMessage: message => { } }) {
return this.getCompetences(BASE_ESQUIVE.name, options) ?? [BASE_ESQUIVE]
} }
getArmeParade(armeParadeId) { getArmeParade(armeParadeId) {
const item = armeParadeId ? this.getEmbeddedDocument('Item', armeParadeId) : undefined; return RdDItemArme.getArme(armeParadeId ? this.getEmbeddedDocument('Item', armeParadeId) : undefined)
return RdDItemArme.getArme(item);
} }
getDraconicOuPossession() { getDraconicOuPossession() { return POSSESSION_SANS_DRACONIC }
return POSSESSION_SANS_DRACONIC
}
getPossession(possessionId) { getPossession(possessionId) {
return this.itemTypes[ITEM_TYPES.possession].find(it => it.system.possessionid == possessionId); return this.itemTypes[ITEM_TYPES.possession].find(it => it.system.possessionid == possessionId);

View File

@ -1,4 +1,4 @@
import { MAX_ENDURANCE_FATIGUE, RdDUtility } from "../rdd-utility.js"; import { RdDUtility } from "../rdd-utility.js";
import { ReglesOptionnelles } from "../settings/regles-optionnelles.js"; import { ReglesOptionnelles } from "../settings/regles-optionnelles.js";
import { STATUSES } from "../settings/status-effects.js"; import { STATUSES } from "../settings/status-effects.js";
import { ITEM_TYPES } from "../item.js"; import { ITEM_TYPES } from "../item.js";

View File

@ -176,12 +176,20 @@ export class RdDBaseActor extends Actor {
await super._preCreate(data, options, user); await super._preCreate(data, options, user);
// Configure prototype token settings // Configure prototype token settings
const prototypeToken = {}; if (this.type === "personnage") {
if (this.type === "personnage") Object.assign(prototypeToken, { this.updateSource({
sight: { enabled: true }, actorLink: true, disposition: CONST.TOKEN_DISPOSITIONS.FRIENDLY 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 }); this.updateSource({ prototypeToken });
} }
}
/* -------------------------------------------- */ /* -------------------------------------------- */
prepareData() { prepareData() {

View File

@ -1,6 +1,7 @@
import { RdDBaseActorReveSheet } from "./base-actor-reve-sheet.js"; import { RdDBaseActorReveSheet } from "./base-actor-reve-sheet.js";
import { RdDSheetUtility } from "../rdd-sheet-utility.js"; import { RdDSheetUtility } from "../rdd-sheet-utility.js";
import { RdDUtility } from "../rdd-utility.js"; import { RdDUtility } from "../rdd-utility.js";
import { DialogSelect } from "../dialog-select.js";
export class RdDActorEntiteSheet extends RdDBaseActorReveSheet { export class RdDActorEntiteSheet extends RdDBaseActorReveSheet {
@ -35,23 +36,31 @@ export class RdDActorEntiteSheet extends RdDBaseActorReveSheet {
this.html.find('.creature-niveau').change(async event => { this.html.find('.creature-niveau').change(async event => {
let compName = event.currentTarget.attributes.compname.value; let compName = event.currentTarget.attributes.compname.value;
this.actor.updateCreatureCompetence(compName, "niveau", parseInt(event.target.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));
}); })
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 => { this.html.find('.resonance-delete').click(async event => {
const li = RdDSheetUtility.getEventElement(event); const li = RdDSheetUtility.getEventElement(event);
const actorId = li.data("actor-id"); const actorId = li.data("actor-id");
if (actorId) { if (actorId) {
const actorResonance = game.actors.get(actorId); const actorResonance = game.actors.get(actorId);
RdDUtility.confirmSubActeurDelete(this, actorResonance, li, () => { RdDUtility.confirmSubActeurDelete(this, actorResonance, li, () => {
console.log('Delete : ', actorId); this.resonanceDelete(actorId);
this.deleteSubActeur(actorId);
RdDUtility.slideOnDelete(this, li); RdDUtility.slideOnDelete(this, li);
}); })
} }
}); })
} }
async _onDropActor(event, dragData) { async _onDropActor(event, dragData) {
@ -60,7 +69,13 @@ export class RdDActorEntiteSheet extends RdDBaseActorReveSheet {
super._onDropActor(event, dragData) 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); let newResonances = this.actor.system.sante.resonnance.actors.filter(id => id != actorId);
await this.actor.update({ 'system.sante.resonnance.actors': newResonances }, { renderSheet: false }); await this.actor.update({ 'system.sante.resonnance.actors': newResonances }, { renderSheet: false });
} }

View File

@ -1,6 +1,7 @@
import { Grammar } from "./grammar.js"; import { Grammar } from "./grammar.js";
import { RdDItemCompetenceCreature } from "./item-competencecreature.js" import { RdDItemCompetenceCreature } from "./item-competencecreature.js"
import { ITEM_TYPES } from "./item.js"; import { ITEM_TYPES } from "./item.js";
import { BASE_CORPS_A_CORPS } from "./item/base-items.js";
import { RdDCombatManager } from "./rdd-combat.js"; import { RdDCombatManager } from "./rdd-combat.js";
const nomCategorieParade = { const nomCategorieParade = {
@ -236,13 +237,13 @@ export class RdDItemArme extends Item {
} }
static corpsACorps(actor) { static corpsACorps(actor) {
let competence = actor?.getCompetenceCorpsACorps() ?? { system: { niveau: -6 } }; let competence = actor?.getCompetenceCorpsACorps() ?? BASE_CORPS_A_CORPS
let melee = actor ? actor.system.carac['melee'].value : 0 let melee = actor ? actor.system.carac['melee'].value : 0
return { return {
_id: competence?.id, _id: competence.id,
name: 'Corps à corps', name: 'Corps à corps',
type: ITEM_TYPES.arme, type: ITEM_TYPES.arme,
img: 'systems/foundryvtt-reve-de-dragon/icons/competence_corps_a_corps.webp', img: competence.img,
system: { system: {
initiative: RdDCombatManager.calculInitiative(competence.system.niveau, melee), initiative: RdDCombatManager.calculInitiative(competence.system.niveau, melee),
equipe: true, equipe: true,

View File

@ -1,5 +1,6 @@
import { Grammar } from "./grammar.js"; import { Grammar } from "./grammar.js";
import { RdDItem } from "./item.js"; import { RdDItem } from "./item.js";
import { SANS_COMPETENCE } from "./item/base-items.js";
import { Misc } from "./misc.js"; import { Misc } from "./misc.js";
const competenceTroncs = [["Esquive", "Dague", "Corps à corps"], const competenceTroncs = [["Esquive", "Dague", "Corps à corps"],
@ -137,7 +138,7 @@ export class RdDItemCompetence extends Item {
/* -------------------------------------------- */ /* -------------------------------------------- */
static computeEconomieXPTronc(competences) { static computeEconomieXPTronc(competences) {
return competenceTroncs.map( return competenceTroncs.map(
list => list.map(name => RdDItemCompetence.findCompetence(competences, name)) list => list.map(name => RdDItemCompetence.findCompetence(competences, name, { onMessage: message => { } }))
// calcul du coût xp jusqu'au niveau 0 maximum // calcul du coût xp jusqu'au niveau 0 maximum
.map(it => RdDItemCompetence.computeDeltaXP(it?.system.base ?? -11, Math.min(it?.system.niveau ?? -11, 0))) .map(it => RdDItemCompetence.computeDeltaXP(it?.system.base ?? -11, Math.min(it?.system.niveau ?? -11, 0)))
.sort(Misc.ascending()) .sort(Misc.ascending())
@ -203,26 +204,12 @@ export class RdDItemCompetence extends Item {
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
static findCompetences(list, name) { static findCompetences(list, name, options = {}) {
return Misc.findAllLike(name, list, { filter: it => it.isCompetence(), description: 'compétence' }); options = foundry.utils.mergeObject(options, { preFilter: it => it.isCompetence(), description: 'compétence' }, { overwrite: false, inplace: false });
return Misc.findAllLike(name, list, options);
} }
static sansCompetence() { static sansCompetence() { return SANS_COMPETENCE }
return {
name: "Sans compétence",
type: "competence",
img: "systems/foundryvtt-reve-de-dragon/icons/templates/icone_parchement_vierge.webp",
system: {
niveau: 0,
default_diffLibre: 0,
base: 0,
categorie: "Aucune",
description: "",
descriptionmj: "",
defaut_carac: "",
}
};
}
static findFirstItem(list, idOrName, options) { static findFirstItem(list, idOrName, options) {
return list.find(it => it.id == idOrName && options.preFilter(it)) return list.find(it => it.id == idOrName && options.preFilter(it))
@ -272,8 +259,9 @@ export class RdDItemCompetence extends Item {
/* -------------------------------------------- */ /* -------------------------------------------- */
static triVisible(competences) { static triVisible(competences) {
return competences.filter(it => !it.system.isHidden) return competences
.sort((a, b) => RdDItemCompetence.compare(a, b)) ? competences.filter(it => !it.system.isHidden).sort((a, b) => RdDItemCompetence.compare(a, b))
: []
} }
static $positionTri(comp) { static $positionTri(comp) {

View File

@ -8,6 +8,7 @@ import { SystemCompendiums } from "./settings/system-compendiums.js";
import { RdDRaretes } from "./item/raretes.js"; import { RdDRaretes } from "./item/raretes.js";
import { CATEGORIES_COMPETENCES } from "./item-competence.js"; import { CATEGORIES_COMPETENCES } from "./item-competence.js";
import { CATEGORIES_COMPETENCES_CREATURES } from "./item-competencecreature.js"; import { CATEGORIES_COMPETENCES_CREATURES } from "./item-competencecreature.js";
import { BASE_CORPS_A_CORPS, BASE_ESQUIVE } from "./item/base-items.js";
export const ACTOR_TYPES = { export const ACTOR_TYPES = {
personnage: 'personnage', personnage: 'personnage',
@ -244,13 +245,13 @@ export class RdDItem extends Item {
isEsquive() { isEsquive() {
return (this.isCompetence() return (this.isCompetence()
&& this.system.categorie == 'melee' && this.system.categorie == 'melee'
&& Grammar.includesLowerCaseNoAccent(this.name, 'Esquive')); && Grammar.includesLowerCaseNoAccent(this.name, BASE_ESQUIVE.name));
} }
isCorpsACorps() { isCorpsACorps() {
return this.isCompetence() return this.isCompetence()
&& this.system.categorie == 'melee' && this.system.categorie == 'melee'
&& Grammar.includesLowerCaseNoAccent(this.name, 'Corps à Corps') && Grammar.includesLowerCaseNoAccent(this.name, BASE_CORPS_A_CORPS.name)
} }
isCompetenceArme() { isCompetenceArme() {

20
module/item/base-items.js Normal file
View File

@ -0,0 +1,20 @@
export const POSSESSION_SANS_DRACONIC = { name: 'Sans draconic', type: 'competence', system: { niveau: 0, defaut_carac: "reve-actuel", }, img: 'systems/foundryvtt-reve-de-dragon/icons/entites/possession.webp' }
export const PAS_DE_DRACONIC = { name: 'Pas de draconic', type: 'competence', system: { niveau: -11, defaut_carac: "reve" }, img: 'systems/foundryvtt-reve-de-dragon/icons/entites/possession.webp' }
export const BASE_CORPS_A_CORPS = { name: 'Corps à Corps', type: 'competence', system: { niveau: -6, defaut_carac: "melee" }, img: 'systems/foundryvtt-reve-de-dragon/icons/competence_corps_a_corps.webp' }
export const BASE_ESQUIVE = { name: 'Esquive', type: 'competence', system: { niveau: -6, defaut_carac: "derobee" }, img: 'systems/foundryvtt-reve-de-dragon/icons/competence_esquive.webp' }
export const SANS_COMPETENCE = {
name: "Sans compétence",
type: 'competence',
system: {
niveau: 0,
default_diffLibre: 0,
base: 0,
categorie: "Aucune",
description: "",
descriptionmj: "",
defaut_carac: "",
},
img: "systems/foundryvtt-reve-de-dragon/icons/templates/icone_parchement_vierge.webp"
}

View File

@ -231,7 +231,7 @@ export class Misc {
preFilter: it => true, preFilter: it => true,
description: 'valeur', description: 'valeur',
onMessage: m => ui.notifications.info(m) onMessage: m => ui.notifications.info(m)
}, options); }, options, { overwrite: true, inplace: false });
const subset = this.findAllLike(value, elements, options); const subset = this.findAllLike(value, elements, options);
if (subset.length == 0) { if (subset.length == 0) {

View File

@ -228,16 +228,19 @@ export class RdDCombatManager extends Combat {
static $prepareAttaqueArme(infoAttaque) { static $prepareAttaqueArme(infoAttaque) {
const comp = infoAttaque.competences.find(it => Grammar.equalsInsensitive(it.name, infoAttaque.competence)) const comp = infoAttaque.competences.find(it => Grammar.equalsInsensitive(it.name, infoAttaque.competence))
const arme = infoAttaque.arme; const arme = infoAttaque.arme;
const attaque = foundry.utils.duplicate(arme); const attaque = foundry.utils.duplicate(arme)
const carac = comp?.system.defaut_carac ?? (infoAttaque.infoMain == '(lancer)' ? 'lancer' : infoAttaque.infoMain == '(lancer)' ? 'tir' : 'melee')
const niveau = comp?.system.niveau ?? (infoAttaque.infoMain == '(lancer)' ? -8 : -6)
attaque.action = 'attaque'; attaque.action = 'attaque';
attaque.system.competence = infoAttaque.competence; attaque.system.competence = infoAttaque.competence;
attaque.system.dommagesReels = infoAttaque.dommagesReel; attaque.system.dommagesReels = infoAttaque.dommagesReel;
attaque.system.infoMain = infoAttaque.infoMain; attaque.system.infoMain = infoAttaque.infoMain;
attaque.system.niveau = comp.system.niveau; attaque.system.niveau = niveau
const ajustement = (arme?.parent?.getEtatGeneral() ?? 0) + (arme?.system.magique) ? arme.system.ecaille_efficacite : 0; const ajustement = (arme.parent?.getEtatGeneral() ?? 0) + (arme.system.magique) ? arme.system.ecaille_efficacite : 0
attaque.system.initiative = RdDCombatManager.calculInitiative(comp.system.niveau, infoAttaque.carac[comp.system.defaut_carac].value, ajustement); attaque.system.initiative = RdDCombatManager.calculInitiative(niveau, infoAttaque.carac[carac].value, ajustement)
return attaque; return attaque
} }
/* -------------------------------------------- */ /* -------------------------------------------- */

View File

@ -176,7 +176,7 @@ export class RdDTMRDialog extends Dialog {
} }
bringSubDialogToTop() { bringSubDialogToTop() {
if (this.subdialog?.bringToTop && this.subdialog?.element[0]) { if (this.subdialog?.bringToTop && this.subdialog?.element && this.subdialog?.element[0]) {
this.subdialog.bringToTop(); this.subdialog.bringToTop();
} }
} }
@ -245,6 +245,7 @@ export class RdDTMRDialog extends Dialog {
/* -------------------------------------------- */ /* -------------------------------------------- */
updateTokens() { updateTokens() {
this._removeTokens(t => true); this._removeTokens(t => true);
this.allTokens = []
this.loadRencontres(); this.loadRencontres();
this.loadCasesSpeciales(); this.loadCasesSpeciales();
this._createTokens(); this._createTokens();
@ -1133,6 +1134,14 @@ export class RdDTMRDialog extends Dialog {
return tmr; 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) { _removeTokens(filter = it => true) {
this.allTokens.filter(filter).forEach(token => this.pixiTMR.removeToken(token)) this.allTokens.filter(filter).forEach(token => this.pixiTMR.removeToken(token))
@ -1144,7 +1153,7 @@ export class RdDTMRDialog extends Dialog {
return return
} }
if (this.demiReve === token && this.isDemiReveCache()) { if (this.demiReve === token && this.isDemiReveCache()) {
return; return
} }
this.pixiTMR.positionToken(token); this.pixiTMR.positionToken(token);
if (!this.allTokens.includes(token)) { if (!this.allTokens.includes(token)) {

View File

@ -15,6 +15,7 @@ export class CarteTmr extends Draconique {
name: 'Carte des TMR', name: 'Carte des TMR',
hint: "Choix de l'image de la carte des TMR", hint: "Choix de l'image de la carte des TMR",
scope: "client", scope: "client",
requiresReload: true,
config: true, config: true,
choices: { choices: {
[TMR_V3_COULEUR]: "TMR Scriptarium v3 couleur", [TMR_V3_COULEUR]: "TMR Scriptarium v3 couleur",

View File

@ -184,12 +184,9 @@ export class PixiTMR {
const coordTMR = TMRUtility.oddqToCoordTMR(oddq); const coordTMR = TMRUtility.oddqToCoordTMR(oddq);
const tmr = TMRUtility.getTMR(coordTMR) const tmr = TMRUtility.getTMR(coordTMR)
if (tmr) { if (tmr) {
const tmrTooltip = `${coordTMR}: ${TMRUtility.getTMRLabel(coordTMR)}`; return this.tmrDialog.getTokensDetails(coordTMR)
const tokenTooltips = this.tmrDialog.allTokens
.filter(token => token.coordTMR() == coordTMR)
.map(token => token.tooltip);
return [tmrTooltip, ...tokenTooltips].reduce(Misc.joining('\n'))
} }
return undefined
} }
computeEventOddq(event) { computeEventOddq(event) {

View File

@ -3,147 +3,7 @@ name: Coursier de Psark
type: creature type: creature
sort: 100001 sort: 100001
img: systems/foundryvtt-reve-de-dragon/icons/invocations/coursier-psark.webp img: systems/foundryvtt-reve-de-dragon/icons/invocations/coursier-psark.webp
items: items: []
- _id: shsUV8UpU18c0RJK
name: Course
type: competencecreature
sort: 500000
img: systems/foundryvtt-reve-de-dragon/icons/competence_course.webp
effects: []
system:
description: ''
descriptionmj: ''
carac_value: 0
niveau: 0
default_diffLibre: 0
categorie: generale
categorie_parade: ''
iscombat: false
isnaturelle: true
ispossession: false
dommages: 0
mortalite: mortel
isparade: false
folder: null
ownership:
default: 0
_stats:
systemId: foundryvtt-reve-de-dragon
systemVersion: 12.0.22
coreVersion: '12.331'
_key: '!actors.items!I0Ogzl5rUmFcMhyH.shsUV8UpU18c0RJK'
- _id: CYpxxf1uTa78NWR9
name: Esquive
type: competencecreature
sort: 1000000
img: systems/foundryvtt-reve-de-dragon/icons/competence_esquive.webp
effects: []
system:
description: ''
descriptionmj: ''
carac_value: 0
niveau: 0
default_diffLibre: 0
categorie: ''
categorie_parade: ''
iscombat: false
isnaturelle: true
ispossession: false
dommages: 0
mortalite: mortel
isparade: false
folder: null
ownership:
default: 0
_stats:
systemId: foundryvtt-reve-de-dragon
systemVersion: 12.0.22
coreVersion: '12.331'
_key: '!actors.items!I0Ogzl5rUmFcMhyH.CYpxxf1uTa78NWR9'
- _id: 0zRL8bOpCXNQnIR4
name: Ruade
type: competencecreature
sort: 2200000
img: systems/foundryvtt-reve-de-dragon/icons/compcreature-pietinement.webp
effects: []
system:
description: null
descriptionmj: ''
carac_value: 0
niveau: 0
default_diffLibre: 0
categorie: ''
categorie_parade: ''
iscombat: true
isnaturelle: true
ispossession: false
dommages: 4
mortalite: mortel
isparade: false
folder: null
ownership:
default: 0
_stats:
systemId: foundryvtt-reve-de-dragon
systemVersion: 12.0.22
coreVersion: '12.331'
_key: '!actors.items!I0Ogzl5rUmFcMhyH.0zRL8bOpCXNQnIR4'
- _id: yBUVTjTXYfwvzusb
name: Saut
type: competencecreature
sort: 2300000
img: systems/foundryvtt-reve-de-dragon/icons/competence_saut.webp
effects: []
system:
description: ''
descriptionmj: ''
carac_value: 0
niveau: 0
default_diffLibre: 0
categorie: ''
categorie_parade: ''
iscombat: false
isnaturelle: true
ispossession: false
dommages: 0
mortalite: mortel
isparade: false
folder: null
ownership:
default: 0
_stats:
systemId: foundryvtt-reve-de-dragon
systemVersion: 12.0.22
coreVersion: '12.331'
_key: '!actors.items!I0Ogzl5rUmFcMhyH.yBUVTjTXYfwvzusb'
- _id: lzEdMrKXbOYrWG5S
name: Vigilance
type: competencecreature
sort: 2600000
img: systems/foundryvtt-reve-de-dragon/icons/competence_vigilance.webp
effects: []
system:
description: ''
descriptionmj: ''
carac_value: 0
niveau: 0
default_diffLibre: 0
categorie: ''
categorie_parade: ''
iscombat: false
isnaturelle: true
ispossession: false
dommages: 0
mortalite: mortel
isparade: false
folder: null
ownership:
default: 0
_stats:
systemId: foundryvtt-reve-de-dragon
systemVersion: 12.0.22
coreVersion: '12.331'
_key: '!actors.items!I0Ogzl5rUmFcMhyH.lzEdMrKXbOYrWG5S'
effects: [] effects: []
system: system:
carac: carac:

File diff suppressed because it is too large Load Diff

View File

@ -5,10 +5,11 @@ img: systems/foundryvtt-reve-de-dragon/icons/competence_hypnos.webp
effects: [] effects: []
system: system:
description: >- description: >-
<p>@JournalEntry[vid6uJc66QFgHSUr]{Note sur les invocations de <p>@UUID[Compendium.foundryvtt-reve-de-dragon.rappel-des-regles.JournalEntry.GRKYbbNDIHdzVNaj.JournalEntryPage.PiKGAswCiDPtmAol]{Note
créatures}</p> sur les invocations de créatures}</p>
<p>Les coursiers de Psark apparaissent toujours au nombre de sept. Ce sont <p>Les @UUID[Compendium.foundryvtt-reve-de-dragon.invocations.Actor.I0Ogzl5rUmFcMhyH]{coursiers de Psark}
apparaissent toujours au nombre de sept. Ce sont
de grands chevaux blancs à crinière blond doré, se présentant sans selle ni de grands chevaux blancs à crinière blond doré, se présentant sans selle ni
bride. Ils nont pas de caractéristiques, mais leur utilisation obéit aux bride. Ils nont pas de caractéristiques, mais leur utilisation obéit aux
règles suivantes :</p> règles suivantes :</p>
@ -61,8 +62,8 @@ system:
</ul> </ul>
<p>@JournalEntry[R3q4vUTEfyxYgmGr]{Communication avec les créatures <p>@UUID[Compendium.foundryvtt-reve-de-dragon.rappel-des-regles.JournalEntry.3wVxF2IRf3c1lOxC.JournalEntryPage.GLzfQkCfkbnxBX8A]{Communication
invoquées}</p> avec les créatures invoquées}</p>
descriptionmj: '' descriptionmj: ''
draconic: Voie d'Hypnos draconic: Voie d'Hypnos
duree: Tâche ou fin HN duree: Tâche ou fin HN

View File

@ -5,10 +5,11 @@ img: systems/foundryvtt-reve-de-dragon/icons/competence_hypnos.webp
effects: [] effects: []
system: system:
description: >- description: >-
<p>@JournalEntry[vid6uJc66QFgHSUr]{Note sur les invocations de <p>@UUID[Compendium.foundryvtt-reve-de-dragon.rappel-des-regles.JournalEntry.GRKYbbNDIHdzVNaj.JournalEntryPage.PiKGAswCiDPtmAol]{Note
créatures}</p> sur les invocations de créatures}</p>
<p>Le Guerrier Sorde a lapparence dun humanoïde entièrement revêtu dune <p>Le @UUID[Compendium.foundryvtt-reve-de-dragon.invocations.Actor.xGtM3z3KM6N6lpd5]{Guerrier Sorde}
a lapparence dun humanoïde entièrement revêtu dune
armure de plaques, visière du heaume toujours baissée, dissimulant son armure de plaques, visière du heaume toujours baissée, dissimulant son
visage. Il est armé dune épée sorde, dun bouclier moyen et dune dague. La visage. Il est armé dune épée sorde, dun bouclier moyen et dune dague. La
seule tâche que lon puisse lui demander est de faire usage de ses armes. seule tâche que lon puisse lui demander est de faire usage de ses armes.
@ -29,8 +30,8 @@ system:
suggestions et illusions dHypnos, avec un JR standard r-8, ainsi que par suggestions et illusions dHypnos, avec un JR standard r-8, ainsi que par
les sorts individuels de Thananatos.</p> les sorts individuels de Thananatos.</p>
<p>@JournalEntry[R3q4vUTEfyxYgmGr]{Communication avec les créatures <p>@UUID[Compendium.foundryvtt-reve-de-dragon.rappel-des-regles.JournalEntry.3wVxF2IRf3c1lOxC.JournalEntryPage.GLzfQkCfkbnxBX8A]{Communication
invoquées}</p> avec les créatures invoquées}</p>
descriptionmj: '' descriptionmj: ''
draconic: Voie d'Hypnos draconic: Voie d'Hypnos
duree: Tâche duree: Tâche

View File

@ -5,10 +5,11 @@ img: systems/foundryvtt-reve-de-dragon/icons/competence_hypnos.webp
effects: [] effects: []
system: system:
description: >- description: >-
<p>@JournalEntry[vid6uJc66QFgHSUr]{Note sur les invocations de <p>@UUID[Compendium.foundryvtt-reve-de-dragon.rappel-des-regles.JournalEntry.GRKYbbNDIHdzVNaj.JournalEntryPage.PiKGAswCiDPtmAol]{Note
créatures}</p> sur les invocations de créatures}</p>
<p>Le Guerrier Turme a lapparence dun Humain vêtu de cuir souple, armé <p>Le @UUID[Compendium.foundryvtt-reve-de-dragon.invocations.Actor.z87rV5CJ3inc6ZPc]{Guerrier Turme}
a lapparence dun Humain vêtu de cuir souple, armé
dune unique dague, et porteur dun cor. Ses traits physiques sont sans dune unique dague, et porteur dun cor. Ses traits physiques sont sans
importance, blond ou brun, laid ou beau, homme ou femme. La seule tâche importance, blond ou brun, laid ou beau, homme ou femme. La seule tâche
quil puisse accomplir est de veiller sur le sommeil du haut-rêvant. Il ny quil puisse accomplir est de veiller sur le sommeil du haut-rêvant. Il ny
@ -24,8 +25,8 @@ system:
Guerriers Turmes ont tous les mêmes caractéristiques et sont affectés par Guerriers Turmes ont tous les mêmes caractéristiques et sont affectés par
les sorts comme les Guerriers Sordes.</p> les sorts comme les Guerriers Sordes.</p>
<p>@JournalEntry[R3q4vUTEfyxYgmGr]{Communication avec les créatures <p>@UUID[Compendium.foundryvtt-reve-de-dragon.rappel-des-regles.JournalEntry.3wVxF2IRf3c1lOxC.JournalEntryPage.GLzfQkCfkbnxBX8A]{Communication
invoquées}</p> avec les créatures invoquées}</p>
descriptionmj: '' descriptionmj: ''
draconic: Voie d'Hypnos draconic: Voie d'Hypnos
duree: Tâche duree: Tâche

View File

@ -5,10 +5,11 @@ img: systems/foundryvtt-reve-de-dragon/icons/competence_hypnos.webp
effects: [] effects: []
system: system:
description: >- description: >-
<p>@JournalEntry[vid6uJc66QFgHSUr]{Note sur les invocations de <p>@UUID[Compendium.foundryvtt-reve-de-dragon.rappel-des-regles.JournalEntry.GRKYbbNDIHdzVNaj.JournalEntryPage.PiKGAswCiDPtmAol]{Note
créatures}</p> sur les invocations de créatures}</p>
<p>Le Kanaillou est un petit être pouvant se présenter sous de multiples <p>Le @UUID[Compendium.foundryvtt-reve-de-dragon.invocations.Actor.I8Q3Aj4ZUrsU4yBg]{Kanaillou}
est un petit être pouvant se présenter sous de multiples
apparences : humanoïde masculin ou féminin, créature dapparence bizarre et apparences : humanoïde masculin ou féminin, créature dapparence bizarre et
fantasque. Cette apparence est chaque fois laissée aux soins du gardien des fantasque. Cette apparence est chaque fois laissée aux soins du gardien des
rêves et na aucune importance réelle. Le Kanaillou est extrêmement rêves et na aucune importance réelle. Le Kanaillou est extrêmement
@ -46,8 +47,8 @@ system:
gratuit. Ce nest pas pour rien que cette invocation est plus facile que les gratuit. Ce nest pas pour rien que cette invocation est plus facile que les
autres : la véritable difficulté commence une fois quelle est lancée.</p> autres : la véritable difficulté commence une fois quelle est lancée.</p>
<p>@JournalEntry[R3q4vUTEfyxYgmGr]{Communication avec les créatures <p>@UUID[Compendium.foundryvtt-reve-de-dragon.rappel-des-regles.JournalEntry.3wVxF2IRf3c1lOxC.JournalEntryPage.GLzfQkCfkbnxBX8A]{Communication
invoquées}</p> avec les créatures invoquées}</p>
descriptionmj: '' descriptionmj: ''
draconic: Voie d'Hypnos draconic: Voie d'Hypnos
duree: Tâche duree: Tâche

View File

@ -5,8 +5,8 @@ img: systems/foundryvtt-reve-de-dragon/icons/competence_hypnos.webp
effects: [] effects: []
system: system:
description: >- description: >-
<p>@JournalEntry[vid6uJc66QFgHSUr]{Note sur les invocations de <p>@UUID[Compendium.foundryvtt-reve-de-dragon.rappel-des-regles.JournalEntry.GRKYbbNDIHdzVNaj.JournalEntryPage.PiKGAswCiDPtmAol]{Note
créatures}</p> sur les invocations de créatures}</p>
<p>Trois marmitons apparaissent, chargés dun panier contenant nappe et <p>Trois marmitons apparaissent, chargés dun panier contenant nappe et
luxueuse vaisselle, dun grand plat recouvert dune cloche, et dune luxueuse vaisselle, dun grand plat recouvert dune cloche, et dune
@ -14,7 +14,8 @@ system:
soulève la cloche du plat et en annonce fièrement lintitulé, tandis que le soulève la cloche du plat et en annonce fièrement lintitulé, tandis que le
troisième présente la boisson.</p> troisième présente la boisson.</p>
<p>Les Marmitons de Pavois dressent toujours le couvert pour sept convives, <p>Les @UUID[Compendium.foundryvtt-reve-de-dragon.invocations.Actor.kB7OSWKvd6m9v0dB]{Marmitons de Pavois}
dressent toujours le couvert pour sept convives,
et à raison de 3 points par personne, le plat contient 21 points de et à raison de 3 points par personne, le plat contient 21 points de
sustentation. Aux convives de se les partager selon leur propre nombre. La sustentation. Aux convives de se les partager selon leur propre nombre. La
bonbonne contient pareillement 21 mesures.</p> bonbonne contient pareillement 21 mesures.</p>
@ -39,8 +40,8 @@ system:
sufit à les faire se dématérialiser instantanément. La différence alors est sufit à les faire se dématérialiser instantanément. La différence alors est
que même la nourriture ingérée disparaît des estomacs.</p> que même la nourriture ingérée disparaît des estomacs.</p>
<p>@JournalEntry[R3q4vUTEfyxYgmGr]{Communication avec les créatures <p>@UUID[Compendium.foundryvtt-reve-de-dragon.rappel-des-regles.JournalEntry.3wVxF2IRf3c1lOxC.JournalEntryPage.GLzfQkCfkbnxBX8A]{Communication
invoquées}</p> avec les créatures invoquées}</p>
descriptionmj: '' descriptionmj: ''
draconic: Voie d'Hypnos draconic: Voie d'Hypnos
duree: Tâche duree: Tâche

View File

@ -5,11 +5,12 @@ img: systems/foundryvtt-reve-de-dragon/icons/competence_hypnos.webp
effects: [] effects: []
system: system:
description: >- description: >-
<p>@JournalEntry[vid6uJc66QFgHSUr]{Note sur les invocations de <p>@UUID[Compendium.foundryvtt-reve-de-dragon.rappel-des-regles.JournalEntry.GRKYbbNDIHdzVNaj.JournalEntryPage.PiKGAswCiDPtmAol]{Note
créatures}</p> sur les invocations de créatures}</p>
<p>Le Nonechalepasse a la même apparence physique et le même armement que le <p>Le Nonechalepasse a la même apparence physique et le même armement que le
Guerrier Sorde. Cest en fait une variante de ce dernier. Il est invoqué @UUID[Compendium.foundryvtt-reve-de-dragon.invocations.Actor.xGtM3z3KM6N6lpd5]{Guerrier Sorde}.
Cest en fait une variante de ce dernier. Il est invoqué
pour garder ou veiller sur quelque chose : une porte, un coffre, un pont, pour garder ou veiller sur quelque chose : une porte, un coffre, un pont,
etc. Layant invoqué, le haut-rêvant doit lui indiquer expressément sur quoi etc. Layant invoqué, le haut-rêvant doit lui indiquer expressément sur quoi
il doit veiller, et le Nonechalepasse ne laissera personne dautre que il doit veiller, et le Nonechalepasse ne laissera personne dautre que
@ -23,8 +24,8 @@ system:
tous les mêmes caractéristiques que les Guerriers Sordes et sont comme eux tous les mêmes caractéristiques que les Guerriers Sordes et sont comme eux
affectés par les sorts.</p> affectés par les sorts.</p>
<p>@JournalEntry[R3q4vUTEfyxYgmGr]{Communication avec les créatures <p>@UUID[Compendium.foundryvtt-reve-de-dragon.rappel-des-regles.JournalEntry.3wVxF2IRf3c1lOxC.JournalEntryPage.GLzfQkCfkbnxBX8A]{Communication
invoquées}</p> avec les créatures invoquées}</p>
descriptionmj: '' descriptionmj: ''
draconic: Voie d'Hypnos draconic: Voie d'Hypnos
duree: Tâche duree: Tâche

View File

@ -5,8 +5,8 @@ img: systems/foundryvtt-reve-de-dragon/icons/competence_hypnos.webp
effects: [] effects: []
system: system:
description: >- description: >-
<p>@JournalEntry[vid6uJc66QFgHSUr]{Note sur les invocations de <p>@UUID[Compendium.foundryvtt-reve-de-dragon.rappel-des-regles.JournalEntry.GRKYbbNDIHdzVNaj.JournalEntryPage.PiKGAswCiDPtmAol]{Note
créatures}</p> sur les invocations de créatures}</p>
<p>Trois artisans agiles et vigoureux apparaissent, chargés de toile, de <p>Trois artisans agiles et vigoureux apparaissent, chargés de toile, de
cordages et dun mât télescopique. Lensemble est destiné à dresser un petit cordages et dun mât télescopique. Lensemble est destiné à dresser un petit
@ -27,8 +27,8 @@ system:
<p>Le chapiteau est imperméable et résiste à de fortes bourrasques. Une <p>Le chapiteau est imperméable et résiste à de fortes bourrasques. Une
tempête véritable peut par contre être considérée comme une agression.</p> tempête véritable peut par contre être considérée comme une agression.</p>
<p>@JournalEntry[R3q4vUTEfyxYgmGr]{Communication avec les créatures <p>@UUID[Compendium.foundryvtt-reve-de-dragon.rappel-des-regles.JournalEntry.3wVxF2IRf3c1lOxC.JournalEntryPage.GLzfQkCfkbnxBX8A]{Communication
invoquées}</p> avec les créatures invoquées}</p>
descriptionmj: '' descriptionmj: ''
draconic: Voie d'Hypnos draconic: Voie d'Hypnos
duree: HN duree: HN

View File

@ -5,8 +5,8 @@ img: systems/foundryvtt-reve-de-dragon/icons/competence_hypnos.webp
effects: [] effects: []
system: system:
description: >- description: >-
<p>@JournalEntry[vid6uJc66QFgHSUr]{Note sur les invocations de <p>@UUID[Compendium.foundryvtt-reve-de-dragon.rappel-des-regles.JournalEntry.GRKYbbNDIHdzVNaj.JournalEntryPage.PiKGAswCiDPtmAol]{Note
créatures}</p> sur les invocations de créatures}</p>
<p>Le Secouriste blanc ne peut être invoqué que pendant un combat ou au <p>Le Secouriste blanc ne peut être invoqué que pendant un combat ou au
terme de celui-ci. Sa tâche consiste à prendre les blessés en charge, terme de celui-ci. Sa tâche consiste à prendre les blessés en charge,
@ -82,8 +82,8 @@ system:
<p>Le Secouriste disparaît dès que le combat est terminé ET que tous les <p>Le Secouriste disparaît dès que le combat est terminé ET que tous les
blessés ont été soignés.</p> blessés ont été soignés.</p>
<p>@JournalEntry[R3q4vUTEfyxYgmGr]{Communication avec les créatures <p>@UUID[Compendium.foundryvtt-reve-de-dragon.rappel-des-regles.JournalEntry.3wVxF2IRf3c1lOxC.JournalEntryPage.GLzfQkCfkbnxBX8A]{Communication
invoquées}</p> avec les créatures invoquées}</p>
descriptionmj: '' descriptionmj: ''
draconic: Voie d'Hypnos draconic: Voie d'Hypnos
duree: Tâche ou fin HN duree: Tâche ou fin HN

View File

@ -3315,7 +3315,7 @@ prototypeToken:
height: 1 height: 1
lockRotation: false lockRotation: false
rotation: 0 rotation: 0
actorLink: false actorLink: true
disposition: 0 disposition: 0
displayBars: 0 displayBars: 0
bar1: bar1:

View File

@ -3021,7 +3021,7 @@ prototypeToken:
height: 1 height: 1
lockRotation: false lockRotation: false
rotation: 0 rotation: 0
actorLink: false actorLink: true
disposition: 0 disposition: 0
displayBars: 0 displayBars: 0
bar1: bar1:

View File

@ -2954,7 +2954,7 @@ prototypeToken:
height: 1 height: 1
lockRotation: false lockRotation: false
rotation: 0 rotation: 0
actorLink: false actorLink: true
disposition: 0 disposition: 0
displayBars: 0 displayBars: 0
bar1: bar1:

View File

@ -3039,7 +3039,7 @@ prototypeToken:
height: 1 height: 1
lockRotation: false lockRotation: false
rotation: 0 rotation: 0
actorLink: false actorLink: true
disposition: 0 disposition: 0
displayBars: 0 displayBars: 0
bar1: bar1:

View File

@ -3113,7 +3113,7 @@ prototypeToken:
height: 1 height: 1
lockRotation: false lockRotation: false
rotation: 0 rotation: 0
actorLink: false actorLink: true
disposition: 0 disposition: 0
displayBars: 0 displayBars: 0
bar1: bar1:

View File

@ -2975,7 +2975,7 @@ ownership:
prototypeToken: prototypeToken:
name: le Coureur des Rues name: le Coureur des Rues
displayName: 0 displayName: 0
actorLink: false actorLink: true
width: 1 width: 1
height: 1 height: 1
lockRotation: false lockRotation: false

View File

@ -3502,7 +3502,7 @@ ownership:
prototypeToken: prototypeToken:
name: le Cuisinier Haut-Rêvant name: le Cuisinier Haut-Rêvant
displayName: 0 displayName: 0
actorLink: false actorLink: true
width: 1 width: 1
height: 1 height: 1
lockRotation: false lockRotation: false

View File

@ -3262,7 +3262,7 @@ prototypeToken:
height: 1 height: 1
lockRotation: false lockRotation: false
rotation: 0 rotation: 0
actorLink: false actorLink: true
disposition: 0 disposition: 0
displayBars: 0 displayBars: 0
bar1: bar1:

View File

@ -2186,10 +2186,11 @@ items:
effects: [] effects: []
system: system:
description: >- description: >-
<p>@JournalEntry[vid6uJc66QFgHSUr]{Note sur les invocations de <p>@UUID[Compendium.foundryvtt-reve-de-dragon.rappel-des-regles.JournalEntry.GRKYbbNDIHdzVNaj.JournalEntryPage.PiKGAswCiDPtmAol]{Note
créatures}</p> sur les invocations de créatures}</p>
<p>Le Guerrier Sorde a lapparence dun humanoïde entièrement revêtu <p>Le @UUID[Compendium.foundryvtt-reve-de-dragon.invocations.Actor.xGtM3z3KM6N6lpd5]{Guerrier Sorde}
a lapparence dun humanoïde entièrement revêtu
dune armure de plaques, visière du heaume toujours baissée, dissimulant dune armure de plaques, visière du heaume toujours baissée, dissimulant
son visage. Il est armé dune épée sorde, dun bouclier moyen et dune son visage. Il est armé dune épée sorde, dun bouclier moyen et dune
dague. La seule tâche que lon puisse lui demander est de faire usage de dague. La seule tâche que lon puisse lui demander est de faire usage de
@ -2211,8 +2212,8 @@ items:
normalement affectés par les suggestions et illusions dHypnos, avec un normalement affectés par les suggestions et illusions dHypnos, avec un
JR standard r-8, ainsi que par les sorts individuels de Thananatos.</p> JR standard r-8, ainsi que par les sorts individuels de Thananatos.</p>
<p>@JournalEntry[R3q4vUTEfyxYgmGr]{Communication avec les créatures <p>@UUID[Compendium.foundryvtt-reve-de-dragon.rappel-des-regles.JournalEntry.3wVxF2IRf3c1lOxC.JournalEntryPage.GLzfQkCfkbnxBX8A]{Communication
invoquées}</p> avec les créatures invoquées}</p>
descriptionmj: '' descriptionmj: ''
draconic: hypnos draconic: hypnos
duree: Tâche duree: Tâche
@ -3584,7 +3585,7 @@ prototypeToken:
height: 1 height: 1
lockRotation: false lockRotation: false
rotation: 0 rotation: 0
actorLink: false actorLink: true
disposition: 0 disposition: 0
displayBars: 0 displayBars: 0
bar1: bar1:

View File

@ -3752,7 +3752,7 @@ prototypeToken:
height: 1 height: 1
lockRotation: false lockRotation: false
rotation: 0 rotation: 0
actorLink: false actorLink: true
disposition: 0 disposition: 0
displayBars: 0 displayBars: 0
bar1: bar1:

View File

@ -3661,7 +3661,7 @@ prototypeToken:
height: 1 height: 1
lockRotation: false lockRotation: false
rotation: 0 rotation: 0
actorLink: false actorLink: true
disposition: 0 disposition: 0
displayBars: 0 displayBars: 0
bar1: bar1:

View File

@ -3025,7 +3025,7 @@ prototypeToken:
height: 1 height: 1
lockRotation: false lockRotation: false
rotation: 0 rotation: 0
actorLink: false actorLink: true
disposition: 0 disposition: 0
displayBars: 0 displayBars: 0
bar1: bar1:

View 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

View File

@ -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"> <ol 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}}">

View File

@ -1,5 +1,7 @@
<span class="item-name"><h4>Personnages accordés</h4></span> <h4>Personnages accordés <a class="resonance-add" data-tooltip="Ajouter un pesonnage accordé">
<ul class="item-list alterne-list"> <i class="fa-solid fa-person-circle-plus"></i>
</a></h4>
<ol class="item-list alterne-list">
{{#each resonances as |actor|}} {{#each resonances as |actor|}}
<li class="item flexrow list-item" data-actor-id="{{actor.id}}"> <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}}"/> <img class="sheet-competence-img subacteur-open" src="{{actor.img}}" data-tooltip="{{actor.name}}"/>
@ -9,4 +11,4 @@
</div> </div>
</li> </li>
{{/each}} {{/each}}
</ul> </ol>