From 6c70dc147c7d1702d0c983451972fce4e944029d Mon Sep 17 00:00:00 2001 From: LeRatierBretonnier Date: Sun, 1 Mar 2026 01:12:00 +0100 Subject: [PATCH] DataModels + Appv2 migration : OK --- css/bol.css | 1082 ++++++++++++++++- lang/en.json | 7 +- lang/fr.json | 7 +- module/actor/actor.js | 68 +- module/applications/sheets/horde-sheet.mjs | 2 +- module/applications/sheets/vehicle-sheet.mjs | 12 +- module/bol.js | 33 +- module/controllers/bol-rolls.js | 170 ++- module/system/bol-utility.js | 38 +- module/system/config.js | 38 +- module/system/templates.js | 4 +- packs/aides-de-jeu/{001073.log => 001078.log} | 0 packs/aides-de-jeu/CURRENT | 2 +- packs/aides-de-jeu/LOG | 11 +- packs/aides-de-jeu/LOG.old | 16 +- .../{MANIFEST-001072 => MANIFEST-001076} | Bin 210 -> 228 bytes packs/armors/{000978.log => 000983.log} | 0 packs/armors/CURRENT | 2 +- packs/armors/LOG | 11 +- packs/armors/LOG.old | 16 +- .../{MANIFEST-000977 => MANIFEST-000981} | Bin 156 -> 173 bytes packs/boons/{001072.log => 001077.log} | 0 packs/boons/CURRENT | 2 +- packs/boons/LOG | 11 +- packs/boons/LOG.old | 16 +- .../{MANIFEST-001071 => MANIFEST-001075} | Bin 158 -> 176 bytes .../{001071.log => 001076.log} | 0 packs/boonsflawscreatures/CURRENT | 2 +- packs/boonsflawscreatures/LOG | 11 +- packs/boonsflawscreatures/LOG.old | 16 +- .../{MANIFEST-001070 => MANIFEST-001074} | Bin 156 -> 173 bytes packs/careers/{001071.log => 001076.log} | 0 packs/careers/CURRENT | 2 +- packs/careers/LOG | 11 +- packs/careers/LOG.old | 16 +- .../{MANIFEST-001070 => MANIFEST-001074} | Bin 158 -> 176 bytes .../{001069.log => 001074.log} | 0 packs/effets-exemples/CURRENT | 2 +- packs/effets-exemples/LOG | 11 +- packs/effets-exemples/LOG.old | 16 +- .../{MANIFEST-001068 => MANIFEST-001072} | Bin 156 -> 173 bytes packs/equipment/{001072.log => 001077.log} | 0 packs/equipment/CURRENT | 2 +- packs/equipment/LOG | 11 +- packs/equipment/LOG.old | 16 +- .../{MANIFEST-001071 => MANIFEST-001075} | Bin 157 -> 175 bytes packs/fightoptions/{001071.log => 001076.log} | 0 packs/fightoptions/CURRENT | 2 +- packs/fightoptions/LOG | 11 +- packs/fightoptions/LOG.old | 16 +- .../{MANIFEST-001070 => MANIFEST-001074} | Bin 157 -> 175 bytes .../{000554.log => 000559.log} | 0 packs/fightoptionsfanmade/CURRENT | 2 +- packs/fightoptionsfanmade/LOG | 11 +- packs/fightoptionsfanmade/LOG.old | 16 +- .../{MANIFEST-000553 => MANIFEST-000557} | Bin 157 -> 175 bytes packs/flaws/{001072.log => 001077.log} | 0 packs/flaws/CURRENT | 2 +- packs/flaws/LOG | 11 +- packs/flaws/LOG.old | 16 +- .../{MANIFEST-001071 => MANIFEST-001075} | Bin 158 -> 176 bytes packs/languages/{001071.log => 001076.log} | 0 packs/languages/CURRENT | 2 +- packs/languages/LOG | 11 +- packs/languages/LOG.old | 16 +- .../{MANIFEST-001070 => MANIFEST-001074} | Bin 157 -> 175 bytes .../{001071.log => 001076.log} | 0 packs/objets-alchimie/CURRENT | 2 +- packs/objets-alchimie/LOG | 11 +- packs/objets-alchimie/LOG.old | 16 +- .../{MANIFEST-001070 => MANIFEST-001074} | Bin 157 -> 175 bytes packs/origins/{001071.log => 001076.log} | 0 packs/origins/CURRENT | 2 +- packs/origins/LOG | 11 +- packs/origins/LOG.old | 16 +- .../{MANIFEST-001070 => MANIFEST-001074} | Bin 158 -> 176 bytes .../{001071.log => 001076.log} | 0 packs/potions-alchimie/CURRENT | 2 +- packs/potions-alchimie/LOG | 11 +- packs/potions-alchimie/LOG.old | 16 +- .../{MANIFEST-001070 => MANIFEST-001074} | Bin 157 -> 175 bytes packs/races/{001071.log => 001076.log} | 0 packs/races/CURRENT | 2 +- packs/races/LOG | 11 +- packs/races/LOG.old | 16 +- .../{MANIFEST-001070 => MANIFEST-001074} | Bin 156 -> 173 bytes packs/spells/{001071.log => 001076.log} | 0 packs/spells/CURRENT | 2 +- packs/spells/LOG | 11 +- packs/spells/LOG.old | 16 +- .../{MANIFEST-001070 => MANIFEST-001074} | Bin 156 -> 173 bytes .../vehicleweapons/{000978.log => 000983.log} | 0 packs/vehicleweapons/CURRENT | 2 +- packs/vehicleweapons/LOG | 11 +- packs/vehicleweapons/LOG.old | 16 +- .../{MANIFEST-000977 => MANIFEST-000981} | Bin 156 -> 173 bytes packs/weapons/{000984.log => 000989.log} | 0 packs/weapons/CURRENT | 2 +- packs/weapons/LOG | 11 +- packs/weapons/LOG.old | 16 +- .../{MANIFEST-000983 => MANIFEST-000987} | Bin 158 -> 176 bytes styles/components/actor.less | 184 ++- styles/components/common.less | 175 +++ styles/components/item.less | 18 +- styles/global/chat.less | 669 +++++++++- styles/global/forms.less | 11 + styles/global/typography.less | 16 + templates/actor/horde-sheet.hbs | 30 +- templates/actor/parts/actor-header.hbs | 2 +- templates/actor/parts/tabs/actor-biodata.hbs | 2 +- .../actor/parts/tabs/creature-actions.hbs | 9 +- templates/actor/parts/tabs/creature-stats.hbs | 24 +- .../actor/parts/tabs/horde-description.hbs | 5 +- .../actor/parts/tabs/vehicle-description.hbs | 5 +- templates/actor/parts/tabs/vehicle-stats.hbs | 16 +- .../actor/parts/tabs/vehicle-weapons.hbs | 3 +- templates/actor/vehicle-sheet.hbs | 9 +- .../apps/character-summary-template.html | 203 ++-- templates/chat/chat-vitality-zero.hbs | 58 +- templates/chat/chat-welcome.hbs | 20 + templates/chat/rolls/alchemy-roll-card.hbs | 24 +- templates/chat/rolls/damage-roll-card.hbs | 39 +- templates/chat/rolls/defense-request-card.hbs | 47 +- templates/chat/rolls/defense-result-card.hbs | 55 +- templates/chat/rolls/defense-summary-card.hbs | 32 +- templates/chat/rolls/horoscope-roll-card.hbs | 55 +- templates/chat/rolls/spell-roll-card.hbs | 15 +- templates/dialogs/adv-roll-part.hbs | 12 +- templates/dialogs/mod-roll-part.hbs | 6 +- .../item/weapon-vehicle-properties.hbs | 12 +- 130 files changed, 2998 insertions(+), 741 deletions(-) rename packs/aides-de-jeu/{001073.log => 001078.log} (100%) rename packs/aides-de-jeu/{MANIFEST-001072 => MANIFEST-001076} (84%) rename packs/armors/{000978.log => 000983.log} (100%) rename packs/armors/{MANIFEST-000977 => MANIFEST-000981} (73%) rename packs/boons/{001072.log => 001077.log} (100%) rename packs/boons/{MANIFEST-001071 => MANIFEST-001075} (72%) rename packs/boonsflawscreatures/{001071.log => 001076.log} (100%) rename packs/boonsflawscreatures/{MANIFEST-001070 => MANIFEST-001074} (73%) rename packs/careers/{001071.log => 001076.log} (100%) rename packs/careers/{MANIFEST-001070 => MANIFEST-001074} (72%) rename packs/effets-exemples/{001069.log => 001074.log} (100%) rename packs/effets-exemples/{MANIFEST-001068 => MANIFEST-001072} (73%) rename packs/equipment/{001072.log => 001077.log} (100%) rename packs/equipment/{MANIFEST-001071 => MANIFEST-001075} (73%) rename packs/fightoptions/{001071.log => 001076.log} (100%) rename packs/fightoptions/{MANIFEST-001070 => MANIFEST-001074} (73%) rename packs/fightoptionsfanmade/{000554.log => 000559.log} (100%) rename packs/fightoptionsfanmade/{MANIFEST-000553 => MANIFEST-000557} (73%) rename packs/flaws/{001072.log => 001077.log} (100%) rename packs/flaws/{MANIFEST-001071 => MANIFEST-001075} (72%) rename packs/languages/{001071.log => 001076.log} (100%) rename packs/languages/{MANIFEST-001070 => MANIFEST-001074} (73%) rename packs/objets-alchimie/{001071.log => 001076.log} (100%) rename packs/objets-alchimie/{MANIFEST-001070 => MANIFEST-001074} (73%) rename packs/origins/{001071.log => 001076.log} (100%) rename packs/origins/{MANIFEST-001070 => MANIFEST-001074} (72%) rename packs/potions-alchimie/{001071.log => 001076.log} (100%) rename packs/potions-alchimie/{MANIFEST-001070 => MANIFEST-001074} (73%) rename packs/races/{001071.log => 001076.log} (100%) rename packs/races/{MANIFEST-001070 => MANIFEST-001074} (73%) rename packs/spells/{001071.log => 001076.log} (100%) rename packs/spells/{MANIFEST-001070 => MANIFEST-001074} (73%) rename packs/vehicleweapons/{000978.log => 000983.log} (100%) rename packs/vehicleweapons/{MANIFEST-000977 => MANIFEST-000981} (73%) rename packs/weapons/{000984.log => 000989.log} (100%) rename packs/weapons/{MANIFEST-000983 => MANIFEST-000987} (72%) create mode 100644 templates/chat/chat-welcome.hbs diff --git a/css/bol.css b/css/bol.css index cdfca74..d8bec7f 100644 --- a/css/bol.css +++ b/css/bol.css @@ -12,6 +12,20 @@ font-display: swap; src: url(https://fonts.gstatic.com/s/contrailone/v10/eLGbP-j_JA-kG0_Zo51noafdZQ.ttf) format('truetype'); } +@font-face { + font-family: 'Orbitron'; + font-style: normal; + font-weight: 400; + font-display: swap; + src: url(https://fonts.gstatic.com/s/orbitron/v31/yMJMMIlzdpvBhQQL_SC3X9yhF25-T1nyGy6BoWgz.woff2) format('woff2'); +} +@font-face { + font-family: 'Orbitron'; + font-style: normal; + font-weight: 700; + font-display: swap; + src: url(https://fonts.gstatic.com/s/orbitron/v31/yMJMMIlzdpvBhQQL_SC3X9yhF25-T1nyKS6BoWgz.woff2) format('woff2'); +} @font-face { font-family: "CCMeanwhile"; src: url('../fonts/ccmeanwhile-regular.ttf'); @@ -230,6 +244,9 @@ ul.no-bullets { /* ----------------------------------------- */ /* Form Styles */ /* ----------------------------------------- */ +.bol { + /* Hide number input spinners */ +} .bol input[readonly="true"] { border: none; color: dimgray; @@ -248,6 +265,15 @@ ul.no-bullets { border: none; box-shadow: none; } +.bol input[type="number"]::-webkit-inner-spin-button, +.bol input[type="number"]::-webkit-outer-spin-button { + -webkit-appearance: none; + margin: 0; +} +.bol input[type="number"] { + -moz-appearance: textfield; + appearance: textfield; +} .bol input:disabled:hover, .bol select:disabled:hover, .bol textarea:disabled:hover, @@ -761,20 +787,30 @@ ul.no-bullets { font-weight: bold; } .message-header h2.critical { - color: green; + font-family: "Wolfsbane2Expanded", cursive; + color: #1a7a1a; font-weight: bold; + font-size: 1.1rem; + text-shadow: 0 1px 2px rgba(0, 0, 0, 0.15); } .message-header h2.fumble { - color: red; + font-family: "Wolfsbane2Expanded", cursive; + color: #8b0000; font-weight: bold; + font-size: 1.1rem; + text-shadow: 0 1px 2px rgba(0, 0, 0, 0.15); } .message-header h2.success { - color: darkgreen; + font-family: "Wolfsbane2Expanded", cursive; + color: #1a5c1a; font-weight: bold; + font-size: 1.05rem; } .message-header h2.failure { + font-family: "Wolfsbane2Expanded", cursive; color: darkred; font-weight: bold; + font-size: 1.05rem; } .message-header h2.roll { color: darkslategrey; @@ -790,39 +826,667 @@ h2.bad { } .chat-message { margin: 3px; - padding: 10px; - font-size: 14px; - border-radius: 0; - background-color: white; - background-image: url("/systems/bol/ui/box-border-large.webp"); - background-repeat: no-repeat; - background-size: 100% 100%; + padding: 6px 8px; + font-size: 13px; + border-radius: 3px; + background-color: #faf7f2; + border: 1px solid #d4c8b0; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.12); } .chat-message .message-header .flavor-text { font-family: "IMFellDWPicaSC-Regular", serif; font-size: 14px; } .chat-message .message-header .flavor-text h2 { - font-family: "Modesto Condensed", "Palatino Linotype", serif; - font-size: 20px; + font-family: "Wolfsbane2Expanded", cursive; + font-size: 1.1rem; + margin: 2px 0; +} +.chat-message h2.success, +.chat-message h2.failure, +.chat-message h2.critical, +.chat-message h2.fumble { + display: flex; + align-items: center; + gap: 6px; + padding: 4px 10px; + border-radius: 4px; + margin: 0 0 6px 0; + font-size: 1rem; + letter-spacing: 0.5px; +} +.chat-message h2.success i, +.chat-message h2.failure i, +.chat-message h2.critical i, +.chat-message h2.fumble i { + font-size: 0.9em; +} +.chat-message h2.success, +.chat-message h2.critical { + background: linear-gradient(135deg, #1a5c1a20, #2d7a2d15); + border: 1px solid #4caf5040; + color: #1a5c1a; +} +.chat-message h2.critical { + background: linear-gradient(135deg, #1a5c1a30, #2d7a2d25); + border-color: #4caf5070; +} +.chat-message h2.failure { + background: linear-gradient(135deg, #7a000015, #8b000010); + border: 1px solid #8b000030; + color: #8b0000; +} +.chat-message h2.fumble { + background: linear-gradient(135deg, #7a000025, #8b000020); + border: 1px solid #8b000060; + color: #6b0000; +} +.chat-message h3 { + font-family: "Wolfsbane2Expanded", cursive; + font-size: 0.95rem; + color: #191813; + margin: 2px 0 5px 0; + border-bottom: 1px solid #d4c8b0; + padding-bottom: 3px; + letter-spacing: 0.3px; +} +.chat-message .chat-icon { + float: right; + border: 1px solid #c4a882; + box-shadow: 1px 1px 3px rgba(0, 0, 0, 0.25); + border-radius: 3px; + margin: 0 0 4px 6px; + width: 52px; + height: 52px; + object-fit: cover; +} +.chat-message .actions-section { + font-size: 0.82rem; + color: #4b4a44; + line-height: 1.4; +} +.chat-message .actions-section > div { + margin: 2px 0; +} +.chat-message .chat-button, +.chat-message .chat-damage-roll, +.chat-message .chat-damage-apply, +.chat-message .damage-handling, +.chat-message .recup-vitalite { + display: block; + width: 100%; + margin: 3px 0; + padding: 4px 10px; + background: linear-gradient(135deg, #2a2a2a, #4b4a44); + color: #e8e0d0; + border: 1px solid #2a2a2a; + border-radius: 4px; + font-family: "Wolfsbane2Expanded", cursive; + font-size: 0.82rem; + letter-spacing: 0.4px; + cursor: pointer; + text-align: center; + transition: background 0.15s; +} +.chat-message .chat-button:hover, +.chat-message .chat-damage-roll:hover, +.chat-message .chat-damage-apply:hover, +.chat-message .damage-handling:hover, +.chat-message .recup-vitalite:hover { + background: linear-gradient(135deg, #3a3a3a, #5b5a54); +} +.chat-message .chat-button.hero-reroll, +.chat-message .chat-damage-roll.hero-reroll, +.chat-message .chat-damage-apply.hero-reroll, +.chat-message .damage-handling.hero-reroll, +.chat-message .recup-vitalite.hero-reroll { + background: linear-gradient(135deg, #7a5500, #a07000); + border-color: #6a4500; +} +.chat-message .chat-button.hero-reroll:hover, +.chat-message .chat-damage-roll.hero-reroll:hover, +.chat-message .chat-damage-apply.hero-reroll:hover, +.chat-message .damage-handling.hero-reroll:hover, +.chat-message .recup-vitalite.hero-reroll:hover { + background: linear-gradient(135deg, #9a6500, #c08000); +} +.chat-message .chat-button.transform-heroic-roll, +.chat-message .chat-damage-roll.transform-heroic-roll, +.chat-message .chat-damage-apply.transform-heroic-roll, +.chat-message .damage-handling.transform-heroic-roll, +.chat-message .recup-vitalite.transform-heroic-roll, +.chat-message .chat-button.transform-legendary-roll, +.chat-message .chat-damage-roll.transform-legendary-roll, +.chat-message .chat-damage-apply.transform-legendary-roll, +.chat-message .damage-handling.transform-legendary-roll, +.chat-message .recup-vitalite.transform-legendary-roll { + background: linear-gradient(135deg, #7a0000, darkred); + border-color: #6b0000; +} +.chat-message .chat-button.transform-heroic-roll:hover, +.chat-message .chat-damage-roll.transform-heroic-roll:hover, +.chat-message .chat-damage-apply.transform-heroic-roll:hover, +.chat-message .damage-handling.transform-heroic-roll:hover, +.chat-message .recup-vitalite.transform-heroic-roll:hover, +.chat-message .chat-button.transform-legendary-roll:hover, +.chat-message .chat-damage-roll.transform-legendary-roll:hover, +.chat-message .chat-damage-apply.transform-legendary-roll:hover, +.chat-message .damage-handling.transform-legendary-roll:hover, +.chat-message .recup-vitalite.transform-legendary-roll:hover { + background: linear-gradient(135deg, #9b0000, #c00000); +} +.chat-message .chat-damage-roll[data-damage-mode="normal-damage"] { + background: linear-gradient(135deg, #7a0000, darkred); + border-color: #6b0000; +} +.chat-message .chat-damage-roll[data-damage-mode="normal-damage"]:hover { + background: linear-gradient(135deg, #9b0000, #c00000); +} +.chat-message .chat-damage-roll[data-damage-mode^="damage-plus"] { + background: linear-gradient(135deg, #5a0070, #7a00a0); + border-color: #4a0060; +} +.chat-message .chat-damage-roll[data-damage-mode^="damage-plus"]:hover { + background: linear-gradient(135deg, #7a0090, #9a00c0); +} +.chat-message .chat-damage-apply { + background: linear-gradient(135deg, #7a0000, darkred); + border-color: #6b0000; +} +.chat-message .chat-damage-apply:hover { + background: linear-gradient(135deg, #9b0000, #c00000); +} +.chat-message .recup-vitalite { + background: linear-gradient(135deg, #1a5c1a, #2d7a2d); + border-color: #1a4a1a; +} +.chat-message .recup-vitalite:hover { + background: linear-gradient(135deg, #2a7a2a, #3d9a3d); +} +.chat-message .damage-handling { + background: linear-gradient(135deg, #7a5500, #a07000); + border-color: #6a4500; +} +.chat-message .damage-handling:hover { + background: linear-gradient(135deg, #9a6500, #c08000); +} +.chat-message .damage-handling[data-defense-mode="damage-not-applied"] { + background: linear-gradient(135deg, #1a5c1a, #2d7a2d); + border-color: #1a4a1a; +} +.chat-message .damage-handling[data-defense-mode="damage-not-applied"]:hover { + background: linear-gradient(135deg, #2a7a2a, #3d9a3d); +} +.chat-message .damage-handling[data-defense-mode="hero-in-extremis"], +.chat-message .damage-handling[data-defense-mode="hero-reduce-damage"] { + background: linear-gradient(135deg, #7a0000, darkred); + border-color: #6b0000; +} +.chat-message .damage-handling[data-defense-mode="hero-in-extremis"]:hover, +.chat-message .damage-handling[data-defense-mode="hero-reduce-damage"]:hover { + background: linear-gradient(135deg, #9b0000, #c00000); +} +.chat-message .bol-damage-card .damage-card-header, +.chat-message .bol-defense-card .damage-card-header, +.chat-message .bol-damage-card .defense-card-header, +.chat-message .bol-defense-card .defense-card-header { + display: flex; + align-items: center; + gap: 8px; + margin-bottom: 6px; + padding-bottom: 5px; + border-bottom: 1px solid #d4c8b0; +} +.chat-message .bol-damage-card .damage-card-header .damage-weapon-img, +.chat-message .bol-defense-card .damage-card-header .damage-weapon-img, +.chat-message .bol-damage-card .defense-card-header .damage-weapon-img, +.chat-message .bol-defense-card .defense-card-header .damage-weapon-img { + width: 44px; + height: 44px; + border: 1px solid #c4a882; + border-radius: 3px; + box-shadow: 1px 1px 3px rgba(0, 0, 0, 0.25); + object-fit: cover; + flex: 0 0 44px; +} +.chat-message .bol-damage-card .damage-card-header .damage-card-title, +.chat-message .bol-defense-card .damage-card-header .damage-card-title, +.chat-message .bol-damage-card .defense-card-header .damage-card-title, +.chat-message .bol-defense-card .defense-card-header .damage-card-title { + flex: 1; + display: flex; + flex-direction: column; + gap: 2px; +} +.chat-message .bol-damage-card .damage-card-header .damage-card-title .damage-card-label, +.chat-message .bol-defense-card .damage-card-header .damage-card-title .damage-card-label, +.chat-message .bol-damage-card .defense-card-header .damage-card-title .damage-card-label, +.chat-message .bol-defense-card .defense-card-header .damage-card-title .damage-card-label { + font-family: "Wolfsbane2Expanded", cursive; + font-size: 0.75rem; + color: #7a0000; + letter-spacing: 0.5px; + text-transform: uppercase; +} +.chat-message .bol-damage-card .damage-card-header .damage-card-title .damage-weapon-name, +.chat-message .bol-defense-card .damage-card-header .damage-card-title .damage-weapon-name, +.chat-message .bol-damage-card .defense-card-header .damage-card-title .damage-weapon-name, +.chat-message .bol-defense-card .defense-card-header .damage-card-title .damage-weapon-name { + font-family: "Wolfsbane2Expanded", cursive; + font-size: 0.9rem; + color: #191813; + letter-spacing: 0.3px; +} +.chat-message .bol-damage-card .damage-card-header .damage-card-title .damage-formula, +.chat-message .bol-defense-card .damage-card-header .damage-card-title .damage-formula, +.chat-message .bol-damage-card .defense-card-header .damage-card-title .damage-formula, +.chat-message .bol-defense-card .defense-card-header .damage-card-title .damage-formula { + font-size: 0.78rem; + color: #6b6b5a; + font-style: italic; +} +.chat-message .bol-damage-card .damage-card-header .damage-card-title .damage-total-badge, +.chat-message .bol-defense-card .damage-card-header .damage-card-title .damage-total-badge, +.chat-message .bol-damage-card .defense-card-header .damage-card-title .damage-total-badge, +.chat-message .bol-defense-card .defense-card-header .damage-card-title .damage-total-badge { + display: inline-block; + background: linear-gradient(135deg, #7a0000, darkred); + color: #e8d890; + font-family: "Wolfsbane2Expanded", cursive; + font-size: 1.2rem; + font-weight: bold; + padding: 1px 10px; + border-radius: 4px; + letter-spacing: 1px; + align-self: flex-start; +} +.chat-message .bol-damage-card .damage-card-header .damage-card-title .damage-total-badge.damage-total-badge--hit, +.chat-message .bol-defense-card .damage-card-header .damage-card-title .damage-total-badge.damage-total-badge--hit, +.chat-message .bol-damage-card .defense-card-header .damage-card-title .damage-total-badge.damage-total-badge--hit, +.chat-message .bol-defense-card .defense-card-header .damage-card-title .damage-total-badge.damage-total-badge--hit { + background: linear-gradient(135deg, #7a5500, #a07000); +} +.chat-message .bol-damage-card .damage-target, +.chat-message .bol-defense-card .damage-target { + font-size: 0.8rem; + color: #4b4a44; + font-style: italic; + margin-bottom: 4px; +} +.chat-message .bol-damage-card .damage-note, +.chat-message .bol-defense-card .damage-note { + font-size: 0.78rem; + color: #4b4a44; + padding: 2px 6px; + margin-bottom: 4px; + border-left: 2px solid #c4a882; +} +.chat-message .bol-damage-card .damage-note.damage-note--warn, +.chat-message .bol-defense-card .damage-note.damage-note--warn { + border-left-color: darkred; + color: darkred; +} +.chat-message .bol-damage-card .defense-hero-separator, +.chat-message .bol-defense-card .defense-hero-separator { + text-align: center; + font-size: 0.72rem; + color: #8b7355; + font-family: "IMFellDWPicaSC-Regular", serif; + font-style: italic; + margin: 3px 0 1px; +} +.chat-message .bol-damage-card .defense-footer-note, +.chat-message .bol-defense-card .defense-footer-note { + font-size: 0.72rem; + color: #8b7355; + font-style: italic; + text-align: center; + margin-top: 4px; + padding-top: 3px; + border-top: 1px dashed #d4c8b0; +} +.chat-message .bol-defense-summary-card .defense-summary-header { + display: flex; + align-items: center; + gap: 8px; + margin-bottom: 6px; + padding-bottom: 5px; + border-bottom: 1px solid #d4c8b0; +} +.chat-message .bol-defense-summary-card .defense-summary-header .damage-weapon-img { + width: 44px; + height: 44px; + border: 1px solid #c4a882; + border-radius: 3px; + box-shadow: 1px 1px 3px rgba(0, 0, 0, 0.25); + object-fit: cover; + flex: 0 0 44px; +} +.chat-message .bol-defense-summary-card .defense-summary-details { + display: flex; + flex-direction: column; + gap: 3px; +} +.chat-message .bol-defense-summary-card .defense-detail { + font-size: 0.82rem; + color: #4b4a44; + padding: 1px 4px; + border-left: 2px solid #c4a882; +} +.chat-message .bol-defense-summary-card .defense-detail.warning { + border-left-color: darkred; + color: darkred; +} +.chat-message .bol-defense-summary-card .defense-final { + margin-top: 5px; + padding: 3px 8px; + font-family: "Wolfsbane2Expanded", cursive; + font-size: 0.9rem; + color: #191813; + background: #f0ece0; + border-radius: 3px; + border-left: 3px solid darkred; +} +.chat-message .bol-defense-summary-card .defense-final.defense-final--safe { + border-left-color: #4a7a4a; + color: #2a5a2a; + background: #e8f5e8; +} +.chat-message .bol-defense-summary-card .damage-total-badge--none { + background: linear-gradient(135deg, #4a7a4a, #2d5a2d) !important; +} +.chat-message .bol-vitality-card .vitality-card-header { + display: flex; + align-items: center; + gap: 8px; + margin-bottom: 6px; + padding-bottom: 5px; + border-bottom: 2px solid #4b1010; +} +.chat-message .bol-vitality-card .vitality-card-header .damage-weapon-img { + width: 44px; + height: 44px; + border: 1px solid #c4a882; + border-radius: 3px; + box-shadow: 1px 1px 3px rgba(0, 0, 0, 0.25); + object-fit: cover; + flex: 0 0 44px; +} +.chat-message .bol-vitality-card .vitality-card-body { + display: flex; + flex-direction: column; + gap: 3px; +} +.chat-message .bol-vitality-card .vitality-detail { + font-size: 0.82rem; + color: #4b4a44; + padding: 1px 4px; + border-left: 2px solid #c4a882; +} +.chat-message .bol-vitality-card .vitality-hint { + font-size: 0.78rem; + color: #6b6b5a; + font-style: italic; + padding-left: 6px; +} +.chat-message .bol-vitality-card .vitality-dead { + margin-top: 4px; + padding: 3px 8px; + font-family: "Wolfsbane2Expanded", cursive; + font-size: 0.9rem; + color: #f0e8d0; + background: linear-gradient(135deg, #4b1010, #7a0000); + border-radius: 3px; +} +.chat-message .bol-vitality-card .vitality-epitaph { + font-size: 0.78rem; + color: #6b6b5a; + font-style: italic; + text-align: center; + margin-top: 3px; +} +.chat-message .bol-spell-card { + margin: 6px 0; +} +.chat-message .bol-spell-card .spell-card-header { + display: flex; + align-items: center; + gap: 8px; + padding: 5px 0; + border-bottom: 1px solid #d4c8b0; +} +.chat-message .bol-spell-card .spell-card-header .spell-img { + width: 40px; + height: 40px; + border: 1px solid #c4a882; + border-radius: 3px; + object-fit: cover; + flex: 0 0 40px; +} +.chat-message .bol-spell-card .spell-card-header .spell-card-title { + flex: 1; + display: flex; + flex-direction: column; + gap: 3px; +} +.chat-message .bol-spell-card .spell-card-header .spell-card-title .spell-name { + font-family: "Wolfsbane2Expanded", cursive; + font-size: 0.9rem; + color: #191813; +} +.chat-message .bol-spell-card .spell-card-header .spell-card-title .spell-stats { + display: flex; + flex-wrap: wrap; + gap: 4px; +} +.chat-message .bol-spell-card .spell-card-header .spell-card-title .spell-stats .spell-stat-badge { + display: inline-block; + font-family: "Wolfsbane2Expanded", cursive; + font-size: 0.72rem; + padding: 1px 7px; + border-radius: 3px; + letter-spacing: 0.3px; +} +.chat-message .bol-spell-card .spell-card-header .spell-card-title .spell-stats .spell-stat-badge.cost { + background: linear-gradient(135deg, #3a0080, #6a00c0); + color: #e8d0ff; + border: 1px solid #5a00a0; +} +.chat-message .bol-spell-card .spell-card-header .spell-card-title .spell-stats .spell-stat-badge.remaining { + background: linear-gradient(135deg, #1a4a6a, #2a6a9a); + color: #d0e8ff; + border: 1px solid #1a3a5a; +} +.chat-message .bol-alchemy-card { + margin: 6px 0; +} +.chat-message .bol-alchemy-card .alchemy-card-header { + display: flex; + align-items: center; + gap: 8px; + padding-bottom: 5px; + border-bottom: 1px solid #d4c8b0; +} +.chat-message .bol-alchemy-card .alchemy-card-header .alchemy-img { + width: 40px; + height: 40px; + border: 1px solid #c4a882; + border-radius: 3px; + object-fit: cover; + flex: 0 0 40px; +} +.chat-message .bol-alchemy-card .alchemy-card-header .alchemy-card-title { + flex: 1; + display: flex; + flex-direction: column; + gap: 3px; +} +.chat-message .bol-alchemy-card .alchemy-card-header .alchemy-card-title .alchemy-name { + font-family: "Wolfsbane2Expanded", cursive; + font-size: 0.9rem; + color: #191813; +} +.chat-message .bol-alchemy-card .alchemy-card-header .alchemy-card-title .alchemy-stat-badge { + display: inline-block; + font-family: "Wolfsbane2Expanded", cursive; + font-size: 0.72rem; + padding: 1px 7px; + border-radius: 3px; + background: linear-gradient(135deg, #5a3a00, #8a6000); + color: #ffe0a0; + border: 1px solid #4a3000; +} +.chat-message .bol-alchemy-card .alchemy-result { + font-size: 0.78rem; + font-style: italic; + padding: 4px 6px; + margin-top: 5px; + border-radius: 3px; + line-height: 1.4; +} +.chat-message .bol-alchemy-card .alchemy-result.success { + color: #1a4a1a; + background: #e8f5e8; + border: 1px solid #a0d0a0; +} +.chat-message .bol-alchemy-card .alchemy-result.failure { + color: #4a1a1a; + background: #f5e8e8; + border: 1px solid #d0a0a0; +} +.chat-message .bol-horoscope-card { + margin: 6px 0; +} +.chat-message .bol-horoscope-card .horoscope-card-header { + display: flex; + align-items: center; + gap: 8px; + padding-bottom: 5px; + border-bottom: 1px solid #d4c8b0; +} +.chat-message .bol-horoscope-card .horoscope-card-header .horoscope-icon { + font-size: 1.6rem; + color: #8a6500; + flex: 0 0 auto; +} +.chat-message .bol-horoscope-card .horoscope-card-header .horoscope-card-title { + flex: 1; + display: flex; + flex-direction: column; + gap: 3px; +} +.chat-message .bol-horoscope-card .horoscope-card-header .horoscope-card-title .horoscope-type { + font-family: "Wolfsbane2Expanded", cursive; + font-size: 0.9rem; + color: #191813; +} +.chat-message .bol-horoscope-card .horoscope-card-header .horoscope-card-title .horoscope-stat-badge { + display: inline-block; + font-family: "Wolfsbane2Expanded", cursive; + font-size: 0.72rem; + padding: 1px 7px; + border-radius: 3px; + background: linear-gradient(135deg, #6a5500, #a08000); + color: #ffe890; + border: 1px solid #5a4500; +} +.chat-message .bol-horoscope-card .horoscope-result .horoscope-text { + display: block; + font-size: 0.78rem; + font-style: italic; + padding: 4px 6px; + margin-top: 5px; + border-radius: 3px; + line-height: 1.4; +} +.chat-message .bol-horoscope-card .horoscope-result .horoscope-text.success { + color: #1a4a1a; + background: #e8f5e8; + border: 1px solid #a0d0a0; +} +.chat-message .bol-horoscope-card .horoscope-result .horoscope-text.failure { + color: #4a1a1a; + background: #f5e8e8; + border: 1px solid #d0a0a0; } .chat-message .message-content .dice-roll .dice-result .dice-formula { - border-radius: 0px; - border: 1px inset lightgray; - background-color: #282828; - color: white; + border-radius: 4px; + border: 1px solid #555; + background: linear-gradient(135deg, #1a1a1a, #2a2a2a); + color: #d0c8b8; + font-size: 0.8rem; + padding: 2px 8px; + text-align: center; + margin-bottom: 3px; +} +.chat-message .message-content .dice-roll .dice-result .dice-tooltip { + background: #1a1a1a; + border: 1px solid #444; + border-radius: 4px; } .chat-message .message-content .dice-roll .dice-result .dice-tooltip .tooltip-part .part-total { - border-radius: 0px; - border: 1px inset lightgray; + border-radius: 0; + border: 1px inset #444; background-color: #2a2a2a; - color: white; + color: #d0c8b8; } .chat-message .message-content .dice-roll .dice-result .dice-total { - border-radius: 0px; - border: 1px inset lightgray; - background-color: #2a2a2a; - color: white; + border-radius: 4px; + border: 2px solid #4b4a44; + background: linear-gradient(135deg, #191813, #2a2a2a); + color: #e8d890; + font-family: "Wolfsbane2Expanded", cursive; + font-size: 1.4rem; + font-weight: bold; + letter-spacing: 1px; + padding: 2px 0; + margin-top: 3px; +} +.bol-welcome-card .welcome-header { + display: flex; + align-items: center; + gap: 10px; + margin-bottom: 8px; + padding-bottom: 6px; + border-bottom: 2px solid darkred; +} +.bol-welcome-card .welcome-header .welcome-logo { + width: 52px; + height: 52px; + object-fit: contain; + flex: 0 0 52px; +} +.bol-welcome-card .welcome-body { + font-size: 0.82rem; + color: #191813; + line-height: 1.4; +} +.bol-welcome-card .welcome-body p { + margin: 4px 0; + padding-left: 4px; + border-left: 2px solid #d4c8b0; +} +.bol-welcome-card .welcome-body a { + color: darkred; +} +.bol-welcome-card .welcome-footer { + margin-top: 8px; + padding: 4px 10px; + font-family: "Wolfsbane2Expanded", cursive; + font-size: 0.95rem; + color: #e8d890; + background: linear-gradient(135deg, #7a0000, darkred); + border-radius: 4px; + letter-spacing: 0.5px; +} +.bol-welcome-card .welcome-warning { + margin-top: 6px; + padding: 4px 8px; + font-size: 0.8rem; + color: #7a0000; + background: #fff3f3; + border: 1px solid #e57373; + border-radius: 3px; } /* Component Styles */ /* ----------------------------------------- */ @@ -834,6 +1498,174 @@ body.system-bol img#logo { .journal-page-content { /* Reserved for future use */ } +.bol.dialog > section.window-content { + background: white; + border: 10px solid transparent; + border-image: url("/systems/bol/ui/box-border-large.webp") 36 repeat; + border-image-outset: 1; + padding: 10px; +} +.bol.dialog .window-title { + font-family: "Wolfsbane2Expanded", cursive; + color: #4b4a44; +} +.bol.dialog .sheet-header { + text-align: center; + margin-bottom: 6px; + padding: 4px 0; + border-bottom: 2px solid darkred; +} +.bol.dialog .sheet-header h3 { + font-family: "Wolfsbane2Expanded", cursive; + font-size: 1.3rem; + color: #191813; + margin: 0; +} +.bol.dialog .roll-box, +.bol.dialog .box-roll, +.bol.dialog div.flexrow:has(.bg-darkred) { + border-radius: 6px; + overflow: hidden; + margin-bottom: 1px; + background: #f5f0e8; + gap: 2px; +} +.bol.dialog .roll-box .bg-darkred, +.bol.dialog .box-roll .bg-darkred, +.bol.dialog div.flexrow:has(.bg-darkred) .bg-darkred { + padding: 4px 10px; + font-family: "Wolfsbane2Expanded", cursive; + font-size: 0.78rem; + letter-spacing: 0.6px; + border-radius: 5px; + margin: 2px 0 2px 2px; + background: linear-gradient(135deg, #7a0000, darkred); + text-shadow: 0 1px 2px rgba(0, 0, 0, 0.4); +} +.bol.dialog .roll-box .cell, +.bol.dialog .box-roll .cell, +.bol.dialog div.flexrow:has(.bg-darkred) .cell { + background: transparent; + padding: 2px 6px; + display: flex; + align-items: center; + justify-content: center; + color: #191813; + flex-wrap: wrap; +} +.bol.dialog .roll-box .cell label.checkbox, +.bol.dialog .box-roll .cell label.checkbox, +.bol.dialog div.flexrow:has(.bg-darkred) .cell label.checkbox { + display: flex; + justify-content: center; + align-items: center; + width: 100%; +} +.bol.dialog select, +.bol.dialog input[type="text"], +.bol.dialog input[type="number"] { + background: transparent !important; + color: #191813 !important; + border: none !important; + box-shadow: none !important; + font-size: 0.88rem; + width: 100%; +} +.bol.dialog select option, +.bol.dialog input[type="text"] option, +.bol.dialog input[type="number"] option { + background: #f5f0e8; + color: #191813; +} +.bol.dialog select option:checked, +.bol.dialog input[type="text"] option:checked, +.bol.dialog input[type="number"] option:checked, +.bol.dialog select option:hover, +.bol.dialog input[type="text"] option:hover, +.bol.dialog input[type="number"] option:hover { + background: darkred; + color: white; +} +.bol.dialog input:disabled { + color: #8b0000 !important; + font-weight: bold; + font-size: 0.95rem; +} +.bol.dialog .dice-options-cell { + display: flex !important; + flex-wrap: wrap; + gap: 4px; + padding: 4px 6px; + justify-content: center; +} +.bol.dialog .dice-options-cell .dice-option { + display: flex; + align-items: center; + gap: 3px; + padding: 2px 7px; + border-radius: 4px; + font-size: 0.82rem; + cursor: pointer; + white-space: nowrap; +} +.bol.dialog .dice-options-cell .dice-option input[type="radio"] { + margin: 0; +} +.bol.dialog .dice-options-cell .bdice-label { + background: #e8f5e8; + color: #1a5c1a; + border: 1px solid #4caf50; +} +.bol.dialog .dice-options-cell .neutral-label { + background: #f0ede5; + color: #4b4a44; + border: 1px solid #9e9e7a; +} +.bol.dialog .dice-options-cell .mdice-label { + background: #fce8e8; + color: #7a0000; + border: 1px solid #e57373; +} +.bol.sheet footer.form-footer, +.bol.dialog footer.form-footer { + display: flex; + gap: 8px; + margin-top: 8px; + padding-top: 6px; + border-top: 2px solid darkred; +} +.bol.sheet footer.form-footer button, +.bol.dialog footer.form-footer button { + flex: 1; + background: linear-gradient(135deg, #7a0000, darkred); + color: white; + border: 1px solid #6b0000; + border-radius: 5px; + padding: 5px 10px; + font-family: "Wolfsbane2Expanded", cursive; + font-size: 0.95rem; + letter-spacing: 0.6px; + text-shadow: 0 1px 2px rgba(0, 0, 0, 0.4); + cursor: pointer; + transition: background 0.15s; +} +.bol.sheet footer.form-footer button i, +.bol.dialog footer.form-footer button i { + margin-right: 4px; +} +.bol.sheet footer.form-footer button:hover, +.bol.dialog footer.form-footer button:hover { + background: linear-gradient(135deg, #9b0000, #c00000); +} +.bol.sheet footer.form-footer button[type="button"], +.bol.dialog footer.form-footer button[type="button"] { + background: linear-gradient(135deg, #2a2a2a, #4b4a44); + border-color: #2a2a2a; +} +.bol.sheet footer.form-footer button[type="button"]:hover, +.bol.dialog footer.form-footer button[type="button"]:hover { + background: linear-gradient(135deg, #3a3a3a, #5b5a54); +} .bol.sheet .window-header { border: none; } @@ -907,6 +1739,12 @@ body.system-bol img#logo { border-radius: 0.5rem; text-align: center; } +.bol.sheet .window-content .bol-actor-form .sheet-header .header-field .header-field-group .header-field-value[type="select"], +.bol.sheet .window-content .bol-actor-form .sheet-header .header-field .header-field-group .header-field-value:is(select) { + border: 1px solid #4b4a44 !important; + border-radius: 0.5rem; + background-color: #2a2a2a30; +} .bol.sheet .window-content .bol-actor-form .sheet-header .header-buttons { align-self: flex-end; padding-bottom: 10px; @@ -974,6 +1812,17 @@ body.system-bol img#logo { margin-top: 6px; margin-bottom: 6px; } +.bol.sheet .window-content .bol-actor-form .main .sheet-body .tab.stats .editor, +.bol.sheet .window-content .bol-actor-form .main .sheet-body .tab.stats .editor-content, +.bol.sheet .window-content .bol-actor-form .main .sheet-body .tab.stats prose-mirror { + color: #191813; +} +.bol.sheet .window-content .bol-actor-form .main .sheet-body .tab.stats prose-mirror .editor-content, +.bol.sheet .window-content .bol-actor-form .main .sheet-body .tab.stats prose-mirror p, +.bol.sheet .window-content .bol-actor-form .main .sheet-body .tab.stats prose-mirror div, +.bol.sheet .window-content .bol-actor-form .main .sheet-body .tab.stats prose-mirror span { + color: #191813 !important; +} .bol.sheet .window-content .bol-actor-form .main .sheet-body .tab.description .editor, .bol.sheet .window-content .bol-actor-form .main .sheet-body .tab.description .editor-content, .bol.sheet .window-content .bol-actor-form .main .sheet-body .tab.description prose-mirror { @@ -996,6 +1845,12 @@ body.system-bol img#logo { font-size: 0.95rem; margin-left: 6px; } +.bol.sheet .window-content .bol-actor-form .main .sheet-body .tab.description select.header-field-value { + background-color: #2a2a2a30; + border: 1px solid #4b4a44 !important; + border-radius: 0.5rem; + color: #4b4a44; +} .sheet-profile-img { cursor: pointer; border: none; @@ -1095,6 +1950,25 @@ body.system-bol img#logo { .bol.sheet.actor .inc-dec-btns-resource:hover { color: #4b4a44; } +.bol.sheet.actor .horde-stat-label { + font-weight: bold; + font-family: "Wolfsbane2Expanded", cursive; + font-size: 1rem; + font-variant: small-caps; + color: #4b4a44; + display: flex; + align-items: center; +} +.bol.sheet.actor .horde-stat-row { + align-items: center; + margin-bottom: 4px; +} +.bol.sheet.actor .horde-stat-sep { + color: #4b4a44; + font-weight: bold; + padding: 0 4px; + flex: 0; +} .bol.sheet.actor .bol-footer { height: 62px; max-height: 62px; @@ -1293,11 +2167,153 @@ body.system-bol img#logo { margin-bottom: 2px; } .character-summary-container { - opacity: 0.95; + background: #f5f0e8; + padding: 4px; } -.character-summary-rollable { +.character-summary-container .cs-table { + width: 100%; + margin: 0; +} +.character-summary-container .cs-section-header { + background: linear-gradient(135deg, #7a0000, darkred); + padding: 4px 6px; + min-height: 28px; + align-items: center; + margin-top: 2px; +} +.character-summary-container .cs-section-header .item-name, +.character-summary-container .cs-section-header .cs-name-col { + font-family: "Wolfsbane2Expanded", cursive !important; + font-size: 1.1em !important; + color: #fff !important; + text-shadow: 0 1px 2px rgba(0, 0, 0, 0.5); +} +.character-summary-container .cs-section-header .cs-group-header { + font-family: 'Signika', sans-serif !important; + font-size: 0.75em !important; + color: #ffdddd !important; + text-align: center; + justify-content: center; + text-transform: uppercase; + letter-spacing: 0.06em; + border-left: 1px solid rgba(255, 255, 255, 0.25); +} +.character-summary-container .cs-col-row { + background: #ede0cc; + min-height: 20px; + padding: 1px 6px; + align-items: center; + border-bottom: 1px solid #c8b89a; +} +.character-summary-container .cs-col-row .cs-col-header { + font-family: 'Signika', sans-serif !important; + font-size: 0.75em !important; + color: #7a0000 !important; + text-align: center; + justify-content: center; + font-weight: bold; +} +.character-summary-container .cs-portrait-col { + flex: 0 0 34px; + width: 34px; + min-width: 34px; + display: flex; + align-items: center; + justify-content: center; +} +.character-summary-container .cs-portrait { + width: 30px; + height: 30px; + border-radius: 3px; + border: 1px solid #c0a080; + object-fit: cover; +} +.character-summary-container .cs-name-col { + min-width: 9rem; + width: 9rem; +} +.character-summary-container .cs-actor-row { + min-height: 36px; + padding: 3px 4px; + border-bottom: 1px solid #d0c8b8; + align-items: center; + background: #faf6ee; + transition: background 0.15s; +} +.character-summary-container .cs-actor-row:hover { + background: #ede8dc; +} +.character-summary-container .cs-actor-name { + font-family: 'Signika', sans-serif; + font-size: 0.9em; + color: #7a0000; + font-weight: bold; + cursor: pointer; + text-decoration: none; +} +.character-summary-container .cs-actor-name:hover { text-decoration: underline; } +.character-summary-container .cs-stat { + justify-content: center; + text-align: center; +} +.character-summary-container .cs-group-sep { + border-left: 1px solid #c0a878; +} +.character-summary-container .cs-col-row .cs-group-sep { + border-left: 1px solid #c0a878; +} +.character-summary-container .cs-rollable { + display: inline-block; + min-width: 1.8em; + text-align: center; + color: #333; + font-size: 0.88em; + font-weight: bold; + font-family: 'Orbitron', sans-serif; + border-radius: 3px; + padding: 1px 3px; + cursor: pointer; + text-decoration: none; +} +.character-summary-container .cs-rollable:hover { + background: darkred; + color: #fff; +} +.character-summary-container .cs-resource { + justify-content: center; + font-size: 0.82em; + color: #555; + gap: 1px; +} +.character-summary-container .cs-res-val { + color: #191813; + font-weight: bold; + font-family: 'Orbitron', sans-serif; +} +.character-summary-container .cs-res-sep { + color: #999; +} +.character-summary-container .cs-res-max { + color: #888; + font-family: 'Orbitron', sans-serif; +} +.character-summary-container .cs-input { + width: 3rem; + text-align: center; + border: 1px solid #c0a080; + border-radius: 3px; + padding: 2px 4px; + background: #fff; + font-size: 0.85em; +} +.character-summary-container .actor-delete { + color: #c0392b; +} +.character-summary-container .actor-delete:hover { + color: #e74c3c; +} .activated-green { color: darkgreen; } @@ -1454,13 +2470,14 @@ body.system-bol img#logo { .bol.sheet.item .window-content .bol.sheet.item .form-group { display: flex; flex-direction: row; - align-items: center; + align-items: flex-start; margin: 3px 0; } -.bol.sheet.item .window-content .bol.sheet.item .form-group label { +.bol.sheet.item .window-content .bol.sheet.item .form-group > label:not(.checkbox) { flex: 0 0 40%; color: #191813; font-weight: bold; + padding-top: 2px; } .bol.sheet.item .window-content .bol.sheet.item .form-group input[type="checkbox"] { flex: 0 0 auto; @@ -1477,6 +2494,11 @@ body.system-bol img#logo { .bol.sheet.item .window-content .bol.sheet.item .form-group .form-fields { flex: 1; } +.bol.sheet.item .window-content .bol.sheet.item .form-group .form-fields { + display: flex; + flex-direction: column; + gap: 4px; +} .bol.sheet.item .window-content .bol.sheet.item label.checkbox { display: flex; flex-direction: row; @@ -1490,6 +2512,12 @@ body.system-bol img#logo { margin: 0; flex: 0 0 auto; } +.bol.sheet.item .window-content .bol.sheet.item .vehicle-checkboxes { + display: grid; + grid-template-columns: 1fr 1fr; + gap: 6px 16px; + padding: 4px 0; +} .bol.sheet.item .window-content .bol.sheet.item input[type="text"], .bol.sheet.item .window-content .bol.sheet.item input[type="number"], .bol.sheet.item .window-content .bol.sheet.item input[type="text"]:hover, diff --git a/lang/en.json b/lang/en.json index 2b3ba63..a798ac8 100644 --- a/lang/en.json +++ b/lang/en.json @@ -609,5 +609,10 @@ "BOL.settings.defaultLogoActorSheetPath" : "Path for Actor sheet logo", "BOL.settings.defaultLogoPathActorSheetTooltip": "Path of the Actor sheet logo (346 x 200, default : /systems/bol/ui/logo.webp)", "BOL.settings.defaultLogoTopLeftPath" : "Path for main top left logo", - "BOL.settings.defaultLogoTopLeftPathTooltip": "Path of the logo in the top left window (718 x 416, default : /systems/bol/ui/logo2.webp)" + "BOL.settings.defaultLogoTopLeftPathTooltip": "Path of the logo in the top left window (718 x 416, default : /systems/bol/ui/logo2.webp)", + + "BOL.ui.charSummaryTitle": "Character Summary", + "BOL.ui.colGroupAttributes": "Attributes", + "BOL.ui.colGroupAptitudes": "Aptitudes", + "BOL.ui.colGroupResources": "Resources" } \ No newline at end of file diff --git a/lang/fr.json b/lang/fr.json index f27bbaf..169c43b 100644 --- a/lang/fr.json +++ b/lang/fr.json @@ -650,5 +650,10 @@ "BOL.settings.defaultLogoTopLeftPathTooltip": "Vous pouvez changer le logo BoL en haut à gauche de chaque écran (idéalement 718 x 416, défaut : /systems/bol/ui/logo2.webp)", "EFFECT.StatusProne": "A terre", - "EFFECT.StatusDead": "Mort" + "EFFECT.StatusDead": "Mort", + + "BOL.ui.charSummaryTitle": "Résumé des Personnages", + "BOL.ui.colGroupAttributes": "Attributs", + "BOL.ui.colGroupAptitudes": "Aptitudes", + "BOL.ui.colGroupResources": "Ressources" } \ No newline at end of file diff --git a/module/actor/actor.js b/module/actor/actor.js index 60031a7..9dee9cf 100644 --- a/module/actor/actor.js +++ b/module/actor/actor.js @@ -7,6 +7,8 @@ import { BoLUtility } from "../system/bol-utility.js"; */ export class BoLActor extends Actor { + static _healthLock = new Set() + static async create(data, options) { // Case of compendium global import @@ -357,7 +359,7 @@ export class BoLActor extends Actor { ChatMessage.create({ alias: this.name, whisper: BoLUtility.getWhisperRecipientsAndGMs(this.name), - content: await renderTemplate('systems/bol/templates/chat/chat-activate-fight-option.hbs', { name: this.name, img: fightOption.img, foName: fightOption.name, state: state }) + content: await foundry.applications.handlebars.foundry.applications.handlebars.renderTemplate('systems/bol/templates/chat/chat-activate-fight-option.hbs', { name: this.name, img: fightOption.img, foName: fightOption.name, state: state }) }) } @@ -852,36 +854,42 @@ export class BoLActor extends Actor { /*-------------------------------------------- */ async manageHealthState() { - let hpID = "lastHP" + this.id - let lastHP = await this.getFlag("world", hpID) - if (lastHP != this.system.resources.hp.value && game.user.isGM) { // Only GM sends this - await this.setFlag("world", hpID, this.system.resources.hp.value) - let prone = this.effects.find(ef => ef.name == game.i18n.localize("EFFECT.StatusProne")) - let dead = this.effects.find(ef => ef.name == game.i18n.localize("EFFECT.StatusDead")) - if (this.system.resources.hp.value <= 0) { - if (!prone) { - await this.createEmbeddedDocuments("ActiveEffect", [ - { name: game.i18n.localize('EFFECT.StatusProne'), icon: 'icons/svg/falling.svg', statuses: 'prone' } - ]) - } - if (this.system.resources.hp.value < -5 && !dead) { - await this.createEmbeddedDocuments("ActiveEffect", [ - { name: game.i18n.localize('EFFECT.StatusDead'), icon: 'icons/svg/skull.svg', statuses: 'dead' } - ]) - } - ChatMessage.create({ - alias: this.name, - whisper: BoLUtility.getWhisperRecipientsAndGMs(this.name), - content: await renderTemplate('systems/bol/templates/chat/chat-vitality-zero.hbs', { name: this.name, img: this.img, hp: this.system.resources.hp.value, isHeroAdversary: this.isHeroAdversary() }) - }) - } else { - if (prone) { - await this.deleteEmbeddedDocuments("ActiveEffect", [prone.id]) - } - if (dead) { - await this.deleteEmbeddedDocuments("ActiveEffect", [dead.id]) + if (BoLActor._healthLock.has(this.id)) return + BoLActor._healthLock.add(this.id) + try { + let hpID = "lastHP" + this.id + let lastHP = await this.getFlag("world", hpID) + if (lastHP != this.system.resources.hp.value && game.user.isGM) { // Only GM sends this + await this.setFlag("world", hpID, this.system.resources.hp.value) + let prone = this.effects.find(ef => ef.name == game.i18n.localize("EFFECT.StatusProne")) + let dead = this.effects.find(ef => ef.name == game.i18n.localize("EFFECT.StatusDead")) + if (this.system.resources.hp.value <= 0) { + if (!prone) { + await this.createEmbeddedDocuments("ActiveEffect", [ + { name: game.i18n.localize('EFFECT.StatusProne'), icon: 'icons/svg/falling.svg', statuses: 'prone' } + ]) + } + if (this.system.resources.hp.value < -5 && !dead) { + await this.createEmbeddedDocuments("ActiveEffect", [ + { name: game.i18n.localize('EFFECT.StatusDead'), icon: 'icons/svg/skull.svg', statuses: 'dead' } + ]) + } + ChatMessage.create({ + alias: this.name, + whisper: BoLUtility.getWhisperRecipientsAndGMs(this.name), + content: await foundry.applications.handlebars.foundry.applications.handlebars.renderTemplate('systems/bol/templates/chat/chat-vitality-zero.hbs', { name: this.name, img: this.img, hp: this.system.resources.hp.value, isHeroAdversary: this.isHeroAdversary() }) + }) + } else { + if (prone) { + await this.deleteEmbeddedDocuments("ActiveEffect", [prone.id]) + } + if (dead) { + await this.deleteEmbeddedDocuments("ActiveEffect", [dead.id]) + } } } + } finally { + BoLActor._healthLock.delete(this.id) } } @@ -904,7 +912,7 @@ export class BoLActor extends Actor { let msg = await ChatMessage.create({ alias: this.name, whisper: BoLUtility.getWhisperRecipientsAndGMs(this.name), - content: await renderTemplate('systems/bol/templates/chat/chat-recup-information.hbs', { + content: await foundry.applications.handlebars.foundry.applications.handlebars.renderTemplate('systems/bol/templates/chat/chat-recup-information.hbs', { name: this.name, img: this.img, actorId: this.id, diff --git a/module/applications/sheets/horde-sheet.mjs b/module/applications/sheets/horde-sheet.mjs index 067d3f7..13808f2 100644 --- a/module/applications/sheets/horde-sheet.mjs +++ b/module/applications/sheets/horde-sheet.mjs @@ -31,7 +31,7 @@ export default class BoLHordeSheet extends BoLBaseActorSheet { context.options = this.options context.editScore = this.options.editScore context.description = await foundry.applications.ux.TextEditor.implementation.enrichHTML( - actor.system.description || "", { async: true } + actor.system.details?.biography || "", { async: true } ) console.log("HORDE (AppV2)", context) diff --git a/module/applications/sheets/vehicle-sheet.mjs b/module/applications/sheets/vehicle-sheet.mjs index 7ae81fe..552f3d1 100644 --- a/module/applications/sheets/vehicle-sheet.mjs +++ b/module/applications/sheets/vehicle-sheet.mjs @@ -35,7 +35,7 @@ export default class BoLVehicleSheet extends BoLBaseActorSheet { actor.system.description || "", { async: true } ) - console.log("VEHICLE (AppV2)", context) + console.log("VEHICLE (AppV2)", context) // TODO: remove before release return context } @@ -56,10 +56,14 @@ export default class BoLVehicleSheet extends BoLBaseActorSheet { }) }) - // Create generic item - this.element.querySelectorAll(".create_item").forEach((el) => { + // Create vehicle weapon + this.element.querySelectorAll(".vehicle-weapon-add").forEach((el) => { el.addEventListener("click", () => { - this.actor.createEmbeddedDocuments("Item", [{ name: "Nouvel Equipement", type: "item" }], { renderSheet: true }) + this.actor.createEmbeddedDocuments("Item", [{ + name: game.i18n.localize("BOL.ui.newEquipment"), + type: "item", + system: { category: "vehicleweapon" }, + }], { renderSheet: true }) }) }) } diff --git a/module/bol.js b/module/bol.js index 8a1676f..af3e643 100644 --- a/module/bol.js +++ b/module/bol.js @@ -110,35 +110,22 @@ Hooks.once('init', async function () { /* -------------------------------------------- */ -function welcomeMessage() { - let content = `
- ` + game.i18n.localize("BOL.chat.welcome1") + `

` + - game.i18n.localize("BOL.chat.welcome2") + "

" + - game.i18n.localize("BOL.chat.welcome3") + "

" + - game.i18n.localize("BOL.chat.welcome4") + "

" + - game.i18n.localize("BOL.chat.welcome5") + "

" + - game.i18n.localize("BOL.chat.welcome6") +async function welcomeMessage() { + const noRulebook = !game.modules.find(m => m.id === "bol-rulebook") + const content = await foundry.applications.handlebars.renderTemplate( + "systems/bol/templates/chat/chat-welcome.hbs", + { noRulebook } + ) + ChatMessage.create({ user: game.user.id, whisper: [game.user.id], content }) - let rulebook = game.modules.find( m => m.id === "bol-rulebook") - if ( !rulebook ) { - content += "

" + game.i18n.localize("BOL.chat.bolRulebookMessage") + "

" - } - ChatMessage.create({ - user: game.user.id, - whisper: [game.user.id], - content: content - }) - - if (game.user.isGM && game.i18n.lang == 'en' && !game.modules.find(m => m.id == "babele") ){ + if (game.user.isGM && game.i18n.lang == 'en' && !game.modules.find(m => m.id == "babele")) { ChatMessage.create({ user: game.user.id, whisper: [game.user.id], - content: `
- WARNING ! English language selected, but Babele module is not installed !
Please install babele from the module tab in Foundry interface.` - } ) + content: `

⚠ WARNING ! English language selected, but Babele module is not installed !
Please install babele from the module tab in Foundry interface.

` + }) ui.notifications.warn("WARNING ! English language selected, but babele module is not installed !
Please install babele from the module tab in Foundry interface.") } - } /* -------------------------------------------- */ diff --git a/module/controllers/bol-rolls.js b/module/controllers/bol-rolls.js index eafac35..54a8544 100644 --- a/module/controllers/bol-rolls.js +++ b/module/controllers/bol-rolls.js @@ -5,11 +5,6 @@ const _apt2attr = { init: "mind", melee: "agility", ranged: "agility", def: "vig /* -------------------------------------------- */ export class BoLRoll { - /* -------------------------------------------- */ - static options() { - return { classes: ["bol", "dialog"], width: 480, height: 'fit-content' }; - } - /* -------------------------------------------- */ static getDefaultAttribute(key) { return _apt2attr[key] @@ -129,7 +124,7 @@ export class BoLRoll { rangeMsg = "BOL.chat.range6" } ChatMessage.create({ - content: await renderTemplate('systems/bol/templates/chat/chat-info-range.hbs', { + content: await foundry.applications.handlebars.renderTemplate('systems/bol/templates/chat/chat-info-range.hbs', { weapon: weapon, attackerName: _token.actor.name, defenderName: target.actor.name, @@ -308,26 +303,31 @@ export class BoLRoll { // Final number of dices this.rollData.nbDice = 2 + Math.abs(this.rollData.bmDice) // Bonus or Malus ? - if (this.rollData.bmDice == 0) { - $('#roll-nbdice').val("2") - } else { - let letter = (this.rollData.bmDice > 0) ? "B" : "M" - $('#roll-nbdice').val("2 + " + String(Math.abs(this.rollData.bmDice)) + letter) + const nbDiceEl = document.querySelector('#roll-nbdice') + if (nbDiceEl) { + if (this.rollData.bmDice == 0) { + nbDiceEl.value = "2" + } else { + let letter = (this.rollData.bmDice > 0) ? "B" : "M" + nbDiceEl.value = "2 + " + String(Math.abs(this.rollData.bmDice)) + letter + } } let rollbase = this.rollData.attrValue + "+" + this.rollData.aptValue if (this.rollData.weapon && this.rollData.weapon.system.properties.onlymodifier) { rollbase = "" } - $('#roll-modifier').val(rollbase + "+" + this.rollData.careerBonus + "+" + this.rollData.mod + "+" + + const modifierEl = document.querySelector('#roll-modifier') + if (modifierEl) modifierEl.value = rollbase + "+" + this.rollData.careerBonus + "+" + this.rollData.mod + "+" + this.rollData.modRanged + "+" + this.rollData.weaponModifier + "-" + this.rollData.defence + "-" + this.rollData.modArmorMalus + "-" + - this.rollData.shieldMalus + "+" + this.rollData.attackModifier + "+" + this.rollData.appliedArmorMalus + "+" + effectModifier) + this.rollData.shieldMalus + "+" + this.rollData.attackModifier + "+" + this.rollData.appliedArmorMalus + "+" + effectModifier - // Rebuild lits of applicable effects + // Rebuild list of applicable effects let selectEffects = "" for (let effect of this.rollData.bolApplicableEffects) { selectEffects += `` } - $('#applicable-effects').html(selectEffects) + const effectsEl = document.querySelector('#applicable-effects') + if (effectsEl) effectsEl.innerHTML = selectEffects } /* -------------------------------------------- */ @@ -360,46 +360,48 @@ export class BoLRoll { /* -------------------------------------------- */ static updateArmorMalus(rollData) { rollData.appliedArmorMalus = 0 + const agiEl = document.querySelector('#armor-agi-malus') if (rollData.attribute.key == "agility") { - $("#armor-agi-malus").show() + if (agiEl) agiEl.style.display = '' rollData.appliedArmorMalus += rollData.armorAgiMalus } else { - $("#armor-agi-malus").hide() + if (agiEl) agiEl.style.display = 'none' } + const initEl = document.querySelector('#armor-init-malus') if (rollData.aptitude && rollData.aptitude.key == "init") { - $("#armor-init-malus").show() + if (initEl) initEl.style.display = '' rollData.appliedArmorMalus += rollData.armorInitMalus } else { - $("#armor-init-malus").hide() + if (initEl) initEl.style.display = 'none' } } /* ------------------------------ -------------- */ static updatePPCost(rollData) { - $('#ppcost').html(rollData.ppCost + " + Armor(" + rollData.ppCostArmor + ")=" + Number(rollData.ppCost + rollData.ppCostArmor)) + const el = document.querySelector('#ppcost') + if (el) el.innerHTML = rollData.ppCost + " + Armor(" + rollData.ppCostArmor + ")=" + Number(rollData.ppCost + rollData.ppCostArmor) } /* ------------------------------ -------------- */ static rollDialogListener(html) { - this.updateTotalDice() - html.find('#optcond').change((event) => { // Dynamic change of PP cost of spell + html.querySelector('#optcond')?.addEventListener('change', (event) => { let pp = BoLUtility.computeSpellCost(this.rollData.spell, event.currentTarget.selectedOptions.length) this.rollData.ppCost = pp this.updatePPCost(this.rollData) }) - html.find('#mod').change((event) => { + html.querySelector('#mod')?.addEventListener('change', (event) => { this.rollData.mod = Number(event.currentTarget.value) this.updateTotalDice() }) - html.find('#modRanged').change((event) => { + html.querySelector('#modRanged')?.addEventListener('change', (event) => { this.rollData.modRanged = Number(event.currentTarget.value) this.updateTotalDice() }) - html.find('#attr').change((event) => { + html.querySelector('#attr')?.addEventListener('change', (event) => { let attrKey = event.currentTarget.value let actor = BoLUtility.getActorFromRollData(this.rollData) this.rollData.attribute = foundry.utils.duplicate(actor.system.attributes[attrKey]) @@ -407,7 +409,7 @@ export class BoLRoll { this.rollData.bolApplicableEffects = this.updateApplicableEffects(this.rollData) this.updateTotalDice() }) - html.find('#apt').change((event) => { + html.querySelector('#apt')?.addEventListener('change', (event) => { let aptKey = event.currentTarget.value let actor = BoLUtility.getActorFromRollData(this.rollData) this.rollData.aptitude = foundry.utils.duplicate(actor.system.aptitudes[aptKey]) @@ -416,65 +418,58 @@ export class BoLRoll { this.updateTotalDice() }) - html.find('#applyShieldMalus').click((event) => { - if (event.currentTarget.checked) { - this.rollData.shieldMalus = this.rollData.shieldAttackMalus - } else { - this.rollData.shieldMalus = 0 - } + html.querySelector('#applyShieldMalus')?.addEventListener('click', (event) => { + this.rollData.shieldMalus = event.currentTarget.checked ? this.rollData.shieldAttackMalus : 0 this.updateTotalDice() }) - html.find('#career').change((event) => { - let careers = $('#career').val() + html.querySelector('#career')?.addEventListener('change', (event) => { + let careers = Array.from(event.currentTarget.selectedOptions).map(o => o.value) this.rollData.careerBonus = (!careers || careers.length == 0) ? 0 : Math.max(...careers.map(i => parseInt(i))) this.updateTotalDice() }) - html.find('#boon').change((event) => { - let boons = $('#boon').val() + html.querySelector('#boon')?.addEventListener('change', (event) => { + let boons = Array.from(event.currentTarget.selectedOptions).map(o => o.value) this.rollData.nbBoons = (!boons || boons.length == 0) ? 0 : boons.length this.updateTotalDice() }) - html.find('#flaw').change((event) => { - let flaws = $('#flaw').val() + html.querySelector('#flaw')?.addEventListener('change', (event) => { + let flaws = Array.from(event.currentTarget.selectedOptions).map(o => o.value) this.rollData.nbFlaws = (!flaws || flaws.length == 0) ? 0 : flaws.length this.updateTotalDice() }) - html.find('.bdice').click((event) => { + html.querySelectorAll('.bdice').forEach(el => el.addEventListener('click', (event) => { this.rollData.mDice = 0 this.rollData.bDice = Number(event.currentTarget.value) this.updateTotalDice() - }) - html.find('.mdice').click((event) => { + })) + html.querySelectorAll('.mdice').forEach(el => el.addEventListener('click', (event) => { this.rollData.bDice = 0 this.rollData.mDice = Number(event.currentTarget.value) this.updateTotalDice() - }) - html.find('#horoscope-bonus-applied').change((event) => { + })) + html.querySelector('#horoscope-bonus-applied')?.addEventListener('change', (event) => { this.rollData.selectedHoroscope = [] for (let option of event.currentTarget.selectedOptions) { this.rollData.selectedHoroscope.push(foundry.utils.duplicate(this.rollData.horoscopeBonusList[Number(option.index)])) } - let horoscopes = $('#horoscope-bonus-applied').val() + let horoscopes = Array.from(event.currentTarget.selectedOptions).map(o => o.value) this.rollData.horoscopeBonus = (!horoscopes || horoscopes.length == 0) ? 0 : horoscopes.length this.updateTotalDice() }) - - html.find('#horoscope-malus-applied').change((event) => { + html.querySelector('#horoscope-malus-applied')?.addEventListener('change', (event) => { this.rollData.selectedHoroscope = [] for (let option of event.currentTarget.selectedOptions) { this.rollData.selectedHoroscope.push(foundry.utils.duplicate(this.rollData.horoscopeBonusList[Number(option.index)])) } - let horoscopes = $('#horoscope-malus-applied').val() + let horoscopes = Array.from(event.currentTarget.selectedOptions).map(o => o.value) this.rollData.horoscopeMalus = (!horoscopes || horoscopes.length == 0) ? 0 : horoscopes.length this.updateTotalDice() }) - html.find('#horoscope-group-applied').change((event) => { + html.querySelector('#horoscope-group-applied')?.addEventListener('change', (event) => { this.rollData.selectedGroupHoroscopeIndex = event.currentTarget.value this.updateTotalDice() }) - - } /* -------------------------------------------- */ @@ -552,41 +547,47 @@ export class BoLRoll { } else { rollData.shieldMalus = 0 } - // Save + // Save & pre-initialize computed fields this.rollData = rollData + this.updateTotalDice() console.log("ROLLDATA", rollData) // Then display+process the dialog const rollOptionContent = await foundry.applications.handlebars.renderTemplate(rollOptionTpl, rollData); - let d = new Dialog({ - title: rollData.label, + // Use Hooks to reliably get the rendered HTMLElement (renderDialogV2 receives (app, element, context)) + Hooks.once('renderDialogV2', (app, element) => { + element.classList.add('bol'); + this.rollDialogListener(element); + }); + return foundry.applications.api.DialogV2.wait({ + window: { title: rollData.label }, content: rollOptionContent, - rollData: rollData, - render: html => this.rollDialogListener(html), - buttons: { - cancel: { - icon: '', + rejectClose: false, + buttons: [ + { + type: 'button', label: game.i18n.localize("BOL.ui.cancel"), - callback: () => { - } + icon: 'fas fa-times', + action: 'cancel' }, - submit: { - icon: '', + { + type: 'submit', label: game.i18n.localize("BOL.ui.submit"), - callback: (html) => { + icon: 'fas fa-check', + action: 'submit', + callback: (event, button, dialog) => { console.log("Submit Roll!!!!"); - if (rollData.mode == 'spell' && rollData.ppCurrent < rollData.ppCost) { // Check PP available + if (rollData.mode == 'spell' && rollData.ppCurrent < rollData.ppCost) { ui.notifications.warn("Pas assez de Points de Pouvoir !") - return + return false } - rollData.registerInit = (rollData.aptitude && rollData.aptitude.key == 'init') ? $('#register-init').is(":checked") : false; + rollData.registerInit = (rollData.aptitude && rollData.aptitude.key == 'init') ? + (dialog.element.querySelector('#register-init')?.checked ?? false) : false; const isMalus = (rollData.bmDice < 0) - let rollbase = rollData.attrValue + rollData.aptValue - if (rollData.weapon?.system.properties.onlymodifier) { - rollbase = 0 - } + if (rollData.weapon?.system.properties.onlymodifier) rollbase = 0 + let diceData = BoLUtility.getDiceData() let malusInit = rollData.combatData?.malusInit || 0 const modifiers = rollbase + rollData.careerBonus + rollData.mod + rollData.weaponModifier - rollData.defence - rollData.modArmorMalus + rollData.shieldMalus + rollData.attackModifier + rollData.appliedArmorMalus + rollData.effectModifier - malusInit @@ -599,12 +600,8 @@ export class BoLRoll { r.roll(); } } - }, - default: onEnter, - close: () => { } - }, this.options()); - - return d.render(true); + ] + }, { classes: ['bol', 'dialog'], width: 480 }); } } @@ -698,18 +695,15 @@ export class BoLDefaultRoll { /* -------------------------------------------- */ async sendChatMessage() { - let actor = BoLUtility.getActorFromRollData(this.rollData) - this._buildChatMessage(this.rollData).then(async msgFlavor => { - //console.log("MSG", msgFlavor ) - let msg = await this.rollData.roll.toMessage({ - user: game.user.id, - rollMode: game.settings.get("core", "rollMode"), - flavor: msgFlavor, - speaker: ChatMessage.getSpeaker({ actor: actor }), - }) - this.rollData.roll = foundry.utils.duplicate(this.rollData.roll) // Remove object, keep data (v111 ready) - msg.setFlag("world", "bol-roll-data", this.rollData) - }) + const actor = BoLUtility.getActorFromRollData(this.rollData) + const rollMode = game.settings.get("core", "rollMode") + const msgFlavor = await this._buildChatMessage(this.rollData) + const msg = await this.rollData.roll.toMessage({ + flavor: msgFlavor, + speaker: ChatMessage.getSpeaker({ actor: actor }), + }, { rollMode }) + this.rollData.roll = foundry.utils.duplicate(this.rollData.roll) + if (msg) await msg.setFlag("world", "bol-roll-data", this.rollData) } /* -------------------------------------------- */ diff --git a/module/system/bol-utility.js b/module/system/bol-utility.js index 0499c2f..70b3524 100644 --- a/module/system/bol-utility.js +++ b/module/system/bol-utility.js @@ -249,7 +249,7 @@ export class BoLUtility { payload: chatData, }); - renderTemplate('systems/bol/templates/item/post-item.hbs', chatData).then(html => { + foundry.applications.handlebars.renderTemplate('systems/bol/templates/item/post-item.hbs', chatData).then(html => { let chatOptions = BoLUtility.chatDataSetup(html); ChatMessage.create(chatOptions) }); @@ -487,13 +487,17 @@ export class BoLUtility { if (defenseMode == 'damage-with-armor') { let armorFormula = defender.getArmorFormula() - rollData.rollArmor = new Roll(armorFormula) - await rollData.rollArmor.roll() - let msg = await rollData.rollArmor.toMessage({ flavor: game.i18n.localize("BOL.chat.armorRoll") + " : " + armorFormula }); - if (game.dice3d) { // wait animation end when DsN is there - await game.dice3d.waitFor3DAnimationByMessageID(msg.id); + if (armorFormula === "0") { + rollData.armorProtect = 0 + } else { + rollData.rollArmor = new Roll(armorFormula) + await rollData.rollArmor.roll() + let msg = await rollData.rollArmor.toMessage({ flavor: game.i18n.localize("BOL.chat.armorRoll") + " : " + armorFormula }) + if (game.dice3d && msg) { + await game.dice3d.waitFor3DAnimationByMessageID(msg.id) + } + rollData.armorProtect = (rollData.rollArmor.total < 0) ? 0 : rollData.rollArmor.total } - rollData.armorProtect = (rollData.rollArmor.total < 0) ? 0 : rollData.rollArmor.total rollData.finalDamage = rollData.damageTotal - rollData.armorProtect rollData.finalDamage = (rollData.finalDamage < 0) ? 0 : rollData.finalDamage await defender.sufferDamage(rollData.finalDamage) @@ -505,9 +509,17 @@ export class BoLUtility { } if (defenseMode == 'hero-reduce-damage') { let armorFormula = defender.getArmorFormula() - rollData.rollArmor = new Roll(armorFormula) - await rollData.rollArmor.roll() - rollData.armorProtect = (rollData.rollArmor.total < 0) ? 0 : rollData.rollArmor.total + if (armorFormula === "0") { + rollData.armorProtect = 0 + } else { + rollData.rollArmor = new Roll(armorFormula) + await rollData.rollArmor.roll() + let msg = await rollData.rollArmor.toMessage({ flavor: game.i18n.localize("BOL.chat.armorRoll") + " : " + armorFormula }) + if (game.dice3d && msg) { + await game.dice3d.waitFor3DAnimationByMessageID(msg.id) + } + rollData.armorProtect = (rollData.rollArmor.total < 0) ? 0 : rollData.rollArmor.total + } rollData.rollHero = new Roll("1d6") await rollData.rollHero.roll() rollData.finalDamage = rollData.damageTotal - rollData.rollHero.total - rollData.armorProtect @@ -542,13 +554,13 @@ export class BoLUtility { ChatMessage.create({ alias: defender.name, whisper: BoLUtility.getWhisperRecipientsAndGMs(defender.name), - content: await renderTemplate('systems/bol/templates/chat/rolls/defense-result-card.hbs', damageResults) + content: await foundry.applications.handlebars.foundry.applications.handlebars.renderTemplate('systems/bol/templates/chat/rolls/defense-result-card.hbs', damageResults) }) console.log("Defender data : ", defenderUser) ChatMessage.create({ alias: defender.name, whisper: BoLUtility.getOtherWhisperRecipients(defenderUser?.name), - content: await renderTemplate('systems/bol/templates/chat/rolls/defense-summary-card.hbs', damageResults) + content: await foundry.applications.handlebars.foundry.applications.handlebars.renderTemplate('systems/bol/templates/chat/rolls/defense-summary-card.hbs', damageResults) }) } } @@ -635,7 +647,7 @@ export class BoLUtility { let msg = await ChatMessage.create({ alias: defender.name, whisper: BoLUtility.getWhisperRecipientsAndGMs(defender.name), - content: await renderTemplate('systems/bol/templates/chat/rolls/defense-request-card.hbs', { + content: await foundry.applications.handlebars.foundry.applications.handlebars.renderTemplate('systems/bol/templates/chat/rolls/defense-request-card.hbs', { attackId: rollData.id, attacker: rollData.attacker, defender: defender, diff --git a/module/system/config.js b/module/system/config.js index 5820805..b34b324 100644 --- a/module/system/config.js +++ b/module/system/config.js @@ -188,25 +188,25 @@ BOL.rangeModifiers = { "-8": "BOL.dialog.utmost" } -BOL.difficultyModifiers = { - "4": "BOL.dialog.soeasy", - "3": "BOL.dialog.soeasy3", - "2": "BOL.dialog.veryeasy", - "1": "BOL.dialog.easy", - "0": "BOL.dialog.moderate", - "-1": "BOL.dialog.hard", - "-2": "BOL.dialog.tough", - "-3": "BOL.dialog.tough3", - "-4": "BOL.dialog.demanding", - "-5": "BOL.dialog.demanding5", - "-6": "BOL.dialog.formidable", - "-7": "BOL.dialog.formidable7", - "-8": "BOL.dialog.heroic", - "-9": "BOL.dialog.heroic9", - "-10": "BOL.dialog.mythic", - "-11": "BOL.dialog.mythic11", - "-12": "BOL.dialog.divine" -} +BOL.difficultyModifiers = [ + { value: "-12", label: "BOL.dialog.divine" }, + { value: "-11", label: "BOL.dialog.mythic11" }, + { value: "-10", label: "BOL.dialog.mythic" }, + { value: "-9", label: "BOL.dialog.heroic9" }, + { value: "-8", label: "BOL.dialog.heroic" }, + { value: "-7", label: "BOL.dialog.formidable7" }, + { value: "-6", label: "BOL.dialog.formidable" }, + { value: "-5", label: "BOL.dialog.demanding5" }, + { value: "-4", label: "BOL.dialog.demanding" }, + { value: "-3", label: "BOL.dialog.tough3" }, + { value: "-2", label: "BOL.dialog.tough" }, + { value: "-1", label: "BOL.dialog.hard" }, + { value: "0", label: "BOL.dialog.moderate" }, + { value: "1", label: "BOL.dialog.easy" }, + { value: "2", label: "BOL.dialog.veryeasy" }, + { value: "3", label: "BOL.dialog.soeasy3" }, + { value: "4", label: "BOL.dialog.soeasy" }, +] BOL.alchemyModifiers = { "2": "BOL.dialog.veryeasy", diff --git a/module/system/templates.js b/module/system/templates.js index 26a6810..9b6aca0 100644 --- a/module/system/templates.js +++ b/module/system/templates.js @@ -52,6 +52,7 @@ export const preloadHandlebarsTemplates = async function () { "systems/bol/templates/chat/rolls/alchemy-roll-card.hbs", "systems/bol/templates/chat/rolls/selected-horoscope-roll-card.hbs", "systems/bol/templates/chat/rolls/horoscope-roll-card.hbs", + "systems/bol/templates/chat/chat-welcome.hbs", "systems/bol/templates/dialogs/aptitude-roll-part.hbs", "systems/bol/templates/dialogs/attribute-roll-part.hbs", "systems/bol/templates/dialogs/mod-roll-part.hbs", @@ -62,7 +63,8 @@ export const preloadHandlebarsTemplates = async function () { "systems/bol/templates/dialogs/flaws-roll-part.hbs", "systems/bol/templates/dialogs/total-roll-part.hbs", "systems/bol/templates/dialogs/fightoptions-roll-part.hbs", - "systems/bol/templates/dialogs/horoscope-roll-part.hbs" + "systems/bol/templates/dialogs/horoscope-roll-part.hbs", + "systems/bol/templates/apps/character-summary-template.html" ]; // Load the template parts diff --git a/packs/aides-de-jeu/001073.log b/packs/aides-de-jeu/001078.log similarity index 100% rename from packs/aides-de-jeu/001073.log rename to packs/aides-de-jeu/001078.log diff --git a/packs/aides-de-jeu/CURRENT b/packs/aides-de-jeu/CURRENT index 422b12b..c9bed33 100644 --- a/packs/aides-de-jeu/CURRENT +++ b/packs/aides-de-jeu/CURRENT @@ -1 +1 @@ -MANIFEST-001072 +MANIFEST-001076 diff --git a/packs/aides-de-jeu/LOG b/packs/aides-de-jeu/LOG index cf734ec..ba0ab78 100644 --- a/packs/aides-de-jeu/LOG +++ b/packs/aides-de-jeu/LOG @@ -1,3 +1,8 @@ -2026/02/28-17:23:52.883622 7f56f93fe6c0 Recovering log #1070 -2026/02/28-17:23:52.893895 7f56f93fe6c0 Delete type=3 #1068 -2026/02/28-17:23:52.893967 7f56f93fe6c0 Delete type=0 #1070 +2026/02/28-22:59:53.852685 7f56e3fff6c0 Recovering log #1074 +2026/02/28-22:59:53.863099 7f56e3fff6c0 Delete type=3 #1072 +2026/02/28-22:59:53.863210 7f56e3fff6c0 Delete type=0 #1074 +2026/03/01-01:08:46.366409 7f54e37ef6c0 Level-0 table #1079: started +2026/03/01-01:08:46.366440 7f54e37ef6c0 Level-0 table #1079: 0 bytes OK +2026/03/01-01:08:46.372420 7f54e37ef6c0 Delete type=0 #1077 +2026/03/01-01:08:46.391669 7f54e37ef6c0 Manual compaction at level-0 from '!journal!3xJg1rCxnWvEmoxS' @ 72057594037927935 : 1 .. '!journal.pages!veAAxCtCKcFIsnln.0kUgZspxXO7VS8bd' @ 0 : 0; will stop at (end) +2026/03/01-01:08:46.391720 7f54e37ef6c0 Manual compaction at level-1 from '!journal!3xJg1rCxnWvEmoxS' @ 72057594037927935 : 1 .. '!journal.pages!veAAxCtCKcFIsnln.0kUgZspxXO7VS8bd' @ 0 : 0; will stop at (end) diff --git a/packs/aides-de-jeu/LOG.old b/packs/aides-de-jeu/LOG.old index d01ca82..4a52fea 100644 --- a/packs/aides-de-jeu/LOG.old +++ b/packs/aides-de-jeu/LOG.old @@ -1,8 +1,8 @@ -2026/02/28-16:33:30.670789 7f56f9bff6c0 Recovering log #1066 -2026/02/28-16:33:30.681105 7f56f9bff6c0 Delete type=3 #1064 -2026/02/28-16:33:30.681173 7f56f9bff6c0 Delete type=0 #1066 -2026/02/28-17:23:47.157740 7f54e37ef6c0 Level-0 table #1071: started -2026/02/28-17:23:47.157777 7f54e37ef6c0 Level-0 table #1071: 0 bytes OK -2026/02/28-17:23:47.163664 7f54e37ef6c0 Delete type=0 #1069 -2026/02/28-17:23:47.170059 7f54e37ef6c0 Manual compaction at level-0 from '!journal!3xJg1rCxnWvEmoxS' @ 72057594037927935 : 1 .. '!journal.pages!veAAxCtCKcFIsnln.0kUgZspxXO7VS8bd' @ 0 : 0; will stop at (end) -2026/02/28-17:23:47.170090 7f54e37ef6c0 Manual compaction at level-1 from '!journal!3xJg1rCxnWvEmoxS' @ 72057594037927935 : 1 .. '!journal.pages!veAAxCtCKcFIsnln.0kUgZspxXO7VS8bd' @ 0 : 0; will stop at (end) +2026/02/28-17:23:52.883622 7f56f93fe6c0 Recovering log #1070 +2026/02/28-17:23:52.893895 7f56f93fe6c0 Delete type=3 #1068 +2026/02/28-17:23:52.893967 7f56f93fe6c0 Delete type=0 #1070 +2026/02/28-22:59:43.750682 7f54e37ef6c0 Level-0 table #1075: started +2026/02/28-22:59:43.750749 7f54e37ef6c0 Level-0 table #1075: 0 bytes OK +2026/02/28-22:59:43.758241 7f54e37ef6c0 Delete type=0 #1073 +2026/02/28-22:59:43.758440 7f54e37ef6c0 Manual compaction at level-0 from '!journal!3xJg1rCxnWvEmoxS' @ 72057594037927935 : 1 .. '!journal.pages!veAAxCtCKcFIsnln.0kUgZspxXO7VS8bd' @ 0 : 0; will stop at (end) +2026/02/28-22:59:43.758473 7f54e37ef6c0 Manual compaction at level-1 from '!journal!3xJg1rCxnWvEmoxS' @ 72057594037927935 : 1 .. '!journal.pages!veAAxCtCKcFIsnln.0kUgZspxXO7VS8bd' @ 0 : 0; will stop at (end) diff --git a/packs/aides-de-jeu/MANIFEST-001072 b/packs/aides-de-jeu/MANIFEST-001076 similarity index 84% rename from packs/aides-de-jeu/MANIFEST-001072 rename to packs/aides-de-jeu/MANIFEST-001076 index 04ac1993b18e4d73b6e34f52ef32065affb35adb..df78d4703ed898ec7a0ead53340e4e908148d2c8 100644 GIT binary patch delta 43 tcmcb__=Iu70TtIGb4G3kMy9PCoD9s{I9TQ|Np$>G0Euh^iR=K00095S3Q7O~ delta 25 hcmaFDc!_bs0U?n$vDw@Vj7%FjI2o8Xaj?u`0swE|2ND1P diff --git a/packs/armors/000978.log b/packs/armors/000983.log similarity index 100% rename from packs/armors/000978.log rename to packs/armors/000983.log diff --git a/packs/armors/CURRENT b/packs/armors/CURRENT index 760f0f8..f51a32f 100644 --- a/packs/armors/CURRENT +++ b/packs/armors/CURRENT @@ -1 +1 @@ -MANIFEST-000977 +MANIFEST-000981 diff --git a/packs/armors/LOG b/packs/armors/LOG index 6e3cadc..528599f 100644 --- a/packs/armors/LOG +++ b/packs/armors/LOG @@ -1,3 +1,8 @@ -2026/02/28-17:23:52.858522 7f56e3fff6c0 Recovering log #975 -2026/02/28-17:23:52.869495 7f56e3fff6c0 Delete type=3 #973 -2026/02/28-17:23:52.869552 7f56e3fff6c0 Delete type=0 #975 +2026/02/28-22:59:53.826224 7f56f8bfd6c0 Recovering log #979 +2026/02/28-22:59:53.836758 7f56f8bfd6c0 Delete type=3 #977 +2026/02/28-22:59:53.836823 7f56f8bfd6c0 Delete type=0 #979 +2026/03/01-01:08:46.372471 7f54e37ef6c0 Level-0 table #984: started +2026/03/01-01:08:46.372486 7f54e37ef6c0 Level-0 table #984: 0 bytes OK +2026/03/01-01:08:46.378495 7f54e37ef6c0 Delete type=0 #982 +2026/03/01-01:08:46.391687 7f54e37ef6c0 Manual compaction at level-0 from '!items!G3dZTHIabA3LA1hY' @ 72057594037927935 : 1 .. '!items!xhEcsi3WHjbt2ro9' @ 0 : 0; will stop at (end) +2026/03/01-01:08:46.391731 7f54e37ef6c0 Manual compaction at level-1 from '!items!G3dZTHIabA3LA1hY' @ 72057594037927935 : 1 .. '!items!xhEcsi3WHjbt2ro9' @ 0 : 0; will stop at (end) diff --git a/packs/armors/LOG.old b/packs/armors/LOG.old index 9b13e5a..67e23df 100644 --- a/packs/armors/LOG.old +++ b/packs/armors/LOG.old @@ -1,8 +1,8 @@ -2026/02/28-16:33:30.644599 7f56e3fff6c0 Recovering log #971 -2026/02/28-16:33:30.654938 7f56e3fff6c0 Delete type=3 #969 -2026/02/28-16:33:30.655008 7f56e3fff6c0 Delete type=0 #971 -2026/02/28-17:23:47.144484 7f54e37ef6c0 Level-0 table #976: started -2026/02/28-17:23:47.144510 7f54e37ef6c0 Level-0 table #976: 0 bytes OK -2026/02/28-17:23:47.151643 7f54e37ef6c0 Delete type=0 #974 -2026/02/28-17:23:47.170034 7f54e37ef6c0 Manual compaction at level-0 from '!items!G3dZTHIabA3LA1hY' @ 72057594037927935 : 1 .. '!items!xhEcsi3WHjbt2ro9' @ 0 : 0; will stop at (end) -2026/02/28-17:23:47.170076 7f54e37ef6c0 Manual compaction at level-1 from '!items!G3dZTHIabA3LA1hY' @ 72057594037927935 : 1 .. '!items!xhEcsi3WHjbt2ro9' @ 0 : 0; will stop at (end) +2026/02/28-17:23:52.858522 7f56e3fff6c0 Recovering log #975 +2026/02/28-17:23:52.869495 7f56e3fff6c0 Delete type=3 #973 +2026/02/28-17:23:52.869552 7f56e3fff6c0 Delete type=0 #975 +2026/02/28-22:59:43.737596 7f54e37ef6c0 Level-0 table #980: started +2026/02/28-22:59:43.737635 7f54e37ef6c0 Level-0 table #980: 0 bytes OK +2026/02/28-22:59:43.743801 7f54e37ef6c0 Delete type=0 #978 +2026/02/28-22:59:43.758414 7f54e37ef6c0 Manual compaction at level-0 from '!items!G3dZTHIabA3LA1hY' @ 72057594037927935 : 1 .. '!items!xhEcsi3WHjbt2ro9' @ 0 : 0; will stop at (end) +2026/02/28-22:59:43.758457 7f54e37ef6c0 Manual compaction at level-1 from '!items!G3dZTHIabA3LA1hY' @ 72057594037927935 : 1 .. '!items!xhEcsi3WHjbt2ro9' @ 0 : 0; will stop at (end) diff --git a/packs/armors/MANIFEST-000977 b/packs/armors/MANIFEST-000981 similarity index 73% rename from packs/armors/MANIFEST-000977 rename to packs/armors/MANIFEST-000981 index d42619ad7f170dbeb1a4067df44d6df0636aac1b..accf4a8e86e7539da3b29df357a1485331a4cdca 100644 GIT binary patch delta 41 scmbQkxR!B3x01lcdPXh=My6}*oD9s@*;%yYLr-i530wyW+yn{$0Ogbk-~a#s delta 24 gcmZ3>IEQgUx8Uv>3^7~`j7*oOApigX diff --git a/packs/boons/001072.log b/packs/boons/001077.log similarity index 100% rename from packs/boons/001072.log rename to packs/boons/001077.log diff --git a/packs/boons/CURRENT b/packs/boons/CURRENT index 6027312..f68ae27 100644 --- a/packs/boons/CURRENT +++ b/packs/boons/CURRENT @@ -1 +1 @@ -MANIFEST-001071 +MANIFEST-001075 diff --git a/packs/boons/LOG b/packs/boons/LOG index f6cb9ba..f5c4d01 100644 --- a/packs/boons/LOG +++ b/packs/boons/LOG @@ -1,3 +1,8 @@ -2026/02/28-17:23:52.757933 7f56f9bff6c0 Recovering log #1069 -2026/02/28-17:23:52.767692 7f56f9bff6c0 Delete type=3 #1067 -2026/02/28-17:23:52.767761 7f56f9bff6c0 Delete type=0 #1069 +2026/02/28-22:59:53.718001 7f56f8bfd6c0 Recovering log #1073 +2026/02/28-22:59:53.729345 7f56f8bfd6c0 Delete type=3 #1071 +2026/02/28-22:59:53.729412 7f56f8bfd6c0 Delete type=0 #1073 +2026/03/01-01:08:46.321084 7f54e37ef6c0 Level-0 table #1078: started +2026/03/01-01:08:46.321111 7f54e37ef6c0 Level-0 table #1078: 0 bytes OK +2026/03/01-01:08:46.327221 7f54e37ef6c0 Delete type=0 #1076 +2026/03/01-01:08:46.339937 7f54e37ef6c0 Manual compaction at level-0 from '!items!039ZF3E3MtAGwbiX' @ 72057594037927935 : 1 .. '!items!zgspy1QKaxdEetEw' @ 0 : 0; will stop at (end) +2026/03/01-01:08:46.339972 7f54e37ef6c0 Manual compaction at level-1 from '!items!039ZF3E3MtAGwbiX' @ 72057594037927935 : 1 .. '!items!zgspy1QKaxdEetEw' @ 0 : 0; will stop at (end) diff --git a/packs/boons/LOG.old b/packs/boons/LOG.old index 59c7177..94e4940 100644 --- a/packs/boons/LOG.old +++ b/packs/boons/LOG.old @@ -1,8 +1,8 @@ -2026/02/28-16:33:30.543841 7f56e3fff6c0 Recovering log #1065 -2026/02/28-16:33:30.553998 7f56e3fff6c0 Delete type=3 #1063 -2026/02/28-16:33:30.554062 7f56e3fff6c0 Delete type=0 #1065 -2026/02/28-17:23:47.101088 7f54e37ef6c0 Level-0 table #1070: started -2026/02/28-17:23:47.101118 7f54e37ef6c0 Level-0 table #1070: 0 bytes OK -2026/02/28-17:23:47.107544 7f54e37ef6c0 Delete type=0 #1068 -2026/02/28-17:23:47.119520 7f54e37ef6c0 Manual compaction at level-0 from '!items!039ZF3E3MtAGwbiX' @ 72057594037927935 : 1 .. '!items!zgspy1QKaxdEetEw' @ 0 : 0; will stop at (end) -2026/02/28-17:23:47.119595 7f54e37ef6c0 Manual compaction at level-1 from '!items!039ZF3E3MtAGwbiX' @ 72057594037927935 : 1 .. '!items!zgspy1QKaxdEetEw' @ 0 : 0; will stop at (end) +2026/02/28-17:23:52.757933 7f56f9bff6c0 Recovering log #1069 +2026/02/28-17:23:52.767692 7f56f9bff6c0 Delete type=3 #1067 +2026/02/28-17:23:52.767761 7f56f9bff6c0 Delete type=0 #1069 +2026/02/28-22:59:43.697108 7f54e37ef6c0 Level-0 table #1074: started +2026/02/28-22:59:43.697152 7f54e37ef6c0 Level-0 table #1074: 0 bytes OK +2026/02/28-22:59:43.704224 7f54e37ef6c0 Delete type=0 #1072 +2026/02/28-22:59:43.704461 7f54e37ef6c0 Manual compaction at level-0 from '!items!039ZF3E3MtAGwbiX' @ 72057594037927935 : 1 .. '!items!zgspy1QKaxdEetEw' @ 0 : 0; will stop at (end) +2026/02/28-22:59:43.704511 7f54e37ef6c0 Manual compaction at level-1 from '!items!039ZF3E3MtAGwbiX' @ 72057594037927935 : 1 .. '!items!zgspy1QKaxdEetEw' @ 0 : 0; will stop at (end) diff --git a/packs/boons/MANIFEST-001071 b/packs/boons/MANIFEST-001075 similarity index 72% rename from packs/boons/MANIFEST-001071 rename to packs/boons/MANIFEST-001075 index d4c597237c231219ea13375ceee076e2ec1fbe85..fb634a00a25871f53d18d34de1f498ebfe8e8c64 100644 GIT binary patch delta 43 tcmbQoxPfs(kBZ#lx6RxPj7(cNI2o9?aIEQgUx8V8%T<5qL7@5{{a56A&;9zk80AiK~ivR!s diff --git a/packs/careers/001071.log b/packs/careers/001076.log similarity index 100% rename from packs/careers/001071.log rename to packs/careers/001076.log diff --git a/packs/careers/CURRENT b/packs/careers/CURRENT index 210222d..c3c2e54 100644 --- a/packs/careers/CURRENT +++ b/packs/careers/CURRENT @@ -1 +1 @@ -MANIFEST-001070 +MANIFEST-001074 diff --git a/packs/careers/LOG b/packs/careers/LOG index dae2016..7e5770c 100644 --- a/packs/careers/LOG +++ b/packs/careers/LOG @@ -1,3 +1,8 @@ -2026/02/28-17:23:52.796426 7f56f9bff6c0 Recovering log #1068 -2026/02/28-17:23:52.805920 7f56f9bff6c0 Delete type=3 #1066 -2026/02/28-17:23:52.805973 7f56f9bff6c0 Delete type=0 #1068 +2026/02/28-22:59:53.759689 7f56f8bfd6c0 Recovering log #1072 +2026/02/28-22:59:53.770229 7f56f8bfd6c0 Delete type=3 #1070 +2026/02/28-22:59:53.770305 7f56f8bfd6c0 Delete type=0 #1072 +2026/03/01-01:08:46.327327 7f54e37ef6c0 Level-0 table #1077: started +2026/03/01-01:08:46.327354 7f54e37ef6c0 Level-0 table #1077: 0 bytes OK +2026/03/01-01:08:46.333262 7f54e37ef6c0 Delete type=0 #1075 +2026/03/01-01:08:46.339946 7f54e37ef6c0 Manual compaction at level-0 from '!items!4S4xAfMXGnuU0O1a' @ 72057594037927935 : 1 .. '!items!zxY3sW0iCJBvwjOS' @ 0 : 0; will stop at (end) +2026/03/01-01:08:46.339979 7f54e37ef6c0 Manual compaction at level-1 from '!items!4S4xAfMXGnuU0O1a' @ 72057594037927935 : 1 .. '!items!zxY3sW0iCJBvwjOS' @ 0 : 0; will stop at (end) diff --git a/packs/careers/LOG.old b/packs/careers/LOG.old index f37a57d..98e9684 100644 --- a/packs/careers/LOG.old +++ b/packs/careers/LOG.old @@ -1,8 +1,8 @@ -2026/02/28-16:33:30.581375 7f56f8bfd6c0 Recovering log #1064 -2026/02/28-16:33:30.592412 7f56f8bfd6c0 Delete type=3 #1062 -2026/02/28-16:33:30.592492 7f56f8bfd6c0 Delete type=0 #1064 -2026/02/28-17:23:47.113620 7f54e37ef6c0 Level-0 table #1069: started -2026/02/28-17:23:47.113644 7f54e37ef6c0 Level-0 table #1069: 0 bytes OK -2026/02/28-17:23:47.119422 7f54e37ef6c0 Delete type=0 #1067 -2026/02/28-17:23:47.119541 7f54e37ef6c0 Manual compaction at level-0 from '!items!4S4xAfMXGnuU0O1a' @ 72057594037927935 : 1 .. '!items!zxY3sW0iCJBvwjOS' @ 0 : 0; will stop at (end) -2026/02/28-17:23:47.119585 7f54e37ef6c0 Manual compaction at level-1 from '!items!4S4xAfMXGnuU0O1a' @ 72057594037927935 : 1 .. '!items!zxY3sW0iCJBvwjOS' @ 0 : 0; will stop at (end) +2026/02/28-17:23:52.796426 7f56f9bff6c0 Recovering log #1068 +2026/02/28-17:23:52.805920 7f56f9bff6c0 Delete type=3 #1066 +2026/02/28-17:23:52.805973 7f56f9bff6c0 Delete type=0 #1068 +2026/02/28-22:59:43.711333 7f54e37ef6c0 Level-0 table #1073: started +2026/02/28-22:59:43.711370 7f54e37ef6c0 Level-0 table #1073: 0 bytes OK +2026/02/28-22:59:43.717336 7f54e37ef6c0 Delete type=0 #1071 +2026/02/28-22:59:43.731041 7f54e37ef6c0 Manual compaction at level-0 from '!items!4S4xAfMXGnuU0O1a' @ 72057594037927935 : 1 .. '!items!zxY3sW0iCJBvwjOS' @ 0 : 0; will stop at (end) +2026/02/28-22:59:43.731086 7f54e37ef6c0 Manual compaction at level-1 from '!items!4S4xAfMXGnuU0O1a' @ 72057594037927935 : 1 .. '!items!zxY3sW0iCJBvwjOS' @ 0 : 0; will stop at (end) diff --git a/packs/careers/MANIFEST-001070 b/packs/careers/MANIFEST-001074 similarity index 72% rename from packs/careers/MANIFEST-001070 rename to packs/careers/MANIFEST-001074 index ab210f9d88aaf2c4112d3c850cfec203d71d706f..fbdc23608a1930444362312ee9ce86d0deb0e09f 100644 GIT binary patch delta 43 tcmbQoxPfs(kILt=qzG;XMyAaioD9rcI9RSTHnu+41`^o<64?e40RSVR3@rcv delta 25 hcmdnMIFE5ck5Ep##2;=3MyB-~oD9qxI9RST0sv+a2I~L- diff --git a/packs/effets-exemples/001069.log b/packs/effets-exemples/001074.log similarity index 100% rename from packs/effets-exemples/001069.log rename to packs/effets-exemples/001074.log diff --git a/packs/effets-exemples/CURRENT b/packs/effets-exemples/CURRENT index 436e6b4..422b12b 100644 --- a/packs/effets-exemples/CURRENT +++ b/packs/effets-exemples/CURRENT @@ -1 +1 @@ -MANIFEST-001068 +MANIFEST-001072 diff --git a/packs/effets-exemples/LOG b/packs/effets-exemples/LOG index b614af9..1403e12 100644 --- a/packs/effets-exemples/LOG +++ b/packs/effets-exemples/LOG @@ -1,3 +1,8 @@ -2026/02/28-17:23:52.970603 7f56f9bff6c0 Recovering log #1066 -2026/02/28-17:23:52.981835 7f56f9bff6c0 Delete type=3 #1064 -2026/02/28-17:23:52.981888 7f56f9bff6c0 Delete type=0 #1066 +2026/02/28-22:59:53.948768 7f56f93fe6c0 Recovering log #1070 +2026/02/28-22:59:53.958702 7f56f93fe6c0 Delete type=3 #1068 +2026/02/28-22:59:53.958781 7f56f93fe6c0 Delete type=0 #1070 +2026/03/01-01:08:46.425514 7f54e37ef6c0 Level-0 table #1075: started +2026/03/01-01:08:46.425561 7f54e37ef6c0 Level-0 table #1075: 0 bytes OK +2026/03/01-01:08:46.431671 7f54e37ef6c0 Delete type=0 #1073 +2026/03/01-01:08:46.445290 7f54e37ef6c0 Manual compaction at level-0 from '!items!6fTZ6hOKR4pWbWOe' @ 72057594037927935 : 1 .. '!items!zwSNMO9HpiqUCMt8' @ 0 : 0; will stop at (end) +2026/03/01-01:08:46.445328 7f54e37ef6c0 Manual compaction at level-1 from '!items!6fTZ6hOKR4pWbWOe' @ 72057594037927935 : 1 .. '!items!zwSNMO9HpiqUCMt8' @ 0 : 0; will stop at (end) diff --git a/packs/effets-exemples/LOG.old b/packs/effets-exemples/LOG.old index baa34c5..fbd528b 100644 --- a/packs/effets-exemples/LOG.old +++ b/packs/effets-exemples/LOG.old @@ -1,8 +1,8 @@ -2026/02/28-16:33:30.759164 7f56f9bff6c0 Recovering log #1062 -2026/02/28-16:33:30.769105 7f56f9bff6c0 Delete type=3 #1060 -2026/02/28-16:33:30.769164 7f56f9bff6c0 Delete type=0 #1062 -2026/02/28-17:23:47.203516 7f54e37ef6c0 Level-0 table #1067: started -2026/02/28-17:23:47.203569 7f54e37ef6c0 Level-0 table #1067: 0 bytes OK -2026/02/28-17:23:47.210686 7f54e37ef6c0 Delete type=0 #1065 -2026/02/28-17:23:47.224578 7f54e37ef6c0 Manual compaction at level-0 from '!items!6fTZ6hOKR4pWbWOe' @ 72057594037927935 : 1 .. '!items!zwSNMO9HpiqUCMt8' @ 0 : 0; will stop at (end) -2026/02/28-17:23:47.224615 7f54e37ef6c0 Manual compaction at level-1 from '!items!6fTZ6hOKR4pWbWOe' @ 72057594037927935 : 1 .. '!items!zwSNMO9HpiqUCMt8' @ 0 : 0; will stop at (end) +2026/02/28-17:23:52.970603 7f56f9bff6c0 Recovering log #1066 +2026/02/28-17:23:52.981835 7f56f9bff6c0 Delete type=3 #1064 +2026/02/28-17:23:52.981888 7f56f9bff6c0 Delete type=0 #1066 +2026/02/28-22:59:43.785498 7f54e37ef6c0 Level-0 table #1071: started +2026/02/28-22:59:43.785523 7f54e37ef6c0 Level-0 table #1071: 0 bytes OK +2026/02/28-22:59:43.792317 7f54e37ef6c0 Delete type=0 #1069 +2026/02/28-22:59:43.813749 7f54e37ef6c0 Manual compaction at level-0 from '!items!6fTZ6hOKR4pWbWOe' @ 72057594037927935 : 1 .. '!items!zwSNMO9HpiqUCMt8' @ 0 : 0; will stop at (end) +2026/02/28-22:59:43.813808 7f54e37ef6c0 Manual compaction at level-1 from '!items!6fTZ6hOKR4pWbWOe' @ 72057594037927935 : 1 .. '!items!zwSNMO9HpiqUCMt8' @ 0 : 0; will stop at (end) diff --git a/packs/effets-exemples/MANIFEST-001068 b/packs/effets-exemples/MANIFEST-001072 similarity index 73% rename from packs/effets-exemples/MANIFEST-001068 rename to packs/effets-exemples/MANIFEST-001072 index d28bc09e5922f652fca9464ea2a34a94c8949f86..a78947bc021e642ede5157fe9accbfe48caf7e02 100644 GIT binary patch delta 41 rcmbQkxR!B3w^GY#Zd)z}My8D%oD9sHI9MbC+zxqw1U7*Lwg3eH-%SY< delta 24 gcmZ3>IEQgUx8S^A8}@K9Ffy&>;ACK4$H5{20Bw;68~^|S diff --git a/packs/equipment/001072.log b/packs/equipment/001077.log similarity index 100% rename from packs/equipment/001072.log rename to packs/equipment/001077.log diff --git a/packs/equipment/CURRENT b/packs/equipment/CURRENT index 6027312..f68ae27 100644 --- a/packs/equipment/CURRENT +++ b/packs/equipment/CURRENT @@ -1 +1 @@ -MANIFEST-001071 +MANIFEST-001075 diff --git a/packs/equipment/LOG b/packs/equipment/LOG index b03c632..81080dc 100644 --- a/packs/equipment/LOG +++ b/packs/equipment/LOG @@ -1,3 +1,8 @@ -2026/02/28-17:23:52.834261 7f56f9bff6c0 Recovering log #1069 -2026/02/28-17:23:52.843912 7f56f9bff6c0 Delete type=3 #1067 -2026/02/28-17:23:52.843969 7f56f9bff6c0 Delete type=0 #1069 +2026/02/28-22:59:53.798832 7f56f9bff6c0 Recovering log #1073 +2026/02/28-22:59:53.809449 7f56f9bff6c0 Delete type=3 #1071 +2026/02/28-22:59:53.809533 7f56f9bff6c0 Delete type=0 #1073 +2026/03/01-01:08:46.340100 7f54e37ef6c0 Level-0 table #1078: started +2026/03/01-01:08:46.340139 7f54e37ef6c0 Level-0 table #1078: 0 bytes OK +2026/03/01-01:08:46.346846 7f54e37ef6c0 Delete type=0 #1076 +2026/03/01-01:08:46.366221 7f54e37ef6c0 Manual compaction at level-0 from '!items!0ErhyqifZLDCmMfT' @ 72057594037927935 : 1 .. '!items!yE8UH6YAgNGjKDEu' @ 0 : 0; will stop at (end) +2026/03/01-01:08:46.366278 7f54e37ef6c0 Manual compaction at level-1 from '!items!0ErhyqifZLDCmMfT' @ 72057594037927935 : 1 .. '!items!yE8UH6YAgNGjKDEu' @ 0 : 0; will stop at (end) diff --git a/packs/equipment/LOG.old b/packs/equipment/LOG.old index a3b3c3c..1955707 100644 --- a/packs/equipment/LOG.old +++ b/packs/equipment/LOG.old @@ -1,8 +1,8 @@ -2026/02/28-16:33:30.620158 7f56f9bff6c0 Recovering log #1065 -2026/02/28-16:33:30.630293 7f56f9bff6c0 Delete type=3 #1063 -2026/02/28-16:33:30.630363 7f56f9bff6c0 Delete type=0 #1065 -2026/02/28-17:23:47.126363 7f54e37ef6c0 Level-0 table #1070: started -2026/02/28-17:23:47.126384 7f54e37ef6c0 Level-0 table #1070: 0 bytes OK -2026/02/28-17:23:47.132261 7f54e37ef6c0 Delete type=0 #1068 -2026/02/28-17:23:47.144361 7f54e37ef6c0 Manual compaction at level-0 from '!items!0ErhyqifZLDCmMfT' @ 72057594037927935 : 1 .. '!items!yE8UH6YAgNGjKDEu' @ 0 : 0; will stop at (end) -2026/02/28-17:23:47.144409 7f54e37ef6c0 Manual compaction at level-1 from '!items!0ErhyqifZLDCmMfT' @ 72057594037927935 : 1 .. '!items!yE8UH6YAgNGjKDEu' @ 0 : 0; will stop at (end) +2026/02/28-17:23:52.834261 7f56f9bff6c0 Recovering log #1069 +2026/02/28-17:23:52.843912 7f56f9bff6c0 Delete type=3 #1067 +2026/02/28-17:23:52.843969 7f56f9bff6c0 Delete type=0 #1069 +2026/02/28-22:59:43.704672 7f54e37ef6c0 Level-0 table #1074: started +2026/02/28-22:59:43.704745 7f54e37ef6c0 Level-0 table #1074: 0 bytes OK +2026/02/28-22:59:43.711212 7f54e37ef6c0 Delete type=0 #1072 +2026/02/28-22:59:43.731026 7f54e37ef6c0 Manual compaction at level-0 from '!items!0ErhyqifZLDCmMfT' @ 72057594037927935 : 1 .. '!items!yE8UH6YAgNGjKDEu' @ 0 : 0; will stop at (end) +2026/02/28-22:59:43.731077 7f54e37ef6c0 Manual compaction at level-1 from '!items!0ErhyqifZLDCmMfT' @ 72057594037927935 : 1 .. '!items!yE8UH6YAgNGjKDEu' @ 0 : 0; will stop at (end) diff --git a/packs/equipment/MANIFEST-001071 b/packs/equipment/MANIFEST-001075 similarity index 73% rename from packs/equipment/MANIFEST-001071 rename to packs/equipment/MANIFEST-001075 index 6d3f3e00f885af99468d862018eece3d990940d5..4f3c411c1b9bcc4e7f38ffea11de0f9dce1b2089 100644 GIT binary patch delta 43 tcmbQsxSnxBx60(HnI_x}j7(cNI2o9?aB(fbO0ss%d3wrkloj7%FiI2o8Xagj7*z3I2o9?aImakQv81SBS>TmNMsvG1OO3M3yJ^$ delta 25 hcmZ3_IG1rkw~)_Q?xoxej7;k}I2o8XaImak0sv%{2BZK0 diff --git a/packs/races/001071.log b/packs/races/001076.log similarity index 100% rename from packs/races/001071.log rename to packs/races/001076.log diff --git a/packs/races/CURRENT b/packs/races/CURRENT index 210222d..c3c2e54 100644 --- a/packs/races/CURRENT +++ b/packs/races/CURRENT @@ -1 +1 @@ -MANIFEST-001070 +MANIFEST-001074 diff --git a/packs/races/LOG b/packs/races/LOG index 54c3d90..f1403a2 100644 --- a/packs/races/LOG +++ b/packs/races/LOG @@ -1,3 +1,8 @@ -2026/02/28-17:23:52.820409 7f56e3fff6c0 Recovering log #1068 -2026/02/28-17:23:52.831852 7f56e3fff6c0 Delete type=3 #1066 -2026/02/28-17:23:52.831927 7f56e3fff6c0 Delete type=0 #1068 +2026/02/28-22:59:53.785285 7f56e3fff6c0 Recovering log #1072 +2026/02/28-22:59:53.795623 7f56e3fff6c0 Delete type=3 #1070 +2026/02/28-22:59:53.795753 7f56e3fff6c0 Delete type=0 #1072 +2026/03/01-01:08:46.353251 7f54e37ef6c0 Level-0 table #1077: started +2026/03/01-01:08:46.353286 7f54e37ef6c0 Level-0 table #1077: 0 bytes OK +2026/03/01-01:08:46.359340 7f54e37ef6c0 Delete type=0 #1075 +2026/03/01-01:08:46.366250 7f54e37ef6c0 Manual compaction at level-0 from '!items!3oOvUd7AIqrXzLDl' @ 72057594037927935 : 1 .. '!items!oWexVALVtDXmedMy' @ 0 : 0; will stop at (end) +2026/03/01-01:08:46.366306 7f54e37ef6c0 Manual compaction at level-1 from '!items!3oOvUd7AIqrXzLDl' @ 72057594037927935 : 1 .. '!items!oWexVALVtDXmedMy' @ 0 : 0; will stop at (end) diff --git a/packs/races/LOG.old b/packs/races/LOG.old index 27f9a2c..d706b6d 100644 --- a/packs/races/LOG.old +++ b/packs/races/LOG.old @@ -1,8 +1,8 @@ -2026/02/28-16:33:30.607336 7f56e3fff6c0 Recovering log #1064 -2026/02/28-16:33:30.617749 7f56e3fff6c0 Delete type=3 #1062 -2026/02/28-16:33:30.617797 7f56e3fff6c0 Delete type=0 #1064 -2026/02/28-17:23:47.119733 7f54e37ef6c0 Level-0 table #1069: started -2026/02/28-17:23:47.119789 7f54e37ef6c0 Level-0 table #1069: 0 bytes OK -2026/02/28-17:23:47.126273 7f54e37ef6c0 Delete type=0 #1067 -2026/02/28-17:23:47.144350 7f54e37ef6c0 Manual compaction at level-0 from '!items!3oOvUd7AIqrXzLDl' @ 72057594037927935 : 1 .. '!items!oWexVALVtDXmedMy' @ 0 : 0; will stop at (end) -2026/02/28-17:23:47.144395 7f54e37ef6c0 Manual compaction at level-1 from '!items!3oOvUd7AIqrXzLDl' @ 72057594037927935 : 1 .. '!items!oWexVALVtDXmedMy' @ 0 : 0; will stop at (end) +2026/02/28-17:23:52.820409 7f56e3fff6c0 Recovering log #1068 +2026/02/28-17:23:52.831852 7f56e3fff6c0 Delete type=3 #1066 +2026/02/28-17:23:52.831927 7f56e3fff6c0 Delete type=0 #1068 +2026/02/28-22:59:43.724001 7f54e37ef6c0 Level-0 table #1073: started +2026/02/28-22:59:43.724047 7f54e37ef6c0 Level-0 table #1073: 0 bytes OK +2026/02/28-22:59:43.730898 7f54e37ef6c0 Delete type=0 #1071 +2026/02/28-22:59:43.731066 7f54e37ef6c0 Manual compaction at level-0 from '!items!3oOvUd7AIqrXzLDl' @ 72057594037927935 : 1 .. '!items!oWexVALVtDXmedMy' @ 0 : 0; will stop at (end) +2026/02/28-22:59:43.731104 7f54e37ef6c0 Manual compaction at level-1 from '!items!3oOvUd7AIqrXzLDl' @ 72057594037927935 : 1 .. '!items!oWexVALVtDXmedMy' @ 0 : 0; will stop at (end) diff --git a/packs/races/MANIFEST-001070 b/packs/races/MANIFEST-001074 similarity index 73% rename from packs/races/MANIFEST-001070 rename to packs/races/MANIFEST-001074 index b20eed67d524058919767872c0a7c8dae648a2d8..c872783d38ada11a4c08e767a1afcaa36c527fa8 100644 GIT binary patch delta 41 scmbQkxR!B3x6+mOk{h`g7@0P6a56A&;b3t%eP5*lB(Mb}uni~x01WjD2LJ#7 delta 24 gcmZ3>IEQgUx8V8%T<5qL7@5{{a56A&;9zk80AiK~ivR!s diff --git a/packs/spells/001071.log b/packs/spells/001076.log similarity index 100% rename from packs/spells/001071.log rename to packs/spells/001076.log diff --git a/packs/spells/CURRENT b/packs/spells/CURRENT index 210222d..c3c2e54 100644 --- a/packs/spells/CURRENT +++ b/packs/spells/CURRENT @@ -1 +1 @@ -MANIFEST-001070 +MANIFEST-001074 diff --git a/packs/spells/LOG b/packs/spells/LOG index 6342eb5..061cf42 100644 --- a/packs/spells/LOG +++ b/packs/spells/LOG @@ -1,3 +1,8 @@ -2026/02/28-17:23:52.908514 7f56f93fe6c0 Recovering log #1068 -2026/02/28-17:23:52.918072 7f56f93fe6c0 Delete type=3 #1066 -2026/02/28-17:23:52.918131 7f56f93fe6c0 Delete type=0 #1068 +2026/02/28-22:59:53.881284 7f56e3fff6c0 Recovering log #1072 +2026/02/28-22:59:53.892564 7f56e3fff6c0 Delete type=3 #1070 +2026/02/28-22:59:53.892646 7f56e3fff6c0 Delete type=0 #1072 +2026/03/01-01:08:46.398276 7f54e37ef6c0 Level-0 table #1077: started +2026/03/01-01:08:46.398304 7f54e37ef6c0 Level-0 table #1077: 0 bytes OK +2026/03/01-01:08:46.404544 7f54e37ef6c0 Delete type=0 #1075 +2026/03/01-01:08:46.417843 7f54e37ef6c0 Manual compaction at level-0 from '!items!2svd3uio8Hp4e5Wy' @ 72057594037927935 : 1 .. '!items!zq5h9kCpo8gK4oIH' @ 0 : 0; will stop at (end) +2026/03/01-01:08:46.417869 7f54e37ef6c0 Manual compaction at level-1 from '!items!2svd3uio8Hp4e5Wy' @ 72057594037927935 : 1 .. '!items!zq5h9kCpo8gK4oIH' @ 0 : 0; will stop at (end) diff --git a/packs/spells/LOG.old b/packs/spells/LOG.old index 207b04f..4ba484b 100644 --- a/packs/spells/LOG.old +++ b/packs/spells/LOG.old @@ -1,8 +1,8 @@ -2026/02/28-16:33:30.696883 7f56f93fe6c0 Recovering log #1064 -2026/02/28-16:33:30.706599 7f56f93fe6c0 Delete type=3 #1062 -2026/02/28-16:33:30.706663 7f56f93fe6c0 Delete type=0 #1064 -2026/02/28-17:23:47.183016 7f54e37ef6c0 Level-0 table #1069: started -2026/02/28-17:23:47.183043 7f54e37ef6c0 Level-0 table #1069: 0 bytes OK -2026/02/28-17:23:47.190475 7f54e37ef6c0 Delete type=0 #1067 -2026/02/28-17:23:47.196884 7f54e37ef6c0 Manual compaction at level-0 from '!items!2svd3uio8Hp4e5Wy' @ 72057594037927935 : 1 .. '!items!zq5h9kCpo8gK4oIH' @ 0 : 0; will stop at (end) -2026/02/28-17:23:47.196917 7f54e37ef6c0 Manual compaction at level-1 from '!items!2svd3uio8Hp4e5Wy' @ 72057594037927935 : 1 .. '!items!zq5h9kCpo8gK4oIH' @ 0 : 0; will stop at (end) +2026/02/28-17:23:52.908514 7f56f93fe6c0 Recovering log #1068 +2026/02/28-17:23:52.918072 7f56f93fe6c0 Delete type=3 #1066 +2026/02/28-17:23:52.918131 7f56f93fe6c0 Delete type=0 #1068 +2026/02/28-22:59:43.778924 7f54e37ef6c0 Level-0 table #1073: started +2026/02/28-22:59:43.778984 7f54e37ef6c0 Level-0 table #1073: 0 bytes OK +2026/02/28-22:59:43.785225 7f54e37ef6c0 Delete type=0 #1071 +2026/02/28-22:59:43.785364 7f54e37ef6c0 Manual compaction at level-0 from '!items!2svd3uio8Hp4e5Wy' @ 72057594037927935 : 1 .. '!items!zq5h9kCpo8gK4oIH' @ 0 : 0; will stop at (end) +2026/02/28-22:59:43.785392 7f54e37ef6c0 Manual compaction at level-1 from '!items!2svd3uio8Hp4e5Wy' @ 72057594037927935 : 1 .. '!items!zq5h9kCpo8gK4oIH' @ 0 : 0; will stop at (end) diff --git a/packs/spells/MANIFEST-001070 b/packs/spells/MANIFEST-001074 similarity index 73% rename from packs/spells/MANIFEST-001070 rename to packs/spells/MANIFEST-001074 index a3e47530bbd4f743473bef7b3730863bea2466aa..7251be990100b2e8bc59a26203892eebfdb58415 100644 GIT binary patch delta 41 scmbQkxR!B3x02_kYp1vv7@0P6a56A&;b2h+Q+hEKB(Mb}uni~x00d?Vga7~l delta 24 gcmZ3>IEQgUx1bT@vGrUGj7;k}I2o8XaIh!<09T6z%m4rY diff --git a/packs/vehicleweapons/000978.log b/packs/vehicleweapons/000983.log similarity index 100% rename from packs/vehicleweapons/000978.log rename to packs/vehicleweapons/000983.log diff --git a/packs/vehicleweapons/CURRENT b/packs/vehicleweapons/CURRENT index 760f0f8..f51a32f 100644 --- a/packs/vehicleweapons/CURRENT +++ b/packs/vehicleweapons/CURRENT @@ -1 +1 @@ -MANIFEST-000977 +MANIFEST-000981 diff --git a/packs/vehicleweapons/LOG b/packs/vehicleweapons/LOG index df10a5d..4974235 100644 --- a/packs/vehicleweapons/LOG +++ b/packs/vehicleweapons/LOG @@ -1,3 +1,8 @@ -2026/02/28-17:23:52.871452 7f56f9bff6c0 Recovering log #975 -2026/02/28-17:23:52.881163 7f56f9bff6c0 Delete type=3 #973 -2026/02/28-17:23:52.881256 7f56f9bff6c0 Delete type=0 #975 +2026/02/28-22:59:53.839850 7f56f9bff6c0 Recovering log #979 +2026/02/28-22:59:53.850551 7f56f9bff6c0 Delete type=3 #977 +2026/02/28-22:59:53.850617 7f56f9bff6c0 Delete type=0 #979 +2026/03/01-01:08:46.378747 7f54e37ef6c0 Level-0 table #984: started +2026/03/01-01:08:46.378770 7f54e37ef6c0 Level-0 table #984: 0 bytes OK +2026/03/01-01:08:46.384608 7f54e37ef6c0 Delete type=0 #982 +2026/03/01-01:08:46.391700 7f54e37ef6c0 Manual compaction at level-0 from '!items!2cqkViQnOYZ4qwU1' @ 72057594037927935 : 1 .. '!items!qcCZxbaV9sucG1XK' @ 0 : 0; will stop at (end) +2026/03/01-01:08:46.391740 7f54e37ef6c0 Manual compaction at level-1 from '!items!2cqkViQnOYZ4qwU1' @ 72057594037927935 : 1 .. '!items!qcCZxbaV9sucG1XK' @ 0 : 0; will stop at (end) diff --git a/packs/vehicleweapons/LOG.old b/packs/vehicleweapons/LOG.old index bed2d51..89be01b 100644 --- a/packs/vehicleweapons/LOG.old +++ b/packs/vehicleweapons/LOG.old @@ -1,8 +1,8 @@ -2026/02/28-16:33:30.657363 7f56f8bfd6c0 Recovering log #971 -2026/02/28-16:33:30.668267 7f56f8bfd6c0 Delete type=3 #969 -2026/02/28-16:33:30.668326 7f56f8bfd6c0 Delete type=0 #971 -2026/02/28-17:23:47.151742 7f54e37ef6c0 Level-0 table #976: started -2026/02/28-17:23:47.151765 7f54e37ef6c0 Level-0 table #976: 0 bytes OK -2026/02/28-17:23:47.157639 7f54e37ef6c0 Delete type=0 #974 -2026/02/28-17:23:47.170048 7f54e37ef6c0 Manual compaction at level-0 from '!items!2cqkViQnOYZ4qwU1' @ 72057594037927935 : 1 .. '!items!qcCZxbaV9sucG1XK' @ 0 : 0; will stop at (end) -2026/02/28-17:23:47.170083 7f54e37ef6c0 Manual compaction at level-1 from '!items!2cqkViQnOYZ4qwU1' @ 72057594037927935 : 1 .. '!items!qcCZxbaV9sucG1XK' @ 0 : 0; will stop at (end) +2026/02/28-17:23:52.871452 7f56f9bff6c0 Recovering log #975 +2026/02/28-17:23:52.881163 7f56f9bff6c0 Delete type=3 #973 +2026/02/28-17:23:52.881256 7f56f9bff6c0 Delete type=0 #975 +2026/02/28-22:59:43.743995 7f54e37ef6c0 Level-0 table #980: started +2026/02/28-22:59:43.744036 7f54e37ef6c0 Level-0 table #980: 0 bytes OK +2026/02/28-22:59:43.750443 7f54e37ef6c0 Delete type=0 #978 +2026/02/28-22:59:43.758428 7f54e37ef6c0 Manual compaction at level-0 from '!items!2cqkViQnOYZ4qwU1' @ 72057594037927935 : 1 .. '!items!qcCZxbaV9sucG1XK' @ 0 : 0; will stop at (end) +2026/02/28-22:59:43.758464 7f54e37ef6c0 Manual compaction at level-1 from '!items!2cqkViQnOYZ4qwU1' @ 72057594037927935 : 1 .. '!items!qcCZxbaV9sucG1XK' @ 0 : 0; will stop at (end) diff --git a/packs/vehicleweapons/MANIFEST-000977 b/packs/vehicleweapons/MANIFEST-000981 similarity index 73% rename from packs/vehicleweapons/MANIFEST-000977 rename to packs/vehicleweapons/MANIFEST-000981 index 686c2b72faf9fb96168f55a65938c0ca8b059532..f45901ea029134db88acef5cebce3d6bd9f011c0 100644 GIT binary patch delta 41 scmbQkxR!B3x01lcdPXh=My6}*oD9s@*;%yYLr-i530wyW+yn{$0Ogbk-~a#s delta 24 gcmZ3>IEQgUx8Uv>3^7~`j7*oOApigX diff --git a/packs/weapons/000984.log b/packs/weapons/000989.log similarity index 100% rename from packs/weapons/000984.log rename to packs/weapons/000989.log diff --git a/packs/weapons/CURRENT b/packs/weapons/CURRENT index 1dfa95c..2dc6923 100644 --- a/packs/weapons/CURRENT +++ b/packs/weapons/CURRENT @@ -1 +1 @@ -MANIFEST-000983 +MANIFEST-000987 diff --git a/packs/weapons/LOG b/packs/weapons/LOG index c9eb861..17b2865 100644 --- a/packs/weapons/LOG +++ b/packs/weapons/LOG @@ -1,3 +1,8 @@ -2026/02/28-17:23:52.846187 7f56f93fe6c0 Recovering log #981 -2026/02/28-17:23:52.856256 7f56f93fe6c0 Delete type=3 #979 -2026/02/28-17:23:52.856329 7f56f93fe6c0 Delete type=0 #981 +2026/02/28-22:59:53.812922 7f56f93fe6c0 Recovering log #985 +2026/02/28-22:59:53.822992 7f56f93fe6c0 Delete type=3 #983 +2026/02/28-22:59:53.823060 7f56f93fe6c0 Delete type=0 #985 +2026/03/01-01:08:46.359452 7f54e37ef6c0 Level-0 table #990: started +2026/03/01-01:08:46.359484 7f54e37ef6c0 Level-0 table #990: 0 bytes OK +2026/03/01-01:08:46.366109 7f54e37ef6c0 Delete type=0 #988 +2026/03/01-01:08:46.366268 7f54e37ef6c0 Manual compaction at level-0 from '!items!2xxMC458KXaAgm3T' @ 72057594037927935 : 1 .. '!items!zjOFhNocHjeJZcy4' @ 0 : 0; will stop at (end) +2026/03/01-01:08:46.366297 7f54e37ef6c0 Manual compaction at level-1 from '!items!2xxMC458KXaAgm3T' @ 72057594037927935 : 1 .. '!items!zjOFhNocHjeJZcy4' @ 0 : 0; will stop at (end) diff --git a/packs/weapons/LOG.old b/packs/weapons/LOG.old index 7337c13..e4b6513 100644 --- a/packs/weapons/LOG.old +++ b/packs/weapons/LOG.old @@ -1,8 +1,8 @@ -2026/02/28-16:33:30.632587 7f56f93fe6c0 Recovering log #977 -2026/02/28-16:33:30.642029 7f56f93fe6c0 Delete type=3 #975 -2026/02/28-16:33:30.642091 7f56f93fe6c0 Delete type=0 #977 -2026/02/28-17:23:47.138374 7f54e37ef6c0 Level-0 table #982: started -2026/02/28-17:23:47.138404 7f54e37ef6c0 Level-0 table #982: 0 bytes OK -2026/02/28-17:23:47.144277 7f54e37ef6c0 Delete type=0 #980 -2026/02/28-17:23:47.144377 7f54e37ef6c0 Manual compaction at level-0 from '!items!2xxMC458KXaAgm3T' @ 72057594037927935 : 1 .. '!items!zjOFhNocHjeJZcy4' @ 0 : 0; will stop at (end) -2026/02/28-17:23:47.144417 7f54e37ef6c0 Manual compaction at level-1 from '!items!2xxMC458KXaAgm3T' @ 72057594037927935 : 1 .. '!items!zjOFhNocHjeJZcy4' @ 0 : 0; will stop at (end) +2026/02/28-17:23:52.846187 7f56f93fe6c0 Recovering log #981 +2026/02/28-17:23:52.856256 7f56f93fe6c0 Delete type=3 #979 +2026/02/28-17:23:52.856329 7f56f93fe6c0 Delete type=0 #981 +2026/02/28-22:59:43.717496 7f54e37ef6c0 Level-0 table #986: started +2026/02/28-22:59:43.717545 7f54e37ef6c0 Level-0 table #986: 0 bytes OK +2026/02/28-22:59:43.723858 7f54e37ef6c0 Delete type=0 #984 +2026/02/28-22:59:43.731055 7f54e37ef6c0 Manual compaction at level-0 from '!items!2xxMC458KXaAgm3T' @ 72057594037927935 : 1 .. '!items!zjOFhNocHjeJZcy4' @ 0 : 0; will stop at (end) +2026/02/28-22:59:43.731096 7f54e37ef6c0 Manual compaction at level-1 from '!items!2xxMC458KXaAgm3T' @ 72057594037927935 : 1 .. '!items!zjOFhNocHjeJZcy4' @ 0 : 0; will stop at (end) diff --git a/packs/weapons/MANIFEST-000983 b/packs/weapons/MANIFEST-000987 similarity index 72% rename from packs/weapons/MANIFEST-000983 rename to packs/weapons/MANIFEST-000987 index c3789631a6957b2a9d8a1dd50435de4261646934..d653edac1fa790acc7c3cd1f74a42dc33c221ba8 100644 GIT binary patch delta 43 tcmbQoxPfs(kILb&x8JxK7@6*{b22dBWoKE=bc8_0sw9?2U`FD diff --git a/styles/components/actor.less b/styles/components/actor.less index b2180b8..bc89c74 100644 --- a/styles/components/actor.less +++ b/styles/components/actor.less @@ -111,6 +111,28 @@ &:hover { color: #4b4a44; } } + .horde-stat-label { + font-weight: bold; + font-family: "Wolfsbane2Expanded", cursive; + font-size: 1rem; + font-variant: small-caps; + color: #4b4a44; + display: flex; + align-items: center; + } + + .horde-stat-row { + align-items: center; + margin-bottom: 4px; + } + + .horde-stat-sep { + color: #4b4a44; + font-weight: bold; + padding: 0 4px; + flex: 0; + } + .bol-footer { height: 62px; max-height: 62px; @@ -346,12 +368,166 @@ } .character-summary-container { - opacity: 0.95; + background: #f5f0e8; + padding: 4px; + + // Table layout + .cs-table { + width: 100%; + margin: 0; + } + + // Section headers (PJs / PNJs) + .cs-section-header { + background: linear-gradient(135deg, #7a0000, darkred); + padding: 4px 6px; + min-height: 28px; + align-items: center; + margin-top: 2px; + + .item-name, + .cs-name-col { + font-family: "Wolfsbane2Expanded", cursive !important; + font-size: 1.1em !important; + color: #fff !important; + text-shadow: 0 1px 2px rgba(0,0,0,0.5); + } + .cs-group-header { + font-family: 'Signika', sans-serif !important; + font-size: 0.75em !important; + color: #ffdddd !important; + text-align: center; + justify-content: center; + text-transform: uppercase; + letter-spacing: 0.06em; + border-left: 1px solid rgba(255,255,255,0.25); + } + } + + // Column sub-header row (abbrevs) + .cs-col-row { + background: #ede0cc; + min-height: 20px; + padding: 1px 6px; + align-items: center; + border-bottom: 1px solid #c8b89a; + .cs-col-header { + font-family: 'Signika', sans-serif !important; + font-size: 0.75em !important; + color: #7a0000 !important; + text-align: center; + justify-content: center; + font-weight: bold; + } + } + + // Actor portrait + .cs-portrait-col { + flex: 0 0 34px; + width: 34px; + min-width: 34px; + display: flex; + align-items: center; + justify-content: center; + } + .cs-portrait { + width: 30px; + height: 30px; + border-radius: 3px; + border: 1px solid #c0a080; + object-fit: cover; + } + + // Name column + .cs-name-col { + min-width: 9rem; + width: 9rem; + } + + // Actor rows + .cs-actor-row { + min-height: 36px; + padding: 3px 4px; + border-bottom: 1px solid #d0c8b8; + align-items: center; + background: #faf6ee; + transition: background 0.15s; + + &:hover { + background: #ede8dc; + } + } + + // Actor name link + .cs-actor-name { + font-family: 'Signika', sans-serif; + font-size: 0.9em; + color: #7a0000; + font-weight: bold; + cursor: pointer; + text-decoration: none; + + &:hover { text-decoration: underline; } + } + + // Stat cells (clickable rolls) + .cs-stat { + justify-content: center; + text-align: center; + } + // Visual separator at start of a column group + .cs-group-sep { + border-left: 1px solid #c0a878; + } + .cs-col-row .cs-group-sep { + border-left: 1px solid #c0a878; + } + .cs-rollable { + display: inline-block; + min-width: 1.8em; + text-align: center; + color: #333; + font-size: 0.88em; + font-weight: bold; + font-family: 'Orbitron', sans-serif; + border-radius: 3px; + padding: 1px 3px; + cursor: pointer; + text-decoration: none; + + &:hover { + background: darkred; + color: #fff; + } + } + + // Resource cells (val/max) + .cs-resource { + justify-content: center; + font-size: 0.82em; + color: #555; + gap: 1px; + } + .cs-res-val { color: #191813; font-weight: bold; font-family: 'Orbitron', sans-serif; } + .cs-res-sep { color: #999; } + .cs-res-max { color: #888; font-family: 'Orbitron', sans-serif; } + + // Horoscope inputs + .cs-input { + width: 3rem; + text-align: center; + border: 1px solid #c0a080; + border-radius: 3px; + padding: 2px 4px; + background: #fff; + font-size: 0.85em; + } + + // Delete button + .actor-delete { color: #c0392b; } + .actor-delete:hover { color: #e74c3c; } } -.character-summary-rollable { - text-decoration: underline; -} .activated-green { color: darkgreen; diff --git a/styles/components/common.less b/styles/components/common.less index f5a265b..fa26abf 100644 --- a/styles/components/common.less +++ b/styles/components/common.less @@ -10,6 +10,156 @@ body.system-bol img#logo { /* Reserved for future use */ } +.bol.dialog { + & > section.window-content { + background: white; + border: 10px solid transparent; + border-image: url("/systems/bol/ui/box-border-large.webp") 36 repeat; + border-image-outset: 1; + padding: 10px; + } + + .window-title { + font-family: "Wolfsbane2Expanded", cursive; + color: #4b4a44; + } + + .sheet-header { + text-align: center; + margin-bottom: 6px; + padding: 4px 0; + border-bottom: 2px solid darkred; + + h3 { + font-family: "Wolfsbane2Expanded", cursive; + font-size: 1.3rem; + color: #191813; + margin: 0; + } + } + + .roll-box, .box-roll, + div.flexrow:has(.bg-darkred) { + border-radius: 6px; + overflow: hidden; + margin-bottom: 1px; + background: #f5f0e8; + gap: 2px; + + .bg-darkred { + padding: 4px 10px; + font-family: "Wolfsbane2Expanded", cursive; + font-size: 0.78rem; + letter-spacing: 0.6px; + border-radius: 5px; + margin: 2px 0 2px 2px; + background: linear-gradient(135deg, #7a0000, darkred); + text-shadow: 0 1px 2px rgba(0,0,0,0.4); + } + + .cell { + background: transparent; + padding: 2px 6px; + display: flex; + align-items: center; + justify-content: center; + color: #191813; + flex-wrap: wrap; + + label.checkbox { + display: flex; + justify-content: center; + align-items: center; + width: 100%; + } + } + } + + select, input[type="text"], input[type="number"] { + background: transparent !important; + color: #191813 !important; + border: none !important; + box-shadow: none !important; + font-size: 0.88rem; + width: 100%; + + option { + background: #f5f0e8; + color: #191813; + } + option:checked, option:hover { + background: darkred; + color: white; + } + } + + input:disabled { + color: #8b0000 !important; + font-weight: bold; + font-size: 0.95rem; + } + + .dice-options-cell { + display: flex !important; + flex-wrap: wrap; + gap: 4px; + padding: 4px 6px; + justify-content: center; + + .dice-option { + display: flex; + align-items: center; + gap: 3px; + padding: 2px 7px; + border-radius: 4px; + font-size: 0.82rem; + cursor: pointer; + white-space: nowrap; + + input[type="radio"] { margin: 0; } + } + + .bdice-label { background: #e8f5e8; color: #1a5c1a; border: 1px solid #4caf50; } + .neutral-label { background: #f0ede5; color: #4b4a44; border: 1px solid #9e9e7a; } + .mdice-label { background: #fce8e8; color: #7a0000; border: 1px solid #e57373; } + } +} + +.bol.sheet, .bol.dialog { + footer.form-footer { + display: flex; + gap: 8px; + margin-top: 8px; + padding-top: 6px; + border-top: 2px solid darkred; + + button { + flex: 1; + background: linear-gradient(135deg, #7a0000, darkred); + color: white; + border: 1px solid #6b0000; + border-radius: 5px; + padding: 5px 10px; + font-family: "Wolfsbane2Expanded", cursive; + font-size: 0.95rem; + letter-spacing: 0.6px; + text-shadow: 0 1px 2px rgba(0,0,0,0.4); + cursor: pointer; + transition: background 0.15s; + + i { margin-right: 4px; } + + &:hover { background: linear-gradient(135deg, #9b0000, #c00000); } + + &[type="button"] { + background: linear-gradient(135deg, #2a2a2a, #4b4a44); + border-color: #2a2a2a; + &:hover { background: linear-gradient(135deg, #3a3a3a, #5b5a54); } + } + } + } +} + .bol.sheet { .window-header { border: none; @@ -88,6 +238,13 @@ body.system-bol img#logo { border: 1px solid #4b4a44 !important; border-radius: 0.5rem; text-align: center; + + &[type="select"], + &:is(select) { + border: 1px solid #4b4a44 !important; + border-radius: 0.5rem; + background-color: #2a2a2a30; + } } } } @@ -170,6 +327,18 @@ body.system-bol img#logo { margin-top: 6px; margin-bottom: 6px; } + + .editor, + .editor-content, + prose-mirror { + color: #191813; + } + prose-mirror .editor-content, + prose-mirror p, + prose-mirror div, + prose-mirror span { + color: #191813 !important; + } } &.description { @@ -195,6 +364,12 @@ body.system-bol img#logo { font-size: 0.95rem; margin-left: 6px; } + select.header-field-value { + background-color: #2a2a2a30; + border: 1px solid #4b4a44 !important; + border-radius: 0.5rem; + color: #4b4a44; + } } } } diff --git a/styles/components/item.less b/styles/components/item.less index e891e88..59d0300 100644 --- a/styles/components/item.less +++ b/styles/components/item.less @@ -176,13 +176,14 @@ .form-group { display: flex; flex-direction: row; - align-items: center; + align-items: flex-start; margin: 3px 0; - label { + > label:not(.checkbox) { flex: 0 0 40%; color: #191813; font-weight: bold; + padding-top: 2px; } input[type="checkbox"] { @@ -201,6 +202,12 @@ .form-fields { flex: 1; } + + .form-fields { + display: flex; + flex-direction: column; + gap: 4px; + } } label.checkbox { @@ -218,6 +225,13 @@ } } + .vehicle-checkboxes { + display: grid; + grid-template-columns: 1fr 1fr; + gap: 6px 16px; + padding: 4px 0; + } + input[type="text"], input[type="number"], input[type="text"]:hover, diff --git a/styles/global/chat.less b/styles/global/chat.less index 5b66bd7..dc9d56e 100644 --- a/styles/global/chat.less +++ b/styles/global/chat.less @@ -171,23 +171,33 @@ } h2.critical { - color: green; + font-family: "Wolfsbane2Expanded", cursive; + color: #1a7a1a; font-weight: bold; + font-size: 1.1rem; + text-shadow: 0 1px 2px rgba(0,0,0,0.15); } h2.fumble { - color: red; + font-family: "Wolfsbane2Expanded", cursive; + color: #8b0000; font-weight: bold; + font-size: 1.1rem; + text-shadow: 0 1px 2px rgba(0,0,0,0.15); } h2.success { - color: darkgreen; + font-family: "Wolfsbane2Expanded", cursive; + color: #1a5c1a; font-weight: bold; + font-size: 1.05rem; } h2.failure { + font-family: "Wolfsbane2Expanded", cursive; color: darkred; font-weight: bold; + font-size: 1.05rem; } h2.roll { @@ -208,13 +218,12 @@ h2.bad { .chat-message { margin: 3px; - padding: 10px; - font-size: 14px; - border-radius: 0; - background-color: white; - background-image: url("/systems/bol/ui/box-border-large.webp"); - background-repeat: no-repeat; - background-size: 100% 100%; + padding: 6px 8px; + font-size: 13px; + border-radius: 3px; + background-color: #faf7f2; + border: 1px solid #d4c8b0; + box-shadow: 0 1px 3px rgba(0,0,0,0.12); .message-header { .flavor-text { @@ -222,8 +231,555 @@ h2.bad { font-size: 14px; h2 { - font-family: "Modesto Condensed", "Palatino Linotype", serif; - font-size: 20px; + font-family: "Wolfsbane2Expanded", cursive; + font-size: 1.1rem; + margin: 2px 0; + } + } + } + + // Status banner (success/failure h2) + h2.success, h2.failure, h2.critical, h2.fumble { + display: flex; + align-items: center; + gap: 6px; + padding: 4px 10px; + border-radius: 4px; + margin: 0 0 6px 0; + font-size: 1rem; + letter-spacing: 0.5px; + + i { font-size: 0.9em; } + } + + h2.success, h2.critical { + background: linear-gradient(135deg, #1a5c1a20, #2d7a2d15); + border: 1px solid #4caf5040; + color: #1a5c1a; + } + + h2.critical { + background: linear-gradient(135deg, #1a5c1a30, #2d7a2d25); + border-color: #4caf5070; + } + + h2.failure { + background: linear-gradient(135deg, #7a000015, #8b000010); + border: 1px solid #8b000030; + color: #8b0000; + } + + h2.fumble { + background: linear-gradient(135deg, #7a000025, #8b000020); + border: 1px solid #8b000060; + color: #6b0000; + } + + h3 { + font-family: "Wolfsbane2Expanded", cursive; + font-size: 0.95rem; + color: #191813; + margin: 2px 0 5px 0; + border-bottom: 1px solid #d4c8b0; + padding-bottom: 3px; + letter-spacing: 0.3px; + } + + .chat-icon { + float: right; + border: 1px solid #c4a882; + box-shadow: 1px 1px 3px rgba(0,0,0,0.25); + border-radius: 3px; + margin: 0 0 4px 6px; + width: 52px; + height: 52px; + object-fit: cover; + } + + .actions-section { + font-size: 0.82rem; + color: #4b4a44; + line-height: 1.4; + + & > div { + margin: 2px 0; + } + } + + .chat-button, + .chat-damage-roll, + .chat-damage-apply, + .damage-handling, + .recup-vitalite { + display: block; + width: 100%; + margin: 3px 0; + padding: 4px 10px; + background: linear-gradient(135deg, #2a2a2a, #4b4a44); + color: #e8e0d0; + border: 1px solid #2a2a2a; + border-radius: 4px; + font-family: "Wolfsbane2Expanded", cursive; + font-size: 0.82rem; + letter-spacing: 0.4px; + cursor: pointer; + text-align: center; + transition: background 0.15s; + + &:hover { background: linear-gradient(135deg, #3a3a3a, #5b5a54); } + + &.hero-reroll { + background: linear-gradient(135deg, #7a5500, #a07000); + border-color: #6a4500; + &:hover { background: linear-gradient(135deg, #9a6500, #c08000); } + } + + &.transform-heroic-roll, &.transform-legendary-roll { + background: linear-gradient(135deg, #7a0000, darkred); + border-color: #6b0000; + &:hover { background: linear-gradient(135deg, #9b0000, #c00000); } + } + } + + // Dommages normaux + .chat-damage-roll[data-damage-mode="normal-damage"] { + background: linear-gradient(135deg, #7a0000, darkred); + border-color: #6b0000; + &:hover { background: linear-gradient(135deg, #9b0000, #c00000); } + } + + // Dommages +6 / +12 (critique) + .chat-damage-roll[data-damage-mode^="damage-plus"] { + background: linear-gradient(135deg, #5a0070, #7a00a0); + border-color: #4a0060; + &:hover { background: linear-gradient(135deg, #7a0090, #9a00c0); } + } + + // Appliquer dommages + .chat-damage-apply { + background: linear-gradient(135deg, #7a0000, darkred); + border-color: #6b0000; + &:hover { background: linear-gradient(135deg, #9b0000, #c00000); } + } + + // Récupération + .recup-vitalite { + background: linear-gradient(135deg, #1a5c1a, #2d7a2d); + border-color: #1a4a1a; + &:hover { background: linear-gradient(135deg, #2a7a2a, #3d9a3d); } + } + + // Défense/gestion dommages + .damage-handling { + background: linear-gradient(135deg, #7a5500, #a07000); + border-color: #6a4500; + &:hover { background: linear-gradient(135deg, #9a6500, #c08000); } + + &[data-defense-mode="damage-not-applied"] { + background: linear-gradient(135deg, #1a5c1a, #2d7a2d); + border-color: #1a4a1a; + &:hover { background: linear-gradient(135deg, #2a7a2a, #3d9a3d); } + } + + &[data-defense-mode="hero-in-extremis"], &[data-defense-mode="hero-reduce-damage"] { + background: linear-gradient(135deg, #7a0000, darkred); + border-color: #6b0000; + &:hover { background: linear-gradient(135deg, #9b0000, #c00000); } + } + } + +// Damage & defense cards + .bol-damage-card, .bol-defense-card { + .damage-card-header, .defense-card-header { + display: flex; + align-items: center; + gap: 8px; + margin-bottom: 6px; + padding-bottom: 5px; + border-bottom: 1px solid #d4c8b0; + + .damage-weapon-img { + width: 44px; + height: 44px; + border: 1px solid #c4a882; + border-radius: 3px; + box-shadow: 1px 1px 3px rgba(0,0,0,0.25); + object-fit: cover; + flex: 0 0 44px; + } + + .damage-card-title { + flex: 1; + display: flex; + flex-direction: column; + gap: 2px; + + .damage-card-label { + font-family: "Wolfsbane2Expanded", cursive; + font-size: 0.75rem; + color: #7a0000; + letter-spacing: 0.5px; + text-transform: uppercase; + } + + .damage-weapon-name { + font-family: "Wolfsbane2Expanded", cursive; + font-size: 0.9rem; + color: #191813; + letter-spacing: 0.3px; + } + + .damage-formula { + font-size: 0.78rem; + color: #6b6b5a; + font-style: italic; + } + + .damage-total-badge { + display: inline-block; + background: linear-gradient(135deg, #7a0000, darkred); + color: #e8d890; + font-family: "Wolfsbane2Expanded", cursive; + font-size: 1.2rem; + font-weight: bold; + padding: 1px 10px; + border-radius: 4px; + letter-spacing: 1px; + align-self: flex-start; + + &.damage-total-badge--hit { + background: linear-gradient(135deg, #7a5500, #a07000); + } + } + } + } + + .damage-target { + font-size: 0.8rem; + color: #4b4a44; + font-style: italic; + margin-bottom: 4px; + } + + .damage-note { + font-size: 0.78rem; + color: #4b4a44; + padding: 2px 6px; + margin-bottom: 4px; + border-left: 2px solid #c4a882; + + &.damage-note--warn { + border-left-color: darkred; + color: darkred; + } + } + + .defense-hero-separator { + text-align: center; + font-size: 0.72rem; + color: #8b7355; + font-family: "IMFellDWPicaSC-Regular", serif; + font-style: italic; + margin: 3px 0 1px; + } + + .defense-footer-note { + font-size: 0.72rem; + color: #8b7355; + font-style: italic; + text-align: center; + margin-top: 4px; + padding-top: 3px; + border-top: 1px dashed #d4c8b0; + } + } + + .bol-defense-summary-card { + .defense-summary-header { + display: flex; + align-items: center; + gap: 8px; + margin-bottom: 6px; + padding-bottom: 5px; + border-bottom: 1px solid #d4c8b0; + + .damage-weapon-img { + width: 44px; + height: 44px; + border: 1px solid #c4a882; + border-radius: 3px; + box-shadow: 1px 1px 3px rgba(0,0,0,0.25); + object-fit: cover; + flex: 0 0 44px; + } + } + + .defense-summary-details { + display: flex; + flex-direction: column; + gap: 3px; + } + + .defense-detail { + font-size: 0.82rem; + color: #4b4a44; + padding: 1px 4px; + border-left: 2px solid #c4a882; + + &.warning { + border-left-color: darkred; + color: darkred; + } + } + + .defense-final { + margin-top: 5px; + padding: 3px 8px; + font-family: "Wolfsbane2Expanded", cursive; + font-size: 0.9rem; + color: #191813; + background: #f0ece0; + border-radius: 3px; + border-left: 3px solid darkred; + + &.defense-final--safe { + border-left-color: #4a7a4a; + color: #2a5a2a; + background: #e8f5e8; + } + } + + .damage-total-badge--none { + background: linear-gradient(135deg, #4a7a4a, #2d5a2d) !important; + } + } + + // Vitality / death card + .bol-vitality-card { + .vitality-card-header { + display: flex; + align-items: center; + gap: 8px; + margin-bottom: 6px; + padding-bottom: 5px; + border-bottom: 2px solid #4b1010; + + .damage-weapon-img { + width: 44px; + height: 44px; + border: 1px solid #c4a882; + border-radius: 3px; + box-shadow: 1px 1px 3px rgba(0,0,0,0.25); + object-fit: cover; + flex: 0 0 44px; + } + } + + .vitality-card-body { + display: flex; + flex-direction: column; + gap: 3px; + } + + .vitality-detail { + font-size: 0.82rem; + color: #4b4a44; + padding: 1px 4px; + border-left: 2px solid #c4a882; + } + + .vitality-hint { + font-size: 0.78rem; + color: #6b6b5a; + font-style: italic; + padding-left: 6px; + } + + .vitality-dead { + margin-top: 4px; + padding: 3px 8px; + font-family: "Wolfsbane2Expanded", cursive; + font-size: 0.9rem; + color: #f0e8d0; + background: linear-gradient(135deg, #4b1010, #7a0000); + border-radius: 3px; + } + + .vitality-epitaph { + font-size: 0.78rem; + color: #6b6b5a; + font-style: italic; + text-align: center; + margin-top: 3px; + } + } + + // Spell card + .bol-spell-card { + margin: 6px 0; + .spell-card-header { + display: flex; + align-items: center; + gap: 8px; + padding: 5px 0; + border-bottom: 1px solid #d4c8b0; + .spell-img { + width: 40px; height: 40px; + border: 1px solid #c4a882; + border-radius: 3px; + object-fit: cover; + flex: 0 0 40px; + } + .spell-card-title { + flex: 1; + display: flex; + flex-direction: column; + gap: 3px; + .spell-name { + font-family: "Wolfsbane2Expanded", cursive; + font-size: 0.9rem; + color: #191813; + } + .spell-stats { + display: flex; + flex-wrap: wrap; + gap: 4px; + .spell-stat-badge { + display: inline-block; + font-family: "Wolfsbane2Expanded", cursive; + font-size: 0.72rem; + padding: 1px 7px; + border-radius: 3px; + letter-spacing: 0.3px; + &.cost { + background: linear-gradient(135deg, #3a0080, #6a00c0); + color: #e8d0ff; + border: 1px solid #5a00a0; + } + &.remaining { + background: linear-gradient(135deg, #1a4a6a, #2a6a9a); + color: #d0e8ff; + border: 1px solid #1a3a5a; + } + } + } + } + } + } + + // Alchemy card + .bol-alchemy-card { + margin: 6px 0; + .alchemy-card-header { + display: flex; + align-items: center; + gap: 8px; + padding-bottom: 5px; + border-bottom: 1px solid #d4c8b0; + .alchemy-img { + width: 40px; height: 40px; + border: 1px solid #c4a882; + border-radius: 3px; + object-fit: cover; + flex: 0 0 40px; + } + .alchemy-card-title { + flex: 1; + display: flex; + flex-direction: column; + gap: 3px; + .alchemy-name { + font-family: "Wolfsbane2Expanded", cursive; + font-size: 0.9rem; + color: #191813; + } + .alchemy-stat-badge { + display: inline-block; + font-family: "Wolfsbane2Expanded", cursive; + font-size: 0.72rem; + padding: 1px 7px; + border-radius: 3px; + background: linear-gradient(135deg, #5a3a00, #8a6000); + color: #ffe0a0; + border: 1px solid #4a3000; + } + } + } + .alchemy-result { + font-size: 0.78rem; + font-style: italic; + padding: 4px 6px; + margin-top: 5px; + border-radius: 3px; + line-height: 1.4; + &.success { + color: #1a4a1a; + background: #e8f5e8; + border: 1px solid #a0d0a0; + } + &.failure { + color: #4a1a1a; + background: #f5e8e8; + border: 1px solid #d0a0a0; + } + } + } + + // Horoscope card + .bol-horoscope-card { + margin: 6px 0; + .horoscope-card-header { + display: flex; + align-items: center; + gap: 8px; + padding-bottom: 5px; + border-bottom: 1px solid #d4c8b0; + .horoscope-icon { + font-size: 1.6rem; + color: #8a6500; + flex: 0 0 auto; + } + .horoscope-card-title { + flex: 1; + display: flex; + flex-direction: column; + gap: 3px; + .horoscope-type { + font-family: "Wolfsbane2Expanded", cursive; + font-size: 0.9rem; + color: #191813; + } + .horoscope-stat-badge { + display: inline-block; + font-family: "Wolfsbane2Expanded", cursive; + font-size: 0.72rem; + padding: 1px 7px; + border-radius: 3px; + background: linear-gradient(135deg, #6a5500, #a08000); + color: #ffe890; + border: 1px solid #5a4500; + } + } + } + .horoscope-result { + .horoscope-text { + display: block; + font-size: 0.78rem; + font-style: italic; + padding: 4px 6px; + margin-top: 5px; + border-radius: 3px; + line-height: 1.4; + &.success { + color: #1a4a1a; + background: #e8f5e8; + border: 1px solid #a0d0a0; + } + &.failure { + color: #4a1a1a; + background: #f5e8e8; + border: 1px solid #d0a0a0; + } } } } @@ -232,30 +788,97 @@ h2.bad { .dice-roll { .dice-result { .dice-formula { - border-radius: 0px; - border: 1px inset lightgray; - background-color: #282828; - color: white; + border-radius: 4px; + border: 1px solid #555; + background: linear-gradient(135deg, #1a1a1a, #2a2a2a); + color: #d0c8b8; + font-size: 0.8rem; + padding: 2px 8px; + text-align: center; + margin-bottom: 3px; } .dice-tooltip { + background: #1a1a1a; + border: 1px solid #444; + border-radius: 4px; + .tooltip-part { .part-total { - border-radius: 0px; - border: 1px inset lightgray; + border-radius: 0; + border: 1px inset #444; background-color: #2a2a2a; - color: white; + color: #d0c8b8; } } } .dice-total { - border-radius: 0px; - border: 1px inset lightgray; - background-color: #2a2a2a; - color: white; + border-radius: 4px; + border: 2px solid #4b4a44; + background: linear-gradient(135deg, #191813, #2a2a2a); + color: #e8d890; + font-family: "Wolfsbane2Expanded", cursive; + font-size: 1.4rem; + font-weight: bold; + letter-spacing: 1px; + padding: 2px 0; + margin-top: 3px; } } } } } + +.bol-welcome-card { + .welcome-header { + display: flex; + align-items: center; + gap: 10px; + margin-bottom: 8px; + padding-bottom: 6px; + border-bottom: 2px solid darkred; + + .welcome-logo { + width: 52px; + height: 52px; + object-fit: contain; + flex: 0 0 52px; + } + } + + .welcome-body { + font-size: 0.82rem; + color: #191813; + line-height: 1.4; + + p { + margin: 4px 0; + padding-left: 4px; + border-left: 2px solid #d4c8b0; + } + + a { color: darkred; } + } + + .welcome-footer { + margin-top: 8px; + padding: 4px 10px; + font-family: "Wolfsbane2Expanded", cursive; + font-size: 0.95rem; + color: #e8d890; + background: linear-gradient(135deg, #7a0000, darkred); + border-radius: 4px; + letter-spacing: 0.5px; + } + + .welcome-warning { + margin-top: 6px; + padding: 4px 8px; + font-size: 0.8rem; + color: #7a0000; + background: #fff3f3; + border: 1px solid #e57373; + border-radius: 3px; + } +} diff --git a/styles/global/forms.less b/styles/global/forms.less index 60257d9..324a864 100644 --- a/styles/global/forms.less +++ b/styles/global/forms.less @@ -23,6 +23,17 @@ box-shadow: none; } + /* Hide number input spinners */ + input[type="number"]::-webkit-inner-spin-button, + input[type="number"]::-webkit-outer-spin-button { + -webkit-appearance: none; + margin: 0; + } + input[type="number"] { + -moz-appearance: textfield; + appearance: textfield; + } + input:disabled:hover, select:disabled:hover, textarea:disabled:hover, diff --git a/styles/global/typography.less b/styles/global/typography.less index 05dd44c..95e7f92 100644 --- a/styles/global/typography.less +++ b/styles/global/typography.less @@ -9,6 +9,22 @@ src: url(https://fonts.gstatic.com/s/contrailone/v10/eLGbP-j_JA-kG0_Zo51noafdZQ.ttf) format('truetype'); } +@font-face { + font-family: 'Orbitron'; + font-style: normal; + font-weight: 400; + font-display: swap; + src: url(https://fonts.gstatic.com/s/orbitron/v31/yMJMMIlzdpvBhQQL_SC3X9yhF25-T1nyGy6BoWgz.woff2) format('woff2'); +} + +@font-face { + font-family: 'Orbitron'; + font-style: normal; + font-weight: 700; + font-display: swap; + src: url(https://fonts.gstatic.com/s/orbitron/v31/yMJMMIlzdpvBhQQL_SC3X9yhF25-T1nyKS6BoWgz.woff2) format('woff2'); +} + @font-face { font-family: "CCMeanwhile"; src: url('../fonts/ccmeanwhile-regular.ttf'); diff --git a/templates/actor/horde-sheet.hbs b/templates/actor/horde-sheet.hbs index 4501d7d..775e31b 100644 --- a/templates/actor/horde-sheet.hbs +++ b/templates/actor/horde-sheet.hbs @@ -5,7 +5,7 @@ {{!-- Sidebar --}} @@ -15,8 +15,7 @@
-
- +
@@ -34,24 +33,25 @@
  • {{localize "BOL.ui.details"}}
    -
  • + -
    -
    - + +
    -
    -
    - + +
    -
    -
    -  /   - + + + / +
    diff --git a/templates/actor/parts/actor-header.hbs b/templates/actor/parts/actor-header.hbs index d179dd2..b56b862 100644 --- a/templates/actor/parts/actor-header.hbs +++ b/templates/actor/parts/actor-header.hbs @@ -20,7 +20,7 @@ {{else}}

    - {{#select charType}} diff --git a/templates/actor/parts/tabs/actor-biodata.hbs b/templates/actor/parts/tabs/actor-biodata.hbs index ce52686..0d960e4 100644 --- a/templates/actor/parts/tabs/actor-biodata.hbs +++ b/templates/actor/parts/tabs/actor-biodata.hbs @@ -5,7 +5,7 @@ {{localize "BOL.ui.biosize"}}
    - {{#select details.size}} {{#each config.creatureSize as |sizeData id|}}

    \ No newline at end of file diff --git a/templates/actor/parts/tabs/horde-description.hbs b/templates/actor/parts/tabs/horde-description.hbs index 37c6051..d9288c1 100644 --- a/templates/actor/parts/tabs/horde-description.hbs +++ b/templates/actor/parts/tabs/horde-description.hbs @@ -5,6 +5,7 @@ -{{editor description target="system.description" button=true owner=owner -editable=editable}} + + {{{description}}} + diff --git a/templates/actor/parts/tabs/vehicle-description.hbs b/templates/actor/parts/tabs/vehicle-description.hbs index 37c6051..6dff23b 100644 --- a/templates/actor/parts/tabs/vehicle-description.hbs +++ b/templates/actor/parts/tabs/vehicle-description.hbs @@ -5,6 +5,7 @@ -{{editor description target="system.description" button=true owner=owner -editable=editable}} + + {{{description}}} + diff --git a/templates/actor/parts/tabs/vehicle-stats.hbs b/templates/actor/parts/tabs/vehicle-stats.hbs index 74ac72e..5d68fbf 100644 --- a/templates/actor/parts/tabs/vehicle-stats.hbs +++ b/templates/actor/parts/tabs/vehicle-stats.hbs @@ -4,20 +4,20 @@ {{#each system.attributes as |attr key|}}

    - - + +
    {{/each}} {{#if (eq system.vehicletype "boat")}}

    - - + +
    {{/if}} diff --git a/templates/actor/parts/tabs/vehicle-weapons.hbs b/templates/actor/parts/tabs/vehicle-weapons.hbs index 5992492..904bef3 100644 --- a/templates/actor/parts/tabs/vehicle-weapons.hbs +++ b/templates/actor/parts/tabs/vehicle-weapons.hbs @@ -1,11 +1,10 @@ -
    {{localize "BOL.ui.vehicleWeapons"}}
    1. {{localize "BOL.ui.weapons"}}
      {{localize "BOL.ui.hullDamage"}}
      {{localize "BOL.ui.crewDamage"}}
      {{localize "BOL.ui.fireDamage"}}
      -
      +
    2. {{#each weapons as |item id|}}
    3. diff --git a/templates/actor/vehicle-sheet.hbs b/templates/actor/vehicle-sheet.hbs index bdcc9c9..a1ea532 100644 --- a/templates/actor/vehicle-sheet.hbs +++ b/templates/actor/vehicle-sheet.hbs @@ -5,7 +5,7 @@ {{!-- Sidebar --}} @@ -15,12 +15,11 @@
      -
      - +
      -
      - {{#select system.vehicletype}} diff --git a/templates/apps/character-summary-template.html b/templates/apps/character-summary-template.html index 854364b..2453db5 100644 --- a/templates/apps/character-summary-template.html +++ b/templates/apps/character-summary-template.html @@ -1,109 +1,138 @@
      -
        +
          -
        1. -
          {{localize "BOL.ui.pcname"}}
          + {{!-- PJs section --}} +
        2. +
          +
          {{localize "BOL.ui.pcname"}}
          +
          {{localize "BOL.ui.colGroupAttributes"}}
          +
          {{localize "BOL.ui.colGroupAptitudes"}}
          +
          {{localize "BOL.ui.colGroupResources"}}
          +
          +
        3. +
        4. +
          +
          {{#each config.attackAttributes as |attr key|}} -
          {{abbrev3 (localize attr)}}
          +
          {{abbrev3 (localize attr)}}
          {{/each}} {{#each config.aptitudes as |apt key|}} -
          {{abbrev3 (localize apt)}}
          +
          {{abbrev3 (localize apt)}}
          {{/each}} {{#each config.resources as |res key|}} -
          {{abbrev3 (localize res)}}
          +
          {{abbrev3 (localize res)}}
          {{/each}} -
          -
          +
        5. {{#each pcs as |pc key|}} -
        6. - - {{#each pc.system.attributes as |attr key|}} - - {{/each}} - {{#each pc.system.aptitudes as |apt key|}} - - {{/each}} - {{#each pc.system.resources as |res key|}} -
          {{res.value}}/{{res.max}}
          - {{/each}} -
          -
          -
        7. - {{/each}} - -
        8. -
          {{localize "BOL.ui.npcname"}}
          - {{#each config.attackAttributes as |attr key|}} -
          {{abbrev3 (localize attr)}}
          - {{/each}} - {{#each config.aptitudes as |apt key|}} -
          {{abbrev3 (localize apt)}}
          - {{/each}} - {{#each config.resources as |res key|}} -
          {{abbrev3 (localize res)}}
          - {{/each}} -
          +
        9. +
          +
          -
        10. - - {{#each npcs as |pc key|}} -
        11. - - {{#each pc.system.attributes as |attr key|}} - - {{/each}} - {{#each pc.system.aptitudes as |apt key|}} - - {{/each}} - {{#each pc.system.resources as |res key|}} -
          {{res.value}}/{{res.max}}
          - {{/each}} -
          - -
          - + + {{#each pc.attributes as |attr|}} + + {{/each}} + {{#each pc.aptitudes as |apt|}} + + {{/each}} + {{#each pc.resources as |res|}} +
          + {{res.value}}/{{res.max}} +
          + {{/each}} +
        12. {{/each}} - + + {{!-- NPCs section --}} +
        13. +
          +
          {{localize "BOL.ui.npcname"}}
          +
          {{localize "BOL.ui.colGroupAttributes"}}
          +
          {{localize "BOL.ui.colGroupAptitudes"}}
          +
          {{localize "BOL.ui.colGroupResources"}}
          +
          +
        14. +
        15. +
          +
          + {{#each config.attackAttributes as |attr key|}} +
          {{abbrev3 (localize attr)}}
          + {{/each}} + {{#each config.aptitudes as |apt key|}} +
          {{abbrev3 (localize apt)}}
          + {{/each}} + {{#each config.resources as |res key|}} +
          {{abbrev3 (localize res)}}
          + {{/each}} +
          +
        16. + + {{#each npcs as |pc key|}} +
        17. +
          + +
          + + {{#each pc.attributes as |attr|}} + + {{/each}} + {{#each pc.aptitudes as |apt|}} + + {{/each}} + {{#each pc.resources as |res|}} +
          + {{res.value}}/{{res.max}} +
          + {{/each}} +
          + +
          +
        18. + {{/each}} + + {{!-- Horoscope group section --}} {{#if (countKeys horoscopeGroupList)}} -
        19. +
        20. +
          {{localize "BOL.ui.horoscopeGroup"}}
          -
          {{localize "BOL.ui.type"}}
          -
          {{localize "BOL.ui.horoscopeDiceRemaining"}}
          -
          {{localize "BOL.ui.horoscopeDiceMax"}}
          +
          {{localize "BOL.ui.type"}}
          +
          {{localize "BOL.ui.horoscopeDiceRemaining"}}
          +
          {{localize "BOL.ui.horoscopeDiceMax"}}
          -
        21. - {{#each horoscopeGroupList as |horo id|}} -
        22. -

          -
          {{horo.name}} -

          -
          - {{upperFirst horo.type}} -
          -
          - -
          -
          - -
          -
        23. + {{#each horoscopeGroupList as |horo id|}} +
        24. +
          + +
          +

          {{horo.name}}

          +
          + {{upperFirst horo.type}} +
          +
          + +
          +
          + +
          +
          +
        25. {{/each}} {{/if}} diff --git a/templates/chat/chat-vitality-zero.hbs b/templates/chat/chat-vitality-zero.hbs index 9576804..9e27536 100644 --- a/templates/chat/chat-vitality-zero.hbs +++ b/templates/chat/chat-vitality-zero.hbs @@ -1,28 +1,40 @@ -
          - {{name}} -

          {{name}}

          -
          +
          +
          + {{name}} +
          + {{#if isHeroAdversary}} + {{#if (eq hp 0)}} +
          💀 {{localize "BOL.chat.vitalityzero" name="" hp=""}}
          +
          {{name}}
          +
          {{hp}} PV
          + {{else}} +
          🩸 {{localize "BOL.chat.vitalitydying" name="" hp=""}}
          +
          {{name}}
          +
          {{hp}} PV
          + {{/if}} + {{else}} +
          ☠ {{localize "BOL.chat.isdead" name=""}}
          +
          {{name}}
          +
          {{hp}} PV
          + {{/if}} +
          +
          -
          - - {{#if isHeroAdversary}} - {{#if (eq hp 0)}} - {{localize "BOL.chat.vitalityzero" name=name hp=hp}} -
          {{localize "BOL.chat.vitalityheroism"}} -
          {{localize "BOL.chat.vitalityheroismhint"}} +
          + {{#if isHeroAdversary}} + {{#if (eq hp 0)}} +
          {{localize "BOL.chat.vitalityheroism"}}
          +
          {{localize "BOL.chat.vitalityheroismhint"}}
          + {{else}} +
          {{localize "BOL.chat.vitalitydyingheroism"}}
          + {{/if}} + {{#if (lt hp -5)}} +
          ☠ {{localize "BOL.chat.isdead" name=name}}
          +
          {{localize "BOL.chat.epitaph"}}
          + {{/if}} {{else}} - {{localize "BOL.chat.vitalitydying" name=name hp=hp}} -
          {{localize "BOL.chat.vitalitydyingheroism"}} +
          {{localize "BOL.chat.epitaph"}}
          {{/if}} - - {{#if (lt hp -5)}} -
          {{localize "BOL.chat.isdead" name=name}} -
          {{localize "BOL.chat.epitaph"}} - {{/if}} - {{else}} -
          {{localize "BOL.chat.isdead" name=name}} -
          {{localize "BOL.chat.epitaph"}} - {{/if}} - +
          diff --git a/templates/chat/chat-welcome.hbs b/templates/chat/chat-welcome.hbs new file mode 100644 index 0000000..da48d25 --- /dev/null +++ b/templates/chat/chat-welcome.hbs @@ -0,0 +1,20 @@ +
          +
          + +
          +
          ⚔ Barbarians of Lemuria
          +
          {{localize "BOL.chat.welcome1"}}
          +
          +
          + +
          +

          {{{localize "BOL.chat.welcome2"}}}

          +

          {{{localize "BOL.chat.welcome3"}}}

          +

          {{{localize "BOL.chat.welcome4"}}}

          +

          {{{localize "BOL.chat.welcome5"}}}

          + + {{#if noRulebook}} +

          {{{localize "BOL.chat.bolRulebookMessage"}}}

          + {{/if}} +
          +
          diff --git a/templates/chat/rolls/alchemy-roll-card.hbs b/templates/chat/rolls/alchemy-roll-card.hbs index 054a9c4..b9aa78c 100644 --- a/templates/chat/rolls/alchemy-roll-card.hbs +++ b/templates/chat/rolls/alchemy-roll-card.hbs @@ -1,8 +1,16 @@ -

          {{localize "BOL.chat.alchemytitle" name=alchemy.name}}

          -

          {{localize "BOL.chat.alchemypoints" pcCostCurrent=pcCostCurrent}}

          - -{{#if isSuccess}} - {{localize "BOL.chat.alchemysuccess"}} -{{else}} - {{localize "BOL.chat.alchemyfailure"}} -{{/if}} +
          +
          + {{alchemy.name}} +
          + {{alchemy.name}} + {{localize "BOL.chat.alchemypoints" pcCostCurrent=pcCostCurrent}} +
          +
          +
          + {{#if isSuccess}} + {{{localize "BOL.chat.alchemysuccess"}}} + {{else}} + {{{localize "BOL.chat.alchemyfailure"}}} + {{/if}} +
          +
          diff --git a/templates/chat/rolls/damage-roll-card.hbs b/templates/chat/rolls/damage-roll-card.hbs index 0bc8b2d..9b470a8 100644 --- a/templates/chat/rolls/damage-roll-card.hbs +++ b/templates/chat/rolls/damage-roll-card.hbs @@ -1,20 +1,25 @@ -{{weapon.name}} -

          {{localize "BOL.chat.damageresult" name=weapon.name total=damageRoll.total}}

          -{{#if defender}} -

          {{localize "BOL.chat.damagetarget" target=defender.name}}

          -{{/if}} - -{{#if weapon.system.properties.damageReroll1}} -
          - +
          +
          + {{weapon.name}} +
          +
          ⚔ {{localize "BOL.ui.damages"}}
          +
          {{weapon.name}}
          +
          {{damageFormula}}
          +
          {{damageRoll.total}}
          +
          -{{/if}} -
          - {{#if targetId}} -
          - -
          -
          + {{#if defender}} +
          {{localize "BOL.chat.damagetarget" target=defender.name}}
          {{/if}} -
          + + {{#if weapon.system.properties.damageReroll1}} +
          {{localize "BOL.chat.weaponreroll1"}}
          + {{/if}} + + {{#if targetId}} +
          + +
          + {{/if}} +
          diff --git a/templates/chat/rolls/defense-request-card.hbs b/templates/chat/rolls/defense-request-card.hbs index 1a5db63..93d0553 100644 --- a/templates/chat/rolls/defense-request-card.hbs +++ b/templates/chat/rolls/defense-request-card.hbs @@ -1,27 +1,30 @@ -{{defender.name}} -{{localize "BOL.chat.hurttitle" name=defender.name damageTotal=damageTotal}} +
          +
          + {{defender.name}} +
          +
          {{defender.name}}
          +
          {{damageTotal}}
          +
          +
          -{{#if damagesIgnoresArmor}} -
          {{localize "BOL.chat.armordefault"}} -{{/if}} + {{#if damagesIgnoresArmor}} +
          ⚠ {{localize "BOL.chat.armordefault"}}
          + {{/if}} - - +
          + + -{{#if (gt defenderHeroPoints 0)}} - + {{#if (gt defenderHeroPoints 0)}} +
          — {{localize "BOL.ui.heropoints"}} —
          + + {{#each defenderWeapons as |weapon idx|}} + + {{/each}} + {{/if}} -{{#each defenderWeapons as |weapon idx|}} - -{{/each}} -{{/if}} + +
          - - -
          -{{localize "BOL.chat.defenseReduceDamage2"}} \ No newline at end of file + +
          diff --git a/templates/chat/rolls/defense-result-card.hbs b/templates/chat/rolls/defense-result-card.hbs index e41dc14..f71d496 100644 --- a/templates/chat/rolls/defense-result-card.hbs +++ b/templates/chat/rolls/defense-result-card.hbs @@ -1,22 +1,33 @@ -{{defender.name}} -

          {{localize "BOL.chat.damagesummary" name=name}}

          -
            -
          • - {{#if (eq defenseMode "damage-with-armor")}} - {{localize "BOL.chat.protectvalue"}} : {{armorProtect}}. - {{/if}} - {{#if (eq defenseMode "damage-without-armor")}} - {{localize "BOL.chat.noprotectvalue"}} - {{/if}} - {{#if (eq defenseMode "hero-reduce-damage")}} - {{localize "BOL.chat.protectvalue"}} : {{armorProtect}}. - {{localize "BOL.chat.heroreducedamage" total=rollHero.total}} - {{/if}} - {{#if (eq defenseMode "hero-in-extremis")}} - {{localize "BOL.chat.herosplintered" name=weaponHero.name}} - {{/if}} -
          • -
          • - {{localize "BOL.chat.finaldamage" finalDamage=finalDamage}} -
          • -
          +
          +
          + {{defender.name}} +
          +
          🛡 {{localize "BOL.chat.damagesummary" name=""}}
          +
          {{name}}
          + {{#if (eq finalDamage 0)}} +
          0
          + {{else}} +
          {{finalDamage}}
          + {{/if}} +
          +
          + +
          + {{#if (eq defenseMode "damage-with-armor")}} +
          🔰 {{localize "BOL.chat.protectvalue"}} : {{armorProtect}}
          + {{/if}} + {{#if (eq defenseMode "damage-without-armor")}} +
          ⚠ {{localize "BOL.chat.noprotectvalue"}}
          + {{/if}} + {{#if (eq defenseMode "hero-reduce-damage")}} +
          🔰 {{localize "BOL.chat.protectvalue"}} : {{armorProtect}}
          +
          ✨ {{localize "BOL.chat.heroreducedamage" total=rollHero.total}}
          + {{/if}} + {{#if (eq defenseMode "hero-in-extremis")}} +
          ⚔ {{localize "BOL.chat.herosplintered" name=weaponHero.name}}
          + {{/if}} +
          + {{localize "BOL.chat.finaldamage" finalDamage=finalDamage}} +
          +
          +
          diff --git a/templates/chat/rolls/defense-summary-card.hbs b/templates/chat/rolls/defense-summary-card.hbs index 1b3f7a1..e44c677 100644 --- a/templates/chat/rolls/defense-summary-card.hbs +++ b/templates/chat/rolls/defense-summary-card.hbs @@ -1,11 +1,21 @@ -{{defender.name}} -

          {{localize "BOL.chat.damagesummary" name=name}}

          -
            -
          • - {{#if (eq finalDamage 0)}} - {{localize "BOL.chat.nodamagesummary"}} - {{else}} - {{localize "BOL.chat.damageresume" name=name}} - {{/if}} -
          • -
          +
          +
          + {{defender.name}} +
          +
          🛡 {{localize "BOL.chat.damagesummary" name=""}}
          +
          {{name}}
          + {{#if (eq finalDamage 0)}} +
          0
          + {{else}} +
          {{finalDamage}}
          + {{/if}} +
          +
          +
          + {{#if (eq finalDamage 0)}} +
          {{localize "BOL.chat.nodamagesummary"}}
          + {{else}} +
          {{localize "BOL.chat.damageresume" name=name}}
          + {{/if}} +
          +
          diff --git a/templates/chat/rolls/horoscope-roll-card.hbs b/templates/chat/rolls/horoscope-roll-card.hbs index f149356..60bae41 100644 --- a/templates/chat/rolls/horoscope-roll-card.hbs +++ b/templates/chat/rolls/horoscope-roll-card.hbs @@ -1,26 +1,35 @@ -

          {{localize "BOL.chat.horoscope"}} {{localize horoscopeTypeLabel}}

          -

          {{localize "BOL.chat.horoscopepoints" points=astrologyPointsCost}}

          +
          +
          + +
          + {{localize "BOL.chat.horoscope"}} — {{localize horoscopeTypeLabel}} + {{localize "BOL.chat.horoscopepoints" points=astrologyPointsCost}} +
          +
          -{{#if (eq horoscopeType "minor")}} - {{#if isSuccess}} - {{localize "BOL.chat.horoscopeminorsuccess"}} - {{else}} - {{localize "BOL.chat.horoscopeminorfailure"}} - {{/if}} -{{/if}} +
          + {{#if (eq horoscopeType "minor")}} + {{#if isSuccess}} + {{{localize "BOL.chat.horoscopeminorsuccess"}}} + {{else}} + {{{localize "BOL.chat.horoscopeminorfailure"}}} + {{/if}} + {{/if}} -{{#if (eq horoscopeType "major")}} - {{#if isSuccess}} - {{localize "BOL.chat.horoscopemajorsuccess" horoscopeName=horoscopeName}} - {{else}} - {{localize "BOL.chat.horoscopemajorfailure" horoscopeName=horoscopeName}} - {{/if}} -{{/if}} + {{#if (eq horoscopeType "major")}} + {{#if isSuccess}} + {{{localize "BOL.chat.horoscopemajorsuccess" horoscopeName=horoscopeName}}} + {{else}} + {{{localize "BOL.chat.horoscopemajorfailure" horoscopeName=horoscopeName}}} + {{/if}} + {{/if}} -{{#if (eq horoscopeType "majorgroup")}} - {{#if isSuccess}} - {{localize "BOL.chat.horoscopemajorgroupsuccess" careerBonus=careerBonus}} - {{else}} - {{localize "BOL.chat.horoscopemajorgroupfailure" careerBonus=careerBonus}} - {{/if}} -{{/if}} \ No newline at end of file + {{#if (eq horoscopeType "majorgroup")}} + {{#if isSuccess}} + {{{localize "BOL.chat.horoscopemajorgroupsuccess" careerBonus=careerBonus}}} + {{else}} + {{{localize "BOL.chat.horoscopemajorgroupfailure" careerBonus=careerBonus}}} + {{/if}} + {{/if}} +
          +
          diff --git a/templates/chat/rolls/spell-roll-card.hbs b/templates/chat/rolls/spell-roll-card.hbs index b59dc18..864e4cf 100644 --- a/templates/chat/rolls/spell-roll-card.hbs +++ b/templates/chat/rolls/spell-roll-card.hbs @@ -1,4 +1,13 @@ -

          {{localize "BOL.chat.spell"}} : {{spell.name}}

          -

          {{localize "BOL.chat.spellcost"}} : {{ppCost}}

          -

          {{localize "BOL.chat.spellremaining"}} : {{remainingPP}}

          +
          +
          + {{spell.name}} +
          + {{spell.name}} +
          + {{localize "BOL.chat.spellcost"}} : {{ppCost}} + {{#if remainingPP}} {{localize "BOL.chat.spellremaining"}} : {{remainingPP}}{{/if}} +
          +
          +
          +
          diff --git a/templates/dialogs/adv-roll-part.hbs b/templates/dialogs/adv-roll-part.hbs index 27abe52..5d94929 100644 --- a/templates/dialogs/adv-roll-part.hbs +++ b/templates/dialogs/adv-roll-part.hbs @@ -2,12 +2,12 @@
          -
          - +1dB
          - +2dB
          - 0
          - +1dM
          - +2dM
          +
          + + + + +
          diff --git a/templates/dialogs/mod-roll-part.hbs b/templates/dialogs/mod-roll-part.hbs index 5668b7f..596bac7 100644 --- a/templates/dialogs/mod-roll-part.hbs +++ b/templates/dialogs/mod-roll-part.hbs @@ -34,8 +34,10 @@
          - + {{#each config.difficultyModifiers}} + + {{/each}}
          \ No newline at end of file diff --git a/templates/item/parts/properties/item/weapon-vehicle-properties.hbs b/templates/item/parts/properties/item/weapon-vehicle-properties.hbs index a81f5f0..2b37713 100644 --- a/templates/item/parts/properties/item/weapon-vehicle-properties.hbs +++ b/templates/item/parts/properties/item/weapon-vehicle-properties.hbs @@ -3,32 +3,22 @@
          -
          +
          -
          -
          -
          -
          -
          -
          -
          -
          -
          -