forked from public/foundryvtt-reve-de-dragon
Compare commits
20 Commits
foundryvtt
...
foundryvtt
| Author | SHA1 | Date | |
|---|---|---|---|
| 6b0c7f4d38 | |||
| dd2109735d | |||
|
|
0b192d66c3 | ||
|
|
472cbb372e | ||
|
|
8d2e7fd0c8 | ||
|
|
c8526a2270 | ||
|
|
8b6abcc8bb | ||
|
|
468982b07b | ||
|
|
95179ffff2 | ||
|
|
884733e54b | ||
| a2d4b1049e | |||
| 3ce3898326 | |||
|
|
32fc0019d5 | ||
|
|
f3f928e43f | ||
|
|
374a0e1846 | ||
|
|
1e5a99e009 | ||
| 64320fc260 | |||
| ff923ebab2 | |||
|
|
bcd25dd0ed | ||
|
|
ccb6709f5b |
@@ -16,7 +16,6 @@
|
||||
"TypeTarot": "Carte de tarot",
|
||||
"TypeCasetmr": "TMR spéciale",
|
||||
"TypeRencontre": "Rencontre TMR",
|
||||
"TypeRencontrestmr": "Rencontre TMR (ancien)",
|
||||
"TypeMunition": "Munition",
|
||||
"TypeMonnaie": "Monnaie",
|
||||
"TypeHerbe": "Herbe ou plante",
|
||||
@@ -43,7 +42,8 @@
|
||||
"TypeSouffle": "Souffle de Dragon",
|
||||
"TypeTete": "Tête de Dragon",
|
||||
"TypePossession": "Possession",
|
||||
"TypeSortreserve": "Sort en réserve"
|
||||
"TypeSortreserve": "Sort en réserve",
|
||||
"TypeExtraitpoetique": "Extrait poetique"
|
||||
},
|
||||
"EFFECT": {
|
||||
"StatusStunned": "Sonné",
|
||||
|
||||
@@ -29,7 +29,6 @@ import { Monnaie } from "./item-monnaie.js";
|
||||
import { DialogConsommer } from "./dialog-item-consommer.js";
|
||||
import { DialogFabriquerPotion } from "./dialog-fabriquer-potion.js";
|
||||
import { RollDataAjustements } from "./rolldata-ajustements.js";
|
||||
import { DialogItemAchat } from "./dialog-item-achat.js";
|
||||
import { RdDItem } from "./item.js";
|
||||
import { RdDPossession } from "./rdd-possession.js";
|
||||
import { ENTITE_BLURETTE, ENTITE_INCARNE, ENTITE_NONINCARNE, HIDE_DICE, SHOW_DICE, SYSTEM_RDD, SYSTEM_SOCKET_ID } from "./constants.js";
|
||||
@@ -65,7 +64,7 @@ export class RdDActor extends Actor {
|
||||
static onSocketMessage(sockmsg) {
|
||||
switch (sockmsg.msg) {
|
||||
case "msg_remote_actor_call":
|
||||
return RdDActor.onRemoteActorCall(sockmsg.data);
|
||||
return RdDActor.onRemoteActorCall(sockmsg.data, sockmsg.userId);
|
||||
case "msg_reset_nombre_astral":
|
||||
console.log("RESET ASTRAL", game.user.character);
|
||||
game.user.character.resetNombreAstral();
|
||||
@@ -73,23 +72,26 @@ export class RdDActor extends Actor {
|
||||
}
|
||||
}
|
||||
|
||||
static remoteActorCall(callData, canExecuteLocally = () => Misc.isUniqueConnectedGM()) {
|
||||
if (canExecuteLocally()) {
|
||||
RdDActor.onRemoteActorCall(callData);
|
||||
static remoteActorCall(callData, userId = undefined) {
|
||||
userId = userId ?? Misc.firstConnectedGMId();
|
||||
if (userId == game.user.id) {
|
||||
RdDActor.onRemoteActorCall(callData, userId);
|
||||
return false;
|
||||
}
|
||||
else {
|
||||
game.socket.emit(SYSTEM_SOCKET_ID, { msg: "msg_remote_actor_call", data: callData });
|
||||
game.socket.emit(SYSTEM_SOCKET_ID, { msg: "msg_remote_actor_call", data: callData, userId: userId });
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
static onRemoteActorCall(callData) {
|
||||
const actor = game.actors.get(callData?.actorId);
|
||||
if (Misc.isOwnerPlayerOrUniqueConnectedGM(actor)) { // Seul le joueur choisi effectue l'appel: le joueur courant si propriétaire de l'actor, ou le MJ sinon
|
||||
const args = callData.args;
|
||||
console.info(`RdDActor.onRemoteActorCall: pour l'Actor ${callData.actorId}, appel de RdDActor.${callData.method}(`, ...args, ')');
|
||||
actor[callData.method](...args);
|
||||
static onRemoteActorCall(callData, userId) {
|
||||
if (userId == game.user.id) {
|
||||
const actor = game.actors.get(callData?.actorId);
|
||||
if (Misc.isOwnerPlayerOrUniqueConnectedGM(actor)) { // Seul le joueur choisi effectue l'appel: le joueur courant si propriétaire de l'actor, ou le MJ sinon
|
||||
const args = callData.args;
|
||||
console.info(`RdDActor.onRemoteActorCall: pour l'Actor ${callData.actorId}, appel de RdDActor.${callData.method}(`, ...args, ')');
|
||||
actor[callData.method](...args);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -299,7 +301,7 @@ export class RdDActor extends Actor {
|
||||
|
||||
/* -------------------------------------------- */
|
||||
getObjet(id) {
|
||||
return id ? this.items.find(it => it.id == id) : undefined;
|
||||
return this.getEmbeddedDocument('Item', id);
|
||||
}
|
||||
|
||||
listItemsData(type) {
|
||||
@@ -1932,15 +1934,24 @@ export class RdDActor extends Actor {
|
||||
async consommer(item, choix) {
|
||||
switch (item.type) {
|
||||
case 'nourritureboisson':
|
||||
return await this.consommerNourritureboisson(item, choix);
|
||||
return await this.consommerNourritureboisson(item.id, choix);
|
||||
case 'potion':
|
||||
return await this.consommerPotion(item)
|
||||
}
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
async consommerNourritureboisson(item, choix = { doses: 1, seForcer: false, supprimerSiZero: false }) {
|
||||
|
||||
async consommerNourritureboisson(itemId, choix = { doses: 1, seForcer: false, supprimerSiZero: false}, userId = undefined) {
|
||||
if (userId != undefined && userId != game.user.id) {
|
||||
RdDActor.remoteActorCall({
|
||||
actorId: this.id,
|
||||
method: 'consommerNourritureboisson',
|
||||
args: [itemId, choix, userId]
|
||||
},
|
||||
userId)
|
||||
return;
|
||||
}
|
||||
const item = this.getObjet(itemId)
|
||||
if (item.type != 'nourritureboisson') {
|
||||
return;
|
||||
}
|
||||
@@ -2337,7 +2348,7 @@ export class RdDActor extends Actor {
|
||||
const dialog = await RdDRoll.create(this, rollData,
|
||||
{
|
||||
html: 'systems/foundryvtt-reve-de-dragon/templates/dialog-roll-sort.html',
|
||||
options: { height: 600 },
|
||||
options: { height: 'fit-content' },
|
||||
close: html => { this.currentTMR.maximize() } // Re-display TMR
|
||||
},
|
||||
{
|
||||
@@ -2662,7 +2673,7 @@ export class RdDActor extends Actor {
|
||||
const dialog = await RdDRoll.create(this, artData,
|
||||
{
|
||||
html: `systems/foundryvtt-reve-de-dragon/templates/dialog-roll-${oeuvre.type}.html`,
|
||||
options: { height: 500, }
|
||||
options: { height: 'fit-content', }
|
||||
},
|
||||
{
|
||||
name: `jet-${artData.art}`,
|
||||
@@ -2802,7 +2813,7 @@ export class RdDActor extends Actor {
|
||||
const dialog = await RdDRoll.create(this, meditationData,
|
||||
{
|
||||
html: 'systems/foundryvtt-reve-de-dragon/templates/dialog-roll-meditation.html',
|
||||
options: { height: 575, }
|
||||
options: { height: 'fit-content', }
|
||||
},
|
||||
{
|
||||
name: 'jet-meditation',
|
||||
@@ -2879,7 +2890,7 @@ export class RdDActor extends Actor {
|
||||
const dialog = await RdDRoll.create(this, rollData,
|
||||
{
|
||||
html: 'systems/foundryvtt-reve-de-dragon/templates/dialog-roll-signedraconique.html',
|
||||
options: { height: 600 },
|
||||
options: { height: 'fit-content' },
|
||||
close: html => { this.currentTMR.maximize() } // Re-display TMR
|
||||
},
|
||||
{
|
||||
@@ -3646,13 +3657,9 @@ export class RdDActor extends Actor {
|
||||
});
|
||||
return;
|
||||
}
|
||||
|
||||
const acheteur = achat.acheteurId ? game.actors.get(achat.acheteurId) : undefined;
|
||||
const vendeur = achat.vendeurId ? game.actors.get(achat.vendeurId) : undefined;
|
||||
const messageVente = game.messages.get(achat.chatMessageIdVente);
|
||||
const html = await messageVente.getHTML();
|
||||
const button = html.find(".button-acheter")[0];
|
||||
const vente = DialogItemAchat.venteData(button);
|
||||
const vente = achat.vente;
|
||||
const itemId = vente.item._id;
|
||||
const isItemEmpilable = "quantite" in vente.item.system;
|
||||
|
||||
@@ -3692,7 +3699,7 @@ export class RdDActor extends Actor {
|
||||
let items = await acheteur.createEmbeddedDocuments("Item", listeAchat);
|
||||
if (achat.choix.consommer && vente.item.type == 'nourritureboisson') {
|
||||
achat.choix.doses = achat.choix.nombreLots;
|
||||
await acheteur.consommerNourritureboisson(items[0], achat.choix);
|
||||
await acheteur.consommerNourritureboisson(items[0].id, achat.choix, vente.actingUserId);
|
||||
}
|
||||
}
|
||||
if (coutDeniers > 0) {
|
||||
@@ -3715,6 +3722,7 @@ export class RdDActor extends Actor {
|
||||
vente["properties"] = new RdDItem(vente.item).getProprietes();
|
||||
vente.quantiteNbLots -= achat.choix.nombreLots;
|
||||
vente.jsondata = JSON.stringify(vente.item);
|
||||
const messageVente = game.messages.get(achat.chatMessageIdVente);
|
||||
messageVente.update({ content: await renderTemplate('systems/foundryvtt-reve-de-dragon/templates/chat-vente-item.html', vente) });
|
||||
messageVente.render(true);
|
||||
}
|
||||
|
||||
@@ -27,14 +27,15 @@ export class DialogChronologie extends Dialog {
|
||||
dateReel: DialogChronologie.getCurrentDateTime()
|
||||
};
|
||||
const html = await renderTemplate("systems/foundryvtt-reve-de-dragon/templates/dialog-chronologie.html", dialogData);
|
||||
new DialogChronologie(html).render(true);
|
||||
const dialog = new DialogChronologie(html);
|
||||
dialog.render(true);
|
||||
}
|
||||
|
||||
constructor(html) {
|
||||
const options = {
|
||||
classes: ["DialogChronologie"],
|
||||
width: 500,
|
||||
height: 350,
|
||||
height: 'fit-content',
|
||||
'z-index': 99999
|
||||
};
|
||||
const conf = {
|
||||
@@ -42,8 +43,7 @@ export class DialogChronologie extends Dialog {
|
||||
content: html,
|
||||
buttons: {
|
||||
ajout: { label: "Ajouter", callback: it => this.ajouter() },
|
||||
},
|
||||
default: "ajout"
|
||||
}
|
||||
};
|
||||
super(conf, options);
|
||||
}
|
||||
|
||||
@@ -22,6 +22,7 @@ export class DialogItemAchat extends Dialog {
|
||||
const prixLot = Monnaie.arrondiDeniers(button.attributes['data-prixLot']?.value ?? 0);
|
||||
return {
|
||||
item: json ? JSON.parse(json) : undefined,
|
||||
actingUserId: game.user.id,
|
||||
vendeurId: vendeurId,
|
||||
vendeur: vendeur,
|
||||
acheteur: acheteur,
|
||||
@@ -39,6 +40,7 @@ export class DialogItemAchat extends Dialog {
|
||||
chatMessageIdVente: RdDUtility.findChatMessageId(button)
|
||||
};
|
||||
}
|
||||
|
||||
static async onAcheter(venteData) {
|
||||
const html = await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/dialog-item-achat.html`, venteData);
|
||||
const dialog = new DialogItemAchat(html, venteData);
|
||||
@@ -47,12 +49,12 @@ export class DialogItemAchat extends Dialog {
|
||||
|
||||
constructor(html, venteData) {
|
||||
const isConsommable = venteData.item.type == 'nourritureboisson' && venteData.acheteur?.isPersonnage();
|
||||
let options = { classes: ["dialogachat"], width: 400, height: isConsommable ? 450 : 350, 'z-index': 99999 };
|
||||
let options = { classes: ["dialogachat"], width: 400, height: 'fit-content', 'z-index': 99999 };
|
||||
|
||||
const actionAchat = venteData.prixLot > 0 ? "Acheter" : "Prendre";
|
||||
const buttons = {};
|
||||
if (isConsommable) {
|
||||
buttons["consommer"] = { label: venteData.item.system.boisson ? "Boire" : "Manger", callback: it => { this.onAchatConsommer(); } }
|
||||
buttons["consommer"] = { label: venteData.item.system.boisson ? "Boire" : "Manger", callback: it => this.onAchatConsommer() }
|
||||
}
|
||||
buttons[actionAchat] = { label: actionAchat, callback: it => { this.onAchat(); } };
|
||||
buttons["decliner"] = { label: "Décliner", callback: it => { } };
|
||||
@@ -76,7 +78,8 @@ export class DialogItemAchat extends Dialog {
|
||||
acheteurId: this.venteData.acheteur?.id,
|
||||
prixTotal: this.venteData.prixTotal,
|
||||
chatMessageIdVente: this.venteData.chatMessageIdVente,
|
||||
choix: this.venteData.choix
|
||||
choix: this.venteData.choix,
|
||||
vente: this.venteData
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
@@ -9,7 +9,7 @@ export class DialogConsommer extends Dialog {
|
||||
}
|
||||
|
||||
constructor(actor, item, consommerData, html, onActionItem = async ()=>{}) {
|
||||
const options = { classes: ["dialogconsommer"], width: 350, height: 450, 'z-index': 99999 };
|
||||
const options = { classes: ["dialogconsommer"], width: 350, height: 'fit-content', 'z-index': 99999 };
|
||||
let conf = {
|
||||
title: consommerData.title,
|
||||
content: html,
|
||||
|
||||
@@ -24,7 +24,7 @@ export class DialogItemVente extends Dialog {
|
||||
}
|
||||
|
||||
constructor(venteData, html, callback) {
|
||||
let options = { classes: ["dialogvente"], width: 400, height: 300, 'z-index': 99999 };
|
||||
let options = { classes: ["dialogvente"], width: 400, height: 'fit-content', 'z-index': 99999 };
|
||||
|
||||
let conf = {
|
||||
title: "Proposer",
|
||||
|
||||
@@ -3,9 +3,9 @@ import { Misc } from "./misc.js";
|
||||
export class DialogRepos extends Dialog {
|
||||
|
||||
static async create(actor) {
|
||||
let actorData = actor
|
||||
const html = await renderTemplate("systems/foundryvtt-reve-de-dragon/templates/dialog-repos.html", actorData);
|
||||
new DialogRepos(html, actor).render(true);
|
||||
const html = await renderTemplate("systems/foundryvtt-reve-de-dragon/templates/dialog-repos.html", actor);
|
||||
const dialog = new DialogRepos(html, actor);
|
||||
dialog.render(true);
|
||||
}
|
||||
|
||||
constructor(html, actor) {
|
||||
|
||||
@@ -23,7 +23,7 @@ export class DialogStress extends Dialog {
|
||||
constructor(dialogData, html) {
|
||||
const options = { classes: ["DialogStress"],
|
||||
width: 400,
|
||||
height: 205+dialogData.actors.length*25,
|
||||
height: 'fit-content',
|
||||
'z-index': 99999
|
||||
};
|
||||
const conf = {
|
||||
@@ -31,8 +31,7 @@ export class DialogStress extends Dialog {
|
||||
content: html,
|
||||
buttons: {
|
||||
stress: { label: "Stress !", callback: it => { this.onStress(); } }
|
||||
},
|
||||
default: "stress"
|
||||
}
|
||||
};
|
||||
super(conf, options);
|
||||
this.dialogData = dialogData;
|
||||
|
||||
@@ -72,19 +72,19 @@ export class Monnaie {
|
||||
let parValeur = Misc.classifyFirst(monnaies, it => it.system.valeur_deniers);
|
||||
for (let valeur of [1000, 100, 10, 1]) {
|
||||
const itemPiece = parValeur[valeur];
|
||||
const piecesDeCetteValeur = Math.floor(reste / valeur);
|
||||
if (itemPiece) {
|
||||
if (piecesDeCetteValeur != itemPiece.system.quantite) {
|
||||
updates.push({ _id: parValeur[valeur].id, 'system.quantite': piecesDeCetteValeur });
|
||||
const quantite = Math.floor(reste / valeur);
|
||||
if (quantite != itemPiece.system.quantite) {
|
||||
updates.push({ _id: parValeur[valeur].id, 'system.quantite': quantite });
|
||||
}
|
||||
reste -= piecesDeCetteValeur*valeur;
|
||||
reste -= quantite*valeur;
|
||||
}
|
||||
}
|
||||
console.log('Monnaie.optimiser', actor.name, 'total', fortune, 'parValeur', parValeur, 'updates', updates, 'reste', reste);
|
||||
if (updates.length > 0) {
|
||||
await actor.updateEmbeddedDocuments('Item', updates);
|
||||
}
|
||||
if (reste>0){
|
||||
if (reste > 0){
|
||||
// créer le reste en deniers fortune en deniers
|
||||
await Monnaie.creerMonnaiesDeniers(actor, reste);
|
||||
}
|
||||
|
||||
@@ -96,14 +96,18 @@ export class RdDItemSheet extends ItemSheet {
|
||||
formData.competences = await RdDUtility.loadItems(it => RdDItemCompetence.isDraconic(it), RdDItemCompetence.actorCompendium(this.actor?.type))
|
||||
}
|
||||
if (this.item.type == 'recettecuisine') {
|
||||
formData.ingredients = await TextEditor.enrichHTML(this.object.system.ingredients, {async: true})
|
||||
formData.ingredients = await TextEditor.enrichHTML(this.object.system.ingredients, {async: true})
|
||||
}
|
||||
if (this.item.type == 'extraitpoetique') {
|
||||
formData.extrait = await TextEditor.enrichHTML(this.object.system.extrait, {async: true})
|
||||
formData.texte = await TextEditor.enrichHTML(this.object.system.texte, {async: true})
|
||||
}
|
||||
if (this.item.type == 'recettealchimique') {
|
||||
RdDAlchimie.processManipulation(this.item, this.actor && this.actor.id);
|
||||
formData.manipulation_update = await TextEditor.enrichHTML(this.object.system.manipulation_update, {async: true})
|
||||
formData.utilisation = await TextEditor.enrichHTML(this.object.system.utilisation, {async: true})
|
||||
formData.enchantement = await TextEditor.enrichHTML(this.object.system.enchantement, {async: true})
|
||||
formData.sureffet = await TextEditor.enrichHTML(this.object.system.sureffet, {async: true})
|
||||
formData.manipulation_update = await TextEditor.enrichHTML(this.object.system.manipulation_update, {async: true})
|
||||
formData.utilisation = await TextEditor.enrichHTML(this.object.system.utilisation, {async: true})
|
||||
formData.enchantement = await TextEditor.enrichHTML(this.object.system.enchantement, {async: true})
|
||||
formData.sureffet = await TextEditor.enrichHTML(this.object.system.sureffet, {async: true})
|
||||
}
|
||||
if (this.item.type == 'gemme') {
|
||||
formData.gemmeTypeList = RdDGemme.getGemmeTypeOptionList();
|
||||
|
||||
@@ -58,6 +58,7 @@ export const defaultItemImg = {
|
||||
gemme: "systems/foundryvtt-reve-de-dragon/icons/gemmes/almaze.webp",
|
||||
possession: "systems/foundryvtt-reve-de-dragon/icons/entites/possession2.webp",
|
||||
sortreserve: "systems/foundryvtt-reve-de-dragon/icons/competence_oniros.webp",
|
||||
extraitpoetique: "systems/foundryvtt-reve-de-dragon/icons/competence_ecriture.webp",
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
|
||||
@@ -102,7 +102,7 @@ export class Misc {
|
||||
}
|
||||
|
||||
static join(params, separator = '') {
|
||||
return params.reduce((a, b) => a + separator + b);
|
||||
return params?.reduce((a, b) => a + separator + b) ?? '';
|
||||
}
|
||||
|
||||
static connectedGMOrUser(ownerId = undefined) {
|
||||
@@ -133,7 +133,11 @@ export class Misc {
|
||||
* @returns true pour un seul utilisateur: le premier GM connecté par ordre d'id
|
||||
*/
|
||||
static isUniqueConnectedGM() {
|
||||
return game.user.id == Misc.firstConnectedGM()?.id;
|
||||
return game.user.id == Misc.firstConnectedGMId();
|
||||
}
|
||||
|
||||
static firstConnectedGMId() {
|
||||
return Misc.firstConnectedGM()?.id;
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
@@ -191,4 +195,4 @@ export class Misc {
|
||||
}
|
||||
return subset;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,72 +1,13 @@
|
||||
import { Misc } from "./misc.js"
|
||||
import { RdDDice } from "./rdd-dice.js";
|
||||
|
||||
const poesieHautReve = [
|
||||
{
|
||||
reference: 'Le Ratier Bretonien',
|
||||
extrait: `Le courant du Fleuve
|
||||
<br>Te domine et te Porte
|
||||
<br>Avant que tu te moeuves
|
||||
<br>Combat le, ou il t'emporte`
|
||||
},
|
||||
{
|
||||
reference: 'Incompatibilité, Charles Beaudelaire',
|
||||
extrait: `Et lorsque par hasard une nuée errante
|
||||
<br>Assombrit dans son vol le lac silencieux,
|
||||
<br>On croirait voir la robe ou l'ombre transparente
|
||||
<br>D'un esprit qui voyage et passe dans les cieux.`
|
||||
},
|
||||
{
|
||||
reference: 'Au fleuve de Loire, Joachim du Bellay',
|
||||
extrait: `Ô de qui la vive course
|
||||
<br>Prend sa bienheureuse source,
|
||||
<br>D’une argentine fontaine,
|
||||
<br>Qui d’une fuite lointaine,
|
||||
<br>Te rends au sein fluctueux
|
||||
<br>De l’Océan monstrueux`
|
||||
},
|
||||
{
|
||||
reference: 'Denis Gerfaud',
|
||||
extrait: `Et l'on peut savoir qui est le maître d'Oniros, c'est le Fleuve de l'Oubli.
|
||||
Et l'on sait qui est le créateur du Fleuve de l'Oubli, c'est Hypnos et Narcos.
|
||||
Mais l'on ne sait pas qui est le maître du Fleuve de l'Oubli,
|
||||
sinon peut-être lui-même, ou peut-être Thanatos` },
|
||||
{
|
||||
reference: 'Denis Gerfaud',
|
||||
extrait: `Narcos est la source du Fleuve de l'Oubli et Hypnos l'embouchure
|
||||
Remonter le Fleuve est la Voie de la Nuit, la Voie du Souvenir.
|
||||
Descendre le Fleuve est la Voie du Jour, la Voie de l'Oubli`
|
||||
},
|
||||
{
|
||||
reference: 'Denis Gerfaud',
|
||||
extrait: `Narcos engendre le fils dont il est la mère à l'heure du Vaisseau,
|
||||
car Oniros s'embarque pour redescendre le Fleuve
|
||||
vers son père Hypnos sur la Voie de l'Oubli`
|
||||
},
|
||||
{
|
||||
reference: 'Denis Gerfaud',
|
||||
extrait: `Hypnos engendre le fils dont il est la mère à l'heure du Serpent, car
|
||||
tel les serpents, Oniros commence à remonter le Fleuve
|
||||
sur le Voie du Souvenir vers son père Narcos`
|
||||
},
|
||||
{
|
||||
reference: 'Denis Gerfaud',
|
||||
extrait: `Ainsi se succèdent les Jours et les Ages.
|
||||
<br>Les jours des Dragons sont les Ages des Hommes.`
|
||||
},
|
||||
{
|
||||
reference: 'Denis Gerfaud',
|
||||
extrait: `Ainsi parlent les sages:
|
||||
«Les Dragons sont créateurs de leurs rêves, mais ils ne sont pas créateurs d'Oniros
|
||||
Les Dragons ne sont pas les maîtres de leurs rêvezs, car ils ne sont pas maîtres d'Oniros.
|
||||
Nul ne sait qui est le créateur des Dragons, ni qui est leur maître.
|
||||
Mais l'on peut supposer qui est le maître du Rêve des Dragons, c'est Oniros»`
|
||||
},
|
||||
]
|
||||
import { SystemCompendiums } from "./settings/system-compendiums.js";
|
||||
|
||||
export class Poetique {
|
||||
static async getExtrait(){
|
||||
return await RdDDice.rollOneOf(poesieHautReve);
|
||||
static async getExtrait() {
|
||||
const items = await SystemCompendiums.getItems('extrait-poetique', 'extraitpoetique')
|
||||
const selected = await RdDDice.rollOneOf(items);
|
||||
return {
|
||||
reference: selected?.name,
|
||||
extrait: selected?.system.extrait
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -8,18 +8,19 @@ export class RdDCalendrierEditeur extends Dialog {
|
||||
|
||||
/* -------------------------------------------- */
|
||||
constructor(html, calendrier, calendrierData) {
|
||||
|
||||
let myButtons = {
|
||||
saveButton: { label: "Enregistrer", callback: html => this.fillData() }
|
||||
};
|
||||
|
||||
// Common conf
|
||||
let dialogConf = { content: html, title: "Editeur de date/heure", buttons: myButtons, default: "saveButton" };
|
||||
let dialogOptions = { classes: ["rdddialog"], width: 400, height: 300, 'z-index': 99999 }
|
||||
let dialogConf = {
|
||||
content: html,
|
||||
title: "Editeur de date/heure",
|
||||
buttons: {
|
||||
save: { label: "Enregistrer", callback: html => this.fillData() }
|
||||
},
|
||||
default: "save"
|
||||
};
|
||||
let dialogOptions = { classes: ["rdddialog"], width: 400, height: 'fit-content', 'z-index': 99999 }
|
||||
super(dialogConf, dialogOptions)
|
||||
|
||||
this.calendrier = calendrier;
|
||||
this.calendrierData = calendrierData; //duplicate(calendrierData);
|
||||
this.calendrierData = calendrierData;
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
|
||||
@@ -14,7 +14,7 @@ import { DialogChronologie } from "./dialog-chronologie.js";
|
||||
const dossierIconesHeures = 'systems/foundryvtt-reve-de-dragon/icons/heures/'
|
||||
const heuresList = ["vaisseau", "sirene", "faucon", "couronne", "dragon", "epees", "lyre", "serpent", "poissonacrobate", "araignee", "roseau", "chateaudormant"];
|
||||
const heuresDef = {
|
||||
"vaisseau": {key:"vaisseau", label: "Vaisseau", lettreFont: 'v', saison: "printemps", heure: 0, icon: 'hd01.svg' },
|
||||
"vaisseau": {key: "vaisseau", label: "Vaisseau", lettreFont: 'v', saison: "printemps", heure: 0, icon: 'hd01.svg' },
|
||||
"sirene": { key: "sirene", label: "Sirène", lettreFont: 'i', saison: "printemps", heure: 1, icon: 'hd02.svg' },
|
||||
"faucon": { key: "faucon", label: "Faucon", lettreFont: 'f', saison: "printemps", heure: 2, icon: 'hd03.svg' },
|
||||
"couronne": { key: "couronne", label: "Couronne", lettreFont: '', saison: "ete", heure: 3, icon: 'hd04.svg' },
|
||||
@@ -92,7 +92,7 @@ export class RdDCalendrier extends Application {
|
||||
minutesRelative: 0,
|
||||
indexJour: index,
|
||||
annee: Math.floor(index / (RDD_JOUR_PAR_MOIS * RDD_MOIS_PAR_AN)),
|
||||
moisRdD: RdDCalendrier.getDefSigne(mois),
|
||||
moisRdD: RdDCalendrier.getDefSigne(mois).heure,
|
||||
moisLabel: RdDCalendrier.getDefSigne(mois).label,
|
||||
jour: (index % RDD_JOUR_PAR_MOIS) // Le calendrier stocke le jour en 0-27, mais en 1-28 à l'affichage
|
||||
}
|
||||
@@ -316,16 +316,12 @@ export class RdDCalendrier extends Application {
|
||||
|
||||
/* -------------------------------------------- */
|
||||
fillCalendrierData(formData = {}) {
|
||||
console.log(this.calendrier);
|
||||
let moisKey = heuresList[this.calendrier.moisRdD];
|
||||
let heureKey = heuresList[this.calendrier.heureRdD];
|
||||
console.log(moisKey, heureKey);
|
||||
const mois = RdDCalendrier.getDefSigne(this.calendrier.moisRdD);
|
||||
const heure = RdDCalendrier.getDefSigne(this.calendrier.heureRdD);
|
||||
console.log('fillCalendrierData', this.calendrier, mois, heure);
|
||||
|
||||
const mois = heuresDef[moisKey];
|
||||
const heure = heuresDef[heureKey];
|
||||
|
||||
formData.heureKey = heureKey;
|
||||
formData.moisKey = moisKey;
|
||||
formData.heureKey = heure.key;
|
||||
formData.moisKey = mois.key;
|
||||
formData.jourMois = this.calendrier.jour + 1;
|
||||
formData.nomMois = mois.label; // heures et mois nommés identiques
|
||||
formData.iconMois = dossierIconesHeures + mois.icon;
|
||||
|
||||
@@ -39,21 +39,22 @@ export class RdDCommands {
|
||||
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: ["/tmr"], func: (content, msg, params) => rddCommands.findTMR(msg, params),
|
||||
descr: `Cherche où se trouve une case des Terres médianes
|
||||
<br><strong>/tmr sord</strong> indique que la cité Sordide est en D13
|
||||
<br><strong>/tmr foret</strong> donne la liste des TMR dont le nom contient "foret" (donc, toutes les forêts)` });
|
||||
rddCommands.registerCommand({
|
||||
path: ["/tmra"], func: (content, msg, params) => rddCommands.getTMRAleatoire(msg, params),
|
||||
descr: `Tire une case aléatoire des Terres médianes
|
||||
<br><strong>/tmra forêt</strong> détermine une 'forêt' aléatoire
|
||||
<br><strong>/tmra</strong> détermine une case aléatoire dans toutes les TMR` });
|
||||
rddCommands.registerCommand({
|
||||
path: ["/tmr"], func: (content, msg, params) => rddCommands.findTMR(msg, params),
|
||||
descr: `Cherche où se trouve une case des Terres médianes
|
||||
<br><strong>/tmr? sordide</strong> indique que la cité Sordide est en D13
|
||||
<br><strong>/tmr? foret</strong> donne la liste des TMR dont le nom contient "foret" (donc, toutes les forêts)` });
|
||||
rddCommands.registerCommand({
|
||||
path: ["/tmrr"], func: (content, msg, params) => rddCommands.getRencontreTMR(params),
|
||||
descr: `Détermine une rencontre dans un type de case
|
||||
<br><strong>/tmrr foret</strong> lance un d100 et détermine la rencontre correspondante en 'forêt'
|
||||
<br><strong>/tmrr forêt 47</strong> détermine la rencontre en 'forêt' pour un jet de dé de 47`
|
||||
<br><strong>/tmrr forêt</strong> détermine une rencontre aléatoire en 'forêt'
|
||||
<br><strong>/tmrr mauvaise</strong> détermine une mauvaise rencontre aléatoire
|
||||
<br><strong>/tmrr for 47</strong> détermine la rencontre en 'forêt' pour un jet de dé de 47`
|
||||
});
|
||||
|
||||
rddCommands.registerCommand({
|
||||
@@ -84,7 +85,7 @@ export class RdDCommands {
|
||||
|
||||
rddCommands.registerCommand({
|
||||
path: ["/payer"], func: (content, msg, params) => RdDUtility.afficherDemandePayer(params[0], params[1]),
|
||||
descr: `Permet de payer un montant. Exemples:
|
||||
descr: `Demande aux joueurs de payer un montant. Exemples:
|
||||
<br><strong>/payer 5s 10d</strong> permet d'envoyer un message pour payer 5 sols et 10 deniers
|
||||
<br><strong>/payer 10d</strong> permet d'envoyer un message pour payer 10 deniers`
|
||||
});
|
||||
@@ -180,7 +181,7 @@ export class RdDCommands {
|
||||
return this._processCommand(this.commandsTable, command, params, content, msg);
|
||||
}
|
||||
|
||||
_processCommand(commandsTable, name, params, content = '', msg = {}, path = "") {
|
||||
async _processCommand(commandsTable, name, params, content = '', msg = {}, path = "") {
|
||||
let command = commandsTable[name];
|
||||
path = path + name + " ";
|
||||
if (command && command.subTable) {
|
||||
@@ -193,7 +194,7 @@ export class RdDCommands {
|
||||
}
|
||||
}
|
||||
if (command && command.func) {
|
||||
const result = command.func(content, msg, params);
|
||||
const result = await command.func(content, msg, params);
|
||||
if (result == false) {
|
||||
RdDCommands._chatAnswer(msg, command.descr);
|
||||
}
|
||||
@@ -218,7 +219,7 @@ export class RdDCommands {
|
||||
buttons: {},
|
||||
},
|
||||
{
|
||||
width: 600, height: 500,
|
||||
width: 600, height: 600,
|
||||
});
|
||||
|
||||
d.render(true);
|
||||
@@ -250,9 +251,7 @@ export class RdDCommands {
|
||||
if (params.length == 1 || params.length == 2) {
|
||||
return TMRRencontres.rollRencontre(params[0], params[1])
|
||||
}
|
||||
else {
|
||||
return false;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
@@ -305,20 +304,20 @@ export class RdDCommands {
|
||||
show: { title: "Table de résolution" }
|
||||
};
|
||||
await RdDResolutionTable.rollData(rollData);
|
||||
RdDCommands._chatAnswer(msg, await RdDResolutionTable.buildRollDataHtml(rollData));
|
||||
return RdDCommands._chatAnswer(msg, await RdDResolutionTable.buildRollDataHtml(rollData));
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
async rollDeDraconique(msg) {
|
||||
let ddr = await RdDDice.rollTotal("1dr + 7");
|
||||
RdDCommands._chatAnswer(msg, `Lancer d'un Dé draconique: ${ddr}`);
|
||||
return RdDCommands._chatAnswer(msg, `Lancer d'un Dé draconique: ${ddr}`);
|
||||
}
|
||||
|
||||
async getTMRAleatoire(msg, params) {
|
||||
if (params.length < 2) {
|
||||
let type = params[0];
|
||||
const tmr = await TMRUtility.getTMRAleatoire(type ? (it => it.type == type) : (it => true));
|
||||
RdDCommands._chatAnswer(msg, `Case aléatoire: ${tmr.coord} - ${tmr.label}`);
|
||||
return RdDCommands._chatAnswer(msg, `Case aléatoire: ${tmr.coord} - ${tmr.label}`);
|
||||
}
|
||||
else {
|
||||
return false;
|
||||
@@ -326,12 +325,15 @@ export class RdDCommands {
|
||||
}
|
||||
|
||||
async findTMR(msg, params) {
|
||||
const search = Misc.join(params, ' ');
|
||||
const found = TMRUtility.findTMR(search);
|
||||
if (found?.length > 0) {
|
||||
return RdDCommands._chatAnswer(msg, `Les TMRs correspondant à '${search}' sont:` + Misc.join(found.map(it => `<br>${it.coord}: ${it.label}`)));
|
||||
if (params && params.length > 0) {
|
||||
const search = Misc.join(params, ' ');
|
||||
const found = TMRUtility.findTMR(search);
|
||||
if (found?.length > 0) {
|
||||
return RdDCommands._chatAnswer(msg, `Les TMRs correspondant à '${search}' sont:` + Misc.join(found.map(it => `<br>${it.coord}: ${it.label}`)));
|
||||
}
|
||||
return RdDCommands._chatAnswer(msg, 'Aucune TMR correspondant à ' + search);
|
||||
}
|
||||
return RdDCommands._chatAnswer(msg, 'Aucune TMR correspondant à ' + search);
|
||||
return false;
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
@@ -339,7 +341,7 @@ export class RdDCommands {
|
||||
if (params && (params.length == 1 || params.length == 2)) {
|
||||
let to = params.length == 1 ? Number(params[0]) : Number(params[1]);
|
||||
let from = params.length == 1 ? to - 1 : Number(params[0]);
|
||||
RdDCommands._chatAnswer(msg, `Coût pour passer une compétence de ${from} à ${to}: ${RdDItemCompetence.getDeltaXp(from, to)}`);
|
||||
return RdDCommands._chatAnswer(msg, `Coût pour passer une compétence de ${from} à ${to}: ${RdDItemCompetence.getDeltaXp(from, to)}`);
|
||||
}
|
||||
else {
|
||||
return false;
|
||||
@@ -350,7 +352,7 @@ export class RdDCommands {
|
||||
getCoutXpCarac(msg, params) {
|
||||
if (params && params.length == 1) {
|
||||
let to = Number(params[0]);
|
||||
RdDCommands._chatAnswer(msg, `Coût pour passer une caractéristique de ${to - 1} à ${to}: ${RdDCarac.getCaracXp(to)}`);
|
||||
return RdDCommands._chatAnswer(msg, `Coût pour passer une caractéristique de ${to - 1} à ${to}: ${RdDCarac.getCaracXp(to)}`);
|
||||
}
|
||||
else {
|
||||
return false;
|
||||
|
||||
@@ -144,6 +144,9 @@ export class RdDDice {
|
||||
}
|
||||
|
||||
static async rollOneOf(array) {
|
||||
if (array == undefined || array.length == 0) {
|
||||
return undefined;
|
||||
}
|
||||
const roll = await RdDDice.rollTotal(`1d${array.length}`);
|
||||
return array[roll - 1];
|
||||
}
|
||||
|
||||
@@ -200,9 +200,9 @@ Hooks.once("init", async function () {
|
||||
"recettealchimique", "musique", "chant", "danse", "jeu", "recettecuisine", "oeuvre",
|
||||
"objet", "arme", "armure", "conteneur", "herbe", "ingredient", "livre", "potion", "munition",
|
||||
"monnaie", "nourritureboisson", "gemme",
|
||||
"meditation", "rencontresTMR", "queue", "ombre", "souffle", "tete", "casetmr", "sort", "sortreserve",
|
||||
"meditation", "queue", "ombre", "souffle", "tete", "casetmr", "sort", "sortreserve",
|
||||
"nombreastral", "tache", "maladie", "poison", "possession",
|
||||
"tarot"
|
||||
"tarot", "extraitpoetique"
|
||||
], makeDefault: true
|
||||
});
|
||||
CONFIG.Combat.documentClass = RdDCombatManager;
|
||||
|
||||
@@ -92,8 +92,7 @@ export class RdDPossession {
|
||||
|
||||
const dialog = await RdDRoll.create(defender, rollData,
|
||||
{
|
||||
html: 'systems/foundryvtt-reve-de-dragon/templates/dialog-roll-defense-possession.html',
|
||||
options: { height: 450 }
|
||||
html: 'systems/foundryvtt-reve-de-dragon/templates/dialog-roll-defense-possession.html'
|
||||
},
|
||||
{
|
||||
name: 'conjurer',
|
||||
@@ -134,8 +133,7 @@ export class RdDPossession {
|
||||
|
||||
const dialog = await RdDRoll.create(attacker, rollData,
|
||||
{
|
||||
html: 'systems/foundryvtt-reve-de-dragon/templates/dialog-roll-competence.html',
|
||||
options: { height: 540 }
|
||||
html: 'systems/foundryvtt-reve-de-dragon/templates/dialog-roll-competence.html'
|
||||
}, {
|
||||
name: 'jet-possession',
|
||||
label: rollData.isECNIDefender ? 'Conjurer la possession' : 'Possession',
|
||||
|
||||
@@ -33,7 +33,7 @@ export class RdDEncaisser extends Dialog {
|
||||
let dialogOptions = {
|
||||
classes: ["rdddialog"],
|
||||
width: 320,
|
||||
height: 260
|
||||
height: 'fit-content'
|
||||
}
|
||||
|
||||
// Select proper roll dialog template and stuff
|
||||
|
||||
@@ -15,7 +15,7 @@ export class RdDRollDialogEthylisme extends Dialog {
|
||||
default: "rollButton",
|
||||
buttons: { "rollButton": { label: "Test d'éthylisme", callback: html => this.onButton(html) } }
|
||||
};
|
||||
let dialogOptions = { classes: ["rdddialog"], width: 400, height: 270, 'z-index': 99999 }
|
||||
let dialogOptions = { classes: ["rdddialog"], width: 400, height: 'fit-content', 'z-index': 99999 }
|
||||
super(dialogConf, dialogOptions)
|
||||
|
||||
//console.log("ETH", rollData);
|
||||
|
||||
@@ -53,7 +53,7 @@ export class RdDRollResolutionTable extends Dialog {
|
||||
'lancer-fermer': { label: 'Lancer les dés et fermer', callback: html => this.onLancerFermer() }
|
||||
}
|
||||
};
|
||||
super(conf, { classes: ["rdddialog"], width: 800, height: 800, 'z-index': 99999 });
|
||||
super(conf, { classes: ["rdddialog"], width: 800, height: 'fit-content', 'z-index': 99999 });
|
||||
|
||||
this.rollData = rollData;
|
||||
}
|
||||
|
||||
@@ -29,7 +29,7 @@ export class RdDRoll extends Dialog {
|
||||
|
||||
const html = await renderTemplate(dialogConfig.html, rollData);
|
||||
|
||||
let options = { classes: ["rdddialog"], width: 600, height: 500, 'z-index': 99999 };
|
||||
let options = { classes: ["rdddialog"], width: 600, height: 'fit-content', 'z-index': 99999 };
|
||||
if (dialogConfig.options) {
|
||||
mergeObject(options, dialogConfig.options, { overwrite: true })
|
||||
}
|
||||
|
||||
@@ -17,6 +17,7 @@ import { ReglesOptionelles } from "./settings/regles-optionelles.js";
|
||||
import { RdDDice } from "./rdd-dice.js";
|
||||
import { STATUSES } from "./settings/status-effects.js";
|
||||
import { RdDRencontre } from "./item-rencontre.js";
|
||||
import { RdDCalendrier } from "./rdd-calendrier.js";
|
||||
|
||||
/* -------------------------------------------- */
|
||||
|
||||
@@ -773,7 +774,7 @@ export class RdDTMRDialog extends Dialog {
|
||||
const dialog = await RdDRoll.create(this.actor, rollData,
|
||||
{
|
||||
html: 'systems/foundryvtt-reve-de-dragon/templates/dialog-roll-maitrise-tmr.html',
|
||||
options: { height: 420 },
|
||||
options: { height: 'fit-content' },
|
||||
close: html => { this.maximize(); } // Re-display TMR
|
||||
},
|
||||
{
|
||||
@@ -838,12 +839,13 @@ export class RdDTMRDialog extends Dialog {
|
||||
async processSortReserve(sortReserve) {
|
||||
await this.actor.deleteEmbeddedDocuments('Item', [sortReserve.id]);
|
||||
console.log("declencheSortEnReserve", sortReserve);
|
||||
const heureCible = RdDCalendrier.getSigneAs('label', sortReserve.system.heurecible);
|
||||
this._tellToUserAndGM(`Vous avez déclenché
|
||||
${sortReserve.system.echectotal ? "<strong>l'échec total!</strong>" : "le sort"}
|
||||
en réserve <strong>${sortReserve.name}</strong>
|
||||
avec ${sortReserve.system.ptreve} points de Rêve
|
||||
en ${sortReserve.system.coord} (${TMRUtility.getTMRLabel(sortReserve.system.coord)}).
|
||||
L'heure ciblée est ${sortReserve.system.heurecible}`);
|
||||
L'heure ciblée est ${heureCible}`);
|
||||
this.close();
|
||||
}
|
||||
|
||||
|
||||
@@ -21,7 +21,7 @@ export class RdDTMRRencontreDialog extends Dialog {
|
||||
|
||||
const dialogOptions = {
|
||||
classes: ["tmrrencdialog"],
|
||||
width: 320, height: 240,
|
||||
width: 320, height: 'fit-content',
|
||||
'z-index': 50
|
||||
}
|
||||
super(dialogConf, dialogOptions);
|
||||
|
||||
@@ -182,7 +182,6 @@ export class RdDUtility {
|
||||
'systems/foundryvtt-reve-de-dragon/templates/item-tache-sheet.html',
|
||||
'systems/foundryvtt-reve-de-dragon/templates/item-potion-sheet.html',
|
||||
'systems/foundryvtt-reve-de-dragon/templates/item-rencontre-sheet.html',
|
||||
'systems/foundryvtt-reve-de-dragon/templates/item-rencontresTMR-sheet.html',
|
||||
'systems/foundryvtt-reve-de-dragon/templates/item-queue-sheet.html',
|
||||
'systems/foundryvtt-reve-de-dragon/templates/item-souffle-sheet.html',
|
||||
'systems/foundryvtt-reve-de-dragon/templates/item-tarot-sheet.html',
|
||||
@@ -193,6 +192,7 @@ export class RdDUtility {
|
||||
'systems/foundryvtt-reve-de-dragon/templates/item-nourritureboisson-sheet.html',
|
||||
'systems/foundryvtt-reve-de-dragon/templates/item-signedraconique-sheet.html',
|
||||
'systems/foundryvtt-reve-de-dragon/templates/item-possession-sheet.html',
|
||||
'systems/foundryvtt-reve-de-dragon/templates/item-extraitpoetique-sheet.html',
|
||||
// partial enums
|
||||
'systems/foundryvtt-reve-de-dragon/templates/enum-caracteristiques.html',
|
||||
'systems/foundryvtt-reve-de-dragon/templates/enum-base-competence.html',
|
||||
|
||||
@@ -100,7 +100,7 @@ export class StatusEffects extends FormApplication {
|
||||
mergeObject(options, {
|
||||
id: "status-effects",
|
||||
template: "systems/foundryvtt-reve-de-dragon/templates/settings/status-effects.html",
|
||||
height: "800",
|
||||
height: 800,
|
||||
width: 350,
|
||||
minimizable: false,
|
||||
closeOnSubmit: true,
|
||||
|
||||
@@ -5,6 +5,7 @@ const COMPENDIUM_SETTING_PREFIX = 'compendium-';
|
||||
const CONFIGURABLE_COMPENDIUMS = {
|
||||
'tables-diverses': { label: "Tables aléatoires", type: "RollTable" },
|
||||
'competences': { label: "Compétences", type: "Item" },
|
||||
'extrait-poetique': { label: "Extraits poetiques", type: "Item" },
|
||||
'queues-de-dragon': { label: "Queues de dragon", type: "Item" },
|
||||
'ombres-de-thanatos': { label: "Ombres de Thanatos", type: "Item" },
|
||||
'souffles-de-dragon': { label: "Souffles de Dragon", type: "Item" },
|
||||
@@ -54,8 +55,9 @@ export class SystemCompendiums extends FormApplication {
|
||||
return [];
|
||||
}
|
||||
|
||||
static async getItems(compendium) {
|
||||
return await SystemCompendiums.getContent(compendium, 'Item')
|
||||
static async getItems(compendium, itemType = undefined) {
|
||||
const items = await SystemCompendiums.getContent(compendium, 'Item');
|
||||
return itemType ? items.filter(it => it.type == itemType) : items;
|
||||
}
|
||||
|
||||
static async getDefaultItems(compendium) {
|
||||
|
||||
@@ -15,21 +15,15 @@ export class TMRRencontres {
|
||||
* @param {*} forcedRoll
|
||||
*/
|
||||
static async rollRencontre(terrain, forcedRoll) {
|
||||
// TODO: recherche parmi les types de terrains + mauvaise, rejet si plusieurs choix
|
||||
const codeTerrain = Grammar.toLowerCaseNoAccent(terrain);
|
||||
if (!terrain) {
|
||||
ChatMessage.create({
|
||||
user: game.user.id,
|
||||
whisper: [game.user.id],
|
||||
content: "Un type de case doit être indiqué (par exemple sanctuaire, desert ou cité)"
|
||||
});
|
||||
return false;
|
||||
terrain = TMRUtility.findTMRLike(terrain);
|
||||
if (terrain == undefined) {
|
||||
return undefined;
|
||||
}
|
||||
|
||||
if (forcedRoll && (forcedRoll <= 0 || forcedRoll > 100)) {
|
||||
forcedRoll = undefined;
|
||||
}
|
||||
|
||||
const codeTerrain = Grammar.toLowerCaseNoAccent(terrain)
|
||||
const table = await TMRRencontres.$buildTableRencontre(codeTerrain);
|
||||
const [selected, roll] = await TMRRencontres.$selectRencontre(codeTerrain, table, forcedRoll);
|
||||
const rencontre = await TMRRencontres.createRencontre(selected.rencontre);
|
||||
@@ -40,7 +34,7 @@ export class TMRRencontres {
|
||||
/* -------------------------------------------- */
|
||||
static async $buildTableRencontre(codeTerrain) {
|
||||
let max = 0;
|
||||
const items = await SystemCompendiums.getItems('rencontres');
|
||||
const items = await SystemCompendiums.getItems('rencontres', 'rencontre');
|
||||
const filtreMauvaise = codeTerrain == 'mauvaise' ? it => it.system.mauvaiseRencontre : it => !it.system.mauvaiseRencontre;
|
||||
const rencontres = items.filter(it => it.type == 'rencontre')
|
||||
.filter(filtreMauvaise)
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
import { TMRRencontres } from "./tmr-rencontres.js";
|
||||
import { Misc } from "./misc.js";
|
||||
import { Grammar } from "./grammar.js";
|
||||
import { RdDDice } from "./rdd-dice.js";
|
||||
@@ -287,13 +286,30 @@ export class TMRUtility {
|
||||
const tmr = TMRMapping[coord];
|
||||
return Grammar.articleDetermine(tmr.type) + ' ' + tmr.label;
|
||||
}
|
||||
|
||||
static findTMRLike(type, options = {inclusMauvaise:true}) {
|
||||
const choix = [...Object.values(TMRType)]
|
||||
if (options.inclusMauvaise){
|
||||
choix.push({name: 'Mauvaise'});
|
||||
}
|
||||
const selection = Misc.findAllLike(type, choix).map(it => it.name);
|
||||
if (selection.length == 0) {
|
||||
ui.notifications.warn(`Un type de TMR doit être indiqué, '${type}' n'est pas trouvé dans ${choix}`);
|
||||
return undefined;
|
||||
}
|
||||
if (selection.length > 1) {
|
||||
ui.notifications.warn(`Plusieurs types de TMR pourraient correspondre à '${type}': ${selection}`);
|
||||
return undefined;
|
||||
}
|
||||
return selection[0];
|
||||
}
|
||||
|
||||
static typeTmrName(type) {
|
||||
return Misc.upperFirst(TMRType[Grammar.toLowerCaseNoAccent(type)].name);
|
||||
}
|
||||
|
||||
|
||||
static buildSelectionTypesTMR(typesTMR) {
|
||||
typesTMR= typesTMR?? [];
|
||||
typesTMR = typesTMR?? [];
|
||||
return Object.values(TMRType).map(value => Misc.upperFirst(value.name))
|
||||
.sort()
|
||||
.map(name => { return { name: name, selected: typesTMR.includes(name) } });
|
||||
@@ -339,8 +355,7 @@ export class TMRUtility {
|
||||
}
|
||||
|
||||
static findTMR(search) {
|
||||
const labelSearch = Grammar.toLowerCaseNoAccent(search)
|
||||
return TMRUtility.filterTMR(it => Grammar.toLowerCaseNoAccent(it.label).match(labelSearch) || it.coord == search);
|
||||
return TMRUtility.filterTMR(it => Grammar.includesLowerCaseNoAccent(it.label, search) || it.coord == search);
|
||||
}
|
||||
|
||||
static filterTMRCoord(filter) {
|
||||
|
||||
@@ -136,7 +136,6 @@
|
||||
{"_id":"fLKFTvLWoj7juxQE","name":"Flèche, carreau","type":"objet","img":"systems/foundryvtt-reve-de-dragon/icons/objets/fleche.webp","data":{"description":"","quantite":1,"encombrement":0.1,"equipe":false,"resistance":0,"qualite":0,"cout":0.1},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"rYShh2P1DNavdoBD":3},"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.fLKFTvLWoj7juxQE"}}}
|
||||
{"_id":"fOfVLKBacNEsDBn1","name":"Brandevin","type":"nourritureboisson","img":"systems/foundryvtt-reve-de-dragon/icons/liquides/liquide_sang.webp","data":{"description":"<p>Dose de 10cl de Brandevin</p>","sust":0,"boisson":true,"desaltere":0.2,"alcoolise":true,"force":-5,"qualite":0,"exotisme":0,"encombrement":0.05,"quantite":1,"cout":0.1},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"wYnBx3HmLfGzsj7P":3},"flags":{}}
|
||||
{"name":"Etain (1 denier)","type":"monnaie","img":"systems/foundryvtt-reve-de-dragon/icons/objets/piece_etain_poisson.webp","data":{"quantite":0,"valeur_deniers":1,"encombrement":0.01,"description":""},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"jtRmvSuwkwMmIMf0":3},"flags":{"core":{"sourceId":"Item.UFCII7LUClrCWElV"}},"_id":"fhP2azbUBfmpF441"}
|
||||
{"_id":"gYFprGGUUVG1Apcf","name":"Carquois","type":"conteneur","img":"systems/foundryvtt-reve-de-dragon/icons/objets/carquois.webp","data":{"description":"","capacite":2,"encombrement":0.1,"equipe":false,"qualite":0,"contenu":[],"cout":0.5},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"rYShh2P1DNavdoBD":3},"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.zYI8mDiysWtmsSyy"}}}
|
||||
{"_id":"gfU7oZL1JYqF3lAW","name":"Robe de lin","type":"objet","img":"systems/foundryvtt-reve-de-dragon/icons/objets/robe_lin.webp","data":{"description":"","quantite":1,"encombrement":0.1,"equipe":false,"resistance":0,"qualite":0,"cout":0.6},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"jOzRscDxoXZWpGS6":3},"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.gfU7oZL1JYqF3lAW"}}}
|
||||
{"_id":"gmBC6SO3F5d64Vpl","name":"Miroir en cuivre poli 20 cm","type":"objet","img":"systems/foundryvtt-reve-de-dragon/icons/objets/miroir.webp","data":{"description":"","quantite":1,"encombrement":0.2,"equipe":false,"resistance":0,"qualite":0,"cout":1},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"rYShh2P1DNavdoBD":3},"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.gmBC6SO3F5d64Vpl"}}}
|
||||
{"name":"Or (10 sols)","type":"monnaie","img":"systems/foundryvtt-reve-de-dragon/icons/objets/piece_or_sol.webp","data":{"quantite":0,"valeur_deniers":1000,"encombrement":0.01,"description":""},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"jtRmvSuwkwMmIMf0":3},"flags":{"core":{"sourceId":"Item.CmqfrDQgL61XIAqt"}},"_id":"gmbvvEx7hPrAy3zh"}
|
||||
|
||||
9
packs/extrait-poetique.db
Normal file
9
packs/extrait-poetique.db
Normal file
@@ -0,0 +1,9 @@
|
||||
{"name":"Au fleuve de Loire, Joachim du Bellay","type":"extraitpoetique","img":"systems/foundryvtt-reve-de-dragon/icons/competence_ecriture.webp","system":{"extrait":"<p>Ô de qui la vive course <br>Prend sa bienheureuse source, <br>D’une argentine fontaine, <br>Qui d’une fuite lointaine, <br>Te rends au sein fluctueux <br>De l’Océan monstrueux</p>","texte":""},"effects":[],"flags":{},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.2.0","coreVersion":"10.288"},"_id":"1xzVPsfnO3uukbc4","ownership":{"default":0}}
|
||||
{"name":"Le Fleuve, Le Ratier Bretonien","type":"extraitpoetique","img":"systems/foundryvtt-reve-de-dragon/icons/competence_ecriture.webp","system":{"extrait":"<p>Le courant du Fleuve<br>Te domine et te Porte<br>Avant que tu te moeuves<br>Combats le, ou il t'emporte</p>","texte":""},"effects":[],"flags":{},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.2.0","coreVersion":"10.288"},"_id":"4dPfQh9ovWa90M9o","ownership":{"default":0}}
|
||||
{"name":"Des voies du Rêve (4), Denis Gerfaud","type":"extraitpoetique","img":"systems/foundryvtt-reve-de-dragon/icons/competence_ecriture.webp","system":{"extrait":"<p>«Narcos engendre le fils dont il est la mère à l'heure du Vaisseau, <br>car Oniros s'embarque pour redescendre le Fleuve <br>vers son père Hypnos sur la Voie de l'Oubli»</p>","texte":"<p>Ainsi parlent les sages: <br>«Les Dragons sont créateurs de leurs rêves, mais ils ne sont pas créateurs d'Oniros <br>Les Dragons ne sont pas les maîtres de leurs rêves, car ils ne sont pas maîtres d'Oniros. <br>Nul ne sait qui est le créateur des Dragons, ni qui est leur maître. <br>Mais l'on peut supposer qui est le maître du Rêve des Dragons, c'est Oniros»</p>\n<p>«Et l'on peut savoir qui est le maître d'Oniros, c'est le Fleuve de l'Oubli. <br>Et l'on sait qui est le créateur du Fleuve de l'Oubli, c'est Hypnos et Narcos. <br>Mais l'on ne sait pas qui est le maître du Fleuve de l'Oubli, <br>sinon peut-être lui-même, ou peut-être Thanatos»</p>\n<p>«Hypnos engendre le fils dont il est la mère à l'heure du Serpent, car <br>tel les serpents, Oniros commence à remonter le Fleuve <br>sur le Voie du Souvenir vers son père Narcos»</p>\n<p>«Narcos engendre le fils dont il est la mère à l'heure du Vaisseau, <br>car Oniros s'embarque pour redescendre le Fleuve <br>vers son père Hypnos sur la Voie de l'Oubli»</p>\n<p>«Narcos est la source du Fleuve de l'Oubli et Hypnos l'embouchure <br>Remonter le Fleuve est la Voie de la Nuit, la Voie du Souvenir. <br>Descendre le Fleuve est la Voie du Jour, la Voie de l'Oubli»</p>\n<p>«Ainsi se succèdent les Jours et les Ages. <br>Les jours des Dragons sont les Ages des Hommes.»</p>"},"effects":[],"flags":{},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.2.0","coreVersion":"10.288"},"_id":"7DNOC40NKHog49rb","ownership":{"default":0}}
|
||||
{"name":"Des voies du Rêve (5), Denis Gerfaud","type":"extraitpoetique","img":"systems/foundryvtt-reve-de-dragon/icons/competence_ecriture.webp","system":{"extrait":"<p>«Narcos est la source du Fleuve de l'Oubli et Hypnos l'embouchure <br>Remonter le Fleuve est la Voie de la Nuit, la Voie du Souvenir. <br>Descendre le Fleuve est la Voie du Jour, la Voie de l'Oubli»</p>","texte":"<p>Ainsi parlent les sages: <br>«Les Dragons sont créateurs de leurs rêves, mais ils ne sont pas créateurs d'Oniros <br>Les Dragons ne sont pas les maîtres de leurs rêves, car ils ne sont pas maîtres d'Oniros. <br>Nul ne sait qui est le créateur des Dragons, ni qui est leur maître. <br>Mais l'on peut supposer qui est le maître du Rêve des Dragons, c'est Oniros»</p>\n<p>«Et l'on peut savoir qui est le maître d'Oniros, c'est le Fleuve de l'Oubli. <br>Et l'on sait qui est le créateur du Fleuve de l'Oubli, c'est Hypnos et Narcos. <br>Mais l'on ne sait pas qui est le maître du Fleuve de l'Oubli, <br>sinon peut-être lui-même, ou peut-être Thanatos»</p>\n<p>«Hypnos engendre le fils dont il est la mère à l'heure du Serpent, car <br>tel les serpents, Oniros commence à remonter le Fleuve <br>sur le Voie du Souvenir vers son père Narcos»</p>\n<p>«Narcos engendre le fils dont il est la mère à l'heure du Vaisseau, <br>car Oniros s'embarque pour redescendre le Fleuve <br>vers son père Hypnos sur la Voie de l'Oubli»</p>\n<p>«Narcos est la source du Fleuve de l'Oubli et Hypnos l'embouchure <br>Remonter le Fleuve est la Voie de la Nuit, la Voie du Souvenir. <br>Descendre le Fleuve est la Voie du Jour, la Voie de l'Oubli»</p>\n<p>«Ainsi se succèdent les Jours et les Ages. <br>Les jours des Dragons sont les Ages des Hommes.»</p>"},"effects":[],"flags":{},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.2.0","coreVersion":"10.288"},"_id":"Ym0pweWHr8CIZFIR","ownership":{"default":0}}
|
||||
{"name":"Des voies du Rêve (1), Denis Gerfaud (Copy)","type":"extraitpoetique","img":"systems/foundryvtt-reve-de-dragon/icons/competence_ecriture.webp","system":{"extrait":"<p>Ainsi parlent les sages: <br>«Les Dragons sont créateurs de leurs rêves, mais ils ne sont pas créateurs d'Oniros <br>Les Dragons ne sont pas les maîtres de leurs rêves, car ils ne sont pas maîtres d'Oniros. <br>Nul ne sait qui est le créateur des Dragons, ni qui est leur maître. <br>Mais l'on peut supposer qui est le maître du Rêve des Dragons, c'est Oniros»</p>","texte":"<p>Ainsi parlent les sages: <br>«Les Dragons sont créateurs de leurs rêves, mais ils ne sont pas créateurs d'Oniros <br>Les Dragons ne sont pas les maîtres de leurs rêves, car ils ne sont pas maîtres d'Oniros. <br>Nul ne sait qui est le créateur des Dragons, ni qui est leur maître. <br>Mais l'on peut supposer qui est le maître du Rêve des Dragons, c'est Oniros»</p>\n<p>«Et l'on peut savoir qui est le maître d'Oniros, c'est le Fleuve de l'Oubli. <br>Et l'on sait qui est le créateur du Fleuve de l'Oubli, c'est Hypnos et Narcos. <br>Mais l'on ne sait pas qui est le maître du Fleuve de l'Oubli, <br>sinon peut-être lui-même, ou peut-être Thanatos»</p>\n<p>«Hypnos engendre le fils dont il est la mère à l'heure du Serpent, car <br>tel les serpents, Oniros commence à remonter le Fleuve <br>sur le Voie du Souvenir vers son père Narcos»</p>\n<p>«Narcos engendre le fils dont il est la mère à l'heure du Vaisseau, <br>car Oniros s'embarque pour redescendre le Fleuve <br>vers son père Hypnos sur la Voie de l'Oubli»</p>\n<p>«Narcos est la source du Fleuve de l'Oubli et Hypnos l'embouchure <br>Remonter le Fleuve est la Voie de la Nuit, la Voie du Souvenir. <br>Descendre le Fleuve est la Voie du Jour, la Voie de l'Oubli»</p>\n<p>«Ainsi se succèdent les Jours et les Ages. <br>Les jours des Dragons sont les Ages des Hommes.»</p>"},"effects":[],"flags":{},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.2.0","coreVersion":"10.288"},"_id":"fXBZ0YjF12LRtSOp","ownership":{"default":0}}
|
||||
{"name":"Des voies du Rêve (6), Denis Gerfaud","type":"extraitpoetique","img":"systems/foundryvtt-reve-de-dragon/icons/competence_ecriture.webp","system":{"extrait":"<p>«Ainsi se succèdent les Jours et les Ages. <br>Les jours des Dragons sont les Ages des Hommes.»</p>","texte":"<p>Ainsi parlent les sages: <br>«Les Dragons sont créateurs de leurs rêves, mais ils ne sont pas créateurs d'Oniros <br>Les Dragons ne sont pas les maîtres de leurs rêves, car ils ne sont pas maîtres d'Oniros. <br>Nul ne sait qui est le créateur des Dragons, ni qui est leur maître. <br>Mais l'on peut supposer qui est le maître du Rêve des Dragons, c'est Oniros»</p>\n<p>«Et l'on peut savoir qui est le maître d'Oniros, c'est le Fleuve de l'Oubli. <br>Et l'on sait qui est le créateur du Fleuve de l'Oubli, c'est Hypnos et Narcos. <br>Mais l'on ne sait pas qui est le maître du Fleuve de l'Oubli, <br>sinon peut-être lui-même, ou peut-être Thanatos»</p>\n<p>«Hypnos engendre le fils dont il est la mère à l'heure du Serpent, car <br>tel les serpents, Oniros commence à remonter le Fleuve <br>sur le Voie du Souvenir vers son père Narcos»</p>\n<p>«Narcos engendre le fils dont il est la mère à l'heure du Vaisseau, <br>car Oniros s'embarque pour redescendre le Fleuve <br>vers son père Hypnos sur la Voie de l'Oubli»</p>\n<p>«Narcos est la source du Fleuve de l'Oubli et Hypnos l'embouchure <br>Remonter le Fleuve est la Voie de la Nuit, la Voie du Souvenir. <br>Descendre le Fleuve est la Voie du Jour, la Voie de l'Oubli»</p>\n<p>«Ainsi se succèdent les Jours et les Ages. <br>Les jours des Dragons sont les Ages des Hommes.»</p>"},"effects":[],"flags":{},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.2.0","coreVersion":"10.288"},"_id":"k55zGYj5cTis14Cw","ownership":{"default":0}}
|
||||
{"name":"Des voies du Rêve (2), Denis Gerfaud","type":"extraitpoetique","img":"systems/foundryvtt-reve-de-dragon/icons/competence_ecriture.webp","system":{"extrait":"<p>«Et l'on peut savoir qui est le maître d'Oniros, c'est le Fleuve de l'Oubli. <br>Et l'on sait qui est le créateur du Fleuve de l'Oubli, c'est Hypnos et Narcos. <br>Mais l'on ne sait pas qui est le maître du Fleuve de l'Oubli, <br>sinon peut-être lui-même, ou peut-être Thanatos»</p>","texte":"<p>Ainsi parlent les sages: <br>«Les Dragons sont créateurs de leurs rêves, mais ils ne sont pas créateurs d'Oniros <br>Les Dragons ne sont pas les maîtres de leurs rêves, car ils ne sont pas maîtres d'Oniros. <br>Nul ne sait qui est le créateur des Dragons, ni qui est leur maître. <br>Mais l'on peut supposer qui est le maître du Rêve des Dragons, c'est Oniros»</p>\n<p>«Et l'on peut savoir qui est le maître d'Oniros, c'est le Fleuve de l'Oubli. <br>Et l'on sait qui est le créateur du Fleuve de l'Oubli, c'est Hypnos et Narcos. <br>Mais l'on ne sait pas qui est le maître du Fleuve de l'Oubli, <br>sinon peut-être lui-même, ou peut-être Thanatos»</p>\n<p>«Hypnos engendre le fils dont il est la mère à l'heure du Serpent, car <br>tel les serpents, Oniros commence à remonter le Fleuve <br>sur le Voie du Souvenir vers son père Narcos»</p>\n<p>«Narcos engendre le fils dont il est la mère à l'heure du Vaisseau, <br>car Oniros s'embarque pour redescendre le Fleuve <br>vers son père Hypnos sur la Voie de l'Oubli»</p>\n<p>«Narcos est la source du Fleuve de l'Oubli et Hypnos l'embouchure <br>Remonter le Fleuve est la Voie de la Nuit, la Voie du Souvenir. <br>Descendre le Fleuve est la Voie du Jour, la Voie de l'Oubli»</p>\n<p>«Ainsi se succèdent les Jours et les Ages. <br>Les jours des Dragons sont les Ages des Hommes.»</p>"},"effects":[],"flags":{},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.2.0","coreVersion":"10.288"},"_id":"rjlGncoP26PljA2G","ownership":{"default":0}}
|
||||
{"name":"Des voies du Rêve (3), Denis Gerfaud","type":"extraitpoetique","img":"systems/foundryvtt-reve-de-dragon/icons/competence_ecriture.webp","system":{"extrait":"<p>«Hypnos engendre le fils dont il est la mère à l'heure du Serpent, car <br>tel les serpents, Oniros commence à remonter le Fleuve <br>sur le Voie du Souvenir vers son père Narcos»</p>","texte":"<p>Ainsi parlent les sages: <br>«Les Dragons sont créateurs de leurs rêves, mais ils ne sont pas créateurs d'Oniros <br>Les Dragons ne sont pas les maîtres de leurs rêves, car ils ne sont pas maîtres d'Oniros. <br>Nul ne sait qui est le créateur des Dragons, ni qui est leur maître. <br>Mais l'on peut supposer qui est le maître du Rêve des Dragons, c'est Oniros»</p>\n<p>«Et l'on peut savoir qui est le maître d'Oniros, c'est le Fleuve de l'Oubli. <br>Et l'on sait qui est le créateur du Fleuve de l'Oubli, c'est Hypnos et Narcos. <br>Mais l'on ne sait pas qui est le maître du Fleuve de l'Oubli, <br>sinon peut-être lui-même, ou peut-être Thanatos»</p>\n<p>«Hypnos engendre le fils dont il est la mère à l'heure du Serpent, car <br>tel les serpents, Oniros commence à remonter le Fleuve <br>sur le Voie du Souvenir vers son père Narcos»</p>\n<p>«Narcos engendre le fils dont il est la mère à l'heure du Vaisseau, <br>car Oniros s'embarque pour redescendre le Fleuve <br>vers son père Hypnos sur la Voie de l'Oubli»</p>\n<p>«Narcos est la source du Fleuve de l'Oubli et Hypnos l'embouchure <br>Remonter le Fleuve est la Voie de la Nuit, la Voie du Souvenir. <br>Descendre le Fleuve est la Voie du Jour, la Voie de l'Oubli»</p>\n<p>«Ainsi se succèdent les Jours et les Ages. <br>Les jours des Dragons sont les Ages des Hommes.»</p>"},"effects":[],"flags":{},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.2.0","coreVersion":"10.288"},"_id":"xMigGwI39BORZ82r","ownership":{"default":0}}
|
||||
{"name":"Incompatibilité, Charles Beaudelaire","type":"extraitpoetique","img":"systems/foundryvtt-reve-de-dragon/icons/competence_ecriture.webp","system":{"extrait":"<p>Et lorsque par hasard une nuée errante <br>Assombrit dans son vol le lac silencieux, <br>On croirait voir la robe ou l'ombre transparente <br>D'un esprit qui voyage et passe dans les cieux.</p>","texte":""},"effects":[],"flags":{},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.2.0","coreVersion":"10.288"},"_id":"yJ3m3fheGJluiGDx","ownership":{"default":0}}
|
||||
13
system.json
13
system.json
@@ -1,8 +1,8 @@
|
||||
{
|
||||
"id": "foundryvtt-reve-de-dragon",
|
||||
"title": "Rêve de Dragon",
|
||||
"version": "10.2.0",
|
||||
"download": "https://www.uberwald.me/gitea/public/foundryvtt-reve-de-dragon/archive/foundryvtt-reve-de-dragon-10.2.0.zip",
|
||||
"version": "10.2.3",
|
||||
"download": "https://www.uberwald.me/gitea/public/foundryvtt-reve-de-dragon/archive/foundryvtt-reve-de-dragon-10.2.3.zip",
|
||||
"manifest": "https://www.uberwald.me/gitea/public/foundryvtt-reve-de-dragon/raw/v10/system.json",
|
||||
"compatibility": {
|
||||
"minimum": "10",
|
||||
@@ -198,6 +198,15 @@
|
||||
"private": false,
|
||||
"flags": {}
|
||||
},
|
||||
{
|
||||
"name": "extrait-poetique",
|
||||
"label": "Extraits poétiques",
|
||||
"system": "foundryvtt-reve-de-dragon",
|
||||
"path": "packs/extrait-poetique.db",
|
||||
"type": "Item",
|
||||
"private": false,
|
||||
"flags": {}
|
||||
},
|
||||
{
|
||||
"name": "tetes-de-dragon-pour-haut-revants",
|
||||
"label": "Têtes de Dragon (Hauts-Rêvants)",
|
||||
|
||||
@@ -586,9 +586,9 @@
|
||||
"recettealchimique", "musique", "chant", "danse", "jeu", "recettecuisine", "oeuvre",
|
||||
"objet", "arme", "armure", "conteneur", "herbe", "ingredient", "livre", "potion", "munition",
|
||||
"monnaie", "nourritureboisson", "gemme",
|
||||
"meditation", "rencontre", "rencontresTMR", "queue", "ombre", "souffle", "tete", "casetmr", "signedraconique", "sort", "sortreserve",
|
||||
"meditation", "rencontre", "queue", "ombre", "souffle", "tete", "casetmr", "signedraconique", "sort", "sortreserve",
|
||||
"nombreastral", "tache", "maladie", "poison", "possession",
|
||||
"tarot"
|
||||
"tarot", "extraitpoetique"
|
||||
],
|
||||
"possession": {
|
||||
"typepossession": "",
|
||||
@@ -827,10 +827,6 @@
|
||||
},
|
||||
"description": ""
|
||||
},
|
||||
"rencontresTMR": {
|
||||
"description": "",
|
||||
"descriptionmj": ""
|
||||
},
|
||||
"queue": {
|
||||
"description": "",
|
||||
"descriptionmj": "",
|
||||
@@ -1007,6 +1003,10 @@
|
||||
"ptreve": 0,
|
||||
"heurecible": "",
|
||||
"echectotal": false
|
||||
},
|
||||
"extraitpoetique": {
|
||||
"extrait": "",
|
||||
"texte": ""
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
25
templates/item-extraitpoetique-sheet.html
Normal file
25
templates/item-extraitpoetique-sheet.html
Normal file
@@ -0,0 +1,25 @@
|
||||
<form class="{{cssClass}}" autocomplete="off">
|
||||
<header class="sheet-header">
|
||||
<img class="chat-icon" src="{{img}}" data-edit="img" title="{{name}}"/>
|
||||
<div class="header-fields">
|
||||
<h1 class="charname">
|
||||
<input name="name" type="text" value="{{name}}" placeholder="Name"/>
|
||||
</h1>
|
||||
<p class="poesie-reference">Référence</p>
|
||||
</div>
|
||||
</header>
|
||||
<section class="sheet-body">
|
||||
<div class="flexcol">
|
||||
<label>Extrait</label>
|
||||
<div class="form-group editor">
|
||||
{{editor extrait target="system.extrait" button=true owner=owner editable=editable}}
|
||||
</div>
|
||||
</div>
|
||||
<div class="flexcol">
|
||||
<label>Texte complet</label>
|
||||
<div class="form-group editor">
|
||||
{{editor texte target="system.texte" button=true owner=owner editable=editable}}
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
</form>
|
||||
Reference in New Issue
Block a user