Compare commits
70 Commits
foundryvtt
...
v1.5
Author | SHA1 | Date | |
---|---|---|---|
773b3756a6 | |||
d57cdc2af4 | |||
|
f2d1879135 | ||
ea7132468d | |||
2391fbc4bc | |||
|
0d2bb2d9a3 | ||
7198eb621d | |||
6271c75508 | |||
cd7cc8eeef | |||
|
bb3bc0ea77 | ||
|
f348f3dc3f | ||
|
dbf9f5e908 | ||
|
e4da124579 | ||
|
6e361a5531 | ||
|
049b23c666 | ||
|
3ff59d1f07 | ||
8c0fbf15b6 | |||
d4fddf8600 | |||
|
4b1862fa48 | ||
|
82115ed8d7 | ||
3359492f13 | |||
676e6739a6 | |||
|
872d3fff31 | ||
9c71827baa | |||
fc9ef06e7b | |||
|
9e63706de6 | ||
3958b1bdc2 | |||
6d6843223b | |||
|
46f5cb67f6 | ||
|
d51243d74f | ||
|
34cc671f12 | ||
|
16ce6a58dd | ||
89910e234d | |||
f30df47d22 | |||
|
c3c42bdb21 | ||
|
14eb655382 | ||
|
52e4375972 | ||
8aece9cad1 | |||
ffd36a045e | |||
|
bafc52a151 | ||
|
940baad04c | ||
70c26ebfe0 | |||
782c6a8fe2 | |||
|
b417fdfe32 | ||
11274c51d6 | |||
6377964d07 | |||
|
8cf43d4e8a | ||
|
5efb7d9be0 | ||
|
f54804c071 | ||
|
59ece09357 | ||
|
5868bf16e0 | ||
6873cf0d41 | |||
2c73f5aa11 | |||
035da98aaa | |||
|
2885ca1c8f | ||
|
218c88a924 | ||
|
e22b6c52f1 | ||
|
9b8f694dda | ||
|
75562b0af8 | ||
|
3a684c3c54 | ||
|
70354abacb | ||
|
bdead49d01 | ||
60b6da5cd3 | |||
66218be14a | |||
|
9aad57c00c | ||
395e4d4b73 | |||
25de00d2a9 | |||
|
0805d1df66 | ||
e2de9bb645 | |||
5d2db17c03 |
1
foundryvtt-reve-de-dragon
Symbolic link
1
foundryvtt-reve-de-dragon
Symbolic link
@ -0,0 +1 @@
|
|||||||
|
foundryvtt-reve-de-dragon
|
@ -22,13 +22,6 @@ export class RdDActorEntiteSheet extends ActorSheet {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
|
||||||
_checkNull(items) {
|
|
||||||
if (items && items.length) {
|
|
||||||
return items;
|
|
||||||
}
|
|
||||||
return [];
|
|
||||||
}
|
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
async getData() {
|
async getData() {
|
||||||
|
@ -37,8 +37,7 @@ export class RdDActorSheet extends ActorSheet {
|
|||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
async getData() {
|
async getData() {
|
||||||
const objectData = Misc.data(this.object);
|
const objectData = Misc.data(this.object);
|
||||||
|
this.timerRecherche = undefined;
|
||||||
//this.actor.checkMonnaiePresence(this.actor.data.items); // Always check
|
|
||||||
|
|
||||||
let formData = {
|
let formData = {
|
||||||
title: this.title,
|
title: this.title,
|
||||||
@ -78,8 +77,8 @@ export class RdDActorSheet extends ActorSheet {
|
|||||||
};
|
};
|
||||||
|
|
||||||
formData.competences.forEach(item => {
|
formData.competences.forEach(item => {
|
||||||
item.visible = this.options.cherchercompetence
|
item.visible = this.options.recherche
|
||||||
? RdDItemCompetence.nomContientTexte(item, this.options.cherchercompetence)
|
? 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.data.compteurs.experience.value);
|
||||||
});
|
});
|
||||||
@ -94,7 +93,7 @@ export class RdDActorSheet extends ActorSheet {
|
|||||||
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.data.carac);
|
||||||
formData.esquives = this.actor.getCompetences("Esquive").map(i => foundry.utils.deepClone(i.data));
|
formData.esquives = this.actor.getCompetences("Esquive").map(i => foundry.utils.deepClone(i.data));
|
||||||
formData.combat = RdDCombatManager.finalizeArmeList(formData.combat, formData.competences, formData.data.carac);
|
formData.combat = RdDCombatManager.listActionsArmes(formData.combat, formData.competences, formData.data.carac);
|
||||||
|
|
||||||
this.armesList = formData.combat;
|
this.armesList = formData.combat;
|
||||||
|
|
||||||
@ -315,7 +314,7 @@ export class RdDActorSheet extends ActorSheet {
|
|||||||
|
|
||||||
// Boutons spéciaux MJs
|
// Boutons spéciaux MJs
|
||||||
html.find('.forcer-tmr-aleatoire').click(async event => {
|
html.find('.forcer-tmr-aleatoire').click(async event => {
|
||||||
this.actor.cacheTMRetMessage();
|
this.actor.reinsertionAleatoire("Action MJ");
|
||||||
});
|
});
|
||||||
html.find('.afficher-tmr').click(async event => {
|
html.find('.afficher-tmr').click(async event => {
|
||||||
this.actor.afficheTMRetMessage();
|
this.actor.afficheTMRetMessage();
|
||||||
@ -335,8 +334,8 @@ export class RdDActorSheet extends ActorSheet {
|
|||||||
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.data.combatants.find(c => c.actor.data._id == this.actor.data._id);
|
||||||
if (combatant) {
|
if (combatant) {
|
||||||
let arme = this._getEventArmeCombat(event);
|
let action = this._getEventArmeCombat(event);
|
||||||
RdDCombatManager.rollInitiativeCompetence(combatant._id, arme);
|
RdDCombatManager.rollInitiativeAction(combatant._id, action);
|
||||||
} else {
|
} else {
|
||||||
ui.notifications.info("Impossible de lancer l'initiative sans être dans un combat.");
|
ui.notifications.info("Impossible de lancer l'initiative sans être dans un combat.");
|
||||||
}
|
}
|
||||||
@ -424,12 +423,31 @@ export class RdDActorSheet extends ActorSheet {
|
|||||||
this.options.editCaracComp = !this.options.editCaracComp;
|
this.options.editCaracComp = !this.options.editCaracComp;
|
||||||
this.render(true);
|
this.render(true);
|
||||||
});
|
});
|
||||||
html.find('.cherchercompetence').change(async event => {
|
|
||||||
this.options.cherchercompetence = event.currentTarget.value;
|
html.find('.recherche')
|
||||||
this.render(true);
|
.each((index, field) => {
|
||||||
});
|
if (this.options.recherche) {
|
||||||
|
field.focus();
|
||||||
|
field.setSelectionRange(this.options.recherche.start, this.options.recherche.end);
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.keyup(async event => {
|
||||||
|
const nouvelleRecherche = this._optionRecherche(event.currentTarget);
|
||||||
|
if (this.options.recherche?.text != nouvelleRecherche?.text){
|
||||||
|
this.options.recherche = nouvelleRecherche;
|
||||||
|
if (this.timerRecherche) {
|
||||||
|
clearTimeout(this.timerRecherche);
|
||||||
|
}
|
||||||
|
this.timerRecherche = setTimeout(() => {
|
||||||
|
this.timerRecherche = undefined;
|
||||||
|
this.render(true);
|
||||||
|
}, 500);
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.change(async event =>
|
||||||
|
this.options.recherche = this._optionRecherche(event.currentTarget)
|
||||||
|
);
|
||||||
html.find('.vue-detaillee').click(async event => {
|
html.find('.vue-detaillee').click(async event => {
|
||||||
console.log("CONTROLS", this.options.vueDetaillee)
|
|
||||||
this.options.vueDetaillee = !this.options.vueDetaillee;
|
this.options.vueDetaillee = !this.options.vueDetaillee;
|
||||||
this.render(true);
|
this.render(true);
|
||||||
});
|
});
|
||||||
@ -515,6 +533,17 @@ export class RdDActorSheet extends ActorSheet {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_optionRecherche(target) {
|
||||||
|
if (!target.value?.length){
|
||||||
|
return undefined;
|
||||||
|
}
|
||||||
|
return {
|
||||||
|
text: target.value,
|
||||||
|
start: target.selectionStart,
|
||||||
|
end: target.selectionEnd,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
_getEventArmeCombat(event) {
|
_getEventArmeCombat(event) {
|
||||||
const li = $(event.currentTarget)?.parents(".item");
|
const li = $(event.currentTarget)?.parents(".item");
|
||||||
let armeName = li.data("arme-name");
|
let armeName = li.data("arme-name");
|
||||||
|
@ -25,14 +25,6 @@ export class RdDActorVehiculeSheet extends ActorSheet {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
|
||||||
_checkNull(items) {
|
|
||||||
if (items && items.length) {
|
|
||||||
return items;
|
|
||||||
}
|
|
||||||
return [];
|
|
||||||
}
|
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
async getData() {
|
async getData() {
|
||||||
const objectData = Misc.data(this.object);
|
const objectData = Misc.data(this.object);
|
||||||
|
216
module/actor.js
216
module/actor.js
@ -33,7 +33,8 @@ import { RollDataAjustements } from "./rolldata-ajustements.js";
|
|||||||
import { DialogItemAchat } from "./dialog-item-achat.js";
|
import { DialogItemAchat } from "./dialog-item-achat.js";
|
||||||
import { RdDItem } from "./item.js";
|
import { RdDItem } from "./item.js";
|
||||||
import { RdDPossession } from "./rdd-possession.js";
|
import { RdDPossession } from "./rdd-possession.js";
|
||||||
import { SYSTEM_RDD, SYSTEM_SOCKET_ID } from "./constants.js";
|
import { ENTITE_BLURETTE, ENTITE_INCARNE, ENTITE_NONINCARNE, SYSTEM_RDD, SYSTEM_SOCKET_ID } from "./constants.js";
|
||||||
|
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
/**
|
/**
|
||||||
@ -98,7 +99,6 @@ export class RdDActor extends Actor {
|
|||||||
* @param {Object} options (Unused) Additional options which customize the creation workflow.
|
* @param {Object} options (Unused) Additional options which customize the creation workflow.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static async create(actorData, options) {
|
static async create(actorData, options) {
|
||||||
// Case of compendium global import
|
// Case of compendium global import
|
||||||
if (actorData instanceof Array) {
|
if (actorData instanceof Array) {
|
||||||
@ -115,11 +115,14 @@ export class RdDActor extends Actor {
|
|||||||
return actor;
|
return actor;
|
||||||
}
|
}
|
||||||
|
|
||||||
const competences = await RdDUtility.loadCompendium(RdDItemCompetence.actorCompendium(actorData.type));
|
|
||||||
actorData.items = competences.map(i => i.toObject());
|
|
||||||
if (isPersonnage) {
|
if (isPersonnage) {
|
||||||
|
const competences = await RdDUtility.loadCompendium(RdDItemCompetence.actorCompendium(actorData.type));
|
||||||
|
actorData.items = competences.map(i => i.toObject());
|
||||||
actorData.items = actorData.items.concat(Monnaie.monnaiesData());
|
actorData.items = actorData.items.concat(Monnaie.monnaiesData());
|
||||||
}
|
}
|
||||||
|
else {
|
||||||
|
actorData.items = [];
|
||||||
|
}
|
||||||
return super.create(actorData, options);
|
return super.create(actorData, options);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -132,13 +135,6 @@ export class RdDActor extends Actor {
|
|||||||
this.encTotal = 0;
|
this.encTotal = 0;
|
||||||
this.prixTotalEquipement = 0;
|
this.prixTotalEquipement = 0;
|
||||||
|
|
||||||
/*
|
|
||||||
// Auto-resize token
|
|
||||||
if (this.isToken) {
|
|
||||||
let tokenSize = actorData.data.carac.taille.value/10;
|
|
||||||
this.token.update({height: tokenSize, width: tokenSize } );
|
|
||||||
}*/
|
|
||||||
|
|
||||||
// Make separate methods for each Actor type (character, npc, etc.) to keep
|
// Make separate methods for each Actor type (character, npc, etc.) to keep
|
||||||
// things organized.
|
// things organized.
|
||||||
if (actorData.type === 'personnage') this._prepareCharacterData(actorData);
|
if (actorData.type === 'personnage') this._prepareCharacterData(actorData);
|
||||||
@ -244,7 +240,7 @@ export class RdDActor extends Actor {
|
|||||||
}
|
}
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
getForce() {
|
getForce() {
|
||||||
if (this.isEntiteCauchemar()) {
|
if (this.isEntite()) {
|
||||||
return Misc.toInt(Misc.templateData(this).carac.reve?.value);
|
return Misc.toInt(Misc.templateData(this).carac.reve?.value);
|
||||||
}
|
}
|
||||||
return Misc.toInt(Misc.templateData(this).carac.force?.value);
|
return Misc.toInt(Misc.templateData(this).carac.force?.value);
|
||||||
@ -372,12 +368,30 @@ export class RdDActor extends Actor {
|
|||||||
const list = this.getDraconicList();
|
const list = this.getDraconicList();
|
||||||
return duplicate(list[0]);
|
return duplicate(list[0]);
|
||||||
}
|
}
|
||||||
getDraconicOrZero() {
|
getDraconicOuPossession() {
|
||||||
const list = this.getDraconicList().filter(it => Misc.data(it).data.niveau >= 0);
|
const possessions = this.items.filter(it => Misc.data(it).type == 'competencecreature' && Misc.templateData(it).ispossession)
|
||||||
if (list.length == 0) {
|
.sort(Misc.descending(it => Misc.templateData(it).niveau));
|
||||||
return { name: "Aucun", data: { niveau: 0 } };
|
if (possessions.length>0) {
|
||||||
|
return duplicate(possessions[0]);
|
||||||
}
|
}
|
||||||
return duplicate(list[0]);
|
const draconics = this.getDraconicList().filter(it => Misc.data(it).data.niveau >= 0);
|
||||||
|
if (draconics.length> 0) {
|
||||||
|
return duplicate(draconics[0]);
|
||||||
|
}
|
||||||
|
return {
|
||||||
|
img: 'systems/foundryvtt-reve-de-dragon/icons/entites/possession.webp',
|
||||||
|
name: 'Sans draconic',
|
||||||
|
data: {
|
||||||
|
niveau: 0,
|
||||||
|
defaut_carac: "reve",
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
getPossession(possessionId) {
|
||||||
|
return this.items.find(it => it.type == 'possession' && it.data.data.possessionid == possessionId);
|
||||||
|
}
|
||||||
|
getPossessions() {
|
||||||
|
return this.items.filter(it => it.type == 'possession');
|
||||||
}
|
}
|
||||||
|
|
||||||
getDemiReve() {
|
getDemiReve() {
|
||||||
@ -599,7 +613,10 @@ export class RdDActor extends Actor {
|
|||||||
content: "Remise à neuf de " + this.name
|
content: "Remise à neuf de " + this.name
|
||||||
};
|
};
|
||||||
const actorData = Misc.data(this);
|
const actorData = Misc.data(this);
|
||||||
if (this.isEntiteCauchemar()) {
|
if (this.isEntite([ENTITE_NONINCARNE])) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (this.isEntite([ENTITE_INCARNE, ENTITE_BLURETTE])) {
|
||||||
await this.santeIncDec("endurance", actorData.data.sante.endurance.max - actorData.data.sante.endurance.value);
|
await this.santeIncDec("endurance", actorData.data.sante.endurance.max - actorData.data.sante.endurance.value);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
@ -783,7 +800,7 @@ export class RdDActor extends Actor {
|
|||||||
async combattreReveDeDragon(force) {
|
async combattreReveDeDragon(force) {
|
||||||
let rollData = {
|
let rollData = {
|
||||||
actor: this,
|
actor: this,
|
||||||
competence: duplicate(this.getDraconicOrZero()),
|
competence: duplicate(this.getDraconicOuPossession()),
|
||||||
canClose: false,
|
canClose: false,
|
||||||
rencontre: duplicate(TMRRencontres.getRencontre('rdd')),
|
rencontre: duplicate(TMRRencontres.getRencontre('rdd')),
|
||||||
tmr: true,
|
tmr: true,
|
||||||
@ -1200,21 +1217,39 @@ export class RdDActor extends Actor {
|
|||||||
if (srcId != destId && itemId != destId) { // déplacement de l'objet
|
if (srcId != destId && itemId != destId) { // déplacement de l'objet
|
||||||
const dest = this.getObjet(destId);
|
const dest = this.getObjet(destId);
|
||||||
const src = this.getObjet(srcId);
|
const src = this.getObjet(srcId);
|
||||||
// changer de conteneur
|
if (dest?.isEquipementSimilaire(item)) {
|
||||||
if (this.conteneurPeutContenir(dest, item)) {
|
|
||||||
await this.enleverDeConteneur(item, src, params.onEnleverConteneur);
|
|
||||||
await this.ajouterDansConteneur(item, dest, params.onAjouterDansConteneur);
|
|
||||||
}
|
|
||||||
else if (dest?.isEquipementSimilaire(item)) {
|
|
||||||
await this.regrouperEquipementsSimilaires(item, dest);
|
await this.regrouperEquipementsSimilaires(item, dest);
|
||||||
result = false;
|
result = false;
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
const cible = this.getContenantOrParent(dest);
|
||||||
|
// changer de conteneur
|
||||||
|
if (cible == undefined) {
|
||||||
|
await this.enleverDeConteneur(item, src, params.onEnleverConteneur);
|
||||||
|
}
|
||||||
|
else if (this.conteneurPeutContenir(cible, item)) {
|
||||||
|
await this.enleverDeConteneur(item, src, params.onEnleverConteneur);
|
||||||
|
await this.ajouterDansConteneur(item, cible, params.onAjouterDansConteneur);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
await this.computeEncombrementTotalEtMalusArmure();
|
await this.computeEncombrementTotalEtMalusArmure();
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
getContenantOrParent(dest) {
|
||||||
|
if (!dest || dest.isConteneur()) {
|
||||||
|
return dest;
|
||||||
|
}
|
||||||
|
return this.getContenant(dest);
|
||||||
|
}
|
||||||
|
|
||||||
|
getContenant(item) {
|
||||||
|
return this.items.find(it => it.isConteneur() && Misc.templateData(it).contenu.includes(item.id));
|
||||||
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
conteneurPeutContenir(dest, item) {
|
conteneurPeutContenir(dest, item) {
|
||||||
if (!dest) {
|
if (!dest) {
|
||||||
@ -1472,10 +1507,8 @@ export class RdDActor extends Actor {
|
|||||||
isTMRCache() {
|
isTMRCache() {
|
||||||
return this.data.data.reve.tmrpos.cache;
|
return this.data.data.reve.tmrpos.cache;
|
||||||
}
|
}
|
||||||
/* -------------------------------------------- */
|
|
||||||
async cacheTMRetMessage() {
|
notifyRefreshTMR() {
|
||||||
await this.reinsertionAleatoire("Action MJ");
|
|
||||||
await this.cacheTMR();
|
|
||||||
game.socket.emit(SYSTEM_SOCKET_ID, {
|
game.socket.emit(SYSTEM_SOCKET_ID, {
|
||||||
msg: "msg_tmr_move", data: {
|
msg: "msg_tmr_move", data: {
|
||||||
actorId: this.data._id,
|
actorId: this.data._id,
|
||||||
@ -1487,27 +1520,27 @@ export class RdDActor extends Actor {
|
|||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
async afficheTMRetMessage() {
|
async afficheTMRetMessage() {
|
||||||
await this.montreTMR();
|
await this.montreTMR();
|
||||||
game.socket.emit(SYSTEM_SOCKET_ID, {
|
this.notifyRefreshTMR();
|
||||||
msg: "msg_tmr_move", data: {
|
|
||||||
actorId: this.data._id,
|
|
||||||
tmrPos: this.data.data.reve.tmrpos
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
async reinsertionAleatoire(raison) {
|
async reinsertionAleatoire(raison, accessible = tmr => true) {
|
||||||
|
const innaccessible = this.buildTMRInnaccessible();
|
||||||
|
let tmr = await TMRUtility.getTMRAleatoire(tmr => accessible(tmr) && !innaccessible.includes(tmr.coord));
|
||||||
ChatMessage.create({
|
ChatMessage.create({
|
||||||
content: `${raison} : ré-insertion aléatoire.`,
|
content: `${raison} : ré-insertion aléatoire.`,
|
||||||
whisper: ChatUtility.getWhisperRecipientsAndGMs(game.user.name)
|
whisper: ChatUtility.getWhisperRecipientsAndGMs(game.user.name)
|
||||||
});
|
});
|
||||||
const innaccessible = this.buildTMRInnaccessible();
|
await this.forcerPositionTMRInconnue(tmr);
|
||||||
let tmr = await TMRUtility.getTMRAleatoire(tmr => !innaccessible.includes(tmr.coord));
|
|
||||||
this.updateCoordTMR(tmr.coord);
|
|
||||||
this.cacheTMR();
|
|
||||||
return tmr;
|
return tmr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async forcerPositionTMRInconnue(tmr) {
|
||||||
|
await this.cacheTMR();
|
||||||
|
await this.updateCoordTMR(tmr.coord);
|
||||||
|
this.notifyRefreshTMR();
|
||||||
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
buildTMRInnaccessible() {
|
buildTMRInnaccessible() {
|
||||||
const tmrInnaccessibles = this.filterItemsData(it => Draconique.isCaseTMR(it) &&
|
const tmrInnaccessibles = this.filterItemsData(it => Draconique.isCaseTMR(it) &&
|
||||||
@ -1611,7 +1644,7 @@ export class RdDActor extends Actor {
|
|||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
async setSonne(sonne = true) {
|
async setSonne(sonne = true) {
|
||||||
if (this.isEntiteCauchemar()) {
|
if (this.isEntite()) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (!game.combat && sonne) {
|
if (!game.combat && sonne) {
|
||||||
@ -1623,7 +1656,7 @@ export class RdDActor extends Actor {
|
|||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
getSConst() {
|
getSConst() {
|
||||||
if (this.isEntiteCauchemar()) {
|
if (this.isEntite()) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
return RdDCarac.calculSConst(Misc.templateData(this).carac.constitution.value);
|
return RdDCarac.calculSConst(Misc.templateData(this).carac.constitution.value);
|
||||||
@ -1740,7 +1773,7 @@ export class RdDActor extends Actor {
|
|||||||
result.newValue = Math.max(minValue, Math.min(compteur.value + inc, compteur.max));
|
result.newValue = Math.max(minValue, Math.min(compteur.value + inc, compteur.max));
|
||||||
//console.log("New value ", inc, minValue, result.newValue);
|
//console.log("New value ", inc, minValue, result.newValue);
|
||||||
let fatigue = 0;
|
let fatigue = 0;
|
||||||
if (name == "endurance" && !this.isEntiteCauchemar()) {
|
if (name == "endurance" && !this.isEntite()) {
|
||||||
if (result.newValue == 0 && inc < 0 && !isCritique) { // perte endurance et endurance devient 0 (sauf critique) -> -1 vie
|
if (result.newValue == 0 && inc < 0 && !isCritique) { // perte endurance et endurance devient 0 (sauf critique) -> -1 vie
|
||||||
sante.vie.value--;
|
sante.vie.value--;
|
||||||
result.perteVie = true;
|
result.perteVie = true;
|
||||||
@ -1777,7 +1810,7 @@ export class RdDActor extends Actor {
|
|||||||
}
|
}
|
||||||
|
|
||||||
isDead() {
|
isDead() {
|
||||||
return !this.isEntiteCauchemar() && Misc.templateData(this).sante.vie.value < -this.getSConst()
|
return !this.isEntite() && Misc.templateData(this).sante.vie.value < -this.getSConst()
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
@ -2403,7 +2436,7 @@ export class RdDActor extends Actor {
|
|||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
async checkSoufflePeage(tmr) {
|
async checkSoufflePeage(tmr) {
|
||||||
if ((tmr.type == 'pont' || tmr.type == 'cite') && EffetsDraconiques.isPeage(actor)) {
|
if ((tmr.type == 'pont' || tmr.type == 'cite') && EffetsDraconiques.isPeage(this)) {
|
||||||
await this.reveActuelIncDec(-1);
|
await this.reveActuelIncDec(-1);
|
||||||
ChatMessage.create({
|
ChatMessage.create({
|
||||||
content: "Vous êtes sous le coup d'un Péage : l'entrée sur cette case vous a coûté 1 Point de Rêve (déduit automatiquement).",
|
content: "Vous êtes sous le coup d'un Péage : l'entrée sur cette case vous a coûté 1 Point de Rêve (déduit automatiquement).",
|
||||||
@ -2540,9 +2573,9 @@ export class RdDActor extends Actor {
|
|||||||
if (rollData.competence.type == 'competencecreature') {
|
if (rollData.competence.type == 'competencecreature') {
|
||||||
if (rollData.competence.data.iscombat) {
|
if (rollData.competence.data.iscombat) {
|
||||||
if (rollData.competence.data.ispossession) {
|
if (rollData.competence.data.ispossession) {
|
||||||
RdDPossession.managePossession(this, rollData.competence)
|
RdDPossession.onAttaquePossession(this, rollData.competence)
|
||||||
} else {
|
} else {
|
||||||
const arme = RdDItemCompetenceCreature.toArme(rollData.competence)
|
const arme = RdDItemCompetenceCreature.toActionArme(rollData.competence)
|
||||||
RdDCombat.createUsingTarget(this)?.attaque(competence, arme)
|
RdDCombat.createUsingTarget(this)?.attaque(competence, arme)
|
||||||
}
|
}
|
||||||
return
|
return
|
||||||
@ -2568,8 +2601,8 @@ export class RdDActor extends Actor {
|
|||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
conjurerPossession(possession) {
|
conjurerPossession(possession) {
|
||||||
let draconic = this.getBestDraconic()
|
let draconic = this.getDraconicOuPossession();
|
||||||
RdDPossession.managePossession(this, draconic, possession)
|
RdDPossession.onAttaquePossession(this, draconic, possession)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
@ -2838,20 +2871,19 @@ export class RdDActor extends Actor {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
async _meditationResult(meditationData) {
|
async _meditationResult(meditationRoll) {
|
||||||
this.santeIncDec("fatigue", 2);
|
this.santeIncDec("fatigue", 2);
|
||||||
|
|
||||||
const signeData = RdDItemSigneDraconique.prepareSigneDraconiqueMeditation(meditationData.meditation, meditationData.rolled)
|
if (meditationRoll.rolled.isSuccess) {
|
||||||
if (signeData) {
|
await this.createEmbeddedDocuments("Item", [RdDItemSigneDraconique.prepareSigneDraconiqueMeditation(meditationRoll.meditation, meditationRoll.rolled)]);
|
||||||
await this.createEmbeddedDocuments("Item", [signeData]);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
await RdDResolutionTable.displayRollData(meditationData, this.name, 'chat-resultat-meditation.html');
|
await RdDResolutionTable.displayRollData(meditationRoll, this.name, 'chat-resultat-meditation.html');
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
_meditationEPart(meditationData) {
|
_meditationEPart(meditationRoll) {
|
||||||
this.updateEmbeddedDocuments('Item', [{ _id: meditationData._id, 'data.malus': meditationData.meditation.data.malus - 1 }]);
|
this.updateEmbeddedDocuments('Item', [{ _id: meditationRoll.meditation._id, 'data.malus': meditationRoll.meditation.data.malus - 1 }]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -3132,8 +3164,12 @@ export class RdDActor extends Actor {
|
|||||||
case 'chance-actuelle': case 'chance actuelle':
|
case 'chance-actuelle': case 'chance actuelle':
|
||||||
return carac.chance;
|
return carac.chance;
|
||||||
}
|
}
|
||||||
let entry = Misc.findFirstLike(name, Object.entries(carac), { mapper: it => it[1].label, description: 'caractéristique' });
|
const caracList = Object.entries(carac);
|
||||||
return entry.length > 0 ? carac[entry[0]] : undefined;
|
let entry = Misc.findFirstLike(name, caracList, { mapper: it => it[0], description: 'caractéristique' });
|
||||||
|
if (!entry || entry.length ==0) {
|
||||||
|
entry = Misc.findFirstLike(name, caracList, { mapper: it => it[1].label, description: 'caractéristique' });
|
||||||
|
}
|
||||||
|
return entry && entry.length > 0 ? carac[entry[0]] : undefined;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
@ -3154,9 +3190,9 @@ export class RdDActor extends Actor {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
refreshTMRView(tmrData) {
|
refreshTMRView() {
|
||||||
if (this.currentTMR) {
|
if (this.currentTMR) {
|
||||||
this.currentTMR.externalRefresh(tmrData)
|
this.currentTMR.externalRefresh();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3209,7 +3245,7 @@ export class RdDActor extends Actor {
|
|||||||
let competence = Misc.data(this.getCompetence(arme.data.competence));
|
let competence = Misc.data(this.getCompetence(arme.data.competence));
|
||||||
if (arme || (competence.type == 'competencecreature' && competence.data.iscombat)) {
|
if (arme || (competence.type == 'competencecreature' && competence.data.iscombat)) {
|
||||||
if (competence.data.ispossession) {
|
if (competence.data.ispossession) {
|
||||||
RdDPossession.managePossession(this, competence);
|
RdDPossession.onAttaquePossession(this, competence);
|
||||||
} else {
|
} else {
|
||||||
RdDCombat.createUsingTarget(this)?.attaque(competence, arme);
|
RdDCombat.createUsingTarget(this)?.attaque(competence, arme);
|
||||||
}
|
}
|
||||||
@ -3278,11 +3314,11 @@ export class RdDActor extends Actor {
|
|||||||
protection = Math.max(protection - penetration, 0);
|
protection = Math.max(protection - penetration, 0);
|
||||||
protection += this.getProtectionNaturelle();
|
protection += this.getProtectionNaturelle();
|
||||||
// Gestion des cas particuliers sur la fenêtre d'encaissement
|
// Gestion des cas particuliers sur la fenêtre d'encaissement
|
||||||
if (attackerRoll.dmg.encaisserSpecial && attackerRoll.dmg.encaisserSpecial == "noarmure") {
|
if (attackerRoll.dmg.encaisserSpecial == "noarmure") {
|
||||||
protection = 0;
|
protection = 0;
|
||||||
}
|
}
|
||||||
if (attackerRoll.dmg.encaisserSpecial && attackerRoll.dmg.encaisserSpecial == "chute" && Number(protection) > 2) {
|
if (attackerRoll.dmg.encaisserSpecial == "chute") {
|
||||||
protection = 2;
|
protection = Math.min(protection, 2);
|
||||||
}
|
}
|
||||||
console.log("Final protect", protection, attackerRoll);
|
console.log("Final protect", protection, attackerRoll);
|
||||||
return protection;
|
return protection;
|
||||||
@ -3290,20 +3326,25 @@ export class RdDActor extends Actor {
|
|||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
_deteriorerArmure(item, dmg) {
|
_deteriorerArmure(item, dmg) {
|
||||||
if (!ReglesOptionelles.isUsing('deteriorationArmure')) {
|
let itemData = duplicate(Misc.data(item));
|
||||||
|
if (!ReglesOptionelles.isUsing('deteriorationArmure') || itemData.data.protection == '0') {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
let itemData = duplicate(Misc.data(item));
|
|
||||||
itemData.data.deterioration = (itemData.data.deterioration ?? 0) + dmg;
|
itemData.data.deterioration = (itemData.data.deterioration ?? 0) + dmg;
|
||||||
if (itemData.data.deterioration >= 10) {
|
if (itemData.data.deterioration >= 10) {
|
||||||
itemData.data.deterioration = 0;
|
itemData.data.deterioration -= 10;
|
||||||
let res = /\d+/.exec(itemData.data.protection);
|
let res = /(\d+)?d(\d+)(\-\d+)?/.exec(itemData.data.protection);
|
||||||
if (!res) {
|
if (res) {
|
||||||
itemData.data.protection = "1d" + itemData.data.protection;
|
let malus = Misc.toInt(res[3]) - 1;
|
||||||
|
let armure = Misc.toInt(res[2]);
|
||||||
|
if (armure+malus <= 0){
|
||||||
|
itemData.data.protection = 0;
|
||||||
|
} else {
|
||||||
|
itemData.data.protection = '' + (res[1]??'1') + 'd' + armure + malus;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else if (res = /(\d+d\d+)(\-\d+)?/.exec(itemData.data.protection)) {
|
else if (/\d+/.exec(itemData.data.protection)) {
|
||||||
let malus = Misc.toInt(res[2]) - 1;
|
itemData.data.protection = "1d" + itemData.data.protection;
|
||||||
itemData.data.protection = res[1] + malus;
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
ui.notifications.warn(`La valeur d'armure de votre ${item.name} est incorrecte`);
|
ui.notifications.warn(`La valeur d'armure de votre ${item.name} est incorrecte`);
|
||||||
@ -3332,7 +3373,7 @@ export class RdDActor extends Actor {
|
|||||||
let encaissement = await this.jetEncaissement(rollData);
|
let encaissement = await this.jetEncaissement(rollData);
|
||||||
|
|
||||||
this.ajouterBlessure(encaissement); // Will upate the result table
|
this.ajouterBlessure(encaissement); // Will upate the result table
|
||||||
const perteVie = this.isEntiteCauchemar()
|
const perteVie = this.isEntite()
|
||||||
? { newValue: 0 }
|
? { newValue: 0 }
|
||||||
: await this.santeIncDec("vie", - encaissement.vie);
|
: await this.santeIncDec("vie", - encaissement.vie);
|
||||||
const perteEndurance = await this.santeIncDec("endurance", -encaissement.endurance, encaissement.critiques > 0);
|
const perteEndurance = await this.santeIncDec("endurance", -encaissement.endurance, encaissement.critiques > 0);
|
||||||
@ -3347,7 +3388,7 @@ export class RdDActor extends Actor {
|
|||||||
sonne: perteEndurance.sonne,
|
sonne: perteEndurance.sonne,
|
||||||
jetEndurance: perteEndurance.jetEndurance,
|
jetEndurance: perteEndurance.jetEndurance,
|
||||||
endurance: santeOrig.endurance.value - perteEndurance.newValue,
|
endurance: santeOrig.endurance.value - perteEndurance.newValue,
|
||||||
vie: this.isEntiteCauchemar() ? 0 : (santeOrig.vie.value - perteVie.newValue),
|
vie: this.isEntite() ? 0 : (santeOrig.vie.value - perteVie.newValue),
|
||||||
show: defenderRoll?.show ?? {}
|
show: defenderRoll?.show ?? {}
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -3537,8 +3578,8 @@ export class RdDActor extends Actor {
|
|||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
async accorder(entite, when = 'avant-encaissement') {
|
async accorder(entite, when = 'avant-encaissement') {
|
||||||
if (when != game.settings.get(SYSTEM_RDD, "accorder-entite-cauchemar")
|
if (when != game.settings.get(SYSTEM_RDD, "accorder-entite-cauchemar")
|
||||||
|| !entite.isEntiteCauchemar()
|
|| !entite.isEntite([ENTITE_INCARNE])
|
||||||
|| entite.isEntiteCauchemarAccordee(this)) {
|
|| entite.isEntiteAccordee(this)) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
const tplData = Misc.templateData(this);
|
const tplData = Misc.templateData(this);
|
||||||
@ -3562,29 +3603,32 @@ export class RdDActor extends Actor {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
isEntiteCauchemar() {
|
isEntite(typeentite = [] ) {
|
||||||
return this.data.type == 'entite';
|
return this.data.type == 'entite' && (typeentite.length == 0 || typeentite.includes(this.data.data.definition.typeentite));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
isEntiteCauchemarAccordee(attaquant) {
|
isEntiteAccordee(attaquant) {
|
||||||
if (!this.isEntiteCauchemar()) { return true; }
|
if (!this.isEntite([ENTITE_INCARNE])) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
let resonnance = Misc.templateData(this).sante.resonnance;
|
let resonnance = Misc.templateData(this).sante.resonnance;
|
||||||
return (resonnance.actors.find(it => it == attaquant._id));
|
console.log("RESONN", resonnance)
|
||||||
|
return (resonnance.actors.find(it => it == attaquant.id));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
async setEntiteReveAccordee(attaquant) {
|
async setEntiteReveAccordee(attaquant) {
|
||||||
if (!this.isEntiteCauchemar()) {
|
if (!this.isEntite([ENTITE_INCARNE])) {
|
||||||
ui.notifications.error("Impossible de s'accorder à " + this.name + ": ce n'est pas une entite de cauchemer/rêve");
|
ui.notifications.error("Impossible de s'accorder à " + this.name + ": ce n'est pas une entite de cauchemer/rêve");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
let resonnance = duplicate(Misc.templateData(this).sante.resonnance);
|
let resonnance = duplicate(Misc.templateData(this).sante.resonnance);
|
||||||
if (resonnance.actors.find(it => it == attaquant._id)) {
|
if (resonnance.actors.find(it => it == attaquant.id)) {
|
||||||
// déjà accordé
|
// déjà accordé
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
resonnance.actors.push(attaquant._id);
|
resonnance.actors.push(attaquant.id);
|
||||||
await this.update({ "data.sante.resonnance": resonnance });
|
await this.update({ "data.sante.resonnance": resonnance });
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -4138,7 +4182,7 @@ export class RdDActor extends Actor {
|
|||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
async setStatusEffect(label, status, updates = {}) {
|
async setStatusEffect(label, status, updates = {}) {
|
||||||
if (this.isEntiteCauchemar() || this.data.type == 'vehicule') {
|
if (this.isEntite() || this.data.type == 'vehicule') {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
console.log("setStatusEffect", label, status, updates)
|
console.log("setStatusEffect", label, status, updates)
|
||||||
|
@ -3,3 +3,7 @@ export const SYSTEM_SOCKET_ID = 'system.foundryvtt-reve-de-dragon';
|
|||||||
|
|
||||||
export const HIDE_DICE = 'hide';
|
export const HIDE_DICE = 'hide';
|
||||||
export const SHOW_DICE = 'show';
|
export const SHOW_DICE = 'show';
|
||||||
|
|
||||||
|
export const ENTITE_INCARNE = 'incarne';
|
||||||
|
export const ENTITE_NONINCARNE = 'nonincarne';
|
||||||
|
export const ENTITE_BLURETTE = 'blurette';
|
||||||
|
@ -55,7 +55,7 @@ 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 = buttonAcheter.attributes['data-prixLot']?.value ?? 0;
|
const prixLot = parseInt(buttonAcheter.attributes['data-prixLot']?.value ?? 0);
|
||||||
let venteData = {
|
let venteData = {
|
||||||
item: JSON.parse(jsondata),
|
item: JSON.parse(jsondata),
|
||||||
vendeurId: vendeurId,
|
vendeurId: vendeurId,
|
||||||
|
@ -30,7 +30,7 @@ export class RdDItemArme extends Item {
|
|||||||
switch (armeData ? armeData.type : '') {
|
switch (armeData ? armeData.type : '') {
|
||||||
case 'arme': return armeData;
|
case 'arme': return armeData;
|
||||||
case 'competencecreature':
|
case 'competencecreature':
|
||||||
return RdDItemCompetenceCreature.toArme(armeData);
|
return RdDItemCompetenceCreature.toActionArme(armeData);
|
||||||
}
|
}
|
||||||
return RdDItemArme.mainsNues();
|
return RdDItemArme.mainsNues();
|
||||||
}
|
}
|
||||||
@ -189,7 +189,7 @@ export class RdDItemArme extends Item {
|
|||||||
categorie_parade: 'sans-armes'
|
categorie_parade: 'sans-armes'
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
mergeObject(corpsACorps.data, actorData ??{}, { overwrite: false });
|
mergeObject(corpsACorps.data, actorData ?? {}, { overwrite: false });
|
||||||
return corpsACorps;
|
return corpsACorps;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -212,8 +212,11 @@ export class RdDItemCompetence extends Item {
|
|||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static findCompetence(list, idOrName, options = {}) {
|
static findCompetence(list, idOrName, options = {}) {
|
||||||
|
if (idOrName == undefined) {
|
||||||
|
return undefined;
|
||||||
|
}
|
||||||
options = mergeObject(options, {
|
options = mergeObject(options, {
|
||||||
filter: it => RdDItemCompetence.isCompetence(it),
|
preFilter: it => RdDItemCompetence.isCompetence(it),
|
||||||
description: 'compétence',
|
description: 'compétence',
|
||||||
});
|
});
|
||||||
return list.find(it => it.id == idOrName && RdDItemCompetence.isCompetence(it))
|
return list.find(it => it.id == idOrName && RdDItemCompetence.isCompetence(it))
|
||||||
|
@ -11,14 +11,14 @@ export class RdDItemCompetenceCreature extends Item {
|
|||||||
rollData.competence.data.categorie = "creature"
|
rollData.competence.data.categorie = "creature"
|
||||||
rollData.selectedCarac = rollData.carac.carac_creature
|
rollData.selectedCarac = rollData.carac.carac_creature
|
||||||
if (rollData.competence.data.iscombat) {
|
if (rollData.competence.data.iscombat) {
|
||||||
rollData.arme = RdDItemCompetenceCreature.toArme(rollData.competence);
|
rollData.arme = RdDItemCompetenceCreature.toActionArme(rollData.competence);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static toArme(item) {
|
static toActionArme(item) {
|
||||||
if (RdDItemCompetenceCreature.isCompetenceAttaque(item)) {
|
if (RdDItemCompetenceCreature.isCompetenceAttaque(item)) {
|
||||||
// si c'est un Item compétence: cloner pour ne pas modifier lma compétence
|
// si c'est un Item compétence: cloner pour ne pas modifier la compétence
|
||||||
let arme = Misc.data( (item instanceof Item) ? item.clone(): item);
|
let arme = Misc.data( (item instanceof Item) ? item.clone(): item);
|
||||||
mergeObject(arme.data,
|
mergeObject(arme.data,
|
||||||
{
|
{
|
||||||
@ -28,11 +28,12 @@ export class RdDItemCompetenceCreature extends Item {
|
|||||||
dommagesReels: arme.data.dommages,
|
dommagesReels: arme.data.dommages,
|
||||||
penetration: 0,
|
penetration: 0,
|
||||||
force: 0,
|
force: 0,
|
||||||
rapide: true
|
rapide: true,
|
||||||
|
action: 'attaque'
|
||||||
});
|
});
|
||||||
return arme;
|
return arme;
|
||||||
}
|
}
|
||||||
console.error("RdDItemCompetenceCreature.toArme(", item, ") : impossible de transformer l'Item en arme");
|
console.error("RdDItemCompetenceCreature.toActionArme(", item, ") : impossible de transformer l'Item en arme");
|
||||||
return undefined;
|
return undefined;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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.data.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;
|
||||||
|
@ -13,25 +13,24 @@ const tableSignesIndicatifs = [
|
|||||||
|
|
||||||
]
|
]
|
||||||
|
|
||||||
|
const DIFFICULTE_LECTURE_SIGNE_MANQUE = +11;
|
||||||
|
|
||||||
export class RdDItemSigneDraconique {
|
export class RdDItemSigneDraconique {
|
||||||
|
|
||||||
static prepareSigneDraconiqueMeditation(meditation, rolled) {
|
static prepareSigneDraconiqueMeditation(meditation, rolled) {
|
||||||
if (rolled.isSuccess != undefined) {
|
meditation = Misc.data(meditation);
|
||||||
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: {
|
||||||
data: {
|
typesTMR: [TMRUtility.typeTmrName(meditation.data.tmr)],
|
||||||
typesTMR: [TMRUtility.typeTmrName(meditation.data.tmr)],
|
difficulte: rolled.isSuccess ? RdDItemSigneDraconique.getDiffSigneMeditation(rolled.code) : DIFFICULTE_LECTURE_SIGNE_MANQUE,
|
||||||
difficulte: RdDItemSigneDraconique.getDiffSigneMeditation(rolled.code),
|
ephemere: true,
|
||||||
ephemere: true,
|
duree: "1 round",
|
||||||
duree: "1 round",
|
valeur: rolled.isSuccess ? { "norm": 3, "sign": 5, "part": 10 } : { "norm": 0, "sign": 0, "part": 0 }
|
||||||
valeur: { "norm": 3, "sign": 5, "part": 10 }
|
}
|
||||||
}
|
};
|
||||||
};
|
|
||||||
}
|
|
||||||
return undefined;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static getDiffSigneMeditation(code) {
|
static getDiffSigneMeditation(code) {
|
||||||
@ -44,7 +43,7 @@ export class RdDItemSigneDraconique {
|
|||||||
}
|
}
|
||||||
|
|
||||||
static getXpSortSigneDraconique(code, signe) {
|
static getXpSortSigneDraconique(code, signe) {
|
||||||
return Misc.data(signe).data.valeur[code] ?? 0;
|
return Misc.toInt(Misc.data(signe).data.valeur[code] ?? 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
static calculValeursXpSort(qualite, valeur, avant) {
|
static calculValeursXpSort(qualite, valeur, avant) {
|
||||||
|
@ -192,7 +192,7 @@ export class Misc {
|
|||||||
if (!single) {
|
if (!single) {
|
||||||
single = subset[0];
|
single = subset[0];
|
||||||
const choices = Misc.join(subset.map(it => options.mapper(it)), '<br>');
|
const choices = Misc.join(subset.map(it => options.mapper(it)), '<br>');
|
||||||
options.info(`Plusieurs choix de ${options.description}s possibles:<br>${choices}<br>Le premier sera choisi: ${mapToValue(single)}`);
|
options.onMessage(`Plusieurs choix de ${options.description}s possibles:<br>${choices}<br>Le premier sera choisi: ${options.mapper(single)}`);
|
||||||
}
|
}
|
||||||
return single;
|
return single;
|
||||||
}
|
}
|
||||||
@ -211,7 +211,7 @@ export class Misc {
|
|||||||
}
|
}
|
||||||
value = Grammar.toLowerCaseNoAccent(value);
|
value = Grammar.toLowerCaseNoAccent(value);
|
||||||
const subset = elements.filter(options.preFilter)
|
const subset = elements.filter(options.preFilter)
|
||||||
.filter(it => Grammar.toLowerCaseNoAccent(options.mapper(it)).includes(value));
|
.filter(it => Grammar.toLowerCaseNoAccent(options.mapper(it))?.includes(value));
|
||||||
if (subset.length == 0) {
|
if (subset.length == 0) {
|
||||||
options.onMessage(`Pas de ${options.description} correspondant à ${value}`);
|
options.onMessage(`Pas de ${options.description} correspondant à ${value}`);
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
import { ChatUtility } from "./chat-utility.js";
|
import { ChatUtility } from "./chat-utility.js";
|
||||||
import { HIDE_DICE, SYSTEM_RDD, SYSTEM_SOCKET_ID } from "./constants.js";
|
import { ENTITE_INCARNE, ENTITE_NONINCARNE, HIDE_DICE, SYSTEM_RDD, SYSTEM_SOCKET_ID } from "./constants.js";
|
||||||
|
import { Grammar } from "./grammar.js";
|
||||||
import { RdDItemArme } from "./item-arme.js";
|
import { RdDItemArme } from "./item-arme.js";
|
||||||
import { RdDItemCompetence } from "./item-competence.js";
|
import { RdDItemCompetence } from "./item-competence.js";
|
||||||
import { RdDItemCompetenceCreature } from "./item-competencecreature.js";
|
import { RdDItemCompetenceCreature } from "./item-competencecreature.js";
|
||||||
@ -26,7 +27,7 @@ const premierRoundInit = [
|
|||||||
{ pattern: 'epeegnome', init: 5.35 },
|
{ pattern: 'epeegnome', init: 5.35 },
|
||||||
{ pattern: 'masse', init: 5.30 },
|
{ pattern: 'masse', init: 5.30 },
|
||||||
{ pattern: 'gourdin', init: 5.25 },
|
{ pattern: 'gourdin', init: 5.25 },
|
||||||
{ pattern: 'fléau', init: 5.20 },
|
{ pattern: 'fleau', init: 5.20 },
|
||||||
{ pattern: 'dague', init: 5.15 },
|
{ pattern: 'dague', init: 5.15 },
|
||||||
{ pattern: 'autre', init: 5.10 },
|
{ pattern: 'autre', init: 5.10 },
|
||||||
];
|
];
|
||||||
@ -84,34 +85,29 @@ export class RdDCombatManager extends Combat {
|
|||||||
// calculate initiative
|
// calculate initiative
|
||||||
for (let cId = 0; cId < ids.length; cId++) {
|
for (let cId = 0; cId < ids.length; cId++) {
|
||||||
const combatant = this.combatants.get(ids[cId]);
|
const combatant = this.combatants.get(ids[cId]);
|
||||||
//if (!c) return results;
|
let rollFormula = formula ?? RdDCombatManager.formuleInitiative(2, 10, 0, 0);
|
||||||
|
if (!formula) {
|
||||||
let rollFormula = formula; // Init per default
|
|
||||||
if (!rollFormula) {
|
|
||||||
let armeCombat, competence;
|
|
||||||
if (combatant.actor.data.type == 'creature' || combatant.actor.data.type == 'entite') {
|
if (combatant.actor.data.type == 'creature' || combatant.actor.data.type == 'entite') {
|
||||||
for (const competenceItemData of combatant.actor.data.items) {
|
const competence = combatant.actor.data.items.find(it => it.data.data.iscombat)
|
||||||
if (competenceItemData.data.data.iscombat) {
|
if (competence) {
|
||||||
competence = duplicate(competenceItemData);
|
rollFormula = RdDCombatManager.formuleInitiative(2, competence.data.carac_value, competence.data.niveau, 0);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
rollFormula = "2+( (" + RdDCombatManager.calculInitiative(competence.data.niveau, competence.data.carac_value) + ")/100)";
|
|
||||||
} else {
|
} else {
|
||||||
for (const itemData of combatant.actor.data.items) {
|
const armeCombat = combatant.actor.data.items.find(it => it.type == 'arme' && itemData.data.equipe)
|
||||||
if (itemData.type == "arme" && itemData.data.equipe) {
|
const compName = (armeCombat == undefined) ? "Corps à corps" : armeCombat.data.competence;
|
||||||
armeCombat = duplicate(itemData);
|
const competence = RdDItemCompetence.findCompetence(combatant.actor.data.items, compName);
|
||||||
}
|
if (competence) {
|
||||||
|
const carac = combatant.actor.data.data.carac[competence.data.defaut_carac].value;
|
||||||
|
const niveau = competence.data.niveau;
|
||||||
|
const bonusEcaille = (armeCombat?.data.magique) ? armeCombat.data.ecaille_efficacite : 0;
|
||||||
|
rollFormula = RdDCombatManager.formuleInitiative(2, carac, niveau, bonusEcaille);
|
||||||
}
|
}
|
||||||
let compName = (armeCombat == undefined) ? "Corps à corps" : armeCombat.data.competence;
|
|
||||||
competence = RdDItemCompetence.findCompetence(combatant.actor.data.items, compName);
|
|
||||||
let bonusEcaille = (armeCombat && armeCombat.data.magique) ? armeCombat.data.ecaille_efficacite : 0;
|
|
||||||
rollFormula = "2+( (" + RdDCombatManager.calculInitiative(competence.data.niveau, Misc.data(combatant.actor).data.carac[competence.data.defaut_carac].value, bonusEcaille) + ")/100)";
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
//console.log("Combatat", c);
|
//console.log("Combatat", c);
|
||||||
const roll = combatant.getInitiativeRoll(rollFormula);
|
const roll = combatant.getInitiativeRoll(rollFormula);
|
||||||
if ( !roll.total) {
|
if (!roll.total) {
|
||||||
roll.evaluate( {async: false});
|
roll.evaluate({ async: false });
|
||||||
}
|
}
|
||||||
if (roll.total <= 0) roll.total = 0.00;
|
if (roll.total <= 0) roll.total = 0.00;
|
||||||
console.log("Compute init for", rollFormula, roll.total, combatant);
|
console.log("Compute init for", rollFormula, roll.total, combatant);
|
||||||
@ -142,6 +138,10 @@ export class RdDCombatManager extends Combat {
|
|||||||
return this;
|
return this;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static formuleInitiative(rang, carac, niveau, bonusMalus) {
|
||||||
|
return `${rang} +( (${RdDCombatManager.calculInitiative(niveau, carac, bonusMalus)} )/100)`;
|
||||||
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static calculInitiative(niveau, caracValue, bonusEcaille = 0) {
|
static calculInitiative(niveau, caracValue, bonusEcaille = 0) {
|
||||||
let base = niveau + Math.floor(caracValue / 2);
|
let base = niveau + Math.floor(caracValue / 2);
|
||||||
@ -150,63 +150,76 @@ export class RdDCombatManager extends Combat {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
/** Retourne une liste triée d'armes avec le split arme1 main / arme 2 main */
|
/** Retourne une liste triée d'actions d'armes avec le split arme1 main / arme 2 main */
|
||||||
static finalizeArmeList(armes, competences, carac) {
|
static listActionsArmes(armes, competences, carac) {
|
||||||
// Gestion des armes 1/2 mains
|
// Gestion des armes 1/2 mains
|
||||||
let armesEquipe = [];
|
let actionsArme = [];
|
||||||
for (const arme of armes) {
|
for (const arme of armes) {
|
||||||
let armeData = duplicate(Misc.data(arme));
|
let action = duplicate(Misc.data(arme));
|
||||||
if (armeData.data.equipe) {
|
if (action.data.equipe) {
|
||||||
let compData = competences.map(c => Misc.data(c)).find(c => c.name == armeData.data.competence);
|
let compData = competences.map(c => Misc.data(c)).find(c => c.name == action.data.competence);
|
||||||
|
|
||||||
armesEquipe.push(armeData);
|
actionsArme.push(action);
|
||||||
armeData.data.dommagesReels = Number(armeData.data.dommages);
|
action.action = 'attaque';
|
||||||
armeData.data.niveau = compData.data.niveau;
|
action.data.dommagesReels = Number(action.data.dommages);
|
||||||
armeData.data.initiative = RdDCombatManager.calculInitiative(compData.data.niveau, carac[compData.data.defaut_carac].value);
|
action.data.niveau = compData.data.niveau;
|
||||||
|
action.data.initiative = RdDCombatManager.calculInitiative(compData.data.niveau, carac[compData.data.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 (armeData.data.unemain && !armeData.data.deuxmains) {
|
if (action.data.unemain && !action.data.deuxmains) {
|
||||||
armeData.data.mainInfo = "(1m)";
|
action.data.mainInfo = "(1m)";
|
||||||
} else if (!armeData.data.unemain && armeData.data.deuxmains) {
|
} else if (!action.data.unemain && action.data.deuxmains) {
|
||||||
armeData.data.mainInfo = "(2m)";
|
action.data.mainInfo = "(2m)";
|
||||||
} else if (armeData.data.unemain && armeData.data.deuxmains) {
|
} else if (action.data.unemain && action.data.deuxmains) {
|
||||||
armeData.data.mainInfo = "(1m)";
|
action.data.mainInfo = "(1m)";
|
||||||
|
|
||||||
const comp2m = armeData.data.competence.replace(" 1 main", " 2 mains"); // Replace !
|
const comp2m = action.data.competence.replace(" 1 main", " 2 mains"); // Replace !
|
||||||
const comp = Misc.data(competences.find(c => c.name == comp2m));
|
const comp = Misc.data(competences.find(c => c.name == comp2m));
|
||||||
|
|
||||||
const arme2main = duplicate(armeData);
|
const arme2main = duplicate(action);
|
||||||
arme2main.data.mainInfo = "(2m)";
|
arme2main.data.mainInfo = "(2m)";
|
||||||
arme2main.data.niveau = comp.data.niveau;
|
arme2main.data.niveau = comp.data.niveau;
|
||||||
arme2main.data.competence = comp2m;
|
arme2main.data.competence = comp2m;
|
||||||
arme2main.data.initiative = RdDCombatManager.calculInitiative(arme2main.data.niveau, carac[comp.data.defaut_carac].value);
|
arme2main.data.initiative = RdDCombatManager.calculInitiative(arme2main.data.niveau, carac[comp.data.defaut_carac].value);
|
||||||
armesEquipe.push(arme2main);
|
actionsArme.push(arme2main);
|
||||||
const containsSlash = armeData.data.dommages.includes("/");
|
const containsSlash = action.data.dommages.includes("/");
|
||||||
if (containsSlash) {
|
if (containsSlash) {
|
||||||
const tableauDegats = armeData.data.dommages.split("/");
|
const tableauDegats = action.data.dommages.split("/");
|
||||||
armeData.data.dommagesReels = Number(tableauDegats[0]);
|
action.data.dommagesReels = Number(tableauDegats[0]);
|
||||||
arme2main.data.dommagesReels = Number(tableauDegats[1]);
|
arme2main.data.dommagesReels = Number(tableauDegats[1]);
|
||||||
}
|
}
|
||||||
else{
|
else {
|
||||||
ui.notifications.info("Les dommages de l'arme à 1/2 mains " + armeData.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)");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return armesEquipe.sort(Misc.ascending(armeData => armeData.name + (armeData.data.mainInfo ?? '')));
|
return actionsArme.sort(Misc.ascending(armeData => armeData.name + (armeData.data.mainInfo ?? '')));
|
||||||
|
}
|
||||||
|
|
||||||
|
static listActionsPossessions(actor) {
|
||||||
|
return RdDCombatManager._indexActions(actor.getPossessions().map(p => {
|
||||||
|
return {
|
||||||
|
name: p.name,
|
||||||
|
action: 'conjurer',
|
||||||
|
data: {
|
||||||
|
competence: p.name,
|
||||||
|
possessionid: p.data.data.possessionid,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static buildListeActionsCombat(combatant) {
|
static listActionsCombat(combatant) {
|
||||||
if (combatant.actor == undefined) {
|
const actor = combatant.actor;
|
||||||
ui.notifications.warn(`Le combatant ${combatant.name} n'est pas associé à un acteur, impossible de déterminer ses actions de combat!`)
|
let actions = RdDCombatManager.listActionsPossessions(actor);
|
||||||
return [];
|
if (actions.length > 0) {
|
||||||
|
return actions;
|
||||||
}
|
}
|
||||||
const actorData = Misc.data(combatant.actor);
|
let items = actor.data.items;
|
||||||
let items = combatant.actor.data.items;
|
if (actor.isCreature()) {
|
||||||
let actions = []
|
|
||||||
if (combatant.actor.isCreature()) {
|
|
||||||
actions = actions.concat(items.filter(it => RdDItemCompetenceCreature.isCompetenceAttaque(it))
|
actions = actions.concat(items.filter(it => RdDItemCompetenceCreature.isCompetenceAttaque(it))
|
||||||
.map(competence => RdDItemCompetenceCreature.toArme(competence)));
|
.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))
|
let armes = items.filter(it => RdDItemArme.isArmeUtilisable(it))
|
||||||
@ -214,14 +227,17 @@ export class RdDCombatManager extends Combat {
|
|||||||
.concat(RdDItemArme.mainsNues());
|
.concat(RdDItemArme.mainsNues());
|
||||||
|
|
||||||
let competences = items.filter(it => it.type == 'competence');
|
let competences = items.filter(it => it.type == 'competence');
|
||||||
actions = actions.concat(RdDCombatManager.finalizeArmeList(armes, competences, actorData.data.carac));
|
actions = actions.concat(RdDCombatManager.listActionsArmes(armes, competences, actor.data.data.carac));
|
||||||
|
|
||||||
if (actorData.data.attributs.hautrevant.value) {
|
if (actor.data.data.attributs.hautrevant.value) {
|
||||||
actions.push({ name: "Draconic", data: { initOnly: true, competence: "Draconic" } });
|
actions.push({ name: "Draconic", action: 'haut-reve', data: { initOnly: true, competence: "Draconic" } });
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
actions.push({ name: "Autre action", data: { initOnly: true, competence: "Autre action" } });
|
return RdDCombatManager._indexActions(actions);
|
||||||
|
}
|
||||||
|
|
||||||
|
static _indexActions(actions) {
|
||||||
for (let index = 0; index < actions.length; index++) {
|
for (let index = 0; index < actions.length; index++) {
|
||||||
actions[index].index = index;
|
actions[index].index = index;
|
||||||
}
|
}
|
||||||
@ -235,15 +251,15 @@ export class RdDCombatManager extends Combat {
|
|||||||
let initMissing = game.combat.data.combatants.find(it => !it.initiative);
|
let initMissing = game.combat.data.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.data.combatants) {
|
||||||
let arme = 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 (arme && arme.type == "arme") {
|
if (action && action.type == "arme") {
|
||||||
for (let initData of premierRoundInit) {
|
for (let initData of premierRoundInit) {
|
||||||
if (arme.data.initpremierround.toLowerCase().includes(initData.pattern)) {
|
if (Grammar.toLowerCaseNoAccentNoSpace(action.data.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>
|
||||||
Etant donné son ${arme.name}, son initative pour ce premier round est désormais de ${initData.init}.
|
Etant donné son ${action.name}, son initative pour ce premier round est désormais de ${initData.init}.
|
||||||
</div>`
|
</div>`
|
||||||
ChatMessage.create({ content: msg });
|
ChatMessage.create({ content: msg });
|
||||||
game.combat.setInitiative(combatant._id, initData.init);
|
game.combat.setInitiative(combatant._id, initData.init);
|
||||||
@ -281,7 +297,7 @@ export class RdDCombatManager extends Combat {
|
|||||||
].concat(options);
|
].concat(options);
|
||||||
}
|
}
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static rollInitiativeCompetence(combatantId, arme) {
|
static rollInitiativeAction(combatantId, action) {
|
||||||
const combatant = game.combat.combatants.get(combatantId);
|
const combatant = game.combat.combatants.get(combatantId);
|
||||||
if (combatant.actor == undefined) {
|
if (combatant.actor == undefined) {
|
||||||
ui.notifications.warn(`Le combatant ${combatant.name} n'est pas associé à un acteur, impossible de déterminer ses actions de combat!`)
|
ui.notifications.warn(`Le combatant ${combatant.name} n'est pas associé à un acteur, impossible de déterminer ses actions de combat!`)
|
||||||
@ -299,16 +315,21 @@ export class RdDCombatManager extends Combat {
|
|||||||
} else if (combatant.actor.getSurprise() == "demi") {
|
} else if (combatant.actor.getSurprise() == "demi") {
|
||||||
initOffset = 0;
|
initOffset = 0;
|
||||||
initInfo = "Demi Surprise"
|
initInfo = "Demi Surprise"
|
||||||
} else if (arme.name == "Autre action") {
|
} else if (action.action == 'conjurer') {
|
||||||
|
initOffset = 10;
|
||||||
|
caracForInit = combatant.actor.getReveActuel();
|
||||||
|
initInfo = "Possession"
|
||||||
|
} else if (action.action == 'autre') {
|
||||||
initOffset = 2;
|
initOffset = 2;
|
||||||
initInfo = "Autre Action"
|
initInfo = "Autre Action"
|
||||||
} else if (arme.name == "Draconic") {
|
} else if (action.action == 'haut-reve') {
|
||||||
initOffset = 9;
|
initOffset = 9;
|
||||||
initInfo = "Draconic"
|
initInfo = "Draconic"
|
||||||
} else {
|
} else {
|
||||||
compData = Misc.data(RdDItemCompetence.findCompetence(combatant.actor.data.items, arme.data.competence));
|
compData = Misc.data(RdDItemCompetence.findCompetence(combatant.actor.data.items, action.data.competence));
|
||||||
compNiveau = compData.data.niveau;
|
compNiveau = compData.data.niveau;
|
||||||
initInfo = arme.name + " / " + arme.data.competence;
|
initInfo = action.name + " / " + action.data.competence;
|
||||||
|
|
||||||
if (combatant.actor.data.type == 'creature' || combatant.actor.data.type == 'entite') {
|
if (combatant.actor.data.type == 'creature' || combatant.actor.data.type == 'entite') {
|
||||||
caracForInit = compData.data.carac_value;
|
caracForInit = compData.data.carac_value;
|
||||||
if (compData.data.categorie == "lancer") {
|
if (compData.data.categorie == "lancer") {
|
||||||
@ -319,14 +340,15 @@ export class RdDCombatManager extends Combat {
|
|||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
caracForInit = Misc.data(combatant.actor).data.carac[compData.data.defaut_carac].value;
|
caracForInit = Misc.data(combatant.actor).data.carac[compData.data.defaut_carac].value;
|
||||||
initOffset = RdDCombatManager._baseInitOffset(compData.data.categorie, arme);
|
initOffset = RdDCombatManager._baseInitOffset(compData.data.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
|
||||||
// Cas des créatures et entités vs personnages
|
// Cas des créatures et entités vs personnages
|
||||||
let rollFormula = initOffset + "+ ( (" + RdDCombatManager.calculInitiative(compNiveau, caracForInit) + " + " + malus + ") /100)";
|
let rollFormula = RdDCombatManager.formuleInitiative(initOffset, caracForInit, compNiveau, malus);
|
||||||
// Garder la trace de l'arme/compétence utilisée pour l'iniative
|
// Garder la trace de l'arme/compétence utilisée pour l'iniative
|
||||||
combatant.initiativeData = { arme: arme } // pour reclasser l'init au round 0
|
combatant.initiativeData = { arme: action } // pour reclasser l'init au round 0
|
||||||
game.combat.rollInitiative(combatantId, rollFormula, { initInfo: initInfo });
|
game.combat.rollInitiative(combatantId, rollFormula, { initInfo: initInfo });
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -349,16 +371,21 @@ export class RdDCombatManager extends Combat {
|
|||||||
static displayInitiativeMenu(html, combatantId) {
|
static displayInitiativeMenu(html, combatantId) {
|
||||||
console.log("Combatant ; ", combatantId);
|
console.log("Combatant ; ", combatantId);
|
||||||
const combatant = game.combat.combatants.get(combatantId);
|
const combatant = game.combat.combatants.get(combatantId);
|
||||||
let armesList = RdDCombatManager.buildListeActionsCombat(combatant);
|
if (!(combatant?.actor)) {
|
||||||
|
ui.notifications.warn(`Le combatant ${combatant.name ?? combatantId} n'est pas associé à un acteur, impossible de déterminer ses actions de combat!`)
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
let actions = RdDCombatManager.listActionsCombat(combatant);
|
||||||
|
|
||||||
// Build the relevant submenu
|
// Build the relevant submenu
|
||||||
if (armesList) {
|
if (actions) {
|
||||||
let menuItems = [];
|
let menuItems = [];
|
||||||
for (let arme of armesList) {
|
for (let action of actions) {
|
||||||
menuItems.push({
|
menuItems.push({
|
||||||
name: arme.data.competence,
|
name: action.data.competence,
|
||||||
icon: "<i class='fas fa-dice-d6'></i>",
|
icon: "<i class='fas fa-dice-d6'></i>",
|
||||||
callback: target => { RdDCombatManager.rollInitiativeCompetence(combatantId, arme) }
|
callback: target => { RdDCombatManager.rollInitiativeAction(combatantId, action) }
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
new ContextMenu(html, ".directory-list", menuItems).render();
|
new ContextMenu(html, ".directory-list", menuItems).render();
|
||||||
@ -429,7 +456,7 @@ export class RdDCombat {
|
|||||||
else {
|
else {
|
||||||
const defender = target?.actor;
|
const defender = target?.actor;
|
||||||
const defenderTokenId = target?.data._id;
|
const defenderTokenId = target?.data._id;
|
||||||
if ( defender.type == 'entite' && defender.data.data.definition.typeentite == 'nonincarne') {
|
if (defender.type == 'entite' && defender.data.data.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)
|
||||||
@ -465,15 +492,15 @@ export class RdDCombat {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static onMsgEncaisser(data) {
|
static onMsgEncaisser(msg) {
|
||||||
let defender = canvas.tokens.get(data.defenderTokenId).actor;
|
let defender = canvas.tokens.get(msg.defenderTokenId).actor;
|
||||||
if (Misc.isOwnerPlayerOrUniqueConnectedGM()) {
|
if (Misc.isOwnerPlayerOrUniqueConnectedGM()) {
|
||||||
let attackerRoll = data.attackerRoll;
|
let attackerRoll = msg.attackerRoll;
|
||||||
let attacker = data.attackerId ? game.actors.get(data.attackerId) : null;
|
let attacker = msg.attackerId ? game.actors.get(msg.attackerId) : null;
|
||||||
|
|
||||||
defender.encaisserDommages(attackerRoll, attacker);
|
defender.encaisserDommages(attackerRoll, attacker);
|
||||||
RdDCombat._deleteDefense(attackerRoll.passeArme);
|
const rddCombat = RdDCombat.createForAttackerAndDefender(msg.attackerId, msg.defenderTokenId);
|
||||||
RdDCombat._deleteAttaque(data.attackerId);
|
rddCombat?.removeChatMessageActionsPasseArme(attackerRoll.passeArme);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -482,11 +509,8 @@ export class RdDCombat {
|
|||||||
let defenderToken = canvas.tokens.get(msg.defenderTokenId);
|
let defenderToken = canvas.tokens.get(msg.defenderTokenId);
|
||||||
if (defenderToken && Misc.isUniqueConnectedGM()) {
|
if (defenderToken && Misc.isUniqueConnectedGM()) {
|
||||||
const rddCombat = RdDCombat.createForAttackerAndDefender(msg.attackerId, msg.defenderTokenId);
|
const rddCombat = RdDCombat.createForAttackerAndDefender(msg.attackerId, msg.defenderTokenId);
|
||||||
if (rddCombat) {
|
rddCombat?.removeChatMessageActionsPasseArme(msg.defenderRoll.passeArme);
|
||||||
const defenderRoll = msg.defenderRoll;
|
rddCombat?._chatMessageDefense(msg.paramChatDefense, msg.defenderRoll);
|
||||||
rddCombat.removeChatMessageActionsPasseArme(defenderRoll.passeArme);
|
|
||||||
rddCombat._chatMessageDefense(msg.paramChatDefense, msg.defenderRoll);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -542,7 +566,7 @@ export class RdDCombat {
|
|||||||
async onEvent(button, event) {
|
async onEvent(button, event) {
|
||||||
const chatMessage = ChatUtility.getChatMessage(event);
|
const chatMessage = ChatUtility.getChatMessage(event);
|
||||||
const defenderRoll = ChatUtility.getMessageData(chatMessage, 'defender-roll');
|
const defenderRoll = ChatUtility.getMessageData(chatMessage, 'defender-roll');
|
||||||
const attackerRoll = defenderRoll?.attackerRoll ?? ChatUtility.getMessageData(chatMessage, 'attacker-roll') ;
|
const attackerRoll = defenderRoll?.attackerRoll ?? ChatUtility.getMessageData(chatMessage, 'attacker-roll');
|
||||||
console.log('RdDCombat', attackerRoll, defenderRoll);
|
console.log('RdDCombat', attackerRoll, defenderRoll);
|
||||||
const defenderTokenId = event.currentTarget.attributes['data-defenderTokenId']?.value;
|
const defenderTokenId = event.currentTarget.attributes['data-defenderTokenId']?.value;
|
||||||
|
|
||||||
@ -774,7 +798,7 @@ export class RdDCombat {
|
|||||||
async _onAttaqueNormale(attackerRoll) {
|
async _onAttaqueNormale(attackerRoll) {
|
||||||
console.log("RdDCombat.onAttaqueNormale >>>", attackerRoll);
|
console.log("RdDCombat.onAttaqueNormale >>>", attackerRoll);
|
||||||
|
|
||||||
attackerRoll.dmg = RdDBonus.dmg(attackerRoll, this.attacker.getBonusDegat(), this.defender.isEntiteCauchemar());
|
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.data.name : 'la cible',
|
||||||
@ -792,7 +816,7 @@ export class RdDCombat {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
isPossession( attackerRoll) {
|
isPossession(attackerRoll) {
|
||||||
return attackerRoll.selectedCarac.label.toLowerCase() == 'possession';
|
return attackerRoll.selectedCarac.label.toLowerCase() == 'possession';
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -937,9 +961,8 @@ export class RdDCombat {
|
|||||||
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 = Misc.templateData(arme)?.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) ;
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1005,8 +1028,7 @@ export class RdDCombat {
|
|||||||
await this.computeRecul(defenderRoll);
|
await this.computeRecul(defenderRoll);
|
||||||
await this.computeDeteriorationArme(defenderRoll);
|
await this.computeDeteriorationArme(defenderRoll);
|
||||||
await RdDResolutionTable.displayRollData(defenderRoll, this.defender, 'chat-resultat-parade.html');
|
await RdDResolutionTable.displayRollData(defenderRoll, this.defender, 'chat-resultat-parade.html');
|
||||||
|
this.removeChatMessageActionsPasseArme(defenderRoll.passeArme);
|
||||||
RdDCombat._deleteDefense(defenderRoll.passeArme);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
@ -1077,7 +1099,7 @@ export class RdDCombat {
|
|||||||
async _onEsquiveNormale(defenderRoll) {
|
async _onEsquiveNormale(defenderRoll) {
|
||||||
console.log("RdDCombat._onEsquiveNormal >>>", defenderRoll);
|
console.log("RdDCombat._onEsquiveNormal >>>", defenderRoll);
|
||||||
await RdDResolutionTable.displayRollData(defenderRoll, this.defender, 'chat-resultat-esquive.html');
|
await RdDResolutionTable.displayRollData(defenderRoll, this.defender, 'chat-resultat-esquive.html');
|
||||||
RdDCombat._deleteDefense(defenderRoll.passeArme);
|
this.removeChatMessageActionsPasseArme(defenderRoll.passeArme);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
@ -1217,17 +1239,18 @@ export class RdDCombat {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
RdDCombat._deleteDefense(attackerRoll.passeArme);
|
|
||||||
this.removeChatMessageActionsPasseArme(attackerRoll.passeArme);
|
this.removeChatMessageActionsPasseArme(attackerRoll.passeArme);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
/* retourne true si on peut continuer, false si on ne peut pas continuer */
|
/* retourne true si on peut continuer, false si on ne peut pas continuer */
|
||||||
async accorderEntite(when = 'avant-encaissement') {
|
async accorderEntite(when = 'avant-encaissement') {
|
||||||
|
console.log("TETETET", game.settings.get(SYSTEM_RDD, "accorder-entite-cauchemar"), this.defender.isEntite([ENTITE_INCARNE]), this.defender.isEntiteAccordee(this.attacker))
|
||||||
|
|
||||||
if (when != game.settings.get(SYSTEM_RDD, "accorder-entite-cauchemar")
|
if (when != game.settings.get(SYSTEM_RDD, "accorder-entite-cauchemar")
|
||||||
|| this.defender == undefined
|
|| this.defender == undefined
|
||||||
|| !this.defender.isEntiteCauchemar()
|
|| !this.defender.isEntite([ENTITE_INCARNE])
|
||||||
|| this.defender.isEntiteCauchemarAccordee(this.attacker)) {
|
|| this.defender.isEntiteAccordee(this.attacker)) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -7,6 +7,7 @@ import { RdDItemCompetence } from "./item-competence.js";
|
|||||||
import { Misc } from "./misc.js";
|
import { Misc } from "./misc.js";
|
||||||
import { RdDCarac } from "./rdd-carac.js";
|
import { RdDCarac } from "./rdd-carac.js";
|
||||||
import { RdDDice } from "./rdd-dice.js";
|
import { RdDDice } from "./rdd-dice.js";
|
||||||
|
import { RdDMeteo } from "./rdd-meteo.js";
|
||||||
import { RdDNameGen } from "./rdd-namegen.js";
|
import { RdDNameGen } from "./rdd-namegen.js";
|
||||||
import { RdDResolutionTable } from "./rdd-resolution-table.js";
|
import { RdDResolutionTable } from "./rdd-resolution-table.js";
|
||||||
import { RdDRollResolutionTable } from "./rdd-roll-resolution-table.js";
|
import { RdDRollResolutionTable } from "./rdd-roll-resolution-table.js";
|
||||||
@ -34,6 +35,7 @@ export class RdDCommands {
|
|||||||
rddCommands.registerCommand({ path: ["/table", "souffle"], func: (content, msg, params) => RdDRollTables.getSouffle(true), descr: " Tire un Souffle de Dragon" });
|
rddCommands.registerCommand({ path: ["/table", "souffle"], func: (content, msg, params) => RdDRollTables.getSouffle(true), descr: " Tire un Souffle de Dragon" });
|
||||||
rddCommands.registerCommand({ path: ["/table", "comp"], func: (content, msg, params) => RdDRollTables.getCompetence(true), descr: "Tire une compétence au hasard" });
|
rddCommands.registerCommand({ path: ["/table", "comp"], func: (content, msg, params) => RdDRollTables.getCompetence(true), descr: "Tire une compétence au hasard" });
|
||||||
rddCommands.registerCommand({ path: ["/table", "tarot"], func: (content, msg, params) => RdDRollTables.getTarot(true), descr: "Tire une carte du Tarot Draconique" });
|
rddCommands.registerCommand({ path: ["/table", "tarot"], func: (content, msg, params) => RdDRollTables.getTarot(true), descr: "Tire une carte du Tarot Draconique" });
|
||||||
|
rddCommands.registerCommand({ path: ["/meteo"], func: (content, msg, params) => rddCommands.getMeteo(msg, params), descr: "Propose une météo marine" });
|
||||||
rddCommands.registerCommand({ path: ["/nom"], func: (content, msg, params) => RdDNameGen.getName(msg, params), descr: "Génère un nom aléatoire" });
|
rddCommands.registerCommand({ path: ["/nom"], func: (content, msg, params) => RdDNameGen.getName(msg, params), descr: "Génère un nom aléatoire" });
|
||||||
|
|
||||||
rddCommands.registerCommand({
|
rddCommands.registerCommand({
|
||||||
@ -274,9 +276,11 @@ export class RdDCommands {
|
|||||||
diff = 0;
|
diff = 0;
|
||||||
}
|
}
|
||||||
const caracName = params[0];
|
const caracName = params[0];
|
||||||
const compName = length > 1 ? Misc.join(params.slice(1, length), ' ') : undefined;
|
let competence = length > 1 ? actors[0].getCompetence(Misc.join(params.slice(1, length), ' ')) : undefined;
|
||||||
for (let actor of actors) {
|
if (competence) {
|
||||||
await actor.rollCaracCompetence(caracName, compName, diff);
|
for (let actor of actors) {
|
||||||
|
await actor.rollCaracCompetence(caracName, competence.name, diff);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -398,5 +402,8 @@ export class RdDCommands {
|
|||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
async getMeteo(msg, params) {
|
||||||
|
return await RdDMeteo.getMeteo();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
134
module/rdd-meteo.js
Normal file
134
module/rdd-meteo.js
Normal file
@ -0,0 +1,134 @@
|
|||||||
|
|
||||||
|
const vents = [
|
||||||
|
{ min: 0, max: 0, valeur: 'Calme' },
|
||||||
|
{ min: 1, max: 1, valeur: 'Légère brise' },
|
||||||
|
{ min: 2, max: 2, valeur: 'Jolie brise' },
|
||||||
|
{ min: 3, max: 3, valeur: 'Bonne brise' },
|
||||||
|
{ min: 4, max: 4, valeur: 'Vent frais' },
|
||||||
|
{ min: 5, max: 5, valeur: 'Coup de vent' },
|
||||||
|
{ min: 6, max: 6, valeur: 'Fort coup de vent' },
|
||||||
|
{ min: 7, max: 9, valeur: 'Tempête' },
|
||||||
|
{ min: 10, max: 13, valeur: 'Violente tempête' },
|
||||||
|
{ min: 14, valeur: 'Ouragan' },
|
||||||
|
]
|
||||||
|
const mers = [
|
||||||
|
{ min: 0, max: 0, valeur: 'Calme' },
|
||||||
|
{ min: 1, max: 1, valeur: 'Belle' },
|
||||||
|
{ min: 2, max: 2, valeur: 'Peu agitée' },
|
||||||
|
{ min: 3, max: 3, valeur: 'Agitée' },
|
||||||
|
{ min: 4, max: 4, valeur: 'Forte' },
|
||||||
|
{ min: 5, max: 6, valeur: 'Très forte' },
|
||||||
|
{ min: 7, max: 9, valeur: 'Grosse' },
|
||||||
|
{ min: 10, max: 13, valeur: 'Très grosse' },
|
||||||
|
{ min: 14, valeur: 'Énorme' },
|
||||||
|
]
|
||||||
|
|
||||||
|
const nuages = [
|
||||||
|
{ min: 0, max: 3, valeur: 'dégagé' },
|
||||||
|
{ min: 4, max: 6, valeur: 'passages nuageux' },
|
||||||
|
{ min: 7, max: 9, valeur: 'nuageux', },
|
||||||
|
{ min: 10, max: 10, valeur: 'brouillard' },
|
||||||
|
{ min: 11, max: 12, valeur: 'bruine' },
|
||||||
|
{ min: 13, valeur: 'très nuageux' },
|
||||||
|
]
|
||||||
|
|
||||||
|
const pluies = [
|
||||||
|
{ min: 0, max: 4, valeur: 'aucune' },
|
||||||
|
{ min: 5, max: 5, valeur: 'bruine, crachin, éparse' },
|
||||||
|
{ min: 6, max: 7, valeur: 'averses' },
|
||||||
|
{ min: 8, max: 10, valeur: 'pluvieux', },
|
||||||
|
{ min: 11, max: 13, valeur: 'forte pluie' },
|
||||||
|
{ min: 14, valeur: 'déluge' },
|
||||||
|
]
|
||||||
|
|
||||||
|
const temperatures = [
|
||||||
|
{ max: -14, valeur: 'glaciale' },
|
||||||
|
{ min: -13, max: -10, valeur: 'Très froide' },
|
||||||
|
{ min: -9, max: -7, valeur: 'froide' },
|
||||||
|
{ min: -6, max: -4, valeur: 'fraîche' },
|
||||||
|
{ min: -3, max: 3, valeur: 'de saison' },
|
||||||
|
{ min: 4, max: 6, valeur: 'élevée' },
|
||||||
|
{ min: 7, max: 9, valeur: 'chaude' },
|
||||||
|
{ min: 10, max: 13, valeur: 'torride' },
|
||||||
|
{ min: 14, valeur: 'caniculaire' },
|
||||||
|
]
|
||||||
|
|
||||||
|
export class RdDMeteo {
|
||||||
|
static async getForce() {
|
||||||
|
const roll = new Roll(`1dr`);
|
||||||
|
await roll.evaluate({ async: true });
|
||||||
|
return roll.total;
|
||||||
|
}
|
||||||
|
|
||||||
|
static async getPluie(nuage) {
|
||||||
|
return nuage <= 3 ? 0 : await RdDMeteo.getForce();
|
||||||
|
}
|
||||||
|
|
||||||
|
static async getTemperature() {
|
||||||
|
const degre = await RdDMeteo.getForce();
|
||||||
|
const rollChaudFroid = new Roll('1d2');
|
||||||
|
await rollChaudFroid.evaluate({ async: true });
|
||||||
|
const chaudFroid = rollChaudFroid.total == 1;
|
||||||
|
return chaudFroid.total ? degre : -degre;
|
||||||
|
}
|
||||||
|
|
||||||
|
static async getDirection(direction) {
|
||||||
|
const roll = new Roll(`1d16`);
|
||||||
|
await roll.evaluate({ async: true });
|
||||||
|
switch (roll.total % 16) {
|
||||||
|
case 0: return 'Nord';
|
||||||
|
case 1: return 'Nord Nord Est';
|
||||||
|
case 2: return 'Nord Est';
|
||||||
|
case 3: return 'Est Nord Est';
|
||||||
|
case 4: return 'Est';
|
||||||
|
case 5: return 'Est Sud Est';
|
||||||
|
case 6: return 'Sud Est';
|
||||||
|
case 7: return 'Sud Sud Est';
|
||||||
|
case 8: return 'Sud';
|
||||||
|
case 9: return 'Sud Sud Ouest';
|
||||||
|
case 10: return 'Sud Ouest';
|
||||||
|
case 11: return 'Ouest Sud Ouest';
|
||||||
|
case 12: return 'Ouest';
|
||||||
|
case 13: return 'Ouest Nord Ouest';
|
||||||
|
case 14: return 'Nord Ouest';
|
||||||
|
case 15: return 'Nord Nord Ouest';
|
||||||
|
}
|
||||||
|
return undefined;
|
||||||
|
}
|
||||||
|
|
||||||
|
static async getMeteo() {
|
||||||
|
const vent = await RdDMeteo.getForce();
|
||||||
|
const mer = await RdDMeteo.getForce();
|
||||||
|
const nuage = await RdDMeteo.getForce();
|
||||||
|
const pluie = await RdDMeteo.getPluie(nuage);
|
||||||
|
const temperature = await RdDMeteo.getTemperature();
|
||||||
|
const meteo = {
|
||||||
|
vent: { force: vent, direction: await RdDMeteo.getDirection(), },
|
||||||
|
mer: { force: mer, direction: await RdDMeteo.getDirection(), },
|
||||||
|
temperature: { force: temperature },
|
||||||
|
nuage: { force: nuage, },
|
||||||
|
pluie: { force: pluie },
|
||||||
|
}
|
||||||
|
meteo.vent.description = RdDMeteo.vent(meteo.vent.force);
|
||||||
|
meteo.mer.description = RdDMeteo.mer(meteo.mer.force),
|
||||||
|
meteo.temperature.description = RdDMeteo.temperature(meteo.temperature.force);
|
||||||
|
meteo.nuage.description = RdDMeteo.nuage(meteo.nuage.force);
|
||||||
|
meteo.pluie.description = RdDMeteo.pluie(meteo.pluie.force);
|
||||||
|
|
||||||
|
ChatMessage.create({
|
||||||
|
content: await renderTemplate('systems/foundryvtt-reve-de-dragon/templates/chat-resultat-meteo.html', meteo),
|
||||||
|
whisper: ChatMessage.getWhisperRecipients('GM')
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
static description(liste, force, valeur = it => it.valeur) {
|
||||||
|
let select = liste.find(it => (it.min == undefined || it.min <= force) && (it.max == undefined || force <= it.max));
|
||||||
|
return valeur(select ?? liste[0]);
|
||||||
|
}
|
||||||
|
|
||||||
|
static vent(force) { return this.description(vents, force); }
|
||||||
|
static mer(force) { return this.description(mers, force); }
|
||||||
|
static nuage(force) { return this.description(nuages, force); }
|
||||||
|
static pluie(force) { return this.description(pluies, force); }
|
||||||
|
static temperature(force) { return this.description(temperatures, force); }
|
||||||
|
}
|
@ -1,19 +1,29 @@
|
|||||||
|
import { RdDActor } from "./actor.js";
|
||||||
import { Misc } from "./misc.js";
|
import { Misc } from "./misc.js";
|
||||||
import { RdDDice } from "./rdd-dice.js";
|
import { RdDDice } from "./rdd-dice.js";
|
||||||
|
|
||||||
const words = [ 'pore', 'pre', 'flor', 'lane', 'turlu', 'pin', 'a', 'alph', 'i', 'onse', 'iane', 'ane', 'zach', 'arri', 'ba', 'bo', 'bi',
|
const words = ['pore', 'pre', 'flor', 'lane', 'turlu', 'pin', 'a', 'alph', 'i', 'onse', 'iane', 'ane', 'zach', 'arri', 'ba', 'bo', 'bi',
|
||||||
'alta', 'par', 'pir', 'zor', 'zir', 'de', 'pol', 'tran', 'no', 'la', 'al' , 'pul', 'one', 'ner', 'nur', 'mac', 'mery',
|
'alta', 'par', 'pir', 'zor', 'zir', 'de', 'pol', 'tran', 'no', 'la', 'al', 'pul', 'one', 'ner', 'nur', 'mac', 'mery',
|
||||||
'cat', 'do', 'di', 'der', 'er', 'el', 'far', 'fer', 'go', 'guer', 'hot', 'jor', 'jar', 'ji', 'kri', 'ket', 'lor', 'hur',
|
'cat', 'do', 'di', 'der', 'er', 'el', 'far', 'fer', 'go', 'guer', 'hot', 'jor', 'jar', 'ji', 'kri', 'ket', 'lor', 'hur',
|
||||||
'lar', 'lir', 'lu', 'pot', 'pro', 'pra', 'pit', 'qua', 'qui', 're', 'ral', 'sal', 'sen', 'ted', 'to', 'ta', 'lars', 'ver',
|
'lar', 'lir', 'lu', 'pot', 'pro', 'pra', 'pit', 'qua', 'qui', 're', 'ral', 'sal', 'sen', 'ted', 'to', 'ta', 'lars', 'ver',
|
||||||
'vin', 'ov', 'wal', 'ry', 'ly', '' ];
|
'vin', 'ov', 'wal', 'ry', 'ly', ''];
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
export class RdDNameGen {
|
export class RdDNameGen {
|
||||||
|
|
||||||
static async getName( msg, params ) {
|
static async getName(msg, params) {
|
||||||
let name = Misc.upperFirst( await RdDDice.rollOneOf(words) + await RdDDice.rollOneOf(words) )
|
const html = await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/chat-command-nom.html`, {
|
||||||
//console.log(name);
|
nom: Misc.upperFirst(await RdDDice.rollOneOf(words) + await RdDDice.rollOneOf(words))
|
||||||
ChatMessage.create( { content: `Nom : ${name}`, whisper: ChatMessage.getWhisperRecipients("GM") } );
|
});
|
||||||
|
ChatMessage.create({ content: html, whisper: ChatMessage.getWhisperRecipients("GM") });
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static async onCreerActeur(event) {
|
||||||
|
const button = event.currentTarget;
|
||||||
|
await RdDActor.create({
|
||||||
|
name: button.attributes['data-nom'].value,
|
||||||
|
type: button.attributes['data-type'].value
|
||||||
|
},
|
||||||
|
{renderSheet: true});
|
||||||
|
}
|
||||||
}
|
}
|
@ -18,40 +18,40 @@ 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.data.items.find(poss => poss.type == 'possession' && poss.data.data.possedeid == defender.data._id);
|
||||||
if (!poss) {
|
if (!poss) {
|
||||||
poss = defender.data.items.find( poss => poss.type == 'possession' && poss.data.data.possedeid == defender.data._id);
|
poss = defender.data.items.find(poss => poss.type == 'possession' && poss.data.data.possedeid == defender.data._id);
|
||||||
}
|
}
|
||||||
return poss && duplicate(poss) || undefined;
|
return poss && duplicate(poss) || undefined;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static updateEtatPossession( possession ) {
|
static updateEtatPossession(possession) {
|
||||||
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.data.compteur > 0) {
|
||||||
possession.ptsPossession = possession.data.compteur
|
possession.ptsPossession = possession.data.compteur
|
||||||
}
|
}
|
||||||
if ( possession.data.compteur < 0) {
|
if (possession.data.compteur < 0) {
|
||||||
possession.ptsConjuration = Math.abs(possession.data.compteur)
|
possession.ptsConjuration = Math.abs(possession.data.compteur)
|
||||||
}
|
}
|
||||||
possession.isPosseder = false
|
possession.isPosseder = false
|
||||||
possession.isConjurer = false
|
possession.isConjurer = false
|
||||||
if (possession.ptsPossession >= 2 ) {
|
if (possession.ptsPossession >= 2) {
|
||||||
possession.isPosseder = true
|
possession.isPosseder = true
|
||||||
}
|
}
|
||||||
if (possession.ptsConjuration >= 2 ) {
|
if (possession.ptsConjuration >= 2) {
|
||||||
possession.isConjurer = true
|
possession.isConjurer = true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static async resultConjuration( rollData) {
|
static async resultConjuration(rollData) {
|
||||||
let actor = game.actors.get(rollData.possession.data.possedeid)
|
let actor = game.actors.get(rollData.possession.data.possedeid)
|
||||||
if ( !rollData.rolled.isSuccess ) {
|
if (!rollData.rolled.isSuccess) {
|
||||||
if( rollData.isECNIDefender) {
|
if (rollData.isECNIDefender) {
|
||||||
rollData.possession.data.compteur--
|
rollData.possession.data.compteur--
|
||||||
} else {
|
} else {
|
||||||
rollData.possession.data.compteur++
|
rollData.possession.data.compteur++
|
||||||
@ -62,52 +62,38 @@ export class RdDPossession {
|
|||||||
|
|
||||||
this.updateEtatPossession(rollData.possession)
|
this.updateEtatPossession(rollData.possession)
|
||||||
await RdDResolutionTable.displayRollData(rollData, this, 'chat-resultat-possession.html')
|
await RdDResolutionTable.displayRollData(rollData, this, 'chat-resultat-possession.html')
|
||||||
if ( rollData.possession.isPosseder || rollData.possession.isConjurer) {
|
if (rollData.possession.isPosseder || rollData.possession.isConjurer) {
|
||||||
actor.deleteEmbeddedDocuments("Item", [rollData.possession._id])
|
actor.deleteEmbeddedDocuments("Item", [rollData.possession._id])
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static async onDefensePossession( attackerId, defenderId, possessionId) {
|
static async onDefensePossession(attackerId, defenderId, possessionId) {
|
||||||
let attacker = game.actors.get(attackerId)
|
let attacker = game.actors.get(attackerId)
|
||||||
let defender = game.actors.get(defenderId)
|
let defender = game.actors.get(defenderId)
|
||||||
|
let possession = attacker.getPossession(possessionId) ?? defender.getPossession(possessionId) ;
|
||||||
let possession = attacker.items.find( item => item.type =='possession' && item.data.data.possessionid == possessionId)
|
if (!possession) {
|
||||||
if ( !possession ) {
|
ui.notifications.warn("Une erreur s'est produite : Aucune possession trouvée !!")
|
||||||
possession = defender.items.find( item => item.type =='possession' && item.data.data.possessionid == possessionId)
|
return
|
||||||
if ( !possession) {
|
|
||||||
ui.notifications.warn("Une erreur s'est produite : Aucune possession trouvée !!")
|
|
||||||
return
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
possession = duplicate(possession)
|
|
||||||
|
|
||||||
// Update for draconic roll
|
// Update for draconic roll
|
||||||
let rollData = {
|
let rollData = {
|
||||||
possession: possession
|
mode: "conjuration",
|
||||||
|
isECNIDefender: defender.type == "entite",
|
||||||
|
possession: duplicate(possession),
|
||||||
|
attacker: attacker,
|
||||||
|
defender: defender,
|
||||||
|
competence: defender.getDraconicOuPossession(),
|
||||||
|
selectedCarac: defender.data.data.carac.reve,
|
||||||
|
forceCarac: { 'reve-actuel': { label: "Rêve Actuel", value: defender.getReveActuel() } }
|
||||||
}
|
}
|
||||||
rollData.actor = defender
|
rollData.competence.data.defaut_carac = 'reve-actuel'
|
||||||
if ( defender.type == "personnage") {
|
|
||||||
rollData.competence = duplicate(defender.getDraconicOrZero())
|
|
||||||
rollData.competence.data.defaut_carac = 'reve-actuel'
|
|
||||||
rollData.forceCarac = { 'reve-actuel': { label: "Rêve Actuel", value: defender.getReveActuel() } }
|
|
||||||
rollData.selectedCarac = defender.data.data.carac.reve
|
|
||||||
rollData.isECNIDefender = false
|
|
||||||
} else {
|
|
||||||
rollData.competence = duplicate(defender.getCompetence("Possession"))
|
|
||||||
rollData.competence.data.defaut_carac = "reve"
|
|
||||||
rollData.forceCarac = { 'reve': { label: "Rêve", value: defender.data.data.carac.reve.value } }
|
|
||||||
rollData.selectedCarac = defender.data.data.carac.reve
|
|
||||||
rollData.isECNIDefender = true
|
|
||||||
//RdDItemCompetenceCreature.setRollDataCreature( rollData )
|
|
||||||
}
|
|
||||||
rollData.mode = "conjuration"
|
|
||||||
rollData.possesseur = attacker.name
|
|
||||||
|
|
||||||
const dialog = await RdDRoll.create(defender, rollData,
|
const dialog = await RdDRoll.create(defender, rollData,
|
||||||
{
|
{
|
||||||
html: 'systems/foundryvtt-reve-de-dragon/templates/dialog-roll-defense-possession.html',
|
html: 'systems/foundryvtt-reve-de-dragon/templates/dialog-roll-defense-possession.html',
|
||||||
options: { height: 400 }
|
options: { height: 450 }
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: 'conjurer',
|
name: 'conjurer',
|
||||||
@ -121,16 +107,7 @@ export class RdDPossession {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static async _onRollPossession( rollData, isSuccess ) {
|
static async onAttaquePossession(attacker, competence, possession = undefined) {
|
||||||
let possession = rollData.possession
|
|
||||||
possession.isSuccess = isSuccess
|
|
||||||
this.updateEtatPossession( possession)
|
|
||||||
await RdDResolutionTable.displayRollData(rollData, this, 'chat-resultat-possession.html');
|
|
||||||
}
|
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
|
||||||
static async managePossession(attacker, competence, possession=undefined) {
|
|
||||||
|
|
||||||
const target = RdDCombat.getTarget()
|
const target = RdDCombat.getTarget()
|
||||||
if (target == undefined) {
|
if (target == undefined) {
|
||||||
ui.notifications.warn((game.user.targets?.size ?? 0) > 1
|
ui.notifications.warn((game.user.targets?.size ?? 0) > 1
|
||||||
@ -139,36 +116,29 @@ export class RdDPossession {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
const defender = target.actor
|
const defender = target.actor;
|
||||||
if ( !possession) {
|
possession = duplicate(possession ?? this.searchPossessionFromEntite(attacker, defender) ??(await this.createPossession(attacker, defender)));
|
||||||
possession = this.searchPossessionFromEntite( attacker, defender)
|
|
||||||
if ( !possession) {
|
|
||||||
possession = await this.createPossession(attacker, defender)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
possession = duplicate(possession)
|
|
||||||
|
|
||||||
this.updateEtatPossession(possession)
|
this.updateEtatPossession(possession)
|
||||||
let rollData = {
|
let rollData = {
|
||||||
|
mode: "possession",
|
||||||
|
isECNIDefender: defender.type == "entite",
|
||||||
competence: competence,
|
competence: competence,
|
||||||
possession: possession,
|
possession: possession,
|
||||||
possede: defender.name,
|
attacker: attacker,
|
||||||
possesseur: attacker.name,
|
defender: defender
|
||||||
attackerId: attacker.data._id,
|
|
||||||
defenderId: defender.data._id,
|
|
||||||
mode: "possession"
|
|
||||||
};
|
};
|
||||||
if ( attacker.isCreature()) {
|
if (attacker.isCreature()) {
|
||||||
RdDItemCompetenceCreature.setRollDataCreature(rollData)
|
RdDItemCompetenceCreature.setRollDataCreature(rollData)
|
||||||
}
|
}
|
||||||
|
|
||||||
const dialog = await RdDRoll.create( attacker, rollData,
|
const dialog = await RdDRoll.create(attacker, rollData,
|
||||||
{
|
{
|
||||||
html: 'systems/foundryvtt-reve-de-dragon/templates/dialog-roll-competence.html',
|
html: 'systems/foundryvtt-reve-de-dragon/templates/dialog-roll-competence.html',
|
||||||
options: { height: 540 }
|
options: { height: 540 }
|
||||||
}, {
|
}, {
|
||||||
name: 'jet-possession',
|
name: 'jet-possession',
|
||||||
label: 'Possession: ',
|
label: rollData.isECNIDefender ? 'Conjurer la possession' : 'Possession',
|
||||||
callbacks: [
|
callbacks: [
|
||||||
{ condition: r => (r.rolled.isSuccess), action: async r => await this._onRollPossession(r, true) },
|
{ condition: r => (r.rolled.isSuccess), action: async r => await this._onRollPossession(r, true) },
|
||||||
{ condition: r => (r.rolled.isEchec), action: async r => await this._onRollPossession(r, false) },
|
{ condition: r => (r.rolled.isEchec), action: async r => await this._onRollPossession(r, false) },
|
||||||
@ -178,7 +148,14 @@ export class RdDPossession {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static async createPossession( attacker, defender ) {
|
static async _onRollPossession(rollData, isSuccess) {
|
||||||
|
rollData.possession.isSuccess = isSuccess;
|
||||||
|
this.updateEtatPossession(rollData.possession);
|
||||||
|
await RdDResolutionTable.displayRollData(rollData, this, 'chat-resultat-possession.html');
|
||||||
|
}
|
||||||
|
|
||||||
|
/* -------------------------------------------- */
|
||||||
|
static async createPossession(attacker, defender) {
|
||||||
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",
|
||||||
|
@ -158,6 +158,7 @@ export class RdDResolutionTable {
|
|||||||
if (difficulte < -10) {
|
if (difficulte < -10) {
|
||||||
return duplicate(levelDown.find(levelData => levelData.level == difficulte));
|
return duplicate(levelDown.find(levelData => levelData.level == difficulte));
|
||||||
}
|
}
|
||||||
|
console.log("DATA :", caracValue, difficulte)
|
||||||
return duplicate(RdDResolutionTable.resolutionTable[caracValue][difficulte + 10]);
|
return duplicate(RdDResolutionTable.resolutionTable[caracValue][difficulte + 10]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,3 +1,5 @@
|
|||||||
|
import { ENTITE_BLURETTE, ENTITE_INCARNE, ENTITE_NONINCARNE } from "./constants.js";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Extend the base Dialog entity by defining a custom window to perform roll.
|
* Extend the base Dialog entity by defining a custom window to perform roll.
|
||||||
* @extends {Dialog}
|
* @extends {Dialog}
|
||||||
@ -7,15 +9,19 @@ export class RdDEncaisser extends Dialog {
|
|||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
constructor(html, actor) {
|
constructor(html, actor) {
|
||||||
// Common conf
|
// Common conf
|
||||||
const buttonsCreatures = {
|
let buttons = {};
|
||||||
"mortel": { label: "Mortel", callback: html => this.performEncaisser("mortel") },
|
if (!actor.isEntite()){
|
||||||
"non-mortel": { label: "Non-mortel", callback: html => this.performEncaisser("non-mortel") },
|
buttons = {
|
||||||
"sonne": { label: "Sonné", callback: html => this.actor.setSonne() },
|
"mortel": { label: "Mortel", callback: html => this.performEncaisser("mortel") },
|
||||||
};
|
"non-mortel": { label: "Non-mortel", callback: html => this.performEncaisser("non-mortel") },
|
||||||
const buttonsEntitesCauchemar = {
|
"sonne": { label: "Sonné", callback: html => this.actor.setSonne() },
|
||||||
"cauchemar": { label: "cauchemar", callback: html => this.performEncaisser("cauchemar") }
|
};
|
||||||
};
|
}
|
||||||
const buttons = actor.isEntiteCauchemar() ? buttonsEntitesCauchemar : buttonsCreatures;
|
else if (actor.isEntite([ENTITE_BLURETTE, ENTITE_INCARNE])){
|
||||||
|
buttons = {
|
||||||
|
"cauchemar": { label: "cauchemar", callback: html => this.performEncaisser("cauchemar") }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
let dialogConf = {
|
let dialogConf = {
|
||||||
title: "Jet d'Encaissement",
|
title: "Jet d'Encaissement",
|
||||||
@ -24,7 +30,6 @@ export class RdDEncaisser extends Dialog {
|
|||||||
default: "mortel"
|
default: "mortel"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
let dialogOptions = {
|
let dialogOptions = {
|
||||||
classes: ["rdddialog"],
|
classes: ["rdddialog"],
|
||||||
width: 320,
|
width: 320,
|
||||||
|
@ -95,12 +95,15 @@ export class RdDTMRDialog extends Dialog {
|
|||||||
createPixiSprites() {
|
createPixiSprites() {
|
||||||
EffetsDraconiques.carteTmr.createSprite(this.pixiTMR);
|
EffetsDraconiques.carteTmr.createSprite(this.pixiTMR);
|
||||||
this.updateTokens();
|
this.updateTokens();
|
||||||
this.demiReve = this._tokenDemiReve();
|
this.forceDemiRevePositionView();
|
||||||
this._updateDemiReve();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
_createTokens() {
|
_createTokens() {
|
||||||
|
if (!this.isDemiReveCache()){
|
||||||
|
this.demiReve = this._tokenDemiReve();
|
||||||
|
this._trackToken(this.demiReve);
|
||||||
|
}
|
||||||
let tokens = this._getTokensCasesTmr()
|
let tokens = this._getTokensCasesTmr()
|
||||||
.concat(this._getTokensRencontres())
|
.concat(this._getTokensRencontres())
|
||||||
.concat(this._getTokensSortsReserve());
|
.concat(this._getTokensSortsReserve());
|
||||||
@ -154,9 +157,9 @@ export class RdDTMRDialog extends Dialog {
|
|||||||
return EffetsDraconiques.demiReve.token(this.pixiTMR, actorData, () => actorData.data.reve.tmrpos.coord);
|
return EffetsDraconiques.demiReve.token(this.pixiTMR, actorData, () => actorData.data.reve.tmrpos.coord);
|
||||||
}
|
}
|
||||||
|
|
||||||
_updateDemiReve() {
|
forceDemiRevePositionView() {
|
||||||
this.notifierResonanceSigneDraconique(this._getActorCoord());
|
this.notifierResonanceSigneDraconique(this._getActorCoord());
|
||||||
this._setTokenPosition(this.demiReve);
|
this._trackToken(this.demiReve);
|
||||||
}
|
}
|
||||||
|
|
||||||
_getActorCoord() {
|
_getActorCoord() {
|
||||||
@ -336,6 +339,10 @@ 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);
|
let locList = TMRUtility.getTMRPortee(coord, portee);
|
||||||
this.colorierZoneRencontre(locList);
|
this.colorierZoneRencontre(locList);
|
||||||
@ -743,6 +750,7 @@ export class RdDTMRDialog extends Dialog {
|
|||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
async _maitriserTMR(rollData, callbackMaitrise) {
|
async _maitriserTMR(rollData, callbackMaitrise) {
|
||||||
this.minimize(); // Hide
|
this.minimize(); // Hide
|
||||||
|
rollData.isTMRCache = rollData.actor.isTMRCache();
|
||||||
const dialog = await RdDRoll.create(this.actor, rollData,
|
const dialog = await RdDRoll.create(this.actor, rollData,
|
||||||
{
|
{
|
||||||
html: 'systems/foundryvtt-reve-de-dragon/templates/dialog-roll-maitrise-tmr.html',
|
html: 'systems/foundryvtt-reve-de-dragon/templates/dialog-roll-maitrise-tmr.html',
|
||||||
@ -874,49 +882,62 @@ export class RdDTMRDialog extends Dialog {
|
|||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
async _onClickTMRPos(clickOddq) {
|
async _onClickTMRPos(clickOddq) {
|
||||||
if (this.isDemiReveCache()) {
|
|
||||||
ui.notifications.error(`Vous ne connaissez plus votre position dans les TMR.
|
|
||||||
Vous devez utiliser les boutons de direction pour vous déplacer.
|
|
||||||
Une fois que vous aurez retrouvé votre demi-rêve, demandez au gardien de vérifier et rendre les TMR visibles.
|
|
||||||
`);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
let currentOddq = TMRUtility.coordTMRToOddq(this._getActorCoord());
|
let currentOddq = TMRUtility.coordTMRToOddq(this._getActorCoord());
|
||||||
|
|
||||||
console.log("deplacerDemiReve >>>>", currentOddq, clickOddq);
|
|
||||||
|
|
||||||
let targetCoord = TMRUtility.oddqToCoordTMR(clickOddq);
|
let targetCoord = TMRUtility.oddqToCoordTMR(clickOddq);
|
||||||
let currentCoord = TMRUtility.oddqToCoordTMR(currentOddq);
|
let currentCoord = TMRUtility.oddqToCoordTMR(currentOddq);
|
||||||
|
|
||||||
// Validation de la case de destination (gestion du cas des rencontres qui peuvent téléporter)
|
// Validation de la case de destination (gestion du cas des rencontres qui peuvent téléporter)
|
||||||
let deplacementType = this._calculDeplacement(targetCoord, currentCoord, currentOddq, clickOddq);
|
let deplacementType = this._calculDeplacement(targetCoord, currentCoord, currentOddq, clickOddq);
|
||||||
|
|
||||||
// Si le deplacement est valide
|
if (this.isDemiReveCache()) {
|
||||||
if (deplacementType == 'normal' || deplacementType == 'saut') {
|
if (this.isTerreAttache(targetCoord)
|
||||||
await this._deplacerDemiReve(targetCoord, deplacementType);
|
|| (this.isCaseHumide(currentCoord) && this.isCaseHumide(targetCoord))
|
||||||
} else if (deplacementType == 'messager') { // Dans ce cas, ouverture du lancement de sort sur la case visée
|
|| deplacementType == 'changeur')
|
||||||
await this._messagerDemiReve(targetCoord);
|
{
|
||||||
} else {
|
// déplacement possible
|
||||||
ui.notifications.error("Vous ne pouvez pas vous déplacer que sur des cases adjacentes à votre position ou valides dans le cas d'une rencontre");
|
await this.actor.montreTMR();
|
||||||
console.log("STATUS :", this.rencontreState, this.currentRencontre);
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ui.notifications.error(`Vous ne connaissez plus votre position dans les TMR.
|
||||||
|
Vous devez utiliser les boutons de direction pour vous déplacer.
|
||||||
|
Une fois que vous aurez retrouvé votre demi-rêve, demandez au gardien de vérifier et rendre les TMR visibles.
|
||||||
|
`);
|
||||||
|
return;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
switch (deplacementType){
|
||||||
|
case 'normal':
|
||||||
|
await this._deplacerDemiReve(targetCoord, deplacementType);
|
||||||
|
break;
|
||||||
|
case 'messager':
|
||||||
|
await this._messagerDemiReve(targetCoord);
|
||||||
|
break;
|
||||||
|
case 'changeur':
|
||||||
|
case 'passeur':
|
||||||
|
await this._deplacerDemiReve(targetCoord, deplacementType);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
ui.notifications.error("Vous ne pouvez pas vous déplacer que sur des cases adjacentes à votre position ou valides dans le cas d'une rencontre");
|
||||||
|
console.log("STATUS :", this.rencontreState, this.currentRencontre);
|
||||||
|
}
|
||||||
|
|
||||||
this.checkQuitterTMR();
|
this.checkQuitterTMR();
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
_calculDeplacement(targetCoord, currentCoord, fromOddq, toOddq) {
|
_calculDeplacement(targetCoord, currentCoord, fromOddq, toOddq) {
|
||||||
|
|
||||||
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';
|
||||||
case 'messager': return 'messager';
|
case 'passeur': case 'changeur': case 'messager': return this.rencontreState;
|
||||||
case 'passeur': case 'changeur': return 'saut';
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return 'erreur'
|
return 'erreur';
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
@ -932,9 +953,8 @@ export class RdDTMRDialog extends Dialog {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
externalRefresh(tmrData) {
|
externalRefresh() {
|
||||||
this.createPixiSprites();
|
this.createPixiSprites();
|
||||||
this.forceDemiRevePositionView();
|
|
||||||
this.updateValuesDisplay();
|
this.updateValuesDisplay();
|
||||||
this.updateTokens();
|
this.updateTokens();
|
||||||
console.log("TMR REFRESHED !!!");
|
console.log("TMR REFRESHED !!!");
|
||||||
@ -946,23 +966,17 @@ export class RdDTMRDialog extends Dialog {
|
|||||||
this.nettoyerRencontre();
|
this.nettoyerRencontre();
|
||||||
}
|
}
|
||||||
let tmr = TMRUtility.getTMR(targetCoord);
|
let tmr = TMRUtility.getTMR(targetCoord);
|
||||||
//console.log("deplacerDemiReve", tmr, this);
|
|
||||||
// Gestion cases spéciales type Trou noir, etc
|
// Gestion cases spéciales type Trou noir, etc
|
||||||
tmr = await this.manageTmrInnaccessible(tmr);
|
tmr = await this.manageTmrInnaccessible(tmr);
|
||||||
|
|
||||||
await this.actor.updateCoordTMR(tmr.coord);
|
await this.actor.updateCoordTMR(tmr.coord);
|
||||||
|
|
||||||
this._updateDemiReve();
|
this.forceDemiRevePositionView();
|
||||||
if (ReglesOptionelles.isUsing("appliquer-fatigue")) {
|
if (ReglesOptionelles.isUsing("appliquer-fatigue")) {
|
||||||
this.cumulFatigue += this.fatigueParCase;
|
this.cumulFatigue += this.fatigueParCase;
|
||||||
}
|
}
|
||||||
this.updateValuesDisplay();
|
this.updateValuesDisplay();
|
||||||
game.socket.emit(SYSTEM_SOCKET_ID, {
|
this.actor.notifyRefreshTMR();
|
||||||
msg: "msg_tmr_move", data: {
|
|
||||||
actorId: this.actor.data._id,
|
|
||||||
tmrPos: Misc.data(this.actor).data.reve.tmrpos
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
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, () => this.postRencontre(tmr));
|
||||||
@ -995,14 +1009,9 @@ export class RdDTMRDialog extends Dialog {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
async forceDemiRevePositionView() {
|
async positionnerDemiReve(coord) {
|
||||||
this._updateDemiReve();
|
|
||||||
}
|
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
|
||||||
async forceDemiRevePosition(coord) {
|
|
||||||
await this.actor.updateCoordTMR(coord);
|
await this.actor.updateCoordTMR(coord);
|
||||||
this._updateDemiReve();
|
this.forceDemiRevePositionView();
|
||||||
let tmr = TMRUtility.getTMR(coord);
|
let tmr = TMRUtility.getTMR(coord);
|
||||||
await this.postRencontre(tmr);
|
await this.postRencontre(tmr);
|
||||||
return tmr;
|
return tmr;
|
||||||
@ -1025,14 +1034,6 @@ export class RdDTMRDialog extends Dialog {
|
|||||||
return this.pixiTMR.getCaseRectangle(TMRUtility.coordTMRToOddq(coord));
|
return this.pixiTMR.getCaseRectangle(TMRUtility.coordTMRToOddq(coord));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
|
||||||
_setTokenPosition(token) {
|
|
||||||
if (this.isDemiReveCache() && this.demiReve === token ) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
this.pixiTMR.setPosition(token.sprite, TMRUtility.coordTMRToOddq(token.coordTMR()));
|
|
||||||
}
|
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
_removeTokens(filter) {
|
_removeTokens(filter) {
|
||||||
const tokensToRemove = this.allTokens.filter(filter);
|
const tokensToRemove = this.allTokens.filter(filter);
|
||||||
@ -1043,7 +1044,10 @@ export class RdDTMRDialog extends Dialog {
|
|||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
_trackToken(token) {
|
_trackToken(token) {
|
||||||
|
if (this.demiReve === token && this.isDemiReveCache()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
this.pixiTMR.setPosition(token.sprite, TMRUtility.coordTMRToOddq(token.coordTMR()));
|
||||||
this.allTokens.push(token);
|
this.allTokens.push(token);
|
||||||
this._setTokenPosition(token);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -23,28 +23,36 @@ 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 => Misc.data(c).tokenId == tokenId);
|
||||||
|
if (! (combatant?.actor) ) {
|
||||||
|
ui.notifications.warn(`Le combatant ${token.name} n'est pas associé à un acteur, impossible de déterminer ses actions de combat!`)
|
||||||
|
return;
|
||||||
|
}
|
||||||
app.hasExtension = true;
|
app.hasExtension = true;
|
||||||
|
|
||||||
let armesList = RdDCombatManager.buildListeActionsCombat(combatant);
|
let actionsCombat = RdDCombatManager.listActionsCombat(combatant);
|
||||||
const hudData = {
|
const hudData = {
|
||||||
combatant: combatant, armes: armesList,
|
combatant: combatant,
|
||||||
commandes: [{ name: 'Initiative +1', command: 'inc', value: 0.01 }, { name: 'Initiative -1', command: 'dec', value: -0.01 }]
|
actions: actionsCombat,
|
||||||
|
commandes: [
|
||||||
|
{ name: "Autre action", command: 'autre' },
|
||||||
|
{ name: 'Initiative +1', command: 'inc', value: 0.01 },
|
||||||
|
{ name: 'Initiative -1', command: 'dec', value: -0.01 }]
|
||||||
};
|
};
|
||||||
|
|
||||||
const controlIconCombat = html.find('.control-icon[data-action=combat]');
|
const controlIconCombat = html.find('.control-icon[data-action=combat]');
|
||||||
// initiative
|
// initiative
|
||||||
await RdDTokenHud._configureSubMenu(controlIconCombat, 'systems/foundryvtt-reve-de-dragon/templates/hud-actor-init.html', hudData,
|
await RdDTokenHud._configureSubMenu(controlIconCombat,
|
||||||
|
'systems/foundryvtt-reve-de-dragon/templates/hud-actor-init.html',
|
||||||
|
hudData,
|
||||||
(event) => {
|
(event) => {
|
||||||
let initCommand = event.currentTarget.attributes['data-command'].value;
|
let initCommand = event.currentTarget.attributes['data-command']?.value;
|
||||||
let combatantId = event.currentTarget.attributes['data-combatant-id'].value;
|
let combatantId = event.currentTarget.attributes['data-combatant-id']?.value;
|
||||||
if (!initCommand) {
|
if (initCommand) {
|
||||||
let armeIndex = event.currentTarget.attributes['data-arme-id'].value;
|
RdDTokenHud._initiativeCommand(initCommand, combatantId);
|
||||||
let arme = armesList[armeIndex];
|
} else {
|
||||||
RdDCombatManager.rollInitiativeCompetence(combatantId, arme);
|
let index = event.currentTarget.attributes['data-action-index'].value;
|
||||||
} else if (initCommand == 'inc') {
|
let action = actionsCombat[index];
|
||||||
RdDCombatManager.incDecInit(combatantId, 0.01);
|
RdDCombatManager.rollInitiativeAction(combatantId, action);
|
||||||
} else if (initCommand == 'dec') {
|
|
||||||
RdDCombatManager.incDecInit(combatantId, -0.01);
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -52,11 +60,26 @@ export class RdDTokenHud {
|
|||||||
// combat
|
// combat
|
||||||
await RdDTokenHud._configureSubMenu(controlIconTarget, 'systems/foundryvtt-reve-de-dragon/templates/hud-actor-attaque.html', hudData,
|
await RdDTokenHud._configureSubMenu(controlIconTarget, 'systems/foundryvtt-reve-de-dragon/templates/hud-actor-attaque.html', hudData,
|
||||||
(event) => {
|
(event) => {
|
||||||
let armeIndex = event.currentTarget.attributes['data-arme-id'].value;
|
const actionIndex = event.currentTarget.attributes['data-action-index']?.value;
|
||||||
actor.rollArme(armesList[armeIndex]);
|
const action = actionsCombat[actionIndex];
|
||||||
|
if (action.action == 'conjurer') {
|
||||||
|
actor.conjurerPossession(actor.getPossession(action.data.possessionid));
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
actor.rollArme(action);
|
||||||
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static _initiativeCommand(initCommand, combatantId) {
|
||||||
|
switch (initCommand) {
|
||||||
|
case 'inc': return RdDCombatManager.incDecInit(combatantId, 0.01);
|
||||||
|
case 'dec': return RdDCombatManager.incDecInit(combatantId, -0.01);
|
||||||
|
case 'autre': return RdDCombatManager.rollInitiativeAction(combatantId,
|
||||||
|
{ name: "Autre action", action: 'autre', data: { initOnly: true, competence: "Autre action" } });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static async addTokenHudExtensions(app, html, tokenId) {
|
static async addTokenHudExtensions(app, html, tokenId) {
|
||||||
const controlIconCombat = html.find('.control-icon[data-action=combat]');
|
const controlIconCombat = html.find('.control-icon[data-action=combat]');
|
||||||
|
@ -11,6 +11,7 @@ import { RdDDice } from "./rdd-dice.js";
|
|||||||
import { RdDItem } from "./item.js";
|
import { RdDItem } from "./item.js";
|
||||||
import { Monnaie } from "./item-monnaie.js";
|
import { Monnaie } from "./item-monnaie.js";
|
||||||
import { RdDPossession } from "./rdd-possession.js";
|
import { RdDPossession } from "./rdd-possession.js";
|
||||||
|
import { RdDNameGen } from "./rdd-namegen.js";
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
// This table starts at 0 -> niveau -10
|
// This table starts at 0 -> niveau -10
|
||||||
@ -121,8 +122,12 @@ export class RdDUtility {
|
|||||||
'systems/foundryvtt-reve-de-dragon/templates/actor-liste-blessures-partial.html',
|
'systems/foundryvtt-reve-de-dragon/templates/actor-liste-blessures-partial.html',
|
||||||
'systems/foundryvtt-reve-de-dragon/templates/actor-blessure-partial.html',
|
'systems/foundryvtt-reve-de-dragon/templates/actor-blessure-partial.html',
|
||||||
// Conteneur/item in Actor sheet
|
// Conteneur/item in Actor sheet
|
||||||
'systems/foundryvtt-reve-de-dragon/templates/actor-sheet-inventaire-conteneur.html',
|
'systems/foundryvtt-reve-de-dragon/templates/actor-sheet-inventaire.html',
|
||||||
|
'systems/foundryvtt-reve-de-dragon/templates/actor-sheet-inventaire-item.html',
|
||||||
"systems/foundryvtt-reve-de-dragon/templates/actor-sheet-inventaire-monnaie.html",
|
"systems/foundryvtt-reve-de-dragon/templates/actor-sheet-inventaire-monnaie.html",
|
||||||
|
'systems/foundryvtt-reve-de-dragon/templates/actor-sheet-liens-animaux.html',
|
||||||
|
'systems/foundryvtt-reve-de-dragon/templates/actor-sheet-liens-suivants.html',
|
||||||
|
'systems/foundryvtt-reve-de-dragon/templates/actor-sheet-liens-vehicules.html',
|
||||||
'systems/foundryvtt-reve-de-dragon/templates/actor-sheet-editor-notes-mj.html',
|
'systems/foundryvtt-reve-de-dragon/templates/actor-sheet-editor-notes-mj.html',
|
||||||
//Items
|
//Items
|
||||||
'systems/foundryvtt-reve-de-dragon/templates/item-competence-sheet.html',
|
'systems/foundryvtt-reve-de-dragon/templates/item-competence-sheet.html',
|
||||||
@ -221,8 +226,10 @@ export class RdDUtility {
|
|||||||
];
|
];
|
||||||
|
|
||||||
Handlebars.registerHelper('upperFirst', str => Misc.upperFirst(str ?? 'Null'));
|
Handlebars.registerHelper('upperFirst', str => Misc.upperFirst(str ?? 'Null'));
|
||||||
|
Handlebars.registerHelper('lowerFirst', str => Misc.lowerFirst(str ?? 'Null'));
|
||||||
Handlebars.registerHelper('upper', str => str?.toUpperCase() ?? 'NULL');
|
Handlebars.registerHelper('upper', str => str?.toUpperCase() ?? 'NULL');
|
||||||
Handlebars.registerHelper('le', str => Grammar.articleDetermine(str));
|
Handlebars.registerHelper('le', str => Grammar.articleDetermine(str));
|
||||||
|
Handlebars.registerHelper('apostrophe', (article, str) => Grammar.apostrophe(article, str));
|
||||||
Handlebars.registerHelper('un', str => Grammar.articleIndetermine(str));
|
Handlebars.registerHelper('un', str => Grammar.articleIndetermine(str));
|
||||||
Handlebars.registerHelper('accord', (genre, ...args) => Grammar.accord(genre, args));
|
Handlebars.registerHelper('accord', (genre, ...args) => Grammar.accord(genre, args));
|
||||||
Handlebars.registerHelper('buildConteneur', (objet) => { return new Handlebars.SafeString(RdDUtility.buildConteneur(objet)); });
|
Handlebars.registerHelper('buildConteneur', (objet) => { return new Handlebars.SafeString(RdDUtility.buildConteneur(objet)); });
|
||||||
@ -232,36 +239,38 @@ 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('sortCompetence', competences => competences.sort((a, b) => {
|
Handlebars.registerHelper('filtreTriCompetences', competences => competences.filter(it => it.visible)
|
||||||
if (a.name.startsWith("Survie") && b.name.startsWith("Survie")) {
|
.sort((a, b) => {
|
||||||
if (a.name.includes("Cité")) return -1;
|
if (a.name.startsWith("Survie") && b.name.startsWith("Survie")) {
|
||||||
if (b.name.includes("Cité")) return 1;
|
if (a.name.includes("Cité")) return -1;
|
||||||
if (a.name.includes("Extérieur")) return -1;
|
if (b.name.includes("Cité")) return 1;
|
||||||
if (b.name.includes("Extérieur")) return 1;
|
if (a.name.includes("Extérieur")) return -1;
|
||||||
|
if (b.name.includes("Extérieur")) return 1;
|
||||||
|
return a.name.localeCompare(b.name);
|
||||||
|
}
|
||||||
|
if (a.data.categorie.startsWith("melee") && b.data.categorie.startsWith("melee")) {
|
||||||
|
if (a.name.includes("Corps")) return -1;
|
||||||
|
if (b.name.includes("Corps")) return 1;
|
||||||
|
if (a.name.includes("Dague")) return -1;
|
||||||
|
if (b.name.includes("Dague")) return 1;
|
||||||
|
if (a.name.includes("Esquive")) return -1;
|
||||||
|
if (b.name.includes("Esquive")) return 1;
|
||||||
|
return a.name.localeCompare(b.name);
|
||||||
|
}
|
||||||
|
if (a.name.startsWith("Voie") && b.name.startsWith("Voie")) {
|
||||||
|
if (a.name.includes("Oniros")) return -1;
|
||||||
|
if (b.name.includes("Oniros")) return 1;
|
||||||
|
if (a.name.includes("Hypnos")) return -1;
|
||||||
|
if (b.name.includes("Hypnos")) return 1;
|
||||||
|
if (a.name.includes("Narcos")) return -1;
|
||||||
|
if (b.name.includes("Narcos")) return 1;
|
||||||
|
if (a.name.includes("Thanatos")) return -1;
|
||||||
|
if (b.name.includes("Thanatos")) return 1;
|
||||||
|
return a.name.localeCompare(b.name);
|
||||||
|
}
|
||||||
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.name.includes("Corps")) return -1;
|
|
||||||
if (b.name.includes("Corps")) return 1;
|
|
||||||
if (a.name.includes("Dague")) return -1;
|
|
||||||
if (b.name.includes("Dague")) return 1;
|
|
||||||
if (a.name.includes("Esquive")) return -1;
|
|
||||||
if (b.name.includes("Esquive")) return 1;
|
|
||||||
return a.name.localeCompare(b.name);
|
|
||||||
}
|
|
||||||
if (a.name.startsWith("Voie") && b.name.startsWith("Voie")) {
|
|
||||||
if (a.name.includes("Oniros")) return -1;
|
|
||||||
if (b.name.includes("Oniros")) return 1;
|
|
||||||
if (a.name.includes("Hypnos")) return -1;
|
|
||||||
if (b.name.includes("Hypnos")) return 1;
|
|
||||||
if (a.name.includes("Narcos")) return -1;
|
|
||||||
if (b.name.includes("Narcos")) return 1;
|
|
||||||
if (a.name.includes("Thanatos")) return -1;
|
|
||||||
if (b.name.includes("Thanatos")) return 1;
|
|
||||||
return a.name.localeCompare(b.name);
|
|
||||||
}
|
|
||||||
return a.name.localeCompare(b.name);
|
|
||||||
}));
|
|
||||||
|
|
||||||
return loadTemplates(templatePaths);
|
return loadTemplates(templatePaths);
|
||||||
}
|
}
|
||||||
@ -326,8 +335,8 @@ export class RdDUtility {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static checkNull(items) {
|
static arrayOrEmpty(items) {
|
||||||
if (items && items.length) {
|
if (items?.length) {
|
||||||
return items;
|
return items;
|
||||||
}
|
}
|
||||||
return [];
|
return [];
|
||||||
@ -360,44 +369,44 @@ export class RdDUtility {
|
|||||||
|
|
||||||
RdDUtility.filterEquipementParType(formData);
|
RdDUtility.filterEquipementParType(formData);
|
||||||
|
|
||||||
formData.sorts = this.checkNull(formData.itemsByType['sort']);
|
formData.sorts = this.arrayOrEmpty(formData.itemsByType['sort']);
|
||||||
formData.signesdraconiques = this.checkNull(formData.itemsByType['signedraconique']);
|
formData.signesdraconiques = this.arrayOrEmpty(formData.itemsByType['signedraconique']);
|
||||||
formData.queues = this.checkNull(formData.itemsByType['queue']);
|
formData.queues = this.arrayOrEmpty(formData.itemsByType['queue']);
|
||||||
formData.souffles = this.checkNull(formData.itemsByType['souffle']);
|
formData.souffles = this.arrayOrEmpty(formData.itemsByType['souffle']);
|
||||||
formData.ombres = this.checkNull(formData.itemsByType['ombre']);
|
formData.ombres = this.arrayOrEmpty(formData.itemsByType['ombre']);
|
||||||
formData.tetes = this.checkNull(formData.itemsByType['tete']);
|
formData.tetes = this.arrayOrEmpty(formData.itemsByType['tete']);
|
||||||
formData.taches = this.checkNull(formData.itemsByType['tache']);
|
formData.taches = this.arrayOrEmpty(formData.itemsByType['tache']);
|
||||||
formData.meditations = this.checkNull(formData.itemsByType['meditation']);
|
formData.meditations = this.arrayOrEmpty(formData.itemsByType['meditation']);
|
||||||
formData.chants = this.checkNull(formData.itemsByType['chant']);
|
formData.chants = this.arrayOrEmpty(formData.itemsByType['chant']);
|
||||||
formData.danses = this.checkNull(formData.itemsByType['danse']);
|
formData.danses = this.arrayOrEmpty(formData.itemsByType['danse']);
|
||||||
formData.musiques = this.checkNull(formData.itemsByType['musique']);
|
formData.musiques = this.arrayOrEmpty(formData.itemsByType['musique']);
|
||||||
formData.oeuvres = this.checkNull(formData.itemsByType['oeuvre']);
|
formData.oeuvres = this.arrayOrEmpty(formData.itemsByType['oeuvre']);
|
||||||
formData.jeux = this.checkNull(formData.itemsByType['jeu']);
|
formData.jeux = this.arrayOrEmpty(formData.itemsByType['jeu']);
|
||||||
|
|
||||||
formData.recettescuisine = this.checkNull(formData.itemsByType['recettecuisine']);
|
formData.recettescuisine = this.arrayOrEmpty(formData.itemsByType['recettecuisine']);
|
||||||
formData.recettesAlchimiques = this.checkNull(formData.itemsByType['recettealchimique']);
|
formData.recettesAlchimiques = this.arrayOrEmpty(formData.itemsByType['recettealchimique']);
|
||||||
formData.maladies = this.checkNull(formData.itemsByType['maladie']);
|
formData.maladies = this.arrayOrEmpty(formData.itemsByType['maladie']);
|
||||||
formData.poisons = this.checkNull(formData.itemsByType['poison']);
|
formData.poisons = this.arrayOrEmpty(formData.itemsByType['poison']);
|
||||||
formData.possessions = this.checkNull(formData.itemsByType['possession']);
|
formData.possessions = this.arrayOrEmpty(formData.itemsByType['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 = (formData.itemsByType.competence ?? []).concat(formData.itemsByType.competencecreature ?? []);
|
||||||
}
|
}
|
||||||
|
|
||||||
static filterEquipementParType(formData) {
|
static filterEquipementParType(formData) {
|
||||||
formData.conteneurs = this.checkNull(formData.itemsByType['conteneur']);
|
formData.conteneurs = this.arrayOrEmpty(formData.itemsByType['conteneur']);
|
||||||
|
|
||||||
formData.materiel = this.checkNull(formData.itemsByType['objet']);
|
formData.materiel = this.arrayOrEmpty(formData.itemsByType['objet']);
|
||||||
formData.armes = this.checkNull(formData.itemsByType['arme']);
|
formData.armes = this.arrayOrEmpty(formData.itemsByType['arme']);
|
||||||
formData.armures = this.checkNull(formData.itemsByType['armure']);
|
formData.armures = this.arrayOrEmpty(formData.itemsByType['armure']);
|
||||||
formData.munitions = this.checkNull(formData.itemsByType['munition']);
|
formData.munitions = this.arrayOrEmpty(formData.itemsByType['munition']);
|
||||||
formData.livres = this.checkNull(formData.itemsByType['livre']);
|
formData.livres = this.arrayOrEmpty(formData.itemsByType['livre']);
|
||||||
formData.potions = this.checkNull(formData.itemsByType['potion']);
|
formData.potions = this.arrayOrEmpty(formData.itemsByType['potion']);
|
||||||
formData.ingredients = this.checkNull(formData.itemsByType['ingredient']);
|
formData.ingredients = this.arrayOrEmpty(formData.itemsByType['ingredient']);
|
||||||
formData.herbes = this.checkNull(formData.itemsByType['herbe']);
|
formData.herbes = this.arrayOrEmpty(formData.itemsByType['herbe']);
|
||||||
formData.monnaie = this.checkNull(formData.itemsByType['monnaie']);
|
formData.monnaie = this.arrayOrEmpty(formData.itemsByType['monnaie']);
|
||||||
formData.monnaie.sort(Monnaie.triValeurDenier());
|
formData.monnaie.sort(Monnaie.triValeurDenier());
|
||||||
formData.nourritureboissons = this.checkNull(formData.itemsByType['nourritureboisson']);
|
formData.nourritureboissons = this.arrayOrEmpty(formData.itemsByType['nourritureboisson']);
|
||||||
formData.gemmes = this.checkNull(formData.itemsByType['gemme']);
|
formData.gemmes = this.arrayOrEmpty(formData.itemsByType['gemme']);
|
||||||
|
|
||||||
formData.objets = formData.conteneurs
|
formData.objets = formData.conteneurs
|
||||||
.concat(formData.materiel)
|
.concat(formData.materiel)
|
||||||
@ -462,34 +471,32 @@ export class RdDUtility {
|
|||||||
/** Construit la structure récursive des conteneurs, avec imbrication potentielle
|
/** Construit la structure récursive des conteneurs, avec imbrication potentielle
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
static buildConteneur(objet, niveau) {
|
static buildConteneur(objet, profondeur) {
|
||||||
if (!niveau) niveau = 1;
|
if (!profondeur) profondeur = 1;
|
||||||
objet.niveau = niveau;
|
objet.niveau = profondeur;
|
||||||
//console.log("OBJ:", objet);
|
const isConteneur = objet.type == 'conteneur';
|
||||||
let str = Handlebars.partials['systems/foundryvtt-reve-de-dragon/templates/actor-sheet-inventaire-conteneur.html']({ item: objet });
|
const isOuvert = isConteneur && this.getAfficheContenu(objet._id);
|
||||||
if (objet.type == 'conteneur') {
|
const isVide = isConteneur && Misc.templateData(objet).contenu.length == 0;
|
||||||
const afficherContenu = this.getAfficheContenu(objet._id);
|
const conteneur = Handlebars.partials['systems/foundryvtt-reve-de-dragon/templates/actor-sheet-inventaire-item.html']({
|
||||||
str = str + RdDUtility.buildContenu(objet, niveau, afficherContenu);
|
item: objet,
|
||||||
}
|
vide: isVide,
|
||||||
return str;
|
ouvert: isOuvert
|
||||||
|
});
|
||||||
|
const contenu = isConteneur ? RdDUtility.buildContenu(objet, profondeur, isOuvert) : '';
|
||||||
|
return conteneur + contenu;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static buildContenu(objet, niveau, afficherContenu) {
|
static buildContenu(objet, profondeur, afficherContenu) {
|
||||||
if (!niveau) niveau = 1;
|
if (!profondeur) profondeur = 1;
|
||||||
objet.niveau = niveau;
|
objet.niveau = profondeur;
|
||||||
let strContenu = "";
|
const display = afficherContenu ? 'item-display-show' : 'item-display-hide';
|
||||||
//console.log("ITEM DISPLAYED", objet );
|
//console.log("ITEM DISPLAYED", objet );
|
||||||
if (afficherContenu) {
|
let strContenu = `<ul class='item-list alterne-list ${display} list-item-margin${profondeur}'>`;
|
||||||
strContenu = "<ul class='item-list alterne-list item-display-show list-item-margin" + niveau + "'>";
|
|
||||||
} else {
|
|
||||||
strContenu = "<ul class='item-list alterne-list item-display-hide list-item-margin" + niveau + "'>";
|
|
||||||
}
|
|
||||||
for (let subItem of objet.subItems) {
|
for (let subItem of objet.subItems) {
|
||||||
strContenu = strContenu + this.buildConteneur(subItem, niveau + 1);
|
strContenu += this.buildConteneur(subItem, profondeur + 1);
|
||||||
}
|
}
|
||||||
strContenu = strContenu + "</ul>";
|
return strContenu + "</ul>";
|
||||||
return strContenu;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
@ -666,7 +673,7 @@ export class RdDUtility {
|
|||||||
case "msg_tmr_move":
|
case "msg_tmr_move":
|
||||||
let actor = game.actors.get(sockmsg.data.actorId);
|
let actor = game.actors.get(sockmsg.data.actorId);
|
||||||
if (actor.isOwner || game.user.isGM) {
|
if (actor.isOwner || game.user.isGM) {
|
||||||
actor.refreshTMRView(sockmsg.data.tmrPos);
|
actor.refreshTMRView();
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -681,7 +688,7 @@ export class RdDUtility {
|
|||||||
let coord = event.currentTarget.attributes['data-tmr-coord'].value;
|
let coord = event.currentTarget.attributes['data-tmr-coord'].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.forceDemiRevePosition(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", '#sort-reserve', event => {
|
||||||
@ -692,7 +699,7 @@ export class RdDUtility {
|
|||||||
actor.tmrApp.lancerSortEnReserve(coord, sortId);
|
actor.tmrApp.lancerSortEnReserve(coord, sortId);
|
||||||
});
|
});
|
||||||
|
|
||||||
// gestion bouton tchat Acheter
|
// gestion bouton tchat Possession
|
||||||
html.on("click", '.defense-possession', event => {
|
html.on("click", '.defense-possession', event => {
|
||||||
let attackerId = event.currentTarget.attributes['data-attackerId'].value
|
let attackerId = event.currentTarget.attributes['data-attackerId'].value
|
||||||
let defenderId = event.currentTarget.attributes['data-defenderId'].value
|
let defenderId = event.currentTarget.attributes['data-defenderId'].value
|
||||||
@ -702,6 +709,7 @@ export class RdDUtility {
|
|||||||
|
|
||||||
// gestion bouton tchat Acheter
|
// gestion bouton tchat Acheter
|
||||||
html.on("click", '.button-acheter', event => DialogItemAchat.onButtonAcheter(event));
|
html.on("click", '.button-acheter', event => DialogItemAchat.onButtonAcheter(event));
|
||||||
|
html.on("click", '.button-creer-acteur', event => RdDNameGen.onCreerActeur(event));
|
||||||
|
|
||||||
// Gestion du bouton payer
|
// Gestion du bouton payer
|
||||||
html.on("click", '.payer-button', event => {
|
html.on("click", '.payer-button', event => {
|
||||||
|
@ -8,9 +8,14 @@ import { TMRType } from "./tmr-utility.js";
|
|||||||
const typeRencontres = {
|
const typeRencontres = {
|
||||||
|
|
||||||
messager: {
|
messager: {
|
||||||
msgSucces: (rencData) => `Le ${rencData.rencontre.name} vous propose d'emmener le message de votre un sort à ${rencData.rencontre.force} cases ${rencData.tmr.label}.`,
|
msgSucces: async (rencData) => {
|
||||||
msgEchec: (rencData) => `Le ${rencData.rencontre.name} est pressé et continue son chemin d'une traite sans vous accorder un regard.`,
|
if (rencData.actor.isTMRCache()){
|
||||||
postSucces: (tmrDialog, rencData) => {
|
return `Le ${rencData.rencontre.name} vous propose d'emmener le message de votre un sort, mais vous ne savez pas où vous êtes.`;
|
||||||
|
}
|
||||||
|
return `Le ${rencData.rencontre.name} vous propose d'emmener le message de votre un sort à ${rencData.rencontre.force} cases ${rencData.tmr.label}.`;
|
||||||
|
},
|
||||||
|
msgEchec: async (rencData)=> `Le ${rencData.rencontre.name} est pressé et continue son chemin d'une traite sans vous accorder un regard.`,
|
||||||
|
postSucces: async (tmrDialog, rencData) => {
|
||||||
tmrDialog.setStateRencontre(rencData.rencontre.type);
|
tmrDialog.setStateRencontre(rencData.rencontre.type);
|
||||||
tmrDialog.choisirCasePortee(rencData.tmr.coord, rencData.rencontre.force);
|
tmrDialog.choisirCasePortee(rencData.tmr.coord, rencData.rencontre.force);
|
||||||
},
|
},
|
||||||
@ -28,9 +33,14 @@ const typeRencontres = {
|
|||||||
},
|
},
|
||||||
|
|
||||||
passeur: {
|
passeur: {
|
||||||
msgSucces: (rencData) => `Le ${rencData.rencontre.name} vous propose de vous transporter à ${rencData.rencontre.force} cases des ${rencData.tmr.label}.`,
|
msgSucces: async (rencData) => {
|
||||||
msgEchec: (rencData) => `Le prix que demande le ${rencData.rencontre.name} est trop élevé, vous êtes réduit à poursuivre votre chemin par vos propres moyens.`,
|
if (rencData.actor.isTMRCache()){
|
||||||
postSucces: (tmrDialog, rencData) => {
|
return `Le ${rencData.rencontre.name} vous propose de vous transporter, mais vous ne savez pas où vous êtes.`;
|
||||||
|
}
|
||||||
|
return `Le ${rencData.rencontre.name} vous propose de vous transporter à ${rencData.rencontre.force} cases des ${rencData.tmr.label}.`;
|
||||||
|
},
|
||||||
|
msgEchec: async (rencData)=> `Le prix que demande le ${rencData.rencontre.name} est trop élevé, vous êtes réduit à poursuivre votre chemin par vos propres moyens.`,
|
||||||
|
postSucces: async (tmrDialog, rencData) => {
|
||||||
tmrDialog.setStateRencontre(rencData.rencontre.type);
|
tmrDialog.setStateRencontre(rencData.rencontre.type);
|
||||||
tmrDialog.choisirCasePortee(rencData.tmr.coord, rencData.rencontre.force);
|
tmrDialog.choisirCasePortee(rencData.tmr.coord, rencData.rencontre.force);
|
||||||
},
|
},
|
||||||
@ -49,9 +59,9 @@ const typeRencontres = {
|
|||||||
},
|
},
|
||||||
|
|
||||||
fleur: {
|
fleur: {
|
||||||
msgSucces: (rencData) => `Vous cueillez la ${rencData.rencontre.name}, son parfum vous apporte ${rencData.rencontre.force} points de Rêve.`,
|
msgSucces: async (rencData) => `Vous cueillez la ${rencData.rencontre.name}, son parfum vous apporte ${rencData.rencontre.force} points de Rêve.`,
|
||||||
msgEchec: (rencData) => `La ${rencData.rencontre.name} se fâne et disparaît entre vos doigts.`,
|
msgEchec: async (rencData)=> `La ${rencData.rencontre.name} se fâne et disparaît entre vos doigts.`,
|
||||||
postSucces: (tmrDialog, rencData) => tmrDialog.actor.reveActuelIncDec(rencData.rencontre.force),
|
postSucces: async (tmrDialog, rencData) => tmrDialog.actor.reveActuelIncDec(rencData.rencontre.force),
|
||||||
poesieSucces: {
|
poesieSucces: {
|
||||||
reference: "L'Ennemi, Charles Baudelaire",
|
reference: "L'Ennemi, Charles Baudelaire",
|
||||||
extrait: `Et qui sait si les fleurs nouvelles que je rêve
|
extrait: `Et qui sait si les fleurs nouvelles que je rêve
|
||||||
@ -66,9 +76,9 @@ const typeRencontres = {
|
|||||||
},
|
},
|
||||||
|
|
||||||
mangeur: {
|
mangeur: {
|
||||||
msgSucces: (rencData) => `Le ${rencData.rencontre.name} claque de sa machoire dans le vide avant de fuir.`,
|
msgSucces: async (rencData) => `Le ${rencData.rencontre.name} claque de sa machoire dans le vide avant de fuir.`,
|
||||||
msgEchec: (rencData) => `Le ${rencData.rencontre.name} croque votre Rêve ! Il emporte ${rencData.rencontre.force} de vos points de rêve actuels`,
|
msgEchec: async (rencData)=> `Le ${rencData.rencontre.name} croque votre Rêve ! Il emporte ${rencData.rencontre.force} de vos points de rêve actuels`,
|
||||||
postEchec: (tmrDialog, rencData) => tmrDialog.actor.reveActuelIncDec(-rencData.rencontre.force),
|
postEchec: async (tmrDialog, rencData) => tmrDialog.actor.reveActuelIncDec(-rencData.rencontre.force),
|
||||||
poesieSucces: {
|
poesieSucces: {
|
||||||
reference: "Conseil, Victor Hugo",
|
reference: "Conseil, Victor Hugo",
|
||||||
extrait: `Rois ! la bure est souvent jalouse du velours.
|
extrait: `Rois ! la bure est souvent jalouse du velours.
|
||||||
@ -85,16 +95,17 @@ const typeRencontres = {
|
|||||||
},
|
},
|
||||||
|
|
||||||
changeur: {
|
changeur: {
|
||||||
msgSucces: (rencData) => `Le ${rencData.rencontre.name} vaincu accepte de vous déplacer sur une autre ${TMRType[rencData.tmr.type].name} de votre choix en échange de sa liberté.`,
|
msgSucces: async (rencData) => `Le ${rencData.rencontre.name} vaincu accepte de vous déplacer sur une autre ${TMRType[rencData.tmr.type].name} de votre choix en échange de sa liberté.`,
|
||||||
msgEchec: (rencData) => {
|
msgEchec: async (rencData) => `Le ${rencData.rencontre.name} vous embobine avec des promesses, et vous transporte sur une autre ${TMRType[rencData.tmr.type].name} sans attendre votre avis.`,
|
||||||
rencData.newTMR = TMRUtility.getTMRAleatoire(it => it.type = rencData.tmr.type);
|
postSucces: async (tmrDialog, rencData) => {
|
||||||
return `Le ${rencData.rencontre.name} vous embobine avec des promesses, et vous transporte en ${rencData.newTMR.label} sans attendre votre avis.`;
|
|
||||||
},
|
|
||||||
postSucces: (tmrDialog, rencData) => {
|
|
||||||
tmrDialog.setStateRencontre(rencData.rencontre.type);
|
tmrDialog.setStateRencontre(rencData.rencontre.type);
|
||||||
tmrDialog.choisirCaseType(rencData.tmr.type);
|
tmrDialog.choisirCaseType(rencData.tmr.type);
|
||||||
},
|
},
|
||||||
postEchec: (tmrDialog, rencData) => tmrDialog.forceDemiRevePosition(rencData.newTMR.coord),
|
postEchec: async (tmrDialog, rencData) => {
|
||||||
|
const newTMR = await TMRUtility.getTMRAleatoire(it => it.type == rencData.tmr.type && it.coord != rencData.tmr.coord);
|
||||||
|
await tmrDialog.actor.forcerPositionTMRInconnue(newTMR);
|
||||||
|
tmrDialog.positionnerDemiReve(newTMR.coord);
|
||||||
|
},
|
||||||
poesieSucces: {
|
poesieSucces: {
|
||||||
reference: "Caligula - IIIème chant, Gérard de Nerval",
|
reference: "Caligula - IIIème chant, Gérard de Nerval",
|
||||||
extrait: `Allez, que le caprice emporte
|
extrait: `Allez, que le caprice emporte
|
||||||
@ -111,9 +122,9 @@ const typeRencontres = {
|
|||||||
},
|
},
|
||||||
|
|
||||||
briseur: {
|
briseur: {
|
||||||
msgSucces: (rencData) => `Le ${rencData.rencontre.name} tente vainement de vous déconcentrer, avant de fuir sans demander son reste.`,
|
msgSucces: async (rencData) => `Le ${rencData.rencontre.name} tente vainement de vous déconcentrer, avant de fuir sans demander son reste.`,
|
||||||
msgEchec: (rencData) => `Le ${rencData.rencontre.name} vous déconcentre au point de briser votre demi-rêve.`,
|
msgEchec: async (rencData)=> `Le ${rencData.rencontre.name} vous déconcentre au point de briser votre demi-rêve.`,
|
||||||
postEchec: (tmrDialog, rencData) => tmrDialog.close(),
|
postEchec: async (tmrDialog, rencData) => tmrDialog.close(),
|
||||||
poesieSucces: {
|
poesieSucces: {
|
||||||
reference: "Rêve de Dragon, Denis Gerfaud",
|
reference: "Rêve de Dragon, Denis Gerfaud",
|
||||||
extrait: `La légende affirme que ce sont les Gnomes qui furent
|
extrait: `La légende affirme que ce sont les Gnomes qui furent
|
||||||
@ -134,8 +145,8 @@ const typeRencontres = {
|
|||||||
},
|
},
|
||||||
|
|
||||||
reflet: {
|
reflet: {
|
||||||
msgSucces: (rencData) => `Le ${rencData.rencontre.name} s'estompe dans l'oubli.`,
|
msgSucces: async (rencData) => `Le ${rencData.rencontre.name} s'estompe dans l'oubli.`,
|
||||||
msgEchec: (rencData) => `Vous êtes submergé par un ${rencData.rencontre.name}, les souvenirs vous retiennent tant qu'il ne sera pas vaincu!`,
|
msgEchec: async (rencData)=> `Vous êtes submergé par un ${rencData.rencontre.name}, les souvenirs vous retiennent tant qu'il ne sera pas vaincu!`,
|
||||||
poesieSucces: {
|
poesieSucces: {
|
||||||
reference: "Une charogne, Charles Baudelaire",
|
reference: "Une charogne, Charles Baudelaire",
|
||||||
extrait: `Les formes s'effaçaient et n'étaient plus qu'un rêve,
|
extrait: `Les formes s'effaçaient et n'étaient plus qu'un rêve,
|
||||||
@ -152,9 +163,9 @@ const typeRencontres = {
|
|||||||
},
|
},
|
||||||
|
|
||||||
passeurfou: {
|
passeurfou: {
|
||||||
msgSucces: (rencData) => `Le ${rencData.rencontre.name} tente vainement de découvrir où vous avez caché vos réserves. Vous le chassez, et en déroute il part harceler un autre voyageur du rêve.`,
|
msgSucces: async (rencData) => `Le ${rencData.rencontre.name} tente vainement de découvrir où vous avez caché vos réserves. Vous le chassez, et en déroute il part harceler un autre voyageur du rêve.`,
|
||||||
msgEchec: (rencData) => TMRRencontres.msgEchecPasseurFou(rencData),
|
msgEchec: async (rencData)=> TMRRencontres.msgEchecPasseurFou(rencData),
|
||||||
postEchec: (tmrDialog, rencData) => TMRRencontres.postEchecPasseurFou(tmrDialog, rencData),
|
postEchec: async (tmrDialog, rencData) => TMRRencontres.postEchecPasseurFou(tmrDialog, rencData),
|
||||||
poesieSucces: {
|
poesieSucces: {
|
||||||
reference: "Un Fou et un Sage, Jean de La Fontaine",
|
reference: "Un Fou et un Sage, Jean de La Fontaine",
|
||||||
extrait: `Certain Fou poursuivait à coups de pierre un Sage.
|
extrait: `Certain Fou poursuivait à coups de pierre un Sage.
|
||||||
@ -174,9 +185,9 @@ const typeRencontres = {
|
|||||||
},
|
},
|
||||||
|
|
||||||
tbblanc: {
|
tbblanc: {
|
||||||
msgSucces: (rencData) => `Le ${rencData.rencontre.name} souleve une poussière blanche, vous tenez bon, et il tourbillonne en s'éloignant.`,
|
msgSucces: async (rencData) => `Le ${rencData.rencontre.name} souleve une poussière blanche, vous tenez bon, et il tourbillonne en s'éloignant.`,
|
||||||
msgEchec: (rencData) => `Le souffle du ${rencData.rencontre.name} vous déstabilise et vous emmène dans un nuage de poussière.`,
|
msgEchec: async (rencData)=> `Le souffle du ${rencData.rencontre.name} vous déstabilise et vous emmène dans un nuage de poussière.`,
|
||||||
postEchec: (tmrDialog, rencData) => TMRRencontres.onPostEchecTourbillon(tmrDialog, rencData, 1),
|
postEchec: async (tmrDialog, rencData) => TMRRencontres.onPostEchecTourbillon(tmrDialog, rencData, 1),
|
||||||
poesieSucces: {
|
poesieSucces: {
|
||||||
reference: "Rêve de Dragon, Denis Gerfaud",
|
reference: "Rêve de Dragon, Denis Gerfaud",
|
||||||
extrait: `Le Premier Âge fut appelé l'Âge des Dragons. Ce fut le commencement
|
extrait: `Le Premier Âge fut appelé l'Âge des Dragons. Ce fut le commencement
|
||||||
@ -191,9 +202,9 @@ const typeRencontres = {
|
|||||||
},
|
},
|
||||||
|
|
||||||
tbnoir: {
|
tbnoir: {
|
||||||
msgSucces: (rencData) => `Le ${rencData.rencontre.name} orageux vous enveloppe de fureur et d'éclairs, vous tenez bon face à la tempête qui s'éloigne sans vous éloigner de votre chemin.`,
|
msgSucces: async (rencData) => `Le ${rencData.rencontre.name} orageux vous enveloppe de fureur et d'éclairs, vous tenez bon face à la tempête qui s'éloigne sans vous éloigner de votre chemin.`,
|
||||||
msgEchec: (rencData) => `Le ${rencData.rencontre.name} furieux vous secoue tel un fichu de paille malmené par les vents, et vous emporte dans la tourmente.`,
|
msgEchec: async (rencData)=> `Le ${rencData.rencontre.name} furieux vous secoue tel un fichu de paille malmené par les vents, et vous emporte dans la tourmente.`,
|
||||||
postEchec: (tmrDialog, rencData) => TMRRencontres.onPostEchecTourbillon(tmrDialog, rencData, 2),
|
postEchec: async (tmrDialog, rencData) => TMRRencontres.onPostEchecTourbillon(tmrDialog, rencData, 2),
|
||||||
poesieSucces: {
|
poesieSucces: {
|
||||||
reference: "Rêve de Dragon, Denis Gerfaud",
|
reference: "Rêve de Dragon, Denis Gerfaud",
|
||||||
extrait: `Car le Second Âge fut bel et bien celui des Magiciens. Durant cette période, les
|
extrait: `Car le Second Âge fut bel et bien celui des Magiciens. Durant cette période, les
|
||||||
@ -207,9 +218,9 @@ const typeRencontres = {
|
|||||||
},
|
},
|
||||||
|
|
||||||
tbrouge: {
|
tbrouge: {
|
||||||
msgSucces: (rencData) => `Le ${rencData.rencontre.name} s'abat avec violence mais vous êtes plus rapide et parvenez à lui échapper.`,
|
msgSucces: async (rencData) => `Le ${rencData.rencontre.name} s'abat avec violence mais vous êtes plus rapide et parvenez à lui échapper.`,
|
||||||
msgEchec: (rencData) => `Le ${rencData.rencontre.name} vous frappe de milliers de morsure et vous malmène à travers les terres médianes.`,
|
msgEchec: async (rencData)=> `Le ${rencData.rencontre.name} vous frappe de milliers de morsure et vous malmène à travers les terres médianes.`,
|
||||||
postEchec: (tmrDialog, rencData) => TMRRencontres.onPostEchecTourbillonRouge(tmrDialog, rencData),
|
postEchec: async (tmrDialog, rencData) => TMRRencontres.onPostEchecTourbillonRouge(tmrDialog, rencData),
|
||||||
poesieSucces: {
|
poesieSucces: {
|
||||||
reference: "Qu'est-ce de votre vie ? une bouteille molle, Jean-Baptiste Chassignet",
|
reference: "Qu'est-ce de votre vie ? une bouteille molle, Jean-Baptiste Chassignet",
|
||||||
extrait: `Qu'est-ce de votre vie ? un tourbillon rouant
|
extrait: `Qu'est-ce de votre vie ? un tourbillon rouant
|
||||||
@ -228,10 +239,10 @@ const typeRencontres = {
|
|||||||
},
|
},
|
||||||
|
|
||||||
rdd: {
|
rdd: {
|
||||||
msgSucces: (rencData) => `A tout seigneur, tout honneur, vous faites face à un ${rencData.rencontre.name}. Vous le maîtrisez et récupérez ses rêves. Vous gagnez ses ${rencData.rencontre.force} points de rêve`,
|
msgSucces: async (rencData) => `A tout seigneur, tout honneur, vous faites face à un ${rencData.rencontre.name}. Vous le maîtrisez et récupérez ses rêves. Vous gagnez ses ${rencData.rencontre.force} points de rêve`,
|
||||||
msgEchec: (rencData) => `A tout seigneur, tout honneur, vous faites face à un ${rencData.rencontre.name}. La rencontre tourne au cauchemar, dans la lutte épique, vous subissez ${rencData.rolled.isETotal ? 'deux queues' : 'une queue'} de dragon!`,
|
msgEchec: async (rencData)=> `A tout seigneur, tout honneur, vous faites face à un ${rencData.rencontre.name}. La rencontre tourne au cauchemar, dans la lutte épique, vous subissez ${rencData.rolled.isETotal ? 'deux queues' : 'une queue'} de dragon!`,
|
||||||
postSucces: (tmrDialog, rencData) => TMRRencontres.onPostSuccessReveDeDragon(tmrDialog, rencData),
|
postSucces: async (tmrDialog, rencData) => TMRRencontres.onPostSuccessReveDeDragon(tmrDialog, rencData),
|
||||||
postEchec: (tmrDialog, rencData) => TMRRencontres.onPostEchecReveDeDragon(tmrDialog, rencData),
|
postEchec: async (tmrDialog, rencData) => TMRRencontres.onPostEchecReveDeDragon(tmrDialog, rencData),
|
||||||
poesieSucces: {
|
poesieSucces: {
|
||||||
reference: "Rêve de Dragon, Denis Gerfaud",
|
reference: "Rêve de Dragon, Denis Gerfaud",
|
||||||
extrait: `Le monde est Rêve de Dragons, mais nous ne savons
|
extrait: `Le monde est Rêve de Dragons, mais nous ne savons
|
||||||
@ -404,7 +415,7 @@ export class TMRRencontres {
|
|||||||
static async gererRencontre(tmrDialog, rencData) {
|
static async gererRencontre(tmrDialog, rencData) {
|
||||||
let gestion = TMRRencontres.getGestionRencontre(rencData.rencontre.type);
|
let gestion = TMRRencontres.getGestionRencontre(rencData.rencontre.type);
|
||||||
if (rencData.rolled.isSuccess) {
|
if (rencData.rolled.isSuccess) {
|
||||||
rencData.message = gestion.msgSucces(rencData);
|
rencData.message = await gestion.msgSucces(rencData);
|
||||||
if (rencData.nbRounds > 1) {
|
if (rencData.nbRounds > 1) {
|
||||||
rencData.message += ` Au total, vous avez passé ${rencData.nbRounds} rounds à vous battre!`;
|
rencData.message += ` Au total, vous avez passé ${rencData.nbRounds} rounds à vous battre!`;
|
||||||
}
|
}
|
||||||
@ -412,7 +423,7 @@ export class TMRRencontres {
|
|||||||
return gestion.postSucces;
|
return gestion.postSucces;
|
||||||
}
|
}
|
||||||
|
|
||||||
rencData.message = gestion.msgEchec(rencData);
|
rencData.message = await gestion.msgEchec(rencData);
|
||||||
if (rencData.nbRounds > 1) {
|
if (rencData.nbRounds > 1) {
|
||||||
rencData.message += ` Vous avez passé ${rencData.nbRounds} rounds à lutter!`;
|
rencData.message += ` Vous avez passé ${rencData.nbRounds} rounds à lutter!`;
|
||||||
}
|
}
|
||||||
@ -444,7 +455,7 @@ export class TMRRencontres {
|
|||||||
if (tmrData.sortReserve) {
|
if (tmrData.sortReserve) {
|
||||||
await tmrDialog.processSortReserve(tmrData.sortReserve);
|
await tmrDialog.processSortReserve(tmrData.sortReserve);
|
||||||
}
|
}
|
||||||
await tmrDialog.forceDemiRevePosition(tmrData.newTMR.coord);
|
await tmrDialog.positionnerDemiReve(tmrData.newTMR.coord);
|
||||||
if (tmrData.sortReserve) {
|
if (tmrData.sortReserve) {
|
||||||
tmrDialog.close();
|
tmrDialog.close();
|
||||||
}
|
}
|
||||||
@ -469,7 +480,7 @@ export class TMRRencontres {
|
|||||||
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;
|
||||||
}
|
}
|
||||||
await tmrDialog.forceDemiRevePosition(coord)
|
await tmrDialog.positionnerDemiReve(coord)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
|
@ -2,7 +2,6 @@ import { TMRRencontres } from "./tmr-rencontres.js";
|
|||||||
import { Misc } from "./misc.js";
|
import { Misc } from "./misc.js";
|
||||||
import { Grammar } from "./grammar.js";
|
import { Grammar } from "./grammar.js";
|
||||||
import { RdDDice } from "./rdd-dice.js";
|
import { RdDDice } from "./rdd-dice.js";
|
||||||
import { tmrConstants } from "./tmr-constants.js";
|
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
const TMRMapping = {
|
const TMRMapping = {
|
||||||
@ -12,7 +11,7 @@ const TMRMapping = {
|
|||||||
D1: { type: "fleuve", label: "Fleuve de l'Oubli" },
|
D1: { type: "fleuve", label: "Fleuve de l'Oubli" },
|
||||||
E1: { type: "monts", label: "Monts de Kanaï" },
|
E1: { type: "monts", label: "Monts de Kanaï" },
|
||||||
F1: { type: "cite", label: "Cité Glauque" },
|
F1: { type: "cite", label: "Cité Glauque" },
|
||||||
G1: { type: "desolation", label: "Désolation de Demain" },
|
G1: { type: "desolation", label: "Désolation de Jamais" },
|
||||||
H1: { type: "lac", label: "Lac d’Anticalme" },
|
H1: { type: "lac", label: "Lac d’Anticalme" },
|
||||||
I1: { type: "plaines", label: "Plaines Grises" },
|
I1: { type: "plaines", label: "Plaines Grises" },
|
||||||
J1: { type: "monts", label: "Monts Fainéants" },
|
J1: { type: "monts", label: "Monts Fainéants" },
|
||||||
@ -70,7 +69,7 @@ const TMRMapping = {
|
|||||||
F5: { type: "cite", label: "Cité de Panople" },
|
F5: { type: "cite", label: "Cité de Panople" },
|
||||||
G5: { type: "pont", label: "Pont d’Ik" },
|
G5: { type: "pont", label: "Pont d’Ik" },
|
||||||
H5: { type: "desert", label: "Désert de Krane" },
|
H5: { type: "desert", label: "Désert de Krane" },
|
||||||
I5: { type: "desolation", label: "Désolation de Demain" },
|
I5: { type: "desolation", label: "Désolation de Toujours" },
|
||||||
J5: { type: "marais", label: "Marais de Jab" },
|
J5: { type: "marais", label: "Marais de Jab" },
|
||||||
K5: { type: "fleuve", label: "Fleuve de l'Oubli" },
|
K5: { type: "fleuve", label: "Fleuve de l'Oubli" },
|
||||||
L5: { type: "collines", label: "Collines Suaves" },
|
L5: { type: "collines", label: "Collines Suaves" },
|
||||||
@ -86,9 +85,9 @@ const TMRMapping = {
|
|||||||
H6: { type: "monts", label: "Monts Gurdes" },
|
H6: { type: "monts", label: "Monts Gurdes" },
|
||||||
I6: { type: "necropole", label: "Nécropole de Xotar" },
|
I6: { type: "necropole", label: "Nécropole de Xotar" },
|
||||||
J6: { type: "lac", label: "Lac d’Iaupe" },
|
J6: { type: "lac", label: "Lac d’Iaupe" },
|
||||||
K6: { type: "desolation", label: "Désolation de Demain" },
|
K6: { type: "desolation", label: "Désolation de Poor" },
|
||||||
L6: { type: "foret", label: "Forêt Gueuse" },
|
L6: { type: "foret", label: "Forêt Gueuse" },
|
||||||
M6: { type: "desolation", label: "Désolation de Demain" },
|
M6: { type: "desolation", label: "Désolation de Presque" },
|
||||||
|
|
||||||
A7: { type: "plaines", label: "Plaines de l’Arc" },
|
A7: { type: "plaines", label: "Plaines de l’Arc" },
|
||||||
B7: { type: "marais", label: "Marais Bluants" },
|
B7: { type: "marais", label: "Marais Bluants" },
|
||||||
@ -124,7 +123,7 @@ const TMRMapping = {
|
|||||||
D9: { type: "pont", label: "Pont d’Orx" },
|
D9: { type: "pont", label: "Pont d’Orx" },
|
||||||
E9: { type: "fleuve", label: "Fleuve de l'Oubli" },
|
E9: { type: "fleuve", label: "Fleuve de l'Oubli" },
|
||||||
F9: { type: "plaines", label: "Plaines de Foe" },
|
F9: { type: "plaines", label: "Plaines de Foe" },
|
||||||
G9: { type: "desolation", label: "Désolation de Demain" },
|
G9: { type: "desolation", label: "Désolation de Sel" },
|
||||||
H9: { type: "collines", label: "Collines de Noirseul" },
|
H9: { type: "collines", label: "Collines de Noirseul" },
|
||||||
I9: { type: "fleuve", label: "Fleuve de l'Oubli" },
|
I9: { type: "fleuve", label: "Fleuve de l'Oubli" },
|
||||||
J9: { type: "marais", label: "Marais Gronchants" },
|
J9: { type: "marais", label: "Marais Gronchants" },
|
||||||
@ -146,10 +145,10 @@ const TMRMapping = {
|
|||||||
L10: { type: "desert", label: "Désert de Nicrop" },
|
L10: { type: "desert", label: "Désert de Nicrop" },
|
||||||
M10: { type: "foret", label: "Forêt de Jajou" },
|
M10: { type: "foret", label: "Forêt de Jajou" },
|
||||||
|
|
||||||
A11: { type: "desolation", label: "Désolation de Demain" },
|
A11: { type: "desolation", label: "Désolation d’Hier" },
|
||||||
B11: { type: "cite", label: "Cité de Brilz" },
|
B11: { type: "cite", label: "Cité de Brilz" },
|
||||||
C11: { type: "pont", label: "Pont de Roï" },
|
C11: { type: "pont", label: "Pont de Roï" },
|
||||||
D11: { type: "desolation", label: "Désolation de Demain" },
|
D11: { type: "desolation", label: "Désolation de Partout" },
|
||||||
E11: { type: "lac", label: "Lac de Glinster" },
|
E11: { type: "lac", label: "Lac de Glinster" },
|
||||||
F11: { type: "cite", label: "Cité de Noape" },
|
F11: { type: "cite", label: "Cité de Noape" },
|
||||||
G11: { type: "fleuve", label: "Fleuve de l'Oubli" },
|
G11: { type: "fleuve", label: "Fleuve de l'Oubli" },
|
||||||
@ -170,7 +169,7 @@ const TMRMapping = {
|
|||||||
H12: { type: "collines", label: "Collines de Tooth" },
|
H12: { type: "collines", label: "Collines de Tooth" },
|
||||||
I12: { type: "gouffre", label: "Gouffre Abimeux" },
|
I12: { type: "gouffre", label: "Gouffre Abimeux" },
|
||||||
J12: { type: "cite", label: "Cité Folle" },
|
J12: { type: "cite", label: "Cité Folle" },
|
||||||
K12: { type: "desolation", label: "Désolation de Demain" },
|
K12: { type: "desolation", label: "Désolation d’Amour" },
|
||||||
L12: { type: "plaines", label: "Plaines Venteuses" },
|
L12: { type: "plaines", label: "Plaines Venteuses" },
|
||||||
M12: { type: "collines", label: "Collines Révulsantes" },
|
M12: { type: "collines", label: "Collines Révulsantes" },
|
||||||
|
|
||||||
@ -181,7 +180,7 @@ const TMRMapping = {
|
|||||||
E13: { type: "plaines", label: "Plaines de Xnez" },
|
E13: { type: "plaines", label: "Plaines de Xnez" },
|
||||||
F13: { type: "foret", label: "Forêt des Cris" },
|
F13: { type: "foret", label: "Forêt des Cris" },
|
||||||
G13: { type: "plaines", label: "Plaines Calcaires" },
|
G13: { type: "plaines", label: "Plaines Calcaires" },
|
||||||
H13: { type: "desolation", label: "Désolation de Demain" },
|
H13: { type: "desolation", label: "Désolation de Rien" },
|
||||||
I13: { type: "monts", label: "Monts Bigleux" },
|
I13: { type: "monts", label: "Monts Bigleux" },
|
||||||
J13: { type: "gouffre", label: "Gouffre de Gromph" },
|
J13: { type: "gouffre", label: "Gouffre de Gromph" },
|
||||||
K13: { type: "foret", label: "Forêt de Kluth" },
|
K13: { type: "foret", label: "Forêt de Kluth" },
|
||||||
@ -200,7 +199,7 @@ const TMRMapping = {
|
|||||||
J14: { type: "desert", label: "Désert de Sank" },
|
J14: { type: "desert", label: "Désert de Sank" },
|
||||||
K14: { type: "necropole", label: "Nécropole d’Antinéar" },
|
K14: { type: "necropole", label: "Nécropole d’Antinéar" },
|
||||||
L14: { type: "plaines", label: "Plaines de Jislith" },
|
L14: { type: "plaines", label: "Plaines de Jislith" },
|
||||||
M14: { type: "desolation", label: "Désolation de Demain" },
|
M14: { type: "desolation", label: "Désolation d’Après" },
|
||||||
|
|
||||||
A15: { type: "cite", label: "Cité de Mielh" },
|
A15: { type: "cite", label: "Cité de Mielh" },
|
||||||
C15: { type: "plaines", label: "Plaines de Toué" },
|
C15: { type: "plaines", label: "Plaines de Toué" },
|
||||||
|
@ -94,9 +94,8 @@ export class Draconique {
|
|||||||
token[type ?? this.code()] = linkData;
|
token[type ?? this.code()] = linkData;
|
||||||
pixiTMR.addTooltip(token.sprite, this.tooltip(linkData));
|
pixiTMR.addTooltip(token.sprite, this.tooltip(linkData));
|
||||||
return token;
|
return token;
|
||||||
|
|
||||||
return sprite;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* factory d'élément graphique PIXI correpsondant à l'objet draconique
|
* factory d'élément graphique PIXI correpsondant à l'objet draconique
|
||||||
* @param {*} pixiTMR instance de PixiTMR qui gère les tooltips, les méthodes de création de sprite standard, les clicks.
|
* @param {*} pixiTMR instance de PixiTMR qui gère les tooltips, les méthodes de création de sprite standard, les clicks.
|
||||||
|
@ -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, resaon) => { console.log("ERROR", error, resaon) });
|
loader.onLoad.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) {
|
||||||
|
@ -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","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":"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":"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","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":"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":"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","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":"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":"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","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":"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":"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","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":"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":"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","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":"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":"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","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":"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":"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":[]}
|
||||||
|
@ -66,6 +66,10 @@
|
|||||||
--debug-box-shadow-green: inset 0 0 2px green;
|
--debug-box-shadow-green: inset 0 0 2px green;
|
||||||
|
|
||||||
/* =================== 3. some constants ============ */
|
/* =================== 3. some constants ============ */
|
||||||
|
--color-controls:rgba(0, 0, 0, 0.9);
|
||||||
|
--color-controls-hover:rgba(255, 255, 128, 0.7);
|
||||||
|
--color-control-border-hover:rgba(255, 128, 0, 0.8);
|
||||||
|
--color-gold: rgba(191, 149, 63, 0.8);
|
||||||
--gradient-gold: linear-gradient(30deg, rgba(191, 149, 63, 0.3), rgba(252, 246, 186, 0.3), rgba(179, 135, 40, 0.3), rgba(251, 245, 183, 0.3), rgba(170, 119, 28, 0.3));
|
--gradient-gold: linear-gradient(30deg, rgba(191, 149, 63, 0.3), rgba(252, 246, 186, 0.3), rgba(179, 135, 40, 0.3), rgba(251, 245, 183, 0.3), rgba(170, 119, 28, 0.3));
|
||||||
--gradient-silver: linear-gradient(30deg, rgba(61, 55, 93, 0.3), rgba(178, 179, 196, 0.3), rgba(59, 62, 63, 0.6), rgba(206, 204, 199, 0.3), rgba(61, 46, 49, 0.3));
|
--gradient-silver: linear-gradient(30deg, rgba(61, 55, 93, 0.3), rgba(178, 179, 196, 0.3), rgba(59, 62, 63, 0.6), rgba(206, 204, 199, 0.3), rgba(61, 46, 49, 0.3));
|
||||||
--gradient-green: linear-gradient(30deg, rgba(7, 76, 0, 0.3), rgba(66, 163, 65, 0.2), rgba(184, 226, 163, 0.1), rgba(66, 163, 65, 0.2), rgba(184, 226, 163, 0.3));
|
--gradient-green: linear-gradient(30deg, rgba(7, 76, 0, 0.3), rgba(66, 163, 65, 0.2), rgba(184, 226, 163, 0.1), rgba(66, 163, 65, 0.2), rgba(184, 226, 163, 0.3));
|
||||||
@ -104,6 +108,9 @@
|
|||||||
.strong-text{
|
.strong-text{
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
}
|
}
|
||||||
|
i:is(.fas, .far) {
|
||||||
|
font-size: smaller;
|
||||||
|
}
|
||||||
|
|
||||||
.tabs .item.active, .blessures-list li ul li:first-child:hover, a:hover {
|
.tabs .item.active, .blessures-list li ul li:first-child:hover, a:hover {
|
||||||
text-shadow: 1px 0px 0px #ff6600;
|
text-shadow: 1px 0px 0px #ff6600;
|
||||||
@ -225,6 +232,26 @@ table {border: 1px solid #7a7971;}
|
|||||||
flex-grow : 3;
|
flex-grow : 3;
|
||||||
}
|
}
|
||||||
/* Styles limited to foundryvtt-reve-de-dragon sheets */
|
/* Styles limited to foundryvtt-reve-de-dragon sheets */
|
||||||
|
.equipement-nom {
|
||||||
|
flex-grow : 4;
|
||||||
|
margin: 0;
|
||||||
|
justify-content: center;
|
||||||
|
text-align: left;
|
||||||
|
}
|
||||||
|
.equipement-detail {
|
||||||
|
margin: 0;
|
||||||
|
flex: 'flex-shrink' ;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
.equipement-actions {
|
||||||
|
margin: 0;
|
||||||
|
flex-grow: 2;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
text-align: left;
|
||||||
|
}
|
||||||
|
|
||||||
.foundryvtt-reve-de-dragon .sheet-header {
|
.foundryvtt-reve-de-dragon .sheet-header {
|
||||||
-webkit-box-flex: 0;
|
-webkit-box-flex: 0;
|
||||||
@ -266,14 +293,8 @@ table {border: 1px solid #7a7971;}
|
|||||||
height: 8%;
|
height: 8%;
|
||||||
max-height: 48px;
|
max-height: 48px;
|
||||||
border-width: 0;
|
border-width: 0;
|
||||||
border: 1px solid rgba(0, 0, 0, 0);
|
border: 1px solid rgba(0, 0, 0, 0);
|
||||||
}
|
}
|
||||||
.button-img:hover {
|
|
||||||
color: rgba(255, 255, 128, 0.7);
|
|
||||||
border: 1px solid rgba(255, 128, 0, 0.8);
|
|
||||||
cursor: pointer;
|
|
||||||
}
|
|
||||||
|
|
||||||
.button-effect-img {
|
.button-effect-img {
|
||||||
vertical-align: baseline;
|
vertical-align: baseline;
|
||||||
width: 16px;
|
width: 16px;
|
||||||
@ -281,9 +302,16 @@ table {border: 1px solid #7a7971;}
|
|||||||
height: 16;
|
height: 16;
|
||||||
border-width: 0;
|
border-width: 0;
|
||||||
}
|
}
|
||||||
.button-effect-img:hover {
|
.small-button-direction {
|
||||||
color: rgba(255, 255, 128, 0.7);
|
height: 32px;
|
||||||
border: 1px solid rgba(255, 128, 0, 0.8);
|
width: 32px;
|
||||||
|
border: 0;
|
||||||
|
vertical-align: bottom;
|
||||||
|
}
|
||||||
|
:is(.button-img,.button-effect-img:hover,.small-button-direction):hover {
|
||||||
|
color: var(--color-controls-hover);
|
||||||
|
border: 1px solid var(--color-control-border-hover);
|
||||||
|
text-shadow: 1px 0px 0px #ff6600;
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -294,18 +322,6 @@ table {border: 1px solid #7a7971;}
|
|||||||
vertical-align: bottom;
|
vertical-align: bottom;
|
||||||
}
|
}
|
||||||
|
|
||||||
.small-button-direction {
|
|
||||||
height: 32px;
|
|
||||||
width: 32px;
|
|
||||||
border: 0;
|
|
||||||
vertical-align: bottom;
|
|
||||||
}
|
|
||||||
.small-button-direction:hover {
|
|
||||||
color: rgba(255, 255, 128, 0.7);
|
|
||||||
border: 1px solid rgba(255, 128, 0, 0.8);
|
|
||||||
cursor: pointer;
|
|
||||||
}
|
|
||||||
|
|
||||||
.foundryvtt-reve-de-dragon .sheet-header .header-fields {
|
.foundryvtt-reve-de-dragon .sheet-header .header-fields {
|
||||||
-webkit-box-flex: 1;
|
-webkit-box-flex: 1;
|
||||||
-ms-flex: 1;
|
-ms-flex: 1;
|
||||||
@ -346,25 +362,25 @@ table {border: 1px solid #7a7971;}
|
|||||||
flex-grow: 0;
|
flex-grow: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
.rdd.sheet .window-content .sheet-body .carac-list .competence {
|
.rdd.sheet .window-content .sheet-body .carac-list .caracteristique {
|
||||||
flex-wrap: nowrap;
|
flex-wrap: nowrap;
|
||||||
justify-content: stretch;
|
justify-content: stretch;
|
||||||
}
|
}
|
||||||
.rdd.sheet .window-content .sheet-body .carac-list .competence > .carac-label {
|
.rdd.sheet .window-content .sheet-body .carac-list .caracteristique > .carac-label {
|
||||||
flex-basis: 50%;
|
flex-basis: 50%;
|
||||||
}
|
}
|
||||||
.rdd.sheet .window-content .sheet-body .carac-list .competence > .attribut-label {
|
.rdd.sheet .window-content .sheet-body .carac-list .caracteristique > .attribut-label {
|
||||||
flex-basis: 50%;
|
flex-basis: 50%;
|
||||||
}
|
}
|
||||||
.rdd.sheet .window-content .sheet-body .carac-list .competence > .competence-value.total {
|
.rdd.sheet .window-content .sheet-body .carac-list .caracteristique > .competence-value.total {
|
||||||
flex-grow: 1;
|
flex-grow: 1;
|
||||||
text-align: right;
|
text-align: right;
|
||||||
}
|
}
|
||||||
.rdd.sheet .window-content .sheet-body .carac-list .competence > .utiliser-attribut {
|
.rdd.sheet .window-content .sheet-body .carac-list .caracteristique > .utiliser-attribut {
|
||||||
flex-basis: available;
|
flex-basis: available;
|
||||||
flex-grow: 1;
|
flex-grow: 1;
|
||||||
}
|
}
|
||||||
.rdd.sheet .window-content .sheet-body .carac-list .competence > * {
|
.rdd.sheet .window-content .sheet-body .carac-list .caracteristique > * {
|
||||||
flex-basis: 13%;
|
flex-basis: 13%;
|
||||||
flex-grow: 0;
|
flex-grow: 0;
|
||||||
}
|
}
|
||||||
@ -469,13 +485,18 @@ table {border: 1px solid #7a7971;}
|
|||||||
flex: 0 0 86px;
|
flex: 0 0 86px;
|
||||||
text-align: right;
|
text-align: right;
|
||||||
}
|
}
|
||||||
|
|
||||||
.competence-list .item-controls {
|
.competence-list .item-controls {
|
||||||
display: contents !important;
|
display: contents !important;
|
||||||
}
|
}
|
||||||
.competence-list .item-controls.hidden-controls {
|
.competence-list .item-controls.hidden-controls {
|
||||||
display: none !important;
|
display: none !important;
|
||||||
}
|
}
|
||||||
|
.item-controls i:is(.fas,.far) {
|
||||||
|
color: var(--color-controls);
|
||||||
|
}
|
||||||
|
.item-controls i:is(.fas,.far):hover {
|
||||||
|
opacity: 0.7 ;
|
||||||
|
}
|
||||||
|
|
||||||
.rdddialog .dialog-roll-sort s{
|
.rdddialog .dialog-roll-sort s{
|
||||||
width: 600px;
|
width: 600px;
|
||||||
@ -567,7 +588,7 @@ table {border: 1px solid #7a7971;}
|
|||||||
color: rgba(255, 255, 255, 0.75);
|
color: rgba(255, 255, 255, 0.75);
|
||||||
background: rgba(255, 255, 255, 0.05);
|
background: rgba(255, 255, 255, 0.05);
|
||||||
border: 0 none;
|
border: 0 none;
|
||||||
margin-bottom: 0.25rem;
|
margin-bottom: 0.2rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
.window-app .window-content, .window-app.sheet .window-content .sheet-body{
|
.window-app .window-content, .window-app.sheet .window-content .sheet-body{
|
||||||
@ -601,7 +622,7 @@ section.sheet-body{padding: 0.25rem 0.5rem;}
|
|||||||
|
|
||||||
nav.sheet-tabs .item {
|
nav.sheet-tabs .item {
|
||||||
position: relative;
|
position: relative;
|
||||||
padding: 0 0.25rem;
|
padding: 0 0.2rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
nav.sheet-tabs .item:after {
|
nav.sheet-tabs .item:after {
|
||||||
@ -627,11 +648,15 @@ section.sheet-body:after {
|
|||||||
.sheet header.sheet-header .flex-compteurs {text-align: right;}
|
.sheet header.sheet-header .flex-compteurs {text-align: right;}
|
||||||
.sheet header.sheet-header .resource-content {width: 2rem;}
|
.sheet header.sheet-header .resource-content {width: 2rem;}
|
||||||
|
|
||||||
.ctn-vie span, .ctn-endu span, .ctn-fatigue span, .ctn-reve span {
|
.compteur span {
|
||||||
display: inline-block;
|
display: inline-block;
|
||||||
text-align: left;
|
text-align: left;
|
||||||
width: 2rem;
|
width: 2rem;
|
||||||
}
|
}
|
||||||
|
.compteur a i:is(.fas,.far):hover {
|
||||||
|
opacity: 0.7 ;
|
||||||
|
}
|
||||||
|
|
||||||
.select-diff {
|
.select-diff {
|
||||||
display: inline-block;
|
display: inline-block;
|
||||||
text-align: left;
|
text-align: left;
|
||||||
@ -644,17 +669,6 @@ section.sheet-body:after {
|
|||||||
max-width: 90%;
|
max-width: 90%;
|
||||||
}
|
}
|
||||||
|
|
||||||
.plus-moins {
|
|
||||||
display: inline-block;
|
|
||||||
width: 1.25rem;
|
|
||||||
background: rgba(30, 25, 20, 1);
|
|
||||||
text-align: center;
|
|
||||||
border: 1px solid rgba(72, 46, 28, 1);
|
|
||||||
border-radius: 0.25rem;
|
|
||||||
line-height: 1.25rem;
|
|
||||||
color: rgba(255, 255, 255, 0.5);
|
|
||||||
}
|
|
||||||
|
|
||||||
.alchimie-tache {
|
.alchimie-tache {
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
background: rgb(182, 180, 179);
|
background: rgb(182, 180, 179);
|
||||||
@ -711,10 +725,13 @@ ul, ol {
|
|||||||
ul, li {
|
ul, li {
|
||||||
list-style-type: none;
|
list-style-type: none;
|
||||||
}
|
}
|
||||||
|
.sheet .caracteristique li {
|
||||||
|
margin: 0.1rem;
|
||||||
|
padding: 0.2rem;
|
||||||
|
}
|
||||||
.sheet li {
|
.sheet li {
|
||||||
margin: 0.125rem;
|
margin: 0.1rem;
|
||||||
padding: 0.25rem;
|
padding: 0.1rem;
|
||||||
}
|
}
|
||||||
.header-fields li {
|
.header-fields li {
|
||||||
margin: 0;
|
margin: 0;
|
||||||
@ -731,23 +748,19 @@ ul, li {
|
|||||||
background: rgb(160, 130, 100, 0.05);
|
background: rgb(160, 130, 100, 0.05);
|
||||||
}
|
}
|
||||||
.xp-level-up {
|
.xp-level-up {
|
||||||
margin: 0.125rem;
|
margin: 0.1rem;
|
||||||
box-shadow: inset 0px 0px 1px #00000096;
|
box-shadow: inset 0px 0px 1px #00000096;
|
||||||
border-radius: 0.25rem;
|
border-radius: 0.25rem;
|
||||||
padding: 0.125rem;
|
padding: 0.1rem;
|
||||||
flex: 1 1 5rem;
|
flex: 1 1 5rem;
|
||||||
background: var(--gradient-gold) !important;
|
background: var(--gradient-gold) !important;
|
||||||
}
|
}
|
||||||
.niveau-archetype {
|
.niveau-archetype {
|
||||||
background: var(--gradient-silver-light) !important;
|
background: var(--gradient-silver-light) !important;
|
||||||
}
|
}
|
||||||
.fa-arrow-alt-circle-up.allouer-stress {
|
.item-controls i.fas.allouer-stress.level-up {
|
||||||
color: rgba(83, 60, 14, 0.8);
|
color: var(--color-gold);
|
||||||
}
|
}
|
||||||
.fa-arrow-alt-circle-up.allouer-stress-level-up {
|
|
||||||
color: rgba(191, 149, 63, 0.8);
|
|
||||||
}
|
|
||||||
|
|
||||||
.blessures-list ul {
|
.blessures-list ul {
|
||||||
display: flex;
|
display: flex;
|
||||||
}
|
}
|
||||||
@ -766,18 +779,18 @@ ul, li {
|
|||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
}
|
}
|
||||||
.list-item {
|
.list-item {
|
||||||
margin: 0.125rem;
|
margin: 0.1rem;
|
||||||
box-shadow: inset 0px 0px 1px #00000096;
|
box-shadow: inset 0px 0px 1px #00000096;
|
||||||
border-radius: 0.25rem;
|
border-radius: 0.25rem;
|
||||||
padding: 0.125rem;
|
padding: 0.1rem;
|
||||||
flex: 1 1 5rem;
|
flex: 1 1 5rem;
|
||||||
display: flex !important;
|
display: flex !important;
|
||||||
align-items: baseline !important;
|
align-items: center !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
.table-row {
|
.table-row {
|
||||||
margin: 0.125rem;
|
margin: 0.1rem;
|
||||||
padding: 0.125rem;
|
padding: 0.1rem;
|
||||||
flex: 1 1 5rem;
|
flex: 1 1 5rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -801,28 +814,37 @@ ul, li {
|
|||||||
background: rgb(200, 10, 100, 0.25);
|
background: rgb(200, 10, 100, 0.25);
|
||||||
}
|
}
|
||||||
|
|
||||||
.item-quantite {
|
.item-column {
|
||||||
margin-left: 0.5rem;
|
margin-left: 0.2rem;
|
||||||
|
margin-right: 0.2rem;
|
||||||
|
justify-content: center;
|
||||||
|
text-align: center;
|
||||||
}
|
}
|
||||||
|
|
||||||
.list-item-margin1 {
|
.list-item-margin1 {
|
||||||
margin-left: 1rem;
|
margin-left: 0.5rem;
|
||||||
}
|
}
|
||||||
.list-item-margin2 {
|
.list-item-margin2 {
|
||||||
margin-left: 2rem;
|
margin-left: 1rem;
|
||||||
}
|
}
|
||||||
.list-item-margin3 {
|
.list-item-margin3 {
|
||||||
margin-left: 3rem;
|
margin-left: 1.5rem;
|
||||||
}
|
}
|
||||||
.list-item-margin4 {
|
.list-item-margin4 {
|
||||||
margin-left: 4rem;
|
margin-left: 2rem;
|
||||||
|
}
|
||||||
|
.list-item-margin5 {
|
||||||
|
margin-left: 2.5rem;
|
||||||
|
}
|
||||||
|
.list-item-margin6 {
|
||||||
|
margin-left: 3rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
.sheet-competence-img {
|
.sheet-competence-img {
|
||||||
width: 24px;
|
width: 24px;
|
||||||
height: 24px;
|
height: 24px;
|
||||||
flex-grow: 0;
|
flex-grow: 0;
|
||||||
margin-right: 0.25rem;
|
margin-right: 0.2rem;
|
||||||
vertical-align: bottom;
|
vertical-align: bottom;
|
||||||
}
|
}
|
||||||
.competence-column {
|
.competence-column {
|
||||||
@ -866,20 +888,20 @@ ul, li {
|
|||||||
.competence-value {
|
.competence-value {
|
||||||
flex-grow: 0;
|
flex-grow: 0;
|
||||||
flex-basis: 2rem;
|
flex-basis: 2rem;
|
||||||
margin-right: 0.25rem;
|
margin-right: 0.2rem;
|
||||||
margin-left: 0.25rem;
|
margin-left: 0.2rem;
|
||||||
}
|
}
|
||||||
.description-value {
|
.description-value {
|
||||||
flex-grow: 0;
|
flex-grow: 0;
|
||||||
flex-basis: 4rem;
|
flex-basis: 4rem;
|
||||||
margin-right: 0.25rem;
|
margin-right: 0.2rem;
|
||||||
margin-left: 0.25rem;
|
margin-left: 0.2rem;
|
||||||
}
|
}
|
||||||
.competence-xp {
|
.competence-xp {
|
||||||
flex-grow: 0;
|
flex-grow: 0;
|
||||||
flex-basis: 2rem;
|
flex-basis: 2rem;
|
||||||
margin-right: 0.25rem;
|
margin-right: 0.2rem;
|
||||||
margin-left: 0.25rem;
|
margin-left: 0.2rem;
|
||||||
}
|
}
|
||||||
.blessures-title {
|
.blessures-title {
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
@ -957,7 +979,7 @@ ul, li {
|
|||||||
flex-basis: auto;
|
flex-basis: auto;
|
||||||
padding: 0;
|
padding: 0;
|
||||||
line-height: 1rem;
|
line-height: 1rem;
|
||||||
margin: 0.25rem;
|
margin: 0.2rem;
|
||||||
}
|
}
|
||||||
.control-icon.tokenhudicon.right {
|
.control-icon.tokenhudicon.right {
|
||||||
margin-left: 8px;
|
margin-left: 8px;
|
||||||
@ -975,7 +997,7 @@ ul, li {
|
|||||||
border-left: none;
|
border-left: none;
|
||||||
font-weight: 500;
|
font-weight: 500;
|
||||||
font-size: 1rem;
|
font-size: 1rem;
|
||||||
color: black;
|
color: var(--color-controls);
|
||||||
padding-top: 5px;
|
padding-top: 5px;
|
||||||
margin-right: 0px;
|
margin-right: 0px;
|
||||||
width: 45px;
|
width: 45px;
|
||||||
@ -1075,7 +1097,7 @@ ul, li {
|
|||||||
.sidebar-tab .directory-list .entity {
|
.sidebar-tab .directory-list .entity {
|
||||||
border-top: 1px dashed rgba(0,0,0,0.25);
|
border-top: 1px dashed rgba(0,0,0,0.25);
|
||||||
border-bottom: 0 none;
|
border-bottom: 0 none;
|
||||||
padding: 0.25rem 0;
|
padding: 0.2rem 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
.sidebar-tab .directory-list .entity:hover {
|
.sidebar-tab .directory-list .entity:hover {
|
||||||
@ -1153,11 +1175,11 @@ ul, li {
|
|||||||
border-image-width: 4px;
|
border-image-width: 4px;
|
||||||
border-image-outset: 0px;
|
border-image-outset: 0px;
|
||||||
}
|
}
|
||||||
#controls .control-tools {
|
#controls .control-tools {
|
||||||
max-height: calc(100vh - 156px);
|
max-height: calc(100vh - 156px);
|
||||||
height: auto;
|
height: auto;
|
||||||
}
|
}
|
||||||
#controls .scene-control.active, #controls .control-tool.active, #controls .scene-control:hover, #controls .control-tool:hover {
|
#controls :is(.scene-control.active,.control-tool.active, .scene-control:hover, .control-tool:hover) {
|
||||||
background: rgba(72, 46, 28, 1);
|
background: rgba(72, 46, 28, 1);
|
||||||
background-origin: padding-box;
|
background-origin: padding-box;
|
||||||
border-image: url(img/ui/footer-button.webp) 10 repeat;
|
border-image: url(img/ui/footer-button.webp) 10 repeat;
|
||||||
@ -1343,8 +1365,8 @@ ul, li {
|
|||||||
color: rgba(255, 255, 255, 0.5);
|
color: rgba(255, 255, 255, 0.5);
|
||||||
}
|
}
|
||||||
.calendar-btn:hover {
|
.calendar-btn:hover {
|
||||||
color: rgba(255, 255, 128, 0.7);
|
color: var(--color-controls-hover);
|
||||||
border: 1px solid rgba(255, 128, 0, 0.8);
|
border: 1px solid var(--color-control-border-hover);
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -29,7 +29,7 @@
|
|||||||
"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": {},
|
"flags": {},
|
||||||
"version": "1.5.75",
|
"version": "1.5.90",
|
||||||
"minimumCoreVersion": "0.8.0",
|
"minimumCoreVersion": "0.8.0",
|
||||||
"compatibleCoreVersion": "9",
|
"compatibleCoreVersion": "9",
|
||||||
"scripts": [],
|
"scripts": [],
|
||||||
@ -500,7 +500,7 @@
|
|||||||
"dependencies": [],
|
"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/v1.5/system.json",
|
||||||
"download": "https://www.uberwald.me/gitea/public/foundryvtt-reve-de-dragon/archive/foundryvtt-reve-de-dragon-1.5.75.zip",
|
"download": "https://www.uberwald.me/gitea/public/foundryvtt-reve-de-dragon/archive/foundryvtt-reve-de-dragon-1.5.90.zip",
|
||||||
"protected": false,
|
"protected": false,
|
||||||
"gridDistance": 1,
|
"gridDistance": 1,
|
||||||
"gridUnits": "m",
|
"gridUnits": "m",
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
<tr class="table-row alterne-row item" data-blessure-type="{{gravite}}" data-attribute={{key}} data-blessure-index="{{key}}" >
|
<tr class="table-row alterne-row item" data-blessure-type="{{gravite}}" data-attribute={{key}} data-blessure-index="{{key}}" >
|
||||||
<td class="item-control blessure-control" title="Blessure {{title}}" data-blessure-active="{{bless.active}}">
|
<td class="blessure-control" title="Blessure {{title}}" data-blessure-active="{{bless.active}}">
|
||||||
{{#if bless.active}}
|
{{#if bless.active}}
|
||||||
<i class="fas fa-skull-crossbones blessure-active-{{gravite}}" name="blessure-{{gravite}}-{{key}}-active"></i>
|
<i class="fas fa-skull-crossbones blessure-active-{{gravite}}" name="blessure-{{gravite}}-{{key}}-active"></i>
|
||||||
{{else}}
|
{{else}}
|
||||||
|
@ -55,7 +55,6 @@
|
|||||||
{{/each}}
|
{{/each}}
|
||||||
<li class="flexrow">
|
<li class="flexrow">
|
||||||
<span class="carac-label" name="carac-total">Total Caractéristiques</span>
|
<span class="carac-label" name="carac-total">Total Caractéristiques</span>
|
||||||
{{log 'data-actor-creature' this}}
|
|
||||||
<span class="competence-value" name="carac-total-value">{{calc.caracTotal}}</span>
|
<span class="competence-value" name="carac-total-value">{{calc.caracTotal}}</span>
|
||||||
</li>
|
</li>
|
||||||
</ol>
|
</ol>
|
||||||
@ -109,8 +108,8 @@
|
|||||||
<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.data.dommages decimals=0 sign=true}}" data-dtype="number" />
|
||||||
<div class="item-controls">
|
<div class="item-controls">
|
||||||
<a class="item-control 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-control 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>
|
||||||
</div>
|
</div>
|
||||||
</li>
|
</li>
|
||||||
{{/each}}
|
{{/each}}
|
||||||
@ -127,35 +126,7 @@
|
|||||||
|
|
||||||
{{!-- 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-sheet-inventaire-monnaie.html" monnaie=monnaie}}
|
|
||||||
|
|
||||||
<span class="item-name"><h4>Equipement porté</h4></span>
|
|
||||||
<span class="item-name">Encombrement total/max : {{numberFormat calc.encTotal decimals=2}} / {{data.attributs.encombrement.value}} <b>{{calc.surEncombrementMessage}}</b></span> -
|
|
||||||
<span class="item-name"><a class="creer-un-objet">Créer un objet</a></span>
|
|
||||||
{{#if options.isGM}}
|
|
||||||
<span class="item-name"> - <a id="nettoyer-conteneurs">Vider tout les conteneurs</a></span>
|
|
||||||
{{/if}}
|
|
||||||
|
|
||||||
<ul class="item-list alterne-list">
|
|
||||||
<li class="competence-header flexrow">
|
|
||||||
<img class="sheet-competence-img" src="{{img}}" title="Equipement"/>
|
|
||||||
<span class="competence-title flex-grow">Nom</span>
|
|
||||||
<span class="competence-title">Q.</span>
|
|
||||||
<span class="competence-title">Enc.</span>
|
|
||||||
<span class="competence-title flex-grow">Equiper/Editer/Suppr.</span>
|
|
||||||
</li>
|
|
||||||
{{#each objets as |item id|}}
|
|
||||||
{{#unless item.estContenu}}
|
|
||||||
{{#if (ne item.type 'conteneur')}}
|
|
||||||
{{> "systems/foundryvtt-reve-de-dragon/templates/actor-sheet-inventaire-conteneur.html" item=item }}
|
|
||||||
{{/if}}
|
|
||||||
{{/unless}}
|
|
||||||
{{/each}}
|
|
||||||
{{#each conteneurs as |conteneur id|}}
|
|
||||||
{{buildConteneur this}}
|
|
||||||
{{/each}}
|
|
||||||
</ul>
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{{!-- Biography Tab --}}
|
{{!-- Biography Tab --}}
|
||||||
|
@ -33,7 +33,7 @@
|
|||||||
<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 data.carac as |carac key|}}
|
||||||
<li class="competence 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="data.carac.{{key}}.label">{{carac.label}}</span>
|
||||||
{{else}}
|
{{else}}
|
||||||
@ -50,7 +50,7 @@
|
|||||||
<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="competence 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="data.definition.categorieentite" value="{{data.definition.categorieentite}}" data-dtype="String">
|
||||||
{{#select data.definition.categorieentite}}
|
{{#select data.definition.categorieentite}}
|
||||||
@ -59,23 +59,24 @@
|
|||||||
{{/select}}
|
{{/select}}
|
||||||
</select>
|
</select>
|
||||||
</li>
|
</li>
|
||||||
<li class="competence 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="data.definition.typeentite" value="{{data.definition.typeentite}}" data-dtype="String">
|
||||||
{{#select data.definition.typeentite}}
|
{{#select data.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>
|
||||||
{{/select}}
|
{{/select}}
|
||||||
</select>
|
</select>
|
||||||
</li>
|
</li>
|
||||||
{{#each data.attributs as |attr key|}}
|
{{#each data.attributs as |attr key|}}
|
||||||
<li class="competence 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="data.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="data.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="competence 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="data.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="data.sante.endurance.value"
|
||||||
value="{{data.sante.endurance.value}}" data-dtype="Number" /></span><span>/ </span>
|
value="{{data.sante.endurance.value}}" data-dtype="Number" /></span><span>/ </span>
|
||||||
@ -89,9 +90,7 @@
|
|||||||
|
|
||||||
{{!-- 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="flexcol">
|
<div class="flexcol">
|
||||||
|
|
||||||
<div class="flex-group-left flexcol competence-column">
|
<div class="flex-group-left flexcol competence-column">
|
||||||
<ol class="item-list alterne-list">
|
<ol class="item-list alterne-list">
|
||||||
{{#each competences as |comp key|}}
|
{{#each competences as |comp key|}}
|
||||||
@ -105,27 +104,26 @@
|
|||||||
<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.data.dommages decimals=0 sign=true}}" data-dtype="number" />
|
||||||
<div class="item-controls">
|
<div class="item-controls">
|
||||||
<a class="item-control 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-control 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>
|
||||||
|
</div>
|
||||||
|
</li>
|
||||||
|
{{/each}}
|
||||||
|
</ol>
|
||||||
|
</div>
|
||||||
|
<div class="flex-group-left flexcol competence-column">
|
||||||
|
<ol class="item-list alterne-list">
|
||||||
|
{{#each possessions as |possession key|}}
|
||||||
|
<li class="item flexrow list-item" data-item-id="{{possession._id}}">
|
||||||
|
<img class="sheet-competence-img" src="{{possession.img}}" />
|
||||||
|
<span class="competence-label">{{possession.name}}</span>
|
||||||
|
<div class="item-controls">
|
||||||
|
<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>
|
</div>
|
||||||
</li>
|
</li>
|
||||||
{{/each}}
|
{{/each}}
|
||||||
</ol>
|
</ol>
|
||||||
|
|
||||||
<div class="flex-group-left flexcol competence-column">
|
|
||||||
<ol class="item-list alterne-list">
|
|
||||||
{{#each possessions as |possession key|}}
|
|
||||||
<li class="item flexrow list-item" data-item-id="{{possession._id}}">
|
|
||||||
<img class="sheet-competence-img" src="{{possession.img}}" />
|
|
||||||
<span class="competence-label">{{possession.name}}</span>
|
|
||||||
<div class="item-controls">
|
|
||||||
<a class="item-control item-edit" title="Edit Item"><i class="fas fa-edit"></i></a>
|
|
||||||
<a class="item-control item-delete" title="Delete Item"><i class="fas fa-trash"></i></a>
|
|
||||||
</div>
|
|
||||||
</li>
|
|
||||||
{{/each}}
|
|
||||||
</ol>
|
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@ -138,7 +136,5 @@
|
|||||||
{{>"systems/foundryvtt-reve-de-dragon/templates/actor-sheet-editor-notes-mj.html"}}
|
{{>"systems/foundryvtt-reve-de-dragon/templates/actor-sheet-editor-notes-mj.html"}}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
</div>
|
|
||||||
|
|
||||||
</section>
|
</section>
|
||||||
</form>
|
</form>
|
@ -1,27 +1,31 @@
|
|||||||
<header class="competence-header flexrow">
|
{{#if competences}}
|
||||||
<span class="competence-title">{{categorie}}</span>
|
<div class="flex-shrink">
|
||||||
</header>
|
<header class="competence-header flexrow">
|
||||||
<ul class="item-list alterne-list competence-list">
|
<span class="competence-title">{{categorie}}</span>
|
||||||
{{#if @root.options.vueDetaillee}}
|
</header>
|
||||||
<li class="item flexrow list-item ">
|
<ul class="item-list alterne-list competence-list">
|
||||||
|
{{#if @root.options.vueDetaillee}}
|
||||||
|
<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>
|
||||||
{{#if (eq categorie 'Draconic')}}
|
{{#if (eq categorie 'Draconic')}}
|
||||||
<span class="competence-xp-sort">sort</span>
|
<span class="competence-xp-sort">sort</span>
|
||||||
{{/if}}
|
|
||||||
<div class="item-controls">
|
|
||||||
<i class="far fa-arrow-alt-circle-up"></i>
|
|
||||||
<span class="competence-archetype">Arch</span>
|
|
||||||
<i class="far fa-edit"></i>
|
|
||||||
{{#if @root.options.isGM}}
|
|
||||||
<i class="far fa-trash"></i>
|
|
||||||
{{/if}}
|
{{/if}}
|
||||||
</div>
|
<div class="item-controls">
|
||||||
</li>
|
<i class="far fa-arrow-alt-circle-up"></i>
|
||||||
{{/if}}
|
<span class="competence-archetype">Arch</span>
|
||||||
{{#each competences as |comp key|}}
|
<i class="far fa-edit"></i>
|
||||||
{{> "systems/foundryvtt-reve-de-dragon/templates/actor-sheet-competence-partial.html" comp}}
|
{{#if @root.options.isGM}}
|
||||||
{{/each}}
|
<i class="far fa-trash"></i>
|
||||||
</ul>
|
{{/if}}
|
||||||
|
</div>
|
||||||
|
</li>
|
||||||
|
{{/if}}
|
||||||
|
{{#each competences as |comp key|}}
|
||||||
|
{{> "systems/foundryvtt-reve-de-dragon/templates/actor-sheet-competence-partial.html" comp}}
|
||||||
|
{{/each}}
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
{{/if}}
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
|
|
||||||
{{#if data.isLevelUp}}
|
{{#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>
|
<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="item-control competence-xp-augmenter" compname="{{name}}" title="Augmenter">
|
<a class="competence-xp-augmenter" compname="{{name}}" title="Augmenter">
|
||||||
<i class="fas fa-arrow-alt-circle-up"></i>
|
<i class="fas fa-arrow-alt-circle-up"></i>
|
||||||
</a>
|
</a>
|
||||||
{{/if}}
|
{{/if}}
|
||||||
@ -31,9 +31,9 @@
|
|||||||
{{#if @root.options.vueDetaillee}}
|
{{#if @root.options.vueDetaillee}}
|
||||||
<div class="item-controls">
|
<div class="item-controls">
|
||||||
{{#if data.stressXpMax}}
|
{{#if data.stressXpMax}}
|
||||||
<a class="item-control competence-stress-augmenter" compname="{{name}}"
|
<a class="competence-stress-augmenter" compname="{{name}}"
|
||||||
title="Dépenser {{data.stressXpMax}} points de stress {{#if data.isStressLevelUp}} pour augmenter d'un niveau {{/if}}">
|
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>
|
<i class="fas fa-arrow-alt-circle-up allouer-stress {{#if data.isStressLevelUp}}level-up{{/if}}"></i>
|
||||||
</a>
|
</a>
|
||||||
{{else}}
|
{{else}}
|
||||||
<i class="far fa-circle"></i>
|
<i class="far fa-circle"></i>
|
||||||
@ -41,9 +41,9 @@
|
|||||||
<input class="competence-archetype niveau-archetype" type="text" compname="{{name}}" name="comp-archetype-{{name}}"
|
<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"
|
value="{{numberFormat data.niveau_archetype decimals=0 sign=true}}" data-dtype="number"
|
||||||
{{#unless @root.options.editCaracComp}}disabled{{/unless}} />
|
{{#unless @root.options.editCaracComp}}disabled{{/unless}} />
|
||||||
<a class="item-control item-edit" title="Modifier"><i class="fas fa-edit"></i></a>
|
<a class="item-edit" title="Modifier"><i class="fas fa-edit"></i></a>
|
||||||
{{#if @root.options.isGM}}
|
{{#if @root.options.isGM}}
|
||||||
<a class="item-control item-delete" title="Supprimer"><i class="fas fa-trash"></i></a>
|
<a class="item-delete" title="Supprimer"><i class="fas fa-trash"></i></a>
|
||||||
{{/if}}
|
{{/if}}
|
||||||
</div>
|
</div>
|
||||||
{{/if}}
|
{{/if}}
|
||||||
|
@ -1,32 +0,0 @@
|
|||||||
<li class="item flexrow list-item" data-item-id="{{item._id}}" draggable="true">
|
|
||||||
<img class="sheet-competence-img" src="{{item.img}}" title="{{item.name}}"/>
|
|
||||||
|
|
||||||
{{#if (eq item.type 'conteneur')}}
|
|
||||||
<span class="item-name conteneur-name flex-grow"><a data-item-id="{{item._id}}">+{{item.name}}</a></span>
|
|
||||||
{{else}}
|
|
||||||
<span class="item-name flex-grow">{{item.name}}</span>
|
|
||||||
{{/if}}
|
|
||||||
<span class="item-quantite">{{item.data.quantite}}
|
|
||||||
{{#if (gt item.data.quantite 1)}}
|
|
||||||
<a class="item-control item-split" title="Séparer"><i class="fas fa-unlink"></i></a>
|
|
||||||
{{/if}}
|
|
||||||
</span>
|
|
||||||
<span class="item-quantite">{{numberFormat item.data.encTotal decimals=2}}</span>
|
|
||||||
<div class="item-controls flex-grow">
|
|
||||||
{{#unless item.estContenu}}
|
|
||||||
{{#if (ne item.type 'conteneur')}}
|
|
||||||
<a class="item-control item-equip" title="Equiper">{{#if item.data.equipe}}<i class="fas fa-hand-rock"></i>{{else}}<i class="far fa-hand-paper"></i>{{/if}}</a>
|
|
||||||
{{/if}}
|
|
||||||
{{/unless}}
|
|
||||||
<a class="item-control item-edit" title="Editer"><i class="fas fa-edit"></i></a>
|
|
||||||
<a class="item-control item-delete" title="Supprimer"><i class="fas fa-trash"></i></a>
|
|
||||||
{{#if (or (eq item.type 'arme') (eq item.type 'conteneur') item.data.quantite)}}
|
|
||||||
|
|
||||||
<a class="item-control item-vendre" title="Vendre ou donner"><i class="fas fa-comments-dollar"></i></a>
|
|
||||||
{{/if}}
|
|
||||||
<a class="item-control item-montrer" title="Montrer"><i class="fas fa-comment"></i></a>
|
|
||||||
{{#if item.data.actionPrincipale}}
|
|
||||||
<a class="item-name item-action">{{item.data.actionPrincipale}}</a>
|
|
||||||
{{/if}}
|
|
||||||
</div>
|
|
||||||
</li>
|
|
48
templates/actor-sheet-inventaire-item.html
Normal file
48
templates/actor-sheet-inventaire-item.html
Normal file
@ -0,0 +1,48 @@
|
|||||||
|
<li class="item flexrow list-item" data-item-id="{{item._id}}" draggable="true">
|
||||||
|
<span class="equipement-nom {{#if (eq item.type 'conteneur')}}conteneur-name{{/if}} ">
|
||||||
|
{{#if (eq item.type 'conteneur')}}
|
||||||
|
{{#if vide}}
|
||||||
|
<i class="far fa-square"></i>
|
||||||
|
{{else}}
|
||||||
|
<a data-item-id="{{item._id}}">
|
||||||
|
{{#if ouvert}}
|
||||||
|
<i class="far fa-minus-square"></i>
|
||||||
|
{{else}}
|
||||||
|
<i class="far fa-plus-square"></i>
|
||||||
|
{{/if}}
|
||||||
|
</a>
|
||||||
|
{{/if}}
|
||||||
|
<a data-item-id="{{item._id}}">
|
||||||
|
<img class="sheet-competence-img" src="{{item.img}}" title="{{item.name}}"/>
|
||||||
|
<span>{{item.name}}</span>
|
||||||
|
</a>
|
||||||
|
{{else}}
|
||||||
|
<img class="sheet-competence-img" src="{{item.img}}" title="{{item.name}}"/>
|
||||||
|
<span>{{item.name}}</span>
|
||||||
|
{{/if}}
|
||||||
|
</span>
|
||||||
|
<span class="equipement-detail">{{item.data.quantite}}
|
||||||
|
{{#if (gt item.data.quantite 1)}}
|
||||||
|
<a class="item-split" title="Séparer"><i class="fas fa-unlink"></i></a>
|
||||||
|
{{/if}}
|
||||||
|
</span>
|
||||||
|
<span class="equipement-detail">{{numberFormat item.data.encTotal decimals=2}}</span>
|
||||||
|
<span class="equipement-actions item-controls">
|
||||||
|
{{#unless item.estContenu}}
|
||||||
|
{{#if (ne item.type 'conteneur')}}
|
||||||
|
<a class="item-equip" title="Equiper">{{#if item.data.equipe}}<i class="fas fa-hand-rock"></i>{{else}}<i class="far fa-hand-paper"></i>{{/if}}</a>
|
||||||
|
{{/if}}
|
||||||
|
{{/unless}}
|
||||||
|
<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>
|
||||||
|
|
||||||
|
{{#if (or (eq item.type 'arme') (eq item.type 'conteneur') item.data.quantite)}}
|
||||||
|
<a class="item-vendre" title="Vendre ou donner"><i class="fas fa-comments-dollar"></i></a>
|
||||||
|
{{/if}}
|
||||||
|
<a class="item-montrer" title="Montrer"><i class="fas fa-comment"></i></a>
|
||||||
|
{{#if item.data.actionPrincipale}}
|
||||||
|
<a class="item-action">{{item.data.actionPrincipale}}</a>
|
||||||
|
{{/if}}
|
||||||
|
</span>
|
||||||
|
</li>
|
||||||
|
|
@ -3,16 +3,26 @@
|
|||||||
{{#each monnaie as |piece id|}}
|
{{#each monnaie as |piece id|}}
|
||||||
<li class="item flexrow list-item" data-item-id="{{piece._id}}">
|
<li class="item flexrow list-item" data-item-id="{{piece._id}}">
|
||||||
<img class="sheet-competence-img" src="{{piece.img}}" title="{{piece.name}}"/>
|
<img class="sheet-competence-img" src="{{piece.img}}" title="{{piece.name}}"/>
|
||||||
<span class="competence-title competence-label">{{piece.name}}</span>
|
<span class="equipement-nom">{{piece.name}}</span>
|
||||||
<span class="competence-title competence-label">{{piece.data.quantite}}</span>
|
<span class="equipement-detail item-controls">
|
||||||
<span class="competence-title">
|
<a class="monnaie-moins"><i class="fas fa-minus-square"></i></a>
|
||||||
<a class="monnaie-plus plus-moins">+</a>
|
</span>
|
||||||
<a class="monnaie-moins plus-moins">-</a>
|
<span class="equipement-detail">
|
||||||
|
<span>{{piece.data.quantite}}</span>
|
||||||
|
</span>
|
||||||
|
<span class="equipement-detail item-controls">
|
||||||
|
<a class="monnaie-plus"><i class="fas fa-plus-square"></i></a>
|
||||||
|
</span>
|
||||||
|
|
||||||
|
<!-- <span class="equipement-detail">
|
||||||
|
<span class="flex-shrink"><a class="monnaie-moins"><i class="fas fa-minus-square"></i></a></span>
|
||||||
|
<span>{{piece.data.quantite}}</span>
|
||||||
|
<span class="flex-shrink"><a class="monnaie-plus"><i class="fas fa-plus-square"></i></a></span>
|
||||||
|
</span> -->
|
||||||
|
<span class="equipement-actions item-controls">
|
||||||
|
<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>
|
||||||
</span>
|
</span>
|
||||||
<div class="item-controls flex-shrink">
|
|
||||||
<a class="item-control item-edit" title="Editer"><i class="fas fa-edit"></i></a>
|
|
||||||
<a class="item-control item-delete" title="Supprimer"><i class="fas fa-trash"></i></a>
|
|
||||||
</div>
|
|
||||||
</li>
|
</li>
|
||||||
{{/each}}
|
{{/each}}
|
||||||
</ul>
|
</ul>
|
||||||
|
26
templates/actor-sheet-inventaire.html
Normal file
26
templates/actor-sheet-inventaire.html
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
{{> "systems/foundryvtt-reve-de-dragon/templates/actor-sheet-inventaire-monnaie.html" monnaie=monnaie}}
|
||||||
|
|
||||||
|
<span class="item-name"><h4>Equipement</h4></span>
|
||||||
|
<span class="item-name">Encombrement total/max : {{numberFormat calc.encTotal decimals=2}} / {{data.attributs.encombrement.value}} <b>{{calc.surEncombrementMessage}}</b></span> -
|
||||||
|
<span class="item-name"><a class="creer-un-objet">Créer un objet</a></span>
|
||||||
|
{{#if options.isGM}}
|
||||||
|
<span class="item-name"> - <a id="nettoyer-conteneurs">Vider tout les conteneurs</a></span>
|
||||||
|
{{/if}}
|
||||||
|
<ul class="item-list alterne-list">
|
||||||
|
<li class="competence-header flexrow">
|
||||||
|
<span class="equipement-nom">Nom</span>
|
||||||
|
<span class="equipement-detail">Q.</span>
|
||||||
|
<span class="equipement-detail">Enc.</span>
|
||||||
|
<span class="equipement-actions">Actions</span>
|
||||||
|
</li>
|
||||||
|
{{#each objets as |item id|}}
|
||||||
|
{{#unless item.estContenu}}
|
||||||
|
{{#if (ne item.type 'conteneur')}}
|
||||||
|
{{> "systems/foundryvtt-reve-de-dragon/templates/actor-sheet-inventaire-item.html" item=item vide=true ouvert=true }}
|
||||||
|
{{/if}}
|
||||||
|
{{/unless}}
|
||||||
|
{{/each}}
|
||||||
|
{{#each conteneurs as |conteneur id|}}
|
||||||
|
{{buildConteneur this}}
|
||||||
|
{{/each}}
|
||||||
|
</ul>
|
12
templates/actor-sheet-liens-animaux.html
Normal file
12
templates/actor-sheet-liens-animaux.html
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
<span class="item-name"><h4>Compagnons animaux</h4></span>
|
||||||
|
<ul class="item-list alterne-list">
|
||||||
|
{{#each subacteurs.montures as |monture id|}}
|
||||||
|
<li class="item flexrow list-item" data-actor-id="{{monture.id}}">
|
||||||
|
<img class="sheet-competence-img" src="{{monture.img}}" title="{{monture.name}}"/>
|
||||||
|
<span class="subacteur-label"><a>{{monture.name}}</a></span>
|
||||||
|
<div class="flex-shrink">
|
||||||
|
<a class="subacteur-delete" title="Supprimer"><i class="fas fa-trash"></i></a>
|
||||||
|
</div>
|
||||||
|
</li>
|
||||||
|
{{/each}}
|
||||||
|
</ul>
|
12
templates/actor-sheet-liens-suivants.html
Normal file
12
templates/actor-sheet-liens-suivants.html
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
<span class="item-name"><h4>Suivants</h4></span>
|
||||||
|
<ul class="item-list alterne-list">
|
||||||
|
{{#each subacteurs.suivants as |suivant id|}}
|
||||||
|
<li class="item flexrow list-item" data-actor-id="{{suivant.id}}">
|
||||||
|
<img class="sheet-competence-img" src="{{suivant.img}}" title="{{suivant.name}}"/>
|
||||||
|
<span class="competence-title subacteur-label"><a>{{suivant.name}}</a></span>
|
||||||
|
<div class="item-controls flex-shrink">
|
||||||
|
<a class="subacteur-delete" title="Supprimer"><i class="fas fa-trash"></i></a>
|
||||||
|
</div>
|
||||||
|
</li>
|
||||||
|
{{/each}}
|
||||||
|
</ul>
|
15
templates/actor-sheet-liens-vehicules.html
Normal file
15
templates/actor-sheet-liens-vehicules.html
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
<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>
|
||||||
|
|
@ -4,8 +4,8 @@
|
|||||||
<a>{{oeuvre.name}} (niveau {{oeuvre.data.niveau}})</a>
|
<a>{{oeuvre.name}} (niveau {{oeuvre.data.niveau}})</a>
|
||||||
</span>
|
</span>
|
||||||
<div class="item-controls">
|
<div class="item-controls">
|
||||||
<a class="item-control 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-control 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>
|
||||||
</div>
|
</div>
|
||||||
</li>
|
</li>
|
||||||
|
|
||||||
|
@ -10,40 +10,40 @@
|
|||||||
<div class="flexrow">
|
<div class="flexrow">
|
||||||
<ul class="flex-group-center flex-compteurs">
|
<ul class="flex-group-center flex-compteurs">
|
||||||
<li>
|
<li>
|
||||||
<label class="ctn-vie">
|
<label class="compteur">
|
||||||
<a class="jet-vie">Vie</a>
|
<a class="jet-vie">Vie</a>
|
||||||
<a class="vie-moins plus-moins">-</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="data.sante.vie.value" value="{{data.sante.vie.value}}" data-dtype="Number"/>
|
||||||
<span>/ {{data.sante.vie.max}}</span>
|
<span>/ {{data.sante.vie.max}}</span>
|
||||||
<a class="vie-plus plus-moins">+</a>
|
<a class="vie-plus"><i class="fas fa-plus-square"></i></a>
|
||||||
</label>
|
</label>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<label class="ctn-endu">
|
<label class="compteur">
|
||||||
<a class="jet-endurance">Endurance</a>
|
<a class="jet-endurance">Endurance</a>
|
||||||
<a class="endurance-moins plus-moins">-</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="data.sante.endurance.value" value="{{data.sante.endurance.value}}" data-dtype="Number"/>
|
||||||
<span>/ {{data.sante.endurance.max}}</span>
|
<span>/ {{data.sante.endurance.max}}</span>
|
||||||
<a class="endurance-plus plus-moins">+</a>
|
<a class="endurance-plus"><i class="fas fa-plus-square"></i></a>
|
||||||
</label>
|
</label>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<label class="appliquerFatigue ctn-fatigue tooltip">
|
<label class="appliquerFatigue compteur tooltip">
|
||||||
<span class="tooltiptext ttt-fatigue">{{{calc.fatigue.html}}}</span>
|
<span class="tooltiptext ttt-fatigue">{{{calc.fatigue.html}}}</span>
|
||||||
Fatigue
|
Fatigue
|
||||||
<a class="fatigue-moins plus-moins">-</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="data.sante.fatigue.value" value="{{data.sante.fatigue.value}}" data-dtype="Number" />
|
||||||
<span>/ {{data.sante.fatigue.max}}</span>
|
<span>/ {{data.sante.fatigue.max}}</span>
|
||||||
<a class="fatigue-plus plus-moins">+</a>
|
<a class="fatigue-plus"><i class="fas fa-plus-square"></i></a>
|
||||||
</label>
|
</label>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<label class="ctn-reve">
|
<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 plus-moins">-</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="data.reve.reve.value" value="{{data.reve.reve.value}}" data-dtype="Number" />
|
||||||
<span>/ {{data.reve.seuil.value}}</span>
|
<span>/ {{data.reve.seuil.value}}</span>
|
||||||
<a class="ptreve-actuel-plus plus-moins">+</a>
|
<a class="ptreve-actuel-plus"><i class="fas fa-plus-square"></i></a>
|
||||||
</label>
|
</label>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
@ -102,9 +102,9 @@
|
|||||||
<ul class="carac-list alterne-list">
|
<ul class="carac-list alterne-list">
|
||||||
{{#each data.carac as |carac key|}}
|
{{#each data.carac as |carac key|}}
|
||||||
{{#if carac.isLevelUp}}
|
{{#if carac.isLevelUp}}
|
||||||
<li class="competence 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="competence 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="data.carac.{{key}}.label">{{carac.label}}</span>
|
||||||
@ -131,7 +131,7 @@
|
|||||||
<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}}
|
||||||
<a class="item-control carac-xp-augmenter" name="augmenter.{{key}}" title="Augmenter">
|
<a class="carac-xp-augmenter" name="augmenter.{{key}}" title="Augmenter">
|
||||||
<i class="fas fa-arrow-alt-circle-up"></i>
|
<i class="fas fa-arrow-alt-circle-up"></i>
|
||||||
</a>
|
</a>
|
||||||
{{/if}}
|
{{/if}}
|
||||||
@ -139,7 +139,7 @@
|
|||||||
{{/if}}
|
{{/if}}
|
||||||
</li>
|
</li>
|
||||||
{{/each}}
|
{{/each}}
|
||||||
<li class="competence flexrow">
|
<li class="caracteristique flexrow">
|
||||||
<span class="carac-label" name="carac-total">Total Caractéristiques </span>
|
<span class="carac-label" name="carac-total">Total Caractéristiques </span>
|
||||||
<span class="competence-value total" name="carac-total-value">{{calc.caracTotal}} </span>
|
<span class="competence-value total" name="carac-total-value">{{calc.caracTotal}} </span>
|
||||||
</li>
|
</li>
|
||||||
@ -147,14 +147,14 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="flex-group-left flexcol" >
|
<div class="flex-group-left flexcol" >
|
||||||
<ul class="carac-list">
|
<ul class="carac-list">
|
||||||
<li class="competence 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="data.beaute" value="{{data.beaute}}" data-dtype="String" {{#unless @root.options.editCaracComp}}disabled{{/unless}}/>
|
||||||
<label class="carac-xp"/>
|
<label class="carac-xp"/>
|
||||||
</li>
|
</li>
|
||||||
{{#each data.attributs as |attr key|}}
|
{{#each data.attributs as |attr key|}}
|
||||||
{{#unless (eq key 'hautrevant')}}
|
{{#unless (eq key 'hautrevant')}}
|
||||||
<li class="competence 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="data.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"/>
|
||||||
@ -167,16 +167,16 @@
|
|||||||
{{/each}}
|
{{/each}}
|
||||||
</ul>
|
</ul>
|
||||||
<ul class="carac-list alterne-list">
|
<ul class="carac-list alterne-list">
|
||||||
<li class="competence 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="{{data.compteurs.chance.value}}" data-dtype="number"/>
|
||||||
<span class="utiliser-attribut" style="padding-left: 5px"><a class="item-control 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 data.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="competence 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="data.compteurs.ethylisme.value" id="ethylisme" data-dtype="Number">
|
||||||
@ -189,9 +189,9 @@
|
|||||||
{{/if}}
|
{{/if}}
|
||||||
<span class="utiliser-attribut" style="padding-left: 5px">
|
<span class="utiliser-attribut" style="padding-left: 5px">
|
||||||
{{#if compteur.isStress}}
|
{{#if compteur.isStress}}
|
||||||
<a class="item-control stress-test" title="Transformer">Transformer</a>
|
<a class="stress-test" title="Transformer">Transformer</a>
|
||||||
{{else if (eq compteur.label 'Ethylisme')}}
|
{{else if (eq compteur.label 'Ethylisme')}}
|
||||||
<a class="item-control ethylisme-test" id="ethylisme-test" title="Jet d'Ethylisme">Boire</a>
|
<a class="ethylisme-test" id="ethylisme-test" title="Jet d'Ethylisme">Boire</a>
|
||||||
{{else if (eq compteur.label 'Moral')}}
|
{{else if (eq compteur.label 'Moral')}}
|
||||||
<a class="moral-malheureux" title="Jet de moral situation malheureuse"><img class="small-button-container" src="systems/foundryvtt-reve-de-dragon/icons/moral-malheureux.svg" alt="Jet de moral situation malheureuse"/></a>
|
<a class="moral-malheureux" title="Jet de moral situation malheureuse"><img class="small-button-container" src="systems/foundryvtt-reve-de-dragon/icons/moral-malheureux.svg" alt="Jet de moral situation malheureuse"/></a>
|
||||||
<a class="moral-neutre" title="Jet de moral situation neutre"><img class="small-button-container" src="systems/foundryvtt-reve-de-dragon/icons/moral-neutre.svg" alt="Jet de moral situation neutre"/></a>
|
<a class="moral-neutre" title="Jet de moral situation neutre"><img class="small-button-container" src="systems/foundryvtt-reve-de-dragon/icons/moral-neutre.svg" alt="Jet de moral situation neutre"/></a>
|
||||||
@ -215,11 +215,9 @@
|
|||||||
<span><a class="lock-unlock-sheet"><img class="small-button-container"
|
<span><a class="lock-unlock-sheet"><img class="small-button-container"
|
||||||
src="systems/foundryvtt-reve-de-dragon/icons/{{#if options.editCaracComp}}unlocked.svg{{else}}locked.svg{{/if}}" alt="blocker/débloquer">
|
src="systems/foundryvtt-reve-de-dragon/icons/{{#if options.editCaracComp}}unlocked.svg{{else}}locked.svg{{/if}}" alt="blocker/débloquer">
|
||||||
{{#if options.editCaracComp}}Verrouiller{{else}}Déverrouiller{{/if}}</a></span>
|
{{#if options.editCaracComp}}Verrouiller{{else}}Déverrouiller{{/if}}</a></span>
|
||||||
<span class="flexrow">
|
<span>
|
||||||
<i class="fas fa-search"></i>
|
<input class="recherche flex-grow" type="text" value="{{options.recherche.text}}" name="recherche"
|
||||||
<input class="cherchercompetence" type="text" value="{{options.cherchercompetence}}" name="cherchercompetence"
|
size="8" data-dtype="String" placeholder="chercher"/>
|
||||||
size="8" data-dtype="String" placeholder="chercher"/>
|
|
||||||
<span></span>
|
|
||||||
</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">
|
||||||
@ -232,18 +230,18 @@
|
|||||||
</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=(sortCompetence competenceByCategory.generale) categorie="Compétences générales"}}
|
{{> "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-sheet-categorie-competences-partial.html" competences=(sortCompetence competenceByCategory.particuliere) categorie="Compétences Particulières"}}
|
{{> "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-sheet-categorie-competences-partial.html" competences=(sortCompetence competenceByCategory.specialisee) categorie="Compétences Spécialisées"}}
|
{{> "systems/foundryvtt-reve-de-dragon/templates/actor-sheet-categorie-competences-partial.html" competences=(filtreTriCompetences competenceByCategory.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=(sortCompetence competenceByCategory.melee) categorie="Compétences de Mêlée"}}
|
{{> "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-sheet-categorie-competences-partial.html" competences=(sortCompetence competenceByCategory.tir) categorie="Compétences de Tir"}}
|
{{> "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-sheet-categorie-competences-partial.html" competences=(sortCompetence competenceByCategory.lancer) categorie="Compétences de Lancer"}}
|
{{> "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-sheet-categorie-competences-partial.html" competences=(sortCompetence competenceByCategory.connaissance) categorie="Connaissances"}}
|
{{> "systems/foundryvtt-reve-de-dragon/templates/actor-sheet-categorie-competences-partial.html" competences=(filtreTriCompetences competenceByCategory.connaissance) categorie="Connaissances"}}
|
||||||
{{#if (or data.attributs.hautrevant.value options.vueDetaillee)}}
|
{{#if (or data.attributs.hautrevant.value options.vueDetaillee)}}
|
||||||
{{> "systems/foundryvtt-reve-de-dragon/templates/actor-sheet-categorie-competences-partial.html" competences=(sortCompetence competenceByCategory.draconic) categorie="Draconic"}}
|
{{> "systems/foundryvtt-reve-de-dragon/templates/actor-sheet-categorie-competences-partial.html" competences=(filtreTriCompetences competenceByCategory.draconic) categorie="Draconic"}}
|
||||||
{{/if}}
|
{{/if}}
|
||||||
|
|
||||||
<div>
|
<div>
|
||||||
@ -307,7 +305,6 @@
|
|||||||
<a class="competence-label" name="{{esq.name}}">
|
<a class="competence-label" name="{{esq.name}}">
|
||||||
<img class="sheet-competence-img" src="{{esq.img}}"/>
|
<img class="sheet-competence-img" src="{{esq.img}}"/>
|
||||||
<span>{{esq.name}}</span>
|
<span>{{esq.name}}</span>
|
||||||
{{log esq}}
|
|
||||||
</a>
|
</a>
|
||||||
</span>
|
</span>
|
||||||
<span class="arme-initiative"></span>
|
<span class="arme-initiative"></span>
|
||||||
@ -322,6 +319,7 @@
|
|||||||
{{!-- 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-liste-blessures-partial.html" this}}
|
||||||
|
|
||||||
|
{{#if maladiesPoisons.length}}
|
||||||
{{!-- Maladies & Poison --}}
|
{{!-- Maladies & Poison --}}
|
||||||
<h3 class="blessures-title">Maladies & Poisons:</h3>
|
<h3 class="blessures-title">Maladies & Poisons:</h3>
|
||||||
<ul class="item-list alterne-list">
|
<ul class="item-list alterne-list">
|
||||||
@ -349,34 +347,36 @@
|
|||||||
{{/if}}
|
{{/if}}
|
||||||
</span>
|
</span>
|
||||||
<div class="item-controls">
|
<div class="item-controls">
|
||||||
<a class="item-control item-edit" title="Modifier"><i class="fas fa-edit"></i></a>
|
<a class="item-edit" title="Modifier"><i class="fas fa-edit"></i></a>
|
||||||
<a class="item-control item-delete" title="Supprimer"><i class="fas fa-trash"></i></a>
|
<a class="item-delete" title="Supprimer"><i class="fas fa-trash"></i></a>
|
||||||
</div>
|
</div>
|
||||||
</li>
|
</li>
|
||||||
{{/each}}
|
{{/each}}
|
||||||
</ul>
|
</ul>
|
||||||
|
{{/if}}
|
||||||
|
|
||||||
{{!-- Possession --}}
|
{{#if possessions.length}}
|
||||||
<h3 class="blessures-title">Possession:</h3>
|
{{!-- Possession --}}
|
||||||
<ul class="item-list alterne-list">
|
<h3 class="blessures-title">Possession:</h3>
|
||||||
<li class="competence-header flexrow">
|
<ul class="item-list alterne-list">
|
||||||
<span class="competence-title flex-grow competence-label">Nom</span>
|
<li class="competence-header flexrow">
|
||||||
<span class="competence-title competence-label">Type</span>
|
<span class="competence-title flex-grow competence-label">Nom</span>
|
||||||
</li>
|
<span class="competence-title competence-label">Type</span>
|
||||||
|
</li>
|
||||||
{{#each possessions as |possession key|}}
|
{{#each possessions as |possession key|}}
|
||||||
<li class="item flexrow list-item" data-item-id="{{possession._id}}">
|
<li class="item flexrow list-item" data-item-id="{{possession._id}}">
|
||||||
<span class="competence-label">
|
<span class="competence-label">
|
||||||
<a class="sheet-possession-attack">{{possession.name}} (Conjurer)</a>
|
<a class="sheet-possession-attack">{{possession.name}} (Conjurer)</a>
|
||||||
</span>
|
</span>
|
||||||
<span class="competence-label">{{possession.data.type}}</span>
|
<span class="competence-label">{{possession.data.type}}</span>
|
||||||
<div class="item-controls">
|
<div class="item-controls">
|
||||||
<a class="item-control item-edit" title="Modifier"><i class="fas fa-edit"></i></a>
|
<a class="item-edit" title="Modifier"><i class="fas fa-edit"></i></a>
|
||||||
<a class="item-control item-delete" title="Supprimer"><i class="fas fa-trash"></i></a>
|
<a class="item-delete" title="Supprimer"><i class="fas fa-trash"></i></a>
|
||||||
</div>
|
</div>
|
||||||
</li>
|
</li>
|
||||||
{{/each}}
|
{{/each}}
|
||||||
</ul>
|
</ul>
|
||||||
|
{{/if}}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{{!-- Connaissances Tab --}}
|
{{!-- Connaissances Tab --}}
|
||||||
@ -389,8 +389,8 @@
|
|||||||
(or @root.options.isGM (not tache.data.cacher_points_de_tache))
|
(or @root.options.isGM (not tache.data.cacher_points_de_tache))
|
||||||
}}/{{tache.data.points_de_tache}}{{/if}})</a></span>
|
}}/{{tache.data.points_de_tache}}{{/if}})</a></span>
|
||||||
<div class="item-controls flex-shrink">
|
<div class="item-controls flex-shrink">
|
||||||
<a class="item-control 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-control 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>
|
||||||
</div>
|
</div>
|
||||||
</li>
|
</li>
|
||||||
{{/each}}
|
{{/each}}
|
||||||
@ -419,8 +419,8 @@
|
|||||||
{{#each jeux as |jeu id|}}
|
{{#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>
|
<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">
|
<div class="item-controls flex-shrink">
|
||||||
<a class="item-control 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-control 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>
|
||||||
</div>
|
</div>
|
||||||
</li>
|
</li>
|
||||||
{{/each}}
|
{{/each}}
|
||||||
@ -430,8 +430,8 @@
|
|||||||
{{#each recettesAlchimiques as |recette id|}}
|
{{#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>
|
<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">
|
<div class="item-controls flex-shrink">
|
||||||
<a class="item-control 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-control 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>
|
||||||
</div>
|
</div>
|
||||||
</li>
|
</li>
|
||||||
{{/each}}
|
{{/each}}
|
||||||
@ -509,138 +509,154 @@
|
|||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
<hr>
|
<hr>
|
||||||
{{#if data.attributs.hautrevant.value}}
|
|
||||||
{{#if options.isGM}}
|
|
||||||
<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-control item-delete" title="Supprimer"><i class="fas fa-trash"></i></a>
|
|
||||||
</div>
|
|
||||||
</li>
|
|
||||||
{{/each}}
|
|
||||||
</ul>
|
|
||||||
{{/if}}
|
|
||||||
<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}}</a></span>
|
|
||||||
<span>{{sort.data.draconic}} / {{sort.data.difficulte}}</span>
|
|
||||||
<div class="item-controls flex-shrink">
|
|
||||||
<a class="item-control item-delete" title="Supprimer"><i class="fas fa-trash"></i></a>
|
|
||||||
</div>
|
|
||||||
</li>
|
|
||||||
{{/each}}
|
|
||||||
</ul>
|
|
||||||
|
|
||||||
<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 flex-grow">{{reserve.sort.name}}</span>
|
|
||||||
<span class="flex-shrink">r{{reserve.sort.data.ptreve_reel}}</span>
|
|
||||||
<span class="flex-shrink">{{reserve.coord}}</span>
|
|
||||||
<span>{{caseTmr-label reserve.coord}}</span>
|
|
||||||
<div class="item-controls flex-shrink">
|
|
||||||
<a class="item-control item-delete flex-shrink" 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-control item-edit" title="Editer"><i class="fas fa-edit"></i></a>
|
|
||||||
<a class="item-control item-delete" title="Supprimer"><i class="fas fa-trash"></i></a>
|
|
||||||
</div>
|
|
||||||
</li>
|
|
||||||
{{/each}}
|
|
||||||
</ul>
|
|
||||||
<hr>
|
|
||||||
{{/if}}
|
|
||||||
{{!-- Queues, Souffles, Tetes, Ombre --}}
|
{{!-- Queues, Souffles, Tetes, Ombre --}}
|
||||||
|
{{#if queues.length}}
|
||||||
<h3>Queues:</h3>
|
<h3>Queues:</h3>
|
||||||
<ul class="flex-group-left">
|
<ul class="flex-group-left">
|
||||||
{{#each queues as |queue key|}}
|
{{#each queues as |queue key|}}
|
||||||
<li class="item flexrow" data-attribute={{key}} data-item-id="{{queue._id}}">
|
<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>
|
<span class="display-label flex-grow"><a data-item-id="{{queue._id}}">{{queue.name}}</a></span>
|
||||||
<div class="item-controls flex-shrink">
|
<div class="item-controls flex-shrink">
|
||||||
<a class="item-control 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>
|
||||||
</div>
|
|
||||||
</li>
|
|
||||||
{{/each}}
|
|
||||||
</ul>
|
|
||||||
<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-control item-delete" title="Delete Item"><i class="fas fa-trash"></i></a>
|
|
||||||
</div>
|
|
||||||
</li>
|
|
||||||
{{/each}}
|
|
||||||
</ul>
|
|
||||||
<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-control item-delete" title="Delete Item"><i class="fas fa-trash"></i></a>
|
|
||||||
</div>
|
</div>
|
||||||
</li>
|
</li>
|
||||||
{{/each}}
|
{{/each}}
|
||||||
</ul>
|
</ul>
|
||||||
|
{{/if}}
|
||||||
|
{{#if ombres.length}}
|
||||||
<h3>Ombres de Thanatos:</h3>
|
<h3>Ombres de Thanatos:</h3>
|
||||||
<ul class="item-list">
|
<ul class="item-list">
|
||||||
{{#each ombres as |ombre key|}}
|
{{#each ombres as |ombre key|}}
|
||||||
<li class="item flexrow" data-attribute={{key}} data-item-id="{{ombre._id}}">
|
<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>
|
<span class="display-label flex-grow"><a data-item-id="{{ombre._id}}">{{ombre.name}}</a></span>
|
||||||
<div class="item-controls flex-shrink">
|
<div class="item-controls flex-shrink">
|
||||||
<a class="item-control 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>
|
||||||
</div>
|
</div>
|
||||||
</li>
|
</li>
|
||||||
{{/each}}
|
{{/each}}
|
||||||
</ul>
|
</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 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>
|
<hr>
|
||||||
<h3>Rencontres présentes:</h3>
|
{{#if hautreve.casesTmr}}
|
||||||
<ul class="item-list">
|
<h3>Cases Spéciales:</h3>
|
||||||
{{#each hautreve.rencontres as |rencontre key|}}
|
<ul class="item-list">
|
||||||
<li class="item flexrow" data-item-id="{{key}}" data-attribute="{{key}}">
|
{{#each hautreve.casesTmr as |casetmr key|}}
|
||||||
<span class="display-label"><a data-item-id="{{key}}">{{rencontre.name}} - {{rencontre.coord}}</a></span>
|
<li class="item flexrow" data-item-id="{{casetmr._id}}" data-attribute="{{key}}">
|
||||||
<span class="flex-shrink">{{caseTmr-label rencontre.coord}}</span>
|
<span class="display-label"><a data-item-id="{{casetmr._id}}">{{casetmr.name}}</a></span>
|
||||||
{{#if rencontre.date}}
|
<span>{{casetmr.data.coord}} - {{caseTmr-label casetmr.data.coord}}</span>
|
||||||
<span>Le {{rencontre.date}} à {{rencontre.heure}}</span>
|
<div class="item-controls flex-shrink">
|
||||||
{{/if}}
|
<a class="item-delete" title="Supprimer"><i class="fas fa-trash"></i></a>
|
||||||
<div class="item-controls flex-shrink">
|
</div>
|
||||||
<a class="item-control rencontre-delete" title="Supprimer"><i class="fas fa-trash"></i></a>
|
</li>
|
||||||
</div>
|
{{/each}}
|
||||||
</li>
|
</ul>
|
||||||
{{/each}}
|
{{/if}}
|
||||||
</ul>
|
|
||||||
<hr>
|
|
||||||
<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>
|
|
||||||
<div class="item-controls flex-shrink">
|
|
||||||
<a class="item-control item-delete" title="Supprimer"><i class="fas fa-trash"></i></a>
|
|
||||||
</div>
|
|
||||||
</li>
|
|
||||||
{{/each}}
|
|
||||||
</ul>
|
|
||||||
<br><br>
|
<br><br>
|
||||||
{{/if}}
|
{{/if}}
|
||||||
</div>
|
</div>
|
||||||
@ -648,79 +664,10 @@
|
|||||||
{{!-- 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-monnaie.html" monnaie=monnaie}}
|
{{> "systems/foundryvtt-reve-de-dragon/templates/actor-sheet-inventaire.html"}}
|
||||||
|
{{> "systems/foundryvtt-reve-de-dragon/templates/actor-sheet-liens-animaux.html"}}
|
||||||
<span class="item-name"><h4>Equipement porté</h4></span>
|
{{> "systems/foundryvtt-reve-de-dragon/templates/actor-sheet-liens-suivants.html"}}
|
||||||
<div>
|
{{> "systems/foundryvtt-reve-de-dragon/templates/actor-sheet-liens-vehicules.html"}}
|
||||||
<span class="item-name">Encombrement total/max : {{numberFormat calc.encTotal decimals=2}} / {{data.attributs.encombrement.value}} <b>{{calc.surEncombrementMessage}}</b></span> -
|
|
||||||
<span class="item-name">Estimation de l'équipement : {{numberFormat calc.prixTotalEquipement decimals=2}} Sols</span>
|
|
||||||
</div>
|
|
||||||
<div>
|
|
||||||
<span class="item-name"><a class="creer-un-objet">Créer un objet</a></span>
|
|
||||||
{{#if options.isGM}}
|
|
||||||
<span class="item-name"> - <a id="nettoyer-conteneurs">Vider tout les conteneurs</a></span>
|
|
||||||
{{/if}}
|
|
||||||
</div>
|
|
||||||
<ul class="item-list alterne-list">
|
|
||||||
<li class="competence-header flexrow">
|
|
||||||
<img class="sheet-competence-img" src="{{img}}" title="Equipement"/>
|
|
||||||
<span class="competence-title flex-grow">Nom</span>
|
|
||||||
<span class="competence-title">Q.</span>
|
|
||||||
<span class="competence-title">Enc.</span>
|
|
||||||
<span class="competence-title flex-grow">Equiper/Editer/Suppr.</span>
|
|
||||||
</li>
|
|
||||||
{{#each objets as |item id|}}
|
|
||||||
{{#unless item.estContenu}}
|
|
||||||
{{#if (ne item.type 'conteneur')}}
|
|
||||||
{{> "systems/foundryvtt-reve-de-dragon/templates/actor-sheet-inventaire-conteneur.html" item=item }}
|
|
||||||
{{/if}}
|
|
||||||
{{/unless}}
|
|
||||||
{{/each}}
|
|
||||||
{{#each conteneurs as |conteneur id|}}
|
|
||||||
{{buildConteneur this}}
|
|
||||||
{{/each}}
|
|
||||||
</ul>
|
|
||||||
|
|
||||||
<span class="item-name"><h4>Compagnons animaux</h4></span>
|
|
||||||
<ul class="item-list alterne-list">
|
|
||||||
{{#each subacteurs.montures as |monture id|}}
|
|
||||||
<li class="item flexrow list-item" data-actor-id="{{monture.id}}">
|
|
||||||
<img class="sheet-competence-img" src="{{monture.img}}" title="{{monture.name}}"/>
|
|
||||||
<span class="competence-title subacteur-label"><a>{{monture.name}}</a></span>
|
|
||||||
<div class="item-controls flex-shrink">
|
|
||||||
<a class="item-control subacteur-delete" title="Supprimer"><i class="fas fa-trash"></i></a>
|
|
||||||
</div>
|
|
||||||
</li>
|
|
||||||
{{/each}}
|
|
||||||
</ul>
|
|
||||||
|
|
||||||
<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="competence-title subacteur-label"><a>{{vehicule.name}}</a></span>
|
|
||||||
<span class="competence-title">{{vehicule.categorie}}</span>
|
|
||||||
<span class="competence-title">{{vehicule.structure}}</span>
|
|
||||||
<div class="item-controls flex-shrink">
|
|
||||||
<a class="item-control subacteur-delete" title="Supprimer"><i class="fas fa-trash"></i></a>
|
|
||||||
</div>
|
|
||||||
</li>
|
|
||||||
{{/each}}
|
|
||||||
</ul>
|
|
||||||
|
|
||||||
<span class="item-name"><h4>Suivants</h4></span>
|
|
||||||
<ul class="item-list alterne-list">
|
|
||||||
{{#each subacteurs.suivants as |suivant id|}}
|
|
||||||
<li class="item flexrow list-item" data-actor-id="{{suivant.id}}">
|
|
||||||
<img class="sheet-competence-img" src="{{suivant.img}}" title="{{suivant.name}}"/>
|
|
||||||
<span class="competence-title subacteur-label"><a>{{suivant.name}}</a></span>
|
|
||||||
<div class="item-controls flex-shrink">
|
|
||||||
<a class="item-control subacteur-delete" title="Supprimer"><i class="fas fa-trash"></i></a>
|
|
||||||
</div>
|
|
||||||
</li>
|
|
||||||
{{/each}}
|
|
||||||
</ul>
|
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
@ -25,7 +25,7 @@
|
|||||||
<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">
|
||||||
<li class="competence 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 flexrow" name="categorie">Catégorie</span>
|
||||||
<select name="data.categorie" class="categorie" data-dtype="String">
|
<select name="data.categorie" class="categorie" data-dtype="String">
|
||||||
{{#select data.categorie}}
|
{{#select data.categorie}}
|
||||||
@ -33,31 +33,31 @@
|
|||||||
{{/select}}
|
{{/select}}
|
||||||
</select>
|
</select>
|
||||||
</li>
|
</li>
|
||||||
<li class="competence 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 flexrow" name="categorie">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="data.resistance" value="{{data.resistance}}" data-dtype="Number" />
|
||||||
</li>
|
</li>
|
||||||
<li class="competence 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 flexrow" name="categorie">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="data.structure" value="{{data.structure}}" data-dtype="Number" />
|
||||||
</li>
|
</li>
|
||||||
<li class="competence 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 flexrow" name="categorie">Vitesse</span>
|
||||||
<input class="competence-value flexrow" type="text" name="data.vitesse" value="{{data.vitesse}}" data-dtype="String" />
|
<input class="competence-value flexrow" type="text" name="data.vitesse" value="{{data.vitesse}}" data-dtype="String" />
|
||||||
</li>
|
</li>
|
||||||
<li class="competence 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 flexrow" name="categorie">Bonus</span>
|
||||||
<input class="competence-value flexrow" type="text" name="data.bonus" value="{{data.bonus}}" data-dtype="String" />
|
<input class="competence-value flexrow" type="text" name="data.bonus" value="{{data.bonus}}" data-dtype="String" />
|
||||||
</li>
|
</li>
|
||||||
<li class="competence 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 flexrow" name="categorie">Manoeuvrabilité</span>
|
||||||
<input class="competence-value flexrow" type="text" name="data.manoeuvrabilite" value="{{data.manoeuvrabilite}}" data-dtype="String" />
|
<input class="competence-value flexrow" type="text" name="data.manoeuvrabilite" value="{{data.manoeuvrabilite}}" data-dtype="String" />
|
||||||
</li>
|
</li>
|
||||||
<li class="competence 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 flexrow" name="categorie">Equipage</span>
|
||||||
<input class="competence-value flexrow" type="text" name="data.equipage" value="{{data.equipage}}" data-dtype="Number" />
|
<input class="competence-value flexrow" type="text" name="data.equipage" value="{{data.equipage}}" data-dtype="Number" />
|
||||||
</li>
|
</li>
|
||||||
<li class="competence 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 flexrow" name="categorie">Capacité d'Encombrement</span>
|
||||||
<input class="competence-value flexrow" type="text" name="data.capacite_encombrement" value="{{data.capacite_encombrement}}" data-dtype="Number" />
|
<input class="competence-value flexrow" type="text" name="data.capacite_encombrement" value="{{data.capacite_encombrement}}" data-dtype="Number" />
|
||||||
</li>
|
</li>
|
||||||
@ -69,45 +69,7 @@
|
|||||||
{{!-- 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-monnaie.html" monnaie=monnaie}}
|
{{> "systems/foundryvtt-reve-de-dragon/templates/actor-sheet-inventaire.html"}}
|
||||||
|
|
||||||
<span class="item-name"><h4>Equipement chargé</h4></span>
|
|
||||||
|
|
||||||
<span class="item-name">Encombrement total/max : {{numberFormat calc.encTotal decimals=2}} / {{data.capacite_encombrement}} <b>{{calc.surEncombrementMessage}}</b></span> -
|
|
||||||
<span class="item-name"><a class="creer-un-objet">Créer un objet</a></span>
|
|
||||||
{{#if options.isGM}}
|
|
||||||
<span class="item-name"> - <a id="nettoyer-conteneurs">Vider tout les conteneurs</a></span>
|
|
||||||
{{/if}}
|
|
||||||
<ul class="item-list alterne-list">
|
|
||||||
<li class="competence-header flexrow">
|
|
||||||
<img class="sheet-competence-img" src="{{img}}" title="Equipement"/>
|
|
||||||
<span class="competence-title competence-label flex-grow">Nom</span>
|
|
||||||
<span class="competence-title competence-label">Q.</span>
|
|
||||||
<span class="competence-title competence-value">Enc.</span>
|
|
||||||
<span class="competence-title competence-value">Equiper/Editer/Suppr.</span>
|
|
||||||
</li>
|
|
||||||
{{#each objets as |item id|}}
|
|
||||||
{{#unless item.estContenu}}
|
|
||||||
{{#if (ne item.type 'conteneur')}}
|
|
||||||
<li class="item flexrow list-item" data-item-id="{{item._id}}">
|
|
||||||
<img class="sheet-competence-img" src="{{item.img}}" title="{{item.name}}"/>
|
|
||||||
<span class="item-name flex-grow">{{item.name}}</span>
|
|
||||||
<span class="item-quantite">{{item.data.quantite}}</span>
|
|
||||||
<span class="item-quantite">{{numberFormat item.data.encTotal decimals=2}}</span>
|
|
||||||
<div class="item-controls">
|
|
||||||
<a class="item-control item-equip" title="Equiper">{{#if item.data.equipe}}<i class="fas fa-circle"></i>{{else}}<i class="fas fa-genderless"></i>{{/if}}</a>
|
|
||||||
<a class="item-control item-edit" title="Editer"><i class="fas fa-edit"></i></a>
|
|
||||||
<a class="item-control item-delete" title="Supprimer"><i class="fas fa-trash"></i></a>
|
|
||||||
</div>
|
|
||||||
</li>
|
|
||||||
{{/if}}
|
|
||||||
{{/unless}}
|
|
||||||
{{/each}}
|
|
||||||
{{#each conteneurs as |conteneur id|}}
|
|
||||||
{{buildConteneur this}}
|
|
||||||
{{/each}}
|
|
||||||
</ul>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
|
|
||||||
{{!-- Biography Tab --}}
|
{{!-- Biography Tab --}}
|
||||||
|
16
templates/chat-command-nom.html
Normal file
16
templates/chat-command-nom.html
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
|
||||||
|
<h4>Proposition de nom: {{nom}}</h4>
|
||||||
|
<span class="chat-card-button-area">
|
||||||
|
<a class="button-creer-acteur chat-card-button"
|
||||||
|
data-nom='{{nom}}'
|
||||||
|
data-type='personnage'
|
||||||
|
>
|
||||||
|
Créer un Personnage</a>
|
||||||
|
</span>
|
||||||
|
<span class="chat-card-button-area">
|
||||||
|
<a class="button-creer-acteur chat-card-button"
|
||||||
|
data-nom='{{nom}}'
|
||||||
|
data-type='creature'>
|
||||||
|
Créer une créature</a>
|
||||||
|
</span>
|
||||||
|
|
@ -1,6 +1,11 @@
|
|||||||
<img class="chat-icon" src="{{competence.img}}" alt="{{competence.name}}"/>
|
<img class="chat-icon" src="{{competence.img}}" alt="{{competence.name}}"/>
|
||||||
<h4 data-categorie="tmr" data-actor-id="{{actor._id}}">
|
<h4 data-categorie="tmr" data-actor-id="{{actor._id}}">
|
||||||
{{alias}} tente de {{maitrise.verbe}} {{le tmr.genre}} {{tmr.label}} ({{tmr.coord}})
|
{{alias}} tente de {{maitrise.verbe}} {{le tmr.genre}}
|
||||||
|
{{#if isTMRCache}}
|
||||||
|
{{caseTmr-type tmr.coord}}
|
||||||
|
{{else}}
|
||||||
|
{{tmr.label}} ({{tmr.coord}})
|
||||||
|
{{/if}}
|
||||||
</h4>
|
</h4>
|
||||||
{{#if previous}}
|
{{#if previous}}
|
||||||
{{#with previous}}
|
{{#with previous}}
|
||||||
@ -11,15 +16,20 @@
|
|||||||
{{> "systems/foundryvtt-reve-de-dragon/templates/chat-infojet.html"}}
|
{{> "systems/foundryvtt-reve-de-dragon/templates/chat-infojet.html"}}
|
||||||
<hr>
|
<hr>
|
||||||
<span>
|
<span>
|
||||||
{{#if rolled.isSuccess}}
|
{{alias}}
|
||||||
{{alias}} parvient à {{maitrise.verbe}} {{le tmr.genre}} {{tmr.label}} !
|
{{#if rolled.isSuccess}}parvient à{{else}}échoue à{{/if}}
|
||||||
|
{{maitrise.verbe}} {{le tmr.genre}}
|
||||||
|
{{#if isTMRCache}}
|
||||||
|
{{caseTmr-type tmr.coord}}
|
||||||
{{else}}
|
{{else}}
|
||||||
{{alias}} échoue à {{maitrise.verbe}} {{le tmr.genre}} {{tmr.label}}.
|
{{tmr.label}} ({{tmr.coord}})
|
||||||
{{alias}} <strong>quitte les Terres Médianes</strong> !
|
{{/if}}!
|
||||||
{{#if souffle}}
|
{{#if rolled.isEchec}}
|
||||||
<br>De plus, son échec total lui fait subir un Souffle de Dragon : {{souffle.name}}
|
{{alias}} <strong>quitte les Terres Médianes</strong> !
|
||||||
|
{{#if souffle}}
|
||||||
|
<br>De plus, son échec total lui fait subir un Souffle de Dragon : {{souffle.name}}
|
||||||
|
{{/if}}
|
||||||
{{/if}}
|
{{/if}}
|
||||||
{{/if}}
|
|
||||||
</span>
|
</span>
|
||||||
{{#if poesie}}
|
{{#if poesie}}
|
||||||
<hr>
|
<hr>
|
||||||
|
9
templates/chat-resultat-meteo.html
Normal file
9
templates/chat-resultat-meteo.html
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
<img class="chat-icon" src="icons/svg/lightning.svg" alt="Météo" />
|
||||||
|
<h4>Météo aléatoire</h4>
|
||||||
|
<ul>
|
||||||
|
<li>Vent: {{lowerFirst vent.description}} {{apostrophe 'de' vent.direction}}, force {{vent.force}}</li>
|
||||||
|
<li>Mer {{lowerFirst mer.description}}, {{apostrophe 'de' mer.direction}}, force {{mer.force}}</li>
|
||||||
|
<li>Température {{lowerFirst temperature.description}} ({{numberFormat temperature.force decimals=0 sign=true}})</li>
|
||||||
|
<li>Couverture nuageuse: {{lowerFirst nuage.description}}</li>
|
||||||
|
<li>Pluie: {{lowerFirst pluie.description}}</li>
|
||||||
|
</div>
|
@ -1,31 +1,38 @@
|
|||||||
<img class="chat-icon" src="{{competence.img}}" />
|
<img class="chat-icon" src="{{competence.img}}" />
|
||||||
<h4>
|
<h4>
|
||||||
{{#if (eq mode "possession")}}
|
{{#if (eq mode "possession")}}
|
||||||
{{alias}} tente de posséder {{possede}}
|
{{attacker.name}} tente de {{#if isECNIDefender}}conjurer la possession de{{else}}posséder{{/if}} {{defender.name}}
|
||||||
{{else}}
|
{{else}}
|
||||||
{{alias}} tente de conjurer la possession de {{possesseur}}
|
{{defender.name}} tente de {{#if isECNIDefender}}résister à{{else}}conjurer la possession de{{/if}} {{attacker.name}}
|
||||||
{{/if}}
|
{{/if}}
|
||||||
</h4>
|
</h4>
|
||||||
{{> "systems/foundryvtt-reve-de-dragon/templates/chat-infojet.html"}}
|
{{> "systems/foundryvtt-reve-de-dragon/templates/chat-infojet.html"}}
|
||||||
|
|
||||||
<hr>
|
<hr>
|
||||||
|
|
||||||
<div>
|
<div>
|
||||||
<span class='chat-card-button-area'>
|
<span class='chat-card-button-area'>
|
||||||
<br>
|
<br>
|
||||||
{{#if (eq mode "possession")}}
|
{{#if (eq mode "possession")}}
|
||||||
{{#if possession.isSuccess}}
|
{{#if possession.isSuccess}}
|
||||||
<a class='defense-possession chat-card-button' data-attackerId='{{attackerId}}'
|
<a class='defense-possession chat-card-button'
|
||||||
data-defenderId='{{defenderId}}' data-possessionId='{{possession.data.possessionid}}'>Résister à la possession</a>
|
data-attackerId='{{attacker.id}}'
|
||||||
</a>
|
data-defenderId='{{defender.id}}'
|
||||||
|
data-possessionId='{{possession.data.possessionid}}'>
|
||||||
|
{{#if isECNIDefender}}
|
||||||
|
Résister à la conjuration
|
||||||
|
{{else}}
|
||||||
|
Résister à la possession
|
||||||
|
{{/if}}
|
||||||
|
</a>
|
||||||
{{else}}
|
{{else}}
|
||||||
La Tentative de Possession a échouée !
|
La Tentative de {{#if isECNIDefender}}conjuration{{else}}possession{{/if}} a échoué !
|
||||||
{{/if}}
|
{{/if}}
|
||||||
{{else}}
|
{{else}}
|
||||||
{{#if rolled.isSuccess}}
|
{{#if rolled.isSuccess}}
|
||||||
La Tentative de Possession a été conjurée ! {{alias}} résiste à la tentative de possession.
|
La tentative de {{#if isECNIDefender}}conjuration a été repoussée{{else}}possession a été conjurée{{/if}}!
|
||||||
{{else}}
|
{{defender.name}} a résisté.
|
||||||
La Tentative de Possession n'a pas pu être conjurée !
|
{{else}}
|
||||||
|
La tentative de {{#if isECNIDefender}}conjuration a réussi{{else}}possession n'a pas pu être conjurée{{/if}}!
|
||||||
{{/if}}
|
{{/if}}
|
||||||
{{/if}}
|
{{/if}}
|
||||||
<br>Points de Possession: {{possession.ptsPossession}}
|
<br>Points de Possession: {{possession.ptsPossession}}
|
||||||
|
@ -1,5 +1,9 @@
|
|||||||
<form class="skill-roll-dialog">
|
<form class="skill-roll-dialog">
|
||||||
<h2>Conjuration d'une Possession {{possession.name}}!</h2>
|
<h2>
|
||||||
|
{{defender.name}} tente de
|
||||||
|
{{#if isECNIDefender}}maintenir{{else}}résister à{{/if}}
|
||||||
|
la possession de {{attacker.name}}
|
||||||
|
</h2>
|
||||||
<div class="grid grid-2col">
|
<div class="grid grid-2col">
|
||||||
<div class="flex-group-left">
|
<div class="flex-group-left">
|
||||||
<img class="chat-icon" src="{{competence.img}}" alt="{{competence.name}}"/>
|
<img class="chat-icon" src="{{competence.img}}" alt="{{competence.name}}"/>
|
||||||
|
@ -1,5 +1,10 @@
|
|||||||
<form class="skill-roll-dialog">
|
<form class="skill-roll-dialog">
|
||||||
<h2>Maîtrise {{tmr.label}} ({{tmr.coord}})</h2>
|
<h2>Maîtrise {{#if isTMRCache}}
|
||||||
|
{{tmr.type}}
|
||||||
|
{{else}}
|
||||||
|
{{tmr.label}} ({{tmr.coord}})
|
||||||
|
{{/if}}
|
||||||
|
</h2>
|
||||||
<div class="grid grid-2col">
|
<div class="grid grid-2col">
|
||||||
<div class="flex-group-left">
|
<div class="flex-group-left">
|
||||||
<img class="chat-icon" src="{{competence.img}}" alt="{{competence.name}}"/>
|
<img class="chat-icon" src="{{competence.img}}" alt="{{competence.name}}"/>
|
||||||
|
@ -1,4 +1,3 @@
|
|||||||
{{log 'lecture signe draconique' this}}
|
|
||||||
<form class="dialog-roll-sort">
|
<form class="dialog-roll-sort">
|
||||||
<h2>Lire le signe draconique
|
<h2>Lire le signe draconique
|
||||||
<select name="signe-draconique" class="roll-signedraconique flex-grow" data-dtype="String">
|
<select name="signe-draconique" class="roll-signedraconique flex-grow" data-dtype="String">
|
||||||
|
@ -1,10 +1,13 @@
|
|||||||
<div class="control-icon rdd-combat ">
|
<div class="control-icon rdd-combat ">
|
||||||
<img class="rdd-hud-togglebutton" src="systems/foundryvtt-reve-de-dragon/icons/heures/hd06.svg" width="36" height="36" title="Attaque"/>
|
<img class="rdd-hud-togglebutton" src="systems/foundryvtt-reve-de-dragon/icons/heures/hd06.svg" width="36" height="36" title="Attaque"/>
|
||||||
<div class="rdd-hud-list tokenhudext left">
|
<div class="rdd-hud-list tokenhudext left">
|
||||||
{{#each armes as |arme key|}}
|
{{#each actions as |action key|}}
|
||||||
{{#unless arme.data.initOnly}}
|
{{#unless action.data.initOnly}}
|
||||||
<div class="control-icon tokenhudicon rdd-hud-menu rdd-attaque" data-combatant-id="{{../combatant.id}}" data-arme-id="{{arme.index}}" title="{{arme.name}}">
|
<div class="control-icon tokenhudicon rdd-hud-menu rdd-attaque"
|
||||||
<label>C:{{arme.name}} {{arme.data.mainInfo}}</label>
|
data-combatant-id="{{../combatant.id}}"
|
||||||
|
data-action-index="{{action.index}}"
|
||||||
|
title="{{action.name}}">
|
||||||
|
<label>{{action.name}} {{action.data.mainInfo}}</label>
|
||||||
</div>
|
</div>
|
||||||
{{/unless}}
|
{{/unless}}
|
||||||
{{/each}}
|
{{/each}}
|
||||||
|
@ -1,14 +1,21 @@
|
|||||||
<div class="control-icon rdd-initiative ">
|
<div class="control-icon rdd-initiative ">
|
||||||
<img class="rdd-hud-togglebutton" src="icons/svg/sword.svg" width="36" height="36" title="Initiative" />
|
<img class="rdd-hud-togglebutton" src="icons/svg/sword.svg" width="36" height="36" title="Initiative" />
|
||||||
<div class="rdd-hud-list tokenhudext right">
|
<div class="rdd-hud-list tokenhudext right">
|
||||||
{{#each armes as |arme key|}}
|
{{#each actions as |action key|}}
|
||||||
<div class="control-icon tokenhudicon rdd-hud-menu" data-command="{{arme.command}}" data-combatant-id="{{../combatant.id}}" data-arme-id="{{arme.index}}" title="{{arme.name}}">
|
<div class="control-icon tokenhudicon rdd-hud-menu"
|
||||||
<label>I:{{arme.name}} {{arme.data.mainInfo}}</label>
|
data-combatant-id="{{../combatant.id}}"
|
||||||
|
data-action-index="{{action.index}}"
|
||||||
|
title="{{action.name}}">
|
||||||
|
<label>init: {{action.name}} {{action.data.mainInfo}}</label>
|
||||||
</div>
|
</div>
|
||||||
{{/each}}
|
{{/each}}
|
||||||
{{#each commandes as |commande key|}}
|
{{#each commandes as |commande key|}}
|
||||||
<div class="control-icon tokenhudicon rdd-hud-menu" data-command="{{commande.command}}" data-combatant-id="{{../combatant.id}}" data-arme-id="{{commande.index}}" title="{{commande.name}}">
|
<div class="control-icon tokenhudicon rdd-hud-menu"
|
||||||
<label>I:{{commande.name}}</label>
|
data-command="{{commande.command}}"
|
||||||
|
data-combatant-id="{{../combatant.id}}"
|
||||||
|
data-action-index="{{commande.index}}"
|
||||||
|
title="{{commande.name}}">
|
||||||
|
<label>{{commande.name}}</label>
|
||||||
</div>
|
</div>
|
||||||
{{/each}}
|
{{/each}}
|
||||||
</div>
|
</div>
|
||||||
|
@ -29,11 +29,10 @@
|
|||||||
<span><label>Contenu : </label></span>
|
<span><label>Contenu : </label></span>
|
||||||
<ul class="item-list alterne-list">
|
<ul class="item-list alterne-list">
|
||||||
<li class="competence-header flexrow">
|
<li class="competence-header flexrow">
|
||||||
<img class="sheet-competence-img" src="{{img}}" title="Equipement"/>
|
<span class="equipement-nom">Nom</span>
|
||||||
<span class="competence-title flex-grow">Nom</span>
|
<span class="equipement-detail">Q.</span>
|
||||||
<span class="competence-title">Q.</span>
|
<span class="equipement-detail">Enc.</span>
|
||||||
<span class="competence-title">Enc.</span>
|
<span class="equipement-actions">Actions</span>
|
||||||
<span class="competence-title flex-grow">Equiper/Editer/Suppr.</span>
|
|
||||||
</li>
|
</li>
|
||||||
{{buildContenu this}}
|
{{buildContenu this}}
|
||||||
</ul>
|
</ul>
|
||||||
|
Loading…
Reference in New Issue
Block a user