Vincent Vandemeulebrouck
582df7e290
Les messages dans les TMRs sont envoyés au GM Simplification des messages de tchat liés à un actor: on peut utiliser les Owners (car les GMs sont owner). Au lieu de passer le name de l'Actor (qui peut être incorrect si deux actors ont le même, mais pas les mêmes propriétaires), on passe directement l'actor pour déterminer mles destinataires de messages
169 lines
6.4 KiB
JavaScript
169 lines
6.4 KiB
JavaScript
import { RdDBaseActor } from "../actor/base-actor.js";
|
|
import { ChatUtility } from "../chat-utility.js";
|
|
import { ReglesOptionnelles } from "../settings/regles-optionnelles.js";
|
|
|
|
const INFO_COEUR = 'info-coeur';
|
|
|
|
export class RdDCoeur {
|
|
static registerChatCallbacks(html) {
|
|
html.on("click", 'a.accepter-tendre-moment', event => {
|
|
RdDCoeur.accepterTendreMoment(RdDCoeur.extractInfoCoeur(event))
|
|
})
|
|
html.on("click", 'a.refuser-tendre-moment', event => {
|
|
RdDCoeur.refuserTendreMoment(RdDCoeur.extractInfoCoeur(event))
|
|
})
|
|
html.on("click", 'a.perdre-point-coeur-douceur', event => {
|
|
RdDCoeur.perdreEnDouceur(
|
|
RdDCoeur.extractInfoCoeur(event),
|
|
event.currentTarget.attributes['data-actor-id'].value)
|
|
})
|
|
}
|
|
|
|
static addTagsInfoCoeur(infoCoeur, chatMessage = undefined) {
|
|
if (chatMessage) {
|
|
infoCoeur.chatMessageId = chatMessage.id
|
|
}
|
|
else {
|
|
chatMessage = game.messages.get(infoCoeur.chatMessageId)
|
|
}
|
|
ChatUtility.setMessageData(chatMessage, INFO_COEUR, infoCoeur);
|
|
}
|
|
|
|
static extractInfoCoeur(event) {
|
|
const chatMesage = ChatUtility.getChatMessage(event);
|
|
return ChatUtility.getMessageData(chatMesage, INFO_COEUR)
|
|
}
|
|
|
|
static getInfoCoeur(sourceActorId, targetActorId) {
|
|
const sourceActor = game.actors.get(sourceActorId)
|
|
const targetActor = game.actors.get(targetActorId)
|
|
if (sourceActor && targetActor) {
|
|
return {
|
|
source: {
|
|
actor: RdDBaseActor.extractActorMin(sourceActor),
|
|
coeur: sourceActor.getPointsCoeur(targetActorId),
|
|
},
|
|
target: {
|
|
actor: RdDBaseActor.extractActorMin(targetActor),
|
|
coeur: targetActor.getPointsCoeur(sourceActorId),
|
|
}
|
|
}
|
|
}
|
|
return {}
|
|
}
|
|
|
|
static async toggleSubActeurCoeur(actorId, subActorId, toggleCoeur) {
|
|
const actor = game.actors.get(actorId)
|
|
const amoureux = actor.getSuivant(subActorId)
|
|
if (toggleCoeur <= amoureux.coeur) {
|
|
if (toggleCoeur > amoureux.prochainCoeur) {
|
|
toggleCoeur = amoureux.coeur
|
|
}
|
|
else {
|
|
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 = foundry.utils.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 });
|
|
}
|
|
}
|
|
|
|
static async startSubActeurTendreMoment(actorId, subActeurId) {
|
|
const infoCoeur = RdDCoeur.getInfoCoeur(actorId, subActeurId)
|
|
if (infoCoeur.target?.actor?.id) {
|
|
// TODO: passer par une fenêtre pour saisir sa proposition (lieu, heure, ...)
|
|
const chatMessage = await ChatMessage.create({
|
|
whisper: ChatUtility.getOwners(infoCoeur.target.actor),
|
|
content: await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/coeur/chat-proposer-tendre-moment.hbs`, infoCoeur)
|
|
})
|
|
RdDCoeur.addTagsInfoCoeur(infoCoeur, chatMessage)
|
|
}
|
|
}
|
|
|
|
static async accepterTendreMoment(infoCoeur) {
|
|
const target = game.actors.get(infoCoeur.target.actor.id)
|
|
if (!target.isOwner) {
|
|
ui.notifications.warn(`vous ne pouvez pas accepter pour ${infoCoeur.target.actor.name}`)
|
|
return
|
|
}
|
|
ChatUtility.removeChatMessageId(infoCoeur.chatMessageId)
|
|
|
|
infoCoeur.target.jetTendre = (await (new Roll('1d6').evaluate())).total
|
|
infoCoeur.source.jetTendre = (await (new Roll('1d6').evaluate())).total
|
|
const diff = Math.abs(infoCoeur.source.jetTendre - infoCoeur.target.jetTendre)
|
|
for (let amoureux of [infoCoeur.source, infoCoeur.target]) {
|
|
const actorAmoureux = game.actors.get(amoureux.actor.id);
|
|
amoureux.situation = diff <= amoureux.coeur ? 'heureux' : 'neutre'
|
|
amoureux.gainMoral = await actorAmoureux.jetDeMoral(amoureux.situation)
|
|
}
|
|
const chatHtml = await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/coeur/chat-accepter-tendre-moment.hbs`, infoCoeur)
|
|
const chatMessage = await ChatMessage.create({
|
|
whisper: ChatUtility.getMultipleActorsOwners(infoCoeur.source?.actor, infoCoeur.target?.actor),
|
|
content: chatHtml
|
|
})
|
|
RdDCoeur.addTagsInfoCoeur(infoCoeur, chatMessage)
|
|
}
|
|
|
|
static async refuserTendreMoment(infoCoeur) {
|
|
const target = game.actors.get(infoCoeur.target.actor.id)
|
|
if (!target.isOwner) {
|
|
ui.notifications.warn(`vous ne pouvez pas refuser pour ${infoCoeur.target.actor.name}`)
|
|
return
|
|
}
|
|
ChatUtility.removeChatMessageId(infoCoeur.chatMessageId)
|
|
const chatHtml = await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/coeur/chat-refuser-tendre-moment.hbs`, infoCoeur)
|
|
await ChatMessage.create({
|
|
whisper: ChatUtility.getMultipleActorsOwners(infoCoeur.source?.actor, infoCoeur.target?.actor),
|
|
content: chatHtml
|
|
});
|
|
}
|
|
|
|
static async perdreEnDouceur(infoCoeur, actorId) {
|
|
const [amoureux, partenaire] = (infoCoeur.source.actor.id == actorId
|
|
? [infoCoeur.source, infoCoeur.target]
|
|
: (infoCoeur.target.actor.id == actorId
|
|
? [infoCoeur.target, infoCoeur.source]
|
|
: [undefined, undefined]))
|
|
|
|
if (amoureux.perteCoeur) {
|
|
ui.notifications.warn(`Le point de cœur a déjà été perdu`)
|
|
}
|
|
else if (amoureux.coeur > 0) {
|
|
const actor = game.actors.get(actorId)
|
|
if (actor.isOwner) {
|
|
await actor.setPointsCoeur(partenaire?.actor.id, amoureux.coeur - 1, { immediat: true })
|
|
amoureux.perteCoeur = true
|
|
RdDCoeur.addTagsInfoCoeur(infoCoeur)
|
|
}
|
|
}
|
|
}
|
|
} |