Compare commits
	
		
			7 Commits
		
	
	
		
			foundryvtt
			...
			foundryvtt
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| f08c8f93da | |||
| d28362bf14 | |||
| e506382d18 | |||
| c1cecc76b3 | |||
| f2a3e1db45 | |||
| b69359a47d | |||
| fe6c2e2ff2 | 
							
								
								
									
										11
									
								
								changelog.md
									
									
									
									
									
								
							
							
						
						
									
										11
									
								
								changelog.md
									
									
									
									
									
								
							@@ -1,5 +1,14 @@
 | 
			
		||||
# v11.0
 | 
			
		||||
## v11.0.21
 | 
			
		||||
## v11.0.24 - les couleurs de Khrachtchoum
 | 
			
		||||
- nouvelle carte des TMRs
 | 
			
		||||
 | 
			
		||||
## v11.0.23 - la lumière de Khrachtchoum
 | 
			
		||||
- ajustement automatique de la luminosité selon l'heure pour les scènes:
 | 
			
		||||
   - avec une vision des tokens (sinon: ce n'est pas une scène de carte pour tokens)
 | 
			
		||||
   - avec illumination globale (correspondant à une illumination extérieure)
 | 
			
		||||
   - quand lampe "allumée" dans la fenêtre du calendrier
 | 
			
		||||
 | 
			
		||||
## v11.0.22 - les automatismes de Khrachtchoum le Problémeux
 | 
			
		||||
- Macro pour attaquer avec les compétences de créatures
 | 
			
		||||
 | 
			
		||||
## v11.0.20
 | 
			
		||||
 
 | 
			
		||||
@@ -59,6 +59,7 @@ import { RdDSigneDraconiqueItemSheet } from "./item/sheet-signedraconique.js";
 | 
			
		||||
import { RdDItemInventaireSheet } from "./item/sheet-base-inventaire.js";
 | 
			
		||||
import { AppAstrologie } from "./sommeil/app-astrologie.js";
 | 
			
		||||
import { RdDItemArmure } from "./item/armure.js";
 | 
			
		||||
import { AutoAdjustDarkness as AutoAdjustDarkness } from "./time/auto-adjust-darkness.js";
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * RdD system
 | 
			
		||||
@@ -182,6 +183,7 @@ export class SystemReveDeDragon {
 | 
			
		||||
    CONFIG.Combat.documentClass = RdDCombatManager;
 | 
			
		||||
 | 
			
		||||
    // préparation des différents modules
 | 
			
		||||
    AutoAdjustDarkness.init();
 | 
			
		||||
    RdDTimestamp.init();
 | 
			
		||||
    RdDCalendrier.init();
 | 
			
		||||
    SystemCompendiums.init();
 | 
			
		||||
 
 | 
			
		||||
@@ -46,7 +46,7 @@ export class RdDTMRDialog extends Dialog {
 | 
			
		||||
 | 
			
		||||
    const dialogOptions = {
 | 
			
		||||
      classes: ["tmrdialog"],
 | 
			
		||||
      width: 920, height: 980,
 | 
			
		||||
      width: 920, maxheight: 1024, height: 'fit-content',
 | 
			
		||||
      'z-index': 40
 | 
			
		||||
    }
 | 
			
		||||
    super(dialogConf, dialogOptions);
 | 
			
		||||
@@ -62,7 +62,6 @@ export class RdDTMRDialog extends Dialog {
 | 
			
		||||
    this.allTokens = [];
 | 
			
		||||
    this.rencontreState = 'aucune';
 | 
			
		||||
    this.pixiApp = new PIXI.Application({ width: 720, height: 860 });
 | 
			
		||||
 | 
			
		||||
    this.pixiTMR = new PixiTMR(this, this.pixiApp);
 | 
			
		||||
 | 
			
		||||
    this.callbacksOnAnimate = [];
 | 
			
		||||
@@ -906,15 +905,12 @@ export class RdDTMRDialog extends Dialog {
 | 
			
		||||
    if (this.viewOnly) {
 | 
			
		||||
      return;
 | 
			
		||||
    }
 | 
			
		||||
    let clickOddq = RdDTMRDialog._computeEventOddq(event.nativeEvent);
 | 
			
		||||
    await this._onClickTMRPos(clickOddq); // Vérifier l'état des compteurs reve/fatigue/vie
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /* -------------------------------------------- */
 | 
			
		||||
  async _onClickTMRPos(clickOddq) {
 | 
			
		||||
    let clickOddq = TMRUtility.computeEventOddq(event);
 | 
			
		||||
    let currentOddq = TMRUtility.coordTMRToOddq(this._getActorCoord());
 | 
			
		||||
 | 
			
		||||
    let targetCoord = TMRUtility.oddqToCoordTMR(clickOddq);
 | 
			
		||||
    let currentCoord = TMRUtility.oddqToCoordTMR(currentOddq);
 | 
			
		||||
 | 
			
		||||
    // Validation de la case de destination (gestion du cas des rencontres qui peuvent téléporter)
 | 
			
		||||
    let deplacementType = this._calculDeplacement(targetCoord, currentCoord, currentOddq, clickOddq);
 | 
			
		||||
 | 
			
		||||
@@ -946,7 +942,7 @@ export class RdDTMRDialog extends Dialog {
 | 
			
		||||
        await this._messagerDemiReve(targetCoord);
 | 
			
		||||
        break;
 | 
			
		||||
      default:
 | 
			
		||||
        ui.notifications.error("Vous ne pouvez pas vous déplacer que sur des cases adjacentes à votre position ou valides dans le cas d'une rencontre");
 | 
			
		||||
        ui.notifications.error("Vous ne pouvez vous déplacer que sur des cases adjacentes à votre position ou valides dans le cas d'une rencontre");
 | 
			
		||||
        console.log("STATUS :", this.rencontreState, this.currentRencontre);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -1049,19 +1045,6 @@ export class RdDTMRDialog extends Dialog {
 | 
			
		||||
    await this.postRencontre(tmr);
 | 
			
		||||
    return tmr;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /* -------------------------------------------- */
 | 
			
		||||
  static _computeEventOddq(origEvent) {
 | 
			
		||||
    console.log("EVENT", origEvent)
 | 
			
		||||
    let canvasRect = origEvent.target.getBoundingClientRect();
 | 
			
		||||
    let x = origEvent.clientX - canvasRect.left;
 | 
			
		||||
    let y = origEvent.clientY - canvasRect.top;
 | 
			
		||||
    let col = Math.floor(x / tmrConstants.cellw); //  [From 0 -> 12]
 | 
			
		||||
    y -= col % 2 == 0 ? tmrConstants.col1_y : tmrConstants.col2_y;
 | 
			
		||||
    let row = Math.floor(y / tmrConstants.cellh); //  [From 0 -> 14]
 | 
			
		||||
    return { col: col, row: row };
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /* -------------------------------------------- */
 | 
			
		||||
  /** Retourne les coordonnées x, h, w, h du rectangle d'une case donnée */
 | 
			
		||||
  _getCaseRectangleCoord(coord) {
 | 
			
		||||
 
 | 
			
		||||
@@ -128,7 +128,7 @@ export class AppAstrologie extends Application {
 | 
			
		||||
      this.selectHeureNaissance(event.currentTarget.attributes['data-heure-naissance'].value);
 | 
			
		||||
    })
 | 
			
		||||
    this.html.find('[name="jet-astrologie"]').click(event => this.requestJetAstrologie());
 | 
			
		||||
    this.html.find('[name="rebuild-nombres-astraux"]').click(event => this.rebuildNombresAstraux());
 | 
			
		||||
    this.html.find('[name="rebuild-nombres-astraux"]').click(event => this.onRebuild());
 | 
			
		||||
 | 
			
		||||
    this.onCalculThemeAstral();
 | 
			
		||||
  }
 | 
			
		||||
@@ -144,7 +144,7 @@ export class AppAstrologie extends Application {
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /* -------------------------------------------- */
 | 
			
		||||
  async rebuildNombresAstraux() {
 | 
			
		||||
  async onRebuild() {
 | 
			
		||||
    game.system.rdd.calendrier.resetNombresAstraux();
 | 
			
		||||
 | 
			
		||||
    await game.system.rdd.calendrier.rebuildNombresAstraux();
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										34
									
								
								module/time/auto-adjust-darkness.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										34
									
								
								module/time/auto-adjust-darkness.js
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,34 @@
 | 
			
		||||
import { SYSTEM_RDD } from "../constants.js";
 | 
			
		||||
 | 
			
		||||
export const AUTO_ADJUST_DARKNESS = "auto-adjust-darkness";
 | 
			
		||||
 | 
			
		||||
export class AutoAdjustDarkness {
 | 
			
		||||
 | 
			
		||||
  static init() {
 | 
			
		||||
    game.settings.register(SYSTEM_RDD, AUTO_ADJUST_DARKNESS, {
 | 
			
		||||
      name: AUTO_ADJUST_DARKNESS,
 | 
			
		||||
      scope: "world",
 | 
			
		||||
      config: false,
 | 
			
		||||
      default: true,
 | 
			
		||||
      type: Boolean
 | 
			
		||||
    });
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  static async adjust(darkness) {
 | 
			
		||||
    if (AutoAdjustDarkness.isAuto()) {
 | 
			
		||||
      const scene = game.scenes.viewed;
 | 
			
		||||
      if (scene.globalLight && scene.tokenVision) {
 | 
			
		||||
        await scene.update({ darkness });
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  static isAuto() {
 | 
			
		||||
    return game.settings.get(SYSTEM_RDD, AUTO_ADJUST_DARKNESS);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  static async toggle() {
 | 
			
		||||
    const previous = AutoAdjustDarkness.isAuto();
 | 
			
		||||
    await game.settings.set(SYSTEM_RDD, AUTO_ADJUST_DARKNESS, !previous)
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
@@ -5,10 +5,11 @@ import { RdDUtility } from "../rdd-utility.js";
 | 
			
		||||
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 { HIDE_DICE, SYSTEM_RDD, SYSTEM_SOCKET_ID } from "../constants.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";
 | 
			
		||||
import { AutoAdjustDarkness } from "./auto-adjust-darkness.js";
 | 
			
		||||
 | 
			
		||||
const TEMPLATE_CALENDRIER = "systems/foundryvtt-reve-de-dragon/templates/time/calendar.hbs";
 | 
			
		||||
 | 
			
		||||
@@ -51,7 +52,7 @@ export class RdDCalendrier extends Application {
 | 
			
		||||
    if (Misc.isUniqueConnectedGM()) { // Uniquement si GM
 | 
			
		||||
      RdDTimestamp.setWorldTime(this.timestamp);
 | 
			
		||||
      this.nombresAstraux = this.getNombresAstraux();
 | 
			
		||||
      this.rebuildNombresAstraux(HIDE_DICE); // Ensure always up-to-date
 | 
			
		||||
      this.rebuildNombresAstraux(); // Ensure always up-to-date
 | 
			
		||||
    }
 | 
			
		||||
    Hooks.on('updateSetting', async (setting, update, options, id) => this.onUpdateSetting(setting, update, options, id));
 | 
			
		||||
  }
 | 
			
		||||
@@ -84,26 +85,20 @@ export class RdDCalendrier extends Application {
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  display() {
 | 
			
		||||
    AutoAdjustDarkness.adjust(RdDTimestamp.getWorldTime().darkness);
 | 
			
		||||
    const pos = this.getSavePosition()
 | 
			
		||||
    this.render(true, { left: pos.left, top: pos.top });
 | 
			
		||||
    return this;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  _getHeaderButtons() {
 | 
			
		||||
    const buttons = [];
 | 
			
		||||
    if (game.user.isGM) {
 | 
			
		||||
      buttons.unshift({
 | 
			
		||||
        class: "calendar-astrologie",
 | 
			
		||||
        icon: "fa-solid fa-moon-over-sun",
 | 
			
		||||
        onclick: ev => this.showAstrologieEditor()
 | 
			
		||||
      },
 | 
			
		||||
        {
 | 
			
		||||
          class: "calendar-set-datetime",
 | 
			
		||||
          icon: "fa-solid fa-calendar-pen",
 | 
			
		||||
          onclick: ev => this.showCalendarEditor()
 | 
			
		||||
        });
 | 
			
		||||
      return [
 | 
			
		||||
        { class: "calendar-astrologie", icon: "fa-solid fa-moon-over-sun", onclick: ev => this.showAstrologieEditor() },
 | 
			
		||||
        { class: "calendar-set-datetime", icon: "fa-solid fa-calendar-pen", onclick: ev => this.showCalendarEditor() },
 | 
			
		||||
      ]
 | 
			
		||||
    }
 | 
			
		||||
    return buttons
 | 
			
		||||
    return []
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  async close() { }
 | 
			
		||||
@@ -129,6 +124,7 @@ export class RdDCalendrier extends Application {
 | 
			
		||||
    formData.isGM = game.user.isGM;
 | 
			
		||||
    formData.heures = RdDTimestamp.definitions()
 | 
			
		||||
    formData.horlogeAnalogique = this.horlogeAnalogique;
 | 
			
		||||
    formData.autoDarkness = AutoAdjustDarkness.isAuto()
 | 
			
		||||
    return formData;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
@@ -139,6 +135,7 @@ export class RdDCalendrier extends Application {
 | 
			
		||||
    this.html = html;
 | 
			
		||||
    this.html.find('.ajout-chronologie').click(ev => DialogChronologie.create());
 | 
			
		||||
    this.html.find('.toggle-horloge-analogique').click(ev => this.onToggleHorlogeAnalogique())
 | 
			
		||||
    this.html.find('.toggle-auto-darkness').click(ev => this.onToggleAutoDarkness())
 | 
			
		||||
    this.html.find('.calendar-btn').click(ev => this.onCalendarButton(ev));
 | 
			
		||||
    this.html.find('.horloge-roue .horloge-heure').click(event => {
 | 
			
		||||
      const h = this.html.find(event.currentTarget)?.data('heure');
 | 
			
		||||
@@ -224,15 +221,8 @@ export class RdDCalendrier extends Application {
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /* -------------------------------------------- */
 | 
			
		||||
  async ajouterNombreAstral(indexDate, showDice = SHOW_DICE) {
 | 
			
		||||
    const nombreAstral = await RdDDice.rollTotal("1dh", { showDice: showDice, rollMode: "selfroll" });
 | 
			
		||||
    const dateFuture = RdDTimestamp.formatIndexDate(indexDate);
 | 
			
		||||
    if (showDice != HIDE_DICE) {
 | 
			
		||||
      ChatMessage.create({
 | 
			
		||||
        whisper: ChatMessage.getWhisperRecipients("GM"),
 | 
			
		||||
        content: `Le chiffre astrologique du ${dateFuture} sera le ${nombreAstral}`
 | 
			
		||||
      });
 | 
			
		||||
    }
 | 
			
		||||
  async ajouterNombreAstral(indexDate) {
 | 
			
		||||
    const nombreAstral = await RdDDice.rollTotal("1dh", { showDice: HIDE_DICE, rollMode: "selfroll" });
 | 
			
		||||
    return {
 | 
			
		||||
      nombreAstral: nombreAstral,
 | 
			
		||||
      valeursFausses: [],
 | 
			
		||||
@@ -267,9 +257,8 @@ export class RdDCalendrier extends Application {
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /* -------------------------------------------- */
 | 
			
		||||
  async rebuildNombresAstraux(showDice = HIDE_DICE) {
 | 
			
		||||
  async rebuildNombresAstraux() {
 | 
			
		||||
    if (Misc.isUniqueConnectedGM()) {
 | 
			
		||||
      console.log("Astral rebuild")
 | 
			
		||||
      let newList = [];
 | 
			
		||||
      for (let i = 0; i < MAX_NOMBRE_ASTRAL; i++) {
 | 
			
		||||
        let dayIndex = this.timestamp.indexDate + i;
 | 
			
		||||
@@ -277,7 +266,7 @@ export class RdDCalendrier extends Application {
 | 
			
		||||
        if (na) {
 | 
			
		||||
          newList[i] = na;
 | 
			
		||||
        } else {
 | 
			
		||||
          newList[i] = await this.ajouterNombreAstral(dayIndex, showDice);
 | 
			
		||||
          newList[i] = await this.ajouterNombreAstral(dayIndex);
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
      this.nombresAstraux = newList;
 | 
			
		||||
@@ -447,4 +436,9 @@ export class RdDCalendrier extends Application {
 | 
			
		||||
  async showAstrologieEditor() {
 | 
			
		||||
    await AppAstrologie.create();
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  async onToggleAutoDarkness() {
 | 
			
		||||
    await AutoAdjustDarkness.toggle()
 | 
			
		||||
    this.display()
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -2,6 +2,7 @@ import { SHOW_DICE, SYSTEM_RDD } from "../constants.js";
 | 
			
		||||
import { Grammar } from "../grammar.js";
 | 
			
		||||
import { Misc } from "../misc.js";
 | 
			
		||||
import { RdDDice } from "../rdd-dice.js";
 | 
			
		||||
import { AutoAdjustDarkness } from "./auto-adjust-darkness.js";
 | 
			
		||||
 | 
			
		||||
export const WORLD_TIMESTAMP_SETTING = "calendrier";
 | 
			
		||||
 | 
			
		||||
@@ -15,18 +16,18 @@ export const RDD_MINUTES_PAR_JOUR = 1440; //RDD_HEURES_PAR_JOUR * RDD_MINUTES_PA
 | 
			
		||||
const ROUNDS_PAR_MINUTE = 10;
 | 
			
		||||
 | 
			
		||||
const DEFINITION_HEURES = [
 | 
			
		||||
  { key: "vaisseau", label: "Vaisseau", lettreFont: 'v', saison: "Printemps" },
 | 
			
		||||
  { key: "sirene", label: "Sirène", lettreFont: 'i', saison: "Printemps" },
 | 
			
		||||
  { key: "faucon", label: "Faucon", lettreFont: 'f', saison: "Printemps" },
 | 
			
		||||
  { key: "couronne", label: "Couronne", lettreFont: '', saison: "Eté" },
 | 
			
		||||
  { key: "dragon", label: "Dragon", lettreFont: 'd', saison: "Eté" },
 | 
			
		||||
  { key: "epees", label: "Epées", lettreFont: 'e', saison: "Eté" },
 | 
			
		||||
  { key: "lyre", label: "Lyre", lettreFont: 'l', saison: "Automne" },
 | 
			
		||||
  { key: "serpent", label: "Serpent", lettreFont: 's', saison: "Automne" },
 | 
			
		||||
  { key: "poissonacrobate", label: "Poisson Acrobate", lettreFont: 'p', saison: "Automne" },
 | 
			
		||||
  { key: "araignee", label: "Araignée", lettreFont: 'a', saison: "Hiver" },
 | 
			
		||||
  { key: "roseau", label: "Roseau", lettreFont: 'r', saison: "Hiver" },
 | 
			
		||||
  { key: "chateaudormant", label: "Château Dormant", lettreFont: 'c', saison: "Hiver" },
 | 
			
		||||
  { key: "vaisseau", label: "Vaisseau", lettreFont: 'v', saison: "Printemps" , darkness: 0.7},
 | 
			
		||||
  { key: "sirene", label: "Sirène", lettreFont: 'i', saison: "Printemps" , darkness: 0.4},
 | 
			
		||||
  { key: "faucon", label: "Faucon", lettreFont: 'f', saison: "Printemps" , darkness: 0},
 | 
			
		||||
  { key: "couronne", label: "Couronne", lettreFont: '', saison: "Eté" , darkness: 0},
 | 
			
		||||
  { key: "dragon", label: "Dragon", lettreFont: 'd', saison: "Eté", darkness: 0 },
 | 
			
		||||
  { key: "epees", label: "Epées", lettreFont: 'e', saison: "Eté", darkness: 0},
 | 
			
		||||
  { key: "lyre", label: "Lyre", lettreFont: 'l', saison: "Automne", darkness: 0.4 },
 | 
			
		||||
  { key: "serpent", label: "Serpent", lettreFont: 's', saison: "Automne", darkness: 0.7 },
 | 
			
		||||
  { key: "poissonacrobate", label: "Poisson Acrobate", lettreFont: 'p', saison: "Automne", darkness: 1 },
 | 
			
		||||
  { key: "araignee", label: "Araignée", lettreFont: 'a', saison: "Hiver", darkness: 1 },
 | 
			
		||||
  { key: "roseau", label: "Roseau", lettreFont: 'r', saison: "Hiver", darkness: 1 },
 | 
			
		||||
  { key: "chateaudormant", label: "Château Dormant", lettreFont: 'c', saison: "Hiver", darkness: 1 },
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
const FORMULES_DUREE = [
 | 
			
		||||
@@ -58,6 +59,7 @@ export class RdDTimestamp {
 | 
			
		||||
      type: Object
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    for (let i = 0; i < DEFINITION_HEURES.length; i++) {
 | 
			
		||||
      DEFINITION_HEURES[i].heure = i;
 | 
			
		||||
      DEFINITION_HEURES[i].hh = RdDTimestamp.hh(i);
 | 
			
		||||
@@ -66,7 +68,6 @@ export class RdDTimestamp {
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
  static hh(heure) {
 | 
			
		||||
    return heure < 9 ? `0${heure + 1}` : `${heure + 1}`;
 | 
			
		||||
  }
 | 
			
		||||
@@ -239,6 +240,13 @@ export class RdDTimestamp {
 | 
			
		||||
  get angleHeure() { return this.indexMinute / RDD_MINUTES_PAR_JOUR * 360 - 45 }
 | 
			
		||||
  get angleMinute() { return this.indexMinute / RDD_MINUTES_PAR_HEURES * 360 + 45 }
 | 
			
		||||
 | 
			
		||||
  get darkness() {
 | 
			
		||||
    const darknessDebut = RdDTimestamp.definition(this.heure).darkness *100
 | 
			
		||||
    const darknessFin = RdDTimestamp.definition(this.heure + 1).darkness *100
 | 
			
		||||
    const darknessMinute = Math.round((darknessFin - darknessDebut) * this.minute / RDD_MINUTES_PAR_HEURES);
 | 
			
		||||
    return (darknessDebut + darknessMinute)/100
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * Convertit le timestamp en une structure avec les informations utiles
 | 
			
		||||
   * pour afficher la date et l'heure
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,7 @@
 | 
			
		||||
import { Misc } from "./misc.js";
 | 
			
		||||
import { Grammar } from "./grammar.js";
 | 
			
		||||
import { RdDDice } from "./rdd-dice.js";
 | 
			
		||||
import { tmrConstants } from "./tmr-constants.js";
 | 
			
		||||
 | 
			
		||||
/* -------------------------------------------- */
 | 
			
		||||
const TMRMapping = {
 | 
			
		||||
@@ -163,7 +164,7 @@ const TMRMapping = {
 | 
			
		||||
  C12: { type: "lac", label: "Lac de Fricassa" },
 | 
			
		||||
  D12: { type: "collines", label: "Collines d’Huaï" },
 | 
			
		||||
  E12: { type: "monts", label: "Monts Ajourés" },
 | 
			
		||||
  F12: { type: "necropole", label: "Nécropole de Troat" },
 | 
			
		||||
  F12: { type: "necropole", label: "Nécropole de Throat" },
 | 
			
		||||
  G12: { type: "plaines", label: "Plaines de Lufmil" },
 | 
			
		||||
  H12: { type: "collines", label: "Collines de Tooth" },
 | 
			
		||||
  I12: { type: "gouffre", label: "Gouffre Abimeux" },
 | 
			
		||||
@@ -199,7 +200,7 @@ const TMRMapping = {
 | 
			
		||||
  K14: { type: "necropole", label: "Nécropole d’Antinéar" },
 | 
			
		||||
  L14: { type: "plaines", label: "Plaines de Jislith" },
 | 
			
		||||
  M14: { type: "desolation", label: "Désolation d’Après" },
 | 
			
		||||
  
 | 
			
		||||
 | 
			
		||||
  A15: { type: "cite", label: "Cité de Mielh" },
 | 
			
		||||
  C15: { type: "plaines", label: "Plaines de Toué" },
 | 
			
		||||
  E15: { type: "foret", label: "Forêt des Furies" },
 | 
			
		||||
@@ -274,11 +275,11 @@ export class TMRUtility {
 | 
			
		||||
    const tmr = TMRUtility.getTMR(coord);
 | 
			
		||||
    return Grammar.articleDetermine(tmr.type) + ' ' + tmr.label;
 | 
			
		||||
  }
 | 
			
		||||
  
 | 
			
		||||
  static findTMRLike(type, options = {inclusMauvaise:true}) {
 | 
			
		||||
 | 
			
		||||
  static findTMRLike(type, options = { inclusMauvaise: true }) {
 | 
			
		||||
    const choix = [...Object.values(TMRType)]
 | 
			
		||||
    if (options.inclusMauvaise){
 | 
			
		||||
      choix.push({name: 'Mauvaise'});
 | 
			
		||||
    if (options.inclusMauvaise) {
 | 
			
		||||
      choix.push({ name: 'Mauvaise' });
 | 
			
		||||
    }
 | 
			
		||||
    const selection = Misc.findAllLike(type, choix).map(it => it.name);
 | 
			
		||||
    if (selection.length == 0) {
 | 
			
		||||
@@ -297,7 +298,7 @@ export class TMRUtility {
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  static buildSelectionTypesTMR(typesTMR) {
 | 
			
		||||
    typesTMR = typesTMR?? [];
 | 
			
		||||
    typesTMR = typesTMR ?? [];
 | 
			
		||||
    return Object.values(TMRType).map(value => Misc.upperFirst(value.name))
 | 
			
		||||
      .sort()
 | 
			
		||||
      .map(name => { return { name: name, selected: typesTMR.includes(name) } });
 | 
			
		||||
@@ -375,6 +376,33 @@ export class TMRUtility {
 | 
			
		||||
    return caseList;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // /* -------------------------------------------- */
 | 
			
		||||
  static computeEventPosition(event) {
 | 
			
		||||
    const canvasRect = event.nativeEvent.target.getBoundingClientRect();
 | 
			
		||||
    return {
 | 
			
		||||
      x: event.nativeEvent.clientX - canvasRect.left,
 | 
			
		||||
      y: event.nativeEvent.clientY - canvasRect.top
 | 
			
		||||
    };
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /* -------------------------------------------- */
 | 
			
		||||
  static computeEventOddq(event) {
 | 
			
		||||
    var { x, y } = TMRUtility.computeEventPosition(event);
 | 
			
		||||
    return TMRUtility.computeOddq(x, y);
 | 
			
		||||
  }  
 | 
			
		||||
 | 
			
		||||
  static computeOddq(x, y) {
 | 
			
		||||
    const col = Math.floor(x / tmrConstants.cellw); //  [From 0 -> 12]
 | 
			
		||||
    const decallageColonne = col % 2 == 0 ? tmrConstants.col1_y : tmrConstants.col2_y;
 | 
			
		||||
    const row = Math.floor((y - decallageColonne) / tmrConstants.cellh); //  [From 0 -> 14]
 | 
			
		||||
    return { col, row };
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  static computeEventCoord(event) {
 | 
			
		||||
    const oddq = TMRUtility.computeEventOddq(event);
 | 
			
		||||
    return TMRUtility.oddqToCoordTMR(oddq);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /* -------------------------------------------- */
 | 
			
		||||
  // https://www.redblobgames.com/grids/hexagons/#distances
 | 
			
		||||
  // TMR Letter-row correspond to "odd-q" grid (letter => col, numeric => row )
 | 
			
		||||
@@ -400,7 +428,7 @@ export class TMRUtility {
 | 
			
		||||
      col >= 0 && col < 13 &&
 | 
			
		||||
      row >= 0 &&
 | 
			
		||||
      (row + col % 2 <= 14)
 | 
			
		||||
      );
 | 
			
		||||
    );
 | 
			
		||||
    // if (x >= 0 && x < 13 && y >= 0 && y < 14) return true;
 | 
			
		||||
    // if (x >= 0 && x < 13 && x % 2 == 0 && y == 14) return true;
 | 
			
		||||
    // return false;
 | 
			
		||||
@@ -444,7 +472,7 @@ export class TMRUtility {
 | 
			
		||||
 | 
			
		||||
  static axial_subtract(a, b) {
 | 
			
		||||
    return {
 | 
			
		||||
      q: a.q- b.q,
 | 
			
		||||
      q: a.q - b.q,
 | 
			
		||||
      r: a.r - b.r
 | 
			
		||||
    };
 | 
			
		||||
  }
 | 
			
		||||
@@ -456,7 +484,7 @@ export class TMRUtility {
 | 
			
		||||
  // return Cube(q, r, s)
 | 
			
		||||
  // }
 | 
			
		||||
 | 
			
		||||
  
 | 
			
		||||
 | 
			
		||||
  // /* -------------------------------------------- */
 | 
			
		||||
  // static computeRealPictureCoordinates(coordOddq) {
 | 
			
		||||
  //   let decallagePairImpair = (coordOddq.col % 2 == 0) ? tmrConstants.col1_y : tmrConstants.col2_y;
 | 
			
		||||
 
 | 
			
		||||
@@ -4,7 +4,6 @@ import { PixiTMR } from "./pixi-tmr.js";
 | 
			
		||||
export class CarteTmr extends Draconique {
 | 
			
		||||
 | 
			
		||||
  constructor() {
 | 
			
		||||
    console.log("Sprite create 1!!!!")
 | 
			
		||||
    super();
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
@@ -14,9 +13,25 @@ export class CarteTmr extends Draconique {
 | 
			
		||||
  async onActorCreateOwned(actor, item) { }
 | 
			
		||||
 | 
			
		||||
  code() { return 'tmr' }
 | 
			
		||||
  img() { return 'systems/foundryvtt-reve-de-dragon/styles/img/ui/tmp_main_r1.webp' }
 | 
			
		||||
  img() { return 'systems/foundryvtt-reve-de-dragon/styles/img/ui/tmr.webp' }
 | 
			
		||||
 | 
			
		||||
  createSprite(pixiTMR) {
 | 
			
		||||
    return pixiTMR.carteTmr(this.code());
 | 
			
		||||
 | 
			
		||||
    const img = PixiTMR.getImgFromCode(this.code())
 | 
			
		||||
    const sprite = new PIXI.Sprite(PIXI.utils.TextureCache[img]);
 | 
			
		||||
    // Setup the position of the TMR
 | 
			
		||||
    sprite.x = 0;
 | 
			
		||||
    sprite.y = 0;
 | 
			
		||||
    sprite.width = 722;
 | 
			
		||||
    sprite.height = 860;
 | 
			
		||||
    // Rotate around the center
 | 
			
		||||
    sprite.anchor.set(0);
 | 
			
		||||
    sprite.buttonMode = true;
 | 
			
		||||
    sprite.tmrObject = pixiTMR;
 | 
			
		||||
 | 
			
		||||
    pixiTMR.addTooltip(sprite, (e,s) => this.computeTooltip(e,s));
 | 
			
		||||
    pixiTMR.pixiApp.stage.addChild(sprite);
 | 
			
		||||
    return sprite;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -11,7 +11,7 @@ const registeredEffects = [
 | 
			
		||||
export class Draconique {
 | 
			
		||||
  static isCaseTMR(item) { return item.type == TYPES.casetmr; }
 | 
			
		||||
  static isQueueDragon(item) { return item.isQueueDragon(); }
 | 
			
		||||
  static isSouffleDragon(item) {return item.type == TYPES.souffle; }
 | 
			
		||||
  static isSouffleDragon(item) { return item.type == TYPES.souffle; }
 | 
			
		||||
  static isTeteDragon(item) { return item.type == TYPES.tete; }
 | 
			
		||||
  static isQueueSouffle(item) { return Draconique.isQueueDragon(item) || Draconique.isSouffleDragon(item); }
 | 
			
		||||
 | 
			
		||||
@@ -78,25 +78,45 @@ export class Draconique {
 | 
			
		||||
  /**
 | 
			
		||||
   * @param {*} img l'url du fichier image à utiliser pour le token. Si indéfini (et si createSprite n'est pas surchargé),
 | 
			
		||||
   *  un disque est utilisé.
 | 
			
		||||
   */
 | 
			
		||||
  */
 | 
			
		||||
  img() { return undefined }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * factory d'élément graphique PIXI correpsondant à l'objet draconique
 | 
			
		||||
   * factory d'élément graphique PIXI correspondant à l'objet draconique
 | 
			
		||||
   * @param {*} pixiTMR instance de PixiTMR qui gère les tooltips, les méthodes de création de sprite standard, les clicks.
 | 
			
		||||
   */
 | 
			
		||||
  */
 | 
			
		||||
  token(pixiTMR, linkData, coordTMR, type = undefined) {
 | 
			
		||||
    const token = {
 | 
			
		||||
      sprite: this.createSprite(pixiTMR),
 | 
			
		||||
      coordTMR: coordTMR
 | 
			
		||||
    };
 | 
			
		||||
    token[type ?? this.code()] = linkData;
 | 
			
		||||
    console.log("SPRITE: ", token.sprite)
 | 
			
		||||
    //PixiTMR.getImgFromCode()
 | 
			
		||||
    pixiTMR.addTooltip(token.sprite, this.tooltip(linkData));
 | 
			
		||||
    this.linkData = linkData;
 | 
			
		||||
    if (this.tooltip(linkData)) {
 | 
			
		||||
      pixiTMR.addTooltip(token.sprite, (e, s) => this.computeTooltip(e, s));
 | 
			
		||||
    }
 | 
			
		||||
    return token;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * methode en charge de recalculer le tooltip lorsque la souris bouge
 | 
			
		||||
   * @param {*} event evenement contenant les coordonnées
 | 
			
		||||
   * @param {*} sprite sprite pour laquelle calculer le tooltip
 | 
			
		||||
   */
 | 
			
		||||
  computeTooltip(event, sprite) {
 | 
			
		||||
    if (sprite.isOver) {
 | 
			
		||||
      const oddq = TMRUtility.computeEventOddq(event);
 | 
			
		||||
      const coord = TMRUtility.oddqToCoordTMR(oddq);
 | 
			
		||||
      const tmr = TMRUtility.getTMR(coord)
 | 
			
		||||
      if (tmr){
 | 
			
		||||
        const label = TMRUtility.getTMRLabel(coord);
 | 
			
		||||
        const text = this.tooltip(this.linkData);
 | 
			
		||||
        return text ? `${coord}: ${label}\n${text}` : `${coord}: ${label}`
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
    return '';
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * factory d'élément graphique PIXI correpsondant à l'objet draconique
 | 
			
		||||
   * @param {*} pixiTMR instance de PixiTMR qui gère les tooltips, les méthodes de création de sprite standard, les clicks.
 | 
			
		||||
@@ -118,11 +138,11 @@ export class Draconique {
 | 
			
		||||
  isCase(item, coord = undefined) {
 | 
			
		||||
    return Draconique.isCaseTMR(item) && item.system.specific == this.code() && (coord ? item.system.coord == coord : true);
 | 
			
		||||
  }
 | 
			
		||||
  
 | 
			
		||||
 | 
			
		||||
  find(list, coord = undefined) {
 | 
			
		||||
    return list.find(c => this.isCase(c, coord));
 | 
			
		||||
  }
 | 
			
		||||
  
 | 
			
		||||
 | 
			
		||||
  async createCaseTmr(actor, label, tmr, sourceId = undefined) {
 | 
			
		||||
    const casetmrData = {
 | 
			
		||||
      name: label, type: 'casetmr', img: this.img(),
 | 
			
		||||
@@ -130,12 +150,12 @@ export class Draconique {
 | 
			
		||||
    };
 | 
			
		||||
    await actor.createEmbeddedDocuments('Item', [casetmrData]);
 | 
			
		||||
  }
 | 
			
		||||
  
 | 
			
		||||
 | 
			
		||||
  async deleteCasesTmr(actor, draconique) {
 | 
			
		||||
    let caseTmrs = actor.items.filter(it => this.isCaseForSource(it, draconique));
 | 
			
		||||
    await actor.deleteEmbeddedDocuments('Item', caseTmrs.map(it => it.id));
 | 
			
		||||
  }
 | 
			
		||||
  
 | 
			
		||||
 | 
			
		||||
  isCaseForSource(item, draconique) {
 | 
			
		||||
    return Draconique.isCaseTMR(item) && item.system.specific == this.code() && item.system.sourceid == draconique.id;
 | 
			
		||||
  }
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,8 @@
 | 
			
		||||
import { RdDTMRDialog } from "../rdd-tmr-dialog.js";
 | 
			
		||||
import { tmrConstants, tmrTokenZIndex } from "../tmr-constants.js";
 | 
			
		||||
import { TMRUtility } from "../tmr-utility.js";
 | 
			
		||||
 | 
			
		||||
const tooltipStyle = new PIXI.TextStyle({
 | 
			
		||||
export const tooltipStyle = new PIXI.TextStyle({
 | 
			
		||||
  fontFamily: 'CaslonAntique',
 | 
			
		||||
  fontSize: 18,
 | 
			
		||||
  fill: '#FFFFFF',
 | 
			
		||||
@@ -20,7 +22,7 @@ export class PixiTMR {
 | 
			
		||||
    this.callbacksOnAnimate = [];
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  async load( onLoad = (loader, resources) => {} )  {
 | 
			
		||||
  async load(onLoad = (loader, resources) => { }) {
 | 
			
		||||
    // WIP - Deprecated since v7 : let loader = new PIXI.Loader();
 | 
			
		||||
    for (const [name, img] of Object.entries(PixiTMR.textures)) {
 | 
			
		||||
      const texture = await PIXI.Assets.load(img);
 | 
			
		||||
@@ -40,40 +42,17 @@ export class PixiTMR {
 | 
			
		||||
    PixiTMR.textures[name] = img;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  animate(animation = pixiApp=>{})
 | 
			
		||||
  {
 | 
			
		||||
  animate(animation = pixiApp => { }) {
 | 
			
		||||
    this.callbacksOnAnimate.push(() => animation(this.pixiApp));
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  carteTmr(code) {
 | 
			
		||||
    let img = PixiTMR.getImgFromCode(code)
 | 
			
		||||
    const carteTmr = new PIXI.Sprite(PIXI.utils.TextureCache[img]);
 | 
			
		||||
    console.log(code, carteTmr)
 | 
			
		||||
    // Setup the position of the TMR
 | 
			
		||||
    carteTmr.x = 0;
 | 
			
		||||
    carteTmr.y = 0;
 | 
			
		||||
    carteTmr.width = 720;
 | 
			
		||||
    carteTmr.height = 860;
 | 
			
		||||
    // Rotate around the center
 | 
			
		||||
    carteTmr.anchor.set(0);
 | 
			
		||||
    carteTmr.eventMode = 'dynamic'; // PIXI 7 : Not sure ..
 | 
			
		||||
    // This one is deprecated ; carteTmr.interactive = true;
 | 
			
		||||
    carteTmr.buttonMode = true;
 | 
			
		||||
    carteTmr.tmrObject = this;
 | 
			
		||||
    if (!this.tmrObject.viewOnly) {
 | 
			
		||||
      carteTmr.on('pointerdown', event => this.onClickBackground(event));
 | 
			
		||||
    }
 | 
			
		||||
    this.pixiApp.stage.addChild(carteTmr);
 | 
			
		||||
    return carteTmr;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  sprite(code, options = {}) {
 | 
			
		||||
    let img = PixiTMR.getImgFromCode(code)
 | 
			
		||||
    const texture = PIXI.utils.TextureCache[img];
 | 
			
		||||
    if (!texture) {
 | 
			
		||||
      console.error("Texture manquante", code, PIXI.utils.TextureCache)
 | 
			
		||||
      return;
 | 
			
		||||
    }  
 | 
			
		||||
    }
 | 
			
		||||
    let sprite = new PIXI.Sprite(texture);
 | 
			
		||||
    sprite.width = options.taille ?? tmrConstants.half;
 | 
			
		||||
    sprite.height = options.taille ?? tmrConstants.half;
 | 
			
		||||
@@ -81,13 +60,13 @@ export class PixiTMR {
 | 
			
		||||
    if (options.color) {
 | 
			
		||||
      sprite.tint = options.color;
 | 
			
		||||
    }
 | 
			
		||||
    sprite.zIndex = options.zIndex ?? tmrTokenZIndex.casehumide+1;
 | 
			
		||||
    sprite.zIndex = options.zIndex ?? tmrTokenZIndex.casehumide + 1;
 | 
			
		||||
    sprite.alpha = options.alpha ?? 0.75;
 | 
			
		||||
    sprite.decallage = options.decallage ?? tmrConstants.center;
 | 
			
		||||
    this.pixiApp.stage.addChild(sprite);
 | 
			
		||||
    return sprite;
 | 
			
		||||
  }  
 | 
			
		||||
  
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  circle(name, options = {}) {
 | 
			
		||||
    let sprite = new PIXI.Graphics();
 | 
			
		||||
    sprite.beginFill(options.color, options.opacity);
 | 
			
		||||
@@ -98,27 +77,37 @@ export class PixiTMR {
 | 
			
		||||
    return sprite;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  addTooltip(sprite, text) {
 | 
			
		||||
    if (text) {
 | 
			
		||||
      sprite.tooltip = new PIXI.Text(text, tooltipStyle);
 | 
			
		||||
      sprite.tooltip.zIndex = tmrTokenZIndex.tooltip;
 | 
			
		||||
      sprite.isOver = false;
 | 
			
		||||
      // Deprecated : sprite.interactive = true; 
 | 
			
		||||
      sprite.eventMode = 'dynamic'; // PIXI 7 To be checked
 | 
			
		||||
      sprite.on('pointerdown', event => this.onClickBackground(event))
 | 
			
		||||
        .on('pointerover', () => this.onShowTooltip(sprite))
 | 
			
		||||
        .on('pointerout', () => this.onHideTooltip(sprite));
 | 
			
		||||
    }
 | 
			
		||||
  addTooltip(sprite, computeTooltip) {
 | 
			
		||||
    sprite.tooltip = new PIXI.Text('', tooltipStyle);
 | 
			
		||||
    sprite.tooltip.zIndex = tmrTokenZIndex.tooltip;
 | 
			
		||||
    sprite.isOver = false;
 | 
			
		||||
    sprite.eventMode = 'dynamic'; // PIXI 7 To be checked
 | 
			
		||||
    sprite
 | 
			
		||||
      .on('pointermove', event => this.onPointerMove(event, sprite, computeTooltip))
 | 
			
		||||
      .on('pointerdown', event => this.onClickBackground(event))
 | 
			
		||||
      .on('pointerover', event => this.onShowTooltip(event, sprite))
 | 
			
		||||
      .on('pointerout', event => this.onHideTooltip(event, sprite));
 | 
			
		||||
  }
 | 
			
		||||
  
 | 
			
		||||
 | 
			
		||||
  onClickBackground(event) {
 | 
			
		||||
    this.tmrObject.onClickTMR(event)
 | 
			
		||||
    if (!this.viewOnly) {
 | 
			
		||||
      this.tmrObject.onClickTMR(event)
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  onShowTooltip(sprite) {
 | 
			
		||||
    if (sprite.tooltip) {
 | 
			
		||||
  onPointerMove(event, sprite, computeTooltip) {
 | 
			
		||||
    if (sprite.isOver && sprite.tooltip) {
 | 
			
		||||
      var { x, y } = TMRUtility.computeEventPosition(event);
 | 
			
		||||
      const oddq = TMRUtility.computeOddq(x, y);
 | 
			
		||||
 | 
			
		||||
      sprite.tooltip.x = x + (oddq.col > 8 ? - 3 * tmrConstants.full : tmrConstants.half)
 | 
			
		||||
      sprite.tooltip.y = y + (oddq.row > 10 ? - tmrConstants.half : tmrConstants.half)
 | 
			
		||||
      sprite.tooltip.text = computeTooltip(event, sprite);
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  onShowTooltip(event, sprite) {
 | 
			
		||||
    if (sprite.tooltip) {
 | 
			
		||||
      if (!sprite.isOver) {
 | 
			
		||||
        sprite.tooltip.x = sprite.x;
 | 
			
		||||
        sprite.tooltip.y = sprite.y;
 | 
			
		||||
@@ -128,7 +117,7 @@ export class PixiTMR {
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  onHideTooltip(sprite) {
 | 
			
		||||
  onHideTooltip(event, sprite) {
 | 
			
		||||
    if (sprite.tooltip) {
 | 
			
		||||
      if (sprite.isOver) {
 | 
			
		||||
        this.pixiApp.stage.removeChild(sprite.tooltip);
 | 
			
		||||
@@ -137,7 +126,7 @@ export class PixiTMR {
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  setPosition( sprite, oddq) {
 | 
			
		||||
  setPosition(sprite, oddq) {
 | 
			
		||||
    let decallagePairImpair = (oddq.col % 2 == 0) ? tmrConstants.col1_y : tmrConstants.col2_y;
 | 
			
		||||
    let dx = (sprite.decallage == undefined) ? 0 : sprite.decallage.x;
 | 
			
		||||
    let dy = (sprite.decallage == undefined) ? 0 : sprite.decallage.y;
 | 
			
		||||
 
 | 
			
		||||
										
											Binary file not shown.
										
									
								
							| 
		 Before Width: | Height: | Size: 313 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								styles/img/ui/tmr.webp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								styles/img/ui/tmr.webp
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| 
		 After Width: | Height: | Size: 637 KiB  | 
@@ -171,6 +171,9 @@ i:is(.fas, .far) {
 | 
			
		||||
  width: fit-content;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.tmr-dialog table {
 | 
			
		||||
  border: none;
 | 
			
		||||
}
 | 
			
		||||
.system-foundryvtt-reve-de-dragon .sheet-header div.tmr-buttons {
 | 
			
		||||
  padding: 0;
 | 
			
		||||
  margin: 0;
 | 
			
		||||
 
 | 
			
		||||
@@ -1,8 +1,8 @@
 | 
			
		||||
{
 | 
			
		||||
  "id": "foundryvtt-reve-de-dragon",
 | 
			
		||||
  "title": "Rêve de Dragon",
 | 
			
		||||
  "version": "11.0.22",
 | 
			
		||||
  "download": "https://www.uberwald.me/gitea/public/foundryvtt-reve-de-dragon/archive/foundryvtt-reve-de-dragon-11.0.22.zip",
 | 
			
		||||
  "version": "11.0.24",
 | 
			
		||||
  "download": "https://www.uberwald.me/gitea/public/foundryvtt-reve-de-dragon/archive/foundryvtt-reve-de-dragon-11.0.24.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": {
 | 
			
		||||
 
 | 
			
		||||
@@ -1,7 +1,5 @@
 | 
			
		||||
<form class="tmr-dialog">
 | 
			
		||||
<h2 class="comptmrdialog" id="tmrDialogTitle"></h2>
 | 
			
		||||
 | 
			
		||||
<table id="tmrsheet">
 | 
			
		||||
<table>
 | 
			
		||||
  <tr id="tmrrow1">
 | 
			
		||||
    <td>
 | 
			
		||||
      {{#if (eq mode "visu")}}
 | 
			
		||||
 
 | 
			
		||||
@@ -16,6 +16,7 @@
 | 
			
		||||
		</div>
 | 
			
		||||
	{{/if}}
 | 
			
		||||
	<div class="horloge-digitale">
 | 
			
		||||
 | 
			
		||||
		<span>
 | 
			
		||||
			<a class="toggle-horloge-analogique">
 | 
			
		||||
			{{#if horlogeAnalogique}}
 | 
			
		||||
@@ -33,6 +34,15 @@
 | 
			
		||||
		{{#if isGM}}
 | 
			
		||||
		<span class="calendar-minute-texte">{{minute}} minutes</span>
 | 
			
		||||
		{{/if}}
 | 
			
		||||
		{{#if isGM}}
 | 
			
		||||
			<span class="toggle-auto-darkness">
 | 
			
		||||
				{{#if autoDarkness}}
 | 
			
		||||
					<i class="fa-solid fa-lightbulb"></i>
 | 
			
		||||
				{{else}}
 | 
			
		||||
					<i class="fa-regular fa-lightbulb"></i>
 | 
			
		||||
				{{/if}}
 | 
			
		||||
			</span>
 | 
			
		||||
		{{/if}}
 | 
			
		||||
	</div>
 | 
			
		||||
	<div class="horloge-analogique {{#unless horlogeAnalogique}}horloge-analogique-hidden{{/unless}}">
 | 
			
		||||
		{{> 'systems/foundryvtt-reve-de-dragon/templates/time/horloge.hbs' }}
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user