From 9e4d76298c5a957ed0e3edc404c736337b66b728 Mon Sep 17 00:00:00 2001 From: LeRatierBretonnien Date: Sun, 15 Jun 2025 00:30:24 +0200 Subject: [PATCH] Manage selective fire --- css/fvtt-cthulhu-eternal.css | 137 +++++++++++++-- cthulhu-eternal.mjs | 10 +- lang/en.json | 50 +++++- lang/fr.json | 52 +++++- .../applications/sheets/protagonist-sheet.mjs | 8 +- module/applications/sheets/weapon-sheet.mjs | 9 + module/documents/actor.mjs | 1 - module/documents/roll.mjs | 156 +++++++++++++----- module/models/protagonist.mjs | 50 +++++- module/models/skill.mjs | 6 +- module/models/weapon.mjs | 12 ++ module/utils.mjs | 26 +++ .../rituals/{000083.log => 000132.log} | 0 packs-system/rituals/CURRENT | 2 +- packs-system/rituals/LOG | 10 +- packs-system/rituals/LOG.old | 14 +- .../{MANIFEST-000081 => MANIFEST-000131} | Bin 169 -> 156 bytes .../skills/{000244.ldb => 000277.ldb} | Bin 318789 -> 320457 bytes .../skills/{000251.log => 000301.log} | 0 packs-system/skills/CURRENT | 2 +- packs-system/skills/LOG | 10 +- packs-system/skills/LOG.old | 14 +- packs-system/skills/MANIFEST-000249 | Bin 178 -> 0 bytes packs-system/skills/MANIFEST-000300 | Bin 0 -> 160 bytes styles/chat.less | 2 +- styles/global.less | 23 +++ styles/mixins.less | 38 ++++- styles/protagonist.less | 3 - styles/roll.less | 5 + templates/chat-lethal-damage.hbs | 31 ++++ templates/chat-message.hbs | 36 +++- templates/chat-regular-damage.hbs | 20 +++ templates/protagonist-main.hbs | 25 ++- templates/skill.hbs | 8 + templates/weapon.hbs | 16 +- 35 files changed, 654 insertions(+), 122 deletions(-) rename packs-system/rituals/{000083.log => 000132.log} (100%) rename packs-system/rituals/{MANIFEST-000081 => MANIFEST-000131} (75%) rename packs-system/skills/{000244.ldb => 000277.ldb} (75%) rename packs-system/skills/{000251.log => 000301.log} (100%) delete mode 100644 packs-system/skills/MANIFEST-000249 create mode 100644 packs-system/skills/MANIFEST-000300 create mode 100644 templates/chat-lethal-damage.hbs create mode 100644 templates/chat-regular-damage.hbs diff --git a/css/fvtt-cthulhu-eternal.css b/css/fvtt-cthulhu-eternal.css index 5f5e982..82f2a94 100644 --- a/css/fvtt-cthulhu-eternal.css +++ b/css/fvtt-cthulhu-eternal.css @@ -170,10 +170,62 @@ i.fvtt-cthulhu-eternal { background-position: 0%; background-size: 100% 100%; } +.chat-lethal-damage ul { + list-style-type: none; + padding: 0; + margin: 0; + justify-content: center; + align-items: center; +} +.chat-lethal-damage ul .result-lethal { + color: var(--color-critical-failure); + font-family: var(--font-title); +} +.chat-lethal-damage ul .result-non-lethal { + color: var(--color-failure); + font-family: var(--font-title); +} +.chat-lethal-damage ul li { + margin: 0 10px; + font-family: var(--font-primary); + font-size: calc(var(--font-size-standard) * 1.02); +} .fvtt-cthulhu-eternal .protagonist-sheet-common label { font-family: var(--font-secondary); font-size: calc(var(--font-size-standard) * 1); } +.fvtt-cthulhu-eternal .protagonist-sheet-common .hp-unconscious { + font-family: var(--font-secondary); + font-size: calc(var(--font-size-standard) * 1); + color: #b4710c; +} +.fvtt-cthulhu-eternal .protagonist-sheet-common .hp-dead { + font-family: var(--font-secondary); + font-size: calc(var(--font-size-standard) * 1); + color: #b40000; +} +.fvtt-cthulhu-eternal .protagonist-sheet-common .protagonist-luck { + display: flex; + min-width: 8rem; + max-width: 8rem; +} +.fvtt-cthulhu-eternal .protagonist-sheet-common .protagonist-luck .rollable:hover, +.fvtt-cthulhu-eternal .protagonist-sheet-common .protagonist-luck .rollable:focus { + text-shadow: 0 0 8px var(--color-shadow-primary); + cursor: pointer; + font-size: 0.9rem; +} +.fvtt-cthulhu-eternal .protagonist-sheet-common .damage-bonus { + display: flex; +} +.fvtt-cthulhu-eternal .protagonist-sheet-common .damage-bonus label { + max-width: 5rem; + min-width: 5rem; +} +.fvtt-cthulhu-eternal .protagonist-sheet-common .damage-bonus input { + max-width: 2rem; + min-width: 2rem; +} .fvtt-cthulhu-eternal .vehicle-sheet-common label { font-family: var(--font-secondary); font-size: calc(var(--font-size-standard) * 1); @@ -203,6 +255,7 @@ i.fvtt-cthulhu-eternal { background-image: var(--background-image-base); background-repeat: no-repeat; background-size: 100% 100%; + --input-height: 1.4rem; overflow: scroll; } .fvtt-cthulhu-eternal .protagonist-content .sheet-tabs a { @@ -250,7 +303,7 @@ i.fvtt-cthulhu-eternal { } .fvtt-cthulhu-eternal .protagonist-content legend { font-family: var(--font-secondary); - font-size: calc(var(--font-size-standard) * 1.2); + font-size: calc(var(--font-size-standard) * 1.1); font-weight: bold; letter-spacing: 1px; } @@ -258,6 +311,38 @@ i.fvtt-cthulhu-eternal { font-family: var(--font-secondary); font-size: calc(var(--font-size-standard) * 1); } +.fvtt-cthulhu-eternal .protagonist-content .hp-unconscious { + font-family: var(--font-secondary); + font-size: calc(var(--font-size-standard) * 1); + color: #b4710c; +} +.fvtt-cthulhu-eternal .protagonist-content .hp-dead { + font-family: var(--font-secondary); + font-size: calc(var(--font-size-standard) * 1); + color: #b40000; +} +.fvtt-cthulhu-eternal .protagonist-content .protagonist-luck { + display: flex; + min-width: 8rem; + max-width: 8rem; +} +.fvtt-cthulhu-eternal .protagonist-content .protagonist-luck .rollable:hover, +.fvtt-cthulhu-eternal .protagonist-content .protagonist-luck .rollable:focus { + text-shadow: 0 0 8px var(--color-shadow-primary); + cursor: pointer; + font-size: 0.9rem; +} +.fvtt-cthulhu-eternal .protagonist-content .damage-bonus { + display: flex; +} +.fvtt-cthulhu-eternal .protagonist-content .damage-bonus label { + max-width: 5rem; + min-width: 5rem; +} +.fvtt-cthulhu-eternal .protagonist-content .damage-bonus input { + max-width: 2rem; + min-width: 2rem; +} .fvtt-cthulhu-eternal .sheet-tabs { background-color: var(--color-light-1); } @@ -295,9 +380,6 @@ i.fvtt-cthulhu-eternal { width: 2rem; margin-left: 4px; } -.fvtt-cthulhu-eternal .protagonist-main .protagonist-pc .protagonist-left .protagonist-hp .damage-bonus { - font-size: calc(var(--font-size-standard) * 0.8); -} .fvtt-cthulhu-eternal .protagonist-main .protagonist-pc .protagonist-left .protagonist-hp .hp-separator { font-size: calc(var(--font-size-standard) * 1.2); display: flex; @@ -867,6 +949,7 @@ i.fvtt-cthulhu-eternal { background-image: var(--background-image-base); background-repeat: no-repeat; background-size: 100% 100%; + --input-height: 1.4rem; overflow: scroll; } .fvtt-cthulhu-eternal .vehicle-content .sheet-tabs a { @@ -914,7 +997,7 @@ i.fvtt-cthulhu-eternal { } .fvtt-cthulhu-eternal .vehicle-content legend { font-family: var(--font-secondary); - font-size: calc(var(--font-size-standard) * 1.2); + font-size: calc(var(--font-size-standard) * 1.1); font-weight: bold; letter-spacing: 1px; } @@ -1124,6 +1207,7 @@ i.fvtt-cthulhu-eternal { background-image: var(--background-image-base); background-repeat: no-repeat; background-size: 100% 100%; + --input-height: 1.4rem; overflow: scroll; } .fvtt-cthulhu-eternal .creature-content .sheet-tabs a { @@ -1171,7 +1255,7 @@ i.fvtt-cthulhu-eternal { } .fvtt-cthulhu-eternal .creature-content legend { font-family: var(--font-secondary); - font-size: calc(var(--font-size-standard) * 1.2); + font-size: calc(var(--font-size-standard) * 1.1); font-weight: bold; letter-spacing: 1px; } @@ -1782,6 +1866,7 @@ i.fvtt-cthulhu-eternal { background-image: var(--background-image-base); background-repeat: no-repeat; background-size: 100% 100%; + --input-height: 1.4rem; } .fvtt-cthulhu-eternal .skill-content .sheet-tabs a { color: rgba(32, 31, 31, 0.8); @@ -1828,7 +1913,7 @@ i.fvtt-cthulhu-eternal { } .fvtt-cthulhu-eternal .skill-content legend { font-family: var(--font-secondary); - font-size: calc(var(--font-size-standard) * 1.2); + font-size: calc(var(--font-size-standard) * 1.1); font-weight: bold; letter-spacing: 1px; } @@ -1876,6 +1961,7 @@ i.fvtt-cthulhu-eternal { background-image: var(--background-image-base); background-repeat: no-repeat; background-size: 100% 100%; + --input-height: 1.4rem; } .fvtt-cthulhu-eternal .injury-content .sheet-tabs a { color: rgba(32, 31, 31, 0.8); @@ -1922,7 +2008,7 @@ i.fvtt-cthulhu-eternal { } .fvtt-cthulhu-eternal .injury-content legend { font-family: var(--font-secondary); - font-size: calc(var(--font-size-standard) * 1.2); + font-size: calc(var(--font-size-standard) * 1.1); font-weight: bold; letter-spacing: 1px; } @@ -1970,6 +2056,7 @@ i.fvtt-cthulhu-eternal { background-image: var(--background-image-base); background-repeat: no-repeat; background-size: 100% 100%; + --input-height: 1.4rem; } .fvtt-cthulhu-eternal .weapon-content .sheet-tabs a { color: rgba(32, 31, 31, 0.8); @@ -2016,7 +2103,7 @@ i.fvtt-cthulhu-eternal { } .fvtt-cthulhu-eternal .weapon-content legend { font-family: var(--font-secondary); - font-size: calc(var(--font-size-standard) * 1.2); + font-size: calc(var(--font-size-standard) * 1.1); font-weight: bold; letter-spacing: 1px; } @@ -2056,6 +2143,7 @@ i.fvtt-cthulhu-eternal { background-image: var(--background-image-base); background-repeat: no-repeat; background-size: 100% 100%; + --input-height: 1.4rem; } .fvtt-cthulhu-eternal .armor-content .sheet-tabs a { color: rgba(32, 31, 31, 0.8); @@ -2102,7 +2190,7 @@ i.fvtt-cthulhu-eternal { } .fvtt-cthulhu-eternal .armor-content legend { font-family: var(--font-secondary); - font-size: calc(var(--font-size-standard) * 1.2); + font-size: calc(var(--font-size-standard) * 1.1); font-weight: bold; letter-spacing: 1px; } @@ -2142,6 +2230,7 @@ i.fvtt-cthulhu-eternal { background-image: var(--background-image-base); background-repeat: no-repeat; background-size: 100% 100%; + --input-height: 1.4rem; } .fvtt-cthulhu-eternal .motivation-content .sheet-tabs a { color: rgba(32, 31, 31, 0.8); @@ -2188,7 +2277,7 @@ i.fvtt-cthulhu-eternal { } .fvtt-cthulhu-eternal .motivation-content legend { font-family: var(--font-secondary); - font-size: calc(var(--font-size-standard) * 1.2); + font-size: calc(var(--font-size-standard) * 1.1); font-weight: bold; letter-spacing: 1px; } @@ -2228,6 +2317,7 @@ i.fvtt-cthulhu-eternal { background-image: var(--background-image-base); background-repeat: no-repeat; background-size: 100% 100%; + --input-height: 1.4rem; } .fvtt-cthulhu-eternal .mentaldisorder-content .sheet-tabs a { color: rgba(32, 31, 31, 0.8); @@ -2274,7 +2364,7 @@ i.fvtt-cthulhu-eternal { } .fvtt-cthulhu-eternal .mentaldisorder-content legend { font-family: var(--font-secondary); - font-size: calc(var(--font-size-standard) * 1.2); + font-size: calc(var(--font-size-standard) * 1.1); font-weight: bold; letter-spacing: 1px; } @@ -2314,6 +2404,7 @@ i.fvtt-cthulhu-eternal { background-image: var(--background-image-base); background-repeat: no-repeat; background-size: 100% 100%; + --input-height: 1.4rem; } .fvtt-cthulhu-eternal .bond-content .sheet-tabs a { color: rgba(32, 31, 31, 0.8); @@ -2360,7 +2451,7 @@ i.fvtt-cthulhu-eternal { } .fvtt-cthulhu-eternal .bond-content legend { font-family: var(--font-secondary); - font-size: calc(var(--font-size-standard) * 1.2); + font-size: calc(var(--font-size-standard) * 1.1); font-weight: bold; letter-spacing: 1px; } @@ -2416,6 +2507,7 @@ i.fvtt-cthulhu-eternal { background-image: var(--background-image-base); background-repeat: no-repeat; background-size: 100% 100%; + --input-height: 1.4rem; } .fvtt-cthulhu-eternal .gear-content .sheet-tabs a { color: rgba(32, 31, 31, 0.8); @@ -2462,7 +2554,7 @@ i.fvtt-cthulhu-eternal { } .fvtt-cthulhu-eternal .gear-content legend { font-family: var(--font-secondary); - font-size: calc(var(--font-size-standard) * 1.2); + font-size: calc(var(--font-size-standard) * 1.1); font-weight: bold; letter-spacing: 1px; } @@ -2502,6 +2594,7 @@ i.fvtt-cthulhu-eternal { background-image: var(--background-image-base); background-repeat: no-repeat; background-size: 100% 100%; + --input-height: 1.4rem; } .fvtt-cthulhu-eternal .arcane-content .sheet-tabs a { color: rgba(32, 31, 31, 0.8); @@ -2548,7 +2641,7 @@ i.fvtt-cthulhu-eternal { } .fvtt-cthulhu-eternal .arcane-content legend { font-family: var(--font-secondary); - font-size: calc(var(--font-size-standard) * 1.2); + font-size: calc(var(--font-size-standard) * 1.1); font-weight: bold; letter-spacing: 1px; } @@ -2588,6 +2681,7 @@ i.fvtt-cthulhu-eternal { background-image: var(--background-image-base); background-repeat: no-repeat; background-size: 100% 100%; + --input-height: 1.4rem; } .fvtt-cthulhu-eternal .archetype-content .sheet-tabs a { color: rgba(32, 31, 31, 0.8); @@ -2634,7 +2728,7 @@ i.fvtt-cthulhu-eternal { } .fvtt-cthulhu-eternal .archetype-content legend { font-family: var(--font-secondary); - font-size: calc(var(--font-size-standard) * 1.2); + font-size: calc(var(--font-size-standard) * 1.1); font-weight: bold; letter-spacing: 1px; } @@ -2674,6 +2768,7 @@ i.fvtt-cthulhu-eternal { background-image: var(--background-image-base); background-repeat: no-repeat; background-size: 100% 100%; + --input-height: 1.4rem; } .fvtt-cthulhu-eternal .ritual-content .sheet-tabs a { color: rgba(32, 31, 31, 0.8); @@ -2720,7 +2815,7 @@ i.fvtt-cthulhu-eternal { } .fvtt-cthulhu-eternal .ritual-content legend { font-family: var(--font-secondary); - font-size: calc(var(--font-size-standard) * 1.2); + font-size: calc(var(--font-size-standard) * 1.1); font-weight: bold; letter-spacing: 1px; } @@ -2768,6 +2863,7 @@ i.fvtt-cthulhu-eternal { background-image: var(--background-image-base); background-repeat: no-repeat; background-size: 100% 100%; + --input-height: 1.4rem; } .fvtt-cthulhu-eternal .tome-content .sheet-tabs a { color: rgba(32, 31, 31, 0.8); @@ -2814,7 +2910,7 @@ i.fvtt-cthulhu-eternal { } .fvtt-cthulhu-eternal .tome-content legend { font-family: var(--font-secondary); - font-size: calc(var(--font-size-standard) * 1.2); + font-size: calc(var(--font-size-standard) * 1.1); font-weight: bold; letter-spacing: 1px; } @@ -2940,6 +3036,11 @@ i.fvtt-cthulhu-eternal { margin-left: 2rem; display: none; } +.dice-roll .intro-chat .intro-right ul .healing-roll { + font-size: calc(var(--font-size-standard) * 1); + margin-left: 2rem; + display: none; +} .dice-roll .intro-chat .intro-right ul .roll-damage { font-size: calc(var(--font-size-standard) * 1); margin-left: 2rem; diff --git a/cthulhu-eternal.mjs b/cthulhu-eternal.mjs index 44082f9..b59828b 100644 --- a/cthulhu-eternal.mjs +++ b/cthulhu-eternal.mjs @@ -124,12 +124,12 @@ Hooks.once("ready", function () { } preLocalizeConfig() - if (game.user.isGM && game.i18n.lang === 'fr' && !game.modules.find(m => m.id == "babele")) { + if (game.user.isGM && game.i18n.lang === 'fr' && typeof Babele === 'undefined') { ChatMessage.create({ user: game.user.id, whisper: [game.user.id], content: `
- ATTENTION ! Français détecte, mais le module Babele n'est pas installé !
Installez Babele pour bénéficier de la traduction des compendiums` + ATTENTION ! Français détecté, mais le module Babele n'est pas installé !
Installez Babele pour bénéficier de la traduction des compendiums` }) } @@ -144,12 +144,18 @@ Hooks.on("renderChatMessageHTML", (message, html, data) => { $(html).find(".damage-roll").each((i, btn) => { btn.style.display = "inline" }) + $(html).find(".healing-roll").each((i, btn) => { + btn.style.display = "inline" + }) $(html).find(".nudge-roll").click((event) => { CthulhuEternalUtils.nudgeRoll(message) }) $(html).find(".damage-roll").click((event) => { CthulhuEternalUtils.damageRoll(message) }) + $(html).find(".healing-roll").click((event) => { + CthulhuEternalUtils.healingRoll(message) + }) } }) diff --git a/lang/en.json b/lang/en.json index 8c55692..629e152 100644 --- a/lang/en.json +++ b/lang/en.json @@ -57,6 +57,12 @@ "label": "Storage" } }, + "hp": { + "label": "HP", + "stunned": { + "label": "Stun." + } + }, "biodata": { "feature": { "label": "Feature" @@ -207,6 +213,12 @@ "RangedWeapons": "Ranged Weapons", "FirearmsBeams": "Firearms / Beam Weapons", "FIELDS": { + "isHealing": { + "label": "Healing skill" + }, + "healingFormula": { + "label": "Healing PV roll" + }, "isAdversary": { "label": "Adversary" }, @@ -278,6 +290,15 @@ "directSkillValue": { "label": "Direct skill value" }, + "ammo": { + "label": "Ammo", + "value": { + "label": "Ammo value" + }, + "max": { + "label": "Max ammo" + } + }, "state": { "label": "State" }, @@ -495,9 +516,14 @@ } }, "Label": { + "rollNudge": "Roll Nudge", + "rollDamage": "Roll Damage", + "rollHealing": "Roll Healing", + "result": "Result", + "damageMessage": "Damage to apply", "lethalityRoll": "Lethality Roll", - "lethalityWounded": "The target is lethally wounded", - "lethalityNotWounded": "The target is not lethally wounded", + "lethalityWounded": "The target is lethally wounded (HP = 0)", + "lethalityNotWounded": "The target is not lethally wounded, apply damage", "damageRoll": "Damage Roll", "vehicle":"Vehicle", "Weapon": "Weapon", @@ -622,7 +648,21 @@ "noActorFound": "No actor found", "skillFailed": "Skill roll failed : the skill has been ticked for progression", "rollProgress": "Roll Progress", - "skillProgress": "Skill Progress" + "skillProgress": "Skill Progress", + "unconscious": "Unconscious", + "dying": "Dying", + "stunnedWarning": "The Protagonist is stunned. He cannot act until he recovers by successfully rolling a CONx5 check.", + "deadWarning": "The Protagonist is dead. He cannot act until he is revived by a successful First Aid roll.", + "unconsciousWarning": "The Protagonist is unconscious. He cannot act until he has at least 3 HP.", + "Luck": "Luck", + "titleLuck": "Luck Roll", + "healingRoll": "Healing Roll succes, the target gains", + "healingRollFailure": "Healing roll failed ! The target looses", + "killRadius": "Kill Radius", + "killRadiusInfo": "All targets within the kill radius suffer the damage", + "ammoUsed": "Ammo used", + "lethalityLethal": "Lethal !!", + "lethalityNotLethal": "Non-Lethal" }, "ChatMessage": { "exhausted": "Your protagonist is exhausted. He loses [[/r 1d6]] Willpower Points." @@ -651,7 +691,9 @@ "NoWeaponSkill": "No weapon skill found for this weapon. Check Weapon definition or available skills/era", "NoWeaponType": "No weapon type found for this weapon subtype. Check Weapon definition or available skills/era", "skillAlreadyExists": "Skill already exists", - "WrongEra": "The era of the item does not match the ear of the system" + "WrongEra": "The era of the item does not match the ear of the system", + "NoSelectiveFireChoices": "Not enough ammo fo Selective Fire choices for this weapon.", + "NoAmmo": "No more ammo for this weapon. " } } } diff --git a/lang/fr.json b/lang/fr.json index af0f364..4524ecc 100644 --- a/lang/fr.json +++ b/lang/fr.json @@ -42,6 +42,12 @@ "FIELDS": { "damageBonus": { "label": "Bonus D." + }, + "hp": { + "label": "HP", + "stunned": { + "label": "Etourdi" + } }, "resources": { "permanentRating": { @@ -207,6 +213,12 @@ "RangedWeapons": "Armes de tir", "FirearmsBeams": "Armes à feu / à rayons", "FIELDS": { + "isHealing": { + "label": "Compétence de soin" + }, + "healingFormula": { + "label": "PV soignés" + }, "isAdversary": { "label": "Adversaire" }, @@ -272,6 +284,15 @@ "longspray": "Barrage long" }, "FIELDS": { + "ammo": { + "label": "Munitions", + "value": { + "label": "Munitions (actuelles)" + }, + "max": { + "label": "Munitions (max)" + } + }, "hasDirectSkill": { "label": "Compétence intégrée" }, @@ -495,9 +516,14 @@ } }, "Label": { + "rollNudge": "Modifier le jet", + "rollDamage": "Jet de dégâts", + "rollHealing": "Jet de soin", + "result": "Resultat", + "damageMessage": "Dégâts à appliquer", "lethalityRoll": "Jet de Létalité", - "lethalityWounded": "La cible est mortellement blessée", - "lethalityNotWounded": "La cible n'est PAS mortellement blessée", + "lethalityWounded": "La cible est mortellement blessée (PV = 0)", + "lethalityNotWounded": "La cible n'est PAS mortellement blessée, encaissement des dégâts", "damageRoll": "Jet de dégâts", "vehicle":"Véhicule", "Weapon": "Arme", @@ -559,7 +585,7 @@ "conLong": "Constitution", "chaLong": "Charisme", "total": "Total", - "skills": "Compétence", + "skills": "Compétences", "gear": "Matériel", "damage": "Dégâts", "resource": "Ressource", @@ -622,7 +648,21 @@ "noActorFound": "Aucun protagoniste trouvé", "skillFailed": "Jet de compétence échoué : la compétence a été marquée comme pouvant progresser.", "rollProgress": "Jet de progression", - "skillProgress": "Progression de compétence" + "skillProgress": "Progression de compétence", + "unconscious": "Inconscient", + "dying": "Mourant", + "stunnedWarning": "Votre protagoniste est étourdi. Il ne peut pas agir tant qu'il n'a pas réussi un test de CON x 5.", + "deadWarning": "Votre protagoniste est mourrant. Il mourra s'il n'est pas soigné dans les {con} minutes", + "unconsciousWarning": "Votre protagoniste est inconscient. Il ne peut pas agir tant qu'il n'a pas atteint 3 PV.", + "Luck": "Chance", + "titleLuck": "Jet de Chance", + "healingRoll": "Jet de soin, PV soignés", + "healingRollFailure": "Jet de soin échoué critique, PV perdus", + "killRadius": "Rayon de mortlalité", + "killRadiusInfo": "Si la cible est dans le rayon de mortalité, elle subit les dommages.", + "ammoUsed": "Munitions utilisées", + "lethalityLethal": "Létal !!", + "lethalityNotLethal": "Non létal" }, "ChatMessage": { "exhausted": "Votre protagoniste est épuisé. Il perd [[/r 1d6]] Points de Volonté." @@ -651,7 +691,9 @@ "NoWeaponSkill": "Aucune compétence associée n'a été trouvé pour cette arme. Vérifier la définition de l'arme ainsi que l'époque configurée.", "NoWeaponType": "Aucun type d'arme trouvé pour ce sous-type. Vérifier la définition de l'arme ainsi que l'époque configurée.", "skillAlreadyExists": "La compétence existe déja", - "WrongEra": "L'époque de l'item ne correspond pas à celle du jeu en cours." + "WrongEra": "L'époque de l'item ne correspond pas à celle du jeu en cours.", + "NoSelectiveFireChoices": "Aucune option de tir sélectif n'est disponible pour cette arme : pas assez de munitions.", + "NoAmmo": "Aucune munition disponible pour cette arme." } } } diff --git a/module/applications/sheets/protagonist-sheet.mjs b/module/applications/sheets/protagonist-sheet.mjs index c9eef8d..f517e5b 100644 --- a/module/applications/sheets/protagonist-sheet.mjs +++ b/module/applications/sheets/protagonist-sheet.mjs @@ -199,7 +199,7 @@ export default class CthulhuEternalProtagonistSheet extends CthulhuEternalActorS * corresponding value from the document's system and performs the roll. */ async _onRoll(event, target) { - const rollType = $(event.currentTarget).data("roll-type") + let rollType = $(event.currentTarget).data("roll-type") let item let li // Debug : console.log(">>>>", event, target, rollType) @@ -231,6 +231,12 @@ export default class CthulhuEternalProtagonistSheet extends CthulhuEternalActorS item.name = game.i18n.localize("CTHULHUETERNAL.Label.SAN") item.targetScore = item.value break; + case "luck": + item = foundry.utils.duplicate(this.actor.system.characteristics.int) + item.name = game.i18n.localize("CTHULHUETERNAL.Label.Luck") + item.value = 10 + item.targetScore = 50 + break; default: throw new Error(`Unknown roll type ${rollType}`) } diff --git a/module/applications/sheets/weapon-sheet.mjs b/module/applications/sheets/weapon-sheet.mjs index 7c51113..0bee717 100644 --- a/module/applications/sheets/weapon-sheet.mjs +++ b/module/applications/sheets/weapon-sheet.mjs @@ -18,4 +18,13 @@ export default class CthulhuEternalWeaponSheet extends CthulhuEternalItemSheet { template: "systems/fvtt-cthulhu-eternal/templates/weapon.hbs", }, } + + async _prepareContext() { + let context = await super._prepareContext() + context.isFireArm = this.item.system.isFireArm() + context.isRanged = this.item.system.isRanged() + + return context + } + } diff --git a/module/documents/actor.mjs b/module/documents/actor.mjs index e0a358a..64c4937 100644 --- a/module/documents/actor.mjs +++ b/module/documents/actor.mjs @@ -31,7 +31,6 @@ export default class CthulhuEternalActor extends Actor { } _onUpdate(changed, options, userId) { - // DEBUG : console.log("CthulhuEternalActor.update", changed, options, userId) if (changed?.system?.wp?.exhausted) { ChatMessage.create({ user: userId, diff --git a/module/documents/roll.mjs b/module/documents/roll.mjs index ecaef37..23b8dde 100644 --- a/module/documents/roll.mjs +++ b/module/documents/roll.mjs @@ -105,6 +105,105 @@ export default class CthulhuEternalRoll extends Roll { $(".resource-score").text(`${rating} (${options.percentScore}%)`) } + static buildSelectiveFireChoices(actor, weapon) { + if (!weapon || !weapon?.system?.hasSelectiveFire) { + return {} + } + // Loop thru the selective fire choices and build the choices object when enough ammo in the weapon + let choices = {} + for (let choiceKey in SYSTEM.WEAPON_SELECTIVE_FIRE_CHOICES) { + let choice = SYSTEM.WEAPON_SELECTIVE_FIRE_CHOICES[choiceKey] + if (choice.ammoUsed > 0 && choice.ammoUsed <= weapon.system.ammo.value) { + choices[choiceKey] = choice + } + } + // If no choices available, warn the user + if (Object.keys(choices).length === 0) { + ui.notifications.warn(game.i18n.localize("CTHULHUETERNAL.Notifications.NoSelectiveFireChoices")) + return {} + } + return choices + } + + static async processWeaponDamage(actor, options) { + let isLethal = false + let weapon = options.rollItem + let ammoUsed = weapon.system.weaponType.includes("ranged") ? 1 : 0 // Default ammo used for melee weapons is 0 + options.isNudge = false + + // Selective fire management + if (weapon.system.hasSelectiveFire && weapon.selectiveFireChoice) { + let choice = SYSTEM.WEAPON_SELECTIVE_FIRE_CHOICES[weapon.selectiveFireChoice] + if (choice.ammoUsed > weapon.system.ammo.value) { + ui.notifications.warn(game.i18n.localize("CTHULHUETERNAL.Notifications.NoAmmo")) + return + } + weapon.system.selectiveFireChoiceLabel = choice.label // Store the choice in the weapon + weapon.system.lethality = choice.lethality // Override lethality + weapon.system.killRadius = choice.killRadius // Override kill radius + ammoUsed = choice.ammoUsed // Override ammo used + } + + if (weapon.system.lethality > 0) { + let lethalityRoll = new Roll("1d100") + await lethalityRoll.evaluate() + let lethalScore = (options?.previousResultType === "successCritical") ? weapon.system.lethality * 2 : weapon.system.lethality + isLethal = (lethalityRoll.total <= lethalScore) + if (ammoUsed > 0) { + await actor.updateEmbeddedDocuments("Item", [{ + _id: weapon._id, + "system.ammo.value": Math.max(0, weapon.system.ammo.value - ammoUsed) + }]) + } + let wounds = Math.floor(lethalityRoll.total / 10) + (lethalityRoll.total % 10) + let msgData = { + weapon, + wounds, + lethalScore, + isLethal, + ammoUsed, + rollResult: lethalityRoll.total, + } + let flavor = await foundry.applications.handlebars.renderTemplate("systems/fvtt-cthulhu-eternal/templates/chat-lethal-damage.hbs", msgData) + ChatMessage.create({ + user: game.user.id, + content: flavor, + speaker: ChatMessage.getSpeaker({ actor: actor }), + }, { rollMode: options.rollMode, create: true }) + + return + } + + // If the weapon is not lethal, we can proceed with the regular damage roll + let formula = weapon.system.damage + if (weapon.system.weaponType === "melee" || weapon.system.weaponType === "unarmed") { + formula += ` + ${weapon.damageBonus}` + } + if (options?.previousResultType === "successCritical") { + formula = `( ${formula} ) * 2` + } + if (ammoUsed > 0) { + await actor.updateEmbeddedDocuments("Item", [{ + _id: weapon._id, + "system.ammo.value": Math.max(0, weapon.system.ammo.value - ammoUsed) + }]) + } + let damageRoll = new Roll(formula) + await damageRoll.evaluate() + let msgData = { + weapon, + formula, + ammoUsed, + rollResult: damageRoll.total, + } + let flavor = await foundry.applications.handlebars.renderTemplate("systems/fvtt-cthulhu-eternal/templates/chat-regular-damage.hbs", msgData) + ChatMessage.create({ + user: game.user.id, + content: flavor, + speaker: ChatMessage.getSpeaker({ actor: actor }), + }, { rollMode: options.rollMode, create: true }) + } + /** * Prompt the user with a dialog to configure and execute a roll. * @@ -124,12 +223,18 @@ export default class CthulhuEternalRoll extends Roll { let hasModifier = true let hasMultiplier = false options.isNudge = true + let actor = game.actors.get(options.actorId) switch (options.rollType) { case "skill": console.log(options.rollItem) options.initialScore = options.rollItem.system.computeScore() break + case "luck": + hasModifier = false + options.initialScore = 50 + options.isNudge = false + break case "san": case "char": options.initialScore = options.rollItem.targetScore @@ -146,40 +251,8 @@ export default class CthulhuEternalRoll extends Roll { options.rollItem.enableStorage = true options.isNudge = false break - case "damage": { - let isLethal = false - options.isNudge = false - if (options.rollItem.system.lethality > 0) { - let lethalityRoll = new Roll("1d100") - await lethalityRoll.evaluate() - let lethalScore = (options?.previousResultType === "successCritical") ? options.rollItem.system.lethality * 2 : options.rollItem.system.lethality - isLethal = (lethalityRoll.total <= lethalScore) - let flavor = `${options.rollItem.name} - ${game.i18n.localize("CTHULHUETERNAL.Label.lethalityRoll")} : ${lethalityRoll.total} <= ${lethalScore} => ${isLethal}` - if (isLethal) { - flavor += `
${game.i18n.localize("CTHULHUETERNAL.Label.lethalityWounded")} => HP = 0` - } else { - let wounds = Math.floor(lethalityRoll.total / 10) + (lethalityRoll.total % 10) - flavor += `
${game.i18n.localize("CTHULHUETERNAL.Label.lethalityNotWounded")} => HP loss = ${wounds}` - } - await lethalityRoll.toMessage({ - flavor: flavor - }); - return - } - let formula = options.rollItem.system.damage - if (options.rollItem.system.weaponType === "melee" || options.rollItem.system.weaponType === "unarmed") { - formula += ` + ${options.rollItem.damageBonus}` - } - if (options?.previousResultType === "successCritical") { - formula = `( ${formula} ) * 2` - } - let damageRoll = new Roll(formula) - await damageRoll.evaluate() - await damageRoll.toMessage({ - flavor: `${options.rollItem.name} - ${game.i18n.localize("CTHULHUETERNAL.Label.damageRoll")}` - }); - } - return + case "damage": + return this.processWeaponDamage(actor, options) case "weapon": { let era = game.settings.get("fvtt-cthulhu-eternal", "settings-era") if (era !== options.rollItem.system.settings) { @@ -192,6 +265,11 @@ export default class CthulhuEternalRoll extends Roll { console.log("WP Not found", era, options.rollItem.system.weaponType) return } + // Check if the weapon has enouth ammo in case of a firearm + if (options.rollItem.system.isFireArm() && options.rollItem.system.ammo.value <= 0) { + ui.notifications.warn(game.i18n.localize("CTHULHUETERNAL.Notifications.NoAmmo")) + return + } options.weapon = options.rollItem if (options.rollItem.system.hasDirectSkill) { let skillName = options.rollItem.name @@ -199,7 +277,6 @@ export default class CthulhuEternalRoll extends Roll { options.initialScore = options.weapon.system.directSkillValue } else { let skillName = game.i18n.localize(SYSTEM.WEAPON_SKILL_MAPPING[era][options.rollItem.system.weaponType]) - let actor = game.actors.get(options.actorId) options.rollItem = actor.items.find(i => i.type === "skill" && i.name.toLowerCase() === skillName.toLowerCase()) if (!options.rollItem) { ui.notifications.error(game.i18n.localize("CTHULHUETERNAL.Notifications.NoWeaponSkill")) @@ -215,7 +292,6 @@ export default class CthulhuEternalRoll extends Roll { break } - console.log("Roll options", CONFIG.Dice.rollModes); const rollModes = foundry.utils.duplicate(CONFIG.Dice.rollModes); //Object.fromEntries(Object.entries(CONFIG.Dice.rollModes).map(([key, value]) => [key, game.i18n.localize(value)])) const fieldRollMode = new foundry.data.fields.StringField({ choices: rollModes, @@ -225,7 +301,7 @@ export default class CthulhuEternalRoll extends Roll { const choiceModifier = SYSTEM.MODIFIER_CHOICES const choiceMultiplier = SYSTEM.MULTIPLIER_CHOICES - const choiceSelectiveFire = SYSTEM.WEAPON_SELECTIVE_FIRE_CHOICES + const choiceSelectiveFire = this.buildSelectiveFireChoices(actor, options?.weapon) let modifier = "+0" let multiplier = "5" @@ -318,6 +394,10 @@ export default class CthulhuEternalRoll extends Roll { } rollData.targetScore = Math.min(Math.max(rollData.targetScore, 0), 100) } + if (!rollData.targetScore) { + rollData.targetScore = options.initialScore + rollData.modifier = "0" + } if (Hooks.call("fvtt-cthulhu-eternal.preRoll", options, rollData) === false) return @@ -390,6 +470,8 @@ export default class CthulhuEternalRoll extends Roll { */ static createTitle(type, target) { switch (type) { + case "luck": + return `${game.i18n.localize("CTHULHUETERNAL.Label.titleLuck")}` case "skill": return `${game.i18n.localize("CTHULHUETERNAL.Label.titleSkill")}` case "weapon": diff --git a/module/models/protagonist.mjs b/module/models/protagonist.mjs index d012817..be0bd60 100644 --- a/module/models/protagonist.mjs +++ b/module/models/protagonist.mjs @@ -35,7 +35,9 @@ export default class CthulhuEternalProtagonist extends foundry.abstract.TypeData schema.hp = new fields.SchemaField({ value: new fields.NumberField({ ...requiredInteger, initial: 1, min: 0 }), max: new fields.NumberField({ ...requiredInteger, initial: 1, min: 0 }), - stunned: new fields.BooleanField({ required: true, initial: false }) + stunned: new fields.BooleanField({ required: true, initial: false }), + unconscious: new fields.BooleanField({ required: true, initial: false }), + dead: new fields.BooleanField({ required: true, initial: false }) }) schema.san = new fields.SchemaField({ @@ -130,6 +132,22 @@ export default class CthulhuEternalProtagonist extends foundry.abstract.TypeData updates[`system.damageBonus`] = dmgBonus } + // Unconsciousness management + if (!this.hp.unconscious && this.hp.value <= 2) { + updates[`system.hp.unconscious`] = true + } + if (this.hp.unconscious && this.hp.value > 2) { + updates[`system.hp.unconscious`] = false + } + + // Dead management + if (!this.hp.dead && this.hp.value <= 0) { + updates[`system.hp.dead`] = true + } + if (this.hp.dead && this.hp.value > 0) { + updates[`system.hp.dead`] = false + } + // Sanity check if (this.san.value > this.san.max) { updates[`system.san.value`] = this.san.max @@ -165,6 +183,10 @@ export default class CthulhuEternalProtagonist extends foundry.abstract.TypeData } } + isStunned() { + return this.hp.stunned + } + isLowWP() { return this.wp.value <= 2 } @@ -207,6 +229,32 @@ export default class CthulhuEternalProtagonist extends foundry.abstract.TypeData * @returns {Promise} - A promise that resolves to null if the roll is cancelled. */ async roll(rollType, rollItem) { + + if (this.hp.dead ) { + // Warn with chat message + ChatMessage.create({ + content: `

