#42 Amélioration messages de tchat
* Appel à la chance * compétences * jets généraux (remplace table résolution, carac et cas particuliers) * Attaque: en cours
This commit is contained in:
@ -1636,24 +1636,14 @@ export class RdDActor extends Actor {
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
_tacheResult(rollData) {
|
||||
async _tacheResult(rollData) {
|
||||
// Mise à jour de la tache
|
||||
rollData.tache.data.points_de_tache_courant += rollData.rolled.ptTache;
|
||||
this.updateEmbeddedEntity( "OwnedItem", rollData.tache);
|
||||
this.santeIncDec( "fatigue", rollData.tache.data.fatigue);
|
||||
|
||||
// Message de résultat
|
||||
ChatUtility.chatWithRollMode({
|
||||
content: "<strong>Test de Tache : " + rollData.tache.name + " - " + rollData.selectedCarac.label + " / " + rollData.competence.name + "</strong>"
|
||||
+ RdDResolutionTable.explainRollData(rollData)
|
||||
+ "<br>Points de taches : " + rollData.rolled.ptTache + ", ajustement qualité: " + rollData.rolled.ptQualite
|
||||
}, this.name);
|
||||
// Message spécifique de la tâche
|
||||
ChatUtility.chatWithRollMode({
|
||||
content: "Votre tâche <strong>" + rollData.tache.name + "</strong> a duré " + rollData.tache.data.periodicite + "."
|
||||
+ "<br>Votre avancement est désormais de " + rollData.tache.data.points_de_tache_courant + " Points de Tache sur un objectif de "
|
||||
+ rollData.tache.data.points_de_tache + "."
|
||||
+ "<br>Et vous vous êtes fatigué de " + rollData.tache.data.fatigue + " cases."
|
||||
content: await RdDResolutionTable.explainRollDataV2(rollData, 'chat-resultat-tache.html')
|
||||
}, this.name);
|
||||
}
|
||||
|
||||
@ -1661,18 +1651,14 @@ export class RdDActor extends Actor {
|
||||
_tacheETotal(rollData) {
|
||||
rollData.tache.data.difficulte--;
|
||||
this.updateEmbeddedEntity( "OwnedItem", rollData.tache);
|
||||
ChatUtility.chatWithRollMode( {
|
||||
content: "Vous avez fait un Echec Total sur votre Tache <strong>" + rollData.tache.name + "</strong> : en conséquence, la difficulté a augmenté de 1"
|
||||
}, this.name);
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
_competenceResult(rollData) {
|
||||
async _competenceResult(rollData) {
|
||||
rollData.show = {points:true};
|
||||
ChatUtility.chatWithRollMode({
|
||||
content: "<strong>Test : " + rollData.selectedCarac.label + " / " + rollData.competence.name + "</strong>"
|
||||
+ RdDResolutionTable.explainRollData(rollData)
|
||||
+ "<br>Points de taches : " + rollData.rolled.ptTache + ", ajustement qualité: " + rollData.rolled.ptQualite
|
||||
}, this.name);
|
||||
content: await RdDResolutionTable.explainRollDataV2(rollData, 'chat-resultat-competence.html')
|
||||
}, this.name);
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
@ -1706,6 +1692,10 @@ export class RdDActor extends Actor {
|
||||
await this.chanceActuelleIncDec(-1)
|
||||
}
|
||||
ChatMessage.create(message);
|
||||
|
||||
ChatUtility.chatWithRollMode({
|
||||
content: await RdDResolutionTable.explainRollDataV2(rollData, 'chat-resultat-appelchance.html')
|
||||
}, this.name);
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
|
@ -13,7 +13,7 @@ const conditionsTactiques = [
|
||||
export class RdDBonus {
|
||||
|
||||
/* -------------------------------------------- */
|
||||
static _find(condition) {
|
||||
static find(condition) {
|
||||
return conditionsTactiques.find(e => e.type == condition) || conditionsTactiques.find(e => e.type == 'pret');
|
||||
}
|
||||
|
||||
@ -25,7 +25,7 @@ export class RdDBonus {
|
||||
ui.notifications.warn("Calcul de bonus dégats sur eswquive");
|
||||
} else {
|
||||
dmg.dmgArme = RdDBonus._dmgArme(rollData);
|
||||
dmg.ignoreArmure = 0; // TODO: calculer pour arcs et arbaletes, gérer pour lmes créatures
|
||||
dmg.penetration = RdDBonus._peneration(rollData);
|
||||
dmg.dmgTactique = RdDBonus.dmgBonus(rollData.tactique);
|
||||
dmg.dmgParticuliere = RdDBonus._dmgParticuliere(rollData);
|
||||
dmg.dmgSurprise = RdDBonus.dmgBonus(rollData.surpriseDefenseur);
|
||||
@ -38,17 +38,17 @@ export class RdDBonus {
|
||||
|
||||
/* -------------------------------------------- */
|
||||
static description(condition) {
|
||||
return RdDBonus._find(condition).descr;
|
||||
return RdDBonus.find(condition).descr;
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
static dmgBonus(condition) {
|
||||
return RdDBonus._find(condition).dmg;
|
||||
return RdDBonus.find(condition).dmg;
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
static bonusAttaque(condition) {
|
||||
return RdDBonus._find(condition).attaque;
|
||||
return RdDBonus.find(condition).attaque;
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
@ -68,6 +68,10 @@ export class RdDBonus {
|
||||
static _dmgArme(rollData) {
|
||||
return rollData.arme ? parseInt(rollData.arme.data.dommages) : 0;
|
||||
}
|
||||
|
||||
static _peneration(rollData) {
|
||||
return rollData.arme ? parseInt(rollData.arme.data.penetration) : 0;
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
static _dmgPerso(dmgActor, categorie, dmgArme) {
|
||||
|
@ -62,7 +62,7 @@ export class RdDCombat {
|
||||
content: message,
|
||||
whisper: ChatUtility.getWhisperRecipients("blindroll", recipient.name),
|
||||
};
|
||||
|
||||
|
||||
// envoyer le message au destinataire
|
||||
if (!game.user.isGM || recipient.hasPlayerOwner) {
|
||||
let data = {
|
||||
@ -73,7 +73,7 @@ export class RdDCombat {
|
||||
rollMode: true
|
||||
};
|
||||
mergeObject(data, chatMessage);
|
||||
game.socket.emit("system.foundryvtt-reve-de-dragon", { msg: topic, data: data});
|
||||
game.socket.emit("system.foundryvtt-reve-de-dragon", { msg: topic, data: data });
|
||||
} else {
|
||||
chatMessage.whisper = [game.user];
|
||||
}
|
||||
@ -224,12 +224,16 @@ export class RdDCombat {
|
||||
/* -------------------------------------------- */
|
||||
_onAttaqueParticuliere(rollData) {
|
||||
console.log("RdDCombat.onAttaqueParticuliere >>>", rollData);
|
||||
let message = "<strong>Réussite particulière en attaque</strong>";
|
||||
message += "<br><a class='chat-card-button' id='particuliere-attaque' data-mode='force' data-attackerId='" + this.attackerId + "'>Attaquer en Force</a>";
|
||||
// Finesse et Rapidité seulement en mêlée et si la difficulté libre est de -1 minimum
|
||||
let message = `
|
||||
<h4 class="rdd-roll-part"><strong>Réussite particulière en attaque</strong></h4>
|
||||
<br><a class='chat-card-button' id='particuliere-attaque' data-mode='force' data-attackerId='${this.attackerId}'>Attaquer en Force</a>
|
||||
`;
|
||||
if (rollData.selectedCarac.label == "Mêlée" && rollData.diffLibre < 0) {
|
||||
message += "<br><a class='chat-card-button' id='particuliere-attaque' data-mode='rapidite' data-attackerId='" + this.attackerId + "'>Attaquer en Rapidité</a>";
|
||||
message += "<br><a class='chat-card-button' id='particuliere-attaque' data-mode='finesse' data-attackerId='" + this.attackerId + "'>Attaquer en Finesse</a>";
|
||||
message += `
|
||||
<br><a class='chat-card-button' id='particuliere-attaque' data-mode='rapidite' data-attackerId='${this.attackerId}'>Attaquer en Rapidité</a>
|
||||
<br><a class='chat-card-button' id='particuliere-attaque' data-mode='finesse' data-attackerId='${this.attackerId}'>Attaquer en Finesse</a>";
|
||||
`
|
||||
}
|
||||
game.system.rdd.rollDataHandler[this.attackerId] = rollData;
|
||||
// TODO: use a dialog?
|
||||
@ -240,34 +244,42 @@ export class RdDCombat {
|
||||
async _onAttaqueNormale(rollData) {
|
||||
console.log("RdDCombat.onAttaqueNormale >>>", rollData);
|
||||
let explications = "";
|
||||
|
||||
|
||||
rollData.dmg = RdDBonus.dmg(rollData, this.attacker.getBonusDegat(), this.defender.isEntiteCauchemar());
|
||||
|
||||
|
||||
if (this.target) {
|
||||
explications += "<br><strong>Cible</strong> : " + this.defender.data.name;
|
||||
}
|
||||
explications += "<br>Encaissement à " + Misc.toSignedString(rollData.dmg.total) + " (" + rollData.dmg.loc.label + ")";
|
||||
|
||||
|
||||
// Save rollData for defender
|
||||
game.system.rdd.rollDataHandler[this.attackerId] = duplicate(rollData);
|
||||
|
||||
|
||||
// Message spécial pour la rapidité, qui reste difficile à gérer automatiquement
|
||||
if (rollData.particuliereAttaque == 'rapidite') {
|
||||
explications += "<br>Vous avez attaqué en Rapidité. Vous pourrez faire une deuxième attaque, ou utiliser votre arme pour vous défendre.";
|
||||
}
|
||||
|
||||
|
||||
// Final chat message
|
||||
let chatOptions = {
|
||||
content: "<strong>Test : " + rollData.selectedCarac.label + " / " + rollData.competence.name + "</strong>"
|
||||
+ RdDResolutionTable.explainRollData(rollData)
|
||||
+ explications
|
||||
+ RdDResolutionTable.explainRollData(rollData)
|
||||
+ explications
|
||||
}
|
||||
ChatUtility.chatWithRollMode(chatOptions, this.attacker.name)
|
||||
|
||||
|
||||
rollData.show = {
|
||||
cible: this.target ? this.defender.data.name : 'la cible',
|
||||
isRecul : (rollData.particuliereAttaque == 'force' || rollData.tactique == 'charge')
|
||||
}
|
||||
ChatUtility.chatWithRollMode(
|
||||
{ content: await RdDResolutionTable.explainRollDataV2(rollData, 'chat-resultat-attaque.html') },
|
||||
this.name)
|
||||
|
||||
if (!await this.accorderEntite('avant-defense')) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
if (this.target) {
|
||||
this._sendMessageDefense(rollData);
|
||||
}
|
||||
@ -593,8 +605,8 @@ export class RdDCombat {
|
||||
await this.computeRecul(rollData, true);
|
||||
this._sendMessageEncaisser(rollData.attackerRoll);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
/* -------------------------------------------- */
|
||||
async computeDeteriorationArme(rollData) {
|
||||
const attackerRoll = rollData.attackerRoll;
|
||||
@ -678,7 +690,7 @@ export class RdDCombat {
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
_sendMessageEncaisser(rollData){
|
||||
_sendMessageEncaisser(rollData) {
|
||||
let message = "<strong>" + this.defender.name + "</strong> doit:" + this._buildMessageEncaisser(rollData);
|
||||
RdDCombat._sendRollMessage(this.attacker, this.defender, this.defenderTokenId, "msg_encaisser", message, rollData);
|
||||
}
|
||||
|
@ -1,4 +1,5 @@
|
||||
import { Misc } from "./misc.js";
|
||||
import { RdDBonus } from "./rdd-bonus.js";
|
||||
import { RdDDice } from "./rdd-dice.js";
|
||||
|
||||
/**
|
||||
@ -88,7 +89,7 @@ export class RdDResolutionTable {
|
||||
return message;
|
||||
}
|
||||
|
||||
static async explainRollDataV2(rollData, template = 'chat-resultat-rdd.html') {
|
||||
static async explainRollDataV2(rollData, template = 'chat-resultat-general.html') {
|
||||
rollData.ajustements = RdDResolutionTable._buildAjustements(rollData);
|
||||
rollData.show = rollData.show || {};
|
||||
|
||||
@ -101,21 +102,29 @@ export class RdDResolutionTable {
|
||||
if (rollData.competence) {
|
||||
list.push({ label: rollData.competence.name, value: rollData.competence.data.niveau});
|
||||
}
|
||||
if (rollData.tactique) {
|
||||
const surprise = RdDBonus.find(rollData.tactique);
|
||||
list.push({ label: surprise.descr, value: surprise.attaque });
|
||||
}
|
||||
if (rollData.surpriseDefenseur) {
|
||||
const surprise = RdDBonus.find(rollData.surpriseDefenseur);
|
||||
list.push({ label: surprise.descr, value: surprise.attaque });
|
||||
}
|
||||
if (rollData.diffLibre != undefined) {
|
||||
const label = rollData.selectedSort ? rollData.selectedSort.name : 'libre';
|
||||
const label = rollData.selectedSort ? rollData.selectedSort.name : 'Libre';
|
||||
list.push({ label: label, value: rollData.diffLibre });
|
||||
}
|
||||
if (rollData.diffConditions != undefined) {
|
||||
list.push({ label: 'conditions', value: rollData.diffConditions });
|
||||
list.push({ label: 'Conditions', value: rollData.diffConditions });
|
||||
}
|
||||
if (rollData.etat != undefined) {
|
||||
list.push({ label: 'état', value: rollData.etat });
|
||||
list.push({ label: 'Etat', value: rollData.etat });
|
||||
}
|
||||
if (rollData.selectedCarac != undefined && rollData.moral != undefined && rollData.selectedCarac.label == 'Volonté') {
|
||||
list.push({ label: 'moral', value: rollData.selectedCarac != undefined && rollData.moral != undefined && rollData.selectedCarac.label == 'Volonté' ? rollData.moral : undefined });
|
||||
list.push({ label: 'Moral', value: rollData.selectedCarac != undefined && rollData.moral != undefined && rollData.selectedCarac.label == 'Volonté' ? rollData.moral : undefined });
|
||||
}
|
||||
if (RdDResolutionTable.isAjustementAstrologique(rollData)) {
|
||||
list.push({ label: 'astrologique', value: rollData.ajustementAstrologique||0 });
|
||||
list.push({ label: 'Astrologique', value: rollData.ajustementAstrologique||0 });
|
||||
}
|
||||
if (rollData.rolled.bonus && rollData.selectedSort) {
|
||||
list.push({ label: 'Bonus de case', value: rollData.rolled.bonus, unit: '%' });
|
||||
|
@ -11,7 +11,7 @@ const titleTableDeResolution = 'Table de résolution';
|
||||
export class RdDRollResolution extends Dialog {
|
||||
|
||||
/* -------------------------------------------- */
|
||||
static async open(rollData = {selectedCarac:10}) {
|
||||
static async open(rollData = {}) {
|
||||
RdDRollResolution._setDefaultOptions(rollData);
|
||||
let html = await renderTemplate('systems/foundryvtt-reve-de-dragon/templates/dialog-roll-resolution.html', rollData);
|
||||
const dialog = new RdDRollResolution(rollData, html);
|
||||
@ -21,8 +21,9 @@ export class RdDRollResolution extends Dialog {
|
||||
/* -------------------------------------------- */
|
||||
static _setDefaultOptions(rollData) {
|
||||
|
||||
|
||||
let defRollData = {
|
||||
show: {title: titleTableDeResolution, points:true},
|
||||
show: { title: titleTableDeResolution, points: true },
|
||||
ajustementsConditions: CONFIG.RDD.ajustementsConditions,
|
||||
difficultesLibres: CONFIG.RDD.difficultesLibres,
|
||||
etat: 0,
|
||||
@ -30,15 +31,19 @@ export class RdDRollResolution extends Dialog {
|
||||
carac: {},
|
||||
finalLevel: 0,
|
||||
diffConditions: 0,
|
||||
diffLibre: 0
|
||||
diffLibre: 0,
|
||||
}
|
||||
mergeObject(rollData, defRollData, {overwrite: false});
|
||||
mergeObject(rollData, defRollData, { overwrite: false });
|
||||
for (let i = 1; i < 21; i++) {
|
||||
rollData.carac[i] = { type: "number", value: i, label: i }
|
||||
if (rollData.selectedCarac == i) {
|
||||
rollData.selectedCarac = rollData.carac[i];
|
||||
}
|
||||
const key = `${i}`;
|
||||
rollData.carac[key] = { type: "number", value: i, label: key }
|
||||
}
|
||||
let selected = (rollData.selectedCarac && rollData.selectedCarac.label)
|
||||
? rollData.selectedCarac.label
|
||||
: (Number.isInteger(rollData.selectedCarac))
|
||||
? rollData.selectedCarac
|
||||
: 10;
|
||||
rollData.selectedCarac = rollData.carac[selected];
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
@ -59,7 +64,7 @@ export class RdDRollResolution extends Dialog {
|
||||
async onAction(html) {
|
||||
await RdDResolutionTable.rollData(this.rollData);
|
||||
console.log("RdDRollResolution -=>", this.rollData, this.rollData.rolled);
|
||||
const message = { content: await RdDResolutionTable.explainRollDataV2(this.rollData)};
|
||||
const message = { content: await RdDResolutionTable.explainRollDataV2(this.rollData) };
|
||||
ChatUtility.chatWithRollMode(message, game.user.name)
|
||||
}
|
||||
|
||||
@ -75,7 +80,7 @@ export class RdDRollResolution extends Dialog {
|
||||
function updateRollResult(rollData) {
|
||||
rollData.caracValue = parseInt(rollData.selectedCarac.value)
|
||||
rollData.finalLevel = dialog._computeFinalLevel(rollData);
|
||||
|
||||
|
||||
// Mise à jour valeurs
|
||||
$("#carac").val(rollData.caracValue);
|
||||
$("#roll-param").text(rollData.selectedCarac.value + " / " + Misc.toSignedString(rollData.finalLevel));
|
||||
@ -84,7 +89,7 @@ export class RdDRollResolution extends Dialog {
|
||||
$(".span-valeur").remove();
|
||||
$("#resolutionValeurs").append(RdDResolutionTable.buildHTMLResults(rollData.caracValue, rollData.finalLevel));
|
||||
}
|
||||
|
||||
|
||||
// Setup everything onload
|
||||
$(function () {
|
||||
$("#diffLibre").val(Misc.toInt(rollData.diffLibre));
|
||||
|
Reference in New Issue
Block a user