Compare commits

..

8 Commits

Author SHA1 Message Date
038aa37838 Correction sur combat des PNJs
All checks were successful
Release Creation / build (release) Successful in 51s
2026-03-16 23:04:21 +01:00
25b6e30aa8 Correction sur calcul du rang
All checks were successful
Release Creation / build (release) Successful in 51s
2026-01-21 10:55:29 +01:00
f445741eda DIvers petites corrections pour les specialités et les competences
All checks were successful
Release Creation / build (release) Successful in 54s
2026-01-18 18:39:51 +01:00
d3c24e44d8 Correction sur la fortune
All checks were successful
Release Creation / build (release) Successful in 55s
2026-01-14 23:53:36 +01:00
d2cf0d80b1 Fix item Fee
All checks were successful
Release Creation / build (release) Successful in 50s
2026-01-12 20:17:53 +01:00
47350cb2f1 Fix item Fee
All checks were successful
Release Creation / build (release) Successful in 51s
2026-01-12 18:59:56 +01:00
26e46cf10a Fix item Fee
All checks were successful
Release Creation / build (release) Successful in 55s
2026-01-12 17:10:01 +01:00
4722fdf4d6 Migration vers DataModels et appv2 2026-01-10 22:55:38 +01:00
79 changed files with 1454 additions and 301 deletions

598
DEVELOPER_INSTRUCTIONS.md Normal file
View File

