Compare commits
98 Commits
v1.5
...
foundryvtt
Author | SHA1 | Date | |
---|---|---|---|
0cc6b1de98 | |||
c41b59b703 | |||
b4ca941065 | |||
322506250b | |||
5d36ea9e0c | |||
dc0fab2957 | |||
2e158f9d39 | |||
7e1bbcada0 | |||
02ccb1f287 | |||
4afa313ffc | |||
1b8ad316b9 | |||
b35eaad757 | |||
e325ab9278 | |||
ebe19959fa | |||
5a2bc69fbb | |||
57dfdf0b65 | |||
028e8b883f | |||
4bab69b88f | |||
be0c0fbf3a | |||
cd4bf203e6 | |||
fc5674a7d8 | |||
fe80881405 | |||
3a29c25b09 | |||
e2ff813226 | |||
b67f230212 | |||
47f9e1adaa | |||
33808b8cf0 | |||
0d67d9af88 | |||
45a562f502 | |||
21fc62b302 | |||
c37c68e6db | |||
ca893088d2 | |||
e69fb222c3 | |||
c76bf912d1 | |||
4b1573ab8b | |||
e0049cc2f7 | |||
8e0949442d | |||
28427bc7c7 | |||
50980d5216 | |||
a75ee8fbc6 | |||
78c757a21a | |||
6d06c96497 | |||
5402508b26 | |||
43d097581e | |||
7785851719 | |||
8f127bc66b | |||
8c5f6b8f1b | |||
00630849cb | |||
c4392f0320 | |||
7a92ee85ef | |||
56ea9dd2e4 | |||
ee42902b5c | |||
838d4381a4 | |||
2232224951 | |||
1251d04860 | |||
63c6d5ff0f | |||
c0d37e42ca | |||
c8c13d626c | |||
e1ca7ab738 | |||
8f1ee315ef | |||
5daf15901a | |||
bddaecbc74 | |||
87fdd655d4 | |||
9cbb12e900 | |||
509b7f97dc | |||
5cd9fb3a1c | |||
336767c19e | |||
5a32cf26dc | |||
67b0555b11 | |||
59613c3bf8 | |||
e257b6fbee | |||
ea990d7c4e | |||
cfe8bee1c2 | |||
d4f0cce62b | |||
59b4f62145 | |||
5f3361ecc6 | |||
c80cde6d18 | |||
15e4bfb713 | |||
8c2d49652c | |||
ed02972a34 | |||
7d32a70e00 | |||
0d288c56d4 | |||
09c4e691c7 | |||
3774fef20c | |||
9bc4260ae1 | |||
255c0a77b4 | |||
698ff79d41 | |||
dffe191d6e | |||
1f3fd0bb46 | |||
0228d5bc56 | |||
6b48839841 | |||
451ee677d2 | |||
a3fb328b7d | |||
4538439c02 | |||
d83fd27193 | |||
580fdb996b | |||
5214b036d3 | |||
f64928858c |
@ -1 +0,0 @@
|
|||||||
foundryvtt-reve-de-dragon
|
|
@ -41,7 +41,8 @@
|
|||||||
"TypeOmbre": "Ombre de Thanatos",
|
"TypeOmbre": "Ombre de Thanatos",
|
||||||
"TypeSouffle": "Souffle de Dragon",
|
"TypeSouffle": "Souffle de Dragon",
|
||||||
"TypeTete": "Tête de Dragon",
|
"TypeTete": "Tête de Dragon",
|
||||||
"TypePossession": "Possession"
|
"TypePossession": "Possession",
|
||||||
|
"TypeSortreserve": "Sort en réserve"
|
||||||
},
|
},
|
||||||
"EFFECT": {
|
"EFFECT": {
|
||||||
"StatusStunned": "Sonné",
|
"StatusStunned": "Sonné",
|
||||||
|
@ -27,16 +27,16 @@ export class RdDActorCreatureSheet extends RdDActorSheet {
|
|||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
async getData() {
|
async getData() {
|
||||||
let formData = await super.getData();
|
let formData = await super.getData()
|
||||||
console.log("Creature : ", formData);
|
//console.log("Creature : ", formData, formData.system)
|
||||||
formData.calc = {
|
formData.calc = {
|
||||||
caracTotal: RdDCarac.computeTotal(formData.data.carac),
|
caracTotal: RdDCarac.computeTotal(formData.system.carac),
|
||||||
resumeBlessures: this.actor.computeResumeBlessure(formData.data.blessures),
|
resumeBlessures: this.actor.computeResumeBlessure(formData.system.blessures),
|
||||||
encTotal: await this.actor.computeEncombrementTotalEtMalusArmure(),
|
encTotal: await this.actor.computeEncombrementTotalEtMalusArmure(),
|
||||||
surEncombrementMessage: this.actor.getMessageSurEncombrement()
|
surEncombrementMessage: this.actor.getMessageSurEncombrement()
|
||||||
}
|
}
|
||||||
|
|
||||||
RdDUtility.filterItemsPerTypeForSheet(formData);
|
RdDUtility.filterItemsPerTypeForSheet(formData, this.actor.itemTypes);
|
||||||
this.objetVersConteneur = RdDUtility.buildArbreDeConteneurs(formData.conteneurs, formData.objets);
|
this.objetVersConteneur = RdDUtility.buildArbreDeConteneurs(formData.conteneurs, formData.objets);
|
||||||
formData.conteneurs = RdDUtility.conteneursRacine(formData.conteneurs);
|
formData.conteneurs = RdDUtility.conteneursRacine(formData.conteneurs);
|
||||||
|
|
||||||
|
@ -25,27 +25,26 @@ export class RdDActorEntiteSheet extends ActorSheet {
|
|||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
async getData() {
|
async getData() {
|
||||||
const objectData = Misc.data(this.object);
|
|
||||||
let formData = {
|
let formData = {
|
||||||
title: this.title,
|
title: this.title,
|
||||||
id: objectData.id,
|
id: this.actor.id,
|
||||||
type: objectData.type,
|
type: this.actor.type,
|
||||||
img: objectData.img,
|
img: this.actor.img,
|
||||||
name: objectData.name,
|
name: this.actor.name,
|
||||||
// actor: this.object,
|
|
||||||
editable: this.isEditable,
|
editable: this.isEditable,
|
||||||
cssClass: this.isEditable ? "editable" : "locked",
|
cssClass: this.isEditable ? "editable" : "locked",
|
||||||
data: foundry.utils.deepClone(Misc.templateData(this.object)),
|
system: foundry.utils.deepClone(this.actor.system),
|
||||||
effects: this.object.effects.map(e => foundry.utils.deepClone(e.data)),
|
effects: this.actor.effects.map(e => foundry.utils.deepClone(e)),
|
||||||
// items: items,
|
// items: items,
|
||||||
limited: this.object.limited,
|
limited: this.actor.limited,
|
||||||
options: this.options,
|
options: this.options,
|
||||||
owner: this.document.isOwner,
|
owner: this.actor.isOwner,
|
||||||
itemsByType: Misc.classify(this.object.items.map(i => foundry.utils.deepClone(i.data))),
|
description: await TextEditor.enrichHTML(this.object.system.description, {async: true}),
|
||||||
|
notesmj: await TextEditor.enrichHTML(this.object.system.notesmj, {async: true}),
|
||||||
};
|
};
|
||||||
|
|
||||||
formData.options.isGM = game.user.isGM;
|
formData.options.isGM = game.user.isGM;
|
||||||
RdDUtility.filterItemsPerTypeForSheet(formData);
|
RdDUtility.filterItemsPerTypeForSheet(formData, this.actor.itemTypes);
|
||||||
|
|
||||||
|
|
||||||
return formData;
|
return formData;
|
||||||
@ -141,6 +140,6 @@ export class RdDActorEntiteSheet extends ActorSheet {
|
|||||||
/** @override */
|
/** @override */
|
||||||
_updateObject(event, formData) {
|
_updateObject(event, formData) {
|
||||||
// Update the Actor
|
// Update the Actor
|
||||||
return this.object.update(formData);
|
return this.actor.update(formData);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -15,6 +15,7 @@ import { DialogSplitItem } from "./dialog-split-item.js";
|
|||||||
import { ReglesOptionelles } from "./regles-optionelles.js";
|
import { ReglesOptionelles } from "./regles-optionelles.js";
|
||||||
import { DialogRepos } from "./dialog-repos.js";
|
import { DialogRepos } from "./dialog-repos.js";
|
||||||
import { RdDSheetUtility } from "./rdd-sheet-utility.js";
|
import { RdDSheetUtility } from "./rdd-sheet-utility.js";
|
||||||
|
import { STATUSES } from "./status-effects.js";
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
export class RdDActorSheet extends ActorSheet {
|
export class RdDActorSheet extends ActorSheet {
|
||||||
@ -28,7 +29,6 @@ export class RdDActorSheet extends ActorSheet {
|
|||||||
width: 640,
|
width: 640,
|
||||||
tabs: [{ navSelector: ".sheet-tabs", contentSelector: ".sheet-body", initial: "carac" }],
|
tabs: [{ navSelector: ".sheet-tabs", contentSelector: ".sheet-body", initial: "carac" }],
|
||||||
dragDrop: [{ dragSelector: ".item-list .item", dropSelector: null }],
|
dragDrop: [{ dragSelector: ".item-list .item", dropSelector: null }],
|
||||||
editCaracComp: false,
|
|
||||||
showCompNiveauBase: false,
|
showCompNiveauBase: false,
|
||||||
vueDetaillee: false
|
vueDetaillee: false
|
||||||
});
|
});
|
||||||
@ -36,54 +36,53 @@ export class RdDActorSheet extends ActorSheet {
|
|||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
async getData() {
|
async getData() {
|
||||||
const objectData = Misc.data(this.object);
|
|
||||||
this.timerRecherche = undefined;
|
this.timerRecherche = undefined;
|
||||||
|
|
||||||
let formData = {
|
let formData = {
|
||||||
title: this.title,
|
title: this.title,
|
||||||
id: objectData.id,
|
id: this.actor.id,
|
||||||
type: objectData.type,
|
type: this.actor.type,
|
||||||
img: objectData.img,
|
img: this.actor.img,
|
||||||
name: objectData.name,
|
name: this.actor.name,
|
||||||
editable: this.isEditable,
|
editable: this.isEditable,
|
||||||
cssClass: this.isEditable ? "editable" : "locked",
|
cssClass: this.isEditable ? "editable" : "locked",
|
||||||
data: foundry.utils.deepClone(Misc.templateData(this.object)),
|
system: foundry.utils.deepClone(this.actor.system),
|
||||||
effects: this.object.effects.map(e => foundry.utils.deepClone(e.data)),
|
effects: this.actor.effects.map(e => foundry.utils.deepClone(e)),
|
||||||
limited: this.object.limited,
|
limited: this.actor.limited,
|
||||||
options: this.options,
|
options: this.options,
|
||||||
owner: this.document.isOwner,
|
owner: this.actor.isOwner,
|
||||||
itemsByType: Misc.classify(this.object.items.map(i => foundry.utils.deepClone(i.data))),
|
biographie: await TextEditor.enrichHTML(this.object.system.biographie, {async: true}),
|
||||||
};
|
notes: await TextEditor.enrichHTML(this.object.system.notes, {async: true}),
|
||||||
|
notesmj: await TextEditor.enrichHTML(this.object.system.notesmj, {async: true}),
|
||||||
RdDUtility.filterItemsPerTypeForSheet(formData);
|
}
|
||||||
|
RdDUtility.filterItemsPerTypeForSheet(formData, this.actor.itemTypes);
|
||||||
|
|
||||||
formData.options.isGM = game.user.isGM;
|
formData.options.isGM = game.user.isGM;
|
||||||
|
|
||||||
if (formData.type == 'creature') return formData; // Shortcut
|
if (formData.type == 'creature') return formData; // Shortcut
|
||||||
|
|
||||||
formData.competenceByCategory = Misc.classify(formData.competences, it => it.data.categorie);
|
formData.byCateg = Misc.classify(formData.competences, it => it.system.categorie)
|
||||||
|
|
||||||
formData.calc = {
|
formData.calc = {
|
||||||
comptageArchetype: RdDItemCompetence.computeResumeArchetype(formData.competences),
|
comptageArchetype: RdDItemCompetence.computeResumeArchetype(formData.competences),
|
||||||
competenceXPTotal: RdDItemCompetence.computeTotalXP(formData.competences),
|
competenceXPTotal: RdDItemCompetence.computeTotalXP(formData.competences),
|
||||||
caracTotal: RdDCarac.computeTotal(formData.data.carac, formData.data.beaute),
|
caracTotal: RdDCarac.computeTotal(formData.system.carac, formData.system.beaute),
|
||||||
// Mise à jour de l'encombrement total et du prix de l'équipement
|
// Mise à jour de l'encombrement total et du prix de l'équipement
|
||||||
encTotal: await this.actor.computeEncombrementTotalEtMalusArmure(),
|
encTotal: await this.actor.computeEncombrementTotalEtMalusArmure(),
|
||||||
prixTotalEquipement: this.actor.computePrixTotalEquipement(),
|
prixTotalEquipement: this.actor.computePrixTotalEquipement(),
|
||||||
surprise: RdDBonus.find(this.actor.getSurprise(false)).descr,
|
surprise: RdDBonus.find(this.actor.getSurprise(false)).descr,
|
||||||
fatigue: RdDUtility.calculFatigueHtml(formData.data.sante.fatigue.value, formData.data.sante.endurance.max),
|
fatigue: RdDUtility.calculFatigueHtml(formData.system.sante.fatigue.value, formData.system.sante.endurance.max),
|
||||||
resumeBlessures: this.actor.computeResumeBlessure(formData.data.blessures),
|
resumeBlessures: this.actor.computeResumeBlessure(formData.system.blessures),
|
||||||
surEncombrementMessage: this.actor.getMessageSurEncombrement()
|
surEncombrementMessage: this.actor.getMessageSurEncombrement()
|
||||||
};
|
};
|
||||||
|
|
||||||
formData.competences.forEach(item => {
|
formData.competences.forEach(item => {
|
||||||
item.visible = this.options.recherche
|
item.system.isVisible = this.options.recherche
|
||||||
? RdDItemCompetence.nomContientTexte(item, this.options.recherche.text)
|
? RdDItemCompetence.nomContientTexte(item, this.options.recherche.text)
|
||||||
: (!this.options.showCompNiveauBase || !RdDItemCompetence.isNiveauBase(item));
|
: (!this.options.showCompNiveauBase || !RdDItemCompetence.isNiveauBase(item));
|
||||||
RdDItemCompetence.levelUp(item, formData.data.compteurs.experience.value);
|
RdDItemCompetence.levelUp(item, formData.system.compteurs.experience.value);
|
||||||
});
|
});
|
||||||
|
Object.values(formData.system.carac).forEach(c => {
|
||||||
Object.values(formData.data.carac).forEach(c => {
|
|
||||||
RdDCarac.levelUp(c);
|
RdDCarac.levelUp(c);
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -91,9 +90,9 @@ export class RdDActorSheet extends ActorSheet {
|
|||||||
// toujours avoir une liste d'armes (pour mettre esquive et corps à corps)
|
// toujours avoir une liste d'armes (pour mettre esquive et corps à corps)
|
||||||
formData.combat = duplicate(formData.armes ?? []);
|
formData.combat = duplicate(formData.armes ?? []);
|
||||||
RdDItemArme.computeNiveauArmes(formData.combat, formData.competences);
|
RdDItemArme.computeNiveauArmes(formData.combat, formData.competences);
|
||||||
RdDItemArme.ajoutCorpsACorps(formData.combat, formData.competences, formData.data.carac);
|
RdDItemArme.ajoutCorpsACorps(formData.combat, formData.competences, formData.system.carac);
|
||||||
formData.esquives = this.actor.getCompetences("Esquive").map(i => foundry.utils.deepClone(i.data));
|
formData.esquives = this.actor.getCompetences("Esquive");
|
||||||
formData.combat = RdDCombatManager.listActionsArmes(formData.combat, formData.competences, formData.data.carac);
|
formData.combat = RdDCombatManager.listActionsArmes(formData.combat, formData.competences, formData.system.carac);
|
||||||
|
|
||||||
this.armesList = formData.combat;
|
this.armesList = formData.combat;
|
||||||
|
|
||||||
@ -102,10 +101,8 @@ export class RdDActorSheet extends ActorSheet {
|
|||||||
formData.difficultesLibres = CONFIG.RDD.difficultesLibres;
|
formData.difficultesLibres = CONFIG.RDD.difficultesLibres;
|
||||||
|
|
||||||
formData.hautreve = {
|
formData.hautreve = {
|
||||||
isDemiReve: this.actor.getEffectByLabel("Demi-rêve"),
|
isDemiReve: this.actor.getEffect(STATUSES.StatusDemiReve),
|
||||||
sortsReserve: formData.data.reve.reserve.list,
|
rencontres: duplicate(formData.system.reve.rencontre.list),
|
||||||
rencontres: duplicate(formData.data.reve.rencontre.list),
|
|
||||||
casesTmr: formData.itemsByType.casetmr,
|
|
||||||
cacheTMR: this.actor.isTMRCache()
|
cacheTMR: this.actor.isTMRCache()
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -117,7 +114,7 @@ export class RdDActorSheet extends ActorSheet {
|
|||||||
montures: this.actor.listeMontures(),
|
montures: this.actor.listeMontures(),
|
||||||
suivants: this.actor.listeSuivants()
|
suivants: this.actor.listeSuivants()
|
||||||
}
|
}
|
||||||
if (this.actor.getBestDraconic().data.niveau > -11 && !this.actor.isHautRevant()) {
|
if (this.actor.getBestDraconic().system.niveau > -11 && !this.actor.isHautRevant()) {
|
||||||
ui.notifications.error(`${this.actor.name} a des compétences draconiques, mais pas le don de Haut-Rêve!
|
ui.notifications.error(`${this.actor.name} a des compétences draconiques, mais pas le don de Haut-Rêve!
|
||||||
<br>Ajoutez-lui la tête "Don de Haut-Rêve" pour lui permettre d'utiliser ses compétences et d'accéder aux terres médianes du rêve`);
|
<br>Ajoutez-lui la tête "Don de Haut-Rêve" pour lui permettre d'utiliser ses compétences et d'accéder aux terres médianes du rêve`);
|
||||||
}
|
}
|
||||||
@ -130,16 +127,16 @@ export class RdDActorSheet extends ActorSheet {
|
|||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
async _onDropActor(event, dragData) {
|
async _onDropActor(event, dragData) {
|
||||||
console.log("_onDropActor", this.actor.id, dragData);
|
const dropActor = fromUuidSync(dragData.uuid);
|
||||||
this.actor.addSubActeur(dragData.id || dragData.data._id);
|
this.actor.addSubActeur(dropActor);
|
||||||
super._onDropActor(event, dragData);
|
super._onDropActor(event, dragData);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
async _onDropItem(event, dragData) {
|
async _onDropItem(event, dragData) {
|
||||||
const destItemId = $(event.target)?.closest('.item').attr('data-item-id');
|
const destItemId = $(event.target)?.closest('.item').attr('data-item-id')
|
||||||
const dropParams = RdDSheetUtility.prepareItemDropParameters(destItemId, this.actor.id, dragData, this.objetVersConteneur);
|
const dropParams = RdDSheetUtility.prepareItemDropParameters(destItemId, this.actor.id, dragData, this.objetVersConteneur)
|
||||||
const callSuper = await this.actor.processDropItem(dropParams);
|
const callSuper = await this.actor.processDropItem(dropParams)
|
||||||
if (callSuper) {
|
if (callSuper) {
|
||||||
await super._onDropItem(event, dragData)
|
await super._onDropItem(event, dragData)
|
||||||
}
|
}
|
||||||
@ -183,7 +180,8 @@ export class RdDActorSheet extends ActorSheet {
|
|||||||
});
|
});
|
||||||
html.find('.item-delete').click(async event => {
|
html.find('.item-delete').click(async event => {
|
||||||
const li = RdDSheetUtility.getEventElement(event);
|
const li = RdDSheetUtility.getEventElement(event);
|
||||||
RdDUtility.confirmerSuppression(this, li);
|
const item = this.actor.getObjet(li.data("item-id"));
|
||||||
|
RdDUtility.confirmerSuppressionItem(this, item, li);
|
||||||
});
|
});
|
||||||
html.find('.item-vendre').click(async event => {
|
html.find('.item-vendre').click(async event => {
|
||||||
const item = RdDSheetUtility.getItem(event, this.actor);
|
const item = RdDSheetUtility.getItem(event, this.actor);
|
||||||
@ -193,16 +191,28 @@ export class RdDActorSheet extends ActorSheet {
|
|||||||
const item = RdDSheetUtility.getItem(event, this.actor);
|
const item = RdDSheetUtility.getItem(event, this.actor);
|
||||||
item?.postItem();
|
item?.postItem();
|
||||||
});
|
});
|
||||||
|
|
||||||
html.find('.item-action').click(async event => {
|
html.find('.item-action').click(async event => {
|
||||||
const item = RdDSheetUtility.getItem(event, this.actor)
|
const item = RdDSheetUtility.getItem(event, this.actor)
|
||||||
this.actor.actionItem(item);
|
this.actor.actionItem(item);
|
||||||
});
|
});
|
||||||
html.find('.subacteur-delete').click(async event => {
|
html.find('.subacteur-delete').click(async event => {
|
||||||
const li = RdDSheetUtility.getEventElement(event);
|
const li = RdDSheetUtility.getEventElement(event);
|
||||||
RdDUtility.confirmerSuppressionSubacteur(this, li);
|
const actorId = li.data("actor-id");
|
||||||
|
if (actorId) {
|
||||||
|
const subActor = game.actors.get(actorId);
|
||||||
|
RdDUtility.confirmerSuppressionSubacteur(this, subActor, li);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
html.find('.experiencelog-delete').click(async event => {
|
||||||
|
const li = $(event.currentTarget)?.parents(".experiencelog");
|
||||||
|
const key = Number(li.data("key") ?? -1);
|
||||||
|
await this.actor.deleteExperienceLog(key, 1);
|
||||||
|
});
|
||||||
|
html.find('.experiencelog-delete-previous').click(async event => {
|
||||||
|
const li = $(event.currentTarget)?.parents(".experiencelog");
|
||||||
|
const key = Number(li.data("key") ?? -1);
|
||||||
|
await this.actor.deleteExperienceLog(0, key + 1);
|
||||||
});
|
});
|
||||||
|
|
||||||
html.find('.encaisser-direct').click(async event => {
|
html.find('.encaisser-direct').click(async event => {
|
||||||
this.actor.encaisser();
|
this.actor.encaisser();
|
||||||
})
|
})
|
||||||
@ -239,7 +249,7 @@ export class RdDActorSheet extends ActorSheet {
|
|||||||
});
|
});
|
||||||
|
|
||||||
// Blessure data
|
// Blessure data
|
||||||
html.find('.blessures-soins').change(async event => {
|
html.find('.blessure-soins').change(async event => {
|
||||||
const tr = $(event.currentTarget).parents(".item");
|
const tr = $(event.currentTarget).parents(".item");
|
||||||
let btype = tr.data('blessure-type');
|
let btype = tr.data('blessure-type');
|
||||||
let index = tr.data('blessure-index');
|
let index = tr.data('blessure-index');
|
||||||
@ -332,7 +342,7 @@ export class RdDActorSheet extends ActorSheet {
|
|||||||
});
|
});
|
||||||
// Initiative pour l'arme
|
// Initiative pour l'arme
|
||||||
html.find('.arme-initiative a').click(async event => {
|
html.find('.arme-initiative a').click(async event => {
|
||||||
let combatant = game.combat.data.combatants.find(c => c.actor.data._id == this.actor.data._id);
|
let combatant = game.combat.combatants.find(c => c.actor.id == this.actor.id);
|
||||||
if (combatant) {
|
if (combatant) {
|
||||||
let action = this._getEventArmeCombat(event);
|
let action = this._getEventArmeCombat(event);
|
||||||
RdDCombatManager.rollInitiativeAction(combatant._id, action);
|
RdDCombatManager.rollInitiativeAction(combatant._id, action);
|
||||||
@ -359,11 +369,15 @@ export class RdDActorSheet extends ActorSheet {
|
|||||||
await DialogRepos.create(this.actor);
|
await DialogRepos.create(this.actor);
|
||||||
});
|
});
|
||||||
html.find('.delete-active-effect').click(async event => {
|
html.find('.delete-active-effect').click(async event => {
|
||||||
let id = $(event.currentTarget).parents(".active-effect").data('id');
|
if (game.user.isGM) {
|
||||||
this.actor.enleverActiveEffectById(id);
|
let effect = $(event.currentTarget).parents(".active-effect").data('effect');
|
||||||
|
this.actor.removeEffect(effect);
|
||||||
|
}
|
||||||
});
|
});
|
||||||
html.find('.enlever-tous-effets').click(async event => {
|
html.find('.enlever-tous-effets').click(async event => {
|
||||||
this.actor.enleverTousLesEffets();
|
if (game.user.isGM) {
|
||||||
|
await this.actor.removeEffects();
|
||||||
|
}
|
||||||
});
|
});
|
||||||
html.find('.conteneur-name a').click(async event => {
|
html.find('.conteneur-name a').click(async event => {
|
||||||
RdDUtility.toggleAfficheContenu(RdDSheetUtility.getItemId(event));
|
RdDUtility.toggleAfficheContenu(RdDSheetUtility.getItemId(event));
|
||||||
@ -380,16 +394,14 @@ export class RdDActorSheet extends ActorSheet {
|
|||||||
this.actor.updateCompetenceStress(RdDSheetUtility.getItemId(event));
|
this.actor.updateCompetenceStress(RdDSheetUtility.getItemId(event));
|
||||||
});
|
});
|
||||||
|
|
||||||
if (this.options.editCaracComp) {
|
if (this.options.vueDetaillee) {
|
||||||
// On carac change
|
// On carac change
|
||||||
html.find('.carac-value').change(async event => {
|
html.find('.carac-value').change(async event => {
|
||||||
let caracName = event.currentTarget.name.replace(".value", "").replace("data.carac.", "");
|
let caracName = event.currentTarget.name.replace(".value", "").replace("system.carac.", "");
|
||||||
//console.log("Value changed :", event, caracName);
|
|
||||||
this.actor.updateCarac(caracName, parseInt(event.target.value));
|
this.actor.updateCarac(caracName, parseInt(event.target.value));
|
||||||
});
|
});
|
||||||
html.find('.carac-xp').change(async event => {
|
html.find('input.carac-xp').change(async event => {
|
||||||
let caracName = event.currentTarget.name.replace(".xp", "").replace("data.carac.", "");
|
let caracName = event.currentTarget.name.replace(".xp", "").replace("system.carac.", "");
|
||||||
//console.log("Value changed :", event, caracName);
|
|
||||||
this.actor.updateCaracXP(caracName, parseInt(event.target.value));
|
this.actor.updateCaracXP(caracName, parseInt(event.target.value));
|
||||||
});
|
});
|
||||||
// On competence change
|
// On competence change
|
||||||
@ -399,12 +411,12 @@ export class RdDActorSheet extends ActorSheet {
|
|||||||
this.actor.updateCompetence(compName, parseInt(event.target.value));
|
this.actor.updateCompetence(compName, parseInt(event.target.value));
|
||||||
});
|
});
|
||||||
// On competence xp change
|
// On competence xp change
|
||||||
html.find('.competence-xp').change(async event => {
|
html.find('input.competence-xp').change(async event => {
|
||||||
let compName = event.currentTarget.attributes.compname.value;
|
let compName = event.currentTarget.attributes.compname.value;
|
||||||
this.actor.updateCompetenceXP(compName, parseInt(event.target.value));
|
this.actor.updateCompetenceXP(compName, parseInt(event.target.value));
|
||||||
});
|
});
|
||||||
// On competence xp change
|
// On competence xp change
|
||||||
html.find('.competence-xp-sort').change(async event => {
|
html.find('input.competence-xp-sort').change(async event => {
|
||||||
let compName = event.currentTarget.attributes.compname.value;
|
let compName = event.currentTarget.attributes.compname.value;
|
||||||
this.actor.updateCompetenceXPSort(compName, parseInt(event.target.value));
|
this.actor.updateCompetenceXPSort(compName, parseInt(event.target.value));
|
||||||
});
|
});
|
||||||
@ -419,10 +431,6 @@ export class RdDActorSheet extends ActorSheet {
|
|||||||
this.options.showCompNiveauBase = !this.options.showCompNiveauBase;
|
this.options.showCompNiveauBase = !this.options.showCompNiveauBase;
|
||||||
this.render(true);
|
this.render(true);
|
||||||
});
|
});
|
||||||
html.find('.lock-unlock-sheet').click(async event => {
|
|
||||||
this.options.editCaracComp = !this.options.editCaracComp;
|
|
||||||
this.render(true);
|
|
||||||
});
|
|
||||||
|
|
||||||
html.find('.recherche')
|
html.find('.recherche')
|
||||||
.each((index, field) => {
|
.each((index, field) => {
|
||||||
@ -455,7 +463,7 @@ export class RdDActorSheet extends ActorSheet {
|
|||||||
// On pts de reve change
|
// On pts de reve change
|
||||||
html.find('.pointsreve-value').change(async event => {
|
html.find('.pointsreve-value').change(async event => {
|
||||||
let reveValue = event.currentTarget.value;
|
let reveValue = event.currentTarget.value;
|
||||||
this.actor.update({ "data.reve.reve.value": reveValue });
|
this.actor.update({ "system.reve.reve.value": reveValue });
|
||||||
});
|
});
|
||||||
|
|
||||||
// On seuil de reve change
|
// On seuil de reve change
|
||||||
@ -548,9 +556,9 @@ export class RdDActorSheet extends ActorSheet {
|
|||||||
const li = $(event.currentTarget)?.parents(".item");
|
const li = $(event.currentTarget)?.parents(".item");
|
||||||
let armeName = li.data("arme-name");
|
let armeName = li.data("arme-name");
|
||||||
let compName = li.data('competence-name');
|
let compName = li.data('competence-name');
|
||||||
const arme = this.armesList.find(a => a.name == armeName && a.data.competence == compName);
|
const arme = this.armesList.find(a => a.name == armeName && a.system.competence == compName);
|
||||||
if (!arme) {
|
if (!arme) {
|
||||||
return { name: armeName, data: { competence: compName } };
|
return { name: armeName, system: { competence: compName } };
|
||||||
}
|
}
|
||||||
return arme;
|
return arme;
|
||||||
}
|
}
|
||||||
@ -572,7 +580,7 @@ export class RdDActorSheet extends ActorSheet {
|
|||||||
/** @override */
|
/** @override */
|
||||||
_updateObject(event, formData) {
|
_updateObject(event, formData) {
|
||||||
// Update the Actor
|
// Update the Actor
|
||||||
return this.object.update(formData);
|
return this.actor.update(formData);
|
||||||
}
|
}
|
||||||
|
|
||||||
async splitItem(item) {
|
async splitItem(item) {
|
||||||
@ -581,11 +589,11 @@ export class RdDActorSheet extends ActorSheet {
|
|||||||
}
|
}
|
||||||
|
|
||||||
async _onSplitItem(item, split) {
|
async _onSplitItem(item, split) {
|
||||||
if (split >= 1 && split < Misc.data(item).data.quantite) {
|
if (split >= 1 && split < item.system.quantite) {
|
||||||
await item.diminuerQuantite(split);
|
await item.diminuerQuantite(split);
|
||||||
const itemData = duplicate(Misc.data(item));
|
const splitItem = duplicate(item);
|
||||||
itemData.data.quantite = split;
|
splitItem.system.quantite = split;
|
||||||
await this.actor.createEmbeddedDocuments('Item', [itemData])
|
await this.actor.createEmbeddedDocuments('Item', [splitItem])
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -27,24 +27,24 @@ export class RdDActorVehiculeSheet extends ActorSheet {
|
|||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
async getData() {
|
async getData() {
|
||||||
const objectData = Misc.data(this.object);
|
|
||||||
let formData = {
|
let formData = {
|
||||||
title: this.title,
|
title: this.title,
|
||||||
id: objectData.id,
|
id: this.actor.id,
|
||||||
type: objectData.type,
|
type: this.actor.type,
|
||||||
img: objectData.img,
|
img: this.actor.img,
|
||||||
name: objectData.name,
|
name: this.actor.name,
|
||||||
editable: this.isEditable,
|
editable: this.isEditable,
|
||||||
cssClass: this.isEditable ? "editable" : "locked",
|
cssClass: this.isEditable ? "editable" : "locked",
|
||||||
data: foundry.utils.deepClone(Misc.templateData(this.object)),
|
system: foundry.utils.deepClone(this.actor.system),
|
||||||
effects: this.object.effects.map(e => foundry.utils.deepClone(e.data)),
|
effects: this.actor.effects.map(e => foundry.utils.deepClone(e)),
|
||||||
limited: this.object.limited,
|
limited: this.actor.limited,
|
||||||
options: this.options,
|
options: this.options,
|
||||||
owner: this.document.isOwner,
|
owner: this.actor.isOwner,
|
||||||
itemsByType: Misc.classify(this.object.items.map(i => foundry.utils.deepClone(i.data))),
|
description: await TextEditor.enrichHTML(this.object.system.biographie, {async: true}),
|
||||||
|
notesmj: await TextEditor.enrichHTML(this.object.system.notesmj, {async: true}),
|
||||||
};
|
};
|
||||||
|
|
||||||
RdDUtility.filterItemsPerTypeForSheet(formData);
|
RdDUtility.filterItemsPerTypeForSheet(formData, this.actor.itemTypes);
|
||||||
this.objetVersConteneur = RdDUtility.buildArbreDeConteneurs(formData.conteneurs, formData.objets);
|
this.objetVersConteneur = RdDUtility.buildArbreDeConteneurs(formData.conteneurs, formData.objets);
|
||||||
formData.conteneurs = RdDUtility.conteneursRacine(formData.conteneurs);
|
formData.conteneurs = RdDUtility.conteneursRacine(formData.conteneurs);
|
||||||
|
|
||||||
@ -82,7 +82,7 @@ export class RdDActorVehiculeSheet extends ActorSheet {
|
|||||||
async monnaieIncDec(id, value) {
|
async monnaieIncDec(id, value) {
|
||||||
let monnaie = this.getMonnaie(id);
|
let monnaie = this.getMonnaie(id);
|
||||||
if (monnaie) {
|
if (monnaie) {
|
||||||
const quantite = Math.max(0, Misc.templateData(monnaie).quantite + value);
|
const quantite = Math.max(0, monnaie.system.quantite + value);
|
||||||
await this.updateEmbeddedDocuments('Item', [{ _id: monnaie.id, 'data.quantite': quantite }]);
|
await this.updateEmbeddedDocuments('Item', [{ _id: monnaie.id, 'data.quantite': quantite }]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -105,7 +105,8 @@ export class RdDActorVehiculeSheet extends ActorSheet {
|
|||||||
// Delete Inventory Item
|
// Delete Inventory Item
|
||||||
html.find('.item-delete').click(async event => {
|
html.find('.item-delete').click(async event => {
|
||||||
const li = RdDSheetUtility.getEventElement(event);
|
const li = RdDSheetUtility.getEventElement(event);
|
||||||
RdDUtility.confirmerSuppression(this, li);
|
const item = this.actor.getObjet(li.data("item-id"));
|
||||||
|
RdDUtility.confirmerSuppressionItem(this, item, li);
|
||||||
});
|
});
|
||||||
html.find('.item-vendre').click(async event => {
|
html.find('.item-vendre').click(async event => {
|
||||||
const item = RdDSheetUtility.getItem(event, this.actor);
|
const item = RdDSheetUtility.getItem(event, this.actor);
|
||||||
@ -160,6 +161,6 @@ export class RdDActorVehiculeSheet extends ActorSheet {
|
|||||||
/** @override */
|
/** @override */
|
||||||
_updateObject(event, formData) {
|
_updateObject(event, formData) {
|
||||||
// Update the Actor
|
// Update the Actor
|
||||||
return this.object.update(formData);
|
return this.actor.update(formData);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
1378
module/actor.js
1378
module/actor.js
File diff suppressed because it is too large
Load Diff
@ -1,7 +1,6 @@
|
|||||||
import { Misc } from "./misc.js";
|
import { Misc } from "./misc.js";
|
||||||
import { SYSTEM_RDD, SYSTEM_SOCKET_ID } from "./constants.js";
|
import { SYSTEM_RDD, SYSTEM_SOCKET_ID } from "./constants.js";
|
||||||
|
|
||||||
export const MESSAGE_DATA = 'message-data';
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Class providing helper methods to get the list of users, and
|
* Class providing helper methods to get the list of users, and
|
||||||
@ -19,61 +18,50 @@ export class ChatUtility {
|
|||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static notifyUser(userId, level = 'info', message) {
|
static notifyUser(userId, level = 'info', message) {
|
||||||
const data = {
|
const socketData = {
|
||||||
userId: userId, level: level, message: message
|
userId: userId, level: level, message: message
|
||||||
};
|
};
|
||||||
if (game.user.id == userId) {
|
if (game.user.id == userId) {
|
||||||
ChatUtility.onNotifyUser(data);
|
ChatUtility.onNotifyUser(socketData);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
game.socket.emit(SYSTEM_SOCKET_ID, {
|
game.socket.emit(SYSTEM_SOCKET_ID, {
|
||||||
msg: "msg_user_ui_notifications", data: data
|
msg: "msg_user_ui_notifications", data: socketData
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static onNotifyUser(data) {
|
static onNotifyUser(socketData) {
|
||||||
if (game.user.id == data.userId) {
|
if (game.user.id == socketData.userId) {
|
||||||
switch (data.level) {
|
switch (socketData.level) {
|
||||||
case 'warn': ui.notifications.warn(data.message); break;
|
case 'warn': ui.notifications.warn(socketData.message); break;
|
||||||
case 'error': ui.notifications.error(data.message); break;
|
case 'error': ui.notifications.error(socketData.message); break;
|
||||||
default: ui.notifications.info(data.message); break;
|
default: ui.notifications.info(socketData.message); break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static onRemoveMessages(data) {
|
static onRemoveMessages(socketData) {
|
||||||
if (Misc.isUniqueConnectedGM()) {
|
if (Misc.isUniqueConnectedGM()) {
|
||||||
if (data.part) {
|
if (socketData.part) {
|
||||||
const toDelete = game.messages.filter(it => it.data.content.includes(data.part));
|
const toDelete = game.messages.filter(it => it.content.includes(socketData.part));
|
||||||
toDelete.forEach(it => it.delete());
|
toDelete.forEach(it => it.delete());
|
||||||
}
|
}
|
||||||
if (data.messageId) {
|
if (socketData.messageId) {
|
||||||
game.messages.get(data.messageId)?.delete();
|
game.messages.get(socketData.messageId)?.delete();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static onRemoveMessages(data) {
|
|
||||||
if (Misc.isUniqueConnectedGM()) {
|
|
||||||
if (data.part) {
|
|
||||||
const toDelete = game.messages.filter(it => it.data.content.includes(data.part));
|
|
||||||
toDelete.forEach(it => it.delete());
|
|
||||||
}
|
|
||||||
if (data.messageId) {
|
|
||||||
game.messages.get(data.messageId)?.delete();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
|
|
||||||
static removeMessages(data) {
|
static removeMessages(socketData) {
|
||||||
if (Misc.isUniqueConnectedGM()) {
|
if (Misc.isUniqueConnectedGM()) {
|
||||||
ChatUtility.onRemoveMessages(data);
|
ChatUtility.onRemoveMessages(socketData);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
game.socket.emit(SYSTEM_SOCKET_ID, { msg: "msg_delete_chat_message", data: data });
|
game.socket.emit(SYSTEM_SOCKET_ID, { msg: "msg_delete_chat_message", data: socketData });
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -141,7 +129,7 @@ export class ChatUtility {
|
|||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static getUsers(filter) {
|
static getUsers(filter) {
|
||||||
return Misc.getUsers().filter(filter).map(user => user.data._id);
|
return Misc.getUsers().filter(filter).map(user => user.id);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
@ -154,17 +142,17 @@ export class ChatUtility {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static handleGMChatMessage(data) {
|
static handleGMChatMessage(socketData) {
|
||||||
console.log("blindMessageToGM", data);
|
console.log("blindMessageToGM", socketData);
|
||||||
if (game.user.isGM) { // message privé pour GM only
|
if (game.user.isGM) { // message privé pour GM only
|
||||||
data.user = game.user.id;
|
socketData.user = game.user.id;
|
||||||
ChatMessage.create(data);
|
ChatMessage.create(socketData);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static async setMessageData(chatMessage, key, data) {
|
static async setMessageData(chatMessage, key, flag) {
|
||||||
if (data) {
|
if (flag) {
|
||||||
await chatMessage.setFlag(SYSTEM_RDD, key, JSON.stringify(data));
|
await chatMessage.setFlag(SYSTEM_RDD, key, JSON.stringify(flag));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
export const SYSTEM_RDD = 'foundryvtt-reve-de-dragon';
|
export const SYSTEM_RDD = 'foundryvtt-reve-de-dragon';
|
||||||
export const SYSTEM_SOCKET_ID = 'system.foundryvtt-reve-de-dragon';
|
export const SYSTEM_SOCKET_ID = 'system.foundryvtt-reve-de-dragon';
|
||||||
|
export const LOG_HEAD = 'RdD | ';
|
||||||
|
|
||||||
export const HIDE_DICE = 'hide';
|
export const HIDE_DICE = 'hide';
|
||||||
export const SHOW_DICE = 'show';
|
export const SHOW_DICE = 'show';
|
||||||
|
@ -1,7 +1,6 @@
|
|||||||
import { ChatUtility } from "./chat-utility.js";
|
import { ChatUtility } from "./chat-utility.js";
|
||||||
import { HtmlUtility } from "./html-utility.js";
|
import { HtmlUtility } from "./html-utility.js";
|
||||||
import { RdDItemSigneDraconique } from "./item-signedraconique.js";
|
import { RdDItemSigneDraconique } from "./item-signedraconique.js";
|
||||||
import { Misc } from "./misc.js";
|
|
||||||
import { TMRUtility } from "./tmr-utility.js";
|
import { TMRUtility } from "./tmr-utility.js";
|
||||||
|
|
||||||
export class DialogCreateSigneDraconique extends Dialog {
|
export class DialogCreateSigneDraconique extends Dialog {
|
||||||
@ -10,12 +9,13 @@ export class DialogCreateSigneDraconique extends Dialog {
|
|||||||
const signe = await RdDItemSigneDraconique.randomSigneDraconique({ephemere: true});
|
const signe = await RdDItemSigneDraconique.randomSigneDraconique({ephemere: true});
|
||||||
let dialogData = {
|
let dialogData = {
|
||||||
signe: signe,
|
signe: signe,
|
||||||
tmrs: TMRUtility.listSelectedTMR(signe.data.typesTMR ?? []),
|
tmrs: TMRUtility.buildSelectionTypesTMR(signe.system.typesTMR),
|
||||||
actors: game.actors.filter(actor => actor.isHautRevant()).map(actor => {
|
actors: game.actors.filter(actor => actor.isPersonnage() && actor.isHautRevant())
|
||||||
let actorData = duplicate(Misc.data(actor));
|
.map(actor => ({
|
||||||
actorData.selected = actor.hasPlayerOwner;
|
id: actor.id,
|
||||||
return actorData;
|
name: actor.name,
|
||||||
})
|
selected: true
|
||||||
|
}))
|
||||||
};
|
};
|
||||||
|
|
||||||
const html = await renderTemplate("systems/foundryvtt-reve-de-dragon/templates/dialog-create-signedraconique.html", dialogData);
|
const html = await renderTemplate("systems/foundryvtt-reve-de-dragon/templates/dialog-create-signedraconique.html", dialogData);
|
||||||
@ -23,12 +23,11 @@ export class DialogCreateSigneDraconique extends Dialog {
|
|||||||
.render(true);
|
.render(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
constructor(dialogData, html, callback) {
|
constructor(dialogData, html) {
|
||||||
let options = { classes: ["DialogCreateSigneDraconiqueActorsActors"], width: 500, height: 650, 'z-index': 99999 };
|
let options = { classes: ["DialogCreateSigneDraconiqueActorsActors"], width: 500, height: 650, 'z-index': 99999 };
|
||||||
let conf = {
|
let conf = {
|
||||||
title: "Créer un signe",
|
title: "Créer un signe",
|
||||||
content: html,
|
content: html,
|
||||||
default: "Ajouter aux haut-rêvants",
|
|
||||||
buttons: {
|
buttons: {
|
||||||
"Ajouter aux haut-rêvants": { label: "Ajouter aux haut-rêvants", callback: it => { this._onCreerSigneActeurs(); } }
|
"Ajouter aux haut-rêvants": { label: "Ajouter aux haut-rêvants", callback: it => { this._onCreerSigneActeurs(); } }
|
||||||
}
|
}
|
||||||
@ -38,81 +37,91 @@ export class DialogCreateSigneDraconique extends Dialog {
|
|||||||
}
|
}
|
||||||
|
|
||||||
async _onCreerSigneActeurs() {
|
async _onCreerSigneActeurs() {
|
||||||
await $("[name='signe.data.ephemere']").change();
|
await $("[name='signe.system.ephemere']").change();
|
||||||
await $(".signe-xp-sort").change();
|
await $(".signe-xp-sort").change();
|
||||||
this.validerSigne();
|
this.validerSigne();
|
||||||
this.dialogData.actors.filter(it => it.selected).map(it => game.actors.get(it._id))
|
this.dialogData.actors.filter(it => it.selected)
|
||||||
|
.map(it => game.actors.get(it.id))
|
||||||
.forEach(actor => this._createSigneForActor(actor, this.dialogData.signe));
|
.forEach(actor => this._createSigneForActor(actor, this.dialogData.signe));
|
||||||
}
|
}
|
||||||
|
|
||||||
async _createSigneForActor(actor, signe) {
|
async _createSigneForActor(actor, signe) {
|
||||||
actor.createEmbeddedDocuments("Item", [signe]);
|
actor.createEmbeddedDocuments("Item", [signe]);
|
||||||
ChatMessage.create({
|
ChatMessage.create({
|
||||||
whisper: ChatUtility.getWhisperRecipientsAndGMs(Misc.data(actor).name),
|
whisper: ChatUtility.getWhisperRecipientsAndGMs(actor.name),
|
||||||
content: await renderTemplate("systems/foundryvtt-reve-de-dragon/templates/chat-signe-draconique-actor.html", {
|
content: await renderTemplate("systems/foundryvtt-reve-de-dragon/templates/chat-signe-draconique-actor.html", {
|
||||||
signe: signe,
|
signe: signe,
|
||||||
alias: Misc.data(actor).name
|
alias: actor.name
|
||||||
})
|
})
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
validerSigne() {
|
validerSigne() {
|
||||||
this.dialogData.signe.name = $("[name='signe.name']").val();
|
this.dialogData.signe.name = $("[name='signe.name']").val();
|
||||||
this.dialogData.signe.data.valeur.norm = $("[name='signe.data.valeur.norm']").val();
|
this.dialogData.signe.system.valeur.norm = $("[name='signe.system.valeur.norm']").val();
|
||||||
this.dialogData.signe.data.valeur.sign = $("[name='signe.data.valeur.sign']").val();
|
this.dialogData.signe.system.valeur.sign = $("[name='signe.system.valeur.sign']").val();
|
||||||
this.dialogData.signe.data.valeur.part = $("[name='signe.data.valeur.part']").val();
|
this.dialogData.signe.system.valeur.part = $("[name='signe.system.valeur.part']").val();
|
||||||
this.dialogData.signe.data.difficulte = $("[name='signe.data.difficulte']").val();
|
this.dialogData.signe.system.difficulte = $("[name='signe.system.difficulte']").val();
|
||||||
this.dialogData.signe.data.ephemere = $("[name='signe.data.ephemere']").prop("checked");
|
this.dialogData.signe.system.ephemere = $("[name='signe.system.ephemere']").prop("checked");
|
||||||
this.dialogData.signe.data.duree = $("[name='signe.data.duree']").val();
|
this.dialogData.signe.system.duree = $("[name='signe.system.duree']").val();
|
||||||
this.dialogData.signe.data.typesTMR = $(".select-tmr").val();
|
this.dialogData.signe.system.typesTMR = TMRUtility.buildListTypesTMRSelection(this.dialogData.tmrs);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
activateListeners(html) {
|
activateListeners(html) {
|
||||||
super.activateListeners(html);
|
super.activateListeners(html);
|
||||||
this.setEphemere(this.dialogData.signe.data.ephemere);
|
this.setEphemere(this.dialogData.signe.system.ephemere);
|
||||||
html.find(".signe-aleatoire").click(event => this.setSigneAleatoire());
|
html.find(".signe-aleatoire").click(event => this.setSigneAleatoire());
|
||||||
html.find("[name='signe.data.ephemere']").change((event) => this.setEphemere(event.currentTarget.checked));
|
html.find("[name='signe.system.ephemere']").change((event) => this.setEphemere(event.currentTarget.checked));
|
||||||
html.find(".select-actor").change((event) => this.onSelectActor(event));
|
|
||||||
html.find(".signe-xp-sort").change((event) => this.onValeurXpSort(event));
|
html.find(".signe-xp-sort").change((event) => this.onValeurXpSort(event));
|
||||||
|
html.find("input.select-actor").change((event) => this.onSelectActor(event));
|
||||||
|
html.find("input.select-tmr").change((event) => this.onSelectTmr(event));
|
||||||
}
|
}
|
||||||
|
|
||||||
async setSigneAleatoire() {
|
async setSigneAleatoire() {
|
||||||
const newSigne = await RdDItemSigneDraconique.randomSigneDraconique({ephemere: true});
|
const newSigne = await RdDItemSigneDraconique.randomSigneDraconique({ephemere: true});
|
||||||
|
|
||||||
$("[name='signe.name']").val(newSigne.name);
|
$("[name='signe.name']").val(newSigne.name);
|
||||||
$("[name='signe.data.valeur.norm']").val(newSigne.data.valeur.norm);
|
$("[name='signe.system.valeur.norm']").val(newSigne.system.valeur.norm);
|
||||||
$("[name='signe.data.valeur.sign']").val(newSigne.data.valeur.sign);
|
$("[name='signe.system.valeur.sign']").val(newSigne.system.valeur.sign);
|
||||||
$("[name='signe.data.valeur.part']").val(newSigne.data.valeur.part);
|
$("[name='signe.system.valeur.part']").val(newSigne.system.valeur.part);
|
||||||
$("[name='signe.data.difficulte']").val(newSigne.data.difficulte);
|
$("[name='signe.system.difficulte']").val(newSigne.system.difficulte);
|
||||||
$("[name='signe.data.duree']").val(newSigne.data.duree);
|
$("[name='signe.system.duree']").val(newSigne.system.duree);
|
||||||
$("[name='signe.data.ephemere']").prop("checked", newSigne.data.ephemere);
|
$("[name='signe.system.ephemere']").prop("checked", newSigne.system.ephemere);
|
||||||
$(".select-tmr").val(newSigne.data.typesTMR);
|
this.dialogData.tmrs = TMRUtility.buildSelectionTypesTMR(newSigne.system.typesTMR);
|
||||||
this.setEphemere(newSigne.data.ephemere);
|
this.dialogData.tmrs.forEach(t => {
|
||||||
|
$(`[data-tmr-name='${t.name}']`).prop( "checked", t.selected);
|
||||||
|
})
|
||||||
|
this.setEphemere(newSigne.system.ephemere);
|
||||||
}
|
}
|
||||||
|
|
||||||
async setEphemere(ephemere) {
|
async setEphemere(ephemere) {
|
||||||
this.dialogData.signe.data.ephemere = ephemere;
|
this.dialogData.signe.system.ephemere = ephemere;
|
||||||
HtmlUtility._showControlWhen($(".signe-data-duree"), ephemere);
|
HtmlUtility._showControlWhen($(".signe-system-duree"), ephemere);
|
||||||
}
|
}
|
||||||
|
|
||||||
async onSelectActor(event) {
|
async onSelectActor(event) {
|
||||||
event.preventDefault();
|
const actorId = $(event.currentTarget)?.data("actor-id");
|
||||||
const options = event.currentTarget.options;
|
const actor = this.dialogData.actors.find(it => it.id == actorId);
|
||||||
for (var i = 0; i < options.length; i++) { // looping over the options
|
if (actor) {
|
||||||
const actorId = options[i].attributes["data-actor-id"].value;
|
actor.selected = event.currentTarget.checked;
|
||||||
const actor = this.dialogData.actors.find(it => it._id == actorId);
|
}
|
||||||
if (actor) {
|
|
||||||
actor.selected = options[i].selected;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
onSelectTmr(event) {
|
||||||
|
const tmrName = $(event.currentTarget)?.data("tmr-name");
|
||||||
|
const onTmr = this.tmrs.find(it => it.name == tmrName);
|
||||||
|
if (onTmr){
|
||||||
|
onTmr.selected = event.currentTarget.checked;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
onValeurXpSort(event) {
|
onValeurXpSort(event) {
|
||||||
const codeReussite = event.currentTarget.attributes['data-typereussite']?.value ?? 0;
|
const codeReussite = event.currentTarget.attributes['data-typereussite']?.value ?? 0;
|
||||||
const xp = Number(event.currentTarget.value);
|
const xp = Number(event.currentTarget.value);
|
||||||
const oldValeur = this.dialogData.signe.data.valeur;
|
const oldValeur = this.dialogData.signe.system.valeur;
|
||||||
this.dialogData.signe.data.valeur = RdDItemSigneDraconique.calculValeursXpSort(codeReussite, xp, oldValeur);
|
this.dialogData.signe.system.valeur = RdDItemSigneDraconique.calculValeursXpSort(codeReussite, xp, oldValeur);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
@ -6,10 +6,15 @@ export class DialogFabriquerPotion extends Dialog {
|
|||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static async create(actor, item, dialogConfig) {
|
static async create(actor, item, dialogConfig) {
|
||||||
|
const min = DialogFabriquerPotion.nombreBrinsMinimum(item);
|
||||||
|
if (item.system.quantite < min) {
|
||||||
|
ui.notifications.warn(`Vous avez ${item.system.quantite} brins de ${item.name}, il en faut au moins ${min} pour faire une potion!`);
|
||||||
|
return;
|
||||||
|
}
|
||||||
let potionData = DialogFabriquerPotion.prepareData(actor, item);
|
let potionData = DialogFabriquerPotion.prepareData(actor, item);
|
||||||
|
|
||||||
let conf = {
|
let conf = {
|
||||||
title: `Fabriquer une potion de ${potionData.data.categorie}`,
|
title: `Fabriquer une potion de ${potionData.system.categorie}`,
|
||||||
content: await renderTemplate(dialogConfig.html, potionData),
|
content: await renderTemplate(dialogConfig.html, potionData),
|
||||||
default: potionData.buttonName,
|
default: potionData.buttonName,
|
||||||
};
|
};
|
||||||
@ -24,9 +29,12 @@ export class DialogFabriquerPotion extends Dialog {
|
|||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static prepareData(actor, item) {
|
static prepareData(actor, item) {
|
||||||
let potionData = duplicate(Misc.data(item));
|
let potionData = duplicate(item)
|
||||||
potionData.nbBrinsSelect = RdDUtility.buildListOptions(1, potionData.data.quantite);
|
potionData.nbBrinsSelect = RdDUtility.buildListOptions(
|
||||||
potionData.nbBrins = Math.min(potionData.data.quantite, DialogFabriquerPotion.getNombreBrinOptimal(potionData));
|
DialogFabriquerPotion.nombreBrinsMinimum(item),
|
||||||
|
DialogFabriquerPotion.nombreBrinsOptimal(item));
|
||||||
|
potionData.nbBrins = Math.min(potionData.system.quantite, DialogFabriquerPotion.nombreBrinsOptimal(potionData));
|
||||||
|
potionData.herbebonus = item.system.niveau;
|
||||||
potionData.buttonName = "Fabriquer";
|
potionData.buttonName = "Fabriquer";
|
||||||
return potionData;
|
return potionData;
|
||||||
}
|
}
|
||||||
@ -45,10 +53,18 @@ export class DialogFabriquerPotion extends Dialog {
|
|||||||
this.potionData = potionData;
|
this.potionData = potionData;
|
||||||
}
|
}
|
||||||
|
|
||||||
static getNombreBrinOptimal(herbeData) {
|
static nombreBrinsMinimum(herbeData) {
|
||||||
switch (herbeData.data.categorie ?? '') {
|
switch (herbeData.system.categorie ?? '') {
|
||||||
case "Soin": return 12 - herbeData.data.niveau;
|
case "Soin": return 1 + Math.max(0, 12 - 2 * herbeData.system.niveau);
|
||||||
case "Repos": return 7 - herbeData.data.niveau;
|
case "Repos": return 1 + Math.max(0, 7 - 2 * herbeData.system.niveau);
|
||||||
|
}
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static nombreBrinsOptimal(herbeData) {
|
||||||
|
switch (herbeData.system.categorie ?? '') {
|
||||||
|
case "Soin": return 12 - herbeData.system.niveau;
|
||||||
|
case "Repos": return 7 - herbeData.system.niveau;
|
||||||
}
|
}
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
@ -59,6 +75,8 @@ export class DialogFabriquerPotion extends Dialog {
|
|||||||
|
|
||||||
html.find("#nbBrins").change(event => {
|
html.find("#nbBrins").change(event => {
|
||||||
this.potionData.nbBrins = Misc.toInt(event.currentTarget.value);
|
this.potionData.nbBrins = Misc.toInt(event.currentTarget.value);
|
||||||
|
const brinsManquants = Math.max(0, DialogFabriquerPotion.nombreBrinsOptimal(this.potionData) - this.potionData.nbBrins);
|
||||||
|
this.potionData.herbebonus = Math.max(0, this.potionData.system.niveau - brinsManquants)
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -34,12 +34,12 @@ export class DialogItemAchat extends Dialog {
|
|||||||
const actionAchat = venteData.prixLot > 0 ? "Acheter" : "Prendre";
|
const actionAchat = venteData.prixLot > 0 ? "Acheter" : "Prendre";
|
||||||
const buttons = {};
|
const buttons = {};
|
||||||
if (isConsommable) {
|
if (isConsommable) {
|
||||||
buttons["consommer"] = { label: venteData.item.data.boisson ? "Boire" : "Manger", callback: it => { this.onAchatConsommer(); } }
|
buttons["consommer"] = { label: venteData.item.system.boisson ? "Boire" : "Manger", callback: it => { this.onAchatConsommer(); } }
|
||||||
}
|
}
|
||||||
buttons[actionAchat] = { label: actionAchat, callback: it => { this.onAchat(); } };
|
buttons[actionAchat] = { label: actionAchat, callback: it => { this.onAchat(); } };
|
||||||
buttons["decliner"] = { label: "Décliner", callback: it => { } };
|
buttons["decliner"] = { label: "Décliner", callback: it => { } };
|
||||||
let conf = {
|
let conf = {
|
||||||
title: venteData.acheteur? venteData.acheteur.name + " - " + actionAchat : actionAchat,
|
title: venteData.acheteur ? venteData.acheteur.name + " - " + actionAchat : actionAchat,
|
||||||
content: html,
|
content: html,
|
||||||
default: actionAchat,
|
default: actionAchat,
|
||||||
buttons: buttons
|
buttons: buttons
|
||||||
@ -56,11 +56,11 @@ export class DialogItemAchat extends Dialog {
|
|||||||
static prepareVenteData(buttonAcheter, vendeurId, vendeur, acheteur) {
|
static prepareVenteData(buttonAcheter, vendeurId, vendeur, acheteur) {
|
||||||
const jsondata = buttonAcheter.attributes['data-jsondata']?.value;
|
const jsondata = buttonAcheter.attributes['data-jsondata']?.value;
|
||||||
const prixLot = parseInt(buttonAcheter.attributes['data-prixLot']?.value ?? 0);
|
const prixLot = parseInt(buttonAcheter.attributes['data-prixLot']?.value ?? 0);
|
||||||
let venteData = {
|
return {
|
||||||
item: JSON.parse(jsondata),
|
item: JSON.parse(jsondata),
|
||||||
vendeurId: vendeurId,
|
vendeurId: vendeurId,
|
||||||
vendeur: Misc.data(vendeur),
|
vendeur: vendeur,
|
||||||
acheteur: Misc.data(acheteur),
|
acheteur: acheteur,
|
||||||
tailleLot: parseInt(buttonAcheter.attributes['data-tailleLot']?.value ?? 1),
|
tailleLot: parseInt(buttonAcheter.attributes['data-tailleLot']?.value ?? 1),
|
||||||
quantiteIllimite: buttonAcheter.attributes['data-quantiteIllimite']?.value == 'true',
|
quantiteIllimite: buttonAcheter.attributes['data-quantiteIllimite']?.value == 'true',
|
||||||
quantiteNbLots: parseInt(buttonAcheter.attributes['data-quantiteNbLots']?.value),
|
quantiteNbLots: parseInt(buttonAcheter.attributes['data-quantiteNbLots']?.value),
|
||||||
@ -73,7 +73,6 @@ export class DialogItemAchat extends Dialog {
|
|||||||
prixTotal: prixLot,
|
prixTotal: prixLot,
|
||||||
isVente: prixLot > 0
|
isVente: prixLot > 0
|
||||||
};
|
};
|
||||||
return venteData;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
async onAchat() {
|
async onAchat() {
|
||||||
@ -87,7 +86,7 @@ export class DialogItemAchat extends Dialog {
|
|||||||
choix: this.venteData.choix
|
choix: this.venteData.choix
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
async onAchatConsommer() {
|
async onAchatConsommer() {
|
||||||
this.venteData.choix.consommer = true;
|
this.venteData.choix.consommer = true;
|
||||||
await this.onAchat();
|
await this.onAchat();
|
||||||
@ -106,8 +105,12 @@ export class DialogItemAchat extends Dialog {
|
|||||||
}
|
}
|
||||||
|
|
||||||
setNombreLots(nombreLots) {
|
setNombreLots(nombreLots) {
|
||||||
this.venteData.choix.nombreLots = nombreLots;
|
if (nombreLots > this.venteData.quantiteNbLots) {
|
||||||
|
ui.notifications.warn(`Seulement ${this.venteData.quantiteNbLots} lots disponibles, vous ne pouvez pas en prendre ${nombreLots}`)
|
||||||
|
}
|
||||||
|
this.venteData.choix.nombreLots = Math.min(nombreLots, this.venteData.quantiteNbLots);
|
||||||
this.venteData.prixTotal = (nombreLots * this.venteData.prixLot).toFixed(2);
|
this.venteData.prixTotal = (nombreLots * this.venteData.prixLot).toFixed(2);
|
||||||
|
$(".nombreLots").val(this.venteData.choix.nombreLots);
|
||||||
$(".prixTotal").text(this.venteData.prixTotal);
|
$(".prixTotal").text(this.venteData.prixTotal);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -38,22 +38,22 @@ export class DialogConsommer extends Dialog {
|
|||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static prepareData(actor, item) {
|
static prepareData(actor, item) {
|
||||||
const itemData = duplicate(Misc.data(item));
|
item = duplicate(item);
|
||||||
let consommerData = {
|
let consommerData = {
|
||||||
item: itemData,
|
item: item,
|
||||||
cuisine: Misc.data(actor.getCompetence('cuisine')),
|
cuisine: actor.getCompetence('cuisine'),
|
||||||
choix: {
|
choix: {
|
||||||
doses: 1,
|
doses: 1,
|
||||||
seForcer: false,
|
seForcer: false,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
switch (itemData.type) {
|
switch (item.type) {
|
||||||
case 'nourritureboisson':
|
case 'nourritureboisson':
|
||||||
consommerData.title = itemData.data.boisson ? `${itemData.name}: boire une dose` : `${itemData.name}: manger une portion`;
|
consommerData.title = item.system.boisson ? `${item.name}: boire une dose` : `${item.name}: manger une portion`;
|
||||||
consommerData.buttonName = itemData.data.boisson ? "Boire" : "Manger";
|
consommerData.buttonName = item.system.boisson ? "Boire" : "Manger";
|
||||||
break;
|
break;
|
||||||
case 'potion':
|
case 'potion':
|
||||||
consommerData.title = `${itemData.name}: boire la potion`;
|
consommerData.title = `${item.name}: boire la potion`;
|
||||||
consommerData.buttonName = "Boire";
|
consommerData.buttonName = "Boire";
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -61,11 +61,11 @@ export class DialogConsommer extends Dialog {
|
|||||||
return consommerData;
|
return consommerData;
|
||||||
}
|
}
|
||||||
|
|
||||||
static calculDoses(consommerData) {
|
static calculDoses(consommer) {
|
||||||
const doses = consommerData.choix.doses;
|
const doses = consommer.choix.doses;
|
||||||
consommerData.totalSust = Misc.keepDecimals(doses * (consommerData.item.data.sust ?? 0), 2);
|
consommer.totalSust = Misc.keepDecimals(doses * (consommer.item.system.sust ?? 0), 2);
|
||||||
consommerData.totalDesaltere = consommerData.item.data.boisson
|
consommer.totalDesaltere = consommer.item.system.boisson
|
||||||
? Misc.keepDecimals(doses * (consommerData.item.data.desaltere ?? 0), 2)
|
? Misc.keepDecimals(doses * (consommer.item.system.desaltere ?? 0), 2)
|
||||||
: 0;
|
: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4,15 +4,14 @@ import { Misc } from "./misc.js";
|
|||||||
export class DialogItemVente extends Dialog {
|
export class DialogItemVente extends Dialog {
|
||||||
|
|
||||||
static async create(item, callback) {
|
static async create(item, callback) {
|
||||||
const itemData = Misc.data(item);
|
const quantite = item.isConteneur() ? 1 : item.system.quantite;
|
||||||
const quantite = item.isConteneur() ? 1 : itemData.data.quantite;
|
|
||||||
const venteData = {
|
const venteData = {
|
||||||
item: itemData,
|
item: item,
|
||||||
alias: item.actor?.name ?? game.user.name,
|
alias: item.actor?.name ?? game.user.name,
|
||||||
vendeurId: item.actor?.id,
|
vendeurId: item.actor?.id,
|
||||||
prixOrigine: itemData.data.cout,
|
prixOrigine: item.system.cout,
|
||||||
prixUnitaire: itemData.data.cout,
|
prixUnitaire: item.system.cout,
|
||||||
prixLot: itemData.data.cout,
|
prixLot: item.system.cout,
|
||||||
tailleLot: 1,
|
tailleLot: 1,
|
||||||
quantiteNbLots: quantite,
|
quantiteNbLots: quantite,
|
||||||
quantiteMaxLots: quantite,
|
quantiteMaxLots: quantite,
|
||||||
|
@ -3,7 +3,7 @@ import { Misc } from "./misc.js";
|
|||||||
export class DialogRepos extends Dialog {
|
export class DialogRepos extends Dialog {
|
||||||
|
|
||||||
static async create(actor) {
|
static async create(actor) {
|
||||||
let actorData = Misc.data(actor)
|
let actorData = actor
|
||||||
const html = await renderTemplate("systems/foundryvtt-reve-de-dragon/templates/dialog-repos.html", actorData);
|
const html = await renderTemplate("systems/foundryvtt-reve-de-dragon/templates/dialog-repos.html", actorData);
|
||||||
new DialogRepos(html, actor).render(true);
|
new DialogRepos(html, actor).render(true);
|
||||||
}
|
}
|
||||||
|
@ -3,10 +3,9 @@ import { Misc } from "./misc.js";
|
|||||||
export class DialogSplitItem extends Dialog {
|
export class DialogSplitItem extends Dialog {
|
||||||
|
|
||||||
static async create(item, callback) {
|
static async create(item, callback) {
|
||||||
const itemData = Misc.data(item);
|
|
||||||
const splitData = {
|
const splitData = {
|
||||||
item: itemData,
|
item: item,
|
||||||
choix: { quantite: 1, max: itemData.data.quantite - 1 }
|
choix: { quantite: 1, max: item.system.quantite - 1 }
|
||||||
};
|
};
|
||||||
const html = await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/dialog-item-split.html`, splitData);
|
const html = await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/dialog-item-split.html`, splitData);
|
||||||
return new DialogSplitItem(item, splitData, html, callback)
|
return new DialogSplitItem(item, splitData, html, callback)
|
||||||
|
@ -1,18 +1,19 @@
|
|||||||
import { Misc } from "./misc.js";
|
import { RdDSheetUtility } from "./rdd-sheet-utility.js";
|
||||||
|
|
||||||
export class DialogStress extends Dialog {
|
export class DialogStress extends Dialog {
|
||||||
|
|
||||||
static async distribuerStress() {
|
static async distribuerStress() {
|
||||||
let dialogData = {
|
const dialogData = {
|
||||||
motif: "Motif",
|
motif: "Motif",
|
||||||
stress: 10,
|
stress: 10,
|
||||||
immediat: false,
|
immediat: false,
|
||||||
actors: game.actors.filter(actor => actor.hasPlayerOwner && actor.isPersonnage())
|
actors: game.actors.filter(actor => actor.hasPlayerOwner && actor.isPersonnage())
|
||||||
.map(actor => {
|
.map(actor => ({
|
||||||
let actorData = duplicate(Misc.data(actor));
|
id: actor.id,
|
||||||
actorData.selected = actor.hasPlayerOwner;
|
name: actor.name,
|
||||||
return actorData;
|
selected: true
|
||||||
})
|
})
|
||||||
|
)
|
||||||
};
|
};
|
||||||
|
|
||||||
const html = await renderTemplate("systems/foundryvtt-reve-de-dragon/templates/dialog-stress.html", dialogData);
|
const html = await renderTemplate("systems/foundryvtt-reve-de-dragon/templates/dialog-stress.html", dialogData);
|
||||||
@ -21,52 +22,44 @@ export class DialogStress extends Dialog {
|
|||||||
}
|
}
|
||||||
|
|
||||||
constructor(dialogData, html) {
|
constructor(dialogData, html) {
|
||||||
let options = { classes: ["DialogStress"], width: 400, height: 320, 'z-index': 99999 };
|
const options = { classes: ["DialogStress"],
|
||||||
let conf = {
|
width: 400,
|
||||||
|
height: 205+dialogData.actors.length*25,
|
||||||
|
'z-index': 99999
|
||||||
|
};
|
||||||
|
const conf = {
|
||||||
title: "Donner du stress",
|
title: "Donner du stress",
|
||||||
content: html,
|
content: html,
|
||||||
buttons: {
|
buttons: {
|
||||||
"Stress": { label: "Stress !", callback: it => { this._onStress(); } }
|
stress: { label: "Stress !", callback: it => { this.onStress(); } }
|
||||||
}
|
},
|
||||||
|
default: "stress"
|
||||||
};
|
};
|
||||||
super(conf, options);
|
super(conf, options);
|
||||||
this.dialogData = dialogData;
|
this.dialogData = dialogData;
|
||||||
}
|
}
|
||||||
|
|
||||||
async _onStress() {
|
async onStress() {
|
||||||
this.validerStress();
|
const motif = $("form.rdddialogstress input[name='motif']").val();
|
||||||
const compteur = this.dialogData.immediat ? 'experience' : 'stress';
|
const stress = Number($("form.rdddialogstress input[name='stress']").val());
|
||||||
const stress = this.dialogData.stress;
|
const compteur = ($("form.rdddialogstress input[name='immediat']").prop("checked")) ? 'experience' : 'stress';
|
||||||
const motif = this.dialogData.motif;
|
|
||||||
|
|
||||||
this.dialogData.actors.filter(it => it.selected)
|
this.dialogData.actors.filter(it => it.selected)
|
||||||
.map(it => game.actors.get(it._id))
|
.map(it => game.actors.get(it.id))
|
||||||
.forEach(actor => actor.distribuerStress(compteur, stress, motif));
|
.forEach(actor => actor.distribuerStress(compteur, stress, motif));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
validerStress() {
|
|
||||||
this.dialogData.motif = $("form.rdddialogstress input[name='motif']").val();
|
|
||||||
this.dialogData.stress = $("form.rdddialogstress input[name='stress']").val();
|
|
||||||
this.dialogData.immediat = $("form.rdddialogstress input[name='immediat']").prop("checked");;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
activateListeners(html) {
|
activateListeners(html) {
|
||||||
super.activateListeners(html);
|
super.activateListeners(html);
|
||||||
html.find(".select-actor").change((event) => this.onSelectActor(event));
|
html.find("input.select-actor").change((event) => this.onSelectActor(event));
|
||||||
}
|
}
|
||||||
|
|
||||||
async onSelectActor(event) {
|
async onSelectActor(event) {
|
||||||
event.preventDefault();
|
const actorId = $(event.currentTarget)?.data("actor-id");
|
||||||
const options = event.currentTarget.options;
|
const actor = this.dialogData.actors.find(it => it.id == actorId);
|
||||||
for (var i = 0; i < options.length; i++) { // looping over the options
|
if (actor) {
|
||||||
const actorId = options[i].attributes["data-actor-id"].value;
|
actor.selected = event.currentTarget.checked;
|
||||||
const actor = this.dialogData.actors.find(it => it._id == actorId);
|
}
|
||||||
if (actor) {
|
|
||||||
actor.selected = options[i].selected;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
@ -1,9 +0,0 @@
|
|||||||
/* -------------------------------------------- */
|
|
||||||
import { RdDUtility } from "./rdd-utility.js";
|
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
|
||||||
// Activate chat listeners defined
|
|
||||||
// Hooks.on('renderChatLog', (log, html, data) => {
|
|
||||||
// RdDUtility.chatListeners(html);
|
|
||||||
// });
|
|
||||||
|
|
@ -19,36 +19,34 @@ const nomCategorieParade = {
|
|||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
export class RdDItemArme extends Item {
|
export class RdDItemArme extends Item {
|
||||||
|
|
||||||
static isArme(itemData) {
|
static isArme(item) {
|
||||||
itemData = Misc.data(itemData);
|
return (item.type == 'competencecreature' && item.system.iscombat) || item.type == 'arme';
|
||||||
return (itemData.type == 'competencecreature' && itemData.data.iscombat) || itemData.type == 'arme';
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static getArmeData(armeData) {
|
static getArme(arme) {
|
||||||
armeData = Misc.data(armeData);
|
switch (arme ? arme.type : '') {
|
||||||
switch (armeData ? armeData.type : '') {
|
case 'arme': return arme;
|
||||||
case 'arme': return armeData;
|
|
||||||
case 'competencecreature':
|
case 'competencecreature':
|
||||||
return RdDItemCompetenceCreature.toActionArme(armeData);
|
return RdDItemCompetenceCreature.toActionArme(arme);
|
||||||
}
|
}
|
||||||
return RdDItemArme.mainsNues();
|
return RdDItemArme.mainsNues();
|
||||||
}
|
}
|
||||||
|
|
||||||
static computeNiveauArmes(armes, competences) {
|
static computeNiveauArmes(armes, competences) {
|
||||||
for (const arme of armes) {
|
for (const arme of armes) {
|
||||||
arme.data.niveau = RdDItemArme.niveauCompetenceArme(arme, competences);
|
arme.system.niveau = RdDItemArme.niveauCompetenceArme(arme, competences);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static niveauCompetenceArme(arme, competences) {
|
static niveauCompetenceArme(arme, competences) {
|
||||||
const compArme = competences.find(it => it.name == arme.data.competence);
|
const compArme = competences.find(it => it.name == arme.system.competence);
|
||||||
return compArme?.data.niveau ?? -8;
|
return compArme?.system.niveau ?? -8;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static getNomCategorieParade(arme) {
|
static getNomCategorieParade(arme) {
|
||||||
const categorie = arme?.data ? RdDItemArme.getCategorieParade(arme) : arme;
|
const categorie = arme?.system ? RdDItemArme.getCategorieParade(arme) : arme;
|
||||||
return nomCategorieParade[categorie];
|
return nomCategorieParade[categorie];
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -66,21 +64,20 @@ export class RdDItemArme extends Item {
|
|||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static getCategorieParade(armeData) {
|
static getCategorieParade(armeData) {
|
||||||
armeData = Misc.data(armeData);
|
if (armeData.system.categorie_parade) {
|
||||||
if (armeData.data.categorie_parade) {
|
return armeData.system.categorie_parade;
|
||||||
return armeData.data.categorie_parade;
|
|
||||||
}
|
}
|
||||||
// pour compatibilité avec des personnages existants
|
// pour compatibilité avec des personnages existants
|
||||||
if (armeData.type == 'competencecreature' || armeData.data.categorie == 'creature') {
|
if (armeData.type == 'competencecreature' || armeData.system.categorie == 'creature') {
|
||||||
return armeData.data.categorie_parade || (armeData.data.isparade ? 'armes-naturelles' : '');
|
return armeData.system.categorie_parade || (armeData.system.isparade ? 'armes-naturelles' : '');
|
||||||
}
|
}
|
||||||
if (!armeData.type.match(/arme|competencecreature/)) {
|
if (!armeData.type.match(/arme|competencecreature/)) {
|
||||||
return '';
|
return '';
|
||||||
}
|
}
|
||||||
if (armeData.data.competence == undefined) {
|
if (armeData.system.competence == undefined) {
|
||||||
return 'competencecreature';
|
return 'competencecreature';
|
||||||
}
|
}
|
||||||
let compname = armeData.data.competence.toLowerCase();
|
let compname = armeData.system.competence.toLowerCase();
|
||||||
if (compname.match(/^(dague de jet|javelot|fouet|arc|arbalête|fronde|hache de jet|fléau)$/)) return '';
|
if (compname.match(/^(dague de jet|javelot|fouet|arc|arbalête|fronde|hache de jet|fléau)$/)) return '';
|
||||||
|
|
||||||
if (compname.match('hache')) return 'haches';
|
if (compname.match('hache')) return 'haches';
|
||||||
@ -137,22 +134,21 @@ export class RdDItemArme extends Item {
|
|||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static armeUneOuDeuxMains(armeData, aUneMain) {
|
static armeUneOuDeuxMains(armeData, aUneMain) {
|
||||||
armeData = Misc.data(armeData);
|
if (armeData && !armeData.system.cac) {
|
||||||
if (armeData && !armeData.data.cac) {
|
armeData.system.unemain = armeData.system.unemain || !armeData.system.deuxmains;
|
||||||
armeData.data.unemain = armeData.data.unemain || !armeData.data.deuxmains;
|
const uneOuDeuxMains = armeData.system.unemain && armeData.system.deuxmains;
|
||||||
const uneOuDeuxMains = armeData.data.unemain && armeData.data.deuxmains;
|
const containsSlash = !Number.isInteger(armeData.system.dommages) && armeData.system.dommages.includes("/");
|
||||||
const containsSlash = !Number.isInteger(armeData.data.dommages) && armeData.data.dommages.includes("/");
|
|
||||||
if (containsSlash) { // Sanity check
|
if (containsSlash) { // Sanity check
|
||||||
armeData = duplicate(armeData);
|
armeData = duplicate(armeData);
|
||||||
|
|
||||||
const tableauDegats = armeData.data.dommages.split("/");
|
const tableauDegats = armeData.system.dommages.split("/");
|
||||||
if (aUneMain)
|
if (aUneMain)
|
||||||
armeData.data.dommagesReels = Number(tableauDegats[0]);
|
armeData.system.dommagesReels = Number(tableauDegats[0]);
|
||||||
else // 2 mains
|
else // 2 mains
|
||||||
armeData.data.dommagesReels = Number(tableauDegats[1]);
|
armeData.system.dommagesReels = Number(tableauDegats[1]);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
armeData.data.dommagesReels = Number(armeData.data.dommages);
|
armeData.system.dommagesReels = Number(armeData.system.dommages);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (uneOuDeuxMains != containsSlash) {
|
if (uneOuDeuxMains != containsSlash) {
|
||||||
@ -162,23 +158,22 @@ export class RdDItemArme extends Item {
|
|||||||
return armeData;
|
return armeData;
|
||||||
}
|
}
|
||||||
|
|
||||||
static isArmeUtilisable(itemData) {
|
static isArmeUtilisable(arme) {
|
||||||
itemData = Misc.data(itemData);
|
return arme.type == 'arme' && arme.system.equipe && (arme.system.resistance > 0 || arme.system.portee_courte > 0);
|
||||||
return itemData.type == 'arme' && itemData.data.equipe && (itemData.data.resistance > 0 || itemData.data.portee_courte > 0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static ajoutCorpsACorps(armes, competences, carac) {
|
static ajoutCorpsACorps(armes, competences, carac) {
|
||||||
let corpsACorps = competences.find(it => it.name == 'Corps à corps') ?? { data: { niveau: -6 } };
|
let corpsACorps = competences.find(it => it.name == 'Corps à corps') ?? { system: { niveau: -6 } };
|
||||||
let init = RdDCombatManager.calculInitiative(corpsACorps.data.niveau, carac['melee'].value);
|
let init = RdDCombatManager.calculInitiative(corpsACorps.system.niveau, carac['melee'].value);
|
||||||
armes.push(RdDItemArme.mainsNues({ niveau: corpsACorps.data.niveau, initiative: init }));
|
armes.push(RdDItemArme.mainsNues({ niveau: corpsACorps.system.niveau, initiative: init }));
|
||||||
//armes.push(RdDItemArme.empoignade({ niveau: corpsACorps.data.niveau, initiative: init }));
|
//armes.push(RdDItemArme.empoignade({ niveau: corpsACorps.system.niveau, initiative: init }));
|
||||||
}
|
}
|
||||||
|
|
||||||
static corpsACorps(actorData) {
|
static corpsACorps(mainsNuesActor) {
|
||||||
const corpsACorps = {
|
const corpsACorps = {
|
||||||
name: 'Corps à corps',
|
name: 'Corps à corps',
|
||||||
img: 'systems/foundryvtt-reve-de-dragon/icons/competence_corps_a_corps.webp',
|
img: 'systems/foundryvtt-reve-de-dragon/icons/competence_corps_a_corps.webp',
|
||||||
data: {
|
system: {
|
||||||
equipe: true,
|
equipe: true,
|
||||||
rapide: true,
|
rapide: true,
|
||||||
force: 0,
|
force: 0,
|
||||||
@ -189,24 +184,24 @@ export class RdDItemArme extends Item {
|
|||||||
categorie_parade: 'sans-armes'
|
categorie_parade: 'sans-armes'
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
mergeObject(corpsACorps.data, actorData ?? {}, { overwrite: false });
|
mergeObject(corpsACorps.system, mainsNuesActor ?? {}, { overwrite: false });
|
||||||
return corpsACorps;
|
return corpsACorps;
|
||||||
}
|
}
|
||||||
|
|
||||||
static mainsNues(actorData) {
|
static mainsNues(mainsNuesActor) {
|
||||||
const mainsNues = RdDItemArme.corpsACorps(actorData);
|
const mainsNues = RdDItemArme.corpsACorps(mainsNuesActor)
|
||||||
mainsNues.name = 'Mains nues';
|
mainsNues.name = 'Mains nues'
|
||||||
mainsNues.data.cac = 'pugilat';
|
mainsNues.system.cac = 'pugilat'
|
||||||
mainsNues.data.baseInit = 4;
|
mainsNues.system.baseInit = 4
|
||||||
return mainsNues;
|
return mainsNues;
|
||||||
}
|
}
|
||||||
|
|
||||||
static empoignade(actorData) {
|
static empoignade(mainsNuesActor) {
|
||||||
const empoignade = RdDItemArme.corpsACorps(actorData);
|
const empoignade = RdDItemArme.corpsACorps(mainsNuesActor)
|
||||||
empoignade.name = 'Empoignade';
|
empoignade.name = 'Empoignade'
|
||||||
empoignade.data.cac = 'empoignade';
|
empoignade.system.cac = 'empoignade'
|
||||||
empoignade.data.baseInit = 3;
|
empoignade.system.baseInit = 3
|
||||||
empoignade.data.mortalite = 'empoignade';
|
empoignade.system.mortalite = 'empoignade'
|
||||||
return empoignade;
|
return empoignade
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -76,10 +76,10 @@ export class RdDItemCompetence extends Item {
|
|||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static getCategorie(competence) {
|
static getCategorie(competence) {
|
||||||
return Misc.data(competence)?.data.categorie;
|
return competence?.system.categorie;
|
||||||
}
|
}
|
||||||
static isDraconic(competence) {
|
static isDraconic(competence) {
|
||||||
return Misc.data(competence)?.data.categorie == 'draconic';
|
return competence?.system.categorie == 'draconic';
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
@ -89,9 +89,9 @@ export class RdDItemCompetence extends Item {
|
|||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static isCompetenceArme(competence) {
|
static isCompetenceArme(competence) {
|
||||||
switch (Misc.templateData(competence).categorie) {
|
switch (competence.system.categorie) {
|
||||||
case 'melee':
|
case 'melee':
|
||||||
return Misc.data(competence).name != 'Esquive';
|
return competence.name != 'Esquive';
|
||||||
case 'tir':
|
case 'tir':
|
||||||
case 'lancer':
|
case 'lancer':
|
||||||
return true;
|
return true;
|
||||||
@ -101,15 +101,15 @@ export class RdDItemCompetence extends Item {
|
|||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static isArmeUneMain(competence) {
|
static isArmeUneMain(competence) {
|
||||||
return Misc.data(competence)?.name.toLowerCase().includes("1 main");
|
return competence.name.toLowerCase().includes("1 main");
|
||||||
}
|
}
|
||||||
static isArme2Main(competence) {
|
static isArme2Main(competence) {
|
||||||
return Misc.data(competence)?.name.toLowerCase().includes("2 main");
|
return competence.name.toLowerCase().includes("2 main");
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static isMalusEncombrementTotal(competence) {
|
static isMalusEncombrementTotal(competence) {
|
||||||
return Misc.data(competence)?.name.toLowerCase().match(/(natation|acrobatie)/);
|
return competence?.name.toLowerCase().match(/(natation|acrobatie)/) || 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
@ -133,11 +133,10 @@ export class RdDItemCompetence extends Item {
|
|||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static computeXP(competence) {
|
static computeXP(competence) {
|
||||||
const itemData = Misc.data(competence);
|
const factor = competence.name.includes('Thanatos') ? 2 : 1; // Thanatos compte double !
|
||||||
const factor = itemData.name.includes('Thanatos') ? 2 : 1; // Thanatos compte double !
|
const xpNiveau = RdDItemCompetence.computeDeltaXP(competence.system.base, competence.system.niveau ?? competence.system.base);
|
||||||
const xpNiveau = RdDItemCompetence.computeDeltaXP(itemData.data.base, itemData.data.niveau ?? itemData.data.base);
|
const xp = competence.system.xp ?? 0;
|
||||||
const xp = itemData.data.xp ?? 0;
|
const xpSort = competence.system.xp_sort ?? 0;
|
||||||
const xpSort = itemData.data.xp_sort ?? 0;
|
|
||||||
return factor * (xpNiveau + xp) + xpSort;
|
return factor * (xpNiveau + xp) + xpSort;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -146,7 +145,7 @@ export class RdDItemCompetence extends Item {
|
|||||||
return competenceTroncs.map(
|
return competenceTroncs.map(
|
||||||
list => list.map(name => RdDItemCompetence.findCompetence(competences, name))
|
list => list.map(name => RdDItemCompetence.findCompetence(competences, name))
|
||||||
// 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?.data.base ?? -11, Math.min(it?.data.niveau ?? -11, 0)))
|
.map(it => RdDItemCompetence.computeDeltaXP(it?.system.base ?? -11, Math.min(it?.system.niveau ?? -11, 0)))
|
||||||
.sort(Misc.ascending())
|
.sort(Misc.ascending())
|
||||||
.splice(0, list.length - 1) // prendre toutes les valeurs sauf l'une des plus élevées
|
.splice(0, list.length - 1) // prendre toutes les valeurs sauf l'une des plus élevées
|
||||||
.reduce(Misc.sum(), 0)
|
.reduce(Misc.sum(), 0)
|
||||||
@ -162,11 +161,10 @@ export class RdDItemCompetence extends Item {
|
|||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static computeCompetenceXPCost(competence) {
|
static computeCompetenceXPCost(competence) {
|
||||||
const compData = Misc.data(competence);
|
let xp = RdDItemCompetence.getDeltaXp(competence.system.base, competence.system.niveau ?? competence.system.base);
|
||||||
let xp = RdDItemCompetence.getDeltaXp(compData.data.base, compData.data.niveau ?? compData.data.base);
|
xp += competence.system.xp ?? 0;
|
||||||
xp += compData.data.xp ?? 0;
|
|
||||||
if (compData.name.includes('Thanatos')) xp *= 2; /// Thanatos compte double !
|
if (compData.name.includes('Thanatos')) xp *= 2; /// Thanatos compte double !
|
||||||
xp += compData.data.xp_sort ?? 0;
|
xp += competence.system.xp_sort ?? 0;
|
||||||
return xp;
|
return xp;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -175,39 +173,39 @@ export class RdDItemCompetence extends Item {
|
|||||||
let economie = 0;
|
let economie = 0;
|
||||||
for (let troncList of competenceTroncs) {
|
for (let troncList of competenceTroncs) {
|
||||||
let list = troncList.map(name => RdDItemCompetence.findCompetence(competences, name))
|
let list = troncList.map(name => RdDItemCompetence.findCompetence(competences, name))
|
||||||
.sort(Misc.descending(c => Misc.templateData(c).niveau)); // tri du plus haut au plus bas
|
.sort(Misc.descending(c => this.system.niveau)); // tri du plus haut au plus bas
|
||||||
list.splice(0, 1); // ignorer la plus élevée
|
list.splice(0, 1); // ignorer la plus élevée
|
||||||
list.map(c => Misc.templateData(c)).forEach(tplData => {
|
list.map(c => c).forEach(c => {
|
||||||
economie += RdDItemCompetence.getDeltaXp(tplData.base, Math.min(tplData.niveau, 0));
|
economie += RdDItemCompetence.getDeltaXp(c.system.base, Math.min(c.system.niveau, 0))
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
return economie;
|
return economie;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static levelUp(itemData, stressTransforme) {
|
static levelUp(item, stressTransforme) {
|
||||||
itemData.data.xpNext = RdDItemCompetence.getCompetenceNextXp(itemData.data.niveau);
|
item.system.xpNext = RdDItemCompetence.getCompetenceNextXp(item.system.niveau);
|
||||||
const xpManquant = itemData.data.xpNext - itemData.data.xp;
|
const xpManquant = item.system.xpNext - item.system.xp;
|
||||||
itemData.data.isLevelUp = xpManquant <= 0;
|
item.system.isLevelUp = xpManquant <= 0;
|
||||||
itemData.data.isStressLevelUp = (xpManquant > 0 && stressTransforme >= xpManquant && itemData.data.niveau < itemData.data.niveau_archetype);
|
item.system.isStressLevelUp = (xpManquant > 0 && stressTransforme >= xpManquant && item.system.niveau < item.system.niveau_archetype);
|
||||||
itemData.data.stressXpMax = 0;
|
item.system.stressXpMax = 0;
|
||||||
if (xpManquant > 0 && stressTransforme > 0 && itemData.data.niveau < itemData.data.niveau_archetype) {
|
if (xpManquant > 0 && stressTransforme > 0 && item.system.niveau < item.system.niveau_archetype) {
|
||||||
itemData.data.stressXpMax = Math.min(xpManquant , stressTransforme);
|
item.system.stressXpMax = Math.min(xpManquant , stressTransforme);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static isVisible(itemData) {
|
static isVisible(item) {
|
||||||
return Number(itemData.data.niveau) != RdDItemCompetence.getNiveauBase(itemData.data.categorie);
|
return Number(item.system.niveau) != RdDItemCompetence.getNiveauBase(item.system.categorie);
|
||||||
}
|
}
|
||||||
|
|
||||||
static nomContientTexte(itemData, texte) {
|
static nomContientTexte(item, texte) {
|
||||||
return Grammar.toLowerCaseNoAccent(itemData.name).includes(Grammar.toLowerCaseNoAccent(texte))
|
return Grammar.toLowerCaseNoAccent(item.name).includes(Grammar.toLowerCaseNoAccent(texte))
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static isNiveauBase(itemData) {
|
static isNiveauBase(item) {
|
||||||
return Number(itemData.data.niveau) == RdDItemCompetence.getNiveauBase(itemData.data.categorie);
|
return Number(item.system.niveau) == RdDItemCompetence.getNiveauBase(item.system.categorie);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
@ -260,7 +258,7 @@ export class RdDItemCompetence extends Item {
|
|||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static computeResumeArchetype(competences) {
|
static computeResumeArchetype(competences) {
|
||||||
const archetype = RdDItemCompetence.getLimitesArchetypes();
|
const archetype = RdDItemCompetence.getLimitesArchetypes();
|
||||||
competences.map(it => Math.max(0, Misc.templateData(it).niveau_archetype))
|
competences.map(it => Math.max(0, it.system.niveau_archetype))
|
||||||
.forEach(niveau => {
|
.forEach(niveau => {
|
||||||
archetype[niveau] = archetype[niveau] ?? { "niveau": niveau, "nombreMax": 0, "nombre": 0 };
|
archetype[niveau] = archetype[niveau] ?? { "niveau": niveau, "nombreMax": 0, "nombre": 0 };
|
||||||
archetype[niveau].nombre = (archetype[niveau]?.nombre ?? 0) + 1;
|
archetype[niveau].nombre = (archetype[niveau]?.nombre ?? 0) + 1;
|
||||||
|
@ -1,51 +1,53 @@
|
|||||||
import { Misc } from "./misc.js";
|
import { Misc } from "./misc.js";
|
||||||
|
import { RdDCombatManager } from "./rdd-combat.js";
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
export class RdDItemCompetenceCreature extends Item {
|
export class RdDItemCompetenceCreature extends Item {
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static setRollDataCreature(rollData) {
|
static setRollDataCreature(rollData) {
|
||||||
rollData.competence = Misc.data(rollData.competence);
|
rollData.competence = rollData.competence
|
||||||
rollData.carac = { "carac_creature": { label: rollData.competence.name, value: rollData.competence.data.carac_value } };
|
rollData.carac = { "carac_creature": { label: rollData.competence.name, value: rollData.competence.system.carac_value } }
|
||||||
rollData.competence.data.defaut_carac = "carac_creature"
|
rollData.competence.system.defaut_carac = "carac_creature"
|
||||||
rollData.competence.data.categorie = "creature"
|
rollData.competence.system.categorie = "creature"
|
||||||
rollData.selectedCarac = rollData.carac.carac_creature
|
rollData.selectedCarac = rollData.carac.carac_creature
|
||||||
if (rollData.competence.data.iscombat) {
|
if (rollData.competence.system.iscombat) {
|
||||||
rollData.arme = RdDItemCompetenceCreature.toActionArme(rollData.competence);
|
rollData.arme = RdDItemCompetenceCreature.toActionArme(rollData.competence);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static toActionArme(item) {
|
static toActionArme(competencecreature) {
|
||||||
if (RdDItemCompetenceCreature.isCompetenceAttaque(item)) {
|
if (RdDItemCompetenceCreature.isCompetenceAttaque(competencecreature)) {
|
||||||
// si c'est un Item compétence: cloner pour ne pas modifier la compétence
|
// si c'est un Item compétence: cloner pour ne pas modifier lma compétence
|
||||||
let arme = Misc.data( (item instanceof Item) ? item.clone(): item);
|
let arme = (competencecreature instanceof Item) ? competencecreature.clone(): competencecreature;
|
||||||
mergeObject(arme.data,
|
mergeObject(arme.system,
|
||||||
{
|
{
|
||||||
competence: arme.name,
|
competence: arme.name,
|
||||||
resistance: 100,
|
initiative: RdDCombatManager.calculInitiative(competencecreature.system.niveau, competencecreature.system.carac_value),
|
||||||
|
niveau: competencecreature.system.niveau,
|
||||||
equipe: true,
|
equipe: true,
|
||||||
dommagesReels: arme.data.dommages,
|
resistance: 100,
|
||||||
|
dommagesReels: arme.system.dommages,
|
||||||
penetration: 0,
|
penetration: 0,
|
||||||
force: 0,
|
force: 0,
|
||||||
rapide: true,
|
rapide: true,
|
||||||
|
cac: competencecreature.system.isnaturelle ? "naturelle" : "",
|
||||||
action: 'attaque'
|
action: 'attaque'
|
||||||
});
|
});
|
||||||
return arme;
|
return arme;
|
||||||
}
|
}
|
||||||
console.error("RdDItemCompetenceCreature.toActionArme(", item, ") : impossible de transformer l'Item en arme");
|
console.error("RdDItemCompetenceCreature.toActionArme(", competencecreature, ") : impossible de transformer l'Item en arme");
|
||||||
return undefined;
|
return undefined;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static isCompetenceAttaque(itemData) {
|
static isCompetenceAttaque(item) {
|
||||||
itemData = Misc.data(itemData);
|
return item.type == 'competencecreature' && item.system.iscombat;
|
||||||
return itemData.type == 'competencecreature' && itemData.data.iscombat;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static isCompetenceParade(itemData) {
|
static isCompetenceParade(item) {
|
||||||
itemData = Misc.data(itemData);
|
return item.type == 'competencecreature' && item.system.categorie_parade !== "";
|
||||||
return itemData.type == 'competencecreature' && itemData.data.isparade;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -3,7 +3,7 @@ export class RdDItemMeditation {
|
|||||||
static calculDifficulte(rollData) {
|
static calculDifficulte(rollData) {
|
||||||
if (rollData.meditation) {
|
if (rollData.meditation) {
|
||||||
// Malus permanent éventuel
|
// Malus permanent éventuel
|
||||||
let diff = rollData.meditation.data.malus ?? 0;
|
let diff = rollData.meditation.system.malus ?? 0;
|
||||||
if (!rollData.conditionMeditation.isHeure) diff -= 2;
|
if (!rollData.conditionMeditation.isHeure) diff -= 2;
|
||||||
if (!rollData.conditionMeditation.isVeture) diff -= 2;
|
if (!rollData.conditionMeditation.isVeture) diff -= 2;
|
||||||
if (!rollData.conditionMeditation.isComportement) diff -= 2;
|
if (!rollData.conditionMeditation.isComportement) diff -= 2;
|
||||||
|
@ -1,54 +1,58 @@
|
|||||||
import { Misc } from "./misc.js";
|
import { Misc } from "./misc.js";
|
||||||
|
import { LOG_HEAD, SYSTEM_RDD } from "./constants.js";
|
||||||
|
|
||||||
const monnaiesData = [
|
const MONNAIES_STANDARD = [
|
||||||
{
|
{
|
||||||
name: "Etain (1 denier)", type: 'monnaie',
|
name: "Etain (1 denier)", type: 'monnaie',
|
||||||
img: "systems/foundryvtt-reve-de-dragon/icons/objets/piece_etain_poisson.webp",
|
img: "systems/foundryvtt-reve-de-dragon/icons/objets/piece_etain_poisson.webp",
|
||||||
data: { quantite: 0, valeur_deniers: 1, encombrement: 0.001, description: "" }
|
system: { quantite: 0, valeur_deniers: 1, encombrement: 0.001, description: "" }
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "Bronze (10 deniers)", type: 'monnaie',
|
name: "Bronze (10 deniers)", type: 'monnaie',
|
||||||
img: "systems/foundryvtt-reve-de-dragon/icons/objets/piece_bronze_epees.webp",
|
img: "systems/foundryvtt-reve-de-dragon/icons/objets/piece_bronze_epees.webp",
|
||||||
data: { quantite: 0, valeur_deniers: 10, encombrement: 0.002, description: "" }
|
system: { quantite: 0, valeur_deniers: 10, encombrement: 0.002, description: "" }
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "Argent (1 sol)", type: 'monnaie',
|
name: "Argent (1 sol)", type: 'monnaie',
|
||||||
img: "systems/foundryvtt-reve-de-dragon/icons/objets/piece_argent_sol.webp",
|
img: "systems/foundryvtt-reve-de-dragon/icons/objets/piece_argent_sol.webp",
|
||||||
data: { quantite: 0, valeur_deniers: 100, encombrement: 0.003, description: "" }
|
system: { quantite: 0, valeur_deniers: 100, encombrement: 0.003, description: "" }
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "Or (10 sols)", type: 'monnaie',
|
name: "Or (10 sols)", type: 'monnaie',
|
||||||
img: "systems/foundryvtt-reve-de-dragon/icons/objets/piece_or_sol.webp",
|
img: "systems/foundryvtt-reve-de-dragon/icons/objets/piece_or_sol.webp",
|
||||||
data: { quantite: 0, valeur_deniers: 1000, encombrement: 0.004, description: "" }
|
system: { quantite: 0, valeur_deniers: 1000, encombrement: 0.004, description: "" }
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
const VALEURS_STANDARDS = MONNAIES_STANDARD.map(it =>it.system.valeur_deniers);
|
||||||
|
|
||||||
export class Monnaie {
|
export class Monnaie {
|
||||||
|
|
||||||
static isSystemMonnaie(item) {
|
static isSystemMonnaie(item, items) {
|
||||||
let present = monnaiesData.find(monnaie => monnaie.data.valeur_deniers == Misc.data(item)?.data?.valeur_deniers);
|
if (item.type == 'monnaie') {
|
||||||
return present;
|
const valeur = item.system.valeur_deniers;
|
||||||
|
if (VALEURS_STANDARDS.includes(valeur)) {
|
||||||
|
const monnaiesDeValeur = items.filter(it => it.type == 'monnaie' && it.system.valeur_deniers == valeur)
|
||||||
|
return monnaiesDeValeur.length<=1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
static monnaiesData() {
|
static monnaiesData() {
|
||||||
return monnaiesData;
|
return MONNAIES_STANDARD;
|
||||||
}
|
}
|
||||||
|
|
||||||
static filtrerMonnaies(items) {
|
static monnaiesManquantes(actor) {
|
||||||
return items.filter(it => Misc.data(it).type == 'monnaie');
|
const disponibles = actor.itemTypes['monnaie'];
|
||||||
|
const manquantes = MONNAIES_STANDARD.filter(standard => !disponibles.find(disponible => Monnaie.deValeur(disponible, standard.system?.valeur_deniers)));
|
||||||
|
if (manquantes.length > 0) {
|
||||||
|
console.error(`${LOG_HEAD} monnaiesManquantes pour ${actor.name}`, manquantes, ' avec monnaies', disponibles, MONNAIES_STANDARD);
|
||||||
|
}
|
||||||
|
return manquantes;
|
||||||
}
|
}
|
||||||
|
|
||||||
static monnaiesManquantes(items) {
|
static deValeur(monnaie, valeur) {
|
||||||
const valeurs = Monnaie.filtrerMonnaies(items)
|
return valeur == monnaie.system.valeur_deniers
|
||||||
.map(it => Misc.templateData(it).valeur_deniers);
|
|
||||||
const manquantes = monnaiesData.filter(monnaie => !valeurs.find(v => v != Misc.templateData(monnaie).valeur_deniers));
|
|
||||||
//const manquantes = monnaiesData.filter(monnaie => !valeurs.find(v => v != Misc.templateData(monnaie).valeur_deniers) );
|
|
||||||
//console.log("Valeurs : ", valeurs, manquantes);
|
|
||||||
return []; //manquantes;
|
|
||||||
}
|
|
||||||
|
|
||||||
static deValeur(monnaie, v) {
|
|
||||||
return v != monnaie.data.valeur_deniers;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static arrondiDeniers(sols) {
|
static arrondiDeniers(sols) {
|
||||||
@ -56,6 +60,6 @@ export class Monnaie {
|
|||||||
}
|
}
|
||||||
|
|
||||||
static triValeurDenier() {
|
static triValeurDenier() {
|
||||||
return Misc.ascending(item => Misc.data(item).data.valeur_deniers);
|
return Misc.ascending(item => item.system.valeur_deniers)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -32,7 +32,7 @@ export class RdDItemSheet extends ItemSheet {
|
|||||||
let buttons = super._getHeaderButtons();
|
let buttons = super._getHeaderButtons();
|
||||||
// Add "Post to chat" button
|
// Add "Post to chat" button
|
||||||
// We previously restricted this to GM and editable items only. If you ever find this comment because it broke something: eh, sorry!
|
// We previously restricted this to GM and editable items only. If you ever find this comment because it broke something: eh, sorry!
|
||||||
if ("cout" in Misc.templateData(this.object) && this.object.isVideOuNonConteneur()) {
|
if ("cout" in this.item.system && this.item.isVideOuNonConteneur()) {
|
||||||
buttons.unshift({
|
buttons.unshift({
|
||||||
class: "vendre",
|
class: "vendre",
|
||||||
icon: "fas fa-comments-dollar",
|
icon: "fas fa-comments-dollar",
|
||||||
@ -60,55 +60,70 @@ export class RdDItemSheet extends ItemSheet {
|
|||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
async getData() {
|
async getData() {
|
||||||
const objectData = Misc.data(this.object)
|
|
||||||
let formData = {
|
let formData = {
|
||||||
id: this.object.id,
|
id: this.item.id,
|
||||||
title: objectData.name,
|
title: this.item.name,
|
||||||
type: objectData.type,
|
type: this.item.type,
|
||||||
img: objectData.img,
|
img: this.item.img,
|
||||||
name: objectData.name,
|
name: this.item.name,
|
||||||
data: objectData.data,
|
system: this.item.system,
|
||||||
|
// TODO: v10 remove
|
||||||
|
data: this.item.system,
|
||||||
isGM: game.user.isGM,
|
isGM: game.user.isGM,
|
||||||
actorId: this.actor?.id,
|
actorId: this.actor?.id,
|
||||||
owner: this.document.isOwner,
|
owner: this.item.isOwner,
|
||||||
editable: this.isEditable,
|
editable: this.isEditable,
|
||||||
cssClass: this.isEditable ? "editable" : "locked",
|
cssClass: this.isEditable ? "editable" : "locked",
|
||||||
isSoins: false
|
isSoins: false,
|
||||||
|
description: await TextEditor.enrichHTML(this.object.system.description, {async: true}),
|
||||||
|
descriptionmj: await TextEditor.enrichHTML(this.object.system.descriptionmj, {async: true})
|
||||||
|
|
||||||
}
|
}
|
||||||
if (this.actor) {
|
if (this.actor) {
|
||||||
formData.isOwned = true;
|
formData.isOwned = true;
|
||||||
if (objectData.type == 'conteneur') {
|
if (this.item.type == 'conteneur') {
|
||||||
this.prepareConteneurData(formData);
|
this.prepareConteneurData(formData);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
formData.categorieCompetences = RdDItemCompetence.getCategorieCompetences()
|
formData.categorieCompetences = RdDItemCompetence.getCategorieCompetences()
|
||||||
if (formData.type == 'tache' || formData.type == 'livre' || formData.type == 'meditation' || formData.type == 'oeuvre') {
|
if (this.item.type == 'tache' || this.item.type == 'livre' || this.item.type == 'meditation' || this.item.type == 'oeuvre') {
|
||||||
formData.caracList = duplicate(game.system.model.Actor.personnage.carac)
|
formData.caracList = duplicate(game.system.model.Actor.personnage.carac)
|
||||||
formData.caracList["reve-actuel"] = duplicate(game.system.model.Actor.personnage.reve.reve)
|
formData.caracList["reve-actuel"] = duplicate(game.system.model.Actor.personnage.reve.reve)
|
||||||
formData.competences = await RdDUtility.loadCompendium('foundryvtt-reve-de-dragon.competences')
|
formData.competences = await RdDUtility.loadCompendium('foundryvtt-reve-de-dragon.competences')
|
||||||
}
|
}
|
||||||
if (formData.type == 'arme') {
|
if (this.item.type == 'arme') {
|
||||||
formData.competences = await RdDUtility.loadCompendium('foundryvtt-reve-de-dragon.competences', it => RdDItemCompetence.isCompetenceArme(it));
|
formData.competences = await RdDUtility.loadCompendium('foundryvtt-reve-de-dragon.competences', it => RdDItemCompetence.isCompetenceArme(it));
|
||||||
console.log(formData.competences)
|
console.log(formData.competences)
|
||||||
}
|
}
|
||||||
if (formData.type == 'recettealchimique') {
|
if (this.item.type == 'recettecuisine') {
|
||||||
RdDAlchimie.processManipulation(objectData, this.actor && this.actor.id);
|
formData.ingredients = await TextEditor.enrichHTML(this.object.system.ingredients, {async: true})
|
||||||
}
|
}
|
||||||
if (formData.type == 'gemme') {
|
if (this.item.type == 'recettealchimique') {
|
||||||
|
RdDAlchimie.processManipulation(this.item, this.actor && this.actor.id);
|
||||||
|
formData.manipulation_update = await TextEditor.enrichHTML(this.object.system.manipulation_update, {async: true})
|
||||||
|
formData.utilisation = await TextEditor.enrichHTML(this.object.system.utilisation, {async: true})
|
||||||
|
formData.enchantement = await TextEditor.enrichHTML(this.object.system.enchantement, {async: true})
|
||||||
|
formData.sureffet = await TextEditor.enrichHTML(this.object.system.sureffet, {async: true})
|
||||||
|
}
|
||||||
|
if (this.item.type == 'gemme') {
|
||||||
formData.gemmeTypeList = RdDGemme.getGemmeTypeOptionList();
|
formData.gemmeTypeList = RdDGemme.getGemmeTypeOptionList();
|
||||||
RdDGemme.calculDataDerivees(formData.data);
|
RdDGemme.calculDataDerivees(this.item);
|
||||||
}
|
}
|
||||||
if (formData.type == 'potion') {
|
if (this.item.type == 'potion') {
|
||||||
if (this.dateUpdated) {
|
if (this.dateUpdated) {
|
||||||
formData.data.prdate = this.dateUpdated;
|
formData.system.prdate = this.dateUpdated;
|
||||||
this.dateUpdated = undefined;
|
this.dateUpdated = undefined;
|
||||||
}
|
}
|
||||||
RdDHerbes.updatePotionData(formData);
|
RdDHerbes.updatePotionData(formData);
|
||||||
}
|
}
|
||||||
if (formData.isOwned && formData.type == 'herbe' && (formData.data.categorie == 'Soin' || formData.data.categorie == 'Repos')) {
|
if (formData.isOwned && this.item.type == 'herbe' && (formData.system.categorie == 'Soin' || formData.system.categorie == 'Repos')) {
|
||||||
formData.isIngredientPotionBase = true;
|
formData.isIngredientPotionBase = true;
|
||||||
}
|
}
|
||||||
|
if (this.item.type == 'sortreserve') {
|
||||||
|
const sortId = this.item.system.sortid;
|
||||||
|
formData.sort = formData.isOwned ? this.item.actor.items.get(sortId) : game.items.get(sortId);
|
||||||
|
}
|
||||||
formData.bonusCaseList = RdDItemSort.getBonusCaseList(formData, true);
|
formData.bonusCaseList = RdDItemSort.getBonusCaseList(formData, true);
|
||||||
|
|
||||||
return formData;
|
return formData;
|
||||||
@ -116,11 +131,10 @@ export class RdDItemSheet extends ItemSheet {
|
|||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
prepareConteneurData(formData) {
|
prepareConteneurData(formData) {
|
||||||
formData.itemsByType = Misc.classify(this.actor.items.map(i => foundry.utils.deepClone(i.data)));
|
RdDUtility.filterEquipementParType(formData, this.actor.itemTypes);
|
||||||
RdDUtility.filterEquipementParType(formData);
|
|
||||||
|
|
||||||
this.objetVersConteneur = RdDUtility.buildArbreDeConteneurs(formData.conteneurs, formData.objets);
|
this.objetVersConteneur = RdDUtility.buildArbreDeConteneurs(formData.conteneurs, formData.objets);
|
||||||
formData.subItems = formData.conteneurs.find(it => it._id == this.object.id)?.subItems;
|
formData.subItems = formData.conteneurs.find(it => it._id == this.item.id)?.subItems;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -129,15 +143,15 @@ export class RdDItemSheet extends ItemSheet {
|
|||||||
activateListeners(html) {
|
activateListeners(html) {
|
||||||
super.activateListeners(html);
|
super.activateListeners(html);
|
||||||
|
|
||||||
if (this.object.type == 'conteneur') {
|
if (this.item.type == 'conteneur') {
|
||||||
this.form.ondragstart = (event) => this._onDragStart(event);
|
this.form.ondragstart = (event) => this._onDragStart(event);
|
||||||
this.form.ondrop = (event) => this._onDrop(event);
|
this.form.ondrop = (event) => this._onDrop(event);
|
||||||
}
|
}
|
||||||
|
|
||||||
let itemSheetDialog = this;
|
let itemSheetDialog = this;
|
||||||
|
|
||||||
HtmlUtility._showControlWhen($(".item-cout"), ReglesOptionelles.isUsing('afficher-prix-joueurs') || game.user.isGM || !this.object.isOwned);
|
HtmlUtility._showControlWhen($(".item-cout"), ReglesOptionelles.isUsing('afficher-prix-joueurs') || game.user.isGM || !this.item.isOwned);
|
||||||
HtmlUtility._showControlWhen($(".item-magique"), this.object.isMagique());
|
HtmlUtility._showControlWhen($(".item-magique"), this.item.isMagique());
|
||||||
|
|
||||||
// Everything below here is only needed if the sheet is editable
|
// Everything below here is only needed if the sheet is editable
|
||||||
if (!this.options.editable) return;
|
if (!this.options.editable) return;
|
||||||
@ -146,8 +160,8 @@ export class RdDItemSheet extends ItemSheet {
|
|||||||
html.find(".categorie").change(event => this._onSelectCategorie(event));
|
html.find(".categorie").change(event => this._onSelectCategorie(event));
|
||||||
|
|
||||||
html.find('.sheet-competence-xp').change((event) => {
|
html.find('.sheet-competence-xp').change((event) => {
|
||||||
if (this.object.data.type == 'competence') {
|
if (this.item.type == 'competence') {
|
||||||
RdDUtility.checkThanatosXP(this.object.data.name);
|
RdDUtility.checkThanatosXP(this.item.name);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -182,7 +196,7 @@ export class RdDItemSheet extends ItemSheet {
|
|||||||
if (actor) {
|
if (actor) {
|
||||||
actor.effectuerTacheAlchimie(recetteId, tacheName, tacheData);
|
actor.effectuerTacheAlchimie(recetteId, tacheName, tacheData);
|
||||||
} else {
|
} else {
|
||||||
ui.notifications.info("Impossible trouver un actur pour réaliser cette tache Alchimique.");
|
ui.notifications.info("Impossible trouver un acteur pour réaliser cette tache Alchimique.");
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -196,7 +210,8 @@ export class RdDItemSheet extends ItemSheet {
|
|||||||
});
|
});
|
||||||
html.find('.item-delete').click(async event => {
|
html.find('.item-delete').click(async event => {
|
||||||
const li = RdDSheetUtility.getEventElement(event);
|
const li = RdDSheetUtility.getEventElement(event);
|
||||||
RdDUtility.confirmerSuppression(this, li);
|
const item = this.actor.getObjet(li.data("item-id"));
|
||||||
|
RdDUtility.confirmerSuppressionItem(this, item, li);
|
||||||
});
|
});
|
||||||
html.find('.item-vendre').click(async event => {
|
html.find('.item-vendre').click(async event => {
|
||||||
const item = RdDSheetUtility.getItem(event, this.actor);
|
const item = RdDSheetUtility.getItem(event, this.actor);
|
||||||
@ -220,16 +235,16 @@ export class RdDItemSheet extends ItemSheet {
|
|||||||
async _onSelectCategorie(event) {
|
async _onSelectCategorie(event) {
|
||||||
event.preventDefault();
|
event.preventDefault();
|
||||||
|
|
||||||
if (this.object.isCompetence()) {
|
if (this.item.isCompetence()) {
|
||||||
let level = RdDItemCompetence.getNiveauBase(event.currentTarget.value);
|
let level = RdDItemCompetence.getNiveauBase(event.currentTarget.value);
|
||||||
Misc.templateData(this.object).base = level;
|
this.item.system.base = level;
|
||||||
$("#base").val(level);
|
$("#base").val(level);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
get template() {
|
get template() {
|
||||||
let type = this.object.data.type;
|
let type = this.item.type
|
||||||
return `systems/foundryvtt-reve-de-dragon/templates/item-${type}-sheet.html`;
|
return `systems/foundryvtt-reve-de-dragon/templates/item-${type}-sheet.html`;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -240,7 +255,7 @@ export class RdDItemSheet extends ItemSheet {
|
|||||||
// Données de bonus de cases ?
|
// Données de bonus de cases ?
|
||||||
formData = RdDItemSort.buildBonusCaseStringFromFormData(formData);
|
formData = RdDItemSort.buildBonusCaseStringFromFormData(formData);
|
||||||
|
|
||||||
return this.object.update(formData);
|
return this.item.update(formData);
|
||||||
}
|
}
|
||||||
|
|
||||||
async _onDragStart(event) {
|
async _onDragStart(event) {
|
||||||
@ -253,28 +268,28 @@ export class RdDItemSheet extends ItemSheet {
|
|||||||
const dragData = {
|
const dragData = {
|
||||||
actorId: this.actor.id,
|
actorId: this.actor.id,
|
||||||
type: "Item",
|
type: "Item",
|
||||||
data: item.data
|
data: item.system
|
||||||
};
|
};
|
||||||
|
|
||||||
event.dataTransfer.setData("text/plain", JSON.stringify(dragData));
|
event.dataTransfer.setData("text/plain", JSON.stringify(dragData));
|
||||||
}
|
}
|
||||||
|
|
||||||
async _onDrop(event) {
|
async _onDrop(event) {
|
||||||
// Try to extract the data
|
// Try to extract the dragData
|
||||||
let data;
|
let dragData;
|
||||||
try {
|
try {
|
||||||
data = JSON.parse(event.dataTransfer.getData('text/plain'));
|
dragData = JSON.parse(event.dataTransfer.getData('text/plain'));
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
const allowed = Hooks.call("dropActorSheetData", this.actor, this, data);
|
const allowed = Hooks.call("dropActorSheetData", this.actor, this, dragData);
|
||||||
if (allowed === false) return;
|
if (allowed === false) return;
|
||||||
|
|
||||||
// Handle different data types
|
// Handle different dragData types
|
||||||
switch (data.type) {
|
switch (dragData.type) {
|
||||||
case "Item":
|
case "Item":
|
||||||
return this._onDropItem(event, data);
|
return this._onDropItem(event, dragData);
|
||||||
}
|
}
|
||||||
return super._onDrop(event);
|
return super._onDrop(event);
|
||||||
}
|
}
|
||||||
@ -282,7 +297,7 @@ export class RdDItemSheet extends ItemSheet {
|
|||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
async _onDropItem(event, dragData) {
|
async _onDropItem(event, dragData) {
|
||||||
if (this.actor) {
|
if (this.actor) {
|
||||||
const dropParams = RdDSheetUtility.prepareItemDropParameters(this.object.id, this.actor.id, dragData, this.objetVersConteneur);
|
const dropParams = RdDSheetUtility.prepareItemDropParameters(this.item.id, this.actor.id, dragData, this.objetVersConteneur);
|
||||||
await this.actor.processDropItem(dropParams);
|
await this.actor.processDropItem(dropParams);
|
||||||
await this.render(true);
|
await this.render(true);
|
||||||
}
|
}
|
||||||
|
@ -32,25 +32,25 @@ export class RdDSigneDraconiqueItemSheet extends ItemSheet {
|
|||||||
const position = super.setPosition(options);
|
const position = super.setPosition(options);
|
||||||
const sheetHeader = this.element.find(".sheet-header");
|
const sheetHeader = this.element.find(".sheet-header");
|
||||||
const sheetBody = this.element.find(".sheet-body");
|
const sheetBody = this.element.find(".sheet-body");
|
||||||
const bodyHeight = position.height - sheetHeader[0].clientHeight;
|
sheetBody.css("height", position.height - sheetHeader[0].clientHeight)
|
||||||
sheetBody.css("height", bodyHeight);
|
|
||||||
return position;
|
return position;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
async getData() {
|
async getData() {
|
||||||
const formData = duplicate(Misc.data(this.object));
|
const formData = duplicate(this.item);
|
||||||
|
this.tmrs = TMRUtility.buildSelectionTypesTMR(this.item.system.typesTMR);
|
||||||
mergeObject(formData, {
|
mergeObject(formData, {
|
||||||
|
tmrs: this.tmrs,
|
||||||
title: formData.name,
|
title: formData.name,
|
||||||
isGM: game.user.isGM,
|
isGM: game.user.isGM,
|
||||||
owner: this.document.isOwner,
|
owner: this.actor?.isOwner,
|
||||||
isOwned: this.actor ? true : false,
|
isOwned: this.actor ? true : false,
|
||||||
actorId: this.actor?.id,
|
actorId: this.actor?.id,
|
||||||
editable: this.isEditable,
|
editable: this.isEditable,
|
||||||
cssClass: this.isEditable ? "editable" : "locked",
|
cssClass: this.isEditable ? "editable" : "locked",
|
||||||
});
|
});
|
||||||
formData.tmrs = TMRUtility.listSelectedTMR(formData.data.typesTMR ?? []);
|
|
||||||
return formData;
|
return formData;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -62,27 +62,31 @@ export class RdDSigneDraconiqueItemSheet extends ItemSheet {
|
|||||||
if (!this.options.editable) return;
|
if (!this.options.editable) return;
|
||||||
|
|
||||||
html.find(".signe-aleatoire").click(event => this.setSigneAleatoire());
|
html.find(".signe-aleatoire").click(event => this.setSigneAleatoire());
|
||||||
html.find(".select-tmr").change((event) => this.onSelectTmr(event));
|
html.find("input.select-tmr").change((event) => this.onSelectTmr(event));
|
||||||
html.find(".signe-xp-sort").change((event) => this.onValeurXpSort(event.currentTarget.attributes['data-typereussite']?.value, Number(event.currentTarget.value)));
|
html.find(".signe-xp-sort").change((event) => this.onValeurXpSort(event.currentTarget.attributes['data-typereussite']?.value, Number(event.currentTarget.value)));
|
||||||
}
|
}
|
||||||
|
|
||||||
async setSigneAleatoire() {
|
async setSigneAleatoire() {
|
||||||
const newSigne = await RdDItemSigneDraconique.randomSigneDraconique();
|
const newSigne = await RdDItemSigneDraconique.randomSigneDraconique();
|
||||||
this.object.update(newSigne);
|
this.item.update(newSigne);
|
||||||
}
|
}
|
||||||
|
|
||||||
async onSelectTmr(event) {
|
async onSelectTmr(event) {
|
||||||
event.preventDefault();
|
const tmrName = $(event.currentTarget)?.data("tmr-name");
|
||||||
const selectedTMR = $(".select-tmr").val();
|
const onTmr = this.tmrs.find(it => it.name == tmrName);
|
||||||
this.object.update({ 'data.typesTMR': selectedTMR });
|
if (onTmr){
|
||||||
|
onTmr.selected = event.currentTarget.checked;
|
||||||
|
}
|
||||||
|
|
||||||
|
this.item.update({ 'system.typesTMR': TMRUtility.buildListTypesTMRSelection(this.tmrs) });
|
||||||
}
|
}
|
||||||
|
|
||||||
async onValeurXpSort(event) {
|
async onValeurXpSort(event) {
|
||||||
const codeReussite = event.currentTarget.attributes['data-typereussite']?.value ?? 0;
|
const codeReussite = event.currentTarget.attributes['data-typereussite']?.value ?? 0;
|
||||||
const xp = Number(event.currentTarget.value);
|
const xp = Number(event.currentTarget.value);
|
||||||
const oldValeur = Misc.templateData(this.object).valeur;
|
const oldValeur = this.item.system.valeur;
|
||||||
const newValeur = RdDItemSigneDraconique.calculValeursXpSort(codeReussite, xp, oldValeur);
|
const newValeur = RdDItemSigneDraconique.calculValeursXpSort(codeReussite, xp, oldValeur);
|
||||||
await this.object.update({ 'data.valeur': newValeur });
|
await this.item.update({ 'system.valeur': newValeur });
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
|
@ -18,13 +18,12 @@ const DIFFICULTE_LECTURE_SIGNE_MANQUE = +11;
|
|||||||
export class RdDItemSigneDraconique {
|
export class RdDItemSigneDraconique {
|
||||||
|
|
||||||
static prepareSigneDraconiqueMeditation(meditation, rolled) {
|
static prepareSigneDraconiqueMeditation(meditation, rolled) {
|
||||||
meditation = Misc.data(meditation);
|
|
||||||
return {
|
return {
|
||||||
name: "de la " + meditation.name,
|
name: "de la " + meditation.name,
|
||||||
type: "signedraconique",
|
type: "signedraconique",
|
||||||
img: meditation.img,
|
img: meditation.img,
|
||||||
data: {
|
system: {
|
||||||
typesTMR: [TMRUtility.typeTmrName(meditation.data.tmr)],
|
typesTMR: [TMRUtility.typeTmrName(meditation.system.tmr)],
|
||||||
difficulte: rolled.isSuccess ? RdDItemSigneDraconique.getDiffSigneMeditation(rolled.code) : DIFFICULTE_LECTURE_SIGNE_MANQUE,
|
difficulte: rolled.isSuccess ? RdDItemSigneDraconique.getDiffSigneMeditation(rolled.code) : DIFFICULTE_LECTURE_SIGNE_MANQUE,
|
||||||
ephemere: true,
|
ephemere: true,
|
||||||
duree: "1 round",
|
duree: "1 round",
|
||||||
@ -43,7 +42,7 @@ export class RdDItemSigneDraconique {
|
|||||||
}
|
}
|
||||||
|
|
||||||
static getXpSortSigneDraconique(code, signe) {
|
static getXpSortSigneDraconique(code, signe) {
|
||||||
return Misc.toInt(Misc.data(signe).data.valeur[code] ?? 0);
|
return Misc.toInt(signe.system.valeur[code] ?? 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
static calculValeursXpSort(qualite, valeur, avant) {
|
static calculValeursXpSort(qualite, valeur, avant) {
|
||||||
@ -75,7 +74,7 @@ export class RdDItemSigneDraconique {
|
|||||||
name: await RdDItemSigneDraconique.randomSigneDescription(),
|
name: await RdDItemSigneDraconique.randomSigneDescription(),
|
||||||
type: "signedraconique",
|
type: "signedraconique",
|
||||||
img: defaultItemImg.signedraconique,
|
img: defaultItemImg.signedraconique,
|
||||||
data: {
|
system: {
|
||||||
typesTMR: await RdDItemSigneDraconique.randomTmrs(modele.nbCases),
|
typesTMR: await RdDItemSigneDraconique.randomTmrs(modele.nbCases),
|
||||||
ephemere: options?.ephemere == undefined ? RdDDice.rollTotal("1d2") == 2 : options.ephemere,
|
ephemere: options?.ephemere == undefined ? RdDDice.rollTotal("1d2") == 2 : options.ephemere,
|
||||||
duree: "1 round",
|
duree: "1 round",
|
||||||
|
@ -7,25 +7,25 @@ export class RdDItemSort extends Item {
|
|||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static isDifficulteVariable(sort) {
|
static isDifficulteVariable(sort) {
|
||||||
return sort && (sort.data.difficulte.toLowerCase() == "variable");
|
return sort && (sort.system.difficulte.toLowerCase() == "variable");
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static isCoutVariable(sort) {
|
static isCoutVariable(sort) {
|
||||||
return sort && (sort.data.ptreve.toLowerCase() == "variable" || sort.data.ptreve.indexOf("+") >= 0);
|
return sort && (sort.system.ptreve.toLowerCase() == "variable" || sort.system.ptreve.indexOf("+") >= 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static setCoutReveReel(sort){
|
static setCoutReveReel(sort){
|
||||||
if (sort) {
|
if (sort) {
|
||||||
sort.data.ptreve_reel = this.isCoutVariable(sort) ? 1 : sort.data.ptreve;
|
sort.system.ptreve_reel = this.isCoutVariable(sort) ? 1 : sort.system.ptreve;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static getDifficulte(sort, variable) {
|
static getDifficulte(sort, variable) {
|
||||||
if (sort && !RdDItemSort.isDifficulteVariable(sort)) {
|
if (sort && !RdDItemSort.isDifficulteVariable(sort)) {
|
||||||
return Misc.toInt(sort.data.difficulte);
|
return Misc.toInt(sort.system.difficulte);
|
||||||
}
|
}
|
||||||
return variable;
|
return variable;
|
||||||
}
|
}
|
||||||
@ -54,40 +54,40 @@ export class RdDItemSort extends Item {
|
|||||||
static getBonusCaseList( item, newCase = false ) {
|
static getBonusCaseList( item, newCase = false ) {
|
||||||
// Gestion spéciale case bonus
|
// Gestion spéciale case bonus
|
||||||
if ( item.type == 'sort') {
|
if ( item.type == 'sort') {
|
||||||
return this.buildBonusCaseList(item.data.bonuscase, newCase );
|
return this.buildBonusCaseList(item.system.bonuscase, newCase );
|
||||||
}
|
}
|
||||||
return undefined;
|
return undefined;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
/** Met à jour les données de formulaire
|
/** Met à jour les données de formulaire
|
||||||
* si static des bonus de cases sont présents
|
* si static des bonus de cases sont présents
|
||||||
* */
|
* */
|
||||||
static buildBonusCaseStringFromFormData( formData ) {
|
static buildBonusCaseStringFromFormData( formData ) {
|
||||||
if ( formData.bonusValue ) {
|
if ( formData.bonusValue ) {
|
||||||
let list = [];
|
let list = [];
|
||||||
let caseCheck = {};
|
let caseCheck = {};
|
||||||
for(let i=0; i<formData.bonusValue.length; i++) {
|
for(let i=0; i<formData.bonusValue.length; i++) {
|
||||||
let coord = formData.caseValue[i] || 'A1';
|
let coord = formData.caseValue[i] || 'A1';
|
||||||
coord = coord.toUpperCase();
|
coord = coord.toUpperCase();
|
||||||
if ( TMRUtility.verifyTMRCoord( coord ) ) { // Sanity check
|
if ( TMRUtility.verifyTMRCoord( coord ) ) { // Sanity check
|
||||||
let bonus = formData.bonusValue[i] || 0;
|
let bonus = formData.bonusValue[i] || 0;
|
||||||
if ( bonus > 0 && caseCheck[coord] == undefined ) {
|
if ( bonus > 0 && caseCheck[coord] == undefined ) {
|
||||||
caseCheck[coord] = bonus;
|
caseCheck[coord] = bonus;
|
||||||
list.push( coord+":"+bonus );
|
list.push( coord+":"+bonus );
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
formData.bonusValue = undefined;
|
|
||||||
formData.caseValue = undefined;
|
|
||||||
formData['data.bonuscase'] = list.toString(); // Reset
|
|
||||||
}
|
}
|
||||||
return formData;
|
formData.bonusValue = undefined;
|
||||||
|
formData.caseValue = undefined;
|
||||||
|
formData.system.bonuscase = list.toString(); // Reset
|
||||||
|
}
|
||||||
|
return formData;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static incrementBonusCase( actor, sort, coord ) {
|
static incrementBonusCase( actor, sort, coord ) {
|
||||||
let bonusCaseList = this.buildBonusCaseList(sort.data.bonuscase, false);
|
let bonusCaseList = this.buildBonusCaseList(sort.system.bonuscase, false);
|
||||||
//console.log("ITEMSORT", sort, bonusCaseList);
|
//console.log("ITEMSORT", sort, bonusCaseList);
|
||||||
|
|
||||||
let found = false;
|
let found = false;
|
||||||
@ -106,12 +106,12 @@ export class RdDItemSort extends Item {
|
|||||||
// Sauvegarde/update
|
// Sauvegarde/update
|
||||||
let bonuscase = StringList.toString();
|
let bonuscase = StringList.toString();
|
||||||
//console.log("Bonus cae :", bonuscase);
|
//console.log("Bonus cae :", bonuscase);
|
||||||
actor.updateEmbeddedDocuments('Item', [{ _id: sort._id, 'data.bonuscase': bonuscase }] );
|
actor.updateEmbeddedDocuments('Item', [{ _id: sort._id, 'system.bonuscase': bonuscase }] );
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static getCaseBonus( sort, coord) {
|
static getCaseBonus( sort, coord) {
|
||||||
let bonusCaseList = this.buildBonusCaseList(sort.data.bonuscase, false);
|
let bonusCaseList = this.buildBonusCaseList(sort.system.bonuscase, false);
|
||||||
for( let bc of bonusCaseList) {
|
for( let bc of bonusCaseList) {
|
||||||
if (bc.case == coord) { // Case existante
|
if (bc.case == coord) { // Case existante
|
||||||
return Number(bc.bonus);
|
return Number(bc.bonus);
|
||||||
|
206
module/item.js
206
module/item.js
@ -1,6 +1,7 @@
|
|||||||
import { DialogItemVente } from "./dialog-item-vente.js";
|
import { DialogItemVente } from "./dialog-item-vente.js";
|
||||||
import { Grammar } from "./grammar.js";
|
import { Grammar } from "./grammar.js";
|
||||||
import { Misc } from "./misc.js";
|
import { Misc } from "./misc.js";
|
||||||
|
import { RdDHerbes } from "./rdd-herbes.js";
|
||||||
import { RdDUtility } from "./rdd-utility.js";
|
import { RdDUtility } from "./rdd-utility.js";
|
||||||
|
|
||||||
const typesObjetsEquipement = ["objet", "arme", "armure", "gemme", "conteneur", "herbe", "ingredient", "livre", "potion", "munition", "nourritureboisson", "monnaie"]
|
const typesObjetsEquipement = ["objet", "arme", "armure", "gemme", "conteneur", "herbe", "ingredient", "livre", "potion", "munition", "nourritureboisson", "monnaie"]
|
||||||
@ -35,17 +36,18 @@ export const defaultItemImg = {
|
|||||||
nourritureboisson: "systems/foundryvtt-reve-de-dragon/icons/objets/provision_crue.webp",
|
nourritureboisson: "systems/foundryvtt-reve-de-dragon/icons/objets/provision_crue.webp",
|
||||||
signedraconique: "systems/foundryvtt-reve-de-dragon/icons/tmr/signe_draconique.webp",
|
signedraconique: "systems/foundryvtt-reve-de-dragon/icons/tmr/signe_draconique.webp",
|
||||||
gemme: "systems/foundryvtt-reve-de-dragon/icons/gemmes/almaze.webp",
|
gemme: "systems/foundryvtt-reve-de-dragon/icons/gemmes/almaze.webp",
|
||||||
possession: "systems/foundryvtt-reve-de-dragon/icons/entites/possession2.webp"
|
possession: "systems/foundryvtt-reve-de-dragon/icons/entites/possession2.webp",
|
||||||
|
sortreserve: "systems/foundryvtt-reve-de-dragon/icons/competence_oniros.webp",
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
export class RdDItem extends Item {
|
export class RdDItem extends Item {
|
||||||
|
|
||||||
constructor(data, context) {
|
constructor(itemData, context) {
|
||||||
if (!data.img) {
|
if (!itemData.img) {
|
||||||
data.img = defaultItemImg[data.type];
|
itemData.img = defaultItemImg[itemData.type];
|
||||||
}
|
}
|
||||||
super(data, context);
|
super(itemData, context);
|
||||||
}
|
}
|
||||||
|
|
||||||
static getTypeObjetsEquipement() {
|
static getTypeObjetsEquipement() {
|
||||||
@ -57,61 +59,56 @@ export class RdDItem extends Item {
|
|||||||
}
|
}
|
||||||
|
|
||||||
isCompetence() {
|
isCompetence() {
|
||||||
return Misc.data(this).type == 'competence';
|
return this.type == 'competence';
|
||||||
}
|
}
|
||||||
|
|
||||||
isConteneur() {
|
isConteneur() {
|
||||||
return Misc.data(this).type == 'conteneur';
|
return this.type == 'conteneur';
|
||||||
}
|
}
|
||||||
|
|
||||||
isConteneurNonVide() {
|
isConteneurNonVide() {
|
||||||
return this.isConteneur() && (Misc.templateData(this).contenu?.length ?? 0) > 0;
|
return this.isConteneur() && (this.system.contenu?.length ?? 0) > 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
isConteneurVide() {
|
isConteneurVide() {
|
||||||
return this.isConteneur() && (Misc.templateData(this).contenu?.length ?? 0) == 0;
|
return this.isConteneur() && (this.system.contenu?.length ?? 0) == 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
isVideOuNonConteneur() {
|
isVideOuNonConteneur() {
|
||||||
return !this.isConteneur() || (Misc.templateData(this).contenu?.length ?? 0) == 0;
|
return !this.isConteneur() || (this.system.contenu?.length ?? 0) == 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
isAlcool() {
|
isAlcool() {
|
||||||
const itemData = Misc.data(this);
|
return this.type == 'nourritureboisson' && this.system.boisson && this.system.alcoolise;
|
||||||
return itemData.type == 'nourritureboisson' && itemData.data.boisson && itemData.data.alcoolise;
|
|
||||||
}
|
}
|
||||||
isHerbeAPotion() {
|
isHerbeAPotion() {
|
||||||
const itemData = Misc.data(this);
|
return this.type == 'herbe' && (this.system.categorie == 'Soin' || this.system.categorie == 'Repos');
|
||||||
return itemData.type == 'herbe' && (itemData.data.categorie == 'Soin' || itemData.data.categorie == 'Repos');
|
|
||||||
}
|
}
|
||||||
isPotion() {
|
isPotion() {
|
||||||
return Misc.data(this).type == 'potion';
|
return this.type == 'potion';
|
||||||
}
|
}
|
||||||
|
|
||||||
isEquipement() {
|
isEquipement() {
|
||||||
return RdDItem.getTypeObjetsEquipement().includes(Misc.data(this).type);
|
return RdDItem.getTypeObjetsEquipement().includes(this.type)
|
||||||
}
|
}
|
||||||
|
|
||||||
isCristalAlchimique() {
|
isCristalAlchimique() {
|
||||||
const itemData = Misc.data(this);
|
return this.type == 'objet' && Grammar.toLowerCaseNoAccent(this.name) == 'cristal alchimique' && this.system.quantite > 0;
|
||||||
return itemData.type == 'objet' && Grammar.toLowerCaseNoAccent(itemData.name) == 'cristal alchimique' && itemData.data.quantite > 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
isMagique() {
|
isMagique() {
|
||||||
return Misc.templateData(this).magique;
|
return this.system.magique
|
||||||
}
|
}
|
||||||
|
|
||||||
getEncTotal() {
|
getEncTotal() {
|
||||||
const itemData = Misc.data(this);
|
return Number(this.system.encombrement ?? 0) * Number(this.system.quantite ?? 1)
|
||||||
return Number(itemData.data.encombrement ?? 0) * Number(itemData.data.quantite ?? 1);
|
|
||||||
}
|
}
|
||||||
getEnc() {
|
getEnc() {
|
||||||
const itemData = Misc.data(this);
|
switch (this.type) {
|
||||||
switch (itemData.type) {
|
|
||||||
case 'herbe':
|
case 'herbe':
|
||||||
return encBrin;
|
return encBrin;
|
||||||
}
|
}
|
||||||
return itemData.data.encombrement ?? 0;
|
return this.system.encombrement ?? 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
prepareDerivedData() {
|
prepareDerivedData() {
|
||||||
@ -122,54 +119,55 @@ export class RdDItem extends Item {
|
|||||||
if (this.isPotion()) {
|
if (this.isPotion()) {
|
||||||
this.prepareDataPotion()
|
this.prepareDataPotion()
|
||||||
}
|
}
|
||||||
const itemData = Misc.data(this);
|
this.system.actionPrincipale = this.getActionPrincipale({ warnIfNot: false });
|
||||||
itemData.data.actionPrincipale = this.getActionPrincipale({ warnIfNot: false });
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
prepareDataPotion() {
|
prepareDataPotion() {
|
||||||
const tplData = Misc.templateData(this);
|
const categorie = Grammar.toLowerCaseNoAccent(this.system.categorie);
|
||||||
const categorie = Grammar.toLowerCaseNoAccent(tplData.categorie);
|
this.system.magique = categorie.includes('enchante');
|
||||||
tplData.magique = categorie.includes('enchante');
|
if (this.system.magique) {
|
||||||
if (tplData.magique) {
|
|
||||||
if (categorie.includes('soin') || categorie.includes('repos')) {
|
if (categorie.includes('soin') || categorie.includes('repos')) {
|
||||||
tplData.puissance = tplData.herbebonus * tplData.pr;
|
// TODO: utiliser calculePointsRepos / calculePointsGuerison
|
||||||
|
this.system.puissance = RdDHerbes.calculePuissancePotion(this);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
_calculsEquipement() {
|
_calculsEquipement() {
|
||||||
const tplData = Misc.templateData(this);
|
const quantite = this.isConteneur() ? 1 : (this.system.quantite ?? 0);
|
||||||
const quantite = this.isConteneur() ? 1 : (tplData.quantite ?? 0);
|
|
||||||
const enc = this.getEnc();
|
const enc = this.getEnc();
|
||||||
if (enc != undefined) {
|
if (enc != undefined) {
|
||||||
tplData.encTotal = Math.max(enc, 0) * quantite;
|
this.system.encTotal = Math.max(enc, 0) * quantite;
|
||||||
}
|
}
|
||||||
if (tplData.cout != undefined) {
|
if (this.cout != undefined) {
|
||||||
tplData.prixTotal = Math.max(tplData.cout, 0) * quantite;
|
this.system.prixTotal = Math.max(this.cout, 0) * quantite;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
getActionPrincipale(options = { warnIfNot: true }) {
|
getActionPrincipale(options = { warnIfNot: true }) {
|
||||||
const itemData = Misc.data(this);
|
const warn = options.warnIfNot;
|
||||||
if (!this.isConteneur() && (itemData.data.quantite ?? 0) <= 0) {
|
switch (this.type) {
|
||||||
if (options.warnIfNot) {
|
case 'nourritureboisson': return this._actionOrWarnQuantiteZero(this.system.boisson ? 'Boire' : 'Manger', warn);
|
||||||
ui.notifications.warn(`Vous n'avez plus de ${itemData.name}.`);
|
case 'potion': return this._actionOrWarnQuantiteZero('Boire', warn);
|
||||||
|
case 'livre': return this._actionOrWarnQuantiteZero('Lire', warn);
|
||||||
|
case 'conteneur': return 'Ouvrir';
|
||||||
|
case 'herbe': return this.isHerbeAPotion() ? this._actionOrWarnQuantiteZero('Décoction', warn) : undefined;
|
||||||
|
case 'queue': case 'ombre': return this.system.refoulement>0 ? 'Refouler' : undefined;
|
||||||
|
}
|
||||||
|
return undefined;
|
||||||
|
}
|
||||||
|
|
||||||
|
_actionOrWarnQuantiteZero(actionName, warn){
|
||||||
|
if ((this.system.quantite ?? 0) <= 0) {
|
||||||
|
if (warn) {
|
||||||
|
ui.notifications.warn(`Vous n'avez plus de ${this.name}.`);
|
||||||
}
|
}
|
||||||
return undefined;
|
return undefined;
|
||||||
}
|
}
|
||||||
switch (itemData.type) {
|
else {
|
||||||
case 'nourritureboisson': return itemData.data.boisson ? 'Boire' : 'Manger';
|
return actionName;
|
||||||
case 'potion': return 'Boire';
|
|
||||||
case 'livre': return 'Lire';
|
|
||||||
case 'conteneur': return 'Ouvrir';
|
|
||||||
}
|
}
|
||||||
if (this.isHerbeAPotion()) { return 'Décoction'; }
|
|
||||||
if (options.warnIfNot) {
|
|
||||||
ui.notifications.warn(`Impossible d'utiliser un ${itemData.name}, aucune action associée définie.`);
|
|
||||||
}
|
|
||||||
|
|
||||||
return undefined;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
async diminuerQuantite(nombre, options = { diminuerQuantite: true, supprimerSiZero: false }) {
|
async diminuerQuantite(nombre, options = { diminuerQuantite: true, supprimerSiZero: false }) {
|
||||||
@ -178,50 +176,52 @@ export class RdDItem extends Item {
|
|||||||
}
|
}
|
||||||
|
|
||||||
async quantiteIncDec(nombre, options = { diminuerQuantite: true, supprimerSiZero: false }) {
|
async quantiteIncDec(nombre, options = { diminuerQuantite: true, supprimerSiZero: false }) {
|
||||||
const itemData = Misc.data(this);
|
const quantite = Number(this.system.quantite ?? -1);
|
||||||
const quantite = Number(itemData.data.quantite ?? -1);
|
|
||||||
if (quantite >= 0) {
|
if (quantite >= 0) {
|
||||||
const reste = Math.max(quantite + Number(nombre), 0);
|
const reste = Math.max(quantite + Number(nombre), 0);
|
||||||
|
|
||||||
if (reste == 0) {
|
if (reste == 0) {
|
||||||
if (options.supprimerSiZero) {
|
if (options.supprimerSiZero) {
|
||||||
ui.notifications.notify(`${itemData.name} supprimé de votre équipement`);
|
ui.notifications.notify(`${this.name} supprimé de votre équipement`);
|
||||||
await this.delete();
|
await this.delete();
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
ui.notifications.notify(`Il ne vous reste plus de ${itemData.name}, vous pouvez le supprimer de votre équipement, ou trouver un moyen de vous en procurer.`);
|
ui.notifications.notify(`Il ne vous reste plus de ${this.name}, vous pouvez le supprimer de votre équipement, ou trouver un moyen de vous en procurer.`);
|
||||||
await this.update({ "data.quantite": 0 });
|
await this.update({ "system.quantite": 0 });
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
await this.update({ "data.quantite": reste });
|
await this.update({ "system.quantite": reste });
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
// détermine si deux équipements sont similaires: de même type, et avec les même champs hormis la quantité
|
// détermine si deux équipements sont similaires: de même type, et avec les même champs hormis la quantité
|
||||||
isEquipementSimilaire(other) {
|
messageEquipementDifferent(other) {
|
||||||
const itemData = Misc.data(this);
|
if (!other || !this.isEquipement()) return undefined;
|
||||||
const otherData = Misc.data(other);
|
|
||||||
const tplData = Misc.templateData(this);
|
|
||||||
const otherTplData = Misc.templateData(other);
|
|
||||||
if (!this.isEquipement()) return false;
|
|
||||||
if (itemData.type != otherData.type) return false;
|
|
||||||
if (itemData.name != otherData.name) return false;
|
|
||||||
if (tplData.quantite == undefined) return false;
|
|
||||||
|
|
||||||
const differences = Object.entries(tplData).filter(([key, value]) => !['quantite', 'encTotal', 'prixTotal', 'cout'].includes(key))
|
let message = undefined;
|
||||||
.filter(([key, value]) => value != otherTplData[key]);
|
if (this.type != other.type) {
|
||||||
if (differences.length > 0) {
|
message = `Impossible de regrouper ${this.type} avec ${other.type}`;
|
||||||
let message = `Impossible de regrouper les ${itemData.type} ${itemData.name}: `;
|
|
||||||
for (const [key, value] of differences) {
|
|
||||||
message += `<br>${key}: ${value} vs ${otherTplData[key]}`;
|
|
||||||
}
|
|
||||||
ui.notifications.info(message)
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
return true;
|
else if (this.name != other.name) {
|
||||||
|
message = `Impossible de regrouper ${this.name} avec ${other.name}`;
|
||||||
|
}
|
||||||
|
else if (this.system.quantite == undefined) {
|
||||||
|
message = `Impossible de regrouper des ${this.type}, ils ne sont pas empilables`;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
const differences = Object.entries(this.system)
|
||||||
|
.filter(([key, value]) => !['quantite', 'encTotal', 'prixTotal', 'cout'].includes(key) && value != other.system[key]);
|
||||||
|
if (differences.length > 0) {
|
||||||
|
message = `Impossible de regrouper les ${this.type} ${this.name}: `;
|
||||||
|
for (const [key, value] of differences) {
|
||||||
|
message += `<br>${key}: ${value} vs ${other.system[key]}`;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return message;
|
||||||
}
|
}
|
||||||
|
|
||||||
async proposerVente() {
|
async proposerVente() {
|
||||||
@ -251,13 +251,13 @@ export class RdDItem extends Item {
|
|||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
getProprietes() {
|
getProprietes() {
|
||||||
return this[`_${Misc.data(this).type}ChatData`]();
|
return this[`_${this.type}ChatData`]();
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
async postItem(modeOverride) {
|
async postItem(modeOverride) {
|
||||||
console.log(this);
|
console.log(this);
|
||||||
let chatData = duplicate(Misc.data(this));
|
let chatData = duplicate(this);
|
||||||
const properties = this.getProprietes();
|
const properties = this.getProprietes();
|
||||||
chatData["properties"] = properties
|
chatData["properties"] = properties
|
||||||
if (this.actor) {
|
if (this.actor) {
|
||||||
@ -282,7 +282,7 @@ export class RdDItem extends Item {
|
|||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
_objetChatData() {
|
_objetChatData() {
|
||||||
const tplData = Misc.templateData(this);
|
const tplData = this.system
|
||||||
let properties = [].concat(
|
let properties = [].concat(
|
||||||
RdDItem.propertyIfDefined('Résistance', tplData.resistance, tplData.resistance),
|
RdDItem.propertyIfDefined('Résistance', tplData.resistance, tplData.resistance),
|
||||||
RdDItem.propertyIfDefined('Qualité', tplData.qualite, tplData.qualite),
|
RdDItem.propertyIfDefined('Qualité', tplData.qualite, tplData.qualite),
|
||||||
@ -293,7 +293,7 @@ export class RdDItem extends Item {
|
|||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
_nourritureboissonChatData() {
|
_nourritureboissonChatData() {
|
||||||
const tplData = Misc.templateData(this);
|
const tplData = this.system
|
||||||
let properties = [].concat(
|
let properties = [].concat(
|
||||||
RdDItem.propertyIfDefined('Sustentation', tplData.sust, tplData.sust > 0),
|
RdDItem.propertyIfDefined('Sustentation', tplData.sust, tplData.sust > 0),
|
||||||
RdDItem.propertyIfDefined('Désaltère', tplData.desaltere, tplData.boisson),
|
RdDItem.propertyIfDefined('Désaltère', tplData.desaltere, tplData.boisson),
|
||||||
@ -306,7 +306,7 @@ export class RdDItem extends Item {
|
|||||||
}
|
}
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
_armeChatData() {
|
_armeChatData() {
|
||||||
const tplData = Misc.templateData(this);
|
const tplData = this.system
|
||||||
let properties = [
|
let properties = [
|
||||||
`<b>Compétence</b>: ${tplData.competence}`,
|
`<b>Compétence</b>: ${tplData.competence}`,
|
||||||
`<b>Dommages</b>: ${tplData.dommages}`,
|
`<b>Dommages</b>: ${tplData.dommages}`,
|
||||||
@ -318,7 +318,7 @@ export class RdDItem extends Item {
|
|||||||
}
|
}
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
_conteneurChatData() {
|
_conteneurChatData() {
|
||||||
const tplData = Misc.templateData(this);
|
const tplData = this.system
|
||||||
let properties = [
|
let properties = [
|
||||||
`<b>Capacité</b>: ${tplData.capacite} Enc.`,
|
`<b>Capacité</b>: ${tplData.capacite} Enc.`,
|
||||||
`<b>Encombrement</b>: ${tplData.encombrement}`
|
`<b>Encombrement</b>: ${tplData.encombrement}`
|
||||||
@ -327,7 +327,7 @@ export class RdDItem extends Item {
|
|||||||
}
|
}
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
_munitionChatData() {
|
_munitionChatData() {
|
||||||
const tplData = Misc.templateData(this);
|
const tplData = this.system
|
||||||
let properties = [
|
let properties = [
|
||||||
`<b>Encombrement</b>: ${tplData.encombrement}`
|
`<b>Encombrement</b>: ${tplData.encombrement}`
|
||||||
]
|
]
|
||||||
@ -335,7 +335,7 @@ export class RdDItem extends Item {
|
|||||||
}
|
}
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
_armureChatData() {
|
_armureChatData() {
|
||||||
const tplData = Misc.templateData(this);
|
const tplData = this.system
|
||||||
let properties = [
|
let properties = [
|
||||||
`<b>Protection</b>: ${tplData.protection}`,
|
`<b>Protection</b>: ${tplData.protection}`,
|
||||||
`<b>Détérioration</b>: ${tplData.deterioration}`,
|
`<b>Détérioration</b>: ${tplData.deterioration}`,
|
||||||
@ -346,7 +346,7 @@ export class RdDItem extends Item {
|
|||||||
}
|
}
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
_competenceChatData() {
|
_competenceChatData() {
|
||||||
const tplData = Misc.templateData(this);
|
const tplData = this.system
|
||||||
let properties = [
|
let properties = [
|
||||||
`<b>Catégorie</b>: ${tplData.categorie}`,
|
`<b>Catégorie</b>: ${tplData.categorie}`,
|
||||||
`<b>Niveau</b>: ${tplData.niveau}`,
|
`<b>Niveau</b>: ${tplData.niveau}`,
|
||||||
@ -357,7 +357,7 @@ export class RdDItem extends Item {
|
|||||||
}
|
}
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
_competencecreatureChatData() {
|
_competencecreatureChatData() {
|
||||||
const tplData = Misc.templateData(this);
|
const tplData = this.system
|
||||||
let properties = [
|
let properties = [
|
||||||
`<b>Catégorie</b>: ${tplData.categorie}`,
|
`<b>Catégorie</b>: ${tplData.categorie}`,
|
||||||
`<b>Niveau</b>: ${tplData.niveau}`,
|
`<b>Niveau</b>: ${tplData.niveau}`,
|
||||||
@ -368,7 +368,7 @@ export class RdDItem extends Item {
|
|||||||
}
|
}
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
_sortChatData() {
|
_sortChatData() {
|
||||||
const tplData = Misc.templateData(this);
|
const tplData = this.system
|
||||||
let properties = [
|
let properties = [
|
||||||
`<b>Draconic</b>: ${tplData.draconic}`,
|
`<b>Draconic</b>: ${tplData.draconic}`,
|
||||||
`<b>Difficulté</b>: ${tplData.difficulte}`,
|
`<b>Difficulté</b>: ${tplData.difficulte}`,
|
||||||
@ -379,7 +379,7 @@ export class RdDItem extends Item {
|
|||||||
}
|
}
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
_herbeChatData() {
|
_herbeChatData() {
|
||||||
const tplData = Misc.templateData(this);
|
const tplData = this.system
|
||||||
let properties = [
|
let properties = [
|
||||||
`<b>Milieu</b>: ${tplData.milieu}`,
|
`<b>Milieu</b>: ${tplData.milieu}`,
|
||||||
`<b>Rareté</b>: ${tplData.rarete}`,
|
`<b>Rareté</b>: ${tplData.rarete}`,
|
||||||
@ -389,7 +389,7 @@ export class RdDItem extends Item {
|
|||||||
}
|
}
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
_ingredientChatData() {
|
_ingredientChatData() {
|
||||||
const tplData = Misc.templateData(this);
|
const tplData = this.system
|
||||||
let properties = [
|
let properties = [
|
||||||
`<b>Milieu</b>: ${tplData.milieu}`,
|
`<b>Milieu</b>: ${tplData.milieu}`,
|
||||||
`<b>Rareté</b>: ${tplData.rarete}`,
|
`<b>Rareté</b>: ${tplData.rarete}`,
|
||||||
@ -399,7 +399,7 @@ export class RdDItem extends Item {
|
|||||||
}
|
}
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
_tacheChatData() {
|
_tacheChatData() {
|
||||||
const tplData = Misc.templateData(this);
|
const tplData = this.system
|
||||||
let properties = [
|
let properties = [
|
||||||
`<b>Caractéristique</b>: ${tplData.carac}`,
|
`<b>Caractéristique</b>: ${tplData.carac}`,
|
||||||
`<b>Compétence</b>: ${tplData.competence}`,
|
`<b>Compétence</b>: ${tplData.competence}`,
|
||||||
@ -415,7 +415,7 @@ export class RdDItem extends Item {
|
|||||||
}
|
}
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
_livreChatData() {
|
_livreChatData() {
|
||||||
const tplData = Misc.templateData(this);
|
const tplData = this.system
|
||||||
let properties = [
|
let properties = [
|
||||||
`<b>Compétence</b>: ${tplData.competence}`,
|
`<b>Compétence</b>: ${tplData.competence}`,
|
||||||
`<b>Auteur</b>: ${tplData.auteur}`,
|
`<b>Auteur</b>: ${tplData.auteur}`,
|
||||||
@ -427,7 +427,7 @@ export class RdDItem extends Item {
|
|||||||
}
|
}
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
_potionChatData() {
|
_potionChatData() {
|
||||||
const tplData = Misc.templateData(this);
|
const tplData = this.system
|
||||||
let properties = [
|
let properties = [
|
||||||
`<b>Rareté</b>: ${tplData.rarete}`,
|
`<b>Rareté</b>: ${tplData.rarete}`,
|
||||||
`<b>Catégorie</b>: ${tplData.categorie}`,
|
`<b>Catégorie</b>: ${tplData.categorie}`,
|
||||||
@ -437,7 +437,7 @@ export class RdDItem extends Item {
|
|||||||
}
|
}
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
_queueChatData() {
|
_queueChatData() {
|
||||||
const tplData = Misc.templateData(this);
|
const tplData = this.system
|
||||||
let properties = [
|
let properties = [
|
||||||
`<b>Refoulement</b>: ${tplData.refoulement}`
|
`<b>Refoulement</b>: ${tplData.refoulement}`
|
||||||
]
|
]
|
||||||
@ -445,7 +445,7 @@ export class RdDItem extends Item {
|
|||||||
}
|
}
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
_ombreChatData() {
|
_ombreChatData() {
|
||||||
const tplData = Misc.templateData(this);
|
const tplData = this.system
|
||||||
let properties = [
|
let properties = [
|
||||||
`<b>Refoulement</b>: ${tplData.refoulement}`
|
`<b>Refoulement</b>: ${tplData.refoulement}`
|
||||||
]
|
]
|
||||||
@ -453,19 +453,19 @@ export class RdDItem extends Item {
|
|||||||
}
|
}
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
_souffleChatData() {
|
_souffleChatData() {
|
||||||
const tplData = Misc.templateData(this);
|
const tplData = this.system
|
||||||
let properties = [];
|
let properties = [];
|
||||||
return properties;
|
return properties;
|
||||||
}
|
}
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
_teteChatData() {
|
_teteChatData() {
|
||||||
const tplData = Misc.templateData(this);
|
const tplData = this.system
|
||||||
let properties = [];
|
let properties = [];
|
||||||
return properties;
|
return properties;
|
||||||
}
|
}
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
_tarotChatData() {
|
_tarotChatData() {
|
||||||
const tplData = Misc.templateData(this);
|
const tplData = this.system
|
||||||
let properties = [
|
let properties = [
|
||||||
`<b>Concept</b>: ${tplData.concept}`,
|
`<b>Concept</b>: ${tplData.concept}`,
|
||||||
`<b>Aspect</b>: ${tplData.aspect}`,
|
`<b>Aspect</b>: ${tplData.aspect}`,
|
||||||
@ -474,7 +474,7 @@ export class RdDItem extends Item {
|
|||||||
}
|
}
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
_nombreastralChatData() {
|
_nombreastralChatData() {
|
||||||
const tplData = Misc.templateData(this);
|
const tplData = this.system
|
||||||
let properties = [
|
let properties = [
|
||||||
`<b>Valeur</b>: ${tplData.value}`,
|
`<b>Valeur</b>: ${tplData.value}`,
|
||||||
`<b>Jour</b>: ${tplData.jourlabel}`,
|
`<b>Jour</b>: ${tplData.jourlabel}`,
|
||||||
@ -483,7 +483,7 @@ export class RdDItem extends Item {
|
|||||||
}
|
}
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
_monnaieChatData() {
|
_monnaieChatData() {
|
||||||
const tplData = Misc.templateData(this);
|
const tplData = this.system
|
||||||
let properties = [
|
let properties = [
|
||||||
`<b>Valeur en Deniers</b>: ${tplData.valeur_deniers}`,
|
`<b>Valeur en Deniers</b>: ${tplData.valeur_deniers}`,
|
||||||
`<b>Encombrement</b>: ${tplData.encombrement}`
|
`<b>Encombrement</b>: ${tplData.encombrement}`
|
||||||
@ -492,7 +492,7 @@ export class RdDItem extends Item {
|
|||||||
}
|
}
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
_meditationChatData() {
|
_meditationChatData() {
|
||||||
const tplData = Misc.templateData(this);
|
const tplData = this.system
|
||||||
let properties = [
|
let properties = [
|
||||||
`<b>Thème</b>: ${tplData.theme}`,
|
`<b>Thème</b>: ${tplData.theme}`,
|
||||||
`<b>Compétence</b>: ${tplData.competence}`,
|
`<b>Compétence</b>: ${tplData.competence}`,
|
||||||
@ -507,7 +507,7 @@ export class RdDItem extends Item {
|
|||||||
}
|
}
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
_casetmrChatData() {
|
_casetmrChatData() {
|
||||||
const tplData = Misc.templateData(this);
|
const tplData = this.system
|
||||||
let properties = [
|
let properties = [
|
||||||
`<b>Coordonnée</b>: ${tplData.coord}`,
|
`<b>Coordonnée</b>: ${tplData.coord}`,
|
||||||
`<b>Spécificité</b>: ${tplData.specific}`
|
`<b>Spécificité</b>: ${tplData.specific}`
|
||||||
@ -516,7 +516,7 @@ export class RdDItem extends Item {
|
|||||||
}
|
}
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
_maladieChatData() {
|
_maladieChatData() {
|
||||||
const tplData = Misc.templateData(this);
|
const tplData = this.system
|
||||||
let properties
|
let properties
|
||||||
if (tplData.identifie) {
|
if (tplData.identifie) {
|
||||||
properties = [
|
properties = [
|
||||||
@ -541,7 +541,7 @@ export class RdDItem extends Item {
|
|||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
_gemmeChatData() {
|
_gemmeChatData() {
|
||||||
const tplData = Misc.templateData(this);
|
const tplData = this.system
|
||||||
let properties = [
|
let properties = [
|
||||||
`<b>Pureté</b>: ${tplData.purete}`,
|
`<b>Pureté</b>: ${tplData.purete}`,
|
||||||
`<b>Taille</b>: ${tplData.taille}`,
|
`<b>Taille</b>: ${tplData.taille}`,
|
||||||
|
160
module/migrations.js
Normal file
160
module/migrations.js
Normal file
@ -0,0 +1,160 @@
|
|||||||
|
import { LOG_HEAD, SYSTEM_RDD } from "./constants.js";
|
||||||
|
import { Grammar } from "./grammar.js";
|
||||||
|
|
||||||
|
class Migration {
|
||||||
|
get code() { return "sample"; }
|
||||||
|
get version() { return "0.0.0"; }
|
||||||
|
async migrate() { }
|
||||||
|
|
||||||
|
async applyItemsUpdates(computeUpdates) {
|
||||||
|
await game.actors.forEach(async (actor) => {
|
||||||
|
const actorItemUpdates = computeUpdates(actor.items);
|
||||||
|
if (actorItemUpdates.length > 0) {
|
||||||
|
console.log(
|
||||||
|
this.code,
|
||||||
|
`Applying updates on actor ${actor.name} items`,
|
||||||
|
actorItemUpdates
|
||||||
|
);
|
||||||
|
await actor.updateEmbeddedDocuments("Item", actorItemUpdates);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
const itemUpdates = computeUpdates(game.items);
|
||||||
|
if (itemUpdates.length > 0) {
|
||||||
|
console.log(this.code, "Applying updates on items", itemUpdates);
|
||||||
|
await Item.updateDocuments(itemUpdates);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
class _10_0_16_MigrationSortsReserve extends Migration {
|
||||||
|
get code() { return "creation-item-sort-reserve"; }
|
||||||
|
get version() { return "10.0.16"; }
|
||||||
|
|
||||||
|
async migrate() {
|
||||||
|
await game.actors
|
||||||
|
.filter((actor) => actor.type == "personnage")
|
||||||
|
.filter((actor) => actor.system.reve?.reserve?.list?.length ?? 0 > 0)
|
||||||
|
.forEach(async (actor) => {
|
||||||
|
const sortsReserve = actor.system.reve.reserve.list.map(this.conversionSortReserve);
|
||||||
|
console.log(`${LOG_HEAD} Migration des sorts en réserve de ${actor.name}`, sortsReserve);
|
||||||
|
await actor.createEmbeddedDocuments("Item", sortsReserve, {
|
||||||
|
renderSheet: false,
|
||||||
|
});
|
||||||
|
await actor.update({ 'system.reve.reserve.list': [] })
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
conversionSortReserve(it) {
|
||||||
|
return {
|
||||||
|
type: 'sortreserve',
|
||||||
|
name: it.sort.name,
|
||||||
|
img: it.sort.img,
|
||||||
|
system: {
|
||||||
|
// ATTENTION, utilisation de data / _id possibles, encore présents pour les anciens sorts en réserve
|
||||||
|
sortid: it.sort._id,
|
||||||
|
draconic: it.sort.draconic,
|
||||||
|
ptreve: (it.sort.system ?? it.sort.data).ptreve_reel,
|
||||||
|
coord: it.coord,
|
||||||
|
heurecible: 'Vaisseau',
|
||||||
|
},
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class _10_0_17_MigrationCompetenceCreature extends Migration {
|
||||||
|
get code() { return "competences-creature-parade"; }
|
||||||
|
get version() { return "10.0.17"; }
|
||||||
|
|
||||||
|
async migrate() {
|
||||||
|
await this.applyItemsUpdates(items => items
|
||||||
|
.filter(it => it.type == "competencecreature" && it.system.isparade && it.system.categorie_parade == "")
|
||||||
|
.map(it => { return { _id: it.id, "system.categorie_parade": "armes-naturelles" } }));
|
||||||
|
|
||||||
|
await this.applyItemsUpdates(items => items
|
||||||
|
.filter(it => it.type == "competencecreature" && it.system.iscombat)
|
||||||
|
.map(it => { return { _id: it.id, "system.categorie": (Grammar.includesLowerCaseNoAccent(it.name, "lancee") ? "lancer" : "melee") } })
|
||||||
|
);
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class _10_0_21_VehiculeStructureResistanceMax extends Migration {
|
||||||
|
get code() { return "vehicule-structure-resistance-max"; }
|
||||||
|
get version() { return "10.0.21"; }
|
||||||
|
|
||||||
|
async migrate() {
|
||||||
|
await game.actors
|
||||||
|
.filter((actor) => actor.type == "vehicule")
|
||||||
|
.forEach(async (actor) => {
|
||||||
|
await actor.update({
|
||||||
|
'system.etat.resistance.value': actor.system.resistance,
|
||||||
|
'system.etat.resistance.max': actor.system.resistance,
|
||||||
|
'system.etat.structure.value': actor.system.structure,
|
||||||
|
'system.etat.structure.max': actor.system.structure
|
||||||
|
})
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export class Migrations {
|
||||||
|
static getMigrations() {
|
||||||
|
return [
|
||||||
|
new _10_0_16_MigrationSortsReserve(),
|
||||||
|
new _10_0_17_MigrationCompetenceCreature(),
|
||||||
|
new _10_0_21_VehiculeStructureResistanceMax(),
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
constructor() {
|
||||||
|
game.settings.register(SYSTEM_RDD, "systemMigrationVersion", {
|
||||||
|
name: "System Migration Version",
|
||||||
|
scope: "world",
|
||||||
|
config: false,
|
||||||
|
type: String,
|
||||||
|
default: "0.0.0",
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
migrate() {
|
||||||
|
const currentVersion = game.settings.get(
|
||||||
|
SYSTEM_RDD,
|
||||||
|
"systemMigrationVersion"
|
||||||
|
);
|
||||||
|
if (isNewerVersion(game.system.version, currentVersion)) {
|
||||||
|
const migrations = Migrations.getMigrations().filter(m => isNewerVersion(m.version, currentVersion));
|
||||||
|
if (migrations.length > 0) {
|
||||||
|
migrations.sort((a, b) =>
|
||||||
|
isNewerVersion(a.version, b.version)
|
||||||
|
? 1
|
||||||
|
: isNewerVersion(b.version, a.version)
|
||||||
|
? -1
|
||||||
|
: 0
|
||||||
|
);
|
||||||
|
migrations.forEach(async (m) => {
|
||||||
|
ui.notifications.info(
|
||||||
|
`Executing migration ${m.code}: version ${currentVersion} is lower than ${m.version}`
|
||||||
|
);
|
||||||
|
await m.migrate();
|
||||||
|
});
|
||||||
|
ui.notifications.info(
|
||||||
|
`Migrations done, version will change to ${game.system.version}`
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
console.log(
|
||||||
|
LOG_HEAD +
|
||||||
|
`No migration needeed, version will change to ${game.system.version}`
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
game.settings.set(
|
||||||
|
SYSTEM_RDD,
|
||||||
|
"systemMigrationVersion",
|
||||||
|
game.system.version
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
console.log(LOG_HEAD + `No system version changed`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -69,9 +69,9 @@ export class Misc {
|
|||||||
}
|
}
|
||||||
|
|
||||||
static classify(items, classifier = it => it.type) {
|
static classify(items, classifier = it => it.type) {
|
||||||
let itemsBy = {};
|
let itemsBy = {}
|
||||||
Misc.classifyInto(itemsBy, items, classifier);
|
Misc.classifyInto(itemsBy, items, classifier)
|
||||||
return itemsBy;
|
return itemsBy
|
||||||
}
|
}
|
||||||
|
|
||||||
static classifyFirst(items, classifier) {
|
static classifyFirst(items, classifier) {
|
||||||
@ -87,13 +87,13 @@ export class Misc {
|
|||||||
|
|
||||||
static classifyInto(itemsBy, items, classifier = it => it.type) {
|
static classifyInto(itemsBy, items, classifier = it => it.type) {
|
||||||
for (const item of items) {
|
for (const item of items) {
|
||||||
const classification = classifier(item);
|
const classification = classifier(item)
|
||||||
let list = itemsBy[classification];
|
let list = itemsBy[classification];
|
||||||
if (!list) {
|
if (!list) {
|
||||||
list = [];
|
list = []
|
||||||
itemsBy[classification] = list;
|
itemsBy[classification] = list
|
||||||
}
|
}
|
||||||
list.push(item);
|
list.push(item)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -106,20 +106,9 @@ export class Misc {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static data(it) {
|
|
||||||
if (it instanceof Actor || it instanceof Item || it instanceof Combatant) {
|
|
||||||
return it.data;
|
|
||||||
}
|
|
||||||
return it;
|
|
||||||
}
|
|
||||||
|
|
||||||
static templateData(it) {
|
|
||||||
return Misc.data(it)?.data ?? {}
|
|
||||||
}
|
|
||||||
|
|
||||||
static getEntityTypeLabel(entity) {
|
static getEntityTypeLabel(entity) {
|
||||||
const documentName = entity?.documentName;
|
const documentName = entity?.documentName
|
||||||
const type = entity?.data.type;
|
const type = entity?.type
|
||||||
if (documentName === 'Actor' || documentName === 'Item') {
|
if (documentName === 'Actor' || documentName === 'Item') {
|
||||||
const label = CONFIG[documentName]?.typeLabels?.[type] ?? type;
|
const label = CONFIG[documentName]?.typeLabels?.[type] ?? type;
|
||||||
return game.i18n.has(label) ? game.i18n.localize(label) : t;
|
return game.i18n.has(label) ? game.i18n.localize(label) : t;
|
||||||
|
@ -7,9 +7,9 @@ const matchOperationTerms = new RegExp(/@(\w*){([\w\-]+)}/i);
|
|||||||
export class RdDAlchimie {
|
export class RdDAlchimie {
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static processManipulation(recetteData, actorId = undefined) {
|
static processManipulation(recette, actorId = undefined) {
|
||||||
//console.log("CALLED", recette, recette.isOwned, actorId );
|
//console.log("CALLED", recette, recette.isOwned, actorId );
|
||||||
let manip = recetteData.data.manipulation;
|
let manip = recette.system.manipulation;
|
||||||
let matchArray = manip.match(matchOperations);
|
let matchArray = manip.match(matchOperations);
|
||||||
if (matchArray) {
|
if (matchArray) {
|
||||||
for (let matchStr of matchArray) {
|
for (let matchStr of matchArray) {
|
||||||
@ -17,12 +17,12 @@ export class RdDAlchimie {
|
|||||||
//console.log("RESULT ", result);
|
//console.log("RESULT ", result);
|
||||||
if (result[1] && result[2]) {
|
if (result[1] && result[2]) {
|
||||||
let commande = Misc.upperFirst(result[1]);
|
let commande = Misc.upperFirst(result[1]);
|
||||||
let replacement = this[`_alchimie${commande}`](recetteData, result[2], actorId);
|
let replacement = this[`_alchimie${commande}`](recette, result[2], actorId);
|
||||||
manip = manip.replace(result[0], replacement);
|
manip = manip.replace(result[0], replacement);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
recetteData.data.manipulation_update = manip;
|
recette.system.manipulation_update = manip;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
|
@ -12,23 +12,23 @@ export class RdDAstrologieJoueur extends Dialog {
|
|||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static async create(actor, dialogConfig) {
|
static async create(actor, dialogConfig) {
|
||||||
|
|
||||||
let data = {
|
let dialogData = {
|
||||||
nombres: this.organizeNombres(actor),
|
nombres: this.organizeNombres(actor),
|
||||||
dates: game.system.rdd.calendrier.getJoursSuivants(10),
|
dates: game.system.rdd.calendrier.getJoursSuivants(10),
|
||||||
etat: actor.getEtatGeneral(),
|
etat: actor.getEtatGeneral(),
|
||||||
ajustementsConditions: CONFIG.RDD.ajustementsConditions,
|
ajustementsConditions: CONFIG.RDD.ajustementsConditions,
|
||||||
astrologie: RdDItemCompetence.findCompetence(actor.data.items, 'Astrologie')
|
astrologie: RdDItemCompetence.findCompetence(actor.items, 'Astrologie')
|
||||||
}
|
}
|
||||||
const html = await renderTemplate('systems/foundryvtt-reve-de-dragon/templates/dialog-astrologie-joueur.html', data);
|
const html = await renderTemplate('systems/foundryvtt-reve-de-dragon/templates/dialog-astrologie-joueur.html', dialogData);
|
||||||
let options = { classes: ["rdddialog"], width: 600, height: 500, 'z-index': 99999 };
|
let options = { classes: ["rdddialog"], width: 600, height: 500, 'z-index': 99999 };
|
||||||
if (dialogConfig.options) {
|
if (dialogConfig.options) {
|
||||||
mergeObject(options, dialogConfig.options, { overwrite: true });
|
mergeObject(options, dialogConfig.options, { overwrite: true });
|
||||||
}
|
}
|
||||||
return new RdDAstrologieJoueur(html, actor, data);
|
return new RdDAstrologieJoueur(html, actor, dialogData);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
constructor(html, actor, data) {
|
constructor(html, actor, dialogData) {
|
||||||
|
|
||||||
let myButtons = {
|
let myButtons = {
|
||||||
saveButton: { label: "Fermer", callback: html => this.quitDialog() }
|
saveButton: { label: "Fermer", callback: html => this.quitDialog() }
|
||||||
@ -41,7 +41,7 @@ export class RdDAstrologieJoueur extends Dialog {
|
|||||||
super(dialogConf, dialogOptions);
|
super(dialogConf, dialogOptions);
|
||||||
|
|
||||||
this.actor = actor;
|
this.actor = actor;
|
||||||
this.dataNombreAstral = duplicate(data);
|
this.dataNombreAstral = duplicate(dialogData);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
@ -49,12 +49,12 @@ export class RdDAstrologieJoueur extends Dialog {
|
|||||||
let itemNombres = actor.listItemsData('nombreastral');
|
let itemNombres = actor.listItemsData('nombreastral');
|
||||||
let itemFiltered = {};
|
let itemFiltered = {};
|
||||||
for (let item of itemNombres) {
|
for (let item of itemNombres) {
|
||||||
if (itemFiltered[item.data.jourindex]) {
|
if (itemFiltered[item.system.jourindex]) {
|
||||||
itemFiltered[item.data.jourindex].listValues.push(item.data.value);
|
itemFiltered[item.system.jourindex].listValues.push(item.system.value);
|
||||||
} else {
|
} else {
|
||||||
itemFiltered[item.data.jourindex] = {
|
itemFiltered[item.system.jourindex] = {
|
||||||
listValues: [item.data.value],
|
listValues: [item.system.value],
|
||||||
jourlabel: item.data.jourlabel
|
jourlabel: item.system.jourlabel
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -63,9 +63,9 @@ export class RdDAstrologieJoueur extends Dialog {
|
|||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
requestJetAstrologie() {
|
requestJetAstrologie() {
|
||||||
let data = {
|
let socketData = {
|
||||||
id: this.actor.data._id,
|
id: this.actor.id,
|
||||||
carac_vue: Misc.data(this.actor).data.carac['vue'].value,
|
carac_vue: this.actor.system.carac['vue'].value,
|
||||||
etat: this.dataNombreAstral.etat,
|
etat: this.dataNombreAstral.etat,
|
||||||
astrologie: this.dataNombreAstral.astrologie,
|
astrologie: this.dataNombreAstral.astrologie,
|
||||||
conditions: $("#diffConditions").val(),
|
conditions: $("#diffConditions").val(),
|
||||||
@ -73,11 +73,11 @@ export class RdDAstrologieJoueur extends Dialog {
|
|||||||
userId: game.user.id
|
userId: game.user.id
|
||||||
}
|
}
|
||||||
if (Misc.isUniqueConnectedGM()) {
|
if (Misc.isUniqueConnectedGM()) {
|
||||||
game.system.rdd.calendrier.requestNombreAstral(data);
|
game.system.rdd.calendrier.requestNombreAstral(socketData);
|
||||||
} else {
|
} else {
|
||||||
game.socket.emit(SYSTEM_SOCKET_ID, {
|
game.socket.emit(SYSTEM_SOCKET_ID, {
|
||||||
msg: "msg_request_nombre_astral",
|
msg: "msg_request_nombre_astral",
|
||||||
data: data
|
data: socketData
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
this.close();
|
this.close();
|
||||||
|
@ -20,7 +20,7 @@ export class RdDBonus {
|
|||||||
|
|
||||||
static isAjustementAstrologique(rollData) {
|
static isAjustementAstrologique(rollData) {
|
||||||
return RdDCarac.isChance(rollData.selectedCarac) ||
|
return RdDCarac.isChance(rollData.selectedCarac) ||
|
||||||
rollData.selectedSort?.data.isrituel;
|
rollData.selectedSort?.system.isrituel;
|
||||||
}
|
}
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static isDefenseAttaqueFinesse(rollData) {
|
static isDefenseAttaqueFinesse(rollData) {
|
||||||
@ -68,23 +68,23 @@ export class RdDBonus {
|
|||||||
}
|
}
|
||||||
return isCauchemar ? "cauchemar"
|
return isCauchemar ? "cauchemar"
|
||||||
: rollData.dmg?.mortalite
|
: rollData.dmg?.mortalite
|
||||||
?? rollData.arme?.data.mortalite
|
?? rollData.arme?.system.mortalite
|
||||||
?? "mortel";
|
?? "mortel";
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static _dmgArme(rollData) {
|
static _dmgArme(rollData) {
|
||||||
if ( rollData.arme) {
|
if ( rollData.arme) {
|
||||||
let dmgBase = rollData.arme.data.dommagesReels ?? Number(rollData.arme.data.dommages ?? 0);
|
let dmgBase = rollData.arme.system.dommagesReels ?? Number(rollData.arme.system.dommages ?? 0);
|
||||||
//Le bonus dégats magiques ne peut pas faire dépasser le bonus de l'arme (cf p.278)
|
//Le bonus dégats magiques ne peut pas faire dépasser le bonus de l'arme (cf p.278)
|
||||||
return dmgBase + Math.min(dmgBase, rollData.arme.data.magique ? rollData.arme.data.ecaille_efficacite : 0);
|
return dmgBase + Math.min(dmgBase, rollData.arme.system.magique ? rollData.arme.system.ecaille_efficacite : 0);
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static _peneration(rollData) {
|
static _peneration(rollData) {
|
||||||
return parseInt(rollData.arme?.data.penetration ?? 0);
|
return parseInt(rollData.arme?.system.penetration ?? 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
|
@ -223,9 +223,9 @@ export class RdDCalendrier extends Application {
|
|||||||
checkMaladie( periode) {
|
checkMaladie( periode) {
|
||||||
for (let actor of game.actors) {
|
for (let actor of game.actors) {
|
||||||
if (actor.type == 'personnage') {
|
if (actor.type == 'personnage') {
|
||||||
let maladies = actor.filterItems( item => (item.type == 'maladie' || (item.type == 'poison' && item.data.active) ) && item.data.periodicite.toLowerCase().includes(periode) );
|
let maladies = actor.items.filter( item => (item.type == 'maladie' || (item.type == 'poison' && item.system.active) ) && item.system.periodicite.toLowerCase().includes(periode) );
|
||||||
for (let maladie of maladies) {
|
for (let maladie of maladies) {
|
||||||
if ( maladie.data.identifie) {
|
if ( maladie.system.identifie) {
|
||||||
ChatMessage.create({ content: `${actor.name} souffre de ${maladie.name} (${maladie.type}): vérifiez que les effets ne se sont pas aggravés !` });
|
ChatMessage.create({ content: `${actor.name} souffre de ${maladie.name} (${maladie.type}): vérifiez que les effets ne se sont pas aggravés !` });
|
||||||
} else {
|
} else {
|
||||||
ChatMessage.create({ content: `${actor.name} souffre d'un mal inconnu (${maladie.type}): vérifiez que les effets ne se sont pas aggravés !` });
|
ChatMessage.create({ content: `${actor.name} souffre d'un mal inconnu (${maladie.type}): vérifiez que les effets ne se sont pas aggravés !` });
|
||||||
@ -320,7 +320,7 @@ export class RdDCalendrier extends Application {
|
|||||||
if (Misc.isUniqueConnectedGM()) { // Only once
|
if (Misc.isUniqueConnectedGM()) { // Only once
|
||||||
console.log(request);
|
console.log(request);
|
||||||
let jourDiff = this.getLectureAstrologieDifficulte(request.date);
|
let jourDiff = this.getLectureAstrologieDifficulte(request.date);
|
||||||
let niveau = Number(request.astrologie.data.niveau) + Number(request.conditions) + Number(jourDiff) + Number(request.etat);
|
let niveau = Number(request.astrologie.system.niveau) + Number(request.conditions) + Number(jourDiff) + Number(request.etat);
|
||||||
let rollData = {
|
let rollData = {
|
||||||
caracValue: request.carac_vue,
|
caracValue: request.carac_vue,
|
||||||
finalLevel: niveau,
|
finalLevel: niveau,
|
||||||
@ -444,9 +444,9 @@ export class RdDCalendrier extends Application {
|
|||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
updateDisplay() {
|
updateDisplay() {
|
||||||
let data = this.fillCalendrierData();
|
let calendrier = this.fillCalendrierData();
|
||||||
// Rebuild data
|
// Rebuild text du calendrier
|
||||||
let dateHTML = `Jour ${data.jourMois} de ${data.nomMois} (${data.nomSaison})`
|
let dateHTML = `Jour ${calendrier.jourMois} de ${calendrier.nomMois} (${calendrier.nomSaison})`
|
||||||
if (game.user.isGM) {
|
if (game.user.isGM) {
|
||||||
dateHTML = dateHTML + " - NA: " + (this.getCurrentNombreAstral() ?? "indéterminé");
|
dateHTML = dateHTML + " - NA: " + (this.getCurrentNombreAstral() ?? "indéterminé");
|
||||||
}
|
}
|
||||||
@ -454,13 +454,13 @@ export class RdDCalendrier extends Application {
|
|||||||
handle.innerHTML = dateHTML;
|
handle.innerHTML = dateHTML;
|
||||||
}
|
}
|
||||||
for (let heure of document.getElementsByClassName("calendar-heure-texte")) {
|
for (let heure of document.getElementsByClassName("calendar-heure-texte")) {
|
||||||
heure.innerHTML = data.nomHeure;
|
heure.innerHTML = calendrier.nomHeure;
|
||||||
}
|
}
|
||||||
for (const minute of document.getElementsByClassName("calendar-time-disp")) {
|
for (const minute of document.getElementsByClassName("calendar-time-disp")) {
|
||||||
minute.innerHTML = `${data.minutesRelative} minutes`;
|
minute.innerHTML = `${calendrier.minutesRelative} minutes`;
|
||||||
}
|
}
|
||||||
for (const heureImg of document.getElementsByClassName("calendar-heure-img")) {
|
for (const heureImg of document.getElementsByClassName("calendar-heure-img")) {
|
||||||
heureImg.src = data.iconHeure;
|
heureImg.src = calendrier.iconHeure;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -101,35 +101,35 @@ export class RdDCarac {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static computeCarac(data) {
|
static computeCarac(system) {
|
||||||
data.carac.force.value = Math.min(data.carac.force.value, parseInt(data.carac.taille.value) + 4);
|
system.carac.force.value = Math.min(system.carac.force.value, parseInt(system.carac.taille.value) + 4);
|
||||||
|
|
||||||
data.carac.derobee.value = Math.floor(parseInt(((21 - data.carac.taille.value)) + parseInt(data.carac.agilite.value)) / 2);
|
system.carac.derobee.value = Math.floor(parseInt(((21 - system.carac.taille.value)) + parseInt(system.carac.agilite.value)) / 2);
|
||||||
let bonusDomKey = Math.floor((parseInt(data.carac.force.value) + parseInt(data.carac.taille.value)) / 2);
|
let bonusDomKey = Math.floor((parseInt(system.carac.force.value) + parseInt(system.carac.taille.value)) / 2);
|
||||||
bonusDomKey = Math.min(Math.max(bonusDomKey, 0), 32); // Clamp de securite
|
bonusDomKey = Math.min(Math.max(bonusDomKey, 0), 32); // Clamp de securite
|
||||||
|
|
||||||
let tailleData = tableCaracDerivee[bonusDomKey];
|
let tailleData = tableCaracDerivee[bonusDomKey];
|
||||||
data.attributs.plusdom.value = tailleData.plusdom;
|
system.attributs.plusdom.value = tailleData.plusdom;
|
||||||
|
|
||||||
data.attributs.sconst.value = RdDCarac.calculSConst(data.carac.constitution.value);
|
system.attributs.sconst.value = RdDCarac.calculSConst(system.carac.constitution.value);
|
||||||
data.attributs.sust.value = tableCaracDerivee[Number(data.carac.taille.value)].sust;
|
system.attributs.sust.value = tableCaracDerivee[Number(system.carac.taille.value)].sust;
|
||||||
|
|
||||||
data.attributs.encombrement.value = (parseInt(data.carac.force.value) + parseInt(data.carac.taille.value)) / 2;
|
system.attributs.encombrement.value = (parseInt(system.carac.force.value) + parseInt(system.carac.taille.value)) / 2;
|
||||||
data.carac.melee.value = Math.floor((parseInt(data.carac.force.value) + parseInt(data.carac.agilite.value)) / 2);
|
system.carac.melee.value = Math.floor((parseInt(system.carac.force.value) + parseInt(system.carac.agilite.value)) / 2);
|
||||||
data.carac.tir.value = Math.floor((parseInt(data.carac.vue.value) + parseInt(data.carac.dexterite.value)) / 2);
|
system.carac.tir.value = Math.floor((parseInt(system.carac.vue.value) + parseInt(system.carac.dexterite.value)) / 2);
|
||||||
data.carac.lancer.value = Math.floor((parseInt(data.carac.tir.value) + parseInt(data.carac.force.value)) / 2);
|
system.carac.lancer.value = Math.floor((parseInt(system.carac.tir.value) + parseInt(system.carac.force.value)) / 2);
|
||||||
|
|
||||||
data.sante.vie.max = Math.ceil((parseInt(data.carac.taille.value) + parseInt(data.carac.constitution.value)) / 2);
|
system.sante.vie.max = Math.ceil((parseInt(system.carac.taille.value) + parseInt(system.carac.constitution.value)) / 2);
|
||||||
|
|
||||||
data.sante.vie.value = Math.min(data.sante.vie.value, data.sante.vie.max)
|
system.sante.vie.value = Math.min(system.sante.vie.value, system.sante.vie.max)
|
||||||
data.sante.endurance.max = Math.max(parseInt(data.carac.taille.value) + parseInt(data.carac.constitution.value), parseInt(data.sante.vie.max) + parseInt(data.carac.volonte.value));
|
system.sante.endurance.max = Math.max(parseInt(system.carac.taille.value) + parseInt(system.carac.constitution.value), parseInt(system.sante.vie.max) + parseInt(system.carac.volonte.value));
|
||||||
data.sante.endurance.value = Math.min(data.sante.endurance.value, data.sante.endurance.max);
|
system.sante.endurance.value = Math.min(system.sante.endurance.value, system.sante.endurance.max);
|
||||||
data.sante.fatigue.max = data.sante.endurance.max * 2;
|
system.sante.fatigue.max = system.sante.endurance.max * 2;
|
||||||
data.sante.fatigue.value = Math.min(data.sante.fatigue.value, data.sante.fatigue.max);
|
system.sante.fatigue.value = Math.min(system.sante.fatigue.value, system.sante.fatigue.max);
|
||||||
|
|
||||||
//Compteurs
|
//Compteurs
|
||||||
data.reve.reve.max = data.carac.reve.value;
|
system.reve.reve.max = system.carac.reve.value;
|
||||||
data.compteurs.chance.max = data.carac.chance.value;
|
system.compteurs.chance.max = system.carac.chance.value;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -10,6 +10,7 @@ import { RdDResolutionTable } from "./rdd-resolution-table.js";
|
|||||||
import { RdDRoll } from "./rdd-roll.js";
|
import { RdDRoll } from "./rdd-roll.js";
|
||||||
import { RdDRollTables } from "./rdd-rolltables.js";
|
import { RdDRollTables } from "./rdd-rolltables.js";
|
||||||
import { ReglesOptionelles } from "./regles-optionelles.js";
|
import { ReglesOptionelles } from "./regles-optionelles.js";
|
||||||
|
import { STATUSES } from "./status-effects.js";
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
const premierRoundInit = [
|
const premierRoundInit = [
|
||||||
@ -66,7 +67,7 @@ export class RdDCombatManager extends Combat {
|
|||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
async finDeRound(options = { terminer: false }) {
|
async finDeRound(options = { terminer: false }) {
|
||||||
for (let combatant of this.data.combatants) {
|
for (let combatant of this.combatants) {
|
||||||
if (combatant.actor) {
|
if (combatant.actor) {
|
||||||
await combatant.actor.finDeRound(options);
|
await combatant.actor.finDeRound(options);
|
||||||
}
|
}
|
||||||
@ -78,8 +79,8 @@ export class RdDCombatManager extends Combat {
|
|||||||
|
|
||||||
/************************************************************************************/
|
/************************************************************************************/
|
||||||
async rollInitiative(ids, formula = undefined, messageOptions = {}) {
|
async rollInitiative(ids, formula = undefined, messageOptions = {}) {
|
||||||
console.log(`${game.data.system.data.title} | Combat.rollInitiative()`, ids, formula, messageOptions);
|
console.log(`${game.system.title} | Combat.rollInitiative()`, ids, formula, messageOptions);
|
||||||
// Structure input data
|
|
||||||
ids = typeof ids === "string" ? [ids] : ids;
|
ids = typeof ids === "string" ? [ids] : ids;
|
||||||
const currentId = this.combatant._id;
|
const currentId = this.combatant._id;
|
||||||
// calculate initiative
|
// calculate initiative
|
||||||
@ -87,19 +88,19 @@ export class RdDCombatManager extends Combat {
|
|||||||
const combatant = this.combatants.get(ids[cId]);
|
const combatant = this.combatants.get(ids[cId]);
|
||||||
let rollFormula = formula ?? RdDCombatManager.formuleInitiative(2, 10, 0, 0);
|
let rollFormula = formula ?? RdDCombatManager.formuleInitiative(2, 10, 0, 0);
|
||||||
if (!formula) {
|
if (!formula) {
|
||||||
if (combatant.actor.data.type == 'creature' || combatant.actor.data.type == 'entite') {
|
if (combatant.actor.type == 'creature' || combatant.actor.type == 'entite') {
|
||||||
const competence = combatant.actor.data.items.find(it => it.data.data.iscombat)
|
const competence = combatant.actor.items.find(it => it.system.iscombat)
|
||||||
if (competence) {
|
if (competence) {
|
||||||
rollFormula = RdDCombatManager.formuleInitiative(2, competence.data.carac_value, competence.data.niveau, 0);
|
rollFormula = RdDCombatManager.formuleInitiative(2, competence.system.carac_value, competence.system.niveau, 0);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
const armeCombat = combatant.actor.data.items.find(it => it.type == 'arme' && itemData.data.equipe)
|
const armeCombat = combatant.actor.itemTypes['arme'].find(it => it.system.equipe)
|
||||||
const compName = (armeCombat == undefined) ? "Corps à corps" : armeCombat.data.competence;
|
const compName = (armeCombat == undefined) ? "Corps à corps" : armeCombat.system.competence;
|
||||||
const competence = RdDItemCompetence.findCompetence(combatant.actor.data.items, compName);
|
const competence = RdDItemCompetence.findCompetence(combatant.actor.items, compName);
|
||||||
if (competence) {
|
if (competence) {
|
||||||
const carac = combatant.actor.data.data.carac[competence.data.defaut_carac].value;
|
const carac = combatant.actor.system.carac[competence.system.defaut_carac].value;
|
||||||
const niveau = competence.data.niveau;
|
const niveau = competence.system.niveau;
|
||||||
const bonusEcaille = (armeCombat?.data.magique) ? armeCombat.data.ecaille_efficacite : 0;
|
const bonusEcaille = (armeCombat?.system.magique) ? armeCombat.system.ecaille_efficacite : 0;
|
||||||
rollFormula = RdDCombatManager.formuleInitiative(2, carac, niveau, bonusEcaille);
|
rollFormula = RdDCombatManager.formuleInitiative(2, carac, niveau, bonusEcaille);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -155,37 +156,37 @@ export class RdDCombatManager extends Combat {
|
|||||||
// Gestion des armes 1/2 mains
|
// Gestion des armes 1/2 mains
|
||||||
let actionsArme = [];
|
let actionsArme = [];
|
||||||
for (const arme of armes) {
|
for (const arme of armes) {
|
||||||
let action = duplicate(Misc.data(arme));
|
let action = duplicate(arme)
|
||||||
if (action.data.equipe) {
|
if (action.system.equipe) {
|
||||||
let compData = competences.map(c => Misc.data(c)).find(c => c.name == action.data.competence);
|
let compData = competences.find(c => c.name == action.system.competence)
|
||||||
|
|
||||||
actionsArme.push(action);
|
actionsArme.push(action);
|
||||||
action.action = 'attaque';
|
action.action = 'attaque';
|
||||||
action.data.dommagesReels = Number(action.data.dommages);
|
action.system.dommagesReels = Number(action.system.dommages);
|
||||||
action.data.niveau = compData.data.niveau;
|
action.system.niveau = compData.system.niveau;
|
||||||
action.data.initiative = RdDCombatManager.calculInitiative(compData.data.niveau, carac[compData.data.defaut_carac].value);
|
action.system.initiative = RdDCombatManager.calculInitiative(compData.system.niveau, carac[compData.system.defaut_carac].value);
|
||||||
// Dupliquer les armes pouvant être à 1 main et 2 mains en patchant la compétence
|
// Dupliquer les armes pouvant être à 1 main et 2 mains en patchant la compétence
|
||||||
if (action.data.unemain && !action.data.deuxmains) {
|
if (action.system.unemain && !action.system.deuxmains) {
|
||||||
action.data.mainInfo = "(1m)";
|
action.system.mainInfo = "(1m)";
|
||||||
} else if (!action.data.unemain && action.data.deuxmains) {
|
} else if (!action.system.unemain && action.system.deuxmains) {
|
||||||
action.data.mainInfo = "(2m)";
|
action.system.mainInfo = "(2m)";
|
||||||
} else if (action.data.unemain && action.data.deuxmains) {
|
} else if (action.system.unemain && action.system.deuxmains) {
|
||||||
action.data.mainInfo = "(1m)";
|
action.system.mainInfo = "(1m)";
|
||||||
|
|
||||||
const comp2m = action.data.competence.replace(" 1 main", " 2 mains"); // Replace !
|
const comp2m = action.system.competence.replace(" 1 main", " 2 mains"); // Replace !
|
||||||
const comp = Misc.data(competences.find(c => c.name == comp2m));
|
const comp = competences.find(c => c.name == comp2m)
|
||||||
|
|
||||||
const arme2main = duplicate(action);
|
const arme2main = duplicate(action);
|
||||||
arme2main.data.mainInfo = "(2m)";
|
arme2main.system.mainInfo = "(2m)";
|
||||||
arme2main.data.niveau = comp.data.niveau;
|
arme2main.system.niveau = comp.system.niveau;
|
||||||
arme2main.data.competence = comp2m;
|
arme2main.system.competence = comp2m;
|
||||||
arme2main.data.initiative = RdDCombatManager.calculInitiative(arme2main.data.niveau, carac[comp.data.defaut_carac].value);
|
arme2main.system.initiative = RdDCombatManager.calculInitiative(arme2main.system.niveau, carac[comp.system.defaut_carac].value);
|
||||||
actionsArme.push(arme2main);
|
actionsArme.push(arme2main);
|
||||||
const containsSlash = action.data.dommages.includes("/");
|
const containsSlash = action.system.dommages.includes("/");
|
||||||
if (containsSlash) {
|
if (containsSlash) {
|
||||||
const tableauDegats = action.data.dommages.split("/");
|
const tableauDegats = action.system.dommages.split("/");
|
||||||
action.data.dommagesReels = Number(tableauDegats[0]);
|
action.system.dommagesReels = Number(tableauDegats[0]);
|
||||||
arme2main.data.dommagesReels = Number(tableauDegats[1]);
|
arme2main.system.dommagesReels = Number(tableauDegats[1]);
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
ui.notifications.info("Les dommages de l'arme à 1/2 mains " + action.name + " ne sont pas corrects (ie sous la forme X/Y)");
|
ui.notifications.info("Les dommages de l'arme à 1/2 mains " + action.name + " ne sont pas corrects (ie sous la forme X/Y)");
|
||||||
@ -193,7 +194,12 @@ export class RdDCombatManager extends Combat {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return actionsArme.sort(Misc.ascending(armeData => armeData.name + (armeData.data.mainInfo ?? '')));
|
return actionsArme.sort(Misc.ascending(armeData => armeData.name + (armeData.system.mainInfo ?? '')));
|
||||||
|
}
|
||||||
|
|
||||||
|
static listActionsCreature(competences) {
|
||||||
|
return competences.filter(it => RdDItemCompetenceCreature.isCompetenceAttaque(it))
|
||||||
|
.map(it => RdDItemCompetenceCreature.toActionArme(it));
|
||||||
}
|
}
|
||||||
|
|
||||||
static listActionsPossessions(actor) {
|
static listActionsPossessions(actor) {
|
||||||
@ -202,9 +208,9 @@ export class RdDCombatManager extends Combat {
|
|||||||
return {
|
return {
|
||||||
name: p.name,
|
name: p.name,
|
||||||
action: 'conjurer',
|
action: 'conjurer',
|
||||||
data: {
|
system: {
|
||||||
competence: p.name,
|
competence: p.name,
|
||||||
possessionid: p.data.data.possessionid,
|
possessionid: p.system.possessionid,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}));
|
}));
|
||||||
@ -217,21 +223,19 @@ export class RdDCombatManager extends Combat {
|
|||||||
if (actions.length>0) {
|
if (actions.length>0) {
|
||||||
return actions;
|
return actions;
|
||||||
}
|
}
|
||||||
let items = actor.data.items;
|
|
||||||
if (actor.isCreature()) {
|
if (actor.isCreature()) {
|
||||||
actions = actions.concat(items.filter(it => RdDItemCompetenceCreature.isCompetenceAttaque(it))
|
actions = actions.concat(RdDCombatManager.listActionsCreature(actor.itemTypes['competencecreature']));
|
||||||
.map(competence => RdDItemCompetenceCreature.toActionArme(competence)));
|
|
||||||
} else {
|
} else {
|
||||||
// Recupération des items 'arme'
|
// Recupération des items 'arme'
|
||||||
let armes = items.filter(it => RdDItemArme.isArmeUtilisable(it))
|
const armes = actor.itemTypes['arme'].filter(it => RdDItemArme.isArmeUtilisable(it))
|
||||||
//.concat(RdDItemArme.empoignade())
|
//.concat(RdDItemArme.empoignade())
|
||||||
.concat(RdDItemArme.mainsNues());
|
.concat(RdDItemArme.mainsNues());
|
||||||
|
|
||||||
let competences = items.filter(it => it.type == 'competence');
|
const competences = actor.itemTypes['competence'];
|
||||||
actions = actions.concat(RdDCombatManager.listActionsArmes(armes, competences, actor.data.data.carac));
|
actions = actions.concat(RdDCombatManager.listActionsArmes(armes, competences, actor.system.carac));
|
||||||
|
|
||||||
if (actor.data.data.attributs.hautrevant.value) {
|
if (actor.system.attributs.hautrevant.value) {
|
||||||
actions.push({ name: "Draconic", action: 'haut-reve', data: { initOnly: true, competence: "Draconic" } });
|
actions.push({ name: "Draconic", action: 'haut-reve', system: { initOnly: true, competence: "Draconic" } });
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -249,14 +253,14 @@ export class RdDCombatManager extends Combat {
|
|||||||
static processPremierRoundInit() {
|
static processPremierRoundInit() {
|
||||||
// Check if we have the whole init !
|
// Check if we have the whole init !
|
||||||
if (Misc.isUniqueConnectedGM() && game.combat.current.round == 1) {
|
if (Misc.isUniqueConnectedGM() && game.combat.current.round == 1) {
|
||||||
let initMissing = game.combat.data.combatants.find(it => !it.initiative);
|
let initMissing = game.combat.combatants.find(it => !it.initiative);
|
||||||
if (!initMissing) { // Premier round !
|
if (!initMissing) { // Premier round !
|
||||||
for (let combatant of game.combat.data.combatants) {
|
for (let combatant of game.combat.combatants) {
|
||||||
let action = combatant.initiativeData?.arme;
|
let action = combatant.initiativeData?.arme;
|
||||||
//console.log("Parsed !!!", combatant, initDone, game.combat.current, arme);
|
//console.log("Parsed !!!", combatant, initDone, game.combat.current, arme);
|
||||||
if (action && action.type == "arme") {
|
if (action && action.type == "arme") {
|
||||||
for (let initData of premierRoundInit) {
|
for (let initData of premierRoundInit) {
|
||||||
if (Grammar.toLowerCaseNoAccentNoSpace(action.data.initpremierround).includes(initData.pattern)) {
|
if (Grammar.toLowerCaseNoAccentNoSpace(action.system.initpremierround).includes(initData.pattern)) {
|
||||||
let msg = `<h4>L'initiative de ${combatant.actor.name} a été modifiée !</h4>
|
let msg = `<h4>L'initiative de ${combatant.actor.name} a été modifiée !</h4>
|
||||||
<hr>
|
<hr>
|
||||||
<div>
|
<div>
|
||||||
@ -327,22 +331,16 @@ export class RdDCombatManager extends Combat {
|
|||||||
initOffset = 9;
|
initOffset = 9;
|
||||||
initInfo = "Draconic"
|
initInfo = "Draconic"
|
||||||
} else {
|
} else {
|
||||||
compData = Misc.data(RdDItemCompetence.findCompetence(combatant.actor.data.items, action.data.competence));
|
compData = RdDItemCompetence.findCompetence(combatant.actor.items, action.system.competence);
|
||||||
compNiveau = compData.data.niveau;
|
compNiveau = compData.system.niveau;
|
||||||
initInfo = action.name + " / " + action.data.competence;
|
initInfo = action.name + " / " + action.system.competence;
|
||||||
|
|
||||||
if (combatant.actor.data.type == 'creature' || combatant.actor.data.type == 'entite') {
|
if (combatant.actor.type == 'creature' || combatant.actor.type == 'entite') {
|
||||||
caracForInit = compData.data.carac_value;
|
caracForInit = compData.system.carac_value;
|
||||||
if (compData.data.categorie == "lancer") {
|
} else {
|
||||||
initOffset = 7;
|
caracForInit = combatant.actor.system.carac[compData.system.defaut_carac].value;
|
||||||
}
|
|
||||||
else {
|
|
||||||
initOffset = 5;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
caracForInit = Misc.data(combatant.actor).data.carac[compData.data.defaut_carac].value;
|
|
||||||
initOffset = RdDCombatManager._baseInitOffset(compData.data.categorie, action);
|
|
||||||
}
|
}
|
||||||
|
initOffset = RdDCombatManager._baseInitOffset(compData.system.categorie, action);
|
||||||
}
|
}
|
||||||
|
|
||||||
let malus = combatant.actor.getEtatGeneral(); // Prise en compte état général
|
let malus = combatant.actor.getEtatGeneral(); // Prise en compte état général
|
||||||
@ -360,10 +358,12 @@ export class RdDCombatManager extends Combat {
|
|||||||
if (categorie == "lancer") { // Offset de principe pour les armes de jet
|
if (categorie == "lancer") { // Offset de principe pour les armes de jet
|
||||||
return 7;
|
return 7;
|
||||||
}
|
}
|
||||||
// Offset de principe pour les armes de jet
|
switch (arme.system.cac) {
|
||||||
switch (arme.data.cac) {
|
case "empoignade":
|
||||||
case "empoignade": return 3;
|
return 3;
|
||||||
case "pugilat": return 4;
|
case "pugilat":
|
||||||
|
case "naturelle":
|
||||||
|
return 4;
|
||||||
}
|
}
|
||||||
return 5;
|
return 5;
|
||||||
}
|
}
|
||||||
@ -384,7 +384,7 @@ export class RdDCombatManager extends Combat {
|
|||||||
let menuItems = [];
|
let menuItems = [];
|
||||||
for (let action of actions) {
|
for (let action of actions) {
|
||||||
menuItems.push({
|
menuItems.push({
|
||||||
name: action.data.competence,
|
name: action.system.competence,
|
||||||
icon: "<i class='fas fa-dice-d6'></i>",
|
icon: "<i class='fas fa-dice-d6'></i>",
|
||||||
callback: target => { RdDCombatManager.rollInitiativeAction(combatantId, action) }
|
callback: target => { RdDCombatManager.rollInitiativeAction(combatantId, action) }
|
||||||
});
|
});
|
||||||
@ -415,7 +415,7 @@ export class RdDCombat {
|
|||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static onUpdateCombat(combat, change, options, userId) {
|
static onUpdateCombat(combat, change, options, userId) {
|
||||||
if (combat.data.round != 0 && combat.turns && combat.data.active) {
|
if (combat.round != 0 && combat.turns && combat.active) {
|
||||||
RdDCombat.combatNouveauTour(combat);
|
RdDCombat.combatNouveauTour(combat);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -456,8 +456,8 @@ export class RdDCombat {
|
|||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
const defender = target?.actor;
|
const defender = target?.actor;
|
||||||
const defenderTokenId = target?.data._id;
|
const defenderTokenId = target?.id;
|
||||||
if ( defender.type == 'entite' && defender.data.data.definition.typeentite == ENTITE_NONINCARNE) {
|
if ( defender.type == 'entite' && defender.system.definition.typeentite == ENTITE_NONINCARNE) {
|
||||||
ui.notifications.warn("Vous ne pouvez pas cibler une entité non incarnée !!!!");
|
ui.notifications.warn("Vous ne pouvez pas cibler une entité non incarnée !!!!");
|
||||||
} else {
|
} else {
|
||||||
return this.create(attacker, defender, defenderTokenId, target)
|
return this.create(attacker, defender, defenderTokenId, target)
|
||||||
@ -558,8 +558,8 @@ export class RdDCombat {
|
|||||||
this.attacker = attacker;
|
this.attacker = attacker;
|
||||||
this.defender = defender;
|
this.defender = defender;
|
||||||
this.target = target;
|
this.target = target;
|
||||||
this.attackerId = this.attacker.data._id;
|
this.attackerId = this.attacker.id;
|
||||||
this.defenderId = this.defender.data._id;
|
this.defenderId = this.defender.id;
|
||||||
this.defenderTokenId = defenderTokenId;
|
this.defenderTokenId = defenderTokenId;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -691,7 +691,7 @@ export class RdDCombat {
|
|||||||
if (!await this.accorderEntite('avant-attaque')) {
|
if (!await this.accorderEntite('avant-attaque')) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (arme.data.cac == 'empoignade' && this.attacker.isCombatTouche()) {
|
if (arme.system.cac == 'empoignade' && this.attacker.isCombatTouche()) {
|
||||||
ChatMessage.create({
|
ChatMessage.create({
|
||||||
alias: this.attacker.name,
|
alias: this.attacker.name,
|
||||||
whisper: ChatUtility.getWhisperRecipientsAndGMs(this.attacker.name),
|
whisper: ChatUtility.getWhisperRecipientsAndGMs(this.attacker.name),
|
||||||
@ -734,7 +734,7 @@ export class RdDCombat {
|
|||||||
_prepareAttaque(competence, arme) {
|
_prepareAttaque(competence, arme) {
|
||||||
let rollData = {
|
let rollData = {
|
||||||
passeArme: randomID(16),
|
passeArme: randomID(16),
|
||||||
mortalite: arme?.data.mortalite,
|
mortalite: arme?.system.mortalite,
|
||||||
coupsNonMortels: false,
|
coupsNonMortels: false,
|
||||||
competence: competence,
|
competence: competence,
|
||||||
surprise: this.attacker.getSurprise(true),
|
surprise: this.attacker.getSurprise(true),
|
||||||
@ -751,8 +751,8 @@ export class RdDCombat {
|
|||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
// sans armes: à mains nues
|
// sans armes: à mains nues
|
||||||
const niveau = competence.data.niveau;
|
const niveau = competence.system.niveau;
|
||||||
const init = RdDCombatManager.calculInitiative(niveau, Misc.templateData(this.attacker).carac['melee'].value);
|
const init = RdDCombatManager.calculInitiative(niveau, this.attacker.system.carac['melee'].value);
|
||||||
rollData.arme = RdDItemArme.mainsNues({ niveau: niveau, initiative: init });
|
rollData.arme = RdDItemArme.mainsNues({ niveau: niveau, initiative: init });
|
||||||
}
|
}
|
||||||
return rollData;
|
return rollData;
|
||||||
@ -765,9 +765,9 @@ export class RdDCombat {
|
|||||||
// force toujours, sauf empoignade
|
// force toujours, sauf empoignade
|
||||||
// finesse seulement en mélée, pour l'empoignade, ou si la difficulté libre est de -1 minimum
|
// finesse seulement en mélée, pour l'empoignade, ou si la difficulté libre est de -1 minimum
|
||||||
// rapidité seulement en mêlée, si l'arme le permet, et si la difficulté libre est de -1 minimum
|
// rapidité seulement en mêlée, si l'arme le permet, et si la difficulté libre est de -1 minimum
|
||||||
const isForce = !rollData.arme.data.empoignade;
|
const isForce = !rollData.arme.system.empoignade;
|
||||||
const isFinesse = rollData.arme.data.empoignade || isMeleeDiffNegative;
|
const isFinesse = rollData.arme.system.empoignade || isMeleeDiffNegative;
|
||||||
const isRapide = !rollData.arme.data.empoignade && isMeleeDiffNegative && rollData.arme.data.rapide;
|
const isRapide = !rollData.arme.system.empoignade && isMeleeDiffNegative && rollData.arme.system.rapide;
|
||||||
// si un seul choix possible, le prendre
|
// si un seul choix possible, le prendre
|
||||||
if (isForce && !isFinesse && !isRapide) {
|
if (isForce && !isFinesse && !isRapide) {
|
||||||
return await this.choixParticuliere(rollData, "force");
|
return await this.choixParticuliere(rollData, "force");
|
||||||
@ -802,7 +802,7 @@ export class RdDCombat {
|
|||||||
attackerRoll.dmg = RdDBonus.dmg(attackerRoll, this.attacker.getBonusDegat(), this.defender.isEntite());
|
attackerRoll.dmg = RdDBonus.dmg(attackerRoll, this.attacker.getBonusDegat(), this.defender.isEntite());
|
||||||
let defenderRoll = { attackerRoll: attackerRoll, passeArme: attackerRoll.passeArme, show: {} }
|
let defenderRoll = { attackerRoll: attackerRoll, passeArme: attackerRoll.passeArme, show: {} }
|
||||||
attackerRoll.show = {
|
attackerRoll.show = {
|
||||||
cible: this.target ? this.defender.data.name : 'la cible',
|
cible: this.target ? this.defender.system.name : 'la cible',
|
||||||
isRecul: (attackerRoll.particuliere == 'force' || attackerRoll.tactique == 'charge')
|
isRecul: (attackerRoll.particuliere == 'force' || attackerRoll.tactique == 'charge')
|
||||||
}
|
}
|
||||||
await RdDResolutionTable.displayRollData(attackerRoll, this.attacker, 'chat-resultat-attaque.html');
|
await RdDResolutionTable.displayRollData(attackerRoll, this.attacker, 'chat-resultat-attaque.html');
|
||||||
@ -823,7 +823,7 @@ export class RdDCombat {
|
|||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
async _sendMessageDefense(attackerRoll, defenderRoll, essaisPrecedents = undefined) {
|
async _sendMessageDefense(attackerRoll, defenderRoll, essaisPrecedents = undefined) {
|
||||||
console.log("RdDCombat._sendMessageDefense", attackerRoll, defenderRoll, essaisPrecedents, " / ", this.attacker, this.target, this.attackerId, attackerRoll.competence.data.categorie);
|
console.log("RdDCombat._sendMessageDefense", attackerRoll, defenderRoll, essaisPrecedents, " / ", this.attacker, this.target, this.attackerId, attackerRoll.competence.system.categorie);
|
||||||
|
|
||||||
this.removeChatMessageActionsPasseArme(attackerRoll.passeArme);
|
this.removeChatMessageActionsPasseArme(attackerRoll.passeArme);
|
||||||
if (essaisPrecedents) {
|
if (essaisPrecedents) {
|
||||||
@ -831,16 +831,16 @@ export class RdDCombat {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// # utilisation esquive
|
// # utilisation esquive
|
||||||
const corpsACorps = Misc.data(this.defender.getCompetence("Corps à corps", { onMessage: it => console.info(it, this.defender) }));
|
const corpsACorps = this.defender.getCompetence("Corps à corps", { onMessage: it => console.info(it, this.defender) });
|
||||||
const esquives = duplicate(this.defender.getCompetences("esquive", { onMessage: it => console.info(it, this.defender) }).map(c => Misc.data(c)));
|
const esquives = duplicate(this.defender.getCompetences("esquive", { onMessage: it => console.info(it, this.defender) }))
|
||||||
esquives.forEach(e => e.usages = e?.id ? this.defender.getItemUse(e.id) : 0);
|
esquives.forEach(e => e.system.nbUsage = e?._id ? this.defender.getItemUse(e._id) : 0);
|
||||||
|
|
||||||
const paramChatDefense = {
|
const paramChatDefense = {
|
||||||
passeArme: attackerRoll.passeArme,
|
passeArme: attackerRoll.passeArme,
|
||||||
essais: attackerRoll.essais,
|
essais: attackerRoll.essais,
|
||||||
isPossession: this.isPossession(attackerRoll),
|
isPossession: this.isPossession(attackerRoll),
|
||||||
defender: Misc.data(this.defender),
|
defender: this.defender,
|
||||||
attacker: Misc.data(this.attacker),
|
attacker: this.attacker,
|
||||||
attackerId: this.attackerId,
|
attackerId: this.attackerId,
|
||||||
esquives: esquives,
|
esquives: esquives,
|
||||||
defenderTokenId: this.defenderTokenId,
|
defenderTokenId: this.defenderTokenId,
|
||||||
@ -848,7 +848,7 @@ export class RdDCombat {
|
|||||||
armes: this._filterArmesParade(this.defender, attackerRoll.competence, attackerRoll.arme),
|
armes: this._filterArmesParade(this.defender, attackerRoll.competence, attackerRoll.arme),
|
||||||
diffLibre: attackerRoll.ajustements?.diffLibre?.value ?? 0,
|
diffLibre: attackerRoll.ajustements?.diffLibre?.value ?? 0,
|
||||||
attaqueParticuliere: attackerRoll.particuliere,
|
attaqueParticuliere: attackerRoll.particuliere,
|
||||||
attaqueCategorie: attackerRoll.competence.data.categorie,
|
attaqueCategorie: attackerRoll.competence.system.categorie,
|
||||||
attaqueArme: attackerRoll.arme,
|
attaqueArme: attackerRoll.arme,
|
||||||
surprise: this.defender.getSurprise(true),
|
surprise: this.defender.getSurprise(true),
|
||||||
dmg: attackerRoll.dmg,
|
dmg: attackerRoll.dmg,
|
||||||
@ -880,8 +880,8 @@ export class RdDCombat {
|
|||||||
// envoyer le message au destinataire
|
// envoyer le message au destinataire
|
||||||
game.socket.emit(SYSTEM_SOCKET_ID, {
|
game.socket.emit(SYSTEM_SOCKET_ID, {
|
||||||
msg: "msg_defense", data: {
|
msg: "msg_defense", data: {
|
||||||
attackerId: this.attacker?.data._id,
|
attackerId: this.attacker?.id,
|
||||||
defenderId: this.defender?.data._id,
|
defenderId: this.defender?.id,
|
||||||
defenderTokenId: this.defenderTokenId,
|
defenderTokenId: this.defenderTokenId,
|
||||||
defenderRoll: defenderRoll,
|
defenderRoll: defenderRoll,
|
||||||
paramChatDefense: paramChatDefense,
|
paramChatDefense: paramChatDefense,
|
||||||
@ -892,13 +892,11 @@ export class RdDCombat {
|
|||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
_filterArmesParade(defender, competence) {
|
_filterArmesParade(defender, competence) {
|
||||||
let items = defender.data.items;
|
let items = defender.items.filter(it => RdDItemArme.isArmeUtilisable(it) || RdDItemCompetenceCreature.isCompetenceParade(it))
|
||||||
items = items.filter(it => RdDItemArme.isArmeUtilisable(it) || RdDItemCompetenceCreature.isCompetenceParade(it))
|
|
||||||
.map(Misc.data);
|
|
||||||
for (let item of items) {
|
for (let item of items) {
|
||||||
item.data.nbUsage = defender.getItemUse(item._id); // Ajout du # d'utilisation ce round
|
item.system.nbUsage = defender.getItemUse(item.id); // Ajout du # d'utilisation ce round
|
||||||
}
|
}
|
||||||
switch (competence.data.categorie) {
|
switch (competence.system.categorie) {
|
||||||
case 'tir':
|
case 'tir':
|
||||||
case 'lancer':
|
case 'lancer':
|
||||||
return items.filter(item => RdDItemArme.getCategorieParade(item) == 'boucliers')
|
return items.filter(item => RdDItemArme.getCategorieParade(item) == 'boucliers')
|
||||||
@ -917,7 +915,7 @@ export class RdDCombat {
|
|||||||
whisper: ChatUtility.getWhisperRecipientsAndGMs(this.attacker.name),
|
whisper: ChatUtility.getWhisperRecipientsAndGMs(this.attacker.name),
|
||||||
content: await renderTemplate('systems/foundryvtt-reve-de-dragon/templates/chat-demande-attaque-etotal.html', {
|
content: await renderTemplate('systems/foundryvtt-reve-de-dragon/templates/chat-demande-attaque-etotal.html', {
|
||||||
attackerId: this.attackerId,
|
attackerId: this.attackerId,
|
||||||
attacker: Misc.data(this.attacker),
|
attacker: this.attacker,
|
||||||
defenderTokenId: this.defenderTokenId,
|
defenderTokenId: this.defenderTokenId,
|
||||||
essais: attackerRoll.essais
|
essais: attackerRoll.essais
|
||||||
})
|
})
|
||||||
@ -930,7 +928,7 @@ export class RdDCombat {
|
|||||||
console.log("RdDCombat._onEchecTotal >>>", rollData);
|
console.log("RdDCombat._onEchecTotal >>>", rollData);
|
||||||
|
|
||||||
const arme = rollData.arme;
|
const arme = rollData.arme;
|
||||||
const avecArme = !['', 'sans-armes', 'armes-naturelles'].includes(arme?.data.categorie_parade ?? '');
|
const avecArme = !['', 'sans-armes', 'armes-naturelles'].includes(arme?.system.categorie_parade ?? '');
|
||||||
const action = (rollData.attackerRoll ? (arme ? "la parade" : "l'esquive") : "l'attaque");
|
const action = (rollData.attackerRoll ? (arme ? "la parade" : "l'esquive") : "l'attaque");
|
||||||
ChatUtility.createChatWithRollMode(this.defender.name, {
|
ChatUtility.createChatWithRollMode(this.defender.name, {
|
||||||
content: `<strong>Maladresse à ${action}!</strong> ` + await RdDRollTables.getMaladresse({ arme: avecArme })
|
content: `<strong>Maladresse à ${action}!</strong> ` + await RdDRollTables.getMaladresse({ arme: avecArme })
|
||||||
@ -949,7 +947,7 @@ export class RdDCombat {
|
|||||||
console.log("RdDCombat.choixParticuliere >>>", rollData, choix);
|
console.log("RdDCombat.choixParticuliere >>>", rollData, choix);
|
||||||
|
|
||||||
if (choix != "rapidite") {
|
if (choix != "rapidite") {
|
||||||
this.attacker.incDecItemUse(rollData.arme._id);
|
this.attacker.incDecItemUse(rollData.arme.id);
|
||||||
}
|
}
|
||||||
|
|
||||||
this.removeChatMessageActionsPasseArme(rollData.passeArme);
|
this.removeChatMessageActionsPasseArme(rollData.passeArme);
|
||||||
@ -961,10 +959,10 @@ export class RdDCombat {
|
|||||||
async parade(attackerRoll, armeParadeId) {
|
async parade(attackerRoll, armeParadeId) {
|
||||||
const arme = this.defender.getArmeParade(armeParadeId);
|
const arme = this.defender.getArmeParade(armeParadeId);
|
||||||
console.log("RdDCombat.parade >>>", attackerRoll, armeParadeId, arme);
|
console.log("RdDCombat.parade >>>", attackerRoll, armeParadeId, arme);
|
||||||
const competence = Misc.templateData(arme)?.competence;
|
const competence = arme?.system?.competence;
|
||||||
if (competence == undefined)
|
if (competence == undefined)
|
||||||
{
|
{
|
||||||
console.error("Pas de compétence de parade associée à ", arme) ;
|
console.error("Pas de compétence de parade associée à ", arme?.name, armeParadeId) ;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -996,12 +994,12 @@ export class RdDCombat {
|
|||||||
passeArme: attackerRoll.passeArme,
|
passeArme: attackerRoll.passeArme,
|
||||||
diffLibre: attackerRoll.diffLibre,
|
diffLibre: attackerRoll.diffLibre,
|
||||||
attackerRoll: attackerRoll,
|
attackerRoll: attackerRoll,
|
||||||
competence: Misc.data(this.defender.getCompetence(competenceParade)),
|
competence: this.defender.getCompetence(competenceParade),
|
||||||
arme: armeParade,
|
arme: armeParade,
|
||||||
surprise: this.defender.getSurprise(true),
|
surprise: this.defender.getSurprise(true),
|
||||||
needParadeSignificative: ReglesOptionelles.isUsing('categorieParade') && RdDItemArme.needParadeSignificative(attackerRoll.arme, armeParade),
|
needParadeSignificative: ReglesOptionelles.isUsing('categorieParade') && RdDItemArme.needParadeSignificative(attackerRoll.arme, armeParade),
|
||||||
needResist: RdDItemArme.needArmeResist(attackerRoll.arme, armeParade),
|
needResist: RdDItemArme.needArmeResist(attackerRoll.arme, armeParade),
|
||||||
carac: Misc.templateData(this.defender).carac,
|
carac: this.defender.system.carac,
|
||||||
show: {}
|
show: {}
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -1045,7 +1043,7 @@ export class RdDCombat {
|
|||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
async esquive(attackerRoll, compId, compName) {
|
async esquive(attackerRoll, compId, compName) {
|
||||||
const esquive = Misc.data(this.defender.getCompetence(compId) ?? this.defender.getCompetence(compName));
|
const esquive = this.defender.getCompetence(compId) ?? this.defender.getCompetence(compName)
|
||||||
if (esquive == undefined) {
|
if (esquive == undefined) {
|
||||||
ui.notifications.error(this.defender.name + " n'a pas de compétence " + compName);
|
ui.notifications.error(this.defender.name + " n'a pas de compétence " + compName);
|
||||||
return;
|
return;
|
||||||
@ -1079,7 +1077,7 @@ export class RdDCombat {
|
|||||||
competence: competence,
|
competence: competence,
|
||||||
surprise: this.defender.getSurprise(true),
|
surprise: this.defender.getSurprise(true),
|
||||||
surpriseDefenseur: this.defender.getSurprise(true),
|
surpriseDefenseur: this.defender.getSurprise(true),
|
||||||
carac: Misc.templateData(this.defender).carac,
|
carac: this.defender.system.carac,
|
||||||
show: {}
|
show: {}
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -1129,11 +1127,11 @@ export class RdDCombat {
|
|||||||
|
|
||||||
const dmg = attackerRoll.dmg.dmgArme + attackerRoll.dmg.dmgActor;
|
const dmg = attackerRoll.dmg.dmgArme + attackerRoll.dmg.dmgActor;
|
||||||
let arme = defenderRoll.arme;
|
let arme = defenderRoll.arme;
|
||||||
let resistance = Misc.toInt(arme.data.resistance);
|
let resistance = Misc.toInt(arme.system.resistance);
|
||||||
if (arme.data.magique) {
|
if (arme.system.magique) {
|
||||||
defenderRoll.show.deteriorationArme = 'resiste'; // Par défaut
|
defenderRoll.show.deteriorationArme = 'resiste'; // Par défaut
|
||||||
if (arme.data.resistance_magique == undefined) arme.data.resistance_magique = 0; // Quick fix
|
if (arme.system.resistance_magique == undefined) arme.system.resistance_magique = 0; // Quick fix
|
||||||
if (dmg > arme.data.resistance_magique) { // Jet uniquement si dommages supérieur à résistance magique (cf. 274)
|
if (dmg > arme.system.resistance_magique) { // Jet uniquement si dommages supérieur à résistance magique (cf. 274)
|
||||||
// Jet de résistance de l'arme de parade (p.132)
|
// Jet de résistance de l'arme de parade (p.132)
|
||||||
let resistRoll = await RdDResolutionTable.rollData({
|
let resistRoll = await RdDResolutionTable.rollData({
|
||||||
caracValue: resistance,
|
caracValue: resistance,
|
||||||
@ -1141,11 +1139,11 @@ export class RdDCombat {
|
|||||||
showDice: HIDE_DICE
|
showDice: HIDE_DICE
|
||||||
});
|
});
|
||||||
if (!resistRoll.rolled.isSuccess) {
|
if (!resistRoll.rolled.isSuccess) {
|
||||||
let perteResistance = (dmg - arme.data.resistance_magique)
|
let perteResistance = (dmg - arme.system.resistance_magique)
|
||||||
resistance -= perteResistance;
|
resistance -= perteResistance;
|
||||||
defenderRoll.show.deteriorationArme = resistance <= 0 ? 'brise' : 'perte';
|
defenderRoll.show.deteriorationArme = resistance <= 0 ? 'brise' : 'perte';
|
||||||
defenderRoll.show.perteResistance = perteResistance;
|
defenderRoll.show.perteResistance = perteResistance;
|
||||||
this.defender.updateEmbeddedDocuments('Item', [{ _id: defenderRoll.arme._id, 'data.resistance': resistance }]);
|
this.defender.updateEmbeddedDocuments('Item', [{ _id: defenderRoll.arme._id, 'system.resistance': resistance }]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
@ -1161,14 +1159,14 @@ export class RdDCombat {
|
|||||||
resistance -= dmg;
|
resistance -= dmg;
|
||||||
defenderRoll.show.deteriorationArme = resistance <= 0 ? 'brise' : 'perte';
|
defenderRoll.show.deteriorationArme = resistance <= 0 ? 'brise' : 'perte';
|
||||||
defenderRoll.show.perteResistance = dmg;
|
defenderRoll.show.perteResistance = dmg;
|
||||||
this.defender.updateEmbeddedDocuments('Item', [{ _id: defenderRoll.arme._id, 'data.resistance': resistance }]);
|
this.defender.updateEmbeddedDocuments('Item', [{ _id: defenderRoll.arme._id, 'system.resistance': resistance }]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// Si l'arme de parade n'est pas un bouclier, jet de désarmement (p.132)
|
// Si l'arme de parade n'est pas un bouclier, jet de désarmement (p.132)
|
||||||
if (ReglesOptionelles.isUsing('defenseurDesarme') && resistance > 0 && RdDItemArme.getCategorieParade(defenderRoll.arme) != 'boucliers') {
|
if (ReglesOptionelles.isUsing('defenseurDesarme') && resistance > 0 && RdDItemArme.getCategorieParade(defenderRoll.arme) != 'boucliers') {
|
||||||
let desarme = await RdDResolutionTable.rollData({
|
let desarme = await RdDResolutionTable.rollData({
|
||||||
caracValue: this.defender.getForce(),
|
caracValue: this.defender.getForce(),
|
||||||
finalLevel: Misc.toInt(defenderRoll.competence.data.niveau) - dmg,
|
finalLevel: Misc.toInt(defenderRoll.competence.system.niveau) - dmg,
|
||||||
showDice: HIDE_DICE
|
showDice: HIDE_DICE
|
||||||
});
|
});
|
||||||
defenderRoll.show.desarme = desarme.rolled.isEchec;
|
defenderRoll.show.desarme = desarme.rolled.isEchec;
|
||||||
@ -1187,7 +1185,7 @@ export class RdDCombat {
|
|||||||
defenderRoll.show.recul = 'encaisse';
|
defenderRoll.show.recul = 'encaisse';
|
||||||
} else if (rollRecul.rolled.isETotal || this._isReculCauseChute(impact)) {
|
} else if (rollRecul.rolled.isETotal || this._isReculCauseChute(impact)) {
|
||||||
defenderRoll.show.recul = 'chute';
|
defenderRoll.show.recul = 'chute';
|
||||||
await this.defender.setStatusEffect("EFFECT.StatusProne", true);
|
await this.defender.setEffect(STATUSES.StatusProne, true);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
defenderRoll.show.recul = 'recul';
|
defenderRoll.show.recul = 'recul';
|
||||||
@ -1211,7 +1209,7 @@ export class RdDCombat {
|
|||||||
_computeImpactRecul(attaque) {
|
_computeImpactRecul(attaque) {
|
||||||
const taille = this.defender.getTaille();
|
const taille = this.defender.getTaille();
|
||||||
const force = this.attacker.getForce();
|
const force = this.attacker.getForce();
|
||||||
const dommages = attaque.arme.data.dommagesReels ?? attaque.arme.data.dommages;
|
const dommages = attaque.arme.system.dommagesReels ?? attaque.arme.system.dommages;
|
||||||
return taille - (force + dommages);
|
return taille - (force + dommages);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1254,7 +1252,7 @@ export class RdDCombat {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
let rolled = await RdDResolutionTable.roll(this.attacker.getReveActuel(), - Number(Misc.templateData(this.defender).carac.niveau.value));
|
let rolled = await RdDResolutionTable.roll(this.attacker.getReveActuel(), - Number(this.defender.system.carac.niveau.value));
|
||||||
|
|
||||||
let message = {
|
let message = {
|
||||||
content: "Jet de points actuels de rêve à " + rolled.finalLevel + RdDResolutionTable.explain(rolled) + "<br>",
|
content: "Jet de points actuels de rêve à " + rolled.finalLevel + RdDResolutionTable.explain(rolled) + "<br>",
|
||||||
@ -1275,25 +1273,25 @@ export class RdDCombat {
|
|||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static async displayActorCombatStatus(combat, actor) {
|
static async displayActorCombatStatus(combat, actor) {
|
||||||
let data = {
|
let formData = {
|
||||||
combatId: combat._id,
|
combatId: combat._id,
|
||||||
alias: actor.name,
|
alias: actor.name,
|
||||||
etatGeneral: actor.getEtatGeneral(),
|
etatGeneral: actor.getEtatGeneral(),
|
||||||
isSonne: actor.getSonne(),
|
isSonne: actor.getSonne(),
|
||||||
blessuresStatus: actor.computeResumeBlessure(),
|
blessuresStatus: actor.computeResumeBlessure(),
|
||||||
SConst: actor.getSConst(),
|
SConst: actor.getSConst(),
|
||||||
actorId: actor.data._id,
|
actorId: actor.id,
|
||||||
isGrave: false,
|
isGrave: false,
|
||||||
isCritique: false
|
isCritique: false
|
||||||
}
|
}
|
||||||
if (actor.countBlessuresNonSoigneeByName("critiques") > 0) { // Pour éviter le cumul grave + critique
|
if (actor.countBlessuresNonSoigneeByName("critiques") > 0) { // Pour éviter le cumul grave + critique
|
||||||
data.isCritique = true;
|
formData.isCritique = true;
|
||||||
} else if (actor.countBlessuresNonSoigneeByName("graves") > 0) {
|
} else if (actor.countBlessuresNonSoigneeByName("graves") > 0) {
|
||||||
data.isGrave = true;
|
formData.isGrave = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
ChatUtility.createChatWithRollMode(actor.name, {
|
ChatUtility.createChatWithRollMode(actor.name, {
|
||||||
content: await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/chat-actor-turn-summary.html`, data)
|
content: await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/chat-actor-turn-summary.html`, formData)
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -358,10 +358,9 @@ export class RdDCommands {
|
|||||||
|
|
||||||
async supprimerSignesDraconiquesEphemeres() {
|
async supprimerSignesDraconiquesEphemeres() {
|
||||||
game.actors.forEach(actor => {
|
game.actors.forEach(actor => {
|
||||||
const ephemeres = actor.filterItems(item => Misc.data(item).type = 'signedraconique' && Misc.data(item).data.ephemere)
|
const ephemeres = actor.items.filter(item => item.type = 'signedraconique' && item.system.ephemere);
|
||||||
.map(item => item.id);
|
|
||||||
if (ephemeres.length > 0) {
|
if (ephemeres.length > 0) {
|
||||||
actor.deleteEmbeddedDocuments("Item", ephemeres);
|
actor.deleteEmbeddedDocuments("Item", ephemeres.map(item => item.id));
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
return true;
|
return true;
|
||||||
|
@ -3,11 +3,11 @@ import { Misc } from "./misc.js";
|
|||||||
|
|
||||||
export class RddCompendiumOrganiser {
|
export class RddCompendiumOrganiser {
|
||||||
static init() {
|
static init() {
|
||||||
Hooks.on('renderCompendium', async (pack, html, data) => RddCompendiumOrganiser.onRenderCompendium(pack, html, data))
|
Hooks.on('renderCompendium', async (pack, html, compendiumData) => RddCompendiumOrganiser.onRenderCompendium(pack, html, compendiumData))
|
||||||
}
|
}
|
||||||
|
|
||||||
static async onRenderCompendium(compendium, html, data) {
|
static async onRenderCompendium(compendium, html, compendiumData) {
|
||||||
console.log('onRenderCompendium', compendium, html, data);
|
console.log('onRenderCompendium', compendium, html, compendiumData);
|
||||||
const pack = compendium.collection
|
const pack = compendium.collection
|
||||||
if (pack.metadata.system === SYSTEM_RDD) {
|
if (pack.metadata.system === SYSTEM_RDD) {
|
||||||
html.find('.directory-item').each((i, element) => {
|
html.find('.directory-item').each((i, element) => {
|
||||||
|
@ -18,18 +18,19 @@ const tableGemmes = {
|
|||||||
export class RdDGemme extends Item {
|
export class RdDGemme extends Item {
|
||||||
|
|
||||||
static getGemmeTypeOptionList() {
|
static getGemmeTypeOptionList() {
|
||||||
|
// TODO: look how to map object key-value pairs
|
||||||
let options = ""
|
let options = ""
|
||||||
for (let gemmeKey in tableGemmes) {
|
for (let gemmeKey in tableGemmes) {
|
||||||
let gemmeData = tableGemmes[gemmeKey];
|
options += `<option value="${gemmeKey}">${tableGemmes[gemmeKey].label}</option>`
|
||||||
options += `<option value="${gemmeKey}">${gemmeData.label}</option>`
|
|
||||||
}
|
}
|
||||||
return options;
|
return options;
|
||||||
}
|
}
|
||||||
|
|
||||||
static calculDataDerivees(data) {
|
|
||||||
data.cout = (data.taille * data.purete) + data.qualite;
|
static calculDataDerivees(gemme) {
|
||||||
data.inertie = 7 - data.purete;
|
gemme.system.cout = (gemme.system.taille * gemme.system.purete) + gemme.system.qualite;
|
||||||
data.enchantabilite = data.taille - data.inertie;
|
gemme.system.inertie = 7 - gemme.system.purete;
|
||||||
|
gemme.system.enchantabilite = gemme.system.taille - gemme.system.inertie;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,4 @@
|
|||||||
/* -------------------------------------------- */
|
|
||||||
import { RdDUtility } from "./rdd-utility.js";
|
import { RdDUtility } from "./rdd-utility.js";
|
||||||
import { Misc } from "./misc.js";
|
|
||||||
import { RdDCalendrier } from "./rdd-calendrier.js";
|
import { RdDCalendrier } from "./rdd-calendrier.js";
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
@ -8,11 +6,11 @@ export class RdDHerbes extends Item {
|
|||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static isHerbeSoin( botaniqueItem ) {
|
static isHerbeSoin( botaniqueItem ) {
|
||||||
return Misc.templateData(botaniqueItem).categorie == 'Soin';
|
return botaniqueItem.categorie == 'Soin';
|
||||||
}
|
}
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static isHerbeRepos( botaniqueItem ) {
|
static isHerbeRepos( botaniqueItem ) {
|
||||||
return Misc.templateData(botaniqueItem).categorie == 'Repos';
|
return botaniqueItem.categorie == 'Repos';
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
@ -22,12 +20,11 @@ export class RdDHerbes extends Item {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static buildHerbesList(listHerbes, max) {
|
static buildHerbesList(listeHerbes, max) {
|
||||||
let list = {}
|
let list = {}
|
||||||
for ( let herbe of listHerbes) {
|
for ( let herbe of listeHerbes) {
|
||||||
let herbeData = Misc.templateData(herbe);
|
let brins = max - herbe.system.niveau;
|
||||||
let brins = max - herbeData.niveau;
|
list[herbe.system.name] = `${herbe.system.name} (Bonus: ${herbe.system.niveau}, Brins: ${brins})`;
|
||||||
list[herbe.data.name] = `${herbe.data.name} (Bonus: ${herbeData.niveau}, Brins: ${brins})`;
|
|
||||||
}
|
}
|
||||||
list['Autre'] = 'Autre (Bonus: variable, Brins: variable)'
|
list['Autre'] = 'Autre (Bonus: variable, Brins: variable)'
|
||||||
return list;
|
return list;
|
||||||
@ -39,36 +36,39 @@ export class RdDHerbes extends Item {
|
|||||||
formData.herbesRepos = this.buildHerbesList(this.herbesRepos, 7);
|
formData.herbesRepos = this.buildHerbesList(this.herbesRepos, 7);
|
||||||
formData.jourMoisOptions = RdDCalendrier.buildJoursMois();
|
formData.jourMoisOptions = RdDCalendrier.buildJoursMois();
|
||||||
formData.dateActuelle = game.system.rdd.calendrier.getDateFromIndex();
|
formData.dateActuelle = game.system.rdd.calendrier.getDateFromIndex();
|
||||||
formData.splitDate = game.system.rdd.calendrier.getNumericDateFromIndex(formData.data.prdate);
|
formData.splitDate = game.system.rdd.calendrier.getNumericDateFromIndex(formData.system.prdate);
|
||||||
|
|
||||||
if (formData.data.categorie.includes('Soin') ) {
|
if (formData.system.categorie.includes('Soin') ) {
|
||||||
formData.isHerbe = true;
|
formData.isHerbe = true;
|
||||||
this.computeHerbeBonus(formData, this.herbesSoins, 12);
|
this.computeHerbeBonus(formData, this.herbesSoins, 12);
|
||||||
} else if (formData.data.categorie.includes('Repos')) {
|
} else if (formData.system.categorie.includes('Repos')) {
|
||||||
formData.isRepos = true;
|
formData.isRepos = true;
|
||||||
this.computeHerbeBonus(formData, this.herbesRepos, 7);
|
this.computeHerbeBonus(formData, this.herbesRepos, 7);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static calculePointsRepos( data ) {
|
static calculePuissancePotion( potion ) {
|
||||||
return data.herbebonus * data.pr;
|
return potion.system.herbebonus * potion.system.pr;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static calculePointsGuerison( data ){
|
static calculePointsRepos( potion ) {
|
||||||
return data.herbebonus * data.pr;
|
return potion.system.herbebonus * potion.system.pr;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* -------------------------------------------- */
|
||||||
|
static calculePointsGuerison( potion ){
|
||||||
|
return potion.system.herbebonus * potion.system.pr;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static computeHerbeBonus( formData, herbesList, max) {
|
static computeHerbeBonus( formData, herbesList, max) {
|
||||||
if ( Number(formData.data.herbebrins) ) {
|
if ( Number(formData.system.herbebrins) ) {
|
||||||
let herbe = herbesList.find(item => item.name.toLowerCase() == formData.data.herbe.toLowerCase() );
|
let herbe = herbesList.find(item => item.name.toLowerCase() == formData.system.herbe.toLowerCase() );
|
||||||
if( herbe ) {
|
if( herbe ) {
|
||||||
let herbeData = Misc.templateData(herbe);
|
let brinsBase = max - herbe.system.niveau;
|
||||||
let brinsBase = max - herbeData.niveau;
|
formData.system.herbebonus = Math.max(herbe.system.niveau - Math.max(brinsBase - formData.system.herbebrins, 0), 0);
|
||||||
//console.log(herbeData, brinsBase, formData.data.herbebrins);
|
|
||||||
formData.data.herbebonus = Math.max(herbeData.niveau - Math.max(brinsBase - formData.data.herbebrins, 0), 0);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2,64 +2,46 @@ import { Misc } from "./misc.js";
|
|||||||
|
|
||||||
export class RdDHotbar {
|
export class RdDHotbar {
|
||||||
|
|
||||||
|
static async addToHotbar(item, slot) {
|
||||||
|
let command = `game.system.rdd.RdDHotbar.rollMacro("${item.name}", "${item.type}");`;
|
||||||
|
let macro = game.macros.contents.find(m => (m.name === item.name) && (m.command === command));
|
||||||
|
if (!macro) {
|
||||||
|
macro = await Macro.create({
|
||||||
|
name: item.name,
|
||||||
|
type: "script",
|
||||||
|
img: item.img,
|
||||||
|
command: command
|
||||||
|
}, { displaySheet: false })
|
||||||
|
}
|
||||||
|
await game.user.assignHotbarMacro(macro, slot);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create a macro when dropping an entity on the hotbar
|
* Create a macro when dropping an entity on the hotbar
|
||||||
* Item - open roll dialog for item
|
* Item - open roll dialog for item
|
||||||
* Actor - open actor sheet
|
* Actor - open actor sheet
|
||||||
* Journal - open journal sheet
|
* Journal - open journal sheet
|
||||||
*/
|
*/
|
||||||
static initDropbar( ) {
|
static initDropbar() {
|
||||||
|
|
||||||
Hooks.on("hotbarDrop", async (bar, documentData, slot) => {
|
Hooks.on("hotbarDrop", (bar, documentData, slot) => {
|
||||||
// Create item macro if rollable item - weapon, spell, prayer, trait, or skill
|
|
||||||
if (documentData.type == "Item") {
|
// Create item macro if rollable item - weapon, spell, prayer, trait, or skill
|
||||||
if (documentData.data.type != "arme" && documentData.data.type != "competence" )
|
if (documentData.type == "Item") {
|
||||||
return
|
let item = fromUuidSync(documentData.uuid)
|
||||||
let item = documentData.data
|
if (item == undefined) {
|
||||||
let command = `game.system.rdd.RdDHotbar.rollMacro("${item.name}", "${item.type}");`;
|
item = this.actor.items.get(documentData.uuid)
|
||||||
let macro = game.macros.contents.find(m => (m.name === item.name) && (m.command === command));
|
}
|
||||||
if (!macro) {
|
console.log("DROP", documentData, item)
|
||||||
macro = await Macro.create({
|
if (!item || (item.type != "arme" && item.type != "competence")) {
|
||||||
name: item.name,
|
return true
|
||||||
type: "script",
|
}
|
||||||
img: item.img,
|
this.addToHotbar(item, slot)
|
||||||
command: command
|
return false
|
||||||
}, { displaySheet: false })
|
|
||||||
}
|
}
|
||||||
game.user.assignHotbarMacro(macro, slot);
|
|
||||||
}
|
return true
|
||||||
// Create a macro to open the actor sheet of the actor dropped on the hotbar
|
})
|
||||||
else if (documentData.type == "Actor") {
|
|
||||||
let actor = game.actors.get(documentData.id);
|
|
||||||
let command = `game.actors.get("${documentData.id}").sheet.render(true)`
|
|
||||||
let macro = game.macros.contents.find(m => (m.name === actor.name) && (m.command === command));
|
|
||||||
if (!macro) {
|
|
||||||
macro = await Macro.create({
|
|
||||||
name: actor.data.name,
|
|
||||||
type: "script",
|
|
||||||
img: actor.data.img,
|
|
||||||
command: command
|
|
||||||
}, { displaySheet: false })
|
|
||||||
game.user.assignHotbarMacro(macro, slot);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// Create a macro to open the journal sheet of the journal dropped on the hotbar
|
|
||||||
else if (documentData.type == "JournalEntry") {
|
|
||||||
let journal = game.journal.get(documentData.id);
|
|
||||||
let command = `game.journal.get("${documentData.id}").sheet.render(true)`
|
|
||||||
let macro = game.macros.contents.find(m => (m.name === journal.name) && (m.command === command));
|
|
||||||
if (!macro) {
|
|
||||||
macro = await Macro.create({
|
|
||||||
name: journal.data.name,
|
|
||||||
type: "script",
|
|
||||||
img: "systems/foundryvtt-reve-de-dragon/icons/templates/icone_parchement_vierge.webp",
|
|
||||||
command: command
|
|
||||||
}, { displaySheet: false })
|
|
||||||
game.user.assignHotbarMacro(macro, slot);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Roll macro */
|
/** Roll macro */
|
||||||
@ -69,15 +51,17 @@ export class RdDHotbar {
|
|||||||
if (speaker.token) actor = game.actors.tokens[speaker.token];
|
if (speaker.token) actor = game.actors.tokens[speaker.token];
|
||||||
if (!actor) actor = game.actors.get(speaker.actor);
|
if (!actor) actor = game.actors.get(speaker.actor);
|
||||||
|
|
||||||
let item = Misc.data(actor?.items.find(it => it.name === itemName && it.type == itemType));
|
let item = actor?.items.find(it => it.name === itemName && it.type == itemType) ?? undefined;
|
||||||
if (!item) return ui.notifications.warn(`Impossible de trouver l'objet de cette macro`);
|
if (!item) {
|
||||||
|
return ui.notifications.warn(`Impossible de trouver l'objet de cette macro`);
|
||||||
|
}
|
||||||
|
|
||||||
// Trigger the item roll
|
// Trigger the item roll
|
||||||
switch (item.type) {
|
switch (item.type) {
|
||||||
case "arme":
|
case "arme":
|
||||||
return actor.rollArme(item);
|
return actor.rollArme(item);
|
||||||
case "competence":
|
case "competence":
|
||||||
return actor.rollCompetence( itemName );
|
return actor.rollCompetence(itemName);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -35,6 +35,7 @@ import { RdDDice } from "./rdd-dice.js";
|
|||||||
import { RdDPossession } from "./rdd-possession.js";
|
import { RdDPossession } from "./rdd-possession.js";
|
||||||
import { RdDSigneDraconiqueItemSheet } from "./item-signedraconique-sheet.js";
|
import { RdDSigneDraconiqueItemSheet } from "./item-signedraconique-sheet.js";
|
||||||
import { Misc } from "./misc.js";
|
import { Misc } from "./misc.js";
|
||||||
|
import { Migrations } from './migrations.js';
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
/* Foundry VTT Initialization */
|
/* Foundry VTT Initialization */
|
||||||
@ -183,7 +184,7 @@ Hooks.once("init", async function () {
|
|||||||
Items.registerSheet(SYSTEM_RDD, RdDItemSheet, {
|
Items.registerSheet(SYSTEM_RDD, RdDItemSheet, {
|
||||||
types: ["arme", "armure", "objet", "arme", "armure", "conteneur", "competence", "sort", "herbe", "ingredient", "livre", "potion", "munition", "rencontresTMR", "queue", "ombre", "souffle",
|
types: ["arme", "armure", "objet", "arme", "armure", "conteneur", "competence", "sort", "herbe", "ingredient", "livre", "potion", "munition", "rencontresTMR", "queue", "ombre", "souffle",
|
||||||
"tete", "competencecreature", "tarot", "monnaie", "nombreastral", "tache", "meditation", "casetmr", "recettealchimique", "gemme",
|
"tete", "competencecreature", "tarot", "monnaie", "nombreastral", "tache", "meditation", "casetmr", "recettealchimique", "gemme",
|
||||||
"musique", "chant", "danse", "jeu", "recettecuisine", "maladie", "poison", "oeuvre", "nourritureboisson", "possession"], makeDefault: true
|
"musique", "chant", "danse", "jeu", "recettecuisine", "maladie", "poison", "oeuvre", "nourritureboisson", "possession", "sortreserve"], makeDefault: true
|
||||||
});
|
});
|
||||||
CONFIG.Combat.documentClass = RdDCombatManager;
|
CONFIG.Combat.documentClass = RdDCombatManager;
|
||||||
|
|
||||||
@ -221,19 +222,20 @@ function messageDeBienvenue() {
|
|||||||
// Register world usage statistics
|
// Register world usage statistics
|
||||||
function registerUsageCount( registerKey ) {
|
function registerUsageCount( registerKey ) {
|
||||||
if ( game.user.isGM ) {
|
if ( game.user.isGM ) {
|
||||||
game.settings.register(registerKey, "world-key", {
|
game.settings.register("world", "world-key", {
|
||||||
name: "Unique world key",
|
name: "Unique world key",
|
||||||
scope: "world",
|
scope: "world",
|
||||||
config: false,
|
config: false,
|
||||||
|
default: "NONE",
|
||||||
type: String
|
type: String
|
||||||
});
|
});
|
||||||
|
|
||||||
let worldKey = game.settings.get(registerKey, "world-key")
|
let worldKey = game.settings.get("world", "world-key")
|
||||||
if ( worldKey == undefined || worldKey == "" ) {
|
if ( worldKey == undefined || worldKey == "" ) {
|
||||||
worldKey = randomID(32)
|
worldKey = randomID(32)
|
||||||
game.settings.set(registerKey, "world-key", worldKey )
|
game.settings.set("world", "world-key", worldKey )
|
||||||
}
|
}
|
||||||
let regURL = `https://www.uberwald.me/fvtt_appcount/count.php?name="${registerKey}"&worldKey="${worldKey}"&version="${game.release.generation}.${game.release.build}"&system="${game.system.id}"&systemversion="${game.system.data.version}"`
|
let regURL = `https://www.uberwald.me/fvtt_appcount/count.php?name="${registerKey}"&worldKey="${worldKey}"&version="${game.release.generation}.${game.release.build}"&system="${game.system.id}"&systemversion="${game.system.version}"`
|
||||||
$.ajax(regURL)
|
$.ajax(regURL)
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
}
|
}
|
||||||
@ -244,6 +246,9 @@ function registerUsageCount( registerKey ) {
|
|||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
Hooks.once("ready", async function () {
|
Hooks.once("ready", async function () {
|
||||||
await migrationPngWebp_1_5_34()
|
await migrationPngWebp_1_5_34()
|
||||||
|
if (Misc.isUniqueConnectedGM()) {
|
||||||
|
new Migrations().migrate();
|
||||||
|
}
|
||||||
|
|
||||||
StatusEffects.onReady();
|
StatusEffects.onReady();
|
||||||
RdDHerbes.initializeHerbes();
|
RdDHerbes.initializeHerbes();
|
||||||
@ -291,8 +296,8 @@ async function migrationPngWebp_1_5_34() {
|
|||||||
await Item.updateDocuments(itemsUpdates);
|
await Item.updateDocuments(itemsUpdates);
|
||||||
await Actor.updateDocuments(actorsUpdates);
|
await Actor.updateDocuments(actorsUpdates);
|
||||||
game.actors.forEach(actor => {
|
game.actors.forEach(actor => {
|
||||||
if (actor.data.token?.img && actor.data.token.img.match(regexOldPngJpg)) {
|
if (actor.token?.img && actor.token.img.match(regexOldPngJpg)) {
|
||||||
actor.update({ "token.img": convertImgToWebp(actor.data.token.img) });
|
actor.update({ "token.img": convertImgToWebp(actor.token.img) });
|
||||||
}
|
}
|
||||||
const actorItemsToUpdate = prepareDocumentsImgUpdate(actor.items);
|
const actorItemsToUpdate = prepareDocumentsImgUpdate(actor.items);
|
||||||
actor.updateEmbeddedDocuments('Item', actorItemsToUpdate);
|
actor.updateEmbeddedDocuments('Item', actorItemsToUpdate);
|
||||||
|
@ -19,9 +19,9 @@ export class RdDPossession {
|
|||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static searchPossessionFromEntite(attacker, defender) {
|
static searchPossessionFromEntite(attacker, defender) {
|
||||||
let poss = attacker.data.items.find(poss => poss.type == 'possession' && poss.data.data.possedeid == defender.data._id);
|
let poss = attacker.items.find(poss => poss.type == 'possession' && poss.system.possedeid == defender.id);
|
||||||
if (!poss) {
|
if (!poss) {
|
||||||
poss = defender.data.items.find(poss => poss.type == 'possession' && poss.data.data.possedeid == defender.data._id);
|
poss = defender.items.find(poss => poss.type == 'possession' && poss.system.possedeid == defender.id);
|
||||||
}
|
}
|
||||||
return poss && duplicate(poss) || undefined;
|
return poss && duplicate(poss) || undefined;
|
||||||
}
|
}
|
||||||
@ -31,11 +31,11 @@ export class RdDPossession {
|
|||||||
possession.ptsConjuration = 0
|
possession.ptsConjuration = 0
|
||||||
possession.ptsPossession = 0
|
possession.ptsPossession = 0
|
||||||
console.log("Possession", possession)
|
console.log("Possession", possession)
|
||||||
if (possession.data.compteur > 0) {
|
if (possession.system.compteur > 0) {
|
||||||
possession.ptsPossession = possession.data.compteur
|
possession.ptsPossession = possession.system.compteur
|
||||||
}
|
}
|
||||||
if (possession.data.compteur < 0) {
|
if (possession.system.compteur < 0) {
|
||||||
possession.ptsConjuration = Math.abs(possession.data.compteur)
|
possession.ptsConjuration = Math.abs(possession.system.compteur)
|
||||||
}
|
}
|
||||||
possession.isPosseder = false
|
possession.isPosseder = false
|
||||||
possession.isConjurer = false
|
possession.isConjurer = false
|
||||||
@ -49,14 +49,14 @@ export class RdDPossession {
|
|||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static async resultConjuration(rollData) {
|
static async resultConjuration(rollData) {
|
||||||
let actor = game.actors.get(rollData.possession.data.possedeid)
|
let actor = game.actors.get(rollData.possession.system.possedeid)
|
||||||
if (!rollData.rolled.isSuccess) {
|
if (!rollData.rolled.isSuccess) {
|
||||||
if (rollData.isECNIDefender) {
|
if (rollData.isECNIDefender) {
|
||||||
rollData.possession.data.compteur--
|
rollData.possession.system.compteur--
|
||||||
} else {
|
} else {
|
||||||
rollData.possession.data.compteur++
|
rollData.possession.system.compteur++
|
||||||
}
|
}
|
||||||
let update = { _id: rollData.possession._id, "data.compteur": rollData.possession.data.compteur }
|
let update = { _id: rollData.possession._id, "system.compteur": rollData.possession.system.compteur }
|
||||||
await actor.updateEmbeddedDocuments('Item', [update])
|
await actor.updateEmbeddedDocuments('Item', [update])
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -84,10 +84,10 @@ export class RdDPossession {
|
|||||||
attacker: attacker,
|
attacker: attacker,
|
||||||
defender: defender,
|
defender: defender,
|
||||||
competence: defender.getDraconicOuPossession(),
|
competence: defender.getDraconicOuPossession(),
|
||||||
selectedCarac: defender.data.data.carac.reve,
|
selectedCarac: defender.system.carac.reve,
|
||||||
forceCarac: { 'reve-actuel': { label: "Rêve Actuel", value: defender.getReveActuel() } }
|
forceCarac: { 'reve-actuel': { label: "Rêve Actuel", value: defender.getReveActuel() } }
|
||||||
}
|
}
|
||||||
rollData.competence.data.defaut_carac = 'reve-actuel'
|
rollData.competence.system.defaut_carac = 'reve-actuel'
|
||||||
|
|
||||||
|
|
||||||
const dialog = await RdDRoll.create(defender, rollData,
|
const dialog = await RdDRoll.create(defender, rollData,
|
||||||
@ -159,7 +159,7 @@ export class RdDPossession {
|
|||||||
let possessionData = {
|
let possessionData = {
|
||||||
name: "Possession en cours de " + attacker.name, type: 'possession',
|
name: "Possession en cours de " + attacker.name, type: 'possession',
|
||||||
img: "systems/foundryvtt-reve-de-dragon/icons/entites/possession2.webp",
|
img: "systems/foundryvtt-reve-de-dragon/icons/entites/possession2.webp",
|
||||||
data: { description: "", typepossession: attacker.name, possede: false, possessionid: randomID(16), possesseurid: attacker.data._id, possedeid: defender.data._id, date: 0, compteur: 0 }
|
system: { description: "", typepossession: attacker.name, possede: false, possessionid: randomID(16), possesseurid: attacker.id, possedeid: defender.id, date: 0, compteur: 0 }
|
||||||
}
|
}
|
||||||
// Creates only the possession on the personnage side
|
// Creates only the possession on the personnage side
|
||||||
let poss = await defender.createEmbeddedDocuments('Item', [possessionData])
|
let poss = await defender.createEmbeddedDocuments('Item', [possessionData])
|
||||||
|
@ -166,7 +166,7 @@ export class RdDResolutionTable {
|
|||||||
if (rollData.selectedCarac?.label.toLowerCase().includes('chance')) {
|
if (rollData.selectedCarac?.label.toLowerCase().includes('chance')) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
if (rollData.selectedSort?.data.isrituel) {
|
if (rollData.selectedSort?.system.isrituel) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
|
@ -38,25 +38,25 @@ export class RdDRoll extends Dialog {
|
|||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static _setDefaultOptions(actor, rollData) {
|
static _setDefaultOptions(actor, rollData) {
|
||||||
const actorData = Misc.data(actor);
|
const actorData = actor.system
|
||||||
let defaultRollData = {
|
let defaultRollData = {
|
||||||
alias: actor.name,
|
alias: actor.name,
|
||||||
ajustementsConditions: CONFIG.RDD.ajustementsConditions,
|
ajustementsConditions: CONFIG.RDD.ajustementsConditions,
|
||||||
difficultesLibres: CONFIG.RDD.difficultesLibres,
|
difficultesLibres: CONFIG.RDD.difficultesLibres,
|
||||||
etat: actor.getEtatGeneral(),
|
etat: actor.getEtatGeneral(),
|
||||||
moral: actor.getMoralTotal(), /* La valeur du moral pour les jets de volonté */
|
moral: actor.getMoralTotal(), /* La valeur du moral pour les jets de volonté */
|
||||||
carac: actorData.data.carac,
|
carac: actorData.carac,
|
||||||
finalLevel: 0,
|
finalLevel: 0,
|
||||||
diffConditions: 0,
|
diffConditions: 0,
|
||||||
diffLibre: rollData.competence?.data.default_diffLibre ?? 0,
|
diffLibre: rollData.competence?.system.default_diffLibre ?? 0,
|
||||||
malusArmureValue: actor.getMalusArmure(),
|
malusArmureValue: actor.getMalusArmure(),
|
||||||
surencMalusFlag: actor.isPersonnage() ? (actorData.data.compteurs.surenc.value < 0) : false,
|
surencMalusFlag: actor.isPersonnage() ? (actorData.compteurs.surenc.value < 0) : false,
|
||||||
surencMalusValue: actor.computeMalusSurEncombrement(),
|
surencMalusValue: actor.computeMalusSurEncombrement(),
|
||||||
useMalusSurenc: false,
|
useMalusSurenc: false,
|
||||||
useMoral: false, /* Est-ce que le joueur demande d'utiliser le moral ? Utile si le joueur change plusieurs fois de carac associée. */
|
useMoral: false, /* Est-ce que le joueur demande d'utiliser le moral ? Utile si le joueur change plusieurs fois de carac associée. */
|
||||||
perteMoralEchec: false, /* Pour l'affichage dans le chat */
|
perteMoralEchec: false, /* Pour l'affichage dans le chat */
|
||||||
use: { libre: true, conditions: true, surenc: false, encTotal: false },
|
use: { libre: true, conditions: true, surenc: false, encTotal: false },
|
||||||
isMalusEncombrementTotal: RdDItemCompetence.isMalusEncombrementTotal(rollData.competence),
|
isMalusEncombrementTotal: rollData.competence ? RdDItemCompetence.isMalusEncombrementTotal(rollData.competence) : 0,
|
||||||
useMalusEncTotal: false,
|
useMalusEncTotal: false,
|
||||||
encTotal: actor.getEncTotal(),
|
encTotal: actor.getEncTotal(),
|
||||||
ajustementAstrologique: actor.ajustementAstrologique(),
|
ajustementAstrologique: actor.ajustementAstrologique(),
|
||||||
@ -67,7 +67,7 @@ export class RdDRoll extends Dialog {
|
|||||||
}
|
}
|
||||||
// Mini patch :Ajout du rêve actuel
|
// Mini patch :Ajout du rêve actuel
|
||||||
if ( actorData.type == "personnage") {
|
if ( actorData.type == "personnage") {
|
||||||
defaultRollData.carac["reve-actuel"] = actorData.data.reve.reve
|
defaultRollData.carac["reve-actuel"] = actorData.reve.reve
|
||||||
}
|
}
|
||||||
|
|
||||||
mergeObject(rollData, defaultRollData, { recursive: true, overwrite: false });
|
mergeObject(rollData, defaultRollData, { recursive: true, overwrite: false });
|
||||||
@ -165,17 +165,17 @@ export class RdDRoll extends Dialog {
|
|||||||
|
|
||||||
function onLoad() {
|
function onLoad() {
|
||||||
let rollData = dialog.rollData;
|
let rollData = dialog.rollData;
|
||||||
console.log(rollData);
|
console.log('Ouverture RdDRoll', rollData);
|
||||||
// Update html, according to data
|
// Update html, according to rollData
|
||||||
if (rollData.competence) {
|
if (rollData.competence) {
|
||||||
const defaut_carac = Misc.templateData(rollData.competence).defaut_carac;
|
const defaut_carac = rollData.competence.system.defaut_carac
|
||||||
// Set the default carac from the competence item
|
// Set the default carac from the competence item
|
||||||
rollData.selectedCarac = rollData.carac[defaut_carac];
|
rollData.selectedCarac = rollData.carac[defaut_carac];
|
||||||
$("#carac").val(defaut_carac);
|
$("#carac").val(defaut_carac);
|
||||||
}
|
}
|
||||||
if (rollData.selectedSort) {
|
if (rollData.selectedSort) {
|
||||||
dialog.setSelectedSort(rollData.selectedSort);
|
dialog.setSelectedSort(rollData.selectedSort);
|
||||||
$(".draconic").val(rollData.selectedSort.data.listIndex); // Uniquement a la selection du sort, pour permettre de changer
|
$(".draconic").val(rollData.selectedSort.system.listIndex); // Uniquement a la selection du sort, pour permettre de changer
|
||||||
}
|
}
|
||||||
RdDItemSort.setCoutReveReel(rollData.selectedSort);
|
RdDItemSort.setCoutReveReel(rollData.selectedSort);
|
||||||
$("#diffLibre").val(Misc.toInt(rollData.diffLibre));
|
$("#diffLibre").val(Misc.toInt(rollData.diffLibre));
|
||||||
@ -221,7 +221,7 @@ export class RdDRoll extends Dialog {
|
|||||||
});
|
});
|
||||||
html.find('#ptreve-variable').change((event) => {
|
html.find('#ptreve-variable').change((event) => {
|
||||||
let ptreve = Misc.toInt(event.currentTarget.value);
|
let ptreve = Misc.toInt(event.currentTarget.value);
|
||||||
this.rollData.selectedSort.data.ptreve_reel = ptreve;
|
this.rollData.selectedSort.system.ptreve_reel = ptreve;
|
||||||
console.log("RdDRollSelectDialog - Cout reve", ptreve);
|
console.log("RdDRollSelectDialog - Cout reve", ptreve);
|
||||||
this.updateRollResult();
|
this.updateRollResult();
|
||||||
});
|
});
|
||||||
@ -271,21 +271,21 @@ export class RdDRoll extends Dialog {
|
|||||||
|
|
||||||
async setSelectedSort(sort) {
|
async setSelectedSort(sort) {
|
||||||
this.rollData.selectedSort = sort; // Update the selectedCarac
|
this.rollData.selectedSort = sort; // Update the selectedCarac
|
||||||
this.rollData.competence = RdDItemCompetence.getVoieDraconic(this.rollData.draconicList, sort.data.draconic);
|
this.rollData.competence = RdDItemCompetence.getVoieDraconic(this.rollData.draconicList, sort.system.draconic);
|
||||||
this.rollData.bonus = RdDItemSort.getCaseBonus(sort, this.rollData.tmr.coord);
|
this.rollData.bonus = RdDItemSort.getCaseBonus(sort, this.rollData.tmr.coord);
|
||||||
this.rollData.diffLibre = RdDItemSort.getDifficulte(sort, -7);
|
this.rollData.diffLibre = RdDItemSort.getDifficulte(sort, -7);
|
||||||
RdDItemSort.setCoutReveReel(sort);
|
RdDItemSort.setCoutReveReel(sort);
|
||||||
const htmlSortDescription = await renderTemplate("systems/foundryvtt-reve-de-dragon/templates/partial-description-sort.html", { sort: sort });
|
const htmlSortDescription = await renderTemplate("systems/foundryvtt-reve-de-dragon/templates/partial-description-sort.html", { sort: sort });
|
||||||
$(".sort-ou-rituel").text(sort.data.isrituel ? "rituel" : "sort");
|
$(".sort-ou-rituel").text(sort.system.isrituel ? "rituel" : "sort");
|
||||||
$(".bonus-case").text(`${this.rollData.bonus}%`);
|
$(".bonus-case").text(`${this.rollData.bonus}%`);
|
||||||
$(".details-sort").remove();
|
$(".details-sort").remove();
|
||||||
$(".description-sort").append(htmlSortDescription);
|
$(".description-sort").append(htmlSortDescription);
|
||||||
$(".roll-draconic").val(sort.data.listIndex);
|
$(".roll-draconic").val(sort.system.listIndex);
|
||||||
$(".div-sort-difficulte-fixe").text(Misc.toSignedString(sort.data.difficulte));
|
$(".div-sort-difficulte-fixe").text(Misc.toSignedString(sort.system.difficulte));
|
||||||
$(".div-sort-ptreve-fixe").text(sort.data.ptreve);
|
$(".div-sort-ptreve-fixe").text(sort.system.ptreve);
|
||||||
const diffVariable = RdDItemSort.isDifficulteVariable(sort);
|
const diffVariable = RdDItemSort.isDifficulteVariable(sort);
|
||||||
const coutVariable = RdDItemSort.isCoutVariable(sort);
|
const coutVariable = RdDItemSort.isCoutVariable(sort);
|
||||||
HtmlUtility._showControlWhen($(".div-sort-non-rituel"), !sort.data.isrituel);
|
HtmlUtility._showControlWhen($(".div-sort-non-rituel"), !sort.system.isrituel);
|
||||||
HtmlUtility._showControlWhen($(".div-sort-difficulte-var"), diffVariable);
|
HtmlUtility._showControlWhen($(".div-sort-difficulte-var"), diffVariable);
|
||||||
HtmlUtility._showControlWhen($(".div-sort-difficulte-fixe"), !diffVariable);
|
HtmlUtility._showControlWhen($(".div-sort-difficulte-fixe"), !diffVariable);
|
||||||
HtmlUtility._showControlWhen($(".div-sort-ptreve-var"), coutVariable);
|
HtmlUtility._showControlWhen($(".div-sort-ptreve-var"), coutVariable);
|
||||||
@ -294,7 +294,7 @@ export class RdDRoll extends Dialog {
|
|||||||
|
|
||||||
async setSelectedSigneDraconique(signe){
|
async setSelectedSigneDraconique(signe){
|
||||||
this.rollData.signe = signe;
|
this.rollData.signe = signe;
|
||||||
this.rollData.diffLibre = Misc.data(signe).data.difficulte,
|
this.rollData.diffLibre = signe.system.difficulte,
|
||||||
$(".signe-difficulte").text(Misc.toSignedString(this.rollData.diffLibre));
|
$(".signe-difficulte").text(Misc.toSignedString(this.rollData.diffLibre));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -348,10 +348,10 @@ export class RdDRoll extends Dialog {
|
|||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
_computeDiffCompetence(rollData) {
|
_computeDiffCompetence(rollData) {
|
||||||
if (rollData.competence) {
|
if (rollData.competence) {
|
||||||
return Misc.toInt(rollData.competence.data.niveau);
|
return Misc.toInt(rollData.competence.system.niveau);
|
||||||
}
|
}
|
||||||
if (rollData.draconicList) {
|
if (rollData.draconicList) {
|
||||||
return Misc.toInt(rollData.competence.data.niveau);
|
return Misc.toInt(rollData.competence.system.niveau);
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -388,7 +388,7 @@ export class RdDRoll extends Dialog {
|
|||||||
return compName + " - " + rollData.selectedSort.name;
|
return compName + " - " + rollData.selectedSort.name;
|
||||||
}
|
}
|
||||||
// If a weapon is there, add it in the title
|
// If a weapon is there, add it in the title
|
||||||
const niveau = Misc.toSignedString(rollData.competence.data.niveau);
|
const niveau = Misc.toSignedString(rollData.competence.system.niveau)
|
||||||
if (compName == carac) {
|
if (compName == carac) {
|
||||||
// cas des créatures
|
// cas des créatures
|
||||||
return carac + " Niveau " + niveau
|
return carac + " Niveau " + niveau
|
||||||
|
@ -10,21 +10,22 @@ export class RdDRollTables {
|
|||||||
table = await pack.getDocument(entry._id);
|
table = await pack.getDocument(entry._id);
|
||||||
}
|
}
|
||||||
const draw = await table.draw({ displayChat: toChat, rollMode: "gmroll"});
|
const draw = await table.draw({ displayChat: toChat, rollMode: "gmroll"});
|
||||||
console.log("RdDRollTables", tableName, toChat, ":", draw);
|
//console.log("RdDRollTables", tableName, toChat, ":", draw);
|
||||||
return draw.results.length > 0 ? draw.results[0] : undefined;
|
return draw.results.length > 0 ? draw.results[0] : undefined;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static async drawItemFromRollTable(tableName, toChat = false) {
|
static async drawItemFromRollTable(tableName, toChat = false) {
|
||||||
const drawResult = await RdDRollTables.genericGetTableResult(tableName, toChat);
|
const drawResult = await RdDRollTables.genericGetTableResult(tableName, toChat);
|
||||||
const pack = game.packs.get(drawResult.data.collection);
|
const pack = game.packs.get(drawResult.documentCollection)
|
||||||
return await pack.getDocument(drawResult.data.resultId);
|
let doc = await pack.getDocument(drawResult.documentId)
|
||||||
|
return doc
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static async drawTextFromRollTable(tableName, toChat) {
|
static async drawTextFromRollTable(tableName, toChat) {
|
||||||
const drawResult = await RdDRollTables.genericGetTableResult(tableName, toChat);
|
const drawResult = await RdDRollTables.genericGetTableResult(tableName, toChat);
|
||||||
return drawResult.data.text;
|
return drawResult.text;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
|
@ -21,14 +21,14 @@ export class RdDSheetUtility {
|
|||||||
}
|
}
|
||||||
|
|
||||||
static prepareItemDropParameters(destItemId, actorId, dragData, objetVersConteneur) {
|
static prepareItemDropParameters(destItemId, actorId, dragData, objetVersConteneur) {
|
||||||
const itemId = dragData.id || dragData.data._id;
|
const item = fromUuidSync(dragData.uuid)
|
||||||
return {
|
return {
|
||||||
destId: destItemId,
|
destId: destItemId,
|
||||||
targetActorId: actorId,
|
targetActorId: actorId,
|
||||||
itemId: itemId,
|
itemId: item.id,
|
||||||
sourceActorId: dragData.actorId,
|
sourceActorId: item.actor?.id,
|
||||||
srcId: objetVersConteneur[itemId],
|
srcId: objetVersConteneur[item.id],
|
||||||
onEnleverConteneur: () => { delete objetVersConteneur[itemId]; },
|
onEnleverConteneur: () => { delete objetVersConteneur[item.id]; },
|
||||||
onAjouterDansConteneur: (itemId, conteneurId) => { objetVersConteneur[itemId] = conteneurId; }
|
onAjouterDansConteneur: (itemId, conteneurId) => { objetVersConteneur[itemId] = conteneurId; }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -42,12 +42,12 @@ export class RdDSheetUtility {
|
|||||||
}
|
}
|
||||||
|
|
||||||
static async _onSplitItem(item, split, actor) {
|
static async _onSplitItem(item, split, actor) {
|
||||||
if (split >= 1 && split < Misc.data(item).data.quantite) {
|
if (split >= 1 && split < item.system.quantite) {
|
||||||
await item.diminuerQuantite(split);
|
await item.diminuerQuantite(split);
|
||||||
const itemData = duplicate(Misc.data(item));
|
const splitItem = duplicate(item);
|
||||||
// todo: ajouter dans le même conteneur?
|
// todo: ajouter dans le même conteneur?
|
||||||
itemData.data.quantite = split;
|
splitItem.system.quantite = split;
|
||||||
await actor.createEmbeddedDocuments('Item', [itemData])
|
await actor.createEmbeddedDocuments('Item', [splitItem])
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -1,4 +1,3 @@
|
|||||||
import { SYSTEM_SOCKET_ID } from "./constants.js";
|
|
||||||
import { RollDataAjustements } from "./rolldata-ajustements.js";
|
import { RollDataAjustements } from "./rolldata-ajustements.js";
|
||||||
import { RdDUtility } from "./rdd-utility.js";
|
import { RdDUtility } from "./rdd-utility.js";
|
||||||
import { TMRUtility } from "./tmr-utility.js";
|
import { TMRUtility } from "./tmr-utility.js";
|
||||||
@ -16,6 +15,7 @@ import { Misc } from "./misc.js";
|
|||||||
import { HtmlUtility } from "./html-utility.js";
|
import { HtmlUtility } from "./html-utility.js";
|
||||||
import { ReglesOptionelles } from "./regles-optionelles.js";
|
import { ReglesOptionelles } from "./regles-optionelles.js";
|
||||||
import { RdDDice } from "./rdd-dice.js";
|
import { RdDDice } from "./rdd-dice.js";
|
||||||
|
import { STATUSES } from "./status-effects.js";
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
|
|
||||||
export class RdDTMRDialog extends Dialog {
|
export class RdDTMRDialog extends Dialog {
|
||||||
@ -55,7 +55,6 @@ export class RdDTMRDialog extends Dialog {
|
|||||||
this.fatigueParCase = this.viewOnly || !ReglesOptionelles.isUsing("appliquer-fatigue") ? 0 : this.actor.getTMRFatigue();
|
this.fatigueParCase = this.viewOnly || !ReglesOptionelles.isUsing("appliquer-fatigue") ? 0 : this.actor.getTMRFatigue();
|
||||||
this.cumulFatigue = 0;
|
this.cumulFatigue = 0;
|
||||||
this.loadRencontres();
|
this.loadRencontres();
|
||||||
this.loadSortsReserve();
|
|
||||||
this.loadCasesSpeciales();
|
this.loadCasesSpeciales();
|
||||||
this.allTokens = [];
|
this.allTokens = [];
|
||||||
this.rencontreState = 'aucune';
|
this.rencontreState = 'aucune';
|
||||||
@ -78,12 +77,19 @@ export class RdDTMRDialog extends Dialog {
|
|||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
loadCasesSpeciales() {
|
loadCasesSpeciales() {
|
||||||
this.casesSpeciales = this.actor.data.items.filter(item => Draconique.isCaseTMR(item));
|
this.casesSpeciales = this.actor.items.filter(item => Draconique.isCaseTMR(item));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
get sortsReserve() {
|
||||||
loadSortsReserve() {
|
return this.actor.itemTypes['sortreserve'];
|
||||||
this.sortsReserves = Misc.data(this.actor).data.reve.reserve.list;
|
}
|
||||||
|
|
||||||
|
getSortsReserve(coord) {
|
||||||
|
return this.actor.itemTypes['sortreserve'].filter(// Reserve sur une case fleuve ou normale
|
||||||
|
TMRUtility.getTMR(coord).type == 'fleuve'
|
||||||
|
? it => TMRUtility.getTMR(it.system.coord).type == 'fleuve'
|
||||||
|
: it => it.system.coord == coord
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
@ -97,10 +103,10 @@ export class RdDTMRDialog extends Dialog {
|
|||||||
this.updateTokens();
|
this.updateTokens();
|
||||||
this.forceDemiRevePositionView();
|
this.forceDemiRevePositionView();
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
_createTokens() {
|
_createTokens() {
|
||||||
if (!this.isDemiReveCache()){
|
if (!this.isDemiReveCache()) {
|
||||||
this.demiReve = this._tokenDemiReve();
|
this.demiReve = this._tokenDemiReve();
|
||||||
this._trackToken(this.demiReve);
|
this._trackToken(this.demiReve);
|
||||||
}
|
}
|
||||||
@ -117,7 +123,6 @@ export class RdDTMRDialog extends Dialog {
|
|||||||
updateTokens() {
|
updateTokens() {
|
||||||
this._removeTokens(t => true);
|
this._removeTokens(t => true);
|
||||||
this.loadRencontres();
|
this.loadRencontres();
|
||||||
this.loadSortsReserve();
|
|
||||||
this.loadCasesSpeciales();
|
this.loadCasesSpeciales();
|
||||||
this._createTokens();
|
this._createTokens();
|
||||||
}
|
}
|
||||||
@ -136,7 +141,7 @@ export class RdDTMRDialog extends Dialog {
|
|||||||
return this.rencontresExistantes.map(it => this._tokenRencontre(it));
|
return this.rencontresExistantes.map(it => this._tokenRencontre(it));
|
||||||
}
|
}
|
||||||
_getTokensSortsReserve() {
|
_getTokensSortsReserve() {
|
||||||
return this.sortsReserves.map(it => this._tokenSortEnReserve(it));
|
return this.actor.itemTypes['sortreserve'].map(it => this._tokenSortEnReserve(it));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
@ -144,17 +149,16 @@ export class RdDTMRDialog extends Dialog {
|
|||||||
return EffetsDraconiques.rencontre.token(this.pixiTMR, rencontre, () => rencontre.coord);
|
return EffetsDraconiques.rencontre.token(this.pixiTMR, rencontre, () => rencontre.coord);
|
||||||
}
|
}
|
||||||
_tokenCaseSpeciale(casetmr) {
|
_tokenCaseSpeciale(casetmr) {
|
||||||
const caseData = Misc.data(casetmr);
|
const caseData = casetmr;
|
||||||
const draconique = Draconique.get(caseData.data.specific);
|
const draconique = Draconique.get(caseData.system.specific);
|
||||||
return draconique?.token(this.pixiTMR, caseData, () => caseData.data.coord);
|
return draconique?.token(this.pixiTMR, caseData, () => caseData.system.coord);
|
||||||
}
|
}
|
||||||
_tokenSortEnReserve(sortEnReserve) {
|
_tokenSortEnReserve(sortReserve) {
|
||||||
return EffetsDraconiques.sortReserve.token(this.pixiTMR, sortEnReserve.sort, () => sortEnReserve.coord);
|
return EffetsDraconiques.sortReserve.token(this.pixiTMR, sortReserve, () => sortReserve.system.coord);
|
||||||
}
|
}
|
||||||
|
|
||||||
_tokenDemiReve() {
|
_tokenDemiReve() {
|
||||||
const actorData = Misc.data(this.actor);
|
return EffetsDraconiques.demiReve.token(this.pixiTMR, this.actor.system, () => this.actor.system.reve.tmrpos.coord);
|
||||||
return EffetsDraconiques.demiReve.token(this.pixiTMR, actorData, () => actorData.data.reve.tmrpos.coord);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
forceDemiRevePositionView() {
|
forceDemiRevePositionView() {
|
||||||
@ -163,7 +167,7 @@ export class RdDTMRDialog extends Dialog {
|
|||||||
}
|
}
|
||||||
|
|
||||||
_getActorCoord() {
|
_getActorCoord() {
|
||||||
return Misc.data(this.actor).data.reve.tmrpos.coord;
|
return this.actor.system.reve.tmrpos.coord;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
@ -210,24 +214,12 @@ export class RdDTMRDialog extends Dialog {
|
|||||||
this.actor.rollLireSigneDraconique(this._getActorCoord());
|
this.actor.rollLireSigneDraconique(this._getActorCoord());
|
||||||
});
|
});
|
||||||
|
|
||||||
html.find('#dir-top').click((event) => {
|
html.find('#dir-top').click((event) => this.moveFromKey("top"));
|
||||||
this.moveFromKey("top");
|
html.find('#dir-top-left').click((event) => this.moveFromKey("top-left"));
|
||||||
});
|
html.find('#dir-top-right').click((event) => this.moveFromKey("top-right"));
|
||||||
html.find('#dir-top-left').click((event) => {
|
html.find('#dir-bottom-left').click((event) => this.moveFromKey("bottom-left"));
|
||||||
this.moveFromKey("top-left");
|
html.find('#dir-bottom-right').click((event) => this.moveFromKey("bottom-right"));
|
||||||
});
|
html.find('#dir-bottom').click((event) => this.moveFromKey("bottom"));
|
||||||
html.find('#dir-top-right').click((event) => {
|
|
||||||
this.moveFromKey("top-right");
|
|
||||||
});
|
|
||||||
html.find('#dir-bottom-left').click((event) => {
|
|
||||||
this.moveFromKey("bottom-left");
|
|
||||||
});
|
|
||||||
html.find('#dir-bottom-right').click((event) => {
|
|
||||||
this.moveFromKey("bottom-right");
|
|
||||||
});
|
|
||||||
html.find('#dir-bottom').click((event) => {
|
|
||||||
this.moveFromKey("bottom");
|
|
||||||
});
|
|
||||||
|
|
||||||
// Gestion du cout de montée en points de rêve
|
// Gestion du cout de montée en points de rêve
|
||||||
let reveCout = ((this.tmrdata.isRapide && !EffetsDraconiques.isDeplacementAccelere(this.actor)) ? -2 : -1) - this.actor.countMonteeLaborieuse();
|
let reveCout = ((this.tmrdata.isRapide && !EffetsDraconiques.isDeplacementAccelere(this.actor)) ? -2 : -1) - this.actor.countMonteeLaborieuse();
|
||||||
@ -239,51 +231,52 @@ export class RdDTMRDialog extends Dialog {
|
|||||||
// Le reste...
|
// Le reste...
|
||||||
this.updateValuesDisplay();
|
this.updateValuesDisplay();
|
||||||
let tmr = TMRUtility.getTMR(this._getActorCoord());
|
let tmr = TMRUtility.getTMR(this._getActorCoord());
|
||||||
await this.manageRencontre(tmr, () => {
|
await this.manageRencontre(tmr);
|
||||||
this.postRencontre(tmr);
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
async updateValuesDisplay() {
|
async updateValuesDisplay() {
|
||||||
|
if (!this.rendered) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
const coord = this._getActorCoord();
|
const coord = this._getActorCoord();
|
||||||
const actorData = Misc.data(this.actor);
|
|
||||||
|
|
||||||
HtmlUtility._showControlWhen($(".lire-signe-draconique"), this.actor.isResonanceSigneDraconique(coord));
|
HtmlUtility._showControlWhen($(".lire-signe-draconique"), this.actor.isResonanceSigneDraconique(coord));
|
||||||
|
|
||||||
let ptsreve = document.getElementById("tmr-pointsreve-value");
|
let ptsreve = document.getElementById("tmr-pointsreve-value");
|
||||||
ptsreve.innerHTML = actorData.data.reve.reve.value;
|
ptsreve.innerHTML = this.actor.system.reve.reve.value;
|
||||||
|
|
||||||
let tmrpos = document.getElementById("tmr-pos");
|
let tmrpos = document.getElementById("tmr-pos");
|
||||||
if (this.isDemiReveCache()) {
|
if (this.isDemiReveCache()) {
|
||||||
tmrpos.innerHTML = '?? (' + TMRUtility.getTMRType(coord) + ')';
|
tmrpos.innerHTML = `?? ( ${ TMRUtility.getTMRType(coord)})`;
|
||||||
} else {
|
} else {
|
||||||
tmrpos.innerHTML = coord + " (" + TMRUtility.getTMRLabel(coord) + ")";
|
tmrpos.innerHTML = `${coord} ( ${TMRUtility.getTMRLabel(coord)})`;
|
||||||
}
|
}
|
||||||
|
|
||||||
let etat = document.getElementById("tmr-etatgeneral-value");
|
let etat = document.getElementById("tmr-etatgeneral-value");
|
||||||
etat.innerHTML = this.actor.getEtatGeneral();
|
etat.innerHTML = this.actor.getEtatGeneral();
|
||||||
|
|
||||||
let refoulement = document.getElementById("tmr-refoulement-value");
|
let refoulement = document.getElementById("tmr-refoulement-value");
|
||||||
refoulement.innerHTML = actorData.data.reve.refoulement.value;
|
refoulement.innerHTML = this.actor.system.reve.refoulement.value;
|
||||||
|
|
||||||
if (ReglesOptionelles.isUsing("appliquer-fatigue")) {
|
if (ReglesOptionelles.isUsing("appliquer-fatigue")) {
|
||||||
let fatigueItem = document.getElementById("tmr-fatigue-table");
|
let fatigueItem = document.getElementById("tmr-fatigue-table");
|
||||||
//console.log("Refresh : ", actorData.data.sante.fatigue.value);
|
fatigueItem.innerHTML = "<table class='table-fatigue'>" + RdDUtility.makeHTMLfatigueMatrix(this.actor.system.sante.fatigue.value, this.actor.system.sante.endurance.max).html() + "</table>";
|
||||||
fatigueItem.innerHTML = "<table class='table-fatigue'>" + RdDUtility.makeHTMLfatigueMatrix(actorData.data.sante.fatigue.value, actorData.data.sante.endurance.max).html() + "</table>";
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
close() {
|
async close() {
|
||||||
if ( this.actor.tmrApp ) {
|
this.descenteTMR = true;
|
||||||
|
if (this.actor.tmrApp) {
|
||||||
this.actor.tmrApp = undefined; // Cleanup reference
|
this.actor.tmrApp = undefined; // Cleanup reference
|
||||||
if ( !this.viewOnly ) {
|
if (!this.viewOnly) {
|
||||||
this.actor.setStatusEffect("EFFECT.StatusDemiReve", false);
|
await this.actor.setEffect(STATUSES.StatusDemiReve, false)
|
||||||
this._tellToGM(this.actor.name + " a quitté les terres médianes");
|
this._tellToGM(this.actor.name + " a quitté les terres médianes");
|
||||||
}
|
}
|
||||||
this.actor.santeIncDec("fatigue", this.cumulFatigue).then(super.close()); // moving 1 cell costs 1 fatigue
|
await this.actor.santeIncDec("fatigue", this.cumulFatigue)
|
||||||
}
|
}
|
||||||
|
await super.close(); // moving 1 cell costs 1 fatigue
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
@ -319,11 +312,11 @@ export class RdDTMRDialog extends Dialog {
|
|||||||
this.currentRencontre.graphics = []; // Keep track of rectangles to delete it
|
this.currentRencontre.graphics = []; // Keep track of rectangles to delete it
|
||||||
this.currentRencontre.locList = duplicate(listCoordTMR); // And track of allowed location
|
this.currentRencontre.locList = duplicate(listCoordTMR); // And track of allowed location
|
||||||
for (let coordTMR of listCoordTMR) {
|
for (let coordTMR of listCoordTMR) {
|
||||||
let rect = this._getCaseRectangleCoord(coordTMR);
|
const rect = this._getCaseRectangleCoord(coordTMR);
|
||||||
var rectDraw = new PIXI.Graphics();
|
const rectDraw = new PIXI.Graphics();
|
||||||
rectDraw.beginFill(0xFFFF00, 0.3);
|
rectDraw.beginFill(0xffff00, 0.3);
|
||||||
// set the line style to have a width of 5 and set the color to red
|
// set the line style to have a width of 5 and set the color to red
|
||||||
rectDraw.lineStyle(5, 0xFF0000);
|
rectDraw.lineStyle(5, 0xff0000);
|
||||||
// draw a rectangle
|
// draw a rectangle
|
||||||
rectDraw.drawRect(rect.x, rect.y, rect.w, rect.h);
|
rectDraw.drawRect(rect.x, rect.y, rect.w, rect.h);
|
||||||
this.pixiApp.stage.addChild(rectDraw);
|
this.pixiApp.stage.addChild(rectDraw);
|
||||||
@ -339,19 +332,13 @@ export class RdDTMRDialog extends Dialog {
|
|||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
async choisirCasePortee(coord, portee) {
|
async choisirCasePortee(coord, portee) {
|
||||||
if (this.actor.isTMRCache())
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
// Récupère la liste des cases à portées
|
// Récupère la liste des cases à portées
|
||||||
let locList = TMRUtility.getTMRPortee(coord, portee);
|
this.colorierZoneRencontre(TMRUtility.getTMRPortee(coord, portee));
|
||||||
this.colorierZoneRencontre(locList);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
async choisirCaseType(type) {
|
async choisirCaseType(type) {
|
||||||
const locList = TMRUtility.filterTMR(it => it.type == type).map(it => it.coord);
|
this.colorierZoneRencontre(TMRUtility.filterTMR(it => it.type == type).map(it => it.coord));
|
||||||
this.colorierZoneRencontre(locList);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
@ -486,12 +473,13 @@ export class RdDTMRDialog extends Dialog {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
async manageRencontre(tmr, postRencontre) {
|
async manageRencontre(tmr) {
|
||||||
if (this.viewOnly) {
|
if (this.viewOnly) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
this.descenteTMR = false;
|
||||||
this.currentRencontre = undefined;
|
this.currentRencontre = undefined;
|
||||||
if (this._presentCite(tmr, postRencontre)) {
|
if (this._presentCite(tmr)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
let rencontre = await this._jetDeRencontre(tmr);
|
let rencontre = await this._jetDeRencontre(tmr);
|
||||||
@ -501,27 +489,27 @@ export class RdDTMRDialog extends Dialog {
|
|||||||
console.log("manageRencontre", rencontre);
|
console.log("manageRencontre", rencontre);
|
||||||
this.currentRencontre = duplicate(rencontre);
|
this.currentRencontre = duplicate(rencontre);
|
||||||
|
|
||||||
let dialog = new RdDTMRRencontreDialog("", this, this.currentRencontre, postRencontre);
|
let dialog = new RdDTMRRencontreDialog(this, this.currentRencontre, () => this.postRencontre(tmr));
|
||||||
dialog.render(true);
|
dialog.render(true);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
postRencontre();
|
this.postRencontre(tmr);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
_presentCite(tmr, postRencontre) {
|
_presentCite(tmr) {
|
||||||
const presentCite = this.casesSpeciales.find(c => EffetsDraconiques.presentCites.isCase(c, tmr.coord));
|
const presentCite = this.casesSpeciales.find(c => EffetsDraconiques.presentCites.isCase(c, tmr.coord));
|
||||||
if (presentCite) {
|
if (presentCite) {
|
||||||
this.minimize();
|
this.minimize();
|
||||||
const caseData = Misc.data(presentCite);
|
const caseData = presentCite;
|
||||||
EffetsDraconiques.presentCites.choisirUnPresent(caseData, (type => this._utiliserPresentCite(presentCite, type, tmr, postRencontre)));
|
EffetsDraconiques.presentCites.choisirUnPresent(caseData, (type => this._utiliserPresentCite(presentCite, type, tmr)));
|
||||||
}
|
}
|
||||||
return presentCite;
|
return presentCite;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
async _utiliserPresentCite(presentCite, typeRencontre, tmr, postRencontre) {
|
async _utiliserPresentCite(presentCite, typeRencontre, tmr) {
|
||||||
this.currentRencontre = TMRRencontres.getRencontre(typeRencontre);
|
this.currentRencontre = TMRRencontres.getRencontre(typeRencontre);
|
||||||
await TMRRencontres.evaluerForceRencontre(this.currentRencontre);
|
await TMRRencontres.evaluerForceRencontre(this.currentRencontre);
|
||||||
await EffetsDraconiques.presentCites.ouvrirLePresent(this.actor, presentCite);
|
await EffetsDraconiques.presentCites.ouvrirLePresent(this.actor, presentCite);
|
||||||
@ -540,7 +528,7 @@ export class RdDTMRDialog extends Dialog {
|
|||||||
await this._tentativeMaitrise(rencontreData);
|
await this._tentativeMaitrise(rencontreData);
|
||||||
|
|
||||||
this.maximize();
|
this.maximize();
|
||||||
postRencontre();
|
this.postRencontre(tmr);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
@ -576,6 +564,9 @@ export class RdDTMRDialog extends Dialog {
|
|||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
async manageTmrInnaccessible(tmr) {
|
async manageTmrInnaccessible(tmr) {
|
||||||
|
if (!tmr) {
|
||||||
|
return await this.actor.reinsertionAleatoire('Sortie de carte');
|
||||||
|
}
|
||||||
const caseTmrInnaccessible = this.casesSpeciales.find(c => EffetsDraconiques.isInnaccessible(c, tmr.coord));
|
const caseTmrInnaccessible = this.casesSpeciales.find(c => EffetsDraconiques.isInnaccessible(c, tmr.coord));
|
||||||
if (caseTmrInnaccessible) {
|
if (caseTmrInnaccessible) {
|
||||||
return await this.actor.reinsertionAleatoire(caseTmrInnaccessible.name);
|
return await this.actor.reinsertionAleatoire(caseTmrInnaccessible.name);
|
||||||
@ -596,7 +587,7 @@ export class RdDTMRDialog extends Dialog {
|
|||||||
maitrise: { verbe: 'maîtriser', action: 'Maîtriser le fleuve' }
|
maitrise: { verbe: 'maîtriser', action: 'Maîtriser le fleuve' }
|
||||||
}
|
}
|
||||||
rollData.double = EffetsDraconiques.isDoubleResistanceFleuve(this.actor) ? true : undefined,
|
rollData.double = EffetsDraconiques.isDoubleResistanceFleuve(this.actor) ? true : undefined,
|
||||||
rollData.competence.data.defaut_carac = 'reve-actuel';
|
rollData.competence.system.defaut_carac = 'reve-actuel';
|
||||||
await this._rollMaitriseCaseHumide(rollData);
|
await this._rollMaitriseCaseHumide(rollData);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -608,7 +599,6 @@ export class RdDTMRDialog extends Dialog {
|
|||||||
|
|
||||||
async _resultatMaitriseCaseHumide(rollData) {
|
async _resultatMaitriseCaseHumide(rollData) {
|
||||||
await this.souffleSiEchecTotal(rollData);
|
await this.souffleSiEchecTotal(rollData);
|
||||||
this.toclose = rollData.rolled.isEchec;
|
|
||||||
if (rollData.rolled.isSuccess && rollData.double) {
|
if (rollData.rolled.isSuccess && rollData.double) {
|
||||||
rollData.previous = { rolled: rollData.rolled, ajustements: rollData.ajustements };
|
rollData.previous = { rolled: rollData.rolled, ajustements: rollData.ajustements };
|
||||||
rollData.double = undefined;
|
rollData.double = undefined;
|
||||||
@ -621,7 +611,7 @@ export class RdDTMRDialog extends Dialog {
|
|||||||
content: await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/chat-resultat-maitrise-tmr.html`, rollData)
|
content: await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/chat-resultat-maitrise-tmr.html`, rollData)
|
||||||
});
|
});
|
||||||
if (rollData.rolled.isEchec) {
|
if (rollData.rolled.isEchec) {
|
||||||
this.close();
|
await this.close();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -721,7 +711,7 @@ export class RdDTMRDialog extends Dialog {
|
|||||||
forceCarac: { 'reve-actuel': { label: "Rêve Actuel", value: this.actor.getReveActuel() } },
|
forceCarac: { 'reve-actuel': { label: "Rêve Actuel", value: this.actor.getReveActuel() } },
|
||||||
maitrise: { verbe: 'conquérir', action: options.action }
|
maitrise: { verbe: 'conquérir', action: options.action }
|
||||||
};
|
};
|
||||||
rollData.competence.data.defaut_carac = 'reve-actuel';
|
rollData.competence.system.defaut_carac = 'reve-actuel';
|
||||||
|
|
||||||
await this._maitriserTMR(rollData, r => this._onResultatConquerir(r, options));
|
await this._maitriserTMR(rollData, r => this._onResultatConquerir(r, options));
|
||||||
}
|
}
|
||||||
@ -731,8 +721,6 @@ export class RdDTMRDialog extends Dialog {
|
|||||||
if (rollData.rolled.isETotal) {
|
if (rollData.rolled.isETotal) {
|
||||||
rollData.souffle = await this.actor.ajouterSouffle({ chat: false });
|
rollData.souffle = await this.actor.ajouterSouffle({ chat: false });
|
||||||
}
|
}
|
||||||
this.toclose = rollData.rolled.isEchec;
|
|
||||||
|
|
||||||
rollData.poesie = await Poetique.getExtrait();
|
rollData.poesie = await Poetique.getExtrait();
|
||||||
ChatMessage.create({
|
ChatMessage.create({
|
||||||
whisper: ChatUtility.getWhisperRecipientsAndGMs(game.user.name),
|
whisper: ChatUtility.getWhisperRecipientsAndGMs(game.user.name),
|
||||||
@ -777,9 +765,8 @@ export class RdDTMRDialog extends Dialog {
|
|||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
async declencheSortEnReserve(coord) {
|
async declencheSortEnReserve(coord) {
|
||||||
|
let sorts = this.getSortsReserve(coord);
|
||||||
let sortsEnCoord = TMRUtility.getSortsReserve(this.sortsReserves, coord);
|
if (sorts.length > 0) {
|
||||||
if (sortsEnCoord.length > 0) {
|
|
||||||
if (EffetsDraconiques.isSortReserveImpossible(this.actor)) {
|
if (EffetsDraconiques.isSortReserveImpossible(this.actor)) {
|
||||||
ui.notifications.error("Une queue ou un souffle vous empèche de déclencher de sort!");
|
ui.notifications.error("Une queue ou un souffle vous empèche de déclencher de sort!");
|
||||||
return;
|
return;
|
||||||
@ -787,8 +774,8 @@ export class RdDTMRDialog extends Dialog {
|
|||||||
if (!EffetsDraconiques.isUrgenceDraconique(this.actor) &&
|
if (!EffetsDraconiques.isUrgenceDraconique(this.actor) &&
|
||||||
(EffetsDraconiques.isReserveEnSecurite(this.actor) || this.isReserveExtensible(coord))) {
|
(EffetsDraconiques.isReserveEnSecurite(this.actor) || this.isReserveExtensible(coord))) {
|
||||||
let msg = "Vous êtes sur une case avec un Sort en Réserve. Grâce à votre Tête <strong>Reserve en Sécurité</strong> ou <strong>Réserve Exensible</strong>, vous pouvez contrôler le déclenchement. Cliquez si vous souhaitez le déclencher : <ul>";
|
let msg = "Vous êtes sur une case avec un Sort en Réserve. Grâce à votre Tête <strong>Reserve en Sécurité</strong> ou <strong>Réserve Exensible</strong>, vous pouvez contrôler le déclenchement. Cliquez si vous souhaitez le déclencher : <ul>";
|
||||||
for (let sortReserve of sortsEnCoord) {
|
for (let sort of sorts) {
|
||||||
msg += "<li><a class='chat-card-button' id='sort-reserve' data-actor-id='" + this.actor._id + "' data-tmr-coord='" + coord + "' data-sort-id='" + sortReserve.sort._id + "'>" + sortReserve.sort.name + "</a></li>";
|
msg += `<li><a class="chat-card-button declencher-sort-reserve" data-actor-id="${this.actor.id}" data-tmr-coord="${coord}" data-sort-id='${sort.id}">${sort.name}</a></li>`;
|
||||||
}
|
}
|
||||||
msg += "</ol>";
|
msg += "</ol>";
|
||||||
ChatMessage.create({
|
ChatMessage.create({
|
||||||
@ -797,33 +784,35 @@ export class RdDTMRDialog extends Dialog {
|
|||||||
});
|
});
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
await this.processSortReserve(sortsEnCoord[0]);
|
await this.processSortReserve(sorts[0]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
lancerSortEnReserve(coord, sortId) {
|
lancerSortEnReserve(coord, sortId) {
|
||||||
let sortEnCoord = TMRUtility.getSortsReserve(this.sortsReserves, coord);
|
let sorts = this.getSortsReserve(coord);
|
||||||
let sortReserve = sortEnCoord.find(sortReserve => sortReserve.sort._id == sortId);
|
let sort = sorts.find(it => it.id == sortId);
|
||||||
if (sortReserve) {
|
if (sort) {
|
||||||
this.processSortReserve(sortReserve);
|
this.processSortReserve(sort);
|
||||||
} else {
|
} else {
|
||||||
ChatMessage.create({
|
ChatMessage.create({
|
||||||
content: "Une erreur est survenue : impossible de récupérer le sort en réserve demandé.",
|
content:
|
||||||
whisper: ChatMessage.getWhisperRecipients(game.user.name)
|
"Une erreur est survenue : impossible de récupérer le sort en réserve demandé.",
|
||||||
|
whisper: ChatMessage.getWhisperRecipients(game.user.name),
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
async processSortReserve(sortReserve) {
|
async processSortReserve(sortReserve) {
|
||||||
await this.actor.deleteSortReserve(sortReserve);
|
await this.actor.deleteEmbeddedDocuments('Item', [sortReserve.id]);
|
||||||
//this.updateSortReserve();
|
console.log("declencheSortEnReserve", sortReserve);
|
||||||
console.log("declencheSortEnReserve", sortReserve)
|
this._tellToUserAndGM(`Vous avez déclenché
|
||||||
this._tellToUserAndGM(`Vous avez déclenché le sort en réserve <strong> ${sortReserve.sort.name}</strong>
|
${sortReserve.system.echectotal ? "<strong>l'échec total!</strong>" : "le sort"}
|
||||||
avec ${sortReserve.sort.data.ptreve_reel} points de Rêve
|
en réserve <strong>${sortReserve.name}</strong>
|
||||||
en ${sortReserve.coord} (${TMRUtility.getTMRLabel(sortReserve.coord)})
|
avec ${sortReserve.system.ptreve} points de Rêve
|
||||||
`);
|
en ${sortReserve.system.coord} (${TMRUtility.getTMRLabel(sortReserve.system.coord)}).
|
||||||
|
L'heure ciblée est ${sortReserve.system.heurecible}`);
|
||||||
this.close();
|
this.close();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -875,7 +864,6 @@ export class RdDTMRDialog extends Dialog {
|
|||||||
if (this.viewOnly) {
|
if (this.viewOnly) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
let clickOddq = RdDTMRDialog._computeEventOddq(event.data.originalEvent);
|
let clickOddq = RdDTMRDialog._computeEventOddq(event.data.originalEvent);
|
||||||
await this._onClickTMRPos(clickOddq); // Vérifier l'état des compteurs reve/fatigue/vie
|
await this._onClickTMRPos(clickOddq); // Vérifier l'état des compteurs reve/fatigue/vie
|
||||||
}
|
}
|
||||||
@ -930,7 +918,7 @@ export class RdDTMRDialog extends Dialog {
|
|||||||
|
|
||||||
const isInArea = this.rencontreState == 'aucune'
|
const isInArea = this.rencontreState == 'aucune'
|
||||||
? (this.isTerreAttache(targetCoord) || this.isConnaissanceFleuve(currentCoord, targetCoord) || TMRUtility.distanceOddq(fromOddq, toOddq) <= 1)
|
? (this.isTerreAttache(targetCoord) || this.isConnaissanceFleuve(currentCoord, targetCoord) || TMRUtility.distanceOddq(fromOddq, toOddq) <= 1)
|
||||||
: this.currentRencontre?.locList.find(coord => coord == targetCoord) ?? false
|
: this.currentRencontre?.locList?.find(coord => coord == targetCoord) ?? false
|
||||||
if (isInArea) {
|
if (isInArea) {
|
||||||
switch (this.rencontreState) {
|
switch (this.rencontreState) {
|
||||||
case 'aucune': return 'normal';
|
case 'aucune': return 'normal';
|
||||||
@ -979,7 +967,7 @@ export class RdDTMRDialog extends Dialog {
|
|||||||
this.actor.notifyRefreshTMR();
|
this.actor.notifyRefreshTMR();
|
||||||
|
|
||||||
if (deplacementType == 'normal') { // Pas de rencontres après un saut de type passeur/changeur/...
|
if (deplacementType == 'normal') { // Pas de rencontres après un saut de type passeur/changeur/...
|
||||||
await this.manageRencontre(tmr, () => this.postRencontre(tmr));
|
await this.manageRencontre(tmr);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
await this.postRencontre(tmr);
|
await this.postRencontre(tmr);
|
||||||
@ -998,13 +986,14 @@ export class RdDTMRDialog extends Dialog {
|
|||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
async postRencontre(tmr) {
|
async postRencontre(tmr) {
|
||||||
if (!(this.viewOnly || this.currentRencontre)) {
|
if (!(this.viewOnly || this.currentRencontre)) {
|
||||||
await this.manageCaseHumide(tmr);
|
// TODO: vérifier que la méthode s'arrête en cas de non-maîtrise
|
||||||
await this.conquerirCiteFermee(tmr);
|
if (!this.descenteTMR) await this.manageCaseHumide(tmr);
|
||||||
await this.purifierPeriple(tmr);
|
if (!this.descenteTMR) await this.conquerirCiteFermee(tmr);
|
||||||
await this.conquerirTMR(tmr);
|
if (!this.descenteTMR) await this.purifierPeriple(tmr);
|
||||||
await this.validerVisite(tmr);
|
if (!this.descenteTMR) await this.conquerirTMR(tmr);
|
||||||
await this.declencheSortEnReserve(tmr.coord);
|
if (!this.descenteTMR) await this.validerVisite(tmr);
|
||||||
await this.actor.checkSoufflePeage(tmr);
|
if (!this.descenteTMR) await this.declencheSortEnReserve(tmr.coord);
|
||||||
|
if (!this.descenteTMR) await this.actor.checkSoufflePeage(tmr);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1023,7 +1012,7 @@ export class RdDTMRDialog extends Dialog {
|
|||||||
let x = origEvent.clientX - canvasRect.left;
|
let x = origEvent.clientX - canvasRect.left;
|
||||||
let y = origEvent.clientY - canvasRect.top;
|
let y = origEvent.clientY - canvasRect.top;
|
||||||
let col = Math.floor(x / tmrConstants.cellw); // [From 0 -> 12]
|
let col = Math.floor(x / tmrConstants.cellw); // [From 0 -> 12]
|
||||||
y -= (col % 2 == 0) ? tmrConstants.col1_y : tmrConstants.col2_y;
|
y -= col % 2 == 0 ? tmrConstants.col1_y : tmrConstants.col2_y;
|
||||||
let row = Math.floor(y / tmrConstants.cellh); // [From 0 -> 14]
|
let row = Math.floor(y / tmrConstants.cellh); // [From 0 -> 14]
|
||||||
return { col: col, row: row };
|
return { col: col, row: row };
|
||||||
}
|
}
|
||||||
@ -1033,7 +1022,7 @@ export class RdDTMRDialog extends Dialog {
|
|||||||
_getCaseRectangleCoord(coord) {
|
_getCaseRectangleCoord(coord) {
|
||||||
return this.pixiTMR.getCaseRectangle(TMRUtility.coordTMRToOddq(coord));
|
return this.pixiTMR.getCaseRectangle(TMRUtility.coordTMRToOddq(coord));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
_removeTokens(filter) {
|
_removeTokens(filter) {
|
||||||
const tokensToRemove = this.allTokens.filter(filter);
|
const tokensToRemove = this.allTokens.filter(filter);
|
||||||
@ -1041,7 +1030,7 @@ export class RdDTMRDialog extends Dialog {
|
|||||||
this.pixiApp.stage.removeChild(token.sprite);
|
this.pixiApp.stage.removeChild(token.sprite);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
_trackToken(token) {
|
_trackToken(token) {
|
||||||
if (this.demiReve === token && this.isDemiReveCache()) {
|
if (this.demiReve === token && this.isDemiReveCache()) {
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
export class RdDTMRRencontreDialog extends Dialog {
|
export class RdDTMRRencontreDialog extends Dialog {
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
constructor(html, tmrApp, rencontre, postRencontre) {
|
constructor(tmrApp, rencontre, postRencontre) {
|
||||||
const dialogConf = {
|
const dialogConf = {
|
||||||
title: "Rencontre en TMR!",
|
title: "Rencontre en TMR!",
|
||||||
content: "Vous rencontrez un " + rencontre.name + " de force " + rencontre.force + "<br>",
|
content: "Vous rencontrez un " + rencontre.name + " de force " + rencontre.force + "<br>",
|
||||||
|
@ -8,7 +8,7 @@ export class RdDTokenHud {
|
|||||||
|
|
||||||
static init() {
|
static init() {
|
||||||
// Integration du TokenHUD
|
// Integration du TokenHUD
|
||||||
Hooks.on('renderTokenHUD', (app, html, data) => { RdDTokenHud.addTokenHudExtensions(app, html, data._id) });
|
Hooks.on('renderTokenHUD', (app, html, token) => { RdDTokenHud.addTokenHudExtensions(app, html, token._id) });
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
@ -22,7 +22,7 @@ export class RdDTokenHud {
|
|||||||
|
|
||||||
let token = canvas.tokens.get(tokenId);
|
let token = canvas.tokens.get(tokenId);
|
||||||
let actor = token.actor;
|
let actor = token.actor;
|
||||||
let combatant = game.combat.combatants.find(c => Misc.data(c).tokenId == tokenId);
|
let combatant = game.combat.combatants.find(c => c.tokenId == tokenId);
|
||||||
if (! (combatant?.actor) ) {
|
if (! (combatant?.actor) ) {
|
||||||
ui.notifications.warn(`Le combatant ${token.name} n'est pas associé à un acteur, impossible de déterminer ses actions de combat!`)
|
ui.notifications.warn(`Le combatant ${token.name} n'est pas associé à un acteur, impossible de déterminer ses actions de combat!`)
|
||||||
return;
|
return;
|
||||||
@ -63,7 +63,7 @@ export class RdDTokenHud {
|
|||||||
const actionIndex = event.currentTarget.attributes['data-action-index']?.value;
|
const actionIndex = event.currentTarget.attributes['data-action-index']?.value;
|
||||||
const action = actionsCombat[actionIndex];
|
const action = actionsCombat[actionIndex];
|
||||||
if (action.action == 'conjurer') {
|
if (action.action == 'conjurer') {
|
||||||
actor.conjurerPossession(actor.getPossession(action.data.possessionid));
|
actor.conjurerPossession(actor.getPossession(action.system.possessionid));
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
actor.rollArme(action);
|
actor.rollArme(action);
|
||||||
@ -76,7 +76,7 @@ export class RdDTokenHud {
|
|||||||
case 'inc': return RdDCombatManager.incDecInit(combatantId, 0.01);
|
case 'inc': return RdDCombatManager.incDecInit(combatantId, 0.01);
|
||||||
case 'dec': return RdDCombatManager.incDecInit(combatantId, -0.01);
|
case 'dec': return RdDCombatManager.incDecInit(combatantId, -0.01);
|
||||||
case 'autre': return RdDCombatManager.rollInitiativeAction(combatantId,
|
case 'autre': return RdDCombatManager.rollInitiativeAction(combatantId,
|
||||||
{ name: "Autre action", action: 'autre', data: { initOnly: true, competence: "Autre action" } });
|
{ name: "Autre action", action: 'autre', system: { initOnly: true, competence: "Autre action" } });
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -104,7 +104,7 @@ export class RdDUtility {
|
|||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static async init() {
|
static async init() {
|
||||||
Hooks.on("renderChatMessage", async (app, html, msg) => RdDUtility.onRenderChatMessage(app, html, msg));
|
Hooks.on("renderChatMessage", async (app, html, msg) => RdDUtility.onRenderChatMessage(app, html, msg));
|
||||||
Hooks.on('renderChatLog', (log, html, data) => RdDUtility.chatListeners(html));
|
Hooks.on('renderChatLog', (log, html, chatLog) => RdDUtility.chatListeners(html));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
@ -115,21 +115,45 @@ export class RdDUtility {
|
|||||||
'systems/foundryvtt-reve-de-dragon/templates/actor-creature-sheet.html',
|
'systems/foundryvtt-reve-de-dragon/templates/actor-creature-sheet.html',
|
||||||
'systems/foundryvtt-reve-de-dragon/templates/actor-entite-sheet.html',
|
'systems/foundryvtt-reve-de-dragon/templates/actor-entite-sheet.html',
|
||||||
'systems/foundryvtt-reve-de-dragon/templates/actor-vehicule-sheet.html',
|
'systems/foundryvtt-reve-de-dragon/templates/actor-vehicule-sheet.html',
|
||||||
'systems/foundryvtt-reve-de-dragon/templates/actor-sheet-competence-partial.html',
|
// sous-parties de feuilles de personnages
|
||||||
'systems/foundryvtt-reve-de-dragon/templates/actor-sheet-categorie-competences-partial.html',
|
'systems/foundryvtt-reve-de-dragon/templates/actor/competence.html',
|
||||||
'systems/foundryvtt-reve-de-dragon/templates/actor-sheet-effects-partial.html',
|
'systems/foundryvtt-reve-de-dragon/templates/actor/categorie-competences.html',
|
||||||
'systems/foundryvtt-reve-de-dragon/templates/actor-sheet-oeuvre-partial.html',
|
'systems/foundryvtt-reve-de-dragon/templates/actor/effects.html',
|
||||||
'systems/foundryvtt-reve-de-dragon/templates/actor-liste-blessures-partial.html',
|
'systems/foundryvtt-reve-de-dragon/templates/actor/xp-competences.html',
|
||||||
'systems/foundryvtt-reve-de-dragon/templates/actor-blessure-partial.html',
|
'systems/foundryvtt-reve-de-dragon/templates/actor/combat.html',
|
||||||
// Conteneur/item in Actor sheet
|
'systems/foundryvtt-reve-de-dragon/templates/actor/blessures.html',
|
||||||
'systems/foundryvtt-reve-de-dragon/templates/actor-sheet-inventaire.html',
|
'systems/foundryvtt-reve-de-dragon/templates/actor/blessure.html',
|
||||||
'systems/foundryvtt-reve-de-dragon/templates/actor-sheet-inventaire-item.html',
|
'systems/foundryvtt-reve-de-dragon/templates/actor/maladies-poisons.html',
|
||||||
"systems/foundryvtt-reve-de-dragon/templates/actor-sheet-inventaire-monnaie.html",
|
'systems/foundryvtt-reve-de-dragon/templates/actor/possessions.html',
|
||||||
'systems/foundryvtt-reve-de-dragon/templates/actor-sheet-liens-animaux.html',
|
'systems/foundryvtt-reve-de-dragon/templates/actor/taches.html',
|
||||||
'systems/foundryvtt-reve-de-dragon/templates/actor-sheet-liens-suivants.html',
|
'systems/foundryvtt-reve-de-dragon/templates/actor/taches.html',
|
||||||
'systems/foundryvtt-reve-de-dragon/templates/actor-sheet-liens-vehicules.html',
|
'systems/foundryvtt-reve-de-dragon/templates/actor/oeuvres.html',
|
||||||
'systems/foundryvtt-reve-de-dragon/templates/actor-sheet-editor-notes-mj.html',
|
'systems/foundryvtt-reve-de-dragon/templates/actor/oeuvre.html',
|
||||||
|
'systems/foundryvtt-reve-de-dragon/templates/actor/jeux.html',
|
||||||
|
'systems/foundryvtt-reve-de-dragon/templates/actor/alchimie.html',
|
||||||
|
'systems/foundryvtt-reve-de-dragon/templates/actor/astrologie.html',
|
||||||
|
'systems/foundryvtt-reve-de-dragon/templates/actor/non-haut-revant.html',
|
||||||
|
'systems/foundryvtt-reve-de-dragon/templates/actor/haut-revant.html',
|
||||||
|
'systems/foundryvtt-reve-de-dragon/templates/actor/dragon-queues.html',
|
||||||
|
'systems/foundryvtt-reve-de-dragon/templates/actor/dragon-queue.html',
|
||||||
|
'systems/foundryvtt-reve-de-dragon/templates/actor/dragon-souffles.html',
|
||||||
|
'systems/foundryvtt-reve-de-dragon/templates/actor/dragon-tetes.html',
|
||||||
|
'systems/foundryvtt-reve-de-dragon/templates/actor/hr-signes-draconiques.html',
|
||||||
|
'systems/foundryvtt-reve-de-dragon/templates/actor/hr-rencontres.html',
|
||||||
|
'systems/foundryvtt-reve-de-dragon/templates/actor/hr-sorts.html',
|
||||||
|
'systems/foundryvtt-reve-de-dragon/templates/actor/hr-sorts-reserve.html',
|
||||||
|
'systems/foundryvtt-reve-de-dragon/templates/actor/hr-meditations.html',
|
||||||
|
'systems/foundryvtt-reve-de-dragon/templates/actor/hr-casestmr.html',
|
||||||
|
'systems/foundryvtt-reve-de-dragon/templates/actor/xp-journal.html',
|
||||||
|
'systems/foundryvtt-reve-de-dragon/templates/actor/editor-notes-mj.html',
|
||||||
|
'systems/foundryvtt-reve-de-dragon/templates/actor/inventaire.html',
|
||||||
|
'systems/foundryvtt-reve-de-dragon/templates/actor/inventaire-item.html',
|
||||||
|
"systems/foundryvtt-reve-de-dragon/templates/actor/inventaire-monnaie.html",
|
||||||
|
'systems/foundryvtt-reve-de-dragon/templates/actor/liens-animaux.html',
|
||||||
|
'systems/foundryvtt-reve-de-dragon/templates/actor/liens-suivants.html',
|
||||||
|
'systems/foundryvtt-reve-de-dragon/templates/actor/liens-vehicules.html',
|
||||||
//Items
|
//Items
|
||||||
|
'systems/foundryvtt-reve-de-dragon/templates/header-item.html',
|
||||||
'systems/foundryvtt-reve-de-dragon/templates/item-competence-sheet.html',
|
'systems/foundryvtt-reve-de-dragon/templates/item-competence-sheet.html',
|
||||||
'systems/foundryvtt-reve-de-dragon/templates/item-competencecreature-sheet.html',
|
'systems/foundryvtt-reve-de-dragon/templates/item-competencecreature-sheet.html',
|
||||||
'systems/foundryvtt-reve-de-dragon/templates/item-arme-sheet.html',
|
'systems/foundryvtt-reve-de-dragon/templates/item-arme-sheet.html',
|
||||||
@ -239,7 +263,7 @@ export class RdDUtility {
|
|||||||
Handlebars.registerHelper('typeTmr-name', coord => TMRUtility.typeTmrName(coord));
|
Handlebars.registerHelper('typeTmr-name', coord => TMRUtility.typeTmrName(coord));
|
||||||
Handlebars.registerHelper('min', (...args) => Math.min(...args.slice(0, -1)));
|
Handlebars.registerHelper('min', (...args) => Math.min(...args.slice(0, -1)));
|
||||||
|
|
||||||
Handlebars.registerHelper('filtreTriCompetences', competences => competences.filter(it => it.visible)
|
Handlebars.registerHelper('filtreTriCompetences', competences => competences.filter(it => it.system.isVisible)
|
||||||
.sort((a, b) => {
|
.sort((a, b) => {
|
||||||
if (a.name.startsWith("Survie") && b.name.startsWith("Survie")) {
|
if (a.name.startsWith("Survie") && b.name.startsWith("Survie")) {
|
||||||
if (a.name.includes("Cité")) return -1;
|
if (a.name.includes("Cité")) return -1;
|
||||||
@ -248,7 +272,7 @@ export class RdDUtility {
|
|||||||
if (b.name.includes("Extérieur")) return 1;
|
if (b.name.includes("Extérieur")) return 1;
|
||||||
return a.name.localeCompare(b.name);
|
return a.name.localeCompare(b.name);
|
||||||
}
|
}
|
||||||
if (a.data.categorie.startsWith("melee") && b.data.categorie.startsWith("melee")) {
|
if (a.system.categorie.startsWith("melee") && b.system.categorie.startsWith("melee")) {
|
||||||
if (a.name.includes("Corps")) return -1;
|
if (a.name.includes("Corps")) return -1;
|
||||||
if (b.name.includes("Corps")) return 1;
|
if (b.name.includes("Corps")) return 1;
|
||||||
if (a.name.includes("Dague")) return -1;
|
if (a.name.includes("Dague")) return -1;
|
||||||
@ -365,48 +389,50 @@ export class RdDUtility {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static filterItemsPerTypeForSheet(formData) {
|
static filterItemsPerTypeForSheet(formData, itemTypes) {
|
||||||
|
|
||||||
RdDUtility.filterEquipementParType(formData);
|
RdDUtility.filterEquipementParType(formData, itemTypes);
|
||||||
|
|
||||||
formData.sorts = this.arrayOrEmpty(formData.itemsByType['sort']);
|
formData.sorts = this.arrayOrEmpty(itemTypes['sort']);
|
||||||
formData.signesdraconiques = this.arrayOrEmpty(formData.itemsByType['signedraconique']);
|
formData.casestmr = this.arrayOrEmpty(itemTypes['casetmr']);
|
||||||
formData.queues = this.arrayOrEmpty(formData.itemsByType['queue']);
|
formData.signesdraconiques = this.arrayOrEmpty(itemTypes['signedraconique']);
|
||||||
formData.souffles = this.arrayOrEmpty(formData.itemsByType['souffle']);
|
formData.queues = this.arrayOrEmpty(itemTypes['queue']);
|
||||||
formData.ombres = this.arrayOrEmpty(formData.itemsByType['ombre']);
|
formData.souffles = this.arrayOrEmpty(itemTypes['souffle']);
|
||||||
formData.tetes = this.arrayOrEmpty(formData.itemsByType['tete']);
|
formData.ombres = this.arrayOrEmpty(itemTypes['ombre']);
|
||||||
formData.taches = this.arrayOrEmpty(formData.itemsByType['tache']);
|
formData.tetes = this.arrayOrEmpty(itemTypes['tete']);
|
||||||
formData.meditations = this.arrayOrEmpty(formData.itemsByType['meditation']);
|
formData.taches = this.arrayOrEmpty(itemTypes['tache']);
|
||||||
formData.chants = this.arrayOrEmpty(formData.itemsByType['chant']);
|
formData.meditations = this.arrayOrEmpty(itemTypes['meditation']);
|
||||||
formData.danses = this.arrayOrEmpty(formData.itemsByType['danse']);
|
formData.chants = this.arrayOrEmpty(itemTypes['chant']);
|
||||||
formData.musiques = this.arrayOrEmpty(formData.itemsByType['musique']);
|
formData.danses = this.arrayOrEmpty(itemTypes['danse']);
|
||||||
formData.oeuvres = this.arrayOrEmpty(formData.itemsByType['oeuvre']);
|
formData.musiques = this.arrayOrEmpty(itemTypes['musique']);
|
||||||
formData.jeux = this.arrayOrEmpty(formData.itemsByType['jeu']);
|
formData.oeuvres = this.arrayOrEmpty(itemTypes['oeuvre']);
|
||||||
|
formData.jeux = this.arrayOrEmpty(itemTypes['jeu']);
|
||||||
|
|
||||||
formData.recettescuisine = this.arrayOrEmpty(formData.itemsByType['recettecuisine']);
|
formData.recettescuisine = this.arrayOrEmpty(itemTypes['recettecuisine']);
|
||||||
formData.recettesAlchimiques = this.arrayOrEmpty(formData.itemsByType['recettealchimique']);
|
formData.recettesAlchimiques = this.arrayOrEmpty(itemTypes['recettealchimique']);
|
||||||
formData.maladies = this.arrayOrEmpty(formData.itemsByType['maladie']);
|
formData.maladies = this.arrayOrEmpty(itemTypes['maladie']);
|
||||||
formData.poisons = this.arrayOrEmpty(formData.itemsByType['poison']);
|
formData.poisons = this.arrayOrEmpty(itemTypes['poison']);
|
||||||
formData.possessions = this.arrayOrEmpty(formData.itemsByType['possession']);
|
formData.possessions = this.arrayOrEmpty(itemTypes['possession']);
|
||||||
formData.maladiesPoisons = formData.maladies.concat(formData.poisons);
|
formData.maladiesPoisons = formData.maladies.concat(formData.poisons);
|
||||||
formData.competences = (formData.itemsByType.competence ?? []).concat(formData.itemsByType.competencecreature ?? []);
|
formData.competences = (itemTypes['competence'] ?? []).concat(itemTypes['competencecreature'] ?? []);
|
||||||
|
formData.sortsReserve = this.arrayOrEmpty(itemTypes['sortreserve']);
|
||||||
}
|
}
|
||||||
|
|
||||||
static filterEquipementParType(formData) {
|
static filterEquipementParType(formData, itemTypes) {
|
||||||
formData.conteneurs = this.arrayOrEmpty(formData.itemsByType['conteneur']);
|
formData.conteneurs = this.arrayOrEmpty(itemTypes['conteneur']);
|
||||||
|
|
||||||
formData.materiel = this.arrayOrEmpty(formData.itemsByType['objet']);
|
formData.materiel = this.arrayOrEmpty(itemTypes['objet']);
|
||||||
formData.armes = this.arrayOrEmpty(formData.itemsByType['arme']);
|
formData.armes = this.arrayOrEmpty(itemTypes['arme']);
|
||||||
formData.armures = this.arrayOrEmpty(formData.itemsByType['armure']);
|
formData.armures = this.arrayOrEmpty(itemTypes['armure']);
|
||||||
formData.munitions = this.arrayOrEmpty(formData.itemsByType['munition']);
|
formData.munitions = this.arrayOrEmpty(itemTypes['munition']);
|
||||||
formData.livres = this.arrayOrEmpty(formData.itemsByType['livre']);
|
formData.livres = this.arrayOrEmpty(itemTypes['livre']);
|
||||||
formData.potions = this.arrayOrEmpty(formData.itemsByType['potion']);
|
formData.potions = this.arrayOrEmpty(itemTypes['potion']);
|
||||||
formData.ingredients = this.arrayOrEmpty(formData.itemsByType['ingredient']);
|
formData.ingredients = this.arrayOrEmpty(itemTypes['ingredient']);
|
||||||
formData.herbes = this.arrayOrEmpty(formData.itemsByType['herbe']);
|
formData.herbes = this.arrayOrEmpty(itemTypes['herbe']);
|
||||||
formData.monnaie = this.arrayOrEmpty(formData.itemsByType['monnaie']);
|
formData.monnaie = this.arrayOrEmpty(itemTypes['monnaie']);
|
||||||
formData.monnaie.sort(Monnaie.triValeurDenier());
|
formData.monnaie.sort(Monnaie.triValeurDenier());
|
||||||
formData.nourritureboissons = this.arrayOrEmpty(formData.itemsByType['nourritureboisson']);
|
formData.nourritureboissons = this.arrayOrEmpty(itemTypes['nourritureboisson']);
|
||||||
formData.gemmes = this.arrayOrEmpty(formData.itemsByType['gemme']);
|
formData.gemmes = this.arrayOrEmpty(itemTypes['gemme']);
|
||||||
|
|
||||||
formData.objets = formData.conteneurs
|
formData.objets = formData.conteneurs
|
||||||
.concat(formData.materiel)
|
.concat(formData.materiel)
|
||||||
@ -428,7 +454,7 @@ export class RdDUtility {
|
|||||||
// Attribution des objets aux conteneurs
|
// Attribution des objets aux conteneurs
|
||||||
for (let conteneur of conteneurs) {
|
for (let conteneur of conteneurs) {
|
||||||
conteneur.subItems = [];
|
conteneur.subItems = [];
|
||||||
for (let id of conteneur.data.contenu ?? []) {
|
for (let id of conteneur.system.contenu ?? []) {
|
||||||
let objet = objets.find(objet => (id == objet._id));
|
let objet = objets.find(objet => (id == objet._id));
|
||||||
if (objet) {
|
if (objet) {
|
||||||
objet.estContenu = true; // Permet de filtrer ce qui est porté dans le template
|
objet.estContenu = true; // Permet de filtrer ce qui est porté dans le template
|
||||||
@ -438,27 +464,26 @@ export class RdDUtility {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
for (let conteneur of conteneurs) {
|
for (let conteneur of conteneurs) {
|
||||||
conteneur.data.encTotal = RdDUtility.calculEncContenu(conteneur, objets);
|
conteneur.system.encTotal = RdDUtility.calculEncContenu(conteneur, objets);
|
||||||
}
|
}
|
||||||
return objetVersConteneur;
|
return objetVersConteneur;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static calculEncContenu(conteneur, objets) {
|
static calculEncContenu(conteneur, objets) {
|
||||||
const itemData = Misc.data(conteneur);
|
const contenus = (conteneur.system.contenu ?? []).filter(id => id != undefined)
|
||||||
const contenuDatas = (itemData.data.contenu ?? []).filter(id => id != undefined)
|
.map(id => objets.find(it => (id == it.id)))
|
||||||
.map(id => Misc.data(objets.find(it => (id == it._id))))
|
|
||||||
.filter(it => it);
|
.filter(it => it);
|
||||||
let enc = Number(itemData.data.encombrement ?? 0) * Number(itemData.data.quantite ?? 1);
|
let enc = Number(conteneur.system.encombrement ?? 0) * Number(conteneur.system.quantite ?? 1);
|
||||||
for (let itemData of contenuDatas) {
|
for (let contenu of contenus) {
|
||||||
if (itemData.type == 'conteneur') {
|
if (contenu.type == 'conteneur') {
|
||||||
enc += RdDUtility.calculEncContenu(itemData, objets);
|
enc += RdDUtility.calculEncContenu(contenu, objets);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
enc += Number(itemData.data.encombrement ?? 0) * Number(itemData.data.quantite ?? 1);
|
enc += Number(contenu.system.encombrement ?? 0) * Number(contenu.system.quantite ?? 1)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return enc;
|
return enc
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
@ -476,8 +501,8 @@ export class RdDUtility {
|
|||||||
objet.niveau = profondeur;
|
objet.niveau = profondeur;
|
||||||
const isConteneur = objet.type == 'conteneur';
|
const isConteneur = objet.type == 'conteneur';
|
||||||
const isOuvert = isConteneur && this.getAfficheContenu(objet._id);
|
const isOuvert = isConteneur && this.getAfficheContenu(objet._id);
|
||||||
const isVide = isConteneur && Misc.templateData(objet).contenu.length == 0;
|
const isVide = isConteneur && objet.system.contenu.length == 0;
|
||||||
const conteneur = Handlebars.partials['systems/foundryvtt-reve-de-dragon/templates/actor-sheet-inventaire-item.html']({
|
const conteneur = Handlebars.partials['systems/foundryvtt-reve-de-dragon/templates/actor/inventaire-item.html']({
|
||||||
item: objet,
|
item: objet,
|
||||||
vide: isVide,
|
vide: isVide,
|
||||||
ouvert: isOuvert
|
ouvert: isOuvert
|
||||||
@ -654,9 +679,9 @@ export class RdDUtility {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static async responseNombreAstral(data) {
|
static async responseNombreAstral(callData) {
|
||||||
let actor = game.actors.get(data.id);
|
let actor = game.actors.get(callData.id);
|
||||||
actor.ajouteNombreAstral(data);
|
actor.ajouteNombreAstral(callData);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
@ -691,12 +716,13 @@ export class RdDUtility {
|
|||||||
actor.tmrApp.positionnerDemiReve(coord);
|
actor.tmrApp.positionnerDemiReve(coord);
|
||||||
});
|
});
|
||||||
// Gestion spécifique des sorts en réserve multiples (ie têtes)
|
// Gestion spécifique des sorts en réserve multiples (ie têtes)
|
||||||
html.on("click", '#sort-reserve', event => {
|
html.on("click", '.declencher-sort-reserve', event => {
|
||||||
let coord = event.currentTarget.attributes['data-tmr-coord'].value;
|
let coord = event.currentTarget.attributes['data-tmr-coord'].value;
|
||||||
let sortId = event.currentTarget.attributes['data-sort-id'].value;
|
let sortId = event.currentTarget.attributes['data-sort-id'].value;
|
||||||
let actorId = event.currentTarget.attributes['data-actor-id'].value;
|
let actorId = event.currentTarget.attributes['data-actor-id'].value;
|
||||||
let actor = game.actors.get(actorId);
|
let actor = game.actors.get(actorId);
|
||||||
actor.tmrApp.lancerSortEnReserve(coord, sortId);
|
actor.tmrApp.lancerSortEnReserve(coord, sortId);
|
||||||
|
// TODO: supprimer le message?
|
||||||
});
|
});
|
||||||
|
|
||||||
// gestion bouton tchat Possession
|
// gestion bouton tchat Possession
|
||||||
@ -754,7 +780,7 @@ export class RdDUtility {
|
|||||||
static getSelectedActor(msgPlayer = undefined) {
|
static getSelectedActor(msgPlayer = undefined) {
|
||||||
if (canvas.tokens.controlled.length == 1) {
|
if (canvas.tokens.controlled.length == 1) {
|
||||||
let token = canvas.tokens.controlled[0];
|
let token = canvas.tokens.controlled[0];
|
||||||
if (token.actor && token.data.actorLink) {
|
if (token.actor) {
|
||||||
return token.actor;
|
return token.actor;
|
||||||
}
|
}
|
||||||
if (msgPlayer != undefined) {
|
if (msgPlayer != undefined) {
|
||||||
@ -777,7 +803,7 @@ export class RdDUtility {
|
|||||||
static createMonnaie(name, valeur_deniers, img = "", enc = 0.01) {
|
static createMonnaie(name, valeur_deniers, img = "", enc = 0.01) {
|
||||||
let piece = {
|
let piece = {
|
||||||
name: name, type: 'monnaie', img: img, _id: randomID(16),
|
name: name, type: 'monnaie', img: img, _id: randomID(16),
|
||||||
data: {
|
dasystemta: {
|
||||||
quantite: 0,
|
quantite: 0,
|
||||||
valeur_deniers: valeur_deniers,
|
valeur_deniers: valeur_deniers,
|
||||||
encombrement: enc,
|
encombrement: enc,
|
||||||
@ -829,21 +855,17 @@ export class RdDUtility {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static confirmerSuppressionSubacteur(actorSheet, li) {
|
static confirmerSuppression(sheet, htmlToDelete, options) {
|
||||||
let actorId = li.data("actor-id");
|
const d = new Dialog({
|
||||||
let actor = game.actors.get(actorId);
|
title: options.title ?? 'Confirmer la suppression',
|
||||||
let msgTxt = "<p>Etes vous certain de vouloir supprimer le lien vers ce véhicule/monture/suivant : " + actor.data.name + " ?</p>";
|
content: `<p>Etes vous certain de vouloir supprimer ${options.supprimer ?? 'cet objet'} ?</p>`,
|
||||||
let d = new Dialog({
|
|
||||||
title: "Confirmer la suppression du lien",
|
|
||||||
content: msgTxt,
|
|
||||||
buttons: {
|
buttons: {
|
||||||
delete: {
|
delete: {
|
||||||
icon: '<i class="fas fa-check"></i>',
|
icon: '<i class="fas fa-check"></i>',
|
||||||
label: "Supprimer le lien",
|
label: options.deleteLabel ?? 'Supprimer',
|
||||||
callback: () => {
|
callback: () => {
|
||||||
console.log("Delete : ", actorId);
|
options.onDelete();
|
||||||
actorSheet.actor.removeSubacteur(actorId);
|
RdDUtility.slideOnDelete(sheet, htmlToDelete);
|
||||||
li.slideUp(200, () => actorSheet.render(false));
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
cancel: {
|
cancel: {
|
||||||
@ -857,11 +879,21 @@ export class RdDUtility {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static async confirmerSuppression(actorSheet, li) {
|
static confirmerSuppressionSubacteur(sheet, subActor, htmlToDelete) {
|
||||||
let itemId = li.data("item-id");
|
RdDUtility.confirmerSuppression(sheet, htmlToDelete,{
|
||||||
let objet = actorSheet.actor.getObjet(itemId);
|
supprimer: "le lien vers le véhicule/monture/suivant : " + subActor.name,
|
||||||
|
deleteLabel: "Supprimer le lien",
|
||||||
|
onDelete: () => {
|
||||||
|
console.log("Delete : ", subActor.id);
|
||||||
|
sheet.actor.removeSubacteur(subActor.id);
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
if (objet.type == 'monnaie' && Monnaie.isSystemMonnaie(objet)) {
|
/* -------------------------------------------- */
|
||||||
|
static async confirmerSuppressionItem(sheet, item, htmlToDelete) {
|
||||||
|
const itemId = item.id;
|
||||||
|
if (Monnaie.isSystemMonnaie(item, sheet.actor.items)) {
|
||||||
ui.notifications.warn("Suppression des monnaies de base impossible");
|
ui.notifications.warn("Suppression des monnaies de base impossible");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -873,8 +905,8 @@ export class RdDUtility {
|
|||||||
label: "Supprimer l'objet",
|
label: "Supprimer l'objet",
|
||||||
callback: () => {
|
callback: () => {
|
||||||
console.log("Delete : ", itemId);
|
console.log("Delete : ", itemId);
|
||||||
actorSheet.actor.deleteEmbeddedDocuments('Item', [itemId]);
|
sheet.actor.deleteEmbeddedDocuments('Item', [itemId], { renderSheet: false });
|
||||||
li.slideUp(200, () => actorSheet.render(false));
|
RdDUtility.slideOnDelete(sheet, htmlToDelete);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
cancel: {
|
cancel: {
|
||||||
@ -882,16 +914,15 @@ export class RdDUtility {
|
|||||||
label: "Annuler"
|
label: "Annuler"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
const docData = Misc.data(objet);
|
if (item.type == 'conteneur' && item.system.contenu.length > 0) {
|
||||||
if (docData.type == 'conteneur' && docData.data.contenu.length > 0) {
|
|
||||||
msgTxt += "<br>Ce conteneur n'est pas vide. Choisissez l'option de suppression";
|
msgTxt += "<br>Ce conteneur n'est pas vide. Choisissez l'option de suppression";
|
||||||
buttons['deleteall'] = {
|
buttons['deleteall'] = {
|
||||||
icon: '<i class="fas fa-check"></i>',
|
icon: '<i class="fas fa-check"></i>',
|
||||||
label: "Supprimer le conteneur et tout son contenu",
|
label: "Supprimer le conteneur et tout son contenu",
|
||||||
callback: () => {
|
callback: () => {
|
||||||
console.log("Delete : ", itemId);
|
console.log("Delete : ", itemId);
|
||||||
actorSheet.actor.deleteAllConteneur(itemId);
|
sheet.actor.deleteAllConteneur(itemId, { renderSheet: false });
|
||||||
li.slideUp(200, () => actorSheet.render(false));
|
RdDUtility.slideOnDelete(sheet, htmlToDelete);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -905,6 +936,10 @@ export class RdDUtility {
|
|||||||
d.render(true);
|
d.render(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static slideOnDelete(sheet, htmlToDelete) {
|
||||||
|
return htmlToDelete.slideUp(200, () => sheet.render(false));
|
||||||
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static afficherHeuresChanceMalchance(heureNaissance) {
|
static afficherHeuresChanceMalchance(heureNaissance) {
|
||||||
if (game.user.isGM) {
|
if (game.user.isGM) {
|
||||||
|
@ -19,9 +19,9 @@ import { ReglesOptionelles } from "./regles-optionelles.js";
|
|||||||
*/
|
*/
|
||||||
export const referenceAjustements = {
|
export const referenceAjustements = {
|
||||||
competence: {
|
competence: {
|
||||||
isUsed: (rollData, actor) => Misc.data(rollData.competence),
|
isUsed: (rollData, actor) => rollData.competence,
|
||||||
getLabel: (rollData, actor) => Misc.data(rollData.competence)?.name,
|
getLabel: (rollData, actor) => rollData.competence?.name,
|
||||||
getValue: (rollData, actor) => Misc.data(rollData.competence)?.data?.niveau,
|
getValue: (rollData, actor) => rollData.competence?.system?.niveau,
|
||||||
},
|
},
|
||||||
meditation: {
|
meditation: {
|
||||||
isUsed: (rollData, actor) => rollData.meditation,
|
isUsed: (rollData, actor) => rollData.meditation,
|
||||||
@ -33,7 +33,7 @@ export const referenceAjustements = {
|
|||||||
getLabel: (rollData, actor) => rollData.selectedSort?.name ?? rollData.attackerRoll ? 'Imposée' : 'Libre',
|
getLabel: (rollData, actor) => rollData.selectedSort?.name ?? rollData.attackerRoll ? 'Imposée' : 'Libre',
|
||||||
getValue: (rollData, actor) => rollData.selectedSort
|
getValue: (rollData, actor) => rollData.selectedSort
|
||||||
? RdDItemSort.getDifficulte(rollData.selectedSort, rollData.diffLibre)
|
? RdDItemSort.getDifficulte(rollData.selectedSort, rollData.diffLibre)
|
||||||
: rollData.diffLibre ?? Misc.data(rollData.competence)?.data.default_diffLibre ?? 0
|
: rollData.diffLibre ?? rollData.competence?.system.default_diffLibre ?? 0
|
||||||
},
|
},
|
||||||
diffConditions: {
|
diffConditions: {
|
||||||
isUsed: (rollData, actor) => rollData.diffConditions != undefined,
|
isUsed: (rollData, actor) => rollData.diffConditions != undefined,
|
||||||
@ -95,10 +95,10 @@ export const referenceAjustements = {
|
|||||||
getDescr: (rollData, actor) => rollData.diviseurSignificative > 1 ? `Facteur significative <span class="rdd-diviseur">×${Misc.getFractionHtml(rollData.diviseurSignificative)}</span>` : ''
|
getDescr: (rollData, actor) => rollData.diviseurSignificative > 1 ? `Facteur significative <span class="rdd-diviseur">×${Misc.getFractionHtml(rollData.diviseurSignificative)}</span>` : ''
|
||||||
},
|
},
|
||||||
isEcaille: {
|
isEcaille: {
|
||||||
isVisible: (rollData, actor) => Misc.data(rollData.arme)?.data.magique && Number(Misc.data(rollData.arme)?.data.ecaille_efficacite) > 0,
|
isVisible: (rollData, actor) => rollData.arme?.system.magique && Number(rollData.arme?.system.ecaille_efficacite) > 0,
|
||||||
isUsed: (rollData, actor) => Misc.data(rollData.arme)?.data.magique && Number(Misc.data(rollData.arme)?.data.ecaille_efficacite) > 0,
|
isUsed: (rollData, actor) => rollData.arme?.system.magique && Number(rollData.arme?.system.ecaille_efficacite) > 0,
|
||||||
getLabel: (rollData, actor) => "Ecaille d'Efficacité: ",
|
getLabel: (rollData, actor) => "Ecaille d'Efficacité: ",
|
||||||
getValue: (rollData, actor) => Math.max(Number(Misc.data(rollData.arme)?.data.ecaille_efficacite), 0),
|
getValue: (rollData, actor) => Math.max(Number(rollData.arme?.system.ecaille_efficacite), 0),
|
||||||
},
|
},
|
||||||
finesse: {
|
finesse: {
|
||||||
isUsed: (rollData, actor) => RdDBonus.isDefenseAttaqueFinesse(rollData),
|
isUsed: (rollData, actor) => RdDBonus.isDefenseAttaqueFinesse(rollData),
|
||||||
|
@ -1,26 +1,41 @@
|
|||||||
import { SYSTEM_RDD } from "./constants.js";
|
import { SYSTEM_RDD } from "./constants.js";
|
||||||
|
|
||||||
const rddStatusEffects = [
|
export const STATUSES = {
|
||||||
{ rdd: true, id: 'stun', label: 'EFFECT.StatusStunned', icon: 'icons/svg/stoned.svg', "duration.rounds": 1 },
|
StatusStunned : 'stun',
|
||||||
{ rdd: true, id: 'bleeding', label: 'EFFECT.StatusBleeding', icon: 'icons/svg/blood.svg' },
|
StatusBleeding: 'bleeding',
|
||||||
{ rdd: true, id: 'prone', label: 'EFFECT.StatusProne', icon: 'icons/svg/falling.svg' },
|
StatusProne: 'prone',
|
||||||
{ rdd: true, id: 'grappling', tint: '#33cc33', label: 'EFFECT.StatusGrappling', icon: 'systems/foundryvtt-reve-de-dragon/icons/competence_corps_a_corps.webp' },
|
StatusGrappling: 'grappling',
|
||||||
{ rdd: true, id: 'grappled', tint: '#ff9900', label: 'EFFECT.StatusGrappled', icon: 'systems/foundryvtt-reve-de-dragon/icons/competence_corps_a_corps.webp' },
|
StatusGrappled: 'grappled',
|
||||||
{ rdd: true, id: 'restrain', label: 'EFFECT.StatusRestrained', icon: 'icons/svg/net.svg' },
|
StatusRestrained: 'restrain',
|
||||||
{ rdd: true, id: 'unconscious', label: 'EFFECT.StatusUnconscious', icon: 'icons/svg/unconscious.svg' },
|
StatusUnconscious: 'unconscious',
|
||||||
{ rdd: true, id: 'blind', label: 'EFFECT.StatusBlind', icon: 'icons/svg/blind.svg' },
|
StatusBlind: 'blind',
|
||||||
{ rdd: true, id: 'comma', label: 'EFFECT.StatusComma', icon: 'icons/svg/skull.svg' },
|
StatusComma: 'comma',
|
||||||
{ rdd: true, id: 'dead', label: 'EFFECT.StatusDead', icon: 'icons/svg/skull.svg' },
|
StatusDead: 'dead',
|
||||||
{ rdd: true, id: 'demi-reve', label: 'EFFECT.StatusDemiReve', icon: 'systems/foundryvtt-reve-de-dragon/icons/heures/hd12.svg' }
|
StatusDemiReve: 'demi-reve',
|
||||||
];
|
}
|
||||||
const demiReveStatusEffect = rddStatusEffects.find(it => it.label == 'EFFECT.StatusDemiReve');
|
|
||||||
|
|
||||||
const statusDemiSurprise = new Set(['EFFECT.StatusStunned', 'EFFECT.StatusProne', 'EFFECT.StatusRestrain']);
|
const rddStatusEffects = [
|
||||||
const statusSurpriseTotale = new Set(['EFFECT.StatusUnconscious', 'EFFECT.StatusBlind', 'EFFECT.StatusComma']);
|
{ rdd: true, id: STATUSES.StatusStunned, label: 'EFFECT.StatusStunned', icon: 'icons/svg/stoned.svg', "duration.rounds": 1 },
|
||||||
|
{ rdd: true, id: STATUSES.StatusBleeding, label: 'EFFECT.StatusBleeding', icon: 'icons/svg/blood.svg' },
|
||||||
|
{ rdd: true, id: STATUSES.StatusProne, label: 'EFFECT.StatusProne', icon: 'icons/svg/falling.svg' },
|
||||||
|
{ rdd: true, id: STATUSES.StatusGrappling, tint: '#33cc33', label: 'EFFECT.StatusGrappling', icon: 'systems/foundryvtt-reve-de-dragon/icons/competence_corps_a_corps.webp' },
|
||||||
|
{ rdd: true, id: STATUSES.StatusGrappled, tint: '#ff9900', label: 'EFFECT.StatusGrappled', icon: 'systems/foundryvtt-reve-de-dragon/icons/competence_corps_a_corps.webp' },
|
||||||
|
{ rdd: true, id: STATUSES.StatusRestrained, label: 'EFFECT.StatusRestrained', icon: 'icons/svg/net.svg' },
|
||||||
|
{ rdd: true, id: STATUSES.StatusUnconscious, label: 'EFFECT.StatusUnconscious', icon: 'icons/svg/unconscious.svg' },
|
||||||
|
{ rdd: true, id: STATUSES.StatusBlind, label: 'EFFECT.StatusBlind', icon: 'icons/svg/blind.svg' },
|
||||||
|
{ rdd: true, id: STATUSES.StatusComma, label: 'EFFECT.StatusComma', icon: 'icons/svg/skull.svg' },
|
||||||
|
{ rdd: true, id: STATUSES.StatusDead, label: 'EFFECT.StatusDead', icon: 'icons/svg/skull.svg' },
|
||||||
|
{ rdd: true, id: STATUSES.StatusDemiReve, label: 'EFFECT.StatusDemiReve', icon: 'systems/foundryvtt-reve-de-dragon/icons/heures/hd12.svg' }
|
||||||
|
];
|
||||||
|
const demiReveStatusEffect = rddStatusEffects.find(it => it.id == STATUSES.StatusDemiReve);
|
||||||
|
|
||||||
|
const statusDemiSurprise = [STATUSES.StatusStunned, STATUSES.StatusProne, STATUSES.StatusRestrained];
|
||||||
|
const statusSurpriseTotale = [STATUSES.StatusUnconscious, STATUSES.StatusBlind, STATUSES.StatusComma];
|
||||||
|
|
||||||
export class StatusEffects {
|
export class StatusEffects {
|
||||||
static onReady() {
|
static onReady() {
|
||||||
const rddStatusIds = rddStatusEffects.map(it => it.id);
|
const rddStatusIds = rddStatusEffects.map(it => it.id);
|
||||||
|
rddStatusEffects.forEach(it => it.flags = { core: { statusId: it.id } });
|
||||||
const defaultStatusEffectIds = CONFIG.statusEffects.map(it => it.id);
|
const defaultStatusEffectIds = CONFIG.statusEffects.map(it => it.id);
|
||||||
game.settings.register(SYSTEM_RDD, "use-status-effects", {
|
game.settings.register(SYSTEM_RDD, "use-status-effects", {
|
||||||
name: "use-status-effects",
|
name: "use-status-effects",
|
||||||
@ -47,40 +62,36 @@ export class StatusEffects {
|
|||||||
|
|
||||||
static valeurSurprise(effect, isCombat) {
|
static valeurSurprise(effect, isCombat) {
|
||||||
// const id = StatusEffects.statusId(effect);
|
// const id = StatusEffects.statusId(effect);
|
||||||
if (statusSurpriseTotale.has(effect.label)) {
|
if (statusSurpriseTotale.includes(effect.flags?.core?.statusId)) {
|
||||||
return 2;
|
return 2;
|
||||||
}
|
}
|
||||||
return statusDemiSurprise.has(effect.label) || (isCombat && effect.label == demiReveStatusEffect.label) ? 1 : 0;
|
return statusDemiSurprise.includes(effect.flags?.core?.statusId) || (isCombat && effect.flags?.core?.statusId == STATUSES.StatusDemiReve) ? 1 : 0;
|
||||||
}
|
|
||||||
|
|
||||||
static setMandatoryRdd() {
|
|
||||||
CONFIG.statusEffects.filter(it => statusDemiSurprise.has(it.id) || statusSurpriseTotale.has(it.id))
|
|
||||||
.forEach(it => it.rdd = true);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static _getUseStatusEffects() {
|
static _getUseStatusEffects() {
|
||||||
const setting = game.settings.get(SYSTEM_RDD, "use-status-effects");
|
const setting = game.settings.get(SYSTEM_RDD, "use-status-effects");
|
||||||
return setting ? new Set(setting.split(',')) : new Set();
|
return setting ? setting.split(',') : [];
|
||||||
}
|
}
|
||||||
|
|
||||||
static _setUseStatusEffects(useStatusEffects) {
|
static _setUseStatusEffects(statusIds) {
|
||||||
if (game.user.isGM) {
|
if (game.user.isGM) {
|
||||||
game.settings.set(SYSTEM_RDD, "use-status-effects", StatusEffects._toSetting(useStatusEffects));
|
game.settings.set(SYSTEM_RDD, "use-status-effects", StatusEffects._toSetting(statusIds));
|
||||||
}
|
}
|
||||||
|
|
||||||
for (let effect of CONFIG.RDD.allEffects) {
|
for (let effect of CONFIG.RDD.allEffects) {
|
||||||
effect.active = effect.rdd || useStatusEffects.has(effect.id);
|
effect.active = effect.rdd || statusIds.includes(effect.flags?.core?.statusId);
|
||||||
}
|
}
|
||||||
CONFIG.statusEffects = CONFIG.RDD.allEffects.filter(it => it.active);
|
CONFIG.statusEffects = CONFIG.RDD.allEffects.filter(it => it.active);
|
||||||
}
|
}
|
||||||
|
|
||||||
static _toSetting(useStatusEffects) {
|
static _toSetting(statusIds) {
|
||||||
return Array.from(useStatusEffects).join();
|
return statusIds.join();
|
||||||
}
|
}
|
||||||
|
|
||||||
static status(label) {
|
static status(statusId) {
|
||||||
return rddStatusEffects.find(it => it.label == label) ?? { label: label };
|
return rddStatusEffects.find(it => it.flags?.core?.statusId == statusId);
|
||||||
}
|
}
|
||||||
|
|
||||||
static demiReve() {
|
static demiReve() {
|
||||||
return demiReveStatusEffect;
|
return demiReveStatusEffect;
|
||||||
}
|
}
|
||||||
@ -106,8 +117,10 @@ class StatusEffectsSettings extends FormApplication {
|
|||||||
}
|
}
|
||||||
|
|
||||||
getData() {
|
getData() {
|
||||||
|
const used = StatusEffects._getUseStatusEffects();
|
||||||
let formData = super.getData();
|
let formData = super.getData();
|
||||||
formData.effects = CONFIG.RDD.allEffects;
|
formData.effects = duplicate(CONFIG.RDD.allEffects);
|
||||||
|
formData.effects.forEach(it => it.active = used.includes(it.id))
|
||||||
return formData;
|
return formData;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -118,10 +131,10 @@ class StatusEffectsSettings extends FormApplication {
|
|||||||
let selected = StatusEffects._getUseStatusEffects();
|
let selected = StatusEffects._getUseStatusEffects();
|
||||||
let isChecked = event.currentTarget.checked;
|
let isChecked = event.currentTarget.checked;
|
||||||
if (isChecked) {
|
if (isChecked) {
|
||||||
selected.add(id);
|
selected.push(id);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
selected.delete(id);
|
selected = selected.filter(it => it != id)
|
||||||
}
|
}
|
||||||
StatusEffects._setUseStatusEffects(selected);
|
StatusEffects._setUseStatusEffects(selected);
|
||||||
}
|
}
|
||||||
|
@ -433,9 +433,9 @@ export class TMRRencontres {
|
|||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static async msgEchecPasseurFou(tmrData) {
|
static async msgEchecPasseurFou(tmrData) {
|
||||||
tmrData.sortReserve = Misc.templateData(tmrData.actor).reve.reserve.list[0];
|
tmrData.sortReserve = RdDDice.rollOneOf(tmrData.actor.itemTypes['sortreserve']);
|
||||||
if (tmrData.sortReserve) {
|
if (tmrData.sortReserve) {
|
||||||
// Passeur fou positionne sur la case d'un ort en réserve // TODO : Choisir le sort le plus loin ou au hasard
|
// Passeur fou positionne sur la case d'un sort en réserve
|
||||||
tmrData.newTMR = TMRUtility.getTMR(tmrData.sortReserve.coord);
|
tmrData.newTMR = TMRUtility.getTMR(tmrData.sortReserve.coord);
|
||||||
} else {
|
} else {
|
||||||
// Déplacement aléatoire de la force du Passeur Fou
|
// Déplacement aléatoire de la force du Passeur Fou
|
||||||
@ -468,15 +468,15 @@ export class TMRRencontres {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static async onPostEchecTourbillonRouge(tmrDialog, data) {
|
static async onPostEchecTourbillonRouge(tmrDialog, rencontre) {
|
||||||
await data.actor.reveActuelIncDec(-2); // -2 pts de Reve a chaque itération
|
await rencontre.actor.reveActuelIncDec(-2); // -2 pts de Reve a chaque itération
|
||||||
TMRRencontres._toubillonner(tmrDialog, data.actor, 4);
|
TMRRencontres._toubillonner(tmrDialog, rencontre.actor, 4);
|
||||||
await data.actor.santeIncDec("vie", -1); // Et -1 PV
|
await rencontre.actor.santeIncDec("vie", -1); // Et -1 PV
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static async _toubillonner(tmrDialog, actor, cases) {
|
static async _toubillonner(tmrDialog, actor, cases) {
|
||||||
let coord = Misc.templateData(actor).reve.tmrpos.coord;
|
let coord = actor.system.reve.tmrpos.coord;
|
||||||
for (let i = 0; i < cases; i++) {
|
for (let i = 0; i < cases; i++) {
|
||||||
coord = await TMRUtility.deplaceTMRAleatoire(actor, coord).coord;
|
coord = await TMRUtility.deplaceTMRAleatoire(actor, coord).coord;
|
||||||
}
|
}
|
||||||
@ -486,7 +486,7 @@ export class TMRRencontres {
|
|||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static async onPostSuccessReveDeDragon(tmrDialog, tmrData) {
|
static async onPostSuccessReveDeDragon(tmrDialog, tmrData) {
|
||||||
if (tmrData.rolled.isPart) {
|
if (tmrData.rolled.isPart) {
|
||||||
await tmrData.actor.appliquerAjoutExperience(tmrData, true);
|
await tmrData.actor.appliquerAjoutExperience(tmrData);
|
||||||
}
|
}
|
||||||
await tmrData.actor.resultCombatReveDeDragon(tmrData);
|
await tmrData.actor.resultCombatReveDeDragon(tmrData);
|
||||||
}
|
}
|
||||||
|
@ -291,12 +291,18 @@ export class TMRUtility {
|
|||||||
static typeTmrName(type) {
|
static typeTmrName(type) {
|
||||||
return Misc.upperFirst(TMRType[Grammar.toLowerCaseNoAccent(type)].name);
|
return Misc.upperFirst(TMRType[Grammar.toLowerCaseNoAccent(type)].name);
|
||||||
}
|
}
|
||||||
static listSelectedTMR(typesTMR) {
|
|
||||||
|
static buildSelectionTypesTMR(typesTMR) {
|
||||||
|
typesTMR= typesTMR?? [];
|
||||||
return Object.values(TMRType).map(value => Misc.upperFirst(value.name))
|
return Object.values(TMRType).map(value => Misc.upperFirst(value.name))
|
||||||
.sort()
|
.sort()
|
||||||
.map(name => { return { name: name, selected: typesTMR.includes(name) } });
|
.map(name => { return { name: name, selected: typesTMR.includes(name) } });
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static buildListTypesTMRSelection(selectionTMRs) {
|
||||||
|
return selectionTMRs.filter(it => it.selected).map(it => it.name).join(" ");
|
||||||
|
}
|
||||||
|
|
||||||
static isCaseHumide(tmr) {
|
static isCaseHumide(tmr) {
|
||||||
return tmr.type == 'fleuve' || tmr.type == 'lac' || tmr.type == 'marais';
|
return tmr.type == 'fleuve' || tmr.type == 'lac' || tmr.type == 'marais';
|
||||||
}
|
}
|
||||||
@ -379,18 +385,6 @@ export class TMRUtility {
|
|||||||
return await RdDDice.rollOneOf(TMRUtility.filterTMR(filter))
|
return await RdDDice.rollOneOf(TMRUtility.filterTMR(filter))
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
|
||||||
static getSortsReserve(reserveList, coord) {
|
|
||||||
// TODO : Gérer les têtes spéciales réserve!
|
|
||||||
let tmrDescr = this.getTMR(coord);
|
|
||||||
//console.log("Sort réserve : ", tmrDescr);
|
|
||||||
if (tmrDescr.type == 'fleuve') { // Gestion de la reserve en Fleuve
|
|
||||||
return reserveList.filter(it => TMRUtility.getTMR(it.coord).type == 'fleuve');
|
|
||||||
}
|
|
||||||
// Reserve sur un case "normale"
|
|
||||||
return reserveList.filter(it => it.coord == coord);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
/** Returns a list of case inside a given distance
|
/** Returns a list of case inside a given distance
|
||||||
*
|
*
|
||||||
|
@ -1,5 +1,4 @@
|
|||||||
import { Grammar } from "../grammar.js";
|
import { Grammar } from "../grammar.js";
|
||||||
import { Misc } from "../misc.js";
|
|
||||||
import { RdDDice } from "../rdd-dice.js";
|
import { RdDDice } from "../rdd-dice.js";
|
||||||
import { TMRUtility } from "../tmr-utility.js";
|
import { TMRUtility } from "../tmr-utility.js";
|
||||||
import { tmrConstants, tmrColors, tmrTokenZIndex } from "../tmr-constants.js";
|
import { tmrConstants, tmrColors, tmrTokenZIndex } from "../tmr-constants.js";
|
||||||
@ -32,14 +31,14 @@ export class Conquete extends Draconique {
|
|||||||
}
|
}
|
||||||
|
|
||||||
async _creerConquete(actor, queue) {
|
async _creerConquete(actor, queue) {
|
||||||
let existants = actor.data.items.filter(it => this.isCase(it)).map(it => Misc.data(it).data.coord);
|
let existants = actor.items.filter(it => this.isCase(it)).map(it => it.system.coord);
|
||||||
let possibles = TMRUtility.filterTMR(tmr => !TMRUtility.isCaseHumide(tmr) && !existants.includes(tmr.coord));
|
let possibles = TMRUtility.filterTMR(tmr => !TMRUtility.isCaseHumide(tmr) && !existants.includes(tmr.coord));
|
||||||
let conquete = await RdDDice.rollOneOf(possibles);
|
let conquete = await RdDDice.rollOneOf(possibles);
|
||||||
await this.createCaseTmr(actor, 'Conquête: ' + conquete.label, conquete, queue.id);
|
await this.createCaseTmr(actor, 'Conquête: ' + conquete.label, conquete, queue.id);
|
||||||
}
|
}
|
||||||
|
|
||||||
async onActorDeleteCaseTmr(actor, casetmr) {
|
async onActorDeleteCaseTmr(actor, casetmr) {
|
||||||
await actor.deleteEmbeddedDocuments('Item', [casetmr.data.sourceid]);
|
await actor.deleteEmbeddedDocuments('Item', [casetmr.system.sourceid]);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -13,7 +13,7 @@ export class Debordement extends Draconique {
|
|||||||
match(item) { return Draconique.isSouffleDragon(item) && Grammar.toLowerCaseNoAccent(item.name).includes('debordement'); }
|
match(item) { return Draconique.isSouffleDragon(item) && Grammar.toLowerCaseNoAccent(item.name).includes('debordement'); }
|
||||||
manualMessage() { return false }
|
manualMessage() { return false }
|
||||||
async onActorCreateOwned(actor, souffle) {
|
async onActorCreateOwned(actor, souffle) {
|
||||||
const existants = actor.data.items.filter(it => this.isCase(it)).map(it => it.data.coord);
|
const existants = actor.items.filter(it => this.isCase(it)).map(it => it.system.coord);
|
||||||
const tmr = await TMRUtility.getTMRAleatoire(it => !(TMRUtility.isCaseHumide(it) || existants.includes(it.coord)));
|
const tmr = await TMRUtility.getTMRAleatoire(it => !(TMRUtility.isCaseHumide(it) || existants.includes(it.coord)));
|
||||||
await this.createCaseTmr(actor, 'Debordement: ' + tmr.label, tmr, souffle.id);
|
await this.createCaseTmr(actor, 'Debordement: ' + tmr.label, tmr, souffle.id);
|
||||||
}
|
}
|
||||||
|
@ -22,7 +22,7 @@ export class Desorientation extends Draconique {
|
|||||||
}
|
}
|
||||||
|
|
||||||
_typesPossibles(actor) {
|
_typesPossibles(actor) {
|
||||||
const dejaDesorientes = Misc.distinct(actor.data.items.filter(it => this.isCase(it)).map(it => it.type));
|
const dejaDesorientes = Misc.distinct(actor.items.filter(it => this.isCase(it)).map(it => it.type));
|
||||||
return Object.keys(TMRType).filter(it => !dejaDesorientes.includes(it));
|
return Object.keys(TMRType).filter(it => !dejaDesorientes.includes(it));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -42,7 +42,7 @@ export class Desorientation extends Draconique {
|
|||||||
}
|
}
|
||||||
|
|
||||||
async _creerCasesTmr(actor, type, souffle) {
|
async _creerCasesTmr(actor, type, souffle) {
|
||||||
const existants = actor.data.items.filter(it => this.isCase(it)).map(it => it.data.coord);
|
const existants = actor.items.filter(it => this.isCase(it)).map(it => it.system.coord);
|
||||||
let tmrs = TMRUtility.filterTMR(it => it.type == type && !existants.includes(it.coord));
|
let tmrs = TMRUtility.filterTMR(it => it.type == type && !existants.includes(it.coord));
|
||||||
for (let tmr of tmrs) {
|
for (let tmr of tmrs) {
|
||||||
await this.createCaseTmr(actor, 'Désorientation: ' + tmr.label, tmr, souffle.id);
|
await this.createCaseTmr(actor, 'Désorientation: ' + tmr.label, tmr, souffle.id);
|
||||||
|
@ -9,13 +9,13 @@ const registeredEffects = [
|
|||||||
* Définition des informations d'une "draconique" (queue, ombre, tête, souffle) qui influence les TMR
|
* Définition des informations d'une "draconique" (queue, ombre, tête, souffle) qui influence les TMR
|
||||||
*/
|
*/
|
||||||
export class Draconique {
|
export class Draconique {
|
||||||
static isCaseTMR(itemData) { return itemData.type == 'casetmr'; }
|
static isCaseTMR(item) { return item.type == 'casetmr'; }
|
||||||
static isQueueDragon(itemData) { return itemData.type == 'queue' || itemData.type == 'ombre'; }
|
static isQueueDragon(item) { return item.type == 'queue' || item.type == 'ombre'; }
|
||||||
static isSouffleDragon(itemData) { return itemData.type == 'souffle'; }
|
static isSouffleDragon(item) { return item.type == 'souffle'; }
|
||||||
static isTeteDragon(itemData) { return itemData.type == 'tete'; }
|
static isTeteDragon(item) { return item.type == 'tete'; }
|
||||||
static isQueueSouffle(itemData) { return Draconique.isQueueDragon(itemData) || Draconique.isSouffleDragon(itemData); }
|
static isQueueSouffle(item) { return Draconique.isQueueDragon(item) || Draconique.isSouffleDragon(item); }
|
||||||
|
|
||||||
tmrLabel(linkData) { return TMRUtility.getTMRLabel(linkData.data.coord); }
|
tmrLabel(linkData) { return TMRUtility.getTMRLabel(linkData.system.coord); }
|
||||||
|
|
||||||
static register(draconique) {
|
static register(draconique) {
|
||||||
registeredEffects[draconique.code()] = draconique;
|
registeredEffects[draconique.code()] = draconique;
|
||||||
@ -38,8 +38,7 @@ export class Draconique {
|
|||||||
* @returns true si l'item correspond
|
* @returns true si l'item correspond
|
||||||
*/
|
*/
|
||||||
match(item) {
|
match(item) {
|
||||||
const itemData = Misc.data(item);
|
return Draconique.isQueueDragon(item) || Draconique.isSouffleDragon(item) || Draconique.isTeteDragon(item);
|
||||||
return Draconique.isQueueDragon(itemData) || Draconique.isSouffleDragon(itemData) || Draconique.isTeteDragon(itemData);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -115,34 +114,32 @@ export class Draconique {
|
|||||||
* @param {*} coord les coordonnées d'une case. Si undefined toute case du type correspondra,
|
* @param {*} coord les coordonnées d'une case. Si undefined toute case du type correspondra,
|
||||||
*/
|
*/
|
||||||
isCase(item, coord = undefined) {
|
isCase(item, coord = undefined) {
|
||||||
const itemData = Misc.data(item);
|
return Draconique.isCaseTMR(item) && item.system.specific == this.code() && (coord ? item.system.coord == coord : true);
|
||||||
return Draconique.isCaseTMR(itemData) && itemData.data.specific == this.code() && (coord ? itemData.data.coord == coord : true);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
find(list, coord = undefined) {
|
find(list, coord = undefined) {
|
||||||
return list.find(c => this.isCase(Misc.data(c), coord));
|
return list.find(c => this.isCase(c, coord));
|
||||||
}
|
}
|
||||||
|
|
||||||
async createCaseTmr(actor, label, tmr, sourceId = undefined) {
|
async createCaseTmr(actor, label, tmr, sourceId = undefined) {
|
||||||
const casetmrData = {
|
const casetmrData = {
|
||||||
name: label, type: 'casetmr', img: this.img(),
|
name: label, type: 'casetmr', img: this.img(),
|
||||||
data: { coord: tmr.coord, specific: this.code(), sourceid: sourceId }
|
system: { coord: tmr.coord, specific: this.code(), sourceid: sourceId }
|
||||||
};
|
};
|
||||||
await actor.createEmbeddedDocuments('Item', [casetmrData]);
|
await actor.createEmbeddedDocuments('Item', [casetmrData]);
|
||||||
}
|
}
|
||||||
|
|
||||||
async deleteCasesTmr(actor, draconique) {
|
async deleteCasesTmr(actor, draconique) {
|
||||||
let caseTmrs = actor.data.items.filter(it => this.isCaseForSource(it, draconique));
|
let caseTmrs = actor.items.filter(it => this.isCaseForSource(it, draconique));
|
||||||
await actor.deleteEmbeddedDocuments('Item', caseTmrs.map(it => it.id));
|
await actor.deleteEmbeddedDocuments('Item', caseTmrs.map(it => it.id));
|
||||||
}
|
}
|
||||||
|
|
||||||
isCaseForSource(item, draconique) {
|
isCaseForSource(item, draconique) {
|
||||||
const itemData = Misc.data(item);
|
return Draconique.isCaseTMR(item) && item.system.specific == this.code() && item.system.sourceid == draconique.id;
|
||||||
return Draconique.isCaseTMR(itemData) && itemData.data.specific == this.code() && itemData.data.sourceid == draconique.id;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
async onVisiteSupprimer(actor, tmr, onRemoveToken) {
|
async onVisiteSupprimer(actor, tmr, onRemoveToken) {
|
||||||
let existants = actor.data.items.filter(it => this.isCase(it, tmr.coord));
|
let existants = actor.items.filter(it => this.isCase(it, tmr.coord));
|
||||||
await actor.deleteEmbeddedDocuments('Item', existants.map(it => it.id));
|
await actor.deleteEmbeddedDocuments('Item', existants.map(it => it.id));
|
||||||
for (let casetmr of existants) {
|
for (let casetmr of existants) {
|
||||||
onRemoveToken(tmr, casetmr);
|
onRemoveToken(tmr, casetmr);
|
||||||
|
@ -95,7 +95,7 @@ export class EffetsDraconiques {
|
|||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static isSortImpossible(actor) {
|
static isSortImpossible(actor) {
|
||||||
return actor.data.items.find(it =>
|
return actor.items.find(it =>
|
||||||
EffetsDraconiques.conquete.match(it) ||
|
EffetsDraconiques.conquete.match(it) ||
|
||||||
EffetsDraconiques.periple.match(it) ||
|
EffetsDraconiques.periple.match(it) ||
|
||||||
EffetsDraconiques.urgenceDraconique.match(it) ||
|
EffetsDraconiques.urgenceDraconique.match(it) ||
|
||||||
@ -104,7 +104,7 @@ export class EffetsDraconiques {
|
|||||||
}
|
}
|
||||||
|
|
||||||
static isSortReserveImpossible(actor) {
|
static isSortReserveImpossible(actor) {
|
||||||
return actor.data.items.find(it =>
|
return actor.items.find(it =>
|
||||||
EffetsDraconiques.conquete.match(it) ||
|
EffetsDraconiques.conquete.match(it) ||
|
||||||
EffetsDraconiques.periple.match(it) ||
|
EffetsDraconiques.periple.match(it) ||
|
||||||
EffetsDraconiques.pelerinage.match(it)
|
EffetsDraconiques.pelerinage.match(it)
|
||||||
@ -112,7 +112,7 @@ export class EffetsDraconiques {
|
|||||||
}
|
}
|
||||||
|
|
||||||
static filterItems(actor, filter, name) {
|
static filterItems(actor, filter, name) {
|
||||||
return actor.data.items.filter(filter)
|
return actor.filterItems(filter)
|
||||||
.filter(it => Grammar.includesLowerCaseNoAccent(it.name, name));
|
.filter(it => Grammar.includesLowerCaseNoAccent(it.name, name));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -150,11 +150,11 @@ export class EffetsDraconiques {
|
|||||||
}
|
}
|
||||||
|
|
||||||
static isPontImpraticable(actor) {
|
static isPontImpraticable(actor) {
|
||||||
return actor.data.items.find(it => EffetsDraconiques.pontImpraticable.match(it));
|
return actor.items.find(it => EffetsDraconiques.pontImpraticable.match(it));
|
||||||
}
|
}
|
||||||
|
|
||||||
static isUrgenceDraconique(actor) {
|
static isUrgenceDraconique(actor) {
|
||||||
return actor.data.items.find(it => EffetsDraconiques.urgenceDraconique.match(it));
|
return actor.items.find(it => EffetsDraconiques.urgenceDraconique.match(it));
|
||||||
}
|
}
|
||||||
|
|
||||||
static isPeage(actor) {
|
static isPeage(actor) {
|
||||||
|
@ -30,7 +30,7 @@ export class FermetureCites extends Draconique {
|
|||||||
}
|
}
|
||||||
|
|
||||||
async _fermerLesCites(actor, souffle) {
|
async _fermerLesCites(actor, souffle) {
|
||||||
let existants = actor.data.items.filter(it => this.isCase(it)).map(it => it.data.coord);
|
let existants = actor.items.filter(it => this.isCase(it)).map(it => it.system.coord);
|
||||||
let ouvertes = TMRUtility.filterTMR(it => it.type == 'cite' && !existants.includes(it.coord));
|
let ouvertes = TMRUtility.filterTMR(it => it.type == 'cite' && !existants.includes(it.coord));
|
||||||
for (let tmr of ouvertes) {
|
for (let tmr of ouvertes) {
|
||||||
await this.createCaseTmr(actor, 'Fermeture: ' + tmr.label, tmr, souffle.id);
|
await this.createCaseTmr(actor, 'Fermeture: ' + tmr.label, tmr, souffle.id);
|
||||||
|
@ -33,7 +33,7 @@ export class Pelerinage extends Draconique {
|
|||||||
}
|
}
|
||||||
|
|
||||||
async onActorDeleteCaseTmr(actor, casetmr) {
|
async onActorDeleteCaseTmr(actor, casetmr) {
|
||||||
await actor.deleteEmbeddedDocuments('Item', [casetmr.data.sourceid]);
|
await actor.deleteEmbeddedDocuments('Item', [casetmr.system.sourceid]);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -25,7 +25,7 @@ export class PixiTMR {
|
|||||||
for (const [name, img] of Object.entries(PixiTMR.textures)) {
|
for (const [name, img] of Object.entries(PixiTMR.textures)) {
|
||||||
loader = loader.add(name, img);
|
loader = loader.add(name, img);
|
||||||
}
|
}
|
||||||
loader.onLoad.add((error, reason) => { console.log("ERROR", error, reason) });
|
loader.onError.add((error, reason) => { console.log("ERROR", error, reason) });
|
||||||
loader.load( (loader, resources) => {
|
loader.load( (loader, resources) => {
|
||||||
onLoad(loader, resources);
|
onLoad(loader, resources);
|
||||||
for (let onAnimate of this.callbacksOnAnimate) {
|
for (let onAnimate of this.callbacksOnAnimate) {
|
||||||
|
@ -30,7 +30,7 @@ export class PresentCites extends Draconique {
|
|||||||
}
|
}
|
||||||
|
|
||||||
async _ajouterPresents(actor, tete) {
|
async _ajouterPresents(actor, tete) {
|
||||||
let existants = actor.data.items.filter(it => this.isCase(it)).map(it => it.data.coord);
|
let existants = actor.items.filter(it => this.isCase(it)).map(it => it.system.coord);
|
||||||
if (existants.length > 0) {
|
if (existants.length > 0) {
|
||||||
ChatMessage.create({
|
ChatMessage.create({
|
||||||
whisper: ChatUtility.getWhisperRecipientsAndGMs(game.user.name),
|
whisper: ChatUtility.getWhisperRecipientsAndGMs(game.user.name),
|
||||||
|
@ -12,8 +12,8 @@ export class ReserveExtensible extends Draconique {
|
|||||||
match(item) { return Draconique.isTeteDragon(item) && Grammar.toLowerCaseNoAccent(item.name).includes("reserve extensible"); }
|
match(item) { return Draconique.isTeteDragon(item) && Grammar.toLowerCaseNoAccent(item.name).includes("reserve extensible"); }
|
||||||
manualMessage() { return "Vous pouvez re-configurer votre Réserve extensible" }
|
manualMessage() { return "Vous pouvez re-configurer votre Réserve extensible" }
|
||||||
async onActorCreateOwned(actor, tete) {
|
async onActorCreateOwned(actor, tete) {
|
||||||
const existants = actor.data.items.filter(it => this.isCase(it)).map(it => it.data.coord);
|
const existants = actor.items.filter(it => this.isCase(it)).map(it => it.system.coord);
|
||||||
const tmr = await TMRUtility.getTMRAleatoire(it => !(it.type == 'fleuve' || existants.includes(it.coord)));
|
const tmr = await TMRUtility.getTMRAleatoire(it => !(it.type == 'fleuve' || existants.includes(it.system.coord)));
|
||||||
await this.createCaseTmr(actor, "Nouvelle Réserve extensible", tmr, tete.id);
|
await this.createCaseTmr(actor, "Nouvelle Réserve extensible", tmr, tete.id);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -12,8 +12,8 @@ export class SortReserve extends Draconique {
|
|||||||
manualMessage() { return false }
|
manualMessage() { return false }
|
||||||
async onActorCreateOwned(actor, item) { }
|
async onActorCreateOwned(actor, item) { }
|
||||||
|
|
||||||
code() { return 'sort' }
|
code() { return 'sortreserve' }
|
||||||
tooltip(sort) { return `${sort.name}, r${sort.data.ptreve_reel}` }
|
tooltip(sort) { return `${sort.name}, r${sort.system.ptreve}` }
|
||||||
img() { return 'systems/foundryvtt-reve-de-dragon/icons/tmr/scroll.webp' }
|
img() { return 'systems/foundryvtt-reve-de-dragon/icons/tmr/scroll.webp' }
|
||||||
|
|
||||||
createSprite(pixiTMR) {
|
createSprite(pixiTMR) {
|
||||||
|
@ -13,8 +13,8 @@ export class TrouNoir extends Draconique {
|
|||||||
manualMessage() { return false }
|
manualMessage() { return false }
|
||||||
|
|
||||||
async onActorCreateOwned(actor, souffle) {
|
async onActorCreateOwned(actor, souffle) {
|
||||||
const existants = actor.data.items.filter(it => this.isCase(it)).map(it => it.data.coord);
|
const existants = actor.items.filter(it => this.isCase(it)).map(it => it.system.coord);
|
||||||
const tmr = await TMRUtility.getTMRAleatoire(it => !(TMRUtility.isCaseHumide(it) || existants.includes(it.coord)));
|
const tmr = await TMRUtility.getTMRAleatoire(it => !(TMRUtility.isCaseHumide(it) || existants.includes(it.system.coord)));
|
||||||
await this.createCaseTmr(actor, 'Trou noir: ' + tmr.label, tmr, souffle.id);
|
await this.createCaseTmr(actor, 'Trou noir: ' + tmr.label, tmr, souffle.id);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -16,7 +16,7 @@ export class UrgenceDraconique extends Draconique {
|
|||||||
match(item) { return Draconique.isQueueDragon(item) && Grammar.toLowerCaseNoAccent(item.name).includes('urgence draconique'); }
|
match(item) { return Draconique.isQueueDragon(item) && Grammar.toLowerCaseNoAccent(item.name).includes('urgence draconique'); }
|
||||||
manualMessage() { return false }
|
manualMessage() { return false }
|
||||||
async onActorCreateOwned(actor, queue) {
|
async onActorCreateOwned(actor, queue) {
|
||||||
const coordSortsReserve = (Misc.templateData(actor).reve.reserve?.list.map(it => it.coord)) ?? [];
|
const coordSortsReserve = (actor.system.reve.reserve?.list.map(it => it.coord)) ?? [];
|
||||||
if (coordSortsReserve.length == 0) {
|
if (coordSortsReserve.length == 0) {
|
||||||
// La queue se transforme en idée fixe
|
// La queue se transforme en idée fixe
|
||||||
const ideeFixe = await RdDRollTables.getIdeeFixe();
|
const ideeFixe = await RdDRollTables.getIdeeFixe();
|
||||||
@ -37,7 +37,7 @@ export class UrgenceDraconique extends Draconique {
|
|||||||
}
|
}
|
||||||
|
|
||||||
async onActorDeleteCaseTmr(actor, casetmr) {
|
async onActorDeleteCaseTmr(actor, casetmr) {
|
||||||
await actor.deleteEmbeddedDocuments('Item', [casetmr.data.sourceid]);
|
await actor.deleteEmbeddedDocuments('Item', [casetmr.system.sourceid]);
|
||||||
}
|
}
|
||||||
|
|
||||||
code() { return 'urgence' }
|
code() { return 'urgence' }
|
||||||
|
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@ -1,27 +1,29 @@
|
|||||||
{"_id":"0zRL8bOpCXNQnIR4","name":"Ruade","permission":{"default":0,"Q2G6GTdrotKzYGUC":3},"type":"competencecreature","data":{"niveau":0,"carac_value":0,"iscombat":true,"dommages":4,"description":null,"categorie_parade":"","isparade":false,"default_diffLibre":0},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/compcreature-pietinement.webp","effects":[]}
|
{"_id":"0zRL8bOpCXNQnIR4","name":"Ruade","type":"competencecreature","flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.competences-creatures.0zRL8bOpCXNQnIR4"}},"img":"systems/foundryvtt-reve-de-dragon/icons/compcreature-pietinement.webp","effects":[],"system":{"categorie_parade":"","niveau":0,"default_diffLibre":0,"carac_value":0,"iscombat":true,"isparade":false,"ispossession":false,"dommages":4,"description":null,"descriptionmj":"","categorie":"melee","isnaturelle":true},"ownership":{"default":0,"Q2G6GTdrotKzYGUC":3},"folder":null,"sort":0,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.0.16","coreVersion":"10.285","createdTime":1663624702692,"modifiedTime":1663625011172,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"4GmpkphbsmQjvVVK","name":"Escalade","permission":{"default":0,"Q4cUvqxCxMoTJXDL":3},"type":"competencecreature","data":{"niveau":0,"carac_value":0,"iscombat":false,"dommages":0,"description":"","categorie_parade":"","isparade":false,"default_diffLibre":0},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_escalade.webp","effects":[]}
|
{"_id":"4GmpkphbsmQjvVVK","name":"Escalade","type":"competencecreature","flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.competences-creatures.4GmpkphbsmQjvVVK"}},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_escalade.webp","effects":[],"system":{"categorie_parade":"","niveau":0,"default_diffLibre":0,"carac_value":0,"iscombat":false,"isparade":false,"ispossession":false,"dommages":0,"description":"","descriptionmj":""},"ownership":{"default":0,"Q4cUvqxCxMoTJXDL":3},"folder":null,"sort":0,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.0.16","coreVersion":"10.285","createdTime":1663624702692,"modifiedTime":1663625011172,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"6DK46pyO0hzEuuUg","name":"Morsure","permission":{"default":0,"Q4cUvqxCxMoTJXDL":3},"type":"competencecreature","data":{"niveau":0,"carac_value":0,"iscombat":true,"dommages":1,"description":"","categorie_parade":"","isparade":false,"default_diffLibre":0},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/compcreature-morsure.webp","effects":[]}
|
{"_id":"6DK46pyO0hzEuuUg","name":"Morsure","type":"competencecreature","flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.competences-creatures.6DK46pyO0hzEuuUg"}},"img":"systems/foundryvtt-reve-de-dragon/icons/compcreature-morsure.webp","effects":[],"system":{"categorie_parade":"","niveau":0,"default_diffLibre":0,"carac_value":0,"iscombat":true,"isparade":false,"ispossession":false,"dommages":1,"description":"","descriptionmj":"","categorie":"generale","isnaturelle":true},"ownership":{"default":0,"Q4cUvqxCxMoTJXDL":3},"folder":null,"sort":0,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.0.16","coreVersion":"10.285","createdTime":1663624702692,"modifiedTime":1663625011172,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"BjqRrGtHtTzuNpZB","name":"Griffes et Crocs","permission":{"default":0,"Q4cUvqxCxMoTJXDL":3},"type":"competencecreature","data":{"niveau":0,"carac_value":0,"iscombat":true,"dommages":1,"description":"","categorie_parade":"","isparade":false,"default_diffLibre":0},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/compcreature-griffes.webp","effects":[]}
|
{"name":"Possession","type":"competencecreature","flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.competences-entites.c0I93Q53i4ZmxpyT"}},"img":"systems/foundryvtt-reve-de-dragon/icons/entites/possession.webp","effects":[],"system":{"categorie_parade":"","niveau":2,"default_diffLibre":0,"carac_value":14,"iscombat":true,"isparade":false,"ispossession":true,"dommages":0,"description":"<p>L'entité tente de prendre possession du corps de sa victime.</p>","descriptionmj":"","categorie":"melee"},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.0.16","coreVersion":"10.285","createdTime":1663624948267,"modifiedTime":1663625011162,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"},"_id":"9u16zxXRurCtxuOX","folder":null,"sort":0,"ownership":{"default":0,"Hp9ImM4o9YRTSdfu":3}}
|
||||||
{"_id":"CYpxxf1uTa78NWR9","name":"Esquive","permission":{"default":0,"Q4cUvqxCxMoTJXDL":3},"type":"competencecreature","data":{"niveau":0,"carac_value":0,"dommages":0,"iscombat":false,"description":"","categorie_parade":"","isparade":false,"default_diffLibre":0},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_esquive.webp","effects":[]}
|
{"_id":"BjqRrGtHtTzuNpZB","name":"Griffes et Crocs","type":"competencecreature","flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.competences-creatures.BjqRrGtHtTzuNpZB"}},"img":"systems/foundryvtt-reve-de-dragon/icons/compcreature-griffes.webp","effects":[],"system":{"categorie_parade":"","niveau":0,"default_diffLibre":0,"carac_value":0,"iscombat":true,"isparade":false,"ispossession":false,"dommages":1,"description":"","descriptionmj":"","categorie":"melee","isnaturelle":true},"ownership":{"default":0,"Q4cUvqxCxMoTJXDL":3},"folder":null,"sort":0,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.0.16","coreVersion":"10.285","createdTime":1663624702692,"modifiedTime":1663625011172,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"JTuBQCPdumw3DfxH","name":"Crête","permission":{"default":0,"Q4cUvqxCxMoTJXDL":3},"type":"competencecreature","data":{"niveau":0,"carac_value":0,"dommages":3,"iscombat":true,"description":"","categorie_parade":"","isparade":false,"default_diffLibre":0},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/compcreature-crete.webp","effects":[]}
|
{"_id":"CYpxxf1uTa78NWR9","name":"Esquive","type":"competencecreature","flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.competences-creatures.CYpxxf1uTa78NWR9"}},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_esquive.webp","effects":[],"system":{"categorie_parade":"","niveau":0,"default_diffLibre":0,"carac_value":0,"iscombat":false,"isparade":false,"ispossession":false,"dommages":0,"description":"","descriptionmj":""},"ownership":{"default":0,"Q4cUvqxCxMoTJXDL":3},"folder":null,"sort":0,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.0.16","coreVersion":"10.285","createdTime":1663624702692,"modifiedTime":1663625011173,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"Kt7WlB5Ui97X211z","name":"Vol","permission":{"default":0,"Q4cUvqxCxMoTJXDL":3},"type":"competencecreature","data":{"niveau":0,"carac_value":0,"dommages":0,"iscombat":false,"description":"","categorie_parade":"","isparade":false,"default_diffLibre":0},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/compcreature-vol.webp","effects":[]}
|
{"_id":"JTuBQCPdumw3DfxH","name":"Crête","type":"competencecreature","flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.competences-creatures.JTuBQCPdumw3DfxH"}},"img":"systems/foundryvtt-reve-de-dragon/icons/compcreature-crete.webp","effects":[],"system":{"categorie_parade":"","niveau":0,"default_diffLibre":0,"carac_value":0,"iscombat":true,"isparade":false,"ispossession":false,"dommages":3,"description":"","descriptionmj":"","categorie":"melee","isnaturelle":true},"ownership":{"default":0,"Q4cUvqxCxMoTJXDL":3},"folder":null,"sort":0,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.0.16","coreVersion":"10.285","createdTime":1663624702693,"modifiedTime":1663625011173,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"LWQHz5ymNBzh6ZEr","name":"Cornes","permission":{"default":0,"Q4cUvqxCxMoTJXDL":3},"type":"competencecreature","data":{"niveau":0,"carac_value":0,"iscombat":true,"dommages":2,"description":"","categorie_parade":"","isparade":false,"default_diffLibre":0},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/compcreature-corne.webp","effects":[]}
|
{"_id":"Kt7WlB5Ui97X211z","name":"Vol","type":"competencecreature","flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.competences-creatures.Kt7WlB5Ui97X211z"}},"img":"systems/foundryvtt-reve-de-dragon/icons/compcreature-vol.webp","effects":[],"system":{"categorie_parade":"","niveau":0,"default_diffLibre":0,"carac_value":0,"iscombat":false,"isparade":false,"ispossession":false,"dommages":0,"description":"","descriptionmj":""},"ownership":{"default":0,"Q4cUvqxCxMoTJXDL":3},"folder":null,"sort":0,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.0.16","coreVersion":"10.285","createdTime":1663624702693,"modifiedTime":1663625011173,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"NctG7suzvGE7ZZzj","name":"Bras-bouches","permission":{"default":0,"Q4cUvqxCxMoTJXDL":3},"type":"competencecreature","data":{"niveau":0,"carac_value":0,"iscombat":true,"dommages":2,"description":"","categorie_parade":"epees-lourdes","isparade":true,"default_diffLibre":0},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/compcreature-brasbouche.webp","effects":[]}
|
{"_id":"LWQHz5ymNBzh6ZEr","name":"Cornes","type":"competencecreature","flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.competences-creatures.LWQHz5ymNBzh6ZEr"}},"img":"systems/foundryvtt-reve-de-dragon/icons/compcreature-corne.webp","effects":[],"system":{"categorie_parade":"","niveau":0,"default_diffLibre":0,"carac_value":0,"iscombat":true,"isparade":false,"ispossession":false,"dommages":2,"description":"","descriptionmj":"","categorie":"melee","isnaturelle":true},"ownership":{"default":0,"Q4cUvqxCxMoTJXDL":3},"folder":null,"sort":0,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.0.16","coreVersion":"10.285","createdTime":1663624702693,"modifiedTime":1663625011173,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"OzHBowOMADRwcVXR","name":"Pierre Tenue","permission":{"default":0,"Q4cUvqxCxMoTJXDL":3},"type":"competencecreature","data":{"niveau":0,"carac_value":0,"iscombat":true,"dommages":2,"description":"","categorie_parade":"","isparade":false,"default_diffLibre":0},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/compcreature-pierretenue.webp","effects":[]}
|
{"_id":"NctG7suzvGE7ZZzj","name":"Bras-bouches","type":"competencecreature","flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.competences-creatures.NctG7suzvGE7ZZzj"}},"img":"systems/foundryvtt-reve-de-dragon/icons/compcreature-brasbouche.webp","effects":[],"system":{"categorie_parade":"epees-lourdes","niveau":0,"default_diffLibre":0,"carac_value":0,"iscombat":true,"isparade":true,"ispossession":false,"dommages":2,"description":"","descriptionmj":"","categorie":"melee","isnaturelle":true},"ownership":{"default":0,"Q4cUvqxCxMoTJXDL":3},"folder":null,"sort":0,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.0.16","coreVersion":"10.285","createdTime":1663624702693,"modifiedTime":1663625011173,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"PCwbR6lghjydTj93","name":"Grande morsure","permission":{"default":0,"Q2G6GTdrotKzYGUC":3},"type":"competencecreature","data":{"categorie_parade":"","niveau":0,"carac_value":0,"iscombat":true,"isparade":false,"dommages":2,"description":"","default_diffLibre":0},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/compcreature-morsure.webp","effects":[]}
|
{"_id":"OzHBowOMADRwcVXR","name":"Pierre Tenue","type":"competencecreature","flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.competences-creatures.OzHBowOMADRwcVXR"}},"img":"systems/foundryvtt-reve-de-dragon/icons/compcreature-pierretenue.webp","effects":[],"system":{"categorie_parade":"","niveau":0,"default_diffLibre":0,"carac_value":0,"iscombat":true,"isparade":false,"ispossession":false,"dommages":2,"description":"","descriptionmj":"","categorie":"melee","isnaturelle":false},"ownership":{"default":0,"Q4cUvqxCxMoTJXDL":3},"folder":null,"sort":0,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.0.16","coreVersion":"10.285","createdTime":1663624702693,"modifiedTime":1663625011173,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"PrVuVpwuYaZtwRUi","name":"Piétinement","permission":{"default":0,"Q2G6GTdrotKzYGUC":3},"type":"competencecreature","data":{"niveau":0,"carac_value":0,"iscombat":true,"dommages":4,"description":null,"categorie_parade":"","isparade":false,"default_diffLibre":0},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/compcreature-pietinement.webp","effects":[]}
|
{"_id":"PCwbR6lghjydTj93","name":"Grande morsure","type":"competencecreature","flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.competences-creatures.PCwbR6lghjydTj93"}},"img":"systems/foundryvtt-reve-de-dragon/icons/compcreature-morsure.webp","effects":[],"system":{"categorie_parade":"","niveau":0,"default_diffLibre":0,"carac_value":0,"iscombat":true,"isparade":false,"ispossession":false,"dommages":2,"description":"","descriptionmj":"","categorie":"melee","isnaturelle":true},"ownership":{"default":0,"Q2G6GTdrotKzYGUC":3},"folder":null,"sort":0,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.0.16","coreVersion":"10.285","createdTime":1663624702693,"modifiedTime":1663625011173,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"RAnasKnoA3OQgwfv","name":"Pinces","permission":{"default":0,"Q4cUvqxCxMoTJXDL":3},"type":"competencecreature","data":{"niveau":0,"carac_value":0,"iscombat":true,"dommages":3,"description":"","categorie_parade":"epees-lourdes","isparade":true,"default_diffLibre":0},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/compcreature-pinces.webp","effects":[]}
|
{"_id":"PrVuVpwuYaZtwRUi","name":"Piétinement","type":"competencecreature","flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.competences-creatures.PrVuVpwuYaZtwRUi"}},"img":"systems/foundryvtt-reve-de-dragon/icons/compcreature-pietinement.webp","effects":[],"system":{"categorie_parade":"","niveau":0,"default_diffLibre":0,"carac_value":0,"iscombat":true,"isparade":false,"ispossession":false,"dommages":4,"description":null,"descriptionmj":"","categorie":"melee","isnaturelle":true},"ownership":{"default":0,"Q2G6GTdrotKzYGUC":3},"folder":null,"sort":0,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.0.16","coreVersion":"10.285","createdTime":1663624702693,"modifiedTime":1663625011173,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"XgfRxSj8Ty1d3JFM","name":"Mandibules","permission":{"default":0,"Q4cUvqxCxMoTJXDL":3},"type":"competencecreature","data":{"niveau":0,"carac_value":0,"iscombat":true,"dommages":2,"description":"","carac-value":null,"categorie_parade":"","isparade":false,"default_diffLibre":0},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/compcreature-mandibules.webp","effects":[]}
|
{"_id":"RAnasKnoA3OQgwfv","name":"Pinces","type":"competencecreature","flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.competences-creatures.RAnasKnoA3OQgwfv"}},"img":"systems/foundryvtt-reve-de-dragon/icons/compcreature-pinces.webp","effects":[],"system":{"categorie_parade":"epees-lourdes","niveau":0,"default_diffLibre":0,"carac_value":0,"iscombat":true,"isparade":true,"ispossession":false,"dommages":3,"description":"","descriptionmj":"","categorie":"melee","isnaturelle":true},"ownership":{"default":0,"Q4cUvqxCxMoTJXDL":3},"folder":null,"sort":0,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.0.16","coreVersion":"10.285","createdTime":1663624702694,"modifiedTime":1663625011173,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"Zpl2Bi451vB3r91W","name":"Coup de pied","permission":{"default":0,"Q2G6GTdrotKzYGUC":3},"type":"competencecreature","data":{"niveau":0,"carac_value":0,"iscombat":true,"dommages":3,"description":null,"categorie_parade":"","isparade":false,"default_diffLibre":0},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/compcreature-coup_de_pied.webp","effects":[]}
|
{"_id":"XgfRxSj8Ty1d3JFM","name":"Mandibules","type":"competencecreature","flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.competences-creatures.XgfRxSj8Ty1d3JFM"}},"img":"systems/foundryvtt-reve-de-dragon/icons/compcreature-mandibules.webp","effects":[],"system":{"categorie_parade":"","niveau":0,"default_diffLibre":0,"carac_value":0,"iscombat":true,"isparade":false,"ispossession":false,"dommages":2,"description":"","descriptionmj":"","carac-value":null,"categorie":"generale","isnaturelle":true},"ownership":{"default":0,"Q4cUvqxCxMoTJXDL":3},"folder":null,"sort":0,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.0.16","coreVersion":"10.285","createdTime":1663624702694,"modifiedTime":1663625011173,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"efl1HdDSKpBfImQ1","name":"Pierre Lancée","permission":{"default":0,"Q4cUvqxCxMoTJXDL":3},"type":"competencecreature","data":{"niveau":0,"carac_value":0,"iscombat":true,"dommages":1,"description":"","categorie_parade":"","isparade":false,"default_diffLibre":0},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/compcreature-pierrelancee.webp","effects":[]}
|
{"_id":"Zpl2Bi451vB3r91W","name":"Coup de pied","type":"competencecreature","flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.competences-creatures.Zpl2Bi451vB3r91W"}},"img":"systems/foundryvtt-reve-de-dragon/icons/compcreature-coup_de_pied.webp","effects":[],"system":{"categorie_parade":"","niveau":0,"default_diffLibre":0,"carac_value":0,"iscombat":true,"isparade":false,"ispossession":false,"dommages":3,"description":null,"descriptionmj":"","categorie":"melee","isnaturelle":true},"ownership":{"default":0,"Q2G6GTdrotKzYGUC":3},"folder":null,"sort":0,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.0.16","coreVersion":"10.285","createdTime":1663624702694,"modifiedTime":1663625011173,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"h9ASt4vrvEgxfj7j","name":"Tronçonneuse","permission":{"default":0,"Q4cUvqxCxMoTJXDL":3},"type":"competencecreature","data":{"niveau":0,"carac_value":0,"iscombat":true,"dommages":10,"description":"","categorie_parade":"","isparade":false,"default_diffLibre":0},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/compcreature-tronconneuse.webp","effects":[]}
|
{"name":"Possession","type":"competencecreature","flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.competences-entites.c0I93Q53i4ZmxpyT"}},"img":"systems/foundryvtt-reve-de-dragon/icons/entites/possession.webp","effects":[],"system":{"categorie_parade":"","niveau":2,"default_diffLibre":0,"carac_value":14,"iscombat":true,"isparade":false,"ispossession":true,"dommages":0,"description":"<p>L'entité tente de prendre possession du corps de sa victime.</p>","descriptionmj":"","categorie":"draconic"},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.0.16","coreVersion":"10.285","createdTime":1663624976822,"modifiedTime":1663625011162,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"},"_id":"duVgxI3Cdko0KzAj","folder":null,"sort":0,"ownership":{"default":0,"Hp9ImM4o9YRTSdfu":3}}
|
||||||
{"_id":"jhua9kkCs55OV7Yl","name":"Grandes griffes","permission":{"default":0,"Q2G6GTdrotKzYGUC":3},"type":"competencecreature","data":{"categorie_parade":"sans-armes","niveau":0,"carac_value":0,"iscombat":true,"isparade":true,"dommages":2,"description":"","default_diffLibre":0},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/compcreature-griffes.webp","effects":[]}
|
{"_id":"efl1HdDSKpBfImQ1","name":"Pierre Lancée","type":"competencecreature","flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.competences-creatures.efl1HdDSKpBfImQ1"}},"img":"systems/foundryvtt-reve-de-dragon/icons/compcreature-pierrelancee.webp","effects":[],"system":{"categorie_parade":"","niveau":0,"default_diffLibre":0,"carac_value":0,"iscombat":true,"isparade":false,"ispossession":false,"dommages":1,"description":"","descriptionmj":"","categorie":"lancer","isnaturelle":false},"ownership":{"default":0,"Q4cUvqxCxMoTJXDL":3},"folder":null,"sort":0,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.0.16","coreVersion":"10.285","createdTime":1663624702694,"modifiedTime":1663625011173,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"lzEdMrKXbOYrWG5S","name":"Vigilance","permission":{"default":0,"Q4cUvqxCxMoTJXDL":3},"type":"competencecreature","data":{"niveau":0,"carac_value":0,"iscombat":false,"dommages":0,"description":"","categorie_parade":"","isparade":false,"default_diffLibre":0},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_vigilance.webp","effects":[]}
|
{"_id":"h9ASt4vrvEgxfj7j","name":"Tronçonneuse","type":"competencecreature","flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.competences-creatures.h9ASt4vrvEgxfj7j"}},"img":"systems/foundryvtt-reve-de-dragon/icons/compcreature-tronconneuse.webp","effects":[],"system":{"categorie_parade":"","niveau":0,"default_diffLibre":0,"carac_value":0,"iscombat":true,"isparade":false,"ispossession":false,"dommages":10,"description":"","descriptionmj":"","categorie":"melee","isnaturelle":true},"ownership":{"default":0,"Q4cUvqxCxMoTJXDL":3},"folder":null,"sort":0,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.0.16","coreVersion":"10.285","createdTime":1663624702694,"modifiedTime":1663625011173,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"ndNshntOYb1JFNqi","name":"Serres","permission":{"default":0,"Q4cUvqxCxMoTJXDL":3},"type":"competencecreature","data":{"niveau":0,"carac_value":0,"iscombat":true,"dommages":2,"description":"","categorie_parade":"","isparade":false,"default_diffLibre":0},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/compcreature-serres.webp","effects":[]}
|
{"_id":"jhua9kkCs55OV7Yl","name":"Grandes griffes","type":"competencecreature","flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.competences-creatures.jhua9kkCs55OV7Yl"}},"img":"systems/foundryvtt-reve-de-dragon/icons/compcreature-griffes.webp","effects":[],"system":{"categorie_parade":"sans-armes","niveau":0,"default_diffLibre":0,"carac_value":0,"iscombat":true,"isparade":true,"ispossession":false,"dommages":2,"description":"","descriptionmj":"","categorie":"melee","isnaturelle":true},"ownership":{"default":0,"Q2G6GTdrotKzYGUC":3},"folder":null,"sort":0,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.0.16","coreVersion":"10.285","createdTime":1663624702694,"modifiedTime":1663625011173,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"os88Rsp7mBkahqmh","name":"Bec","permission":{"default":0,"Q4cUvqxCxMoTJXDL":3},"type":"competencecreature","data":{"niveau":0,"carac_value":0,"iscombat":true,"dommages":0,"description":"","categorie_parade":"","isparade":false,"default_diffLibre":0},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/compcreature-beak.webp","effects":[]}
|
{"_id":"lzEdMrKXbOYrWG5S","name":"Vigilance","type":"competencecreature","flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.competences-creatures.lzEdMrKXbOYrWG5S"}},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_vigilance.webp","effects":[],"system":{"categorie_parade":"","niveau":0,"default_diffLibre":0,"carac_value":0,"iscombat":false,"isparade":false,"ispossession":false,"dommages":0,"description":"","descriptionmj":""},"ownership":{"default":0,"Q4cUvqxCxMoTJXDL":3},"folder":null,"sort":0,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.0.16","coreVersion":"10.285","createdTime":1663624702694,"modifiedTime":1663625011173,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"qilRzXpVaGceNmQp","name":"Dague","permission":{"default":0,"Q4cUvqxCxMoTJXDL":3},"type":"competencecreature","data":{"niveau":0,"carac_value":0,"iscombat":true,"dommages":1,"description":"","categorie_parade":"dagues","isparade":true,"default_diffLibre":0},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_dague.webp","effects":[]}
|
{"_id":"ndNshntOYb1JFNqi","name":"Serres","type":"competencecreature","flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.competences-creatures.ndNshntOYb1JFNqi"}},"img":"systems/foundryvtt-reve-de-dragon/icons/compcreature-serres.webp","effects":[],"system":{"categorie_parade":"","niveau":0,"default_diffLibre":0,"carac_value":0,"iscombat":true,"isparade":false,"ispossession":false,"dommages":2,"description":"","descriptionmj":"","categorie":"melee","isnaturelle":true},"ownership":{"default":0,"Q4cUvqxCxMoTJXDL":3},"folder":null,"sort":0,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.0.16","coreVersion":"10.285","createdTime":1663624702694,"modifiedTime":1663625011173,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"qrd9AoZzFgyzFBxz","name":"Griffes","permission":{"default":0,"Q2G6GTdrotKzYGUC":3},"type":"competencecreature","data":{"categorie_parade":"sans-armes","niveau":0,"carac_value":0,"iscombat":true,"isparade":true,"dommages":1,"description":"","default_diffLibre":0},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/compcreature-griffes.webp","effects":[]}
|
{"_id":"os88Rsp7mBkahqmh","name":"Bec","type":"competencecreature","flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.competences-creatures.os88Rsp7mBkahqmh"}},"img":"systems/foundryvtt-reve-de-dragon/icons/compcreature-beak.webp","effects":[],"system":{"categorie_parade":"","niveau":0,"default_diffLibre":0,"carac_value":0,"iscombat":true,"isparade":false,"ispossession":false,"dommages":0,"description":"","descriptionmj":"","categorie":"melee","isnaturelle":true},"ownership":{"default":0,"Q4cUvqxCxMoTJXDL":3},"folder":null,"sort":0,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.0.16","coreVersion":"10.285","createdTime":1663624702695,"modifiedTime":1663625011173,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"sUdXhpuVVOAlcVpo","name":"Pickpocket","permission":{"default":0,"Q4cUvqxCxMoTJXDL":3},"type":"competencecreature","data":{"niveau":0,"carac_value":0,"iscombat":false,"dommages":0,"description":"","categorie_parade":"","isparade":false,"default_diffLibre":0},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_pickpocket.webp","effects":[]}
|
{"_id":"qilRzXpVaGceNmQp","name":"Dague","type":"competencecreature","flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.competences-creatures.qilRzXpVaGceNmQp"}},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_dague.webp","effects":[],"system":{"categorie_parade":"dagues","niveau":0,"default_diffLibre":0,"carac_value":0,"iscombat":true,"isparade":true,"ispossession":false,"dommages":1,"description":"","descriptionmj":"","categorie":"melee","isnaturelle":false},"ownership":{"default":0,"Q4cUvqxCxMoTJXDL":3},"folder":null,"sort":0,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.0.16","coreVersion":"10.285","createdTime":1663624702695,"modifiedTime":1663625011173,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"shsUV8UpU18c0RJK","name":"Course","permission":{"default":0,"Q4cUvqxCxMoTJXDL":3},"type":"competencecreature","data":{"niveau":0,"carac_value":0,"iscombat":false,"dommages":0,"description":"","categorie_parade":"","isparade":false,"default_diffLibre":0},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_course.webp","effects":[]}
|
{"_id":"qrd9AoZzFgyzFBxz","name":"Griffes","type":"competencecreature","flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.competences-creatures.qrd9AoZzFgyzFBxz"}},"img":"systems/foundryvtt-reve-de-dragon/icons/compcreature-griffes.webp","effects":[],"system":{"categorie_parade":"sans-armes","niveau":0,"default_diffLibre":0,"carac_value":0,"iscombat":true,"isparade":true,"ispossession":false,"dommages":1,"description":"","descriptionmj":"","categorie":"melee","isnaturelle":true},"ownership":{"default":0,"Q2G6GTdrotKzYGUC":3},"folder":null,"sort":0,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.0.16","coreVersion":"10.285","createdTime":1663624702695,"modifiedTime":1663625011173,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"yBUVTjTXYfwvzusb","name":"Saut","permission":{"default":0,"Q2G6GTdrotKzYGUC":3},"type":"competencecreature","data":{"niveau":0,"carac_value":0,"iscombat":false,"dommages":0,"description":"","categorie_parade":"","isparade":false,"default_diffLibre":0},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_saut.webp","effects":[]}
|
{"_id":"sUdXhpuVVOAlcVpo","name":"Pickpocket","type":"competencecreature","flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.competences-creatures.sUdXhpuVVOAlcVpo"}},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_pickpocket.webp","effects":[],"system":{"categorie_parade":"","niveau":0,"default_diffLibre":0,"carac_value":0,"iscombat":false,"isparade":false,"ispossession":false,"dommages":0,"description":"","descriptionmj":""},"ownership":{"default":0,"Q4cUvqxCxMoTJXDL":3},"folder":null,"sort":0,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.0.16","coreVersion":"10.285","createdTime":1663624702695,"modifiedTime":1663625011174,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"yDHZfK4RmwQW4YaW","name":"Discrétion","permission":{"default":0,"Q4cUvqxCxMoTJXDL":3},"type":"competencecreature","data":{"niveau":0,"carac_value":0,"iscombat":false,"dommages":0,"description":"","categorie_parade":"","isparade":false,"default_diffLibre":0},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_discretion.webp","effects":[]}
|
{"_id":"shsUV8UpU18c0RJK","name":"Course","type":"competencecreature","flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.competences-creatures.shsUV8UpU18c0RJK"}},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_course.webp","effects":[],"system":{"categorie_parade":"","niveau":0,"default_diffLibre":0,"carac_value":0,"iscombat":false,"isparade":false,"ispossession":false,"dommages":0,"description":"","descriptionmj":""},"ownership":{"default":0,"Q4cUvqxCxMoTJXDL":3},"folder":null,"sort":0,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.0.16","coreVersion":"10.285","createdTime":1663624702695,"modifiedTime":1663625011174,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
|
{"_id":"yBUVTjTXYfwvzusb","name":"Saut","type":"competencecreature","flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.competences-creatures.yBUVTjTXYfwvzusb"}},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_saut.webp","effects":[],"system":{"categorie_parade":"","niveau":0,"default_diffLibre":0,"carac_value":0,"iscombat":false,"isparade":false,"ispossession":false,"dommages":0,"description":"","descriptionmj":"","categorie":"generale"},"ownership":{"default":0,"Q2G6GTdrotKzYGUC":3},"folder":null,"sort":0,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.0.16","coreVersion":"10.285","createdTime":1663624702695,"modifiedTime":1663625011174,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
|
{"_id":"yDHZfK4RmwQW4YaW","name":"Discrétion","type":"competencecreature","flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.competences-creatures.yDHZfK4RmwQW4YaW"}},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_discretion.webp","effects":[],"system":{"categorie_parade":"","niveau":0,"default_diffLibre":0,"carac_value":0,"iscombat":false,"isparade":false,"ispossession":false,"dommages":0,"description":"","descriptionmj":""},"ownership":{"default":0,"Q4cUvqxCxMoTJXDL":3},"folder":null,"sort":0,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.0.16","coreVersion":"10.285","createdTime":1663624702695,"modifiedTime":1663625011174,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
|
@ -1,40 +1,40 @@
|
|||||||
{"name":"Idée fixe : Anorexie. Ne rien avaler, ni solide, ni liquide, pas même une potion","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"<p>Prend effet immédiatement et dure jusqu'à la <strong>fin de l'heure du Château Dormant </strong>du <strong>lendemain.<br /></strong>Si passé ce délai, l'occasion de la manifester ne s'est pas présentée, la queue prend fin.</p>\n<p>Si elle entre en contradiction avec une autre queue, retirer.</p>","refoulement":1},"flags":{},"img":"anorexie.webp","effects":[],"_id":"0uc2pMIGL03Hq2Hn"}
|
{"name":"Idée fixe : Anorexie. Ne rien avaler, ni solide, ni liquide, pas même une potion","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"<p>Prend effet immédiatement et dure jusqu'à la <strong>fin de l'heure du Château Dormant </strong>du <strong>lendemain.<br /></strong>Si passé ce délai, l'occasion de la manifester ne s'est pas présentée, la queue prend fin.</p>\n<p>Si elle entre en contradiction avec une autre queue, retirer.</p>","refoulement":1},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/queues/idee_fixe.webp","effects":[],"_id":"0uc2pMIGL03Hq2Hn"}
|
||||||
{"name":"Désir lancinant : Briser un objet de verre","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"<p>Tant que satisfaction n'est pas obtenue, aucun point d'expérience ne peut plus être gagné par l'exercice en cas de particulière et d'ajustement final négatif.<br />Les points d'expérience dus au stress ne sont pas affectés.</p>","refoulement":1},"flags":{},"img":"briser_verre.webp","effects":[],"_id":"1l59lWbtvYp74OTb"}
|
{"name":"Désir lancinant : Briser un objet de verre","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"<p>Tant que satisfaction n'est pas obtenue, aucun point d'expérience ne peut plus être gagné par l'exercice en cas de particulière et d'ajustement final négatif.<br />Les points d'expérience dus au stress ne sont pas affectés.</p>","refoulement":1},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/queues/desir_lancinant.webp","effects":[],"_id":"1l59lWbtvYp74OTb"}
|
||||||
{"name":"Idée fixe : Cracher dans toute nourriture ou boisson aperçue","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"<p>Prend effet immédiatement et dure jusqu'à la <strong>fin de l'heure du Château Dormant </strong>du <strong>lendemain.<br /></strong>Si passé ce délai, l'occasion de la manifester ne s'est pas présentée, la queue prend fin.</p>\n<p>Si elle entre en contradiction avec une autre queue, retirer.</p>","refoulement":1},"flags":{},"img":"cracher_nourriture.webp","effects":[],"_id":"22EQLBJfHVYs96iC"}
|
{"name":"Idée fixe : Cracher dans toute nourriture ou boisson aperçue","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"<p>Prend effet immédiatement et dure jusqu'à la <strong>fin de l'heure du Château Dormant </strong>du <strong>lendemain.<br /></strong>Si passé ce délai, l'occasion de la manifester ne s'est pas présentée, la queue prend fin.</p>\n<p>Si elle entre en contradiction avec une autre queue, retirer.</p>","refoulement":1},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/queues/idee_fixe.webp","effects":[],"_id":"22EQLBJfHVYs96iC"}
|
||||||
{"name":"Idée fixe : Éteindre tout feu rencontré (feu de camp, torche, lanterne, etc.)","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"<p>Prend effet immédiatement et dure jusqu'à la <strong>fin de l'heure du Château Dormant </strong>du <strong>lendemain.<br /></strong>Si passé ce délai, l'occasion de la manifester ne s'est pas présentée, la queue prend fin.</p>\n<p>Si elle entre en contradiction avec une autre queue, retirer.</p>","refoulement":1},"flags":{},"img":"eteindre_feu.webp","effects":[],"_id":"2Rtm78bMKPy8eG4q"}
|
{"name":"Idée fixe : Éteindre tout feu rencontré (feu de camp, torche, lanterne, etc.)","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"<p>Prend effet immédiatement et dure jusqu'à la <strong>fin de l'heure du Château Dormant </strong>du <strong>lendemain.<br /></strong>Si passé ce délai, l'occasion de la manifester ne s'est pas présentée, la queue prend fin.</p>\n<p>Si elle entre en contradiction avec une autre queue, retirer.</p>","refoulement":1},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/queues/idee_fixe.webp","effects":[],"_id":"2Rtm78bMKPy8eG4q"}
|
||||||
{"name":"Désir lancinant : Danser avec un(e) partenaire inconnu(e) (Beauté 13 minimum)","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"<p>Tant que satisfaction n'est pas obtenue, aucun point d'expérience ne peut plus être gagné par l'exercice en cas de particulière et d'ajustement final négatif.<br />Les points d'expérience dus au stress ne sont pas affectés.</p>","refoulement":1},"flags":{},"img":"danser_inconnu.webp","effects":[],"_id":"2i3PndTKG1n3hEUU"}
|
{"name":"Désir lancinant : Danser avec un(e) partenaire inconnu(e) (Beauté 13 minimum)","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"<p>Tant que satisfaction n'est pas obtenue, aucun point d'expérience ne peut plus être gagné par l'exercice en cas de particulière et d'ajustement final négatif.<br />Les points d'expérience dus au stress ne sont pas affectés.</p>","refoulement":1},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/queues/desir_lancinant.webp","effects":[],"_id":"2i3PndTKG1n3hEUU"}
|
||||||
{"name":"Idée fixe : Traîner son épée en laisse (ou sa meilleure arme)","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"<p>Prend effet immédiatement et dure jusqu'à la <strong>fin de l'heure du Château Dormant </strong>du <strong>lendemain.<br /></strong>Si passé ce délai, l'occasion de la manifester ne s'est pas présentée, la queue prend fin.</p>\n<p>Si elle entre en contradiction avec une autre queue, retirer.</p>","refoulement":1},"flags":{},"img":"trainer_laisse.webp","effects":[],"_id":"2j1q9e07ZLlIQDYl"}
|
{"name":"Idée fixe : Traîner son épée en laisse (ou sa meilleure arme)","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"<p>Prend effet immédiatement et dure jusqu'à la <strong>fin de l'heure du Château Dormant </strong>du <strong>lendemain.<br /></strong>Si passé ce délai, l'occasion de la manifester ne s'est pas présentée, la queue prend fin.</p>\n<p>Si elle entre en contradiction avec une autre queue, retirer.</p>","refoulement":1},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/queues/idee_fixe.webp","effects":[],"_id":"2j1q9e07ZLlIQDYl"}
|
||||||
{"name":"Désir lancinant : Gagner de l’argent (minimum 10 deniers)","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"<p>Tant que satisfaction n'est pas obtenue, aucun point d'expérience ne peut plus être gagné par l'exercice en cas de particulière et d'ajustement final négatif.<br />Les points d'expérience dus au stress ne sont pas affectés.</p>","refoulement":1},"flags":{},"img":"gagner_argent.webp","effects":[],"_id":"3BcC8lSsP5WIyva7"}
|
{"name":"Désir lancinant : Gagner de l’argent (minimum 10 deniers)","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"<p>Tant que satisfaction n'est pas obtenue, aucun point d'expérience ne peut plus être gagné par l'exercice en cas de particulière et d'ajustement final négatif.<br />Les points d'expérience dus au stress ne sont pas affectés.</p>","refoulement":1},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/queues/desir_lancinant.webp","effects":[],"_id":"3BcC8lSsP5WIyva7"}
|
||||||
{"name":"Désir lancinant : Mégalomanie. Être acclamé par un minimum de 10 personnes","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"<p>Tant que satisfaction n'est pas obtenue, aucun point d'expérience ne peut plus être gagné par l'exercice en cas de particulière et d'ajustement final négatif.<br />Les points d'expérience dus au stress ne sont pas affectés.</p>","refoulement":1},"flags":{},"img":"megalomanie.webp","effects":[],"_id":"3ZjwYyQRatCMnBCi"}
|
{"name":"Désir lancinant : Mégalomanie. Être acclamé par un minimum de 10 personnes","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"<p>Tant que satisfaction n'est pas obtenue, aucun point d'expérience ne peut plus être gagné par l'exercice en cas de particulière et d'ajustement final négatif.<br />Les points d'expérience dus au stress ne sont pas affectés.</p>","refoulement":1},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/queues/desir_lancinant.webp","effects":[],"_id":"3ZjwYyQRatCMnBCi"}
|
||||||
{"name":"Idée fixe : Avoir le visage noirci à la cendre","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"<p>Prend effet immédiatement et dure jusqu'à la <strong>fin de l'heure du Château Dormant </strong>du <strong>lendemain.<br /></strong>Si passé ce délai, l'occasion de la manifester ne s'est pas présentée, la queue prend fin.</p>\n<p>Si elle entre en contradiction avec une autre queue, retirer.</p>","refoulement":1},"flags":{},"img":"avoir_visage.webp","effects":[],"_id":"6G0lF06jSryTduAt"}
|
{"name":"Idée fixe : Avoir le visage noirci à la cendre","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"<p>Prend effet immédiatement et dure jusqu'à la <strong>fin de l'heure du Château Dormant </strong>du <strong>lendemain.<br /></strong>Si passé ce délai, l'occasion de la manifester ne s'est pas présentée, la queue prend fin.</p>\n<p>Si elle entre en contradiction avec une autre queue, retirer.</p>","refoulement":1},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/queues/idee_fixe.webp","effects":[],"_id":"6G0lF06jSryTduAt"}
|
||||||
{"name":"Idée fixe : Ne marcher qu’à quatre pattes","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"<p>Prend effet immédiatement et dure jusqu'à la <strong>fin de l'heure du Château Dormant </strong>du <strong>lendemain.<br /></strong>Si passé ce délai, l'occasion de la manifester ne s'est pas présentée, la queue prend fin.</p>\n<p>Si elle entre en contradiction avec une autre queue, retirer.</p>","refoulement":1},"flags":{},"img":"marcher_quatre_pattes.webp","effects":[],"_id":"7TKsit2Mv9mWGq3C"}
|
{"name":"Idée fixe : Ne marcher qu’à quatre pattes","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"<p>Prend effet immédiatement et dure jusqu'à la <strong>fin de l'heure du Château Dormant </strong>du <strong>lendemain.<br /></strong>Si passé ce délai, l'occasion de la manifester ne s'est pas présentée, la queue prend fin.</p>\n<p>Si elle entre en contradiction avec une autre queue, retirer.</p>","refoulement":1},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/queues/idee_fixe.webp","effects":[],"_id":"7TKsit2Mv9mWGq3C"}
|
||||||
{"name":"Désir lancinant : Acquérir une chèvre","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"<p>Tant que satisfaction n'est pas obtenue, aucun point d'expérience ne peut plus être gagné par l'exercice en cas de particulière et d'ajustement final négatif.<br />Les points d'expérience dus au stress ne sont pas affectés.</p>","refoulement":1},"flags":{},"img":"acqu%C3%A9rir_chevre.webp","effects":[],"_id":"8sLXQBqo8XwjAFG0"}
|
{"name":"Désir lancinant : Acquérir une chèvre","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"<p>Tant que satisfaction n'est pas obtenue, aucun point d'expérience ne peut plus être gagné par l'exercice en cas de particulière et d'ajustement final négatif.<br />Les points d'expérience dus au stress ne sont pas affectés.</p>","refoulement":1},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/queues/desir_lancinant.webp","effects":[],"_id":"8sLXQBqo8XwjAFG0"}
|
||||||
{"name":"Idée fixe : Garder les yeux bandés","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"<p>Prend effet immédiatement et dure jusqu'à la <strong>fin de l'heure du Château Dormant </strong>du <strong>lendemain.<br /></strong>Si passé ce délai, l'occasion de la manifester ne s'est pas présentée, la queue prend fin.</p>\n<p>Si elle entre en contradiction avec une autre queue, retirer.</p>","refoulement":1},"flags":{},"img":"garder_yeux.webp","effects":[],"_id":"E902EEYZHg3zFKq6"}
|
{"name":"Idée fixe : Garder les yeux bandés","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"<p>Prend effet immédiatement et dure jusqu'à la <strong>fin de l'heure du Château Dormant </strong>du <strong>lendemain.<br /></strong>Si passé ce délai, l'occasion de la manifester ne s'est pas présentée, la queue prend fin.</p>\n<p>Si elle entre en contradiction avec une autre queue, retirer.</p>","refoulement":1},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/queues/idee_fixe.webp","effects":[],"_id":"E902EEYZHg3zFKq6"}
|
||||||
{"name":"Désir lancinant : Danser nu sous la pluie","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"<p>Tant que satisfaction n'est pas obtenue, aucun point d'expérience ne peut plus être gagné par l'exercice en cas de particulière et d'ajustement final négatif.<br />Les points d'expérience dus au stress ne sont pas affectés.</p>","refoulement":1},"flags":{},"img":"danser_pluie.webp","effects":[],"_id":"F6qL4d4g3qjh045R"}
|
{"name":"Désir lancinant : Danser nu sous la pluie","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"<p>Tant que satisfaction n'est pas obtenue, aucun point d'expérience ne peut plus être gagné par l'exercice en cas de particulière et d'ajustement final négatif.<br />Les points d'expérience dus au stress ne sont pas affectés.</p>","refoulement":1},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/queues/desir_lancinant.webp","effects":[],"_id":"F6qL4d4g3qjh045R"}
|
||||||
{"name":"Idée fixe : Garder sur soi 3d6 kilos de cailloux","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"<p>Prend effet immédiatement et dure jusqu'à la <strong>fin de l'heure du Château Dormant </strong>du <strong>lendemain.<br /></strong>Si passé ce délai, l'occasion de la manifester ne s'est pas présentée, la queue prend fin.</p>\n<p>Si elle entre en contradiction avec une autre queue, retirer.</p>","refoulement":1},"flags":{},"img":"garder_cailloux.webp","effects":[],"_id":"F8G3rdU1nfJzYwYR"}
|
{"name":"Idée fixe : Garder sur soi 3d6 kilos de cailloux","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"<p>Prend effet immédiatement et dure jusqu'à la <strong>fin de l'heure du Château Dormant </strong>du <strong>lendemain.<br /></strong>Si passé ce délai, l'occasion de la manifester ne s'est pas présentée, la queue prend fin.</p>\n<p>Si elle entre en contradiction avec une autre queue, retirer.</p>","refoulement":1},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/queues/idee_fixe.webp","effects":[],"_id":"F8G3rdU1nfJzYwYR"}
|
||||||
{"name":"Désir lancinant : Se faire raser la tête","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"<p>Tant que satisfaction n'est pas obtenue, aucun point d'expérience ne peut plus être gagné par l'exercice en cas de particulière et d'ajustement final négatif.<br />Les points d'expérience dus au stress ne sont pas affectés.</p>","refoulement":1},"flags":{},"img":"raser_tete.webp","effects":[],"_id":"HSNOvBR890dsEDw2"}
|
{"name":"Désir lancinant : Se faire raser la tête","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"<p>Tant que satisfaction n'est pas obtenue, aucun point d'expérience ne peut plus être gagné par l'exercice en cas de particulière et d'ajustement final négatif.<br />Les points d'expérience dus au stress ne sont pas affectés.</p>","refoulement":1},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/queues/desir_lancinant.webp","effects":[],"_id":"HSNOvBR890dsEDw2"}
|
||||||
{"name":"Idée fixe : Aller tout nu, sans porter le moindre paquet ni objet","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"<p>Prend effet immédiatement et dure jusqu'à la <strong>fin de l'heure du Château Dormant </strong>du <strong>lendemain.<br /></strong>Si passé ce délai, l'occasion de la manifester ne s'est pas présentée, la queue prend fin.</p>\n<p>Si elle entre en contradiction avec une autre queue, retirer.</p>","refoulement":1},"flags":{},"img":"aller_nu.webp","effects":[],"_id":"I0CtQ05xFW6ghcdP"}
|
{"name":"Idée fixe : Aller tout nu, sans porter le moindre paquet ni objet","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"<p>Prend effet immédiatement et dure jusqu'à la <strong>fin de l'heure du Château Dormant </strong>du <strong>lendemain.<br /></strong>Si passé ce délai, l'occasion de la manifester ne s'est pas présentée, la queue prend fin.</p>\n<p>Si elle entre en contradiction avec une autre queue, retirer.</p>","refoulement":1},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/queues/idee_fixe.webp","effects":[],"_id":"I0CtQ05xFW6ghcdP"}
|
||||||
{"name":"Idée fixe : Boulimie. Manger au moins un point de sust. par heure","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"<p>Prend effet immédiatement et dure jusqu'à la <strong>fin de l'heure du Château Dormant </strong>du <strong>lendemain.<br /></strong>Si passé ce délai, l'occasion de la manifester ne s'est pas présentée, la queue prend fin.</p>\n<p>Si elle entre en contradiction avec une autre queue, retirer.</p>","refoulement":1},"flags":{},"img":"boulimie.webp","effects":[],"_id":"JcTX8qMS0z8bmdVt"}
|
{"name":"Idée fixe : Boulimie. Manger au moins un point de sust. par heure","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"<p>Prend effet immédiatement et dure jusqu'à la <strong>fin de l'heure du Château Dormant </strong>du <strong>lendemain.<br /></strong>Si passé ce délai, l'occasion de la manifester ne s'est pas présentée, la queue prend fin.</p>\n<p>Si elle entre en contradiction avec une autre queue, retirer.</p>","refoulement":1},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/queues/idee_fixe.webp","effects":[],"_id":"JcTX8qMS0z8bmdVt"}
|
||||||
{"name":"Désir lancinant : Passer une nuit sur une échelle","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"<p>Tant que satisfaction n'est pas obtenue, aucun point d'expérience ne peut plus être gagné par l'exercice en cas de particulière et d'ajustement final négatif.<br />Les points d'expérience dus au stress ne sont pas affectés.</p>","refoulement":1},"flags":{},"img":"nuit_echelle.webp","effects":[],"_id":"LlELEB0FhymLx6VM"}
|
{"name":"Désir lancinant : Passer une nuit sur une échelle","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"<p>Tant que satisfaction n'est pas obtenue, aucun point d'expérience ne peut plus être gagné par l'exercice en cas de particulière et d'ajustement final négatif.<br />Les points d'expérience dus au stress ne sont pas affectés.</p>","refoulement":1},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/queues/desir_lancinant.webp","effects":[],"_id":"LlELEB0FhymLx6VM"}
|
||||||
{"name":"Idée fixe : Refuser de monter dans les TMR","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"<p>Prend effet immédiatement et dure jusqu'à la <strong>fin de l'heure du Château Dormant </strong>du <strong>lendemain.<br /></strong>Si passé ce délai, l'occasion de la manifester ne s'est pas présentée, la queue prend fin.</p>\n<p>Si elle entre en contradiction avec une autre queue, retirer.</p>","refoulement":1},"flags":{},"img":"refuser_tmr.webp","effects":[],"_id":"NpTDqICR7ZuToQrg"}
|
{"name":"Idée fixe : Refuser de monter dans les TMR","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"<p>Prend effet immédiatement et dure jusqu'à la <strong>fin de l'heure du Château Dormant </strong>du <strong>lendemain.<br /></strong>Si passé ce délai, l'occasion de la manifester ne s'est pas présentée, la queue prend fin.</p>\n<p>Si elle entre en contradiction avec une autre queue, retirer.</p>","refoulement":1},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/queues/idee_fixe.webp","effects":[],"_id":"NpTDqICR7ZuToQrg"}
|
||||||
{"name":"Désir lancinant : Masochisme. Perdre 3 points d’endurance minimum en 1 round","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"<p>Tant que satisfaction n'est pas obtenue, aucun point d'expérience ne peut plus être gagné par l'exercice en cas de particulière et d'ajustement final négatif.<br />Les points d'expérience dus au stress ne sont pas affectés.</p>","refoulement":1},"flags":{},"img":"masochisme.webp","effects":[],"_id":"NzJJNK0YMAbobu0p"}
|
{"name":"Désir lancinant : Masochisme. Perdre 3 points d’endurance minimum en 1 round","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"<p>Tant que satisfaction n'est pas obtenue, aucun point d'expérience ne peut plus être gagné par l'exercice en cas de particulière et d'ajustement final négatif.<br />Les points d'expérience dus au stress ne sont pas affectés.</p>","refoulement":1},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/queues/desir_lancinant.webp","effects":[],"_id":"NzJJNK0YMAbobu0p"}
|
||||||
{"name":"Désir lancinant : Casser 3d6 oeufs en les jetant à terre","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"<p>Tant que satisfaction n'est pas obtenue, aucun point d'expérience ne peut plus être gagné par l'exercice en cas de particulière et d'ajustement final négatif.<br />Les points d'expérience dus au stress ne sont pas affectés.</p>","refoulement":1},"flags":{},"img":"casser_oeufs.webp","effects":[],"_id":"OjG8XRbeYtq2jcgB"}
|
{"name":"Désir lancinant : Casser 3d6 oeufs en les jetant à terre","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"<p>Tant que satisfaction n'est pas obtenue, aucun point d'expérience ne peut plus être gagné par l'exercice en cas de particulière et d'ajustement final négatif.<br />Les points d'expérience dus au stress ne sont pas affectés.</p>","refoulement":1},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/queues/desir_lancinant.webp","effects":[],"_id":"OjG8XRbeYtq2jcgB"}
|
||||||
{"name":"Désir lancinant : Traire une vache","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"<p>Tant que satisfaction n'est pas obtenue, aucun point d'expérience ne peut plus être gagné par l'exercice en cas de particulière et d'ajustement final négatif.<br />Les points d'expérience dus au stress ne sont pas affectés.</p>","refoulement":1},"flags":{},"img":"traire_vache.webp","effects":[],"_id":"QHUOwjMR6AvepGPm"}
|
{"name":"Désir lancinant : Traire une vache","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"<p>Tant que satisfaction n'est pas obtenue, aucun point d'expérience ne peut plus être gagné par l'exercice en cas de particulière et d'ajustement final négatif.<br />Les points d'expérience dus au stress ne sont pas affectés.</p>","refoulement":1},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/queues/desir_lancinant.webp","effects":[],"_id":"QHUOwjMR6AvepGPm"}
|
||||||
{"name":"Désir lancinant : Pisser dans un violon (luth, mandoline, etc.)","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"<p>Tant que satisfaction n'est pas obtenue, aucun point d'expérience ne peut plus être gagné par l'exercice en cas de particulière et d'ajustement final négatif.<br />Les points d'expérience dus au stress ne sont pas affectés.</p>","refoulement":1},"flags":{},"img":"pisser_violon.webp","effects":[],"_id":"S8PVNgxb7TcFXq9g"}
|
{"name":"Désir lancinant : Pisser dans un violon (luth, mandoline, etc.)","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"<p>Tant que satisfaction n'est pas obtenue, aucun point d'expérience ne peut plus être gagné par l'exercice en cas de particulière et d'ajustement final négatif.<br />Les points d'expérience dus au stress ne sont pas affectés.</p>","refoulement":1},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/queues/desir_lancinant.webp","effects":[],"_id":"S8PVNgxb7TcFXq9g"}
|
||||||
{"name":"Désir lancinant : Manger du poisson","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"<p>Tant que satisfaction n'est pas obtenue, aucun point d'expérience ne peut plus être gagné par l'exercice en cas de particulière et d'ajustement final négatif.<br />Les points d'expérience dus au stress ne sont pas affectés.</p>","refoulement":1},"flags":{},"img":"manger_poisson.webp","effects":[],"_id":"SY0SsWtZdxSodMcl"}
|
{"name":"Désir lancinant : Manger du poisson","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"<p>Tant que satisfaction n'est pas obtenue, aucun point d'expérience ne peut plus être gagné par l'exercice en cas de particulière et d'ajustement final négatif.<br />Les points d'expérience dus au stress ne sont pas affectés.</p>","refoulement":1},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/queues/desir_lancinant.webp","effects":[],"_id":"SY0SsWtZdxSodMcl"}
|
||||||
{"name":"Idée fixe : Ne pas franchir de porte. (On peut franchir une fenêtre)","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"<p>Prend effet immédiatement et dure jusqu'à la <strong>fin de l'heure du Château Dormant </strong>du <strong>lendemain.<br /></strong>Si passé ce délai, l'occasion de la manifester ne s'est pas présentée, la queue prend fin.</p>\n<p>Si elle entre en contradiction avec une autre queue, retirer.</p>","refoulement":1},"flags":{},"img":"pas-franchir.webp","effects":[],"_id":"UUTbsktTcxsIe5L5"}
|
{"name":"Idée fixe : Ne pas franchir de porte. (On peut franchir une fenêtre)","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"<p>Prend effet immédiatement et dure jusqu'à la <strong>fin de l'heure du Château Dormant </strong>du <strong>lendemain.<br /></strong>Si passé ce délai, l'occasion de la manifester ne s'est pas présentée, la queue prend fin.</p>\n<p>Si elle entre en contradiction avec une autre queue, retirer.</p>","refoulement":1},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/queues/idee_fixe.webp","effects":[],"_id":"UUTbsktTcxsIe5L5"}
|
||||||
{"name":"Idée fixe : Refuser de se délester du moindre objet, ni donner ni prêter","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"<p>Prend effet immédiatement et dure jusqu'à la <strong>fin de l'heure du Château Dormant </strong>du <strong>lendemain.<br /></strong>Si passé ce délai, l'occasion de la manifester ne s'est pas présentée, la queue prend fin.</p>\n<p>Si elle entre en contradiction avec une autre queue, retirer.</p>","refoulement":1},"flags":{},"img":"refuser_delester.webp","effects":[],"_id":"VChJbtGFtWoiFNky"}
|
{"name":"Idée fixe : Refuser de se délester du moindre objet, ni donner ni prêter","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"<p>Prend effet immédiatement et dure jusqu'à la <strong>fin de l'heure du Château Dormant </strong>du <strong>lendemain.<br /></strong>Si passé ce délai, l'occasion de la manifester ne s'est pas présentée, la queue prend fin.</p>\n<p>Si elle entre en contradiction avec une autre queue, retirer.</p>","refoulement":1},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/queues/idee_fixe.webp","effects":[],"_id":"VChJbtGFtWoiFNky"}
|
||||||
{"name":"Idée fixe : Ne s’exprimer que par des cris d’animaux (meuh ! coin-coin ! etc.)","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"<p>Prend effet immédiatement et dure jusqu'à la <strong>fin de l'heure du Château Dormant </strong>du <strong>lendemain.<br /></strong>Si passé ce délai, l'occasion de la manifester ne s'est pas présentée, la queue prend fin.</p>\n<p>Si elle entre en contradiction avec une autre queue, retirer.</p>","refoulement":1},"flags":{},"img":"exprimer_cris.webp","effects":[],"_id":"YCHBbRLiMzTH7IBj"}
|
{"name":"Idée fixe : Ne s’exprimer que par des cris d’animaux (meuh ! coin-coin ! etc.)","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"<p>Prend effet immédiatement et dure jusqu'à la <strong>fin de l'heure du Château Dormant </strong>du <strong>lendemain.<br /></strong>Si passé ce délai, l'occasion de la manifester ne s'est pas présentée, la queue prend fin.</p>\n<p>Si elle entre en contradiction avec une autre queue, retirer.</p>","refoulement":1},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/queues/idee_fixe.webp","effects":[],"_id":"YCHBbRLiMzTH7IBj"}
|
||||||
{"name":"Idée fixe : Vider sur sa tête toute fiole ou flacon aperçu","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"<p>Prend effet immédiatement et dure jusqu'à la <strong>fin de l'heure du Château Dormant </strong>du <strong>lendemain.<br /></strong>Si passé ce délai, l'occasion de la manifester ne s'est pas présentée, la queue prend fin.</p>\n<p>Si elle entre en contradiction avec une autre queue, retirer.</p>","refoulement":1},"flags":{},"img":"verser_flacon.webp","effects":[],"_id":"afGp9CewfyJKecEE"}
|
{"name":"Idée fixe : Vider sur sa tête toute fiole ou flacon aperçu","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"<p>Prend effet immédiatement et dure jusqu'à la <strong>fin de l'heure du Château Dormant </strong>du <strong>lendemain.<br /></strong>Si passé ce délai, l'occasion de la manifester ne s'est pas présentée, la queue prend fin.</p>\n<p>Si elle entre en contradiction avec une autre queue, retirer.</p>","refoulement":1},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/queues/idee_fixe.webp","effects":[],"_id":"afGp9CewfyJKecEE"}
|
||||||
{"name":"Désir lancinant : Faire des bulles de savon","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"<p>Tant que satisfaction n'est pas obtenue, aucun point d'expérience ne peut plus être gagné par l'exercice en cas de particulière et d'ajustement final négatif.<br />Les points d'expérience dus au stress ne sont pas affectés.</p>","refoulement":1},"flags":{},"img":"bulles_savon.webp","effects":[],"_id":"df5oN8Ub3dWTVxNj"}
|
{"name":"Désir lancinant : Faire des bulles de savon","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"<p>Tant que satisfaction n'est pas obtenue, aucun point d'expérience ne peut plus être gagné par l'exercice en cas de particulière et d'ajustement final négatif.<br />Les points d'expérience dus au stress ne sont pas affectés.</p>","refoulement":1},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/queues/desir_lancinant.webp","effects":[],"_id":"df5oN8Ub3dWTVxNj"}
|
||||||
{"name":"Désir lancinant : Entendre braire un âne","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"<p>Tant que satisfaction n'est pas obtenue, aucun point d'expérience ne peut plus être gagné par l'exercice en cas de particulière et d'ajustement final négatif.<br />Les points d'expérience dus au stress ne sont pas affectés.</p>","refoulement":1},"flags":{},"img":"entendre_ane.webp","effects":[],"_id":"diCCimukdNM6bPub"}
|
{"name":"Désir lancinant : Entendre braire un âne","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"<p>Tant que satisfaction n'est pas obtenue, aucun point d'expérience ne peut plus être gagné par l'exercice en cas de particulière et d'ajustement final négatif.<br />Les points d'expérience dus au stress ne sont pas affectés.</p>","refoulement":1},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/queues/desir_lancinant.webp","effects":[],"_id":"diCCimukdNM6bPub"}
|
||||||
{"name":"Désir lancinant : Se rouler dans la boue","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"<p>Tant que satisfaction n'est pas obtenue, aucun point d'expérience ne peut plus être gagné par l'exercice en cas de particulière et d'ajustement final négatif.<br />Les points d'expérience dus au stress ne sont pas affectés.</p>","refoulement":1},"flags":{},"img":"se_rouler_boue.webp","effects":[],"_id":"el4lofhhSucMv5xv"}
|
{"name":"Désir lancinant : Se rouler dans la boue","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"<p>Tant que satisfaction n'est pas obtenue, aucun point d'expérience ne peut plus être gagné par l'exercice en cas de particulière et d'ajustement final négatif.<br />Les points d'expérience dus au stress ne sont pas affectés.</p>","refoulement":1},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/queues/desir_lancinant.webp","effects":[],"_id":"el4lofhhSucMv5xv"}
|
||||||
{"name":"Idée fixe : Ne dire que «non» ou négation analogue","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"<p>Prend effet immédiatement et dure jusqu'à la <strong>fin de l'heure du Château Dormant </strong>du <strong>lendemain.<br /></strong>Si passé ce délai, l'occasion de la manifester ne s'est pas présentée, la queue prend fin.</p>\n<p>Si elle entre en contradiction avec une autre queue, retirer.</p>","refoulement":1},"flags":{},"img":"dire_non.webp","effects":[],"_id":"gMmqdJ9I7Mt8Tg3f"}
|
{"name":"Idée fixe : Ne dire que «non» ou négation analogue","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"<p>Prend effet immédiatement et dure jusqu'à la <strong>fin de l'heure du Château Dormant </strong>du <strong>lendemain.<br /></strong>Si passé ce délai, l'occasion de la manifester ne s'est pas présentée, la queue prend fin.</p>\n<p>Si elle entre en contradiction avec une autre queue, retirer.</p>","refoulement":1},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/queues/idee_fixe.webp","effects":[],"_id":"gMmqdJ9I7Mt8Tg3f"}
|
||||||
{"name":"Désir lancinant : Manger des champignons","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"<p>Tant que satisfaction n'est pas obtenue, aucun point d'expérience ne peut plus être gagné par l'exercice en cas de particulière et d'ajustement final négatif.<br />Les points d'expérience dus au stress ne sont pas affectés.</p>","refoulement":1},"flags":{},"img":"manger_champignons.webp","effects":[],"_id":"gadh6aI5iCM82qpP"}
|
{"name":"Désir lancinant : Manger des champignons","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"<p>Tant que satisfaction n'est pas obtenue, aucun point d'expérience ne peut plus être gagné par l'exercice en cas de particulière et d'ajustement final négatif.<br />Les points d'expérience dus au stress ne sont pas affectés.</p>","refoulement":1},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/queues/desir_lancinant.webp","effects":[],"_id":"gadh6aI5iCM82qpP"}
|
||||||
{"name":"Idée fixe : Refuser de se déplacer autrement que porté","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"<p>Prend effet immédiatement et dure jusqu'à la <strong>fin de l'heure du Château Dormant </strong>du <strong>lendemain.<br /></strong>Si passé ce délai, l'occasion de la manifester ne s'est pas présentée, la queue prend fin.</p>\n<p>Si elle entre en contradiction avec une autre queue, retirer.</p>","refoulement":1},"flags":{},"img":"refuser_deplacer.webp","effects":[],"_id":"hghw6Cldrad1CIiJ"}
|
{"name":"Idée fixe : Refuser de se déplacer autrement que porté","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"<p>Prend effet immédiatement et dure jusqu'à la <strong>fin de l'heure du Château Dormant </strong>du <strong>lendemain.<br /></strong>Si passé ce délai, l'occasion de la manifester ne s'est pas présentée, la queue prend fin.</p>\n<p>Si elle entre en contradiction avec une autre queue, retirer.</p>","refoulement":1},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/queues/idee_fixe.webp","effects":[],"_id":"hghw6Cldrad1CIiJ"}
|
||||||
{"name":"Idée fixe : Garder une main sur la tête","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"<p>Prend effet immédiatement et dure jusqu'à la <strong>fin de l'heure du Château Dormant </strong>du <strong>lendemain.<br /></strong>Si passé ce délai, l'occasion de la manifester ne s'est pas présentée, la queue prend fin.</p>\n<p>Si elle entre en contradiction avec une autre queue, retirer.</p>","refoulement":1},"flags":{},"img":"garder_main.webp","effects":[],"_id":"iPYPgxL2uUnphStc"}
|
{"name":"Idée fixe : Garder une main sur la tête","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"<p>Prend effet immédiatement et dure jusqu'à la <strong>fin de l'heure du Château Dormant </strong>du <strong>lendemain.<br /></strong>Si passé ce délai, l'occasion de la manifester ne s'est pas présentée, la queue prend fin.</p>\n<p>Si elle entre en contradiction avec une autre queue, retirer.</p>","refoulement":1},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/queues/idee_fixe.webp","effects":[],"_id":"iPYPgxL2uUnphStc"}
|
||||||
{"name":"Idée fixe : Appeler les hommes «madame» et les femmes «messire»","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"<p>Prend effet immédiatement et dure jusqu'à la <strong>fin de l'heure du Château Dormant </strong>du <strong>lendemain.<br /></strong>Si passé ce délai, l'occasion de la manifester ne s'est pas présentée, la queue prend fin.</p>\n<p>Si elle entre en contradiction avec une autre queue, retirer.</p>","refoulement":1},"flags":{},"img":"appeler_hommes_femmes.webp","effects":[],"_id":"j2xIrFWYqhDM4TcN"}
|
{"name":"Idée fixe : Appeler les hommes «madame» et les femmes «messire»","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"<p>Prend effet immédiatement et dure jusqu'à la <strong>fin de l'heure du Château Dormant </strong>du <strong>lendemain.<br /></strong>Si passé ce délai, l'occasion de la manifester ne s'est pas présentée, la queue prend fin.</p>\n<p>Si elle entre en contradiction avec une autre queue, retirer.</p>","refoulement":1},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/queues/idee_fixe.webp","effects":[],"_id":"j2xIrFWYqhDM4TcN"}
|
||||||
{"name":"Désir lancinant : Se soûler (minimum pas frais)","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"<p>Tant que satisfaction n'est pas obtenue, aucun point d'expérience ne peut plus être gagné par l'exercice en cas de particulière et d'ajustement final négatif.<br />Les points d'expérience dus au stress ne sont pas affectés.</p>","refoulement":1},"flags":{},"img":"se_souler.webp","effects":[],"_id":"jShpKV8mVcqWmYvp"}
|
{"name":"Désir lancinant : Se soûler (minimum pas frais)","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"<p>Tant que satisfaction n'est pas obtenue, aucun point d'expérience ne peut plus être gagné par l'exercice en cas de particulière et d'ajustement final négatif.<br />Les points d'expérience dus au stress ne sont pas affectés.</p>","refoulement":1},"flags":{},""img":"systems/foundryvtt-reve-de-dragon/icons/queues/desir_lancinant.webp","effects":[],"_id":"jShpKV8mVcqWmYvp"}
|
||||||
{"name":"Désir lancinant : Construire une cabane","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"<p>Tant que satisfaction n'est pas obtenue, aucun point d'expérience ne peut plus être gagné par l'exercice en cas de particulière et d'ajustement final négatif.<br />Les points d'expérience dus au stress ne sont pas affectés.</p>","refoulement":1},"flags":{},"img":"construire_cabane.webp","effects":[],"_id":"mN0yghXkFfj2YctJ"}
|
{"name":"Désir lancinant : Construire une cabane","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"<p>Tant que satisfaction n'est pas obtenue, aucun point d'expérience ne peut plus être gagné par l'exercice en cas de particulière et d'ajustement final négatif.<br />Les points d'expérience dus au stress ne sont pas affectés.</p>","refoulement":1},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/queues/desir_lancinant.webp","effects":[],"_id":"mN0yghXkFfj2YctJ"}
|
||||||
{"name":"Désir lancinant : Embrasser un cochon sur le groin","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"<p>Tant que satisfaction n'est pas obtenue, aucun point d'expérience ne peut plus être gagné par l'exercice en cas de particulière et d'ajustement final négatif.<br />Les points d'expérience dus au stress ne sont pas affectés.</p>","refoulement":1},"flags":{},"img":"embrasser_cochon.webp","effects":[],"_id":"sjXBBr85OBk4Yg4t"}
|
{"name":"Désir lancinant : Embrasser un cochon sur le groin","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"<p>Tant que satisfaction n'est pas obtenue, aucun point d'expérience ne peut plus être gagné par l'exercice en cas de particulière et d'ajustement final négatif.<br />Les points d'expérience dus au stress ne sont pas affectés.</p>","refoulement":1},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/queues/desir_lancinant.webp","effects":[],"_id":"sjXBBr85OBk4Yg4t"}
|
||||||
{"name":"Idée fixe : Faire le mort","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"<p>Prend effet immédiatement et dure jusqu'à la <strong>fin de l'heure du Château Dormant </strong>du <strong>lendemain.<br /></strong>Si passé ce délai, l'occasion de la manifester ne s'est pas présentée, la queue prend fin.</p>\n<p>Si elle entre en contradiction avec une autre queue, retirer.</p>","refoulement":1},"flags":{},"img":"faire_mort.webp","effects":[],"_id":"xa4t9Lbt6uLEjap6"}
|
{"name":"Idée fixe : Faire le mort","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"<p>Prend effet immédiatement et dure jusqu'à la <strong>fin de l'heure du Château Dormant </strong>du <strong>lendemain.<br /></strong>Si passé ce délai, l'occasion de la manifester ne s'est pas présentée, la queue prend fin.</p>\n<p>Si elle entre en contradiction avec une autre queue, retirer.</p>","refoulement":1},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/queues/idee_fixe.webp","effects":[],"_id":"xa4t9Lbt6uLEjap6"}
|
||||||
|
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@ -23,7 +23,7 @@
|
|||||||
{"_id":"UQYy9WjsKqqrjLc7","name":"Guerrier Sorde","permission":{"default":0,"jOzRscDxoXZWpGS6":3},"type":"sort","data":{"description":"<p>@JournalEntry[vid6uJc66QFgHSUr]{Note sur les invocations de créatures}</p>\n<p>Le Guerrier Sorde a l’apparence d’un humanoïde entièrement revêtu d’une armure de plaques, visière du heaume toujours baissée, dissimulant son visage. Il est armé d’une épée sorde, d’un bouclier moyen et d’une dague. La seule tâche que l’on puisse lui demander est de faire usage de ses armes. Une fois invoqué, il attaque toute créature que le haut-rêvant lui désigne expressément, et se bat contre elle jusqu’à ce qu’il l’extermine ou reçoive un contre-ordre. On peut alors lui ordonner de commencer un autre combat, à condition que le délai entre deux combats n’excède pas 10 rounds, faute de quoi il considère sa tâche accomplie et se dématérialise. S’il est invoqué alors qu’il n’y a pas de créature à combattre immédiatement, il ne patiente que jusqu’à la fin de l’heure en cours, après quoi il s’estime dérangé pour rien et se dématérialise. Durant le délai, il peut accompagner le haut-rêvant où qu’il aille, mais sans pouvoir s’éloigner de lui de plus de E1 mètres. Sa vitesse est limitée à 12 m/round, il ne court, n’escalade ni ne nage jamais. Il n’obéit qu’au haut-rêvant qui l’a invoqué. Le rituel peut être répété pour invoquer plusieurs Guerriers Sordes dans un même combat. Tous ont les mêmes caractéristiques. La PERCEPTION indiquée tient compte des malus dus au heaume. Les Guerriers Sordes sont normalement affectés par les suggestions et illusions d’Hypnos, avec un JR standard r-8, ainsi que par les sorts individuels de Thananatos.</p>\n<p>@JournalEntry[R3q4vUTEfyxYgmGr]{Communication avec les créatures invoquées}</p>","draconic":"hypnos","duree":"Tâche","JR":"Aucun","cible":"","difficulte":"-8","portée":"","caseTMR":"special","caseTMRspeciale":"Cité Sordide D13","ptreve":"7","isrituel":true},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_hypnos.webp","effects":[]}
|
{"_id":"UQYy9WjsKqqrjLc7","name":"Guerrier Sorde","permission":{"default":0,"jOzRscDxoXZWpGS6":3},"type":"sort","data":{"description":"<p>@JournalEntry[vid6uJc66QFgHSUr]{Note sur les invocations de créatures}</p>\n<p>Le Guerrier Sorde a l’apparence d’un humanoïde entièrement revêtu d’une armure de plaques, visière du heaume toujours baissée, dissimulant son visage. Il est armé d’une épée sorde, d’un bouclier moyen et d’une dague. La seule tâche que l’on puisse lui demander est de faire usage de ses armes. Une fois invoqué, il attaque toute créature que le haut-rêvant lui désigne expressément, et se bat contre elle jusqu’à ce qu’il l’extermine ou reçoive un contre-ordre. On peut alors lui ordonner de commencer un autre combat, à condition que le délai entre deux combats n’excède pas 10 rounds, faute de quoi il considère sa tâche accomplie et se dématérialise. S’il est invoqué alors qu’il n’y a pas de créature à combattre immédiatement, il ne patiente que jusqu’à la fin de l’heure en cours, après quoi il s’estime dérangé pour rien et se dématérialise. Durant le délai, il peut accompagner le haut-rêvant où qu’il aille, mais sans pouvoir s’éloigner de lui de plus de E1 mètres. Sa vitesse est limitée à 12 m/round, il ne court, n’escalade ni ne nage jamais. Il n’obéit qu’au haut-rêvant qui l’a invoqué. Le rituel peut être répété pour invoquer plusieurs Guerriers Sordes dans un même combat. Tous ont les mêmes caractéristiques. La PERCEPTION indiquée tient compte des malus dus au heaume. Les Guerriers Sordes sont normalement affectés par les suggestions et illusions d’Hypnos, avec un JR standard r-8, ainsi que par les sorts individuels de Thananatos.</p>\n<p>@JournalEntry[R3q4vUTEfyxYgmGr]{Communication avec les créatures invoquées}</p>","draconic":"hypnos","duree":"Tâche","JR":"Aucun","cible":"","difficulte":"-8","portée":"","caseTMR":"special","caseTMRspeciale":"Cité Sordide D13","ptreve":"7","isrituel":true},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_hypnos.webp","effects":[]}
|
||||||
{"_id":"VG89vfk7KsO01eJv","name":"Secouriste blanc","permission":{"default":0,"jOzRscDxoXZWpGS6":3},"type":"sort","data":{"description":"<p>@JournalEntry[vid6uJc66QFgHSUr]{Note sur les invocations de créatures}</p>\n<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, premiers soins et soins complets, ce qu’il fait spontanément. En plein combat, il peut même s’approcher de la mêlée pour tirer en arrière d’éventuels tombés à terre. Quand il a plusieurs blessés à soigner, il commence par le plus proche de lui. Mais l’invocateur peut lui désigner un blessé à soigner en priorité.</p>\n<p>Le Secouriste possède son propre matériel de chirurgie, mais il n’a aucun consommable (eau, chiffons) qu’il faut lui fournir.</p>\n<p>Pour la résolution des soins, le Secouriste ne joue pas de jet de Chirurgie. À la place, c’est le blessé qui joue des jets de CHANCE, pour déterminer les points de tâche obtenus :</p>\n<table style=\"height: 102px; width: 260px;\" border=\"0\">\n<tbody>\n<tr style=\"height: 17px;\">\n<td style=\"height: 17px; width: 119px;\">Particulière :</td>\n<td style=\"height: 17px; width: 134px;\">4 points</td>\n</tr>\n<tr style=\"height: 17px;\">\n<td style=\"width: 119px; height: 17px;\">Significative :</td>\n<td style=\"width: 134px; height: 17px;\">3 points</td>\n</tr>\n<tr style=\"height: 17px;\">\n<td style=\"width: 119px; height: 17px;\">Normale :</td>\n<td style=\"width: 134px; height: 17px;\">2 points</td>\n</tr>\n<tr style=\"height: 17px;\">\n<td style=\"width: 119px; height: 17px;\">Échec :</td>\n<td style=\"width: 134px; height: 17px;\">1 pt</td>\n</tr>\n<tr style=\"height: 17px;\">\n<td style=\"width: 119px; height: 17px;\">Échec particulier :</td>\n<td style=\"width: 134px; height: 17px;\">0 pt</td>\n</tr>\n<tr style=\"height: 17px;\">\n<td style=\"width: 119px; height: 17px;\">Échec total :</td>\n<td style=\"width: 134px; height: 17px;\">0 pt (et sans malus)</td>\n</tr>\n</tbody>\n</table>\n<p>Le Secouriste disparaît dès que le combat est terminé ET que tous les blessés ont été soignés.</p>\n<p>@JournalEntry[R3q4vUTEfyxYgmGr]{Communication avec les créatures invoquées}</p>","draconic":"hypnos","duree":"Tâche ou fin HN","JR":"Aucun","cible":"","difficulte":"-8","portée":"","caseTMR":"special","caseTMRspeciale":"Sanctuaire Blanc G4","ptreve":"7","isrituel":true},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_hypnos.webp","effects":[]}
|
{"_id":"VG89vfk7KsO01eJv","name":"Secouriste blanc","permission":{"default":0,"jOzRscDxoXZWpGS6":3},"type":"sort","data":{"description":"<p>@JournalEntry[vid6uJc66QFgHSUr]{Note sur les invocations de créatures}</p>\n<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, premiers soins et soins complets, ce qu’il fait spontanément. En plein combat, il peut même s’approcher de la mêlée pour tirer en arrière d’éventuels tombés à terre. Quand il a plusieurs blessés à soigner, il commence par le plus proche de lui. Mais l’invocateur peut lui désigner un blessé à soigner en priorité.</p>\n<p>Le Secouriste possède son propre matériel de chirurgie, mais il n’a aucun consommable (eau, chiffons) qu’il faut lui fournir.</p>\n<p>Pour la résolution des soins, le Secouriste ne joue pas de jet de Chirurgie. À la place, c’est le blessé qui joue des jets de CHANCE, pour déterminer les points de tâche obtenus :</p>\n<table style=\"height: 102px; width: 260px;\" border=\"0\">\n<tbody>\n<tr style=\"height: 17px;\">\n<td style=\"height: 17px; width: 119px;\">Particulière :</td>\n<td style=\"height: 17px; width: 134px;\">4 points</td>\n</tr>\n<tr style=\"height: 17px;\">\n<td style=\"width: 119px; height: 17px;\">Significative :</td>\n<td style=\"width: 134px; height: 17px;\">3 points</td>\n</tr>\n<tr style=\"height: 17px;\">\n<td style=\"width: 119px; height: 17px;\">Normale :</td>\n<td style=\"width: 134px; height: 17px;\">2 points</td>\n</tr>\n<tr style=\"height: 17px;\">\n<td style=\"width: 119px; height: 17px;\">Échec :</td>\n<td style=\"width: 134px; height: 17px;\">1 pt</td>\n</tr>\n<tr style=\"height: 17px;\">\n<td style=\"width: 119px; height: 17px;\">Échec particulier :</td>\n<td style=\"width: 134px; height: 17px;\">0 pt</td>\n</tr>\n<tr style=\"height: 17px;\">\n<td style=\"width: 119px; height: 17px;\">Échec total :</td>\n<td style=\"width: 134px; height: 17px;\">0 pt (et sans malus)</td>\n</tr>\n</tbody>\n</table>\n<p>Le Secouriste disparaît dès que le combat est terminé ET que tous les blessés ont été soignés.</p>\n<p>@JournalEntry[R3q4vUTEfyxYgmGr]{Communication avec les créatures invoquées}</p>","draconic":"hypnos","duree":"Tâche ou fin HN","JR":"Aucun","cible":"","difficulte":"-8","portée":"","caseTMR":"special","caseTMRspeciale":"Sanctuaire Blanc G4","ptreve":"7","isrituel":true},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_hypnos.webp","effects":[]}
|
||||||
{"_id":"WvTkEYb216X0XiJc","name":"Voix d'Hypnos","permission":{"default":0,"jOzRscDxoXZWpGS6":3},"type":"sort","data":{"description":"<p>Les rituels de lecture d’Hypnos sont d’étonnantes démonstrations d’auto-suggestion. Aidé par un support, le haut-rêvant se persuade qu’il peut voir ou entendre à distance, et il le fait. Couplé à l’ultime forme d’illusion que sont les invocations, il peut pareillement projeter son image ou sa voix à distance. Tous obéissent aux règles usuelles d’application des rituels. Si un rituel de lecture est paramétré sur une personne et que celle-ci est morte ou a changé de rêve, aucun effet ne se produit, mais les points de rêve sont tout de même dépensés.</p>\n<p>Le rituel de Voix d’Hypnos permet de détecter le mensonge. Il n’y a pas de véritable ciblage, le rituel opère sur le haut-rêvant directement sans passer par un support. Lors du paramétrage, le haut-rêvant se reporte à une certaine conversation de son choix, datant au maximum de 12 heures. La conversation peut avoir eu plusieurs interlocuteurs, mais Voix d’Hypnos ne fonctionne que sur un seul d’entre eux à la fois.</p>\n<p>Pour les détecter tous, il faut recommencer autant de fois le rituel. Puis, le sort étant ciblé sur lui-même, le haut-rêvant se plonge dans un état hypnotique dans lequel il réentend toute la conversation, comme si on repassait la bande. La durée de réécoute est d’un round, quelle qu’ait été la conversation, le temps mental du haut-rêvant devenant élastique. Tant que son interlocuteur dit la vérité, sa voix est mélodieuse ; dès qu’il ment <em>volontairement</em>, elle devient horrible et grinçante. On ne peut ainsi détecter que les mensonges volontaires, pas les mensonges inconscients ou par omission.</p>","draconic":"hypnos","duree":"1 round","JR":"Aucun","cible":"Soi-même","difficulte":"-4","portée":"","caseTMR":"desert","caseTMRspeciale":"","ptreve":"4","isrituel":true},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_hypnos.webp","effects":[]}
|
{"_id":"WvTkEYb216X0XiJc","name":"Voix d'Hypnos","permission":{"default":0,"jOzRscDxoXZWpGS6":3},"type":"sort","data":{"description":"<p>Les rituels de lecture d’Hypnos sont d’étonnantes démonstrations d’auto-suggestion. Aidé par un support, le haut-rêvant se persuade qu’il peut voir ou entendre à distance, et il le fait. Couplé à l’ultime forme d’illusion que sont les invocations, il peut pareillement projeter son image ou sa voix à distance. Tous obéissent aux règles usuelles d’application des rituels. Si un rituel de lecture est paramétré sur une personne et que celle-ci est morte ou a changé de rêve, aucun effet ne se produit, mais les points de rêve sont tout de même dépensés.</p>\n<p>Le rituel de Voix d’Hypnos permet de détecter le mensonge. Il n’y a pas de véritable ciblage, le rituel opère sur le haut-rêvant directement sans passer par un support. Lors du paramétrage, le haut-rêvant se reporte à une certaine conversation de son choix, datant au maximum de 12 heures. La conversation peut avoir eu plusieurs interlocuteurs, mais Voix d’Hypnos ne fonctionne que sur un seul d’entre eux à la fois.</p>\n<p>Pour les détecter tous, il faut recommencer autant de fois le rituel. Puis, le sort étant ciblé sur lui-même, le haut-rêvant se plonge dans un état hypnotique dans lequel il réentend toute la conversation, comme si on repassait la bande. La durée de réécoute est d’un round, quelle qu’ait été la conversation, le temps mental du haut-rêvant devenant élastique. Tant que son interlocuteur dit la vérité, sa voix est mélodieuse ; dès qu’il ment <em>volontairement</em>, elle devient horrible et grinçante. On ne peut ainsi détecter que les mensonges volontaires, pas les mensonges inconscients ou par omission.</p>","draconic":"hypnos","duree":"1 round","JR":"Aucun","cible":"Soi-même","difficulte":"-4","portée":"","caseTMR":"desert","caseTMRspeciale":"","ptreve":"4","isrituel":true},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_hypnos.webp","effects":[]}
|
||||||
{"_id":"Y4r9kTN2brWC2N0n","name":"Lecture d'aura","type":"sort","img":"systems/foundryvtt-reve-de-dragon/icons/competence_vigilance.webp","data":{"description":"<p>Les rituels de Lecture d’Aura peuvent indifféremment être accomplis par n’importe laquelle des quatre voies.</p>\n<p>Ce rituel permet d’approfondir les informations fournies par Détection d’Aura. Pratiquer Lecture d’Aura quand il n’y a pas d’aura revient à demander une magie impossible et crée immédiatement une déchirure du rêve.</p>\n<p>Lecture d’Aura est effectuée en plusieurs étapes, toutes étant de difficulté R-3 et coûtant 3 points de rêve. La première a toujours lieu dans un sanctuaire et ne fait que révéler dans quel(s) autre(s) genre(s) de case(s) le haut-rêvant doit se rendre pour continuer sa lecture. Là, il apprend quel genre de magie a été produit ou à quel type de rêve il a affaire, de même que les cases spécifiques concernées. Enfin dans les cases spécifiques, le haut-rêvant peut apprendre la force du rêve ou de la magie en cours, c’est-à-dire pratiquement la difficulté et le nombre de points de rêve impliqués, information indispensable dans l’optique d’une annulation de magie.</p>\n<p>Lecture d’Aura révèle également la couleur de l’aura (fixe ou pulsative) comme Détection d’Aura. Pour les créatures vivantes, on peut donc sauter l’étape de Détection d’Aura et commencer directement par la lecture, puisqu’on est sûr de trouver une aura. Dans les autres cas, il est plus prudent de commencer par la détection si, en l’absence finale d’une aura, on ne veut pas créer de magie impossible. Effectuée sur une créature non soumise à un effet magique ni sous l’emprise d’une entité, Lecture d’Aura indique toujours le Fleuve. Là, dans n’importe quelle case du Fleuve, le haut-rêvant se contente d’apprendre qu’il a affaire à une créature vivante et douée de rêve.</p>","descriptionmj":"","draconic":"oniros","duree":"Instantanée","JR":"Aucun","cible":"","difficulte":"-3","portée":"","caseTMR":"special","caseTMRspeciale":"Sanctuaire / variable","ptreve":"3","xp":0,"bonuscase":"","isrituel":true,"coutseuil":0,"portee":""},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"Q2G6GTdrotKzYGUC":3},"flags":{}}
|
{"_id":"Y4r9kTN2brWC2N0n","name":"Lecture d'aura","permission":{"default":0,"Q2G6GTdrotKzYGUC":3},"type":"sort","data":{"description":"<p>Les rituels de Lecture d’Aura peuvent indifféremment être accomplis par n’importe laquelle des quatre voies.</p>\n<p>Ce rituel permet d’approfondir les informations fournies par Détection d’Aura. Pratiquer Lecture d’Aura quand il n’y a pas d’aura revient à demander une magie impossible et crée immédiatement une déchirure du rêve.</p>\n<p>Lecture d’Aura est effectuée en plusieurs étapes, toutes étant de difficulté R-3 et coûtant 3 points de rêve. La première a toujours lieu dans un sanctuaire et ne fait que révéler dans quel(s) autre(s) genre(s) de case(s) le haut-rêvant doit se rendre pour continuer sa lecture. Là, il apprend quel genre de magie a été produit ou à quel type de rêve il a affaire, de même que les cases spécifiques concernées. Enfin dans les cases spécifiques, le haut-rêvant peut apprendre la force du rêve ou de la magie en cours, c’est-à-dire pratiquement la difficulté et le nombre de points de rêve impliqués, information indispensable dans l’optique d’une annulation de magie.</p>\n<p>Lecture d’Aura révèle également la couleur de l’aura (fixe ou pulsative) comme Détection d’Aura. Pour les créatures vivantes, on peut donc sauter l’étape de Détection d’Aura et commencer directement par la lecture, puisqu’on est sûr de trouver une aura. Dans les autres cas, il est plus prudent de commencer par la détection si, en l’absence finale d’une aura, on ne veut pas créer de magie impossible. Effectuée sur une créature non soumise à un effet magique ni sous l’emprise d’une entité, Lecture d’Aura indique toujours le Fleuve. Là, dans n’importe quelle case du Fleuve, le haut-rêvant se contente d’apprendre qu’il a affaire à une créature vivante et douée de rêve.</p>","draconic":"oniros","duree":"Instantanée","JR":"Aucun","cible":"","difficulte":"-3","portée":"","caseTMR":"special","caseTMRspeciale":"Sanctuaire / variable","ptreve":"3","xp":0},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_vigilance.webp","effects":[]}
|
||||||
{"_id":"YOJsOLpHTQYreZ6i","name":"Soufflet","type":"sort","img":"systems/foundryvtt-reve-de-dragon/icons/competence_hypnos.webp","data":{"description":"<p>Le Soufflet peut être dirigé contre toute créature, humanoïde ou animale. Son effet, instantané, est celui d’une gifle magistrale, causant ses dommages sur la table des Coups non mortels. Le +dom de l’agression est égal au nombre de points de rêve dépensés. Sauf pour les animaux qui peuvent faire jouer entièrement leur protection naturelle, la protection applicable peut être au maximum de 2 points.</p>","descriptionmj":"","draconic":"hypnos","duree":"Instantanée","JR":"Humanoïde selon HN, animal r-8","cible":"Toutes créatures","difficulte":"-6","portée":"","caseTMR":"gouffre","caseTMRspeciale":"","ptreve":"1+","xp":0,"bonuscase":"","isrituel":false,"coutseuil":0,"portee":""},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"jOzRscDxoXZWpGS6":3},"flags":{}}
|
{"_id":"YOJsOLpHTQYreZ6i","name":"Soufflet","type":"sort","img":"systems/foundryvtt-reve-de-dragon/icons/competence_hypnos.webp","data":{"description":"<p>Le Soufflet peut être dirigé contre toute créature, humanoïde ou animale. Son effet, instantané, est celui d’une gifle magistrale, causant ses dommages sur la table des Coups non mortels. Le +dom de l’agression est égal au nombre de points de rêve dépensés. Sauf pour les animaux qui peuvent faire jouer entièrement leur protection naturelle, la protection applicable peut être au maximum de 2 points.</p>","descriptionmj":"","draconic":"hypnos","duree":"Instantanée","JR":"Humanoïde selon HN, animal r-8","cible":"Toutes créatures","difficulte":"-6","portée":"","caseTMR":"gouffre","caseTMRspeciale":"","ptreve":"1+","xp":0,"bonuscase":"","isrituel":false,"coutseuil":0,"portee":""},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"jOzRscDxoXZWpGS6":3},"flags":{}}
|
||||||
{"_id":"aYOfXEuDp6xGDO4N","name":"Égarement","permission":{"default":0,"jOzRscDxoXZWpGS6":3},"type":"sort","data":{"description":"<p>L’effet d’Égarement ne s’applique qu’aux humanoïdes. L’apport massif de pseudo-souvenirs, informulés et insaisissables, empêche l’humanoïde visé de se concentrer sur son activité intellectuelle, manuelle ou verbale. Il ne fait plus ou ne dit plus que des <em>bêtises</em>, en termes de jeu des échecs totaux. Un intellectuel devient incapable de lire ou d’écrire, un artisan se tape sur les doigts, un musicien rate tous ses accords, un orateur bafouille, etc. L’état d’égarement dure jusqu’à la fin de l’heure en cours + une heure complète, ou se dissipe de lui-même dès qu’il y a stress, par exemple une agression. Ce sort est donc totalement inutile et inefficace en combat.</p>","draconic":"hypnos","duree":"Une heure","JR":"Selon HN","cible":"Humanoïde","difficulte":"-4","portée":"","caseTMR":"desolation","caseTMRspeciale":"","ptreve":"4"},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_hypnos.webp","effects":[]}
|
{"_id":"aYOfXEuDp6xGDO4N","name":"Égarement","permission":{"default":0,"jOzRscDxoXZWpGS6":3},"type":"sort","data":{"description":"<p>L’effet d’Égarement ne s’applique qu’aux humanoïdes. L’apport massif de pseudo-souvenirs, informulés et insaisissables, empêche l’humanoïde visé de se concentrer sur son activité intellectuelle, manuelle ou verbale. Il ne fait plus ou ne dit plus que des <em>bêtises</em>, en termes de jeu des échecs totaux. Un intellectuel devient incapable de lire ou d’écrire, un artisan se tape sur les doigts, un musicien rate tous ses accords, un orateur bafouille, etc. L’état d’égarement dure jusqu’à la fin de l’heure en cours + une heure complète, ou se dissipe de lui-même dès qu’il y a stress, par exemple une agression. Ce sort est donc totalement inutile et inefficace en combat.</p>","draconic":"hypnos","duree":"Une heure","JR":"Selon HN","cible":"Humanoïde","difficulte":"-4","portée":"","caseTMR":"desolation","caseTMRspeciale":"","ptreve":"4"},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_hypnos.webp","effects":[]}
|
||||||
{"_id":"cghxHRstw7cXLEm4","name":"Invoquer son image","type":"sort","img":"systems/foundryvtt-reve-de-dragon/icons/competence_hypnos.webp","data":{"description":"<p>Les rituels de lecture d’Hypnos sont d’étonnantes démonstrations d’auto-suggestion. Aidé par un support, le haut-rêvant se persuade qu’il peut voir ou entendre à distance, et il le fait. Couplé à l’ultime forme d’illusion que sont les invocations, il peut pareillement projeter son image ou sa voix à distance. Tous obéissent aux règles usuelles d’application des rituels. Si un rituel de lecture est paramétré sur une personne et que celle-ci est morte ou a changé de rêve, aucun effet ne se produit, mais les points de rêve sont tout de même dépensés.</p>\n<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 les mêmes. Lorsqu’un mouvement apparaît au centre du miroir, provoquant l’état hypnotique, le haut-rêvant peut commencer à effectuer des gestes, des mimiques, ou montrer ostensiblement un objet qu’il tient sur lui, mais sans pouvoir se déplacer. Dans l’instant même, un hologramme de lui-même, grandeur nature et fidèle jusqu’au moindre geste, prend naissance près de la personne ou au centre du lieu choisi.</p>\n<p>Les spectateurs peuvent se déplacer à travers l’hologramme, ce n’est qu’une illusion sans substance. Par ce rituel, le haut-rêvant ne peut communiquer aucun son, et lui-même n’entend ni ne voit rien. Il ne peut pas savoir comment est accueillie sa \"visite\". La communication est de 1 round par point de rêve dépensé.</p>","descriptionmj":"","draconic":"hypnos","duree":"Selon r dépensé","JR":"Aucun","cible":"Un miroir","difficulte":"-6","portée":"","caseTMR":"sanctuaire","caseTMRspeciale":"","ptreve":"1+","xp":0,"bonuscase":"","isrituel":true,"coutseuil":0,"portee":""},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"jOzRscDxoXZWpGS6":3},"flags":{}}
|
{"_id":"cghxHRstw7cXLEm4","name":"Invoquer son image","type":"sort","img":"systems/foundryvtt-reve-de-dragon/icons/competence_hypnos.webp","data":{"description":"<p>Les rituels de lecture d’Hypnos sont d’étonnantes démonstrations d’auto-suggestion. Aidé par un support, le haut-rêvant se persuade qu’il peut voir ou entendre à distance, et il le fait. Couplé à l’ultime forme d’illusion que sont les invocations, il peut pareillement projeter son image ou sa voix à distance. Tous obéissent aux règles usuelles d’application des rituels. Si un rituel de lecture est paramétré sur une personne et que celle-ci est morte ou a changé de rêve, aucun effet ne se produit, mais les points de rêve sont tout de même dépensés.</p>\n<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 les mêmes. Lorsqu’un mouvement apparaît au centre du miroir, provoquant l’état hypnotique, le haut-rêvant peut commencer à effectuer des gestes, des mimiques, ou montrer ostensiblement un objet qu’il tient sur lui, mais sans pouvoir se déplacer. Dans l’instant même, un hologramme de lui-même, grandeur nature et fidèle jusqu’au moindre geste, prend naissance près de la personne ou au centre du lieu choisi.</p>\n<p>Les spectateurs peuvent se déplacer à travers l’hologramme, ce n’est qu’une illusion sans substance. Par ce rituel, le haut-rêvant ne peut communiquer aucun son, et lui-même n’entend ni ne voit rien. Il ne peut pas savoir comment est accueillie sa \"visite\". La communication est de 1 round par point de rêve dépensé.</p>","descriptionmj":"","draconic":"hypnos","duree":"Selon r dépensé","JR":"Aucun","cible":"Un miroir","difficulte":"-6","portée":"","caseTMR":"sanctuaire","caseTMRspeciale":"","ptreve":"1+","xp":0,"bonuscase":"","isrituel":true,"coutseuil":0,"portee":""},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"jOzRscDxoXZWpGS6":3},"flags":{}}
|
||||||
@ -39,7 +39,7 @@
|
|||||||
{"_id":"qqcLydulFkL25Ipc","name":"Conjurer l'oubli","permission":{"default":0,"jOzRscDxoXZWpGS6":3},"type":"sort","data":{"description":"<p>Ce rituel permet de faire renaître chez la cible un souvenir oublié, la cause de l’oubli pouvant être magique ou naturelle. Le souvenir oublié peut appartenir à une précédente incarnation si le gardien des rêves l’estime possible ou pertinent. Dans tous les cas, le souvenir ne peut revenir que sous la forme d’une <em>réponse </em>à une <em>question </em>précise. Et l’accomplissement du rituel ne permet qu’une seule question-réponse.</p>","draconic":"hypnos","duree":"Une question","JR":"Aucun","cible":"Humanoïde","difficulte":"-4","portée":"","caseTMR":"lac","caseTMRspeciale":"","ptreve":"4","isrituel":true},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_hypnos.webp","effects":[]}
|
{"_id":"qqcLydulFkL25Ipc","name":"Conjurer l'oubli","permission":{"default":0,"jOzRscDxoXZWpGS6":3},"type":"sort","data":{"description":"<p>Ce rituel permet de faire renaître chez la cible un souvenir oublié, la cause de l’oubli pouvant être magique ou naturelle. Le souvenir oublié peut appartenir à une précédente incarnation si le gardien des rêves l’estime possible ou pertinent. Dans tous les cas, le souvenir ne peut revenir que sous la forme d’une <em>réponse </em>à une <em>question </em>précise. Et l’accomplissement du rituel ne permet qu’une seule question-réponse.</p>","draconic":"hypnos","duree":"Une question","JR":"Aucun","cible":"Humanoïde","difficulte":"-4","portée":"","caseTMR":"lac","caseTMRspeciale":"","ptreve":"4","isrituel":true},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_hypnos.webp","effects":[]}
|
||||||
{"_id":"rrSE9c7KKsqcKueo","name":"Nonechalepasse","permission":{"default":0,"jOzRscDxoXZWpGS6":3},"type":"sort","data":{"description":"<p>@JournalEntry[vid6uJc66QFgHSUr]{Note sur les invocations de créatures}</p>\n<p>Le Nonechalepasse a la même apparence physique et le même armement que le Guerrier Sorde. C’est en fait une variante de ce dernier. Il est invoqué pour garder ou veiller sur quelque chose : une porte, un coffre, un pont, etc. L’ayant invoqué, le haut-rêvant doit lui indiquer expressément sur quoi il doit veiller, et le Nonechalepasse ne laissera personne d’autre que l’invocateur franchir la limite indiquée, c’est-à-dire pas même ses compagnons. La garde peut avoir lieu en la présence du haut-rêvant, ou en son absence s’il désire vaquer à d’autres affaires, et dure jusqu’à la fin de son heure de naissance. Dès qu’une créature est en voie d’enfreindre la consigne donnée, le Nonechalepasse l’en prévient en clamant son propre nom à plusieurs reprises ; et si la créature insiste, il la combat jusqu’à ce qu’il l’extermine ou qu’elle recule et s’enfuie. Les Nonechalepasses ont tous les mêmes caractéristiques que les Guerriers Sordes et sont comme eux affectés par les sorts.</p>\n<p>@JournalEntry[R3q4vUTEfyxYgmGr]{Communication avec les créatures invoquées}</p>","draconic":"hypnos","duree":"Tâche","JR":"Aucun","cible":"","difficulte":"-8","portée":"","caseTMR":"special","caseTMRspeciale":"Cité Jalouse M1","ptreve":"7","isrituel":true},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_hypnos.webp","effects":[]}
|
{"_id":"rrSE9c7KKsqcKueo","name":"Nonechalepasse","permission":{"default":0,"jOzRscDxoXZWpGS6":3},"type":"sort","data":{"description":"<p>@JournalEntry[vid6uJc66QFgHSUr]{Note sur les invocations de créatures}</p>\n<p>Le Nonechalepasse a la même apparence physique et le même armement que le Guerrier Sorde. C’est en fait une variante de ce dernier. Il est invoqué pour garder ou veiller sur quelque chose : une porte, un coffre, un pont, etc. L’ayant invoqué, le haut-rêvant doit lui indiquer expressément sur quoi il doit veiller, et le Nonechalepasse ne laissera personne d’autre que l’invocateur franchir la limite indiquée, c’est-à-dire pas même ses compagnons. La garde peut avoir lieu en la présence du haut-rêvant, ou en son absence s’il désire vaquer à d’autres affaires, et dure jusqu’à la fin de son heure de naissance. Dès qu’une créature est en voie d’enfreindre la consigne donnée, le Nonechalepasse l’en prévient en clamant son propre nom à plusieurs reprises ; et si la créature insiste, il la combat jusqu’à ce qu’il l’extermine ou qu’elle recule et s’enfuie. Les Nonechalepasses ont tous les mêmes caractéristiques que les Guerriers Sordes et sont comme eux affectés par les sorts.</p>\n<p>@JournalEntry[R3q4vUTEfyxYgmGr]{Communication avec les créatures invoquées}</p>","draconic":"hypnos","duree":"Tâche","JR":"Aucun","cible":"","difficulte":"-8","portée":"","caseTMR":"special","caseTMRspeciale":"Cité Jalouse M1","ptreve":"7","isrituel":true},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_hypnos.webp","effects":[]}
|
||||||
{"_id":"sVA94h9Reimmfw5B","name":"Suggestion","type":"sort","img":"systems/foundryvtt-reve-de-dragon/icons/competence_hypnos.webp","data":{"description":"<p>L’effet de Suggestion ne s’applique qu’aux humanoïdes. Comme l’indique le titre, c’est la suggestion à l’état pur. Il permet de donner un ordre bref à la victime, et cette dernière ne pourra pas s’empêcher d’y obéir machinalement. Il est impératif que la victime puisse obéir à l’ordre de façon <em>immédiate</em>, dans la seconde qui suit l’ordre, et que l’action soit uniquement <em>physique</em>, ni mentale ni réfléchie. Si la Suggestion est telle qu’elle oblige la victime à une autre action préalable ou si l’action demandée ne peut être qu’une action réfléchie, pensée, la Suggestion avorte automatiquement.</p>\n<p>Un passant a sa bourse accrochée à la ceinture. On lui donne l’ordre de suggestion : \"donne ta bourse !\" L’effet avorte automatiquement. En effet, le passant doit d’abord en dénouer les cordons, action préalable, et qui plus est réfléchie. Si le passant avait déjà sa bourse à la main, l’ordre : \"donne ta bourse !\" ou \"donne\"! tout court, pouvant être obéi de façon <em>immédiate</em>, aurait été accepté.</p>\n<p>Des ordres tels que \"réponds à la question \" ou \" dis la vérité\" sont pareillement inacceptables (actions mentales). Si la victime est au bord d’un gouffre, et qu’on lui suggère : \" saute dans le gouffre !\", elle saute. Si elle est à trois mètres du gouffre, la suggestion avorte. Il faut d’abord qu’elle y coure. Des ordres tels que : \"Fuis, saute, plonge, assieds-toi, agenouille-toi, lève les bras, ferme les yeux, hurle, donne (ce que la victime a déjà en main), mange ou bois (ce que la victime a déjà à portée de ses lèvres), lâche (ce qu’elle tient en main), etc.\" sont possibles. Des ordres tels que : \"endors-toi, suicide-toi, va faire ceci, déshabille-toi (actions multiples), écris ceci, avoue, lance tel sort, etc.\" sont impossibles.</p>\n<p>L’ordre donné dans la suggestion doit être unique, c’est-à-dire pratiquement ne comporter qu’un seul verbe. \"Cours et saute !\" est impossible. Quand l’action implique une durée, elle est obéie pendant un round. Si par exemple l’ordre donné est \"cours !\" ou \"fuis !\", la victime courra, fuira, pendant un round. À ce moment, toutefois, l’ordre pourra être donné une seconde fois, et la victime obéira pour la durée d’un nouveau round.</p>\n<p>L’ordre contenu dans la suggestion doit être paramétré lors du lancer. Mais le ciblage de la victime ne le déclenche pas aussitôt. La victime étant maintenant sous l’effet du sort, il faut que l’ordre soit donné réellement, <em>verbalement</em>. La victime doit pouvoir l’entendre et le comprendre (parler la même langue). Peu importe qui donne l’ordre verbal, le haut-rêvant ou quelqu’un d’autre. Chaque 3r dépensés permet verbalement de réitérer l’ordre une fois. Si par exemple 9 points de rêve ont été dépensés, l’ordre \"cours !\" pourra être donné trois fois. Il n’y a aucune limite de temps entre le ciblage et le moment où le premier ordre est donné verbalement, ni non plus entre chaque ordre. Tant que le dernier ordre n’a pas été donné, la victime est sous l’influence du sort, influence qui peut être détectée et lue par Lecture d’Aura. Le libellé de l’ordre est également révélé dans la case spécifique par Lecture d’Aura, et le sort peut être annulé dans cette même case. Dès que le dernier ordre est donné, l’effet se dissipe totalement.</p>","descriptionmj":"","draconic":"hypnos","duree":"Spéciale","JR":"Selon HN","cible":"Humanoïde","difficulte":"-9","portée":"","caseTMR":"desert","caseTMRspeciale":"","ptreve":"3+","xp":0,"bonuscase":"","isrituel":false,"coutseuil":0,"portee":""},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"jOzRscDxoXZWpGS6":3},"flags":{}}
|
{"_id":"sVA94h9Reimmfw5B","name":"Suggestion","type":"sort","img":"systems/foundryvtt-reve-de-dragon/icons/competence_hypnos.webp","data":{"description":"<p>L’effet de Suggestion ne s’applique qu’aux humanoïdes. Comme l’indique le titre, c’est la suggestion à l’état pur. Il permet de donner un ordre bref à la victime, et cette dernière ne pourra pas s’empêcher d’y obéir machinalement. Il est impératif que la victime puisse obéir à l’ordre de façon <em>immédiate</em>, dans la seconde qui suit l’ordre, et que l’action soit uniquement <em>physique</em>, ni mentale ni réfléchie. Si la Suggestion est telle qu’elle oblige la victime à une autre action préalable ou si l’action demandée ne peut être qu’une action réfléchie, pensée, la Suggestion avorte automatiquement.</p>\n<p>Un passant a sa bourse accrochée à la ceinture. On lui donne l’ordre de suggestion : \"donne ta bourse !\" L’effet avorte automatiquement. En effet, le passant doit d’abord en dénouer les cordons, action préalable, et qui plus est réfléchie. Si le passant avait déjà sa bourse à la main, l’ordre : \"donne ta bourse !\" ou \"donne\"! tout court, pouvant être obéi de façon <em>immédiate</em>, aurait été accepté.</p>\n<p>Des ordres tels que \"réponds à la question \" ou \" dis la vérité\" sont pareillement inacceptables (actions mentales). Si la victime est au bord d’un gouffre, et qu’on lui suggère : \" saute dans le gouffre !\", elle saute. Si elle est à trois mètres du gouffre, la suggestion avorte. Il faut d’abord qu’elle y coure. Des ordres tels que : \"Fuis, saute, plonge, assieds-toi, agenouille-toi, lève les bras, ferme les yeux, hurle, donne (ce que la victime a déjà en main), mange ou bois (ce que la victime a déjà à portée de ses lèvres), lâche (ce qu’elle tient en main), etc.\" sont possibles. Des ordres tels que : \"endors-toi, suicide-toi, va faire ceci, déshabille-toi (actions multiples), écris ceci, avoue, lance tel sort, etc.\" sont impossibles.</p>\n<p>L’ordre donné dans la suggestion doit être unique, c’est-à-dire pratiquement ne comporter qu’un seul verbe. \"Cours et saute !\" est impossible. Quand l’action implique une durée, elle est obéie pendant un round. Si par exemple l’ordre donné est \"cours !\" ou \"fuis !\", la victime courra, fuira, pendant un round. À ce moment, toutefois, l’ordre pourra être donné une seconde fois, et la victime obéira pour la durée d’un nouveau round.</p>\n<p>L’ordre contenu dans la suggestion doit être paramétré lors du lancer. Mais le ciblage de la victime ne le déclenche pas aussitôt. La victime étant maintenant sous l’effet du sort, il faut que l’ordre soit donné réellement, <em>verbalement</em>. La victime doit pouvoir l’entendre et le comprendre (parler la même langue). Peu importe qui donne l’ordre verbal, le haut-rêvant ou quelqu’un d’autre. Chaque 3r dépensés permet verbalement de réitérer l’ordre une fois. Si par exemple 9 points de rêve ont été dépensés, l’ordre \"cours !\" pourra être donné trois fois. Il n’y a aucune limite de temps entre le ciblage et le moment où le premier ordre est donné verbalement, ni non plus entre chaque ordre. Tant que le dernier ordre n’a pas été donné, la victime est sous l’influence du sort, influence qui peut être détectée et lue par Lecture d’Aura. Le libellé de l’ordre est également révélé dans la case spécifique par Lecture d’Aura, et le sort peut être annulé dans cette même case. Dès que le dernier ordre est donné, l’effet se dissipe totalement.</p>","descriptionmj":"","draconic":"hypnos","duree":"Spéciale","JR":"Selon HN","cible":"Humanoïde","difficulte":"-9","portée":"","caseTMR":"desert","caseTMRspeciale":"","ptreve":"3+","xp":0,"bonuscase":"","isrituel":false,"coutseuil":0,"portee":""},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"jOzRscDxoXZWpGS6":3},"flags":{}}
|
||||||
{"_id":"xOicgRMCUxJNmVzF","name":"Détection d'aura","type":"sort","img":"systems/foundryvtt-reve-de-dragon/icons/competence_vigilance.webp","data":{"description":"<p>Les rituels de Détection d’Aura peuvent indifféremment être accomplis par n’importe laquelle des quatre voies.</p>\n<p>Toutes les créatures vivantes animées (humains, humanoïdes, animaux) ont une caractéristique RÊVE. Les objets enchantés possèdent des points de rêve, de même que les produits de magie naturelle, comme certaines pierres de chance. Les entités de cauchemar, incarnées ou non, en ont également. Quelle qu’elle soit, la présence de rêve émet une aura, laquelle est détectable par Détection d’Aura. Parallèlement, toute cible d’un sort ou d’un rituel, émet une aura propre, quand bien même ladite cible ne possède pas de points de rêve (centre de zone, objet ou plante soumis à une illusion d’Hypnos). Cette aura est également détectable par Détection d’Aura.</p>\n<p>L’aura de présence de rêve se traduit par un halo bleuté constant ; l’aura résultant d’un effet magique par un halo parcouru de pulsations. Quand les deux auras sont présentes conjointement, le halo est pulsatif et d’un bleu plus foncé. On peut toujours effectuer Détection d’Aura sans aucun risque, il y a toujours une réponse. Soit une aura est perçue, constante ou pulsative, et l’on peut tenter une Lecture d’Aura pour en savoir plus ; soit aucune aura n’est perçue et il s’agit de matière inerte, sans rêve, non soumise à un sort.</p>","descriptionmj":"","draconic":"oniros","duree":"Instantanée","JR":"Aucun","cible":"","difficulte":"-3","portée":"","caseTMR":"sanctuaire","caseTMRspeciale":"","ptreve":"1","xp":0,"bonuscase":"","isrituel":true,"coutseuil":0,"portee":""},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"Q2G6GTdrotKzYGUC":3},"flags":{}}
|
{"_id":"xOicgRMCUxJNmVzF","name":"Détection d'aura","permission":{"default":0,"Q2G6GTdrotKzYGUC":3},"type":"sort","data":{"description":"<p>Les rituels de Détection d’Aura peuvent indifféremment être accomplis par n’importe laquelle des quatre voies.</p>\n<p>Toutes les créatures vivantes animées (humains, humanoïdes, animaux) ont une caractéristique RÊVE. Les objets enchantés possèdent des points de rêve, de même que les produits de magie naturelle, comme certaines pierres de chance. Les entités de cauchemar, incarnées ou non, en ont également. Quelle qu’elle soit, la présence de rêve émet une aura, laquelle est détectable par Détection d’Aura. Parallèlement, toute cible d’un sort ou d’un rituel, émet une aura propre, quand bien même ladite cible ne possède pas de points de rêve (centre de zone, objet ou plante soumis à une illusion d’Hypnos). Cette aura est également détectable par Détection d’Aura.</p>\n<p>L’aura de présence de rêve se traduit par un halo bleuté constant ; l’aura résultant d’un effet magique par un halo parcouru de pulsations. Quand les deux auras sont présentes conjointement, le halo est pulsatif et d’un bleu plus foncé. On peut toujours effectuer Détection d’Aura sans aucun risque, il y a toujours une réponse. Soit une aura est perçue, constante ou pulsative, et l’on peut tenter une Lecture d’Aura pour en savoir plus ; soit aucune aura n’est perçue et il s’agit de matière inerte, sans rêve, non soumise à un sort.</p>","draconic":"oniros","duree":"Instantanée","JR":"Aucun","cible":"","difficulte":"-3","portée":"","caseTMR":"sanctuaire","caseTMRspeciale":"","ptreve":"1","xp":0},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_vigilance.webp","effects":[]}
|
||||||
{"_id":"yNMa8DlBaZyTGFSr","name":"Oubli","type":"sort","img":"systems/foundryvtt-reve-de-dragon/icons/competence_hypnos.webp","data":{"description":"<p>L’effet d’Oubli ne s’applique qu’aux humanoïdes. C’est une des plus puissantes suggestions hypnotiques. L’effet d’amnésie ne survient pas aussitôt le sort ciblé, mais intervient à la fin de l’heure en cours. À ce moment la victime perd tout souvenir de ce qu’elle a vécu, de ce qu’elle a pu dire ou faire, entre le moment présent et celui où le sort a été ciblé. Pratiquement, cette période est comme un grand trou noir dans sa tête, et aucun moyen normal ne peut lui restituer ses souvenirs. Chaque point de rêve dépensé en plus des 6 de base augmente la durée d’une heure. Soit un haut-rêvant lançant ce sort au cours de l’heure du Dragon et dépensant 8 points : à la fin de l’heure de la Lyre, la victime se retrouve brusquement amnésique de ce qu’elle a pu faire depuis la mi-Dragon jusqu’à maintenant, sans comprendre comment elle est arrivée dans le lieu où elle se trouve actuellement, comme si elle venait de se réveiller d’une période de sommeil noir, encore plus opaque que le gris rêve. Une Lecture d’Aura révèle la présence d’un sort d’Oubli en train d’œuvrer, et Annulation de Magie peut l’annuler selon les règles normales. À défaut, le rituel de Conjurer l’Oubli peut être utilisé, mais ne restitue les souvenirs que sélectivement, en réponse à une question précise. Quand c’est un personnage de joueur qui lance ce sort sur un PNJ, sa mise en œuvre est sans problème. L’inverse est plus délicat. Le mieux est alors de faire sortir de la salle le joueur du personnage victime, et de le faire rentrer au moment où l’amnésie opère. De cette façon, il ne se souvient effectivement de rien. Entre temps, si besoin est par rapport aux autres joueurs, jouer ce personnage comme un PNJ.</p>","descriptionmj":"","draconic":"hypnos","duree":"Selo n r dépensé","JR":"Selon HN","cible":"Humanoïde","difficulte":"-8","portée":"","caseTMR":"fleuve","caseTMRspeciale":"","ptreve":"6+","xp":0,"bonuscase":"","isrituel":false,"coutseuil":0,"portee":""},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"jOzRscDxoXZWpGS6":3},"flags":{}}
|
{"_id":"yNMa8DlBaZyTGFSr","name":"Oubli","type":"sort","img":"systems/foundryvtt-reve-de-dragon/icons/competence_hypnos.webp","data":{"description":"<p>L’effet d’Oubli ne s’applique qu’aux humanoïdes. C’est une des plus puissantes suggestions hypnotiques. L’effet d’amnésie ne survient pas aussitôt le sort ciblé, mais intervient à la fin de l’heure en cours. À ce moment la victime perd tout souvenir de ce qu’elle a vécu, de ce qu’elle a pu dire ou faire, entre le moment présent et celui où le sort a été ciblé. Pratiquement, cette période est comme un grand trou noir dans sa tête, et aucun moyen normal ne peut lui restituer ses souvenirs. Chaque point de rêve dépensé en plus des 6 de base augmente la durée d’une heure. Soit un haut-rêvant lançant ce sort au cours de l’heure du Dragon et dépensant 8 points : à la fin de l’heure de la Lyre, la victime se retrouve brusquement amnésique de ce qu’elle a pu faire depuis la mi-Dragon jusqu’à maintenant, sans comprendre comment elle est arrivée dans le lieu où elle se trouve actuellement, comme si elle venait de se réveiller d’une période de sommeil noir, encore plus opaque que le gris rêve. Une Lecture d’Aura révèle la présence d’un sort d’Oubli en train d’œuvrer, et Annulation de Magie peut l’annuler selon les règles normales. À défaut, le rituel de Conjurer l’Oubli peut être utilisé, mais ne restitue les souvenirs que sélectivement, en réponse à une question précise. Quand c’est un personnage de joueur qui lance ce sort sur un PNJ, sa mise en œuvre est sans problème. L’inverse est plus délicat. Le mieux est alors de faire sortir de la salle le joueur du personnage victime, et de le faire rentrer au moment où l’amnésie opère. De cette façon, il ne se souvient effectivement de rien. Entre temps, si besoin est par rapport aux autres joueurs, jouer ce personnage comme un PNJ.</p>","descriptionmj":"","draconic":"hypnos","duree":"Selo n r dépensé","JR":"Selon HN","cible":"Humanoïde","difficulte":"-8","portée":"","caseTMR":"fleuve","caseTMRspeciale":"","ptreve":"6+","xp":0,"bonuscase":"","isrituel":false,"coutseuil":0,"portee":""},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"jOzRscDxoXZWpGS6":3},"flags":{}}
|
||||||
{"_id":"yhw8f7HKrmfzAxmj","name":"Sérénité","type":"sort","img":"systems/foundryvtt-reve-de-dragon/icons/competence_hypnos.webp","data":{"description":"<p>L’effet de sérénité ne s’applique qu’aux humanoïdes. La suggestion d’une intense satisfaction est source d’une sérénité réelle. Pour chaque 3r dépensés, le personnage visé regagne 1 point de moral jusqu’à concurrence de zéro. Neuf points de rêve permettent ainsi de remonter un moral de -3 à zéro. Si trop de points sont dépensés, l’excédent est perdu, le moral ne pouvant dépasser zéro par l’influence de ce sort.</p>","descriptionmj":"","draconic":"hypnos","duree":"Instantanée","JR":"Selon HN","cible":"Humanoïde","difficulte":"-3","portée":"","caseTMR":"collines","caseTMRspeciale":"","ptreve":"3+","xp":0,"bonuscase":"","isrituel":false,"coutseuil":0,"portee":""},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"jOzRscDxoXZWpGS6":3},"flags":{}}
|
{"_id":"yhw8f7HKrmfzAxmj","name":"Sérénité","type":"sort","img":"systems/foundryvtt-reve-de-dragon/icons/competence_hypnos.webp","data":{"description":"<p>L’effet de sérénité ne s’applique qu’aux humanoïdes. La suggestion d’une intense satisfaction est source d’une sérénité réelle. Pour chaque 3r dépensés, le personnage visé regagne 1 point de moral jusqu’à concurrence de zéro. Neuf points de rêve permettent ainsi de remonter un moral de -3 à zéro. Si trop de points sont dépensés, l’excédent est perdu, le moral ne pouvant dépasser zéro par l’influence de ce sort.</p>","descriptionmj":"","draconic":"hypnos","duree":"Instantanée","JR":"Selon HN","cible":"Humanoïde","difficulte":"-3","portée":"","caseTMR":"collines","caseTMRspeciale":"","ptreve":"3+","xp":0,"bonuscase":"","isrituel":false,"coutseuil":0,"portee":""},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"jOzRscDxoXZWpGS6":3},"flags":{}}
|
||||||
{"_id":"ze53LdwhuqUFMvqw","name":"Fou-rire","permission":{"default":0,"jOzRscDxoXZWpGS6":3},"type":"sort","data":{"description":"<p>L’effet de Fou-Rire ne s’applique qu’aux humanoïdes. La suggestion d’une idée drolatique plonge la cible dans un irrépressible fou-rire, automatique le premier round. Puis pour les rounds suivants, la cible doit réussir un jet de VOLONTÉ/ <em>moins </em>moral à -5, ou continuer à rire. Tant que la cible rit, elle est considérée en <em>demi-surprise</em>.</p>","draconic":"hypnos","duree":"Instantanée","JR":"Selon HN","cible":"Humanoïde","difficulte":"-5","portée":"","caseTMR":"cite","caseTMRspeciale":"","ptreve":"5"},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_hypnos.webp","effects":[]}
|
{"_id":"ze53LdwhuqUFMvqw","name":"Fou-rire","permission":{"default":0,"jOzRscDxoXZWpGS6":3},"type":"sort","data":{"description":"<p>L’effet de Fou-Rire ne s’applique qu’aux humanoïdes. La suggestion d’une idée drolatique plonge la cible dans un irrépressible fou-rire, automatique le premier round. Puis pour les rounds suivants, la cible doit réussir un jet de VOLONTÉ/ <em>moins </em>moral à -5, ou continuer à rire. Tant que la cible rit, elle est considérée en <em>demi-surprise</em>.</p>","draconic":"hypnos","duree":"Instantanée","JR":"Selon HN","cible":"Humanoïde","difficulte":"-5","portée":"","caseTMR":"cite","caseTMRspeciale":"","ptreve":"5"},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_hypnos.webp","effects":[]}
|
||||||
|
@ -4,7 +4,7 @@
|
|||||||
{"_id":"5NZnTt0mvfPorSHG","name":"Écailles de Protection contre le venin *","permission":{"default":0,"6ibmdmaeRSMTjU4c":3},"type":"sort","data":{"description":"<p>Chaque écaille de protection confère un bons de +1 au jet de CONSTITUTION contre toutes les sortes de venin et de poison, augmentant ainsi les chances de leur résister.</p>\n<p>Une amulette peut avoir n'importe quelle forme, mais ne fonctionne que si elle est en contact avec la peau nue de son possesseur. Si c'est le cas, elle fonctionne spontanément en face du danger pour lequel elle est conçue, même si le possesseur n'a aucune idée de son pouvoir. Pour fonctionner, l'amulette a besoin de points de rêve actifs. Ces points doivent être des points de rêve conférés par le rituel d'Enchantement en plus des points inertes. Autrement dit, voulant fabriquer une amulette, le haut-rêvant ne s'arrête pas d'enchanter quand il atteint un nombre de points de rêve égal à l'inertie totale de l'objet, mais continue à en rajouter. Le nombre maximum de points actifs qu'une amulette puisse posséder est égal à 7 fois l'enchantabilité de sa gemme ; et, comme pour les écailles d'efficacité, le nombre d'écailles de protection qu'elle puisse posséder est égal à l'enchantabilité de celle-ci avec un maximum de 7. Des amulettes plus puissantes ne pourraient être obtenues que par de spécifiques Grandes Écailles de Narcos.</p>\n<p><em>Soit une gemme de taille 6 et de pureté 5, ayant donc une inertie de 2 et une enchantabilité de 4. Elle peut posséder jusqu'à 4 écailles de protection (=enchantabilité) et un maximum de 28 points de rêve actifs (7 x 4 = 28).</em></p>\n<p>Chaque fois qu'une amulette de protection fonctionne, elle dépense un de ses points de rêve actifs quel que soit le nombre d'écailles. Le possesseur, lui, n'en dépense qu'un par heure, quel que soit le nombre de fonctionnements de l'amulette au cours de cette heure. Quand une amulette n'a plus de points actifs, elle cesse de fonctionner. On ne peut lui en redonner que par le rituel de Restauration. Les écailles de protection peuvent être posées progressivement, comme celles d'efficacité, même si l'amulette fonctionne entre temps. Mêmes règles d'application. Une gemme donnée ne peut recevoir que des écailles de protection d'un même type, mais grâce à Individualité, plusieurs gemmes d'une même amulette peuvent offrir des protections différentes. La pose de chaque écaille de protection coûte un point de seuil.</p>\n<p> </p>","draconic":"narcos","duree":"Instantanée","JR":"Aucun","cible":"","difficulte":"-6","portée":"","caseTMR":"foret","caseTMRspeciale":"","ptreve":"4","portee":"","isrituel":true,"coutseuil":1,"xp":0,"bonuscase":""},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_narcos.webp","effects":[]}
|
{"_id":"5NZnTt0mvfPorSHG","name":"Écailles de Protection contre le venin *","permission":{"default":0,"6ibmdmaeRSMTjU4c":3},"type":"sort","data":{"description":"<p>Chaque écaille de protection confère un bons de +1 au jet de CONSTITUTION contre toutes les sortes de venin et de poison, augmentant ainsi les chances de leur résister.</p>\n<p>Une amulette peut avoir n'importe quelle forme, mais ne fonctionne que si elle est en contact avec la peau nue de son possesseur. Si c'est le cas, elle fonctionne spontanément en face du danger pour lequel elle est conçue, même si le possesseur n'a aucune idée de son pouvoir. Pour fonctionner, l'amulette a besoin de points de rêve actifs. Ces points doivent être des points de rêve conférés par le rituel d'Enchantement en plus des points inertes. Autrement dit, voulant fabriquer une amulette, le haut-rêvant ne s'arrête pas d'enchanter quand il atteint un nombre de points de rêve égal à l'inertie totale de l'objet, mais continue à en rajouter. Le nombre maximum de points actifs qu'une amulette puisse posséder est égal à 7 fois l'enchantabilité de sa gemme ; et, comme pour les écailles d'efficacité, le nombre d'écailles de protection qu'elle puisse posséder est égal à l'enchantabilité de celle-ci avec un maximum de 7. Des amulettes plus puissantes ne pourraient être obtenues que par de spécifiques Grandes Écailles de Narcos.</p>\n<p><em>Soit une gemme de taille 6 et de pureté 5, ayant donc une inertie de 2 et une enchantabilité de 4. Elle peut posséder jusqu'à 4 écailles de protection (=enchantabilité) et un maximum de 28 points de rêve actifs (7 x 4 = 28).</em></p>\n<p>Chaque fois qu'une amulette de protection fonctionne, elle dépense un de ses points de rêve actifs quel que soit le nombre d'écailles. Le possesseur, lui, n'en dépense qu'un par heure, quel que soit le nombre de fonctionnements de l'amulette au cours de cette heure. Quand une amulette n'a plus de points actifs, elle cesse de fonctionner. On ne peut lui en redonner que par le rituel de Restauration. Les écailles de protection peuvent être posées progressivement, comme celles d'efficacité, même si l'amulette fonctionne entre temps. Mêmes règles d'application. Une gemme donnée ne peut recevoir que des écailles de protection d'un même type, mais grâce à Individualité, plusieurs gemmes d'une même amulette peuvent offrir des protections différentes. La pose de chaque écaille de protection coûte un point de seuil.</p>\n<p> </p>","draconic":"narcos","duree":"Instantanée","JR":"Aucun","cible":"","difficulte":"-6","portée":"","caseTMR":"foret","caseTMRspeciale":"","ptreve":"4","portee":"","isrituel":true,"coutseuil":1,"xp":0,"bonuscase":""},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_narcos.webp","effects":[]}
|
||||||
{"_id":"74XSU8DqNBXGFn3R","name":"Dragonne Lame","permission":{"default":0,"Q2G6GTdrotKzYGUC":3},"type":"sort","data":{"description":"<p>Même principe que la@Item[r9onPANmiK5E5Jnw]{Flèche de Feu} et la @Item[8BJ9kn3AWLFDwvez]{Dague de Force}, y compris la détérioration automatique de 1 point de résistance. Une épée dragonne ainsi modifiée a un +dom de +6.</p>","draconic":"narcos","duree":"HN","JR":"Il n’y a aucun JR pour les objets ordinaires. Les objets magiques (enchantés) résistent automatiquement, le sort se dissipant sans effet, les points de rêve étant néanmoins dépensés","cible":"Une épée Dragonne (exclusivement)","difficulte":"6","portée":"","caseTMR":"desolation","caseTMRspeciale":"","ptreve":"4","xp":0,"isrituel":false,"portee":"","bonuscase":"","coutseuil":0},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_narcos.webp","effects":[]}
|
{"_id":"74XSU8DqNBXGFn3R","name":"Dragonne Lame","permission":{"default":0,"Q2G6GTdrotKzYGUC":3},"type":"sort","data":{"description":"<p>Même principe que la@Item[r9onPANmiK5E5Jnw]{Flèche de Feu} et la @Item[8BJ9kn3AWLFDwvez]{Dague de Force}, y compris la détérioration automatique de 1 point de résistance. Une épée dragonne ainsi modifiée a un +dom de +6.</p>","draconic":"narcos","duree":"HN","JR":"Il n’y a aucun JR pour les objets ordinaires. Les objets magiques (enchantés) résistent automatiquement, le sort se dissipant sans effet, les points de rêve étant néanmoins dépensés","cible":"Une épée Dragonne (exclusivement)","difficulte":"6","portée":"","caseTMR":"desolation","caseTMRspeciale":"","ptreve":"4","xp":0,"isrituel":false,"portee":"","bonuscase":"","coutseuil":0},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_narcos.webp","effects":[]}
|
||||||
{"_id":"AIBLH8EduhfUQscn","name":"Écaille d'Efficacité *","permission":{"default":0,"6ibmdmaeRSMTjU4c":3},"type":"sort","data":{"description":"<p>Les écailles d'efficacité servent à rendre un objet plus efficace, mais uniquement dans sa fonction normale. Une arme magiquement efficace permettra de toucher plus facilement un adversaire ; un bouclier de mieux parer ; un instrument de musique de jouer mieux à moindre effort ; mais un balai magique permettre de mieux balayer et non de voler. Les écailles d'efficacité n'ont de pertinence que sur les objets pouvant être utilisés activement, armes, instruments, outils. Les objets passifs, meubles, contenants, vêtements, armures, ne peuvent pas être rendus plus efficaces.</p>\n<p>En terme de jeu, chaque écaille d'efficacité possédée par l'objet confère un bonus de +1 sur la table de Résolution lors de son utilisation. S'il s'agit d'une arme, chaque écaille d'efficacité augmente également de 1 le facteur d'initiative, ainsi que le +dom de l'arme, mais jusqu'au maximum du double normal de ce dernier. Soit une épée dragonne (+dom +3) possédant 5 écailles d'efficacité. Son utilisateur bénéficie d'un bonus de +5 à l'initiative, de +5 à l'attaque et à la parade, mais d'un +dom de +6 seulement (le double du +dom normal) et non pas de +8. Ne pas oublier néanmoins de rajouter le +dom personnel dû à la taille et à la force. Cette règle s'applique également aux armes de jet (dague, javelot, fouet). En ce qui concerne les armes de tir (arbalète, arc et fronde), l'efficacité ne s'applique qu'aux dommages (toujours pour un maximum du double du +dom normal) et non au toucher. Pour qu'un archer bénéficie d'un bonus d'efficacité au toucher <em>et</em> aux dommages, il doit avoir à la fois un arc magique et une flèche magique.</p>\n<p>Le nombre maximum d'écailles d'efficacité pouvant être posées sur un objet est égal à l'enchantabilité de sa gemme, mais avec un maximum de 7 quelle que soit cette dernière. Pour obtenir des armes magiques d'un bonus supérieur à +7, il faut avoir recours à une éventuelle Grande Écaille de Narcos spécifique.</p>\n<p>La pose de chaque écaille d'efficacité coûte un point de seuil. Mais il n'y a aucune limite de temps entre la pose de chacune, l'objet pouvant être utilisé dans l'intervalle. Par exemple, on peut se contenter provisoirement d'une épée +1 (une écaille), s'en servir plusieurs fois en combat, et plus tard, rajouter une se conde écaille pour obtenir une épée +2. Toutefois, si entretemps l'objet a été maîtrisé par quelqu'un d'autre, il faut effectuer une Lecture d'Aura complète avant de pouvoir reposer une écaille. Si cette précaution est négligée, on aboutit à un cas de <em>magie impossible</em>. L'utilisation d'un objet magiquement efficace coûte un point de rêve par heure quel que soit le nombre d'écailles.</p>\n<p>Si plusieurs gemmes sont alliées à un même objet grâce à Individualité et reçoivent toutes des écailles d'efficacité, leurs bonus <em>ne s'ajoutent pas</em>, on ne considère que le meilleur. Des gemmes différentes sont faites pour des pouvoirs entièrement différents.</p>","draconic":"narcos","duree":"Instantanée","JR":"Aucun","cible":"","difficulte":"-8","portée":"","caseTMR":"monts","caseTMRspeciale":"","ptreve":"7","portee":"","isrituel":true,"coutseuil":1,"xp":0,"bonuscase":""},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_narcos.webp","effects":[]}
|
{"_id":"AIBLH8EduhfUQscn","name":"Écaille d'Efficacité *","permission":{"default":0,"6ibmdmaeRSMTjU4c":3},"type":"sort","data":{"description":"<p>Les écailles d'efficacité servent à rendre un objet plus efficace, mais uniquement dans sa fonction normale. Une arme magiquement efficace permettra de toucher plus facilement un adversaire ; un bouclier de mieux parer ; un instrument de musique de jouer mieux à moindre effort ; mais un balai magique permettre de mieux balayer et non de voler. Les écailles d'efficacité n'ont de pertinence que sur les objets pouvant être utilisés activement, armes, instruments, outils. Les objets passifs, meubles, contenants, vêtements, armures, ne peuvent pas être rendus plus efficaces.</p>\n<p>En terme de jeu, chaque écaille d'efficacité possédée par l'objet confère un bonus de +1 sur la table de Résolution lors de son utilisation. S'il s'agit d'une arme, chaque écaille d'efficacité augmente également de 1 le facteur d'initiative, ainsi que le +dom de l'arme, mais jusqu'au maximum du double normal de ce dernier. Soit une épée dragonne (+dom +3) possédant 5 écailles d'efficacité. Son utilisateur bénéficie d'un bonus de +5 à l'initiative, de +5 à l'attaque et à la parade, mais d'un +dom de +6 seulement (le double du +dom normal) et non pas de +8. Ne pas oublier néanmoins de rajouter le +dom personnel dû à la taille et à la force. Cette règle s'applique également aux armes de jet (dague, javelot, fouet). En ce qui concerne les armes de tir (arbalète, arc et fronde), l'efficacité ne s'applique qu'aux dommages (toujours pour un maximum du double du +dom normal) et non au toucher. Pour qu'un archer bénéficie d'un bonus d'efficacité au toucher <em>et</em> aux dommages, il doit avoir à la fois un arc magique et une flèche magique.</p>\n<p>Le nombre maximum d'écailles d'efficacité pouvant être posées sur un objet est égal à l'enchantabilité de sa gemme, mais avec un maximum de 7 quelle que soit cette dernière. Pour obtenir des armes magiques d'un bonus supérieur à +7, il faut avoir recours à une éventuelle Grande Écaille de Narcos spécifique.</p>\n<p>La pose de chaque écaille d'efficacité coûte un point de seuil. Mais il n'y a aucune limite de temps entre la pose de chacune, l'objet pouvant être utilisé dans l'intervalle. Par exemple, on peut se contenter provisoirement d'une épée +1 (une écaille), s'en servir plusieurs fois en combat, et plus tard, rajouter une se conde écaille pour obtenir une épée +2. Toutefois, si entretemps l'objet a été maîtrisé par quelqu'un d'autre, il faut effectuer une Lecture d'Aura complète avant de pouvoir reposer une écaille. Si cette précaution est négligée, on aboutit à un cas de <em>magie impossible</em>. L'utilisation d'un objet magiquement efficace coûte un point de rêve par heure quel que soit le nombre d'écailles.</p>\n<p>Si plusieurs gemmes sont alliées à un même objet grâce à Individualité et reçoivent toutes des écailles d'efficacité, leurs bonus <em>ne s'ajoutent pas</em>, on ne considère que le meilleur. Des gemmes différentes sont faites pour des pouvoirs entièrement différents.</p>","draconic":"narcos","duree":"Instantanée","JR":"Aucun","cible":"","difficulte":"-8","portée":"","caseTMR":"monts","caseTMRspeciale":"","ptreve":"7","portee":"","isrituel":true,"coutseuil":1,"xp":0,"bonuscase":""},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_narcos.webp","effects":[]}
|
||||||
{"_id":"BibuJdKmaQJm3kFw","name":"Annulation de magie","type":"sort","img":"systems/foundryvtt-reve-de-dragon/icons/competence_vigilance.webp","data":{"description":"<p>Ce rituel permet d’annuler un effet magique, que celui-ci ait été accompli par soi-même ou par un autre haut-rêvant. On peut annuler l’effet d’un sort, de zone ou individuel, d’un rituel d’enchantement, d’une invocation, etc.</p>\n<p>Le haut-rêvant doit se trouver dans la case <em>spécifique </em>des TMR d’où la magie a été accomplie. Le jet de RÊVE qu’il doit réussir a alors la même difficulté que celui ayant permis la magie, avec une dépense de points de rêve pareillement identique.</p>\n<p>Pour annuler une invocation, le rituel d’Annulation doit être ciblé sur la créature invoquée. Quand la magie est le résultat conjoint de plusieurs rituels, ce qui est notamment le cas des objets magiques, chacun doit être annulé tour à tour, en commençant toujours par le dernier à avoir été accompli chronologiquement. D’une manière générale, ce sont les mêmes opérations qui doivent être répétées à l’envers. Quand un rituel coûte des points de seuil, son annulation en coûte également (le même nombre). Annulation de Magie sert également à exorciser les entités de cauchemar non incarnées. La difficulté d’un exorcisme est toujours R-7, et le coût en points de rêve égal au RÊVE de l’entité. Le ciblage doit être fait sur la créature possédée.</p>\n<p>Avant d’accomplir une Annulation de Magie, les paramètres de la magie à annuler (case des TMR, R-, r) peuvent être découverts au moyen du rituel Lecture d’Aura.</p>\n<p>Pour la synthèse d’Annulation de Magie, considérer que ce rituel est de difficulté R-7. Il peut être utilisé indifféremment par Oniros, Hypnos ou Narcos (mais jamais Thanatos), quelle que soit la voie ayant servi à accomplir la magie à annuler.</p>","descriptionmj":"","draconic":"oniros","duree":"Instantanée","JR":"Aucun","cible":"Effet magique","difficulte":"variable","portée":"","caseTMR":"special","caseTMRspeciale":"variable","ptreve":"variable","xp":0,"bonuscase":"","isrituel":true,"coutseuil":0,"portee":""},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"Q2G6GTdrotKzYGUC":3},"flags":{}}
|
{"_id":"BibuJdKmaQJm3kFw","name":"Annulation de magie","permission":{"default":0,"Q2G6GTdrotKzYGUC":3},"type":"sort","data":{"description":"<p>Ce rituel permet d’annuler un effet magique, que celui-ci ait été accompli par soi-même ou par un autre haut-rêvant. On peut annuler l’effet d’un sort, de zone ou individuel, d’un rituel d’enchantement, d’une invocation, etc.</p>\n<p>Le haut-rêvant doit se trouver dans la case <em>spécifique </em>des TMR d’où la magie a été accomplie. Le jet de RÊVE qu’il doit réussir a alors la même difficulté que celui ayant permis la magie, avec une dépense de points de rêve pareillement identique.</p>\n<p>Pour annuler une invocation, le rituel d’Annulation doit être ciblé sur la créature invoquée. Quand la magie est le résultat conjoint de plusieurs rituels, ce qui est notamment le cas des objets magiques, chacun doit être annulé tour à tour, en commençant toujours par le dernier à avoir été accompli chronologiquement. D’une manière générale, ce sont les mêmes opérations qui doivent être répétées à l’envers. Quand un rituel coûte des points de seuil, son annulation en coûte également (le même nombre). Annulation de Magie sert également à exorciser les entités de cauchemar non incarnées. La difficulté d’un exorcisme est toujours R-7, et le coût en points de rêve égal au RÊVE de l’entité. Le ciblage doit être fait sur la créature possédée.</p>\n<p>Avant d’accomplir une Annulation de Magie, les paramètres de la magie à annuler (case des TMR, R-, r) peuvent être découverts au moyen du rituel Lecture d’Aura.</p>\n<p>Pour la synthèse d’Annulation de Magie, considérer que ce rituel est de difficulté R-7. Il peut être utilisé indifféremment par Oniros, Hypnos ou Narcos (mais jamais Thanatos), quelle que soit la voie ayant servi à accomplir la magie à annuler.</p>","draconic":"oniros","duree":"Instantanée","JR":"Aucun","cible":"Effet magique","difficulte":"variable","portée":"","caseTMR":"special","caseTMRspeciale":"variable","ptreve":"variable","xp":0,"isrituel":true,"bonuscase":"","coutseuil":0},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_vigilance.webp","effects":[]}
|
||||||
{"_id":"FpwaK1qJxKGs9HgS","name":"Permanence *","permission":{"default":0,"6ibmdmaeRSMTjU4c":3},"type":"sort","data":{"description":"<p>C'est par ce rituel que le haut-rêvant stabilise les points de rêve d'une potion ou d'un objet, afin d'en prévenir l'évaporation quotidienne. Facultatif pour les potions, le rituel de Permanence est obligatoire pour tous les autres objets magiques. Son accomplissement diminue de 1 point le seuil de rêve du haut-rêvant.</p>","draconic":"narcos","duree":"Instantanée","JR":"","cible":"","difficulte":"-5","portée":"","caseTMR":"sanctuaire","caseTMRspeciale":"","ptreve":"5","portee":"","isrituel":true,"coutseuil":1,"xp":0,"bonuscase":""},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_narcos.webp","effects":[]}
|
{"_id":"FpwaK1qJxKGs9HgS","name":"Permanence *","permission":{"default":0,"6ibmdmaeRSMTjU4c":3},"type":"sort","data":{"description":"<p>C'est par ce rituel que le haut-rêvant stabilise les points de rêve d'une potion ou d'un objet, afin d'en prévenir l'évaporation quotidienne. Facultatif pour les potions, le rituel de Permanence est obligatoire pour tous les autres objets magiques. Son accomplissement diminue de 1 point le seuil de rêve du haut-rêvant.</p>","draconic":"narcos","duree":"Instantanée","JR":"","cible":"","difficulte":"-5","portée":"","caseTMR":"sanctuaire","caseTMRspeciale":"","ptreve":"5","portee":"","isrituel":true,"coutseuil":1,"xp":0,"bonuscase":""},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_narcos.webp","effects":[]}
|
||||||
{"_id":"KW2VZhuEGJGglGcW","name":"Restauration *","permission":{"default":0,"6ibmdmaeRSMTjU4c":3},"type":"sort","data":{"description":"<p>Restauration est un rituel secondaire nullement obligatoire. Son seul usage est de redonner des points de rêve actifs à une amulette de protection. Il est en effet impossible d'utiliser le simple Enchantement une fois le rituel de Permanence accompli. Restauration fonctionne de façon semblable à un Enchantement, sauf que son accomplissement coûte chaque fois un point de seuil. On peut restaurer les points de rêve d'une amulette en plusieurs fois en intercalant un rituel de Purifcation entre chaque rituel de Restauration (qui coûte chaque fois un point de seuil). Il est possible de redonner plus de points de rêve actifs à l'objet qu'il n'en avait au départ, jusqu'à concurrence du maximum possible. Le nombre maximum de points de rêve actifs qu'un objet puisse posséder est égal à 7 fois l'enchantabilité de sa gemme.</p>","draconic":"narcos","duree":"Instantanée","JR":"Aucun","cible":"","difficulte":"-6","portée":"","caseTMR":"cite","caseTMRspeciale":"","ptreve":"1+","portee":"","isrituel":true,"coutseuil":1,"xp":0,"bonuscase":""},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_narcos.webp","effects":[]}
|
{"_id":"KW2VZhuEGJGglGcW","name":"Restauration *","permission":{"default":0,"6ibmdmaeRSMTjU4c":3},"type":"sort","data":{"description":"<p>Restauration est un rituel secondaire nullement obligatoire. Son seul usage est de redonner des points de rêve actifs à une amulette de protection. Il est en effet impossible d'utiliser le simple Enchantement une fois le rituel de Permanence accompli. Restauration fonctionne de façon semblable à un Enchantement, sauf que son accomplissement coûte chaque fois un point de seuil. On peut restaurer les points de rêve d'une amulette en plusieurs fois en intercalant un rituel de Purifcation entre chaque rituel de Restauration (qui coûte chaque fois un point de seuil). Il est possible de redonner plus de points de rêve actifs à l'objet qu'il n'en avait au départ, jusqu'à concurrence du maximum possible. Le nombre maximum de points de rêve actifs qu'un objet puisse posséder est égal à 7 fois l'enchantabilité de sa gemme.</p>","draconic":"narcos","duree":"Instantanée","JR":"Aucun","cible":"","difficulte":"-6","portée":"","caseTMR":"cite","caseTMRspeciale":"","ptreve":"1+","portee":"","isrituel":true,"coutseuil":1,"xp":0,"bonuscase":""},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_narcos.webp","effects":[]}
|
||||||
{"_id":"P9jMT8pl4pgKEoEW","name":"Écailles de Protection contre le feu *","permission":{"default":0,"6ibmdmaeRSMTjU4c":3},"type":"sort","data":{"description":"<p>Chaque écaille de protection diminue de 1 point le jet d'encaissement de tout dommage dû au feu, jouant le rôle d'une \"armure ignifugée\". Soit un personnage possédant une telle amulette dotée de 5 écailles, et se retrouvant dans une zone d'Air en Feu. Au lieu de jouer un jet d'encaissement à +10, il ne la joue qu'à +5. La protection de l'amulette est <em>en plus </em>de la protection physique qu'il peut avoir, laquelle ne peut être - rappelons-le - que d'un maximum de 2 points.</p>\n<p>Une amulette peut avoir n'importe quelle forme, mais ne fonctionne que si elle est en contact avec la peau nue de son possesseur. Si c'est le cas, elle fonctionne spontanément en face du danger pour lequel elle est conçue, même si le possesseur n'a aucune idée de son pouvoir. Pour fonctionner, l'amulette a besoin de points de rêve actifs. Ces points doivent être des points de rêve conférés par le rituel d'Enchantement en plus des points inertes. Autrement dit, voulant fabriquer une amulette, le haut-rêvant ne s'arrête pas d'enchanter quand il atteint un nombre de points de rêve égal à l'inertie totale de l'objet, mais continue à en rajouter. Le nombre maximum de points actifs qu'une amulette puisse posséder est égal à 7 fois l'enchantabilité de sa gemme ; et, comme pour les écailles d'efficacité, le nombre d'écailles de protection qu'elle puisse posséder est égal à l'enchantabilité de celle-ci avec un maximum de 7. Des amulettes plus puissantes ne pourraient être obtenues que par de spécifiques Grandes Écailles de Narcos.</p>\n<p><em>Soit une gemme de taille 6 et de pureté 5, ayant donc une inertie de 2 et une enchantabilité de 4. Elle peut posséder jusqu'à 4 écailles de protection (=enchantabilité) et un maximum de 28 points de rêve actifs (7 x 4 = 28).</em></p>\n<p>Chaque fois qu'une amulette de protection fonctionne, elle dépense un de ses points de rêve actifs quel que soit le nombre d'écailles. Le possesseur, lui, n'en dépense qu'un par heure, quel que soit le nombre de fonctionnements de l'amulette au cours de cette heure. Quand une amulette n'a plus de points actifs, elle cesse de fonctionner. On ne peut lui en redonner que par le rituel de Restauration. Les écailles de protection peuvent être posées progressivement, comme celles d'efficacité, même si l'amulette fonctionne entre temps. Mêmes règles d'application. Une gemme donnée ne peut recevoir que des écailles de protection d'un même type, mais grâce à Individualité, plusieurs gemmes d'une même amulette peuvent offrir des protections différentes. La pose de chaque écaille de protection coûte un point de seuil.</p>\n<p> </p>","draconic":"narcos","duree":"Instantanée","JR":"Aucun","cible":"","difficulte":"-6","portée":"","caseTMR":"desert","caseTMRspeciale":"","ptreve":"4","portee":"","isrituel":true,"coutseuil":1,"xp":0,"bonuscase":""},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_narcos.webp","effects":[]}
|
{"_id":"P9jMT8pl4pgKEoEW","name":"Écailles de Protection contre le feu *","permission":{"default":0,"6ibmdmaeRSMTjU4c":3},"type":"sort","data":{"description":"<p>Chaque écaille de protection diminue de 1 point le jet d'encaissement de tout dommage dû au feu, jouant le rôle d'une \"armure ignifugée\". Soit un personnage possédant une telle amulette dotée de 5 écailles, et se retrouvant dans une zone d'Air en Feu. Au lieu de jouer un jet d'encaissement à +10, il ne la joue qu'à +5. La protection de l'amulette est <em>en plus </em>de la protection physique qu'il peut avoir, laquelle ne peut être - rappelons-le - que d'un maximum de 2 points.</p>\n<p>Une amulette peut avoir n'importe quelle forme, mais ne fonctionne que si elle est en contact avec la peau nue de son possesseur. Si c'est le cas, elle fonctionne spontanément en face du danger pour lequel elle est conçue, même si le possesseur n'a aucune idée de son pouvoir. Pour fonctionner, l'amulette a besoin de points de rêve actifs. Ces points doivent être des points de rêve conférés par le rituel d'Enchantement en plus des points inertes. Autrement dit, voulant fabriquer une amulette, le haut-rêvant ne s'arrête pas d'enchanter quand il atteint un nombre de points de rêve égal à l'inertie totale de l'objet, mais continue à en rajouter. Le nombre maximum de points actifs qu'une amulette puisse posséder est égal à 7 fois l'enchantabilité de sa gemme ; et, comme pour les écailles d'efficacité, le nombre d'écailles de protection qu'elle puisse posséder est égal à l'enchantabilité de celle-ci avec un maximum de 7. Des amulettes plus puissantes ne pourraient être obtenues que par de spécifiques Grandes Écailles de Narcos.</p>\n<p><em>Soit une gemme de taille 6 et de pureté 5, ayant donc une inertie de 2 et une enchantabilité de 4. Elle peut posséder jusqu'à 4 écailles de protection (=enchantabilité) et un maximum de 28 points de rêve actifs (7 x 4 = 28).</em></p>\n<p>Chaque fois qu'une amulette de protection fonctionne, elle dépense un de ses points de rêve actifs quel que soit le nombre d'écailles. Le possesseur, lui, n'en dépense qu'un par heure, quel que soit le nombre de fonctionnements de l'amulette au cours de cette heure. Quand une amulette n'a plus de points actifs, elle cesse de fonctionner. On ne peut lui en redonner que par le rituel de Restauration. Les écailles de protection peuvent être posées progressivement, comme celles d'efficacité, même si l'amulette fonctionne entre temps. Mêmes règles d'application. Une gemme donnée ne peut recevoir que des écailles de protection d'un même type, mais grâce à Individualité, plusieurs gemmes d'une même amulette peuvent offrir des protections différentes. La pose de chaque écaille de protection coûte un point de seuil.</p>\n<p> </p>","draconic":"narcos","duree":"Instantanée","JR":"Aucun","cible":"","difficulte":"-6","portée":"","caseTMR":"desert","caseTMRspeciale":"","ptreve":"4","portee":"","isrituel":true,"coutseuil":1,"xp":0,"bonuscase":""},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_narcos.webp","effects":[]}
|
||||||
@ -13,7 +13,7 @@
|
|||||||
{"_id":"TjhnUMh6UL04k0k8","name":"Purification","permission":{"default":0,"6ibmdmaeRSMTjU4c":3},"type":"sort","data":{"description":"<p>Purification est un rituel secondaire, mais néanmoins obligatoire. A moins de disposer d'une énorme quantité de points de rêve, il est vain d'espérer enchanter l'objet en une seule fois. Purifcation doit toujours s'intercaler entre deux rituels identiques : entre deux Enchantements, mais également entre deux écailles, d'activité ou de protection. Sauter cette étape aboutit à un cas de <em>magie impossible</em>.</p>","draconic":"narcos","duree":"Instantanée","JR":"Aucun","cible":"","difficulte":"-4","portée":"","caseTMR":"necropole","caseTMRspeciale":"","ptreve":"4","portee":"","isrituel":true,"xp":0,"bonuscase":"","coutseuil":0},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_narcos.webp","effects":[]}
|
{"_id":"TjhnUMh6UL04k0k8","name":"Purification","permission":{"default":0,"6ibmdmaeRSMTjU4c":3},"type":"sort","data":{"description":"<p>Purification est un rituel secondaire, mais néanmoins obligatoire. A moins de disposer d'une énorme quantité de points de rêve, il est vain d'espérer enchanter l'objet en une seule fois. Purifcation doit toujours s'intercaler entre deux rituels identiques : entre deux Enchantements, mais également entre deux écailles, d'activité ou de protection. Sauter cette étape aboutit à un cas de <em>magie impossible</em>.</p>","draconic":"narcos","duree":"Instantanée","JR":"Aucun","cible":"","difficulte":"-4","portée":"","caseTMR":"necropole","caseTMRspeciale":"","ptreve":"4","portee":"","isrituel":true,"xp":0,"bonuscase":"","coutseuil":0},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_narcos.webp","effects":[]}
|
||||||
{"_id":"WUYaL4yvr0wFRLjk","name":"Enchantement","permission":{"default":0,"6ibmdmaeRSMTjU4c":3},"type":"sort","data":{"description":"<p>C'est le rituel de base de tout enchantement, c'est par lui que le haut-rêvant confère des points de rêve à la gemme ou à la potion. Le nombre de points conférés, paramétré au lancer du sort, est à son entière discrétion. Entre deux Enchantements de la même potion ou de la même gemme doit être accompli un rituel de Purificiation.</p>","draconic":"narcos","duree":"Instantanée","JR":"Aucun","cible":"","difficulte":"-4","portée":"","caseTMR":"cite","caseTMRspeciale":"","ptreve":"1+","portee":"","isrituel":true,"xp":0,"bonuscase":"","coutseuil":0},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_narcos.webp","effects":[]}
|
{"_id":"WUYaL4yvr0wFRLjk","name":"Enchantement","permission":{"default":0,"6ibmdmaeRSMTjU4c":3},"type":"sort","data":{"description":"<p>C'est le rituel de base de tout enchantement, c'est par lui que le haut-rêvant confère des points de rêve à la gemme ou à la potion. Le nombre de points conférés, paramétré au lancer du sort, est à son entière discrétion. Entre deux Enchantements de la même potion ou de la même gemme doit être accompli un rituel de Purificiation.</p>","draconic":"narcos","duree":"Instantanée","JR":"Aucun","cible":"","difficulte":"-4","portée":"","caseTMR":"cite","caseTMRspeciale":"","ptreve":"1+","portee":"","isrituel":true,"xp":0,"bonuscase":"","coutseuil":0},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_narcos.webp","effects":[]}
|
||||||
{"_id":"X8yMNrnbFIwTB6oL","name":"Écailles de Protection contre griffes et crocs *","permission":{"default":0,"6ibmdmaeRSMTjU4c":3},"type":"sort","data":{"description":"<p>Chaque écaille de protection diminue de 1 point le jet d'encaissement de tout dommage dû aux armes naturelles des animaux, griffes, crocs, mais également piétinement, cornes, tentacules, etc. Elle protège également des dommages au corps à corps de pugilat, coups de poing, coups de pied, mais ne s'applique pas à l'empoignade. La protection est en plus de l'armure véritable du personnage. </p>\n<p>Une amulette peut avoir n'importe quelle forme, mais ne fonctionne que si elle est en contact avec la peau nue de son possesseur. Si c'est le cas, elle fonctionne spontanément en face du danger pour lequel elle est conçue, même si le possesseur n'a aucune idée de son pouvoir. Pour fonctionner, l'amulette a besoin de points de rêve actifs. Ces points doivent être des points de rêve conférés par le rituel d'Enchantement en plus des points inertes. Autrement dit, voulant fabriquer une amulette, le haut-rêvant ne s'arrête pas d'enchanter quand il atteint un nombre de points de rêve égal à l'inertie totale de l'objet, mais continue à en rajouter. Le nombre maximum de points actifs qu'une amulette puisse posséder est égal à 7 fois l'enchantabilité de sa gemme ; et, comme pour les écailles d'efficacité, le nombre d'écailles de protection qu'elle puisse posséder est égal à l'enchantabilité de celle-ci avec un maximum de 7. Des amulettes plus puissantes ne pourraient être obtenues que par de spécifiques Grandes Écailles de Narcos.</p>\n<p><em>Soit une gemme de taille 6 et de pureté 5, ayant donc une inertie de 2 et une enchantabilité de 4. Elle peut posséder jusqu'à 4 écailles de protection (=enchantabilité) et un maximum de 28 points de rêve actifs (7 x 4 = 28).</em></p>\n<p>Chaque fois qu'une amulette de protection fonctionne, elle dépense un de ses points de rêve actifs quel que soit le nombre d'écailles. Le possesseur, lui, n'en dépense qu'un par heure, quel que soit le nombre de fonctionnements de l'amulette au cours de cette heure. Quand une amulette n'a plus de points actifs, elle cesse de fonctionner. On ne peut lui en redonner que par le rituel de Restauration. Les écailles de protection peuvent être posées progressivement, comme celles d'efficacité, même si l'amulette fonctionne entre temps. Mêmes règles d'application. Une gemme donnée ne peut recevoir que des écailles de protection d'un même type, mais grâce à Individualité, plusieurs gemmes d'une même amulette peuvent offrir des protections différentes. La pose de chaque écaille de protection coûte un point de seuil.</p>\n<p> </p>","draconic":"narcos","duree":"Instantanée","JR":"Aucun","cible":"","difficulte":"-10","portée":"","caseTMR":"marais","caseTMRspeciale":"","ptreve":"8","portee":"","isrituel":true,"coutseuil":1,"xp":0,"bonuscase":""},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_narcos.webp","effects":[]}
|
{"_id":"X8yMNrnbFIwTB6oL","name":"Écailles de Protection contre griffes et crocs *","permission":{"default":0,"6ibmdmaeRSMTjU4c":3},"type":"sort","data":{"description":"<p>Chaque écaille de protection diminue de 1 point le jet d'encaissement de tout dommage dû aux armes naturelles des animaux, griffes, crocs, mais également piétinement, cornes, tentacules, etc. Elle protège également des dommages au corps à corps de pugilat, coups de poing, coups de pied, mais ne s'applique pas à l'empoignade. La protection est en plus de l'armure véritable du personnage. </p>\n<p>Une amulette peut avoir n'importe quelle forme, mais ne fonctionne que si elle est en contact avec la peau nue de son possesseur. Si c'est le cas, elle fonctionne spontanément en face du danger pour lequel elle est conçue, même si le possesseur n'a aucune idée de son pouvoir. Pour fonctionner, l'amulette a besoin de points de rêve actifs. Ces points doivent être des points de rêve conférés par le rituel d'Enchantement en plus des points inertes. Autrement dit, voulant fabriquer une amulette, le haut-rêvant ne s'arrête pas d'enchanter quand il atteint un nombre de points de rêve égal à l'inertie totale de l'objet, mais continue à en rajouter. Le nombre maximum de points actifs qu'une amulette puisse posséder est égal à 7 fois l'enchantabilité de sa gemme ; et, comme pour les écailles d'efficacité, le nombre d'écailles de protection qu'elle puisse posséder est égal à l'enchantabilité de celle-ci avec un maximum de 7. Des amulettes plus puissantes ne pourraient être obtenues que par de spécifiques Grandes Écailles de Narcos.</p>\n<p><em>Soit une gemme de taille 6 et de pureté 5, ayant donc une inertie de 2 et une enchantabilité de 4. Elle peut posséder jusqu'à 4 écailles de protection (=enchantabilité) et un maximum de 28 points de rêve actifs (7 x 4 = 28).</em></p>\n<p>Chaque fois qu'une amulette de protection fonctionne, elle dépense un de ses points de rêve actifs quel que soit le nombre d'écailles. Le possesseur, lui, n'en dépense qu'un par heure, quel que soit le nombre de fonctionnements de l'amulette au cours de cette heure. Quand une amulette n'a plus de points actifs, elle cesse de fonctionner. On ne peut lui en redonner que par le rituel de Restauration. Les écailles de protection peuvent être posées progressivement, comme celles d'efficacité, même si l'amulette fonctionne entre temps. Mêmes règles d'application. Une gemme donnée ne peut recevoir que des écailles de protection d'un même type, mais grâce à Individualité, plusieurs gemmes d'une même amulette peuvent offrir des protections différentes. La pose de chaque écaille de protection coûte un point de seuil.</p>\n<p> </p>","draconic":"narcos","duree":"Instantanée","JR":"Aucun","cible":"","difficulte":"-10","portée":"","caseTMR":"marais","caseTMRspeciale":"","ptreve":"8","portee":"","isrituel":true,"coutseuil":1,"xp":0,"bonuscase":""},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_narcos.webp","effects":[]}
|
||||||
{"_id":"Y4r9kTN2brWC2N0n","name":"Lecture d'aura","type":"sort","img":"systems/foundryvtt-reve-de-dragon/icons/competence_vigilance.webp","data":{"description":"<p>Les rituels de Lecture d’Aura peuvent indifféremment être accomplis par n’importe laquelle des quatre voies.</p>\n<p>Ce rituel permet d’approfondir les informations fournies par Détection d’Aura. Pratiquer Lecture d’Aura quand il n’y a pas d’aura revient à demander une magie impossible et crée immédiatement une déchirure du rêve.</p>\n<p>Lecture d’Aura est effectuée en plusieurs étapes, toutes étant de difficulté R-3 et coûtant 3 points de rêve. La première a toujours lieu dans un sanctuaire et ne fait que révéler dans quel(s) autre(s) genre(s) de case(s) le haut-rêvant doit se rendre pour continuer sa lecture. Là, il apprend quel genre de magie a été produit ou à quel type de rêve il a affaire, de même que les cases spécifiques concernées. Enfin dans les cases spécifiques, le haut-rêvant peut apprendre la force du rêve ou de la magie en cours, c’est-à-dire pratiquement la difficulté et le nombre de points de rêve impliqués, information indispensable dans l’optique d’une annulation de magie.</p>\n<p>Lecture d’Aura révèle également la couleur de l’aura (fixe ou pulsative) comme Détection d’Aura. Pour les créatures vivantes, on peut donc sauter l’étape de Détection d’Aura et commencer directement par la lecture, puisqu’on est sûr de trouver une aura. Dans les autres cas, il est plus prudent de commencer par la détection si, en l’absence finale d’une aura, on ne veut pas créer de magie impossible. Effectuée sur une créature non soumise à un effet magique ni sous l’emprise d’une entité, Lecture d’Aura indique toujours le Fleuve. Là, dans n’importe quelle case du Fleuve, le haut-rêvant se contente d’apprendre qu’il a affaire à une créature vivante et douée de rêve.</p>","descriptionmj":"","draconic":"oniros","duree":"Instantanée","JR":"Aucun","cible":"","difficulte":"-3","portée":"","caseTMR":"special","caseTMRspeciale":"Sanctuaire / variable","ptreve":"3","xp":0,"bonuscase":"","isrituel":true,"coutseuil":0,"portee":""},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"Q2G6GTdrotKzYGUC":3},"flags":{}}
|
{"_id":"Y4r9kTN2brWC2N0n","name":"Lecture d'aura","permission":{"default":0,"Q2G6GTdrotKzYGUC":3},"type":"sort","data":{"description":"<p>Les rituels de Lecture d’Aura peuvent indifféremment être accomplis par n’importe laquelle des quatre voies.</p>\n<p>Ce rituel permet d’approfondir les informations fournies par Détection d’Aura. Pratiquer Lecture d’Aura quand il n’y a pas d’aura revient à demander une magie impossible et crée immédiatement une déchirure du rêve.</p>\n<p>Lecture d’Aura est effectuée en plusieurs étapes, toutes étant de difficulté R-3 et coûtant 3 points de rêve. La première a toujours lieu dans un sanctuaire et ne fait que révéler dans quel(s) autre(s) genre(s) de case(s) le haut-rêvant doit se rendre pour continuer sa lecture. Là, il apprend quel genre de magie a été produit ou à quel type de rêve il a affaire, de même que les cases spécifiques concernées. Enfin dans les cases spécifiques, le haut-rêvant peut apprendre la force du rêve ou de la magie en cours, c’est-à-dire pratiquement la difficulté et le nombre de points de rêve impliqués, information indispensable dans l’optique d’une annulation de magie.</p>\n<p>Lecture d’Aura révèle également la couleur de l’aura (fixe ou pulsative) comme Détection d’Aura. Pour les créatures vivantes, on peut donc sauter l’étape de Détection d’Aura et commencer directement par la lecture, puisqu’on est sûr de trouver une aura. Dans les autres cas, il est plus prudent de commencer par la détection si, en l’absence finale d’une aura, on ne veut pas créer de magie impossible. Effectuée sur une créature non soumise à un effet magique ni sous l’emprise d’une entité, Lecture d’Aura indique toujours le Fleuve. Là, dans n’importe quelle case du Fleuve, le haut-rêvant se contente d’apprendre qu’il a affaire à une créature vivante et douée de rêve.</p>","draconic":"oniros","duree":"Instantanée","JR":"Aucun","cible":"","difficulte":"-3","portée":"","caseTMR":"special","caseTMRspeciale":"Sanctuaire / variable","ptreve":"3","xp":0,"bonuscase":"","isrituel":false,"coutseuil":0},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_vigilance.webp","effects":[]}
|
||||||
{"_id":"asVUMvyZ0OocReY6","name":"Individualité","permission":{"default":0,"Q2G6GTdrotKzYGUC":3},"type":"sort","data":{"description":"<p>Rituel secondaire, Individualité est néanmoins obligatoire pour les objets possédant plusieurs pouvoirs distincts. Il doit être accompli sur toute nouvelle gemme, enchantée d’au moins un point de rêve actif, avant le rituel d’Alliance. Lors, c’est uniquement à cette nouvelle gemme que s’adresseront les points de rêve et les écailles. Vis à vis d’une nouvelle gemme, le matériau re-possède toute son inertie et doit à nouveau être saturé. Quand un objet a plusieurs gemmes, toutes ont dû recevoir Individualité sauf la première. Les pouvoirs d’un objet doivent être élaborés l’un après l’autre. Dès que l’on a commencé une nouvelle gemme, on ne peut plus revenir sur les précédentes.</p>","draconic":"narcos","duree":"Instantanée","JR":"Aucun","cible":"","difficulte":"-4","portée":"","caseTMR":"desert","caseTMRspeciale":"","ptreve":"4","xp":0,"isrituel":true,"portee":"","bonuscase":"","coutseuil":0},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_narcos.webp","effects":[]}
|
{"_id":"asVUMvyZ0OocReY6","name":"Individualité","permission":{"default":0,"Q2G6GTdrotKzYGUC":3},"type":"sort","data":{"description":"<p>Rituel secondaire, Individualité est néanmoins obligatoire pour les objets possédant plusieurs pouvoirs distincts. Il doit être accompli sur toute nouvelle gemme, enchantée d’au moins un point de rêve actif, avant le rituel d’Alliance. Lors, c’est uniquement à cette nouvelle gemme que s’adresseront les points de rêve et les écailles. Vis à vis d’une nouvelle gemme, le matériau re-possède toute son inertie et doit à nouveau être saturé. Quand un objet a plusieurs gemmes, toutes ont dû recevoir Individualité sauf la première. Les pouvoirs d’un objet doivent être élaborés l’un après l’autre. Dès que l’on a commencé une nouvelle gemme, on ne peut plus revenir sur les précédentes.</p>","draconic":"narcos","duree":"Instantanée","JR":"Aucun","cible":"","difficulte":"-4","portée":"","caseTMR":"desert","caseTMRspeciale":"","ptreve":"4","xp":0,"isrituel":true,"portee":"","bonuscase":"","coutseuil":0},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_narcos.webp","effects":[]}
|
||||||
{"_id":"ckH9xONcfsffpRVr","name":"Écailles de Protection contre la magie *","permission":{"default":0,"6ibmdmaeRSMTjU4c":3},"type":"sort","data":{"description":"<p>Chaque écaille de protection rajoute un +1 à tous les jets de résistance contre les sorts d'illusion-suggestion d'Hypnos ainsi que les rituels de Possession et les sorts et griffes de Thanatos. L'amulette n'est pas spécifique à un sort, elle protège de tous. Soit un personnage possédant une amulette de 4 écailles et devant jouer une JR r-8, il ne joue en réalité qu'un JR r-4, augmentant considérablement ses chances de résister à la magie. La protection ne s'applique qu'à la magie autorisant un JR.</p>\n<p>Une amulette peut avoir n'importe quelle forme, mais ne fonctionne que si elle est en contact avec la peau nue de son possesseur. Si c'est le cas, elle fonctionne spontanément en face du danger pour lequel elle est conçue, même si le possesseur n'a aucune idée de son pouvoir. Pour fonctionner, l'amulette a besoin de points de rêve actifs. Ces points doivent être des points de rêve conférés par le rituel d'Enchantement en plus des points inertes. Autrement dit, voulant fabriquer une amulette, le haut-rêvant ne s'arrête pas d'enchanter quand il atteint un nombre de points de rêve égal à l'inertie totale de l'objet, mais continue à en rajouter. Le nombre maximum de points actifs qu'une amulette puisse posséder est égal à 7 fois l'enchantabilité de sa gemme ; et, comme pour les écailles d'efficacité, le nombre d'écailles de protection qu'elle puisse posséder est égal à l'enchantabilité de celle-ci avec un maximum de 7. Des amulettes plus puissantes ne pourraient être obtenues que par de spécifiques Grandes Écailles de Narcos.</p>\n<p><em>Soit une gemme de taille 6 et de pureté 5, ayant donc une inertie de 2 et une enchantabilité de 4. Elle peut posséder jusqu'à 4 écailles de protection (=enchantabilité) et un maximum de 28 points de rêve actifs (7 x 4 = 28).</em></p>\n<p>Chaque fois qu'une amulette de protection fonctionne, elle dépense un de ses points de rêve actifs quel que soit le nombre d'écailles. Le possesseur, lui, n'en dépense qu'un par heure, quel que soit le nombre de fonctionnements de l'amulette au cours de cette heure. Quand une amulette n'a plus de points actifs, elle cesse de fonctionner. On ne peut lui en redonner que par le rituel de Restauration. Les écailles de protection peuvent être posées progressivement, comme celles d'efficacité, même si l'amulette fonctionne entre temps. Mêmes règles d'application. Une gemme donnée ne peut recevoir que des écailles de protection d'un même type, mais grâce à Individualité, plusieurs gemmes d'une même amulette peuvent offrir des protections différentes. La pose de chaque écaille de protection coûte un point de seuil.</p>\n<p> </p>","draconic":"narcos","duree":"Instantanée","JR":"Aucun","cible":"","difficulte":"-8","portée":"","caseTMR":"sanctuaire","caseTMRspeciale":"","ptreve":"6","portee":"","isrituel":true,"coutseuil":1,"xp":0,"bonuscase":""},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_narcos.webp","effects":[]}
|
{"_id":"ckH9xONcfsffpRVr","name":"Écailles de Protection contre la magie *","permission":{"default":0,"6ibmdmaeRSMTjU4c":3},"type":"sort","data":{"description":"<p>Chaque écaille de protection rajoute un +1 à tous les jets de résistance contre les sorts d'illusion-suggestion d'Hypnos ainsi que les rituels de Possession et les sorts et griffes de Thanatos. L'amulette n'est pas spécifique à un sort, elle protège de tous. Soit un personnage possédant une amulette de 4 écailles et devant jouer une JR r-8, il ne joue en réalité qu'un JR r-4, augmentant considérablement ses chances de résister à la magie. La protection ne s'applique qu'à la magie autorisant un JR.</p>\n<p>Une amulette peut avoir n'importe quelle forme, mais ne fonctionne que si elle est en contact avec la peau nue de son possesseur. Si c'est le cas, elle fonctionne spontanément en face du danger pour lequel elle est conçue, même si le possesseur n'a aucune idée de son pouvoir. Pour fonctionner, l'amulette a besoin de points de rêve actifs. Ces points doivent être des points de rêve conférés par le rituel d'Enchantement en plus des points inertes. Autrement dit, voulant fabriquer une amulette, le haut-rêvant ne s'arrête pas d'enchanter quand il atteint un nombre de points de rêve égal à l'inertie totale de l'objet, mais continue à en rajouter. Le nombre maximum de points actifs qu'une amulette puisse posséder est égal à 7 fois l'enchantabilité de sa gemme ; et, comme pour les écailles d'efficacité, le nombre d'écailles de protection qu'elle puisse posséder est égal à l'enchantabilité de celle-ci avec un maximum de 7. Des amulettes plus puissantes ne pourraient être obtenues que par de spécifiques Grandes Écailles de Narcos.</p>\n<p><em>Soit une gemme de taille 6 et de pureté 5, ayant donc une inertie de 2 et une enchantabilité de 4. Elle peut posséder jusqu'à 4 écailles de protection (=enchantabilité) et un maximum de 28 points de rêve actifs (7 x 4 = 28).</em></p>\n<p>Chaque fois qu'une amulette de protection fonctionne, elle dépense un de ses points de rêve actifs quel que soit le nombre d'écailles. Le possesseur, lui, n'en dépense qu'un par heure, quel que soit le nombre de fonctionnements de l'amulette au cours de cette heure. Quand une amulette n'a plus de points actifs, elle cesse de fonctionner. On ne peut lui en redonner que par le rituel de Restauration. Les écailles de protection peuvent être posées progressivement, comme celles d'efficacité, même si l'amulette fonctionne entre temps. Mêmes règles d'application. Une gemme donnée ne peut recevoir que des écailles de protection d'un même type, mais grâce à Individualité, plusieurs gemmes d'une même amulette peuvent offrir des protections différentes. La pose de chaque écaille de protection coûte un point de seuil.</p>\n<p> </p>","draconic":"narcos","duree":"Instantanée","JR":"Aucun","cible":"","difficulte":"-8","portée":"","caseTMR":"sanctuaire","caseTMRspeciale":"","ptreve":"6","portee":"","isrituel":true,"coutseuil":1,"xp":0,"bonuscase":""},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_narcos.webp","effects":[]}
|
||||||
{"_id":"hWAoVheMfyLIMKZy","name":"Alliance","permission":{"default":0,"Q4cUvqxCxMoTJXDL":3},"type":"sort","data":{"description":"<p>Ce rituel unit magiquement la gemme, seul véritable réceptacle du rêve,au reste de l’objet, en sorte que son pouvoir puisse s’étendre à lui. Ce qui s’applique à la gemme s’applique désormais à l’objet, et inversement. La forme de l’objet participe maintenant à la magie. C’est pourquoi il doit être utilisé comme l’exige sa fonction normale (bague au doigt, etc.) et pourquoi sa forme doit être en analogie avec le ciblage. Pratiquement, une gemme seule ne peut être utilisée que pour une écaille d’activité lançant un sort sur l’utilisateur lui-même (la gemme ne lui permettant pas d’autre ciblage). Une gemme seule pourrait être une amulette de protection, mais il faudrait la tenir sans cesse dans le creux de la main (seule façon d’utiliser une gemme seule). En revanche, on peut s’en contenter pour la Grande Écaille de Narcos Puits de rêve.</p>\n<p> </p>","draconic":"narcos","duree":"Instantanée","JR":"Aucun","cible":"","difficulte":"-4","portée":"","caseTMR":"pont","caseTMRspeciale":"","ptreve":"4","portee":"","isrituel":true,"xp":0,"bonuscase":"","coutseuil":0},"flags":{"core":{"sourceId":"Item.5UQMurs8lNa8eBr0"}},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_narcos.webp","effects":[]}
|
{"_id":"hWAoVheMfyLIMKZy","name":"Alliance","permission":{"default":0,"Q4cUvqxCxMoTJXDL":3},"type":"sort","data":{"description":"<p>Ce rituel unit magiquement la gemme, seul véritable réceptacle du rêve,au reste de l’objet, en sorte que son pouvoir puisse s’étendre à lui. Ce qui s’applique à la gemme s’applique désormais à l’objet, et inversement. La forme de l’objet participe maintenant à la magie. C’est pourquoi il doit être utilisé comme l’exige sa fonction normale (bague au doigt, etc.) et pourquoi sa forme doit être en analogie avec le ciblage. Pratiquement, une gemme seule ne peut être utilisée que pour une écaille d’activité lançant un sort sur l’utilisateur lui-même (la gemme ne lui permettant pas d’autre ciblage). Une gemme seule pourrait être une amulette de protection, mais il faudrait la tenir sans cesse dans le creux de la main (seule façon d’utiliser une gemme seule). En revanche, on peut s’en contenter pour la Grande Écaille de Narcos Puits de rêve.</p>\n<p> </p>","draconic":"narcos","duree":"Instantanée","JR":"Aucun","cible":"","difficulte":"-4","portée":"","caseTMR":"pont","caseTMRspeciale":"","ptreve":"4","portee":"","isrituel":true,"xp":0,"bonuscase":"","coutseuil":0},"flags":{"core":{"sourceId":"Item.5UQMurs8lNa8eBr0"}},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_narcos.webp","effects":[]}
|
||||||
@ -22,5 +22,5 @@
|
|||||||
{"_id":"mh9JjaKckzz1eAoe","name":"Écailles de Protection contre la maladie* ","permission":{"default":0,"6ibmdmaeRSMTjU4c":3},"type":"sort","data":{"description":"<p>Chaque écaille de protection confère un bons de +1 au jet de CONSTITUTION contre toutes les maladies, augmentant ainsi les chances de leur résister.</p>\n<p>Une amulette peut avoir n'importe quelle forme, mais ne fonctionne que si elle est en contact avec la peau nue de son possesseur. Si c'est le cas, elle fonctionne spontanément en face du danger pour lequel elle est conçue, même si le possesseur n'a aucune idée de son pouvoir. Pour fonctionner, l'amulette a besoin de points de rêve actifs. Ces points doivent être des points de rêve conférés par le rituel d'Enchantement en plus des points inertes. Autrement dit, voulant fabriquer une amulette, le haut-rêvant ne s'arrête pas d'enchanter quand il atteint un nombre de points de rêve égal à l'inertie totale de l'objet, mais continue à en rajouter. Le nombre maximum de points actifs qu'une amulette puisse posséder est égal à 7 fois l'enchantabilité de sa gemme ; et, comme pour les écailles d'efficacité, le nombre d'écailles de protection qu'elle puisse posséder est égal à l'enchantabilité de celle-ci avec un maximum de 7. Des amulettes plus puissantes ne pourraient être obtenues que par de spécifiques Grandes Écailles de Narcos.</p>\n<p><em>Soit une gemme de taille 6 et de pureté 5, ayant donc une inertie de 2 et une enchantabilité de 4. Elle peut posséder jusqu'à 4 écailles de protection (=enchantabilité) et un maximum de 28 points de rêve actifs (7 x 4 = 28).</em></p>\n<p>Chaque fois qu'une amulette de protection fonctionne, elle dépense un de ses points de rêve actifs quel que soit le nombre d'écailles. Le possesseur, lui, n'en dépense qu'un par heure, quel que soit le nombre de fonctionnements de l'amulette au cours de cette heure. Quand une amulette n'a plus de points actifs, elle cesse de fonctionner. On ne peut lui en redonner que par le rituel de Restauration. Les écailles de protection peuvent être posées progressivement, comme celles d'efficacité, même si l'amulette fonctionne entre temps. Mêmes règles d'application. Une gemme donnée ne peut recevoir que des écailles de protection d'un même type, mais grâce à Individualité, plusieurs gemmes d'une même amulette peuvent offrir des protections différentes. La pose de chaque écaille de protection coûte un point de seuil.</p>\n<p> </p>","draconic":"narcos","duree":"Instantanée","JR":"Aucun","cible":"","difficulte":"-6","portée":"","caseTMR":"cite","caseTMRspeciale":"","ptreve":"4","portee":"","isrituel":true,"coutseuil":1,"xp":0,"bonuscase":""},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_narcos.webp","effects":[]}
|
{"_id":"mh9JjaKckzz1eAoe","name":"Écailles de Protection contre la maladie* ","permission":{"default":0,"6ibmdmaeRSMTjU4c":3},"type":"sort","data":{"description":"<p>Chaque écaille de protection confère un bons de +1 au jet de CONSTITUTION contre toutes les maladies, augmentant ainsi les chances de leur résister.</p>\n<p>Une amulette peut avoir n'importe quelle forme, mais ne fonctionne que si elle est en contact avec la peau nue de son possesseur. Si c'est le cas, elle fonctionne spontanément en face du danger pour lequel elle est conçue, même si le possesseur n'a aucune idée de son pouvoir. Pour fonctionner, l'amulette a besoin de points de rêve actifs. Ces points doivent être des points de rêve conférés par le rituel d'Enchantement en plus des points inertes. Autrement dit, voulant fabriquer une amulette, le haut-rêvant ne s'arrête pas d'enchanter quand il atteint un nombre de points de rêve égal à l'inertie totale de l'objet, mais continue à en rajouter. Le nombre maximum de points actifs qu'une amulette puisse posséder est égal à 7 fois l'enchantabilité de sa gemme ; et, comme pour les écailles d'efficacité, le nombre d'écailles de protection qu'elle puisse posséder est égal à l'enchantabilité de celle-ci avec un maximum de 7. Des amulettes plus puissantes ne pourraient être obtenues que par de spécifiques Grandes Écailles de Narcos.</p>\n<p><em>Soit une gemme de taille 6 et de pureté 5, ayant donc une inertie de 2 et une enchantabilité de 4. Elle peut posséder jusqu'à 4 écailles de protection (=enchantabilité) et un maximum de 28 points de rêve actifs (7 x 4 = 28).</em></p>\n<p>Chaque fois qu'une amulette de protection fonctionne, elle dépense un de ses points de rêve actifs quel que soit le nombre d'écailles. Le possesseur, lui, n'en dépense qu'un par heure, quel que soit le nombre de fonctionnements de l'amulette au cours de cette heure. Quand une amulette n'a plus de points actifs, elle cesse de fonctionner. On ne peut lui en redonner que par le rituel de Restauration. Les écailles de protection peuvent être posées progressivement, comme celles d'efficacité, même si l'amulette fonctionne entre temps. Mêmes règles d'application. Une gemme donnée ne peut recevoir que des écailles de protection d'un même type, mais grâce à Individualité, plusieurs gemmes d'une même amulette peuvent offrir des protections différentes. La pose de chaque écaille de protection coûte un point de seuil.</p>\n<p> </p>","draconic":"narcos","duree":"Instantanée","JR":"Aucun","cible":"","difficulte":"-6","portée":"","caseTMR":"cite","caseTMRspeciale":"","ptreve":"4","portee":"","isrituel":true,"coutseuil":1,"xp":0,"bonuscase":""},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_narcos.webp","effects":[]}
|
||||||
{"_id":"mzAV6EdQlGkVkWEN","name":"Écailles de Protection contre les lames *","permission":{"default":0,"6ibmdmaeRSMTjU4c":3},"type":"sort","data":{"description":"<p>Chaque écaille de protection diminue de 1 point le jet d'encaissement de tout dommage dû à une arme de mêlée (dague, épée, hache, lance, masse, fléeau, arme d'hast), mais ni les projectiles ni les dommages au corps à corps. La protection est en plus de l'armure véritable du personnage. </p>\n<p>Une amulette peut avoir n'importe quelle forme, mais ne fonctionne que si elle est en contact avec la peau nue de son possesseur. Si c'est le cas, elle fonctionne spontanément en face du danger pour lequel elle est conçue, même si le possesseur n'a aucune idée de son pouvoir. Pour fonctionner, l'amulette a besoin de points de rêve actifs. Ces points doivent être des points de rêve conférés par le rituel d'Enchantement en plus des points inertes. Autrement dit, voulant fabriquer une amulette, le haut-rêvant ne s'arrête pas d'enchanter quand il atteint un nombre de points de rêve égal à l'inertie totale de l'objet, mais continue à en rajouter. Le nombre maximum de points actifs qu'une amulette puisse posséder est égal à 7 fois l'enchantabilité de sa gemme ; et, comme pour les écailles d'efficacité, le nombre d'écailles de protection qu'elle puisse posséder est égal à l'enchantabilité de celle-ci avec un maximum de 7. Des amulettes plus puissantes ne pourraient être obtenues que par de spécifiques Grandes Écailles de Narcos.</p>\n<p><em>Soit une gemme de taille 6 et de pureté 5, ayant donc une inertie de 2 et une enchantabilité de 4. Elle peut posséder jusqu'à 4 écailles de protection (=enchantabilité) et un maximum de 28 points de rêve actifs (7 x 4 = 28).</em></p>\n<p>Chaque fois qu'une amulette de protection fonctionne, elle dépense un de ses points de rêve actifs quel que soit le nombre d'écailles. Le possesseur, lui, n'en dépense qu'un par heure, quel que soit le nombre de fonctionnements de l'amulette au cours de cette heure. Quand une amulette n'a plus de points actifs, elle cesse de fonctionner. On ne peut lui en redonner que par le rituel de Restauration. Les écailles de protection peuvent être posées progressivement, comme celles d'efficacité, même si l'amulette fonctionne entre temps. Mêmes règles d'application. Une gemme donnée ne peut recevoir que des écailles de protection d'un même type, mais grâce à Individualité, plusieurs gemmes d'une même amulette peuvent offrir des protections différentes. La pose de chaque écaille de protection coûte un point de seuil.</p>\n<p> </p>","draconic":"narcos","duree":"Instantanée","JR":"Aucun","cible":"","difficulte":"-10","portée":"","caseTMR":"lac","caseTMRspeciale":"","ptreve":"8","portee":"","isrituel":true,"coutseuil":1,"xp":0,"bonuscase":""},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_narcos.webp","effects":[]}
|
{"_id":"mzAV6EdQlGkVkWEN","name":"Écailles de Protection contre les lames *","permission":{"default":0,"6ibmdmaeRSMTjU4c":3},"type":"sort","data":{"description":"<p>Chaque écaille de protection diminue de 1 point le jet d'encaissement de tout dommage dû à une arme de mêlée (dague, épée, hache, lance, masse, fléeau, arme d'hast), mais ni les projectiles ni les dommages au corps à corps. La protection est en plus de l'armure véritable du personnage. </p>\n<p>Une amulette peut avoir n'importe quelle forme, mais ne fonctionne que si elle est en contact avec la peau nue de son possesseur. Si c'est le cas, elle fonctionne spontanément en face du danger pour lequel elle est conçue, même si le possesseur n'a aucune idée de son pouvoir. Pour fonctionner, l'amulette a besoin de points de rêve actifs. Ces points doivent être des points de rêve conférés par le rituel d'Enchantement en plus des points inertes. Autrement dit, voulant fabriquer une amulette, le haut-rêvant ne s'arrête pas d'enchanter quand il atteint un nombre de points de rêve égal à l'inertie totale de l'objet, mais continue à en rajouter. Le nombre maximum de points actifs qu'une amulette puisse posséder est égal à 7 fois l'enchantabilité de sa gemme ; et, comme pour les écailles d'efficacité, le nombre d'écailles de protection qu'elle puisse posséder est égal à l'enchantabilité de celle-ci avec un maximum de 7. Des amulettes plus puissantes ne pourraient être obtenues que par de spécifiques Grandes Écailles de Narcos.</p>\n<p><em>Soit une gemme de taille 6 et de pureté 5, ayant donc une inertie de 2 et une enchantabilité de 4. Elle peut posséder jusqu'à 4 écailles de protection (=enchantabilité) et un maximum de 28 points de rêve actifs (7 x 4 = 28).</em></p>\n<p>Chaque fois qu'une amulette de protection fonctionne, elle dépense un de ses points de rêve actifs quel que soit le nombre d'écailles. Le possesseur, lui, n'en dépense qu'un par heure, quel que soit le nombre de fonctionnements de l'amulette au cours de cette heure. Quand une amulette n'a plus de points actifs, elle cesse de fonctionner. On ne peut lui en redonner que par le rituel de Restauration. Les écailles de protection peuvent être posées progressivement, comme celles d'efficacité, même si l'amulette fonctionne entre temps. Mêmes règles d'application. Une gemme donnée ne peut recevoir que des écailles de protection d'un même type, mais grâce à Individualité, plusieurs gemmes d'une même amulette peuvent offrir des protections différentes. La pose de chaque écaille de protection coûte un point de seuil.</p>\n<p> </p>","draconic":"narcos","duree":"Instantanée","JR":"Aucun","cible":"","difficulte":"-10","portée":"","caseTMR":"lac","caseTMRspeciale":"","ptreve":"8","portee":"","isrituel":true,"coutseuil":1,"xp":0,"bonuscase":""},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_narcos.webp","effects":[]}
|
||||||
{"_id":"sEBhR48HagKNbkob","name":"Écaille d'activité *","permission":{"default":0,"6ibmdmaeRSMTjU4c":3},"type":"sort","data":{"description":"<p>Le rituel d'Écaille d'Activité confère à l'objet magique le pouvoir de lancer un sort. Ce peut être un sort de zone d'Oniros, un sort d'illusion-suggestion ou d'illusion sensorielle d'Hypnos, ou un sort de Thanatos, mais ne peut en aucun cas être un rituel d'aucune des quatre voies. Ayant <em>posé</em> l'écaille d'activité sur l'objet (\"poser\" est le terme consacré à l'accomplissement des rituels d'Écaille), le Haut-Rêvant y lance le sort de son choix et l'objet devient capable de le lancer à son tour. Pratiquement, le haut-rêvant effectue toutes les opérations nécessaires au lancer d'un sort, y compris son paramétrage précis, puis le lance normalement en dépensant les points de rêve du coût. Toutefois, au lieu de cibler comme l'exige le ciblage normal du sort, il touche l'objet possédant l'écaille d'activité. En résultat, aucun effet ne se produit, mais le sort est maintenant <em>enregistré </em>dans la \"mémoire\" de la gemme. Il suffit ensuite à l'utilisateur de se concentrer mentalement sur l'effet voulu (dont il doit avoir une idée) pour que l'objet lance le sort. Il pourra le lancer indéfiniment.</p>\n<p>A la fin du round de concentration, l'utilisateur doit être capable de dépenser les points de rêve exigés par le coût du sort tel qu'il est paramétéré. S'il n'en a pas assez, il ne dépense rien, mais l'objet ne fonctionne pas. Puis cela étant fait, le sort opère au tout début du round suivant, selon le ciblage voulu par l'utilisateur, fonction de la forme de l'objet et de la façon dont il est utilisé. Pour que le sort puisse être ciblé ailleurs que sur l'utilisateur lui-même, l'objet doit avoir une forme oblongue, analogue au doigt pointé d'un haut-rêvant. Le sort enregistré dans la gemme est paramétré une fois pour toutes. Un objet lançant un sort de Sommeil de 5 rounds lancera toujours un sort de Sommeil de 5 rounds, ni plus ni moins. Un objet lançant une illusion visuelle ne lancera toujours que la même illusion au moindre détail près. La portée est celle de l'EMPATHIE du créateur de l'objet et non de l'utilisateur, et quand le sort a une durée HN, c'est également l'heure de naissance du créateur. Le seul paramétrage inutile est l'heure de naissance de la cible en prévision du jet de résistance. Quand un JR est possible, il est toujours r-8, quelle que soit la cible. S'il réussit, le sort se dissipe aussitôt sans revenir vers l'utilisateur.</p>\n<p>L'objet réussit son lancer, sans jet de dés. Lancer un sort via un objet magique n'est pas plus économique en points de rêve que de la lancer soi-même, mais évite la montée en TMR, les rencontres, et confère la certitude que le sort partira à coup sûr. L'effet d'un sort lancé par un objet peut être annulé par Annulatrion de Magie, mais pas par Annulation de ses Propres Zones ni Annulation de ses Propres Illusions.</p>\n<p>Chaque gemme d'un objet ne peut recevoir qu'une seule écaille d'activité, et la pose de cette dernière coûte un point de seuil. Une écaille d'activité ne peut enregistrer et lancer q'un seul sort. Mais un même objet peut avoir plusieurs gemmes, grâce à Individualité, chacune possédant une écaille d'activité pour lancer un sort différent.</p>","draconic":"narcos","duree":"Instantanée","JR":"Aucun","cible":"","difficulte":"-9","portée":"","caseTMR":"desolation","caseTMRspeciale":"","ptreve":"7","portee":"","isrituel":true,"coutseuil":1,"xp":0,"bonuscase":""},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_narcos.webp","effects":[]}
|
{"_id":"sEBhR48HagKNbkob","name":"Écaille d'activité *","permission":{"default":0,"6ibmdmaeRSMTjU4c":3},"type":"sort","data":{"description":"<p>Le rituel d'Écaille d'Activité confère à l'objet magique le pouvoir de lancer un sort. Ce peut être un sort de zone d'Oniros, un sort d'illusion-suggestion ou d'illusion sensorielle d'Hypnos, ou un sort de Thanatos, mais ne peut en aucun cas être un rituel d'aucune des quatre voies. Ayant <em>posé</em> l'écaille d'activité sur l'objet (\"poser\" est le terme consacré à l'accomplissement des rituels d'Écaille), le Haut-Rêvant y lance le sort de son choix et l'objet devient capable de le lancer à son tour. Pratiquement, le haut-rêvant effectue toutes les opérations nécessaires au lancer d'un sort, y compris son paramétrage précis, puis le lance normalement en dépensant les points de rêve du coût. Toutefois, au lieu de cibler comme l'exige le ciblage normal du sort, il touche l'objet possédant l'écaille d'activité. En résultat, aucun effet ne se produit, mais le sort est maintenant <em>enregistré </em>dans la \"mémoire\" de la gemme. Il suffit ensuite à l'utilisateur de se concentrer mentalement sur l'effet voulu (dont il doit avoir une idée) pour que l'objet lance le sort. Il pourra le lancer indéfiniment.</p>\n<p>A la fin du round de concentration, l'utilisateur doit être capable de dépenser les points de rêve exigés par le coût du sort tel qu'il est paramétéré. S'il n'en a pas assez, il ne dépense rien, mais l'objet ne fonctionne pas. Puis cela étant fait, le sort opère au tout début du round suivant, selon le ciblage voulu par l'utilisateur, fonction de la forme de l'objet et de la façon dont il est utilisé. Pour que le sort puisse être ciblé ailleurs que sur l'utilisateur lui-même, l'objet doit avoir une forme oblongue, analogue au doigt pointé d'un haut-rêvant. Le sort enregistré dans la gemme est paramétré une fois pour toutes. Un objet lançant un sort de Sommeil de 5 rounds lancera toujours un sort de Sommeil de 5 rounds, ni plus ni moins. Un objet lançant une illusion visuelle ne lancera toujours que la même illusion au moindre détail près. La portée est celle de l'EMPATHIE du créateur de l'objet et non de l'utilisateur, et quand le sort a une durée HN, c'est également l'heure de naissance du créateur. Le seul paramétrage inutile est l'heure de naissance de la cible en prévision du jet de résistance. Quand un JR est possible, il est toujours r-8, quelle que soit la cible. S'il réussit, le sort se dissipe aussitôt sans revenir vers l'utilisateur.</p>\n<p>L'objet réussit son lancer, sans jet de dés. Lancer un sort via un objet magique n'est pas plus économique en points de rêve que de la lancer soi-même, mais évite la montée en TMR, les rencontres, et confère la certitude que le sort partira à coup sûr. L'effet d'un sort lancé par un objet peut être annulé par Annulatrion de Magie, mais pas par Annulation de ses Propres Zones ni Annulation de ses Propres Illusions.</p>\n<p>Chaque gemme d'un objet ne peut recevoir qu'une seule écaille d'activité, et la pose de cette dernière coûte un point de seuil. Une écaille d'activité ne peut enregistrer et lancer q'un seul sort. Mais un même objet peut avoir plusieurs gemmes, grâce à Individualité, chacune possédant une écaille d'activité pour lancer un sort différent.</p>","draconic":"narcos","duree":"Instantanée","JR":"Aucun","cible":"","difficulte":"-9","portée":"","caseTMR":"desolation","caseTMRspeciale":"","ptreve":"7","portee":"","isrituel":true,"coutseuil":1,"xp":0,"bonuscase":""},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_narcos.webp","effects":[]}
|
||||||
{"_id":"xOicgRMCUxJNmVzF","name":"Détection d'aura","type":"sort","img":"systems/foundryvtt-reve-de-dragon/icons/competence_vigilance.webp","data":{"description":"<p>Les rituels de Détection d’Aura peuvent indifféremment être accomplis par n’importe laquelle des quatre voies.</p>\n<p>Toutes les créatures vivantes animées (humains, humanoïdes, animaux) ont une caractéristique RÊVE. Les objets enchantés possèdent des points de rêve, de même que les produits de magie naturelle, comme certaines pierres de chance. Les entités de cauchemar, incarnées ou non, en ont également. Quelle qu’elle soit, la présence de rêve émet une aura, laquelle est détectable par Détection d’Aura. Parallèlement, toute cible d’un sort ou d’un rituel, émet une aura propre, quand bien même ladite cible ne possède pas de points de rêve (centre de zone, objet ou plante soumis à une illusion d’Hypnos). Cette aura est également détectable par Détection d’Aura.</p>\n<p>L’aura de présence de rêve se traduit par un halo bleuté constant ; l’aura résultant d’un effet magique par un halo parcouru de pulsations. Quand les deux auras sont présentes conjointement, le halo est pulsatif et d’un bleu plus foncé. On peut toujours effectuer Détection d’Aura sans aucun risque, il y a toujours une réponse. Soit une aura est perçue, constante ou pulsative, et l’on peut tenter une Lecture d’Aura pour en savoir plus ; soit aucune aura n’est perçue et il s’agit de matière inerte, sans rêve, non soumise à un sort.</p>","descriptionmj":"","draconic":"oniros","duree":"Instantanée","JR":"Aucun","cible":"","difficulte":"-3","portée":"","caseTMR":"sanctuaire","caseTMRspeciale":"","ptreve":"1","xp":0,"bonuscase":"","isrituel":true,"coutseuil":0,"portee":""},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"Q2G6GTdrotKzYGUC":3},"flags":{}}
|
{"_id":"xOicgRMCUxJNmVzF","name":"Détection d'aura","permission":{"default":0,"Q2G6GTdrotKzYGUC":3},"type":"sort","data":{"description":"<p>Les rituels de Détection d’Aura peuvent indifféremment être accomplis par n’importe laquelle des quatre voies.</p>\n<p>Toutes les créatures vivantes animées (humains, humanoïdes, animaux) ont une caractéristique RÊVE. Les objets enchantés possèdent des points de rêve, de même que les produits de magie naturelle, comme certaines pierres de chance. Les entités de cauchemar, incarnées ou non, en ont également. Quelle qu’elle soit, la présence de rêve émet une aura, laquelle est détectable par Détection d’Aura. Parallèlement, toute cible d’un sort ou d’un rituel, émet une aura propre, quand bien même ladite cible ne possède pas de points de rêve (centre de zone, objet ou plante soumis à une illusion d’Hypnos). Cette aura est également détectable par Détection d’Aura.</p>\n<p>L’aura de présence de rêve se traduit par un halo bleuté constant ; l’aura résultant d’un effet magique par un halo parcouru de pulsations. Quand les deux auras sont présentes conjointement, le halo est pulsatif et d’un bleu plus foncé. On peut toujours effectuer Détection d’Aura sans aucun risque, il y a toujours une réponse. Soit une aura est perçue, constante ou pulsative, et l’on peut tenter une Lecture d’Aura pour en savoir plus ; soit aucune aura n’est perçue et il s’agit de matière inerte, sans rêve, non soumise à un sort.</p>","draconic":"oniros","duree":"Instantanée","JR":"Aucun","cible":"","difficulte":"-3","portée":"","caseTMR":"sanctuaire","caseTMRspeciale":"","ptreve":"1","xp":0,"bonuscase":"","isrituel":false,"coutseuil":0},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_vigilance.webp","effects":[]}
|
||||||
{"_id":"zT72qy3Xb8ye9YKb","name":"Bouilloire de Mélimnod *","permission":{"default":0,"6ibmdmaeRSMTjU4c":3},"type":"sort","data":{"description":"<p>La Grande Écaille <em>Bouilloire de Mélimnod</em>, du nom d'un célèbre haut-rêvant du Second Âge, est un exemple abordable d'objet autonome. Elle doit être posée sur une bouilloire ou un petit chaudron intégralement fait d'argent, de cuivre ou d'étain, à l'exclusion de tout autre métal, d'une capacité de 2 mesures (40 centilitres). La gemme peut être incrustée dans le fond du récipient ou participer à son alliage. A la fin de l'enchantement, avant l'accomplissement de Permanence, elle doit posséder au minimum 1 point de rêve actif. (Le maximum étant comme toujours 7 fois son enchantabilité.) Puis, à la place de Maîtrise, il est obligatoire d'accomplir le rituel d'Autonomie (qui coûte 2 points de seuil). La Grande Écaille peut alors être posée. Il n'en est besoin que d'une seule.</p>\n<p>Dès que la bouilloire se retrouve pleine d'eau (2 mesures), ou d'un liquide appartenant à l'élément Eau, elle se met à chauffer spontanément et porte le liquide à ébullition ern l'espace d'un seul round. Au bout d'un second round, le liquide est réduit de moitié (une mesure). Puis la bouilloire le fait refroidir, et il se retrouve tout juste tiède au bout d'un troisième round. Il peut alors demeurer indéfiniment dans la bouilloire ou être transvasé, mais dès que la bouilloire se retrouve <em>intégralement</em> pleine, le processus recommence. Chaque chauffe lui coûte un de ses points de rêve actifs. Le rituel d'Autonomie les lui fait récupérer à raison de 3 par heure de complète non-utilisation.</p>\n<p>Il est bien entendu possible de mettre des herbes de soin dans la bouilloire avant d'y verser l'eau, de façon à obtenir une décoction en un temps record. Etant autonome, la Bouilloire de Mélimnod n'a pas être maîtrisée. La pose de la Grande Écaille coûte 1 point de seuil.</p>","draconic":"narcos","duree":"Instantanée","JR":"Aucun","cible":"","difficulte":"-9","portée":"","caseTMR":"special","caseTMRspeciale":"Monts Brûlants E5","ptreve":"9","portee":"","isrituel":true,"coutseuil":1,"xp":0,"bonuscase":""},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_narcos.webp","effects":[]}
|
{"_id":"zT72qy3Xb8ye9YKb","name":"Bouilloire de Mélimnod *","permission":{"default":0,"6ibmdmaeRSMTjU4c":3},"type":"sort","data":{"description":"<p>La Grande Écaille <em>Bouilloire de Mélimnod</em>, du nom d'un célèbre haut-rêvant du Second Âge, est un exemple abordable d'objet autonome. Elle doit être posée sur une bouilloire ou un petit chaudron intégralement fait d'argent, de cuivre ou d'étain, à l'exclusion de tout autre métal, d'une capacité de 2 mesures (40 centilitres). La gemme peut être incrustée dans le fond du récipient ou participer à son alliage. A la fin de l'enchantement, avant l'accomplissement de Permanence, elle doit posséder au minimum 1 point de rêve actif. (Le maximum étant comme toujours 7 fois son enchantabilité.) Puis, à la place de Maîtrise, il est obligatoire d'accomplir le rituel d'Autonomie (qui coûte 2 points de seuil). La Grande Écaille peut alors être posée. Il n'en est besoin que d'une seule.</p>\n<p>Dès que la bouilloire se retrouve pleine d'eau (2 mesures), ou d'un liquide appartenant à l'élément Eau, elle se met à chauffer spontanément et porte le liquide à ébullition ern l'espace d'un seul round. Au bout d'un second round, le liquide est réduit de moitié (une mesure). Puis la bouilloire le fait refroidir, et il se retrouve tout juste tiède au bout d'un troisième round. Il peut alors demeurer indéfiniment dans la bouilloire ou être transvasé, mais dès que la bouilloire se retrouve <em>intégralement</em> pleine, le processus recommence. Chaque chauffe lui coûte un de ses points de rêve actifs. Le rituel d'Autonomie les lui fait récupérer à raison de 3 par heure de complète non-utilisation.</p>\n<p>Il est bien entendu possible de mettre des herbes de soin dans la bouilloire avant d'y verser l'eau, de façon à obtenir une décoction en un temps record. Etant autonome, la Bouilloire de Mélimnod n'a pas être maîtrisée. La pose de la Grande Écaille coûte 1 point de seuil.</p>","draconic":"narcos","duree":"Instantanée","JR":"Aucun","cible":"","difficulte":"-9","portée":"","caseTMR":"special","caseTMRspeciale":"Monts Brûlants E5","ptreve":"9","portee":"","isrituel":true,"coutseuil":1,"xp":0,"bonuscase":""},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_narcos.webp","effects":[]}
|
||||||
|
File diff suppressed because one or more lines are too long
@ -11,7 +11,7 @@
|
|||||||
{"_id":"O1QllxIvIkWxntmO","name":"Animer un squelette","permission":{"default":0,"6ibmdmaeRSMTjU4c":3},"type":"sort","data":{"description":"<p>En invoquant les forces du cauchemar à venir hanter un corps mort, le haut-rêvant de Thanatos crée un hideux simulacre de vie. Sous l'effet du rituel, le cadavre se décompose à vue d'oeil, se dépouillant de toute chair, jusqu'à ce qu'il n'en reste plus que les os, magiquement liés. Le squelette se redresse alors en position verticale, capable de se déplacer sur ses jambes en une parodie de vie réelle, utilisant se smains griffues pour attaquer. Ainsi créé, le squelette est en tout point semblable à l'entité de cauchemar incarnée du même nom, tant au niveau de ses caractéristiques que de ses compétences (voir livre III, page 225). Sa caractéristique TAILLE est celle du cadavre utilisé, sa caractéristique RÊVE est égale au nombre de points de rêve dépensés par le haut-rêvant, sachant que comme pour les zombis, et contrairement aux entités de cauchemar incarnées qui peuvent dépasser cette limite, la caractéristique RÊVE d'un squelette invoqué ne peut jamais dépasser sa caractéristique TAILLE. Sa hideur est telle que quiconque l'aperçoit doit réussir un jet de VOLONTÉ à -3 ou être en demi-surprise jusqu'à la fin du round suivant.</p>\n<p>Un squelette invoqué est aux ordres de son invocateur et n'agit qu'aux ordres reçus. Pour donner un nouvel ordre à son squelette, le haut-rêvant de Thanatos doit s'en trouver à une portée maximale égale à E1. A la mort de son invocateur, le squelette n'est pas détruit, mais devient une entité sauvage, se comportant librement comme l'entitéde cauchemar incarnée du même nom.</p>","draconic":"thanatos","duree":"Permanente","JR":"Aucun","cible":"Un cadavre","difficulte":"-9","portée":"","caseTMR":"necropole","caseTMRspeciale":"","ptreve":"1+","portee":"","isrituel":true},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_thanatos.webp","effects":[]}
|
{"_id":"O1QllxIvIkWxntmO","name":"Animer un squelette","permission":{"default":0,"6ibmdmaeRSMTjU4c":3},"type":"sort","data":{"description":"<p>En invoquant les forces du cauchemar à venir hanter un corps mort, le haut-rêvant de Thanatos crée un hideux simulacre de vie. Sous l'effet du rituel, le cadavre se décompose à vue d'oeil, se dépouillant de toute chair, jusqu'à ce qu'il n'en reste plus que les os, magiquement liés. Le squelette se redresse alors en position verticale, capable de se déplacer sur ses jambes en une parodie de vie réelle, utilisant se smains griffues pour attaquer. Ainsi créé, le squelette est en tout point semblable à l'entité de cauchemar incarnée du même nom, tant au niveau de ses caractéristiques que de ses compétences (voir livre III, page 225). Sa caractéristique TAILLE est celle du cadavre utilisé, sa caractéristique RÊVE est égale au nombre de points de rêve dépensés par le haut-rêvant, sachant que comme pour les zombis, et contrairement aux entités de cauchemar incarnées qui peuvent dépasser cette limite, la caractéristique RÊVE d'un squelette invoqué ne peut jamais dépasser sa caractéristique TAILLE. Sa hideur est telle que quiconque l'aperçoit doit réussir un jet de VOLONTÉ à -3 ou être en demi-surprise jusqu'à la fin du round suivant.</p>\n<p>Un squelette invoqué est aux ordres de son invocateur et n'agit qu'aux ordres reçus. Pour donner un nouvel ordre à son squelette, le haut-rêvant de Thanatos doit s'en trouver à une portée maximale égale à E1. A la mort de son invocateur, le squelette n'est pas détruit, mais devient une entité sauvage, se comportant librement comme l'entitéde cauchemar incarnée du même nom.</p>","draconic":"thanatos","duree":"Permanente","JR":"Aucun","cible":"Un cadavre","difficulte":"-9","portée":"","caseTMR":"necropole","caseTMRspeciale":"","ptreve":"1+","portee":"","isrituel":true},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_thanatos.webp","effects":[]}
|
||||||
{"_id":"W0JXIoChz3IXuaCc","name":"Putrescence","permission":{"default":0,"6ibmdmaeRSMTjU4c":3},"type":"sort","data":{"description":"<p>L'effet de Putrescence ne peut être ciblé que sur un objet. L'effet est un vieilllissement instantané de plusieurs années, supposé s'être accompli dans les pires concditions, avec pour résultat un délabrement, une putrescence de l'objet. Le vieillissement est de 10 ans par point de rêve dépensé.</p>\n<p>Dans tous les cas, c'est au gardien des rêves de juger de l'état final de l'objet en se souvenant que les conditions de vieillissement sont censées avoir été très mauvaises : humidité, moisissure, chaud et froid, etc. Ainsi dix ans seront suffisants pour venir à bout du tissu et du papier, vingt ans pour du parchemin ou du cuir souple, trente pour du cuir épais et du bois léger. Quarante ans et plus auront presque entièrement dévoré de rouille le métal ferreux et corrompu le bois épais, tout dépendant de leur qualité initiale. Noter par contre que verre et céramique sont pratiquement imprutescibles. La putrescence étant instantanée et définitive, l'objet altéré ne dispense aucune aura. </p>","draconic":"thanatos","duree":"Permanente","JR":"Aucun","cible":"Un objet","difficulte":"-8","portée":"","caseTMR":"marais","caseTMRspeciale":"","ptreve":"1+","portee":""},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_thanatos.webp","effects":[]}
|
{"_id":"W0JXIoChz3IXuaCc","name":"Putrescence","permission":{"default":0,"6ibmdmaeRSMTjU4c":3},"type":"sort","data":{"description":"<p>L'effet de Putrescence ne peut être ciblé que sur un objet. L'effet est un vieilllissement instantané de plusieurs années, supposé s'être accompli dans les pires concditions, avec pour résultat un délabrement, une putrescence de l'objet. Le vieillissement est de 10 ans par point de rêve dépensé.</p>\n<p>Dans tous les cas, c'est au gardien des rêves de juger de l'état final de l'objet en se souvenant que les conditions de vieillissement sont censées avoir été très mauvaises : humidité, moisissure, chaud et froid, etc. Ainsi dix ans seront suffisants pour venir à bout du tissu et du papier, vingt ans pour du parchemin ou du cuir souple, trente pour du cuir épais et du bois léger. Quarante ans et plus auront presque entièrement dévoré de rouille le métal ferreux et corrompu le bois épais, tout dépendant de leur qualité initiale. Noter par contre que verre et céramique sont pratiquement imprutescibles. La putrescence étant instantanée et définitive, l'objet altéré ne dispense aucune aura. </p>","draconic":"thanatos","duree":"Permanente","JR":"Aucun","cible":"Un objet","difficulte":"-8","portée":"","caseTMR":"marais","caseTMRspeciale":"","ptreve":"1+","portee":""},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_thanatos.webp","effects":[]}
|
||||||
{"_id":"XldJiyXL4gSrfx4t","name":"Surdité","permission":{"default":0,"6ibmdmaeRSMTjU4c":3},"type":"sort","data":{"description":"<p>Quand la victime est entièrement possédée de corps, le haut-rêvant de Thanatos peut commencer l'envoûtement de Surdité. Chaque ensemble de 2 points de rêve dépensés (2r), fait perdre 1 point de caractéristique OUÏE à la victime. A zéro point d'OUÏE, elle est totalement sourde. La surdité semble inexplicable, et aucune médecine ne peut la guérir. Annuler la possession brise en même temps l'envoûtement de Cécité, et la victime recouvre instantanément toute son OUÏE.</p>","draconic":"thanatos","duree":"Illimitée","JR":"Aucun","cible":"Relique","difficulte":"-6","portée":"","caseTMR":"gouffre","caseTMRspeciale":"","ptreve":"2+","portee":""},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_thanatos.webp","effects":[]}
|
{"_id":"XldJiyXL4gSrfx4t","name":"Surdité","permission":{"default":0,"6ibmdmaeRSMTjU4c":3},"type":"sort","data":{"description":"<p>Quand la victime est entièrement possédée de corps, le haut-rêvant de Thanatos peut commencer l'envoûtement de Surdité. Chaque ensemble de 2 points de rêve dépensés (2r), fait perdre 1 point de caractéristique OUÏE à la victime. A zéro point d'OUÏE, elle est totalement sourde. La surdité semble inexplicable, et aucune médecine ne peut la guérir. Annuler la possession brise en même temps l'envoûtement de Cécité, et la victime recouvre instantanément toute son OUÏE.</p>","draconic":"thanatos","duree":"Illimitée","JR":"Aucun","cible":"Relique","difficulte":"-6","portée":"","caseTMR":"gouffre","caseTMRspeciale":"","ptreve":"2+","portee":""},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_thanatos.webp","effects":[]}
|
||||||
{"_id":"Y4r9kTN2brWC2N0n","name":"Lecture d'aura","type":"sort","img":"systems/foundryvtt-reve-de-dragon/icons/competence_vigilance.webp","data":{"description":"<p>Les rituels de Lecture d’Aura peuvent indifféremment être accomplis par n’importe laquelle des quatre voies.</p>\n<p>Ce rituel permet d’approfondir les informations fournies par Détection d’Aura. Pratiquer Lecture d’Aura quand il n’y a pas d’aura revient à demander une magie impossible et crée immédiatement une déchirure du rêve.</p>\n<p>Lecture d’Aura est effectuée en plusieurs étapes, toutes étant de difficulté R-3 et coûtant 3 points de rêve. La première a toujours lieu dans un sanctuaire et ne fait que révéler dans quel(s) autre(s) genre(s) de case(s) le haut-rêvant doit se rendre pour continuer sa lecture. Là, il apprend quel genre de magie a été produit ou à quel type de rêve il a affaire, de même que les cases spécifiques concernées. Enfin dans les cases spécifiques, le haut-rêvant peut apprendre la force du rêve ou de la magie en cours, c’est-à-dire pratiquement la difficulté et le nombre de points de rêve impliqués, information indispensable dans l’optique d’une annulation de magie.</p>\n<p>Lecture d’Aura révèle également la couleur de l’aura (fixe ou pulsative) comme Détection d’Aura. Pour les créatures vivantes, on peut donc sauter l’étape de Détection d’Aura et commencer directement par la lecture, puisqu’on est sûr de trouver une aura. Dans les autres cas, il est plus prudent de commencer par la détection si, en l’absence finale d’une aura, on ne veut pas créer de magie impossible. Effectuée sur une créature non soumise à un effet magique ni sous l’emprise d’une entité, Lecture d’Aura indique toujours le Fleuve. Là, dans n’importe quelle case du Fleuve, le haut-rêvant se contente d’apprendre qu’il a affaire à une créature vivante et douée de rêve.</p>","descriptionmj":"","draconic":"oniros","duree":"Instantanée","JR":"Aucun","cible":"","difficulte":"-3","portée":"","caseTMR":"special","caseTMRspeciale":"Sanctuaire / variable","ptreve":"3","xp":0,"bonuscase":"","isrituel":true,"coutseuil":0,"portee":""},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"Q2G6GTdrotKzYGUC":3},"flags":{}}
|
{"_id":"Y4r9kTN2brWC2N0n","name":"Lecture d'aura","permission":{"default":0,"Q2G6GTdrotKzYGUC":3},"type":"sort","data":{"description":"<p>Les rituels de Lecture d’Aura peuvent indifféremment être accomplis par n’importe laquelle des quatre voies.</p>\n<p>Ce rituel permet d’approfondir les informations fournies par Détection d’Aura. Pratiquer Lecture d’Aura quand il n’y a pas d’aura revient à demander une magie impossible et crée immédiatement une déchirure du rêve.</p>\n<p>Lecture d’Aura est effectuée en plusieurs étapes, toutes étant de difficulté R-3 et coûtant 3 points de rêve. La première a toujours lieu dans un sanctuaire et ne fait que révéler dans quel(s) autre(s) genre(s) de case(s) le haut-rêvant doit se rendre pour continuer sa lecture. Là, il apprend quel genre de magie a été produit ou à quel type de rêve il a affaire, de même que les cases spécifiques concernées. Enfin dans les cases spécifiques, le haut-rêvant peut apprendre la force du rêve ou de la magie en cours, c’est-à-dire pratiquement la difficulté et le nombre de points de rêve impliqués, information indispensable dans l’optique d’une annulation de magie.</p>\n<p>Lecture d’Aura révèle également la couleur de l’aura (fixe ou pulsative) comme Détection d’Aura. Pour les créatures vivantes, on peut donc sauter l’étape de Détection d’Aura et commencer directement par la lecture, puisqu’on est sûr de trouver une aura. Dans les autres cas, il est plus prudent de commencer par la détection si, en l’absence finale d’une aura, on ne veut pas créer de magie impossible. Effectuée sur une créature non soumise à un effet magique ni sous l’emprise d’une entité, Lecture d’Aura indique toujours le Fleuve. Là, dans n’importe quelle case du Fleuve, le haut-rêvant se contente d’apprendre qu’il a affaire à une créature vivante et douée de rêve.</p>","draconic":"oniros","duree":"Instantanée","JR":"Aucun","cible":"","difficulte":"-3","portée":"","caseTMR":"special","caseTMRspeciale":"Sanctuaire / variable","ptreve":"3","xp":0},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_vigilance.webp","effects":[]}
|
||||||
{"_id":"cM9eo2VuJSCkIZvd","name":"Cécité","permission":{"default":0,"6ibmdmaeRSMTjU4c":3},"type":"sort","data":{"description":"<p>Quand la victime est entièrement possédée de corps, le haut-rêvant de Thanatos peut commencer l'envoûtement de Cécité. Chaque ensemble de 2 points de rêve dépensés (2r), fait perdre 1 point de caractéristique VUE à la victime. A zéro point de VUE, elle est aveugle. La cécité semble inexplicable, et aucune médecine ne peut la guérir. Annuler la possession brise en même temps l'envoûtement de Cécité, et la victime recouvre instantanément toute sa VUE.</p>","draconic":"thanatos","duree":"Illimitée","JR":"Aucun","cible":"Relique","difficulte":"-8","portée":"","caseTMR":"cite","caseTMRspeciale":"","ptreve":"2+","portee":""},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_thanatos.webp","effects":[]}
|
{"_id":"cM9eo2VuJSCkIZvd","name":"Cécité","permission":{"default":0,"6ibmdmaeRSMTjU4c":3},"type":"sort","data":{"description":"<p>Quand la victime est entièrement possédée de corps, le haut-rêvant de Thanatos peut commencer l'envoûtement de Cécité. Chaque ensemble de 2 points de rêve dépensés (2r), fait perdre 1 point de caractéristique VUE à la victime. A zéro point de VUE, elle est aveugle. La cécité semble inexplicable, et aucune médecine ne peut la guérir. Annuler la possession brise en même temps l'envoûtement de Cécité, et la victime recouvre instantanément toute sa VUE.</p>","draconic":"thanatos","duree":"Illimitée","JR":"Aucun","cible":"Relique","difficulte":"-8","portée":"","caseTMR":"cite","caseTMRspeciale":"","ptreve":"2+","portee":""},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_thanatos.webp","effects":[]}
|
||||||
{"_id":"dK54iZkb7ypIuKwn","name":"Peur thanataire","permission":{"default":0,"6ibmdmaeRSMTjU4c":3},"type":"sort","data":{"description":"<p>Le sort de Peur Thanataire doit être ciblé sur un objet, lequel, et jusqu'à la fin de l'heure de naissance du haut-rêvant, distillera ensuite une peur intense. Toute personne apercevant l'objet en question et manquant un jet de résistance standard r-8, sera contrainte de s'en détourner, ne pouvant supporter de le regarder ni de s'en approcher ou le regarder le(s) round(s) suivant(s), il faudra réussir unjet de VOLONTÉ ajusté négativement aux points de rêve dépensés. Même chose pour le toucher, le prendre, le frapper. Ce jet de VOLONTÉ doit être renouvelé de round en round jusqu'à ce qui réussisse.</p>\n<p>Le haut-rêvant de Thanatos est lui-même immunisé contre les effets de sa peur thanataire. Par ailleurs, comme c'est la seule vue de l'objet qui déclenche la peur, il n'y a aucun effet tant que l'objet est dissimulé, dans une poche par exemple.</p>","draconic":"thanatos","duree":"HN","JR":"r-8","cible":"Un objet","difficulte":"-9","portée":"","caseTMR":"lac","caseTMRspeciale":"","ptreve":"1+","portee":""},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_thanatos.webp","effects":[]}
|
{"_id":"dK54iZkb7ypIuKwn","name":"Peur thanataire","permission":{"default":0,"6ibmdmaeRSMTjU4c":3},"type":"sort","data":{"description":"<p>Le sort de Peur Thanataire doit être ciblé sur un objet, lequel, et jusqu'à la fin de l'heure de naissance du haut-rêvant, distillera ensuite une peur intense. Toute personne apercevant l'objet en question et manquant un jet de résistance standard r-8, sera contrainte de s'en détourner, ne pouvant supporter de le regarder ni de s'en approcher ou le regarder le(s) round(s) suivant(s), il faudra réussir unjet de VOLONTÉ ajusté négativement aux points de rêve dépensés. Même chose pour le toucher, le prendre, le frapper. Ce jet de VOLONTÉ doit être renouvelé de round en round jusqu'à ce qui réussisse.</p>\n<p>Le haut-rêvant de Thanatos est lui-même immunisé contre les effets de sa peur thanataire. Par ailleurs, comme c'est la seule vue de l'objet qui déclenche la peur, il n'y a aucun effet tant que l'objet est dissimulé, dans une poche par exemple.</p>","draconic":"thanatos","duree":"HN","JR":"r-8","cible":"Un objet","difficulte":"-9","portée":"","caseTMR":"lac","caseTMRspeciale":"","ptreve":"1+","portee":""},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_thanatos.webp","effects":[]}
|
||||||
{"_id":"gZHrkEnR88mEv67I","name":"Griffe de Thanatos *","permission":{"default":0,"6ibmdmaeRSMTjU4c":3},"type":"sort","data":{"description":"<p>Placée en guise d'écaille de pouvoir sur un objet enchanté, la griffe de Thanatos n'est qu'un piège. Son fonctionnement intervient au moment de la maîtrise. Cette dernière est automatique, comme avec les écailles de Narcos, mais au lieu de coûter des points de rêve, elle coûte un nombre de <em>points de vie</em> égal au nombre de griffes, chaque point de vie perdu s'accompagnant d'une perte d'1d6 points d'endurance. Il n'y a pas de jet de résistance. La maîtrise (et la perte de points de vie) a lieu au moment où l'objet contenant la griffe est utilisé selon sa fonction : arme frappant, bague au doigt, bracelet au poignet, etc. Si l'objet n'a pas de fonction évidente, statuette, bibelot, ou s'il n'est qu'une gemme seule, la maîtrise a lieu dès que l'objet est pris dasn la main nue.</p>\n<p>Un objet peut n'avoir qu'une gemme contenant une ou plusieurs griffes de Thanatos, ce n'est alors qu'un piège en soi ; il peut avoir avoir plusieurs gemmes, grâce à Individualité, certaines possédant des pouvoirs réels (écailles de Narcos), et l'une d'entre elles ne possédant que des griffes de Thanatos. La maîtrise de la grifef (perte de points de vie) accompagne alors la maîtrise de chacun des vrais pouvoirs. Le créateur de l'objet, le maîtrisant tacitement, n'a pas à subir de perte de points de vie, mais si l'objet est maîtrisé par quelqu'un d'autre et lui revient, il en subit les conséquences. Les points de vie perdus sont regagnés selon la règle normale.</p>","draconic":"thanatos","duree":"Permanente","JR":"Aucun","cible":"","difficulte":"-8","portée":"","caseTMR":"necropole","caseTMRspeciale":"","ptreve":"8","portee":"","isrituel":true,"coutseuil":1},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_thanatos.webp","effects":[]}
|
{"_id":"gZHrkEnR88mEv67I","name":"Griffe de Thanatos *","permission":{"default":0,"6ibmdmaeRSMTjU4c":3},"type":"sort","data":{"description":"<p>Placée en guise d'écaille de pouvoir sur un objet enchanté, la griffe de Thanatos n'est qu'un piège. Son fonctionnement intervient au moment de la maîtrise. Cette dernière est automatique, comme avec les écailles de Narcos, mais au lieu de coûter des points de rêve, elle coûte un nombre de <em>points de vie</em> égal au nombre de griffes, chaque point de vie perdu s'accompagnant d'une perte d'1d6 points d'endurance. Il n'y a pas de jet de résistance. La maîtrise (et la perte de points de vie) a lieu au moment où l'objet contenant la griffe est utilisé selon sa fonction : arme frappant, bague au doigt, bracelet au poignet, etc. Si l'objet n'a pas de fonction évidente, statuette, bibelot, ou s'il n'est qu'une gemme seule, la maîtrise a lieu dès que l'objet est pris dasn la main nue.</p>\n<p>Un objet peut n'avoir qu'une gemme contenant une ou plusieurs griffes de Thanatos, ce n'est alors qu'un piège en soi ; il peut avoir avoir plusieurs gemmes, grâce à Individualité, certaines possédant des pouvoirs réels (écailles de Narcos), et l'une d'entre elles ne possédant que des griffes de Thanatos. La maîtrise de la grifef (perte de points de vie) accompagne alors la maîtrise de chacun des vrais pouvoirs. Le créateur de l'objet, le maîtrisant tacitement, n'a pas à subir de perte de points de vie, mais si l'objet est maîtrisé par quelqu'un d'autre et lui revient, il en subit les conséquences. Les points de vie perdus sont regagnés selon la règle normale.</p>","draconic":"thanatos","duree":"Permanente","JR":"Aucun","cible":"","difficulte":"-8","portée":"","caseTMR":"necropole","caseTMRspeciale":"","ptreve":"8","portee":"","isrituel":true,"coutseuil":1},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_thanatos.webp","effects":[]}
|
||||||
@ -20,6 +20,6 @@
|
|||||||
{"_id":"wGXeubRhLPScDkNF","name":"Possession d'Esprit","permission":{"default":0,"6ibmdmaeRSMTjU4c":3},"type":"sort","data":{"description":"<p>Pour posséder d'esprit une victime, le haut-rêvant de Thanatos doit prendre son entière volonté sous son contrôle. Le ciblage du rituel doit s'effectuer en touchant la relique. Pour chaque ensemble de 2 points de rêve dépensés (2r), le haut-rêvant contrôle 1 point de VOLONTÉ de sa victime. Dès qu'il la contrôle entièrement, elle est possédée d'esprit. Pour posséder une victime ayant une VOLONTÉ de 14, il faut ainsi dépenser 28 points de rêve. Le haut-rêvant peut s'y prendre en plusieurs fois, mais la victime a droit à un JR à chaque fois, et il suffit qu'un seul d'entre eux réussisse pour annuler toute la possessions précédemment accomplie ; simultanément, le haut-rêvant de Thanataos doit lui-même réussir un JR r0 (points de rêve à zéro) ou être frappé en retour par un souffle de Dragon. </p>\n<p><em>Note</em>. Le haut-rêvant ne fait que <em>contrôler</em> la VOLONTÉ de sa victime, celle-ci n'en perd aucun point. Tant qu'aucun envoûtement n'est à l'oeuvre, il n'y a aucun effet mental, et la victime ne se rend même compte de rien.</p>","draconic":"thanatos","duree":"Illimitée","JR":"Avec HN r-9, sans HN r-8","cible":"Relique","difficulte":"-9","portée":"","caseTMR":"lac","caseTMRspeciale":"","ptreve":"2+","portee":"","isrituel":true},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_thanatos.webp","effects":[]}
|
{"_id":"wGXeubRhLPScDkNF","name":"Possession d'Esprit","permission":{"default":0,"6ibmdmaeRSMTjU4c":3},"type":"sort","data":{"description":"<p>Pour posséder d'esprit une victime, le haut-rêvant de Thanatos doit prendre son entière volonté sous son contrôle. Le ciblage du rituel doit s'effectuer en touchant la relique. Pour chaque ensemble de 2 points de rêve dépensés (2r), le haut-rêvant contrôle 1 point de VOLONTÉ de sa victime. Dès qu'il la contrôle entièrement, elle est possédée d'esprit. Pour posséder une victime ayant une VOLONTÉ de 14, il faut ainsi dépenser 28 points de rêve. Le haut-rêvant peut s'y prendre en plusieurs fois, mais la victime a droit à un JR à chaque fois, et il suffit qu'un seul d'entre eux réussisse pour annuler toute la possessions précédemment accomplie ; simultanément, le haut-rêvant de Thanataos doit lui-même réussir un JR r0 (points de rêve à zéro) ou être frappé en retour par un souffle de Dragon. </p>\n<p><em>Note</em>. Le haut-rêvant ne fait que <em>contrôler</em> la VOLONTÉ de sa victime, celle-ci n'en perd aucun point. Tant qu'aucun envoûtement n'est à l'oeuvre, il n'y a aucun effet mental, et la victime ne se rend même compte de rien.</p>","draconic":"thanatos","duree":"Illimitée","JR":"Avec HN r-9, sans HN r-8","cible":"Relique","difficulte":"-9","portée":"","caseTMR":"lac","caseTMRspeciale":"","ptreve":"2+","portee":"","isrituel":true},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_thanatos.webp","effects":[]}
|
||||||
{"_id":"wuqqLld48IagimXp","name":"Poing de Thanatos","permission":{"default":0,"6ibmdmaeRSMTjU4c":3},"type":"sort","data":{"description":"<p>Le Poing de Thanatos peut être dirigé contre toute créature, humanoïde ou animal. Son effet, instantané, est celui d'un violent coup de poing en pleine tête, ne causant toutefois ses dommages que sur la table des Coups non mortels. Le +dom de l'agression est égal au nombre de points de rêve dépensés. Sauf pour les animaux qui peuvent faire jouer entièrement leur protection naturelle ainsi que pour les humanoïdes de grande TAILLE qui en possèdent, la protection applicable peut être au maximum de 2 points. Si la victime réussit son JR standard r-8, le haut-rêvant de Thanatos doit jouer un JR r0 (points de rêve à zéro) ou subir l'effet de son sort en retour.</p>","draconic":"thanatos","duree":"Instantanée","JR":"r-8","cible":"Toutes créatures","difficulte":"-6","portée":"","caseTMR":"plaines","caseTMRspeciale":"","ptreve":"1+","portee":""},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_thanatos.webp","effects":[]}
|
{"_id":"wuqqLld48IagimXp","name":"Poing de Thanatos","permission":{"default":0,"6ibmdmaeRSMTjU4c":3},"type":"sort","data":{"description":"<p>Le Poing de Thanatos peut être dirigé contre toute créature, humanoïde ou animal. Son effet, instantané, est celui d'un violent coup de poing en pleine tête, ne causant toutefois ses dommages que sur la table des Coups non mortels. Le +dom de l'agression est égal au nombre de points de rêve dépensés. Sauf pour les animaux qui peuvent faire jouer entièrement leur protection naturelle ainsi que pour les humanoïdes de grande TAILLE qui en possèdent, la protection applicable peut être au maximum de 2 points. Si la victime réussit son JR standard r-8, le haut-rêvant de Thanatos doit jouer un JR r0 (points de rêve à zéro) ou subir l'effet de son sort en retour.</p>","draconic":"thanatos","duree":"Instantanée","JR":"r-8","cible":"Toutes créatures","difficulte":"-6","portée":"","caseTMR":"plaines","caseTMRspeciale":"","ptreve":"1+","portee":""},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_thanatos.webp","effects":[]}
|
||||||
{"_id":"xFkdsI0FnhCCszDR","name":"Métamorphose en bête","permission":{"default":0,"6ibmdmaeRSMTjU4c":3},"type":"sort","data":{"description":"<p>L'envoûtement de Métamorphose en bête peut être accompli sur une possession de corps ou d'esprit. Il s'agit de deux métamorphoses différentes devant faire l'objet d'envoûtements séparés.</p>\n<p>L'accomplissant sur une victime possédée d'esprit, le haut-rêvant de Thanatos transforme le mental de cette dernière en celui d'un animal de son choix. Le corps physique de la victime reste inchangé, mais son esprit, son comportement, ses instincts deviennent ceux de l'animal. La victime perd le sens de la parole et de la compréhension du langage pour ne plus s'exprimer que par des cris : aboiements, miaulements, sifflements, caquètements, etc. Le tout dans un corps normal.</p>\n<p>Sur une victime possédée de corps, le haut-rêvant transforme réellement son corps en celui d'un animal de son choix, dont la TAILLE finale ne peut être supérieure à celle de la victime et doit être au minimum de 1 (souris). Il ne s'agit pas d'une illusion : la transformation est réelle. Le nouveau gosier de la victime l'empêche de parler, mais elle continue à comprendre le langage. Son intelligence et son mental restent inchangés, mais dans un corps d'animal. Un haut-rêvant métamorphosé peut continuer à monter en TMR mais doit posséder l'équivalent d'un doigt pour cibler des sorts ailleurs que sur lui-même.</p>\n<p>Si les deux métamorphoses, d'esprit ou de corps, sont effectuées conjointement, la victime devient en tout point un animal réel.</p>\n<p>Annuler l'une ou l'autre possession brise en même temps l'envoûtement de Métamorphose correspondant, et la victime recouvre une part de son identité.</p>","draconic":"thanatos","duree":"Illimitée","JR":"Aucun","cible":"Relique","difficulte":"-10","portée":"","caseTMR":"fleuve","caseTMRspeciale":"","ptreve":"10","portee":""},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_thanatos.webp","effects":[]}
|
{"_id":"xFkdsI0FnhCCszDR","name":"Métamorphose en bête","permission":{"default":0,"6ibmdmaeRSMTjU4c":3},"type":"sort","data":{"description":"<p>L'envoûtement de Métamorphose en bête peut être accompli sur une possession de corps ou d'esprit. Il s'agit de deux métamorphoses différentes devant faire l'objet d'envoûtements séparés.</p>\n<p>L'accomplissant sur une victime possédée d'esprit, le haut-rêvant de Thanatos transforme le mental de cette dernière en celui d'un animal de son choix. Le corps physique de la victime reste inchangé, mais son esprit, son comportement, ses instincts deviennent ceux de l'animal. La victime perd le sens de la parole et de la compréhension du langage pour ne plus s'exprimer que par des cris : aboiements, miaulements, sifflements, caquètements, etc. Le tout dans un corps normal.</p>\n<p>Sur une victime possédée de corps, le haut-rêvant transforme réellement son corps en celui d'un animal de son choix, dont la TAILLE finale ne peut être supérieure à celle de la victime et doit être au minimum de 1 (souris). Il ne s'agit pas d'une illusion : la transformation est réelle. Le nouveau gosier de la victime l'empêche de parler, mais elle continue à comprendre le langage. Son intelligence et son mental restent inchangés, mais dans un corps d'animal. Un haut-rêvant métamorphosé peut continuer à monter en TMR mais doit posséder l'équivalent d'un doigt pour cibler des sorts ailleurs que sur lui-même.</p>\n<p>Si les deux métamorphoses, d'esprit ou de corps, sont effectuées conjointement, la victime devient en tout point un animal réel.</p>\n<p>Annuler l'une ou l'autre possession brise en même temps l'envoûtement de Métamorphose correspondant, et la victime recouvre une part de son identité.</p>","draconic":"thanatos","duree":"Illimitée","JR":"Aucun","cible":"Relique","difficulte":"-10","portée":"","caseTMR":"fleuve","caseTMRspeciale":"","ptreve":"10","portee":""},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_thanatos.webp","effects":[]}
|
||||||
{"_id":"xOicgRMCUxJNmVzF","name":"Détection d'aura","type":"sort","img":"systems/foundryvtt-reve-de-dragon/icons/competence_vigilance.webp","data":{"description":"<p>Les rituels de Détection d’Aura peuvent indifféremment être accomplis par n’importe laquelle des quatre voies.</p>\n<p>Toutes les créatures vivantes animées (humains, humanoïdes, animaux) ont une caractéristique RÊVE. Les objets enchantés possèdent des points de rêve, de même que les produits de magie naturelle, comme certaines pierres de chance. Les entités de cauchemar, incarnées ou non, en ont également. Quelle qu’elle soit, la présence de rêve émet une aura, laquelle est détectable par Détection d’Aura. Parallèlement, toute cible d’un sort ou d’un rituel, émet une aura propre, quand bien même ladite cible ne possède pas de points de rêve (centre de zone, objet ou plante soumis à une illusion d’Hypnos). Cette aura est également détectable par Détection d’Aura.</p>\n<p>L’aura de présence de rêve se traduit par un halo bleuté constant ; l’aura résultant d’un effet magique par un halo parcouru de pulsations. Quand les deux auras sont présentes conjointement, le halo est pulsatif et d’un bleu plus foncé. On peut toujours effectuer Détection d’Aura sans aucun risque, il y a toujours une réponse. Soit une aura est perçue, constante ou pulsative, et l’on peut tenter une Lecture d’Aura pour en savoir plus ; soit aucune aura n’est perçue et il s’agit de matière inerte, sans rêve, non soumise à un sort.</p>","descriptionmj":"","draconic":"oniros","duree":"Instantanée","JR":"Aucun","cible":"","difficulte":"-3","portée":"","caseTMR":"sanctuaire","caseTMRspeciale":"","ptreve":"1","xp":0,"bonuscase":"","isrituel":true,"coutseuil":0,"portee":""},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"Q2G6GTdrotKzYGUC":3},"flags":{}}
|
{"_id":"xOicgRMCUxJNmVzF","name":"Détection d'aura","permission":{"default":0,"Q2G6GTdrotKzYGUC":3},"type":"sort","data":{"description":"<p>Les rituels de Détection d’Aura peuvent indifféremment être accomplis par n’importe laquelle des quatre voies.</p>\n<p>Toutes les créatures vivantes animées (humains, humanoïdes, animaux) ont une caractéristique RÊVE. Les objets enchantés possèdent des points de rêve, de même que les produits de magie naturelle, comme certaines pierres de chance. Les entités de cauchemar, incarnées ou non, en ont également. Quelle qu’elle soit, la présence de rêve émet une aura, laquelle est détectable par Détection d’Aura. Parallèlement, toute cible d’un sort ou d’un rituel, émet une aura propre, quand bien même ladite cible ne possède pas de points de rêve (centre de zone, objet ou plante soumis à une illusion d’Hypnos). Cette aura est également détectable par Détection d’Aura.</p>\n<p>L’aura de présence de rêve se traduit par un halo bleuté constant ; l’aura résultant d’un effet magique par un halo parcouru de pulsations. Quand les deux auras sont présentes conjointement, le halo est pulsatif et d’un bleu plus foncé. On peut toujours effectuer Détection d’Aura sans aucun risque, il y a toujours une réponse. Soit une aura est perçue, constante ou pulsative, et l’on peut tenter une Lecture d’Aura pour en savoir plus ; soit aucune aura n’est perçue et il s’agit de matière inerte, sans rêve, non soumise à un sort.</p>","draconic":"oniros","duree":"Instantanée","JR":"Aucun","cible":"","difficulte":"-3","portée":"","caseTMR":"sanctuaire","caseTMRspeciale":"","ptreve":"1","xp":0},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_vigilance.webp","effects":[]}
|
||||||
{"_id":"xdWVcaPvSH8tNZIZ","name":"Tâche","permission":{"default":0,"6ibmdmaeRSMTjU4c":3},"type":"sort","data":{"description":"<p>Quand la victime est entièrement possédée d'esprit, le haut-rêvant de Thanatos peut l'obliger à accomplir une certaine tâche ou quête. Comem avec Interdiction, la tâche doit être possible par la VOLONTÉ normale de la victime : <em>dors !</em> ou <em>meurs !</em> sont impossibles. L'ordre doit être formulé de façon très précise, comme pour Interdiction, sauf que cette fois le seul verbe possible doit être à l'impératif affirmatif. C'est pareillement au gardien des rêves de juger des interprétations litigieuses. E<em>xemples : monte en haut de la tour ; brûle le livre noir, mets le feu au château, assassine le roi, etc. </em>La victime s'efforcera d'accomplir la tâche par les moyens les plus rapides et les plus efficaces. L'effet du sort prend fin dès que la tâche est accomplie ou que survient la fin de l'heure de la naissance de la victime. Le haut-rêvant peut renouveler la tâche de jour en jour ou en apporter une nouvelle, mais ne peut pas en faire coexister deux simultanément. Annuler la possession brise en même temps l'envoûtement de Tâche, et la victime recouvre instantanément toute sa liberté.</p>","draconic":"thanatos","duree":"HN de la victime","JR":"Aucun","cible":"Relique","difficulte":"-8","portée":"","caseTMR":"foret","caseTMRspeciale":"","ptreve":"8","portee":""},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_thanatos.webp","effects":[]}
|
{"_id":"xdWVcaPvSH8tNZIZ","name":"Tâche","permission":{"default":0,"6ibmdmaeRSMTjU4c":3},"type":"sort","data":{"description":"<p>Quand la victime est entièrement possédée d'esprit, le haut-rêvant de Thanatos peut l'obliger à accomplir une certaine tâche ou quête. Comem avec Interdiction, la tâche doit être possible par la VOLONTÉ normale de la victime : <em>dors !</em> ou <em>meurs !</em> sont impossibles. L'ordre doit être formulé de façon très précise, comme pour Interdiction, sauf que cette fois le seul verbe possible doit être à l'impératif affirmatif. C'est pareillement au gardien des rêves de juger des interprétations litigieuses. E<em>xemples : monte en haut de la tour ; brûle le livre noir, mets le feu au château, assassine le roi, etc. </em>La victime s'efforcera d'accomplir la tâche par les moyens les plus rapides et les plus efficaces. L'effet du sort prend fin dès que la tâche est accomplie ou que survient la fin de l'heure de la naissance de la victime. Le haut-rêvant peut renouveler la tâche de jour en jour ou en apporter une nouvelle, mais ne peut pas en faire coexister deux simultanément. Annuler la possession brise en même temps l'envoûtement de Tâche, et la victime recouvre instantanément toute sa liberté.</p>","draconic":"thanatos","duree":"HN de la victime","JR":"Aucun","cible":"Relique","difficulte":"-8","portée":"","caseTMR":"foret","caseTMRspeciale":"","ptreve":"8","portee":""},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_thanatos.webp","effects":[]}
|
||||||
{"_id":"yCrVicu7rLWmMwxe","name":"Animer un zombi","permission":{"default":0,"6ibmdmaeRSMTjU4c":3},"type":"sort","data":{"description":"<p>Le principe d'animation du zombi est semblable à celui du squelette. Comme ce dernier, sa TAILLE est celle du cadavre utilisé, son RÊVE est égal aux points de rêve dépensés, avec un maximum égal à la TAILLE (voir le Livre III, page 225). Comme le squelette, le zombi n'obéit qu'aux ordres reçus, mêmes règles d'application.</p>\n<p>La différence esssentielle est que le rituel d'Animation de Zombi interrompt totalement le processus de putréfaction au lieu de l'accélérer. Une fois animé, un zombi reste dans l'état physique qui était le seien lors de l'accomplissement du rituel, sans plus jamais subir la moindre trace de décomposition. La conséquence est qu'un cadavre frais, dont la mort ne remonte qu'à quelques minutes ou quelques heures, une fois animé, ne se distingue des vivants que par une pâleur inhabituelle, un regard un peu fixe, et des lèvres un peu exsangues, mais pour peu qu'il ne fasse pas très clair ou que son maître l'ait bien emmitouflé, capable de passer pour un vivant. Pour cette raison, les zombis sont souvent préférés aux squelettes par les haut-rêvants de Thanatos plus circonspects et moins enclins au tape-à-l'oeil.</p>","draconic":"thanatos","duree":"Permanente","JR":"Aucun","cible":"Un cadavre","difficulte":"-7","portée":"","caseTMR":"necropole","caseTMRspeciale":"","ptreve":"1+","portee":"","isrituel":true},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_thanatos.webp","effects":[]}
|
{"_id":"yCrVicu7rLWmMwxe","name":"Animer un zombi","permission":{"default":0,"6ibmdmaeRSMTjU4c":3},"type":"sort","data":{"description":"<p>Le principe d'animation du zombi est semblable à celui du squelette. Comme ce dernier, sa TAILLE est celle du cadavre utilisé, son RÊVE est égal aux points de rêve dépensés, avec un maximum égal à la TAILLE (voir le Livre III, page 225). Comme le squelette, le zombi n'obéit qu'aux ordres reçus, mêmes règles d'application.</p>\n<p>La différence esssentielle est que le rituel d'Animation de Zombi interrompt totalement le processus de putréfaction au lieu de l'accélérer. Une fois animé, un zombi reste dans l'état physique qui était le seien lors de l'accomplissement du rituel, sans plus jamais subir la moindre trace de décomposition. La conséquence est qu'un cadavre frais, dont la mort ne remonte qu'à quelques minutes ou quelques heures, une fois animé, ne se distingue des vivants que par une pâleur inhabituelle, un regard un peu fixe, et des lèvres un peu exsangues, mais pour peu qu'il ne fasse pas très clair ou que son maître l'ait bien emmitouflé, capable de passer pour un vivant. Pour cette raison, les zombis sont souvent préférés aux squelettes par les haut-rêvants de Thanatos plus circonspects et moins enclins au tape-à-l'oeil.</p>","draconic":"thanatos","duree":"Permanente","JR":"Aucun","cible":"Un cadavre","difficulte":"-7","portée":"","caseTMR":"necropole","caseTMRspeciale":"","ptreve":"1+","portee":"","isrituel":true},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_thanatos.webp","effects":[]}
|
||||||
|
File diff suppressed because one or more lines are too long
@ -1,9 +1,9 @@
|
|||||||
{"_id":"0ZW71u9G8fqnyNfy","name":"Drakkar","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"vehicule","data":{"categorie":"Bateau","resistance":28,"structure":12,"vitesse":"3/2/1","bonus":"(10)/+10/+14","manoeuvrabilite":"0/-2/-4","equipage":8,"capacite_encombrement":150,"description":"Description ...","notesmj":"Notes du MJ"},"sort":100001,"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/vehicules/drakkar.webp","token":{"flags":{},"name":"Drakkar","displayName":0,"img":"systems/foundryvtt-reve-de-dragon/icons/vehicules/drakkar_token.webp","tint":"","width":10,"height":10,"scale":1,"mirrorX":false,"mirrorY":false,"lockRotation":false,"rotation":0,"vision":false,"dimSight":0,"brightSight":0,"dimLight":0,"brightLight":0,"sightAngle":360,"lightAngle":360,"lightColor":"","lightAlpha":1,"lightAnimation":{"type":"","speed":5,"intensity":5},"actorId":"0ZW71u9G8fqnyNfy","actorLink":false,"disposition":0,"displayBars":0,"bar1":{"attribute":""},"bar2":{"attribute":""},"randomImg":false},"items":[],"effects":[]}
|
{"_id":"0ZW71u9G8fqnyNfy","name":"Drakkar","type":"vehicule","sort":100001,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.vehicules.0ZW71u9G8fqnyNfy"}},"img":"systems/foundryvtt-reve-de-dragon/icons/vehicules/drakkar.webp","items":[],"effects":[],"system":{"categorie":"Bateau","resistance":28,"structure":12,"vitesse":"3/2/1","bonus":"(10)/+10/+14","manoeuvrabilite":"0/-2/-4","equipage":8,"capacite_encombrement":150,"etat":{"resistance":{"type":"number","max":28,"value":28,"label":"Résistance","derivee":false},"structure":{"type":"number","max":12,"value":12,"label":"Structure","derivee":false}},"description":"Description ...","race":"","notesmj":"Notes du MJ","attributs":{"malusarmure":{"value":0}}},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"prototypeToken":{"flags":{},"name":"Drakkar","displayName":0,"width":10,"height":10,"lockRotation":false,"rotation":0,"actorLink":false,"disposition":0,"displayBars":0,"bar1":{"attribute":"sante.vie"},"bar2":{"attribute":"sante.endurance"},"randomImg":false,"light":{"dim":0,"bright":0,"angle":360,"color":null,"alpha":1,"animation":{"type":null,"speed":5,"intensity":5,"reverse":false},"coloration":1,"attenuation":0.5,"luminosity":0.5,"saturation":0,"contrast":0,"shadows":0,"darkness":{"min":0,"max":1}},"texture":{"src":"systems/foundryvtt-reve-de-dragon/icons/vehicules/drakkar_token.webp","tint":null,"scaleX":1,"scaleY":1,"offsetX":0,"offsetY":0,"rotation":0},"sight":{"angle":360,"enabled":false,"range":0,"brightness":1,"visionMode":"basic","color":null,"attenuation":0.1,"saturation":0,"contrast":0},"alpha":1,"detectionModes":[]},"folder":null,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.0.21","coreVersion":"10.286","createdTime":1664231097623,"modifiedTime":1664231486338,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"5FWY38a5emYmqisa","name":"Cariole","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"vehicule","data":{"categorie":"Cariole à Bras","resistance":10,"structure":6,"vitesse":"","bonus":"","manoeuvrabilite":"","equipage":1,"capacite_encombrement":50,"description":"Description ...","notesmj":"Notes du MJ"},"sort":100001,"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/vehicules/cariole.webp","token":{"flags":{},"name":"Cariole","displayName":0,"img":"systems/foundryvtt-reve-de-dragon/icons/vehicules/cariole_token.webp","tint":"","width":2,"height":2,"scale":1,"mirrorX":false,"mirrorY":false,"lockRotation":false,"rotation":0,"vision":false,"dimSight":0,"brightSight":0,"dimLight":0,"brightLight":0,"sightAngle":360,"lightAngle":360,"lightColor":"","lightAlpha":1,"lightAnimation":{"type":"","speed":5,"intensity":5},"actorId":"5FWY38a5emYmqisa","actorLink":false,"disposition":0,"displayBars":0,"bar1":{"attribute":""},"bar2":{"attribute":""},"randomImg":false},"items":[],"effects":[]}
|
{"_id":"5FWY38a5emYmqisa","name":"Cariole","type":"vehicule","sort":100001,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.vehicules.5FWY38a5emYmqisa"}},"img":"systems/foundryvtt-reve-de-dragon/icons/vehicules/cariole.webp","items":[],"effects":[],"system":{"categorie":"Cariole à Bras","resistance":10,"structure":6,"vitesse":"","bonus":"","manoeuvrabilite":"","equipage":1,"capacite_encombrement":50,"etat":{"resistance":{"type":"number","max":10,"value":10,"label":"Résistance","derivee":false},"structure":{"type":"number","max":6,"value":6,"label":"Structure","derivee":false}},"description":"Description ...","race":"","notesmj":"Notes du MJ","attributs":{"malusarmure":{"value":0}}},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"prototypeToken":{"flags":{},"name":"Cariole","displayName":0,"width":2,"height":2,"lockRotation":false,"rotation":0,"actorLink":false,"disposition":0,"displayBars":0,"bar1":{"attribute":"sante.vie"},"bar2":{"attribute":"sante.endurance"},"randomImg":false,"light":{"dim":0,"bright":0,"angle":360,"color":null,"alpha":1,"animation":{"type":null,"speed":5,"intensity":5,"reverse":false},"coloration":1,"attenuation":0.5,"luminosity":0.5,"saturation":0,"contrast":0,"shadows":0,"darkness":{"min":0,"max":1}},"texture":{"src":"systems/foundryvtt-reve-de-dragon/icons/vehicules/cariole_token.webp","tint":null,"scaleX":1,"scaleY":1,"offsetX":0,"offsetY":0,"rotation":0},"sight":{"angle":360,"enabled":false,"range":0,"brightness":1,"visionMode":"basic","color":null,"attenuation":0.1,"saturation":0,"contrast":0},"alpha":1,"detectionModes":[]},"folder":null,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.0.21","coreVersion":"10.286","createdTime":1664231097624,"modifiedTime":1664231486337,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"C0JpbzQSELoml971","name":"Canot","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"vehicule","data":{"categorie":"Barque","resistance":14,"structure":6,"vitesse":"","bonus":"(2)/+3/+5","manoeuvrabilite":"","equipage":1,"capacite_encombrement":50,"description":"Description ...","notesmj":"Notes du MJ"},"sort":100001,"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/vehicules/canot.webp","token":{"flags":{},"name":"Canot","displayName":0,"img":"systems/foundryvtt-reve-de-dragon/icons/vehicules/canot_token.webp","tint":"","width":3,"height":3,"scale":1,"mirrorX":false,"mirrorY":false,"lockRotation":false,"rotation":0,"vision":false,"dimSight":0,"brightSight":0,"dimLight":0,"brightLight":0,"sightAngle":360,"lightAngle":360,"lightColor":"","lightAlpha":1,"lightAnimation":{"type":"","speed":5,"intensity":5},"actorId":"C0JpbzQSELoml971","actorLink":false,"disposition":0,"displayBars":0,"bar1":{"attribute":""},"bar2":{"attribute":""},"randomImg":false},"items":[],"effects":[]}
|
{"_id":"C0JpbzQSELoml971","name":"Canot","type":"vehicule","sort":100001,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.vehicules.C0JpbzQSELoml971"}},"img":"systems/foundryvtt-reve-de-dragon/icons/vehicules/canot.webp","items":[],"effects":[],"system":{"categorie":"Barque","resistance":14,"structure":6,"vitesse":"","bonus":"(2)/+3/+5","manoeuvrabilite":"","equipage":1,"capacite_encombrement":50,"etat":{"resistance":{"type":"number","max":14,"value":14,"label":"Résistance","derivee":false},"structure":{"type":"number","max":6,"value":6,"label":"Structure","derivee":false}},"description":"Description ...","race":"","notesmj":"Notes du MJ","attributs":{"malusarmure":{"value":0}}},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"prototypeToken":{"flags":{},"name":"Canot","displayName":0,"width":3,"height":3,"lockRotation":false,"rotation":0,"actorLink":false,"disposition":0,"displayBars":0,"bar1":{"attribute":"sante.vie"},"bar2":{"attribute":"sante.endurance"},"randomImg":false,"light":{"dim":0,"bright":0,"angle":360,"color":null,"alpha":1,"animation":{"type":null,"speed":5,"intensity":5,"reverse":false},"coloration":1,"attenuation":0.5,"luminosity":0.5,"saturation":0,"contrast":0,"shadows":0,"darkness":{"min":0,"max":1}},"texture":{"src":"systems/foundryvtt-reve-de-dragon/icons/vehicules/canot_token.webp","tint":null,"scaleX":1,"scaleY":1,"offsetX":0,"offsetY":0,"rotation":0},"sight":{"angle":360,"enabled":false,"range":0,"brightness":1,"visionMode":"basic","color":null,"attenuation":0.1,"saturation":0,"contrast":0},"alpha":1,"detectionModes":[]},"folder":null,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.0.21","coreVersion":"10.286","createdTime":1664231097625,"modifiedTime":1664231486336,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"PoQUTsNThYDp6XAW","name":"Nef","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"vehicule","data":{"categorie":"Bateau","resistance":30,"structure":14,"vitesse":"5/4/2","bonus":"","manoeuvrabilite":"0/-3/-4","equipage":12,"capacite_encombrement":200,"description":"Description ...","notesmj":"Notes du MJ"},"sort":100001,"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/vehicules/nef.webp","token":{"flags":{},"name":"Nef","displayName":0,"img":"systems/foundryvtt-reve-de-dragon/icons/vehicules/nef_token.webp","tint":"","width":13,"height":13,"scale":1,"mirrorX":false,"mirrorY":false,"lockRotation":false,"rotation":0,"vision":false,"dimSight":0,"brightSight":0,"dimLight":0,"brightLight":0,"sightAngle":360,"lightAngle":360,"lightColor":"","lightAlpha":1,"lightAnimation":{"type":"","speed":5,"intensity":5},"actorId":"PoQUTsNThYDp6XAW","actorLink":false,"disposition":0,"displayBars":0,"bar1":{"attribute":""},"bar2":{"attribute":""},"randomImg":false},"items":[],"effects":[]}
|
{"_id":"PoQUTsNThYDp6XAW","name":"Nef","type":"vehicule","sort":100001,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.vehicules.PoQUTsNThYDp6XAW"}},"img":"systems/foundryvtt-reve-de-dragon/icons/vehicules/nef.webp","items":[],"effects":[],"system":{"categorie":"Bateau","resistance":30,"structure":14,"vitesse":"5/4/2","bonus":"","manoeuvrabilite":"0/-3/-4","equipage":12,"capacite_encombrement":200,"etat":{"resistance":{"type":"number","max":30,"value":30,"label":"Résistance","derivee":false},"structure":{"type":"number","max":14,"value":14,"label":"Structure","derivee":false}},"description":"Description ...","race":"","notesmj":"Notes du MJ","attributs":{"malusarmure":{"value":0}}},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"prototypeToken":{"flags":{},"name":"Nef","displayName":0,"width":13,"height":13,"lockRotation":false,"rotation":0,"actorLink":false,"disposition":0,"displayBars":0,"bar1":{"attribute":"sante.vie"},"bar2":{"attribute":"sante.endurance"},"randomImg":false,"light":{"dim":0,"bright":0,"angle":360,"color":null,"alpha":1,"animation":{"type":null,"speed":5,"intensity":5,"reverse":false},"coloration":1,"attenuation":0.5,"luminosity":0.5,"saturation":0,"contrast":0,"shadows":0,"darkness":{"min":0,"max":1}},"texture":{"src":"systems/foundryvtt-reve-de-dragon/icons/vehicules/nef_token.webp","tint":null,"scaleX":1,"scaleY":1,"offsetX":0,"offsetY":0,"rotation":0},"sight":{"angle":360,"enabled":false,"range":0,"brightness":1,"visionMode":"basic","color":null,"attenuation":0.1,"saturation":0,"contrast":0},"alpha":1,"detectionModes":[]},"folder":null,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.0.21","coreVersion":"10.286","createdTime":1664231097626,"modifiedTime":1664231486339,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"RFOYL8HBUxd32DXS","name":"Galère","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"vehicule","data":{"categorie":"Bateau","resistance":36,"structure":14,"vitesse":"2/2/1","bonus":"(12)/+12/+16","manoeuvrabilite":"0/-4/-6","equipage":10,"capacite_encombrement":300,"description":"Description ...","notesmj":"Notes du MJ"},"sort":100001,"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/vehicules/galere.webp","token":{"flags":{},"name":"Galère","displayName":0,"img":"systems/foundryvtt-reve-de-dragon/icons/vehicules/galere_token.webp","tint":"","width":14,"height":14,"scale":1,"mirrorX":false,"mirrorY":false,"lockRotation":false,"rotation":0,"vision":false,"dimSight":0,"brightSight":0,"dimLight":0,"brightLight":0,"sightAngle":360,"lightAngle":360,"lightColor":"","lightAlpha":1,"lightAnimation":{"type":"","speed":5,"intensity":5},"actorId":"RFOYL8HBUxd32DXS","actorLink":false,"disposition":0,"displayBars":0,"bar1":{"attribute":""},"bar2":{"attribute":""},"randomImg":false},"items":[],"effects":[]}
|
{"_id":"RFOYL8HBUxd32DXS","name":"Galère","type":"vehicule","sort":100001,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.vehicules.RFOYL8HBUxd32DXS"}},"img":"systems/foundryvtt-reve-de-dragon/icons/vehicules/galere.webp","items":[],"effects":[],"system":{"categorie":"Bateau","resistance":36,"structure":14,"vitesse":"2/2/1","bonus":"(12)/+12/+16","manoeuvrabilite":"0/-4/-6","equipage":10,"capacite_encombrement":300,"etat":{"resistance":{"type":"number","max":36,"value":36,"label":"Résistance","derivee":false},"structure":{"type":"number","max":14,"value":14,"label":"Structure","derivee":false}},"description":"Description ...","race":"","notesmj":"Notes du MJ","attributs":{"malusarmure":{"value":0}}},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"prototypeToken":{"flags":{},"name":"Galère","displayName":0,"width":14,"height":14,"lockRotation":false,"rotation":0,"actorLink":false,"disposition":0,"displayBars":0,"bar1":{"attribute":"sante.vie"},"bar2":{"attribute":"sante.endurance"},"randomImg":false,"light":{"dim":0,"bright":0,"angle":360,"color":null,"alpha":1,"animation":{"type":null,"speed":5,"intensity":5,"reverse":false},"coloration":1,"attenuation":0.5,"luminosity":0.5,"saturation":0,"contrast":0,"shadows":0,"darkness":{"min":0,"max":1}},"texture":{"src":"systems/foundryvtt-reve-de-dragon/icons/vehicules/galere_token.webp","tint":null,"scaleX":1,"scaleY":1,"offsetX":0,"offsetY":0,"rotation":0},"sight":{"angle":360,"enabled":false,"range":0,"brightness":1,"visionMode":"basic","color":null,"attenuation":0.1,"saturation":0,"contrast":0},"alpha":1,"detectionModes":[]},"folder":null,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.0.21","coreVersion":"10.286","createdTime":1664231097627,"modifiedTime":1664231486339,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"TDpSn7GawJ1LCHp7","name":"Charette","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"vehicule","data":{"categorie":"Chariot","resistance":16,"structure":8,"vitesse":"","bonus":"","manoeuvrabilite":"","equipage":1,"capacite_encombrement":100,"description":"Description ...","notesmj":"Notes du MJ"},"sort":100001,"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/vehicules/charette.webp","token":{"flags":{},"name":"Charette","displayName":0,"img":"systems/foundryvtt-reve-de-dragon/icons/vehicules/charette_token.webp","tint":"","width":3,"height":3,"scale":1.1,"mirrorX":false,"mirrorY":false,"lockRotation":false,"rotation":0,"vision":false,"dimSight":0,"brightSight":0,"dimLight":0,"brightLight":0,"sightAngle":360,"lightAngle":360,"lightColor":"","lightAlpha":1,"lightAnimation":{"type":"","speed":5,"intensity":5},"actorId":"TDpSn7GawJ1LCHp7","actorLink":false,"disposition":0,"displayBars":0,"bar1":{"attribute":""},"bar2":{"attribute":""},"randomImg":false},"items":[],"effects":[]}
|
{"_id":"TDpSn7GawJ1LCHp7","name":"Charette","type":"vehicule","sort":100001,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.vehicules.TDpSn7GawJ1LCHp7"}},"img":"systems/foundryvtt-reve-de-dragon/icons/vehicules/charette.webp","items":[],"effects":[],"system":{"categorie":"Chariot","resistance":16,"structure":8,"vitesse":"","bonus":"","manoeuvrabilite":"","equipage":1,"capacite_encombrement":100,"etat":{"resistance":{"type":"number","max":16,"value":16,"label":"Résistance","derivee":false},"structure":{"type":"number","max":8,"value":8,"label":"Structure","derivee":false}},"description":"Description ...","race":"","notesmj":"Notes du MJ","attributs":{"malusarmure":{"value":0}}},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"prototypeToken":{"flags":{},"name":"Charette","displayName":0,"width":3,"height":3,"lockRotation":false,"rotation":0,"actorLink":false,"disposition":0,"displayBars":0,"bar1":{"attribute":"sante.vie"},"bar2":{"attribute":"sante.endurance"},"randomImg":false,"light":{"dim":0,"bright":0,"angle":360,"color":null,"alpha":1,"animation":{"type":null,"speed":5,"intensity":5,"reverse":false},"coloration":1,"attenuation":0.5,"luminosity":0.5,"saturation":0,"contrast":0,"shadows":0,"darkness":{"min":0,"max":1}},"texture":{"src":"systems/foundryvtt-reve-de-dragon/icons/vehicules/charette_token.webp","tint":null,"scaleX":1.1,"scaleY":1.1,"offsetX":0,"offsetY":0,"rotation":0},"sight":{"angle":360,"enabled":false,"range":0,"brightness":1,"visionMode":"basic","color":null,"attenuation":0.1,"saturation":0,"contrast":0},"alpha":1,"detectionModes":[]},"folder":null,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.0.21","coreVersion":"10.286","createdTime":1664231097629,"modifiedTime":1664231486337,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"ZiyRDzz3gGzlpLIc","name":"Barque","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"vehicule","data":{"categorie":"Barque","resistance":20,"structure":10,"vitesse":"3/2/1","bonus":"(4)/+4/+6","manoeuvrabilite":"0/0/-4","equipage":4,"capacite_encombrement":100,"description":"Description ...","notesmj":"Notes du MJ"},"sort":100001,"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/vehicules/barque.webp","token":{"flags":{},"name":"Barque","displayName":0,"img":"systems/foundryvtt-reve-de-dragon/icons/vehicules/barque_token.webp","tint":"","width":6,"height":6,"scale":1,"mirrorX":false,"mirrorY":false,"lockRotation":false,"rotation":0,"vision":false,"dimSight":0,"brightSight":0,"dimLight":0,"brightLight":0,"sightAngle":360,"lightAngle":360,"lightColor":"","lightAlpha":1,"lightAnimation":{"type":"","speed":5,"intensity":5},"actorId":"ZiyRDzz3gGzlpLIc","actorLink":false,"disposition":0,"displayBars":0,"bar1":{"attribute":""},"bar2":{"attribute":""},"randomImg":false},"items":[],"effects":[]}
|
{"_id":"ZiyRDzz3gGzlpLIc","name":"Barque","type":"vehicule","sort":100001,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.vehicules.ZiyRDzz3gGzlpLIc"}},"img":"systems/foundryvtt-reve-de-dragon/icons/vehicules/barque.webp","items":[],"effects":[],"system":{"categorie":"Barque","resistance":20,"structure":10,"vitesse":"3/2/1","bonus":"(4)/+4/+6","manoeuvrabilite":"0/0/-4","equipage":4,"capacite_encombrement":100,"etat":{"resistance":{"type":"number","max":20,"value":20,"label":"Résistance","derivee":false},"structure":{"type":"number","max":10,"value":10,"label":"Structure","derivee":false}},"description":"Description ...","race":"","notesmj":"Notes du MJ","attributs":{"malusarmure":{"value":0}}},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"prototypeToken":{"flags":{},"name":"Barque","displayName":0,"width":6,"height":6,"lockRotation":false,"rotation":0,"actorLink":false,"disposition":0,"displayBars":0,"bar1":{"attribute":"sante.vie"},"bar2":{"attribute":"sante.endurance"},"randomImg":false,"light":{"dim":0,"bright":0,"angle":360,"color":null,"alpha":1,"animation":{"type":null,"speed":5,"intensity":5,"reverse":false},"coloration":1,"attenuation":0.5,"luminosity":0.5,"saturation":0,"contrast":0,"shadows":0,"darkness":{"min":0,"max":1}},"texture":{"src":"systems/foundryvtt-reve-de-dragon/icons/vehicules/barque_token.webp","tint":null,"scaleX":1,"scaleY":1,"offsetX":0,"offsetY":0,"rotation":0},"sight":{"angle":360,"enabled":false,"range":0,"brightness":1,"visionMode":"basic","color":null,"attenuation":0.1,"saturation":0,"contrast":0},"alpha":1,"detectionModes":[]},"folder":null,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.0.21","coreVersion":"10.286","createdTime":1664231097629,"modifiedTime":1664231486336,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"gM77co80kmpVsYg6","name":"Posé par terre","permission":{"default":0,"Q2G6GTdrotKzYGUC":3},"type":"vehicule","data":{"categorie":"Autre","resistance":0,"structure":0,"vitesse":"","bonus":"","manoeuvrabilite":"","equipage":0,"capacite_encombrement":100,"description":"<p>Déposer ici les objets que vous voulez échanger avec d'autres joueurs</p>","notesmj":""},"sort":100001,"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/templates/icone_parchement_vierge.webp","token":{"flags":{},"name":"Posé par terre","displayName":0,"img":"systems/foundryvtt-reve-de-dragon/icons/templates/icone_parchement_vierge.webp","tint":"","width":1,"height":1,"scale":1,"mirrorX":false,"mirrorY":false,"lockRotation":false,"rotation":0,"vision":false,"dimSight":0,"brightSight":0,"dimLight":0,"brightLight":0,"sightAngle":360,"lightAngle":360,"lightColor":"","lightAlpha":1,"lightAnimation":{"type":"","speed":5,"intensity":5},"actorId":"gM77co80kmpVsYg6","actorLink":true,"disposition":0,"displayBars":0,"bar1":{"attribute":""},"bar2":{"attribute":""},"randomImg":false},"items":[],"effects":[]}
|
{"_id":"gM77co80kmpVsYg6","name":"Posé par terre","type":"vehicule","sort":100001,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.vehicules.gM77co80kmpVsYg6"}},"img":"systems/foundryvtt-reve-de-dragon/icons/templates/icone_parchement_vierge.webp","items":[],"effects":[],"system":{"categorie":"Autre","resistance":0,"structure":0,"vitesse":"","bonus":"","manoeuvrabilite":"","equipage":0,"capacite_encombrement":100,"etat":{"resistance":{"type":"number","max":0,"value":0,"label":"Résistance","derivee":false},"structure":{"type":"number","max":0,"value":0,"label":"Structure","derivee":false}},"description":"<p>Déposer ici les objets que vous voulez échanger avec d'autres joueurs</p>","race":"","notesmj":"","attributs":{"malusarmure":{"value":0}}},"ownership":{"default":0,"Q2G6GTdrotKzYGUC":3},"prototypeToken":{"flags":{},"name":"Posé par terre","displayName":0,"width":1,"height":1,"lockRotation":false,"rotation":0,"actorLink":true,"disposition":0,"displayBars":0,"bar1":{"attribute":"sante.vie"},"bar2":{"attribute":"sante.endurance"},"randomImg":false,"light":{"dim":0,"bright":0,"angle":360,"color":null,"alpha":1,"animation":{"type":null,"speed":5,"intensity":5,"reverse":false},"coloration":1,"attenuation":0.5,"luminosity":0.5,"saturation":0,"contrast":0,"shadows":0,"darkness":{"min":0,"max":1}},"texture":{"src":"systems/foundryvtt-reve-de-dragon/icons/templates/icone_parchement_vierge.webp","tint":null,"scaleX":1,"scaleY":1,"offsetX":0,"offsetY":0,"rotation":0},"sight":{"angle":360,"enabled":false,"range":0,"brightness":1,"visionMode":"basic","color":null,"attenuation":0.1,"saturation":0,"contrast":0},"alpha":1,"detectionModes":[]},"folder":null,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.0.21","coreVersion":"10.286","createdTime":1664231097630,"modifiedTime":1664231486340,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"idyDmDWYpQ4Eppen","name":"Chariot","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"vehicule","data":{"categorie":"Chariot","resistance":20,"structure":10,"vitesse":"","bonus":"","manoeuvrabilite":"","equipage":1,"capacite_encombrement":150,"description":"Description ...","notesmj":"Notes du MJ"},"sort":100001,"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/vehicules/chariot.webp","token":{"flags":{},"name":"Chariot","displayName":0,"img":"systems/foundryvtt-reve-de-dragon/icons/vehicules/chariot_token.webp","tint":"","width":4,"height":4,"scale":1.4,"mirrorX":false,"mirrorY":false,"lockRotation":false,"rotation":0,"vision":false,"dimSight":0,"brightSight":0,"dimLight":0,"brightLight":0,"sightAngle":360,"lightAngle":360,"lightColor":"","lightAlpha":1,"lightAnimation":{"type":"","speed":5,"intensity":5},"actorId":"idyDmDWYpQ4Eppen","actorLink":false,"disposition":0,"displayBars":0,"bar1":{"attribute":""},"bar2":{"attribute":""},"randomImg":false},"items":[],"effects":[]}
|
{"_id":"idyDmDWYpQ4Eppen","name":"Chariot","type":"vehicule","sort":100001,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.vehicules.idyDmDWYpQ4Eppen"}},"img":"systems/foundryvtt-reve-de-dragon/icons/vehicules/chariot.webp","items":[],"effects":[],"system":{"categorie":"Chariot","resistance":20,"structure":10,"vitesse":"","bonus":"","manoeuvrabilite":"","equipage":1,"capacite_encombrement":150,"etat":{"resistance":{"type":"number","max":20,"value":20,"label":"Résistance","derivee":false},"structure":{"type":"number","max":10,"value":10,"label":"Structure","derivee":false}},"description":"Description ...","race":"","notesmj":"Notes du MJ","attributs":{"malusarmure":{"value":0}}},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"prototypeToken":{"flags":{},"name":"Chariot","displayName":0,"width":4,"height":4,"lockRotation":false,"rotation":0,"actorLink":false,"disposition":0,"displayBars":0,"bar1":{"attribute":"sante.vie"},"bar2":{"attribute":"sante.endurance"},"randomImg":false,"light":{"dim":0,"bright":0,"angle":360,"color":null,"alpha":1,"animation":{"type":null,"speed":5,"intensity":5,"reverse":false},"coloration":1,"attenuation":0.5,"luminosity":0.5,"saturation":0,"contrast":0,"shadows":0,"darkness":{"min":0,"max":1}},"texture":{"src":"systems/foundryvtt-reve-de-dragon/icons/vehicules/chariot_token.webp","tint":null,"scaleX":1.4,"scaleY":1.4,"offsetX":0,"offsetY":0,"rotation":0},"sight":{"angle":360,"enabled":false,"range":0,"brightness":1,"visionMode":"basic","color":null,"attenuation":0.1,"saturation":0,"contrast":0},"alpha":1,"detectionModes":[]},"folder":null,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.0.21","coreVersion":"10.286","createdTime":1664231097632,"modifiedTime":1664231486338,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
|
File diff suppressed because one or more lines are too long
@ -252,6 +252,49 @@ table {border: 1px solid #7a7971;}
|
|||||||
justify-content: center;
|
justify-content: center;
|
||||||
text-align: left;
|
text-align: left;
|
||||||
}
|
}
|
||||||
|
.blessure-control {
|
||||||
|
flex-grow: 1;
|
||||||
|
flex-direction: row;
|
||||||
|
}
|
||||||
|
.blessure-soins {
|
||||||
|
flex-direction: row;
|
||||||
|
align-content: flex-start;
|
||||||
|
justify-content: flex-start;
|
||||||
|
margin-right: 2px;
|
||||||
|
margin-left: 2px;
|
||||||
|
padding: 2px;
|
||||||
|
}
|
||||||
|
input:is(.blessure-psdone, .blessure-scdone) {
|
||||||
|
width: 20px;
|
||||||
|
}
|
||||||
|
input:is(.blessure-premiers_soins, .blessure-soins_complets) {
|
||||||
|
width: calc(100% - 25px);
|
||||||
|
}
|
||||||
|
.blessure-jours {
|
||||||
|
flex-direction: row;
|
||||||
|
align-content: flex-start;
|
||||||
|
justify-content: flex-start;
|
||||||
|
}
|
||||||
|
.blessure-localisation {
|
||||||
|
flex-direction: row;
|
||||||
|
align-content: flex-start;
|
||||||
|
justify-content: flex-start;
|
||||||
|
}
|
||||||
|
.blessure-inactive {
|
||||||
|
color:rgba(150, 150, 150, 0.4);
|
||||||
|
}
|
||||||
|
.blessure-active-legere {
|
||||||
|
color:rgba(60, 60, 60, 0.9);
|
||||||
|
text-shadow: 1px 1px 4px rgba(60, 60, 60, 1);
|
||||||
|
}
|
||||||
|
.blessure-active-grave {
|
||||||
|
color: rgba(218, 126, 21, 0.9);
|
||||||
|
text-shadow: 1px 1px 4px rgba(60, 60, 60, 1);
|
||||||
|
}
|
||||||
|
.blessure-active-critique {
|
||||||
|
color: rgba(173, 36, 26, 0.9);
|
||||||
|
text-shadow: 1px 1px 4px rgba(60, 60, 60, 1);
|
||||||
|
}
|
||||||
|
|
||||||
.foundryvtt-reve-de-dragon .sheet-header {
|
.foundryvtt-reve-de-dragon .sheet-header {
|
||||||
-webkit-box-flex: 0;
|
-webkit-box-flex: 0;
|
||||||
@ -366,6 +409,12 @@ table {border: 1px solid #7a7971;}
|
|||||||
flex-wrap: nowrap;
|
flex-wrap: nowrap;
|
||||||
justify-content: stretch;
|
justify-content: stretch;
|
||||||
}
|
}
|
||||||
|
.rdd.sheet .window-content .sheet-body .carac-list .caracteristique.vehicle {
|
||||||
|
flex-wrap: nowrap;
|
||||||
|
justify-content: stretch;
|
||||||
|
flex-basis: 7.5em;
|
||||||
|
}
|
||||||
|
|
||||||
.rdd.sheet .window-content .sheet-body .carac-list .caracteristique > .carac-label {
|
.rdd.sheet .window-content .sheet-body .carac-list .caracteristique > .carac-label {
|
||||||
flex-basis: 50%;
|
flex-basis: 50%;
|
||||||
}
|
}
|
||||||
@ -450,20 +499,6 @@ table {border: 1px solid #7a7971;}
|
|||||||
border-bottom: 1px solid #BBB;
|
border-bottom: 1px solid #BBB;
|
||||||
}
|
}
|
||||||
|
|
||||||
.blessure-inactive {
|
|
||||||
color:rgba(150, 150, 150, 0.4)
|
|
||||||
}
|
|
||||||
.blessure-active-legere {
|
|
||||||
color:rgba(60, 60, 60, 0.9);
|
|
||||||
text-shadow: rgba(60, 60, 60, 0.7);
|
|
||||||
}
|
|
||||||
.blessure-active-grave {
|
|
||||||
color:rgba(218, 126, 21, 0.9);
|
|
||||||
}
|
|
||||||
.blessure-active-critique {
|
|
||||||
color:rgba(173, 36, 26, 0.9);
|
|
||||||
|
|
||||||
}
|
|
||||||
.foundryvtt-reve-de-dragon .items-list .item .item-image {
|
.foundryvtt-reve-de-dragon .items-list .item .item-image {
|
||||||
-webkit-box-flex: 0;
|
-webkit-box-flex: 0;
|
||||||
-ms-flex: 0 0 24px;
|
-ms-flex: 0 0 24px;
|
||||||
@ -840,6 +875,23 @@ ul, li {
|
|||||||
margin-left: 3rem;
|
margin-left: 3rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.grid-select-type-tmr {
|
||||||
|
display: grid;
|
||||||
|
grid-column: span 4 / span 4;
|
||||||
|
grid-template-columns: repeat(4, minmax(0, 1fr));
|
||||||
|
gap: 0.1rem;
|
||||||
|
margin: 0.1rem;
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
.grid-select-actor {
|
||||||
|
display: grid;
|
||||||
|
grid-column: span 2 / span 2;
|
||||||
|
grid-template-columns: repeat(2, minmax(0, 1fr));
|
||||||
|
gap: 0.1rem;
|
||||||
|
margin: 0.1rem;
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
|
||||||
.sheet-competence-img {
|
.sheet-competence-img {
|
||||||
width: 24px;
|
width: 24px;
|
||||||
height: 24px;
|
height: 24px;
|
||||||
@ -891,6 +943,12 @@ ul, li {
|
|||||||
margin-right: 0.2rem;
|
margin-right: 0.2rem;
|
||||||
margin-left: 0.2rem;
|
margin-left: 0.2rem;
|
||||||
}
|
}
|
||||||
|
.initiative-value {
|
||||||
|
flex-grow: 0;
|
||||||
|
flex-basis: 3rem;
|
||||||
|
margin-right: 0.2rem;
|
||||||
|
margin-left: 0.2rem;
|
||||||
|
}
|
||||||
.description-value {
|
.description-value {
|
||||||
flex-grow: 0;
|
flex-grow: 0;
|
||||||
flex-basis: 4rem;
|
flex-basis: 4rem;
|
||||||
@ -909,23 +967,6 @@ ul, li {
|
|||||||
.alchimie-title {
|
.alchimie-title {
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
}
|
}
|
||||||
.blessure-data {
|
|
||||||
flex-direction: row;
|
|
||||||
align-content: flex-start;
|
|
||||||
justify-content: flex-start;
|
|
||||||
}
|
|
||||||
.blessures-soins {
|
|
||||||
flex-grow: 0;
|
|
||||||
flex-basis: 32px;
|
|
||||||
margin-right: 4px;
|
|
||||||
margin-left: 4px;
|
|
||||||
}
|
|
||||||
.blessures-loc {
|
|
||||||
flex-grow: 0;
|
|
||||||
flex-basis: 96px;
|
|
||||||
margin-right: 4px;
|
|
||||||
margin-left: 4px;
|
|
||||||
}
|
|
||||||
.pointsreve-value {
|
.pointsreve-value {
|
||||||
flex-grow: 0;
|
flex-grow: 0;
|
||||||
flex-basis: 64px;
|
flex-basis: 64px;
|
||||||
@ -1076,7 +1117,7 @@ ul, li {
|
|||||||
.table-fatigue .fatigue-malus {
|
.table-fatigue .fatigue-malus {
|
||||||
font-size: 0.8rem;
|
font-size: 0.8rem;
|
||||||
}
|
}
|
||||||
.flex-actions-bar {
|
.flex-actions-bar {
|
||||||
flex-grow: 2;
|
flex-grow: 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1146,9 +1187,16 @@ ul, li {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#sidebar #sidebar-tabs i.fa-comments:before, #sidebar #sidebar-tabs i.fa-fist-raised:before, #sidebar #sidebar-tabs i.fa-users:before, #sidebar #sidebar-tabs i.fa-map:before, #sidebar #sidebar-tabs i.fa-suitcase:before, #sidebar #sidebar-tabs i.fa-book-open:before, #sidebar #sidebar-tabs i.fa-th-list:before, #sidebar #sidebar-tabs i.fa-music:before, #sidebar #sidebar-tabs i.fa-atlas:before, #sidebar #sidebar-tabs i.fa-cogs:before {content: "";}
|
#sidebar #sidebar-tabs i:is(
|
||||||
|
.fa-comments, .fa-fist-raised, .fa-swords,
|
||||||
|
.fa-users, .fa-user, .fa-map, .fa-suitcase,
|
||||||
|
.fa-book-open, .fa-th-list, .fa-music,
|
||||||
|
.fa-atlas,.fa-cogs
|
||||||
|
):before {content: "";}
|
||||||
#sidebar #sidebar-tabs i.fa-comments {background: url("img/ui/icon_sidebar_chat.svg") no-repeat;}
|
#sidebar #sidebar-tabs i.fa-comments {background: url("img/ui/icon_sidebar_chat.svg") no-repeat;}
|
||||||
#sidebar #sidebar-tabs i.fa-fist-raised {background: url("img/ui/icon_sidebar_fight.svg") no-repeat;}
|
#sidebar #sidebar-tabs i.fa-fist-raised {background: url("img/ui/icon_sidebar_fight.svg") no-repeat;}
|
||||||
|
#sidebar #sidebar-tabs i.fa-swords {background: url("img/ui/icon_sidebar_fight.svg") no-repeat;}
|
||||||
|
#sidebar #sidebar-tabs i.fa-user {background: url("img/ui/icon_sidebar_actor.svg") no-repeat;}
|
||||||
#sidebar #sidebar-tabs i.fa-users {background: url("img/ui/icon_sidebar_actor.svg") no-repeat;}
|
#sidebar #sidebar-tabs i.fa-users {background: url("img/ui/icon_sidebar_actor.svg") no-repeat;}
|
||||||
#sidebar #sidebar-tabs i.fa-map {background: url("img/ui/icon_sidebar_scene.svg") no-repeat;}
|
#sidebar #sidebar-tabs i.fa-map {background: url("img/ui/icon_sidebar_scene.svg") no-repeat;}
|
||||||
#sidebar #sidebar-tabs i.fa-suitcase {background: url("img/ui/icon_sidebar_item.svg") no-repeat;}
|
#sidebar #sidebar-tabs i.fa-suitcase {background: url("img/ui/icon_sidebar_item.svg") no-repeat;}
|
||||||
|
400
system.json
400
system.json
@ -1,38 +1,44 @@
|
|||||||
{
|
{
|
||||||
"name": "foundryvtt-reve-de-dragon",
|
"id": "foundryvtt-reve-de-dragon",
|
||||||
"title": "Rêve de Dragon",
|
"title": "Rêve de Dragon",
|
||||||
"description": "Rêve de Dragon RPG for FoundryVTT",
|
"description": "Rêve de Dragon RPG for FoundryVTT",
|
||||||
"author": "LeRatierBretonnien",
|
|
||||||
"authors": [
|
"authors": [
|
||||||
{
|
{
|
||||||
"name": "LeRatierBretonnien"
|
"name": "LeRatierBretonnien",
|
||||||
|
"flags": {}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "VincentVK"
|
"name": "VincentVK",
|
||||||
|
"flags": {}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "Grendel"
|
"name": "Grendel",
|
||||||
|
"flags": {}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "Michael Nonne"
|
"name": "Michael Nonne",
|
||||||
|
"flags": {}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "Mandar"
|
"name": "Mandar",
|
||||||
|
"flags": {}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "Fred"
|
"name": "Fred",
|
||||||
|
"flags": {}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "Fab"
|
"name": "Fab",
|
||||||
|
"flags": {}
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"url": "https://www.uberwald.me/gitea/public/foundryvtt-reve-de-dragon/",
|
"url": "https://www.uberwald.me/gitea/public/foundryvtt-reve-de-dragon/",
|
||||||
"license": "LICENSE.txt",
|
"license": "LICENSE.txt",
|
||||||
"flags": {},
|
"version": "10.0.22",
|
||||||
"version": "1.5.87",
|
"compatibility": {
|
||||||
"minimumCoreVersion": "0.8.0",
|
"minimum": "10",
|
||||||
"compatibleCoreVersion": "9",
|
"verified": "10.286"
|
||||||
"scripts": [],
|
},
|
||||||
"esmodules": [
|
"esmodules": [
|
||||||
"module/rdd-main.js"
|
"module/rdd-main.js"
|
||||||
],
|
],
|
||||||
@ -44,12 +50,13 @@
|
|||||||
"lang": "en",
|
"lang": "en",
|
||||||
"name": "English",
|
"name": "English",
|
||||||
"path": "lang/fr.json",
|
"path": "lang/fr.json",
|
||||||
"unreal": "this is a trick"
|
"flags": {}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"lang": "fr",
|
"lang": "fr",
|
||||||
"name": "Français",
|
"name": "Français",
|
||||||
"path": "lang/fr.json"
|
"path": "lang/fr.json",
|
||||||
|
"flags": {}
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"packs": [
|
"packs": [
|
||||||
@ -57,453 +64,278 @@
|
|||||||
"name": "competences",
|
"name": "competences",
|
||||||
"label": "Compétences",
|
"label": "Compétences",
|
||||||
"system": "foundryvtt-reve-de-dragon",
|
"system": "foundryvtt-reve-de-dragon",
|
||||||
"module": "foundryvtt-reve-de-dragon",
|
"path": "packs/competences.db",
|
||||||
"path": "./packs/competences.db",
|
|
||||||
"type": "Item",
|
"type": "Item",
|
||||||
"tags": [
|
"private": false,
|
||||||
"item",
|
"flags": {}
|
||||||
"compétences"
|
|
||||||
],
|
|
||||||
"entity": "Item",
|
|
||||||
"private": false
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "arts-et-divertissements",
|
"name": "arts-et-divertissements",
|
||||||
"label": "Arts et Divertissements",
|
"label": "Arts et Divertissements",
|
||||||
"system": "foundryvtt-reve-de-dragon",
|
"system": "foundryvtt-reve-de-dragon",
|
||||||
"module": "foundryvtt-reve-de-dragon",
|
"path": "packs/arts-et-divertissements.db",
|
||||||
"path": "./packs/arts-et-divertissements.db",
|
|
||||||
"type": "Item",
|
"type": "Item",
|
||||||
"tags": [
|
"private": false,
|
||||||
"recette",
|
"flags": {}
|
||||||
"cuisine",
|
|
||||||
"danse",
|
|
||||||
"musique",
|
|
||||||
"chant",
|
|
||||||
"jeux"
|
|
||||||
],
|
|
||||||
"entity": "Item",
|
|
||||||
"private": false
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "competences-creatures",
|
"name": "competences-creatures",
|
||||||
"label": "Compétences de Créatures",
|
"label": "Compétences de Créatures",
|
||||||
"system": "foundryvtt-reve-de-dragon",
|
"system": "foundryvtt-reve-de-dragon",
|
||||||
"module": "foundryvtt-reve-de-dragon",
|
"path": "packs/competences-creatures.db",
|
||||||
"path": "./packs/competences-creatures.db",
|
|
||||||
"type": "Item",
|
"type": "Item",
|
||||||
"tags": [
|
"private": false,
|
||||||
"item",
|
"flags": {}
|
||||||
"compétences",
|
|
||||||
"créatures"
|
|
||||||
],
|
|
||||||
"entity": "Item",
|
|
||||||
"private": false
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "competences-entites",
|
"name": "competences-entites",
|
||||||
"label": "Compétences des Entités",
|
"label": "Compétences des Entités",
|
||||||
"system": "foundryvtt-reve-de-dragon",
|
"system": "foundryvtt-reve-de-dragon",
|
||||||
"module": "foundryvtt-reve-de-dragon",
|
"path": "packs/competences-entites.db",
|
||||||
"path": "./packs/competences-entites.db",
|
|
||||||
"type": "Item",
|
"type": "Item",
|
||||||
"tags": [
|
"private": false,
|
||||||
"item",
|
"flags": {}
|
||||||
"compétences",
|
|
||||||
"entités"
|
|
||||||
],
|
|
||||||
"entity": "Item",
|
|
||||||
"private": false
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "sorts-oniros",
|
"name": "sorts-oniros",
|
||||||
"label": "Sorts d'Oniros",
|
"label": "Sorts d'Oniros",
|
||||||
"system": "foundryvtt-reve-de-dragon",
|
"system": "foundryvtt-reve-de-dragon",
|
||||||
"module": "foundryvtt-reve-de-dragon",
|
"path": "packs/sorts-oniros.db",
|
||||||
"path": "./packs/sorts-oniros.db",
|
|
||||||
"type": "Item",
|
"type": "Item",
|
||||||
"tags": [
|
"private": false,
|
||||||
"item",
|
"flags": {}
|
||||||
"sorts"
|
|
||||||
],
|
|
||||||
"entity": "Item",
|
|
||||||
"private": false
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "sorts-hypnos",
|
"name": "sorts-hypnos",
|
||||||
"label": "Sorts d'Hypnos",
|
"label": "Sorts d'Hypnos",
|
||||||
"system": "foundryvtt-reve-de-dragon",
|
"system": "foundryvtt-reve-de-dragon",
|
||||||
"module": "foundryvtt-reve-de-dragon",
|
"path": "packs/sorts-hypnos.db",
|
||||||
"path": "./packs/sorts-hypnos.db",
|
|
||||||
"type": "Item",
|
"type": "Item",
|
||||||
"tags": [
|
"private": false,
|
||||||
"item",
|
"flags": {}
|
||||||
"sorts"
|
|
||||||
],
|
|
||||||
"entity": "Item",
|
|
||||||
"private": false
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "sorts-narcos",
|
"name": "sorts-narcos",
|
||||||
"label": "Sorts de Narcos",
|
"label": "Sorts de Narcos",
|
||||||
"system": "foundryvtt-reve-de-dragon",
|
"system": "foundryvtt-reve-de-dragon",
|
||||||
"module": "foundryvtt-reve-de-dragon",
|
"path": "packs/sorts-narcos.db",
|
||||||
"path": "./packs/sorts-narcos.db",
|
|
||||||
"type": "Item",
|
"type": "Item",
|
||||||
"tags": [
|
"private": false,
|
||||||
"item",
|
"flags": {}
|
||||||
"sorts"
|
|
||||||
],
|
|
||||||
"entity": "Item",
|
|
||||||
"private": false
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "sorts-thanatos",
|
"name": "sorts-thanatos",
|
||||||
"label": "Sorts de Thanatos",
|
"label": "Sorts de Thanatos",
|
||||||
"system": "foundryvtt-reve-de-dragon",
|
"system": "foundryvtt-reve-de-dragon",
|
||||||
"module": "foundryvtt-reve-de-dragon",
|
"path": "packs/sorts-thanatos.db",
|
||||||
"path": "./packs/sorts-thanatos.db",
|
|
||||||
"type": "Item",
|
"type": "Item",
|
||||||
"tags": [
|
"private": false,
|
||||||
"item",
|
"flags": {}
|
||||||
"sorts"
|
|
||||||
],
|
|
||||||
"entity": "Item",
|
|
||||||
"private": false
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "equipement",
|
"name": "equipement",
|
||||||
"label": "Equipement",
|
"label": "Equipement",
|
||||||
"system": "foundryvtt-reve-de-dragon",
|
"system": "foundryvtt-reve-de-dragon",
|
||||||
"module": "foundryvtt-reve-de-dragon",
|
"path": "packs/equipement.db",
|
||||||
"path": "./packs/equipement.db",
|
|
||||||
"type": "Item",
|
"type": "Item",
|
||||||
"tags": [
|
"private": false,
|
||||||
"item",
|
"flags": {}
|
||||||
"équipement",
|
|
||||||
"objet"
|
|
||||||
],
|
|
||||||
"entity": "Item",
|
|
||||||
"private": false
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "maladies-et-poisons",
|
"name": "maladies-et-poisons",
|
||||||
"label": "Maladies & Poisons",
|
"label": "Maladies & Poisons",
|
||||||
"system": "foundryvtt-reve-de-dragon",
|
"system": "foundryvtt-reve-de-dragon",
|
||||||
"module": "foundryvtt-reve-de-dragon",
|
"path": "packs/maladies-et-poisons.db",
|
||||||
"path": "./packs/maladies-et-poisons.db",
|
|
||||||
"type": "Item",
|
"type": "Item",
|
||||||
"tags": [
|
"private": false,
|
||||||
"maladie",
|
"flags": {}
|
||||||
"poison"
|
|
||||||
],
|
|
||||||
"entity": "Item",
|
|
||||||
"private": false
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "rappel-des-regles",
|
"name": "rappel-des-regles",
|
||||||
"label": "Rappels des Règles",
|
"label": "Rappels des Règles",
|
||||||
"system": "foundryvtt-reve-de-dragon",
|
"system": "foundryvtt-reve-de-dragon",
|
||||||
"module": "foundryvtt-reve-de-dragon",
|
"path": "packs/rappel-des-regles.db",
|
||||||
"path": "./packs/rappel-des-regles.db",
|
|
||||||
"type": "JournalEntry",
|
"type": "JournalEntry",
|
||||||
"tags": [
|
"private": false,
|
||||||
"journal",
|
"flags": {}
|
||||||
"règles"
|
|
||||||
],
|
|
||||||
"entity": "JournalEntry",
|
|
||||||
"private": false
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "queues-de-dragon",
|
"name": "queues-de-dragon",
|
||||||
"label": "Queues de Dragon",
|
"label": "Queues de Dragon",
|
||||||
"system": "foundryvtt-reve-de-dragon",
|
"system": "foundryvtt-reve-de-dragon",
|
||||||
"module": "foundryvtt-reve-de-dragon",
|
"path": "packs/queues-de-dragon.db",
|
||||||
"path": "./packs/queues-de-dragon.db",
|
|
||||||
"type": "Item",
|
"type": "Item",
|
||||||
"tags": [
|
"private": false,
|
||||||
"item",
|
"flags": {}
|
||||||
"queue"
|
|
||||||
],
|
|
||||||
"entity": "Item",
|
|
||||||
"private": false
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "ombres-de-thanatos",
|
"name": "ombres-de-thanatos",
|
||||||
"label": "Ombres de Thanatos",
|
"label": "Ombres de Thanatos",
|
||||||
"system": "foundryvtt-reve-de-dragon",
|
"system": "foundryvtt-reve-de-dragon",
|
||||||
"module": "foundryvtt-reve-de-dragon",
|
"path": "packs/ombres-de-thanatos.db",
|
||||||
"path": "./packs/ombres-de-thanatos.db",
|
|
||||||
"type": "Item",
|
"type": "Item",
|
||||||
"tags": [
|
"private": false,
|
||||||
"item",
|
"flags": {}
|
||||||
"ombre"
|
|
||||||
],
|
|
||||||
"entity": "Item",
|
|
||||||
"private": false
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "souffles-de-dragon",
|
"name": "souffles-de-dragon",
|
||||||
"label": "Souffles de Dragon",
|
"label": "Souffles de Dragon",
|
||||||
"system": "foundryvtt-reve-de-dragon",
|
"system": "foundryvtt-reve-de-dragon",
|
||||||
"module": "foundryvtt-reve-de-dragon",
|
"path": "packs/souffles-de-dragon.db",
|
||||||
"path": "./packs/souffles-de-dragon.db",
|
|
||||||
"type": "Item",
|
"type": "Item",
|
||||||
"tags": [
|
"private": false,
|
||||||
"item",
|
"flags": {}
|
||||||
"souffle"
|
|
||||||
],
|
|
||||||
"entity": "Item",
|
|
||||||
"private": false
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "tarot-draconique",
|
"name": "tarot-draconique",
|
||||||
"label": "Tarot Draconique",
|
"label": "Tarot Draconique",
|
||||||
"system": "foundryvtt-reve-de-dragon",
|
"system": "foundryvtt-reve-de-dragon",
|
||||||
"module": "foundryvtt-reve-de-dragon",
|
"path": "packs/tarot-draconique.db",
|
||||||
"path": "./packs/tarot-draconique.db",
|
|
||||||
"type": "Item",
|
"type": "Item",
|
||||||
"tags": [
|
"private": false,
|
||||||
"item",
|
"flags": {}
|
||||||
"tarot"
|
|
||||||
],
|
|
||||||
"entity": "Item",
|
|
||||||
"private": false
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "tetes-de-dragon-pour-haut-revants",
|
"name": "tetes-de-dragon-pour-haut-revants",
|
||||||
"label": "Têtes de Dragon (Hauts-Rêvants)",
|
"label": "Têtes de Dragon (Hauts-Rêvants)",
|
||||||
"system": "foundryvtt-reve-de-dragon",
|
"system": "foundryvtt-reve-de-dragon",
|
||||||
"module": "foundryvtt-reve-de-dragon",
|
"path": "packs/tetes-de-dragon-pour-haut-revants.db",
|
||||||
"path": "./packs/tetes-de-dragon-pour-haut-revants.db",
|
|
||||||
"type": "Item",
|
"type": "Item",
|
||||||
"tags": [
|
"private": false,
|
||||||
"item",
|
"flags": {}
|
||||||
"tête"
|
|
||||||
],
|
|
||||||
"entity": "Item",
|
|
||||||
"private": false
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "tetes-de-dragon-pour-tous-personnages",
|
"name": "tetes-de-dragon-pour-tous-personnages",
|
||||||
"label": "Têtes de Dragon (Tous Personnages)",
|
"label": "Têtes de Dragon (Tous Personnages)",
|
||||||
"system": "foundryvtt-reve-de-dragon",
|
"system": "foundryvtt-reve-de-dragon",
|
||||||
"module": "foundryvtt-reve-de-dragon",
|
"path": "packs/tetes-de-dragon-pour-tous-personnages.db",
|
||||||
"path": "./packs/tetes-de-dragon-pour-tous-personnages.db",
|
|
||||||
"type": "Item",
|
"type": "Item",
|
||||||
"tags": [
|
"private": false,
|
||||||
"item",
|
"flags": {}
|
||||||
"tête"
|
|
||||||
],
|
|
||||||
"entity": "Item",
|
|
||||||
"private": false
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "tables-diverses",
|
"name": "tables-diverses",
|
||||||
"label": "Tables Diverses",
|
"label": "Tables Diverses",
|
||||||
"system": "foundryvtt-reve-de-dragon",
|
"system": "foundryvtt-reve-de-dragon",
|
||||||
"module": "foundryvtt-reve-de-dragon",
|
"path": "packs/tables-diverses.db",
|
||||||
"path": "./packs/tables-diverses.db",
|
|
||||||
"type": "RollTable",
|
"type": "RollTable",
|
||||||
"tags": [
|
"private": false,
|
||||||
"table",
|
"flags": {}
|
||||||
"tables"
|
|
||||||
],
|
|
||||||
"entity": "RollTable",
|
|
||||||
"private": false
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "animaux",
|
"name": "animaux",
|
||||||
"label": "Animaux",
|
"label": "Animaux",
|
||||||
"system": "foundryvtt-reve-de-dragon",
|
"system": "foundryvtt-reve-de-dragon",
|
||||||
"module": "foundryvtt-reve-de-dragon",
|
"path": "packs/animaux.db",
|
||||||
"path": "./packs/animaux.db",
|
|
||||||
"type": "Actor",
|
"type": "Actor",
|
||||||
"tags": [
|
"private": false,
|
||||||
"animaux",
|
"flags": {}
|
||||||
"creature"
|
|
||||||
],
|
|
||||||
"entity": "Actor",
|
|
||||||
"private": false
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "voyageurs",
|
"name": "voyageurs",
|
||||||
"label": "Voyageurs",
|
"label": "Voyageurs",
|
||||||
"system": "foundryvtt-reve-de-dragon",
|
"system": "foundryvtt-reve-de-dragon",
|
||||||
"module": "foundryvtt-reve-de-dragon",
|
"path": "packs/voyageurs.db",
|
||||||
"path": "./packs/voyageurs.db",
|
|
||||||
"type": "Actor",
|
"type": "Actor",
|
||||||
"tags": [
|
"private": false,
|
||||||
"voyageur",
|
"flags": {}
|
||||||
"profils"
|
|
||||||
],
|
|
||||||
"entity": "Actor",
|
|
||||||
"private": false
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "vehicules",
|
"name": "vehicules",
|
||||||
"label": "Véhicules",
|
"label": "Véhicules",
|
||||||
"system": "foundryvtt-reve-de-dragon",
|
"system": "foundryvtt-reve-de-dragon",
|
||||||
"module": "foundryvtt-reve-de-dragon",
|
"path": "packs/vehicules.db",
|
||||||
"path": "./packs/vehicules.db",
|
|
||||||
"type": "Actor",
|
"type": "Actor",
|
||||||
"tags": [
|
"private": false,
|
||||||
"vehicule",
|
"flags": {}
|
||||||
"bateau",
|
|
||||||
"charett",
|
|
||||||
"chariot",
|
|
||||||
"carriole",
|
|
||||||
"barque"
|
|
||||||
],
|
|
||||||
"entity": "Actor",
|
|
||||||
"private": false
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "archetypes",
|
"name": "archetypes",
|
||||||
"label": "Archetypes PNJs",
|
"label": "Archetypes PNJs",
|
||||||
"system": "foundryvtt-reve-de-dragon",
|
"system": "foundryvtt-reve-de-dragon",
|
||||||
"module": "foundryvtt-reve-de-dragon",
|
"path": "packs/archetypes.db",
|
||||||
"path": "./packs/archetypes.db",
|
|
||||||
"type": "Actor",
|
"type": "Actor",
|
||||||
"tags": [
|
"private": false,
|
||||||
"archetype",
|
"flags": {}
|
||||||
"pnj"
|
|
||||||
],
|
|
||||||
"entity": "Actor",
|
|
||||||
"private": false
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "humanoides",
|
"name": "humanoides",
|
||||||
"label": "Humanoïdes",
|
"label": "Humanoïdes",
|
||||||
"system": "foundryvtt-reve-de-dragon",
|
"system": "foundryvtt-reve-de-dragon",
|
||||||
"module": "foundryvtt-reve-de-dragon",
|
"path": "packs/humanoides.db",
|
||||||
"path": "./packs/humanoides.db",
|
|
||||||
"type": "Actor",
|
"type": "Actor",
|
||||||
"tags": [
|
"private": false,
|
||||||
"humanoides",
|
"flags": {}
|
||||||
"pnj"
|
|
||||||
],
|
|
||||||
"entity": "Actor",
|
|
||||||
"private": false
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "entites",
|
"name": "entites",
|
||||||
"label": "Entités de Cauchemar",
|
"label": "Entités de Cauchemar",
|
||||||
"system": "foundryvtt-reve-de-dragon",
|
"system": "foundryvtt-reve-de-dragon",
|
||||||
"module": "foundryvtt-reve-de-dragon",
|
"path": "packs/entites-de-cauchemar.db",
|
||||||
"path": "./packs/entites-de-cauchemar.db",
|
|
||||||
"type": "Actor",
|
"type": "Actor",
|
||||||
"tags": [
|
"private": false,
|
||||||
"entités",
|
"flags": {}
|
||||||
"entite",
|
|
||||||
"cauchemar",
|
|
||||||
"ecni",
|
|
||||||
"eni"
|
|
||||||
],
|
|
||||||
"entity": "Actor",
|
|
||||||
"private": false
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "invocations",
|
"name": "invocations",
|
||||||
"label": "Invocation d'Hypnos",
|
"label": "Invocation d'Hypnos",
|
||||||
"system": "foundryvtt-reve-de-dragon",
|
"system": "foundryvtt-reve-de-dragon",
|
||||||
"module": "foundryvtt-reve-de-dragon",
|
"path": "packs/invocations.db",
|
||||||
"path": "./packs/invocations.db",
|
|
||||||
"type": "Actor",
|
"type": "Actor",
|
||||||
"tags": [
|
"private": false,
|
||||||
"hypnos",
|
"flags": {}
|
||||||
"invocation"
|
|
||||||
],
|
|
||||||
"entity": "Actor",
|
|
||||||
"private": false
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "botanique",
|
"name": "botanique",
|
||||||
"label": "Botanique",
|
"label": "Botanique",
|
||||||
"system": "foundryvtt-reve-de-dragon",
|
"system": "foundryvtt-reve-de-dragon",
|
||||||
"module": "foundryvtt-reve-de-dragon",
|
"path": "packs/botanique.db",
|
||||||
"path": "./packs/botanique.db",
|
|
||||||
"type": "Item",
|
"type": "Item",
|
||||||
"tags": [
|
"private": false,
|
||||||
"plantes",
|
"flags": {}
|
||||||
"champignons",
|
|
||||||
"herbes"
|
|
||||||
],
|
|
||||||
"entity": "Item",
|
|
||||||
"private": false
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "taches-courantes",
|
"name": "taches-courantes",
|
||||||
"label": "Tâches courantes",
|
"label": "Tâches courantes",
|
||||||
"system": "foundryvtt-reve-de-dragon",
|
"system": "foundryvtt-reve-de-dragon",
|
||||||
"module": "foundryvtt-reve-de-dragon",
|
"path": "packs/taches-courantes.db",
|
||||||
"path": "./packs/taches-courantes.db",
|
|
||||||
"type": "Item",
|
"type": "Item",
|
||||||
"tags": [
|
"private": false,
|
||||||
"taches"
|
"flags": {}
|
||||||
],
|
|
||||||
"entity": "Item",
|
|
||||||
"private": false
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "meditations-et-ecrits",
|
"name": "meditations-et-ecrits",
|
||||||
"label": "Méditations et Ecrits",
|
"label": "Méditations et Ecrits",
|
||||||
"system": "foundryvtt-reve-de-dragon",
|
"system": "foundryvtt-reve-de-dragon",
|
||||||
"module": "foundryvtt-reve-de-dragon",
|
"path": "packs/meditations-et-ecrits.db",
|
||||||
"path": "./packs/meditations-et-ecrits.db",
|
|
||||||
"type": "Item",
|
"type": "Item",
|
||||||
"tags": [
|
"private": false,
|
||||||
"meditations",
|
"flags": {}
|
||||||
"méditations",
|
|
||||||
"livres",
|
|
||||||
"livre",
|
|
||||||
"méditation",
|
|
||||||
"écrits",
|
|
||||||
"écrit"
|
|
||||||
],
|
|
||||||
"entity": "Item",
|
|
||||||
"private": false
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "recettes-alchimiques",
|
"name": "recettes-alchimiques",
|
||||||
"label": "Recettes Alchimiques",
|
"label": "Recettes Alchimiques",
|
||||||
"system": "foundryvtt-reve-de-dragon",
|
"system": "foundryvtt-reve-de-dragon",
|
||||||
"module": "foundryvtt-reve-de-dragon",
|
"path": "packs/recettes-alchimiques.db",
|
||||||
"path": "./packs/recettes-alchimiques.db",
|
|
||||||
"type": "Item",
|
"type": "Item",
|
||||||
"tags": [
|
"private": false,
|
||||||
"recettes",
|
"flags": {}
|
||||||
"recette",
|
|
||||||
"alchimie",
|
|
||||||
"alchimique",
|
|
||||||
"potion"
|
|
||||||
],
|
|
||||||
"entity": "Item",
|
|
||||||
"private": false
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "scenes-rdd",
|
"name": "scenes-rdd",
|
||||||
"label": "Scenes Reve de Dragon",
|
"label": "Scenes Reve de Dragon",
|
||||||
"system": "foundryvtt-reve-de-dragon",
|
"system": "foundryvtt-reve-de-dragon",
|
||||||
"module": "foundryvtt-reve-de-dragon",
|
"path": "packs/scenes-rdd.db",
|
||||||
"path": "./packs/scenes-rdd.db",
|
|
||||||
"type": "Scene",
|
"type": "Scene",
|
||||||
"tags": [
|
"private": false,
|
||||||
"ecran",
|
"flags": {}
|
||||||
"scene"
|
|
||||||
],
|
|
||||||
"entity": "Scene",
|
|
||||||
"private": false
|
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"system": [],
|
|
||||||
"dependencies": [],
|
|
||||||
"socket": true,
|
"socket": true,
|
||||||
"manifest": "https://www.uberwald.me/gitea/public/foundryvtt-reve-de-dragon/raw/v1.5/system.json",
|
"manifest": "https://www.uberwald.me/gitea/public/foundryvtt-reve-de-dragon/raw/v10/system.json",
|
||||||
"download": "https://www.uberwald.me/gitea/public/foundryvtt-reve-de-dragon/archive/foundryvtt-reve-de-dragon-1.5.87.zip",
|
"download": "https://www.uberwald.me/gitea/public/foundryvtt-reve-de-dragon/archive/foundryvtt-reve-de-dragon-10.0.22.zip",
|
||||||
"protected": false,
|
|
||||||
"gridDistance": 1,
|
"gridDistance": 1,
|
||||||
"gridUnits": "m",
|
"gridUnits": "m",
|
||||||
"primaryTokenAttribute": "sante.vie",
|
"primaryTokenAttribute": "sante.vie",
|
||||||
"secondaryTokenAttribute": "sante.endurance"
|
"secondaryTokenAttribute": "sante.endurance"
|
||||||
}
|
}
|
@ -31,13 +31,27 @@
|
|||||||
},
|
},
|
||||||
"vehicule": {
|
"vehicule": {
|
||||||
"categorie": "",
|
"categorie": "",
|
||||||
"resistance": 0,
|
|
||||||
"structure": 0,
|
|
||||||
"vitesse": "",
|
"vitesse": "",
|
||||||
"bonus": "",
|
"bonus": "",
|
||||||
"manoeuvrabilite": "",
|
"manoeuvrabilite": "",
|
||||||
"equipage": 0,
|
"equipage": 0,
|
||||||
"capacite_encombrement": 0
|
"capacite_encombrement": 0,
|
||||||
|
"etat": {
|
||||||
|
"resistance" : {
|
||||||
|
"type": "number",
|
||||||
|
"max": 20,
|
||||||
|
"value": 20,
|
||||||
|
"label": "Résistance",
|
||||||
|
"derivee": false
|
||||||
|
},
|
||||||
|
"structure":{
|
||||||
|
"type": "number",
|
||||||
|
"max": 10,
|
||||||
|
"value": 10,
|
||||||
|
"label": "Structure",
|
||||||
|
"derivee": false
|
||||||
|
}
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"entite": {
|
"entite": {
|
||||||
"definition": {
|
"definition": {
|
||||||
@ -576,7 +590,7 @@
|
|||||||
"types": ["objet", "arme", "armure", "conteneur", "competence", "sort", "herbe", "ingredient", "livre", "potion", "munition", "rencontresTMR", "queue", "ombre", "souffle",
|
"types": ["objet", "arme", "armure", "conteneur", "competence", "sort", "herbe", "ingredient", "livre", "potion", "munition", "rencontresTMR", "queue", "ombre", "souffle",
|
||||||
"tete", "competencecreature", "tarot", "monnaie", "nombreastral", "tache", "meditation", "casetmr", "recettealchimique",
|
"tete", "competencecreature", "tarot", "monnaie", "nombreastral", "tache", "meditation", "casetmr", "recettealchimique",
|
||||||
"musique", "chant", "danse", "jeu", "recettecuisine", "maladie", "poison", "oeuvre", "nourritureboisson", "signedraconique", "gemme",
|
"musique", "chant", "danse", "jeu", "recettecuisine", "maladie", "poison", "oeuvre", "nourritureboisson", "signedraconique", "gemme",
|
||||||
"possession" ],
|
"possession", "sortreserve" ],
|
||||||
"possession": {
|
"possession": {
|
||||||
"typepossession": "",
|
"typepossession": "",
|
||||||
"possede": false,
|
"possede": false,
|
||||||
@ -679,9 +693,10 @@
|
|||||||
"categorie_parade": "",
|
"categorie_parade": "",
|
||||||
"niveau": 0,
|
"niveau": 0,
|
||||||
"default_diffLibre": 0,
|
"default_diffLibre": 0,
|
||||||
|
"categorie": "",
|
||||||
"carac_value": 0,
|
"carac_value": 0,
|
||||||
"iscombat": false,
|
"iscombat": false,
|
||||||
"isparade": false,
|
"isnaturelle": true,
|
||||||
"ispossession": false,
|
"ispossession": false,
|
||||||
"dommages": 0,
|
"dommages": 0,
|
||||||
"description": "Compétence : ...",
|
"description": "Compétence : ...",
|
||||||
@ -889,7 +904,7 @@
|
|||||||
"descriptionmj": ""
|
"descriptionmj": ""
|
||||||
},
|
},
|
||||||
"oeuvre": {
|
"oeuvre": {
|
||||||
"default_carac": "",
|
"default_carac": "",
|
||||||
"competence": "",
|
"competence": "",
|
||||||
"niveau": 0,
|
"niveau": 0,
|
||||||
"reference": "",
|
"reference": "",
|
||||||
@ -943,6 +958,14 @@
|
|||||||
},
|
},
|
||||||
"description": "",
|
"description": "",
|
||||||
"descriptionmj": ""
|
"descriptionmj": ""
|
||||||
|
},
|
||||||
|
"sortreserve": {
|
||||||
|
"sortid" : "",
|
||||||
|
"draconic": "",
|
||||||
|
"coord": "",
|
||||||
|
"ptreve": 0,
|
||||||
|
"heurecible": "",
|
||||||
|
"echectotal": false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,27 +0,0 @@
|
|||||||
<tr class="table-row alterne-row item" data-blessure-type="{{gravite}}" data-attribute={{key}} data-blessure-index="{{key}}" >
|
|
||||||
<td class="blessure-control" title="Blessure {{title}}" data-blessure-active="{{bless.active}}">
|
|
||||||
{{#if bless.active}}
|
|
||||||
<i class="fas fa-skull-crossbones blessure-active-{{gravite}}" name="blessure-{{gravite}}-{{key}}-active"></i>
|
|
||||||
{{else}}
|
|
||||||
<i class="fas fa-skull-crossbones blessure-inactive" name="blessure-{{gravite}}-{{key}}-active"></i>
|
|
||||||
{{/if}}
|
|
||||||
</td>
|
|
||||||
<td>
|
|
||||||
<input class="blessures-soins blessure-localisation" type="text" name="blessure-{{gravite}}-{{key}}-localisation" data-dtype="String" value="{{bless.loc}}"/>
|
|
||||||
</td>
|
|
||||||
<td>
|
|
||||||
<input class="blessures-soins blessure-premiers_soins" type="text" name="blessure-{{gravite}}-{{key}}-premiers_soins" data-dtype="number" value="{{bless.premiers_soins}}"/>
|
|
||||||
</td>
|
|
||||||
<td>
|
|
||||||
<input class="blessures-soins blessure-psdone" name="blessure-{{gravite}}-{{key}}-psdone" type="checkbox" name="bless.psdone" {{#if bless.psdone}}checked{{/if}}/>
|
|
||||||
</td>
|
|
||||||
<td>
|
|
||||||
<input class="blessures-soins blessure-soins_complets" type="text" name="blessure-{{gravite}}-{{key}}-soins_complets" data-dtype="number" value="{{bless.soins_complets}}"/>
|
|
||||||
</td>
|
|
||||||
<td>
|
|
||||||
<input class="blessures-soins blessure-scdone" name="blessure-{{gravite}}-{{key}}-scdone" type="checkbox" name="bless.scdone" {{#if bless.scdone}}checked{{/if}}/>
|
|
||||||
</td>
|
|
||||||
<td>
|
|
||||||
<input class="blessures-soins blessure-jours" type="text" name="blessure-{{gravite}}-{{key}}-jours" name="jours" data-dtype="number" value="{{bless.jours}}"/>
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
@ -18,7 +18,7 @@
|
|||||||
<span>{{calc.resumeBlessures}}</span>
|
<span>{{calc.resumeBlessures}}</span>
|
||||||
</div>
|
</div>
|
||||||
<div class="flexrow">
|
<div class="flexrow">
|
||||||
{{>"systems/foundryvtt-reve-de-dragon/templates/actor-sheet-effects-partial.html"}}
|
{{>"systems/foundryvtt-reve-de-dragon/templates/actor/effects.html"}}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@ -41,15 +41,15 @@
|
|||||||
<div class="grid grid-2col">
|
<div class="grid grid-2col">
|
||||||
<div class="flex-group-left flexcol">
|
<div class="flex-group-left flexcol">
|
||||||
<ol class="carac-list alterne-list">
|
<ol class="carac-list alterne-list">
|
||||||
{{#each data.carac as |carac key|}}
|
{{#each system.carac as |carac key|}}
|
||||||
<li class="flexrow list-item" data-attribute="{{key}}">
|
<li class="flexrow list-item" data-attribute="{{key}}">
|
||||||
{{#if (eq key 'taille')}}
|
{{#if (eq key 'taille')}}
|
||||||
<span class="carac-label flexrow" name="data.carac.{{key}}.label">{{carac.label}}</span>
|
<span class="carac-label flexrow" name="system.carac.{{key}}.label">{{carac.label}}</span>
|
||||||
{{else}}
|
{{else}}
|
||||||
<span class="carac-label flexrow" name="data.carac.{{key}}.label"><a
|
<span class="carac-label flexrow" name="system.carac.{{key}}.label"><a
|
||||||
name={{key}}>{{carac.label}}</a></span>
|
name={{key}}>{{carac.label}}</a></span>
|
||||||
{{/if}}
|
{{/if}}
|
||||||
<input class="competence-value flexrow" type="text" name="data.carac.{{key}}.value"
|
<input class="competence-value flexrow" type="text" name="system.carac.{{key}}.value"
|
||||||
value="{{carac.value}}" data-dtype="{{carac.type}}" />
|
value="{{carac.value}}" data-dtype="{{carac.type}}" />
|
||||||
</li>
|
</li>
|
||||||
{{/each}}
|
{{/each}}
|
||||||
@ -61,29 +61,29 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="flex-group-left flexcol">
|
<div class="flex-group-left flexcol">
|
||||||
<ol class="carac-list alterne-list">
|
<ol class="carac-list alterne-list">
|
||||||
{{#each data.attributs as |attr key|}}
|
{{#each system.attributs as |attr key|}}
|
||||||
<li class="flexrow list-item" data-attribute="{{key}}">
|
<li class="flexrow list-item" data-attribute="{{key}}">
|
||||||
<span class="carac-label" name="data.attributs.{{key}}.label">{{attr.label}}</span>
|
<span class="carac-label" name="system.attributs.{{key}}.label">{{attr.label}}</span>
|
||||||
<input type="text" name="data.attributs.{{key}}.value" value="{{attr.value}}" data-dtype="{{attr.type}}" />
|
<input type="text" name="system.attributs.{{key}}.value" value="{{attr.value}}" data-dtype="{{attr.type}}" />
|
||||||
</li>
|
</li>
|
||||||
{{/each}}
|
{{/each}}
|
||||||
<li class="flexrow list-item" data-attribute="vie">
|
<li class="flexrow list-item" data-attribute="vie">
|
||||||
<span class="competence-label" name="data.sante.vie.label">Vie</span>
|
<span class="competence-label" name="system.sante.vie.label">Vie</span>
|
||||||
<span class="flexrow" >
|
<span class="flexrow" >
|
||||||
<input type="text" name="data.sante.vie.value" value="{{data.sante.vie.value}}" data-dtype="Number" /> /
|
<input type="text" name="system.sante.vie.value" value="{{system.sante.vie.value}}" data-dtype="Number" /> /
|
||||||
<input type="text" name="data.sante.vie.max" value="{{data.sante.vie.max}}" data-dtype="Number" />
|
<input type="text" name="system.sante.vie.max" value="{{system.sante.vie.max}}" data-dtype="Number" />
|
||||||
</span>
|
</span>
|
||||||
</li>
|
</li>
|
||||||
<li class="flexrow list-item" data-attribute="endurance">
|
<li class="flexrow list-item" data-attribute="endurance">
|
||||||
<span class="competence-label" name="data.sante.endurance.label">Endurance</span>
|
<span class="competence-label" name="system.sante.endurance.label">Endurance</span>
|
||||||
<span class="flexrow" >
|
<span class="flexrow" >
|
||||||
<input type="text" name="data.sante.endurance.value" value="{{data.sante.endurance.value}}" data-dtype="Number" /> /
|
<input type="text" name="system.sante.endurance.value" value="{{system.sante.endurance.value}}" data-dtype="Number" /> /
|
||||||
<input type="text" name="data.sante.endurance.max" value="{{data.sante.endurance.max}}" data-dtype="Number" />
|
<input type="text" name="system.sante.endurance.max" value="{{system.sante.endurance.max}}" data-dtype="Number" />
|
||||||
</span>
|
</span>
|
||||||
</li>
|
</li>
|
||||||
<li class="flexrow list-item" data-attribute="etat">
|
<li class="flexrow list-item" data-attribute="etat">
|
||||||
<span class="competence-label" name="data.compteurs.etat.label">Etat Général</span>
|
<span class="competence-label" name="system.compteurs.etat.label">Etat Général</span>
|
||||||
<input type="text" value="{{data.compteurs.etat.value}}" disabled />
|
<input type="text" value="{{system.compteurs.etat.value}}" disabled />
|
||||||
</li>
|
</li>
|
||||||
</ol>
|
</ol>
|
||||||
</div>
|
</div>
|
||||||
@ -102,11 +102,11 @@
|
|||||||
<span class="competence-label">{{comp.name}}</span>
|
<span class="competence-label">{{comp.name}}</span>
|
||||||
</a>
|
</a>
|
||||||
<input class="competence-value creature-carac" type="text" compname="{{comp.name}}"
|
<input class="competence-value creature-carac" type="text" compname="{{comp.name}}"
|
||||||
value="{{comp.data.carac_value}}" data-dtype="number" />
|
value="{{comp.system.carac_value}}" data-dtype="number" />
|
||||||
<input class="competence-value creature-niveau" type="text" compname="{{comp.name}}"
|
<input class="competence-value creature-niveau" type="text" compname="{{comp.name}}"
|
||||||
value="{{numberFormat comp.data.niveau decimals=0 sign=true}}" data-dtype="number" />
|
value="{{numberFormat comp.system.niveau decimals=0 sign=true}}" data-dtype="number" />
|
||||||
<input class="competence-value creature-dommages" type="text" compname="{{comp.name}}"
|
<input class="competence-value creature-dommages" type="text" compname="{{comp.name}}"
|
||||||
value="{{numberFormat comp.data.dommages decimals=0 sign=true}}" data-dtype="number" />
|
value="{{numberFormat comp.system.dommages decimals=0 sign=true}}" data-dtype="number" />
|
||||||
<div class="item-controls">
|
<div class="item-controls">
|
||||||
<a class="item-edit" title="Edit Item"><i class="fas fa-edit"></i></a>
|
<a class="item-edit" title="Edit Item"><i class="fas fa-edit"></i></a>
|
||||||
<a class="item-delete" title="Delete Item"><i class="fas fa-trash"></i></a>
|
<a class="item-delete" title="Delete Item"><i class="fas fa-trash"></i></a>
|
||||||
@ -121,12 +121,12 @@
|
|||||||
{{!-- blessures Tab --}}
|
{{!-- blessures Tab --}}
|
||||||
<div class="tab blessures" data-group="primary" data-tab="blessures" style="height:200px">
|
<div class="tab blessures" data-group="primary" data-tab="blessures" style="height:200px">
|
||||||
{{!-- Liste de blessures --}}
|
{{!-- Liste de blessures --}}
|
||||||
{{> "systems/foundryvtt-reve-de-dragon/templates/actor-liste-blessures-partial.html" this}}
|
{{> "systems/foundryvtt-reve-de-dragon/templates/actor/blessures.html"}}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{{!-- Equipment Tab --}}
|
{{!-- Equipment Tab --}}
|
||||||
<div class="tab items" data-group="primary" data-tab="items">
|
<div class="tab items" data-group="primary" data-tab="items">
|
||||||
{{> "systems/foundryvtt-reve-de-dragon/templates/actor-sheet-inventaire.html"}}
|
{{> "systems/foundryvtt-reve-de-dragon/templates/actor/inventaire.html"}}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{{!-- Biography Tab --}}
|
{{!-- Biography Tab --}}
|
||||||
@ -134,15 +134,15 @@
|
|||||||
|
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<span class="item-name"><h4>Race</h4></span>
|
<span class="item-name"><h4>Race</h4></span>
|
||||||
<input type="text" name="data.race" value="{{data.race}}" data-dtype="String" />
|
<input type="text" name="system.race" value="{{system.race}}" data-dtype="String" />
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="form-group editor">
|
<div class="form-group editor">
|
||||||
<span class="item-name"><h4>Description</h4>
|
<span class="item-name"><h4>Description</h4>
|
||||||
{{editor content=data.description target="data.description" button=true owner=owner editable=editable}}
|
{{editor description target="system.description" button=true owner=owner editable=true}}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{{>"systems/foundryvtt-reve-de-dragon/templates/actor-sheet-editor-notes-mj.html"}}
|
{{>"systems/foundryvtt-reve-de-dragon/templates/actor/editor-notes-mj.html"}}
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
@ -32,15 +32,15 @@
|
|||||||
<div class="grid grid-2col">
|
<div class="grid grid-2col">
|
||||||
<div class="flex-group-left flexcol">
|
<div class="flex-group-left flexcol">
|
||||||
<ol class="carac-list alterne-list">
|
<ol class="carac-list alterne-list">
|
||||||
{{#each data.carac as |carac key|}}
|
{{#each system.carac as |carac key|}}
|
||||||
<li class="caracteristique flexrow list-item" data-attribute="{{key}}">
|
<li class="caracteristique flexrow list-item" data-attribute="{{key}}">
|
||||||
{{#if (eq key 'taille')}}
|
{{#if (eq key 'taille')}}
|
||||||
<span class="carac-label flexrow" name="data.carac.{{key}}.label">{{carac.label}}</span>
|
<span class="carac-label flexrow" name="system.carac.{{key}}.label">{{carac.label}}</span>
|
||||||
{{else}}
|
{{else}}
|
||||||
<span class="carac-label flexrow" name="data.carac.{{key}}.label"><a
|
<span class="carac-label flexrow" name="system.carac.{{key}}.label"><a
|
||||||
name={{key}}>{{carac.label}}</a></span>
|
name={{key}}>{{carac.label}}</a></span>
|
||||||
{{/if}}
|
{{/if}}
|
||||||
<input class="competence-value flexrow" type="text" name="data.carac.{{key}}.value"
|
<input class="competence-value flexrow" type="text" name="system.carac.{{key}}.value"
|
||||||
value="{{carac.value}}" data-dtype="{{carac.type}}" />
|
value="{{carac.value}}" data-dtype="{{carac.type}}" />
|
||||||
</li>
|
</li>
|
||||||
{{/each}}
|
{{/each}}
|
||||||
@ -52,8 +52,8 @@
|
|||||||
<ol class="carac-list alterne-list">
|
<ol class="carac-list alterne-list">
|
||||||
<li class="caracteristique flexrow list-item">
|
<li class="caracteristique flexrow list-item">
|
||||||
<span class="carac-label flexrow" name="catEntite">Catégorie : </span>
|
<span class="carac-label flexrow" name="catEntite">Catégorie : </span>
|
||||||
<select name="data.definition.categorieentite" value="{{data.definition.categorieentite}}" data-dtype="String">
|
<select name="system.definition.categorieentite" value="{{system.definition.categorieentite}}" data-dtype="String">
|
||||||
{{#select data.definition.categorieentite}}
|
{{#select system.definition.categorieentite}}
|
||||||
<option value="cauchemar">Cauchemar</option>
|
<option value="cauchemar">Cauchemar</option>
|
||||||
<option value="reve">Rêve</option>
|
<option value="reve">Rêve</option>
|
||||||
{{/select}}
|
{{/select}}
|
||||||
@ -61,27 +61,27 @@
|
|||||||
</li>
|
</li>
|
||||||
<li class="caracteristique flexrow list-item">
|
<li class="caracteristique flexrow list-item">
|
||||||
<span class="carac-label flexrow" name="typeEntite">Type d'entité : </span>
|
<span class="carac-label flexrow" name="typeEntite">Type d'entité : </span>
|
||||||
<select name="data.definition.typeentite" value="{{data.definition.typeentite}}" data-dtype="String">
|
<select name="system.definition.typeentite" value="{{system.definition.typeentite}}" data-dtype="String">
|
||||||
{{#select data.definition.typeentite}}
|
{{#select system.definition.typeentite}}
|
||||||
<option value="incarne">Incarnée</option>
|
<option value="incarne">Incarnée</option>
|
||||||
<option value="nonincarne">Non Incarnée</option>
|
<option value="nonincarne">Non Incarnée</option>
|
||||||
<option value="blurette">Blurete</option>
|
<option value="blurette">Blurette</option>
|
||||||
{{/select}}
|
{{/select}}
|
||||||
</select>
|
</select>
|
||||||
</li>
|
</li>
|
||||||
{{#each data.attributs as |attr key|}}
|
{{#each system.attributs as |attr key|}}
|
||||||
<li class="caracteristique flexrow list-item" data-attribute="{{key}}">
|
<li class="caracteristique flexrow list-item" data-attribute="{{key}}">
|
||||||
<span class="carac-label flexrow" name="data.attributs.{{key}}.label">{{attr.label}} : </span>
|
<span class="carac-label flexrow" name="system.attributs.{{key}}.label">{{attr.label}} : </span>
|
||||||
<span><input class="attribut-value flexrow" type="text" name="data.attributs.{{key}}.value"
|
<span><input class="attribut-value flexrow" type="text" name="system.attributs.{{key}}.value"
|
||||||
value="{{attr.value}}" data-dtype="{{attr.type}}" /></span>
|
value="{{attr.value}}" data-dtype="{{attr.type}}" /></span>
|
||||||
</li>
|
</li>
|
||||||
{{/each}}
|
{{/each}}
|
||||||
<li class="caracteristique flexrow list-item" data-attribute="endurance">
|
<li class="caracteristique flexrow list-item" data-attribute="endurance">
|
||||||
<span class="competence-label flexrow" name="data.sante.endurance.label">Endurance : </span>
|
<span class="competence-label flexrow" name="system.sante.endurance.label">Endurance : </span>
|
||||||
<span><input class="sante-value flexrow" type="text" name="data.sante.endurance.value"
|
<span><input class="sante-value flexrow" type="text" name="system.sante.endurance.value"
|
||||||
value="{{data.sante.endurance.value}}" data-dtype="Number" /></span><span>/ </span>
|
value="{{system.sante.endurance.value}}" data-dtype="Number" /></span><span>/ </span>
|
||||||
<span><input class="sante-value flexrow" type="text" name="data.sante.endurance.max"
|
<span><input class="sante-value flexrow" type="text" name="system.sante.endurance.max"
|
||||||
value="{{data.sante.endurance.max}}" data-dtype="Number" /></span>
|
value="{{system.sante.endurance.max}}" data-dtype="Number" /></span>
|
||||||
</li>
|
</li>
|
||||||
</ol>
|
</ol>
|
||||||
</div>
|
</div>
|
||||||
@ -98,11 +98,11 @@
|
|||||||
<img class="sheet-competence-img" src="{{comp.img}}" />
|
<img class="sheet-competence-img" src="{{comp.img}}" />
|
||||||
<span class="competence-label"><a>{{comp.name}}</a></span>
|
<span class="competence-label"><a>{{comp.name}}</a></span>
|
||||||
<input class="competence-value creature-carac" type="text" compname="{{comp.name}}"
|
<input class="competence-value creature-carac" type="text" compname="{{comp.name}}"
|
||||||
value="{{comp.data.carac_value}}" data-dtype="number" />
|
value="{{comp.system.carac_value}}" data-dtype="number" />
|
||||||
<input class="competence-value creature-niveau" type="text" compname="{{comp.name}}"
|
<input class="competence-value creature-niveau" type="text" compname="{{comp.name}}"
|
||||||
value="{{numberFormat comp.data.niveau decimals=0 sign=true}}" data-dtype="number" />
|
value="{{numberFormat comp.system.niveau decimals=0 sign=true}}" data-dtype="number" />
|
||||||
<input class="competence-value creature-dommages" type="text" compname="{{comp.name}}"
|
<input class="competence-value creature-dommages" type="text" compname="{{comp.name}}"
|
||||||
value="{{numberFormat comp.data.dommages decimals=0 sign=true}}" data-dtype="number" />
|
value="{{numberFormat comp.system.dommages decimals=0 sign=true}}" data-dtype="number" />
|
||||||
<div class="item-controls">
|
<div class="item-controls">
|
||||||
<a class="item-edit" title="Edit Item"><i class="fas fa-edit"></i></a>
|
<a class="item-edit" title="Edit Item"><i class="fas fa-edit"></i></a>
|
||||||
<a class="item-delete" title="Delete Item"><i class="fas fa-trash"></i></a>
|
<a class="item-delete" title="Delete Item"><i class="fas fa-trash"></i></a>
|
||||||
@ -131,9 +131,9 @@
|
|||||||
{{!-- Biography Tab --}}
|
{{!-- Biography Tab --}}
|
||||||
<div class="tab description" data-group="primary" data-tab="description">
|
<div class="tab description" data-group="primary" data-tab="description">
|
||||||
<div class="form-group editor">
|
<div class="form-group editor">
|
||||||
{{editor content=data.description target="data.description" button=true owner=owner editable=editable}}
|
{{editor description target="system.description" button=true owner=owner editable=true}}
|
||||||
</div>
|
</div>
|
||||||
{{>"systems/foundryvtt-reve-de-dragon/templates/actor-sheet-editor-notes-mj.html"}}
|
{{>"systems/foundryvtt-reve-de-dragon/templates/actor/editor-notes-mj.html"}}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
</section>
|
</section>
|
||||||
|
@ -1,28 +0,0 @@
|
|||||||
<h3>Blessures:</h3>
|
|
||||||
<table class="table-container" role="table">
|
|
||||||
<thead>
|
|
||||||
<tr class="competence-header competence-title competence-label" >
|
|
||||||
<th></th>
|
|
||||||
<th>Loc.</th>
|
|
||||||
<th>Premiers soins</th>
|
|
||||||
<th>P.S. OK?</th>
|
|
||||||
<th>Soins complets</th>
|
|
||||||
<th>S.C. OK?</th>
|
|
||||||
<th>Age (jours)</th>
|
|
||||||
</tr>
|
|
||||||
</thead>
|
|
||||||
<tbody>
|
|
||||||
<tr class="table-row alterne-row" ><td/><td colspan="4">Légères</td></tr>
|
|
||||||
{{#each data.blessures.legeres.liste as |bless key|}}
|
|
||||||
{{> "systems/foundryvtt-reve-de-dragon/templates/actor-blessure-partial.html" bless=bless key=key gravite="legere" title="Légère"}}
|
|
||||||
{{/each}}
|
|
||||||
<tr class="table-row alterne-row"><td/><td colspan="4">Graves</td></tr>
|
|
||||||
{{#each data.blessures.graves.liste as |bless key|}}
|
|
||||||
{{> "systems/foundryvtt-reve-de-dragon/templates/actor-blessure-partial.html" bless=bless key=key gravite="grave" title="Grave"}}
|
|
||||||
{{/each}}
|
|
||||||
<tr class="table-row alterne-row"><td/><td colspan="4">Critiques</td></tr>
|
|
||||||
{{#each data.blessures.critiques.liste as |bless key|}}
|
|
||||||
{{> "systems/foundryvtt-reve-de-dragon/templates/actor-blessure-partial.html" bless=bless key=key gravite="critique" title="Critique"}}
|
|
||||||
{{/each}}
|
|
||||||
</tbody>
|
|
||||||
</table>
|
|
@ -1,51 +0,0 @@
|
|||||||
{{#if visible}}
|
|
||||||
<li class="item flexrow list-item {{#if data.isLevelUp}}xp-level-up tooltip{{/if}}" data-item-id="{{_id}}">
|
|
||||||
<a class="competence-label" name="{{name}}">
|
|
||||||
<img class="sheet-competence-img" src="{{img}}"/>
|
|
||||||
<span class="competence-label">{{name}}</span>
|
|
||||||
</a>
|
|
||||||
|
|
||||||
{{#if data.isLevelUp}}
|
|
||||||
<span class="tooltiptext ttt-xp">Vous pouvez dépenser {{data.xpNext}} points d'Experience pour augmenter de 1 votre compétence {{name}}</span>
|
|
||||||
<a class="competence-xp-augmenter" compname="{{name}}" title="Augmenter">
|
|
||||||
<i class="fas fa-arrow-alt-circle-up"></i>
|
|
||||||
</a>
|
|
||||||
{{/if}}
|
|
||||||
|
|
||||||
<input class="competence-value" type="text" compname="{{name}}" name="comp-value-{{name}}"
|
|
||||||
value="{{numberFormat data.niveau decimals=0 sign=true}}" data-dtype="number"
|
|
||||||
{{#unless @root.options.editCaracComp}}disabled{{/unless}} />
|
|
||||||
|
|
||||||
<span class="competence-xp tooltip">
|
|
||||||
<input class="competence-xp " type="text" compname="{{name}}" name="comp-xp-{{name}}"
|
|
||||||
value="{{numberFormat data.xp decimals=0 sign=false}}" data-dtype="number"
|
|
||||||
{{#unless @root.options.editCaracComp}}disabled{{/unless}} />
|
|
||||||
<span class="tooltiptext left-competence ttt-xp">Vous devez acquérir {{data.xpNext}} points d'Experience pour augmenter de 1 votre compétence {{name}}</span>
|
|
||||||
</span>
|
|
||||||
|
|
||||||
{{#if (eq data.categorie 'draconic')}}
|
|
||||||
<input class="competence-xp-sort" type="text" compname="{{name}}" name="comp-xp-sort-{{name}}"
|
|
||||||
value="{{numberFormat data.xp_sort decimals=0 sign=false}}" data-dtype="number"
|
|
||||||
{{#unless @root.options.editCaracComp}}disabled{{/unless}}/>
|
|
||||||
{{/if}}
|
|
||||||
{{#if @root.options.vueDetaillee}}
|
|
||||||
<div class="item-controls">
|
|
||||||
{{#if data.stressXpMax}}
|
|
||||||
<a class="competence-stress-augmenter" compname="{{name}}"
|
|
||||||
title="Dépenser {{data.stressXpMax}} points de stress {{#if data.isStressLevelUp}} pour augmenter d'un niveau {{/if}}">
|
|
||||||
<i class="fas fa-arrow-alt-circle-up allouer-stress {{#if data.isStressLevelUp}}level-up{{/if}}"></i>
|
|
||||||
</a>
|
|
||||||
{{else}}
|
|
||||||
<i class="far fa-circle"></i>
|
|
||||||
{{/if}}
|
|
||||||
<input class="competence-archetype niveau-archetype" type="text" compname="{{name}}" name="comp-archetype-{{name}}"
|
|
||||||
value="{{numberFormat data.niveau_archetype decimals=0 sign=true}}" data-dtype="number"
|
|
||||||
{{#unless @root.options.editCaracComp}}disabled{{/unless}} />
|
|
||||||
<a class="item-edit" title="Modifier"><i class="fas fa-edit"></i></a>
|
|
||||||
{{#if @root.options.isGM}}
|
|
||||||
<a class="item-delete" title="Supprimer"><i class="fas fa-trash"></i></a>
|
|
||||||
{{/if}}
|
|
||||||
</div>
|
|
||||||
{{/if}}
|
|
||||||
</li>
|
|
||||||
{{/if}}
|
|
@ -1,6 +0,0 @@
|
|||||||
{{#if options.isGM}}
|
|
||||||
<h3>Notes du MJ : </h3>
|
|
||||||
<div class="form-group editor">
|
|
||||||
{{editor content=data.notesmj target="data.notesmj" button=true owner=owner editable=editable}}
|
|
||||||
</div>
|
|
||||||
{{/if}}
|
|
@ -1,15 +0,0 @@
|
|||||||
<span class="item-name"><h4>Véhicules</h4></span>
|
|
||||||
<ul class="item-list alterne-list">
|
|
||||||
{{#each subacteurs.vehicules as |vehicule id|}}
|
|
||||||
<li class="item flexrow list-item" data-actor-id="{{vehicule.id}}">
|
|
||||||
<img class="sheet-competence-img" src="{{vehicule.img}}" title="{{vehicule.name}}"/>
|
|
||||||
<span class="flex-grow subacteur-label"><a>{{vehicule.name}}</a></span>
|
|
||||||
<span>{{vehicule.categorie}}</span>
|
|
||||||
<span>{{vehicule.structure}}</span>
|
|
||||||
<div class="flex-shrink">
|
|
||||||
<a class="subacteur-delete" title="Supprimer"><i class="fas fa-trash"></i></a>
|
|
||||||
</div>
|
|
||||||
</li>
|
|
||||||
{{/each}}
|
|
||||||
</ul>
|
|
||||||
|
|
@ -13,8 +13,8 @@
|
|||||||
<label class="compteur">
|
<label class="compteur">
|
||||||
<a class="jet-vie">Vie</a>
|
<a class="jet-vie">Vie</a>
|
||||||
<a class="vie-moins"><i class="fas fa-minus-square"></i></a>
|
<a class="vie-moins"><i class="fas fa-minus-square"></i></a>
|
||||||
<input class="resource-content" type="text" name="data.sante.vie.value" value="{{data.sante.vie.value}}" data-dtype="Number"/>
|
<input class="resource-content" type="text" name="system.sante.vie.value" value="{{system.sante.vie.value}}" data-dtype="Number"/>
|
||||||
<span>/ {{data.sante.vie.max}}</span>
|
<span>/ {{system.sante.vie.max}}</span>
|
||||||
<a class="vie-plus"><i class="fas fa-plus-square"></i></a>
|
<a class="vie-plus"><i class="fas fa-plus-square"></i></a>
|
||||||
</label>
|
</label>
|
||||||
</li>
|
</li>
|
||||||
@ -22,8 +22,8 @@
|
|||||||
<label class="compteur">
|
<label class="compteur">
|
||||||
<a class="jet-endurance">Endurance</a>
|
<a class="jet-endurance">Endurance</a>
|
||||||
<a class="endurance-moins"><i class="fas fa-minus-square"></i></a>
|
<a class="endurance-moins"><i class="fas fa-minus-square"></i></a>
|
||||||
<input class="resource-content" type="text" name="data.sante.endurance.value" value="{{data.sante.endurance.value}}" data-dtype="Number"/>
|
<input class="resource-content" type="text" name="system.sante.endurance.value" value="{{system.sante.endurance.value}}" data-dtype="Number"/>
|
||||||
<span>/ {{data.sante.endurance.max}}</span>
|
<span>/ {{system.sante.endurance.max}}</span>
|
||||||
<a class="endurance-plus"><i class="fas fa-plus-square"></i></a>
|
<a class="endurance-plus"><i class="fas fa-plus-square"></i></a>
|
||||||
</label>
|
</label>
|
||||||
</li>
|
</li>
|
||||||
@ -32,8 +32,8 @@
|
|||||||
<span class="tooltiptext ttt-fatigue">{{{calc.fatigue.html}}}</span>
|
<span class="tooltiptext ttt-fatigue">{{{calc.fatigue.html}}}</span>
|
||||||
Fatigue
|
Fatigue
|
||||||
<a class="fatigue-moins"><i class="fas fa-minus-square"></i></a>
|
<a class="fatigue-moins"><i class="fas fa-minus-square"></i></a>
|
||||||
<input class="resource-content" id="fatigue-value" type="text" name="data.sante.fatigue.value" value="{{data.sante.fatigue.value}}" data-dtype="Number" />
|
<input class="resource-content" id="fatigue-value" type="text" name="system.sante.fatigue.value" value="{{system.sante.fatigue.value}}" data-dtype="Number" />
|
||||||
<span>/ {{data.sante.fatigue.max}}</span>
|
<span>/ {{system.sante.fatigue.max}}</span>
|
||||||
<a class="fatigue-plus"><i class="fas fa-plus-square"></i></a>
|
<a class="fatigue-plus"><i class="fas fa-plus-square"></i></a>
|
||||||
</label>
|
</label>
|
||||||
</li>
|
</li>
|
||||||
@ -41,8 +41,8 @@
|
|||||||
<label class="compteur">
|
<label class="compteur">
|
||||||
<span class="ptreve-actuel"><a>Rêve</a></span>
|
<span class="ptreve-actuel"><a>Rêve</a></span>
|
||||||
<a class="ptreve-actuel-moins"><i class="fas fa-minus-square"></i></a>
|
<a class="ptreve-actuel-moins"><i class="fas fa-minus-square"></i></a>
|
||||||
<input class="resource-content" id="pointsreve-value" type="text" name="data.reve.reve.value" value="{{data.reve.reve.value}}" data-dtype="Number" />
|
<input class="resource-content" id="pointsreve-value" type="text" name="system.reve.reve.value" value="{{system.reve.reve.value}}" data-dtype="Number" />
|
||||||
<span>/ {{data.reve.seuil.value}}</span>
|
<span>/ {{system.reve.seuil.value}}</span>
|
||||||
<a class="ptreve-actuel-plus"><i class="fas fa-plus-square"></i></a>
|
<a class="ptreve-actuel-plus"><i class="fas fa-plus-square"></i></a>
|
||||||
</label>
|
</label>
|
||||||
</li>
|
</li>
|
||||||
@ -52,7 +52,7 @@
|
|||||||
<span class="encaisser-direct"><a title="Encaisser des dommages"><img class="button-img" src="icons/svg/bones.svg" alt="Encaisser des dommages"/></a></span>
|
<span class="encaisser-direct"><a title="Encaisser des dommages"><img class="button-img" src="icons/svg/bones.svg" alt="Encaisser des dommages"/></a></span>
|
||||||
<span class="gm-only remise-a-neuf"><a title="Remise à neuf"><img class="button-img" src="icons/svg/regen.svg" alt="Remise à neuf"/></a></span>
|
<span class="gm-only remise-a-neuf"><a title="Remise à neuf"><img class="button-img" src="icons/svg/regen.svg" alt="Remise à neuf"/></a></span>
|
||||||
<span class="repos"><a title="Repos"><img class="button-img" src="icons/svg/sleep.svg" alt="Se reposer"/></a></span>
|
<span class="repos"><a title="Repos"><img class="button-img" src="icons/svg/sleep.svg" alt="Se reposer"/></a></span>
|
||||||
{{#if data.attributs.hautrevant.value}}
|
{{#if system.attributs.hautrevant.value}}
|
||||||
<span class="monte-tmr"><a title="Montée dans les Terres Médianes !" {{#if hautreve.isDemiReve}}disabled{{/if}}><img class="button-img" src="systems/foundryvtt-reve-de-dragon/styles/img/ui/icon-tmr-normal.svg" alt="Montée dans les Terres Médianes !"/></a></span>
|
<span class="monte-tmr"><a title="Montée dans les Terres Médianes !" {{#if hautreve.isDemiReve}}disabled{{/if}}><img class="button-img" src="systems/foundryvtt-reve-de-dragon/styles/img/ui/icon-tmr-normal.svg" alt="Montée dans les Terres Médianes !"/></a></span>
|
||||||
<span class="monte-tmr-rapide"><a title="Montée accélérée dans les Terres Médianes !"><img class="button-img" src="systems/foundryvtt-reve-de-dragon/styles/img/ui/icon-tmr-rapide.svg" alt="Montée accélérée dans les Terres Médianes !"/></a></span>
|
<span class="monte-tmr-rapide"><a title="Montée accélérée dans les Terres Médianes !"><img class="button-img" src="systems/foundryvtt-reve-de-dragon/styles/img/ui/icon-tmr-rapide.svg" alt="Montée accélérée dans les Terres Médianes !"/></a></span>
|
||||||
<span class="visu-tmr"><a title="Regarder les Terres Médianes"><img class="button-img" src="systems/foundryvtt-reve-de-dragon/styles/img/ui/icon-tmr-view.svg" alt="Regarder les Terres Médianes"/></a></span>
|
<span class="visu-tmr"><a title="Regarder les Terres Médianes"><img class="button-img" src="systems/foundryvtt-reve-de-dragon/styles/img/ui/icon-tmr-view.svg" alt="Regarder les Terres Médianes"/></a></span>
|
||||||
@ -65,11 +65,11 @@
|
|||||||
<span>{{calc.resumeBlessures}}</span>
|
<span>{{calc.resumeBlessures}}</span>
|
||||||
</div>
|
</div>
|
||||||
<div class="flexrow">
|
<div class="flexrow">
|
||||||
<span>{{data.compteurs.etat.label}}: {{data.compteurs.etat.value}}</span>
|
<span>{{system.compteurs.etat.label}}: {{system.compteurs.etat.value}}</span>
|
||||||
<span>{{data.compteurs.surenc.label}}: {{data.compteurs.surenc.value}}</span>
|
<span>{{system.compteurs.surenc.label}}: {{system.compteurs.surenc.value}}</span>
|
||||||
</div>
|
</div>
|
||||||
<div class="flexrow">
|
<div class="flexrow">
|
||||||
{{>"systems/foundryvtt-reve-de-dragon/templates/actor-sheet-effects-partial.html"}}
|
{{>"systems/foundryvtt-reve-de-dragon/templates/actor/effects.html"}}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@ -93,41 +93,42 @@
|
|||||||
{{!-- Carac Tab --}}
|
{{!-- Carac Tab --}}
|
||||||
<div class="tab items" data-group="primary" data-tab="carac">
|
<div class="tab items" data-group="primary" data-tab="carac">
|
||||||
<div class="flexrow">
|
<div class="flexrow">
|
||||||
<span><a class="lock-unlock-sheet"><img class="small-button-container"
|
<span><a class="vue-detaillee">
|
||||||
src="systems/foundryvtt-reve-de-dragon/icons/{{#if options.editCaracComp}}unlocked.svg{{else}}locked.svg{{/if}}" alt="blocker/débloquer"
|
<i class="fas {{#if options.vueDetaillee}}fa-eye-slash{{else}}fa-eye{{/if}}"></i>
|
||||||
>{{#if options.editCaracComp}}Verrouiller{{else}}Déverrouiller{{/if}}</a></span>
|
{{#if options.vueDetaillee}}Vue simplifiée{{else}}Vue détaillée{{/if}}</a>
|
||||||
|
</span>
|
||||||
</div>
|
</div>
|
||||||
<div class="grid grid-2col">
|
<div class="grid grid-2col">
|
||||||
<div class="flex-group-left flexcol">
|
<div class="flex-group-left flexcol">
|
||||||
<ul class="carac-list alterne-list">
|
<ul class="carac-list alterne-list">
|
||||||
{{#each data.carac as |carac key|}}
|
{{#each system.carac as |carac key|}}
|
||||||
{{#if carac.isLevelUp}}
|
{{#if carac.isLevelUp}}
|
||||||
<li class="caracteristique flexrow item-list xp-level-up" data-attribute="{{key}}">
|
<li class="caracteristique flexrow item-list xp-level-up" data-attribute="{{key}}">
|
||||||
{{else}}
|
{{else}}
|
||||||
<li class="caracteristique flexrow list-item" data-attribute="{{key}}">
|
<li class="caracteristique flexrow list-item" data-attribute="{{key}}">
|
||||||
{{/if}}
|
{{/if}}
|
||||||
{{#if (eq key 'taille')}}
|
{{#if (eq key 'taille')}}
|
||||||
<span class="carac-label" name="data.carac.{{key}}.label">{{carac.label}}</span>
|
<span class="carac-label" name="system.carac.{{key}}.label">{{carac.label}}</span>
|
||||||
<input class="carac-value" type="text" name="data.carac.{{key}}.value" value="{{carac.value}}" data-dtype="{{carac.type}}" {{#unless @root.options.editCaracComp}}disabled{{/unless}} />
|
<input class="carac-value" type="text" name="system.carac.{{key}}.value" value="{{carac.value}}" data-dtype="{{carac.type}}" {{#unless @root.options.vueDetaillee}}disabled{{/unless}} />
|
||||||
<label class="carac-xp"/>
|
<label class="carac-xp"/>
|
||||||
{{else}}
|
{{else}}
|
||||||
{{#if carac.derivee}}
|
{{#if carac.derivee}}
|
||||||
<span class="carac-label" name="data.carac.{{key}}.label"> <a name={{key}}>{{carac.label}}</a></span>
|
<span class="carac-label" name="system.carac.{{key}}.label"> <a name={{key}}>{{carac.label}}</a></span>
|
||||||
<label class="competence-value">{{carac.value}}</label>
|
<label class="competence-value">{{carac.value}}</label>
|
||||||
<label class="carac-xp"/>
|
<label class="carac-xp"/>
|
||||||
{{else}}
|
{{else}}
|
||||||
{{#if carac.isLevelUp}}
|
{{#if carac.isLevelUp}}
|
||||||
<span class="carac-label tooltip" name="data.carac.{{key}}.label">
|
<span class="carac-label tooltip" name="system.carac.{{key}}.label">
|
||||||
<span class="tooltiptext ttt-xp">
|
<span class="tooltiptext ttt-xp">
|
||||||
Vous pouvez dépenser {{carac.xpNext}} points d'Experience pour augmenter de 1 votre caractéristique {{carac.label}}
|
Vous pouvez dépenser {{carac.xpNext}} points d'Experience pour augmenter de 1 votre caractéristique {{carac.label}}
|
||||||
</span>
|
</span>
|
||||||
<a name={{key}}>{{carac.label}}</a></span>
|
<a name={{key}}>{{carac.label}}</a></span>
|
||||||
{{else}}
|
{{else}}
|
||||||
<span class="carac-label tooltip" name="data.carac.{{key}}.label"><a name={{key}}>{{carac.label}}</a></span>
|
<span class="carac-label tooltip" name="system.carac.{{key}}.label"><a name={{key}}>{{carac.label}}</a></span>
|
||||||
{{/if}}
|
{{/if}}
|
||||||
<input class="carac-value" type="text" name="data.carac.{{key}}.value" value="{{carac.value}}" data-dtype="{{carac.type}}" {{#unless @root.options.editCaracComp}}disabled{{/unless}} />
|
<input class="carac-value" type="text" name="system.carac.{{key}}.value" value="{{carac.value}}" data-dtype="{{carac.type}}" {{#unless @root.options.vueDetaillee}}disabled{{/unless}} />
|
||||||
<span class="carac-xp tooltip">
|
<span class="carac-xp tooltip">
|
||||||
<input class="carac-xp" type="text" name="data.carac.{{key}}.xp" value="{{carac.xp}}" data-dtype="number" {{#unless @root.options.editCaracComp}}disabled{{/unless}} />
|
<input class="carac-xp" type="text" name="system.carac.{{key}}.xp" value="{{carac.xp}}" data-dtype="number" {{#unless @root.options.vueDetaillee}}disabled{{/unless}} />
|
||||||
<span class="tooltiptext ttt-xp">Vous devez acquérir {{carac.xpNext}} points d'Experience pour augmenter de 1 votre {{carac.label}}</span>
|
<span class="tooltiptext ttt-xp">Vous devez acquérir {{carac.xpNext}} points d'Experience pour augmenter de 1 votre {{carac.label}}</span>
|
||||||
</span>
|
</span>
|
||||||
{{#if carac.isLevelUp}}
|
{{#if carac.isLevelUp}}
|
||||||
@ -149,17 +150,17 @@
|
|||||||
<ul class="carac-list">
|
<ul class="carac-list">
|
||||||
<li class="caracteristique flexrow list-item">
|
<li class="caracteristique flexrow list-item">
|
||||||
<span class="carac-label" name="beaute">Beauté :</span>
|
<span class="carac-label" name="beaute">Beauté :</span>
|
||||||
<input class="description-value" type="text" name="data.beaute" value="{{data.beaute}}" data-dtype="String" {{#unless @root.options.editCaracComp}}disabled{{/unless}}/>
|
<input class="description-value" type="text" name="system.beaute" value="{{system.beaute}}" data-dtype="String" {{#unless @root.options.vueDetaillee}}disabled{{/unless}}/>
|
||||||
<label class="carac-xp"/>
|
<label class="carac-xp"/>
|
||||||
</li>
|
</li>
|
||||||
{{#each data.attributs as |attr key|}}
|
{{#each system.attributs as |attr key|}}
|
||||||
{{#unless (eq key 'hautrevant')}}
|
{{#unless (eq key 'hautrevant')}}
|
||||||
<li class="caracteristique flexrow list-item" data-attribute="{{key}}">
|
<li class="caracteristique flexrow list-item" data-attribute="{{key}}">
|
||||||
<span class="carac-label" name="data.attributs.{{key}}.label">{{attr.label}} :</span>
|
<span class="carac-label" name="system.attributs.{{key}}.label">{{attr.label}} :</span>
|
||||||
{{#if (eq key 'protection')}}
|
{{#if (eq key 'protection')}}
|
||||||
<input class="description-value" id="attribut-protection-edit" type="text" name="{{key}}" value="{{attr.value}}" data-dtype="number"/>
|
<input class="description-value" id="attribut-protection-edit" type="text" name="{{key}}" value="{{attr.value}}" data-dtype="number"/>
|
||||||
{{else}}
|
{{else}}
|
||||||
<input class="description-value" type="text" disabled name="data.attributs.{{key}}." value="{{attr.value}}" data-dtype="number"/>
|
<input class="description-value" type="text" disabled name="system.attributs.{{key}}." value="{{attr.value}}" data-dtype="number"/>
|
||||||
{{/if}}
|
{{/if}}
|
||||||
<label class="carac-xp"/>
|
<label class="carac-xp"/>
|
||||||
</li>
|
</li>
|
||||||
@ -169,17 +170,17 @@
|
|||||||
<ul class="carac-list alterne-list">
|
<ul class="carac-list alterne-list">
|
||||||
<li class="caracteristique flexrow list-item">
|
<li class="caracteristique flexrow list-item">
|
||||||
<span class="attribut-label chance-actuelle"><a>Chance actuelle</a></span>
|
<span class="attribut-label chance-actuelle"><a>Chance actuelle</a></span>
|
||||||
<input class="description-value compteur-edit" type="text" name="chance" value="{{data.compteurs.chance.value}}" data-dtype="number"/>
|
<input class="description-value compteur-edit" type="text" name="chance" value="{{system.compteurs.chance.value}}" data-dtype="number"/>
|
||||||
<span class="utiliser-attribut" style="padding-left: 5px"><a class="chance-appel">Utiliser</a></span>
|
<span class="utiliser-attribut" style="padding-left: 5px"><a class="chance-appel">Utiliser</a></span>
|
||||||
</li>
|
</li>
|
||||||
{{#each data.compteurs as |compteur key|}}
|
{{#each system.compteurs as |compteur key|}}
|
||||||
{{#if (eq compteur.label 'Chance')}}
|
{{#if (eq compteur.label 'Chance')}}
|
||||||
{{else if (eq compteur.label 'Experience')}}
|
{{else if (eq compteur.label 'Experience')}}
|
||||||
{{else if compteur.isInput}}
|
{{else if compteur.isInput}}
|
||||||
<li class="caracteristique flexrow list-item">
|
<li class="caracteristique flexrow list-item">
|
||||||
<span class="attribut-label">{{compteur.label}}</span>
|
<span class="attribut-label">{{compteur.label}}</span>
|
||||||
{{#if (eq compteur.label 'Ethylisme')}}
|
{{#if (eq compteur.label 'Ethylisme')}}
|
||||||
<select class="description-value" name="data.compteurs.ethylisme.value" id="ethylisme" data-dtype="Number">
|
<select class="description-value" name="system.compteurs.ethylisme.value" id="ethylisme" data-dtype="Number">
|
||||||
{{#select compteur.value}}
|
{{#select compteur.value}}
|
||||||
{{>"systems/foundryvtt-reve-de-dragon/templates/niveau-ethylisme.html"}}
|
{{>"systems/foundryvtt-reve-de-dragon/templates/niveau-ethylisme.html"}}
|
||||||
{{/select}}
|
{{/select}}
|
||||||
@ -211,463 +212,80 @@
|
|||||||
|
|
||||||
{{!-- Compétences Tab --}}
|
{{!-- Compétences Tab --}}
|
||||||
<div class="tab competences" data-group="primary" data-tab="competences">
|
<div class="tab competences" data-group="primary" data-tab="competences">
|
||||||
<div class="grid grid-4col">
|
<div class="flexrow">
|
||||||
<span><a class="lock-unlock-sheet"><img class="small-button-container"
|
<span><a class="vue-detaillee">
|
||||||
src="systems/foundryvtt-reve-de-dragon/icons/{{#if options.editCaracComp}}unlocked.svg{{else}}locked.svg{{/if}}" alt="blocker/débloquer">
|
<i class="fas {{#if options.vueDetaillee}}fa-eye-slash{{else}}fa-eye{{/if}}"></i>
|
||||||
{{#if options.editCaracComp}}Verrouiller{{else}}Déverrouiller{{/if}}</a></span>
|
{{#if options.vueDetaillee}}Vue simplifiée{{else}}Vue détaillée{{/if}}</a>
|
||||||
<span>
|
|
||||||
<input class="recherche flex-grow" type="text" value="{{options.recherche.text}}" name="recherche"
|
|
||||||
size="8" data-dtype="String" placeholder="chercher"/>
|
|
||||||
</span>
|
</span>
|
||||||
<span><a class="show-hide-competences"><img class="small-button-container"
|
<span><a class="show-hide-competences"><img class="small-button-container"
|
||||||
src="systems/foundryvtt-reve-de-dragon/icons/{{#if options.showCompNiveauBase}}no-filter.svg{{else}}filter.svg{{/if}}" alt="filter/montrer tout">
|
src="systems/foundryvtt-reve-de-dragon/icons/{{#if options.showCompNiveauBase}}no-filter.svg{{else}}filter.svg{{/if}}" alt="filter/montrer tout">
|
||||||
{{#if options.showCompNiveauBase}}Montrer tout{{else}}Filtrer{{/if}}</a>
|
{{#if options.showCompNiveauBase}}Montrer tout{{else}}Filtrer{{/if}}</a>
|
||||||
</span>
|
</span>
|
||||||
<span><a class="vue-detaillee">
|
<span class="flexrow">
|
||||||
<i class="fas {{#if options.vueDetaillee}}fa-eye-slash{{else}}fa-eye{{/if}}"></i>
|
<i class="fas fa-search flex-shrink"></i>
|
||||||
{{#if options.vueDetaillee}}Vue simplifiée{{else}}Vue détaillée{{/if}}</a>
|
<input class="recherche flex-grow" type="text" value="{{options.recherche.text}}" name="recherche"
|
||||||
|
size="8" data-dtype="String" placeholder="chercher"/>
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
<div class="grid grid-2col">
|
<div class="grid grid-2col">
|
||||||
<div class="flex-group-left flexcol competence-column">
|
<div class="flex-group-left flexcol competence-column">
|
||||||
{{> "systems/foundryvtt-reve-de-dragon/templates/actor-sheet-categorie-competences-partial.html" competences=(filtreTriCompetences competenceByCategory.generale) categorie="Compétences générales"}}
|
{{> "systems/foundryvtt-reve-de-dragon/templates/actor/categorie-competences.html" competences=(filtreTriCompetences byCateg.generale) categorie="Compétences générales"}}
|
||||||
{{> "systems/foundryvtt-reve-de-dragon/templates/actor-sheet-categorie-competences-partial.html" competences=(filtreTriCompetences competenceByCategory.particuliere) categorie="Compétences Particulières"}}
|
{{> "systems/foundryvtt-reve-de-dragon/templates/actor/categorie-competences.html" competences=(filtreTriCompetences byCateg.particuliere) categorie="Compétences Particulières"}}
|
||||||
{{> "systems/foundryvtt-reve-de-dragon/templates/actor-sheet-categorie-competences-partial.html" competences=(filtreTriCompetences competenceByCategory.specialisee) categorie="Compétences Spécialisées"}}
|
{{> "systems/foundryvtt-reve-de-dragon/templates/actor/categorie-competences.html" competences=(filtreTriCompetences byCateg.specialisee) categorie="Compétences Spécialisées"}}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="flex-group-left flexcol competence-column">
|
<div class="flex-group-left flexcol competence-column">
|
||||||
{{> "systems/foundryvtt-reve-de-dragon/templates/actor-sheet-categorie-competences-partial.html" competences=(filtreTriCompetences competenceByCategory.melee) categorie="Compétences de Mêlée"}}
|
{{> "systems/foundryvtt-reve-de-dragon/templates/actor/categorie-competences.html" competences=(filtreTriCompetences byCateg.melee) categorie="Compétences de Mêlée"}}
|
||||||
{{> "systems/foundryvtt-reve-de-dragon/templates/actor-sheet-categorie-competences-partial.html" competences=(filtreTriCompetences competenceByCategory.tir) categorie="Compétences de Tir"}}
|
{{> "systems/foundryvtt-reve-de-dragon/templates/actor/categorie-competences.html" competences=(filtreTriCompetences byCateg.tir) categorie="Compétences de Tir"}}
|
||||||
{{> "systems/foundryvtt-reve-de-dragon/templates/actor-sheet-categorie-competences-partial.html" competences=(filtreTriCompetences competenceByCategory.lancer) categorie="Compétences de Lancer"}}
|
{{> "systems/foundryvtt-reve-de-dragon/templates/actor/categorie-competences.html" competences=(filtreTriCompetences byCateg.lancer) categorie="Compétences de Lancer"}}
|
||||||
{{> "systems/foundryvtt-reve-de-dragon/templates/actor-sheet-categorie-competences-partial.html" competences=(filtreTriCompetences competenceByCategory.connaissance) categorie="Connaissances"}}
|
{{> "systems/foundryvtt-reve-de-dragon/templates/actor/categorie-competences.html" competences=(filtreTriCompetences byCateg.connaissance) categorie="Connaissances"}}
|
||||||
{{#if (or data.attributs.hautrevant.value options.vueDetaillee)}}
|
{{#if (or system.attributs.hautrevant.value options.vueDetaillee)}}
|
||||||
{{> "systems/foundryvtt-reve-de-dragon/templates/actor-sheet-categorie-competences-partial.html" competences=(filtreTriCompetences competenceByCategory.draconic) categorie="Draconic"}}
|
{{> "systems/foundryvtt-reve-de-dragon/templates/actor/categorie-competences.html" competences=(filtreTriCompetences byCateg.draconic) categorie="Draconic"}}
|
||||||
{{/if}}
|
{{/if}}
|
||||||
|
{{> "systems/foundryvtt-reve-de-dragon/templates/actor/xp-competences.html"}}
|
||||||
<div>
|
|
||||||
<ul class="item-list">
|
|
||||||
<li class="item flexrow">
|
|
||||||
<span class="generic-label">Stress transformé</span>
|
|
||||||
<input class="compteur-edit" type="text" name="experience" value="{{data.compteurs.experience.value}}" data-dtype="number" size="3"/>
|
|
||||||
</li>
|
|
||||||
|
|
||||||
<li class="item flexrow">
|
|
||||||
<span class="generic-label">Total XP compétences</span>
|
|
||||||
<span class="competence-value">{{calc.competenceXPTotal}}</span>
|
|
||||||
</li>
|
|
||||||
{{#if options.vueDetaillee}}
|
|
||||||
<li>Niveaux d'archétype à répartir</li>
|
|
||||||
{{#each calc.comptageArchetype as |archetype key|}}
|
|
||||||
{{#if (lt archetype.nombre archetype.nombreMax)}}
|
|
||||||
<li class="item flexrow">
|
|
||||||
<label class="generic-label">Archetype {{archetype.niveau}} : {{archetype.nombre}} / {{archetype.nombreMax}}</label>
|
|
||||||
</li>
|
|
||||||
{{/if}}
|
|
||||||
{{/each}}
|
|
||||||
{{/if}}
|
|
||||||
</ul>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{{!-- Combat Tab --}}
|
{{!-- Combat Tab --}}
|
||||||
<div class="tab combat" data-group="primary" data-tab="combat">
|
<div class="tab combat" data-group="primary" data-tab="combat">
|
||||||
<h3 class="blessures-title">Armes et Défenses:</h3>
|
{{> "systems/foundryvtt-reve-de-dragon/templates/actor/combat.html"}}<hr>
|
||||||
<ul class="item-list alterne-list">
|
{{> "systems/foundryvtt-reve-de-dragon/templates/actor/blessures.html"}}
|
||||||
<li class="competence-header flexrow">
|
{{> "systems/foundryvtt-reve-de-dragon/templates/actor/maladies-poisons.html"}}
|
||||||
<span class="competence-title competence-label">Armes</span>
|
{{> "systems/foundryvtt-reve-de-dragon/templates/actor/possessions.html"}}
|
||||||
<span class="competence-title competence-label">Initiative</span>
|
|
||||||
<span class="competence-title competence-label">Comp.</span>
|
|
||||||
<span class="competence-title competence-value">Niveau</span>
|
|
||||||
<span class="competence-title competence-value">+dom</span>
|
|
||||||
</li>
|
|
||||||
{{#each combat as |arme key|}}
|
|
||||||
<li class="item flexrow list-item" data-item-id="{{arme._id}}"
|
|
||||||
data-arme-name="{{arme.name}}" data-competence-name="{{arme.data.competence}}" >
|
|
||||||
<span class="arme-label">
|
|
||||||
<a>
|
|
||||||
{{#if arme.img}}
|
|
||||||
<img class="sheet-competence-img" src="{{arme.img}}"/>
|
|
||||||
{{/if}}
|
|
||||||
<span>{{arme.name}}</span>
|
|
||||||
</a>
|
|
||||||
</span>
|
|
||||||
<span class="arme-initiative"><a>{{arme.data.initiative}}</a></span>
|
|
||||||
<span class="competence-label">{{arme.data.competence}}</span>
|
|
||||||
<span class="competence-value">{{numberFormat arme.data.niveau decimals=0 sign=true}}</span>
|
|
||||||
<span class="competence-value">{{numberFormat arme.data.dommagesReels decimals=0 sign=true}}</span>
|
|
||||||
</li>
|
|
||||||
{{/each}}
|
|
||||||
{{#each esquives as |esq key|}}
|
|
||||||
<li class="item flexrow list-item">
|
|
||||||
<span class="competence-label">
|
|
||||||
<a class="competence-label" name="{{esq.name}}">
|
|
||||||
<img class="sheet-competence-img" src="{{esq.img}}"/>
|
|
||||||
<span>{{esq.name}}</span>
|
|
||||||
</a>
|
|
||||||
</span>
|
|
||||||
<span class="arme-initiative"></span>
|
|
||||||
<span class="competence-label"></span>
|
|
||||||
<span class="competence-value">{{numberFormat esq.data.niveau decimals=0 sign=true}}</span>
|
|
||||||
<span class="competence-value"></span>
|
|
||||||
</li>
|
|
||||||
{{/each}}
|
|
||||||
|
|
||||||
</ul>
|
|
||||||
<hr>
|
|
||||||
{{!-- Liste de blessures --}}
|
|
||||||
{{> "systems/foundryvtt-reve-de-dragon/templates/actor-liste-blessures-partial.html" this}}
|
|
||||||
|
|
||||||
{{#if maladiesPoisons.length}}
|
|
||||||
{{!-- Maladies & Poison --}}
|
|
||||||
<h3 class="blessures-title">Maladies & Poisons:</h3>
|
|
||||||
<ul class="item-list alterne-list">
|
|
||||||
<li class="competence-header flexrow">
|
|
||||||
<span class="competence-title flex-grow competence-label">Nom</span>
|
|
||||||
<span class="competence-title competence-label">Type</span>
|
|
||||||
<span class="competence-title competence-value">Remèdes</span>
|
|
||||||
<span class="competence-title flex-grow competence-value">Edition</span>
|
|
||||||
</li>
|
|
||||||
{{#each maladiesPoisons as |maladie key|}}
|
|
||||||
<li class="item flexrow list-item" data-item-id="{{maladie._id}}">
|
|
||||||
<span class="competence-label">
|
|
||||||
{{#if (or @root.options.isGM maladie.data.identifie)}}
|
|
||||||
{{maladie.name}}
|
|
||||||
{{else}}
|
|
||||||
Inconnue
|
|
||||||
{{/if}}
|
|
||||||
</span>
|
|
||||||
<span class="competence-label">{{maladie.type}}</span>
|
|
||||||
<span class="competence-label">
|
|
||||||
{{#if (or @root.options.isGM maladie.data.remedesconnus)}}
|
|
||||||
{{maladie.data.remedes}}
|
|
||||||
{{else}}
|
|
||||||
Remèdes Inconnus
|
|
||||||
{{/if}}
|
|
||||||
</span>
|
|
||||||
<div class="item-controls">
|
|
||||||
<a class="item-edit" title="Modifier"><i class="fas fa-edit"></i></a>
|
|
||||||
<a class="item-delete" title="Supprimer"><i class="fas fa-trash"></i></a>
|
|
||||||
</div>
|
|
||||||
</li>
|
|
||||||
{{/each}}
|
|
||||||
</ul>
|
|
||||||
{{/if}}
|
|
||||||
|
|
||||||
{{#if possessions.length}}
|
|
||||||
{{!-- Possession --}}
|
|
||||||
<h3 class="blessures-title">Possession:</h3>
|
|
||||||
<ul class="item-list alterne-list">
|
|
||||||
<li class="competence-header flexrow">
|
|
||||||
<span class="competence-title flex-grow competence-label">Nom</span>
|
|
||||||
<span class="competence-title competence-label">Type</span>
|
|
||||||
</li>
|
|
||||||
{{#each possessions as |possession key|}}
|
|
||||||
<li class="item flexrow list-item" data-item-id="{{possession._id}}">
|
|
||||||
<span class="competence-label">
|
|
||||||
<a class="sheet-possession-attack">{{possession.name}} (Conjurer)</a>
|
|
||||||
</span>
|
|
||||||
<span class="competence-label">{{possession.data.type}}</span>
|
|
||||||
<div class="item-controls">
|
|
||||||
<a class="item-edit" title="Modifier"><i class="fas fa-edit"></i></a>
|
|
||||||
<a class="item-delete" title="Supprimer"><i class="fas fa-trash"></i></a>
|
|
||||||
</div>
|
|
||||||
</li>
|
|
||||||
{{/each}}
|
|
||||||
</ul>
|
|
||||||
{{/if}}
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{{!-- Connaissances Tab --}}
|
{{!-- Connaissances Tab --}}
|
||||||
<div class="tab connaissances" data-group="primary" data-tab="connaissances">
|
<div class="tab connaissances" data-group="primary" data-tab="connaissances">
|
||||||
<h3>Tâches</h3><a class='creer-tache'>Créer une nouvelle Tâche</a>
|
{{> "systems/foundryvtt-reve-de-dragon/templates/actor/taches.html"}}
|
||||||
<ul class="item-list alterne-list">
|
{{> "systems/foundryvtt-reve-de-dragon/templates/actor/oeuvres.html"}}
|
||||||
{{#each taches as |tache id|}}
|
{{> "systems/foundryvtt-reve-de-dragon/templates/actor/jeux.html"}}
|
||||||
<li class="item flexrow list-item" data-item-id="{{tache._id}}"><span class="competence-title tache-label"><a>{{tache.name}}
|
{{> "systems/foundryvtt-reve-de-dragon/templates/actor/alchimie.html"}}
|
||||||
({{tache.data.points_de_tache_courant}}{{#if
|
|
||||||
(or @root.options.isGM (not tache.data.cacher_points_de_tache))
|
|
||||||
}}/{{tache.data.points_de_tache}}{{/if}})</a></span>
|
|
||||||
<div class="item-controls flex-shrink">
|
|
||||||
<a class="item-edit" title="Edit Item"><i class="fas fa-edit"></i></a>
|
|
||||||
<a class="item-delete" title="Delete Item"><i class="fas fa-trash"></i></a>
|
|
||||||
</div>
|
|
||||||
</li>
|
|
||||||
{{/each}}
|
|
||||||
</ul>
|
|
||||||
<hr>
|
|
||||||
<h3>Oeuvres diverses :</h3><a class="creer-une-oeuvre">Créer une oeuvre</a>
|
|
||||||
<ul class="item-list alterne-list">
|
|
||||||
{{#each chants as |chant id|}}
|
|
||||||
{{> "systems/foundryvtt-reve-de-dragon/templates/actor-sheet-oeuvre-partial.html" oeuvre=chant typeOeuvre="Chant" classOeuvre="chant-label"}}
|
|
||||||
{{/each}}
|
|
||||||
{{#each musiques as |musique id|}}
|
|
||||||
{{> "systems/foundryvtt-reve-de-dragon/templates/actor-sheet-oeuvre-partial.html" oeuvre=musique typeOeuvre="Musique" classOeuvre="musique-label"}}
|
|
||||||
{{/each}}
|
|
||||||
{{#each danses as |danse id|}}
|
|
||||||
{{> "systems/foundryvtt-reve-de-dragon/templates/actor-sheet-oeuvre-partial.html" oeuvre=danse typeOeuvre="Danse" classOeuvre="danse-label"}}
|
|
||||||
{{/each}}
|
|
||||||
{{#each oeuvres as |oeuvre id|}}
|
|
||||||
{{> "systems/foundryvtt-reve-de-dragon/templates/actor-sheet-oeuvre-partial.html" oeuvre=oeuvre typeOeuvre=oeuvre.data.competence classOeuvre="oeuvre-label"}}
|
|
||||||
{{/each}}
|
|
||||||
{{#each recettescuisine as |recette id|}}
|
|
||||||
{{> "systems/foundryvtt-reve-de-dragon/templates/actor-sheet-oeuvre-partial.html" oeuvre=recette typeOeuvre="Recette de cuisine" classOeuvre="recettecuisine-label"}}
|
|
||||||
{{/each}}
|
|
||||||
</ul>
|
|
||||||
<h3>Jeux :</h3>
|
|
||||||
<ul class="item-list alterne-list">
|
|
||||||
{{#each jeux as |jeu id|}}
|
|
||||||
<li class="item flexrow list-item" data-item-id="{{jeu._id}}"><span class="competence-title jeu-label"><a>{{jeu.name}} (base {{jeu.data.base}})</a></span>
|
|
||||||
<div class="item-controls flex-shrink">
|
|
||||||
<a class="item-edit" title="Edit Item"><i class="fas fa-edit"></i></a>
|
|
||||||
<a class="item-delete" title="Delete Item"><i class="fas fa-trash"></i></a>
|
|
||||||
</div>
|
|
||||||
</li>
|
|
||||||
{{/each}}
|
|
||||||
</ul>
|
|
||||||
<h3>Recettes Alchimiques</h3>
|
|
||||||
<ul class="item-list alterne-list">
|
|
||||||
{{#each recettesAlchimiques as |recette id|}}
|
|
||||||
<li class="item flexrow list-item" data-item-id="{{recette._id}}"><span class="competence-title recette-label item-edit"><a>{{recette.name}}</a></span>
|
|
||||||
<div class="item-controls flex-shrink">
|
|
||||||
<a class="item-edit" title="Edit Item"><i class="fas fa-edit"></i></a>
|
|
||||||
<a class="item-delete" title="Delete Item"><i class="fas fa-trash"></i></a>
|
|
||||||
</div>
|
|
||||||
</li>
|
|
||||||
{{/each}}
|
|
||||||
</ul>
|
|
||||||
<hr>
|
|
||||||
<h3>Astrologie</h3>
|
|
||||||
<span class="astrologie-label"><a id="jet-astrologie">Astrologie : Nombres Astraux</a></span>
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{{!-- hautreve Tab --}}
|
{{!-- hautreve Tab --}}
|
||||||
<div class="tab hautreve " data-group="primary" data-tab="hautreve" style="height:200px">
|
<div class="tab hautreve " data-group="primary" data-tab="hautreve" style="height:200px">
|
||||||
<div>
|
<div>
|
||||||
{{#if data.attributs.hautrevant.value}}
|
{{#if system.attributs.hautrevant.value}}
|
||||||
<h3>Haut rêvant</h3>
|
<h3>Haut rêvant</h3>
|
||||||
|
{{> "systems/foundryvtt-reve-de-dragon/templates/actor/haut-revant.html"}}
|
||||||
{{else}}
|
{{else}}
|
||||||
<h3>Vous n'avez pas le don de haut-rêve! Il faut attribuer la Tête de Dragon 'Don de Haut Rêve' si votre personnage est ou devient Haut-Rêvant.</h3>
|
<h3>Vous n'avez pas le don de haut-rêve</h3>
|
||||||
|
<p>Attribuer la Tête de Dragon 'Don de Haut Rêve' pour rendre le personnage Haut-Rêvant.</p>
|
||||||
|
{{> "systems/foundryvtt-reve-de-dragon/templates/actor/non-haut-revant.html"}}
|
||||||
{{/if}}
|
{{/if}}
|
||||||
<ul class="item-list">
|
<br><br>
|
||||||
{{#if data.attributs.hautrevant.value}}
|
|
||||||
{{#if options.isGM}}
|
|
||||||
<li class="item flexrow">
|
|
||||||
<span>
|
|
||||||
<a class="chat-card-button forcer-tmr-aleatoire">Ré-insertion aléatoire (ie TMR cachée)</a>
|
|
||||||
</span>
|
|
||||||
<span>
|
|
||||||
<a class="chat-card-button afficher-tmr">Montrer les TMR</a>
|
|
||||||
</span>
|
|
||||||
</li>
|
|
||||||
{{/if}}
|
|
||||||
<li class="item flexrow">
|
|
||||||
{{#if options.isGM}}
|
|
||||||
<span class="competence-label flex-shrink">Demi rêve :
|
|
||||||
<span>{{caseTmr-label data.reve.tmrpos.coord}}</span>
|
|
||||||
</span>
|
|
||||||
<span>
|
|
||||||
<input class="competence-value" type="text" name="data.reve.tmrpos.coord" value="{{data.reve.tmrpos.coord}}" data-dtype="String"/>
|
|
||||||
</span>
|
|
||||||
|
|
||||||
{{else}}
|
|
||||||
<span class="competence-label flex-shrink">Demi rêve :
|
|
||||||
{{#unless hautreve.cacheTMR}}
|
|
||||||
<span>{{caseTmr-label data.reve.tmrpos.coord}}</span>
|
|
||||||
{{/unless}}
|
|
||||||
</span>
|
|
||||||
<span>
|
|
||||||
{{#if hautreve.cacheTMR}}
|
|
||||||
??
|
|
||||||
{{else}}
|
|
||||||
{{data.reve.tmrpos.coord}}
|
|
||||||
{{/if}}
|
|
||||||
</span>
|
|
||||||
{{/if}}
|
|
||||||
</li>
|
|
||||||
{{/if}}
|
|
||||||
<li class="item flexrow">
|
|
||||||
<span class="competence-label">Seuil de Rêve :</span>
|
|
||||||
<span>
|
|
||||||
{{#if options.isGM}}
|
|
||||||
<input class="seuil-reve-value" type="text" name="data.reve.seuil.value" value="{{data.reve.seuil.value}}" data-dtype="Number"/>
|
|
||||||
{{else}}
|
|
||||||
{{data.reve.seuil.value}}
|
|
||||||
{{/if}}
|
|
||||||
</span>
|
|
||||||
</li>
|
|
||||||
<li class="item flexrow" >
|
|
||||||
<span class="competence-label">Refoulement : </span>
|
|
||||||
<span>
|
|
||||||
{{#if options.isGM}}
|
|
||||||
<input class="competence-value" type="text" name="data.reve.refoulement.value" value="{{data.reve.refoulement.value}}" data-dtype="Number"/>
|
|
||||||
{{else}}
|
|
||||||
{{data.reve.refoulement.value}}
|
|
||||||
{{/if}}
|
|
||||||
</span>
|
|
||||||
</li>
|
|
||||||
</ul>
|
|
||||||
</div>
|
</div>
|
||||||
<hr>
|
|
||||||
{{!-- Queues, Souffles, Tetes, Ombre --}}
|
|
||||||
{{#if queues.length}}
|
|
||||||
<h3>Queues:</h3>
|
|
||||||
<ul class="flex-group-left">
|
|
||||||
{{#each queues as |queue key|}}
|
|
||||||
<li class="item flexrow" data-attribute={{key}} data-item-id="{{queue._id}}">
|
|
||||||
<span class="display-label flex-grow"><a data-item-id="{{queue._id}}">{{queue.name}}</a></span>
|
|
||||||
<div class="item-controls flex-shrink">
|
|
||||||
<a class="item-delete" title="Delete Item"><i class="fas fa-trash"></i></a>
|
|
||||||
</div>
|
|
||||||
</li>
|
|
||||||
{{/each}}
|
|
||||||
</ul>
|
|
||||||
{{/if}}
|
|
||||||
{{#if ombres.length}}
|
|
||||||
<h3>Ombres de Thanatos:</h3>
|
|
||||||
<ul class="item-list">
|
|
||||||
{{#each ombres as |ombre key|}}
|
|
||||||
<li class="item flexrow" data-attribute={{key}} data-item-id="{{ombre._id}}">
|
|
||||||
<span class="display-label flex-grow"><a data-item-id="{{ombre._id}}">{{ombre.name}}</a></span>
|
|
||||||
<div class="item-controls flex-shrink">
|
|
||||||
<a class="item-delete" title="Delete Item"><i class="fas fa-trash"></i></a>
|
|
||||||
</div>
|
|
||||||
</li>
|
|
||||||
{{/each}}
|
|
||||||
</ul>
|
|
||||||
{{/if}}
|
|
||||||
{{#if souffles.length}}
|
|
||||||
<h3>Souffles:</h3>
|
|
||||||
<ul class="item-list">
|
|
||||||
{{#each souffles as |souffle key|}}
|
|
||||||
<li class="item flexrow" data-attribute={{key}} data-item-id="{{souffle._id}}">
|
|
||||||
<span class="display-label flex-grow"><a data-item-id="{{souffle._id}}">{{souffle.name}}</a></span>
|
|
||||||
<div class="item-controls flex-shrink">
|
|
||||||
<a class="item-delete" title="Delete Item"><i class="fas fa-trash"></i></a>
|
|
||||||
</div>
|
|
||||||
</li>
|
|
||||||
{{/each}}
|
|
||||||
</ul>
|
|
||||||
{{/if}}
|
|
||||||
{{#if tetes.length}}
|
|
||||||
<h3>Tetes:</h3>
|
|
||||||
<ul class="item-list">
|
|
||||||
{{#each tetes as |tete key|}}
|
|
||||||
<li class="item flexrow" data-attribute={{key}} data-item-id="{{tete._id}}">
|
|
||||||
<span class="display-label flex-grow"><a data-item-id="{{tete._id}}">{{tete.name}}</a></span>
|
|
||||||
<div class="item-controls flex-shrink">
|
|
||||||
<a class="item-delete" title="Delete Item"><i class="fas fa-trash"></i></a>
|
|
||||||
</div>
|
|
||||||
</li>
|
|
||||||
{{/each}}
|
|
||||||
</ul>
|
|
||||||
{{/if}}
|
|
||||||
{{#if data.attributs.hautrevant.value}}
|
|
||||||
{{#if (and options.isGM signesdraconiques.length)}}
|
|
||||||
<h3>Signes draconiques</h3>
|
|
||||||
<ul class="item-list alterne-list">
|
|
||||||
{{#each signesdraconiques as |signe key|}}
|
|
||||||
<li class="item list-item flexrow" data-item-id="{{signe._id}}" data-attribute="{{key}}">
|
|
||||||
<span class="display-label flex-grow"> <a data-item-id="{{signe._id}}">{{signe.name}}</a></span>
|
|
||||||
<span class="flex-shrink">{{signe.data.difficulte}}</span>
|
|
||||||
<div class="item-controls flex-shrink">
|
|
||||||
<a class="item-delete" title="Supprimer"><i class="fas fa-trash"></i></a>
|
|
||||||
</div>
|
|
||||||
</li>
|
|
||||||
{{/each}}
|
|
||||||
</ul>
|
|
||||||
{{/if}}
|
|
||||||
|
|
||||||
{{#if hautreve.rencontres.length}}
|
|
||||||
<h3>Rencontres présentes:</h3>
|
|
||||||
<ul class="item-list">
|
|
||||||
{{#each hautreve.rencontres as |rencontre key|}}
|
|
||||||
<li class="item flexrow" data-item-id="{{key}}" data-attribute="{{key}}">
|
|
||||||
<span class="display-label"><a data-item-id="{{key}}">{{rencontre.name}} r{{rencontre.force}}</a></span>
|
|
||||||
<span class="flex-shrink">{{rencontre.coord}} - {{caseTmr-label rencontre.coord}}</span>
|
|
||||||
{{#if rencontre.date}}
|
|
||||||
<span>{{upperFirst rencontre.heure}}, le {{rencontre.date}}</span>
|
|
||||||
{{/if}}
|
|
||||||
<div class="item-controls flex-shrink">
|
|
||||||
<a class="rencontre-delete" title="Supprimer"><i class="fas fa-trash"></i></a>
|
|
||||||
</div>
|
|
||||||
</li>
|
|
||||||
{{/each}}
|
|
||||||
</ul>
|
|
||||||
{{/if}}
|
|
||||||
{{#if hautreve.sortsReserve.length}}
|
|
||||||
<h3>Sorts en Réserve:</h3>
|
|
||||||
<ul class="item-list alterne-list">
|
|
||||||
{{#each hautreve.sortsReserve as |reserve key|}}
|
|
||||||
<li class="item list-item flexrow" data-item-id="{{reserve._id}}" data-attribute="{{key}}">
|
|
||||||
<img class="sheet-competence-img" src="{{reserve.sort.img}}" />
|
|
||||||
<span class="display-label">{{reserve.sort.name}} r{{reserve.sort.data.ptreve_reel}}</span>
|
|
||||||
<span>{{reserve.coord}} - {{caseTmr-label reserve.coord}}</span>
|
|
||||||
<div class="item-controls flex-shrink">
|
|
||||||
<a class="item-delete flex-shrink" title="Supprimer"><i class="fas fa-trash"></i></a>
|
|
||||||
</div>
|
|
||||||
</li>
|
|
||||||
{{/each}}
|
|
||||||
</ul>
|
|
||||||
{{/if}}
|
|
||||||
|
|
||||||
<hr>
|
|
||||||
|
|
||||||
<h3>Sorts:</h3>
|
|
||||||
<ul class="item-list alterne-list">
|
|
||||||
{{#each sorts as |sort key|}}
|
|
||||||
<li class="item list-item flexrow" data-item-id="{{sort._id}}" data-attribute="{{key}}">
|
|
||||||
<span class="display-label flex-grow">
|
|
||||||
<a data-item-id="{{sort._id}}">{{sort.name}}
|
|
||||||
- {{#if sort.data.caseTMRspeciale}}{{sort.data.caseTMRspeciale}}{{else}}{{upperFirst sort.data.caseTMR}}{{/if}}
|
|
||||||
</a>
|
|
||||||
</span>
|
|
||||||
<span>{{sort.data.draconic}} / {{sort.data.difficulte}}</span>
|
|
||||||
<div class="item-controls flex-shrink">
|
|
||||||
<a class="item-delete" title="Supprimer"><i class="fas fa-trash"></i></a>
|
|
||||||
</div>
|
|
||||||
</li>
|
|
||||||
{{/each}}
|
|
||||||
</ul>
|
|
||||||
|
|
||||||
<h3>Méditations:</h3>
|
|
||||||
<ul class="item-list">
|
|
||||||
{{#each meditations as |meditation key|}}
|
|
||||||
<li class="item flexrow" data-item-id="{{meditation._id}}" data-attribute="{{key}}">
|
|
||||||
<span class="meditation-label flex-grow"><a data-item-id="{{meditation._id}}">{{meditation.name}} - {{meditation.data.competence}}</a></span>
|
|
||||||
<div class="item-controls flex-shrink">
|
|
||||||
<a class="item-edit" title="Editer"><i class="fas fa-edit"></i></a>
|
|
||||||
<a class="item-delete" title="Supprimer"><i class="fas fa-trash"></i></a>
|
|
||||||
</div>
|
|
||||||
</li>
|
|
||||||
{{/each}}
|
|
||||||
</ul>
|
|
||||||
<hr>
|
|
||||||
{{#if hautreve.casesTmr}}
|
|
||||||
<h3>Cases Spéciales:</h3>
|
|
||||||
<ul class="item-list">
|
|
||||||
{{#each hautreve.casesTmr as |casetmr key|}}
|
|
||||||
<li class="item flexrow" data-item-id="{{casetmr._id}}" data-attribute="{{key}}">
|
|
||||||
<span class="display-label"><a data-item-id="{{casetmr._id}}">{{casetmr.name}}</a></span>
|
|
||||||
<span>{{casetmr.data.coord}} - {{caseTmr-label casetmr.data.coord}}</span>
|
|
||||||
<div class="item-controls flex-shrink">
|
|
||||||
<a class="item-delete" title="Supprimer"><i class="fas fa-trash"></i></a>
|
|
||||||
</div>
|
|
||||||
</li>
|
|
||||||
{{/each}}
|
|
||||||
</ul>
|
|
||||||
{{/if}}
|
|
||||||
<br><br>
|
|
||||||
{{/if}}
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{{!-- Equipment Tab --}}
|
{{!-- Equipment Tab --}}
|
||||||
<div class="tab items" data-group="primary" data-tab="items">
|
<div class="tab items" data-group="primary" data-tab="items">
|
||||||
|
|
||||||
{{> "systems/foundryvtt-reve-de-dragon/templates/actor-sheet-inventaire.html"}}
|
{{> "systems/foundryvtt-reve-de-dragon/templates/actor/inventaire.html"}}
|
||||||
{{> "systems/foundryvtt-reve-de-dragon/templates/actor-sheet-liens-animaux.html"}}
|
{{> "systems/foundryvtt-reve-de-dragon/templates/actor/liens-animaux.html"}}
|
||||||
{{> "systems/foundryvtt-reve-de-dragon/templates/actor-sheet-liens-suivants.html"}}
|
{{> "systems/foundryvtt-reve-de-dragon/templates/actor/liens-suivants.html"}}
|
||||||
{{> "systems/foundryvtt-reve-de-dragon/templates/actor-sheet-liens-vehicules.html"}}
|
{{> "systems/foundryvtt-reve-de-dragon/templates/actor/liens-vehicules.html"}}
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@ -676,50 +294,50 @@
|
|||||||
<article class="flexrow">
|
<article class="flexrow">
|
||||||
<ul class="item-list alterne-list">
|
<ul class="item-list alterne-list">
|
||||||
<li class="item flexrow list-item">
|
<li class="item flexrow list-item">
|
||||||
<label for="data.race">Race :</label>
|
<label for="system.race">Race :</label>
|
||||||
<input class="flex-grow" type="text" name="data.race" value="{{data.race}}" data-dtype="String"/>
|
<input class="flex-grow" type="text" name="system.race" value="{{system.race}}" data-dtype="String"/>
|
||||||
</li>
|
</li>
|
||||||
<li class="item flexrow list-item">
|
<li class="item flexrow list-item">
|
||||||
<label for="data.sexe">Sexe :</label>
|
<label for="system.sexe">Sexe :</label>
|
||||||
<input class="flex-grow" type="text" name="data.sexe" value="{{data.sexe}}" data-dtype="String"/>
|
<input class="flex-grow" type="text" name="system.sexe" value="{{system.sexe}}" data-dtype="String"/>
|
||||||
</li>
|
</li>
|
||||||
<li class="item flexrow list-item">
|
<li class="item flexrow list-item">
|
||||||
<label for="data.age">Age :</label>
|
<label for="system.age">Age :</label>
|
||||||
<input class="flex-grow" type="text" name="data.age" value="{{data.age}}" data-dtype="String"/>
|
<input class="flex-grow" type="text" name="system.age" value="{{system.age}}" data-dtype="String"/>
|
||||||
</li>
|
</li>
|
||||||
<li class="item flexrow list-item">
|
<li class="item flexrow list-item">
|
||||||
<label for="data.poids">Poids :</label>
|
<label for="system.poids">Poids :</label>
|
||||||
<input class="flex-grow" type="text" name="data.poids" value="{{data.poids}}" data-dtype="String"/>
|
<input class="flex-grow" type="text" name="system.poids" value="{{system.poids}}" data-dtype="String"/>
|
||||||
</li>
|
</li>
|
||||||
<li class="item flexrow list-item">
|
<li class="item flexrow list-item">
|
||||||
<label for="data.taille">Taille :</label>
|
<label for="system.taille">Taille :</label>
|
||||||
<input class="flex-grow" type="text" name="data.taille" value="{{data.taille}}" data-dtype="String"/>
|
<input class="flex-grow" type="text" name="system.taille" value="{{system.taille}}" data-dtype="String"/>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
<ul class="item-list alterne-list">
|
<ul class="item-list alterne-list">
|
||||||
<li class="item flexrow list-item">
|
<li class="item flexrow list-item">
|
||||||
<label for="data.main">Main directrice :</label>
|
<label for="system.main">Main directrice :</label>
|
||||||
<input type="text" name="data.main" value="{{data.main}}" data-dtype="String"/>
|
<input type="text" name="system.main" value="{{system.main}}" data-dtype="String"/>
|
||||||
</li>
|
</li>
|
||||||
<li class="item flexrow list-item">
|
<li class="item flexrow list-item">
|
||||||
<label for="data.heure">Heure de naissance :</label>
|
<label for="system.heure">Heure de naissance :</label>
|
||||||
<select type="text" name="data.heure" value="{{data.heure}}" data-dtype="String">
|
<select type="text" name="system.heure" value="{{system.heure}}" data-dtype="String">
|
||||||
{{#select data.heure}}
|
{{#select system.heure}}
|
||||||
{{>"systems/foundryvtt-reve-de-dragon/templates/heures-select-option.html"}}
|
{{>"systems/foundryvtt-reve-de-dragon/templates/heures-select-option.html"}}
|
||||||
{{/select}}
|
{{/select}}
|
||||||
</select>
|
</select>
|
||||||
</li>
|
</li>
|
||||||
<li class="item flexrow list-item">
|
<li class="item flexrow list-item">
|
||||||
<label>Beauté :</label>
|
<label>Beauté :</label>
|
||||||
<input type="text" value="{{data.beaute}}" data-dtype="String" disabled/>
|
<input type="text" value="{{system.beaute}}" data-dtype="String" disabled/>
|
||||||
</li>
|
</li>
|
||||||
<li class="item flexrow list-item">
|
<li class="item flexrow list-item">
|
||||||
<label for="data.cheveux">Cheveux :</label>
|
<label for="system.cheveux">Cheveux :</label>
|
||||||
<input class="flex-grow" type="text" name="data.cheveux" value="{{data.cheveux}}" data-dtype="String"/>
|
<input class="flex-grow" type="text" name="system.cheveux" value="{{system.cheveux}}" data-dtype="String"/>
|
||||||
</li>
|
</li>
|
||||||
<li class="item flexrow list-item">
|
<li class="item flexrow list-item">
|
||||||
<label for="data.yeux">Yeux :</label>
|
<label for="system.yeux">Yeux :</label>
|
||||||
<input class="flex-grow" type="text" name="data.yeux" value="{{data.yeux}}" data-dtype="String"/>
|
<input class="flex-grow" type="text" name="system.yeux" value="{{system.yeux}}" data-dtype="String"/>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
</article>
|
</article>
|
||||||
@ -727,27 +345,14 @@
|
|||||||
<article class="flexcol">
|
<article class="flexcol">
|
||||||
<h3>Biographie : </h3>
|
<h3>Biographie : </h3>
|
||||||
<div class="form-group editor">
|
<div class="form-group editor">
|
||||||
{{editor content=data.biographie target="data.biographie" button=true owner=owner editable=editable}}
|
{{editor biographie target="system.biographie" button=true owner=owner editable=editable}}
|
||||||
</div>
|
</div>
|
||||||
<h3>Notes : </h3>
|
<h3>Notes : </h3>
|
||||||
<div class="form-group editor">
|
<div class="form-group editor">
|
||||||
{{editor content=data.notes target="data.notes" button=true owner=owner editable=editable}}
|
{{editor notes target="system.notes" button=true owner=owner editable=editable}}
|
||||||
</div>
|
</div>
|
||||||
<h3>Journal d'Experience</h3>
|
{{> "systems/foundryvtt-reve-de-dragon/templates/actor/xp-journal.html"}}
|
||||||
<div class="form-group editor">
|
{{> "systems/foundryvtt-reve-de-dragon/templates/actor/editor-notes-mj.html"}}
|
||||||
<ul class="item-list alterne-list">
|
|
||||||
{{#each data.experiencelog as |xp key|}}
|
|
||||||
<li class="item flexrow list-item">
|
|
||||||
<label class="flex-shrink">{{xp.mode}} </label>
|
|
||||||
<label class="flex-grow">{{xp.valeur}} {{xp.raison}} </label>
|
|
||||||
<label class="flex-shrink">{{xp.daterdd}} </label>
|
|
||||||
<label class="flex-shrink">{{xp.datereel}} </label>
|
|
||||||
</li>
|
|
||||||
{{/each}}
|
|
||||||
</ul>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
{{>"systems/foundryvtt-reve-de-dragon/templates/actor-sheet-editor-notes-mj.html"}}
|
|
||||||
</article>
|
</article>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
@ -26,60 +26,61 @@
|
|||||||
<div class="flex-group-left flexcol">
|
<div class="flex-group-left flexcol">
|
||||||
<ol class="carac-list alterne-list">
|
<ol class="carac-list alterne-list">
|
||||||
<li class="caracteristique flexrow list-item" data-attribute="{{key}}">
|
<li class="caracteristique flexrow list-item" data-attribute="{{key}}">
|
||||||
<span class="carac-label flexrow" name="categorie">Catégorie</span>
|
<span class="carac-label">Catégorie</span>
|
||||||
<select name="data.categorie" class="categorie" data-dtype="String">
|
<select name="system.categorie" class="categorie" data-dtype="String">
|
||||||
{{#select data.categorie}}
|
{{#select system.categorie}}
|
||||||
{{>"systems/foundryvtt-reve-de-dragon/templates/enum-categorie-vehicule.html"}}
|
{{>"systems/foundryvtt-reve-de-dragon/templates/enum-categorie-vehicule.html"}}
|
||||||
{{/select}}
|
{{/select}}
|
||||||
</select>
|
</select>
|
||||||
</li>
|
</li>
|
||||||
<li class="caracteristique flexrow list-item" data-attribute="{{key}}">
|
<li class="caracteristique flexrow list-item" data-attribute="{{key}}">
|
||||||
<span class="carac-label flexrow" name="categorie">Résistance</span>
|
<span class="carac-label">Résistance</span>
|
||||||
<input class="competence-value flexrow" type="text" name="data.resistance" value="{{data.resistance}}" data-dtype="Number" />
|
<input class="competence-value flexrow" type="text" name="system.etat.resistance.value" value="{{system.etat.resistance.value}}" data-dtype="Number" />
|
||||||
|
/
|
||||||
|
<input class="competence-value flexrow" type="text" name="system.etat.resistance.max" value="{{system.etat.resistance.max}}" data-dtype="Number" />
|
||||||
</li>
|
</li>
|
||||||
<li class="caracteristique flexrow list-item" data-attribute="{{key}}">
|
<li class="caracteristique flexrow list-item" data-attribute="{{key}}">
|
||||||
<span class="carac-label flexrow" name="categorie">Structure</span>
|
<span class="carac-label">Structure</span>
|
||||||
<input class="competence-value flexrow" type="text" name="data.structure" value="{{data.structure}}" data-dtype="Number" />
|
<input class="competence-value flexrow" type="text" name="system.etat.structure.value" value="{{system.etat.structure.value}}" data-dtype="Number" />
|
||||||
|
/
|
||||||
|
<input class="competence-value flexrow" type="text" name="system.etat.structure.max" value="{{system.etat.structure.max}}" data-dtype="Number" />
|
||||||
</li>
|
</li>
|
||||||
<li class="caracteristique flexrow list-item" data-attribute="{{key}}">
|
<li class="caracteristique flexrow list-item" data-attribute="{{key}}">
|
||||||
<span class="carac-label flexrow" name="categorie">Vitesse</span>
|
<span class="carac-label">Vitesse</span>
|
||||||
<input class="competence-value flexrow" type="text" name="data.vitesse" value="{{data.vitesse}}" data-dtype="String" />
|
<input class="caracteristique vehicle" type="text" name="system.vitesse" value="{{system.vitesse}}" data-dtype="String" />
|
||||||
</li>
|
</li>
|
||||||
<li class="caracteristique flexrow list-item" data-attribute="{{key}}">
|
<li class="caracteristique flexrow list-item" data-attribute="{{key}}">
|
||||||
<span class="carac-label flexrow" name="categorie">Bonus</span>
|
<span class="carac-label">Bonus</span>
|
||||||
<input class="competence-value flexrow" type="text" name="data.bonus" value="{{data.bonus}}" data-dtype="String" />
|
<input class="caracteristique vehicle" type="text" name="system.bonus" value="{{system.bonus}}" data-dtype="String" />
|
||||||
</li>
|
</li>
|
||||||
<li class="caracteristique flexrow list-item" data-attribute="{{key}}">
|
<li class="caracteristique flexrow list-item" data-attribute="{{key}}">
|
||||||
<span class="carac-label flexrow" name="categorie">Manoeuvrabilité</span>
|
<span class="carac-label">Manoeuvrabilité</span>
|
||||||
<input class="competence-value flexrow" type="text" name="data.manoeuvrabilite" value="{{data.manoeuvrabilite}}" data-dtype="String" />
|
<input class="caracteristique vehicle" type="text" name="system.manoeuvrabilite" value="{{system.manoeuvrabilite}}" data-dtype="String" />
|
||||||
</li>
|
</li>
|
||||||
<li class="caracteristique flexrow list-item" data-attribute="{{key}}">
|
<li class="caracteristique flexrow list-item" data-attribute="{{key}}">
|
||||||
<span class="carac-label flexrow" name="categorie">Equipage</span>
|
<span class="carac-label">Equipage</span>
|
||||||
<input class="competence-value flexrow" type="text" name="data.equipage" value="{{data.equipage}}" data-dtype="Number" />
|
<input class="caracteristique vehicle" type="text" name="system.equipage" value="{{system.equipage}}" data-dtype="Number" />
|
||||||
</li>
|
</li>
|
||||||
<li class="caracteristique flexrow list-item" data-attribute="{{key}}">
|
<li class="caracteristique flexrow list-item" data-attribute="{{key}}">
|
||||||
<span class="carac-label flexrow" name="categorie">Capacité d'Encombrement</span>
|
<span class="carac-label">Capacité d'Encombrement</span>
|
||||||
<input class="competence-value flexrow" type="text" name="data.capacite_encombrement" value="{{data.capacite_encombrement}}" data-dtype="Number" />
|
<input class="caracteristique vehicle" type="text" name="system.capacite_encombrement" value="{{system.capacite_encombrement}}" data-dtype="Number" />
|
||||||
</li>
|
</li>
|
||||||
</ol>
|
</ol>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{{!-- Equipment Tab --}}
|
{{!-- Equipment Tab --}}
|
||||||
<div class="tab items" data-group="primary" data-tab="items">
|
<div class="tab items" data-group="primary" data-tab="items">
|
||||||
|
{{> "systems/foundryvtt-reve-de-dragon/templates/actor/inventaire.html"}}
|
||||||
{{> "systems/foundryvtt-reve-de-dragon/templates/actor-sheet-inventaire.html"}}
|
</div>
|
||||||
|
|
||||||
|
|
||||||
{{!-- Biography Tab --}}
|
{{!-- Biography Tab --}}
|
||||||
<div class="tab description" data-group="primary" data-tab="description">
|
<div class="tab description" data-group="primary" data-tab="description">
|
||||||
<div class="form-group editor">
|
<div class="form-group editor">
|
||||||
{{editor content=data.description target="data.description" button=true owner=owner editable=editable}}
|
{{editor description target="system.description" button=true owner=owner editable=editable}}
|
||||||
</div>
|
</div>
|
||||||
{{>"systems/foundryvtt-reve-de-dragon/templates/actor-sheet-editor-notes-mj.html"}}
|
{{>"systems/foundryvtt-reve-de-dragon/templates/actor/editor-notes-mj.html"}}
|
||||||
</div>
|
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
</section>
|
</section>
|
||||||
|
13
templates/actor/alchimie.html
Normal file
13
templates/actor/alchimie.html
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
{{#if recettesAlchimiques.length}}
|
||||||
|
<h3>Recettes Alchimiques</h3>
|
||||||
|
<ul class="item-list alterne-list">
|
||||||
|
{{#each recettesAlchimiques as |recette id|}}
|
||||||
|
<li class="item flexrow list-item" data-item-id="{{recette._id}}"><span class="competence-title recette-label item-edit"><a>{{recette.name}}</a></span>
|
||||||
|
<div class="item-controls flex-shrink">
|
||||||
|
<a class="item-edit" title="Edit Item"><i class="fas fa-edit"></i></a>
|
||||||
|
<a class="item-delete" title="Delete Item"><i class="fas fa-trash"></i></a>
|
||||||
|
</div>
|
||||||
|
</li>
|
||||||
|
{{/each}}
|
||||||
|
</ul>
|
||||||
|
{{/if}}
|
2
templates/actor/astrologie.html
Normal file
2
templates/actor/astrologie.html
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
<h3>Astrologie</h3>
|
||||||
|
<span class="astrologie-label"><a id="jet-astrologie">Astrologie : Nombres Astraux</a></span>
|
27
templates/actor/blessure.html
Normal file
27
templates/actor/blessure.html
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
<li class="item flexrow list-item {{#if blessure.active}}blessure-active-{{gravite}}{{else}}blessure-inactive{{/if}}"
|
||||||
|
data-blessure-type="{{gravite}}"
|
||||||
|
data-attribute={{key}}
|
||||||
|
data-blessure-index="{{key}}"
|
||||||
|
data-blessure-active="{{blessure.active}}">
|
||||||
|
<span class="blessure-control" title="Blessure {{title}}">
|
||||||
|
<i class="fas fa-skull-crossbones" name="blessure-{{gravite}}-{{key}}-active"></i>
|
||||||
|
{{title}}
|
||||||
|
</span>
|
||||||
|
{{#if blessure.active}}
|
||||||
|
<span class="blessure-soins flexrow">
|
||||||
|
<input class="blessure-psdone" name="blessure-{{gravite}}-{{key}}-psdone" type="checkbox" name="blessure.psdone" {{#if blessure.psdone}}checked{{/if}}/>
|
||||||
|
<input class="blessure-premiers_soins" type="text" name="blessure-{{gravite}}-{{key}}-premiers_soins" data-dtype="number" value="{{blessure.premiers_soins}}"/>
|
||||||
|
</span>
|
||||||
|
<span class="blessure-soins flexrow">
|
||||||
|
<input class="blessure-scdone" name="blessure-{{gravite}}-{{key}}-scdone" type="checkbox" name="blessure.scdone" {{#if blessure.scdone}}checked{{/if}}/>
|
||||||
|
<input class="blessure-soins_complets" type="text" name="blessure-{{gravite}}-{{key}}-soins_complets" data-dtype="number" value="{{blessure.soins_complets}}"/>
|
||||||
|
</span>
|
||||||
|
<input class="blessure-jours" type="text" name="blessure-{{gravite}}-{{key}}-jours" name="jours" data-dtype="number" value="{{blessure.jours}}"/>
|
||||||
|
<input class="blessure-localisation" type="text" name="blessure-{{gravite}}-{{key}}-localisation" data-dtype="String" value="{{blessure.loc}}"/>
|
||||||
|
{{else}}
|
||||||
|
<span></span>
|
||||||
|
<span></span>
|
||||||
|
<span></span>
|
||||||
|
<span></span>
|
||||||
|
{{/if}}
|
||||||
|
</li>
|
18
templates/actor/blessures.html
Normal file
18
templates/actor/blessures.html
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
<ul class="item-list alterne-list">
|
||||||
|
<li class="competence-header flexrow" >
|
||||||
|
<span>Blessures</span>
|
||||||
|
<span>Premiers soins</span>
|
||||||
|
<span>Soins complets</span>
|
||||||
|
<span>Age (jours)</span>
|
||||||
|
<span>Localisation</span>
|
||||||
|
</li>
|
||||||
|
{{#each system.blessures.legeres.liste as |blessure key|}}
|
||||||
|
{{> "systems/foundryvtt-reve-de-dragon/templates/actor/blessure.html" blessure=blessure key=key gravite="legere" title="Légère"}}
|
||||||
|
{{/each}}
|
||||||
|
{{#each system.blessures.graves.liste as |blessure key|}}
|
||||||
|
{{> "systems/foundryvtt-reve-de-dragon/templates/actor/blessure.html" blessure=blessure key=key gravite="grave" title="Grave"}}
|
||||||
|
{{/each}}
|
||||||
|
{{#each system.blessures.critiques.liste as |blessure key|}}
|
||||||
|
{{> "systems/foundryvtt-reve-de-dragon/templates/actor/blessure.html" blessure=blessure key=key gravite="critique" title="Critique"}}
|
||||||
|
{{/each}}
|
||||||
|
</ul>
|
@ -6,7 +6,6 @@
|
|||||||
<ul class="item-list alterne-list competence-list">
|
<ul class="item-list alterne-list competence-list">
|
||||||
{{#if @root.options.vueDetaillee}}
|
{{#if @root.options.vueDetaillee}}
|
||||||
<li class="item flexrow list-item ">
|
<li class="item flexrow list-item ">
|
||||||
|
|
||||||
<span class="competence-label"></span>
|
<span class="competence-label"></span>
|
||||||
<span class="competence-value" >Niv.</span>
|
<span class="competence-value" >Niv.</span>
|
||||||
<span class="competence-xp">xp</span>
|
<span class="competence-xp">xp</span>
|
||||||
@ -15,7 +14,7 @@
|
|||||||
{{/if}}
|
{{/if}}
|
||||||
<div class="item-controls">
|
<div class="item-controls">
|
||||||
<i class="far fa-arrow-alt-circle-up"></i>
|
<i class="far fa-arrow-alt-circle-up"></i>
|
||||||
<span class="competence-archetype">Arch</span>
|
<span class="competence-archetype">Arch.</span>
|
||||||
<i class="far fa-edit"></i>
|
<i class="far fa-edit"></i>
|
||||||
{{#if @root.options.isGM}}
|
{{#if @root.options.isGM}}
|
||||||
<i class="far fa-trash"></i>
|
<i class="far fa-trash"></i>
|
||||||
@ -24,7 +23,7 @@
|
|||||||
</li>
|
</li>
|
||||||
{{/if}}
|
{{/if}}
|
||||||
{{#each competences as |comp key|}}
|
{{#each competences as |comp key|}}
|
||||||
{{> "systems/foundryvtt-reve-de-dragon/templates/actor-sheet-competence-partial.html" comp}}
|
{{> "systems/foundryvtt-reve-de-dragon/templates/actor/competence.html" comp}}
|
||||||
{{/each}}
|
{{/each}}
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
43
templates/actor/combat.html
Normal file
43
templates/actor/combat.html
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
<ul class="item-list alterne-list">
|
||||||
|
<li class="competence-header flexrow">
|
||||||
|
<span class="competence-title competence-label">Armes et Défenses</span>
|
||||||
|
<span class="competence-title competence-value">Niveau</span>
|
||||||
|
<span class="competence-title competence-value">+dom</span>
|
||||||
|
<span class="competence-title competence-value"></span>
|
||||||
|
<span class="competence-title initiative-value">Initiative</span>
|
||||||
|
</li>
|
||||||
|
{{#each combat as |arme key|}}
|
||||||
|
<li class="item flexrow list-item"
|
||||||
|
data-item-id="{{arme._id}}"
|
||||||
|
data-arme-name="{{arme.name}}"
|
||||||
|
data-competence-name="{{arme.system.competence}}" >
|
||||||
|
<span class="arme-label">
|
||||||
|
<a>
|
||||||
|
{{#if arme.img}}
|
||||||
|
<img class="sheet-competence-img" src="{{arme.img}}"/>
|
||||||
|
{{/if}}
|
||||||
|
<span>{{arme.name}}</span>
|
||||||
|
</a>
|
||||||
|
({{arme.system.competence}})
|
||||||
|
</span>
|
||||||
|
<span class="competence-value">{{numberFormat arme.system.niveau decimals=0 sign=true}}</span>
|
||||||
|
<span class="competence-value">{{numberFormat arme.system.dommagesReels decimals=0 sign=true}}</span>
|
||||||
|
<span class="competence-value"></span>
|
||||||
|
<span class="initiative-value arme-initiative"><a>{{arme.system.initiative}}</a></span>
|
||||||
|
</li>
|
||||||
|
{{/each}}
|
||||||
|
{{#each esquives as |esq key|}}
|
||||||
|
<li class="item flexrow list-item" data-item-id="{{esq._id}}">
|
||||||
|
<span class="competence-label">
|
||||||
|
<a class="competence-label" name="{{esq.name}}">
|
||||||
|
<img class="sheet-competence-img" src="{{esq.img}}"/>
|
||||||
|
<span>{{esq.name}}</span>
|
||||||
|
</a>
|
||||||
|
</span>
|
||||||
|
<span class="competence-value">{{numberFormat esq.system.niveau decimals=0 sign=true}}</span>
|
||||||
|
<span class="competence-value"></span>
|
||||||
|
<span class="competence-value"></span>
|
||||||
|
<span class="initiative-value"></span>
|
||||||
|
</li>
|
||||||
|
{{/each}}
|
||||||
|
</ul>
|
50
templates/actor/competence.html
Normal file
50
templates/actor/competence.html
Normal file
@ -0,0 +1,50 @@
|
|||||||
|
{{#if system.isVisible}}
|
||||||
|
<li class="item flexrow list-item {{#if system.isLevelUp}}xp-level-up tooltip{{/if}}" data-item-id="{{_id}}">
|
||||||
|
<a class="competence-label" name="{{name}}">
|
||||||
|
<img class="sheet-competence-img" src="{{img}}"/>
|
||||||
|
<span class="competence-label">{{name}}</span>
|
||||||
|
</a>
|
||||||
|
|
||||||
|
{{#if system.isLevelUp}}
|
||||||
|
<span class="tooltiptext ttt-xp">Vous pouvez dépenser {{system.xpNext}} points d'Experience pour augmenter de 1 votre compétence {{name}}</span>
|
||||||
|
<a class="competence-xp-augmenter" compname="{{name}}" title="Augmenter">
|
||||||
|
<i class="fas fa-arrow-alt-circle-up"></i>
|
||||||
|
</a>
|
||||||
|
{{/if}}
|
||||||
|
|
||||||
|
<input class="competence-value" type="text" compname="{{name}}" name="comp-value-{{name}}"
|
||||||
|
value="{{numberFormat system.niveau decimals=0 sign=true}}" data-dtype="number"
|
||||||
|
{{#unless @root.options.vueDetaillee}}disabled{{/unless}} />
|
||||||
|
|
||||||
|
{{#if @root.options.vueDetaillee}}
|
||||||
|
<span class="competence-xp tooltip">
|
||||||
|
<input class="competence-xp " type="text" compname="{{name}}" name="comp-xp-{{name}}"
|
||||||
|
value="{{numberFormat system.xp decimals=0 sign=false}}" data-dtype="number"/>
|
||||||
|
<span class="tooltiptext left-competence ttt-xp">Vous devez acquérir {{system.xpNext}} points d'Experience pour augmenter de 1 votre compétence {{name}}</span>
|
||||||
|
</span>
|
||||||
|
{{/if}}
|
||||||
|
{{#if (eq system.categorie 'draconic')}}
|
||||||
|
<input class="competence-xp-sort" type="text" compname="{{name}}" name="comp-xp-sort-{{name}}"
|
||||||
|
value="{{numberFormat system.xp_sort decimals=0 sign=false}}" data-dtype="number"
|
||||||
|
{{#unless @root.options.vueDetaillee}}disabled{{/unless}}/>
|
||||||
|
{{/if}}
|
||||||
|
{{#if @root.options.vueDetaillee}}
|
||||||
|
<div class="item-controls">
|
||||||
|
{{#if system.stressXpMax}}
|
||||||
|
<a class="competence-stress-augmenter" compname="{{name}}"
|
||||||
|
title="Dépenser {{system.stressXpMax}} points de stress {{#if system.isStressLevelUp}} pour augmenter d'un niveau {{/if}}">
|
||||||
|
<i class="fas fa-arrow-alt-circle-up allouer-stress{{#if system.isStressLevelUp}}-level-up{{/if}}"></i>
|
||||||
|
</a>
|
||||||
|
{{else}}
|
||||||
|
<i class="far fa-circle"></i>
|
||||||
|
{{/if}}
|
||||||
|
<input class="competence-archetype niveau-archetype" type="text" compname="{{name}}" name="comp-archetype-{{name}}"
|
||||||
|
value="{{numberFormat system.niveau_archetype decimals=0 sign=true}}" data-dtype="number"/>
|
||||||
|
<a class="item-edit" title="Modifier"><i class="fas fa-edit"></i></a>
|
||||||
|
{{#if @root.options.isGM}}
|
||||||
|
<a class="item-delete" title="Supprimer"><i class="fas fa-trash"></i></a>
|
||||||
|
{{/if}}
|
||||||
|
</div>
|
||||||
|
{{/if}}
|
||||||
|
</li>
|
||||||
|
{{/if}}
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user