Compare commits
5 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| d27d580d8c | |||
| 967383f5b3 | |||
| e4cc556705 | |||
| 405bcd7cf5 | |||
| 846e6f88b7 |
@@ -1,286 +0,0 @@
|
|||||||
# 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 --}}
|
|
||||||
<img data-action="editImage" src="{{item.img}}" />
|
|
||||||
|
|
||||||
{{!-- Poster au chat --}}
|
|
||||||
<button data-action="postItem">
|
|
||||||
<i class="fas fa-comment"></i>
|
|
||||||
</button>
|
|
||||||
```
|
|
||||||
|
|
||||||
### Tabs
|
|
||||||
|
|
||||||
```handlebars
|
|
||||||
{{!-- Navigation --}}
|
|
||||||
<nav class="tabs" data-group="primary">
|
|
||||||
{{#each tabs}}
|
|
||||||
<a data-tab="{{this.id}}" class="{{#if (eq ../activeTab this.id)}}active{{/if}}">
|
|
||||||
{{localize this.label}}
|
|
||||||
</a>
|
|
||||||
{{/each}}
|
|
||||||
</nav>
|
|
||||||
|
|
||||||
{{!-- Contenu --}}
|
|
||||||
<div class="tab {{#if (eq activeTab 'description')}}active{{/if}}"
|
|
||||||
data-tab="description">
|
|
||||||
...
|
|
||||||
</div>
|
|
||||||
```
|
|
||||||
|
|
||||||
### 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
|
|
||||||
<button data-action="myAction">Click</button>
|
|
||||||
```
|
|
||||||
|
|
||||||
## 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
|
|
||||||
|
After Width: | Height: | Size: 84 KiB |
|
After Width: | Height: | Size: 151 KiB |
|
After Width: | Height: | Size: 517 KiB |
|
After Width: | Height: | Size: 109 KiB |
|
After Width: | Height: | Size: 96 KiB |
|
After Width: | Height: | Size: 272 KiB |
|
After Width: | Height: | Size: 275 KiB |
|
After Width: | Height: | Size: 247 KiB |
|
After Width: | Height: | Size: 248 KiB |
|
After Width: | Height: | Size: 242 KiB |
|
After Width: | Height: | Size: 274 KiB |
|
After Width: | Height: | Size: 102 KiB |
@@ -0,0 +1,63 @@
|
|||||||
|
{
|
||||||
|
"label": "Game Aid",
|
||||||
|
"mapping": {
|
||||||
|
"name": "name",
|
||||||
|
"description": "content",
|
||||||
|
"categories": {
|
||||||
|
"path": "categories",
|
||||||
|
"converter": "nameCollection"
|
||||||
|
},
|
||||||
|
"pages": {
|
||||||
|
"path": "pages",
|
||||||
|
"converter": "pages"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"entries": {
|
||||||
|
"Aide du Jeu": "Game Aid",
|
||||||
|
"8ihDiCxC47fcdKVA": {
|
||||||
|
"name": "Game Aid",
|
||||||
|
"pages": {
|
||||||
|
"8agBoLYo99u530d1": {
|
||||||
|
"name": "Credits",
|
||||||
|
"text": "<p>This system was started by Zigmund, then taken over, completed and maintained by LeRatierBretonnien.</p><p>You can contact me on the French Foundry Discord: LeRatierBretonnien#2065</p><p>The git repository is available here: <a href=\"https://www.uberwald.me/gitea/public/bol\">https://www.uberwald.me/gitea/public/bol</a></p><p>Barbarians of Lemuria is a game by Simon Washbourne (Beyond Belief Games), translated into French by Ludospherik.</p><p>The full range is available on this page: <a href=\"http://www.ludospherik.fr/content/14-barbarians-of-lemuria\">http://www.ludospherik.fr/content/14-barbarians-of-lemuria</a></p><img src=\"systems/bol/assets/pages/b9BjVFaWB6uyyKsD-pages-8agBoLYo99u530d1-image-Rg2nVaMlglfJ6Qcm.png\" />"
|
||||||
|
},
|
||||||
|
"NAcpMm6NlyhwvWRA": {
|
||||||
|
"name": "Features",
|
||||||
|
"text": "<p>The BoL system under Foundry allows you to:</p><ul><li><p>create characters and NPCs (minions, toughs, rivals),</p></li><li><p>create creatures,</p></li><li><p>make dice rolls for attributes, aptitudes, and careers,</p></li><li><p>make dice rolls for combat attacks,</p></li><li><p>manage initiative,</p></li><li><p>make dice rolls to cast spells or perform alchemical recipes,</p></li><li><p>manage damage and lifeblood loss,</p></li><li><p>display and manage automations in chat windows, with assistance for the use of Hero Points and critical successes.</p></li></ul>"
|
||||||
|
},
|
||||||
|
"hdQixhZGfAytdbSg": {
|
||||||
|
"name": "Compendiums",
|
||||||
|
"text": "<p>The system comes with a series of compendiums providing quick access to careers, boons, and equipment.</p><p>The official cards are available, with the kind permission of Ludospherik.</p><p>To use content from a compendium, simply drag and drop the item into the world. For example: open the armours compendium, select <em>Light Armour</em>, and drag it onto a character sheet.</p><img src=\"systems/bol/assets/pages/help-en-compendium.png\" />"
|
||||||
|
},
|
||||||
|
"UfvTY80U49k6YFwe": {
|
||||||
|
"name": "Dice Rolls (Attributes/Aptitudes)",
|
||||||
|
"text": "<p>When a player clicks an attribute or aptitude, the following window appears:</p><img src=\"systems/bol/assets/pages/help-en-attribute-dialog.png\" /><ol><li><p>Attribute the player clicked on. It can be changed with this drop-down menu.</p></li><li><p>Career to apply if needed. Left-click to select, CTRL+left-click to deselect. When selected, the career rank is applied.</p></li><li><p>Available boons (i.e. those that grant a bonus die). Selection mode is identical to careers. When selected, the bonus die is applied to the roll.</p></li><li><p>Available flaws (i.e. those that impose a penalty die). Selection mode is identical to careers. When selected, the penalty die is applied to the roll.</p></li><li><p>Effects. Effects are permanent modifiers that affect certain rolls. See the corresponding chapter.</p></li><li><p>Manual addition of penalty or bonus dice.</p></li><li><p>Manual modifiers, according to the GM's ruling.</p></li><li><p>Reminder of the number of dice, based on the choices made in the dialog.</p></li><li><p>Complete list of modifiers applied to the roll.</p></li></ol>"
|
||||||
|
},
|
||||||
|
"4CLyyt3dtpG6YNMi": {
|
||||||
|
"name": "Dice Rolls (Weapon)",
|
||||||
|
"text": "<p>To make an attack with a weapon, go to the <strong>Actions</strong> tab and click the weapon's name. Targeting an opponent is recommended in order to take advantage of the system automations.</p><img src=\"systems/bol/assets/pages/help-en-weapon-dialog.png\" /><ol><li><p>Default weapon attribute. It can be changed with this drop-down menu.</p></li><li><p>Default weapon aptitude. It can be changed with this drop-down menu.</p></li><li><p>Possible weapon bonus on the attack roll.</p></li><li><p>Target defence, when an opponent is targeted.</p></li><li><p>Career to apply if needed. Left-click to select, CTRL+left-click to deselect. When selected, the career rank is applied.</p></li><li><p>Available boons (i.e. those that grant a bonus die). Selection mode is identical to careers. When selected, the bonus die is applied to the roll.</p></li><li><p>Available flaws (i.e. those that impose a penalty die). Selection mode is identical to careers. When selected, the penalty die is applied to the roll.</p></li><li><p>Effects. Effects are permanent modifiers that affect certain rolls. See the corresponding chapter.</p></li><li><p>Manual addition of penalty or bonus dice.</p></li><li><p>Information area if the weapon has the <em>Bonus Die</em> option enabled.</p></li><li><p>Agility penalty from armour and shield.</p></li><li><p>Manual modifiers, according to the GM's ruling.</p></li><li><p>Reminder of the number of dice, based on the choices made in the dialog.</p></li><li><p>Complete list of modifiers applied to the roll.</p></li></ol>"
|
||||||
|
},
|
||||||
|
"r003R5yIaiKxThOc": {
|
||||||
|
"name": "Character Sheet",
|
||||||
|
"text": "<h2>Attributes</h2><img src=\"systems/bol/assets/pages/help-en-sheet-attributes.png\" /><ol><li><p>Name + Experience area.</p></li><li><p>Tab bar for moving between sections.</p></li><li><p>Attributes area. Clicking a name opens the roll dialog, clicking a number allows editing.</p></li><li><p>Aptitudes area, same idea as attributes.</p></li><li><p>Counters area. The red value is the current one, the black value underneath is the maximum.</p></li></ol><h2>Actions</h2><img src=\"systems/bol/assets/pages/help-en-sheet-actions.png\" /><ol><li><p>Weapons. Clicking the name opens the attack dialog for that weapon.</p></li><li><p>Damage. Clicking the damage formula rolls it.</p></li><li><p>List of protections.</p></li><li><p>Clicking the protection formula rolls it.</p></li><li><p>List of shields.</p></li><li><p>Combat options the character knows. Once activated, they appear in the weapon attack dialog.</p></li></ol><h2>Traits</h2><img src=\"systems/bol/assets/pages/help-en-sheet-traits.png\" /><ol><li><p>List of careers. Left-click a career for details.</p></li><li><p>Career rank helper.</p></li><li><p>List of origins. Left-click for details.</p></li><li><p>List of boons. Left-click for details.</p></li><li><p>List of flaws. Left-click for details.</p></li><li><p>List of spoken languages. Left-click for details.</p></li><li><p>List of known combat options. Left-click for details.</p></li><li><p>List of beliefs. Left-click for details.</p></li><li><p>List of active effects. Left-click for details.</p></li></ol><h2>Equipment</h2><img src=\"systems/bol/assets/pages/help-en-sheet-equipment.png\" /><ol><li><p>Quick equipment creation controls.</p></li><li><p>Purse state (optional rule, system setting).</p></li><li><p>Weapons, with quantity management.</p></li><li><p>Shield equip / unequip control.</p></li><li><p>List of protections.</p></li><li><p>Armour equip / unequip control.</p></li></ol><h2>Spells & Alchemy</h2><p>This tab is only available if the character has the Alchemist or Sorcerer career.</p><img src=\"systems/bol/assets/pages/help-en-sheet-spells.png\" /><ol><li><p>List of spells. Left-click the name to open the dedicated roll dialog.</p></li><li><p>Reminder of circle and difficulty.</p></li><li><p>The square button opens the spell details.</p></li><li><p>List of known alchemical preparations.</p></li><li><p>Crafting progress management.</p></li><li><p>The square button opens the preparation details.</p></li></ol><h2>Description</h2><img src=\"systems/bol/assets/pages/help-en-sheet-description.png\" /><p>The description area contains free-form fields for customising the character.</p>"
|
||||||
|
},
|
||||||
|
"eRbEqbCW4AhU0cpm": {
|
||||||
|
"name": "Effects",
|
||||||
|
"text": "<p>Effects allow permanent modifiers to be applied as long as they are present on the character sheet.</p><p><span style=\"text-decoration:underline\"><span style=\"text-decoration:underline\">Example</span></span>: a character is poisoned, and the poison causes mental fatigue. In game terms, they suffer a -2 penalty to all Mind rolls. To represent this, create an <em>Effect</em> like this:</p><img src=\"systems/bol/assets/pages/help-en-effect-sheet.png\" /><ol><li><p>Create a <em>Trait</em>, and in the <em>Details</em> tab select the subtype <em>Effect</em>.</p></li><li><p>Select <em>Mind</em>.</p></li><li><p>Set a -2 modifier.</p></li></ol><p>Once placed on a character, the penalty is automatically applied whenever a Mind roll is requested. Remove the effect from the character sheet (<em>Traits</em> tab) to remove both the effect and its penalty.<br />A compendium of basic effects is available in the system.</p>"
|
||||||
|
},
|
||||||
|
"QmNF6p0lJf3pJoAy": {
|
||||||
|
"name": "Commands",
|
||||||
|
"text": "<p>The system provides commands (currently just one) for a few automated tasks.</p><p><strong><span style=\"text-decoration:underline\">This command is only available if the BoL-rulebook module is installed.</span></strong></p><h3>/adventure command</h3><img src=\"systems/bol/assets/pages/help-en-command.png\" /><ol><li><p>Type <code>/adventure</code> in the chat input area (or trigger it from a macro).</p></li><li><p>The system generates an adventure from the core rulebook tables and posts the result in chat.</p></li></ol>"
|
||||||
|
},
|
||||||
|
"MOWru5Dbvs4iozXm": {
|
||||||
|
"name": "Macros",
|
||||||
|
"text": "<p>The system exposes macros through <code>game.bol.macros</code>. They provide quick access to the most common rolls from a Foundry macro.</p><p><strong>Automatic actor selection:</strong></p><ul><li><p>if exactly one token is selected, the macro uses it;</p></li><li><p>if several tokens are selected, the macro shows a warning;</p></li><li><p>if no token is selected, a GM must select one; a player automatically falls back to their assigned character.</p></li></ul><p><strong>Available rolls</strong></p><p>Attributes (internal keys):</p><pre><code>game.bol.macros.rollAttribute(\"vigor\")\ngame.bol.macros.rollAttribute(\"agility\")\ngame.bol.macros.rollAttribute(\"mind\")\ngame.bol.macros.rollAttribute(\"appeal\")</code></pre><p>Aptitudes:</p><pre><code>game.bol.macros.rollAptitude(\"init\")\ngame.bol.macros.rollAptitude(\"melee\")\ngame.bol.macros.rollAptitude(\"ranged\")\ngame.bol.macros.rollAptitude(\"def\")</code></pre><p>Weapons, spells, and alchemy:</p><pre><code>game.bol.macros.rollWeapon(\"Spear\")\ngame.bol.macros.rollWeapon(0)\n\ngame.bol.macros.rollSpell(\"Javelin\")\ngame.bol.macros.rollSpell(0)\n\ngame.bol.macros.rollAlchemy(\"Fire\")\ngame.bol.macros.rollAlchemy(0)</code></pre><p>For weapons, spells, and alchemical preparations, name lookup is <strong>partial</strong> and <strong>case-insensitive</strong>. You may also use a numeric index.</p><p>Horoscope:</p><pre><code>game.bol.macros.rollHoroscope(\"minor\")\ngame.bol.macros.rollHoroscope(\"major\")</code></pre><p><strong>Generic macro</strong></p><pre><code>game.bol.macros.roll(\"attribute\", \"vigor\")\ngame.bol.macros.roll(\"aptitude\", \"melee\")\ngame.bol.macros.roll(\"weapon\", \"Spear\")\ngame.bol.macros.roll(\"spell\", \"Javelin\")\ngame.bol.macros.roll(\"alchemy\", 0)\ngame.bol.macros.roll(\"horoscope\", \"minor\")</code></pre><p><strong>Compatibility</strong></p><p>The legacy entry point <code>game.bol.macros.rollMacro(type, key)</code> is still available for existing macros.</p>"
|
||||||
|
},
|
||||||
|
"rERizrPxSAsvsZY2": {
|
||||||
|
"name": "Initiative",
|
||||||
|
"text": "<p>In BoL, initiative is rolled once at the start of combat.</p><p>You can request it automatically through the Combat Tracker, or roll Initiative manually and tick the corresponding box in the dialog:</p><img src=\"systems/bol/assets/pages/help-en-initiative-dialog.png\" /><p>According to the roll result, an initiative rank from 10 to 3 is assigned as follows:</p><p><strong>10</strong> - PC: Legendary Success<br /><strong>9</strong> - PC: Heroic Success<br /><strong>8</strong> - PC: Normal Success<br /><strong>7</strong> - NPC: Opponents or creatures larger than medium size<br /><strong>6</strong> - NPC: Toughs or creatures of medium size or smaller<br /><strong>5</strong> - PC: Normal Failure<br /><strong>4</strong> - NPC: Minions<br /><strong>3</strong> - PC: Critical Failure</p>"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -96,6 +96,10 @@
|
|||||||
"name": "Plains-Born",
|
"name": "Plains-Born",
|
||||||
"description": "<h1>Plains-Born</h1><p>You grew up on the plains. When tracking, trapping, hunting, or carrying out other similar activities (not fighting) in a plains environment, you receive a bonus die.</p>"
|
"description": "<h1>Plains-Born</h1><p>You grew up on the plains. When tracking, trapping, hunting, or carrying out other similar activities (not fighting) in a plains environment, you receive a bonus die.</p>"
|
||||||
},
|
},
|
||||||
|
"Envoûtant": {
|
||||||
|
"name": "Beguiling",
|
||||||
|
"description": "<h1>Beguiling</h1><p> Your looks and bearing are such that people who might be attracted to your type are enchanted by you. Once per day you may suggest a course of action to a number of rabble equal to appeal + d6, who will do their best to please you, even if it potentially puts them in danger.</p><p>You must have the temptress career to take this boon.</p>"
|
||||||
|
},
|
||||||
"Fortuné": {
|
"Fortuné": {
|
||||||
"name": "Great Wealth",
|
"name": "Great Wealth",
|
||||||
"description": "<h1>Great Wealth</h1><p>You have a source of income or an inheritance. Roll a bonus die on any attempt to obtain any goods, services, or other items you need whilst in your home city.</p>"
|
"description": "<h1>Great Wealth</h1><p>You have a source of income or an inheritance. Roll a bonus die on any attempt to obtain any goods, services, or other items you need whilst in your home city.</p>"
|
||||||
|
|||||||
@@ -5,6 +5,30 @@
|
|||||||
},
|
},
|
||||||
|
|
||||||
"entries": {
|
"entries": {
|
||||||
|
"Arc de guerre de Tyrus": {
|
||||||
|
"name": "Tyrus Warbow",
|
||||||
|
"description": "<h1>Tyrus Warbow</h1><p> The archers of Tyrus train from a very young age in the use of this powerful bow. Tyrus archers have fun with other warriors by lending their bows to them and then watching them struggle to aim at the proverbial “barn door”.</p>"
|
||||||
|
},
|
||||||
|
"Épée Valgardienne (1 Main)": {
|
||||||
|
"name": "Valgardian Blade (1H)",
|
||||||
|
"description": "<h1>Valgardian Blade (1H)</h1><p>Around 3’-4’ in length, the Valgardian blade is used either in one hand or in both. The Valgardian bladesmiths guard the secret of their work closely, although many have tried to copy it. It is rumoured that the strength of the blades due mainly to the quality of the iron mined locally.</p>"
|
||||||
|
},
|
||||||
|
"Épée Valgardienne (2 mains)": {
|
||||||
|
"name": "Valgardian Blade (2H)",
|
||||||
|
"description": "<h1>Valgardian Blade (2H)</h1><p>Around 3’-4’ in length, the Valgardian blade is used either in one hand or in both. The Valgardian bladesmiths guard the secret of their work closely, although many have tried to copy it. It is rumoured that the strength of the blades due mainly to the quality of the iron mined locally.</p>"
|
||||||
|
},
|
||||||
|
"Fronde de l’Axos": {
|
||||||
|
"name": "Axish Sling",
|
||||||
|
"description": "<h1>Axish Sling</h1><p>Sling: The sling is inexpensive and easy to build. It is a simple leather thong whirled around the head to cast small stones or cast lead bullets with some force, at 30’ range increments. Two-handed versions are fitted onto a staff and are called staff-slings. This imparts a greater range, making the increments 60’. The Axish sling is actually little different to any other common sling; it’s just that the people of the Axos mountains are particularly proficient with them. They have however played up the idea that there is some special plant fibre that the thongs are made from that gives them their extra range.</p>"
|
||||||
|
},
|
||||||
|
"Hache d’abordage de Parsool (1 main)": {
|
||||||
|
"name": "Parsool Sea Axe (1H)",
|
||||||
|
"description": "<h1>Parsool Sea Axe (1H)</h1><p>A boarding axe used by Parsool seamen which can be used one or two-handed.</p>"
|
||||||
|
},
|
||||||
|
"Hache d’abordage de Parsool (2 mains)": {
|
||||||
|
"name": "Parsool Sea Axe (2H)",
|
||||||
|
"description": "<h1>Parsool Sea Axe (2H)</h1><p>A boarding axe used by Parsool seamen which can be used one or two-handed.</p>"
|
||||||
|
},
|
||||||
"Arbalète": {
|
"Arbalète": {
|
||||||
"name": "Crossbow",
|
"name": "Crossbow",
|
||||||
"description": "<h1>Crossbow</h1><p>A crossbow is a simple device for firing a short bolt or quarrel with some force and little training. They take a round to load (ready to fire on the second round).</p>"
|
"description": "<h1>Crossbow</h1><p>A crossbow is a simple device for firing a short bolt or quarrel with some force and little training. They take a round to load (ready to fire on the second round).</p>"
|
||||||
|
|||||||
@@ -866,12 +866,12 @@ export class BoLActor extends Actor {
|
|||||||
if (this.system.resources.hp.value <= 0) {
|
if (this.system.resources.hp.value <= 0) {
|
||||||
if (!prone) {
|
if (!prone) {
|
||||||
await this.createEmbeddedDocuments("ActiveEffect", [
|
await this.createEmbeddedDocuments("ActiveEffect", [
|
||||||
{ name: game.i18n.localize('EFFECT.StatusProne'), icon: 'icons/svg/falling.svg', statuses: 'prone' }
|
{ name: game.i18n.localize('EFFECT.StatusProne'), img: 'icons/svg/falling.svg', statuses: ['prone'] }
|
||||||
])
|
])
|
||||||
}
|
}
|
||||||
if (this.system.resources.hp.value < -5 && !dead) {
|
if (this.system.resources.hp.value < -5 && !dead) {
|
||||||
await this.createEmbeddedDocuments("ActiveEffect", [
|
await this.createEmbeddedDocuments("ActiveEffect", [
|
||||||
{ name: game.i18n.localize('EFFECT.StatusDead'), icon: 'icons/svg/skull.svg', statuses: 'dead' }
|
{ name: game.i18n.localize('EFFECT.StatusDead'), img: 'icons/svg/skull.svg', statuses: ['dead'] }
|
||||||
])
|
])
|
||||||
}
|
}
|
||||||
ChatMessage.create({
|
ChatMessage.create({
|
||||||
|
|||||||
@@ -101,11 +101,12 @@ Hooks.once('init', async function () {
|
|||||||
// Register hooks
|
// Register hooks
|
||||||
registerHooks()
|
registerHooks()
|
||||||
|
|
||||||
if (typeof Babele !== 'undefined') {
|
});
|
||||||
Babele.get().setSystemTranslationsDir("compendiums");
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
/* -------------------------------------------- */
|
||||||
|
Hooks.once("babele.init", (babele) => {
|
||||||
|
console.log("Initializing Babele translations")
|
||||||
|
babele.setSystemTranslationsDir("compendiums");
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -191,6 +191,11 @@ export class BoLRoll {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
alchemy = foundry.utils.duplicate(alchemy)
|
alchemy = foundry.utils.duplicate(alchemy)
|
||||||
|
return this.alchemyCheckWithItem(actor, alchemy)
|
||||||
|
}
|
||||||
|
|
||||||
|
/* -------------------------------------------- */
|
||||||
|
static alchemyCheckWithItem(actor, alchemy) {
|
||||||
let alchemyData = alchemy.system
|
let alchemyData = alchemy.system
|
||||||
if (alchemyData.properties.pccurrent < alchemyData.properties.pccost) {
|
if (alchemyData.properties.pccurrent < alchemyData.properties.pccost) {
|
||||||
ui.notifications.warn("Pas assez de Points de Création investis dans la Préparation !")
|
ui.notifications.warn("Pas assez de Points de Création investis dans la Préparation !")
|
||||||
|
|||||||
@@ -413,108 +413,108 @@ BOL.bolEffectModifier = {
|
|||||||
BOL.statusEffects = [
|
BOL.statusEffects = [
|
||||||
{
|
{
|
||||||
"id": "dead",
|
"id": "dead",
|
||||||
"label": "EFFECT.StatusDead",
|
"name": "EFFECT.StatusDead",
|
||||||
"icon": "icons/svg/skull.svg"
|
"img": "icons/svg/skull.svg"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "unconscious",
|
"id": "unconscious",
|
||||||
"label": "EFFECT.StatusUnconscious",
|
"name": "EFFECT.StatusUnconscious",
|
||||||
"icon": "icons/svg/unconscious.svg"
|
"img": "icons/svg/unconscious.svg"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "sleep",
|
"id": "sleep",
|
||||||
"label": "EFFECT.StatusAsleep",
|
"name": "EFFECT.StatusAsleep",
|
||||||
"icon": "icons/svg/sleep.svg"
|
"img": "icons/svg/sleep.svg"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "stun",
|
"id": "stun",
|
||||||
"label": "EFFECT.StatusStunned",
|
"name": "EFFECT.StatusStunned",
|
||||||
"icon": "icons/svg/daze.svg"
|
"img": "icons/svg/daze.svg"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "prone",
|
"id": "prone",
|
||||||
"label": "EFFECT.StatusProne",
|
"name": "EFFECT.StatusProne",
|
||||||
"icon": "icons/svg/falling.svg"
|
"img": "icons/svg/falling.svg"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "restrain",
|
"id": "restrain",
|
||||||
"label": "EFFECT.StatusRestrained",
|
"name": "EFFECT.StatusRestrained",
|
||||||
"icon": "icons/svg/net.svg"
|
"img": "icons/svg/net.svg"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "paralysis",
|
"id": "paralysis",
|
||||||
"label": "EFFECT.StatusParalysis",
|
"name": "EFFECT.StatusParalysis",
|
||||||
"icon": "icons/svg/paralysis.svg"
|
"img": "icons/svg/paralysis.svg"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "fly",
|
"id": "fly",
|
||||||
"label": "EFFECT.StatusFlying",
|
"name": "EFFECT.StatusFlying",
|
||||||
"icon": "icons/svg/wing.svg"
|
"img": "icons/svg/wing.svg"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "blind",
|
"id": "blind",
|
||||||
"label": "EFFECT.StatusBlind",
|
"name": "EFFECT.StatusBlind",
|
||||||
"icon": "icons/svg/blind.svg"
|
"img": "icons/svg/blind.svg"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "deaf",
|
"id": "deaf",
|
||||||
"label": "EFFECT.StatusDeaf",
|
"name": "EFFECT.StatusDeaf",
|
||||||
"icon": "icons/svg/deaf.svg"
|
"img": "icons/svg/deaf.svg"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "silence",
|
"id": "silence",
|
||||||
"label": "EFFECT.StatusSilenced",
|
"name": "EFFECT.StatusSilenced",
|
||||||
"icon": "icons/svg/silenced.svg"
|
"img": "icons/svg/silenced.svg"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "fear",
|
"id": "fear",
|
||||||
"label": "EFFECT.StatusFear",
|
"name": "EFFECT.StatusFear",
|
||||||
"icon": "icons/svg/terror.svg"
|
"img": "icons/svg/terror.svg"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "burning",
|
"id": "burning",
|
||||||
"label": "EFFECT.StatusBurning",
|
"name": "EFFECT.StatusBurning",
|
||||||
"icon": "icons/svg/fire.svg"
|
"img": "icons/svg/fire.svg"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "frozen",
|
"id": "frozen",
|
||||||
"label": "EFFECT.StatusFrozen",
|
"name": "EFFECT.StatusFrozen",
|
||||||
"icon": "icons/svg/frozen.svg"
|
"img": "icons/svg/frozen.svg"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "shock",
|
"id": "shock",
|
||||||
"label": "EFFECT.StatusShocked",
|
"name": "EFFECT.StatusShocked",
|
||||||
"icon": "icons/svg/lightning.svg"
|
"img": "icons/svg/lightning.svg"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "disease",
|
"id": "disease",
|
||||||
"label": "EFFECT.StatusDisease",
|
"name": "EFFECT.StatusDisease",
|
||||||
"icon": "icons/svg/biohazard.svg"
|
"img": "icons/svg/biohazard.svg"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "poison",
|
"id": "poison",
|
||||||
"label": "EFFECT.StatusPoison",
|
"name": "EFFECT.StatusPoison",
|
||||||
"icon": "icons/svg/poison.svg"
|
"img": "icons/svg/poison.svg"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "curse",
|
"id": "curse",
|
||||||
"label": "EFFECT.StatusCursed",
|
"name": "EFFECT.StatusCursed",
|
||||||
"icon": "icons/svg/sun.svg"
|
"img": "icons/svg/sun.svg"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "invisible",
|
"id": "invisible",
|
||||||
"label": "EFFECT.StatusInvisible",
|
"name": "EFFECT.StatusInvisible",
|
||||||
"icon": "icons/svg/invisible.svg"
|
"img": "icons/svg/invisible.svg"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "target",
|
"id": "target",
|
||||||
"label": "EFFECT.StatusTarget",
|
"name": "EFFECT.StatusTarget",
|
||||||
"icon": "icons/svg/target.svg"
|
"img": "icons/svg/target.svg"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "eye",
|
"id": "eye",
|
||||||
"label": "EFFECT.StatusMarked",
|
"name": "EFFECT.StatusMarked",
|
||||||
"icon": "icons/svg/eye.svg"
|
"img": "icons/svg/eye.svg"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|||||||
@@ -1,52 +1,228 @@
|
|||||||
import {BoLRoll} from "../controllers/bol-rolls.js";
|
import { BoLRoll } from "../controllers/bol-rolls.js";
|
||||||
|
|
||||||
export class Macros {
|
/**
|
||||||
/**
|
* BoL Macro API — accessible via game.bol.macros
|
||||||
* @name getSpeakersActor
|
|
||||||
* @description
|
|
||||||
*
|
*
|
||||||
* @returns
|
* Usage examples (in a Foundry macro):
|
||||||
|
*
|
||||||
|
* game.bol.macros.rollAttribute("vigor")
|
||||||
|
* game.bol.macros.rollAttribute("mind")
|
||||||
|
*
|
||||||
|
* game.bol.macros.rollAptitude("melee")
|
||||||
|
* game.bol.macros.rollAptitude("ranged")
|
||||||
|
* game.bol.macros.rollAptitude("def")
|
||||||
|
* game.bol.macros.rollAptitude("init")
|
||||||
|
*
|
||||||
|
* game.bol.macros.rollWeapon("Épée courte") // by name (partial match)
|
||||||
|
* game.bol.macros.rollWeapon(0) // by index (first weapon)
|
||||||
|
*
|
||||||
|
* game.bol.macros.rollSpell("Boule de feu") // by name (partial match)
|
||||||
|
* game.bol.macros.rollSpell(0) // by index
|
||||||
|
*
|
||||||
|
* game.bol.macros.rollAlchemy("Potion de soin") // by name (partial match)
|
||||||
|
* game.bol.macros.rollAlchemy(0) // by index
|
||||||
|
*
|
||||||
|
* game.bol.macros.rollHoroscope("minor")
|
||||||
|
* game.bol.macros.rollHoroscope("major")
|
||||||
|
*
|
||||||
|
* // Generic dispatcher:
|
||||||
|
* game.bol.macros.roll("attribute", "vigor")
|
||||||
|
* game.bol.macros.roll("aptitude", "melee")
|
||||||
|
* game.bol.macros.roll("weapon", "Épée courte")
|
||||||
|
* game.bol.macros.roll("spell", "Boule de feu")
|
||||||
|
* game.bol.macros.roll("alchemy", 0)
|
||||||
|
* game.bol.macros.roll("horoscope", "minor")
|
||||||
*/
|
*/
|
||||||
static getSpeakersActor = function(){
|
export class Macros {
|
||||||
// Vérifie qu'un seul token est sélectionné
|
|
||||||
const tokens = canvas.tokens.controlled;
|
/* -------------------------------------------- */
|
||||||
|
/**
|
||||||
|
* Resolves the actor for macro use:
|
||||||
|
* - If multiple tokens are selected → error (always)
|
||||||
|
* - If exactly one token is selected → use it (GM or player)
|
||||||
|
* - If no token selected and user is GM → error (GM must select a token)
|
||||||
|
* - If no token selected and user is a player → use their assigned character
|
||||||
|
* @returns {Actor|null}
|
||||||
|
*/
|
||||||
|
static getSpeakersActor() {
|
||||||
|
const tokens = canvas.tokens?.controlled ?? []
|
||||||
|
|
||||||
if (tokens.length > 1) {
|
if (tokens.length > 1) {
|
||||||
ui.notifications.warn(game.i18n.localize('BOL.notification.MacroMultipleTokensSelected'));
|
ui.notifications.warn(game.i18n.localize('BOL.notification.MacroMultipleTokensSelected'))
|
||||||
return null;
|
return null
|
||||||
}
|
}
|
||||||
|
|
||||||
const speaker = ChatMessage.getSpeaker();
|
if (tokens.length === 1) {
|
||||||
let actor;
|
return tokens[0].actor ?? null
|
||||||
// Si un token est sélectionné, le prendre comme acteur cible
|
|
||||||
if (speaker.token) actor = game.actors.tokens[speaker.token];
|
|
||||||
// Sinon prendre l'acteur par défaut pour l'utilisateur courrant
|
|
||||||
if (!actor) actor = game.actors.get(speaker.actor);
|
|
||||||
return actor;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static rollMacro = async function (rollType, key, adv, mod){
|
|
||||||
const actor = this.getSpeakersActor();
|
|
||||||
// Several tokens selected
|
|
||||||
if (actor === null) return;
|
|
||||||
// No token selected
|
// No token selected
|
||||||
if (actor === undefined) return ui.notifications.error(game.i18n.localize("BOL.notification.MacroNoTokenSelected"));
|
if (game.user.isGM) {
|
||||||
|
ui.notifications.error(game.i18n.localize("BOL.notification.MacroNoTokenSelected"))
|
||||||
const actorData = {};
|
return null
|
||||||
actorData.data = {
|
|
||||||
features : actor.buildFeatures()
|
|
||||||
};
|
|
||||||
|
|
||||||
if(rollType === "attribute") {
|
|
||||||
let attribute = eval(`actor.system.attributes.${key}`);
|
|
||||||
let rollLabel = (attribute.label) ? game.i18n.localize(attribute.label) : null;
|
|
||||||
let description = actor.name + " - " + game.i18n.localize('BOL.ui.attributeCheck') + " - " + game.i18n.localize(attribute.label) ;
|
|
||||||
BoLRoll.attributeRollDialog(actor, actorData, attribute, rollLabel, description, adv, mod);
|
|
||||||
}
|
}
|
||||||
else if(rollType === "aptitude") {
|
|
||||||
let aptitude = eval(`actor.system.aptitudes.${key}`);
|
// Player: fall back to their assigned character
|
||||||
let rollLabel = (aptitude.label) ? game.i18n.localize(aptitude.label) : null;
|
const actor = game.user.character
|
||||||
let description = actor.name + " - " + game.i18n.localize('BOL.ui.aptitudeCheck') + " - " + game.i18n.localize(aptitude.label) ;
|
if (!actor) {
|
||||||
BoLRoll.aptitudeRollDialog(actor, actorData, aptitude, rollLabel, description, adv, mod);
|
ui.notifications.error(game.i18n.localize("BOL.notification.MacroNoTokenSelected"))
|
||||||
|
return null
|
||||||
}
|
}
|
||||||
|
return actor
|
||||||
|
}
|
||||||
|
|
||||||
|
/* -------------------------------------------- */
|
||||||
|
/**
|
||||||
|
* Finds an item on an actor by name (partial, case-insensitive) or index.
|
||||||
|
* @param {Actor} actor
|
||||||
|
* @param {string} type - item type: "weapon", "spell", "alchemy"
|
||||||
|
* @param {string|number} nameOrIndex
|
||||||
|
* @returns {object|undefined}
|
||||||
|
*/
|
||||||
|
static _findItem(actor, type, nameOrIndex) {
|
||||||
|
const items = actor.items.filter(i => i.type === type)
|
||||||
|
if (items.length === 0) {
|
||||||
|
ui.notifications.warn(`${actor.name} : aucun(e) ${type} trouvé(e).`)
|
||||||
|
return undefined
|
||||||
|
}
|
||||||
|
if (nameOrIndex === undefined || nameOrIndex === null) {
|
||||||
|
if (items.length === 1) return foundry.utils.duplicate(items[0])
|
||||||
|
const names = items.map((it, i) => `[${i}] ${it.name}`).join(', ')
|
||||||
|
ui.notifications.warn(`Précisez le nom ou l'index : ${names}`)
|
||||||
|
return undefined
|
||||||
|
}
|
||||||
|
if (typeof nameOrIndex === "number") {
|
||||||
|
const item = items[nameOrIndex]
|
||||||
|
if (!item) {
|
||||||
|
ui.notifications.warn(`${actor.name} : index ${nameOrIndex} invalide pour ${type}.`)
|
||||||
|
return undefined
|
||||||
|
}
|
||||||
|
return foundry.utils.duplicate(item)
|
||||||
|
}
|
||||||
|
const lower = String(nameOrIndex).toLowerCase()
|
||||||
|
const found = items.find(i => i.name.toLowerCase().includes(lower))
|
||||||
|
if (!found) {
|
||||||
|
ui.notifications.warn(`${actor.name} : ${type} "${nameOrIndex}" introuvable.`)
|
||||||
|
return undefined
|
||||||
|
}
|
||||||
|
return foundry.utils.duplicate(found)
|
||||||
|
}
|
||||||
|
|
||||||
|
/* -------------------------------------------- */
|
||||||
|
/**
|
||||||
|
* Roll an attribute check.
|
||||||
|
* @param {string} key - "vigor" | "agility" | "mind" | "appeal"
|
||||||
|
* @param {Actor} [actor] - optional, defaults to selected/owned token
|
||||||
|
*/
|
||||||
|
static rollAttribute(key = "vigor", actor = undefined) {
|
||||||
|
actor = actor ?? this.getSpeakersActor()
|
||||||
|
if (!actor) return
|
||||||
|
if (!actor.system.attributes[key]) {
|
||||||
|
ui.notifications.warn(`Attribut inconnu : "${key}". Valeurs : vigor, agility, mind, appeal`)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
return BoLRoll.attributeCheck(actor, key)
|
||||||
|
}
|
||||||
|
|
||||||
|
/* -------------------------------------------- */
|
||||||
|
/**
|
||||||
|
* Roll an aptitude check.
|
||||||
|
* @param {string} key - "init" | "melee" | "ranged" | "def"
|
||||||
|
* @param {Actor} [actor] - optional, defaults to selected/owned token
|
||||||
|
*/
|
||||||
|
static rollAptitude(key = "melee", actor = undefined) {
|
||||||
|
actor = actor ?? this.getSpeakersActor()
|
||||||
|
if (!actor) return
|
||||||
|
if (!actor.system.aptitudes[key]) {
|
||||||
|
ui.notifications.warn(`Aptitude inconnue : "${key}". Valeurs : init, melee, ranged, def`)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
return BoLRoll.aptitudeCheck(actor, key)
|
||||||
|
}
|
||||||
|
|
||||||
|
/* -------------------------------------------- */
|
||||||
|
/**
|
||||||
|
* Roll a weapon attack.
|
||||||
|
* @param {string|number} [nameOrIndex] - weapon name (partial) or index. Defaults to first weapon if only one.
|
||||||
|
* @param {Actor} [actor] - optional, defaults to selected/owned token
|
||||||
|
*/
|
||||||
|
static rollWeapon(nameOrIndex = undefined, actor = undefined) {
|
||||||
|
actor = actor ?? this.getSpeakersActor()
|
||||||
|
if (!actor) return
|
||||||
|
const weapon = this._findItem(actor, "weapon", nameOrIndex)
|
||||||
|
if (!weapon) return
|
||||||
|
return BoLRoll.weaponCheckWithWeapon(actor, weapon)
|
||||||
|
}
|
||||||
|
|
||||||
|
/* -------------------------------------------- */
|
||||||
|
/**
|
||||||
|
* Roll a spell check.
|
||||||
|
* @param {string|number} [nameOrIndex] - spell name (partial) or index
|
||||||
|
* @param {Actor} [actor] - optional, defaults to selected/owned token
|
||||||
|
*/
|
||||||
|
static rollSpell(nameOrIndex = undefined, actor = undefined) {
|
||||||
|
actor = actor ?? this.getSpeakersActor()
|
||||||
|
if (!actor) return
|
||||||
|
if ((actor.system.resources.power?.value ?? 1) <= 0) {
|
||||||
|
ui.notifications.warn("Plus assez de points de Pouvoir !")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
const spell = this._findItem(actor, "spell", nameOrIndex)
|
||||||
|
if (!spell) return
|
||||||
|
return BoLRoll.spellCheckWithSpell(actor, spell)
|
||||||
|
}
|
||||||
|
|
||||||
|
/* -------------------------------------------- */
|
||||||
|
/**
|
||||||
|
* Roll an alchemy check.
|
||||||
|
* @param {string|number} [nameOrIndex] - alchemy item name (partial) or index
|
||||||
|
* @param {Actor} [actor] - optional, defaults to selected/owned token
|
||||||
|
*/
|
||||||
|
static rollAlchemy(nameOrIndex = undefined, actor = undefined) {
|
||||||
|
actor = actor ?? this.getSpeakersActor()
|
||||||
|
if (!actor) return
|
||||||
|
const alchemy = this._findItem(actor, "alchemy", nameOrIndex)
|
||||||
|
if (!alchemy) return
|
||||||
|
return BoLRoll.alchemyCheckWithItem(actor, alchemy)
|
||||||
|
}
|
||||||
|
|
||||||
|
/* -------------------------------------------- */
|
||||||
|
/**
|
||||||
|
* Roll a horoscope check.
|
||||||
|
* @param {"minor"|"major"} [type="minor"]
|
||||||
|
* @param {Actor} [actor] - optional, defaults to selected/owned token
|
||||||
|
*/
|
||||||
|
static rollHoroscope(type = "minor", actor = undefined) {
|
||||||
|
actor = actor ?? this.getSpeakersActor()
|
||||||
|
if (!actor) return
|
||||||
|
return BoLRoll.horoscopeCheck(actor, undefined, type)
|
||||||
|
}
|
||||||
|
|
||||||
|
/* -------------------------------------------- */
|
||||||
|
/**
|
||||||
|
* Generic roll dispatcher.
|
||||||
|
* @param {"attribute"|"aptitude"|"weapon"|"spell"|"alchemy"|"horoscope"} type
|
||||||
|
* @param {string|number} [key] - attribute/aptitude key, item name/index, or horoscope type
|
||||||
|
* @param {Actor} [actor] - optional, defaults to selected/owned token
|
||||||
|
*/
|
||||||
|
static roll(type, key = undefined, actor = undefined) {
|
||||||
|
switch (type) {
|
||||||
|
case "attribute": return this.rollAttribute(key ?? "vigor", actor)
|
||||||
|
case "aptitude": return this.rollAptitude(key ?? "melee", actor)
|
||||||
|
case "weapon": return this.rollWeapon(key, actor)
|
||||||
|
case "spell": return this.rollSpell(key, actor)
|
||||||
|
case "alchemy": return this.rollAlchemy(key, actor)
|
||||||
|
case "horoscope": return this.rollHoroscope(key ?? "minor", actor)
|
||||||
|
default:
|
||||||
|
ui.notifications.warn(`Type de jet inconnu : "${type}". Types valides : attribute, aptitude, weapon, spell, alchemy, horoscope`)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* -------------------------------------------- */
|
||||||
|
// Kept for backward-compat (previously called by old macros)
|
||||||
|
static rollMacro = async function (rollType, key) {
|
||||||
|
const actor = Macros.getSpeakersActor()
|
||||||
|
if (!actor) return
|
||||||
|
return Macros.roll(rollType, key, actor)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
MANIFEST-001105
|
MANIFEST-001182
|
||||||
|
|||||||
@@ -1,7 +1,11 @@
|
|||||||
2026/03/31-20:06:53.991987 7ff9c7fff6c0 Recovering log #1103
|
2026/05/25-23:00:12.612129 7fe4caffd6c0 Delete type=3 #1
|
||||||
2026/03/31-20:06:54.001305 7ff9c7fff6c0 Delete type=3 #1101
|
2026/05/25-23:00:36.536419 7fe4c9ffb6c0 Level-0 table #1185: started
|
||||||
2026/03/31-20:06:54.001357 7ff9c7fff6c0 Delete type=0 #1103
|
2026/05/25-23:00:36.536444 7fe4c9ffb6c0 Level-0 table #1185: 0 bytes OK
|
||||||
2026/03/31-20:07:15.402162 7ff7477ef6c0 Level-0 table #1108: started
|
2026/05/25-23:00:36.543456 7fe4c9ffb6c0 Delete type=0 #1183
|
||||||
2026/03/31-20:07:15.402189 7ff7477ef6c0 Level-0 table #1108: 0 bytes OK
|
2026/05/25-23:00:36.571253 7fe4c9ffb6c0 Manual compaction at level-0 from '!journal!6cCdSvQgEHJ1bvX4' @ 72057594037927935 : 1 .. '!journal.pages!veAAxCtCKcFIsnln.0kUgZspxXO7VS8bd' @ 0 : 0; will stop at '!journal.pages!veAAxCtCKcFIsnln.0kUgZspxXO7VS8bd' @ 321 : 1
|
||||||
2026/03/31-20:07:15.409398 7ff7477ef6c0 Delete type=0 #1106
|
2026/05/25-23:00:36.571263 7fe4c9ffb6c0 Compacting 1@0 + 0@1 files
|
||||||
2026/03/31-20:07:15.409627 7ff7477ef6c0 Manual compaction at level-0 from '!journal!3xJg1rCxnWvEmoxS' @ 72057594037927935 : 1 .. '!journal.pages!veAAxCtCKcFIsnln.0kUgZspxXO7VS8bd' @ 0 : 0; will stop at (end)
|
2026/05/25-23:00:36.575045 7fe4c9ffb6c0 Generated table #1186@0: 23 keys, 27230 bytes
|
||||||
|
2026/05/25-23:00:36.575065 7fe4c9ffb6c0 Compacted 1@0 + 0@1 files => 27230 bytes
|
||||||
|
2026/05/25-23:00:36.581924 7fe4c9ffb6c0 compacted to: files[ 0 1 0 0 0 0 0 ]
|
||||||
|
2026/05/25-23:00:36.582006 7fe4c9ffb6c0 Delete type=2 #1137
|
||||||
|
2026/05/25-23:00:36.591655 7fe4c9ffb6c0 Manual compaction at level-0 from '!journal.pages!veAAxCtCKcFIsnln.0kUgZspxXO7VS8bd' @ 321 : 1 .. '!journal.pages!veAAxCtCKcFIsnln.0kUgZspxXO7VS8bd' @ 0 : 0; will stop at (end)
|
||||||
|
|||||||
@@ -1,7 +1,4 @@
|
|||||||
2026/03/31-14:46:22.078470 7ff9c7fff6c0 Recovering log #1099
|
2026/05/25-23:00:12.597782 7fe4caffd6c0 Log #1180: 0 ops saved to Table #1181 OK
|
||||||
2026/03/31-14:46:22.102288 7ff9c7fff6c0 Delete type=3 #1097
|
2026/05/25-23:00:12.597848 7fe4caffd6c0 Archiving /home/morr/foundry/foundrydata-dev/Data/systems/bol/packs/aides-de-jeu/001180.log: OK
|
||||||
2026/03/31-14:46:22.102356 7ff9c7fff6c0 Delete type=0 #1099
|
2026/05/25-23:00:12.598005 7fe4caffd6c0 Table #1137: 23 entries OK
|
||||||
2026/03/31-14:51:39.421905 7ff7477ef6c0 Level-0 table #1104: started
|
2026/05/25-23:00:12.601125 7fe4caffd6c0 **** Repaired leveldb /home/morr/foundry/foundrydata-dev/Data/systems/bol/packs/aides-de-jeu; recovered 1 files; 27230 bytes. Some data may have been lost. ****
|
||||||
2026/03/31-14:51:39.421933 7ff7477ef6c0 Level-0 table #1104: 0 bytes OK
|
|
||||||
2026/03/31-14:51:39.492511 7ff7477ef6c0 Delete type=0 #1102
|
|
||||||
2026/03/31-14:51:39.632201 7ff7477ef6c0 Manual compaction at level-0 from '!journal!3xJg1rCxnWvEmoxS' @ 72057594037927935 : 1 .. '!journal.pages!veAAxCtCKcFIsnln.0kUgZspxXO7VS8bd' @ 0 : 0; will stop at (end)
|
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
MANIFEST-001010
|
MANIFEST-001083
|
||||||
|
|||||||
@@ -1,7 +1,11 @@
|
|||||||
2026/03/31-20:06:53.966374 7ff9fd1fe6c0 Recovering log #1008
|
2026/05/25-23:00:12.578214 7fe4cb7fe6c0 Delete type=3 #1
|
||||||
2026/03/31-20:06:53.976141 7ff9fd1fe6c0 Delete type=3 #1006
|
2026/05/25-23:00:36.530100 7fe4c9ffb6c0 Level-0 table #1086: started
|
||||||
2026/03/31-20:06:53.976208 7ff9fd1fe6c0 Delete type=0 #1008
|
2026/05/25-23:00:36.530126 7fe4c9ffb6c0 Level-0 table #1086: 0 bytes OK
|
||||||
2026/03/31-20:07:15.381727 7ff7477ef6c0 Level-0 table #1013: started
|
2026/05/25-23:00:36.536304 7fe4c9ffb6c0 Delete type=0 #1084
|
||||||
2026/03/31-20:07:15.381754 7ff7477ef6c0 Level-0 table #1013: 0 bytes OK
|
2026/05/25-23:00:36.553226 7fe4c9ffb6c0 Manual compaction at level-0 from '!items!G3dZTHIabA3LA1hY' @ 72057594037927935 : 1 .. '!items!xhEcsi3WHjbt2ro9' @ 0 : 0; will stop at '!items!xhEcsi3WHjbt2ro9' @ 42 : 1
|
||||||
2026/03/31-20:07:15.388075 7ff7477ef6c0 Delete type=0 #1011
|
2026/05/25-23:00:36.553236 7fe4c9ffb6c0 Compacting 1@0 + 0@1 files
|
||||||
2026/03/31-20:07:15.409588 7ff7477ef6c0 Manual compaction at level-0 from '!items!G3dZTHIabA3LA1hY' @ 72057594037927935 : 1 .. '!items!xhEcsi3WHjbt2ro9' @ 0 : 0; will stop at (end)
|
2026/05/25-23:00:36.557165 7fe4c9ffb6c0 Generated table #1087@0: 6 keys, 5424 bytes
|
||||||
|
2026/05/25-23:00:36.557185 7fe4c9ffb6c0 Compacted 1@0 + 0@1 files => 5424 bytes
|
||||||
|
2026/05/25-23:00:36.565017 7fe4c9ffb6c0 compacted to: files[ 0 1 0 0 0 0 0 ]
|
||||||
|
2026/05/25-23:00:36.565064 7fe4c9ffb6c0 Delete type=2 #1022
|
||||||
|
2026/05/25-23:00:36.582164 7fe4c9ffb6c0 Manual compaction at level-0 from '!items!xhEcsi3WHjbt2ro9' @ 42 : 1 .. '!items!xhEcsi3WHjbt2ro9' @ 0 : 0; will stop at (end)
|
||||||
|
|||||||
@@ -1,7 +1,4 @@
|
|||||||
2026/03/31-14:46:22.050419 7ff9fd9ff6c0 Recovering log #1004
|
2026/05/25-23:00:12.561159 7fe4cb7fe6c0 Log #1081: 0 ops saved to Table #1082 OK
|
||||||
2026/03/31-14:46:22.061129 7ff9fd9ff6c0 Delete type=3 #1002
|
2026/05/25-23:00:12.561275 7fe4cb7fe6c0 Archiving /home/morr/foundry/foundrydata-dev/Data/systems/bol/packs/armors/001081.log: OK
|
||||||
2026/03/31-14:46:22.061186 7ff9fd9ff6c0 Delete type=0 #1004
|
2026/05/25-23:00:12.561353 7fe4cb7fe6c0 Table #1022: 6 entries OK
|
||||||
2026/03/31-14:51:39.282491 7ff7477ef6c0 Level-0 table #1009: started
|
2026/05/25-23:00:12.565343 7fe4cb7fe6c0 **** Repaired leveldb /home/morr/foundry/foundrydata-dev/Data/systems/bol/packs/armors; recovered 1 files; 5424 bytes. Some data may have been lost. ****
|
||||||
2026/03/31-14:51:39.282521 7ff7477ef6c0 Level-0 table #1009: 0 bytes OK
|
|
||||||
2026/03/31-14:51:39.343764 7ff7477ef6c0 Delete type=0 #1007
|
|
||||||
2026/03/31-14:51:39.421893 7ff7477ef6c0 Manual compaction at level-0 from '!items!G3dZTHIabA3LA1hY' @ 72057594037927935 : 1 .. '!items!xhEcsi3WHjbt2ro9' @ 0 : 0; will stop at (end)
|
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
MANIFEST-001104
|
MANIFEST-001177
|
||||||
|
|||||||
@@ -1,7 +1,11 @@
|
|||||||
2026/03/31-20:06:53.857244 7ff9c7fff6c0 Recovering log #1102
|
2026/05/25-23:00:12.425549 7fe4ca7fc6c0 Delete type=3 #1
|
||||||
2026/03/31-20:06:53.867361 7ff9c7fff6c0 Delete type=3 #1100
|
2026/05/25-23:00:36.388047 7fe4c9ffb6c0 Level-0 table #1180: started
|
||||||
2026/03/31-20:06:53.867406 7ff9c7fff6c0 Delete type=0 #1102
|
2026/05/25-23:00:36.388101 7fe4c9ffb6c0 Level-0 table #1180: 0 bytes OK
|
||||||
2026/03/31-20:07:15.333382 7ff7477ef6c0 Level-0 table #1107: started
|
2026/05/25-23:00:36.395212 7fe4c9ffb6c0 Delete type=0 #1178
|
||||||
2026/03/31-20:07:15.333411 7ff7477ef6c0 Level-0 table #1107: 0 bytes OK
|
2026/05/25-23:00:36.417679 7fe4c9ffb6c0 Manual compaction at level-0 from '!items!039ZF3E3MtAGwbiX' @ 72057594037927935 : 1 .. '!items!zgspy1QKaxdEetEw' @ 0 : 0; will stop at '!items!zgspy1QKaxdEetEw' @ 533 : 1
|
||||||
2026/03/31-20:07:15.339801 7ff7477ef6c0 Delete type=0 #1105
|
2026/05/25-23:00:36.417686 7fe4c9ffb6c0 Compacting 1@0 + 0@1 files
|
||||||
2026/03/31-20:07:15.353373 7ff7477ef6c0 Manual compaction at level-0 from '!items!039ZF3E3MtAGwbiX' @ 72057594037927935 : 1 .. '!items!zgspy1QKaxdEetEw' @ 0 : 0; will stop at (end)
|
2026/05/25-23:00:36.422045 7fe4c9ffb6c0 Generated table #1181@0: 61 keys, 20970 bytes
|
||||||
|
2026/05/25-23:00:36.422060 7fe4c9ffb6c0 Compacted 1@0 + 0@1 files => 20970 bytes
|
||||||
|
2026/05/25-23:00:36.429165 7fe4c9ffb6c0 compacted to: files[ 0 1 0 0 0 0 0 ]
|
||||||
|
2026/05/25-23:00:36.429431 7fe4c9ffb6c0 Delete type=2 #1116
|
||||||
|
2026/05/25-23:00:36.458787 7fe4c9ffb6c0 Manual compaction at level-0 from '!items!zgspy1QKaxdEetEw' @ 533 : 1 .. '!items!zgspy1QKaxdEetEw' @ 0 : 0; will stop at (end)
|
||||||
|
|||||||
@@ -1,7 +1,4 @@
|
|||||||
2026/03/31-14:46:21.936175 7ff9fc9fd6c0 Recovering log #1098
|
2026/05/25-23:00:12.401220 7fe4ca7fc6c0 Log #1175: 0 ops saved to Table #1176 OK
|
||||||
2026/03/31-14:46:21.946959 7ff9fc9fd6c0 Delete type=3 #1096
|
2026/05/25-23:00:12.401339 7fe4ca7fc6c0 Archiving /home/morr/foundry/foundrydata-dev/Data/systems/bol/packs/boons/001175.log: OK
|
||||||
2026/03/31-14:46:21.947024 7ff9fc9fd6c0 Delete type=0 #1098
|
2026/05/25-23:00:12.401481 7fe4ca7fc6c0 Table #1116: 61 entries OK
|
||||||
2026/03/31-14:51:38.889578 7ff7477ef6c0 Level-0 table #1103: started
|
2026/05/25-23:00:12.404758 7fe4ca7fc6c0 **** Repaired leveldb /home/morr/foundry/foundrydata-dev/Data/systems/bol/packs/boons; recovered 1 files; 20970 bytes. Some data may have been lost. ****
|
||||||
2026/03/31-14:51:38.889609 7ff7477ef6c0 Level-0 table #1103: 0 bytes OK
|
|
||||||
2026/03/31-14:51:38.959453 7ff7477ef6c0 Delete type=0 #1101
|
|
||||||
2026/03/31-14:51:39.078798 7ff7477ef6c0 Manual compaction at level-0 from '!items!039ZF3E3MtAGwbiX' @ 72057594037927935 : 1 .. '!items!zgspy1QKaxdEetEw' @ 0 : 0; will stop at (end)
|
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
MANIFEST-001103
|
MANIFEST-001176
|
||||||
|
|||||||
@@ -1,7 +1,11 @@
|
|||||||
2026/03/31-20:06:53.872789 7ff9fc9fd6c0 Recovering log #1101
|
2026/05/25-23:00:12.447017 7fe4caffd6c0 Delete type=3 #1
|
||||||
2026/03/31-20:06:53.882612 7ff9fc9fd6c0 Delete type=3 #1099
|
2026/05/25-23:00:36.410024 7fe4c9ffb6c0 Level-0 table #1179: started
|
||||||
2026/03/31-20:06:53.882655 7ff9fc9fd6c0 Delete type=0 #1101
|
2026/05/25-23:00:36.410044 7fe4c9ffb6c0 Level-0 table #1179: 0 bytes OK
|
||||||
2026/03/31-20:07:15.346737 7ff7477ef6c0 Level-0 table #1106: started
|
2026/05/25-23:00:36.417584 7fe4c9ffb6c0 Delete type=0 #1177
|
||||||
2026/03/31-20:07:15.346766 7ff7477ef6c0 Level-0 table #1106: 0 bytes OK
|
2026/05/25-23:00:36.449756 7fe4c9ffb6c0 Manual compaction at level-0 from '!items!CoqlfsDV1gL5swbK' @ 72057594037927935 : 1 .. '!items!yofwG0YrsL902G77' @ 0 : 0; will stop at '!items!yofwG0YrsL902G77' @ 64 : 1
|
||||||
2026/03/31-20:07:15.353211 7ff7477ef6c0 Delete type=0 #1104
|
2026/05/25-23:00:36.449760 7fe4c9ffb6c0 Compacting 1@0 + 0@1 files
|
||||||
2026/03/31-20:07:15.353392 7ff7477ef6c0 Manual compaction at level-0 from '!items!CoqlfsDV1gL5swbK' @ 72057594037927935 : 1 .. '!items!yofwG0YrsL902G77' @ 0 : 0; will stop at (end)
|
2026/05/25-23:00:36.452819 7fe4c9ffb6c0 Generated table #1180@0: 8 keys, 2453 bytes
|
||||||
|
2026/05/25-23:00:36.452824 7fe4c9ffb6c0 Compacted 1@0 + 0@1 files => 2453 bytes
|
||||||
|
2026/05/25-23:00:36.458709 7fe4c9ffb6c0 compacted to: files[ 0 1 0 0 0 0 0 ]
|
||||||
|
2026/05/25-23:00:36.458735 7fe4c9ffb6c0 Delete type=2 #1115
|
||||||
|
2026/05/25-23:00:36.458914 7fe4c9ffb6c0 Manual compaction at level-0 from '!items!yofwG0YrsL902G77' @ 64 : 1 .. '!items!yofwG0YrsL902G77' @ 0 : 0; will stop at (end)
|
||||||
|
|||||||
@@ -1,7 +1,4 @@
|
|||||||
2026/03/31-14:46:21.951356 7ff9fd1fe6c0 Recovering log #1097
|
2026/05/25-23:00:12.429919 7fe4caffd6c0 Log #1174: 0 ops saved to Table #1175 OK
|
||||||
2026/03/31-14:46:21.961416 7ff9fd1fe6c0 Delete type=3 #1095
|
2026/05/25-23:00:12.430037 7fe4caffd6c0 Archiving /home/morr/foundry/foundrydata-dev/Data/systems/bol/packs/boonsflawscreatures/001174.log: OK
|
||||||
2026/03/31-14:46:21.961501 7ff9fd1fe6c0 Delete type=0 #1097
|
2026/05/25-23:00:12.430106 7fe4caffd6c0 Table #1115: 8 entries OK
|
||||||
2026/03/31-14:51:38.959612 7ff7477ef6c0 Level-0 table #1102: started
|
2026/05/25-23:00:12.434252 7fe4caffd6c0 **** Repaired leveldb /home/morr/foundry/foundrydata-dev/Data/systems/bol/packs/boonsflawscreatures; recovered 1 files; 2453 bytes. Some data may have been lost. ****
|
||||||
2026/03/31-14:51:38.959651 7ff7477ef6c0 Level-0 table #1102: 0 bytes OK
|
|
||||||
2026/03/31-14:51:39.018752 7ff7477ef6c0 Delete type=0 #1100
|
|
||||||
2026/03/31-14:51:39.143657 7ff7477ef6c0 Manual compaction at level-0 from '!items!CoqlfsDV1gL5swbK' @ 72057594037927935 : 1 .. '!items!yofwG0YrsL902G77' @ 0 : 0; will stop at (end)
|
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
MANIFEST-001103
|
MANIFEST-001176
|
||||||
|
|||||||
@@ -1,7 +1,11 @@
|
|||||||
2026/03/31-20:06:53.899920 7ff9fd9ff6c0 Recovering log #1101
|
2026/05/25-23:00:12.484684 7fe4cbfff6c0 Delete type=3 #1
|
||||||
2026/03/31-20:06:53.909847 7ff9fd9ff6c0 Delete type=3 #1099
|
2026/05/25-23:00:36.403076 7fe4c9ffb6c0 Level-0 table #1179: started
|
||||||
2026/03/31-20:06:53.909916 7ff9fd9ff6c0 Delete type=0 #1101
|
2026/05/25-23:00:36.403094 7fe4c9ffb6c0 Level-0 table #1179: 0 bytes OK
|
||||||
2026/03/31-20:07:15.339949 7ff7477ef6c0 Level-0 table #1106: started
|
2026/05/25-23:00:36.409935 7fe4c9ffb6c0 Delete type=0 #1177
|
||||||
2026/03/31-20:07:15.339973 7ff7477ef6c0 Level-0 table #1106: 0 bytes OK
|
2026/05/25-23:00:36.439840 7fe4c9ffb6c0 Manual compaction at level-0 from '!items!4S4xAfMXGnuU0O1a' @ 72057594037927935 : 1 .. '!items!zxY3sW0iCJBvwjOS' @ 0 : 0; will stop at '!items!zxY3sW0iCJBvwjOS' @ 215 : 1
|
||||||
2026/03/31-20:07:15.346571 7ff7477ef6c0 Delete type=0 #1104
|
2026/05/25-23:00:36.439845 7fe4c9ffb6c0 Compacting 1@0 + 0@1 files
|
||||||
2026/03/31-20:07:15.353383 7ff7477ef6c0 Manual compaction at level-0 from '!items!4S4xAfMXGnuU0O1a' @ 72057594037927935 : 1 .. '!items!zxY3sW0iCJBvwjOS' @ 0 : 0; will stop at (end)
|
2026/05/25-23:00:36.443478 7fe4c9ffb6c0 Generated table #1180@0: 27 keys, 42639 bytes
|
||||||
|
2026/05/25-23:00:36.443484 7fe4c9ffb6c0 Compacted 1@0 + 0@1 files => 42639 bytes
|
||||||
|
2026/05/25-23:00:36.449667 7fe4c9ffb6c0 compacted to: files[ 0 1 0 0 0 0 0 ]
|
||||||
|
2026/05/25-23:00:36.449695 7fe4c9ffb6c0 Delete type=2 #1115
|
||||||
|
2026/05/25-23:00:36.458796 7fe4c9ffb6c0 Manual compaction at level-0 from '!items!zxY3sW0iCJBvwjOS' @ 215 : 1 .. '!items!zxY3sW0iCJBvwjOS' @ 0 : 0; will stop at (end)
|
||||||
|
|||||||
@@ -1,7 +1,4 @@
|
|||||||
2026/03/31-14:46:21.979659 7ff9fc9fd6c0 Recovering log #1097
|
2026/05/25-23:00:12.469657 7fe4cbfff6c0 Log #1174: 0 ops saved to Table #1175 OK
|
||||||
2026/03/31-14:46:21.989353 7ff9fc9fd6c0 Delete type=3 #1095
|
2026/05/25-23:00:12.469724 7fe4cbfff6c0 Archiving /home/morr/foundry/foundrydata-dev/Data/systems/bol/packs/careers/001174.log: OK
|
||||||
2026/03/31-14:46:21.989419 7ff9fc9fd6c0 Delete type=0 #1097
|
2026/05/25-23:00:12.469831 7fe4cbfff6c0 Table #1115: 27 entries OK
|
||||||
2026/03/31-14:51:38.683653 7ff7477ef6c0 Level-0 table #1102: started
|
2026/05/25-23:00:12.473085 7fe4cbfff6c0 **** Repaired leveldb /home/morr/foundry/foundrydata-dev/Data/systems/bol/packs/careers; recovered 1 files; 42639 bytes. Some data may have been lost. ****
|
||||||
2026/03/31-14:51:38.683703 7ff7477ef6c0 Level-0 table #1102: 0 bytes OK
|
|
||||||
2026/03/31-14:51:38.749228 7ff7477ef6c0 Delete type=0 #1100
|
|
||||||
2026/03/31-14:51:38.889551 7ff7477ef6c0 Manual compaction at level-0 from '!items!4S4xAfMXGnuU0O1a' @ 72057594037927935 : 1 .. '!items!zxY3sW0iCJBvwjOS' @ 0 : 0; will stop at (end)
|
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
MANIFEST-001101
|
MANIFEST-001174
|
||||||
|
|||||||
@@ -1,7 +1,11 @@
|
|||||||
2026/03/31-20:06:54.082205 7ff9fc9fd6c0 Recovering log #1099
|
2026/05/25-23:00:12.737191 7fe4caffd6c0 Delete type=3 #1
|
||||||
2026/03/31-20:06:54.093327 7ff9fc9fd6c0 Delete type=3 #1097
|
2026/05/25-23:00:36.664472 7fe4c9ffb6c0 Level-0 table #1177: started
|
||||||
2026/03/31-20:06:54.093384 7ff9fc9fd6c0 Delete type=0 #1099
|
2026/05/25-23:00:36.664490 7fe4c9ffb6c0 Level-0 table #1177: 0 bytes OK
|
||||||
2026/03/31-20:07:15.444437 7ff7477ef6c0 Level-0 table #1104: started
|
2026/05/25-23:00:36.670481 7fe4c9ffb6c0 Delete type=0 #1175
|
||||||
2026/03/31-20:07:15.444468 7ff7477ef6c0 Level-0 table #1104: 0 bytes OK
|
2026/05/25-23:00:36.687068 7fe4c9ffb6c0 Manual compaction at level-0 from '!items!6fTZ6hOKR4pWbWOe' @ 72057594037927935 : 1 .. '!items!zwSNMO9HpiqUCMt8' @ 0 : 0; will stop at '!items!zwSNMO9HpiqUCMt8' @ 24 : 1
|
||||||
2026/03/31-20:07:15.450792 7ff7477ef6c0 Delete type=0 #1102
|
2026/05/25-23:00:36.687075 7fe4c9ffb6c0 Compacting 1@0 + 0@1 files
|
||||||
2026/03/31-20:07:15.465290 7ff7477ef6c0 Manual compaction at level-0 from '!items!6fTZ6hOKR4pWbWOe' @ 72057594037927935 : 1 .. '!items!zwSNMO9HpiqUCMt8' @ 0 : 0; will stop at (end)
|
2026/05/25-23:00:36.690125 7fe4c9ffb6c0 Generated table #1178@0: 4 keys, 990 bytes
|
||||||
|
2026/05/25-23:00:36.690136 7fe4c9ffb6c0 Compacted 1@0 + 0@1 files => 990 bytes
|
||||||
|
2026/05/25-23:00:36.697155 7fe4c9ffb6c0 compacted to: files[ 0 1 0 0 0 0 0 ]
|
||||||
|
2026/05/25-23:00:36.697213 7fe4c9ffb6c0 Delete type=2 #1113
|
||||||
|
2026/05/25-23:00:36.703345 7fe4c9ffb6c0 Manual compaction at level-0 from '!items!zwSNMO9HpiqUCMt8' @ 24 : 1 .. '!items!zwSNMO9HpiqUCMt8' @ 0 : 0; will stop at (end)
|
||||||
|
|||||||
@@ -1,7 +1,4 @@
|
|||||||
2026/03/31-14:46:22.190057 7ff9fd1fe6c0 Recovering log #1095
|
2026/05/25-23:00:12.721390 7fe4caffd6c0 Log #1172: 0 ops saved to Table #1173 OK
|
||||||
2026/03/31-14:46:22.200351 7ff9fd1fe6c0 Delete type=3 #1093
|
2026/05/25-23:00:12.721495 7fe4caffd6c0 Archiving /home/morr/foundry/foundrydata-dev/Data/systems/bol/packs/effets-exemples/001172.log: OK
|
||||||
2026/03/31-14:46:22.200449 7ff9fd1fe6c0 Delete type=0 #1095
|
2026/05/25-23:00:12.721563 7fe4caffd6c0 Table #1113: 4 entries OK
|
||||||
2026/03/31-14:51:40.071820 7ff7477ef6c0 Level-0 table #1100: started
|
2026/05/25-23:00:12.725085 7fe4caffd6c0 **** Repaired leveldb /home/morr/foundry/foundrydata-dev/Data/systems/bol/packs/effets-exemples; recovered 1 files; 990 bytes. Some data may have been lost. ****
|
||||||
2026/03/31-14:51:40.071876 7ff7477ef6c0 Level-0 table #1100: 0 bytes OK
|
|
||||||
2026/03/31-14:51:40.145396 7ff7477ef6c0 Delete type=0 #1098
|
|
||||||
2026/03/31-14:51:40.339229 7ff7477ef6c0 Manual compaction at level-0 from '!items!6fTZ6hOKR4pWbWOe' @ 72057594037927935 : 1 .. '!items!zwSNMO9HpiqUCMt8' @ 0 : 0; will stop at (end)
|
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
MANIFEST-001104
|
MANIFEST-001177
|
||||||
|
|||||||
@@ -1,7 +1,11 @@
|
|||||||
2026/03/31-20:06:53.939108 7ff9fd9ff6c0 Recovering log #1102
|
2026/05/25-23:00:12.540722 7fe4cbfff6c0 Delete type=3 #1
|
||||||
2026/03/31-20:06:53.949583 7ff9fd9ff6c0 Delete type=3 #1100
|
2026/05/25-23:00:36.471926 7fe4c9ffb6c0 Level-0 table #1180: started
|
||||||
2026/03/31-20:06:53.949633 7ff9fd9ff6c0 Delete type=0 #1102
|
2026/05/25-23:00:36.471937 7fe4c9ffb6c0 Level-0 table #1180: 0 bytes OK
|
||||||
2026/03/31-20:07:15.353516 7ff7477ef6c0 Level-0 table #1107: started
|
2026/05/25-23:00:36.477925 7fe4c9ffb6c0 Delete type=0 #1178
|
||||||
2026/03/31-20:07:15.353537 7ff7477ef6c0 Level-0 table #1107: 0 bytes OK
|
2026/05/25-23:00:36.503503 7fe4c9ffb6c0 Manual compaction at level-0 from '!items!0ErhyqifZLDCmMfT' @ 72057594037927935 : 1 .. '!items!yE8UH6YAgNGjKDEu' @ 0 : 0; will stop at '!items!yE8UH6YAgNGjKDEu' @ 499 : 1
|
||||||
2026/03/31-20:07:15.360004 7ff7477ef6c0 Delete type=0 #1105
|
2026/05/25-23:00:36.503506 7fe4c9ffb6c0 Compacting 1@0 + 0@1 files
|
||||||
2026/03/31-20:07:15.381550 7ff7477ef6c0 Manual compaction at level-0 from '!items!0ErhyqifZLDCmMfT' @ 72057594037927935 : 1 .. '!items!yE8UH6YAgNGjKDEu' @ 0 : 0; will stop at (end)
|
2026/05/25-23:00:36.506759 7fe4c9ffb6c0 Generated table #1181@0: 43 keys, 9886 bytes
|
||||||
|
2026/05/25-23:00:36.506764 7fe4c9ffb6c0 Compacted 1@0 + 0@1 files => 9886 bytes
|
||||||
|
2026/05/25-23:00:36.513480 7fe4c9ffb6c0 compacted to: files[ 0 1 0 0 0 0 0 ]
|
||||||
|
2026/05/25-23:00:36.513514 7fe4c9ffb6c0 Delete type=2 #1116
|
||||||
|
2026/05/25-23:00:36.523452 7fe4c9ffb6c0 Manual compaction at level-0 from '!items!yE8UH6YAgNGjKDEu' @ 499 : 1 .. '!items!yE8UH6YAgNGjKDEu' @ 0 : 0; will stop at (end)
|
||||||
|
|||||||
@@ -1,7 +1,4 @@
|
|||||||
2026/03/31-14:46:22.022217 7ff9fd1fe6c0 Recovering log #1098
|
2026/05/25-23:00:12.526059 7fe4cbfff6c0 Log #1175: 0 ops saved to Table #1176 OK
|
||||||
2026/03/31-14:46:22.031799 7ff9fd1fe6c0 Delete type=3 #1096
|
2026/05/25-23:00:12.526152 7fe4cbfff6c0 Archiving /home/morr/foundry/foundrydata-dev/Data/systems/bol/packs/equipment/001175.log: OK
|
||||||
2026/03/31-14:46:22.031876 7ff9fd1fe6c0 Delete type=0 #1098
|
2026/05/25-23:00:12.526242 7fe4cbfff6c0 Table #1116: 43 entries OK
|
||||||
2026/03/31-14:51:39.078812 7ff7477ef6c0 Level-0 table #1103: started
|
2026/05/25-23:00:12.529350 7fe4cbfff6c0 **** Repaired leveldb /home/morr/foundry/foundrydata-dev/Data/systems/bol/packs/equipment; recovered 1 files; 9886 bytes. Some data may have been lost. ****
|
||||||
2026/03/31-14:51:39.078841 7ff7477ef6c0 Level-0 table #1103: 0 bytes OK
|
|
||||||
2026/03/31-14:51:39.143521 7ff7477ef6c0 Delete type=0 #1101
|
|
||||||
2026/03/31-14:51:39.208918 7ff7477ef6c0 Manual compaction at level-0 from '!items!0ErhyqifZLDCmMfT' @ 72057594037927935 : 1 .. '!items!yE8UH6YAgNGjKDEu' @ 0 : 0; will stop at (end)
|
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
MANIFEST-001103
|
MANIFEST-001176
|
||||||
|
|||||||
@@ -1,7 +1,11 @@
|
|||||||
2026/03/31-20:06:54.031544 7ff9fd1fe6c0 Recovering log #1101
|
2026/05/25-23:00:12.667051 7fe4cb7fe6c0 Delete type=3 #1
|
||||||
2026/03/31-20:06:54.041287 7ff9fd1fe6c0 Delete type=3 #1099
|
2026/05/25-23:00:36.591667 7fe4c9ffb6c0 Level-0 table #1179: started
|
||||||
2026/03/31-20:06:54.041342 7ff9fd1fe6c0 Delete type=0 #1101
|
2026/05/25-23:00:36.591691 7fe4c9ffb6c0 Level-0 table #1179: 0 bytes OK
|
||||||
2026/03/31-20:07:15.416507 7ff7477ef6c0 Level-0 table #1106: started
|
2026/05/25-23:00:36.598377 7fe4c9ffb6c0 Delete type=0 #1177
|
||||||
2026/03/31-20:07:15.416537 7ff7477ef6c0 Level-0 table #1106: 0 bytes OK
|
2026/05/25-23:00:36.611349 7fe4c9ffb6c0 Manual compaction at level-0 from '!items!AoT2c0af4lY6aBsx' @ 72057594037927935 : 1 .. '!items!vGydqADwTsHZ9B3j' @ 0 : 0; will stop at '!items!vGydqADwTsHZ9B3j' @ 189 : 1
|
||||||
2026/03/31-20:07:15.423296 7ff7477ef6c0 Delete type=0 #1104
|
2026/05/25-23:00:36.611355 7fe4c9ffb6c0 Compacting 1@0 + 0@1 files
|
||||||
2026/03/31-20:07:15.437157 7ff7477ef6c0 Manual compaction at level-0 from '!items!AoT2c0af4lY6aBsx' @ 72057594037927935 : 1 .. '!items!vGydqADwTsHZ9B3j' @ 0 : 0; will stop at (end)
|
2026/05/25-23:00:36.615369 7fe4c9ffb6c0 Generated table #1180@0: 8 keys, 3773 bytes
|
||||||
|
2026/05/25-23:00:36.615379 7fe4c9ffb6c0 Compacted 1@0 + 0@1 files => 3773 bytes
|
||||||
|
2026/05/25-23:00:36.621333 7fe4c9ffb6c0 compacted to: files[ 0 1 0 0 0 0 0 ]
|
||||||
|
2026/05/25-23:00:36.621380 7fe4c9ffb6c0 Delete type=2 #1115
|
||||||
|
2026/05/25-23:00:36.648726 7fe4c9ffb6c0 Manual compaction at level-0 from '!items!vGydqADwTsHZ9B3j' @ 189 : 1 .. '!items!vGydqADwTsHZ9B3j' @ 0 : 0; will stop at (end)
|
||||||
|
|||||||
@@ -1,7 +1,4 @@
|
|||||||
2026/03/31-14:46:22.132692 7ff9fd1fe6c0 Recovering log #1097
|
2026/05/25-23:00:12.653101 7fe4cb7fe6c0 Log #1174: 0 ops saved to Table #1175 OK
|
||||||
2026/03/31-14:46:22.143399 7ff9fd1fe6c0 Delete type=3 #1095
|
2026/05/25-23:00:12.653154 7fe4cb7fe6c0 Archiving /home/morr/foundry/foundrydata-dev/Data/systems/bol/packs/fightoptions/001174.log: OK
|
||||||
2026/03/31-14:46:22.143467 7ff9fd1fe6c0 Delete type=0 #1097
|
2026/05/25-23:00:12.653192 7fe4cb7fe6c0 Table #1115: 8 entries OK
|
||||||
2026/03/31-14:51:39.562744 7ff7477ef6c0 Level-0 table #1102: started
|
2026/05/25-23:00:12.656127 7fe4cb7fe6c0 **** Repaired leveldb /home/morr/foundry/foundrydata-dev/Data/systems/bol/packs/fightoptions; recovered 1 files; 3773 bytes. Some data may have been lost. ****
|
||||||
2026/03/31-14:51:39.562775 7ff7477ef6c0 Level-0 table #1102: 0 bytes OK
|
|
||||||
2026/03/31-14:51:39.632049 7ff7477ef6c0 Delete type=0 #1100
|
|
||||||
2026/03/31-14:51:39.698800 7ff7477ef6c0 Manual compaction at level-0 from '!items!AoT2c0af4lY6aBsx' @ 72057594037927935 : 1 .. '!items!vGydqADwTsHZ9B3j' @ 0 : 0; will stop at (end)
|
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
MANIFEST-000586
|
MANIFEST-000659
|
||||||
|
|||||||
@@ -1,7 +1,11 @@
|
|||||||
2026/03/31-20:06:54.043863 7ff9fd9ff6c0 Recovering log #584
|
2026/05/25-23:00:12.682843 7fe4cb7fe6c0 Delete type=3 #1
|
||||||
2026/03/31-20:06:54.054130 7ff9fd9ff6c0 Delete type=3 #582
|
2026/05/25-23:00:36.604632 7fe4c9ffb6c0 Level-0 table #662: started
|
||||||
2026/03/31-20:06:54.054200 7ff9fd9ff6c0 Delete type=0 #584
|
2026/05/25-23:00:36.604650 7fe4c9ffb6c0 Level-0 table #662: 0 bytes OK
|
||||||
2026/03/31-20:07:15.409740 7ff7477ef6c0 Level-0 table #589: started
|
2026/05/25-23:00:36.611270 7fe4c9ffb6c0 Delete type=0 #660
|
||||||
2026/03/31-20:07:15.409767 7ff7477ef6c0 Level-0 table #589: 0 bytes OK
|
2026/05/25-23:00:36.638182 7fe4c9ffb6c0 Manual compaction at level-0 from '!items!CLRp0k5qV8mD03pW' @ 72057594037927935 : 1 .. '!items!wYEpnhbyYaMkaNdL' @ 0 : 0; will stop at '!items!wYEpnhbyYaMkaNdL' @ 150 : 1
|
||||||
2026/03/31-20:07:15.416319 7ff7477ef6c0 Delete type=0 #587
|
2026/05/25-23:00:36.638188 7fe4c9ffb6c0 Compacting 1@0 + 0@1 files
|
||||||
2026/03/31-20:07:15.437145 7ff7477ef6c0 Manual compaction at level-0 from '!items!CLRp0k5qV8mD03pW' @ 72057594037927935 : 1 .. '!items!wYEpnhbyYaMkaNdL' @ 0 : 0; will stop at (end)
|
2026/05/25-23:00:36.641715 7fe4c9ffb6c0 Generated table #663@0: 22 keys, 11387 bytes
|
||||||
|
2026/05/25-23:00:36.641727 7fe4c9ffb6c0 Compacted 1@0 + 0@1 files => 11387 bytes
|
||||||
|
2026/05/25-23:00:36.648601 7fe4c9ffb6c0 compacted to: files[ 0 1 0 0 0 0 0 ]
|
||||||
|
2026/05/25-23:00:36.648646 7fe4c9ffb6c0 Delete type=2 #598
|
||||||
|
2026/05/25-23:00:36.658117 7fe4c9ffb6c0 Manual compaction at level-0 from '!items!wYEpnhbyYaMkaNdL' @ 150 : 1 .. '!items!wYEpnhbyYaMkaNdL' @ 0 : 0; will stop at (end)
|
||||||
|
|||||||
@@ -1,7 +1,4 @@
|
|||||||
2026/03/31-14:46:22.147793 7ff9fd9ff6c0 Recovering log #580
|
2026/05/25-23:00:12.669439 7fe4cb7fe6c0 Log #657: 0 ops saved to Table #658 OK
|
||||||
2026/03/31-14:46:22.157625 7ff9fd9ff6c0 Delete type=3 #578
|
2026/05/25-23:00:12.669482 7fe4cb7fe6c0 Archiving /home/morr/foundry/foundrydata-dev/Data/systems/bol/packs/fightoptionsfanmade/000657.log: OK
|
||||||
2026/03/31-14:46:22.157691 7ff9fd9ff6c0 Delete type=0 #580
|
2026/05/25-23:00:12.669524 7fe4cb7fe6c0 Table #598: 22 entries OK
|
||||||
2026/03/31-14:51:39.632217 7ff7477ef6c0 Level-0 table #585: started
|
2026/05/25-23:00:12.672417 7fe4cb7fe6c0 **** Repaired leveldb /home/morr/foundry/foundrydata-dev/Data/systems/bol/packs/fightoptionsfanmade; recovered 1 files; 11387 bytes. Some data may have been lost. ****
|
||||||
2026/03/31-14:51:39.632248 7ff7477ef6c0 Level-0 table #585: 0 bytes OK
|
|
||||||
2026/03/31-14:51:39.698676 7ff7477ef6c0 Delete type=0 #583
|
|
||||||
2026/03/31-14:51:39.756392 7ff7477ef6c0 Manual compaction at level-0 from '!items!CLRp0k5qV8mD03pW' @ 72057594037927935 : 1 .. '!items!wYEpnhbyYaMkaNdL' @ 0 : 0; will stop at (end)
|
|
||||||
|
|||||||