Merge pull request 'Préparation 11.1.5' (#680) from VincentVk/foundryvtt-reve-de-dragon:v11 into v11
Reviewed-on: #680
This commit is contained in:
commit
0c90fba346
16
changelog.md
16
changelog.md
@ -1,5 +1,19 @@
|
|||||||
# v11.0
|
# v11.0
|
||||||
## v11.1.3 - Werther de Zloth l'Onirique
|
## v11.1.5 - Werther de Zloth l'Onirique
|
||||||
|
- Fixes:
|
||||||
|
- la demande de défense ne marchait plus
|
||||||
|
- la tête réserve extensible crée bien une case de réserve extensible (à modifier)
|
||||||
|
- le souffle trou noir ajoute bien une case de trou noir
|
||||||
|
- la queue urgence draconique ne se transforme plus en idée fixe s'il y a des sorts en réserve
|
||||||
|
- l'ajout d'une nouvelle queue ne supprime plus l'insomnie
|
||||||
|
- Amélioration des jets de vie
|
||||||
|
- un 1 sur le jet de vie est une réussite même si le personnage est dans le coma
|
||||||
|
- le temps avant le prochain jet est calculé et affiché
|
||||||
|
- un 20 sur le jet de vie signifie la mort immédiate
|
||||||
|
- si on dépasse le S.Const, le personnage est bien indiqué comme mort
|
||||||
|
- pas de jets de vie pour les morts
|
||||||
|
|
||||||
|
## v11.1.4 - Werther de Zloth l'Onirique
|
||||||
- Ajout du facteur de significative à côté du pourcentage dans le résultat des jets de dés pour rappeler que le pourcentage n'est pas diviasé
|
- Ajout du facteur de significative à côté du pourcentage dans le résultat des jets de dés pour rappeler que le pourcentage n'est pas diviasé
|
||||||
- Fix: dans les TMRs, les tooltips affichent bien les informations de tous les effets sur la case
|
- Fix: dans les TMRs, les tooltips affichent bien les informations de tous les effets sur la case
|
||||||
- Fix: la fatigue et l'éthylisme sont de nouveau pris en compte dans le calcul de l'éthylisme
|
- Fix: la fatigue et l'éthylisme sont de nouveau pris en compte dans le calcul de l'éthylisme
|
||||||
|
@ -348,7 +348,7 @@ export class RdDActorSheet extends RdDBaseActorReveSheet {
|
|||||||
});
|
});
|
||||||
|
|
||||||
this.html.find('.jet-vie').click(async event => {
|
this.html.find('.jet-vie').click(async event => {
|
||||||
this.actor.jetVie();
|
this.actor.jetDeVie();
|
||||||
});
|
});
|
||||||
this.html.find('.jet-endurance').click(async event => {
|
this.html.find('.jet-endurance').click(async event => {
|
||||||
await this.jetEndurance();
|
await this.jetEndurance();
|
||||||
|
@ -323,7 +323,9 @@ export class RdDActor extends RdDBaseActorSang {
|
|||||||
}
|
}
|
||||||
|
|
||||||
async setInfoSommeilInsomnie() {
|
async setInfoSommeilInsomnie() {
|
||||||
await this.update({ 'system.sommeil.insomnie': EffetsDraconiques.isSujetInsomnie(this) });
|
if (EffetsDraconiques.isSujetInsomnie(this)) {
|
||||||
|
await this.update({ 'system.sommeil.insomnie': true });
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
async setInfoSommeilMoral(situationMoral) {
|
async setInfoSommeilMoral(situationMoral) {
|
||||||
|
@ -60,13 +60,21 @@ export class RdDBaseActorSang extends RdDBaseActorReve {
|
|||||||
return this.system.sante.vie.value < -this.getSConst()
|
return this.system.sante.vie.value < -this.getSConst()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
nbBlessuresLegeres() {
|
||||||
|
return this.itemTypes[TYPES.blessure].filter(it => it.isLegere()).length;
|
||||||
|
}
|
||||||
|
nbBlessuresGraves() {
|
||||||
|
return this.itemTypes[TYPES.blessure].filter(it => it.isGrave()).length;
|
||||||
|
}
|
||||||
|
nbBlessuresCritiques() {
|
||||||
|
return this.itemTypes[TYPES.blessure].filter(it => it.isCritique()).length;
|
||||||
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
computeResumeBlessure() {
|
computeResumeBlessure() {
|
||||||
const blessures = this.filterItems(it => it.system.gravite > 0, 'blessure')
|
const nbLegeres = this.nbBlessuresLegeres()
|
||||||
|
const nbGraves = this.nbBlessuresGraves()
|
||||||
const nbLegeres = blessures.filter(it => it.isLegere()).length;
|
const nbCritiques = this.nbBlessuresCritiques()
|
||||||
const nbGraves = blessures.filter(it => it.isGrave()).length;
|
|
||||||
const nbCritiques = blessures.filter(it => it.isCritique()).length;
|
|
||||||
|
|
||||||
if (nbLegeres + nbGraves + nbCritiques == 0) {
|
if (nbLegeres + nbGraves + nbCritiques == 0) {
|
||||||
return "Aucune blessure";
|
return "Aucune blessure";
|
||||||
@ -206,26 +214,36 @@ export class RdDBaseActorSang extends RdDBaseActorReve {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
async jetVie() {
|
async jetDeVie() {
|
||||||
let roll = await RdDDice.roll("1d20");
|
if (this.isDead()) {
|
||||||
let msgText = "Jet de Vie : " + roll.total + " / " + this.system.sante.vie.value + "<br>";
|
ChatMessage.create({ content: `Jet de Vie: ${this.name} est déjà mort, ce n'est pas la peine d'en rajouter !!!!!`, whisper: ChatMessage.getWhisperRecipients(this.name) });
|
||||||
if (roll.total <= this.system.sante.vie.value) {
|
return
|
||||||
msgText += "Jet réussi, pas de perte de point de vie (prochain jet dans 1 round pour 1 critique, SC minutes pour une grave)";
|
|
||||||
if (roll.total == 1) {
|
|
||||||
msgText += "La durée entre 2 jets de vie est multipliée par 20 (20 rounds pour une critique, SCx20 minutes pour une grave)";
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
msgText += "Jet échoué, vous perdez 1 point de vie";
|
|
||||||
await this.santeIncDec("vie", -1);
|
|
||||||
if (roll.total == 20) {
|
|
||||||
msgText += "Votre personnage est mort !!!!!";
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
const message = {
|
const jetDeVie = await RdDDice.roll("1d20");
|
||||||
content: msgText,
|
|
||||||
whisper: ChatMessage.getWhisperRecipients(this.name)
|
const sConst = this.getSConst();
|
||||||
};
|
const vie = this.system.sante.vie.value;
|
||||||
ChatMessage.create(message);
|
const isCritique = this.nbBlessuresCritiques() > 0;
|
||||||
|
const isGrave = this.nbBlessuresGraves();
|
||||||
|
const isEchecTotal = jetDeVie.total == 20;
|
||||||
|
const isSuccess = jetDeVie.total == 1 || jetDeVie.total <= vie;
|
||||||
|
const perte = isSuccess ? 0 : 1 + (isEchecTotal ? vie + sConst : 0)
|
||||||
|
const prochainJet = (jetDeVie.total == 1 && vie > 0 ? 20 : 1) * (isCritique ? 1 : isGrave > 0 ? sConst : 0)
|
||||||
|
|
||||||
|
let msgText = `Jet de Vie: <strong>${jetDeVie.total} / ${vie}</strong>`
|
||||||
|
if (isSuccess) {
|
||||||
|
msgText += "<br>Réussi, pas de perte de point de vie."
|
||||||
|
} else {
|
||||||
|
msgText += `<br>Echoué, perte ${perte} point de vie`;
|
||||||
|
await this.santeIncDec("vie", -perte);
|
||||||
|
}
|
||||||
|
if (this.isDead()) {
|
||||||
|
msgText += `<br><strong>${this.name} est mort !!!!</strong>`;
|
||||||
|
}
|
||||||
|
else if (prochainJet > 0) {
|
||||||
|
msgText += `<br>Prochain jet de vie dans ${prochainJet} ${isCritique ? 'round' : 'minute'}${prochainJet > 1 ? 's' : ''} ${isCritique ? '(état critique)' : '(état grave)'}`
|
||||||
|
}
|
||||||
|
ChatMessage.create({ content: msgText, whisper: ChatMessage.getWhisperRecipients(this.name) });
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
@ -238,7 +256,6 @@ export class RdDBaseActorSang extends RdDBaseActorReve {
|
|||||||
return { jetEndurance, sonne }
|
return { jetEndurance, sonne }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
async finDeRoundBlessures() {
|
async finDeRoundBlessures() {
|
||||||
const nbGraves = this.filterItems(it => it.isGrave(), 'blessure').length;
|
const nbGraves = this.filterItems(it => it.isGrave(), 'blessure').length;
|
||||||
if (nbGraves > 0) {
|
if (nbGraves > 0) {
|
||||||
|
@ -518,7 +518,7 @@ export class RdDCombat {
|
|||||||
let token = canvas.tokens.placeables.find(t => t.id == tokenId)
|
let token = canvas.tokens.placeables.find(t => t.id == tokenId)
|
||||||
const actor = token?.actor ?? game.actors.get(actorId);
|
const actor = token?.actor ?? game.actors.get(actorId);
|
||||||
if (actor?.isOwner) {
|
if (actor?.isOwner) {
|
||||||
actor.jetVie();
|
actor.jetDeVie();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -13,8 +13,8 @@ export class ReserveExtensible extends Draconique {
|
|||||||
manualMessage() { return "Vous pouvez re-configurer votre Réserve extensible" }
|
manualMessage() { return "Vous pouvez re-configurer votre Réserve extensible" }
|
||||||
async onActorCreateOwned(actor, tete) {
|
async onActorCreateOwned(actor, tete) {
|
||||||
const existants = actor.items.filter(it => this.isCase(it)).map(it => it.system.coord);
|
const existants = actor.items.filter(it => this.isCase(it)).map(it => it.system.coord);
|
||||||
const tmr = await TMRUtility.getTMRAleatoire(it => !(it.type == 'fleuve' || existants.includes(it.system.coord)));
|
const selectedTMR = await TMRUtility.getTMRAleatoire(tmr => !(tmr.type == 'fleuve' || existants.includes(tmr.coord)));
|
||||||
await this.createCaseTmr(actor, "Nouvelle Réserve extensible", tmr, tete.id);
|
await this.createCaseTmr(actor, "Nouvelle Réserve extensible", selectedTMR, tete.id);
|
||||||
}
|
}
|
||||||
|
|
||||||
code() { return 'reserve_extensible' }
|
code() { return 'reserve_extensible' }
|
||||||
|
@ -14,8 +14,8 @@ export class TrouNoir extends Draconique {
|
|||||||
|
|
||||||
async onActorCreateOwned(actor, souffle) {
|
async onActorCreateOwned(actor, souffle) {
|
||||||
const existants = actor.items.filter(it => this.isCase(it)).map(it => it.system.coord);
|
const existants = actor.items.filter(it => this.isCase(it)).map(it => it.system.coord);
|
||||||
const tmr = await TMRUtility.getTMRAleatoire(it => !(TMRUtility.isCaseHumide(it) || existants.includes(it.system.coord)));
|
const selectedTMR = await TMRUtility.getTMRAleatoire(tmr => !(TMRUtility.isCaseHumide(tmr) || existants.includes(tmr.coord)));
|
||||||
await this.createCaseTmr(actor, 'Trou noir: ' + tmr.label, tmr, souffle.id);
|
await this.createCaseTmr(actor, 'Trou noir: ' + selectedTMR.label, selectedTMR, souffle.id);
|
||||||
}
|
}
|
||||||
|
|
||||||
code() { return 'trounoir' }
|
code() { return 'trounoir' }
|
||||||
|
@ -8,15 +8,11 @@ import { Draconique } from "./draconique.js";
|
|||||||
|
|
||||||
export class UrgenceDraconique extends Draconique {
|
export class UrgenceDraconique extends Draconique {
|
||||||
|
|
||||||
constructor() {
|
|
||||||
super();
|
|
||||||
}
|
|
||||||
|
|
||||||
type() { return 'queue' }
|
type() { return 'queue' }
|
||||||
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.system.reve.reserve?.list.map(it => it.coord)) ?? [];
|
const coordSortsReserve = actor.itemTypes[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();
|
||||||
@ -26,7 +22,6 @@ export class UrgenceDraconique extends Draconique {
|
|||||||
});
|
});
|
||||||
await actor.createEmbeddedDocuments('Item', [ideeFixe]);
|
await actor.createEmbeddedDocuments('Item', [ideeFixe]);
|
||||||
await actor.deleteEmbeddedDocuments('Item', [queue.id]);
|
await actor.deleteEmbeddedDocuments('Item', [queue.id]);
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
const demiReve = actor.getDemiReve();
|
const demiReve = actor.getDemiReve();
|
||||||
|
Loading…
Reference in New Issue
Block a user