Compare commits
25 Commits
d1b1b2a341
...
ed222c7b6d
Author | SHA1 | Date | |
---|---|---|---|
ed222c7b6d | |||
70198a5727 | |||
bfe70c6634 | |||
09365eb744 | |||
894d4f3941 | |||
6e234411ca | |||
85acb5a255 | |||
6106e2a19e | |||
f896f1da6e | |||
9bb45c2349 | |||
5cab219e0e | |||
2de9ea49c8 | |||
1760d26014 | |||
92185d4a5b | |||
210b129934 | |||
b892068b38 | |||
3906cb0a7b | |||
5c58932a0d | |||
3b06bd382b | |||
b4a725ff12 | |||
05df6a68cc | |||
025c3483a9 | |||
97138b25c7 | |||
c0066f79c1 | |||
4db8bf95f9 |
15
changelog.md
15
changelog.md
@ -1,6 +1,19 @@
|
|||||||
# 12.0
|
# 12.0
|
||||||
## 12.0.18 - A la barbe d'Astrobazzarh
|
## 12.0.18 - A la barbe d'Astrobazzarh
|
||||||
- Ajout du portrait sur les feuilles simplifiées
|
- Améliorations sur la feuille de PNJ simplifiée
|
||||||
|
- Ajout du portrait
|
||||||
|
- Ajout du corps à corps
|
||||||
|
- Affichage du niveau d'esquive
|
||||||
|
- Un clic sur l'initiative permet de lancer l'initiative
|
||||||
|
- les boutons +/- pour la vie, l'endurance et la fatigue changent si on est à la valeur normale
|
||||||
|
- un clic sur l'endurance effectue un jet d'endurance
|
||||||
|
- Fix
|
||||||
|
- les achats des commerces sont de nouveau possibles
|
||||||
|
- la commande /astro fonctionne de nouveau
|
||||||
|
- le nombre d'utilisations d'items est réinitialisé à chaque round et fin de combat
|
||||||
|
- la difficulté de parade pour les armes à distances n'est plus indiquée
|
||||||
|
- les propositions d'armes de parade sont corrigées
|
||||||
|
- Ajout d'un indicateur pour les armes de parade nécessitant une significative
|
||||||
|
|
||||||
## 12.0.16 - Le secret d'Astrobazzarh
|
## 12.0.16 - Le secret d'Astrobazzarh
|
||||||
- Fix: les jets envoyés messages uniquement au MJ ne sont plus envoyés à tous les autres joueurs (et dupliqués)
|
- Fix: les jets envoyés messages uniquement au MJ ne sont plus envoyés à tous les autres joueurs (et dupliqués)
|
||||||
|
@ -224,7 +224,7 @@ export class RdDActorSheet extends RdDBaseActorSangSheet {
|
|||||||
this.html.find('.roll-arme').click(async event => this.actor.rollArme(foundry.utils.duplicate(this._getEventArmeCombat(event)), 'competence'))
|
this.html.find('.roll-arme').click(async event => this.actor.rollArme(foundry.utils.duplicate(this._getEventArmeCombat(event)), 'competence'))
|
||||||
|
|
||||||
// Initiative pour l'arme
|
// Initiative pour l'arme
|
||||||
this.html.find('.arme-initiative a').click(async event => {
|
this.html.find('.roll-init-arme').click(async event => {
|
||||||
let combatant = game.combat.combatants.find(c => c.actor.id == this.actor.id)
|
let combatant = game.combat.combatants.find(c => c.actor.id == this.actor.id)
|
||||||
if (combatant) {
|
if (combatant) {
|
||||||
RdDCombatManager.rollInitiativeAction(combatant._id, this._getEventArmeCombat(event));
|
RdDCombatManager.rollInitiativeAction(combatant._id, this._getEventArmeCombat(event));
|
||||||
|
@ -2615,7 +2615,7 @@ export class RdDActor extends RdDBaseActorSang {
|
|||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
async resetItemUse() {
|
async resetItemUse() {
|
||||||
await this.setFlag(SYSTEM_RDD, 'itemUse', {});
|
await this.unsetFlag(SYSTEM_RDD, 'itemUse');
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
|
@ -78,8 +78,10 @@ export class RdDBaseActorReve extends RdDBaseActor {
|
|||||||
}
|
}
|
||||||
async jetEndurance(resteEndurance = undefined) { return { jetEndurance: 0, sonne: false } }
|
async jetEndurance(resteEndurance = undefined) { return { jetEndurance: 0, sonne: false } }
|
||||||
isDead() { return false }
|
isDead() { return false }
|
||||||
|
isSonne() { return false }
|
||||||
blessuresASoigner() { return [] }
|
blessuresASoigner() { return [] }
|
||||||
getEtatGeneral(options = { ethylisme: false }) { return 0 }
|
getEtatGeneral(options = { ethylisme: false }) { return 0 }
|
||||||
|
isActorCombat() { return true }
|
||||||
|
|
||||||
async computeArmure(attackerRoll) { return this.getProtectionNaturelle() }
|
async computeArmure(attackerRoll) { return this.getProtectionNaturelle() }
|
||||||
async remiseANeuf() { }
|
async remiseANeuf() { }
|
||||||
@ -405,12 +407,7 @@ export class RdDBaseActorReve extends RdDBaseActor {
|
|||||||
return RdDItemArme.getCompetenceArme(arme, competenceName)
|
return RdDItemArme.getCompetenceArme(arme, competenceName)
|
||||||
}
|
}
|
||||||
|
|
||||||
verifierForceMin(item) {
|
verifierForceMin(item) { }
|
||||||
}
|
|
||||||
/* -------------------------------------------- */
|
|
||||||
async resetItemUse() { }
|
|
||||||
async incDecItemUse(itemId, inc = 1) { }
|
|
||||||
getItemUse(itemId) { return 0; }
|
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
async encaisser() { await RdDEncaisser.encaisser(this) }
|
async encaisser() { await RdDEncaisser.encaisser(this) }
|
||||||
|
@ -276,11 +276,11 @@ export class RdDBaseActorSang extends RdDBaseActorReve {
|
|||||||
ui.notifications.info(`${this.name} est hors combat, il ne reste donc pas sonné`);
|
ui.notifications.info(`${this.name} est hors combat, il ne reste donc pas sonné`);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
await this.setEffect(STATUSES.StatusStunned, sonne);
|
await this.setEffect(STATUSES.StatusStunned, sonne)
|
||||||
}
|
}
|
||||||
|
|
||||||
getSonne() {
|
isSonne() {
|
||||||
return this.getEffect(STATUSES.StatusStunned);
|
return this.getEffect(STATUSES.StatusStunned)
|
||||||
}
|
}
|
||||||
|
|
||||||
isEffectAllowed(effectId) { return true }
|
isEffectAllowed(effectId) { return true }
|
||||||
|
@ -205,11 +205,8 @@ export class RdDBaseActor extends Actor {
|
|||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
async onPreUpdateItem(item, change, options, id) { }
|
async onPreUpdateItem(item, change, options, id) { }
|
||||||
|
|
||||||
async onCreateItem(item, options, id) { }
|
async onCreateItem(item, options, id) { }
|
||||||
|
|
||||||
async onDeleteItem(item, options, id) { }
|
async onDeleteItem(item, options, id) { }
|
||||||
|
|
||||||
async onUpdateActor(update, options, actorId) { }
|
async onUpdateActor(update, options, actorId) { }
|
||||||
|
|
||||||
async onTimeChanging(oldTimestamp, newTimestamp) {
|
async onTimeChanging(oldTimestamp, newTimestamp) {
|
||||||
@ -317,7 +314,7 @@ export class RdDBaseActor extends Actor {
|
|||||||
|
|
||||||
RdDAudio.PlayContextAudio("argent"); // Petit son
|
RdDAudio.PlayContextAudio("argent"); // Petit son
|
||||||
ChatMessage.create({
|
ChatMessage.create({
|
||||||
whisper: ChatUtility.getOwners(this.name),
|
whisper: ChatUtility.getOwners(this),
|
||||||
content: `Vous avez reçu <strong>${sols} Sols</strong> ${fromActor ? " de " + fromActor.name : ''}, qui ont été ajoutés à votre argent.`
|
content: `Vous avez reçu <strong>${sols} Sols</strong> ${fromActor ? " de " + fromActor.name : ''}, qui ont été ajoutés à votre argent.`
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -708,5 +705,9 @@ export class RdDBaseActor extends Actor {
|
|||||||
}
|
}
|
||||||
return undefined
|
return undefined
|
||||||
}
|
}
|
||||||
|
async resetItemUse() { }
|
||||||
|
async incDecItemUse(itemId, inc = 1) { }
|
||||||
|
getItemUse(itemId) { return 0; }
|
||||||
|
async finDeRound(options = { terminer: false }) { }
|
||||||
|
isActorCombat() { return false }
|
||||||
}
|
}
|
@ -84,7 +84,7 @@ const MAPPING_BASE = [
|
|||||||
{ column: "malus_armure", getter: (actor, context) => Mapping.getMalusArmure(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: "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: "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: "endurance_actuel", rollClass: 'jet-endurance', getter: (actor, context) => actor.system.sante.endurance.value },
|
||||||
{ column: "esquive", getter: (actor, context) => Mapping.getEsquive(context) },
|
{ 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: "competences", getter: (actor, context) => Mapping.getCompetences(actor, CATEGORIES_COMPETENCES) },
|
||||||
@ -140,16 +140,15 @@ export class Mapping {
|
|||||||
|
|
||||||
static prepareArmes(actor) {
|
static prepareArmes(actor) {
|
||||||
const armes = actor.items.filter(it => it.type == ITEM_TYPES.arme)
|
const armes = actor.items.filter(it => it.type == ITEM_TYPES.arme)
|
||||||
return armes.map(arme =>
|
RdDItemArme.ajoutCorpsACorps(armes, actor)
|
||||||
[
|
return armes.map(arme => [
|
||||||
arme.system.unemain ? Mapping.prepareArme(actor, arme, 'unemain') : undefined,
|
arme.system.unemain ? Mapping.prepareArme(actor, arme, 'unemain') : undefined,
|
||||||
arme.system.deuxmains ? Mapping.prepareArme(actor, arme, 'deuxmains') : undefined,
|
arme.system.deuxmains ? Mapping.prepareArme(actor, arme, 'deuxmains') : undefined,
|
||||||
!(arme.system.unemain || arme.system.deuxmains) ? Mapping.prepareArme(actor, arme, 'competence') : undefined,
|
!(arme.system.unemain || arme.system.deuxmains) ? Mapping.prepareArme(actor, arme, 'competence') : undefined,
|
||||||
arme.system.lancer != "" ? Mapping.prepareArme(actor, arme, 'lancer') : undefined,
|
arme.system.lancer != "" ? Mapping.prepareArme(actor, arme, 'lancer') : undefined,
|
||||||
arme.system.tir != "" ? Mapping.prepareArme(actor, arme, 'tir') : undefined
|
arme.system.tir != "" ? Mapping.prepareArme(actor, arme, 'tir') : undefined]
|
||||||
]
|
.filter(it => it != undefined))
|
||||||
.filter(it => it != undefined)
|
.reduce((a, b) => a.concat(b), [])
|
||||||
).reduce((a, b) => a.concat(b), [])
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static prepareArme(actor, arme, maniement) {
|
static prepareArme(actor, arme, maniement) {
|
||||||
@ -158,23 +157,31 @@ export class Mapping {
|
|||||||
if (RdDItemCompetence.isNiveauBase(competence)) {
|
if (RdDItemCompetence.isNiveauBase(competence)) {
|
||||||
return undefined
|
return undefined
|
||||||
}
|
}
|
||||||
const dmgArme = RdDItemArme.dommagesReels(arme, maniement)
|
|
||||||
const dommages = dmgArme + RdDBonus.bonusDmg(actor, maniement, dmgArme)
|
|
||||||
const categorie = Mapping.complementCategorie(arme, maniement)
|
const categorie = Mapping.complementCategorie(arme, maniement)
|
||||||
|
const dommages = Mapping.dommagesArme(actor, arme, maniement)
|
||||||
return {
|
return {
|
||||||
name: arme.name + categorie,
|
name: arme.name + categorie,
|
||||||
niveau: Misc.toSignedString(competence.system.niveau),
|
niveau: Misc.toSignedString(competence.system.niveau),
|
||||||
init: Mapping.calculBaseInit(actor, competence.system.categorie) + competence.system.niveau,
|
init: Mapping.calculBaseInit(actor, competence.system.categorie) + competence.system.niveau,
|
||||||
dommages: Misc.toSignedString(dommages),
|
dommages: dommages,
|
||||||
competence: competence,
|
competence: competence,
|
||||||
arme: arme
|
arme: arme
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
static dommagesArme(actor, arme, maniement){
|
||||||
|
const dmgArme = RdDItemArme.dommagesReels(arme, maniement)
|
||||||
|
const dommages = Misc.toSignedString(dmgArme + RdDBonus.bonusDmg(actor, maniement, dmgArme))
|
||||||
|
switch(arme.system.mortalite) {
|
||||||
|
case 'non-mortel': return `(${dommages})`
|
||||||
|
case 'empoignade': return '-'
|
||||||
|
}
|
||||||
|
return dommages
|
||||||
|
}
|
||||||
|
|
||||||
static complementCategorie(arme, maniement) {
|
static complementCategorie(arme, maniement) {
|
||||||
switch (maniement) {
|
switch (maniement) {
|
||||||
case 'unemain': return (arme.system.deuxmains) ? ' 1 main' : (arme.system.lancer||arme.system.tir) ? ' mêlée': ''
|
case 'unemain': return (arme.system.deuxmains) ? ' 1 main' : (arme.system.lancer || arme.system.tir) ? ' mêlée' : ''
|
||||||
case 'deuxmains': return (arme.system.unemain) ? ' 2 mains' : (arme.system.lancer||arme.system.tir) ? ' mêlée': ''
|
case 'deuxmains': return (arme.system.unemain) ? ' 2 mains' : (arme.system.lancer || arme.system.tir) ? ' mêlée' : ''
|
||||||
case 'lancer': return (arme.system.unemain || arme.system.deuxmains || arme.system.tir) ? ' jet' : ''
|
case 'lancer': return (arme.system.unemain || arme.system.deuxmains || arme.system.tir) ? ' jet' : ''
|
||||||
case 'tir': return (arme.system.unemain || arme.system.deuxmains || arme.system.lancer) ? ' tir' : ''
|
case 'tir': return (arme.system.unemain || arme.system.deuxmains || arme.system.lancer) ? ' tir' : ''
|
||||||
}
|
}
|
||||||
|
433
module/apps/rdd-import-stats.js
Normal file
433
module/apps/rdd-import-stats.js
Normal file
@ -0,0 +1,433 @@
|
|||||||
|
/************************************************************************************/
|
||||||
|
import "./xregexp-all.js";
|
||||||
|
import { SystemCompendiums } from "../settings/system-compendiums.js";
|
||||||
|
import { RdDBaseActorReve } from "../actor/base-actor-reve.js";
|
||||||
|
|
||||||
|
/************************************************************************************/
|
||||||
|
// Some internal test strings
|
||||||
|
let statBlock01 = `+$16(/, baron de Sylvedire, né à l’heure du
|
||||||
|
Roseau, 40 ans, 1m78, 65 kg, Beauté 13.
|
||||||
|
TAILLE
|
||||||
|
10
|
||||||
|
Mêlée
|
||||||
|
14
|
||||||
|
APPARENCE
|
||||||
|
13
|
||||||
|
Tir
|
||||||
|
11
|
||||||
|
CONSTITUTION
|
||||||
|
12
|
||||||
|
Lancer
|
||||||
|
11
|
||||||
|
FORCE
|
||||||
|
12
|
||||||
|
Dérobée
|
||||||
|
13
|
||||||
|
AGILITÉ
|
||||||
|
16
|
||||||
|
Vie
|
||||||
|
11
|
||||||
|
DEXTÉRITÉ
|
||||||
|
13
|
||||||
|
Endurance
|
||||||
|
25
|
||||||
|
VUE
|
||||||
|
10
|
||||||
|
+dom
|
||||||
|
0
|
||||||
|
OUÏE
|
||||||
|
11
|
||||||
|
Protection
|
||||||
|
2 ou 4
|
||||||
|
ODO-GOÛT
|
||||||
|
9
|
||||||
|
cuir souple
|
||||||
|
VOLONTÉ
|
||||||
|
14
|
||||||
|
ou cuir / métal
|
||||||
|
INTELLECT
|
||||||
|
9
|
||||||
|
EMPATHIE
|
||||||
|
11
|
||||||
|
RÊVE
|
||||||
|
13
|
||||||
|
CHANCE
|
||||||
|
10
|
||||||
|
niv
|
||||||
|
init
|
||||||
|
+dom
|
||||||
|
Épée dragonne
|
||||||
|
+5
|
||||||
|
12
|
||||||
|
+3
|
||||||
|
Hache de bataille
|
||||||
|
+6
|
||||||
|
13
|
||||||
|
+3
|
||||||
|
Bouclier moyen
|
||||||
|
+5
|
||||||
|
Dague mêlée
|
||||||
|
+4
|
||||||
|
11
|
||||||
|
+1
|
||||||
|
Corps à corps
|
||||||
|
+4
|
||||||
|
11
|
||||||
|
(0)
|
||||||
|
Esquive
|
||||||
|
+8
|
||||||
|
Escalade +4 / Saut +5 / Commerce +3 / Équitation
|
||||||
|
+6 / Chirurgie 0 / Survie en extérieur +4 / Survie fo-
|
||||||
|
rêt +6 / Acrobatie -2 / Métallurgie +2 / Natation +3 /
|
||||||
|
Légendes -1 / Écriture -4
|
||||||
|
`;
|
||||||
|
|
||||||
|
let statBlock02 = `/HVJDUGHV
|
||||||
|
TAILLE
|
||||||
|
11
|
||||||
|
Mêlée
|
||||||
|
12
|
||||||
|
CONSTITUTION
|
||||||
|
11
|
||||||
|
Tir
|
||||||
|
11
|
||||||
|
FORCE
|
||||||
|
12
|
||||||
|
Lancer
|
||||||
|
11
|
||||||
|
AGILITÉ
|
||||||
|
12
|
||||||
|
Dérobée
|
||||||
|
11
|
||||||
|
DEXTERITÉ
|
||||||
|
11
|
||||||
|
Vie
|
||||||
|
11
|
||||||
|
VUE
|
||||||
|
11
|
||||||
|
Endurance
|
||||||
|
22
|
||||||
|
OUÏE
|
||||||
|
11
|
||||||
|
Vitesse
|
||||||
|
12
|
||||||
|
VOLONTÉ
|
||||||
|
10
|
||||||
|
+dom
|
||||||
|
0
|
||||||
|
Protection
|
||||||
|
4
|
||||||
|
cuir / métal
|
||||||
|
niv
|
||||||
|
init
|
||||||
|
+dom
|
||||||
|
Hache de bataille
|
||||||
|
+4
|
||||||
|
10
|
||||||
|
+3
|
||||||
|
Bouclier moyen
|
||||||
|
+4
|
||||||
|
Dague mêlée
|
||||||
|
+3
|
||||||
|
9
|
||||||
|
+1
|
||||||
|
Arc
|
||||||
|
+5
|
||||||
|
10
|
||||||
|
+2
|
||||||
|
Corps à corps
|
||||||
|
+3
|
||||||
|
9
|
||||||
|
(0)
|
||||||
|
Esquive avec armure
|
||||||
|
+2
|
||||||
|
Course +1/ Vigilance +4
|
||||||
|
`;
|
||||||
|
|
||||||
|
let statBlock03 = `rencontres sont laissées à /HVFKLHQVORXSVGXEDURQ
|
||||||
|
chaque gardien des rêves.
|
||||||
|
TAILLE
|
||||||
|
8
|
||||||
|
Vie
|
||||||
|
10
|
||||||
|
CONSTITUTION FORCE
|
||||||
|
12
|
||||||
|
11
|
||||||
|
Endurance
|
||||||
|
Vitesse
|
||||||
|
12/38
|
||||||
|
21
|
||||||
|
/HVFKLHQV]RPELV
|
||||||
|
PERCEPTION 13
|
||||||
|
+dom
|
||||||
|
0
|
||||||
|
VOLONTÉ
|
||||||
|
10
|
||||||
|
Protection
|
||||||
|
0
|
||||||
|
Les « monstres » apparaîtront un soir, durant
|
||||||
|
RÊVE
|
||||||
|
10
|
||||||
|
l’heure du Serpent, et attaqueront les voya-
|
||||||
|
niv
|
||||||
|
init
|
||||||
|
+dom
|
||||||
|
geurs à leur campement. Si ces derniers ne
|
||||||
|
Morsure
|
||||||
|
13
|
||||||
|
+4
|
||||||
|
10
|
||||||
|
+1
|
||||||
|
campent pas, ils apparaîtront tout de même à
|
||||||
|
Esquive
|
||||||
|
11
|
||||||
|
+3
|
||||||
|
l’heure du Serpent. Le feu ne les effraie pas. Ils
|
||||||
|
Course, Saut
|
||||||
|
12
|
||||||
|
+3
|
||||||
|
ne sont pas très rapides, mais en revanche, très
|
||||||
|
Discrétion
|
||||||
|
12
|
||||||
|
+3
|
||||||
|
silencieux : ils n’aboient pas. Les voyageurs
|
||||||
|
Vigilance
|
||||||
|
13
|
||||||
|
+3
|
||||||
|
`
|
||||||
|
// Skill parser depending on the type of actor
|
||||||
|
const compParser = { personnage: "\\s+(?<value>[\\+\\-]?\\d+)", creature: "\\s+(?<carac>\\d+)\\s+(?<value>[\\+\\-]?\\d+)\\s?(?<init>\\d+)?\\s+?(?<dommages>\\+\\d+)?" };
|
||||||
|
|
||||||
|
// Main class for parsing a stat block
|
||||||
|
export class RdDStatBlockParser {
|
||||||
|
|
||||||
|
static openInputDialog() {
|
||||||
|
let dialog = new Dialog({
|
||||||
|
title: "Import de stats de PNJ/Créatures",
|
||||||
|
content: `
|
||||||
|
<div>
|
||||||
|
<p>Coller le texte de la stat ici</p>
|
||||||
|
<textarea id="statBlock" style="width: 100%; height: 200px;"></textarea>
|
||||||
|
</div>
|
||||||
|
`,
|
||||||
|
buttons: {
|
||||||
|
ok: {
|
||||||
|
label: "OK",
|
||||||
|
callback: async (html) => {
|
||||||
|
let statBlock = html.find("#statBlock")[0].value;
|
||||||
|
await RdDStatBlockParser.parseStatBlock(statBlock);
|
||||||
|
dialog.close();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
cancel: {
|
||||||
|
label: "Cancel"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
dialog.render(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
static fixWeirdPDF(statString) {
|
||||||
|
// Split the statString into lines
|
||||||
|
let lines = statString.split("\n");
|
||||||
|
let newLines = [];
|
||||||
|
let index = 0;
|
||||||
|
let nextType = "string";
|
||||||
|
// Loop through each line
|
||||||
|
for (let i = 0; i < lines.length; i++) {
|
||||||
|
// remove trailing spaces
|
||||||
|
lines[i] = lines[i].trim();
|
||||||
|
// Is it text ?
|
||||||
|
if (lines[i].match(/^[a-zA-Zéêè\s]+/)) {
|
||||||
|
if ( nextType == "string" ) {
|
||||||
|
newLines[index] = lines[i];
|
||||||
|
nextType = "number";
|
||||||
|
} else {
|
||||||
|
console.log("Wrong sequence string detected...", lines[i], nextType);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Is it a number ?
|
||||||
|
if (lines[i].match(/^[\d\s]+/)) {
|
||||||
|
if ( nextType == "number" ) {
|
||||||
|
newLines[index] = newLines[index] + lines[i];
|
||||||
|
nextType = "string";
|
||||||
|
index++;
|
||||||
|
} else {
|
||||||
|
console.log("Wrong sequence number detected...", lines[i], nextType);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
static async parseStatBlock(statString, type = "npc") {
|
||||||
|
|
||||||
|
//statString = statBlock03;
|
||||||
|
if (!statString) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Special function to fix strange/weird copy/paste from PDF readers
|
||||||
|
// Unused up to now : this.fixWeirdPDF(statString);
|
||||||
|
|
||||||
|
// Replace all endline by space in the statString
|
||||||
|
statString = statString.replace(/\n/g, " ");
|
||||||
|
// Remove all multiple spaces
|
||||||
|
statString = statString.replace(/\s{2,}/g, " ");
|
||||||
|
// Remove all leading and trailing spaces
|
||||||
|
statString = statString.trim();
|
||||||
|
|
||||||
|
let actorType = "personnage";
|
||||||
|
let perception = XRegExp.exec(statString.toLowerCase(), XRegExp("perception\\s+(?<value>\\d+)", 'gi'));
|
||||||
|
if (perception?.value ) {
|
||||||
|
actorType = "creature";
|
||||||
|
}
|
||||||
|
|
||||||
|
// Now start carac
|
||||||
|
let actorData = foundry.utils.deepClone(game.model.Actor[actorType]);
|
||||||
|
for (let key in game.model.Actor.personnage.carac) {
|
||||||
|
let caracDef = game.model.Actor.personnage.carac[key];
|
||||||
|
// Parse the stat string for each caracteristic
|
||||||
|
let carac = XRegExp.exec(statString.toLowerCase(), XRegExp(caracDef.label.toLowerCase()+"\\s+(?<value>\\d+)", 'gi'));
|
||||||
|
if (carac?.value) {
|
||||||
|
actorData.carac[key].value = Number(carac.value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// If creature we need to setup additionnal fields
|
||||||
|
if (actorType == "creature") {
|
||||||
|
let plusDom = XRegExp.exec(statString.toLowerCase(), XRegExp("\\+dom\\s+(?<value>\\+\\d+)", 'gi'));
|
||||||
|
if (plusDom?.values) {
|
||||||
|
actorData.attributs.plusdom.value = Number(plusDom.value);
|
||||||
|
}
|
||||||
|
let protection = XRegExp.exec(statString.toLowerCase(), XRegExp("protection\\s+(?<value>\\d+)", 'gi'));
|
||||||
|
if (protection?.value) {
|
||||||
|
actorData.attributs.protection.value = Number(protection.value);
|
||||||
|
}
|
||||||
|
let endurance = XRegExp.exec(statString.toLowerCase(), XRegExp("endurance\\s+(?<value>\\d+)", 'gi'));
|
||||||
|
if (endurance?.value) {
|
||||||
|
actorData.sante.endurance.value = Number(endurance.value);
|
||||||
|
actorData.sante.endurance.max = Number(endurance.value);
|
||||||
|
}
|
||||||
|
let vie = XRegExp.exec(statString.toLowerCase(), XRegExp("vie\\s+(?<value>\\d+)", 'gi'));
|
||||||
|
if (vie.value) {
|
||||||
|
actorData.sante.vie.value = Number(vie.value);
|
||||||
|
actorData.sante.vie.max = Number(vie.value);
|
||||||
|
}
|
||||||
|
let vitesse = XRegExp.exec(statString.toLowerCase(), XRegExp("vitesse\\s+(?<value>[\\d\\/]+)", 'gi'));
|
||||||
|
if (vitesse?.value) {
|
||||||
|
actorData.attributs.vitesse.value = vitesse.value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
let items = [];
|
||||||
|
// Get skills from compendium
|
||||||
|
const competences = await SystemCompendiums.getCompetences(actorType);
|
||||||
|
//console.log("Competences : ", competences);
|
||||||
|
let allComp = competences.map(i => i.toObject())
|
||||||
|
for (let comp of allComp) {
|
||||||
|
let skill = XRegExp.exec(statString.toLowerCase(), XRegExp(comp.name.toLowerCase()+compParser[actorType], 'gi'));
|
||||||
|
if (skill) {
|
||||||
|
comp.system.niveau = Number(skill.value);
|
||||||
|
if (actorType == "creature") {
|
||||||
|
comp.system.carac_value = Number(skill.carac);
|
||||||
|
if (skill.init) {
|
||||||
|
comp.system.dommages = Number(skill.dommages);
|
||||||
|
comp.system.iscombat = true;
|
||||||
|
}
|
||||||
|
items.push(comp); // Only selective push
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (actorType == "personnage") {
|
||||||
|
items.push(comp); // Always push
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Now process weapons
|
||||||
|
const weapons = await SystemCompendiums.getWorldOrCompendiumItems("arme", "equipement")
|
||||||
|
//console.log("Equipement : ", equipment);
|
||||||
|
for (let w of weapons) {
|
||||||
|
|
||||||
|
let weapon = XRegExp.exec(statString.toLowerCase(), XRegExp(w.name.toLowerCase()+"\\s+(?<value>\\+\\d+)", 'gi'));
|
||||||
|
if (weapon) {
|
||||||
|
w.system.equipe = true
|
||||||
|
items.push(w.toObject());
|
||||||
|
// now process the skill
|
||||||
|
if ( w.system?.competence != "") {
|
||||||
|
let wComp = items.find(i => i.name.toLowerCase() == w.system.competence.toLowerCase());
|
||||||
|
if (wComp) {
|
||||||
|
wComp.system.niveau = Number(weapon.value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if ( w.system?.tir != "") {
|
||||||
|
let wComp = items.find(i => i.name.toLowerCase() == w.system.tir.toLowerCase());
|
||||||
|
if (wComp) {
|
||||||
|
wComp.system.niveau = Number(weapon.value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if ( w.system?.lancer != "") {
|
||||||
|
let wComp = items.find(i => i.name.toLowerCase() == w.system.lancer.toLowerCase());
|
||||||
|
if (wComp) {
|
||||||
|
wComp.system.niveau = Number(weapon.value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Now process armors
|
||||||
|
const armors = await SystemCompendiums.getWorldOrCompendiumItems("armure", "equipement")
|
||||||
|
for (let a of armors) {
|
||||||
|
let armor = XRegExp.exec(statString.toLowerCase(), XRegExp(a.name.toLowerCase(), 'gi'));
|
||||||
|
if (armor) {
|
||||||
|
a.system.equipe = true
|
||||||
|
items.push(a.toObject());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get hour name : heure du XXXXX
|
||||||
|
let heure = XRegExp.exec(statString.toLowerCase(), XRegExp("heure du\\s+(?<value>\\w+)", 'gi'));
|
||||||
|
if (heure?.value) {
|
||||||
|
actorData.heure = heure.value;
|
||||||
|
}
|
||||||
|
// Get age
|
||||||
|
let age = XRegExp.exec(statString.toLowerCase(), XRegExp("(?<value>\\d+) ans", 'gi'));
|
||||||
|
if (age?.value) {
|
||||||
|
actorData.age = Number(age.value);
|
||||||
|
}
|
||||||
|
// Get height
|
||||||
|
let taille = XRegExp.exec(statString.toLowerCase(), XRegExp("(?<value>\\d+)m\\d+", 'gi'));
|
||||||
|
if (taille?.value) {
|
||||||
|
actorData.taille = taille.value;
|
||||||
|
}
|
||||||
|
// Get weight
|
||||||
|
let poids = XRegExp.exec(statString.toLowerCase(), XRegExp("(?<value>\\d+) kg", 'gi'));
|
||||||
|
if (poids?.value) {
|
||||||
|
actorData.poids = poids.value;
|
||||||
|
}
|
||||||
|
// Get beauty
|
||||||
|
let beaute = XRegExp.exec(statString.toLowerCase(), XRegExp("beauté\\s+(?<value>\\d+)", 'gi'));
|
||||||
|
if (beaute?.value) {
|
||||||
|
actorData.beaute = Number(beaute.value);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Name is all string before ', né'
|
||||||
|
let name
|
||||||
|
if (actorType == "personnage") {
|
||||||
|
name = XRegExp.exec(statString.toLowerCase(), XRegExp("(?<value>[\\w\\s\\d]+),", 'gi'));
|
||||||
|
if (!name?.value) {
|
||||||
|
name = XRegExp.exec(statString.toLowerCase(), XRegExp("(?<value>.+)\\s+taille", 'gi'));
|
||||||
|
}
|
||||||
|
name = name?.value || "Importé";
|
||||||
|
}
|
||||||
|
if (actorType == "creature") {
|
||||||
|
name = XRegExp.exec(statString.toLowerCase(), XRegExp("(?<value>.+)\\s+taille", 'gi'));
|
||||||
|
name = name?.value || "Importé";
|
||||||
|
}
|
||||||
|
|
||||||
|
let newActor = RdDBaseActorReve.create({name: name || "Importé", type:actorType, system: actorData, items: items});
|
||||||
|
|
||||||
|
// DUmp....
|
||||||
|
console.log(actorData);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
8225
module/apps/xregexp-all.js
Normal file
8225
module/apps/xregexp-all.js
Normal file
File diff suppressed because it is too large
Load Diff
@ -81,37 +81,59 @@ export class RdDItemArme extends Item {
|
|||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static getCategorieParade(armeData) {
|
static getCategorieParade(armeData) {
|
||||||
if (armeData.system.categorie_parade) {
|
if (armeData.system.categorie_parade) {
|
||||||
return armeData.system.categorie_parade;
|
return armeData.system.categorie_parade
|
||||||
}
|
}
|
||||||
// pour compatibilité avec des personnages existants
|
// pour compatibilité avec des personnages existants
|
||||||
if (armeData.type == ITEM_TYPES.competencecreature || armeData.system.categorie == 'creature') {
|
if (armeData.type == ITEM_TYPES.competencecreature || armeData.system.categorie == 'creature') {
|
||||||
return armeData.system.categorie_parade || (armeData.system.isparade ? 'armes-naturelles' : '');
|
return armeData.system.categorie_parade || (armeData.system.isparade ? 'armes-naturelles' : '')
|
||||||
}
|
}
|
||||||
if (!armeData.type.match(/arme|competencecreature/)) {
|
if (!armeData.type.match(/arme|competencecreature/)) {
|
||||||
return '';
|
return ''
|
||||||
}
|
}
|
||||||
if (armeData.system.competence == undefined) {
|
if (armeData.system.competence == undefined) {
|
||||||
return ITEM_TYPES.competencecreature;
|
return ITEM_TYPES.competencecreature;
|
||||||
}
|
}
|
||||||
let compname = armeData.system.competence.toLowerCase();
|
let compname = armeData.system.competence.toLowerCase();
|
||||||
if (compname.match(/^(dague de jet|javelot|fouet|arc|arbalête|fronde|hache de jet|fléau)$/)) return '';
|
if (compname.match(/^(dague de jet|javelot|fouet|arc|arbalête|fronde|hache de jet|fléau)$/)) {
|
||||||
|
return ''
|
||||||
|
}
|
||||||
|
|
||||||
if (compname.match('hache')) return 'haches';
|
if (compname.match('hache')) return 'haches'
|
||||||
if (compname.match('hast')) return 'hast';
|
if (compname.match('hast')) return 'hast'
|
||||||
if (compname.match('lance')) return 'lances';
|
if (compname.match('lance')) return 'lances'
|
||||||
if (compname.match('bouclier')) return 'boucliers';
|
if (compname.match('bouclier')) return 'boucliers'
|
||||||
if (compname.match('masse')) return 'masses';
|
if (compname.match('masse')) return 'masses'
|
||||||
if (compname.match('epée') || compname.match('épée')) {
|
if (compname.match('epée') || compname.match('épée')) {
|
||||||
if (armeData.name.toLowerCase().match(/(gnome)/))
|
if (armeData.name.toLowerCase().match(/(gnome)/))
|
||||||
return 'epees-courtes';
|
return 'epees-courtes'
|
||||||
if (armeData.name.toLowerCase().match(/((e|é)pée dragone|esparlongue|demi-dragonne)/))
|
if (armeData.name.toLowerCase().match(/((e|é)pée dragone|esparlongue|demi-dragonne)/))
|
||||||
return 'epees-longues';
|
return 'epees-longues'
|
||||||
return 'epees-lourdes';
|
return 'epees-lourdes'
|
||||||
}
|
}
|
||||||
if (compname.match('dague')) {
|
if (compname.match('dague')) {
|
||||||
return 'dagues';
|
return 'dagues'
|
||||||
|
}
|
||||||
|
return 'sans-armes'
|
||||||
|
}
|
||||||
|
|
||||||
|
static defenseArmeParade(armeAttaque, armeParade) {
|
||||||
|
const defCategory = RdDItemArme.getCategorieParade(armeParade)
|
||||||
|
if (defCategory == 'bouclier') {
|
||||||
|
return 'norm'
|
||||||
|
}
|
||||||
|
if (armeAttaque.system.competence.toLowerCase().match(/(fléau)/)) {
|
||||||
|
return ''
|
||||||
|
}
|
||||||
|
if (armeParade.system.tir) {
|
||||||
|
return ''
|
||||||
|
}
|
||||||
|
const attCategory = RdDItemArme.getCategorieParade(armeAttaque)
|
||||||
|
switch (attCategory) {
|
||||||
|
case 'armes-naturelles': case 'sans-armes':
|
||||||
|
return defCategory == 'sans-armes' ? 'norm' : ''
|
||||||
|
default:
|
||||||
|
return RdDItemArme.needParadeSignificative(armeAttaque, armeParade) ? 'sign' : 'norm'
|
||||||
}
|
}
|
||||||
return 'sans-armes';
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
@ -120,8 +142,8 @@ export class RdDItemArme extends Item {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
// categories d'armes à la parade (cf. page 115 )
|
// categories d'armes à la parade (cf. page 115 )
|
||||||
let attCategory = RdDItemArme.getCategorieParade(armeAttaque);
|
const attCategory = RdDItemArme.getCategorieParade(armeAttaque)
|
||||||
let defCategory = RdDItemArme.getCategorieParade(armeParade);
|
const defCategory = RdDItemArme.getCategorieParade(armeParade)
|
||||||
// bouclier et mêmes catégorie: peuvent se parer sans difficulté
|
// bouclier et mêmes catégorie: peuvent se parer sans difficulté
|
||||||
if (defCategory == 'boucliers') {
|
if (defCategory == 'boucliers') {
|
||||||
return false;
|
return false;
|
||||||
|
@ -67,7 +67,7 @@ export class RdDItemBlessure extends RdDItem {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static async createBlessure(actor, gravite, localisation = '', attacker) {
|
static async createBlessure(actor, gravite, localisation = '', attackerToken) {
|
||||||
const definition = RdDItemBlessure.getDefinition(gravite)
|
const definition = RdDItemBlessure.getDefinition(gravite)
|
||||||
const blessure = {
|
const blessure = {
|
||||||
name: definition.label,
|
name: definition.label,
|
||||||
@ -77,7 +77,7 @@ export class RdDItemBlessure extends RdDItem {
|
|||||||
gravite: gravite,
|
gravite: gravite,
|
||||||
difficulte: - gravite,
|
difficulte: - gravite,
|
||||||
localisation: localisation,
|
localisation: localisation,
|
||||||
origine: attacker?.name ?? ""
|
origine: attackerToken?.name ?? ""
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
const blessures = await actor.createEmbeddedDocuments('Item', [blessure])
|
const blessures = await actor.createEmbeddedDocuments('Item', [blessure])
|
||||||
|
@ -139,7 +139,7 @@ export class Misc {
|
|||||||
}
|
}
|
||||||
|
|
||||||
static join(params, separator = '') {
|
static join(params, separator = '') {
|
||||||
return params?.reduce(Misc.joining(separator)) ?? '';
|
return (!params || params.length == 0) ? '' : params.reduce(Misc.joining(separator))
|
||||||
}
|
}
|
||||||
|
|
||||||
static joining(separator = '') {
|
static joining(separator = '') {
|
||||||
|
@ -42,7 +42,8 @@ export class RdDCombatManager extends Combat {
|
|||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
Hooks.on("getCombatTrackerEntryContext", (html, options) => { RdDCombatManager.pushInitiativeOptions(html, options); });
|
Hooks.on("getCombatTrackerEntryContext", (html, options) => { RdDCombatManager.pushInitiativeOptions(html, options); });
|
||||||
Hooks.on("updateCombat", (combat, change, options, userId) => { RdDCombat.onUpdateCombat(combat, change, options, userId) });
|
Hooks.on("updateCombat", (combat, change, options, userId) => { RdDCombat.onUpdateCombat(combat, change, options, userId) });
|
||||||
Hooks.on("preDeleteCombat", (combat, html, id) => { combat.onPreDeleteCombat() });
|
Hooks.on("preDeleteCombat", (combat, html, id) => { combat.onPreDeleteCombat() })
|
||||||
|
Hooks.on("deleteCombat", (combat, html, id) => { combat.onDeleteCombat() })
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
@ -61,20 +62,31 @@ export class RdDCombatManager extends Combat {
|
|||||||
RdDEmpoignade.deleteAllEmpoignades()
|
RdDEmpoignade.deleteAllEmpoignades()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
async onDeleteCombat() {
|
||||||
/* -------------------------------------------- */
|
if (Misc.isFirstConnectedGM()) {
|
||||||
async finDeRound(options = { terminer: false }) {
|
if (game.combats.size <= 1) {
|
||||||
this.turns.forEach(turn => turn.actor.resetItemUse());
|
game.actors.forEach(actor => actor.resetItemUse())
|
||||||
|
|
||||||
for (let combatant of this.combatants) {
|
|
||||||
if (combatant.actor) {
|
|
||||||
await combatant.actor.finDeRound(options);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
ui.notifications.warn(`Le combatant ${combatant.name} n'est pas associé à un acteur!`)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* -------------------------------------------- */
|
||||||
|
async finDeRound(options = { terminer: false }) {
|
||||||
|
|
||||||
|
for (let combatant of this.combatants) {
|
||||||
|
if (!combatant.actor) {
|
||||||
|
ui.notifications.warn(`Le combatant ${combatant.name} n'est pas associé à un acteur!`)
|
||||||
|
}
|
||||||
|
else if (!combatant.actor.isActorCombat()) {
|
||||||
|
ui.notifications.warn(`Le combatant ${combatant.name} ne peut pas combattre!`)
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
await combatant.actor.finDeRound(options)
|
||||||
|
await combatant.actor.resetItemUse()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static calculAjustementInit(actor, arme) {
|
static calculAjustementInit(actor, arme) {
|
||||||
const efficacite = (arme?.system.magique) ? arme.system.ecaille_efficacite : 0
|
const efficacite = (arme?.system.magique) ? arme.system.ecaille_efficacite : 0
|
||||||
const etatGeneral = actor.getEtatGeneral() ?? 0
|
const etatGeneral = actor.getEtatGeneral() ?? 0
|
||||||
@ -125,7 +137,6 @@ export class RdDCombatManager extends Combat {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
//console.log("Combatat", c);
|
|
||||||
const roll = combatant.getInitiativeRoll(rollFormula);
|
const roll = combatant.getInitiativeRoll(rollFormula);
|
||||||
if (!roll.total) {
|
if (!roll.total) {
|
||||||
await roll.evaluate();
|
await roll.evaluate();
|
||||||
@ -236,29 +247,12 @@ export class RdDCombatManager extends Combat {
|
|||||||
return attaque;
|
return attaque;
|
||||||
}
|
}
|
||||||
|
|
||||||
static listActionsCreature(competences) {
|
|
||||||
return competences
|
|
||||||
.filter(it => RdDItemCompetenceCreature.isCompetenceAttaque(it))
|
|
||||||
.map(it => RdDItemCompetenceCreature.armeCreature(it))
|
|
||||||
.filter(it => it != undefined);
|
|
||||||
}
|
|
||||||
|
|
||||||
static listActionsPossessions(actor) {
|
|
||||||
return RdDCombatManager._indexActions(actor.getPossessions().map(p => {
|
|
||||||
return {
|
|
||||||
name: p.name,
|
|
||||||
action: 'possession',
|
|
||||||
system: {
|
|
||||||
competence: p.name,
|
|
||||||
possessionid: p.system.possessionid,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}));
|
|
||||||
}
|
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static listActionsCombat(combatant) {
|
static listActionsCombat(combatant) {
|
||||||
const actor = combatant.actor;
|
const actor = combatant.actor;
|
||||||
|
if (!actor.isActorCombat()) {
|
||||||
|
return
|
||||||
|
}
|
||||||
let actions = RdDCombatManager.listActionsPossessions(actor);
|
let actions = RdDCombatManager.listActionsPossessions(actor);
|
||||||
if (actions.length > 0) {
|
if (actions.length > 0) {
|
||||||
return actions;
|
return actions;
|
||||||
@ -281,6 +275,26 @@ export class RdDCombatManager extends Combat {
|
|||||||
return RdDCombatManager._indexActions(actions);
|
return RdDCombatManager._indexActions(actions);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static listActionsCreature(competences) {
|
||||||
|
return competences
|
||||||
|
.filter(it => RdDItemCompetenceCreature.isCompetenceAttaque(it))
|
||||||
|
.map(it => RdDItemCompetenceCreature.armeCreature(it))
|
||||||
|
.filter(it => it != undefined);
|
||||||
|
}
|
||||||
|
|
||||||
|
static listActionsPossessions(actor) {
|
||||||
|
return RdDCombatManager._indexActions(actor.getPossessions().map(p => {
|
||||||
|
return {
|
||||||
|
name: p.name,
|
||||||
|
action: 'possession',
|
||||||
|
system: {
|
||||||
|
competence: p.name,
|
||||||
|
possessionid: p.system.possessionid,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
|
||||||
static _indexActions(actions) {
|
static _indexActions(actions) {
|
||||||
for (let index = 0; index < actions.length; index++) {
|
for (let index = 0; index < actions.length; index++) {
|
||||||
actions[index].index = index;
|
actions[index].index = index;
|
||||||
@ -457,8 +471,8 @@ export class RdDCombat {
|
|||||||
if (Misc.isFirstConnectedGM()) {
|
if (Misc.isFirstConnectedGM()) {
|
||||||
let turn = combat.turns.find(t => t.token?.id == combat.current.tokenId);
|
let turn = combat.turns.find(t => t.token?.id == combat.current.tokenId);
|
||||||
if (turn?.actor) {
|
if (turn?.actor) {
|
||||||
RdDCombat.displayActorCombatStatus(combat, turn.actor, turn.token);
|
|
||||||
// TODO Playaudio for player??
|
// TODO Playaudio for player??
|
||||||
|
RdDCombat.displayActorCombatStatus(combat, turn.actor, turn.token);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -918,7 +932,7 @@ export class RdDCombat {
|
|||||||
// # utilisation esquive
|
// # utilisation esquive
|
||||||
const corpsACorps = this.defender.getCompetenceCorpsACorps({ onMessage: it => console.info(it, this.defender) });
|
const corpsACorps = this.defender.getCompetenceCorpsACorps({ onMessage: it => console.info(it, this.defender) });
|
||||||
const esquives = foundry.utils.duplicate(this.defender.getCompetencesEsquive())
|
const esquives = foundry.utils.duplicate(this.defender.getCompetencesEsquive())
|
||||||
esquives.forEach(e => e.system.nbUsage = e?._id ? this.defender.getItemUse(e._id) : 0);
|
esquives.forEach(e => e.nbUsage = e?._id ? this.defender.getItemUse(e._id) : 0);
|
||||||
|
|
||||||
const paramChatDefense = {
|
const paramChatDefense = {
|
||||||
passeArme: attackerRoll.passeArme,
|
passeArme: attackerRoll.passeArme,
|
||||||
@ -978,20 +992,21 @@ export class RdDCombat {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
_filterArmesParade(defender, competence) {
|
_filterArmesParade(defender, competence, arme) {
|
||||||
let items = defender.items.filter(it => RdDItemArme.isArmeUtilisable(it) || RdDItemCompetenceCreature.isCompetenceParade(it))
|
let defenses = defender.items.filter(it => RdDItemArme.isArmeUtilisable(it) || RdDItemCompetenceCreature.isCompetenceParade(it))
|
||||||
items.forEach(item => item.system.nbUsage = defender.getItemUse(item.id)); // Ajout du # d'utilisation ce round
|
defenses = foundry.utils.duplicate(defenses)
|
||||||
|
defenses.forEach(armeDefense => {
|
||||||
|
// Ajout du # d'utilisation ce round
|
||||||
|
armeDefense.nbUsage = defender.getItemUse(armeDefense.id)
|
||||||
|
armeDefense.typeParade = RdDItemArme.defenseArmeParade(arme, armeDefense)
|
||||||
|
})
|
||||||
|
|
||||||
switch (competence.system.categorie) {
|
switch (competence.system.categorie) {
|
||||||
case 'tir':
|
case 'tir':
|
||||||
case 'lancer':
|
case 'lancer':
|
||||||
return items.filter(item => RdDItemArme.getCategorieParade(item) == 'boucliers')
|
return defenses.filter(armeDefense => RdDItemArme.getCategorieParade(armeDefense) == 'boucliers')
|
||||||
default:
|
default:
|
||||||
// Le fléau ne peut être paré qu’au bouclier p115
|
return defenses.filter(armeDefense => armeDefense.typeParade != '')
|
||||||
if (competence.name == "Fléau") {
|
|
||||||
return items.filter(item => RdDItemArme.getCategorieParade(item) == 'boucliers')
|
|
||||||
}
|
|
||||||
return items.filter(item => RdDItemArme.getCategorieParade(item));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1335,11 +1350,14 @@ export class RdDCombat {
|
|||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static async displayActorCombatStatus(combat, actor, token) {
|
static async displayActorCombatStatus(combat, actor, token) {
|
||||||
|
if (!actor?.isActorCombat()) {
|
||||||
|
return
|
||||||
|
}
|
||||||
let formData = {
|
let formData = {
|
||||||
combatId: combat._id,
|
combatId: combat._id,
|
||||||
alias: token.name ?? actor.name,
|
alias: token.name ?? actor.name,
|
||||||
etatGeneral: actor.getEtatGeneral(),
|
etatGeneral: actor.getEtatGeneral(),
|
||||||
isSonne: actor.getSonne(),
|
isSonne: actor.isSonne(),
|
||||||
blessuresStatus: actor.computeResumeBlessure(),
|
blessuresStatus: actor.computeResumeBlessure(),
|
||||||
SConst: actor.getSConst(),
|
SConst: actor.getSConst(),
|
||||||
actorId: actor.id,
|
actorId: actor.id,
|
||||||
|
@ -68,6 +68,7 @@ import { OptionsAvancees } from "./settings/options-avancees.js"
|
|||||||
import { ExportScriptarium } from "./actor/export-scriptarium/export-scriptarium.js"
|
import { ExportScriptarium } from "./actor/export-scriptarium/export-scriptarium.js"
|
||||||
import { AppPersonnageAleatoire } from "./actor/random/app-personnage-aleatoire.js"
|
import { AppPersonnageAleatoire } from "./actor/random/app-personnage-aleatoire.js"
|
||||||
import { RdDActorExportSheet } from "./actor/export-scriptarium/actor-encart-sheet.js"
|
import { RdDActorExportSheet } from "./actor/export-scriptarium/actor-encart-sheet.js"
|
||||||
|
import { RdDStatBlockParser } from "./apps/rdd-import-stats.js"
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* RdD system
|
* RdD system
|
||||||
@ -87,6 +88,7 @@ export class SystemReveDeDragon {
|
|||||||
this.config = RDD_CONFIG
|
this.config = RDD_CONFIG
|
||||||
this.RdDUtility = RdDUtility
|
this.RdDUtility = RdDUtility
|
||||||
this.RdDHotbar = RdDHotbar
|
this.RdDHotbar = RdDHotbar
|
||||||
|
this.RdDStatBlockParser = RdDStatBlockParser
|
||||||
this.itemClasses = {
|
this.itemClasses = {
|
||||||
armure: RdDItemArmure,
|
armure: RdDItemArmure,
|
||||||
blessure: RdDItemBlessure,
|
blessure: RdDItemBlessure,
|
||||||
@ -292,6 +294,8 @@ export class SystemReveDeDragon {
|
|||||||
StatusEffects.onReady()
|
StatusEffects.onReady()
|
||||||
RdDHerbes.onReady()
|
RdDHerbes.onReady()
|
||||||
RdDDice.onReady()
|
RdDDice.onReady()
|
||||||
|
|
||||||
|
RdDStatBlockParser.parseStatBlock()
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
/* Affiche/Init le calendrier */
|
/* Affiche/Init le calendrier */
|
||||||
game.system.rdd.calendrier.display()
|
game.system.rdd.calendrier.display()
|
||||||
|
@ -609,12 +609,12 @@ export class RdDUtility {
|
|||||||
const encaissement = RdDUtility._selectEncaissement(jetTotal, rollData.dmg.mortalite);
|
const encaissement = RdDUtility._selectEncaissement(jetTotal, rollData.dmg.mortalite);
|
||||||
const over20 = Math.max(jetTotal - 20, 0);
|
const over20 = Math.max(jetTotal - 20, 0);
|
||||||
encaissement.dmg = rollData.dmg
|
encaissement.dmg = rollData.dmg
|
||||||
if (ReglesOptionnelles.isUsing('localisation-aleatoire')){
|
if (ReglesOptionnelles.isUsing('localisation-aleatoire')) {
|
||||||
encaissement.dmg.loc = rollData.dmg.loc ?? await RdDUtility.getLocalisation(actor.type)
|
encaissement.dmg.loc = rollData.dmg.loc ?? await RdDUtility.getLocalisation(actor.type)
|
||||||
encaissement.dmg.loc.label = encaissement.dmg.loc.label ?? 'Corps;'
|
encaissement.dmg.loc.label = encaissement.dmg.loc.label ?? 'Corps;'
|
||||||
}
|
}
|
||||||
else{
|
else {
|
||||||
encaissement.dmg.loc = {label:''}
|
encaissement.dmg.loc = { label: '' }
|
||||||
}
|
}
|
||||||
encaissement.dmg.bonusDegatsDiffLibre = bonusDegatsDiffLibre
|
encaissement.dmg.bonusDegatsDiffLibre = bonusDegatsDiffLibre
|
||||||
encaissement.roll = roll;
|
encaissement.roll = roll;
|
||||||
@ -749,7 +749,7 @@ export class RdDUtility {
|
|||||||
static getSelectedToken(actor) {
|
static getSelectedToken(actor) {
|
||||||
if (canvas.tokens.controlled.length > 0) {
|
if (canvas.tokens.controlled.length > 0) {
|
||||||
const tokens = canvas.tokens.controlled
|
const tokens = canvas.tokens.controlled
|
||||||
.filter(it => it.actor.id == actor.id)
|
.filter(it => it.actor.id == actor.id)
|
||||||
return tokens[0]
|
return tokens[0]
|
||||||
}
|
}
|
||||||
return undefined
|
return undefined
|
||||||
@ -881,10 +881,10 @@ export class RdDUtility {
|
|||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static afficherHeuresChanceMalchance(heureNaissance) {
|
static afficherHeuresChanceMalchance(heureNaissance) {
|
||||||
if (game.user.isGM) {
|
if (game.user.isGM) {
|
||||||
const heure = RdDTimestamp.findHeure(heureNaissance - 1);
|
const heure = RdDTimestamp.findHeure(heureNaissance)
|
||||||
if (heureNaissance && heure) {
|
if (heureNaissance && heure) {
|
||||||
let ajustement = game.system.rdd.calendrier.getAjustementAstrologique(heureNaissance);
|
const ajustement = game.system.rdd.calendrier.getAjustementAstrologique(heureNaissance)
|
||||||
const current = game.system.rdd.calendrier.heureCourante();
|
const current = game.system.rdd.calendrier.heureCourante()
|
||||||
ChatMessage.create({
|
ChatMessage.create({
|
||||||
content: `A l'heure de <strong>${current.label}</strong>, le modificateur de Chance/Malchance est de <strong>${Misc.toSignedString(ajustement)}</strong> pour l'heure de naissance <strong>${heure.label}</strong>.`,
|
content: `A l'heure de <strong>${current.label}</strong>, le modificateur de Chance/Malchance est de <strong>${Misc.toSignedString(ajustement)}</strong> pour l'heure de naissance <strong>${heure.label}</strong>.`,
|
||||||
whisper: ChatUtility.getGMs()
|
whisper: ChatUtility.getGMs()
|
||||||
|
@ -160,15 +160,21 @@ export class RdDTimestamp {
|
|||||||
}
|
}
|
||||||
|
|
||||||
static findHeure(heure) {
|
static findHeure(heure) {
|
||||||
heure = Grammar.toLowerCaseNoAccentNoSpace(heure);
|
let filtered
|
||||||
let parHeureOuLabel = DEFINITION_HEURES.filter(it => Grammar.toLowerCaseNoAccentNoSpace(it.label) == heure || it.heure == Misc.modulo(parseInt(heure), RDD_HEURES_PAR_JOUR));
|
if (Number.isInteger(Number(heure))) {
|
||||||
if (parHeureOuLabel.length == 1) {
|
filtered = DEFINITION_HEURES.filter(it => it.heure == Misc.modulo(Number(heure) - 1, RDD_HEURES_PAR_JOUR))
|
||||||
return parHeureOuLabel[0];
|
|
||||||
}
|
}
|
||||||
let parLabelPartiel = DEFINITION_HEURES.filter(it => Grammar.toLowerCaseNoAccentNoSpace(it.label).includes(heure));
|
else {
|
||||||
if (parLabelPartiel.length > 0) {
|
heure = Grammar.toLowerCaseNoAccentNoSpace(heure);
|
||||||
parLabelPartiel.sort(Misc.ascending(h => h.label.length));
|
filtered = DEFINITION_HEURES.filter(it => Grammar.toLowerCaseNoAccentNoSpace(it.label) == heure || it.heure == Misc.modulo(parseInt(heure), RDD_HEURES_PAR_JOUR));
|
||||||
return parLabelPartiel[0];
|
}
|
||||||
|
if (filtered.length == 1) {
|
||||||
|
return filtered[0]
|
||||||
|
}
|
||||||
|
filtered = DEFINITION_HEURES.filter(it => Grammar.toLowerCaseNoAccentNoSpace(it.label).includes(heure));
|
||||||
|
if (filtered.length > 0) {
|
||||||
|
filtered.sort(Misc.ascending(h => h.label.length));
|
||||||
|
return filtered[0]
|
||||||
}
|
}
|
||||||
return undefined;
|
return undefined;
|
||||||
}
|
}
|
||||||
|
@ -65,6 +65,7 @@
|
|||||||
{"_id":"MQxgfYTEQEUhG116","name":"Épée bâtarde","type":"arme","img":"systems/foundryvtt-reve-de-dragon/icons/armes_armures/epee_batarde.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.MQxgfYTEQEUhG116"}},"system":{"description":"<p>Comme son nom l’indique, c’est une <em>bâtarde </em>de l'épée longue et de l'épée sorde, à la fois longue et large, pouvant s’utiliser à une ou deux mains.</p>","descriptionmj":"","equipe":false,"encombrement":3,"quantite":1,"qualite":0,"cout":30,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Rarissime","frequence":2},{"milieu":"Villes","rarete":"Rare","frequence":6}],"resistance":14,"categorie_parade":"epees-lourdes","dommages":"4/5","penetration":0,"force":"13/12","competence":"Epée à 1 main","lancer":"","tir":"","portee_courte":0,"portee_moyenne":0,"portee_extreme":0,"magique":false,"ecaille_efficacite":null,"resistance_magique":null,"rapide":false,"deuxmains":true,"unemain":true,"initpremierround":"epeebatarde"},"ownership":{"default":0,"Q4cUvqxCxMoTJXDL":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206023,"modifiedTime":1676074487966,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"MQxgfYTEQEUhG116","name":"Épée bâtarde","type":"arme","img":"systems/foundryvtt-reve-de-dragon/icons/armes_armures/epee_batarde.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.MQxgfYTEQEUhG116"}},"system":{"description":"<p>Comme son nom l’indique, c’est une <em>bâtarde </em>de l'épée longue et de l'épée sorde, à la fois longue et large, pouvant s’utiliser à une ou deux mains.</p>","descriptionmj":"","equipe":false,"encombrement":3,"quantite":1,"qualite":0,"cout":30,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Rarissime","frequence":2},{"milieu":"Villes","rarete":"Rare","frequence":6}],"resistance":14,"categorie_parade":"epees-lourdes","dommages":"4/5","penetration":0,"force":"13/12","competence":"Epée à 1 main","lancer":"","tir":"","portee_courte":0,"portee_moyenne":0,"portee_extreme":0,"magique":false,"ecaille_efficacite":null,"resistance_magique":null,"rapide":false,"deuxmains":true,"unemain":true,"initpremierround":"epeebatarde"},"ownership":{"default":0,"Q4cUvqxCxMoTJXDL":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206023,"modifiedTime":1676074487966,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"Mbh2M8JS1Rf0vxEX","name":"Harpe","type":"objet","img":"systems/foundryvtt-reve-de-dragon/icons/objets/harpe.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.Mbh2M8JS1Rf0vxEX"}},"system":{"description":"","descriptionmj":"","encombrement":1,"quantite":1,"qualite":0,"cout":5,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Rarissime","frequence":2},{"milieu":"Villes","rarete":"Rare","frequence":6}],"equipe":false,"resistance":1},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206023,"modifiedTime":1676074487966,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"Mbh2M8JS1Rf0vxEX","name":"Harpe","type":"objet","img":"systems/foundryvtt-reve-de-dragon/icons/objets/harpe.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.Mbh2M8JS1Rf0vxEX"}},"system":{"description":"","descriptionmj":"","encombrement":1,"quantite":1,"qualite":0,"cout":5,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Rarissime","frequence":2},{"milieu":"Villes","rarete":"Rare","frequence":6}],"equipe":false,"resistance":1},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206023,"modifiedTime":1676074487966,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"NCp2kdTKmQGyAh1U","name":"Dague","type":"arme","img":"systems/foundryvtt-reve-de-dragon/icons/armes_armures/dague.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sheetClass":"","sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.NCp2kdTKmQGyAh1U"}},"system":{"description":"","descriptionmj":"","equipe":false,"encombrement":0.5,"quantite":1,"qualite":0,"cout":3,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Frequente","frequence":18},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"resistance":8,"categorie_parade":"dagues","dommages":"1","penetration":0,"force":"7","competence":"Dague","lancer":"Dague de jet","tir":"","portee_courte":3,"portee_moyenne":8,"portee_extreme":15,"magique":false,"ecaille_efficacite":null,"resistance_magique":null,"rapide":true,"deuxmains":false,"unemain":true,"initpremierround":"dague"},"ownership":{"default":0,"Q4cUvqxCxMoTJXDL":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206023,"modifiedTime":1676074487966,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"NCp2kdTKmQGyAh1U","name":"Dague","type":"arme","img":"systems/foundryvtt-reve-de-dragon/icons/armes_armures/dague.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sheetClass":"","sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.NCp2kdTKmQGyAh1U"}},"system":{"description":"","descriptionmj":"","equipe":false,"encombrement":0.5,"quantite":1,"qualite":0,"cout":3,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Frequente","frequence":18},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"resistance":8,"categorie_parade":"dagues","dommages":"1","penetration":0,"force":"7","competence":"Dague","lancer":"Dague de jet","tir":"","portee_courte":3,"portee_moyenne":8,"portee_extreme":15,"magique":false,"ecaille_efficacite":null,"resistance_magique":null,"rapide":true,"deuxmains":false,"unemain":true,"initpremierround":"dague"},"ownership":{"default":0,"Q4cUvqxCxMoTJXDL":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206023,"modifiedTime":1676074487966,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
|
{"_id":"NCp2kdTKmJVdFuit","name":"Dague mêlée","type":"arme","img":"systems/foundryvtt-reve-de-dragon/icons/armes_armures/dague.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sheetClass":"","sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.NCp2kdTKmQGyAh1U"}},"system":{"description":"","descriptionmj":"","equipe":false,"encombrement":0.5,"quantite":1,"qualite":0,"cout":3,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Frequente","frequence":18},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"resistance":8,"categorie_parade":"dagues","dommages":"1","penetration":0,"force":"7","competence":"Dague","lancer":"Dague de jet","tir":"","portee_courte":3,"portee_moyenne":8,"portee_extreme":15,"magique":false,"ecaille_efficacite":null,"resistance_magique":null,"rapide":true,"deuxmains":false,"unemain":true,"initpremierround":"dague"},"ownership":{"default":0,"Q4cUvqxCxMoTJXDL":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206023,"modifiedTime":1676074487966,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"NNLhxjFsoJVdFuit","name":"Bouteille de verre (1 litre)","type":"conteneur","img":"systems/foundryvtt-reve-de-dragon/icons/objets/bouteille_verre.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.NNLhxjFsoJVdFuit"}},"system":{"description":"","descriptionmj":"","encombrement":0.2,"quantite":1,"qualite":0,"cout":0.7,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Rare","frequence":6},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"contenu":[],"capacite":0.5,"equipe":false},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206023,"modifiedTime":1676074487966,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"NNLhxjFsoJVdFuit","name":"Bouteille de verre (1 litre)","type":"conteneur","img":"systems/foundryvtt-reve-de-dragon/icons/objets/bouteille_verre.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.NNLhxjFsoJVdFuit"}},"system":{"description":"","descriptionmj":"","encombrement":0.2,"quantite":1,"qualite":0,"cout":0.7,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Rare","frequence":6},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"contenu":[],"capacite":0.5,"equipe":false},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206023,"modifiedTime":1676074487966,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"OXFFRZOqlhZDJas3","name":"Béret de velours","type":"objet","img":"systems/foundryvtt-reve-de-dragon/icons/objets/beret_velours.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.OXFFRZOqlhZDJas3"}},"system":{"description":"","descriptionmj":"","encombrement":0.05,"quantite":1,"qualite":0,"cout":3,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Rare","frequence":6},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"equipe":false,"resistance":1},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206023,"modifiedTime":1676074487966,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"OXFFRZOqlhZDJas3","name":"Béret de velours","type":"objet","img":"systems/foundryvtt-reve-de-dragon/icons/objets/beret_velours.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.OXFFRZOqlhZDJas3"}},"system":{"description":"","descriptionmj":"","encombrement":0.05,"quantite":1,"qualite":0,"cout":3,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Rare","frequence":6},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"equipe":false,"resistance":1},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206023,"modifiedTime":1676074487966,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"OYWzXiQUFsjU5AF2","name":"Perles de Bjwal","type":"potion","img":"systems/foundryvtt-reve-de-dragon/icons/objets/perles_bjwal.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.OYWzXiQUFsjU5AF2"}},"system":{"description":"<p>Petits granulés translucides.</p>","descriptionmj":"","encombrement":0.1,"quantite":1,"qualite":0,"cout":1,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Rarissime","frequence":2},{"milieu":"Villes","rarete":"Rare","frequence":6}],"temporel":{"debut":{"indexDate":-1,"indexMinute":0},"fin":{"indexDate":-1,"indexMinute":0}},"rarete":"","categorie":"Remede","herbe":"","herbebrins":0,"herbebonus":0,"reposalchimique":false,"pr":0,"prpermanent":false,"prdate":0,"soinherbe":"","soinherbebonus":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206023,"modifiedTime":1676074487966,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"OYWzXiQUFsjU5AF2","name":"Perles de Bjwal","type":"potion","img":"systems/foundryvtt-reve-de-dragon/icons/objets/perles_bjwal.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.OYWzXiQUFsjU5AF2"}},"system":{"description":"<p>Petits granulés translucides.</p>","descriptionmj":"","encombrement":0.1,"quantite":1,"qualite":0,"cout":1,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Rarissime","frequence":2},{"milieu":"Villes","rarete":"Rare","frequence":6}],"temporel":{"debut":{"indexDate":-1,"indexMinute":0},"fin":{"indexDate":-1,"indexMinute":0}},"rarete":"","categorie":"Remede","herbe":"","herbebrins":0,"herbebonus":0,"reposalchimique":false,"pr":0,"prpermanent":false,"prdate":0,"soinherbe":"","soinherbebonus":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206023,"modifiedTime":1676074487966,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
|
@ -11,4 +11,3 @@
|
|||||||
{"name":"Thème astral","type":"script","scope":"global","author":"Hp9ImM4o9YRTSdfu","img":"icons/magic/nature/symbol-moon-stars-white.webp","command":"game.system.rdd.AppAstrologie.create()","ownership":{"default":0,"Hp9ImM4o9YRTSdfu":3},"flags":{"core":{"sourceId":"Macro.oA0HPFeFK6YMspAX"}},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.19","coreVersion":"10.291","createdTime":1678127868791,"modifiedTime":1678237392810,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"},"folder":null,"sort":0,"_id":"koqhiDJSGP4gQ4vf"}
|
{"name":"Thème astral","type":"script","scope":"global","author":"Hp9ImM4o9YRTSdfu","img":"icons/magic/nature/symbol-moon-stars-white.webp","command":"game.system.rdd.AppAstrologie.create()","ownership":{"default":0,"Hp9ImM4o9YRTSdfu":3},"flags":{"core":{"sourceId":"Macro.oA0HPFeFK6YMspAX"}},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.19","coreVersion":"10.291","createdTime":1678127868791,"modifiedTime":1678237392810,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"},"folder":null,"sort":0,"_id":"koqhiDJSGP4gQ4vf"}
|
||||||
{"name":"Jet d'éthylisme","type":"script","scope":"global","author":"Hp9ImM4o9YRTSdfu","img":"icons/consumables/drinks/alcohol-beer-stein-wooden-metal-brown.webp","command":"const selected = game.system.rdd.RdDUtility.getSelectedActor();\nif (selected) {\n selected.jetEthylisme();\n}\nelse {\n ui.notifications.info('Pas de personnage sélectionné');\n}","ownership":{"default":0,"Hp9ImM4o9YRTSdfu":3},"flags":{"core":{"sourceId":"Macro.XHNbjnGKXaCiCadq"}},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"11.1.0","coreVersion":"10.291","createdTime":1671220038331,"modifiedTime":1671233646086,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"},"folder":null,"sort":0,"_id":"mvub1dRHNFmWjRr7"}
|
{"name":"Jet d'éthylisme","type":"script","scope":"global","author":"Hp9ImM4o9YRTSdfu","img":"icons/consumables/drinks/alcohol-beer-stein-wooden-metal-brown.webp","command":"const selected = game.system.rdd.RdDUtility.getSelectedActor();\nif (selected) {\n selected.jetEthylisme();\n}\nelse {\n ui.notifications.info('Pas de personnage sélectionné');\n}","ownership":{"default":0,"Hp9ImM4o9YRTSdfu":3},"flags":{"core":{"sourceId":"Macro.XHNbjnGKXaCiCadq"}},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"11.1.0","coreVersion":"10.291","createdTime":1671220038331,"modifiedTime":1671233646086,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"},"folder":null,"sort":0,"_id":"mvub1dRHNFmWjRr7"}
|
||||||
{"name":"Tirer le tarot","type":"chat","scope":"global","author":"Hp9ImM4o9YRTSdfu","img":"systems/foundryvtt-reve-de-dragon/icons/tarots/dos-tarot.webp","command":"/tirer tarot","ownership":{"default":0,"Hp9ImM4o9YRTSdfu":3},"flags":{"core":{"sourceId":"Macro.HBZSKR9OHCQbLcTC"}},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"11.1.0","coreVersion":"10.291","createdTime":1669469547231,"modifiedTime":1671237401618,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"},"folder":null,"sort":0,"_id":"vTfJTFYYiRu8X5LM"}
|
{"name":"Tirer le tarot","type":"chat","scope":"global","author":"Hp9ImM4o9YRTSdfu","img":"systems/foundryvtt-reve-de-dragon/icons/tarots/dos-tarot.webp","command":"/tirer tarot","ownership":{"default":0,"Hp9ImM4o9YRTSdfu":3},"flags":{"core":{"sourceId":"Macro.HBZSKR9OHCQbLcTC"}},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"11.1.0","coreVersion":"10.291","createdTime":1669469547231,"modifiedTime":1671237401618,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"},"folder":null,"sort":0,"_id":"vTfJTFYYiRu8X5LM"}
|
||||||
{"name": "Mon personnage","type": "script","author": "Hp9ImM4o9YRTSdfu","img": "systems/foundryvtt-reve-de-dragon/icons/voyageurs/token_hr_dilettante.webp","scope": "global","command": "if (game.user.isGM) {\n ui.notifications.warn(\"En tant que gardien, vous n'avez pas de personnage attitré\")\n return\n}\nconst actor = game.users.get(game.userId)?.character\nif (!actor) {\n ui.notifications.warn(\"Vous n'avez pas de personnage attitré\")\n return\n}\nactor.sheet.render(true)","folder": null,"flags": {"core": {},"exportSource": {"world": "graine","system": "foundryvtt-reve-de-dragon","coreVersion": "11.313","systemVersion": "11.1.1"}},"_stats": {"systemId": "foundryvtt-reve-de-dragon","systemVersion": "11.1.1","coreVersion": "11.313","createdTime": 1699477824379,"modifiedTime": 1699485023429,"lastModifiedBy": "Hp9ImM4o9YRTSdfu"}}
|
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
{
|
{
|
||||||
"id": "foundryvtt-reve-de-dragon",
|
"id": "foundryvtt-reve-de-dragon",
|
||||||
"title": "Rêve de Dragon",
|
"title": "Rêve de Dragon",
|
||||||
"version": "12.0.17",
|
"version": "12.0.18",
|
||||||
"download": "https://www.uberwald.me/gitea/public/foundryvtt-reve-de-dragon/archive/foundryvtt-reve-de-dragon-12.0.17.zip",
|
"download": "https://www.uberwald.me/gitea/public/foundryvtt-reve-de-dragon/archive/foundryvtt-reve-de-dragon-12.0.18.zip",
|
||||||
"manifest": "https://www.uberwald.me/gitea/public/foundryvtt-reve-de-dragon/raw/v11/system.json",
|
"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",
|
"changelog": "https://www.uberwald.me/gitea/public/foundryvtt-reve-de-dragon/raw/branch/v11/changelog.md",
|
||||||
"compatibility": {
|
"compatibility": {
|
||||||
|
@ -25,7 +25,7 @@
|
|||||||
<span class="competence-value">{{plusMoins arme.system.niveau}}</span>
|
<span class="competence-value">{{plusMoins arme.system.niveau}}</span>
|
||||||
<span class="competence-value">{{plusMoins arme.system.dommagesReels}}</span>
|
<span class="competence-value">{{plusMoins arme.system.dommagesReels}}</span>
|
||||||
<span class="competence-value"></span>
|
<span class="competence-value"></span>
|
||||||
<span class="initiative-value arme-initiative"><a data-tooltip="{{arme.name}}: initiative {{arme.system.initiative}}">{{arme.system.initiative}}</a></span>
|
<span class="initiative-value"><a class="roll-init-arme" data-tooltip="{{arme.name}}: initiative {{arme.system.initiative}}">{{arme.system.initiative}}</a></span>
|
||||||
</li>
|
</li>
|
||||||
{{/each}}
|
{{/each}}
|
||||||
{{#each esquives as |esq key|}}
|
{{#each esquives as |esq key|}}
|
||||||
|
@ -10,7 +10,11 @@
|
|||||||
<div class="flexrow">
|
<div class="flexrow">
|
||||||
<div>{{niveau}}</div>
|
<div>{{niveau}}</div>
|
||||||
{{#if init}}
|
{{#if init}}
|
||||||
<div>{{init}}</div>
|
{{#if name}}
|
||||||
|
<div><a class="roll-init-arme">{{init}}</a></div>
|
||||||
|
{{else}}
|
||||||
|
<div>{{init}}</div>
|
||||||
|
{{/if}}
|
||||||
<div>{{dommages}}</div>
|
<div>{{dommages}}</div>
|
||||||
{{else}}
|
{{else}}
|
||||||
<div></div>
|
<div></div>
|
||||||
|
@ -11,8 +11,6 @@
|
|||||||
<a class="{{button-name}}-plus"><i class="fa-regular fa-square-plus"></i></a>
|
<a class="{{button-name}}-plus"><i class="fa-regular fa-square-plus"></i></a>
|
||||||
</div>
|
</div>
|
||||||
<div class="flex-group-right">
|
<div class="flex-group-right">
|
||||||
{{log carac.colName carac.value (eq carac.value actuel.value) actuel.value}}
|
|
||||||
{{log carac.colName carac.value (eq 1 1) actuel.value}}
|
|
||||||
<a class="{{actuel.rollClass}}" data-carac-name="{{actuel.column}}">{{carac.value}} {{#unless (eq carac.value actuel.value)}}(Actuel : {{actuel.value}}){{/unless}}</a>
|
<a class="{{actuel.rollClass}}" data-carac-name="{{actuel.column}}">{{carac.value}} {{#unless (eq carac.value actuel.value)}}(Actuel : {{actuel.value}}){{/unless}}</a>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -2,7 +2,11 @@
|
|||||||
<div>
|
<div>
|
||||||
{{upperFirst carac.colName}}
|
{{upperFirst carac.colName}}
|
||||||
<a class="{{carac.column}}-moins"><i class="fa-regular fa-square-minus"></i></a>
|
<a class="{{carac.column}}-moins"><i class="fa-regular fa-square-minus"></i></a>
|
||||||
|
{{#if (eq carac.value actuel.value)}}
|
||||||
|
<i class="fa-regular fa-square"></i>
|
||||||
|
{{else}}
|
||||||
<a class="{{carac.column}}-plus"><i class="fa-regular fa-square-plus"></i></a>
|
<a class="{{carac.column}}-plus"><i class="fa-regular fa-square-plus"></i></a>
|
||||||
|
{{/if}}
|
||||||
</div>
|
</div>
|
||||||
<div class="flex-group-right">
|
<div class="flex-group-right">
|
||||||
<a class="{{actuel.rollClass}}" data-carac-name="{{actuel.column}}">{{carac.value}} {{#unless (eq carac.value actuel.value)}}(Actuel : {{actuel.value}}){{/unless}}</a>
|
<a class="{{actuel.rollClass}}" data-carac-name="{{actuel.column}}">{{carac.value}} {{#unless (eq carac.value actuel.value)}}(Actuel : {{actuel.value}}){{/unless}}</a>
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
<div class="flexrow item" data-item-id="{{competence._id}}">
|
<div class="flexrow item" data-item-id="{{competence._id}}">
|
||||||
<a class="roll-competence" name="Esquive">{{upperFirst name}}</a>
|
<a class="roll-competence" name="Esquive">{{upperFirst name}}</a>
|
||||||
<div class="flexrow">
|
<div class="flexrow">
|
||||||
<div>{{niveau}}</div>
|
<div>{{numberFormat competence.system.niveau decimals=0 sign=true}}</div>
|
||||||
<div></div>
|
<div></div>
|
||||||
<div></div>
|
<div></div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -3,7 +3,11 @@
|
|||||||
{{#if etat.fatigue.malus}}
|
{{#if etat.fatigue.malus}}
|
||||||
({{etat.fatigue.malus}})
|
({{etat.fatigue.malus}})
|
||||||
{{/if}}
|
{{/if}}
|
||||||
|
{{#if (eq etat.fatigue.value 0)}}
|
||||||
|
<i class="fa-regular fa-square"></i>
|
||||||
|
{{else}}
|
||||||
<a class="fatigue-moins"><i class="fa-regular fa-square-minus"></i></a>
|
<a class="fatigue-moins"><i class="fa-regular fa-square-minus"></i></a>
|
||||||
|
{{/if}}
|
||||||
<a class="fatigue-plus"><i class="fa-regular fa-square-plus"></i></a>
|
<a class="fatigue-plus"><i class="fa-regular fa-square-plus"></i></a>
|
||||||
</div>
|
</div>
|
||||||
<div class="flex-group-right">
|
<div class="flex-group-right">
|
||||||
|
@ -20,45 +20,56 @@
|
|||||||
{{#if essais.defense}}
|
{{#if essais.defense}}
|
||||||
{{#unless essais.defenseChance}}
|
{{#unless essais.defenseChance}}
|
||||||
{{#if (eq defender.type 'personnage')}}
|
{{#if (eq defender.type 'personnage')}}
|
||||||
<a class='chat-card-button' id='appel-chance-defense'
|
<a class='chat-card-button' id='appel-chance-defense'
|
||||||
data-attackerId='{{attackerId}}' data-defenderTokenId='{{defenderToken.id}}' data-attackerTokenId='{{attackerToken.id}}'>
|
data-attackerId='{{attackerId}}' data-defenderTokenId='{{defenderToken.id}}' data-attackerTokenId='{{attackerToken.id}}'>
|
||||||
Faire appel à la chance</a>
|
Faire appel à la chance</a>
|
||||||
</a>
|
</a>
|
||||||
<br>
|
<br>
|
||||||
{{/if}}
|
{{/if}}
|
||||||
{{#if (eq defender.type 'personnage')}}
|
{{#if (and (eq defender.type 'personnage') (gt defender.system.compteurs.destinee.value 0))}}
|
||||||
{{#if (gt defender.system.compteurs.destinee.value 0)}}
|
|
||||||
<a class='chat-card-button' id='appel-destinee-defense'
|
<a class='chat-card-button' id='appel-destinee-defense'
|
||||||
data-attackerId='{{attackerId}}' data-attackerTokenId='{{attackerToken.id}}' data-defenderTokenId='{{defenderToken.id}}'>
|
data-attackerId='{{attackerId}}' data-attackerTokenId='{{attackerToken.id}}' data-defenderTokenId='{{defenderToken.id}}'>
|
||||||
Utiliser la destinée</a>
|
Utiliser la destinée</a>
|
||||||
</a>
|
</a>
|
||||||
<br>
|
<br>
|
||||||
{{/if}}
|
{{/if}}
|
||||||
{{/if}}
|
|
||||||
{{/unless}}
|
{{/unless}}
|
||||||
{{else}}
|
{{else}}
|
||||||
{{#each armes as |arme key|}}
|
{{#each armes as |arme key|}}
|
||||||
<a class='chat-card-button' id='parer-button'
|
<a class='chat-card-button' id='parer-button'
|
||||||
data-attackerId='{{../attackerId}}' data-defenderTokenId='{{../defenderToken.id}}' data-attackerTokenId='{{../attackerToken.id}}'
|
data-attackerId='{{../attackerId}}' data-defenderTokenId='{{../defenderToken.id}}' data-attackerTokenId='{{../attackerToken.id}}'
|
||||||
data-armeid='{{arme._id}}'>
|
data-armeid='{{arme._id}}'>
|
||||||
Parer avec {{arme.name}} à {{../diffLibre }}{{#if arme.system.nbUsage}} (Utilisations : {{arme.system.nbUsage}}){{/if}}
|
Parer avec {{arme.name}}
|
||||||
|
{{#if (or (eq ../attaqueCategorie 'tir') (eq ../attaqueCategorie 'lancer'))}}
|
||||||
|
(difficulté à déterminer)
|
||||||
|
{{else}}à {{../diffLibre }}
|
||||||
|
{{/if}}
|
||||||
|
{{#if (eq arme.typeParade 'sign')}}
|
||||||
|
<span class="rdd-diviseur">×½</span>
|
||||||
|
{{/if}}
|
||||||
|
{{#if arme.nbUsage}}(Utilisations : {{arme.nbUsage}}){{/if}}
|
||||||
</a>
|
</a>
|
||||||
<br>
|
<br>
|
||||||
{{/each}}
|
{{/each}}
|
||||||
{{#if mainsNues}}
|
{{#if mainsNues}}
|
||||||
<a class='chat-card-button' id='parer-button'
|
<a class='chat-card-button' id='parer-button'
|
||||||
data-attackerId='{{attackerId}}' data-defenderTokenId='{{defenderToken.id}}' data-attackerTokenId='{{attackerToken.id}}'
|
data-attackerId='{{attackerId}}' data-defenderTokenId='{{defenderToken.id}}' data-attackerTokenId='{{attackerToken.id}}'
|
||||||
data-armeid='{{arme._id}}' data-competence='{{arme.system.competence}}'>
|
data-armeid='{{arme._id}}' data-competence='{{arme.system.competence}}'>
|
||||||
Parer à mains nues à {{diffLibre}}{{#if arme.system.nbUsage}} (Utilisations : {{arme.system.nbUsage}}){{/if}}
|
Parer à mains nues à {{diffLibre}}{{#if arme.nbUsage}} (Utilisations : {{arme.nbUsage}}){{/if}}
|
||||||
</a>
|
</a>
|
||||||
<br>
|
<br>
|
||||||
{{/if}}
|
{{/if}}
|
||||||
{{#if (ne attaqueCategorie 'tir')}}
|
{{#if (ne attaqueCategorie 'tir')}}
|
||||||
{{#each esquives as |esquive key|}}
|
{{#each esquives as |esquive key|}}
|
||||||
<a class='chat-card-button' id='esquiver-button'
|
<a class='chat-card-button' id='esquiver-button'
|
||||||
data-attackerId='{{../attackerId}}' data-defenderTokenId='{{../defenderToken.id}}' data-attackerTokenId='{{../attackerToken.id}}'
|
data-attackerId='{{../attackerId}}' data-defenderTokenId='{{../defenderToken.id}}' data-attackerTokenId='{{../attackerToken.id}}'
|
||||||
data-compid='{{esquive._id}}' data-competence='{{esquive.name}}'>
|
data-compid='{{esquive._id}}' data-competence='{{esquive.name}}'>
|
||||||
{{esquive.name}} à {{../diffLibre}} {{#if esquive.system.nbUsage}} (Utilisations : {{esquive.system.nbUsage}}){{/if}}
|
{{esquive.name}}
|
||||||
|
{{#if (or (eq ../attaqueCategorie 'tir') (eq ../attaqueCategorie 'lancer'))}}
|
||||||
|
(difficulté à déterminer)
|
||||||
|
{{else}}à {{../diffLibre }}
|
||||||
|
{{/if}}
|
||||||
|
{{#if esquive.nbUsage}}(Utilisations : {{esquive.nbUsage}}){{/if}}
|
||||||
</a>
|
</a>
|
||||||
<br>
|
<br>
|
||||||
{{/each}}
|
{{/each}}
|
||||||
|
Loading…
Reference in New Issue
Block a user