# 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}} {{system.caracteristiques.agi.value}} {{#each system.items as |item key|}} {{#if system.magie}} ... {{/if}} {{eq kind "physical"}} ``` **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+)