forked from public/foundryvtt-reve-de-dragon
Compare commits
16 Commits
88c8a70744
...
12.0.28
Author | SHA1 | Date | |
---|---|---|---|
d04da56c22 | |||
a87a4d371e | |||
c577fa5f29 | |||
30303330d7 | |||
ded92ddf2d | |||
2d2b75e33f | |||
a9b7dff83a | |||
75d6f78b40 | |||
979d49f96e | |||
22cab26908 | |||
23b3be246b | |||
b160ce78bc | |||
60921cfef1 | |||
12e5c94aba | |||
4dd6e1c3ff | |||
c7dfc8682d |
21
changelog.md
21
changelog.md
@ -1,11 +1,26 @@
|
||||
# 12.0
|
||||
## 12.0.28 - Les réserves d'Astrobazzarh
|
||||
- possibilité de mettre en réserve depuis un sort connu
|
||||
|
||||
## 12.0.27 - Les vêtements d'Astrobazzarh
|
||||
- Ajout de la liste des armures dans l'onglet caractéristiques
|
||||
- Ajout d'une option pour choisir une carte des TMR alternatives
|
||||
- Le Gardien peut créer des sorts en réserve parmi les sorts d'un personnage
|
||||
- Bouton pour ajouter des compétences aux créatures/entités
|
||||
- Bouton pour ajouter un personnage accordé aux entités de cauchemar
|
||||
- Correction du choix d'une cible parmi toutes les cibles pour les combats
|
||||
- Correction des ajouts de blessures (prise en compte de l'endurance et des contusions)
|
||||
- Correction des rituels de Détection et Lecture d'Aura des personnages prétirés
|
||||
- Correction des invocations
|
||||
- support de "personnages" n'ayant pas toutes les compétences
|
||||
- ajout de lien entre le sort et la créature
|
||||
- correction des liens vers les journaux
|
||||
- limitation aux compétences listées
|
||||
- acteur non lié par défaut
|
||||
- Correction des compendiums
|
||||
- l'import de personnages depuis un compendium respecte les acteurs liés/non-liés
|
||||
- les modèles de voyageurs sont liés par défaut
|
||||
- les modèles de personnages non joueurs sont non-liés par défaut
|
||||
|
||||
## 12.0.26 - Astrobazzarh le Haut-rêvant
|
||||
- bouton pour le don de haut-rêve en un clic
|
||||
@ -103,11 +118,9 @@
|
||||
- encodage de l'export en windows-1252
|
||||
- export de l'esquive avec armure et sans armure
|
||||
|
||||
## 12.0.10 - Le scriptorium d'Astrobazzarh
|
||||
## 12.0.9 - 12.0.10 - Le scriptorium d'Astrobazzarh
|
||||
- corrections de l'export scriptarium
|
||||
|
||||
## 12.0.9 - Le scriptorium d'Astrobazzarh
|
||||
- ajout d'une fonction avancée pour exporter les personnages dans un format csv
|
||||
- ajout d'une fonction avancée pour un exporter "scriptarium" des personnages
|
||||
|
||||
## 12.0.8 - La quincaillerie d'Astrobazzarh
|
||||
- le propriétaire est indiqué dans les feuilles d'équipements/compétences/...
|
||||
|
@ -22,7 +22,6 @@ import { AppPersonnageAleatoire } from "./actor/random/app-personnage-aleatoire.
|
||||
/* -------------------------------------------- */
|
||||
/**
|
||||
* Extend the basic ActorSheet with some very simple modifications
|
||||
* @extends {ActorSheet}
|
||||
*/
|
||||
export class RdDActorSheet extends RdDBaseActorSangSheet {
|
||||
|
||||
@ -83,7 +82,7 @@ export class RdDActorSheet extends RdDBaseActorSangSheet {
|
||||
formData.combat.push(RdDItemArme.corpsACorps(actor));
|
||||
formData.combat.push(RdDItemArme.empoignade(actor));
|
||||
|
||||
formData.esquives = this.actor.getCompetences("Esquive");
|
||||
formData.esquives = this.actor.getCompetencesEsquive()
|
||||
formData.combat = RdDCombatManager.listActionsArmes(formData.combat, formData.competences, formData.system.carac);
|
||||
formData.empoignades = this.actor.getEmpoignades();
|
||||
|
||||
@ -184,7 +183,7 @@ export class RdDActorSheet extends RdDBaseActorSangSheet {
|
||||
|
||||
// Equip Inventory Item
|
||||
this.html.find('.item-equip').click(async event => this.actor.equiperObjet(RdDSheetUtility.getItemId(event)))
|
||||
this.html.find('.chance-actuelle').click(async event => this.actor.rollCarac('chance-actuelle'))
|
||||
this.html.find('.roll-chance-actuelle').click(async event => this.actor.rollCarac('chance-actuelle'))
|
||||
|
||||
this.html.find('.button-appel-chance').click(async event => this.actor.rollAppelChance())
|
||||
|
||||
@ -215,7 +214,7 @@ export class RdDActorSheet extends RdDBaseActorSangSheet {
|
||||
// Boutons spéciaux MJs
|
||||
this.html.find('.forcer-tmr-aleatoire').click(async event => this.actor.reinsertionAleatoire("Action MJ"))
|
||||
this.html.find('.don-de-haut-reve').click(async event => this.actor.addDonDeHautReve())
|
||||
this.html.find('.nouveau-sort-reserve').click(async event => this.actor.addSortReserve())
|
||||
this.html.find('.sortreserve-add').click(async event => this.actor.addSortReserve(RdDSheetUtility.getItemId(event)))
|
||||
this.html.find('.afficher-tmr').click(async event => this.actor.changeTMRVisible())
|
||||
}
|
||||
|
||||
@ -285,6 +284,8 @@ export class RdDActorSheet extends RdDBaseActorSangSheet {
|
||||
|
||||
this.html.find('.ptreve-actuel-plus').click(async event => this.actor.reveActuelIncDec(1))
|
||||
this.html.find('.ptreve-actuel-moins').click(async event => this.actor.reveActuelIncDec(-1))
|
||||
this.html.find('.chance-actuelle-plus').click(async event => this.actor.chanceActuelleIncDec(1))
|
||||
this.html.find('.chance-actuelle-moins').click(async event => this.actor.chanceActuelleIncDec(-1))
|
||||
this.html.find('.fatigue-plus').click(async event => this.actor.santeIncDec("fatigue", 1))
|
||||
this.html.find('.fatigue-moins').click(async event => this.actor.santeIncDec("fatigue", -1))
|
||||
}
|
||||
|
@ -39,11 +39,12 @@ import { DialogChoixXpCarac } from "./dialog-choix-xp-carac.js";
|
||||
import { RdDItemArme } from "./item-arme.js";
|
||||
import { RdDCombatManager } from "./rdd-combat.js";
|
||||
import { RdDItemTete } from "./item/tete.js";
|
||||
import { SystemCompendiums } from "./settings/system-compendiums.js";
|
||||
import { DialogSelect } from "./dialog-select.js";
|
||||
import { PAS_DE_DRACONIC, POSSESSION_SANS_DRACONIC } from "./item/base-items.js";
|
||||
|
||||
export const MAINS_DIRECTRICES = ['Droitier', 'Gaucher', 'Ambidextre']
|
||||
|
||||
|
||||
/* -------------------------------------------- */
|
||||
/**
|
||||
* Extend the base Actor entity by defining a custom roll data structure which is ideal for the Simple system.
|
||||
@ -94,11 +95,14 @@ export class RdDActor extends RdDBaseActorSang {
|
||||
isHautRevant() { return this.system.attributs.hautrevant.value != "" }
|
||||
|
||||
/* -------------------------------------------- */
|
||||
getAgilite() { return this.system.carac.agilite?.value ?? 0 }
|
||||
getChance() { return this.system.carac.chance?.value ?? 0 }
|
||||
getAgilite() { return Misc.toInt(this.system.carac.agilite?.value ?? 0) }
|
||||
getChance() { return Misc.toInt(this.system.carac.chance?.value ?? 0) }
|
||||
|
||||
getReveActuel() { return this.system.reve?.reve?.value ?? this.carac.reve.value ?? 0 }
|
||||
getChanceActuel() { return this.system.compteurs.chance?.value ?? 10 }
|
||||
getReveActuel() { return Misc.toInt(this.system.reve?.reve?.value) ?? this.carac.reve.value ?? 0 }
|
||||
getChanceActuel() {
|
||||
return Number.isNumeric(this.system.compteurs.chance.value) ?
|
||||
Misc.toInt(this.system.compteurs.chance.value) : this.getChance()
|
||||
}
|
||||
getMoralTotal() { return this.system.compteurs.moral?.value ?? 0 }
|
||||
|
||||
getEnduranceMax() { return Math.max(1, Math.max(this.getTaille() + this.getConstitution(), this.getVieMax() + this.getVolonte())) }
|
||||
@ -153,10 +157,9 @@ export class RdDActor extends RdDBaseActorSang {
|
||||
/* -------------------------------------------- */
|
||||
getDemiReve() { return this.system.reve.tmrpos.coord }
|
||||
getDraconicList() { return this.itemTypes[ITEM_TYPES.competence].filter(it => it.system.categorie == 'draconic') }
|
||||
getBestDraconic() { return foundry.utils.duplicate(this.getDraconicList().sort(Misc.descending(it => it.system.niveau)).find(it => true)) }
|
||||
getBestDraconic() { return foundry.utils.duplicate([...this.getDraconicList(), PAS_DE_DRACONIC].sort(Misc.descending(it => it.system.niveau)).find(it => true)) }
|
||||
getDraconicOuPossession() {
|
||||
return [...this.getDraconicList().filter(it => it.system.niveau >= 0),
|
||||
super.getDraconicOuPossession()]
|
||||
return [...this.getDraconicList().filter(it => it.system.niveau >= 0), POSSESSION_SANS_DRACONIC]
|
||||
.sort(Misc.descending(it => it.system.niveau))
|
||||
.find(it => true)
|
||||
}
|
||||
@ -991,21 +994,31 @@ export class RdDActor extends RdDBaseActorSang {
|
||||
}
|
||||
}
|
||||
|
||||
async addSortReserve() {
|
||||
async addSortReserve(itemId) {
|
||||
if (itemId) {
|
||||
const item = this.items.get(itemId)
|
||||
if (item.type == ITEM_TYPES.sort && !item.system.isrituel) {
|
||||
this.$createSortReserve(item)
|
||||
return
|
||||
}
|
||||
}
|
||||
const selectSortReserve = {
|
||||
title: "Créer un sort en réserve",
|
||||
label: "Choisir un sort",
|
||||
list: this.itemTypes[ITEM_TYPES.sort].filter(it => !it.system.isrituel)
|
||||
}
|
||||
DialogSelect.select(selectSortReserve, sort =>
|
||||
this.createEmbeddedDocuments("Item",
|
||||
[{
|
||||
type: ITEM_TYPES.sortreserve,
|
||||
name: sort.name,
|
||||
img: sort.img,
|
||||
system: { sortid: sort.id, draconic: sort.system.draconic, ptreve: Number(sort.system.ptreve.match(/\d+/)), coord: 'A1', heurecible: 'Vaisseau' }
|
||||
}],
|
||||
{ renderSheet: true }))
|
||||
DialogSelect.select(selectSortReserve, sort => this.$createSortReserve(sort))
|
||||
}
|
||||
|
||||
$createSortReserve(sort) {
|
||||
this.createEmbeddedDocuments("Item",
|
||||
[{
|
||||
type: ITEM_TYPES.sortreserve,
|
||||
name: sort.name,
|
||||
img: sort.img,
|
||||
system: { sortid: sort.id, draconic: sort.system.draconic, ptreve: Number(sort.system.ptreve.match(/\d+/)), coord: 'A1', heurecible: 'Vaisseau' }
|
||||
}],
|
||||
{ renderSheet: true })
|
||||
}
|
||||
/* -------------------------------------------- */
|
||||
async reinsertionAleatoire(raison, accessible = tmr => true) {
|
||||
@ -1070,6 +1083,11 @@ export class RdDActor extends RdDBaseActorSang {
|
||||
await this.update({ "system.reve.reve.value": reve });
|
||||
}
|
||||
|
||||
async chanceActuelleIncDec(value) {
|
||||
const chance = Math.min(this.getChance(), Math.max(this.getChanceActuel() + value, 0));
|
||||
await this.update({ "system.compteurs.chance.value": chance });
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
async regainPointDeSeuil() {
|
||||
const seuil = Misc.toInt(this.system.reve.seuil.value);
|
||||
@ -2254,12 +2272,6 @@ export class RdDActor extends RdDBaseActorSang {
|
||||
}
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
async chanceActuelleIncDec(value) {
|
||||
const chance = Math.min(this.getChance(), Math.max(this.getChanceActuel() + value, 0));
|
||||
await this.updateCompteurValue("chance", chance);
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
async appelDestinee(onSuccess = () => { }, onEchec = () => { }) {
|
||||
let destinee = this.system.compteurs.destinee?.value ?? 0;
|
||||
|
@ -1,4 +1,5 @@
|
||||
import { Grammar } from "../grammar.js";
|
||||
import { ITEM_TYPES } from "../item.js";
|
||||
import { RdDSheetUtility } from "../rdd-sheet-utility.js";
|
||||
import { RdDBaseActorSheet } from "./base-actor-sheet.js";
|
||||
|
||||
@ -36,7 +37,30 @@ export class RdDBaseActorReveSheet extends RdDBaseActorSheet {
|
||||
this.html.find('.delete-active-effect').click(async event => this.actor.removeEffect(this.html.find(event.currentTarget).parents(".active-effect").data('effect')));
|
||||
this.html.find('.enlever-tous-effets').click(async event => await this.actor.removeEffects());
|
||||
}
|
||||
this.html.find('.competence-add').click(async event =>
|
||||
await this.actor.createEmbeddedDocuments("Item", [{
|
||||
type: ITEM_TYPES.competencecreature,
|
||||
name: 'Nouvelle competence',
|
||||
img: 'systems/foundryvtt-reve-de-dragon/icons/compcreature-serres.webp',
|
||||
system: {
|
||||
carac_value: this.actor.getForce(),
|
||||
}
|
||||
}], { renderSheet: true })
|
||||
)
|
||||
|
||||
if (this.options.vueDetaillee) {
|
||||
// On carac change
|
||||
this.html.find('.carac-value').change(async event => {
|
||||
let caracName = event.currentTarget.name.replace(".value", "").replace("system.carac.", "");
|
||||
this.actor.updateCarac(caracName, parseInt(event.target.value));
|
||||
});
|
||||
// On competence change
|
||||
this.html.find('.competence-value').change(async event => {
|
||||
let compName = event.currentTarget.attributes.compname.value;
|
||||
//console.log("Competence changed :", compName);
|
||||
this.actor.updateCompetence(compName, parseInt(event.target.value));
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -1,34 +1,27 @@
|
||||
import { ChatUtility } from "../chat-utility.js";
|
||||
import { DialogValidationEncaissement } from "../dialog-validation-encaissement.js";
|
||||
import { ENTITE_INCARNE, SHOW_DICE, SYSTEM_RDD } from "../constants.js";
|
||||
import { Grammar } from "../grammar.js";
|
||||
import { RdDItemCompetence } from "../item-competence.js";
|
||||
import { Misc } from "../misc.js";
|
||||
import { RdDEmpoignade } from "../rdd-empoignade.js";
|
||||
import { RdDResolutionTable } from "../rdd-resolution-table.js";
|
||||
import { RdDEncaisser } from "../rdd-roll-encaisser.js";
|
||||
import { RdDRoll } from "../rdd-roll.js";
|
||||
import { RdDUtility } from "../rdd-utility.js";
|
||||
import { ReglesOptionnelles } from "../settings/regles-optionnelles.js";
|
||||
import { RdDBaseActor } from "./base-actor.js";
|
||||
import { RdDItemCompetenceCreature } from "../item-competencecreature.js";
|
||||
import { StatusEffects } from "../settings/status-effects.js";
|
||||
import { ITEM_TYPES } from "../item.js";
|
||||
import { Targets } from "../targets.js";
|
||||
import { RdDPossession } from "../rdd-possession.js";
|
||||
import { RdDCombat, RdDCombatManager } from "../rdd-combat.js";
|
||||
import { RdDConfirm } from "../rdd-confirm.js";
|
||||
import { ENTITE_INCARNE, SHOW_DICE, SYSTEM_RDD } from "../constants.js";
|
||||
import { RdDItemCompetence } from "../item-competence.js";
|
||||
import { RdDItemCompetenceCreature } from "../item-competencecreature.js";
|
||||
import { RdDItemArme } from "../item-arme.js";
|
||||
import { StatusEffects } from "../settings/status-effects.js";
|
||||
import { Targets } from "../targets.js";
|
||||
import { RdDConfirm } from "../rdd-confirm.js";
|
||||
import { RdDCarac } from "../rdd-carac.js";
|
||||
|
||||
const POSSESSION_SANS_DRACONIC = {
|
||||
img: 'systems/foundryvtt-reve-de-dragon/icons/entites/possession.webp',
|
||||
name: 'Sans draconic',
|
||||
system: {
|
||||
niveau: 0,
|
||||
defaut_carac: "reve-actuel",
|
||||
}
|
||||
};
|
||||
import { ChatUtility } from "../chat-utility.js";
|
||||
import { DialogValidationEncaissement } from "../dialog-validation-encaissement.js";
|
||||
import { RdDCombat } from "../rdd-combat.js";
|
||||
import { RdDEmpoignade } from "../rdd-empoignade.js";
|
||||
import { RdDPossession } from "../rdd-possession.js";
|
||||
import { BASE_CORPS_A_CORPS, BASE_ESQUIVE, POSSESSION_SANS_DRACONIC } from "../item/base-items.js";
|
||||
|
||||
/**
|
||||
* Classe de base pour les acteurs disposant de rêve (donc, pas des objets)
|
||||
@ -163,24 +156,24 @@ export class RdDBaseActorReve extends RdDBaseActor {
|
||||
}
|
||||
return RdDItemCompetence.findCompetence(this.items, idOrName, options)
|
||||
}
|
||||
getCompetences(name) {
|
||||
return RdDItemCompetence.findCompetences(this.items, name)
|
||||
|
||||
getCompetences(name, options = { onMessage: message => { } }) {
|
||||
return RdDItemCompetence.findCompetences(this.items, name, options)
|
||||
}
|
||||
getCompetenceCorpsACorps(options = {}) {
|
||||
return this.getCompetence("Corps à corps", options)
|
||||
|
||||
getCompetenceCorpsACorps(options = { onMessage: message => { } }) {
|
||||
return this.getCompetence(BASE_CORPS_A_CORPS.name, options) ?? BASE_CORPS_A_CORPS
|
||||
}
|
||||
getCompetencesEsquive() {
|
||||
return this.getCompetences("esquive")
|
||||
|
||||
getCompetencesEsquive(options = { onMessage: message => { } }) {
|
||||
return this.getCompetences(BASE_ESQUIVE.name, options) ?? [BASE_ESQUIVE]
|
||||
}
|
||||
|
||||
getArmeParade(armeParadeId) {
|
||||
const item = armeParadeId ? this.getEmbeddedDocument('Item', armeParadeId) : undefined;
|
||||
return RdDItemArme.getArme(item);
|
||||
return RdDItemArme.getArme(armeParadeId ? this.getEmbeddedDocument('Item', armeParadeId) : undefined)
|
||||
}
|
||||
|
||||
getDraconicOuPossession() {
|
||||
return POSSESSION_SANS_DRACONIC
|
||||
}
|
||||
getDraconicOuPossession() { return POSSESSION_SANS_DRACONIC }
|
||||
|
||||
getPossession(possessionId) {
|
||||
return this.itemTypes[ITEM_TYPES.possession].find(it => it.system.possessionid == possessionId);
|
||||
|
@ -1,4 +1,4 @@
|
||||
import { MAX_ENDURANCE_FATIGUE, RdDUtility } from "../rdd-utility.js";
|
||||
import { RdDUtility } from "../rdd-utility.js";
|
||||
import { ReglesOptionnelles } from "../settings/regles-optionnelles.js";
|
||||
import { STATUSES } from "../settings/status-effects.js";
|
||||
import { ITEM_TYPES } from "../item.js";
|
||||
|
@ -177,21 +177,6 @@ export class RdDBaseActorSheet extends ActorSheet {
|
||||
this.options.vueDetaillee = !this.options.vueDetaillee;
|
||||
this.render(true);
|
||||
});
|
||||
|
||||
if (this.options.vueDetaillee) {
|
||||
// On carac change
|
||||
this.html.find('.carac-value').change(async event => {
|
||||
let caracName = event.currentTarget.name.replace(".value", "").replace("system.carac.", "");
|
||||
this.actor.updateCarac(caracName, parseInt(event.target.value));
|
||||
});
|
||||
// On competence change
|
||||
this.html.find('.competence-value').change(async event => {
|
||||
let compName = event.currentTarget.attributes.compname.value;
|
||||
//console.log("Competence changed :", compName);
|
||||
this.actor.updateCompetence(compName, parseInt(event.target.value));
|
||||
});
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
_rechercherKeyup(event) {
|
||||
|
@ -176,11 +176,19 @@ export class RdDBaseActor extends Actor {
|
||||
await super._preCreate(data, options, user);
|
||||
|
||||
// Configure prototype token settings
|
||||
const prototypeToken = {};
|
||||
if (this.type === "personnage") Object.assign(prototypeToken, {
|
||||
sight: { enabled: true }, actorLink: true, disposition: CONST.TOKEN_DISPOSITIONS.FRIENDLY
|
||||
});
|
||||
this.updateSource({ prototypeToken });
|
||||
if (this.type === "personnage") {
|
||||
this.updateSource({
|
||||
sight: { enabled: true },
|
||||
actorLink: options.fromCompendium ? data.prototypeToken.actorLink : true,
|
||||
disposition: CONST.TOKEN_DISPOSITIONS.FRIENDLY
|
||||
})
|
||||
} else {
|
||||
const prototypeToken = {
|
||||
sight: { enabled: true },
|
||||
disposition: CONST.TOKEN_DISPOSITIONS.NEUTRAL
|
||||
}
|
||||
this.updateSource({ prototypeToken });
|
||||
}
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
|
@ -1,6 +1,7 @@
|
||||
import { RdDBaseActorReveSheet } from "./base-actor-reve-sheet.js";
|
||||
import { RdDSheetUtility } from "../rdd-sheet-utility.js";
|
||||
import { RdDUtility } from "../rdd-utility.js";
|
||||
import { DialogSelect } from "../dialog-select.js";
|
||||
|
||||
export class RdDActorEntiteSheet extends RdDBaseActorReveSheet {
|
||||
|
||||
@ -35,23 +36,31 @@ export class RdDActorEntiteSheet extends RdDBaseActorReveSheet {
|
||||
this.html.find('.creature-niveau').change(async event => {
|
||||
let compName = event.currentTarget.attributes.compname.value;
|
||||
this.actor.updateCreatureCompetence(compName, "niveau", parseInt(event.target.value));
|
||||
});
|
||||
})
|
||||
this.html.find('.creature-dommages').change(async event => {
|
||||
let compName = event.currentTarget.attributes.compname.value;
|
||||
this.actor.updateCreatureCompetence(compName, "dommages", parseInt(event.target.value));
|
||||
});
|
||||
})
|
||||
|
||||
this.html.find('.resonance-add').click(async event =>
|
||||
DialogSelect.select({
|
||||
label: "Choisir un acteur à accorder",
|
||||
list: game.actors.filter(it => it.isPersonnage() && it.prototypeToken.actorLink)
|
||||
},
|
||||
it => this.resonanceAdd(it.id))
|
||||
)
|
||||
|
||||
this.html.find('.resonance-delete').click(async event => {
|
||||
const li = RdDSheetUtility.getEventElement(event);
|
||||
const actorId = li.data("actor-id");
|
||||
if (actorId) {
|
||||
const actorResonance = game.actors.get(actorId);
|
||||
RdDUtility.confirmSubActeurDelete(this, actorResonance, li, () => {
|
||||
console.log('Delete : ', actorId);
|
||||
this.deleteSubActeur(actorId);
|
||||
this.resonanceDelete(actorId);
|
||||
RdDUtility.slideOnDelete(this, li);
|
||||
});
|
||||
})
|
||||
}
|
||||
});
|
||||
})
|
||||
}
|
||||
|
||||
async _onDropActor(event, dragData) {
|
||||
@ -60,7 +69,13 @@ export class RdDActorEntiteSheet extends RdDBaseActorReveSheet {
|
||||
super._onDropActor(event, dragData)
|
||||
}
|
||||
|
||||
async deleteSubActeur(actorId) {
|
||||
async resonanceAdd(actorId) {
|
||||
let newResonances = [...this.actor.system.sante.resonnance.actors, actorId]
|
||||
await this.actor.update({ 'system.sante.resonnance.actors': newResonances });
|
||||
}
|
||||
|
||||
async resonanceDelete(actorId) {
|
||||
console.log('Delete : ', actorId);
|
||||
let newResonances = this.actor.system.sante.resonnance.actors.filter(id => id != actorId);
|
||||
await this.actor.update({ 'system.sante.resonnance.actors': newResonances }, { renderSheet: false });
|
||||
}
|
||||
|
@ -83,6 +83,7 @@ const MAPPING_BASE = [
|
||||
{ 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: "chance_actuel", rollClass: 'roll-chance-actuelle', colName: 'Chance actuelle', getter: (actor, context) => actor.system.compteurs.chance.value },
|
||||
{ column: "vie_actuel", rollClass: 'jet-vie', getter: (actor, context) => actor.system.sante.vie.value },
|
||||
{ column: "endurance_actuel", rollClass: 'jet-endurance', getter: (actor, context) => actor.system.sante.endurance.value },
|
||||
{ column: "esquive", getter: (actor, context) => Mapping.getEsquive(context) },
|
||||
|
@ -26,7 +26,7 @@ const MANIEMENTS = {
|
||||
'de lancer': (weapon) => { return { name: weapon.system.lancer, categorie: 'lancer' } },
|
||||
'de jet': (weapon) => { return { name: weapon.system.lancer, categorie: 'lancer' } },
|
||||
'à une main': (weapon) => { return { name: weapon.system.competence, categorie: 'melee' } },
|
||||
'à deux main': (weapon) => { return { name: weapon.system.competence.replace("à 1 main", "à 2 main"), categorie: 'melee' } },
|
||||
'à deux mains': (weapon) => { return { name: weapon.system.competence.replace("à 1 main", "à 2 mains"), categorie: 'melee' } },
|
||||
'mêlée': (weapon) => { return { name: weapon.system.competence, categorie: 'melee' } },
|
||||
}
|
||||
const XREGEXP_WEAPON_MANIEMENT = "(?<maniement>(" + Misc.join(Object.keys(MANIEMENTS), '|') + "))"
|
||||
@ -267,7 +267,7 @@ export class RdDStatBlockParser {
|
||||
}
|
||||
let weapMatch = XRegExp.exec(statString, XRegExp(weapon.name
|
||||
+ "(\\s*" + XREGEXP_WEAPON_MANIEMENT + ")?"
|
||||
+ "\\s+(?<value>\\+\\d+)", 'giu'));
|
||||
+ "\\s+(?<value>[\\+\\-]?\\d+)", 'giu'));
|
||||
if (weapMatch) {
|
||||
weapon = weapon.toObject();
|
||||
weapon.system.equipe = 'true';
|
||||
@ -479,12 +479,12 @@ export class RdDStatBlockParser {
|
||||
let namePersonnage = "Importé"
|
||||
if (statString.includes(", né")) {
|
||||
// Name is all string before first comma ','
|
||||
namePersonnage = XRegExp.exec(statString, XRegExp("(?<value>[\\p{Letter}\\s\\d]+),", 'giu'));
|
||||
namePersonnage = XRegExp.exec(statString, XRegExp("(?<value>[\\p{Letter}\\-\\s\\d]+),", 'giu'));
|
||||
} else {
|
||||
namePersonnage = XRegExp.exec(statString, XRegExp("(?<value>[\\p{Letter}\\s\\d]+)\\s+TAILLE", 'giu'));
|
||||
namePersonnage = XRegExp.exec(statString, XRegExp("(?<value>[\\p{Letter}\\-\\s\\d]+)\\s+TAILLE", 'giu'));
|
||||
}
|
||||
if (namePersonnage?.value) {
|
||||
return Misc.upperFirst(namePersonnage?.value);
|
||||
return Misc.upperFirst(namePersonnage?.value.toLowerCase());
|
||||
}
|
||||
}
|
||||
const name = XRegExp.exec(statString, XRegExp("(?<value>.+)\\s+taille", 'giu'));
|
||||
|
@ -1,6 +1,7 @@
|
||||
import { Grammar } from "./grammar.js";
|
||||
import { RdDItemCompetenceCreature } from "./item-competencecreature.js"
|
||||
import { ITEM_TYPES } from "./item.js";
|
||||
import { BASE_CORPS_A_CORPS } from "./item/base-items.js";
|
||||
import { RdDCombatManager } from "./rdd-combat.js";
|
||||
|
||||
const nomCategorieParade = {
|
||||
@ -236,13 +237,13 @@ export class RdDItemArme extends Item {
|
||||
}
|
||||
|
||||
static corpsACorps(actor) {
|
||||
let competence = actor?.getCompetenceCorpsACorps() ?? { system: { niveau: -6 } };
|
||||
let competence = actor?.getCompetenceCorpsACorps() ?? BASE_CORPS_A_CORPS
|
||||
let melee = actor ? actor.system.carac['melee'].value : 0
|
||||
return {
|
||||
_id: competence?.id,
|
||||
_id: competence.id,
|
||||
name: 'Corps à corps',
|
||||
type: ITEM_TYPES.arme,
|
||||
img: 'systems/foundryvtt-reve-de-dragon/icons/competence_corps_a_corps.webp',
|
||||
img: competence.img,
|
||||
system: {
|
||||
initiative: RdDCombatManager.calculInitiative(competence.system.niveau, melee),
|
||||
equipe: true,
|
||||
|
@ -1,5 +1,6 @@
|
||||
import { Grammar } from "./grammar.js";
|
||||
import { RdDItem } from "./item.js";
|
||||
import { SANS_COMPETENCE } from "./item/base-items.js";
|
||||
import { Misc } from "./misc.js";
|
||||
|
||||
const competenceTroncs = [["Esquive", "Dague", "Corps à corps"],
|
||||
@ -137,7 +138,7 @@ export class RdDItemCompetence extends Item {
|
||||
/* -------------------------------------------- */
|
||||
static computeEconomieXPTronc(competences) {
|
||||
return competenceTroncs.map(
|
||||
list => list.map(name => RdDItemCompetence.findCompetence(competences, name))
|
||||
list => list.map(name => RdDItemCompetence.findCompetence(competences, name, { onMessage: message => { } }))
|
||||
// calcul du coût xp jusqu'au niveau 0 maximum
|
||||
.map(it => RdDItemCompetence.computeDeltaXP(it?.system.base ?? -11, Math.min(it?.system.niveau ?? -11, 0)))
|
||||
.sort(Misc.ascending())
|
||||
@ -203,26 +204,12 @@ export class RdDItemCompetence extends Item {
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
static findCompetences(list, name) {
|
||||
return Misc.findAllLike(name, list, { filter: it => it.isCompetence(), description: 'compétence' });
|
||||
static findCompetences(list, name, options = {}) {
|
||||
options = foundry.utils.mergeObject(options, { preFilter: it => it.isCompetence(), description: 'compétence' }, { overwrite: false, inplace: false });
|
||||
return Misc.findAllLike(name, list, options);
|
||||
}
|
||||
|
||||
static sansCompetence() {
|
||||
return {
|
||||
name: "Sans compétence",
|
||||
type: "competence",
|
||||
img: "systems/foundryvtt-reve-de-dragon/icons/templates/icone_parchement_vierge.webp",
|
||||
system: {
|
||||
niveau: 0,
|
||||
default_diffLibre: 0,
|
||||
base: 0,
|
||||
categorie: "Aucune",
|
||||
description: "",
|
||||
descriptionmj: "",
|
||||
defaut_carac: "",
|
||||
}
|
||||
};
|
||||
}
|
||||
static sansCompetence() { return SANS_COMPETENCE }
|
||||
|
||||
static findFirstItem(list, idOrName, options) {
|
||||
return list.find(it => it.id == idOrName && options.preFilter(it))
|
||||
@ -272,8 +259,9 @@ export class RdDItemCompetence extends Item {
|
||||
|
||||
/* -------------------------------------------- */
|
||||
static triVisible(competences) {
|
||||
return competences.filter(it => !it.system.isHidden)
|
||||
.sort((a, b) => RdDItemCompetence.compare(a, b))
|
||||
return competences
|
||||
? competences.filter(it => !it.system.isHidden).sort((a, b) => RdDItemCompetence.compare(a, b))
|
||||
: []
|
||||
}
|
||||
|
||||
static $positionTri(comp) {
|
||||
|
@ -8,6 +8,7 @@ import { SystemCompendiums } from "./settings/system-compendiums.js";
|
||||
import { RdDRaretes } from "./item/raretes.js";
|
||||
import { CATEGORIES_COMPETENCES } from "./item-competence.js";
|
||||
import { CATEGORIES_COMPETENCES_CREATURES } from "./item-competencecreature.js";
|
||||
import { BASE_CORPS_A_CORPS, BASE_ESQUIVE } from "./item/base-items.js";
|
||||
|
||||
export const ACTOR_TYPES = {
|
||||
personnage: 'personnage',
|
||||
@ -244,13 +245,13 @@ export class RdDItem extends Item {
|
||||
isEsquive() {
|
||||
return (this.isCompetence()
|
||||
&& this.system.categorie == 'melee'
|
||||
&& Grammar.includesLowerCaseNoAccent(this.name, 'Esquive'));
|
||||
&& Grammar.includesLowerCaseNoAccent(this.name, BASE_ESQUIVE.name));
|
||||
}
|
||||
|
||||
isCorpsACorps() {
|
||||
return this.isCompetence()
|
||||
&& this.system.categorie == 'melee'
|
||||
&& Grammar.includesLowerCaseNoAccent(this.name, 'Corps à Corps')
|
||||
&& Grammar.includesLowerCaseNoAccent(this.name, BASE_CORPS_A_CORPS.name)
|
||||
}
|
||||
|
||||
isCompetenceArme() {
|
||||
@ -602,7 +603,7 @@ export class RdDItem extends Item {
|
||||
if (!other || !this.isInventaire()) {
|
||||
return [false, undefined];
|
||||
}
|
||||
if (this.isConteneur()){
|
||||
if (this.isConteneur()) {
|
||||
return [false, `Impossible de regrouper des conteneurs, ils ne sont pas empilables`];
|
||||
}
|
||||
if (this.system.quantite == undefined) {
|
||||
|
20
module/item/base-items.js
Normal file
20
module/item/base-items.js
Normal file
@ -0,0 +1,20 @@
|
||||
export const POSSESSION_SANS_DRACONIC = { name: 'Sans draconic', type: 'competence', system: { niveau: 0, defaut_carac: "reve-actuel", }, img: 'systems/foundryvtt-reve-de-dragon/icons/entites/possession.webp' }
|
||||
export const PAS_DE_DRACONIC = { name: 'Pas de draconic', type: 'competence', system: { niveau: -11, defaut_carac: "reve" }, img: 'systems/foundryvtt-reve-de-dragon/icons/entites/possession.webp' }
|
||||
export const BASE_CORPS_A_CORPS = { name: 'Corps à Corps', type: 'competence', system: { niveau: -6, defaut_carac: "melee" }, img: 'systems/foundryvtt-reve-de-dragon/icons/competence_corps_a_corps.webp' }
|
||||
export const BASE_ESQUIVE = { name: 'Esquive', type: 'competence', system: { niveau: -6, defaut_carac: "derobee" }, img: 'systems/foundryvtt-reve-de-dragon/icons/competence_esquive.webp' }
|
||||
|
||||
export const SANS_COMPETENCE = {
|
||||
name: "Sans compétence",
|
||||
type: 'competence',
|
||||
system: {
|
||||
niveau: 0,
|
||||
default_diffLibre: 0,
|
||||
base: 0,
|
||||
categorie: "Aucune",
|
||||
description: "",
|
||||
descriptionmj: "",
|
||||
defaut_carac: "",
|
||||
},
|
||||
img: "systems/foundryvtt-reve-de-dragon/icons/templates/icone_parchement_vierge.webp"
|
||||
}
|
||||
|
@ -22,7 +22,7 @@ export class Misc {
|
||||
const isPositiveNumber = value != NaN && value > 0;
|
||||
return isPositiveNumber ? "+" + number : number
|
||||
}
|
||||
|
||||
|
||||
static modulo(n, m) {
|
||||
return ((n % m) + m) % m;
|
||||
}
|
||||
@ -165,7 +165,7 @@ export class Misc {
|
||||
static firstConnectedGM() {
|
||||
if (foundry.utils.isNewerVersion(game.release.version, '12.0')) {
|
||||
return game.users.activeGM
|
||||
}
|
||||
}
|
||||
return game.users.find(u => u.isGM && u.active);
|
||||
}
|
||||
|
||||
@ -197,7 +197,7 @@ export class Misc {
|
||||
}
|
||||
|
||||
static isFirstOwnerPlayer(document) {
|
||||
if (!document.testUserPermission){
|
||||
if (!document.testUserPermission) {
|
||||
return false
|
||||
}
|
||||
return game.users.find(u => document.testUserPermission(u, CONST.DOCUMENT_OWNERSHIP_LEVELS.OWNER)) == game.user
|
||||
@ -231,7 +231,7 @@ export class Misc {
|
||||
preFilter: it => true,
|
||||
description: 'valeur',
|
||||
onMessage: m => ui.notifications.info(m)
|
||||
}, options);
|
||||
}, options, { overwrite: true, inplace: false });
|
||||
|
||||
const subset = this.findAllLike(value, elements, options);
|
||||
if (subset.length == 0) {
|
||||
|
@ -228,16 +228,19 @@ export class RdDCombatManager extends Combat {
|
||||
static $prepareAttaqueArme(infoAttaque) {
|
||||
const comp = infoAttaque.competences.find(it => Grammar.equalsInsensitive(it.name, infoAttaque.competence))
|
||||
const arme = infoAttaque.arme;
|
||||
const attaque = foundry.utils.duplicate(arme);
|
||||
const attaque = foundry.utils.duplicate(arme)
|
||||
|
||||
const carac = comp?.system.defaut_carac ?? (infoAttaque.infoMain == '(lancer)' ? 'lancer' : infoAttaque.infoMain == '(lancer)' ? 'tir' : 'melee')
|
||||
const niveau = comp?.system.niveau ?? (infoAttaque.infoMain == '(lancer)' ? -8 : -6)
|
||||
attaque.action = 'attaque';
|
||||
attaque.system.competence = infoAttaque.competence;
|
||||
attaque.system.dommagesReels = infoAttaque.dommagesReel;
|
||||
attaque.system.infoMain = infoAttaque.infoMain;
|
||||
attaque.system.niveau = comp.system.niveau;
|
||||
attaque.system.niveau = niveau
|
||||
|
||||
const ajustement = (arme?.parent?.getEtatGeneral() ?? 0) + (arme?.system.magique) ? arme.system.ecaille_efficacite : 0;
|
||||
attaque.system.initiative = RdDCombatManager.calculInitiative(comp.system.niveau, infoAttaque.carac[comp.system.defaut_carac].value, ajustement);
|
||||
return attaque;
|
||||
const ajustement = (arme.parent?.getEtatGeneral() ?? 0) + (arme.system.magique) ? arme.system.ecaille_efficacite : 0
|
||||
attaque.system.initiative = RdDCombatManager.calculInitiative(niveau, infoAttaque.carac[carac].value, ajustement)
|
||||
return attaque
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
|
@ -176,7 +176,7 @@ export class RdDTMRDialog extends Dialog {
|
||||
}
|
||||
|
||||
bringSubDialogToTop() {
|
||||
if (this.subdialog?.bringToTop && this.subdialog?.element[0]) {
|
||||
if (this.subdialog?.bringToTop && this.subdialog?.element && this.subdialog?.element[0]) {
|
||||
this.subdialog.bringToTop();
|
||||
}
|
||||
}
|
||||
@ -241,10 +241,11 @@ export class RdDTMRDialog extends Dialog {
|
||||
this._getTokensRencontres().forEach(t => this._trackToken(t))
|
||||
this._getTokensSortsReserve().forEach(t => this._trackToken(t))
|
||||
}
|
||||
|
||||
|
||||
/* -------------------------------------------- */
|
||||
updateTokens() {
|
||||
this._removeTokens(t => true);
|
||||
this.allTokens = []
|
||||
this.loadRencontres();
|
||||
this.loadCasesSpeciales();
|
||||
this._createTokens();
|
||||
@ -1133,6 +1134,14 @@ export class RdDTMRDialog extends Dialog {
|
||||
return tmr;
|
||||
}
|
||||
|
||||
getTokensDetails(coordTMR) {
|
||||
const tmrTooltip = `${coordTMR}: ${TMRUtility.getTMRLabel(coordTMR)}`
|
||||
const tokenTooltips = this.allTokens
|
||||
.filter(token => token.coordTMR() == coordTMR)
|
||||
.map(token => token.tooltip);
|
||||
return [tmrTooltip, ...tokenTooltips].reduce(Misc.joining('\n'))
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
_removeTokens(filter = it => true) {
|
||||
this.allTokens.filter(filter).forEach(token => this.pixiTMR.removeToken(token))
|
||||
@ -1144,7 +1153,7 @@ export class RdDTMRDialog extends Dialog {
|
||||
return
|
||||
}
|
||||
if (this.demiReve === token && this.isDemiReveCache()) {
|
||||
return;
|
||||
return
|
||||
}
|
||||
this.pixiTMR.positionToken(token);
|
||||
if (!this.allTokens.includes(token)) {
|
||||
|
@ -261,8 +261,25 @@ export class RdDUtility {
|
||||
'systems/foundryvtt-reve-de-dragon/templates/chat-fabriquer-potion-base.html',
|
||||
'systems/foundryvtt-reve-de-dragon/templates/chat-signe-draconique-actor.html'
|
||||
];
|
||||
|
||||
// foundry et options
|
||||
Handlebars.registerHelper('RDD_CONFIG', path => RDD_CONFIG[path])
|
||||
Handlebars.registerHelper('linkCompendium', (pack, id, name) => RdDUtility.linkCompendium(pack, id, name));
|
||||
Handlebars.registerHelper('regle-optionnelle', (option) => ReglesOptionnelles.isUsing(option));
|
||||
|
||||
Handlebars.registerHelper('plusMoins', diff => (diff > 0 ? '+' : '') + Math.round(diff))
|
||||
|
||||
// Handle v12 removal of this helper
|
||||
Handlebars.registerHelper('select', function (selected, options) {
|
||||
const escapedValue = RegExp.escape(Handlebars.escapeExpression(selected));
|
||||
const rgx = new RegExp(' value=[\"\']' + escapedValue + '[\"\']');
|
||||
const html = options.fn(this);
|
||||
return html.replace(rgx, "$& selected");
|
||||
})
|
||||
|
||||
// logic
|
||||
Handlebars.registerHelper('either', (a, b) => a ?? b);
|
||||
// string manipulation
|
||||
Handlebars.registerHelper('upperFirst', str => Misc.upperFirst(str ?? 'Null'));
|
||||
Handlebars.registerHelper('lowerFirst', str => Misc.lowerFirst(str ?? 'Null'));
|
||||
Handlebars.registerHelper('uppercase', str => str?.toUpperCase() ?? '');
|
||||
@ -271,48 +288,53 @@ export class RdDUtility {
|
||||
Handlebars.registerHelper('grammar-apostrophe', (article, str) => Grammar.apostrophe(article, str));
|
||||
Handlebars.registerHelper('grammar-un', str => Grammar.articleIndetermine(str));
|
||||
Handlebars.registerHelper('grammar-accord', (genre, ...args) => Grammar.accord(genre, args));
|
||||
|
||||
Handlebars.registerHelper('RDD_CONFIG', path => RDD_CONFIG[path])
|
||||
|
||||
// math
|
||||
Handlebars.registerHelper('min', (...args) => Math.min(...args.slice(0, -1)));
|
||||
Handlebars.registerHelper('repeat', function(n, block) {
|
||||
let accum = '';
|
||||
for(let i = 0; i < n; ++i){
|
||||
accum += block.fn(i)
|
||||
}
|
||||
return accum
|
||||
})
|
||||
|
||||
// tableaux, listes
|
||||
Handlebars.registerHelper('array-includes', (array, value) => array.includes(value));
|
||||
Handlebars.registerHelper('isLastIndex', (index, list) => index + 1 >= list.length);
|
||||
Handlebars.registerHelper('trier', list => list.sort((a, b) => a.name.localeCompare(b.name)));
|
||||
|
||||
// table de résolution
|
||||
Handlebars.registerHelper('computeResolutionScore', (row, col) => RdDResolutionTable.computePercentage(row, col));
|
||||
Handlebars.registerHelper('computeResolutionChances', (row, col) => RdDResolutionTable.computeChances(row, col));
|
||||
Handlebars.registerHelper('buildLigneInventaire', (item, options) => { return new Handlebars.SafeString(RdDUtility.buildLigneInventaire(item, options)); });
|
||||
Handlebars.registerHelper('buildInventaireConteneur', (actorId, itemId, options) => { return new Handlebars.SafeString(RdDUtility.buildInventaireConteneur(actorId, itemId, options)); });
|
||||
Handlebars.registerHelper('buildContenuConteneur', (item, options) => { return new Handlebars.SafeString(RdDUtility.buildContenuConteneur(item, options)); });
|
||||
Handlebars.registerHelper('calculerPrixCommercant', item => item.calculerPrixCommercant());
|
||||
Handlebars.registerHelper('caseTmr-label', coord => TMRUtility.getTMRLabel(coord));
|
||||
Handlebars.registerHelper('caseTmr-type', coord => TMRUtility.getTMRType(coord));
|
||||
Handlebars.registerHelper('typeTmr-name', type => TMRUtility.typeTmrName(type));
|
||||
Handlebars.registerHelper('effetRencontre-name', coord => TMRUtility.typeTmrName(coord));
|
||||
|
||||
// gestion des dates et heures
|
||||
Handlebars.registerHelper('timestamp-imgSigneHeure', (heure) => { return new Handlebars.SafeString(RdDTimestamp.imgSigneHeure(heure)) });
|
||||
Handlebars.registerHelper('timestamp-imgSigne', (heure) => { return new Handlebars.SafeString(RdDTimestamp.imgSigne(heure)) });
|
||||
Handlebars.registerHelper('timestamp-extract', timestamp => new RdDTimestamp(timestamp).toCalendrier());
|
||||
Handlebars.registerHelper('timestamp-formulesDuree', () => RdDTimestamp.formulesDuree());
|
||||
Handlebars.registerHelper('timestamp-formulesPeriode', () => RdDTimestamp.formulesPeriode());
|
||||
|
||||
|
||||
// informations sur les acteurs
|
||||
Handlebars.registerHelper('actor-default', (actorType, ...path) => RdDBaseActor.getDefaultValue(actorType, path.slice(0, -1)));
|
||||
|
||||
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));
|
||||
Handlebars.registerHelper('linkCompendium', (pack, id, name) => RdDUtility.linkCompendium(pack, id, name));
|
||||
Handlebars.registerHelper('experienceLog-topic', topic => ExperienceLog.labelTopic(topic));
|
||||
|
||||
// inventaire et marchands
|
||||
Handlebars.registerHelper('buildLigneInventaire', (item, options) => { return new Handlebars.SafeString(RdDUtility.buildLigneInventaire(item, options)); });
|
||||
Handlebars.registerHelper('buildInventaireConteneur', (actorId, itemId, options) => { return new Handlebars.SafeString(RdDUtility.buildInventaireConteneur(actorId, itemId, options)); });
|
||||
Handlebars.registerHelper('buildContenuConteneur', (item, options) => { return new Handlebars.SafeString(RdDUtility.buildContenuConteneur(item, options)); });
|
||||
Handlebars.registerHelper('calculerPrixCommercant', item => item.calculerPrixCommercant());
|
||||
Handlebars.registerHelper('uniteQuantite', (itemId, actorId) => RdDUtility.getItem(itemId, actorId)?.getUniteQuantite());
|
||||
Handlebars.registerHelper('isFieldInventaireModifiable', (type, field) => RdDItem.isFieldInventaireModifiable(type, field));
|
||||
// Items
|
||||
Handlebars.registerHelper('rarete-getChamp', (rarete, field) => RdDRaretes.getChamp(rarete, field));
|
||||
|
||||
Handlebars.registerHelper('plusMoins', diff => (diff > 0 ? '+' : '') + Math.round(diff))
|
||||
Handlebars.registerHelper('experienceLog-topic', topic => ExperienceLog.labelTopic(topic));
|
||||
|
||||
// Handle v12 removal of this helper
|
||||
Handlebars.registerHelper('select', function (selected, options) {
|
||||
const escapedValue = RegExp.escape(Handlebars.escapeExpression(selected));
|
||||
const rgx = new RegExp(' value=[\"\']' + escapedValue + '[\"\']');
|
||||
const html = options.fn(this);
|
||||
return html.replace(rgx, "$& selected");
|
||||
});
|
||||
|
||||
// TMRs
|
||||
Handlebars.registerHelper('caseTmr-label', coord => TMRUtility.getTMRLabel(coord));
|
||||
Handlebars.registerHelper('caseTmr-type', coord => TMRUtility.getTMRType(coord));
|
||||
Handlebars.registerHelper('typeTmr-name', type => TMRUtility.typeTmrName(type));
|
||||
Handlebars.registerHelper('effetRencontre-name', coord => TMRUtility.typeTmrName(coord));
|
||||
|
||||
return loadTemplates(templatePaths);
|
||||
}
|
||||
|
@ -15,6 +15,7 @@ export class CarteTmr extends Draconique {
|
||||
name: 'Carte des TMR',
|
||||
hint: "Choix de l'image de la carte des TMR",
|
||||
scope: "client",
|
||||
requiresReload: true,
|
||||
config: true,
|
||||
choices: {
|
||||
[TMR_V3_COULEUR]: "TMR Scriptarium v3 couleur",
|
||||
|
@ -184,12 +184,9 @@ export class PixiTMR {
|
||||
const coordTMR = TMRUtility.oddqToCoordTMR(oddq);
|
||||
const tmr = TMRUtility.getTMR(coordTMR)
|
||||
if (tmr) {
|
||||
const tmrTooltip = `${coordTMR}: ${TMRUtility.getTMRLabel(coordTMR)}`;
|
||||
const tokenTooltips = this.tmrDialog.allTokens
|
||||
.filter(token => token.coordTMR() == coordTMR)
|
||||
.map(token => token.tooltip);
|
||||
return [tmrTooltip, ...tokenTooltips].reduce(Misc.joining('\n'))
|
||||
return this.tmrDialog.getTokensDetails(coordTMR)
|
||||
}
|
||||
return undefined
|
||||
}
|
||||
|
||||
computeEventOddq(event) {
|
||||
|
@ -3,147 +3,7 @@ name: Coursier de Psark
|
||||
type: creature
|
||||
sort: 100001
|
||||
img: systems/foundryvtt-reve-de-dragon/icons/invocations/coursier-psark.webp
|
||||
items:
|
||||
- _id: shsUV8UpU18c0RJK
|
||||
name: Course
|
||||
type: competencecreature
|
||||
sort: 500000
|
||||
img: systems/foundryvtt-reve-de-dragon/icons/competence_course.webp
|
||||
effects: []
|
||||
system:
|
||||
description: ''
|
||||
descriptionmj: ''
|
||||
carac_value: 0
|
||||
niveau: 0
|
||||
default_diffLibre: 0
|
||||
categorie: generale
|
||||
categorie_parade: ''
|
||||
iscombat: false
|
||||
isnaturelle: true
|
||||
ispossession: false
|
||||
dommages: 0
|
||||
mortalite: mortel
|
||||
isparade: false
|
||||
folder: null
|
||||
ownership:
|
||||
default: 0
|
||||
_stats:
|
||||
systemId: foundryvtt-reve-de-dragon
|
||||
systemVersion: 12.0.22
|
||||
coreVersion: '12.331'
|
||||
_key: '!actors.items!I0Ogzl5rUmFcMhyH.shsUV8UpU18c0RJK'
|
||||
- _id: CYpxxf1uTa78NWR9
|
||||
name: Esquive
|
||||
type: competencecreature
|
||||
sort: 1000000
|
||||
img: systems/foundryvtt-reve-de-dragon/icons/competence_esquive.webp
|
||||
effects: []
|
||||
system:
|
||||
description: ''
|
||||
descriptionmj: ''
|
||||
carac_value: 0
|
||||
niveau: 0
|
||||
default_diffLibre: 0
|
||||
categorie: ''
|
||||
categorie_parade: ''
|
||||
iscombat: false
|
||||
isnaturelle: true
|
||||
ispossession: false
|
||||
dommages: 0
|
||||
mortalite: mortel
|
||||
isparade: false
|
||||
folder: null
|
||||
ownership:
|
||||
default: 0
|
||||
_stats:
|
||||
systemId: foundryvtt-reve-de-dragon
|
||||
systemVersion: 12.0.22
|
||||
coreVersion: '12.331'
|
||||
_key: '!actors.items!I0Ogzl5rUmFcMhyH.CYpxxf1uTa78NWR9'
|
||||
- _id: 0zRL8bOpCXNQnIR4
|
||||
name: Ruade
|
||||
type: competencecreature
|
||||
sort: 2200000
|
||||
img: systems/foundryvtt-reve-de-dragon/icons/compcreature-pietinement.webp
|
||||
effects: []
|
||||
system:
|
||||
description: null
|
||||
descriptionmj: ''
|
||||
carac_value: 0
|
||||
niveau: 0
|
||||
default_diffLibre: 0
|
||||
categorie: ''
|
||||
categorie_parade: ''
|
||||
iscombat: true
|
||||
isnaturelle: true
|
||||
ispossession: false
|
||||
dommages: 4
|
||||
mortalite: mortel
|
||||
isparade: false
|
||||
folder: null
|
||||
ownership:
|
||||
default: 0
|
||||
_stats:
|
||||
systemId: foundryvtt-reve-de-dragon
|
||||
systemVersion: 12.0.22
|
||||
coreVersion: '12.331'
|
||||
_key: '!actors.items!I0Ogzl5rUmFcMhyH.0zRL8bOpCXNQnIR4'
|
||||
- _id: yBUVTjTXYfwvzusb
|
||||
name: Saut
|
||||
type: competencecreature
|
||||
sort: 2300000
|
||||
img: systems/foundryvtt-reve-de-dragon/icons/competence_saut.webp
|
||||
effects: []
|
||||
system:
|
||||
description: ''
|
||||
descriptionmj: ''
|
||||
carac_value: 0
|
||||
niveau: 0
|
||||
default_diffLibre: 0
|
||||
categorie: ''
|
||||
categorie_parade: ''
|
||||
iscombat: false
|
||||
isnaturelle: true
|
||||
ispossession: false
|
||||
dommages: 0
|
||||
mortalite: mortel
|
||||
isparade: false
|
||||
folder: null
|
||||
ownership:
|
||||
default: 0
|
||||
_stats:
|
||||
systemId: foundryvtt-reve-de-dragon
|
||||
systemVersion: 12.0.22
|
||||
coreVersion: '12.331'
|
||||
_key: '!actors.items!I0Ogzl5rUmFcMhyH.yBUVTjTXYfwvzusb'
|
||||
- _id: lzEdMrKXbOYrWG5S
|
||||
name: Vigilance
|
||||
type: competencecreature
|
||||
sort: 2600000
|
||||
img: systems/foundryvtt-reve-de-dragon/icons/competence_vigilance.webp
|
||||
effects: []
|
||||
system:
|
||||
description: ''
|
||||
descriptionmj: ''
|
||||
carac_value: 0
|
||||
niveau: 0
|
||||
default_diffLibre: 0
|
||||
categorie: ''
|
||||
categorie_parade: ''
|
||||
iscombat: false
|
||||
isnaturelle: true
|
||||
ispossession: false
|
||||
dommages: 0
|
||||
mortalite: mortel
|
||||
isparade: false
|
||||
folder: null
|
||||
ownership:
|
||||
default: 0
|
||||
_stats:
|
||||
systemId: foundryvtt-reve-de-dragon
|
||||
systemVersion: 12.0.22
|
||||
coreVersion: '12.331'
|
||||
_key: '!actors.items!I0Ogzl5rUmFcMhyH.lzEdMrKXbOYrWG5S'
|
||||
items: []
|
||||
effects: []
|
||||
system:
|
||||
carac:
|
||||
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -5,10 +5,11 @@ img: systems/foundryvtt-reve-de-dragon/icons/competence_hypnos.webp
|
||||
effects: []
|
||||
system:
|
||||
description: >-
|
||||
<p>@JournalEntry[vid6uJc66QFgHSUr]{Note sur les invocations de
|
||||
créatures}</p>
|
||||
<p>@UUID[Compendium.foundryvtt-reve-de-dragon.rappel-des-regles.JournalEntry.GRKYbbNDIHdzVNaj.JournalEntryPage.PiKGAswCiDPtmAol]{Note
|
||||
sur les invocations de créatures}</p>
|
||||
|
||||
<p>Les coursiers de Psark apparaissent toujours au nombre de sept. Ce sont
|
||||
<p>Les @UUID[Compendium.foundryvtt-reve-de-dragon.invocations.Actor.I0Ogzl5rUmFcMhyH]{coursiers de Psark}
|
||||
apparaissent toujours au nombre de sept. Ce sont
|
||||
de grands chevaux blancs à crinière blond doré, se présentant sans selle ni
|
||||
bride. Ils n’ont pas de caractéristiques, mais leur utilisation obéit aux
|
||||
règles suivantes :</p>
|
||||
@ -61,8 +62,8 @@ system:
|
||||
|
||||
</ul>
|
||||
|
||||
<p>@JournalEntry[R3q4vUTEfyxYgmGr]{Communication avec les créatures
|
||||
invoquées}</p>
|
||||
<p>@UUID[Compendium.foundryvtt-reve-de-dragon.rappel-des-regles.JournalEntry.3wVxF2IRf3c1lOxC.JournalEntryPage.GLzfQkCfkbnxBX8A]{Communication
|
||||
avec les créatures invoquées}</p>
|
||||
descriptionmj: ''
|
||||
draconic: Voie d'Hypnos
|
||||
duree: Tâche ou fin HN
|
||||
|
@ -5,10 +5,11 @@ img: systems/foundryvtt-reve-de-dragon/icons/competence_hypnos.webp
|
||||
effects: []
|
||||
system:
|
||||
description: >-
|
||||
<p>@JournalEntry[vid6uJc66QFgHSUr]{Note sur les invocations de
|
||||
créatures}</p>
|
||||
<p>@UUID[Compendium.foundryvtt-reve-de-dragon.rappel-des-regles.JournalEntry.GRKYbbNDIHdzVNaj.JournalEntryPage.PiKGAswCiDPtmAol]{Note
|
||||
sur les invocations de créatures}</p>
|
||||
|
||||
<p>Le Guerrier Sorde a l’apparence d’un humanoïde entièrement revêtu d’une
|
||||
<p>Le @UUID[Compendium.foundryvtt-reve-de-dragon.invocations.Actor.xGtM3z3KM6N6lpd5]{Guerrier Sorde}
|
||||
a l’apparence d’un humanoïde entièrement revêtu d’une
|
||||
armure de plaques, visière du heaume toujours baissée, dissimulant son
|
||||
visage. Il est armé d’une épée sorde, d’un bouclier moyen et d’une dague. La
|
||||
seule tâche que l’on puisse lui demander est de faire usage de ses armes.
|
||||
@ -29,8 +30,8 @@ system:
|
||||
suggestions et illusions d’Hypnos, avec un JR standard r-8, ainsi que par
|
||||
les sorts individuels de Thananatos.</p>
|
||||
|
||||
<p>@JournalEntry[R3q4vUTEfyxYgmGr]{Communication avec les créatures
|
||||
invoquées}</p>
|
||||
<p>@UUID[Compendium.foundryvtt-reve-de-dragon.rappel-des-regles.JournalEntry.3wVxF2IRf3c1lOxC.JournalEntryPage.GLzfQkCfkbnxBX8A]{Communication
|
||||
avec les créatures invoquées}</p>
|
||||
descriptionmj: ''
|
||||
draconic: Voie d'Hypnos
|
||||
duree: Tâche
|
||||
|
@ -5,10 +5,11 @@ img: systems/foundryvtt-reve-de-dragon/icons/competence_hypnos.webp
|
||||
effects: []
|
||||
system:
|
||||
description: >-
|
||||
<p>@JournalEntry[vid6uJc66QFgHSUr]{Note sur les invocations de
|
||||
créatures}</p>
|
||||
<p>@UUID[Compendium.foundryvtt-reve-de-dragon.rappel-des-regles.JournalEntry.GRKYbbNDIHdzVNaj.JournalEntryPage.PiKGAswCiDPtmAol]{Note
|
||||
sur les invocations de créatures}</p>
|
||||
|
||||
<p>Le Guerrier Turme a l’apparence d’un Humain vêtu de cuir souple, armé
|
||||
<p>Le @UUID[Compendium.foundryvtt-reve-de-dragon.invocations.Actor.z87rV5CJ3inc6ZPc]{Guerrier Turme}
|
||||
a l’apparence d’un Humain vêtu de cuir souple, armé
|
||||
d’une unique dague, et porteur d’un cor. Ses traits physiques sont sans
|
||||
importance, blond ou brun, laid ou beau, homme ou femme. La seule tâche
|
||||
qu’il puisse accomplir est de veiller sur le sommeil du haut-rêvant. Il n’y
|
||||
@ -24,8 +25,8 @@ system:
|
||||
Guerriers Turmes ont tous les mêmes caractéristiques et sont affectés par
|
||||
les sorts comme les Guerriers Sordes.</p>
|
||||
|
||||
<p>@JournalEntry[R3q4vUTEfyxYgmGr]{Communication avec les créatures
|
||||
invoquées}</p>
|
||||
<p>@UUID[Compendium.foundryvtt-reve-de-dragon.rappel-des-regles.JournalEntry.3wVxF2IRf3c1lOxC.JournalEntryPage.GLzfQkCfkbnxBX8A]{Communication
|
||||
avec les créatures invoquées}</p>
|
||||
descriptionmj: ''
|
||||
draconic: Voie d'Hypnos
|
||||
duree: Tâche
|
||||
|
@ -5,10 +5,11 @@ img: systems/foundryvtt-reve-de-dragon/icons/competence_hypnos.webp
|
||||
effects: []
|
||||
system:
|
||||
description: >-
|
||||
<p>@JournalEntry[vid6uJc66QFgHSUr]{Note sur les invocations de
|
||||
créatures}</p>
|
||||
<p>@UUID[Compendium.foundryvtt-reve-de-dragon.rappel-des-regles.JournalEntry.GRKYbbNDIHdzVNaj.JournalEntryPage.PiKGAswCiDPtmAol]{Note
|
||||
sur les invocations de créatures}</p>
|
||||
|
||||
<p>Le Kanaillou est un petit être pouvant se présenter sous de multiples
|
||||
<p>Le @UUID[Compendium.foundryvtt-reve-de-dragon.invocations.Actor.I8Q3Aj4ZUrsU4yBg]{Kanaillou}
|
||||
est un petit être pouvant se présenter sous de multiples
|
||||
apparences : humanoïde masculin ou féminin, créature d’apparence bizarre et
|
||||
fantasque. Cette apparence est chaque fois laissée aux soins du gardien des
|
||||
rêves et n’a aucune importance réelle. Le Kanaillou est extrêmement
|
||||
@ -46,8 +47,8 @@ system:
|
||||
gratuit. Ce n’est pas pour rien que cette invocation est plus facile que les
|
||||
autres : la véritable difficulté commence une fois qu’elle est lancée.</p>
|
||||
|
||||
<p>@JournalEntry[R3q4vUTEfyxYgmGr]{Communication avec les créatures
|
||||
invoquées}</p>
|
||||
<p>@UUID[Compendium.foundryvtt-reve-de-dragon.rappel-des-regles.JournalEntry.3wVxF2IRf3c1lOxC.JournalEntryPage.GLzfQkCfkbnxBX8A]{Communication
|
||||
avec les créatures invoquées}</p>
|
||||
descriptionmj: ''
|
||||
draconic: Voie d'Hypnos
|
||||
duree: Tâche
|
||||
|
@ -5,8 +5,8 @@ img: systems/foundryvtt-reve-de-dragon/icons/competence_hypnos.webp
|
||||
effects: []
|
||||
system:
|
||||
description: >-
|
||||
<p>@JournalEntry[vid6uJc66QFgHSUr]{Note sur les invocations de
|
||||
créatures}</p>
|
||||
<p>@UUID[Compendium.foundryvtt-reve-de-dragon.rappel-des-regles.JournalEntry.GRKYbbNDIHdzVNaj.JournalEntryPage.PiKGAswCiDPtmAol]{Note
|
||||
sur les invocations de créatures}</p>
|
||||
|
||||
<p>Trois marmitons apparaissent, chargés d’un panier contenant nappe et
|
||||
luxueuse vaisselle, d’un grand plat recouvert d’une cloche, et d’une
|
||||
@ -14,7 +14,8 @@ system:
|
||||
soulève la cloche du plat et en annonce fièrement l’intitulé, tandis que le
|
||||
troisième présente la boisson.</p>
|
||||
|
||||
<p>Les Marmitons de Pavois dressent toujours le couvert pour sept convives,
|
||||
<p>Les @UUID[Compendium.foundryvtt-reve-de-dragon.invocations.Actor.kB7OSWKvd6m9v0dB]{Marmitons de Pavois}
|
||||
dressent toujours le couvert pour sept convives,
|
||||
et à raison de 3 points par personne, le plat contient 21 points de
|
||||
sustentation. Aux convives de se les partager selon leur propre nombre. La
|
||||
bonbonne contient pareillement 21 mesures.</p>
|
||||
@ -39,8 +40,8 @@ system:
|
||||
sufit à les faire se dématérialiser instantanément. La différence alors est
|
||||
que même la nourriture ingérée disparaît des estomacs.</p>
|
||||
|
||||
<p>@JournalEntry[R3q4vUTEfyxYgmGr]{Communication avec les créatures
|
||||
invoquées}</p>
|
||||
<p>@UUID[Compendium.foundryvtt-reve-de-dragon.rappel-des-regles.JournalEntry.3wVxF2IRf3c1lOxC.JournalEntryPage.GLzfQkCfkbnxBX8A]{Communication
|
||||
avec les créatures invoquées}</p>
|
||||
descriptionmj: ''
|
||||
draconic: Voie d'Hypnos
|
||||
duree: Tâche
|
||||
|
@ -5,11 +5,12 @@ img: systems/foundryvtt-reve-de-dragon/icons/competence_hypnos.webp
|
||||
effects: []
|
||||
system:
|
||||
description: >-
|
||||
<p>@JournalEntry[vid6uJc66QFgHSUr]{Note sur les invocations de
|
||||
créatures}</p>
|
||||
<p>@UUID[Compendium.foundryvtt-reve-de-dragon.rappel-des-regles.JournalEntry.GRKYbbNDIHdzVNaj.JournalEntryPage.PiKGAswCiDPtmAol]{Note
|
||||
sur les invocations de créatures}</p>
|
||||
|
||||
<p>Le Nonechalepasse a la même apparence physique et le même armement que le
|
||||
Guerrier Sorde. C’est en fait une variante de ce dernier. Il est invoqué
|
||||
@UUID[Compendium.foundryvtt-reve-de-dragon.invocations.Actor.xGtM3z3KM6N6lpd5]{Guerrier Sorde}.
|
||||
C’est en fait une variante de ce dernier. Il est invoqué
|
||||
pour garder ou veiller sur quelque chose : une porte, un coffre, un pont,
|
||||
etc. L’ayant invoqué, le haut-rêvant doit lui indiquer expressément sur quoi
|
||||
il doit veiller, et le Nonechalepasse ne laissera personne d’autre que
|
||||
@ -23,8 +24,8 @@ system:
|
||||
tous les mêmes caractéristiques que les Guerriers Sordes et sont comme eux
|
||||
affectés par les sorts.</p>
|
||||
|
||||
<p>@JournalEntry[R3q4vUTEfyxYgmGr]{Communication avec les créatures
|
||||
invoquées}</p>
|
||||
<p>@UUID[Compendium.foundryvtt-reve-de-dragon.rappel-des-regles.JournalEntry.3wVxF2IRf3c1lOxC.JournalEntryPage.GLzfQkCfkbnxBX8A]{Communication
|
||||
avec les créatures invoquées}</p>
|
||||
descriptionmj: ''
|
||||
draconic: Voie d'Hypnos
|
||||
duree: Tâche
|
||||
|
@ -5,8 +5,8 @@ img: systems/foundryvtt-reve-de-dragon/icons/competence_hypnos.webp
|
||||
effects: []
|
||||
system:
|
||||
description: >-
|
||||
<p>@JournalEntry[vid6uJc66QFgHSUr]{Note sur les invocations de
|
||||
créatures}</p>
|
||||
<p>@UUID[Compendium.foundryvtt-reve-de-dragon.rappel-des-regles.JournalEntry.GRKYbbNDIHdzVNaj.JournalEntryPage.PiKGAswCiDPtmAol]{Note
|
||||
sur les invocations de créatures}</p>
|
||||
|
||||
<p>Trois artisans agiles et vigoureux apparaissent, chargés de toile, de
|
||||
cordages et d’un mât télescopique. L’ensemble est destiné à dresser un petit
|
||||
@ -27,8 +27,8 @@ system:
|
||||
<p>Le chapiteau est imperméable et résiste à de fortes bourrasques. Une
|
||||
tempête véritable peut par contre être considérée comme une agression.</p>
|
||||
|
||||
<p>@JournalEntry[R3q4vUTEfyxYgmGr]{Communication avec les créatures
|
||||
invoquées}</p>
|
||||
<p>@UUID[Compendium.foundryvtt-reve-de-dragon.rappel-des-regles.JournalEntry.3wVxF2IRf3c1lOxC.JournalEntryPage.GLzfQkCfkbnxBX8A]{Communication
|
||||
avec les créatures invoquées}</p>
|
||||
descriptionmj: ''
|
||||
draconic: Voie d'Hypnos
|
||||
duree: HN
|
||||
|
@ -5,8 +5,8 @@ img: systems/foundryvtt-reve-de-dragon/icons/competence_hypnos.webp
|
||||
effects: []
|
||||
system:
|
||||
description: >-
|
||||
<p>@JournalEntry[vid6uJc66QFgHSUr]{Note sur les invocations de
|
||||
créatures}</p>
|
||||
<p>@UUID[Compendium.foundryvtt-reve-de-dragon.rappel-des-regles.JournalEntry.GRKYbbNDIHdzVNaj.JournalEntryPage.PiKGAswCiDPtmAol]{Note
|
||||
sur les invocations de créatures}</p>
|
||||
|
||||
<p>Le Secouriste blanc ne peut être invoqué que pendant un combat ou au
|
||||
terme de celui-ci. Sa tâche consiste à prendre les blessés en charge,
|
||||
@ -82,8 +82,8 @@ system:
|
||||
<p>Le Secouriste disparaît dès que le combat est terminé ET que tous les
|
||||
blessés ont été soignés.</p>
|
||||
|
||||
<p>@JournalEntry[R3q4vUTEfyxYgmGr]{Communication avec les créatures
|
||||
invoquées}</p>
|
||||
<p>@UUID[Compendium.foundryvtt-reve-de-dragon.rappel-des-regles.JournalEntry.3wVxF2IRf3c1lOxC.JournalEntryPage.GLzfQkCfkbnxBX8A]{Communication
|
||||
avec les créatures invoquées}</p>
|
||||
descriptionmj: ''
|
||||
draconic: Voie d'Hypnos
|
||||
duree: Tâche ou fin HN
|
||||
|
@ -3315,7 +3315,7 @@ prototypeToken:
|
||||
height: 1
|
||||
lockRotation: false
|
||||
rotation: 0
|
||||
actorLink: false
|
||||
actorLink: true
|
||||
disposition: 0
|
||||
displayBars: 0
|
||||
bar1:
|
||||
|
@ -3021,7 +3021,7 @@ prototypeToken:
|
||||
height: 1
|
||||
lockRotation: false
|
||||
rotation: 0
|
||||
actorLink: false
|
||||
actorLink: true
|
||||
disposition: 0
|
||||
displayBars: 0
|
||||
bar1:
|
||||
|
@ -2954,7 +2954,7 @@ prototypeToken:
|
||||
height: 1
|
||||
lockRotation: false
|
||||
rotation: 0
|
||||
actorLink: false
|
||||
actorLink: true
|
||||
disposition: 0
|
||||
displayBars: 0
|
||||
bar1:
|
||||
|
@ -3039,7 +3039,7 @@ prototypeToken:
|
||||
height: 1
|
||||
lockRotation: false
|
||||
rotation: 0
|
||||
actorLink: false
|
||||
actorLink: true
|
||||
disposition: 0
|
||||
displayBars: 0
|
||||
bar1:
|
||||
|
@ -3113,7 +3113,7 @@ prototypeToken:
|
||||
height: 1
|
||||
lockRotation: false
|
||||
rotation: 0
|
||||
actorLink: false
|
||||
actorLink: true
|
||||
disposition: 0
|
||||
displayBars: 0
|
||||
bar1:
|
||||
|
@ -2975,7 +2975,7 @@ ownership:
|
||||
prototypeToken:
|
||||
name: le Coureur des Rues
|
||||
displayName: 0
|
||||
actorLink: false
|
||||
actorLink: true
|
||||
width: 1
|
||||
height: 1
|
||||
lockRotation: false
|
||||
|
@ -3502,7 +3502,7 @@ ownership:
|
||||
prototypeToken:
|
||||
name: le Cuisinier Haut-Rêvant
|
||||
displayName: 0
|
||||
actorLink: false
|
||||
actorLink: true
|
||||
width: 1
|
||||
height: 1
|
||||
lockRotation: false
|
||||
|
@ -3262,7 +3262,7 @@ prototypeToken:
|
||||
height: 1
|
||||
lockRotation: false
|
||||
rotation: 0
|
||||
actorLink: false
|
||||
actorLink: true
|
||||
disposition: 0
|
||||
displayBars: 0
|
||||
bar1:
|
||||
|
@ -2186,10 +2186,11 @@ items:
|
||||
effects: []
|
||||
system:
|
||||
description: >-
|
||||
<p>@JournalEntry[vid6uJc66QFgHSUr]{Note sur les invocations de
|
||||
créatures}</p>
|
||||
<p>@UUID[Compendium.foundryvtt-reve-de-dragon.rappel-des-regles.JournalEntry.GRKYbbNDIHdzVNaj.JournalEntryPage.PiKGAswCiDPtmAol]{Note
|
||||
sur les invocations de créatures}</p>
|
||||
|
||||
<p>Le Guerrier Sorde a l’apparence d’un humanoïde entièrement revêtu
|
||||
<p>Le @UUID[Compendium.foundryvtt-reve-de-dragon.invocations.Actor.xGtM3z3KM6N6lpd5]{Guerrier Sorde}
|
||||
a l’apparence d’un humanoïde entièrement revêtu
|
||||
d’une armure de plaques, visière du heaume toujours baissée, dissimulant
|
||||
son visage. Il est armé d’une épée sorde, d’un bouclier moyen et d’une
|
||||
dague. La seule tâche que l’on puisse lui demander est de faire usage de
|
||||
@ -2211,8 +2212,8 @@ items:
|
||||
normalement affectés par les suggestions et illusions d’Hypnos, avec un
|
||||
JR standard r-8, ainsi que par les sorts individuels de Thananatos.</p>
|
||||
|
||||
<p>@JournalEntry[R3q4vUTEfyxYgmGr]{Communication avec les créatures
|
||||
invoquées}</p>
|
||||
<p>@UUID[Compendium.foundryvtt-reve-de-dragon.rappel-des-regles.JournalEntry.3wVxF2IRf3c1lOxC.JournalEntryPage.GLzfQkCfkbnxBX8A]{Communication
|
||||
avec les créatures invoquées}</p>
|
||||
descriptionmj: ''
|
||||
draconic: hypnos
|
||||
duree: Tâche
|
||||
@ -3584,7 +3585,7 @@ prototypeToken:
|
||||
height: 1
|
||||
lockRotation: false
|
||||
rotation: 0
|
||||
actorLink: false
|
||||
actorLink: true
|
||||
disposition: 0
|
||||
displayBars: 0
|
||||
bar1:
|
||||
|
@ -3752,7 +3752,7 @@ prototypeToken:
|
||||
height: 1
|
||||
lockRotation: false
|
||||
rotation: 0
|
||||
actorLink: false
|
||||
actorLink: true
|
||||
disposition: 0
|
||||
displayBars: 0
|
||||
bar1:
|
||||
|
@ -3661,7 +3661,7 @@ prototypeToken:
|
||||
height: 1
|
||||
lockRotation: false
|
||||
rotation: 0
|
||||
actorLink: false
|
||||
actorLink: true
|
||||
disposition: 0
|
||||
displayBars: 0
|
||||
bar1:
|
||||
|
@ -3025,7 +3025,7 @@ prototypeToken:
|
||||
height: 1
|
||||
lockRotation: false
|
||||
rotation: 0
|
||||
actorLink: false
|
||||
actorLink: true
|
||||
disposition: 0
|
||||
displayBars: 0
|
||||
bar1:
|
||||
|
78
styles/img/ui/ajout-competence.svg
Normal file
78
styles/img/ui/ajout-competence.svg
Normal file
@ -0,0 +1,78 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
viewBox="0 0 512 512"
|
||||
style="height: 256px; width: 256px;"
|
||||
version="1.1"
|
||||
id="svg8"
|
||||
sodipodi:docname="add-skill.svg"
|
||||
inkscape:version="1.0.1 (3bc2e813f5, 2020-09-07)">
|
||||
<metadata
|
||||
id="metadata14">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<defs
|
||||
id="defs12" />
|
||||
<sodipodi:namedview
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1"
|
||||
objecttolerance="10"
|
||||
gridtolerance="10"
|
||||
guidetolerance="10"
|
||||
inkscape:pageopacity="0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:window-width="2138"
|
||||
inkscape:window-height="1465"
|
||||
id="namedview10"
|
||||
showgrid="false"
|
||||
inkscape:zoom="1.0150849"
|
||||
inkscape:cx="466.02267"
|
||||
inkscape:cy="44.586362"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="0"
|
||||
inkscape:window-maximized="0"
|
||||
inkscape:current-layer="svg8" />
|
||||
<path
|
||||
d="M0 0h512v512H0z"
|
||||
fill="url(#pattern)"
|
||||
fill-opacity="0.5"
|
||||
id="path2" />
|
||||
<g
|
||||
class=""
|
||||
transform="translate(-81.40366,-2.6174234)"
|
||||
id="g6">
|
||||
<path
|
||||
d="m 119.1,25 v 0.1 c -25,3.2 -47.1,32 -47.1,68.8 0,20.4 7.1,38.4 17.5,50.9 L 99.7,157 84,159.9 c -13.7,2.6 -23.8,9.9 -32.2,21.5 -8.5,11.5 -14.9,27.5 -19.4,45.8 -8.2,33.6 -9.9,74.7 -10.1,110.5 h 44 l 11.9,158.4 h 96.3 L 185,337.7 h 41.9 c 0,-36.2 -0.3,-77.8 -7.8,-111.7 -4,-18.5 -10.2,-34.4 -18.7,-45.9 -8.6,-11.4 -19.2,-18.7 -34.5,-21 l -16,-2.5 L 160,144 c 10,-12.5 16.7,-30.2 16.7,-50.1 0,-39.2 -24.8,-68.8 -52.4,-68.8 -2.9,0 -4.7,-0.1 -5.2,-0.1 z M 311,55 v 48 H 208 v 18 h 103 v 158 h -55 v 18 h 55 V 407 H 208 v 18 h 103 v 32 h 80.8 c -0.5,-2.9 -0.8,-5.9 -0.8,-9 0,-3.1 0.3,-6.1 0.8,-9 H 329 V 297 h 62.8 c -0.5,-2.9 -0.8,-5.9 -0.8,-9 0,-3.1 0.3,-6.1 0.8,-9 H 329 V 73 h 62.8 c -0.5,-2.92 -0.8,-5.93 -0.8,-9 0,-3.07 0.3,-6.08 0.8,-9 z m 129,202 c -17.2,0 -31,13.8 -31,31 0,17.2 13.8,31 31,31 17.2,0 31,-13.8 31,-31 0,-17.2 -13.8,-31 -31,-31 z m 0,160 c -17.2,0 -31,13.8 -31,31 0,17.2 13.8,31 31,31 17.2,0 31,-13.8 31,-31 0,-17.2 -13.8,-31 -31,-31 z"
|
||||
fill="#000000"
|
||||
fill-opacity="0.8"
|
||||
transform="matrix(0.6,0,0,0.6,102.4,102.4)"
|
||||
id="path4"
|
||||
sodipodi:nodetypes="ccsccccccccccccccccssccccccccccccccccsccccsccccsccssssssssss" />
|
||||
</g>
|
||||
<g
|
||||
class=""
|
||||
transform="translate(124.63542,-119.78046)"
|
||||
id="g6-1">
|
||||
<path
|
||||
d="m 158.81777,136.77499 c -9.48,32.22 -28.656,28.8 -47.61,26.04 21.39,6.12 29.61,22.38 25.998,47.64 7.596,-27.6 25.572,-31.56 47.652,-26.04 -22.56,-7.26 -34.14,-21.24 -26.04,-47.64 z m -41.76,76.08 c 5.496,10.02 4.578,18.06 -3.366,24 7.476,-4.14 14.91,-8.58 23.946,3.36 -7.542,-9.72 -4.92,-17.4 3.366,-24 -8.352,5.82 -16.482,6.96 -23.946,-3.36 z m 82.32,0.18 c 6.84,16.08 -0.3,24.78 -13.02,30.54 13.62,-5.1 24.48,-2.7 30.54,13.02 -7.62,-19.08 2.88,-24.72 13.02,-30.54 -12.6,5.1 -22.68,0.54 -30.54,-13.02 z m -52.776,31.2 c 9.396,34.68 0.516,58.86 -28.392,71.1 26.076,-7.08 52.428,-15.12 71.208,28.44 -15.84,-35.58 -2.04,-57.24 28.38,-71.28 -30,11.52 -55.86,9 -71.196,-28.26 z"
|
||||
fill="#000000"
|
||||
fill-opacity="0.8"
|
||||
id="path4-2"
|
||||
sodipodi:nodetypes="cccccccccccccccccccc"
|
||||
style="stroke-width:0.6" />
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 3.7 KiB |
@ -816,12 +816,12 @@ input:is(.blessure-premiers_soins, .blessure-soins_complets) {
|
||||
.competence-list .item-controls.hidden-controls {
|
||||
display: none !important;
|
||||
}
|
||||
.item-controls i:is(.fas, .fa, .fa-solid) {
|
||||
.item-controls i:is(.fas, .fa, .fa-solid, .fa-regular) {
|
||||
font-size: 0.8em;
|
||||
color: var(--color-controls);
|
||||
}
|
||||
.item-controls i:is(.fas, .far, .fa-solid):hover {
|
||||
opacity: 0.7 ;
|
||||
.item-controls i:is(.fas, .far, .fa-solid, .fa-regular):hover {
|
||||
opacity: 0.6;
|
||||
}
|
||||
|
||||
.rdd-roll-dialog .description-sort {
|
||||
|
@ -37,7 +37,7 @@
|
||||
<input class="derivee-value" type="number" name="system.compteurs.dissolution.value" value="{{system.compteurs.dissolution.value}}" data-dtype="number"/>
|
||||
</li>
|
||||
<li class="caracteristique flexrow list-item">
|
||||
<label class="derivee-label chance-actuelle" data-tooltip="Jet de chance actuelle"><a>Chance actuelle</a></label>
|
||||
<label class="derivee-label chance-actuelle" data-tooltip="Jet de chance actuelle"><a class="roll-chance-actuelle">Chance actuelle</a></label>
|
||||
<input class="derivee-value" type="number" name="system.compteurs.chance.value" value="{{system.compteurs.chance.value}}" data-dtype="number"/>
|
||||
</li>
|
||||
<li class="caracteristique flexrow list-item">
|
||||
|
@ -1,3 +1,6 @@
|
||||
<h4>Compétences{{#if @root.options.vueDetaillee}} <a class="competence-add" data-tooltip="Ajouter une compétence">
|
||||
<i class="fa-solid fa-books-medical"></i>
|
||||
</a>{{/if}}</h4>
|
||||
<ol class="item-list alterne-list">
|
||||
{{#each (trier competences) as |comp key|}}
|
||||
<li class="item flexrow list-item" data-item-id="{{comp._id}}">
|
||||
|
@ -54,7 +54,7 @@
|
||||
{{>"systems/foundryvtt-reve-de-dragon/templates/actor/export-scriptarium/carac.hbs" carac=export.empathie}}
|
||||
{{>"systems/foundryvtt-reve-de-dragon/templates/actor/export-scriptarium/carac.hbs" carac=export.intellect}}
|
||||
{{>"systems/foundryvtt-reve-de-dragon/templates/actor/export-scriptarium/carac-compteur.hbs" carac=export.reve actuel=export.reve_actuel button-name='ptreve-actuel'}}
|
||||
{{>"systems/foundryvtt-reve-de-dragon/templates/actor/export-scriptarium/carac.hbs" carac=export.chance}}
|
||||
{{>"systems/foundryvtt-reve-de-dragon/templates/actor/export-scriptarium/carac-compteur.hbs" carac=export.chance actuel=export.chance_actuel button-name='chance-actuelle'}}
|
||||
</div>
|
||||
<div class="flexcol flex-group-top">
|
||||
{{>"systems/foundryvtt-reve-de-dragon/templates/actor/export-scriptarium/carac-derivee.hbs" carac=export.melee}}
|
||||
|
@ -1,6 +1,7 @@
|
||||
{{#if sortsReserve.length}}
|
||||
<h3>Sorts en Réserve{{#if options.isGM}} <a class="nouveau-sort-reserve"><i class="fa-solid fa-sparkles"></i>
|
||||
</a>{{/if}}
|
||||
<h3>Sorts en Réserve{{#if options.isGM}} <a class="sortreserve-add">
|
||||
<i class="fa-solid fa-sparkles"></i>
|
||||
</a>{{/if}}
|
||||
</h3>
|
||||
<ul class="item-list alterne-list">
|
||||
{{#each (trier sortsReserve) as |sort key|}}
|
||||
|
@ -2,19 +2,28 @@
|
||||
<h3>Sorts</h3>
|
||||
<ul class="item-list alterne-list">
|
||||
{{#each (trier sorts) as |sort key|}}
|
||||
<li class="item list-item flexrow" data-item-id="{{sort._id}}" data-attribute="{{key}}" data-tooltip="{{#if sort.system.isrituel}}Rituel{{else}}Sort{{/if}}: {{sort.name}}">
|
||||
<li class="item list-item flexrow" data-item-id="{{sort._id}}" data-attribute="{{key}}" data-tooltip="{{#if sort.system.isrituel}}Rituel{{else}}Sort{{/if}}: {{sort.name}}">
|
||||
<img class="sheet-competence-img" src="{{sort.img}}"/>
|
||||
<span class="flex-shrink">{{itemSort-shortDraconic sort.system.draconic}}</span>
|
||||
<span class="item-edit flex-grow-3">{{sort.name}}{{#if sort.system.isrituel}}
|
||||
<i class="fa-regular fa-book-sparkles"></i>{{/if}}</span>
|
||||
<span class="item-edit flex-grow-3">{{sort.name}}
|
||||
{{#if sort.system.isrituel}}<i class="fa-solid fa-book-sparkles"></i>{{/if}}
|
||||
{{#if sort.system.coutseuil}}
|
||||
{{#repeat sort.system.coutseuil}}<i class="fa-solid fa-star-sharp" data-tooltip="coût de seuil: {{sort.system.coutseuil}}"></i>{{/repeat}}
|
||||
{{/if}}
|
||||
</span>
|
||||
<span class="flex-grow-2">
|
||||
{{#if sort.system.caseTMRspeciale}}{{sort.system.caseTMRspeciale}}{{else}}{{upperFirst sort.system.caseTMR}}{{/if}}
|
||||
</span>
|
||||
</span>
|
||||
<span class="flex-grow-1">R{{itemSort-spaceIfText sort.system.difficulte}} r{{itemSort-spaceIfText sort.system.ptreve}}</span>
|
||||
<div class="item-controls flex-shrink">
|
||||
<a class="item-edit" data-tooltip="Modifier"><i class="fas fa-edit"></i></a>
|
||||
<a class="item-delete" data-tooltip="Supprimer"><i class="fas fa-trash"></i></a>
|
||||
<a class="item-montrer" data-tooltip="Montrer"><i class="fas fa-comment"></i></a>
|
||||
{{#if (and @root.options.isGM (not sort.system.isrituel))}}
|
||||
<a class="sortreserve-add" data-tooltip="Ajouter ce sort en réserve">
|
||||
<i class="fa-solid fa-sparkles"></i>
|
||||
</a>
|
||||
{{/if}}
|
||||
</div>
|
||||
</li>
|
||||
{{/each}}
|
||||
|
@ -1,12 +1,14 @@
|
||||
<span class="item-name"><h4>Personnages accordés</h4></span>
|
||||
<ul class="item-list alterne-list">
|
||||
<h4>Personnages accordés <a class="resonance-add" data-tooltip="Ajouter un pesonnage accordé">
|
||||
<i class="fa-solid fa-person-circle-plus"></i>
|
||||
</a></h4>
|
||||
<ol class="item-list alterne-list">
|
||||
{{#each resonances as |actor|}}
|
||||
<li class="item flexrow list-item" data-actor-id="{{actor.id}}">
|
||||
<img class="sheet-competence-img subacteur-open" src="{{actor.img}}" data-tooltip="{{actor.name}}"/>
|
||||
<span class="subacteur-label subacteur-open"><a>{{actor.name}}</a></span>
|
||||
<div class="flex-shrink">
|
||||
<a class="resonance-delete" data-tooltip="Supprimer"><i class="fas fa-trash"></i></a>
|
||||
</div>
|
||||
</div>
|
||||
</li>
|
||||
{{/each}}
|
||||
</ul>
|
||||
</ol>
|
||||
|
Reference in New Issue
Block a user