Compare commits
3 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 038aa37838 | |||
| 25b6e30aa8 | |||
| f445741eda |
598
DEVELOPER_INSTRUCTIONS.md
Normal file
598
DEVELOPER_INSTRUCTIONS.md
Normal 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
239
DOCUMENTATION_INDEX.md
Normal 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
250
QUICK_REFERENCE.md
Normal 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+)
|
||||||
@@ -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;
|
||||||
|
|||||||
@@ -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)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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 })
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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: "" }),
|
||||||
|
|||||||
@@ -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: "" }),
|
||||||
|
|||||||
@@ -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: "" }),
|
||||||
|
|||||||
@@ -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 }),
|
||||||
|
|||||||
@@ -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: "" })
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
MANIFEST-000316
|
MANIFEST-000336
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
2026/01/12-15:54:43.852904 7f86553fd6c0 Recovering log #314
|
2026/01/21-10:53:45.991086 7f152a3fc6c0 Recovering log #334
|
||||||
2026/01/12-15:54:43.863656 7f86553fd6c0 Delete type=3 #312
|
2026/01/21-10:53:46.000764 7f152a3fc6c0 Delete type=3 #332
|
||||||
2026/01/12-15:54:43.863728 7f86553fd6c0 Delete type=0 #314
|
2026/01/21-10:53:46.000821 7f152a3fc6c0 Delete type=0 #334
|
||||||
2026/01/12-15:56:47.716964 7f864ffff6c0 Level-0 table #319: started
|
2026/01/21-10:54:50.937646 7f1529bfb6c0 Level-0 table #339: started
|
||||||
2026/01/12-15:56:47.716995 7f864ffff6c0 Level-0 table #319: 0 bytes OK
|
2026/01/21-10:54:50.937686 7f1529bfb6c0 Level-0 table #339: 0 bytes OK
|
||||||
2026/01/12-15:56:47.723316 7f864ffff6c0 Delete type=0 #317
|
2026/01/21-10:54:50.968467 7f1529bfb6c0 Delete type=0 #337
|
||||||
2026/01/12-15:56:47.743760 7f864ffff6c0 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/12-15:56:47.743829 7f864ffff6c0 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)
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
2026/01/10-22:45:42.655574 7fd463fff6c0 Recovering log #310
|
2026/01/21-10:43:50.240377 7f152b3fe6c0 Recovering log #330
|
||||||
2026/01/10-22:45:42.666271 7fd463fff6c0 Delete type=0 #310
|
2026/01/21-10:43:50.250901 7f152b3fe6c0 Delete type=3 #328
|
||||||
2026/01/10-22:45:42.666327 7fd463fff6c0 Delete type=3 #308
|
2026/01/21-10:43:50.250970 7f152b3fe6c0 Delete type=0 #330
|
||||||
2026/01/10-22:49:23.124832 7fd4627fc6c0 Level-0 table #315: started
|
2026/01/21-10:46:58.350230 7f1529bfb6c0 Level-0 table #335: started
|
||||||
2026/01/10-22:49:23.124856 7fd4627fc6c0 Level-0 table #315: 0 bytes OK
|
2026/01/21-10:46:58.350259 7f1529bfb6c0 Level-0 table #335: 0 bytes OK
|
||||||
2026/01/10-22:49:23.132096 7fd4627fc6c0 Delete type=0 #313
|
2026/01/21-10:46:58.357573 7f1529bfb6c0 Delete type=0 #333
|
||||||
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: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: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:46:58.364070 7f1529bfb6c0 Manual compaction at level-1 from '!items!1NhJH4IJpxsGmLB8' @ 72057594037927935 : 1 .. '!items!y1yOenfAJTsb3r6e' @ 0 : 0; will stop at (end)
|
||||||
|
|||||||
Binary file not shown.
@@ -1 +1 @@
|
|||||||
MANIFEST-000316
|
MANIFEST-000336
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
2026/01/12-15:54:43.880875 7f86563ff6c0 Recovering log #314
|
2026/01/21-10:53:46.017018 7f152b3fe6c0 Recovering log #334
|
||||||
2026/01/12-15:54:43.891289 7f86563ff6c0 Delete type=3 #312
|
2026/01/21-10:53:46.027168 7f152b3fe6c0 Delete type=3 #332
|
||||||
2026/01/12-15:54:43.891367 7f86563ff6c0 Delete type=0 #314
|
2026/01/21-10:53:46.027239 7f152b3fe6c0 Delete type=0 #334
|
||||||
2026/01/12-15:56:47.750686 7f864ffff6c0 Level-0 table #319: started
|
2026/01/21-10:54:51.075256 7f1529bfb6c0 Level-0 table #339: started
|
||||||
2026/01/12-15:56:47.750713 7f864ffff6c0 Level-0 table #319: 0 bytes OK
|
2026/01/21-10:54:51.075290 7f1529bfb6c0 Level-0 table #339: 0 bytes OK
|
||||||
2026/01/12-15:56:47.757143 7f864ffff6c0 Delete type=0 #317
|
2026/01/21-10:54:51.119572 7f1529bfb6c0 Delete type=0 #337
|
||||||
2026/01/12-15:56:47.770474 7f864ffff6c0 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/12-15:56:47.770509 7f864ffff6c0 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)
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
2026/01/10-22:45:42.682529 7fd478fff6c0 Recovering log #310
|
2026/01/21-10:43:50.267294 7f152abfd6c0 Recovering log #330
|
||||||
2026/01/10-22:45:42.692944 7fd478fff6c0 Delete type=0 #310
|
2026/01/21-10:43:50.276983 7f152abfd6c0 Delete type=3 #328
|
||||||
2026/01/10-22:45:42.692994 7fd478fff6c0 Delete type=3 #308
|
2026/01/21-10:43:50.277035 7f152abfd6c0 Delete type=0 #330
|
||||||
2026/01/10-22:49:23.158820 7fd4627fc6c0 Level-0 table #315: started
|
2026/01/21-10:46:58.364131 7f1529bfb6c0 Level-0 table #335: started
|
||||||
2026/01/10-22:49:23.158855 7fd4627fc6c0 Level-0 table #315: 0 bytes OK
|
2026/01/21-10:46:58.364205 7f1529bfb6c0 Level-0 table #335: 0 bytes OK
|
||||||
2026/01/10-22:49:23.164806 7fd4627fc6c0 Delete type=0 #313
|
2026/01/21-10:46:58.370782 7f1529bfb6c0 Delete type=0 #333
|
||||||
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: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: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:46:58.391426 7f1529bfb6c0 Manual compaction at level-1 from '!items!1ETVaPBtjDtzelK1' @ 72057594037927935 : 1 .. '!items!zbsVCsWxRzkzzG1N' @ 0 : 0; will stop at (end)
|
||||||
|
|||||||
Binary file not shown.
@@ -1 +1 @@
|
|||||||
MANIFEST-000316
|
MANIFEST-000336
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
2026/01/12-15:54:43.825557 7f86563ff6c0 Recovering log #314
|
2026/01/21-10:53:45.963781 7f152abfd6c0 Recovering log #334
|
||||||
2026/01/12-15:54:43.835278 7f86563ff6c0 Delete type=3 #312
|
2026/01/21-10:53:45.974011 7f152abfd6c0 Delete type=3 #332
|
||||||
2026/01/12-15:54:43.835357 7f86563ff6c0 Delete type=0 #314
|
2026/01/21-10:53:45.974068 7f152abfd6c0 Delete type=0 #334
|
||||||
2026/01/12-15:56:47.730195 7f864ffff6c0 Level-0 table #319: started
|
2026/01/21-10:54:50.901280 7f1529bfb6c0 Level-0 table #339: started
|
||||||
2026/01/12-15:56:47.730232 7f864ffff6c0 Level-0 table #319: 0 bytes OK
|
2026/01/21-10:54:50.901351 7f1529bfb6c0 Level-0 table #339: 0 bytes OK
|
||||||
2026/01/12-15:56:47.736637 7f864ffff6c0 Delete type=0 #317
|
2026/01/21-10:54:50.937470 7f1529bfb6c0 Delete type=0 #337
|
||||||
2026/01/12-15:56:47.743801 7f864ffff6c0 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/12-15:56:47.743840 7f864ffff6c0 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)
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
2026/01/10-22:45:42.628622 7fd462ffd6c0 Recovering log #310
|
2026/01/21-10:43:50.215403 7f152a3fc6c0 Recovering log #330
|
||||||
2026/01/10-22:45:42.638290 7fd462ffd6c0 Delete type=0 #310
|
2026/01/21-10:43:50.225230 7f152a3fc6c0 Delete type=3 #328
|
||||||
2026/01/10-22:45:42.638350 7fd462ffd6c0 Delete type=3 #308
|
2026/01/21-10:43:50.225283 7f152a3fc6c0 Delete type=0 #330
|
||||||
2026/01/10-22:49:23.132234 7fd4627fc6c0 Level-0 table #315: started
|
2026/01/21-10:46:58.336769 7f1529bfb6c0 Level-0 table #335: started
|
||||||
2026/01/10-22:49:23.132271 7fd4627fc6c0 Level-0 table #315: 0 bytes OK
|
2026/01/21-10:46:58.336818 7f1529bfb6c0 Level-0 table #335: 0 bytes OK
|
||||||
2026/01/10-22:49:23.138271 7fd4627fc6c0 Delete type=0 #313
|
2026/01/21-10:46:58.343699 7f1529bfb6c0 Delete type=0 #333
|
||||||
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: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: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:46:58.364042 7f1529bfb6c0 Manual compaction at level-1 from '!items!0fPXtA5LkLgG8uDj' @ 72057594037927935 : 1 .. '!items!zvtBlG6KCIn0oCVk' @ 0 : 0; will stop at (end)
|
||||||
|
|||||||
Binary file not shown.
@@ -1 +1 @@
|
|||||||
MANIFEST-000316
|
MANIFEST-000336
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
2026/01/12-15:54:43.786779 7f8655bfe6c0 Recovering log #314
|
2026/01/21-10:53:45.925373 7f152bbff6c0 Recovering log #334
|
||||||
2026/01/12-15:54:43.796205 7f8655bfe6c0 Delete type=3 #312
|
2026/01/21-10:53:45.935373 7f152bbff6c0 Delete type=3 #332
|
||||||
2026/01/12-15:54:43.796277 7f8655bfe6c0 Delete type=0 #314
|
2026/01/21-10:53:45.935424 7f152bbff6c0 Delete type=0 #334
|
||||||
2026/01/12-15:56:47.696845 7f864ffff6c0 Level-0 table #319: started
|
2026/01/21-10:54:50.778002 7f1529bfb6c0 Level-0 table #339: started
|
||||||
2026/01/12-15:56:47.696884 7f864ffff6c0 Level-0 table #319: 0 bytes OK
|
2026/01/21-10:54:50.778030 7f1529bfb6c0 Level-0 table #339: 0 bytes OK
|
||||||
2026/01/12-15:56:47.703265 7f864ffff6c0 Delete type=0 #317
|
2026/01/21-10:54:50.828753 7f1529bfb6c0 Delete type=0 #337
|
||||||
2026/01/12-15:56:47.716824 7f864ffff6c0 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/12-15:56:47.716864 7f864ffff6c0 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)
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
2026/01/10-22:45:42.589327 7fd4637fe6c0 Recovering log #310
|
2026/01/21-10:43:50.178287 7f152abfd6c0 Recovering log #330
|
||||||
2026/01/10-22:45:42.598987 7fd4637fe6c0 Delete type=0 #310
|
2026/01/21-10:43:50.188475 7f152abfd6c0 Delete type=3 #328
|
||||||
2026/01/10-22:45:42.599056 7fd4637fe6c0 Delete type=3 #308
|
2026/01/21-10:43:50.188562 7f152abfd6c0 Delete type=0 #330
|
||||||
2026/01/10-22:49:23.105824 7fd4627fc6c0 Level-0 table #315: started
|
2026/01/21-10:46:58.315382 7f1529bfb6c0 Level-0 table #335: started
|
||||||
2026/01/10-22:49:23.105875 7fd4627fc6c0 Level-0 table #315: 0 bytes OK
|
2026/01/21-10:46:58.315409 7f1529bfb6c0 Level-0 table #335: 0 bytes OK
|
||||||
2026/01/10-22:49:23.111837 7fd4627fc6c0 Delete type=0 #313
|
2026/01/21-10:46:58.323079 7f1529bfb6c0 Delete type=0 #333
|
||||||
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: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: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: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.
@@ -1 +1 @@
|
|||||||
MANIFEST-000316
|
MANIFEST-000336
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
2026/01/12-15:54:43.812988 7f86553fd6c0 Recovering log #314
|
2026/01/21-10:53:45.951417 7f152a3fc6c0 Recovering log #334
|
||||||
2026/01/12-15:54:43.823003 7f86553fd6c0 Delete type=3 #312
|
2026/01/21-10:53:45.961147 7f152a3fc6c0 Delete type=3 #332
|
||||||
2026/01/12-15:54:43.823078 7f86553fd6c0 Delete type=0 #314
|
2026/01/21-10:53:45.961217 7f152a3fc6c0 Delete type=0 #334
|
||||||
2026/01/12-15:56:47.690134 7f864ffff6c0 Level-0 table #319: started
|
2026/01/21-10:54:50.828879 7f1529bfb6c0 Level-0 table #339: started
|
||||||
2026/01/12-15:56:47.690185 7f864ffff6c0 Level-0 table #319: 0 bytes OK
|
2026/01/21-10:54:50.828907 7f1529bfb6c0 Level-0 table #339: 0 bytes OK
|
||||||
2026/01/12-15:56:47.696696 7f864ffff6c0 Delete type=0 #317
|
2026/01/21-10:54:50.862960 7f1529bfb6c0 Delete type=0 #337
|
||||||
2026/01/12-15:56:47.716811 7f864ffff6c0 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/12-15:56:47.716857 7f864ffff6c0 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)
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
2026/01/10-22:45:42.615071 7fd463fff6c0 Recovering log #310
|
2026/01/21-10:43:50.203621 7f152b3fe6c0 Recovering log #330
|
||||||
2026/01/10-22:45:42.625822 7fd463fff6c0 Delete type=0 #310
|
2026/01/21-10:43:50.213118 7f152b3fe6c0 Delete type=3 #328
|
||||||
2026/01/10-22:45:42.625885 7fd463fff6c0 Delete type=3 #308
|
2026/01/21-10:43:50.213182 7f152b3fe6c0 Delete type=0 #330
|
||||||
2026/01/10-22:49:23.098421 7fd4627fc6c0 Level-0 table #315: started
|
2026/01/21-10:46:58.323189 7f1529bfb6c0 Level-0 table #335: started
|
||||||
2026/01/10-22:49:23.098464 7fd4627fc6c0 Level-0 table #315: 0 bytes OK
|
2026/01/21-10:46:58.323211 7f1529bfb6c0 Level-0 table #335: 0 bytes OK
|
||||||
2026/01/10-22:49:23.105653 7fd4627fc6c0 Delete type=0 #313
|
2026/01/21-10:46:58.329442 7f1529bfb6c0 Delete type=0 #333
|
||||||
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: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: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: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.
@@ -1 +1 @@
|
|||||||
MANIFEST-000322
|
MANIFEST-000342
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
2026/01/12-15:54:43.773868 7f86553fd6c0 Recovering log #320
|
2026/01/21-10:53:45.912760 7f152abfd6c0 Recovering log #340
|
||||||
2026/01/12-15:54:43.784063 7f86553fd6c0 Delete type=3 #318
|
2026/01/21-10:53:45.922870 7f152abfd6c0 Delete type=3 #338
|
||||||
2026/01/12-15:54:43.784124 7f86553fd6c0 Delete type=0 #320
|
2026/01/21-10:53:45.922940 7f152abfd6c0 Delete type=0 #340
|
||||||
2026/01/12-15:56:47.703398 7f864ffff6c0 Level-0 table #325: started
|
2026/01/21-10:54:50.741159 7f1529bfb6c0 Level-0 table #345: started
|
||||||
2026/01/12-15:56:47.703428 7f864ffff6c0 Level-0 table #325: 0 bytes OK
|
2026/01/21-10:54:50.741200 7f1529bfb6c0 Level-0 table #345: 0 bytes OK
|
||||||
2026/01/12-15:56:47.709990 7f864ffff6c0 Delete type=0 #323
|
2026/01/21-10:54:50.777875 7f1529bfb6c0 Delete type=0 #343
|
||||||
2026/01/12-15:56:47.716836 7f864ffff6c0 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/12-15:56:47.716870 7f864ffff6c0 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)
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
2026/01/10-22:45:42.576270 7fd462ffd6c0 Recovering log #316
|
2026/01/21-10:43:50.165803 7f152b3fe6c0 Recovering log #336
|
||||||
2026/01/10-22:45:42.587079 7fd462ffd6c0 Delete type=0 #316
|
2026/01/21-10:43:50.175695 7f152b3fe6c0 Delete type=3 #334
|
||||||
2026/01/10-22:45:42.587154 7fd462ffd6c0 Delete type=3 #314
|
2026/01/21-10:43:50.175747 7f152b3fe6c0 Delete type=0 #336
|
||||||
2026/01/10-22:49:23.111938 7fd4627fc6c0 Level-0 table #321: started
|
2026/01/21-10:46:58.329532 7f1529bfb6c0 Level-0 table #341: started
|
||||||
2026/01/10-22:49:23.111961 7fd4627fc6c0 Level-0 table #321: 0 bytes OK
|
2026/01/21-10:46:58.329569 7f1529bfb6c0 Level-0 table #341: 0 bytes OK
|
||||||
2026/01/10-22:49:23.117915 7fd4627fc6c0 Delete type=0 #319
|
2026/01/21-10:46:58.336457 7f1529bfb6c0 Delete type=0 #339
|
||||||
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: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: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: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.
@@ -1 +1 @@
|
|||||||
MANIFEST-000316
|
MANIFEST-000336
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
2026/01/12-15:54:43.799073 7f8654bfc6c0 Recovering log #314
|
2026/01/21-10:53:45.937902 7f152b3fe6c0 Recovering log #334
|
||||||
2026/01/12-15:54:43.810216 7f8654bfc6c0 Delete type=3 #312
|
2026/01/21-10:53:45.949011 7f152b3fe6c0 Delete type=3 #332
|
||||||
2026/01/12-15:54:43.810292 7f8654bfc6c0 Delete type=0 #314
|
2026/01/21-10:53:45.949063 7f152b3fe6c0 Delete type=0 #334
|
||||||
2026/01/12-15:56:47.710227 7f864ffff6c0 Level-0 table #319: started
|
2026/01/21-10:54:50.863087 7f1529bfb6c0 Level-0 table #339: started
|
||||||
2026/01/12-15:56:47.710272 7f864ffff6c0 Level-0 table #319: 0 bytes OK
|
2026/01/21-10:54:50.863116 7f1529bfb6c0 Level-0 table #339: 0 bytes OK
|
||||||
2026/01/12-15:56:47.716654 7f864ffff6c0 Delete type=0 #317
|
2026/01/21-10:54:50.900818 7f1529bfb6c0 Delete type=0 #337
|
||||||
2026/01/12-15:56:47.716849 7f864ffff6c0 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/12-15:56:47.716878 7f864ffff6c0 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)
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
2026/01/10-22:45:42.601653 7fd478fff6c0 Recovering log #310
|
2026/01/21-10:43:50.191071 7f152bbff6c0 Recovering log #330
|
||||||
2026/01/10-22:45:42.612222 7fd478fff6c0 Delete type=0 #310
|
2026/01/21-10:43:50.201148 7f152bbff6c0 Delete type=3 #328
|
||||||
2026/01/10-22:45:42.612283 7fd478fff6c0 Delete type=3 #308
|
2026/01/21-10:43:50.201234 7f152bbff6c0 Delete type=0 #330
|
||||||
2026/01/10-22:49:23.118089 7fd4627fc6c0 Level-0 table #315: started
|
2026/01/21-10:46:58.308832 7f1529bfb6c0 Level-0 table #335: started
|
||||||
2026/01/10-22:49:23.118123 7fd4627fc6c0 Level-0 table #315: 0 bytes OK
|
2026/01/21-10:46:58.308870 7f1529bfb6c0 Level-0 table #335: 0 bytes OK
|
||||||
2026/01/10-22:49:23.124530 7fd4627fc6c0 Delete type=0 #313
|
2026/01/21-10:46:58.315278 7f1529bfb6c0 Delete type=0 #333
|
||||||
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: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: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: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.
@@ -1 +1 @@
|
|||||||
MANIFEST-000034
|
MANIFEST-000054
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
2026/01/12-15:54:43.928357 7f86553fd6c0 Recovering log #32
|
2026/01/21-10:53:46.057066 7f152bbff6c0 Recovering log #52
|
||||||
2026/01/12-15:54:43.939201 7f86553fd6c0 Delete type=3 #30
|
2026/01/21-10:53:46.067412 7f152bbff6c0 Delete type=3 #50
|
||||||
2026/01/12-15:54:43.939270 7f86553fd6c0 Delete type=0 #32
|
2026/01/21-10:53:46.067481 7f152bbff6c0 Delete type=0 #52
|
||||||
2026/01/12-15:56:47.757289 7f864ffff6c0 Level-0 table #37: started
|
2026/01/21-10:54:51.154446 7f1529bfb6c0 Level-0 table #57: started
|
||||||
2026/01/12-15:56:47.757345 7f864ffff6c0 Level-0 table #37: 0 bytes OK
|
2026/01/21-10:54:51.154494 7f1529bfb6c0 Level-0 table #57: 0 bytes OK
|
||||||
2026/01/12-15:56:47.763875 7f864ffff6c0 Delete type=0 #35
|
2026/01/21-10:54:51.189974 7f1529bfb6c0 Delete type=0 #55
|
||||||
2026/01/12-15:56:47.770484 7f864ffff6c0 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/12-15:56:47.770516 7f864ffff6c0 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)
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
2026/01/10-22:45:42.723038 7fd4637fe6c0 Recovering log #28
|
2026/01/21-10:43:50.312683 7f152b3fe6c0 Recovering log #48
|
||||||
2026/01/10-22:45:42.733325 7fd4637fe6c0 Delete type=0 #28
|
2026/01/21-10:43:50.322328 7f152b3fe6c0 Delete type=3 #46
|
||||||
2026/01/10-22:45:42.733393 7fd4637fe6c0 Delete type=3 #26
|
2026/01/21-10:43:50.322376 7f152b3fe6c0 Delete type=0 #48
|
||||||
2026/01/10-22:49:23.164915 7fd4627fc6c0 Level-0 table #33: started
|
2026/01/21-10:46:58.384370 7f1529bfb6c0 Level-0 table #53: started
|
||||||
2026/01/10-22:49:23.164944 7fd4627fc6c0 Level-0 table #33: 0 bytes OK
|
2026/01/21-10:46:58.384393 7f1529bfb6c0 Level-0 table #53: 0 bytes OK
|
||||||
2026/01/10-22:49:23.170895 7fd4627fc6c0 Delete type=0 #31
|
2026/01/21-10:46:58.391260 7f1529bfb6c0 Delete type=0 #51
|
||||||
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: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: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: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.
@@ -1 +1 @@
|
|||||||
MANIFEST-000120
|
MANIFEST-000140
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
2026/01/12-15:54:43.838426 7f8655bfe6c0 Recovering log #118
|
2026/01/21-10:53:45.976776 7f152b3fe6c0 Recovering log #138
|
||||||
2026/01/12-15:54:43.848964 7f8655bfe6c0 Delete type=3 #116
|
2026/01/21-10:53:45.987431 7f152b3fe6c0 Delete type=3 #136
|
||||||
2026/01/12-15:54:43.849036 7f8655bfe6c0 Delete type=0 #118
|
2026/01/21-10:53:45.987486 7f152b3fe6c0 Delete type=0 #138
|
||||||
2026/01/12-15:56:47.736760 7f864ffff6c0 Level-0 table #123: started
|
2026/01/21-10:54:51.007181 7f1529bfb6c0 Level-0 table #143: started
|
||||||
2026/01/12-15:56:47.736789 7f864ffff6c0 Level-0 table #123: 0 bytes OK
|
2026/01/21-10:54:51.007212 7f1529bfb6c0 Level-0 table #143: 0 bytes OK
|
||||||
2026/01/12-15:56:47.743551 7f864ffff6c0 Delete type=0 #121
|
2026/01/21-10:54:51.044437 7f1529bfb6c0 Delete type=0 #141
|
||||||
2026/01/12-15:56:47.743817 7f864ffff6c0 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/12-15:56:47.743863 7f864ffff6c0 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)
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
2026/01/10-22:45:42.640975 7fd4637fe6c0 Recovering log #114
|
2026/01/21-10:43:50.227772 7f152abfd6c0 Recovering log #134
|
||||||
2026/01/10-22:45:42.652231 7fd4637fe6c0 Delete type=0 #114
|
2026/01/21-10:43:50.237335 7f152abfd6c0 Delete type=3 #132
|
||||||
2026/01/10-22:45:42.652298 7fd4637fe6c0 Delete type=3 #112
|
2026/01/21-10:43:50.237395 7f152abfd6c0 Delete type=0 #134
|
||||||
2026/01/10-22:49:23.138430 7fd4627fc6c0 Level-0 table #119: started
|
2026/01/21-10:46:58.343808 7f1529bfb6c0 Level-0 table #139: started
|
||||||
2026/01/10-22:49:23.138468 7fd4627fc6c0 Level-0 table #119: 0 bytes OK
|
2026/01/21-10:46:58.343835 7f1529bfb6c0 Level-0 table #139: 0 bytes OK
|
||||||
2026/01/10-22:49:23.144578 7fd4627fc6c0 Delete type=0 #117
|
2026/01/21-10:46:58.350098 7f1529bfb6c0 Delete type=0 #137
|
||||||
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: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: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: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.
@@ -1 +1 @@
|
|||||||
MANIFEST-000317
|
MANIFEST-000337
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
2026/01/12-15:54:43.867088 7f8654bfc6c0 Recovering log #315
|
2026/01/21-10:53:46.003247 7f152abfd6c0 Recovering log #335
|
||||||
2026/01/12-15:54:43.876873 7f8654bfc6c0 Delete type=3 #313
|
2026/01/21-10:53:46.013653 7f152abfd6c0 Delete type=3 #333
|
||||||
2026/01/12-15:54:43.876939 7f8654bfc6c0 Delete type=0 #315
|
2026/01/21-10:53:46.013722 7f152abfd6c0 Delete type=0 #335
|
||||||
2026/01/12-15:56:47.743914 7f864ffff6c0 Level-0 table #320: started
|
2026/01/21-10:54:50.968627 7f1529bfb6c0 Level-0 table #340: started
|
||||||
2026/01/12-15:56:47.744025 7f864ffff6c0 Level-0 table #320: 0 bytes OK
|
2026/01/21-10:54:50.968655 7f1529bfb6c0 Level-0 table #340: 0 bytes OK
|
||||||
2026/01/12-15:56:47.750575 7f864ffff6c0 Delete type=0 #318
|
2026/01/21-10:54:51.007062 7f1529bfb6c0 Delete type=0 #338
|
||||||
2026/01/12-15:56:47.770462 7f864ffff6c0 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/12-15:56:47.770502 7f864ffff6c0 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)
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
2026/01/10-22:45:42.668879 7fd462ffd6c0 Recovering log #311
|
2026/01/21-10:43:50.253598 7f152a3fc6c0 Recovering log #331
|
||||||
2026/01/10-22:45:42.678749 7fd462ffd6c0 Delete type=0 #311
|
2026/01/21-10:43:50.263729 7f152a3fc6c0 Delete type=3 #329
|
||||||
2026/01/10-22:45:42.678826 7fd462ffd6c0 Delete type=3 #309
|
2026/01/21-10:43:50.263795 7f152a3fc6c0 Delete type=0 #331
|
||||||
2026/01/10-22:49:23.144714 7fd4627fc6c0 Level-0 table #316: started
|
2026/01/21-10:46:58.357700 7f1529bfb6c0 Level-0 table #336: started
|
||||||
2026/01/10-22:49:23.144752 7fd4627fc6c0 Level-0 table #316: 0 bytes OK
|
2026/01/21-10:46:58.357727 7f1529bfb6c0 Level-0 table #336: 0 bytes OK
|
||||||
2026/01/10-22:49:23.151560 7fd4627fc6c0 Delete type=0 #314
|
2026/01/21-10:46:58.363871 7f1529bfb6c0 Delete type=0 #334
|
||||||
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: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: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: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.
@@ -1 +1 @@
|
|||||||
MANIFEST-000314
|
MANIFEST-000334
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
2026/01/12-15:54:43.894160 7f86553fd6c0 Recovering log #312
|
2026/01/21-10:53:46.029848 7f152a3fc6c0 Recovering log #332
|
||||||
2026/01/12-15:54:43.904455 7f86553fd6c0 Delete type=3 #310
|
2026/01/21-10:53:46.039745 7f152a3fc6c0 Delete type=3 #330
|
||||||
2026/01/12-15:54:43.904533 7f86553fd6c0 Delete type=0 #312
|
2026/01/21-10:53:46.039809 7f152a3fc6c0 Delete type=0 #332
|
||||||
2026/01/12-15:56:47.723449 7f864ffff6c0 Level-0 table #317: started
|
2026/01/21-10:54:51.044679 7f1529bfb6c0 Level-0 table #337: started
|
||||||
2026/01/12-15:56:47.723487 7f864ffff6c0 Level-0 table #317: 0 bytes OK
|
2026/01/21-10:54:51.044730 7f1529bfb6c0 Level-0 table #337: 0 bytes OK
|
||||||
2026/01/12-15:56:47.730065 7f864ffff6c0 Delete type=0 #315
|
2026/01/21-10:54:51.075139 7f1529bfb6c0 Delete type=0 #335
|
||||||
2026/01/12-15:56:47.743786 7f864ffff6c0 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)
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
2026/01/10-22:45:42.695199 7fd4637fe6c0 Recovering log #308
|
2026/01/21-10:43:50.279117 7f152b3fe6c0 Recovering log #328
|
||||||
2026/01/10-22:45:42.705593 7fd4637fe6c0 Delete type=0 #308
|
2026/01/21-10:43:50.289888 7f152b3fe6c0 Delete type=3 #326
|
||||||
2026/01/10-22:45:42.705668 7fd4637fe6c0 Delete type=3 #306
|
2026/01/21-10:43:50.289946 7f152b3fe6c0 Delete type=0 #328
|
||||||
2026/01/10-22:49:23.151885 7fd4627fc6c0 Level-0 table #313: started
|
2026/01/21-10:46:58.370955 7f1529bfb6c0 Level-0 table #333: started
|
||||||
2026/01/10-22:49:23.151921 7fd4627fc6c0 Level-0 table #313: 0 bytes OK
|
2026/01/21-10:46:58.370994 7f1529bfb6c0 Level-0 table #333: 0 bytes OK
|
||||||
2026/01/10-22:49:23.158651 7fd4627fc6c0 Delete type=0 #311
|
2026/01/21-10:46:58.377870 7f1529bfb6c0 Delete type=0 #331
|
||||||
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:46:58.391392 7f1529bfb6c0 Manual compaction at level-0 from 'undefined' @ 72057594037927935 : 1 .. 'undefined' @ 0 : 0; will stop at (end)
|
||||||
|
|||||||
Binary file not shown.
@@ -1 +1 @@
|
|||||||
MANIFEST-000285
|
MANIFEST-000305
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
2026/01/12-15:54:43.913825 7f8655bfe6c0 Recovering log #283
|
2026/01/21-10:53:46.042639 7f152abfd6c0 Recovering log #303
|
||||||
2026/01/12-15:54:43.924275 7f8655bfe6c0 Delete type=3 #281
|
2026/01/21-10:53:46.053450 7f152abfd6c0 Delete type=3 #301
|
||||||
2026/01/12-15:54:43.924379 7f8655bfe6c0 Delete type=0 #283
|
2026/01/21-10:53:46.053514 7f152abfd6c0 Delete type=0 #303
|
||||||
2026/01/12-15:56:47.763984 7f864ffff6c0 Level-0 table #288: started
|
2026/01/21-10:54:51.119771 7f1529bfb6c0 Level-0 table #308: started
|
||||||
2026/01/12-15:56:47.764019 7f864ffff6c0 Level-0 table #288: 0 bytes OK
|
2026/01/21-10:54:51.119820 7f1529bfb6c0 Level-0 table #308: 0 bytes OK
|
||||||
2026/01/12-15:56:47.770343 7f864ffff6c0 Delete type=0 #286
|
2026/01/21-10:54:51.154290 7f1529bfb6c0 Delete type=0 #306
|
||||||
2026/01/12-15:56:47.770494 7f864ffff6c0 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/12-15:56:47.770523 7f864ffff6c0 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)
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
2026/01/10-22:45:42.708376 7fd462ffd6c0 Recovering log #279
|
2026/01/21-10:43:50.292479 7f152a3fc6c0 Recovering log #299
|
||||||
2026/01/10-22:45:42.718470 7fd462ffd6c0 Delete type=0 #279
|
2026/01/21-10:43:50.302752 7f152a3fc6c0 Delete type=3 #297
|
||||||
2026/01/10-22:45:42.718531 7fd462ffd6c0 Delete type=3 #277
|
2026/01/21-10:43:50.302832 7f152a3fc6c0 Delete type=0 #299
|
||||||
2026/01/10-22:49:23.171028 7fd4627fc6c0 Level-0 table #284: started
|
2026/01/21-10:46:58.377980 7f1529bfb6c0 Level-0 table #304: started
|
||||||
2026/01/10-22:49:23.171062 7fd4627fc6c0 Level-0 table #284: 0 bytes OK
|
2026/01/21-10:46:58.378008 7f1529bfb6c0 Level-0 table #304: 0 bytes OK
|
||||||
2026/01/10-22:49:23.178682 7fd4627fc6c0 Delete type=0 #282
|
2026/01/21-10:46:58.384246 7f1529bfb6c0 Delete type=0 #302
|
||||||
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: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: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: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.
@@ -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
@@ -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}}
|
||||||
|
|||||||
@@ -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"> </div>
|
<div class="item-filler"> </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>
|
||||||
|
|||||||
Reference in New Issue
Block a user