@@ -0,0 +1,598 @@
# FoundryVTT Les Héritiers System - Developer Instructions
## Executive Summary
**Les Héritiers** is an unofficial FoundryVTT system for the French RPG "Les Héritiers" (published by Titam France/Sombres Projets). The system implements a complete actor and item management framework with support for characters (personnage), NPCs (pnj), and 13 item types. Recent development includes a migration to Foundry v13+ with DataModels and AppV2 architecture.
**Repository**: https://www.uberwald.me/gitea/public/fvtt-les-heritiers
**Current Version**: 13.0.7
**Compatibility**: Foundry 13+
**Language**: French (single language localization)
---
## 1. BUILD & DEVELOPMENT COMMANDS
### Build System
- **Build Tool**: Gulp 4 with LESS compilation
- **Package Manager**: npm
### Scripts (package.json)
```json
"build": "gulp build" # Compile LESS to CSS (primary task)
"watch": "gulp watch" # Watch LESS files and rebuild on changes
```
### Gulp Pipeline (gulpfile.js)
The gulpfile defines three main tasks:
| Task | Source | Output | Features |
|------|--------|--------|----------|
| `styles` | `less/heritiers.less` | `styles/heritiers.css` | LESS→CSS compilation with source maps |
| `watchFiles` | `less/**/*.less` | Watches recursively | Auto-rebuild on LESS file changes |
| `build` | - | - | Runs `styles` (default export) |
| `watch` | - | - | Runs `build` then `watchFiles` |
**Development Workflow**:
```bash
npm install # Install dependencies (gulp, gulp-less, gulp-sourcemaps)
npm run build # One-time CSS compilation
npm run watch # Development: continuous LESS watching
```
**Key Files**:
- `/package.json` - Minimal deps (only gulp toolchain)
- `/gulpfile.js` - 36 lines defining LESS tasks
- `/less/heritiers.less` - Entry point (imports `simple-converted.less`)
- `/styles/heritiers.css` - Generated output + source maps
---
## 2. SYSTEM ARCHITECTURE
### 2.1 System Metadata (system.json)
| Field | Value |
|-------|-------|
| **id** | `fvtt-les-heritiers` |
| **title** | Les Héritiers |
| **version** | 13.0.7 |
| **description** | Les Héritiers pour FoundryVTT (French) |
| **authors** | Uberwald/LeRatierBretonnien, Prêtre |
| **compatibility** | min: "13", verified: "13" |
| **manifest** | Hosted on Uberwald Gitea |
| **languages** | French only (fr.json) |
| **license** | LICENCE.txt (proprietary) |
| **grid** | 5m squares |
**Key Configuration Flags**:
- `hotReload.extensions`: `css`, `html`, `hbs`, `json`
- `hotReload.paths`: `styles`, `./`, `templates`, `lang/fr.json`
- `primaryTokenAttribute`: `sante.vigueur` (health/vigor)
- `secondaryTokenAttribute`: `bonneaventure.actuelle` (current good fortune)
- **Socket Support**: Enabled (`socket: true`)
### 2.2 Data Model (template.json.backup)
The system defines a complex hierarchical data model with 2 Actor types and 14 Item types:
#### **Actor Types**
**1. `personnage` (Player Character)**
- Templates: `biodata`, `core`
- Key characteristics (8 attributes):
- Physical: Agilité (agi), Constitution (con), Force (for), Précision (prec)
- Mental: Esprit (esp), Perception (per), Prestance (pres), Sang-Froid (san)
- Fields include biodata (name, appearance variants masked/unmasked, age, personality traits), ranks (Tricherie, Féerie, Masque, Héritage with scenario tracking), PV (health), combat skills
- Profile-based competences (6 profiles + magic)
**2. `pnj` (NPC)**
- Templates: `biodata`, `core`
- Identical structure to `personnage` with simpler NPC-specific metadata
**Core Actor Data** (template.core):
```
caracteristiques: {
agi, con, for, prec, esp, per, pres, san
└─ label, labelnorm, abbrev, kind(physical|mental), value, rang, max
}
rang: {
tricherie, feerie, masque, heritage (with scenarios subfield)
}
pv: { value, max, mod }
competences: { aventurier, combattant, erudit, gentleman, roublard, savant }
magie: { pointsame (value, max) }
experience: { value, pourtricher }
combat: {
esquive, parade, resistancephysique, resistancepsychique, protection,
effetssecondaires, dissimulation, initiative, corpsacorps, tir
}
```
#### **Item Types** (14 total)
| Item Type | Key Fields | Use Case |
|-----------|-----------|----------|
| `arme` (Weapon) | degats, precision, cadence, portee, dissimulation, armetype, rarete, prix | Combat equipment |
| `protection` | points, malusagilite, protectiontype, effetsecondaire | Armor/shields |
| `equipement` | rarete, quantite, prix | General gear |
| `accessoire` | lieu (location code) | Small items |
| `competence` | categorie, profil, niveau, specialites[], ismagie, nomniveau | Skills (6 profiles) |
| `profil` | profiltype (majeur|mineur) | Character archetypes |
| `contact` | contacttype (contact, allie, ennemi, interet) | NPC contacts |
| `avantage` | description | Advantages (benefits) |
| `desavantage` | description | Disadvantages (flaws) |
| `capacitenaturelle` | pouvoirtype, activation, effet, portee, resistance, cibles, virulence | Natural abilities |
| `pouvoir` | pouvoirtype, masquetype, niveau, istest, feeriemasque, carac, zoneffet, pointsusagecourant | Powers/spells |
| `atoutfeerique` | description | Fairy/magical perks |
| `fee` | feetype, avantages, desavantages, pouvoirsfeeriques*, atoutsfeeriques, competences, capacitenaturelles | Fairy character sheet |
| `sort` (Spell) | niveau, rang, competence (Druidisme), carac1, carac2, duree, portee, ingredients, resistance | Magic spells |
**Item Templates**:
- `base`: description (HTMLField)
- `basequip`: rarete, quantite, prix, equipped (for equipable items)
### 2.3 Directory Structure
```
modules/ # ES6 source code (12,273 LOC total)
├── heritiers-main.js # Entry point: init, hook setup, document class config
├── heritiers-actor.js # HeritiersActor class with creation hooks
├── heritiers-item.js # HeritiersItem class
├── heritiers-config.js # HERITIERS_CONFIG object (enums, constants)
├── heritiers-commands.js # Chat command system
├── heritiers-utility.js # Static utility class (dice, rolls, templates, socket)
├── heritiers-combat.js # HeritiersCombat class
├── xregexp-all.js # RegExp library
├── models/
│ ├── index.mjs # Exports all DataModels
│ ├── personnage.mjs # PersonnageDataModel (complex, 12K+ lines)
│ ├── pnj.mjs # PnjDataModel
│ ├── arme.mjs # ArmeDataModel (updated Jan 21)
│ ├── competence.mjs # CompetenceDataModel (updated Jan 21)
│ ├── capacitenaturelle.mjs # Natural ability model (updated Jan 21)
│ ├── pouvoir.mjs # PouvoirDataModel (updated Jan 21)
│ ├── protection.mjs # ProtectionDataModel (updated Jan 21)
│ ├── [11 more models] # accessoire, atoutfeerique, avantage, contact,
│ │ # desavantage, equipement, fee, profil, sort
│ └── base-item.mjs # Base item template
├── applications/
│ ├── sheets/
│ │ ├── _module.mjs # Exports all sheet classes
│ │ ├── base-actor-sheet.mjs # HeritiersActorSheet (HandlebarsApplicationMixin, AppV2)
│ │ ├── base-item-sheet.mjs # HeritiersItemSheet base
│ │ ├── personnage-sheet.mjs # Character sheet (specific)
│ │ ├── pnj-sheet.mjs # NPC sheet (specific)
│ │ └── [11 item sheets] # Type-specific sheets: arme, protection, competence, etc.
│ └── heritiers-roll-dialog.mjs # Dialog for roll resolution
```
#### **Key Module Details**:
**heritiers-main.js** (100+ lines):
- Hooks.once("init") - Registers templates, combat, actor/item classes, DataModels
- Registers AppV2 sheets for all actor and item types
- Creates `game.system.lesheritiers` namespace with utilities, config, models, sheets
- Socket message handling
**heritiers-config.js**:
- `HERITIERS_CONFIG` object with ~40 enum dictionaries:
- `caracList`: 8 characteristics with labels
- `competenceProfil`: 6 profiles (aventurier, roublard, combattant, erudit, savant, gentleman) + magic
- `baseTestPouvoir`, `resistancePouvoir`, `typePouvoir`
- `seuilsDifficulte`: 30-level difficulty scale (5=Enfantine to 30=Divine)
- `attaqueCible`: target localization (body part damage tracking)
- Game-specific constants
**heritiers-utility.js** (60+ custom Handlebars helpers):
- `rollDataStore`, `defenderStore` for roll tracking
- Handlebars helpers: count, includes, upper, lower, upperFirst, notEmpty, mul, and, or, eq, isTest, etc.
- `preloadHandlebarsTemplates()` - loads 27 template files
- `chatListeners()` - click handlers for chat
- `loadCompendium()` - loads packs dynamically
- `onSocketMesssage()` - inter-client communication
**heritiers-actor.js**:
- Custom creation logic: auto-adds useful skills from compendium for personnage type
- Extends Foundry Actor class
**heritiers-item.js**:
- Custom Item class with item-type-specific business logic
### 2.4 Templates Directory (27 Handlebars files)
Organized by purpose:
**Actor Sheets** (2 files):
- `actor-sheet.hbs` - Personnage character sheet (complex form with tabs)
- `actor-pnj-sheet.hbs` - NPC sheet (simplified)
**Item Sheets** (14 files):
- `item-[type]-sheet.hbs` for each item type
- E.g., `item-arme-sheet.hbs`, `item-competence-sheet.hbs`, `item-sort-sheet.hbs`
**Partials** (5 files):
- `partial-actor-equipment.hbs` - Equipment list rendering
- `partial-item-header.hbs` - Item sheet header (common)
- `partial-item-nav.hbs` - Tabbed navigation
- `partial-item-description.hbs` - Description editor
- `partial-utile-skills.hbs` - Skill list filtering
- `post-item.hbs` - Chat card for item description
- `editor-notes-gm.hbs` - GM notes editor
**Chat Results** (3 files):
- `chat-generic-result.hbs` - Generic roll result
- `chat-cc-result.hbs` - Close combat result
- `chat-assommer-result.hbs` - Stun attack result
**Dialogs** (1 file):
- `roll-dialog-generic.hbs` - Roll dialog with modifiers
**Design Notes**:
- Heavy use of Handlebars conditionals ({{#if}}, {{#each}})
- Data-action attributes for action routing
- Flexbox-based layout (`flexrow`, `flexcol` CSS classes)
- Partial templates for reusability
### 2.5 Localization (lang/fr.json)
**Minimal localization** - only 24 lines:
```json
{
"TYPES": {
"Actor": {
"personnage": "Personnage",
"pnj": "PNJ"
},
"Item": {
"accessoire": "Accessoire",
"arme": "Arme",
[12 more item types...]
}
}
}
```
**Localization Strategy**:
- Labels hardcoded in code/templates in French
- No string keys for UI text outside TYPES
- Template labels defined in DataModel schema (initial values)
- Seeded localization keys in heritiers-config.js (no i18n lookup)
### 2.6 Styles (less/ and styles/)
**LESS Structure** (2 files):
- `heritiers.less` (4 lines) - Entry point, imports converted template
- `simple-converted.less` - Full stylesheet (converted from Bootstrap/template.css)
**Output**:
- Compiled to `/styles/heritiers.css` (referenced in system.json)
- Source maps generated (`.map` files)
**Styling Approach**:
- Utility classes: `flexrow`, `flexcol`, `padd-right`, `status-small-label`
- Color classes: `color-class-common`, etc.
- Section classes: `background-sheet-header`
- Responsive design via flexbox
### 2.7 Compendium Packs (packs/)
11 packs defined in system.json, stored as `.db` (LevelDB format):
| Pack Name | Type | Label | Folder | Contents |
|-----------|------|-------|--------|----------|
| `competences` | Item | Compétences | Creation | Skills |
| `avantages` | Item | Avantages | Creation | Advantages |
| `desavantages` | Item | Désavantages | Creation | Disadvantages |
| `capacites` | Item | Capacités Naturelles | Creation | Natural abilities |
| `atouts-feeriques` | Item | Atouts Féériques | Creation | Fairy perks |
| `magie-sorts` | Item | Sorts | Creation | Spells (5 spell schools) |
| `archetypes-fees` | Item | Fées | Creation | Fairy archetypes |
| `pouvoirs` | Item | Pouvoirs | Creation | Powers |
| `profils` | Item | Profils | Creation | Character profiles |
| `armes-et-protection` | Item | Armes et Protections | Equipment | Weapons & armor |
| `scenes` | Scene | Scènes | Root | Sample scenes |
| `journaux` | JournalEntry | Journaux | Root | Game journal entries |
**Ownership Model** (PLAYER: OBSERVER, ASSISTANT: OWNER):
- Players can observe (read) items in packs
- Assistants have full control
**Source Data** (`srcdata/`):
- 5 JSON files for spell normalization:
- `sort_druidisme.json`, `sort_faeomancie.json`, `sort_magieduclan.json`, `sort_necromancie.json`, `sort_theurgie.json`
- `normalize.py` - Python script to transform spell data to compendium format
---
## 3. KEY CONVENTIONS
### 3.1 Module/Class Structure
**Pattern**: ES6 Classes extending Foundry base classes
- **Naming**: `Heritiers[Type]` (e.g., `HeritiersActor`, `HeritiersItem`, `HeritiersCombat`)
- **Exports**: Named exports via `export class`/`export default`
**Example (heritiers-actor.js)**:
```javascript
export class HeritiersActor extends Actor {
static async create(data, options) { ... }
// Custom methods and hooks
}
```
**Example (models/personnage.mjs)**:
```javascript
export default class PersonnageDataModel extends foundry.abstract.TypeDataModel {
static defineSchema() {
const fields = foundry.data.fields;
return {
biodata: new fields.SchemaField({ ... }),
// nested SchemaFields with detailed field definitions
}
}
}
```
**Sheet Pattern (AppV2 - Foundry v13+)**:
```javascript
const { HandlebarsApplicationMixin } = foundry.applications.api
export default class HeritiersPersonnageSheet extends HandlebarsApplicationMixin(
foundry.applications.sheets.ActorSheetV2
) {
static DEFAULT_OPTIONS = {
classes: ["fvtt-les-heritiers", "sheet", "actor"],
position: { width: 780, height: 840 },
form: { submitOnChange: true, closeOnSubmit: false },
actions: {
editImage, toggleSheet, editItem, deleteItem,
createItem, equipItem, rollCarac, ...
}
}
// Static action handlers (#onEditImage, etc.)
}
```
### 3.2 Data Model Conventions
**Field Types** (foundry.data.fields.*):
- `StringField` - Text values, default initial values
- `HTMLField` - Rich-text fields (description, notes, etc.)
- `NumberField` - Integers (integer: true), floats
- `BooleanField` - Boolean flags
- `ArrayField` - Lists (with element type)
- `SchemaField` - Nested objects
**Naming Conventions**:
- Snake_case for internal field names: `biodata`, `caracteristiques`, `pointsame`
- Abbreviations for characteristics: `agi`, `con`, `for`, `prec`, `esp`, `per`, `pres`, `san`
- French names for labels and UI: "Agilité", "Constitution", etc.
**Special Fields**:
- `labelnorm` - Normalized label for lookups (lowercase, no accents)
- `kind` - Classification (physical, mental, magical)
- `initial` - Default value in schema definition
### 3.3 Handlebars Template Conventions
**File Naming**:
- `actor-sheet.hbs` - Main sheet template (not item-specific)
- `actor-[type]-sheet.hbs` - Type-specific actor sheet
- `item-[type]-sheet.hbs` - Type-specific item sheet
- `partial-[purpose].hbs` - Reusable component
- `chat-[result-type].hbs` - Chat message template
- `editor-[context].hbs` - Editor component
**Data Binding**:
- Actor data: `{{system.field.subfield}}`, `{{actor.name}}`
- Item data: `{{system.field}}`
- Loops: `{{#each system.array as |item key|}}`
- Conditionals: `{{#if condition}}...{{/if}}`
**Custom Helpers** (60+):
- Comparison: `eq`, `ne`, `lt`, `gt`
- Array: `includes`, `count`, `notEmpty`
- String: `upper`, `lower`, `upperFirst`
- Math: `mul`, `add`, `sub`, `and`, `or`
- Game: `isTest` (checks test type)
**CSS Classes**:
- Layout: `flexrow`, `flexcol`, `item`, `item-list`
- Styling: `status-small-label`, `color-class-common`, `background-sheet-header`
- Action: `data-action="actionName"` for click routing
### 3.4 Localization Key Naming
**Pattern**: `TYPES.Actor.[type]`, `TYPES.Item.[type]`
Current localization (lang/fr.json):
```json
"TYPES": {
"Actor": {
"personnage": "Personnage",
"pnj": "PNJ"
},
"Item": {
"accessoire": "Accessoire",
"arme": "Arme",
"atoutfeerique": "Atout féerique",
...
}
}
```
**Strategy**:
- **Type labels**: Centralized in TYPES
- **Field labels**: Defined in DataModel schema as `initial` values
- **Config labels**: In heritiers-config.js (caracList, competenceProfil, etc.)
- **Template text**: Hardcoded in .hbs files (all French)
**No i18n System**: System is French-only; no game.i18n lookups used in code
### 3.5 Dice & Roll System
**Initiative Formula** (heritiers-config.js):
```javascript
CONFIG.Combat.initiative = {
formula: "1d10",
decimals: 1
};
```
**Roll Data Storage** (heritiers-utility.js):
- `rollDataStore = {}` - Tracks active rolls by ID
- `defenderStore = {}` - Tracks defenders for opposed rolls
- Socket-based roll updates for multi-client scenarios
**Bonus/Malus**:
- Range: -6 to +6 (signed integers)
- Generated as: `Array.from({ length: 7 }, (v, k) => toString(k - 6))`
**Dice Mechanics**:
- D8, D10, D12 support with face adjacency tables (unused in some contexts)
- Example: `__facesAdjacentes` object maps die faces to adjacent faces
### 3.6 Socket Message Handling
**Game Socket** (configured in system.json):
- Enabled via `"socket": true`
- Message channel: `"system.fvtt-les-heritiers"`
**Message Flow** (heritiers-utility.js):
```javascript
game.socket.on("system.fvtt-les-heritiers", data => {
HeritiersUtility.onSocketMesssage(data)
})
```
Used for:
- Inter-client roll notifications
- Multiplayer combat updates
### 3.7 Recent Migration Notes (v13.0.7)
**Latest Changes** (from git log):
- Migrated from legacy v1 sheets to **AppV2** (HandlebarsApplicationMixin + ActorSheetV2)
- Migrated to **DataModels** (foundry.abstract.TypeDataModel)
- All sheets converted to `.mjs` (ES6 modules)
- Specification & competence fixes (Jan 21)
- Armor (protection) and weapon (arme) model refinements (Jan 21)
**Key Commit**: `4722fdf - Migration vers DataModels et appv2` (major architecture update)
---
## 4. EXISTING AI & DEVELOPER CONFIGURATIONS
### No Pre-Existing Configs Found
The following configuration files **do NOT exist** in the repository:
- `.github/copilot-instructions.md`
- `CLAUDE.md`
- `.cursorrules`
- `AGENTS.md`
- `.windsurfrules`
- `CONVENTIONS.md`
- `CONTRIBUTING.md`
Only **README.md** exists (29 lines):
- Credits Titam France/Sombres Projets
- Lists contributors: LeRatierBretonnien (dev), Prêtre (testing/data entry)
- Notes official authorization
- Links to books at titam-france.fr
---
## 5. DEVELOPMENT WORKFLOW
### 5.1 Setup
```bash
cd /home/morr/work/foundryvtt/fvtt-les-heritiers
npm install
npm run watch
```
### 5.2 File Organization When Adding Features
| Purpose | Location | Pattern |
|---------|----------|---------|
| New item type logic | `modules/heritiers-item.js` | Extend HeritiersItem |
| New item data model | `modules/models/[type].mjs` | Extend TypeDataModel |
| New item sheet | `modules/applications/sheets/[type]-sheet.mjs` | Extend HeritiersItemSheet |
| New item template | `templates/item-[type]-sheet.hbs` | Handlebars + data-action |
| New actor type | `modules/models/[type].mjs` | Extend TypeDataModel |
| New actor sheet | `modules/applications/sheets/[type]-sheet.mjs` | Extend HeritiersActorSheet |
| New chat message | `templates/chat-[result]-result.hbs` | HTML template |
| Style updates | `less/heritiers.less` or new import | LESS → npm run build |
| New config constants | `modules/heritiers-config.js` | Add to HERITIERS_CONFIG |
| Game mechanics | `modules/heritiers-utility.js` or -commands.js | Static utilities or commands |
### 5.3 Registration Steps for New Item Type
1. **Update template.json.backup** - Add schema definition
2. **Create DataModel** - `modules/models/[type].mjs`
3. **Update heritiers-config.js** - Add enums if needed
4. **Create Sheet** - `modules/applications/sheets/[type]-sheet.mjs`
5. **Create Template** - `templates/item-[type]-sheet.hbs`
6. **Update heritiers-main.js** - Register sheet class
7. **Add to models/index.mjs** - Export DataModel
8. **Add to applications/sheets/_module.mjs** - Export Sheet class
9. **Update localization** - Add type to lang/fr.json TYPES.Item
10. **Update system.json** - If exposing in UI
### 5.4 Debugging
- Check browser console for JS errors
- Use Chrome DevTools on http://localhost:30000 (Foundry dev port)
- Hot reload enabled for: `.css`, `.html`, `.hbs`, `.json` files (from system.json flags)
- Git history available via `git log` or `git show <commit>`
---
## 6. KEY STATISTICS
| Metric | Value |
|--------|-------|
| **System ID** | fvtt-les-heritiers |
| **Version** | 13.0.7 |
| **Total Source LOC** | 12,273 lines |
| **Actor Types** | 2 (personnage, pnj) |
| **Item Types** | 14 (arme, protection, competence, etc.) |
| **Compendium Packs** | 11 |
| **Template Files** | 27 (.hbs) |
| **Module Files** | 28 (.js/.mjs) |
| **Model Files** | 16 (DataModels) |
| **Sheet Files** | 14 (+ 1 base) |
| **LESS Files** | 2 |
| **Localization Files** | 1 (fr.json, 24 lines) |
| **Dev Dependencies** | 3 (gulp, gulp-less, gulp-sourcemaps) |
| **Characteristics** | 8 (agi, con, for, prec, esp, per, pres, san) |
| **Competence Profiles** | 6 + magic (aventurier, roublard, combattant, erudit, savant, gentleman) |
| **Difficulty Scale** | 30 levels (-1 to 30) |
| **Last Commit** | "Correction sur calcul du rang" (recent) |
---
## 7. EXTERNAL RESOURCES
- **Official Publisher**: [Titam France / Sombres Projets](http://www.titam-france.fr)
- **System Repository**: https://www.uberwald.me/gitea/public/fvtt-les-heritiers
- **Foundry Documentation**: https://foundryvtt.com/articles/
- **Foundry v13 API**: DataModels, AppV2 sheets (major changes in this version)
---
## 8. RECOMMENDATIONS FOR DEVELOPERS
1. **Use AppV2 Sheet API** for all new sheets (do not use legacy v1)
2. **Define DataModels** for type data rather than inline templates
3. **Keep French localization** in code/templates (minimal i18n setup)
4. **Test with `npm run watch`** during development
5. **Use socket messages** for multiplayer features
6. **Follow naming conventions** (Heritiers[Type], snake_case for fields, French labels)
7. **Document dice mechanics** when adding new rolls
8. **Keep configuration constants** in heritiers-config.js
9. **Use Handlebars helpers** rather than inline logic in templates
10. **Register sheets in heritiers-main.js** and export from _module.mjs files

239
DOCUMENTATION_INDEX.md Normal file
View File

@@ -0,0 +1,239 @@
# Les Héritiers FoundryVTT System - Documentation Index
## 📖 Available Documentation
### 1. **QUICK_REFERENCE.md** ⭐ START HERE
- **Length**: 250 lines
- **Purpose**: Fast lookup and common task guide
- **Best for**: Developers new to the system
- **Contains**:
- Quick start setup commands
- System overview & statistics
- Project structure diagram
- Key classes and exports
- Step-by-step: Adding a new item type
- Common edits (characteristics, packs, rolls, UI)
- Testing and git workflow
- Useful commands
### 2. **DEVELOPER_INSTRUCTIONS.md** 📚 COMPREHENSIVE GUIDE
- **Length**: 598 lines
- **Purpose**: Complete architectural reference
- **Best for**: Deep understanding and long-term development
- **Contains**:
- Executive summary
- Build/dev commands (package.json, gulpfile.js)
- System architecture (metadata, data model, directories)
- Directory structure with file descriptions
- Template organization & conventions
- Localization strategy
- Styling (LESS, CSS)
- Compendium packs reference
- Detailed conventions:
- Module/class structure
- Data model conventions
- Handlebars template patterns
- Localization key naming
- Dice & roll system
- Socket message handling
- Recent migration notes (v13)
- Development workflow (setup, file organization, registration steps)
- Debugging tips
- Key statistics
- External resources
- Developer recommendations
### 3. **README.md** (ORIGINAL)
- **Length**: 29 lines
- **Purpose**: Project overview and credits
- **Contains**:
- Project description (English & French)
- Copyright & authorization notes
- Developer credits
---
## 🎯 How to Use This Documentation
### For First-Time Setup (5-10 minutes)
1. Read **QUICK_REFERENCE.md** → "Quick Start" section
2. Run `npm install` and `npm run watch`
3. Skim the "Project Structure" section
### For Adding a New Feature (30 minutes)
1. Open **QUICK_REFERENCE.md** → "Adding a New Item Type" section
2. Follow the numbered steps
3. Reference **DEVELOPER_INSTRUCTIONS.md** for deeper understanding of each step
4. Test with `npm run watch`
### For Understanding the System (1-2 hours)
1. Start with **DEVELOPER_INSTRUCTIONS.md** → "Executive Summary"
2. Read section 2: "System Architecture"
3. Read section 3: "Key Conventions"
4. Review section 5: "Development Workflow"
### For Debugging a Bug (varies)
1. Check **QUICK_REFERENCE.md** → "Useful Commands" for search/analysis tools
2. Reference **DEVELOPER_INSTRUCTIONS.md** → Section 3 for patterns
3. Look at git history: `git log --oneline | head -20`
4. Check browser console (DevTools) at `http://localhost:30000`
### For Making Common Edits (5-15 minutes each)
Reference **QUICK_REFERENCE.md** → "Common Edits" section:
- Adding a new characteristic
- Adding a new compendium pack
- Adding a new roll type
- Changing UI layout
---
## 📊 Quick System Overview
| Aspect | Detail |
|--------|--------|
| **System ID** | `fvtt-les-heritiers` |
| **Version** | 13.0.7 |
| **Foundry** | v13+ (AppV2, DataModels) |
| **Language** | French (monolingual) |
| **Build Tool** | Gulp 4 + LESS |
| **Code** | 12,273 LOC total |
| **Actor Types** | 2 (personnage, pnj) |
| **Item Types** | 14 types |
| **Compendium Packs** | 11 LevelDB packs |
| **Sheets** | 16 AppV2 sheets |
| **Architecture** | ES6 modules, TypeDataModel |
---
## 🗂️ Repository Structure
```
fvtt-les-heritiers/
├── README.md # Original project readme
├── QUICK_REFERENCE.md # ⭐ Start here (250 lines)
├── DEVELOPER_INSTRUCTIONS.md # 📚 Deep dive (598 lines)
├── DOCUMENTATION_INDEX.md # This file
├── package.json # npm config (build commands)
├── gulpfile.js # Gulp tasks (LESS → CSS)
├── system.json # FoundryVTT manifest
├── template.json.backup # Data schema reference
├── LICENCE.txt # License
├── modules/ # Source code (12,273 LOC)
│ ├── heritiers-main.js # Foundry init & registration
│ ├── heritiers-actor.js # HeritiersActor class
│ ├── heritiers-item.js # HeritiersItem class
│ ├── heritiers-config.js # Game constants (HERITIERS_CONFIG)
│ ├── heritiers-utility.js # Static utilities & helpers
│ ├── heritiers-commands.js # Chat commands
│ ├── heritiers-combat.js # Combat handling
│ ├── models/ # 16 TypeDataModels
│ │ └── personnage.mjs, arme.mjs, competence.mjs, ...
│ └── applications/sheets/ # 15 AppV2 Sheet classes
│ └── personnage-sheet.mjs, arme-sheet.mjs, ...
├── templates/ # 27 Handlebars templates
│ ├── actor-sheet.hbs # Character sheet
│ ├── actor-pnj-sheet.hbs # NPC sheet
│ ├── item-[type]-sheet.hbs # Item sheets (14)
│ ├── partial-*.hbs # Reusable components
│ ├── chat-*-result.hbs # Chat templates
│ └── editor-*.hbs # Editor components
├── lang/
│ └── fr.json # Localization (24 lines, minimal)
├── less/
│ ├── heritiers.less # Entry point
│ └── simple-converted.less # Imported styles
├── styles/
│ ├── heritiers.css # Compiled output (generated)
│ └── heritiers.css.map # Source map (generated)
├── packs/ # 11 Compendium packs (LevelDB)
├── srcdata/ # Source data for compilation
├── assets/ # UI assets (images, etc.)
└── .git/ # Git history available
```
---
## 🚀 Common Tasks Quick Links
| Task | Guide | Time |
|------|-------|------|
| Initial setup | QUICK_REFERENCE.md → Quick Start | 5 min |
| Add item type | QUICK_REFERENCE.md → Adding a New Item Type | 30 min |
| Fix a bug | DEVELOPER_INSTRUCTIONS.md → Section 5 | 15-60 min |
| Understand architecture | DEVELOPER_INSTRUCTIONS.md → Section 2 | 30 min |
| Change UI layout | QUICK_REFERENCE.md → Change UI layout | 10 min |
| Add characteristic | QUICK_REFERENCE.md → Add a new characteristic | 20 min |
| Add new roll type | QUICK_REFERENCE.md → Add a new roll type | 25 min |
| Debug an issue | QUICK_REFERENCE.md → Testing Changes | 10-30 min |
---
## 📝 Documentation Standards
All documentation follows these principles:
1. **Clarity**: Written for developers unfamiliar with the system
2. **Completeness**: All information needed to perform tasks included
3. **Accuracy**: Based on actual code analysis, not assumptions
4. **Brevity**: Concise sections with clear headings
5. **Examples**: Code snippets and patterns provided
6. **Cross-references**: Links between guides for deeper understanding
---
## 🔄 Keeping Documentation Updated
When making significant changes:
1. **Update QUICK_REFERENCE.md** if:
- Adding/removing item types
- Changing build commands
- Adding/removing features
- Changing conventions
2. **Update DEVELOPER_INSTRUCTIONS.md** if:
- Major architecture changes
- New development patterns established
- New statistics to report
- New sections needed
3. **Update git history** (automatic):
- Commit messages explain changes
- Reference these in DEVELOPER_INSTRUCTIONS.md
---
## 📞 Questions?
Refer to:
- **FoundryVTT Docs**: https://foundryvtt.com/articles/
- **Game Rules**: https://titam-france.fr
- **Git History**: `git log --oneline` (see recent commits)
- **Code Comments**: Most functions have JSDoc-style comments
---
**Last Updated**: March 16, 2025
**Documentation Version**: 1.0
**System Version**: 13.0.7
---
## 🎓 Learning Path
**Day 1**: Quick understanding
1. Read QUICK_REFERENCE.md (20 min)
2. Run setup commands (5 min)
3. Explore directory structure (10 min)
**Week 1**: Basic development
1. Read DEVELOPER_INSTRUCTIONS.md sections 1-3 (45 min)
2. Add a simple new item type (1-2 hours)
3. Fix a small bug (30 min - 1 hour)
**Week 2+**: Deep expertise
1. Read full DEVELOPER_INSTRUCTIONS.md (1-2 hours)
2. Add complex feature (3-6 hours)
3. Understand DataModels & AppV2 sheets intimately
4. Review git history for patterns (1-2 hours)

250
QUICK_REFERENCE.md Normal file
View File

@@ -0,0 +1,250 @@
# Les Héritiers FoundryVTT System - Quick Reference
## Quick Start
```bash
npm install # Install once
npm run watch # Development watch (LESS → CSS)
npm run build # Build once (production)
```
## System at a Glance
| Item | Details |
|------|---------|
| **ID** | `fvtt-les-heritiers` |
| **Version** | 13.0.7 |
| **Foundry** | v13+ (AppV2, DataModels) |
| **Language** | French only |
| **Architecture** | ES6 modules, Foundry TypeDataModel |
## Core Actors (2 types)
- **`personnage`** - Player Character (full biodata + core mechanics)
- **`pnj`** - NPC (same structure, simplified UI)
### Actor Data Structure
- **Characteristics** (8): agi, con, for, prec, esp, per, pres, san
- **Ranks** (4): tricherie, feerie, masque, heritage
- **Combat**: esquive, parade, initiative, corpsacorps, tir, resistances
- **Profiles** (6): aventurier, roublard, combattant, erudit, savant, gentleman + magic
## Core Items (14 types)
**Combat**: arme, protection
**Equipment**: equipement, accessoire
**Character Building**: competence, profil, contact, avantage, desavantage
**Powers**: pouvoir, capacitenaturelle, atoutfeerique, fee
**Magic**: sort
## Project Structure
```
modules/
├─ heritiers-main.js # Foundry init, hook setup
├─ heritiers-actor.js # Actor class
├─ heritiers-item.js # Item class
├─ heritiers-config.js # HERITIERS_CONFIG (enums)
├─ heritiers-utility.js # Static utilities, Handlebars helpers
├─ heritiers-commands.js # Chat commands
├─ heritiers-combat.js # Combat class
├─ models/ # DataModels for each type
│ └─ personnage.mjs, pnj.mjs, arme.mjs, ...
└─ applications/sheets/ # AppV2 Sheets
└─ personnage-sheet.mjs, arme-sheet.mjs, ...
templates/ # 27 Handlebars templates
lang/fr.json # Localization (minimal, type names only)
less/heritiers.less # LESS compilation entry
styles/heritiers.css # Compiled CSS (generated)
packs/ # 11 LevelDB compendium packs
system.json # Manifest
template.json.backup # Data schema reference
```
## Key Classes & Exports
### Actor Classes
- **`HeritiersActor`** extends `Actor`
- Custom creation: auto-adds utility skills for `personnage`
- **PersonnageDataModel**, **PnjDataModel** extend `foundry.abstract.TypeDataModel`
### Item Classes
- **`HeritiersItem`** extends `Item`
- **14 DataModels**: ArmeDataModel, CompetenceDataModel, etc.
### Sheets (AppV2 - Foundry v13+)
- **`HeritiersPersonnageSheet`**, **`HeritiersPnjSheet`** extend ActorSheetV2
- **`HeritiersArmeSheet`**, **`HeritiersCompetenceSheet`**, etc. (14 item sheets)
- All use `HandlebarsApplicationMixin`
- Registered in `heritiers-main.js` with `foundry.documents.collections.[Actors|Items].registerSheet()`
## Adding a New Item Type
1. Add schema to `template.json.backup`
2. Create `modules/models/[typename].mjs` (DataModel)
3. Create `modules/applications/sheets/[typename]-sheet.mjs` (AppV2 Sheet)
4. Create `templates/item-[typename]-sheet.hbs` (Handlebars template)
5. Export from `modules/models/index.mjs`
6. Export from `modules/applications/sheets/_module.mjs`
7. Register in `heritiers-main.js` (+ other registrations)
8. Add to `lang/fr.json` TYPES.Item
9. Optionally: add config constants to `heritiers-config.js`
## Key Constants (heritiers-config.js)
```javascript
HERITIERS_CONFIG = {
caracList, // 8 characteristics
competenceProfil, // 6 profiles + magic
seuilsDifficulte, // 30-level difficulty scale
baseTestPouvoir, // feerie, masque, autre
resistancePouvoir, // physical/psychic active/passive
typePouvoir, // actif, passif, metamorphose
// ... 30+ more enums
}
```
## Handlebars Template Patterns
**File Naming**:
- `actor-sheet.hbs` → Personnage sheet
- `actor-pnj-sheet.hbs` → NPC sheet
- `item-[type]-sheet.hbs` → Item sheet
- `partial-*.hbs` → Reusable components
- `chat-*-result.hbs` → Chat results
- `editor-*.hbs` → Editor components
**Data Access**:
```handlebars
{{actor.name}} <!-- Actor name -->
{{system.caracteristiques.agi.value}} <!-- Nested field -->
{{#each system.items as |item key|}} <!-- Loops -->
{{#if system.magie}} ... {{/if}} <!-- Conditionals -->
{{eq kind "physical"}} <!-- Custom helper -->
```
**Custom Helpers** (60+):
- Comparison: `eq`, `ne`, `lt`, `gt`, `gte`, `lte`
- String: `upper`, `lower`, `upperFirst`
- Array: `includes`, `count`, `notEmpty`
- Math: `mul`, `add`, `sub`, `and`, `or`
## Localization
**Single File**: `lang/fr.json`
```json
{
"TYPES": {
"Actor": { "personnage": "Personnage", "pnj": "PNJ" },
"Item": { "arme": "Arme", "competence": "Compétence", ... }
}
}
```
**Strategy**: Minimal i18n
- Type labels in TYPES
- Field labels in DataModel schema (French initial values)
- Config constants in heritiers-config.js (French)
- Template text hardcoded (French)
**No game.i18n calls** - all text is French-only
## Dice & Combat
- **Initiative**: 1d10 (decimal)
- **Bonus/Malus**: -6 to +6
- **Roll Storage**: `HeritiersUtility.rollDataStore` (socket-aware)
- **Defender Tracking**: `HeritiersUtility.defenderStore`
## Socket Communication
**Channel**: `"system.fvtt-les-heritiers"`
**Handler**: `HeritiersUtility.onSocketMesssage(data)`
**Use Cases**: Roll updates, multi-client sync
## Recent Changes (v13.0.7)
- ✅ AppV2 sheet migration (from legacy v1)
- ✅ DataModels adoption
- ✅ ES6 modules (.mjs) throughout
- ✅ Jan 21: arme, competence, capacitenaturelle, pouvoir, protection updates
- ✅ Rank calculation fixes
## Common Edits
### Add a new characteristic?
1. Update `template.json.backup``caracteristiques`
2. Update `PersonnageDataModel``caracteristiques` SchemaField
3. Update `HERITIERS_CONFIG.caracList`
4. Update templates that reference characteristics
### Add a new compendium pack?
1. Add to `system.json``packs` array
2. Create directory in `packs/[packname]/`
3. Add `.db` file via Foundry UI or scripts
### Add a new roll type?
1. Add dialog template: `templates/roll-dialog-*.hbs`
2. Add result template: `templates/chat-*-result.hbs`
3. Add handler in `heritiers-utility.js` or `heritiers-commands.js`
4. Emit via socket if multiplayer: `game.socket.emit("system.fvtt-les-heritiers", data)`
### Change UI layout?
1. Edit `templates/actor-sheet.hbs` or `item-*.hbs`
2. Update LESS: edit `less/heritiers.less`
3. Run `npm run build` or watch with `npm run watch`
4. CSS reloads automatically via hotReload
## Testing Changes
```bash
npm run watch
# Open FoundryVTT on http://localhost:30000
# Open system's world
# Make edits (files auto-reload)
# Check browser console for errors
# Test in UI
```
## Git Workflow (Development)
```bash
git status
git add -A
git commit -m "Description of change"
git push
# Check recent commits: git log --oneline
```
## Useful Commands
```bash
# Count lines of code
wc -l modules/*.js modules/**/*.mjs
# Search for string in code
grep -r "searchterm" modules/
# List all item types
grep '"type":' packs/*/[file].db | head -20
# Check template syntax
npm run build 2>&1 | grep error
```
## Documentation
- **DEVELOPER_INSTRUCTIONS.md** - Comprehensive guide (this repo)
- **README.md** - Project overview & credits
- **system.json** - Manifest (metadata, packs, compatibility)
- **template.json.backup** - Data schema reference
- [FoundryVTT Docs](https://foundryvtt.com/articles/)
- [Les Héritiers Books](https://titam-france.fr) - Game rules
## Notes
- All code is French (variable names in French, labels in French)
- No English strings in UI
- Single language system (French)
- Heavy use of camelCase following Foundry conventions
- AppV2 is the only supported sheet architecture (v13+)

View File

@@ -550,9 +550,9 @@
} }
.fvtt-les-heritiers .items-list .item { .fvtt-les-heritiers .items-list .item {
height: 30px; height: 24px;
line-height: 24px; line-height: 20px;
padding: 1px 0; padding: 0;
border-bottom: 1px solid #BBB; border-bottom: 1px solid #BBB;
} }
@@ -724,7 +724,7 @@
/* AppV2 Actor Sheets - Tabs with scrolling */ /* AppV2 Actor Sheets - Tabs with scrolling */
.fvtt-les-heritiers.actor .tab[data-tab] { .fvtt-les-heritiers.actor .tab[data-tab] {
display: none; display: none;
padding: 0.5rem; padding: 0.25rem 0.5rem;
overflow-y: auto; overflow-y: auto;
flex: 1 1 auto; flex: 1 1 auto;
} }
@@ -735,7 +735,7 @@
/* Redesigned skill category headers */ /* Redesigned skill category headers */
.fvtt-les-heritiers.actor .sheet-box { .fvtt-les-heritiers.actor .sheet-box {
margin-bottom: 0.5rem; margin-bottom: 0.25rem;
} }
.fvtt-les-heritiers.actor .items-title-text { .fvtt-les-heritiers.actor .items-title-text {
@@ -2336,35 +2336,35 @@
} }
.item-field-label-short { .item-field-label-short {
padding-top: 6px; padding-top: 2px;
flex-grow: 1; flex-grow: 1;
max-width: 4rem; max-width: 4rem;
min-width: 4rem; min-width: 4rem;
} }
.item-field-label-short-num { .item-field-label-short-num {
padding-top: 6px; padding-top: 2px;
flex-grow: 1; flex-grow: 1;
max-width: 2rem; max-width: 2rem;
min-width: 2rem; min-width: 2rem;
} }
.item-field-label-medium { .item-field-label-medium {
padding-top: 6px; padding-top: 2px;
flex-grow: 1; flex-grow: 1;
max-width: 6rem; max-width: 6rem;
min-width: 6rem; min-width: 6rem;
} }
.item-field-label-long { .item-field-label-long {
padding-top: 6px; padding-top: 2px;
flex-grow: 1; flex-grow: 1;
max-width: 8rem; max-width: 8rem;
min-width: 8rem; min-width: 8rem;
} }
.item-field-label-long2 { .item-field-label-long2 {
padding-top: 6px; padding-top: 2px;
flex-grow: 1; flex-grow: 1;
max-width: 14rem; max-width: 14rem;
min-width: 14rem; min-width: 14rem;
@@ -2376,7 +2376,7 @@
} }
.item-field-label-long3 { .item-field-label-long3 {
padding-top: 6px; padding-top: 2px;
flex-grow: 1; flex-grow: 1;
max-width: 20rem; max-width: 20rem;
min-width: 20rem; min-width: 20rem;

View File

@@ -186,7 +186,8 @@ export default class HeritiersActorSheet extends HandlebarsApplicationMixin(foun
const itemType = li?.dataset.itemType const itemType = li?.dataset.itemType
const itemField = event.target.dataset.itemField const itemField = event.target.dataset.itemField
const dataType = event.target.dataset.dtype const dataType = event.target.dataset.dtype
const value = event.target.value // Pour les checkboxes, utiliser checked au lieu de value
const value = event.target.type === 'checkbox' ? event.target.checked : event.target.value
if (itemId && itemType && itemField) { if (itemId && itemType && itemField) {
this.actor.editItemField(itemId, itemType, itemField, dataType, value) this.actor.editItemField(itemId, itemType, itemField, dataType, value)
} }

View File

@@ -11,8 +11,6 @@ export default class HeritiersCompetenceSheet extends HeritiersItemSheet {
actions: { actions: {
addSpecialite: HeritiersCompetenceSheet.#onAddSpecialite, addSpecialite: HeritiersCompetenceSheet.#onAddSpecialite,
deleteSpecialite: HeritiersCompetenceSheet.#onDeleteSpecialite, deleteSpecialite: HeritiersCompetenceSheet.#onDeleteSpecialite,
editSpecialite: HeritiersCompetenceSheet.#onEditSpecialite,
editSpecialiteDescription: HeritiersCompetenceSheet.#onEditSpecialiteDescription,
} }
} }
@@ -23,43 +21,55 @@ export default class HeritiersCompetenceSheet extends HeritiersItemSheet {
}, },
} }
/** @override */
_onRender(context, options) {
super._onRender(context, options)
// Attacher les écouteurs pour l'édition des spécialités
this.element.querySelectorAll('.edit-specialite').forEach(input => {
input.addEventListener('change', async (event) => {
const li = event.target.closest('.specialite-item')
const index = Number.parseInt(li?.dataset.specialiteIndex)
if (index !== undefined && !Number.isNaN(index)) {
const spec = foundry.utils.duplicate(this.item.system.specialites) || []
if (spec[index]) {
spec[index].name = event.target.value
await this.item.update({ 'system.specialites': spec })
}
}
})
})
this.element.querySelectorAll('.edit-specialite-description').forEach(textarea => {
textarea.addEventListener('change', async (event) => {
const li = event.target.closest('.specialite-item')
const index = Number.parseInt(li?.dataset.specialiteIndex)
if (index !== undefined && !Number.isNaN(index)) {
const spec = foundry.utils.duplicate(this.item.system.specialites) || []
if (spec[index]) {
spec[index].description = event.target.value
await this.item.update({ 'system.specialites': spec })
}
}
})
})
}
/* -------------------------------------------- */ /* -------------------------------------------- */
/* Event Handlers */ /* Event Handlers */
/* -------------------------------------------- */ /* -------------------------------------------- */
static async #onAddSpecialite(event, target) { static async #onAddSpecialite(event, target) {
let spec = foundry.utils.duplicate(this.item.system.specialites) || [] let spec = foundry.utils.duplicate(this.item.system.specialites) || []
spec.push({ name: "Nouvelle Spécialité", id: foundry.utils.randomID(16), used: false }) spec.push({ name: "Nouvelle Spécialité", description: "", used: false })
await this.item.update({ 'system.specialites': spec }) await this.item.update({ 'system.specialites': spec })
} }
static async #onDeleteSpecialite(event, target) { static async #onDeleteSpecialite(event, target) {
const li = target.closest(".specialite-item") const li = target.closest(".specialite-item")
let index = parseInt(li.dataset.specialiteIndex) let index = Number.parseInt(li.dataset.specialiteIndex)
let spec = foundry.utils.duplicate(this.item.system.specialites) || [] let spec = foundry.utils.duplicate(this.item.system.specialites) || []
spec.splice(index, 1) spec.splice(index, 1)
await this.item.update({ 'system.specialites': spec }) await this.item.update({ 'system.specialites': spec })
} }
static async #onEditSpecialite(event, target) {
const li = target.closest(".specialite-item")
let index = parseInt(li.dataset.specialiteIndex)
let spec = foundry.utils.duplicate(this.item.system.specialites) || []
if (spec[index]) {
spec[index].name = target.value
spec[index].id = spec[index].id || foundry.utils.randomID(16)
await this.item.update({ 'system.specialites': spec })
}
}
static async #onEditSpecialiteDescription(event, target) {
const li = target.closest(".specialite-item")
let index = parseInt(li.dataset.specialiteIndex)
let spec = foundry.utils.duplicate(this.item.system.specialites) || []
if (spec[index]) {
spec[index].description = target.value
spec[index].id = spec[index].id || foundry.utils.randomID(16)
await this.item.update({ 'system.specialites': spec })
}
}
} }

