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.makeHTMLfatigueMatrix(data.data.sante.fatigue.value, data.data.sante.endurance.max).html() + "
" + malus: RdDUtility.calculMalusFatigue(data.data.data.sante.fatigue.value, data.data.data.sante.endurance.max), + html: "" + RdDUtility.makeHTMLfatigueMatrix(data.data.data.sante.fatigue.value, data.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('
'); ChatMessage.create({ - user: game.user._id, + user: game.user.data._id, content: `
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 :
- Malus de fatigue : {{data.fatigue.malus}} + Malus de fatigue : {{data.data.fatigue.malus}} {{{data.fatigue.html}}} - {{data.blessures.resume}} + {{data.data.blessures.resume}}
- {{data.compteurs.etat.label}}: {{data.compteurs.etat.value}} - {{data.compteurs.surenc.label}}: {{data.compteurs.surenc.value}} + {{data.data.compteurs.etat.label}}: {{data.data.compteurs.etat.value}} + {{data.data.compteurs.surenc.label}}: {{data.data.compteurs.surenc.value}}
{{#if data.surprise}}{{data.surprise}}! {{/if}} @@ -116,7 +116,7 @@ src="systems/foundryvtt-reve-de-dragon/icons/{{#if data.editCaracComp}}unlocked.svg{{else}}locked.svg{{/if}}" alt="blocker/débloquer" >{{#if data.editCaracComp}}Verrouiller{{else}}Déverrouiller{{/if}}