diff --git a/APPV2_ITEMS_MIGRATION.md b/APPV2_ITEMS_MIGRATION.md
new file mode 100644
index 0000000..c3ffd08
--- /dev/null
+++ b/APPV2_ITEMS_MIGRATION.md
@@ -0,0 +1,286 @@
+# Migration AppV2 - Item Sheets
+
+## Vue d'ensemble
+
+Migration des feuilles d'items de BoL vers l'architecture **ApplicationV2** de Foundry VTT v12+.
+
+## Fichiers créés
+
+### Classes AppV2 (module/applications/sheets/)
+
+1. **base-item-sheet.mjs** - Classe de base pour tous les item sheets
+ - Hérite de `foundry.applications.sheets.ItemSheetV2`
+ - Utilise `HandlebarsApplicationMixin`
+ - Gère les tabs, drag & drop, actions communes
+ - 272 lignes de code
+
+2. **item-sheet.mjs** - Sheet pour le type "item"
+ - Équipements, armes, protections, sorts, etc.
+ - Hérite de `BoLBaseItemSheet`
+ - Contexte spécifique aux items
+
+3. **feature-sheet.mjs** - Sheet pour le type "feature"
+ - Boons, flaws, careers, origins, races, etc.
+ - Hérite de `BoLBaseItemSheet`
+ - Contexte spécifique aux features
+
+4. **_module.mjs** - Export des sheets
+
+### Templates (templates/item/)
+
+1. **item-sheet.hbs** - Template pour les items
+2. **feature-sheet.hbs** - Template pour les features
+3. **parts/item-header.hbs** - Header mis à jour pour AppV2
+
+### Backups
+
+- `templates/item.backup/` - Backup des templates originaux
+- `module/item.backup/` - Backup de l'ancienne classe ItemSheet
+- `templates/item/parts/item-header.hbs.backup` - Backup du header
+
+## Architecture AppV2
+
+### Différences avec AppV1
+
+| Aspect | AppV1 (avant) | AppV2 (après) |
+|--------|---------------|---------------|
+| Classe de base | `ItemSheet` | `ItemSheetV2` |
+| Options | `static get defaultOptions()` | `static DEFAULT_OPTIONS` |
+| getData | `async getData()` | `async _prepareContext()` |
+| Template | Unique | Peut utiliser PARTS |
+| Tabs | Automatiques | Gestion manuelle |
+| Actions | Event listeners | `actions:` dans OPTIONS |
+| Render | `activateListeners()` | `_onRender()` |
+
+### Structure de BoLBaseItemSheet
+
+```javascript
+class BoLBaseItemSheet extends ItemSheetV2 {
+ // Options statiques
+ static DEFAULT_OPTIONS = {
+ classes, position, form, window,
+ actions, dragDrop, tabs
+ }
+
+ // State
+ tabGroups = { primary: "description" }
+
+ // Méthodes principales
+ async _prepareContext() // Prépare les données
+ _onRender() // Après le render
+ _activateTabs() // Active les tabs
+ _activateListeners() // Event listeners
+
+ // Actions
+ static #onEditImage() // data-action="editImage"
+ static #onPostItem() // data-action="postItem"
+
+ // Drag & Drop
+ #createDragDropHandlers()
+ _canDragStart()
+ _onDragStart()
+}
+```
+
+## Fonctionnalités migrées
+
+### ✅ Depuis l'ancien BoLItemSheet
+
+1. **getData** → **_prepareContext**
+ - Enrichissement de la description
+ - Configuration des données dynamiques
+ - Gestion des catégories
+ - Propriétés des items
+ - Careers depuis l'actor
+
+2. **Tabs**
+ - Navigation entre Description et Properties
+ - State persistant avec `tabGroups`
+ - Activation manuelle des tabs
+
+3. **Actions**
+ - Edit Image (FilePicker)
+ - Post Item (chat)
+
+4. **Listeners spécifiques**
+ - Armor quality → soak formula
+
+5. **Dynamic defaults**
+ - Category par défaut
+ - Spell conditions (mandatory/optional)
+ - Equipment slots
+
+## Utilisation dans les templates
+
+### Actions (data-action)
+
+```handlebars
+{{!-- Éditer l'image --}}
+
+
+{{!-- Poster au chat --}}
+
+
+
+```
+
+### Tabs
+
+```handlebars
+{{!-- Navigation --}}
+
+ {{#each tabs}}
+
+ {{localize this.label}}
+
+ {{/each}}
+
+
+{{!-- Contenu --}}
+
+ ...
+
+```
+
+### Editor
+
+```handlebars
+{{!-- AppV2 avec ProseMirror --}}
+{{editor enrichedDescription
+ target="system.description"
+ button=true
+ editable=isEditable
+ engine="prosemirror"}}
+```
+
+## Context disponible dans les templates
+
+```javascript
+{
+ // Document & system
+ fields: schema.fields,
+ systemFields: system.schema.fields,
+ item: document,
+ system: document.system,
+ source: document.toObject(),
+
+ // Content
+ enrichedDescription: "HTML enrichi",
+ category: "equipment|weapon|spell|...",
+ itemProperties: ["prop1", "prop2"],
+
+ // Config
+ config: game.bol.config,
+ isGM: boolean,
+ isEditable: boolean,
+
+ // Tabs
+ tabs: [{id, label, icon}],
+ activeTab: "description|properties",
+
+ // Type-specific (item-sheet.mjs)
+ isItem: true,
+ isEquipment: boolean,
+ isWeapon: boolean,
+ isProtection: boolean,
+ isSpell: boolean,
+
+ // Type-specific (feature-sheet.mjs)
+ isFeature: true,
+ isBoon: boolean,
+ isFlaw: boolean,
+ isCareer: boolean,
+ isOrigin: boolean,
+ isRace: boolean,
+
+ // Optional
+ careers: actor.careers // Si item sur actor
+}
+```
+
+## Configuration dans bol.js
+
+```javascript
+// Import
+import * as sheets from "./applications/sheets/_module.mjs"
+
+// Enregistrement
+foundry.documents.collections.Items.unregisterSheet("core", ...)
+foundry.documents.collections.Items.registerSheet("bol",
+ sheets.BoLItemSheet,
+ { types: ["item"], makeDefault: true }
+)
+foundry.documents.collections.Items.registerSheet("bol",
+ sheets.BoLFeatureSheet,
+ { types: ["feature"], makeDefault: true }
+)
+```
+
+## Avantages de AppV2
+
+1. **Performance** : Meilleur rendu et gestion des updates
+2. **Structure** : Code plus organisé et maintenable
+3. **Actions** : Système d'actions déclaratif
+4. **Context** : Préparation des données séparée du template
+5. **Standard** : Aligné sur Foundry VTT v12+
+6. **Future-proof** : Architecture pérenne
+
+## Points d'attention
+
+### Compatibilité
+
+- Les données restent 100% compatibles
+- Seule l'interface de sheet change
+- Pas de migration de données nécessaire
+
+### Tabs
+
+Les tabs ne sont plus automatiques dans AppV2 :
+- Navigation manuelle avec `_activateTabs()`
+- State persistant avec `tabGroups`
+- CSS `.active` géré manuellement
+
+### Editor
+
+ProseMirror est maintenant le moteur par défaut :
+```handlebars
+{{editor content engine="prosemirror"}}
+```
+
+### Actions
+
+Système déclaratif :
+```javascript
+actions: {
+ myAction: ClassName.#onMyAction
+}
+```
+
+Dans le template :
+```handlebars
+Click
+```
+
+## Prochaines étapes
+
+### Court terme
+1. Tester les sheets dans Foundry
+2. Vérifier toutes les fonctionnalités
+3. Ajuster les CSS si nécessaire
+
+### Moyen terme
+4. Migrer les actor sheets vers AppV2
+5. Ajouter des features AppV2 (parts, etc.)
+6. Optimiser les templates
+
+### Long terme
+7. Utiliser PARTS pour modularité
+8. Ajouter des actions avancées
+9. Améliorer la UX
+
+## Références
+
+- [Foundry AppV2 Documentation](https://foundryvtt.com/api/classes/foundry.applications.api.ApplicationV2.html)
+- [ItemSheetV2 API](https://foundryvtt.com/api/classes/foundry.applications.sheets.ItemSheetV2.html)
+- Exemples : fvtt-cthulhu-eternal, fvtt-mournblade
diff --git a/css/bol.css b/css/bol.css
index e79b61a..6ab3dc9 100644
--- a/css/bol.css
+++ b/css/bol.css
@@ -1,3 +1,7 @@
+/* ========================================= */
+/* BoL System LESS Main File */
+/* ========================================= */
+/* Global Styles */
/* ----------------------------------------- */
/* LOCAL FONTS */
/* ----------------------------------------- */
@@ -8,40 +12,29 @@
font-display: swap;
src: url(https://fonts.gstatic.com/s/contrailone/v10/eLGbP-j_JA-kG0_Zo51noafdZQ.ttf) format('truetype');
}
-
@font-face {
font-family: "CCMeanwhile";
src: url('../fonts/ccmeanwhile-regular.ttf');
}
-
@font-face {
font-family: "Wolfsbane2";
src: url('../fonts/wolfsbane2.ttf');
}
-
@font-face {
font-family: "Wolfsbane2Condensed";
src: url('../fonts/wolfsbane2cond.ttf');
}
-
@font-face {
font-family: "Wolfsbane2Expanded";
src: url('../fonts/wolfsbane2expand.ttf');
}
-
@font-face {
font-family: "IMFellDWPicaSC-Regular";
src: url('../fonts/IMFellDWPicaSC-Regular.ttf');
}
-
/* ----------------------------------------- */
/* TEXT STYLES */
/* ----------------------------------------- */
-/* -------------- */
-/* Font Awesome */
-/* Overrides */
-/* -------------- */
-/* ------------- */
a.entity-link,
a.inline-roll {
border: none;
@@ -49,33 +42,35 @@ a.inline-roll {
border-bottom: 1px dotted grey;
padding: 0;
}
-
a.inline-roll {
border: none;
}
-
a:hover {
text-shadow: 0 0 5px #a00;
}
-
+.ellipsis {
+ text-overflow: ellipsis;
+ overflow: hidden;
+ white-space: nowrap;
+}
+/* ----------------------------------------- */
+/* Foundry VTT Overrides */
+/* ----------------------------------------- */
#pause {
background: none;
}
-
-#pause>img {
+#pause > img {
width: 200px;
height: 200px;
top: -50px;
left: calc(50% - 100px);
opacity: 0.7;
}
-
#pause h3 {
font-family: "IMFellDWPicaSC-Regular", serif;
font-size: 32px;
text-shadow: 0px 3px 5px #000000;
}
-
::-webkit-scrollbar-thumb {
outline: none;
border-radius: 3px;
@@ -83,17 +78,14 @@ a:hover {
border: 1px solid #333 !important;
border-color: #333 !important;
}
-
::-webkit-scrollbar-track {
box-shadow: 0 0 3px #005d67 inset !important;
border-radius: 3px;
}
-
* {
scrollbar-width: thin !important;
scrollbar-color: #005d67 #ccc !important;
}
-
.element-invisible {
position: absolute;
width: 1px;
@@ -104,135 +96,92 @@ a:hover {
clip: rect(0 0 0 0);
overflow: hidden;
}
-
.roll-box {
border-width: 1px;
border-color: #000000;
margin-bottom: 2px;
}
-
.hide {
display: none;
}
-
ul.no-bullets {
list-style-type: none;
- /* Remove bullets */
padding: 0;
- /* Remove padding */
margin: 0;
- /* Remove margins */
}
-
-.ellipsis {
- text-overflow: ellipsis;
- overflow: hidden;
- white-space: nowrap;
-}
-
.nomargin {
margin: 0;
padding: 0;
}
-
+/* ----------------------------------------- */
+/* Flexbox Utilities */
+/* ----------------------------------------- */
.flxrow {
display: flex;
flex-direction: row;
flex-wrap: wrap;
justify-content: flex-start;
}
-
-.flxrow>* {
+.flxrow > * {
flex: 1;
}
-
.flxrow .flex1 {
flex: 1;
}
-
.flxrow .flex2 {
flex: 2;
}
-
.flxrow .flex3 {
flex: 3;
}
-
.flxrow .flex4 {
flex: 4;
}
-
-/* ----------------------------------------- */
-/* Flexbox */
-/* ----------------------------------------- */
.flexrow {
display: flex;
flex-flow: row wrap;
justify-content: flex-start;
+ /* Wrong in v13: > * { flex: 1; } */
}
-
-/* Wrong in v13.flexrow > * {
- flex: 1;
-} */
.flexrow .flex1 {
flex: 1;
}
-
.flexrow .flex2 {
flex: 2;
}
-
.flexrow .flex3 {
flex: 3;
}
-
.flexrow .flex4 {
flex: 4;
}
-
.flexrow .flex5 {
flex: 5;
}
-
.flexrow .flex6 {
flex: 6;
}
-
.flexrow .flex7 {
flex: 7;
}
-
.flexrow .flex8 {
flex: 8;
}
-
.flexrow .flex9 {
flex: 9;
}
-
-/*.flexcol {
- display: flex;
- flex-flow: column nowrap;
-}
-.flexcol > * {
- flex: 1;
-}*/
.flexcol .flex1 {
flex: 1;
}
-
.flexcol .flex2 {
flex: 2;
}
-
.flexcol .flex3 {
flex: 3;
}
-
.flexcol .flex4 {
flex: 4;
}
-
.flex-group-center,
.flex-group-left,
.flex-group-right {
@@ -241,62 +190,46 @@ ul.no-bullets {
text-align: center;
padding: 5px;
}
-
.flex-group-left {
justify-content: flex-start;
text-align: left;
}
-
.flex-group-right {
justify-content: flex-end;
text-align: right;
}
-
.center {
text-align: center;
display: flex;
justify-content: center;
align-items: center;
}
-
.left {
text-align: left;
display: flex;
align-items: center;
justify-content: flex-start;
}
-
.right {
justify-content: flex-end;
text-align: right;
display: flex;
align-items: center;
}
-
.flex-center {
align-items: center;
justify-content: center;
text-align: center;
}
-
.flex-between {
justify-content: space-between;
}
-
.no-wrap {
flex-wrap: nowrap !important;
}
-
-.bol {
- /*
- Copied from dnd5e
- */
- /* Form Groups */
- /*
- Placeholders
- */
-}
-
+/* ----------------------------------------- */
+/* Form Styles */
+/* ----------------------------------------- */
.bol input[readonly="true"] {
border: none;
color: dimgray;
@@ -305,7 +238,6 @@ ul.no-bullets {
vertical-align: middle;
background: transparent;
}
-
.bol input[type="text"],
.bol input[type="number"],
.bol input[type="text"]:hover,
@@ -316,7 +248,6 @@ ul.no-bullets {
border: none;
box-shadow: none;
}
-
.bol input:disabled:hover,
.bol select:disabled:hover,
.bol textarea:disabled:hover,
@@ -327,15 +258,9 @@ ul.no-bullets {
border: 1px solid transparent !important;
outline: none !important;
}
-
.bol button {
background: rgba(0, 0, 0, 0.1);
}
-
-.chat-button {
- font-size: 0.8rem;
-}
-
.bol select {
box-shadow: none;
font-size: 14px;
@@ -346,25 +271,21 @@ ul.no-bullets {
border: none;
border-radius: 0;
}
-
.bol select[multiple] {
box-shadow: none;
border: none;
font-size: 14px;
}
-
.bol select[multiple]:focus option:checked {
background: darkred linear-gradient(0deg, darkred 0%, darkred 100%);
color: white;
}
-
.bol option {
font-size: 14px;
text-overflow: ellipsis;
overflow: hidden;
white-space: nowrap;
}
-
.bol option:hover,
.bol option:focus,
.bol option:active,
@@ -374,7 +295,6 @@ ul.no-bullets {
background: darkred linear-gradient(0deg, darkred 0%, darkred 100%);
color: white;
}
-
.bol label.checkbox {
flex: auto;
padding: 0;
@@ -383,80 +303,64 @@ ul.no-bullets {
line-height: 22px;
font-size: 11px;
}
-
-.bol label.checkbox>input[type="checkbox"] {
+.bol label.checkbox > input[type="checkbox"] {
width: 16px;
height: 16px;
margin: 0 2px 0 0;
position: relative;
top: 4px;
}
-
-.bol label.checkbox.right>input[type="checkbox"] {
+.bol label.checkbox.right > input[type="checkbox"] {
margin: 0 0 0 2px;
}
-
.bol .form-group label {
flex: 2;
font-weight: bold;
}
-
.bol .form-group .form-fields {
display: flex;
flex-direction: row;
flex-wrap: wrap;
justify-content: flex-start;
}
-
-.bol .form-group .form-fields>* {
+.bol .form-group .form-fields > * {
flex: 1;
margin: 0 3px 0 0;
}
-
-.bol .form-group .form-fields>*:last-child {
+.bol .form-group .form-fields > *:last-child {
margin-right: 0;
}
-
-.bol .form-group .form-fields>* .flex1 {
+.bol .form-group .form-fields > * .flex1 {
flex: 1;
}
-
-.bol .form-group .form-fields>* .flex2 {
+.bol .form-group .form-fields > * .flex2 {
flex: 2;
}
-
-.bol .form-group .form-fields>* .flex3 {
+.bol .form-group .form-fields > * .flex3 {
flex: 3;
}
-
-.bol .form-group .form-fields>* .flex4 {
+.bol .form-group .form-fields > * .flex4 {
flex: 4;
}
-
.bol .form-group .form-fields label {
flex: 0 0 100%;
margin: 0;
}
-
.bol .form-group .form-fields label.checkbox {
flex: auto;
text-align: left;
}
-
.bol .form-group .form-fields .field-value {
text-align: center;
}
-
.bol .form-group.stacked label {
flex: 0 0 100%;
margin: 0;
}
-
.bol .form-group.stacked label.checkbox {
flex: auto;
text-align: left;
}
-
.bol .form-header {
margin: 0.25em 0 0.25em 0;
padding: 2px 5px;
@@ -464,24 +368,20 @@ ul.no-bullets {
color: #4b4a44;
background-color: lightgray;
}
-
.bol h1.form-header {
font-size: 2.2em;
font-weight: 700;
}
-
.bol h2.form-header {
font-size: 1.8em;
font-weight: 500;
border-bottom: 1px groove #eeede0;
}
-
.bol h3.form-header {
font-size: 1.2em;
font-weight: 500;
border-bottom: 1px groove #eeede0;
}
-
.bol h4.form-header {
font-size: 1em;
font-weight: 500;
@@ -491,7 +391,6 @@ ul.no-bullets {
border-top: none;
border-bottom: 1px groove #eeede0;
}
-
.bol .tag {
display: inline-block;
margin: 0 2px 0 0;
@@ -502,61 +401,50 @@ ul.no-bullets {
border-radius: 3px;
background: rgba(0, 0, 0, 0.05);
}
-
.bol ::placeholder {
- /* Chrome, Firefox, Opera, Safari 10.1+ */
color: lightgray;
opacity: 1;
- /* Firefox */
}
-
.bol :-ms-input-placeholder {
- /* Internet Explorer 10-11 */
color: lightgray;
}
-
.bol ::-ms-input-placeholder {
- /* Microsoft Edge */
color: lightgray;
}
-
.bol input::placeholder {
color: lightgray;
}
-
.bol .property {
margin-top: 2px;
}
-
.bol .inc-dec-btns {
color: #4b4a44;
}
-
+.chat-button {
+ font-size: 0.8rem;
+}
.summmary-number {
padding-left: 4rem;
}
-
-/* Items List */
+/* ----------------------------------------- */
+/* Items List */
+/* ----------------------------------------- */
.items-list {
list-style: none;
margin: 7px 0;
padding: 0;
overflow-y: hidden;
- /*overflow-y: auto;*/
}
-
.items-list .item-header {
font-family: 'Signika', sans-serif;
font-size: 1em;
color: #4b4a44;
background-color: lightgray;
}
-
.items-list .item-header .item-name {
font-family: "Wolfsbane2Expanded", cursive;
font-size: 1.5em;
}
-
.items-list .item {
min-height: 30px;
line-height: 24px;
@@ -564,7 +452,6 @@ ul.no-bullets {
border-bottom: 1px solid #BBB;
align-items: stretch;
}
-
.items-list .item .item-image {
flex: 0 0 30px;
padding: 0;
@@ -574,7 +461,6 @@ ul.no-bullets {
min-height: 30px;
min-width: 30px;
}
-
.items-list .item .item-image img {
padding: 0;
margin: 0;
@@ -584,7 +470,6 @@ ul.no-bullets {
min-height: 30px;
min-width: 30px;
}
-
.items-list .item .item-image.roll-weapon,
.items-list .item .item-image.roll-career {
background-color: transparent;
@@ -594,204 +479,164 @@ ul.no-bullets {
background-position: center;
cursor: pointer;
}
-
.items-list .item .item-image.roll-weapon:hover,
.items-list .item .item-image.roll-career:hover {
background-color: gray;
}
-
.items-list .item .item-image.roll-weapon:hover img,
.items-list .item .item-image.roll-career:hover img {
visibility: hidden;
}
-
.items-list .item .item-name,
.items-list .item .item-field {
margin: 0;
}
-
.items-list .item .item-controls-1 {
flex: 0 0 18px;
}
-
.items-list .item .item-controls,
.items-list .item .item-controls-2 {
flex: 0 0 36px;
}
-
.items-list .item .item-controls-3 {
flex: 0 0 54px;
}
-
.items-list .item .item-control {
color: #4b4a44;
}
-
.items-list .item-name-fixed-medium {
min-width: 8rem;
width: 8rem;
}
-
.items-list .item-field-fixed-short {
max-width: 3rem;
min-width: 3rem;
width: 3rem;
}
-
.bougette-dice-img {
- color: rgba(150, 44, 44, 0.70);
+ color: rgba(150, 44, 44, 0.7);
}
-
/* ----------------------------------------- */
-/* Premade colors */
+/* Premade Colors */
/* ----------------------------------------- */
.light {
color: lightgray;
}
-
.bg-light {
background: lightgray;
}
-
.darkgray {
color: #23221d;
}
-
.bg-darkgray {
background: #23221d;
color: #fff;
}
-
.darkbrown {
color: #464331c4;
}
-
.bg-darkbrown {
background: #464331c4;
color: #fff;
}
-
.darkslate {
color: darkslategray;
}
-
.bg-darkslate {
background: darkslategray;
color: #fff;
}
-
.darkgreen {
color: #003c1e;
}
-
.bg-darkgreen {
background: #003c1e;
color: #fff;
}
-
.darkblue {
color: midnightblue;
}
-
.bg-darkblue {
background: midnightblue;
color: #fff;
}
-
.blue {
color: #009ee0;
}
-
.bg-blue {
background: #009ee0;
color: #fff;
}
-
.green {
color: #44a12b;
}
-
.bg-green {
background: #44a12b;
color: #fff;
}
-
.black {
color: #000;
}
-
.bg-black {
background: #000;
color: #fff;
}
-
.red {
color: #cd071e;
}
-
.bg-red {
background: #cd071e;
color: #fff;
}
-
.darkred {
color: darkred;
}
-
.bg-darkred {
background: darkred;
color: #fff;
}
-
.purple {
color: purple;
}
-
.bg-purple {
background: purple;
color: #fff;
}
-
+/* ----------------------------------------- */
+/* Chat Messages */
+/* ----------------------------------------- */
.message-header h2.damage {
color: orangered;
font-weight: bold;
}
-
.message-header h2.critical {
color: green;
font-weight: bold;
}
-
.message-header h2.fumble {
color: red;
font-weight: bold;
}
-
.message-header h2.success {
color: darkgreen;
font-weight: bold;
}
-
.message-header h2.failure {
color: darkred;
font-weight: bold;
}
-
-h2.good {
- color: darkgreen;
- font-weight: bold;
-}
-
-h2.bad {
- color: darkred;
- font-weight: bold;
-}
-
.message-header h2.roll {
color: darkslategrey;
font-weight: bold;
}
-
+h2.good {
+ color: darkgreen;
+ font-weight: bold;
+}
+h2.bad {
+ color: darkred;
+ font-weight: bold;
+}
.chat-message {
margin: 3px;
padding: 10px;
@@ -802,53 +647,51 @@ h2.bad {
background-repeat: no-repeat;
background-size: 100% 100%;
}
-
.chat-message .message-header .flavor-text {
font-family: "IMFellDWPicaSC-Regular", serif;
font-size: 14px;
}
-
.chat-message .message-header .flavor-text h2 {
font-family: "Modesto Condensed", "Palatino Linotype", serif;
font-size: 20px;
}
-
.chat-message .message-content .dice-roll .dice-result .dice-formula {
border-radius: 0px;
border: 1px inset lightgray;
background-color: #282828;
color: white;
}
-
.chat-message .message-content .dice-roll .dice-result .dice-tooltip .tooltip-part .part-total {
border-radius: 0px;
border: 1px inset lightgray;
background-color: #2a2a2a;
color: white;
}
-
.chat-message .message-content .dice-roll .dice-result .dice-total {
border-radius: 0px;
border: 1px inset lightgray;
background-color: #2a2a2a;
color: white;
}
-
+/* Component Styles */
+/* ----------------------------------------- */
+/* Common Sheet Styles */
+/* ----------------------------------------- */
body.system-bol img#logo {
content: url("/systems/bol/ui/logo2.webp");
}
-
+.journal-page-content {
+ /* Reserved for future use */
+}
.bol.sheet .window-header {
border: none;
}
-
.bol.sheet .window-content {
height: 100%;
padding: 10px;
overflow-y: hidden;
background: transparent;
}
-
.bol.sheet .window-content form {
border: 10px solid transparent;
border-image: url("/systems/bol/ui/box-border-large.webp") 36 repeat;
@@ -858,7 +701,6 @@ body.system-bol img#logo {
padding: 0;
height: 100%;
}
-
.bol.sheet .window-content form .sheet-header {
background-image: url("/systems/bol/ui/banner.webp");
background-repeat: no-repeat;
@@ -876,7 +718,6 @@ body.system-bol img#logo {
align-items: flex-end;
padding-bottom: 10px;
}
-
.bol.sheet .window-content form .sheet-header .header-field .header-field-group {
overflow: hidden;
display: flex;
@@ -885,11 +726,9 @@ 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 {
@@ -898,16 +737,10 @@ body.system-bol img#logo {
font-size: 1.5rem;
background-color: #EEE;
}
-
-.bol.sheet .window-content form .main {
- /* Sheet Tabs */
-}
-
.bol.sheet .window-content form .main .tabs {
flex: 0 0 30px;
background-color: black;
}
-
.bol.sheet .window-content form .main .tabs .item {
line-height: 30px;
font-weight: bold;
@@ -916,62 +749,22 @@ body.system-bol img#logo {
padding-top: 4px;
font-size: 0.8em;
}
-
.bol.sheet .window-content form .main .tabs .item.active {
text-decoration: underline;
text-shadow: none;
}
-
.bol.sheet .window-content form .main .sheet-body {
overflow: hidden;
}
-
.bol.sheet .window-content form .main .sheet-body .tab {
height: 95%;
border: none;
overflow-y: auto;
- /* Items List */
}
-
.bol.sheet .window-content form .main .sheet-body .tab.description .editor,
.bol.sheet .window-content form .main .sheet-body .tab.description .editor-content {
height: 100%;
}
-
-.bol.sheet.actor {
- min-width: 820px;
- min-height: 700px;
- height: 700px;
-}
-
-.bol.sheet.actor .window-content .bol-actor-form {
- background-image: url("/systems/bol/ui/logo.webp");
- background-repeat: no-repeat;
- background-size: 190px 115px;
-}
-
-.bol.sheet.actor .window-content form .sidebar {
- padding-top: 115px;
- min-width: 250px;
- width: 250px;
- max-width: 250px;
-}
-
-.journal-page-content {
- /*color: rgba(0, 0, 0, 0.95);*/
-}
-
-.bol.sheet.actor .window-content form .sidebar .profile-img {
- cursor: pointer;
- border: none;
- background-color: #EEE;
- height: auto;
- width: calc(250px - 10px);
- min-width: calc(250px - 10px);
- max-width: calc(250px - 10px);
- margin-right: 10px;
-}
-
.sheet-profile-img {
cursor: pointer;
border: none;
@@ -984,49 +777,70 @@ body.system-bol img#logo {
max-width: 96px;
margin-right: 10px;
}
-
+/* ----------------------------------------- */
+/* Actor Sheet Styles */
+/* ----------------------------------------- */
+.bol.sheet.actor {
+ min-width: 820px;
+ min-height: 700px;
+ height: 700px;
+}
+.bol.sheet.actor .window-content .bol-actor-form {
+ background-image: url("/systems/bol/ui/logo.webp");
+ background-repeat: no-repeat;
+ background-size: 190px 115px;
+}
+.bol.sheet.actor .window-content form .sidebar {
+ padding-top: 115px;
+ min-width: 250px;
+ width: 250px;
+ max-width: 250px;
+}
+.bol.sheet.actor .window-content form .sidebar .profile-img {
+ cursor: pointer;
+ border: none;
+ background-color: #EEE;
+ height: auto;
+ width: calc(250px - 10px);
+ min-width: calc(250px - 10px);
+ max-width: calc(250px - 10px);
+ margin-right: 10px;
+}
.bol.sheet.actor .window-content form .main .sheet-body {
overflow: hidden;
}
-
.bol.sheet.actor .window-content 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;
}
-
.bol.sheet.actor .window-content 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;
}
-
.bol.sheet.actor .window-content 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;
}
-
.bol.sheet.actor .window-content 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;
}
-
.bol.sheet.actor .window-content form .main .sheet-body .tab .attribute .stat-value {
margin-top: -10px;
}
-
.bol.sheet.actor .bol-footer {
height: 62px;
max-height: 62px;
min-height: 62px;
}
-
.bol.sheet.actor .bol-footer .footer-left img {
border: none;
height: 62px;
@@ -1034,7 +848,6 @@ body.system-bol img#logo {
min-height: 62px;
transform: scaleX(-1);
}
-
.bol.sheet.actor .bol-footer .footer-center {
margin-top: 20px;
margin-left: calc(-330px * 2);
@@ -1044,66 +857,54 @@ body.system-bol img#logo {
min-height: 30px;
background-color: black;
}
-
.bol.sheet.actor .bol-footer .footer-right {
text-align: right;
}
-
.bol.sheet.actor .bol-footer .footer-right img {
border: none;
height: 62px;
max-height: 62px;
min-height: 62px;
}
-
.bol.sheet.actor .stat-max {
font-size: 1rem;
font-weight: bold;
color: #4b4a44;
}
-
.bol.sheet.actor .bonus-text {
margin-top: 7px;
}
-
.bol.sheet.actor .stat-value {
font-size: 1.5rem;
font-weight: bold;
color: darkred;
}
-
.bol.sheet.actor .resource-bonus {
font-weight: bold;
color: darkred;
}
-
.bol.sheet.actor .resources-value {
background-color: #2a2a2a30;
border-color: #003c1e;
margin-top: 4px;
border-radius: 0.5rem;
}
-
.bol.sheet.actor .resources-novalue {
background-color: #2a2a2a00;
border-color: #003c1e;
margin-top: 4px;
border-radius: 0.5rem;
}
-
.bol.sheet.actor .stat-roll {
font-size: 1.5rem;
color: #4b4a44;
}
-
.bol.sheet.actor .stat-roll.malus {
color: darkred;
}
-
.bol.sheet.actor .stat-roll.bonus {
color: darkgreen;
}
-
.bol.sheet.actor .header-field-label,
.bol.sheet.actor .stat-label {
font-weight: bold;
@@ -1111,13 +912,11 @@ body.system-bol img#logo {
font-size: 2rem;
font-variant: small-caps;
}
-
.bol.sheet.actor .rounded {
border-radius: 100px;
width: 4rem;
height: 4rem;
}
-
.bol.sheet.actor .rounded-border {
border: 3px solid #4b4a44;
box-shadow: 5px 5px 5px gray;
@@ -1125,77 +924,23 @@ body.system-bol img#logo {
width: 4rem;
height: 4rem;
}
-
.bol.sheet.actor .half-rounded {
border-radius: 100px 100px 0px 0px;
width: 4rem;
height: 4rem;
}
-
.bol.sheet.actor .half-rounded-border {
border-radius: 100px 100px 0px 0px;
border: 3px solid #4b4a44;
width: 4rem;
height: 4rem;
}
-
-.bol.sheet.item {
- min-width: 460px;
- min-height: 400px;
-}
-
-.bol.sheet.item h1 input.itemname {
- margin-top: 32px;
- min-width: 24rem;
- font-family: "Wolfsbane2Expanded", cursive;
-}
-
-.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;
-}
-
-.bol.sheet.item .item-properties .properties-list {
- list-style: none;
- margin: 0;
- padding: 0;
-}
-
-.bol.sheet.item .item-properties .properties-list li {
- margin: 3px 0;
- padding: 0 2px;
- background: rgba(0, 0, 0, 0.05);
- border: 1px groove #eeede0;
- text-align: center;
- font-size: 12px;
- line-height: 18px;
-}
-
-.bol.dialog .sheet-header h3 {
- font-family: "Wolfsbane2Expanded", cursive;
- font-size: 24px;
- color: black;
-}
-
-.editor,
-.editor-content {
- height: 100%;
-}
-
+/* ----------------------------------------- */
+/* HUD and Chat Extensions */
+/* ----------------------------------------- */
.rollable {
cursor: pointer;
}
-
.chat-message .chat-icon {
float: right;
border: 1px outset lightgray;
@@ -1204,33 +949,26 @@ body.system-bol img#logo {
width: 64px;
height: 64px;
}
-
.dialog-button {
max-height: 2rem;
}
-
.xp-next {
color: darkgrey;
- font-size: 1.0rem;
+ font-size: 1rem;
border: 1px solid #4b4a44;
box-shadow: 1px 1px 1px gray;
border-radius: 100px;
width: 1.25rem;
height: 1.25rem;
}
-
-/** Tooltip section */
.tooltip-container {
position: relative;
display: inline-block;
}
-
.tooltip-container .tooltiptext {
text-align: center;
- /* Position the tooltip text */
position: absolute;
z-index: 1;
- /* Fade in tooltip */
visibility: hidden;
opacity: 0;
transition: opacity 0.3s;
@@ -1241,21 +979,16 @@ body.system-bol img#logo {
border-width: 1px;
transform: translate(-40%, -60%);
}
-
-/* Show the tooltip text when you mouse over the tooltip container */
.tooltip-container:hover .tooltiptext {
visibility: visible;
opacity: 1;
}
-
-/** HUD SECTION */
.tokenhudext {
display: flex;
flex: 0 !important;
font-family: CaslonPro;
font-weight: 600;
}
-
.tokenhudext.left {
justify-content: flex-start;
flex-direction: column;
@@ -1263,66 +996,99 @@ body.system-bol img#logo {
top: 2.75rem;
right: 16rem;
}
-
.tokenhudext.right {
justify-content: flex-start;
flex-direction: column;
position: absolute;
- /*transform: translate(0, -30%);*/
top: -4rem;
max-width: 250px;
left: 4rem;
}
-
.tokenhudext.right2 {
justify-content: flex-start;
flex-direction: column;
- /*transform: translate(0, -30%);*/
position: absolute;
top: -4rem;
left: 11rem;
}
-
.control-icon.tokenhudicon {
width: fit-content;
height: fit-content;
min-width: 6rem;
flex-basis: auto;
- padding: 0.20rem;
+ padding: 0.2rem;
line-height: 1.1rem;
- margin: 0.20rem;
+ margin: 0.2rem;
}
-
.control-icon.tokenhudicon.right {
margin-left: 8px;
}
-
#token-hud .status-effects.active {
z-index: 2;
}
-
.bol-hud-menu label {
font-size: 0.6rem;
}
-
.bol-margin-tb-2 {
margin-top: 2px;
margin-bottom: 2px;
}
-
.character-summary-container {
opacity: 0.95;
}
-
.character-summary-rollable {
text-decoration: underline;
}
-
.activated-green {
color: darkgreen;
}
-
-/* Hide compendium background image */
.compendium-sidebar .directory-item.compendium.locked .compendium-banner {
opacity: 0.5;
-}
\ No newline at end of file
+}
+/* ----------------------------------------- */
+/* Item Sheet Styles */
+/* ----------------------------------------- */
+.bol.sheet.item {
+ min-width: 460px;
+ min-height: 400px;
+}
+.bol.sheet.item h1 input.itemname {
+ margin-top: 32px;
+ min-width: 24rem;
+ font-family: "Wolfsbane2Expanded", cursive;
+}
+.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;
+}
+.bol.sheet.item .item-properties .properties-list {
+ list-style: none;
+ margin: 0;
+ padding: 0;
+}
+.bol.sheet.item .item-properties .properties-list li {
+ margin: 3px 0;
+ padding: 0 2px;
+ background: rgba(0, 0, 0, 0.05);
+ border: 1px groove #eeede0;
+ text-align: center;
+ font-size: 12px;
+ line-height: 18px;
+}
+.bol.dialog .sheet-header h3 {
+ font-family: "Wolfsbane2Expanded", cursive;
+ font-size: 24px;
+ color: black;
+}
+.editor,
+.editor-content {
+ height: 100%;
+}
diff --git a/module/applications/sheets/_module.mjs b/module/applications/sheets/_module.mjs
new file mode 100644
index 0000000..08faa02
--- /dev/null
+++ b/module/applications/sheets/_module.mjs
@@ -0,0 +1,3 @@
+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"
diff --git a/module/applications/sheets/base-item-sheet.mjs b/module/applications/sheets/base-item-sheet.mjs
new file mode 100644
index 0000000..9f9ae2f
--- /dev/null
+++ b/module/applications/sheets/base-item-sheet.mjs
@@ -0,0 +1,243 @@
+const { HandlebarsApplicationMixin } = foundry.applications.api
+
+/**
+ * Base Item Sheet for BoL system using AppV2
+ * @extends {ItemSheetV2}
+ */
+export default class BoLBaseItemSheet extends HandlebarsApplicationMixin(foundry.applications.sheets.ItemSheetV2) {
+ constructor(options = {}) {
+ super(options)
+ this.#dragDrop = this.#createDragDropHandlers()
+ }
+
+ #dragDrop
+
+ /** @override */
+ static DEFAULT_OPTIONS = {
+ classes: ["bol", "sheet", "item"],
+ position: {
+ width: 650,
+ height: 780,
+ },
+ form: {
+ submitOnChange: true,
+ },
+ window: {
+ resizable: true,
+ },
+ actions: {
+ editImage: BoLBaseItemSheet.#onEditImage,
+ postItem: BoLBaseItemSheet.#onPostItem,
+ },
+ }
+
+ /**
+ * Tab groups state
+ * @type {object}
+ */
+ tabGroups = { primary: "description" }
+
+ /** @override */
+ async _prepareContext() {
+ const context = {
+ // Document & system
+ fields: this.document.schema.fields,
+ systemFields: this.document.system.schema.fields,
+ item: this.document,
+ system: this.document.system,
+ source: this.document.toObject(),
+
+ // Enriched content
+ enrichedDescription: await foundry.applications.ux.TextEditor.implementation.enrichHTML(
+ this.document.system.description,
+ { async: true }
+ ),
+
+ // Properties
+ category: this.document.system.category,
+ itemProperties: this.document.itemProperties,
+
+ // Config & permissions
+ config: game.bol.config,
+ isGM: game.user.isGM,
+ isEditable: this.isEditable,
+
+ // CSS classes for template
+ cssClass: this.options.classes.join(" "),
+
+ // Tab state
+ tabs: this._getTabs(),
+ activeTab: this.tabGroups.primary || "description"
+ }
+
+ // Add careers if item is on an actor
+ if (this.document.actor) {
+ context.careers = this.document.actor.careers
+ }
+
+ // Apply dynamic defaults based on item type
+ this._applyDynamicDefaults(context)
+
+ return context
+ }
+
+ /**
+ * Get tabs configuration
+ * @returns {object[]}
+ * @private
+ */
+ _getTabs() {
+ return [
+ { id: "description", label: "BOL.ui.tab.description", icon: "fa-solid fa-book" },
+ { id: "properties", label: "BOL.ui.tab.details", icon: "fa-solid fa-cog" }
+ ]
+ }
+
+ /**
+ * Apply dynamic defaults to context based on item type and category
+ * @param {object} context
+ * @private
+ */
+ _applyDynamicDefaults(context) {
+ const itemData = context.item
+
+ if (itemData.type === "item") {
+ // Set default category
+ if (!itemData.system.category) {
+ itemData.system.category = "equipment"
+ }
+
+ // Handle equipment slot
+ if (itemData.system.category === "equipment" && itemData.system.properties.equipable) {
+ if (!itemData.system.properties.slot) {
+ itemData.system.properties.slot = "-"
+ }
+ }
+
+ // Handle spell conditions
+ if (itemData.system.category === 'spell') {
+ if (!itemData.system.properties.mandatoryconditions) {
+ itemData.system.properties.mandatoryconditions = []
+ }
+ if (!itemData.system.properties.optionnalconditions) {
+ itemData.system.properties.optionnalconditions = []
+ }
+ for (let i = 0; i < 4; i++) {
+ itemData.system.properties.mandatoryconditions[i] = itemData.system.properties.mandatoryconditions[i] ?? ""
+ }
+ for (let i = 0; i < 8; i++) {
+ itemData.system.properties.optionnalconditions[i] = itemData.system.properties.optionnalconditions[i] ?? ""
+ }
+ }
+ } else if (itemData.type === "feature") {
+ // Set default subtype/category
+ if (!itemData.system.subtype) {
+ itemData.system.category = "origin"
+ }
+ }
+ }
+
+ /** @override */
+ _onRender(context, options) {
+ super._onRender(context, options)
+ this.#dragDrop.forEach((d) => d.bind(this.element))
+ this._activateTabs()
+ this._activateListeners()
+ }
+
+ /**
+ * Activate tab navigation
+ * @private
+ */
+ _activateTabs() {
+ const nav = this.element.querySelector('nav.tabs[data-group="primary"]')
+ if (!nav) return
+
+ const activeTab = this.tabGroups.primary || "description"
+
+ // Activate tab links
+ 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()
+ })
+ })
+
+ // Show/hide tab content
+ this.element.querySelectorAll('.tab[data-tab]').forEach(content => {
+ content.classList.toggle('active', content.dataset.tab === activeTab)
+ })
+ }
+
+ /**
+ * Activate custom listeners
+ * @private
+ */
+ _activateListeners() {
+ if (!this.isEditable) return
+
+ // Armor quality change handler
+ const armorQuality = this.element.querySelector('.armorQuality')
+ if (armorQuality) {
+ armorQuality.addEventListener('change', (ev) => {
+ const value = ev.currentTarget.value
+ const soakFormula = this.element.querySelector('.soakFormula')
+ if (soakFormula && game.bol.config.soakFormulas[value]) {
+ soakFormula.value = game.bol.config.soakFormulas[value]
+ }
+ })
+ }
+ }
+
+ // #region Drag-and-Drop Workflow
+
+ /**
+ * Create drag-and-drop workflow handlers for this Application
+ * @returns {DragDrop[]}
+ * @private
+ */
+ #createDragDropHandlers() {
+ return []
+ }
+
+ // #endregion
+
+ // #region Actions
+
+ /**
+ * Handle editing the item image
+ * @param {PointerEvent} event
+ * @param {HTMLElement} target
+ * @private
+ */
+ static async #onEditImage(event, target) {
+ const fp = new FilePicker({
+ current: this.document.img,
+ type: "image",
+ callback: (path) => {
+ this.document.update({ img: path })
+ },
+ })
+ return fp.browse()
+ }
+
+ /**
+ * Handle posting the item to chat
+ * @param {PointerEvent} event
+ * @param {HTMLElement} target
+ * @private
+ */
+ static async #onPostItem(event, target) {
+ const BoLUtility = (await import("../../system/bol-utility.js")).BoLUtility
+ let chatData = foundry.utils.duplicate(this.document)
+ if (this.document.actor) {
+ chatData.actor = { id: this.document.actor.id }
+ }
+ BoLUtility.postItem(chatData)
+ }
+
+ // #endregion
+}
diff --git a/module/applications/sheets/feature-sheet.mjs b/module/applications/sheets/feature-sheet.mjs
new file mode 100644
index 0000000..34b8d97
--- /dev/null
+++ b/module/applications/sheets/feature-sheet.mjs
@@ -0,0 +1,40 @@
+import BoLBaseItemSheet from "./base-item-sheet.mjs"
+
+/**
+ * Item Sheet for "feature" type items (boons, careers, origins, etc.)
+ * @extends {BoLBaseItemSheet}
+ */
+export default class BoLFeatureSheet extends BoLBaseItemSheet {
+
+ /** @override */
+ static DEFAULT_OPTIONS = {
+ ...super.DEFAULT_OPTIONS,
+ classes: [...super.DEFAULT_OPTIONS.classes, "item-type-feature"],
+ }
+
+ /** @override */
+ static PARTS = {
+ main: {
+ template: "systems/bol/templates/item/feature-sheet.hbs",
+ },
+ }
+
+ /** @override */
+ async _prepareContext() {
+ const context = await super._prepareContext()
+
+ // Add feature-specific context
+ context.isFeature = true
+ context.isBoon = context.system.subtype === "boon"
+ context.isFlaw = context.system.subtype === "flaw"
+ context.isCareer = context.system.subtype === "career"
+ context.isOrigin = context.system.subtype === "origin"
+ context.isRace = context.system.subtype === "race"
+ context.isFightOption = context.system.subtype === "fightoption"
+ context.isEffect = context.system.subtype === "effect"
+ context.isHoroscope = context.system.subtype === "horoscope"
+ context.isXpLog = context.system.subtype === "xplog"
+
+ return context
+ }
+}
diff --git a/module/applications/sheets/item-sheet.mjs b/module/applications/sheets/item-sheet.mjs
new file mode 100644
index 0000000..d6d4259
--- /dev/null
+++ b/module/applications/sheets/item-sheet.mjs
@@ -0,0 +1,39 @@
+import BoLBaseItemSheet from "./base-item-sheet.mjs"
+
+/**
+ * Item Sheet for "item" type items (equipment, weapons, etc.)
+ * @extends {BoLBaseItemSheet}
+ */
+export default class BoLItemSheet extends BoLBaseItemSheet {
+
+ /** @override */
+ static DEFAULT_OPTIONS = {
+ ...super.DEFAULT_OPTIONS,
+ classes: [...super.DEFAULT_OPTIONS.classes, "item-type-item"],
+ }
+
+ /** @override */
+ static PARTS = {
+ main: {
+ template: "systems/bol/templates/item/item-sheet.hbs",
+ },
+ }
+
+ /** @override */
+ async _prepareContext() {
+ const context = await super._prepareContext()
+
+ // Add item-specific context
+ context.isItem = true
+ context.isEquipment = context.category === "equipment"
+ context.isWeapon = context.category === "weapon"
+ context.isProtection = context.category === "protection"
+ context.isSpell = context.category === "spell"
+ context.isAlchemy = context.category === "alchemy"
+ context.isCapacity = context.category === "capacity"
+ context.isMagical = context.category === "magical"
+ context.isVehicle = context.category === "vehicle"
+
+ return context
+ }
+}
diff --git a/module/bol.js b/module/bol.js
index 0981bb1..79adc69 100644
--- a/module/bol.js
+++ b/module/bol.js
@@ -5,7 +5,7 @@ import { BoLActorSheet } from "./actor/actor-sheet.js"
import { BoLVehicleSheet } from "./actor/vehicle-sheet.js"
import { BoLHordeSheet } from "./actor/horde-sheet.js"
import { BoLItem } from "./item/item.js"
-import { BoLItemSheet } from "./item/item-sheet.js"
+// Note: Old BoLItemSheet (AppV1) is now replaced by AppV2 sheets
import { System, BOL } from "./system/config.js"
import { preloadHandlebarsTemplates } from "./system/templates.js"
import { registerHandlebarsHelpers } from "./system/helpers.js"
@@ -21,6 +21,9 @@ import { BoLRoll } from "./controllers/bol-rolls.js"
// Import DataModels
import * as models from "./models/_module.mjs"
+// Import AppV2 Sheets
+import * as sheets from "./applications/sheets/_module.mjs"
+
/* -------------------------------------------- */
Hooks.once('init', async function () {
@@ -32,7 +35,8 @@ Hooks.once('init', async function () {
BoLUtility,
macros: Macros,
config: BOL,
- models
+ models,
+ sheets
};
// Game socket
@@ -57,13 +61,13 @@ Hooks.once('init', async function () {
horde: models.BoLHorde,
vehicle: models.BoLVehicle
}
-
+
CONFIG.Item.documentClass = BoLItem;
CONFIG.Item.dataModels = {
item: models.BoLItem,
feature: models.BoLFeature
}
-
+
CONFIG.Combat.documentClass = BoLCombatManager;
// Register sheet application classes
@@ -72,8 +76,17 @@ Hooks.once('init', async function () {
foundry.documents.collections.Actors.registerSheet("bol", BoLVehicleSheet, { types: ["vehicle"], makeDefault: true })
foundry.documents.collections.Actors.registerSheet("bol", BoLHordeSheet, { types: ["horde"], makeDefault: true })
+ // Register AppV2 Item Sheets
foundry.documents.collections.Items.unregisterSheet("core", foundry.appv1.sheets.ItemSheet);
- foundry.documents.collections.Items.registerSheet("bol", BoLItemSheet, { makeDefault: true });
+ foundry.documents.collections.Items.registerSheet("bol", sheets.BoLItemSheet, { types: ["item"], makeDefault: true });
+ foundry.documents.collections.Items.registerSheet("bol", sheets.BoLFeatureSheet, { types: ["feature"], makeDefault: true });
+
+ // Debug: Verify AppV2 sheets are loaded
+ console.log("BoL Item Sheets registered:", {
+ BoLItemSheet: sheets.BoLItemSheet.name,
+ BoLFeatureSheet: sheets.BoLFeatureSheet.name,
+ extendsApplicationV2: sheets.BoLItemSheet.prototype instanceof foundry.applications.api.ApplicationV2
+ });
// Inot useful stuff
BoLUtility.init()
diff --git a/module/item/item-sheet.js b/module/item.backup/item-sheet.js
similarity index 100%
rename from module/item/item-sheet.js
rename to module/item.backup/item-sheet.js
diff --git a/module/item.backup/item-sheet.js.appv1 b/module/item.backup/item-sheet.js.appv1
new file mode 100644
index 0000000..f41c603
--- /dev/null
+++ b/module/item.backup/item-sheet.js.appv1
@@ -0,0 +1,119 @@
+import { BoLUtility } from "../system/bol-utility.js";
+
+/**
+ * Extend the basic ItemSheet with some very simple modifications
+ * @extends {ItemSheet}
+ */
+export class BoLItemSheet extends foundry.appv1.sheets.ItemSheet {
+
+ /** @override */
+ static get defaultOptions() {
+ return foundry.utils.mergeObject(super.defaultOptions, {
+ classes: ["bol", "sheet", "item"],
+ template: "systems/bol/templates/item/item-sheet.hbs",
+ width: 650,
+ height: 780,
+ dragDrop: [{ dragSelector: null, dropSelector: null }],
+ tabs: [{ navSelector: ".sheet-tabs", contentSelector: ".sheet-body", initial: "description" }]
+ });
+ }
+
+ /* -------------------------------------------- */
+ /** @override */
+ async getData(options) {
+ const data = super.getData(options)
+ let itemData = foundry.utils.duplicate(data.document)
+ data.config = game.bol.config
+ data.item = itemData
+ data.category = itemData.system.category
+ data.isGM = game.user.isGM;
+ data.itemProperties = this.item.itemProperties;
+ data.description = await foundry.applications.ux.TextEditor.implementation.enrichHTML(this.object.system.description, { async: true })
+ if (data.document.actor) {
+ data.careers = data.document.actor.careers
+ }
+ // Dynamic default data fix/adapt
+ if (itemData.type == "item") {
+ if (!itemData.system.category) {
+ itemData.system.category = "equipment"
+ }
+ if (itemData.system.category == "equipment" && itemData.system.properties.equipable) {
+ if (!itemData.system.properties.slot) {
+ itemData.system.properties.slot = "-"
+ }
+ }
+ if (itemData.system.category == 'spell') {
+ if (!itemData.system.properties.mandatoryconditions) {
+ itemData.system.properties.mandatoryconditions = []
+ }
+ if (!itemData.system.properties.optionnalconditions) {
+ itemData.system.properties.optionnalconditions = []
+ }
+ for (let i = 0; i < 4; i++) {
+ itemData.system.properties.mandatoryconditions[i] = itemData.system.properties.mandatoryconditions[i] ?? ""
+ }
+ for (let i = 0; i < 8; i++) {
+ itemData.system.properties.optionnalconditions[i] = itemData.system.properties.optionnalconditions[i] ?? ""
+ }
+ }
+ } else {
+ if (!itemData.system.subtype) {
+ itemData.system.category = "origin"
+ }
+ }
+
+ console.log("ITEMDATA", data);
+ return data;
+ }
+
+ /* -------------------------------------------- */
+ _getHeaderButtons() {
+ let buttons = super._getHeaderButtons();
+ buttons.unshift({
+ class: "post",
+ icon: "fas fa-comment",
+ onclick: ev => this.postItem()
+ });
+ return buttons
+ }
+
+ /* -------------------------------------------- */
+ postItem() {
+ let chatData = foundry.utils.duplicate(this.item)
+ if (this.actor) {
+ chatData.actor = { id: this.actor.id };
+ }
+ BoLUtility.postItem(chatData);
+ }
+
+
+ /* -------------------------------------------- */
+ /** @override */
+ setPosition(options = {}) {
+ const position = super.setPosition(options);
+ const sheetBody = this.element.find(".sheet-body");
+ const bodyHeight = position.height - 192;
+ sheetBody.css("height", bodyHeight);
+ return position;
+ }
+
+ /* -------------------------------------------- */
+
+ /** @override */
+ activateListeners(html) {
+
+ super.activateListeners(html);
+
+ // Everything below here is only needed if the sheet is editable
+ if (!this.options.editable) return;
+ // Roll handlers, click handlers, etc. would go here.
+
+ html.find('.armorQuality').change(ev => {
+ const li = $(ev.currentTarget);
+ console.log(game.bol.config.soakFormulas[li.val()]);
+ $('.soakFormula').val(game.bol.config.soakFormulas[li.val()]);
+ });
+
+ }
+
+}
diff --git a/module/item.backup/item.js b/module/item.backup/item.js
new file mode 100644
index 0000000..d149d17
--- /dev/null
+++ b/module/item.backup/item.js
@@ -0,0 +1,36 @@
+/**
+ * Extend the basic Item with some very simple modifications.
+ * @extends {Item}
+ */
+export class BoLItem extends Item {
+ /**
+ * Augment the basic Item data model with additional dynamic data.
+ */
+ prepareData() {
+ super.prepareData()
+
+ const actorData = this.actor ? this.actor.system : {}
+ }
+
+ /* -------------------------------------------- */
+ get properties() {
+ return this.system.properties
+ }
+
+ /* -------------------------------------------- */
+ /**
+ * Get the Array of item properties which are used in the small sidebar of the description tab
+ * @return {Array}
+ * @private
+ */
+ get itemProperties() {
+ const props = [];
+ if ( this.type === "item" ) {
+ const entries = Object.entries(this.system.properties)
+ props.push(...entries.filter(e => e[1] === true).map(e => { return game.bol.config.itemProperties2[e[0]] }))
+ }
+ return props.filter(p => !!p)
+ }
+
+
+}
diff --git a/module/models/feature.mjs b/module/models/feature.mjs
index f6cab2c..199ef30 100644
--- a/module/models/feature.mjs
+++ b/module/models/feature.mjs
@@ -8,7 +8,7 @@ export default class BoLFeatureDataModel extends foundry.abstract.TypeDataModel
return {
// Base fields
- category: new fields.StringField({ initial: null }),
+ category: new fields.StringField({ initial: "" }),
subtype: new fields.StringField({ initial: "default" }),
description: new fields.HTMLField({ initial: "" }),
properties: new fields.SchemaField({}),
diff --git a/module/models/item.mjs b/module/models/item.mjs
index 19ebe72..fe3a9ef 100644
--- a/module/models/item.mjs
+++ b/module/models/item.mjs
@@ -8,7 +8,7 @@ export default class BoLItemDataModel extends foundry.abstract.TypeDataModel {
return {
// Base fields
- category: new fields.StringField({ initial: null }),
+ category: new fields.StringField({ initial: "" }),
subtype: new fields.StringField({ initial: "default" }),
description: new fields.HTMLField({ initial: "" }),
properties: new fields.SchemaField({
diff --git a/packs/aides-de-jeu/000955.log b/packs/aides-de-jeu/000970.log
similarity index 100%
rename from packs/aides-de-jeu/000955.log
rename to packs/aides-de-jeu/000970.log
diff --git a/packs/aides-de-jeu/CURRENT b/packs/aides-de-jeu/CURRENT
index 0962e78..1526d0a 100644
--- a/packs/aides-de-jeu/CURRENT
+++ b/packs/aides-de-jeu/CURRENT
@@ -1 +1 @@
-MANIFEST-000953
+MANIFEST-000969
diff --git a/packs/aides-de-jeu/LOG b/packs/aides-de-jeu/LOG
index 83b87f4..dd3d03b 100644
--- a/packs/aides-de-jeu/LOG
+++ b/packs/aides-de-jeu/LOG
@@ -1,8 +1,3 @@
-2026/01/05-17:48:52.795130 7f93ea7fc6c0 Recovering log #951
-2026/01/05-17:48:52.804687 7f93ea7fc6c0 Delete type=3 #949
-2026/01/05-17:48:52.804760 7f93ea7fc6c0 Delete type=0 #951
-2026/01/05-18:46:08.165267 7f93e9ffb6c0 Level-0 table #956: started
-2026/01/05-18:46:08.165288 7f93e9ffb6c0 Level-0 table #956: 0 bytes OK
-2026/01/05-18:46:08.171239 7f93e9ffb6c0 Delete type=0 #954
-2026/01/05-18:46:08.190776 7f93e9ffb6c0 Manual compaction at level-0 from '!journal!3xJg1rCxnWvEmoxS' @ 72057594037927935 : 1 .. '!journal.pages!veAAxCtCKcFIsnln.0kUgZspxXO7VS8bd' @ 0 : 0; will stop at (end)
-2026/01/05-18:46:08.190816 7f93e9ffb6c0 Manual compaction at level-1 from '!journal!3xJg1rCxnWvEmoxS' @ 72057594037927935 : 1 .. '!journal.pages!veAAxCtCKcFIsnln.0kUgZspxXO7VS8bd' @ 0 : 0; will stop at (end)
+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
diff --git a/packs/aides-de-jeu/LOG.old b/packs/aides-de-jeu/LOG.old
index aa497f2..9e3c512 100644
--- a/packs/aides-de-jeu/LOG.old
+++ b/packs/aides-de-jeu/LOG.old
@@ -1,8 +1,8 @@
-2026/01/04-21:27:06.154359 7f93ebfff6c0 Recovering log #947
-2026/01/04-21:27:06.163916 7f93ebfff6c0 Delete type=3 #945
-2026/01/04-21:27:06.163965 7f93ebfff6c0 Delete type=0 #947
-2026/01/04-21:27:09.349413 7f93e9ffb6c0 Level-0 table #952: started
-2026/01/04-21:27:09.349437 7f93e9ffb6c0 Level-0 table #952: 0 bytes OK
-2026/01/04-21:27:09.356668 7f93e9ffb6c0 Delete type=0 #950
-2026/01/04-21:27:09.356816 7f93e9ffb6c0 Manual compaction at level-0 from '!journal!3xJg1rCxnWvEmoxS' @ 72057594037927935 : 1 .. '!journal.pages!veAAxCtCKcFIsnln.0kUgZspxXO7VS8bd' @ 0 : 0; will stop at (end)
-2026/01/04-21:27:09.356844 7f93e9ffb6c0 Manual compaction at level-1 from '!journal!3xJg1rCxnWvEmoxS' @ 72057594037927935 : 1 .. '!journal.pages!veAAxCtCKcFIsnln.0kUgZspxXO7VS8bd' @ 0 : 0; will stop at (end)
+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)
diff --git a/packs/aides-de-jeu/MANIFEST-000953 b/packs/aides-de-jeu/MANIFEST-000969
similarity index 84%
rename from packs/aides-de-jeu/MANIFEST-000953
rename to packs/aides-de-jeu/MANIFEST-000969
index ee44946..e59a0c8 100644
Binary files a/packs/aides-de-jeu/MANIFEST-000953 and b/packs/aides-de-jeu/MANIFEST-000969 differ
diff --git a/packs/armors/000860.log b/packs/armors/000875.log
similarity index 100%
rename from packs/armors/000860.log
rename to packs/armors/000875.log
diff --git a/packs/armors/CURRENT b/packs/armors/CURRENT
index b7b5921..7299140 100644
--- a/packs/armors/CURRENT
+++ b/packs/armors/CURRENT
@@ -1 +1 @@
-MANIFEST-000858
+MANIFEST-000874
diff --git a/packs/armors/LOG b/packs/armors/LOG
index 34d805c..d7554ea 100644
--- a/packs/armors/LOG
+++ b/packs/armors/LOG
@@ -1,8 +1,3 @@
-2026/01/05-17:48:52.770002 7f93eb7fe6c0 Recovering log #856
-2026/01/05-17:48:52.779610 7f93eb7fe6c0 Delete type=3 #854
-2026/01/05-17:48:52.779657 7f93eb7fe6c0 Delete type=0 #856
-2026/01/05-18:46:08.184410 7f93e9ffb6c0 Level-0 table #861: started
-2026/01/05-18:46:08.184436 7f93e9ffb6c0 Level-0 table #861: 0 bytes OK
-2026/01/05-18:46:08.190634 7f93e9ffb6c0 Delete type=0 #859
-2026/01/05-18:46:08.190808 7f93e9ffb6c0 Manual compaction at level-0 from '!items!G3dZTHIabA3LA1hY' @ 72057594037927935 : 1 .. '!items!xhEcsi3WHjbt2ro9' @ 0 : 0; will stop at (end)
-2026/01/05-18:46:08.190838 7f93e9ffb6c0 Manual compaction at level-1 from '!items!G3dZTHIabA3LA1hY' @ 72057594037927935 : 1 .. '!items!xhEcsi3WHjbt2ro9' @ 0 : 0; will stop at (end)
+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
diff --git a/packs/armors/LOG.old b/packs/armors/LOG.old
index 1577b52..9835a04 100644
--- a/packs/armors/LOG.old
+++ b/packs/armors/LOG.old
@@ -1,8 +1,8 @@
-2026/01/04-21:27:06.128994 7f93ea7fc6c0 Recovering log #852
-2026/01/04-21:27:06.139883 7f93ea7fc6c0 Delete type=3 #850
-2026/01/04-21:27:06.139937 7f93ea7fc6c0 Delete type=0 #852
-2026/01/04-21:27:09.336180 7f93e9ffb6c0 Level-0 table #857: started
-2026/01/04-21:27:09.336219 7f93e9ffb6c0 Level-0 table #857: 0 bytes OK
-2026/01/04-21:27:09.342820 7f93e9ffb6c0 Delete type=0 #855
-2026/01/04-21:27:09.356794 7f93e9ffb6c0 Manual compaction at level-0 from '!items!G3dZTHIabA3LA1hY' @ 72057594037927935 : 1 .. '!items!xhEcsi3WHjbt2ro9' @ 0 : 0; will stop at (end)
-2026/01/04-21:27:09.356834 7f93e9ffb6c0 Manual compaction at level-1 from '!items!G3dZTHIabA3LA1hY' @ 72057594037927935 : 1 .. '!items!xhEcsi3WHjbt2ro9' @ 0 : 0; will stop at (end)
+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)
diff --git a/packs/armors/MANIFEST-000858 b/packs/armors/MANIFEST-000874
similarity index 73%
rename from packs/armors/MANIFEST-000858
rename to packs/armors/MANIFEST-000874
index a44b6ca..097c308 100644
Binary files a/packs/armors/MANIFEST-000858 and b/packs/armors/MANIFEST-000874 differ
diff --git a/packs/boons/000954.log b/packs/boons/000969.log
similarity index 100%
rename from packs/boons/000954.log
rename to packs/boons/000969.log
diff --git a/packs/boons/CURRENT b/packs/boons/CURRENT
index 9c629f1..0a8f1fe 100644
--- a/packs/boons/CURRENT
+++ b/packs/boons/CURRENT
@@ -1 +1 @@
-MANIFEST-000952
+MANIFEST-000968
diff --git a/packs/boons/LOG b/packs/boons/LOG
index 96b9f6f..47ce8dc 100644
--- a/packs/boons/LOG
+++ b/packs/boons/LOG
@@ -1,8 +1,3 @@
-2026/01/05-17:48:52.664159 7f93eaffd6c0 Recovering log #950
-2026/01/05-17:48:52.674361 7f93eaffd6c0 Delete type=3 #948
-2026/01/05-17:48:52.674426 7f93eaffd6c0 Delete type=0 #950
-2026/01/05-18:46:08.131395 7f93e9ffb6c0 Level-0 table #955: started
-2026/01/05-18:46:08.131423 7f93e9ffb6c0 Level-0 table #955: 0 bytes OK
-2026/01/05-18:46:08.138592 7f93e9ffb6c0 Delete type=0 #953
-2026/01/05-18:46:08.138762 7f93e9ffb6c0 Manual compaction at level-0 from '!items!039ZF3E3MtAGwbiX' @ 72057594037927935 : 1 .. '!items!zgspy1QKaxdEetEw' @ 0 : 0; will stop at (end)
-2026/01/05-18:46:08.138775 7f93e9ffb6c0 Manual compaction at level-1 from '!items!039ZF3E3MtAGwbiX' @ 72057594037927935 : 1 .. '!items!zgspy1QKaxdEetEw' @ 0 : 0; will stop at (end)
+2026/01/13-08:07:30.052912 7fad35bfc6c0 Recovering log #966
+2026/01/13-08:07:30.063608 7fad35bfc6c0 Delete type=3 #964
+2026/01/13-08:07:30.063709 7fad35bfc6c0 Delete type=0 #966
diff --git a/packs/boons/LOG.old b/packs/boons/LOG.old
index 1ed12b1..b57abf8 100644
--- a/packs/boons/LOG.old
+++ b/packs/boons/LOG.old
@@ -1,8 +1,8 @@
-2026/01/04-21:27:06.028125 7f93ea7fc6c0 Recovering log #946
-2026/01/04-21:27:06.038087 7f93ea7fc6c0 Delete type=3 #944
-2026/01/04-21:27:06.038175 7f93ea7fc6c0 Delete type=0 #946
-2026/01/04-21:27:09.288246 7f93e9ffb6c0 Level-0 table #951: started
-2026/01/04-21:27:09.288266 7f93e9ffb6c0 Level-0 table #951: 0 bytes OK
-2026/01/04-21:27:09.295632 7f93e9ffb6c0 Delete type=0 #949
-2026/01/04-21:27:09.302193 7f93e9ffb6c0 Manual compaction at level-0 from '!items!039ZF3E3MtAGwbiX' @ 72057594037927935 : 1 .. '!items!zgspy1QKaxdEetEw' @ 0 : 0; will stop at (end)
-2026/01/04-21:27:09.302223 7f93e9ffb6c0 Manual compaction at level-1 from '!items!039ZF3E3MtAGwbiX' @ 72057594037927935 : 1 .. '!items!zgspy1QKaxdEetEw' @ 0 : 0; will stop at (end)
+2026/01/13-00:31:14.236837 7fad373ff6c0 Recovering log #962
+2026/01/13-00:31:14.246601 7fad373ff6c0 Delete type=3 #960
+2026/01/13-00:31:14.246657 7fad373ff6c0 Delete type=0 #962
+2026/01/13-00:33:18.044085 7fad353fb6c0 Level-0 table #967: started
+2026/01/13-00:33:18.044110 7fad353fb6c0 Level-0 table #967: 0 bytes OK
+2026/01/13-00:33:18.050908 7fad353fb6c0 Delete type=0 #965
+2026/01/13-00:33:18.057401 7fad353fb6c0 Manual compaction at level-0 from '!items!039ZF3E3MtAGwbiX' @ 72057594037927935 : 1 .. '!items!zgspy1QKaxdEetEw' @ 0 : 0; will stop at (end)
+2026/01/13-00:33:18.057428 7fad353fb6c0 Manual compaction at level-1 from '!items!039ZF3E3MtAGwbiX' @ 72057594037927935 : 1 .. '!items!zgspy1QKaxdEetEw' @ 0 : 0; will stop at (end)
diff --git a/packs/boons/MANIFEST-000952 b/packs/boons/MANIFEST-000968
similarity index 72%
rename from packs/boons/MANIFEST-000952
rename to packs/boons/MANIFEST-000968
index 183440c..6e9808c 100644
Binary files a/packs/boons/MANIFEST-000952 and b/packs/boons/MANIFEST-000968 differ
diff --git a/packs/boonsflawscreatures/000953.log b/packs/boonsflawscreatures/000968.log
similarity index 100%
rename from packs/boonsflawscreatures/000953.log
rename to packs/boonsflawscreatures/000968.log
diff --git a/packs/boonsflawscreatures/CURRENT b/packs/boonsflawscreatures/CURRENT
index a502202..0165034 100644
--- a/packs/boonsflawscreatures/CURRENT
+++ b/packs/boonsflawscreatures/CURRENT
@@ -1 +1 @@
-MANIFEST-000951
+MANIFEST-000967
diff --git a/packs/boonsflawscreatures/LOG b/packs/boonsflawscreatures/LOG
index 16e60af..82b256c 100644
--- a/packs/boonsflawscreatures/LOG
+++ b/packs/boonsflawscreatures/LOG
@@ -1,8 +1,3 @@
-2026/01/05-17:48:52.677346 7f93ebfff6c0 Recovering log #949
-2026/01/05-17:48:52.687800 7f93ebfff6c0 Delete type=3 #947
-2026/01/05-17:48:52.687851 7f93ebfff6c0 Delete type=0 #949
-2026/01/05-18:46:08.112587 7f93e9ffb6c0 Level-0 table #954: started
-2026/01/05-18:46:08.112663 7f93e9ffb6c0 Level-0 table #954: 0 bytes OK
-2026/01/05-18:46:08.119196 7f93e9ffb6c0 Delete type=0 #952
-2026/01/05-18:46:08.138726 7f93e9ffb6c0 Manual compaction at level-0 from '!items!CoqlfsDV1gL5swbK' @ 72057594037927935 : 1 .. '!items!yofwG0YrsL902G77' @ 0 : 0; will stop at (end)
-2026/01/05-18:46:08.138769 7f93e9ffb6c0 Manual compaction at level-1 from '!items!CoqlfsDV1gL5swbK' @ 72057594037927935 : 1 .. '!items!yofwG0YrsL902G77' @ 0 : 0; will stop at (end)
+2026/01/13-08:07:30.067310 7fad373ff6c0 Recovering log #965
+2026/01/13-08:07:30.078796 7fad373ff6c0 Delete type=3 #963
+2026/01/13-08:07:30.078908 7fad373ff6c0 Delete type=0 #965
diff --git a/packs/boonsflawscreatures/LOG.old b/packs/boonsflawscreatures/LOG.old
index d2e7631..3331621 100644
--- a/packs/boonsflawscreatures/LOG.old
+++ b/packs/boonsflawscreatures/LOG.old
@@ -1,8 +1,8 @@
-2026/01/04-21:27:06.040735 7f93eaffd6c0 Recovering log #945
-2026/01/04-21:27:06.051418 7f93eaffd6c0 Delete type=3 #943
-2026/01/04-21:27:06.051486 7f93eaffd6c0 Delete type=0 #945
-2026/01/04-21:27:09.295751 7f93e9ffb6c0 Level-0 table #950: started
-2026/01/04-21:27:09.295768 7f93e9ffb6c0 Level-0 table #950: 0 bytes OK
-2026/01/04-21:27:09.302037 7f93e9ffb6c0 Delete type=0 #948
-2026/01/04-21:27:09.302205 7f93e9ffb6c0 Manual compaction at level-0 from '!items!CoqlfsDV1gL5swbK' @ 72057594037927935 : 1 .. '!items!yofwG0YrsL902G77' @ 0 : 0; will stop at (end)
-2026/01/04-21:27:09.302228 7f93e9ffb6c0 Manual compaction at level-1 from '!items!CoqlfsDV1gL5swbK' @ 72057594037927935 : 1 .. '!items!yofwG0YrsL902G77' @ 0 : 0; will stop at (end)
+2026/01/13-00:31:14.249012 7fad36bfe6c0 Recovering log #961
+2026/01/13-00:31:14.258675 7fad36bfe6c0 Delete type=3 #959
+2026/01/13-00:31:14.258729 7fad36bfe6c0 Delete type=0 #961
+2026/01/13-00:33:18.037279 7fad353fb6c0 Level-0 table #966: started
+2026/01/13-00:33:18.037321 7fad353fb6c0 Level-0 table #966: 0 bytes OK
+2026/01/13-00:33:18.043985 7fad353fb6c0 Delete type=0 #964
+2026/01/13-00:33:18.057393 7fad353fb6c0 Manual compaction at level-0 from '!items!CoqlfsDV1gL5swbK' @ 72057594037927935 : 1 .. '!items!yofwG0YrsL902G77' @ 0 : 0; will stop at (end)
+2026/01/13-00:33:18.057422 7fad353fb6c0 Manual compaction at level-1 from '!items!CoqlfsDV1gL5swbK' @ 72057594037927935 : 1 .. '!items!yofwG0YrsL902G77' @ 0 : 0; will stop at (end)
diff --git a/packs/boonsflawscreatures/MANIFEST-000951 b/packs/boonsflawscreatures/MANIFEST-000967
similarity index 73%
rename from packs/boonsflawscreatures/MANIFEST-000951
rename to packs/boonsflawscreatures/MANIFEST-000967
index b372df9..6d4fa54 100644
Binary files a/packs/boonsflawscreatures/MANIFEST-000951 and b/packs/boonsflawscreatures/MANIFEST-000967 differ
diff --git a/packs/careers/000953.log b/packs/careers/000968.log
similarity index 100%
rename from packs/careers/000953.log
rename to packs/careers/000968.log
diff --git a/packs/careers/CURRENT b/packs/careers/CURRENT
index a502202..0165034 100644
--- a/packs/careers/CURRENT
+++ b/packs/careers/CURRENT
@@ -1 +1 @@
-MANIFEST-000951
+MANIFEST-000967
diff --git a/packs/careers/LOG b/packs/careers/LOG
index 85abc10..13eb4df 100644
--- a/packs/careers/LOG
+++ b/packs/careers/LOG
@@ -1,8 +1,3 @@
-2026/01/05-17:48:52.703286 7f93ea7fc6c0 Recovering log #949
-2026/01/05-17:48:52.712737 7f93ea7fc6c0 Delete type=3 #947
-2026/01/05-17:48:52.712782 7f93ea7fc6c0 Delete type=0 #949
-2026/01/05-18:46:08.157666 7f93e9ffb6c0 Level-0 table #954: started
-2026/01/05-18:46:08.157700 7f93e9ffb6c0 Level-0 table #954: 0 bytes OK
-2026/01/05-18:46:08.165027 7f93e9ffb6c0 Delete type=0 #952
-2026/01/05-18:46:08.165139 7f93e9ffb6c0 Manual compaction at level-0 from '!items!4S4xAfMXGnuU0O1a' @ 72057594037927935 : 1 .. '!items!zxY3sW0iCJBvwjOS' @ 0 : 0; will stop at (end)
-2026/01/05-18:46:08.165158 7f93e9ffb6c0 Manual compaction at level-1 from '!items!4S4xAfMXGnuU0O1a' @ 72057594037927935 : 1 .. '!items!zxY3sW0iCJBvwjOS' @ 0 : 0; will stop at (end)
+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
diff --git a/packs/careers/LOG.old b/packs/careers/LOG.old
index ecf9100..47380b6 100644
--- a/packs/careers/LOG.old
+++ b/packs/careers/LOG.old
@@ -1,8 +1,8 @@
-2026/01/04-21:27:06.066954 7f93ea7fc6c0 Recovering log #945
-2026/01/04-21:27:06.077513 7f93ea7fc6c0 Delete type=3 #943
-2026/01/04-21:27:06.077584 7f93ea7fc6c0 Delete type=0 #945
-2026/01/04-21:27:09.302290 7f93e9ffb6c0 Level-0 table #950: started
-2026/01/04-21:27:09.302308 7f93e9ffb6c0 Level-0 table #950: 0 bytes OK
-2026/01/04-21:27:09.309131 7f93e9ffb6c0 Delete type=0 #948
-2026/01/04-21:27:09.329337 7f93e9ffb6c0 Manual compaction at level-0 from '!items!4S4xAfMXGnuU0O1a' @ 72057594037927935 : 1 .. '!items!zxY3sW0iCJBvwjOS' @ 0 : 0; will stop at (end)
-2026/01/04-21:27:09.329393 7f93e9ffb6c0 Manual compaction at level-1 from '!items!4S4xAfMXGnuU0O1a' @ 72057594037927935 : 1 .. '!items!zxY3sW0iCJBvwjOS' @ 0 : 0; will stop at (end)
+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)
diff --git a/packs/careers/MANIFEST-000951 b/packs/careers/MANIFEST-000967
similarity index 72%
rename from packs/careers/MANIFEST-000951
rename to packs/careers/MANIFEST-000967
index 046de89..0f461ff 100644
Binary files a/packs/careers/MANIFEST-000951 and b/packs/careers/MANIFEST-000967 differ
diff --git a/packs/effets-exemples/000951.log b/packs/effets-exemples/000966.log
similarity index 100%
rename from packs/effets-exemples/000951.log
rename to packs/effets-exemples/000966.log
diff --git a/packs/effets-exemples/CURRENT b/packs/effets-exemples/CURRENT
index 0e7b448..8bac917 100644
--- a/packs/effets-exemples/CURRENT
+++ b/packs/effets-exemples/CURRENT
@@ -1 +1 @@
-MANIFEST-000949
+MANIFEST-000965
diff --git a/packs/effets-exemples/LOG b/packs/effets-exemples/LOG
index 521dcc0..fcc53ce 100644
--- a/packs/effets-exemples/LOG
+++ b/packs/effets-exemples/LOG
@@ -1,8 +1,3 @@
-2026/01/05-17:48:52.884139 7f93eaffd6c0 Recovering log #947
-2026/01/05-17:48:52.893984 7f93eaffd6c0 Delete type=3 #945
-2026/01/05-17:48:52.894046 7f93eaffd6c0 Delete type=0 #947
-2026/01/05-18:46:08.224243 7f93e9ffb6c0 Level-0 table #952: started
-2026/01/05-18:46:08.224281 7f93e9ffb6c0 Level-0 table #952: 0 bytes OK
-2026/01/05-18:46:08.230395 7f93e9ffb6c0 Delete type=0 #950
-2026/01/05-18:46:08.244434 7f93e9ffb6c0 Manual compaction at level-0 from '!items!6fTZ6hOKR4pWbWOe' @ 72057594037927935 : 1 .. '!items!zwSNMO9HpiqUCMt8' @ 0 : 0; will stop at (end)
-2026/01/05-18:46:08.244477 7f93e9ffb6c0 Manual compaction at level-1 from '!items!6fTZ6hOKR4pWbWOe' @ 72057594037927935 : 1 .. '!items!zwSNMO9HpiqUCMt8' @ 0 : 0; will stop at (end)
+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
diff --git a/packs/effets-exemples/LOG.old b/packs/effets-exemples/LOG.old
index b19b1e0..ad6a2d6 100644
--- a/packs/effets-exemples/LOG.old
+++ b/packs/effets-exemples/LOG.old
@@ -1,8 +1,8 @@
-2026/01/04-21:27:06.242012 7f93ea7fc6c0 Recovering log #943
-2026/01/04-21:27:06.252013 7f93ea7fc6c0 Delete type=3 #941
-2026/01/04-21:27:06.252066 7f93ea7fc6c0 Delete type=0 #943
-2026/01/04-21:27:09.390639 7f93e9ffb6c0 Level-0 table #948: started
-2026/01/04-21:27:09.390658 7f93e9ffb6c0 Level-0 table #948: 0 bytes OK
-2026/01/04-21:27:09.396811 7f93e9ffb6c0 Delete type=0 #946
-2026/01/04-21:27:09.410812 7f93e9ffb6c0 Manual compaction at level-0 from '!items!6fTZ6hOKR4pWbWOe' @ 72057594037927935 : 1 .. '!items!zwSNMO9HpiqUCMt8' @ 0 : 0; will stop at (end)
-2026/01/04-21:27:09.410834 7f93e9ffb6c0 Manual compaction at level-1 from '!items!6fTZ6hOKR4pWbWOe' @ 72057594037927935 : 1 .. '!items!zwSNMO9HpiqUCMt8' @ 0 : 0; will stop at (end)
+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)
diff --git a/packs/effets-exemples/MANIFEST-000949 b/packs/effets-exemples/MANIFEST-000965
similarity index 73%
rename from packs/effets-exemples/MANIFEST-000949
rename to packs/effets-exemples/MANIFEST-000965
index 380ea35..efa040c 100644
Binary files a/packs/effets-exemples/MANIFEST-000949 and b/packs/effets-exemples/MANIFEST-000965 differ
diff --git a/packs/equipment/000954.log b/packs/equipment/000969.log
similarity index 100%
rename from packs/equipment/000954.log
rename to packs/equipment/000969.log
diff --git a/packs/equipment/CURRENT b/packs/equipment/CURRENT
index 9c629f1..0a8f1fe 100644
--- a/packs/equipment/CURRENT
+++ b/packs/equipment/CURRENT
@@ -1 +1 @@
-MANIFEST-000952
+MANIFEST-000968
diff --git a/packs/equipment/LOG b/packs/equipment/LOG
index 747717f..08bd1d6 100644
--- a/packs/equipment/LOG
+++ b/packs/equipment/LOG
@@ -1,8 +1,3 @@
-2026/01/05-17:48:52.742838 7f93eaffd6c0 Recovering log #950
-2026/01/05-17:48:52.753021 7f93eaffd6c0 Delete type=3 #948
-2026/01/05-17:48:52.753070 7f93eaffd6c0 Delete type=0 #950
-2026/01/05-18:46:08.151562 7f93e9ffb6c0 Level-0 table #955: started
-2026/01/05-18:46:08.151582 7f93e9ffb6c0 Level-0 table #955: 0 bytes OK
-2026/01/05-18:46:08.157521 7f93e9ffb6c0 Delete type=0 #953
-2026/01/05-18:46:08.165132 7f93e9ffb6c0 Manual compaction at level-0 from '!items!0ErhyqifZLDCmMfT' @ 72057594037927935 : 1 .. '!items!yE8UH6YAgNGjKDEu' @ 0 : 0; will stop at (end)
-2026/01/05-18:46:08.165154 7f93e9ffb6c0 Manual compaction at level-1 from '!items!0ErhyqifZLDCmMfT' @ 72057594037927935 : 1 .. '!items!yE8UH6YAgNGjKDEu' @ 0 : 0; will stop at (end)
+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
diff --git a/packs/equipment/LOG.old b/packs/equipment/LOG.old
index 48b8523..8500baa 100644
--- a/packs/equipment/LOG.old
+++ b/packs/equipment/LOG.old
@@ -1,8 +1,8 @@
-2026/01/04-21:27:06.103266 7f93eb7fe6c0 Recovering log #946
-2026/01/04-21:27:06.114180 7f93eb7fe6c0 Delete type=3 #944
-2026/01/04-21:27:06.114255 7f93eb7fe6c0 Delete type=0 #946
-2026/01/04-21:27:09.322146 7f93e9ffb6c0 Level-0 table #951: started
-2026/01/04-21:27:09.322167 7f93e9ffb6c0 Level-0 table #951: 0 bytes OK
-2026/01/04-21:27:09.329148 7f93e9ffb6c0 Delete type=0 #949
-2026/01/04-21:27:09.329383 7f93e9ffb6c0 Manual compaction at level-0 from '!items!0ErhyqifZLDCmMfT' @ 72057594037927935 : 1 .. '!items!yE8UH6YAgNGjKDEu' @ 0 : 0; will stop at (end)
-2026/01/04-21:27:09.329422 7f93e9ffb6c0 Manual compaction at level-1 from '!items!0ErhyqifZLDCmMfT' @ 72057594037927935 : 1 .. '!items!yE8UH6YAgNGjKDEu' @ 0 : 0; will stop at (end)
+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)
diff --git a/packs/equipment/MANIFEST-000952 b/packs/equipment/MANIFEST-000968
similarity index 73%
rename from packs/equipment/MANIFEST-000952
rename to packs/equipment/MANIFEST-000968
index f99abfc..c3e66d5 100644
Binary files a/packs/equipment/MANIFEST-000952 and b/packs/equipment/MANIFEST-000968 differ
diff --git a/packs/fightoptions/000953.log b/packs/fightoptions/000968.log
similarity index 100%
rename from packs/fightoptions/000953.log
rename to packs/fightoptions/000968.log
diff --git a/packs/fightoptions/CURRENT b/packs/fightoptions/CURRENT
index a502202..0165034 100644
--- a/packs/fightoptions/CURRENT
+++ b/packs/fightoptions/CURRENT
@@ -1 +1 @@
-MANIFEST-000951
+MANIFEST-000967
diff --git a/packs/fightoptions/LOG b/packs/fightoptions/LOG
index a6e121d..3f7467a 100644
--- a/packs/fightoptions/LOG
+++ b/packs/fightoptions/LOG
@@ -1,8 +1,3 @@
-2026/01/05-17:48:52.833468 7f93eb7fe6c0 Recovering log #949
-2026/01/05-17:48:52.842854 7f93eb7fe6c0 Delete type=3 #947
-2026/01/05-17:48:52.842916 7f93eb7fe6c0 Delete type=0 #949
-2026/01/05-18:46:08.210715 7f93e9ffb6c0 Level-0 table #954: started
-2026/01/05-18:46:08.210743 7f93e9ffb6c0 Level-0 table #954: 0 bytes OK
-2026/01/05-18:46:08.216985 7f93e9ffb6c0 Delete type=0 #952
-2026/01/05-18:46:08.217118 7f93e9ffb6c0 Manual compaction at level-0 from '!items!AoT2c0af4lY6aBsx' @ 72057594037927935 : 1 .. '!items!vGydqADwTsHZ9B3j' @ 0 : 0; will stop at (end)
-2026/01/05-18:46:08.217151 7f93e9ffb6c0 Manual compaction at level-1 from '!items!AoT2c0af4lY6aBsx' @ 72057594037927935 : 1 .. '!items!vGydqADwTsHZ9B3j' @ 0 : 0; will stop at (end)
+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
diff --git a/packs/fightoptions/LOG.old b/packs/fightoptions/LOG.old
index c3271d4..57bce28 100644
--- a/packs/fightoptions/LOG.old
+++ b/packs/fightoptions/LOG.old
@@ -1,8 +1,8 @@
-2026/01/04-21:27:06.191520 7f93eb7fe6c0 Recovering log #945
-2026/01/04-21:27:06.201833 7f93eb7fe6c0 Delete type=3 #943
-2026/01/04-21:27:06.201898 7f93eb7fe6c0 Delete type=0 #945
-2026/01/04-21:27:09.363375 7f93e9ffb6c0 Level-0 table #950: started
-2026/01/04-21:27:09.363409 7f93e9ffb6c0 Level-0 table #950: 0 bytes OK
-2026/01/04-21:27:09.370710 7f93e9ffb6c0 Delete type=0 #948
-2026/01/04-21:27:09.384119 7f93e9ffb6c0 Manual compaction at level-0 from '!items!AoT2c0af4lY6aBsx' @ 72057594037927935 : 1 .. '!items!vGydqADwTsHZ9B3j' @ 0 : 0; will stop at (end)
-2026/01/04-21:27:09.384146 7f93e9ffb6c0 Manual compaction at level-1 from '!items!AoT2c0af4lY6aBsx' @ 72057594037927935 : 1 .. '!items!vGydqADwTsHZ9B3j' @ 0 : 0; will stop at (end)
+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)
diff --git a/packs/fightoptions/MANIFEST-000951 b/packs/fightoptions/MANIFEST-000967
similarity index 73%
rename from packs/fightoptions/MANIFEST-000951
rename to packs/fightoptions/MANIFEST-000967
index 0324c78..e46078e 100644
Binary files a/packs/fightoptions/MANIFEST-000951 and b/packs/fightoptions/MANIFEST-000967 differ
diff --git a/packs/fightoptionsfanmade/000436.log b/packs/fightoptionsfanmade/000451.log
similarity index 100%
rename from packs/fightoptionsfanmade/000436.log
rename to packs/fightoptionsfanmade/000451.log
diff --git a/packs/fightoptionsfanmade/CURRENT b/packs/fightoptionsfanmade/CURRENT
index f9a97cb..cf972fb 100644
--- a/packs/fightoptionsfanmade/CURRENT
+++ b/packs/fightoptionsfanmade/CURRENT
@@ -1 +1 @@
-MANIFEST-000434
+MANIFEST-000450
diff --git a/packs/fightoptionsfanmade/LOG b/packs/fightoptionsfanmade/LOG
index 8e1abb4..d9e8fe8 100644
--- a/packs/fightoptionsfanmade/LOG
+++ b/packs/fightoptionsfanmade/LOG
@@ -1,8 +1,3 @@
-2026/01/05-17:48:52.845257 7f93eaffd6c0 Recovering log #432
-2026/01/05-17:48:52.856086 7f93eaffd6c0 Delete type=3 #430
-2026/01/05-17:48:52.856148 7f93eaffd6c0 Delete type=0 #432
-2026/01/05-18:46:08.197169 7f93e9ffb6c0 Level-0 table #437: started
-2026/01/05-18:46:08.197189 7f93e9ffb6c0 Level-0 table #437: 0 bytes OK
-2026/01/05-18:46:08.204388 7f93e9ffb6c0 Delete type=0 #435
-2026/01/05-18:46:08.217099 7f93e9ffb6c0 Manual compaction at level-0 from '!items!CLRp0k5qV8mD03pW' @ 72057594037927935 : 1 .. '!items!wYEpnhbyYaMkaNdL' @ 0 : 0; will stop at (end)
-2026/01/05-18:46:08.217134 7f93e9ffb6c0 Manual compaction at level-1 from '!items!CLRp0k5qV8mD03pW' @ 72057594037927935 : 1 .. '!items!wYEpnhbyYaMkaNdL' @ 0 : 0; will stop at (end)
+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
diff --git a/packs/fightoptionsfanmade/LOG.old b/packs/fightoptionsfanmade/LOG.old
index 50f22ef..7cbcaa1 100644
--- a/packs/fightoptionsfanmade/LOG.old
+++ b/packs/fightoptionsfanmade/LOG.old
@@ -1,8 +1,8 @@
-2026/01/04-21:27:06.203697 7f93eaffd6c0 Recovering log #428
-2026/01/04-21:27:06.214195 7f93eaffd6c0 Delete type=3 #426
-2026/01/04-21:27:06.214286 7f93eaffd6c0 Delete type=0 #428
-2026/01/04-21:27:09.377290 7f93e9ffb6c0 Level-0 table #433: started
-2026/01/04-21:27:09.377314 7f93e9ffb6c0 Level-0 table #433: 0 bytes OK
-2026/01/04-21:27:09.383925 7f93e9ffb6c0 Delete type=0 #431
-2026/01/04-21:27:09.384140 7f93e9ffb6c0 Manual compaction at level-0 from '!items!CLRp0k5qV8mD03pW' @ 72057594037927935 : 1 .. '!items!wYEpnhbyYaMkaNdL' @ 0 : 0; will stop at (end)
-2026/01/04-21:27:09.384156 7f93e9ffb6c0 Manual compaction at level-1 from '!items!CLRp0k5qV8mD03pW' @ 72057594037927935 : 1 .. '!items!wYEpnhbyYaMkaNdL' @ 0 : 0; will stop at (end)
+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)
diff --git a/packs/fightoptionsfanmade/MANIFEST-000434 b/packs/fightoptionsfanmade/MANIFEST-000450
similarity index 73%
rename from packs/fightoptionsfanmade/MANIFEST-000434
rename to packs/fightoptionsfanmade/MANIFEST-000450
index a7972ca..5e5a186 100644
Binary files a/packs/fightoptionsfanmade/MANIFEST-000434 and b/packs/fightoptionsfanmade/MANIFEST-000450 differ
diff --git a/packs/flaws/000954.log b/packs/flaws/000969.log
similarity index 100%
rename from packs/flaws/000954.log
rename to packs/flaws/000969.log
diff --git a/packs/flaws/CURRENT b/packs/flaws/CURRENT
index 9c629f1..0a8f1fe 100644
--- a/packs/flaws/CURRENT
+++ b/packs/flaws/CURRENT
@@ -1 +1 @@
-MANIFEST-000952
+MANIFEST-000968
diff --git a/packs/flaws/LOG b/packs/flaws/LOG
index b3f66d1..c2ce08a 100644
--- a/packs/flaws/LOG
+++ b/packs/flaws/LOG
@@ -1,8 +1,3 @@
-2026/01/05-17:48:52.690354 7f93eb7fe6c0 Recovering log #950
-2026/01/05-17:48:52.699681 7f93eb7fe6c0 Delete type=3 #948
-2026/01/05-17:48:52.699755 7f93eb7fe6c0 Delete type=0 #950
-2026/01/05-18:46:08.119311 7f93e9ffb6c0 Level-0 table #955: started
-2026/01/05-18:46:08.119337 7f93e9ffb6c0 Level-0 table #955: 0 bytes OK
-2026/01/05-18:46:08.125254 7f93e9ffb6c0 Delete type=0 #953
-2026/01/05-18:46:08.138743 7f93e9ffb6c0 Manual compaction at level-0 from '!items!0wCqg1UpGd50uJrS' @ 72057594037927935 : 1 .. '!items!znd0K3b7HzYpdehs' @ 0 : 0; will stop at (end)
-2026/01/05-18:46:08.138788 7f93e9ffb6c0 Manual compaction at level-1 from '!items!0wCqg1UpGd50uJrS' @ 72057594037927935 : 1 .. '!items!znd0K3b7HzYpdehs' @ 0 : 0; will stop at (end)
+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
diff --git a/packs/flaws/LOG.old b/packs/flaws/LOG.old
index 341a677..22024c6 100644
--- a/packs/flaws/LOG.old
+++ b/packs/flaws/LOG.old
@@ -1,8 +1,8 @@
-2026/01/04-21:27:06.053584 7f93eb7fe6c0 Recovering log #946
-2026/01/04-21:27:06.063134 7f93eb7fe6c0 Delete type=3 #944
-2026/01/04-21:27:06.063198 7f93eb7fe6c0 Delete type=0 #946
-2026/01/04-21:27:09.281778 7f93e9ffb6c0 Level-0 table #951: started
-2026/01/04-21:27:09.281804 7f93e9ffb6c0 Level-0 table #951: 0 bytes OK
-2026/01/04-21:27:09.288063 7f93e9ffb6c0 Delete type=0 #949
-2026/01/04-21:27:09.302185 7f93e9ffb6c0 Manual compaction at level-0 from '!items!0wCqg1UpGd50uJrS' @ 72057594037927935 : 1 .. '!items!znd0K3b7HzYpdehs' @ 0 : 0; will stop at (end)
-2026/01/04-21:27:09.302218 7f93e9ffb6c0 Manual compaction at level-1 from '!items!0wCqg1UpGd50uJrS' @ 72057594037927935 : 1 .. '!items!znd0K3b7HzYpdehs' @ 0 : 0; will stop at (end)
+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)
diff --git a/packs/flaws/MANIFEST-000952 b/packs/flaws/MANIFEST-000968
similarity index 72%
rename from packs/flaws/MANIFEST-000952
rename to packs/flaws/MANIFEST-000968
index 0b8c33f..87fa11e 100644
Binary files a/packs/flaws/MANIFEST-000952 and b/packs/flaws/MANIFEST-000968 differ
diff --git a/packs/languages/000953.log b/packs/languages/000968.log
similarity index 100%
rename from packs/languages/000953.log
rename to packs/languages/000968.log
diff --git a/packs/languages/CURRENT b/packs/languages/CURRENT
index a502202..0165034 100644
--- a/packs/languages/CURRENT
+++ b/packs/languages/CURRENT
@@ -1 +1 @@
-MANIFEST-000951
+MANIFEST-000967
diff --git a/packs/languages/LOG b/packs/languages/LOG
index 6a537df..e86b2ab 100644
--- a/packs/languages/LOG
+++ b/packs/languages/LOG
@@ -1,8 +1,3 @@
-2026/01/05-17:48:52.807826 7f93eaffd6c0 Recovering log #949
-2026/01/05-17:48:52.818309 7f93eaffd6c0 Delete type=3 #947
-2026/01/05-17:48:52.818361 7f93eaffd6c0 Delete type=0 #949
-2026/01/05-18:46:08.177467 7f93e9ffb6c0 Level-0 table #954: started
-2026/01/05-18:46:08.177494 7f93e9ffb6c0 Level-0 table #954: 0 bytes OK
-2026/01/05-18:46:08.184298 7f93e9ffb6c0 Delete type=0 #952
-2026/01/05-18:46:08.190797 7f93e9ffb6c0 Manual compaction at level-0 from '!items!46qF6OBN5gf0dqWc' @ 72057594037927935 : 1 .. '!items!vaAQiuAHdyQrQiUX' @ 0 : 0; will stop at (end)
-2026/01/05-18:46:08.190831 7f93e9ffb6c0 Manual compaction at level-1 from '!items!46qF6OBN5gf0dqWc' @ 72057594037927935 : 1 .. '!items!vaAQiuAHdyQrQiUX' @ 0 : 0; will stop at (end)
+2026/01/13-08:07:30.213893 7fad363fd6c0 Recovering log #965
+2026/01/13-08:07:30.225009 7fad363fd6c0 Delete type=3 #963
+2026/01/13-08:07:30.225096 7fad363fd6c0 Delete type=0 #965
diff --git a/packs/languages/LOG.old b/packs/languages/LOG.old
index d041f80..9ec6f11 100644
--- a/packs/languages/LOG.old
+++ b/packs/languages/LOG.old
@@ -1,8 +1,8 @@
-2026/01/04-21:27:06.165893 7f93eaffd6c0 Recovering log #945
-2026/01/04-21:27:06.176844 7f93eaffd6c0 Delete type=3 #943
-2026/01/04-21:27:06.176887 7f93eaffd6c0 Delete type=0 #945
-2026/01/04-21:27:09.356897 7f93e9ffb6c0 Level-0 table #950: started
-2026/01/04-21:27:09.356917 7f93e9ffb6c0 Level-0 table #950: 0 bytes OK
-2026/01/04-21:27:09.363118 7f93e9ffb6c0 Delete type=0 #948
-2026/01/04-21:27:09.384107 7f93e9ffb6c0 Manual compaction at level-0 from '!items!46qF6OBN5gf0dqWc' @ 72057594037927935 : 1 .. '!items!vaAQiuAHdyQrQiUX' @ 0 : 0; will stop at (end)
-2026/01/04-21:27:09.384135 7f93e9ffb6c0 Manual compaction at level-1 from '!items!46qF6OBN5gf0dqWc' @ 72057594037927935 : 1 .. '!items!vaAQiuAHdyQrQiUX' @ 0 : 0; will stop at (end)
+2026/01/13-00:31:14.372945 7fad363fd6c0 Recovering log #961
+2026/01/13-00:31:14.383623 7fad363fd6c0 Delete type=3 #959
+2026/01/13-00:31:14.383679 7fad363fd6c0 Delete type=0 #961
+2026/01/13-00:33:18.096825 7fad353fb6c0 Level-0 table #966: started
+2026/01/13-00:33:18.096859 7fad353fb6c0 Level-0 table #966: 0 bytes OK
+2026/01/13-00:33:18.103126 7fad353fb6c0 Delete type=0 #964
+2026/01/13-00:33:18.110872 7fad353fb6c0 Manual compaction at level-0 from '!items!46qF6OBN5gf0dqWc' @ 72057594037927935 : 1 .. '!items!vaAQiuAHdyQrQiUX' @ 0 : 0; will stop at (end)
+2026/01/13-00:33:18.110920 7fad353fb6c0 Manual compaction at level-1 from '!items!46qF6OBN5gf0dqWc' @ 72057594037927935 : 1 .. '!items!vaAQiuAHdyQrQiUX' @ 0 : 0; will stop at (end)
diff --git a/packs/languages/MANIFEST-000951 b/packs/languages/MANIFEST-000967
similarity index 73%
rename from packs/languages/MANIFEST-000951
rename to packs/languages/MANIFEST-000967
index 78be5c3..f67f301 100644
Binary files a/packs/languages/MANIFEST-000951 and b/packs/languages/MANIFEST-000967 differ
diff --git a/packs/objets-alchimie/000953.log b/packs/objets-alchimie/000968.log
similarity index 100%
rename from packs/objets-alchimie/000953.log
rename to packs/objets-alchimie/000968.log
diff --git a/packs/objets-alchimie/CURRENT b/packs/objets-alchimie/CURRENT
index a502202..0165034 100644
--- a/packs/objets-alchimie/CURRENT
+++ b/packs/objets-alchimie/CURRENT
@@ -1 +1 @@
-MANIFEST-000951
+MANIFEST-000967
diff --git a/packs/objets-alchimie/LOG b/packs/objets-alchimie/LOG
index 8be9c79..4de586a 100644
--- a/packs/objets-alchimie/LOG
+++ b/packs/objets-alchimie/LOG
@@ -1,8 +1,3 @@
-2026/01/05-17:48:52.871507 7f93ebfff6c0 Recovering log #949
-2026/01/05-17:48:52.880964 7f93ebfff6c0 Delete type=3 #947
-2026/01/05-17:48:52.881025 7f93ebfff6c0 Delete type=0 #949
-2026/01/05-18:46:08.217216 7f93e9ffb6c0 Level-0 table #954: started
-2026/01/05-18:46:08.217255 7f93e9ffb6c0 Level-0 table #954: 0 bytes OK
-2026/01/05-18:46:08.224112 7f93e9ffb6c0 Delete type=0 #952
-2026/01/05-18:46:08.244422 7f93e9ffb6c0 Manual compaction at level-0 from '!items!0Yhn3r8AFsKXEKeS' @ 72057594037927935 : 1 .. '!items!xVWrSPiX0Nwccsn6' @ 0 : 0; will stop at (end)
-2026/01/05-18:46:08.244461 7f93e9ffb6c0 Manual compaction at level-1 from '!items!0Yhn3r8AFsKXEKeS' @ 72057594037927935 : 1 .. '!items!xVWrSPiX0Nwccsn6' @ 0 : 0; will stop at (end)
+2026/01/13-08:07:30.285456 7fad373ff6c0 Recovering log #965
+2026/01/13-08:07:30.295903 7fad373ff6c0 Delete type=3 #963
+2026/01/13-08:07:30.295998 7fad373ff6c0 Delete type=0 #965
diff --git a/packs/objets-alchimie/LOG.old b/packs/objets-alchimie/LOG.old
index f214ffd..b6bf755 100644
--- a/packs/objets-alchimie/LOG.old
+++ b/packs/objets-alchimie/LOG.old
@@ -1,8 +1,8 @@
-2026/01/04-21:27:06.229799 7f93eb7fe6c0 Recovering log #945
-2026/01/04-21:27:06.240212 7f93eb7fe6c0 Delete type=3 #943
-2026/01/04-21:27:06.240271 7f93eb7fe6c0 Delete type=0 #945
-2026/01/04-21:27:09.384243 7f93e9ffb6c0 Level-0 table #950: started
-2026/01/04-21:27:09.384266 7f93e9ffb6c0 Level-0 table #950: 0 bytes OK
-2026/01/04-21:27:09.390516 7f93e9ffb6c0 Delete type=0 #948
-2026/01/04-21:27:09.410801 7f93e9ffb6c0 Manual compaction at level-0 from '!items!0Yhn3r8AFsKXEKeS' @ 72057594037927935 : 1 .. '!items!xVWrSPiX0Nwccsn6' @ 0 : 0; will stop at (end)
-2026/01/04-21:27:09.410839 7f93e9ffb6c0 Manual compaction at level-1 from '!items!0Yhn3r8AFsKXEKeS' @ 72057594037927935 : 1 .. '!items!xVWrSPiX0Nwccsn6' @ 0 : 0; will stop at (end)
+2026/01/13-00:31:14.434032 7fad36bfe6c0 Recovering log #961
+2026/01/13-00:31:14.444388 7fad36bfe6c0 Delete type=3 #959
+2026/01/13-00:31:14.444475 7fad36bfe6c0 Delete type=0 #961
+2026/01/13-00:33:18.158035 7fad353fb6c0 Level-0 table #966: started
+2026/01/13-00:33:18.158068 7fad353fb6c0 Level-0 table #966: 0 bytes OK
+2026/01/13-00:33:18.164518 7fad353fb6c0 Delete type=0 #964
+2026/01/13-00:33:18.164715 7fad353fb6c0 Manual compaction at level-0 from '!items!0Yhn3r8AFsKXEKeS' @ 72057594037927935 : 1 .. '!items!xVWrSPiX0Nwccsn6' @ 0 : 0; will stop at (end)
+2026/01/13-00:33:18.164827 7fad353fb6c0 Manual compaction at level-1 from '!items!0Yhn3r8AFsKXEKeS' @ 72057594037927935 : 1 .. '!items!xVWrSPiX0Nwccsn6' @ 0 : 0; will stop at (end)
diff --git a/packs/objets-alchimie/MANIFEST-000951 b/packs/objets-alchimie/MANIFEST-000967
similarity index 73%
rename from packs/objets-alchimie/MANIFEST-000951
rename to packs/objets-alchimie/MANIFEST-000967
index 768b596..3fd940a 100644
Binary files a/packs/objets-alchimie/MANIFEST-000951 and b/packs/objets-alchimie/MANIFEST-000967 differ
diff --git a/packs/origins/000953.log b/packs/origins/000968.log
similarity index 100%
rename from packs/origins/000953.log
rename to packs/origins/000968.log
diff --git a/packs/origins/CURRENT b/packs/origins/CURRENT
index a502202..0165034 100644
--- a/packs/origins/CURRENT
+++ b/packs/origins/CURRENT
@@ -1 +1 @@
-MANIFEST-000951
+MANIFEST-000967
diff --git a/packs/origins/LOG b/packs/origins/LOG
index ed763d3..94994da 100644
--- a/packs/origins/LOG
+++ b/packs/origins/LOG
@@ -1,8 +1,3 @@
-2026/01/05-17:48:52.716239 7f93ebfff6c0 Recovering log #949
-2026/01/05-17:48:52.726724 7f93ebfff6c0 Delete type=3 #947
-2026/01/05-17:48:52.726801 7f93ebfff6c0 Delete type=0 #949
-2026/01/05-18:46:08.125364 7f93e9ffb6c0 Level-0 table #954: started
-2026/01/05-18:46:08.125394 7f93e9ffb6c0 Level-0 table #954: 0 bytes OK
-2026/01/05-18:46:08.131273 7f93e9ffb6c0 Delete type=0 #952
-2026/01/05-18:46:08.138754 7f93e9ffb6c0 Manual compaction at level-0 from '!items!2Wtl8xrKf46LMwBF' @ 72057594037927935 : 1 .. '!items!zIlZmEd9WAA473UX' @ 0 : 0; will stop at (end)
-2026/01/05-18:46:08.138782 7f93e9ffb6c0 Manual compaction at level-1 from '!items!2Wtl8xrKf46LMwBF' @ 72057594037927935 : 1 .. '!items!zIlZmEd9WAA473UX' @ 0 : 0; will stop at (end)
+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
diff --git a/packs/origins/LOG.old b/packs/origins/LOG.old
index 8a81749..905528d 100644
--- a/packs/origins/LOG.old
+++ b/packs/origins/LOG.old
@@ -1,8 +1,8 @@
-2026/01/04-21:27:06.079934 7f93ebfff6c0 Recovering log #945
-2026/01/04-21:27:06.089772 7f93ebfff6c0 Delete type=3 #943
-2026/01/04-21:27:06.089841 7f93ebfff6c0 Delete type=0 #945
-2026/01/04-21:27:09.315621 7f93e9ffb6c0 Level-0 table #950: started
-2026/01/04-21:27:09.315639 7f93e9ffb6c0 Level-0 table #950: 0 bytes OK
-2026/01/04-21:27:09.322011 7f93e9ffb6c0 Delete type=0 #948
-2026/01/04-21:27:09.329370 7f93e9ffb6c0 Manual compaction at level-0 from '!items!2Wtl8xrKf46LMwBF' @ 72057594037927935 : 1 .. '!items!zIlZmEd9WAA473UX' @ 0 : 0; will stop at (end)
-2026/01/04-21:27:09.329412 7f93e9ffb6c0 Manual compaction at level-1 from '!items!2Wtl8xrKf46LMwBF' @ 72057594037927935 : 1 .. '!items!zIlZmEd9WAA473UX' @ 0 : 0; will stop at (end)
+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)
diff --git a/packs/origins/MANIFEST-000951 b/packs/origins/MANIFEST-000967
similarity index 72%
rename from packs/origins/MANIFEST-000951
rename to packs/origins/MANIFEST-000967
index 4a4d814..2f1d810 100644
Binary files a/packs/origins/MANIFEST-000951 and b/packs/origins/MANIFEST-000967 differ
diff --git a/packs/potions-alchimie/000953.log b/packs/potions-alchimie/000968.log
similarity index 100%
rename from packs/potions-alchimie/000953.log
rename to packs/potions-alchimie/000968.log
diff --git a/packs/potions-alchimie/CURRENT b/packs/potions-alchimie/CURRENT
index a502202..0165034 100644
--- a/packs/potions-alchimie/CURRENT
+++ b/packs/potions-alchimie/CURRENT
@@ -1 +1 @@
-MANIFEST-000951
+MANIFEST-000967
diff --git a/packs/potions-alchimie/LOG b/packs/potions-alchimie/LOG
index eb1a8da..9aaab5b 100644
--- a/packs/potions-alchimie/LOG
+++ b/packs/potions-alchimie/LOG
@@ -1,8 +1,3 @@
-2026/01/05-17:48:52.858535 7f93ea7fc6c0 Recovering log #949
-2026/01/05-17:48:52.868966 7f93ea7fc6c0 Delete type=3 #947
-2026/01/05-17:48:52.869018 7f93ea7fc6c0 Delete type=0 #949
-2026/01/05-18:46:08.204517 7f93e9ffb6c0 Level-0 table #954: started
-2026/01/05-18:46:08.204543 7f93e9ffb6c0 Level-0 table #954: 0 bytes OK
-2026/01/05-18:46:08.210602 7f93e9ffb6c0 Delete type=0 #952
-2026/01/05-18:46:08.217110 7f93e9ffb6c0 Manual compaction at level-0 from '!items!0a8UFoCOd3D35WBb' @ 72057594037927935 : 1 .. '!items!y9NHZCxKXMZEqcRo' @ 0 : 0; will stop at (end)
-2026/01/05-18:46:08.217142 7f93e9ffb6c0 Manual compaction at level-1 from '!items!0a8UFoCOd3D35WBb' @ 72057594037927935 : 1 .. '!items!y9NHZCxKXMZEqcRo' @ 0 : 0; will stop at (end)
+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
diff --git a/packs/potions-alchimie/LOG.old b/packs/potions-alchimie/LOG.old
index c27ea04..6208e1c 100644
--- a/packs/potions-alchimie/LOG.old
+++ b/packs/potions-alchimie/LOG.old
@@ -1,8 +1,8 @@
-2026/01/04-21:27:06.217814 7f93ebfff6c0 Recovering log #945
-2026/01/04-21:27:06.227433 7f93ebfff6c0 Delete type=3 #943
-2026/01/04-21:27:06.227502 7f93ebfff6c0 Delete type=0 #945
-2026/01/04-21:27:09.396966 7f93e9ffb6c0 Level-0 table #950: started
-2026/01/04-21:27:09.396989 7f93e9ffb6c0 Level-0 table #950: 0 bytes OK
-2026/01/04-21:27:09.404237 7f93e9ffb6c0 Delete type=0 #948
-2026/01/04-21:27:09.410820 7f93e9ffb6c0 Manual compaction at level-0 from '!items!0a8UFoCOd3D35WBb' @ 72057594037927935 : 1 .. '!items!y9NHZCxKXMZEqcRo' @ 0 : 0; will stop at (end)
-2026/01/04-21:27:09.410844 7f93e9ffb6c0 Manual compaction at level-1 from '!items!0a8UFoCOd3D35WBb' @ 72057594037927935 : 1 .. '!items!y9NHZCxKXMZEqcRo' @ 0 : 0; will stop at (end)
+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)
diff --git a/packs/potions-alchimie/MANIFEST-000951 b/packs/potions-alchimie/MANIFEST-000967
similarity index 73%
rename from packs/potions-alchimie/MANIFEST-000951
rename to packs/potions-alchimie/MANIFEST-000967
index cec5d79..d1528ab 100644
Binary files a/packs/potions-alchimie/MANIFEST-000951 and b/packs/potions-alchimie/MANIFEST-000967 differ
diff --git a/packs/races/000953.log b/packs/races/000968.log
similarity index 100%
rename from packs/races/000953.log
rename to packs/races/000968.log
diff --git a/packs/races/CURRENT b/packs/races/CURRENT
index a502202..0165034 100644
--- a/packs/races/CURRENT
+++ b/packs/races/CURRENT
@@ -1 +1 @@
-MANIFEST-000951
+MANIFEST-000967
diff --git a/packs/races/LOG b/packs/races/LOG
index 7a3ac24..4ff7b7c 100644
--- a/packs/races/LOG
+++ b/packs/races/LOG
@@ -1,8 +1,3 @@
-2026/01/05-17:48:52.729935 7f93eb7fe6c0 Recovering log #949
-2026/01/05-17:48:52.739671 7f93eb7fe6c0 Delete type=3 #947
-2026/01/05-17:48:52.739719 7f93eb7fe6c0 Delete type=0 #949
-2026/01/05-18:46:08.138907 7f93e9ffb6c0 Level-0 table #954: started
-2026/01/05-18:46:08.138943 7f93e9ffb6c0 Level-0 table #954: 0 bytes OK
-2026/01/05-18:46:08.145513 7f93e9ffb6c0 Delete type=0 #952
-2026/01/05-18:46:08.165115 7f93e9ffb6c0 Manual compaction at level-0 from '!items!3oOvUd7AIqrXzLDl' @ 72057594037927935 : 1 .. '!items!oWexVALVtDXmedMy' @ 0 : 0; will stop at (end)
-2026/01/05-18:46:08.165144 7f93e9ffb6c0 Manual compaction at level-1 from '!items!3oOvUd7AIqrXzLDl' @ 72057594037927935 : 1 .. '!items!oWexVALVtDXmedMy' @ 0 : 0; will stop at (end)
+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
diff --git a/packs/races/LOG.old b/packs/races/LOG.old
index 9e07feb..415364e 100644
--- a/packs/races/LOG.old
+++ b/packs/races/LOG.old
@@ -1,8 +1,8 @@
-2026/01/04-21:27:06.091659 7f93eaffd6c0 Recovering log #945
-2026/01/04-21:27:06.101173 7f93eaffd6c0 Delete type=3 #943
-2026/01/04-21:27:06.101239 7f93eaffd6c0 Delete type=0 #945
-2026/01/04-21:27:09.309260 7f93e9ffb6c0 Level-0 table #950: started
-2026/01/04-21:27:09.309282 7f93e9ffb6c0 Level-0 table #950: 0 bytes OK
-2026/01/04-21:27:09.315491 7f93e9ffb6c0 Delete type=0 #948
-2026/01/04-21:27:09.329355 7f93e9ffb6c0 Manual compaction at level-0 from '!items!3oOvUd7AIqrXzLDl' @ 72057594037927935 : 1 .. '!items!oWexVALVtDXmedMy' @ 0 : 0; will stop at (end)
-2026/01/04-21:27:09.329403 7f93e9ffb6c0 Manual compaction at level-1 from '!items!3oOvUd7AIqrXzLDl' @ 72057594037927935 : 1 .. '!items!oWexVALVtDXmedMy' @ 0 : 0; will stop at (end)
+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)
diff --git a/packs/races/MANIFEST-000951 b/packs/races/MANIFEST-000967
similarity index 73%
rename from packs/races/MANIFEST-000951
rename to packs/races/MANIFEST-000967
index 80220d5..d63336a 100644
Binary files a/packs/races/MANIFEST-000951 and b/packs/races/MANIFEST-000967 differ
diff --git a/packs/spells/000953.log b/packs/spells/000968.log
similarity index 100%
rename from packs/spells/000953.log
rename to packs/spells/000968.log
diff --git a/packs/spells/CURRENT b/packs/spells/CURRENT
index a502202..0165034 100644
--- a/packs/spells/CURRENT
+++ b/packs/spells/CURRENT
@@ -1 +1 @@
-MANIFEST-000951
+MANIFEST-000967
diff --git a/packs/spells/LOG b/packs/spells/LOG
index 905cf0d..f95d1bd 100644
--- a/packs/spells/LOG
+++ b/packs/spells/LOG
@@ -1,8 +1,3 @@
-2026/01/05-17:48:52.820379 7f93ea7fc6c0 Recovering log #949
-2026/01/05-17:48:52.830336 7f93ea7fc6c0 Delete type=3 #947
-2026/01/05-17:48:52.830397 7f93ea7fc6c0 Delete type=0 #949
-2026/01/05-18:46:08.190986 7f93e9ffb6c0 Level-0 table #954: started
-2026/01/05-18:46:08.191021 7f93e9ffb6c0 Level-0 table #954: 0 bytes OK
-2026/01/05-18:46:08.197075 7f93e9ffb6c0 Delete type=0 #952
-2026/01/05-18:46:08.217087 7f93e9ffb6c0 Manual compaction at level-0 from '!items!2svd3uio8Hp4e5Wy' @ 72057594037927935 : 1 .. '!items!zq5h9kCpo8gK4oIH' @ 0 : 0; will stop at (end)
-2026/01/05-18:46:08.217126 7f93e9ffb6c0 Manual compaction at level-1 from '!items!2svd3uio8Hp4e5Wy' @ 72057594037927935 : 1 .. '!items!zq5h9kCpo8gK4oIH' @ 0 : 0; will stop at (end)
+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
diff --git a/packs/spells/LOG.old b/packs/spells/LOG.old
index b826238..fa19829 100644
--- a/packs/spells/LOG.old
+++ b/packs/spells/LOG.old
@@ -1,8 +1,8 @@
-2026/01/04-21:27:06.179542 7f93ebfff6c0 Recovering log #945
-2026/01/04-21:27:06.189030 7f93ebfff6c0 Delete type=3 #943
-2026/01/04-21:27:06.189086 7f93ebfff6c0 Delete type=0 #945
-2026/01/04-21:27:09.370839 7f93e9ffb6c0 Level-0 table #950: started
-2026/01/04-21:27:09.370858 7f93e9ffb6c0 Level-0 table #950: 0 bytes OK
-2026/01/04-21:27:09.377184 7f93e9ffb6c0 Delete type=0 #948
-2026/01/04-21:27:09.384128 7f93e9ffb6c0 Manual compaction at level-0 from '!items!2svd3uio8Hp4e5Wy' @ 72057594037927935 : 1 .. '!items!zq5h9kCpo8gK4oIH' @ 0 : 0; will stop at (end)
-2026/01/04-21:27:09.384151 7f93e9ffb6c0 Manual compaction at level-1 from '!items!2svd3uio8Hp4e5Wy' @ 72057594037927935 : 1 .. '!items!zq5h9kCpo8gK4oIH' @ 0 : 0; will stop at (end)
+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)
diff --git a/packs/spells/MANIFEST-000951 b/packs/spells/MANIFEST-000967
similarity index 73%
rename from packs/spells/MANIFEST-000951
rename to packs/spells/MANIFEST-000967
index 686d1de..d0a3be1 100644
Binary files a/packs/spells/MANIFEST-000951 and b/packs/spells/MANIFEST-000967 differ
diff --git a/packs/vehicleweapons/000860.log b/packs/vehicleweapons/000875.log
similarity index 100%
rename from packs/vehicleweapons/000860.log
rename to packs/vehicleweapons/000875.log
diff --git a/packs/vehicleweapons/CURRENT b/packs/vehicleweapons/CURRENT
index b7b5921..7299140 100644
--- a/packs/vehicleweapons/CURRENT
+++ b/packs/vehicleweapons/CURRENT
@@ -1 +1 @@
-MANIFEST-000858
+MANIFEST-000874
diff --git a/packs/vehicleweapons/LOG b/packs/vehicleweapons/LOG
index f932a3c..fe9da81 100644
--- a/packs/vehicleweapons/LOG
+++ b/packs/vehicleweapons/LOG
@@ -1,8 +1,3 @@
-2026/01/05-17:48:52.782653 7f93eaffd6c0 Recovering log #856
-2026/01/05-17:48:52.792738 7f93eaffd6c0 Delete type=3 #854
-2026/01/05-17:48:52.792791 7f93eaffd6c0 Delete type=0 #856
-2026/01/05-18:46:08.171365 7f93e9ffb6c0 Level-0 table #861: started
-2026/01/05-18:46:08.171394 7f93e9ffb6c0 Level-0 table #861: 0 bytes OK
-2026/01/05-18:46:08.177369 7f93e9ffb6c0 Delete type=0 #859
-2026/01/05-18:46:08.190788 7f93e9ffb6c0 Manual compaction at level-0 from '!items!2cqkViQnOYZ4qwU1' @ 72057594037927935 : 1 .. '!items!qcCZxbaV9sucG1XK' @ 0 : 0; will stop at (end)
-2026/01/05-18:46:08.190823 7f93e9ffb6c0 Manual compaction at level-1 from '!items!2cqkViQnOYZ4qwU1' @ 72057594037927935 : 1 .. '!items!qcCZxbaV9sucG1XK' @ 0 : 0; will stop at (end)
+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
diff --git a/packs/vehicleweapons/LOG.old b/packs/vehicleweapons/LOG.old
index 30652be..9ac75ab 100644
--- a/packs/vehicleweapons/LOG.old
+++ b/packs/vehicleweapons/LOG.old
@@ -1,8 +1,8 @@
-2026/01/04-21:27:06.141648 7f93eb7fe6c0 Recovering log #852
-2026/01/04-21:27:06.151472 7f93eb7fe6c0 Delete type=3 #850
-2026/01/04-21:27:06.151534 7f93eb7fe6c0 Delete type=0 #852
-2026/01/04-21:27:09.342982 7f93e9ffb6c0 Level-0 table #857: started
-2026/01/04-21:27:09.343006 7f93e9ffb6c0 Level-0 table #857: 0 bytes OK
-2026/01/04-21:27:09.349253 7f93e9ffb6c0 Delete type=0 #855
-2026/01/04-21:27:09.356802 7f93e9ffb6c0 Manual compaction at level-0 from '!items!2cqkViQnOYZ4qwU1' @ 72057594037927935 : 1 .. '!items!qcCZxbaV9sucG1XK' @ 0 : 0; will stop at (end)
-2026/01/04-21:27:09.356839 7f93e9ffb6c0 Manual compaction at level-1 from '!items!2cqkViQnOYZ4qwU1' @ 72057594037927935 : 1 .. '!items!qcCZxbaV9sucG1XK' @ 0 : 0; will stop at (end)
+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)
diff --git a/packs/vehicleweapons/MANIFEST-000858 b/packs/vehicleweapons/MANIFEST-000874
similarity index 73%
rename from packs/vehicleweapons/MANIFEST-000858
rename to packs/vehicleweapons/MANIFEST-000874
index e188967..fce7286 100644
Binary files a/packs/vehicleweapons/MANIFEST-000858 and b/packs/vehicleweapons/MANIFEST-000874 differ
diff --git a/packs/weapons/000866.log b/packs/weapons/000881.log
similarity index 100%
rename from packs/weapons/000866.log
rename to packs/weapons/000881.log
diff --git a/packs/weapons/CURRENT b/packs/weapons/CURRENT
index 14763f3..5bac171 100644
--- a/packs/weapons/CURRENT
+++ b/packs/weapons/CURRENT
@@ -1 +1 @@
-MANIFEST-000864
+MANIFEST-000880
diff --git a/packs/weapons/LOG b/packs/weapons/LOG
index 98fa39d..66e649e 100644
--- a/packs/weapons/LOG
+++ b/packs/weapons/LOG
@@ -1,8 +1,3 @@
-2026/01/05-17:48:52.756200 7f93ea7fc6c0 Recovering log #862
-2026/01/05-17:48:52.766273 7f93ea7fc6c0 Delete type=3 #860
-2026/01/05-17:48:52.766325 7f93ea7fc6c0 Delete type=0 #862
-2026/01/05-18:46:08.145630 7f93e9ffb6c0 Level-0 table #867: started
-2026/01/05-18:46:08.145652 7f93e9ffb6c0 Level-0 table #867: 0 bytes OK
-2026/01/05-18:46:08.151471 7f93e9ffb6c0 Delete type=0 #865
-2026/01/05-18:46:08.165125 7f93e9ffb6c0 Manual compaction at level-0 from '!items!2xxMC458KXaAgm3T' @ 72057594037927935 : 1 .. '!items!zjOFhNocHjeJZcy4' @ 0 : 0; will stop at (end)
-2026/01/05-18:46:08.165149 7f93e9ffb6c0 Manual compaction at level-1 from '!items!2xxMC458KXaAgm3T' @ 72057594037927935 : 1 .. '!items!zjOFhNocHjeJZcy4' @ 0 : 0; will stop at (end)
+2026/01/13-08:07:30.156659 7fad373ff6c0 Recovering log #878
+2026/01/13-08:07:30.167240 7fad373ff6c0 Delete type=3 #876
+2026/01/13-08:07:30.167330 7fad373ff6c0 Delete type=0 #878
diff --git a/packs/weapons/LOG.old b/packs/weapons/LOG.old
index e1c3f0f..d87e8e7 100644
--- a/packs/weapons/LOG.old
+++ b/packs/weapons/LOG.old
@@ -1,8 +1,8 @@
-2026/01/04-21:27:06.116899 7f93ebfff6c0 Recovering log #858
-2026/01/04-21:27:06.126548 7f93ebfff6c0 Delete type=3 #856
-2026/01/04-21:27:06.126622 7f93ebfff6c0 Delete type=0 #858
-2026/01/04-21:27:09.329504 7f93e9ffb6c0 Level-0 table #863: started
-2026/01/04-21:27:09.329533 7f93e9ffb6c0 Level-0 table #863: 0 bytes OK
-2026/01/04-21:27:09.335948 7f93e9ffb6c0 Delete type=0 #861
-2026/01/04-21:27:09.356784 7f93e9ffb6c0 Manual compaction at level-0 from '!items!2xxMC458KXaAgm3T' @ 72057594037927935 : 1 .. '!items!zjOFhNocHjeJZcy4' @ 0 : 0; will stop at (end)
-2026/01/04-21:27:09.356810 7f93e9ffb6c0 Manual compaction at level-1 from '!items!2xxMC458KXaAgm3T' @ 72057594037927935 : 1 .. '!items!zjOFhNocHjeJZcy4' @ 0 : 0; will stop at (end)
+2026/01/13-00:31:14.323267 7fad35bfc6c0 Recovering log #874
+2026/01/13-00:31:14.332961 7fad35bfc6c0 Delete type=3 #872
+2026/01/13-00:31:14.333041 7fad35bfc6c0 Delete type=0 #874
+2026/01/13-00:33:18.076941 7fad353fb6c0 Level-0 table #879: started
+2026/01/13-00:33:18.076974 7fad353fb6c0 Level-0 table #879: 0 bytes OK
+2026/01/13-00:33:18.083219 7fad353fb6c0 Delete type=0 #877
+2026/01/13-00:33:18.083369 7fad353fb6c0 Manual compaction at level-0 from '!items!2xxMC458KXaAgm3T' @ 72057594037927935 : 1 .. '!items!zjOFhNocHjeJZcy4' @ 0 : 0; will stop at (end)
+2026/01/13-00:33:18.083406 7fad353fb6c0 Manual compaction at level-1 from '!items!2xxMC458KXaAgm3T' @ 72057594037927935 : 1 .. '!items!zjOFhNocHjeJZcy4' @ 0 : 0; will stop at (end)
diff --git a/packs/weapons/MANIFEST-000864 b/packs/weapons/MANIFEST-000880
similarity index 72%
rename from packs/weapons/MANIFEST-000864
rename to packs/weapons/MANIFEST-000880
index 81a0f4b..7e15627 100644
Binary files a/packs/weapons/MANIFEST-000864 and b/packs/weapons/MANIFEST-000880 differ
diff --git a/styles/README.md b/styles/README.md
new file mode 100644
index 0000000..af6ceb3
--- /dev/null
+++ b/styles/README.md
@@ -0,0 +1,118 @@
+# Structure LESS pour BoL
+
+Ce dossier contient tous les fichiers LESS qui sont compilés en CSS pour le système BoL.
+
+## Structure des fichiers
+
+```
+styles/
+├── bol.less # Fichier principal (importe tous les autres)
+├── global/ # Styles globaux
+│ ├── typography.less # Fonts et styles de texte
+│ ├── foundry-overrides.less # Overrides Foundry VTT
+│ ├── flex.less # Utilitaires Flexbox
+│ ├── forms.less # Styles de formulaires
+│ ├── item-list.less # Listes d'items
+│ ├── colors.less # Couleurs pré-définies
+│ └── chat.less # Messages de chat
+└── components/ # Composants spécifiques
+ ├── common.less # Styles communs aux sheets
+ ├── actor.less # Feuilles d'acteurs
+ └── item.less # Feuilles d'items
+```
+
+## Compilation
+
+### Commande unique
+```bash
+npm run css
+```
+
+### Mode watch (recompile automatiquement)
+```bash
+gulp
+```
+ou
+```bash
+npm start
+```
+
+## Modification des styles
+
+1. **NE PAS modifier** directement `css/bol.css`
+2. Modifier les fichiers `.less` appropriés dans `styles/`
+3. Compiler avec `npm run css`
+4. Le fichier `css/bol.css` sera régénéré automatiquement
+
+## Organisation
+
+### Global (`styles/global/`)
+
+- **typography.less** : Définition des @font-face et styles de texte de base
+- **foundry-overrides.less** : Overrides des styles Foundry (pause, scrollbar, etc.)
+- **flex.less** : Classes utilitaires flexbox (.flexrow, .flexcol, etc.)
+- **forms.less** : Tous les styles de formulaires (inputs, selects, labels, etc.)
+- **item-list.less** : Styles des listes d'items (.items-list)
+- **colors.less** : Classes de couleurs pré-définies (.red, .bg-red, etc.)
+- **chat.less** : Styles des messages de chat et résultats de dés
+
+### Components (`styles/components/`)
+
+- **common.less** : Styles communs à toutes les sheets (.bol.sheet)
+ - Window header/content
+ - Sheet header avec banner
+ - Tabs
+ - Sheet body
+
+- **actor.less** : Styles spécifiques aux feuilles d'acteurs
+ - Dimensions et layout
+ - Images d'attributs (vigor, agility, etc.)
+ - Footer
+ - Stats, resources
+ - HUD et tooltips
+
+- **item.less** : Styles spécifiques aux feuilles d'items
+ - Dimensions
+ - Properties list
+ - Dialog
+
+## Avantages de LESS
+
+1. **Variables** : Réutilisables dans tout le code
+2. **Nesting** : Code plus lisible et maintenable
+3. **Mixins** : Réutilisation de blocs de styles
+4. **Imports** : Organisation modulaire
+5. **Opérations** : Calculs CSS (calc() amélioré)
+
+## Exemple d'utilisation
+
+### Avant (CSS)
+```css
+.bol.sheet.actor .window-content form .sidebar .profile-img {
+ cursor: pointer;
+ border: none;
+}
+```
+
+### Après (LESS)
+```less
+.bol.sheet.actor {
+ .window-content {
+ form {
+ .sidebar {
+ .profile-img {
+ cursor: pointer;
+ border: none;
+ }
+ }
+ }
+ }
+}
+```
+
+## Notes importantes
+
+- La compilation LESS → CSS se fait automatiquement avec gulp
+- Le fichier `css/bol.css` est généré et ne doit pas être modifié manuellement
+- Tous les imports sont dans `styles/bol.less`
+- Les chemins des images/fonts sont relatifs au fichier CSS final dans `css/`
diff --git a/styles/bol.less b/styles/bol.less
new file mode 100644
index 0000000..c9bd953
--- /dev/null
+++ b/styles/bol.less
@@ -0,0 +1,17 @@
+/* ========================================= */
+/* BoL System LESS Main File */
+/* ========================================= */
+
+/* Global Styles */
+@import "global/typography.less";
+@import "global/foundry-overrides.less";
+@import "global/flex.less";
+@import "global/forms.less";
+@import "global/item-list.less";
+@import "global/colors.less";
+@import "global/chat.less";
+
+/* Component Styles */
+@import "components/common.less";
+@import "components/actor.less";
+@import "components/item.less";
diff --git a/styles/components/actor.less b/styles/components/actor.less
new file mode 100644
index 0000000..af72f5e
--- /dev/null
+++ b/styles/components/actor.less
@@ -0,0 +1,328 @@
+/* ----------------------------------------- */
+/* Actor Sheet Styles */
+/* ----------------------------------------- */
+
+.bol.sheet.actor {
+ min-width: 820px;
+ min-height: 700px;
+ height: 700px;
+
+ .window-content {
+ .bol-actor-form {
+ background-image: url("/systems/bol/ui/logo.webp");
+ background-repeat: no-repeat;
+ background-size: 190px 115px;
+ }
+
+ form {
+ .sidebar {
+ padding-top: 115px;
+ min-width: 250px;
+ width: 250px;
+ max-width: 250px;
+
+ .profile-img {
+ cursor: pointer;
+ border: none;
+ background-color: #EEE;
+ height: auto;
+ width: calc(250px - 10px);
+ min-width: calc(250px - 10px);
+ max-width: calc(250px - 10px);
+ margin-right: 10px;
+ }
+ }
+
+ .main {
+ .sheet-body {
+ overflow: hidden;
+
+ .tab {
+ .attribute {
+ &.vigor {
+ background-image: url("/systems/bol/ui/attributes/vigor.webp");
+ background-repeat: no-repeat;
+ background-position: center center;
+ background-size: 64px 64px;
+ }
+
+ &.agility {
+ background-image: url("/systems/bol/ui/attributes/agility.webp");
+ background-repeat: no-repeat;
+ background-position: center center;
+ background-size: 64px 64px;
+ }
+
+ &.mind {
+ background-image: url("/systems/bol/ui/attributes/mind.webp");
+ background-repeat: no-repeat;
+ background-position: center center;
+ background-size: 64px 64px;
+ }
+
+ &.appeal {
+ background-image: url("/systems/bol/ui/attributes/appeal.webp");
+ background-repeat: no-repeat;
+ background-position: center center;
+ background-size: 64px 64px;
+ }
+
+ .stat-value {
+ margin-top: -10px;
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+
+ .bol-footer {
+ height: 62px;
+ max-height: 62px;
+ min-height: 62px;
+
+ .footer-left img {
+ border: none;
+ height: 62px;
+ max-height: 62px;
+ min-height: 62px;
+ transform: scaleX(-1);
+ }
+
+ .footer-center {
+ margin-top: 20px;
+ margin-left: calc(-330px * 2);
+ margin-right: calc(-330px * 2);
+ height: 30px;
+ max-height: 30px;
+ min-height: 30px;
+ background-color: black;
+ }
+
+ .footer-right {
+ text-align: right;
+
+ img {
+ border: none;
+ height: 62px;
+ max-height: 62px;
+ min-height: 62px;
+ }
+ }
+ }
+
+ .stat-max {
+ font-size: 1rem;
+ font-weight: bold;
+ color: #4b4a44;
+ }
+
+ .bonus-text {
+ margin-top: 7px;
+ }
+
+ .stat-value {
+ font-size: 1.5rem;
+ font-weight: bold;
+ color: darkred;
+ }
+
+ .resource-bonus {
+ font-weight: bold;
+ color: darkred;
+ }
+
+ .resources-value {
+ background-color: #2a2a2a30;
+ border-color: #003c1e;
+ margin-top: 4px;
+ border-radius: 0.5rem;
+ }
+
+ .resources-novalue {
+ background-color: #2a2a2a00;
+ border-color: #003c1e;
+ margin-top: 4px;
+ border-radius: 0.5rem;
+ }
+
+ .stat-roll {
+ font-size: 1.5rem;
+ color: #4b4a44;
+
+ &.malus {
+ color: darkred;
+ }
+
+ &.bonus {
+ color: darkgreen;
+ }
+ }
+
+ .header-field-label,
+ .stat-label {
+ font-weight: bold;
+ font-family: "Wolfsbane2Expanded", cursive;
+ font-size: 2rem;
+ font-variant: small-caps;
+ }
+
+ .rounded {
+ border-radius: 100px;
+ width: 4rem;
+ height: 4rem;
+ }
+
+ .rounded-border {
+ border: 3px solid #4b4a44;
+ box-shadow: 5px 5px 5px gray;
+ border-radius: 100px;
+ width: 4rem;
+ height: 4rem;
+ }
+
+ .half-rounded {
+ border-radius: 100px 100px 0px 0px;
+ width: 4rem;
+ height: 4rem;
+ }
+
+ .half-rounded-border {
+ border-radius: 100px 100px 0px 0px;
+ border: 3px solid #4b4a44;
+ width: 4rem;
+ height: 4rem;
+ }
+}
+
+/* ----------------------------------------- */
+/* HUD and Chat Extensions */
+/* ----------------------------------------- */
+
+.rollable {
+ cursor: pointer;
+}
+
+.chat-message .chat-icon {
+ float: right;
+ border: 1px outset lightgray;
+ box-shadow: 3px 3px 3px black;
+ margin: 3px;
+ width: 64px;
+ height: 64px;
+}
+
+.dialog-button {
+ max-height: 2rem;
+}
+
+.xp-next {
+ color: darkgrey;
+ font-size: 1.0rem;
+ border: 1px solid #4b4a44;
+ box-shadow: 1px 1px 1px gray;
+ border-radius: 100px;
+ width: 1.25rem;
+ height: 1.25rem;
+}
+
+.tooltip-container {
+ position: relative;
+ display: inline-block;
+
+ .tooltiptext {
+ text-align: center;
+ position: absolute;
+ z-index: 1;
+ visibility: hidden;
+ opacity: 0;
+ transition: opacity 0.3s;
+ background-color: #f2f3a2a0;
+ padding: 4px;
+ width: 4rem;
+ border-radius: 25%;
+ border-width: 1px;
+ transform: translate(-40%, -60%);
+ }
+
+ &:hover .tooltiptext {
+ visibility: visible;
+ opacity: 1;
+ }
+}
+
+.tokenhudext {
+ display: flex;
+ flex: 0 !important;
+ font-family: CaslonPro;
+ font-weight: 600;
+
+ &.left {
+ justify-content: flex-start;
+ flex-direction: column;
+ position: absolute;
+ top: 2.75rem;
+ right: 16rem;
+ }
+
+ &.right {
+ justify-content: flex-start;
+ flex-direction: column;
+ position: absolute;
+ top: -4rem;
+ max-width: 250px;
+ left: 4rem;
+ }
+
+ &.right2 {
+ justify-content: flex-start;
+ flex-direction: column;
+ position: absolute;
+ top: -4rem;
+ left: 11rem;
+ }
+}
+
+.control-icon.tokenhudicon {
+ width: fit-content;
+ height: fit-content;
+ min-width: 6rem;
+ flex-basis: auto;
+ padding: 0.20rem;
+ line-height: 1.1rem;
+ margin: 0.20rem;
+
+ &.right {
+ margin-left: 8px;
+ }
+}
+
+#token-hud .status-effects.active {
+ z-index: 2;
+}
+
+.bol-hud-menu label {
+ font-size: 0.6rem;
+}
+
+.bol-margin-tb-2 {
+ margin-top: 2px;
+ margin-bottom: 2px;
+}
+
+.character-summary-container {
+ opacity: 0.95;
+}
+
+.character-summary-rollable {
+ text-decoration: underline;
+}
+
+.activated-green {
+ color: darkgreen;
+}
+
+.compendium-sidebar .directory-item.compendium.locked .compendium-banner {
+ opacity: 0.5;
+}
diff --git a/styles/components/common.less b/styles/components/common.less
new file mode 100644
index 0000000..f1ba9e5
--- /dev/null
+++ b/styles/components/common.less
@@ -0,0 +1,127 @@
+/* ----------------------------------------- */
+/* Common Sheet Styles */
+/* ----------------------------------------- */
+
+body.system-bol img#logo {
+ content: url("/systems/bol/ui/logo2.webp");
+}
+
+.journal-page-content {
+ /* Reserved for future use */
+}
+
+.bol.sheet {
+ .window-header {
+ border: none;
+ }
+
+ .window-content {
+ height: 100%;
+ padding: 10px;
+ overflow-y: hidden;
+ background: transparent;
+
+ form {
+ border: 10px solid transparent;
+ border-image: url("/systems/bol/ui/box-border-large.webp") 36 repeat;
+ border-image-outset: 1;
+ background: white;
+ margin: 0;
+ padding: 0;
+ height: 100%;
+
+ .sheet-header {
+ background-image: url("/systems/bol/ui/banner.webp");
+ background-repeat: no-repeat;
+ background-size: 330px 62px;
+ background-position-y: -15px;
+ background-position-x: right;
+ height: 115px;
+ min-height: 115px;
+ max-height: 115px;
+ overflow: hidden;
+ display: flex;
+ flex-direction: row;
+ flex-wrap: nowrap;
+ justify-content: flex-start;
+ align-items: flex-end;
+ padding-bottom: 10px;
+
+ .header-field {
+ .header-field-group {
+ overflow: hidden;
+ display: flex;
+ flex-direction: row;
+ flex-wrap: nowrap;
+ justify-content: flex-start;
+ align-items: baseline;
+
+ .header-field-label {
+ margin-right: 5px;
+ }
+
+ .charname,
+ .itemname,
+ .header-field-value {
+ color: #4b4a44;
+ font-family: 'Contrail One', cursive;
+ font-size: 1.5rem;
+ background-color: #EEE;
+ }
+ }
+ }
+ }
+
+ .main {
+ .tabs {
+ flex: 0 0 30px;
+ background-color: black;
+
+ .item {
+ line-height: 30px;
+ font-weight: bold;
+ font-family: "CCMeanwhile", cursive;
+ color: white;
+ padding-top: 4px;
+ font-size: 0.8em;
+
+ &.active {
+ text-decoration: underline;
+ text-shadow: none;
+ }
+ }
+ }
+
+ .sheet-body {
+ overflow: hidden;
+
+ .tab {
+ height: 95%;
+ border: none;
+ overflow-y: auto;
+
+ &.description {
+ .editor,
+ .editor-content {
+ height: 100%;
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+}
+
+.sheet-profile-img {
+ cursor: pointer;
+ border: none;
+ background-color: #EEE;
+ height: auto;
+ width: 96px;
+ height: 96px;
+ min-width: 96px;
+ min-height: 96px;
+ max-width: 96px;
+ margin-right: 10px;
+}
diff --git a/styles/components/item.less b/styles/components/item.less
new file mode 100644
index 0000000..c08343c
--- /dev/null
+++ b/styles/components/item.less
@@ -0,0 +1,56 @@
+/* ----------------------------------------- */
+/* Item Sheet Styles */
+/* ----------------------------------------- */
+
+.bol.sheet.item {
+ min-width: 460px;
+ min-height: 400px;
+
+ h1 input.itemname {
+ margin-top: 32px;
+ min-width: 24rem;
+ font-family: "Wolfsbane2Expanded", cursive;
+ }
+
+ .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;
+ }
+ }
+
+ .properties-list {
+ list-style: none;
+ margin: 0;
+ padding: 0;
+
+ li {
+ margin: 3px 0;
+ padding: 0 2px;
+ background: rgba(0, 0, 0, 0.05);
+ border: 1px groove #eeede0;
+ text-align: center;
+ font-size: 12px;
+ line-height: 18px;
+ }
+ }
+ }
+}
+
+.bol.dialog .sheet-header h3 {
+ font-family: "Wolfsbane2Expanded", cursive;
+ font-size: 24px;
+ color: black;
+}
+
+.editor,
+.editor-content {
+ height: 100%;
+}
diff --git a/styles/global/chat.less b/styles/global/chat.less
new file mode 100644
index 0000000..5c19a4f
--- /dev/null
+++ b/styles/global/chat.less
@@ -0,0 +1,99 @@
+/* ----------------------------------------- */
+/* Chat Messages */
+/* ----------------------------------------- */
+
+.message-header {
+ h2.damage {
+ color: orangered;
+ font-weight: bold;
+ }
+
+ h2.critical {
+ color: green;
+ font-weight: bold;
+ }
+
+ h2.fumble {
+ color: red;
+ font-weight: bold;
+ }
+
+ h2.success {
+ color: darkgreen;
+ font-weight: bold;
+ }
+
+ h2.failure {
+ color: darkred;
+ font-weight: bold;
+ }
+
+ h2.roll {
+ color: darkslategrey;
+ font-weight: bold;
+ }
+}
+
+h2.good {
+ color: darkgreen;
+ font-weight: bold;
+}
+
+h2.bad {
+ color: darkred;
+ font-weight: bold;
+}
+
+.chat-message {
+ margin: 3px;
+ padding: 10px;
+ font-size: 14px;
+ border-radius: 0;
+ background-color: white;
+ background-image: url("/systems/bol/ui/box-border-large.webp");
+ background-repeat: no-repeat;
+ background-size: 100% 100%;
+
+ .message-header {
+ .flavor-text {
+ font-family: "IMFellDWPicaSC-Regular", serif;
+ font-size: 14px;
+
+ h2 {
+ font-family: "Modesto Condensed", "Palatino Linotype", serif;
+ font-size: 20px;
+ }
+ }
+ }
+
+ .message-content {
+ .dice-roll {
+ .dice-result {
+ .dice-formula {
+ border-radius: 0px;
+ border: 1px inset lightgray;
+ background-color: #282828;
+ color: white;
+ }
+
+ .dice-tooltip {
+ .tooltip-part {
+ .part-total {
+ border-radius: 0px;
+ border: 1px inset lightgray;
+ background-color: #2a2a2a;
+ color: white;
+ }
+ }
+ }
+
+ .dice-total {
+ border-radius: 0px;
+ border: 1px inset lightgray;
+ background-color: #2a2a2a;
+ color: white;
+ }
+ }
+ }
+ }
+}
diff --git a/styles/global/colors.less b/styles/global/colors.less
new file mode 100644
index 0000000..f1d35ec
--- /dev/null
+++ b/styles/global/colors.less
@@ -0,0 +1,110 @@
+/* ----------------------------------------- */
+/* Premade Colors */
+/* ----------------------------------------- */
+
+.light {
+ color: lightgray;
+}
+
+.bg-light {
+ background: lightgray;
+}
+
+.darkgray {
+ color: #23221d;
+}
+
+.bg-darkgray {
+ background: #23221d;
+ color: #fff;
+}
+
+.darkbrown {
+ color: #464331c4;
+}
+
+.bg-darkbrown {
+ background: #464331c4;
+ color: #fff;
+}
+
+.darkslate {
+ color: darkslategray;
+}
+
+.bg-darkslate {
+ background: darkslategray;
+ color: #fff;
+}
+
+.darkgreen {
+ color: #003c1e;
+}
+
+.bg-darkgreen {
+ background: #003c1e;
+ color: #fff;
+}
+
+.darkblue {
+ color: midnightblue;
+}
+
+.bg-darkblue {
+ background: midnightblue;
+ color: #fff;
+}
+
+.blue {
+ color: #009ee0;
+}
+
+.bg-blue {
+ background: #009ee0;
+ color: #fff;
+}
+
+.green {
+ color: #44a12b;
+}
+
+.bg-green {
+ background: #44a12b;
+ color: #fff;
+}
+
+.black {
+ color: #000;
+}
+
+.bg-black {
+ background: #000;
+ color: #fff;
+}
+
+.red {
+ color: #cd071e;
+}
+
+.bg-red {
+ background: #cd071e;
+ color: #fff;
+}
+
+.darkred {
+ color: darkred;
+}
+
+.bg-darkred {
+ background: darkred;
+ color: #fff;
+}
+
+.purple {
+ color: purple;
+}
+
+.bg-purple {
+ background: purple;
+ color: #fff;
+}
diff --git a/styles/global/flex.less b/styles/global/flex.less
new file mode 100644
index 0000000..818139f
--- /dev/null
+++ b/styles/global/flex.less
@@ -0,0 +1,98 @@
+/* ----------------------------------------- */
+/* Flexbox Utilities */
+/* ----------------------------------------- */
+
+.flxrow {
+ display: flex;
+ flex-direction: row;
+ flex-wrap: wrap;
+ justify-content: flex-start;
+
+ > * {
+ flex: 1;
+ }
+
+ .flex1 { flex: 1; }
+ .flex2 { flex: 2; }
+ .flex3 { flex: 3; }
+ .flex4 { flex: 4; }
+}
+
+.flexrow {
+ display: flex;
+ flex-flow: row wrap;
+ justify-content: flex-start;
+
+ /* Wrong in v13: > * { flex: 1; } */
+
+ .flex1 { flex: 1; }
+ .flex2 { flex: 2; }
+ .flex3 { flex: 3; }
+ .flex4 { flex: 4; }
+ .flex5 { flex: 5; }
+ .flex6 { flex: 6; }
+ .flex7 { flex: 7; }
+ .flex8 { flex: 8; }
+ .flex9 { flex: 9; }
+}
+
+.flexcol {
+ .flex1 { flex: 1; }
+ .flex2 { flex: 2; }
+ .flex3 { flex: 3; }
+ .flex4 { flex: 4; }
+}
+
+.flex-group-center,
+.flex-group-left,
+.flex-group-right {
+ justify-content: center;
+ align-items: center;
+ text-align: center;
+ padding: 5px;
+}
+
+.flex-group-left {
+ justify-content: flex-start;
+ text-align: left;
+}
+
+.flex-group-right {
+ justify-content: flex-end;
+ text-align: right;
+}
+
+.center {
+ text-align: center;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+}
+
+.left {
+ text-align: left;
+ display: flex;
+ align-items: center;
+ justify-content: flex-start;
+}
+
+.right {
+ justify-content: flex-end;
+ text-align: right;
+ display: flex;
+ align-items: center;
+}
+
+.flex-center {
+ align-items: center;
+ justify-content: center;
+ text-align: center;
+}
+
+.flex-between {
+ justify-content: space-between;
+}
+
+.no-wrap {
+ flex-wrap: nowrap !important;
+}
diff --git a/styles/global/forms.less b/styles/global/forms.less
new file mode 100644
index 0000000..60257d9
--- /dev/null
+++ b/styles/global/forms.less
@@ -0,0 +1,233 @@
+/* ----------------------------------------- */
+/* Form Styles */
+/* ----------------------------------------- */
+
+.bol {
+ input[readonly="true"] {
+ border: none;
+ color: dimgray;
+ cursor: not-allowed;
+ width: 100%;
+ vertical-align: middle;
+ background: transparent;
+ }
+
+ input[type="text"],
+ input[type="number"],
+ input[type="text"]:hover,
+ input[type="number"]:hover,
+ input[type="text"]:focus,
+ input[type="number"]:focus {
+ border-radius: 0;
+ border: none;
+ box-shadow: none;
+ }
+
+ input:disabled:hover,
+ select:disabled:hover,
+ textarea:disabled:hover,
+ input:disabled:focus,
+ select:disabled:focus,
+ textarea:disabled:focus {
+ box-shadow: none !important;
+ border: 1px solid transparent !important;
+ outline: none !important;
+ }
+
+ button {
+ background: rgba(0, 0, 0, 0.1);
+ }
+
+ select {
+ box-shadow: none;
+ font-size: 14px;
+ text-align: center;
+ text-align-last: center;
+ -moz-text-align-last: center;
+ width: 100%;
+ border: none;
+ border-radius: 0;
+
+ &[multiple] {
+ box-shadow: none;
+ border: none;
+ font-size: 14px;
+
+ &:focus option:checked {
+ background: darkred linear-gradient(0deg, darkred 0%, darkred 100%);
+ color: white;
+ }
+ }
+ }
+
+ option {
+ font-size: 14px;
+ text-overflow: ellipsis;
+ overflow: hidden;
+ white-space: nowrap;
+
+ &:hover,
+ &:focus,
+ &:active,
+ &:checked,
+ &[selected] {
+ cursor: pointer;
+ background: darkred linear-gradient(0deg, darkred 0%, darkred 100%);
+ color: white;
+ }
+ }
+
+ label.checkbox {
+ flex: auto;
+ padding: 0;
+ margin: 0;
+ height: 22px;
+ line-height: 22px;
+ font-size: 11px;
+
+ > input[type="checkbox"] {
+ width: 16px;
+ height: 16px;
+ margin: 0 2px 0 0;
+ position: relative;
+ top: 4px;
+ }
+
+ &.right > input[type="checkbox"] {
+ margin: 0 0 0 2px;
+ }
+ }
+
+ .form-group {
+ label {
+ flex: 2;
+ font-weight: bold;
+ }
+
+ .form-fields {
+ display: flex;
+ flex-direction: row;
+ flex-wrap: wrap;
+ justify-content: flex-start;
+
+ > * {
+ flex: 1;
+ margin: 0 3px 0 0;
+
+ &:last-child {
+ margin-right: 0;
+ }
+
+ .flex1 { flex: 1; }
+ .flex2 { flex: 2; }
+ .flex3 { flex: 3; }
+ .flex4 { flex: 4; }
+ }
+
+ label {
+ flex: 0 0 100%;
+ margin: 0;
+
+ &.checkbox {
+ flex: auto;
+ text-align: left;
+ }
+ }
+
+ .field-value {
+ text-align: center;
+ }
+ }
+
+ &.stacked {
+ label {
+ flex: 0 0 100%;
+ margin: 0;
+
+ &.checkbox {
+ flex: auto;
+ text-align: left;
+ }
+ }
+ }
+ }
+
+ .form-header {
+ margin: 0.25em 0 0.25em 0;
+ padding: 2px 5px;
+ font-family: "Wolfsbane2Expanded", cursive;
+ color: #4b4a44;
+ background-color: lightgray;
+ }
+
+ h1.form-header {
+ font-size: 2.2em;
+ font-weight: 700;
+ }
+
+ h2.form-header {
+ font-size: 1.8em;
+ font-weight: 500;
+ border-bottom: 1px groove #eeede0;
+ }
+
+ h3.form-header {
+ font-size: 1.2em;
+ font-weight: 500;
+ border-bottom: 1px groove #eeede0;
+ }
+
+ h4.form-header {
+ font-size: 1em;
+ font-weight: 500;
+ font-family: 'Signika', sans-serif;
+ color: black;
+ background-color: transparent;
+ border-top: none;
+ border-bottom: 1px groove #eeede0;
+ }
+
+ .tag {
+ display: inline-block;
+ margin: 0 2px 0 0;
+ padding: 0 3px;
+ font-size: 10px;
+ line-height: 16px;
+ border: 1px solid #999;
+ border-radius: 3px;
+ background: rgba(0, 0, 0, 0.05);
+ }
+
+ ::placeholder {
+ color: lightgray;
+ opacity: 1;
+ }
+
+ :-ms-input-placeholder {
+ color: lightgray;
+ }
+
+ ::-ms-input-placeholder {
+ color: lightgray;
+ }
+
+ input::placeholder {
+ color: lightgray;
+ }
+
+ .property {
+ margin-top: 2px;
+ }
+
+ .inc-dec-btns {
+ color: #4b4a44;
+ }
+}
+
+.chat-button {
+ font-size: 0.8rem;
+}
+
+.summmary-number {
+ padding-left: 4rem;
+}
diff --git a/styles/global/foundry-overrides.less b/styles/global/foundry-overrides.less
new file mode 100644
index 0000000..955fb30
--- /dev/null
+++ b/styles/global/foundry-overrides.less
@@ -0,0 +1,71 @@
+/* ----------------------------------------- */
+/* Foundry VTT Overrides */
+/* ----------------------------------------- */
+
+#pause {
+ background: none;
+
+ > img {
+ width: 200px;
+ height: 200px;
+ top: -50px;
+ left: calc(50% - 100px);
+ opacity: 0.7;
+ }
+
+ h3 {
+ font-family: "IMFellDWPicaSC-Regular", serif;
+ font-size: 32px;
+ text-shadow: 0px 3px 5px #000000;
+ }
+}
+
+::-webkit-scrollbar-thumb {
+ outline: none;
+ border-radius: 3px;
+ background: #999 !important;
+ border: 1px solid #333 !important;
+ border-color: #333 !important;
+}
+
+::-webkit-scrollbar-track {
+ box-shadow: 0 0 3px #005d67 inset !important;
+ border-radius: 3px;
+}
+
+* {
+ scrollbar-width: thin !important;
+ scrollbar-color: #005d67 #ccc !important;
+}
+
+.element-invisible {
+ position: absolute;
+ width: 1px;
+ height: 1px;
+ margin: -1px;
+ border: 0;
+ padding: 0;
+ clip: rect(0 0 0 0);
+ overflow: hidden;
+}
+
+.roll-box {
+ border-width: 1px;
+ border-color: #000000;
+ margin-bottom: 2px;
+}
+
+.hide {
+ display: none;
+}
+
+ul.no-bullets {
+ list-style-type: none;
+ padding: 0;
+ margin: 0;
+}
+
+.nomargin {
+ margin: 0;
+ padding: 0;
+}
diff --git a/styles/global/item-list.less b/styles/global/item-list.less
new file mode 100644
index 0000000..6d08e2f
--- /dev/null
+++ b/styles/global/item-list.less
@@ -0,0 +1,105 @@
+/* ----------------------------------------- */
+/* Items List */
+/* ----------------------------------------- */
+
+.items-list {
+ list-style: none;
+ margin: 7px 0;
+ padding: 0;
+ overflow-y: hidden;
+
+ .item-header {
+ font-family: 'Signika', sans-serif;
+ font-size: 1em;
+ color: #4b4a44;
+ background-color: lightgray;
+
+ .item-name {
+ font-family: "Wolfsbane2Expanded", cursive;
+ font-size: 1.5em;
+ }
+ }
+
+ .item {
+ min-height: 30px;
+ line-height: 24px;
+ padding: 3px 0 3px 3px;
+ border-bottom: 1px solid #BBB;
+ align-items: stretch;
+
+ .item-image {
+ flex: 0 0 30px;
+ padding: 0;
+ margin: 0 5px 0 0;
+ height: 30px;
+ width: 30px;
+ min-height: 30px;
+ min-width: 30px;
+
+ img {
+ padding: 0;
+ margin: 0;
+ border: none;
+ height: 30px;
+ width: 30px;
+ min-height: 30px;
+ min-width: 30px;
+ }
+
+ &.roll-weapon,
+ &.roll-career {
+ background-color: transparent;
+ background-image: url("../../../icons/svg/dice-target.svg") !important;
+ background-size: 30px 30px;
+ background-repeat: no-repeat;
+ background-position: center;
+ cursor: pointer;
+
+ &:hover {
+ background-color: gray;
+
+ img {
+ visibility: hidden;
+ }
+ }
+ }
+ }
+
+ .item-name,
+ .item-field {
+ margin: 0;
+ }
+
+ .item-controls-1 {
+ flex: 0 0 18px;
+ }
+
+ .item-controls,
+ .item-controls-2 {
+ flex: 0 0 36px;
+ }
+
+ .item-controls-3 {
+ flex: 0 0 54px;
+ }
+
+ .item-control {
+ color: #4b4a44;
+ }
+ }
+
+ .item-name-fixed-medium {
+ min-width: 8rem;
+ width: 8rem;
+ }
+
+ .item-field-fixed-short {
+ max-width: 3rem;
+ min-width: 3rem;
+ width: 3rem;
+ }
+}
+
+.bougette-dice-img {
+ color: rgba(150, 44, 44, 0.70);
+}
diff --git a/styles/global/typography.less b/styles/global/typography.less
new file mode 100644
index 0000000..05dd44c
--- /dev/null
+++ b/styles/global/typography.less
@@ -0,0 +1,61 @@
+/* ----------------------------------------- */
+/* LOCAL FONTS */
+/* ----------------------------------------- */
+@font-face {
+ font-family: 'Contrail One';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/contrailone/v10/eLGbP-j_JA-kG0_Zo51noafdZQ.ttf) format('truetype');
+}
+
+@font-face {
+ font-family: "CCMeanwhile";
+ src: url('../fonts/ccmeanwhile-regular.ttf');
+}
+
+@font-face {
+ font-family: "Wolfsbane2";
+ src: url('../fonts/wolfsbane2.ttf');
+}
+
+@font-face {
+ font-family: "Wolfsbane2Condensed";
+ src: url('../fonts/wolfsbane2cond.ttf');
+}
+
+@font-face {
+ font-family: "Wolfsbane2Expanded";
+ src: url('../fonts/wolfsbane2expand.ttf');
+}
+
+@font-face {
+ font-family: "IMFellDWPicaSC-Regular";
+ src: url('../fonts/IMFellDWPicaSC-Regular.ttf');
+}
+
+/* ----------------------------------------- */
+/* TEXT STYLES */
+/* ----------------------------------------- */
+
+a.entity-link,
+a.inline-roll {
+ border: none;
+ background: transparent;
+ border-bottom: 1px dotted grey;
+ padding: 0;
+}
+
+a.inline-roll {
+ border: none;
+}
+
+a:hover {
+ text-shadow: 0 0 5px #a00;
+}
+
+.ellipsis {
+ text-overflow: ellipsis;
+ overflow: hidden;
+ white-space: nowrap;
+}
diff --git a/system.json b/system.json
index 97a836d..894bef8 100644
--- a/system.json
+++ b/system.json
@@ -333,7 +333,46 @@
"distance": 1.5,
"units": "m"
},
- "flags": {
+ "documentTypes": {
+ "Actor": {
+ "character": {
+ "htmlFields": [
+ "details.biography",
+ "details.notes"
+ ]
+ },
+ "encounter": {
+ "htmlFields": [
+ "details.biography",
+ "details.notes"
+ ]
+ },
+ "horde": {
+ "htmlFields": [
+ "details.biography",
+ "details.notes"
+ ]
+ },
+ "vehicle": {
+ "htmlFields": [
+ "description"
+ ]
+ }
+ },
+ "Item": {
+ "item": {
+ "htmlFields": [
+ "description"
+ ]
+ },
+ "feature": {
+ "htmlFields": [
+ "description"
+ ]
+ }
+ }
+ },
+ "flags": {
"hotReload": {
"extensions": [
"css",
diff --git a/templates/item.backup/item-sheet.hbs b/templates/item.backup/item-sheet.hbs
new file mode 100644
index 0000000..96bf268
--- /dev/null
+++ b/templates/item.backup/item-sheet.hbs
@@ -0,0 +1,38 @@
+
\ No newline at end of file
diff --git a/templates/item.backup/parts/item-header.hbs b/templates/item.backup/parts/item-header.hbs
new file mode 100644
index 0000000..6cee126
--- /dev/null
+++ b/templates/item.backup/parts/item-header.hbs
@@ -0,0 +1,11 @@
+{{!-- Sheet Header --}}
+
\ No newline at end of file
diff --git a/templates/item.backup/parts/properties/feature-properties.hbs b/templates/item.backup/parts/properties/feature-properties.hbs
new file mode 100644
index 0000000..9b8aa38
--- /dev/null
+++ b/templates/item.backup/parts/properties/feature-properties.hbs
@@ -0,0 +1,31 @@
+
+ {{localize "BOL.ui.subtype"}}
+
+ {{selectOptions config.featureSubtypes selected=item.system.subtype localize=true}}
+
+
+
+{{#if (eq item.system.subtype "career")}}
+ {{> "systems/bol/templates/item/parts/properties/feature/career-properties.hbs"}}
+{{/if}}
+{{#if (eq item.system.subtype "fightoption")}}
+ {{> "systems/bol/templates/item/parts/properties/feature/fightoption-properties.hbs"}}
+{{/if}}
+{{!#if (equals data.subtype "race")}}
+ {{!> "systems/bol/templates/item/parts/properties/feature/race-properties.hbs"}}
+{{!/if}}
+{{#if (eq item.system.subtype "boon")}}
+ {{> "systems/bol/templates/item/parts/properties/feature/boon-properties.hbs"}}
+{{/if}}
+{{#if (eq item.system.subtype "flaw")}}
+ {{> "systems/bol/templates/item/parts/properties/feature/flaw-properties.hbs"}}
+{{/if}}
+{{#if (eq item.system.subtype "boleffect")}}
+ {{> "systems/bol/templates/item/parts/properties/feature/effect-properties.hbs"}}
+{{/if}}
+{{#if (eq item.system.subtype "horoscope")}}
+ {{> "systems/bol/templates/item/parts/properties/feature/horoscope-properties.hbs"}}
+{{/if}}
+{{#if (eq item.system.subtype "xplog")}}
+ {{> "systems/bol/templates/item/parts/properties/feature/xplog-properties.hbs"}}
+{{/if}}
diff --git a/templates/item.backup/parts/properties/feature/boon-properties.hbs b/templates/item.backup/parts/properties/feature/boon-properties.hbs
new file mode 100644
index 0000000..707909f
--- /dev/null
+++ b/templates/item.backup/parts/properties/feature/boon-properties.hbs
@@ -0,0 +1,5 @@
+
+
+ {{localize "BOL.ui.isbonusdice"}}
+
+
diff --git a/templates/item.backup/parts/properties/feature/career-properties.hbs b/templates/item.backup/parts/properties/feature/career-properties.hbs
new file mode 100644
index 0000000..2944f55
--- /dev/null
+++ b/templates/item.backup/parts/properties/feature/career-properties.hbs
@@ -0,0 +1,21 @@
+
+
+ {{localize "BOL.ui.rank"}}
+
+
+
+ {{localize "BOL.ui.isSorcerer"}}
+
+
+
+ {{localize "BOL.ui.isAlchemist"}}
+
+
+
+ {{localize "BOL.ui.isPriest"}}
+
+
+
+ {{localize "BOL.ui.isAstrologer"}}
+
+
diff --git a/templates/item.backup/parts/properties/feature/effect-properties.hbs b/templates/item.backup/parts/properties/feature/effect-properties.hbs
new file mode 100644
index 0000000..c4482b8
--- /dev/null
+++ b/templates/item.backup/parts/properties/feature/effect-properties.hbs
@@ -0,0 +1,15 @@
+
+
+
+ {{localize "BOL.ui.attributaptitude"}}
+
+ {{selectOptions config.effectIdentifiers selected=item.system.properties.identifier localize=true}}
+
+
+
+
+ {{localize "BOL.ui.modifier"}}
+
+ {{selectOptions config.bolEffectModifier selected=item.system.properties.modifier localize=true}}
+
+
diff --git a/templates/item.backup/parts/properties/feature/fightoption-properties.hbs b/templates/item.backup/parts/properties/feature/fightoption-properties.hbs
new file mode 100644
index 0000000..6855bbb
--- /dev/null
+++ b/templates/item.backup/parts/properties/feature/fightoption-properties.hbs
@@ -0,0 +1,21 @@
+
+
+
+
+ {{localize "BOL.ui.activated"}}
+
+
+
+
+ {{localize "BOL.ui.isspecial"}}
+
+
\ No newline at end of file
diff --git a/templates/item.backup/parts/properties/feature/flaw-properties.hbs b/templates/item.backup/parts/properties/feature/flaw-properties.hbs
new file mode 100644
index 0000000..00fa1a5
--- /dev/null
+++ b/templates/item.backup/parts/properties/feature/flaw-properties.hbs
@@ -0,0 +1,5 @@
+
+
+ {{localize "BOL.ui.ismalusdice"}}
+
+
diff --git a/templates/item.backup/parts/properties/feature/horoscope-properties.hbs b/templates/item.backup/parts/properties/feature/horoscope-properties.hbs
new file mode 100644
index 0000000..4686c94
--- /dev/null
+++ b/templates/item.backup/parts/properties/feature/horoscope-properties.hbs
@@ -0,0 +1,13 @@
+
+
+
+ {{localize "BOL.ui.answer"}}
+
+ {{selectOptions config.horoscopeAnswer selected=item.system.properties.horoscopeanswer localize=true}}
+
+
+
+
+ {{localize "BOL.ui.rank"}}
+
+
diff --git a/templates/item.backup/parts/properties/feature/origin-properties.hbs b/templates/item.backup/parts/properties/feature/origin-properties.hbs
new file mode 100644
index 0000000..da07462
--- /dev/null
+++ b/templates/item.backup/parts/properties/feature/origin-properties.hbs
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/templates/item.backup/parts/properties/feature/race-properties.hbs b/templates/item.backup/parts/properties/feature/race-properties.hbs
new file mode 100644
index 0000000..169ff7a
--- /dev/null
+++ b/templates/item.backup/parts/properties/feature/race-properties.hbs
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/templates/item.backup/parts/properties/feature/xplog-properties.hbs b/templates/item.backup/parts/properties/feature/xplog-properties.hbs
new file mode 100644
index 0000000..c48a322
--- /dev/null
+++ b/templates/item.backup/parts/properties/feature/xplog-properties.hbs
@@ -0,0 +1,51 @@
+
+
+
+ {{localize "BOL.ui.type"}}
+
+ {{#select item.system.properties.xptype}}
+ {{#each config.listTypes as |value id|}}
+ {{localize value}}
+ {{/each}}
+ {{/select}}
+
+
+
+
+ {{localize "BOL.ui.date"}}
+
+
+
+
+ {{localize "BOL.ui.name"}}
+
+ {{#if (eq item.system.properties.xptype "attribute")}}
+
+ {{selectOptions config.attackAttributes selected=item.system.properties.xpname localize=true}}
+
+ {{else}}
+ {{#if (eq item.system.properties.xptype "aptitude")}}
+
+ {{selectOptions config.aptitudes selected=item.system.properties.xpname localize=true} }
+
+ {{else}}
+ {{#if (eq item.system.properties.xptype "career")}}
+
+ {{selectOptions careers labelAttr="name" selected=item.system.properties.xpname localize=true}}
+
+ {{else}}
+
+ {{/if}}
+ {{/if}}
+ {{/if}}
+
+
+
+ {{localize "BOL.ui.cost"}}
+
+
+
+
+ {{localize "BOL.ui.value"}}
+
+
diff --git a/templates/item.backup/parts/properties/item-properties.hbs b/templates/item.backup/parts/properties/item-properties.hbs
new file mode 100644
index 0000000..54bea30
--- /dev/null
+++ b/templates/item.backup/parts/properties/item-properties.hbs
@@ -0,0 +1,27 @@
+
+
+{{#if (eq item.system.category "equipment")}}
+ {{> "systems/bol/templates/item/parts/properties/item/equipment-properties.hbs"}}
+{{/if}}
+{{#if (eq item.system.category "capacity")}}
+ {{> "systems/bol/templates/item/parts/properties/item/capacity-properties.hbs"}}
+{{/if}}
+{{#if (eq item.system.category "vehicle")}}
+ {{> "systems/bol/templates/item/parts/properties/item/vehicle-properties.hbs"}}
+{{/if}}
+{{#if (eq item.system.category "spell")}}
+ {{> "systems/bol/templates/item/parts/properties/item/spell-properties.hbs"}}
+{{/if}}
+{{#if (eq item.system.category "alchemy")}}
+ {{> "systems/bol/templates/item/parts/properties/item/alchemy-properties.hbs"}}
+{{/if}}
+{{#if (eq item.system.category "vehicleweapon")}}
+ {{> "systems/bol/templates/item/parts/properties/item/weapon-vehicle-properties.hbs"}}
+{{/if}}
diff --git a/templates/item.backup/parts/properties/item/alchemy-properties.hbs b/templates/item.backup/parts/properties/item/alchemy-properties.hbs
new file mode 100644
index 0000000..cf5a975
--- /dev/null
+++ b/templates/item.backup/parts/properties/item/alchemy-properties.hbs
@@ -0,0 +1,26 @@
+
+
+
+ {{localize "BOL.ui.alchemyType"}}
+
+ {{selectOptions config.alchemyType selected=item.system.properties.alchemytype localize=true}}
+
+
+
+
+ {{localize "BOL.ui.difficulty"}}
+
+ {{selectOptions config.alchemyModifiers selected=item.system.properties.difficulty localize=true}}
+
+
+
+
+ {{localize "BOL.ui.pccost"}}
+
+
+
+
+ {{localize "BOL.ui.pcnow"}}
+
+
+
diff --git a/templates/item.backup/parts/properties/item/capacity-properties.hbs b/templates/item.backup/parts/properties/item/capacity-properties.hbs
new file mode 100644
index 0000000..bd343b2
--- /dev/null
+++ b/templates/item.backup/parts/properties/item/capacity-properties.hbs
@@ -0,0 +1,25 @@
+
+
+
+{{#if item.system.properties.weapon}}
+ {{> "systems/bol/templates/item/parts/properties/item/weapon-properties.hbs"}}
+{{/if}}
+{{#if item.system.properties.protection}}
+ {{> "systems/bol/templates/item/parts/properties/item/protection-properties.hbs"}}
+{{/if}}
+{{#if item.system.properties.magical}}
+ {{> "systems/bol/templates/item/parts/properties/item/magical-properties.hbs"}}
+{{/if}}
diff --git a/templates/item.backup/parts/properties/item/equipment-properties.hbs b/templates/item.backup/parts/properties/item/equipment-properties.hbs
new file mode 100644
index 0000000..41645e7
--- /dev/null
+++ b/templates/item.backup/parts/properties/item/equipment-properties.hbs
@@ -0,0 +1,91 @@
+
+
+
+
+
+
+
+
+{{#if item.system.properties.equipable}}
+
+
+{{/if}}
+
+{{#if item.system.properties.stackable}}
+
+
+{{/if}}
+
+
+
+{{#if item.system.properties.weapon}}
+ {{> "systems/bol/templates/item/parts/properties/item/weapon-properties.hbs"}}
+{{/if}}
+{{#if item.system.properties.protection}}
+ {{> "systems/bol/templates/item/parts/properties/item/protection-properties.hbs"}}
+{{/if}}
+{{#if item.system.properties.magical}}
+ {{> "systems/bol/templates/item/parts/properties/item/magical-properties.hbs"}}
+{{/if}}
diff --git a/templates/item.backup/parts/properties/item/magical-properties.hbs b/templates/item.backup/parts/properties/item/magical-properties.hbs
new file mode 100644
index 0000000..be49ae3
--- /dev/null
+++ b/templates/item.backup/parts/properties/item/magical-properties.hbs
@@ -0,0 +1 @@
+
diff --git a/templates/item.backup/parts/properties/item/protection-properties.hbs b/templates/item.backup/parts/properties/item/protection-properties.hbs
new file mode 100644
index 0000000..07d4771
--- /dev/null
+++ b/templates/item.backup/parts/properties/item/protection-properties.hbs
@@ -0,0 +1,98 @@
+
+
+
+
+{{#if item.system.properties.armor}}
+
+
+
+{{/if}}
+
+{{#if item.system.properties.helm}}
+
+{{/if}}
+
+{{#if item.system.properties.shield}}
+
+
+{{/if}}
+
+
+
+
+
+
+
+
diff --git a/templates/item.backup/parts/properties/item/spell-properties.hbs b/templates/item.backup/parts/properties/item/spell-properties.hbs
new file mode 100644
index 0000000..e7f82b8
--- /dev/null
+++ b/templates/item.backup/parts/properties/item/spell-properties.hbs
@@ -0,0 +1,77 @@
+
+
+
+ {{localize "BOL.ui.circle"}}
+
+ {{selectOptions config.spellType selected=item.system.properties.circle localize=true}}
+
+
+
+
+ {{localize "BOL.ui.difficulty"}}
+
+ {{selectOptions config.spellModifiers selected=item.system.properties.difficulty localize=true}}
+
+
+
+
+ {{localize "BOL.ui.ppcost"}}
+
+
+
+
+ {{localize "BOL.ui.duration"}}
+
+
+
+
+ {{localize "BOL.ui.mandatoryconditions"}}
+
+ {{selectOptions config.spellMandatoryConditions selected=item.system.properties.nbmandatoryconditions }}
+
+
+
+ {{#each item.system.properties.mandatoryconditions as |cond idx|}}
+ {{#if (lt idx @root.item.system.properties.nbmandatoryconditions)}}
+
+ {{localize "BOL.ui.mandatoryconditions"}} {{add idx 1}}
+
+
+ {{/if}}
+ {{/each}}
+
+
+ {{localize "BOL.ui.optionnalconditions"}}
+
+ {{selectOptions config.spellOptionnalConditions selected=item.system.properties.nboptionnalconditions}}
+
+
+
+ {{#each item.system.properties.optionnalconditions as |cond idx|}}
+ {{#if (lt idx @root.item.system.properties.nboptionnalconditions)}}
+
+ {{localize "BOL.ui.optionnalconditions"}} {{add idx 1}}
+
+
+ {{/if}}
+ {{/each}}
+
+ {{localize "BOL.ui.magicnewrules"}} :
+
+
diff --git a/templates/item.backup/parts/properties/item/vehicle-properties.hbs b/templates/item.backup/parts/properties/item/vehicle-properties.hbs
new file mode 100644
index 0000000..f8d1bf4
--- /dev/null
+++ b/templates/item.backup/parts/properties/item/vehicle-properties.hbs
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+
diff --git a/templates/item.backup/parts/properties/item/weapon-properties.hbs b/templates/item.backup/parts/properties/item/weapon-properties.hbs
new file mode 100644
index 0000000..c2256aa
--- /dev/null
+++ b/templates/item.backup/parts/properties/item/weapon-properties.hbs
@@ -0,0 +1,322 @@
+
+
+
+
+
+{{#if (not item.system.properties.onlymodifier)}}
+
+
+{{/if}}
+
+
+
+
+
+
+
+
+
+{{#if
+ (or
+ item.system.properties.throwing
+ (or item.system.properties.ranged item.system.properties.throwable)
+ )
+}}
+
+
+{{/if}}
+
+{{#if item.system.properties.reloadable}}
+
+{{/if}}
\ No newline at end of file
diff --git a/templates/item.backup/parts/properties/item/weapon-vehicle-properties.hbs b/templates/item.backup/parts/properties/item/weapon-vehicle-properties.hbs
new file mode 100644
index 0000000..a81f5f0
--- /dev/null
+++ b/templates/item.backup/parts/properties/item/weapon-vehicle-properties.hbs
@@ -0,0 +1,77 @@
+
+
+
+
+
+{{#if item.system.properties.ishulldamage}}
+
+
+
+
+{{/if}}
+{{#if item.system.properties.iscrewdamage}}
+
+
+
+
+{{/if}}
\ No newline at end of file
diff --git a/templates/item.backup/post-item.hbs b/templates/item.backup/post-item.hbs
new file mode 100644
index 0000000..4429261
--- /dev/null
+++ b/templates/item.backup/post-item.hbs
@@ -0,0 +1,8 @@
+
+
{{name}}
+ {{#if img}}
+
+ {{/if}}
+
Description :
+
{{{system.description}}}
+
diff --git a/templates/item/feature-sheet.hbs b/templates/item/feature-sheet.hbs
new file mode 100644
index 0000000..dfcf9a3
--- /dev/null
+++ b/templates/item/feature-sheet.hbs
@@ -0,0 +1,40 @@
+
diff --git a/templates/item/item-sheet.hbs b/templates/item/item-sheet.hbs
index 96bf268..a371a43 100644
--- a/templates/item/item-sheet.hbs
+++ b/templates/item/item-sheet.hbs
@@ -2,15 +2,21 @@
{{> "systems/bol/templates/item/parts/item-header.hbs"}}
+
{{!-- Sheet Tab Navigation --}}
- {{localize "BOL.ui.tab.description"}}
- {{localize "BOL.ui.tab.details"}}
+ {{#each tabs}}
+
+ {{#if this.icon}} {{/if}}
+ {{localize this.label}}
+
+ {{/each}}
+
{{!-- Sheet Body --}}
-
-
+ {{!-- Description Tab --}}
+
{{#if itemProperties}}
{{/if}}
- {{editor description target="system.description" button=true owner=owner editable=editable}}
+ {{editor enrichedDescription target="system.description" button=true editable=isEditable engine="prosemirror"}}
-
- {{#if (eq item.type "item")}}
+ {{!-- Properties Tab --}}
+
{{> "systems/bol/templates/item/parts/properties/item-properties.hbs"}}
- {{/if}}
- {{#if (eq item.type "feature")}}
- {{> "systems/bol/templates/item/parts/properties/feature-properties.hbs"}}
- {{/if}}
-
\ No newline at end of file
+
diff --git a/templates/item/item-sheet.hbs.backup b/templates/item/item-sheet.hbs.backup
new file mode 100644
index 0000000..96bf268
--- /dev/null
+++ b/templates/item/item-sheet.hbs.backup
@@ -0,0 +1,38 @@
+
\ No newline at end of file
diff --git a/templates/item/parts/item-header.hbs b/templates/item/parts/item-header.hbs
index 6cee126..b7e6547 100644
--- a/templates/item/parts/item-header.hbs
+++ b/templates/item/parts/item-header.hbs
@@ -1,11 +1,18 @@
-{{!-- Sheet Header --}}
-