11.2.6 - Les réveils difficiles d'Akarlikarlikar #686
@ -130,7 +130,7 @@ export class RdDActorSheet extends RdDBaseActorSangSheet {
|
|||||||
|
|
||||||
this.html.find('.subacteur-coeur-toggle a').click(async event => {
|
this.html.find('.subacteur-coeur-toggle a').click(async event => {
|
||||||
const subActorIdactorId = RdDSheetUtility.getEventItemData(event, 'subactor-id')
|
const subActorIdactorId = RdDSheetUtility.getEventItemData(event, 'subactor-id')
|
||||||
const coeurNombre = $(event.currentTarget).data('coeur-nombre')
|
const coeurNombre = $(event.currentTarget).data('numero-coeur')
|
||||||
RdDCoeur.toggleSubActeurCoeur(this.actor.id, subActorIdactorId, coeurNombre)
|
RdDCoeur.toggleSubActeurCoeur(this.actor.id, subActorIdactorId, coeurNombre)
|
||||||
})
|
})
|
||||||
this.html.find('.subacteur-tendre-moment').click(async event => {
|
this.html.find('.subacteur-tendre-moment').click(async event => {
|
||||||
|
@ -34,6 +34,7 @@ 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 { 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";
|
||||||
|
|
||||||
export const MAINS_DIRECTRICES = ['Droitier', 'Gaucher', 'Ambidextre']
|
export const MAINS_DIRECTRICES = ['Droitier', 'Gaucher', 'Ambidextre']
|
||||||
|
|
||||||
@ -270,6 +271,7 @@ export class RdDActor extends RdDBaseActorSang {
|
|||||||
await this.setBonusPotionSoin(0);
|
await this.setBonusPotionSoin(0);
|
||||||
await this.retourSust(message);
|
await this.retourSust(message);
|
||||||
await this.$perteRevePotionsEnchantees();
|
await this.$perteRevePotionsEnchantees();
|
||||||
|
await RdDCoeur.applyCoeurChateauDormant(this, message)
|
||||||
if (message.content != "") {
|
if (message.content != "") {
|
||||||
message.content = `A la fin Chateau Dormant, ${message.content}<br>Un nouveau jour se lève`;
|
message.content = `A la fin Chateau Dormant, ${message.content}<br>Un nouveau jour se lève`;
|
||||||
ChatMessage.create(message);
|
ChatMessage.create(message);
|
||||||
@ -2636,7 +2638,8 @@ export class RdDActor extends RdDBaseActorSang {
|
|||||||
static $transformSubActeurSuivant = (suivant, link) => {
|
static $transformSubActeurSuivant = (suivant, link) => {
|
||||||
return mergeObject(RdDBaseActor.extractActorMin(suivant), {
|
return mergeObject(RdDBaseActor.extractActorMin(suivant), {
|
||||||
ephemere: !suivant.prototypeToken.actorLink,
|
ephemere: !suivant.prototypeToken.actorLink,
|
||||||
coeur: link.coeur ?? 0
|
coeur: link.coeur ?? 0,
|
||||||
|
prochainCoeur: link.prochainCoeur ?? link.coeur ?? 0
|
||||||
})
|
})
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -2646,23 +2649,23 @@ export class RdDActor extends RdDBaseActorSang {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
getSuivant(actorId) {
|
getSuivant(subActorId) {
|
||||||
const suivant = this.system.subacteurs.suivants.find(it => it.id == actorId);
|
const suivant = this.system.subacteurs.suivants.find(it => it.id == subActorId);
|
||||||
if (suivant) {
|
if (suivant) {
|
||||||
return RdDActor.$transformSubActeurSuivant(game.actors.get(actorId), suivant);
|
return RdDActor.$transformSubActeurSuivant(game.actors.get(suivant.id), suivant);
|
||||||
}
|
}
|
||||||
return undefined
|
return undefined
|
||||||
}
|
}
|
||||||
|
|
||||||
getPointsCoeur(actorId) {
|
getPointsCoeur(subActorId) {
|
||||||
return this.getSuivant(actorId)?.coeur ?? 0;
|
return this.getSuivant(subActorId)?.coeur ?? 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
async setPointsCoeur(actorId, coeur) {
|
async setPointsCoeur(subActorId, coeurs, options = { immediat: false }) {
|
||||||
const amoureux = this.getSuivant(actorId);
|
const newSuivants = duplicate(this.system.subacteurs.suivants)
|
||||||
|
const amoureux = newSuivants.find(it => it.id == subActorId);
|
||||||
if (amoureux) {
|
if (amoureux) {
|
||||||
const suivants = this.system.subacteurs.suivants;
|
amoureux[options.immediat ? 'coeur' : 'prochainCoeur'] = coeurs
|
||||||
let newSuivants = [...suivants.filter(it => it.id != actorId), { id: actorId, coeur: coeur }]
|
|
||||||
await this.update({ 'system.subacteurs.suivants': newSuivants });
|
await this.update({ 'system.subacteurs.suivants': newSuivants });
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -53,22 +53,46 @@ export class RdDCoeur {
|
|||||||
|
|
||||||
static async toggleSubActeurCoeur(actorId, subActorId, toggleCoeur) {
|
static async toggleSubActeurCoeur(actorId, subActorId, toggleCoeur) {
|
||||||
const actor = game.actors.get(actorId)
|
const actor = game.actors.get(actorId)
|
||||||
if (ReglesOptionnelles.isUsing("chateau-dormant-gardien") && !actor.system.sommeil.nouveaujour) {
|
const amoureux = actor.getSuivant(subActorId)
|
||||||
ui.notifications.warn(`Les changements de points de coeur se font juste avant de gérer Château Dormant, juste avant de passer à un nouveau jour`)
|
if (toggleCoeur <= amoureux.coeur) {
|
||||||
return
|
if (toggleCoeur > amoureux.prochainCoeur) {
|
||||||
}
|
toggleCoeur = amoureux.coeur
|
||||||
const coeur = actor.getPointsCoeur(subActorId);
|
|
||||||
if (toggleCoeur <= coeur) {
|
|
||||||
// TODO: validation?
|
|
||||||
await actor.moralIncDec(-4);
|
|
||||||
actor.setPointsCoeur(subActorId, Math.max(0, coeur - 1));
|
|
||||||
ChatMessage.create({
|
|
||||||
whisper: ChatUtility.getWhisperRecipientsAndGMs(actor.name),
|
|
||||||
content: `Perte de points de coeur arbitraire: ${actor.name} perd 4 points de moral, pour finir à ${actor.getMoralTotal()}.`
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
actor.setPointsCoeur(subActorId, Math.min(4, toggleCoeur));
|
toggleCoeur = amoureux.coeur - 1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (toggleCoeur <= amoureux.prochainCoeur) {
|
||||||
|
toggleCoeur = Math.max(amoureux.coeur, toggleCoeur - 1)
|
||||||
|
}
|
||||||
|
actor.setPointsCoeur(subActorId, Math.max(0, Math.min(toggleCoeur, 4)))
|
||||||
|
}
|
||||||
|
|
||||||
|
static async applyCoeurChateauDormant(actor, message) {
|
||||||
|
const newSuivants = duplicate(actor.system.subacteurs.suivants)
|
||||||
|
let count = 0
|
||||||
|
newSuivants.forEach(async link => {
|
||||||
|
const suivant = game.actors.get(link.id)
|
||||||
|
const prochainCoeur = link.prochainCoeur ?? 0;
|
||||||
|
const coeurCourant = link.coeur ?? 0;
|
||||||
|
const diff = prochainCoeur - coeurCourant
|
||||||
|
if (diff < 0) {
|
||||||
|
await actor.moralIncDec(-4);
|
||||||
|
link.coeur = Math.max(0, coeurCourant - 1)
|
||||||
|
link.prochainCoeur = link.coeur
|
||||||
|
message.content += `<br>Votre cœur brisé pour ${suivant.name} vous fait perdre 4 points de moral, il vous reste ${link.coeur} points de Cœur.`
|
||||||
|
count++
|
||||||
|
}
|
||||||
|
else if (diff > 0) {
|
||||||
|
link.coeur = Math.min(prochainCoeur, 4)
|
||||||
|
message.content += `<br>Votre cœur bat fort, vous avez maintenant ${link.coeur} points de Cœur pour ${suivant.name}.`
|
||||||
|
link.prochainCoeur = link.coeur
|
||||||
|
count++
|
||||||
|
}
|
||||||
|
}
|
||||||
|
)
|
||||||
|
if (count > 0) {
|
||||||
|
await actor.update({ 'system.subacteurs.suivants': newSuivants });
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -130,14 +154,13 @@ export class RdDCoeur {
|
|||||||
? [infoCoeur.target, infoCoeur.source]
|
? [infoCoeur.target, infoCoeur.source]
|
||||||
: [undefined, undefined]))
|
: [undefined, undefined]))
|
||||||
|
|
||||||
const subActorId = partenaire?.actor.id;
|
|
||||||
if (amoureux.perteCoeur) {
|
if (amoureux.perteCoeur) {
|
||||||
ui.notifications.warn(`Un point de coeur a déjà été perdu`)
|
ui.notifications.warn(`Le point de cœur a déjà été perdu`)
|
||||||
}
|
}
|
||||||
else if (amoureux.coeur > 0) {
|
else if (amoureux.coeur > 0) {
|
||||||
const actor = game.actors.get(actorId)
|
const actor = game.actors.get(actorId)
|
||||||
if (actor.isOwner) {
|
if (actor.isOwner) {
|
||||||
await actor.setPointsCoeur(subActorId, amoureux.coeur - 1)
|
await actor.setPointsCoeur(partenaire?.actor.id, amoureux.coeur - 1, { immediat: true })
|
||||||
amoureux.perteCoeur = true
|
amoureux.perteCoeur = true
|
||||||
RdDCoeur.addTagsInfoCoeur(infoCoeur)
|
RdDCoeur.addTagsInfoCoeur(infoCoeur)
|
||||||
}
|
}
|
||||||
|
@ -205,6 +205,7 @@ export class RdDUtility {
|
|||||||
'systems/foundryvtt-reve-de-dragon/templates/enum-tmr-type.html',
|
'systems/foundryvtt-reve-de-dragon/templates/enum-tmr-type.html',
|
||||||
// Partials
|
// Partials
|
||||||
'systems/foundryvtt-reve-de-dragon/templates/coeur/chat-effet-tendre-moment.hbs',
|
'systems/foundryvtt-reve-de-dragon/templates/coeur/chat-effet-tendre-moment.hbs',
|
||||||
|
'systems/foundryvtt-reve-de-dragon/templates/coeur/afficher-coeur.hbs',
|
||||||
'systems/foundryvtt-reve-de-dragon/templates/tirage/liste-resultats-recherche.hbs',
|
'systems/foundryvtt-reve-de-dragon/templates/tirage/liste-resultats-recherche.hbs',
|
||||||
'systems/foundryvtt-reve-de-dragon/templates/time/horloge.hbs',
|
'systems/foundryvtt-reve-de-dragon/templates/time/horloge.hbs',
|
||||||
'systems/foundryvtt-reve-de-dragon/templates/common/timestamp.hbs',
|
'systems/foundryvtt-reve-de-dragon/templates/common/timestamp.hbs',
|
||||||
|
@ -83,7 +83,7 @@ export const referenceAjustements = {
|
|||||||
coeur: {
|
coeur: {
|
||||||
isVisible: (rollData, actor) => actor.isPersonnage() && RdDCarac.isVolonte(rollData.selectedCarac),
|
isVisible: (rollData, actor) => actor.isPersonnage() && RdDCarac.isVolonte(rollData.selectedCarac),
|
||||||
isUsed: (rollData, actor) => rollData.use.coeur != undefined,
|
isUsed: (rollData, actor) => rollData.use.coeur != undefined,
|
||||||
getLabel: (rollData, actor) => 'Ajustement de coeur',
|
getLabel: (rollData, actor) => 'Ajustement de cœur',
|
||||||
getValue: (rollData, actor) => -2 * (rollData.use.coeur?.coeur ?? 0)
|
getValue: (rollData, actor) => -2 * (rollData.use.coeur?.coeur ?? 0)
|
||||||
},
|
},
|
||||||
moralTotal: {
|
moralTotal: {
|
||||||
|
@ -11,10 +11,10 @@
|
|||||||
<span></span>
|
<span></span>
|
||||||
{{else}}
|
{{else}}
|
||||||
<span class="competence-title subacteur-coeur-toggle">
|
<span class="competence-title subacteur-coeur-toggle">
|
||||||
<a data-coeur-nombre="1"><i class="{{#if (gte suivant.coeur 1)}}fa-solid{{else}}fa-regular{{/if}} fa-heart"></i></a>
|
{{>'systems/foundryvtt-reve-de-dragon/templates/coeur/afficher-coeur.hbs' numero=1 courant=suivant.coeur prochain=suivant.prochainCoeur}}
|
||||||
<a data-coeur-nombre="2"><i class="{{#if (gte suivant.coeur 2)}}fa-solid{{else}}fa-regular{{/if}} fa-heart"></i></a>
|
{{>'systems/foundryvtt-reve-de-dragon/templates/coeur/afficher-coeur.hbs' numero=2 courant=suivant.coeur prochain=suivant.prochainCoeur}}
|
||||||
<a data-coeur-nombre="3"><i class="{{#if (gte suivant.coeur 3)}}fa-solid{{else}}fa-regular{{/if}} fa-heart"></i></a>
|
{{>'systems/foundryvtt-reve-de-dragon/templates/coeur/afficher-coeur.hbs' numero=3 courant=suivant.coeur prochain=suivant.prochainCoeur}}
|
||||||
<a data-coeur-nombre="4"><i class="{{#if (gte suivant.coeur 4)}}fa-solid{{else}}fa-regular{{/if}} fa-heart"></i></a>
|
{{>'systems/foundryvtt-reve-de-dragon/templates/coeur/afficher-coeur.hbs' numero=4 courant=suivant.coeur prochain=suivant.prochainCoeur}}
|
||||||
</span>
|
</span>
|
||||||
<span class="competence-title subacteur-label">
|
<span class="competence-title subacteur-label">
|
||||||
{{#if (gte suivant.coeur 1)}}
|
{{#if (gte suivant.coeur 1)}}
|
||||||
|
12
templates/coeur/afficher-coeur.hbs
Normal file
12
templates/coeur/afficher-coeur.hbs
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
{{log 'Cœur' numero courant prochain}}
|
||||||
|
<a data-numero-coeur="{{numero}}">
|
||||||
|
{{#if (and (lte numero courant) (lte numero prochain))}}
|
||||||
|
<i class="fa-solid fa-heart"></i>
|
||||||
|
{{else if (and (lte numero courant) (gt numero prochain))}}
|
||||||
|
<i class="fa-solid fa-heart-crack"></i>
|
||||||
|
{{else if (and (gt numero courant) (lte numero prochain))}}
|
||||||
|
<i class="fa-solid fa-hand-holding-heart"></i>
|
||||||
|
{{else if (and (gt numero courant) (gt numero prochain))}}
|
||||||
|
<i class="fa-regular fa-heart"></i>
|
||||||
|
{{/if}}
|
||||||
|
</a>
|
@ -4,7 +4,7 @@
|
|||||||
{{#if (gt gainMoral 0)}}a apprécié ce tendre moment et gagné du moral
|
{{#if (gt gainMoral 0)}}a apprécié ce tendre moment et gagné du moral
|
||||||
{{else}}n'a pas gagné de moral{{#if (gte coeur 1)}} et peut
|
{{else}}n'a pas gagné de moral{{#if (gte coeur 1)}} et peut
|
||||||
<span class="chat-card-button-area">
|
<span class="chat-card-button-area">
|
||||||
<a class="perdre-point-coeur-douceur chat-card-button" data-actor-id="{{actor.id}}">perdre un point de coeur</a>
|
<a class="perdre-point-coeur-douceur chat-card-button" data-actor-id="{{actor.id}}">perdre un point de cœur</a>
|
||||||
</span>
|
</span>
|
||||||
{{/if}}.
|
{{/if}}.
|
||||||
{{/if}}
|
{{/if}}
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
<div class="flexrow utilisation-coeur">
|
<div class="flexrow utilisation-coeur">
|
||||||
<label class="">Ajustement de Coeur</label>
|
<label class="">Ajustement de Cœur</label>
|
||||||
<div class="select-suivant">
|
<div class="select-suivant">
|
||||||
<img class="sheet-competence-img selected-suivant-coeur" src="{{use.coeur.img}}" title="{{use.coeur.name}}" />
|
<img class="sheet-competence-img selected-suivant-coeur" src="{{use.coeur.img}}" title="{{use.coeur.name}}" />
|
||||||
<select name="select-suivant-coeur" class="select-suivant-coeur" data-dtype="String">
|
<select name="select-suivant-coeur" class="select-suivant-coeur" data-dtype="String">
|
||||||
|
Loading…
Reference in New Issue
Block a user