forked from public/foundryvtt-reve-de-dragon
Compare commits
32 Commits
foundryvtt
...
foundryvtt
| Author | SHA1 | Date | |
|---|---|---|---|
| 4f80c719c2 | |||
| 7d8b5c9549 | |||
|
|
ec58317b35 | ||
|
|
7c70e944b1 | ||
|
|
f397c82c6d | ||
|
|
81e3ceb4dc | ||
|
|
7bec249e8d | ||
|
|
70b30b545b | ||
|
|
ed2eebf99d | ||
|
|
4ba2c384d7 | ||
|
|
7f27399f3c | ||
|
|
61389e117b | ||
|
|
46cc245abf | ||
|
|
a372531849 | ||
|
|
8a8323ac8d | ||
|
|
8e6d4fbb89 | ||
|
|
886307f24c | ||
| f40dbd5d7b | |||
|
|
66da7d5eb4 | ||
|
|
b2d8c2439a | ||
|
|
ceb4095c31 | ||
|
|
2af37cf98f | ||
|
|
fd156960a7 | ||
|
|
80a904e533 | ||
|
|
c9dc847440 | ||
| 4e382d405e | |||
|
|
6a12dc97f6 | ||
|
|
e0b6957bc6 | ||
|
|
944120b524 | ||
|
|
bb6bf3387e | ||
|
|
467a4d53a4 | ||
|
|
d5635b27fe |
BIN
icons/items/services.webp
Normal file
BIN
icons/items/services.webp
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 6.2 KiB |
@@ -27,6 +27,7 @@
|
|||||||
"TypeArmure": "Armure",
|
"TypeArmure": "Armure",
|
||||||
"TypeConteneur": "Conteneur",
|
"TypeConteneur": "Conteneur",
|
||||||
"TypeNourritureboisson": "Nourriture & boisson",
|
"TypeNourritureboisson": "Nourriture & boisson",
|
||||||
|
"TypeService": "Services/Boutique",
|
||||||
"TypeChant": "Chant",
|
"TypeChant": "Chant",
|
||||||
"TypeDanse": "Danse",
|
"TypeDanse": "Danse",
|
||||||
"TypeMusique": "Musique",
|
"TypeMusique": "Musique",
|
||||||
|
|||||||
@@ -8,7 +8,6 @@ import { RdDCombatManager } from "./rdd-combat.js";
|
|||||||
import { RdDCarac } from "./rdd-carac.js";
|
import { RdDCarac } from "./rdd-carac.js";
|
||||||
import { DialogSplitItem } from "./dialog-split-item.js";
|
import { DialogSplitItem } from "./dialog-split-item.js";
|
||||||
import { ReglesOptionelles } from "./settings/regles-optionelles.js";
|
import { ReglesOptionelles } from "./settings/regles-optionelles.js";
|
||||||
import { DialogRepos } from "./dialog-repos.js";
|
|
||||||
import { RdDSheetUtility } from "./rdd-sheet-utility.js";
|
import { RdDSheetUtility } from "./rdd-sheet-utility.js";
|
||||||
import { STATUSES } from "./settings/status-effects.js";
|
import { STATUSES } from "./settings/status-effects.js";
|
||||||
import { Monnaie } from "./item-monnaie.js";
|
import { Monnaie } from "./item-monnaie.js";
|
||||||
@@ -58,8 +57,9 @@ export class RdDActorSheet extends ActorSheet {
|
|||||||
notes: await TextEditor.enrichHTML(this.object.system.notes, { async: true }),
|
notes: await TextEditor.enrichHTML(this.object.system.notes, { async: true }),
|
||||||
notesmj: await TextEditor.enrichHTML(this.object.system.notesmj, { async: true }),
|
notesmj: await TextEditor.enrichHTML(this.object.system.notesmj, { async: true }),
|
||||||
calc: {
|
calc: {
|
||||||
fortune: Monnaie.getFortune(this.actor),
|
fortune: Monnaie.getFortuneSolsDeniers(this.actor),
|
||||||
encTotal: await this.actor.computeEncombrementTotalEtMalusArmure(),
|
encTotal: await this.actor.computeEncombrementTotalEtMalusArmure(),
|
||||||
|
surenc: this.actor.computeMalusSurEncombrement(),
|
||||||
prixTotalEquipement: this.actor.computePrixTotalEquipement(),
|
prixTotalEquipement: this.actor.computePrixTotalEquipement(),
|
||||||
surprise: RdDBonus.find(this.actor.getSurprise(false)).descr,
|
surprise: RdDBonus.find(this.actor.getSurprise(false)).descr,
|
||||||
resumeBlessures: this.actor.computeResumeBlessure(this.actor.system.blessures),
|
resumeBlessures: this.actor.computeResumeBlessure(this.actor.system.blessures),
|
||||||
@@ -137,7 +137,7 @@ export class RdDActorSheet extends ActorSheet {
|
|||||||
RdDSheetUtility.splitItem(item, this.actor);
|
RdDSheetUtility.splitItem(item, this.actor);
|
||||||
});
|
});
|
||||||
this.html.find('.item-edit').click(async event => RdDSheetUtility.getItem(event, this.actor)?.sheet.render(true))
|
this.html.find('.item-edit').click(async event => RdDSheetUtility.getItem(event, this.actor)?.sheet.render(true))
|
||||||
this.html.find('.item-delete').click(async event => RdDUtility.confirmerSuppressionItem(this, RdDSheetUtility.getItem(event, this.actor)));
|
this.html.find('.item-delete').click(async event => RdDUtility.confirmActorItemDelete(this, RdDSheetUtility.getItem(event, this.actor)));
|
||||||
this.html.find('.item-vendre').click(async event => RdDSheetUtility.getItem(event, this.actor)?.proposerVente());
|
this.html.find('.item-vendre').click(async event => RdDSheetUtility.getItem(event, this.actor)?.proposerVente());
|
||||||
this.html.find('.item-montrer').click(async event => RdDSheetUtility.getItem(event, this.actor)?.postItem());
|
this.html.find('.item-montrer').click(async event => RdDSheetUtility.getItem(event, this.actor)?.postItem());
|
||||||
this.html.find('.item-action').click(async event => RdDSheetUtility.getItem(event, this.actor)?.actionPrincipale(this.actor));
|
this.html.find('.item-action').click(async event => RdDSheetUtility.getItem(event, this.actor)?.actionPrincipale(this.actor));
|
||||||
@@ -312,7 +312,7 @@ export class RdDActorSheet extends ActorSheet {
|
|||||||
});
|
});
|
||||||
|
|
||||||
this.html.find('.repos').click(async event => {
|
this.html.find('.repos').click(async event => {
|
||||||
await DialogRepos.create(this.actor);
|
await this.actor.repos();
|
||||||
});
|
});
|
||||||
this.html.find('.delete-active-effect').click(async event => {
|
this.html.find('.delete-active-effect').click(async event => {
|
||||||
if (game.user.isGM) {
|
if (game.user.isGM) {
|
||||||
|
|||||||
117
module/actor.js
117
module/actor.js
@@ -36,6 +36,7 @@ import { DialogValidationEncaissement } from "./dialog-validation-encaissement.j
|
|||||||
import { RdDRencontre } from "./item-rencontre.js";
|
import { RdDRencontre } from "./item-rencontre.js";
|
||||||
import { SystemCompendiums } from "./settings/system-compendiums.js";
|
import { SystemCompendiums } from "./settings/system-compendiums.js";
|
||||||
import { Targets } from "./targets.js";
|
import { Targets } from "./targets.js";
|
||||||
|
import { DialogRepos } from "./dialog-repos.js";
|
||||||
|
|
||||||
const POSSESSION_SANS_DRACONIC = {
|
const POSSESSION_SANS_DRACONIC = {
|
||||||
img: 'systems/foundryvtt-reve-de-dragon/icons/entites/possession.webp',
|
img: 'systems/foundryvtt-reve-de-dragon/icons/entites/possession.webp',
|
||||||
@@ -187,17 +188,17 @@ export class RdDActor extends Actor {
|
|||||||
|
|
||||||
canReceive(item) {
|
canReceive(item) {
|
||||||
if (this.isCreature()) {
|
if (this.isCreature()) {
|
||||||
return item.type == 'competencecreature' || RdDItem.isItemInventaire(item);
|
return item.type == 'competencecreature' || item.isInventaire();
|
||||||
}
|
}
|
||||||
if (this.isEntite()) {
|
if (this.isEntite()) {
|
||||||
return item.type == 'competencecreature';
|
return item.type == 'competencecreature';
|
||||||
}
|
}
|
||||||
if (this.isVehicule()) {
|
if (this.isVehicule()) {
|
||||||
return RdDItem.isItemInventaire(item);
|
return item.isInventaire();
|
||||||
}
|
}
|
||||||
if (this.isPersonnage()) {
|
if (this.isPersonnage()) {
|
||||||
switch (item.type) {
|
switch (item.type) {
|
||||||
case 'competencecreature': case 'tarot':
|
case 'competencecreature': case 'tarot': case 'service':
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
@@ -446,6 +447,38 @@ export class RdDActor extends Actor {
|
|||||||
return '';
|
return '';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* -------------------------------------------- */
|
||||||
|
async roll() {
|
||||||
|
const carac = mergeObject(
|
||||||
|
duplicate(this.system.carac),
|
||||||
|
{
|
||||||
|
'reve-actuel': this.getCaracReveActuel(),
|
||||||
|
'chance-actuelle': this.getCaracChanceActuelle()
|
||||||
|
});
|
||||||
|
let rollData = {
|
||||||
|
carac: carac,
|
||||||
|
selectedCarac: carac.apparence,
|
||||||
|
selectedCaracName: 'apparence',
|
||||||
|
competences: this.itemTypes['competence']
|
||||||
|
};
|
||||||
|
|
||||||
|
const dialog = await RdDRoll.create(this, rollData,
|
||||||
|
{ html: 'systems/foundryvtt-reve-de-dragon/templates/dialog-roll.html' },
|
||||||
|
{
|
||||||
|
name: `jet-${this.id}`,
|
||||||
|
label: `Jet de ${this.name}`,
|
||||||
|
callbacks: [
|
||||||
|
this.createCallbackExperience(),
|
||||||
|
this.createCallbackAppelAuMoral(),
|
||||||
|
{ action: r => this._onRollCaracResult(r) }
|
||||||
|
]
|
||||||
|
}
|
||||||
|
);
|
||||||
|
dialog.render(true);
|
||||||
|
}
|
||||||
|
async repos() {
|
||||||
|
await DialogRepos.create(this.actor);
|
||||||
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
async grisReve(nGrisReve) {
|
async grisReve(nGrisReve) {
|
||||||
@@ -1352,9 +1385,6 @@ export class RdDActor extends Actor {
|
|||||||
if (!this.pack) {
|
if (!this.pack) {
|
||||||
await this.computeMalusArmure();
|
await this.computeMalusArmure();
|
||||||
this.encTotal = this.items.map(it => it.getEncTotal()).reduce(Misc.sum(), 0);
|
this.encTotal = this.items.map(it => it.getEncTotal()).reduce(Misc.sum(), 0);
|
||||||
if (!this.isVehicule()) {
|
|
||||||
this.system.compteurs.surenc.value = this.computeMalusSurEncombrement();
|
|
||||||
}
|
|
||||||
return this.encTotal;
|
return this.encTotal;
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
@@ -1376,6 +1406,7 @@ export class RdDActor extends Actor {
|
|||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
computePrixTotalEquipement() {
|
computePrixTotalEquipement() {
|
||||||
const valeur = this.items.filter(it => it.isInventaire())
|
const valeur = this.items.filter(it => it.isInventaire())
|
||||||
|
.filter(it => !it.isMonnaie())
|
||||||
.map(it => it.valeurTotale())
|
.map(it => it.valeurTotale())
|
||||||
.reduce(Misc.sum(), 0);
|
.reduce(Misc.sum(), 0);
|
||||||
return valeur;
|
return valeur;
|
||||||
@@ -3182,21 +3213,29 @@ export class RdDActor extends Actor {
|
|||||||
getCaracByName(name) {
|
getCaracByName(name) {
|
||||||
switch (Grammar.toLowerCaseNoAccent(name)) {
|
switch (Grammar.toLowerCaseNoAccent(name)) {
|
||||||
case 'reve-actuel': case 'reve actuel':
|
case 'reve-actuel': case 'reve actuel':
|
||||||
return {
|
return this.getCaracReveActuel();
|
||||||
label: 'Rêve actuel',
|
|
||||||
value: this.getReveActuel(),
|
|
||||||
type: "number"
|
|
||||||
};
|
|
||||||
case 'chance-actuelle': case 'chance-actuelle':
|
case 'chance-actuelle': case 'chance-actuelle':
|
||||||
return {
|
return this.getCaracChanceActuelle();
|
||||||
label: 'Chance actuelle',
|
|
||||||
value: this.getChanceActuel(),
|
|
||||||
type: "number"
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
return RdDActor._findCaracByName(this.system.carac, name);
|
return RdDActor._findCaracByName(this.system.carac, name);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
getCaracChanceActuelle() {
|
||||||
|
return {
|
||||||
|
label: 'Chance actuelle',
|
||||||
|
value: this.getChanceActuel(),
|
||||||
|
type: "number"
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
getCaracReveActuel() {
|
||||||
|
return {
|
||||||
|
label: 'Rêve actuel',
|
||||||
|
value: this.getReveActuel(),
|
||||||
|
type: "number"
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static _findCaracByName(carac, name) {
|
static _findCaracByName(carac, name) {
|
||||||
name = Grammar.toLowerCaseNoAccent(name);
|
name = Grammar.toLowerCaseNoAccent(name);
|
||||||
@@ -3731,35 +3770,32 @@ export class RdDActor extends Actor {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const cout = Number(achat.prixTotal ?? 0);
|
const cout = Number(achat.prixTotal ?? 0);
|
||||||
const vente = achat.vente;
|
|
||||||
const acheteur = achat.acheteurId ? game.actors.get(achat.acheteurId) : undefined;
|
|
||||||
const vendeur = achat.vendeurId ? game.actors.get(achat.vendeurId) : undefined;
|
const vendeur = achat.vendeurId ? game.actors.get(achat.vendeurId) : undefined;
|
||||||
let itemVendu = vendeur?.getObjet(vente.item._id);
|
const service = achat.serviceId ? (vendeur?.getObjet(achat.serviceId) ?? game.items.get(achat.serviceId)) : undefined;
|
||||||
|
const acheteur = achat.acheteurId ? game.actors.get(achat.acheteurId) : undefined;
|
||||||
if (vendeur && (itemVendu?.getQuantite() ?? 0) < achat.quantiteTotal) {
|
const vente = achat.vente;
|
||||||
ChatUtility.notifyUser(achat.userId, 'warn', `Le vendeur n'a plus assez de ${vente.item.name} !`);
|
const quantite = (achat.choix.nombreLots ?? 1) * (vente.tailleLot);
|
||||||
return;
|
const itemVendu = vendeur?.getObjet(vente.item._id) ?? (await RdDItem.getCorrespondingItem(vente.item));
|
||||||
|
if (!this.verifierQuantite(service, vendeur, itemVendu, quantite)) {
|
||||||
|
ChatUtility.notifyUser(achat.userId, 'warn', `Le vendeur n'a pas assez de ${itemVendu.name} !`);
|
||||||
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Monnaie.getFortune(acheteur) < Number(cout)) {
|
if (Monnaie.getFortune(acheteur) < Number(cout)) {
|
||||||
ChatUtility.notifyUser(achat.userId, 'warn', `Vous n'avez pas assez d'argent pour payer ${Math.ceil(cout / 100)} sols !`);
|
ChatUtility.notifyUser(achat.userId, 'warn', `Vous n'avez pas assez d'argent pour payer ${Math.ceil(cout / 100)} sols !`);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
await this.decrementerVente(service, vendeur, itemVendu, quantite, cout);
|
||||||
achat.quantiteTotal = (achat.choix.nombreLots ?? 1) * (vente.tailleLot);
|
|
||||||
if (vendeur) {
|
|
||||||
await vendeur.ajouterSols(cout);
|
|
||||||
await vendeur.decrementerQuantiteItem(itemVendu, achat.quantiteTotal,);
|
|
||||||
}
|
|
||||||
if (acheteur) {
|
if (acheteur) {
|
||||||
await acheteur.depenserSols(cout);
|
await acheteur.depenserSols(cout);
|
||||||
let createdItemId = await acheteur.creerQuantiteItem(vente.item, achat.quantiteTotal);
|
let createdItemId = await acheteur.creerQuantiteItem(vente.item, quantite);
|
||||||
await acheteur.consommerNourritureAchetee(achat, vente, createdItemId);
|
await acheteur.consommerNourritureAchetee(achat, vente, createdItemId);
|
||||||
}
|
}
|
||||||
if (cout > 0) {
|
if (cout > 0) {
|
||||||
RdDAudio.PlayContextAudio("argent");
|
RdDAudio.PlayContextAudio("argent");
|
||||||
}
|
}
|
||||||
const chatAchatItem = duplicate(vente);
|
const chatAchatItem = duplicate(vente);
|
||||||
chatAchatItem.quantiteTotal = achat.quantiteTotal;
|
chatAchatItem.quantiteTotal = quantite;
|
||||||
ChatMessage.create({
|
ChatMessage.create({
|
||||||
user: achat.userId,
|
user: achat.userId,
|
||||||
speaker: { alias: (acheteur ?? vendeur).name },
|
speaker: { alias: (acheteur ?? vendeur).name },
|
||||||
@@ -3771,8 +3807,8 @@ export class RdDActor extends Actor {
|
|||||||
if (vente.quantiteNbLots <= achat.choix.nombreLots) {
|
if (vente.quantiteNbLots <= achat.choix.nombreLots) {
|
||||||
ChatUtility.removeChatMessageId(achat.chatMessageIdVente);
|
ChatUtility.removeChatMessageId(achat.chatMessageIdVente);
|
||||||
}
|
}
|
||||||
else {
|
else if (!service) {
|
||||||
vente["properties"] = new RdDItem(vente.item).getProprietes();
|
vente["properties"] = itemVendu.getProprietes();
|
||||||
vente.quantiteNbLots -= achat.choix.nombreLots;
|
vente.quantiteNbLots -= achat.choix.nombreLots;
|
||||||
vente.jsondata = JSON.stringify(vente.item);
|
vente.jsondata = JSON.stringify(vente.item);
|
||||||
const messageVente = game.messages.get(achat.chatMessageIdVente);
|
const messageVente = game.messages.get(achat.chatMessageIdVente);
|
||||||
@@ -3782,6 +3818,21 @@ export class RdDActor extends Actor {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async decrementerVente(service, vendeur, itemVendu, quantite, cout) {
|
||||||
|
if (service) {
|
||||||
|
await service.venteRefItem(itemVendu, quantite, cout)
|
||||||
|
}
|
||||||
|
else if (vendeur) {
|
||||||
|
await vendeur.ajouterSols(cout);
|
||||||
|
await vendeur.decrementerQuantiteItem(itemVendu, quantite);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
verifierQuantite(service, vendeur, item, quantiteTotal) {
|
||||||
|
const disponible = service ? service.getQuantiteDisponible(item, quantiteTotal) : (vendeur ? (item?.getQuantite() ?? 0) : quantiteTotal);
|
||||||
|
return disponible >= quantiteTotal;
|
||||||
|
}
|
||||||
|
|
||||||
async consommerNourritureAchetee(achat, vente, createdItemId) {
|
async consommerNourritureAchetee(achat, vente, createdItemId) {
|
||||||
if (achat.choix.consommer && vente.item.type == 'nourritureboisson' && createdItemId != undefined) {
|
if (achat.choix.consommer && vente.item.type == 'nourritureboisson' && createdItemId != undefined) {
|
||||||
achat.choix.doses = achat.choix.nombreLots;
|
achat.choix.doses = achat.choix.nombreLots;
|
||||||
|
|||||||
@@ -1,14 +1,13 @@
|
|||||||
|
import { Misc } from "./misc.js";
|
||||||
import { Monnaie } from "./item-monnaie.js";
|
|
||||||
import { RdDUtility } from "./rdd-utility.js";
|
import { RdDUtility } from "./rdd-utility.js";
|
||||||
|
|
||||||
export class DialogItemAchat extends Dialog {
|
export class DialogItemAchat extends Dialog {
|
||||||
|
|
||||||
static venteData(button) {
|
static preparerAchat(chatButton) {
|
||||||
const vendeurId = button.attributes['data-vendeurId']?.value;
|
const vendeurId = chatButton.attributes['data-vendeurId']?.value;
|
||||||
const vendeur = vendeurId ? game.actors.get(vendeurId) : undefined;
|
const vendeur = vendeurId ? game.actors.get(vendeurId) : undefined;
|
||||||
const acheteur = RdDUtility.getSelectedActor();
|
const acheteur = RdDUtility.getSelectedActor();
|
||||||
const json = button.attributes['data-jsondata']?.value;
|
const json = chatButton.attributes['data-jsondata']?.value;
|
||||||
if (!acheteur && !vendeur) {
|
if (!acheteur && !vendeur) {
|
||||||
ui.notifications.info("Pas d'acheteur ni de vendeur, aucun changement");
|
ui.notifications.info("Pas d'acheteur ni de vendeur, aucun changement");
|
||||||
return undefined;
|
return undefined;
|
||||||
@@ -18,46 +17,68 @@ export class DialogItemAchat extends Dialog {
|
|||||||
return undefined;
|
return undefined;
|
||||||
}
|
}
|
||||||
|
|
||||||
const prixLot = Number(button.attributes['data-prixLot']?.value ?? 0);
|
|
||||||
return {
|
return {
|
||||||
item: json ? JSON.parse(json) : undefined,
|
item: (json ? JSON.parse(json) : undefined),
|
||||||
actingUserId: game.user.id,
|
vendeur,
|
||||||
vendeurId: vendeurId,
|
acheteur,
|
||||||
vendeur: vendeur,
|
nbLots: parseInt(chatButton.attributes['data-quantiteNbLots']?.value),
|
||||||
acheteur: acheteur,
|
tailleLot: parseInt(chatButton.attributes['data-tailleLot']?.value ?? 1),
|
||||||
tailleLot: parseInt(button.attributes['data-tailleLot']?.value ?? 1),
|
prixLot: Number(chatButton.attributes['data-prixLot']?.value ?? 0),
|
||||||
quantiteIllimite: button.attributes['data-quantiteIllimite']?.value == 'true',
|
quantiteIllimite: chatButton.attributes['data-quantiteIllimite']?.value == 'true',
|
||||||
quantiteNbLots: parseInt(button.attributes['data-quantiteNbLots']?.value),
|
chatMessageIdVente: RdDUtility.findChatMessageId(chatButton),
|
||||||
choix: {
|
|
||||||
nombreLots: 1,
|
|
||||||
seForcer: false,
|
|
||||||
supprimerSiZero: true
|
|
||||||
},
|
|
||||||
prixLot: prixLot,
|
|
||||||
prixTotal: prixLot,
|
|
||||||
isVente: prixLot > 0,
|
|
||||||
chatMessageIdVente: RdDUtility.findChatMessageId(button)
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
static async onAcheter(venteData) {
|
|
||||||
|
static async onAcheter({ item, vendeur, acheteur, service, tailleLot, prixLot, nbLots, quantiteIllimite, chatMessageIdVente }) {
|
||||||
|
const venteData = {
|
||||||
|
item,
|
||||||
|
actingUserId: game.user.id,
|
||||||
|
vendeurId: vendeur?.id,
|
||||||
|
vendeur,
|
||||||
|
acheteur,
|
||||||
|
service,
|
||||||
|
tailleLot,
|
||||||
|
quantiteIllimite,
|
||||||
|
quantiteNbLots: nbLots,
|
||||||
|
choix: { seForcer: false, supprimerSiZero: true },
|
||||||
|
prixLot,
|
||||||
|
isVente: prixLot > 0,
|
||||||
|
isConsommable: item.type == 'nourritureboisson' && acheteur?.isPersonnage(),
|
||||||
|
chatMessageIdVente
|
||||||
|
};
|
||||||
|
|
||||||
|
DialogItemAchat.changeNombreLots(venteData, 1);
|
||||||
const html = await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/dialog-item-achat.html`, venteData);
|
const html = await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/dialog-item-achat.html`, venteData);
|
||||||
new DialogItemAchat(html, venteData).render(true);
|
new DialogItemAchat(html, venteData).render(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static changeNombreLots(venteData, nombreLots) {
|
||||||
|
venteData.choix.nombreLots = nombreLots;
|
||||||
|
venteData.prixTotal = (nombreLots * venteData.prixLot).toFixed(2);
|
||||||
|
if (venteData.isConsommable) {
|
||||||
|
const doses = nombreLots * venteData.tailleLot;
|
||||||
|
venteData.totalSust = Misc.keepDecimals(doses * (venteData.item.system.sust ?? 0), 2);
|
||||||
|
venteData.totalDesaltere = venteData.item.system.boisson
|
||||||
|
? Misc.keepDecimals(doses * (venteData.item.system.desaltere ?? 0), 2)
|
||||||
|
: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
constructor(html, venteData) {
|
constructor(html, venteData) {
|
||||||
const isConsommable = venteData.item.type == 'nourritureboisson' && venteData.acheteur?.isPersonnage();
|
|
||||||
let options = { classes: ["dialogachat"], width: 400, height: 'fit-content', 'z-index': 99999 };
|
let options = { classes: ["dialogachat"], width: 400, height: 'fit-content', 'z-index': 99999 };
|
||||||
|
|
||||||
const actionAchat = venteData.prixLot > 0 ? "Acheter" : "Prendre";
|
const actionAchat = venteData.prixLot > 0 ? "Acheter" : "Prendre";
|
||||||
const buttons = {};
|
const buttons = {};
|
||||||
if (isConsommable) {
|
if (venteData.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[actionAchat] = { label: actionAchat, callback: it => { this.onAchat(); } };
|
||||||
buttons["decliner"] = { label: "Décliner", callback: it => { } };
|
buttons["decliner"] = { label: "Décliner", callback: it => { } };
|
||||||
|
const acheteur = venteData.acheteur?.name ?? 'Un acheteur';
|
||||||
|
const vendeur = (venteData.service ?? venteData.vendeur)?.name ?? 'Un vendeur';
|
||||||
let conf = {
|
let conf = {
|
||||||
title: venteData.acheteur ? venteData.acheteur.name + " - " + actionAchat : actionAchat,
|
title: `${acheteur} - ${actionAchat} à ${vendeur}`,
|
||||||
content: html,
|
content: html,
|
||||||
default: actionAchat,
|
default: actionAchat,
|
||||||
buttons: buttons
|
buttons: buttons
|
||||||
@@ -71,6 +92,7 @@ export class DialogItemAchat extends Dialog {
|
|||||||
await this.html.find(".nombreLots").change();
|
await this.html.find(".nombreLots").change();
|
||||||
(this.venteData.vendeur ?? this.venteData.acheteur).achatVente({
|
(this.venteData.vendeur ?? this.venteData.acheteur).achatVente({
|
||||||
userId: game.user.id,
|
userId: game.user.id,
|
||||||
|
serviceId: this.venteData.service?.id,
|
||||||
vendeurId: this.venteData.vendeur?.id,
|
vendeurId: this.venteData.vendeur?.id,
|
||||||
acheteurId: this.venteData.acheteur?.id,
|
acheteurId: this.venteData.acheteur?.id,
|
||||||
prixTotal: this.venteData.prixTotal,
|
prixTotal: this.venteData.prixTotal,
|
||||||
@@ -98,13 +120,21 @@ export class DialogItemAchat extends Dialog {
|
|||||||
}
|
}
|
||||||
|
|
||||||
setNombreLots(nombreLots) {
|
setNombreLots(nombreLots) {
|
||||||
if (nombreLots > this.venteData.quantiteNbLots) {
|
|
||||||
ui.notifications.warn(`Seulement ${this.venteData.quantiteNbLots} lots disponibles, vous ne pouvez pas en prendre ${nombreLots}`)
|
if (!this.venteData.quantiteIllimite) {
|
||||||
|
if (!this.venteData.quantiteIllimite && nombreLots > this.venteData.quantiteNbLots) {
|
||||||
|
ui.notifications.warn(`Seulement ${this.venteData.quantiteNbLots} lots disponibles, vous ne pouvez pas en prendre ${nombreLots}`)
|
||||||
|
}
|
||||||
|
nombreLots = Math.min(nombreLots, this.venteData.quantiteNbLots);
|
||||||
}
|
}
|
||||||
this.venteData.choix.nombreLots = Math.min(nombreLots, this.venteData.quantiteNbLots);
|
|
||||||
this.venteData.prixTotal = (nombreLots * this.venteData.prixLot).toFixed(2);
|
DialogItemAchat.changeNombreLots(this.venteData, nombreLots);
|
||||||
this.html.find(".nombreLots").val(this.venteData.choix.nombreLots);
|
|
||||||
|
this.html.find(".nombreLots").val(nombreLots);
|
||||||
this.html.find(".prixTotal").text(this.venteData.prixTotal);
|
this.html.find(".prixTotal").text(this.venteData.prixTotal);
|
||||||
|
this.html.find("span.total-sust").text(this.venteData.totalSust);
|
||||||
|
this.html.find("span.total-desaltere").text(this.venteData.totalDesaltere);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -2,21 +2,24 @@ import { HtmlUtility } from "./html-utility.js";
|
|||||||
|
|
||||||
export class DialogItemVente extends Dialog {
|
export class DialogItemVente extends Dialog {
|
||||||
|
|
||||||
static async display(item, callback) {
|
static async display({ item, callback, service = undefined, quantiteMax = undefined }) {
|
||||||
const quantite = item.isConteneur() ? 1 : item.system.quantite;
|
const quantite = quantiteMax ?? item.getQuantite();
|
||||||
|
const isOwned = item.isOwned;
|
||||||
|
// const isOwned = item.isOwned || service?.actor;
|
||||||
const venteData = {
|
const venteData = {
|
||||||
item: item,
|
item: item,
|
||||||
alias: item.actor?.name ?? game.user.name,
|
alias: item.actor?.name ?? service?.name ?? game.user.name,
|
||||||
vendeurId: item.actor?.id,
|
serviceId: service?.id,
|
||||||
|
vendeurId: item.actor?.id ?? service?.actor?.id,
|
||||||
prixOrigine: item.system.cout,
|
prixOrigine: item.system.cout,
|
||||||
prixUnitaire: item.system.cout,
|
prixUnitaire: item.system.cout,
|
||||||
prixLot: item.system.cout,
|
prixLot: item.system.cout,
|
||||||
tailleLot: 1,
|
tailleLot: 1,
|
||||||
quantiteNbLots: quantite,
|
quantiteNbLots: quantite,
|
||||||
quantiteMaxLots: quantite,
|
quantiteMaxLots: quantite,
|
||||||
quantiteMax: quantite ,
|
quantiteMax: quantite,
|
||||||
quantiteIllimite: !item.isOwned,
|
quantiteIllimite: service? service.system.illimite : !isOwned,
|
||||||
isOwned: item.isOwned,
|
isOwned: isOwned,
|
||||||
};
|
};
|
||||||
const html = await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/dialog-item-vente.html`, venteData);
|
const html = await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/dialog-item-vente.html`, venteData);
|
||||||
return new DialogItemVente(venteData, html, callback).render(true);
|
return new DialogItemVente(venteData, html, callback).render(true);
|
||||||
@@ -68,13 +71,11 @@ export class DialogItemVente extends Dialog {
|
|||||||
this.html.find(".prixLot").val(this.venteData.prixLot);
|
this.html.find(".prixLot").val(this.venteData.prixLot);
|
||||||
}
|
}
|
||||||
this.venteData.tailleLot = tailleLot;
|
this.venteData.tailleLot = tailleLot;
|
||||||
if (this.venteData.isOwned) {
|
// recalculer le nombre de lots max
|
||||||
// recalculer le nombre de lots max
|
this.venteData.quantiteMaxLots = Math.floor(this.venteData.quantiteMax / tailleLot);
|
||||||
this.venteData.quantiteMaxLots = Math.floor(this.venteData.quantiteMax / tailleLot);
|
this.venteData.quantiteNbLots = Math.min(this.venteData.quantiteMaxLots, this.venteData.quantiteNbLots);
|
||||||
this.venteData.quantiteNbLots = Math.min(this.venteData.quantiteMaxLots, this.venteData.quantiteNbLots);
|
this.html.find(".quantiteNbLots").val(this.venteData.quantiteNbLots);
|
||||||
this.html.find(".quantiteNbLots").val(this.venteData.quantiteNbLots);
|
this.html.find(".quantiteNbLots").attr("max", this.venteData.quantiteMaxLots)
|
||||||
this.html.find(".quantiteNbLots").attr("max", this.venteData.quantiteMaxLots)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
setNbLots(nbLots) {
|
setNbLots(nbLots) {
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
import { Misc } from "./misc.js";
|
|
||||||
|
|
||||||
export class DialogRepos extends Dialog {
|
export class DialogRepos extends Dialog {
|
||||||
|
|
||||||
|
|||||||
@@ -2,22 +2,22 @@ import { Misc } from "./misc.js";
|
|||||||
import { LOG_HEAD } from "./constants.js";
|
import { LOG_HEAD } from "./constants.js";
|
||||||
|
|
||||||
const MONNAIE_ETAIN = {
|
const MONNAIE_ETAIN = {
|
||||||
name: "Etain (1 denier)", type: 'monnaie',
|
name: "Denier (étain)", type: 'monnaie',
|
||||||
img: "systems/foundryvtt-reve-de-dragon/icons/objets/piece_etain_poisson.webp",
|
img: "systems/foundryvtt-reve-de-dragon/icons/objets/piece_etain_poisson.webp",
|
||||||
system: { quantite: 0, cout: 0.01, encombrement: 0.001, description: "" }
|
system: { quantite: 0, cout: 0.01, encombrement: 0.001, description: "" }
|
||||||
};
|
};
|
||||||
const MONNAIE_BRONZE = {
|
const MONNAIE_BRONZE = {
|
||||||
name: "Bronze (10 deniers)", type: 'monnaie',
|
name: "Sou (bronze)", type: 'monnaie',
|
||||||
img: "systems/foundryvtt-reve-de-dragon/icons/objets/piece_bronze_epees.webp",
|
img: "systems/foundryvtt-reve-de-dragon/icons/objets/piece_bronze_epees.webp",
|
||||||
system: { quantite: 0, cout: 0.10, encombrement: 0.002, description: "" }
|
system: { quantite: 0, cout: 0.10, encombrement: 0.002, description: "" }
|
||||||
};
|
};
|
||||||
const MONNAIE_ARGENT = {
|
const MONNAIE_ARGENT = {
|
||||||
name: "Argent (1 sol)", type: 'monnaie',
|
name: "Sol (argent)", type: 'monnaie',
|
||||||
img: "systems/foundryvtt-reve-de-dragon/icons/objets/piece_argent_sol.webp",
|
img: "systems/foundryvtt-reve-de-dragon/icons/objets/piece_argent_sol.webp",
|
||||||
system: { quantite: 0, cout: 1, encombrement: 0.003, description: "" }
|
system: { quantite: 0, cout: 1, encombrement: 0.003, description: "" }
|
||||||
};
|
};
|
||||||
const MONNAIE_OR = {
|
const MONNAIE_OR = {
|
||||||
name: "Or (10 sols)", type: 'monnaie',
|
name: "Dreagon (or)", type: 'monnaie',
|
||||||
img: "systems/foundryvtt-reve-de-dragon/icons/objets/piece_or_sol.webp",
|
img: "systems/foundryvtt-reve-de-dragon/icons/objets/piece_or_sol.webp",
|
||||||
system: { quantite: 0, cout: 10, encombrement: 0.004, description: "" }
|
system: { quantite: 0, cout: 10, encombrement: 0.004, description: "" }
|
||||||
};
|
};
|
||||||
@@ -72,6 +72,14 @@ export class Monnaie {
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static getFortuneSolsDeniers(actor) {
|
||||||
|
const fortune = Monnaie.getFortune(actor);
|
||||||
|
return {
|
||||||
|
sols: Math.floor(fortune),
|
||||||
|
deniers: Math.round(100 * (fortune - Math.floor(fortune)))
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
static async optimiserFortune(actor, fortune) {
|
static async optimiserFortune(actor, fortune) {
|
||||||
let resteEnDeniers = Math.round(fortune * 100);
|
let resteEnDeniers = Math.round(fortune * 100);
|
||||||
let monnaies = actor.itemTypes['monnaie'];
|
let monnaies = actor.itemTypes['monnaie'];
|
||||||
|
|||||||
@@ -23,15 +23,8 @@ export class RdDRencontreItemSheet extends RdDItemSheet {
|
|||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
async getData() {
|
async getData() {
|
||||||
const formData = duplicate(this.item);
|
const formData = await super.getData();
|
||||||
mergeObject(formData, {
|
mergeObject(formData, {
|
||||||
title: formData.name,
|
|
||||||
isGM: game.user.isGM,
|
|
||||||
owner: this.actor?.isOwner,
|
|
||||||
isOwned: this.actor ? true : false,
|
|
||||||
actorId: this.actor?.id,
|
|
||||||
editable: this.isEditable,
|
|
||||||
cssClass: this.isEditable ? "editable" : "locked",
|
|
||||||
effets: {
|
effets: {
|
||||||
succes: {
|
succes: {
|
||||||
liste: RdDRencontre.getEffetsSucces(),
|
liste: RdDRencontre.getEffetsSucces(),
|
||||||
|
|||||||
81
module/item-service-sheet.js
Normal file
81
module/item-service-sheet.js
Normal file
@@ -0,0 +1,81 @@
|
|||||||
|
import { RdDItemSheet } from "./item-sheet.js";
|
||||||
|
import { Misc } from "./misc.js";
|
||||||
|
import { RdDUtility } from "./rdd-utility.js";
|
||||||
|
import { SystemCompendiums } from "./settings/system-compendiums.js";
|
||||||
|
import { DialogItemAchat } from "./dialog-item-achat.js";
|
||||||
|
import { RdDItem } from "./item.js";
|
||||||
|
import { RdDItemService } from "./item-service.js";
|
||||||
|
|
||||||
|
export class RdDServiceItemSheet extends RdDItemSheet {
|
||||||
|
|
||||||
|
static get ITEM_TYPE() { return "service" };
|
||||||
|
|
||||||
|
async getData() {
|
||||||
|
const formData = await super.getData();
|
||||||
|
formData.disabled = formData.isGM || formData.isOwned ? '' : 'disabled';
|
||||||
|
return formData;
|
||||||
|
}
|
||||||
|
|
||||||
|
activateListeners(html) {
|
||||||
|
super.activateListeners(html);
|
||||||
|
|
||||||
|
this.html.find('a.rdd-world-content-link').click(async event => {
|
||||||
|
const itemRef = this.getItemRef(event);
|
||||||
|
game.items.get(itemRef.id)?.sheet.render(true)
|
||||||
|
});
|
||||||
|
|
||||||
|
this.html.find('a.sub-item-acheter').click(async event => {
|
||||||
|
const subItem = this.item.findRefItem(this.getItemRef(event));
|
||||||
|
await this.item.acheter(RdDUtility.getSelectedActor(), subItem);
|
||||||
|
});
|
||||||
|
|
||||||
|
if (!this.options.editable) return;
|
||||||
|
|
||||||
|
this.html.find('a.sub-item-vendre').click(async event => {
|
||||||
|
const subItem = this.item.findRefItem(this.getItemRef(event));
|
||||||
|
await this.item.vendre(subItem);
|
||||||
|
});
|
||||||
|
|
||||||
|
this.html.find('a.sub-item-delete').click(async event => {
|
||||||
|
await this.item.removeRefItem(this.getItemRef(event));
|
||||||
|
});
|
||||||
|
|
||||||
|
this.html.find('a.sub-item-quantite-moins').click(async event => await this.item.increaseRefItemQuantite(this.getItemRef(event), -1))
|
||||||
|
this.html.find('a.sub-item-quantite-plus').click(async event => await this.item.increaseRefItemQuantite(this.getItemRef(event), 1))
|
||||||
|
this.html.find('input.sub-item-quantite').change(async event => {
|
||||||
|
const newQuantite = Math.max(0, Number.parseInt(this.html.find(event.currentTarget).val()));
|
||||||
|
await this.item.updateRefItem(this.getItemRef(event), it => it.system.quantite = newQuantite);
|
||||||
|
})
|
||||||
|
this.html.find('input.sub-item-cout').change(async event => {
|
||||||
|
const newCout = Math.max(0, Number(this.html.find(event.currentTarget).val()));
|
||||||
|
await this.item.updateRefItem(this.getItemRef(event), it => it.system.cout = newCout);
|
||||||
|
})
|
||||||
|
this.html.find('a.sub-item-info-add').click(__ =>
|
||||||
|
ui.notifications.info(`Utiliser le glisser-déposer pour ajouter des objets depuis un compendium ou les objets du monde`)
|
||||||
|
);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
async _onDropItem(event, dragData) {
|
||||||
|
let linkedItem = fromUuidSync(dragData.uuid);
|
||||||
|
const existing = this.item.system.items.find(it => it.pack == linkedItem.pack && it.id == linkedItem.id && it.type == linkedItem.type);
|
||||||
|
if (existing) {
|
||||||
|
ui.notifications.warn(`${this.item.name} contient déjà un ${existing.name}`);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (linkedItem.pack) {
|
||||||
|
linkedItem = await SystemCompendiums.loadDocument(linkedItem);
|
||||||
|
}
|
||||||
|
if (linkedItem.isInventaire()) {
|
||||||
|
await this.item.addRefItem(RdDItemService.createSubItem(linkedItem));
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
ui.notifications.warn(`${this.item.name} ne peut pas proposer à la vente de ${Misc.typeName('Item', linkedItem.type)}: ${linkedItem.name}`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
getItemRef(event) {
|
||||||
|
const itemRow = this.html.find(event.currentTarget)?.parents('.item.service-item');
|
||||||
|
return { id: itemRow?.data("item-id"), pack: itemRow?.data("pack") ?? undefined }
|
||||||
|
}
|
||||||
|
}
|
||||||
140
module/item-service.js
Normal file
140
module/item-service.js
Normal file
@@ -0,0 +1,140 @@
|
|||||||
|
import { DialogItemAchat } from "./dialog-item-achat.js";
|
||||||
|
import { RdDItem } from "./item.js";
|
||||||
|
import { Misc } from "./misc.js";
|
||||||
|
|
||||||
|
export class RdDItemService extends RdDItem {
|
||||||
|
|
||||||
|
static get defaultIcon() {
|
||||||
|
return "systems/foundryvtt-reve-de-dragon/icons/items/services.webp";
|
||||||
|
}
|
||||||
|
|
||||||
|
/** @override*/
|
||||||
|
getUserLevel(user) {
|
||||||
|
const level = super.getUserLevel(user);
|
||||||
|
if (level == CONST.DOCUMENT_OWNERSHIP_LEVELS.NONE) {
|
||||||
|
// si quelqu'un a accès au lien d'un service, il peut le voir
|
||||||
|
return CONST.DOCUMENT_OWNERSHIP_LEVELS.LIMITED;
|
||||||
|
}
|
||||||
|
return level;
|
||||||
|
}
|
||||||
|
|
||||||
|
isService() { return true; }
|
||||||
|
getChatItemTemplate() { return 'systems/foundryvtt-reve-de-dragon/templates/post-item-service.html'; }
|
||||||
|
getProprietes() { return []; }
|
||||||
|
|
||||||
|
getServiceItem(itemRef) {
|
||||||
|
if (this.isService()) {
|
||||||
|
return this.system.items.find(it => it.id == itemRef.id && it.pack == itemRef.pack);
|
||||||
|
}
|
||||||
|
return undefined;
|
||||||
|
}
|
||||||
|
|
||||||
|
getQuantiteDisponible(itemRef, max) {
|
||||||
|
if (this.system.illimite) {
|
||||||
|
return max;
|
||||||
|
}
|
||||||
|
const subItem = this.getServiceItem(itemRef);
|
||||||
|
return subItem?.system.quantite ?? 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
async venteRefItem(ref, quantite, cout) {
|
||||||
|
if (this.actor) {
|
||||||
|
await this.actor.ajouterSols(cout);
|
||||||
|
}
|
||||||
|
await this.increaseRefItemQuantite(ref, -quantite);
|
||||||
|
}
|
||||||
|
|
||||||
|
async vendre(subItem) {
|
||||||
|
const item = await RdDItem.getCorrespondingItem(subItem);
|
||||||
|
const quantiteMax = this.system.illimite ? undefined : subItem.system.quantite;
|
||||||
|
await item.proposerVente({ service: this, quantiteMax });
|
||||||
|
}
|
||||||
|
|
||||||
|
async acheter(acheteur, subItem) {
|
||||||
|
if (!acheteur) {
|
||||||
|
ui.notifications.warn(`Pas d'acheteur sélectionné`);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
const nbLots = this.system.illimite ? 1 : subItem.system.quantite;
|
||||||
|
if (nbLots <= 0) {
|
||||||
|
ui.notifications.warn(`${this.name} n'a plus de ${subItem.name} en vente`);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
await DialogItemAchat.onAcheter({
|
||||||
|
item: await RdDItem.getCorrespondingItem(subItem),
|
||||||
|
acheteur,
|
||||||
|
service: this,
|
||||||
|
quantiteIllimite: this.system.illimite,
|
||||||
|
nbLots,
|
||||||
|
tailleLot: 1,
|
||||||
|
prixLot: subItem.system.cout
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
static createSubItem(linkedItem) {
|
||||||
|
return {
|
||||||
|
id: linkedItem.id,
|
||||||
|
pack: linkedItem.pack,
|
||||||
|
name: linkedItem.name,
|
||||||
|
img: linkedItem.img,
|
||||||
|
system: {
|
||||||
|
quantite: 1,
|
||||||
|
cout: linkedItem.system.cout ?? 0
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
static matchRefItem({ id, pack }) {
|
||||||
|
return it => it.id == id && (pack ? (it.pack == pack) : (!it.pack));
|
||||||
|
}
|
||||||
|
|
||||||
|
findRefItem(ref) {
|
||||||
|
return this.system.items.find(RdDItemService.matchRefItem(ref));
|
||||||
|
}
|
||||||
|
|
||||||
|
async increaseRefItemQuantite(ref, quantite) {
|
||||||
|
await this.updateRefItem(ref,
|
||||||
|
it => it.system.quantite = Math.max(0, it.system.quantite + quantite)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
async updateRefItem(ref, update = it => { }) {
|
||||||
|
await this.updateRefItems(RdDItemService.matchRefItem(ref), update);
|
||||||
|
}
|
||||||
|
|
||||||
|
async addRefItem(newItem) {
|
||||||
|
if (!newItem.id) {
|
||||||
|
ui.notifications.warn(`${newItem?.name ?? '??'} n'a pas d'identifiant`);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (this.system.items.find(RdDItemService.matchRefItem(newItem))) {
|
||||||
|
ui.notifications.warn(`${newItem?.name ?? newItem.id} est déjà présent ici`);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
await this.setRefItems([...this.system.items, newItem]);
|
||||||
|
}
|
||||||
|
|
||||||
|
async removeRefItem(ref) {
|
||||||
|
await this.removeRefItems(RdDItemService.matchRefItem(ref));
|
||||||
|
}
|
||||||
|
|
||||||
|
async removeRefItems(matcher = it => false) {
|
||||||
|
await this.setRefItems(this.system.items.filter(it => !matcher(it)));
|
||||||
|
}
|
||||||
|
|
||||||
|
async updateRefItems(matcher = it => false, update = it => { }) {
|
||||||
|
const updatedList = this.system.items.map(it => {
|
||||||
|
if (matcher(it)) {
|
||||||
|
update(it);
|
||||||
|
}
|
||||||
|
return it;
|
||||||
|
});
|
||||||
|
await this.setRefItems(updatedList);
|
||||||
|
}
|
||||||
|
|
||||||
|
async setRefItems(newItems) {
|
||||||
|
await this.update({ 'system.items': newItems.sort(Misc.ascending(it => it.type + ':' + it.name)) });
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -209,7 +209,7 @@ export class RdDItemSheet extends ItemSheet {
|
|||||||
|
|
||||||
this.html.find('.item-split').click(async event => RdDSheetUtility.splitItem(RdDSheetUtility.getItem(event, this.actor), this.actor, async () => this.render(true)));
|
this.html.find('.item-split').click(async event => RdDSheetUtility.splitItem(RdDSheetUtility.getItem(event, this.actor), this.actor, async () => this.render(true)));
|
||||||
this.html.find('.item-edit').click(async event => RdDSheetUtility.getItem(event, this.actor)?.sheet.render(true));
|
this.html.find('.item-edit').click(async event => RdDSheetUtility.getItem(event, this.actor)?.sheet.render(true));
|
||||||
this.html.find('.item-delete').click(async event => RdDUtility.confirmerSuppressionItem(this, RdDSheetUtility.getItem(event, this.actor)));
|
this.html.find('.item-delete').click(async event => RdDUtility.confirmActorItemDelete(this, RdDSheetUtility.getItem(event, this.actor)));
|
||||||
this.html.find('.item-vendre').click(async event => RdDSheetUtility.getItem(event, this.actor)?.proposerVente());
|
this.html.find('.item-vendre').click(async event => RdDSheetUtility.getItem(event, this.actor)?.proposerVente());
|
||||||
this.html.find('.item-montrer').click(async event => RdDSheetUtility.getItem(event, this.actor)?.postItem());
|
this.html.find('.item-montrer').click(async event => RdDSheetUtility.getItem(event, this.actor)?.postItem());
|
||||||
this.html.find('.item-action').click(async event => RdDSheetUtility.getItem(event, this.actor)?.actionPrincipale(this.actor, async () => this.render(true)));
|
this.html.find('.item-action').click(async event => RdDSheetUtility.getItem(event, this.actor)?.actionPrincipale(this.actor, async () => this.render(true)));
|
||||||
|
|||||||
@@ -23,18 +23,9 @@ export class RdDSigneDraconiqueItemSheet extends RdDItemSheet {
|
|||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
async getData() {
|
async getData() {
|
||||||
const formData = duplicate(this.item);
|
const formData = await super.getData();
|
||||||
this.tmrs = TMRUtility.buildSelectionTypesTMR(this.item.system.typesTMR);
|
this.tmrs = TMRUtility.buildSelectionTypesTMR(this.item.system.typesTMR);
|
||||||
mergeObject(formData, {
|
formData.tmrs = this.tmrs;
|
||||||
tmrs: this.tmrs,
|
|
||||||
title: formData.name,
|
|
||||||
isGM: game.user.isGM,
|
|
||||||
owner: this.actor?.isOwner,
|
|
||||||
isOwned: this.actor ? true : false,
|
|
||||||
actorId: this.actor?.id,
|
|
||||||
editable: this.isEditable,
|
|
||||||
cssClass: this.isEditable ? "editable" : "locked",
|
|
||||||
});
|
|
||||||
return formData;
|
return formData;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
129
module/item.js
129
module/item.js
@@ -3,6 +3,7 @@ import { Grammar } from "./grammar.js";
|
|||||||
import { Misc } from "./misc.js";
|
import { Misc } from "./misc.js";
|
||||||
import { RdDHerbes } from "./rdd-herbes.js";
|
import { RdDHerbes } from "./rdd-herbes.js";
|
||||||
import { RdDUtility } from "./rdd-utility.js";
|
import { RdDUtility } from "./rdd-utility.js";
|
||||||
|
import { SystemCompendiums } from "./settings/system-compendiums.js";
|
||||||
|
|
||||||
const typesObjetsInventaire = [
|
const typesObjetsInventaire = [
|
||||||
"arme",
|
"arme",
|
||||||
@@ -57,6 +58,7 @@ export const defaultItemImg = {
|
|||||||
poison: "systems/foundryvtt-reve-de-dragon/icons/maladies_venins/venin.webp",
|
poison: "systems/foundryvtt-reve-de-dragon/icons/maladies_venins/venin.webp",
|
||||||
oeuvre: "systems/foundryvtt-reve-de-dragon/icons/competence_comedie.webp",
|
oeuvre: "systems/foundryvtt-reve-de-dragon/icons/competence_comedie.webp",
|
||||||
nourritureboisson: "systems/foundryvtt-reve-de-dragon/icons/objets/provision_crue.webp",
|
nourritureboisson: "systems/foundryvtt-reve-de-dragon/icons/objets/provision_crue.webp",
|
||||||
|
service: "systems/foundryvtt-reve-de-dragon/icons/items/services.webp",
|
||||||
signedraconique: "systems/foundryvtt-reve-de-dragon/icons/tmr/signe_draconique.webp",
|
signedraconique: "systems/foundryvtt-reve-de-dragon/icons/tmr/signe_draconique.webp",
|
||||||
gemme: "systems/foundryvtt-reve-de-dragon/icons/gemmes/almaze.webp",
|
gemme: "systems/foundryvtt-reve-de-dragon/icons/gemmes/almaze.webp",
|
||||||
possession: "systems/foundryvtt-reve-de-dragon/icons/entites/possession2.webp",
|
possession: "systems/foundryvtt-reve-de-dragon/icons/entites/possession2.webp",
|
||||||
@@ -69,11 +71,7 @@ export const defaultItemImg = {
|
|||||||
export class RdDItem extends Item {
|
export class RdDItem extends Item {
|
||||||
|
|
||||||
static getDefaultImg(itemType) {
|
static getDefaultImg(itemType) {
|
||||||
return defaultItemImg[itemType];
|
return game.system.rdd.itemClasses[itemType]?.defaultIcon ?? defaultItemImg[itemType];
|
||||||
}
|
|
||||||
|
|
||||||
static isItemInventaire(newLocal) {
|
|
||||||
return typesObjetsInventaire.includes(newLocal.type);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static isFieldInventaireModifiable(type, field) {
|
static isFieldInventaireModifiable(type, field) {
|
||||||
@@ -92,6 +90,42 @@ export class RdDItem extends Item {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static async getCorrespondingItem(itemRef) {
|
||||||
|
if (itemRef.pack) {
|
||||||
|
return await SystemCompendiums.loadDocument(itemRef)
|
||||||
|
}
|
||||||
|
return game.items.get(itemRef.id ?? itemRef._id);
|
||||||
|
}
|
||||||
|
|
||||||
|
static getItemTypesInventaire() {
|
||||||
|
return typesObjetsInventaire
|
||||||
|
}
|
||||||
|
|
||||||
|
static getTypesOeuvres() {
|
||||||
|
return typesObjetsOeuvres
|
||||||
|
}
|
||||||
|
|
||||||
|
constructor(docData, context = {}) {
|
||||||
|
if (!context.rdd?.ready) {
|
||||||
|
mergeObject(context, { rdd: { ready: true } });
|
||||||
|
const ItemConstructor = game.system.rdd.itemClasses[docData.type];
|
||||||
|
if (ItemConstructor) {
|
||||||
|
if (!docData.img) {
|
||||||
|
docData.img = ItemConstructor.defaultIcon;
|
||||||
|
}
|
||||||
|
return new ItemConstructor(docData, context);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!docData.img) {
|
||||||
|
docData.img = RdDItem.getDefaultImg(docData.type);
|
||||||
|
}
|
||||||
|
super(docData, context);
|
||||||
|
}
|
||||||
|
|
||||||
|
static get defaultIcon() {
|
||||||
|
return undefined;
|
||||||
|
}
|
||||||
|
|
||||||
getUniteQuantite() {
|
getUniteQuantite() {
|
||||||
switch (this.type) {
|
switch (this.type) {
|
||||||
case "monnaie": return "(Pièces)"
|
case "monnaie": return "(Pièces)"
|
||||||
@@ -107,32 +141,17 @@ export class RdDItem extends Item {
|
|||||||
return '';
|
return '';
|
||||||
}
|
}
|
||||||
|
|
||||||
constructor(itemData, context) {
|
isCompetencePersonnage() { return this.type == 'competence' }
|
||||||
if (!itemData.img) {
|
isCompetenceCreature() { return this.type == 'competencecreature' }
|
||||||
itemData.img = RdDItem.getDefaultImg(itemData.type);
|
isConteneur() { return this.type == 'conteneur'; }
|
||||||
}
|
isMonnaie() { return this.type == 'monnaie'; }
|
||||||
super(itemData, context);
|
isNourritureBoisson() { return this.type == 'nourritureboisson'; }
|
||||||
}
|
isService() { return this.type == 'service'; }
|
||||||
|
|
||||||
static getItemTypesInventaire() {
|
|
||||||
return typesObjetsInventaire
|
|
||||||
}
|
|
||||||
|
|
||||||
static getTypesOeuvres() {
|
|
||||||
return typesObjetsOeuvres
|
|
||||||
}
|
|
||||||
|
|
||||||
isCompetencePersonnage() {
|
|
||||||
return this.type == 'competence'
|
|
||||||
}
|
|
||||||
isCompetenceCreature() {
|
|
||||||
return this.type == 'competencecreature'
|
|
||||||
}
|
|
||||||
isCompetence() {
|
isCompetence() {
|
||||||
return typesObjetsCompetence.includes(this.type)
|
return typesObjetsCompetence.includes(this.type)
|
||||||
}
|
}
|
||||||
isInventaire() {
|
isInventaire() {
|
||||||
return RdDItem.isItemInventaire(this)
|
return typesObjetsInventaire.includes(this.type);
|
||||||
}
|
}
|
||||||
isOeuvre() {
|
isOeuvre() {
|
||||||
return typesObjetsOeuvres.includes(this.type)
|
return typesObjetsOeuvres.includes(this.type)
|
||||||
@@ -146,12 +165,7 @@ export class RdDItem extends Item {
|
|||||||
isConnaissance() {
|
isConnaissance() {
|
||||||
return typesObjetsConnaissance.includes(this.type)
|
return typesObjetsConnaissance.includes(this.type)
|
||||||
}
|
}
|
||||||
isConteneur() {
|
|
||||||
return this.type == 'conteneur';
|
|
||||||
}
|
|
||||||
isMonnaie() {
|
|
||||||
return this.type == 'monnaie';
|
|
||||||
}
|
|
||||||
|
|
||||||
getItemGroup() {
|
getItemGroup() {
|
||||||
if (this.isInventaire()) return "equipement";
|
if (this.isInventaire()) return "equipement";
|
||||||
@@ -175,10 +189,6 @@ export class RdDItem extends Item {
|
|||||||
return !this.isConteneur() || (this.system.contenu?.length ?? 0) == 0;
|
return !this.isConteneur() || (this.system.contenu?.length ?? 0) == 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
isNourritureBoisson() {
|
|
||||||
return this.type == 'nourritureboisson';
|
|
||||||
}
|
|
||||||
|
|
||||||
isComestible() {
|
isComestible() {
|
||||||
switch (this.type) {
|
switch (this.type) {
|
||||||
case 'nourritureboisson': return 'pret';
|
case 'nourritureboisson': return 'pret';
|
||||||
@@ -209,7 +219,7 @@ export class RdDItem extends Item {
|
|||||||
}
|
}
|
||||||
|
|
||||||
getQuantite() {
|
getQuantite() {
|
||||||
return Math.round(this.isConteneur() ? 1 : (this.system.quantite ?? 0))
|
return Math.round(this.system.quantite ?? 0)
|
||||||
}
|
}
|
||||||
|
|
||||||
getEncTotal() {
|
getEncTotal() {
|
||||||
@@ -410,31 +420,38 @@ export class RdDItem extends Item {
|
|||||||
return [true, undefined];
|
return [true, undefined];
|
||||||
}
|
}
|
||||||
|
|
||||||
async proposerVente() {
|
async proposerVente({ service = undefined, quantiteMax = undefined }) {
|
||||||
console.log(this);
|
console.log(this);
|
||||||
if (this.isConteneurNonVide()) {
|
if (this.isConteneurNonVide()) {
|
||||||
ui.notifications.warn(`Votre ${this.name} n'est pas vide, pas possible de le proposer`);
|
ui.notifications.warn(`Votre ${this.name} n'est pas vide, pas possible de le proposer`);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
await DialogItemVente.display(this, async (vente) => {
|
await DialogItemVente.display({
|
||||||
vente["properties"] = this.getProprietes();
|
item: this,
|
||||||
if (vente.isOwned) {
|
service,
|
||||||
if (vente.quantiteNbLots * vente.tailleLot > vente.quantiteMax) {
|
quantiteMax,
|
||||||
ui.notifications.warn(`Vous avez ${vente.quantiteMax} ${vente.item.name}, ce n'est pas suffisant pour vendre ${vente.quantiteNbLots} de ${vente.tailleLot}`)
|
callback: async (vente) => {
|
||||||
return;
|
vente["properties"] = this.getProprietes();
|
||||||
|
if (vente.isOwned) {
|
||||||
|
if (vente.quantiteNbLots * vente.tailleLot > vente.quantiteMax) {
|
||||||
|
ui.notifications.warn(`Vous avez ${vente.quantiteMax} ${vente.item.name}, ce n'est pas suffisant pour vendre ${vente.quantiteNbLots} de ${vente.tailleLot}`)
|
||||||
|
return;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
vente.jsondata = JSON.stringify(vente.item);
|
||||||
vente.jsondata = JSON.stringify(vente.item);
|
|
||||||
|
|
||||||
console.log(vente);
|
let html = await renderTemplate('systems/foundryvtt-reve-de-dragon/templates/chat-vente-item.html', vente);
|
||||||
let html = await renderTemplate('systems/foundryvtt-reve-de-dragon/templates/chat-vente-item.html', vente);
|
ChatMessage.create(RdDUtility.chatDataSetup(html));
|
||||||
ChatMessage.create(RdDUtility.chatDataSetup(html));
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
getProprietes() {
|
getProprietes() {
|
||||||
return this[`_${this.type}ChatData`]().filter(it => it != undefined);
|
if (this[`_${this.type}ChatData`]) {
|
||||||
|
return this[`_${this.type}ChatData`]().filter(it => it != undefined);
|
||||||
|
}
|
||||||
|
return [];
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
@@ -452,12 +469,19 @@ export class RdDItem extends Item {
|
|||||||
payload: chatData,
|
payload: chatData,
|
||||||
});
|
});
|
||||||
|
|
||||||
renderTemplate('systems/foundryvtt-reve-de-dragon/templates/post-item.html', chatData).then(html => {
|
renderTemplate(this.getChatItemTemplate(), chatData).then(html => {
|
||||||
let chatOptions = RdDUtility.chatDataSetup(html, modeOverride);
|
let chatOptions = RdDUtility.chatDataSetup(html, modeOverride);
|
||||||
ChatMessage.create(chatOptions)
|
ChatMessage.create(chatOptions)
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
getChatItemTemplate() {
|
||||||
|
switch (this.type) {
|
||||||
|
case 'service': return 'systems/foundryvtt-reve-de-dragon/templates/post-item-service.html';
|
||||||
|
}
|
||||||
|
return 'systems/foundryvtt-reve-de-dragon/templates/post-item.html';
|
||||||
|
}
|
||||||
|
|
||||||
static propertyIfDefined(name, val, condition = true) {
|
static propertyIfDefined(name, val, condition = true) {
|
||||||
return condition ? `<b>${name}</b>: ${val}` : undefined;
|
return condition ? `<b>${name}</b>: ${val}` : undefined;
|
||||||
}
|
}
|
||||||
@@ -706,5 +730,4 @@ export class RdDItem extends Item {
|
|||||||
...this._inventaireTemplateChatData()
|
...this._inventaireTemplateChatData()
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -29,6 +29,39 @@ class Migration {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class _1_5_34_migrationPngWebp {
|
||||||
|
get code() { return "migrationPngWebp"; }
|
||||||
|
get version() { return "1.5.34"; }
|
||||||
|
async migrate() {
|
||||||
|
|
||||||
|
const regexOldPngJpg = /(systems\/foundryvtt-reve-de-dragon\/icons\/.*)\.(png|jpg)/;
|
||||||
|
const replaceWithWebp = '$1.webp';
|
||||||
|
function convertImgToWebp(img) {
|
||||||
|
return img.replace(regexOldPngJpg, replaceWithWebp);
|
||||||
|
}
|
||||||
|
function prepareDocumentsImgUpdate(documents) {
|
||||||
|
return documents.filter(it => it.img && it.img.match(regexOldPngJpg))
|
||||||
|
.map(it => {
|
||||||
|
return { _id: it.id, img: convertImgToWebp(it.img) }
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
const itemsUpdates = prepareDocumentsImgUpdate(game.items);
|
||||||
|
const actorsUpdates = prepareDocumentsImgUpdate(game.actors);
|
||||||
|
//Migrate system png to webp
|
||||||
|
await Item.updateDocuments(itemsUpdates);
|
||||||
|
await Actor.updateDocuments(actorsUpdates);
|
||||||
|
game.actors.forEach(actor => {
|
||||||
|
if (actor.token?.img && actor.token.img.match(regexOldPngJpg)) {
|
||||||
|
actor.update({ "token.img": convertImgToWebp(actor.token.img) });
|
||||||
|
}
|
||||||
|
const actorItemsToUpdate = prepareDocumentsImgUpdate(actor.items);
|
||||||
|
actor.updateEmbeddedDocuments('Item', actorItemsToUpdate);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
class _10_0_16_MigrationSortsReserve extends Migration {
|
class _10_0_16_MigrationSortsReserve extends Migration {
|
||||||
get code() { return "creation-item-sort-reserve"; }
|
get code() { return "creation-item-sort-reserve"; }
|
||||||
get version() { return "10.0.16"; }
|
get version() { return "10.0.16"; }
|
||||||
@@ -236,7 +269,7 @@ class _10_3_0_Inventaire extends Migration {
|
|||||||
}
|
}
|
||||||
_updatesMonnaies(items) {
|
_updatesMonnaies(items) {
|
||||||
return items
|
return items
|
||||||
.filter(it => ['monnaie'].includes(it.type) && it.system.cout == undefined)
|
.filter(it => ['monnaie'].includes(it.type) && it.system.valeur_deniers != undefined)
|
||||||
.map(it => { return { _id: it.id, 'system.cout': it.system.valeur_deniers / 100, 'system.valeur_deniers': undefined } });
|
.map(it => { return { _id: it.id, 'system.cout': it.system.valeur_deniers / 100, 'system.valeur_deniers': undefined } });
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -259,9 +292,44 @@ class _10_3_0_FrequenceEnvironnement extends Migration {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class _10_3_17_Monnaies extends Migration {
|
||||||
|
constructor() {
|
||||||
|
super();
|
||||||
|
this.mapValeur = {
|
||||||
|
"Etain (1 denier)": { name: 'Denier (étain)', system: { cout: 0.01 } },
|
||||||
|
"Bronze (10 deniers)": { name: "Sou (bronze)", system: { cout: 0.1 } },
|
||||||
|
"Argent (1 sol)": { name: "Sol (argent)", system: { cout: 1 } },
|
||||||
|
"Or (10 sols)": { name: "Dragon (or)", system: { cout: 10 } }
|
||||||
|
};
|
||||||
|
}
|
||||||
|
get code() { return "migration-monnaies"; }
|
||||||
|
get version() { return "10.3.17"; }
|
||||||
|
|
||||||
|
async migrate() {
|
||||||
|
await this.applyItemsUpdates(items => this._updatesMonnaies(items));
|
||||||
|
}
|
||||||
|
|
||||||
|
_updatesMonnaies(items) {
|
||||||
|
return items
|
||||||
|
.filter(it => 'monnaie' == it.type)
|
||||||
|
.filter(it => this.mapValeur[it.name] != undefined)
|
||||||
|
.map(it => {
|
||||||
|
const correction = this.mapValeur[it.name];
|
||||||
|
return {
|
||||||
|
_id: it.id,
|
||||||
|
'name': correction.name,
|
||||||
|
'system.cout': correction.system.cout,
|
||||||
|
'system.valeur_deniers': undefined
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
export class Migrations {
|
export class Migrations {
|
||||||
static getMigrations() {
|
static getMigrations() {
|
||||||
return [
|
return [
|
||||||
|
new _1_5_34_migrationPngWebp(),
|
||||||
new _10_0_16_MigrationSortsReserve(),
|
new _10_0_16_MigrationSortsReserve(),
|
||||||
new _10_0_17_MigrationCompetenceCreature(),
|
new _10_0_17_MigrationCompetenceCreature(),
|
||||||
new _10_0_21_VehiculeStructureResistanceMax(),
|
new _10_0_21_VehiculeStructureResistanceMax(),
|
||||||
@@ -269,7 +337,8 @@ export class Migrations {
|
|||||||
new _10_2_5_ArmesTirLancer(),
|
new _10_2_5_ArmesTirLancer(),
|
||||||
new _10_2_10_DesirLancinant_IdeeFixe(),
|
new _10_2_10_DesirLancinant_IdeeFixe(),
|
||||||
new _10_3_0_Inventaire(),
|
new _10_3_0_Inventaire(),
|
||||||
new _10_3_0_FrequenceEnvironnement()
|
new _10_3_0_FrequenceEnvironnement(),
|
||||||
|
new _10_3_17_Monnaies()
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -284,9 +353,9 @@ export class Migrations {
|
|||||||
}
|
}
|
||||||
|
|
||||||
migrate() {
|
migrate() {
|
||||||
const currentVersion = game.settings.get(SYSTEM_RDD,"systemMigrationVersion");
|
const currentVersion = game.settings.get(SYSTEM_RDD, "systemMigrationVersion");
|
||||||
//if (isNewerVersion(game.system.version, currentVersion)) {
|
if (isNewerVersion(game.system.version, currentVersion)) {
|
||||||
if (true) { /* comment previous and uncomment here to test before upgrade */
|
//if (true) { /* comment previous and uncomment here to test before upgrade */
|
||||||
const migrations = Migrations.getMigrations().filter(m => isNewerVersion(m.version, currentVersion));
|
const migrations = Migrations.getMigrations().filter(m => isNewerVersion(m.version, currentVersion));
|
||||||
if (migrations.length > 0) {
|
if (migrations.length > 0) {
|
||||||
migrations.sort((a, b) =>
|
migrations.sort((a, b) =>
|
||||||
|
|||||||
@@ -29,7 +29,7 @@ export class RdDCalendrierEditeur extends Dialog {
|
|||||||
this.html.find("input[name='nomMois']").val(this.calendrierData.moisKey);
|
this.html.find("input[name='nomMois']").val(this.calendrierData.moisKey);
|
||||||
this.html.find("select[name='nomHeure']").val(this.calendrierData.heureKey);
|
this.html.find("select[name='nomHeure']").val(this.calendrierData.heureKey);
|
||||||
this.html.find("select[name='jourMois']").val(this.calendrierData.jourMois);
|
this.html.find("select[name='jourMois']").val(this.calendrierData.jourMois);
|
||||||
this.html.find("select[name='minutesRelative']").val(calendrierData.minutesRelative);
|
this.html.find("select[name='minutesRelative']").val(this.calendrierData.minutesRelative);
|
||||||
this.html.find("select[name='annee']").val(this.calendrierData.annee);
|
this.html.find("select[name='annee']").val(this.calendrierData.annee);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -162,7 +162,6 @@ export class RdDCombatManager extends Combat {
|
|||||||
if (arme.system.unemain && arme.system.deuxmains && !dommages.includes("/")) {
|
if (arme.system.unemain && arme.system.deuxmains && !dommages.includes("/")) {
|
||||||
ui.notifications.info("Les dommages de l'arme à 1/2 mains " + arme.name + " ne sont pas corrects (ie sous la forme X/Y)");
|
ui.notifications.info("Les dommages de l'arme à 1/2 mains " + arme.name + " ne sont pas corrects (ie sous la forme X/Y)");
|
||||||
}
|
}
|
||||||
console.log(">>>>", arme)
|
|
||||||
if ((arme.system.unemain && arme.system.competence) ||
|
if ((arme.system.unemain && arme.system.competence) ||
|
||||||
(arme.system.competence.toLowerCase().includes("corps à corps"))) {
|
(arme.system.competence.toLowerCase().includes("corps à corps"))) {
|
||||||
actions.push(RdDCombatManager.$prepareAttaqueArme({
|
actions.push(RdDCombatManager.$prepareAttaqueArme({
|
||||||
|
|||||||
@@ -331,7 +331,7 @@ export class RdDCommands {
|
|||||||
diff = 0;
|
diff = 0;
|
||||||
}
|
}
|
||||||
const caracName = params[0];
|
const caracName = params[0];
|
||||||
let competence = length > 1 ? actors[0].getCompetence(Misc.join(params.slice(1, length), ' ')) : undefined;
|
let competence = length > 1 ? actors[0].getCompetence(Misc.join(params.slice(1, length), ' ')) : {name:undefined};
|
||||||
if (competence) {
|
if (competence) {
|
||||||
for (let actor of actors) {
|
for (let actor of actors) {
|
||||||
await actor.rollCaracCompetence(caracName, competence.name, diff);
|
await actor.rollCaracCompetence(caracName, competence.name, diff);
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
import { Misc } from "./misc.js";
|
|
||||||
|
|
||||||
export class RdDHotbar {
|
export class RdDHotbar {
|
||||||
|
|
||||||
|
|||||||
@@ -1,13 +1,3 @@
|
|||||||
/**
|
|
||||||
* RdD system
|
|
||||||
* Author: LeRatierBretonnien
|
|
||||||
* Software License: GNU GPLv3
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
|
||||||
// Import Modules
|
|
||||||
import { SYSTEM_RDD, SYSTEM_SOCKET_ID } from "./constants.js";
|
import { SYSTEM_RDD, SYSTEM_SOCKET_ID } from "./constants.js";
|
||||||
import { RdDActor } from "./actor.js";
|
import { RdDActor } from "./actor.js";
|
||||||
import { RdDItemSheet } from "./item-sheet.js";
|
import { RdDItemSheet } from "./item-sheet.js";
|
||||||
@@ -44,302 +34,281 @@ import { Environnement } from "./environnement.js";
|
|||||||
import { RdDIngredientItemSheet } from "./item-ingredient-sheet.js";
|
import { RdDIngredientItemSheet } from "./item-ingredient-sheet.js";
|
||||||
import { RdDFauneItemSheet } from "./item-faune-sheet.js";
|
import { RdDFauneItemSheet } from "./item-faune-sheet.js";
|
||||||
import { RdDConteneurItemSheet } from "./item-conteneur-sheet.js";
|
import { RdDConteneurItemSheet } from "./item-conteneur-sheet.js";
|
||||||
|
import { RdDServiceItemSheet } from "./item-service-sheet.js";
|
||||||
|
import { RdDItemService } from "./item-service.js";
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/**
|
||||||
/* Foundry VTT Initialization */
|
* RdD system
|
||||||
/* -------------------------------------------- */
|
* Author: LeRatierBretonnien
|
||||||
|
* Software License: GNU GPLv3
|
||||||
|
*/
|
||||||
|
export class SystemReveDeDragon {
|
||||||
|
|
||||||
|
static start() {
|
||||||
|
const system = new SystemReveDeDragon();
|
||||||
/************************************************************************************/
|
Hooks.once('init', async () => await system.onInit());
|
||||||
Hooks.once("init", async function () {
|
Hooks.once('diceSoNiceReady', (dice3d) => RdDDice.diceSoNiceReady(dice3d));
|
||||||
console.log(`Initializing Reve de Dragon System`);
|
|
||||||
|
|
||||||
// preload handlebars templates
|
|
||||||
RdDUtility.preloadHandlebarsTemplates();
|
|
||||||
// Create useful storage space
|
|
||||||
game.system.rdd = {
|
|
||||||
TMRUtility,
|
|
||||||
RdDUtility,
|
|
||||||
RdDHotbar,
|
|
||||||
RdDPossession,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
constructor() {
|
||||||
game.settings.register(SYSTEM_RDD, "accorder-entite-cauchemar", {
|
this.RdDUtility = RdDUtility;
|
||||||
name: "Accorder le rêve aux entités",
|
this.RdDHotbar = RdDHotbar;
|
||||||
hint: "A quel moment les personnages doivent accorder leur rêve aux entités de cauchemar",
|
this.itemClasses = {
|
||||||
scope: "world",
|
service: RdDItemService
|
||||||
config: true,
|
}
|
||||||
type: String,
|
this.actorClasses = {
|
||||||
choices: { // If choices are defined, the resulting setting will be a select menu
|
|
||||||
"avant-attaque": "Avant l'attaque",
|
|
||||||
"avant-defense": "Avant la défense",
|
|
||||||
"avant-encaissement": "Avant l'encaissement",
|
|
||||||
},
|
|
||||||
default: "avant-encaissement"
|
|
||||||
});
|
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
|
||||||
game.settings.register(SYSTEM_RDD, "calendrier", {
|
|
||||||
name: "calendrier",
|
|
||||||
scope: "world",
|
|
||||||
config: false,
|
|
||||||
default: RdDCalendrier.createCalendrierInitial(),
|
|
||||||
type: Object
|
|
||||||
});
|
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
|
||||||
game.settings.register(SYSTEM_RDD, "migration-png-webp-1.5.34", {
|
|
||||||
name: "calendrier",
|
|
||||||
scope: "world",
|
|
||||||
config: false,
|
|
||||||
default: false,
|
|
||||||
type: Boolean
|
|
||||||
});
|
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
|
||||||
game.settings.register(SYSTEM_RDD, "liste-nombre-astral", {
|
|
||||||
name: "liste-nombre-astral",
|
|
||||||
scope: "world",
|
|
||||||
config: false,
|
|
||||||
default: [],
|
|
||||||
type: Object
|
|
||||||
});
|
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
|
||||||
game.settings.register(SYSTEM_RDD, "calendrier-pos", {
|
|
||||||
name: "calendrierPos",
|
|
||||||
scope: "client",
|
|
||||||
config: false,
|
|
||||||
default: RdDCalendrier.createCalendrierPos(),
|
|
||||||
type: Object
|
|
||||||
});
|
|
||||||
|
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
|
||||||
game.settings.register(SYSTEM_RDD, "supprimer-dialogues-combat-chat", {
|
|
||||||
name: "Supprimer les dialogues de combat",
|
|
||||||
hint: "Si désactivée, tous les dialogues de combat sont conservés dans la conversation",
|
|
||||||
scope: "world",
|
|
||||||
config: true,
|
|
||||||
default: true,
|
|
||||||
type: Boolean
|
|
||||||
});
|
|
||||||
/* -------------------------------------------- */
|
|
||||||
game.settings.register(SYSTEM_RDD, "activer-sons-audio", {
|
|
||||||
name: "Activer les bruitages intégrés",
|
|
||||||
hint: "Si activé, certaines actions en jeu déclenchent un son d'ambiance",
|
|
||||||
scope: "world",
|
|
||||||
config: true,
|
|
||||||
default: true,
|
|
||||||
type: Boolean
|
|
||||||
});
|
|
||||||
/* -------------------------------------------- */
|
|
||||||
game.settings.register(SYSTEM_RDD, "appliquer-famine-soif", {
|
|
||||||
name: "Notifier de la famine et la soif pour",
|
|
||||||
hint: "Indique si les cas de famine et de soif seront indiqués durant Château Dormant",
|
|
||||||
scope: "world",
|
|
||||||
config: true,
|
|
||||||
type: String,
|
|
||||||
choices: {
|
|
||||||
"aucun": "ni la famine, ni la soif",
|
|
||||||
"famine": "seulement la famine",
|
|
||||||
"famine-soif": "la famine et la soif",
|
|
||||||
},
|
|
||||||
default: "aucun"
|
|
||||||
});
|
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
|
||||||
// Set an initiative formula for the system
|
|
||||||
CONFIG.Combat.initiative = {
|
|
||||||
formula: "1+(1d6/10)",
|
|
||||||
decimals: 2
|
|
||||||
};
|
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
|
||||||
game.socket.on(SYSTEM_SOCKET_ID, async (sockmsg) => {
|
|
||||||
console.log(">>>>> MSG RECV", sockmsg);
|
|
||||||
try {
|
|
||||||
RdDUtility.onSocketMessage(sockmsg);
|
|
||||||
RdDCombat.onSocketMessage(sockmsg);
|
|
||||||
ChatUtility.onSocketMessage(sockmsg);
|
|
||||||
RdDActor.onSocketMessage(sockmsg);
|
|
||||||
} catch (e) {
|
|
||||||
console.error('game.socket.on(SYSTEM_SOCKET_ID) Exception: ', sockmsg, ' => ', e)
|
|
||||||
}
|
}
|
||||||
});
|
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
|
||||||
// Define custom Entity classes
|
|
||||||
CONFIG.Actor.documentClass = RdDActor;
|
|
||||||
CONFIG.Item.documentClass = RdDItem;
|
|
||||||
CONFIG.RDD = {
|
|
||||||
resolutionTable: RdDResolutionTable.resolutionTable,
|
|
||||||
carac_array: RdDUtility.getCaracArray(),
|
|
||||||
ajustementsConditions: RdDUtility.getAjustementsConditions(),
|
|
||||||
difficultesLibres: RdDUtility.getDifficultesLibres()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
// Register sheet application classes
|
/* Foundry VTT Initialization */
|
||||||
Actors.unregisterSheet("core", ActorSheet);
|
/* -------------------------------------------- */
|
||||||
Actors.registerSheet(SYSTEM_RDD, RdDActorSheet, { types: ["personnage"], makeDefault: true });
|
async onInit() {
|
||||||
Actors.registerSheet(SYSTEM_RDD, RdDActorCreatureSheet, { types: ["creature"], makeDefault: true });
|
game.system.rdd = this;
|
||||||
Actors.registerSheet(SYSTEM_RDD, RdDActorVehiculeSheet, { types: ["vehicule"], makeDefault: true });
|
|
||||||
Actors.registerSheet(SYSTEM_RDD, RdDActorEntiteSheet, { types: ["entite"], makeDefault: true });
|
|
||||||
Items.unregisterSheet("core", ItemSheet);
|
|
||||||
|
|
||||||
RdDItemSheet.register(RdDSigneDraconiqueItemSheet);
|
console.log(`Initializing Reve de Dragon System`);
|
||||||
RdDItemSheet.register(RdDRencontreItemSheet);
|
|
||||||
RdDItemSheet.register(RdDConteneurItemSheet);
|
|
||||||
RdDItemSheet.register(RdDHerbeItemSheet);
|
|
||||||
RdDItemSheet.register(RdDFauneItemSheet);
|
|
||||||
RdDItemSheet.register(RdDIngredientItemSheet);
|
|
||||||
|
|
||||||
Items.registerSheet(SYSTEM_RDD, RdDItemSheet, {
|
// preload handlebars templates
|
||||||
types: [
|
RdDUtility.preloadHandlebarsTemplates();
|
||||||
"competence", "competencecreature",
|
|
||||||
"recettealchimique", "musique", "chant", "danse", "jeu", "recettecuisine", "oeuvre",
|
|
||||||
"objet", "arme", "armure", "livre", "potion", "munition",
|
|
||||||
"monnaie", "nourritureboisson", "gemme",
|
|
||||||
"meditation", "queue", "ombre", "souffle", "tete", "casetmr", "sort", "sortreserve",
|
|
||||||
"nombreastral", "tache", "maladie", "poison", "possession",
|
|
||||||
"tarot", "extraitpoetique"
|
|
||||||
], makeDefault: true
|
|
||||||
});
|
|
||||||
CONFIG.Combat.documentClass = RdDCombatManager;
|
|
||||||
|
|
||||||
// préparation des différents modules
|
/* -------------------------------------------- */
|
||||||
SystemCompendiums.init();
|
game.settings.register(SYSTEM_RDD, "accorder-entite-cauchemar", {
|
||||||
DialogChronologie.init();
|
name: "Accorder le rêve aux entités",
|
||||||
ReglesOptionelles.init();
|
hint: "A quel moment les personnages doivent accorder leur rêve aux entités de cauchemar",
|
||||||
RdDUtility.init();
|
scope: "world",
|
||||||
RdDDice.init();
|
config: true,
|
||||||
RdDCommands.init();
|
type: String,
|
||||||
RdDCombat.init();
|
choices: { // If choices are defined, the resulting setting will be a select menu
|
||||||
RdDCombatManager.init();
|
"avant-attaque": "Avant l'attaque",
|
||||||
RdDTokenHud.init();
|
"avant-defense": "Avant la défense",
|
||||||
RdDActor.init();
|
"avant-encaissement": "Avant l'encaissement",
|
||||||
RddCompendiumOrganiser.init();
|
},
|
||||||
EffetsDraconiques.init()
|
default: "avant-encaissement"
|
||||||
TMRUtility.init();
|
});
|
||||||
RdDHotbar.initDropbar();
|
|
||||||
RdDPossession.init();
|
|
||||||
TMRRencontres.init();
|
|
||||||
Environnement.init();
|
|
||||||
});
|
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
function messageDeBienvenue() {
|
game.settings.register(SYSTEM_RDD, "calendrier", {
|
||||||
if (game.user.isGM) {
|
name: "calendrier",
|
||||||
ChatUtility.removeChatMessageContaining('<div id="message-bienvenue-rdd">');
|
scope: "world",
|
||||||
ChatMessage.create({
|
config: false,
|
||||||
user: game.user.id,
|
default: RdDCalendrier.createCalendrierInitial(),
|
||||||
content: `<div id="message-bienvenue-rdd"><span class="rdd-roll-part">Bienvenue dans le Rêve des Dragons !</span>
|
type: Object
|
||||||
|
});
|
||||||
|
|
||||||
|
/* -------------------------------------------- */
|
||||||
|
game.settings.register(SYSTEM_RDD, "liste-nombre-astral", {
|
||||||
|
name: "liste-nombre-astral",
|
||||||
|
scope: "world",
|
||||||
|
config: false,
|
||||||
|
default: [],
|
||||||
|
type: Object
|
||||||
|
});
|
||||||
|
|
||||||
|
/* -------------------------------------------- */
|
||||||
|
game.settings.register(SYSTEM_RDD, "calendrier-pos", {
|
||||||
|
name: "calendrierPos",
|
||||||
|
scope: "client",
|
||||||
|
config: false,
|
||||||
|
default: RdDCalendrier.createCalendrierPos(),
|
||||||
|
type: Object
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
/* -------------------------------------------- */
|
||||||
|
game.settings.register(SYSTEM_RDD, "supprimer-dialogues-combat-chat", {
|
||||||
|
name: "Supprimer les dialogues de combat",
|
||||||
|
hint: "Si désactivée, tous les dialogues de combat sont conservés dans la conversation",
|
||||||
|
scope: "world",
|
||||||
|
config: true,
|
||||||
|
default: true,
|
||||||
|
type: Boolean
|
||||||
|
});
|
||||||
|
/* -------------------------------------------- */
|
||||||
|
game.settings.register(SYSTEM_RDD, "activer-sons-audio", {
|
||||||
|
name: "Activer les bruitages intégrés",
|
||||||
|
hint: "Si activé, certaines actions en jeu déclenchent un son d'ambiance",
|
||||||
|
scope: "world",
|
||||||
|
config: true,
|
||||||
|
default: true,
|
||||||
|
type: Boolean
|
||||||
|
});
|
||||||
|
/* -------------------------------------------- */
|
||||||
|
game.settings.register(SYSTEM_RDD, "appliquer-famine-soif", {
|
||||||
|
name: "Notifier de la famine et la soif pour",
|
||||||
|
hint: "Indique si les cas de famine et de soif seront indiqués durant Château Dormant",
|
||||||
|
scope: "world",
|
||||||
|
config: true,
|
||||||
|
type: String,
|
||||||
|
choices: {
|
||||||
|
"aucun": "ni la famine, ni la soif",
|
||||||
|
"famine": "seulement la famine",
|
||||||
|
"famine-soif": "la famine et la soif",
|
||||||
|
},
|
||||||
|
default: "aucun"
|
||||||
|
});
|
||||||
|
|
||||||
|
/* -------------------------------------------- */
|
||||||
|
// Set an initiative formula for the system
|
||||||
|
CONFIG.Combat.initiative = {
|
||||||
|
formula: "1+(1d6/10)",
|
||||||
|
decimals: 2
|
||||||
|
};
|
||||||
|
|
||||||
|
/* -------------------------------------------- */
|
||||||
|
game.socket.on(SYSTEM_SOCKET_ID, async (sockmsg) => {
|
||||||
|
console.log(">>>>> MSG RECV", sockmsg);
|
||||||
|
try {
|
||||||
|
RdDUtility.onSocketMessage(sockmsg);
|
||||||
|
RdDCombat.onSocketMessage(sockmsg);
|
||||||
|
ChatUtility.onSocketMessage(sockmsg);
|
||||||
|
RdDActor.onSocketMessage(sockmsg);
|
||||||
|
} catch (e) {
|
||||||
|
console.error('game.socket.on(SYSTEM_SOCKET_ID) Exception: ', sockmsg, ' => ', e)
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
/* -------------------------------------------- */
|
||||||
|
// Define custom Entity classes
|
||||||
|
CONFIG.Actor.documentClass = RdDActor;
|
||||||
|
CONFIG.Item.documentClass = RdDItem;
|
||||||
|
CONFIG.RDD = {
|
||||||
|
resolutionTable: RdDResolutionTable.resolutionTable,
|
||||||
|
carac_array: RdDUtility.getCaracArray(),
|
||||||
|
ajustementsConditions: RdDUtility.getAjustementsConditions(),
|
||||||
|
difficultesLibres: RdDUtility.getDifficultesLibres()
|
||||||
|
}
|
||||||
|
|
||||||
|
/* -------------------------------------------- */
|
||||||
|
// Register sheet application classes
|
||||||
|
Actors.unregisterSheet("core", ActorSheet);
|
||||||
|
Actors.registerSheet(SYSTEM_RDD, RdDActorSheet, { types: ["personnage"], makeDefault: true });
|
||||||
|
Actors.registerSheet(SYSTEM_RDD, RdDActorCreatureSheet, { types: ["creature"], makeDefault: true });
|
||||||
|
Actors.registerSheet(SYSTEM_RDD, RdDActorVehiculeSheet, { types: ["vehicule"], makeDefault: true });
|
||||||
|
Actors.registerSheet(SYSTEM_RDD, RdDActorEntiteSheet, { types: ["entite"], makeDefault: true });
|
||||||
|
Items.unregisterSheet("core", ItemSheet);
|
||||||
|
|
||||||
|
RdDItemSheet.register(RdDSigneDraconiqueItemSheet);
|
||||||
|
RdDItemSheet.register(RdDRencontreItemSheet);
|
||||||
|
RdDItemSheet.register(RdDConteneurItemSheet);
|
||||||
|
RdDItemSheet.register(RdDHerbeItemSheet);
|
||||||
|
RdDItemSheet.register(RdDFauneItemSheet);
|
||||||
|
RdDItemSheet.register(RdDIngredientItemSheet);
|
||||||
|
RdDItemSheet.register(RdDServiceItemSheet);
|
||||||
|
|
||||||
|
Items.registerSheet(SYSTEM_RDD, RdDItemSheet, {
|
||||||
|
types: [
|
||||||
|
"competence", "competencecreature",
|
||||||
|
"recettealchimique", "musique", "chant", "danse", "jeu", "recettecuisine", "oeuvre",
|
||||||
|
"objet", "arme", "armure", "livre", "potion", "munition",
|
||||||
|
"monnaie", "nourritureboisson", "gemme",
|
||||||
|
"meditation", "queue", "ombre", "souffle", "tete", "casetmr", "sort", "sortreserve",
|
||||||
|
"nombreastral", "tache", "maladie", "poison", "possession",
|
||||||
|
"tarot", "extraitpoetique"
|
||||||
|
], makeDefault: true
|
||||||
|
});
|
||||||
|
CONFIG.Combat.documentClass = RdDCombatManager;
|
||||||
|
|
||||||
|
// préparation des différents modules
|
||||||
|
SystemCompendiums.init();
|
||||||
|
DialogChronologie.init();
|
||||||
|
ReglesOptionelles.init();
|
||||||
|
RdDUtility.init();
|
||||||
|
RdDDice.init();
|
||||||
|
RdDCommands.init();
|
||||||
|
RdDCombat.init();
|
||||||
|
RdDCombatManager.init();
|
||||||
|
RdDTokenHud.init();
|
||||||
|
RdDActor.init();
|
||||||
|
RddCompendiumOrganiser.init();
|
||||||
|
EffetsDraconiques.init()
|
||||||
|
TMRUtility.init();
|
||||||
|
RdDHotbar.initDropbar();
|
||||||
|
RdDPossession.init();
|
||||||
|
TMRRencontres.init();
|
||||||
|
Environnement.init();
|
||||||
|
|
||||||
|
Hooks.once('ready', () => this.onReady());
|
||||||
|
}
|
||||||
|
|
||||||
|
async onReady() {
|
||||||
|
|
||||||
|
/* -------------------------------------------- */
|
||||||
|
/* Foundry VTT Initialization */
|
||||||
|
/* -------------------------------------------- */
|
||||||
|
// CSS patch for v9
|
||||||
|
if (game.version) {
|
||||||
|
let sidebar = document.getElementById("sidebar");
|
||||||
|
sidebar.style.width = "min-content";
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Misc.isUniqueConnectedGM()) {
|
||||||
|
new Migrations().migrate();
|
||||||
|
}
|
||||||
|
|
||||||
|
StatusEffects.onReady();
|
||||||
|
RdDHerbes.initializeHerbes();
|
||||||
|
RdDDice.onReady();
|
||||||
|
/* -------------------------------------------- */
|
||||||
|
/* Affiche/Init le calendrier */
|
||||||
|
let calendrier = new RdDCalendrier();
|
||||||
|
let templatePath = "systems/foundryvtt-reve-de-dragon/templates/calendar-template.html";
|
||||||
|
let templateData = {};
|
||||||
|
renderTemplate(templatePath, templateData).then(html => {
|
||||||
|
calendrier.render(true);
|
||||||
|
});
|
||||||
|
game.system.rdd.calendrier = calendrier; // Reference;
|
||||||
|
|
||||||
|
// Avertissement si joueur sans personnage
|
||||||
|
if (!game.user.isGM && game.user.character == undefined) {
|
||||||
|
ui.notifications.info("Attention ! Vous n'êtes connecté à aucun personnage !");
|
||||||
|
ChatMessage.create({
|
||||||
|
content: "<b>ATTENTION</b> Le joueur " + game.user.name + " n'est connecté à aucun personnage !",
|
||||||
|
user: game.user.id
|
||||||
|
});
|
||||||
|
}
|
||||||
|
if (Misc.isUniqueConnectedGM()) {
|
||||||
|
this.messageDeBienvenue();
|
||||||
|
this.registerUsageCount(SYSTEM_RDD);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* -------------------------------------------- */
|
||||||
|
messageDeBienvenue() {
|
||||||
|
if (game.user.isGM) {
|
||||||
|
ChatUtility.removeChatMessageContaining('<div id="message-bienvenue-rdd">');
|
||||||
|
ChatMessage.create({
|
||||||
|
user: game.user.id,
|
||||||
|
content: `<div id="message-bienvenue-rdd"><span class="rdd-roll-part">Bienvenue dans le Rêve des Dragons !</span>
|
||||||
<br>Vous trouverez quelques informations pour démarrer dans ce document : @Compendium[foundryvtt-reve-de-dragon.rappel-des-regles.7uGrUHGdPu0EmIu2]{Documentation MJ/Joueurs}
|
<br>Vous trouverez quelques informations pour démarrer dans ce document : @Compendium[foundryvtt-reve-de-dragon.rappel-des-regles.7uGrUHGdPu0EmIu2]{Documentation MJ/Joueurs}
|
||||||
<br>La commande <code>/aide</code> dans le chat permet de voir les commandes spécifiques à Rêve de Dragon.</div>
|
<br>La commande <code>/aide</code> dans le chat permet de voir les commandes spécifiques à Rêve de Dragon.</div>
|
||||||
` });
|
` });
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
|
||||||
// Register world usage statistics
|
|
||||||
function registerUsageCount(registerKey) {
|
|
||||||
if (game.user.isGM) {
|
|
||||||
game.settings.register("world", "world-key", {
|
|
||||||
name: "Unique world key",
|
|
||||||
scope: "world",
|
|
||||||
config: false,
|
|
||||||
default: "NONE",
|
|
||||||
type: String
|
|
||||||
});
|
|
||||||
|
|
||||||
let worldKey = game.settings.get("world", "world-key")
|
|
||||||
if (worldKey == undefined || worldKey == "") {
|
|
||||||
worldKey = randomID(32)
|
|
||||||
game.settings.set("world", "world-key", worldKey)
|
|
||||||
}
|
}
|
||||||
let regURL = `https://www.uberwald.me/fvtt_appcount/count.php?name="${registerKey}"&worldKey="${worldKey}"&version="${game.release.generation}.${game.release.build}"&system="${game.system.id}"&systemversion="${game.system.version}"`
|
|
||||||
$.ajax(regURL)
|
|
||||||
/* -------------------------------------------- */
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
|
||||||
/* Foundry VTT Initialization */
|
|
||||||
/* -------------------------------------------- */
|
|
||||||
Hooks.once("ready", async function () {
|
|
||||||
await migrationPngWebp_1_5_34()
|
|
||||||
if (Misc.isUniqueConnectedGM()) {
|
|
||||||
new Migrations().migrate();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
StatusEffects.onReady();
|
|
||||||
RdDHerbes.initializeHerbes();
|
|
||||||
RdDDice.onReady();
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
/* Affiche/Init le calendrier */
|
// Register world usage statistics
|
||||||
let calendrier = new RdDCalendrier();
|
async registerUsageCount(registerKey) {
|
||||||
let templatePath = "systems/foundryvtt-reve-de-dragon/templates/calendar-template.html";
|
if (game.user.isGM) {
|
||||||
let templateData = {};
|
game.settings.register("world", "world-key", {
|
||||||
renderTemplate(templatePath, templateData).then(html => {
|
name: "Unique world key",
|
||||||
calendrier.render(true);
|
scope: "world",
|
||||||
});
|
config: false,
|
||||||
game.system.rdd.calendrier = calendrier; // Reference;
|
default: "NONE",
|
||||||
|
type: String
|
||||||
|
});
|
||||||
|
|
||||||
// Avertissement si joueur sans personnage
|
let worldKey = game.settings.get("world", "world-key")
|
||||||
if (!game.user.isGM && game.user.character == undefined) {
|
if (worldKey == undefined || worldKey == "") {
|
||||||
ui.notifications.info("Attention ! Vous n'êtes connecté à aucun personnage !");
|
worldKey = randomID(32)
|
||||||
ChatMessage.create({
|
game.settings.set("world", "world-key", worldKey)
|
||||||
content: "<b>ATTENTION</b> Le joueur " + game.user.name + " n'est connecté à aucun personnage !",
|
|
||||||
user: game.user.id
|
|
||||||
});
|
|
||||||
}
|
|
||||||
if (Misc.isUniqueConnectedGM()) {
|
|
||||||
messageDeBienvenue();
|
|
||||||
registerUsageCount(SYSTEM_RDD);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
async function migrationPngWebp_1_5_34() {
|
|
||||||
if (!game.settings.get(SYSTEM_RDD, "migration-png-webp-1.5.34")) {
|
|
||||||
const regexOldPngJpg = /(systems\/foundryvtt-reve-de-dragon\/icons\/.*)\.(png|jpg)/;
|
|
||||||
const replaceWithWebp = '$1.webp';
|
|
||||||
function convertImgToWebp(img) {
|
|
||||||
return img.replace(regexOldPngJpg, replaceWithWebp);
|
|
||||||
}
|
|
||||||
function prepareDocumentsImgUpdate(documents) {
|
|
||||||
return documents.filter(it => it.img && it.img.match(regexOldPngJpg))
|
|
||||||
.map(it => {
|
|
||||||
return { _id: it.id, img: convertImgToWebp(it.img) }
|
|
||||||
});
|
|
||||||
}
|
|
||||||
const itemsUpdates = prepareDocumentsImgUpdate(game.items);
|
|
||||||
const actorsUpdates = prepareDocumentsImgUpdate(game.actors);
|
|
||||||
//Migrate system png to webp
|
|
||||||
await Item.updateDocuments(itemsUpdates);
|
|
||||||
await Actor.updateDocuments(actorsUpdates);
|
|
||||||
game.actors.forEach(actor => {
|
|
||||||
if (actor.token?.img && actor.token.img.match(regexOldPngJpg)) {
|
|
||||||
actor.update({ "token.img": convertImgToWebp(actor.token.img) });
|
|
||||||
}
|
}
|
||||||
const actorItemsToUpdate = prepareDocumentsImgUpdate(actor.items);
|
let regURL = `https://www.uberwald.me/fvtt_appcount/count.php?name="${registerKey}"&worldKey="${worldKey}"&version="${game.release.generation}.${game.release.build}"&system="${game.system.id}"&systemversion="${game.system.version}"`
|
||||||
actor.updateEmbeddedDocuments('Item', actorItemsToUpdate);
|
$.ajax(regURL)
|
||||||
});
|
/* -------------------------------------------- */
|
||||||
game.settings.set(SYSTEM_RDD, "migration-png-webp-1.5.34", true)
|
}
|
||||||
}
|
|
||||||
|
|
||||||
// CSS patch for v9
|
|
||||||
if (game.version) {
|
|
||||||
let sidebar = document.getElementById("sidebar");
|
|
||||||
sidebar.style.width = "min-content";
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
SystemReveDeDragon.start();
|
||||||
/* Dice-so-nice ready */
|
|
||||||
/* -------------------------------------------- */
|
|
||||||
Hooks.once('diceSoNiceReady', (dice3d) => RdDDice.diceSoNiceReady(dice3d));
|
|
||||||
|
|
||||||
|
|||||||
@@ -95,8 +95,9 @@ export class RdDRollTables {
|
|||||||
const row = await table.getRandom(itemFrequence, filter);
|
const row = await table.getRandom(itemFrequence, filter);
|
||||||
if (row) {
|
if (row) {
|
||||||
await CompendiumTableHelpers.tableRowToChatMessage(row, type);
|
await CompendiumTableHelpers.tableRowToChatMessage(row, type);
|
||||||
|
return row.document;
|
||||||
}
|
}
|
||||||
return row;
|
return undefined;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
|
|||||||
@@ -405,6 +405,8 @@ export class RdDTMRDialog extends Dialog {
|
|||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
async _tentativeMaitrise(rencData) {
|
async _tentativeMaitrise(rencData) {
|
||||||
|
this.rencontreState = 'normal';
|
||||||
|
|
||||||
rencData.reve = this.actor.getReveActuel();
|
rencData.reve = this.actor.getReveActuel();
|
||||||
rencData.etat = this.actor.getEtatGeneral();
|
rencData.etat = this.actor.getEtatGeneral();
|
||||||
|
|
||||||
@@ -450,7 +452,6 @@ export class RdDTMRDialog extends Dialog {
|
|||||||
this._tentativeMaitrise(rencData);
|
this._tentativeMaitrise(rencData);
|
||||||
this._deleteTmrMessages(rencData.actor, rencData.nbRounds);
|
this._deleteTmrMessages(rencData.actor, rencData.nbRounds);
|
||||||
}, 2000);
|
}, 2000);
|
||||||
this.rencontreState == 'normal';
|
|
||||||
}
|
}
|
||||||
|
|
||||||
formatMessageRencontre(rencData, template) {
|
formatMessageRencontre(rencData, template) {
|
||||||
@@ -460,14 +461,14 @@ export class RdDTMRDialog extends Dialog {
|
|||||||
messageDuree = ` Au total, vous avez passé ${rencData.nbRounds} rounds à vous battre!`;
|
messageDuree = ` Au total, vous avez passé ${rencData.nbRounds} rounds à vous battre!`;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
messageDuree = ` Vous avez passé ${rencData.nbRounds} rounds à lutter!`;
|
messageDuree = ` Vous avez passé ${rencData.nbRounds} rounds à lutter!`;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
const compiled = Handlebars.compile(template);
|
const compiled = Handlebars.compile(template);
|
||||||
return compiled(rencData) + messageDuree ;
|
return compiled(rencData) + messageDuree;
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
return template + messageDuree ;
|
return template + messageDuree;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -520,7 +521,7 @@ export class RdDTMRDialog extends Dialog {
|
|||||||
}
|
}
|
||||||
this.currentRencontre = await this._jetDeRencontre(tmr);
|
this.currentRencontre = await this._jetDeRencontre(tmr);
|
||||||
if (this.currentRencontre) {
|
if (this.currentRencontre) {
|
||||||
if (this.rencontresExistantes.find(it => it.id == this.currentRencontre.id)){
|
if (this.rencontresExistantes.find(it => it.id == this.currentRencontre.id)) {
|
||||||
// rencontre en attente suite à dérobade
|
// rencontre en attente suite à dérobade
|
||||||
await this.maitriserRencontre();
|
await this.maitriserRencontre();
|
||||||
}
|
}
|
||||||
@@ -550,7 +551,7 @@ export class RdDTMRDialog extends Dialog {
|
|||||||
this.currentRencontre = present.clone({
|
this.currentRencontre = present.clone({
|
||||||
'system.force': await RdDDice.rollTotal(present.system.formule),
|
'system.force': await RdDDice.rollTotal(present.system.formule),
|
||||||
'system.coord': tmr.coord
|
'system.coord': tmr.coord
|
||||||
}, {save: false});
|
}, { save: false });
|
||||||
|
|
||||||
await EffetsDraconiques.presentCites.ouvrirLePresent(this.actor, presentCite);
|
await EffetsDraconiques.presentCites.ouvrirLePresent(this.actor, presentCite);
|
||||||
this.removeToken(tmr, presentCite);
|
this.removeToken(tmr, presentCite);
|
||||||
|
|||||||
@@ -126,6 +126,7 @@ export class RdDUtility {
|
|||||||
'systems/foundryvtt-reve-de-dragon/templates/actor/header-compteurs-creature.html',
|
'systems/foundryvtt-reve-de-dragon/templates/actor/header-compteurs-creature.html',
|
||||||
'systems/foundryvtt-reve-de-dragon/templates/actor/header-compteurs-entitee.html',
|
'systems/foundryvtt-reve-de-dragon/templates/actor/header-compteurs-entitee.html',
|
||||||
'systems/foundryvtt-reve-de-dragon/templates/actor/header-effects.html',
|
'systems/foundryvtt-reve-de-dragon/templates/actor/header-effects.html',
|
||||||
|
'systems/foundryvtt-reve-de-dragon/templates/actor/header-hautreve.html',
|
||||||
'systems/foundryvtt-reve-de-dragon/templates/actor/vue-detaillee.html',
|
'systems/foundryvtt-reve-de-dragon/templates/actor/vue-detaillee.html',
|
||||||
'systems/foundryvtt-reve-de-dragon/templates/actor/carac-main.html',
|
'systems/foundryvtt-reve-de-dragon/templates/actor/carac-main.html',
|
||||||
'systems/foundryvtt-reve-de-dragon/templates/actor/carac-derivee.html',
|
'systems/foundryvtt-reve-de-dragon/templates/actor/carac-derivee.html',
|
||||||
@@ -202,6 +203,7 @@ export class RdDUtility {
|
|||||||
'systems/foundryvtt-reve-de-dragon/templates/item-signedraconique-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-possession-sheet.html',
|
||||||
'systems/foundryvtt-reve-de-dragon/templates/item-extraitpoetique-sheet.html',
|
'systems/foundryvtt-reve-de-dragon/templates/item-extraitpoetique-sheet.html',
|
||||||
|
'systems/foundryvtt-reve-de-dragon/templates/item-service-sheet.html',
|
||||||
// partial enums
|
// partial enums
|
||||||
'systems/foundryvtt-reve-de-dragon/templates/enum-caracteristiques.html',
|
'systems/foundryvtt-reve-de-dragon/templates/enum-caracteristiques.html',
|
||||||
'systems/foundryvtt-reve-de-dragon/templates/enum-base-competence.html',
|
'systems/foundryvtt-reve-de-dragon/templates/enum-base-competence.html',
|
||||||
@@ -430,6 +432,7 @@ export class RdDUtility {
|
|||||||
formData.oeuvres = this.arrayOrEmpty(itemTypes['oeuvre']);
|
formData.oeuvres = this.arrayOrEmpty(itemTypes['oeuvre']);
|
||||||
formData.jeux = this.arrayOrEmpty(itemTypes['jeu']);
|
formData.jeux = this.arrayOrEmpty(itemTypes['jeu']);
|
||||||
|
|
||||||
|
formData.services = this.arrayOrEmpty(itemTypes['service']);
|
||||||
formData.recettescuisine = this.arrayOrEmpty(itemTypes['recettecuisine']);
|
formData.recettescuisine = this.arrayOrEmpty(itemTypes['recettecuisine']);
|
||||||
formData.recettesAlchimiques = this.arrayOrEmpty(itemTypes['recettealchimique']);
|
formData.recettesAlchimiques = this.arrayOrEmpty(itemTypes['recettealchimique']);
|
||||||
formData.maladies = this.arrayOrEmpty(itemTypes['maladie']);
|
formData.maladies = this.arrayOrEmpty(itemTypes['maladie']);
|
||||||
@@ -813,7 +816,7 @@ export class RdDUtility {
|
|||||||
|
|
||||||
// gestion bouton tchat Acheter
|
// gestion bouton tchat Acheter
|
||||||
html.on("click", '.button-acheter', event => {
|
html.on("click", '.button-acheter', event => {
|
||||||
const venteData = DialogItemAchat.venteData(event.currentTarget);
|
const venteData = DialogItemAchat.preparerAchat(event.currentTarget);
|
||||||
if (venteData) {
|
if (venteData) {
|
||||||
DialogItemAchat.onAcheter(venteData);
|
DialogItemAchat.onAcheter(venteData);
|
||||||
}
|
}
|
||||||
@@ -829,6 +832,10 @@ export class RdDUtility {
|
|||||||
ChatUtility.removeChatMessageId(RdDUtility.findChatMessageId(event.currentTarget));
|
ChatUtility.removeChatMessageId(RdDUtility.findChatMessageId(event.currentTarget));
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
html.on("click", '.rdd-world-content-link', async event => {
|
||||||
|
const itemId = html.find(event.currentTarget)?.data("id");
|
||||||
|
game.items.get(itemId)?.sheet.render(true)
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
static findChatMessageId(current) {
|
static findChatMessageId(current) {
|
||||||
@@ -946,7 +953,7 @@ export class RdDUtility {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static async confirmerSuppressionItem(sheet, item, htmlToDelete) {
|
static async confirmActorItemDelete(sheet, item, htmlToDelete) {
|
||||||
const itemId = item.id;
|
const itemId = item.id;
|
||||||
const confirmationSuppression = {
|
const confirmationSuppression = {
|
||||||
settingConfirmer: "confirmation-supprimer-" + item.getItemGroup(),
|
settingConfirmer: "confirmation-supprimer-" + item.getItemGroup(),
|
||||||
|
|||||||
@@ -87,6 +87,11 @@ export class SystemCompendiums extends FormApplication {
|
|||||||
return items;
|
return items;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static async loadDocument(document) {
|
||||||
|
const pack = game.packs.get(document.pack);
|
||||||
|
return await pack.getDocument(document.id ?? document._id);
|
||||||
|
}
|
||||||
|
|
||||||
static async getItems(compendium, itemType = undefined) {
|
static async getItems(compendium, itemType = undefined) {
|
||||||
const items = await SystemCompendiums.getPackContent(compendium, 'Item');
|
const items = await SystemCompendiums.getPackContent(compendium, 'Item');
|
||||||
return (itemType ? items.filter(it => it.type == itemType) : items);
|
return (itemType ? items.filter(it => it.type == itemType) : items);
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
11
packs/macros.db
Normal file
11
packs/macros.db
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
{"name":"Jet de moral","type":"script","author":"Hp9ImM4o9YRTSdfu","img":"icons/magic/control/mouth-smile-deception-purple.webp","scope":"global","command":"const selected = game.system.rdd.RdDUtility.getSelectedActor();\nif (!selected) {\n ui.notifications.info('Pas de personnage sélectionné');\n return;\n}\n\nconst dialogMoral = new Dialog({\n title: `Jet de moral`,\n content: `Jet de moral en situation`,\n buttons: {\n malheureuse: { label: `malheureuse`, icon: \"<i class='fa-regular fa-face-frown'></i>\", callback: () => selected.jetDeMoral('malheureuse') },\n neutre: { label: `neutre`, icon: \"<i class='fa-regular fa-face-meh'></i>\", callback: () => selected.jetDeMoral('neutre') },\n heureuse: { label: `heureuse`, icon: \"<i class='fa-regular fa-face-smile'></i>\", callback: () => selected.jetDeMoral('heureuse') }\n },\n});\n\ndialogMoral.render(true)","ownership":{"default":0,"Hp9ImM4o9YRTSdfu":3},"flags":{"core":{"sourceId":"Macro.aJ0QGnXAXT0WiXbk"}},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.3.15","coreVersion":"10.291","createdTime":1671235038906,"modifiedTime":1671236054480,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"},"folder":null,"sort":0,"_id":"2VvH2rmxV33jGjMU"}
|
||||||
|
{"name":"Repos","type":"script","scope":"global","author":"Hp9ImM4o9YRTSdfu","img":"icons/svg/sleep.svg","command":"const selected = game.system.rdd.RdDUtility.getSelectedActor();\nif (selected) {\n selected.repos();\n}\nelse {\n ui.notifications.info('Pas de personnage sélectionné');\n}","ownership":{"default":0,"Hp9ImM4o9YRTSdfu":3},"flags":{"core":{"sourceId":"Macro.XHNbjnGKXaCiCadq"}},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.3.15","coreVersion":"10.291","createdTime":1671220038331,"modifiedTime":1671234271278,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"},"folder":null,"sort":0,"_id":"6LRZ8DOVfqotIEsi"}
|
||||||
|
{"name":"Météo marine","type":"chat","author":"Hp9ImM4o9YRTSdfu","img":"icons/magic/air/wind-weather-sailing-ship.webp","scope":"global","command":"/meteo","flags":{"core":{"sourceId":"Macro.EPhCYk7PFMPlIFhS"}},"ownership":{"default":0,"Hp9ImM4o9YRTSdfu":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.3.15","coreVersion":"10.291","createdTime":1671237060687,"modifiedTime":1671237060687,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"},"folder":null,"sort":0,"_id":"9mYZfKoi4ZYHydxa"}
|
||||||
|
{"name":"Chuchoter aux joueurs","type":"script","author":"Hp9ImM4o9YRTSdfu","img":"icons/svg/deaf.svg","scope":"global","command":"/** \n * Provides a dialog to whisper specific players. If you have tokens selected, it will automatically default to try and whisper those players.\n * @Author: Nelson#3570\n */\n\nlet applyChanges = false;\n\nlet users = game.users.filter(user => user.active);\nlet checkOptions = \"\"\nlet playerTokenIds = users.map(u => u.character?.id).filter(id => id !== undefined);\nlet selectedPlayerIds = canvas.tokens.controlled.map(token => {\n if (playerTokenIds.includes(token.actor.id)) return token.actor.id;\n});\n\n// Build checkbox list for all active players\nusers.forEach(user => {\n let checked = !!user.character && selectedPlayerIds.includes(user.character.id) && 'checked';\n checkOptions+=`\n <br>\n <input type=\"checkbox\" name=\"${user.id}\" id=\"${user.id}\" value=\"${user.name}\" ${checked}>\\n\n <label for=\"${user.id}\">${user.name}</label>\n `\n});\n\nnew Dialog({\n title:\"Whisper\",\n content:`Whisper To: ${checkOptions} <br>\n <label for=\"message\">Message:</label>\n <textarea id=\"message\" name=\"message\" rows=\"4\" cols=\"50\"></textarea><br>`,\n buttons:{\n whisper:{ \n label:\"Whisper\",\n callback: (html) => createMessage(html)\n }\n }\n}).render(true);\n\nfunction createMessage(html) {\n var targets = [];\n // build list of selected players ids for whispers target\n for ( let user of users ) {\n if (html.find('[name=\"'+user.id+'\"]')[0].checked){\n applyChanges=true;\n targets.push(user.id);\n }\n var messageText = html.find('[name=\"message\"]')[0].value\n }\nif(!applyChanges)return;\n ChatMessage.create({\n content: messageText,\n whisper: targets\n });\n}","flags":{"core":{"sourceId":"Compendium.foundry_community_macros.community-macros-misc.QTDeg4HOYCAmr4dK"}},"ownership":{"default":2,"Hp9ImM4o9YRTSdfu":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.3.15","coreVersion":"10.291","createdTime":1671237211578,"modifiedTime":1671237211578,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"},"folder":null,"sort":0,"_id":"ALAVJEEP3iJosOoi"}
|
||||||
|
{"name":"Terres médianes du rêve","type":"script","scope":"global","author":"Hp9ImM4o9YRTSdfu","img":"systems/foundryvtt-reve-de-dragon/styles/img/ui/icon-tmr-normal.svg","command":"const selected = game.system.rdd.RdDUtility.getSelectedActor();\nif (!selected) {\n ui.notifications.info('Pas de personnage sélectionné');\n return;\n}\nif (!selected.isHautRevant()) {\n ui.notifications.info(`Le personnage ${selected.name} n'a pas le don de haut-rêve`);\n return;\n}\n\nconst dialogMoral = new Dialog({\n title: `Monter dans les TMR`,\n content: `Monter dans les TMR`,\n buttons: {\n normale: { label: `normale`, icon: `<img class=\"button-img\" src=\"systems/foundryvtt-reve-de-dragon/styles/img/ui/icon-tmr-normal.svg\" alt=\"Montée dans les Terres Médianes !\"/>`, callback: () => selected.displayTMR(\"normal\") },\n rapide: { label: `rapide`, icon: `<img class=\"button-img\" src=\"systems/foundryvtt-reve-de-dragon/styles/img/ui/icon-tmr-rapide.svg\" alt=\"Montée accélérée dans les Terres Médianes !\"/>`, callback: () => selected.displayTMR(\"rapide\") },\n },\n});\n\ndialogMoral.render(true)","ownership":{"default":0,"Hp9ImM4o9YRTSdfu":3},"flags":{"core":{"sourceId":"Macro.zCAQxg2duk0j3s5r"}},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.3.15","coreVersion":"10.291","createdTime":1669250715114,"modifiedTime":1671236057731,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"},"folder":null,"sort":0,"_id":"ERsBfwsodzH6UX4x"}
|
||||||
|
{"name":"Signe draconique","type":"chat","author":"Hp9ImM4o9YRTSdfu","img":"systems/foundryvtt-reve-de-dragon/icons/tmr/signe_draconique.webp","scope":"global","command":"/signe +","flags":{"core":{"sourceId":"Macro.RmOLbONUNnINcqCO"}},"ownership":{"default":0,"klwAm8zAKxw8YBLf":3,"Hp9ImM4o9YRTSdfu":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.3.15","coreVersion":"10.291","createdTime":1671237375774,"modifiedTime":1671237375774,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"},"folder":null,"sort":0,"_id":"MJByzsEdneZ64P56"}
|
||||||
|
{"name":"Appel à la chance","type":"script","scope":"global","author":"Hp9ImM4o9YRTSdfu","img":"icons/commodities/flowers/clover.webp","command":"const selected = game.system.rdd.RdDUtility.getSelectedActor();\nif (selected) {\n selected.rollAppelChance();\n}\nelse {\n ui.notifications.info('Pas de personnage sélectionné');\n}","ownership":{"default":0,"Hp9ImM4o9YRTSdfu":3},"flags":{"core":{"sourceId":"Macro.XHNbjnGKXaCiCadq"}},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.3.15","coreVersion":"10.291","createdTime":1671220038331,"modifiedTime":1671233849101,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"},"folder":null,"sort":0,"_id":"UzAWljmFq5sY702w"}
|
||||||
|
{"name":"Encaissement","type":"script","scope":"global","author":"Hp9ImM4o9YRTSdfu","img":"icons/svg/bones.svg","command":"const selected = game.system.rdd.RdDUtility.getSelectedActor();\nif (selected) {\n selected.encaisser();\n}\nelse {\n ui.notifications.info('Pas de personnage sélectionné');\n}","ownership":{"default":0,"Hp9ImM4o9YRTSdfu":3},"flags":{"core":{"sourceId":"Macro.XHNbjnGKXaCiCadq"}},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.3.15","coreVersion":"10.291","createdTime":1671220038331,"modifiedTime":1671234017623,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"},"folder":null,"sort":0,"_id":"WD6T8AdRbX2Ylxqe"}
|
||||||
|
{"name":"Jet quelconque","type":"script","scope":"global","author":"Hp9ImM4o9YRTSdfu","img":"icons/sundries/gaming/dice-runed-tan.webp","command":"const selected = game.system.rdd.RdDUtility.getSelectedActor();\nif (selected) {\n selected.roll();\n}\nelse {\n ui.notifications.info('Pas de personnage sélectionné');\n}","ownership":{"default":0,"Hp9ImM4o9YRTSdfu":3},"flags":{"core":{"sourceId":"Macro.XHNbjnGKXaCiCadq"}},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.3.15","coreVersion":"10.291","createdTime":1671220038331,"modifiedTime":1671233500655,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"},"folder":null,"sort":0,"_id":"bnJnbKDHpbqY8Pr9"}
|
||||||
|
{"name":"Jet d'éthylisme","type":"script","scope":"global","author":"Hp9ImM4o9YRTSdfu","img":"icons/consumables/drinks/alcohol-beer-stein-wooden-metal-brown.webp","command":"const selected = game.system.rdd.RdDUtility.getSelectedActor();\nif (selected) {\n selected.jetEthylisme();\n}\nelse {\n ui.notifications.info('Pas de personnage sélectionné');\n}","ownership":{"default":0,"Hp9ImM4o9YRTSdfu":3},"flags":{"core":{"sourceId":"Macro.XHNbjnGKXaCiCadq"}},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.3.15","coreVersion":"10.291","createdTime":1671220038331,"modifiedTime":1671233646086,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"},"folder":null,"sort":0,"_id":"mvub1dRHNFmWjRr7"}
|
||||||
|
{"name":"Tirer le tarot","type":"chat","scope":"global","author":"Hp9ImM4o9YRTSdfu","img":"systems/foundryvtt-reve-de-dragon/icons/tarots/dos-tarot.webp","command":"/tirer tarot","ownership":{"default":0,"Hp9ImM4o9YRTSdfu":3},"flags":{"core":{"sourceId":"Macro.HBZSKR9OHCQbLcTC"}},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.3.15","coreVersion":"10.291","createdTime":1669469547231,"modifiedTime":1671237401618,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"},"folder":null,"sort":0,"_id":"vTfJTFYYiRu8X5LM"}
|
||||||
@@ -1,17 +1,17 @@
|
|||||||
{"name":"Passeur des Rêves","type":"rencontre","img":"systems/foundryvtt-reve-de-dragon/icons/tete_dragon.webp","system":{"genre":"m","formule":"2d4","refoulement":0,"presentCite":true,"mauvaiseRencontre":false,"ordreTri":2,"force":0,"coord":"","date":"","heure":"","succes":{"effets":["passeur"],"message":"Le Passeur des Rêves propose de vous transporter{{#if actor.system.reve.tmrpos.cache}}, mais vous ne savez pas où vous êtes{{else}} à {{rencontre.system.force}} cases de {{tmr.label}}{{/if}}.","poesie":"<p>Comme je descendais des Fleuves impassibles,<br>Je ne me sentis plus guidé par les haleurs :<br>Des Peaux-Rouges criards les avaient pris pour cibles,<br>Les ayant cloués nus aux poteaux de couleurs.</p>","reference":"Le bateau ivre, Arthur Rimbaud"},"echec":{"effets":[],"message":"Le prix que demande le Passeur des Rêves est trop élevé, vous êtes réduit à poursuivre votre chemin par vos propres moyens.","poesie":"<p>Loin des peuples vivants, errantes, condamnées,<br>A travers les déserts courez comme les loups ;<br>Faites votre destin, âmes désordonnées,<br>Et fuyez l'infini que vous portez en vous !</p>","reference":"Femmes damnées (2), Charles Baudelaire"},"frequence":{"cite":25,"sanctuaire":25,"plaines":20,"pont":20,"collines":15,"foret":15,"monts":10,"desert":10,"fleuve":5,"lac":5,"marais":2,"gouffre":2,"necropole":0,"desolation":0,"mauvaise":0},"description":""},"effects":[],"flags":{"core":{"sourceId":"Item.Ffk9pio1qy4Z28Lc"}},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.1.0","coreVersion":"10.288","createdTime":1667846036337,"modifiedTime":1668036933995,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"},"_id":"0IQLIYklxPIGjHT8","folder":null,"sort":0,"ownership":{"default":0,"Hp9ImM4o9YRTSdfu":3}}
|
{"name":"Passeur des Rêves","type":"rencontre","img":"systems/foundryvtt-reve-de-dragon/icons/tete_dragon.webp","system":{"genre":"m","formule":"2d4","refoulement":0,"presentCite":true,"mauvaiseRencontre":false,"ordreTri":2,"force":0,"coord":"","date":"","heure":"","succes":{"effets":["passeur"],"message":"Le Passeur des Rêves propose de vous transporter{{#if actor.system.reve.tmrpos.cache}}, mais vous ne savez pas où vous êtes{{else}} à {{rencontre.system.force}} cases de {{{tmr.label}}}{{/if}}.","poesie":"<p>Comme je descendais des Fleuves impassibles,<br>Je ne me sentis plus guidé par les haleurs :<br>Des Peaux-Rouges criards les avaient pris pour cibles,<br>Les ayant cloués nus aux poteaux de couleurs.</p>","reference":"Le bateau ivre, Arthur Rimbaud"},"echec":{"effets":[],"message":"Le prix que demande le Passeur des Rêves est trop élevé, vous êtes réduit à poursuivre votre chemin par vos propres moyens.","poesie":"<p>Loin des peuples vivants, errantes, condamnées,<br>A travers les déserts courez comme les loups ;<br>Faites votre destin, âmes désordonnées,<br>Et fuyez l'infini que vous portez en vous !</p>","reference":"Femmes damnées (2), Charles Baudelaire"},"frequence":{"cite":25,"sanctuaire":25,"plaines":20,"pont":20,"collines":15,"foret":15,"monts":10,"desert":10,"fleuve":5,"lac":5,"marais":2,"gouffre":2,"necropole":0,"desolation":0,"mauvaise":0},"description":""},"effects":[],"flags":{"core":{"sourceId":"Item.Ffk9pio1qy4Z28Lc"}},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.1.0","coreVersion":"10.288","createdTime":1667846036337,"modifiedTime":1668036933995,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"},"_id":"0IQLIYklxPIGjHT8","folder":null,"sort":0,"ownership":{"default":0,"Hp9ImM4o9YRTSdfu":3}}
|
||||||
{"name":"Messager des Rêves","type":"rencontre","img":"systems/foundryvtt-reve-de-dragon/icons/tete_dragon.webp","system":{"genre":"m","formule":"2d4","refoulement":0,"presentCite":true,"mauvaiseRencontre":false,"ordreTri":1,"force":0,"coord":"","date":"","heure":"","succes":{"effets":["messager"],"message":"Le Messager des rêves propose d'emmener votre message {{#if actor.system.reve.tmrpos.cache}}, mais vous ne savez pas où vous êtes{{else}} à {{rencontre.system.force}} cases de {{tmr.label}}{{/if}}.","poesie":"<p>J'irai là-bas où l'arbre et l'homme, pleins de sève,<br>Se pâment longuement sous l'ardeur des climats ;<br>Fortes tresses, soyez la houle qui m'enlève !</p>","reference":"La chevelure, Charles Baudelaire"},"echec":{"effets":[],"message":"Le Messager des Rêves est pressé et continue son chemin d'une traite sans vous accorder un regard.","poesie":"<p>En réalité, tous les éléments du rêve des Dragons expriment<br>le Draconic : chaque pierre, chaque fleur, chaque goutte d'eau,<br>chaque nuage est porteur d'un message dans la langue des Dragons</p>","reference":"Rêve de Dragon, Denis Gerfaud"},"frequence":{"cite":25,"sanctuaire":25,"plaines":20,"pont":20,"collines":15,"foret":15,"monts":10,"desert":10,"fleuve":5,"lac":5,"marais":2,"gouffre":2,"necropole":0,"desolation":0,"mauvaise":0},"description":""},"effects":[],"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.rencontres.Ffk9pio1qy4Z28Lc"}},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.1.0","coreVersion":"10.288","createdTime":1667846036337,"modifiedTime":1668036933994,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"},"_id":"0MwHtPpFV2lTeCtt","folder":null,"sort":0,"ownership":{"default":0,"Hp9ImM4o9YRTSdfu":3}}
|
{"name":"Messager des Rêves","type":"rencontre","img":"systems/foundryvtt-reve-de-dragon/icons/tete_dragon.webp","system":{"genre":"m","formule":"2d4","refoulement":0,"presentCite":true,"mauvaiseRencontre":false,"ordreTri":1,"force":0,"coord":"","date":"","heure":"","succes":{"effets":["messager"],"message":"Le Messager des rêves propose d'emmener votre message {{#if actor.system.reve.tmrpos.cache}}, mais vous ne savez pas où vous êtes{{else}} à {{rencontre.system.force}} cases de {{{tmr.label}}}{{/if}}.","poesie":"<p>J'irai là-bas où l'arbre et l'homme, pleins de sève,<br>Se pâment longuement sous l'ardeur des climats ;<br>Fortes tresses, soyez la houle qui m'enlève !</p>","reference":"La chevelure, Charles Baudelaire"},"echec":{"effets":[],"message":"Le Messager des Rêves est pressé et continue son chemin d'une traite sans vous accorder un regard.","poesie":"<p>En réalité, tous les éléments du rêve des Dragons expriment<br>le Draconic : chaque pierre, chaque fleur, chaque goutte d'eau,<br>chaque nuage est porteur d'un message dans la langue des Dragons</p>","reference":"Rêve de Dragon, Denis Gerfaud"},"frequence":{"cite":25,"sanctuaire":25,"plaines":20,"pont":20,"collines":15,"foret":15,"monts":10,"desert":10,"fleuve":5,"lac":5,"marais":2,"gouffre":2,"necropole":0,"desolation":0,"mauvaise":0},"description":""},"effects":[],"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.rencontres.Ffk9pio1qy4Z28Lc"}},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.1.0","coreVersion":"10.288","createdTime":1667846036337,"modifiedTime":1668036933994,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"},"_id":"0MwHtPpFV2lTeCtt","folder":null,"sort":0,"ownership":{"default":0,"Hp9ImM4o9YRTSdfu":3}}
|
||||||
{"name":"Briseur de Rêve","type":"rencontre","img":"systems/foundryvtt-reve-de-dragon/icons/tete_dragon.webp","system":{"genre":"m","formule":"2d6","refoulement":1,"presentCite":false,"mauvaiseRencontre":false,"ordreTri":6,"force":0,"coord":"","date":"","heure":"","succes":{"effets":[],"message":"Le {{rencontre.name}} tente vainement de vous déconcentrer, avant de fuir sans demander son reste.","poesie":"<p>La légende affirme que ce sont les Gnomes qui furent les premiers haut-rêvants. En observant les pierres précieuses, les gemmes qui sont les larmes de joie des Dragons, ils parvinrent à en comprendre la langue. Et l'ayant comprise, ils purent s'en servir pour influencer le cours du rêve.</p>","reference":"Rêve de Dragon, Denis Gerfaud"},"echec":{"effets":["rompu"],"message":"Le {{rencontre.name}} vous déconcentre au point de briser votre demi-rêve.","poesie":"<p>Quand le rêve se brise,<br>Dans la plainte du jour,<br>Ma mémoire devient grise<br>Et sombre, tour à tour,<br>Dans le puits du silence<br>Et de la solitude ;<br>Elle reprend son errance<br>Parmi la multitude.</p>","reference":"Quand le rêve se brise, Cypora Sebagh"},"frequence":{"cite":5,"sanctuaire":5,"plaines":7,"pont":7,"collines":13,"foret":13,"monts":16,"desert":16,"fleuve":16,"lac":16,"marais":21,"gouffre":21,"necropole":20,"desolation":20,"mauvaise":0},"description":""},"effects":[],"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.rencontres.dvEiIk0HFGsvyb5F"}},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.1.0","coreVersion":"10.288","createdTime":1667846036340,"modifiedTime":1668036933993,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"},"_id":"3e6jIvyy1e7OzYcB","folder":null,"sort":0,"ownership":{"default":0,"Hp9ImM4o9YRTSdfu":3}}
|
{"name":"Briseur de Rêve","type":"rencontre","img":"systems/foundryvtt-reve-de-dragon/icons/tete_dragon.webp","system":{"genre":"m","formule":"2d6","refoulement":1,"presentCite":false,"mauvaiseRencontre":false,"ordreTri":6,"force":0,"coord":"","date":"","heure":"","succes":{"effets":[],"message":"Le {{{rencontre.name}}} tente vainement de vous déconcentrer, avant de fuir sans demander son reste.","poesie":"<p>La légende affirme que ce sont les Gnomes qui furent les premiers haut-rêvants. En observant les pierres précieuses, les gemmes qui sont les larmes de joie des Dragons, ils parvinrent à en comprendre la langue. Et l'ayant comprise, ils purent s'en servir pour influencer le cours du rêve.</p>","reference":"Rêve de Dragon, Denis Gerfaud"},"echec":{"effets":["rompu"],"message":"Le {{{rencontre.name}}} vous déconcentre au point de briser votre demi-rêve.","poesie":"<p>Quand le rêve se brise,<br>Dans la plainte du jour,<br>Ma mémoire devient grise<br>Et sombre, tour à tour,<br>Dans le puits du silence<br>Et de la solitude ;<br>Elle reprend son errance<br>Parmi la multitude.</p>","reference":"Quand le rêve se brise, Cypora Sebagh"},"frequence":{"cite":5,"sanctuaire":5,"plaines":7,"pont":7,"collines":13,"foret":13,"monts":16,"desert":16,"fleuve":16,"lac":16,"marais":21,"gouffre":21,"necropole":20,"desolation":20,"mauvaise":0},"description":""},"effects":[],"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.rencontres.dvEiIk0HFGsvyb5F"}},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.1.0","coreVersion":"10.288","createdTime":1667846036340,"modifiedTime":1668036933993,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"},"_id":"3e6jIvyy1e7OzYcB","folder":null,"sort":0,"ownership":{"default":0,"Hp9ImM4o9YRTSdfu":3}}
|
||||||
{"name":"Reflet d'ancien Rêve","type":"rencontre","img":"systems/foundryvtt-reve-de-dragon/icons/tete_dragon.webp","system":{"genre":"m","formule":"2d6","refoulement":1,"presentCite":false,"mauvaiseRencontre":false,"ordreTri":7,"force":"0","coord":"","date":"","heure":"","succes":{"effets":[],"message":"Le {{rencontre.name}} s'estompe dans l'oubli.","poesie":"<p>Les formes s'effaçaient et n'étaient plus qu'un rêve,<br>Une ébauche lente à venir<br>Sur la toile oubliée, et que l'artiste achève<br>Seulement par le souvenir.</p>","reference":"Une charogne, Charles Baudelaire"},"echec":{"effets":["persistant"],"message":"Vous êtes submergé par un {{rencontre.name}}, les souvenirs vous retiennent tant qu'il ne sera pas vaincu!","poesie":"<p>Longtemps ! toujours ! ma main dans ta crinière lourde<br>Sèmera le rubis, la perle et le saphir,<br>Afin qu'à mon désir tu ne sois jamais sourde !<br>N'es-tu pas l'oasis où je rêve, et la gourde<br>Où je hume à longs traits le vin du souvenir</p>","reference":"La chevelure, Charles Baudelaire"},"frequence":{"cite":5,"sanctuaire":5,"plaines":6,"pont":6,"collines":6,"foret":6,"monts":10,"desert":10,"fleuve":14,"lac":14,"marais":15,"gouffre":15,"necropole":15,"desolation":15,"mauvaise":0},"description":""},"effects":[],"ownership":{"default":0,"Hp9ImM4o9YRTSdfu":3},"flags":{"core":{"sourceId":"Item.drXUmMGrrY9jyJPp"}},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.1.0","coreVersion":"10.288","createdTime":1667773074055,"modifiedTime":1668036933995,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"},"folder":null,"sort":0,"_id":"5IEjrkpQ2YNFiUP4"}
|
{"name":"Reflet d'ancien Rêve","type":"rencontre","img":"systems/foundryvtt-reve-de-dragon/icons/tete_dragon.webp","system":{"genre":"m","formule":"2d6","refoulement":1,"presentCite":false,"mauvaiseRencontre":false,"ordreTri":7,"force":"0","coord":"","date":"","heure":"","succes":{"effets":[],"message":"Le {{{rencontre.name}}} s'estompe dans l'oubli.","poesie":"<p>Les formes s'effaçaient et n'étaient plus qu'un rêve,<br>Une ébauche lente à venir<br>Sur la toile oubliée, et que l'artiste achève<br>Seulement par le souvenir.</p>","reference":"Une charogne, Charles Baudelaire"},"echec":{"effets":["persistant"],"message":"Vous êtes submergé par un {{{rencontre.name}}}, les souvenirs vous retiennent tant qu'il ne sera pas vaincu!","poesie":"<p>Longtemps ! toujours ! ma main dans ta crinière lourde<br>Sèmera le rubis, la perle et le saphir,<br>Afin qu'à mon désir tu ne sois jamais sourde !<br>N'es-tu pas l'oasis où je rêve, et la gourde<br>Où je hume à longs traits le vin du souvenir</p>","reference":"La chevelure, Charles Baudelaire"},"frequence":{"cite":5,"sanctuaire":5,"plaines":6,"pont":6,"collines":6,"foret":6,"monts":10,"desert":10,"fleuve":14,"lac":14,"marais":15,"gouffre":15,"necropole":15,"desolation":15,"mauvaise":0},"description":""},"effects":[],"ownership":{"default":0,"Hp9ImM4o9YRTSdfu":3},"flags":{"core":{"sourceId":"Item.drXUmMGrrY9jyJPp"}},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.1.0","coreVersion":"10.288","createdTime":1667773074055,"modifiedTime":1668036933995,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"},"folder":null,"sort":0,"_id":"5IEjrkpQ2YNFiUP4"}
|
||||||
{"name":"Tourbillon noir","type":"rencontre","img":"systems/foundryvtt-reve-de-dragon/icons/tete_dragon.webp","system":{"genre":"m","formule":"2d8","refoulement":1,"presentCite":false,"mauvaiseRencontre":false,"ordreTri":9,"force":0,"coord":"","date":"","heure":"","succes":{"effets":[],"message":"Le {{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.","poesie":"<p>Car le Second Âge fut bel et bien celui des Magiciens. Durant cette période, les Gnomes s'enfoncèrent profondément sous les montagnes et la magie passa aux mains des Humains qui en usèrent et abusèrent, se croyant devenus les maîtres du monde</p>","reference":"Rêve de Dragon, Denis Gerfaud"},"echec":{"effets":["reve-1","reve-1","aleatoire","aleatoire","persistant"],"message":"Le {{rencontre.name}} furieux vous secoue tel un fichu de paille malmené par les vents, et vous emporte dans la tourmente.","poesie":"<p>Elle aurait pas cru sans le voir<br>Que la couleur du désespoir<br>Là-bas aussi ce fût le noir.</p>","reference":"Lily, Pierre Perret"},"frequence":{"cite":3,"sanctuaire":3,"plaines":4,"pont":4,"collines":4,"foret":4,"monts":5,"desert":5,"fleuve":8,"lac":8,"marais":11,"gouffre":11,"necropole":17,"desolation":17,"mauvaise":0},"description":""},"effects":[],"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.rencontres.81b2cjAzl9hfK7Zt"}},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.1.0","coreVersion":"10.288","createdTime":1667846036336,"modifiedTime":1668036933995,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"},"_id":"89NtInRn4uWArlct","folder":null,"sort":0,"ownership":{"default":0,"Hp9ImM4o9YRTSdfu":3}}
|
{"name":"Tourbillon noir","type":"rencontre","img":"systems/foundryvtt-reve-de-dragon/icons/tete_dragon.webp","system":{"genre":"m","formule":"2d8","refoulement":1,"presentCite":false,"mauvaiseRencontre":false,"ordreTri":9,"force":0,"coord":"","date":"","heure":"","succes":{"effets":[],"message":"Le {{{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.","poesie":"<p>Car le Second Âge fut bel et bien celui des Magiciens. Durant cette période, les Gnomes s'enfoncèrent profondément sous les montagnes et la magie passa aux mains des Humains qui en usèrent et abusèrent, se croyant devenus les maîtres du monde</p>","reference":"Rêve de Dragon, Denis Gerfaud"},"echec":{"effets":["reve-1","reve-1","aleatoire","aleatoire","persistant"],"message":"Le {{{rencontre.name}}} furieux vous secoue tel un fichu de paille malmené par les vents, et vous emporte dans la tourmente.","poesie":"<p>Elle aurait pas cru sans le voir<br>Que la couleur du désespoir<br>Là-bas aussi ce fût le noir.</p>","reference":"Lily, Pierre Perret"},"frequence":{"cite":3,"sanctuaire":3,"plaines":4,"pont":4,"collines":4,"foret":4,"monts":5,"desert":5,"fleuve":8,"lac":8,"marais":11,"gouffre":11,"necropole":17,"desolation":17,"mauvaise":0},"description":""},"effects":[],"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.rencontres.81b2cjAzl9hfK7Zt"}},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.1.0","coreVersion":"10.288","createdTime":1667846036336,"modifiedTime":1668036933995,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"},"_id":"89NtInRn4uWArlct","folder":null,"sort":0,"ownership":{"default":0,"Hp9ImM4o9YRTSdfu":3}}
|
||||||
{"name":"Reflet d'ancien Rêve","type":"rencontre","img":"systems/foundryvtt-reve-de-dragon/icons/queue_dragon.webp","system":{"genre":"m","formule":"2d6+4","refoulement":2,"presentCite":false,"mauvaiseRencontre":true,"ordreTri":3,"force":0,"coord":"","date":"","heure":"","succes":{"effets":[],"message":"Le {{rencontre.name}} s'estompe dans l'oubli.","poesie":"<p>Les formes s'effaçaient et n'étaient plus qu'un rêve,<br>Une ébauche lente à venir<br>Sur la toile oubliée, et que l'artiste achève<br>Seulement par le souvenir.</p>","reference":"Une charogne, Charles Baudelaire"},"echec":{"effets":["persistant"],"message":"Vous êtes submergé par un {{rencontre.name}}, les souvenirs vous retiennent tant qu'il ne sera pas vaincu!","poesie":"<p>Longtemps ! toujours ! ma main dans ta crinière lourde<br>Sèmera le rubis, la perle et le saphir,<br>Afin qu'à mon désir tu ne sois jamais sourde !<br>N'es-tu pas l'oasis où je rêve, et la gourde<br>Où je hume à longs traits le vin du souvenir</p>","reference":"La chevelure, Charles Baudelaire"},"frequence":{"cite":5,"sanctuaire":5,"plaines":6,"pont":6,"collines":6,"foret":6,"monts":10,"desert":10,"fleuve":14,"lac":14,"marais":15,"gouffre":15,"necropole":15,"desolation":15,"mauvaise":1},"description":""},"effects":[],"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.rencontres.MB2qOlTsEUTQkRVL"}},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.2.8","coreVersion":"10.290","createdTime":1667846036338,"modifiedTime":1669471919738,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"},"_id":"U6WoTkHRwC4DicuZ","folder":null,"sort":0,"ownership":{"default":0,"Hp9ImM4o9YRTSdfu":3}}
|
{"name":"Reflet d'ancien Rêve","type":"rencontre","img":"systems/foundryvtt-reve-de-dragon/icons/queue_dragon.webp","system":{"genre":"m","formule":"2d6+4","refoulement":2,"presentCite":false,"mauvaiseRencontre":true,"ordreTri":3,"force":0,"coord":"","date":"","heure":"","succes":{"effets":[],"message":"Le {{{rencontre.name}}} s'estompe dans l'oubli.","poesie":"<p>Les formes s'effaçaient et n'étaient plus qu'un rêve,<br>Une ébauche lente à venir<br>Sur la toile oubliée, et que l'artiste achève<br>Seulement par le souvenir.</p>","reference":"Une charogne, Charles Baudelaire"},"echec":{"effets":["persistant"],"message":"Vous êtes submergé par un {{{rencontre.name}}}, les souvenirs vous retiennent tant qu'il ne sera pas vaincu!","poesie":"<p>Longtemps ! toujours ! ma main dans ta crinière lourde<br>Sèmera le rubis, la perle et le saphir,<br>Afin qu'à mon désir tu ne sois jamais sourde !<br>N'es-tu pas l'oasis où je rêve, et la gourde<br>Où je hume à longs traits le vin du souvenir</p>","reference":"La chevelure, Charles Baudelaire"},"frequence":{"cite":5,"sanctuaire":5,"plaines":6,"pont":6,"collines":6,"foret":6,"monts":10,"desert":10,"fleuve":14,"lac":14,"marais":15,"gouffre":15,"necropole":15,"desolation":15,"mauvaise":1},"description":""},"effects":[],"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.rencontres.MB2qOlTsEUTQkRVL"}},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.2.8","coreVersion":"10.290","createdTime":1667846036338,"modifiedTime":1669471919738,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"},"_id":"U6WoTkHRwC4DicuZ","folder":null,"sort":0,"ownership":{"default":0,"Hp9ImM4o9YRTSdfu":3}}
|
||||||
{"name":"Changeur de Rêve","type":"rencontre","img":"systems/foundryvtt-reve-de-dragon/icons/tete_dragon.webp","system":{"genre":"m","formule":"2d6","refoulement":1,"presentCite":false,"mauvaiseRencontre":false,"ordreTri":5,"force":0,"coord":"","date":"","heure":"","succes":{"effets":["teleport"],"message":"Le {{rencontre.name}} vaincu accepte de vous déplacer sur une autre case {{caseTmr-type tmr.coord}} de votre choix en échange de sa liberté.","poesie":"<p>Allez, que le caprice emporte<br>Chaque âme selon son désir,<br>Et que, close après vous, la porte<br>Ne se rouvre plus qu'au plaisir.</p>","reference":"Caligula - IIIème chant, Gérard de Nerval"},"echec":{"effets":["teleport-aleatoire"],"message":"Le {{rencontre.name}} vous embobine avec des promesses, et vous transporte sur une autre case {{caseTmr-type tmr.coord}} sans attendre votre avis.","poesie":"<p>Les sages ont encore coutume de dire : <br>« Mais comment les Dragons peuvent-ils être influencés par une créature qui, tout bien considéré, n'existe pas vraiment pour eux, qui n'est que le fantasme de leur activité nocturne ? »</p>","reference":"Rêve de Dragon, Denis Gerfaud"},"frequence":{"cite":10,"sanctuaire":10,"plaines":15,"pont":15,"collines":15,"foret":15,"monts":15,"desert":15,"fleuve":12,"lac":12,"marais":10,"gouffre":10,"necropole":10,"desolation":10,"mauvaise":0},"description":""},"effects":[],"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.rencontres.q4uyAZoFPyc4x8XI"}},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.1.0","coreVersion":"10.288","createdTime":1667846036340,"modifiedTime":1668036933994,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"},"_id":"WeCnQirDR1r3TUFw","folder":null,"sort":0,"ownership":{"default":0,"Hp9ImM4o9YRTSdfu":3}}
|
{"name":"Changeur de Rêve","type":"rencontre","img":"systems/foundryvtt-reve-de-dragon/icons/tete_dragon.webp","system":{"genre":"m","formule":"2d6","refoulement":1,"presentCite":false,"mauvaiseRencontre":false,"ordreTri":5,"force":0,"coord":"","date":"","heure":"","succes":{"effets":["teleport"],"message":"Le {{{rencontre.name}}} vaincu accepte de vous déplacer sur une autre case {{{caseTmr-type tmr.coord}}} de votre choix en échange de sa liberté.","poesie":"<p>Allez, que le caprice emporte<br>Chaque âme selon son désir,<br>Et que, close après vous, la porte<br>Ne se rouvre plus qu'au plaisir.</p>","reference":"Caligula - IIIème chant, Gérard de Nerval"},"echec":{"effets":["teleport-aleatoire"],"message":"Le {{{rencontre.name}}} vous embobine avec des promesses, et vous transporte sur une autre case {{{caseTmr-type tmr.coord}}} sans attendre votre avis.","poesie":"<p>Les sages ont encore coutume de dire : <br>« Mais comment les Dragons peuvent-ils être influencés par une créature qui, tout bien considéré, n'existe pas vraiment pour eux, qui n'est que le fantasme de leur activité nocturne ? »</p>","reference":"Rêve de Dragon, Denis Gerfaud"},"frequence":{"cite":10,"sanctuaire":10,"plaines":15,"pont":15,"collines":15,"foret":15,"monts":15,"desert":15,"fleuve":12,"lac":12,"marais":10,"gouffre":10,"necropole":10,"desolation":10,"mauvaise":0},"description":""},"effects":[],"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.rencontres.q4uyAZoFPyc4x8XI"}},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.1.0","coreVersion":"10.288","createdTime":1667846036340,"modifiedTime":1668036933994,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"},"_id":"WeCnQirDR1r3TUFw","folder":null,"sort":0,"ownership":{"default":0,"Hp9ImM4o9YRTSdfu":3}}
|
||||||
{"name":"Rêve de Dragon","type":"rencontre","img":"systems/foundryvtt-reve-de-dragon/styles/img/rdd_pause.webp","system":{"genre":"m","formule":"1dr+7","refoulement":2,"presentCite":false,"mauvaiseRencontre":false,"ordreTri":10,"force":0,"coord":"","date":"","heure":"","succes":{"effets":["reve+f","part+tete","part+xp","seuil"],"message":"A tout seigneur, tout honneur, vous faites face à un {{rencontre.name}}. Vous le maîtrisez et gagnez ses {{rencontre.system.force}} points de rêve.","poesie":"<p>Le monde est Rêve de Dragons, mais nous ne savons <br>Ni leur apparence ni qui sont les dragons. <br>En dépit de l'iconographie qui les clame <br>Immenses créatures ailées crachant des flammes</p>","reference":"Rêve de Dragon, Denis Gerfaud"},"echec":{"effets":["echec-queue"],"message":"A tout seigneur, tout honneur, vous faites face à un {{rencontre.name}}. La rencontre tourne au cauchemar, dans la lutte épique, vous subissez {{#if rolled.isETotal}}deux queues{{else}}une queue{{/if}} de dragon!","poesie":"<p>Je suis le Ténébreux, – le Veuf, – l'Inconsolé, <br>Le Prince d'Aquitaine à la Tour abolie : <br>Ma seule Etoile est morte, – et mon luth constellé <br>Porte le Soleil noir de la Mélancolie.</p>","reference":"El Desdichado, Gérard de Nerval"},"frequence":{"cite":3,"sanctuaire":3,"plaines":3,"pont":3,"collines":3,"foret":3,"monts":3,"desert":3,"fleuve":3,"lac":3,"marais":3,"gouffre":3,"necropole":3,"desolation":3,"mauvaise":0},"description":""},"effects":[],"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.rencontres.Hw40Q8jS9wmukgU4"}},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.1.0","coreVersion":"10.288","createdTime":1667846036338,"modifiedTime":1668036933995,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"},"_id":"dWKuUc29ysrlPZFg","folder":null,"sort":0,"ownership":{"default":0,"Hp9ImM4o9YRTSdfu":3}}
|
{"name":"Rêve de Dragon","type":"rencontre","img":"systems/foundryvtt-reve-de-dragon/styles/img/rdd_pause.webp","system":{"genre":"m","formule":"1dr+7","refoulement":2,"presentCite":false,"mauvaiseRencontre":false,"ordreTri":10,"force":0,"coord":"","date":"","heure":"","succes":{"effets":["reve+f","part+tete","part+xp","seuil"],"message":"A tout seigneur, tout honneur, vous faites face à un {{{rencontre.name}}}. Vous le maîtrisez et gagnez ses {{rencontre.system.force}} points de rêve.","poesie":"<p>Le monde est Rêve de Dragons, mais nous ne savons <br>Ni leur apparence ni qui sont les dragons. <br>En dépit de l'iconographie qui les clame <br>Immenses créatures ailées crachant des flammes</p>","reference":"Rêve de Dragon, Denis Gerfaud"},"echec":{"effets":["echec-queue"],"message":"A tout seigneur, tout honneur, vous faites face à un {{{rencontre.name}}}. La rencontre tourne au cauchemar, dans la lutte épique, vous subissez {{#if rolled.isETotal}}deux queues{{else}}une queue{{/if}} de dragon!","poesie":"<p>Je suis le Ténébreux, – le Veuf, – l'Inconsolé, <br>Le Prince d'Aquitaine à la Tour abolie : <br>Ma seule Etoile est morte, – et mon luth constellé <br>Porte le Soleil noir de la Mélancolie.</p>","reference":"El Desdichado, Gérard de Nerval"},"frequence":{"cite":3,"sanctuaire":3,"plaines":3,"pont":3,"collines":3,"foret":3,"monts":3,"desert":3,"fleuve":3,"lac":3,"marais":3,"gouffre":3,"necropole":3,"desolation":3,"mauvaise":0},"description":""},"effects":[],"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.rencontres.Hw40Q8jS9wmukgU4"}},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.1.0","coreVersion":"10.288","createdTime":1667846036338,"modifiedTime":1668036933995,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"},"_id":"dWKuUc29ysrlPZFg","folder":null,"sort":0,"ownership":{"default":0,"Hp9ImM4o9YRTSdfu":3}}
|
||||||
{"name":"Passeur fou","type":"rencontre","img":"systems/foundryvtt-reve-de-dragon/icons/queue_dragon.webp","system":{"genre":"m","formule":"2d8","refoulement":2,"presentCite":false,"mauvaiseRencontre":true,"ordreTri":26,"force":0,"coord":"","date":"","heure":"","succes":{"effets":[],"message":"Le Passeur fou 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.","poesie":"<p>Certain Fou poursuivait à coups de pierre un Sage.<br>Le Sage se retourne et lui dit : Mon ami,<br>C'est fort bien fait à toi ; reçois cet écu-ci :<br>Tu fatigues assez pour gagner davantage.</p>","reference":"Un Fou et un Sage, Jean de La Fontaine"},"echec":{"effets":["sort-aleatoire"],"message":"{{#if sortReserve}}Le Passeur fou dérobe la clé de vos sorts. Vous vous saisissez de lui, mais dans un nuage violet, il vous emporte {{newTMR.label}} déclencher votre sort en réserve de {{sortReserve.name}}.{{else}}Le Passeur fou tente de vous dérober la clé de vos sorts. Ne la trouvant pas, il déclenche un nuage violet et vous emporte en {{newTMR.label}}.{{/if}}","poesie":"<p>Je la voyais passer de ma demeure,<br>Et c'était tout.<br>Mais à présent je m'ennuie à toute heure,<br>Plein de dégoût,<br>Rêveur oisif, l'âme dans la campagne,<br>La dague au clou ... –<br>Le vent qui vient à travers la montagne<br>M'a rendu fou !</p>","reference":"Guitare, Victor Hugo"},"frequence":{"cite":0,"sanctuaire":0,"plaines":0,"pont":0,"collines":0,"foret":0,"monts":0,"desert":0,"fleuve":0,"lac":0,"marais":0,"gouffre":0,"necropole":0,"desolation":0,"mauvaise":1},"description":""},"effects":[],"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.rencontres.HkYBb3Ls4W15tKwo"}},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.1.0","coreVersion":"10.288","createdTime":1667846036338,"modifiedTime":1668036933995,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"},"_id":"eVxv2FMRZOo7aTWB","folder":null,"sort":0,"ownership":{"default":0,"Hp9ImM4o9YRTSdfu":3}}
|
{"name":"Passeur fou","type":"rencontre","img":"systems/foundryvtt-reve-de-dragon/icons/queue_dragon.webp","system":{"genre":"m","formule":"2d8","refoulement":2,"presentCite":false,"mauvaiseRencontre":true,"ordreTri":26,"force":0,"coord":"","date":"","heure":"","succes":{"effets":[],"message":"Le Passeur fou 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.","poesie":"<p>Certain Fou poursuivait à coups de pierre un Sage.<br>Le Sage se retourne et lui dit : Mon ami,<br>C'est fort bien fait à toi ; reçois cet écu-ci :<br>Tu fatigues assez pour gagner davantage.</p>","reference":"Un Fou et un Sage, Jean de La Fontaine"},"echec":{"effets":["sort-aleatoire"],"message":"{{#if sortReserve}}Le Passeur fou dérobe la clé de vos sorts. Vous vous saisissez de lui, mais dans un nuage violet, il vous emporte {{{newTMR.label}}} déclencher votre sort en réserve de {{sortReserve.name}}.{{else}}Le Passeur fou tente de vous dérober la clé de vos sorts. Ne la trouvant pas, il déclenche un nuage violet et vous emporte en {{{newTMR.label}}}.{{/if}}","poesie":"<p>Je la voyais passer de ma demeure,<br>Et c'était tout.<br>Mais à présent je m'ennuie à toute heure,<br>Plein de dégoût,<br>Rêveur oisif, l'âme dans la campagne,<br>La dague au clou ... –<br>Le vent qui vient à travers la montagne<br>M'a rendu fou !</p>","reference":"Guitare, Victor Hugo"},"frequence":{"cite":0,"sanctuaire":0,"plaines":0,"pont":0,"collines":0,"foret":0,"monts":0,"desert":0,"fleuve":0,"lac":0,"marais":0,"gouffre":0,"necropole":0,"desolation":0,"mauvaise":1},"description":""},"effects":[],"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.rencontres.HkYBb3Ls4W15tKwo"}},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.1.0","coreVersion":"10.288","createdTime":1667846036338,"modifiedTime":1668036933995,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"},"_id":"eVxv2FMRZOo7aTWB","folder":null,"sort":0,"ownership":{"default":0,"Hp9ImM4o9YRTSdfu":3}}
|
||||||
{"name":"Mangeur de Rêve","type":"rencontre","img":"systems/foundryvtt-reve-de-dragon/icons/tete_dragon.webp","system":{"genre":"m","formule":"1d6","refoulement":1,"presentCite":false,"mauvaiseRencontre":false,"ordreTri":4,"force":0,"coord":"","date":"","heure":"","succes":{"effets":[],"message":"Le {{rencontre.name}} claque de sa machoire dans le vide avant de fuir.","poesie":"<p>Rois ! la bure est souvent jalouse du velours.<br>Le peuple a froid l'hiver, le peuple a faim toujours.<br>Rendez-lui son sort plus facile.<br>Le peuple souvent porte un bien rude collier.<br>Ouvrez l'école aux fils, aux pères l'atelier,<br>À tous vos bras, auguste asile !</p>","reference":"Conseil, Victor Hugo"},"echec":{"effets":["reve-f"],"message":"Le {{rencontre.name}} croque votre Rêve ! Il emporte {{rencontre.system.force}} de vos points de rêve actuels","poesie":"<div>\n<div>Suis-je Amour ou Phébus ?... Lusignan ou Biron ?</div>\n<div>Mon front est rouge encor du baiser de la Reine ;</div>\n<div>J'ai rêvé dans la Grotte où nage la sirène...</div>\n</div>","reference":"El Desdichado, Gérard de Nerval"},"frequence":{"cite":5,"sanctuaire":5,"plaines":5,"pont":5,"collines":12,"foret":12,"monts":18,"desert":18,"fleuve":24,"lac":24,"marais":24,"gouffre":24,"necropole":20,"desolation":20,"mauvaise":1},"description":""},"effects":[],"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.rencontres.3SA5An6kPlpcDEIj"}},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.1.0","coreVersion":"10.288","createdTime":1667846036336,"modifiedTime":1668036933994,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"},"_id":"fd89RWxlO8BF1FFJ","folder":null,"sort":0,"ownership":{"default":0,"Hp9ImM4o9YRTSdfu":3}}
|
{"name":"Mangeur de Rêve","type":"rencontre","img":"systems/foundryvtt-reve-de-dragon/icons/tete_dragon.webp","system":{"genre":"m","formule":"1d6","refoulement":1,"presentCite":false,"mauvaiseRencontre":false,"ordreTri":4,"force":0,"coord":"","date":"","heure":"","succes":{"effets":[],"message":"Le {{{rencontre.name}}} claque de sa machoire dans le vide avant de fuir.","poesie":"<p>Rois ! la bure est souvent jalouse du velours.<br>Le peuple a froid l'hiver, le peuple a faim toujours.<br>Rendez-lui son sort plus facile.<br>Le peuple souvent porte un bien rude collier.<br>Ouvrez l'école aux fils, aux pères l'atelier,<br>À tous vos bras, auguste asile !</p>","reference":"Conseil, Victor Hugo"},"echec":{"effets":["reve-f"],"message":"Le {{{rencontre.name}}} croque votre Rêve ! Il emporte {{rencontre.system.force}} de vos points de rêve actuels","poesie":"<div>\n<div>Suis-je Amour ou Phébus ?... Lusignan ou Biron ?</div>\n<div>Mon front est rouge encor du baiser de la Reine ;</div>\n<div>J'ai rêvé dans la Grotte où nage la sirène...</div>\n</div>","reference":"El Desdichado, Gérard de Nerval"},"frequence":{"cite":5,"sanctuaire":5,"plaines":5,"pont":5,"collines":12,"foret":12,"monts":18,"desert":18,"fleuve":24,"lac":24,"marais":24,"gouffre":24,"necropole":20,"desolation":20,"mauvaise":1},"description":""},"effects":[],"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.rencontres.3SA5An6kPlpcDEIj"}},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.1.0","coreVersion":"10.288","createdTime":1667846036336,"modifiedTime":1668036933994,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"},"_id":"fd89RWxlO8BF1FFJ","folder":null,"sort":0,"ownership":{"default":0,"Hp9ImM4o9YRTSdfu":3}}
|
||||||
{"name":"Tourbillon noir","type":"rencontre","img":"systems/foundryvtt-reve-de-dragon/icons/queue_dragon.webp","system":{"genre":"m","formule":"2d8+4","refoulement":2,"presentCite":false,"mauvaiseRencontre":true,"ordreTri":25,"force":0,"coord":"","date":"","heure":"","succes":{"effets":[],"message":"Le {{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.","poesie":"<p>Car le Second Âge fut bel et bien celui des Magiciens. Durant cette période, les Gnomes s'enfoncèrent profondément sous les montagnes et la magie passa aux mains des Humains qui en usèrent et abusèrent, se croyant devenus les maîtres du monde</p>","reference":"Rêve de Dragon, Denis Gerfaud"},"echec":{"effets":["reve-1","reve-1","aleatoire","aleatoire","persistant"],"message":"Le {{rencontre.name}} furieux vous secoue tel un fichu de paille malmené par les vents, et vous emporte dans la tourmente.","poesie":"<p>Elle aurait pas cru sans le voir<br>Que la couleur du désespoir<br>Là-bas aussi ce fût le noir.</p>","reference":"Lily, Pierre Perret"},"frequence":{"cite":3,"sanctuaire":3,"plaines":4,"pont":4,"collines":4,"foret":4,"monts":5,"desert":5,"fleuve":8,"lac":8,"marais":11,"gouffre":11,"necropole":17,"desolation":17,"mauvaise":1},"description":""},"effects":[],"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.rencontres.D0gbC3plAesQx3uq"}},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.1.0","coreVersion":"10.288","createdTime":1667846036336,"modifiedTime":1668036933995,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"},"_id":"hmeuLiLh5nkuQ4eD","folder":null,"sort":0,"ownership":{"default":0,"Hp9ImM4o9YRTSdfu":3}}
|
{"name":"Tourbillon noir","type":"rencontre","img":"systems/foundryvtt-reve-de-dragon/icons/queue_dragon.webp","system":{"genre":"m","formule":"2d8+4","refoulement":2,"presentCite":false,"mauvaiseRencontre":true,"ordreTri":25,"force":0,"coord":"","date":"","heure":"","succes":{"effets":[],"message":"Le {{{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.","poesie":"<p>Car le Second Âge fut bel et bien celui des Magiciens. Durant cette période, les Gnomes s'enfoncèrent profondément sous les montagnes et la magie passa aux mains des Humains qui en usèrent et abusèrent, se croyant devenus les maîtres du monde</p>","reference":"Rêve de Dragon, Denis Gerfaud"},"echec":{"effets":["reve-1","reve-1","aleatoire","aleatoire","persistant"],"message":"Le {{{rencontre.name}}} furieux vous secoue tel un fichu de paille malmené par les vents, et vous emporte dans la tourmente.","poesie":"<p>Elle aurait pas cru sans le voir<br>Que la couleur du désespoir<br>Là-bas aussi ce fût le noir.</p>","reference":"Lily, Pierre Perret"},"frequence":{"cite":3,"sanctuaire":3,"plaines":4,"pont":4,"collines":4,"foret":4,"monts":5,"desert":5,"fleuve":8,"lac":8,"marais":11,"gouffre":11,"necropole":17,"desolation":17,"mauvaise":1},"description":""},"effects":[],"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.rencontres.D0gbC3plAesQx3uq"}},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.1.0","coreVersion":"10.288","createdTime":1667846036336,"modifiedTime":1668036933995,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"},"_id":"hmeuLiLh5nkuQ4eD","folder":null,"sort":0,"ownership":{"default":0,"Hp9ImM4o9YRTSdfu":3}}
|
||||||
{"name":"Fleur des rêves","type":"rencontre","img":"systems/foundryvtt-reve-de-dragon/icons/tete_dragon.webp","system":{"genre":"f","formule":"1d6","refoulement":0,"presentCite":true,"mauvaiseRencontre":false,"ordreTri":3,"force":"0","coord":"","date":"","heure":"","succes":{"effets":["reve+f"],"message":"Vous cueillez la {{rencontre.name}}, son parfum vous apporte {{rencontre.system.force}} points de Rêve.","poesie":"<p>Et qui sait si les fleurs nouvelles que je rêve<br>Trouveront dans ce sol lavé comme une grève<br>Le mystique aliment qui ferait leur vigueur ?</p>","reference":"L'Ennemi, Charles Baudelaire","effet":["reve+f"]},"echec":{"effets":[],"message":"La {{rencontre.name}} se fane et disparaît entre vos doigts.","poesie":"<p>Et le ciel regardait la carcasse superbe<br>Comme une fleur s'épanouir.<br>La puanteur était si forte, que sur l'herbe<br>Vous crûtes vous évanouir.</p>","reference":"Une charogne, Charles Baudelaire"},"frequence":{"cite":15,"sanctuaire":15,"plaines":15,"pont":15,"collines":12,"foret":12,"monts":6,"desert":6,"fleuve":3,"lac":3,"marais":1,"gouffre":1,"necropole":0,"desolation":0,"mauvaise":0},"description":"","onSucces":{"effets":[],"message":"","poesie":"","reference":""},"onEchec":{"effets":[],"message":"","poesie":"","reference":""},"descriptionmj":"","code":"","onSuccess":{"effets":[],"message":"","poesie":"","reference":""}},"effects":[],"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.rencontres.2ywduc2BHGpVvUbz"}},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.1.0","coreVersion":"10.288","createdTime":1667846036335,"modifiedTime":1668036933994,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"},"_id":"jtJk1ptJXsdsGZHA","folder":null,"sort":0,"ownership":{"default":0,"Hp9ImM4o9YRTSdfu":3}}
|
{"name":"Fleur des rêves","type":"rencontre","img":"systems/foundryvtt-reve-de-dragon/icons/tete_dragon.webp","system":{"genre":"f","formule":"1d6","refoulement":0,"presentCite":true,"mauvaiseRencontre":false,"ordreTri":3,"force":"0","coord":"","date":"","heure":"","succes":{"effets":["reve+f"],"message":"Vous cueillez la {{{rencontre.name}}}, son parfum vous apporte {{rencontre.system.force}} points de Rêve.","poesie":"<p>Et qui sait si les fleurs nouvelles que je rêve<br>Trouveront dans ce sol lavé comme une grève<br>Le mystique aliment qui ferait leur vigueur ?</p>","reference":"L'Ennemi, Charles Baudelaire","effet":["reve+f"]},"echec":{"effets":[],"message":"La {{{rencontre.name}}} se fane et disparaît entre vos doigts.","poesie":"<p>Et le ciel regardait la carcasse superbe<br>Comme une fleur s'épanouir.<br>La puanteur était si forte, que sur l'herbe<br>Vous crûtes vous évanouir.</p>","reference":"Une charogne, Charles Baudelaire"},"frequence":{"cite":15,"sanctuaire":15,"plaines":15,"pont":15,"collines":12,"foret":12,"monts":6,"desert":6,"fleuve":3,"lac":3,"marais":1,"gouffre":1,"necropole":0,"desolation":0,"mauvaise":0},"description":"","onSucces":{"effets":[],"message":"","poesie":"","reference":""},"onEchec":{"effets":[],"message":"","poesie":"","reference":""},"descriptionmj":"","code":"","onSuccess":{"effets":[],"message":"","poesie":"","reference":""}},"effects":[],"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.rencontres.2ywduc2BHGpVvUbz"}},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.1.0","coreVersion":"10.288","createdTime":1667846036335,"modifiedTime":1668036933994,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"},"_id":"jtJk1ptJXsdsGZHA","folder":null,"sort":0,"ownership":{"default":0,"Hp9ImM4o9YRTSdfu":3}}
|
||||||
{"name":"Tourbillon rouge","type":"rencontre","img":"systems/foundryvtt-reve-de-dragon/icons/queue_dragon.webp","system":{"genre":"m","formule":"2d8","refoulement":3,"presentCite":false,"mauvaiseRencontre":true,"ordreTri":27,"force":0,"coord":"","date":"","heure":"","succes":{"effets":[],"message":"Le {{rencontre.name}} s'abat avec violence mais vous êtes plus rapide et parvenez à lui échapper.","poesie":"<p>Qu'est-ce de votre vie ? un tourbillon rouant<br>De fumière à flot gris, parmi l'air se jouant,<br>Qui passe plus soudain que foudre meurtrière.</p>","reference":"Qu'est-ce de votre vie ? une bouteille molle, Jean-Baptiste Chassignet"},"echec":{"effets":["aleatoire","aleatoire","aleatoire","aleatoire","reve-1","reve-1","vie-1","persistant"],"message":"Le {{rencontre.name}} vous frappe de milliers de morsure et vous malmène à travers les terres médianes.","poesie":"<p>Cris de l'enfer! voix qui hurle et qui pleure !<br>L'horrible essaim, poussé par l'aquilon,<br>Sans doute, ô ciel ! s'abat sur ma demeure.<br>Le mur fléchit sous le noir bataillon.<br>La maison crie et chancelle penchée,<br>Et l'on dirait que, du sol arrachée,<br>Ainsi qu'il chasse une feuille séchée,<br>Le vent la roule avec leur tourbillon !</p>","reference":"Les Djinns, poème Victor Hugo"},"frequence":{"cite":0,"sanctuaire":0,"plaines":0,"pont":0,"collines":0,"foret":0,"monts":0,"desert":0,"fleuve":0,"lac":0,"marais":0,"gouffre":0,"necropole":0,"desolation":0,"mauvaise":1},"description":""},"effects":[],"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.rencontres.WiyUvZX4oTAd82s3"}},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.1.0","coreVersion":"10.288","createdTime":1667846036339,"modifiedTime":1668036933996,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"},"_id":"nD7p8ROloR6ElTpW","folder":null,"sort":0,"ownership":{"default":0,"Hp9ImM4o9YRTSdfu":3}}
|
{"name":"Tourbillon rouge","type":"rencontre","img":"systems/foundryvtt-reve-de-dragon/icons/queue_dragon.webp","system":{"genre":"m","formule":"2d8","refoulement":3,"presentCite":false,"mauvaiseRencontre":true,"ordreTri":27,"force":0,"coord":"","date":"","heure":"","succes":{"effets":[],"message":"Le {{{rencontre.name}}} s'abat avec violence mais vous êtes plus rapide et parvenez à lui échapper.","poesie":"<p>Qu'est-ce de votre vie ? un tourbillon rouant<br>De fumière à flot gris, parmi l'air se jouant,<br>Qui passe plus soudain que foudre meurtrière.</p>","reference":"Qu'est-ce de votre vie ? une bouteille molle, Jean-Baptiste Chassignet"},"echec":{"effets":["aleatoire","aleatoire","aleatoire","aleatoire","reve-1","reve-1","vie-1","persistant"],"message":"Le {{{rencontre.name}}} vous frappe de milliers de morsure et vous malmène à travers les terres médianes.","poesie":"<p>Cris de l'enfer! voix qui hurle et qui pleure !<br>L'horrible essaim, poussé par l'aquilon,<br>Sans doute, ô ciel ! s'abat sur ma demeure.<br>Le mur fléchit sous le noir bataillon.<br>La maison crie et chancelle penchée,<br>Et l'on dirait que, du sol arrachée,<br>Ainsi qu'il chasse une feuille séchée,<br>Le vent la roule avec leur tourbillon !</p>","reference":"Les Djinns, poème Victor Hugo"},"frequence":{"cite":0,"sanctuaire":0,"plaines":0,"pont":0,"collines":0,"foret":0,"monts":0,"desert":0,"fleuve":0,"lac":0,"marais":0,"gouffre":0,"necropole":0,"desolation":0,"mauvaise":1},"description":""},"effects":[],"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.rencontres.WiyUvZX4oTAd82s3"}},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.1.0","coreVersion":"10.288","createdTime":1667846036339,"modifiedTime":1668036933996,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"},"_id":"nD7p8ROloR6ElTpW","folder":null,"sort":0,"ownership":{"default":0,"Hp9ImM4o9YRTSdfu":3}}
|
||||||
{"name":"Tourbillon blanc","type":"rencontre","img":"systems/foundryvtt-reve-de-dragon/icons/tete_dragon.webp","system":{"genre":"m","formule":"2d6","refoulement":1,"presentCite":false,"mauvaiseRencontre":false,"ordreTri":8,"force":"0","coord":"","date":"","heure":"","succes":{"effets":[],"message":"Le {{rencontre.name}} souleve une poussière blanche, vous tenez bon, et il tourbillonne en s'éloignant.","poesie":"<p>Le Premier Âge fut appelé l'Âge des Dragons. Ce fut le commencement<br>des temps, le commencement des rêves. Durant cette période plus mythique<br>que réellement historique, les Dragons aimaient à se rêver eux-mêmes.</p>","reference":"Rêve de Dragon, Denis Gerfaud"},"echec":{"effets":["reve-1","aleatoire","persistant"],"message":"Le souffle du {{rencontre.name}} vous déstabilise et vous emmène dans un nuage de poussière.","poesie":"<p>C'est l'essaim des Djinns qui passe,<br>Et tourbillonne en sifflant !<br>Les ifs, que leur vol fracasse,<br>Craquent comme un pin brûlant.</p>","reference":"Les Djinns, Victor Hugo"},"frequence":{"cite":4,"sanctuaire":4,"plaines":5,"pont":5,"collines":5,"foret":5,"monts":7,"desert":7,"fleuve":10,"lac":10,"marais":11,"gouffre":11,"necropole":15,"desolation":15,"mauvaise":0},"description":""},"effects":[],"ownership":{"default":0,"Hp9ImM4o9YRTSdfu":3},"flags":{"core":{"sourceId":"Item.GIG8SbYrl60p50u3"}},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.1.0","coreVersion":"10.288","createdTime":1667773090153,"modifiedTime":1668036933995,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"},"folder":null,"sort":0,"_id":"ph6qZi1yDgh68Y5l"}
|
{"name":"Tourbillon blanc","type":"rencontre","img":"systems/foundryvtt-reve-de-dragon/icons/tete_dragon.webp","system":{"genre":"m","formule":"2d6","refoulement":1,"presentCite":false,"mauvaiseRencontre":false,"ordreTri":8,"force":"0","coord":"","date":"","heure":"","succes":{"effets":[],"message":"Le {{{rencontre.name}}} souleve une poussière blanche, vous tenez bon, et il tourbillonne en s'éloignant.","poesie":"<p>Le Premier Âge fut appelé l'Âge des Dragons. Ce fut le commencement<br>des temps, le commencement des rêves. Durant cette période plus mythique<br>que réellement historique, les Dragons aimaient à se rêver eux-mêmes.</p>","reference":"Rêve de Dragon, Denis Gerfaud"},"echec":{"effets":["reve-1","aleatoire","persistant"],"message":"Le souffle du {{{rencontre.name}}} vous déstabilise et vous emmène dans un nuage de poussière.","poesie":"<p>C'est l'essaim des Djinns qui passe,<br>Et tourbillonne en sifflant !<br>Les ifs, que leur vol fracasse,<br>Craquent comme un pin brûlant.</p>","reference":"Les Djinns, Victor Hugo"},"frequence":{"cite":4,"sanctuaire":4,"plaines":5,"pont":5,"collines":5,"foret":5,"monts":7,"desert":7,"fleuve":10,"lac":10,"marais":11,"gouffre":11,"necropole":15,"desolation":15,"mauvaise":0},"description":""},"effects":[],"ownership":{"default":0,"Hp9ImM4o9YRTSdfu":3},"flags":{"core":{"sourceId":"Item.GIG8SbYrl60p50u3"}},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.1.0","coreVersion":"10.288","createdTime":1667773090153,"modifiedTime":1668036933995,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"},"folder":null,"sort":0,"_id":"ph6qZi1yDgh68Y5l"}
|
||||||
{"name":"Mangeur de Rêve","type":"rencontre","img":"systems/foundryvtt-reve-de-dragon/icons/queue_dragon.webp","system":{"genre":"m","formule":"1d6","refoulement":2,"presentCite":false,"mauvaiseRencontre":true,"ordreTri":21,"force":0,"coord":"","date":"","heure":"","succes":{"effets":[],"message":"Le {{rencontre.name}} claque de sa machoire dans le vide avant de fuir.","poesie":"<p>Rois ! la bure est souvent jalouse du velours.<br>Le peuple a froid l'hiver, le peuple a faim toujours.<br>Rendez-lui son sort plus facile.<br>Le peuple souvent porte un bien rude collier.<br>Ouvrez l'école aux fils, aux pères l'atelier,<br>À tous vos bras, auguste asile !</p>","reference":"Conseil, Victor Hugo"},"echec":{"effets":["reve-f"],"message":"Le {{rencontre.name}} croque votre Rêve ! Il emporte {{rencontre.system.force}} de vos points de rêve actuels","poesie":"<div>\n<div>Suis-je Amour ou Phébus ?... Lusignan ou Biron ?</div>\n<div>Mon front est rouge encor du baiser de la Reine ;</div>\n<div>J'ai rêvé dans la Grotte où nage la sirène...</div>\n</div>","reference":"El Desdichado, Gérard de Nerval"},"frequence":{"cite":5,"sanctuaire":5,"plaines":5,"pont":5,"collines":12,"foret":12,"monts":18,"desert":18,"fleuve":24,"lac":24,"marais":24,"gouffre":24,"necropole":20,"desolation":20,"mauvaise":1},"description":""},"effects":[],"flags":{"core":{"sourceId":"Item.3SA5An6kPlpcDEIj"}},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.1.0","coreVersion":"10.288","createdTime":1667846036340,"modifiedTime":1668036933994,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"},"_id":"uhdiBoim26qSmVJ7","folder":null,"sort":0,"ownership":{"default":0,"Hp9ImM4o9YRTSdfu":3}}
|
{"name":"Mangeur de Rêve","type":"rencontre","img":"systems/foundryvtt-reve-de-dragon/icons/queue_dragon.webp","system":{"genre":"m","formule":"1d6","refoulement":2,"presentCite":false,"mauvaiseRencontre":true,"ordreTri":21,"force":0,"coord":"","date":"","heure":"","succes":{"effets":[],"message":"Le {{{rencontre.name}}} claque de sa machoire dans le vide avant de fuir.","poesie":"<p>Rois ! la bure est souvent jalouse du velours.<br>Le peuple a froid l'hiver, le peuple a faim toujours.<br>Rendez-lui son sort plus facile.<br>Le peuple souvent porte un bien rude collier.<br>Ouvrez l'école aux fils, aux pères l'atelier,<br>À tous vos bras, auguste asile !</p>","reference":"Conseil, Victor Hugo"},"echec":{"effets":["reve-f"],"message":"Le {{{rencontre.name}}} croque votre Rêve ! Il emporte {{rencontre.system.force}} de vos points de rêve actuels","poesie":"<div>\n<div>Suis-je Amour ou Phébus ?... Lusignan ou Biron ?</div>\n<div>Mon front est rouge encor du baiser de la Reine ;</div>\n<div>J'ai rêvé dans la Grotte où nage la sirène...</div>\n</div>","reference":"El Desdichado, Gérard de Nerval"},"frequence":{"cite":5,"sanctuaire":5,"plaines":5,"pont":5,"collines":12,"foret":12,"monts":18,"desert":18,"fleuve":24,"lac":24,"marais":24,"gouffre":24,"necropole":20,"desolation":20,"mauvaise":1},"description":""},"effects":[],"flags":{"core":{"sourceId":"Item.3SA5An6kPlpcDEIj"}},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.1.0","coreVersion":"10.288","createdTime":1667846036340,"modifiedTime":1668036933994,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"},"_id":"uhdiBoim26qSmVJ7","folder":null,"sort":0,"ownership":{"default":0,"Hp9ImM4o9YRTSdfu":3}}
|
||||||
{"name":"Mangeur de Rêve","type":"rencontre","img":"systems/foundryvtt-reve-de-dragon/icons/queue_dragon.webp","system":{"genre":"m","formule":"2d6","refoulement":2,"presentCite":false,"mauvaiseRencontre":true,"ordreTri":22,"force":0,"coord":"","date":"","heure":"","succes":{"effets":[],"message":"Le {{rencontre.name}} claque de sa machoire dans le vide avant de fuir.","poesie":"<p>Rois ! la bure est souvent jalouse du velours.<br>Le peuple a froid l'hiver, le peuple a faim toujours.<br>Rendez-lui son sort plus facile.<br>Le peuple souvent porte un bien rude collier.<br>Ouvrez l'école aux fils, aux pères l'atelier,<br>À tous vos bras, auguste asile !</p>","reference":"Conseil, Victor Hugo"},"echec":{"effets":["reve-f"],"message":"Le {{rencontre.name}} croque votre Rêve ! Il emporte {{rencontre.system.force}} de vos points de rêve actuels","poesie":"<div>\n<div>Suis-je Amour ou Phébus ?... Lusignan ou Biron ?</div>\n<div>Mon front est rouge encor du baiser de la Reine ;</div>\n<div>J'ai rêvé dans la Grotte où nage la sirène...</div>\n</div>","reference":"El Desdichado, Gérard de Nerval"},"frequence":{"cite":5,"sanctuaire":5,"plaines":5,"pont":5,"collines":12,"foret":12,"monts":18,"desert":18,"fleuve":24,"lac":24,"marais":24,"gouffre":24,"necropole":20,"desolation":20,"mauvaise":1},"description":""},"effects":[],"flags":{"core":{"sourceId":"Item.3SA5An6kPlpcDEIj"}},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.1.0","coreVersion":"10.288","createdTime":1667846036340,"modifiedTime":1668036933994,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"},"_id":"yHm1Rqa8CP5qhg69","folder":null,"sort":0,"ownership":{"default":0,"Hp9ImM4o9YRTSdfu":3}}
|
{"name":"Mangeur de Rêve","type":"rencontre","img":"systems/foundryvtt-reve-de-dragon/icons/queue_dragon.webp","system":{"genre":"m","formule":"2d6","refoulement":2,"presentCite":false,"mauvaiseRencontre":true,"ordreTri":22,"force":0,"coord":"","date":"","heure":"","succes":{"effets":[],"message":"Le {{{rencontre.name}}} claque de sa machoire dans le vide avant de fuir.","poesie":"<p>Rois ! la bure est souvent jalouse du velours.<br>Le peuple a froid l'hiver, le peuple a faim toujours.<br>Rendez-lui son sort plus facile.<br>Le peuple souvent porte un bien rude collier.<br>Ouvrez l'école aux fils, aux pères l'atelier,<br>À tous vos bras, auguste asile !</p>","reference":"Conseil, Victor Hugo"},"echec":{"effets":["reve-f"],"message":"Le {{{rencontre.name}}} croque votre Rêve ! Il emporte {{rencontre.system.force}} de vos points de rêve actuels","poesie":"<div>\n<div>Suis-je Amour ou Phébus ?... Lusignan ou Biron ?</div>\n<div>Mon front est rouge encor du baiser de la Reine ;</div>\n<div>J'ai rêvé dans la Grotte où nage la sirène...</div>\n</div>","reference":"El Desdichado, Gérard de Nerval"},"frequence":{"cite":5,"sanctuaire":5,"plaines":5,"pont":5,"collines":12,"foret":12,"monts":18,"desert":18,"fleuve":24,"lac":24,"marais":24,"gouffre":24,"necropole":20,"desolation":20,"mauvaise":1},"description":""},"effects":[],"flags":{"core":{"sourceId":"Item.3SA5An6kPlpcDEIj"}},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.1.0","coreVersion":"10.288","createdTime":1667846036340,"modifiedTime":1668036933994,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"},"_id":"yHm1Rqa8CP5qhg69","folder":null,"sort":0,"ownership":{"default":0,"Hp9ImM4o9YRTSdfu":3}}
|
||||||
{"name":"Tourbillon blanc","type":"rencontre","img":"systems/foundryvtt-reve-de-dragon/icons/queue_dragon.webp","system":{"genre":"m","formule":"2d6+4","refoulement":2,"presentCite":false,"mauvaiseRencontre":true,"ordreTri":24,"force":0,"coord":"","date":"","heure":"","succes":{"effets":[],"message":"Le {{rencontre.name}} souleve une poussière blanche, vous tenez bon, et il tourbillonne en s'éloignant.","poesie":"<p>Le Premier Âge fut appelé l'Âge des Dragons. Ce fut le commencement<br>des temps, le commencement des rêves. Durant cette période plus mythique<br>que réellement historique, les Dragons aimaient à se rêver eux-mêmes.</p>","reference":"Rêve de Dragon, Denis Gerfaud"},"echec":{"effets":["reve-1","aleatoire","persistant"],"message":"Le souffle du {{rencontre.name}} vous déstabilise et vous emmène dans un nuage de poussière.","poesie":"<p>C'est l'essaim des Djinns qui passe,<br>Et tourbillonne en sifflant !<br>Les ifs, que leur vol fracasse,<br>Craquent comme un pin brûlant.</p>","reference":"Les Djinns, Victor Hugo"},"frequence":{"cite":4,"sanctuaire":4,"plaines":5,"pont":5,"collines":5,"foret":5,"monts":7,"desert":7,"fleuve":10,"lac":10,"marais":11,"gouffre":11,"necropole":15,"desolation":15,"mauvaise":1},"description":""},"effects":[],"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.rencontres.GIG8SbYrl60p50u3"}},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.1.0","coreVersion":"10.288","createdTime":1667846036337,"modifiedTime":1668036933995,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"},"_id":"yXZW5cDrGoZxD9lK","folder":null,"sort":0,"ownership":{"default":0,"Hp9ImM4o9YRTSdfu":3}}
|
{"name":"Tourbillon blanc","type":"rencontre","img":"systems/foundryvtt-reve-de-dragon/icons/queue_dragon.webp","system":{"genre":"m","formule":"2d6+4","refoulement":2,"presentCite":false,"mauvaiseRencontre":true,"ordreTri":24,"force":0,"coord":"","date":"","heure":"","succes":{"effets":[],"message":"Le {{{rencontre.name}}} souleve une poussière blanche, vous tenez bon, et il tourbillonne en s'éloignant.","poesie":"<p>Le Premier Âge fut appelé l'Âge des Dragons. Ce fut le commencement<br>des temps, le commencement des rêves. Durant cette période plus mythique<br>que réellement historique, les Dragons aimaient à se rêver eux-mêmes.</p>","reference":"Rêve de Dragon, Denis Gerfaud"},"echec":{"effets":["reve-1","aleatoire","persistant"],"message":"Le souffle du {{{rencontre.name}}} vous déstabilise et vous emmène dans un nuage de poussière.","poesie":"<p>C'est l'essaim des Djinns qui passe,<br>Et tourbillonne en sifflant !<br>Les ifs, que leur vol fracasse,<br>Craquent comme un pin brûlant.</p>","reference":"Les Djinns, Victor Hugo"},"frequence":{"cite":4,"sanctuaire":4,"plaines":5,"pont":5,"collines":5,"foret":5,"monts":7,"desert":7,"fleuve":10,"lac":10,"marais":11,"gouffre":11,"necropole":15,"desolation":15,"mauvaise":1},"description":""},"effects":[],"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.rencontres.GIG8SbYrl60p50u3"}},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.1.0","coreVersion":"10.288","createdTime":1667846036337,"modifiedTime":1668036933995,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"},"_id":"yXZW5cDrGoZxD9lK","folder":null,"sort":0,"ownership":{"default":0,"Hp9ImM4o9YRTSdfu":3}}
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
@@ -160,6 +160,20 @@ i:is(.fas, .far) {
|
|||||||
width: fit-content;
|
width: fit-content;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.system-foundryvtt-reve-de-dragon .sheet-header div.tmr-buttons {
|
||||||
|
padding: 0;
|
||||||
|
margin: 0;
|
||||||
|
flex: 0;
|
||||||
|
flex-direction: column;
|
||||||
|
}
|
||||||
|
|
||||||
|
.system-foundryvtt-reve-de-dragon .sheet-header div.tmr-buttons img.button-img {
|
||||||
|
max-width: 32px;
|
||||||
|
padding: 0;
|
||||||
|
margin-top: -8px;
|
||||||
|
margin-bottom: -8px;
|
||||||
|
}
|
||||||
|
|
||||||
.system-foundryvtt-reve-de-dragon .sheet-header :is(.header-compteurs,.header-etats,.profile-img){
|
.system-foundryvtt-reve-de-dragon .sheet-header :is(.header-compteurs,.header-etats,.profile-img){
|
||||||
padding: 0 3%;
|
padding: 0 3%;
|
||||||
}
|
}
|
||||||
@@ -585,7 +599,7 @@ input:is(.blessure-premiers_soins, .blessure-soins_complets) {
|
|||||||
.editor {
|
.editor {
|
||||||
border: 2;
|
border: 2;
|
||||||
height: fit-content;
|
height: fit-content;
|
||||||
min-height: 8rem;
|
min-height: 5rem;
|
||||||
padding: 0 3px;
|
padding: 0 3px;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -597,7 +611,7 @@ input:is(.blessure-premiers_soins, .blessure-soins_complets) {
|
|||||||
|
|
||||||
.small-editor {
|
.small-editor {
|
||||||
border: 2;
|
border: 2;
|
||||||
min-height: 4rem;
|
min-height: 2rem;
|
||||||
padding: 0 3px;
|
padding: 0 3px;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -757,11 +771,41 @@ div.placeholder-resolution span.table-proba-reussite{
|
|||||||
input[type="date"],
|
input[type="date"],
|
||||||
input[type="time"]) {
|
input[type="time"]) {
|
||||||
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.1);
|
||||||
border: 0 none;
|
border: 0 none;
|
||||||
margin-bottom: 0.2rem;
|
margin-bottom: 0.2rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
input[type="number"] {
|
||||||
|
text-align: right;
|
||||||
|
padding-right: 0.5rem;
|
||||||
|
max-width: 7rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
select:is(.number-x,.number-x2,.number-x3,.number-x4,.number-x5) {
|
||||||
|
padding-right: 0.2rem;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
input:is(.number,.number-x,.number-x2,.number-x3,.number-x4,.number-x5) {
|
||||||
|
padding-right: 0.2rem;
|
||||||
|
text-align: right;
|
||||||
|
}
|
||||||
|
:is(input,select).number-x {
|
||||||
|
max-width: 1.4rem;
|
||||||
|
}
|
||||||
|
:is(input,select).number-x2 {
|
||||||
|
max-width: 2.4rem;
|
||||||
|
}
|
||||||
|
:is(input,select).number-x3 {
|
||||||
|
max-width: 3.4rem;
|
||||||
|
}
|
||||||
|
:is(input,select).number-x4 {
|
||||||
|
max-width: 4.4rem;
|
||||||
|
}
|
||||||
|
:is(input,select).number-x5 {
|
||||||
|
max-width: 4.4rem;
|
||||||
|
}
|
||||||
|
|
||||||
form.rdddialogchrono input[type=datetime-local] {
|
form.rdddialogchrono input[type=datetime-local] {
|
||||||
min-width: 20px;
|
min-width: 20px;
|
||||||
padding: 0;
|
padding: 0;
|
||||||
@@ -804,7 +848,21 @@ section.sheet-body:after {
|
|||||||
display: block;
|
display: block;
|
||||||
clear: both;
|
clear: both;
|
||||||
}
|
}
|
||||||
|
a.rdd-world-content-link i {
|
||||||
|
color: var(--color-text-dark-inactive);
|
||||||
|
margin-right: 0.25em;
|
||||||
|
}
|
||||||
|
a.rdd-world-content-link {
|
||||||
|
background: hsla(280, 50%, 50%, 0.1);
|
||||||
|
padding: 1px 4px;
|
||||||
|
border: 1px solid var(--color-border-dark-tertiary);
|
||||||
|
border-radius: 2px;
|
||||||
|
white-space: nowrap;
|
||||||
|
word-break: break-all;
|
||||||
|
}
|
||||||
|
a.content-link {
|
||||||
|
background: hsla(45, 100%, 80%, 0.2);
|
||||||
|
}
|
||||||
|
|
||||||
li label.compteur {
|
li label.compteur {
|
||||||
display: inline-block;
|
display: inline-block;
|
||||||
|
|||||||
13
system.json
13
system.json
@@ -1,8 +1,8 @@
|
|||||||
{
|
{
|
||||||
"id": "foundryvtt-reve-de-dragon",
|
"id": "foundryvtt-reve-de-dragon",
|
||||||
"title": "Rêve de Dragon",
|
"title": "Rêve de Dragon",
|
||||||
"version": "10.3.15",
|
"version": "10.4.1",
|
||||||
"download": "https://www.uberwald.me/gitea/public/foundryvtt-reve-de-dragon/archive/foundryvtt-reve-de-dragon-10.3.15.zip",
|
"download": "https://www.uberwald.me/gitea/public/foundryvtt-reve-de-dragon/archive/foundryvtt-reve-de-dragon-10.4.1.zip",
|
||||||
"manifest": "https://www.uberwald.me/gitea/public/foundryvtt-reve-de-dragon/raw/v10/system.json",
|
"manifest": "https://www.uberwald.me/gitea/public/foundryvtt-reve-de-dragon/raw/v10/system.json",
|
||||||
"compatibility": {
|
"compatibility": {
|
||||||
"minimum": "10",
|
"minimum": "10",
|
||||||
@@ -161,6 +161,15 @@
|
|||||||
"private": false,
|
"private": false,
|
||||||
"flags": {}
|
"flags": {}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"name": "macros",
|
||||||
|
"label": "Macros Rêve de Dragon",
|
||||||
|
"system": "foundryvtt-reve-de-dragon",
|
||||||
|
"path": "packs/macros.db",
|
||||||
|
"type": "Macro",
|
||||||
|
"private": false,
|
||||||
|
"flags": {}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"name": "queues-de-dragon",
|
"name": "queues-de-dragon",
|
||||||
"label": "Queues de Dragon",
|
"label": "Queues de Dragon",
|
||||||
|
|||||||
@@ -97,10 +97,6 @@
|
|||||||
"etat": {
|
"etat": {
|
||||||
"value": 0,
|
"value": 0,
|
||||||
"label": "Etat général"
|
"label": "Etat général"
|
||||||
},
|
|
||||||
"surenc": {
|
|
||||||
"value": 0,
|
|
||||||
"label": "Sur-encombrement"
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"attributs": {
|
"attributs": {
|
||||||
@@ -231,10 +227,6 @@
|
|||||||
"etat": {
|
"etat": {
|
||||||
"value": 0,
|
"value": 0,
|
||||||
"label": "Etat général"
|
"label": "Etat général"
|
||||||
},
|
|
||||||
"surenc": {
|
|
||||||
"value": 0,
|
|
||||||
"label": "Sur-encombrement"
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -530,10 +522,6 @@
|
|||||||
"value": 0,
|
"value": 0,
|
||||||
"label": "Etat général"
|
"label": "Etat général"
|
||||||
},
|
},
|
||||||
"surenc": {
|
|
||||||
"value": 0,
|
|
||||||
"label": "Sur-encombrement"
|
|
||||||
},
|
|
||||||
"ethylisme": {
|
"ethylisme": {
|
||||||
"value": 1,
|
"value": 1,
|
||||||
"label": "Ethylisme",
|
"label": "Ethylisme",
|
||||||
@@ -574,6 +562,7 @@
|
|||||||
"recettealchimique", "musique", "chant", "danse", "jeu", "recettecuisine", "oeuvre",
|
"recettealchimique", "musique", "chant", "danse", "jeu", "recettecuisine", "oeuvre",
|
||||||
"objet", "arme", "armure", "conteneur", "herbe", "ingredient", "faune", "livre", "potion", "munition",
|
"objet", "arme", "armure", "conteneur", "herbe", "ingredient", "faune", "livre", "potion", "munition",
|
||||||
"monnaie", "nourritureboisson", "gemme",
|
"monnaie", "nourritureboisson", "gemme",
|
||||||
|
"service",
|
||||||
"meditation", "rencontre", "queue", "ombre", "souffle", "tete", "casetmr", "signedraconique", "sort", "sortreserve",
|
"meditation", "rencontre", "queue", "ombre", "souffle", "tete", "casetmr", "signedraconique", "sort", "sortreserve",
|
||||||
"nombreastral", "tache", "maladie", "poison", "possession",
|
"nombreastral", "tache", "maladie", "poison", "possession",
|
||||||
"tarot", "extraitpoetique"
|
"tarot", "extraitpoetique"
|
||||||
@@ -753,6 +742,12 @@
|
|||||||
"prpermanent": false,
|
"prpermanent": false,
|
||||||
"prdate": 0
|
"prdate": 0
|
||||||
},
|
},
|
||||||
|
"service": {
|
||||||
|
"templates": [ "description"],
|
||||||
|
"illimite": false,
|
||||||
|
"items": [],
|
||||||
|
"services": []
|
||||||
|
},
|
||||||
"musique": {
|
"musique": {
|
||||||
"templates": [ "description" ],
|
"templates": [ "description" ],
|
||||||
"niveau": "",
|
"niveau": "",
|
||||||
|
|||||||
@@ -60,6 +60,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/inventaire-monnaie.html"}}
|
||||||
{{> "systems/foundryvtt-reve-de-dragon/templates/actor/inventaire.html"}}
|
{{> "systems/foundryvtt-reve-de-dragon/templates/actor/inventaire.html"}}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
<form class="{{cssClass}}" autocomplete="off">
|
<form class="{{cssClass}}" autocomplete="off">
|
||||||
|
|
||||||
{{>'systems/foundryvtt-reve-de-dragon/templates/scripts/autocomplete-script.hbs'}}
|
{{>'systems/foundryvtt-reve-de-dragon/templates/scripts/autocomplete-script.hbs'}}
|
||||||
|
|
||||||
{{!-- Sheet Header --}}
|
{{!-- Sheet Header --}}
|
||||||
@@ -14,6 +13,7 @@
|
|||||||
<img class="profile-img" src="{{img}}" data-edit="img" title="{{name}}" />
|
<img class="profile-img" src="{{img}}" data-edit="img" title="{{name}}" />
|
||||||
{{>"systems/foundryvtt-reve-de-dragon/templates/actor/header-compteurs.html"}}
|
{{>"systems/foundryvtt-reve-de-dragon/templates/actor/header-compteurs.html"}}
|
||||||
{{>"systems/foundryvtt-reve-de-dragon/templates/actor/header-etat.html"}}
|
{{>"systems/foundryvtt-reve-de-dragon/templates/actor/header-etat.html"}}
|
||||||
|
{{>"systems/foundryvtt-reve-de-dragon/templates/actor/header-hautreve.html"}}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -35,7 +35,6 @@
|
|||||||
|
|
||||||
{{!-- Carac Tab --}}
|
{{!-- Carac Tab --}}
|
||||||
<div class="tab items" data-group="primary" data-tab="carac">
|
<div class="tab items" data-group="primary" data-tab="carac">
|
||||||
TEST
|
|
||||||
<div class="flexrow">
|
<div class="flexrow">
|
||||||
{{>"systems/foundryvtt-reve-de-dragon/templates/actor/vue-detaillee.html"}}
|
{{>"systems/foundryvtt-reve-de-dragon/templates/actor/vue-detaillee.html"}}
|
||||||
</div>
|
</div>
|
||||||
@@ -120,7 +119,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/inventaire-monnaie.html"}}
|
||||||
{{> "systems/foundryvtt-reve-de-dragon/templates/actor/inventaire.html"}}
|
{{> "systems/foundryvtt-reve-de-dragon/templates/actor/inventaire.html"}}
|
||||||
{{> "systems/foundryvtt-reve-de-dragon/templates/actor/liens-animaux.html"}}
|
{{> "systems/foundryvtt-reve-de-dragon/templates/actor/liens-animaux.html"}}
|
||||||
{{> "systems/foundryvtt-reve-de-dragon/templates/actor/liens-suivants.html"}}
|
{{> "systems/foundryvtt-reve-de-dragon/templates/actor/liens-suivants.html"}}
|
||||||
|
|||||||
@@ -91,6 +91,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/inventaire-monnaie.html"}}
|
||||||
{{> "systems/foundryvtt-reve-de-dragon/templates/actor/inventaire.html"}}
|
{{> "systems/foundryvtt-reve-de-dragon/templates/actor/inventaire.html"}}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|||||||
@@ -11,15 +11,6 @@
|
|||||||
<span class="repos">
|
<span class="repos">
|
||||||
<a title="Repos"><img class="button-img" src="icons/svg/sleep.svg" alt="Se reposer"/></a>
|
<a title="Repos"><img class="button-img" src="icons/svg/sleep.svg" alt="Se reposer"/></a>
|
||||||
</span>
|
</span>
|
||||||
{{#if system.attributs.hautrevant.value}}
|
|
||||||
<span class="monte-tmr">
|
|
||||||
<a title="Montée dans les Terres Médianes !" {{#if hautreve.isDemiReve}}disabled{{/if}}><img class="button-img" src="systems/foundryvtt-reve-de-dragon/styles/img/ui/icon-tmr-normal.svg" alt="Montée dans les Terres Médianes !"/></a></span>
|
|
||||||
<span class="monte-tmr-rapide">
|
|
||||||
<a title="Montée accélérée dans les Terres Médianes !"><img class="button-img" src="systems/foundryvtt-reve-de-dragon/styles/img/ui/icon-tmr-rapide.svg" alt="Montée accélérée dans les Terres Médianes !"/></a></span>
|
|
||||||
<span class="visu-tmr">
|
|
||||||
<a title="Regarder les Terres Médianes"><img class="button-img" src="systems/foundryvtt-reve-de-dragon/styles/img/ui/icon-tmr-view.svg" alt="Regarder les Terres Médianes"/></a>
|
|
||||||
</span>
|
|
||||||
{{/if}}
|
|
||||||
{{#if @root.options.isGM}}
|
{{#if @root.options.isGM}}
|
||||||
<span class="remise-a-neuf">
|
<span class="remise-a-neuf">
|
||||||
<a title="Remise à neuf"><img class="button-img" src="icons/svg/regen.svg" alt="Remise à neuf"/></a>
|
<a title="Remise à neuf"><img class="button-img" src="icons/svg/regen.svg" alt="Remise à neuf"/></a>
|
||||||
|
|||||||
@@ -21,7 +21,7 @@
|
|||||||
<li>
|
<li>
|
||||||
<label class="appliquerFatigue compteur 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 ({{calc.fatigue.malus}})
|
||||||
<a class="fatigue-moins"><i class="fas fa-minus-square"></i></a>
|
<a class="fatigue-moins"><i class="fas fa-minus-square"></i></a>
|
||||||
<input class="resource-content" type="text" name="system.sante.fatigue.value" value="{{system.sante.fatigue.value}}" data-dtype="Number" />
|
<input class="resource-content" type="text" name="system.sante.fatigue.value" value="{{system.sante.fatigue.value}}" data-dtype="Number" />
|
||||||
<span>/ {{system.sante.fatigue.max}}</span>
|
<span>/ {{system.sante.fatigue.max}}</span>
|
||||||
|
|||||||
@@ -1,10 +1,7 @@
|
|||||||
<div class="flex-group-left header-etats">
|
<div class="flex-group-left header-etats">
|
||||||
<div class="flexcol">
|
<div class="flexcol">
|
||||||
<span class="appliquerFatigue tooltip tooltip-dotted">Fatigue: {{calc.fatigue.malus}}
|
|
||||||
<span class="tooltiptext ttt-fatigue">{{{calc.fatigue.html}}}</span>
|
|
||||||
</span>
|
|
||||||
<span>{{system.compteurs.etat.label}}: {{system.compteurs.etat.value}}</span>
|
<span>{{system.compteurs.etat.label}}: {{system.compteurs.etat.value}}</span>
|
||||||
<span>{{system.compteurs.surenc.label}}: {{system.compteurs.surenc.value}}</span>
|
<span>Sur-encombrement: {{calc.surenc}}</span>
|
||||||
<span>{{calc.resumeBlessures}}</span>
|
<span>{{calc.resumeBlessures}}</span>
|
||||||
{{>"systems/foundryvtt-reve-de-dragon/templates/actor/header-effects.html"}}
|
{{>"systems/foundryvtt-reve-de-dragon/templates/actor/header-effects.html"}}
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
17
templates/actor/header-hautreve.html
Normal file
17
templates/actor/header-hautreve.html
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
{{#if system.attributs.hautrevant.value}}
|
||||||
|
<div class="tmr-buttons">
|
||||||
|
<span class="monte-tmr">
|
||||||
|
<a title="Montée dans les Terres Médianes !" {{#if hautreve.isDemiReve}}disabled{{/if}}>
|
||||||
|
<img class="button-img" src="systems/foundryvtt-reve-de-dragon/styles/img/ui/icon-tmr-normal.svg" alt="Montée dans les Terres Médianes !"/>
|
||||||
|
</a>
|
||||||
|
</span>
|
||||||
|
<span class="monte-tmr-rapide">
|
||||||
|
<a title="Montée accélérée dans les Terres Médianes !" {{#if hautreve.isDemiReve}}disabled{{/if}}>
|
||||||
|
<img class="button-img" src="systems/foundryvtt-reve-de-dragon/styles/img/ui/icon-tmr-rapide.svg" alt="Montée accélérée dans les Terres Médianes !"/>
|
||||||
|
</a>
|
||||||
|
</span>
|
||||||
|
<span class="visu-tmr">
|
||||||
|
<a title="Regarder les Terres Médianes"><img class="button-img" src="systems/foundryvtt-reve-de-dragon/styles/img/ui/icon-tmr-view.svg" alt="Regarder les Terres Médianes"/></a>
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
{{/if}}
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
<span class="item-name"><h4>Argent et Monnaies (fortune: {{calc.fortune}} sols)</h4></span>
|
<span class="item-name"><h4>Argent et Monnaies (fortune: {{calc.fortune.sols}} sols {{calc.fortune.deniers}} deniers)</h4></span>
|
||||||
<ul class="item-list alterne-list">
|
<ul class="item-list alterne-list">
|
||||||
{{#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}}">
|
||||||
|
|||||||
@@ -1,5 +1,3 @@
|
|||||||
{{> "systems/foundryvtt-reve-de-dragon/templates/actor/inventaire-monnaie.html" monnaie=monnaie}}
|
|
||||||
|
|
||||||
<h4>Equipement</h4>
|
<h4>Equipement</h4>
|
||||||
<span class="item-name">
|
<span class="item-name">
|
||||||
<a class="chat-card-button creer-un-objet">Nouvel objet</a>
|
<a class="chat-card-button creer-un-objet">Nouvel objet</a>
|
||||||
|
|||||||
@@ -1 +1,6 @@
|
|||||||
<a class="content-link" draggable="true" data-pack="{{pack}}" data-uuid="Compendium.{{pack}}.{{id}}" data-id="{{id}}"><i class="fas fa-suitcase"></i>{{name}}</a>
|
{{#if pack}}
|
||||||
|
{{!-- draggable="true" --}}
|
||||||
|
<a class="content-link" data-pack="{{pack}}" data-uuid="Compendium.{{pack}}.{{id}}" data-id="{{id}}"><i class="fas fa-suitcase"></i>{{name}}</a>
|
||||||
|
{{else}}
|
||||||
|
<a class="rdd-world-content-link" data-id="{{id}}"><i class="fas fa-suitcase"></i>{{name}}</a>
|
||||||
|
{{/if}}
|
||||||
|
|||||||
@@ -2,15 +2,17 @@
|
|||||||
<div>
|
<div>
|
||||||
<div class="flexrow flex-center">
|
<div class="flexrow flex-center">
|
||||||
<div>
|
<div>
|
||||||
{{#if vendeur}}
|
{{#if service}}
|
||||||
|
<img class="chat-icon" src="{{service.img}}" title="{{service.name}}" alt="{{service.name}}" />
|
||||||
|
{{else if vendeur}}
|
||||||
<img class="chat-icon" src="{{vendeur.img}}" title="{{vendeur.name}}" alt="{{vendeur.name}}" />
|
<img class="chat-icon" src="{{vendeur.img}}" title="{{vendeur.name}}" alt="{{vendeur.name}}" />
|
||||||
{{else}}
|
{{else}}
|
||||||
<img class="chat-icon" src="systems/foundryvtt-reve-de-dragon/styles/img/ui/icon_echoppe.webp" title="Un commerçant" alt="Vendeur MJ" />
|
<img class="chat-icon" src="systems/foundryvtt-reve-de-dragon/styles/img/ui/icon_echoppe.webp" title="Un commerçant" alt="Vendeur MJ" />
|
||||||
{{/if}}
|
{{/if}}
|
||||||
</div>
|
</div>
|
||||||
<div><i class="fas fa-sign-out-alt"></i></div>
|
<div><i class="fa-solid fa-arrow-right-long"></i></div>
|
||||||
<div><img class="chat-icon" src="{{item.img}}" title="{{item.name}}" alt="{{item.name}}" /></div>
|
<div><img class="chat-icon" src="{{item.img}}" title="{{item.name}}" alt="{{item.name}}" /></div>
|
||||||
<div><i class="fas fa-sign-in-alt"></i></div>
|
<div><i class="fa-solid fa-arrow-right-long"></i></div>
|
||||||
<div>
|
<div>
|
||||||
{{#if acheteur}}
|
{{#if acheteur}}
|
||||||
<img class="chat-icon" src="{{acheteur.img}}" title="{{acheteur.name}}" alt="{{acheteur.name}}" />
|
<img class="chat-icon" src="{{acheteur.img}}" title="{{acheteur.name}}" alt="{{acheteur.name}}" />
|
||||||
@@ -40,8 +42,10 @@
|
|||||||
{{else}}Quantité{{/if}}
|
{{else}}Quantité{{/if}}
|
||||||
</label>
|
</label>
|
||||||
<div class="flexrow">
|
<div class="flexrow">
|
||||||
<input name="nombreLots" class="nombreLots flex-shrink" type="number" min="1" max="{{quantiteNbLots}}"
|
<input name="nombreLots" class="nombreLots flex-shrink number-x2" type="number" min="1"
|
||||||
value="{{choix.nombreLots}}" data-dtype="Number" />
|
{{#unless quantiteIllimite}} max="{{quantiteNbLots}}" {{/unless}}
|
||||||
|
value="{{choix.nombreLots}}"
|
||||||
|
data-dtype="Number" />
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@@ -50,8 +54,7 @@
|
|||||||
|
|
||||||
{{#if item.system.sust}}
|
{{#if item.system.sust}}
|
||||||
<p>Cette {{#if item.system.boisson}}boisson{{else}}nourriture{{/if}} vous apportera
|
<p>Cette {{#if item.system.boisson}}boisson{{else}}nourriture{{/if}} vous apportera
|
||||||
<span class="total-sust">{{totalSust}}</span>
|
<span class="total-sust">{{totalSust}}</span> de sustantation.</p>
|
||||||
de sustantation.</p>
|
|
||||||
{{/if}}
|
{{/if}}
|
||||||
{{#if item.system.boisson}}
|
{{#if item.system.boisson}}
|
||||||
<p>
|
<p>
|
||||||
@@ -86,9 +89,9 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="flexrow flex-group-left">
|
<div class="flexrow flex-group-left">
|
||||||
<label>Prix total</label>
|
<label>Prix total</label>
|
||||||
<span class="flexrow">
|
<span>
|
||||||
<span class="prixTotal">{{prixTotal}}</span>
|
<span class="prixTotal">{{prixTotal}}</span>
|
||||||
<span>Sols</span>
|
Sols
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
{{/if}}
|
{{/if}}
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
<h4>{{item.name}}</h4>
|
<h4>{{item.name}}</h4>
|
||||||
<div class="flexrow">
|
<div class="flexrow">
|
||||||
<label class="flex-grow">Quantité à {{#if item.system.boisson}}boire{{else}}manger{{/if}}</label>
|
<label class="flex-grow">Quantité à {{#if item.system.boisson}}boire{{else}}manger{{/if}}</label>
|
||||||
<input class="attribute-value consommer-doses flex-shrink" type="number" name="doses" value="{{choix.doses}}"
|
<input class="attribute-value consommer-doses flex-shrink number-x2" type="number" name="doses" value="{{choix.doses}}"
|
||||||
min="0" max="{{item.system.quantite}}" data-dtype="Number" />
|
min="0" max="{{item.system.quantite}}" data-dtype="Number" />
|
||||||
</div>
|
</div>
|
||||||
{{#if item.system.sust}}
|
{{#if item.system.sust}}
|
||||||
|
|||||||
@@ -4,7 +4,7 @@
|
|||||||
<label>Quantité totale : {{item.system.quantite}}</label>
|
<label>Quantité totale : {{item.system.quantite}}</label>
|
||||||
<div class="flexrow">
|
<div class="flexrow">
|
||||||
<label class="flex-grow">Quantité à séparer</label>
|
<label class="flex-grow">Quantité à séparer</label>
|
||||||
<input class="attribute-value choix-quantite flex-shrink" type="number" name="choix.quantite" value="{{choix.quantite}}"
|
<input class="attribute-value choix-quantite flex-shrink number-x2" type="number" name="choix.quantite" value="{{choix.quantite}}"
|
||||||
min="1" max="{{choix.max}}" data-dtype="Number" />
|
min="1" max="{{choix.max}}" data-dtype="Number" />
|
||||||
</div>
|
</div>
|
||||||
</form>
|
</form>
|
||||||
|
|||||||
@@ -16,13 +16,13 @@
|
|||||||
quantiteIllimite}}checked{{/if}} />
|
quantiteIllimite}}checked{{/if}} />
|
||||||
<label class="label-quantiteIllimite flex-shrink">Illimités</label>
|
<label class="label-quantiteIllimite flex-shrink">Illimités</label>
|
||||||
{{/unless}}
|
{{/unless}}
|
||||||
<input name="quantiteNbLots" class="quantiteNbLots flex-shrink" type="number" min="1"
|
<input name="quantiteNbLots" class="quantiteNbLots flex-shrink number-x2" type="number" min="1"
|
||||||
max="{{quantiteMaxLots}}" value="{{quantiteNbLots}}" data-dtype="Number" />
|
max="{{quantiteMaxLots}}" value="{{quantiteNbLots}}" data-dtype="Number" />
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="flexrow flex-group-left">
|
<div class="flexrow flex-group-left">
|
||||||
<label for="tailleLot">Taille d'un lot</label>
|
<label for="tailleLot">Taille d'un lot</label>
|
||||||
<input name="tailleLot" class="tailleLot flex-shrink" type="number" min="1"
|
<input name="tailleLot" class="tailleLot flex-shrink number-x2" type="number" min="1"
|
||||||
max="{{quantiteMax}}" value="{{tailleLot}}" data-dtype="Number" />
|
max="{{quantiteMax}}" value="{{tailleLot}}" data-dtype="Number" />
|
||||||
</div>
|
</div>
|
||||||
<div class="flexrow flex-group-left">
|
<div class="flexrow flex-group-left">
|
||||||
|
|||||||
23
templates/dialog-roll.html
Normal file
23
templates/dialog-roll.html
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
<form class="skill-roll-dialog">
|
||||||
|
<h2 class="dialog-roll-title"></h2>
|
||||||
|
{{log 'dialog-roll' this}}
|
||||||
|
<div class="grid grid-2col">
|
||||||
|
<div class="flex-group-left">
|
||||||
|
<div class="flexrow">
|
||||||
|
<label>Caractéristique</label>
|
||||||
|
{{>"systems/foundryvtt-reve-de-dragon/templates/partial-select-carac.html"}}
|
||||||
|
</div>
|
||||||
|
{{>"systems/foundryvtt-reve-de-dragon/templates/partial-roll-competences.html"}}
|
||||||
|
{{>"systems/foundryvtt-reve-de-dragon/templates/partial-roll-surenc.html"}}
|
||||||
|
{{>"systems/foundryvtt-reve-de-dragon/templates/partial-roll-enctotal.html"}}
|
||||||
|
</div>
|
||||||
|
<div class="flex-group-left">
|
||||||
|
{{>"systems/foundryvtt-reve-de-dragon/templates/partial-roll-diffLibre.html"}}
|
||||||
|
{{>"systems/foundryvtt-reve-de-dragon/templates/partial-roll-diffCondition.html"}}
|
||||||
|
{{>"systems/foundryvtt-reve-de-dragon/templates/partial-roll-forcer.html"}}
|
||||||
|
{{>"systems/foundryvtt-reve-de-dragon/templates/partial-roll-moral.html"}}
|
||||||
|
<div class="placeholder-ajustements" class="flexrow"></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="placeholder-resolution"></div>
|
||||||
|
</form>
|
||||||
@@ -9,9 +9,7 @@
|
|||||||
<a class="item" data-tab="frequence">Fréquences</a>
|
<a class="item" data-tab="frequence">Fréquences</a>
|
||||||
{{/unless}}
|
{{/unless}}
|
||||||
</nav>
|
</nav>
|
||||||
|
|
||||||
<section class="sheet-body">
|
<section class="sheet-body">
|
||||||
|
|
||||||
<div class="tab items" data-group="primary" data-tab="rencontre">
|
<div class="tab items" data-group="primary" data-tab="rencontre">
|
||||||
{{#if isOwned}}
|
{{#if isOwned}}
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
|
|||||||
103
templates/item-service-sheet.html
Normal file
103
templates/item-service-sheet.html
Normal file
@@ -0,0 +1,103 @@
|
|||||||
|
<form class="{{cssClass}}" autocomplete="off">
|
||||||
|
{{>"systems/foundryvtt-reve-de-dragon/templates/header-item.html"}}
|
||||||
|
|
||||||
|
<section class="sheet-body">
|
||||||
|
<div class="flexcol form-group small-editor">
|
||||||
|
{{editor description target="system.description" button=true owner=owner editable=(or isGM isOwner) engine="prosemirror"}}
|
||||||
|
</div>
|
||||||
|
{{!--
|
||||||
|
<div class="flexcol">
|
||||||
|
<ul class="item-list alterne-list">
|
||||||
|
<li class="item flexrow list-item">
|
||||||
|
<label class="flex-grow">Service</label>
|
||||||
|
<label>Moral</label>
|
||||||
|
<label>Qualité</label>
|
||||||
|
<label>Prix (sols)</label>
|
||||||
|
<label>
|
||||||
|
{{#unless disabled}}
|
||||||
|
<a class="service-add"><i class="fas fa-plus-circle"></i></a>
|
||||||
|
{{/unless}}
|
||||||
|
</label>
|
||||||
|
</li>
|
||||||
|
{{#each system.services as |service key|}}
|
||||||
|
<li class="item flexrow list-item" data-key="{{key}}">
|
||||||
|
<input {{@root.disabled}} type="text" name="services[{{key}}].name" value="{{service.name}}" data-dtype="String" />
|
||||||
|
<input {{@root.disabled}} type="checkbox" name="services[{{key}}].system.moral" {{#if service.system.moral}}checked{{/if}} />
|
||||||
|
<input {{@root.disabled}} type="number" name="services[{{key}}].system.qualite" value="{{service.system.qualite}}" data-dtype="Number" min="-10" max="10"/>
|
||||||
|
<input {{@root.disabled}} type="number" class="input-prix" name="services[{{key}}].system.cout" value="{{numberFormat service.system.cout decimals=2 sign=false}}" data-dtype="Number" min="0" />
|
||||||
|
<div class="item-controls">
|
||||||
|
<a class="service-acheter" title="Acheter"><i class="fa-sharp fa-solid fa-coins"></i></a>
|
||||||
|
{{#unless @root.disabled}}
|
||||||
|
<a class="service-vendre" title="Proposer"><i class="fas fa-comments-dollar"></i></a>
|
||||||
|
<a class="service-delete" title="Supprimer"><i class="fas fa-trash"></i></a>
|
||||||
|
{{/unless}}
|
||||||
|
</div>
|
||||||
|
</li>
|
||||||
|
{{/each}}
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
<br>
|
||||||
|
--}}
|
||||||
|
<div class="form-group">
|
||||||
|
<input {{@root.disabled}} class="attribute-value" type="checkbox" name="system.illimite" {{#if system.illimite}}checked{{/if}}/>
|
||||||
|
<span for="system.illimite">Quantité en vente illimitée</span>
|
||||||
|
</div>
|
||||||
|
<div class="flexcol">
|
||||||
|
<ul class="item-list alterne-list">
|
||||||
|
<li class="item flexrow list-item">
|
||||||
|
<label class="flex-grow">A vendre</label>
|
||||||
|
{{#unless system.illimite}}
|
||||||
|
<label>Quantite</label>
|
||||||
|
{{/unless}}
|
||||||
|
<label>Prix (sols)</label>
|
||||||
|
<div class="item-controls">
|
||||||
|
{{#unless disabled}}
|
||||||
|
<a class="sub-item-info-add" title="Utiliser le drag&drop pour ajouter un objet dans la liste">
|
||||||
|
<i class="fa-solid fa-circle-info"></i>
|
||||||
|
</a>
|
||||||
|
{{/unless}}
|
||||||
|
</div>
|
||||||
|
</li>
|
||||||
|
{{#each system.items as |item key|}}
|
||||||
|
<li class="item flexrow list-item service-item" data-item-id="{{item.id}}" data-pack="{{item.pack}}" data-key="{{key}}">
|
||||||
|
<label class="flex-grow">
|
||||||
|
{{#if item.img}}<img class="sheet-competence-img" src="{{item.img}}" title="{{item.name}}"/>{{/if}}
|
||||||
|
{{> 'systems/foundryvtt-reve-de-dragon/templates/common/compendium-link.hbs'
|
||||||
|
pack=item.pack id=item.id name=item.name}}
|
||||||
|
</label>
|
||||||
|
{{#unless @root.system.illimite}}
|
||||||
|
<span class="flexrow">
|
||||||
|
{{#unless @root.disabled}}
|
||||||
|
<a class="sub-item-quantite-moins"><i class="fas fa-minus-square"></i></a>
|
||||||
|
{{/unless}}
|
||||||
|
<input {{@root.disabled}} type="number" class="sub-item-quantite" name="items[{{key}}].system.quantite" value="{{item.system.quantite}}" data-dtype="Number" />
|
||||||
|
{{#unless @root.disabled}}
|
||||||
|
<a class="sub-item-quantite-plus"><i class="fas fa-plus-square"></i></a>
|
||||||
|
{{/unless}}
|
||||||
|
</span>
|
||||||
|
{{/unless}}
|
||||||
|
<span class="flexrow">
|
||||||
|
<input {{@root.disabled}} type="number" class="input-prix number-x3 sub-item-cout" name="items[{{key}}].system.cout" value="{{numberFormat item.system.cout decimals=2 sign=false}}" data-dtype="Number" />
|
||||||
|
</span>
|
||||||
|
<div class="item-controls">
|
||||||
|
<a class="sub-item-acheter" title="Acheter"><i class="fa-regular fa-coins"></i></a>
|
||||||
|
{{#unless @root.disabled}}
|
||||||
|
<a class="sub-item-vendre" title="Vendre"><i class="fas fa-comments-dollar"></i></a>
|
||||||
|
<a class="sub-item-delete" title="Supprimer"><i class="fas fa-trash"></i></a>
|
||||||
|
{{/unless}}
|
||||||
|
</div>
|
||||||
|
</li>
|
||||||
|
{{/each}}
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
{{#if isGM}}
|
||||||
|
<br>
|
||||||
|
<div class="flexcol">
|
||||||
|
<span><label>Description (MJ seulement): </label></span>
|
||||||
|
<div class="form-group medium-editor">
|
||||||
|
{{editor descriptionmj target="system.descriptionmj" button=true owner=owner editable=true engine="prosemirror"}}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{{/if}}
|
||||||
|
</section>
|
||||||
|
</form>
|
||||||
@@ -1,25 +1,25 @@
|
|||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label for="system.qualite">Qualité</label>
|
<label for="system.qualite">Qualité</label>
|
||||||
<input class="attribute-value" type="text" name="system.qualite" value="{{system.qualite}}" data-dtype="Number"
|
<input class="attribute-value number-x3" type="number" name="system.qualite" value="{{system.qualite}}" data-dtype="Number"
|
||||||
{{#unless (isFieldInventaireModifiable type 'qualite')}}disabled{{/unless}}/>
|
{{#unless (isFieldInventaireModifiable type 'qualite')}}disabled{{/unless}}/>
|
||||||
</div>
|
</div>
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label for="system.encombrement">Encombrement</label>
|
<label for="system.encombrement">Encombrement</label>
|
||||||
<input class="attribute-value" type="text" name="system.encombrement" value="{{system.encombrement}}" data-dtype="Number"
|
<input class="attribute-value number-x3" type="number" name="system.encombrement" value="{{system.encombrement}}" data-dtype="Number"
|
||||||
{{#unless (isFieldInventaireModifiable type 'encombrement')}}disabled{{/unless}}/>
|
{{#unless (isFieldInventaireModifiable type 'encombrement')}}disabled{{/unless}}/>
|
||||||
</div>
|
</div>
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label for="system.quantite">Quantité {{uniteQuantite id actorId}}</label>
|
<label for="system.quantite">Quantité {{uniteQuantite id actorId}}</label>
|
||||||
<input class="attribute-value" type="text" name="system.quantite" value="{{system.quantite}}" data-dtype="Number"
|
<input class="attribute-value number-x3" type="number" name="system.quantite" value="{{system.quantite}}" data-dtype="Number"
|
||||||
{{#unless (isFieldInventaireModifiable type 'quantite')}}disabled{{/unless}}/>
|
{{#unless (isFieldInventaireModifiable type 'quantite')}}disabled{{/unless}}/>
|
||||||
</div>
|
</div>
|
||||||
<div class="form-group item-cout">
|
<div class="form-group item-cout">
|
||||||
<label for="system.cout">Prix (sols)</label>
|
<label for="system.cout">Prix (sols)</label>
|
||||||
{{#if (or (ne type 'monnaie') (gt system.cout 0))}}
|
{{#if (or (ne type 'monnaie') (gt system.cout 0))}}
|
||||||
<input class="attribute-value" type="text" name="system.cout" value="{{system.cout}}" data-dtype="Number"
|
<input class="input-prix attribute-value number-x3" type="number" name="system.cout" value="{{numberFormat system.cout decimals=2 sign=false}}" data-dtype="Number"
|
||||||
{{#unless (isFieldInventaireModifiable type 'cout')}}disabled{{/unless}}/>
|
{{#unless (isFieldInventaireModifiable type 'cout')}}disabled{{/unless}}/>
|
||||||
{{else}}
|
{{else}}
|
||||||
<input class="attribute-value field-error" type="text" name="system.cout" value="{{system.cout}}" data-dtype="Number"
|
<input class="input-prix attribute-value field-error number-x3" type="number" name="system.cout" value="{{numberFormat system.cout decimals=2 sign=false}}" data-dtype="Number"
|
||||||
{{#unless (isFieldInventaireModifiable type 'cout')}}disabled{{/unless}}/>
|
{{#unless (isFieldInventaireModifiable type 'cout')}}disabled{{/unless}}/>
|
||||||
{{/if}}
|
{{/if}}
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
<select name="carac" class="flex-grow" data-dtype="String">
|
<select name="carac" class="flex-grow" data-dtype="String">
|
||||||
{{#select carac}}
|
{{#select selectedCaracName}}
|
||||||
{{#each carac as |caracitem key|}}
|
{{#each carac as |caracitem key|}}
|
||||||
<option value={{key}}>{{caracitem.label}}</option>
|
<option value="{{key}}">{{caracitem.label}}</option>
|
||||||
{{/each}}
|
{{/each}}
|
||||||
{{/select}}
|
{{/select}}
|
||||||
</select>
|
</select>
|
||||||
|
|||||||
8
templates/post-item-service.html
Normal file
8
templates/post-item-service.html
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
<div class="post-item" data-transfer="{{transfer}}">
|
||||||
|
{{#if img}}
|
||||||
|
<img class="chat-icon" src="{{img}}" title="{{name}}" />
|
||||||
|
{{/if}}
|
||||||
|
<p>{{> 'systems/foundryvtt-reve-de-dragon/templates/common/compendium-link.hbs' pack=pack id=_id name=name}}</p>
|
||||||
|
<p class="card-content">{{{system.description}}}</p>
|
||||||
|
|
||||||
|
</div>
|
||||||
Reference in New Issue
Block a user