${game.i18n.format("CTHULHUETERNAL.Label.deadWarning", {con: this.characteristics.con.value} )}

`, + speaker: ChatMessage.getSpeaker({ actor: this.parent }) + }) + return null + } + if (this.hp.unconscious ) { + // Warn with chat message + ChatMessage.create({ + content: `

${game.i18n.localize("CTHULHUETERNAL.Label.unconsciousWarning")}

`, + speaker: ChatMessage.getSpeaker({ actor: this.parent }) + }) + return null + } + if (this.hp.stunned && rollType === "skill") { + // Warn with chat message + ChatMessage.create({ + content: `

${game.i18n.localize("CTHULHUETERNAL.Label.stunnedWarning")}

`, + speaker: ChatMessage.getSpeaker({ actor: this.parent }) + }) + return null + } + let opponentTarget const hasTarget = opponentTarget !== undefined diff --git a/module/models/skill.mjs b/module/models/skill.mjs index 428b79b..08e5d84 100644 --- a/module/models/skill.mjs +++ b/module/models/skill.mjs @@ -15,6 +15,8 @@ export default class CthulhuEternalSkill extends foundry.abstract.TypeDataModel schema.diceEvolved = new fields.BooleanField({ required: true, initial: true }) schema.rollFailed = new fields.BooleanField({ required: true, initial: false }) schema.isAdversary = new fields.BooleanField({ required: true, initial: false }) + schema.isHealing = new fields.BooleanField({ required: true, initial: false }) + schema.healingFormula = new fields.StringField({ required: true, initial: "1d4" }) return schema } @@ -36,11 +38,11 @@ export default class CthulhuEternalSkill extends foundry.abstract.TypeDataModel return `${this.base} + ${ String(this.bonus)}`; } - // Split the base value per stat : + // Split the base value per stat : let base = this.base.toLowerCase(); let char = actor.system.characteristics[base]; if (!char) { - ui.notifications.error(`The characteristic ${base} is wrong for actor ${actor.name}`); + ui.notifications.error(`The characteristic ${base} is wrong for actor ${actor.name}`); return `${this.base } + ${ String(this.bonus)}`; } let charValue = char.value; diff --git a/module/models/weapon.mjs b/module/models/weapon.mjs index e000b5a..a6709a6 100644 --- a/module/models/weapon.mjs +++ b/module/models/weapon.mjs @@ -25,6 +25,10 @@ export default class CthulhuEternalWeapon extends foundry.abstract.TypeDataModel schema.armorPiercing = new fields.NumberField({ required: true, initial: 0, min: 0 }) schema.weaponSubtype = new fields.StringField({ required: true, initial: "basicfirearm", choices: SYSTEM.WEAPON_SUBTYPE }) schema.state = new fields.StringField({ required: true, initial: "pristine", choices: SYSTEM.EQUIPMENT_STATES }) + schema.ammo = new fields.SchemaField({ + value: new fields.NumberField({ ...requiredInteger, initial: 6, min: 0 }), + max: new fields.NumberField({ ...requiredInteger, initial: 6, min: 0 }) + }) schema.resourceLevel = new fields.NumberField({ required: true, initial: 0, min: 0 }) @@ -37,4 +41,12 @@ export default class CthulhuEternalWeapon extends foundry.abstract.TypeDataModel get weaponCategory() { return game.i18n.localize(CATEGORY[this.category].label) } + + isRanged() { + return this.weaponType.includes("ranged") + } + + isFireArm() { + return this.weaponType === "rangedfirearm" + } } diff --git a/module/utils.mjs b/module/utils.mjs index 0ae23cc..444608e 100644 --- a/module/utils.mjs +++ b/module/utils.mjs @@ -180,6 +180,30 @@ export default class CthulhuEternalUtils { }); } + static async healingRoll(rollMessage) { + let rollData = rollMessage.rolls[0]?.options?.rollData + let healingFormula = rollData.rollItem.system.healingFormula + let healingMsg = "CTHULHUETERNAL.Label.healingRoll" + if (rollData.resultType === "successCritical") { + healingFormula += " * 2" + } + if (rollData.resultType === "failureCritical") { + healingMsg = "CTHULHUETERNAL.Label.healingRollFailure" + } + // Now display the result in chat message + let roll = new Roll(healingFormula) + await roll.evaluate() + roll.toMessage({ + speaker: ChatMessage.getSpeaker({ actor: rollData.actorId }), + flavor: `${game.i18n.localize(healingMsg)} : ${roll.total}`, + rolls: [roll], + options: { + rollData: rollData, + resultType: rollData.resultType + } + }) + } + static async damageRoll(rollMessage) { let rollData = rollMessage.rolls[0]?.options?.rollData let actor = game.actors.get(rollData.actorId) @@ -187,7 +211,9 @@ export default class CthulhuEternalUtils { ui.notifications.error(game.i18n.localize("CTHULHUETERNAL.Label.noActorFound")) return } + console.log("Damage roll data", rollData) rollData.weapon.resultType = rollData.resultType // Keep the result type from the roll message + rollData.weapon.selectiveFireChoice = rollData.selectiveFireChoice // Keep the selected fire choice from the roll message actor.system.roll("damage", rollData.weapon) } diff --git a/packs-system/rituals/000083.log b/packs-system/rituals/000132.log similarity index 100% rename from packs-system/rituals/000083.log rename to packs-system/rituals/000132.log diff --git a/packs-system/rituals/CURRENT b/packs-system/rituals/CURRENT index 635f1ad..d5731e9 100644 --- a/packs-system/rituals/CURRENT +++ b/packs-system/rituals/CURRENT @@ -1 +1 @@ -MANIFEST-000081 +MANIFEST-000131 diff --git a/packs-system/rituals/LOG b/packs-system/rituals/LOG index 585200c..6dc438c 100644 --- a/packs-system/rituals/LOG +++ b/packs-system/rituals/LOG @@ -1,7 +1,3 @@ -2025/06/12-21:40:36.466688 7f13a0ff96c0 Recovering log #79 -2025/06/12-21:40:36.523036 7f13a0ff96c0 Delete type=3 #77 -2025/06/12-21:40:36.523080 7f13a0ff96c0 Delete type=0 #79 -2025/06/12-22:19:34.910570 7f139fbff6c0 Level-0 table #84: started -2025/06/12-22:19:34.910598 7f139fbff6c0 Level-0 table #84: 0 bytes OK -2025/06/12-22:19:34.968716 7f139fbff6c0 Delete type=0 #82 -2025/06/12-22:19:35.027464 7f139fbff6c0 Manual compaction at level-0 from '!items!4oyPRBWPBWAChrJP' @ 72057594037927935 : 1 .. '!items!zVFfp3o0G0Zg3Ia4' @ 0 : 0; will stop at (end) +2025/06/14-23:45:33.918294 7f78d8df86c0 Recovering log #129 +2025/06/14-23:45:34.040033 7f78d8df86c0 Delete type=3 #127 +2025/06/14-23:45:34.040084 7f78d8df86c0 Delete type=0 #129 diff --git a/packs-system/rituals/LOG.old b/packs-system/rituals/LOG.old index bcc655e..383bb1a 100644 --- a/packs-system/rituals/LOG.old +++ b/packs-system/rituals/LOG.old @@ -1,7 +1,7 @@ -2025/06/12-20:37:22.833913 7f13a0ff96c0 Recovering log #75 -2025/06/12-20:37:22.843981 7f13a0ff96c0 Delete type=3 #73 -2025/06/12-20:37:22.844063 7f13a0ff96c0 Delete type=0 #75 -2025/06/12-20:52:48.559109 7f139fbff6c0 Level-0 table #80: started -2025/06/12-20:52:48.559156 7f139fbff6c0 Level-0 table #80: 0 bytes OK -2025/06/12-20:52:48.723881 7f139fbff6c0 Delete type=0 #78 -2025/06/12-20:52:48.724064 7f139fbff6c0 Manual compaction at level-0 from '!items!4oyPRBWPBWAChrJP' @ 72057594037927935 : 1 .. '!items!zVFfp3o0G0Zg3Ia4' @ 0 : 0; will stop at (end) +2025/06/14-13:49:17.890351 7f78d8df86c0 Recovering log #125 +2025/06/14-13:49:17.899990 7f78d8df86c0 Delete type=3 #123 +2025/06/14-13:49:17.900040 7f78d8df86c0 Delete type=0 #125 +2025/06/14-16:21:28.823932 7f78d37fe6c0 Level-0 table #130: started +2025/06/14-16:21:28.823960 7f78d37fe6c0 Level-0 table #130: 0 bytes OK +2025/06/14-16:21:28.831212 7f78d37fe6c0 Delete type=0 #128 +2025/06/14-16:21:28.848927 7f78d37fe6c0 Manual compaction at level-0 from '!items!4oyPRBWPBWAChrJP' @ 72057594037927935 : 1 .. '!items!zVFfp3o0G0Zg3Ia4' @ 0 : 0; will stop at (end) diff --git a/packs-system/rituals/MANIFEST-000081 b/packs-system/rituals/MANIFEST-000131 similarity index 75% rename from packs-system/rituals/MANIFEST-000081 rename to packs-system/rituals/MANIFEST-000131 index 59909fde3ee4497740beda9edc650c79d8a288be..d76a4e864acc6ae7efea498c7931a357e3083b0b 100644 GIT binary patch delta 24 fcmZ3{Bn2&Di3 diff --git a/packs-system/skills/000244.ldb b/packs-system/skills/000277.ldb similarity index 75% rename from packs-system/skills/000244.ldb rename to packs-system/skills/000277.ldb index 72a5b6218b5afe8b26a05cd2b865247e9c6dc37e..d05b856ebcec783c92ab792b08626197b07eaa0b 100644 GIT binary patch delta 37086 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"}Wa_e7grYAvW}N!nj3JE)hsU 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 Q5>^dOS{o$o_=L>-f0!AMl>h($ diff --git a/packs-system/skills/000251.log b/packs-system/skills/000301.log similarity index 100% rename from packs-system/skills/000251.log rename to packs-system/skills/000301.log diff --git a/packs-system/skills/CURRENT b/packs-system/skills/CURRENT index 7ad1797..16abe4a 100644 --- a/packs-system/skills/CURRENT +++ b/packs-system/skills/CURRENT @@ -1 +1 @@ -MANIFEST-000249 +MANIFEST-000300 diff --git a/packs-system/skills/LOG b/packs-system/skills/LOG index d64bf9a..3318fbd 100644 --- a/packs-system/skills/LOG +++ b/packs-system/skills/LOG @@ -1,7 +1,3 @@ -2025/06/12-21:40:36.410156 7f13a17fa6c0 Recovering log #247 -2025/06/12-21:40:36.461712 7f13a17fa6c0 Delete type=3 #245 -2025/06/12-21:40:36.461765 7f13a17fa6c0 Delete type=0 #247 -2025/06/12-22:19:34.795093 7f139fbff6c0 Level-0 table #252: started -2025/06/12-22:19:34.795129 7f139fbff6c0 Level-0 table #252: 0 bytes OK -2025/06/12-22:19:34.852214 7f139fbff6c0 Delete type=0 #250 -2025/06/12-22:19:35.027439 7f139fbff6c0 Manual compaction at level-0 from '!folders!5PrT9QmN1cFPzDFP' @ 72057594037927935 : 1 .. '!items!zvoUByzWSWZ87fxA' @ 0 : 0; will stop at (end) +2025/06/14-23:45:33.811724 7f78d9dfa6c0 Recovering log #298 +2025/06/14-23:45:33.914052 7f78d9dfa6c0 Delete type=3 #296 +2025/06/14-23:45:33.914134 7f78d9dfa6c0 Delete type=0 #298 diff --git a/packs-system/skills/LOG.old b/packs-system/skills/LOG.old index 3c47fd4..a335865 100644 --- a/packs-system/skills/LOG.old +++ b/packs-system/skills/LOG.old @@ -1,7 +1,7 @@ -2025/06/12-20:37:22.815373 7f13a1ffb6c0 Recovering log #242 -2025/06/12-20:37:22.826434 7f13a1ffb6c0 Delete type=3 #240 -2025/06/12-20:37:22.826479 7f13a1ffb6c0 Delete type=0 #242 -2025/06/12-20:52:48.502299 7f139fbff6c0 Level-0 table #248: started -2025/06/12-20:52:48.502341 7f139fbff6c0 Level-0 table #248: 0 bytes OK -2025/06/12-20:52:48.558859 7f139fbff6c0 Delete type=0 #246 -2025/06/12-20:52:48.724054 7f139fbff6c0 Manual compaction at level-0 from '!folders!5PrT9QmN1cFPzDFP' @ 72057594037927935 : 1 .. '!items!zvoUByzWSWZ87fxA' @ 0 : 0; will stop at (end) +2025/06/14-13:49:17.875545 7f78d95f96c0 Recovering log #294 +2025/06/14-13:49:17.886122 7f78d95f96c0 Delete type=3 #292 +2025/06/14-13:49:17.886173 7f78d95f96c0 Delete type=0 #294 +2025/06/14-16:21:28.817422 7f78d37fe6c0 Level-0 table #299: started +2025/06/14-16:21:28.817477 7f78d37fe6c0 Level-0 table #299: 0 bytes OK +2025/06/14-16:21:28.823801 7f78d37fe6c0 Delete type=0 #297 +2025/06/14-16:21:28.848912 7f78d37fe6c0 Manual compaction at level-0 from '!folders!5PrT9QmN1cFPzDFP' @ 72057594037927935 : 1 .. '!items!zvoUByzWSWZ87fxA' @ 0 : 0; will stop at (end) diff --git a/packs-system/skills/MANIFEST-000249 b/packs-system/skills/MANIFEST-000249 deleted file mode 100644 index d156317b090d4434cfab45c61396045a5fd09d81..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 178 zcmZpkn>)Fkfss)vC$%g!CnZVGsj?)sJhM2}IX|}`u_&=5zlfDVUNN&IHMdyNIXN^r zHK;T!F(WP0-6X7vaRn;_2(UALVLZA^SWz)8KPM%%s94c7peV#LFxSs8*)5>T#Vvrb zjR~v}W>8gGeyCGrRd{fCl!bX(g(D*)#GpBcww~Z-U}XBm$jQL`n~`NDcb$*+R*=YV JkjP(<2mp_~G#dZ_ diff --git a/packs-system/skills/MANIFEST-000300 b/packs-system/skills/MANIFEST-000300 new file mode 100644 index 0000000000000000000000000000000000000000..86c4df1110380b792e42c0c1452cf09e484b306a GIT binary patch literal 160 zcmcb(oB41%10$nUPHI_dPD+xVQ)NkNd1i5{bAE0?Vo_pAei18!ykcfaYHqP&RfbEp zLB3;nM5Lp0aA`yZ<0e)H5MXDV%5?I$u%cpGeojhiQL&VedcChWLnF_$-umhiDeHr0P-#_WdHyG literal 0 HcmV?d00001 diff --git a/styles/chat.less b/styles/chat.less index 3a378c4..17cc837 100644 --- a/styles/chat.less +++ b/styles/chat.less @@ -5,4 +5,4 @@ justify-content: center; font-family: var(--font-secondary); font-size: calc(var(--font-size-standard) * 1.1); -} \ No newline at end of file +} diff --git a/styles/global.less b/styles/global.less index a0446ab..86d1e7f 100644 --- a/styles/global.less +++ b/styles/global.less @@ -85,3 +85,26 @@ i.fvtt-cthulhu-eternal { background-position: 0%; background-size: 100% 100%; } + +.chat-lethal-damage { + ul { + list-style-type: none; + padding: 0; + margin: 0; + justify-content: center; + align-items: center; + .result-lethal { + color: var(--color-critical-failure); + font-family: var(--font-title); + } + .result-non-lethal { + color: var(--color-failure); + font-family: var(--font-title); + } + li { + margin: 0 10px; + font-family: var(--font-primary); + font-size: calc(var(--font-size-standard) * 1.02); + } + } +} diff --git a/styles/mixins.less b/styles/mixins.less index 361b06f..6667d6d 100644 --- a/styles/mixins.less +++ b/styles/mixins.less @@ -5,10 +5,11 @@ background-image: var(--background-image-base); background-repeat: no-repeat; background-size: 100% 100%; + --input-height: 1.4rem; .sheet-tabs { a { - color: rgba(32, 31, 31, 0.8); + color: rgba(32, 31, 31, 0.8); } } @@ -62,7 +63,7 @@ legend { font-family: var(--font-secondary); - font-size: calc(var(--font-size-standard) * 1.2); + font-size: calc(var(--font-size-standard) * 1.1); font-weight: bold; letter-spacing: 1px; } @@ -73,6 +74,38 @@ font-family: var(--font-secondary); font-size: calc(var(--font-size-standard) * 1); } + .hp-unconscious { + font-family: var(--font-secondary); + font-size: calc(var(--font-size-standard) * 1); + color: #b4710c; + } + .hp-dead { + font-family: var(--font-secondary); + font-size: calc(var(--font-size-standard) * 1); + color: #b40000; + } + .protagonist-luck { + display: flex; + min-width: 8rem; + max-width: 8rem; + .rollable:hover, + .rollable:focus { + text-shadow: 0 0 8px var(--color-shadow-primary); + cursor: pointer; + font-size: 0.9rem; + } + } + .damage-bonus { + display: flex; + label { + max-width: 5rem; + min-width: 5rem; + } + input { + max-width: 2rem; + min-width: 2rem; + } + } } .vehicle-sheet-common { @@ -90,7 +123,6 @@ } .item-sheet-common { - .form-fields { padding-top: 4px; } diff --git a/styles/protagonist.less b/styles/protagonist.less index 4eb955a..9d6bdaa 100644 --- a/styles/protagonist.less +++ b/styles/protagonist.less @@ -42,9 +42,6 @@ width: 2rem; margin-left: 4px; } - .damage-bonus { - font-size: calc(var(--font-size-standard) * 0.8); - } .hp-separator { font-size: calc(var(--font-size-standard) * 1.2); display: flex; diff --git a/styles/roll.less b/styles/roll.less index 3a6890c..f63debf 100644 --- a/styles/roll.less +++ b/styles/roll.less @@ -98,6 +98,11 @@ margin-left: 2rem; display: none; } + .healing-roll { + font-size: calc(var(--font-size-standard) * 1.0); + margin-left: 2rem; + display: none; + } .roll-damage { font-size: calc(var(--font-size-standard) * 1.0); margin-left: 2rem; diff --git a/templates/chat-lethal-damage.hbs b/templates/chat-lethal-damage.hbs new file mode 100644 index 0000000..51620c9 --- /dev/null +++ b/templates/chat-lethal-damage.hbs @@ -0,0 +1,31 @@ +
+
+
    +
  • {{weapon.name}} : {{localize "CTHULHUETERNAL.Label.lethalityRoll"}}
  • +
  • {{localize "CTHULHUETERNAL.Label.result"}} :{{rollResult}} ({{lethalScore}})
  • + + + {{#if weapon.system.selectiveFireChoice}} +
  • {{weapon.system.selectiveFireChoiceLabel}}
  • + {{/if}} + {{#if weapon.system.killRadius}} +
  • {{localize "CTHULHUETERNAL.Label.killRadius"}} : {{weapon.system.killRadius}} {{weapon.system.rangeUnit}}
  • +
  • {{localize "CTHULHUETERNAL.Label.killRadiusInfo"}}
  • + {{/if}} + + {{#if ammoUsed}} +
  • {{localize "CTHULHUETERNAL.Label.ammoUsed"}}: {{ammoUsed}} / {{weapon.system.ammo.value}}
  • + {{/if}} + + {{#if isLethal}} +
  • {{localize "CTHULHUETERNAL.Label.lethalityLethal"}}
  • +
  • {{localize "CTHULHUETERNAL.Label.lethalityWounded"}}
  • + {{else}} +
  • {{localize "CTHULHUETERNAL.Label.lethalityNotLethal"}}
  • +
  • {{localize "CTHULHUETERNAL.Label.lethalityNotWounded"}}: {{wounds}}
  • + {{/if}} + +
+ +
+
\ No newline at end of file diff --git a/templates/chat-message.hbs b/templates/chat-message.hbs index 598ed21..369718f 100644 --- a/templates/chat-message.hbs +++ b/templates/chat-message.hbs @@ -51,30 +51,54 @@ {{#if isCritical}}
  • {{localize "CTHULHUETERNAL.Label.criticalSuccess"}} {{#if (eq rollType "weapon")}} - + {{#if (eq weapon.system.weaponType "rangedfirearm")}} + + {{else}} + + {{/if}} {{/if}} + {{#if (eq rollType "skill") }} + {{#if rollItem.system.isHealing}} + + {{/if}} + {{/if}} +
  • {{else}}
  • {{localize "CTHULHUETERNAL.Label.success"}} {{#if isNudge}} - + {{/if}} - {{#if (eq rollType "weapon")}} - + {{#if (eq weapon.system.weaponType "rangedfirearm")}} + + {{else}} + + {{/if}} + {{#if (eq rollType "skill") }} + {{#if rollItem.system.isHealing}} + + {{/if}} {{/if}}
  • {{/if}} + {{/if}} {{#if isFailure}} {{#if isCritical}} -
  • {{localize "CTHULHUETERNAL.Label.criticalFailure"}}
  • +
  • {{localize "CTHULHUETERNAL.Label.criticalFailure"}} + {{#if (eq rollType "skill") }} + {{#if rollItem.system.isHealing}} + + {{/if}} + {{/if}} +
  • {{else}}
  • {{localize "CTHULHUETERNAL.Label.failure"}} {{#if isNudge}} - + {{/if}}
  • {{/if}} diff --git a/templates/chat-regular-damage.hbs b/templates/chat-regular-damage.hbs new file mode 100644 index 0000000..354c17e --- /dev/null +++ b/templates/chat-regular-damage.hbs @@ -0,0 +1,20 @@ +
    +
    +
      +
    • {{weapon.name}} : {{localize "CTHULHUETERNAL.Label.damageRoll"}}
    • +
    • {{localize "CTHULHUETERNAL.Label.result"}} :{{rollResult}} ({{formula}})
    • + + {{#if weapon.system.killRadius}} +
    • {{localize "CTHULHUETERNAL.Label.killRadius"}} : {{weapon.system.killRadius}} {{weapon.system.rangeUnit}}
    • +
    • {{localize "CTHULHUETERNAL.Label.killRadiusInfo"}}
    • + {{/if}} + + {{#if ammoUsed}} +
    • {{localize "CTHULHUETERNAL.Label.ammoUsed"}}: {{ammoUsed}} / {{weapon.system.ammo.value}}
    • + {{/if}} +
    • {{localize "CTHULHUETERNAL.Label.damageMessage"}}: {{rollResult}}
    • + +
    + +
    +
    \ No newline at end of file diff --git a/templates/protagonist-main.hbs b/templates/protagonist-main.hbs index fbde7d5..f12eade 100644 --- a/templates/protagonist-main.hbs +++ b/templates/protagonist-main.hbs @@ -10,14 +10,20 @@ data-tooltip="{{actor.name}}" />
    - {{localize "CTHULHUETERNAL.Label.HP"}} + {{#if system.hp.dead}} + {{localize "CTHULHUETERNAL.Label.HP"}} {{localize "CTHULHUETERNAL.Label.dying"}} + {{else}} + {{#if system.hp.unconscious}} + {{localize "CTHULHUETERNAL.Label.HP"}} {{localize "CTHULHUETERNAL.Label.unconscious"}} + {{else}} + {{localize "CTHULHUETERNAL.Label.HP"}} + {{/if}} + {{/if}}
    {{formField systemFields.hp.fields.value value=system.hp.value}} / {{formField systemFields.hp.fields.max value=system.hp.max rootId=partId disabled=true}} -
    -
    - {{formField systemFields.damageBonus value=system.damageBonus classes="damage-bonus"}} + {{formField systemFields.hp.fields.stunned value=system.hp.stunned classes="stunned"}}
    @@ -158,6 +164,17 @@ rootId=partId disabled=isPlayMode }} + +
    + + +
    +
    + {{formField systemFields.damageBonus value=system.damageBonus tooltip="Etourdi" }} +
    + \ No newline at end of file diff --git a/templates/skill.hbs b/templates/skill.hbs index a009f6b..e2b9153 100644 --- a/templates/skill.hbs +++ b/templates/skill.hbs @@ -14,6 +14,10 @@ {{system.skillTotal}} {{#if isGM}} + {{formField systemFields.isHealing value=system.isHealing}} + {{#if system.isHealing}} + {{formField systemFields.healingFormula value=system.healingFormula}} + {{/if}} {{formField systemFields.isAdversary value=system.isAdversary }} {{formField systemFields.diceEvolved value=system.diceEvolved}} @@ -21,6 +25,10 @@ {{formField systemFields.rollFailed value=system.rollFailed}} {{/if}} {{else}} + {{formField systemFields.isHealing value=system.isHealing disabled=true}} + {{#if system.isHealing}} + {{formField systemFields.healingFormula value=system.healingFormula disabled=true}} + {{/if}} {{formField systemFields.isAdversary value=system.isAdversary disabled=true}} {{formField systemFields.diceEvolved value=system.diceEvolved disabled=true}} diff --git a/templates/weapon.hbs b/templates/weapon.hbs index ad1a5d9..100fc62 100644 --- a/templates/weapon.hbs +++ b/templates/weapon.hbs @@ -8,7 +8,7 @@ {{formField systemFields.settings value=system.settings localize=true}} {{formField systemFields.weaponType value=system.weaponType localize=true}} {{#if (eq system.weaponType "rangedfirearm")}} - {{formField systemFields.weaponSubtype value=system.weaponSubtype localize=true}} + {{formField systemFields.weaponSubtype value=system.weaponSubtype localize=true}} {{/if}} {{formField systemFields.state value=system.state localize=true}} @@ -18,12 +18,20 @@ {{formField systemFields.directSkillValue value=system.directSkillValue }} {{/if}} - {{formField systemFields.hasSelectiveFire value=system.hasSelectiveFire}} {{formField systemFields.applyDamageBonus value=system.applyDamageBonus}} {{formField systemFields.damage value=system.damage}} - {{formField systemFields.baseRange value=system.baseRange}} - {{formField systemFields.rangeUnit value=system.rangeUnit localize=true}} + {{#if isRanged}} + {{formField systemFields.baseRange value=system.baseRange}} + {{formField systemFields.rangeUnit value=system.rangeUnit localize=true}} + {{/if}} + + {{#if isFireArm}} + {{formField systemFields.hasSelectiveFire value=system.hasSelectiveFire}} + {{formField systemFields.ammo.fields.value value=system.ammo.value}} + {{formField systemFields.ammo.fields.max value=system.ammo.max}} + {{/if}} + {{formField systemFields.lethality value=system.lethality}} {{formField systemFields.killRadius value=system.killRadius}}