From 7eb1318f555491aa5af5faccf9cf5cc31d5dcb05 Mon Sep 17 00:00:00 2001 From: myryos Date: Tue, 12 May 2026 18:43:59 +0200 Subject: [PATCH] V0.02, feature: sendMessageMoves.js completed --- Taverne Ecarlate/macros/aiderFailure.js | 23 ++++++ Taverne Ecarlate/macros/aiderFullSuccess.js | 26 ++++++ .../macros/aiderPartialSuccess.js | 27 +++++++ Taverne Ecarlate/macros/sendMessage.js | 8 ++ Taverne Ecarlate/macros/sendMessageMoves.js | 81 +++++++++++++++++++ Taverne Ecarlate/roll_moves.js | 38 +++------ 6 files changed, 176 insertions(+), 27 deletions(-) create mode 100644 Taverne Ecarlate/macros/aiderFailure.js create mode 100644 Taverne Ecarlate/macros/aiderFullSuccess.js create mode 100644 Taverne Ecarlate/macros/aiderPartialSuccess.js create mode 100644 Taverne Ecarlate/macros/sendMessage.js create mode 100644 Taverne Ecarlate/macros/sendMessageMoves.js diff --git a/Taverne Ecarlate/macros/aiderFailure.js b/Taverne Ecarlate/macros/aiderFailure.js new file mode 100644 index 0000000..3fc0f1d --- /dev/null +++ b/Taverne Ecarlate/macros/aiderFailure.js @@ -0,0 +1,23 @@ +const _name = name +const _roll = roll +const _threshold = threshold +const _desc = "Sur un échec : échec. Le MJ ajoute une surprise négative et tu ne peux plus aider pendant la scène. De plus tu imposes un malus de 5 à la personne aidée." + +const couleur = "#E24B4A"; + +const content = `
+
Réussite partielle — ${_name}
+
◈ Réussite partielle
+
+ Seuil : ${_threshold} + Résultat : ${_roll} +
+
${_desc}
+
` + +ChatMessage.create({ + content: content, + speaker: ChatMessage.getSpeaker(), + style:CONST.CHAT_MESSAGE_STYLES.OTHER, + whisper: [], +}) \ No newline at end of file diff --git a/Taverne Ecarlate/macros/aiderFullSuccess.js b/Taverne Ecarlate/macros/aiderFullSuccess.js new file mode 100644 index 0000000..e4d7295 --- /dev/null +++ b/Taverne Ecarlate/macros/aiderFullSuccess.js @@ -0,0 +1,26 @@ +const _name = name +const _roll = roll +const _threshold = threshold +const _desc = `Sur une réussite complète : votre aide est précieuse. Choisissez 2 options (vous ne pouvez pas prendre 2 fois la même) : +Vous offrez un bonus de 10 +Vous accélérer l’action réalisée +Le MJ donne une surprise bénéfique en cas de réussite` + +const couleur = "#1D9E75"; + +const content = `
+
Réussite partielle — ${_name}
+
◈ Réussite partielle
+
+ Seuil : ${_threshold} + Résultat : ${_roll} +
+
${_desc}
+
` + +ChatMessage.create({ + content: content, + speaker: ChatMessage.getSpeaker(), + style:CONST.CHAT_MESSAGE_STYLES.OTHER, + whisper: [], +}) \ No newline at end of file diff --git a/Taverne Ecarlate/macros/aiderPartialSuccess.js b/Taverne Ecarlate/macros/aiderPartialSuccess.js new file mode 100644 index 0000000..8652cf8 --- /dev/null +++ b/Taverne Ecarlate/macros/aiderPartialSuccess.js @@ -0,0 +1,27 @@ +const _name = name +const _roll = roll +const _threshold = threshold +const _desc = `Sur une réussite partielle : votre aide est utile. Choisissez 1 option : +Vous offrez un bonus de 10 +Vous accélérer l’action réalisée +Le MJ donne une surprise bénéfique en cas de réussite` + +const couleur = "#EF9F27"; + +const content = `
+
Réussite partielle — ${_name}
+
◈ Réussite partielle
+
+ Seuil : ${_threshold} + Résultat : ${_roll} +
+
${_desc}
+
`; + + +ChatMessage.create({ + content: content, + speaker: ChatMessage.getSpeaker(), + style:CONST.CHAT_MESSAGE_STYLES.OTHER, + whisper: [], +}) \ No newline at end of file diff --git a/Taverne Ecarlate/macros/sendMessage.js b/Taverne Ecarlate/macros/sendMessage.js new file mode 100644 index 0000000..6c99b15 --- /dev/null +++ b/Taverne Ecarlate/macros/sendMessage.js @@ -0,0 +1,8 @@ +const _content = content +console.log(_content) +await ChatMessage.create({ + content: _content, + speaker: ChatMessage.getSpeaker(), + whisper: [], + style:CONST.CHAT_MESSAGE_STYLES.OTHER, +}) \ No newline at end of file diff --git a/Taverne Ecarlate/macros/sendMessageMoves.js b/Taverne Ecarlate/macros/sendMessageMoves.js new file mode 100644 index 0000000..6f837dd --- /dev/null +++ b/Taverne Ecarlate/macros/sendMessageMoves.js @@ -0,0 +1,81 @@ +const toCamelCase = (str) => str + .trim() + .normalize("NFD") + .replace(/[\u0300-\u036f]/g, "") + .replace(/[^a-zA-Z0-9 ]/g, "") + .split(' ') + .filter(word => word.length > 0) + .map((word, i) => i === 0 + ? word.toLowerCase() + : word.charAt(0).toUpperCase() + word.slice(1).toLowerCase() + ) + .join('') +const _name = toCamelCase(name) +const map = new Map([["aider", { + FullSuccess: "Sur une réussite complète : votre aide est précieuse. Choisissez 2 options (vous ne pouvez pas prendre 2 fois la même) : Vous offrez un bonus de 10 ; Vous accélérer l’action réalisée ; Le MJ donne une surprise bénéfique en cas de réussite", + PartialSuccess: "Sur une réussite partielle : votre aide est utile. Choisissez 1 option : Vous offrez un bonus de 10 ; Vous accélérer l’action réalisée ; Le MJ donne une surprise bénéfique en cas de réussite", + Failure: "Sur un échec : échec. Le MJ ajoutes une surprise négative et tu ne peux plus aider pendant la scène. De plus tu imposes un malus de 5 à la personne aidée." +}],["agirDansLombre", { + FullSuccess: "Sur une réussite complète : vous agissez sans laisser aucune trace. Personne ne vous a vu, entendu ou suspecté.", + PartialSuccess: "Sur une réussite partielle : vous réussissez mais quelque chose accroche. Choisissez 1 option : Vous êtes passé de justesse : quelqu'un a failli vous repérer. Il s'en souvient et reste méfiant ; Vous laissez une trace ou un indice derrière vous que quelqu'un pourrait retrouver plus tard ; Vous réussissez mais perdez du temps : la situation a évolué pendant ce temps ; Vous devez sacrifier quelque chose (un objet, une opportunité) pour rester dans l'ombre ; Vous subissez un malus de 5 sur votre prochaine manœuvre dans la scène", + Failure: "Sur un échec : vous êtes repéré ou votre action est découverte. Le MJ décide des conséquences et de qui l'apprend." +}],["boireDuSang", { + FullSuccess: "Sur une réussite complète : vous buvez librement. Gagnez 2 point de sang et choisissez 2 option bonus (vous pouvez prendre 2 fois la même) : Gagnez 1 point de sang ; Vous soignez 1 blessure ; La cible ne garde aucun souvenir de l'événement ; La cible ne meurt pas ; Tu déplaces la jauge Volonté/Bête de un cran dans la direction souhaité ; Réduire l'éveil de la Bête de 1", + PartialSuccess: "Sur une réussite partielle : vous buvez mais cela a un coût. Gagnez 2 point de sang et choisissez 1 option : Gagnez 1 point de sang ; Vous soignez 1 blessure ; La cible ne garde aucun souvenir de l'événement ; La cible ne meurt pas ; Tu déplaces la jauge Volonté/Bête de un cran dans la direction souhaité ; Réduire l'éveil de la Bête de 1", + Failure: "Sur un échec : vous buvez 1 point de sang mais perdez le contrôle. La jauge Volonté/Bête se déplace d'un cran vers la Bête et le MJ décide des conséquences." +}],["discuter", { + FullSuccess: "Sur une réussite complète : la personne accepte, vous croit ou est intimidée.", + PartialSuccess: "Sur une réussite partielle : la personne accepte, vous croit ou est intimidée mais le MJ choisit 1 option au choix : Il y a des complications ; La cible a des exigences en retour ; La cible gagne un bonus de 5 à sa prochaine manœuvre contre vous ; Elle n'est convaincue que temporairement ; Quelqu'un d'autre remarque votre tentative d'influence", + Failure: "Sur un échec : échec. Le MJ décide de l’issue." +}],["faireMarcherLesMuscles", { + FullSuccess: "Sur une réussite complète : vous réussissez haut la main ce que vous entreprenez dans un temps record.", + PartialSuccess: "Sur une réussite partielle : vous réussissez mais choisissez 1 option : Vous subissez une blessure ou un contrecoup physique ; Votre action prends du temps à être réalisée ; La qualité laisse à désirer ; Vous avez besoin de l’aide de quelqu’un pour terminer ; Vous obtenez un malus de 5 sur votre prochaine manœuvre dans la scène", + Failure: "Sur un échec : échec. Le MJ décide de l’issue." +}],["observerLaScene", { + FullSuccess: "Sur une réussite complète : posez 2 question au MJ. Il vous réponds honnêtement même si la question est hors-sujet.", + PartialSuccess: "Sur une réussite partielle : posez une question au MJ et choisissez une option : Vous attirez l'attention ; Vous apprenez en plus 2 informations dont l’une est sans doute fausse ; La réponse manques de précision ; Votre observation prends du temps ; Vous subissez un malus de 5 sur votre prochaine manœuvre dans la scène", + Failure: "Sur un échec : échec. Le MJ décide de l’issue." +}],["seControler", { + FullSuccess: "Sur une réussite complète : vous tenez bon complètement. La pulsion est repoussée et vous agissez librement. Choisissez 1 options : La jauge Volonté/Bête peut se déplacer d’un cran dans vers la Volonté ; Réduisez l'Eveil de la Bête de 1", + PartialSuccess: "Sur une réussite partielle : vous résistez mais cela vous coûte quelque chose. Choisissez 1 option possible de la reussite et une autre de la liste suivante (certaine ne peuvent etre choisi en fonction de votre premier choix) : La jauge Volonté/Bête se déplace d'un cran vers la Bête ; Augmentez l'Eveil de la Bête de 1 ; Vous cédez partiellement à la pulsion avant de reprendre le contrôle. Le MJ décrit ce qui se passe ; Vous subissez un malus de 10 sur votre prochaine manœuvre, épuisé par l'effort ; Vous avez besoin d'un ancrage extérieur (une personne, un objet, un lieu) pour tenir : sans lui, c'est un échec", + Failure: "Sur un échec : la Bête ou la pulsion prend le dessus. La jauge se déplace d'un cran vers la Bête ou vous prenez un éveil de la Bête et le MJ décrit brièvement comment votre personnage perd le contrôle." +}],]) + +const labels = { + "FullSuccess": "Réussite complète", + "PartialSuccess": "Réussite partielle", + "Failure": "Échec" +}; + + +const colors = { + "FullSuccess": "#3fb950", + "PartialSuccess": "#d29922", + "Failure": "#f85149" +}; + + +const _type = labels[resultType]; +const _couleur = colors[resultType]; +const _desc = map.get(_name)?.[resultType] ?? "Description introuvable"; +const _threshold = threshold +const _roll = roll + +console.log(_couleur) + +content = '
' + + '
' + _type + ' — ' + name + '
' + + '
◈ ' + _type + '
' + + '
' + + 'Seuil : ' + threshold + '' + + 'Résultat : ' + roll + '' + + '
' + + '
' + _desc + '
' + + '
' +console.log(content) +await ChatMessage.create({ + content: content, + speaker: ChatMessage.getSpeaker(), + whisper: [], + style:CONST.CHAT_MESSAGE_STYLES.OTHER, +}) \ No newline at end of file diff --git a/Taverne Ecarlate/roll_moves.js b/Taverne Ecarlate/roll_moves.js index ac00eee..9eeebae 100644 --- a/Taverne Ecarlate/roll_moves.js +++ b/Taverne Ecarlate/roll_moves.js @@ -5,7 +5,6 @@ localVars.statToSelect = ${sameRow('movesAttribute')}$ localVars.mod = +${?{Modificateur|0}}$ localVars.roll = ${[1d100]}$ - console.log(entity.system.props.movesTable[indexRow]) localVars.moveName = entity.system.props.movesTable[indexRow].nameMoves @@ -31,30 +30,15 @@ localVars.isPartialSuccess = localVars.roll <= localVars.partialSuccessThreshold localVars.isFailure = localVars.roll > localVars.partialSuccessThreshold; -const preffix = '

