diff --git a/changelog.md b/changelog.md
index 9e326136..41c544ea 100644
--- a/changelog.md
+++ b/changelog.md
@@ -1,5 +1,11 @@
# v11.0
+## v11.0.9 - Les Souvenirs de Khrachtchoum le Problémeux
+- mode de saisie de l'archétype en vue détaillée
+- création une nouvelle incarnation depuis l'archétype
+- réorganisation de la fenêtre de sélection des règles optionnelles
+- correction de l'affichage du type dans les fenêtres d'objets
+
## v11.0.8 - la poigne de Sémolosse
- lien vers le changelog
- organisation des compendiums du système
diff --git a/module/actor-sheet.js b/module/actor-sheet.js
index ef9ad208..8a43be12 100644
--- a/module/actor-sheet.js
+++ b/module/actor-sheet.js
@@ -7,7 +7,7 @@ import { Misc } from "./misc.js";
import { RdDCombatManager } from "./rdd-combat.js";
import { RdDCarac } from "./rdd-carac.js";
import { DialogSplitItem } from "./dialog-split-item.js";
-import { ReglesOptionelles } from "./settings/regles-optionelles.js";
+import { ReglesOptionnelles } from "./settings/regles-optionnelles.js";
import { RdDSheetUtility } from "./rdd-sheet-utility.js";
import { STATUSES } from "./settings/status-effects.js";
import { MAINS_DIRECTRICES } from "./actor.js";
@@ -33,7 +33,8 @@ export class RdDActorSheet extends RdDBaseActorSheet {
tabs: [{ navSelector: ".sheet-tabs", contentSelector: ".sheet-body", initial: "carac" }],
dragDrop: [{ dragSelector: ".item-list .item", dropSelector: undefined }],
showCompNiveauBase: false,
- vueDetaillee: false
+ vueDetaillee: false,
+ vueArchetype: false,
});
}
@@ -114,7 +115,7 @@ export class RdDActorSheet extends RdDBaseActorSheet {
activateListeners(html) {
super.activateListeners(html);
- HtmlUtility.showControlWhen(this.html.find(".appliquerFatigue"), ReglesOptionelles.isUsing("appliquer-fatigue"));
+ HtmlUtility.showControlWhen(this.html.find(".appliquerFatigue"), ReglesOptionnelles.isUsing("appliquer-fatigue"));
// Everything below here is only needed if the sheet is editable
if (!this.options.editable) return;
@@ -353,12 +354,19 @@ export class RdDActorSheet extends RdDBaseActorSheet {
let compName = event.currentTarget.attributes.compname.value;
this.actor.updateCompetenceXPSort(compName, parseInt(event.target.value));
});
+ this.html.find('.toggle-archetype').click(async event => {
+ this.options.vueArchetype = !this.options.vueArchetype;
+ this.render(true);
+ });
// On competence archetype change
this.html.find('.competence-archetype').change(async event => {
let compName = event.currentTarget.attributes.compname.value;
this.actor.updateCompetenceArchetype(compName, parseInt(event.target.value));
});
}
+ this.html.find('.nouvelle-incarnation').click(async event => {
+ this.actor.nouvelleIncarnation();
+ });
this.html.find('.show-hide-competences').click(async event => {
this.options.showCompNiveauBase = !this.options.showCompNiveauBase;
diff --git a/module/actor.js b/module/actor.js
index 8c0f2581..c6848e1b 100644
--- a/module/actor.js
+++ b/module/actor.js
@@ -18,7 +18,7 @@ import { RdDAlchimie } from "./rdd-alchimie.js";
import { STATUSES, StatusEffects } from "./settings/status-effects.js";
import { RdDItemCompetenceCreature } from "./item-competencecreature.js";
import { RdDItemSigneDraconique } from "./item/signedraconique.js";
-import { ReglesOptionelles } from "./settings/regles-optionelles.js";
+import { ReglesOptionnelles } from "./settings/regles-optionnelles.js";
import { EffetsDraconiques } from "./tmr/effets-draconiques.js";
import { Draconique } from "./tmr/draconique.js";
import { RdDCarac } from "./rdd-carac.js";
@@ -134,7 +134,7 @@ export class RdDActor extends RdDBaseActor {
}
/* -------------------------------------------- */
getFatigueActuelle() {
- if (ReglesOptionelles.isUsing("appliquer-fatigue") && this.isPersonnage()) {
+ if (ReglesOptionnelles.isUsing("appliquer-fatigue") && this.isPersonnage()) {
return this.system.sante.fatigue?.value;
}
return 0;
@@ -457,7 +457,7 @@ export class RdDActor extends RdDBaseActor {
/* -------------------------------------------- */
async dormirChateauDormant() {
- if (!ReglesOptionelles.isUsing("chateau-dormant-gardien") || !this.system.sommeil || this.system.sommeil.nouveaujour) {
+ if (!ReglesOptionnelles.isUsing("chateau-dormant-gardien") || !this.system.sommeil || this.system.sommeil.nouveaujour) {
const message = {
whisper: ChatUtility.getWhisperRecipientsAndGMs(this.name),
content: ""
@@ -712,7 +712,7 @@ export class RdDActor extends RdDBaseActor {
/* -------------------------------------------- */
async recupererFatigue(message) {
- if (ReglesOptionelles.isUsing("appliquer-fatigue")) {
+ if (ReglesOptionnelles.isUsing("appliquer-fatigue")) {
let fatigue = this.system.sante.fatigue.value;
const fatigueMin = this._computeFatigueMin();
if (fatigue <= fatigueMin) {
@@ -1178,7 +1178,7 @@ export class RdDActor extends RdDBaseActor {
}
// Pour les autres
let state = Math.min(this.system.sante.vie.value - this.system.sante.vie.max, 0);
- if (ReglesOptionelles.isUsing("appliquer-fatigue") && this.system.sante.fatigue) {
+ if (ReglesOptionnelles.isUsing("appliquer-fatigue") && this.system.sante.fatigue) {
state += RdDUtility.currentFatigueMalus(this.system.sante.fatigue.value, this.system.sante.endurance.max);
}
// Ajout de l'éthylisme
@@ -1395,9 +1395,9 @@ export class RdDActor extends RdDBaseActor {
await this.deleteEmbeddedDocuments('Item', obsoletes);
}
- async $finDeRoundEmpoignade(){
+ async $finDeRoundEmpoignade() {
const immobilisations = this.itemTypes[TYPES.empoignade].filter(it => it.system.pointsemp >= 2 && it.system.empoigneurid == this.id);
- immobilisations.forEach(emp => RdDEmpoignade.onImmobilisation(this,
+ immobilisations.forEach(emp => RdDEmpoignade.onImmobilisation(this,
game.actors.get(emp.system.empoigneid),
emp
))
@@ -1505,7 +1505,7 @@ export class RdDActor extends RdDBaseActor {
/* -------------------------------------------- */
async santeIncDec(name, inc, isCritique = false) {
- if (name == 'fatigue' && !ReglesOptionelles.isUsing("appliquer-fatigue")) {
+ if (name == 'fatigue' && !ReglesOptionnelles.isUsing("appliquer-fatigue")) {
return;
}
const sante = duplicate(this.system.sante)
@@ -1547,7 +1547,7 @@ export class RdDActor extends RdDBaseActor {
}
compteur.value = result.newValue;
// If endurance lost, then the same amount of fatigue cannot be recovered
- if (ReglesOptionelles.isUsing("appliquer-fatigue") && sante.fatigue && fatigue > 0) {
+ if (ReglesOptionnelles.isUsing("appliquer-fatigue") && sante.fatigue && fatigue > 0) {
sante.fatigue.value = Math.max(sante.fatigue.value + fatigue, this._computeFatigueMin());
}
await this.update({ "system.sante": sante })
@@ -2449,7 +2449,7 @@ export class RdDActor extends RdDBaseActor {
/* -------------------------------------------- */
async _tacheResult(rollData, options) {
// Mise à jour de la tache
- rollData.appliquerFatigue = ReglesOptionelles.isUsing("appliquer-fatigue");
+ rollData.appliquerFatigue = ReglesOptionnelles.isUsing("appliquer-fatigue");
rollData.tache = duplicate(rollData.tache);
rollData.tache.system.points_de_tache_courant += rollData.rolled.ptTache;
if (rollData.rolled.isETotal) {
@@ -3230,7 +3230,7 @@ export class RdDActor extends RdDBaseActor {
return;
}
const attackerId = attacker?.id;
- if (ReglesOptionelles.isUsing('validation-encaissement-gr') && !game.user.isGM) {
+ if (ReglesOptionnelles.isUsing('validation-encaissement-gr') && !game.user.isGM) {
RdDBaseActor.remoteActorCall({
actorId: this.id,
method: 'appliquerEncaissement',
@@ -3243,7 +3243,7 @@ export class RdDActor extends RdDBaseActor {
async appliquerEncaissement(rollData, show, attackerId) {
const armure = await this.computeArmure(rollData);
- if (ReglesOptionelles.isUsing('validation-encaissement-gr')) {
+ if (ReglesOptionnelles.isUsing('validation-encaissement-gr')) {
DialogValidationEncaissement.validerEncaissement(this, rollData, armure, show, attackerId, (encaissement, show, attackerId) => this._appliquerEncaissement(encaissement, show, attackerId));
}
else {
@@ -3830,5 +3830,39 @@ export class RdDActor extends RdDBaseActor {
content: `${this.name} a reçu un/une ${item.type}: ${item.name}, qui ${manualMessage ? "n'est pas" : "est"} géré(e) automatiquement. ${manualMessage ? manualMessage : ''}`
});
}
+
+ async nouvelleIncarnation() {
+ let incarnation = this.toObject();
+
+ incarnation.items = Array.from(this.items.filter(it => it.type == TYPES.competence),
+ it => {
+ it = it.toObject();
+ it.id = undefined;
+ it.system.niveau = it.system.base;
+ it.system.niveau_archetype = Math.max(it.system.niveau + (it.system.xp > 0 ? 1 : 0), it.system.niveau_archetype);
+ it.system.xp = 0;
+ it.system.xp_sort = 0;
+ it.system.default_diffLibre = 0;
+ return it;
+ });
+
+ incarnation.name = 'Réincarnation de ' + incarnation.name
+ incarnation.system = {
+ carac: duplicate(this.system.carac),
+ heure: RdDTimestamp.defHeure(await RdDDice.rollTotal("1dh", { rollMode: "selfroll", showDice: SHOW_DICE })).key,
+ age: 18,
+ biographie: '',
+ notes: '',
+ experiencelog: [],
+ 'compteurs.experience.value': 3000,
+ 'reve.seuil.value': this.system.carac.reve.value,
+ 'reve.reve.value': this.system.carac.reve.value,
+ subacteurs: { suivants: [], montures: [], vehicules: [] },
+ }
+ incarnation = await RdDBaseActor.create(incarnation);
+ await incarnation.deleteEmbeddedDocuments('ActiveEffect', incarnation.getEmbeddedCollection("ActiveEffect").map(it => it.id));
+ await incarnation.remiseANeuf();
+ incarnation.sheet.render(true);
+ }
}
diff --git a/module/item-competence.js b/module/item-competence.js
index 98a2e8eb..665e7d0f 100644
--- a/module/item-competence.js
+++ b/module/item-competence.js
@@ -8,18 +8,18 @@ const xp_par_niveau = [5, 5, 5, 10, 10, 10, 10, 15, 15, 15, 15, 20, 20, 20, 20,
const niveau_max = xp_par_niveau.length - 10;
/* -------------------------------------------- */
const limitesArchetypes = [
- { "niveau": 0, "nombreMax": 100, "reste": 100 },
- { "niveau": 1, "nombreMax": 10, "reste": 10 },
- { "niveau": 2, "nombreMax": 9, "reste": 9 },
- { "niveau": 3, "nombreMax": 8, "reste": 8 },
- { "niveau": 4, "nombreMax": 7, "reste": 7 },
- { "niveau": 5, "nombreMax": 6, "reste": 6 },
- { "niveau": 6, "nombreMax": 5, "reste": 5 },
- { "niveau": 7, "nombreMax": 4, "reste": 4 },
- { "niveau": 8, "nombreMax": 3, "reste": 3 },
- { "niveau": 9, "nombreMax": 2, "reste": 2 },
- { "niveau": 10, "nombreMax": 1, "reste": 1 },
- { "niveau": 11, "nombreMax": 1, "reste": 1 }
+ { niveau: 0, nombreMax: 100 },
+ { niveau: 1, nombreMax: 10 },
+ { niveau: 2, nombreMax: 9 },
+ { niveau: 3, nombreMax: 8 },
+ { niveau: 4, nombreMax: 7 },
+ { niveau: 5, nombreMax: 6 },
+ { niveau: 6, nombreMax: 5 },
+ { niveau: 7, nombreMax: 4 },
+ { niveau: 8, nombreMax: 3 },
+ { niveau: 9, nombreMax: 2 },
+ { niveau: 10, nombreMax: 1 },
+ { niveau: 11, nombreMax: 1 },
];
/* -------------------------------------------- */
@@ -259,13 +259,17 @@ export class RdDItemCompetence extends Item {
/* -------------------------------------------- */
static computeResumeArchetype(competences) {
const computed = duplicate(limitesArchetypes);
+ computed.forEach(it => { it.nombre = 0; it.reste = it.nombreMax; });
+
competences.map(it => Math.max(0, it.system.niveau_archetype))
.filter(n => n > 0)
.forEach(n => {
- computed[n] = computed[n] ?? { niveau: n, nombreMax: 0, reste: 0 };
- computed[n].reste = computed[n].reste - 1;
+ computed[n] = computed[n] ?? { niveau: n, nombreMax: 0, reste: 0, nombre: 0 };
+ computed[n].reste--;
+ computed[n].nombre++;
+
});
- return computed.filter(it => it.reste > 0 && it.niveau > 0);
+ return computed.filter(it => it.niveau > 0);
}
/* -------------------------------------------- */
diff --git a/module/item-sheet.js b/module/item-sheet.js
index 3a190dd2..e2f5bd7c 100644
--- a/module/item-sheet.js
+++ b/module/item-sheet.js
@@ -5,7 +5,7 @@ import { RdDItemCompetence } from "./item-competence.js";
import { RdDHerbes } from "./rdd-herbes.js";
import { RdDGemme } from "./rdd-gemme.js";
import { HtmlUtility } from "./html-utility.js";
-import { ReglesOptionelles } from "./settings/regles-optionelles.js";
+import { ReglesOptionnelles } from "./settings/regles-optionnelles.js";
import { SYSTEM_RDD } from "./constants.js";
import { RdDSheetUtility } from "./rdd-sheet-utility.js";
import { SystemCompendiums } from "./settings/system-compendiums.js";
@@ -157,7 +157,7 @@ export class RdDItemSheet extends ItemSheet {
super.activateListeners(html);
this.html = html;
- HtmlUtility.showControlWhen(this.html.find(".item-cout"), ReglesOptionelles.isUsing('afficher-prix-joueurs')
+ HtmlUtility.showControlWhen(this.html.find(".item-cout"), ReglesOptionnelles.isUsing('afficher-prix-joueurs')
|| game.user.isGM
|| !this.item.isOwned);
HtmlUtility.showControlWhen(this.html.find(".item-magique"), this.item.isMagique());
diff --git a/module/item/armure.js b/module/item/armure.js
index 101977a5..ffdcdd62 100644
--- a/module/item/armure.js
+++ b/module/item/armure.js
@@ -1,6 +1,6 @@
import { RdDItem } from "../item.js";
import { Misc } from "../misc.js";
-import { ReglesOptionelles } from "../settings/regles-optionelles.js";
+import { ReglesOptionnelles } from "../settings/regles-optionnelles.js";
export class RdDItemArmure extends RdDItem {
@@ -9,7 +9,7 @@ export class RdDItemArmure extends RdDItem {
}
deteriorerArmure(dmg) {
- if (!ReglesOptionelles.isUsing('deteriorationArmure') || this.system.protection == '0') {
+ if (!ReglesOptionnelles.isUsing('deteriorationArmure') || this.system.protection == '0') {
return;
}
let deterioration = (this.system.deterioration ?? 0) + dmg;
diff --git a/module/misc.js b/module/misc.js
index ac04d1e6..f055f4a0 100644
--- a/module/misc.js
+++ b/module/misc.js
@@ -42,7 +42,7 @@ export class Misc {
}
static typeName(type, subType) {
- return subType ? game.i18n.localize(`${type.toUpperCase()}.Type${Misc.upperFirst(subType)}`)
+ return subType ? game.i18n.localize(`TYPES.${type}.${Misc.upperFirst(subType)}`)
: '';
}
diff --git a/module/rdd-combat.js b/module/rdd-combat.js
index e6d4bfe7..8eec5bb5 100644
--- a/module/rdd-combat.js
+++ b/module/rdd-combat.js
@@ -9,7 +9,7 @@ import { RdDBonus } from "./rdd-bonus.js";
import { RdDResolutionTable } from "./rdd-resolution-table.js";
import { RdDRoll } from "./rdd-roll.js";
import { RdDRollTables } from "./rdd-rolltables.js";
-import { ReglesOptionelles } from "./settings/regles-optionelles.js";
+import { ReglesOptionnelles } from "./settings/regles-optionnelles.js";
import { STATUSES } from "./settings/status-effects.js";
import { Targets } from "./targets.js";
import { RdDEmpoignade } from "./rdd-empoignade.js";
@@ -1048,7 +1048,7 @@ export class RdDCombat {
competence: this.defender.getCompetence(competenceParade).clone(),
arme: armeParade,
surprise: this.defender.getSurprise(true),
- needParadeSignificative: ReglesOptionelles.isUsing('categorieParade') && RdDItemArme.needParadeSignificative(attackerRoll.arme, armeParade),
+ needParadeSignificative: ReglesOptionnelles.isUsing('categorieParade') && RdDItemArme.needParadeSignificative(attackerRoll.arme, armeParade),
needResist: RdDItemArme.needArmeResist(attackerRoll.arme, armeParade),
carac: this.defender.system.carac,
show: {}
@@ -1166,7 +1166,7 @@ export class RdDCombat {
/* -------------------------------------------- */
async computeDeteriorationArme(defenderRoll) {
- if (!ReglesOptionelles.isUsing('resistanceArmeParade')) {
+ if (!ReglesOptionnelles.isUsing('resistanceArmeParade')) {
return;
}
const attackerRoll = defenderRoll.attackerRoll;
@@ -1215,7 +1215,7 @@ export class RdDCombat {
}
}
// Si l'arme de parade n'est pas un bouclier, jet de désarmement (p.132)
- if (ReglesOptionelles.isUsing('defenseurDesarme') && resistance > 0 && RdDItemArme.getCategorieParade(defenderRoll.arme) != 'boucliers') {
+ if (ReglesOptionnelles.isUsing('defenseurDesarme') && resistance > 0 && RdDItemArme.getCategorieParade(defenderRoll.arme) != 'boucliers') {
let desarme = await RdDResolutionTable.rollData({
caracValue: this.defender.getForce(),
finalLevel: Misc.toInt(defenderRoll.competence.system.niveau) - dmg,
@@ -1230,7 +1230,7 @@ export class RdDCombat {
/* -------------------------------------------- */
async computeRecul(defenderRoll) { // Calcul du recul (p. 132)
const attackerRoll = defenderRoll.attackerRoll;
- if (ReglesOptionelles.isUsing('recul') && this._isForceOuCharge(attackerRoll)) {
+ if (ReglesOptionnelles.isUsing('recul') && this._isForceOuCharge(attackerRoll)) {
const impact = this._computeImpactRecul(attackerRoll);
const rollRecul = await RdDResolutionTable.rollData({ caracValue: 10, finalLevel: impact });
if (rollRecul.rolled.isSuccess) {
diff --git a/module/rdd-confirm.js b/module/rdd-confirm.js
index c0a480b1..d9dbba5a 100644
--- a/module/rdd-confirm.js
+++ b/module/rdd-confirm.js
@@ -1,10 +1,10 @@
import { Grammar } from "./grammar.js";
-import { ReglesOptionelles } from "./settings/regles-optionelles.js";
+import { ReglesOptionnelles } from "./settings/regles-optionnelles.js";
export class RdDConfirm {
/* -------------------------------------------- */
static confirmer(options, autresActions) {
- options.bypass = options.bypass || !(options.settingConfirmer == undefined || ReglesOptionelles.isUsing(options.settingConfirmer));
+ options.bypass = options.bypass || !(options.settingConfirmer == undefined || ReglesOptionnelles.isUsing(options.settingConfirmer));
if (options.bypass) {
options.onAction();
}
@@ -47,7 +47,7 @@ export class RdDConfirm {
icon: ' ',
label: options.buttonLabel + " et ne plus demander",
callback: () => {
- ReglesOptionelles.set(options.settingConfirmer, false);
+ ReglesOptionnelles.set(options.settingConfirmer, false);
options.onAction();
}
}
diff --git a/module/rdd-empoignade.js b/module/rdd-empoignade.js
index 89f65256..2654b977 100644
--- a/module/rdd-empoignade.js
+++ b/module/rdd-empoignade.js
@@ -4,7 +4,7 @@ import { RdDRoll } from "./rdd-roll.js";
import { RdDItemCompetenceCreature } from "./item-competencecreature.js";
import { ChatUtility } from "./chat-utility.js";
import { STATUSES } from "./settings/status-effects.js";
-import { ReglesOptionelles } from "./settings/regles-optionelles.js";
+import { ReglesOptionnelles } from "./settings/regles-optionnelles.js";
import { TYPES } from "./item.js";
/* -------------------------------------------- */
diff --git a/module/rdd-main.js b/module/rdd-main.js
index 65d4b106..a1ba3236 100644
--- a/module/rdd-main.js
+++ b/module/rdd-main.js
@@ -15,7 +15,7 @@ import { RdDCombatManager, RdDCombat } from "./rdd-combat.js";
import { ChatUtility } from "./chat-utility.js";
import { StatusEffects } from "./settings/status-effects.js";
import { RdDCompendiumOrganiser } from "./rdd-compendium-organiser.js";
-import { ReglesOptionelles } from "./settings/regles-optionelles.js";
+import { ReglesOptionnelles } from "./settings/regles-optionnelles.js";
import { RdDHotbar } from "./rdd-hotbar-drop.js"
import { EffetsDraconiques } from "./tmr/effets-draconiques.js";
import { RdDHerbes } from "./rdd-herbes.js";
@@ -186,7 +186,7 @@ export class SystemReveDeDragon {
RdDCalendrier.init();
SystemCompendiums.init();
DialogChronologie.init();
- ReglesOptionelles.init();
+ ReglesOptionnelles.init();
RdDUtility.init();
RdDDice.init();
RdDCommands.init();
diff --git a/module/rdd-resolution-table.js b/module/rdd-resolution-table.js
index 02a99b07..60ba2114 100644
--- a/module/rdd-resolution-table.js
+++ b/module/rdd-resolution-table.js
@@ -1,7 +1,7 @@
import { ChatUtility } from "./chat-utility.js";
import { Misc } from "./misc.js";
import { RdDDice } from "./rdd-dice.js";
-import { ReglesOptionelles } from "./settings/regles-optionelles.js";
+import { ReglesOptionnelles } from "./settings/regles-optionnelles.js";
/**
* difficultés au delà de -10
@@ -126,7 +126,7 @@ export class RdDResolutionTable {
rolled.bonus = rollData.bonus;
rolled.factorHtml = Misc.getFractionHtml(rollData.diviseurSignificative);
- if (ReglesOptionelles.isUsing("afficher-colonnes-reussite")) {
+ if (ReglesOptionnelles.isUsing("afficher-colonnes-reussite")) {
rolled.niveauNecessaire = this.findNiveauNecessaire(caracValue, rolled.roll);
rolled.ajustementNecessaire = rolled.niveauNecessaire - finalLevel;
}
diff --git a/module/rdd-roll.js b/module/rdd-roll.js
index e558902c..225f03fc 100644
--- a/module/rdd-roll.js
+++ b/module/rdd-roll.js
@@ -6,7 +6,7 @@ import { Misc } from "./misc.js";
import { RdDBonus } from "./rdd-bonus.js";
import { RdDCarac } from "./rdd-carac.js";
import { RdDResolutionTable } from "./rdd-resolution-table.js";
-import { ReglesOptionelles } from "./settings/regles-optionelles.js";
+import { ReglesOptionnelles } from "./settings/regles-optionnelles.js";
/**
* Extend the base Dialog entity to select roll parameters
@@ -85,7 +85,7 @@ export class RdDRoll extends Dialog {
if (RdDBonus.isDefenseAttaqueFinesse(rollData)) {
facteurSign *= 2;
}
- if (!ReglesOptionelles.isUsing('tripleSignificative')) {
+ if (!ReglesOptionnelles.isUsing('tripleSignificative')) {
facteurSign = Math.min(facteurSign, 4);
}
return facteurSign;
diff --git a/module/rdd-tmr-dialog.js b/module/rdd-tmr-dialog.js
index f54e6412..6d43df08 100644
--- a/module/rdd-tmr-dialog.js
+++ b/module/rdd-tmr-dialog.js
@@ -12,7 +12,7 @@ import { EffetsDraconiques } from "./tmr/effets-draconiques.js";
import { PixiTMR } from "./tmr/pixi-tmr.js";
import { Draconique } from "./tmr/draconique.js";
import { HtmlUtility } from "./html-utility.js";
-import { ReglesOptionelles } from "./settings/regles-optionelles.js";
+import { ReglesOptionnelles } from "./settings/regles-optionnelles.js";
import { RdDDice } from "./rdd-dice.js";
import { STATUSES } from "./settings/status-effects.js";
import { RdDRencontre } from "./item/rencontre.js";
@@ -55,7 +55,7 @@ export class RdDTMRDialog extends Dialog {
this.actor = actor;
this.actor.tmrApp = this; // reference this app in the actor structure
this.viewOnly = tmrData.mode == "visu"
- this.fatigueParCase = this.viewOnly || !ReglesOptionelles.isUsing("appliquer-fatigue") ? 0 : this.actor.getTMRFatigue();
+ this.fatigueParCase = this.viewOnly || !ReglesOptionnelles.isUsing("appliquer-fatigue") ? 0 : this.actor.getTMRFatigue();
this.cumulFatigue = 0;
this.loadRencontres();
this.loadCasesSpeciales();
@@ -207,7 +207,7 @@ export class RdDTMRDialog extends Dialog {
return;
}
- HtmlUtility.showControlWhen(this.html.find(".appliquerFatigue"), ReglesOptionelles.isUsing("appliquer-fatigue"));
+ HtmlUtility.showControlWhen(this.html.find(".appliquerFatigue"), ReglesOptionnelles.isUsing("appliquer-fatigue"));
HtmlUtility.showControlWhen(this.html.find(".lire-signe-draconique"), this.actor.isResonanceSigneDraconique(this._getActorCoord()));
// Roll Sort
@@ -227,7 +227,7 @@ export class RdDTMRDialog extends Dialog {
// Gestion du cout de montée en points de rêve
let reveCout = ((this.tmrdata.isRapide && !EffetsDraconiques.isDeplacementAccelere(this.actor)) ? -2 : -1) - this.actor.countMonteeLaborieuse();
- if (ReglesOptionelles.isUsing("appliquer-fatigue")) {
+ if (ReglesOptionnelles.isUsing("appliquer-fatigue")) {
this.cumulFatigue += this.fatigueParCase;
}
await this.actor.reveActuelIncDec(reveCout);
@@ -263,7 +263,7 @@ export class RdDTMRDialog extends Dialog {
let refoulement = document.getElementById("tmr-refoulement-value");
refoulement.innerHTML = this.actor.system.reve.refoulement.value;
- if (ReglesOptionelles.isUsing("appliquer-fatigue")) {
+ if (ReglesOptionnelles.isUsing("appliquer-fatigue")) {
let fatigueItem = document.getElementById("tmr-fatigue-table");
fatigueItem.innerHTML = "
" + RdDUtility.makeHTMLfatigueMatrix(this.actor.system.sante.fatigue.value, this.actor.system.sante.endurance.max).html() + "
";
}
@@ -367,7 +367,7 @@ export class RdDTMRDialog extends Dialog {
return true;
}
const resteAvantInconscience = this.actor.getFatigueMax() - this.actor.getFatigueActuelle() - this.cumulFatigue;
- if (ReglesOptionelles.isUsing("appliquer-fatigue") && resteAvantInconscience <= 0) {
+ if (ReglesOptionnelles.isUsing("appliquer-fatigue") && resteAvantInconscience <= 0) {
this._tellToGM("Vous vous écroulez de fatigue : vous quittez les Terres médianes !");
this.quitterLesTMRInconscient();
return true;
@@ -451,7 +451,7 @@ export class RdDTMRDialog extends Dialog {
setTimeout(() => {
// TODO: remplacer par une boucle while(this.currentRencontre) ?
rencData.nbRounds++;
- if (ReglesOptionelles.isUsing("appliquer-fatigue")) {
+ if (ReglesOptionnelles.isUsing("appliquer-fatigue")) {
this.cumulFatigue += this.fatigueParCase;
}
this._tentativeMaitrise(rencData);
@@ -1004,7 +1004,7 @@ export class RdDTMRDialog extends Dialog {
await this.actor.updateCoordTMR(tmr.coord);
this.forceDemiRevePositionView();
- if (ReglesOptionelles.isUsing("appliquer-fatigue")) {
+ if (ReglesOptionnelles.isUsing("appliquer-fatigue")) {
this.cumulFatigue += this.fatigueParCase;
}
this.updateValuesDisplay();
diff --git a/module/rdd-utility.js b/module/rdd-utility.js
index 59a5f8be..4bfa7e7b 100644
--- a/module/rdd-utility.js
+++ b/module/rdd-utility.js
@@ -5,7 +5,7 @@ import { Misc } from "./misc.js";
import { Grammar } from "./grammar.js";
import { TMRUtility } from "./tmr-utility.js";
import { DialogItemAchat } from "./dialog-item-achat.js";
-import { ReglesOptionelles } from "./settings/regles-optionelles.js";
+import { ReglesOptionnelles } from "./settings/regles-optionnelles.js";
import { RdDDice } from "./rdd-dice.js";
import { RdDItem } from "./item.js";
import { RdDPossession } from "./rdd-possession.js";
@@ -121,6 +121,7 @@ export class RdDUtility {
'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-hautreve.html',
+ 'systems/foundryvtt-reve-de-dragon/templates/actor/archetype.hbs',
'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-derivee.html',
@@ -278,7 +279,7 @@ export class RdDUtility {
Handlebars.registerHelper('timestamp-formulesPeriode', () => RdDTimestamp.formulesPeriode());
Handlebars.registerHelper('min', (...args) => Math.min(...args.slice(0, -1)));
- Handlebars.registerHelper('regle-optionnelle', (option) => ReglesOptionelles.isUsing(option));
+ Handlebars.registerHelper('regle-optionnelle', (option) => ReglesOptionnelles.isUsing(option));
Handlebars.registerHelper('trier', list => list.sort((a, b) => a.name.localeCompare(b.name)));
Handlebars.registerHelper('filtreTriCompetences', competences => RdDItemCompetence.triVisible(competences));
Handlebars.registerHelper('linkCompendium', (pack, id, name) => RdDUtility.linkCompendium(pack, id, name));
@@ -478,7 +479,7 @@ export class RdDUtility {
/* -------------------------------------------- */
static calculFatigueHtml(fatigue, endurance) {
- return ReglesOptionelles.isUsing("appliquer-fatigue") ? {
+ return ReglesOptionnelles.isUsing("appliquer-fatigue") ? {
malus: RdDUtility.calculMalusFatigue(fatigue, endurance),
html: "" + RdDUtility.makeHTMLfatigueMatrix(fatigue, endurance).html() + "
"
} : { malus: 0, html: '' };
@@ -554,14 +555,14 @@ export class RdDUtility {
let formula = "2d10";
// Chaque dé fait au minmum la difficulté libre
- if (ReglesOptionelles.isUsing('degat-minimum-malus-libre')) {
+ if (ReglesOptionnelles.isUsing('degat-minimum-malus-libre')) {
if (rollData.diffLibre < 0) {
let valeurMin = Math.abs(rollData.diffLibre);
formula += "min" + valeurMin;
}
}
// Chaque dé fait au minmum la difficulté libre
- if (ReglesOptionelles.isUsing('degat-ajout-malus-libre')) {
+ if (ReglesOptionnelles.isUsing('degat-ajout-malus-libre')) {
if (rollData.diffLibre < 0) {
let valeurMin = Math.abs(rollData.diffLibre);
formula += "+" + valeurMin;
@@ -571,7 +572,7 @@ export class RdDUtility {
let roll = await RdDDice.roll(formula, options);
// 1 dé fait au minmum la difficulté libre
- if (ReglesOptionelles.isUsing('degat-minimum-malus-libre-simple')) {
+ if (ReglesOptionnelles.isUsing('degat-minimum-malus-libre-simple')) {
if (rollData.diffLibre < 0) {
let valeurMin = Math.abs(rollData.diffLibre);
if (roll.terms[0].results[0].result < valeurMin) {
@@ -624,7 +625,7 @@ export class RdDUtility {
/* -------------------------------------------- */
static currentFatigueMalus(value, max) {
- if (ReglesOptionelles.isUsing("appliquer-fatigue")) {
+ if (ReglesOptionnelles.isUsing("appliquer-fatigue")) {
max = Math.max(1, Math.min(max, 60));
value = Math.min(max * 2, Math.max(0, value));
diff --git a/module/rolldata-ajustements.js b/module/rolldata-ajustements.js
index a141cae0..aa19a414 100644
--- a/module/rolldata-ajustements.js
+++ b/module/rolldata-ajustements.js
@@ -7,7 +7,7 @@ import { RdDBonus } from "./rdd-bonus.js";
import { RdDCarac } from "./rdd-carac.js";
import { RdDPossession } from "./rdd-possession.js";
import { RdDUtility } from "./rdd-utility.js";
-import { ReglesOptionelles } from "./settings/regles-optionelles.js";
+import { ReglesOptionnelles } from "./settings/regles-optionnelles.js";
/**
* tous les ajustements pouvant s'appliquer.
@@ -86,7 +86,7 @@ export const referenceAjustements = {
getValue: (rollData, actor) => actor.getMoralTotal()
},
astrologique: {
- isUsed: (rollData, actor) => ReglesOptionelles.isUsing("astrologie") && RdDBonus.isAjustementAstrologique(rollData),
+ isUsed: (rollData, actor) => ReglesOptionnelles.isUsing("astrologie") && RdDBonus.isAjustementAstrologique(rollData),
getLabel: (rollData, actor) => 'Astrologique',
getValue: (rollData, actor) => actor.ajustementAstrologique()
},
diff --git a/module/settings/regles-optionelles.js b/module/settings/regles-optionelles.js
deleted file mode 100644
index 04157cb5..00000000
--- a/module/settings/regles-optionelles.js
+++ /dev/null
@@ -1,119 +0,0 @@
-import { SYSTEM_RDD } from "../constants.js";
-import { Misc } from "../misc.js";
-
-const listeReglesOptionelles = [
- { group: 'Règles de combat', name: 'recul', descr: "Appliquer le recul en cas de particulière en force ou de charge" },
- { group: 'Règles de combat', name: 'resistanceArmeParade', descr: "Faire le jet de résistance des armes lors de parades pouvant les endommager" },
- { group: 'Règles de combat', name: 'deteriorationArmure', descr: "Tenir compte de la détérioration des armures" },
- { group: 'Règles de combat', name: 'defenseurDesarme', descr: "Le défenseur peut être désarmé en parant une particulière en force ou une charge avec une arme autre qu'un bouclier" },
- { group: 'Règles de combat', name: 'categorieParade', descr: "Le défenseur doit obtenir une significative en cas de parade avec des armes de catégories différentes" },
- { group: 'Règles de combat', name: 'tripleSignificative', descr: "En cas de demi-surprise, d'attaque particulière en finesse, et de catégories d'armes différentes, le défenseur doit obtenir 1/8 des chances de succès" },
- { group: 'Règles de combat', name: 'degat-minimum-malus-libre-simple', descr: "Le malus libre d'attaque remplace une des valeurs de dés d'encaissement si elle est plus petite. Exemple : la difficulté libre de l'attaquant est de -4. Sur le jet d'encaissement, si le plus petit dé est inférieur à 4, alors il devient 4.", default: false },
- { group: 'Règles de combat', name: 'degat-minimum-malus-libre', descr: "Le malus libre d'attaque remplace une valeur de dés d'encaissement si elle est plus petite. Exemple : la difficulté libre de l'attaquant est de -4. Sur le jet d'encaissement, tout résultat inférieur à 4 devient 4.", default: false },
- { group: 'Règles de combat', name: 'degat-ajout-malus-libre', descr: "Le malus libre d'attaque s'ajoute au jet d'encaissement et aux autres bonus. Exemple : la difficulté libre de l'attaquant est de -4. Le jet d'encaissement est effectué à 2d10+4, plus les bonus de situation et d'armes.", default: false },
- { group: 'Règles de combat', name: 'validation-encaissement-gr', descr: "Le Gardien des Rêves doit valider les jets d'encaissement et peut les changer.", default: false },
-
- { group: 'Règles générales', name: 'astrologie', descr: "Appliquer les ajustements astrologiques aux jets de chance et aux rituels"},
- { group: 'Règles générales', name: 'afficher-prix-joueurs', descr: "Afficher le prix de l'équipement des joueurs", uniquementJoueur: true},
- { group: 'Règles générales', name: 'appliquer-fatigue', descr: "Appliquer les règles de fatigue"},
- { group: 'Règles générales', name: 'afficher-colonnes-reussite', descr: "Afficher le nombre de colonnes de réussite ou d'échec", default: false },
- { group: 'Règles générales', name: 'chateau-dormant-gardien', descr: "Saisie des heures de sommeil/jets de moral par le gardien des rêves", default: true },
-
- { group: 'Confirmations', name: 'confirmer-combat-sans-cible', descr: "Confirmer avant une attaque sans cible", scope: "client"},
- { group: 'Confirmations', name: 'confirmation-tmr', descr: "Confirmer pour monter dans les TMR", scope: "client"},
- { group: 'Confirmations', name: 'confirmation-refouler', descr: "Confirmer avant de refouler", scope: "client"},
- { group: 'Confirmations', name: 'confirmation-vider', descr: "Confirmer pour vider l'équipement", scope: "client"},
- { group: 'Confirmations', name: 'confirmation-supprimer-lien-acteur', descr: "Confirmer pour détacher un animal/suivant/véhicule", scope: "client"},
- { group: 'Confirmations', name: 'confirmation-supprimer-equipement', descr: "Confirmer la suppression des équipements", scope: "client"},
- { group: 'Confirmations', name: 'confirmation-supprimer-oeuvre', descr: "Confirmer la suppression des oeuvres", scope: "client"},
- { group: 'Confirmations', name: 'confirmation-supprimer-connaissance', descr: "Confirmer la suppression des connaissances", scope: "client"},
- { group: 'Confirmations', name: 'confirmation-supprimer-draconique', descr: "Confirmer la suppression des queues, souffles, têtes", scope: "client"},
- { group: 'Confirmations', name: 'confirmation-supprimer-effet', descr: "Confirmer la suppression des effets", scope: "client"},
- { group: 'Confirmations', name: 'confirmation-supprimer-competence', descr: "Confirmer la suppression des compétences", scope: "client"},
- { group: 'Confirmations', name: 'confirmation-supprimer-autres', descr: "Confirmer la suppression des autres types d'Objets", scope: "client"},
-];
-
-const uniquementJoueur = listeReglesOptionelles.filter(it => it.uniquementJoueur).map(it=>it.name);
-
-export class ReglesOptionelles extends FormApplication {
- static init() {
- for (const regle of listeReglesOptionelles) {
- const name = regle.name;
- const id = ReglesOptionelles._getIdRegle(name);
- game.settings.register(SYSTEM_RDD, id, { name: id, scope: regle.scope ?? "world", config: false, default: regle.default == undefined ? true : regle.default, type: Boolean });
- }
-
- game.settings.registerMenu(SYSTEM_RDD, "rdd-options-regles", {
- name: "Choisir les règles optionelles",
- label: "Règles optionelles",
- hint: "Ouvre la fenêtre de sélection des règles optionelles",
- icon: "fas fa-bars",
- type: ReglesOptionelles
- });
- }
-
- constructor(...args) {
- super(...args);
- }
-
- static _getIdRegle(name) {
- return `rdd-option-${name}`;
- }
-
- static get defaultOptions() {
- const options = super.defaultOptions;
- mergeObject(options, {
- id: "regles-optionelles",
- template: "systems/foundryvtt-reve-de-dragon/templates/settings/regles-optionelles.html",
- height: 600,
- width: 450,
- minimizable: false,
- closeOnSubmit: true,
- title: "Règles optionnelles"
- });
- return options;
- }
-
- getData() {
- let formData = super.getData();
- const regles = listeReglesOptionelles.filter(it => game.user.isGM || it.scope == "client").map(it => {
- it = duplicate(it);
- it.id = ReglesOptionelles._getIdRegle(it.name);
- it.active = ReglesOptionelles.isSet(it.name);
- return it;
- });
- formData.regles = regles;
- formData.groups = Misc.classify(regles, it => it.group);
- return formData;
- }
-
- static isUsing(name) {
- if (game.user.isGM && uniquementJoueur.includes(name)) {
- return true;
- }
- return ReglesOptionelles.isSet(name);
- }
-
- static isSet(name) {
- return game.settings.get(SYSTEM_RDD, ReglesOptionelles._getIdRegle(name));
- }
-
- static set(name, value) {
- return game.settings.set(SYSTEM_RDD, ReglesOptionelles._getIdRegle(name), value ? true: false);
- }
-
- activateListeners(html) {
- html.find(".select-option").click((event) => {
- if (event.currentTarget.attributes.name) {
- let id = event.currentTarget.attributes.name.value;
- let isChecked = event.currentTarget.checked;
- game.settings.set(SYSTEM_RDD, id, isChecked);
- }
- });
- }
-
- async _updateObject(event, formData) {
- this.close();
- }
-}
-
diff --git a/module/settings/regles-optionnelles.js b/module/settings/regles-optionnelles.js
new file mode 100644
index 00000000..8f3f3bf1
--- /dev/null
+++ b/module/settings/regles-optionnelles.js
@@ -0,0 +1,122 @@
+import { SYSTEM_RDD } from "../constants.js";
+import { Misc } from "../misc.js";
+
+const listeReglesOptionnelles = [
+ { group: 'Règles générales', name: 'appliquer-fatigue', descr: "Appliquer les règles de fatigue"},
+ { group: 'Règles générales', name: 'astrologie', descr: "Appliquer les ajustements astrologiques aux jets de chance et aux rituels"},
+
+ { group: 'Règles de combat', name: 'recul', descr: "Appliquer le recul en cas de particulière en force ou de charge" },
+ { group: 'Règles de combat', name: 'resistanceArmeParade', descr: "Faire le jet de résistance des armes lors de parades pouvant les endommager" },
+ { group: 'Règles de combat', name: 'deteriorationArmure', descr: "Tenir compte de la détérioration des armures" },
+ { group: 'Règles de combat', name: 'defenseurDesarme', descr: "Le défenseur peut être désarmé en parant une particulière en force ou une charge avec une arme autre qu'un bouclier" },
+ { group: 'Règles de combat', name: 'categorieParade', descr: "Le défenseur doit obtenir une significative en cas de parade avec des armes de catégories différentes" },
+ { group: 'Règles de combat', name: 'tripleSignificative', descr: "En cas de demi-surprise, d'attaque particulière en finesse, et de catégories d'armes différentes, le défenseur doit obtenir 1/8 des chances de succès" },
+ { group: 'Règles de combat', name: 'validation-encaissement-gr', descr: "Le Gardien des Rêves doit valider les jets d'encaissement et peut les changer.", default: false },
+
+ { group: 'Automatisation', name: 'chateau-dormant-gardien', descr: "Saisie des heures de sommeil/jets de moral par le gardien des rêves", default: true },
+
+ { group: 'Affichage', name: 'afficher-colonnes-reussite', descr: "Afficher le nombre de colonnes de réussite ou d'échec", default: false },
+ { group: 'Affichage', name: 'afficher-prix-joueurs', descr: "Afficher le prix de l'équipement des joueurs", uniquementJoueur: true},
+
+ { group: 'Confirmations', name: 'confirmer-combat-sans-cible', descr: "Confirmer avant une attaque sans cible", scope: "client"},
+ { group: 'Confirmations', name: 'confirmation-tmr', descr: "Confirmer pour monter dans les TMR", scope: "client"},
+ { group: 'Confirmations', name: 'confirmation-refouler', descr: "Confirmer avant de refouler", scope: "client"},
+ { group: 'Confirmations', name: 'confirmation-vider', descr: "Confirmer pour vider l'équipement", scope: "client"},
+ { group: 'Confirmations', name: 'confirmation-supprimer-lien-acteur', descr: "Confirmer pour détacher un animal/suivant/véhicule", scope: "client"},
+ { group: 'Confirmations', name: 'confirmation-supprimer-equipement', descr: "Confirmer la suppression des équipements", scope: "client"},
+ { group: 'Confirmations', name: 'confirmation-supprimer-oeuvre', descr: "Confirmer la suppression des oeuvres", scope: "client"},
+ { group: 'Confirmations', name: 'confirmation-supprimer-connaissance', descr: "Confirmer la suppression des connaissances", scope: "client"},
+ { group: 'Confirmations', name: 'confirmation-supprimer-draconique', descr: "Confirmer la suppression des queues, souffles, têtes", scope: "client"},
+ { group: 'Confirmations', name: 'confirmation-supprimer-effet', descr: "Confirmer la suppression des effets", scope: "client"},
+ { group: 'Confirmations', name: 'confirmation-supprimer-competence', descr: "Confirmer la suppression des compétences", scope: "client"},
+ { group: 'Confirmations', name: 'confirmation-supprimer-autres', descr: "Confirmer la suppression des autres types d'Objets", scope: "client"},
+
+ { group: 'Options alternatives', name: 'degat-minimum-malus-libre-simple', descr: "Le malus libre d'attaque remplace une des valeurs de dés d'encaissement si elle est plus petite. Exemple : la difficulté libre de l'attaquant est de -4. Sur le jet d'encaissement, si le plus petit dé est inférieur à 4, alors il devient 4.", default: false },
+ { group: 'Options alternatives', name: 'degat-minimum-malus-libre', descr: "Le malus libre d'attaque remplace une valeur de dés d'encaissement si elle est plus petite. Exemple : la difficulté libre de l'attaquant est de -4. Sur le jet d'encaissement, tout résultat inférieur à 4 devient 4.", default: false },
+ { group: 'Options alternatives', name: 'degat-ajout-malus-libre', descr: "Le malus libre d'attaque s'ajoute au jet d'encaissement et aux autres bonus. Exemple : la difficulté libre de l'attaquant est de -4. Le jet d'encaissement est effectué à 2d10+4, plus les bonus de situation et d'armes.", default: false },
+];
+
+const uniquementJoueur = listeReglesOptionnelles.filter(it => it.uniquementJoueur).map(it=>it.name);
+
+export class ReglesOptionnelles extends FormApplication {
+ static init() {
+ for (const regle of listeReglesOptionnelles) {
+ const name = regle.name;
+ const id = ReglesOptionnelles._getIdRegle(name);
+ game.settings.register(SYSTEM_RDD, id, { name: id, scope: regle.scope ?? "world", config: false, default: regle.default == undefined ? true : regle.default, type: Boolean });
+ }
+
+ game.settings.registerMenu(SYSTEM_RDD, "rdd-options-regles", {
+ name: "Choisir les règles optionnelles",
+ label: "Règles optionnelles",
+ hint: "Ouvre la fenêtre de sélection des règles optionnelles",
+ icon: "fas fa-bars",
+ type: ReglesOptionnelles
+ });
+ }
+
+ constructor(...args) {
+ super(...args);
+ }
+
+ static _getIdRegle(name) {
+ return `rdd-option-${name}`;
+ }
+
+ static get defaultOptions() {
+ const options = super.defaultOptions;
+ mergeObject(options, {
+ id: "regles-optionnelles",
+ template: "systems/foundryvtt-reve-de-dragon/templates/settings/regles-optionnelles.html",
+ height: 600,
+ width: 450,
+ minimizable: false,
+ closeOnSubmit: true,
+ title: "Règles optionnelles"
+ });
+ return options;
+ }
+
+ getData() {
+ let formData = super.getData();
+ const regles = listeReglesOptionnelles.filter(it => game.user.isGM || it.scope == "client").map(it => {
+ it = duplicate(it);
+ it.id = ReglesOptionnelles._getIdRegle(it.name);
+ it.active = ReglesOptionnelles.isSet(it.name);
+ return it;
+ });
+ formData.regles = regles;
+ formData.groups = Misc.classify(regles, it => it.group);
+ return formData;
+ }
+
+ static isUsing(name) {
+ if (game.user.isGM && uniquementJoueur.includes(name)) {
+ return true;
+ }
+ return ReglesOptionnelles.isSet(name);
+ }
+
+ static isSet(name) {
+ return game.settings.get(SYSTEM_RDD, ReglesOptionnelles._getIdRegle(name));
+ }
+
+ static set(name, value) {
+ return game.settings.set(SYSTEM_RDD, ReglesOptionnelles._getIdRegle(name), value ? true: false);
+ }
+
+ activateListeners(html) {
+ html.find(".select-option").click((event) => {
+ if (event.currentTarget.attributes.name) {
+ let id = event.currentTarget.attributes.name.value;
+ let isChecked = event.currentTarget.checked;
+ game.settings.set(SYSTEM_RDD, id, isChecked);
+ }
+ });
+ }
+
+ async _updateObject(event, formData) {
+ this.close();
+ }
+}
+
diff --git a/module/sommeil/dialog-repos.js b/module/sommeil/dialog-repos.js
index 2c766c1a..d895c8ee 100644
--- a/module/sommeil/dialog-repos.js
+++ b/module/sommeil/dialog-repos.js
@@ -1,4 +1,4 @@
-import { ReglesOptionelles } from "../settings/regles-optionelles.js";
+import { ReglesOptionnelles } from "../settings/regles-optionnelles.js";
import { EffetsDraconiques } from "../tmr/effets-draconiques.js";
export class DialogRepos extends Dialog {
@@ -7,7 +7,7 @@ export class DialogRepos extends Dialog {
if (!actor.isPersonnage()) {
return
}
- if (!ReglesOptionelles.isUsing("chateau-dormant-gardien") || !actor.hasPlayerOwner) {
+ if (!ReglesOptionnelles.isUsing("chateau-dormant-gardien") || !actor.hasPlayerOwner) {
actor.system.sommeil = {
"nouveaujour": true,
"insomnie": EffetsDraconiques.isSujetInsomnie(actor),
diff --git a/module/time/rdd-calendrier.js b/module/time/rdd-calendrier.js
index 4e45b7cc..f1c603f0 100644
--- a/module/time/rdd-calendrier.js
+++ b/module/time/rdd-calendrier.js
@@ -6,7 +6,7 @@ import { RdDDice } from "../rdd-dice.js";
import { Misc } from "../misc.js";
import { DialogChronologie } from "../dialog-chronologie.js";
import { HIDE_DICE, SHOW_DICE, SYSTEM_RDD, SYSTEM_SOCKET_ID } from "../constants.js";
-import { ReglesOptionelles } from "../settings/regles-optionelles.js";
+import { ReglesOptionnelles } from "../settings/regles-optionnelles.js";
import { DialogChateauDormant } from "../sommeil/dialog-chateau-dormant.js";
import { APP_ASTROLOGIE_REFRESH, AppAstrologie } from "../sommeil/app-astrologie.js";
@@ -305,7 +305,7 @@ export class RdDCalendrier extends Application {
const oldTimestamp = this.timestamp;
await Promise.all(game.actors.map(async actor => await actor.onTimeChanging(oldTimestamp, newTimestamp)));
RdDTimestamp.setWorldTime(newTimestamp);
- if (oldTimestamp.indexDate + 1 == newTimestamp.indexDate && ReglesOptionelles.isUsing("chateau-dormant-gardien")) {
+ if (oldTimestamp.indexDate + 1 == newTimestamp.indexDate && ReglesOptionnelles.isUsing("chateau-dormant-gardien")) {
await DialogChateauDormant.create();
}
this.timestamp = newTimestamp;
diff --git a/module/time/rdd-timestamp.js b/module/time/rdd-timestamp.js
index 948dd97b..9da28801 100644
--- a/module/time/rdd-timestamp.js
+++ b/module/time/rdd-timestamp.js
@@ -156,7 +156,9 @@ export class RdDTimestamp {
fields.minute.change(async (event) => await onChangeTimestamp(fields, path));
}
-
+ static defHeure(heure) {
+ return DEFINITION_HEURES.find(it => (it.heure) == heure % RDD_HEURES_PAR_JOUR);
+ }
static findHeure(heure) {
heure = Grammar.toLowerCaseNoAccentNoSpace(heure);
let parHeureOuLabel = DEFINITION_HEURES.filter(it => (it.heure) == parseInt(heure) % RDD_HEURES_PAR_JOUR || Grammar.toLowerCaseNoAccentNoSpace(it.label) == heure);
diff --git a/styles/simple.css b/styles/simple.css
index 2dc2e31e..03760217 100644
--- a/styles/simple.css
+++ b/styles/simple.css
@@ -287,6 +287,16 @@ table {border: 1px solid #7a7971;}
padding: 0;
}
+
+.grid-competence-archetype {
+ display: grid;
+ grid-column: span 3 / span 3;
+ grid-template-columns: 2fr 2fr 1fr;
+ gap: 0.5rem;
+ margin: 0.5rem 0;
+ padding: 0;
+}
+
.grid-3col {
grid-column: span 3 / span 3;
grid-template-columns: repeat(3, minmax(0, 1fr));
@@ -1898,34 +1908,51 @@ div.calendar-timestamp-edit select.calendar-signe-heure {
opacity: 1;
}
-.chat-card-button {
- box-shadow: inset 0px 1px 0px 0px #a6827e;
- background: var(--background-custom-button);
- background-color: #7d5d3b00;
- border-radius: 3px;
- border: 2px ridge #846109;
- display: inline-block;
+.chat-card-button, .chat-card-button-pushed {
+ border-radius: 0.2rem;
cursor: pointer;
- color: #ffffff;
font-family: CaslonPro;
font-size: 0.9rem;
- padding: 4px 12px 0px 12px;
+ padding: 0.2rem 0.4rem 0rem 0.4rem;
text-decoration: none;
- text-shadow: 0px 1px 0px #4d3534;
position: relative;
- margin:5px;
+ margin: 0.3rem;
+
+ border: 2px ridge #846109;
+ display: inline-block;
}
+.chat-card-button{
+ text-shadow: 1px 1px #4d3534;
+ box-shadow: inset 1x 1px #a6827e;
+ color: var(--major-button-color);
+ background: var(--background-custom-button);
+ background-color: #7d5d3b00;
+}
+
+.chat-card-button-pushed {
+ text-shadow: 1px 1px hsla(202, 30%, 70%, 0.5);
+ box-shadow: inset -1px -1px #a6827e;
+ color: hsla(202, 42%, 14%, 0.7);
+ background: var(--major-button-color);
+ background-color: #7d5d3b00;
+}
.chat-card-button:hover {
background: var(--background-custom-button-hover);
background-color: red;
}
-.chat-card-button:active {
+.chat-card-button-pushed:hover {
+ background: var(--background-custom-button-hover);
+ background-color: red;
+}
+
+.chat-card-button:active, .chat-card-button-pushed:active {
position:relative;
top:1px;
}
+
/* Dropdown Content (Hidden by Default) */
.button-dropdown-content {
display: none;
diff --git a/system.json b/system.json
index ebe15644..439ad5bf 100644
--- a/system.json
+++ b/system.json
@@ -1,8 +1,8 @@
{
"id": "foundryvtt-reve-de-dragon",
"title": "Rêve de Dragon",
- "version": "11.0.8",
- "download": "https://www.uberwald.me/gitea/public/foundryvtt-reve-de-dragon/archive/foundryvtt-reve-de-dragon-11.0.8.zip",
+ "version": "11.0.9",
+ "download": "https://www.uberwald.me/gitea/public/foundryvtt-reve-de-dragon/archive/foundryvtt-reve-de-dragon-11.0.9.zip",
"manifest": "https://www.uberwald.me/gitea/public/foundryvtt-reve-de-dragon/raw/v11/system.json",
"changelog": "https://www.uberwald.me/gitea/public/foundryvtt-reve-de-dragon/raw/branch/v11/changelog.md",
"compatibility": {
diff --git a/templates/actor-sheet.html b/templates/actor-sheet.html
index ad98f9f2..265aa607 100644
--- a/templates/actor-sheet.html
+++ b/templates/actor-sheet.html
@@ -53,7 +53,9 @@
{{#if options.isObserver}}{{!-- Compétences Tab --}}
-
+
{{> "systems/foundryvtt-reve-de-dragon/templates/actor/competence-categorie.html" competences=(filtreTriCompetences byCateg.generale) categorie="Compétences générales"}}
{{> "systems/foundryvtt-reve-de-dragon/templates/actor/competence-categorie.html" competences=(filtreTriCompetences byCateg.particuliere) categorie="Compétences Particulières"}}
@@ -83,6 +93,11 @@
{{> "systems/foundryvtt-reve-de-dragon/templates/actor/competence-categorie.html" competences=(filtreTriCompetences byCateg.draconic) categorie="Draconic"}}
{{/if}}
+ {{#if (and options.vueDetaillee options.vueArchetype)}}
+
+ {{> "systems/foundryvtt-reve-de-dragon/templates/actor/archetype.hbs"}}
+
+ {{/if}}
{{/if}}
diff --git a/templates/actor/archetype.hbs b/templates/actor/archetype.hbs
new file mode 100644
index 00000000..20b8200b
--- /dev/null
+++ b/templates/actor/archetype.hbs
@@ -0,0 +1,21 @@
+
+
+ {{#if @root.options.isGM}}
+
+ Nouvelle incarnation
+
+ {{/if}}
+
+ Niveaux d'archétype
+ {{#if calc.comptageArchetype}}
+ {{#each calc.comptageArchetype as |archetype|}}
+
+
+
+ Niveaux {{numberFormat archetype.niveau decimals=0 sign=true}} : {{archetype.nombre}} / {{archetype.nombreMax}}
+
+
+ {{/each}}
+ {{/if}}
+
+
diff --git a/templates/actor/competence.html b/templates/actor/competence.html
index d954ea9c..38996591 100644
--- a/templates/actor/competence.html
+++ b/templates/actor/competence.html
@@ -14,12 +14,13 @@
+ {{#if (or (not @root.options.vueDetaillee) @root.options.vueArchetype)}}disabled{{/if}} />
{{#if @root.options.vueDetaillee}}
+ value="{{numberFormat system.xp decimals=0 sign=false}}" data-dtype="number"
+ {{#if (or (not @root.options.vueDetaillee) @root.options.vueArchetype)}}disabled{{/if}} />
{{#unless system.isLevelUp}}
Vous devez acquérir {{system.xpNext}} points d'Experience pour augmenter de 1 votre compétence {{name}}
{{/unless}}
@@ -28,7 +29,7 @@
{{#if (eq system.categorie 'draconic')}}
+ {{#if (or (not @root.options.vueDetaillee) @root.options.vueArchetype)}}disabled{{/if}} />
{{/if}}
{{#if @root.options.vueDetaillee}}
@@ -41,7 +42,8 @@
{{/if}}
+ value="{{numberFormat system.niveau_archetype decimals=0 sign=true}}" data-dtype="number"
+ {{#if (not @root.options.vueArchetype)}}disabled{{/if}} />
{{#if @root.options.isGM}}
diff --git a/templates/actor/xp-competences.html b/templates/actor/xp-competences.html
index c70d6b62..13d924ff 100644
--- a/templates/actor/xp-competences.html
+++ b/templates/actor/xp-competences.html
@@ -13,18 +13,7 @@
Total XP compétences
{{calc.competenceXPTotal}}
- {{#if calc.comptageArchetype}}
-
-
Niveaux d'archétype à répartir
- {{#each calc.comptageArchetype as |archetype key|}}
- {{#if (gt archetype.reste 0)}}
-
- Reste {{archetype.reste}} niveaux {{numberFormat archetype.niveau decimals=0 sign=true}} sur {{archetype.nombreMax}}
-
- {{/if}}
- {{/each}}
- {{/if}}
- {{/if}}
+ {{/if}}
diff --git a/templates/settings/regles-optionelles.html b/templates/settings/regles-optionnelles.html
similarity index 100%
rename from templates/settings/regles-optionelles.html
rename to templates/settings/regles-optionnelles.html