From 1ffb8b08fc25f1e4f2046ed0697e6df6d20a43c2 Mon Sep 17 00:00:00 2001 From: LeRatierBretonnier Date: Sat, 28 Feb 2026 21:00:06 +0100 Subject: [PATCH] DataModels + Appv2 migration : OK --- css/bol.css | 548 ++++++++++++++++-- module/applications/sheets/_module.mjs | 4 + module/applications/sheets/actor-sheet.mjs | 144 +++++ .../applications/sheets/base-actor-sheet.mjs | 307 ++++++++++ .../applications/sheets/base-item-sheet.mjs | 40 +- module/applications/sheets/feature-sheet.mjs | 3 +- module/applications/sheets/horde-sheet.mjs | 65 +++ module/applications/sheets/item-sheet.mjs | 3 +- module/applications/sheets/vehicle-sheet.mjs | 66 +++ module/bol.js | 10 +- module/models/feature.mjs | 39 +- module/models/item.mjs | 73 ++- module/system/bol-utility.js | 5 + packs/aides-de-jeu/{000970.log => 001073.log} | 0 packs/aides-de-jeu/CURRENT | 2 +- packs/aides-de-jeu/LOG | 6 +- packs/aides-de-jeu/LOG.old | 16 +- .../{MANIFEST-000969 => MANIFEST-001072} | Bin 210 -> 210 bytes packs/armors/{000875.log => 000978.log} | 0 packs/armors/CURRENT | 2 +- packs/armors/LOG | 6 +- packs/armors/LOG.old | 16 +- .../{MANIFEST-000874 => MANIFEST-000977} | Bin 156 -> 156 bytes packs/boons/{000969.log => 001072.log} | 0 packs/boons/CURRENT | 2 +- packs/boons/LOG | 6 +- packs/boons/LOG.old | 16 +- .../{MANIFEST-000968 => MANIFEST-001071} | Bin 158 -> 158 bytes .../{000968.log => 001071.log} | 0 packs/boonsflawscreatures/CURRENT | 2 +- packs/boonsflawscreatures/LOG | 6 +- packs/boonsflawscreatures/LOG.old | 16 +- .../{MANIFEST-000967 => MANIFEST-001070} | Bin 156 -> 156 bytes packs/careers/{000968.log => 001071.log} | 0 packs/careers/CURRENT | 2 +- packs/careers/LOG | 6 +- packs/careers/LOG.old | 16 +- .../{MANIFEST-000967 => MANIFEST-001070} | Bin 158 -> 158 bytes .../{000966.log => 001069.log} | 0 packs/effets-exemples/CURRENT | 2 +- packs/effets-exemples/LOG | 6 +- packs/effets-exemples/LOG.old | 16 +- .../{MANIFEST-000965 => MANIFEST-001068} | Bin 156 -> 156 bytes packs/equipment/{000969.log => 001072.log} | 0 packs/equipment/CURRENT | 2 +- packs/equipment/LOG | 6 +- packs/equipment/LOG.old | 16 +- .../{MANIFEST-000968 => MANIFEST-001071} | Bin 157 -> 157 bytes packs/fightoptions/{000968.log => 001071.log} | 0 packs/fightoptions/CURRENT | 2 +- packs/fightoptions/LOG | 6 +- packs/fightoptions/LOG.old | 16 +- .../{MANIFEST-000967 => MANIFEST-001070} | Bin 157 -> 157 bytes .../{000451.log => 000554.log} | 0 packs/fightoptionsfanmade/CURRENT | 2 +- packs/fightoptionsfanmade/LOG | 6 +- packs/fightoptionsfanmade/LOG.old | 16 +- .../{MANIFEST-000450 => MANIFEST-000553} | Bin 157 -> 157 bytes packs/flaws/{000969.log => 001072.log} | 0 packs/flaws/CURRENT | 2 +- packs/flaws/LOG | 6 +- packs/flaws/LOG.old | 16 +- .../{MANIFEST-000968 => MANIFEST-001071} | Bin 158 -> 158 bytes packs/languages/{000968.log => 001071.log} | 0 packs/languages/CURRENT | 2 +- packs/languages/LOG | 6 +- packs/languages/LOG.old | 16 +- .../{MANIFEST-000967 => MANIFEST-001070} | Bin 157 -> 157 bytes .../{000968.log => 001071.log} | 0 packs/objets-alchimie/CURRENT | 2 +- packs/objets-alchimie/LOG | 6 +- packs/objets-alchimie/LOG.old | 16 +- .../{MANIFEST-000967 => MANIFEST-001070} | Bin 157 -> 157 bytes packs/origins/{000968.log => 001071.log} | 0 packs/origins/CURRENT | 2 +- packs/origins/LOG | 6 +- packs/origins/LOG.old | 16 +- .../{MANIFEST-000967 => MANIFEST-001070} | Bin 158 -> 158 bytes .../{000968.log => 001071.log} | 0 packs/potions-alchimie/CURRENT | 2 +- packs/potions-alchimie/LOG | 6 +- packs/potions-alchimie/LOG.old | 16 +- .../{MANIFEST-000967 => MANIFEST-001070} | Bin 157 -> 157 bytes packs/races/{000968.log => 001071.log} | 0 packs/races/CURRENT | 2 +- packs/races/LOG | 6 +- packs/races/LOG.old | 16 +- .../{MANIFEST-000967 => MANIFEST-001070} | Bin 156 -> 156 bytes packs/spells/{000968.log => 001071.log} | 0 packs/spells/CURRENT | 2 +- packs/spells/LOG | 6 +- packs/spells/LOG.old | 16 +- .../{MANIFEST-000967 => MANIFEST-001070} | Bin 156 -> 156 bytes .../vehicleweapons/{000875.log => 000978.log} | 0 packs/vehicleweapons/CURRENT | 2 +- packs/vehicleweapons/LOG | 6 +- packs/vehicleweapons/LOG.old | 16 +- .../{MANIFEST-000874 => MANIFEST-000977} | Bin 156 -> 156 bytes packs/weapons/{000881.log => 000984.log} | 0 packs/weapons/CURRENT | 2 +- packs/weapons/LOG | 6 +- packs/weapons/LOG.old | 16 +- .../{MANIFEST-000880 => MANIFEST-000983} | Bin 158 -> 158 bytes styles/components/actor.less | 56 +- styles/components/common.less | 110 +++- styles/components/item.less | 246 +++++++- styles/global/chat.less | 162 ++++++ styles/global/item-list.less | 18 +- system.json | 2 +- templates/actor/actor-sheet.hbs | 4 +- templates/actor/horde-sheet.hbs | 4 +- templates/actor/parts/actor-header.hbs | 7 +- templates/actor/parts/tabs/actor-actions.hbs | 2 +- templates/actor/parts/tabs/actor-biodata.hbs | 22 +- .../actor/parts/tabs/actor-equipment.hbs | 15 +- templates/actor/vehicle-sheet.hbs | 4 +- templates/item/feature-sheet.hbs | 10 +- templates/item/item-sheet.hbs | 10 +- templates/item/post-item.hbs | 241 +++++++- 119 files changed, 2268 insertions(+), 384 deletions(-) create mode 100644 module/applications/sheets/actor-sheet.mjs create mode 100644 module/applications/sheets/base-actor-sheet.mjs create mode 100644 module/applications/sheets/horde-sheet.mjs create mode 100644 module/applications/sheets/vehicle-sheet.mjs rename packs/aides-de-jeu/{000970.log => 001073.log} (100%) rename packs/aides-de-jeu/{MANIFEST-000969 => MANIFEST-001072} (91%) rename packs/armors/{000875.log => 000978.log} (100%) rename packs/armors/{MANIFEST-000874 => MANIFEST-000977} (82%) rename packs/boons/{000969.log => 001072.log} (100%) rename packs/boons/{MANIFEST-000968 => MANIFEST-001071} (81%) rename packs/boonsflawscreatures/{000968.log => 001071.log} (100%) rename packs/boonsflawscreatures/{MANIFEST-000967 => MANIFEST-001070} (82%) rename packs/careers/{000968.log => 001071.log} (100%) rename packs/careers/{MANIFEST-000967 => MANIFEST-001070} (81%) rename packs/effets-exemples/{000966.log => 001069.log} (100%) rename packs/effets-exemples/{MANIFEST-000965 => MANIFEST-001068} (82%) rename packs/equipment/{000969.log => 001072.log} (100%) rename packs/equipment/{MANIFEST-000968 => MANIFEST-001071} (81%) rename packs/fightoptions/{000968.log => 001071.log} (100%) rename packs/fightoptions/{MANIFEST-000967 => MANIFEST-001070} (81%) rename packs/fightoptionsfanmade/{000451.log => 000554.log} (100%) rename packs/fightoptionsfanmade/{MANIFEST-000450 => MANIFEST-000553} (81%) rename packs/flaws/{000969.log => 001072.log} (100%) rename packs/flaws/{MANIFEST-000968 => MANIFEST-001071} (81%) rename packs/languages/{000968.log => 001071.log} (100%) rename packs/languages/{MANIFEST-000967 => MANIFEST-001070} (81%) rename packs/objets-alchimie/{000968.log => 001071.log} (100%) rename packs/objets-alchimie/{MANIFEST-000967 => MANIFEST-001070} (81%) rename packs/origins/{000968.log => 001071.log} (100%) rename packs/origins/{MANIFEST-000967 => MANIFEST-001070} (81%) rename packs/potions-alchimie/{000968.log => 001071.log} (100%) rename packs/potions-alchimie/{MANIFEST-000967 => MANIFEST-001070} (81%) rename packs/races/{000968.log => 001071.log} (100%) rename packs/races/{MANIFEST-000967 => MANIFEST-001070} (82%) rename packs/spells/{000968.log => 001071.log} (100%) rename packs/spells/{MANIFEST-000967 => MANIFEST-001070} (82%) rename packs/vehicleweapons/{000875.log => 000978.log} (100%) rename packs/vehicleweapons/{MANIFEST-000874 => MANIFEST-000977} (82%) rename packs/weapons/{000881.log => 000984.log} (100%) rename packs/weapons/{MANIFEST-000880 => MANIFEST-000983} (81%) diff --git a/css/bol.css b/css/bol.css index 6ab3dc9..cdfca74 100644 --- a/css/bol.css +++ b/css/bol.css @@ -442,8 +442,14 @@ ul.no-bullets { background-color: lightgray; } .items-list .item-header .item-name { - font-family: "Wolfsbane2Expanded", cursive; - font-size: 1.5em; + font-family: "Wolfsbane2Expanded", cursive !important; + font-size: 1.32em !important; + color: #191813 !important; +} +.items-list .item-header .item-field { + font-family: 'Signika', sans-serif !important; + font-size: 0.85em !important; + color: #4b4a44 !important; } .items-list .item { min-height: 30px; @@ -451,6 +457,8 @@ ul.no-bullets { padding: 3px 0 3px 3px; border-bottom: 1px solid #BBB; align-items: stretch; + color: #4b4a44; + font-size: 0.9em; } .items-list .item .item-image { flex: 0 0 30px; @@ -490,6 +498,11 @@ ul.no-bullets { .items-list .item .item-name, .items-list .item .item-field { margin: 0; + color: #333; + font-size: 0.84rem; + font-family: inherit; + display: flex; + align-items: center; } .items-list .item .item-controls-1 { flex: 0 0 18px; @@ -603,6 +616,144 @@ ul.no-bullets { color: #fff; } /* ----------------------------------------- */ +/* Post Item Chat Card */ +/* ----------------------------------------- */ +.bol-post-item { + color: #191813; +} +.bol-post-item .bpi-header { + display: flex; + flex-direction: row; + align-items: flex-start; + gap: 8px; + padding-bottom: 6px; + border-bottom: 2px solid #8b7355; + margin-bottom: 8px; +} +.bol-post-item .bpi-header .bpi-img { + width: 52px; + height: 52px; + border: 1px outset lightgray; + box-shadow: 2px 2px 3px rgba(0, 0, 0, 0.5); + object-fit: cover; + flex: 0 0 52px; +} +.bol-post-item .bpi-header .bpi-title-block { + flex: 1; +} +.bol-post-item .bpi-header .bpi-title-block .bpi-name { + margin: 0 0 2px 0; + font-family: "Wolfsbane2Expanded", cursive; + font-size: 1.1em; + color: #4b4a44; + line-height: 1.2; + border: none; +} +.bol-post-item .bpi-header .bpi-title-block .bpi-type { + font-family: "IMFellDWPicaSC-Regular", serif; + font-size: 0.8em; + color: #7a7060; + font-style: italic; +} +.bol-post-item .bpi-stats-row { + display: flex; + flex-direction: row; + flex-wrap: wrap; + gap: 3px 12px; + margin: 4px 0; + padding: 4px 6px; + background: rgba(139, 115, 85, 0.08); + border: 1px solid rgba(139, 115, 85, 0.25); + border-radius: 3px; +} +.bol-post-item .bpi-stats-row .bpi-stat { + display: flex; + flex-direction: row; + align-items: baseline; + gap: 4px; +} +.bol-post-item .bpi-stats-row .bpi-stat .bpi-sl { + font-family: "IMFellDWPicaSC-Regular", serif; + font-size: 0.72em; + color: #7a7060; + font-style: italic; +} +.bol-post-item .bpi-stats-row .bpi-stat .bpi-sv { + font-weight: bold; + font-size: 0.88em; + color: #191813; +} +.bol-post-item .bpi-tags { + display: flex; + flex-direction: row; + flex-wrap: wrap; + gap: 3px; + margin: 3px 0; +} +.bol-post-item .bpi-tags .bpi-tag { + padding: 1px 7px; + border: 1px solid #8b7355; + border-radius: 10px; + font-size: 0.7em; + color: #4b4a44; + background: rgba(139, 115, 85, 0.12); + font-family: "IMFellDWPicaSC-Regular", serif; +} +.bol-post-item .bpi-tags .bpi-tag-magic { + border-color: #6a4a9c; + color: #5a3a8c; + background: rgba(106, 74, 156, 0.1); +} +.bol-post-item .bpi-tags .bpi-tag-bonus { + border-color: #2d7a2d; + color: #1a5a1a; + background: rgba(45, 122, 45, 0.1); +} +.bol-post-item .bpi-tags .bpi-tag-malus { + border-color: #8b2020; + color: #6a1a1a; + background: rgba(139, 32, 32, 0.1); +} +.bol-post-item .bpi-conditions { + margin: 3px 0; +} +.bol-post-item .bpi-conditions .bpi-cond-label { + font-family: "IMFellDWPicaSC-Regular", serif; + font-size: 0.75em; + font-style: italic; + color: #7a7060; +} +.bol-post-item .bpi-conditions .bpi-condition { + display: inline-block; + margin: 1px 2px; + padding: 1px 6px; + border-radius: 3px; + font-size: 0.8em; +} +.bol-post-item .bpi-conditions .bpi-cond-req { + border: 1px solid #8b2020; + background: rgba(139, 32, 32, 0.08); + color: #6a1a1a; +} +.bol-post-item .bpi-conditions .bpi-cond-opt { + border: 1px solid #6a7a30; + background: rgba(106, 122, 48, 0.08); + color: #4a5a20; +} +.bol-post-item .bpi-description { + margin-top: 7px; + padding-top: 6px; + border-top: 1px dashed #c4a882; +} +.bol-post-item .bpi-description .bpi-desc-content { + font-size: 0.85em; + color: #191813; + line-height: 1.45; +} +.bol-post-item .bpi-description .bpi-desc-content p { + margin: 0 0 4px 0; +} +/* ----------------------------------------- */ /* Chat Messages */ /* ----------------------------------------- */ .message-header h2.damage { @@ -692,7 +843,7 @@ body.system-bol img#logo { overflow-y: hidden; background: transparent; } -.bol.sheet .window-content form { +.bol.sheet .window-content .bol-actor-form { border: 10px solid transparent; border-image: url("/systems/bol/ui/box-border-large.webp") 36 repeat; border-image-outset: 1; @@ -700,8 +851,10 @@ body.system-bol img#logo { margin: 0; padding: 0; height: 100%; + position: relative; + width: 100%; } -.bol.sheet .window-content form .sheet-header { +.bol.sheet .window-content .bol-actor-form .sheet-header { background-image: url("/systems/bol/ui/banner.webp"); background-repeat: no-repeat; background-size: 330px 62px; @@ -718,7 +871,7 @@ body.system-bol img#logo { align-items: flex-end; padding-bottom: 10px; } -.bol.sheet .window-content form .sheet-header .header-field .header-field-group { +.bol.sheet .window-content .bol-actor-form .sheet-header .header-field .header-field-group { overflow: hidden; display: flex; flex-direction: row; @@ -726,22 +879,72 @@ body.system-bol img#logo { justify-content: flex-start; align-items: baseline; } -.bol.sheet .window-content form .sheet-header .header-field .header-field-group .header-field-label { - margin-right: 5px; -} -.bol.sheet .window-content form .sheet-header .header-field .header-field-group .charname, -.bol.sheet .window-content form .sheet-header .header-field .header-field-group .itemname, -.bol.sheet .window-content form .sheet-header .header-field .header-field-group .header-field-value { +.bol.sheet .window-content .bol-actor-form .sheet-header .header-field .header-field-group .charname, +.bol.sheet .window-content .bol-actor-form .sheet-header .header-field .header-field-group .itemname { color: #4b4a44; - font-family: 'Contrail One', cursive; - font-size: 1.5rem; - background-color: #EEE; + font-family: "Wolfsbane2Expanded", cursive; + font-size: 1.65rem; + background-color: #2a2a2a30; + border: 1px solid #4b4a44 !important; + border-radius: 0.5rem; + width: 100%; + margin-bottom: 4px; } -.bol.sheet .window-content form .main .tabs { +.bol.sheet .window-content .bol-actor-form .sheet-header .header-field .header-field-group .header-field-label { + margin-right: 5px; + font-size: 0.86rem; +} +.bol.sheet .window-content .bol-actor-form .sheet-header .header-field .header-field-group .header-field-label.xp-sublabel { + font-size: 0.9rem; + color: #606060; +} +.bol.sheet .window-content .bol-actor-form .sheet-header .header-field .header-field-group .header-field-value { + color: #4b4a44; + font-family: "Wolfsbane2Expanded", cursive; + font-size: 0.9rem; + background-color: #2a2a2a30; + border: 1px solid #4b4a44 !important; + border-radius: 0.5rem; + text-align: center; +} +.bol.sheet .window-content .bol-actor-form .sheet-header .header-buttons { + align-self: flex-end; + padding-bottom: 10px; +} +.bol.sheet .window-content .bol-actor-form .sheet-header .header-buttons .post-item { + flex: 0 0 auto; + height: 32px; + width: 32px; + line-height: 30px; + cursor: pointer; + background: rgba(0, 0, 0, 0.1); + border: 1px solid #999; + border-radius: 3px; +} +.bol.sheet .window-content .bol-actor-form .sheet-header .header-buttons .post-item:hover { + background: rgba(0, 0, 0, 0.2); +} +.bol.sheet .window-content .bol-actor-form .wrap { + flex: 1; + min-height: 0; + align-items: stretch; +} +.bol.sheet .window-content .bol-actor-form .bol-actor-sidebar { + align-self: flex-start; +} +.bol.sheet .window-content .bol-actor-form .main { + display: flex; + flex-direction: column; + flex: 1; + min-height: 0; + height: 100%; + overflow: hidden; +} +.bol.sheet .window-content .bol-actor-form .main .tabs { flex: 0 0 30px; background-color: black; } -.bol.sheet .window-content form .main .tabs .item { +.bol.sheet .window-content .bol-actor-form .main .tabs .item { line-height: 30px; font-weight: bold; font-family: "CCMeanwhile", cursive; @@ -749,21 +952,49 @@ body.system-bol img#logo { padding-top: 4px; font-size: 0.8em; } -.bol.sheet .window-content form .main .tabs .item.active { +.bol.sheet .window-content .bol-actor-form .main .tabs .item.active { text-decoration: underline; text-shadow: none; } -.bol.sheet .window-content form .main .sheet-body { +.bol.sheet .window-content .bol-actor-form .main .sheet-body { + flex: 1; + min-height: 0; overflow: hidden; } -.bol.sheet .window-content form .main .sheet-body .tab { - height: 95%; +.bol.sheet .window-content .bol-actor-form .main .sheet-body .tab { + height: 100%; border: none; overflow-y: auto; + display: none; } -.bol.sheet .window-content form .main .sheet-body .tab.description .editor, -.bol.sheet .window-content form .main .sheet-body .tab.description .editor-content { +.bol.sheet .window-content .bol-actor-form .main .sheet-body .tab.active { + display: block; +} +.bol.sheet .window-content .bol-actor-form .main .sheet-body .tab.stats hr { + margin-top: 6px; + margin-bottom: 6px; +} +.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 { height: 100%; + color: #191813; +} +.bol.sheet .window-content .bol-actor-form .main .sheet-body .tab.description prose-mirror .editor-content, +.bol.sheet .window-content .bol-actor-form .main .sheet-body .tab.description prose-mirror p, +.bol.sheet .window-content .bol-actor-form .main .sheet-body .tab.description prose-mirror div, +.bol.sheet .window-content .bol-actor-form .main .sheet-body .tab.description prose-mirror span { + color: #191813 !important; +} +.bol.sheet .window-content .bol-actor-form .main .sheet-body .tab.description input[type="text"], +.bol.sheet .window-content .bol-actor-form .main .sheet-body .tab.description input[type="number"] { + background-color: #2a2a2a30; + border: 1px solid #4b4a44 !important; + border-radius: 0.5rem; + color: #4b4a44; + text-align: center; + font-size: 0.95rem; + margin-left: 6px; } .sheet-profile-img { cursor: pointer; @@ -790,13 +1021,14 @@ body.system-bol img#logo { background-repeat: no-repeat; background-size: 190px 115px; } -.bol.sheet.actor .window-content form .sidebar { +.bol.sheet.actor .window-content .bol-actor-form .sidebar { padding-top: 115px; min-width: 250px; width: 250px; max-width: 250px; + overflow: hidden; } -.bol.sheet.actor .window-content form .sidebar .profile-img { +.bol.sheet.actor .window-content .bol-actor-form .sidebar .profile-img { cursor: pointer; border: none; background-color: #EEE; @@ -806,35 +1038,62 @@ body.system-bol img#logo { max-width: calc(250px - 10px); margin-right: 10px; } -.bol.sheet.actor .window-content form .main .sheet-body { +.bol.sheet.actor .window-content .bol-actor-form .sidebar .items-list { + width: calc(250px - 10px); + max-width: calc(250px - 10px); + margin-right: 10px; +} +.bol.sheet.actor .window-content .bol-actor-form .main .sheet-body { overflow: hidden; } -.bol.sheet.actor .window-content form .main .sheet-body .tab .attribute.vigor { +.bol.sheet.actor .window-content .bol-actor-form .main .sheet-body .tab .attribute.vigor { background-image: url("/systems/bol/ui/attributes/vigor.webp"); background-repeat: no-repeat; - background-position: center center; - background-size: 64px 64px; + background-position: center 40%; + background-size: 100px 100px; } -.bol.sheet.actor .window-content form .main .sheet-body .tab .attribute.agility { +.bol.sheet.actor .window-content .bol-actor-form .main .sheet-body .tab .attribute.agility { background-image: url("/systems/bol/ui/attributes/agility.webp"); background-repeat: no-repeat; - background-position: center center; - background-size: 64px 64px; + background-position: center 40%; + background-size: 100px 100px; } -.bol.sheet.actor .window-content form .main .sheet-body .tab .attribute.mind { +.bol.sheet.actor .window-content .bol-actor-form .main .sheet-body .tab .attribute.mind { background-image: url("/systems/bol/ui/attributes/mind.webp"); background-repeat: no-repeat; - background-position: center center; - background-size: 64px 64px; + background-position: center 40%; + background-size: 100px 100px; } -.bol.sheet.actor .window-content form .main .sheet-body .tab .attribute.appeal { +.bol.sheet.actor .window-content .bol-actor-form .main .sheet-body .tab .attribute.appeal { background-image: url("/systems/bol/ui/attributes/appeal.webp"); background-repeat: no-repeat; - background-position: center center; - background-size: 64px 64px; + background-position: center 40%; + background-size: 100px 100px; } -.bol.sheet.actor .window-content form .main .sheet-body .tab .attribute .stat-value { - margin-top: -10px; +.bol.sheet.actor .window-content .bol-actor-form .main .sheet-body .tab .attribute .stat-value { + margin-top: -18px; +} +.bol.sheet.actor .window-content .bol-actor-form .main .sheet-body .tab .attribute .stat-value.rounded { + background: transparent; + border: none; + box-shadow: none; + text-align: center; + line-height: 4rem; +} +.bol.sheet.actor .window-content .bol-actor-form .main .sheet-body .tab .aptitude .stat-value.rounded-border { + background: transparent; + text-align: center; + line-height: 4rem; +} +.bol.sheet.actor .resources-value { + text-align: center; + color: #4b4a44; +} +.bol.sheet.actor .inc-dec-btns-resource { + color: #8b0000; +} +.bol.sheet.actor .inc-dec-btns-resource:hover { + color: #4b4a44; } .bol.sheet.actor .bol-footer { height: 62px; @@ -855,7 +1114,6 @@ body.system-bol img#logo { height: 30px; max-height: 30px; min-height: 30px; - background-color: black; } .bol.sheet.actor .bol-footer .footer-right { text-align: right; @@ -911,6 +1169,7 @@ body.system-bol img#logo { font-family: "Wolfsbane2Expanded", cursive; font-size: 2rem; font-variant: small-caps; + color: #4b4a44; } .bol.sheet.actor .rounded { border-radius: 100px; @@ -1052,27 +1311,212 @@ body.system-bol img#logo { min-width: 460px; min-height: 400px; } +.bol.sheet.item .window-content { + background: transparent !important; + color: #191813 !important; + padding: 10px; + overflow: hidden; +} +.bol.sheet.item .window-content .bol.sheet.item { + border: 10px solid transparent; + border-image: url("/systems/bol/ui/box-border-large.webp") 36 repeat; + border-image-outset: 1; + background: white !important; + color: #191813 !important; + margin: 0; + padding: 0; + height: 100%; + position: relative; + width: 100%; + display: flex; + flex-direction: column; +} +.bol.sheet.item .window-content .bol.sheet.item .wrap { + flex: 1; + min-height: 0; + display: flex; + flex-direction: column; +} +.bol.sheet.item .window-content .bol.sheet.item .wrap .main { + flex: 1; + min-height: 0; + display: flex; + flex-direction: column; +} +.bol.sheet.item .window-content .bol.sheet.item .wrap .main .sheet-body { + flex: 1; + min-height: 0; + overflow: hidden; +} +.bol.sheet.item .window-content .bol.sheet.item .wrap .main .sheet-body .tab { + display: none; +} +.bol.sheet.item .window-content .bol.sheet.item .wrap .main .sheet-body .tab.active { + display: block; + height: 100%; + overflow-y: auto; +} +.bol.sheet.item .window-content .bol.sheet.item .wrap .main .sheet-body .tab.properties { + padding: 5px 8px; +} +.bol.sheet.item .window-content .bol.sheet.item .sheet-header { + background-image: url("/systems/bol/ui/banner.webp"); + background-size: 330px 62px; + background-position: 100% -15px; + background-repeat: no-repeat; + height: 115px; + min-height: 115px; + display: flex; + align-items: flex-end; + padding-bottom: 10px; +} +.bol.sheet.item .window-content .bol.sheet.item .sheet-header img.profile-img { + cursor: pointer; + border: none; + background-color: lightgray; + box-shadow: 5px 5px 5px black; + width: 96px; + height: 96px; + min-width: 96px; + min-height: 96px; + max-width: 96px; + max-height: 96px; + margin-right: 10px; + object-fit: cover; +} +.bol.sheet.item .window-content .bol.sheet.item .sheet-header .header-buttons { + align-self: flex-end; + padding-bottom: 10px; +} +.bol.sheet.item .window-content .bol.sheet.item .sheet-header .header-buttons .post-item { + color: #4b4a44; + background: rgba(0, 0, 0, 0.1); + border: 1px solid #999; + border-radius: 3px; + height: 32px; + width: 32px; + line-height: 30px; + cursor: pointer; +} +.bol.sheet.item .window-content .bol.sheet.item .sheet-header .header-buttons .post-item:hover { + color: #191813; + background: rgba(0, 0, 0, 0.2); +} +.bol.sheet.item .window-content .bol.sheet.item .tabs { + height: 44px; + background-color: black; + display: flex; + flex-shrink: 0; +} +.bol.sheet.item .window-content .bol.sheet.item .tabs a.item { + line-height: 44px; + font-weight: bold; + font-family: "CCMeanwhile", cursive; + color: white; + font-size: 0.9em; +} +.bol.sheet.item .window-content .bol.sheet.item .tabs a.item.active { + text-decoration: underline; + text-shadow: none; +} +.bol.sheet.item .window-content .bol.sheet.item .sheet-body .tab.description.active { + color: #191813; + display: block; + overflow: auto; +} +.bol.sheet.item .window-content .bol.sheet.item .sheet-body .tab.description.active .editor, +.bol.sheet.item .window-content .bol.sheet.item .sheet-body .tab.description.active .editor-content, +.bol.sheet.item .window-content .bol.sheet.item .sheet-body .tab.description.active .prosemirror, +.bol.sheet.item .window-content .bol.sheet.item .sheet-body .tab.description.active .prosemirror p, +.bol.sheet.item .window-content .bol.sheet.item .sheet-body .tab.description.active .prosemirror div, +.bol.sheet.item .window-content .bol.sheet.item .sheet-body .tab.description.active .prosemirror span, +.bol.sheet.item .window-content .bol.sheet.item .sheet-body .tab.description.active .prosemirror h1, +.bol.sheet.item .window-content .bol.sheet.item .sheet-body .tab.description.active .prosemirror h2, +.bol.sheet.item .window-content .bol.sheet.item .sheet-body .tab.description.active .prosemirror h3, +.bol.sheet.item .window-content .bol.sheet.item .sheet-body .tab.description.active .prosemirror h4, +.bol.sheet.item .window-content .bol.sheet.item .sheet-body .tab.description.active .form-group:has(.prosemirror), +.bol.sheet.item .window-content .bol.sheet.item .sheet-body .tab.description.active .form-group:has(.editor) { + color: #191813 !important; +} +.bol.sheet.item .window-content .bol.sheet.item .sheet-body .tab.properties label, +.bol.sheet.item .window-content .bol.sheet.item .sheet-body .tab.properties .form-group label, +.bol.sheet.item .window-content .bol.sheet.item .sheet-body .tab.properties select, +.bol.sheet.item .window-content .bol.sheet.item .sheet-body .tab.properties input[type="text"], +.bol.sheet.item .window-content .bol.sheet.item .sheet-body .tab.properties input[type="number"] { + color: #191813; +} .bol.sheet.item h1 input.itemname { - margin-top: 32px; - min-width: 24rem; + margin-top: 0; + min-width: 26.4rem; font-family: "Wolfsbane2Expanded", cursive; + text-shadow: 3px 3px 5px #333; +} +.bol.sheet.item .window-content .bol.sheet.item .form-group { + display: flex; + flex-direction: row; + align-items: center; + margin: 3px 0; +} +.bol.sheet.item .window-content .bol.sheet.item .form-group label { + flex: 0 0 40%; + color: #191813; + font-weight: bold; +} +.bol.sheet.item .window-content .bol.sheet.item .form-group input[type="checkbox"] { + flex: 0 0 auto; + width: 16px; + height: 16px; + margin: 0; + position: static; + top: auto; + cursor: pointer; +} +.bol.sheet.item .window-content .bol.sheet.item .form-group input[type="text"], +.bol.sheet.item .window-content .bol.sheet.item .form-group input[type="number"], +.bol.sheet.item .window-content .bol.sheet.item .form-group select, +.bol.sheet.item .window-content .bol.sheet.item .form-group .form-fields { + flex: 1; +} +.bol.sheet.item .window-content .bol.sheet.item label.checkbox { + display: flex; + flex-direction: row; + align-items: center; + gap: 6px; + color: #191813; +} +.bol.sheet.item .window-content .bol.sheet.item label.checkbox > input[type="checkbox"] { + position: static; + top: auto; + margin: 0; + flex: 0 0 auto; +} +.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, +.bol.sheet.item .window-content .bol.sheet.item input[type="number"]:hover, +.bol.sheet.item .window-content .bol.sheet.item input[type="text"]:focus, +.bol.sheet.item .window-content .bol.sheet.item input[type="number"]:focus, +.bol.sheet.item .window-content .bol.sheet.item select { + color: #191813; + background-color: #f0efe8; + border: 1px solid #999; + border-radius: 2px; + padding: 1px 4px; +} +.bol.sheet.item .window-content .bol.sheet.item select option { + background-color: #f0efe8; + color: #191813; } .bol.sheet.item .item-properties { - flex: 0 0 150px; - margin: 5px 5px 5px 0; - padding-right: 5px; - border-right: 1px groove #eeede0; -} -.bol.sheet.item .item-properties .form-group { - margin: 0; -} -.bol.sheet.item .item-properties .form-group label { - line-height: 20px; + margin: 5px 0; + padding-bottom: 5px; + border-bottom: 1px groove #eeede0; } .bol.sheet.item .item-properties .properties-list { list-style: none; margin: 0; padding: 0; + display: block; } .bol.sheet.item .item-properties .properties-list li { margin: 3px 0; diff --git a/module/applications/sheets/_module.mjs b/module/applications/sheets/_module.mjs index 08faa02..6322617 100644 --- a/module/applications/sheets/_module.mjs +++ b/module/applications/sheets/_module.mjs @@ -1,3 +1,7 @@ export { default as BoLBaseItemSheet } from "./base-item-sheet.mjs" export { default as BoLItemSheet } from "./item-sheet.mjs" export { default as BoLFeatureSheet } from "./feature-sheet.mjs" +export { default as BoLBaseActorSheet } from "./base-actor-sheet.mjs" +export { default as BoLActorSheet } from "./actor-sheet.mjs" +export { default as BoLHordeSheet } from "./horde-sheet.mjs" +export { default as BoLVehicleSheet } from "./vehicle-sheet.mjs" diff --git a/module/applications/sheets/actor-sheet.mjs b/module/applications/sheets/actor-sheet.mjs new file mode 100644 index 0000000..4d7b958 --- /dev/null +++ b/module/applications/sheets/actor-sheet.mjs @@ -0,0 +1,144 @@ +import BoLBaseActorSheet from "./base-actor-sheet.mjs" +import { BoLUtility } from "../../system/bol-utility.js" + +/** + * Actor Sheet for BoL characters and encounters using AppV2 + */ +export default class BoLActorSheet extends BoLBaseActorSheet { + /** @override */ + static DEFAULT_OPTIONS = { + ...super.DEFAULT_OPTIONS, + classes: [...super.DEFAULT_OPTIONS.classes], + actions: { + ...super.DEFAULT_OPTIONS.actions, + }, + } + + /** @override */ + static PARTS = { + sheet: { + template: "systems/bol/templates/actor/actor-sheet.hbs", + }, + } + + /** @override */ + tabGroups = { primary: "stats" } + + /** @override */ + async _prepareContext() { + const context = await super._prepareContext() + const actor = this.document + + context.data = actor.toObject() + context.details = actor.details + context.attributes = actor.attributes + context.aptitudes = actor.aptitudes + context.resources = actor.getResourcesFromType() + context.xp = actor.system.xp + context.equipment = actor.equipment + context.equipmentCreature = actor.equipmentCreature + context.weapons = actor.weapons + context.protections = actor.protections + context.spells = actor.spells + context.alchemy = actor.alchemy + context.containers = actor.containers + context.treasure = actor.treasure + context.boleffects = actor.boleffects + context.alchemyrecipe = actor.alchemyrecipe + context.horoscopes = actor.horoscopes + context.vehicles = actor.vehicles + context.fightoptions = actor.fightoptions + context.ammos = actor.ammos + context.misc = actor.misc + context.xplog = actor.xplog + context.combat = actor.buildCombat() + context.initiativeRank = actor.getInitiativeRank() + context.features = actor.buildFeatures() + context.options = this.options + context.editScore = this.options.editScore + context.useBougette = (actor.type === "character" && BoLUtility.getUseBougette()) || false + context.bougette = actor.getBougette() + context.charType = actor.getCharType() + context.villainy = actor.getVillainy() + context.isUndead = actor.isUndead() + context.biography = await foundry.applications.ux.TextEditor.implementation.enrichHTML( + actor.system.details?.biography || "", { async: true } + ) + context.notes = await foundry.applications.ux.TextEditor.implementation.enrichHTML( + actor.system.details?.notes || "", { async: true } + ) + context.isSorcerer = actor.isSorcerer() + context.isAlchemist = actor.isAlchemist() + context.isAstrologer = actor.isAstrologer() + context.isMysteries = context.isSorcerer || context.isAlchemist || context.isAstrologer + context.isPriest = actor.isPriest() + context.horoscopeGroupList = game.settings.get("bol", "horoscope-group") + + console.log("ACTORDATA (AppV2)", context) + return context + } + + /** @override */ + _activateListeners() { + super._activateListeners() + if (!this.isEditable) return + + // Create generic item + this.element.querySelectorAll(".create-item").forEach((el) => { + el.addEventListener("click", () => { + this.actor.createEmbeddedDocuments("Item", [{ name: game.i18n.localize("BOL.ui.newEquipment"), type: "item" }], { renderSheet: true }) + }) + }) + + // Create natural weapon + this.element.querySelectorAll(".create-natural-weapon").forEach((el) => { + el.addEventListener("click", () => { + const system = foundry.utils.duplicate(game.bol.config.defaultNaturalWeapon) + this.actor.createEmbeddedDocuments("Item", [{ name: game.i18n.localize("BOL.ui.newNaturalWeapon"), type: "item", system }], { renderSheet: true }) + }) + }) + + // Create natural protection + this.element.querySelectorAll(".create-natural-protection").forEach((el) => { + el.addEventListener("click", () => { + const system = foundry.utils.duplicate(game.bol.config.defaultNaturalProtection) + this.actor.createEmbeddedDocuments("Item", [{ name: game.i18n.localize("BOL.ui.newNaturalProtection"), type: "item", system }], { renderSheet: true }) + }) + }) + + // Item create via header dataset (type-based creation) + this.element.querySelectorAll(".item-create").forEach((el) => { + el.addEventListener("click", (ev) => { + ev.preventDefault() + const header = ev.currentTarget + const type = header.dataset.type + const data = foundry.utils.duplicate(header.dataset) + const name = `New ${type}` + delete data.type + this.actor.createEmbeddedDocuments("Item", [{ name, type, data }]) + }) + }) + + // Add XP Log entry + this.element.querySelectorAll(".xplog-add").forEach((el) => { + el.addEventListener("click", (ev) => { + ev.preventDefault() + this.actor.addXPLog("other", "Nouveau", 0, 0) + }) + }) + + // Add item by category/subtype (equipment tab headers) + this.element.querySelectorAll(".item-add").forEach((el) => { + el.addEventListener("click", (ev) => { + ev.preventDefault() + const { itemType, category, subtype } = ev.currentTarget.dataset + const system = { category, subtype } + this.actor.createEmbeddedDocuments("Item", [{ + name: game.i18n.localize("BOL.ui.newEquipment"), + type: itemType || "item", + system, + }], { renderSheet: true }) + }) + }) + } +} diff --git a/module/applications/sheets/base-actor-sheet.mjs b/module/applications/sheets/base-actor-sheet.mjs new file mode 100644 index 0000000..0041624 --- /dev/null +++ b/module/applications/sheets/base-actor-sheet.mjs @@ -0,0 +1,307 @@ +const { HandlebarsApplicationMixin } = foundry.applications.api + +import { BoLRoll } from "../../controllers/bol-rolls.js" +import { BoLUtility } from "../../system/bol-utility.js" + +/** + * Base Actor Sheet for BoL system using AppV2 + * @extends {ActorSheetV2} + */ +export default class BoLBaseActorSheet extends HandlebarsApplicationMixin(foundry.applications.sheets.ActorSheetV2) { + constructor(options = {}) { + super(options) + this.#dragDrop = this.#createDragDropHandlers() + } + + #dragDrop + + /** @override */ + static DEFAULT_OPTIONS = { + classes: ["bol", "sheet", "actor"], + position: { + width: 836, + height: 807, + }, + form: { + submitOnChange: true, + closeOnSubmit: false, + }, + window: { + resizable: true, + }, + tabs: [ + { + navSelector: "nav[data-group=\"primary\"]", + contentSelector: "section.sheet-body", + initial: "stats", + }, + ], + dragDrop: [{ dragSelector: ".items-list .item", dropSelector: null }], + actions: {}, + } + + /** Tab groups state */ + tabGroups = { primary: "stats" } + + /** @override */ + async _prepareContext() { + const actor = this.document + return { + actor, + system: actor.system, + config: game.bol.config, + isGM: game.user.isGM, + isEditable: this.isEditable, + owner: this.document.isOwner, + cssClass: this.options.classes.join(" "), + } + } + + /** @override */ + _onRender(context, options) { + super._onRender(context, options) + this.#dragDrop.forEach((d) => d.bind(this.element)) + this._activateTabs() + this._activateListeners() + this._applyBackgroundImage() + this._activateImageEdit() + } + + /** + * Apply background image to the actor form + * @private + */ + _applyBackgroundImage() { + const logoUrl = BoLUtility.getLogoActorSheet() + const form = this.element.querySelector(".bol-actor-form") + if (form) form.style.backgroundImage = `url(${logoUrl})` + } + + /** + * Activate image editing via FilePicker + * @private + */ + _activateImageEdit() { + const img = this.element.querySelector('[data-edit="img"]') + if (img && this.isEditable) { + img.style.cursor = "pointer" + img.addEventListener("click", () => { + new FilePicker({ + type: "image", + current: this.document.img, + callback: (path) => this.document.update({ img: path }), + }).browse() + }) + } + } + + /** + * Activate tab navigation + * @private + */ + _activateTabs() { + const nav = this.element.querySelector("nav[data-group]") + if (!nav) return + + const group = nav.dataset.group + const activeTab = this.tabGroups[group] || "stats" + + nav.querySelectorAll("[data-tab]").forEach((link) => { + const tab = link.dataset.tab + link.classList.toggle("active", tab === activeTab) + link.addEventListener("click", (event) => { + event.preventDefault() + this.tabGroups[group] = tab + this.render() + }) + }) + + this.element.querySelectorAll(`[data-group="${group}"][data-tab]`).forEach((content) => { + content.classList.toggle("active", content.dataset.tab === activeTab) + }) + } + + /** + * Activate event listeners (replaces activateListeners with vanilla DOM) + * @private + */ + _activateListeners() { + if (!this.isEditable) return + + // Item edit + this.element.querySelectorAll(".item-edit").forEach((el) => { + el.addEventListener("click", (ev) => { + const li = ev.currentTarget.closest(".item") + const item = this.actor.items.get(li?.dataset.itemId) + item?.sheet.render(true) + }) + }) + + // Item delete + this.element.querySelectorAll(".item-delete").forEach((el) => { + el.addEventListener("click", (ev) => { + const li = ev.currentTarget.closest(".item") + const itemId = li?.dataset.itemId + Dialog.confirm({ + title: game.i18n.localize("BOL.ui.deletetitle"), + content: game.i18n.localize("BOL.ui.confirmdelete"), + yes: () => { + this.actor.deleteEmbeddedDocuments("Item", [itemId]) + li?.remove() + }, + no: () => {}, + defaultYes: false, + }) + }) + }) + + // Item equip/unequip + this.element.querySelectorAll(".item-equip").forEach((el) => { + el.addEventListener("click", (ev) => { + const li = ev.currentTarget.closest(".item") + const item = this.actor.items.get(li?.dataset.itemId) + if (item) this.actor.toggleEquipItem(item) + }) + }) + + // Toggle fight option + this.element.querySelectorAll(".toggle-fight-option").forEach((el) => { + el.addEventListener("click", (ev) => { + const li = ev.currentTarget.closest(".item") + this.actor.toggleFightOption(li?.dataset.itemId) + }) + }) + + // Inc/dec alchemy points + this.element.querySelectorAll(".inc-dec-btns-alchemy").forEach((el) => { + el.addEventListener("click", (ev) => { + const li = ev.currentTarget.closest(".item") + this.actor.spendAlchemyPoint(li?.dataset.itemId, 1) + }) + }) + + // Inc/dec resource buttons + this.element.querySelectorAll(".inc-dec-btns-resource").forEach((el) => { + el.addEventListener("click", (ev) => { + const dataset = ev.currentTarget.dataset + this.actor.incDecResources(dataset.target, parseInt(dataset.incr)) + }) + }) + + // Generic inc/dec buttons for item fields + this.element.querySelectorAll(".inc-dec-btns").forEach((el) => { + el.addEventListener("click", (ev) => { + const li = ev.currentTarget.closest(".item") + if (!li) return + const item = this.actor.items.get(li.dataset.itemId) + if (!item) return + const dataset = ev.currentTarget.dataset + const operator = dataset.operator + const target = dataset.target + const incr = parseInt(dataset.incr) + const min = parseInt(dataset.min) + const max = parseInt(dataset.max) || 10000 + // eslint-disable-next-line no-eval + let value = eval("item." + target) || 0 + if (operator === "minus") value = value >= min + incr ? value - incr : min + if (operator === "plus") value = value <= max - incr ? value + incr : max + item.update({ [target]: value }) + }) + }) + + // Rollable elements + this.element.querySelectorAll(".rollable").forEach((el) => { + el.addEventListener("click", (ev) => this._onRoll(ev)) + }) + } + + /** + * Handle clickable rolls (replaces _onRoll with vanilla DOM) + * @param {Event} event + * @private + */ + _onRoll(event) { + event.preventDefault() + const element = event.currentTarget + const dataset = element.dataset + const rollType = dataset.rollType + const li = element.closest(".item") + const itemId = li?.dataset.itemId + + switch (rollType) { + case "attribute": + BoLRoll.attributeCheck(this.actor, dataset.key, event) + break + case "aptitude": + BoLRoll.aptitudeCheck(this.actor, dataset.key, event) + break + case "weapon": + BoLRoll.weaponCheck(this.actor, event) + break + case "spell": + BoLRoll.spellCheck(this.actor, event) + break + case "alchemy": + BoLRoll.alchemyCheck(this.actor, event) + break + case "protection": + this.actor.rollProtection(itemId) + break + case "damage": + this.actor.rollWeaponDamage(itemId) + break + case "aptitudexp": + this.actor.incAptitudeXP(dataset.key) + break + case "attributexp": + this.actor.incAttributeXP(dataset.key) + break + case "careerxp": + this.actor.incCareerXP(itemId) + break + case "horoscope-minor": + BoLRoll.horoscopeCheck(this.actor, event, "minor") + break + case "horoscope-major": + BoLRoll.horoscopeCheck(this.actor, event, "major") + break + case "horoscope-major-group": + BoLRoll.horoscopeCheck(this.actor, event, "majorgroup") + break + case "bougette": + this.actor.rollBougette() + break + default: + break + } + } + + // #region Drag-and-Drop + + #createDragDropHandlers() { + return (this.options.dragDrop || []).map((dragDrop) => + new foundry.applications.ux.DragDrop.implementation({ + ...dragDrop, + permissions: { + dragstart: this._canDragStart.bind(this), + drop: this._canDragDrop.bind(this), + }, + callbacks: { + dragstart: this._onDragStart.bind(this), + dragover: this._onDragOver.bind(this), + drop: this._onDrop.bind(this), + }, + }) + ) + } + + _canDragStart(selector) { + return this.isEditable + } + + _canDragDrop(selector) { + return this.isEditable + } + + // #endregion +} diff --git a/module/applications/sheets/base-item-sheet.mjs b/module/applications/sheets/base-item-sheet.mjs index 9f9ae2f..af69427 100644 --- a/module/applications/sheets/base-item-sheet.mjs +++ b/module/applications/sheets/base-item-sheet.mjs @@ -25,6 +25,13 @@ export default class BoLBaseItemSheet extends HandlebarsApplicationMixin(foundry window: { resizable: true, }, + tabs: [ + { + navSelector: 'nav[data-group="primary"]', + contentSelector: "section.sheet-body", + initial: "description", + }, + ], actions: { editImage: BoLBaseItemSheet.#onEditImage, postItem: BoLBaseItemSheet.#onPostItem, @@ -146,29 +153,34 @@ export default class BoLBaseItemSheet extends HandlebarsApplicationMixin(foundry } /** - * Activate tab navigation + * Activate tab navigation via CSS only (no re-render) to preserve unsaved form state. * @private */ _activateTabs() { - const nav = this.element.querySelector('nav.tabs[data-group="primary"]') + const nav = this.element.querySelector('nav[data-group="primary"]') if (!nav) return + const section = this.element.querySelector('section.sheet-body') + if (!section) return const activeTab = this.tabGroups.primary || "description" - - // Activate tab links + + // Set initial active state nav.querySelectorAll('[data-tab]').forEach(link => { - const tab = link.dataset.tab - link.classList.toggle('active', tab === activeTab) - link.addEventListener('click', (event) => { - event.preventDefault() - this.tabGroups.primary = tab - this.render() - }) + link.classList.toggle('active', link.dataset.tab === activeTab) + }) + section.querySelectorAll('[data-tab]').forEach(content => { + content.classList.toggle('active', content.dataset.tab === activeTab) }) - // Show/hide tab content - this.element.querySelectorAll('.tab[data-tab]').forEach(content => { - content.classList.toggle('active', content.dataset.tab === activeTab) + // Tab click — CSS-only switch, no render() + nav.querySelectorAll('[data-tab]').forEach(link => { + link.addEventListener('click', (event) => { + event.preventDefault() + const tab = link.dataset.tab + this.tabGroups.primary = tab + nav.querySelectorAll('[data-tab]').forEach(l => l.classList.toggle('active', l.dataset.tab === tab)) + section.querySelectorAll('[data-tab]').forEach(c => c.classList.toggle('active', c.dataset.tab === tab)) + }) }) } diff --git a/module/applications/sheets/feature-sheet.mjs b/module/applications/sheets/feature-sheet.mjs index 34b8d97..9ae191e 100644 --- a/module/applications/sheets/feature-sheet.mjs +++ b/module/applications/sheets/feature-sheet.mjs @@ -8,8 +8,7 @@ export default class BoLFeatureSheet extends BoLBaseItemSheet { /** @override */ static DEFAULT_OPTIONS = { - ...super.DEFAULT_OPTIONS, - classes: [...super.DEFAULT_OPTIONS.classes, "item-type-feature"], + classes: ["bol", "sheet", "item", "item-type-feature"], } /** @override */ diff --git a/module/applications/sheets/horde-sheet.mjs b/module/applications/sheets/horde-sheet.mjs new file mode 100644 index 0000000..067d3f7 --- /dev/null +++ b/module/applications/sheets/horde-sheet.mjs @@ -0,0 +1,65 @@ +import BoLBaseActorSheet from "./base-actor-sheet.mjs" + +/** + * Actor Sheet for BoL hordes using AppV2 + */ +export default class BoLHordeSheet extends BoLBaseActorSheet { + /** @override */ + static DEFAULT_OPTIONS = { + ...super.DEFAULT_OPTIONS, + classes: [...super.DEFAULT_OPTIONS.classes], + actions: { + ...super.DEFAULT_OPTIONS.actions, + }, + } + + /** @override */ + static PARTS = { + sheet: { + template: "systems/bol/templates/actor/horde-sheet.hbs", + }, + } + + /** @override */ + tabGroups = { primary: "stats" } + + /** @override */ + async _prepareContext() { + const context = await super._prepareContext() + const actor = this.document + + context.options = this.options + context.editScore = this.options.editScore + context.description = await foundry.applications.ux.TextEditor.implementation.enrichHTML( + actor.system.description || "", { async: true } + ) + + console.log("HORDE (AppV2)", context) + return context + } + + /** @override */ + _activateListeners() { + super._activateListeners() + if (!this.isEditable) return + + // Item create via header dataset + this.element.querySelectorAll(".item-create").forEach((el) => { + el.addEventListener("click", (ev) => { + ev.preventDefault() + const header = ev.currentTarget + const type = header.dataset.type + const data = foundry.utils.duplicate(header.dataset) + delete data.type + this.actor.createEmbeddedDocuments("Item", [{ name: `New ${type}`, type, data }]) + }) + }) + + // Create generic item + this.element.querySelectorAll(".create_item").forEach((el) => { + el.addEventListener("click", () => { + this.actor.createEmbeddedDocuments("Item", [{ name: "Nouvel Equipement", type: "item" }], { renderSheet: true }) + }) + }) + } +} diff --git a/module/applications/sheets/item-sheet.mjs b/module/applications/sheets/item-sheet.mjs index d6d4259..2475486 100644 --- a/module/applications/sheets/item-sheet.mjs +++ b/module/applications/sheets/item-sheet.mjs @@ -8,8 +8,7 @@ export default class BoLItemSheet extends BoLBaseItemSheet { /** @override */ static DEFAULT_OPTIONS = { - ...super.DEFAULT_OPTIONS, - classes: [...super.DEFAULT_OPTIONS.classes, "item-type-item"], + classes: ["bol", "sheet", "item", "item-type-item"], } /** @override */ diff --git a/module/applications/sheets/vehicle-sheet.mjs b/module/applications/sheets/vehicle-sheet.mjs new file mode 100644 index 0000000..7ae81fe --- /dev/null +++ b/module/applications/sheets/vehicle-sheet.mjs @@ -0,0 +1,66 @@ +import BoLBaseActorSheet from "./base-actor-sheet.mjs" + +/** + * Actor Sheet for BoL vehicles using AppV2 + */ +export default class BoLVehicleSheet extends BoLBaseActorSheet { + /** @override */ + static DEFAULT_OPTIONS = { + ...super.DEFAULT_OPTIONS, + classes: [...super.DEFAULT_OPTIONS.classes], + actions: { + ...super.DEFAULT_OPTIONS.actions, + }, + } + + /** @override */ + static PARTS = { + sheet: { + template: "systems/bol/templates/actor/vehicle-sheet.hbs", + }, + } + + /** @override */ + tabGroups = { primary: "stats" } + + /** @override */ + async _prepareContext() { + const context = await super._prepareContext() + const actor = this.document + + context.weapons = actor.vehicleWeapons + context.options = this.options + context.editScore = this.options.editScore + context.description = await foundry.applications.ux.TextEditor.implementation.enrichHTML( + actor.system.description || "", { async: true } + ) + + console.log("VEHICLE (AppV2)", context) + return context + } + + /** @override */ + _activateListeners() { + super._activateListeners() + if (!this.isEditable) return + + // Item create via header dataset + this.element.querySelectorAll(".item-create").forEach((el) => { + el.addEventListener("click", (ev) => { + ev.preventDefault() + const header = ev.currentTarget + const type = header.dataset.type + const data = foundry.utils.duplicate(header.dataset) + delete data.type + this.actor.createEmbeddedDocuments("Item", [{ name: `New ${type}`, type, data }]) + }) + }) + + // Create generic item + this.element.querySelectorAll(".create_item").forEach((el) => { + el.addEventListener("click", () => { + this.actor.createEmbeddedDocuments("Item", [{ name: "Nouvel Equipement", type: "item" }], { renderSheet: true }) + }) + }) + } +} diff --git a/module/bol.js b/module/bol.js index 79adc69..8a1676f 100644 --- a/module/bol.js +++ b/module/bol.js @@ -1,9 +1,7 @@ /* -------------------------------------------- */ // Import Modules import { BoLActor } from "./actor/actor.js" -import { BoLActorSheet } from "./actor/actor-sheet.js" -import { BoLVehicleSheet } from "./actor/vehicle-sheet.js" -import { BoLHordeSheet } from "./actor/horde-sheet.js" +// AppV1 actor sheets kept for reference only (AppV2 used via sheets.* below) import { BoLItem } from "./item/item.js" // Note: Old BoLItemSheet (AppV1) is now replaced by AppV2 sheets import { System, BOL } from "./system/config.js" @@ -72,9 +70,9 @@ Hooks.once('init', async function () { // Register sheet application classes foundry.documents.collections.Actors.unregisterSheet("core", foundry.appv1.sheets.ActorSheet); - foundry.documents.collections.Actors.registerSheet("bol", BoLActorSheet, { types: ["character", "encounter"], makeDefault: true }) - foundry.documents.collections.Actors.registerSheet("bol", BoLVehicleSheet, { types: ["vehicle"], makeDefault: true }) - foundry.documents.collections.Actors.registerSheet("bol", BoLHordeSheet, { types: ["horde"], makeDefault: true }) + foundry.documents.collections.Actors.registerSheet("bol", sheets.BoLActorSheet, { types: ["character", "encounter"], makeDefault: true }) + foundry.documents.collections.Actors.registerSheet("bol", sheets.BoLVehicleSheet, { types: ["vehicle"], makeDefault: true }) + foundry.documents.collections.Actors.registerSheet("bol", sheets.BoLHordeSheet, { types: ["horde"], makeDefault: true }) // Register AppV2 Item Sheets foundry.documents.collections.Items.unregisterSheet("core", foundry.appv1.sheets.ItemSheet); diff --git a/module/models/feature.mjs b/module/models/feature.mjs index 199ef30..9e7cb6d 100644 --- a/module/models/feature.mjs +++ b/module/models/feature.mjs @@ -5,14 +5,47 @@ export default class BoLFeatureDataModel extends foundry.abstract.TypeDataModel static defineSchema() { const fields = foundry.data.fields; const requiredInteger = { required: true, nullable: false, integer: true }; - + const nullableNumber = { required: false, nullable: true, initial: null }; + return { // Base fields category: new fields.StringField({ initial: "" }), subtype: new fields.StringField({ initial: "default" }), description: new fields.HTMLField({ initial: "" }), - properties: new fields.SchemaField({}), - + properties: new fields.SchemaField({ + // Career + sorcerer: new fields.BooleanField({ initial: false }), + alchemist: new fields.BooleanField({ initial: false }), + priest: new fields.BooleanField({ initial: false }), + astrologer: new fields.BooleanField({ initial: false }), + + // Boon + isbonusdice: new fields.BooleanField({ initial: false }), + + // Flaw + ismalusdice: new fields.BooleanField({ initial: false }), + + // Fight option + fightoptiontype: new fields.StringField({ initial: "" }), + activated: new fields.BooleanField({ initial: false }), + isspecial: new fields.BooleanField({ initial: false }), + + // Effect (boleffect) + identifier: new fields.StringField({ initial: "" }), + modifier: new fields.StringField({ initial: "" }), + + // Horoscope + horoscopeanswer: new fields.StringField({ initial: "" }), + rank: new fields.NumberField({ ...nullableNumber }), + + // XP log + xptype: new fields.StringField({ initial: "" }), + xpdate: new fields.StringField({ initial: "" }), + xpname: new fields.StringField({ initial: "" }), + xpcost: new fields.NumberField({ ...nullableNumber }), + xpvalue: new fields.NumberField({ ...nullableNumber }), + }), + // Feature-specific fields rank: new fields.NumberField({ ...requiredInteger, initial: 0 }) }; diff --git a/module/models/item.mjs b/module/models/item.mjs index fe3a9ef..dc90081 100644 --- a/module/models/item.mjs +++ b/module/models/item.mjs @@ -5,6 +5,7 @@ export default class BoLItemDataModel extends foundry.abstract.TypeDataModel { static defineSchema() { const fields = foundry.data.fields; const requiredInteger = { required: true, nullable: false, integer: true }; + const nullableNumber = { required: false, nullable: true, initial: null }; return { // Base fields @@ -12,6 +13,7 @@ export default class BoLItemDataModel extends foundry.abstract.TypeDataModel { subtype: new fields.StringField({ initial: "default" }), description: new fields.HTMLField({ initial: "" }), properties: new fields.SchemaField({ + // Base flags ranged: new fields.BooleanField({ initial: false }), melee: new fields.BooleanField({ initial: false }), spell: new fields.BooleanField({ initial: false }), @@ -27,7 +29,76 @@ export default class BoLItemDataModel extends foundry.abstract.TypeDataModel { reloadable: new fields.BooleanField({ initial: false }), bow: new fields.BooleanField({ initial: false }), crossbow: new fields.BooleanField({ initial: false }), - throwing: new fields.BooleanField({ initial: false }) + throwing: new fields.BooleanField({ initial: false }), + + // Equipment + stackable: new fields.BooleanField({ initial: false }), + stacksize: new fields.NumberField({ ...nullableNumber }), + slot: new fields.StringField({ initial: "-" }), + + // Weapon flags + natural: new fields.BooleanField({ initial: false }), + concealable: new fields.BooleanField({ initial: false }), + ignoreshield: new fields.BooleanField({ initial: false }), + attackBonusDice: new fields.BooleanField({ initial: false }), + attackMalusDice: new fields.BooleanField({ initial: false }), + onlymodifier: new fields.BooleanField({ initial: false }), + bashing: new fields.BooleanField({ initial: false }), + throwable: new fields.BooleanField({ initial: false }), + damageReroll1: new fields.BooleanField({ initial: false }), + + // Weapon stats + attackAttribute: new fields.StringField({ initial: "vigor" }), + attackAptitude: new fields.StringField({ initial: "melee" }), + attackModifiers: new fields.NumberField({ ...nullableNumber }), + weaponSize: new fields.StringField({ initial: "unarmed" }), + damage: new fields.StringField({ initial: "0" }), + damageAttribute: new fields.StringField({ initial: "" }), + damageModifiers: new fields.NumberField({ ...nullableNumber }), + damageMultiplier: new fields.StringField({ initial: "1" }), + range: new fields.NumberField({ ...nullableNumber }), + reload: new fields.NumberField({ ...nullableNumber }), + + // Protection + armorQuality: new fields.StringField({ initial: "" }), + soak: new fields.SchemaField({ + formula: new fields.StringField({ initial: "" }), + value: new fields.NumberField({ initial: 0, nullable: true }), + modifier: new fields.NumberField({ initial: 0, nullable: true }), + }), + blocking: new fields.SchemaField({ + malus: new fields.NumberField({ initial: 0, nullable: true }), + blocking1: new fields.BooleanField({ initial: false }), + blockingAll: new fields.BooleanField({ initial: false }), + }), + modifiers: new fields.SchemaField({ + init: new fields.NumberField({ initial: 0, nullable: true }), + agility: new fields.NumberField({ initial: 0, nullable: true }), + powercost: new fields.NumberField({ initial: 0, nullable: true }), + social: new fields.BooleanField({ initial: false }), + }), + + // Spell + circle: new fields.NumberField({ initial: 0, nullable: true }), + difficulty: new fields.StringField({ initial: "" }), + ppcost: new fields.NumberField({ initial: 0, nullable: true }), + duration: new fields.StringField({ initial: "" }), + nbmandatoryconditions: new fields.NumberField({ initial: 0, nullable: true }), + mandatoryconditions: new fields.ArrayField(new fields.StringField()), + optionnalconditions: new fields.ArrayField(new fields.StringField()), + + // Alchemy + alchemytype: new fields.StringField({ initial: "" }), + pccost: new fields.NumberField({ initial: 0, nullable: true }), + pccurrent: new fields.NumberField({ initial: 0, nullable: true }), + + // Vehicle weapon + isfiredamage: new fields.BooleanField({ initial: false }), + ishulldamage: new fields.BooleanField({ initial: false }), + iscrewdamage: new fields.BooleanField({ initial: false }), + isboarding: new fields.BooleanField({ initial: false }), + isspur: new fields.BooleanField({ initial: false }), + isbreakrow: new fields.BooleanField({ initial: false }), }), // Equipment fields diff --git a/module/system/bol-utility.js b/module/system/bol-utility.js index 3d5604a..0499c2f 100644 --- a/module/system/bol-utility.js +++ b/module/system/bol-utility.js @@ -237,6 +237,11 @@ export class BoLUtility { if (chatData.img.includes("/blank.png")) { chatData.img = null; } + // For old-format weapon items lacking stat fields, apply defaults so the chat card can display them + if (chatData.system?.properties?.weapon && !chatData.system.properties.damage) { + const defaults = game.bol.config.defaultNaturalWeapon?.properties ?? {}; + chatData.system.properties = Object.assign(foundry.utils.duplicate(defaults), chatData.system.properties); + } // JSON object for easy creation chatData.jsondata = JSON.stringify( { diff --git a/packs/aides-de-jeu/000970.log b/packs/aides-de-jeu/001073.log similarity index 100% rename from packs/aides-de-jeu/000970.log rename to packs/aides-de-jeu/001073.log diff --git a/packs/aides-de-jeu/CURRENT b/packs/aides-de-jeu/CURRENT index 1526d0a..422b12b 100644 --- a/packs/aides-de-jeu/CURRENT +++ b/packs/aides-de-jeu/CURRENT @@ -1 +1 @@ -MANIFEST-000969 +MANIFEST-001072 diff --git a/packs/aides-de-jeu/LOG b/packs/aides-de-jeu/LOG index dd3d03b..cf734ec 100644 --- a/packs/aides-de-jeu/LOG +++ b/packs/aides-de-jeu/LOG @@ -1,3 +1,3 @@ -2026/01/13-08:07:30.199598 7fad373ff6c0 Recovering log #967 -2026/01/13-08:07:30.210270 7fad373ff6c0 Delete type=3 #965 -2026/01/13-08:07:30.210357 7fad373ff6c0 Delete type=0 #967 +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 diff --git a/packs/aides-de-jeu/LOG.old b/packs/aides-de-jeu/LOG.old index 9e3c512..d01ca82 100644 --- a/packs/aides-de-jeu/LOG.old +++ b/packs/aides-de-jeu/LOG.old @@ -1,8 +1,8 @@ -2026/01/13-00:31:14.360616 7fad35bfc6c0 Recovering log #963 -2026/01/13-00:31:14.370734 7fad35bfc6c0 Delete type=3 #961 -2026/01/13-00:31:14.370788 7fad35bfc6c0 Delete type=0 #963 -2026/01/13-00:33:18.090132 7fad353fb6c0 Level-0 table #968: started -2026/01/13-00:33:18.090168 7fad353fb6c0 Level-0 table #968: 0 bytes OK -2026/01/13-00:33:18.096686 7fad353fb6c0 Delete type=0 #966 -2026/01/13-00:33:18.110856 7fad353fb6c0 Manual compaction at level-0 from '!journal!3xJg1rCxnWvEmoxS' @ 72057594037927935 : 1 .. '!journal.pages!veAAxCtCKcFIsnln.0kUgZspxXO7VS8bd' @ 0 : 0; will stop at (end) -2026/01/13-00:33:18.110909 7fad353fb6c0 Manual compaction at level-1 from '!journal!3xJg1rCxnWvEmoxS' @ 72057594037927935 : 1 .. '!journal.pages!veAAxCtCKcFIsnln.0kUgZspxXO7VS8bd' @ 0 : 0; will stop at (end) +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) diff --git a/packs/aides-de-jeu/MANIFEST-000969 b/packs/aides-de-jeu/MANIFEST-001072 similarity index 91% rename from packs/aides-de-jeu/MANIFEST-000969 rename to packs/aides-de-jeu/MANIFEST-001072 index e59a0c8e080897223b1ff6a159638f99e17af72f..04ac1993b18e4d73b6e34f52ef32065affb35adb 100644 GIT binary patch delta 25 hcmcb_c!_bs0U?n$vDw@Vj7%FjI2o8Xaj?u`0sw9v2LJ#7 delta 25 hcmcb_c!_bs0U_oWb6U9>7@1D7b22cWW@nkh1ORi02Xp`c diff --git a/packs/armors/000875.log b/packs/armors/000978.log similarity index 100% rename from packs/armors/000875.log rename to packs/armors/000978.log diff --git a/packs/armors/CURRENT b/packs/armors/CURRENT index 7299140..760f0f8 100644 --- a/packs/armors/CURRENT +++ b/packs/armors/CURRENT @@ -1 +1 @@ -MANIFEST-000874 +MANIFEST-000977 diff --git a/packs/armors/LOG b/packs/armors/LOG index d7554ea..6e3cadc 100644 --- a/packs/armors/LOG +++ b/packs/armors/LOG @@ -1,3 +1,3 @@ -2026/01/13-08:07:30.170497 7fad363fd6c0 Recovering log #872 -2026/01/13-08:07:30.181911 7fad363fd6c0 Delete type=3 #870 -2026/01/13-08:07:30.182023 7fad363fd6c0 Delete type=0 #872 +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 diff --git a/packs/armors/LOG.old b/packs/armors/LOG.old index 9835a04..9b13e5a 100644 --- a/packs/armors/LOG.old +++ b/packs/armors/LOG.old @@ -1,8 +1,8 @@ -2026/01/13-00:31:14.336061 7fad36bfe6c0 Recovering log #868 -2026/01/13-00:31:14.346068 7fad36bfe6c0 Delete type=3 #866 -2026/01/13-00:31:14.346144 7fad36bfe6c0 Delete type=0 #868 -2026/01/13-00:33:18.103240 7fad353fb6c0 Level-0 table #873: started -2026/01/13-00:33:18.103270 7fad353fb6c0 Level-0 table #873: 0 bytes OK -2026/01/13-00:33:18.110698 7fad353fb6c0 Delete type=0 #871 -2026/01/13-00:33:18.110885 7fad353fb6c0 Manual compaction at level-0 from '!items!G3dZTHIabA3LA1hY' @ 72057594037927935 : 1 .. '!items!xhEcsi3WHjbt2ro9' @ 0 : 0; will stop at (end) -2026/01/13-00:33:18.110931 7fad353fb6c0 Manual compaction at level-1 from '!items!G3dZTHIabA3LA1hY' @ 72057594037927935 : 1 .. '!items!xhEcsi3WHjbt2ro9' @ 0 : 0; will stop at (end) +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) diff --git a/packs/armors/MANIFEST-000874 b/packs/armors/MANIFEST-000977 similarity index 82% rename from packs/armors/MANIFEST-000874 rename to packs/armors/MANIFEST-000977 index 097c30853925a46778e18722fe20b36c842b6bbb..d42619ad7f170dbeb1a4067df44d6df0636aac1b 100644 GIT binary patch delta 24 gcmbQkIEQgUx8Uv>3^7~`j7*oc0B+I;f&c&j diff --git a/packs/careers/000968.log b/packs/careers/001071.log similarity index 100% rename from packs/careers/000968.log rename to packs/careers/001071.log diff --git a/packs/careers/CURRENT b/packs/careers/CURRENT index 0165034..210222d 100644 --- a/packs/careers/CURRENT +++ b/packs/careers/CURRENT @@ -1 +1 @@ -MANIFEST-000967 +MANIFEST-001070 diff --git a/packs/careers/LOG b/packs/careers/LOG index 13eb4df..dae2016 100644 --- a/packs/careers/LOG +++ b/packs/careers/LOG @@ -1,3 +1,3 @@ -2026/01/13-08:07:30.097111 7fad35bfc6c0 Recovering log #965 -2026/01/13-08:07:30.108030 7fad35bfc6c0 Delete type=3 #963 -2026/01/13-08:07:30.108147 7fad35bfc6c0 Delete type=0 #965 +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 diff --git a/packs/careers/LOG.old b/packs/careers/LOG.old index 47380b6..f37a57d 100644 --- a/packs/careers/LOG.old +++ b/packs/careers/LOG.old @@ -1,8 +1,8 @@ -2026/01/13-00:31:14.273174 7fad373ff6c0 Recovering log #961 -2026/01/13-00:31:14.283828 7fad373ff6c0 Delete type=3 #959 -2026/01/13-00:31:14.283908 7fad373ff6c0 Delete type=0 #961 -2026/01/13-00:33:18.051012 7fad353fb6c0 Level-0 table #966: started -2026/01/13-00:33:18.051036 7fad353fb6c0 Level-0 table #966: 0 bytes OK -2026/01/13-00:33:18.057270 7fad353fb6c0 Delete type=0 #964 -2026/01/13-00:33:18.057409 7fad353fb6c0 Manual compaction at level-0 from '!items!4S4xAfMXGnuU0O1a' @ 72057594037927935 : 1 .. '!items!zxY3sW0iCJBvwjOS' @ 0 : 0; will stop at (end) -2026/01/13-00:33:18.057437 7fad353fb6c0 Manual compaction at level-1 from '!items!4S4xAfMXGnuU0O1a' @ 72057594037927935 : 1 .. '!items!zxY3sW0iCJBvwjOS' @ 0 : 0; will stop at (end) +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) diff --git a/packs/careers/MANIFEST-000967 b/packs/careers/MANIFEST-001070 similarity index 81% rename from packs/careers/MANIFEST-000967 rename to packs/careers/MANIFEST-001070 index 0f461ffbfc21e453dbee0509e65e162840646319..ab210f9d88aaf2c4112d3c850cfec203d71d706f 100644 GIT binary patch delta 25 hcmbQoIFE5ck5Ep##2;=3MyB-~oD9qxI9RST0sv%B2H5}r delta 25 hcmbQoIFE5ck5K&V|E=5%j7%rkIT@Hwva?)g1ORQC2Y>(o diff --git a/packs/effets-exemples/000966.log b/packs/effets-exemples/001069.log similarity index 100% rename from packs/effets-exemples/000966.log rename to packs/effets-exemples/001069.log diff --git a/packs/effets-exemples/CURRENT b/packs/effets-exemples/CURRENT index 8bac917..436e6b4 100644 --- a/packs/effets-exemples/CURRENT +++ b/packs/effets-exemples/CURRENT @@ -1 +1 @@ -MANIFEST-000965 +MANIFEST-001068 diff --git a/packs/effets-exemples/LOG b/packs/effets-exemples/LOG index fcc53ce..b614af9 100644 --- a/packs/effets-exemples/LOG +++ b/packs/effets-exemples/LOG @@ -1,3 +1,3 @@ -2026/01/13-08:07:30.299106 7fad35bfc6c0 Recovering log #963 -2026/01/13-08:07:30.310415 7fad35bfc6c0 Delete type=3 #961 -2026/01/13-08:07:30.310500 7fad35bfc6c0 Delete type=0 #963 +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 diff --git a/packs/effets-exemples/LOG.old b/packs/effets-exemples/LOG.old index ad6a2d6..baa34c5 100644 --- a/packs/effets-exemples/LOG.old +++ b/packs/effets-exemples/LOG.old @@ -1,8 +1,8 @@ -2026/01/13-00:31:14.446842 7fad363fd6c0 Recovering log #959 -2026/01/13-00:31:14.457714 7fad363fd6c0 Delete type=3 #957 -2026/01/13-00:31:14.457795 7fad363fd6c0 Delete type=0 #959 -2026/01/13-00:33:18.151324 7fad353fb6c0 Level-0 table #964: started -2026/01/13-00:33:18.151382 7fad353fb6c0 Level-0 table #964: 0 bytes OK -2026/01/13-00:33:18.157882 7fad353fb6c0 Delete type=0 #962 -2026/01/13-00:33:18.164702 7fad353fb6c0 Manual compaction at level-0 from '!items!6fTZ6hOKR4pWbWOe' @ 72057594037927935 : 1 .. '!items!zwSNMO9HpiqUCMt8' @ 0 : 0; will stop at (end) -2026/01/13-00:33:18.175125 7fad353fb6c0 Manual compaction at level-1 from '!items!6fTZ6hOKR4pWbWOe' @ 72057594037927935 : 1 .. '!items!zwSNMO9HpiqUCMt8' @ 0 : 0; will stop at (end) +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) diff --git a/packs/effets-exemples/MANIFEST-000965 b/packs/effets-exemples/MANIFEST-001068 similarity index 82% rename from packs/effets-exemples/MANIFEST-000965 rename to packs/effets-exemples/MANIFEST-001068 index efa040ca09b4779faba5c887280f8d2b74e8957c..d28bc09e5922f652fca9464ea2a34a94c8949f86 100644 GIT binary patch delta 24 gcmbQkIEQgUx8S^A8}@K9Ffy&>;ACK4$H5{20BiXN3jhEB delta 24 fcmbQkIEQgUx1e5zIS&^DBhxW?{%hOY8*@ diff --git a/packs/equipment/000969.log b/packs/equipment/001072.log similarity index 100% rename from packs/equipment/000969.log rename to packs/equipment/001072.log diff --git a/packs/equipment/CURRENT b/packs/equipment/CURRENT index 0a8f1fe..6027312 100644 --- a/packs/equipment/CURRENT +++ b/packs/equipment/CURRENT @@ -1 +1 @@ -MANIFEST-000968 +MANIFEST-001071 diff --git a/packs/equipment/LOG b/packs/equipment/LOG index 08bd1d6..b03c632 100644 --- a/packs/equipment/LOG +++ b/packs/equipment/LOG @@ -1,3 +1,3 @@ -2026/01/13-08:07:30.141144 7fad36bfe6c0 Recovering log #966 -2026/01/13-08:07:30.151959 7fad36bfe6c0 Delete type=3 #964 -2026/01/13-08:07:30.152081 7fad36bfe6c0 Delete type=0 #966 +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 diff --git a/packs/equipment/LOG.old b/packs/equipment/LOG.old index 8500baa..a3b3c3c 100644 --- a/packs/equipment/LOG.old +++ b/packs/equipment/LOG.old @@ -1,8 +1,8 @@ -2026/01/13-00:31:14.310520 7fad373ff6c0 Recovering log #962 -2026/01/13-00:31:14.320991 7fad373ff6c0 Delete type=3 #960 -2026/01/13-00:31:14.321051 7fad373ff6c0 Delete type=0 #962 -2026/01/13-00:33:18.069718 7fad353fb6c0 Level-0 table #967: started -2026/01/13-00:33:18.069745 7fad353fb6c0 Level-0 table #967: 0 bytes OK -2026/01/13-00:33:18.076816 7fad353fb6c0 Delete type=0 #965 -2026/01/13-00:33:18.083350 7fad353fb6c0 Manual compaction at level-0 from '!items!0ErhyqifZLDCmMfT' @ 72057594037927935 : 1 .. '!items!yE8UH6YAgNGjKDEu' @ 0 : 0; will stop at (end) -2026/01/13-00:33:18.083400 7fad353fb6c0 Manual compaction at level-1 from '!items!0ErhyqifZLDCmMfT' @ 72057594037927935 : 1 .. '!items!yE8UH6YAgNGjKDEu' @ 0 : 0; will stop at (end) +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) diff --git a/packs/equipment/MANIFEST-000968 b/packs/equipment/MANIFEST-001071 similarity index 81% rename from packs/equipment/MANIFEST-000968 rename to packs/equipment/MANIFEST-001071 index c3e66d5f8df99e43f4b7ab9acc614d5e05f4568f..6d3f3e00f885af99468d862018eece3d990940d5 100644 GIT binary patch delta 25 hcmbQsIG1rkx6mPRo>kloj7%FiI2o8Xa-3BhyKCP6p;v>@1&|0ZJ+bbN~PV diff --git a/packs/fightoptions/000968.log b/packs/fightoptions/001071.log similarity index 100% rename from packs/fightoptions/000968.log rename to packs/fightoptions/001071.log diff --git a/packs/fightoptions/CURRENT b/packs/fightoptions/CURRENT index 0165034..210222d 100644 --- a/packs/fightoptions/CURRENT +++ b/packs/fightoptions/CURRENT @@ -1 +1 @@ -MANIFEST-000967 +MANIFEST-001070 diff --git a/packs/fightoptions/LOG b/packs/fightoptions/LOG index 3f7467a..0a62d10 100644 --- a/packs/fightoptions/LOG +++ b/packs/fightoptions/LOG @@ -1,3 +1,3 @@ -2026/01/13-08:07:30.243235 7fad36bfe6c0 Recovering log #965 -2026/01/13-08:07:30.253392 7fad36bfe6c0 Delete type=3 #963 -2026/01/13-08:07:30.253472 7fad36bfe6c0 Delete type=0 #965 +2026/02/28-17:23:52.920377 7f56e3fff6c0 Recovering log #1068 +2026/02/28-17:23:52.930570 7f56e3fff6c0 Delete type=3 #1066 +2026/02/28-17:23:52.930642 7f56e3fff6c0 Delete type=0 #1068 diff --git a/packs/fightoptions/LOG.old b/packs/fightoptions/LOG.old index 57bce28..b14751a 100644 --- a/packs/fightoptions/LOG.old +++ b/packs/fightoptions/LOG.old @@ -1,8 +1,8 @@ -2026/01/13-00:31:14.398650 7fad36bfe6c0 Recovering log #961 -2026/01/13-00:31:14.408258 7fad36bfe6c0 Delete type=3 #959 -2026/01/13-00:31:14.408316 7fad36bfe6c0 Delete type=0 #961 -2026/01/13-00:33:18.117431 7fad353fb6c0 Level-0 table #966: started -2026/01/13-00:33:18.117458 7fad353fb6c0 Level-0 table #966: 0 bytes OK -2026/01/13-00:33:18.123956 7fad353fb6c0 Delete type=0 #964 -2026/01/13-00:33:18.137577 7fad353fb6c0 Manual compaction at level-0 from '!items!AoT2c0af4lY6aBsx' @ 72057594037927935 : 1 .. '!items!vGydqADwTsHZ9B3j' @ 0 : 0; will stop at (end) -2026/01/13-00:33:18.137619 7fad353fb6c0 Manual compaction at level-1 from '!items!AoT2c0af4lY6aBsx' @ 72057594037927935 : 1 .. '!items!vGydqADwTsHZ9B3j' @ 0 : 0; will stop at (end) +2026/02/28-16:33:30.708467 7f56e3fff6c0 Recovering log #1064 +2026/02/28-16:33:30.718300 7f56e3fff6c0 Delete type=3 #1062 +2026/02/28-16:33:30.718379 7f56e3fff6c0 Delete type=0 #1064 +2026/02/28-17:23:47.176664 7f54e37ef6c0 Level-0 table #1069: started +2026/02/28-17:23:47.176691 7f54e37ef6c0 Level-0 table #1069: 0 bytes OK +2026/02/28-17:23:47.182879 7f54e37ef6c0 Delete type=0 #1067 +2026/02/28-17:23:47.196873 7f54e37ef6c0 Manual compaction at level-0 from '!items!AoT2c0af4lY6aBsx' @ 72057594037927935 : 1 .. '!items!vGydqADwTsHZ9B3j' @ 0 : 0; will stop at (end) +2026/02/28-17:23:47.196911 7f54e37ef6c0 Manual compaction at level-1 from '!items!AoT2c0af4lY6aBsx' @ 72057594037927935 : 1 .. '!items!vGydqADwTsHZ9B3j' @ 0 : 0; will stop at (end) diff --git a/packs/fightoptions/MANIFEST-000967 b/packs/fightoptions/MANIFEST-001070 similarity index 81% rename from packs/fightoptions/MANIFEST-000967 rename to packs/fightoptions/MANIFEST-001070 index e46078e015fd1870e3681676dca177977b10e411..cb8372ae9031227fdc1b295ae72cd2d5bbfdaa7a 100644 GIT binary patch delta 25 hcmbQsIG1rkx6t#;JEn6pFfy&@;ACLlz`?SY5dd|b2fhFR delta 25 hcmbQsIG1rkx6qgM@t?RE7@1D6b22cWWM|pS2mp0c2iX7s diff --git a/packs/fightoptionsfanmade/000451.log b/packs/fightoptionsfanmade/000554.log similarity index 100% rename from packs/fightoptionsfanmade/000451.log rename to packs/fightoptionsfanmade/000554.log diff --git a/packs/fightoptionsfanmade/CURRENT b/packs/fightoptionsfanmade/CURRENT index cf972fb..06420a4 100644 --- a/packs/fightoptionsfanmade/CURRENT +++ b/packs/fightoptionsfanmade/CURRENT @@ -1 +1 @@ -MANIFEST-000450 +MANIFEST-000553 diff --git a/packs/fightoptionsfanmade/LOG b/packs/fightoptionsfanmade/LOG index d9e8fe8..fc090b3 100644 --- a/packs/fightoptionsfanmade/LOG +++ b/packs/fightoptionsfanmade/LOG @@ -1,3 +1,3 @@ -2026/01/13-08:07:30.256588 7fad35bfc6c0 Recovering log #448 -2026/01/13-08:07:30.267581 7fad35bfc6c0 Delete type=3 #446 -2026/01/13-08:07:30.267689 7fad35bfc6c0 Delete type=0 #448 +2026/02/28-17:23:52.933111 7f56f9bff6c0 Recovering log #551 +2026/02/28-17:23:52.944230 7f56f9bff6c0 Delete type=3 #549 +2026/02/28-17:23:52.944299 7f56f9bff6c0 Delete type=0 #551 diff --git a/packs/fightoptionsfanmade/LOG.old b/packs/fightoptionsfanmade/LOG.old index 7cbcaa1..426e7f2 100644 --- a/packs/fightoptionsfanmade/LOG.old +++ b/packs/fightoptionsfanmade/LOG.old @@ -1,8 +1,8 @@ -2026/01/13-00:31:14.410555 7fad363fd6c0 Recovering log #444 -2026/01/13-00:31:14.420238 7fad363fd6c0 Delete type=3 #442 -2026/01/13-00:31:14.420295 7fad363fd6c0 Delete type=0 #444 -2026/01/13-00:33:18.124112 7fad353fb6c0 Level-0 table #449: started -2026/01/13-00:33:18.124145 7fad353fb6c0 Level-0 table #449: 0 bytes OK -2026/01/13-00:33:18.131131 7fad353fb6c0 Delete type=0 #447 -2026/01/13-00:33:18.137587 7fad353fb6c0 Manual compaction at level-0 from '!items!CLRp0k5qV8mD03pW' @ 72057594037927935 : 1 .. '!items!wYEpnhbyYaMkaNdL' @ 0 : 0; will stop at (end) -2026/01/13-00:33:18.137626 7fad353fb6c0 Manual compaction at level-1 from '!items!CLRp0k5qV8mD03pW' @ 72057594037927935 : 1 .. '!items!wYEpnhbyYaMkaNdL' @ 0 : 0; will stop at (end) +2026/02/28-16:33:30.720629 7f56f93fe6c0 Recovering log #547 +2026/02/28-16:33:30.730500 7f56f93fe6c0 Delete type=3 #545 +2026/02/28-16:33:30.730560 7f56f93fe6c0 Delete type=0 #547 +2026/02/28-17:23:47.170169 7f54e37ef6c0 Level-0 table #552: started +2026/02/28-17:23:47.170192 7f54e37ef6c0 Level-0 table #552: 0 bytes OK +2026/02/28-17:23:47.176521 7f54e37ef6c0 Delete type=0 #550 +2026/02/28-17:23:47.196862 7f54e37ef6c0 Manual compaction at level-0 from '!items!CLRp0k5qV8mD03pW' @ 72057594037927935 : 1 .. '!items!wYEpnhbyYaMkaNdL' @ 0 : 0; will stop at (end) +2026/02/28-17:23:47.196905 7f54e37ef6c0 Manual compaction at level-1 from '!items!CLRp0k5qV8mD03pW' @ 72057594037927935 : 1 .. '!items!wYEpnhbyYaMkaNdL' @ 0 : 0; will stop at (end) diff --git a/packs/fightoptionsfanmade/MANIFEST-000450 b/packs/fightoptionsfanmade/MANIFEST-000553 similarity index 81% rename from packs/fightoptionsfanmade/MANIFEST-000450 rename to packs/fightoptionsfanmade/MANIFEST-000553 index 5e5a186451586886833630e2c5d7b18fa865c5dd..ee7ddc710c4267991f79d7195b7a9a845cf9f416 100644 GIT binary patch delta 25 hcmbQsIG1rkx6n$%-P+s?j7+OoI2o8%v#?BK1OQ);20Q=& delta 25 hcmbQsIG1rkx6nd?#TU657?}<;b22a=VP=`e2moes2GIZj diff --git a/packs/flaws/000969.log b/packs/flaws/001072.log similarity index 100% rename from packs/flaws/000969.log rename to packs/flaws/001072.log diff --git a/packs/flaws/CURRENT b/packs/flaws/CURRENT index 0a8f1fe..6027312 100644 --- a/packs/flaws/CURRENT +++ b/packs/flaws/CURRENT @@ -1 +1 @@ -MANIFEST-000968 +MANIFEST-001071 diff --git a/packs/flaws/LOG b/packs/flaws/LOG index c2ce08a..8c2e959 100644 --- a/packs/flaws/LOG +++ b/packs/flaws/LOG @@ -1,3 +1,3 @@ -2026/01/13-08:07:30.082049 7fad363fd6c0 Recovering log #966 -2026/01/13-08:07:30.092988 7fad363fd6c0 Delete type=3 #964 -2026/01/13-08:07:30.093097 7fad363fd6c0 Delete type=0 #966 +2026/02/28-17:23:52.782908 7f56e3fff6c0 Recovering log #1069 +2026/02/28-17:23:52.794098 7f56e3fff6c0 Delete type=3 #1067 +2026/02/28-17:23:52.794177 7f56e3fff6c0 Delete type=0 #1069 diff --git a/packs/flaws/LOG.old b/packs/flaws/LOG.old index 22024c6..7d5a037 100644 --- a/packs/flaws/LOG.old +++ b/packs/flaws/LOG.old @@ -1,8 +1,8 @@ -2026/01/13-00:31:14.260770 7fad363fd6c0 Recovering log #962 -2026/01/13-00:31:14.270998 7fad363fd6c0 Delete type=3 #960 -2026/01/13-00:31:14.271071 7fad363fd6c0 Delete type=0 #962 -2026/01/13-00:33:18.030429 7fad353fb6c0 Level-0 table #967: started -2026/01/13-00:33:18.030470 7fad353fb6c0 Level-0 table #967: 0 bytes OK -2026/01/13-00:33:18.037118 7fad353fb6c0 Delete type=0 #965 -2026/01/13-00:33:18.057382 7fad353fb6c0 Manual compaction at level-0 from '!items!0wCqg1UpGd50uJrS' @ 72057594037927935 : 1 .. '!items!znd0K3b7HzYpdehs' @ 0 : 0; will stop at (end) -2026/01/13-00:33:18.057416 7fad353fb6c0 Manual compaction at level-1 from '!items!0wCqg1UpGd50uJrS' @ 72057594037927935 : 1 .. '!items!znd0K3b7HzYpdehs' @ 0 : 0; will stop at (end) +2026/02/28-16:33:30.568367 7f56f93fe6c0 Recovering log #1065 +2026/02/28-16:33:30.578749 7f56f93fe6c0 Delete type=3 #1063 +2026/02/28-16:33:30.578812 7f56f93fe6c0 Delete type=0 #1065 +2026/02/28-17:23:47.094442 7f54e37ef6c0 Level-0 table #1070: started +2026/02/28-17:23:47.094487 7f54e37ef6c0 Level-0 table #1070: 0 bytes OK +2026/02/28-17:23:47.100985 7f54e37ef6c0 Delete type=0 #1068 +2026/02/28-17:23:47.119507 7f54e37ef6c0 Manual compaction at level-0 from '!items!0wCqg1UpGd50uJrS' @ 72057594037927935 : 1 .. '!items!znd0K3b7HzYpdehs' @ 0 : 0; will stop at (end) +2026/02/28-17:23:47.119555 7f54e37ef6c0 Manual compaction at level-1 from '!items!0wCqg1UpGd50uJrS' @ 72057594037927935 : 1 .. '!items!znd0K3b7HzYpdehs' @ 0 : 0; will stop at (end) diff --git a/packs/flaws/MANIFEST-000968 b/packs/flaws/MANIFEST-001071 similarity index 81% rename from packs/flaws/MANIFEST-000968 rename to packs/flaws/MANIFEST-001071 index 87fa11e82c1daecb45dd49217c69965bf1056762..11f88878b5fb59e1b3dee66d1b6684023974bae5 100644 GIT binary patch delta 25 hcmbQoIFE5ckI?*_)b-p9j7%FiI2o8Xa` diff --git a/packs/origins/000968.log b/packs/origins/001071.log similarity index 100% rename from packs/origins/000968.log rename to packs/origins/001071.log diff --git a/packs/origins/CURRENT b/packs/origins/CURRENT index 0165034..210222d 100644 --- a/packs/origins/CURRENT +++ b/packs/origins/CURRENT @@ -1 +1 @@ -MANIFEST-000967 +MANIFEST-001070 diff --git a/packs/origins/LOG b/packs/origins/LOG index 94994da..af4a0db 100644 --- a/packs/origins/LOG +++ b/packs/origins/LOG @@ -1,3 +1,3 @@ -2026/01/13-08:07:30.112173 7fad373ff6c0 Recovering log #965 -2026/01/13-08:07:30.123346 7fad373ff6c0 Delete type=3 #963 -2026/01/13-08:07:30.123478 7fad373ff6c0 Delete type=0 #965 +2026/02/28-17:23:52.807927 7f56f93fe6c0 Recovering log #1068 +2026/02/28-17:23:52.818186 7f56f93fe6c0 Delete type=3 #1066 +2026/02/28-17:23:52.818257 7f56f93fe6c0 Delete type=0 #1068 diff --git a/packs/origins/LOG.old b/packs/origins/LOG.old index 905528d..9eb0e0d 100644 --- a/packs/origins/LOG.old +++ b/packs/origins/LOG.old @@ -1,8 +1,8 @@ -2026/01/13-00:31:14.286076 7fad35bfc6c0 Recovering log #961 -2026/01/13-00:31:14.295737 7fad35bfc6c0 Delete type=3 #959 -2026/01/13-00:31:14.295823 7fad35bfc6c0 Delete type=0 #961 -2026/01/13-00:33:18.063638 7fad353fb6c0 Level-0 table #966: started -2026/01/13-00:33:18.063660 7fad353fb6c0 Level-0 table #966: 0 bytes OK -2026/01/13-00:33:18.069632 7fad353fb6c0 Delete type=0 #964 -2026/01/13-00:33:18.083342 7fad353fb6c0 Manual compaction at level-0 from '!items!2Wtl8xrKf46LMwBF' @ 72057594037927935 : 1 .. '!items!zIlZmEd9WAA473UX' @ 0 : 0; will stop at (end) -2026/01/13-00:33:18.083376 7fad353fb6c0 Manual compaction at level-1 from '!items!2Wtl8xrKf46LMwBF' @ 72057594037927935 : 1 .. '!items!zIlZmEd9WAA473UX' @ 0 : 0; will stop at (end) +2026/02/28-16:33:30.595096 7f56f9bff6c0 Recovering log #1064 +2026/02/28-16:33:30.604934 7f56f9bff6c0 Delete type=3 #1062 +2026/02/28-16:33:30.604985 7f56f9bff6c0 Delete type=0 #1064 +2026/02/28-17:23:47.132350 7f54e37ef6c0 Level-0 table #1069: started +2026/02/28-17:23:47.132377 7f54e37ef6c0 Level-0 table #1069: 0 bytes OK +2026/02/28-17:23:47.138287 7f54e37ef6c0 Delete type=0 #1067 +2026/02/28-17:23:47.144369 7f54e37ef6c0 Manual compaction at level-0 from '!items!2Wtl8xrKf46LMwBF' @ 72057594037927935 : 1 .. '!items!zIlZmEd9WAA473UX' @ 0 : 0; will stop at (end) +2026/02/28-17:23:47.144403 7f54e37ef6c0 Manual compaction at level-1 from '!items!2Wtl8xrKf46LMwBF' @ 72057594037927935 : 1 .. '!items!zIlZmEd9WAA473UX' @ 0 : 0; will stop at (end) diff --git a/packs/origins/MANIFEST-000967 b/packs/origins/MANIFEST-001070 similarity index 81% rename from packs/origins/MANIFEST-000967 rename to packs/origins/MANIFEST-001070 index 2f1d810437ab58dfb3fa5df751aa4688655a14be..58a569b17d1610d55be96530b0f0287ec35dcfb3 100644 GIT binary patch delta 25 hcmbQoIFE5ckC1=JRAp`kMyB-~oD9qxI9N6?0svX91_l5C delta 25 hcmbQoIFE5ckC2T)-92swMy3<&oD9q-*;zI)0svs*2BQD~ diff --git a/packs/potions-alchimie/000968.log b/packs/potions-alchimie/001071.log similarity index 100% rename from packs/potions-alchimie/000968.log rename to packs/potions-alchimie/001071.log diff --git a/packs/potions-alchimie/CURRENT b/packs/potions-alchimie/CURRENT index 0165034..210222d 100644 --- a/packs/potions-alchimie/CURRENT +++ b/packs/potions-alchimie/CURRENT @@ -1 +1 @@ -MANIFEST-000967 +MANIFEST-001070 diff --git a/packs/potions-alchimie/LOG b/packs/potions-alchimie/LOG index 9aaab5b..d47c26b 100644 --- a/packs/potions-alchimie/LOG +++ b/packs/potions-alchimie/LOG @@ -1,3 +1,3 @@ -2026/01/13-08:07:30.270517 7fad363fd6c0 Recovering log #965 -2026/01/13-08:07:30.282336 7fad363fd6c0 Delete type=3 #963 -2026/01/13-08:07:30.282475 7fad363fd6c0 Delete type=0 #965 +2026/02/28-17:23:52.947009 7f56f93fe6c0 Recovering log #1068 +2026/02/28-17:23:52.956752 7f56f93fe6c0 Delete type=3 #1066 +2026/02/28-17:23:52.956816 7f56f93fe6c0 Delete type=0 #1068 diff --git a/packs/potions-alchimie/LOG.old b/packs/potions-alchimie/LOG.old index 6208e1c..4b92591 100644 --- a/packs/potions-alchimie/LOG.old +++ b/packs/potions-alchimie/LOG.old @@ -1,8 +1,8 @@ -2026/01/13-00:31:14.421946 7fad35bfc6c0 Recovering log #961 -2026/01/13-00:31:14.431615 7fad35bfc6c0 Delete type=3 #959 -2026/01/13-00:31:14.431688 7fad35bfc6c0 Delete type=0 #961 -2026/01/13-00:33:18.131253 7fad353fb6c0 Level-0 table #966: started -2026/01/13-00:33:18.131283 7fad353fb6c0 Level-0 table #966: 0 bytes OK -2026/01/13-00:33:18.137434 7fad353fb6c0 Delete type=0 #964 -2026/01/13-00:33:18.137604 7fad353fb6c0 Manual compaction at level-0 from '!items!0a8UFoCOd3D35WBb' @ 72057594037927935 : 1 .. '!items!y9NHZCxKXMZEqcRo' @ 0 : 0; will stop at (end) -2026/01/13-00:33:18.137633 7fad353fb6c0 Manual compaction at level-1 from '!items!0a8UFoCOd3D35WBb' @ 72057594037927935 : 1 .. '!items!y9NHZCxKXMZEqcRo' @ 0 : 0; will stop at (end) +2026/02/28-16:33:30.732884 7f56f9bff6c0 Recovering log #1064 +2026/02/28-16:33:30.743613 7f56f9bff6c0 Delete type=3 #1062 +2026/02/28-16:33:30.743678 7f56f9bff6c0 Delete type=0 #1064 +2026/02/28-17:23:47.190627 7f54e37ef6c0 Level-0 table #1069: started +2026/02/28-17:23:47.190673 7f54e37ef6c0 Level-0 table #1069: 0 bytes OK +2026/02/28-17:23:47.196754 7f54e37ef6c0 Delete type=0 #1067 +2026/02/28-17:23:47.196895 7f54e37ef6c0 Manual compaction at level-0 from '!items!0a8UFoCOd3D35WBb' @ 72057594037927935 : 1 .. '!items!y9NHZCxKXMZEqcRo' @ 0 : 0; will stop at (end) +2026/02/28-17:23:47.196926 7f54e37ef6c0 Manual compaction at level-1 from '!items!0a8UFoCOd3D35WBb' @ 72057594037927935 : 1 .. '!items!y9NHZCxKXMZEqcRo' @ 0 : 0; will stop at (end) diff --git a/packs/potions-alchimie/MANIFEST-000967 b/packs/potions-alchimie/MANIFEST-001070 similarity index 81% rename from packs/potions-alchimie/MANIFEST-000967 rename to packs/potions-alchimie/MANIFEST-001070 index d1528ab69e7e18c85a8a15e879b0dadfcb37db2b..9771d80f43a587865707645b0425c8958848e39a 100644 GIT binary patch delta 25 hcmbQsIG1rkw~)_Q?xoxej7;k}I2o8XaImak0svyu29f{( delta 25 hcmbQsIG1rkw~)Qy<0x(hMy3<&oD9q-*;!UF0RUY}23`OF diff --git a/packs/races/000968.log b/packs/races/001071.log similarity index 100% rename from packs/races/000968.log rename to packs/races/001071.log diff --git a/packs/races/CURRENT b/packs/races/CURRENT index 0165034..210222d 100644 --- a/packs/races/CURRENT +++ b/packs/races/CURRENT @@ -1 +1 @@ -MANIFEST-000967 +MANIFEST-001070 diff --git a/packs/races/LOG b/packs/races/LOG index 4ff7b7c..54c3d90 100644 --- a/packs/races/LOG +++ b/packs/races/LOG @@ -1,3 +1,3 @@ -2026/01/13-08:07:30.127058 7fad363fd6c0 Recovering log #965 -2026/01/13-08:07:30.137403 7fad363fd6c0 Delete type=3 #963 -2026/01/13-08:07:30.137554 7fad363fd6c0 Delete type=0 #965 +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 diff --git a/packs/races/LOG.old b/packs/races/LOG.old index 415364e..27f9a2c 100644 --- a/packs/races/LOG.old +++ b/packs/races/LOG.old @@ -1,8 +1,8 @@ -2026/01/13-00:31:14.298047 7fad363fd6c0 Recovering log #961 -2026/01/13-00:31:14.308541 7fad363fd6c0 Delete type=3 #959 -2026/01/13-00:31:14.308602 7fad363fd6c0 Delete type=0 #961 -2026/01/13-00:33:18.057541 7fad353fb6c0 Level-0 table #966: started -2026/01/13-00:33:18.057568 7fad353fb6c0 Level-0 table #966: 0 bytes OK -2026/01/13-00:33:18.063555 7fad353fb6c0 Delete type=0 #964 -2026/01/13-00:33:18.083331 7fad353fb6c0 Manual compaction at level-0 from '!items!3oOvUd7AIqrXzLDl' @ 72057594037927935 : 1 .. '!items!oWexVALVtDXmedMy' @ 0 : 0; will stop at (end) -2026/01/13-00:33:18.083392 7fad353fb6c0 Manual compaction at level-1 from '!items!3oOvUd7AIqrXzLDl' @ 72057594037927935 : 1 .. '!items!oWexVALVtDXmedMy' @ 0 : 0; will stop at (end) +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) diff --git a/packs/races/MANIFEST-000967 b/packs/races/MANIFEST-001070 similarity index 82% rename from packs/races/MANIFEST-000967 rename to packs/races/MANIFEST-001070 index d63336a42ca01ac16e98d59745d4eaf530a9b2fb..b20eed67d524058919767872c0a7c8dae648a2d8 100644 GIT binary patch delta 24 gcmbQkIEQgUx8V8%T<5qL7@5{{a56A&;9zk80AT(GdH?_b delta 24 gcmbQkIEQgUx8S+O8~<`KFfyHB=VV|$$c0B+I;f&c&j diff --git a/packs/spells/000968.log b/packs/spells/001071.log similarity index 100% rename from packs/spells/000968.log rename to packs/spells/001071.log diff --git a/packs/spells/CURRENT b/packs/spells/CURRENT index 0165034..210222d 100644 --- a/packs/spells/CURRENT +++ b/packs/spells/CURRENT @@ -1 +1 @@ -MANIFEST-000967 +MANIFEST-001070 diff --git a/packs/spells/LOG b/packs/spells/LOG index f95d1bd..6342eb5 100644 --- a/packs/spells/LOG +++ b/packs/spells/LOG @@ -1,3 +1,3 @@ -2026/01/13-08:07:30.228081 7fad373ff6c0 Recovering log #965 -2026/01/13-08:07:30.240063 7fad373ff6c0 Delete type=3 #963 -2026/01/13-08:07:30.240242 7fad373ff6c0 Delete type=0 #965 +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 diff --git a/packs/spells/LOG.old b/packs/spells/LOG.old index fa19829..207b04f 100644 --- a/packs/spells/LOG.old +++ b/packs/spells/LOG.old @@ -1,8 +1,8 @@ -2026/01/13-00:31:14.386295 7fad35bfc6c0 Recovering log #961 -2026/01/13-00:31:14.396283 7fad35bfc6c0 Delete type=3 #959 -2026/01/13-00:31:14.396332 7fad35bfc6c0 Delete type=0 #961 -2026/01/13-00:33:18.111010 7fad353fb6c0 Level-0 table #966: started -2026/01/13-00:33:18.111042 7fad353fb6c0 Level-0 table #966: 0 bytes OK -2026/01/13-00:33:18.117293 7fad353fb6c0 Delete type=0 #964 -2026/01/13-00:33:18.137565 7fad353fb6c0 Manual compaction at level-0 from '!items!2svd3uio8Hp4e5Wy' @ 72057594037927935 : 1 .. '!items!zq5h9kCpo8gK4oIH' @ 0 : 0; will stop at (end) -2026/01/13-00:33:18.137612 7fad353fb6c0 Manual compaction at level-1 from '!items!2svd3uio8Hp4e5Wy' @ 72057594037927935 : 1 .. '!items!zq5h9kCpo8gK4oIH' @ 0 : 0; will stop at (end) +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) diff --git a/packs/spells/MANIFEST-000967 b/packs/spells/MANIFEST-001070 similarity index 82% rename from packs/spells/MANIFEST-000967 rename to packs/spells/MANIFEST-001070 index d0a3be125c6242ae2f43e0934188e855906819ab..a3e47530bbd4f743473bef7b3730863bea2466aa 100644 GIT binary patch delta 24 gcmbQkIEQgUx1bT@vGrUGj7;k}I2o8XaIh!<09Eq^y8r+H delta 24 fcmbQkIEQgUw_tEut^yYWBhv|XP6p?{fZQl$ln diff --git a/packs/vehicleweapons/000875.log b/packs/vehicleweapons/000978.log similarity index 100% rename from packs/vehicleweapons/000875.log rename to packs/vehicleweapons/000978.log diff --git a/packs/vehicleweapons/CURRENT b/packs/vehicleweapons/CURRENT index 7299140..760f0f8 100644 --- a/packs/vehicleweapons/CURRENT +++ b/packs/vehicleweapons/CURRENT @@ -1 +1 @@ -MANIFEST-000874 +MANIFEST-000977 diff --git a/packs/vehicleweapons/LOG b/packs/vehicleweapons/LOG index fe9da81..df10a5d 100644 --- a/packs/vehicleweapons/LOG +++ b/packs/vehicleweapons/LOG @@ -1,3 +1,3 @@ -2026/01/13-08:07:30.185715 7fad35bfc6c0 Recovering log #872 -2026/01/13-08:07:30.196559 7fad35bfc6c0 Delete type=3 #870 -2026/01/13-08:07:30.196735 7fad35bfc6c0 Delete type=0 #872 +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 diff --git a/packs/vehicleweapons/LOG.old b/packs/vehicleweapons/LOG.old index 9ac75ab..bed2d51 100644 --- a/packs/vehicleweapons/LOG.old +++ b/packs/vehicleweapons/LOG.old @@ -1,8 +1,8 @@ -2026/01/13-00:31:14.348450 7fad373ff6c0 Recovering log #868 -2026/01/13-00:31:14.358522 7fad373ff6c0 Delete type=3 #866 -2026/01/13-00:31:14.358579 7fad373ff6c0 Delete type=0 #868 -2026/01/13-00:33:18.083482 7fad353fb6c0 Level-0 table #873: started -2026/01/13-00:33:18.083514 7fad353fb6c0 Level-0 table #873: 0 bytes OK -2026/01/13-00:33:18.089996 7fad353fb6c0 Delete type=0 #871 -2026/01/13-00:33:18.110837 7fad353fb6c0 Manual compaction at level-0 from '!items!2cqkViQnOYZ4qwU1' @ 72057594037927935 : 1 .. '!items!qcCZxbaV9sucG1XK' @ 0 : 0; will stop at (end) -2026/01/13-00:33:18.110897 7fad353fb6c0 Manual compaction at level-1 from '!items!2cqkViQnOYZ4qwU1' @ 72057594037927935 : 1 .. '!items!qcCZxbaV9sucG1XK' @ 0 : 0; will stop at (end) +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) diff --git a/packs/vehicleweapons/MANIFEST-000874 b/packs/vehicleweapons/MANIFEST-000977 similarity index 82% rename from packs/vehicleweapons/MANIFEST-000874 rename to packs/vehicleweapons/MANIFEST-000977 index fce7286c8143d7598da64c1a7d878640ab7dc401..686c2b72faf9fb96168f55a65938c0ca8b059532 100644 GIT binary patch delta 24 gcmbQkIEQgUx8Uv>3^7~`j7*o8_0sw4p2T1?` delta 25 hcmbQoIFE5ck5JY86QSG;j7%TdI2o8fv9T;?0sw1&2U!3B diff --git a/styles/components/actor.less b/styles/components/actor.less index af72f5e..b2180b8 100644 --- a/styles/components/actor.less +++ b/styles/components/actor.less @@ -14,12 +14,13 @@ background-size: 190px 115px; } - form { + .bol-actor-form { .sidebar { padding-top: 115px; min-width: 250px; width: 250px; max-width: 250px; + overflow: hidden; .profile-img { cursor: pointer; @@ -31,6 +32,12 @@ max-width: calc(250px - 10px); margin-right: 10px; } + + .items-list { + width: calc(250px - 10px); + max-width: calc(250px - 10px); + margin-right: 10px; + } } .main { @@ -42,33 +49,50 @@ &.vigor { background-image: url("/systems/bol/ui/attributes/vigor.webp"); background-repeat: no-repeat; - background-position: center center; - background-size: 64px 64px; + background-position: center 40%; + background-size: 100px 100px; } &.agility { background-image: url("/systems/bol/ui/attributes/agility.webp"); background-repeat: no-repeat; - background-position: center center; - background-size: 64px 64px; + background-position: center 40%; + background-size: 100px 100px; } &.mind { background-image: url("/systems/bol/ui/attributes/mind.webp"); background-repeat: no-repeat; - background-position: center center; - background-size: 64px 64px; + background-position: center 40%; + background-size: 100px 100px; } &.appeal { background-image: url("/systems/bol/ui/attributes/appeal.webp"); background-repeat: no-repeat; - background-position: center center; - background-size: 64px 64px; + background-position: center 40%; + background-size: 100px 100px; } .stat-value { - margin-top: -10px; + margin-top: -18px; + &.rounded { + background: transparent; + border: none; + box-shadow: none; + text-align: center; + line-height: 4rem; + } + } + } + + .aptitude { + .stat-value { + &.rounded-border { + background: transparent; + text-align: center; + line-height: 4rem; + } } } } @@ -77,6 +101,16 @@ } } + .resources-value { + text-align: center; + color: #4b4a44; + } + + .inc-dec-btns-resource { + color: #8b0000; + &:hover { color: #4b4a44; } + } + .bol-footer { height: 62px; max-height: 62px; @@ -97,7 +131,6 @@ height: 30px; max-height: 30px; min-height: 30px; - background-color: black; } .footer-right { @@ -166,6 +199,7 @@ font-family: "Wolfsbane2Expanded", cursive; font-size: 2rem; font-variant: small-caps; + color: #4b4a44; } .rounded { diff --git a/styles/components/common.less b/styles/components/common.less index f1ba9e5..f5a265b 100644 --- a/styles/components/common.less +++ b/styles/components/common.less @@ -21,7 +21,7 @@ body.system-bol img#logo { overflow-y: hidden; background: transparent; - form { + .bol-actor-form { border: 10px solid transparent; border-image: url("/systems/bol/ui/box-border-large.webp") 36 repeat; border-image-outset: 1; @@ -29,6 +29,8 @@ body.system-bol img#logo { margin: 0; padding: 0; height: 100%; + position: relative; + width: 100%; .sheet-header { background-image: url("/systems/bol/ui/banner.webp"); @@ -56,23 +58,79 @@ body.system-bol img#logo { justify-content: flex-start; align-items: baseline; - .header-field-label { - margin-right: 5px; + .charname, + .itemname { + color: #4b4a44; + font-family: "Wolfsbane2Expanded", cursive; + font-size: 1.65rem; + background-color: #2a2a2a30; + border: 1px solid #4b4a44 !important; + border-radius: 0.5rem; + width: 100%; + margin-bottom: 4px; + } + + .header-field-label { + margin-right: 5px; + font-size: 0.86rem; + } + + .header-field-label.xp-sublabel { + font-size: 0.9rem; + color: #606060; } - .charname, - .itemname, .header-field-value { color: #4b4a44; - font-family: 'Contrail One', cursive; - font-size: 1.5rem; - background-color: #EEE; + font-family: "Wolfsbane2Expanded", cursive; + font-size: 0.9rem; + background-color: #2a2a2a30; + border: 1px solid #4b4a44 !important; + border-radius: 0.5rem; + text-align: center; + } + } + } + + .header-buttons { + align-self: flex-end; + padding-bottom: 10px; + + .post-item { + flex: 0 0 auto; + height: 32px; + width: 32px; + line-height: 30px; + cursor: pointer; + background: rgba(0, 0, 0, 0.1); + border: 1px solid #999; + border-radius: 3px; + + &:hover { + background: rgba(0, 0, 0, 0.2); } } } } + .wrap { + flex: 1; + min-height: 0; + align-items: stretch; + } + + .bol-actor-sidebar { + align-self: flex-start; + } + .main { + display: flex; + flex-direction: column; + flex: 1; + min-height: 0; + height: 100%; + overflow: hidden; + .tabs { flex: 0 0 30px; background-color: black; @@ -93,17 +151,49 @@ body.system-bol img#logo { } .sheet-body { + flex: 1; + min-height: 0; overflow: hidden; .tab { - height: 95%; + height: 100%; border: none; overflow-y: auto; + display: none; + + &.active { + display: block; + } + + &.stats { + hr { + margin-top: 6px; + margin-bottom: 6px; + } + } &.description { .editor, - .editor-content { + .editor-content, + prose-mirror { height: 100%; + color: #191813; + } + prose-mirror .editor-content, + prose-mirror p, + prose-mirror div, + prose-mirror span { + color: #191813 !important; + } + input[type="text"], + input[type="number"] { + background-color: #2a2a2a30; + border: 1px solid #4b4a44 !important; + border-radius: 0.5rem; + color: #4b4a44; + text-align: center; + font-size: 0.95rem; + margin-left: 6px; } } } diff --git a/styles/components/item.less b/styles/components/item.less index c08343c..e891e88 100644 --- a/styles/components/item.less +++ b/styles/components/item.less @@ -6,30 +6,248 @@ min-width: 460px; min-height: 400px; + .window-content { + background: transparent !important; + color: #191813 !important; + padding: 10px; + overflow: hidden; + + // Inner div — mirrors the AppV1
with box-border-large decoration + .bol.sheet.item { + border: 10px solid transparent; + border-image: url("/systems/bol/ui/box-border-large.webp") 36 repeat; + border-image-outset: 1; + background: white !important; + color: #191813 !important; + margin: 0; + padding: 0; + height: 100%; + position: relative; + width: 100%; + display: flex; + flex-direction: column; + + .wrap { + flex: 1; + min-height: 0; + display: flex; + flex-direction: column; + + .main { + flex: 1; + min-height: 0; + display: flex; + flex-direction: column; + + .sheet-body { + flex: 1; + min-height: 0; + overflow: hidden; + + .tab { + display: none; + + &.active { + display: block; + height: 100%; + overflow-y: auto; + } + + &.properties { + padding: 5px 8px; + } + } + } + } + } + } + } + + .window-content .bol.sheet.item .sheet-header { + background-image: url("/systems/bol/ui/banner.webp"); + background-size: 330px 62px; + background-position: 100% -15px; + background-repeat: no-repeat; + height: 115px; + min-height: 115px; + display: flex; + align-items: flex-end; + padding-bottom: 10px; + + img.profile-img { + cursor: pointer; + border: none; + background-color: lightgray; + box-shadow: 5px 5px 5px black; + width: 96px; + height: 96px; + min-width: 96px; + min-height: 96px; + max-width: 96px; + max-height: 96px; + margin-right: 10px; + object-fit: cover; + } + + .header-buttons { + align-self: flex-end; + padding-bottom: 10px; + + .post-item { + color: #4b4a44; + background: rgba(0, 0, 0, 0.1); + border: 1px solid #999; + border-radius: 3px; + height: 32px; + width: 32px; + line-height: 30px; + cursor: pointer; + + &:hover { + color: #191813; + background: rgba(0, 0, 0, 0.2); + } + } + } + } + + .window-content .bol.sheet.item .tabs { + height: 44px; + background-color: black; + display: flex; + flex-shrink: 0; + + a.item { + line-height: 44px; + font-weight: bold; + font-family: "CCMeanwhile", cursive; + color: white; + font-size: 0.9em; + + &.active { + text-decoration: underline; + text-shadow: none; + } + } + } + + .window-content .bol.sheet.item .sheet-body { + .tab.description.active { + color: #191813; + display: block; + overflow: auto; + + .editor, + .editor-content, + .prosemirror, + .prosemirror p, + .prosemirror div, + .prosemirror span, + .prosemirror h1, + .prosemirror h2, + .prosemirror h3, + .prosemirror h4, + .form-group:has(.prosemirror), + .form-group:has(.editor) { + color: #191813 !important; + } + } + + .tab.properties { + label, + .form-group label, + select, + input[type="text"], + input[type="number"] { + color: #191813; + } + } + } + h1 input.itemname { - margin-top: 32px; - min-width: 24rem; + margin-top: 0; + min-width: 26.4rem; font-family: "Wolfsbane2Expanded", cursive; + text-shadow: 3px 3px 5px #333; + } + + // Normalize inputs and selects in item sheets + .window-content .bol.sheet.item { + .form-group { + display: flex; + flex-direction: row; + align-items: center; + margin: 3px 0; + + label { + flex: 0 0 40%; + color: #191813; + font-weight: bold; + } + + input[type="checkbox"] { + flex: 0 0 auto; + width: 16px; + height: 16px; + margin: 0; + position: static; + top: auto; + cursor: pointer; + } + + input[type="text"], + input[type="number"], + select, + .form-fields { + flex: 1; + } + } + + label.checkbox { + display: flex; + flex-direction: row; + align-items: center; + gap: 6px; + color: #191813; + + > input[type="checkbox"] { + position: static; + top: auto; + margin: 0; + flex: 0 0 auto; + } + } + + input[type="text"], + input[type="number"], + input[type="text"]:hover, + input[type="number"]:hover, + input[type="text"]:focus, + input[type="number"]:focus, + select { + color: #191813; + background-color: #f0efe8; + border: 1px solid #999; + border-radius: 2px; + padding: 1px 4px; + } + + select option { + background-color: #f0efe8; + color: #191813; + } } .item-properties { - flex: 0 0 150px; - margin: 5px 5px 5px 0; - padding-right: 5px; - border-right: 1px groove #eeede0; - - .form-group { - margin: 0; - - label { - line-height: 20px; - } - } + margin: 5px 0; + padding-bottom: 5px; + border-bottom: 1px groove #eeede0; .properties-list { list-style: none; margin: 0; padding: 0; + display: block; li { margin: 3px 0; diff --git a/styles/global/chat.less b/styles/global/chat.less index 5c19a4f..5b66bd7 100644 --- a/styles/global/chat.less +++ b/styles/global/chat.less @@ -1,3 +1,165 @@ +/* ----------------------------------------- */ +/* Post Item Chat Card */ +/* ----------------------------------------- */ + +.bol-post-item { + color: #191813; + + .bpi-header { + display: flex; + flex-direction: row; + align-items: flex-start; + gap: 8px; + padding-bottom: 6px; + border-bottom: 2px solid #8b7355; + margin-bottom: 8px; + + .bpi-img { + width: 52px; + height: 52px; + border: 1px outset lightgray; + box-shadow: 2px 2px 3px rgba(0, 0, 0, 0.5); + object-fit: cover; + flex: 0 0 52px; + } + + .bpi-title-block { + flex: 1; + + .bpi-name { + margin: 0 0 2px 0; + font-family: "Wolfsbane2Expanded", cursive; + font-size: 1.1em; + color: #4b4a44; + line-height: 1.2; + border: none; + } + + .bpi-type { + font-family: "IMFellDWPicaSC-Regular", serif; + font-size: 0.8em; + color: #7a7060; + font-style: italic; + } + } + } + + .bpi-stats-row { + display: flex; + flex-direction: row; + flex-wrap: wrap; + gap: 3px 12px; + margin: 4px 0; + padding: 4px 6px; + background: rgba(139, 115, 85, 0.08); + border: 1px solid rgba(139, 115, 85, 0.25); + border-radius: 3px; + + .bpi-stat { + display: flex; + flex-direction: row; + align-items: baseline; + gap: 4px; + + .bpi-sl { + font-family: "IMFellDWPicaSC-Regular", serif; + font-size: 0.72em; + color: #7a7060; + font-style: italic; + } + + .bpi-sv { + font-weight: bold; + font-size: 0.88em; + color: #191813; + } + } + } + + .bpi-tags { + display: flex; + flex-direction: row; + flex-wrap: wrap; + gap: 3px; + margin: 3px 0; + + .bpi-tag { + padding: 1px 7px; + border: 1px solid #8b7355; + border-radius: 10px; + font-size: 0.7em; + color: #4b4a44; + background: rgba(139, 115, 85, 0.12); + font-family: "IMFellDWPicaSC-Regular", serif; + } + + .bpi-tag-magic { + border-color: #6a4a9c; + color: #5a3a8c; + background: rgba(106, 74, 156, 0.1); + } + + .bpi-tag-bonus { + border-color: #2d7a2d; + color: #1a5a1a; + background: rgba(45, 122, 45, 0.1); + } + + .bpi-tag-malus { + border-color: #8b2020; + color: #6a1a1a; + background: rgba(139, 32, 32, 0.1); + } + } + + .bpi-conditions { + margin: 3px 0; + + .bpi-cond-label { + font-family: "IMFellDWPicaSC-Regular", serif; + font-size: 0.75em; + font-style: italic; + color: #7a7060; + } + + .bpi-condition { + display: inline-block; + margin: 1px 2px; + padding: 1px 6px; + border-radius: 3px; + font-size: 0.8em; + } + + .bpi-cond-req { + border: 1px solid #8b2020; + background: rgba(139, 32, 32, 0.08); + color: #6a1a1a; + } + + .bpi-cond-opt { + border: 1px solid #6a7a30; + background: rgba(106, 122, 48, 0.08); + color: #4a5a20; + } + } + + .bpi-description { + margin-top: 7px; + padding-top: 6px; + border-top: 1px dashed #c4a882; + + .bpi-desc-content { + font-size: 0.85em; + color: #191813; + line-height: 1.45; + + p { + margin: 0 0 4px 0; + } + } + } +} + /* ----------------------------------------- */ /* Chat Messages */ /* ----------------------------------------- */ diff --git a/styles/global/item-list.less b/styles/global/item-list.less index 6d08e2f..4f201c0 100644 --- a/styles/global/item-list.less +++ b/styles/global/item-list.less @@ -15,8 +15,15 @@ background-color: lightgray; .item-name { - font-family: "Wolfsbane2Expanded", cursive; - font-size: 1.5em; + font-family: "Wolfsbane2Expanded", cursive !important; + font-size: 1.32em !important; + color: #191813 !important; + } + + .item-field { + font-family: 'Signika', sans-serif !important; + font-size: 0.85em !important; + color: #4b4a44 !important; } } @@ -26,6 +33,8 @@ padding: 3px 0 3px 3px; border-bottom: 1px solid #BBB; align-items: stretch; + color: #4b4a44; + font-size: 0.9em; .item-image { flex: 0 0 30px; @@ -68,6 +77,11 @@ .item-name, .item-field { margin: 0; + color: #333; + font-size: 0.84rem; + font-family: inherit; + display: flex; + align-items: center; } .item-controls-1 { diff --git a/system.json b/system.json index 894bef8..f5d0c6d 100644 --- a/system.json +++ b/system.json @@ -381,7 +381,7 @@ "json" ], "paths": [ - "styles", + "css", "./", "templates", "lang/fr.json" diff --git a/templates/actor/actor-sheet.hbs b/templates/actor/actor-sheet.hbs index b9bb0e2..a7065db 100644 --- a/templates/actor/actor-sheet.hbs +++ b/templates/actor/actor-sheet.hbs @@ -1,4 +1,4 @@ - +
@@ -97,4 +97,4 @@
-
\ No newline at end of file + \ No newline at end of file diff --git a/templates/actor/horde-sheet.hbs b/templates/actor/horde-sheet.hbs index 56c2a80..4501d7d 100644 --- a/templates/actor/horde-sheet.hbs +++ b/templates/actor/horde-sheet.hbs @@ -1,4 +1,4 @@ -
+
@@ -72,4 +72,4 @@
-
\ No newline at end of file + \ No newline at end of file diff --git a/templates/actor/parts/actor-header.hbs b/templates/actor/parts/actor-header.hbs index 213622b..d179dd2 100644 --- a/templates/actor/parts/actor-header.hbs +++ b/templates/actor/parts/actor-header.hbs @@ -2,19 +2,18 @@
-
- +
{{#if (eq charType "player")}}

-
+

-
+

diff --git a/templates/actor/parts/tabs/actor-actions.hbs b/templates/actor/parts/tabs/actor-actions.hbs index 90ff709..49371cb 100644 --- a/templates/actor/parts/tabs/actor-actions.hbs +++ b/templates/actor/parts/tabs/actor-actions.hbs @@ -15,7 +15,7 @@ {{#if ../protection}}
{{item.system.properties.soak.formula}} / {{item.system.properties.soak.value}}
{{/if}} {{#if ../blocking}}
{{item.system.properties.blocking.malus}}
{{/if}} {{#if ../weapon}}{{/if}} {{#if ../ranged}}
{{item.system.properties.range}}
{{else}}
{{/if}} {{#if ../options}}
diff --git a/templates/actor/parts/tabs/actor-biodata.hbs b/templates/actor/parts/tabs/actor-biodata.hbs index 0d8e104..ce52686 100644 --- a/templates/actor/parts/tabs/actor-biodata.hbs +++ b/templates/actor/parts/tabs/actor-biodata.hbs @@ -95,13 +95,9 @@ -{{editor -biography -target='system.details.biography' -button=true -owner=owner -editable=editable -}} + + {{{biography}}} + {{#if (eq charType "player")}}
    @@ -113,7 +109,7 @@ editable=editable
    {{localize "BOL.ui.cost"}}
    {{localize "BOL.ui.value"}}
    - +
    {{#each xplog as |xp idx|}} @@ -162,10 +158,6 @@ editable=editable
-{{editor -notes -target='system.details.notes' -button=true -owner=owner -editable=editable -}} \ No newline at end of file + + {{{notes}}} + \ No newline at end of file diff --git a/templates/actor/parts/tabs/actor-equipment.hbs b/templates/actor/parts/tabs/actor-equipment.hbs index 94249de..08ea0f9 100644 --- a/templates/actor/parts/tabs/actor-equipment.hbs +++ b/templates/actor/parts/tabs/actor-equipment.hbs @@ -1,5 +1,4 @@ - {{#if useBougette}}
    @@ -37,7 +36,7 @@
    {{localize "BOL.ui.qty"}}
    {{localize "BOL.ui.price"}}
    {{localize "BOL.ui.equip"}}
    -
    +
    {{#each weapons as |item id|}}
  1. @@ -90,7 +89,7 @@
    {{localize "BOL.ui.qty"}}
    {{localize "BOL.ui.price"}}
    {{localize "BOL.ui.equip"}}
    -
    +
  2. {{#each protections as |item id|}}
  3. @@ -148,7 +147,7 @@
    {{localize "BOL.ui.qty"}}
    {{localize "BOL.ui.price"}}
    {{localize "BOL.ui.equip"}}
    -
    +
  4. {{#each ammos as |item id|}}
  5. @@ -200,7 +199,7 @@
    {{localize "BOL.ui.qty"}}
    {{localize "BOL.ui.price"}}
    {{localize "BOL.ui.equip"}}
    -
    +
  6. {{#each containers as |item id|}}
  7. @@ -252,7 +251,7 @@
    {{localize "BOL.ui.qty"}}
    {{localize "BOL.ui.price"}}
    {{localize "BOL.ui.equip"}}
    -
    +
  8. {{#each treasure as |item id|}}
  9. @@ -304,7 +303,7 @@
    {{localize "BOL.ui.qty"}}
    {{localize "BOL.ui.price"}}
    {{localize "BOL.ui.equip"}}
    -
    +
  10. {{#each vehicles as |item id|}}
  11. @@ -356,7 +355,7 @@
    {{localize "BOL.ui.qty"}}
    {{localize "BOL.ui.price"}}
    {{localize "BOL.ui.equip"}}
    -
    +
  12. {{#each misc as |item id|}}
  13. diff --git a/templates/actor/vehicle-sheet.hbs b/templates/actor/vehicle-sheet.hbs index 368ea1d..bdcc9c9 100644 --- a/templates/actor/vehicle-sheet.hbs +++ b/templates/actor/vehicle-sheet.hbs @@ -1,4 +1,4 @@ -
    +
    @@ -63,4 +63,4 @@
    -
    \ No newline at end of file +
\ No newline at end of file diff --git a/templates/item/feature-sheet.hbs b/templates/item/feature-sheet.hbs index dfcf9a3..0d8296c 100644 --- a/templates/item/feature-sheet.hbs +++ b/templates/item/feature-sheet.hbs @@ -1,4 +1,4 @@ -
+
{{> "systems/bol/templates/item/parts/item-header.hbs"}} @@ -16,7 +16,7 @@ {{!-- Sheet Body --}}
{{!-- Description Tab --}} -
+
{{#if itemProperties}}
    @@ -27,14 +27,14 @@
{{/if}} - {{editor enrichedDescription target="system.description" button=true editable=isEditable engine="prosemirror"}} + {{formInput systemFields.description enriched=enrichedDescription value=system.description name="system.description" toggled=isEditable}}
{{!-- Properties Tab --}} -
+
{{> "systems/bol/templates/item/parts/properties/feature-properties.hbs"}}
- +
diff --git a/templates/item/item-sheet.hbs b/templates/item/item-sheet.hbs index a371a43..c76fb86 100644 --- a/templates/item/item-sheet.hbs +++ b/templates/item/item-sheet.hbs @@ -1,4 +1,4 @@ -
+
{{> "systems/bol/templates/item/parts/item-header.hbs"}} @@ -16,7 +16,7 @@ {{!-- Sheet Body --}}
{{!-- Description Tab --}} -
+
{{#if itemProperties}}
    @@ -27,14 +27,14 @@
{{/if}} - {{editor enrichedDescription target="system.description" button=true editable=isEditable engine="prosemirror"}} + {{formInput systemFields.description enriched=enrichedDescription value=system.description name="system.description" toggled=isEditable}}
{{!-- Properties Tab --}} -
+
{{> "systems/bol/templates/item/parts/properties/item-properties.hbs"}}
- +
diff --git a/templates/item/post-item.hbs b/templates/item/post-item.hbs index 4429261..3efb41e 100644 --- a/templates/item/post-item.hbs +++ b/templates/item/post-item.hbs @@ -1,8 +1,237 @@ -
-

{{name}}

- {{#if img}} - +
+ + {{!-- Header: image + name + type --}} +
+ {{#if img}} + + {{/if}} +
+

{{name}}

+ + {{#if (eq type "feature")}} + {{localize (concat "BOL.featureSubtypes." system.subtype)}} + {{else}} + {{localize (concat "BOL.itemCategory." system.category)}} + {{#if (and (eq system.category "equipment") system.subtype)}} + — {{localize (concat "BOL.equipmentCategory." system.subtype)}} + {{/if}} + {{/if}} + +
+
+ + {{!-- ======= WEAPON ======= --}} + {{#if (or system.properties.weapon (eq system.subtype "weapon"))}} +
+ {{#if system.properties.damage}} +
+ {{localize "BOL.itemProperty.damage"}} + {{system.properties.damage}}{{#if system.properties.damageAttribute}} + {{localize (concat "BOL.attributes." system.properties.damageAttribute)}}{{/if}}{{#if system.properties.damageModifiers}} {{#if (isPositive system.properties.damageModifiers)}}+{{/if}}{{system.properties.damageModifiers}}{{/if}} +
+ {{/if}} + {{#if system.properties.weaponSize}} +
+ {{localize "BOL.itemProperty.weaponSize"}} + {{localize (concat "BOL.weaponSize." system.properties.weaponSize)}} +
+ {{/if}} + {{#if system.properties.attackModifiers}} +
+ {{localize "BOL.itemProperty.attackModifiers"}} + {{system.properties.attackModifiers}} +
+ {{/if}} + {{#if system.properties.range}} +
+ {{localize "BOL.itemProperty.range"}} + {{system.properties.range}} m +
+ {{/if}} + {{#if system.properties.reload}} +
+ {{localize "BOL.itemProperty.reload"}} + {{system.properties.reload}} +
+ {{/if}} +
+
+ {{#if system.properties.melee}}{{localize "BOL.itemProperty.melee"}}{{/if}} + {{#if system.properties.ranged}}{{localize "BOL.itemProperty.ranged"}}{{/if}} + {{#if system.properties.throwing}}{{localize "BOL.itemProperty.throwing"}}{{/if}} + {{#if (lookup system.properties "2H")}}{{localize "BOL.itemProperty.2H"}}{{/if}} + {{#if system.properties.bashing}}{{localize "BOL.itemProperty.bashing"}}{{/if}} + {{#if system.properties.throwable}}{{localize "BOL.itemProperty.throwable"}}{{/if}} + {{#if system.properties.concealable}}{{localize "BOL.itemProperty.concealable"}}{{/if}} + {{#if system.properties.ignoreshield}}{{localize "BOL.itemProperty.ignoreshield"}}{{/if}} + {{#if system.properties.attackBonusDice}}{{localize "BOL.itemProperty.attackBonusDice"}}{{/if}} + {{#if system.properties.attackMalusDice}}{{localize "BOL.itemProperty.attackMalusDice"}}{{/if}} + {{#if system.properties.magical}}{{localize "BOL.itemProperty.magical"}}{{/if}} +
{{/if}} -

Description :

-

{{{system.description}}}

+ + {{!-- ======= PROTECTION ======= --}} + {{#if system.properties.protection}} +
+ {{#if system.properties.armor}} +
+ {{localize "BOL.itemProperty.armorQuality"}} + {{localize (concat "BOL.armorQuality." system.properties.armorQuality)}} +
+
+ {{localize "BOL.itemProperty.soakFormula"}} + {{system.properties.soak.formula}}{{#if system.properties.soak.value}} ({{system.properties.soak.value}}){{/if}} +
+ {{/if}} + {{#if system.properties.helm}} +
+ {{localize "BOL.itemProperty.soakModifiers"}} + {{system.properties.soak.modifier}} +
+ {{/if}} + {{#if system.properties.shield}} +
+ {{localize "BOL.itemProperty.blockingMalus"}} + {{system.properties.blocking.malus}} +
+ {{/if}} + {{#if system.properties.modifiers.init}} +
+ {{localize "BOL.itemModifiers.init"}} + {{system.properties.modifiers.init}} +
+ {{/if}} + {{#if system.properties.modifiers.agility}} +
+ {{localize "BOL.itemModifiers.agility"}} + {{system.properties.modifiers.agility}} +
+ {{/if}} +
+
+ {{#if system.properties.armor}}{{localize "BOL.itemProperty.armor"}}{{/if}} + {{#if system.properties.shield}}{{localize "BOL.itemProperty.shield"}}{{/if}} + {{#if system.properties.helm}}{{localize "BOL.itemProperty.helm"}}{{/if}} + {{#if system.properties.blocking.blocking1}}{{localize "BOL.itemProperty.blocking1Attack"}}{{/if}} + {{#if system.properties.blocking.blockingAll}}{{localize "BOL.itemProperty.blockingAllAttacks"}}{{/if}} + {{#if system.properties.magical}}{{localize "BOL.itemProperty.magical"}}{{/if}} +
+ {{/if}} + + {{!-- ======= SPELL ======= --}} + {{#if (eq system.category "spell")}} +
+
+ {{localize "BOL.ui.circle"}} + + {{#if (eq system.properties.circle 0)}}{{localize "BOL.spellItem.charm"}}{{/if}} + {{#if (eq system.properties.circle 1)}}{{localize "BOL.spellItem.circle1"}}{{/if}} + {{#if (eq system.properties.circle 2)}}{{localize "BOL.spellItem.circle2"}}{{/if}} + {{#if (eq system.properties.circle 3)}}{{localize "BOL.spellItem.circle3"}}{{/if}} + +
+
+ {{localize "BOL.ui.ppcost"}} + {{system.properties.ppcost}} PP +
+ {{#if system.properties.difficulty}} +
+ {{localize "BOL.ui.difficulty"}} + {{system.properties.difficulty}} +
+ {{/if}} + {{#if system.properties.duration}} +
+ {{localize "BOL.ui.duration"}} + {{system.properties.duration}} +
+ {{/if}} +
+ {{#if system.properties.nbmandatoryconditions}} +
+ {{localize "BOL.ui.mandatoryconditions"}} : + {{#each system.properties.mandatoryconditions as |cond idx|}} + {{#if (lt idx ../system.properties.nbmandatoryconditions)}} + {{#if cond}}{{cond}}{{/if}} + {{/if}} + {{/each}} +
+ {{/if}} + {{#if system.properties.nboptionnalconditions}} +
+ {{localize "BOL.ui.optionnalconditions"}} : + {{#each system.properties.optionnalconditions as |cond idx|}} + {{#if (lt idx ../system.properties.nboptionnalconditions)}} + {{#if cond}}{{cond}}{{/if}} + {{/if}} + {{/each}} +
+ {{/if}} +
+ {{#if system.properties.spellkeep}}{{localize "BOL.ui.spellkeep"}}{{/if}} + {{#if system.properties.concentrate}}{{localize "BOL.ui.concentrate"}}{{/if}} + {{#if system.properties.aggressive}}{{localize "BOL.ui.aggressive"}}{{/if}} +
+ {{/if}} + + {{!-- ======= ALCHEMY ======= --}} + {{#if (eq system.category "alchemy")}} +
+
+ {{localize "BOL.ui.alchemyType"}} + {{localize (concat "BOL.alchemyItem." system.properties.alchemytype)}} +
+
+ {{localize "BOL.ui.pccost"}} + {{system.properties.pccost}} PC +
+ {{#if system.properties.pccurrent}} +
+ {{localize "BOL.ui.pcnow"}} + {{system.properties.pccurrent}} +
+ {{/if}} + {{#if system.properties.difficulty}} +
+ {{localize "BOL.ui.difficulty"}} + {{system.properties.difficulty}} +
+ {{/if}} +
+ {{/if}} + + {{!-- ======= FEATURE ======= --}} + {{#if (eq type "feature")}} + {{#if (eq system.subtype "career")}} +
+
+ {{localize "BOL.ui.rank"}} + {{system.rank}} +
+
+
+ {{#if system.properties.sorcerer}}{{localize "BOL.ui.isSorcerer"}}{{/if}} + {{#if system.properties.alchemist}}{{localize "BOL.ui.isAlchemist"}}{{/if}} + {{#if system.properties.priest}}{{localize "BOL.ui.isPriest"}}{{/if}} + {{#if system.properties.astrologer}}{{localize "BOL.ui.isAstrologer"}}{{/if}} +
+ {{/if}} + {{#if (eq system.subtype "boon")}} +
+ {{#if system.properties.isbonusdice}}{{localize "BOL.ui.isbonusdice"}}{{/if}} +
+ {{/if}} + {{#if (eq system.subtype "flaw")}} +
+ {{#if system.properties.ismalusdice}}{{localize "BOL.ui.ismalusdice"}}{{/if}} +
+ {{/if}} + {{/if}} + + {{!-- ======= DESCRIPTION ======= --}} + {{#if system.description}} +
+
{{{system.description}}}
+
+ {{/if}} +