' + localVars.moveName + '

'; +let resultType = "" +if (localVars.isFullSuccess) resultType = "FullSuccess" +else if (localVars.isPartialSuccess) resultType = "PartialSuccess" +else if (localVars.isFailure) resultType = "Failure" -const comparator = '

Seuil de réussite complète :
' -+ localVars.stat + ' (attribut) + ' -+ localVars.mod + ' (mod.) - 30 = ' + localVars.fullSuccessThreshold + '

' -+ '

Seuil de réussite partielle :
' -+ localVars.stat + ' (attribut) + ' -+ localVars.mod + ' (mod.) = ' + localVars.partialSuccessThreshold + '

'; - -if (localVars.isFullSuccess) { - return preffix + '

Réussite Totale

' - + '

Vous avez réussi votre action de manière exceptionnelle !

' - + '

' + localVars.roll + ' <= ' + localVars.fullSuccessThreshold + '

' + comparator; -} - -else if (localVars.isPartialSuccess) { - return preffix + '

Réussite Partielle

' - + '

Vous avez réussi votre action, mais avec quelques complications.

' - + '

' + localVars.roll + ' <= ' + localVars.partialSuccessThreshold + '

' + comparator; -} - -else if (localVars.isFailure) { - return preffix + '

Échec

' - + '

Vous avez échoué votre action.

' - + '

' + localVars.roll + ' > ' + localVars.partialSuccessThreshold + '

' + comparator; -} -}% +await game.macros.getName("sendMessageMoves").execute({ + name: localVars.moveName, + resultType: resultType, + roll: localVars.roll, + threshold: localVars.fullSuccessThreshold +}) +}% \ No newline at end of file