Compare commits

..

3 Commits

Author SHA1 Message Date
e4cc556705 Fix beguiling boon
All checks were successful
Release Creation / build (release) Successful in 48s
2026-04-18 17:48:30 +02:00
405bcd7cf5 AJout d'une aide pour les macros
All checks were successful
Release Creation / build (release) Successful in 55s
2026-04-11 21:29:40 +02:00
846e6f88b7 AJout d'une aide pour les macros 2026-04-11 21:29:06 +02:00
164 changed files with 590 additions and 604 deletions

View File

@@ -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

Binary file not shown.

After

Width:  |  Height:  |  Size: 84 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 151 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 517 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 109 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 96 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 272 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 275 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 247 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 248 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 242 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 274 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 102 KiB

View File

@@ -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 &amp; 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>"
}
}
}
}
}

View File

@@ -1,7 +1,7 @@
{
"label": "Boons",
"mapping": {
"description": "system.description"
"description": "system.description"
},
"entries": {
"Agilité de lhomme-oiseau": {
@@ -96,6 +96,10 @@
"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>"
},
"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é": {
"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>"

View File

@@ -1,10 +1,34 @@
{
"label": "Weapons",
"mapping": {
"description": "system.description"
"description": "system.description"
},
"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 lAxos": {
"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; its 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 dabordage 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 dabordage 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": {
"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>"

View File

@@ -191,6 +191,11 @@ export class BoLRoll {
return;
}
alchemy = foundry.utils.duplicate(alchemy)
return this.alchemyCheckWithItem(actor, alchemy)
}
/* -------------------------------------------- */
static alchemyCheckWithItem(actor, alchemy) {
let alchemyData = alchemy.system
if (alchemyData.properties.pccurrent < alchemyData.properties.pccost) {
ui.notifications.warn("Pas assez de Points de Création investis dans la Préparation !")

View File

@@ -1,52 +1,228 @@
import {BoLRoll} from "../controllers/bol-rolls.js";
import { BoLRoll } from "../controllers/bol-rolls.js";
/**
* BoL Macro API — accessible via game.bol.macros
*
* 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")
*/
export class Macros {
/**
* @name getSpeakersActor
* @description
*
* @returns
*/
static getSpeakersActor = function(){
// Vérifie qu'un seul token est sélectionné
const tokens = canvas.tokens.controlled;
if (tokens.length > 1) {
ui.notifications.warn(game.i18n.localize('BOL.notification.MacroMultipleTokensSelected'));
return null;
}
const speaker = ChatMessage.getSpeaker();
let actor;
// 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;
/* -------------------------------------------- */
/**
* 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) {
ui.notifications.warn(game.i18n.localize('BOL.notification.MacroMultipleTokensSelected'))
return null
}
static rollMacro = async function (rollType, key, adv, mod){
const actor = this.getSpeakersActor();
// Several tokens selected
if (actor === null) return;
// No token selected
if (actor === undefined) return ui.notifications.error(game.i18n.localize("BOL.notification.MacroNoTokenSelected"));
const actorData = {};
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}`);
let rollLabel = (aptitude.label) ? game.i18n.localize(aptitude.label) : null;
let description = actor.name + " - " + game.i18n.localize('BOL.ui.aptitudeCheck') + " - " + game.i18n.localize(aptitude.label) ;
BoLRoll.aptitudeRollDialog(actor, actorData, aptitude, rollLabel, description, adv, mod);
}
if (tokens.length === 1) {
return tokens[0].actor ?? null
}
// No token selected
if (game.user.isGM) {
ui.notifications.error(game.i18n.localize("BOL.notification.MacroNoTokenSelected"))
return null
}
// Player: fall back to their assigned character
const actor = game.user.character
if (!actor) {
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)
}
}

Binary file not shown.

Binary file not shown.

View File

@@ -1 +1 @@
MANIFEST-001105
MANIFEST-001170

View File

@@ -1,7 +1,7 @@
2026/03/31-20:06:53.991987 7ff9c7fff6c0 Recovering log #1103
2026/03/31-20:06:54.001305 7ff9c7fff6c0 Delete type=3 #1101
2026/03/31-20:06:54.001357 7ff9c7fff6c0 Delete type=0 #1103
2026/03/31-20:07:15.402162 7ff7477ef6c0 Level-0 table #1108: started
2026/03/31-20:07:15.402189 7ff7477ef6c0 Level-0 table #1108: 0 bytes OK
2026/03/31-20:07:15.409398 7ff7477ef6c0 Delete type=0 #1106
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/04/18-12:41:58.625593 7f421a7fc6c0 Recovering log #1168
2026/04/18-12:41:58.643479 7f421a7fc6c0 Delete type=3 #1166
2026/04/18-12:41:58.643667 7f421a7fc6c0 Delete type=0 #1168
2026/04/18-12:51:29.111368 7f4219ffb6c0 Level-0 table #1173: started
2026/04/18-12:51:29.111416 7f4219ffb6c0 Level-0 table #1173: 0 bytes OK
2026/04/18-12:51:29.117812 7f4219ffb6c0 Delete type=0 #1171
2026/04/18-12:51:29.125558 7f4219ffb6c0 Manual compaction at level-0 from '!journal!6cCdSvQgEHJ1bvX4' @ 72057594037927935 : 1 .. '!journal.pages!veAAxCtCKcFIsnln.0kUgZspxXO7VS8bd' @ 0 : 0; will stop at (end)

View File

@@ -1,7 +1,7 @@
2026/03/31-14:46:22.078470 7ff9c7fff6c0 Recovering log #1099
2026/03/31-14:46:22.102288 7ff9c7fff6c0 Delete type=3 #1097
2026/03/31-14:46:22.102356 7ff9c7fff6c0 Delete type=0 #1099
2026/03/31-14:51:39.421905 7ff7477ef6c0 Level-0 table #1104: started
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)
2026/04/15-15:16:22.577548 7f2689bfd6c0 Recovering log #1164
2026/04/15-15:16:22.587344 7f2689bfd6c0 Delete type=3 #1162
2026/04/15-15:16:22.587417 7f2689bfd6c0 Delete type=0 #1164
2026/04/16-18:58:25.396434 7f2688bfb6c0 Level-0 table #1169: started
2026/04/16-18:58:25.396459 7f2688bfb6c0 Level-0 table #1169: 0 bytes OK
2026/04/16-18:58:25.402613 7f2688bfb6c0 Delete type=0 #1167
2026/04/16-18:58:25.408920 7f2688bfb6c0 Manual compaction at level-0 from '!journal!6cCdSvQgEHJ1bvX4' @ 72057594037927935 : 1 .. '!journal.pages!veAAxCtCKcFIsnln.0kUgZspxXO7VS8bd' @ 0 : 0; will stop at (end)

Binary file not shown.

Binary file not shown.

View File

@@ -1 +1 @@
MANIFEST-001010
MANIFEST-001071

View File

@@ -1,7 +1,7 @@
2026/03/31-20:06:53.966374 7ff9fd1fe6c0 Recovering log #1008
2026/03/31-20:06:53.976141 7ff9fd1fe6c0 Delete type=3 #1006
2026/03/31-20:06:53.976208 7ff9fd1fe6c0 Delete type=0 #1008
2026/03/31-20:07:15.381727 7ff7477ef6c0 Level-0 table #1013: started
2026/03/31-20:07:15.381754 7ff7477ef6c0 Level-0 table #1013: 0 bytes OK
2026/03/31-20:07:15.388075 7ff7477ef6c0 Delete type=0 #1011
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/04/18-12:41:58.594299 7f421a7fc6c0 Recovering log #1069
2026/04/18-12:41:58.606998 7f421a7fc6c0 Delete type=3 #1067
2026/04/18-12:41:58.607187 7f421a7fc6c0 Delete type=0 #1069
2026/04/18-12:51:29.097029 7f4219ffb6c0 Level-0 table #1074: started
2026/04/18-12:51:29.097052 7f4219ffb6c0 Level-0 table #1074: 0 bytes OK
2026/04/18-12:51:29.104587 7f4219ffb6c0 Delete type=0 #1072
2026/04/18-12:51:29.125521 7f4219ffb6c0 Manual compaction at level-0 from '!items!G3dZTHIabA3LA1hY' @ 72057594037927935 : 1 .. '!items!xhEcsi3WHjbt2ro9' @ 0 : 0; will stop at (end)

View File

@@ -1,7 +1,7 @@
2026/03/31-14:46:22.050419 7ff9fd9ff6c0 Recovering log #1004
2026/03/31-14:46:22.061129 7ff9fd9ff6c0 Delete type=3 #1002
2026/03/31-14:46:22.061186 7ff9fd9ff6c0 Delete type=0 #1004
2026/03/31-14:51:39.282491 7ff7477ef6c0 Level-0 table #1009: started
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)
2026/04/15-15:16:22.553524 7f2689bfd6c0 Recovering log #1065
2026/04/15-15:16:22.563786 7f2689bfd6c0 Delete type=3 #1063
2026/04/15-15:16:22.563854 7f2689bfd6c0 Delete type=0 #1065
2026/04/16-18:58:25.384570 7f2688bfb6c0 Level-0 table #1070: started
2026/04/16-18:58:25.384597 7f2688bfb6c0 Level-0 table #1070: 0 bytes OK
2026/04/16-18:58:25.390459 7f2688bfb6c0 Delete type=0 #1068
2026/04/16-18:58:25.408906 7f2688bfb6c0 Manual compaction at level-0 from '!items!G3dZTHIabA3LA1hY' @ 72057594037927935 : 1 .. '!items!xhEcsi3WHjbt2ro9' @ 0 : 0; will stop at (end)

Binary file not shown.

Binary file not shown.

View File

@@ -1 +1 @@
MANIFEST-001104
MANIFEST-001165

View File

@@ -1,7 +1,7 @@
2026/03/31-20:06:53.857244 7ff9c7fff6c0 Recovering log #1102
2026/03/31-20:06:53.867361 7ff9c7fff6c0 Delete type=3 #1100
2026/03/31-20:06:53.867406 7ff9c7fff6c0 Delete type=0 #1102
2026/03/31-20:07:15.333382 7ff7477ef6c0 Level-0 table #1107: started
2026/03/31-20:07:15.333411 7ff7477ef6c0 Level-0 table #1107: 0 bytes OK
2026/03/31-20:07:15.339801 7ff7477ef6c0 Delete type=0 #1105
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/04/18-12:41:58.467876 7f421a7fc6c0 Recovering log #1163
2026/04/18-12:41:58.480087 7f421a7fc6c0 Delete type=3 #1161
2026/04/18-12:41:58.480227 7f421a7fc6c0 Delete type=0 #1163
2026/04/18-12:51:29.064204 7f4219ffb6c0 Level-0 table #1168: started
2026/04/18-12:51:29.064237 7f4219ffb6c0 Level-0 table #1168: 0 bytes OK
2026/04/18-12:51:29.070331 7f4219ffb6c0 Delete type=0 #1166
2026/04/18-12:51:29.070529 7f4219ffb6c0 Manual compaction at level-0 from '!items!039ZF3E3MtAGwbiX' @ 72057594037927935 : 1 .. '!items!zgspy1QKaxdEetEw' @ 0 : 0; will stop at (end)

View File

@@ -1,7 +1,7 @@
2026/03/31-14:46:21.936175 7ff9fc9fd6c0 Recovering log #1098
2026/03/31-14:46:21.946959 7ff9fc9fd6c0 Delete type=3 #1096
2026/03/31-14:46:21.947024 7ff9fc9fd6c0 Delete type=0 #1098
2026/03/31-14:51:38.889578 7ff7477ef6c0 Level-0 table #1103: started
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)
2026/04/15-15:16:22.453383 7f268a3fe6c0 Recovering log #1159
2026/04/15-15:16:22.464015 7f268a3fe6c0 Delete type=3 #1157
2026/04/15-15:16:22.464074 7f268a3fe6c0 Delete type=0 #1159
2026/04/16-18:58:25.339542 7f2688bfb6c0 Level-0 table #1164: started
2026/04/16-18:58:25.339565 7f2688bfb6c0 Level-0 table #1164: 0 bytes OK
2026/04/16-18:58:25.345394 7f2688bfb6c0 Delete type=0 #1162
2026/04/16-18:58:25.358898 7f2688bfb6c0 Manual compaction at level-0 from '!items!039ZF3E3MtAGwbiX' @ 72057594037927935 : 1 .. '!items!zgspy1QKaxdEetEw' @ 0 : 0; will stop at (end)

Binary file not shown.

BIN
packs/boons/MANIFEST-001165 Normal file

Binary file not shown.

View File

@@ -1 +1 @@
MANIFEST-001103
MANIFEST-001164

View File

@@ -1,7 +1,7 @@
2026/03/31-20:06:53.872789 7ff9fc9fd6c0 Recovering log #1101
2026/03/31-20:06:53.882612 7ff9fc9fd6c0 Delete type=3 #1099
2026/03/31-20:06:53.882655 7ff9fc9fd6c0 Delete type=0 #1101
2026/03/31-20:07:15.346737 7ff7477ef6c0 Level-0 table #1106: started
2026/03/31-20:07:15.346766 7ff7477ef6c0 Level-0 table #1106: 0 bytes OK
2026/03/31-20:07:15.353211 7ff7477ef6c0 Delete type=0 #1104
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/04/18-12:41:58.484621 7f421b7fe6c0 Recovering log #1162
2026/04/18-12:41:58.495420 7f421b7fe6c0 Delete type=3 #1160
2026/04/18-12:41:58.495553 7f421b7fe6c0 Delete type=0 #1162
2026/04/18-12:51:29.050477 7f4219ffb6c0 Level-0 table #1167: started
2026/04/18-12:51:29.050497 7f4219ffb6c0 Level-0 table #1167: 0 bytes OK
2026/04/18-12:51:29.057500 7f4219ffb6c0 Delete type=0 #1165
2026/04/18-12:51:29.070504 7f4219ffb6c0 Manual compaction at level-0 from '!items!CoqlfsDV1gL5swbK' @ 72057594037927935 : 1 .. '!items!yofwG0YrsL902G77' @ 0 : 0; will stop at (end)

View File

@@ -1,7 +1,7 @@
2026/03/31-14:46:21.951356 7ff9fd1fe6c0 Recovering log #1097
2026/03/31-14:46:21.961416 7ff9fd1fe6c0 Delete type=3 #1095
2026/03/31-14:46:21.961501 7ff9fd1fe6c0 Delete type=0 #1097
2026/03/31-14:51:38.959612 7ff7477ef6c0 Level-0 table #1102: started
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)
2026/04/15-15:16:22.466221 7f268abff6c0 Recovering log #1158
2026/04/15-15:16:22.475960 7f268abff6c0 Delete type=3 #1156
2026/04/15-15:16:22.476018 7f268abff6c0 Delete type=0 #1158
2026/04/16-18:58:25.345509 7f2688bfb6c0 Level-0 table #1163: started
2026/04/16-18:58:25.345540 7f2688bfb6c0 Level-0 table #1163: 0 bytes OK
2026/04/16-18:58:25.351392 7f2688bfb6c0 Delete type=0 #1161
2026/04/16-18:58:25.358907 7f2688bfb6c0 Manual compaction at level-0 from '!items!CoqlfsDV1gL5swbK' @ 72057594037927935 : 1 .. '!items!yofwG0YrsL902G77' @ 0 : 0; will stop at (end)

Binary file not shown.

View File

@@ -1 +1 @@
MANIFEST-001103
MANIFEST-001164

View File

@@ -1,7 +1,7 @@
2026/03/31-20:06:53.899920 7ff9fd9ff6c0 Recovering log #1101
2026/03/31-20:06:53.909847 7ff9fd9ff6c0 Delete type=3 #1099
2026/03/31-20:06:53.909916 7ff9fd9ff6c0 Delete type=0 #1101
2026/03/31-20:07:15.339949 7ff7477ef6c0 Level-0 table #1106: started
2026/03/31-20:07:15.339973 7ff7477ef6c0 Level-0 table #1106: 0 bytes OK
2026/03/31-20:07:15.346571 7ff7477ef6c0 Delete type=0 #1104
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/04/18-12:41:58.515857 7f421affd6c0 Recovering log #1162
2026/04/18-12:41:58.526774 7f421affd6c0 Delete type=3 #1160
2026/04/18-12:41:58.526909 7f421affd6c0 Delete type=0 #1162
2026/04/18-12:51:29.043791 7f4219ffb6c0 Level-0 table #1167: started
2026/04/18-12:51:29.043833 7f4219ffb6c0 Level-0 table #1167: 0 bytes OK
2026/04/18-12:51:29.050399 7f4219ffb6c0 Delete type=0 #1165
2026/04/18-12:51:29.070487 7f4219ffb6c0 Manual compaction at level-0 from '!items!4S4xAfMXGnuU0O1a' @ 72057594037927935 : 1 .. '!items!zxY3sW0iCJBvwjOS' @ 0 : 0; will stop at (end)

View File

@@ -1,7 +1,7 @@
2026/03/31-14:46:21.979659 7ff9fc9fd6c0 Recovering log #1097
2026/03/31-14:46:21.989353 7ff9fc9fd6c0 Delete type=3 #1095
2026/03/31-14:46:21.989419 7ff9fc9fd6c0 Delete type=0 #1097
2026/03/31-14:51:38.683653 7ff7477ef6c0 Level-0 table #1102: started
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)
2026/04/15-15:16:22.491753 7f268abff6c0 Recovering log #1158
2026/04/15-15:16:22.502125 7f268abff6c0 Delete type=3 #1156
2026/04/15-15:16:22.502198 7f268abff6c0 Delete type=0 #1158
2026/04/16-18:58:25.351494 7f2688bfb6c0 Level-0 table #1163: started
2026/04/16-18:58:25.351525 7f2688bfb6c0 Level-0 table #1163: 0 bytes OK
2026/04/16-18:58:25.358768 7f2688bfb6c0 Delete type=0 #1161
2026/04/16-18:58:25.358916 7f2688bfb6c0 Manual compaction at level-0 from '!items!4S4xAfMXGnuU0O1a' @ 72057594037927935 : 1 .. '!items!zxY3sW0iCJBvwjOS' @ 0 : 0; will stop at (end)

Binary file not shown.

Binary file not shown.

View File

@@ -1 +1 @@
MANIFEST-001101
MANIFEST-001162

View File

@@ -1,7 +1,7 @@
2026/03/31-20:06:54.082205 7ff9fc9fd6c0 Recovering log #1099
2026/03/31-20:06:54.093327 7ff9fc9fd6c0 Delete type=3 #1097
2026/03/31-20:06:54.093384 7ff9fc9fd6c0 Delete type=0 #1099
2026/03/31-20:07:15.444437 7ff7477ef6c0 Level-0 table #1104: started
2026/03/31-20:07:15.444468 7ff7477ef6c0 Level-0 table #1104: 0 bytes OK
2026/03/31-20:07:15.450792 7ff7477ef6c0 Delete type=0 #1102
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/04/18-12:41:58.742695 7f421affd6c0 Recovering log #1160
2026/04/18-12:41:58.754264 7f421affd6c0 Delete type=3 #1158
2026/04/18-12:41:58.754458 7f421affd6c0 Delete type=0 #1160
2026/04/18-12:51:29.159760 7f4219ffb6c0 Level-0 table #1165: started
2026/04/18-12:51:29.159794 7f4219ffb6c0 Level-0 table #1165: 0 bytes OK
2026/04/18-12:51:29.166069 7f4219ffb6c0 Delete type=0 #1163
2026/04/18-12:51:29.180793 7f4219ffb6c0 Manual compaction at level-0 from '!items!6fTZ6hOKR4pWbWOe' @ 72057594037927935 : 1 .. '!items!zwSNMO9HpiqUCMt8' @ 0 : 0; will stop at (end)

View File

@@ -1,7 +1,7 @@
2026/03/31-14:46:22.190057 7ff9fd1fe6c0 Recovering log #1095
2026/03/31-14:46:22.200351 7ff9fd1fe6c0 Delete type=3 #1093
2026/03/31-14:46:22.200449 7ff9fd1fe6c0 Delete type=0 #1095
2026/03/31-14:51:40.071820 7ff7477ef6c0 Level-0 table #1100: started
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)
2026/04/15-15:16:22.662031 7f268abff6c0 Recovering log #1156
2026/04/15-15:16:22.672181 7f268abff6c0 Delete type=3 #1154
2026/04/15-15:16:22.672239 7f268abff6c0 Delete type=0 #1156
2026/04/16-18:58:25.414877 7f2688bfb6c0 Level-0 table #1161: started
2026/04/16-18:58:25.414902 7f2688bfb6c0 Level-0 table #1161: 0 bytes OK
2026/04/16-18:58:25.420767 7f2688bfb6c0 Delete type=0 #1159
2026/04/16-18:58:25.434013 7f2688bfb6c0 Manual compaction at level-0 from '!items!6fTZ6hOKR4pWbWOe' @ 72057594037927935 : 1 .. '!items!zwSNMO9HpiqUCMt8' @ 0 : 0; will stop at (end)

Binary file not shown.

View File

@@ -1 +1 @@
MANIFEST-001104
MANIFEST-001165

View File

@@ -1,7 +1,7 @@
2026/03/31-20:06:53.939108 7ff9fd9ff6c0 Recovering log #1102
2026/03/31-20:06:53.949583 7ff9fd9ff6c0 Delete type=3 #1100
2026/03/31-20:06:53.949633 7ff9fd9ff6c0 Delete type=0 #1102
2026/03/31-20:07:15.353516 7ff7477ef6c0 Level-0 table #1107: started
2026/03/31-20:07:15.353537 7ff7477ef6c0 Level-0 table #1107: 0 bytes OK
2026/03/31-20:07:15.360004 7ff7477ef6c0 Delete type=0 #1105
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/04/18-12:41:58.562774 7f421a7fc6c0 Recovering log #1163
2026/04/18-12:41:58.573652 7f421a7fc6c0 Delete type=3 #1161
2026/04/18-12:41:58.573800 7f421a7fc6c0 Delete type=0 #1163
2026/04/18-12:51:29.084486 7f4219ffb6c0 Level-0 table #1168: started
2026/04/18-12:51:29.084510 7f4219ffb6c0 Level-0 table #1168: 0 bytes OK
2026/04/18-12:51:29.090608 7f4219ffb6c0 Delete type=0 #1166
2026/04/18-12:51:29.096960 7f4219ffb6c0 Manual compaction at level-0 from '!items!0ErhyqifZLDCmMfT' @ 72057594037927935 : 1 .. '!items!yE8UH6YAgNGjKDEu' @ 0 : 0; will stop at (end)

View File

@@ -1,7 +1,7 @@
2026/03/31-14:46:22.022217 7ff9fd1fe6c0 Recovering log #1098
2026/03/31-14:46:22.031799 7ff9fd1fe6c0 Delete type=3 #1096
2026/03/31-14:46:22.031876 7ff9fd1fe6c0 Delete type=0 #1098
2026/03/31-14:51:39.078812 7ff7477ef6c0 Level-0 table #1103: started
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)
2026/04/15-15:16:22.529214 7f2689bfd6c0 Recovering log #1159
2026/04/15-15:16:22.539425 7f2689bfd6c0 Delete type=3 #1157
2026/04/15-15:16:22.539500 7f2689bfd6c0 Delete type=0 #1159
2026/04/16-18:58:25.365459 7f2688bfb6c0 Level-0 table #1164: started
2026/04/16-18:58:25.365488 7f2688bfb6c0 Level-0 table #1164: 0 bytes OK
2026/04/16-18:58:25.371259 7f2688bfb6c0 Delete type=0 #1162
2026/04/16-18:58:25.384444 7f2688bfb6c0 Manual compaction at level-0 from '!items!0ErhyqifZLDCmMfT' @ 72057594037927935 : 1 .. '!items!yE8UH6YAgNGjKDEu' @ 0 : 0; will stop at (end)

Binary file not shown.

Binary file not shown.

View File

@@ -1 +1 @@
MANIFEST-001103
MANIFEST-001164

View File

@@ -1,7 +1,7 @@
2026/03/31-20:06:54.031544 7ff9fd1fe6c0 Recovering log #1101
2026/03/31-20:06:54.041287 7ff9fd1fe6c0 Delete type=3 #1099
2026/03/31-20:06:54.041342 7ff9fd1fe6c0 Delete type=0 #1101
2026/03/31-20:07:15.416507 7ff7477ef6c0 Level-0 table #1106: started
2026/03/31-20:07:15.416537 7ff7477ef6c0 Level-0 table #1106: 0 bytes OK
2026/03/31-20:07:15.423296 7ff7477ef6c0 Delete type=0 #1104
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/04/18-12:41:58.679668 7f421affd6c0 Recovering log #1162
2026/04/18-12:41:58.690539 7f421affd6c0 Delete type=3 #1160
2026/04/18-12:41:58.690711 7f421affd6c0 Delete type=0 #1162
2026/04/18-12:51:29.146181 7f4219ffb6c0 Level-0 table #1167: started
2026/04/18-12:51:29.146206 7f4219ffb6c0 Level-0 table #1167: 0 bytes OK
2026/04/18-12:51:29.152607 7f4219ffb6c0 Delete type=0 #1165
2026/04/18-12:51:29.152803 7f4219ffb6c0 Manual compaction at level-0 from '!items!AoT2c0af4lY6aBsx' @ 72057594037927935 : 1 .. '!items!vGydqADwTsHZ9B3j' @ 0 : 0; will stop at (end)

View File

@@ -1,7 +1,7 @@
2026/03/31-14:46:22.132692 7ff9fd1fe6c0 Recovering log #1097
2026/03/31-14:46:22.143399 7ff9fd1fe6c0 Delete type=3 #1095
2026/03/31-14:46:22.143467 7ff9fd1fe6c0 Delete type=0 #1097
2026/03/31-14:51:39.562744 7ff7477ef6c0 Level-0 table #1102: started
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)
2026/04/15-15:16:22.612700 7f268abff6c0 Recovering log #1158
2026/04/15-15:16:22.623314 7f268abff6c0 Delete type=3 #1156
2026/04/15-15:16:22.623363 7f268abff6c0 Delete type=0 #1158
2026/04/16-18:58:25.402687 7f2688bfb6c0 Level-0 table #1163: started
2026/04/16-18:58:25.402711 7f2688bfb6c0 Level-0 table #1163: 0 bytes OK
2026/04/16-18:58:25.408855 7f2688bfb6c0 Delete type=0 #1161
2026/04/16-18:58:25.408963 7f2688bfb6c0 Manual compaction at level-0 from '!items!AoT2c0af4lY6aBsx' @ 72057594037927935 : 1 .. '!items!vGydqADwTsHZ9B3j' @ 0 : 0; will stop at (end)

Binary file not shown.

Binary file not shown.

View File

@@ -1 +1 @@
MANIFEST-000586
MANIFEST-000647

View File

@@ -1,7 +1,7 @@
2026/03/31-20:06:54.043863 7ff9fd9ff6c0 Recovering log #584
2026/03/31-20:06:54.054130 7ff9fd9ff6c0 Delete type=3 #582
2026/03/31-20:06:54.054200 7ff9fd9ff6c0 Delete type=0 #584
2026/03/31-20:07:15.409740 7ff7477ef6c0 Level-0 table #589: started
2026/03/31-20:07:15.409767 7ff7477ef6c0 Level-0 table #589: 0 bytes OK
2026/03/31-20:07:15.416319 7ff7477ef6c0 Delete type=0 #587
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/04/18-12:41:58.694405 7f421b7fe6c0 Recovering log #645
2026/04/18-12:41:58.706703 7f421b7fe6c0 Delete type=3 #643
2026/04/18-12:41:58.706857 7f421b7fe6c0 Delete type=0 #645
2026/04/18-12:51:29.125711 7f4219ffb6c0 Level-0 table #650: started
2026/04/18-12:51:29.125752 7f4219ffb6c0 Level-0 table #650: 0 bytes OK
2026/04/18-12:51:29.132047 7f4219ffb6c0 Delete type=0 #648
2026/04/18-12:51:29.152761 7f4219ffb6c0 Manual compaction at level-0 from '!items!CLRp0k5qV8mD03pW' @ 72057594037927935 : 1 .. '!items!wYEpnhbyYaMkaNdL' @ 0 : 0; will stop at (end)

View File

@@ -1,7 +1,7 @@
2026/03/31-14:46:22.147793 7ff9fd9ff6c0 Recovering log #580
2026/03/31-14:46:22.157625 7ff9fd9ff6c0 Delete type=3 #578
2026/03/31-14:46:22.157691 7ff9fd9ff6c0 Delete type=0 #580
2026/03/31-14:51:39.632217 7ff7477ef6c0 Level-0 table #585: started
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)
2026/04/15-15:16:22.625600 7f26893fc6c0 Recovering log #641
2026/04/15-15:16:22.635406 7f26893fc6c0 Delete type=3 #639
2026/04/15-15:16:22.635464 7f26893fc6c0 Delete type=0 #641
2026/04/16-18:58:25.483026 7f2688bfb6c0 Level-0 table #646: started
2026/04/16-18:58:25.483062 7f2688bfb6c0 Level-0 table #646: 0 bytes OK
2026/04/16-18:58:25.489090 7f2688bfb6c0 Delete type=0 #644
2026/04/16-18:58:25.495672 7f2688bfb6c0 Manual compaction at level-0 from '!items!CLRp0k5qV8mD03pW' @ 72057594037927935 : 1 .. '!items!wYEpnhbyYaMkaNdL' @ 0 : 0; will stop at (end)

Binary file not shown.

0
packs/flaws/001167.log Normal file
View File

View File

@@ -1 +1 @@
MANIFEST-001104
MANIFEST-001165

View File

@@ -1,7 +1,7 @@
2026/03/31-20:06:53.886779 7ff9fd1fe6c0 Recovering log #1102
2026/03/31-20:06:53.896326 7ff9fd1fe6c0 Delete type=3 #1100
2026/03/31-20:06:53.896392 7ff9fd1fe6c0 Delete type=0 #1102
2026/03/31-20:07:15.324903 7ff7477ef6c0 Level-0 table #1107: started
2026/03/31-20:07:15.324990 7ff7477ef6c0 Level-0 table #1107: 0 bytes OK
2026/03/31-20:07:15.333195 7ff7477ef6c0 Delete type=0 #1105
2026/03/31-20:07:15.353362 7ff7477ef6c0 Manual compaction at level-0 from '!items!0wCqg1UpGd50uJrS' @ 72057594037927935 : 1 .. '!items!znd0K3b7HzYpdehs' @ 0 : 0; will stop at (end)
2026/04/18-12:41:58.499510 7f421bfff6c0 Recovering log #1163
2026/04/18-12:41:58.511396 7f421bfff6c0 Delete type=3 #1161
2026/04/18-12:41:58.511530 7f421bfff6c0 Delete type=0 #1163
2026/04/18-12:51:29.057755 7f4219ffb6c0 Level-0 table #1168: started
2026/04/18-12:51:29.057790 7f4219ffb6c0 Level-0 table #1168: 0 bytes OK
2026/04/18-12:51:29.064101 7f4219ffb6c0 Delete type=0 #1166
2026/04/18-12:51:29.070517 7f4219ffb6c0 Manual compaction at level-0 from '!items!0wCqg1UpGd50uJrS' @ 72057594037927935 : 1 .. '!items!znd0K3b7HzYpdehs' @ 0 : 0; will stop at (end)

View File

@@ -1,7 +1,7 @@
2026/03/31-14:46:21.964896 7ff9fd9ff6c0 Recovering log #1098
2026/03/31-14:46:21.975425 7ff9fd9ff6c0 Delete type=3 #1096
2026/03/31-14:46:21.975499 7ff9fd9ff6c0 Delete type=0 #1098
2026/03/31-14:51:38.819904 7ff7477ef6c0 Level-0 table #1103: started
2026/03/31-14:51:38.819927 7ff7477ef6c0 Level-0 table #1103: 0 bytes OK
2026/03/31-14:51:38.889404 7ff7477ef6c0 Delete type=0 #1101
2026/03/31-14:51:38.959597 7ff7477ef6c0 Manual compaction at level-0 from '!items!0wCqg1UpGd50uJrS' @ 72057594037927935 : 1 .. '!items!znd0K3b7HzYpdehs' @ 0 : 0; will stop at (end)
2026/04/15-15:16:22.478415 7f2689bfd6c0 Recovering log #1159
2026/04/15-15:16:22.488840 7f2689bfd6c0 Delete type=3 #1157
2026/04/15-15:16:22.488880 7f2689bfd6c0 Delete type=0 #1159
2026/04/16-18:58:25.332241 7f2688bfb6c0 Level-0 table #1164: started
2026/04/16-18:58:25.332319 7f2688bfb6c0 Level-0 table #1164: 0 bytes OK
2026/04/16-18:58:25.339468 7f2688bfb6c0 Delete type=0 #1162
2026/04/16-18:58:25.358886 7f2688bfb6c0 Manual compaction at level-0 from '!items!0wCqg1UpGd50uJrS' @ 72057594037927935 : 1 .. '!items!znd0K3b7HzYpdehs' @ 0 : 0; will stop at (end)

Binary file not shown.

BIN
packs/flaws/MANIFEST-001165 Normal file

Binary file not shown.

View File

Some files were not shown because too many files have changed in this diff Show More