diff --git a/changelog.md b/changelog.md index 66c097cf..04d5b726 100644 --- a/changelog.md +++ b/changelog.md @@ -1,4 +1,10 @@ # 12.0 +## 12.0.12 - L'étalage d'Astrobazzarh +- Fix: On peut de nouveau vendre des items sans propriétaire, depuis les compendiums ou depuis l'onglet des Objets +- Début de Feuille PNJ au format des encarts Scriptarium + - support des jets de caractéristiques + - support des jets de compétences + ## 12.0.11 - Le scriptorium d'Astrobazzarh - ajout d'un bouton pour générer les éléments de description d'un personnage - ajout du logo en background dans la liste des systèmes Foundry diff --git a/module/achat-vente/dialog-item-vente.js b/module/achat-vente/dialog-item-vente.js index 07b1bad2..edcda255 100644 --- a/module/achat-vente/dialog-item-vente.js +++ b/module/achat-vente/dialog-item-vente.js @@ -9,7 +9,7 @@ export class DialogItemVente extends Dialog { const venteData = { item: item, alias: item.actor?.name ?? game.user.name, - vendeurId: item.actor.id, + vendeurId: item.actor?.id, prixOrigine: item.calculerPrixCommercant(), prixUnitaire: item.calculerPrixCommercant(), prixLot: item.calculerPrixCommercant(), diff --git a/module/actor-sheet.js b/module/actor-sheet.js index cba5cf81..1a9d1567 100644 --- a/module/actor-sheet.js +++ b/module/actor-sheet.js @@ -218,7 +218,7 @@ export class RdDActorSheet extends RdDBaseActorSangSheet { } // Points de reve actuel - this.html.find('.ptreve-actuel a').click(async event => this.actor.rollCarac('reve-actuel', true)) + this.html.find('.roll-reve-actuel').click(async event => this.actor.rollCarac('reve-actuel', true)) this.html.find('.empoignade-label a').click(async event => RdDEmpoignade.onAttaqueEmpoignadeFromItem(RdDSheetUtility.getItem(event, this.actor))) this.html.find('.arme-label a').click(async event => this.actor.rollArme(foundry.utils.duplicate(this._getEventArmeCombat(event)))) diff --git a/module/actor/base-actor-reve-sheet.js b/module/actor/base-actor-reve-sheet.js index 901c7423..ad3e5dea 100644 --- a/module/actor/base-actor-reve-sheet.js +++ b/module/actor/base-actor-reve-sheet.js @@ -25,8 +25,8 @@ export class RdDBaseActorReveSheet extends RdDBaseActorSheet { if (!this.options.editable) return; this.html.find('.encaisser-direct').click(async event => this.actor.encaisser()) - this.html.find('.carac-label a').click(async event => this.actor.rollCarac(Grammar.toLowerCaseNoAccent(event.currentTarget.attributes.name.value))); - this.html.find('a.competence-label').click(async event => this.actor.rollCompetence(RdDSheetUtility.getItemId(event))); + this.html.find('.roll-carac').click(async event => this.actor.rollCarac(Grammar.toLowerCaseNoAccent(event.currentTarget.attributes.name.value))); + this.html.find('.roll-competence').click(async event => this.actor.rollCompetence(RdDSheetUtility.getItemId(event))); this.html.find('.endurance-plus').click(async event => this.actor.santeIncDec("endurance", 1)); this.html.find('.endurance-moins').click(async event => this.actor.santeIncDec("endurance", -1)); diff --git a/module/actor/base-actor-reve.js b/module/actor/base-actor-reve.js index 60ebb6f1..f695cce1 100644 --- a/module/actor/base-actor-reve.js +++ b/module/actor/base-actor-reve.js @@ -296,6 +296,9 @@ export class RdDBaseActorReve extends RdDBaseActor { /* -------------------------------------------- */ async rollCarac(caracName, jetResistance = undefined) { + if (Grammar.equalsInsensitive(caracName, 'taille')){ + return + } RdDEmpoignade.checkEmpoignadeEnCours(this) let selectedCarac = this.getCaracByName(caracName) await this.openRollDialog({ diff --git a/module/actor/export-scriptarium/actor-encart-sheet.js b/module/actor/export-scriptarium/actor-encart-sheet.js new file mode 100644 index 00000000..8b997b95 --- /dev/null +++ b/module/actor/export-scriptarium/actor-encart-sheet.js @@ -0,0 +1,88 @@ +import { RdDActorSheet } from "../../actor-sheet.js" +import { SYSTEM_RDD } from "../../constants.js"; +import { Misc } from "../../misc.js"; +import { EXPORT_CSV_SCRIPTARIUM, OptionsAvancees } from "../../settings/options-avancees.js"; +import { ExportScriptarium } from "./export-scriptarium.js"; +import { CATEGORIES_COMPETENCES, CATEGORIES_DRACONIC, Mapping } from "./mapping.js"; + +export class RdDActorExportSheet extends RdDActorSheet { + static async init() { + await loadTemplates([ + "systems/foundryvtt-reve-de-dragon/templates/actor/export-scriptarium/arme.hbs", + "systems/foundryvtt-reve-de-dragon/templates/actor/export-scriptarium/carac.hbs", + "systems/foundryvtt-reve-de-dragon/templates/actor/export-scriptarium/carac-compteur.hbs", + "systems/foundryvtt-reve-de-dragon/templates/actor/export-scriptarium/carac-derivee.hbs", + "systems/foundryvtt-reve-de-dragon/templates/actor/export-scriptarium/carac-derivee-compteur.hbs", + "systems/foundryvtt-reve-de-dragon/templates/actor/export-scriptarium/competences.hbs", + "systems/foundryvtt-reve-de-dragon/templates/actor/export-scriptarium/esquive.hbs", + "systems/foundryvtt-reve-de-dragon/templates/actor/export-scriptarium/protection.hbs", + "systems/foundryvtt-reve-de-dragon/templates/actor/export-scriptarium/sort.hbs", + ]) + Actors.registerSheet(SYSTEM_RDD, RdDActorExportSheet, { types: ["personnage"], makeDefault: false, label: "Feuille d'encart" }) + } + static get defaultOptions() { + return foundry.utils.mergeObject(RdDActorSheet.defaultOptions, { + template: "systems/foundryvtt-reve-de-dragon/templates/actor/export-scriptarium/actor-encart-sheet.hbs", + width: 550, + showCompNiveauBase: false, + vueArchetype: false, + }, { inplace: false }) + } + + constructor(actor, options) { + super(actor, options) + } + + async getData() { + const formData = await super.getData() + // Add any structured, precomputed list of data + formData.export = this.getMappingValues(); + formData.competences = this.getCompetences(CATEGORIES_COMPETENCES) + formData.draconic = this.getCompetences(CATEGORIES_DRACONIC) + formData.options.exportScriptarium = OptionsAvancees.isUsing(EXPORT_CSV_SCRIPTARIUM) + return formData + } + + getMappingValues() { + const context = Mapping.prepareContext(this.actor) + return Object.fromEntries(Mapping.getMapping().map(it => [it.column, { + colName: it.colName ?? it.column, + column: it.column, + rollClass: it.rollClass, + value: it.getter(this.actor, context) + }])) + } + + getCompetences(categories) { + const competences = Mapping.getCompetencesCategorie(this.actor, categories) + if (competences.length == 0) { + return '' + } + const byCategories = Mapping.competencesByCategoriesByNiveau(competences, categories) + const listByCategories = Object.values(byCategories) + .map(it => it.competencesParNiveau) + .map(byNiveau => { + const niveaux = Object.keys(byNiveau).map(it => Number(it)).sort(Misc.ascending()) + if (niveaux.length == 0) { + return undefined + } + const listCategorieByNiveau = niveaux.map(niveau => { + const list = byNiveau[niveau].sort(Misc.ascending(it => it.name)) + return {niveau, list} + }) + return Misc.concat(listCategorieByNiveau) + }).filter(it => it != undefined) + + return Misc.concat(listByCategories) + } + + activateListeners(html) { + super.activateListeners(html); + this.html.find('.button-export').click(async event => { + + ExportScriptarium.INSTANCE.exportActors([this.actor], + `${this.actor.uuid}-${this.actor.name}` + ) + }) + } +} diff --git a/module/actor/export-scriptarium/export-scriptarium.js b/module/actor/export-scriptarium/export-scriptarium.js index 42710c70..aea110e7 100644 --- a/module/actor/export-scriptarium/export-scriptarium.js +++ b/module/actor/export-scriptarium/export-scriptarium.js @@ -12,14 +12,13 @@ export class ExportScriptarium { } constructor() { - this.mapping = Mapping.getMapping() Hooks.on("getActorDirectoryFolderContext", (actorDirectory, menus) => { ExportScriptarium.INSTANCE.onActorDirectoryMenu(actorDirectory, menus) }) Hooks.on("getActorDirectoryEntryContext", (actorDirectory, menus) => { ExportScriptarium.INSTANCE.onActorDirectoryMenu(actorDirectory, menus) }) } onActorDirectoryMenu(actorDirectory, menus) { menus.push({ - name: 'Export Personnages', + name: 'Export Personnages ', icon: IMG_SCRIPTARIUM, condition: (target) => game.user.isGM && OptionsAvancees.isUsing(EXPORT_CSV_SCRIPTARIUM) && @@ -59,12 +58,12 @@ export class ExportScriptarium { } getHeaderLine() { - return this.mapping.map(it => it.column) + return Mapping.getColumns() } getActorLine(actor) { - const context = Mapping.prepareContext(actor) - return this.mapping.map(it => it.getter(actor, context)) + const values = Mapping.getValues(actor) + return values .map(it => this.$escapeQuotes(it)) .map(it => it.replaceAll("\n", " ").replaceAll("\r", "")) } diff --git a/module/actor/export-scriptarium/mapping.js b/module/actor/export-scriptarium/mapping.js index 5f8d6237..3ffa059c 100644 --- a/module/actor/export-scriptarium/mapping.js +++ b/module/actor/export-scriptarium/mapping.js @@ -6,15 +6,16 @@ import { ITEM_TYPES } from "../../item.js" import { Misc } from "../../misc.js" import { RdDTimestamp } from "../../time/rdd-timestamp.js" import { RdDBonus } from "../../rdd-bonus.js" +import { TMRType } from "../../tmr-utility.js" -const CATEGORIES_COMPETENCES = [ +export const CATEGORIES_COMPETENCES = [ "generale", "particuliere", "specialisee", "connaissance", ] -const CATEGORIES_DRACONIC = [ +export const CATEGORIES_DRACONIC = [ "draconic", ] @@ -37,11 +38,11 @@ const NIVEAU_BASE = { class ColumnMappingFactory { static createMappingArme(part, i) { - return { column: `arme-${part}-${i}`, getter: (actor, context) => Mapping.getArme(actor, context, part, i) } + return { column: `arme_${part}_${i}`, getter: (actor, context) => Mapping.getArme(actor, context, part, i) } } static createMappingSort(part, i) { - return { column: `sort-${part}-${i}`, getter: (actor, context) => Mapping.getSort(actor, context, part, i) } + return { column: `sort_${part}_${i}`, getter: (actor, context) => Mapping.getSort(actor, context, part, i) } } } @@ -51,38 +52,41 @@ const TABLEAU_ARMES = [...Array(NB_ARMES).keys()] const TABLEAU_SORTS = [...Array(NB_SORTS).keys()] const MAPPING_BASE = [ - { column: "ID", getter: (actor, context) => actor.id }, + { column: "ID", colName: 'ID', getter: (actor, context) => actor.id }, { column: "name", getter: (actor, context) => actor.name }, - { column: "metier", getter: (actor, context) => actor.system.metier }, - // { column: "biographie", getter: (actor, context) => actor.system.biographie }, + { column: "metier", colName: 'Métier', getter: (actor, context) => actor.system.metier }, + { column: "biographie", colName: 'Biographie', getter: (actor, context) => actor.system.biographie }, { column: "taille", getter: (actor, context) => actor.system.carac.taille.value }, - { column: "apparence", getter: (actor, context) => actor.system.carac.apparence.value }, - { column: "constitution", getter: (actor, context) => actor.system.carac.constitution.value }, - { column: "force", getter: (actor, context) => actor.system.carac.force.value }, - { column: "agilite", getter: (actor, context) => actor.system.carac.agilite.value }, - { column: "dexterite", getter: (actor, context) => actor.system.carac.dexterite.value }, - { column: "vue", getter: (actor, context) => actor.system.carac.vue.value }, - { column: "ouie", getter: (actor, context) => actor.system.carac.ouie.value }, - { column: "odoratgout", getter: (actor, context) => actor.system.carac.odoratgout.value }, - { column: "volonte", getter: (actor, context) => actor.system.carac.volonte.value }, - { column: "intellect", getter: (actor, context) => actor.system.carac.intellect.value }, - { column: "empathie", getter: (actor, context) => actor.system.carac.empathie.value }, - { column: "reve", getter: (actor, context) => actor.system.carac.reve.value }, - { column: "chance", getter: (actor, context) => actor.system.carac.chance.value }, - { column: "melee", getter: (actor, context) => actor.system.carac.melee.value }, - { column: "tir", getter: (actor, context) => actor.system.carac.tir.value }, - { column: "lancer", getter: (actor, context) => actor.system.carac.lancer.value }, - { column: "derobee", getter: (actor, context) => actor.system.carac.derobee.value }, + { column: "apparence", rollClass: 'roll-carac', getter: (actor, context) => actor.system.carac.apparence.value }, + { column: "constitution", rollClass: 'roll-carac', getter: (actor, context) => actor.system.carac.constitution.value }, + { column: "force", rollClass: 'roll-carac', getter: (actor, context) => actor.system.carac.force.value }, + { column: "agilite", rollClass: 'roll-carac', colName: 'Agilité', getter: (actor, context) => actor.system.carac.agilite.value }, + { column: "dexterite", rollClass: 'roll-carac', colName: 'Dextérité', getter: (actor, context) => actor.system.carac.dexterite.value }, + { column: "vue", rollClass: 'roll-carac', getter: (actor, context) => actor.system.carac.vue.value }, + { column: "ouie", rollClass: 'roll-carac', colName: 'Ouïe', getter: (actor, context) => actor.system.carac.ouie.value }, + { column: "odoratgout", rollClass: 'roll-carac', colName: 'Odo-goût', getter: (actor, context) => actor.system.carac.odoratgout.value }, + { column: "volonte", rollClass: 'roll-carac', colName: 'Volonté', getter: (actor, context) => actor.system.carac.volonte.value }, + { column: "intellect", rollClass: 'roll-carac', getter: (actor, context) => actor.system.carac.intellect.value }, + { column: "empathie", rollClass: 'roll-carac', getter: (actor, context) => actor.system.carac.empathie.value }, + { column: "reve", rollClass: 'roll-carac', colName: 'Rêve', getter: (actor, context) => actor.system.carac.reve.value }, + { column: "chance", rollClass: 'roll-carac', getter: (actor, context) => actor.system.carac.chance.value }, + { column: "melee", rollClass: 'roll-carac', colName: 'Mêlée', getter: (actor, context) => actor.system.carac.melee.value }, + { column: "tir", rollClass: 'roll-carac', getter: (actor, context) => actor.system.carac.tir.value }, + { column: "lancer", rollClass: 'roll-carac', getter: (actor, context) => actor.system.carac.lancer.value }, + { column: "derobee", rollClass: 'roll-carac', colName: 'Dérobée', getter: (actor, context) => actor.system.carac.derobee.value }, { column: "vie", getter: (actor, context) => actor.system.sante.vie.max }, - { column: "plusdom", getter: (actor, context) => actor.system.attributs.plusdom.value }, - { column: "protectionnaturelle", getter: (actor, context) => actor.system.attributs.protection.value }, { column: "endurance", getter: (actor, context) => actor.system.sante.endurance.max }, + { column: "plusdom", colName: '+dom', getter: (actor, context) => actor.system.attributs.plusdom.value }, + { column: "protectionnaturelle", colName: 'Protection naturelle', getter: (actor, context) => actor.system.attributs.protection.value > 0 ? actor.system.attributs.protection.value : '' }, { column: "description", getter: (actor, context) => Mapping.getDescription(actor) }, { column: "armure", getter: (actor, context) => Mapping.getArmure(actor, context) }, - { column: "protection", getter: (actor, context) => Mapping.getProtectionArmure(actor, context) }, - { column: "malus-armure", getter: (actor, context) => Mapping.getMalusArmure(actor, context) }, + { column: "protectionarmure", colName: 'Protection', getter: (actor, context) => Mapping.getProtectionArmure(actor, context) }, + { column: "malus_armure", getter: (actor, context) => Mapping.getMalusArmure(actor, context) }, + { column: "reve_actuel", rollClass: 'roll-reve-actuel', colName: 'Rêve actuel', getter: (actor, context) => actor.system.reve.reve.value }, + { column: "vie_actuel", rollClass: 'jet-vie', getter: (actor, context) => actor.system.sante.vie.value }, + { column: "endurance_actuel", rollClass: 'jet-vie', getter: (actor, context) => actor.system.sante.endurance.value }, { column: "esquive", getter: (actor, context) => Mapping.getEsquive(context) }, - { column: "esquive-armure", getter: (actor, context) => Mapping.getEsquiveArmure(context) }, + { column: "esquive_armure", getter: (actor, context) => Mapping.getEsquiveArmure(context) }, { column: "competences", getter: (actor, context) => Mapping.getCompetences(actor, CATEGORIES_COMPETENCES) }, { column: "draconic", getter: (actor, context) => Mapping.getCompetences(actor, CATEGORIES_DRACONIC) }, ] @@ -104,6 +108,27 @@ export class Mapping { return MAPPING } + static getColumns() { + return MAPPING.map(it => it.column) + } + + static getValues(actor) { + const context = Mapping.prepareContext(actor) + return MAPPING.map(it => it.getter(actor, context)) + } + static getAsObject(actor) { + const context = Mapping.prepareContext(actor) + return Object.fromEntries(MAPPING.map(it => [it.column, { + colName: it.colName ?? it.column, + value: it.getter(actor, context) + }])) + } + + static getValues(actor) { + const context = Mapping.prepareContext(actor) + return MAPPING.map(it => it.getter(actor, context)) + } + static prepareContext(actor) { return { armes: Mapping.prepareArmes(actor), @@ -190,12 +215,16 @@ export class Mapping { } static prepareSorts(actor) { - return actor.itemTypes[ITEM_TYPES.sort].map(it => Mapping.prepareSort(it)) + const codeVoies = Mapping.getCompetencesCategorie(actor, CATEGORIES_DRACONIC) + .map(it => RdDItemSort.getVoieCode(it)) + + return actor.itemTypes[ITEM_TYPES.sort].map(it => Mapping.prepareSort(it, codeVoies)) + .sort(Misc.ascending(it => `${it.voie} : ${it.description}`)) } - static prepareSort(sort) { + static prepareSort(sort, voies) { return { - voie: RdDItemSort.getCodeDraconic(sort), + voie: RdDItemSort.getCodeDraconic(sort, voies), description: Mapping.descriptionSort(sort), bonus: Mapping.bonusCase(sort) } @@ -203,8 +232,18 @@ export class Mapping { static descriptionSort(sort) { const ptSeuil = Array(sort.system.coutseuil).map(it => '*') - const caseTMR = sort.system.caseTMRspeciale.length > 0 ? sort.system.caseTMRspeciale : sort.system.caseTMR - return `${sort.name}${ptSeuil} (${caseTMR}) R${sort.system.difficulte} r${sort.system.ptreve}` + const caseTMR = sort.system.caseTMRspeciale.length > 0 ? Mapping.toVar(sort.system.caseTMRspeciale) : Misc.upperFirst(TMRType[sort.system.caseTMR].name) + const ptreve = Mapping.addSpaceToNonNumeric(sort.system.ptreve) + const diff = Mapping.addSpaceToNonNumeric(sort.system.difficulte) + return `${sort.name}${ptSeuil} (${caseTMR}) R${diff} r${ptreve}` + } + + static addSpaceToNonNumeric(value) { + return Number.isNumeric(value) ? value : ' ' + Mapping.toVar(value) + } + + static toVar(value) { + return value.replace('variable', 'var') } static bonusCase(sort) { @@ -227,7 +266,7 @@ export class Mapping { const poids = actor.system.poids const cheveux = actor.system.cheveux ? `cheveux ${actor.system.cheveux}` : undefined const yeux = actor.system.yeux ? `yeux ${actor.system.yeux}` : undefined - const beaute = actor.system.beaute ? `Beauté ${actor.system.beaute}` : undefined + const beaute = actor.system.beaute ? `beauté ${actor.system.beaute}` : undefined const list = [race, hn, age, taille, poids, cheveux, yeux, beaute] return Misc.join(list.filter(it => it), ', ') } @@ -237,7 +276,14 @@ export class Mapping { } static getProtectionArmure(actor, context) { - return Number(context?.armure?.protection ?? 0) + Number(actor.system.attributs.protection.value) + const naturelle = Number(actor.system.attributs.protection.value) + if (context?.armure?.protection == undefined) { + return naturelle + } + if (Number.isNumeric(context?.armure?.protection)) { + return Number(context?.armure?.protection ?? 0) + naturelle + } + return context?.armure.protection + (naturelle > 0 ? `+${naturelle}` : '') } static getMalusArmure(actor, context) { @@ -263,8 +309,8 @@ export class Mapping { if (competences.length == 0) { return '' } - const byCartegories = Mapping.competencesByCategoriesByNiveau(competences, categories) - const txtByCategories = Object.values(byCartegories) + const byCategories = Mapping.competencesByCategoriesByNiveau(competences, categories) + const txtByCategories = Object.values(byCategories) .map(it => it.competencesParNiveau) .map(byNiveau => { const niveaux = Object.keys(byNiveau).map(it => Number(it)).sort(Misc.ascending()) diff --git a/module/actor/random/app-personnage-aleatoire.js b/module/actor/random/app-personnage-aleatoire.js index 79d01576..47888d69 100644 --- a/module/actor/random/app-personnage-aleatoire.js +++ b/module/actor/random/app-personnage-aleatoire.js @@ -25,6 +25,11 @@ const RANDOM_VALUES = { } export class AppPersonnageAleatoire extends FormApplication { + static preloadHandlebars() { + loadTemplates([ + 'systems/foundryvtt-reve-de-dragon/templates/actor/random/champ-aleatoire.hbs', + ]) + } static get defaultOptions() { return foundry.utils.mergeObject(super.defaultOptions, { diff --git a/module/item-sort.js b/module/item-sort.js index be1a2f66..0baf8e5e 100644 --- a/module/item-sort.js +++ b/module/item-sort.js @@ -5,12 +5,12 @@ import { Misc } from "./misc.js"; import { TMRUtility } from "./tmr-utility.js"; const VOIES_DRACONIC = [ - { code: 'O', label: "Voie d'Oniros", short: 'Oniros' }, - { code: 'H', label: "Voie d'Hypnos", short: 'Hypnos' }, - { code: 'N', label: "Voie de Narcos", short: 'Narcos' }, - { code: 'T', label: "Voie de Thanatos", short: 'Thanatos' }, - { code: 'O/H/N/T', label: "Oniros/Hypnos/Narcos/Thanatos", short: 'Oniros/Hypnos/Narcos/Thanatos' }, - { code: 'O/H/N', label: "Oniros/Hypnos/Narcos" } + { code: 'O', label: "Voie d'Oniros", short: 'Oniros', ordre: 'a' }, + { code: 'H', label: "Voie d'Hypnos", short: 'Hypnos', ordre: 'b' }, + { code: 'N', label: "Voie de Narcos", short: 'Narcos', ordre: 'c' }, + { code: 'T', label: "Voie de Thanatos", short: 'Thanatos', ordre: 'd' }, + { code: 'O/H/N/T', label: "Oniros/Hypnos/Narcos/Thanatos", short: 'Oniros/Hypnos/Narcos/Thanatos', ordre: 'e' }, + { code: 'O/H/N', label: "Oniros/Hypnos/Narcos", short: "Oniros/Hypnos/Narcos", ordre: 'f' } ] /* -------------------------------------------- */ @@ -27,17 +27,33 @@ export class RdDItemSort extends Item { return [RdDItemCompetence.getVoieDraconic(draconicList, sort.system.draconic)]; } - static getCodeDraconic(sort) { + static getOrdreCode(code) { + return (VOIES_DRACONIC.find(it => it.code == code)?.ordre ?? '?') + } + + static getVoieCode(voie) { + return VOIES_DRACONIC.find(it => voie.name.includes(it.short))?.code ?? '?' + } + + static getCodeDraconic(sort, voies = ['O', 'H', 'N', 'T']) { switch (Grammar.toLowerCaseNoAccent(sort.name)) { case "lecture d'aura": case "detection d'aura": - return 'O/H/N/T' + return RdDItemSort.$voiesConnues('O/H/N/T', voies) case "annulation de magie": - return 'O/H/N' + return RdDItemSort.$voiesConnues('O/H/N', voies) } const voie = VOIES_DRACONIC.find(it => it.label.includes(sort.system.draconic)) return voie?.code ?? sort.system.draconic } + + + static $voiesConnues(voiesSort, voies) { + const codes = voies.filter(it => voiesSort.includes(it)) + .sort(Misc.ascending(it => RdDItemSort.getOrdreCode(it))) + return Misc.join(codes ?? [''], '/'); + } + /* -------------------------------------------- */ static isDifficulteVariable(sort) { return sort && (sort.system.difficulte.toLowerCase() == "variable"); @@ -67,7 +83,7 @@ export class RdDItemSort extends Item { static buildBonusCaseList(bonuscase, newCase) { const list = RdDItemSort.bonuscaseStringToList(bonuscase) if (newCase) { - list.push({ case: "Nouvelle", bonus: 0 }) + list.push({ case: "Nouvelle", bonus: 0 }) } return list; } diff --git a/module/rdd-main.js b/module/rdd-main.js index ec6c5221..7dca3faa 100644 --- a/module/rdd-main.js +++ b/module/rdd-main.js @@ -64,9 +64,10 @@ import { RdDItemArmure } from "./item/armure.js" import { AutoAdjustDarkness as AutoAdjustDarkness } from "./time/auto-adjust-darkness.js" import { RdDCreature } from "./actor/creature.js" import { RdDTMRDialog } from "./rdd-tmr-dialog.js" -//import { RdDActorExportSheet } from "./actor/actor-export-sheet.js" import { OptionsAvancees } from "./settings/options-avancees.js" import { ExportScriptarium } from "./actor/export-scriptarium/export-scriptarium.js" +import { AppPersonnageAleatoire } from "./actor/random/app-personnage-aleatoire.js" +import { RdDActorExportSheet } from "./actor/export-scriptarium/actor-encart-sheet.js" /** * RdD system @@ -119,6 +120,7 @@ export class SystemReveDeDragon { // preload handlebars templates RdDUtility.preloadHandlebarsTemplates() + AppPersonnageAleatoire.preloadHandlebars() /* -------------------------------------------- */ this.initSystemSettings() @@ -158,12 +160,12 @@ export class SystemReveDeDragon { // Register sheet application classes Actors.unregisterSheet("core", ActorSheet) Actors.registerSheet(SYSTEM_RDD, RdDCommerceSheet, { types: ["commerce"], makeDefault: true }) - //Actors.registerSheet(SYSTEM_RDD, RdDActorExportSheet, { types: ["personnage"], makeDefault: false }) Actors.registerSheet(SYSTEM_RDD, RdDActorSheet, { types: ["personnage"], makeDefault: true }) Actors.registerSheet(SYSTEM_RDD, RdDCreatureSheet, { types: ["creature"], makeDefault: true }) Actors.registerSheet(SYSTEM_RDD, RdDActorVehiculeSheet, { types: ["vehicule"], makeDefault: true }) Actors.registerSheet(SYSTEM_RDD, RdDActorEntiteSheet, { types: ["entite"], makeDefault: true }) Items.unregisterSheet("core", ItemSheet) + await RdDActorExportSheet.init() RdDItemSheet.register(RdDSigneDraconiqueItemSheet) RdDItemSheet.register(RdDRencontreItemSheet) diff --git a/module/rdd-utility.js b/module/rdd-utility.js index 086c0fff..9b43c877 100644 --- a/module/rdd-utility.js +++ b/module/rdd-utility.js @@ -169,7 +169,6 @@ export class RdDUtility { 'systems/foundryvtt-reve-de-dragon/templates/actor/liens-vehicules.hbs', 'systems/foundryvtt-reve-de-dragon/templates/actor/commerce-inventaire.html', 'systems/foundryvtt-reve-de-dragon/templates/actor/commerce-inventaire-item.html', - 'systems/foundryvtt-reve-de-dragon/templates/actor/random/champ-aleatoire.hbs', //Items 'systems/foundryvtt-reve-de-dragon/templates/scripts/autocomplete-script.hbs', 'systems/foundryvtt-reve-de-dragon/templates/scripts/autocomplete.hbs', @@ -293,6 +292,7 @@ export class RdDUtility { Handlebars.registerHelper('array-includes', (array, value) => array.includes(value)); Handlebars.registerHelper('min', (...args) => Math.min(...args.slice(0, -1))); + Handlebars.registerHelper('isLastIndex', (index, list) => index+1 >= list.length); 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)); diff --git a/module/settings/options-avancees.js b/module/settings/options-avancees.js index 1e4cad4e..a524bb01 100644 --- a/module/settings/options-avancees.js +++ b/module/settings/options-avancees.js @@ -4,7 +4,7 @@ import { Misc } from "../misc.js" export const EXPORT_CSV_SCRIPTARIUM = 'export-csv-scriptarium' const OPTIONS_AVANCEES = [ - { group: 'Menus', name: EXPORT_CSV_SCRIPTARIUM, descr: "Proposer le menu d'export csv Scriptarium (raffraichissement requis)" }, + { group: 'Menus', name: EXPORT_CSV_SCRIPTARIUM, descr: "Proposer le menu d'export csv Scriptarium" }, ] export class OptionsAvancees extends FormApplication { diff --git a/styles/simple.css b/styles/simple.css index 77a3b277..92ec5536 100644 --- a/styles/simple.css +++ b/styles/simple.css @@ -326,7 +326,7 @@ table {border: 1px solid #7a7971;} display: grid; grid-column: span 2 / span 2; grid-template-columns: repeat(2, minmax(0, 1fr)); - gap: 10px; + gap: 30px; margin: 10px 0; padding: 0; } @@ -411,6 +411,11 @@ table {border: 1px solid #7a7971;} text-align: left; } +.flex-group-top { + vertical-align: top; + align-self: start; +} + .flex-group-right { -webkit-box-pack: end; -ms-flex-pack: end; @@ -675,6 +680,7 @@ input:is(.blessure-premiers_soins, .blessure-soins_complets) { } .carac-label { + font-weight: bold; flex-basis: 40%; } .rdd.sheet .window-content .sheet-body .carac-list .caracteristique > .utiliser-attribut { @@ -1183,9 +1189,6 @@ ul.chat-list li:nth-child(odd) { padding: 0.5rem; cursor: pointer; } -.carac-label { - font-weight: bold; -} .list-item { margin: 0.1rem; box-shadow: inset 0px 0px 1px #00000096; diff --git a/system.json b/system.json index c24b1675..6489564b 100644 --- a/system.json +++ b/system.json @@ -1,8 +1,8 @@ { "id": "foundryvtt-reve-de-dragon", "title": "Rêve de Dragon", - "version": "12.0.11", - "download": "https://www.uberwald.me/gitea/public/foundryvtt-reve-de-dragon/archive/foundryvtt-reve-de-dragon-12.0.11.zip", + "version": "12.0.12", + "download": "https://www.uberwald.me/gitea/public/foundryvtt-reve-de-dragon/archive/foundryvtt-reve-de-dragon-12.0.12.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/carac-main.html b/templates/actor/carac-main.html index c842223e..8f31c909 100644 --- a/templates/actor/carac-main.html +++ b/templates/actor/carac-main.html @@ -7,7 +7,7 @@