forked from public/foundryvtt-reve-de-dragon
#63 Jet d'éthylisme
This commit is contained in:
258
module/actor.js
258
module/actor.js
@ -7,6 +7,7 @@ import { RdDUtility } from "./rdd-utility.js";
|
||||
import { TMRUtility } from "./tmr-utility.js";
|
||||
import { RdDRollDialog } from "./rdd-roll-dialog.js";
|
||||
import { RdDRollDialogEthylisme } from "./rdd-roll-ethylisme.js";
|
||||
import { RdDRoll } from "./rdd-roll.js";
|
||||
import { RdDTMRDialog } from "./rdd-tmr-dialog.js";
|
||||
import { Misc } from "./misc.js";
|
||||
|
||||
@ -108,6 +109,10 @@ export class RdDActor extends Actor {
|
||||
return this.data.data.reve.reve.value;
|
||||
}
|
||||
|
||||
getChanceActuel() {
|
||||
return this.data.data.compteurs.chance.value;
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
getBestDraconic() {
|
||||
const list = this.getDraconicList().sort((a, b) => b.data.niveau - a.data.niveau);
|
||||
@ -271,7 +276,7 @@ export class RdDActor extends Actor {
|
||||
this.computeRecul( rollData, encaisser );
|
||||
} else { // This is the attack roll!
|
||||
if (rolled.isSuccess) {
|
||||
let target = this.getTarget();
|
||||
let target = this._getTarget();
|
||||
if (await this.targetEntiteNonAccordee(target, 'avant-defense')) {
|
||||
return;
|
||||
}
|
||||
@ -863,6 +868,33 @@ export class RdDActor extends Actor {
|
||||
}
|
||||
}
|
||||
|
||||
computeResumeBlessure(blessures = this.data.data.blessures) {
|
||||
let nbLegeres = this.countBlessures(blessures.legeres.liste );
|
||||
let nbGraves = this.countBlessures(blessures.graves.liste );
|
||||
let nbCritiques = this.countBlessures(blessures.critiques.liste );
|
||||
|
||||
let resume = "Blessures:";
|
||||
if (nbCritiques > 0 || nbGraves > 0 || nbLegeres > 0) {
|
||||
if (nbLegeres > 0) {
|
||||
resume += " " + nbLegeres + " légères";
|
||||
}
|
||||
if (nbGraves > 0) {
|
||||
if (nbLegeres > 0)
|
||||
resume += ",";
|
||||
resume += " " + nbGraves + " graves";
|
||||
}
|
||||
if (nbCritiques > 0) {
|
||||
if (nbGraves > 0 || nbLegeres > 0)
|
||||
resume += ",";
|
||||
resume += " une CRITIQUE !";
|
||||
}
|
||||
}
|
||||
else {
|
||||
resume += " aucune";
|
||||
}
|
||||
return resume;
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
computeEtatGeneral( )
|
||||
{
|
||||
@ -978,7 +1010,7 @@ export class RdDActor extends Actor {
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
async reveActuelIncDec( value ) {
|
||||
async reveActuelIncDec( value ) {
|
||||
let reve = duplicate(this.data.data.reve.reve);
|
||||
reve.value = Math.max(reve.value + value, 0);
|
||||
await this.update( {"data.reve.reve": reve } );
|
||||
@ -1285,91 +1317,150 @@ export class RdDActor extends Actor {
|
||||
/* -------------------------------------------- */
|
||||
async rollCarac( caracName )
|
||||
{
|
||||
let carac;
|
||||
if ( caracName == "reveActuel") { // Fake carac for Reve Actuel
|
||||
carac = {type: "number",
|
||||
value: this.getReveActuel(),
|
||||
label: "Rêve Actuel"
|
||||
}
|
||||
} else {
|
||||
carac = this.data.data.carac[caracName];// Per default
|
||||
}
|
||||
let carac = this.getCaracByName(caracName);
|
||||
let rollData = {
|
||||
selectedCarac: carac,
|
||||
ajustementsConditions: CONFIG.RDD.ajustementsConditions,
|
||||
difficultesLibres: CONFIG.RDD.difficultesLibres,
|
||||
etat: this.data.data.compteurs.etat.value,
|
||||
finalLevel: 0,
|
||||
diffConditions: 0,
|
||||
diffLibre: 0,
|
||||
malusArmureValue: (this.data.data.attributs) ? this.data.data.attributs.malusarmure.value : 0,
|
||||
surencMalusFlag: (this.data.data.compteurs.surenc.value < 0),
|
||||
surencMalusValue: this.data.data.compteurs.surenc.value,
|
||||
surencMalusApply: false,
|
||||
isNatation: false,
|
||||
useEncForNatation: false
|
||||
}
|
||||
console.log(caracName, rollData);
|
||||
let html = await renderTemplate('systems/foundryvtt-reve-de-dragon/templates/dialog-roll-carac.html', rollData);
|
||||
new RdDRollDialog("carac", html, rollData, this ).render(true);
|
||||
selectedCarac: carac,
|
||||
ajustementsConditions: CONFIG.RDD.ajustementsConditions,
|
||||
difficultesLibres: CONFIG.RDD.difficultesLibres,
|
||||
etat: this.data.data.compteurs.etat.value,
|
||||
finalLevel: 0,
|
||||
diffConditions: 0,
|
||||
diffLibre: 0,
|
||||
malusArmureValue: (this.data.data.attributs) ? this.data.data.attributs.malusarmure.value : 0,
|
||||
surencMalusFlag: (this.data.data.compteurs.surenc.value < 0),
|
||||
surencMalusValue: this.data.data.compteurs.surenc.value,
|
||||
surencMalusApply: false,
|
||||
isNatation: false,
|
||||
useEncForNatation: false
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
getSortList() {
|
||||
return this.data.items.filter(item => item.type == "sort");
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
getDraconicList() {
|
||||
return this.data.items.filter(item => item.data.categorie == 'draconic')
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
async displayTMR(mode="normal")
|
||||
{
|
||||
let isRapide= mode == "rapide"
|
||||
if (mode != "visu")
|
||||
{
|
||||
let minReveValue = (isRapide) ? 3 : 2;
|
||||
if (this.getReveActuel() < minReveValue ) {
|
||||
ChatMessage.create( {
|
||||
content: "Vous n'avez plus assez de Points de Reve pour monter dans les Terres Médianes",
|
||||
whisper: ChatMessage.getWhisperRecipients(game.user.name) } );
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
// Notification au MJ
|
||||
ChatMessage.create( { content: game.user.name + " est monté dans les TMR en mode : " + mode, whisper: ChatMessage.getWhisperRecipients("GM") } );
|
||||
console.log(caracName, rollData);
|
||||
let html = await renderTemplate('systems/foundryvtt-reve-de-dragon/templates/dialog-roll-carac.html', rollData);
|
||||
new RdDRollDialog("carac", html, rollData, this ).render(true);
|
||||
}
|
||||
|
||||
let data = {
|
||||
fatigue: {
|
||||
malus: RdDUtility.calculMalusFatigue(this.data.data.sante.fatigue.value, this.data.data.sante.endurance.max),
|
||||
html: "<table class='table-fatigue'>" + RdDUtility.makeHTMLfatigueMatrix( this.data.data.sante.fatigue.value, this.data.data.sante.endurance.max ).html() + "</table>"
|
||||
},
|
||||
draconic: this.getDraconicList(),
|
||||
sort: this.getSortList(),
|
||||
caracReve: this.data.data.carac.reve.value,
|
||||
pointsReve: this.getReveActuel(),
|
||||
isRapide: isRapide
|
||||
}
|
||||
let html = await renderTemplate('systems/foundryvtt-reve-de-dragon/templates/dialog-tmr.html', data );
|
||||
this.currentTMR = new RdDTMRDialog(html, this, data, mode);
|
||||
this.currentTMR.render(true);
|
||||
async appelChance( )
|
||||
{
|
||||
let rollData = {
|
||||
selectedCarac: this.getCaracByName('chance-actuelle'),
|
||||
diffConditions: this.ajustementAstrologique()
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
rollArme( armeName, competenceName=undefined )
|
||||
{
|
||||
let armeItem = this.data.items.find(item=>item.type==="arme" && (item.name === armeName));
|
||||
if (armeItem ) {
|
||||
if ( competenceName == undefined) competenceName = armeItem.data.competence;
|
||||
this.rollCompetence( competenceName, armeItem );
|
||||
} else {
|
||||
this.rollCompetence( armeName ); //Bypass mode!
|
||||
const dialog = await RdDRoll.create(
|
||||
'systems/foundryvtt-reve-de-dragon/templates/dialog-roll-carac.html',
|
||||
this,
|
||||
rollData,
|
||||
{
|
||||
name: 'appelChance',
|
||||
label: 'Appel à la chance',
|
||||
callbacks: [
|
||||
{ action: rollData => this._appelChanceResultat(rollData) }
|
||||
]
|
||||
}
|
||||
);
|
||||
dialog.render(true);
|
||||
}
|
||||
|
||||
_appelChanceResultat(rollData) {
|
||||
const message = {
|
||||
user: game.user._id,
|
||||
alias: this.name,
|
||||
content: this.name + " fait appel à la chance" + RdDResolutionTable.explain(rollData.rolled)
|
||||
};
|
||||
if (rollData.rolled.isSuccess) {
|
||||
message.content += "<br>Dépense d'un point de chance, l'action peut être retentée"
|
||||
this.chanceActuelleIncDec(-1)
|
||||
}
|
||||
ChatMessage.create(message);
|
||||
}
|
||||
|
||||
async chanceActuelleIncDec(value) {
|
||||
let chance = duplicate(this.data.data.compteurs.chance);
|
||||
chance.value = Math.max(chance.value + value, 0);
|
||||
await this.update( {"data.compteurs.chance": chance } );
|
||||
}
|
||||
|
||||
ajustementAstrologique() {
|
||||
//TODO: selon heure et heure de naissance...
|
||||
return 0;
|
||||
}
|
||||
|
||||
getCaracByName(caracName) {
|
||||
switch (caracName)
|
||||
{
|
||||
case 'reveActuel':
|
||||
return {
|
||||
label: 'Rêve Actuel',
|
||||
value: this.getReveActuel(),
|
||||
type: "number",
|
||||
ignoreEtatGeneral: true
|
||||
};
|
||||
case 'chance-actuelle':
|
||||
return {
|
||||
type: "number",
|
||||
value: this.getChanceActuel(),
|
||||
label: 'Chance actuelle',
|
||||
ignoreEtatGeneral: true
|
||||
};
|
||||
default:
|
||||
return this.data.data.carac[caracName]; // Per default
|
||||
}
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
getSortList() {
|
||||
return this.data.items.filter(item => item.type == "sort");
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
getDraconicList() {
|
||||
return this.data.items.filter(item => item.data.categorie == 'draconic')
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
async displayTMR(mode="normal")
|
||||
{
|
||||
let isRapide= mode == "rapide"
|
||||
if (mode != "visu")
|
||||
{
|
||||
let minReveValue = (isRapide) ? 3 : 2;
|
||||
if (this.getReveActuel() < minReveValue ) {
|
||||
ChatMessage.create( {
|
||||
content: "Vous n'avez plus assez de Points de Reve pour monter dans les Terres Médianes",
|
||||
whisper: ChatMessage.getWhisperRecipients(game.user.name) } );
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
// Notification au MJ
|
||||
ChatMessage.create( { content: game.user.name + " est monté dans les TMR en mode : " + mode, whisper: ChatMessage.getWhisperRecipients("GM") } );
|
||||
|
||||
let data = {
|
||||
fatigue: {
|
||||
malus: RdDUtility.calculMalusFatigue(this.data.data.sante.fatigue.value, this.data.data.sante.endurance.max),
|
||||
html: "<table class='table-fatigue'>" + RdDUtility.makeHTMLfatigueMatrix( this.data.data.sante.fatigue.value, this.data.data.sante.endurance.max ).html() + "</table>"
|
||||
},
|
||||
draconic: this.getDraconicList(),
|
||||
sort: this.getSortList(),
|
||||
caracReve: this.data.data.carac.reve.value,
|
||||
pointsReve: this.getReveActuel(),
|
||||
isRapide: isRapide
|
||||
}
|
||||
let html = await renderTemplate('systems/foundryvtt-reve-de-dragon/templates/dialog-tmr.html', data );
|
||||
this.currentTMR = new RdDTMRDialog(html, this, data, mode);
|
||||
this.currentTMR.render(true);
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
rollArme( armeName, competenceName=undefined ) {
|
||||
let armeItem = this.data.items.find(item=>item.type==="arme" && (item.name === armeName));
|
||||
if (armeItem ) {
|
||||
if ( competenceName == undefined) competenceName = armeItem.data.competence;
|
||||
this.rollCompetence( competenceName, armeItem );
|
||||
} else {
|
||||
this.rollCompetence( armeName ); //Bypass mode!
|
||||
}
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
async rollCompetence( name, armeItem=undefined, attackerRoll=undefined, attacker = undefined) {
|
||||
let competence = RdDUtility.findCompetence( this.data.items, name);
|
||||
@ -1427,7 +1518,7 @@ export class RdDActor extends Actor {
|
||||
|
||||
let html = await renderTemplate('systems/foundryvtt-reve-de-dragon/templates/dialog-competence.html', rollData);
|
||||
if (rollData.arme) {
|
||||
if (await this.targetEntiteNonAccordee(this.getTarget(), 'avant-attaque')) {
|
||||
if (await this.targetEntiteNonAccordee(this._getTarget(), 'avant-attaque')) {
|
||||
return;
|
||||
}
|
||||
new RdDRollDialog("arme", html, rollData, this, attacker).render(true);
|
||||
@ -1436,8 +1527,7 @@ export class RdDActor extends Actor {
|
||||
}
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
getTarget() {
|
||||
_getTarget() {
|
||||
if (game.user.targets && game.user.targets.size == 1) {
|
||||
for (let target of game.user.targets) {
|
||||
return target;
|
||||
@ -1447,8 +1537,7 @@ export class RdDActor extends Actor {
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
async equiperObjet( itemID )
|
||||
{
|
||||
async equiperObjet( itemID ) {
|
||||
let item = this.getOwnedItem(itemID);
|
||||
if ( item && item.data.data ) {
|
||||
let update = {_id: item._id, "data.equipe": !item.data.data.equipe };
|
||||
@ -1488,7 +1577,6 @@ export class RdDActor extends Actor {
|
||||
/* -------------------------------------------- */
|
||||
async encaisserDommages( attackerRoll, attacker = undefined ) {
|
||||
|
||||
|
||||
if (attacker && !await attacker.accorder(this, 'avant-encaissement')) {
|
||||
return;
|
||||
}
|
||||
|
Reference in New Issue
Block a user