Merge pull request 'v12.0.9 - Le scriptorium d'Astrobazzarh' (#711) from VincentVk/foundryvtt-reve-de-dragon:v11 into v11
Reviewed-on: #711
This commit is contained in:
commit
8d6c4565a9
@ -1,4 +1,7 @@
|
|||||||
# 12.0
|
# 12.0
|
||||||
|
## 12.0.9 - Le scriptorium d'Astrobazzarh
|
||||||
|
- ajout d'une fonction avancée pour exporter les personnages dans un format csv
|
||||||
|
|
||||||
## 12.0.8 - La quincaillerie d'Astrobazzarh
|
## 12.0.8 - La quincaillerie d'Astrobazzarh
|
||||||
- le propriétaire est indiqué dans les feuilles d'équipements/compétences/...
|
- le propriétaire est indiqué dans les feuilles d'équipements/compétences/...
|
||||||
- Ecaille d'efficacité
|
- Ecaille d'efficacité
|
||||||
|
@ -32,7 +32,7 @@ import { RdDItemBlessure } from "./item/blessure.js";
|
|||||||
import { AppAstrologie } from "./sommeil/app-astrologie.js";
|
import { AppAstrologie } from "./sommeil/app-astrologie.js";
|
||||||
import { RdDEmpoignade } from "./rdd-empoignade.js";
|
import { RdDEmpoignade } from "./rdd-empoignade.js";
|
||||||
import { ExperienceLog, XP_TOPIC } from "./actor/experience-log.js";
|
import { ExperienceLog, XP_TOPIC } from "./actor/experience-log.js";
|
||||||
import { TYPES } from "./item.js";
|
import { ITEM_TYPES } from "./item.js";
|
||||||
import { RdDBaseActorSang } from "./actor/base-actor-sang.js";
|
import { RdDBaseActorSang } from "./actor/base-actor-sang.js";
|
||||||
import { RdDCoeur } from "./coeur/rdd-coeur.js";
|
import { RdDCoeur } from "./coeur/rdd-coeur.js";
|
||||||
import { DialogChoixXpCarac } from "./dialog-choix-xp-carac.js";
|
import { DialogChoixXpCarac } from "./dialog-choix-xp-carac.js";
|
||||||
@ -92,7 +92,7 @@ export class RdDActor extends RdDBaseActorSang {
|
|||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
canReceive(item) {
|
canReceive(item) {
|
||||||
return ![TYPES.competencecreature, TYPES.tarot, TYPES.service].includes(item.type)
|
return ![ITEM_TYPES.competencecreature, ITEM_TYPES.tarot, ITEM_TYPES.service].includes(item.type)
|
||||||
}
|
}
|
||||||
|
|
||||||
isPersonnageJoueur() {
|
isPersonnageJoueur() {
|
||||||
@ -125,7 +125,7 @@ export class RdDActor extends RdDBaseActorSang {
|
|||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
getMalusArmure() {
|
getMalusArmure() {
|
||||||
return this.itemTypes[TYPES.armure].filter(it => it.system.equipe)
|
return this.itemTypes[ITEM_TYPES.armure].filter(it => it.system.equipe)
|
||||||
.map(it => it.system.malus)
|
.map(it => it.system.malus)
|
||||||
.reduce(Misc.sum(), 0);
|
.reduce(Misc.sum(), 0);
|
||||||
}
|
}
|
||||||
@ -142,7 +142,7 @@ export class RdDActor extends RdDBaseActorSang {
|
|||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
getDemiReve() { return this.system.reve.tmrpos.coord }
|
getDemiReve() { return this.system.reve.tmrpos.coord }
|
||||||
getDraconicList() { return this.itemTypes[TYPES.competence].filter(it => it.system.categorie == 'draconic') }
|
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().sort(Misc.descending(it => it.system.niveau)).find(it => true)) }
|
||||||
getDraconicOuPossession() {
|
getDraconicOuPossession() {
|
||||||
return [...this.getDraconicList().filter(it => it.system.niveau >= 0),
|
return [...this.getDraconicList().filter(it => it.system.niveau >= 0),
|
||||||
@ -153,7 +153,7 @@ export class RdDActor extends RdDBaseActorSang {
|
|||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
async $perteRevePotionsEnchantees() {
|
async $perteRevePotionsEnchantees() {
|
||||||
let potions = this.itemTypes[TYPES.potion]
|
let potions = this.itemTypes[ITEM_TYPES.potion]
|
||||||
.filter(it => Grammar.includesLowerCaseNoAccent(it.system.categorie, 'enchanté') && !it.system.prpermanent)
|
.filter(it => Grammar.includesLowerCaseNoAccent(it.system.categorie, 'enchanté') && !it.system.prpermanent)
|
||||||
|
|
||||||
const potionUpdates = await Promise.all(potions.map(async it => {
|
const potionUpdates = await Promise.all(potions.map(async it => {
|
||||||
@ -345,7 +345,7 @@ export class RdDActor extends RdDBaseActorSang {
|
|||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
async _recupererBlessures(message, isMaladeEmpoisonne) {
|
async _recupererBlessures(message, isMaladeEmpoisonne) {
|
||||||
const timestamp = game.system.rdd.calendrier.getTimestamp()
|
const timestamp = game.system.rdd.calendrier.getTimestamp()
|
||||||
const blessures = this.filterItems(it => it.system.gravite > 0, TYPES.blessure).sort(Misc.ascending(it => it.system.gravite))
|
const blessures = this.filterItems(it => it.system.gravite > 0, ITEM_TYPES.blessure).sort(Misc.ascending(it => it.system.gravite))
|
||||||
|
|
||||||
await Promise.all(blessures.map(async b => b.recuperationBlessure({
|
await Promise.all(blessures.map(async b => b.recuperationBlessure({
|
||||||
actor: this,
|
actor: this,
|
||||||
@ -361,7 +361,7 @@ export class RdDActor extends RdDBaseActorSang {
|
|||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
async _recupererVie(message, isMaladeEmpoisonne) {
|
async _recupererVie(message, isMaladeEmpoisonne) {
|
||||||
const tData = this.system
|
const tData = this.system
|
||||||
let blessures = this.filterItems(it => it.system.gravite > 0, TYPES.blessure);
|
let blessures = this.filterItems(it => it.system.gravite > 0, ITEM_TYPES.blessure);
|
||||||
if (blessures.length > 0) {
|
if (blessures.length > 0) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@ -636,7 +636,7 @@ export class RdDActor extends RdDBaseActorSang {
|
|||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
async sortMisEnReserve(sort, draconic, coord, ptreve) {
|
async sortMisEnReserve(sort, draconic, coord, ptreve) {
|
||||||
await this.createEmbeddedDocuments("Item", [{
|
await this.createEmbeddedDocuments("Item", [{
|
||||||
type: TYPES.sortreserve,
|
type: ITEM_TYPES.sortreserve,
|
||||||
name: sort.name,
|
name: sort.name,
|
||||||
img: sort.img,
|
img: sort.img,
|
||||||
system: { sortid: sort._id, draconic: (draconic?.name ?? sort.system.draconic), ptreve: ptreve, coord: coord, heurecible: 'Vaisseau' }
|
system: { sortid: sort._id, draconic: (draconic?.name ?? sort.system.draconic), ptreve: ptreve, coord: coord, heurecible: 'Vaisseau' }
|
||||||
@ -991,24 +991,24 @@ export class RdDActor extends RdDBaseActorSang {
|
|||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
buildTMRInnaccessible() {
|
buildTMRInnaccessible() {
|
||||||
return this.items.filter(it => it.type == TYPES.casetmr).filter(it => EffetsDraconiques.isInnaccessible(it)).map(it => it.system.coord)
|
return this.items.filter(it => it.type == ITEM_TYPES.casetmr).filter(it => EffetsDraconiques.isInnaccessible(it)).map(it => it.system.coord)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
getRencontresTMR() {
|
getRencontresTMR() {
|
||||||
return this.itemTypes[TYPES.rencontre];
|
return this.itemTypes[ITEM_TYPES.rencontre];
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
async deleteRencontreTMRAtPosition() {
|
async deleteRencontreTMRAtPosition() {
|
||||||
const rencontreIds = this.itemTypes[TYPES.rencontre].filter(this.filterRencontreTMRDemiReve()).map(it => it.id)
|
const rencontreIds = this.itemTypes[ITEM_TYPES.rencontre].filter(this.filterRencontreTMRDemiReve()).map(it => it.id)
|
||||||
if (rencontreIds.length > 0) {
|
if (rencontreIds.length > 0) {
|
||||||
await this.deleteEmbeddedDocuments('Item', rencontreIds)
|
await this.deleteEmbeddedDocuments('Item', rencontreIds)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
getRencontreTMREnAttente() {
|
getRencontreTMREnAttente() {
|
||||||
return this.itemTypes[TYPES.rencontre].find(this.filterRencontreTMRDemiReve())
|
return this.itemTypes[ITEM_TYPES.rencontre].find(this.filterRencontreTMRDemiReve())
|
||||||
}
|
}
|
||||||
|
|
||||||
filterRencontreTMRDemiReve() {
|
filterRencontreTMRDemiReve() {
|
||||||
@ -1160,11 +1160,11 @@ export class RdDActor extends RdDBaseActorSang {
|
|||||||
if (result) { return result }
|
if (result) { return result }
|
||||||
|
|
||||||
switch (item.type) {
|
switch (item.type) {
|
||||||
case TYPES.potion: return await this.consommerPotion(item, onActionItem);
|
case ITEM_TYPES.potion: return await this.consommerPotion(item, onActionItem);
|
||||||
case TYPES.livre: return await this.actionLire(item);
|
case ITEM_TYPES.livre: return await this.actionLire(item);
|
||||||
case TYPES.conteneur: return await item.sheet.render(true);
|
case ITEM_TYPES.conteneur: return await item.sheet.render(true);
|
||||||
case TYPES.herbe: return await this.actionHerbe(item, onActionItem);
|
case ITEM_TYPES.herbe: return await this.actionHerbe(item, onActionItem);
|
||||||
case TYPES.queue: case TYPES.ombre: return await this.actionRefoulement(item);
|
case ITEM_TYPES.queue: case ITEM_TYPES.ombre: return await this.actionRefoulement(item);
|
||||||
}
|
}
|
||||||
return undefined
|
return undefined
|
||||||
}
|
}
|
||||||
@ -1559,7 +1559,7 @@ export class RdDActor extends RdDBaseActorSang {
|
|||||||
xpData
|
xpData
|
||||||
})
|
})
|
||||||
if (hideChatMessage) {
|
if (hideChatMessage) {
|
||||||
ChatUtility.blindMessageToGM({ content: content });
|
ChatUtility.blindMessageToGM({ content: content })
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
ChatMessage.create({
|
ChatMessage.create({
|
||||||
@ -1602,7 +1602,7 @@ export class RdDActor extends RdDBaseActorSang {
|
|||||||
computeDraconicAndSortIndex(sortList) {
|
computeDraconicAndSortIndex(sortList) {
|
||||||
let draconicList = this.getDraconicList();
|
let draconicList = this.getDraconicList();
|
||||||
for (let sort of sortList) {
|
for (let sort of sortList) {
|
||||||
let draconicsSort = this.getDraconicsSort(draconicList, sort).map(it => it.name);
|
let draconicsSort = RdDItemSort.getDraconicsSort(draconicList, sort).map(it => it.name);
|
||||||
for (let index = 0; index < draconicList.length && sort.system.listIndex == undefined; index++) {
|
for (let index = 0; index < draconicList.length && sort.system.listIndex == undefined; index++) {
|
||||||
if (draconicsSort.includes(draconicList[index].name)) {
|
if (draconicsSort.includes(draconicList[index].name)) {
|
||||||
sort.system.listIndex = index;
|
sort.system.listIndex = index;
|
||||||
@ -1612,19 +1612,6 @@ export class RdDActor extends RdDBaseActorSang {
|
|||||||
return draconicList;
|
return draconicList;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
|
||||||
getDraconicsSort(draconicList, sort) {
|
|
||||||
//console.log(draconicList, bestDraconic, draconic, voie);
|
|
||||||
switch (Grammar.toLowerCaseNoAccent(sort.name)) {
|
|
||||||
case "lecture d'aura":
|
|
||||||
case "detection d'aura":
|
|
||||||
return draconicList;
|
|
||||||
case "annulation de magie":
|
|
||||||
return draconicList.filter(it => !RdDItemCompetence.isThanatos(it));
|
|
||||||
}
|
|
||||||
return [RdDItemCompetence.getVoieDraconic(draconicList, sort.system.draconic)];
|
|
||||||
}
|
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
async rollUnSort(coord) {
|
async rollUnSort(coord) {
|
||||||
RdDEmpoignade.checkEmpoignadeEnCours(this)
|
RdDEmpoignade.checkEmpoignadeEnCours(this)
|
||||||
@ -1826,7 +1813,7 @@ export class RdDActor extends RdDBaseActorSang {
|
|||||||
}
|
}
|
||||||
|
|
||||||
blessuresASoigner() {
|
blessuresASoigner() {
|
||||||
return (this.itemTypes[TYPES.blessure])
|
return (this.itemTypes[ITEM_TYPES.blessure])
|
||||||
.filter(it => it.system.gravite > 0 && it.system.gravite <= 6)
|
.filter(it => it.system.gravite > 0 && it.system.gravite <= 6)
|
||||||
.filter(it => !(it.system.premierssoins.done && it.system.soinscomplets.done))
|
.filter(it => !(it.system.premierssoins.done && it.system.soinscomplets.done))
|
||||||
.sort(Misc.descending(b => (b.system.premierssoins.done ? "A" : "B") + b.system.gravite))
|
.sort(Misc.descending(b => (b.system.premierssoins.done ? "A" : "B") + b.system.gravite))
|
||||||
@ -3065,7 +3052,7 @@ export class RdDActor extends RdDBaseActorSang {
|
|||||||
async nouvelleIncarnation() {
|
async nouvelleIncarnation() {
|
||||||
let incarnation = this.toObject();
|
let incarnation = this.toObject();
|
||||||
|
|
||||||
incarnation.items = Array.from(this.items.filter(it => it.type == TYPES.competence),
|
incarnation.items = Array.from(this.items.filter(it => it.type == ITEM_TYPES.competence),
|
||||||
it => {
|
it => {
|
||||||
it = it.toObject();
|
it = it.toObject();
|
||||||
it.id = undefined;
|
it.id = undefined;
|
||||||
|
@ -12,7 +12,7 @@ import { ReglesOptionnelles } from "../settings/regles-optionnelles.js";
|
|||||||
import { RdDBaseActor } from "./base-actor.js";
|
import { RdDBaseActor } from "./base-actor.js";
|
||||||
import { RdDItemCompetenceCreature } from "../item-competencecreature.js";
|
import { RdDItemCompetenceCreature } from "../item-competencecreature.js";
|
||||||
import { StatusEffects } from "../settings/status-effects.js";
|
import { StatusEffects } from "../settings/status-effects.js";
|
||||||
import { TYPES } from "../item.js";
|
import { ITEM_TYPES } from "../item.js";
|
||||||
import { Targets } from "../targets.js";
|
import { Targets } from "../targets.js";
|
||||||
import { RdDPossession } from "../rdd-possession.js";
|
import { RdDPossession } from "../rdd-possession.js";
|
||||||
import { RdDCombat } from "../rdd-combat.js";
|
import { RdDCombat } from "../rdd-combat.js";
|
||||||
@ -108,14 +108,14 @@ export class RdDBaseActorReve extends RdDBaseActor {
|
|||||||
|
|
||||||
async $finDeRoundSupprimerObsoletes() {
|
async $finDeRoundSupprimerObsoletes() {
|
||||||
const obsoletes = []
|
const obsoletes = []
|
||||||
.concat(this.itemTypes[TYPES.empoignade].filter(it => it.system.pointsemp <= 0))
|
.concat(this.itemTypes[ITEM_TYPES.empoignade].filter(it => it.system.pointsemp <= 0))
|
||||||
.concat(this.itemTypes[TYPES.possession].filter(it => it.system.compteur < -2 || it.system.compteur > 2))
|
.concat(this.itemTypes[ITEM_TYPES.possession].filter(it => it.system.compteur < -2 || it.system.compteur > 2))
|
||||||
.map(it => it.id);
|
.map(it => it.id);
|
||||||
await this.deleteEmbeddedDocuments('Item', obsoletes);
|
await this.deleteEmbeddedDocuments('Item', obsoletes);
|
||||||
}
|
}
|
||||||
|
|
||||||
async $finDeRoundEmpoignade() {
|
async $finDeRoundEmpoignade() {
|
||||||
const immobilisations = this.itemTypes[TYPES.empoignade].filter(it => it.system.pointsemp >= 2 && it.system.empoigneurid == this.id);
|
const immobilisations = this.itemTypes[ITEM_TYPES.empoignade].filter(it => it.system.pointsemp >= 2 && it.system.empoigneurid == this.id);
|
||||||
immobilisations.forEach(emp => RdDEmpoignade.onImmobilisation(this,
|
immobilisations.forEach(emp => RdDEmpoignade.onImmobilisation(this,
|
||||||
game.actors.get(emp.system.empoigneid),
|
game.actors.get(emp.system.empoigneid),
|
||||||
emp
|
emp
|
||||||
@ -151,13 +151,13 @@ export class RdDBaseActorReve extends RdDBaseActor {
|
|||||||
}
|
}
|
||||||
|
|
||||||
getPossession(possessionId) {
|
getPossession(possessionId) {
|
||||||
return this.itemTypes[TYPES.possession].find(it => it.system.possessionid == possessionId);
|
return this.itemTypes[ITEM_TYPES.possession].find(it => it.system.possessionid == possessionId);
|
||||||
}
|
}
|
||||||
getPossessions() {
|
getPossessions() {
|
||||||
return this.itemTypes[TYPES.possession];
|
return this.itemTypes[ITEM_TYPES.possession];
|
||||||
}
|
}
|
||||||
getEmpoignades() {
|
getEmpoignades() {
|
||||||
return this.itemTypes[TYPES.empoignade];
|
return this.itemTypes[ITEM_TYPES.empoignade];
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
@ -322,7 +322,7 @@ export class RdDBaseActorReve extends RdDBaseActor {
|
|||||||
RdDEmpoignade.checkEmpoignadeEnCours(this)
|
RdDEmpoignade.checkEmpoignadeEnCours(this)
|
||||||
const competence = this.getCompetence(idOrName);
|
const competence = this.getCompetence(idOrName);
|
||||||
let rollData = { carac: this.system.carac, competence: competence, arme: options.arme }
|
let rollData = { carac: this.system.carac, competence: competence, arme: options.arme }
|
||||||
if (competence.type == TYPES.competencecreature) {
|
if (competence.type == ITEM_TYPES.competencecreature) {
|
||||||
const arme = RdDItemCompetenceCreature.armeCreature(competence)
|
const arme = RdDItemCompetenceCreature.armeCreature(competence)
|
||||||
if (arme && options.tryTarget && Targets.hasTargets()) {
|
if (arme && options.tryTarget && Targets.hasTargets()) {
|
||||||
Targets.selectOneToken(target => {
|
Targets.selectOneToken(target => {
|
||||||
@ -396,19 +396,7 @@ export class RdDBaseActorReve extends RdDBaseActor {
|
|||||||
}
|
}
|
||||||
|
|
||||||
$getCompetenceArme(arme, competenceName) {
|
$getCompetenceArme(arme, competenceName) {
|
||||||
switch (arme.type) {
|
return RdDItemArme.getCompetenceArme(arme, competenceName)
|
||||||
case TYPES.competencecreature:
|
|
||||||
return arme.name
|
|
||||||
case TYPES.arme:
|
|
||||||
switch (competenceName) {
|
|
||||||
case 'competence': return arme.system.competence;
|
|
||||||
case 'unemain': return RdDItemArme.competence1Mains(arme);
|
|
||||||
case 'deuxmains': return RdDItemArme.competence2Mains(arme);
|
|
||||||
case 'tir': return arme.system.tir;
|
|
||||||
case 'lancer': return arme.system.lancer;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return undefined
|
|
||||||
}
|
}
|
||||||
|
|
||||||
verifierForceMin(item) {
|
verifierForceMin(item) {
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
import { MAX_ENDURANCE_FATIGUE, RdDUtility } from "../rdd-utility.js";
|
import { MAX_ENDURANCE_FATIGUE, RdDUtility } from "../rdd-utility.js";
|
||||||
import { ReglesOptionnelles } from "../settings/regles-optionnelles.js";
|
import { ReglesOptionnelles } from "../settings/regles-optionnelles.js";
|
||||||
import { STATUSES } from "../settings/status-effects.js";
|
import { STATUSES } from "../settings/status-effects.js";
|
||||||
import { TYPES } from "../item.js";
|
import { ITEM_TYPES } from "../item.js";
|
||||||
import { RdDBaseActorReve } from "./base-actor-reve.js";
|
import { RdDBaseActorReve } from "./base-actor-reve.js";
|
||||||
import { RdDDice } from "../rdd-dice.js";
|
import { RdDDice } from "../rdd-dice.js";
|
||||||
import { RdDItemBlessure } from "../item/blessure.js";
|
import { RdDItemBlessure } from "../item/blessure.js";
|
||||||
@ -50,9 +50,9 @@ export class RdDBaseActorSang extends RdDBaseActorReve {
|
|||||||
|
|
||||||
isDead() { return this.system.sante.vie.value < -this.getSConst() }
|
isDead() { return this.system.sante.vie.value < -this.getSConst() }
|
||||||
|
|
||||||
nbBlessuresLegeres() { return this.itemTypes[TYPES.blessure].filter(it => it.isLegere()).length }
|
nbBlessuresLegeres() { return this.itemTypes[ITEM_TYPES.blessure].filter(it => it.isLegere()).length }
|
||||||
nbBlessuresGraves() { return this.itemTypes[TYPES.blessure].filter(it => it.isGrave()).length }
|
nbBlessuresGraves() { return this.itemTypes[ITEM_TYPES.blessure].filter(it => it.isGrave()).length }
|
||||||
nbBlessuresCritiques() { return this.itemTypes[TYPES.blessure].filter(it => it.isCritique()).length }
|
nbBlessuresCritiques() { return this.itemTypes[ITEM_TYPES.blessure].filter(it => it.isCritique()).length }
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
computeResumeBlessure() {
|
computeResumeBlessure() {
|
||||||
@ -197,7 +197,7 @@ export class RdDBaseActorSang extends RdDBaseActorReve {
|
|||||||
}
|
}
|
||||||
|
|
||||||
async supprimerBlessures(filterToDelete) {
|
async supprimerBlessures(filterToDelete) {
|
||||||
const toDelete = this.filterItems(filterToDelete, TYPES.blessure)
|
const toDelete = this.filterItems(filterToDelete, ITEM_TYPES.blessure)
|
||||||
.map(it => it.id);
|
.map(it => it.id);
|
||||||
await this.deleteEmbeddedDocuments('Item', toDelete);
|
await this.deleteEmbeddedDocuments('Item', toDelete);
|
||||||
}
|
}
|
||||||
|
@ -3,7 +3,7 @@ import { Misc } from "../misc.js";
|
|||||||
import { DialogSplitItem } from "../dialog-split-item.js";
|
import { DialogSplitItem } from "../dialog-split-item.js";
|
||||||
import { RdDSheetUtility } from "../rdd-sheet-utility.js";
|
import { RdDSheetUtility } from "../rdd-sheet-utility.js";
|
||||||
import { Monnaie } from "../item-monnaie.js";
|
import { Monnaie } from "../item-monnaie.js";
|
||||||
import { RdDItem, TYPES } from "../item.js";
|
import { RdDItem, ITEM_TYPES } from "../item.js";
|
||||||
import { RdDItemCompetenceCreature } from "../item-competencecreature.js";
|
import { RdDItemCompetenceCreature } from "../item-competencecreature.js";
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
@ -51,7 +51,7 @@ export class RdDBaseActorSheet extends ActorSheet {
|
|||||||
this.objetVersConteneur = RdDUtility.buildArbreDeConteneurs(formData.conteneurs, formData.inventaires);
|
this.objetVersConteneur = RdDUtility.buildArbreDeConteneurs(formData.conteneurs, formData.inventaires);
|
||||||
this._appliquerRechercheObjets(formData.conteneurs, formData.inventaires);
|
this._appliquerRechercheObjets(formData.conteneurs, formData.inventaires);
|
||||||
formData.conteneurs = RdDUtility.conteneursRacine(formData.conteneurs);
|
formData.conteneurs = RdDUtility.conteneursRacine(formData.conteneurs);
|
||||||
formData.competences.filter(it => it.type == TYPES.competencecreature)
|
formData.competences.filter(it => it.type == ITEM_TYPES.competencecreature)
|
||||||
.forEach(it => it.isdommages = RdDItemCompetenceCreature.isDommages(it))
|
.forEach(it => it.isdommages = RdDItemCompetenceCreature.isDommages(it))
|
||||||
return formData;
|
return formData;
|
||||||
}
|
}
|
||||||
|
@ -3,7 +3,7 @@ import { ChatUtility } from "../chat-utility.js";
|
|||||||
import { SYSTEM_SOCKET_ID } from "../constants.js";
|
import { SYSTEM_SOCKET_ID } from "../constants.js";
|
||||||
import { Grammar } from "../grammar.js";
|
import { Grammar } from "../grammar.js";
|
||||||
import { Monnaie } from "../item-monnaie.js";
|
import { Monnaie } from "../item-monnaie.js";
|
||||||
import { TYPES } from "../item.js";
|
import { ITEM_TYPES } from "../item.js";
|
||||||
import { Misc } from "../misc.js";
|
import { Misc } from "../misc.js";
|
||||||
import { RdDAudio } from "../rdd-audio.js";
|
import { RdDAudio } from "../rdd-audio.js";
|
||||||
import { RdDConfirm } from "../rdd-confirm.js";
|
import { RdDConfirm } from "../rdd-confirm.js";
|
||||||
@ -542,7 +542,7 @@ export class RdDBaseActor extends Actor {
|
|||||||
// Calculer le total actuel des contenus
|
// Calculer le total actuel des contenus
|
||||||
const encContenu = dest.getEncContenu();
|
const encContenu = dest.getEncContenu();
|
||||||
const newEnc = moved.getEncTotal(); // Calculer le total actuel du nouvel objet
|
const newEnc = moved.getEncTotal(); // Calculer le total actuel du nouvel objet
|
||||||
const placeDisponible = Math.roundDecimals(dest.system.capacite - encContenu - newEnc, 4)
|
const placeDisponible = Misc.keepDecimals(dest.system.capacite - encContenu - newEnc, 4)
|
||||||
|
|
||||||
// Teste si le conteneur de destination a suffisament de capacité pour recevoir le nouvel objet
|
// Teste si le conteneur de destination a suffisament de capacité pour recevoir le nouvel objet
|
||||||
if (placeDisponible < 0) {
|
if (placeDisponible < 0) {
|
||||||
@ -704,7 +704,7 @@ export class RdDBaseActor extends Actor {
|
|||||||
|
|
||||||
async actionPrincipale(item, onActionItem = async () => { }) {
|
async actionPrincipale(item, onActionItem = async () => { }) {
|
||||||
switch (item.type) {
|
switch (item.type) {
|
||||||
case TYPES.conteneur: return await item.sheet.render(true);
|
case ITEM_TYPES.conteneur: return await item.sheet.render(true);
|
||||||
}
|
}
|
||||||
return undefined
|
return undefined
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
import { ENTITE_INCARNE } from "../constants.js";
|
import { ENTITE_INCARNE } from "../constants.js";
|
||||||
import { TYPES } from "../item.js";
|
import { ITEM_TYPES } from "../item.js";
|
||||||
import { STATUSES } from "../settings/status-effects.js";
|
import { STATUSES } from "../settings/status-effects.js";
|
||||||
import { RdDBaseActorSang } from "./base-actor-sang.js";
|
import { RdDBaseActorSang } from "./base-actor-sang.js";
|
||||||
|
|
||||||
@ -12,7 +12,7 @@ export class RdDCreature extends RdDBaseActorSang {
|
|||||||
isCreature() { return true }
|
isCreature() { return true }
|
||||||
|
|
||||||
canReceive(item) {
|
canReceive(item) {
|
||||||
return item.type == TYPES.competencecreature || item.isInventaire();
|
return item.type == ITEM_TYPES.competencecreature || item.isInventaire();
|
||||||
}
|
}
|
||||||
|
|
||||||
async remiseANeuf() {
|
async remiseANeuf() {
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
import { ENTITE_INCARNE, ENTITE_NONINCARNE } from "../constants.js";
|
import { ENTITE_INCARNE, ENTITE_NONINCARNE } from "../constants.js";
|
||||||
import { TYPES } from "../item.js";
|
import { ITEM_TYPES } from "../item.js";
|
||||||
import { Misc } from "../misc.js";
|
import { Misc } from "../misc.js";
|
||||||
import { RdDEncaisser } from "../rdd-roll-encaisser.js";
|
import { RdDEncaisser } from "../rdd-roll-encaisser.js";
|
||||||
import { STATUSES } from "../settings/status-effects.js";
|
import { STATUSES } from "../settings/status-effects.js";
|
||||||
@ -12,7 +12,7 @@ export class RdDEntite extends RdDBaseActorReve {
|
|||||||
}
|
}
|
||||||
|
|
||||||
canReceive(item) {
|
canReceive(item) {
|
||||||
return item.type == TYPES.competencecreature
|
return item.type == ITEM_TYPES.competencecreature
|
||||||
}
|
}
|
||||||
|
|
||||||
isEntite(typeentite = []) {
|
isEntite(typeentite = []) {
|
||||||
@ -29,7 +29,7 @@ export class RdDEntite extends RdDBaseActorReve {
|
|||||||
getChance() { return this.getReve() }
|
getChance() { return this.getReve() }
|
||||||
|
|
||||||
getDraconicOuPossession() {
|
getDraconicOuPossession() {
|
||||||
return this.itemTypes[TYPES.competencecreature]
|
return this.itemTypes[ITEM_TYPES.competencecreature]
|
||||||
.filter(it => it.system.categorie == 'possession')
|
.filter(it => it.system.categorie == 'possession')
|
||||||
.sort(Misc.descending(it => it.system.niveau))
|
.sort(Misc.descending(it => it.system.niveau))
|
||||||
.find(it => true);
|
.find(it => true);
|
||||||
|
80
module/actor/export-scriptarium/export-scriptarium.js
Normal file
80
module/actor/export-scriptarium/export-scriptarium.js
Normal file
@ -0,0 +1,80 @@
|
|||||||
|
import { ACTOR_TYPES } from "../../item.js"
|
||||||
|
import { Misc } from "../../misc.js"
|
||||||
|
import { EXPORT_CSV_SCRIPTARIUM, OptionsAvancees } from "../../settings/options-avancees.js"
|
||||||
|
import { Mapping } from "./mapping.js"
|
||||||
|
|
||||||
|
const IMG_SCRIPTARIUM = '<img class="context-menu-img" src="systems/foundryvtt-reve-de-dragon/styles/img/ui/scriptarium.svg">'
|
||||||
|
|
||||||
|
export class ExportScriptarium {
|
||||||
|
|
||||||
|
static init() {
|
||||||
|
ExportScriptarium.INSTANCE = new ExportScriptarium()
|
||||||
|
}
|
||||||
|
|
||||||
|
constructor() {
|
||||||
|
this.mapping = Mapping.getMapping()
|
||||||
|
Hooks.on("getActorDirectoryFolderContext", (actorDirectory, menus) => { ExportScriptarium.INSTANCE.onActorDirectoryMenu(actorDirectory, menus) })
|
||||||
|
Hooks.on("getActorDirectoryEntryContext", (actorDirectory, menus) => { ExportScriptarium.INSTANCE.onActorDirectoryMenu(actorDirectory, menus) })
|
||||||
|
}
|
||||||
|
|
||||||
|
onActorDirectoryMenu(actorDirectory, menus) {
|
||||||
|
menus.push({
|
||||||
|
name: 'Export Personnages',
|
||||||
|
icon: IMG_SCRIPTARIUM,
|
||||||
|
condition: (target) => game.user.isGM &&
|
||||||
|
OptionsAvancees.isUsing(EXPORT_CSV_SCRIPTARIUM) &&
|
||||||
|
this.$getActors(actorDirectory, target).length > 0,
|
||||||
|
callback: target => this.exportActors(this.$getActors(actorDirectory, target), this.$getTargetName(actorDirectory, target))
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
$getTargetName(actorDirectory, target) {
|
||||||
|
const li = target.closest(".directory-item")
|
||||||
|
const folderId = li.data("folderId")
|
||||||
|
const actorId = li.data("documentId")
|
||||||
|
return actorId
|
||||||
|
? game.actors.get(actorId).name
|
||||||
|
: actorDirectory.folders.find(it => it.id == folderId).name
|
||||||
|
}
|
||||||
|
|
||||||
|
$getActors(actorDirectory, target) {
|
||||||
|
const li = target.closest(".directory-item")
|
||||||
|
const folderId = li.data("folderId")
|
||||||
|
const actorId = li.data("documentId")
|
||||||
|
const actors = actorId
|
||||||
|
? [game.actors.get(actorId)]
|
||||||
|
: folderId
|
||||||
|
? actorDirectory.folders.find(it => it.id == folderId).contents
|
||||||
|
: []
|
||||||
|
return actors.filter(it => it.type == ACTOR_TYPES.personnage)
|
||||||
|
}
|
||||||
|
|
||||||
|
exportActors(actors, targetName) {
|
||||||
|
const eol = '\n'
|
||||||
|
const header = Misc.join(this.getHeaderLine(), ';')
|
||||||
|
const actorLines = actors.map(actor => Misc.join(this.getActorLine(actor), ';'))
|
||||||
|
const data = Misc.join([header, ...actorLines], eol)
|
||||||
|
const filename = `scriptatium-${targetName?.slugify()}.csv`;
|
||||||
|
saveDataToFile(data, "text/csv", `${filename}`);
|
||||||
|
}
|
||||||
|
|
||||||
|
getHeaderLine() {
|
||||||
|
return this.mapping.map(it => it.column)
|
||||||
|
}
|
||||||
|
|
||||||
|
getActorLine(actor) {
|
||||||
|
const context = Mapping.prepareContext(actor)
|
||||||
|
return this.mapping.map(it => it.getter(actor, context))
|
||||||
|
//.map(it => JSON.stringify(it))
|
||||||
|
.map(it => this.$escapeQuotes(it))
|
||||||
|
.map(it => it.replaceAll("\n", " ").replaceAll("\r", ""))
|
||||||
|
}
|
||||||
|
|
||||||
|
$escapeQuotes(it) {
|
||||||
|
it = '' + it
|
||||||
|
if (it.includes('"') || it.includes(';')) {
|
||||||
|
return `"${it.replaceAll('"', '\\"')}"`
|
||||||
|
}
|
||||||
|
return it
|
||||||
|
}
|
||||||
|
}
|
308
module/actor/export-scriptarium/mapping.js
Normal file
308
module/actor/export-scriptarium/mapping.js
Normal file
@ -0,0 +1,308 @@
|
|||||||
|
import { Grammar } from "../../grammar.js"
|
||||||
|
import { RdDItemArme } from "../../item-arme.js"
|
||||||
|
import { RdDItemCompetence } from "../../item-competence.js"
|
||||||
|
import { RdDItemSort } from "../../item-sort.js"
|
||||||
|
import { ITEM_TYPES } from "../../item.js"
|
||||||
|
import { Misc } from "../../misc.js"
|
||||||
|
import { RdDTimestamp } from "../../time/rdd-timestamp.js"
|
||||||
|
import { RdDBonus } from "../../rdd-bonus.js"
|
||||||
|
|
||||||
|
|
||||||
|
const CATEGORIES_COMPETENCES = [
|
||||||
|
"generale",
|
||||||
|
"particuliere",
|
||||||
|
"specialisee",
|
||||||
|
"connaissance",
|
||||||
|
]
|
||||||
|
const CATEGORIES_DRACONIC = [
|
||||||
|
"draconic",
|
||||||
|
]
|
||||||
|
|
||||||
|
const CATEGORIES_COMBAT = [
|
||||||
|
"melee",
|
||||||
|
"tir",
|
||||||
|
"lancer"
|
||||||
|
]
|
||||||
|
|
||||||
|
const NIVEAU_BASE = {
|
||||||
|
"generale": -4,
|
||||||
|
"particuliere": -8,
|
||||||
|
"specialisee": -11,
|
||||||
|
"connaissance": -11,
|
||||||
|
"draconic": -11,
|
||||||
|
"melee": -6,
|
||||||
|
"tir": -8,
|
||||||
|
"lancer": -8,
|
||||||
|
}
|
||||||
|
|
||||||
|
class ColumnMappingFactory {
|
||||||
|
static createMappingArme(part, i) {
|
||||||
|
return { column: `arme-${part}-${i}`, getter: (actor, context) => Mapping.getArme(actor, context, part, i) }
|
||||||
|
}
|
||||||
|
|
||||||
|
static createMappingSort(part, i) {
|
||||||
|
return { column: `sort-${part}-${i}`, getter: (actor, context) => Mapping.getSort(actor, context, part, i) }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const NB_ARMES = 10
|
||||||
|
const NB_SORTS = 20
|
||||||
|
const TABLEAU_ARMES = [...Array(NB_ARMES).keys()]
|
||||||
|
const TABLEAU_SORTS = [...Array(NB_SORTS).keys()]
|
||||||
|
|
||||||
|
const MAPPING_BASE = [
|
||||||
|
{ column: "ID", getter: (actor, context) => actor.id },
|
||||||
|
{ column: "name", getter: (actor, context) => actor.name },
|
||||||
|
// { column: "biographie", getter: (actor, context) => actor.system.biographie },
|
||||||
|
{ column: "taille", getter: (actor, context) => actor.system.carac.taille.value },
|
||||||
|
{ column: "apparence", getter: (actor, context) => actor.system.carac.apparence.value },
|
||||||
|
{ column: "constitution", getter: (actor, context) => actor.system.carac.constitution.value },
|
||||||
|
{ column: "force", getter: (actor, context) => actor.system.carac.force.value },
|
||||||
|
{ column: "agilite", getter: (actor, context) => actor.system.carac.agilite.value },
|
||||||
|
{ column: "dexterite", getter: (actor, context) => actor.system.carac.dexterite.value },
|
||||||
|
{ column: "vue", getter: (actor, context) => actor.system.carac.vue.value },
|
||||||
|
{ column: "ouie", getter: (actor, context) => actor.system.carac.ouie.value },
|
||||||
|
{ column: "odoratgout", getter: (actor, context) => actor.system.carac.odoratgout.value },
|
||||||
|
{ column: "volonte", getter: (actor, context) => actor.system.carac.volonte.value },
|
||||||
|
{ column: "intellect", getter: (actor, context) => actor.system.carac.intellect.value },
|
||||||
|
{ column: "empathie", getter: (actor, context) => actor.system.carac.empathie.value },
|
||||||
|
{ column: "reve", getter: (actor, context) => actor.system.carac.reve.value },
|
||||||
|
{ column: "chance", getter: (actor, context) => actor.system.carac.chance.value },
|
||||||
|
{ column: "melee", getter: (actor, context) => actor.system.carac.melee.value },
|
||||||
|
{ column: "tir", getter: (actor, context) => actor.system.carac.tir.value },
|
||||||
|
{ column: "lancer", getter: (actor, context) => actor.system.carac.lancer.value },
|
||||||
|
{ column: "derobee", getter: (actor, context) => actor.system.carac.derobee.value },
|
||||||
|
{ column: "vie", getter: (actor, context) => actor.system.sante.vie.max },
|
||||||
|
{ column: "plusdom", getter: (actor, context) => actor.system.attributs.plusdom.value },
|
||||||
|
{ column: "protectionnaturelle", getter: (actor, context) => actor.system.attributs.protection.value },
|
||||||
|
{ column: "endurance", getter: (actor, context) => actor.system.sante.endurance.max },
|
||||||
|
{ column: "description", getter: (actor, context) => Mapping.getDescription(actor) },
|
||||||
|
{ column: "armure", getter: (actor, context) => Mapping.getArmure(actor, context) },
|
||||||
|
{ column: "protection", getter: (actor, context) => Mapping.getProtectionArmure(actor, context) },
|
||||||
|
{ column: "malus-armure", getter: (actor, context) => Mapping.getMalusArmure(actor, context) },
|
||||||
|
{ column: "esquive", getter: (actor, context) => Mapping.getEsquiveNiveau(context) },
|
||||||
|
{ column: "competences", getter: (actor, context) => Mapping.getCompetences(actor, CATEGORIES_COMPETENCES) },
|
||||||
|
{ column: "draconic", getter: (actor, context) => Mapping.getCompetences(actor, CATEGORIES_DRACONIC) },
|
||||||
|
]
|
||||||
|
|
||||||
|
const MAPPING_ARMES = TABLEAU_ARMES.map(i => ColumnMappingFactory.createMappingArme('name', i))
|
||||||
|
.concat(TABLEAU_ARMES.map(i => ColumnMappingFactory.createMappingArme('niveau', i)))
|
||||||
|
.concat(TABLEAU_ARMES.map(i => ColumnMappingFactory.createMappingArme('init', i)))
|
||||||
|
.concat(TABLEAU_ARMES.map(i => ColumnMappingFactory.createMappingArme('dommages', i)))
|
||||||
|
const MAPPING_SORTS = TABLEAU_SORTS.map(i => ColumnMappingFactory.createMappingSort('voie', i))
|
||||||
|
.concat(TABLEAU_SORTS.map(i => ColumnMappingFactory.createMappingSort('description', i)))
|
||||||
|
.concat(TABLEAU_SORTS.map(i => ColumnMappingFactory.createMappingSort('bonus', i)))
|
||||||
|
const MAPPING = MAPPING_BASE
|
||||||
|
.concat(MAPPING_ARMES)
|
||||||
|
.concat(MAPPING_SORTS)
|
||||||
|
|
||||||
|
export class Mapping {
|
||||||
|
|
||||||
|
static getMapping() {
|
||||||
|
return MAPPING
|
||||||
|
}
|
||||||
|
|
||||||
|
static prepareContext(actor) {
|
||||||
|
return {
|
||||||
|
armes: Mapping.prepareArmes(actor),
|
||||||
|
armure: Mapping.prepareArmure(actor),
|
||||||
|
esquive: Mapping.prepareEsquive(actor),
|
||||||
|
sorts: Mapping.prepareSorts(actor)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static prepareArmes(actor) {
|
||||||
|
const armes = actor.items.filter(it => it.type == ITEM_TYPES.arme)
|
||||||
|
return armes.map(arme =>
|
||||||
|
[
|
||||||
|
arme.system.tir != "" ? Mapping.prepareArme(actor, arme, 'tir') : undefined,
|
||||||
|
arme.system.lancer = "" ? Mapping.prepareArme(actor, arme, 'lancer') : undefined,
|
||||||
|
arme.system.unemain ? Mapping.prepareArme(actor, arme, 'unemain') : undefined,
|
||||||
|
arme.system.deuxmains ? Mapping.prepareArme(actor, arme, 'deuxmains') : undefined,
|
||||||
|
!(arme.system.unemain || arme.system.deuxmains) ? Mapping.prepareArme(actor, arme, 'competence') : undefined
|
||||||
|
]
|
||||||
|
.filter(it => it != undefined)
|
||||||
|
).reduce((a, b) => a.concat(b), [])
|
||||||
|
}
|
||||||
|
|
||||||
|
static prepareArme(actor, arme, maniement) {
|
||||||
|
const nameCompArme = RdDItemArme.getCompetenceArme(arme, maniement)
|
||||||
|
const competence = actor.getCompetence(nameCompArme)
|
||||||
|
if (RdDItemCompetence.isNiveauBase(competence)) {
|
||||||
|
return undefined
|
||||||
|
}
|
||||||
|
const dmgArme = RdDItemArme.dommagesReels(arme, maniement)
|
||||||
|
const dommages = dmgArme + RdDBonus.bonusDmg(actor, maniement, dmgArme)
|
||||||
|
return {
|
||||||
|
name: arme.name,
|
||||||
|
niveau: Misc.toSignedString(competence.system.niveau),
|
||||||
|
init: Mapping.calculBaseInit(actor, competence.system.categorie) + competence.system.niveau,
|
||||||
|
dommages: Misc.toSignedString(dommages)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static calculBaseInit(actor, categorie) {
|
||||||
|
const mapping = MAPPING_BASE.find(it => it.column == categorie)
|
||||||
|
if (mapping) {
|
||||||
|
switch (categorie) {
|
||||||
|
case 'melee':
|
||||||
|
case 'tir':
|
||||||
|
case 'lancer':
|
||||||
|
const caracteristique = Number(actor.system.carac[categorie].value)
|
||||||
|
return Math.floor(caracteristique / 2)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
static prepareArmure(actor) {
|
||||||
|
const armures = actor.itemTypes[ITEM_TYPES.armure].filter(it => it.system.equipe)
|
||||||
|
if (armures.length > 1) {
|
||||||
|
console.warn(`${actor.name} a équipé ${armures.length} armures, seule la première sera considérée`)
|
||||||
|
}
|
||||||
|
if (armures.length > 0) {
|
||||||
|
const armure = armures[0]
|
||||||
|
return {
|
||||||
|
name: armure.name,
|
||||||
|
protection: armure.system.protection,
|
||||||
|
malus: armure.system.malus ?? 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return {
|
||||||
|
name: '',
|
||||||
|
protection: actor.system.attributs.protection.value,
|
||||||
|
malus: 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static prepareEsquive(actor) {
|
||||||
|
const esquives = actor.getCompetences("Esquive")
|
||||||
|
if (esquives.length > 0) {
|
||||||
|
const esquive = esquives[0]
|
||||||
|
return {
|
||||||
|
name: esquive.name,
|
||||||
|
niveau: Misc.toSignedString(esquive.system.niveau)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return undefined
|
||||||
|
}
|
||||||
|
|
||||||
|
static prepareSorts(actor) {
|
||||||
|
return actor.itemTypes[ITEM_TYPES.sort].map(it => Mapping.prepareSort(it))
|
||||||
|
}
|
||||||
|
|
||||||
|
static prepareSort(sort) {
|
||||||
|
return {
|
||||||
|
voie: RdDItemSort.getCodeDraconic(sort),
|
||||||
|
description: Mapping.descriptionSort(sort),
|
||||||
|
bonus: Mapping.bonusCase(sort)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static descriptionSort(sort) {
|
||||||
|
const ptSeuil = Array(sort.system.coutseuil).map(it => '*')
|
||||||
|
const caseTMR = sort.system.caseTMRspeciale.length > 0 ? sort.system.caseTMRspeciale : sort.system.caseTMR
|
||||||
|
return `${sort.name}${ptSeuil} (${caseTMR}) R${sort.system.difficulte} r${sort.system.ptreve}`
|
||||||
|
}
|
||||||
|
|
||||||
|
static bonusCase(sort) {
|
||||||
|
const list = RdDItemSort.bonuscaseStringToList(sort.system.bonuscase).sort(Misc.descending(it => it.bonus))
|
||||||
|
if (list.length > 0) {
|
||||||
|
const bonus = list[0]
|
||||||
|
return `+${bonus.bonus}% en ${bonus.case}`
|
||||||
|
}
|
||||||
|
return ''
|
||||||
|
}
|
||||||
|
|
||||||
|
static getDescription(actor) {
|
||||||
|
const sexe = actor.system.sexe
|
||||||
|
const sexeFeminin = sexe.length > 0 && sexe.charAt(0).toLowerCase() == 'f' ? 'Née' : 'Né'
|
||||||
|
const race = ['', 'humain'].includes(Grammar.toLowerCaseNoAccent(actor.system.race)) ? '' : (actor.system.race + ' ')
|
||||||
|
const heure = actor.system.heure
|
||||||
|
const hn = `${sexeFeminin} à l'heure ${RdDTimestamp.definition(heure).avecArticle}`
|
||||||
|
const age = actor.system.age ? `${actor.system.age} ans` : undefined
|
||||||
|
const taille = actor.system.taille
|
||||||
|
const poids = actor.system.poids
|
||||||
|
const cheveux = actor.system.cheveux ? `cheveux ${actor.system.cheveux}` : undefined
|
||||||
|
const yeux = actor.system.yeux ? `yeux ${actor.system.yeux}` : undefined
|
||||||
|
const beaute = actor.system.beaute ? `Beauté ${actor.system.beaute}` : undefined
|
||||||
|
const list = [race, hn, age, taille, poids, cheveux, yeux, beaute]
|
||||||
|
return Misc.join(list.filter(it => it), ', ')
|
||||||
|
}
|
||||||
|
|
||||||
|
static getArmure(actor, context) {
|
||||||
|
return context.armure?.name ?? ''
|
||||||
|
}
|
||||||
|
|
||||||
|
static getProtectionArmure(actor, context) {
|
||||||
|
return Number(context?.armure?.protection ?? 0) + Number(actor.system.attributs.protection.value)
|
||||||
|
}
|
||||||
|
|
||||||
|
static getMalusArmure(actor, context) {
|
||||||
|
return context?.armure?.malus ?? 0
|
||||||
|
}
|
||||||
|
|
||||||
|
static getEsquiveNiveau(context) {
|
||||||
|
if (context.esquive) {
|
||||||
|
const niveau = context.esquive.niveau + context.armure.malus
|
||||||
|
return niveau > 0 ? ('+' + niveau) : ('' + niveau)
|
||||||
|
}
|
||||||
|
return ''
|
||||||
|
}
|
||||||
|
|
||||||
|
static getCompetences(actor, categories) {
|
||||||
|
const competences = Mapping.getCompetencesCategorie(actor, categories)
|
||||||
|
if (competences.length == 0) {
|
||||||
|
return ''
|
||||||
|
}
|
||||||
|
const byCartegories = Mapping.competencesByCategoriesByNiveau(competences, categories)
|
||||||
|
const txtByCategories = Object.values(byCartegories)
|
||||||
|
.map(it => it.competencesParNiveau)
|
||||||
|
.map(byNiveau => {
|
||||||
|
const niveaux = Object.keys(byNiveau).map(it => Number(it)).sort(Misc.ascending())
|
||||||
|
if (niveaux.length == 0) {
|
||||||
|
return ''
|
||||||
|
}
|
||||||
|
const txtCategorieByNiveau = niveaux.map(niveau => {
|
||||||
|
const names = Misc.join(byNiveau[niveau].map(it => it.name).sort(Misc.ascending()), ', ')
|
||||||
|
return names + ' ' + Misc.toSignedString(niveau)
|
||||||
|
})
|
||||||
|
const txtCategorie = Misc.join(txtCategorieByNiveau, ' / ')
|
||||||
|
return txtCategorie
|
||||||
|
}).filter(it => it != '')
|
||||||
|
|
||||||
|
return Misc.join(txtByCategories, ' / ')
|
||||||
|
}
|
||||||
|
|
||||||
|
static competencesByCategoriesByNiveau(competences, categories) {
|
||||||
|
return categories.map(c => {
|
||||||
|
return {
|
||||||
|
categorie: c,
|
||||||
|
competencesParNiveau: Misc.classify(
|
||||||
|
competences.filter(comp => comp.system.categorie == c),
|
||||||
|
comp => comp.system.niveau)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
static getArme(actor, context, part, numero) {
|
||||||
|
if (numero < context.armes.length) {
|
||||||
|
return context.armes[numero][part] ?? ''
|
||||||
|
}
|
||||||
|
return ''
|
||||||
|
}
|
||||||
|
|
||||||
|
static getCompetencesCategorie(actor, categories) {
|
||||||
|
return actor.itemTypes[ITEM_TYPES.competence]
|
||||||
|
.filter(it => categories.includes(it.system.categorie))
|
||||||
|
.filter(it => !RdDItemCompetence.isNiveauBase(it))
|
||||||
|
}
|
||||||
|
|
||||||
|
static getSort(actor, context, part, numero) {
|
||||||
|
if (numero < context.sorts.length) {
|
||||||
|
return context.sorts[numero][part]
|
||||||
|
}
|
||||||
|
return ''
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -1,5 +1,5 @@
|
|||||||
import { RdDItemCompetenceCreature } from "./item-competencecreature.js"
|
import { RdDItemCompetenceCreature } from "./item-competencecreature.js"
|
||||||
import { TYPES } from "./item.js";
|
import { ITEM_TYPES } from "./item.js";
|
||||||
import { RdDCombatManager } from "./rdd-combat.js";
|
import { RdDCombatManager } from "./rdd-combat.js";
|
||||||
|
|
||||||
const nomCategorieParade = {
|
const nomCategorieParade = {
|
||||||
@ -20,19 +20,35 @@ const nomCategorieParade = {
|
|||||||
export class RdDItemArme extends Item {
|
export class RdDItemArme extends Item {
|
||||||
|
|
||||||
static isArme(item) {
|
static isArme(item) {
|
||||||
return item.type == TYPES.arme || RdDItemCompetenceCreature.getCategorieAttaque(item);
|
return item.type == ITEM_TYPES.arme || RdDItemCompetenceCreature.getCategorieAttaque(item);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static getArme(arme) {
|
static getArme(arme) {
|
||||||
switch (arme ? arme.type : '') {
|
switch (arme ? arme.type : '') {
|
||||||
case TYPES.arme: return arme;
|
case ITEM_TYPES.arme: return arme;
|
||||||
case TYPES.competencecreature:
|
case ITEM_TYPES.competencecreature:
|
||||||
return RdDItemCompetenceCreature.armeCreature(arme);
|
return RdDItemCompetenceCreature.armeCreature(arme);
|
||||||
}
|
}
|
||||||
return RdDItemArme.mainsNues();
|
return RdDItemArme.mainsNues();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static getCompetenceArme(arme, maniement) {
|
||||||
|
switch (arme.type) {
|
||||||
|
case ITEM_TYPES.competencecreature:
|
||||||
|
return arme.name
|
||||||
|
case ITEM_TYPES.arme:
|
||||||
|
switch (maniement) {
|
||||||
|
case 'competence': return arme.system.competence;
|
||||||
|
case 'unemain': return RdDItemArme.competence1Mains(arme);
|
||||||
|
case 'deuxmains': return RdDItemArme.competence2Mains(arme);
|
||||||
|
case 'tir': return arme.system.tir;
|
||||||
|
case 'lancer': return arme.system.lancer;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return undefined
|
||||||
|
}
|
||||||
|
|
||||||
static computeNiveauArmes(armes, competences) {
|
static computeNiveauArmes(armes, competences) {
|
||||||
for (const arme of armes) {
|
for (const arme of armes) {
|
||||||
arme.system.niveau = RdDItemArme.niveauCompetenceArme(arme, competences);
|
arme.system.niveau = RdDItemArme.niveauCompetenceArme(arme, competences);
|
||||||
@ -68,14 +84,14 @@ export class RdDItemArme extends Item {
|
|||||||
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 == 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 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 '';
|
||||||
@ -132,43 +148,46 @@ export class RdDItemArme extends Item {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
static dommagesReels(arme, maniement) {
|
||||||
static armeUneOuDeuxMains(armeData, aUneMain) {
|
switch (maniement) {
|
||||||
if (armeData && !armeData.system.cac) {
|
case 'tir':
|
||||||
armeData.system.unemain = armeData.system.unemain || !armeData.system.deuxmains;
|
case 'lancer':
|
||||||
const uneOuDeuxMains = armeData.system.unemain && armeData.system.deuxmains;
|
case 'competence':
|
||||||
const containsSlash = !Number.isInteger(armeData.system.dommages) && armeData.system.dommages.includes("/");
|
return Number(arme.system.dommages)
|
||||||
if (containsSlash) { // Sanity check
|
|
||||||
armeData = foundry.utils.duplicate(armeData);
|
|
||||||
|
|
||||||
const tableauDegats = armeData.system.dommages.split("/");
|
|
||||||
if (aUneMain)
|
|
||||||
armeData.system.dommagesReels = Number(tableauDegats[0]);
|
|
||||||
else // 2 mains
|
|
||||||
armeData.system.dommagesReels = Number(tableauDegats[1]);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
armeData.system.dommagesReels = Number(armeData.system.dommages);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (uneOuDeuxMains != containsSlash) {
|
|
||||||
ui.notifications.info("Les dommages de l'arme à 1/2 mains " + armeData.name + " ne sont pas corrects (ie sous la forme X/Y)");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return armeData;
|
if (arme.system.unemain && arme.system.deuxmains) {
|
||||||
|
const containsSlash = !Number.isInteger(arme.system.dommages) && arme.system.dommages.includes("/")
|
||||||
|
if (!containsSlash) {
|
||||||
|
ui.notifications.info("Les dommages de l'arme à 1/2 mains " + arme.name + " ne sont pas corrects (ie sous la forme X/Y)");
|
||||||
|
return Number(arme.system.dommages)
|
||||||
|
}
|
||||||
|
const tableauDegats = arme.system.dommages.split("/");
|
||||||
|
return Number(tableauDegats[maniement == 'unemain' ? 0 : 1])
|
||||||
|
}
|
||||||
|
return Number(arme.system.dommages);
|
||||||
}
|
}
|
||||||
static competence2Mains(arme) {
|
|
||||||
return arme.system.competence.replace(" 1 main", " 2 mains");
|
/* -------------------------------------------- */
|
||||||
|
static armeUneOuDeuxMains(arme, aUneMain) {
|
||||||
|
if (arme && !arme.system.cac) {
|
||||||
|
arme = foundry.utils.duplicate(arme);
|
||||||
|
arme.system.dommagesReels = RdDItemArme.dommagesReels(arme, aUneMain ? 'unemain' : 'deuxmains')
|
||||||
|
}
|
||||||
|
return arme;
|
||||||
}
|
}
|
||||||
|
|
||||||
static competence1Mains(arme) {
|
static competence1Mains(arme) {
|
||||||
return arme.system.competence.replace(" 2 mains", " 1 main");
|
return arme.system.competence.replace(" 2 mains", " 1 main");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static competence2Mains(arme) {
|
||||||
|
return arme.system.competence.replace(" 1 main", " 2 mains");
|
||||||
|
}
|
||||||
|
|
||||||
static isArmeUtilisable(arme) {
|
static isArmeUtilisable(arme) {
|
||||||
switch (arme.type) {
|
switch (arme.type) {
|
||||||
case TYPES.arme: return arme.system.equipe && (arme.system.resistance > 0 || arme.system.portee_courte > 0)
|
case ITEM_TYPES.arme: return arme.system.equipe && (arme.system.resistance > 0 || arme.system.portee_courte > 0)
|
||||||
case TYPES.competencecreature: return true
|
case ITEM_TYPES.competencecreature: return true
|
||||||
}
|
}
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
@ -180,11 +199,11 @@ export class RdDItemArme extends Item {
|
|||||||
|
|
||||||
static corpsACorps(actor) {
|
static corpsACorps(actor) {
|
||||||
let competence = actor?.getCompetenceCorpsACorps() ?? { system: { niveau: -6 } };
|
let competence = actor?.getCompetenceCorpsACorps() ?? { system: { niveau: -6 } };
|
||||||
let melee = actor? actor.system.carac['melee'].value : 0
|
let melee = actor ? actor.system.carac['melee'].value : 0
|
||||||
return {
|
return {
|
||||||
_id: competence?.id,
|
_id: competence?.id,
|
||||||
name: 'Corps à corps',
|
name: 'Corps à corps',
|
||||||
type: TYPES.arme,
|
type: ITEM_TYPES.arme,
|
||||||
img: 'systems/foundryvtt-reve-de-dragon/icons/competence_corps_a_corps.webp',
|
img: 'systems/foundryvtt-reve-de-dragon/icons/competence_corps_a_corps.webp',
|
||||||
system: {
|
system: {
|
||||||
initiative: RdDCombatManager.calculInitiative(competence.system.niveau, melee),
|
initiative: RdDCombatManager.calculInitiative(competence.system.niveau, melee),
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
|
|
||||||
import { TYPES } from "./item.js";
|
import { ITEM_TYPES } from "./item.js";
|
||||||
import { RdDCombatManager } from "./rdd-combat.js";
|
import { RdDCombatManager } from "./rdd-combat.js";
|
||||||
|
|
||||||
const categories = {
|
const categories = {
|
||||||
@ -54,7 +54,7 @@ export class RdDItemCompetenceCreature extends Item {
|
|||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static isCompetenceAttaque(item) {
|
static isCompetenceAttaque(item) {
|
||||||
if (item.type == TYPES.competencecreature) {
|
if (item.type == ITEM_TYPES.competencecreature) {
|
||||||
switch (item.system.categorie) {
|
switch (item.system.categorie) {
|
||||||
case "melee":
|
case "melee":
|
||||||
case "tir":
|
case "tir":
|
||||||
@ -68,7 +68,7 @@ export class RdDItemCompetenceCreature extends Item {
|
|||||||
}
|
}
|
||||||
|
|
||||||
static getCategorieAttaque(item) {
|
static getCategorieAttaque(item) {
|
||||||
if (item.type == TYPES.competencecreature) {
|
if (item.type == ITEM_TYPES.competencecreature) {
|
||||||
switch (item.system.categorie) {
|
switch (item.system.categorie) {
|
||||||
case "melee":
|
case "melee":
|
||||||
case "tir":
|
case "tir":
|
||||||
@ -82,7 +82,7 @@ export class RdDItemCompetenceCreature extends Item {
|
|||||||
return undefined
|
return undefined
|
||||||
}
|
}
|
||||||
static isDommages(item) {
|
static isDommages(item) {
|
||||||
if (item.type == TYPES.competencecreature) {
|
if (item.type == ITEM_TYPES.competencecreature) {
|
||||||
switch (item.system.categorie) {
|
switch (item.system.categorie) {
|
||||||
case "melee":
|
case "melee":
|
||||||
case "tir":
|
case "tir":
|
||||||
@ -94,7 +94,7 @@ export class RdDItemCompetenceCreature extends Item {
|
|||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
static isParade(item) {
|
static isParade(item) {
|
||||||
if (item.type == TYPES.competencecreature) {
|
if (item.type == ITEM_TYPES.competencecreature) {
|
||||||
switch (item.system.categorie) {
|
switch (item.system.categorie) {
|
||||||
case "melee":
|
case "melee":
|
||||||
case "naturelle":
|
case "naturelle":
|
||||||
|
@ -12,7 +12,7 @@ import { SystemCompendiums } from "./settings/system-compendiums.js";
|
|||||||
import { Misc } from "./misc.js";
|
import { Misc } from "./misc.js";
|
||||||
import { RdDTimestamp } from "./time/rdd-timestamp.js";
|
import { RdDTimestamp } from "./time/rdd-timestamp.js";
|
||||||
import { RdDItemCompetenceCreature } from "./item-competencecreature.js";
|
import { RdDItemCompetenceCreature } from "./item-competencecreature.js";
|
||||||
import { TYPES } from "./item.js";
|
import { ITEM_TYPES } from "./item.js";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Extend the basic ItemSheet for RdD specific items
|
* Extend the basic ItemSheet for RdD specific items
|
||||||
@ -101,7 +101,7 @@ export class RdDItemSheet extends ItemSheet {
|
|||||||
isComestible: this.item.getUtilisationCuisine(),
|
isComestible: this.item.getUtilisationCuisine(),
|
||||||
options: RdDSheetUtility.mergeDocumentRights(this.options, this.item, this.isEditable),
|
options: RdDSheetUtility.mergeDocumentRights(this.options, this.item, this.isEditable),
|
||||||
}
|
}
|
||||||
if (this.item.type == TYPES.competencecreature) {
|
if (this.item.type == ITEM_TYPES.competencecreature) {
|
||||||
formData.isparade = RdDItemCompetenceCreature.isParade(this.item)
|
formData.isparade = RdDItemCompetenceCreature.isParade(this.item)
|
||||||
formData.isdommages = RdDItemCompetenceCreature.isDommages(this.item)
|
formData.isdommages = RdDItemCompetenceCreature.isDommages(this.item)
|
||||||
}
|
}
|
||||||
|
@ -1,9 +1,43 @@
|
|||||||
|
import { Grammar } from "./grammar.js";
|
||||||
|
import { RdDItemCompetence } from "./item-competence.js";
|
||||||
|
import { ITEM_TYPES } from "./item.js";
|
||||||
import { Misc } from "./misc.js";
|
import { Misc } from "./misc.js";
|
||||||
import { TMRUtility } from "./tmr-utility.js";
|
import { TMRUtility } from "./tmr-utility.js";
|
||||||
|
|
||||||
|
const VOIES_DRACONIC = [
|
||||||
|
{ code: 'O', label: "Voie d'Oniros", short: 'Oniros' },
|
||||||
|
{ code: 'H', label: "Voie d'Hypnos", short: 'Hypnos' },
|
||||||
|
{ code: 'N', label: "Voie de Narcos", short: 'Narcos' },
|
||||||
|
{ code: 'T', label: "Voie de Thanatos", short: 'Thanatos' },
|
||||||
|
{ code: 'O/H/N/T', label: "Oniros/Hypnos/Narcos/Thanatos", short: 'Oniros/Hypnos/Narcos/Thanatos' },
|
||||||
|
{ code: 'O/H/N', label: "Oniros/Hypnos/Narcos" }
|
||||||
|
]
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
export class RdDItemSort extends Item {
|
export class RdDItemSort extends Item {
|
||||||
|
|
||||||
|
static getDraconicsSort(draconicList, sort) {
|
||||||
|
switch (Grammar.toLowerCaseNoAccent(sort.name)) {
|
||||||
|
case "lecture d'aura":
|
||||||
|
case "detection d'aura":
|
||||||
|
return draconicList;
|
||||||
|
case "annulation de magie":
|
||||||
|
return draconicList.filter(it => !RdDItemCompetence.isThanatos(it));
|
||||||
|
}
|
||||||
|
return [RdDItemCompetence.getVoieDraconic(draconicList, sort.system.draconic)];
|
||||||
|
}
|
||||||
|
|
||||||
|
static getCodeDraconic(sort) {
|
||||||
|
switch (Grammar.toLowerCaseNoAccent(sort.name)) {
|
||||||
|
case "lecture d'aura":
|
||||||
|
case "detection d'aura":
|
||||||
|
return 'O/H/N/T'
|
||||||
|
case "annulation de magie":
|
||||||
|
return 'O/H/N'
|
||||||
|
}
|
||||||
|
const voie = VOIES_DRACONIC.find(it => it.label.includes(sort.system.draconic))
|
||||||
|
return voie?.code ?? sort.system.draconic
|
||||||
|
}
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static isDifficulteVariable(sort) {
|
static isDifficulteVariable(sort) {
|
||||||
return sort && (sort.system.difficulte.toLowerCase() == "variable");
|
return sort && (sort.system.difficulte.toLowerCase() == "variable");
|
||||||
@ -31,9 +65,9 @@ export class RdDItemSort extends Item {
|
|||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static buildBonusCaseList(bonuscase, newCase) {
|
static buildBonusCaseList(bonuscase, newCase) {
|
||||||
const list = RdDItemSort._bonuscaseStringToList(bonuscase)
|
const list = RdDItemSort.bonuscaseStringToList(bonuscase)
|
||||||
if (newCase) {
|
if (newCase) {
|
||||||
return list.concat({ case: "Nouvelle", bonus: 0 });
|
list.push({ case: "Nouvelle", bonus: 0 })
|
||||||
}
|
}
|
||||||
return list;
|
return list;
|
||||||
}
|
}
|
||||||
@ -44,7 +78,7 @@ export class RdDItemSort extends Item {
|
|||||||
*/
|
*/
|
||||||
static getBonusCaseList(item, newCase = false) {
|
static getBonusCaseList(item, newCase = false) {
|
||||||
// Gestion spéciale case bonus
|
// Gestion spéciale case bonus
|
||||||
if (item.type == 'sort') {
|
if (item.type == ITEM_TYPES.sort) {
|
||||||
return RdDItemSort.buildBonusCaseList(item.system.bonuscase, newCase);
|
return RdDItemSort.buildBonusCaseList(item.system.bonuscase, newCase);
|
||||||
}
|
}
|
||||||
return undefined;
|
return undefined;
|
||||||
@ -104,8 +138,11 @@ export class RdDItemSort extends Item {
|
|||||||
.sort(Misc.ascending())
|
.sort(Misc.ascending())
|
||||||
.join(',');
|
.join(',');
|
||||||
}
|
}
|
||||||
static _bonuscaseStringToList(bonuscase) {
|
static bonuscaseStringToList(bonuscase) {
|
||||||
return (bonuscase ?? '').split(',').map(it => {
|
if (bonuscase == undefined || bonuscase == '') {
|
||||||
|
return []
|
||||||
|
}
|
||||||
|
return bonuscase.split(',').map(it => {
|
||||||
const b = it.split(':');
|
const b = it.split(':');
|
||||||
return { case: b[0], bonus: b[1] };
|
return { case: b[0], bonus: b[1] };
|
||||||
});
|
});
|
||||||
|
118
module/item.js
118
module/item.js
@ -9,7 +9,15 @@ import { RdDRaretes } from "./item/raretes.js";
|
|||||||
import { RdDItemCompetence } from "./item-competence.js";
|
import { RdDItemCompetence } from "./item-competence.js";
|
||||||
import { RdDItemCompetenceCreature } from "./item-competencecreature.js";
|
import { RdDItemCompetenceCreature } from "./item-competencecreature.js";
|
||||||
|
|
||||||
export const TYPES = {
|
export const ACTOR_TYPES = {
|
||||||
|
personnage: 'personnage',
|
||||||
|
creature: 'creature',
|
||||||
|
entite: 'entite',
|
||||||
|
commerce: 'commerce',
|
||||||
|
vehicule: 'vehicule'
|
||||||
|
}
|
||||||
|
|
||||||
|
export const ITEM_TYPES = {
|
||||||
competence: 'competence',
|
competence: 'competence',
|
||||||
competencecreature: 'competencecreature',
|
competencecreature: 'competencecreature',
|
||||||
empoignade: 'empoignade',
|
empoignade: 'empoignade',
|
||||||
@ -56,33 +64,33 @@ export const TYPES = {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const typesInventaireMateriel = [
|
const typesInventaireMateriel = [
|
||||||
TYPES.arme,
|
ITEM_TYPES.arme,
|
||||||
TYPES.armure,
|
ITEM_TYPES.armure,
|
||||||
TYPES.conteneur,
|
ITEM_TYPES.conteneur,
|
||||||
TYPES.faune,
|
ITEM_TYPES.faune,
|
||||||
TYPES.gemme,
|
ITEM_TYPES.gemme,
|
||||||
TYPES.herbe,
|
ITEM_TYPES.herbe,
|
||||||
TYPES.plante,
|
ITEM_TYPES.plante,
|
||||||
TYPES.ingredient,
|
ITEM_TYPES.ingredient,
|
||||||
TYPES.livre,
|
ITEM_TYPES.livre,
|
||||||
TYPES.monnaie,
|
ITEM_TYPES.monnaie,
|
||||||
TYPES.munition,
|
ITEM_TYPES.munition,
|
||||||
TYPES.nourritureboisson,
|
ITEM_TYPES.nourritureboisson,
|
||||||
TYPES.objet,
|
ITEM_TYPES.objet,
|
||||||
TYPES.potion,
|
ITEM_TYPES.potion,
|
||||||
]
|
]
|
||||||
const typesInventaire = {
|
const typesInventaire = {
|
||||||
materiel: typesInventaireMateriel,
|
materiel: typesInventaireMateriel,
|
||||||
all: ['service'].concat(typesInventaireMateriel),
|
all: ['service'].concat(typesInventaireMateriel),
|
||||||
}
|
}
|
||||||
|
|
||||||
const typesObjetsOeuvres = [TYPES.oeuvre, TYPES.recettecuisine, TYPES.musique, TYPES.chant, TYPES.danse, TYPES.jeu]
|
const typesObjetsOeuvres = [ITEM_TYPES.oeuvre, ITEM_TYPES.recettecuisine, ITEM_TYPES.musique, ITEM_TYPES.chant, ITEM_TYPES.danse, ITEM_TYPES.jeu]
|
||||||
const typesObjetsDraconiques = [TYPES.queue, TYPES.ombre, TYPES.souffle, TYPES.tete, TYPES.signedraconique, TYPES.sortreserve, TYPES.rencontre]
|
const typesObjetsDraconiques = [ITEM_TYPES.queue, ITEM_TYPES.ombre, ITEM_TYPES.souffle, ITEM_TYPES.tete, ITEM_TYPES.signedraconique, ITEM_TYPES.sortreserve, ITEM_TYPES.rencontre]
|
||||||
const typesObjetsConnaissance = [TYPES.meditation, TYPES.recettealchimique, TYPES.sort]
|
const typesObjetsConnaissance = [ITEM_TYPES.meditation, ITEM_TYPES.recettealchimique, ITEM_TYPES.sort]
|
||||||
const typesObjetsEffet = [TYPES.possession, TYPES.poison, TYPES.maladie, TYPES.blessure]
|
const typesObjetsEffet = [ITEM_TYPES.possession, ITEM_TYPES.poison, ITEM_TYPES.maladie, ITEM_TYPES.blessure]
|
||||||
const typesObjetsCompetence = [TYPES.competence, TYPES.competencecreature]
|
const typesObjetsCompetence = [ITEM_TYPES.competence, ITEM_TYPES.competencecreature]
|
||||||
const typesObjetsTemporels = [TYPES.blessure, TYPES.poison, TYPES.maladie, TYPES.queue, TYPES.ombre, TYPES.souffle, TYPES.signedraconique, TYPES.rencontre]
|
const typesObjetsTemporels = [ITEM_TYPES.blessure, ITEM_TYPES.poison, ITEM_TYPES.maladie, ITEM_TYPES.queue, ITEM_TYPES.ombre, ITEM_TYPES.souffle, ITEM_TYPES.signedraconique, ITEM_TYPES.rencontre]
|
||||||
const typesObjetsEquipable = [TYPES.arme, TYPES.armure, TYPES.objet];
|
const typesObjetsEquipable = [ITEM_TYPES.arme, ITEM_TYPES.armure, ITEM_TYPES.objet];
|
||||||
const typesEnvironnement = typesInventaireMateriel;
|
const typesEnvironnement = typesInventaireMateriel;
|
||||||
const encBrin = 0.00005; // un brin = 1 décigramme = 1/10g = 1/10000kg = 1/20000 enc
|
const encBrin = 0.00005; // un brin = 1 décigramme = 1/10g = 1/10000kg = 1/20000 enc
|
||||||
const encPepin = 0.0007; /* un pépin de gemme = 1/10 cm3 = 1/1000 l = 3.5/1000 kg = 7/2000 kg = 7/1000 enc
|
const encPepin = 0.0007; /* un pépin de gemme = 1/10 cm3 = 1/1000 l = 3.5/1000 kg = 7/2000 kg = 7/1000 enc
|
||||||
@ -141,12 +149,12 @@ export class RdDItem extends Item {
|
|||||||
static isFieldInventaireModifiable(type, field) {
|
static isFieldInventaireModifiable(type, field) {
|
||||||
switch (field) {
|
switch (field) {
|
||||||
case 'quantite':
|
case 'quantite':
|
||||||
if ([TYPES.conteneur].includes(type)) {
|
if ([ITEM_TYPES.conteneur].includes(type)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 'cout':
|
case 'cout':
|
||||||
if ([TYPES.monnaie].includes(type)) {
|
if ([ITEM_TYPES.monnaie].includes(type)) {
|
||||||
return game.user.isGM;
|
return game.user.isGM;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@ -195,15 +203,15 @@ export class RdDItem extends Item {
|
|||||||
|
|
||||||
getUniteQuantite() {
|
getUniteQuantite() {
|
||||||
switch (this.type) {
|
switch (this.type) {
|
||||||
case TYPES.monnaie: return "(Pièces)"
|
case ITEM_TYPES.monnaie: return "(Pièces)"
|
||||||
case TYPES.herbe:
|
case ITEM_TYPES.herbe:
|
||||||
switch (this.system.categorie) {
|
switch (this.system.categorie) {
|
||||||
case 'Alchimie': case 'Repos': case 'Soin':
|
case 'Alchimie': case 'Repos': case 'Soin':
|
||||||
return "(Brins)"
|
return "(Brins)"
|
||||||
case 'Cuisine': return '';
|
case 'Cuisine': return '';
|
||||||
}
|
}
|
||||||
return '';
|
return '';
|
||||||
case TYPES.ingredient: return "(Pépins ou Brins)"
|
case ITEM_TYPES.ingredient: return "(Pépins ou Brins)"
|
||||||
}
|
}
|
||||||
return '';
|
return '';
|
||||||
}
|
}
|
||||||
@ -212,13 +220,13 @@ export class RdDItem extends Item {
|
|||||||
return typesObjetsEquipable.includes(this.type)
|
return typesObjetsEquipable.includes(this.type)
|
||||||
}
|
}
|
||||||
|
|
||||||
isCompetencePersonnage() { return this.type == TYPES.competence }
|
isCompetencePersonnage() { return this.type == ITEM_TYPES.competence }
|
||||||
isCompetenceCreature() { return this.type == TYPES.competencecreature }
|
isCompetenceCreature() { return this.type == ITEM_TYPES.competencecreature }
|
||||||
isConteneur() { return this.type == TYPES.conteneur; }
|
isConteneur() { return this.type == ITEM_TYPES.conteneur; }
|
||||||
isMonnaie() { return this.type == TYPES.monnaie; }
|
isMonnaie() { return this.type == ITEM_TYPES.monnaie; }
|
||||||
isPotion() { return this.type == TYPES.potion; }
|
isPotion() { return this.type == ITEM_TYPES.potion; }
|
||||||
isNourritureBoisson() { return this.type == TYPES.nourritureboisson; }
|
isNourritureBoisson() { return this.type == ITEM_TYPES.nourritureboisson; }
|
||||||
isService() { return this.type == TYPES.service; }
|
isService() { return this.type == ITEM_TYPES.service; }
|
||||||
|
|
||||||
isCompetence() { return typesObjetsCompetence.includes(this.type) }
|
isCompetence() { return typesObjetsCompetence.includes(this.type) }
|
||||||
isEsquive() {
|
isEsquive() {
|
||||||
@ -237,27 +245,27 @@ export class RdDItem extends Item {
|
|||||||
return this.isCompetence() && ['melee', 'tir', 'lancer'].includes(this.system.categorie)
|
return this.isCompetence() && ['melee', 'tir', 'lancer'].includes(this.system.categorie)
|
||||||
}
|
}
|
||||||
|
|
||||||
isCompetencePossession() { return TYPES.competencecreature == this.type && this.system.categorie == "possession" }
|
isCompetencePossession() { return ITEM_TYPES.competencecreature == this.type && this.system.categorie == "possession" }
|
||||||
isTemporel() { return typesObjetsTemporels.includes(this.type) }
|
isTemporel() { return typesObjetsTemporels.includes(this.type) }
|
||||||
isOeuvre() { return typesObjetsOeuvres.includes(this.type) }
|
isOeuvre() { return typesObjetsOeuvres.includes(this.type) }
|
||||||
isDraconique() { return RdDItem.getItemTypesDraconiques().includes(this.type) }
|
isDraconique() { return RdDItem.getItemTypesDraconiques().includes(this.type) }
|
||||||
isQueueDragon() { return [TYPES.queue, TYPES.ombre].includes(this.type) }
|
isQueueDragon() { return [ITEM_TYPES.queue, ITEM_TYPES.ombre].includes(this.type) }
|
||||||
isEffet() { return typesObjetsEffet.includes(this.type) }
|
isEffet() { return typesObjetsEffet.includes(this.type) }
|
||||||
isConnaissance() { return typesObjetsConnaissance.includes(this.type) }
|
isConnaissance() { return typesObjetsConnaissance.includes(this.type) }
|
||||||
|
|
||||||
isInventaire(mode = 'materiel') { return RdDItem.getItemTypesInventaire(mode).includes(this.type); }
|
isInventaire(mode = 'materiel') { return RdDItem.getItemTypesInventaire(mode).includes(this.type); }
|
||||||
isBoisson() { return this.isNourritureBoisson() && this.system.boisson; }
|
isBoisson() { return this.isNourritureBoisson() && this.system.boisson; }
|
||||||
isAlcool() { return this.isNourritureBoisson() && this.system.boisson && this.system.alcoolise; }
|
isAlcool() { return this.isNourritureBoisson() && this.system.boisson && this.system.alcoolise; }
|
||||||
isHerbeAPotion() { return this.type == TYPES.herbe && (this.system.categorie == 'Soin' || this.system.categorie == 'Repos'); }
|
isHerbeAPotion() { return this.type == ITEM_TYPES.herbe && (this.system.categorie == 'Soin' || this.system.categorie == 'Repos'); }
|
||||||
isBlessure() { return this.type == TYPES.blessure }
|
isBlessure() { return this.type == ITEM_TYPES.blessure }
|
||||||
|
|
||||||
isPresentDansMilieux(milieux) {
|
isPresentDansMilieux(milieux) {
|
||||||
return this.getEnvironnements(milieux).length > 0
|
return this.getEnvironnements(milieux).length > 0
|
||||||
}
|
}
|
||||||
getCategories() {
|
getCategories() {
|
||||||
switch (this.type) {
|
switch (this.type) {
|
||||||
case TYPES.competence: return RdDItemCompetence.getCategories()
|
case ITEM_TYPES.competence: return RdDItemCompetence.getCategories()
|
||||||
case TYPES.competencecreature: return RdDItemCompetenceCreature.getCategories()
|
case ITEM_TYPES.competencecreature: return RdDItemCompetenceCreature.getCategories()
|
||||||
}
|
}
|
||||||
return {}
|
return {}
|
||||||
}
|
}
|
||||||
@ -341,15 +349,15 @@ export class RdDItem extends Item {
|
|||||||
|
|
||||||
getUtilisation() {
|
getUtilisation() {
|
||||||
switch (this.type) {
|
switch (this.type) {
|
||||||
case TYPES.potion:
|
case ITEM_TYPES.potion:
|
||||||
switch (this.system.categorie) {
|
switch (this.system.categorie) {
|
||||||
case 'Alchimie': case 'AlchimieEnchante': case 'AlchimieAutre': return 'alchimie'
|
case 'Alchimie': case 'AlchimieEnchante': case 'AlchimieAutre': return 'alchimie'
|
||||||
case 'Cuisine': return 'cuisine'
|
case 'Cuisine': return 'cuisine'
|
||||||
case 'Remede': case 'Repos': case 'ReposEnchante': case 'Soin': case 'SoinEnchante': return 'soins'
|
case 'Remede': case 'Repos': case 'ReposEnchante': case 'Soin': case 'SoinEnchante': return 'soins'
|
||||||
}
|
}
|
||||||
return '';
|
return '';
|
||||||
case TYPES.nourritureboisson: return 'cuisine';
|
case ITEM_TYPES.nourritureboisson: return 'cuisine';
|
||||||
case TYPES.herbe: case TYPES.faune: case TYPES.ingredient: case TYPES.plante:
|
case ITEM_TYPES.herbe: case ITEM_TYPES.faune: case ITEM_TYPES.ingredient: case ITEM_TYPES.plante:
|
||||||
switch (this.system.categorie) {
|
switch (this.system.categorie) {
|
||||||
case 'Cuisine': return 'cuisine';
|
case 'Cuisine': return 'cuisine';
|
||||||
case 'Toxique': case 'Poison': return 'poison';
|
case 'Toxique': case 'Poison': return 'poison';
|
||||||
@ -364,9 +372,9 @@ export class RdDItem extends Item {
|
|||||||
getUtilisationCuisine() {
|
getUtilisationCuisine() {
|
||||||
if (this.getUtilisation() == 'cuisine') {
|
if (this.getUtilisation() == 'cuisine') {
|
||||||
switch (this.type) {
|
switch (this.type) {
|
||||||
case TYPES.nourritureboisson:
|
case ITEM_TYPES.nourritureboisson:
|
||||||
return 'pret';
|
return 'pret';
|
||||||
case TYPES.herbe: case TYPES.faune: case TYPES.ingredient: case TYPES.plante:
|
case ITEM_TYPES.herbe: case ITEM_TYPES.faune: case ITEM_TYPES.ingredient: case ITEM_TYPES.plante:
|
||||||
return 'brut';
|
return 'brut';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -374,7 +382,7 @@ export class RdDItem extends Item {
|
|||||||
}
|
}
|
||||||
|
|
||||||
isCristalAlchimique() {
|
isCristalAlchimique() {
|
||||||
return this.type == TYPES.objet && Grammar.includesLowerCaseNoAccent(this.name, 'cristal alchimique') && this.system.quantite > 0;
|
return this.type == ITEM_TYPES.objet && Grammar.includesLowerCaseNoAccent(this.name, 'cristal alchimique') && this.system.quantite > 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
isMagique() {
|
isMagique() {
|
||||||
@ -402,11 +410,11 @@ export class RdDItem extends Item {
|
|||||||
|
|
||||||
getEnc() {
|
getEnc() {
|
||||||
switch (this.type) {
|
switch (this.type) {
|
||||||
case TYPES.service:
|
case ITEM_TYPES.service:
|
||||||
return 0;
|
return 0;
|
||||||
case TYPES.herbe:
|
case ITEM_TYPES.herbe:
|
||||||
return this.getEncHerbe();
|
return this.getEncHerbe();
|
||||||
case TYPES.gemme:
|
case ITEM_TYPES.gemme:
|
||||||
return encPepin * this.system.taille;
|
return encPepin * this.system.taille;
|
||||||
}
|
}
|
||||||
return Math.max(this.system.encombrement ?? 0, 0);
|
return Math.max(this.system.encombrement ?? 0, 0);
|
||||||
@ -484,7 +492,7 @@ export class RdDItem extends Item {
|
|||||||
|
|
||||||
getActionPrincipale(options = { warnIfNot: true }) {
|
getActionPrincipale(options = { warnIfNot: true }) {
|
||||||
switch (this.type) {
|
switch (this.type) {
|
||||||
case TYPES.conteneur: return 'Ouvrir';
|
case ITEM_TYPES.conteneur: return 'Ouvrir';
|
||||||
}
|
}
|
||||||
if (this.actor?.isPersonnage()) {
|
if (this.actor?.isPersonnage()) {
|
||||||
const warn = options.warnIfNot;
|
const warn = options.warnIfNot;
|
||||||
@ -492,11 +500,11 @@ export class RdDItem extends Item {
|
|||||||
return 'Cuisiner';
|
return 'Cuisiner';
|
||||||
}
|
}
|
||||||
switch (this.type) {
|
switch (this.type) {
|
||||||
case TYPES.nourritureboisson: return this._actionOrWarnQuantiteZero(this.system.boisson ? 'Boire' : 'Manger', warn);
|
case ITEM_TYPES.nourritureboisson: return this._actionOrWarnQuantiteZero(this.system.boisson ? 'Boire' : 'Manger', warn);
|
||||||
case TYPES.potion: return this._actionOrWarnQuantiteZero('Consommer', warn);
|
case ITEM_TYPES.potion: return this._actionOrWarnQuantiteZero('Consommer', warn);
|
||||||
case TYPES.livre: return this._actionOrWarnQuantiteZero('Lire', warn);
|
case ITEM_TYPES.livre: return this._actionOrWarnQuantiteZero('Lire', warn);
|
||||||
case TYPES.herbe: return this.isHerbeAPotion() ? this._actionOrWarnQuantiteZero('Décoction', warn) : undefined;
|
case ITEM_TYPES.herbe: return this.isHerbeAPotion() ? this._actionOrWarnQuantiteZero('Décoction', warn) : undefined;
|
||||||
case TYPES.queue: case TYPES.ombre: return this.system.refoulement > 0 ? 'Refouler' : undefined;
|
case ITEM_TYPES.queue: case ITEM_TYPES.ombre: return this.system.refoulement > 0 ? 'Refouler' : undefined;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return undefined;
|
return undefined;
|
||||||
|
@ -2,7 +2,7 @@ import { RdDBaseActor } from "./actor/base-actor.js";
|
|||||||
import { LOG_HEAD, SYSTEM_RDD } from "./constants.js";
|
import { LOG_HEAD, SYSTEM_RDD } from "./constants.js";
|
||||||
import { Grammar } from "./grammar.js";
|
import { Grammar } from "./grammar.js";
|
||||||
import { Monnaie } from "./item-monnaie.js";
|
import { Monnaie } from "./item-monnaie.js";
|
||||||
import { RdDItem, TYPES } from "./item.js";
|
import { RdDItem, ITEM_TYPES } from "./item.js";
|
||||||
import { RdDTimestamp } from "./time/rdd-timestamp.js";
|
import { RdDTimestamp } from "./time/rdd-timestamp.js";
|
||||||
import { RdDRaretes } from "./item/raretes.js";
|
import { RdDRaretes } from "./item/raretes.js";
|
||||||
import { RdDCalendrier } from "./time/rdd-calendrier.js";
|
import { RdDCalendrier } from "./time/rdd-calendrier.js";
|
||||||
@ -465,7 +465,7 @@ class _10_7_19_CategorieCompetenceCreature extends Migration {
|
|||||||
|
|
||||||
async migrate() {
|
async migrate() {
|
||||||
await this.applyItemsUpdates(items => items
|
await this.applyItemsUpdates(items => items
|
||||||
.filter(it => TYPES.competencecreature == it.type)
|
.filter(it => ITEM_TYPES.competencecreature == it.type)
|
||||||
.map(it => this.migrateCompetenceCreature(it))
|
.map(it => this.migrateCompetenceCreature(it))
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@ -502,7 +502,7 @@ class _10_7_19_PossessionsEntiteVictime extends Migration {
|
|||||||
|
|
||||||
async migrate() {
|
async migrate() {
|
||||||
await this.applyItemsUpdates(items => items
|
await this.applyItemsUpdates(items => items
|
||||||
.filter(it => TYPES.possession == it.type)
|
.filter(it => ITEM_TYPES.possession == it.type)
|
||||||
.map(it => this.migratePossession(it))
|
.map(it => this.migratePossession(it))
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -31,8 +31,8 @@ export class RdDBonus {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static dmg(rollData, dmgActor, isEntiteIncarnee = false) {
|
static dmg(rollData, actor, isEntiteIncarnee = false) {
|
||||||
const dmgArme = RdDBonus._dmgArme(rollData)
|
const dmgArme = RdDBonus.dmgArme(rollData.arme)
|
||||||
let dmg = {
|
let dmg = {
|
||||||
total: 0,
|
total: 0,
|
||||||
dmgArme: dmgArme,
|
dmgArme: dmgArme,
|
||||||
@ -41,7 +41,7 @@ export class RdDBonus {
|
|||||||
dmgParticuliere: RdDBonus._dmgParticuliere(rollData),
|
dmgParticuliere: RdDBonus._dmgParticuliere(rollData),
|
||||||
dmgSurprise: RdDBonus.dmgBonus(rollData.ajustements?.attaqueDefenseurSurpris.used),
|
dmgSurprise: RdDBonus.dmgBonus(rollData.ajustements?.attaqueDefenseurSurpris.used),
|
||||||
mortalite: RdDBonus._calculMortalite(rollData, isEntiteIncarnee),
|
mortalite: RdDBonus._calculMortalite(rollData, isEntiteIncarnee),
|
||||||
dmgActor: RdDBonus._dmgPerso(dmgActor, rollData.selectedCarac?.label, dmgArme)
|
dmgActor: RdDBonus.bonusDmg(actor, rollData.selectedCarac?.label.toLowerCase(), dmgArme)
|
||||||
}
|
}
|
||||||
dmg.total = dmg.dmgSurprise + dmg.dmgTactique + dmg.dmgArme + dmg.dmgActor + dmg.dmgParticuliere;
|
dmg.total = dmg.dmgSurprise + dmg.dmgTactique + dmg.dmgArme + dmg.dmgActor + dmg.dmgParticuliere;
|
||||||
return dmg;
|
return dmg;
|
||||||
@ -71,11 +71,11 @@ export class RdDBonus {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static _dmgArme(rollData) {
|
static dmgArme(arme) {
|
||||||
if (rollData.arme) {
|
if (arme) {
|
||||||
let dmgBase = rollData.arme.system.dommagesReels ?? Number(rollData.arme.system.dommages ?? 0);
|
let dmgBase = arme.system.dommagesReels ?? Number(arme.system.dommages ?? 0);
|
||||||
//Le bonus dégats magiques ne peut pas faire dépasser le bonus de l'arme (cf p.278)
|
//Le bonus dégats magiques ne peut pas faire dépasser le bonus de l'arme (cf p.278)
|
||||||
return dmgBase + Math.min(dmgBase, rollData.arme.system.magique ? rollData.arme.system.ecaille_efficacite : 0);
|
return dmgBase + Math.min(dmgBase, arme.system.magique ? arme.system.ecaille_efficacite : 0);
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -86,13 +86,14 @@ export class RdDBonus {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static _dmgPerso(dmgActor, categorie, dmgArme) {
|
static bonusDmg(actor, categorie, dmgArme) {
|
||||||
|
const dmgActor = actor.getBonusDegat()
|
||||||
if (categorie == undefined) {
|
if (categorie == undefined) {
|
||||||
return 0
|
return 0
|
||||||
}
|
}
|
||||||
switch (categorie) {
|
switch (categorie) {
|
||||||
case "Tir": return 0;
|
case "tir": return 0;
|
||||||
case "Lancer": return Math.max(0, Math.min(dmgArme, dmgActor));
|
case "lancer": return Math.max(0, Math.min(dmgArme, dmgActor));
|
||||||
}
|
}
|
||||||
return dmgActor;
|
return dmgActor;
|
||||||
}
|
}
|
||||||
|
@ -864,7 +864,7 @@ export class RdDCombat {
|
|||||||
async _onAttaqueNormale(attackerRoll) {
|
async _onAttaqueNormale(attackerRoll) {
|
||||||
console.log("RdDCombat.onAttaqueNormale >>>", attackerRoll);
|
console.log("RdDCombat.onAttaqueNormale >>>", attackerRoll);
|
||||||
|
|
||||||
attackerRoll.dmg = RdDBonus.dmg(attackerRoll, this.attacker.getBonusDegat(), this.defender.isEntite());
|
attackerRoll.dmg = RdDBonus.dmg(attackerRoll, this.attacker, this.defender.isEntite());
|
||||||
let defenderRoll = { attackerRoll: attackerRoll, passeArme: attackerRoll.passeArme, show: {} }
|
let defenderRoll = { attackerRoll: attackerRoll, passeArme: attackerRoll.passeArme, show: {} }
|
||||||
attackerRoll.show = {
|
attackerRoll.show = {
|
||||||
cible: this.target ? this.defender.name : 'la cible',
|
cible: this.target ? this.defender.name : 'la cible',
|
||||||
|
@ -5,7 +5,7 @@ import { RdDItemCompetenceCreature } from "./item-competencecreature.js";
|
|||||||
import { ChatUtility } from "./chat-utility.js";
|
import { ChatUtility } from "./chat-utility.js";
|
||||||
import { STATUSES } from "./settings/status-effects.js";
|
import { STATUSES } from "./settings/status-effects.js";
|
||||||
import { ReglesOptionnelles } from "./settings/regles-optionnelles.js";
|
import { ReglesOptionnelles } from "./settings/regles-optionnelles.js";
|
||||||
import { TYPES } from "./item.js";
|
import { ITEM_TYPES } from "./item.js";
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
|
|
||||||
@ -92,18 +92,18 @@ export class RdDEmpoignade {
|
|||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static isEmpoignadeEnCours(actor) {
|
static isEmpoignadeEnCours(actor) {
|
||||||
return actor.itemTypes[TYPES.empoignade].find(it => it.system.pointsemp > 0)
|
return actor.itemTypes[ITEM_TYPES.empoignade].find(it => it.system.pointsemp > 0)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static getEmpoignadeById(actor, id) {
|
static getEmpoignadeById(actor, id) {
|
||||||
let emp = actor.itemTypes[TYPES.empoignade].find(it => it.system.empoignadeid == id)
|
let emp = actor.itemTypes[ITEM_TYPES.empoignade].find(it => it.system.empoignadeid == id)
|
||||||
return emp && foundry.utils.duplicate(emp) || undefined;
|
return emp && foundry.utils.duplicate(emp) || undefined;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static getEmpoignade(attacker, defender) {
|
static getEmpoignade(attacker, defender) {
|
||||||
let emp = attacker.itemTypes[TYPES.empoignade].find(it =>
|
let emp = attacker.itemTypes[ITEM_TYPES.empoignade].find(it =>
|
||||||
(it.system.empoigneurid == attacker.id && it.system.empoigneid == defender.id) ||
|
(it.system.empoigneurid == attacker.id && it.system.empoigneid == defender.id) ||
|
||||||
(it.system.empoigneurid == defender.id && it.system.empoigneid == attacker.id)
|
(it.system.empoigneurid == defender.id && it.system.empoigneid == attacker.id)
|
||||||
)
|
)
|
||||||
|
@ -6,7 +6,7 @@ import { RdDTimestamp } from "./time/rdd-timestamp.js";
|
|||||||
export class RdDHerbes extends Item {
|
export class RdDHerbes extends Item {
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static async initializeHerbes() {
|
static async onReady() {
|
||||||
this.herbesSoins = await RdDHerbes.listCategorieHerbes('Soin');
|
this.herbesSoins = await RdDHerbes.listCategorieHerbes('Soin');
|
||||||
this.herbesRepos = await RdDHerbes.listCategorieHerbes('Repos');
|
this.herbesRepos = await RdDHerbes.listCategorieHerbes('Repos');
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
import { RdDItemArme } from "./item-arme.js";
|
import { RdDItemArme } from "./item-arme.js";
|
||||||
import { RdDItemCompetenceCreature } from "./item-competencecreature.js";
|
import { RdDItemCompetenceCreature } from "./item-competencecreature.js";
|
||||||
import { TYPES } from "./item.js";
|
import { ITEM_TYPES } from "./item.js";
|
||||||
|
|
||||||
export class RdDHotbar {
|
export class RdDHotbar {
|
||||||
|
|
||||||
@ -35,7 +35,7 @@ export class RdDHotbar {
|
|||||||
|
|
||||||
static async addToHotbar(item, slot) {
|
static async addToHotbar(item, slot) {
|
||||||
switch (item?.type ?? '') {
|
switch (item?.type ?? '') {
|
||||||
case TYPES.arme:
|
case ITEM_TYPES.arme:
|
||||||
{
|
{
|
||||||
// Les armes peuvent avoir plusieurs usages
|
// Les armes peuvent avoir plusieurs usages
|
||||||
if (item.system.competence != '') {
|
if (item.system.competence != '') {
|
||||||
@ -54,12 +54,12 @@ export class RdDHotbar {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
return
|
return
|
||||||
case TYPES.competencecreature:
|
case ITEM_TYPES.competencecreature:
|
||||||
const categorie = RdDItemCompetenceCreature.getCategorieAttaque(item) ?? 'competence';
|
const categorie = RdDItemCompetenceCreature.getCategorieAttaque(item) ?? 'competence';
|
||||||
await this.createItemMacro(item, slot, categorie)
|
await this.createItemMacro(item, slot, categorie)
|
||||||
return
|
return
|
||||||
default:
|
default:
|
||||||
case TYPES.competence:
|
case ITEM_TYPES.competence:
|
||||||
await this.createItemMacro(item, slot++, 'competence')
|
await this.createItemMacro(item, slot++, 'competence')
|
||||||
if (item.isCorpsACorps()) {
|
if (item.isCorpsACorps()) {
|
||||||
await this.createItemMacro(item, slot++, 'pugilat')
|
await this.createItemMacro(item, slot++, 'pugilat')
|
||||||
@ -79,7 +79,7 @@ export class RdDHotbar {
|
|||||||
* Actor - open actor sheet
|
* Actor - open actor sheet
|
||||||
* Journal - open journal sheet
|
* Journal - open journal sheet
|
||||||
*/
|
*/
|
||||||
static initDropbar() {
|
static init() {
|
||||||
|
|
||||||
Hooks.on('hotbarDrop', (bar, documentData, slot) => {
|
Hooks.on('hotbarDrop', (bar, documentData, slot) => {
|
||||||
|
|
||||||
@ -88,9 +88,9 @@ export class RdDHotbar {
|
|||||||
const item = fromUuidSync(documentData.uuid) ?? this.actor.items.get(documentData.uuid)
|
const item = fromUuidSync(documentData.uuid) ?? this.actor.items.get(documentData.uuid)
|
||||||
console.log('DROP', documentData, item)
|
console.log('DROP', documentData, item)
|
||||||
switch (item?.type) {
|
switch (item?.type) {
|
||||||
case TYPES.arme:
|
case ITEM_TYPES.arme:
|
||||||
case TYPES.competence:
|
case ITEM_TYPES.competence:
|
||||||
case TYPES.competencecreature:
|
case ITEM_TYPES.competencecreature:
|
||||||
this.addToHotbar(item, slot)
|
this.addToHotbar(item, slot)
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
@ -116,9 +116,9 @@ export class RdDHotbar {
|
|||||||
|
|
||||||
// Trigger the item roll
|
// Trigger the item roll
|
||||||
switch (item.type) {
|
switch (item.type) {
|
||||||
case TYPES.arme:
|
case ITEM_TYPES.arme:
|
||||||
return actor.rollArme(item, categorieArme);
|
return actor.rollArme(item, categorieArme);
|
||||||
case TYPES.competence:
|
case ITEM_TYPES.competence:
|
||||||
if (item.isCorpsACorps()) {
|
if (item.isCorpsACorps()) {
|
||||||
switch (categorieArme) {
|
switch (categorieArme) {
|
||||||
case 'pugilat':
|
case 'pugilat':
|
||||||
@ -128,7 +128,7 @@ export class RdDHotbar {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
return actor.rollCompetence(item);
|
return actor.rollCompetence(item);
|
||||||
case TYPES.competencecreature:
|
case ITEM_TYPES.competencecreature:
|
||||||
return item.system.iscombat && !item.system.isparade
|
return item.system.iscombat && !item.system.isparade
|
||||||
? actor.rollArme(item, categorieArme)
|
? actor.rollArme(item, categorieArme)
|
||||||
: actor.rollCompetence(item);
|
: actor.rollCompetence(item);
|
||||||
|
@ -1,69 +1,72 @@
|
|||||||
import { SYSTEM_RDD, SYSTEM_SOCKET_ID, RDD_CONFIG } from "./constants.js";
|
import { SYSTEM_RDD, SYSTEM_SOCKET_ID, RDD_CONFIG } from "./constants.js"
|
||||||
import { Migrations } from './migrations.js';
|
import { Migrations } from './migrations.js'
|
||||||
|
|
||||||
import { RdDUtility } from "./rdd-utility.js";
|
import { RdDUtility } from "./rdd-utility.js"
|
||||||
import { TMRUtility } from "./tmr-utility.js";
|
import { TMRUtility } from "./tmr-utility.js"
|
||||||
import { TMRRencontres } from "./tmr-rencontres.js";
|
import { TMRRencontres } from "./tmr-rencontres.js"
|
||||||
import { RdDCalendrier } from "./time/rdd-calendrier.js";
|
import { RdDCalendrier } from "./time/rdd-calendrier.js"
|
||||||
import { RdDTimestamp } from "./time/rdd-timestamp.js";
|
import { RdDTimestamp } from "./time/rdd-timestamp.js"
|
||||||
import { DialogChronologie } from "./dialog-chronologie.js";
|
import { DialogChronologie } from "./dialog-chronologie.js"
|
||||||
|
|
||||||
import { RdDResolutionTable } from "./rdd-resolution-table.js";
|
import { RdDResolutionTable } from "./rdd-resolution-table.js"
|
||||||
import { RdDTokenHud } from "./rdd-token-hud.js";
|
import { RdDTokenHud } from "./rdd-token-hud.js"
|
||||||
import { RdDCommands } from "./rdd-commands.js";
|
import { RdDCommands } from "./rdd-commands.js"
|
||||||
import { RdDCombatManager, RdDCombat } from "./rdd-combat.js";
|
import { RdDCombatManager, RdDCombat } from "./rdd-combat.js"
|
||||||
import { ChatUtility } from "./chat-utility.js";
|
import { ChatUtility } from "./chat-utility.js"
|
||||||
import { StatusEffects } from "./settings/status-effects.js";
|
import { StatusEffects } from "./settings/status-effects.js"
|
||||||
import { RdDCompendiumOrganiser } from "./rdd-compendium-organiser.js";
|
import { RdDCompendiumOrganiser } from "./rdd-compendium-organiser.js"
|
||||||
import { ReglesOptionnelles } from "./settings/regles-optionnelles.js";
|
import { ReglesOptionnelles } from "./settings/regles-optionnelles.js"
|
||||||
import { RdDHotbar } from "./rdd-hotbar-drop.js"
|
import { RdDHotbar } from "./rdd-hotbar-drop.js"
|
||||||
import { EffetsDraconiques } from "./tmr/effets-draconiques.js";
|
import { EffetsDraconiques } from "./tmr/effets-draconiques.js"
|
||||||
import { RdDHerbes } from "./rdd-herbes.js";
|
import { RdDHerbes } from "./rdd-herbes.js"
|
||||||
import { RdDDice } from "./rdd-dice.js";
|
import { RdDDice } from "./rdd-dice.js"
|
||||||
import { RdDPossession } from "./rdd-possession.js";
|
import { RdDPossession } from "./rdd-possession.js"
|
||||||
import { Misc } from "./misc.js";
|
import { Misc } from "./misc.js"
|
||||||
|
|
||||||
import { SystemCompendiums } from "./settings/system-compendiums.js";
|
import { SystemCompendiums } from "./settings/system-compendiums.js"
|
||||||
import { Environnement } from "./environnement.js";
|
import { Environnement } from "./environnement.js"
|
||||||
|
|
||||||
import { RdDActor } from "./actor.js";
|
import { RdDActor } from "./actor.js"
|
||||||
import { RdDBaseActor } from "./actor/base-actor.js";
|
import { RdDBaseActor } from "./actor/base-actor.js"
|
||||||
import { RdDCommerce } from "./actor/commerce.js";
|
import { RdDCommerce } from "./actor/commerce.js"
|
||||||
import { RdDEntite } from "./actor/entite.js";
|
import { RdDEntite } from "./actor/entite.js"
|
||||||
import { RdDVehicule } from "./actor/vehicule.js";
|
import { RdDVehicule } from "./actor/vehicule.js"
|
||||||
import { RdDActorSheet } from "./actor-sheet.js";
|
import { RdDActorSheet } from "./actor-sheet.js"
|
||||||
import { RdDCommerceSheet } from "./actor/commerce-sheet.js";
|
import { RdDCommerceSheet } from "./actor/commerce-sheet.js"
|
||||||
import { RdDCreatureSheet } from "./actor/creature-sheet.js";
|
import { RdDCreatureSheet } from "./actor/creature-sheet.js"
|
||||||
import { RdDActorEntiteSheet } from "./actor/entite-sheet.js";
|
import { RdDActorEntiteSheet } from "./actor/entite-sheet.js"
|
||||||
import { RdDActorVehiculeSheet } from "./actor/vehicule-sheet.js";
|
import { RdDActorVehiculeSheet } from "./actor/vehicule-sheet.js"
|
||||||
|
|
||||||
import { RdDItem } from "./item.js";
|
import { RdDItem } from "./item.js"
|
||||||
import { RdDItemBlessure } from "./item/blessure.js";
|
import { RdDItemBlessure } from "./item/blessure.js"
|
||||||
import { RdDItemService } from "./item/service.js";
|
import { RdDItemService } from "./item/service.js"
|
||||||
import { RdDItemMaladie } from "./item/maladie.js";
|
import { RdDItemMaladie } from "./item/maladie.js"
|
||||||
import { RdDItemPoison } from "./item/poison.js";
|
import { RdDItemPoison } from "./item/poison.js"
|
||||||
import { RdDItemSigneDraconique } from "./item/signedraconique.js";
|
import { RdDItemSigneDraconique } from "./item/signedraconique.js"
|
||||||
import { RdDItemQueue } from "./item/queue.js";
|
import { RdDItemQueue } from "./item/queue.js"
|
||||||
import { RdDItemOmbre } from "./item/ombre.js";
|
import { RdDItemOmbre } from "./item/ombre.js"
|
||||||
import { RdDItemSouffle } from "./item/souffle.js";
|
import { RdDItemSouffle } from "./item/souffle.js"
|
||||||
import { RdDRencontre } from "./item/rencontre.js";
|
import { RdDRencontre } from "./item/rencontre.js"
|
||||||
|
|
||||||
import { RdDItemSheet } from "./item-sheet.js";
|
import { RdDItemSheet } from "./item-sheet.js"
|
||||||
import { RdDBlessureItemSheet } from "./item/sheet-blessure.js";
|
import { RdDBlessureItemSheet } from "./item/sheet-blessure.js"
|
||||||
import { RdDServiceItemSheet } from "./item/sheet-service.js";
|
import { RdDServiceItemSheet } from "./item/sheet-service.js"
|
||||||
import { RdDRencontreItemSheet } from "./item/sheet-rencontre.js";
|
import { RdDRencontreItemSheet } from "./item/sheet-rencontre.js"
|
||||||
import { RdDHerbeItemSheet } from "./item/sheet-herbe.js";
|
import { RdDHerbeItemSheet } from "./item/sheet-herbe.js"
|
||||||
import { RdDPlanteItemSheet } from "./item/sheet-plante.js";
|
import { RdDPlanteItemSheet } from "./item/sheet-plante.js"
|
||||||
import { RdDIngredientItemSheet } from "./item/sheet-ingredient.js";
|
import { RdDIngredientItemSheet } from "./item/sheet-ingredient.js"
|
||||||
import { RdDFauneItemSheet } from "./item/sheet-faune.js";
|
import { RdDFauneItemSheet } from "./item/sheet-faune.js"
|
||||||
import { RdDConteneurItemSheet } from "./item/sheet-conteneur.js";
|
import { RdDConteneurItemSheet } from "./item/sheet-conteneur.js"
|
||||||
import { RdDSigneDraconiqueItemSheet } from "./item/sheet-signedraconique.js";
|
import { RdDSigneDraconiqueItemSheet } from "./item/sheet-signedraconique.js"
|
||||||
import { RdDItemInventaireSheet } from "./item/sheet-base-inventaire.js";
|
import { RdDItemInventaireSheet } from "./item/sheet-base-inventaire.js"
|
||||||
import { AppAstrologie } from "./sommeil/app-astrologie.js";
|
import { AppAstrologie } from "./sommeil/app-astrologie.js"
|
||||||
import { RdDItemArmure } from "./item/armure.js";
|
import { RdDItemArmure } from "./item/armure.js"
|
||||||
import { AutoAdjustDarkness as AutoAdjustDarkness } from "./time/auto-adjust-darkness.js";
|
import { AutoAdjustDarkness as AutoAdjustDarkness } from "./time/auto-adjust-darkness.js"
|
||||||
import { RdDCreature } from "./actor/creature.js";
|
import { RdDCreature } from "./actor/creature.js"
|
||||||
import { RdDTMRDialog } from "./rdd-tmr-dialog.js";
|
import { RdDTMRDialog } from "./rdd-tmr-dialog.js"
|
||||||
|
import { RdDActorExportSheet } from "./actor/actor-export-sheet.js"
|
||||||
|
import { OptionsAvancees } from "./settings/options-avancees.js"
|
||||||
|
import { ExportScriptarium } from "./actor/export-scriptarium/export-scriptarium.js"
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* RdD system
|
* RdD system
|
||||||
@ -71,18 +74,18 @@ import { RdDTMRDialog } from "./rdd-tmr-dialog.js";
|
|||||||
* Software License: GNU GPLv3
|
* Software License: GNU GPLv3
|
||||||
*/
|
*/
|
||||||
export class SystemReveDeDragon {
|
export class SystemReveDeDragon {
|
||||||
|
|
||||||
static start() {
|
static start() {
|
||||||
const system = new SystemReveDeDragon()
|
const system = new SystemReveDeDragon()
|
||||||
Hooks.once('init', async () => await system.onInit())
|
Hooks.once('init', async () => await system.onInit())
|
||||||
Hooks.once('diceSoNiceReady', (dice3d) => RdDDice.diceSoNiceReady(dice3d))
|
Hooks.once('diceSoNiceReady', (dice3d) => RdDDice.diceSoNiceReady(dice3d))
|
||||||
Hooks.once('ready', () => system.onReady())
|
Hooks.once('ready', () => system.onReady())
|
||||||
}
|
}
|
||||||
|
|
||||||
constructor() {
|
constructor() {
|
||||||
this.config = RDD_CONFIG;
|
this.config = RDD_CONFIG
|
||||||
this.RdDUtility = RdDUtility;
|
this.RdDUtility = RdDUtility
|
||||||
this.RdDHotbar = RdDHotbar;
|
this.RdDHotbar = RdDHotbar
|
||||||
this.itemClasses = {
|
this.itemClasses = {
|
||||||
armure: RdDItemArmure,
|
armure: RdDItemArmure,
|
||||||
blessure: RdDItemBlessure,
|
blessure: RdDItemBlessure,
|
||||||
@ -108,42 +111,42 @@ export class SystemReveDeDragon {
|
|||||||
/* Foundry VTT Initialization */
|
/* Foundry VTT Initialization */
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
async onInit() {
|
async onInit() {
|
||||||
game.system.rdd = this;
|
game.system.rdd = this
|
||||||
this.AppAstrologie = AppAstrologie;
|
this.AppAstrologie = AppAstrologie
|
||||||
|
|
||||||
|
|
||||||
console.log(`Initializing Reve de Dragon System`);
|
console.log(`Initializing Reve de Dragon System`)
|
||||||
|
|
||||||
// preload handlebars templates
|
// preload handlebars templates
|
||||||
RdDUtility.preloadHandlebarsTemplates();
|
RdDUtility.preloadHandlebarsTemplates()
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
this.initSystemSettings();
|
this.initSystemSettings()
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
// Set an initiative formula for the system
|
// Set an initiative formula for the system
|
||||||
CONFIG.Combat.initiative = {
|
CONFIG.Combat.initiative = {
|
||||||
formula: "1+(1d6/10)",
|
formula: "1+(1d6/10)",
|
||||||
decimals: 2
|
decimals: 2
|
||||||
};
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
game.socket.on(SYSTEM_SOCKET_ID, async (sockmsg) => {
|
game.socket.on(SYSTEM_SOCKET_ID, async (sockmsg) => {
|
||||||
console.log(">>>>> MSG RECV", sockmsg);
|
console.log(">>>>> MSG RECV", sockmsg)
|
||||||
try {
|
try {
|
||||||
RdDUtility.onSocketMessage(sockmsg);
|
RdDUtility.onSocketMessage(sockmsg)
|
||||||
RdDCombat.onSocketMessage(sockmsg);
|
RdDCombat.onSocketMessage(sockmsg)
|
||||||
ChatUtility.onSocketMessage(sockmsg);
|
ChatUtility.onSocketMessage(sockmsg)
|
||||||
RdDBaseActor.onSocketMessage(sockmsg);
|
RdDBaseActor.onSocketMessage(sockmsg)
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
console.error('game.socket.on(SYSTEM_SOCKET_ID) Exception: ', sockmsg, ' => ', e)
|
console.error('game.socket.on(SYSTEM_SOCKET_ID) Exception: ', sockmsg, ' => ', e)
|
||||||
}
|
}
|
||||||
});
|
})
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
// Define custom Entity classes
|
// Define custom Entity classes
|
||||||
CONFIG.Actor.documentClass = RdDBaseActor;
|
CONFIG.Actor.documentClass = RdDBaseActor
|
||||||
CONFIG.Item.documentClass = RdDItem;
|
CONFIG.Item.documentClass = RdDItem
|
||||||
CONFIG.RDD = {
|
CONFIG.RDD = {
|
||||||
resolutionTable: RdDResolutionTable.resolutionTable,
|
resolutionTable: RdDResolutionTable.resolutionTable,
|
||||||
carac_array: RdDUtility.getCaracArray(),
|
carac_array: RdDUtility.getCaracArray(),
|
||||||
@ -153,30 +156,31 @@ export class SystemReveDeDragon {
|
|||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
// Register sheet application classes
|
// Register sheet application classes
|
||||||
Actors.unregisterSheet("core", ActorSheet);
|
Actors.unregisterSheet("core", ActorSheet)
|
||||||
Actors.registerSheet(SYSTEM_RDD, RdDCommerceSheet, { types: ["commerce"], makeDefault: true });
|
Actors.registerSheet(SYSTEM_RDD, RdDCommerceSheet, { types: ["commerce"], makeDefault: true })
|
||||||
Actors.registerSheet(SYSTEM_RDD, RdDActorSheet, { types: ["personnage"], makeDefault: true });
|
Actors.registerSheet(SYSTEM_RDD, RdDActorExportSheet, { types: ["personnage"], makeDefault: false })
|
||||||
Actors.registerSheet(SYSTEM_RDD, RdDCreatureSheet, { types: ["creature"], makeDefault: true });
|
Actors.registerSheet(SYSTEM_RDD, RdDActorSheet, { types: ["personnage"], makeDefault: true })
|
||||||
Actors.registerSheet(SYSTEM_RDD, RdDActorVehiculeSheet, { types: ["vehicule"], makeDefault: true });
|
Actors.registerSheet(SYSTEM_RDD, RdDCreatureSheet, { types: ["creature"], makeDefault: true })
|
||||||
Actors.registerSheet(SYSTEM_RDD, RdDActorEntiteSheet, { types: ["entite"], makeDefault: true });
|
Actors.registerSheet(SYSTEM_RDD, RdDActorVehiculeSheet, { types: ["vehicule"], makeDefault: true })
|
||||||
Items.unregisterSheet("core", ItemSheet);
|
Actors.registerSheet(SYSTEM_RDD, RdDActorEntiteSheet, { types: ["entite"], makeDefault: true })
|
||||||
|
Items.unregisterSheet("core", ItemSheet)
|
||||||
|
|
||||||
RdDItemSheet.register(RdDSigneDraconiqueItemSheet);
|
RdDItemSheet.register(RdDSigneDraconiqueItemSheet)
|
||||||
RdDItemSheet.register(RdDRencontreItemSheet);
|
RdDItemSheet.register(RdDRencontreItemSheet)
|
||||||
RdDItemSheet.register(RdDConteneurItemSheet);
|
RdDItemSheet.register(RdDConteneurItemSheet)
|
||||||
RdDItemSheet.register(RdDHerbeItemSheet);
|
RdDItemSheet.register(RdDHerbeItemSheet)
|
||||||
RdDItemSheet.register(RdDFauneItemSheet);
|
RdDItemSheet.register(RdDFauneItemSheet)
|
||||||
RdDItemSheet.register(RdDPlanteItemSheet);
|
RdDItemSheet.register(RdDPlanteItemSheet)
|
||||||
RdDItemSheet.register(RdDIngredientItemSheet);
|
RdDItemSheet.register(RdDIngredientItemSheet)
|
||||||
RdDItemSheet.register(RdDServiceItemSheet);
|
RdDItemSheet.register(RdDServiceItemSheet)
|
||||||
RdDItemSheet.register(RdDBlessureItemSheet);
|
RdDItemSheet.register(RdDBlessureItemSheet)
|
||||||
|
|
||||||
Items.registerSheet(SYSTEM_RDD, RdDItemInventaireSheet, {
|
Items.registerSheet(SYSTEM_RDD, RdDItemInventaireSheet, {
|
||||||
types: [
|
types: [
|
||||||
"objet", "arme", "armure", "livre", "potion", "munition",
|
"objet", "arme", "armure", "livre", "potion", "munition",
|
||||||
"monnaie", "nourritureboisson", "gemme",
|
"monnaie", "nourritureboisson", "gemme",
|
||||||
], makeDefault: true
|
], makeDefault: true
|
||||||
});
|
})
|
||||||
Items.registerSheet(SYSTEM_RDD, RdDItemSheet, {
|
Items.registerSheet(SYSTEM_RDD, RdDItemSheet, {
|
||||||
types: [
|
types: [
|
||||||
"competence", "competencecreature",
|
"competence", "competencecreature",
|
||||||
@ -185,31 +189,32 @@ export class SystemReveDeDragon {
|
|||||||
"nombreastral", "tache", "maladie", "poison", "possession",
|
"nombreastral", "tache", "maladie", "poison", "possession",
|
||||||
"tarot", "extraitpoetique", "empoignade"
|
"tarot", "extraitpoetique", "empoignade"
|
||||||
], makeDefault: true
|
], makeDefault: true
|
||||||
});
|
})
|
||||||
CONFIG.Combat.documentClass = RdDCombatManager;
|
CONFIG.Combat.documentClass = RdDCombatManager
|
||||||
|
|
||||||
// préparation des différents modules
|
// préparation des différents modules
|
||||||
AutoAdjustDarkness.init();
|
AutoAdjustDarkness.init()
|
||||||
RdDTimestamp.init();
|
RdDTimestamp.init()
|
||||||
RdDCalendrier.init();
|
RdDCalendrier.init()
|
||||||
SystemCompendiums.init();
|
SystemCompendiums.init()
|
||||||
DialogChronologie.init();
|
DialogChronologie.init()
|
||||||
ReglesOptionnelles.init();
|
ReglesOptionnelles.init()
|
||||||
RdDUtility.init();
|
OptionsAvancees.init()
|
||||||
RdDDice.init();
|
RdDUtility.init()
|
||||||
RdDCommands.init();
|
RdDDice.init()
|
||||||
RdDCombatManager.init();
|
RdDCommands.init()
|
||||||
RdDTokenHud.init();
|
RdDCombatManager.init()
|
||||||
RdDBaseActor.init();
|
RdDTokenHud.init()
|
||||||
RdDCompendiumOrganiser.init();
|
RdDBaseActor.init()
|
||||||
|
RdDCompendiumOrganiser.init()
|
||||||
EffetsDraconiques.init()
|
EffetsDraconiques.init()
|
||||||
TMRUtility.init();
|
TMRUtility.init()
|
||||||
await RdDTMRDialog.init()
|
await RdDTMRDialog.init()
|
||||||
RdDHotbar.initDropbar();
|
RdDHotbar.init()
|
||||||
RdDPossession.init();
|
RdDPossession.init()
|
||||||
TMRRencontres.init();
|
TMRRencontres.init()
|
||||||
Environnement.init();
|
Environnement.init()
|
||||||
|
ExportScriptarium.init()
|
||||||
}
|
}
|
||||||
|
|
||||||
initSystemSettings() {
|
initSystemSettings() {
|
||||||
@ -225,7 +230,7 @@ export class SystemReveDeDragon {
|
|||||||
"avant-encaissement": "Avant l'encaissement",
|
"avant-encaissement": "Avant l'encaissement",
|
||||||
},
|
},
|
||||||
default: "avant-encaissement"
|
default: "avant-encaissement"
|
||||||
});
|
})
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
game.settings.register(SYSTEM_RDD, "supprimer-dialogues-combat-chat", {
|
game.settings.register(SYSTEM_RDD, "supprimer-dialogues-combat-chat", {
|
||||||
@ -235,7 +240,7 @@ export class SystemReveDeDragon {
|
|||||||
config: true,
|
config: true,
|
||||||
default: true,
|
default: true,
|
||||||
type: Boolean
|
type: Boolean
|
||||||
});
|
})
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
game.settings.register(SYSTEM_RDD, "activer-sons-audio", {
|
game.settings.register(SYSTEM_RDD, "activer-sons-audio", {
|
||||||
@ -245,7 +250,8 @@ export class SystemReveDeDragon {
|
|||||||
config: true,
|
config: true,
|
||||||
default: true,
|
default: true,
|
||||||
type: Boolean
|
type: Boolean
|
||||||
});
|
})
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
game.settings.register(SYSTEM_RDD, "appliquer-famine-soif", {
|
game.settings.register(SYSTEM_RDD, "appliquer-famine-soif", {
|
||||||
name: "Notifier de la famine et la soif pour",
|
name: "Notifier de la famine et la soif pour",
|
||||||
@ -259,7 +265,7 @@ export class SystemReveDeDragon {
|
|||||||
"famine-soif": "la famine et la soif",
|
"famine-soif": "la famine et la soif",
|
||||||
},
|
},
|
||||||
default: "aucun"
|
default: "aucun"
|
||||||
});
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
async onReady() {
|
async onReady() {
|
||||||
@ -267,47 +273,47 @@ export class SystemReveDeDragon {
|
|||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
/* Foundry VTT Initialization */
|
/* Foundry VTT Initialization */
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
game.system.rdd.calendrier = new RdDCalendrier();
|
game.system.rdd.calendrier = new RdDCalendrier()
|
||||||
if (Misc.isUniqueConnectedGM()) {
|
if (Misc.isUniqueConnectedGM()) {
|
||||||
new Migrations().migrate();
|
new Migrations().migrate()
|
||||||
this.messageDeBienvenue();
|
this.messageDeBienvenue()
|
||||||
import("https://www.uberwald.me/fvtt_appcount/count-class-ready.js").then(moduleCounter=>{
|
import("https://www.uberwald.me/fvtt_appcount/count-class-ready.js").then(moduleCounter => {
|
||||||
console.log("ClassCounter loaded", moduleCounter)
|
console.log("ClassCounter loaded", moduleCounter)
|
||||||
moduleCounter.ClassCounter.registerUsageCount()
|
moduleCounter.ClassCounter.registerUsageCount()
|
||||||
}).catch(err=>
|
}).catch(err =>
|
||||||
console.log("No stats available, giving up.")
|
console.log("No stats available, giving up.")
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
StatusEffects.onReady();
|
StatusEffects.onReady()
|
||||||
RdDHerbes.initializeHerbes();
|
RdDHerbes.onReady()
|
||||||
RdDDice.onReady();
|
RdDDice.onReady()
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
/* Affiche/Init le calendrier */
|
/* Affiche/Init le calendrier */
|
||||||
game.system.rdd.calendrier.display();
|
game.system.rdd.calendrier.display()
|
||||||
// Avertissement si joueur sans personnage
|
// Avertissement si joueur sans personnage
|
||||||
if (!game.user.isGM && game.user.character == undefined) {
|
if (!game.user.isGM && game.user.character == undefined) {
|
||||||
ui.notifications.info("Attention ! Vous n'êtes connecté à aucun personnage !");
|
ui.notifications.info("Attention ! Vous n'êtes connecté à aucun personnage !")
|
||||||
ChatMessage.create({
|
ChatMessage.create({
|
||||||
content: "<b>ATTENTION</b> Le joueur " + game.user.name + " n'est connecté à aucun personnage !",
|
content: "<b>ATTENTION</b> Le joueur " + game.user.name + " n'est connecté à aucun personnage !",
|
||||||
user: game.user.id
|
user: game.user.id
|
||||||
});
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
messageDeBienvenue() {
|
messageDeBienvenue() {
|
||||||
if (game.user.isGM) {
|
if (game.user.isGM) {
|
||||||
ChatUtility.removeChatMessageContaining('<div id="message-bienvenue-rdd">');
|
ChatUtility.removeChatMessageContaining('<div id="message-bienvenue-rdd">')
|
||||||
ChatMessage.create({
|
ChatMessage.create({
|
||||||
user: game.user.id,
|
user: game.user.id,
|
||||||
content: `<div id="message-bienvenue-rdd"><span class="rdd-roll-part">Bienvenue dans le Rêve des Dragons !</span>
|
content: `<div id="message-bienvenue-rdd"><span class="rdd-roll-part">Bienvenue dans le Rêve des Dragons !</span>
|
||||||
<br>Vous trouverez quelques informations pour démarrer dans ce document : @Compendium[foundryvtt-reve-de-dragon.rappel-des-regles.7uGrUHGdPu0EmIu2]{Documentation MJ/Joueurs}
|
<br>Vous trouverez quelques informations pour démarrer dans ce document : @Compendium[foundryvtt-reve-de-dragon.rappel-des-regles.7uGrUHGdPu0EmIu2]{Documentation MJ/Joueurs}
|
||||||
<br>La commande <code>/aide</code> dans le chat permet de voir les commandes spécifiques à Rêve de Dragon.</div>
|
<br>La commande <code>/aide</code> dans le chat permet de voir les commandes spécifiques à Rêve de Dragon.</div>
|
||||||
` });
|
` })
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
SystemReveDeDragon.start();
|
SystemReveDeDragon.start()
|
||||||
|
|
||||||
|
@ -3,7 +3,7 @@ import { RdDResolutionTable } from "./rdd-resolution-table.js";
|
|||||||
import { RdDRoll } from "./rdd-roll.js";
|
import { RdDRoll } from "./rdd-roll.js";
|
||||||
import { RdDItemCompetenceCreature } from "./item-competencecreature.js";
|
import { RdDItemCompetenceCreature } from "./item-competencecreature.js";
|
||||||
import { Targets } from "./targets.js";
|
import { Targets } from "./targets.js";
|
||||||
import { TYPES } from "./item.js";
|
import { ITEM_TYPES } from "./item.js";
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
/* On part du principe qu'une entité démarre tjs
|
/* On part du principe qu'une entité démarre tjs
|
||||||
@ -20,9 +20,9 @@ export class RdDPossession {
|
|||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static searchPossessionFromEntite(attacker, defender) {
|
static searchPossessionFromEntite(attacker, defender) {
|
||||||
let poss = attacker.items.find(poss => poss.type == TYPES.possession && poss.system.victime.actorid == defender.id);
|
let poss = attacker.items.find(poss => poss.type == ITEM_TYPES.possession && poss.system.victime.actorid == defender.id);
|
||||||
if (!poss) {
|
if (!poss) {
|
||||||
poss = defender.items.find(poss => poss.type == TYPES.possession && poss.system.victime.actorid == defender.id);
|
poss = defender.items.find(poss => poss.type == ITEM_TYPES.possession && poss.system.victime.actorid == defender.id);
|
||||||
}
|
}
|
||||||
return poss && foundry.utils.duplicate(poss) || undefined;
|
return poss && foundry.utils.duplicate(poss) || undefined;
|
||||||
}
|
}
|
||||||
|
@ -307,7 +307,7 @@ export class RdDRoll extends Dialog {
|
|||||||
async updateRollResult(html) {
|
async updateRollResult(html) {
|
||||||
const rollData = this.rollData;
|
const rollData = this.rollData;
|
||||||
|
|
||||||
rollData.dmg = rollData.attackerRoll?.dmg ?? RdDBonus.dmg(rollData, this.actor.getBonusDegat())
|
rollData.dmg = rollData.attackerRoll?.dmg ?? RdDBonus.dmg(rollData, this.actor)
|
||||||
rollData.caracValue = parseInt(rollData.selectedCarac.value)
|
rollData.caracValue = parseInt(rollData.selectedCarac.value)
|
||||||
rollData.dmg.mortalite = rollData.dmg.mortalite ?? 'mortel';
|
rollData.dmg.mortalite = rollData.dmg.mortalite ?? 'mortel';
|
||||||
rollData.use.appelAuMoral = this.actor.isPersonnage() && RdDCarac.isActionPhysique(rollData.selectedCarac);
|
rollData.use.appelAuMoral = this.actor.isPersonnage() && RdDCarac.isActionPhysique(rollData.selectedCarac);
|
||||||
|
@ -16,7 +16,7 @@ import { RdDDice } from "./rdd-dice.js";
|
|||||||
import { STATUSES } from "./settings/status-effects.js";
|
import { STATUSES } from "./settings/status-effects.js";
|
||||||
import { RdDRencontre } from "./item/rencontre.js";
|
import { RdDRencontre } from "./item/rencontre.js";
|
||||||
import { RdDTimestamp } from "./time/rdd-timestamp.js";
|
import { RdDTimestamp } from "./time/rdd-timestamp.js";
|
||||||
import { TYPES } from "./item.js";
|
import { ITEM_TYPES } from "./item.js";
|
||||||
import { Misc } from "./misc.js";
|
import { Misc } from "./misc.js";
|
||||||
|
|
||||||
const TMR_DISPLAY_SIZE = {
|
const TMR_DISPLAY_SIZE = {
|
||||||
@ -208,11 +208,11 @@ export class RdDTMRDialog extends Dialog {
|
|||||||
}
|
}
|
||||||
|
|
||||||
get sortsReserve() {
|
get sortsReserve() {
|
||||||
return this.actor.itemTypes[TYPES.sortreserve];
|
return this.actor.itemTypes[ITEM_TYPES.sortreserve];
|
||||||
}
|
}
|
||||||
|
|
||||||
getSortsReserve(coord) {
|
getSortsReserve(coord) {
|
||||||
return this.actor.itemTypes[TYPES.sortreserve].filter(// Reserve sur une case fleuve ou normale
|
return this.actor.itemTypes[ITEM_TYPES.sortreserve].filter(// Reserve sur une case fleuve ou normale
|
||||||
TMRUtility.getTMR(coord).type == 'fleuve'
|
TMRUtility.getTMR(coord).type == 'fleuve'
|
||||||
? it => TMRUtility.getTMR(it.system.coord).type == 'fleuve'
|
? it => TMRUtility.getTMR(it.system.coord).type == 'fleuve'
|
||||||
: it => it.system.coord == coord
|
: it => it.system.coord == coord
|
||||||
@ -270,7 +270,7 @@ export class RdDTMRDialog extends Dialog {
|
|||||||
}
|
}
|
||||||
|
|
||||||
_getTokensSortsReserve() {
|
_getTokensSortsReserve() {
|
||||||
const sortsReserve = this.actor.itemTypes[TYPES.sortreserve];
|
const sortsReserve = this.actor.itemTypes[ITEM_TYPES.sortreserve];
|
||||||
return Misc.concat(sortsReserve.map(sortReserve =>
|
return Misc.concat(sortsReserve.map(sortReserve =>
|
||||||
EffetsDraconiques.sortReserve.tokens(this.pixiTMR, sortReserve, () => sortReserve.system.coord)))
|
EffetsDraconiques.sortReserve.tokens(this.pixiTMR, sortReserve, () => sortReserve.system.coord)))
|
||||||
}
|
}
|
||||||
|
91
module/settings/options-avancees.js
Normal file
91
module/settings/options-avancees.js
Normal file
@ -0,0 +1,91 @@
|
|||||||
|
import { SYSTEM_RDD } from "../constants.js"
|
||||||
|
import { Misc } from "../misc.js"
|
||||||
|
|
||||||
|
export const EXPORT_CSV_SCRIPTARIUM = 'export-csv-scriptarium'
|
||||||
|
|
||||||
|
const OPTIONS_AVANCEES = [
|
||||||
|
{ group: 'Menus', name: EXPORT_CSV_SCRIPTARIUM, descr: "Proposer le menu d'export csv Scriptarium (raffraichissement requis)" },
|
||||||
|
]
|
||||||
|
|
||||||
|
export class OptionsAvancees extends FormApplication {
|
||||||
|
static init() {
|
||||||
|
for (const regle of OPTIONS_AVANCEES) {
|
||||||
|
const name = regle.name
|
||||||
|
const id = OptionsAvancees._getId(name)
|
||||||
|
game.settings.register(SYSTEM_RDD, id, { name: id, scope: regle.scope ?? "world", config: false, default: regle.default == undefined ? true : regle.default, type: Boolean })
|
||||||
|
}
|
||||||
|
|
||||||
|
game.settings.registerMenu(SYSTEM_RDD, "rdd-options-avancees", {
|
||||||
|
name: "Configurer les options avancées",
|
||||||
|
label: "Options avancées",
|
||||||
|
hint: "Ouvre la fenêtre de configuration des options avancées",
|
||||||
|
icon: "fas fa-bars",
|
||||||
|
type: OptionsAvancees
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
constructor(...args) {
|
||||||
|
super(...args)
|
||||||
|
}
|
||||||
|
|
||||||
|
static _getId(name) {
|
||||||
|
return `rdd-advanced-${name}`
|
||||||
|
}
|
||||||
|
|
||||||
|
static get defaultOptions() {
|
||||||
|
return foundry.utils.mergeObject(super.defaultOptions, {
|
||||||
|
id: "options-avancees",
|
||||||
|
template: "systems/foundryvtt-reve-de-dragon/templates/settings/options-avancees.hbs",
|
||||||
|
height: 650,
|
||||||
|
width: 550,
|
||||||
|
minimizable: false,
|
||||||
|
closeOnSubmit: true,
|
||||||
|
title: "Options avancées"
|
||||||
|
}, { inplace: false })
|
||||||
|
}
|
||||||
|
|
||||||
|
getData() {
|
||||||
|
let formData = super.getData()
|
||||||
|
const regles = OPTIONS_AVANCEES.filter(it => game.user.isGM || it.scope == "client")
|
||||||
|
.map(it => {
|
||||||
|
it = foundry.utils.duplicate(it)
|
||||||
|
it.id = OptionsAvancees._getId(it.name)
|
||||||
|
it.active = OptionsAvancees.isSet(it.name)
|
||||||
|
return it
|
||||||
|
})
|
||||||
|
formData.regles = regles
|
||||||
|
formData.groups = Misc.classify(regles, it => it.group)
|
||||||
|
return formData
|
||||||
|
}
|
||||||
|
|
||||||
|
static getSettingKey(name){
|
||||||
|
return `${SYSTEM_RDD}.${this._getId(name)}`
|
||||||
|
}
|
||||||
|
|
||||||
|
static isUsing(name) {
|
||||||
|
return OptionsAvancees.isSet(name)
|
||||||
|
}
|
||||||
|
|
||||||
|
static isSet(name) {
|
||||||
|
return game.settings.get(SYSTEM_RDD, OptionsAvancees._getId(name))
|
||||||
|
}
|
||||||
|
|
||||||
|
static set(name, value) {
|
||||||
|
return game.settings.set(SYSTEM_RDD, OptionsAvancees._getId(name), value ? true : false)
|
||||||
|
}
|
||||||
|
|
||||||
|
activateListeners(html) {
|
||||||
|
html.find(".select-option").click((event) => {
|
||||||
|
if (event.currentTarget.attributes.name) {
|
||||||
|
let id = event.currentTarget.attributes.name.value
|
||||||
|
let isChecked = event.currentTarget.checked
|
||||||
|
game.settings.set(SYSTEM_RDD, id, isChecked)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
async _updateObject(event, formData) {
|
||||||
|
this.close()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -73,7 +73,7 @@ export class ReglesOptionnelles extends FormApplication {
|
|||||||
static get defaultOptions() {
|
static get defaultOptions() {
|
||||||
return foundry.utils.mergeObject(super.defaultOptions, {
|
return foundry.utils.mergeObject(super.defaultOptions, {
|
||||||
id: "regles-optionnelles",
|
id: "regles-optionnelles",
|
||||||
template: "systems/foundryvtt-reve-de-dragon/templates/settings/regles-optionnelles.html",
|
template: "systems/foundryvtt-reve-de-dragon/templates/settings/regles-optionnelles.hbs",
|
||||||
height: 650,
|
height: 650,
|
||||||
width: 550,
|
width: 550,
|
||||||
minimizable: false,
|
minimizable: false,
|
||||||
|
@ -1,7 +1,6 @@
|
|||||||
import { MAX_NOMBRE_ASTRAL, RdDTimestamp, WORLD_TIMESTAMP_SETTING } from "./rdd-timestamp.js";
|
import { MAX_NOMBRE_ASTRAL, RdDTimestamp, WORLD_TIMESTAMP_SETTING } from "./rdd-timestamp.js";
|
||||||
import { RdDCalendrierEditor } from "./rdd-calendrier-editor.js";
|
import { RdDCalendrierEditor } from "./rdd-calendrier-editor.js";
|
||||||
import { RdDResolutionTable } from "../rdd-resolution-table.js";
|
import { RdDResolutionTable } from "../rdd-resolution-table.js";
|
||||||
import { RdDUtility } from "../rdd-utility.js";
|
|
||||||
import { RdDDice } from "../rdd-dice.js";
|
import { RdDDice } from "../rdd-dice.js";
|
||||||
import { Misc } from "../misc.js";
|
import { Misc } from "../misc.js";
|
||||||
import { DialogChronologie } from "../dialog-chronologie.js";
|
import { DialogChronologie } from "../dialog-chronologie.js";
|
||||||
|
@ -15,18 +15,18 @@ export const RDD_MINUTES_PAR_JOUR = 1440; //RDD_HEURES_PAR_JOUR * RDD_MINUTES_PA
|
|||||||
const ROUNDS_PAR_MINUTE = 10;
|
const ROUNDS_PAR_MINUTE = 10;
|
||||||
|
|
||||||
const DEFINITION_HEURES = [
|
const DEFINITION_HEURES = [
|
||||||
{ key: "vaisseau", label: "Vaisseau", lettreFont: 'v', saison: "Printemps", darkness: 0.9 },
|
{ key: "vaisseau", article: "du ", label: "Vaisseau", lettreFont: 'v', saison: "Printemps", darkness: 0.9 },
|
||||||
{ key: "sirene", label: "Sirène", lettreFont: 'i', saison: "Printemps", darkness: 0.1 },
|
{ key: "sirene", article: "de la ", label: "Sirène", lettreFont: 'i', saison: "Printemps", darkness: 0.1 },
|
||||||
{ key: "faucon", label: "Faucon", lettreFont: 'f', saison: "Printemps", darkness: 0 },
|
{ key: "faucon", article: "du ", label: "Faucon", lettreFont: 'f', saison: "Printemps", darkness: 0 },
|
||||||
{ key: "couronne", label: "Couronne", lettreFont: '', saison: "Eté", darkness: 0 },
|
{ key: "couronne", article: "de la ", label: "Couronne", lettreFont: '', saison: "Eté", darkness: 0 },
|
||||||
{ key: "dragon", label: "Dragon", lettreFont: 'd', saison: "Eté", darkness: 0 },
|
{ key: "dragon", article: "du ", label: "Dragon", lettreFont: 'd', saison: "Eté", darkness: 0 },
|
||||||
{ key: "epees", label: "Epées", lettreFont: 'e', saison: "Eté", darkness: 0 },
|
{ key: "epees", article: "des ", label: "Epées", lettreFont: 'e', saison: "Eté", darkness: 0 },
|
||||||
{ key: "lyre", label: "Lyre", lettreFont: 'l', saison: "Automne", darkness: 0.1 },
|
{ key: "lyre", article: "de la ", label: "Lyre", lettreFont: 'l', saison: "Automne", darkness: 0.1 },
|
||||||
{ key: "serpent", label: "Serpent", lettreFont: 's', saison: "Automne", darkness: 0.9 },
|
{ key: "serpent", article: "du ", label: "Serpent", lettreFont: 's', saison: "Automne", darkness: 0.9 },
|
||||||
{ key: "poissonacrobate", label: "Poisson Acrobate", lettreFont: 'p', saison: "Automne", darkness: 1 },
|
{ key: "poissonacrobate", article: "du ", label: "Poisson Acrobate", lettreFont: 'p', saison: "Automne", darkness: 1 },
|
||||||
{ key: "araignee", label: "Araignée", lettreFont: 'a', saison: "Hiver", darkness: 1 },
|
{ key: "araignee", article: "de l'", label: "Araignée", lettreFont: 'a', saison: "Hiver", darkness: 1 },
|
||||||
{ key: "roseau", label: "Roseau", lettreFont: 'r', saison: "Hiver", darkness: 1 },
|
{ key: "roseau", article: "du ", label: "Roseau", lettreFont: 'r', saison: "Hiver", darkness: 1 },
|
||||||
{ key: "chateaudormant", label: "Château Dormant", lettreFont: 'c', saison: "Hiver", darkness: 1 },
|
{ key: "chateaudormant", article: "du ", label: "Château Dormant", lettreFont: 'c', saison: "Hiver", darkness: 1 },
|
||||||
]
|
]
|
||||||
|
|
||||||
const FORMULES_DUREE = [
|
const FORMULES_DUREE = [
|
||||||
@ -64,6 +64,7 @@ export class RdDTimestamp {
|
|||||||
DEFINITION_HEURES[i].hh = RdDTimestamp.hh(i);
|
DEFINITION_HEURES[i].hh = RdDTimestamp.hh(i);
|
||||||
DEFINITION_HEURES[i].icon = RdDTimestamp.iconeHeure(i);
|
DEFINITION_HEURES[i].icon = RdDTimestamp.iconeHeure(i);
|
||||||
DEFINITION_HEURES[i].webp = DEFINITION_HEURES[i].icon.replace(".svg", ".webp");
|
DEFINITION_HEURES[i].webp = DEFINITION_HEURES[i].icon.replace(".svg", ".webp");
|
||||||
|
DEFINITION_HEURES[i].avecArticle = DEFINITION_HEURES[i].article + DEFINITION_HEURES[i].label
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -241,7 +242,7 @@ export class RdDTimestamp {
|
|||||||
|
|
||||||
get darkness() {
|
get darkness() {
|
||||||
const darknessDebut = 100 * RdDTimestamp.definition(this.heure).darkness
|
const darknessDebut = 100 * RdDTimestamp.definition(this.heure).darkness
|
||||||
const darknessFin = 100 * RdDTimestamp.definition(this.heure + 1).darkness
|
const darknessFin = 100 * RdDTimestamp.definition(this.heure + 1).darkness
|
||||||
const darknessMinute = Math.round((darknessFin - darknessDebut) * this.minute / RDD_MINUTES_PAR_HEURES);
|
const darknessMinute = Math.round((darknessFin - darknessDebut) * this.minute / RDD_MINUTES_PAR_HEURES);
|
||||||
return (darknessDebut + darknessMinute) / 100
|
return (darknessDebut + darknessMinute) / 100
|
||||||
}
|
}
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
import { TYPES } from "../item.js";
|
import { ITEM_TYPES } from "../item.js";
|
||||||
import { TMRUtility } from "../tmr-utility.js";
|
import { TMRUtility } from "../tmr-utility.js";
|
||||||
import { PixiTMR } from "./pixi-tmr.js";
|
import { PixiTMR } from "./pixi-tmr.js";
|
||||||
|
|
||||||
@ -12,10 +12,10 @@ export class Draconique {
|
|||||||
static init() {
|
static init() {
|
||||||
}
|
}
|
||||||
|
|
||||||
static isCaseTMR(item) { return item.type == TYPES.casetmr; }
|
static isCaseTMR(item) { return item.type == ITEM_TYPES.casetmr; }
|
||||||
static isQueueDragon(item) { return item.isQueueDragon(); }
|
static isQueueDragon(item) { return item.isQueueDragon(); }
|
||||||
static isSouffleDragon(item) { return item.type == TYPES.souffle; }
|
static isSouffleDragon(item) { return item.type == ITEM_TYPES.souffle; }
|
||||||
static isTeteDragon(item) { return item.type == TYPES.tete; }
|
static isTeteDragon(item) { return item.type == ITEM_TYPES.tete; }
|
||||||
static isQueueSouffle(item) { return Draconique.isQueueDragon(item) || Draconique.isSouffleDragon(item); }
|
static isQueueSouffle(item) { return Draconique.isQueueDragon(item) || Draconique.isSouffleDragon(item); }
|
||||||
|
|
||||||
static register(draconique, code = undefined) {
|
static register(draconique, code = undefined) {
|
||||||
|
@ -18,7 +18,7 @@ import { Periple } from "./periple.js";
|
|||||||
import { UrgenceDraconique } from "./urgence-draconique.js";
|
import { UrgenceDraconique } from "./urgence-draconique.js";
|
||||||
import { Grammar } from "../grammar.js";
|
import { Grammar } from "../grammar.js";
|
||||||
import { AugmentationSeuil } from "./augmentation-seuil.js";
|
import { AugmentationSeuil } from "./augmentation-seuil.js";
|
||||||
import { TYPES } from "../item.js";
|
import { ITEM_TYPES } from "../item.js";
|
||||||
|
|
||||||
export class EffetsDraconiques {
|
export class EffetsDraconiques {
|
||||||
static carteTmr = new CarteTmr();
|
static carteTmr = new CarteTmr();
|
||||||
@ -122,11 +122,11 @@ export class EffetsDraconiques {
|
|||||||
}
|
}
|
||||||
|
|
||||||
static tetesDragon(actor, name) {
|
static tetesDragon(actor, name) {
|
||||||
return actor.itemTypes[TYPES.tete].filter(it => Grammar.includesLowerCaseNoAccent(it.name, name));
|
return actor.itemTypes[ITEM_TYPES.tete].filter(it => Grammar.includesLowerCaseNoAccent(it.name, name));
|
||||||
}
|
}
|
||||||
|
|
||||||
static soufflesDragon(actor, name) {
|
static soufflesDragon(actor, name) {
|
||||||
return actor.itemTypes[TYPES.souffle].filter(it => Grammar.includesLowerCaseNoAccent(it.name, name));
|
return actor.itemTypes[ITEM_TYPES.souffle].filter(it => Grammar.includesLowerCaseNoAccent(it.name, name));
|
||||||
}
|
}
|
||||||
|
|
||||||
static queuesDragon(actor, name) {
|
static queuesDragon(actor, name) {
|
||||||
@ -134,7 +134,7 @@ export class EffetsDraconiques {
|
|||||||
}
|
}
|
||||||
|
|
||||||
static queuesSoufflesDragon(actor, name) {
|
static queuesSoufflesDragon(actor, name) {
|
||||||
return actor.filterItems(it => [TYPES.queue, TYPES.ombre, TYPES.souffle].includes(it.type) && Grammar.includesLowerCaseNoAccent(it.name, name));
|
return actor.filterItems(it => [ITEM_TYPES.queue, ITEM_TYPES.ombre, ITEM_TYPES.souffle].includes(it.type) && Grammar.includesLowerCaseNoAccent(it.name, name));
|
||||||
}
|
}
|
||||||
|
|
||||||
static countAugmentationSeuil(actor) {
|
static countAugmentationSeuil(actor) {
|
||||||
|
@ -5,7 +5,7 @@ import { RdDRollTables } from "../rdd-rolltables.js";
|
|||||||
import { TMRUtility } from "../tmr-utility.js";
|
import { TMRUtility } from "../tmr-utility.js";
|
||||||
import { tmrTokenZIndex } from "../tmr-constants.js";
|
import { tmrTokenZIndex } from "../tmr-constants.js";
|
||||||
import { Draconique } from "./draconique.js";
|
import { Draconique } from "./draconique.js";
|
||||||
import { TYPES } from "../item.js";
|
import { ITEM_TYPES } from "../item.js";
|
||||||
import { TMRAnimations } from "./animation.js";
|
import { TMRAnimations } from "./animation.js";
|
||||||
|
|
||||||
export class UrgenceDraconique extends Draconique {
|
export class UrgenceDraconique extends Draconique {
|
||||||
@ -14,7 +14,7 @@ export class UrgenceDraconique extends Draconique {
|
|||||||
match(item) { return Draconique.isQueueDragon(item) && Grammar.toLowerCaseNoAccent(item.name).includes('urgence draconique'); }
|
match(item) { return Draconique.isQueueDragon(item) && Grammar.toLowerCaseNoAccent(item.name).includes('urgence draconique'); }
|
||||||
manualMessage() { return false }
|
manualMessage() { return false }
|
||||||
async onActorCreateOwned(actor, queue) {
|
async onActorCreateOwned(actor, queue) {
|
||||||
const coordSortsReserve = actor.itemTypes[TYPES.sortreserve].map(it => it.system.coord) ?? [];
|
const coordSortsReserve = actor.itemTypes[ITEM_TYPES.sortreserve].map(it => it.system.coord) ?? [];
|
||||||
if (coordSortsReserve.length == 0) {
|
if (coordSortsReserve.length == 0) {
|
||||||
// La queue se transforme en idée fixe
|
// La queue se transforme en idée fixe
|
||||||
const ideeFixe = await RdDRollTables.getIdeeFixe();
|
const ideeFixe = await RdDRollTables.getIdeeFixe();
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
import { TYPES } from "../item.js"
|
import { ITEM_TYPES } from "../item.js"
|
||||||
import { RdDItemCompetence } from "../item-competence.js"
|
import { RdDItemCompetence } from "../item-competence.js"
|
||||||
import { ChatUtility } from "../chat-utility.js"
|
import { ChatUtility } from "../chat-utility.js"
|
||||||
import { Misc } from "../misc.js"
|
import { Misc } from "../misc.js"
|
||||||
@ -69,7 +69,7 @@ export class DialogFatigueVoyage extends Dialog {
|
|||||||
}
|
}
|
||||||
const competencesVoyage = {}
|
const competencesVoyage = {}
|
||||||
CODES_COMPETENCES_VOYAGE.forEach(codeSurvie => {
|
CODES_COMPETENCES_VOYAGE.forEach(codeSurvie => {
|
||||||
competencesVoyage[codeSurvie] = RdDItemCompetence.findCompetence(actor.itemTypes[TYPES.competence], codeSurvie, { onMessage: () => { } })
|
competencesVoyage[codeSurvie] = RdDItemCompetence.findCompetence(actor.itemTypes[ITEM_TYPES.competence], codeSurvie, { onMessage: () => { } })
|
||||||
})
|
})
|
||||||
TABLEAU_FATIGUE_MARCHE.forEach(terrain => {
|
TABLEAU_FATIGUE_MARCHE.forEach(terrain => {
|
||||||
actorParameters.survies[terrain.code] = Misc.join(
|
actorParameters.survies[terrain.code] = Misc.join(
|
||||||
|
65
styles/img/ui/scriptarium.svg
Normal file
65
styles/img/ui/scriptarium.svg
Normal file
File diff suppressed because one or more lines are too long
After Width: | Height: | Size: 56 KiB |
@ -572,6 +572,15 @@ input:is(.blessure-premiers_soins, .blessure-soins_complets) {
|
|||||||
border: none;
|
border: none;
|
||||||
padding: 0.1rem;
|
padding: 0.1rem;
|
||||||
}
|
}
|
||||||
|
.context-menu-img {
|
||||||
|
max-width: 2rem;
|
||||||
|
max-height: 1rem;
|
||||||
|
flex-grow: 0;
|
||||||
|
margin: 0.2rem 0.3rem 0 0;
|
||||||
|
vertical-align: middle;
|
||||||
|
border: none;
|
||||||
|
padding: 0rem;
|
||||||
|
}
|
||||||
|
|
||||||
.button-img {
|
.button-img {
|
||||||
vertical-align: baseline;
|
vertical-align: baseline;
|
||||||
|
@ -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.8",
|
"version": "12.0.9",
|
||||||
"download": "https://www.uberwald.me/gitea/public/foundryvtt-reve-de-dragon/archive/foundryvtt-reve-de-dragon-12.0.8.zip",
|
"download": "https://www.uberwald.me/gitea/public/foundryvtt-reve-de-dragon/archive/foundryvtt-reve-de-dragon-12.0.9.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": {
|
||||||
|
@ -21,6 +21,7 @@
|
|||||||
"race": "Humain",
|
"race": "Humain",
|
||||||
"yeux": "",
|
"yeux": "",
|
||||||
"cheveux": "",
|
"cheveux": "",
|
||||||
|
"taille": "",
|
||||||
"poids": "",
|
"poids": "",
|
||||||
"heure": "",
|
"heure": "",
|
||||||
"sexe": "",
|
"sexe": "",
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
<h4>Tirage aléatoire: {{typeName}}</h4>
|
<h4>Tirage aléatoire: {{document.name}}</h4>
|
||||||
<div>{{document.pack}}</div>
|
<div>Tirage de {{typeName}} aléatoire depuis {{document.pack}}</div>
|
||||||
<div>Jet {{roll.formula}} : {{roll.total}}{{percentages}}</div>
|
<div>Jet {{roll.formula}} : {{roll.total}}{{percentages}}</div>
|
||||||
<hr>
|
<hr>
|
||||||
<div>
|
<div>
|
||||||
@ -15,4 +15,4 @@
|
|||||||
{{{document.system.description}}}
|
{{{document.system.description}}}
|
||||||
</div>
|
</div>
|
||||||
{{/if}}
|
{{/if}}
|
||||||
</div>
|
</div>
|
||||||
|
@ -3,3 +3,5 @@
|
|||||||
<option value="{{competence.name}}">{{competence.name}}</option>
|
<option value="{{competence.name}}">{{competence.name}}</option>
|
||||||
{{/if}}
|
{{/if}}
|
||||||
{{/each}}
|
{{/each}}
|
||||||
|
<option value="O/H/N/T">Oniros/Hypnos/Narcos/Thanatos</option>
|
||||||
|
<option value="O/H/N">Oniros/Hypnos/Narcos</option>
|
||||||
|
13
templates/settings/regles-optionnelles.hbs
Normal file
13
templates/settings/regles-optionnelles.hbs
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
<form autocomplete="off" onsubmit="event.preventDefault();">
|
||||||
|
{{#each groups as |group key|}}
|
||||||
|
<h3>{{key}}</h3>
|
||||||
|
<ul>
|
||||||
|
{{#each group as |regle r|}}
|
||||||
|
<li>
|
||||||
|
<input class="select-option" type="checkbox" name="{{regle.id}}" {{#if regle.active}}checked{{/if}}/>
|
||||||
|
<label>{{regle.descr}}</label>
|
||||||
|
</li>
|
||||||
|
{{/each}}
|
||||||
|
</ul>
|
||||||
|
{{/each}}
|
||||||
|
</form>
|
Loading…
Reference in New Issue
Block a user