View File

@@ -277,7 +277,7 @@ export class HeritiersActor extends Actor {
let comp = {} let comp = {}
for (let key in game.system.lesheritiers.config.competenceProfil) { for (let key in game.system.lesheritiers.config.competenceProfil) {
if (game.system.lesheritiers.config.competenceProfil[key].kind == kind) if (game.system.lesheritiers.config.competenceProfil[key].kind == kind)
comp[key] = { skills: [], niveau: this.system.competences[key].niveau } comp[key] = { skills: [], niveau: this.system.competences[key].niveau, rang: this.system.competences[key].rang }
} }
for (let item of this.items) { for (let item of this.items) {
if (item.type == "competence") { if (item.type == "competence") {
@@ -394,6 +394,34 @@ export class HeritiersActor extends Actor {
} }
if (this.type == 'personnage') { if (this.type == 'personnage') {
// Calculate rang for each competence profile
let competencesRangs = {
aventurier: 0,
combattant: 0,
erudit: 0,
gentleman: 0,
roublard: 0,
savant: 0
}
// Sum up niveau for each profil
for (let item of this.items) {
if (item.type == "competence" && item.system.profil && item.system.categorie == "utile") {
let profil = item.system.profil.toLowerCase()
if (competencesRangs.hasOwnProperty(profil)) {
competencesRangs[profil] += item.system.niveau
}
}
}
// Calculate rang (total / 4, rounded down) for each competence
for (let profil in competencesRangs) {
let total = competencesRangs[profil]
let rang = Math.floor(total / 4)
if (this.system.competences[profil]) {
this.system.competences[profil].rang = rang
}
}
} }
super.prepareDerivedData() super.prepareDerivedData()
@@ -431,6 +459,8 @@ export class HeritiersActor extends Actor {
if (dataType) { if (dataType) {
if (dataType.toLowerCase() == "number") { if (dataType.toLowerCase() == "number") {
value = Number(value) value = Number(value)
} else if (dataType.toLowerCase() == "boolean") {
value = Boolean(value)
} else { } else {
value = String(value) value = String(value)
} }
@@ -650,6 +680,14 @@ export class HeritiersActor extends Actor {
this.update({ 'system.rang.tricherie': tricherie }) this.update({ 'system.rang.tricherie': tricherie })
return true return true
} }
/* -------------------------------------------- */
/* -------------------------------------------- */
// Returns the combattant root competence formatted for rollData, used for PNJ attacks
_getCombattantCompetence() {
const combattant = this.system.competences.combattant
return { name: combattant.label, system: { niveau: combattant.niveau } }
}
/* -------------------------------------------- */ /* -------------------------------------------- */
getPireCompetence(compName1, compName2) { getPireCompetence(compName1, compName2) {
let comp1 = this.items.find(it => it.name == compName1) let comp1 = this.items.find(it => it.name == compName1)
@@ -826,13 +864,15 @@ export class HeritiersActor extends Actor {
if (arme) { if (arme) {
arme = foundry.utils.duplicate(arme) arme = foundry.utils.duplicate(arme)
arme.system.isMelee = HeritiersUtility.isArmeMelee(arme) arme.system.isMelee = HeritiersUtility.isArmeMelee(arme)
let competenceName = "Tir" let key = arme.system.isMelee ? "agi" : "prec"
let key = "prec" let rollData
if (arme.system.isMelee) { if (this.type == 'pnj') {
competenceName = "Mêlée" rollData = this.getCommonRollData()
key = "agi" rollData.competence = this._getCombattantCompetence()
} else {
let competenceName = arme.system.isMelee ? "Mêlée" : "Tir"
rollData = this.getCommonRollData(undefined, competenceName)
} }
let rollData = this.getCommonRollData(undefined, competenceName)
rollData.carac = this.system.caracteristiques[key] rollData.carac = this.system.caracteristiques[key]
rollData.caracKey = key rollData.caracKey = key
rollData.arme = arme rollData.arme = arme
@@ -852,9 +892,14 @@ export class HeritiersActor extends Actor {
let arme = this.items.get(armeId) let arme = this.items.get(armeId)
if (arme) { if (arme) {
let key = "for" let key = "for"
let competenceName = "Mêlée"
arme.system.isMelee = HeritiersUtility.isArmeMelee(arme) arme.system.isMelee = HeritiersUtility.isArmeMelee(arme)
let rollData = this.getCommonRollData(undefined, competenceName) let rollData
if (this.type == 'pnj') {
rollData = this.getCommonRollData()
rollData.competence = this._getCombattantCompetence()
} else {
rollData = this.getCommonRollData(undefined, "Mêlée")
}
rollData.carac = this.system.caracteristiques[key] rollData.carac = this.system.caracteristiques[key]
rollData.caracKey = key rollData.caracKey = key
rollData.arme = foundry.utils.duplicate(arme) rollData.arme = foundry.utils.duplicate(arme)
@@ -871,8 +916,14 @@ export class HeritiersActor extends Actor {
if (arme) { if (arme) {
let key = "agi" let key = "agi"
arme.system.isMelee = HeritiersUtility.isArmeMelee(arme) arme.system.isMelee = HeritiersUtility.isArmeMelee(arme)
let rollData
if (this.type == 'pnj') {
rollData = this.getCommonRollData()
rollData.competence = this._getCombattantCompetence()
} else {
let pireCompetence = this.getPireCompetence("Mêlée", "Mouvement") let pireCompetence = this.getPireCompetence("Mêlée", "Mouvement")
let rollData = this.getCommonRollData(undefined, pireCompetence.name) rollData = this.getCommonRollData(undefined, pireCompetence.name)
}
rollData.carac = this.system.caracteristiques[key] rollData.carac = this.system.caracteristiques[key]
rollData.caracKey = key rollData.caracKey = key
rollData.arme = foundry.utils.duplicate(arme) rollData.arme = foundry.utils.duplicate(arme)
@@ -887,9 +938,13 @@ export class HeritiersActor extends Actor {
async rollAssomerArme(armeId) { async rollAssomerArme(armeId) {
let arme = this.items.get(armeId) let arme = this.items.get(armeId)
if (arme) { if (arme) {
let competenceName = "Mêlée" let rollData
//arme.system.isMelee = HeritiersUtility.isArmeMelee(arme) if (this.type == 'pnj') {
let rollData = this.getCommonRollData(undefined, competenceName) rollData = this.getCommonRollData()
rollData.competence = this._getCombattantCompetence()
} else {
rollData = this.getCommonRollData(undefined, "Mêlée")
}
rollData.carac = this.system.caracteristiques["agi"] rollData.carac = this.system.caracteristiques["agi"]
rollData.caracKey = "agi" rollData.caracKey = "agi"
rollData.arme = foundry.utils.duplicate(arme) rollData.arme = foundry.utils.duplicate(arme)

View File

@@ -10,8 +10,8 @@ export default class ArmeDataModel extends foundry.abstract.TypeDataModel {
quantite: new fields.NumberField({ initial: 0, integer: true }), quantite: new fields.NumberField({ initial: 0, integer: true }),
prix: new fields.NumberField({ initial: 0, integer: true }), prix: new fields.NumberField({ initial: 0, integer: true }),
equipped: new fields.BooleanField({ initial: false }), equipped: new fields.BooleanField({ initial: false }),
categorie: new fields.StringField({ initial: "" }), categorie: new fields.StringField({ initial: "trait" }),
armetype: new fields.StringField({ initial: "" }), armetype: new fields.StringField({ initial: "trait" }),
degats: new fields.NumberField({ initial: 0, integer: true }), degats: new fields.NumberField({ initial: 0, integer: true }),
precision: new fields.NumberField({ initial: 0, integer: true }), precision: new fields.NumberField({ initial: 0, integer: true }),
cadence: new fields.StringField({ initial: "" }), cadence: new fields.StringField({ initial: "" }),
@@ -19,8 +19,8 @@ export default class ArmeDataModel extends foundry.abstract.TypeDataModel {
magasin: new fields.NumberField({ initial: 0, integer: true }), magasin: new fields.NumberField({ initial: 0, integer: true }),
charge: new fields.NumberField({ initial: 0, integer: true }), charge: new fields.NumberField({ initial: 0, integer: true }),
portee: new fields.StringField({ initial: "" }), portee: new fields.StringField({ initial: "" }),
legalite: new fields.StringField({ initial: "" }), legalite: new fields.StringField({ initial: "libre" }),
dissimulation: new fields.StringField({ initial: "" }), dissimulation: new fields.StringField({ initial: "tresfacile" }),
zone: new fields.NumberField({ initial: 0, integer: true }), zone: new fields.NumberField({ initial: 0, integer: true }),
temps: new fields.StringField({ initial: "" }), temps: new fields.StringField({ initial: "" }),
allumage: new fields.StringField({ initial: "" }), allumage: new fields.StringField({ initial: "" }),

View File

@@ -5,13 +5,13 @@ export default class CapaciteNaturelleDataModel extends foundry.abstract.TypeDat
static defineSchema() { static defineSchema() {
const fields = foundry.data.fields; const fields = foundry.data.fields;
return { return {
pouvoirtype: new fields.StringField({ initial: "" }), pouvoirtype: new fields.StringField({ initial: "actif" }),
activation: new fields.StringField({ initial: "" }), activation: new fields.StringField({ initial: "" }),
cibles: new fields.StringField({ initial: "" }), cibles: new fields.StringField({ initial: "" }),
effet: new fields.StringField({ initial: "" }), effet: new fields.StringField({ initial: "" }),
duree: new fields.StringField({ initial: "" }), duree: new fields.StringField({ initial: "" }),
portee: new fields.StringField({ initial: "" }), portee: new fields.StringField({ initial: "" }),
resistance: new fields.StringField({ initial: "" }), resistance: new fields.StringField({ initial: "aucune" }),
resistanceautre: new fields.StringField({ initial: "" }), resistanceautre: new fields.StringField({ initial: "" }),
isvirulence: new fields.BooleanField({ initial: false }), isvirulence: new fields.BooleanField({ initial: false }),
virulence: new fields.StringField({ initial: "" }), virulence: new fields.StringField({ initial: "" }),

View File

@@ -5,8 +5,8 @@ export default class CompetenceDataModel extends foundry.abstract.TypeDataModel
static defineSchema() { static defineSchema() {
const fields = foundry.data.fields; const fields = foundry.data.fields;
return { return {
categorie: new fields.StringField({ initial: "" }), categorie: new fields.StringField({ initial: "utile" }),
profil: new fields.StringField({ initial: "" }), profil: new fields.StringField({ initial: "aventurier" }),
niveau: new fields.NumberField({ initial: 0, integer: true }), niveau: new fields.NumberField({ initial: 0, integer: true }),
nomniveau: new fields.SchemaField({ nomniveau: new fields.SchemaField({
1: new fields.StringField({ initial: "" }), 1: new fields.StringField({ initial: "" }),

View File

@@ -5,7 +5,7 @@ export default class FeeDataModel extends foundry.abstract.TypeDataModel {
static defineSchema() { static defineSchema() {
const fields = foundry.data.fields; const fields = foundry.data.fields;
return { return {
feetype: new fields.NumberField({ initial: 0, integer: true }), feetype: new fields.StringField({ initial: "traditionnelle" }),
avantages: new fields.StringField({ initial: "" }), avantages: new fields.StringField({ initial: "" }),
desavantages: new fields.StringField({ initial: "" }), desavantages: new fields.StringField({ initial: "" }),
pouvoirsfeeriquesmasque: new fields.StringField({ initial: "" }), pouvoirsfeeriquesmasque: new fields.StringField({ initial: "" }),

View File

@@ -11,7 +11,7 @@ export default class PersonnageDataModel extends foundry.abstract.TypeDataModel
activite: new fields.StringField({ initial: "" }), activite: new fields.StringField({ initial: "" }),
nomhumain: new fields.StringField({ initial: "" }), nomhumain: new fields.StringField({ initial: "" }),
activites: new fields.StringField({ initial: "" }), activites: new fields.StringField({ initial: "" }),
fortune: new fields.NumberField({ initial: 0, integer: true }), fortune: new fields.StringField({ initial: "0" }),
traitscaracteres: new fields.StringField({ initial: "" }), traitscaracteres: new fields.StringField({ initial: "" }),
tailledemasquee: new fields.StringField({ initial: "" }), tailledemasquee: new fields.StringField({ initial: "" }),
taillemasquee: new fields.StringField({ initial: "" }), taillemasquee: new fields.StringField({ initial: "" }),
@@ -23,7 +23,7 @@ export default class PersonnageDataModel extends foundry.abstract.TypeDataModel
langues: new fields.StringField({ initial: "" }), langues: new fields.StringField({ initial: "" }),
factionfeerique: new fields.StringField({ initial: "" }), factionfeerique: new fields.StringField({ initial: "" }),
typetaille: new fields.StringField({ initial: "" }), typetaille: new fields.StringField({ initial: "" }),
age: new fields.NumberField({ initial: 0, integer: true }), age: new fields.StringField({ initial: "0" }),
poids: new fields.StringField({ initial: "" }), poids: new fields.StringField({ initial: "" }),
taille: new fields.StringField({ initial: "" }), taille: new fields.StringField({ initial: "" }),
cheveux: new fields.StringField({ initial: "" }), cheveux: new fields.StringField({ initial: "" }),
@@ -135,7 +135,7 @@ export default class PersonnageDataModel extends foundry.abstract.TypeDataModel
}), }),
heritage: new fields.SchemaField({ heritage: new fields.SchemaField({
label: new fields.StringField({ initial: "Héritage" }), label: new fields.StringField({ initial: "Héritage" }),
value: new fields.NumberField({ initial: 0, integer: true }), value: new fields.StringField({ initial: "0" }),
max: new fields.NumberField({ initial: 0, integer: true }), max: new fields.NumberField({ initial: 0, integer: true }),
scenarios: new fields.NumberField({ initial: 0, integer: true }) scenarios: new fields.NumberField({ initial: 0, integer: true })
}) })
@@ -190,8 +190,8 @@ export default class PersonnageDataModel extends foundry.abstract.TypeDataModel
}) })
}), }),
experience: new fields.SchemaField({ experience: new fields.SchemaField({
value: new fields.NumberField({ initial: 0, integer: true }), value: new fields.StringField({ initial: "0" }),
pourtricher: new fields.NumberField({ initial: 0, integer: true }) pourtricher: new fields.StringField({ initial: "0" })
}), }),
combat: new fields.SchemaField({ combat: new fields.SchemaField({
esquive: new fields.SchemaField({ esquive: new fields.SchemaField({

View File

@@ -5,9 +5,9 @@ export default class PouvoirDataModel extends foundry.abstract.TypeDataModel {
static defineSchema() { static defineSchema() {
const fields = foundry.data.fields; const fields = foundry.data.fields;
return { return {
pouvoirtype: new fields.StringField({ initial: "" }), pouvoirtype: new fields.StringField({ initial: "actif" }),
masquetype: new fields.StringField({ initial: "" }), masquetype: new fields.StringField({ initial: "masque" }),
niveau: new fields.StringField({ initial: "" }), niveau: new fields.StringField({ initial: "normal" }),
activation: new fields.StringField({ initial: "" }), activation: new fields.StringField({ initial: "" }),
istest: new fields.BooleanField({ initial: false }), istest: new fields.BooleanField({ initial: false }),
feeriemasque: new fields.StringField({ initial: "feerie" }), feeriemasque: new fields.StringField({ initial: "feerie" }),
@@ -18,7 +18,7 @@ export default class PouvoirDataModel extends foundry.abstract.TypeDataModel {
cibles: new fields.StringField({ initial: "" }), cibles: new fields.StringField({ initial: "" }),
effet: new fields.StringField({ initial: "" }), effet: new fields.StringField({ initial: "" }),
portee: new fields.StringField({ initial: "" }), portee: new fields.StringField({ initial: "" }),
resistance: new fields.StringField({ initial: "" }), resistance: new fields.StringField({ initial: "aucune" }),
resistanceautre: new fields.StringField({ initial: "" }), resistanceautre: new fields.StringField({ initial: "" }),
pointsusagecourant: new fields.NumberField({ initial: -1, integer: true }), pointsusagecourant: new fields.NumberField({ initial: -1, integer: true }),
isvirulence: new fields.BooleanField({ initial: false }), isvirulence: new fields.BooleanField({ initial: false }),

View File

@@ -11,7 +11,7 @@ export default class ProtectionDataModel extends foundry.abstract.TypeDataModel
prix: new fields.NumberField({ initial: 0, integer: true }), prix: new fields.NumberField({ initial: 0, integer: true }),
equipped: new fields.BooleanField({ initial: false }), equipped: new fields.BooleanField({ initial: false }),
points: new fields.NumberField({ initial: 0, integer: true }), points: new fields.NumberField({ initial: 0, integer: true }),
protectiontype: new fields.StringField({ initial: "" }), protectiontype: new fields.StringField({ initial: "balle" }),
effetsecondaire: new fields.StringField({ initial: "" }), effetsecondaire: new fields.StringField({ initial: "" }),
malusagilite: new fields.NumberField({ initial: 0, integer: true }), malusagilite: new fields.NumberField({ initial: 0, integer: true }),
dissimulation: new fields.StringField({ initial: "" }) dissimulation: new fields.StringField({ initial: "" })

View File

@@ -1 +1 @@
MANIFEST-000312 MANIFEST-000336

View File

@@ -1,8 +1,8 @@
2026/01/10-22:45:42.655574 7fd463fff6c0 Recovering log #310 2026/01/21-10:53:45.991086 7f152a3fc6c0 Recovering log #334
2026/01/10-22:45:42.666271 7fd463fff6c0 Delete type=0 #310 2026/01/21-10:53:46.000764 7f152a3fc6c0 Delete type=3 #332
2026/01/10-22:45:42.666327 7fd463fff6c0 Delete type=3 #308 2026/01/21-10:53:46.000821 7f152a3fc6c0 Delete type=0 #334
2026/01/10-22:49:23.124832 7fd4627fc6c0 Level-0 table #315: started 2026/01/21-10:54:50.937646 7f1529bfb6c0 Level-0 table #339: started
2026/01/10-22:49:23.124856 7fd4627fc6c0 Level-0 table #315: 0 bytes OK 2026/01/21-10:54:50.937686 7f1529bfb6c0 Level-0 table #339: 0 bytes OK
2026/01/10-22:49:23.132096 7fd4627fc6c0 Delete type=0 #313 2026/01/21-10:54:50.968467 7f1529bfb6c0 Delete type=0 #337
2026/01/10-22:49:23.151717 7fd4627fc6c0 Manual compaction at level-0 from '!items!1NhJH4IJpxsGmLB8' @ 72057594037927935 : 1 .. '!items!y1yOenfAJTsb3r6e' @ 0 : 0; will stop at (end) 2026/01/21-10:54:51.044557 7f1529bfb6c0 Manual compaction at level-0 from '!items!1NhJH4IJpxsGmLB8' @ 72057594037927935 : 1 .. '!items!y1yOenfAJTsb3r6e' @ 0 : 0; will stop at (end)
2026/01/10-22:49:23.151765 7fd4627fc6c0 Manual compaction at level-1 from '!items!1NhJH4IJpxsGmLB8' @ 72057594037927935 : 1 .. '!items!y1yOenfAJTsb3r6e' @ 0 : 0; will stop at (end) 2026/01/21-10:54:51.044593 7f1529bfb6c0 Manual compaction at level-1 from '!items!1NhJH4IJpxsGmLB8' @ 72057594037927935 : 1 .. '!items!y1yOenfAJTsb3r6e' @ 0 : 0; will stop at (end)

View File

@@ -1,8 +1,8 @@
2026/01/10-17:13:21.499762 7fd462ffd6c0 Recovering log #306 2026/01/21-10:43:50.240377 7f152b3fe6c0 Recovering log #330
2026/01/10-17:13:21.510831 7fd462ffd6c0 Delete type=3 #304 2026/01/21-10:43:50.250901 7f152b3fe6c0 Delete type=3 #328
2026/01/10-17:13:21.511011 7fd462ffd6c0 Delete type=0 #306 2026/01/21-10:43:50.250970 7f152b3fe6c0 Delete type=0 #330
2026/01/10-22:35:10.944218 7fd4627fc6c0 Level-0 table #311: started 2026/01/21-10:46:58.350230 7f1529bfb6c0 Level-0 table #335: started
2026/01/10-22:35:10.944249 7fd4627fc6c0 Level-0 table #311: 0 bytes OK 2026/01/21-10:46:58.350259 7f1529bfb6c0 Level-0 table #335: 0 bytes OK
2026/01/10-22:35:10.950116 7fd4627fc6c0 Delete type=0 #309 2026/01/21-10:46:58.357573 7f1529bfb6c0 Delete type=0 #333
2026/01/10-22:35:10.963623 7fd4627fc6c0 Manual compaction at level-0 from '!items!1NhJH4IJpxsGmLB8' @ 72057594037927935 : 1 .. '!items!y1yOenfAJTsb3r6e' @ 0 : 0; will stop at (end) 2026/01/21-10:46:58.364032 7f1529bfb6c0 Manual compaction at level-0 from '!items!1NhJH4IJpxsGmLB8' @ 72057594037927935 : 1 .. '!items!y1yOenfAJTsb3r6e' @ 0 : 0; will stop at (end)
2026/01/10-22:35:10.963688 7fd4627fc6c0 Manual compaction at level-1 from '!items!1NhJH4IJpxsGmLB8' @ 72057594037927935 : 1 .. '!items!y1yOenfAJTsb3r6e' @ 0 : 0; will stop at (end) 2026/01/21-10:46:58.364070 7f1529bfb6c0 Manual compaction at level-1 from '!items!1NhJH4IJpxsGmLB8' @ 72057594037927935 : 1 .. '!items!y1yOenfAJTsb3r6e' @ 0 : 0; will stop at (end)

View File

@@ -1 +1 @@
MANIFEST-000312 MANIFEST-000336

View File

@@ -1,8 +1,8 @@
2026/01/10-22:45:42.682529 7fd478fff6c0 Recovering log #310 2026/01/21-10:53:46.017018 7f152b3fe6c0 Recovering log #334
2026/01/10-22:45:42.692944 7fd478fff6c0 Delete type=0 #310 2026/01/21-10:53:46.027168 7f152b3fe6c0 Delete type=3 #332
2026/01/10-22:45:42.692994 7fd478fff6c0 Delete type=3 #308 2026/01/21-10:53:46.027239 7f152b3fe6c0 Delete type=0 #334
2026/01/10-22:49:23.158820 7fd4627fc6c0 Level-0 table #315: started 2026/01/21-10:54:51.075256 7f1529bfb6c0 Level-0 table #339: started
2026/01/10-22:49:23.158855 7fd4627fc6c0 Level-0 table #315: 0 bytes OK 2026/01/21-10:54:51.075290 7f1529bfb6c0 Level-0 table #339: 0 bytes OK
2026/01/10-22:49:23.164806 7fd4627fc6c0 Delete type=0 #313 2026/01/21-10:54:51.119572 7f1529bfb6c0 Delete type=0 #337
2026/01/10-22:49:23.178845 7fd4627fc6c0 Manual compaction at level-0 from '!items!1ETVaPBtjDtzelK1' @ 72057594037927935 : 1 .. '!items!zbsVCsWxRzkzzG1N' @ 0 : 0; will stop at (end) 2026/01/21-10:54:51.190089 7f1529bfb6c0 Manual compaction at level-0 from '!items!1ETVaPBtjDtzelK1' @ 72057594037927935 : 1 .. '!items!zbsVCsWxRzkzzG1N' @ 0 : 0; will stop at (end)
2026/01/10-22:49:23.178875 7fd4627fc6c0 Manual compaction at level-1 from '!items!1ETVaPBtjDtzelK1' @ 72057594037927935 : 1 .. '!items!zbsVCsWxRzkzzG1N' @ 0 : 0; will stop at (end) 2026/01/21-10:54:51.190275 7f1529bfb6c0 Manual compaction at level-1 from '!items!1ETVaPBtjDtzelK1' @ 72057594037927935 : 1 .. '!items!zbsVCsWxRzkzzG1N' @ 0 : 0; will stop at (end)

View File

@@ -1,8 +1,8 @@
2026/01/10-17:13:21.528896 7fd478fff6c0 Recovering log #306 2026/01/21-10:43:50.267294 7f152abfd6c0 Recovering log #330
2026/01/10-17:13:21.539812 7fd478fff6c0 Delete type=3 #304 2026/01/21-10:43:50.276983 7f152abfd6c0 Delete type=3 #328
2026/01/10-17:13:21.539902 7fd478fff6c0 Delete type=0 #306 2026/01/21-10:43:50.277035 7f152abfd6c0 Delete type=0 #330
2026/01/10-22:35:10.963778 7fd4627fc6c0 Level-0 table #311: started 2026/01/21-10:46:58.364131 7f1529bfb6c0 Level-0 table #335: started
2026/01/10-22:35:10.963855 7fd4627fc6c0 Level-0 table #311: 0 bytes OK 2026/01/21-10:46:58.364205 7f1529bfb6c0 Level-0 table #335: 0 bytes OK
2026/01/10-22:35:10.969945 7fd4627fc6c0 Delete type=0 #309 2026/01/21-10:46:58.370782 7f1529bfb6c0 Delete type=0 #333
2026/01/10-22:35:10.989919 7fd4627fc6c0 Manual compaction at level-0 from '!items!1ETVaPBtjDtzelK1' @ 72057594037927935 : 1 .. '!items!zbsVCsWxRzkzzG1N' @ 0 : 0; will stop at (end) 2026/01/21-10:46:58.391376 7f1529bfb6c0 Manual compaction at level-0 from '!items!1ETVaPBtjDtzelK1' @ 72057594037927935 : 1 .. '!items!zbsVCsWxRzkzzG1N' @ 0 : 0; will stop at (end)
2026/01/10-22:35:10.989967 7fd4627fc6c0 Manual compaction at level-1 from '!items!1ETVaPBtjDtzelK1' @ 72057594037927935 : 1 .. '!items!zbsVCsWxRzkzzG1N' @ 0 : 0; will stop at (end) 2026/01/21-10:46:58.391426 7f1529bfb6c0 Manual compaction at level-1 from '!items!1ETVaPBtjDtzelK1' @ 72057594037927935 : 1 .. '!items!zbsVCsWxRzkzzG1N' @ 0 : 0; will stop at (end)

View File

@@ -1 +1 @@
MANIFEST-000312 MANIFEST-000336

View File

@@ -1,8 +1,8 @@
2026/01/10-22:45:42.628622 7fd462ffd6c0 Recovering log #310 2026/01/21-10:53:45.963781 7f152abfd6c0 Recovering log #334
2026/01/10-22:45:42.638290 7fd462ffd6c0 Delete type=0 #310 2026/01/21-10:53:45.974011 7f152abfd6c0 Delete type=3 #332
2026/01/10-22:45:42.638350 7fd462ffd6c0 Delete type=3 #308 2026/01/21-10:53:45.974068 7f152abfd6c0 Delete type=0 #334
2026/01/10-22:49:23.132234 7fd4627fc6c0 Level-0 table #315: started 2026/01/21-10:54:50.901280 7f1529bfb6c0 Level-0 table #339: started
2026/01/10-22:49:23.132271 7fd4627fc6c0 Level-0 table #315: 0 bytes OK 2026/01/21-10:54:50.901351 7f1529bfb6c0 Level-0 table #339: 0 bytes OK
2026/01/10-22:49:23.138271 7fd4627fc6c0 Delete type=0 #313 2026/01/21-10:54:50.937470 7f1529bfb6c0 Delete type=0 #337
2026/01/10-22:49:23.151732 7fd4627fc6c0 Manual compaction at level-0 from '!items!0fPXtA5LkLgG8uDj' @ 72057594037927935 : 1 .. '!items!zvtBlG6KCIn0oCVk' @ 0 : 0; will stop at (end) 2026/01/21-10:54:51.044539 7f1529bfb6c0 Manual compaction at level-0 from '!items!0fPXtA5LkLgG8uDj' @ 72057594037927935 : 1 .. '!items!zvtBlG6KCIn0oCVk' @ 0 : 0; will stop at (end)
2026/01/10-22:49:23.151774 7fd4627fc6c0 Manual compaction at level-1 from '!items!0fPXtA5LkLgG8uDj' @ 72057594037927935 : 1 .. '!items!zvtBlG6KCIn0oCVk' @ 0 : 0; will stop at (end) 2026/01/21-10:54:51.044584 7f1529bfb6c0 Manual compaction at level-1 from '!items!0fPXtA5LkLgG8uDj' @ 72057594037927935 : 1 .. '!items!zvtBlG6KCIn0oCVk' @ 0 : 0; will stop at (end)

View File

@@ -1,8 +1,8 @@
2026/01/10-17:13:21.469395 7fd4637fe6c0 Recovering log #306 2026/01/21-10:43:50.215403 7f152a3fc6c0 Recovering log #330
2026/01/10-17:13:21.479611 7fd4637fe6c0 Delete type=3 #304 2026/01/21-10:43:50.225230 7f152a3fc6c0 Delete type=3 #328
2026/01/10-17:13:21.479687 7fd4637fe6c0 Delete type=0 #306 2026/01/21-10:43:50.225283 7f152a3fc6c0 Delete type=0 #330
2026/01/10-22:35:10.919012 7fd4627fc6c0 Level-0 table #311: started 2026/01/21-10:46:58.336769 7f1529bfb6c0 Level-0 table #335: started
2026/01/10-22:35:10.919040 7fd4627fc6c0 Level-0 table #311: 0 bytes OK 2026/01/21-10:46:58.336818 7f1529bfb6c0 Level-0 table #335: 0 bytes OK
2026/01/10-22:35:10.924958 7fd4627fc6c0 Delete type=0 #309 2026/01/21-10:46:58.343699 7f1529bfb6c0 Delete type=0 #333
2026/01/10-22:35:10.937993 7fd4627fc6c0 Manual compaction at level-0 from '!items!0fPXtA5LkLgG8uDj' @ 72057594037927935 : 1 .. '!items!zvtBlG6KCIn0oCVk' @ 0 : 0; will stop at (end) 2026/01/21-10:46:58.364008 7f1529bfb6c0 Manual compaction at level-0 from '!items!0fPXtA5LkLgG8uDj' @ 72057594037927935 : 1 .. '!items!zvtBlG6KCIn0oCVk' @ 0 : 0; will stop at (end)
2026/01/10-22:35:10.938027 7fd4627fc6c0 Manual compaction at level-1 from '!items!0fPXtA5LkLgG8uDj' @ 72057594037927935 : 1 .. '!items!zvtBlG6KCIn0oCVk' @ 0 : 0; will stop at (end) 2026/01/21-10:46:58.364042 7f1529bfb6c0 Manual compaction at level-1 from '!items!0fPXtA5LkLgG8uDj' @ 72057594037927935 : 1 .. '!items!zvtBlG6KCIn0oCVk' @ 0 : 0; will stop at (end)

View File

@@ -1 +1 @@
MANIFEST-000312 MANIFEST-000336

View File

@@ -1,8 +1,8 @@
2026/01/10-22:45:42.589327 7fd4637fe6c0 Recovering log #310 2026/01/21-10:53:45.925373 7f152bbff6c0 Recovering log #334
2026/01/10-22:45:42.598987 7fd4637fe6c0 Delete type=0 #310 2026/01/21-10:53:45.935373 7f152bbff6c0 Delete type=3 #332
2026/01/10-22:45:42.599056 7fd4637fe6c0 Delete type=3 #308 2026/01/21-10:53:45.935424 7f152bbff6c0 Delete type=0 #334
2026/01/10-22:49:23.105824 7fd4627fc6c0 Level-0 table #315: started 2026/01/21-10:54:50.778002 7f1529bfb6c0 Level-0 table #339: started
2026/01/10-22:49:23.105875 7fd4627fc6c0 Level-0 table #315: 0 bytes OK 2026/01/21-10:54:50.778030 7f1529bfb6c0 Level-0 table #339: 0 bytes OK
2026/01/10-22:49:23.111837 7fd4627fc6c0 Delete type=0 #313 2026/01/21-10:54:50.828753 7f1529bfb6c0 Delete type=0 #337
2026/01/10-22:49:23.124673 7fd4627fc6c0 Manual compaction at level-0 from '!items!0EAAt0qSzcD9VRBH' @ 72057594037927935 : 1 .. '!items!zfpjROW9LDAlXUkN' @ 0 : 0; will stop at (end) 2026/01/21-10:54:50.901010 7f1529bfb6c0 Manual compaction at level-0 from '!items!0EAAt0qSzcD9VRBH' @ 72057594037927935 : 1 .. '!items!zfpjROW9LDAlXUkN' @ 0 : 0; will stop at (end)
2026/01/10-22:49:23.124705 7fd4627fc6c0 Manual compaction at level-1 from '!items!0EAAt0qSzcD9VRBH' @ 72057594037927935 : 1 .. '!items!zfpjROW9LDAlXUkN' @ 0 : 0; will stop at (end) 2026/01/21-10:54:50.901050 7f1529bfb6c0 Manual compaction at level-1 from '!items!0EAAt0qSzcD9VRBH' @ 72057594037927935 : 1 .. '!items!zfpjROW9LDAlXUkN' @ 0 : 0; will stop at (end)

View File

@@ -1,8 +1,8 @@
2026/01/10-17:13:21.429229 7fd463fff6c0 Recovering log #306 2026/01/21-10:43:50.178287 7f152abfd6c0 Recovering log #330
2026/01/10-17:13:21.439355 7fd463fff6c0 Delete type=3 #304 2026/01/21-10:43:50.188475 7f152abfd6c0 Delete type=3 #328
2026/01/10-17:13:21.439437 7fd463fff6c0 Delete type=0 #306 2026/01/21-10:43:50.188562 7f152abfd6c0 Delete type=0 #330
2026/01/10-22:35:10.925075 7fd4627fc6c0 Level-0 table #311: started 2026/01/21-10:46:58.315382 7f1529bfb6c0 Level-0 table #335: started
2026/01/10-22:35:10.925115 7fd4627fc6c0 Level-0 table #311: 0 bytes OK 2026/01/21-10:46:58.315409 7f1529bfb6c0 Level-0 table #335: 0 bytes OK
2026/01/10-22:35:10.931575 7fd4627fc6c0 Delete type=0 #309 2026/01/21-10:46:58.323079 7f1529bfb6c0 Delete type=0 #333
2026/01/10-22:35:10.938004 7fd4627fc6c0 Manual compaction at level-0 from '!items!0EAAt0qSzcD9VRBH' @ 72057594037927935 : 1 .. '!items!zfpjROW9LDAlXUkN' @ 0 : 0; will stop at (end) 2026/01/21-10:46:58.336644 7f1529bfb6c0 Manual compaction at level-0 from '!items!0EAAt0qSzcD9VRBH' @ 72057594037927935 : 1 .. '!items!zfpjROW9LDAlXUkN' @ 0 : 0; will stop at (end)
2026/01/10-22:35:10.938039 7fd4627fc6c0 Manual compaction at level-1 from '!items!0EAAt0qSzcD9VRBH' @ 72057594037927935 : 1 .. '!items!zfpjROW9LDAlXUkN' @ 0 : 0; will stop at (end) 2026/01/21-10:46:58.336671 7f1529bfb6c0 Manual compaction at level-1 from '!items!0EAAt0qSzcD9VRBH' @ 72057594037927935 : 1 .. '!items!zfpjROW9LDAlXUkN' @ 0 : 0; will stop at (end)

Binary file not shown.

View File

@@ -1 +1 @@
MANIFEST-000312 MANIFEST-000336

View File

@@ -1,8 +1,8 @@
2026/01/10-22:45:42.615071 7fd463fff6c0 Recovering log #310 2026/01/21-10:53:45.951417 7f152a3fc6c0 Recovering log #334
2026/01/10-22:45:42.625822 7fd463fff6c0 Delete type=0 #310 2026/01/21-10:53:45.961147 7f152a3fc6c0 Delete type=3 #332
2026/01/10-22:45:42.625885 7fd463fff6c0 Delete type=3 #308 2026/01/21-10:53:45.961217 7f152a3fc6c0 Delete type=0 #334
2026/01/10-22:49:23.098421 7fd4627fc6c0 Level-0 table #315: started 2026/01/21-10:54:50.828879 7f1529bfb6c0 Level-0 table #339: started
2026/01/10-22:49:23.098464 7fd4627fc6c0 Level-0 table #315: 0 bytes OK 2026/01/21-10:54:50.828907 7f1529bfb6c0 Level-0 table #339: 0 bytes OK
2026/01/10-22:49:23.105653 7fd4627fc6c0 Delete type=0 #313 2026/01/21-10:54:50.862960 7f1529bfb6c0 Delete type=0 #337
2026/01/10-22:49:23.124661 7fd4627fc6c0 Manual compaction at level-0 from '!items!0cNSRJVPk3GbvxfD' @ 72057594037927935 : 1 .. '!items!yWDg2KlXEz33TSmZ' @ 0 : 0; will stop at (end) 2026/01/21-10:54:50.901020 7f1529bfb6c0 Manual compaction at level-0 from '!items!0cNSRJVPk3GbvxfD' @ 72057594037927935 : 1 .. '!items!yWDg2KlXEz33TSmZ' @ 0 : 0; will stop at (end)
2026/01/10-22:49:23.124699 7fd4627fc6c0 Manual compaction at level-1 from '!items!0cNSRJVPk3GbvxfD' @ 72057594037927935 : 1 .. '!items!yWDg2KlXEz33TSmZ' @ 0 : 0; will stop at (end) 2026/01/21-10:54:50.901069 7f1529bfb6c0 Manual compaction at level-1 from '!items!0cNSRJVPk3GbvxfD' @ 72057594037927935 : 1 .. '!items!yWDg2KlXEz33TSmZ' @ 0 : 0; will stop at (end)

View File

@@ -1,8 +1,8 @@
2026/01/10-17:13:21.456371 7fd462ffd6c0 Recovering log #306 2026/01/21-10:43:50.203621 7f152b3fe6c0 Recovering log #330
2026/01/10-17:13:21.466637 7fd462ffd6c0 Delete type=3 #304 2026/01/21-10:43:50.213118 7f152b3fe6c0 Delete type=3 #328
2026/01/10-17:13:21.466715 7fd462ffd6c0 Delete type=0 #306 2026/01/21-10:43:50.213182 7f152b3fe6c0 Delete type=0 #330
2026/01/10-22:35:10.912772 7fd4627fc6c0 Level-0 table #311: started 2026/01/21-10:46:58.323189 7f1529bfb6c0 Level-0 table #335: started
2026/01/10-22:35:10.912830 7fd4627fc6c0 Level-0 table #311: 0 bytes OK 2026/01/21-10:46:58.323211 7f1529bfb6c0 Level-0 table #335: 0 bytes OK
2026/01/10-22:35:10.918894 7fd4627fc6c0 Delete type=0 #309 2026/01/21-10:46:58.329442 7f1529bfb6c0 Delete type=0 #333
2026/01/10-22:35:10.937977 7fd4627fc6c0 Manual compaction at level-0 from '!items!0cNSRJVPk3GbvxfD' @ 72057594037927935 : 1 .. '!items!yWDg2KlXEz33TSmZ' @ 0 : 0; will stop at (end) 2026/01/21-10:46:58.336652 7f1529bfb6c0 Manual compaction at level-0 from '!items!0cNSRJVPk3GbvxfD' @ 72057594037927935 : 1 .. '!items!yWDg2KlXEz33TSmZ' @ 0 : 0; will stop at (end)
2026/01/10-22:35:10.938019 7fd4627fc6c0 Manual compaction at level-1 from '!items!0cNSRJVPk3GbvxfD' @ 72057594037927935 : 1 .. '!items!yWDg2KlXEz33TSmZ' @ 0 : 0; will stop at (end) 2026/01/21-10:46:58.336688 7f1529bfb6c0 Manual compaction at level-1 from '!items!0cNSRJVPk3GbvxfD' @ 72057594037927935 : 1 .. '!items!yWDg2KlXEz33TSmZ' @ 0 : 0; will stop at (end)

Binary file not shown.

View File

@@ -1 +1 @@
MANIFEST-000318 MANIFEST-000342

View File

@@ -1,8 +1,8 @@
2026/01/10-22:45:42.576270 7fd462ffd6c0 Recovering log #316 2026/01/21-10:53:45.912760 7f152abfd6c0 Recovering log #340
2026/01/10-22:45:42.587079 7fd462ffd6c0 Delete type=0 #316 2026/01/21-10:53:45.922870 7f152abfd6c0 Delete type=3 #338
2026/01/10-22:45:42.587154 7fd462ffd6c0 Delete type=3 #314 2026/01/21-10:53:45.922940 7f152abfd6c0 Delete type=0 #340
2026/01/10-22:49:23.111938 7fd4627fc6c0 Level-0 table #321: started 2026/01/21-10:54:50.741159 7f1529bfb6c0 Level-0 table #345: started
2026/01/10-22:49:23.111961 7fd4627fc6c0 Level-0 table #321: 0 bytes OK 2026/01/21-10:54:50.741200 7f1529bfb6c0 Level-0 table #345: 0 bytes OK
2026/01/10-22:49:23.117915 7fd4627fc6c0 Delete type=0 #319 2026/01/21-10:54:50.777875 7f1529bfb6c0 Delete type=0 #343
2026/01/10-22:49:23.124683 7fd4627fc6c0 Manual compaction at level-0 from '!folders!FBCujRu055QLePB2' @ 72057594037927935 : 1 .. '!items!zEl2NQsnCpELVWzh' @ 0 : 0; will stop at (end) 2026/01/21-10:54:50.900993 7f1529bfb6c0 Manual compaction at level-0 from '!folders!FBCujRu055QLePB2' @ 72057594037927935 : 1 .. '!items!zEl2NQsnCpELVWzh' @ 0 : 0; will stop at (end)
2026/01/10-22:49:23.124711 7fd4627fc6c0 Manual compaction at level-1 from '!folders!FBCujRu055QLePB2' @ 72057594037927935 : 1 .. '!items!zEl2NQsnCpELVWzh' @ 0 : 0; will stop at (end) 2026/01/21-10:54:50.901062 7f1529bfb6c0 Manual compaction at level-1 from '!folders!FBCujRu055QLePB2' @ 72057594037927935 : 1 .. '!items!zEl2NQsnCpELVWzh' @ 0 : 0; will stop at (end)

View File

@@ -1,8 +1,8 @@
2026/01/10-17:13:21.415001 7fd4637fe6c0 Recovering log #312 2026/01/21-10:43:50.165803 7f152b3fe6c0 Recovering log #336
2026/01/10-17:13:21.425375 7fd4637fe6c0 Delete type=3 #310 2026/01/21-10:43:50.175695 7f152b3fe6c0 Delete type=3 #334
2026/01/10-17:13:21.425467 7fd4637fe6c0 Delete type=0 #312 2026/01/21-10:43:50.175747 7f152b3fe6c0 Delete type=0 #336
2026/01/10-22:35:10.931688 7fd4627fc6c0 Level-0 table #317: started 2026/01/21-10:46:58.329532 7f1529bfb6c0 Level-0 table #341: started
2026/01/10-22:35:10.931718 7fd4627fc6c0 Level-0 table #317: 0 bytes OK 2026/01/21-10:46:58.329569 7f1529bfb6c0 Level-0 table #341: 0 bytes OK
2026/01/10-22:35:10.937843 7fd4627fc6c0 Delete type=0 #315 2026/01/21-10:46:58.336457 7f1529bfb6c0 Delete type=0 #339
2026/01/10-22:35:10.938011 7fd4627fc6c0 Manual compaction at level-0 from '!folders!FBCujRu055QLePB2' @ 72057594037927935 : 1 .. '!items!zEl2NQsnCpELVWzh' @ 0 : 0; will stop at (end) 2026/01/21-10:46:58.336659 7f1529bfb6c0 Manual compaction at level-0 from '!folders!FBCujRu055QLePB2' @ 72057594037927935 : 1 .. '!items!zEl2NQsnCpELVWzh' @ 0 : 0; will stop at (end)
2026/01/10-22:35:10.938033 7fd4627fc6c0 Manual compaction at level-1 from '!folders!FBCujRu055QLePB2' @ 72057594037927935 : 1 .. '!items!zEl2NQsnCpELVWzh' @ 0 : 0; will stop at (end) 2026/01/21-10:46:58.336676 7f1529bfb6c0 Manual compaction at level-1 from '!folders!FBCujRu055QLePB2' @ 72057594037927935 : 1 .. '!items!zEl2NQsnCpELVWzh' @ 0 : 0; will stop at (end)

Binary file not shown.

View File

@@ -1 +1 @@
MANIFEST-000312 MANIFEST-000336

View File

@@ -1,8 +1,8 @@
2026/01/10-22:45:42.601653 7fd478fff6c0 Recovering log #310 2026/01/21-10:53:45.937902 7f152b3fe6c0 Recovering log #334
2026/01/10-22:45:42.612222 7fd478fff6c0 Delete type=0 #310 2026/01/21-10:53:45.949011 7f152b3fe6c0 Delete type=3 #332
2026/01/10-22:45:42.612283 7fd478fff6c0 Delete type=3 #308 2026/01/21-10:53:45.949063 7f152b3fe6c0 Delete type=0 #334
2026/01/10-22:49:23.118089 7fd4627fc6c0 Level-0 table #315: started 2026/01/21-10:54:50.863087 7f1529bfb6c0 Level-0 table #339: started
2026/01/10-22:49:23.118123 7fd4627fc6c0 Level-0 table #315: 0 bytes OK 2026/01/21-10:54:50.863116 7f1529bfb6c0 Level-0 table #339: 0 bytes OK
2026/01/10-22:49:23.124530 7fd4627fc6c0 Delete type=0 #313 2026/01/21-10:54:50.900818 7f1529bfb6c0 Delete type=0 #337
2026/01/10-22:49:23.124693 7fd4627fc6c0 Manual compaction at level-0 from '!items!2QqvtClSVnh5ejXu' @ 72057594037927935 : 1 .. '!items!xzRJ6JP1HqoqxLdj' @ 0 : 0; will stop at (end) 2026/01/21-10:54:50.901029 7f1529bfb6c0 Manual compaction at level-0 from '!items!2QqvtClSVnh5ejXu' @ 72057594037927935 : 1 .. '!items!xzRJ6JP1HqoqxLdj' @ 0 : 0; will stop at (end)
2026/01/10-22:49:23.124717 7fd4627fc6c0 Manual compaction at level-1 from '!items!2QqvtClSVnh5ejXu' @ 72057594037927935 : 1 .. '!items!xzRJ6JP1HqoqxLdj' @ 0 : 0; will stop at (end) 2026/01/21-10:54:50.901057 7f1529bfb6c0 Manual compaction at level-1 from '!items!2QqvtClSVnh5ejXu' @ 72057594037927935 : 1 .. '!items!xzRJ6JP1HqoqxLdj' @ 0 : 0; will stop at (end)

View File

@@ -1,8 +1,8 @@
2026/01/10-17:13:21.442425 7fd478fff6c0 Recovering log #306 2026/01/21-10:43:50.191071 7f152bbff6c0 Recovering log #330
2026/01/10-17:13:21.453357 7fd478fff6c0 Delete type=3 #304 2026/01/21-10:43:50.201148 7f152bbff6c0 Delete type=3 #328
2026/01/10-17:13:21.453438 7fd478fff6c0 Delete type=0 #306 2026/01/21-10:43:50.201234 7f152bbff6c0 Delete type=0 #330
2026/01/10-22:35:10.950222 7fd4627fc6c0 Level-0 table #311: started 2026/01/21-10:46:58.308832 7f1529bfb6c0 Level-0 table #335: started
2026/01/10-22:35:10.950248 7fd4627fc6c0 Level-0 table #311: 0 bytes OK 2026/01/21-10:46:58.308870 7f1529bfb6c0 Level-0 table #335: 0 bytes OK
2026/01/10-22:35:10.957326 7fd4627fc6c0 Delete type=0 #309 2026/01/21-10:46:58.315278 7f1529bfb6c0 Delete type=0 #333
2026/01/10-22:35:10.963639 7fd4627fc6c0 Manual compaction at level-0 from '!items!2QqvtClSVnh5ejXu' @ 72057594037927935 : 1 .. '!items!xzRJ6JP1HqoqxLdj' @ 0 : 0; will stop at (end) 2026/01/21-10:46:58.336631 7f1529bfb6c0 Manual compaction at level-0 from '!items!2QqvtClSVnh5ejXu' @ 72057594037927935 : 1 .. '!items!xzRJ6JP1HqoqxLdj' @ 0 : 0; will stop at (end)
2026/01/10-22:35:10.963675 7fd4627fc6c0 Manual compaction at level-1 from '!items!2QqvtClSVnh5ejXu' @ 72057594037927935 : 1 .. '!items!xzRJ6JP1HqoqxLdj' @ 0 : 0; will stop at (end) 2026/01/21-10:46:58.336665 7f1529bfb6c0 Manual compaction at level-1 from '!items!2QqvtClSVnh5ejXu' @ 72057594037927935 : 1 .. '!items!xzRJ6JP1HqoqxLdj' @ 0 : 0; will stop at (end)

Binary file not shown.

View File

@@ -1 +1 @@
MANIFEST-000030 MANIFEST-000054

View File

@@ -1,8 +1,8 @@
2026/01/10-22:45:42.723038 7fd4637fe6c0 Recovering log #28 2026/01/21-10:53:46.057066 7f152bbff6c0 Recovering log #52
2026/01/10-22:45:42.733325 7fd4637fe6c0 Delete type=0 #28 2026/01/21-10:53:46.067412 7f152bbff6c0 Delete type=3 #50
2026/01/10-22:45:42.733393 7fd4637fe6c0 Delete type=3 #26 2026/01/21-10:53:46.067481 7f152bbff6c0 Delete type=0 #52
2026/01/10-22:49:23.164915 7fd4627fc6c0 Level-0 table #33: started 2026/01/21-10:54:51.154446 7f1529bfb6c0 Level-0 table #57: started
2026/01/10-22:49:23.164944 7fd4627fc6c0 Level-0 table #33: 0 bytes OK 2026/01/21-10:54:51.154494 7f1529bfb6c0 Level-0 table #57: 0 bytes OK
2026/01/10-22:49:23.170895 7fd4627fc6c0 Delete type=0 #31 2026/01/21-10:54:51.189974 7f1529bfb6c0 Delete type=0 #55
2026/01/10-22:49:23.178857 7fd4627fc6c0 Manual compaction at level-0 from '!journal!QZDy8zwSVh7t4meA' @ 72057594037927935 : 1 .. '!journal.pages!QZDy8zwSVh7t4meA.gdXBDBkPlBjfmTy7' @ 0 : 0; will stop at (end) 2026/01/21-10:54:51.190106 7f1529bfb6c0 Manual compaction at level-0 from '!journal!QZDy8zwSVh7t4meA' @ 72057594037927935 : 1 .. '!journal.pages!QZDy8zwSVh7t4meA.gdXBDBkPlBjfmTy7' @ 0 : 0; will stop at (end)
2026/01/10-22:49:23.178898 7fd4627fc6c0 Manual compaction at level-1 from '!journal!QZDy8zwSVh7t4meA' @ 72057594037927935 : 1 .. '!journal.pages!QZDy8zwSVh7t4meA.gdXBDBkPlBjfmTy7' @ 0 : 0; will stop at (end) 2026/01/21-10:54:51.190265 7f1529bfb6c0 Manual compaction at level-1 from '!journal!QZDy8zwSVh7t4meA' @ 72057594037927935 : 1 .. '!journal.pages!QZDy8zwSVh7t4meA.gdXBDBkPlBjfmTy7' @ 0 : 0; will stop at (end)

View File

@@ -1,8 +1,8 @@
2026/01/10-17:13:21.571878 7fd462ffd6c0 Recovering log #24 2026/01/21-10:43:50.312683 7f152b3fe6c0 Recovering log #48
2026/01/10-17:13:21.582771 7fd462ffd6c0 Delete type=3 #22 2026/01/21-10:43:50.322328 7f152b3fe6c0 Delete type=3 #46
2026/01/10-17:13:21.582857 7fd462ffd6c0 Delete type=0 #24 2026/01/21-10:43:50.322376 7f152b3fe6c0 Delete type=0 #48
2026/01/10-22:35:10.976802 7fd4627fc6c0 Level-0 table #29: started 2026/01/21-10:46:58.384370 7f1529bfb6c0 Level-0 table #53: started
2026/01/10-22:35:10.976847 7fd4627fc6c0 Level-0 table #29: 0 bytes OK 2026/01/21-10:46:58.384393 7f1529bfb6c0 Level-0 table #53: 0 bytes OK
2026/01/10-22:35:10.983280 7fd4627fc6c0 Delete type=0 #27 2026/01/21-10:46:58.391260 7f1529bfb6c0 Delete type=0 #51
2026/01/10-22:35:10.989948 7fd4627fc6c0 Manual compaction at level-0 from '!journal!QZDy8zwSVh7t4meA' @ 72057594037927935 : 1 .. '!journal.pages!QZDy8zwSVh7t4meA.gdXBDBkPlBjfmTy7' @ 0 : 0; will stop at (end) 2026/01/21-10:46:58.391418 7f1529bfb6c0 Manual compaction at level-0 from '!journal!QZDy8zwSVh7t4meA' @ 72057594037927935 : 1 .. '!journal.pages!QZDy8zwSVh7t4meA.gdXBDBkPlBjfmTy7' @ 0 : 0; will stop at (end)
2026/01/10-22:35:10.989976 7fd4627fc6c0 Manual compaction at level-1 from '!journal!QZDy8zwSVh7t4meA' @ 72057594037927935 : 1 .. '!journal.pages!QZDy8zwSVh7t4meA.gdXBDBkPlBjfmTy7' @ 0 : 0; will stop at (end) 2026/01/21-10:46:58.391443 7f1529bfb6c0 Manual compaction at level-1 from '!journal!QZDy8zwSVh7t4meA' @ 72057594037927935 : 1 .. '!journal.pages!QZDy8zwSVh7t4meA.gdXBDBkPlBjfmTy7' @ 0 : 0; will stop at (end)

Binary file not shown.

View File

@@ -1 +1 @@
MANIFEST-000116 MANIFEST-000140

View File

@@ -1,8 +1,8 @@
2026/01/10-22:45:42.640975 7fd4637fe6c0 Recovering log #114 2026/01/21-10:53:45.976776 7f152b3fe6c0 Recovering log #138
2026/01/10-22:45:42.652231 7fd4637fe6c0 Delete type=0 #114 2026/01/21-10:53:45.987431 7f152b3fe6c0 Delete type=3 #136
2026/01/10-22:45:42.652298 7fd4637fe6c0 Delete type=3 #112 2026/01/21-10:53:45.987486 7f152b3fe6c0 Delete type=0 #138
2026/01/10-22:49:23.138430 7fd4627fc6c0 Level-0 table #119: started 2026/01/21-10:54:51.007181 7f1529bfb6c0 Level-0 table #143: started
2026/01/10-22:49:23.138468 7fd4627fc6c0 Level-0 table #119: 0 bytes OK 2026/01/21-10:54:51.007212 7f1529bfb6c0 Level-0 table #143: 0 bytes OK
2026/01/10-22:49:23.144578 7fd4627fc6c0 Delete type=0 #117 2026/01/21-10:54:51.044437 7f1529bfb6c0 Delete type=0 #141
2026/01/10-22:49:23.151745 7fd4627fc6c0 Manual compaction at level-0 from '!folders!5pCYN0vTiCKOHrXM' @ 72057594037927935 : 1 .. '!items!zbZ88BQkH9ZCYlDK' @ 0 : 0; will stop at (end) 2026/01/21-10:54:51.044577 7f1529bfb6c0 Manual compaction at level-0 from '!folders!5pCYN0vTiCKOHrXM' @ 72057594037927935 : 1 .. '!items!zbZ88BQkH9ZCYlDK' @ 0 : 0; will stop at (end)
2026/01/10-22:49:23.151783 7fd4627fc6c0 Manual compaction at level-1 from '!folders!5pCYN0vTiCKOHrXM' @ 72057594037927935 : 1 .. '!items!zbZ88BQkH9ZCYlDK' @ 0 : 0; will stop at (end) 2026/01/21-10:54:51.044600 7f1529bfb6c0 Manual compaction at level-1 from '!folders!5pCYN0vTiCKOHrXM' @ 72057594037927935 : 1 .. '!items!zbZ88BQkH9ZCYlDK' @ 0 : 0; will stop at (end)

View File

@@ -1,8 +1,8 @@
2026/01/10-17:13:21.484535 7fd478fff6c0 Recovering log #110 2026/01/21-10:43:50.227772 7f152abfd6c0 Recovering log #134
2026/01/10-17:13:21.495192 7fd478fff6c0 Delete type=3 #108 2026/01/21-10:43:50.237335 7f152abfd6c0 Delete type=3 #132
2026/01/10-17:13:21.495268 7fd478fff6c0 Delete type=0 #110 2026/01/21-10:43:50.237395 7f152abfd6c0 Delete type=0 #134
2026/01/10-22:35:10.938160 7fd4627fc6c0 Level-0 table #115: started 2026/01/21-10:46:58.343808 7f1529bfb6c0 Level-0 table #139: started
2026/01/10-22:35:10.938192 7fd4627fc6c0 Level-0 table #115: 0 bytes OK 2026/01/21-10:46:58.343835 7f1529bfb6c0 Level-0 table #139: 0 bytes OK
2026/01/10-22:35:10.944117 7fd4627fc6c0 Delete type=0 #113 2026/01/21-10:46:58.350098 7f1529bfb6c0 Delete type=0 #137
2026/01/10-22:35:10.963606 7fd4627fc6c0 Manual compaction at level-0 from '!folders!5pCYN0vTiCKOHrXM' @ 72057594037927935 : 1 .. '!items!zbZ88BQkH9ZCYlDK' @ 0 : 0; will stop at (end) 2026/01/21-10:46:58.364021 7f1529bfb6c0 Manual compaction at level-0 from '!folders!5pCYN0vTiCKOHrXM' @ 72057594037927935 : 1 .. '!items!zbZ88BQkH9ZCYlDK' @ 0 : 0; will stop at (end)
2026/01/10-22:35:10.963664 7fd4627fc6c0 Manual compaction at level-1 from '!folders!5pCYN0vTiCKOHrXM' @ 72057594037927935 : 1 .. '!items!zbZ88BQkH9ZCYlDK' @ 0 : 0; will stop at (end) 2026/01/21-10:46:58.364061 7f1529bfb6c0 Manual compaction at level-1 from '!folders!5pCYN0vTiCKOHrXM' @ 72057594037927935 : 1 .. '!items!zbZ88BQkH9ZCYlDK' @ 0 : 0; will stop at (end)

Binary file not shown.

View File

@@ -1 +1 @@
MANIFEST-000313 MANIFEST-000337

View File

@@ -1,8 +1,8 @@
2026/01/10-22:45:42.668879 7fd462ffd6c0 Recovering log #311 2026/01/21-10:53:46.003247 7f152abfd6c0 Recovering log #335
2026/01/10-22:45:42.678749 7fd462ffd6c0 Delete type=0 #311 2026/01/21-10:53:46.013653 7f152abfd6c0 Delete type=3 #333
2026/01/10-22:45:42.678826 7fd462ffd6c0 Delete type=3 #309 2026/01/21-10:53:46.013722 7f152abfd6c0 Delete type=0 #335
2026/01/10-22:49:23.144714 7fd4627fc6c0 Level-0 table #316: started 2026/01/21-10:54:50.968627 7f1529bfb6c0 Level-0 table #340: started
2026/01/10-22:49:23.144752 7fd4627fc6c0 Level-0 table #316: 0 bytes OK 2026/01/21-10:54:50.968655 7f1529bfb6c0 Level-0 table #340: 0 bytes OK
2026/01/10-22:49:23.151560 7fd4627fc6c0 Delete type=0 #314 2026/01/21-10:54:51.007062 7f1529bfb6c0 Delete type=0 #338
2026/01/10-22:49:23.151755 7fd4627fc6c0 Manual compaction at level-0 from '!items!19r9ijZUyvnlIqgm' @ 72057594037927935 : 1 .. '!items!zON0h5SjFyANjPnA' @ 0 : 0; will stop at (end) 2026/01/21-10:54:51.044568 7f1529bfb6c0 Manual compaction at level-0 from '!items!19r9ijZUyvnlIqgm' @ 72057594037927935 : 1 .. '!items!zON0h5SjFyANjPnA' @ 0 : 0; will stop at (end)
2026/01/10-22:49:23.151791 7fd4627fc6c0 Manual compaction at level-1 from '!items!19r9ijZUyvnlIqgm' @ 72057594037927935 : 1 .. '!items!zON0h5SjFyANjPnA' @ 0 : 0; will stop at (end) 2026/01/21-10:54:51.044607 7f1529bfb6c0 Manual compaction at level-1 from '!items!19r9ijZUyvnlIqgm' @ 72057594037927935 : 1 .. '!items!zON0h5SjFyANjPnA' @ 0 : 0; will stop at (end)

View File

@@ -1,8 +1,8 @@
2026/01/10-17:13:21.514326 7fd4637fe6c0 Recovering log #307 2026/01/21-10:43:50.253598 7f152a3fc6c0 Recovering log #331
2026/01/10-17:13:21.524571 7fd4637fe6c0 Delete type=3 #305 2026/01/21-10:43:50.263729 7f152a3fc6c0 Delete type=3 #329
2026/01/10-17:13:21.524713 7fd4637fe6c0 Delete type=0 #307 2026/01/21-10:43:50.263795 7f152a3fc6c0 Delete type=0 #331
2026/01/10-22:35:10.957462 7fd4627fc6c0 Level-0 table #312: started 2026/01/21-10:46:58.357700 7f1529bfb6c0 Level-0 table #336: started
2026/01/10-22:35:10.957496 7fd4627fc6c0 Level-0 table #312: 0 bytes OK 2026/01/21-10:46:58.357727 7f1529bfb6c0 Level-0 table #336: 0 bytes OK
2026/01/10-22:35:10.963461 7fd4627fc6c0 Delete type=0 #310 2026/01/21-10:46:58.363871 7f1529bfb6c0 Delete type=0 #334
2026/01/10-22:35:10.963651 7fd4627fc6c0 Manual compaction at level-0 from '!items!19r9ijZUyvnlIqgm' @ 72057594037927935 : 1 .. '!items!zON0h5SjFyANjPnA' @ 0 : 0; will stop at (end) 2026/01/21-10:46:58.364050 7f1529bfb6c0 Manual compaction at level-0 from '!items!19r9ijZUyvnlIqgm' @ 72057594037927935 : 1 .. '!items!zON0h5SjFyANjPnA' @ 0 : 0; will stop at (end)
2026/01/10-22:35:10.963700 7fd4627fc6c0 Manual compaction at level-1 from '!items!19r9ijZUyvnlIqgm' @ 72057594037927935 : 1 .. '!items!zON0h5SjFyANjPnA' @ 0 : 0; will stop at (end) 2026/01/21-10:46:58.364080 7f1529bfb6c0 Manual compaction at level-1 from '!items!19r9ijZUyvnlIqgm' @ 72057594037927935 : 1 .. '!items!zON0h5SjFyANjPnA' @ 0 : 0; will stop at (end)

Binary file not shown.

View File

@@ -1 +1 @@
MANIFEST-000310 MANIFEST-000334

View File

@@ -1,7 +1,7 @@
2026/01/10-22:45:42.695199 7fd4637fe6c0 Recovering log #308 2026/01/21-10:53:46.029848 7f152a3fc6c0 Recovering log #332
2026/01/10-22:45:42.705593 7fd4637fe6c0 Delete type=0 #308 2026/01/21-10:53:46.039745 7f152a3fc6c0 Delete type=3 #330
2026/01/10-22:45:42.705668 7fd4637fe6c0 Delete type=3 #306 2026/01/21-10:53:46.039809 7f152a3fc6c0 Delete type=0 #332
2026/01/10-22:49:23.151885 7fd4627fc6c0 Level-0 table #313: started 2026/01/21-10:54:51.044679 7f1529bfb6c0 Level-0 table #337: started
2026/01/10-22:49:23.151921 7fd4627fc6c0 Level-0 table #313: 0 bytes OK 2026/01/21-10:54:51.044730 7f1529bfb6c0 Level-0 table #337: 0 bytes OK
2026/01/10-22:49:23.158651 7fd4627fc6c0 Delete type=0 #311 2026/01/21-10:54:51.075139 7f1529bfb6c0 Delete type=0 #335
2026/01/10-22:49:23.178829 7fd4627fc6c0 Manual compaction at level-0 from 'undefined' @ 72057594037927935 : 1 .. 'undefined' @ 0 : 0; will stop at (end) 2026/01/21-10:54:51.190078 7f1529bfb6c0 Manual compaction at level-0 from 'undefined' @ 72057594037927935 : 1 .. 'undefined' @ 0 : 0; will stop at (end)

View File

@@ -1,7 +1,7 @@
2026/01/10-17:13:21.543192 7fd463fff6c0 Recovering log #304 2026/01/21-10:43:50.279117 7f152b3fe6c0 Recovering log #328
2026/01/10-17:13:21.553430 7fd463fff6c0 Delete type=3 #302 2026/01/21-10:43:50.289888 7f152b3fe6c0 Delete type=3 #326
2026/01/10-17:13:21.553529 7fd463fff6c0 Delete type=0 #304 2026/01/21-10:43:50.289946 7f152b3fe6c0 Delete type=0 #328
2026/01/10-22:35:10.970109 7fd4627fc6c0 Level-0 table #309: started 2026/01/21-10:46:58.370955 7f1529bfb6c0 Level-0 table #333: started
2026/01/10-22:35:10.970150 7fd4627fc6c0 Level-0 table #309: 0 bytes OK 2026/01/21-10:46:58.370994 7f1529bfb6c0 Level-0 table #333: 0 bytes OK
2026/01/10-22:35:10.976638 7fd4627fc6c0 Delete type=0 #307 2026/01/21-10:46:58.377870 7f1529bfb6c0 Delete type=0 #331
2026/01/10-22:35:10.989936 7fd4627fc6c0 Manual compaction at level-0 from 'undefined' @ 72057594037927935 : 1 .. 'undefined' @ 0 : 0; will stop at (end) 2026/01/21-10:46:58.391392 7f1529bfb6c0 Manual compaction at level-0 from 'undefined' @ 72057594037927935 : 1 .. 'undefined' @ 0 : 0; will stop at (end)

Binary file not shown.

View File

@@ -1 +1 @@
MANIFEST-000281 MANIFEST-000305

View File

@@ -1,8 +1,8 @@
2026/01/10-22:45:42.708376 7fd462ffd6c0 Recovering log #279 2026/01/21-10:53:46.042639 7f152abfd6c0 Recovering log #303
2026/01/10-22:45:42.718470 7fd462ffd6c0 Delete type=0 #279 2026/01/21-10:53:46.053450 7f152abfd6c0 Delete type=3 #301
2026/01/10-22:45:42.718531 7fd462ffd6c0 Delete type=3 #277 2026/01/21-10:53:46.053514 7f152abfd6c0 Delete type=0 #303
2026/01/10-22:49:23.171028 7fd4627fc6c0 Level-0 table #284: started 2026/01/21-10:54:51.119771 7f1529bfb6c0 Level-0 table #308: started
2026/01/10-22:49:23.171062 7fd4627fc6c0 Level-0 table #284: 0 bytes OK 2026/01/21-10:54:51.119820 7f1529bfb6c0 Level-0 table #308: 0 bytes OK
2026/01/10-22:49:23.178682 7fd4627fc6c0 Delete type=0 #282 2026/01/21-10:54:51.154290 7f1529bfb6c0 Delete type=0 #306
2026/01/10-22:49:23.178868 7fd4627fc6c0 Manual compaction at level-0 from '!scenes!8DjkNeeujp2qff1N' @ 72057594037927935 : 1 .. '!scenes!ypDutqjqZcr7lx6I' @ 0 : 0; will stop at (end) 2026/01/21-10:54:51.190098 7f1529bfb6c0 Manual compaction at level-0 from '!scenes!8DjkNeeujp2qff1N' @ 72057594037927935 : 1 .. '!scenes!ypDutqjqZcr7lx6I' @ 0 : 0; will stop at (end)
2026/01/10-22:49:23.178891 7fd4627fc6c0 Manual compaction at level-1 from '!scenes!8DjkNeeujp2qff1N' @ 72057594037927935 : 1 .. '!scenes!ypDutqjqZcr7lx6I' @ 0 : 0; will stop at (end) 2026/01/21-10:54:51.190281 7f1529bfb6c0 Manual compaction at level-1 from '!scenes!8DjkNeeujp2qff1N' @ 72057594037927935 : 1 .. '!scenes!ypDutqjqZcr7lx6I' @ 0 : 0; will stop at (end)

View File

@@ -1,8 +1,8 @@
2026/01/10-17:13:21.556875 7fd4637fe6c0 Recovering log #275 2026/01/21-10:43:50.292479 7f152a3fc6c0 Recovering log #299
2026/01/10-17:13:21.568002 7fd4637fe6c0 Delete type=3 #273 2026/01/21-10:43:50.302752 7f152a3fc6c0 Delete type=3 #297
2026/01/10-17:13:21.568079 7fd4637fe6c0 Delete type=0 #275 2026/01/21-10:43:50.302832 7f152a3fc6c0 Delete type=0 #299
2026/01/10-22:35:10.983465 7fd4627fc6c0 Level-0 table #280: started 2026/01/21-10:46:58.377980 7f1529bfb6c0 Level-0 table #304: started
2026/01/10-22:35:10.983518 7fd4627fc6c0 Level-0 table #280: 0 bytes OK 2026/01/21-10:46:58.378008 7f1529bfb6c0 Level-0 table #304: 0 bytes OK
2026/01/10-22:35:10.989758 7fd4627fc6c0 Delete type=0 #278 2026/01/21-10:46:58.384246 7f1529bfb6c0 Delete type=0 #302
2026/01/10-22:35:10.989959 7fd4627fc6c0 Manual compaction at level-0 from '!scenes!8DjkNeeujp2qff1N' @ 72057594037927935 : 1 .. '!scenes!ypDutqjqZcr7lx6I' @ 0 : 0; will stop at (end) 2026/01/21-10:46:58.391407 7f1529bfb6c0 Manual compaction at level-0 from '!scenes!8DjkNeeujp2qff1N' @ 72057594037927935 : 1 .. '!scenes!ypDutqjqZcr7lx6I' @ 0 : 0; will stop at (end)
2026/01/10-22:35:10.989984 7fd4627fc6c0 Manual compaction at level-1 from '!scenes!8DjkNeeujp2qff1N' @ 72057594037927935 : 1 .. '!scenes!ypDutqjqZcr7lx6I' @ 0 : 0; will stop at (end) 2026/01/21-10:46:58.391435 7f1529bfb6c0 Manual compaction at level-1 from '!scenes!8DjkNeeujp2qff1N' @ 72057594037927935 : 1 .. '!scenes!ypDutqjqZcr7lx6I' @ 0 : 0; will stop at (end)

Binary file not shown.

View File

@@ -465,9 +465,9 @@ table {
font-weight: bold; font-weight: bold;
} }
.fvtt-les-heritiers .items-list .item { .fvtt-les-heritiers .items-list .item {
height: 30px; height: 24px;
line-height: 24px; line-height: 20px;
padding: 1px 0; padding: 0;
border-bottom: 1px solid #BBB; border-bottom: 1px solid #BBB;
} }
.fvtt-les-heritiers .items-list .item .item-image { .fvtt-les-heritiers .items-list .item .item-image {
@@ -614,7 +614,7 @@ nav.sheet-tabs .item:after {
/* AppV2 Actor Sheets - Tabs with scrolling */ /* AppV2 Actor Sheets - Tabs with scrolling */
.fvtt-les-heritiers.actor .tab[data-tab] { .fvtt-les-heritiers.actor .tab[data-tab] {
display: none; display: none;
padding: 0.5rem; padding: 0.25rem 0.5rem;
overflow-y: auto; overflow-y: auto;
flex: 1 1 auto; flex: 1 1 auto;
} }
@@ -623,7 +623,7 @@ nav.sheet-tabs .item:after {
} }
/* Redesigned skill category headers */ /* Redesigned skill category headers */
.fvtt-les-heritiers.actor .sheet-box { .fvtt-les-heritiers.actor .sheet-box {
margin-bottom: 0.5rem; margin-bottom: 0.25rem;
} }
.fvtt-les-heritiers.actor .items-title-text { .fvtt-les-heritiers.actor .items-title-text {
font-size: 0.95rem; font-size: 0.95rem;
@@ -2005,31 +2005,31 @@ h4.entry-name.document-name {
min-width: 9rem; min-width: 9rem;
} }
.item-field-label-short { .item-field-label-short {
padding-top: 6px; padding-top: 2px;
flex-grow: 1; flex-grow: 1;
max-width: 4rem; max-width: 4rem;
min-width: 4rem; min-width: 4rem;
} }
.item-field-label-short-num { .item-field-label-short-num {
padding-top: 6px; padding-top: 2px;
flex-grow: 1; flex-grow: 1;
max-width: 2rem; max-width: 2rem;
min-width: 2rem; min-width: 2rem;
} }
.item-field-label-medium { .item-field-label-medium {
padding-top: 6px; padding-top: 2px;
flex-grow: 1; flex-grow: 1;
max-width: 6rem; max-width: 6rem;
min-width: 6rem; min-width: 6rem;
} }
.item-field-label-long { .item-field-label-long {
padding-top: 6px; padding-top: 2px;
flex-grow: 1; flex-grow: 1;
max-width: 8rem; max-width: 8rem;
min-width: 8rem; min-width: 8rem;
} }
.item-field-label-long2 { .item-field-label-long2 {
padding-top: 6px; padding-top: 2px;
flex-grow: 1; flex-grow: 1;
max-width: 14rem; max-width: 14rem;
min-width: 14rem; min-width: 14rem;
@@ -2039,7 +2039,7 @@ h4.entry-name.document-name {
min-width: 16rem; min-width: 16rem;
} }
.item-field-label-long3 { .item-field-label-long3 {
padding-top: 6px; padding-top: 2px;
flex-grow: 1; flex-grow: 1;
max-width: 20rem; max-width: 20rem;
min-width: 20rem; min-width: 20rem;

File diff suppressed because one or more lines are too long

View File

@@ -82,7 +82,7 @@
"units": "m" "units": "m"
}, },
"license": "LICENSE.txt", "license": "LICENSE.txt",
"manifest": "https://www.uberwald.me/gitea/public/fvtt-les-heritiers/raw/branch/master/system.json", "manifest": "https://www.uberwald.me/gitea/public/fvtt-les-heritiers/releases/download/latest/system.json",
"download": "https://www.uberwald.me/gitea/public/fvtt-les-heritiers/archive/fvtt-les-heritiers-13.0.7.zip", "download": "https://www.uberwald.me/gitea/public/fvtt-les-heritiers/archive/fvtt-les-heritiers-13.0.7.zip",
"languages": [ "languages": [
{ {

View File

@@ -17,6 +17,7 @@
</select> </select>
</li> </li>
{{#if (eq system.categorie "utile")}}
<li class="flexrow item"> <li class="flexrow item">
<label class="generic-label item-field-label-long2">Profil </label> <label class="generic-label item-field-label-long2">Profil </label>
<select class="status-small-label color-class-common item-field-label-long" type="text" name="system.profil" <select class="status-small-label color-class-common item-field-label-long" type="text" name="system.profil"
@@ -24,6 +25,7 @@
{{selectOptions config.competenceProfil selected=system.profil labelAttr="name"}} {{selectOptions config.competenceProfil selected=system.profil labelAttr="name"}}
</select> </select>
</li> </li>
{{/if}}
<li class="flexrow item"> <li class="flexrow item">
<label class="generic-label item-field-label-long2">Compétence de Prédilection ? </label> <label class="generic-label item-field-label-long2">Compétence de Prédilection ? </label>
@@ -80,13 +82,13 @@
{{#each system.specialites as |specialite key|}} {{#each system.specialites as |specialite key|}}
<li class="specialite-item item flexrow" data-specialite-index="{{key}}"> <li class="specialite-item item flexrow" data-specialite-index="{{key}}">
<input type="text" class="padd-right color-class-common edit-specialite" value="{{specialite.name}}" <input type="text" class="padd-right color-class-common edit-specialite" value="{{specialite.name}}"
data-dtype="String" data-action="editSpecialite" /> data-dtype="String" />
<a class="item-control delete-specialite" title="Supprimer une specialité" data-action="deleteSpecialite"><i <a class="item-control delete-specialite" title="Supprimer une specialité" data-action="deleteSpecialite"><i
class="fas fa-trash"></i></a> class="fas fa-trash"></i></a>
</li> </li>
<li class="specialite-item item flexrow" data-specialite-index="{{key}}"> <li class="specialite-item item flexrow" data-specialite-index="{{key}}">
<textarea row="4" type="text" class="padd-right color-class-common edit-specialite-description" <textarea row="4" type="text" class="padd-right color-class-common edit-specialite-description"
data-dtype="String" data-action="editSpecialiteDescription">{{specialite.description}}</textarea> data-dtype="String">{{specialite.description}}</textarea>
</li> </li>
<hr> <hr>
{{/each}} {{/each}}

View File

@@ -8,21 +8,19 @@
</a> </a>
</span> </span>
{{else}} {{else}}
<span class="item-field-label-long"> <h3><label class="items-title-text">{{upperFirst keyProfil}} (Rang: {{skillDef.rang}})</label></h3>
<h3><label class="items-title-text">{{upperFirst keyProfil}}</label></h3>
</span>
{{/if}} {{/if}}
{{#if isPNJ}}
<span class="item-field-label-short"> <span class="item-field-label-short">
<label class="short-label">Niveau</label> <label class="short-label">Niveau</label>
</span> </span>
{{#if isPNJ}}
<span class="item-field-label-short"> <span class="item-field-label-short">
<input type="text" data-dtype="Number" class="item-field-label-short" <input type="text" data-dtype="Number" class="item-field-label-short"
name="system.competences.{{keyProfil}}.niveau" value="{{skillDef.niveau}}" style="text-align: center;"> name="system.competences.{{keyProfil}}.niveau" value="{{skillDef.niveau}}" style="text-align: center;">
</span> </span>
{{/if}}
<div class="item-filler">&nbsp;</div> <div class="item-filler">&nbsp;</div>
{{/if}}
</li> </li>
{{#each skillDef.skills as |skill key|}} {{#each skillDef.skills as |skill key|}}
<li class="item flexrow " data-item-id="{{skill._id}}" data-item-type="competence"> <li class="item flexrow " data-item-id="{{skill._id}}" data-item-type="competence">
@@ -32,7 +30,7 @@
value="{{skill.system.niveau}}" data-dtype="Number"> value="{{skill.system.niveau}}" data-dtype="Number">
{{selectOptions @root.config.listNiveau selected=skill.system.niveau}} {{selectOptions @root.config.listNiveau selected=skill.system.niveau}}
</select> </select>
<input type="checkbox" class="item-field-label-short edit-item-data" data-tooltip="Prédilection" data-item-field="predilection" {{checked <input type="checkbox" class="item-field-label-short edit-item-data" data-tooltip="Prédilection" data-item-field="predilection" data-dtype="Boolean" {{checked
skill.system.predilection}} /> skill.system.predilection}} />
<div class="item-controls item-controls-fixed"> <div class="item-controls item-controls-fixed">
<a class="item-control item-edit" title="Edit Item" data-action="editItem"><i class="fas fa-edit"></i></a> <a class="item-control item-edit" title="Edit Item" data-action="editItem"><i class="fas fa-edit"></i></a>