diff --git a/module/actor-sheet.js b/module/actor-sheet.js
index 19837d4e..15b7f27c 100644
--- a/module/actor-sheet.js
+++ b/module/actor-sheet.js
@@ -65,8 +65,9 @@ export class RdDActorSheet extends ActorSheet {
// Compute current carac sum
let sum = 0;
- for (let caracName in data.data.carac) {
- let currentCarac = data.data.carac[caracName];
+ let caracList = data.data.data.carac;
+ for (let caracName in caracList) {
+ let currentCarac = caracList[caracName];
if (!currentCarac.derivee) {
sum += parseInt(currentCarac.value);
}
@@ -106,9 +107,10 @@ export class RdDActorSheet extends ActorSheet {
}
this.armesList = duplicate(data.data.combat);
- data.data.carac.taille.isTaille = true; // To avoid button link;
- data.data.compteurs.chance.isChance = true;
- data.data.blessures.resume = this.actor.computeResumeBlessure(data.data.blessures);
+ caracList.isTaille = true; // To avoid button link;
+ let compteursList = data.data.data.compteurs
+ compteursList.chance.isChance = true;
+ data.data.data.blessures.resume = this.actor.computeResumeBlessure(data.data.data.blessures);
// Mise à jour de l'encombrement total et du prix de l'équipement
this.actor.computeEncombrementTotalEtMalusArmure();
@@ -125,16 +127,16 @@ export class RdDActorSheet extends ActorSheet {
// low is normal, this the base used to compute the grid.
data.data.fatigue = {
- malus: RdDUtility.calculMalusFatigue(data.data.sante.fatigue.value, data.data.sante.endurance.max),
- html: "
"
}
RdDUtility.filterItemsPerTypeForSheet(data);
- data.data.sortReserve = data.data.reve.reserve.list;
- data.data.rencontres = duplicate(data.data.reve.rencontre.list);
+ data.data.sortReserve = data.data.data.reve.reserve.list;
+ data.data.rencontres = duplicate(data.data.data.reve.rencontre.list);
data.data.caseSpeciales = data.itemsByType['casetmr'];
RdDUtility.buildArbreDeConteneur(this, data);
- data.data.surEncombrementMessage = (data.data.compteurs.surenc.value < 0) ? "Sur-Encombrement!" : "";
+ data.data.surEncombrementMessage = (data.data.data.compteurs.surenc.value < 0) ? "Sur-Encombrement!" : "";
data.data.vehiculesList = this.actor.buildVehiculesList();
data.data.monturesList = this.actor.buildMonturesList();
data.data.suivantsList = this.actor.buildSuivantsList();
@@ -199,7 +201,7 @@ export class RdDActorSheet extends ActorSheet {
html.find('.item-edit').click(ev => {
const li = $(ev.currentTarget).parents(".item");
- const item = this.actor.getOwnedItem(li.data("item-id"));
+ const item = this.actor.items.get(li.data("item-id"));
item.sheet.render(true);
});
// Update Inventory Item
diff --git a/module/actor.js b/module/actor.js
index 5ee13feb..b6c9ed62 100644
--- a/module/actor.js
+++ b/module/actor.js
@@ -60,6 +60,8 @@ export class RdDActor extends Actor {
if (data instanceof Array) {
return super.create(data, options);
}
+ console.log("****************************************************");
+
// If the created actor has items (only applicable to duplicated actors) bypass the new actor creation logic
if (data.items) {
let actor = super.create(data, options);
@@ -150,25 +152,28 @@ export class RdDActor extends Actor {
/* -------------------------------------------- */
async checkMonnaiePresence(items) { // Ajout opportuniste si les pièces n'existent pas.
if (!items) return; // Sanity check during import
- let piece = items.find(item => item.type == 'monnaie' && Number(item.data.valeur_deniers) == 1);
+ //console.log("NO MONNAIR FOUND!!!!", items);
+
+ let piece = items.find(item => item.data.type == 'monnaie' && Number(item.data.data.valeur_deniers) == 1 );
let newMonnaie = [];
if (!piece) {
newMonnaie.push(RdDUtility.createMonnaie("Etain (1 denier)", 1, "systems/foundryvtt-reve-de-dragon/icons/objets/piece_etain_poisson.webp"));
}
- piece = items.find(item => item.type == 'monnaie' && Number(item.data.valeur_deniers) == 10);
+ piece = items.find(item => item.data.type == 'monnaie' && Number(item.data.data.valeur_deniers) == 10);
if (!piece) {
newMonnaie.push(RdDUtility.createMonnaie("Bronze (10 deniers)", 10, "systems/foundryvtt-reve-de-dragon/icons/objets/piece_bronze_epees.webp"));
}
- piece = items.find(item => item.type == 'monnaie' && Number(item.data.valeur_deniers) == 100);
+ piece = items.find(item => item.data.type == 'monnaie' && Number(item.data.data.valeur_deniers) == 100);
if (!piece) {
newMonnaie.push(RdDUtility.createMonnaie("Argent (1 sol)", 100, "systems/foundryvtt-reve-de-dragon/icons/objets/piece_argent_sol.webp"));
}
- piece = items.find(item => item.type == 'monnaie' && Number(item.data.valeur_deniers) == 1000);
+ piece = items.find(item => item.data.type == 'monnaie' && Number(item.data.data.valeur_deniers) == 1000);
if (!piece) {
newMonnaie.push(RdDUtility.createMonnaie("Or (10 sols)", 1000, "systems/foundryvtt-reve-de-dragon/icons/objets/piece_or_sol.webp"));
}
if (newMonnaie.length > 0) {
- await this.createOwnedItem(newMonnaie);
+ await this.createEmbeddedDocuments("Item", newMonnaie );
+ //await this.createOwnedItem(newMonnaie);
}
}
@@ -304,24 +309,25 @@ export class RdDActor extends Actor {
}
/* -------------------------------------------- */
getBestDraconic() {
- const list = this.getDraconicList().sort((a, b) => b.data.niveau - a.data.niveau);
+ const list = this.getDraconicList().sort((a, b) => b.data.data.niveau - a.data.data.niveau);
if (list.length == 0) {
return { name: "none", data: { niveau: -11 } };
}
return duplicate(list[0]);
}
+ getDemiReve() {
+ return this.data.data.reve.tmrpos.coord;
+ }
/* -------------------------------------------- */
async deleteSortReserve(sortReserve) {
let reserve = duplicate(this.data.data.reve.reserve);
- let len = reserve.list.length;
- let i = 0;
- let newTable = [];
- for (i = 0; i < len; i++) {
- if (reserve.list[i].coord != sortReserve.coord && reserve.list[i].sort.name != sortReserve.sort.name)
- newTable.push(reserve.list[i]);
- }
- if (newTable.length != len) {
- reserve.list = newTable;
+ let tmr = TMRUtility.getTMR(sortReserve.coord);
+ let index = reserve.list.findIndex(tmr.type == 'fleuve'
+ ? sort => (TMRUtility.getTMR(sort.coord).type == 'fleuve' && sort.sort.name == sortReserve.sort.name)
+ : sort => (sort.coord == sortReserve.coord && sort.sort.name == sortReserve.sort.name)
+ );
+ if (index >=0 ) {
+ reserve.list.splice(index,1);
await this.update({ "data.reve.reserve": reserve });
}
}
@@ -749,8 +755,8 @@ export class RdDActor extends Actor {
content: message
});
}
- const update = { _id: comp._id, 'data.niveau': maxNiveau };
- const updated = await this.updateEmbeddedEntity("OwnedItem", update); // Updates one EmbeddedEntity
+ const update = [ { _id: comp.id, 'data.niveau': maxNiveau } ];
+ await this.updateEmbeddedDocuments("Item", update); // Updates one EmbeddedEntity
} else {
console.log("Competence not found", compName);
}
@@ -761,8 +767,8 @@ export class RdDActor extends Actor {
let comp = this.getCompetence(compName);
if (comp) {
this.checkCompetenceXP(compName, compValue);
- const update = { _id: comp._id, 'data.xp': compValue };
- const updated = await this.updateEmbeddedEntity("OwnedItem", update); // Updates one EmbeddedEntity
+ const update = [ { _id: comp.id, 'data.xp': compValue } ];
+ await this.updateEmbeddedDocuments("Item", update); // Updates one EmbeddedEntity
} else {
console.log("Competence not found", compName);
}
@@ -773,8 +779,8 @@ export class RdDActor extends Actor {
async updateCompetenceXPSort(compName, compValue) {
let comp = this.getCompetence(compName);
if (comp) {
- const update = { _id: comp._id, 'data.xp_sort': compValue };
- const updated = await this.updateEmbeddedEntity("OwnedItem", update); // Updates one EmbeddedEntity
+ const update = [ { _id: comp.id, 'data.xp_sort': compValue } ];
+ await this.updateEmbeddedDocuments("Item", update); // Updates one EmbeddedEntity
} else {
console.log("Competence not found", compName);
}
@@ -784,8 +790,8 @@ export class RdDActor extends Actor {
async updateCompetenceArchetype(compName, compValue) {
let comp = this.getCompetence(compName);
if (comp) {
- const update = { _id: comp._id, 'data.niveau_archetype': compValue };
- const updated = await this.updateEmbeddedEntity("OwnedItem", update); // Updates one EmbeddedEntity
+ const update = [ { _id: comp.id, 'data.niveau_archetype': compValue } ];
+ await this.updateEmbeddedDocuments("Item", update); // Updates one EmbeddedEntity
} else {
console.log("Competence not found", compName);
}
@@ -890,7 +896,7 @@ export class RdDActor extends Actor {
this.buildSubConteneurObjetList(itemId, list);
//console.log("List to delete", list);
for (let item of list) {
- await this.deleteOwnedItem(item.id);
+ await this.deleteEmbeddedDocuments("Item", [item.id] );
}
}
@@ -909,7 +915,7 @@ export class RdDActor extends Actor {
contenu.splice(index, 1);
index = contenu.indexOf(itemId);
}
- await this.updateEmbeddedEntity("OwnedItem", data2use);
+ await this.updateEmbeddedDocuments("Item", data2use);
}
}
@@ -922,7 +928,7 @@ export class RdDActor extends Actor {
if (conteneur && conteneur.type == 'conteneur') {
let data2use = duplicate(conteneur.data);
data2use.data.contenu.push(itemId);
- await this.updateEmbeddedEntity("OwnedItem", data2use);
+ await this.updateEmbeddedDocuments("Item", [data2use]);
}
}
@@ -937,7 +943,7 @@ export class RdDActor extends Actor {
}
}
if (conteneurFixedList.length > 0)
- await this.updateOwnedItem(conteneurFixedList);
+ await this.updateEmbeddedDocuments('Item', conteneurFixedList);
}
/* -------------------------------------------- */
@@ -950,7 +956,7 @@ export class RdDActor extends Actor {
let itemMap = {};
for (let item of itemsList) {
let srcItem = sourceActor.data.items.find(subItem => subItem._id == item.id);
- let newItem = await this.createOwnedItem(duplicate(srcItem));
+ let newItem = await this.createEmbeddedDocuments("Item", [ duplicate(srcItem) ] );
console.log('New object', newItem, srcItem);
itemMap[srcItem._id] = newItem._id; // Pour garder le lien ancien / nouveau
}
@@ -965,11 +971,11 @@ export class RdDActor extends Actor {
console.log('New conteneur filling!', newConteneur, newItemId, item);
let contenu = duplicate(newConteneur.data.contenu);
contenu.push(newItemId);
- await this.updateOwnedItem({ _id: newConteneurId, 'data.contenu': contenu });
+ await this.updateEmbeddedDocuments( "Item", [{ _id: newConteneurId, 'data.contenu': contenu } ]);
}
}
for (let item of itemsList) {
- await sourceActor.deleteOwnedItem(item.id);
+ await sourceActor.deleteEmbeddedDocuments("Item", [ item.id] );
}
}
@@ -1156,26 +1162,6 @@ export class RdDActor extends Actor {
return tmrInnaccessibles.map(it => it.data.coord);
}
- /* -------------------------------------------- */
- displayTMRQueueSouffleInformation() {
- let messages = [];
- for (let item of this.data.items) {
- if (EffetsDraconiques.isUrgenceDraconique(item)) {
- messages.push("Vous souffrez d'une Urgence Draconique : " + item.data.description);
- }
- if (EffetsDraconiques.isPeriple(item)) {
- messages.push("Vous souffrez du Souffle Périple. Vous devez gérer manuellement le détail du Périple. " + item.data.description);
- }
- }
-
- if (messages.length > 0) {
- ChatMessage.create({
- whisper: ChatUtility.getWhisperRecipientsAndGMs(game.user.name),
- content: "RAPPEL ! " + messages.join('')
- });
- }
- }
-
/* -------------------------------------------- */
getTMRRencontres() {
return this.data.data.reve.rencontre;
@@ -1189,7 +1175,7 @@ export class RdDActor extends Actor {
//console.log("List", rencontres, len);
let newTable = [];
for (i = 0; i < len; i++) {
- if (rencontres.list[i].coord != this.data.data.reve.tmrpos.coord)
+ if (rencontres.list[i].coord != this.getDemiReve())
newTable.push(rencontres.list[i]);
}
if (newTable.length != len) {
@@ -1206,7 +1192,7 @@ export class RdDActor extends Actor {
let i = 0;
let already = false;
for (i = 0; i < len; i++) {
- if (rencontres.list[i].coord == this.data.data.reve.tmrpos.coord)
+ if (rencontres.list[i].coord == this.getDemiReve())
already = true;
}
if (!already) {
@@ -1228,9 +1214,7 @@ export class RdDActor extends Actor {
/* -------------------------------------------- */
async updateCoordTMR(coord) {
- let tmrPos = duplicate(this.data.data.reve.tmrpos);
- tmrPos.coord = coord;
- await this.update({ "data.reve.tmrpos": tmrPos });
+ await this.update({ "data.reve.tmrpos.coord": coord });
}
/* -------------------------------------------- */
@@ -3152,7 +3136,7 @@ export class RdDActor extends Actor {
/* -------------------------------------------- */
_deleteStatusEffectsByIds(effectIds, options) {
- this.deleteEmbeddedEntity('ActiveEffect', effectIds, options);
+ this.deleteEmbeddedDocuments('ActiveEffect', effectIds, options);
this.applyActiveEffects();
}
@@ -3167,7 +3151,7 @@ export class RdDActor extends Actor {
this.deleteStatusEffectById(statusEffect.id, options);
const effet = duplicate(statusEffect);
effet["flags.core.statusId"] = effet.id;
- await this.createEmbeddedEntity('ActiveEffect', effet, options);
+ await this.createEmbeddedDocuments('ActiveEffect', effet, options);
this.applyActiveEffects();
}
@@ -3199,6 +3183,9 @@ export class RdDActor extends Actor {
case 'souffle':
await this.onDeleteOwnedDraconique(item, options, id);
break;
+ case 'casetmr':
+ await this.onDeleteOwnedCaseTmr(item, options, id);
+ break;
}
}
@@ -3220,6 +3207,13 @@ export class RdDActor extends Actor {
}
}
+ async onDeleteOwnedCaseTmr(item, options, id) {
+ let draconique = Draconique.all().find(it => it.isCase(item));
+ if (draconique) {
+ draconique.onActorDeleteCaseTmr(this, item)
+ }
+ }
+
notifyGestionTeteSouffleQueue(item, manualMessage=true){
ChatMessage.create({
whisper: ChatUtility.getWhisperRecipientsAndGMs(game.user.name),
diff --git a/module/chat-utility.js b/module/chat-utility.js
index d38514ca..ea6b4772 100644
--- a/module/chat-utility.js
+++ b/module/chat-utility.js
@@ -13,7 +13,7 @@ export class ChatUtility {
/* -------------------------------------------- */
static onRemoveMessages(part, gmId) {
- if (game.user._id == gmId) {
+ if (game.user.data._id == gmId) {
const toDelete = game.messages.filter(it => it.data.content.includes(part));
toDelete.forEach(it => it.delete());
}
@@ -22,10 +22,10 @@ export class ChatUtility {
/* -------------------------------------------- */
static removeChatMessageContaining(part) {
- const gmId = game.user.isGM ? game.user._id : game.users.entities.find(u => u.isGM)?.id;
+ const gmId = game.user.isGM ? game.user.data._id : game.users.entities.find(u => u.isGM)?.data.id;
if (!gmId || game.user.isGM) {
- ChatUtility.onRemoveMessages(part, game.user._id);
+ ChatUtility.onRemoveMessages(part, game.user.data._id);
}
else {
game.socket.emit("system.foundryvtt-reve-de-dragon", {
diff --git a/module/grammar.js b/module/grammar.js
index e75bdc77..7a35cebc 100644
--- a/module/grammar.js
+++ b/module/grammar.js
@@ -26,7 +26,7 @@ export class Grammar {
/* -------------------------------------------- */
static articleDetermine(genre) {
- switch (toLowerCaseNoAccent(genre)) {
+ switch (Grammar.toLowerCaseNoAccent(genre)) {
case 'f': case 'feminin': return 'la';
case 'p': case 'mp': case 'fp': case 'pluriel': return 'les';
default:
@@ -35,8 +35,8 @@ export class Grammar {
}
/* -------------------------------------------- */
- static articleIndétermine(genre) {
- switch (toLowerCaseNoAccent(genre)) {
+ static articleIndetermine(genre) {
+ switch (Grammar.toLowerCaseNoAccent(genre)) {
case 'f': case 'feminin': return 'une';
case 'p': case 'fp': case 'mp': case 'pluriel': return 'des';
case 'n': case 'neutre': return 'du'
@@ -58,7 +58,7 @@ export class Grammar {
* @param {...any} mots
*/
static accord(genre, ...mots) {
- switch (toLowerCaseNoAccent(genre)) {
+ switch (Grammar.toLowerCaseNoAccent(genre)) {
default:
case 'n': case 'neutre':
case 'm': case 'masculin': return mots[0];
diff --git a/module/item-sheet.js b/module/item-sheet.js
index f70e3483..093ce575 100644
--- a/module/item-sheet.js
+++ b/module/item-sheet.js
@@ -48,6 +48,7 @@ export class RdDItemSheet extends ItemSheet {
/* -------------------------------------------- */
async getData() {
let data = super.getData();
+
data.categorieCompetences = RdDUtility.getCategorieCompetences();
if ( data.item.type == 'tache' || data.item.type == 'livre' || data.item.type == 'meditation' || data.item.type == 'oeuvre') {
data.caracList = duplicate(game.system.model.Actor.personnage.carac);
@@ -57,11 +58,11 @@ export class RdDItemSheet extends ItemSheet {
data.competences = await RdDUtility.loadCompendium( 'foundryvtt-reve-de-dragon.competences', it => RdDItemCompetence.isCompetenceArme(it));
}
if ( data.item.type == 'recettealchimique' ) {
- RdDAlchimie.processManipulation(data.item, this.actor && this.actor._id );
+ RdDAlchimie.processManipulation(data.item, this.actor && this.actor.id );
}
if ( this.actor ) {
data.isOwned = true;
- data.actorId = this.actor._id;
+ data.actorId = this.actor.id;
}
data.bonusCaseList = RdDItemSort.getBonusCaseList(data, true);
data.isGM = game.user.isGM; // Pour verrouiller certaines éditions
@@ -129,7 +130,7 @@ export class RdDItemSheet extends ItemSheet {
_updateObject(event, formData) {
// Données de bonus de cases ?
formData = RdDItemSort.buildBonusCaseStringFromFormData( formData );
-
+ //console.log("HERE", this, formData, this.object.data );
return this.object.update(formData);
}
}
diff --git a/module/poetique.js b/module/poetique.js
index 58127bf8..e448d6e7 100644
--- a/module/poetique.js
+++ b/module/poetique.js
@@ -4,25 +4,25 @@ const poesieHautReve = [
{
reference: 'Le Ratier Bretonien',
extrait: `Le courant du Fleuve
- Te domine et te Porte
- Avant que tu te moeuves
- Combat le, ou il t'emporte`
+ Te domine et te Porte
+ Avant que tu te moeuves
+ Combat le, ou il t'emporte`
},
{
reference: 'Incompatibilité, Charles Beaudelaire',
extrait: `Et lorsque par hasard une nuée errante
- Assombrit dans son vol le lac silencieux,
- On croirait voir la robe ou l'ombre transparente
- D'un esprit qui voyage et passe dans les cieux.`
+ Assombrit dans son vol le lac silencieux,
+ On croirait voir la robe ou l'ombre transparente
+ D'un esprit qui voyage et passe dans les cieux.`
},
{
reference: 'Au fleuve de Loire, Joachim du Bellay',
extrait: `Ô de qui la vive course
- Prend sa bienheureuse source,
- D’une argentine fontaine,
- Qui d’une fuite lointaine,
- Te rends au sein fluctueux
- De l’Océan monstrueux`
+ Prend sa bienheureuse source,
+ D’une argentine fontaine,
+ Qui d’une fuite lointaine,
+ Te rends au sein fluctueux
+ De l’Océan monstrueux`
},
{
reference: 'Denis Gerfaud',
@@ -61,10 +61,188 @@ const poesieHautReve = [
Nul ne sait qui est le créateur des Dragons, ni qui est leur maître.
Mais l'on peut supposer qui est le maître du Rêve des Dragons, c'est Oniros»`
},
+ {
+ reference: "La chevelure, Charles Baudelaire",
+ extrait: `J'irai là-bas où l'arbre et l'homme, pleins de sève,
+ Se pâment longuement sous l'ardeur des climats ;
+ Fortes tresses, soyez la houle qui m'enlève !`
+ },
+ {
+ reference: "Rêve de Dragon, Denis Gerfaud",
+ extrait: `En réalité, tous les éléments du rêve des Dragons expriment
+ le Draconic : chaque pierre, chaque fleur, chaque goutte d'eau,
+ chaque nuage est porteur d'un message dans la langue des Dragons`
+ },
+ {
+ reference: "Femmes damnées (2), Charles Baudelaire",
+ extrait: `Comme je descendais des Fleuves impassibles,
+ Je ne me sentis plus guidé par les haleurs :
+ Des Peaux-Rouges criards les avaient pris pour cibles,
+ Les ayant cloués nus aux poteaux de couleurs.`
+ },
+ {
+ reference: "Le bateau ivre, Arthur Rimbaud",
+ extrait: `Loin des peuples vivants, errantes, condamnées,
+ A travers les déserts courez comme les loups ;
+ Faites votre destin, âmes désordonnées,
+ Et fuyez l'infini que vous portez en vous !`
+ },
+ {
+ reference: "L'Ennemi, Charles Baudelaire",
+ extrait: `Et qui sait si les fleurs nouvelles que je rêve
+ Trouveront dans ce sol lavé comme une grève
+ Le mystique aliment qui ferait leur vigueur ?`
+ },
+ {
+ reference: "Une charogne, Charles Baudelaire",
+ extrait: `Et le ciel regardait la carcasse superbe
+ Comme une fleur s'épanouir.
+ La puanteur était si forte, que sur l'herbe
+ Vous crûtes vous évanouir.`
+ },
+ {
+ reference: "Conseil, Victor Hugo",
+ extrait: `Rois ! la bure est souvent jalouse du velours.
+ Le peuple a froid l'hiver, le peuple a faim toujours.
+ Rendez-lui son sort plus facile.
+ Le peuple souvent porte un bien rude collier.
+ Ouvrez l'école aux fils, aux pères l'atelier,
+ À tous vos bras, auguste asile !`
+ },
+ {
+ reference: "El Desdichado, Gérard de Nerval",
+ extrait: `Suis-je Amour ou Phébus ?... Lusignan ou Biron ?
+ Mon front est rouge encor du baiser de la Reine ;
+ J'ai rêvé dans la Grotte où nage la sirène...`
+ },
+ {
+ reference: "Caligula - IIIème chant, Gérard de Nerval",
+ extrait: `Allez, que le caprice emporte
+ Chaque âme selon son désir,
+ Et que, close après vous, la porte
+ Ne se rouvre plus qu'au plaisir.`
+ },
+ {
+ reference: "Rêve de Dragon, Denis Gerfaud",
+ extrait: `Les sages ont encore coutume de dire :
+ « 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 ? »`
+ },
+ {
+ reference: "Rêve de Dragon, Denis Gerfaud",
+ extrait: `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`,
+ },
+ {
+ reference: "Quand le rêve se brise, Cypora Sebagh",
+ extrait: `Quand le rêve se brise,
+ Dans la plainte du jour,
+ Ma mémoire devient grise
+ Et sombre, tour à tour,
+ Dans le puits du silence
+ Et de la solitude ;
+ Elle reprend son errance
+ Parmi la multitude.`
+ }
+ ,
+ {
+ reference: "Une charogne, Charles Baudelaire",
+ extrait: `Les formes s'effaçaient et n'étaient plus qu'un rêve,
+ Une ébauche lente à venir
+ Sur la toile oubliée, et que l'artiste achève
+ Seulement par le souvenir.`
+ },
+ {
+ reference: "La chevelure, Charles Baudelaire",
+ extrait: `Longtemps ! toujours ! ma main dans ta crinière lourde
+ Sèmera le rubis, la perle et le saphir,
+ Afin qu'à mon désir tu ne sois jamais sourde !
+ N'es-tu pas l'oasis où je rêve, et la gourde
+ Où je hume à longs traits le vin du souvenir`
+ },
+ {
+ reference: "Un Fou et un Sage, Jean de La Fontaine",
+ extrait: `Certain Fou poursuivait à coups de pierre un Sage.
+ Le Sage se retourne et lui dit : Mon ami,
+ C'est fort bien fait à toi ; reçois cet écu-ci :
+ Tu fatigues assez pour gagner davantage.`
+ },
+ {
+ reference: "Guitare, Victor Hugo",
+ extrait: `Je la voyais passer de ma demeure,
+ Et c'était tout.
+ Mais à présent je m'ennuie à toute heure,
+ Plein de dégoût,
+ Rêveur oisif, l'âme dans la campagne,
+ La dague au clou ... –
+ Le vent qui vient à travers la montagne
+ M'a rendu fou !`
+ },
+ {
+ reference: "Rêve de Dragon, Denis Gerfaud",
+ extrait: `Le Premier Âge fut appelé l'Âge des Dragons. Ce fut le commencement
+ des temps, le commencement des rêves. Durant cette période plus mythique
+ que réellement historique, les Dragons aimaient à se rêver eux-mêmes.`
+ },
+ {
+ reference: "Les Djinns, Victor Hugo",
+ extrait: `C'est l'essaim des Djinns qui passe,
+ Et tourbillonne en sifflant !
+ Les ifs, que leur vol fracasse,
+ Craquent comme un pin brûlant.`},
+ {
+ reference: "Rêve de Dragon, Denis Gerfaud",
+ extrait: `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`
+ },
+ {
+ reference: "Lily, Pierre Perret",
+ extrait: `Elle aurait pas cru sans le voir
+ Que la couleur du désespoir
+ Là-bas aussi ce fût le noir.`
+ },
+
+ {
+ reference: "Qu'est-ce de votre vie ? une bouteille molle, Jean-Baptiste Chassignet",
+ extrait: `Qu'est-ce de votre vie ? un tourbillon rouant
+ De fumière à flot gris, parmi l'air se jouant,
+ Qui passe plus soudain que foudre meurtrière.`
+ },
+ {
+ reference: "Les Djinns, poème Victor Hugo",
+ extrait: `Cris de l'enfer! voix qui hurle et qui pleure !
+ L'horrible essaim, poussé par l'aquilon,
+ Sans doute, ô ciel ! s'abat sur ma demeure.
+ Le mur fléchit sous le noir bataillon.
+ La maison crie et chancelle penchée,
+ Et l'on dirait que, du sol arrachée,
+ Ainsi qu'il chasse une feuille séchée,
+ Le vent la roule avec leur tourbillon !`
+ },
+ {
+ reference: "Rêve de Dragon, Denis Gerfaud",
+ extrait: `Le monde est Rêve de Dragons, mais nous ne savons
+ ni leur apparence ni qui sont les dragons.
+ En dépit de l'iconographie qui les clame
+ immenses créatures ailées crachant des flammes`
+ },
+ {
+ reference: "El Desdichado, Gérard de Nerval",
+ extrait: `Je suis le Ténébreux, – le Veuf, – l'Inconsolé,
+ Le Prince d'Aquitaine à la Tour abolie :
+ Ma seule Etoile est morte, – et mon luth constellé
+ Porte le Soleil noir de la Mélancolie.`
+ },
]
export class Poetique {
- static getExtrait(){
+ static getExtrait() {
return Misc.rollOneOf(poesieHautReve);
}
diff --git a/module/rdd-commands.js b/module/rdd-commands.js
index b085c758..a10392ff 100644
--- a/module/rdd-commands.js
+++ b/module/rdd-commands.js
@@ -23,6 +23,8 @@ export class RdDCommands {
rddCommands.registerCommand({ path: ["/aide"], func: (content, msg, params) => rddCommands.help(msg), descr: "Affiche l'aide pour toutes les commandes" });
rddCommands.registerCommand({ path: ["/help"], func: (content, msg, params) => rddCommands.help(msg), descr: "Affiche l'aide pour toutes les commandes" });
rddCommands.registerCommand({ path: ["/table", "queues"], func: (content, msg, params) => RdDRollTables.getQueue(true), descr: "Tire une Queue de Dragon" });
+ rddCommands.registerCommand({ path: ["/table", "ideefixe"], func: (content, msg, params) => RdDRollTables.getIdeeFixe(true), descr: "Tire une Idée fixe" });
+ rddCommands.registerCommand({ path: ["/table", "desir"], func: (content, msg, params) => RdDRollTables.getDesirLancinant(true), descr: "Tire un Désir Lancinant" });
rddCommands.registerCommand({ path: ["/table", "ombre"], func: (content, msg, params) => RdDRollTables.getOmbre(true), descr: "Tire une Ombre de Dragon" });
rddCommands.registerCommand({ path: ["/table", "tetehr"], func: (content, msg, params) => RdDRollTables.getTeteHR(true), descr: "Tire une Tête de Dragon pour Hauts Revants" });
rddCommands.registerCommand({ path: ["/table", "tete"], func: (content, msg, params) => RdDRollTables.getTete(true), descr: "Tire une Tête de Dragon" });
diff --git a/module/rdd-main.js b/module/rdd-main.js
index 2b7d2e43..1c45db7a 100644
--- a/module/rdd-main.js
+++ b/module/rdd-main.js
@@ -133,7 +133,8 @@ Hooks.once("init", async function () {
/* -------------------------------------------- */
// Define custom Entity classes
- CONFIG.Actor.entityClass = RdDActor;
+ CONFIG.Actor.documentClass = RdDActor;
+ //CONFIG.Actor.entityClass = RdDActor;
CONFIG.RDD = {
resolutionTable: RdDResolutionTable.resolutionTable,
carac_array: RdDUtility.getCaracArray(),
@@ -150,7 +151,8 @@ Hooks.once("init", async function () {
Actors.registerSheet("foundryvtt-reve-de-dragon", RdDActorEntiteSheet, { types: ["entite"], makeDefault: true });
Items.unregisterSheet("core", ItemSheet);
Items.registerSheet("foundryvtt-reve-de-dragon", RdDItemSheet, { makeDefault: true });
- CONFIG.Combat.entityClass = RdDCombatManager;
+ //CONFIG.Combat.entityClass = RdDCombatManager;
+ CONFIG.Combat.documentClass = RdDCombatManager;
// préparation des différents modules
RdDCommands.init();
@@ -171,7 +173,7 @@ function messageDeBienvenue() {
if (game.user.isGM) {
ChatUtility.removeChatMessageContaining('
Bienvenue dans le Rêve des Dragons ! Vous trouverez quelques informations pour démarrer dans ce document : @Compendium[foundryvtt-reve-de-dragon.rappel-des-regles.7uGrUHGdPu0EmIu2]{Documentation MJ/Joueurs}
La commande /aide dans le chat permet de voir les commandes spécifiques à Rêve de Dragon.
diff --git a/module/rdd-roll.js b/module/rdd-roll.js
index 079fc277..11a83bf4 100644
--- a/module/rdd-roll.js
+++ b/module/rdd-roll.js
@@ -142,8 +142,8 @@ export class RdDRoll extends Dialog {
// Update html, according to data
if (rollData.competence) {
// Set the default carac from the competence item
- rollData.selectedCarac = rollData.carac[rollData.competence.data.defaut_carac];
- $("#carac").val(rollData.competence.data.defaut_carac);
+ rollData.selectedCarac = rollData.carac[rollData.competence.data.data.defaut_carac];
+ $("#carac").val(rollData.competence.data.data.defaut_carac);
}
if (rollData.selectedSort) {
$("#draconic").val(rollData.selectedSort.data.listIndex); // Uniquement a la selection du sort, pour permettre de changer
@@ -296,10 +296,10 @@ export class RdDRoll extends Dialog {
/* -------------------------------------------- */
_computeDiffCompetence(rollData) {
if (rollData.competence) {
- return Misc.toInt(rollData.competence.data.niveau);
+ return Misc.toInt(rollData.competence.data.data.niveau);
}
if (rollData.draconicList) {
- return Misc.toInt(rollData.competence.data.niveau);
+ return Misc.toInt(rollData.competence.data.data.niveau);
}
return 0;
}
@@ -336,7 +336,7 @@ export class RdDRoll extends Dialog {
return compName + " - " + rollData.selectedSort.name;
}
// If a weapon is there, add it in the title
- const niveau = Misc.toSignedString(rollData.competence.data.niveau);
+ const niveau = Misc.toSignedString(rollData.competence.data.data.niveau);
if (compName == carac) {
// cas des créatures
return carac + " " + niveau
diff --git a/module/rdd-rolltables.js b/module/rdd-rolltables.js
index 957c130a..74d06152 100644
--- a/module/rdd-rolltables.js
+++ b/module/rdd-rolltables.js
@@ -48,14 +48,22 @@ export class RdDRollTables {
static async getQueue(toChat = false) {
let queue = await RdDRollTables.drawItemFromRollTable("Queues de dragon", toChat);
if (queue.name.toLowerCase().includes('lancinant') ) {
- queue = await RdDRollTables.drawItemFromRollTable("Désirs lancinants", toChat);
+ return await RdDRollTables.getDesirLancinant(toChat);
}
if (queue.name.toLowerCase().includes('fixe') ) {
- queue = await RdDRollTables.drawItemFromRollTable("Idées fixes", toChat);
+ return await RdDRollTables.getIdeeFixe(toChat);
}
return queue;
}
+ static async getDesirLancinant(toChat = false) {
+ return await RdDRollTables.drawItemFromRollTable("Désirs lancinants", toChat);
+ }
+
+ static async getIdeeFixe(toChat = false) {
+ return await RdDRollTables.drawItemFromRollTable("Idées fixes", toChat);
+ }
+
/* -------------------------------------------- */
static async getTeteHR(toChat = false) {
return await RdDRollTables.drawItemFromRollTable("Têtes de Dragon pour haut-rêvants", toChat);
diff --git a/module/rdd-tmr-dialog.js b/module/rdd-tmr-dialog.js
index a3bcff7e..2312b1d7 100644
--- a/module/rdd-tmr-dialog.js
+++ b/module/rdd-tmr-dialog.js
@@ -108,6 +108,11 @@ export class RdDTMRDialog extends Dialog {
this._createTokens();
}
+ removeToken(tmr, casetmr) {
+ this._removeTokens(t => t.coordTMR() == tmr.coord && t.caseSpeciale?._id == casetmr._id);
+ this.updateTokens()
+ }
+
/* -------------------------------------------- */
_getTokensCasesTmr() {
return this.casesSpeciales.map(c => this._tokenCaseSpeciale(c)).filter(token => token);
@@ -142,7 +147,7 @@ export class RdDTMRDialog extends Dialog {
async activateListeners(html) {
super.activateListeners(html);
- document.getElementById("tmrrow1").insertCell(1).append(this.pixiApp.view);
+ document.getElementById("tmrrow1").insertCell(0).append(this.pixiApp.view);
if (this.viewOnly) {
html.find('#lancer-sort').remove();
@@ -168,7 +173,6 @@ export class RdDTMRDialog extends Dialog {
let tmr = TMRUtility.getTMR(this.actor.data.data.reve.tmrpos.coord);
await this.manageRencontre(tmr, () => {
this.postRencontre(tmr);
- this.actor.displayTMRQueueSouffleInformation();
});
}
@@ -176,7 +180,7 @@ export class RdDTMRDialog extends Dialog {
updateValuesDisplay() {
let ptsreve = document.getElementById("tmr-pointsreve-value");
ptsreve.innerHTML = this.actor.data.data.reve.reve.value;
-
+ console.log( this.actor.data.data );
let tmrpos = document.getElementById("tmr-pos");
let tmr = TMRUtility.getTMR(this.actor.data.data.reve.tmrpos.coord);
tmrpos.innerHTML = this.actor.data.data.reve.tmrpos.coord + " (" + tmr.label + ")";
@@ -498,9 +502,7 @@ export class RdDTMRDialog extends Dialog {
}
async _resultatMaitriseCaseHumide(rollData) {
- if (rollData.rolled.isETotal) {
- rollData.souffle = await this.actor.ajouterSouffle({ chat: false });
- }
+ await this.souffleSiEchecTotal(rollData);
this.toclose = rollData.rolled.isEchec;
if (rollData.rolled.isSuccess && rollData.double) {
rollData.previous = { rolled: rollData.rolled, ajustements: rollData.ajustements };
@@ -518,6 +520,12 @@ export class RdDTMRDialog extends Dialog {
}
}
+ async souffleSiEchecTotal(rollData) {
+ if (rollData.rolled.isETotal) {
+ rollData.souffle = await this.actor.ajouterSouffle({ chat: false });
+ }
+ }
+
/* -------------------------------------------- */
isCaseHumide(tmr) {
if (!(TMRUtility.isCaseHumide(tmr) || this.isCaseHumideAdditionelle(tmr))) {
@@ -558,16 +566,29 @@ export class RdDTMRDialog extends Dialog {
await this._conquerir(tmr, {
difficulte: -9,
action: 'Conquérir la cité',
- onConqueteReussie: r => EffetsDraconiques.fermetureCites.onConquete(r.actor, tmr, (casetmr) => this.removeToken(tmr, casetmr)),
- onConqueteEchec: r => this.close(),
+ onConqueteReussie: r => EffetsDraconiques.fermetureCites.onVisiteSupprimer(r.actor, tmr, (casetmr) => this.removeToken(tmr, casetmr)),
+ onConqueteEchec: r => {
+ this.souffleSiEchecTotal(rollData);
+ this.close()
+ },
canClose: false
});
}
}
-
- removeToken(tmr, casetmr) {
- this._removeTokens(t => t.coordTMR() == tmr.coord && t.caseSpeciale?._id == casetmr._id);
- this.updateTokens()
+ /* -------------------------------------------- */
+ async purifierPeriple(tmr) {
+ if (EffetsDraconiques.periple.find(this.casesSpeciales, tmr.coord)) {
+ await this._conquerir(tmr, {
+ difficulte: EffetsDraconiques.periple.getDifficulte(tmr),
+ action: 'Purifier ' + TMRUtility.getTMRDescr(tmr.coord),
+ onConqueteReussie: r => EffetsDraconiques.periple.onVisiteSupprimer(r.actor, tmr, (casetmr) => this.removeToken(tmr, casetmr)),
+ onConqueteEchec: r => {
+ this.souffleSiEchecTotal(rollData);
+ this.close()
+ },
+ canClose: false
+ });
+ }
}
/* -------------------------------------------- */
@@ -576,8 +597,8 @@ export class RdDTMRDialog extends Dialog {
await this._conquerir(tmr, {
difficulte: -7,
action: 'Conquérir',
- onConqueteReussie: r => EffetsDraconiques.conquete.onConquete(r.actor, tmr, (casetmr) => this.removeToken(tmr, casetmr)),
- onConqueteEchec: r => { },
+ onConqueteReussie: r => EffetsDraconiques.conquete.onVisiteSupprimer(r.actor, tmr, (casetmr) => this.removeToken(tmr, casetmr)),
+ onConqueteEchec: r => this.close(),
canClose: false
});
}
@@ -639,8 +660,9 @@ export class RdDTMRDialog extends Dialog {
dialog.render(true);
}
- async validerPelerinage(tmr) {
- await EffetsDraconiques.pelerinage.onFinPelerinage(this.actor, tmr, (casetmr) => this.removeToken(tmr, casetmr));
+ async validerVisite(tmr) {
+ await EffetsDraconiques.pelerinage.onVisiteSupprimer(this.actor, tmr, (casetmr) => this.removeToken(tmr, casetmr));
+ await EffetsDraconiques.urgenceDraconique.onVisiteSupprimer(this.actor, tmr, (casetmr) => this.removeToken(tmr, casetmr));
}
@@ -649,11 +671,12 @@ export class RdDTMRDialog extends Dialog {
let sortReserveList = TMRUtility.getSortReserveList(this.sortsReserves, coord);
if (sortReserveList.length > 0) {
- if (EffetsDraconiques.isSortImpossible(this.actor)) {
+ if (EffetsDraconiques.isSortReserveImpossible(this.actor)) {
ui.notifications.error("Une queue ou un souffle vous empèche de déclencher de sort!");
return;
}
- if (EffetsDraconiques.isReserveEnSecurite(this.actor) || this.isReserveExtensible(coord)) {
+ if (!EffetsDraconiques.isUrgenceDraconique(this.actor) &&
+ (EffetsDraconiques.isReserveEnSecurite(this.actor) || this.isReserveExtensible(coord))) {
let msg = "Vous êtes sur une case avec un Sort en Réserve. Grâce à votre Tête Reserve en Sécurité ou Réserve Exensible, vous pouvez contrôler le déclenchement. Cliquez si vous souhaitez le déclencher :
";
for (let sortReserve of sortReserveList) {
msg += "