# Vermine 2047 — Foundry VTT System ![Foundry v14](https://img.shields.io/badge/Foundry-v14-blue) ![Version](https://img.shields.io/badge/version-0.1.13-green) Unofficial game system for **Vermine 2047**, a French post-apocalyptic tabletop RPG by **Éditions John Doe** (https://www.kickandgo.net/boutique-agate/category.php?cl=UyQcRrFtYcYrAnLbOfDj&idp=20). Bilingual **FR/EN** interface. --- ## Actor Types | Type | Sheet | Description | |------|-------|-------------| | **character** | AppV2 | Player character with skills, abilities, totem, equipment | | **npc** | AppV2 | Non-player character with role/threat, wound thresholds | | **group** | AppV2 | Group with members, encounters, link sync | | **creature** | AppV2 | Creature with template/size/role, custom attack stats | ## Item Types | Type | Use | |------|-----| | **item** | Generic items (gear, resources) | | **weapon** | Weapons with damage, range, reliability, rarity | | **defense** | Armor/shields with protection, coverage | | **vehicle** | Vehicles with speed, structure, weapons | | **ability** | Special abilities (apprenticeship, domain) | | **specialty** | Skill specializations (attached to skills) | | **background** | Character backgrounds | | **trauma** | Mental/physical trauma | | **evolution** | Character evolutions | | **rumor** | Rumors (group) | | **target** | Targets (group) | | **rite** | Rites (magic/rituals) | ## Dice System - **d10-based success counting**: `Xd10cs>=N` - Difficulty = number of successes required - Totems give domain bonuses (human/adapted dice) - Rerolls via Effort and Sang-froid (Composure) - Automatic successes and failure thresholds - **Dice So Nice!** 3D dice integration with custom d10 face images ### Initiative Formula: `(@abilities.reflexes.value + @skills.alertness.value)d10cs>=@combatStatus.difficulty` --- ## Architecture ``` module/ ├── vermine2047.mjs # Entry point (Hooks.once init) ├── models/ # DataModels (Foundry v2 TypeDataModel) │ ├── actor/ # character.mjs, npc.mjs, group.mjs, creature.mjs │ └── item/ # All 12 item types ├── documents/ # VermineActor, VermineItem ├── applications/ │ └── sheets/ # AppV2 sheets per type ├── system/ │ ├── config.mjs # CONFIG.VERMINE (totems, traits, skills…) │ ├── roll.mjs # VermineUtils.roll() │ ├── fight.mjs # Combat system, VermineCombat, VermineCombatant │ ├── functions.mjs # Shared helpers (skill scores, etc.) │ ├── hooks.mjs # Hook registrations (DiceSoNice, chat, pause…) │ ├── dice3d.mjs # Dice So Nice colors, initUserDice │ ├── dialogs/rollDialog.mjs │ ├── settings.mjs # System settings (game-mode, etc.) │ ├── tour.mjs # Tours (stub) │ └── group-link.mjs # GroupLink: auto-sync actors↔groups templates/ ├── actor/appv2/ # AppV2 actor sheet templates ├── actor/ # Legacy templates (coexisting) └── item/ # Item sheet templates css/ └── vermine2047.min.css # Compiled from LESS less/ └── base.less # Main stylesheet (LESS source) ``` ## Key Objects - `game.vermine2047` → `{ VermineUtils, VermineCombat, GroupLink }` - `CONFIG.VERMINE` → totems, traits, skills, domains, combat statuses… - `CONFIG.ui.combat` → custom `VermineCombatTracker` ## Commands ```sh npm run build:less # LESS → css/vermine2047.min.css npm run build:less:dev # LESS → css/vermine2047.dev.css (unminified) npm run build:all-css # Both npm run watch # Gulp watch + browser-sync → localhost:30000 npm run lint:less # LESS lint npm run pushLDBtoYAML # Extract packs → src/packs/*.yml npm run pullYAMLtoLDB # Compile packs → packs/* (LevelDB) make build|watch|lint # Makefile wrappers ``` ### Requirements - Node.js `v16.15.1` (see `.nvmrc`) - Foundry VTT **v14** ## Development Notes - **DataModels before Document classes**: In `init` hook, register `CONFIG.Actor.dataModels.*` and `CONFIG.Item.dataModels.*` **before** setting `CONFIG.Actor.documentClass` / `CONFIG.Item.documentClass`. - **Two template systems**: AppV2 (`templates/actor/appv2/`) and legacy (`templates/actor/*.hbs`) coexist — don't confuse them. - **Packs**: Edit YAML source in `src/packs/*.yml`, then run `pullYAMLtoLDB` to compile to LevelDB. - **CSS**: Declared in `system.json` styles — do **not** inject `` manually. - **ESLint**: ~350 rules. Run `npx eslint module/` before committing. No `console.log` (use `console.error` sparingly). - **editMode**: Not auto-set on actor creation (causes ActiveEffect errors). Enable manually via sheet checkbox. - **GroupLink**: Auto-syncs on actor update. Changes propagate bidirectionally. - **HotReload**: Enabled for css, scss, hbs, json in `system.json`. ## License This system is an unofficial fan project. The Vermine 2047 setting and trademarks belong to Éditions John Doe.