Gestion d'items temporels
- Séparation des timestamp / calendrier Les poisons/maladies/souffles/queues/rencontres/signes peuvent être temporaires. - Ajout de champs pour stocker les timestamps de début et fin - définition de la durée (selon les items) - extraction des classes spécialisées des items - initialisation des dates de début/fin des effets temporaires à l'ajout d'un item temporel - préparation de la suppression automatique - Fix de mauvaise présentations sur les dialog d'astrologie et d'édition du calendrier
This commit is contained in:
80
module/item/item-rencontre.js
Normal file
80
module/item/item-rencontre.js
Normal file
@ -0,0 +1,80 @@
|
||||
import { EffetsRencontre } from "../effets-rencontres.js";
|
||||
import { RdDItem } from "../item.js";
|
||||
|
||||
const tableEffets = [
|
||||
{ code: "messager", resultat: "succes", description: "Envoie un message à (force) cases", method: EffetsRencontre.messager },
|
||||
{ code: "passeur", resultat: "succes", description: "Déplacer le demi-rêve à (force) cases", method: EffetsRencontre.passeur},
|
||||
{ code: "reve+f", resultat: "succes", description: "Gain de (force) points de rêve" , method: EffetsRencontre.reve_plus_force},
|
||||
{ code: "teleport", resultat: "succes", description: "Déplacer le demi-rêve (même type)", method: EffetsRencontre.teleportation_typecase },
|
||||
{ code: "part+tete", resultat: "succes", description: "Tête de dragon sur réussite particulière", method: EffetsRencontre.rdd_part_tete },
|
||||
{ code: "part+xp", resultat: "succes", description: "Expérience sur réussite particulière", method: EffetsRencontre.experience_particuliere },
|
||||
{ code: "seuil", resultat: "succes", description: "Récupération de seuil de rêve", method: EffetsRencontre.regain_seuil },
|
||||
|
||||
{ code: "reve-1", resultat: "echec", description: "Perte de 1 point de rêve", method: EffetsRencontre.reve_moins_1 },
|
||||
{ code: "reve-f", resultat: "echec", description: "Perte de (force) points de rêve", method: EffetsRencontre.reve_moins_force },
|
||||
{ code: "vie-1", resultat: "echec", description: "Perte de 1 point de vie", method: EffetsRencontre.vie_moins_1 },
|
||||
{ code: "reinsere", resultat: "echec", description: "Réinsertion aléatoire", method: EffetsRencontre.reinsertion },
|
||||
{ code: "persistant", resultat: "echec", description: "Bloque le demi-rêve", method: EffetsRencontre.rencontre_persistante },
|
||||
{ code: "teleport-aleatoire", resultat: "echec", description: "Déplacement aléatoire (même type)", method: EffetsRencontre.teleportation_aleatoire_typecase },
|
||||
{ code: "aleatoire", resultat: "echec", description: "Déplacement aléatoire", method: EffetsRencontre.deplacement_aleatoire },
|
||||
{ code: "sort-aleatoire", resultat: "echec", description: "Déclenche un sort en réserve aléatoire", method: EffetsRencontre.sort_aleatoire },
|
||||
{ code: "rompu", resultat: "echec", description: "Demi-rêve interrompu", method: EffetsRencontre.demireve_rompu },
|
||||
{ code: "echec-queue", resultat: "echec", description: "Queue(s) de dragon sur échec", method: EffetsRencontre.rdd_echec_queue },
|
||||
|
||||
{ code: "reve+1", resultat: "succes", description: "Gain de 1 point de rêve", method: EffetsRencontre.reve_plus_1 },
|
||||
{ code: "vie-f", resultat: "echec", description: "Perte de (force) points de vie", method: EffetsRencontre.vie_moins_force },
|
||||
{ code: "moral+1", resultat: "succes", description: "Gain de 1 point de moral", method: EffetsRencontre.moral_plus_1 },
|
||||
{ code: "moral-1", resultat: "echec", description: "Perte de 1 point de moral", method: EffetsRencontre.moral_moins_1 },
|
||||
{ code: "xpsort+f", resultat: "succes", description: "Gain de (force) xp sort", method: EffetsRencontre.xp_sort_force },
|
||||
{ code: "endurance-1", resultat: "echec", description: "Perte de 1 point d'endurance", method: EffetsRencontre.end_moins_1 },
|
||||
{ code: "endurance-f", resultat: "echec", description: "Perte de (force) points d'endurance", method: EffetsRencontre.end_moins_force },
|
||||
{ code: "fatigue+1", resultat: "echec", description: "Coup de fatigue de 1 point", method: EffetsRencontre.fatigue_plus_1},
|
||||
{ code: "fatigue+f", resultat: "echec", description: "Coup de fatigue de 1 (force) points", method: EffetsRencontre.fatigue_plus_force },
|
||||
{ code: "fatigue-1", resultat: "succes", description: "Récupération de 1 point de fatigue", method: EffetsRencontre.fatigue_moins_1},
|
||||
{ code: "fatigue-f", resultat: "succes", description: "Récupération de 1 (force) points de fatigue", method: EffetsRencontre.fatigue_moins_force },
|
||||
{ code: "perte-chance", resultat: "echec", description: "Perte de chance actuelle", method: EffetsRencontre.perte_chance },
|
||||
{ code: "stress+1", resultat: "succes", description: "Gain de 1 point de stress", method: EffetsRencontre.stress_plus_1 },
|
||||
// { code: "epart-souffle", resultat: "echec", description: "Souffle de dragon sur échec particulier" },
|
||||
];
|
||||
|
||||
export class RdDRencontre extends RdDItem {
|
||||
|
||||
static get defaultIcon() {
|
||||
return "systems/foundryvtt-reve-de-dragon/icons/tete_dragon.webp";
|
||||
}
|
||||
|
||||
static getEffetsSucces() { return RdDRencontre.getEffets("succes"); }
|
||||
static getEffetsEchec() { return RdDRencontre.getEffets("echec"); }
|
||||
static getEffets(resultat) {
|
||||
return tableEffets.filter(e => resultat == e.resultat);
|
||||
}
|
||||
|
||||
static mapEffets(liste) {
|
||||
return liste.map(it => RdDRencontre.getEffet(it));
|
||||
}
|
||||
|
||||
static getListeEffets(item, reussite) {
|
||||
if (reussite == 'echec') {
|
||||
return [...item.system.echec.effets];
|
||||
}
|
||||
if (reussite == 'succes') {
|
||||
return [...item.system.succes.effets];
|
||||
}
|
||||
return [];
|
||||
}
|
||||
|
||||
static getEffet(code) {
|
||||
return tableEffets.find(it => code == it.code)
|
||||
}
|
||||
|
||||
static async appliquer(codes, tmrDialog, rencData) {
|
||||
for(const effet of RdDRencontre.mapEffets(codes)){
|
||||
await effet.method(tmrDialog, rencData);
|
||||
}
|
||||
}
|
||||
|
||||
async calculerFinPeriodeTemporel(debut) {
|
||||
return await debut.nouvelleHeure().addHeures(12);
|
||||
}
|
||||
|
||||
}
|
17
module/item/item-service.js
Normal file
17
module/item/item-service.js
Normal file
@ -0,0 +1,17 @@
|
||||
import { RdDItem } from "../item.js";
|
||||
|
||||
export class RdDItemService extends RdDItem {
|
||||
|
||||
static get defaultIcon() {
|
||||
return "systems/foundryvtt-reve-de-dragon/icons/services/lit.webp";
|
||||
}
|
||||
|
||||
isService() { return true; }
|
||||
getProprietes() {
|
||||
return [
|
||||
RdDItem.propertyIfDefined('Qualité', this.system.qualite, this.system.qualite != 0),
|
||||
RdDItem.propertyIfDefined('Moral', 'Situation heureuse', this.system.moral),
|
||||
RdDItem.propertyIfDefined('Coût', `${this.calculerPrixCommercant()} sols`),
|
||||
];
|
||||
}
|
||||
}
|
112
module/item/item-signedraconique.js
Normal file
112
module/item/item-signedraconique.js
Normal file
@ -0,0 +1,112 @@
|
||||
import { RdDItem, defaultItemImg } from "../item.js";
|
||||
import { Misc } from "../misc.js";
|
||||
import { RdDDice } from "../rdd-dice.js";
|
||||
import { RdDRollTables } from "../rdd-rolltables.js";
|
||||
import { RdDTimestamp } from "../rdd-timestamp.js";
|
||||
import { TMRType, TMRUtility } from "../tmr-utility.js";
|
||||
|
||||
const tableSignesIndicatifs = [
|
||||
{ rarete: "Très facile", difficulte: 0, xp: 6, nbCases: 14 },
|
||||
{ rarete: "Facile", difficulte: -2, xp: 10, nbCases: 10 },
|
||||
{ rarete: "Moyen", difficulte: -3, xp: 15, nbCases: 7 },
|
||||
{ rarete: "Difficile", difficulte: -5, xp: 20, nbCases: 4 },
|
||||
{ rarete: "Ardu", difficulte: -8, xp: 30, nbCases: 1 }
|
||||
|
||||
]
|
||||
|
||||
const DIFFICULTE_LECTURE_SIGNE_MANQUE = +11;
|
||||
|
||||
export class RdDItemSigneDraconique extends RdDItem {
|
||||
|
||||
static get defaultIcon() {
|
||||
return "systems/foundryvtt-reve-de-dragon/icons/tmr/signe_draconique.webp";
|
||||
}
|
||||
|
||||
|
||||
async calculerFinPeriodeTemporel(debut) {
|
||||
// TODO
|
||||
return RdDTimestamp.formulesDuree().find(it => it.code == "").calcul(debut, this.actor);
|
||||
}
|
||||
|
||||
static prepareSigneDraconiqueMeditation(meditation, rolled) {
|
||||
return {
|
||||
name: "de la " + meditation.name,
|
||||
type: "signedraconique",
|
||||
img: meditation.img,
|
||||
system: {
|
||||
typesTMR: [TMRUtility.typeTmrName(meditation.system.tmr)],
|
||||
difficulte: rolled.isSuccess ? RdDItemSigneDraconique.getDiffSigneMeditation(rolled.code) : DIFFICULTE_LECTURE_SIGNE_MANQUE,
|
||||
ephemere: true,
|
||||
duree: "1 round",
|
||||
valeur: rolled.isSuccess ? { "norm": 3, "sign": 5, "part": 10 } : { "norm": 0, "sign": 0, "part": 0 }
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
static getDiffSigneMeditation(code) {
|
||||
switch (code) {
|
||||
case "norm": return -7;
|
||||
case "sign": return -3;
|
||||
case "part": return 0;
|
||||
}
|
||||
return undefined;
|
||||
}
|
||||
|
||||
static getXpSortSigneDraconique(code, signe) {
|
||||
return Misc.toInt(signe.system.valeur[code] ?? 0);
|
||||
}
|
||||
|
||||
static calculValeursXpSort(qualite, valeur, avant) {
|
||||
switch (qualite) {
|
||||
case "norm":
|
||||
return {
|
||||
norm: valeur,
|
||||
sign: Math.max(valeur, avant.sign),
|
||||
part: Math.max(valeur, avant.part)
|
||||
}
|
||||
case "sign":
|
||||
return {
|
||||
norm: Math.min(valeur, avant.norm),
|
||||
sign: valeur,
|
||||
part: Math.max(valeur, avant.part)
|
||||
}
|
||||
case "part":
|
||||
return {
|
||||
norm: Math.min(valeur, avant.norm),
|
||||
sign: Math.min(valeur, avant.sign),
|
||||
part: valeur
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static async randomSigneDraconique(options = { ephemere: undefined }) {
|
||||
let modele = await RdDDice.rollOneOf(tableSignesIndicatifs);
|
||||
return {
|
||||
name: await RdDItemSigneDraconique.randomSigneDescription(),
|
||||
type: "signedraconique",
|
||||
img: defaultItemImg.signedraconique,
|
||||
system: {
|
||||
typesTMR: await RdDItemSigneDraconique.randomTmrs(modele.nbCases),
|
||||
ephemere: options?.ephemere == undefined ? RdDDice.rollTotal("1d2") == 2 : options.ephemere,
|
||||
duree: "1 round",
|
||||
difficulte: modele.difficulte,
|
||||
valeur: { norm: modele.xp, sign: modele.xp, part: Math.floor(modele.xp * 1.5) },
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
static async randomTmrs(nbTmr = undefined) {
|
||||
let tmrs = Object.values(TMRType)
|
||||
.map(value => TMRUtility.typeTmrName(value.name));
|
||||
let keep = nbTmr ?? (await RdDDice.rollTotal("1d" + TMRType.length) + 1);
|
||||
for (let i = tmrs.length; i > keep; i--) {
|
||||
tmrs.splice(await RdDDice.rollTotal("1d" + i), 1);
|
||||
}
|
||||
return tmrs;
|
||||
}
|
||||
|
||||
static async randomSigneDescription() {
|
||||
return await RdDRollTables.drawTextFromRollTable("Signes draconiques", false);
|
||||
}
|
||||
|
||||
}
|
13
module/item/maladie.js
Normal file
13
module/item/maladie.js
Normal file
@ -0,0 +1,13 @@
|
||||
import { RdDItem } from "../item.js";
|
||||
|
||||
export class RdDItemMaladie extends RdDItem {
|
||||
|
||||
static get defaultIcon() {
|
||||
return "systems/foundryvtt-reve-de-dragon/icons/maladies_venins/maladie.webp";
|
||||
}
|
||||
|
||||
async calculerFinPeriodeTemporel(debut) {
|
||||
return await debut.addPeriode(this.system.periode.nombre, this.system.periode.unite) ;
|
||||
}
|
||||
|
||||
}
|
18
module/item/ombre.js
Normal file
18
module/item/ombre.js
Normal file
@ -0,0 +1,18 @@
|
||||
import { RdDItem } from "../item.js";
|
||||
|
||||
export class RdDItemOmbre extends RdDItem {
|
||||
|
||||
static get defaultIcon() {
|
||||
return "systems/foundryvtt-reve-de-dragon/icons/queue_dragon.webp";
|
||||
}
|
||||
|
||||
async calculerFinPeriodeTemporel(debut) {
|
||||
return await debut.appliquerDuree(this.system.duree, this.parent);
|
||||
}
|
||||
|
||||
async onFinTemporel() {
|
||||
// fin de période
|
||||
await this.prolongerPeriode();
|
||||
}
|
||||
|
||||
}
|
17
module/item/poison.js
Normal file
17
module/item/poison.js
Normal file
@ -0,0 +1,17 @@
|
||||
import { RdDItem } from "../item.js";
|
||||
|
||||
export class RdDItemPoison extends RdDItem {
|
||||
|
||||
static get defaultIcon() {
|
||||
return "systems/foundryvtt-reve-de-dragon/icons/maladies_venins/venin.webp";
|
||||
}
|
||||
|
||||
async calculerFinPeriodeTemporel(debut) {
|
||||
return await debut.addPeriode(this.system.periode.nombre, this.system.periode.unite) ;
|
||||
}
|
||||
|
||||
async onFinTemporel() {
|
||||
// fin de période
|
||||
await this.prolongerPeriode();
|
||||
}
|
||||
}
|
13
module/item/queue.js
Normal file
13
module/item/queue.js
Normal file
@ -0,0 +1,13 @@
|
||||
import { RdDItem } from "../item.js";
|
||||
|
||||
export class RdDItemQueue extends RdDItem {
|
||||
|
||||
static get defaultIcon() {
|
||||
return "systems/foundryvtt-reve-de-dragon/icons/queue_dragon.webp";
|
||||
}
|
||||
|
||||
async calculerFinPeriodeTemporel(debut) {
|
||||
return await debut.appliquerDuree(this.system.duree, this.parent);
|
||||
}
|
||||
|
||||
}
|
13
module/item/souffle.js
Normal file
13
module/item/souffle.js
Normal file
@ -0,0 +1,13 @@
|
||||
import { RdDItem } from "../item.js";
|
||||
|
||||
export class RdDItemSouffle extends RdDItem {
|
||||
|
||||
static get defaultIcon() {
|
||||
return "systems/foundryvtt-reve-de-dragon/icons/souffle_dragon.webp";
|
||||
}
|
||||
|
||||
async calculerFinPeriodeTemporel(debut) {
|
||||
return await debut.appliquerDuree(this.system.duree, this.parent);
|
||||
}
|
||||
|
||||
}
|
Reference in New Issue
Block a user